@workflow/builders 5.0.0-beta.22 → 5.0.0-beta.24
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/base-builder-logging.test.d.ts +2 -0
- package/dist/base-builder-logging.test.d.ts.map +1 -0
- package/dist/base-builder-logging.test.js +99 -0
- package/dist/base-builder.d.ts +6 -5
- package/dist/base-builder.d.ts.map +1 -1
- package/dist/base-builder.js +47 -15
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +12 -5
- package/dist/constants.test.js +7 -1
- package/dist/standalone.d.ts.map +1 -1
- package/dist/standalone.js +3 -3
- package/dist/step-source-registration.test.js +1 -4
- package/dist/vercel-build-output-api.d.ts.map +1 -1
- package/dist/vercel-build-output-api.js +6 -6
- package/package.json +2 -2
package/dist/base-builder.js
CHANGED
|
@@ -3,6 +3,7 @@ import { mkdir, readFile, realpath, rename, rm, writeFile, } from 'node:fs/promi
|
|
|
3
3
|
import { createRequire } from 'node:module';
|
|
4
4
|
import { basename, dirname, join, relative, resolve } from 'node:path';
|
|
5
5
|
import { promisify } from 'node:util';
|
|
6
|
+
import { buildLogger } from '@workflow/core/logger';
|
|
6
7
|
import { WorkflowBuildError } from '@workflow/errors';
|
|
7
8
|
import { pluralize } from '@workflow/utils';
|
|
8
9
|
import chalk from 'chalk';
|
|
@@ -59,6 +60,12 @@ function parseSourcemapEnv(value) {
|
|
|
59
60
|
return undefined;
|
|
60
61
|
}
|
|
61
62
|
}
|
|
63
|
+
function formatBuildDuration(durationMs) {
|
|
64
|
+
if (durationMs < 1000) {
|
|
65
|
+
return `${durationMs}ms`;
|
|
66
|
+
}
|
|
67
|
+
return `${(durationMs / 1000).toFixed(1)}s`;
|
|
68
|
+
}
|
|
62
69
|
/**
|
|
63
70
|
* Normalize an array of file paths by appending the `realpath()` of each entry
|
|
64
71
|
* (to handle symlinks, e.g. pnpm/workspace layouts) and deduplicating.
|
|
@@ -140,6 +147,8 @@ export class BaseBuilder {
|
|
|
140
147
|
* to avoid duplicate warnings across multiple discoverEntries() calls.
|
|
141
148
|
*/
|
|
142
149
|
warnedExternalPackages = new Set();
|
|
150
|
+
workflowBuildStartTime;
|
|
151
|
+
workflowBuildSummaryCount = 0;
|
|
143
152
|
constructor(config) {
|
|
144
153
|
this.config = config;
|
|
145
154
|
}
|
|
@@ -149,17 +158,22 @@ export class BaseBuilder {
|
|
|
149
158
|
get moduleSpecifierRoot() {
|
|
150
159
|
return this.config.moduleSpecifierRoot || this.transformProjectRoot;
|
|
151
160
|
}
|
|
152
|
-
/**
|
|
153
|
-
* Whether informational BaseBuilder logs should be printed.
|
|
154
|
-
* Subclasses can override this to silence progress logs while keeping warnings/errors.
|
|
155
|
-
*/
|
|
156
|
-
get shouldLogBaseBuilderInfo() {
|
|
157
|
-
return true;
|
|
158
|
-
}
|
|
159
161
|
logBaseBuilderInfo(...args) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
162
|
+
buildLogger.debug(args.map(String).join(' '));
|
|
163
|
+
}
|
|
164
|
+
startWorkflowBuildTimer() {
|
|
165
|
+
this.workflowBuildStartTime = Date.now();
|
|
166
|
+
}
|
|
167
|
+
getWorkflowBuildDuration() {
|
|
168
|
+
return Date.now() - (this.workflowBuildStartTime ?? Date.now());
|
|
169
|
+
}
|
|
170
|
+
resetWorkflowBuildTimer() {
|
|
171
|
+
this.workflowBuildStartTime = undefined;
|
|
172
|
+
}
|
|
173
|
+
getWorkflowBuildSummaryPrefix() {
|
|
174
|
+
return this.workflowBuildSummaryCount === 0
|
|
175
|
+
? 'workflows build complete'
|
|
176
|
+
: 'workflows rebuilt';
|
|
163
177
|
}
|
|
164
178
|
logCreateWorkflowsBundleInfo(...args) {
|
|
165
179
|
if (!this.config.suppressCreateWorkflowsBundleLogs) {
|
|
@@ -1038,13 +1052,16 @@ export const __steps_registered = true;
|
|
|
1038
1052
|
console.warn(chalk.yellow(`⚠ Serde warning for ${classLabel}: `) + issue);
|
|
1039
1053
|
}
|
|
1040
1054
|
}
|
|
1041
|
-
const workflowEntrypointOptionsCode = createWorkflowEntrypointOptionsCode(
|
|
1055
|
+
const workflowEntrypointOptionsCode = createWorkflowEntrypointOptionsCode({
|
|
1056
|
+
routeModuleBodyStartedAt: 'workflowRouteModuleBodyStartedAt',
|
|
1057
|
+
});
|
|
1042
1058
|
const bundleFinal = async (interimBundle) => {
|
|
1043
1059
|
const workflowBundleCode = interimBundle;
|
|
1044
1060
|
const workflowFunctionCode = `// biome-ignore-all lint: generated file
|
|
1045
1061
|
/* eslint-disable */
|
|
1046
1062
|
import { workflowEntrypoint } from 'workflow/runtime';
|
|
1047
1063
|
|
|
1064
|
+
const workflowRouteModuleBodyStartedAt = Date.now();
|
|
1048
1065
|
const workflowCode = \`${workflowBundleCode.replace(/[\\`$]/g, '\\$&')}\`;
|
|
1049
1066
|
|
|
1050
1067
|
export const POST = workflowEntrypoint(workflowCode${workflowEntrypointOptionsCode});`;
|
|
@@ -1130,6 +1147,7 @@ export const POST = workflowEntrypoint(workflowCode${workflowEntrypointOptionsCo
|
|
|
1130
1147
|
* a single route file using workflowEntrypoint().
|
|
1131
1148
|
*/
|
|
1132
1149
|
async createCombinedBundle({ inputFiles, stepsOutfile, flowOutfile, format = 'esm', bundleFinalOutput = true, tsconfigPath, externalizeNonSteps, bundleTransitiveLocalStepDependencies, sourceStepRegistrationImports, discoveredEntries, }) {
|
|
1150
|
+
this.startWorkflowBuildTimer();
|
|
1133
1151
|
// 1. Build step registrations bundle (used as separate file for
|
|
1134
1152
|
// bundleFinalOutput: false, or read back for inline content when true)
|
|
1135
1153
|
const { context: stepsContext, manifest: stepsManifest } = await this.createStepsBundle({
|
|
@@ -1175,14 +1193,18 @@ export const POST = workflowEntrypoint(workflowCode${workflowEntrypointOptionsCo
|
|
|
1175
1193
|
// Ignore cleanup errors
|
|
1176
1194
|
}
|
|
1177
1195
|
// 3. Generate combined route file
|
|
1178
|
-
const stepsRelativePath =
|
|
1196
|
+
const stepsRelativePath = `./${basename(stepsOutfile).replace(/\\/g, '/')}`;
|
|
1179
1197
|
const escapedVMCode = workflowVMCode.replace(/[\\`$]/g, '\\$&');
|
|
1180
|
-
const workflowEntrypointOptionsCode = createWorkflowEntrypointOptionsCode(
|
|
1198
|
+
const workflowEntrypointOptionsCode = createWorkflowEntrypointOptionsCode({
|
|
1199
|
+
routeModuleBodyStartedAt: 'workflowRouteModuleBodyStartedAt',
|
|
1200
|
+
});
|
|
1181
1201
|
const combinedFunctionCode = `// biome-ignore-all lint: generated file
|
|
1182
1202
|
/* eslint-disable */
|
|
1183
1203
|
import { __steps_registered } from '${stepsRelativePath}';
|
|
1184
1204
|
import { workflowEntrypoint } from 'workflow/runtime';
|
|
1185
1205
|
|
|
1206
|
+
const workflowRouteModuleBodyStartedAt = Date.now();
|
|
1207
|
+
|
|
1186
1208
|
// Prevent rollup from tree-shaking the steps side-effect import
|
|
1187
1209
|
void __steps_registered;
|
|
1188
1210
|
|
|
@@ -1240,12 +1262,16 @@ export const POST = workflowEntrypoint(workflowCode${workflowEntrypointOptionsCo
|
|
|
1240
1262
|
// Create a custom bundleFinal for watch mode that uses workflowEntrypoint
|
|
1241
1263
|
const combinedBundleFinal = async (interimBundleText) => {
|
|
1242
1264
|
const escaped = interimBundleText.replace(/[\\`$]/g, '\\$&');
|
|
1243
|
-
const workflowEntrypointOptionsCode = createWorkflowEntrypointOptionsCode(
|
|
1265
|
+
const workflowEntrypointOptionsCode = createWorkflowEntrypointOptionsCode({
|
|
1266
|
+
routeModuleBodyStartedAt: 'workflowRouteModuleBodyStartedAt',
|
|
1267
|
+
});
|
|
1244
1268
|
const code = `// biome-ignore-all lint: generated file
|
|
1245
1269
|
/* eslint-disable */
|
|
1246
1270
|
import { __steps_registered } from '${stepsRelativePath}';
|
|
1247
1271
|
import { workflowEntrypoint } from 'workflow/runtime';
|
|
1248
1272
|
|
|
1273
|
+
const workflowRouteModuleBodyStartedAt = Date.now();
|
|
1274
|
+
|
|
1249
1275
|
void __steps_registered;
|
|
1250
1276
|
|
|
1251
1277
|
const workflowCode = \`${escaped}\`;
|
|
@@ -1626,10 +1652,16 @@ export const OPTIONS = handler;`;
|
|
|
1626
1652
|
const workflowCount = Object.values(workflows).reduce((acc, w) => acc + Object.keys(w).length, 0);
|
|
1627
1653
|
const classCount = Object.values(classes).reduce((acc, c) => acc + Object.keys(c).length, 0);
|
|
1628
1654
|
this.logCreateManifestInfo(`Created manifest with ${stepCount} ${pluralize('step', 'steps', stepCount)}, ${workflowCount} ${pluralize('workflow', 'workflows', workflowCount)}, and ${classCount} ${pluralize('class', 'classes', classCount)}`, `${Date.now() - buildStart}ms`);
|
|
1655
|
+
if (!this.config.suppressCreateManifestLogs) {
|
|
1656
|
+
console.log(`${this.getWorkflowBuildSummaryPrefix()} (${stepCount} ${pluralize('step', 'steps', stepCount)}, ${workflowCount} ${pluralize('workflow', 'workflows', workflowCount)}, time ${formatBuildDuration(this.getWorkflowBuildDuration())})`);
|
|
1657
|
+
}
|
|
1658
|
+
this.workflowBuildSummaryCount += 1;
|
|
1659
|
+
this.resetWorkflowBuildTimer();
|
|
1629
1660
|
return manifestJson;
|
|
1630
1661
|
}
|
|
1631
1662
|
catch (error) {
|
|
1632
1663
|
console.warn('Failed to create manifest:', error instanceof Error ? error.message : String(error));
|
|
1664
|
+
this.resetWorkflowBuildTimer();
|
|
1633
1665
|
return undefined;
|
|
1634
1666
|
}
|
|
1635
1667
|
}
|
|
@@ -1689,4 +1721,4 @@ export const OPTIONS = handler;`;
|
|
|
1689
1721
|
return result;
|
|
1690
1722
|
}
|
|
1691
1723
|
}
|
|
1692
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jhc2UtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxLQUFLLEVBQ0wsUUFBUSxFQUNSLFFBQVEsRUFDUixNQUFNLEVBQ04sRUFBRSxFQUNGLFNBQVMsR0FDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN0QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sdUJBQXVCLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxLQUFLLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2xDLE9BQU8sRUFDTCxpQkFBaUIsR0FFbEIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEVBQ0wsbUJBQW1CLEdBRXBCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLGFBQWEsRUFDYixzQkFBc0IsRUFDdEIsbUJBQW1CLEdBQ3BCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzFELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTlELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRWpFLE1BQU0sZUFBZSxHQUFHLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBQzNELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBSS9DOzs7OztHQUtHO0FBQ0gsTUFBTSw2QkFBNkIsR0FDakMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQ0FBc0MsS0FBSyxHQUFHLENBQUM7QUFFN0QsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUN0QyxRQUFRO0lBQ1IsUUFBUTtJQUNSLFVBQVU7SUFDVixNQUFNO0NBQ1AsQ0FBQyxDQUFDO0FBRUg7Ozs7R0FJRztBQUNILFNBQVMsaUJBQWlCLENBQ3hCLEtBQXlCO0lBRXpCLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzFELFFBQVEsS0FBSyxFQUFFLENBQUM7UUFDZCxLQUFLLEdBQUcsQ0FBQztRQUNULEtBQUssT0FBTztZQUNWLE9BQU8sS0FBSyxDQUFDO1FBQ2YsS0FBSyxHQUFHLENBQUM7UUFDVCxLQUFLLE1BQU07WUFDVCxPQUFPLElBQUksQ0FBQztRQUNkO1lBQ0UsSUFBSSx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsT0FBTyxLQUFzQixDQUFDO1lBQ2hDLENBQUM7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUNWLDRDQUE0QyxLQUFLLElBQUk7Z0JBQ25ELHFFQUFxRSxDQUN4RSxDQUFDO1lBQ0YsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztBQUNILENBQUM7QUFFRDs7O0dBR0c7QUFDSCxLQUFLLFVBQVUsYUFBYSxDQUFDLE9BQWlCO0lBQzVDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FDZixJQUFJLEdBQUcsQ0FDTCxDQUNFLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUMxQixNQUFNLFFBQVEsR0FBRyxNQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUQsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUMsQ0FBQyxDQUNILENBQ0YsQ0FBQyxJQUFJLEVBQUUsQ0FDVCxDQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLElBQVksRUFBRSxtQkFBMkI7SUFDbEUsTUFBTSxFQUFFLGVBQWUsRUFBRSxHQUFHLHNCQUFzQixDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQzlFLElBQUksZUFBZSxFQUFFLENBQUM7UUFDcEIsc0VBQXNFO1FBQ3RFLG1DQUFtQztRQUNuQyxPQUFPLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFPRCxTQUFTLGdCQUFnQixDQUFDLFFBQStCO0lBQ3ZELE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNqRCxDQUFDO0FBRUQsU0FBUyx1QkFBdUIsQ0FDOUIsYUFBaUUsRUFDakUsR0FBdUMsRUFDdkMsS0FBZ0MsRUFDaEMsS0FBMEI7SUFFMUIsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDdEUsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3QixNQUFNLE9BQU8sR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNuQyxJQUNFLFFBQVE7Z0JBQ1IsQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxRQUFRO29CQUNyQyxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDakMsQ0FBQztnQkFDRCxNQUFNLE1BQU0sR0FBRyxLQUFLLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO2dCQUNyRSxNQUFNLFlBQVksR0FBRyxHQUFHLEtBQUssV0FBVyxDQUFDO2dCQUN6QyxNQUFNLGdCQUFnQixHQUFHLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO2dCQUNoRSxNQUFNLElBQUksa0JBQWtCLENBQzFCLGFBQWEsTUFBTSxLQUFLLEVBQUUsbUJBQW1CLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxRQUFRLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQzNHO29CQUNFLElBQUksRUFDRixHQUFHLGdCQUFnQixzQ0FBc0M7d0JBQ3pELHFEQUFxRCxZQUFZLGFBQWE7d0JBQzlFLDhFQUE4RTt3QkFDOUUsMkVBQTJFO3dCQUMzRSw0Q0FBNEM7aUJBQy9DLENBQ0YsQ0FBQztZQUNKLENBQUM7WUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUM1QixNQUF3QixFQUN4QixRQUEwQixFQUMxQixPQUEyQyxFQUMzQyxXQUErQztJQUUvQyx1QkFBdUIsQ0FDckIsUUFBUSxDQUFDLEtBQUssRUFDZCxPQUFPLEVBQ1AsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQ3JCLE1BQU0sQ0FDUCxDQUFDO0lBQ0YsdUJBQXVCLENBQ3JCLFFBQVEsQ0FBQyxTQUFTLEVBQ2xCLFdBQVcsRUFDWCxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFDekIsVUFBVSxDQUNYLENBQUM7SUFFRixNQUFNLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakUsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQWdCLFdBQVc7SUFDckIsTUFBTSxDQUFpQjtJQUVqQzs7O09BR0c7SUFDSyxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRW5ELFlBQVksTUFBc0I7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQWMsb0JBQW9CO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7SUFDM0QsQ0FBQztJQUVELElBQWMsbUJBQW1CO1FBQy9CLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDdEUsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQWMsd0JBQXdCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVTLGtCQUFrQixDQUFDLEdBQUcsSUFBZTtRQUM3QyxJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUVPLDRCQUE0QixDQUFDLEdBQUcsSUFBZTtRQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRU8sMEJBQTBCLENBQUMsR0FBRyxJQUFlO1FBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLCtCQUErQixFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxHQUFHLElBQWU7UUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLHdCQUF3QixDQUFDLE1BQWM7UUFJN0MsSUFBSSxNQUFNLEtBQUssS0FBSztZQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUN4RCxPQUFPO1lBQ0wsTUFBTSxFQUNKLDBIQUEwSDtnQkFDMUgsa0dBQWtHO2dCQUNsRywrRUFBK0U7WUFDakYsTUFBTSxFQUFFO2dCQUNOLGlCQUFpQixFQUFFLG1CQUFtQjtnQkFDdEMscUJBQXFCLEVBQUUsdUJBQXVCO2FBQy9DO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLG1CQUFtQixDQUFDLE1BQWM7UUFDeEMsSUFBSSxNQUFNLEtBQUssS0FBSztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ2hDLE9BQU8sb0hBQW9ILENBQUM7SUFDOUgsQ0FBQztJQVFEOzs7T0FHRztJQUNPLEtBQUssQ0FBQyxnQkFBZ0I7UUFDOUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3BELE9BQU8sTUFBTSxDQUFDLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLEtBQUssQ0FBQyxhQUFhO1FBQzNCLE1BQU0sTUFBTSxHQUFHO1lBQ2Isb0JBQW9CO1lBQ3BCLFlBQVk7WUFDWixhQUFhO1lBQ2IsY0FBYztZQUNkLGFBQWE7WUFDYixlQUFlO1lBQ2YsZUFBZTtZQUNmLHNCQUFzQjtZQUN0Qix3QkFBd0I7WUFDeEIsNEJBQTRCO1lBQzVCLFlBQVk7WUFDWixtQkFBbUI7WUFDbkIsY0FBYztZQUNkLGNBQWM7WUFDZCxhQUFhO1lBQ2IsbUJBQW1CO1NBQ3BCLENBQUM7UUFFRixxRUFBcUU7UUFDckUsbUVBQW1FO1FBQ25FLHNFQUFzRTtRQUN0RSxnRUFBZ0U7UUFDaEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUMzQixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakQsT0FBTyxJQUFJLENBQUMsQ0FBQyxzQ0FBc0MsQ0FBQyxFQUFFO2dCQUNwRCxHQUFHO2dCQUNILE1BQU07Z0JBQ04sUUFBUSxFQUFFLElBQUk7Z0JBQ2QsR0FBRyxFQUFFLElBQUk7YUFDVixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRUYsT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssaUJBQWlCLEdBQ3ZCLElBQUksT0FBTyxFQUFFLENBQUM7SUFFVCwyQkFBMkI7UUFDaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssTUFBTSxDQUFVLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUNoRCxhQUFhO1FBQ2IsYUFBYTtLQUNkLENBQUMsQ0FBQztJQUVIOzs7OztPQUtHO0lBQ0ssS0FBSyxDQUFDLGlDQUFpQztRQUM3QyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7UUFDdEQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU07WUFBRSxPQUFPO1FBRXRDLEtBQUssTUFBTSxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNuQyxJQUFJLFdBQVcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztnQkFBRSxTQUFTO1lBQ25ELElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsU0FBUztZQUVuRCxJQUNFLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO2dCQUNuQixHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztnQkFDbkIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7Z0JBQ25CLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUNqQixHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUNqQixDQUFDO2dCQUNELFNBQVM7WUFDWCxDQUFDO1lBRUQsSUFBSSxDQUFDO2dCQUNILGtFQUFrRTtnQkFDbEUsSUFBSSxtQkFBbUIsR0FBRyxLQUFLLENBQUM7Z0JBQ2hDLElBQUksQ0FBQztvQkFDSCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxlQUFlLEVBQUU7d0JBQ3pELEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO3FCQUNoQyxDQUFDLENBQUM7b0JBQ0gsTUFBTSxhQUFhLEdBQUcsTUFBTSxRQUFRLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUMzRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FHdkMsQ0FBQztvQkFDRixNQUFNLFlBQVksR0FDaEIsT0FBTyxPQUFPLENBQUMsWUFBWSxLQUFLLFFBQVE7d0JBQ3hDLE9BQU8sQ0FBQyxZQUFZLEtBQUssSUFBSTt3QkFDN0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7d0JBQ2xDLENBQUMsQ0FBRSxPQUFPLENBQUMsWUFBd0M7d0JBQ25ELENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ1QsTUFBTSxnQkFBZ0IsR0FDcEIsT0FBTyxPQUFPLENBQUMsZ0JBQWdCLEtBQUssUUFBUTt3QkFDNUMsT0FBTyxDQUFDLGdCQUFnQixLQUFLLElBQUk7d0JBQ2pDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7d0JBQ3RDLENBQUMsQ0FBRSxPQUFPLENBQUMsZ0JBQTRDO3dCQUN2RCxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNULG1CQUFtQjt3QkFDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7NEJBQzlDLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztnQkFDdkQsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AseURBQXlEO2dCQUMzRCxDQUFDO2dCQUVELHlDQUF5QztnQkFDekMsc0VBQXNFO2dCQUN0RSxzRUFBc0U7Z0JBQ3RFLG1FQUFtRTtnQkFDbkUsb0VBQW9FO2dCQUNwRSxpRUFBaUU7Z0JBQ2pFLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFDdkIsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO2dCQUMzQixJQUFJLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQztnQkFDbkMsSUFBSSxDQUFDO29CQUNILE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO3dCQUNyQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztxQkFDaEMsQ0FBQyxDQUFDO29CQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sUUFBUSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDbEQsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2hELFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO29CQUNqQyxjQUFjLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztvQkFDekMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNkLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO29CQUMvQixDQUFDO2dCQUNILENBQUM7Z0JBQUMsTUFBTSxDQUFDO29CQUNQLCtEQUErRDtnQkFDakUsQ0FBQztnQkFFRCxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsUUFBUTtvQkFBRSxTQUFTO2dCQUUxRCxpREFBaUQ7Z0JBQ2pELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxjQUFjO29CQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxVQUFVO29CQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxRQUFRO29CQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztnQkFFbkQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFckMsT0FBTyxDQUFDLElBQUksQ0FDVixLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGFBQWEsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyw0Q0FBNEMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSTtvQkFDaE4sc0JBQXNCLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLDZFQUE2RTtvQkFDcEgsY0FBYyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsU0FBUyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyw2QkFBNkIsQ0FDcEosQ0FBQztZQUNKLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1Asa0VBQWtFO1lBQ3BFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVTLEtBQUssQ0FBQyxlQUFlLENBQzdCLE1BQWdCLEVBQ2hCLE1BQWMsRUFDZCxZQUFxQjtRQUVyQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTFELElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsT0FBTyxjQUFjLENBQUM7UUFDeEIsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFzQjtZQUMvQixlQUFlLEVBQUUsSUFBSSxHQUFHLEVBQUU7WUFDMUIsbUJBQW1CLEVBQUUsSUFBSSxHQUFHLEVBQUU7WUFDOUIsb0JBQW9CLEVBQUUsSUFBSSxHQUFHLEVBQUU7U0FDaEMsQ0FBQztRQUVGLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVqQyx1RUFBdUU7UUFDdkUsNEVBQTRFO1FBQzVFLHVFQUF1RTtRQUN2RSxzRUFBc0U7UUFDdEUsc0VBQXNFO1FBQ3RFLHNFQUFzRTtRQUN0RSx3REFBd0Q7UUFDeEQsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLGVBQWUsQ0FDbkQsTUFBTSxFQUNOLDRCQUE0QixDQUM3QixDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QixNQUFNLFdBQVcsR0FBRyx1QkFBdUI7WUFDekMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsdUJBQXVCLENBQUM7WUFDdEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUVYLE1BQU0scUJBQXFCLEdBQ3pCLFlBQVksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUVsRCxNQUFNLG1CQUFtQixDQUFDO1lBQ3hCLFdBQVc7WUFDWCxLQUFLO1lBQ0wsbUJBQW1CLEVBQUUscUJBQXFCO1lBQzFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7U0FDbkMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGtCQUFrQixDQUNyQixpQ0FBaUMsRUFDakMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsYUFBYSxJQUFJLENBQ2xDLENBQUM7UUFFRiwwREFBMEQ7UUFDMUQsTUFBTSxJQUFJLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztRQUUvQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLEtBQUssQ0FBQyxrQkFBa0IsQ0FDOUIsVUFBa0IsRUFDbEIsT0FBZTtRQUVmLE1BQU0sUUFBUSxHQUFHLEdBQUcsVUFBVSxJQUFJLFVBQVUsRUFBRSxNQUFNLENBQUM7UUFDckQsTUFBTSxTQUFTLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sU0FBUyxHQUNiLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksTUFBTSxJQUFJLEtBQUs7Z0JBQ25ELENBQUMsQ0FBRSxLQUErQixDQUFDLElBQUk7Z0JBQ3ZDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDaEIsSUFDRSxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU87Z0JBQzVCLENBQUMsU0FBUyxLQUFLLE9BQU8sSUFBSSxTQUFTLEtBQUssUUFBUSxDQUFDLEVBQ2pELENBQUM7Z0JBQ0QsTUFBTSxTQUFTLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNyQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDcEMsT0FBTztZQUNULENBQUM7WUFDRCxNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQyxjQUFjLENBQzFCLE9BQWUsRUFDZixTQUFpQixFQUNqQixLQUFlO1FBRWYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLElBQUksRUFBRSxDQUFDO1FBQ2pELE1BQU0sVUFBVSxHQUFHLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUNsRixJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFFbEIsSUFBSSxDQUFDO1lBQ0gsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixJQUFJLENBQUM7b0JBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUNuRCxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDakMsQ0FBQztnQkFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUNYLHdEQUF3RDtvQkFDeEQsK0VBQStFO29CQUMvRSxJQUFLLENBQTJCLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO3dCQUNuRCxPQUFPLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUMvRCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FDL0I7Z0JBQ0UsR0FBRyxRQUFRO2dCQUNYLEdBQUcsU0FBUzthQUNiLEVBQ0QsSUFBSSxFQUNKLENBQUMsQ0FDRixDQUFDO1lBRUYsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxrQkFBa0IsQ0FDeEIsTUFBNEMsRUFDNUMsS0FBYSxFQUNiLFlBQVksR0FBRyxJQUFJLEVBQ25CLE9BRUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUMsT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUMvQyxNQUFNLGFBQWEsR0FBYSxFQUFFLENBQUM7WUFDbkMsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDakMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9CLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNuQixNQUFNLFFBQVEsR0FBRyxVQUFVLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2pHLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3hCLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQy9CLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsTUFBTSxJQUFJLGtCQUFrQixDQUMxQix1QkFBdUIsS0FBSyxNQUFNLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFDNUQ7b0JBQ0UsSUFBSSxFQUFFLHdEQUF3RCxLQUFLLCtEQUErRDtpQkFDbkksQ0FDRixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxJQUNFLENBQUMsT0FBTyxFQUFFLGdCQUFnQjtZQUMxQixNQUFNLENBQUMsUUFBUTtZQUNmLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDMUIsQ0FBQztZQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDakQsS0FBSyxNQUFNLE9BQU8sSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQ1YsVUFBVSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUN0RixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLG1CQUFtQixDQUFDLFlBQW9CO1FBQzlDLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RSxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUN2RSxLQUFLLEVBQ0wsR0FBRyxDQUNKLENBQUM7UUFDRix3REFBd0Q7UUFDeEQsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkMsWUFBWSxHQUFHLFlBQVk7aUJBQ3hCLEtBQUssQ0FBQyxHQUFHLENBQUM7aUJBQ1YsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDO2lCQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVTLDBCQUEwQixDQUFDLElBQVksRUFBRSxRQUFnQjtRQUNqRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLGFBQWEsQ0FDN0MsSUFBSSxFQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUN2QixDQUFDO1FBQ0YsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7UUFFRCxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEUsWUFBWSxHQUFHLEtBQUssWUFBWSxFQUFFLENBQUM7UUFDckMsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsRUFDN0MsVUFBVSxFQUNWLE9BQU8sRUFDUCxZQUFZLEVBQ1osaUJBQWlCLEdBTWxCO1FBQ0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDcEMsTUFBTSxnQkFBZ0IsR0FBcUIsRUFBRSxDQUFDO1FBQzlDLE1BQU0sWUFBWSxHQUFHLDRCQUE0QixDQUFDO1FBQ2xELE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxNQUFNLGVBQWUsQ0FDakQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUNoQixZQUFZLENBQ2IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNkLE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsMkRBQTJELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUN4RTtnQkFDRSxJQUFJLEVBQUUsb0RBQW9EO2dCQUMxRCxLQUFLLEVBQUUsR0FBRzthQUNYLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFXLENBQUM7UUFFZCxNQUFNLFVBQVUsR0FDZCxpQkFBaUI7WUFDakIsQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMvRCxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0RSxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFO1lBQ2pDLFNBQVM7WUFDVCxhQUFhO1lBQ2IsY0FBYztZQUNkLGFBQWEsRUFBRSxJQUFJO1NBQ3BCLENBQUMsQ0FBQztRQUVILE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxHQUFHLENBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sZ0JBQWdCLEdBQWEsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsU0FBaUIsRUFBUSxFQUFFO1lBQ3hELGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQztRQUNGLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxJQUFZLEVBQVEsRUFBRTtZQUN2RCxNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDbkUsSUFBSSx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDMUMsT0FBTztZQUNULENBQUM7WUFDRCx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMscUJBQXFCLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUMsQ0FBQztRQUVGLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BDLEtBQUssTUFBTSxJQUFJLElBQUksU0FBUyxFQUFFLENBQUM7WUFDN0IseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUNELEtBQUssTUFBTSxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7WUFDbEMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHOztFQUVqQixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDOzs7Q0FHNUIsQ0FBQztRQUNFLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sUUFBUSxHQUFHLEdBQUcsT0FBTyxJQUFJLFVBQVUsRUFBRSxNQUFNLENBQUM7UUFDbEQsTUFBTSxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUVoQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUM5QixJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxFQUFFLEdBQUcsY0FBYyxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FDakUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNULE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFpQyxDQUFDO1FBQ3pELE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFpQyxDQUFDO1FBQzdELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUMvQixNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEQsTUFBTSxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0saUJBQWlCLENBQ2hFLGdCQUFnQixFQUNoQixNQUFNLEVBQ04sTUFBTSxFQUNOLElBQUksRUFDSixJQUFJLENBQUMsb0JBQW9CLEVBQ3pCLElBQUksQ0FBQyxtQkFBbUIsQ0FDekIsQ0FBQztZQUNGLHFCQUFxQixDQUNuQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLE9BQU8sRUFDUCxXQUFXLENBQ1osQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsNEJBQTRCLEVBQzVCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGdCQUFnQixJQUFJLENBQ3JDLENBQUM7UUFDRixPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNPLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUNoQyxVQUFVLEVBQ1YsTUFBTSxHQUFHLEtBQUssRUFDZCxPQUFPLEVBQ1AsbUJBQW1CLEVBQ25CLHFDQUFxQyxFQUNyQyw2QkFBNkIsRUFDN0IsbUJBQW1CLEVBQ25CLFlBQVksRUFDWixpQkFBaUIsRUFDakIsb0JBQW9CLEdBQUcsS0FBSyxHQWtCN0I7UUFJQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNwQyxNQUFNLGdCQUFnQixHQUFxQixFQUFFLENBQUM7UUFDOUMsTUFBTSxZQUFZLEdBQUcsNEJBQTRCLENBQUM7UUFFbEQsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLGVBQWUsQ0FDaEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUNoQiw0QkFBNEIsQ0FDN0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNkLE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsMkRBQTJELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUN4RTtnQkFDRSxJQUFJLEVBQUUsb0RBQW9EO2dCQUMxRCxLQUFLLEVBQUUsR0FBRzthQUNYLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsd0VBQXdFO1FBQ3hFLHlFQUF5RTtRQUN6RSxzRUFBc0U7UUFDdEUsMEVBQTBFO1FBQzFFLE1BQU0sVUFBVSxHQUNkLGlCQUFpQjtZQUNqQixDQUFDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDM0UsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6RCxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRS9ELDJGQUEyRjtRQUMzRiwrRUFBK0U7UUFDL0Usc0ZBQXNGO1FBQ3RGLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRFLElBQ0UsNkJBQTZCO1lBQzdCLG1CQUFtQjtZQUNuQixDQUFDLHFDQUFxQyxFQUN0QyxDQUFDO1lBQ0QsT0FBTztnQkFDTCxPQUFPLEVBQUUsU0FBUztnQkFDbEIsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLGdDQUFnQyxDQUFDO29CQUNwRCxVQUFVO29CQUNWLE9BQU87b0JBQ1AsWUFBWTtvQkFDWixpQkFBaUIsRUFBRSxVQUFVO2lCQUM5QixDQUFDO2FBQ0gsQ0FBQztRQUNKLENBQUM7UUFFRCxtQ0FBbUM7UUFDbkMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRTtZQUNqQyxTQUFTO1lBQ1QsYUFBYTtZQUNiLGNBQWM7U0FDZixDQUFDLENBQUM7UUFFSCxtREFBbUQ7UUFDbkQsd0VBQXdFO1FBQ3hFLDRFQUE0RTtRQUM1RSxNQUFNLFlBQVksR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFO1lBQ3BDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVO2lCQUNuRCxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztpQkFDbkIsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0QixNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3pELCtEQUErRDtZQUMvRCxxRUFBcUU7WUFDckUsbUVBQW1FO1lBQ25FLG1FQUFtRTtZQUNuRSxzREFBc0Q7WUFDdEQsTUFBTSxrQ0FBa0MsR0FDdEMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztnQkFDOUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztnQkFDekMsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ25ELENBQUMsQ0FDQyx1QkFBdUIsS0FBSyx1QkFBdUI7b0JBQ25ELHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxHQUFHLHVCQUF1QixHQUFHLENBQUMsQ0FDbEUsQ0FBQztZQUNKLE1BQU0seUJBQXlCLEdBQUcsa0NBQWtDLENBQUM7WUFFckUsSUFBSSx5QkFBeUIsRUFBRSxDQUFDO2dCQUM5QixJQUFJLFlBQVksR0FBRyxRQUFRLENBQ3pCLHVCQUF1QixFQUN2Qix1QkFBdUIsQ0FDeEIsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDdEUsWUFBWSxHQUFHLEtBQUssWUFBWSxFQUFFLENBQUM7Z0JBQ3JDLENBQUM7Z0JBQ0QsT0FBTyxXQUFXLFlBQVksSUFBSSxDQUFDO1lBQ3JDLENBQUM7WUFFRCxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLGFBQWEsQ0FDN0MsSUFBSSxFQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUN2QixDQUFDO1lBRUYsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDZCxtRUFBbUU7Z0JBQ25FLE9BQU8sV0FBVyxVQUFVLElBQUksQ0FBQztZQUNuQyxDQUFDO1lBRUQscUNBQXFDO1lBQ3JDLG9FQUFvRTtZQUNwRSxzR0FBc0c7WUFDdEcsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2hELDZEQUE2RDtZQUM3RCxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUN2RSxLQUFLLEVBQ0wsR0FBRyxDQUNKLENBQUM7WUFDRiwwRUFBMEU7WUFDMUUsc0VBQXNFO1lBQ3RFLDBCQUEwQjtZQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdEUsWUFBWSxHQUFHLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDckMsQ0FBQztZQUNELE9BQU8sV0FBVyxZQUFZLElBQUksQ0FBQztRQUNyQyxDQUFDLENBQUM7UUFFRixzRUFBc0U7UUFDdEUsbURBQW1EO1FBQ25ELEVBQUU7UUFDRixtRUFBbUU7UUFDbkUsc0VBQXNFO1FBQ3RFLGlFQUFpRTtRQUNqRSxzRUFBc0U7UUFDdEUscUVBQXFFO1FBQ3JFLG9FQUFvRTtRQUNwRSxNQUFNLHVCQUF1QixHQUFHLElBQUksR0FBRyxDQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUNoRSxNQUFNLFlBQVksR0FBRyxDQUFDLEtBQWUsRUFBVSxFQUFFLENBQy9DLEtBQUs7YUFDRixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNmLE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNuRSxJQUFJLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDeEQsdUJBQXVCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO2FBQ0QsR0FBRyxDQUFDLFlBQVksQ0FBQzthQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFaEIsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTVDLCtEQUErRDtRQUMvRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFbEQsTUFBTSxZQUFZLEdBQUc7O2NBRVgsWUFBWTs7TUFFcEIsV0FBVzs7TUFFWCxZQUFZOzs7NENBRzBCLENBQUM7UUFFekMsZ0RBQWdEO1FBQ2hELE1BQU0sZUFBZSxHQUFHLG1CQUFtQjtZQUN6QyxDQUFDLENBQUM7Z0JBQ0UsR0FBRyxTQUFTO2dCQUNaLEdBQUcsVUFBVTtnQkFDYixHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3hEO1lBQ0gsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNkLE1BQU0seUJBQXlCLEdBQUcsZUFBZTtZQUMvQyxDQUFDLENBQUMsTUFBTSxhQUFhLENBQUMsZUFBZSxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDZCxNQUFNLDJCQUEyQixHQUFHLE1BQU0sYUFBYSxDQUFDO1lBQ3RELEdBQUcsU0FBUztZQUNaLEdBQUcsY0FBYztZQUNqQixHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3hELENBQUMsQ0FBQztRQUNILE1BQU0sc0JBQXNCLEdBQzFCLE1BQU0seUJBQXlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDaEQsTUFBTSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsR0FDMUQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sZ0JBQWdCLEdBQUcsb0JBQW9CO1lBQzNDLENBQUMsQ0FBQyxFQUFFO1lBQ0osQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVyQyxNQUFNLFVBQVUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDdkMsTUFBTSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxtRUFBbUUsZ0JBQWdCLEdBQUcsZ0JBQWdCLEVBQUU7YUFDN0c7WUFDRCxLQUFLLEVBQUU7Z0JBQ0wsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7Z0JBQ2xDLFVBQVUsRUFBRSxrQkFBa0I7Z0JBQzlCLE1BQU0sRUFBRSxJQUFJO2FBQ2I7WUFDRCxPQUFPO1lBQ1AsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUNyQyxNQUFNLEVBQUUsSUFBSTtZQUNaLE1BQU07WUFDTixRQUFRLEVBQUUsTUFBTTtZQUNoQixVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDcEIsTUFBTSxFQUFFLFFBQVE7WUFDaEIsS0FBSyxFQUFFLElBQUk7WUFDWCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLE1BQU0sRUFBRSxLQUFLO1lBQ2IsR0FBRyxFQUFFLFVBQVU7WUFDZixRQUFRLEVBQUUsT0FBTztZQUNqQiwwQ0FBMEM7WUFDMUMsZ0ZBQWdGO1lBQ2hGLEdBQUcsc0JBQXNCO1lBQ3pCLE1BQU0sRUFBRSxnQkFBZ0I7WUFDeEIsaUJBQWlCLEVBQUU7Z0JBQ2pCLEtBQUs7Z0JBQ0wsTUFBTTtnQkFDTixNQUFNO2dCQUNOLE1BQU07Z0JBQ04sS0FBSztnQkFDTCxNQUFNO2dCQUNOLE1BQU07Z0JBQ04sTUFBTTthQUNQO1lBQ0QsdUVBQXVFO1lBQ3ZFLHdFQUF3RTtZQUN4RSxzRUFBc0U7WUFDdEUscUVBQXFFO1lBQ3JFLHlFQUF5RTtZQUN6RSxtRUFBbUU7WUFDbkUscURBQXFEO1lBQ3JELFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1lBQzNELE9BQU8sRUFBRTtnQkFDUCwyRUFBMkU7Z0JBQzNFLDRFQUE0RTtnQkFDNUUseUJBQXlCLEVBQUU7Z0JBQzNCLGVBQWUsQ0FBQztvQkFDZCxJQUFJLEVBQUUsTUFBTTtvQkFDWixlQUFlLEVBQUUseUJBQXlCO29CQUMxQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7b0JBQzlDLFdBQVcsRUFBRSxJQUFJLENBQUMsb0JBQW9CO29CQUN0QyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CO29CQUM3QyxnQkFBZ0I7b0JBQ2hCLHFDQUFxQztvQkFDckMsbUJBQW1CO29CQUNuQixpQkFBaUIsRUFBRSwyQkFBMkI7aUJBQy9DLENBQUM7YUFDSDtZQUNELHFFQUFxRTtZQUNyRSw0REFBNEQ7WUFDNUQsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUNwRSxDQUFDLENBQUM7UUFFSCxNQUFNLFdBQVcsR0FBRyxNQUFNLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUUvQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLGtCQUFrQixDQUNyQixzQkFBc0IsRUFDdEIsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsZ0JBQWdCLElBQUksQ0FDckMsQ0FBQztRQUVGLDZFQUE2RTtRQUM3RSw4RUFBOEU7UUFDOUUsaUVBQWlFO1FBQ2pFLE1BQU0saUJBQWlCLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FDNUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FDOUIsQ0FBQztRQUNGLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxFQUFFO1lBQzNDLElBQUksQ0FBQztnQkFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3BELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUNoRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLEdBQUcsTUFBTSxpQkFBaUIsQ0FDaEUsZ0JBQWdCLEVBQ2hCLE1BQU0sRUFDTixVQUFVLEVBQ1YsWUFBWSxFQUNaLElBQUksQ0FBQyxvQkFBb0IsRUFDekIsSUFBSSxDQUFDLG1CQUFtQixDQUN6QixDQUFDO2dCQUNGLElBQUksWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO29CQUMzQixnQkFBZ0IsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDeEMsZ0JBQWdCLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFDaEMsWUFBWSxDQUFDLFNBQVMsQ0FDdkIsQ0FBQztnQkFDSixDQUFDO2dCQUNELElBQUksWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUN6QixnQkFBZ0IsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDdEMsZ0JBQWdCLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFDOUIsWUFBWSxDQUFDLE9BQU8sQ0FDckIsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsNEVBQTRFO2dCQUM1RSxPQUFPLENBQUMsSUFBSSxDQUNWLHFEQUFxRCxZQUFZLEdBQUcsRUFDcEUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUN2RCxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRTlCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN0QixPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsTUFBTSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDM0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08sS0FBSyxDQUFDLHFCQUFxQixDQUFDLEVBQ3BDLFVBQVUsRUFDVixNQUFNLEdBQUcsS0FBSyxFQUNkLE9BQU8sRUFDUCxpQkFBaUIsR0FBRyxJQUFJLEVBQ3hCLHdCQUF3QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUM1QyxZQUFZLEVBQ1osaUJBQWlCLEdBU2xCO1FBT0MsTUFBTSxVQUFVLEdBQ2QsaUJBQWlCO1lBQ2pCLENBQUMsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUMzRSxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRS9ELCtGQUErRjtRQUMvRixtRkFBbUY7UUFDbkYsNEVBQTRFO1FBQzVFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEQsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUxRSx1Q0FBdUM7UUFDdkMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDO1FBRXRFLG1EQUFtRDtRQUNuRCxzRUFBc0U7UUFDdEUscURBQXFEO1FBQ3JELE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUU7WUFDcEMsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxhQUFhLENBQzdDLElBQUksRUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FDdkIsQ0FBQztZQUVGLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsbUVBQW1FO2dCQUNuRSxxQ0FBcUM7Z0JBQ3JDLE9BQU8sV0FBVyxVQUFVLElBQUksQ0FBQztZQUNuQyxDQUFDO1lBRUQscUNBQXFDO1lBQ3JDLG9FQUFvRTtZQUNwRSxzR0FBc0c7WUFDdEcsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2hELDZEQUE2RDtZQUM3RCxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUN2RSxLQUFLLEVBQ0wsR0FBRyxDQUNKLENBQUM7WUFDRiwwRUFBMEU7WUFDMUUsc0VBQXNFO1lBQ3RFLDBCQUEwQjtZQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdEUsWUFBWSxHQUFHLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDckMsQ0FBQztZQUNELE9BQU8sV0FBVyxZQUFZLElBQUksQ0FBQztRQUNyQyxDQUFDLENBQUM7UUFFRixvRUFBb0U7UUFDcEUsd0VBQXdFO1FBQ3hFLG1FQUFtRTtRQUNuRSwyQ0FBMkM7UUFDM0MsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ2xELE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBZSxFQUFVLEVBQUUsQ0FDL0MsS0FBSzthQUNGLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2YsTUFBTSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ25FLElBQUksdUJBQXVCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN4RCx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUM7YUFDRCxHQUFHLENBQUMsWUFBWSxDQUFDO2FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVoQiw2RkFBNkY7UUFDN0Ysc0ZBQXNGO1FBQ3RGLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVwRCwrREFBK0Q7UUFDL0QsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRWxELE1BQU0sT0FBTyxHQUFHLFlBQVk7WUFDMUIsQ0FBQyxDQUFDLEdBQUcsZUFBZSwwREFBMEQsWUFBWSxFQUFFO1lBQzVGLENBQUMsQ0FBQyxlQUFlLENBQUM7UUFFcEIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ25DLE1BQU0sZ0JBQWdCLEdBQXFCLEVBQUUsQ0FBQztRQUM5QyxNQUFNLHNCQUFzQixHQUMxQixNQUFNLHlCQUF5QixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hELE1BQU0sbUNBQW1DLEdBQUcsTUFBTSxhQUFhLENBQUM7WUFDOUQsR0FBRyxhQUFhO1lBQ2hCLEdBQUcsY0FBYztTQUNsQixDQUFDLENBQUM7UUFFSCxrRUFBa0U7UUFDbEUsOENBQThDO1FBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQzdDLEtBQUssRUFBRTtnQkFDTCxRQUFRLEVBQUUsT0FBTztnQkFDakIsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFDbEMsVUFBVSxFQUFFLGtCQUFrQjtnQkFDOUIsTUFBTSxFQUFFLElBQUk7YUFDYjtZQUNELE1BQU0sRUFBRSxJQUFJO1lBQ1osYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUNyQyxNQUFNLEVBQUUsS0FBSyxFQUFFLHVDQUF1QztZQUN0RCxRQUFRLEVBQUUsU0FBUyxFQUFFLDJDQUEyQztZQUNoRSxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUUsK0JBQStCO1lBQy9ELFVBQVUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLHlEQUF5RDtZQUNuRixNQUFNLEVBQUUsUUFBUTtZQUNoQixLQUFLLEVBQUUsS0FBSztZQUNaLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsTUFBTSxFQUFFLEtBQUs7WUFDYixpRUFBaUU7WUFDakUsNEVBQTRFO1lBQzVFLHFFQUFxRTtZQUNyRSxNQUFNLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLDZDQUE2QzthQUNsRDtZQUNELHFFQUFxRTtZQUNyRSx3RUFBd0U7WUFDeEUsc0RBQXNEO1lBQ3RELDBFQUEwRTtZQUMxRSxzRUFBc0U7WUFDdEUsb0VBQW9FO1lBQ3BFLHNFQUFzRTtZQUN0RSx5REFBeUQ7WUFDekQsU0FBUyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFDM0QsMENBQTBDO1lBQzFDLGdGQUFnRjtZQUNoRixHQUFHLHNCQUFzQjtZQUN6QixpQkFBaUIsRUFBRTtnQkFDakIsS0FBSztnQkFDTCxNQUFNO2dCQUNOLE1BQU07Z0JBQ04sTUFBTTtnQkFDTixLQUFLO2dCQUNMLE1BQU07Z0JBQ04sTUFBTTtnQkFDTixNQUFNO2FBQ1A7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsMkVBQTJFO2dCQUMzRSw0RUFBNEU7Z0JBQzVFLHlCQUF5QixFQUFFO2dCQUMzQixlQUFlLENBQUM7b0JBQ2QsSUFBSSxFQUFFLFVBQVU7b0JBQ2hCLFdBQVcsRUFBRSxJQUFJLENBQUMsb0JBQW9CO29CQUN0QyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CO29CQUM3QyxnQkFBZ0I7b0JBQ2hCLGlCQUFpQixFQUFFLG1DQUFtQztpQkFDdkQsQ0FBQztnQkFDRiw0RUFBNEU7Z0JBQzVFLG9GQUFvRjtnQkFDcEYsMkJBQTJCLEVBQUU7YUFDOUI7WUFDRCxtRkFBbUY7WUFDbkYsMkZBQTJGO1lBQzNGLHVGQUF1RjtZQUN2RixxRkFBcUY7WUFDckYsMkNBQTJDO1lBQzNDLDZDQUE2QztZQUM3QyxxRkFBcUY7WUFDckYsaUZBQWlGO1NBQ2xGLENBQUMsQ0FBQztRQUNILElBQUksNkJBQTZCLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQztRQUM5RCxJQUFJLENBQUM7WUFDSCxNQUFNLGFBQWEsR0FBRyxNQUFNLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRXZELElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsYUFBYSxFQUNiLDhCQUE4QixFQUM5QixJQUFJLEVBQ0o7Z0JBQ0UsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQ0FBcUM7YUFDcEUsQ0FDRixDQUFDO1lBQ0YsSUFBSSxDQUFDLDRCQUE0QixDQUMvQixzQ0FBc0MsRUFDdEMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsZUFBZSxJQUFJLENBQ3BDLENBQUM7WUFFRixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUMxQixPQUFPLENBQUMsR0FBRyxFQUFFLEVBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FDakMsQ0FBQztnQkFDRixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7Z0JBRWhCLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUNsQyxNQUFNLEdBQUcsbUJBQW1CLENBQUM7Z0JBQy9CLENBQUM7cUJBQU0sSUFDTCxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDNUIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFDN0IsQ0FBQztvQkFDRCxNQUFNLEdBQUcsaUJBQWlCLENBQUM7Z0JBQzdCLENBQUM7Z0JBRUQsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3hELE1BQU0sU0FBUyxDQUNiLFlBQVksRUFDWixNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ25ELENBQUM7WUFDSixDQUFDO1lBRUQsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUU5QixJQUNFLENBQUMsYUFBYSxDQUFDLFdBQVc7Z0JBQzFCLGFBQWEsQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDdEMsQ0FBQztnQkFDRCxNQUFNLElBQUksa0JBQWtCLENBQUMsd0NBQXdDLEVBQUU7b0JBQ3JFLElBQUksRUFBRSx5S0FBeUs7aUJBQ2hMLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCwwRUFBMEU7WUFDMUUsaUZBQWlGO1lBQ2pGLElBQ0UsZ0JBQWdCLENBQUMsT0FBTztnQkFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUNoRCxDQUFDO2dCQUNELE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQ3RFLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNyRCxNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQztvQkFDekMsVUFBVSxFQUFFLEVBQUU7b0JBQ2QsWUFBWSxFQUFFLFVBQVU7b0JBQ3hCLFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzNCLENBQUMsQ0FBQztnQkFDSCwwREFBMEQ7Z0JBQzFELE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO2dCQUN2RCxLQUFLLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDbkIsS0FBSyxNQUFNLEtBQUssSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7NEJBQy9CLElBQUksZUFBZSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ2pELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQ0FDckIsZUFBZSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7Z0NBQ3BDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDOzRCQUM5QyxDQUFDOzRCQUNELGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNyQyxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLElBQUksZUFBZSxFQUFFLENBQUM7b0JBQ3ZELE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQztvQkFDeEMsTUFBTSxVQUFVLEdBQ2QsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO3dCQUNyQixDQUFDLENBQUMsVUFBVSxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUc7d0JBQzVCLENBQUMsQ0FBQyxXQUFXLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDcEUsT0FBTyxDQUFDLElBQUksQ0FDVixLQUFLLENBQUMsTUFBTSxDQUFDLHVCQUF1QixVQUFVLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FDNUQsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sNkJBQTZCLEdBQ2pDLG1DQUFtQyxFQUFFLENBQUM7WUFFeEMsTUFBTSxXQUFXLEdBQUcsS0FBSyxFQUFFLGFBQXFCLEVBQUUsRUFBRTtnQkFDbEQsTUFBTSxrQkFBa0IsR0FBRyxhQUFhLENBQUM7Z0JBRXpDLE1BQU0sb0JBQW9CLEdBQUc7Ozs7eUJBSVosa0JBQWtCLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUM7O3FEQUVqQiw2QkFBNkIsSUFBSSxDQUFDO2dCQUUvRSxzRUFBc0U7Z0JBQ3RFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUN2QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO29CQUNwRSxDQUFDO29CQUNELHFDQUFxQztvQkFDckMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNuQyxNQUFNLEtBQUssQ0FBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFFNUMsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLG9CQUFvQixDQUFDLENBQUM7b0JBQzdELE9BQU87Z0JBQ1QsQ0FBQztnQkFFRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBRW5DLGtFQUFrRTtnQkFDbEUsK0RBQStEO2dCQUMvRCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDL0QsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUM7b0JBQzlDLE1BQU0sRUFBRTt3QkFDTixFQUFFLEVBQUUsbUVBQW1FLHFCQUFxQixFQUFFO3FCQUMvRjtvQkFDRCxLQUFLLEVBQUU7d0JBQ0wsUUFBUSxFQUFFLG9CQUFvQjt3QkFDOUIsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTt3QkFDbEMsVUFBVSxFQUFFLGtCQUFrQjt3QkFDOUIsTUFBTSxFQUFFLElBQUk7cUJBQ2I7b0JBQ0QsT0FBTztvQkFDUCxtRkFBbUY7b0JBQ25GLDhFQUE4RTtvQkFDOUUsU0FBUyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQztvQkFDL0QsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtvQkFDckMsTUFBTSxFQUFFLElBQUk7b0JBQ1osTUFBTTtvQkFDTixRQUFRLEVBQUUsTUFBTTtvQkFDaEIsTUFBTSxFQUFFLFFBQVE7b0JBQ2hCLEtBQUssRUFBRSxJQUFJO29CQUNYLFNBQVMsRUFBRSxJQUFJO29CQUNmLE1BQU0sRUFBRSxLQUFLO29CQUNiLFFBQVEsRUFBRSxDQUFDLDJDQUEyQyxDQUFDO2lCQUN4RCxDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLGtCQUFrQixDQUNyQixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLElBQUksRUFDSjtvQkFDRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLHFDQUFxQztpQkFDcEUsQ0FDRixDQUFDO2dCQUNGLElBQUksQ0FBQyw0QkFBNEIsQ0FDL0IsK0JBQStCLEVBQy9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGVBQWUsSUFBSSxDQUNwQyxDQUFDO1lBQ0osQ0FBQyxDQUFDO1lBQ0YsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUM1RCxNQUFNLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBRXJDLElBQUksd0JBQXdCLEVBQUUsQ0FBQztnQkFDN0IsNkJBQTZCLEdBQUcsS0FBSyxDQUFDO2dCQUN0QyxPQUFPO29CQUNMLFFBQVEsRUFBRSxnQkFBZ0I7b0JBQzFCLGdCQUFnQjtvQkFDaEIsV0FBVztvQkFDWCxpQkFBaUI7aUJBQ2xCLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO1FBQzNELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsNkJBQTZCLEdBQUcsSUFBSSxDQUFDO1lBQ3JDLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSw2QkFBNkIsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUM7b0JBQ0gsTUFBTSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbkMsQ0FBQztnQkFBQyxPQUFPLFlBQVksRUFBRSxDQUFDO29CQUN0QixPQUFPLENBQUMsSUFBSSxDQUNWLG9EQUFvRCxFQUNwRCxZQUFZLENBQ2IsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDTyxLQUFLLENBQUMsb0JBQW9CLENBQUMsRUFDbkMsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsTUFBTSxHQUFHLEtBQUssRUFDZCxpQkFBaUIsR0FBRyxJQUFJLEVBQ3hCLFlBQVksRUFDWixtQkFBbUIsRUFDbkIscUNBQXFDLEVBQ3JDLDZCQUE2QixFQUM3QixpQkFBaUIsR0FjbEI7UUFNQyxnRUFBZ0U7UUFDaEUsdUVBQXVFO1FBQ3ZFLE1BQU0sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsR0FDdEQsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDM0IsVUFBVTtZQUNWLE9BQU8sRUFBRSxZQUFZO1lBQ3JCLCtEQUErRDtZQUMvRCxnRUFBZ0U7WUFDaEUsa0VBQWtFO1lBQ2xFLDJEQUEyRDtZQUMzRCxnRUFBZ0U7WUFDaEUsK0RBQStEO1lBQy9ELE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNO1lBQzFDLG1CQUFtQjtZQUNuQixxQ0FBcUM7WUFDckMsNkJBQTZCO1lBQzdCLFlBQVk7WUFDWixpQkFBaUI7WUFDakIsc0VBQXNFO1lBQ3RFLGlFQUFpRTtZQUNqRSw0REFBNEQ7WUFDNUQsb0JBQW9CLEVBQUUsaUJBQWlCO1NBQ3hDLENBQUMsQ0FBQztRQUVMLDRCQUE0QjtRQUM1QixNQUFNLG1CQUFtQixHQUFHLEdBQUcsV0FBVyxjQUFjLENBQUM7UUFDekQsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUM7WUFDdkQsVUFBVTtZQUNWLE9BQU8sRUFBRSxtQkFBbUI7WUFDNUIsTUFBTTtZQUNOLGlCQUFpQixFQUFFLEtBQUs7WUFDeEIsWUFBWTtZQUNaLGlCQUFpQjtTQUNsQixDQUFDLENBQUM7UUFFSCxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsaUJBQWlCLENBQUM7UUFDekQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBRUQsNEJBQTRCO1FBQzVCLElBQUksQ0FBQztZQUNILE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLHdCQUF3QjtRQUMxQixDQUFDO1FBRUQsa0NBQWtDO1FBQ2xDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sNkJBQTZCLEdBQUcsbUNBQW1DLEVBQUUsQ0FBQztRQUU1RSxNQUFNLG9CQUFvQixHQUFHOztzQ0FFSyxpQkFBaUI7Ozs7Ozt5QkFNOUIsYUFBYTs7cURBRWUsNkJBQTZCLElBQUksQ0FBQztRQUVuRixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUNuRSxDQUFDO2FBQU0sQ0FBQztZQUNOLDhDQUE4QztZQUM5QyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDbkMsTUFBTSxFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsR0FDMUQsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLHNFQUFzRTtZQUN0RSx5RUFBeUU7WUFDekUseURBQXlEO1lBQ3pELE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9ELE1BQU0sV0FBVyxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDdEMsTUFBTSxFQUFFO29CQUNOLEVBQUUsRUFBRSxtRUFBbUUsZ0JBQWdCLEdBQUcscUJBQXFCLEVBQUU7aUJBQ2xIO2dCQUNELEtBQUssRUFBRTtvQkFDTCxRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixVQUFVLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQztvQkFDaEMsVUFBVSxFQUFFLGtCQUFrQjtvQkFDOUIsTUFBTSxFQUFFLElBQUk7aUJBQ2I7Z0JBQ0QsT0FBTyxFQUFFLFdBQVc7Z0JBQ3BCLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7Z0JBQ3JDLE1BQU0sRUFBRSxJQUFJO2dCQUNaLE1BQU07Z0JBQ04sUUFBUSxFQUFFLE1BQU07Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixLQUFLLEVBQUUsSUFBSTtnQkFDWCxTQUFTLEVBQUUsSUFBSTtnQkFDZixNQUFNLEVBQUUsS0FBSztnQkFDYixNQUFNLEVBQUUsZ0JBQWdCO2dCQUN4QixRQUFRLEVBQUUsQ0FBQywyQ0FBMkMsQ0FBQzthQUN4RCxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxrQkFBa0IsQ0FDckIseUJBQXlCLEVBQ3pCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGVBQWUsSUFBSSxDQUNwQyxDQUFDO1FBQ0osQ0FBQztRQUVELGtCQUFrQjtRQUNsQixNQUFNLFFBQVEsR0FBcUI7WUFDakMsR0FBRyxhQUFhO1lBQ2hCLFNBQVMsRUFBRTtnQkFDVCxHQUFHLGFBQWEsQ0FBQyxTQUFTO2dCQUMxQixHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsU0FBUzthQUN0QztZQUNELE9BQU8sRUFBRTtnQkFDUCxHQUFHLGFBQWEsQ0FBQyxPQUFPO2dCQUN4QixHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsT0FBTzthQUNwQztTQUNGLENBQUM7UUFFRiwwRUFBMEU7UUFDMUUsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLEVBQUUsaUJBQXlCLEVBQUUsRUFBRTtZQUM5RCxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzdELE1BQU0sNkJBQTZCLEdBQ2pDLG1DQUFtQyxFQUFFLENBQUM7WUFDeEMsTUFBTSxJQUFJLEdBQUc7O3NDQUVtQixpQkFBaUI7Ozs7O3lCQUs5QixPQUFPOztxREFFcUIsNkJBQTZCLElBQUksQ0FBQztZQUVqRixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDdkMsTUFBTSxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDNUMsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN0QixPQUFPO2dCQUNMLFFBQVE7Z0JBQ1IsWUFBWTtnQkFDWixnQkFBZ0IsRUFBRSxlQUFlLENBQUMsZ0JBQWdCO2dCQUNsRCxXQUFXLEVBQUUsbUJBQW1CO2FBQ2pDLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7OztPQUlHO0lBQ08sS0FBSyxDQUFDLG1CQUFtQjtRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2xDLHFEQUFxRDtZQUNyRCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsZ0NBQWdDLEVBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQzdCLENBQUM7UUFDRixJQUFJLENBQUMsa0JBQWtCLENBQ3JCLGtJQUFrSSxDQUNuSSxDQUFDO1FBRUYscURBQXFEO1FBQ3JELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDeEQsTUFBTSxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFNUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFOUMsbUdBQW1HO1FBQ25HLCtFQUErRTtRQUMvRSwrRkFBK0Y7UUFDL0YsTUFBTSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUN6RCxVQUFVLEVBQ1YsU0FBUyxDQUNWLENBQUM7UUFFRixvRUFBb0U7UUFDcEUsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsQ0FDbEMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FDN0MsQ0FBQztRQUNGLE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FDckQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUNwQyxDQUFDO1FBRUYsaUVBQWlFO1FBQ2pFLHdFQUF3RTtRQUN4RSxrRUFBa0U7UUFDbEUsTUFBTSxTQUFTLEdBQUcsVUFBVTthQUN6QixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNaLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN4RSxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUM3RCxLQUFLLEVBQ0wsR0FBRyxDQUNKLENBQUM7WUFDRixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdEUsWUFBWSxHQUFHLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDckMsQ0FBQztZQUNELE9BQU8sa0JBQWtCLFlBQVksSUFBSSxDQUFDO1FBQzVDLENBQUMsQ0FBQzthQUNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVkLGlGQUFpRjtRQUNqRixNQUFNLFlBQVksR0FBRyxjQUFjO2FBQ2hDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ1osTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3hFLElBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQzdELEtBQUssRUFDTCxHQUFHLENBQ0osQ0FBQztZQUNGLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN0RSxZQUFZLEdBQUcsS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUNyQyxDQUFDO1lBQ0QsT0FBTyxXQUFXLFlBQVksSUFBSSxDQUFDO1FBQ3JDLENBQUMsQ0FBQzthQUNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVkLHNFQUFzRTtRQUN0RSxNQUFNLFlBQVksR0FBRyxZQUFZO1lBQy9CLENBQUMsQ0FBQyx3REFBd0QsWUFBWSxLQUFLLFNBQVMsRUFBRTtZQUN0RixDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWQsZ0RBQWdEO1FBQ2hELE1BQU0saUNBQWlDLEdBQUcsTUFBTSxhQUFhLENBQUM7WUFDNUQsR0FBRyxVQUFVO1lBQ2IsR0FBRyxjQUFjO1NBQ2xCLENBQUMsQ0FBQztRQUNILE1BQU0sWUFBWSxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN2QyxNQUFNLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLGtFQUFrRTthQUN2RTtZQUNELEtBQUssRUFBRTtnQkFDTCxRQUFRLEVBQUUsWUFBWTtnQkFDdEIsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFDbEMsVUFBVSxFQUFFLGtCQUFrQjtnQkFDOUIsTUFBTSxFQUFFLElBQUk7YUFDYjtZQUNELE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQjtZQUNyQyxNQUFNLEVBQUUsSUFBSTtZQUNaLE1BQU0sRUFBRSxLQUFLO1lBQ2IsUUFBUSxFQUFFLE1BQU07WUFDaEIsR0FBRyxFQUFFLFVBQVU7WUFDZixNQUFNLEVBQUUsUUFBUTtZQUNoQixLQUFLLEVBQUUsSUFBSTtZQUNYLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFFBQVEsRUFBRSxDQUFDLGdCQUFnQixDQUFDO1lBQzVCLGlCQUFpQixFQUFFO2dCQUNqQixLQUFLO2dCQUNMLE1BQU07Z0JBQ04sTUFBTTtnQkFDTixNQUFNO2dCQUNOLEtBQUs7Z0JBQ0wsTUFBTTtnQkFDTixNQUFNO2dCQUNOLE1BQU07YUFDUDtZQUNELE9BQU8sRUFBRTtnQkFDUCxlQUFlLENBQUM7b0JBQ2QsSUFBSSxFQUFFLE1BQU07b0JBQ1osV0FBVyxFQUFFLElBQUksQ0FBQyxvQkFBb0I7b0JBQ3RDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7b0JBQzdDLGlCQUFpQixFQUFFLGlDQUFpQztpQkFDckQsQ0FBQzthQUNIO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBRS9ELE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDTyxLQUFLLENBQUMsbUJBQW1CLENBQUMsRUFDbEMsT0FBTyxFQUNQLE1BQU0sR0FBRyxLQUFLLEdBSWY7UUFDQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUMxRCxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVuRCxpREFBaUQ7UUFDakQsZ0VBQWdFO1FBQ2hFLHNFQUFzRTtRQUN0RSxxRUFBcUU7UUFDckUscUVBQXFFO1FBQ3JFLE1BQU0sWUFBWSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUMsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztnQ0E0QnhDLENBQUM7UUFFN0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osNkNBQTZDO1lBQzdDLE1BQU0sU0FBUyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUN2QyxPQUFPO1FBQ1QsQ0FBQztRQUVELCtEQUErRDtRQUUvRCxNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRSxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDakMsTUFBTSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxtRUFBbUUsdUJBQXVCLEVBQUU7YUFDakc7WUFDRCxLQUFLLEVBQUU7Z0JBQ0wsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7Z0JBQ2xDLFVBQVUsRUFBRSxrQkFBa0I7Z0JBQzlCLE1BQU0sRUFBRSxJQUFJO2FBQ2I7WUFDRCxPQUFPO1lBQ1AsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUNyQyxNQUFNLEVBQUUsSUFBSTtZQUNaLEdBQUcsRUFBRSxVQUFVO1lBQ2YsTUFBTSxFQUFFLEtBQUs7WUFDYixRQUFRLEVBQUUsTUFBTTtZQUNoQixVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUM7WUFDbkQsTUFBTSxFQUFFLFFBQVE7WUFDaEIsS0FBSyxFQUFFLElBQUk7WUFDWCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLE1BQU0sRUFBRSxLQUFLO1lBQ2IsaUJBQWlCLEVBQUU7Z0JBQ2pCLEtBQUs7Z0JBQ0wsTUFBTTtnQkFDTixNQUFNO2dCQUNOLE1BQU07Z0JBQ04sS0FBSztnQkFDTCxNQUFNO2dCQUNOLE1BQU07Z0JBQ04sTUFBTTthQUNQO1lBQ0QsU0FBUyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQztZQUMvRCxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO1lBQzlCLDZFQUE2RTtZQUM3RSxRQUFRLEVBQUUsRUFBRTtTQUNiLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsMEJBQTBCLENBQzdCLHdCQUF3QixFQUN4QixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxrQkFBa0IsSUFBSSxDQUN2QyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ08sS0FBSyxDQUFDLGlCQUFpQixDQUMvQixHQUFXLEVBQ1gsSUFBMkI7UUFFM0IsTUFBTSxXQUFXLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM3QixNQUFNLFNBQVMsQ0FDYixJQUFJLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxFQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ3JDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDTyxLQUFLLENBQUMsY0FBYyxDQUM1QixHQUFXLEVBQ1gsTUFnQkM7UUFFRCxNQUFNLFFBQVEsR0FBRztZQUNmLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxJQUFJLFlBQVk7WUFDdkMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLElBQUksV0FBVztZQUN0QyxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksSUFBSSxRQUFRO1lBQzdDLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxJQUFJLE9BQU87WUFDNUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixJQUFJLElBQUk7WUFDakQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJO2dCQUN0QyxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7YUFDaEMsQ0FBQztZQUNGLEdBQUcsQ0FBQyxNQUFNLENBQUMseUJBQXlCLEtBQUssU0FBUyxJQUFJO2dCQUNwRCx5QkFBeUIsRUFBRSxNQUFNLENBQUMseUJBQXlCO2FBQzVELENBQUM7WUFDRixHQUFHLENBQUMsTUFBTSxDQUFDLG9CQUFvQixJQUFJO2dCQUNqQyxvQkFBb0IsRUFBRSxNQUFNLENBQUMsb0JBQW9CO2FBQ2xELENBQUM7U0FDSCxDQUFDO1FBRUYsTUFBTSxTQUFTLENBQ2IsSUFBSSxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxFQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ2xDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDTyxXQUFXLENBQUMsSUFBWTtRQUNoQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7O09BRUc7SUFDTyxLQUFLLENBQUMsZUFBZSxDQUFDLFFBQWdCO1FBQzlDLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFUyxLQUFLLENBQUMsZ0JBQWdCO1FBQzlCLE1BQU0sSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7UUFDNUMsTUFBTSxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRU8sS0FBSyxDQUFDLDhCQUE4QjtRQUMxQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFakUsSUFBSSxDQUFDO1lBQ0gsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQztnQkFDSCxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUssS0FBK0IsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ3ZELE9BQU87Z0JBQ1QsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUN2RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sQ0FDTCxPQUFPLEtBQUssTUFBTTtvQkFDbEIsT0FBTyxLQUFLLE9BQU87b0JBQ25CLE9BQU8sS0FBSyxPQUFPO29CQUNuQixPQUFPLEtBQUssUUFBUSxDQUNyQixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sU0FBUyxHQUNiLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDNUQsTUFBTSxTQUFTLENBQUMsYUFBYSxFQUFFLEdBQUcsT0FBTyxHQUFHLFNBQVMsU0FBUyxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLHdGQUF3RjtRQUMxRixDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQywyQkFBMkI7UUFDdkMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxTQUFTLENBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsRUFDbEQsS0FBSyxDQUNOLENBQUM7UUFDSixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1Asd0ZBQXdGO1FBQzFGLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBYywwQkFBMEI7UUFDdEMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixLQUFLLEdBQUcsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ08sMEJBQTBCO1FBQ2xDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMvQixPQUFPLE9BQU8sQ0FDWixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQzFCLHlCQUF5QixDQUMxQixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEtBQUsseUJBQXlCLEVBQUUsQ0FBQztZQUMxRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQ3JCLG9EQUFvRCxDQUNyRCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsSUFBYyxrQkFBa0I7UUFDOUIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssYUFBYSxDQUFDO0lBQzlFLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsSUFBYyxvQkFBb0I7UUFDaEMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLGdCQUFnQixDQUFDLFdBQTBCO1FBQ25ELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDdEUsTUFBTSxPQUFPLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2xFLElBQUksT0FBTyxLQUFLLFNBQVM7WUFBRSxPQUFPLE9BQU8sQ0FBQztRQUMxQyxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFBYyxpQkFBaUI7UUFDN0IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssS0FBSyxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFDN0Isa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxRQUFRLEdBS1Q7UUFDQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFFbkQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxjQUFjLEdBQUcsTUFBTSxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBRXZFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUM3QyxRQUFRLENBQUMsU0FBUyxFQUNsQixjQUFjLENBQ2YsQ0FBQztZQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFOUQsTUFBTSxNQUFNLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDL0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRXJELE1BQU0sS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFFbEUsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNsRSxJQUFJLHVCQUF1QixFQUFFLENBQUM7Z0JBQzVCLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUNwRCxNQUFNLFNBQVMsQ0FBQyx1QkFBdUIsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUN6RCxDQUFDO1lBRUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQzNDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUN2QyxDQUFDLENBQ0YsQ0FBQztZQUNGLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUNuRCxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFDdkMsQ0FBQyxDQUNGLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FDOUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQ3ZDLENBQUMsQ0FDRixDQUFDO1lBRUYsSUFBSSxDQUFDLHFCQUFxQixDQUN4Qix5QkFBeUIsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxLQUFLLGFBQWEsSUFBSSxTQUFTLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsU0FBUyxVQUFVLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFDcE4sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsVUFBVSxJQUFJLENBQy9CLENBQUM7WUFFRixPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxJQUFJLENBQ1YsNEJBQTRCLEVBQzVCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FDdkQsQ0FBQztZQUNGLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBRU8sb0JBQW9CLENBQzFCLEtBQWdDO1FBRWhDLE1BQU0sTUFBTSxHQUF1RCxFQUFFLENBQUM7UUFDdEUsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUUxQixLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hELE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdEIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyx3QkFBd0IsQ0FDOUIsU0FBd0MsRUFDeEMsTUFHQztRQVFELE1BQU0sTUFBTSxHQU1SLEVBQUUsQ0FBQztRQUNQLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFFOUIsc0VBQXNFO1FBQ3RFLG1FQUFtRTtRQUNuRSxxRUFBcUU7UUFDckUsMkRBQTJEO1FBQzNELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBRzdCLENBQUM7UUFDSixLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQy9ELE1BQU0sVUFBVSxHQUFHLFNBQVM7aUJBQ3pCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2lCQUNwQixPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVELEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDNUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN0Qiw4Q0FBOEM7WUFDOUMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRO2lCQUNoQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztpQkFDcEIsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUU1QixNQUFNLFlBQVksR0FDaEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBRS9ELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRztvQkFDdkIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO29CQUMzQixLQUFLLEVBQUUsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO2lCQUMvRCxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sc0JBQXNCLENBQzVCLE9BQW9DO1FBRXBDLE1BQU0sTUFBTSxHQUF3RCxFQUFFLENBQUM7UUFDdkUsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUU1QixLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzFELE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdEIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICByZWFscGF0aCxcbiAgcmVuYW1lLFxuICBybSxcbiAgd3JpdGVGaWxlLFxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7IFdvcmtmbG93QnVpbGRFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgcGx1cmFsaXplIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgZW5oYW5jZWRSZXNvbHZlT3JpZ2luYWwgZnJvbSAnZW5oYW5jZWQtcmVzb2x2ZSc7XG5pbXBvcnQgKiBhcyBlc2J1aWxkIGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHsgZmluZFVwIH0gZnJvbSAnZmluZC11cCc7XG5pbXBvcnQgeyBnbG9iIH0gZnJvbSAndGlueWdsb2JieSc7XG5pbXBvcnQge1xuICBhcHBseVN3Y1RyYW5zZm9ybSxcbiAgdHlwZSBXb3JrZmxvd01hbmlmZXN0LFxufSBmcm9tICcuL2FwcGx5LXN3Yy10cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHsgY3JlYXRlV29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGUgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBnZXRFc2J1aWxkVHNjb25maWdPcHRpb25zIH0gZnJvbSAnLi9lc2J1aWxkLXRzY29uZmlnLmpzJztcbmltcG9ydCB7XG4gIGZhc3REaXNjb3ZlckVudHJpZXMsXG4gIHR5cGUgRGlzY292ZXJlZEVudHJpZXMsXG59IGZyb20gJy4vZmFzdC1kaXNjb3ZlcnkuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SW1wb3J0UGF0aCxcbiAgcmVzb2x2ZU1vZHVsZVNwZWNpZmllcixcbiAgc3RyaXBQYWNrYWdlVmVyc2lvbixcbn0gZnJvbSAnLi9tb2R1bGUtc3BlY2lmaWVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZU5vZGVNb2R1bGVFcnJvclBsdWdpbiB9IGZyb20gJy4vbm9kZS1tb2R1bGUtZXNidWlsZC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgY3JlYXRlUHNldWRvUGFja2FnZVBsdWdpbiB9IGZyb20gJy4vcHNldWRvLXBhY2thZ2UtZXNidWlsZC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgY3JlYXRlU3djUGx1Z2luIH0gZnJvbSAnLi9zd2MtZXNidWlsZC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyB9IGZyb20gJy4vdHJhbnNmb3JtLXV0aWxzLmpzJztcbmltcG9ydCB0eXBlIHsgU291cmNlbWFwTW9kZSwgV29ya2Zsb3dDb25maWcgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGV4dHJhY3RXb3JrZmxvd0dyYXBocyB9IGZyb20gJy4vd29ya2Zsb3dzLWV4dHJhY3Rvci5qcyc7XG5cbmNvbnN0IGVuaGFuY2VkUmVzb2x2ZSA9IHByb21pc2lmeShlbmhhbmNlZFJlc29sdmVPcmlnaW5hbCk7XG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG5leHBvcnQgdHlwZSB7IERpc2NvdmVyZWRFbnRyaWVzIH0gZnJvbSAnLi9mYXN0LWRpc2NvdmVyeS5qcyc7XG5cbi8qKlxuICogTGVnYWN5IG9wdC1pbiBmb3Igc291cmNlIG1hcHMgb24gdGhlIGZpbmFsIHdvcmtmbG93IHdyYXBwZXIgKyB3ZWJob29rXG4gKiBidW5kbGVzICh3aGljaCBkZWZhdWx0IHRvIG9mZiwgdW5saWtlIHRoZSBzdGVwL2ludGVyaW0gd29ya2Zsb3cgYnVuZGxlc1xuICogdGhhdCBkZWZhdWx0IHRvIGlubGluZSkuIFN1cGVyc2VkZWQgYnkgdGhlIGBzb3VyY2VtYXBgIGNvbmZpZyBvcHRpb24gYW5kXG4gKiB0aGUgYFdPUktGTE9XX1NPVVJDRU1BUGAgZW52aXJvbm1lbnQgdmFyaWFibGU7IGtlcHQgZm9yIGJhY2stY29tcGF0LlxuICovXG5jb25zdCBFTUlUX1NPVVJDRU1BUFNfRk9SX0RFQlVHR0lORyA9XG4gIHByb2Nlc3MuZW52LldPUktGTE9XX0VNSVRfU09VUkNFTUFQU19GT1JfREVCVUdHSU5HID09PSAnMSc7XG5cbmNvbnN0IFZBTElEX1NPVVJDRU1BUF9TVFJJTkdTID0gbmV3IFNldChbXG4gICdpbmxpbmUnLFxuICAnbGlua2VkJyxcbiAgJ2V4dGVybmFsJyxcbiAgJ2JvdGgnLFxuXSk7XG5cbi8qKlxuICogUGFyc2UgdGhlIHZhbHVlIG9mIHRoZSBgV09SS0ZMT1dfU09VUkNFTUFQYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbnRvIGFcbiAqIGBTb3VyY2VtYXBNb2RlYC4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgZW52IHZhciBpcyB1bnNldCwgZW1wdHksIG9yXG4gKiB1bnJlY29nbml6ZWQgKGEgd2FybmluZyBpcyBlbWl0dGVkIGZvciB1bnJlY29nbml6ZWQgdmFsdWVzKS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VTb3VyY2VtYXBFbnYoXG4gIHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFNvdXJjZW1hcE1vZGUgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJycpIHJldHVybiB1bmRlZmluZWQ7XG4gIHN3aXRjaCAodmFsdWUpIHtcbiAgICBjYXNlICcwJzpcbiAgICBjYXNlICdmYWxzZSc6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY2FzZSAnMSc6XG4gICAgY2FzZSAndHJ1ZSc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgaWYgKFZBTElEX1NPVVJDRU1BUF9TVFJJTkdTLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlIGFzIFNvdXJjZW1hcE1vZGU7XG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBJZ25vcmluZyB1bnJlY29nbml6ZWQgV09SS0ZMT1dfU09VUkNFTUFQPSR7dmFsdWV9LiBgICtcbiAgICAgICAgICBgRXhwZWN0ZWQgb25lIG9mOiB0cnVlLCBmYWxzZSwgMCwgMSwgaW5saW5lLCBsaW5rZWQsIGV4dGVybmFsLCBib3RoLmBcbiAgICAgICk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGFuIGFycmF5IG9mIGZpbGUgcGF0aHMgYnkgYXBwZW5kaW5nIHRoZSBgcmVhbHBhdGgoKWAgb2YgZWFjaCBlbnRyeVxuICogKHRvIGhhbmRsZSBzeW1saW5rcywgZS5nLiBwbnBtL3dvcmtzcGFjZSBsYXlvdXRzKSBhbmQgZGVkdXBsaWNhdGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2l0aFJlYWxwYXRocyhlbnRyaWVzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgbmV3IFNldChcbiAgICAgIChcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgZW50cmllcy5tYXAoYXN5bmMgKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlYWxwYXRoKGVudHJ5KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkID8gW2VudHJ5LCByZXNvbHZlZF0gOiBbZW50cnldO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICkuZmxhdCgpXG4gICAgKVxuICApO1xufVxuXG4vKipcbiAqIENhbm9uaWNhbCBcIndoYXQgbW9kdWxlIGRvZXMgdGhpcyBmaWxlIHJlcHJlc2VudD9cIiBrZXkgdXNlZCB0byBkZWR1cGVcbiAqIHZpcnR1YWwtZW50cnkgaW1wb3J0cy5cbiAqXG4gKiBJZiB0aGUgZmlsZSByZXNvbHZlcyB0byBhIHJlYWwgcGFja2FnZSBzcGVjaWZpZXIgKGB3b3JrZmxvdy9pbnRlcm5hbC9idWlsdGluc2AsXG4gKiBgQGludGVybmFsL2FnZW50L3NlcnZlcmAsIGV0Yy4pLCB3ZSByZXR1cm4gdGhlIGJhcmUgc3BlY2lmaWVyIOKAlCB2ZXJzaW9uXG4gKiBzdHJpcHBlZCDigJQgYmVjYXVzZSBlc2J1aWxkJ3MgcGFja2FnZSByZXNvbHV0aW9uIHdpbGwgY29sbGFwc2UgYWxsXG4gKiBpbXBvcnRlcnMgb2YgdGhhdCBzcGVjaWZpZXIgdG8gdGhlIHNhbWUgcGh5c2ljYWwgbW9kdWxlIHJlZ2FyZGxlc3Mgb2ZcbiAqIHdoaWNoIG9uLWRpc2sgY29weSAoc3JjIHZzIGRpc3QpIGFueSBvbmUgaW1wb3J0ZXIgd3JvdGUuXG4gKlxuICogT3RoZXJ3aXNlIHdlIGZhbGwgYmFjayB0byB0aGUgYWJzb2x1dGUgZmlsZSBwYXRoLiBEaXN0aW5jdCBsb2NhbC1hcHBcbiAqIGZpbGVzIGhhdmUgZGlzdGluY3QgcGF0aHMsIHNvIHRoaXMgc3RpbGwgZGVkdXBlcyBhIGZpbGUgYWdhaW5zdCBpdHNlbGZcbiAqIChlLmcuIGlmIGl0IHNob3dzIHVwIGluIGJvdGggYHN0ZXBGaWxlc2AgYW5kIGBzZXJkZU9ubHlGaWxlc2ApIHdpdGhvdXRcbiAqIGNvbmZsYXRpbmcgdW5yZWxhdGVkIGZpbGVzLlxuICovXG5mdW5jdGlvbiBtb2R1bGVJZGVudGl0eUtleShmaWxlOiBzdHJpbmcsIG1vZHVsZVNwZWNpZmllclJvb3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgbW9kdWxlU3BlY2lmaWVyIH0gPSByZXNvbHZlTW9kdWxlU3BlY2lmaWVyKGZpbGUsIG1vZHVsZVNwZWNpZmllclJvb3QpO1xuICBpZiAobW9kdWxlU3BlY2lmaWVyKSB7XG4gICAgLy8gU3RyaXAgdGhlIFwiQDx2ZXJzaW9uPlwiIHN1ZmZpeCBzbyBzb3VyY2UgYW5kIGRpc3QgY29waWVzIG9mIHRoZSBzYW1lXG4gICAgLy8gZXhwb3J0IGNvbGxhcHNlIHRvIHRoZSBzYW1lIGtleS5cbiAgICByZXR1cm4gc3RyaXBQYWNrYWdlVmVyc2lvbihtb2R1bGVTcGVjaWZpZXIpO1xuICB9XG4gIHJldHVybiBmaWxlLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbn1cblxudHlwZSBNYW5pZmVzdEVudHJ5TG9jYXRpb24gPSB7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbn07XG5cbmZ1bmN0aW9uIGZvcm1hdElkTG9jYXRpb24obG9jYXRpb246IE1hbmlmZXN0RW50cnlMb2NhdGlvbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtsb2NhdGlvbi5maWxlUGF0aH0jJHtsb2NhdGlvbi5uYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFVuaXF1ZU1hbmlmZXN0SWRzPFRFbnRyeT4oXG4gIGVudHJpZXNCeUZpbGU6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIFRFbnRyeT4+IHwgdW5kZWZpbmVkLFxuICBpZHM6IE1hcDxzdHJpbmcsIE1hbmlmZXN0RW50cnlMb2NhdGlvbj4sXG4gIGdldElkOiAoZW50cnk6IFRFbnRyeSkgPT4gc3RyaW5nLFxuICBsYWJlbDogJ3N0ZXAnIHwgJ3dvcmtmbG93J1xuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBlbnRyaWVzXSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzQnlGaWxlIHx8IHt9KSkge1xuICAgIGZvciAoY29uc3QgW25hbWUsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgICBjb25zdCBpZCA9IGdldElkKGRhdGEpO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBpZHMuZ2V0KGlkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB7IGZpbGVQYXRoLCBuYW1lIH07XG4gICAgICBpZiAoXG4gICAgICAgIGV4aXN0aW5nICYmXG4gICAgICAgIChleGlzdGluZy5maWxlUGF0aCAhPT0gY3VycmVudC5maWxlUGF0aCB8fFxuICAgICAgICAgIGV4aXN0aW5nLm5hbWUgIT09IGN1cnJlbnQubmFtZSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBpZE5hbWUgPSBsYWJlbCA9PT0gJ3N0ZXAnID8gJ3dvcmtmbG93IHN0ZXAgSUQnIDogJ3dvcmtmbG93IElEJztcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gYCR7bGFiZWx9IGZ1bmN0aW9uYDtcbiAgICAgICAgY29uc3QgY2FwaXRhbGl6ZWRMYWJlbCA9IGxhYmVsID09PSAnc3RlcCcgPyAnU3RlcCcgOiAnV29ya2Zsb3cnO1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dCdWlsZEVycm9yKFxuICAgICAgICAgIGBEdXBsaWNhdGUgJHtpZE5hbWV9IFwiJHtpZH1cIiBnZW5lcmF0ZWQgZm9yICR7Zm9ybWF0SWRMb2NhdGlvbihleGlzdGluZyl9IGFuZCAke2Zvcm1hdElkTG9jYXRpb24oY3VycmVudCl9LmAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDpcbiAgICAgICAgICAgICAgYCR7Y2FwaXRhbGl6ZWRMYWJlbH0gSURzIG11c3QgYmUgdW5pcXVlIGFjcm9zcyBhIGJ1aWxkLiBgICtcbiAgICAgICAgICAgICAgYElmIHlvdSBvd24gb25lIG9mIHRoZSBjb2xsaWRpbmcgZmlsZXMsIHJlbmFtZSB0aGUgJHtmdW5jdGlvbk5hbWV9IG9yIGV4cG9ydCBgICtcbiAgICAgICAgICAgICAgYHRoZSBwYWNrYWdlIGZpbGUgdGhyb3VnaCBhIHVuaXF1ZSBwYWNrYWdlIHN1YnBhdGguIElmIHRoZSBjb2xsaXNpb24gaXMgaW4gYSBgICtcbiAgICAgICAgICAgICAgYHRyYW5zaXRpdmUgZGVwZW5kZW5jeSB5b3UgZG9uJ3QgY29udHJvbCwgZmlsZSBhbiBpc3N1ZSB3aXRoIHRoZSB1cHN0cmVhbSBgICtcbiAgICAgICAgICAgICAgYHBhY2thZ2Ugb3IgcGluIHRvIGEgbm9uLWNvbGxpZGluZyB2ZXJzaW9uLmAsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWRzLnNldChpZCwgY3VycmVudCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlV29ya2Zsb3dNYW5pZmVzdChcbiAgdGFyZ2V0OiBXb3JrZmxvd01hbmlmZXN0LFxuICBpbmNvbWluZzogV29ya2Zsb3dNYW5pZmVzdCxcbiAgc3RlcElkczogTWFwPHN0cmluZywgTWFuaWZlc3RFbnRyeUxvY2F0aW9uPixcbiAgd29ya2Zsb3dJZHM6IE1hcDxzdHJpbmcsIE1hbmlmZXN0RW50cnlMb2NhdGlvbj5cbik6IHZvaWQge1xuICBhc3NlcnRVbmlxdWVNYW5pZmVzdElkcyhcbiAgICBpbmNvbWluZy5zdGVwcyxcbiAgICBzdGVwSWRzLFxuICAgIChkYXRhKSA9PiBkYXRhLnN0ZXBJZCxcbiAgICAnc3RlcCdcbiAgKTtcbiAgYXNzZXJ0VW5pcXVlTWFuaWZlc3RJZHMoXG4gICAgaW5jb21pbmcud29ya2Zsb3dzLFxuICAgIHdvcmtmbG93SWRzLFxuICAgIChkYXRhKSA9PiBkYXRhLndvcmtmbG93SWQsXG4gICAgJ3dvcmtmbG93J1xuICApO1xuXG4gIHRhcmdldC53b3JrZmxvd3MgPSBPYmplY3QuYXNzaWduKHRhcmdldC53b3JrZmxvd3MgfHwge30sIGluY29taW5nLndvcmtmbG93cyk7XG4gIHRhcmdldC5zdGVwcyA9IE9iamVjdC5hc3NpZ24odGFyZ2V0LnN0ZXBzIHx8IHt9LCBpbmNvbWluZy5zdGVwcyk7XG4gIHRhcmdldC5jbGFzc2VzID0gT2JqZWN0LmFzc2lnbih0YXJnZXQuY2xhc3NlcyB8fCB7fSwgaW5jb21pbmcuY2xhc3Nlcyk7XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3Igd29ya2Zsb3cgYnVpbGRlcnMuIFByb3ZpZGVzIGNvbW1vbiBidWlsZCBsb2dpYyBmb3IgdHJhbnNmb3JtaW5nXG4gKiB3b3JrZmxvdyBzb3VyY2UgZmlsZXMgaW50byBkZXBsb3lhYmxlIGJ1bmRsZXMgdXNpbmcgZXNidWlsZCBhbmQgU1dDLlxuICpcbiAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGJ1aWxkKCkgbWV0aG9kIHRvIGRlZmluZSBidWlsZGVyLXNwZWNpZmljIGxvZ2ljLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUJ1aWxkZXIge1xuICBwcm90ZWN0ZWQgY29uZmlnOiBXb3JrZmxvd0NvbmZpZztcblxuICAvKipcbiAgICogVHJhY2tzIHdoaWNoIGV4dGVybmFsIHBhY2thZ2VzIGhhdmUgYWxyZWFkeSBiZWVuIHdhcm5lZCBhYm91dFxuICAgKiB0byBhdm9pZCBkdXBsaWNhdGUgd2FybmluZ3MgYWNyb3NzIG11bHRpcGxlIGRpc2NvdmVyRW50cmllcygpIGNhbGxzLlxuICAgKi9cbiAgcHJpdmF0ZSB3YXJuZWRFeHRlcm5hbFBhY2thZ2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBXb3JrZmxvd0NvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2Zvcm1Qcm9qZWN0Um9vdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcm9qZWN0Um9vdCB8fCB0aGlzLmNvbmZpZy53b3JraW5nRGlyO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBtb2R1bGVTcGVjaWZpZXJSb290KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLm1vZHVsZVNwZWNpZmllclJvb3QgfHwgdGhpcy50cmFuc2Zvcm1Qcm9qZWN0Um9vdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGluZm9ybWF0aW9uYWwgQmFzZUJ1aWxkZXIgbG9ncyBzaG91bGQgYmUgcHJpbnRlZC5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBzaWxlbmNlIHByb2dyZXNzIGxvZ3Mgd2hpbGUga2VlcGluZyB3YXJuaW5ncy9lcnJvcnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHNob3VsZExvZ0Jhc2VCdWlsZGVySW5mbygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBsb2dCYXNlQnVpbGRlckluZm8oLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2hvdWxkTG9nQmFzZUJ1aWxkZXJJbmZvKSB7XG4gICAgICBjb25zb2xlLmxvZyguLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvZ0NyZWF0ZVdvcmtmbG93c0J1bmRsZUluZm8oLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5zdXBwcmVzc0NyZWF0ZVdvcmtmbG93c0J1bmRsZUxvZ3MpIHtcbiAgICAgIHRoaXMubG9nQmFzZUJ1aWxkZXJJbmZvKC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9nQ3JlYXRlV2ViaG9va0J1bmRsZUluZm8oLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5zdXBwcmVzc0NyZWF0ZVdlYmhvb2tCdW5kbGVMb2dzKSB7XG4gICAgICB0aGlzLmxvZ0Jhc2VCdWlsZGVySW5mbyguLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvZ0NyZWF0ZU1hbmlmZXN0SW5mbyguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLnN1cHByZXNzQ3JlYXRlTWFuaWZlc3RMb2dzKSB7XG4gICAgICB0aGlzLmxvZ0Jhc2VCdWlsZGVySW5mbyguLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBvdXRwdXR0aW5nIENKUywgZXNidWlsZCByZXBsYWNlcyBgaW1wb3J0Lm1ldGFgIHdpdGggYW4gZW1wdHkgb2JqZWN0LFxuICAgKiBtYWtpbmcgYGltcG9ydC5tZXRhLnVybGAgKGFuZCBgaW1wb3J0Lm1ldGEucmVzb2x2ZWApIHVuZGVmaW5lZC4gVGhpcyBtZXRob2RcbiAgICogcmV0dXJucyBiYW5uZXIgY29kZSBhbmQgYGRlZmluZWAgZW50cmllcyB0aGF0IHBvbHlmaWxsIHRoZW0gdXNpbmcgQ0pTXG4gICAqIGVxdWl2YWxlbnRzIChgX19maWxlbmFtZWAsIGByZXF1aXJlLnJlc29sdmVgKSBzbyB1c2VyIGNvZGUgKGUuZy4gUHJpc21hKVxuICAgKiB0aGF0IHJlbGllcyBvbiBgaW1wb3J0Lm1ldGEudXJsYCB3b3JrcyBjb3JyZWN0bHkgaW4gYnVuZGxlZCBDSlMgb3V0cHV0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDanNJbXBvcnRNZXRhUG9seWZpbGwoZm9ybWF0OiBzdHJpbmcpOiB7XG4gICAgYmFubmVyOiBzdHJpbmc7XG4gICAgZGVmaW5lOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB9IHtcbiAgICBpZiAoZm9ybWF0ICE9PSAnY2pzJykgcmV0dXJuIHsgYmFubmVyOiAnJywgZGVmaW5lOiB7fSB9O1xuICAgIHJldHVybiB7XG4gICAgICBiYW5uZXI6XG4gICAgICAgICd2YXIgX19pbXBvcnRfbWV0YV91cmwgPSB0eXBlb2YgX19maWxlbmFtZSAhPT0gXCJ1bmRlZmluZWRcIiA/IHJlcXVpcmUoXCJ1cmxcIikucGF0aFRvRmlsZVVSTChfX2ZpbGVuYW1lKS5ocmVmIDogdW5kZWZpbmVkO1xcbicgK1xuICAgICAgICAndmFyIF9faW1wb3J0X21ldGFfcmVzb2x2ZSA9IHR5cGVvZiByZXF1aXJlICE9PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiBfX2ZpbGVuYW1lICE9PSBcInVuZGVmaW5lZFwiICcgK1xuICAgICAgICAnPyAocykgPT4gcmVxdWlyZShcInVybFwiKS5wYXRoVG9GaWxlVVJMKHJlcXVpcmUucmVzb2x2ZShzKSkuaHJlZiA6IHVuZGVmaW5lZDtcXG4nLFxuICAgICAgZGVmaW5lOiB7XG4gICAgICAgICdpbXBvcnQubWV0YS51cmwnOiAnX19pbXBvcnRfbWV0YV91cmwnLFxuICAgICAgICAnaW1wb3J0Lm1ldGEucmVzb2x2ZSc6ICdfX2ltcG9ydF9tZXRhX3Jlc29sdmUnLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gb3V0cHV0dGluZyBmdWxseS1idW5kbGVkIEVTTSwgQ0pTIGRlcGVuZGVuY2llcyB0aGF0IGNhbGwgcmVxdWlyZSgpXG4gICAqIGZvciBOb2RlLmpzIGJ1aWx0aW5zIChlLmcuIGRlYnVnIOKGkiByZXF1aXJlKCd0dHknKSkgYnJlYWsgYmVjYXVzZSBlc2J1aWxkJ3NcbiAgICogQ0pTLXRvLUVTTSBfX3JlcXVpcmUgc2hpbSBkb2Vzbid0IGhhdmUgYWNjZXNzIHRvIGEgcmVhbCByZXF1aXJlIGZ1bmN0aW9uLlxuICAgKiBUaGlzIGJhbm5lciBwcm92aWRlcyBvbmUgdmlhIGNyZWF0ZVJlcXVpcmUgc28gYnVuZGxlZCBDSlMgY29kZSB3b3JrcyBpbiBFU00uXG4gICAqL1xuICBwcml2YXRlIGdldEVzbVJlcXVpcmVCYW5uZXIoZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChmb3JtYXQgIT09ICdlc20nKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuICdpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIGFzIF9fY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xcbnZhciByZXF1aXJlID0gX19jcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XFxuJztcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyB0aGUgY29tcGxldGUgYnVpbGQgcHJvY2VzcyBmb3Igd29ya2Zsb3dzLlxuICAgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgdG8gZGVmaW5lIHRoZWlyIHNwZWNpZmljIGJ1aWxkIHN0ZXBzLlxuICAgKi9cbiAgYWJzdHJhY3QgYnVpbGQoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRmluZHMgdHNjb25maWcuanNvbi9qc2NvbmZpZy5qc29uIGZvciB0aGUgcHJvamVjdC5cbiAgICogVXNlZCBieSBlc2J1aWxkIHRvIHByb3Blcmx5IHJlc29sdmUgbW9kdWxlIGltcG9ydHMgZHVyaW5nIGJ1bmRsaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGZpbmRUc0NvbmZpZ1BhdGgoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBjd2QgPSB0aGlzLmNvbmZpZy53b3JraW5nRGlyIHx8IHByb2Nlc3MuY3dkKCk7XG4gICAgcmV0dXJuIGZpbmRVcChbJ3RzY29uZmlnLmpzb24nLCAnanNjb25maWcuanNvbiddLCB7IGN3ZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb3ZlcnMgYWxsIHNvdXJjZSBmaWxlcyBpbiB0aGUgY29uZmlndXJlZCBkaXJlY3Rvcmllcy5cbiAgICogU2VhcmNoZXMgZm9yIFR5cGVTY3JpcHQgYW5kIEphdmFTY3JpcHQgZmlsZXMgd2hpbGUgZXhjbHVkaW5nIGNvbW1vbiBidWlsZFxuICAgKiBhbmQgZGVwZW5kZW5jeSBkaXJlY3Rvcmllcy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBnZXRJbnB1dEZpbGVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBpZ25vcmUgPSBbXG4gICAgICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgICAgICcqKi8uZ2l0LyoqJyxcbiAgICAgICcqKi8ubmV4dC8qKicsXG4gICAgICAnKiovLm5pdHJvLyoqJyxcbiAgICAgICcqKi8ubnV4dC8qKicsXG4gICAgICAnKiovLm91dHB1dC8qKicsXG4gICAgICAnKiovLnZlcmNlbC8qKicsXG4gICAgICAnKiovLndvcmtmbG93LWRhdGEvKionLFxuICAgICAgJyoqLy53b3JrZmxvdy12aXRlc3QvKionLFxuICAgICAgJyoqLy53ZWxsLWtub3duL3dvcmtmbG93LyoqJyxcbiAgICAgICcqKi8uc3djLyoqJyxcbiAgICAgICcqKi8uc3ZlbHRlLWtpdC8qKicsXG4gICAgICAnKiovLnR1cmJvLyoqJyxcbiAgICAgICcqKi8uY2FjaGUvKionLFxuICAgICAgJyoqLy55YXJuLyoqJyxcbiAgICAgICcqKi8ucG5wbS1zdG9yZS8qKicsXG4gICAgXTtcblxuICAgIC8vIFVzZSByZWxhdGl2ZSBwYXR0ZXJucyB3aXRoIGBjd2RgIHBlciBkaXJlY3Rvcnkgc28gdGhhdCBgZG90OiB0cnVlYFxuICAgIC8vIGFwcGxpZXMgY29uc2lzdGVudGx5IHRvIGJvdGggdGhlIHNlYXJjaCBwYXR0ZXJuICphbmQqIHRoZSBpZ25vcmVcbiAgICAvLyBwYXR0ZXJucy4gV2hlbiBhYnNvbHV0ZSBwYXR0ZXJucyBhcmUgdXNlZCB3aXRoIHRpbnlnbG9iYnksIHRoZSBgKipgXG4gICAgLy8gaW4gaWdub3JlIHBhdHRlcm5zIGRvZXMgbm90IG1hdGNoIGRvdC1wcmVmaXhlZCBwYXRoIHNlZ21lbnRzLlxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRoaXMuY29uZmlnLmRpcnMubWFwKChkaXIpID0+IHtcbiAgICAgICAgY29uc3QgY3dkID0gcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCBkaXIpO1xuICAgICAgICByZXR1cm4gZ2xvYihbJyoqLyoue3RzLHRzeCxtdHMsY3RzLGpzLGpzeCxtanMsY2pzfSddLCB7XG4gICAgICAgICAgY3dkLFxuICAgICAgICAgIGlnbm9yZSxcbiAgICAgICAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3VsdHMuZmxhdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhY2hlcyBkaXNjb3ZlcmVkIHdvcmtmbG93IGVudHJpZXMgYnkgaW5wdXQgYXJyYXkgcmVmZXJlbmNlLlxuICAgKiBVc2VzIFdlYWtNYXAgdG8gYWxsb3cgZ2FyYmFnZSBjb2xsZWN0aW9uIHdoZW4gaW5wdXQgYXJyYXlzIGFyZSBubyBsb25nZXIgcmVmZXJlbmNlZC5cbiAgICogVGhpcyBjYWNoZSBpcyBpbnZhbGlkYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGlucHV0cyBhcnJheSByZWZlcmVuY2UgY2hhbmdlc1xuICAgKiAoZS5nLiwgd2hlbiBmaWxlcyBhcmUgYWRkZWQvcmVtb3ZlZCBkdXJpbmcgd2F0Y2ggbW9kZSkuXG4gICAqL1xuICBwcml2YXRlIGRpc2NvdmVyZWRFbnRyaWVzOiBXZWFrTWFwPHN0cmluZ1tdLCBEaXNjb3ZlcmVkRW50cmllcz4gPVxuICAgIG5ldyBXZWFrTWFwKCk7XG5cbiAgcHVibGljIGNsZWFyRGlzY292ZXJlZEVudHJpZXNDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2NvdmVyZWRFbnRyaWVzID0gbmV3IFdlYWtNYXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQc2V1ZG8tcGFja2FnZXMgdGhhdCBzaG91bGQgbm90IGJlIGNoZWNrZWQgZm9yIHdvcmtmbG93IHBhdHRlcm5zLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUFNFVURPX1BBQ0tBR0VTID0gbmV3IFNldChbXG4gICAgJ3NlcnZlci1vbmx5JyxcbiAgICAnY2xpZW50LW9ubHknLFxuICBdKTtcblxuICAvKipcbiAgICogQ2hlY2tzIGVhY2ggcGFja2FnZSBpbiBleHRlcm5hbFBhY2thZ2VzIGZvciB3b3JrZmxvdyBwYXR0ZXJucyBhbmQgZW1pdHNcbiAgICogd2FybmluZ3MgaWYgYW55IGNvbnRhaW4gXCJ1c2Ugc3RlcFwiLCBcInVzZSB3b3JrZmxvd1wiIGRpcmVjdGl2ZXMsIG9yXG4gICAqIHNlcmlhbGl6YXRpb24gY2xhc3Nlcy4gVGhlc2UgcGF0dGVybnMgd2lsbCBub3QgYmUgdHJhbnNmb3JtZWQgYnkgdGhlXG4gICAqIHdvcmtmbG93IGNvbXBpbGVyIHdoZW4gdGhlIHBhY2thZ2UgaXMgZXh0ZXJuYWxpemVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YXJuQWJvdXRFeHRlcm5hbFdvcmtmbG93UGFja2FnZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXh0ZXJuYWxQYWNrYWdlcyA9IHRoaXMuY29uZmlnLmV4dGVybmFsUGFja2FnZXM7XG4gICAgaWYgKCFleHRlcm5hbFBhY2thZ2VzPy5sZW5ndGgpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgcGtnIG9mIGV4dGVybmFsUGFja2FnZXMpIHtcbiAgICAgIGlmIChCYXNlQnVpbGRlci5QU0VVRE9fUEFDS0FHRVMuaGFzKHBrZykpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMud2FybmVkRXh0ZXJuYWxQYWNrYWdlcy5oYXMocGtnKSkgY29udGludWU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgcGtnLnN0YXJ0c1dpdGgoJy4nKSB8fFxuICAgICAgICBwa2cuc3RhcnRzV2l0aCgnLycpIHx8XG4gICAgICAgIHBrZy5zdGFydHNXaXRoKCckJykgfHxcbiAgICAgICAgcGtnLmluY2x1ZGVzKCcqJykgfHxcbiAgICAgICAgcGtnLmluY2x1ZGVzKCc6JylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2hlY2sgcGFja2FnZS5qc29uIGRlcGVuZGVuY2llcyBmb3IgQHdvcmtmbG93L3NlcmRlIChmYXN0IHBhdGgpXG4gICAgICAgIGxldCBoYXNXb3JrZmxvd1NlcmRlRGVwID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGtnSnNvblBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGtnfS9wYWNrYWdlLmpzb25gLCB7XG4gICAgICAgICAgICBwYXRoczogW3RoaXMuY29uZmlnLndvcmtpbmdEaXJdLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHBrZ0pzb25Tb3VyY2UgPSBhd2FpdCByZWFkRmlsZShwa2dKc29uUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgY29uc3QgcGtnSnNvbiA9IEpTT04ucGFyc2UocGtnSnNvblNvdXJjZSkgYXMge1xuICAgICAgICAgICAgZGVwZW5kZW5jaWVzPzogdW5rbm93bjtcbiAgICAgICAgICAgIHBlZXJEZXBlbmRlbmNpZXM/OiB1bmtub3duO1xuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzID1cbiAgICAgICAgICAgIHR5cGVvZiBwa2dKc29uLmRlcGVuZGVuY2llcyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIHBrZ0pzb24uZGVwZW5kZW5jaWVzICE9PSBudWxsICYmXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShwa2dKc29uLmRlcGVuZGVuY2llcylcbiAgICAgICAgICAgICAgPyAocGtnSnNvbi5kZXBlbmRlbmNpZXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgICAgICAgIDoge307XG4gICAgICAgICAgY29uc3QgcGVlckRlcGVuZGVuY2llcyA9XG4gICAgICAgICAgICB0eXBlb2YgcGtnSnNvbi5wZWVyRGVwZW5kZW5jaWVzID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgcGtnSnNvbi5wZWVyRGVwZW5kZW5jaWVzICE9PSBudWxsICYmXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShwa2dKc29uLnBlZXJEZXBlbmRlbmNpZXMpXG4gICAgICAgICAgICAgID8gKHBrZ0pzb24ucGVlckRlcGVuZGVuY2llcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgICBoYXNXb3JrZmxvd1NlcmRlRGVwID1cbiAgICAgICAgICAgIE9iamVjdC5oYXNPd24oZGVwZW5kZW5jaWVzLCAnQHdvcmtmbG93L3NlcmRlJykgfHxcbiAgICAgICAgICAgIE9iamVjdC5oYXNPd24ocGVlckRlcGVuZGVuY2llcywgJ0B3b3JrZmxvdy9zZXJkZScpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBwYWNrYWdlLmpzb24gbm90IHJlc29sdmFibGUgLSBjb250aW51ZSB0byBzb3VyY2UgY2hlY2tcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHNvdXJjZSBwYXR0ZXJucyAodGhvcm91Z2ggcGF0aCkuXG4gICAgICAgIC8vIE5vdGU6IHJlcXVpcmUucmVzb2x2ZSBvbmx5IGluc3BlY3RzIHRoZSBwYWNrYWdlJ3MgbWFpbiBlbnRyeSBwb2ludC5cbiAgICAgICAgLy8gSWYgd29ya2Zsb3cgY29uc3RydWN0cyBsaXZlIGluIHN1Yi1wYXRocyAoZS5nLiBgbXktcGtnL3dvcmtmbG93c2ApLFxuICAgICAgICAvLyB0aGV5IHdvbid0IGJlIGRldGVjdGVkIGhlcmUuIFRoZSBAd29ya2Zsb3cvc2VyZGUgZGVwIGNoZWNrIGFib3ZlXG4gICAgICAgIC8vIHBhcnRpYWxseSBjb3ZlcnMgc2VyZGUgY2FzZXMuIFRoaXMgaXMgYWNjZXB0YWJsZSBhcyBhIGJlc3QtZWZmb3J0XG4gICAgICAgIC8vIGhldXJpc3RpYyDigJQgdGhlIHByaW1hcnkgZml4IGlzIGF1dG8tcmVtb3ZhbCBpbiB3aXRoV29ya2Zsb3coKS5cbiAgICAgICAgbGV0IGhhc1VzZVN0ZXAgPSBmYWxzZTtcbiAgICAgICAgbGV0IGhhc1VzZVdvcmtmbG93ID0gZmFsc2U7XG4gICAgICAgIGxldCBoYXNTZXJkZSA9IGhhc1dvcmtmbG93U2VyZGVEZXA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZW50cnlQYXRoID0gcmVxdWlyZS5yZXNvbHZlKHBrZywge1xuICAgICAgICAgICAgcGF0aHM6IFt0aGlzLmNvbmZpZy53b3JraW5nRGlyXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZWFkRmlsZShlbnRyeVBhdGgsICd1dGYtOCcpO1xuICAgICAgICAgIGNvbnN0IHBhdHRlcm5zID0gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2UpO1xuICAgICAgICAgIGhhc1VzZVN0ZXAgPSBwYXR0ZXJucy5oYXNVc2VTdGVwO1xuICAgICAgICAgIGhhc1VzZVdvcmtmbG93ID0gcGF0dGVybnMuaGFzVXNlV29ya2Zsb3c7XG4gICAgICAgICAgaWYgKCFoYXNTZXJkZSkge1xuICAgICAgICAgICAgaGFzU2VyZGUgPSBwYXR0ZXJucy5oYXNTZXJkZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEVudHJ5IGZpbGUgbm90IHJlc29sdmFibGUgb3Igbm90IHJlYWRhYmxlIC0gdXNlIHdoYXQgd2UgaGF2ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoYXNVc2VTdGVwICYmICFoYXNVc2VXb3JrZmxvdyAmJiAhaGFzU2VyZGUpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIEJ1aWxkIGEgc3BlY2lmaWMgZGVzY3JpcHRpb24gb2Ygd2hhdCB3YXMgZm91bmRcbiAgICAgICAgY29uc3QgaXNzdWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoaGFzVXNlV29ya2Zsb3cpIGlzc3Vlcy5wdXNoKCdcInVzZSB3b3JrZmxvd1wiIGZ1bmN0aW9ucycpO1xuICAgICAgICBpZiAoaGFzVXNlU3RlcCkgaXNzdWVzLnB1c2goJ1widXNlIHN0ZXBcIiBmdW5jdGlvbnMnKTtcbiAgICAgICAgaWYgKGhhc1NlcmRlKSBpc3N1ZXMucHVzaCgnc2VyaWFsaXphdGlvbiBjbGFzc2VzJyk7XG5cbiAgICAgICAgdGhpcy53YXJuZWRFeHRlcm5hbFBhY2thZ2VzLmFkZChwa2cpO1xuXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgXFxuJHtjaGFsay55ZWxsb3coJ+KaoCcpfSBXYXJuaW5nOiAke2NoYWxrLmJvbGQoYFwiJHtwa2d9XCJgKX0gaXMgbGlzdGVkIGluICR7Y2hhbGsuYm9sZCgnZXh0ZXJuYWxQYWNrYWdlcycpfSAoJHtjaGFsay5ib2xkKCdzZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzJyl9IGluIE5leHQuanMpIGJ1dCBjb250YWlucyB3b3JrZmxvdyBjb2RlICgke2lzc3Vlcy5qb2luKCcsICcpfSkuYCArXG4gICAgICAgICAgICBgXFxuICBUaGlzIGNvZGUgd2lsbCAke2NoYWxrLmJvbGQoJ25vdCcpfSBiZSB0cmFuc2Zvcm1lZCBieSB0aGUgd29ya2Zsb3cgY29tcGlsZXIsIHdoaWNoIGNhbiBjYXVzZSBydW50aW1lIGZhaWx1cmVzLmAgK1xuICAgICAgICAgICAgYFxcbiAgUmVtb3ZlICR7Y2hhbGsuYm9sZChgXCIke3BrZ31cImApfSBmcm9tICR7Y2hhbGsuYm9sZCgnZXh0ZXJuYWxQYWNrYWdlcycpfSAoJHtjaGFsay5ib2xkKCdzZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzJyl9IGluIE5leHQuanMpIHRvIGZpeCB0aGlzLlxcbmBcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBCZXN0LWVmZm9ydDogaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgc2tpcCB0aGlzIHBhY2thZ2Ugc2lsZW50bHlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZGlzY292ZXJFbnRyaWVzKFxuICAgIGlucHV0czogc3RyaW5nW10sXG4gICAgb3V0ZGlyOiBzdHJpbmcsXG4gICAgdHNjb25maWdQYXRoPzogc3RyaW5nXG4gICk6IFByb21pc2U8RGlzY292ZXJlZEVudHJpZXM+IHtcbiAgICBjb25zdCBwcmV2aW91c1Jlc3VsdCA9IHRoaXMuZGlzY292ZXJlZEVudHJpZXMuZ2V0KGlucHV0cyk7XG5cbiAgICBpZiAocHJldmlvdXNSZXN1bHQpIHtcbiAgICAgIHJldHVybiBwcmV2aW91c1Jlc3VsdDtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGU6IERpc2NvdmVyZWRFbnRyaWVzID0ge1xuICAgICAgZGlzY292ZXJlZFN0ZXBzOiBuZXcgU2V0KCksXG4gICAgICBkaXNjb3ZlcmVkV29ya2Zsb3dzOiBuZXcgU2V0KCksXG4gICAgICBkaXNjb3ZlcmVkU2VyZGVGaWxlczogbmV3IFNldCgpLFxuICAgIH07XG5cbiAgICBjb25zdCBkaXNjb3ZlclN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgIC8vIFJlc29sdmUgdGhlIFNESyBydW50aW1lIHNlcmRlIGVudHJ5IHBvaW50IHNvIHRoYXQgdGhlIGRpc2NvdmVyeSBwYXNzXG4gICAgLy8gZGlzY292ZXJzIGNsYXNzZXMgbGlrZSBgUnVuYCB0aGF0IGxpdmUgaW5zaWRlIFNESyBwYWNrYWdlcy4gV2l0aG91dCB0aGlzLFxuICAgIC8vIGZpbGVzIGxpa2UgYHJ1bi5qc2AgYXJlIG9ubHkgZGlzY292ZXJlZCB3aGVuIHVzZXIgY29kZSBpbXBvcnRzIHRoZW0uXG4gICAgLy8gVGhpcyBpcyByZXNvbHZlZCBoZXJlIChyYXRoZXIgdGhhbiBpbiBjYWxsZXJzKSBzbyB0aGF0IHRoZSBvcmlnaW5hbFxuICAgIC8vIGBpbnB1dHNgIGFycmF5IHJlZmVyZW5jZSBpcyBwcmVzZXJ2ZWQgZm9yIFdlYWtNYXAgY2FjaGluZyDigJQgY2FsbGVyc1xuICAgIC8vIGxpa2UgY3JlYXRlV29ya2Zsb3dzQnVuZGxlIGFuZCBjcmVhdGVTdGVwc0J1bmRsZSBjYW4gc2hhcmUgdGhlIHNhbWVcbiAgICAvLyBjYWNoZSBlbnRyeSB3aGVuIHRoZXkgcGFzcyB0aGUgc2FtZSBpbnB1dEZpbGVzIGFycmF5LlxuICAgIGNvbnN0IHJlc29sdmVkV29ya2Zsb3dSdW50aW1lID0gYXdhaXQgZW5oYW5jZWRSZXNvbHZlKFxuICAgICAgb3V0ZGlyLFxuICAgICAgJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUvcnVuJ1xuICAgICkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBjb25zdCBlbnRyeVBvaW50cyA9IHJlc29sdmVkV29ya2Zsb3dSdW50aW1lXG4gICAgICA/IFsuLi5pbnB1dHMsIHJlc29sdmVkV29ya2Zsb3dSdW50aW1lXVxuICAgICAgOiBpbnB1dHM7XG5cbiAgICBjb25zdCBlZmZlY3RpdmVUc2NvbmZpZ1BhdGggPVxuICAgICAgdHNjb25maWdQYXRoID8/IChhd2FpdCB0aGlzLmZpbmRUc0NvbmZpZ1BhdGgoKSk7XG5cbiAgICBhd2FpdCBmYXN0RGlzY292ZXJFbnRyaWVzKHtcbiAgICAgIGVudHJ5UG9pbnRzLFxuICAgICAgc3RhdGUsXG4gICAgICBkZWZhdWx0VHNjb25maWdQYXRoOiBlZmZlY3RpdmVUc2NvbmZpZ1BhdGgsXG4gICAgICB3b3JraW5nRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgIH0pO1xuXG4gICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oXG4gICAgICBgRGlzY292ZXJpbmcgd29ya2Zsb3cgZGlyZWN0aXZlc2AsXG4gICAgICBgJHtEYXRlLm5vdygpIC0gZGlzY292ZXJTdGFydH1tc2BcbiAgICApO1xuXG4gICAgLy8gV2FybiBhYm91dCBleHRlcm5hbCBwYWNrYWdlcyB0aGF0IGNvbnRhaW4gd29ya2Zsb3cgY29kZVxuICAgIGF3YWl0IHRoaXMud2FybkFib3V0RXh0ZXJuYWxXb3JrZmxvd1BhY2thZ2VzKCk7XG5cbiAgICB0aGlzLmRpc2NvdmVyZWRFbnRyaWVzLnNldChpbnB1dHMsIHN0YXRlKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGdlbmVyYXRlZCBmaWxlcyBhdG9taWNhbGx5IHdoZXJlIHBvc3NpYmxlLiBPbiBXaW5kb3dzLCBOZXh0LmpzIGNhblxuICAgKiBicmllZmx5IGhvbGQgZ2VuZXJhdGVkIHJvdXRlIGZpbGVzIG9wZW4gd2hpbGUgY29tcGlsaW5nIHRoZW0sIHdoaWNoIG1ha2VzXG4gICAqIHJlbmFtZS1vdmVyLWV4aXN0aW5nIGZhaWwgd2l0aCBFUEVSTS9FQUNDRVMuIEluIHRoYXQgY2FzZSwgZmFsbCBiYWNrIHRvIGFcbiAgICogZGlyZWN0IG92ZXJ3cml0ZSBzbyB3YXRjaCByZWJ1aWxkcyBjYW4gc3RpbGwgbWFrZSBwcm9ncmVzcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVHZW5lcmF0ZWRGaWxlKFxuICAgIHRhcmdldFBhdGg6IHN0cmluZyxcbiAgICBjb250ZW50OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGVtcFBhdGggPSBgJHt0YXJnZXRQYXRofS4ke3JhbmRvbVVVSUQoKX0udG1wYDtcbiAgICBhd2FpdCB3cml0ZUZpbGUodGVtcFBhdGgsIGNvbnRlbnQpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZW5hbWUodGVtcFBhdGgsIHRhcmdldFBhdGgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvckNvZGUgPVxuICAgICAgICBlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdjb2RlJyBpbiBlcnJvclxuICAgICAgICAgID8gKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKFxuICAgICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInICYmXG4gICAgICAgIChlcnJvckNvZGUgPT09ICdFUEVSTScgfHwgZXJyb3JDb2RlID09PSAnRUFDQ0VTJylcbiAgICAgICkge1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGFyZ2V0UGF0aCwgY29udGVudCk7XG4gICAgICAgIGF3YWl0IHJtKHRlbXBQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGRlYnVnIGluZm9ybWF0aW9uIHRvIGEgSlNPTiBmaWxlIGZvciB0cm91Ymxlc2hvb3RpbmcgYnVpbGQgaXNzdWVzLlxuICAgKiBVc2VzIGF0b21pYyB3cml0ZSAodGVtcCBmaWxlICsgcmVuYW1lKSB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aGVuXG4gICAqIG11bHRpcGxlIGJ1aWxkcyBydW4gY29uY3VycmVudGx5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZURlYnVnRmlsZShcbiAgICBvdXRmaWxlOiBzdHJpbmcsXG4gICAgZGVidWdEYXRhOiBvYmplY3QsXG4gICAgbWVyZ2U/OiBib29sZWFuXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByZWZpeCA9IHRoaXMuY29uZmlnLmRlYnVnRmlsZVByZWZpeCB8fCAnJztcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gYCR7ZGlybmFtZShvdXRmaWxlKX0vJHtwcmVmaXh9JHtiYXNlbmFtZShvdXRmaWxlKX0uZGVidWcuanNvbmA7XG4gICAgbGV0IGV4aXN0aW5nID0ge307XG5cbiAgICB0cnkge1xuICAgICAgaWYgKG1lcmdlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHRhcmdldFBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgZXhpc3RpbmcgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0IHlldCBvciBpcyBjb3JydXB0ZWQgLSBzdGFydCBmcmVzaC5cbiAgICAgICAgICAvLyBEb24ndCBsb2cgZXJyb3IgZm9yIEVOT0VOVCAoZmlsZSBub3QgZm91bmQpIGFzIHRoYXQncyBleHBlY3RlZCBvbiBmaXJzdCBydW4uXG4gICAgICAgICAgaWYgKChlIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRXJyb3IgcmVhZGluZyBkZWJ1ZyBmaWxlLCBzdGFydGluZyBmcmVzaDonLCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVyZ2VkRGF0YSA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICB7XG4gICAgICAgICAgLi4uZXhpc3RpbmcsXG4gICAgICAgICAgLi4uZGVidWdEYXRhLFxuICAgICAgICB9LFxuICAgICAgICBudWxsLFxuICAgICAgICAyXG4gICAgICApO1xuXG4gICAgICBhd2FpdCB0aGlzLndyaXRlR2VuZXJhdGVkRmlsZSh0YXJnZXRQYXRoLCBtZXJnZWREYXRhKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gd3JpdGUgZGVidWcgZmlsZTonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgYW5kIG9wdGlvbmFsbHkgdGhyb3dzIG9uIGVzYnVpbGQgZXJyb3JzIGFuZCB3YXJuaW5ncy5cbiAgICogQHBhcmFtIHRocm93T25FcnJvciAtIElmIHRydWUsIHRocm93cyBhbiBlcnJvciB3aGVuIGVzYnVpbGQgZXJyb3JzIGFyZSBwcmVzZW50XG4gICAqL1xuICBwcml2YXRlIGxvZ0VzYnVpbGRNZXNzYWdlcyhcbiAgICByZXN1bHQ6IHsgZXJyb3JzPzogYW55W107IHdhcm5pbmdzPzogYW55W10gfSxcbiAgICBwaGFzZTogc3RyaW5nLFxuICAgIHRocm93T25FcnJvciA9IHRydWUsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHN1cHByZXNzV2FybmluZ3M/OiBib29sZWFuO1xuICAgIH1cbiAgKTogdm9pZCB7XG4gICAgaWYgKHJlc3VsdC5lcnJvcnMgJiYgcmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGDinYwgZXNidWlsZCBlcnJvcnMgaW4gJHtwaGFzZX06YCk7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBlcnJvciBvZiByZXN1bHQuZXJyb3JzKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCAgJHtlcnJvci50ZXh0fWApO1xuICAgICAgICBlcnJvck1lc3NhZ2VzLnB1c2goZXJyb3IudGV4dCk7XG4gICAgICAgIGlmIChlcnJvci5sb2NhdGlvbikge1xuICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gYCAgICBhdCAke2Vycm9yLmxvY2F0aW9uLmZpbGV9OiR7ZXJyb3IubG9jYXRpb24ubGluZX06JHtlcnJvci5sb2NhdGlvbi5jb2x1bW59YDtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGxvY2F0aW9uKTtcbiAgICAgICAgICBlcnJvck1lc3NhZ2VzLnB1c2gobG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aHJvd09uRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93QnVpbGRFcnJvcihcbiAgICAgICAgICBgQnVpbGQgZmFpbGVkIGR1cmluZyAke3BoYXNlfTpcXG4ke2Vycm9yTWVzc2FnZXMuam9pbignXFxuJyl9YCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoaW50OiBgUmV2aWV3IHRoZSBlc2J1aWxkIGVycm9ycyBhYm92ZSDigJQgdGhleSBjb21lIGZyb20gdGhlICR7cGhhc2V9IGJ1bmRsZS4gRml4IHRoZSBvZmZlbmRpbmcgc291cmNlIGZpbGVzIGFuZCByZS1ydW4gdGhlIGJ1aWxkLmAsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgICFvcHRpb25zPy5zdXBwcmVzc1dhcm5pbmdzICYmXG4gICAgICByZXN1bHQud2FybmluZ3MgJiZcbiAgICAgIHJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4oYCEgIGVzYnVpbGQgd2FybmluZ3MgaW4gJHtwaGFzZX06YCk7XG4gICAgICBmb3IgKGNvbnN0IHdhcm5pbmcgb2YgcmVzdWx0Lndhcm5pbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgICAke3dhcm5pbmcudGV4dH1gKTtcbiAgICAgICAgaWYgKHdhcm5pbmcubG9jYXRpb24pIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgICAgIGF0ICR7d2FybmluZy5sb2NhdGlvbi5maWxlfToke3dhcm5pbmcubG9jYXRpb24ubGluZX06JHt3YXJuaW5nLmxvY2F0aW9uLmNvbHVtbn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBhYnNvbHV0ZSBmaWxlIHBhdGggdG8gYSBub3JtYWxpemVkIHJlbGF0aXZlIHBhdGggZm9yIHRoZSBtYW5pZmVzdC5cbiAgICovXG4gIHByaXZhdGUgZ2V0UmVsYXRpdmVGaWxlcGF0aChhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEZpbGUgPSBhYnNvbHV0ZVBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgbGV0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlKG5vcm1hbGl6ZWRXb3JraW5nRGlyLCBub3JtYWxpemVkRmlsZSkucmVwbGFjZShcbiAgICAgIC9cXFxcL2csXG4gICAgICAnLydcbiAgICApO1xuICAgIC8vIEhhbmRsZSBmaWxlcyBkaXNjb3ZlcmVkIG91dHNpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgICAgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoXG4gICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgIC5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09ICcuLicpXG4gICAgICAgIC5qb2luKCcvJyk7XG4gICAgfVxuICAgIHJldHVybiByZWxhdGl2ZVBhdGg7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3JlYXRlUm91dGVJbXBvcnRTcGVjaWZpZXIoZmlsZTogc3RyaW5nLCByb3V0ZURpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IGltcG9ydFBhdGgsIGlzUGFja2FnZSB9ID0gZ2V0SW1wb3J0UGF0aChcbiAgICAgIGZpbGUsXG4gICAgICB0aGlzLmNvbmZpZy53b3JraW5nRGlyXG4gICAgKTtcbiAgICBpZiAoaXNQYWNrYWdlKSB7XG4gICAgICByZXR1cm4gaW1wb3J0UGF0aDtcbiAgICB9XG5cbiAgICBsZXQgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUocm91dGVEaXIsIGZpbGUpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLycpICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gICAgfVxuICAgIHJldHVybiByZWxhdGl2ZVBhdGg7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZVN0ZXBTb3VyY2VSZWdpc3RyYXRpb25GaWxlKHtcbiAgICBpbnB1dEZpbGVzLFxuICAgIG91dGZpbGUsXG4gICAgdHNjb25maWdQYXRoLFxuICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICB9OiB7XG4gICAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gICAgb3V0ZmlsZTogc3RyaW5nO1xuICAgIHRzY29uZmlnUGF0aD86IHN0cmluZztcbiAgICBkaXNjb3ZlcmVkRW50cmllcz86IERpc2NvdmVyZWRFbnRyaWVzO1xuICB9KTogUHJvbWlzZTxXb3JrZmxvd01hbmlmZXN0PiB7XG4gICAgY29uc3Qgc3RlcHNCdW5kbGVTdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd29ya2Zsb3dNYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdCA9IHt9O1xuICAgIGNvbnN0IGJ1aWx0SW5TdGVwcyA9ICd3b3JrZmxvdy9pbnRlcm5hbC9idWlsdGlucyc7XG4gICAgY29uc3QgcmVzb2x2ZWRCdWlsdEluU3RlcHMgPSAoYXdhaXQgZW5oYW5jZWRSZXNvbHZlKFxuICAgICAgZGlybmFtZShvdXRmaWxlKSxcbiAgICAgIGJ1aWx0SW5TdGVwc1xuICAgICkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93QnVpbGRFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byByZXNvbHZlIGJ1aWx0LWluIHN0ZXBzIHNvdXJjZXMuXFxuXFxuQ2F1c2VkIGJ5OiAke1N0cmluZyhlcnIpfWAsXG4gICAgICAgIHtcbiAgICAgICAgICBoaW50OiAncnVuIGBwbnBtIGluc3RhbGwgd29ya2Zsb3dgIHRvIHJlc29sdmUgdGhpcyBpc3N1ZS4nLFxuICAgICAgICAgIGNhdXNlOiBlcnIsXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSkpIGFzIHN0cmluZztcblxuICAgIGNvbnN0IGRpc2NvdmVyZWQgPVxuICAgICAgZGlzY292ZXJlZEVudHJpZXMgPz9cbiAgICAgIChhd2FpdCB0aGlzLmRpc2NvdmVyRW50cmllcyhpbnB1dEZpbGVzLCBkaXJuYW1lKG91dGZpbGUpLCB0c2NvbmZpZ1BhdGgpKTtcbiAgICBjb25zdCBzdGVwRmlsZXMgPSBbLi4uZGlzY292ZXJlZC5kaXNjb3ZlcmVkU3RlcHNdLnNvcnQoKTtcbiAgICBjb25zdCB3b3JrZmxvd0ZpbGVzID0gWy4uLmRpc2NvdmVyZWQuZGlzY292ZXJlZFdvcmtmbG93c10uc29ydCgpO1xuICAgIGNvbnN0IHNlcmRlRmlsZXMgPSBbLi4uZGlzY292ZXJlZC5kaXNjb3ZlcmVkU2VyZGVGaWxlc10uc29ydCgpO1xuICAgIGNvbnN0IHN0ZXBGaWxlc1NldCA9IG5ldyBTZXQoc3RlcEZpbGVzKTtcbiAgICBjb25zdCBzZXJkZU9ubHlGaWxlcyA9IHNlcmRlRmlsZXMuZmlsdGVyKChmKSA9PiAhc3RlcEZpbGVzU2V0LmhhcyhmKSk7XG5cbiAgICBhd2FpdCB0aGlzLndyaXRlRGVidWdGaWxlKG91dGZpbGUsIHtcbiAgICAgIHN0ZXBGaWxlcyxcbiAgICAgIHdvcmtmbG93RmlsZXMsXG4gICAgICBzZXJkZU9ubHlGaWxlcyxcbiAgICAgIHNvdXJjZUltcG9ydHM6IHRydWUsXG4gICAgfSk7XG5cbiAgICBjb25zdCBlbWl0dGVkSW1wb3J0SWRlbnRpdGllcyA9IG5ldyBTZXQ8c3RyaW5nPihbYnVpbHRJblN0ZXBzXSk7XG4gICAgY29uc3QgaW1wb3J0U3RhdGVtZW50czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCByb3V0ZURpciA9IGRpcm5hbWUob3V0ZmlsZSk7XG4gICAgY29uc3QgYWRkUmVnaXN0cmF0aW9uSW1wb3J0ID0gKHNwZWNpZmllcjogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICBpbXBvcnRTdGF0ZW1lbnRzLnB1c2goYGltcG9ydCAke0pTT04uc3RyaW5naWZ5KHNwZWNpZmllcil9O2ApO1xuICAgIH07XG4gICAgY29uc3QgYWRkUmVnaXN0cmF0aW9uRmlsZUltcG9ydCA9IChmaWxlOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGlkZW50aXR5ID0gbW9kdWxlSWRlbnRpdHlLZXkoZmlsZSwgdGhpcy5tb2R1bGVTcGVjaWZpZXJSb290KTtcbiAgICAgIGlmIChlbWl0dGVkSW1wb3J0SWRlbnRpdGllcy5oYXMoaWRlbnRpdHkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGVtaXR0ZWRJbXBvcnRJZGVudGl0aWVzLmFkZChpZGVudGl0eSk7XG4gICAgICBhZGRSZWdpc3RyYXRpb25JbXBvcnQodGhpcy5jcmVhdGVSb3V0ZUltcG9ydFNwZWNpZmllcihmaWxlLCByb3V0ZURpcikpO1xuICAgIH07XG5cbiAgICBhZGRSZWdpc3RyYXRpb25JbXBvcnQoYnVpbHRJblN0ZXBzKTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2Ygc3RlcEZpbGVzKSB7XG4gICAgICBhZGRSZWdpc3RyYXRpb25GaWxlSW1wb3J0KGZpbGUpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2Ygc2VyZGVPbmx5RmlsZXMpIHtcbiAgICAgIGFkZFJlZ2lzdHJhdGlvbkZpbGVJbXBvcnQoZmlsZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0ID0gYC8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcbi8qIGVzbGludC1kaXNhYmxlICovXG4ke2ltcG9ydFN0YXRlbWVudHMuam9pbignXFxuJyl9XG5cbmV4cG9ydCBjb25zdCBfX3N0ZXBzX3JlZ2lzdGVyZWQgPSB0cnVlO1xuYDtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKG91dGZpbGUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBjb25zdCB0ZW1wUGF0aCA9IGAke291dGZpbGV9LiR7cmFuZG9tVVVJRCgpfS50bXBgO1xuICAgIGF3YWl0IHdyaXRlRmlsZSh0ZW1wUGF0aCwgb3V0cHV0KTtcbiAgICBhd2FpdCByZW5hbWUodGVtcFBhdGgsIG91dGZpbGUpO1xuXG4gICAgY29uc3QgbWFuaWZlc3RGaWxlcyA9IEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFsuLi5zdGVwRmlsZXMsIC4uLnNlcmRlT25seUZpbGVzLCByZXNvbHZlZEJ1aWx0SW5TdGVwc10pXG4gICAgKS5zb3J0KCk7XG4gICAgY29uc3Qgc3RlcElkcyA9IG5ldyBNYXA8c3RyaW5nLCBNYW5pZmVzdEVudHJ5TG9jYXRpb24+KCk7XG4gICAgY29uc3Qgd29ya2Zsb3dJZHMgPSBuZXcgTWFwPHN0cmluZywgTWFuaWZlc3RFbnRyeUxvY2F0aW9uPigpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWFuaWZlc3RGaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gYXdhaXQgcmVhZEZpbGUoZmlsZSwgJ3V0ZjgnKTtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVGaWxlcGF0aCA9IHRoaXMuZ2V0UmVsYXRpdmVGaWxlcGF0aChmaWxlKTtcbiAgICAgICAgY29uc3QgeyB3b3JrZmxvd01hbmlmZXN0OiBmaWxlTWFuaWZlc3QgfSA9IGF3YWl0IGFwcGx5U3djVHJhbnNmb3JtKFxuICAgICAgICAgIHJlbGF0aXZlRmlsZXBhdGgsXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICAgICdzdGVwJyxcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHRoaXMudHJhbnNmb3JtUHJvamVjdFJvb3QsXG4gICAgICAgICAgdGhpcy5tb2R1bGVTcGVjaWZpZXJSb290XG4gICAgICAgICk7XG4gICAgICAgIG1lcmdlV29ya2Zsb3dNYW5pZmVzdChcbiAgICAgICAgICB3b3JrZmxvd01hbmlmZXN0LFxuICAgICAgICAgIGZpbGVNYW5pZmVzdCxcbiAgICAgICAgICBzdGVwSWRzLFxuICAgICAgICAgIHdvcmtmbG93SWRzXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBhd2FpdCB0aGlzLmVuc3VyZVN3Y0lnbm9yZWQoKTtcbiAgICB0aGlzLmxvZ0Jhc2VCdWlsZGVySW5mbyhcbiAgICAgICdDcmVhdGVkIHN0ZXAgcmVnaXN0cmF0aW9ucycsXG4gICAgICBgJHtEYXRlLm5vdygpIC0gc3RlcHNCdW5kbGVTdGFydH1tc2BcbiAgICApO1xuICAgIHJldHVybiB3b3JrZmxvd01hbmlmZXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBidW5kbGUgZm9yIHdvcmtmbG93IHN0ZXAgZnVuY3Rpb25zLlxuICAgKiBTdGVwcyBoYXZlIGZ1bGwgTm9kZS5qcyBydW50aW1lIGFjY2VzcyBhbmQgaGFuZGxlIHNpZGUgZWZmZWN0cywgQVBJIGNhbGxzLCBldGMuXG4gICAqXG4gICAqIEBwYXJhbSBleHRlcm5hbGl6ZU5vblN0ZXBzIC0gSWYgdHJ1ZSwgb25seSBidW5kbGVzIHN0ZXAgZW50cnkgcG9pbnRzIGFuZCBleHRlcm5hbGl6ZXMgb3RoZXIgY29kZVxuICAgKiBAcGFyYW0gc291cmNlU3RlcFJlZ2lzdHJhdGlvbkltcG9ydHMgLSBJZiB0cnVlLCBlbWl0cyBhIHNvdXJjZSBpbXBvcnQgcmVnaXN0cmF0aW9uIGZpbGUgaW5zdGVhZCBvZiBidW5kbGluZyBzdGVwIHJlZ2lzdHJhdGlvbnNcbiAgICogQHBhcmFtIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXMgLSBJZiB0cnVlLCBhbHNvIGJ1bmRsZXMgcHJvamVjdC1sb2NhbCBmaWxlcyBpbXBvcnRlZCBieSBzdGVwIGVudHJpZXMgZm9yIGRpcmVjdCBydW50aW1lIGxvYWRpbmdcbiAgICogQHJldHVybnMgQnVpbGQgY29udGV4dCAoZm9yIHdhdGNoIG1vZGUpIGFuZCB0aGUgY29sbGVjdGVkIHdvcmtmbG93IG1hbmlmZXN0XG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlU3RlcHNCdW5kbGUoe1xuICAgIGlucHV0RmlsZXMsXG4gICAgZm9ybWF0ID0gJ2VzbScsXG4gICAgb3V0ZmlsZSxcbiAgICBleHRlcm5hbGl6ZU5vblN0ZXBzLFxuICAgIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXMsXG4gICAgc291cmNlU3RlcFJlZ2lzdHJhdGlvbkltcG9ydHMsXG4gICAgcmV3cml0ZVRzRXh0ZW5zaW9ucyxcbiAgICB0c2NvbmZpZ1BhdGgsXG4gICAgZGlzY292ZXJlZEVudHJpZXMsXG4gICAgc2tpcEVzbVJlcXVpcmVCYW5uZXIgPSBmYWxzZSxcbiAgfToge1xuICAgIHRzY29uZmlnUGF0aD86IHN0cmluZztcbiAgICBpbnB1dEZpbGVzOiBzdHJpbmdbXTtcbiAgICBvdXRmaWxlOiBzdHJpbmc7XG4gICAgZm9ybWF0PzogJ2NqcycgfCAnZXNtJztcbiAgICBleHRlcm5hbGl6ZU5vblN0ZXBzPzogYm9vbGVhbjtcbiAgICBidW5kbGVUcmFuc2l0aXZlTG9jYWxTdGVwRGVwZW5kZW5jaWVzPzogYm9vbGVhbjtcbiAgICBzb3VyY2VTdGVwUmVnaXN0cmF0aW9uSW1wb3J0cz86IGJvb2xlYW47XG4gICAgcmV3cml0ZVRzRXh0ZW5zaW9ucz86IGJvb2xlYW47XG4gICAgZGlzY292ZXJlZEVudHJpZXM/OiBEaXNjb3ZlcmVkRW50cmllcztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHNraXAgdGhlIGBjcmVhdGVSZXF1aXJlYCBiYW5uZXIgb24gdGhlIHN0ZXBzIGJ1bmRsZS5cbiAgICAgKiBVc2VkIGJ5IGBjcmVhdGVDb21iaW5lZEJ1bmRsZWAgd2l0aCBgYnVuZGxlRmluYWxPdXRwdXQ6IHRydWVgIHdoZXJlXG4gICAgICogdGhlIG91dGVyIGVzYnVpbGQgcGFzcyBwcm92aWRlcyBpdHMgb3duIGJhbm5lciwgcHJldmVudGluZyB0aGVcbiAgICAgKiBgX19jcmVhdGVSZXF1aXJlYCBpZGVudGlmaWVyIGZyb20gYmVpbmcgZGVjbGFyZWQgdHdpY2UgYWZ0ZXIgaW5saW5pbmcuXG4gICAgICovXG4gICAgc2tpcEVzbVJlcXVpcmVCYW5uZXI/OiBib29sZWFuO1xuICB9KTogUHJvbWlzZTx7XG4gICAgY29udGV4dDogZXNidWlsZC5CdWlsZENvbnRleHQgfCB1bmRlZmluZWQ7XG4gICAgbWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3Q7XG4gIH0+IHtcbiAgICBjb25zdCBzdGVwc0J1bmRsZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB3b3JrZmxvd01hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0ID0ge307XG4gICAgY29uc3QgYnVpbHRJblN0ZXBzID0gJ3dvcmtmbG93L2ludGVybmFsL2J1aWx0aW5zJztcblxuICAgIGNvbnN0IHJlc29sdmVkQnVpbHRJblN0ZXBzID0gYXdhaXQgZW5oYW5jZWRSZXNvbHZlKFxuICAgICAgZGlybmFtZShvdXRmaWxlKSxcbiAgICAgICd3b3JrZmxvdy9pbnRlcm5hbC9idWlsdGlucydcbiAgICApLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd0J1aWxkRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcmVzb2x2ZSBidWlsdC1pbiBzdGVwcyBzb3VyY2VzLlxcblxcbkNhdXNlZCBieTogJHtTdHJpbmcoZXJyKX1gLFxuICAgICAgICB7XG4gICAgICAgICAgaGludDogJ3J1biBgcG5wbSBpbnN0YWxsIHdvcmtmbG93YCB0byByZXNvbHZlIHRoaXMgaXNzdWUuJyxcbiAgICAgICAgICBjYXVzZTogZXJyLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gRGlzY292ZXJ5IG9mIHdvcmtmbG93L3N0ZXAvc2VyZGUgZW50cmllcy4gVGhlIFNESyBydW50aW1lIGVudHJ5IHBvaW50XG4gICAgLy8gKHdvcmtmbG93L3J1bnRpbWUpIGlzIHJlc29sdmVkIGluc2lkZSBkaXNjb3ZlckVudHJpZXMoKSBpdHNlbGYgc28gdGhhdFxuICAgIC8vIGNhbGxlcnMgY2FuIHBhc3MgdGhlIG9yaWdpbmFsIGlucHV0RmlsZXMgcmVmZXJlbmNlIGFuZCBiZW5lZml0IGZyb21cbiAgICAvLyBXZWFrTWFwIGNhY2hpbmcgYWNyb3NzIGNyZWF0ZVdvcmtmbG93c0J1bmRsZSAvIGNyZWF0ZVN0ZXBzQnVuZGxlIGNhbGxzLlxuICAgIGNvbnN0IGRpc2NvdmVyZWQgPVxuICAgICAgZGlzY292ZXJlZEVudHJpZXMgPz9cbiAgICAgIChhd2FpdCB0aGlzLmRpc2NvdmVyRW50cmllcyhpbnB1dEZpbGVzLCBkaXJuYW1lKG91dGZpbGUpLCB0c2NvbmZpZ1BhdGgpKTtcbiAgICBjb25zdCBzdGVwRmlsZXMgPSBbLi4uZGlzY292ZXJlZC5kaXNjb3ZlcmVkU3RlcHNdLnNvcnQoKTtcbiAgICBjb25zdCB3b3JrZmxvd0ZpbGVzID0gWy4uLmRpc2NvdmVyZWQuZGlzY292ZXJlZFdvcmtmbG93c10uc29ydCgpO1xuICAgIGNvbnN0IHNlcmRlRmlsZXMgPSBbLi4uZGlzY292ZXJlZC5kaXNjb3ZlcmVkU2VyZGVGaWxlc10uc29ydCgpO1xuXG4gICAgLy8gSW5jbHVkZSBzZXJkZSBmaWxlcyB0aGF0IGFyZW4ndCBhbHJlYWR5IHN0ZXAgZmlsZXMgZm9yIGNyb3NzLWNvbnRleHQgY2xhc3MgcmVnaXN0cmF0aW9uLlxuICAgIC8vIENsYXNzZXMgbmVlZCB0byBiZSByZWdpc3RlcmVkIGluIHRoZSBzdGVwIGJ1bmRsZSBzbyB0aGV5IGNhbiBiZSBkZXNlcmlhbGl6ZWRcbiAgICAvLyB3aGVuIHJlY2VpdmluZyBkYXRhIGZyb20gd29ya2Zsb3dzIGFuZCBzZXJpYWxpemVkIHdoZW4gcmV0dXJuaW5nIGRhdGEgdG8gd29ya2Zsb3dzLlxuICAgIGNvbnN0IHN0ZXBGaWxlc1NldCA9IG5ldyBTZXQoc3RlcEZpbGVzKTtcbiAgICBjb25zdCBzZXJkZU9ubHlGaWxlcyA9IHNlcmRlRmlsZXMuZmlsdGVyKChmKSA9PiAhc3RlcEZpbGVzU2V0LmhhcyhmKSk7XG5cbiAgICBpZiAoXG4gICAgICBzb3VyY2VTdGVwUmVnaXN0cmF0aW9uSW1wb3J0cyAmJlxuICAgICAgZXh0ZXJuYWxpemVOb25TdGVwcyAmJlxuICAgICAgIWJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXNcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRleHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgbWFuaWZlc3Q6IGF3YWl0IHRoaXMuY3JlYXRlU3RlcFNvdXJjZVJlZ2lzdHJhdGlvbkZpbGUoe1xuICAgICAgICAgIGlucHV0RmlsZXMsXG4gICAgICAgICAgb3V0ZmlsZSxcbiAgICAgICAgICB0c2NvbmZpZ1BhdGgsXG4gICAgICAgICAgZGlzY292ZXJlZEVudHJpZXM6IGRpc2NvdmVyZWQsXG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBsb2cgdGhlIHN0ZXAgZmlsZXMgZm9yIGRlYnVnZ2luZ1xuICAgIGF3YWl0IHRoaXMud3JpdGVEZWJ1Z0ZpbGUob3V0ZmlsZSwge1xuICAgICAgc3RlcEZpbGVzLFxuICAgICAgd29ya2Zsb3dGaWxlcyxcbiAgICAgIHNlcmRlT25seUZpbGVzLFxuICAgIH0pO1xuXG4gICAgLy8gSGVscGVyIHRvIGNyZWF0ZSBpbXBvcnQgc3RhdGVtZW50IGZyb20gZmlsZSBwYXRoXG4gICAgLy8gRm9yIHdvcmtzcGFjZS9ub2RlX21vZHVsZXMgcGFja2FnZXMsIHVzZXMgdGhlIHBhY2thZ2UgbmFtZSBzbyBlc2J1aWxkXG4gICAgLy8gd2lsbCByZXNvbHZlIHRocm91Z2ggcGFja2FnZS5qc29uIGV4cG9ydHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY29uZGl0aW9uc1xuICAgIGNvbnN0IGNyZWF0ZUltcG9ydCA9IChmaWxlOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3Jrc3BhY2VSb290ID0gdGhpcy5jb25maWcud29ya2luZ0RpclxuICAgICAgICAucmVwbGFjZSgvXFxcXC9nLCAnLycpXG4gICAgICAgIC5yZXBsYWNlKC9cXC8kLywgJycpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFdvcmtzcGFjZUZpbGUgPSBmaWxlLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgIC8vIE9ubHkgdXNlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBmb3Igd29ya3NwYWNlIHN5bWxpbmtzIChmaWxlc1xuICAgICAgLy8gb3V0c2lkZSBub2RlX21vZHVsZXMgaW4gYSBwYWNrYWdlcy8qL3NyYy8gZGlyZWN0b3J5KS4gRm9yIHRhcmJhbGwtXG4gICAgICAvLyBpbnN0YWxsZWQgcGFja2FnZXMgKGZpbGVzIGluc2lkZSBub2RlX21vZHVsZXMvKSwgZmFsbCB0aHJvdWdoIHRvXG4gICAgICAvLyBnZXRJbXBvcnRQYXRoIHdoaWNoIHJldHVybnMgcGFja2FnZSBzcGVjaWZpZXJzIOKAlCB0aGlzIGFsbG93cyB0aGVcbiAgICAgIC8vIFNXQyBwbHVnaW4ncyBleHRlcm5hbGl6ZU5vblN0ZXBzIHRvIHdvcmsgY29ycmVjdGx5LlxuICAgICAgY29uc3QgaXNXb3Jrc3BhY2VTb3VyY2VCYWNrZWRQYWNrYWdlRmlsZSA9XG4gICAgICAgIG5vcm1hbGl6ZWRXb3Jrc3BhY2VGaWxlLmluY2x1ZGVzKCcvcGFja2FnZXMvJykgJiZcbiAgICAgICAgbm9ybWFsaXplZFdvcmtzcGFjZUZpbGUuaW5jbHVkZXMoJy9zcmMvJykgJiZcbiAgICAgICAgIW5vcm1hbGl6ZWRXb3Jrc3BhY2VGaWxlLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLycpICYmXG4gICAgICAgICEoXG4gICAgICAgICAgbm9ybWFsaXplZFdvcmtzcGFjZUZpbGUgPT09IG5vcm1hbGl6ZWRXb3Jrc3BhY2VSb290IHx8XG4gICAgICAgICAgbm9ybWFsaXplZFdvcmtzcGFjZUZpbGUuc3RhcnRzV2l0aChgJHtub3JtYWxpemVkV29ya3NwYWNlUm9vdH0vYClcbiAgICAgICAgKTtcbiAgICAgIGNvbnN0IGlzU291cmNlQmFja2VkUGFja2FnZUZpbGUgPSBpc1dvcmtzcGFjZVNvdXJjZUJhY2tlZFBhY2thZ2VGaWxlO1xuXG4gICAgICBpZiAoaXNTb3VyY2VCYWNrZWRQYWNrYWdlRmlsZSkge1xuICAgICAgICBsZXQgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUoXG4gICAgICAgICAgbm9ybWFsaXplZFdvcmtzcGFjZVJvb3QsXG4gICAgICAgICAgbm9ybWFsaXplZFdvcmtzcGFjZUZpbGVcbiAgICAgICAgKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4vJykgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgICAgICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgJyR7cmVsYXRpdmVQYXRofSc7YDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBpbXBvcnRQYXRoLCBpc1BhY2thZ2UgfSA9IGdldEltcG9ydFBhdGgoXG4gICAgICAgIGZpbGUsXG4gICAgICAgIHRoaXMuY29uZmlnLndvcmtpbmdEaXJcbiAgICAgICk7XG5cbiAgICAgIGlmIChpc1BhY2thZ2UpIHtcbiAgICAgICAgLy8gVXNlIHBhY2thZ2UgbmFtZSAtIGVzYnVpbGQgd2lsbCByZXNvbHZlIHZpYSBwYWNrYWdlLmpzb24gZXhwb3J0c1xuICAgICAgICByZXR1cm4gYGltcG9ydCAnJHtpbXBvcnRQYXRofSc7YDtcbiAgICAgIH1cblxuICAgICAgLy8gTG9jYWwgYXBwIGZpbGUgLSB1c2UgcmVsYXRpdmUgcGF0aFxuICAgICAgLy8gTm9ybWFsaXplIGJvdGggcGF0aHMgdG8gZm9yd2FyZCBzbGFzaGVzIGJlZm9yZSBjYWxsaW5nIHJlbGF0aXZlKClcbiAgICAgIC8vIFRoaXMgaXMgY3JpdGljYWwgb24gV2luZG93cyB3aGVyZSByZWxhdGl2ZSgpIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cyB3aXRoIG1peGVkIHBhdGggZm9ybWF0c1xuICAgICAgY29uc3Qgbm9ybWFsaXplZFdvcmtpbmdEaXIgPSB0aGlzLmNvbmZpZy53b3JraW5nRGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWxlID0gZmlsZS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAvLyBDYWxjdWxhdGUgcmVsYXRpdmUgcGF0aCBmcm9tIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBmaWxlXG4gICAgICBsZXQgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUobm9ybWFsaXplZFdvcmtpbmdEaXIsIG5vcm1hbGl6ZWRGaWxlKS5yZXBsYWNlKFxuICAgICAgICAvXFxcXC9nLFxuICAgICAgICAnLydcbiAgICAgICk7XG4gICAgICAvLyBFbnN1cmUgcmVsYXRpdmUgcGF0aHMgc3RhcnQgd2l0aCAuLyBzbyBlc2J1aWxkIHJlc29sdmVzIHRoZW0gY29ycmVjdGx5LlxuICAgICAgLy8gUGF0aHMgbGlrZSBcIi5vdXRwdXQvLi4uXCIgYXJlIG5vdCB2YWxpZCByZWxhdGl2ZSBzcGVjaWZpZXJzIGFuZCBtdXN0XG4gICAgICAvLyBiZWNvbWUgXCIuLy5vdXRwdXQvLi4uXCIuXG4gICAgICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLycpICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgICAgcmVsYXRpdmVQYXRoID0gYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgaW1wb3J0ICcke3JlbGF0aXZlUGF0aH0nO2A7XG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBhIHZpcnR1YWwgZW50cnkgdGhhdCBpbXBvcnRzIGFsbCBmaWxlcy4gQWxsIHN0ZXAgZGVmaW5pdGlvbnNcbiAgICAvLyB3aWxsIGdldCByZWdpc3RlcmVkIHRoYW5rcyB0byB0aGUgc3djIHRyYW5zZm9ybS5cbiAgICAvL1xuICAgIC8vIERlZHVwZSBpbXBvcnRzIGJ5IGNhbm9uaWNhbCBtb2R1bGUgaWRlbnRpdHkgc28gd2UgbmV2ZXIgZW1pdCB0d29cbiAgICAvLyBpbXBvcnQgbGluZXMgdGhhdCByZXNvbHZlIHRvIHRoZSBzYW1lIHBoeXNpY2FsIG1vZHVsZS4gUHJlLXNlZWQgdGhlXG4gICAgLy8gc2V0IHdpdGggdGhlIGJ1aWx0LWluIHN0ZXBzIGltcG9ydCBzbyBhIHdvcmtzcGFjZSBzdGVwIGZpbGUgYXRcbiAgICAvLyBgcGFja2FnZXMvd29ya2Zsb3cvc3JjL2ludGVybmFsL2J1aWx0aW5zLnRzYCBkb2Vzbid0IGVtaXQgYSBzZWNvbmQsXG4gICAgLy8gcmVsYXRpdmUtcGF0aCBjb21wZXRpbmcgaW1wb3J0IOKAlCBlc2J1aWxkIHdvdWxkIG90aGVyd2lzZSB0cmFuc2Zvcm1cbiAgICAvLyBib3RoIGNvcGllcyBhbmQgdGhlIHN3YyBwbHVnaW4gd291bGQgZ2VuZXJhdGUgZHVwbGljYXRlIHN0ZXAgSURzLlxuICAgIGNvbnN0IGVtaXR0ZWRJbXBvcnRJZGVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KFtidWlsdEluU3RlcHNdKTtcbiAgICBjb25zdCBidWlsZEltcG9ydHMgPSAoZmlsZXM6IHN0cmluZ1tdKTogc3RyaW5nID0+XG4gICAgICBmaWxlc1xuICAgICAgICAuZmlsdGVyKChmaWxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWRlbnRpdHkgPSBtb2R1bGVJZGVudGl0eUtleShmaWxlLCB0aGlzLm1vZHVsZVNwZWNpZmllclJvb3QpO1xuICAgICAgICAgIGlmIChlbWl0dGVkSW1wb3J0SWRlbnRpdGllcy5oYXMoaWRlbnRpdHkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgZW1pdHRlZEltcG9ydElkZW50aXRpZXMuYWRkKGlkZW50aXR5KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcChjcmVhdGVJbXBvcnQpXG4gICAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgIGNvbnN0IHN0ZXBJbXBvcnRzID0gYnVpbGRJbXBvcnRzKHN0ZXBGaWxlcyk7XG5cbiAgICAvLyBJbmNsdWRlIHNlcmRlLW9ubHkgZmlsZXMgZm9yIGNsYXNzIHJlZ2lzdHJhdGlvbiBzaWRlIGVmZmVjdHNcbiAgICBjb25zdCBzZXJkZUltcG9ydHMgPSBidWlsZEltcG9ydHMoc2VyZGVPbmx5RmlsZXMpO1xuXG4gICAgY29uc3QgZW50cnlDb250ZW50ID0gYFxuICAgIC8vIEJ1aWx0IGluIHN0ZXBzXG4gICAgaW1wb3J0ICcke2J1aWx0SW5TdGVwc30nO1xuICAgIC8vIFVzZXIgc3RlcHNcbiAgICAke3N0ZXBJbXBvcnRzfVxuICAgIC8vIFNlcmRlIGZpbGVzIGZvciBjcm9zcy1jb250ZXh0IGNsYXNzIHJlZ2lzdHJhdGlvblxuICAgICR7c2VyZGVJbXBvcnRzfVxuICAgIC8vIFNlbnRpbmVsIGV4cG9ydCBzbyBidW5kbGVycyAocm9sbHVwKSBkb24ndCB0cmVlLXNoYWtlIHRoaXMgbW9kdWxlXG4gICAgLy8gd2hlbiBpdCdzIGltcG9ydGVkIGFzIGEgc2lkZS1lZmZlY3Qtb25seSBkZXBlbmRlbmN5LlxuICAgIGV4cG9ydCBjb25zdCBfX3N0ZXBzX3JlZ2lzdGVyZWQgPSB0cnVlO2A7XG5cbiAgICAvLyBCdW5kbGUgd2l0aCBlc2J1aWxkIGFuZCBvdXIgY3VzdG9tIFNXQyBwbHVnaW5cbiAgICBjb25zdCBlbnRyaWVzVG9CdW5kbGUgPSBleHRlcm5hbGl6ZU5vblN0ZXBzXG4gICAgICA/IFtcbiAgICAgICAgICAuLi5zdGVwRmlsZXMsXG4gICAgICAgICAgLi4uc2VyZGVGaWxlcyxcbiAgICAgICAgICAuLi4ocmVzb2x2ZWRCdWlsdEluU3RlcHMgPyBbcmVzb2x2ZWRCdWlsdEluU3RlcHNdIDogW10pLFxuICAgICAgICBdXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBub3JtYWxpemVkRW50cmllc1RvQnVuZGxlID0gZW50cmllc1RvQnVuZGxlXG4gICAgICA/IGF3YWl0IHdpdGhSZWFscGF0aHMoZW50cmllc1RvQnVuZGxlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNpZGVFZmZlY3RFbnRyaWVzID0gYXdhaXQgd2l0aFJlYWxwYXRocyhbXG4gICAgICAuLi5zdGVwRmlsZXMsXG4gICAgICAuLi5zZXJkZU9ubHlGaWxlcyxcbiAgICAgIC4uLihyZXNvbHZlZEJ1aWx0SW5TdGVwcyA/IFtyZXNvbHZlZEJ1aWx0SW5TdGVwc10gOiBbXSksXG4gICAgXSk7XG4gICAgY29uc3QgZXNidWlsZFRzY29uZmlnT3B0aW9ucyA9XG4gICAgICBhd2FpdCBnZXRFc2J1aWxkVHNjb25maWdPcHRpb25zKHRzY29uZmlnUGF0aCk7XG4gICAgY29uc3QgeyBiYW5uZXI6IGltcG9ydE1ldGFCYW5uZXIsIGRlZmluZTogaW1wb3J0TWV0YURlZmluZSB9ID1cbiAgICAgIHRoaXMuZ2V0Q2pzSW1wb3J0TWV0YVBvbHlmaWxsKGZvcm1hdCk7XG4gICAgY29uc3QgZXNtUmVxdWlyZUJhbm5lciA9IHNraXBFc21SZXF1aXJlQmFubmVyXG4gICAgICA/ICcnXG4gICAgICA6IHRoaXMuZ2V0RXNtUmVxdWlyZUJhbm5lcihmb3JtYXQpO1xuXG4gICAgY29uc3QgZXNidWlsZEN0eCA9IGF3YWl0IGVzYnVpbGQuY29udGV4dCh7XG4gICAgICBiYW5uZXI6IHtcbiAgICAgICAganM6IGAvLyBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZCBmaWxlXFxuLyogZXNsaW50LWRpc2FibGUgKi9cXG4ke2ltcG9ydE1ldGFCYW5uZXJ9JHtlc21SZXF1aXJlQmFubmVyfWAsXG4gICAgICB9LFxuICAgICAgc3RkaW46IHtcbiAgICAgICAgY29udGVudHM6IGVudHJ5Q29udGVudCxcbiAgICAgICAgcmVzb2x2ZURpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgc291cmNlZmlsZTogJ3ZpcnR1YWwtZW50cnkuanMnLFxuICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICB9LFxuICAgICAgb3V0ZmlsZSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IHRoaXMuY29uZmlnLndvcmtpbmdEaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgY29uZGl0aW9uczogWydub2RlJ10sXG4gICAgICB0YXJnZXQ6ICdlczIwMjInLFxuICAgICAgd3JpdGU6IHRydWUsXG4gICAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICAgIGtlZXBOYW1lczogdHJ1ZSxcbiAgICAgIG1pbmlmeTogZmFsc2UsXG4gICAgICBqc3g6ICdwcmVzZXJ2ZScsXG4gICAgICBsb2dMZXZlbDogJ2Vycm9yJyxcbiAgICAgIC8vIFVzZSB0c2NvbmZpZyBmb3IgcGF0aCBhbGlhcyByZXNvbHV0aW9uLlxuICAgICAgLy8gRm9yIHN5bWxpbmtlZCBjb25maWdzIHRoaXMgdXNlcyB0c2NvbmZpZ1JhdyB0byBwcmVzZXJ2ZSBjd2QtcmVsYXRpdmUgYWxpYXNlcy5cbiAgICAgIC4uLmVzYnVpbGRUc2NvbmZpZ09wdGlvbnMsXG4gICAgICBkZWZpbmU6IGltcG9ydE1ldGFEZWZpbmUsXG4gICAgICByZXNvbHZlRXh0ZW5zaW9uczogW1xuICAgICAgICAnLnRzJyxcbiAgICAgICAgJy50c3gnLFxuICAgICAgICAnLm10cycsXG4gICAgICAgICcuY3RzJyxcbiAgICAgICAgJy5qcycsXG4gICAgICAgICcuanN4JyxcbiAgICAgICAgJy5tanMnLFxuICAgICAgICAnLmNqcycsXG4gICAgICBdLFxuICAgICAgLy8gU291cmNlIG1hcHMgZm9yIGJldHRlciBzdGFjayB0cmFjZXMgaW4gc3RlcCBleGVjdXRpb24uIFN0ZXBzIGV4ZWN1dGVcbiAgICAgIC8vIGluIE5vZGUuanMgY29udGV4dCBhbmQgaW5saW5lIHNvdXJjZW1hcHMgZ2l2ZSBtZWFuaW5nZnVsIHN0YWNrIHRyYWNlc1xuICAgICAgLy8gd2l0aCBwcm9wZXIgZmlsZSBuYW1lcyBhbmQgbGluZSBudW1iZXJzIHdoZW4gZXJyb3JzIG9jY3VyIGluIGRlZXBseVxuICAgICAgLy8gbmVzdGVkIGZ1bmN0aW9uIGNhbGxzIGFjcm9zcyBtdWx0aXBsZSBmaWxlcy4gRGVmYXVsdHMgdG8gaW5saW5lIGluXG4gICAgICAvLyBkZXZlbG9wbWVudCBhbmQgb2ZmIGluIHByb2R1Y3Rpb24gKHNlZSBgZGVmYXVsdFNvdXJjZW1hcE1vZGVgKSB0byBrZWVwXG4gICAgICAvLyBwcm9kdWN0aW9uIGZ1bmN0aW9uIGJ1bmRsZXMgc21hbGw7IG92ZXJyaWRlIHdpdGggdGhlIGBzb3VyY2VtYXBgXG4gICAgICAvLyBjb25maWcgb3B0aW9uIG9yIHRoZSBgV09SS0ZMT1dfU09VUkNFTUFQYCBlbnYgdmFyLlxuICAgICAgc291cmNlbWFwOiB0aGlzLnJlc29sdmVTb3VyY2VtYXAodGhpcy5kZWZhdWx0U291cmNlbWFwTW9kZSksXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIC8vIEhhbmRsZSBwc2V1ZG8tcGFja2FnZXMgbGlrZSAnc2VydmVyLW9ubHknIGFuZCAnY2xpZW50LW9ubHknIGJ5IHByb3ZpZGluZ1xuICAgICAgICAvLyBlbXB0eSBtb2R1bGVzLiBNdXN0IHJ1biBmaXJzdCB0byBpbnRlcmNlcHQgdGhlc2UgYmVmb3JlIG90aGVyIHJlc29sdXRpb24uXG4gICAgICAgIGNyZWF0ZVBzZXVkb1BhY2thZ2VQbHVnaW4oKSxcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgZW50cmllc1RvQnVuZGxlOiBub3JtYWxpemVkRW50cmllc1RvQnVuZGxlLFxuICAgICAgICAgIG91dGRpcjogb3V0ZmlsZSA/IGRpcm5hbWUob3V0ZmlsZSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgcHJvamVjdFJvb3Q6IHRoaXMudHJhbnNmb3JtUHJvamVjdFJvb3QsXG4gICAgICAgICAgbW9kdWxlU3BlY2lmaWVyUm9vdDogdGhpcy5tb2R1bGVTcGVjaWZpZXJSb290LFxuICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3QsXG4gICAgICAgICAgYnVuZGxlVHJhbnNpdGl2ZUxvY2FsU3RlcERlcGVuZGVuY2llcyxcbiAgICAgICAgICByZXdyaXRlVHNFeHRlbnNpb25zLFxuICAgICAgICAgIHNpZGVFZmZlY3RFbnRyaWVzOiBub3JtYWxpemVkU2lkZUVmZmVjdEVudHJpZXMsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICAgIC8vIFBsdWdpbiBzaG91bGQgY2F0Y2ggbW9zdCB0aGluZ3MsIGJ1dCB0aGlzIGxldHMgdXNlcnMgaGFyZCBvdmVycmlkZVxuICAgICAgLy8gaWYgdGhlIHBsdWdpbiBtaXNzZXMgYW55dGhpbmcgdGhhdCBzaG91bGQgYmUgZXh0ZXJuYWxpemVkXG4gICAgICBleHRlcm5hbDogWydidW4nLCAnYnVuOionLCAuLi4odGhpcy5jb25maWcuZXh0ZXJuYWxQYWNrYWdlcyB8fCBbXSldLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3RlcHNSZXN1bHQgPSBhd2FpdCBlc2J1aWxkQ3R4LnJlYnVpbGQoKTtcblxuICAgIHRoaXMubG9nRXNidWlsZE1lc3NhZ2VzKHN0ZXBzUmVzdWx0LCAnc3RlcHMgYnVuZGxlIGNyZWF0aW9uJyk7XG4gICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oXG4gICAgICAnQ3JlYXRlZCBzdGVwcyBidW5kbGUnLFxuICAgICAgYCR7RGF0ZS5ub3coKSAtIHN0ZXBzQnVuZGxlU3RhcnR9bXNgXG4gICAgKTtcblxuICAgIC8vIEhhbmRsZSB3b3JrZmxvdy1vbmx5IGZpbGVzIHRoYXQgbWF5IGhhdmUgYmVlbiB0cmVlLXNoYWtlbiBmcm9tIHRoZSBidW5kbGUuXG4gICAgLy8gVGhlc2UgZmlsZXMgaGF2ZSBubyBzdGVwcywgc28gZXNidWlsZCByZW1vdmVzIHRoZW0sIGJ1dCB3ZSBzdGlsbCBuZWVkIHRoZWlyXG4gICAgLy8gd29ya2Zsb3cgbWV0YWRhdGEgZm9yIHRoZSBtYW5pZmVzdC4gVHJhbnNmb3JtIHRoZW0gc2VwYXJhdGVseS5cbiAgICBjb25zdCB3b3JrZmxvd09ubHlGaWxlcyA9IHdvcmtmbG93RmlsZXMuZmlsdGVyKFxuICAgICAgKGYpID0+ICFzdGVwRmlsZXMuaW5jbHVkZXMoZilcbiAgICApO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgd29ya2Zsb3dPbmx5RmlsZXMubWFwKGFzeW5jICh3b3JrZmxvd0ZpbGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZWFkRmlsZSh3b3JrZmxvd0ZpbGUsICd1dGY4Jyk7XG4gICAgICAgICAgY29uc3QgcmVsYXRpdmVGaWxlcGF0aCA9IHRoaXMuZ2V0UmVsYXRpdmVGaWxlcGF0aCh3b3JrZmxvd0ZpbGUpO1xuICAgICAgICAgIGNvbnN0IHsgd29ya2Zsb3dNYW5pZmVzdDogZmlsZU1hbmlmZXN0IH0gPSBhd2FpdCBhcHBseVN3Y1RyYW5zZm9ybShcbiAgICAgICAgICAgIHJlbGF0aXZlRmlsZXBhdGgsXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAnd29ya2Zsb3cnLFxuICAgICAgICAgICAgd29ya2Zsb3dGaWxlLFxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Qcm9qZWN0Um9vdCxcbiAgICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWVyUm9vdFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGZpbGVNYW5pZmVzdC53b3JrZmxvd3MpIHtcbiAgICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3Qud29ya2Zsb3dzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgd29ya2Zsb3dNYW5pZmVzdC53b3JrZmxvd3MgfHwge30sXG4gICAgICAgICAgICAgIGZpbGVNYW5pZmVzdC53b3JrZmxvd3NcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWxlTWFuaWZlc3QuY2xhc3Nlcykge1xuICAgICAgICAgICAgd29ya2Zsb3dNYW5pZmVzdC5jbGFzc2VzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgd29ya2Zsb3dNYW5pZmVzdC5jbGFzc2VzIHx8IHt9LFxuICAgICAgICAgICAgICBmaWxlTWFuaWZlc3QuY2xhc3Nlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gTG9nIHdhcm5pbmcgYnV0IGNvbnRpbnVlIC0gZG9uJ3QgZmFpbCBidWlsZCBmb3Igd29ya2Zsb3ctb25seSBmaWxlIGlzc3Vlc1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBXYXJuaW5nOiBGYWlsZWQgdG8gZXh0cmFjdCB3b3JrZmxvdyBtZXRhZGF0YSBmcm9tICR7d29ya2Zsb3dGaWxlfTpgLFxuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTd2NJZ25vcmVkKCk7XG5cbiAgICBpZiAodGhpcy5jb25maWcud2F0Y2gpIHtcbiAgICAgIHJldHVybiB7IGNvbnRleHQ6IGVzYnVpbGRDdHgsIG1hbmlmZXN0OiB3b3JrZmxvd01hbmlmZXN0IH07XG4gICAgfVxuICAgIGF3YWl0IGVzYnVpbGRDdHguZGlzcG9zZSgpO1xuICAgIHJldHVybiB7IGNvbnRleHQ6IHVuZGVmaW5lZCwgbWFuaWZlc3Q6IHdvcmtmbG93TWFuaWZlc3QgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYnVuZGxlIGZvciB3b3JrZmxvdyBvcmNoZXN0cmF0aW9uIGZ1bmN0aW9ucy5cbiAgICogV29ya2Zsb3dzIHJ1biBpbiBhIHNhbmRib3hlZCBWTSBhbmQgY29vcmRpbmF0ZSBzdGVwIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGJ1bmRsZUZpbmFsT3V0cHV0IC0gSWYgZmFsc2UsIHNraXBzIHRoZSBmaW5hbCBidW5kbGluZyBzdGVwICh1c2VkIGJ5IE5leHQuanMpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlV29ya2Zsb3dzQnVuZGxlKHtcbiAgICBpbnB1dEZpbGVzLFxuICAgIGZvcm1hdCA9ICdlc20nLFxuICAgIG91dGZpbGUsXG4gICAgYnVuZGxlRmluYWxPdXRwdXQgPSB0cnVlLFxuICAgIGtlZXBJbnRlcmltQnVuZGxlQ29udGV4dCA9IHRoaXMuY29uZmlnLndhdGNoLFxuICAgIHRzY29uZmlnUGF0aCxcbiAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgfToge1xuICAgIHRzY29uZmlnUGF0aD86IHN0cmluZztcbiAgICBpbnB1dEZpbGVzOiBzdHJpbmdbXTtcbiAgICBvdXRmaWxlOiBzdHJpbmc7XG4gICAgZm9ybWF0PzogJ2NqcycgfCAnZXNtJztcbiAgICBidW5kbGVGaW5hbE91dHB1dD86IGJvb2xlYW47XG4gICAga2VlcEludGVyaW1CdW5kbGVDb250ZXh0PzogYm9vbGVhbjtcbiAgICBkaXNjb3ZlcmVkRW50cmllcz86IERpc2NvdmVyZWRFbnRyaWVzO1xuICB9KTogUHJvbWlzZTx7XG4gICAgbWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3Q7XG4gICAgaW50ZXJpbUJ1bmRsZUN0eD86IGVzYnVpbGQuQnVpbGRDb250ZXh0O1xuICAgIGJ1bmRsZUZpbmFsPzogKGludGVyaW1CdW5kbGVSZXN1bHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICAvKiogVGhlIHJhdyB3b3JrZmxvdyBWTSBjb2RlIChiZWZvcmUgd3JhcHBpbmcgd2l0aCBlbnRyeXBvaW50KSAqL1xuICAgIGludGVyaW1CdW5kbGVUZXh0Pzogc3RyaW5nO1xuICB9PiB7XG4gICAgY29uc3QgZGlzY292ZXJlZCA9XG4gICAgICBkaXNjb3ZlcmVkRW50cmllcyA/P1xuICAgICAgKGF3YWl0IHRoaXMuZGlzY292ZXJFbnRyaWVzKGlucHV0RmlsZXMsIGRpcm5hbWUob3V0ZmlsZSksIHRzY29uZmlnUGF0aCkpO1xuICAgIGNvbnN0IHdvcmtmbG93RmlsZXMgPSBbLi4uZGlzY292ZXJlZC5kaXNjb3ZlcmVkV29ya2Zsb3dzXS5zb3J0KCk7XG4gICAgY29uc3Qgc2VyZGVGaWxlcyA9IFsuLi5kaXNjb3ZlcmVkLmRpc2NvdmVyZWRTZXJkZUZpbGVzXS5zb3J0KCk7XG5cbiAgICAvLyBJbmNsdWRlIHNlcmRlIGZpbGVzIHRoYXQgYXJlbid0IGFscmVhZHkgd29ya2Zsb3cgZmlsZXMgZm9yIGNyb3NzLWNvbnRleHQgY2xhc3MgcmVnaXN0cmF0aW9uLlxuICAgIC8vIENsYXNzZXMgbmVlZCB0byBiZSByZWdpc3RlcmVkIGluIHRoZSB3b3JrZmxvdyBidW5kbGUgc28gdGhleSBjYW4gYmUgZGVzZXJpYWxpemVkXG4gICAgLy8gd2hlbiByZWNlaXZpbmcgZGF0YSBmcm9tIHN0ZXBzIG9yIHdoZW4gc2VyaWFsaXppbmcgZGF0YSB0byBzZW5kIHRvIHN0ZXBzLlxuICAgIGNvbnN0IHdvcmtmbG93RmlsZXNTZXQgPSBuZXcgU2V0KHdvcmtmbG93RmlsZXMpO1xuICAgIGNvbnN0IHNlcmRlT25seUZpbGVzID0gc2VyZGVGaWxlcy5maWx0ZXIoKGYpID0+ICF3b3JrZmxvd0ZpbGVzU2V0LmhhcyhmKSk7XG5cbiAgICAvLyBsb2cgdGhlIHdvcmtmbG93IGZpbGVzIGZvciBkZWJ1Z2dpbmdcbiAgICBhd2FpdCB0aGlzLndyaXRlRGVidWdGaWxlKG91dGZpbGUsIHsgd29ya2Zsb3dGaWxlcywgc2VyZGVPbmx5RmlsZXMgfSk7XG5cbiAgICAvLyBIZWxwZXIgdG8gY3JlYXRlIGltcG9ydCBzdGF0ZW1lbnQgZnJvbSBmaWxlIHBhdGhcbiAgICAvLyBGb3IgcGFja2FnZXMsIHVzZXMgdGhlIHBhY2thZ2UgbmFtZSBzbyBlc2J1aWxkIHdpbGwgcmVzb2x2ZSB0aHJvdWdoXG4gICAgLy8gcGFja2FnZS5qc29uIGV4cG9ydHMgd2l0aCBjb25kaXRpb25zOiBbJ3dvcmtmbG93J11cbiAgICBjb25zdCBjcmVhdGVJbXBvcnQgPSAoZmlsZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IGltcG9ydFBhdGgsIGlzUGFja2FnZSB9ID0gZ2V0SW1wb3J0UGF0aChcbiAgICAgICAgZmlsZSxcbiAgICAgICAgdGhpcy5jb25maWcud29ya2luZ0RpclxuICAgICAgKTtcblxuICAgICAgaWYgKGlzUGFja2FnZSkge1xuICAgICAgICAvLyBVc2UgcGFja2FnZSBuYW1lIC0gZXNidWlsZCB3aWxsIHJlc29sdmUgdmlhIHBhY2thZ2UuanNvbiBleHBvcnRzXG4gICAgICAgIC8vIGFuZCBhcHBseSB0aGUgJ3dvcmtmbG93JyBjb25kaXRpb25cbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgJyR7aW1wb3J0UGF0aH0nO2A7XG4gICAgICB9XG5cbiAgICAgIC8vIExvY2FsIGFwcCBmaWxlIC0gdXNlIHJlbGF0aXZlIHBhdGhcbiAgICAgIC8vIE5vcm1hbGl6ZSBib3RoIHBhdGhzIHRvIGZvcndhcmQgc2xhc2hlcyBiZWZvcmUgY2FsbGluZyByZWxhdGl2ZSgpXG4gICAgICAvLyBUaGlzIGlzIGNyaXRpY2FsIG9uIFdpbmRvd3Mgd2hlcmUgcmVsYXRpdmUoKSBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMgd2l0aCBtaXhlZCBwYXRoIGZvcm1hdHNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICBjb25zdCBub3JtYWxpemVkRmlsZSA9IGZpbGUucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgLy8gQ2FsY3VsYXRlIHJlbGF0aXZlIHBhdGggZnJvbSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgZmlsZVxuICAgICAgbGV0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlKG5vcm1hbGl6ZWRXb3JraW5nRGlyLCBub3JtYWxpemVkRmlsZSkucmVwbGFjZShcbiAgICAgICAgL1xcXFwvZyxcbiAgICAgICAgJy8nXG4gICAgICApO1xuICAgICAgLy8gRW5zdXJlIHJlbGF0aXZlIHBhdGhzIHN0YXJ0IHdpdGggLi8gc28gZXNidWlsZCByZXNvbHZlcyB0aGVtIGNvcnJlY3RseS5cbiAgICAgIC8vIFBhdGhzIGxpa2UgXCIub3V0cHV0Ly4uLlwiIGFyZSBub3QgdmFsaWQgcmVsYXRpdmUgc3BlY2lmaWVycyBhbmQgbXVzdFxuICAgICAgLy8gYmVjb21lIFwiLi8ub3V0cHV0Ly4uLlwiLlxuICAgICAgaWYgKCFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi8nKSAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYGltcG9ydCAnJHtyZWxhdGl2ZVBhdGh9JztgO1xuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYSB2aXJ0dWFsIGVudHJ5IHRoYXQgaW1wb3J0cyBhbGwgd29ya2Zsb3cgZmlsZXMuIERlZHVwZSBieVxuICAgIC8vIGNhbm9uaWNhbCBtb2R1bGUgaWRlbnRpdHkgc28gc291cmNlL2Rpc3QgY29waWVzIG9mIHRoZSBzYW1lIHdvcmtzcGFjZVxuICAgIC8vIHBhY2thZ2UgZXhwb3J0IGRvbid0IGJvdGggZ2V0IGltcG9ydGVkICh3aGljaCB3b3VsZCBtYWtlIHRoZSBzd2NcbiAgICAvLyBwbHVnaW4gZ2VuZXJhdGUgZHVwbGljYXRlIHdvcmtmbG93IElEcykuXG4gICAgY29uc3QgZW1pdHRlZEltcG9ydElkZW50aXRpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBidWlsZEltcG9ydHMgPSAoZmlsZXM6IHN0cmluZ1tdKTogc3RyaW5nID0+XG4gICAgICBmaWxlc1xuICAgICAgICAuZmlsdGVyKChmaWxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWRlbnRpdHkgPSBtb2R1bGVJZGVudGl0eUtleShmaWxlLCB0aGlzLm1vZHVsZVNwZWNpZmllclJvb3QpO1xuICAgICAgICAgIGlmIChlbWl0dGVkSW1wb3J0SWRlbnRpdGllcy5oYXMoaWRlbnRpdHkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgZW1pdHRlZEltcG9ydElkZW50aXRpZXMuYWRkKGlkZW50aXR5KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcChjcmVhdGVJbXBvcnQpXG4gICAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgIC8vIFRoZSBTV0MgcGx1Z2luIGluIHdvcmtmbG93IG1vZGUgZW1pdHMgYGdsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93cy5zZXQod29ya2Zsb3dJZCwgZm4pYFxuICAgIC8vIGNhbGxzIGRpcmVjdGx5LCBzbyB3ZSBqdXN0IG5lZWQgdG8gaW1wb3J0IHRoZSBmaWxlcyAoTWFwIGlzIGluaXRpYWxpemVkIHZpYSBiYW5uZXIpXG4gICAgY29uc3Qgd29ya2Zsb3dJbXBvcnRzID0gYnVpbGRJbXBvcnRzKHdvcmtmbG93RmlsZXMpO1xuXG4gICAgLy8gSW5jbHVkZSBzZXJkZS1vbmx5IGZpbGVzIGZvciBjbGFzcyByZWdpc3RyYXRpb24gc2lkZSBlZmZlY3RzXG4gICAgY29uc3Qgc2VyZGVJbXBvcnRzID0gYnVpbGRJbXBvcnRzKHNlcmRlT25seUZpbGVzKTtcblxuICAgIGNvbnN0IGltcG9ydHMgPSBzZXJkZUltcG9ydHNcbiAgICAgID8gYCR7d29ya2Zsb3dJbXBvcnRzfVxcbi8vIFNlcmRlIGZpbGVzIGZvciBjcm9zcy1jb250ZXh0IGNsYXNzIHJlZ2lzdHJhdGlvblxcbiR7c2VyZGVJbXBvcnRzfWBcbiAgICAgIDogd29ya2Zsb3dJbXBvcnRzO1xuXG4gICAgY29uc3QgYnVuZGxlU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB3b3JrZmxvd01hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0ID0ge307XG4gICAgY29uc3QgZXNidWlsZFRzY29uZmlnT3B0aW9ucyA9XG4gICAgICBhd2FpdCBnZXRFc2J1aWxkVHNjb25maWdPcHRpb25zKHRzY29uZmlnUGF0aCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFdvcmtmbG93U2lkZUVmZmVjdEVudHJpZXMgPSBhd2FpdCB3aXRoUmVhbHBhdGhzKFtcbiAgICAgIC4uLndvcmtmbG93RmlsZXMsXG4gICAgICAuLi5zZXJkZU9ubHlGaWxlcyxcbiAgICBdKTtcblxuICAgIC8vIEJ1bmRsZSB3aXRoIGVzYnVpbGQgYW5kIG91ciBjdXN0b20gU1dDIHBsdWdpbiBpbiB3b3JrZmxvdyBtb2RlLlxuICAgIC8vIHRoaXMgYnVuZGxlIHdpbGwgYmUgcnVuIGluc2lkZSBhIHZtIGlzb2xhdGVcbiAgICBjb25zdCBpbnRlcmltQnVuZGxlQ3R4ID0gYXdhaXQgZXNidWlsZC5jb250ZXh0KHtcbiAgICAgIHN0ZGluOiB7XG4gICAgICAgIGNvbnRlbnRzOiBpbXBvcnRzLFxuICAgICAgICByZXNvbHZlRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICBzb3VyY2VmaWxlOiAndmlydHVhbC1lbnRyeS5qcycsXG4gICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgIH0sXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBhYnNXb3JraW5nRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgZm9ybWF0OiAnY2pzJywgLy8gUnVucyBpbnNpZGUgdGhlIFZNIHdoaWNoIGV4cGVjdHMgY2pzXG4gICAgICBwbGF0Zm9ybTogJ25ldXRyYWwnLCAvLyBUaGUgcGxhdGZvcm0gaXMgbmVpdGhlciBub2RlIG5vciBicm93c2VyXG4gICAgICBtYWluRmllbGRzOiBbJ21vZHVsZScsICdtYWluJ10sIC8vIFRvIHN1cHBvcnQgbnBtIHN0eWxlIGltcG9ydHNcbiAgICAgIGNvbmRpdGlvbnM6IFsnd29ya2Zsb3cnXSwgLy8gQWxsb3cgcGFja2FnZXMgdG8gZXhwb3J0ICd3b3JrZmxvdycgY29tcGxpYW50IHZlcnNpb25zXG4gICAgICB0YXJnZXQ6ICdlczIwMjInLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgICBrZWVwTmFtZXM6IHRydWUsXG4gICAgICBtaW5pZnk6IGZhbHNlLFxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgd29ya2Zsb3cgcmVnaXN0cnkgYXQgdGhlIHZlcnkgdG9wIG9mIHRoZSBidW5kbGVcbiAgICAgIC8vIFRoaXMgbXVzdCBiZSBpbiBiYW5uZXIgKG5vdCB0aGUgdmlydHVhbCBlbnRyeSkgYmVjYXVzZSBlc2J1aWxkJ3MgYnVuZGxpbmdcbiAgICAgIC8vIGNhbiByZW9yZGVyIGNvZGUsIGFuZCB0aGUgLnNldCgpIGNhbGxzIG5lZWQgdGhlIE1hcCB0byBleGlzdCBmaXJzdFxuICAgICAgYmFubmVyOiB7XG4gICAgICAgIGpzOiAnZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzID0gbmV3IE1hcCgpOycsXG4gICAgICB9LFxuICAgICAgLy8gU291cmNlIG1hcHMgZm9yIGJldHRlciBzdGFjayB0cmFjZXMgaW4gd29ya2Zsb3cgVk0gZXhlY3V0aW9uLiBUaGlzXG4gICAgICAvLyBpbnRlcm1lZGlhdGUgYnVuZGxlIGlzIGV4ZWN1dGVkIHZpYSBydW5JbkNvbnRleHQoKSBpbiBhIFZNLCBzbyBpbmxpbmVcbiAgICAgIC8vIHNvdXJjZSBtYXBzIGdpdmUgbWVhbmluZ2Z1bCBzdGFjayB0cmFjZXMgaW5zdGVhZCBvZlxuICAgICAgLy8gXCJldmFsbWFjaGluZS48YW5vbnltb3VzPlwiLiBEZWZhdWx0cyB0byBpbmxpbmUgaW4gZGV2ZWxvcG1lbnQgYW5kIG9mZiBpblxuICAgICAgLy8gcHJvZHVjdGlvbiAoc2VlIGBkZWZhdWx0U291cmNlbWFwTW9kZWApIHRvIGtlZXAgcHJvZHVjdGlvbiBmdW5jdGlvblxuICAgICAgLy8gYnVuZGxlcyBzbWFsbDsgb3ZlcnJpZGUgd2l0aCB0aGUgYHNvdXJjZW1hcGAgY29uZmlnIG9wdGlvbiBvciB0aGVcbiAgICAgIC8vIGBXT1JLRkxPV19TT1VSQ0VNQVBgIGVudiB2YXIuIFRoZSBydW50aW1lIHJlbWFwcyBzdGFja3Mgb25seSB3aGVuIGFcbiAgICAgIC8vIG1hcCBpcyBwcmVzZW50LCBzbyBkaXNhYmxpbmcgbWFwcyBkZWdyYWRlcyBncmFjZWZ1bGx5LlxuICAgICAgc291cmNlbWFwOiB0aGlzLnJlc29sdmVTb3VyY2VtYXAodGhpcy5kZWZhdWx0U291cmNlbWFwTW9kZSksXG4gICAgICAvLyBVc2UgdHNjb25maWcgZm9yIHBhdGggYWxpYXMgcmVzb2x1dGlvbi5cbiAgICAgIC8vIEZvciBzeW1saW5rZWQgY29uZmlncyB0aGlzIHVzZXMgdHNjb25maWdSYXcgdG8gcHJlc2VydmUgY3dkLXJlbGF0aXZlIGFsaWFzZXMuXG4gICAgICAuLi5lc2J1aWxkVHNjb25maWdPcHRpb25zLFxuICAgICAgcmVzb2x2ZUV4dGVuc2lvbnM6IFtcbiAgICAgICAgJy50cycsXG4gICAgICAgICcudHN4JyxcbiAgICAgICAgJy5tdHMnLFxuICAgICAgICAnLmN0cycsXG4gICAgICAgICcuanMnLFxuICAgICAgICAnLmpzeCcsXG4gICAgICAgICcubWpzJyxcbiAgICAgICAgJy5janMnLFxuICAgICAgXSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgLy8gSGFuZGxlIHBzZXVkby1wYWNrYWdlcyBsaWtlICdzZXJ2ZXItb25seScgYW5kICdjbGllbnQtb25seScgYnkgcHJvdmlkaW5nXG4gICAgICAgIC8vIGVtcHR5IG1vZHVsZXMuIE11c3QgcnVuIGZpcnN0IHRvIGludGVyY2VwdCB0aGVzZSBiZWZvcmUgb3RoZXIgcmVzb2x1dGlvbi5cbiAgICAgICAgY3JlYXRlUHNldWRvUGFja2FnZVBsdWdpbigpLFxuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICd3b3JrZmxvdycsXG4gICAgICAgICAgcHJvamVjdFJvb3Q6IHRoaXMudHJhbnNmb3JtUHJvamVjdFJvb3QsXG4gICAgICAgICAgbW9kdWxlU3BlY2lmaWVyUm9vdDogdGhpcy5tb2R1bGVTcGVjaWZpZXJSb290LFxuICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3QsXG4gICAgICAgICAgc2lkZUVmZmVjdEVudHJpZXM6IG5vcm1hbGl6ZWRXb3JrZmxvd1NpZGVFZmZlY3RFbnRyaWVzLFxuICAgICAgICB9KSxcbiAgICAgICAgLy8gVGhpcyBwbHVnaW4gbXVzdCBydW4gYWZ0ZXIgdGhlIHN3YyBwbHVnaW4gdG8gZW5zdXJlIGRlYWQgY29kZSBlbGltaW5hdGlvblxuICAgICAgICAvLyBoYXBwZW5zIGZpcnN0LCBwcmV2ZW50aW5nIGZhbHNlIHBvc2l0aXZlcyBvbiBOb2RlLmpzIGltcG9ydHMgaW4gdW51c2VkIGNvZGUgcGF0aHNcbiAgICAgICAgY3JlYXRlTm9kZU1vZHVsZUVycm9yUGx1Z2luKCksXG4gICAgICBdLFxuICAgICAgLy8gTk9URTogV2UgaW50ZW50aW9uYWxseSBkbyBOT1QgdXNlIHRoZSBleHRlcm5hbCBvcHRpb24gaGVyZSBmb3Igd29ya2Zsb3cgYnVuZGxlcy5cbiAgICAgIC8vIFdoZW4gcGFja2FnZXMgYXJlIG1hcmtlZCBleHRlcm5hbCB3aXRoIGZvcm1hdDogJ2NqcycsIGVzYnVpbGQgZ2VuZXJhdGVzIHJlcXVpcmUoKSBjYWxscy5cbiAgICAgIC8vIEhvd2V2ZXIsIHRoZSB3b3JrZmxvdyBWTSAodm0ucnVuSW5Db250ZXh0KSBkb2VzIG5vdCBoYXZlIHJlcXVpcmUoKSBkZWZpbmVkIC0gaXQgb25seVxuICAgICAgLy8gcHJvdmlkZXMgbW9kdWxlLmV4cG9ydHMgYW5kIGV4cG9ydHMuIEV4dGVybmFsIHBhY2thZ2VzIHdvdWxkIGZhaWwgYXQgcnVudGltZSB3aXRoOlxuICAgICAgLy8gICBSZWZlcmVuY2VFcnJvcjogcmVxdWlyZSBpcyBub3QgZGVmaW5lZFxuICAgICAgLy8gSW5zdGVhZCwgd2UgYnVuZGxlIGV2ZXJ5dGhpbmcgYW5kIHJlbHkgb246XG4gICAgICAvLyAtIGNyZWF0ZVBzZXVkb1BhY2thZ2VQbHVnaW4oKSB0byBoYW5kbGUgc2VydmVyLW9ubHkvY2xpZW50LW9ubHkgd2l0aCBlbXB0eSBtb2R1bGVzXG4gICAgICAvLyAtIGNyZWF0ZU5vZGVNb2R1bGVFcnJvclBsdWdpbigpIHRvIGNhdGNoIE5vZGUuanMgYnVpbHRpbiBpbXBvcnRzIGF0IGJ1aWxkIHRpbWVcbiAgICB9KTtcbiAgICBsZXQgc2hvdWxkRGlzcG9zZUludGVyaW1CdW5kbGVDdHggPSAha2VlcEludGVyaW1CdW5kbGVDb250ZXh0O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbnRlcmltQnVuZGxlID0gYXdhaXQgaW50ZXJpbUJ1bmRsZUN0eC5yZWJ1aWxkKCk7XG5cbiAgICAgIHRoaXMubG9nRXNidWlsZE1lc3NhZ2VzKFxuICAgICAgICBpbnRlcmltQnVuZGxlLFxuICAgICAgICAnaW50ZXJtZWRpYXRlIHdvcmtmbG93IGJ1bmRsZScsXG4gICAgICAgIHRydWUsXG4gICAgICAgIHtcbiAgICAgICAgICBzdXBwcmVzc1dhcm5pbmdzOiB0aGlzLmNvbmZpZy5zdXBwcmVzc0NyZWF0ZVdvcmtmbG93c0J1bmRsZVdhcm5pbmdzLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgdGhpcy5sb2dDcmVhdGVXb3JrZmxvd3NCdW5kbGVJbmZvKFxuICAgICAgICAnQ3JlYXRlZCBpbnRlcm1lZGlhdGUgd29ya2Zsb3cgYnVuZGxlJyxcbiAgICAgICAgYCR7RGF0ZS5ub3coKSAtIGJ1bmRsZVN0YXJ0VGltZX1tc2BcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZy53b3JrZmxvd01hbmlmZXN0UGF0aCkge1xuICAgICAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgdGhpcy5jb25maWcud29ya2Zsb3dNYW5pZmVzdFBhdGhcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IHByZWZpeCA9ICcnO1xuXG4gICAgICAgIGlmIChyZXNvbHZlZFBhdGguZW5kc1dpdGgoJy5janMnKSkge1xuICAgICAgICAgIHByZWZpeCA9ICdtb2R1bGUuZXhwb3J0cyA9ICc7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgcmVzb2x2ZWRQYXRoLmVuZHNXaXRoKCcuanMnKSB8fFxuICAgICAgICAgIHJlc29sdmVkUGF0aC5lbmRzV2l0aCgnLm1qcycpXG4gICAgICAgICkge1xuICAgICAgICAgIHByZWZpeCA9ICdleHBvcnQgZGVmYXVsdCAnO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgbWtkaXIoZGlybmFtZShyZXNvbHZlZFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKFxuICAgICAgICAgIHJlc29sdmVkUGF0aCxcbiAgICAgICAgICBwcmVmaXggKyBKU09OLnN0cmluZ2lmeSh3b3JrZmxvd01hbmlmZXN0LCBudWxsLCAyKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZVN3Y0lnbm9yZWQoKTtcblxuICAgICAgaWYgKFxuICAgICAgICAhaW50ZXJpbUJ1bmRsZS5vdXRwdXRGaWxlcyB8fFxuICAgICAgICBpbnRlcmltQnVuZGxlLm91dHB1dEZpbGVzLmxlbmd0aCA9PT0gMFxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBXb3JrZmxvd0J1aWxkRXJyb3IoJ05vIG91dHB1dCBmaWxlcyBnZW5lcmF0ZWQgZnJvbSBlc2J1aWxkJywge1xuICAgICAgICAgIGhpbnQ6ICdUaGlzIHVzdWFsbHkgaW5kaWNhdGVzIGEgbWlzY29uZmlndXJlZCBlbnRyeSBwb2ludCBvciBhbiBlbXB0eSB3b3JrZmxvdyBkaXJlY3RvcnkuIENoZWNrIHRoYXQgeW91ciB3b3JrZmxvdyBmaWxlcyBjb250YWluIGEgYFwidXNlIHdvcmtmbG93XCJgIG9yIGBcInVzZSBzdGVwXCJgIGRpcmVjdGl2ZS4nLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gU2VyZGUgY29tcGxpYW5jZSB3YXJuaW5nczogY2hlY2sgaWYgd29ya2Zsb3cgYnVuZGxlIGhhcyBOb2RlLmpzIGltcG9ydHNcbiAgICAgIC8vIGFsb25nc2lkZSBzZXJkZS1yZWdpc3RlcmVkIGNsYXNzZXMgKHRoZXNlIHdpbGwgZmFpbCBhdCBydW50aW1lIGluIHRoZSBzYW5kYm94KVxuICAgICAgaWYgKFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0LmNsYXNzZXMgJiZcbiAgICAgICAgT2JqZWN0LmtleXMod29ya2Zsb3dNYW5pZmVzdC5jbGFzc2VzKS5sZW5ndGggPiAwXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgeyBhbmFseXplU2VyZGVDb21wbGlhbmNlIH0gPSBhd2FpdCBpbXBvcnQoJy4vc2VyZGUtY2hlY2tlci5qcycpO1xuICAgICAgICBjb25zdCBidW5kbGVUZXh0ID0gaW50ZXJpbUJ1bmRsZS5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgICAgICBjb25zdCBzZXJkZVJlc3VsdCA9IGFuYWx5emVTZXJkZUNvbXBsaWFuY2Uoe1xuICAgICAgICAgIHNvdXJjZUNvZGU6ICcnLFxuICAgICAgICAgIHdvcmtmbG93Q29kZTogYnVuZGxlVGV4dCxcbiAgICAgICAgICBtYW5pZmVzdDogd29ya2Zsb3dNYW5pZmVzdCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIERlLWR1cGUgd2FybmluZ3M6IGdyb3VwIGlkZW50aWNhbCBpc3N1ZXMgYWNyb3NzIGNsYXNzZXNcbiAgICAgICAgY29uc3QgaXNzdWVzVG9DbGFzc2VzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICAgICAgICBmb3IgKGNvbnN0IGNscyBvZiBzZXJkZVJlc3VsdC5jbGFzc2VzKSB7XG4gICAgICAgICAgaWYgKCFjbHMuY29tcGxpYW50KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlzc3VlIG9mIGNscy5pc3N1ZXMpIHtcbiAgICAgICAgICAgICAgbGV0IGFmZmVjdGVkQ2xhc3NlcyA9IGlzc3Vlc1RvQ2xhc3Nlcy5nZXQoaXNzdWUpO1xuICAgICAgICAgICAgICBpZiAoIWFmZmVjdGVkQ2xhc3Nlcykge1xuICAgICAgICAgICAgICAgIGFmZmVjdGVkQ2xhc3NlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgICAgIGlzc3Vlc1RvQ2xhc3Nlcy5zZXQoaXNzdWUsIGFmZmVjdGVkQ2xhc3Nlcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYWZmZWN0ZWRDbGFzc2VzLmFkZChjbHMuY2xhc3NOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBbaXNzdWUsIGFmZmVjdGVkQ2xhc3Nlc10gb2YgaXNzdWVzVG9DbGFzc2VzKSB7XG4gICAgICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IFsuLi5hZmZlY3RlZENsYXNzZXNdO1xuICAgICAgICAgIGNvbnN0IGNsYXNzTGFiZWwgPVxuICAgICAgICAgICAgY2xhc3NOYW1lcy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgPyBgY2xhc3MgXCIke2NsYXNzTmFtZXNbMF19XCJgXG4gICAgICAgICAgICAgIDogYGNsYXNzZXMgJHtjbGFzc05hbWVzLm1hcCgobmFtZSkgPT4gYFwiJHtuYW1lfVwiYCkuam9pbignLCAnKX1gO1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhg4pqgIFNlcmRlIHdhcm5pbmcgZm9yICR7Y2xhc3NMYWJlbH06IGApICsgaXNzdWVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdvcmtmbG93RW50cnlwb2ludE9wdGlvbnNDb2RlID1cbiAgICAgICAgY3JlYXRlV29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGUoKTtcblxuICAgICAgY29uc3QgYnVuZGxlRmluYWwgPSBhc3luYyAoaW50ZXJpbUJ1bmRsZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmtmbG93QnVuZGxlQ29kZSA9IGludGVyaW1CdW5kbGU7XG5cbiAgICAgICAgY29uc3Qgd29ya2Zsb3dGdW5jdGlvbkNvZGUgPSBgLy8gYmlvbWUtaWdub3JlLWFsbCBsaW50OiBnZW5lcmF0ZWQgZmlsZVxuLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCB7IHdvcmtmbG93RW50cnlwb2ludCB9IGZyb20gJ3dvcmtmbG93L3J1bnRpbWUnO1xuXG5jb25zdCB3b3JrZmxvd0NvZGUgPSBcXGAke3dvcmtmbG93QnVuZGxlQ29kZS5yZXBsYWNlKC9bXFxcXGAkXS9nLCAnXFxcXCQmJyl9XFxgO1xuXG5leHBvcnQgY29uc3QgUE9TVCA9IHdvcmtmbG93RW50cnlwb2ludCh3b3JrZmxvd0NvZGUke3dvcmtmbG93RW50cnlwb2ludE9wdGlvbnNDb2RlfSk7YDtcblxuICAgICAgICAvLyB3ZSBza2lwIHRoZSBmaW5hbCBidW5kbGluZyBzdGVwIGZvciBOZXh0LmpzIHNvIGl0IGNhbiBidW5kbGUgaXRzZWxmXG4gICAgICAgIGlmICghYnVuZGxlRmluYWxPdXRwdXQpIHtcbiAgICAgICAgICBpZiAoIW91dGZpbGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YXJpYW50OiBtaXNzaW5nIG91dGZpbGUgZm9yIHdvcmtmbG93IGJ1bmRsZWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBFbnN1cmUgdGhlIG91dHB1dCBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICAgICAgY29uc3Qgb3V0cHV0RGlyID0gZGlybmFtZShvdXRmaWxlKTtcbiAgICAgICAgICBhd2FpdCBta2RpcihvdXRwdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgICAgICAgYXdhaXQgdGhpcy53cml0ZUdlbmVyYXRlZEZpbGUob3V0ZmlsZSwgd29ya2Zsb3dGdW5jdGlvbkNvZGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1bmRsZVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gTm93IGJ1bmRsZSB0aGlzIHNvIHdlIGNhbiByZXNvbHZlIHRoZSBAd29ya2Zsb3cvY29yZSBkZXBlbmRlbmN5XG4gICAgICAgIC8vIHdlIGNvdWxkIHJlbW92ZSB0aGlzIGlmIHdlIGRvIG5mdCB0cmFjaW5nIG9yIHNpbWlsYXIgaW5zdGVhZFxuICAgICAgICBjb25zdCBmaW5hbEVzbVJlcXVpcmVCYW5uZXIgPSB0aGlzLmdldEVzbVJlcXVpcmVCYW5uZXIoZm9ybWF0KTtcbiAgICAgICAgY29uc3QgZmluYWxXb3JrZmxvd1Jlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgICAgIGJhbm5lcjoge1xuICAgICAgICAgICAganM6IGAvLyBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZCBmaWxlXFxuLyogZXNsaW50LWRpc2FibGUgKi9cXG4ke2ZpbmFsRXNtUmVxdWlyZUJhbm5lcn1gLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RkaW46IHtcbiAgICAgICAgICAgIGNvbnRlbnRzOiB3b3JrZmxvd0Z1bmN0aW9uQ29kZSxcbiAgICAgICAgICAgIHJlc29sdmVEaXI6IHRoaXMuY29uZmlnLndvcmtpbmdEaXIsXG4gICAgICAgICAgICBzb3VyY2VmaWxlOiAndmlydHVhbC1lbnRyeS5qcycsXG4gICAgICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvdXRmaWxlLFxuICAgICAgICAgIC8vIFNvdXJjZSBtYXBzIGZvciB0aGUgZmluYWwgd29ya2Zsb3cgYnVuZGxlIHdyYXBwZXIgKG5vdCBpbXBvcnRhbnQgc2luY2UgdGhpcyBjb2RlXG4gICAgICAgICAgLy8gZG9lc24ndCBydW4gaW4gdGhlIFZNIC0gb25seSB0aGUgaW50ZXJtZWRpYXRlIGJ1bmRsZSBzb3VyY2VtYXAgaXMgcmVsZXZhbnQpXG4gICAgICAgICAgc291cmNlbWFwOiB0aGlzLnJlc29sdmVTb3VyY2VtYXAoRU1JVF9TT1VSQ0VNQVBTX0ZPUl9ERUJVR0dJTkcpLFxuICAgICAgICAgIGFic1dvcmtpbmdEaXI6IHRoaXMuY29uZmlnLndvcmtpbmdEaXIsXG4gICAgICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgICAgIHRhcmdldDogJ2VzMjAyMicsXG4gICAgICAgICAgd3JpdGU6IHRydWUsXG4gICAgICAgICAga2VlcE5hbWVzOiB0cnVlLFxuICAgICAgICAgIG1pbmlmeTogZmFsc2UsXG4gICAgICAgICAgZXh0ZXJuYWw6IFsnQGF3cy1zZGsvY3JlZGVudGlhbC1wcm92aWRlci13ZWItaWRlbnRpdHknXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5sb2dFc2J1aWxkTWVzc2FnZXMoXG4gICAgICAgICAgZmluYWxXb3JrZmxvd1Jlc3VsdCxcbiAgICAgICAgICAnZmluYWwgd29ya2Zsb3cgYnVuZGxlJyxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN1cHByZXNzV2FybmluZ3M6IHRoaXMuY29uZmlnLnN1cHByZXNzQ3JlYXRlV29ya2Zsb3dzQnVuZGxlV2FybmluZ3MsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmxvZ0NyZWF0ZVdvcmtmbG93c0J1bmRsZUluZm8oXG4gICAgICAgICAgJ0NyZWF0ZWQgZmluYWwgd29ya2Zsb3cgYnVuZGxlJyxcbiAgICAgICAgICBgJHtEYXRlLm5vdygpIC0gYnVuZGxlU3RhcnRUaW1lfW1zYFxuICAgICAgICApO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGludGVyaW1CdW5kbGVUZXh0ID0gaW50ZXJpbUJ1bmRsZS5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgICAgYXdhaXQgYnVuZGxlRmluYWwoaW50ZXJpbUJ1bmRsZVRleHQpO1xuXG4gICAgICBpZiAoa2VlcEludGVyaW1CdW5kbGVDb250ZXh0KSB7XG4gICAgICAgIHNob3VsZERpc3Bvc2VJbnRlcmltQnVuZGxlQ3R4ID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbWFuaWZlc3Q6IHdvcmtmbG93TWFuaWZlc3QsXG4gICAgICAgICAgaW50ZXJpbUJ1bmRsZUN0eCxcbiAgICAgICAgICBidW5kbGVGaW5hbCxcbiAgICAgICAgICBpbnRlcmltQnVuZGxlVGV4dCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG1hbmlmZXN0OiB3b3JrZmxvd01hbmlmZXN0LCBpbnRlcmltQnVuZGxlVGV4dCB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzaG91bGREaXNwb3NlSW50ZXJpbUJ1bmRsZUN0eCA9IHRydWU7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHNob3VsZERpc3Bvc2VJbnRlcmltQnVuZGxlQ3R4KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgaW50ZXJpbUJ1bmRsZUN0eC5kaXNwb3NlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGRpc3Bvc2VFcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdXYXJuaW5nOiBGYWlsZWQgdG8gZGlzcG9zZSB3b3JrZmxvdyBidW5kbGUgY29udGV4dCcsXG4gICAgICAgICAgICBkaXNwb3NlRXJyb3JcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFYyOiBDcmVhdGVzIGEgY29tYmluZWQgYnVuZGxlIHRoYXQgaW5jbHVkZXMgYm90aCBzdGVwIHJlZ2lzdHJhdGlvbnMgYW5kXG4gICAqIHdvcmtmbG93IG9yY2hlc3RyYXRpb24gaW4gYSBzaW5nbGUgcm91dGUuIFRoZSBjb21iaW5lZCBlbnRyeXBvaW50IGV4ZWN1dGVzXG4gICAqIHN0ZXBzIGlubGluZSB3aGVuIHBvc3NpYmxlLCByZWR1Y2luZyBmdW5jdGlvbiBpbnZvY2F0aW9ucyBhbmQgcXVldWUgb3ZlcmhlYWQuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHJldXNlcyBjcmVhdGVTdGVwc0J1bmRsZSAoZm9yIHN0ZXAgcmVnaXN0cmF0aW9ucykgYW5kXG4gICAqIGNyZWF0ZVdvcmtmbG93c0J1bmRsZSAoZm9yIHdvcmtmbG93IFZNIGNvZGUpLCB0aGVuIGNvbWJpbmVzIHRoZW0gaW50b1xuICAgKiBhIHNpbmdsZSByb3V0ZSBmaWxlIHVzaW5nIHdvcmtmbG93RW50cnlwb2ludCgpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZUNvbWJpbmVkQnVuZGxlKHtcbiAgICBpbnB1dEZpbGVzLFxuICAgIHN0ZXBzT3V0ZmlsZSxcbiAgICBmbG93T3V0ZmlsZSxcbiAgICBmb3JtYXQgPSAnZXNtJyxcbiAgICBidW5kbGVGaW5hbE91dHB1dCA9IHRydWUsXG4gICAgdHNjb25maWdQYXRoLFxuICAgIGV4dGVybmFsaXplTm9uU3RlcHMsXG4gICAgYnVuZGxlVHJhbnNpdGl2ZUxvY2FsU3RlcERlcGVuZGVuY2llcyxcbiAgICBzb3VyY2VTdGVwUmVnaXN0cmF0aW9uSW1wb3J0cyxcbiAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgfToge1xuICAgIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICAgIC8qKiBPdXRwdXQgcGF0aCBmb3IgdGhlIHN0ZXAgcmVnaXN0cmF0aW9ucyBidW5kbGUgKHNpZGUgZWZmZWN0cyBvbmx5KSAqL1xuICAgIHN0ZXBzT3V0ZmlsZTogc3RyaW5nO1xuICAgIC8qKiBPdXRwdXQgcGF0aCBmb3IgdGhlIGNvbWJpbmVkIHJvdXRlIGZpbGUgKi9cbiAgICBmbG93T3V0ZmlsZTogc3RyaW5nO1xuICAgIGZvcm1hdD86ICdjanMnIHwgJ2VzbSc7XG4gICAgYnVuZGxlRmluYWxPdXRwdXQ/OiBib29sZWFuO1xuICAgIHRzY29uZmlnUGF0aD86IHN0cmluZztcbiAgICBleHRlcm5hbGl6ZU5vblN0ZXBzPzogYm9vbGVhbjtcbiAgICBidW5kbGVUcmFuc2l0aXZlTG9jYWxTdGVwRGVwZW5kZW5jaWVzPzogYm9vbGVhbjtcbiAgICBzb3VyY2VTdGVwUmVnaXN0cmF0aW9uSW1wb3J0cz86IGJvb2xlYW47XG4gICAgZGlzY292ZXJlZEVudHJpZXM/OiBEaXNjb3ZlcmVkRW50cmllcztcbiAgfSk6IFByb21pc2U8e1xuICAgIG1hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0O1xuICAgIHN0ZXBzQ29udGV4dD86IGVzYnVpbGQuQnVpbGRDb250ZXh0O1xuICAgIGludGVyaW1CdW5kbGVDdHg/OiBlc2J1aWxkLkJ1aWxkQ29udGV4dDtcbiAgICBidW5kbGVGaW5hbD86IChpbnRlcmltQnVuZGxlUmVzdWx0OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gIH0+IHtcbiAgICAvLyAxLiBCdWlsZCBzdGVwIHJlZ2lzdHJhdGlvbnMgYnVuZGxlICh1c2VkIGFzIHNlcGFyYXRlIGZpbGUgZm9yXG4gICAgLy8gYnVuZGxlRmluYWxPdXRwdXQ6IGZhbHNlLCBvciByZWFkIGJhY2sgZm9yIGlubGluZSBjb250ZW50IHdoZW4gdHJ1ZSlcbiAgICBjb25zdCB7IGNvbnRleHQ6IHN0ZXBzQ29udGV4dCwgbWFuaWZlc3Q6IHN0ZXBzTWFuaWZlc3QgfSA9XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZVN0ZXBzQnVuZGxlKHtcbiAgICAgICAgaW5wdXRGaWxlcyxcbiAgICAgICAgb3V0ZmlsZTogc3RlcHNPdXRmaWxlLFxuICAgICAgICAvLyBXaGVuIGJ1bmRsZUZpbmFsT3V0cHV0IGlzIHRydWUsIHVzZSBFU00gZm9yIHRoZSBzdGVwcyBidW5kbGVcbiAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB0aGUgZmluYWwgb3V0cHV0IGZvcm1hdC4gVGhlIGZpbmFsIGVzYnVpbGQgcGFzc1xuICAgICAgICAvLyBjb252ZXJ0cyBldmVyeXRoaW5nIHRvIHRoZSB0YXJnZXQgZm9ybWF0LiBVc2luZyBDSlMgaGVyZSBjYXVzZXNcbiAgICAgICAgLy8gYSBtb2R1bGUuZXhwb3J0cyBjb2xsaXNpb246IHRoZSBzdGVwcyBidW5kbGUncyB0b3AtbGV2ZWxcbiAgICAgICAgLy8gbW9kdWxlLmV4cG9ydHMgb3ZlcndyaXRlcyB0aGUgY29tYmluZWQgcm91dGUncyBtb2R1bGUuZXhwb3J0c1xuICAgICAgICAvLyB3aGVuIGVzYnVpbGQgaW5saW5lcyB0aGUgc3RlcHMgd2l0aG91dCBhIF9fY29tbW9uSlMgd3JhcHBlci5cbiAgICAgICAgZm9ybWF0OiBidW5kbGVGaW5hbE91dHB1dCA/ICdlc20nIDogZm9ybWF0LFxuICAgICAgICBleHRlcm5hbGl6ZU5vblN0ZXBzLFxuICAgICAgICBidW5kbGVUcmFuc2l0aXZlTG9jYWxTdGVwRGVwZW5kZW5jaWVzLFxuICAgICAgICBzb3VyY2VTdGVwUmVnaXN0cmF0aW9uSW1wb3J0cyxcbiAgICAgICAgdHNjb25maWdQYXRoLFxuICAgICAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgICAgICAgLy8gU2tpcCB0aGUgY3JlYXRlUmVxdWlyZSBiYW5uZXIgaGVyZSDigJQgd2hlbiBidW5kbGVGaW5hbE91dHB1dCBpcyB0cnVlXG4gICAgICAgIC8vIHRoZSBvdXRlciBlc2J1aWxkIHBhc3Mgd2lsbCBpbmxpbmUgdGhpcyBidW5kbGUgYW5kIGFkZCBpdHMgb3duXG4gICAgICAgIC8vIGJhbm5lci4gRW1pdHRpbmcgaXQgdHdpY2UgZGVjbGFyZXMgX19jcmVhdGVSZXF1aXJlIHR3aWNlLlxuICAgICAgICBza2lwRXNtUmVxdWlyZUJhbm5lcjogYnVuZGxlRmluYWxPdXRwdXQsXG4gICAgICB9KTtcblxuICAgIC8vIDIuIEJ1aWxkIHdvcmtmbG93IFZNIGNvZGVcbiAgICBjb25zdCB0ZW1wV29ya2Zsb3dPdXRmaWxlID0gYCR7Zmxvd091dGZpbGV9Ll9fd2ZfdG1wLmpzYDtcbiAgICBjb25zdCB3b3JrZmxvd3NSZXN1bHQgPSBhd2FpdCB0aGlzLmNyZWF0ZVdvcmtmbG93c0J1bmRsZSh7XG4gICAgICBpbnB1dEZpbGVzLFxuICAgICAgb3V0ZmlsZTogdGVtcFdvcmtmbG93T3V0ZmlsZSxcbiAgICAgIGZvcm1hdCxcbiAgICAgIGJ1bmRsZUZpbmFsT3V0cHV0OiBmYWxzZSxcbiAgICAgIHRzY29uZmlnUGF0aCxcbiAgICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgd29ya2Zsb3dWTUNvZGUgPSB3b3JrZmxvd3NSZXN1bHQuaW50ZXJpbUJ1bmRsZVRleHQ7XG4gICAgaWYgKCF3b3JrZmxvd1ZNQ29kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcmVhdGVXb3JrZmxvd3NCdW5kbGUgZGlkIG5vdCByZXR1cm4gaW50ZXJpbUJ1bmRsZVRleHQnKTtcbiAgICB9XG5cbiAgICAvLyBDbGVhbiB1cCB0aGUgd3JhcHBlciBmaWxlXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdW5saW5rIH0gPSBhd2FpdCBpbXBvcnQoJ25vZGU6ZnMvcHJvbWlzZXMnKTtcbiAgICAgIGF3YWl0IHVubGluayh0ZW1wV29ya2Zsb3dPdXRmaWxlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIElnbm9yZSBjbGVhbnVwIGVycm9yc1xuICAgIH1cblxuICAgIC8vIDMuIEdlbmVyYXRlIGNvbWJpbmVkIHJvdXRlIGZpbGVcbiAgICBjb25zdCBzdGVwc1JlbGF0aXZlUGF0aCA9ICcuLycgKyBiYXNlbmFtZShzdGVwc091dGZpbGUpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICBjb25zdCBlc2NhcGVkVk1Db2RlID0gd29ya2Zsb3dWTUNvZGUucmVwbGFjZSgvW1xcXFxgJF0vZywgJ1xcXFwkJicpO1xuICAgIGNvbnN0IHdvcmtmbG93RW50cnlwb2ludE9wdGlvbnNDb2RlID0gY3JlYXRlV29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGUoKTtcblxuICAgIGNvbnN0IGNvbWJpbmVkRnVuY3Rpb25Db2RlID0gYC8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcbi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgeyBfX3N0ZXBzX3JlZ2lzdGVyZWQgfSBmcm9tICcke3N0ZXBzUmVsYXRpdmVQYXRofSc7XG5pbXBvcnQgeyB3b3JrZmxvd0VudHJ5cG9pbnQgfSBmcm9tICd3b3JrZmxvdy9ydW50aW1lJztcblxuLy8gUHJldmVudCByb2xsdXAgZnJvbSB0cmVlLXNoYWtpbmcgdGhlIHN0ZXBzIHNpZGUtZWZmZWN0IGltcG9ydFxudm9pZCBfX3N0ZXBzX3JlZ2lzdGVyZWQ7XG5cbmNvbnN0IHdvcmtmbG93Q29kZSA9IFxcYCR7ZXNjYXBlZFZNQ29kZX1cXGA7XG5cbmV4cG9ydCBjb25zdCBQT1NUID0gd29ya2Zsb3dFbnRyeXBvaW50KHdvcmtmbG93Q29kZSR7d29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGV9KTtgO1xuXG4gICAgaWYgKCFidW5kbGVGaW5hbE91dHB1dCkge1xuICAgICAgYXdhaXQgdGhpcy53cml0ZUdlbmVyYXRlZEZpbGUoZmxvd091dGZpbGUsIGNvbWJpbmVkRnVuY3Rpb25Db2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQnVuZGxlIHRoZSBjb21iaW5lZCBjb2RlIGZvciBzdGFuZGFsb25lIHVzZVxuICAgICAgY29uc3QgYnVuZGxlU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHsgYmFubmVyOiBpbXBvcnRNZXRhQmFubmVyLCBkZWZpbmU6IGltcG9ydE1ldGFEZWZpbmUgfSA9XG4gICAgICAgIHRoaXMuZ2V0Q2pzSW1wb3J0TWV0YVBvbHlmaWxsKGZvcm1hdCk7XG4gICAgICAvLyBFU00gYmFubmVyIHByb3ZpZGVzIGByZXF1aXJlYCB2aWEgY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpIHNvXG4gICAgICAvLyBDSlMgZGVwZW5kZW5jaWVzIHRoYXQgY2FsbCByZXF1aXJlKCkgZm9yIE5vZGUuanMgYnVpbHRpbnMga2VlcCB3b3JraW5nXG4gICAgICAvLyBpbiB0aGUgRVNNIG91dHB1dCBwcm9kdWNlZCBieSBidW5kbGVGaW5hbE91dHB1dDogdHJ1ZS5cbiAgICAgIGNvbnN0IGZpbmFsRXNtUmVxdWlyZUJhbm5lciA9IHRoaXMuZ2V0RXNtUmVxdWlyZUJhbm5lcihmb3JtYXQpO1xuICAgICAgY29uc3QgZmluYWxSZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgICAgYmFubmVyOiB7XG4gICAgICAgICAganM6IGAvLyBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZCBmaWxlXFxuLyogZXNsaW50LWRpc2FibGUgKi9cXG4ke2ltcG9ydE1ldGFCYW5uZXJ9JHtmaW5hbEVzbVJlcXVpcmVCYW5uZXJ9YCxcbiAgICAgICAgfSxcbiAgICAgICAgc3RkaW46IHtcbiAgICAgICAgICBjb250ZW50czogY29tYmluZWRGdW5jdGlvbkNvZGUsXG4gICAgICAgICAgcmVzb2x2ZURpcjogZGlybmFtZShmbG93T3V0ZmlsZSksXG4gICAgICAgICAgc291cmNlZmlsZTogJ3ZpcnR1YWwtZW50cnkuanMnLFxuICAgICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgICAgfSxcbiAgICAgICAgb3V0ZmlsZTogZmxvd091dGZpbGUsXG4gICAgICAgIGFic1dvcmtpbmdEaXI6IHRoaXMuY29uZmlnLndvcmtpbmdEaXIsXG4gICAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgICAgZm9ybWF0LFxuICAgICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgICB0YXJnZXQ6ICdlczIwMjInLFxuICAgICAgICB3cml0ZTogdHJ1ZSxcbiAgICAgICAga2VlcE5hbWVzOiB0cnVlLFxuICAgICAgICBtaW5pZnk6IGZhbHNlLFxuICAgICAgICBkZWZpbmU6IGltcG9ydE1ldGFEZWZpbmUsXG4gICAgICAgIGV4dGVybmFsOiBbJ0Bhd3Mtc2RrL2NyZWRlbnRpYWwtcHJvdmlkZXItd2ViLWlkZW50aXR5J10sXG4gICAgICB9KTtcbiAgICAgIHRoaXMubG9nRXNidWlsZE1lc3NhZ2VzKGZpbmFsUmVzdWx0LCAnY29tYmluZWQgYnVuZGxlJywgdHJ1ZSk7XG4gICAgICB0aGlzLmxvZ0Jhc2VCdWlsZGVySW5mbyhcbiAgICAgICAgJ0NyZWF0ZWQgY29tYmluZWQgYnVuZGxlJyxcbiAgICAgICAgYCR7RGF0ZS5ub3coKSAtIGJ1bmRsZVN0YXJ0VGltZX1tc2BcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTWVyZ2UgbWFuaWZlc3RzXG4gICAgY29uc3QgbWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3QgPSB7XG4gICAgICAuLi5zdGVwc01hbmlmZXN0LFxuICAgICAgd29ya2Zsb3dzOiB7XG4gICAgICAgIC4uLnN0ZXBzTWFuaWZlc3Qud29ya2Zsb3dzLFxuICAgICAgICAuLi53b3JrZmxvd3NSZXN1bHQubWFuaWZlc3Qud29ya2Zsb3dzLFxuICAgICAgfSxcbiAgICAgIGNsYXNzZXM6IHtcbiAgICAgICAgLi4uc3RlcHNNYW5pZmVzdC5jbGFzc2VzLFxuICAgICAgICAuLi53b3JrZmxvd3NSZXN1bHQubWFuaWZlc3QuY2xhc3NlcyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBhIGN1c3RvbSBidW5kbGVGaW5hbCBmb3Igd2F0Y2ggbW9kZSB0aGF0IHVzZXMgd29ya2Zsb3dFbnRyeXBvaW50XG4gICAgY29uc3QgY29tYmluZWRCdW5kbGVGaW5hbCA9IGFzeW5jIChpbnRlcmltQnVuZGxlVGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBlc2NhcGVkID0gaW50ZXJpbUJ1bmRsZVRleHQucmVwbGFjZSgvW1xcXFxgJF0vZywgJ1xcXFwkJicpO1xuICAgICAgY29uc3Qgd29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGUgPVxuICAgICAgICBjcmVhdGVXb3JrZmxvd0VudHJ5cG9pbnRPcHRpb25zQ29kZSgpO1xuICAgICAgY29uc3QgY29kZSA9IGAvLyBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZCBmaWxlXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IHsgX19zdGVwc19yZWdpc3RlcmVkIH0gZnJvbSAnJHtzdGVwc1JlbGF0aXZlUGF0aH0nO1xuaW1wb3J0IHsgd29ya2Zsb3dFbnRyeXBvaW50IH0gZnJvbSAnd29ya2Zsb3cvcnVudGltZSc7XG5cbnZvaWQgX19zdGVwc19yZWdpc3RlcmVkO1xuXG5jb25zdCB3b3JrZmxvd0NvZGUgPSBcXGAke2VzY2FwZWR9XFxgO1xuXG5leHBvcnQgY29uc3QgUE9TVCA9IHdvcmtmbG93RW50cnlwb2ludCh3b3JrZmxvd0NvZGUke3dvcmtmbG93RW50cnlwb2ludE9wdGlvbnNDb2RlfSk7YDtcblxuICAgICAgY29uc3Qgb3V0cHV0RGlyID0gZGlybmFtZShmbG93T3V0ZmlsZSk7XG4gICAgICBhd2FpdCBta2RpcihvdXRwdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgdGhpcy53cml0ZUdlbmVyYXRlZEZpbGUoZmxvd091dGZpbGUsIGNvZGUpO1xuICAgIH07XG5cbiAgICBpZiAodGhpcy5jb25maWcud2F0Y2gpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1hbmlmZXN0LFxuICAgICAgICBzdGVwc0NvbnRleHQsXG4gICAgICAgIGludGVyaW1CdW5kbGVDdHg6IHdvcmtmbG93c1Jlc3VsdC5pbnRlcmltQnVuZGxlQ3R4LFxuICAgICAgICBidW5kbGVGaW5hbDogY29tYmluZWRCdW5kbGVGaW5hbCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbWFuaWZlc3QgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY2xpZW50IGxpYnJhcnkgYnVuZGxlIGZvciB3b3JrZmxvdyBleGVjdXRpb24uXG4gICAqIFRoZSBjbGllbnQgbGlicmFyeSBhbGxvd3MgaW1wb3J0aW5nIGFuZCBjYWxsaW5nIHdvcmtmbG93cyBmcm9tIGFwcGxpY2F0aW9uIGNvZGUuXG4gICAqIE9ubHkgZ2VuZXJhdGVkIGlmIGNsaWVudEJ1bmRsZVBhdGggaXMgc3BlY2lmaWVkIGluIGNvbmZpZy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVDbGllbnRMaWJyYXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25maWcuY2xpZW50QnVuZGxlUGF0aCkge1xuICAgICAgLy8gU2lsZW50bHkgZXhpdCBzaW5jZSBubyBjbGllbnQgYnVuZGxlIHdhcyByZXF1ZXN0ZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvZ0Jhc2VCdWlsZGVySW5mbyhcbiAgICAgICdHZW5lcmF0aW5nIGEgY2xpZW50IGxpYnJhcnkgYXQnLFxuICAgICAgdGhpcy5jb25maWcuY2xpZW50QnVuZGxlUGF0aFxuICAgICk7XG4gICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oXG4gICAgICAnTk9URTogVGhlIHJlY29tbWVuZGVkIHdheSB0byB1c2Ugd29ya2Zsb3cgd2l0aCBhIGZyYW1ld29yayBsaWtlIE5leHRKUyBpcyB1c2luZyB0aGUgbG9hZGVyL3BsdWdpbiB3aXRoIHdlYnBhY2svdHVyYm9icGFjay9yb2xsdXAnXG4gICAgKTtcblxuICAgIC8vIEVuc3VyZSB3ZSBoYXZlIHRoZSBkaXJlY3RvcnkgZm9yIHRoZSBjbGllbnQgYnVuZGxlXG4gICAgY29uc3Qgb3V0cHV0RGlyID0gZGlybmFtZSh0aGlzLmNvbmZpZy5jbGllbnRCdW5kbGVQYXRoKTtcbiAgICBhd2FpdCBta2RpcihvdXRwdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgaW5wdXRGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0SW5wdXRGaWxlcygpO1xuXG4gICAgLy8gRGlzY292ZXIgc2VyZGUgZmlsZXMgZnJvbSB0aGUgaW5wdXQgZmlsZXMnIGRlcGVuZGVuY3kgdHJlZSBmb3IgY3Jvc3MtY29udGV4dCBjbGFzcyByZWdpc3RyYXRpb24uXG4gICAgLy8gQ2xhc3NlcyBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIGNsaWVudCBidW5kbGUgc28gdGhleSBjYW4gYmUgc2VyaWFsaXplZFxuICAgIC8vIHdoZW4gcGFzc2luZyBkYXRhIHRvIHdvcmtmbG93cyB2aWEgc3RhcnQoKSBhbmQgZGVzZXJpYWxpemVkIHdoZW4gcmVjZWl2aW5nIHdvcmtmbG93IHJlc3VsdHMuXG4gICAgY29uc3QgeyBkaXNjb3ZlcmVkU2VyZGVGaWxlcyB9ID0gYXdhaXQgdGhpcy5kaXNjb3ZlckVudHJpZXMoXG4gICAgICBpbnB1dEZpbGVzLFxuICAgICAgb3V0cHV0RGlyXG4gICAgKTtcblxuICAgIC8vIElkZW50aWZ5IHNlcmRlIGZpbGVzIHRoYXQgYXJlbid0IGluIHRoZSBpbnB1dEZpbGVzIChkZWR1cGxpY2F0ZWQpXG4gICAgY29uc3QgaW5wdXRGaWxlc05vcm1hbGl6ZWQgPSBuZXcgU2V0KFxuICAgICAgaW5wdXRGaWxlcy5tYXAoKGYpID0+IGYucmVwbGFjZSgvXFxcXC9nLCAnLycpKVxuICAgICk7XG4gICAgY29uc3Qgc2VyZGVPbmx5RmlsZXMgPSBbLi4uZGlzY292ZXJlZFNlcmRlRmlsZXNdLmZpbHRlcihcbiAgICAgIChmKSA9PiAhaW5wdXRGaWxlc05vcm1hbGl6ZWQuaGFzKGYpXG4gICAgKTtcblxuICAgIC8vIFJlLWV4cG9ydHMgZm9yIGlucHV0IGZpbGVzICh1c2VyJ3Mgd29ya2Zsb3cvc3RlcCBkZWZpbml0aW9ucykuXG4gICAgLy8gVGhlc2UgbXVzdCB1c2UgdmFsaWQgcmVsYXRpdmUgc3BlY2lmaWVycyBiZWNhdXNlIHNvbWUgZnJhbWV3b3JrcyBwYXNzXG4gICAgLy8gZ2VuZXJhdGVkIGZpbGVzIGxpa2UgXCIub3V0cHV0L3NlcnZlci9pbmRleC5tanNcIiBhcyBpbnB1dCBmaWxlcy5cbiAgICBjb25zdCByZWV4cG9ydHMgPSBpbnB1dEZpbGVzXG4gICAgICAubWFwKChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShub3JtYWxpemVkV29ya2luZ0RpciwgZmlsZSkucmVwbGFjZShcbiAgICAgICAgICAvXFxcXC9nLFxuICAgICAgICAgICcvJ1xuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLycpICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgZXhwb3J0ICogZnJvbSAnJHtyZWxhdGl2ZVBhdGh9JztgO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgIC8vIFNpZGUtZWZmZWN0IGltcG9ydHMgZm9yIHNlcmRlIGZpbGVzIG5vdCBpbiBpbnB1dEZpbGVzIChmb3IgY2xhc3MgcmVnaXN0cmF0aW9uKVxuICAgIGNvbnN0IHNlcmRlSW1wb3J0cyA9IHNlcmRlT25seUZpbGVzXG4gICAgICAubWFwKChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShub3JtYWxpemVkV29ya2luZ0RpciwgZmlsZSkucmVwbGFjZShcbiAgICAgICAgICAvXFxcXC9nLFxuICAgICAgICAgICcvJ1xuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLycpICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgaW1wb3J0ICcke3JlbGF0aXZlUGF0aH0nO2A7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgLy8gQ29tYmluZTogc2VyZGUgaW1wb3J0cyAoZm9yIHJlZ2lzdHJhdGlvbiBzaWRlIGVmZmVjdHMpICsgcmUtZXhwb3J0c1xuICAgIGNvbnN0IGVudHJ5Q29udGVudCA9IHNlcmRlSW1wb3J0c1xuICAgICAgPyBgLy8gU2VyZGUgZmlsZXMgZm9yIGNyb3NzLWNvbnRleHQgY2xhc3MgcmVnaXN0cmF0aW9uXFxuJHtzZXJkZUltcG9ydHN9XFxuJHtyZWV4cG9ydHN9YFxuICAgICAgOiByZWV4cG9ydHM7XG5cbiAgICAvLyBCdW5kbGUgd2l0aCBlc2J1aWxkIGFuZCBvdXIgY3VzdG9tIFNXQyBwbHVnaW5cbiAgICBjb25zdCBub3JtYWxpemVkQ2xpZW50U2lkZUVmZmVjdEVudHJpZXMgPSBhd2FpdCB3aXRoUmVhbHBhdGhzKFtcbiAgICAgIC4uLmlucHV0RmlsZXMsXG4gICAgICAuLi5zZXJkZU9ubHlGaWxlcyxcbiAgICBdKTtcbiAgICBjb25zdCBjbGllbnRSZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGJhbm5lcjoge1xuICAgICAgICBqczogJy8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xcbicsXG4gICAgICB9LFxuICAgICAgc3RkaW46IHtcbiAgICAgICAgY29udGVudHM6IGVudHJ5Q29udGVudCxcbiAgICAgICAgcmVzb2x2ZURpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgc291cmNlZmlsZTogJ3ZpcnR1YWwtZW50cnkuanMnLFxuICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICB9LFxuICAgICAgb3V0ZmlsZTogdGhpcy5jb25maWcuY2xpZW50QnVuZGxlUGF0aCxcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAganN4OiAncHJlc2VydmUnLFxuICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgIHdyaXRlOiB0cnVlLFxuICAgICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgICBleHRlcm5hbDogWydAd29ya2Zsb3cvY29yZSddLFxuICAgICAgcmVzb2x2ZUV4dGVuc2lvbnM6IFtcbiAgICAgICAgJy50cycsXG4gICAgICAgICcudHN4JyxcbiAgICAgICAgJy5tdHMnLFxuICAgICAgICAnLmN0cycsXG4gICAgICAgICcuanMnLFxuICAgICAgICAnLmpzeCcsXG4gICAgICAgICcubWpzJyxcbiAgICAgICAgJy5janMnLFxuICAgICAgXSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgcHJvamVjdFJvb3Q6IHRoaXMudHJhbnNmb3JtUHJvamVjdFJvb3QsXG4gICAgICAgICAgbW9kdWxlU3BlY2lmaWVyUm9vdDogdGhpcy5tb2R1bGVTcGVjaWZpZXJSb290LFxuICAgICAgICAgIHNpZGVFZmZlY3RFbnRyaWVzOiBub3JtYWxpemVkQ2xpZW50U2lkZUVmZmVjdEVudHJpZXMsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIHRoaXMubG9nRXNidWlsZE1lc3NhZ2VzKGNsaWVudFJlc3VsdCwgJ2NsaWVudCBsaWJyYXJ5IGJ1bmRsZScpO1xuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTd2NJZ25vcmVkKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHdlYmhvb2sgaGFuZGxlciBidW5kbGUgZm9yIHJlc3VtaW5nIHdvcmtmbG93cyB2aWEgSFRUUCBjYWxsYmFja3MuXG4gICAqXG4gICAqIEBwYXJhbSBidW5kbGUgLSBJZiB0cnVlLCBidW5kbGVzIGRlcGVuZGVuY2llcyAobmVlZGVkIGZvciBCdWlsZCBPdXRwdXQgQVBJKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZVdlYmhvb2tCdW5kbGUoe1xuICAgIG91dGZpbGUsXG4gICAgYnVuZGxlID0gZmFsc2UsXG4gIH06IHtcbiAgICBvdXRmaWxlOiBzdHJpbmc7XG4gICAgYnVuZGxlPzogYm9vbGVhbjtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nQ3JlYXRlV2ViaG9va0J1bmRsZUluZm8oJ0NyZWF0aW5nIHdlYmhvb2sgcm91dGUnKTtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKG91dGZpbGUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIENyZWF0ZSBhIHN0YXRpYyByb3V0ZSB0aGF0IGNhbGxzIHJlc3VtZVdlYmhvb2tcbiAgICAvLyBUaGlzIHJvdXRlIHdvcmtzIGZvciBib3RoIE5leHQuanMgYW5kIFZlcmNlbCBCdWlsZCBPdXRwdXQgQVBJXG4gICAgLy8gQnVuZGxlZCBCdWlsZCBPdXRwdXQgQVBJIHdlYmhvb2sgZnVuY3Rpb25zIG5lZWQgd29ybGQudHMgc3RhdGljYWxseVxuICAgIC8vIHByZXNlbnQgc28gZ2V0V29ybGRMYXp5KCkgY2FuIHVzZSB0aGUgZ2xvYmFsIGdldFdvcmxkIHJlZ2lzdHJhdGlvblxuICAgIC8vIGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIHRvIGEgbWlzc2luZyBzaWJsaW5nIGltcG9ydChcIi4vd29ybGQuanNcIikuXG4gICAgY29uc3Qgcm91dGVDb250ZW50ID0gYCR7YnVuZGxlID8gXCJpbXBvcnQgJ3dvcmtmbG93L3J1bnRpbWUnO1xcblwiIDogJyd9aW1wb3J0IHsgcmVzdW1lV2ViaG9vayB9IGZyb20gJ3dvcmtmbG93L2FwaSc7XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIocmVxdWVzdCkge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcbiAgLy8gRXh0cmFjdCB0b2tlbiBmcm9tIHBhdGhuYW1lOiAvLndlbGwta25vd24vd29ya2Zsb3cvdjEvd2ViaG9vay97dG9rZW59XG4gIGNvbnN0IHBhdGhQYXJ0cyA9IHVybC5wYXRobmFtZS5zcGxpdCgnLycpO1xuICBjb25zdCB0b2tlbiA9IGRlY29kZVVSSUNvbXBvbmVudChwYXRoUGFydHNbcGF0aFBhcnRzLmxlbmd0aCAtIDFdKTtcblxuICBpZiAoIXRva2VuKSB7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZSgnTWlzc2luZyB0b2tlbicsIHsgc3RhdHVzOiA0MDAgfSk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVzdW1lV2ViaG9vayh0b2tlbiwgcmVxdWVzdCk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIFRPRE86IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBpbnZhbGlkIHRva2VuIGFuZCBvdGhlciBlcnJvcnNcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgcmVzdW1lV2ViaG9vaycsIGVycm9yKTtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHsgc3RhdHVzOiA0MDQgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEdFVCA9IGhhbmRsZXI7XG5leHBvcnQgY29uc3QgUE9TVCA9IGhhbmRsZXI7XG5leHBvcnQgY29uc3QgUFVUID0gaGFuZGxlcjtcbmV4cG9ydCBjb25zdCBQQVRDSCA9IGhhbmRsZXI7XG5leHBvcnQgY29uc3QgREVMRVRFID0gaGFuZGxlcjtcbmV4cG9ydCBjb25zdCBIRUFEID0gaGFuZGxlcjtcbmV4cG9ydCBjb25zdCBPUFRJT05TID0gaGFuZGxlcjtgO1xuXG4gICAgaWYgKCFidW5kbGUpIHtcbiAgICAgIC8vIEZvciBOZXh0LmpzLCBqdXN0IHdyaXRlIHRoZSB1bmJ1bmRsZWQgZmlsZVxuICAgICAgYXdhaXQgd3JpdGVGaWxlKG91dGZpbGUsIHJvdXRlQ29udGVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9yIEJ1aWxkIE91dHB1dCBBUEksIGJ1bmRsZSB3aXRoIGVzYnVpbGQgdG8gcmVzb2x2ZSBpbXBvcnRzXG5cbiAgICBjb25zdCB3ZWJob29rRXNtUmVxdWlyZUJhbm5lciA9IHRoaXMuZ2V0RXNtUmVxdWlyZUJhbm5lcignZXNtJyk7XG4gICAgY29uc3Qgd2ViaG9va0J1bmRsZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGJhbm5lcjoge1xuICAgICAgICBqczogYC8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xcbiR7d2ViaG9va0VzbVJlcXVpcmVCYW5uZXJ9YCxcbiAgICAgIH0sXG4gICAgICBzdGRpbjoge1xuICAgICAgICBjb250ZW50czogcm91dGVDb250ZW50LFxuICAgICAgICByZXNvbHZlRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICBzb3VyY2VmaWxlOiAnd2ViaG9vay1yb3V0ZS5qcycsXG4gICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgIH0sXG4gICAgICBvdXRmaWxlLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGpzeDogJ3ByZXNlcnZlJyxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgY29uZGl0aW9uczogWydpbXBvcnQnLCAnbW9kdWxlJywgJ25vZGUnLCAnZGVmYXVsdCddLFxuICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgIHdyaXRlOiB0cnVlLFxuICAgICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgICBrZWVwTmFtZXM6IHRydWUsXG4gICAgICBtaW5pZnk6IGZhbHNlLFxuICAgICAgcmVzb2x2ZUV4dGVuc2lvbnM6IFtcbiAgICAgICAgJy50cycsXG4gICAgICAgICcudHN4JyxcbiAgICAgICAgJy5tdHMnLFxuICAgICAgICAnLmN0cycsXG4gICAgICAgICcuanMnLFxuICAgICAgICAnLmpzeCcsXG4gICAgICAgICcubWpzJyxcbiAgICAgICAgJy5janMnLFxuICAgICAgXSxcbiAgICAgIHNvdXJjZW1hcDogdGhpcy5yZXNvbHZlU291cmNlbWFwKEVNSVRfU09VUkNFTUFQU19GT1JfREVCVUdHSU5HKSxcbiAgICAgIG1haW5GaWVsZHM6IFsnbW9kdWxlJywgJ21haW4nXSxcbiAgICAgIC8vIERvbid0IGV4dGVybmFsaXplIGFueXRoaW5nIC0gYnVuZGxlIGV2ZXJ5dGhpbmcgaW5jbHVkaW5nIHdvcmtmbG93IHBhY2thZ2VzXG4gICAgICBleHRlcm5hbDogW10sXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvZ0VzYnVpbGRNZXNzYWdlcyhyZXN1bHQsICd3ZWJob29rIGJ1bmRsZSBjcmVhdGlvbicpO1xuICAgIHRoaXMubG9nQ3JlYXRlV2ViaG9va0J1bmRsZUluZm8oXG4gICAgICAnQ3JlYXRlZCB3ZWJob29rIGJ1bmRsZScsXG4gICAgICBgJHtEYXRlLm5vdygpIC0gd2ViaG9va0J1bmRsZVN0YXJ0fW1zYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHBhY2thZ2UuanNvbiBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBtb2R1bGUgdHlwZS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVQYWNrYWdlSnNvbihcbiAgICBkaXI6IHN0cmluZyxcbiAgICB0eXBlOiAnY29tbW9uanMnIHwgJ21vZHVsZSdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSB7IHR5cGUgfTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgICBqb2luKGRpciwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIG51bGwsIDIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgLnZjLWNvbmZpZy5qc29uIGZpbGUgZm9yIFZlcmNlbCBCdWlsZCBPdXRwdXQgQVBJIGZ1bmN0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVWY0NvbmZpZyhcbiAgICBkaXI6IHN0cmluZyxcbiAgICBjb25maWc6IHtcbiAgICAgIHJ1bnRpbWU/OiBzdHJpbmc7XG4gICAgICBoYW5kbGVyPzogc3RyaW5nO1xuICAgICAgbGF1bmNoZXJUeXBlPzogc3RyaW5nO1xuICAgICAgYXJjaGl0ZWN0dXJlPzogc3RyaW5nO1xuICAgICAgc2hvdWxkQWRkSGVscGVycz86IGJvb2xlYW47XG4gICAgICBzaG91bGRBZGRTb3VyY2VtYXBTdXBwb3J0PzogYm9vbGVhbjtcbiAgICAgIG1heER1cmF0aW9uPzogbnVtYmVyIHwgJ21heCc7XG4gICAgICBleHBlcmltZW50YWxUcmlnZ2Vycz86IEFycmF5PHtcbiAgICAgICAgdHlwZTogJ3F1ZXVlL3YyYmV0YSc7XG4gICAgICAgIHRvcGljOiBzdHJpbmc7XG4gICAgICAgIGNvbnN1bWVyOiBzdHJpbmc7XG4gICAgICAgIG1heERlbGl2ZXJpZXM/OiBudW1iZXI7XG4gICAgICAgIHJldHJ5QWZ0ZXJTZWNvbmRzPzogbnVtYmVyO1xuICAgICAgICBpbml0aWFsRGVsYXlTZWNvbmRzPzogbnVtYmVyO1xuICAgICAgfT47XG4gICAgfVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2Y0NvbmZpZyA9IHtcbiAgICAgIHJ1bnRpbWU6IGNvbmZpZy5ydW50aW1lID8/ICdub2RlanMyMi54JyxcbiAgICAgIGhhbmRsZXI6IGNvbmZpZy5oYW5kbGVyID8/ICdpbmRleC5tanMnLFxuICAgICAgbGF1bmNoZXJUeXBlOiBjb25maWcubGF1bmNoZXJUeXBlID8/ICdOb2RlanMnLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBjb25maWcuYXJjaGl0ZWN0dXJlID8/ICdhcm02NCcsXG4gICAgICBzaG91bGRBZGRIZWxwZXJzOiBjb25maWcuc2hvdWxkQWRkSGVscGVycyA/PyB0cnVlLFxuICAgICAgLi4uKGNvbmZpZy5tYXhEdXJhdGlvbiAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgbWF4RHVyYXRpb246IGNvbmZpZy5tYXhEdXJhdGlvbixcbiAgICAgIH0pLFxuICAgICAgLi4uKGNvbmZpZy5zaG91bGRBZGRTb3VyY2VtYXBTdXBwb3J0ICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICBzaG91bGRBZGRTb3VyY2VtYXBTdXBwb3J0OiBjb25maWcuc2hvdWxkQWRkU291cmNlbWFwU3VwcG9ydCxcbiAgICAgIH0pLFxuICAgICAgLi4uKGNvbmZpZy5leHBlcmltZW50YWxUcmlnZ2VycyAmJiB7XG4gICAgICAgIGV4cGVyaW1lbnRhbFRyaWdnZXJzOiBjb25maWcuZXhwZXJpbWVudGFsVHJpZ2dlcnMsXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgYXdhaXQgd3JpdGVGaWxlKFxuICAgICAgam9pbihkaXIsICcudmMtY29uZmlnLmpzb24nKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZjQ29uZmlnLCBudWxsLCAyKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsIHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIGRpcmVjdG9yeSBmb3IgYSBmaWxlIHBhdGggZXhpc3RzLCBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZW5zdXJlU3djSWdub3JlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVByb2plY3RTd2NHaXRpZ25vcmVFbnRyeSgpO1xuICAgIGF3YWl0IHRoaXMuY3JlYXRlU3djRGlyZWN0b3J5R2l0aWdub3JlKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZVByb2plY3RTd2NHaXRpZ25vcmVFbnRyeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBnaXRpZ25vcmVQYXRoID0gam9pbih0aGlzLmNvbmZpZy53b3JraW5nRGlyLCAnLmdpdGlnbm9yZScpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gJyc7XG4gICAgICB0cnkge1xuICAgICAgICBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoZ2l0aWdub3JlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFzU3djRW50cnkgPSBjb250ZW50LnNwbGl0KC9cXHI/XFxuLykuc29tZSgobGluZSkgPT4ge1xuICAgICAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgdHJpbW1lZCA9PT0gJy5zd2MnIHx8XG4gICAgICAgICAgdHJpbW1lZCA9PT0gJy5zd2MvJyB8fFxuICAgICAgICAgIHRyaW1tZWQgPT09ICcvLnN3YycgfHxcbiAgICAgICAgICB0cmltbWVkID09PSAnLy5zd2MvJ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChoYXNTd2NFbnRyeSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlcGFyYXRvciA9XG4gICAgICAgIGNvbnRlbnQubGVuZ3RoID4gMCAmJiAhY29udGVudC5lbmRzV2l0aCgnXFxuJykgPyAnXFxuJyA6ICcnO1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKGdpdGlnbm9yZVBhdGgsIGAke2NvbnRlbnR9JHtzZXBhcmF0b3J9Ly5zd2NcXG5gKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFdlJ3JlIGludGVudGlvbmFsbHkgc2lsZW50bHkgaWdub3JpbmcgdGhpcyBlcnJvciAtIHVwZGF0aW5nIC5naXRpZ25vcmUgaXNuJ3QgY3JpdGljYWxcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZVN3Y0RpcmVjdG9yeUdpdGlnbm9yZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKFxuICAgICAgICBqb2luKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsICcuc3djJywgJy5naXRpZ25vcmUnKSxcbiAgICAgICAgJypcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gV2UncmUgaW50ZW50aW9uYWxseSBzaWxlbnRseSBpZ25vcmluZyB0aGlzIGVycm9yIC0gY3JlYXRpbmcgLmdpdGlnbm9yZSBpc24ndCBjcml0aWNhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBtYW5pZmVzdCBzaG91bGQgYmUgZXhwb3NlZCBhcyBhIHB1YmxpYyBIVFRQIHJvdXRlLlxuICAgKiBDb250cm9sbGVkIGJ5IHRoZSBgV09SS0ZMT1dfUFVCTElDX01BTklGRVNUYCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgc2hvdWxkRXhwb3NlUHVibGljTWFuaWZlc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LldPUktGTE9XX1BVQkxJQ19NQU5JRkVTVCA9PT0gJzEnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSB3b3JrZmxvdyBtYW5pZmVzdCBkaWFnbm9zdGljcyBwYXRoLCB3aGVuIHRoaXMgYnVpbGRlciBzaG91bGRcbiAgICogZW1pdCBvbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0RGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5jb25maWcuZGlhZ25vc3RpY3NEaXIpIHtcbiAgICAgIHJldHVybiByZXNvbHZlKFxuICAgICAgICB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICB0aGlzLmNvbmZpZy5kaWFnbm9zdGljc0RpcixcbiAgICAgICAgJ3dvcmtmbG93cy1tYW5pZmVzdC5qc29uJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcuYnVpbGRUYXJnZXQgPT09ICd2ZXJjZWwtYnVpbGQtb3V0cHV0LWFwaScpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVQYXRoKFxuICAgICAgICAnLnZlcmNlbC9vdXRwdXQvZGlhZ25vc3RpY3Mvd29ya2Zsb3dzLW1hbmlmZXN0Lmpzb24nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBkZXZlbG9wbWVudC93YXRjaCBidWlsZCAoZS5nLiBgbmV4dCBkZXZgLCBgbml0cm8gZGV2YCxcbiAgICogb3IgYSBWaXRlLWJhc2VkIGRldiBzZXJ2ZXIgZm9yIGFzdHJvL3N2ZWx0ZWtpdC92aXRlKS4gYGNvbmZpZy53YXRjaGAgaXNcbiAgICogcGx1bWJlZCBieSB0aGUgYnVpbGRlcnMgdGhhdCBvd24gYSBkZXYgc2VydmVyIChuZXh0LCBuaXRybywgbmVzdCk7IHRoZVxuICAgKiBWaXRlLWJhc2VkIGludGVncmF0aW9ucyBkb24ndCBzZXQgaXQgYnV0IHJ1biB3aXRoXG4gICAqIGBOT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50J2AuIFdoZW4gbmVpdGhlciBzaWduYWwgaXMgcHJlc2VudCB3ZSB0cmVhdCB0aGVcbiAgICogYnVpbGQgYXMgcHJvZHVjdGlvbiwgc28gQ0xJL1ZlcmNlbCBwcm9kdWN0aW9uIGJ1aWxkcyBkZWZhdWx0IHRvIG9mZi5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgaXNEZXZlbG9wbWVudEJ1aWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy53YXRjaCA9PT0gdHJ1ZSB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHNvdXJjZSBtYXAgbW9kZSBmb3IgdGhlIHN0YWNrLXJlbGV2YW50IGJ1bmRsZXMgKHN0ZXBzICsgdGhlXG4gICAqIGludGVybWVkaWF0ZSB3b3JrZmxvdyBWTSBidW5kbGUpOiBpbmxpbmUgc291cmNlIG1hcHMgaW4gZGV2ZWxvcG1lbnQgc29cbiAgICogc3RhY2sgdHJhY2VzIHBvaW50IGF0IHNvdXJjZSBmaWxlcywgYW5kIG9mZiBpbiBwcm9kdWN0aW9uIHNvIGZ1bmN0aW9uXG4gICAqIGJ1bmRsZXMgc3RheSBzbWFsbCAoaGVscHMgc3RheSB1bmRlciB0aGUgVmVyY2VsIDI1ME1CIGZ1bmN0aW9uIGxpbWl0KSBhbmRcbiAgICogc2tpcCB0aGUgc291cmNlLW1hcC1zdXBwb3J0IHJ1bnRpbWUgc2hpbS4gVGhlIGBzb3VyY2VtYXBgIGNvbmZpZyBvcHRpb25cbiAgICogYW5kIGBXT1JLRkxPV19TT1VSQ0VNQVBgIGVudiB2YXIgb3ZlcnJpZGUgdGhpcyBpbiBlaXRoZXIgZW52aXJvbm1lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGRlZmF1bHRTb3VyY2VtYXBNb2RlKCk6IFNvdXJjZW1hcE1vZGUge1xuICAgIHJldHVybiB0aGlzLmlzRGV2ZWxvcG1lbnRCdWlsZCA/ICdpbmxpbmUnIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIHNvdXJjZSBtYXAgbW9kZSBmb3IgYSBnaXZlbiBjYWxsIHNpdGUuIFByZWNlZGVuY2U6XG4gICAqIGV4cGxpY2l0IGBzb3VyY2VtYXBgIGNvbmZpZyA+IGBXT1JLRkxPV19TT1VSQ0VNQVBgIGVudiB2YXIgPiB0aGUgY2FsbFxuICAgKiBzaXRlJ3MgZGVmYXVsdC4gUmV0dXJuZWQgdmFsdWUgaXMgcGFzc2VkIGRpcmVjdGx5IHRvIGVzYnVpbGQnc1xuICAgKiBgc291cmNlbWFwYCBvcHRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZVNvdXJjZW1hcChkZWZhdWx0TW9kZTogU291cmNlbWFwTW9kZSk6IFNvdXJjZW1hcE1vZGUge1xuICAgIGlmICh0aGlzLmNvbmZpZy5zb3VyY2VtYXAgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuY29uZmlnLnNvdXJjZW1hcDtcbiAgICBjb25zdCBlbnZNb2RlID0gcGFyc2VTb3VyY2VtYXBFbnYocHJvY2Vzcy5lbnYuV09SS0ZMT1dfU09VUkNFTUFQKTtcbiAgICBpZiAoZW52TW9kZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZW52TW9kZTtcbiAgICByZXR1cm4gZGVmYXVsdE1vZGU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcmVzb2x2ZWQgc291cmNlIG1hcCBtb2RlIGVtaXRzIGFueSBzb3VyY2UgbWFwcyBhdCBhbGwuXG4gICAqIFVzZWQgYnkgY29uc3VtZXJzIGxpa2UgdGhlIFZlcmNlbCBidWlsZGVyIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGVcbiAgICogdGhlIHNvdXJjZS1tYXAtc3VwcG9ydCBydW50aW1lIHNoaW0gaW4gZ2VuZXJhdGVkIGZ1bmN0aW9ucy4gVXNlcyB0aGUgc2FtZVxuICAgKiBlbnZpcm9ubWVudC1hd2FyZSBkZWZhdWx0IChgZGVmYXVsdFNvdXJjZW1hcE1vZGVgKSBhcyB0aGUgc3RlcC93b3JrZmxvd1xuICAgKiBidW5kbGVzLCBzbyBhIHByb2R1Y3Rpb24gYnVpbGQgd2l0aCBubyBvdmVycmlkZSBvbWl0cyB0aGUgc2hpbS5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgc291cmNlbWFwc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZVNvdXJjZW1hcCh0aGlzLmRlZmF1bHRTb3VyY2VtYXBNb2RlKSAhPT0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG1hbmlmZXN0IEpTT04gZmlsZSBjb250YWluaW5nIHN0ZXAvd29ya2Zsb3cvY2xhc3MgbWV0YWRhdGFcbiAgICogYW5kIGdyYXBoIGRhdGEgZm9yIHZpc3VhbGl6YXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBtYW5pZmVzdCBKU09OIHN0cmluZywgb3IgdW5kZWZpbmVkIGlmIG1hbmlmZXN0IGNyZWF0aW9uIGZhaWxlZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVNYW5pZmVzdCh7XG4gICAgd29ya2Zsb3dCdW5kbGVQYXRoLFxuICAgIG1hbmlmZXN0RGlyLFxuICAgIG1hbmlmZXN0LFxuICB9OiB7XG4gICAgd29ya2Zsb3dCdW5kbGVQYXRoOiBzdHJpbmc7XG4gICAgbWFuaWZlc3REaXI6IHN0cmluZztcbiAgICBtYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdDtcbiAgfSk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgYnVpbGRTdGFydCA9IERhdGUubm93KCk7XG4gICAgdGhpcy5sb2dDcmVhdGVNYW5pZmVzdEluZm8oJ0NyZWF0aW5nIG1hbmlmZXN0Li4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd29ya2Zsb3dHcmFwaHMgPSBhd2FpdCBleHRyYWN0V29ya2Zsb3dHcmFwaHMod29ya2Zsb3dCdW5kbGVQYXRoKTtcblxuICAgICAgY29uc3Qgc3RlcHMgPSB0aGlzLmNvbnZlcnRTdGVwc01hbmlmZXN0KG1hbmlmZXN0LnN0ZXBzKTtcbiAgICAgIGNvbnN0IHdvcmtmbG93cyA9IHRoaXMuY29udmVydFdvcmtmbG93c01hbmlmZXN0KFxuICAgICAgICBtYW5pZmVzdC53b3JrZmxvd3MsXG4gICAgICAgIHdvcmtmbG93R3JhcGhzXG4gICAgICApO1xuICAgICAgY29uc3QgY2xhc3NlcyA9IHRoaXMuY29udmVydENsYXNzZXNNYW5pZmVzdChtYW5pZmVzdC5jbGFzc2VzKTtcblxuICAgICAgY29uc3Qgb3V0cHV0ID0geyB2ZXJzaW9uOiAnMS4wLjAnLCBzdGVwcywgd29ya2Zsb3dzLCBjbGFzc2VzIH07XG4gICAgICBjb25zdCBtYW5pZmVzdEpzb24gPSBKU09OLnN0cmluZ2lmeShvdXRwdXQsIG51bGwsIDIpO1xuXG4gICAgICBhd2FpdCBta2RpcihtYW5pZmVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCB3cml0ZUZpbGUoam9pbihtYW5pZmVzdERpciwgJ21hbmlmZXN0Lmpzb24nKSwgbWFuaWZlc3RKc29uKTtcblxuICAgICAgY29uc3QgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGggPSB0aGlzLmdldERpYWdub3N0aWNzTWFuaWZlc3RQYXRoKCk7XG4gICAgICBpZiAoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVEaXJlY3RvcnkoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgsIG1hbmlmZXN0SnNvbik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0ZXBDb3VudCA9IE9iamVjdC52YWx1ZXMoc3RlcHMpLnJlZHVjZShcbiAgICAgICAgKGFjYywgcykgPT4gYWNjICsgT2JqZWN0LmtleXMocykubGVuZ3RoLFxuICAgICAgICAwXG4gICAgICApO1xuICAgICAgY29uc3Qgd29ya2Zsb3dDb3VudCA9IE9iamVjdC52YWx1ZXMod29ya2Zsb3dzKS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHcpID0+IGFjYyArIE9iamVjdC5rZXlzKHcpLmxlbmd0aCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNsYXNzQ291bnQgPSBPYmplY3QudmFsdWVzKGNsYXNzZXMpLnJlZHVjZShcbiAgICAgICAgKGFjYywgYykgPT4gYWNjICsgT2JqZWN0LmtleXMoYykubGVuZ3RoLFxuICAgICAgICAwXG4gICAgICApO1xuXG4gICAgICB0aGlzLmxvZ0NyZWF0ZU1hbmlmZXN0SW5mbyhcbiAgICAgICAgYENyZWF0ZWQgbWFuaWZlc3Qgd2l0aCAke3N0ZXBDb3VudH0gJHtwbHVyYWxpemUoJ3N0ZXAnLCAnc3RlcHMnLCBzdGVwQ291bnQpfSwgJHt3b3JrZmxvd0NvdW50fSAke3BsdXJhbGl6ZSgnd29ya2Zsb3cnLCAnd29ya2Zsb3dzJywgd29ya2Zsb3dDb3VudCl9LCBhbmQgJHtjbGFzc0NvdW50fSAke3BsdXJhbGl6ZSgnY2xhc3MnLCAnY2xhc3NlcycsIGNsYXNzQ291bnQpfWAsXG4gICAgICAgIGAke0RhdGUubm93KCkgLSBidWlsZFN0YXJ0fW1zYFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIG1hbmlmZXN0SnNvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnRmFpbGVkIHRvIGNyZWF0ZSBtYW5pZmVzdDonLFxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFN0ZXBzTWFuaWZlc3QoXG4gICAgc3RlcHM6IFdvcmtmbG93TWFuaWZlc3RbJ3N0ZXBzJ11cbiAgKTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgeyBzdGVwSWQ6IHN0cmluZyB9Pj4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgeyBzdGVwSWQ6IHN0cmluZyB9Pj4gPSB7fTtcbiAgICBpZiAoIXN0ZXBzKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGVudHJpZXNdIG9mIE9iamVjdC5lbnRyaWVzKHN0ZXBzKSkge1xuICAgICAgcmVzdWx0W2ZpbGVQYXRoXSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgZGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHtcbiAgICAgICAgcmVzdWx0W2ZpbGVQYXRoXVtuYW1lXSA9IHsgc3RlcElkOiBkYXRhLnN0ZXBJZCB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0V29ya2Zsb3dzTWFuaWZlc3QoXG4gICAgd29ya2Zsb3dzOiBXb3JrZmxvd01hbmlmZXN0Wyd3b3JrZmxvd3MnXSxcbiAgICBncmFwaHM6IFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIFJlY29yZDxzdHJpbmcsIHsgZ3JhcGg6IHsgbm9kZXM6IGFueVtdOyBlZGdlczogYW55W10gfSB9PlxuICAgID5cbiAgKTogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICB7IHdvcmtmbG93SWQ6IHN0cmluZzsgZ3JhcGg6IHsgbm9kZXM6IGFueVtdOyBlZGdlczogYW55W10gfSB9XG4gICAgPlxuICA+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIFJlY29yZDxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHN0cmluZzsgZ3JhcGg6IHsgbm9kZXM6IGFueVtdOyBlZGdlczogYW55W10gfSB9XG4gICAgICA+XG4gICAgPiA9IHt9O1xuICAgIGlmICghd29ya2Zsb3dzKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgLy8gQnVpbGQgYSBub3JtYWxpemVkIGxvb2t1cCBmb3IgZ3JhcGhzIHNpbmNlIHRoZSBncmFwaCBleHRyYWN0b3IgdXNlc1xuICAgIC8vIHBhdGhzIGZyb20gd29ya2Zsb3dJZCAoZS5nLiBcIi4vd29ya2Zsb3dzL2hlbGxvLWFnZW50XCIpIHdoaWxlIHRoZVxuICAgIC8vIG1hbmlmZXN0IHVzZXMgc291cmNlIGZpbGUgcGF0aHMgKGUuZy4gXCJ3b3JrZmxvd3MvaGVsbG8tYWdlbnQudHNcIikuXG4gICAgLy8gTm9ybWFsaXplIGJ5IHN0cmlwcGluZyBsZWFkaW5nIFwiLi9cIiBhbmQgZmlsZSBleHRlbnNpb25zLlxuICAgIGNvbnN0IG5vcm1hbGl6ZWRHcmFwaHMgPSBuZXcgTWFwPFxuICAgICAgc3RyaW5nLFxuICAgICAgUmVjb3JkPHN0cmluZywgeyBncmFwaDogeyBub2RlczogYW55W107IGVkZ2VzOiBhbnlbXSB9IH0+XG4gICAgPigpO1xuICAgIGZvciAoY29uc3QgW2dyYXBoUGF0aCwgZ3JhcGhFbnRyaWVzXSBvZiBPYmplY3QuZW50cmllcyhncmFwaHMpKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gZ3JhcGhQYXRoXG4gICAgICAgIC5yZXBsYWNlKC9eXFwuXFwvLywgJycpXG4gICAgICAgIC5yZXBsYWNlKC9cXC5bXi8uXSskLywgJycpO1xuICAgICAgbm9ybWFsaXplZEdyYXBocy5zZXQobm9ybWFsaXplZCwgZ3JhcGhFbnRyaWVzKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgZW50cmllc10gb2YgT2JqZWN0LmVudHJpZXMod29ya2Zsb3dzKSkge1xuICAgICAgcmVzdWx0W2ZpbGVQYXRoXSA9IHt9O1xuICAgICAgLy8gTm9ybWFsaXplIHRoZSBtYW5pZmVzdCBmaWxlIHBhdGggZm9yIGxvb2t1cFxuICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGVQYXRoID0gZmlsZVBhdGhcbiAgICAgICAgLnJlcGxhY2UoL15cXC5cXC8vLCAnJylcbiAgICAgICAgLnJlcGxhY2UoL1xcLlteLy5dKyQvLCAnJyk7XG5cbiAgICAgIGNvbnN0IGdyYXBoRW50cmllcyA9XG4gICAgICAgIGdyYXBoc1tmaWxlUGF0aF0gfHwgbm9ybWFsaXplZEdyYXBocy5nZXQobm9ybWFsaXplZEZpbGVQYXRoKTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgZGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHtcbiAgICAgICAgcmVzdWx0W2ZpbGVQYXRoXVtuYW1lXSA9IHtcbiAgICAgICAgICB3b3JrZmxvd0lkOiBkYXRhLndvcmtmbG93SWQsXG4gICAgICAgICAgZ3JhcGg6IGdyYXBoRW50cmllcz8uW25hbWVdPy5ncmFwaCB8fCB7IG5vZGVzOiBbXSwgZWRnZXM6IFtdIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRDbGFzc2VzTWFuaWZlc3QoXG4gICAgY2xhc3NlczogV29ya2Zsb3dNYW5pZmVzdFsnY2xhc3NlcyddXG4gICk6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHsgY2xhc3NJZDogc3RyaW5nIH0+PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB7IGNsYXNzSWQ6IHN0cmluZyB9Pj4gPSB7fTtcbiAgICBpZiAoIWNsYXNzZXMpIHJldHVybiByZXN1bHQ7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgZW50cmllc10gb2YgT2JqZWN0LmVudHJpZXMoY2xhc3NlcykpIHtcbiAgICAgIHJlc3VsdFtmaWxlUGF0aF0gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgICAgIHJlc3VsdFtmaWxlUGF0aF1bbmFtZV0gPSB7IGNsYXNzSWQ6IGRhdGEuY2xhc3NJZCB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=
|
|
1724
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jhc2UtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxLQUFLLEVBQ0wsUUFBUSxFQUNSLFFBQVEsRUFDUixNQUFNLEVBQ04sRUFBRSxFQUNGLFNBQVMsR0FDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLHVCQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBQ25DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNsQyxPQUFPLEVBQ0wsaUJBQWlCLEdBRWxCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxFQUVMLG1CQUFtQixHQUNwQixNQUFNLHFCQUFx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Q0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgcmVhbHBhdGgsXG4gIHJlbmFtZSxcbiAgcm0sXG4gIHdyaXRlRmlsZSxcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGpvaW4sIHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQgeyBidWlsZExvZ2dlciB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL2xvZ2dlcic7XG5pbXBvcnQgeyBXb3JrZmxvd0J1aWxkRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHBsdXJhbGl6ZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGVuaGFuY2VkUmVzb2x2ZU9yaWdpbmFsIGZyb20gJ2VuaGFuY2VkLXJlc29sdmUnO1xuaW1wb3J0ICogYXMgZXNidWlsZCBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB7IGZpbmRVcCB9IGZyb20gJ2ZpbmQtdXAnO1xuaW1wb3J0IHsgZ2xvYiB9IGZyb20gJ3RpbnlnbG9iYnknO1xuaW1wb3J0IHtcbiAgYXBwbHlTd2NUcmFuc2Zvcm0sXG4gIHR5cGUgV29ya2Zsb3dNYW5pZmVzdCxcbn0gZnJvbSAnLi9hcHBseS1zd2MtdHJhbnNmb3JtLmpzJztcbmltcG9ydCB7IGNyZWF0ZVdvcmtmbG93RW50cnlwb2ludE9wdGlvbnNDb2RlIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgZ2V0RXNidWlsZFRzY29uZmlnT3B0aW9ucyB9IGZyb20gJy4vZXNidWlsZC10c2NvbmZpZy5qcyc7XG5pbXBvcnQge1xuICB0eXBlIERpc2NvdmVyZWRFbnRyaWVzLFxuICBmYXN0RGlzY292ZXJFbnRyaWVzLFxufSBmcm9tICcuL2Zhc3QtZGlzY292ZXJ5LmpzJztcbmltcG9ydCB7XG4gIGdldEltcG9ydFBhdGgsXG4gIHJlc29sdmVNb2R1bGVTcGVjaWZpZXIsXG4gIHN0cmlwUGFja2FnZVZlcnNpb24sXG59IGZyb20gJy4vbW9kdWxlLXNwZWNpZmllci5qcyc7XG5pbXBvcnQgeyBjcmVhdGVOb2RlTW9kdWxlRXJyb3JQbHVnaW4gfSBmcm9tICcuL25vZGUtbW9kdWxlLWVzYnVpbGQtcGx1Z2luLmpzJztcbmltcG9ydCB7IGNyZWF0ZVBzZXVkb1BhY2thZ2VQbHVnaW4gfSBmcm9tICcuL3BzZXVkby1wYWNrYWdlLWVzYnVpbGQtcGx1Z2luLmpzJztcbmltcG9ydCB7IGNyZWF0ZVN3Y1BsdWdpbiB9IGZyb20gJy4vc3djLWVzYnVpbGQtcGx1Z2luLmpzJztcbmltcG9ydCB7IGRldGVjdFdvcmtmbG93UGF0dGVybnMgfSBmcm9tICcuL3RyYW5zZm9ybS11dGlscy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNvdXJjZW1hcE1vZGUsIFdvcmtmbG93Q29uZmlnIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBleHRyYWN0V29ya2Zsb3dHcmFwaHMgfSBmcm9tICcuL3dvcmtmbG93cy1leHRyYWN0b3IuanMnO1xuXG5jb25zdCBlbmhhbmNlZFJlc29sdmUgPSBwcm9taXNpZnkoZW5oYW5jZWRSZXNvbHZlT3JpZ2luYWwpO1xuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcblxuZXhwb3J0IHR5cGUgeyBEaXNjb3ZlcmVkRW50cmllcyB9IGZyb20gJy4vZmFzdC1kaXNjb3ZlcnkuanMnO1xuXG4vKipcbiAqIExlZ2FjeSBvcHQtaW4gZm9yIHNvdXJjZSBtYXBzIG9uIHRoZSBmaW5hbCB3b3JrZmxvdyB3cmFwcGVyICsgd2ViaG9va1xuICogYnVuZGxlcyAod2hpY2ggZGVmYXVsdCB0byBvZmYsIHVubGlrZSB0aGUgc3RlcC9pbnRlcmltIHdvcmtmbG93IGJ1bmRsZXNcbiAqIHRoYXQgZGVmYXVsdCB0byBpbmxpbmUpLiBTdXBlcnNlZGVkIGJ5IHRoZSBgc291cmNlbWFwYCBjb25maWcgb3B0aW9uIGFuZFxuICogdGhlIGBXT1JLRkxPV19TT1VSQ0VNQVBgIGVudmlyb25tZW50IHZhcmlhYmxlOyBrZXB0IGZvciBiYWNrLWNvbXBhdC5cbiAqL1xuY29uc3QgRU1JVF9TT1VSQ0VNQVBTX0ZPUl9ERUJVR0dJTkcgPVxuICBwcm9jZXNzLmVudi5XT1JLRkxPV19FTUlUX1NPVVJDRU1BUFNfRk9SX0RFQlVHR0lORyA9PT0gJzEnO1xuXG5jb25zdCBWQUxJRF9TT1VSQ0VNQVBfU1RSSU5HUyA9IG5ldyBTZXQoW1xuICAnaW5saW5lJyxcbiAgJ2xpbmtlZCcsXG4gICdleHRlcm5hbCcsXG4gICdib3RoJyxcbl0pO1xuXG4vKipcbiAqIFBhcnNlIHRoZSB2YWx1ZSBvZiB0aGUgYFdPUktGTE9XX1NPVVJDRU1BUGAgZW52aXJvbm1lbnQgdmFyaWFibGUgaW50byBhXG4gKiBgU291cmNlbWFwTW9kZWAuIFJldHVybnMgYHVuZGVmaW5lZGAgaWYgdGhlIGVudiB2YXIgaXMgdW5zZXQsIGVtcHR5LCBvclxuICogdW5yZWNvZ25pemVkIChhIHdhcm5pbmcgaXMgZW1pdHRlZCBmb3IgdW5yZWNvZ25pemVkIHZhbHVlcykuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlU291cmNlbWFwRW52KFxuICB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBTb3VyY2VtYXBNb2RlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgY2FzZSAnMCc6XG4gICAgY2FzZSAnZmFsc2UnOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNhc2UgJzEnOlxuICAgIGNhc2UgJ3RydWUnOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIGlmIChWQUxJRF9TT1VSQ0VNQVBfU1RSSU5HUy5oYXModmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBhcyBTb3VyY2VtYXBNb2RlO1xuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgSWdub3JpbmcgdW5yZWNvZ25pemVkIFdPUktGTE9XX1NPVVJDRU1BUD0ke3ZhbHVlfS4gYCArXG4gICAgICAgICAgYEV4cGVjdGVkIG9uZSBvZjogdHJ1ZSwgZmFsc2UsIDAsIDEsIGlubGluZSwgbGlua2VkLCBleHRlcm5hbCwgYm90aC5gXG4gICAgICApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRCdWlsZER1cmF0aW9uKGR1cmF0aW9uTXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChkdXJhdGlvbk1zIDwgMTAwMCkge1xuICAgIHJldHVybiBgJHtkdXJhdGlvbk1zfW1zYDtcbiAgfVxuXG4gIHJldHVybiBgJHsoZHVyYXRpb25NcyAvIDEwMDApLnRvRml4ZWQoMSl9c2A7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGFuIGFycmF5IG9mIGZpbGUgcGF0aHMgYnkgYXBwZW5kaW5nIHRoZSBgcmVhbHBhdGgoKWAgb2YgZWFjaCBlbnRyeVxuICogKHRvIGhhbmRsZSBzeW1saW5rcywgZS5nLiBwbnBtL3dvcmtzcGFjZSBsYXlvdXRzKSBhbmQgZGVkdXBsaWNhdGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2l0aFJlYWxwYXRocyhlbnRyaWVzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgbmV3IFNldChcbiAgICAgIChcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgZW50cmllcy5tYXAoYXN5bmMgKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlYWxwYXRoKGVudHJ5KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkID8gW2VudHJ5LCByZXNvbHZlZF0gOiBbZW50cnldO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICkuZmxhdCgpXG4gICAgKVxuICApO1xufVxuXG4vKipcbiAqIENhbm9uaWNhbCBcIndoYXQgbW9kdWxlIGRvZXMgdGhpcyBmaWxlIHJlcHJlc2VudD9cIiBrZXkgdXNlZCB0byBkZWR1cGVcbiAqIHZpcnR1YWwtZW50cnkgaW1wb3J0cy5cbiAqXG4gKiBJZiB0aGUgZmlsZSByZXNvbHZlcyB0byBhIHJlYWwgcGFja2FnZSBzcGVjaWZpZXIgKGB3b3JrZmxvdy9pbnRlcm5hbC9idWlsdGluc2AsXG4gKiBgQGludGVybmFsL2FnZW50L3NlcnZlcmAsIGV0Yy4pLCB3ZSByZXR1cm4gdGhlIGJhcmUgc3BlY2lmaWVyIOKAlCB2ZXJzaW9uXG4gKiBzdHJpcHBlZCDigJQgYmVjYXVzZSBlc2J1aWxkJ3MgcGFja2FnZSByZXNvbHV0aW9uIHdpbGwgY29sbGFwc2UgYWxsXG4gKiBpbXBvcnRlcnMgb2YgdGhhdCBzcGVjaWZpZXIgdG8gdGhlIHNhbWUgcGh5c2ljYWwgbW9kdWxlIHJlZ2FyZGxlc3Mgb2ZcbiAqIHdoaWNoIG9uLWRpc2sgY29weSAoc3JjIHZzIGRpc3QpIGFueSBvbmUgaW1wb3J0ZXIgd3JvdGUuXG4gKlxuICogT3RoZXJ3aXNlIHdlIGZhbGwgYmFjayB0byB0aGUgYWJzb2x1dGUgZmlsZSBwYXRoLiBEaXN0aW5jdCBsb2NhbC1hcHBcbiAqIGZpbGVzIGhhdmUgZGlzdGluY3QgcGF0aHMsIHNvIHRoaXMgc3RpbGwgZGVkdXBlcyBhIGZpbGUgYWdhaW5zdCBpdHNlbGZcbiAqIChlLmcuIGlmIGl0IHNob3dzIHVwIGluIGJvdGggYHN0ZXBGaWxlc2AgYW5kIGBzZXJkZU9ubHlGaWxlc2ApIHdpdGhvdXRcbiAqIGNvbmZsYXRpbmcgdW5yZWxhdGVkIGZpbGVzLlxuICovXG5mdW5jdGlvbiBtb2R1bGVJZGVudGl0eUtleShmaWxlOiBzdHJpbmcsIG1vZHVsZVNwZWNpZmllclJvb3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgbW9kdWxlU3BlY2lmaWVyIH0gPSByZXNvbHZlTW9kdWxlU3BlY2lmaWVyKGZpbGUsIG1vZHVsZVNwZWNpZmllclJvb3QpO1xuICBpZiAobW9kdWxlU3BlY2lmaWVyKSB7XG4gICAgLy8gU3RyaXAgdGhlIFwiQDx2ZXJzaW9uPlwiIHN1ZmZpeCBzbyBzb3VyY2UgYW5kIGRpc3QgY29waWVzIG9mIHRoZSBzYW1lXG4gICAgLy8gZXhwb3J0IGNvbGxhcHNlIHRvIHRoZSBzYW1lIGtleS5cbiAgICByZXR1cm4gc3RyaXBQYWNrYWdlVmVyc2lvbihtb2R1bGVTcGVjaWZpZXIpO1xuICB9XG4gIHJldHVybiBmaWxlLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbn1cblxudHlwZSBNYW5pZmVzdEVudHJ5TG9jYXRpb24gPSB7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbn07XG5cbmZ1bmN0aW9uIGZvcm1hdElkTG9jYXRpb24obG9jYXRpb246IE1hbmlmZXN0RW50cnlMb2NhdGlvbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtsb2NhdGlvbi5maWxlUGF0aH0jJHtsb2NhdGlvbi5uYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFVuaXF1ZU1hbmlmZXN0SWRzPFRFbnRyeT4oXG4gIGVudHJpZXNCeUZpbGU6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIFRFbnRyeT4+IHwgdW5kZWZpbmVkLFxuICBpZHM6IE1hcDxzdHJpbmcsIE1hbmlmZXN0RW50cnlMb2NhdGlvbj4sXG4gIGdldElkOiAoZW50cnk6IFRFbnRyeSkgPT4gc3RyaW5nLFxuICBsYWJlbDogJ3N0ZXAnIHwgJ3dvcmtmbG93J1xuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBlbnRyaWVzXSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzQnlGaWxlIHx8IHt9KSkge1xuICAgIGZvciAoY29uc3QgW25hbWUsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgICBjb25zdCBpZCA9IGdldElkKGRhdGEpO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBpZHMuZ2V0KGlkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB7IGZpbGVQYXRoLCBuYW1lIH07XG4gICAgICBpZiAoXG4gICAgICAgIGV4aXN0aW5nICYmXG4gICAgICAgIChleGlzdGluZy5maWxlUGF0aCAhPT0gY3VycmVudC5maWxlUGF0aCB8fFxuICAgICAgICAgIGV4aXN0aW5nLm5hbWUgIT09IGN1cnJlbnQubmFtZSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBpZE5hbWUgPSBsYWJlbCA9PT0gJ3N0ZXAnID8gJ3dvcmtmbG93IHN0ZXAgSUQnIDogJ3dvcmtmbG93IElEJztcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gYCR7bGFiZWx9IGZ1bmN0aW9uYDtcbiAgICAgICAgY29uc3QgY2FwaXRhbGl6ZWRMYWJlbCA9IGxhYmVsID09PSAnc3RlcCcgPyAnU3RlcCcgOiAnV29ya2Zsb3cnO1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dCdWlsZEVycm9yKFxuICAgICAgICAgIGBEdXBsaWNhdGUgJHtpZE5hbWV9IFwiJHtpZH1cIiBnZW5lcmF0ZWQgZm9yICR7Zm9ybWF0SWRMb2NhdGlvbihleGlzdGluZyl9IGFuZCAke2Zvcm1hdElkTG9jYXRpb24oY3VycmVudCl9LmAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDpcbiAgICAgICAgICAgICAgYCR7Y2FwaXRhbGl6ZWRMYWJlbH0gSURzIG11c3QgYmUgdW5pcXVlIGFjcm9zcyBhIGJ1aWxkLiBgICtcbiAgICAgICAgICAgICAgYElmIHlvdSBvd24gb25lIG9mIHRoZSBjb2xsaWRpbmcgZmlsZXMsIHJlbmFtZSB0aGUgJHtmdW5jdGlvbk5hbWV9IG9yIGV4cG9ydCBgICtcbiAgICAgICAgICAgICAgYHRoZSBwYWNrYWdlIGZpbGUgdGhyb3VnaCBhIHVuaXF1ZSBwYWNrYWdlIHN1YnBhdGguIElmIHRoZSBjb2xsaXNpb24gaXMgaW4gYSBgICtcbiAgICAgICAgICAgICAgYHRyYW5zaXRpdmUgZGVwZW5kZW5jeSB5b3UgZG9uJ3QgY29udHJvbCwgZmlsZSBhbiBpc3N1ZSB3aXRoIHRoZSB1cHN0cmVhbSBgICtcbiAgICAgICAgICAgICAgYHBhY2thZ2Ugb3IgcGluIHRvIGEgbm9uLWNvbGxpZGluZyB2ZXJzaW9uLmAsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWRzLnNldChpZCwgY3VycmVudCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlV29ya2Zsb3dNYW5pZmVzdChcbiAgdGFyZ2V0OiBXb3JrZmxvd01hbmlmZXN0LFxuICBpbmNvbWluZzogV29ya2Zsb3dNYW5pZmVzdCxcbiAgc3RlcElkczogTWFwPHN0cmluZywgTWFuaWZlc3RFbnRyeUxvY2F0aW9uPixcbiAgd29ya2Zsb3dJZHM6IE1hcDxzdHJpbmcsIE1hbmlmZXN0RW50cnlMb2NhdGlvbj5cbik6IHZvaWQge1xuICBhc3NlcnRVbmlxdWVNYW5pZmVzdElkcyhcbiAgICBpbmNvbWluZy5zdGVwcyxcbiAgICBzdGVwSWRzLFxuICAgIChkYXRhKSA9PiBkYXRhLnN0ZXBJZCxcbiAgICAnc3RlcCdcbiAgKTtcbiAgYXNzZXJ0VW5pcXVlTWFuaWZlc3RJZHMoXG4gICAgaW5jb21pbmcud29ya2Zsb3dzLFxuICAgIHdvcmtmbG93SWRzLFxuICAgIChkYXRhKSA9PiBkYXRhLndvcmtmbG93SWQsXG4gICAgJ3dvcmtmbG93J1xuICApO1xuXG4gIHRhcmdldC53b3JrZmxvd3MgPSBPYmplY3QuYXNzaWduKHRhcmdldC53b3JrZmxvd3MgfHwge30sIGluY29taW5nLndvcmtmbG93cyk7XG4gIHRhcmdldC5zdGVwcyA9IE9iamVjdC5hc3NpZ24odGFyZ2V0LnN0ZXBzIHx8IHt9LCBpbmNvbWluZy5zdGVwcyk7XG4gIHRhcmdldC5jbGFzc2VzID0gT2JqZWN0LmFzc2lnbih0YXJnZXQuY2xhc3NlcyB8fCB7fSwgaW5jb21pbmcuY2xhc3Nlcyk7XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3Igd29ya2Zsb3cgYnVpbGRlcnMuIFByb3ZpZGVzIGNvbW1vbiBidWlsZCBsb2dpYyBmb3IgdHJhbnNmb3JtaW5nXG4gKiB3b3JrZmxvdyBzb3VyY2UgZmlsZXMgaW50byBkZXBsb3lhYmxlIGJ1bmRsZXMgdXNpbmcgZXNidWlsZCBhbmQgU1dDLlxuICpcbiAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGJ1aWxkKCkgbWV0aG9kIHRvIGRlZmluZSBidWlsZGVyLXNwZWNpZmljIGxvZ2ljLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUJ1aWxkZXIge1xuICBwcm90ZWN0ZWQgY29uZmlnOiBXb3JrZmxvd0NvbmZpZztcblxuICAvKipcbiAgICogVHJhY2tzIHdoaWNoIGV4dGVybmFsIHBhY2thZ2VzIGhhdmUgYWxyZWFkeSBiZWVuIHdhcm5lZCBhYm91dFxuICAgKiB0byBhdm9pZCBkdXBsaWNhdGUgd2FybmluZ3MgYWNyb3NzIG11bHRpcGxlIGRpc2NvdmVyRW50cmllcygpIGNhbGxzLlxuICAgKi9cbiAgcHJpdmF0ZSB3YXJuZWRFeHRlcm5hbFBhY2thZ2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgd29ya2Zsb3dCdWlsZFN0YXJ0VGltZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHdvcmtmbG93QnVpbGRTdW1tYXJ5Q291bnQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogV29ya2Zsb3dDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNmb3JtUHJvamVjdFJvb3QoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucHJvamVjdFJvb3QgfHwgdGhpcy5jb25maWcud29ya2luZ0RpcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgbW9kdWxlU3BlY2lmaWVyUm9vdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5tb2R1bGVTcGVjaWZpZXJSb290IHx8IHRoaXMudHJhbnNmb3JtUHJvamVjdFJvb3Q7XG4gIH1cblxuICBwcm90ZWN0ZWQgbG9nQmFzZUJ1aWxkZXJJbmZvKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGJ1aWxkTG9nZ2VyLmRlYnVnKGFyZ3MubWFwKFN0cmluZykuam9pbignICcpKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRXb3JrZmxvd0J1aWxkVGltZXIoKTogdm9pZCB7XG4gICAgdGhpcy53b3JrZmxvd0J1aWxkU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0V29ya2Zsb3dCdWlsZER1cmF0aW9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIERhdGUubm93KCkgLSAodGhpcy53b3JrZmxvd0J1aWxkU3RhcnRUaW1lID8/IERhdGUubm93KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFdvcmtmbG93QnVpbGRUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLndvcmtmbG93QnVpbGRTdGFydFRpbWUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGdldFdvcmtmbG93QnVpbGRTdW1tYXJ5UHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMud29ya2Zsb3dCdWlsZFN1bW1hcnlDb3VudCA9PT0gMFxuICAgICAgPyAnd29ya2Zsb3dzIGJ1aWxkIGNvbXBsZXRlJ1xuICAgICAgOiAnd29ya2Zsb3dzIHJlYnVpbHQnO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dDcmVhdGVXb3JrZmxvd3NCdW5kbGVJbmZvKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcuc3VwcHJlc3NDcmVhdGVXb3JrZmxvd3NCdW5kbGVMb2dzKSB7XG4gICAgICB0aGlzLmxvZ0Jhc2VCdWlsZGVySW5mbyguLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvZ0NyZWF0ZVdlYmhvb2tCdW5kbGVJbmZvKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcuc3VwcHJlc3NDcmVhdGVXZWJob29rQnVuZGxlTG9ncykge1xuICAgICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2dDcmVhdGVNYW5pZmVzdEluZm8oLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5zdXBwcmVzc0NyZWF0ZU1hbmlmZXN0TG9ncykge1xuICAgICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gb3V0cHV0dGluZyBDSlMsIGVzYnVpbGQgcmVwbGFjZXMgYGltcG9ydC5tZXRhYCB3aXRoIGFuIGVtcHR5IG9iamVjdCxcbiAgICogbWFraW5nIGBpbXBvcnQubWV0YS51cmxgIChhbmQgYGltcG9ydC5tZXRhLnJlc29sdmVgKSB1bmRlZmluZWQuIFRoaXMgbWV0aG9kXG4gICAqIHJldHVybnMgYmFubmVyIGNvZGUgYW5kIGBkZWZpbmVgIGVudHJpZXMgdGhhdCBwb2x5ZmlsbCB0aGVtIHVzaW5nIENKU1xuICAgKiBlcXVpdmFsZW50cyAoYF9fZmlsZW5hbWVgLCBgcmVxdWlyZS5yZXNvbHZlYCkgc28gdXNlciBjb2RlIChlLmcuIFByaXNtYSlcbiAgICogdGhhdCByZWxpZXMgb24gYGltcG9ydC5tZXRhLnVybGAgd29ya3MgY29ycmVjdGx5IGluIGJ1bmRsZWQgQ0pTIG91dHB1dC5cbiAgICovXG4gIHByaXZhdGUgZ2V0Q2pzSW1wb3J0TWV0YVBvbHlmaWxsKGZvcm1hdDogc3RyaW5nKToge1xuICAgIGJhbm5lcjogc3RyaW5nO1xuICAgIGRlZmluZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfSB7XG4gICAgaWYgKGZvcm1hdCAhPT0gJ2NqcycpIHJldHVybiB7IGJhbm5lcjogJycsIGRlZmluZToge30gfTtcbiAgICByZXR1cm4ge1xuICAgICAgYmFubmVyOlxuICAgICAgICAndmFyIF9faW1wb3J0X21ldGFfdXJsID0gdHlwZW9mIF9fZmlsZW5hbWUgIT09IFwidW5kZWZpbmVkXCIgPyByZXF1aXJlKFwidXJsXCIpLnBhdGhUb0ZpbGVVUkwoX19maWxlbmFtZSkuaHJlZiA6IHVuZGVmaW5lZDtcXG4nICtcbiAgICAgICAgJ3ZhciBfX2ltcG9ydF9tZXRhX3Jlc29sdmUgPSB0eXBlb2YgcmVxdWlyZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgX19maWxlbmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAnICtcbiAgICAgICAgJz8gKHMpID0+IHJlcXVpcmUoXCJ1cmxcIikucGF0aFRvRmlsZVVSTChyZXF1aXJlLnJlc29sdmUocykpLmhyZWYgOiB1bmRlZmluZWQ7XFxuJyxcbiAgICAgIGRlZmluZToge1xuICAgICAgICAnaW1wb3J0Lm1ldGEudXJsJzogJ19faW1wb3J0X21ldGFfdXJsJyxcbiAgICAgICAgJ2ltcG9ydC5tZXRhLnJlc29sdmUnOiAnX19pbXBvcnRfbWV0YV9yZXNvbHZlJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIG91dHB1dHRpbmcgZnVsbHktYnVuZGxlZCBFU00sIENKUyBkZXBlbmRlbmNpZXMgdGhhdCBjYWxsIHJlcXVpcmUoKVxuICAgKiBmb3IgTm9kZS5qcyBidWlsdGlucyAoZS5nLiBkZWJ1ZyDihpIgcmVxdWlyZSgndHR5JykpIGJyZWFrIGJlY2F1c2UgZXNidWlsZCdzXG4gICAqIENKUy10by1FU00gX19yZXF1aXJlIHNoaW0gZG9lc24ndCBoYXZlIGFjY2VzcyB0byBhIHJlYWwgcmVxdWlyZSBmdW5jdGlvbi5cbiAgICogVGhpcyBiYW5uZXIgcHJvdmlkZXMgb25lIHZpYSBjcmVhdGVSZXF1aXJlIHNvIGJ1bmRsZWQgQ0pTIGNvZGUgd29ya3MgaW4gRVNNLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFc21SZXF1aXJlQmFubmVyKGZvcm1hdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoZm9ybWF0ICE9PSAnZXNtJykgcmV0dXJuICcnO1xuICAgIHJldHVybiAnaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSBhcyBfX2NyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcXG52YXIgcmVxdWlyZSA9IF9fY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xcbic7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgdGhlIGNvbXBsZXRlIGJ1aWxkIHByb2Nlc3MgZm9yIHdvcmtmbG93cy5cbiAgICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIHRvIGRlZmluZSB0aGVpciBzcGVjaWZpYyBidWlsZCBzdGVwcy5cbiAgICovXG4gIGFic3RyYWN0IGJ1aWxkKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRzY29uZmlnLmpzb24vanNjb25maWcuanNvbiBmb3IgdGhlIHByb2plY3QuXG4gICAqIFVzZWQgYnkgZXNidWlsZCB0byBwcm9wZXJseSByZXNvbHZlIG1vZHVsZSBpbXBvcnRzIGR1cmluZyBidW5kbGluZy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBmaW5kVHNDb25maWdQYXRoKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgY3dkID0gdGhpcy5jb25maWcud29ya2luZ0RpciB8fCBwcm9jZXNzLmN3ZCgpO1xuICAgIHJldHVybiBmaW5kVXAoWyd0c2NvbmZpZy5qc29uJywgJ2pzY29uZmlnLmpzb24nXSwgeyBjd2QgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzY292ZXJzIGFsbCBzb3VyY2UgZmlsZXMgaW4gdGhlIGNvbmZpZ3VyZWQgZGlyZWN0b3JpZXMuXG4gICAqIFNlYXJjaGVzIGZvciBUeXBlU2NyaXB0IGFuZCBKYXZhU2NyaXB0IGZpbGVzIHdoaWxlIGV4Y2x1ZGluZyBjb21tb24gYnVpbGRcbiAgICogYW5kIGRlcGVuZGVuY3kgZGlyZWN0b3JpZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0SW5wdXRGaWxlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgaWdub3JlID0gW1xuICAgICAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICAgICAnKiovLmdpdC8qKicsXG4gICAgICAnKiovLm5leHQvKionLFxuICAgICAgJyoqLy5uaXRyby8qKicsXG4gICAgICAnKiovLm51eHQvKionLFxuICAgICAgJyoqLy5vdXRwdXQvKionLFxuICAgICAgJyoqLy52ZXJjZWwvKionLFxuICAgICAgJyoqLy53b3JrZmxvdy1kYXRhLyoqJyxcbiAgICAgICcqKi8ud29ya2Zsb3ctdml0ZXN0LyoqJyxcbiAgICAgICcqKi8ud2VsbC1rbm93bi93b3JrZmxvdy8qKicsXG4gICAgICAnKiovLnN3Yy8qKicsXG4gICAgICAnKiovLnN2ZWx0ZS1raXQvKionLFxuICAgICAgJyoqLy50dXJiby8qKicsXG4gICAgICAnKiovLmNhY2hlLyoqJyxcbiAgICAgICcqKi8ueWFybi8qKicsXG4gICAgICAnKiovLnBucG0tc3RvcmUvKionLFxuICAgIF07XG5cbiAgICAvLyBVc2UgcmVsYXRpdmUgcGF0dGVybnMgd2l0aCBgY3dkYCBwZXIgZGlyZWN0b3J5IHNvIHRoYXQgYGRvdDogdHJ1ZWBcbiAgICAvLyBhcHBsaWVzIGNvbnNpc3RlbnRseSB0byBib3RoIHRoZSBzZWFyY2ggcGF0dGVybiAqYW5kKiB0aGUgaWdub3JlXG4gICAgLy8gcGF0dGVybnMuIFdoZW4gYWJzb2x1dGUgcGF0dGVybnMgYXJlIHVzZWQgd2l0aCB0aW55Z2xvYmJ5LCB0aGUgYCoqYFxuICAgIC8vIGluIGlnbm9yZSBwYXR0ZXJucyBkb2VzIG5vdCBtYXRjaCBkb3QtcHJlZml4ZWQgcGF0aCBzZWdtZW50cy5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0aGlzLmNvbmZpZy5kaXJzLm1hcCgoZGlyKSA9PiB7XG4gICAgICAgIGNvbnN0IGN3ZCA9IHJlc29sdmUodGhpcy5jb25maWcud29ya2luZ0RpciwgZGlyKTtcbiAgICAgICAgcmV0dXJuIGdsb2IoWycqKi8qLnt0cyx0c3gsbXRzLGN0cyxqcyxqc3gsbWpzLGNqc30nXSwge1xuICAgICAgICAgIGN3ZCxcbiAgICAgICAgICBpZ25vcmUsXG4gICAgICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiByZXN1bHRzLmZsYXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWNoZXMgZGlzY292ZXJlZCB3b3JrZmxvdyBlbnRyaWVzIGJ5IGlucHV0IGFycmF5IHJlZmVyZW5jZS5cbiAgICogVXNlcyBXZWFrTWFwIHRvIGFsbG93IGdhcmJhZ2UgY29sbGVjdGlvbiB3aGVuIGlucHV0IGFycmF5cyBhcmUgbm8gbG9uZ2VyIHJlZmVyZW5jZWQuXG4gICAqIFRoaXMgY2FjaGUgaXMgaW52YWxpZGF0ZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBpbnB1dHMgYXJyYXkgcmVmZXJlbmNlIGNoYW5nZXNcbiAgICogKGUuZy4sIHdoZW4gZmlsZXMgYXJlIGFkZGVkL3JlbW92ZWQgZHVyaW5nIHdhdGNoIG1vZGUpLlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNjb3ZlcmVkRW50cmllczogV2Vha01hcDxzdHJpbmdbXSwgRGlzY292ZXJlZEVudHJpZXM+ID1cbiAgICBuZXcgV2Vha01hcCgpO1xuXG4gIHB1YmxpYyBjbGVhckRpc2NvdmVyZWRFbnRyaWVzQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNjb3ZlcmVkRW50cmllcyA9IG5ldyBXZWFrTWFwKCk7XG4gIH1cblxuICAvKipcbiAgICogUHNldWRvLXBhY2thZ2VzIHRoYXQgc2hvdWxkIG5vdCBiZSBjaGVja2VkIGZvciB3b3JrZmxvdyBwYXR0ZXJucy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFBTRVVET19QQUNLQUdFUyA9IG5ldyBTZXQoW1xuICAgICdzZXJ2ZXItb25seScsXG4gICAgJ2NsaWVudC1vbmx5JyxcbiAgXSk7XG5cbiAgLyoqXG4gICAqIENoZWNrcyBlYWNoIHBhY2thZ2UgaW4gZXh0ZXJuYWxQYWNrYWdlcyBmb3Igd29ya2Zsb3cgcGF0dGVybnMgYW5kIGVtaXRzXG4gICAqIHdhcm5pbmdzIGlmIGFueSBjb250YWluIFwidXNlIHN0ZXBcIiwgXCJ1c2Ugd29ya2Zsb3dcIiBkaXJlY3RpdmVzLCBvclxuICAgKiBzZXJpYWxpemF0aW9uIGNsYXNzZXMuIFRoZXNlIHBhdHRlcm5zIHdpbGwgbm90IGJlIHRyYW5zZm9ybWVkIGJ5IHRoZVxuICAgKiB3b3JrZmxvdyBjb21waWxlciB3aGVuIHRoZSBwYWNrYWdlIGlzIGV4dGVybmFsaXplZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FybkFib3V0RXh0ZXJuYWxXb3JrZmxvd1BhY2thZ2VzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4dGVybmFsUGFja2FnZXMgPSB0aGlzLmNvbmZpZy5leHRlcm5hbFBhY2thZ2VzO1xuICAgIGlmICghZXh0ZXJuYWxQYWNrYWdlcz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IHBrZyBvZiBleHRlcm5hbFBhY2thZ2VzKSB7XG4gICAgICBpZiAoQmFzZUJ1aWxkZXIuUFNFVURPX1BBQ0tBR0VTLmhhcyhwa2cpKSBjb250aW51ZTtcbiAgICAgIGlmICh0aGlzLndhcm5lZEV4dGVybmFsUGFja2FnZXMuaGFzKHBrZykpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHBrZy5zdGFydHNXaXRoKCcuJykgfHxcbiAgICAgICAgcGtnLnN0YXJ0c1dpdGgoJy8nKSB8fFxuICAgICAgICBwa2cuc3RhcnRzV2l0aCgnJCcpIHx8XG4gICAgICAgIHBrZy5pbmNsdWRlcygnKicpIHx8XG4gICAgICAgIHBrZy5pbmNsdWRlcygnOicpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIENoZWNrIHBhY2thZ2UuanNvbiBkZXBlbmRlbmNpZXMgZm9yIEB3b3JrZmxvdy9zZXJkZSAoZmFzdCBwYXRoKVxuICAgICAgICBsZXQgaGFzV29ya2Zsb3dTZXJkZURlcCA9IGZhbHNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHBrZ0pzb25QYXRoID0gcmVxdWlyZS5yZXNvbHZlKGAke3BrZ30vcGFja2FnZS5qc29uYCwge1xuICAgICAgICAgICAgcGF0aHM6IFt0aGlzLmNvbmZpZy53b3JraW5nRGlyXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBwa2dKc29uU291cmNlID0gYXdhaXQgcmVhZEZpbGUocGtnSnNvblBhdGgsICd1dGYtOCcpO1xuICAgICAgICAgIGNvbnN0IHBrZ0pzb24gPSBKU09OLnBhcnNlKHBrZ0pzb25Tb3VyY2UpIGFzIHtcbiAgICAgICAgICAgIGRlcGVuZGVuY2llcz86IHVua25vd247XG4gICAgICAgICAgICBwZWVyRGVwZW5kZW5jaWVzPzogdW5rbm93bjtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9XG4gICAgICAgICAgICB0eXBlb2YgcGtnSnNvbi5kZXBlbmRlbmNpZXMgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICBwa2dKc29uLmRlcGVuZGVuY2llcyAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkocGtnSnNvbi5kZXBlbmRlbmNpZXMpXG4gICAgICAgICAgICAgID8gKHBrZ0pzb24uZGVwZW5kZW5jaWVzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICAgICAgICA6IHt9O1xuICAgICAgICAgIGNvbnN0IHBlZXJEZXBlbmRlbmNpZXMgPVxuICAgICAgICAgICAgdHlwZW9mIHBrZ0pzb24ucGVlckRlcGVuZGVuY2llcyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIHBrZ0pzb24ucGVlckRlcGVuZGVuY2llcyAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkocGtnSnNvbi5wZWVyRGVwZW5kZW5jaWVzKVxuICAgICAgICAgICAgICA/IChwa2dKc29uLnBlZXJEZXBlbmRlbmNpZXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgICAgICAgIDoge307XG4gICAgICAgICAgaGFzV29ya2Zsb3dTZXJkZURlcCA9XG4gICAgICAgICAgICBPYmplY3QuaGFzT3duKGRlcGVuZGVuY2llcywgJ0B3b3JrZmxvdy9zZXJkZScpIHx8XG4gICAgICAgICAgICBPYmplY3QuaGFzT3duKHBlZXJEZXBlbmRlbmNpZXMsICdAd29ya2Zsb3cvc2VyZGUnKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gcGFja2FnZS5qc29uIG5vdCByZXNvbHZhYmxlIC0gY29udGludWUgdG8gc291cmNlIGNoZWNrXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBzb3VyY2UgcGF0dGVybnMgKHRob3JvdWdoIHBhdGgpLlxuICAgICAgICAvLyBOb3RlOiByZXF1aXJlLnJlc29sdmUgb25seSBpbnNwZWN0cyB0aGUgcGFja2FnZSdzIG1haW4gZW50cnkgcG9pbnQuXG4gICAgICAgIC8vIElmIHdvcmtmbG93IGNvbnN0cnVjdHMgbGl2ZSBpbiBzdWItcGF0aHMgKGUuZy4gYG15LXBrZy93b3JrZmxvd3NgKSxcbiAgICAgICAgLy8gdGhleSB3b24ndCBiZSBkZXRlY3RlZCBoZXJlLiBUaGUgQHdvcmtmbG93L3NlcmRlIGRlcCBjaGVjayBhYm92ZVxuICAgICAgICAvLyBwYXJ0aWFsbHkgY292ZXJzIHNlcmRlIGNhc2VzLiBUaGlzIGlzIGFjY2VwdGFibGUgYXMgYSBiZXN0LWVmZm9ydFxuICAgICAgICAvLyBoZXVyaXN0aWMg4oCUIHRoZSBwcmltYXJ5IGZpeCBpcyBhdXRvLXJlbW92YWwgaW4gd2l0aFdvcmtmbG93KCkuXG4gICAgICAgIGxldCBoYXNVc2VTdGVwID0gZmFsc2U7XG4gICAgICAgIGxldCBoYXNVc2VXb3JrZmxvdyA9IGZhbHNlO1xuICAgICAgICBsZXQgaGFzU2VyZGUgPSBoYXNXb3JrZmxvd1NlcmRlRGVwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGVudHJ5UGF0aCA9IHJlcXVpcmUucmVzb2x2ZShwa2csIHtcbiAgICAgICAgICAgIHBhdGhzOiBbdGhpcy5jb25maWcud29ya2luZ0Rpcl0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3Qgc291cmNlID0gYXdhaXQgcmVhZEZpbGUoZW50cnlQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgICBjb25zdCBwYXR0ZXJucyA9IGRldGVjdFdvcmtmbG93UGF0dGVybnMoc291cmNlKTtcbiAgICAgICAgICBoYXNVc2VTdGVwID0gcGF0dGVybnMuaGFzVXNlU3RlcDtcbiAgICAgICAgICBoYXNVc2VXb3JrZmxvdyA9IHBhdHRlcm5zLmhhc1VzZVdvcmtmbG93O1xuICAgICAgICAgIGlmICghaGFzU2VyZGUpIHtcbiAgICAgICAgICAgIGhhc1NlcmRlID0gcGF0dGVybnMuaGFzU2VyZGU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBFbnRyeSBmaWxlIG5vdCByZXNvbHZhYmxlIG9yIG5vdCByZWFkYWJsZSAtIHVzZSB3aGF0IHdlIGhhdmVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaGFzVXNlU3RlcCAmJiAhaGFzVXNlV29ya2Zsb3cgJiYgIWhhc1NlcmRlKSBjb250aW51ZTtcblxuICAgICAgICAvLyBCdWlsZCBhIHNwZWNpZmljIGRlc2NyaXB0aW9uIG9mIHdoYXQgd2FzIGZvdW5kXG4gICAgICAgIGNvbnN0IGlzc3Vlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKGhhc1VzZVdvcmtmbG93KSBpc3N1ZXMucHVzaCgnXCJ1c2Ugd29ya2Zsb3dcIiBmdW5jdGlvbnMnKTtcbiAgICAgICAgaWYgKGhhc1VzZVN0ZXApIGlzc3Vlcy5wdXNoKCdcInVzZSBzdGVwXCIgZnVuY3Rpb25zJyk7XG4gICAgICAgIGlmIChoYXNTZXJkZSkgaXNzdWVzLnB1c2goJ3NlcmlhbGl6YXRpb24gY2xhc3NlcycpO1xuXG4gICAgICAgIHRoaXMud2FybmVkRXh0ZXJuYWxQYWNrYWdlcy5hZGQocGtnKTtcblxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFxcbiR7Y2hhbGsueWVsbG93KCfimqAnKX0gV2FybmluZzogJHtjaGFsay5ib2xkKGBcIiR7cGtnfVwiYCl9IGlzIGxpc3RlZCBpbiAke2NoYWxrLmJvbGQoJ2V4dGVybmFsUGFja2FnZXMnKX0gKCR7Y2hhbGsuYm9sZCgnc2VydmVyRXh0ZXJuYWxQYWNrYWdlcycpfSBpbiBOZXh0LmpzKSBidXQgY29udGFpbnMgd29ya2Zsb3cgY29kZSAoJHtpc3N1ZXMuam9pbignLCAnKX0pLmAgK1xuICAgICAgICAgICAgYFxcbiAgVGhpcyBjb2RlIHdpbGwgJHtjaGFsay5ib2xkKCdub3QnKX0gYmUgdHJhbnNmb3JtZWQgYnkgdGhlIHdvcmtmbG93IGNvbXBpbGVyLCB3aGljaCBjYW4gY2F1c2UgcnVudGltZSBmYWlsdXJlcy5gICtcbiAgICAgICAgICAgIGBcXG4gIFJlbW92ZSAke2NoYWxrLmJvbGQoYFwiJHtwa2d9XCJgKX0gZnJvbSAke2NoYWxrLmJvbGQoJ2V4dGVybmFsUGFja2FnZXMnKX0gKCR7Y2hhbGsuYm9sZCgnc2VydmVyRXh0ZXJuYWxQYWNrYWdlcycpfSBpbiBOZXh0LmpzKSB0byBmaXggdGhpcy5cXG5gXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQmVzdC1lZmZvcnQ6IGlmIGFueXRoaW5nIGdvZXMgd3JvbmcsIHNraXAgdGhpcyBwYWNrYWdlIHNpbGVudGx5XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGRpc2NvdmVyRW50cmllcyhcbiAgICBpbnB1dHM6IHN0cmluZ1tdLFxuICAgIG91dGRpcjogc3RyaW5nLFxuICAgIHRzY29uZmlnUGF0aD86IHN0cmluZ1xuICApOiBQcm9taXNlPERpc2NvdmVyZWRFbnRyaWVzPiB7XG4gICAgY29uc3QgcHJldmlvdXNSZXN1bHQgPSB0aGlzLmRpc2NvdmVyZWRFbnRyaWVzLmdldChpbnB1dHMpO1xuXG4gICAgaWYgKHByZXZpb3VzUmVzdWx0KSB7XG4gICAgICByZXR1cm4gcHJldmlvdXNSZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlOiBEaXNjb3ZlcmVkRW50cmllcyA9IHtcbiAgICAgIGRpc2NvdmVyZWRTdGVwczogbmV3IFNldCgpLFxuICAgICAgZGlzY292ZXJlZFdvcmtmbG93czogbmV3IFNldCgpLFxuICAgICAgZGlzY292ZXJlZFNlcmRlRmlsZXM6IG5ldyBTZXQoKSxcbiAgICB9O1xuXG4gICAgY29uc3QgZGlzY292ZXJTdGFydCA9IERhdGUubm93KCk7XG5cbiAgICAvLyBSZXNvbHZlIHRoZSBTREsgcnVudGltZSBzZXJkZSBlbnRyeSBwb2ludCBzbyB0aGF0IHRoZSBkaXNjb3ZlcnkgcGFzc1xuICAgIC8vIGRpc2NvdmVycyBjbGFzc2VzIGxpa2UgYFJ1bmAgdGhhdCBsaXZlIGluc2lkZSBTREsgcGFja2FnZXMuIFdpdGhvdXQgdGhpcyxcbiAgICAvLyBmaWxlcyBsaWtlIGBydW4uanNgIGFyZSBvbmx5IGRpc2NvdmVyZWQgd2hlbiB1c2VyIGNvZGUgaW1wb3J0cyB0aGVtLlxuICAgIC8vIFRoaXMgaXMgcmVzb2x2ZWQgaGVyZSAocmF0aGVyIHRoYW4gaW4gY2FsbGVycykgc28gdGhhdCB0aGUgb3JpZ2luYWxcbiAgICAvLyBgaW5wdXRzYCBhcnJheSByZWZlcmVuY2UgaXMgcHJlc2VydmVkIGZvciBXZWFrTWFwIGNhY2hpbmcg4oCUIGNhbGxlcnNcbiAgICAvLyBsaWtlIGNyZWF0ZVdvcmtmbG93c0J1bmRsZSBhbmQgY3JlYXRlU3RlcHNCdW5kbGUgY2FuIHNoYXJlIHRoZSBzYW1lXG4gICAgLy8gY2FjaGUgZW50cnkgd2hlbiB0aGV5IHBhc3MgdGhlIHNhbWUgaW5wdXRGaWxlcyBhcnJheS5cbiAgICBjb25zdCByZXNvbHZlZFdvcmtmbG93UnVudGltZSA9IGF3YWl0IGVuaGFuY2VkUmVzb2x2ZShcbiAgICAgIG91dGRpcixcbiAgICAgICdAd29ya2Zsb3cvY29yZS9ydW50aW1lL3J1bidcbiAgICApLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgZW50cnlQb2ludHMgPSByZXNvbHZlZFdvcmtmbG93UnVudGltZVxuICAgICAgPyBbLi4uaW5wdXRzLCByZXNvbHZlZFdvcmtmbG93UnVudGltZV1cbiAgICAgIDogaW5wdXRzO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlVHNjb25maWdQYXRoID1cbiAgICAgIHRzY29uZmlnUGF0aCA/PyAoYXdhaXQgdGhpcy5maW5kVHNDb25maWdQYXRoKCkpO1xuXG4gICAgYXdhaXQgZmFzdERpc2NvdmVyRW50cmllcyh7XG4gICAgICBlbnRyeVBvaW50cyxcbiAgICAgIHN0YXRlLFxuICAgICAgZGVmYXVsdFRzY29uZmlnUGF0aDogZWZmZWN0aXZlVHNjb25maWdQYXRoLFxuICAgICAgd29ya2luZ0RpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICB9KTtcblxuICAgIHRoaXMubG9nQmFzZUJ1aWxkZXJJbmZvKFxuICAgICAgYERpc2NvdmVyaW5nIHdvcmtmbG93IGRpcmVjdGl2ZXNgLFxuICAgICAgYCR7RGF0ZS5ub3coKSAtIGRpc2NvdmVyU3RhcnR9bXNgXG4gICAgKTtcblxuICAgIC8vIFdhcm4gYWJvdXQgZXh0ZXJuYWwgcGFja2FnZXMgdGhhdCBjb250YWluIHdvcmtmbG93IGNvZGVcbiAgICBhd2FpdCB0aGlzLndhcm5BYm91dEV4dGVybmFsV29ya2Zsb3dQYWNrYWdlcygpO1xuXG4gICAgdGhpcy5kaXNjb3ZlcmVkRW50cmllcy5zZXQoaW5wdXRzLCBzdGF0ZSk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBnZW5lcmF0ZWQgZmlsZXMgYXRvbWljYWxseSB3aGVyZSBwb3NzaWJsZS4gT24gV2luZG93cywgTmV4dC5qcyBjYW5cbiAgICogYnJpZWZseSBob2xkIGdlbmVyYXRlZCByb3V0ZSBmaWxlcyBvcGVuIHdoaWxlIGNvbXBpbGluZyB0aGVtLCB3aGljaCBtYWtlc1xuICAgKiByZW5hbWUtb3Zlci1leGlzdGluZyBmYWlsIHdpdGggRVBFUk0vRUFDQ0VTLiBJbiB0aGF0IGNhc2UsIGZhbGwgYmFjayB0byBhXG4gICAqIGRpcmVjdCBvdmVyd3JpdGUgc28gd2F0Y2ggcmVidWlsZHMgY2FuIHN0aWxsIG1ha2UgcHJvZ3Jlc3MuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdyaXRlR2VuZXJhdGVkRmlsZShcbiAgICB0YXJnZXRQYXRoOiBzdHJpbmcsXG4gICAgY29udGVudDogc3RyaW5nXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRlbXBQYXRoID0gYCR7dGFyZ2V0UGF0aH0uJHtyYW5kb21VVUlEKCl9LnRtcGA7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHRlbXBQYXRoLCBjb250ZW50KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmVuYW1lKHRlbXBQYXRoLCB0YXJnZXRQYXRoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZXJyb3JDb2RlID1cbiAgICAgICAgZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiAnY29kZScgaW4gZXJyb3JcbiAgICAgICAgICA/IChlcnJvciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGVcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChcbiAgICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyAmJlxuICAgICAgICAoZXJyb3JDb2RlID09PSAnRVBFUk0nIHx8IGVycm9yQ29kZSA9PT0gJ0VBQ0NFUycpXG4gICAgICApIHtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKHRhcmdldFBhdGgsIGNvbnRlbnQpO1xuICAgICAgICBhd2FpdCBybSh0ZW1wUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBkZWJ1ZyBpbmZvcm1hdGlvbiB0byBhIEpTT04gZmlsZSBmb3IgdHJvdWJsZXNob290aW5nIGJ1aWxkIGlzc3Vlcy5cbiAgICogVXNlcyBhdG9taWMgd3JpdGUgKHRlbXAgZmlsZSArIHJlbmFtZSkgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgd2hlblxuICAgKiBtdWx0aXBsZSBidWlsZHMgcnVuIGNvbmN1cnJlbnRseS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVEZWJ1Z0ZpbGUoXG4gICAgb3V0ZmlsZTogc3RyaW5nLFxuICAgIGRlYnVnRGF0YTogb2JqZWN0LFxuICAgIG1lcmdlPzogYm9vbGVhblxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcmVmaXggPSB0aGlzLmNvbmZpZy5kZWJ1Z0ZpbGVQcmVmaXggfHwgJyc7XG4gICAgY29uc3QgdGFyZ2V0UGF0aCA9IGAke2Rpcm5hbWUob3V0ZmlsZSl9LyR7cHJlZml4fSR7YmFzZW5hbWUob3V0ZmlsZSl9LmRlYnVnLmpzb25gO1xuICAgIGxldCBleGlzdGluZyA9IHt9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChtZXJnZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZSh0YXJnZXRQYXRoLCAndXRmOCcpO1xuICAgICAgICAgIGV4aXN0aW5nID0gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIEZpbGUgZG9lc24ndCBleGlzdCB5ZXQgb3IgaXMgY29ycnVwdGVkIC0gc3RhcnQgZnJlc2guXG4gICAgICAgICAgLy8gRG9uJ3QgbG9nIGVycm9yIGZvciBFTk9FTlQgKGZpbGUgbm90IGZvdW5kKSBhcyB0aGF0J3MgZXhwZWN0ZWQgb24gZmlyc3QgcnVuLlxuICAgICAgICAgIGlmICgoZSBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIHJlYWRpbmcgZGVidWcgZmlsZSwgc3RhcnRpbmcgZnJlc2g6JywgZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lcmdlZERhdGEgPSBKU09OLnN0cmluZ2lmeShcbiAgICAgICAge1xuICAgICAgICAgIC4uLmV4aXN0aW5nLFxuICAgICAgICAgIC4uLmRlYnVnRGF0YSxcbiAgICAgICAgfSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgMlxuICAgICAgKTtcblxuICAgICAgYXdhaXQgdGhpcy53cml0ZUdlbmVyYXRlZEZpbGUodGFyZ2V0UGF0aCwgbWVyZ2VkRGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHdyaXRlIGRlYnVnIGZpbGU6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIGFuZCBvcHRpb25hbGx5IHRocm93cyBvbiBlc2J1aWxkIGVycm9ycyBhbmQgd2FybmluZ3MuXG4gICAqIEBwYXJhbSB0aHJvd09uRXJyb3IgLSBJZiB0cnVlLCB0aHJvd3MgYW4gZXJyb3Igd2hlbiBlc2J1aWxkIGVycm9ycyBhcmUgcHJlc2VudFxuICAgKi9cbiAgcHJpdmF0ZSBsb2dFc2J1aWxkTWVzc2FnZXMoXG4gICAgcmVzdWx0OiB7IGVycm9ycz86IGFueVtdOyB3YXJuaW5ncz86IGFueVtdIH0sXG4gICAgcGhhc2U6IHN0cmluZyxcbiAgICB0aHJvd09uRXJyb3IgPSB0cnVlLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBzdXBwcmVzc1dhcm5pbmdzPzogYm9vbGVhbjtcbiAgICB9XG4gICk6IHZvaWQge1xuICAgIGlmIChyZXN1bHQuZXJyb3JzICYmIHJlc3VsdC5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihg4p2MIGVzYnVpbGQgZXJyb3JzIGluICR7cGhhc2V9OmApO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZXJyb3Igb2YgcmVzdWx0LmVycm9ycykge1xuICAgICAgICBjb25zb2xlLmVycm9yKGAgICR7ZXJyb3IudGV4dH1gKTtcbiAgICAgICAgZXJyb3JNZXNzYWdlcy5wdXNoKGVycm9yLnRleHQpO1xuICAgICAgICBpZiAoZXJyb3IubG9jYXRpb24pIHtcbiAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGAgICAgYXQgJHtlcnJvci5sb2NhdGlvbi5maWxlfToke2Vycm9yLmxvY2F0aW9uLmxpbmV9OiR7ZXJyb3IubG9jYXRpb24uY29sdW1ufWA7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihsb2NhdGlvbik7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlcy5wdXNoKGxvY2F0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhyb3dPbkVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBXb3JrZmxvd0J1aWxkRXJyb3IoXG4gICAgICAgICAgYEJ1aWxkIGZhaWxlZCBkdXJpbmcgJHtwaGFzZX06XFxuJHtlcnJvck1lc3NhZ2VzLmpvaW4oJ1xcbicpfWAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDogYFJldmlldyB0aGUgZXNidWlsZCBlcnJvcnMgYWJvdmUg4oCUIHRoZXkgY29tZSBmcm9tIHRoZSAke3BoYXNlfSBidW5kbGUuIEZpeCB0aGUgb2ZmZW5kaW5nIHNvdXJjZSBmaWxlcyBhbmQgcmUtcnVuIHRoZSBidWlsZC5gLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAhb3B0aW9ucz8uc3VwcHJlc3NXYXJuaW5ncyAmJlxuICAgICAgcmVzdWx0Lndhcm5pbmdzICYmXG4gICAgICByZXN1bHQud2FybmluZ3MubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKGAhICBlc2J1aWxkIHdhcm5pbmdzIGluICR7cGhhc2V9OmApO1xuICAgICAgZm9yIChjb25zdCB3YXJuaW5nIG9mIHJlc3VsdC53YXJuaW5ncykge1xuICAgICAgICBjb25zb2xlLndhcm4oYCAgJHt3YXJuaW5nLnRleHR9YCk7XG4gICAgICAgIGlmICh3YXJuaW5nLmxvY2F0aW9uKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYCAgICBhdCAke3dhcm5pbmcubG9jYXRpb24uZmlsZX06JHt3YXJuaW5nLmxvY2F0aW9uLmxpbmV9OiR7d2FybmluZy5sb2NhdGlvbi5jb2x1bW59YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYW4gYWJzb2x1dGUgZmlsZSBwYXRoIHRvIGEgbm9ybWFsaXplZCByZWxhdGl2ZSBwYXRoIGZvciB0aGUgbWFuaWZlc3QuXG4gICAqL1xuICBwcml2YXRlIGdldFJlbGF0aXZlRmlsZXBhdGgoYWJzb2x1dGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWxlID0gYWJzb2x1dGVQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICBjb25zdCBub3JtYWxpemVkV29ya2luZ0RpciA9IHRoaXMuY29uZmlnLndvcmtpbmdEaXIucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShub3JtYWxpemVkV29ya2luZ0Rpciwgbm9ybWFsaXplZEZpbGUpLnJlcGxhY2UoXG4gICAgICAvXFxcXC9nLFxuICAgICAgJy8nXG4gICAgKTtcbiAgICAvLyBIYW5kbGUgZmlsZXMgZGlzY292ZXJlZCBvdXRzaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeVxuICAgIGlmIChyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgIHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlUGF0aFxuICAgICAgICAuc3BsaXQoJy8nKVxuICAgICAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0ICE9PSAnLi4nKVxuICAgICAgICAuam9pbignLycpO1xuICAgIH1cbiAgICByZXR1cm4gcmVsYXRpdmVQYXRoO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVJvdXRlSW1wb3J0U3BlY2lmaWVyKGZpbGU6IHN0cmluZywgcm91dGVEaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBpbXBvcnRQYXRoLCBpc1BhY2thZ2UgfSA9IGdldEltcG9ydFBhdGgoXG4gICAgICBmaWxlLFxuICAgICAgdGhpcy5jb25maWcud29ya2luZ0RpclxuICAgICk7XG4gICAgaWYgKGlzUGFja2FnZSkge1xuICAgICAgcmV0dXJuIGltcG9ydFBhdGg7XG4gICAgfVxuXG4gICAgbGV0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlKHJvdXRlRGlyLCBmaWxlKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgaWYgKCFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi8nKSAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgIH1cbiAgICByZXR1cm4gcmVsYXRpdmVQYXRoO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVTdGVwU291cmNlUmVnaXN0cmF0aW9uRmlsZSh7XG4gICAgaW5wdXRGaWxlcyxcbiAgICBvdXRmaWxlLFxuICAgIHRzY29uZmlnUGF0aCxcbiAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgfToge1xuICAgIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICAgIG91dGZpbGU6IHN0cmluZztcbiAgICB0c2NvbmZpZ1BhdGg/OiBzdHJpbmc7XG4gICAgZGlzY292ZXJlZEVudHJpZXM/OiBEaXNjb3ZlcmVkRW50cmllcztcbiAgfSk6IFByb21pc2U8V29ya2Zsb3dNYW5pZmVzdD4ge1xuICAgIGNvbnN0IHN0ZXBzQnVuZGxlU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHdvcmtmbG93TWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3QgPSB7fTtcbiAgICBjb25zdCBidWlsdEluU3RlcHMgPSAnd29ya2Zsb3cvaW50ZXJuYWwvYnVpbHRpbnMnO1xuICAgIGNvbnN0IHJlc29sdmVkQnVpbHRJblN0ZXBzID0gKGF3YWl0IGVuaGFuY2VkUmVzb2x2ZShcbiAgICAgIGRpcm5hbWUob3V0ZmlsZSksXG4gICAgICBidWlsdEluU3RlcHNcbiAgICApLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd0J1aWxkRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcmVzb2x2ZSBidWlsdC1pbiBzdGVwcyBzb3VyY2VzLlxcblxcbkNhdXNlZCBieTogJHtTdHJpbmcoZXJyKX1gLFxuICAgICAgICB7XG4gICAgICAgICAgaGludDogJ3J1biBgcG5wbSBpbnN0YWxsIHdvcmtmbG93YCB0byByZXNvbHZlIHRoaXMgaXNzdWUuJyxcbiAgICAgICAgICBjYXVzZTogZXJyLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pKSBhcyBzdHJpbmc7XG5cbiAgICBjb25zdCBkaXNjb3ZlcmVkID1cbiAgICAgIGRpc2NvdmVyZWRFbnRyaWVzID8/XG4gICAgICAoYXdhaXQgdGhpcy5kaXNjb3ZlckVudHJpZXMoaW5wdXRGaWxlcywgZGlybmFtZShvdXRmaWxlKSwgdHNjb25maWdQYXRoKSk7XG4gICAgY29uc3Qgc3RlcEZpbGVzID0gWy4uLmRpc2NvdmVyZWQuZGlzY292ZXJlZFN0ZXBzXS5zb3J0KCk7XG4gICAgY29uc3Qgd29ya2Zsb3dGaWxlcyA9IFsuLi5kaXNjb3ZlcmVkLmRpc2NvdmVyZWRXb3JrZmxvd3NdLnNvcnQoKTtcbiAgICBjb25zdCBzZXJkZUZpbGVzID0gWy4uLmRpc2NvdmVyZWQuZGlzY292ZXJlZFNlcmRlRmlsZXNdLnNvcnQoKTtcbiAgICBjb25zdCBzdGVwRmlsZXNTZXQgPSBuZXcgU2V0KHN0ZXBGaWxlcyk7XG4gICAgY29uc3Qgc2VyZGVPbmx5RmlsZXMgPSBzZXJkZUZpbGVzLmZpbHRlcigoZikgPT4gIXN0ZXBGaWxlc1NldC5oYXMoZikpO1xuXG4gICAgYXdhaXQgdGhpcy53cml0ZURlYnVnRmlsZShvdXRmaWxlLCB7XG4gICAgICBzdGVwRmlsZXMsXG4gICAgICB3b3JrZmxvd0ZpbGVzLFxuICAgICAgc2VyZGVPbmx5RmlsZXMsXG4gICAgICBzb3VyY2VJbXBvcnRzOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZW1pdHRlZEltcG9ydElkZW50aXRpZXMgPSBuZXcgU2V0PHN0cmluZz4oW2J1aWx0SW5TdGVwc10pO1xuICAgIGNvbnN0IGltcG9ydFN0YXRlbWVudHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgcm91dGVEaXIgPSBkaXJuYW1lKG91dGZpbGUpO1xuICAgIGNvbnN0IGFkZFJlZ2lzdHJhdGlvbkltcG9ydCA9IChzcGVjaWZpZXI6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgaW1wb3J0U3RhdGVtZW50cy5wdXNoKGBpbXBvcnQgJHtKU09OLnN0cmluZ2lmeShzcGVjaWZpZXIpfTtgKTtcbiAgICB9O1xuICAgIGNvbnN0IGFkZFJlZ2lzdHJhdGlvbkZpbGVJbXBvcnQgPSAoZmlsZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBpZGVudGl0eSA9IG1vZHVsZUlkZW50aXR5S2V5KGZpbGUsIHRoaXMubW9kdWxlU3BlY2lmaWVyUm9vdCk7XG4gICAgICBpZiAoZW1pdHRlZEltcG9ydElkZW50aXRpZXMuaGFzKGlkZW50aXR5KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlbWl0dGVkSW1wb3J0SWRlbnRpdGllcy5hZGQoaWRlbnRpdHkpO1xuICAgICAgYWRkUmVnaXN0cmF0aW9uSW1wb3J0KHRoaXMuY3JlYXRlUm91dGVJbXBvcnRTcGVjaWZpZXIoZmlsZSwgcm91dGVEaXIpKTtcbiAgICB9O1xuXG4gICAgYWRkUmVnaXN0cmF0aW9uSW1wb3J0KGJ1aWx0SW5TdGVwcyk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHN0ZXBGaWxlcykge1xuICAgICAgYWRkUmVnaXN0cmF0aW9uRmlsZUltcG9ydChmaWxlKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHNlcmRlT25seUZpbGVzKSB7XG4gICAgICBhZGRSZWdpc3RyYXRpb25GaWxlSW1wb3J0KGZpbGUpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dCA9IGAvLyBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZCBmaWxlXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuJHtpbXBvcnRTdGF0ZW1lbnRzLmpvaW4oJ1xcbicpfVxuXG5leHBvcnQgY29uc3QgX19zdGVwc19yZWdpc3RlcmVkID0gdHJ1ZTtcbmA7XG4gICAgYXdhaXQgbWtkaXIoZGlybmFtZShvdXRmaWxlKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgY29uc3QgdGVtcFBhdGggPSBgJHtvdXRmaWxlfS4ke3JhbmRvbVVVSUQoKX0udG1wYDtcbiAgICBhd2FpdCB3cml0ZUZpbGUodGVtcFBhdGgsIG91dHB1dCk7XG4gICAgYXdhaXQgcmVuYW1lKHRlbXBQYXRoLCBvdXRmaWxlKTtcblxuICAgIGNvbnN0IG1hbmlmZXN0RmlsZXMgPSBBcnJheS5mcm9tKFxuICAgICAgbmV3IFNldChbLi4uc3RlcEZpbGVzLCAuLi5zZXJkZU9ubHlGaWxlcywgcmVzb2x2ZWRCdWlsdEluU3RlcHNdKVxuICAgICkuc29ydCgpO1xuICAgIGNvbnN0IHN0ZXBJZHMgPSBuZXcgTWFwPHN0cmluZywgTWFuaWZlc3RFbnRyeUxvY2F0aW9uPigpO1xuICAgIGNvbnN0IHdvcmtmbG93SWRzID0gbmV3IE1hcDxzdHJpbmcsIE1hbmlmZXN0RW50cnlMb2NhdGlvbj4oKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1hbmlmZXN0RmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKGZpbGUsICd1dGY4Jyk7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlRmlsZXBhdGggPSB0aGlzLmdldFJlbGF0aXZlRmlsZXBhdGgoZmlsZSk7XG4gICAgICAgIGNvbnN0IHsgd29ya2Zsb3dNYW5pZmVzdDogZmlsZU1hbmlmZXN0IH0gPSBhd2FpdCBhcHBseVN3Y1RyYW5zZm9ybShcbiAgICAgICAgICByZWxhdGl2ZUZpbGVwYXRoLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAnc3RlcCcsXG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybVByb2plY3RSb290LFxuICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWVyUm9vdFxuICAgICAgICApO1xuICAgICAgICBtZXJnZVdvcmtmbG93TWFuaWZlc3QoXG4gICAgICAgICAgd29ya2Zsb3dNYW5pZmVzdCxcbiAgICAgICAgICBmaWxlTWFuaWZlc3QsXG4gICAgICAgICAgc3RlcElkcyxcbiAgICAgICAgICB3b3JrZmxvd0lkc1xuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTd2NJZ25vcmVkKCk7XG4gICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oXG4gICAgICAnQ3JlYXRlZCBzdGVwIHJlZ2lzdHJhdGlvbnMnLFxuICAgICAgYCR7RGF0ZS5ub3coKSAtIHN0ZXBzQnVuZGxlU3RhcnR9bXNgXG4gICAgKTtcbiAgICByZXR1cm4gd29ya2Zsb3dNYW5pZmVzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYnVuZGxlIGZvciB3b3JrZmxvdyBzdGVwIGZ1bmN0aW9ucy5cbiAgICogU3RlcHMgaGF2ZSBmdWxsIE5vZGUuanMgcnVudGltZSBhY2Nlc3MgYW5kIGhhbmRsZSBzaWRlIGVmZmVjdHMsIEFQSSBjYWxscywgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0gZXh0ZXJuYWxpemVOb25TdGVwcyAtIElmIHRydWUsIG9ubHkgYnVuZGxlcyBzdGVwIGVudHJ5IHBvaW50cyBhbmQgZXh0ZXJuYWxpemVzIG90aGVyIGNvZGVcbiAgICogQHBhcmFtIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzIC0gSWYgdHJ1ZSwgZW1pdHMgYSBzb3VyY2UgaW1wb3J0IHJlZ2lzdHJhdGlvbiBmaWxlIGluc3RlYWQgb2YgYnVuZGxpbmcgc3RlcCByZWdpc3RyYXRpb25zXG4gICAqIEBwYXJhbSBidW5kbGVUcmFuc2l0aXZlTG9jYWxTdGVwRGVwZW5kZW5jaWVzIC0gSWYgdHJ1ZSwgYWxzbyBidW5kbGVzIHByb2plY3QtbG9jYWwgZmlsZXMgaW1wb3J0ZWQgYnkgc3RlcCBlbnRyaWVzIGZvciBkaXJlY3QgcnVudGltZSBsb2FkaW5nXG4gICAqIEByZXR1cm5zIEJ1aWxkIGNvbnRleHQgKGZvciB3YXRjaCBtb2RlKSBhbmQgdGhlIGNvbGxlY3RlZCB3b3JrZmxvdyBtYW5pZmVzdFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZVN0ZXBzQnVuZGxlKHtcbiAgICBpbnB1dEZpbGVzLFxuICAgIGZvcm1hdCA9ICdlc20nLFxuICAgIG91dGZpbGUsXG4gICAgZXh0ZXJuYWxpemVOb25TdGVwcyxcbiAgICBidW5kbGVUcmFuc2l0aXZlTG9jYWxTdGVwRGVwZW5kZW5jaWVzLFxuICAgIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzLFxuICAgIHJld3JpdGVUc0V4dGVuc2lvbnMsXG4gICAgdHNjb25maWdQYXRoLFxuICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgIHNraXBFc21SZXF1aXJlQmFubmVyID0gZmFsc2UsXG4gIH06IHtcbiAgICB0c2NvbmZpZ1BhdGg/OiBzdHJpbmc7XG4gICAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gICAgb3V0ZmlsZTogc3RyaW5nO1xuICAgIGZvcm1hdD86ICdjanMnIHwgJ2VzbSc7XG4gICAgZXh0ZXJuYWxpemVOb25TdGVwcz86IGJvb2xlYW47XG4gICAgYnVuZGxlVHJhbnNpdGl2ZUxvY2FsU3RlcERlcGVuZGVuY2llcz86IGJvb2xlYW47XG4gICAgc291cmNlU3RlcFJlZ2lzdHJhdGlvbkltcG9ydHM/OiBib29sZWFuO1xuICAgIHJld3JpdGVUc0V4dGVuc2lvbnM/OiBib29sZWFuO1xuICAgIGRpc2NvdmVyZWRFbnRyaWVzPzogRGlzY292ZXJlZEVudHJpZXM7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCBza2lwIHRoZSBgY3JlYXRlUmVxdWlyZWAgYmFubmVyIG9uIHRoZSBzdGVwcyBidW5kbGUuXG4gICAgICogVXNlZCBieSBgY3JlYXRlQ29tYmluZWRCdW5kbGVgIHdpdGggYGJ1bmRsZUZpbmFsT3V0cHV0OiB0cnVlYCB3aGVyZVxuICAgICAqIHRoZSBvdXRlciBlc2J1aWxkIHBhc3MgcHJvdmlkZXMgaXRzIG93biBiYW5uZXIsIHByZXZlbnRpbmcgdGhlXG4gICAgICogYF9fY3JlYXRlUmVxdWlyZWAgaWRlbnRpZmllciBmcm9tIGJlaW5nIGRlY2xhcmVkIHR3aWNlIGFmdGVyIGlubGluaW5nLlxuICAgICAqL1xuICAgIHNraXBFc21SZXF1aXJlQmFubmVyPzogYm9vbGVhbjtcbiAgfSk6IFByb21pc2U8e1xuICAgIGNvbnRleHQ6IGVzYnVpbGQuQnVpbGRDb250ZXh0IHwgdW5kZWZpbmVkO1xuICAgIG1hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0O1xuICB9PiB7XG4gICAgY29uc3Qgc3RlcHNCdW5kbGVTdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd29ya2Zsb3dNYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdCA9IHt9O1xuICAgIGNvbnN0IGJ1aWx0SW5TdGVwcyA9ICd3b3JrZmxvdy9pbnRlcm5hbC9idWlsdGlucyc7XG5cbiAgICBjb25zdCByZXNvbHZlZEJ1aWx0SW5TdGVwcyA9IGF3YWl0IGVuaGFuY2VkUmVzb2x2ZShcbiAgICAgIGRpcm5hbWUob3V0ZmlsZSksXG4gICAgICAnd29ya2Zsb3cvaW50ZXJuYWwvYnVpbHRpbnMnXG4gICAgKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dCdWlsZEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIHJlc29sdmUgYnVpbHQtaW4gc3RlcHMgc291cmNlcy5cXG5cXG5DYXVzZWQgYnk6ICR7U3RyaW5nKGVycil9YCxcbiAgICAgICAge1xuICAgICAgICAgIGhpbnQ6ICdydW4gYHBucG0gaW5zdGFsbCB3b3JrZmxvd2AgdG8gcmVzb2x2ZSB0aGlzIGlzc3VlLicsXG4gICAgICAgICAgY2F1c2U6IGVycixcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vIERpc2NvdmVyeSBvZiB3b3JrZmxvdy9zdGVwL3NlcmRlIGVudHJpZXMuIFRoZSBTREsgcnVudGltZSBlbnRyeSBwb2ludFxuICAgIC8vICh3b3JrZmxvdy9ydW50aW1lKSBpcyByZXNvbHZlZCBpbnNpZGUgZGlzY292ZXJFbnRyaWVzKCkgaXRzZWxmIHNvIHRoYXRcbiAgICAvLyBjYWxsZXJzIGNhbiBwYXNzIHRoZSBvcmlnaW5hbCBpbnB1dEZpbGVzIHJlZmVyZW5jZSBhbmQgYmVuZWZpdCBmcm9tXG4gICAgLy8gV2Vha01hcCBjYWNoaW5nIGFjcm9zcyBjcmVhdGVXb3JrZmxvd3NCdW5kbGUgLyBjcmVhdGVTdGVwc0J1bmRsZSBjYWxscy5cbiAgICBjb25zdCBkaXNjb3ZlcmVkID1cbiAgICAgIGRpc2NvdmVyZWRFbnRyaWVzID8/XG4gICAgICAoYXdhaXQgdGhpcy5kaXNjb3ZlckVudHJpZXMoaW5wdXRGaWxlcywgZGlybmFtZShvdXRmaWxlKSwgdHNjb25maWdQYXRoKSk7XG4gICAgY29uc3Qgc3RlcEZpbGVzID0gWy4uLmRpc2NvdmVyZWQuZGlzY292ZXJlZFN0ZXBzXS5zb3J0KCk7XG4gICAgY29uc3Qgd29ya2Zsb3dGaWxlcyA9IFsuLi5kaXNjb3ZlcmVkLmRpc2NvdmVyZWRXb3JrZmxvd3NdLnNvcnQoKTtcbiAgICBjb25zdCBzZXJkZUZpbGVzID0gWy4uLmRpc2NvdmVyZWQuZGlzY292ZXJlZFNlcmRlRmlsZXNdLnNvcnQoKTtcblxuICAgIC8vIEluY2x1ZGUgc2VyZGUgZmlsZXMgdGhhdCBhcmVuJ3QgYWxyZWFkeSBzdGVwIGZpbGVzIGZvciBjcm9zcy1jb250ZXh0IGNsYXNzIHJlZ2lzdHJhdGlvbi5cbiAgICAvLyBDbGFzc2VzIG5lZWQgdG8gYmUgcmVnaXN0ZXJlZCBpbiB0aGUgc3RlcCBidW5kbGUgc28gdGhleSBjYW4gYmUgZGVzZXJpYWxpemVkXG4gICAgLy8gd2hlbiByZWNlaXZpbmcgZGF0YSBmcm9tIHdvcmtmbG93cyBhbmQgc2VyaWFsaXplZCB3aGVuIHJldHVybmluZyBkYXRhIHRvIHdvcmtmbG93cy5cbiAgICBjb25zdCBzdGVwRmlsZXNTZXQgPSBuZXcgU2V0KHN0ZXBGaWxlcyk7XG4gICAgY29uc3Qgc2VyZGVPbmx5RmlsZXMgPSBzZXJkZUZpbGVzLmZpbHRlcigoZikgPT4gIXN0ZXBGaWxlc1NldC5oYXMoZikpO1xuXG4gICAgaWYgKFxuICAgICAgc291cmNlU3RlcFJlZ2lzdHJhdGlvbkltcG9ydHMgJiZcbiAgICAgIGV4dGVybmFsaXplTm9uU3RlcHMgJiZcbiAgICAgICFidW5kbGVUcmFuc2l0aXZlTG9jYWxTdGVwRGVwZW5kZW5jaWVzXG4gICAgKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZXh0OiB1bmRlZmluZWQsXG4gICAgICAgIG1hbmlmZXN0OiBhd2FpdCB0aGlzLmNyZWF0ZVN0ZXBTb3VyY2VSZWdpc3RyYXRpb25GaWxlKHtcbiAgICAgICAgICBpbnB1dEZpbGVzLFxuICAgICAgICAgIG91dGZpbGUsXG4gICAgICAgICAgdHNjb25maWdQYXRoLFxuICAgICAgICAgIGRpc2NvdmVyZWRFbnRyaWVzOiBkaXNjb3ZlcmVkLFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gbG9nIHRoZSBzdGVwIGZpbGVzIGZvciBkZWJ1Z2dpbmdcbiAgICBhd2FpdCB0aGlzLndyaXRlRGVidWdGaWxlKG91dGZpbGUsIHtcbiAgICAgIHN0ZXBGaWxlcyxcbiAgICAgIHdvcmtmbG93RmlsZXMsXG4gICAgICBzZXJkZU9ubHlGaWxlcyxcbiAgICB9KTtcblxuICAgIC8vIEhlbHBlciB0byBjcmVhdGUgaW1wb3J0IHN0YXRlbWVudCBmcm9tIGZpbGUgcGF0aFxuICAgIC8vIEZvciB3b3Jrc3BhY2Uvbm9kZV9tb2R1bGVzIHBhY2thZ2VzLCB1c2VzIHRoZSBwYWNrYWdlIG5hbWUgc28gZXNidWlsZFxuICAgIC8vIHdpbGwgcmVzb2x2ZSB0aHJvdWdoIHBhY2thZ2UuanNvbiBleHBvcnRzIHdpdGggdGhlIGFwcHJvcHJpYXRlIGNvbmRpdGlvbnNcbiAgICBjb25zdCBjcmVhdGVJbXBvcnQgPSAoZmlsZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkV29ya3NwYWNlUm9vdCA9IHRoaXMuY29uZmlnLndvcmtpbmdEaXJcbiAgICAgICAgLnJlcGxhY2UoL1xcXFwvZywgJy8nKVxuICAgICAgICAucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3Jrc3BhY2VGaWxlID0gZmlsZS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAvLyBPbmx5IHVzZSByZWxhdGl2ZSBzb3VyY2UgcGF0aHMgZm9yIHdvcmtzcGFjZSBzeW1saW5rcyAoZmlsZXNcbiAgICAgIC8vIG91dHNpZGUgbm9kZV9tb2R1bGVzIGluIGEgcGFja2FnZXMvKi9zcmMvIGRpcmVjdG9yeSkuIEZvciB0YXJiYWxsLVxuICAgICAgLy8gaW5zdGFsbGVkIHBhY2thZ2VzIChmaWxlcyBpbnNpZGUgbm9kZV9tb2R1bGVzLyksIGZhbGwgdGhyb3VnaCB0b1xuICAgICAgLy8gZ2V0SW1wb3J0UGF0aCB3aGljaCByZXR1cm5zIHBhY2thZ2Ugc3BlY2lmaWVycyDigJQgdGhpcyBhbGxvd3MgdGhlXG4gICAgICAvLyBTV0MgcGx1Z2luJ3MgZXh0ZXJuYWxpemVOb25TdGVwcyB0byB3b3JrIGNvcnJlY3RseS5cbiAgICAgIGNvbnN0IGlzV29ya3NwYWNlU291cmNlQmFja2VkUGFja2FnZUZpbGUgPVxuICAgICAgICBub3JtYWxpemVkV29ya3NwYWNlRmlsZS5pbmNsdWRlcygnL3BhY2thZ2VzLycpICYmXG4gICAgICAgIG5vcm1hbGl6ZWRXb3Jrc3BhY2VGaWxlLmluY2x1ZGVzKCcvc3JjLycpICYmXG4gICAgICAgICFub3JtYWxpemVkV29ya3NwYWNlRmlsZS5pbmNsdWRlcygnL25vZGVfbW9kdWxlcy8nKSAmJlxuICAgICAgICAhKFxuICAgICAgICAgIG5vcm1hbGl6ZWRXb3Jrc3BhY2VGaWxlID09PSBub3JtYWxpemVkV29ya3NwYWNlUm9vdCB8fFxuICAgICAgICAgIG5vcm1hbGl6ZWRXb3Jrc3BhY2VGaWxlLnN0YXJ0c1dpdGgoYCR7bm9ybWFsaXplZFdvcmtzcGFjZVJvb3R9L2ApXG4gICAgICAgICk7XG4gICAgICBjb25zdCBpc1NvdXJjZUJhY2tlZFBhY2thZ2VGaWxlID0gaXNXb3Jrc3BhY2VTb3VyY2VCYWNrZWRQYWNrYWdlRmlsZTtcblxuICAgICAgaWYgKGlzU291cmNlQmFja2VkUGFja2FnZUZpbGUpIHtcbiAgICAgICAgbGV0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlKFxuICAgICAgICAgIG5vcm1hbGl6ZWRXb3Jrc3BhY2VSb290LFxuICAgICAgICAgIG5vcm1hbGl6ZWRXb3Jrc3BhY2VGaWxlXG4gICAgICAgICkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLycpICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgaW1wb3J0ICcke3JlbGF0aXZlUGF0aH0nO2A7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgaW1wb3J0UGF0aCwgaXNQYWNrYWdlIH0gPSBnZXRJbXBvcnRQYXRoKFxuICAgICAgICBmaWxlLFxuICAgICAgICB0aGlzLmNvbmZpZy53b3JraW5nRGlyXG4gICAgICApO1xuXG4gICAgICBpZiAoaXNQYWNrYWdlKSB7XG4gICAgICAgIC8vIFVzZSBwYWNrYWdlIG5hbWUgLSBlc2J1aWxkIHdpbGwgcmVzb2x2ZSB2aWEgcGFja2FnZS5qc29uIGV4cG9ydHNcbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgJyR7aW1wb3J0UGF0aH0nO2A7XG4gICAgICB9XG5cbiAgICAgIC8vIExvY2FsIGFwcCBmaWxlIC0gdXNlIHJlbGF0aXZlIHBhdGhcbiAgICAgIC8vIE5vcm1hbGl6ZSBib3RoIHBhdGhzIHRvIGZvcndhcmQgc2xhc2hlcyBiZWZvcmUgY2FsbGluZyByZWxhdGl2ZSgpXG4gICAgICAvLyBUaGlzIGlzIGNyaXRpY2FsIG9uIFdpbmRvd3Mgd2hlcmUgcmVsYXRpdmUoKSBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMgd2l0aCBtaXhlZCBwYXRoIGZvcm1hdHNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICBjb25zdCBub3JtYWxpemVkRmlsZSA9IGZpbGUucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgLy8gQ2FsY3VsYXRlIHJlbGF0aXZlIHBhdGggZnJvbSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgZmlsZVxuICAgICAgbGV0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlKG5vcm1hbGl6ZWRXb3JraW5nRGlyLCBub3JtYWxpemVkRmlsZSkucmVwbGFjZShcbiAgICAgICAgL1xcXFwvZyxcbiAgICAgICAgJy8nXG4gICAgICApO1xuICAgICAgLy8gRW5zdXJlIHJlbGF0aXZlIHBhdGhzIHN0YXJ0IHdpdGggLi8gc28gZXNidWlsZCByZXNvbHZlcyB0aGVtIGNvcnJlY3RseS5cbiAgICAgIC8vIFBhdGhzIGxpa2UgXCIub3V0cHV0Ly4uLlwiIGFyZSBub3QgdmFsaWQgcmVsYXRpdmUgc3BlY2lmaWVycyBhbmQgbXVzdFxuICAgICAgLy8gYmVjb21lIFwiLi8ub3V0cHV0Ly4uLlwiLlxuICAgICAgaWYgKCFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi8nKSAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYGltcG9ydCAnJHtyZWxhdGl2ZVBhdGh9JztgO1xuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYSB2aXJ0dWFsIGVudHJ5IHRoYXQgaW1wb3J0cyBhbGwgZmlsZXMuIEFsbCBzdGVwIGRlZmluaXRpb25zXG4gICAgLy8gd2lsbCBnZXQgcmVnaXN0ZXJlZCB0aGFua3MgdG8gdGhlIHN3YyB0cmFuc2Zvcm0uXG4gICAgLy9cbiAgICAvLyBEZWR1cGUgaW1wb3J0cyBieSBjYW5vbmljYWwgbW9kdWxlIGlkZW50aXR5IHNvIHdlIG5ldmVyIGVtaXQgdHdvXG4gICAgLy8gaW1wb3J0IGxpbmVzIHRoYXQgcmVzb2x2ZSB0byB0aGUgc2FtZSBwaHlzaWNhbCBtb2R1bGUuIFByZS1zZWVkIHRoZVxuICAgIC8vIHNldCB3aXRoIHRoZSBidWlsdC1pbiBzdGVwcyBpbXBvcnQgc28gYSB3b3Jrc3BhY2Ugc3RlcCBmaWxlIGF0XG4gICAgLy8gYHBhY2thZ2VzL3dvcmtmbG93L3NyYy9pbnRlcm5hbC9idWlsdGlucy50c2AgZG9lc24ndCBlbWl0IGEgc2Vjb25kLFxuICAgIC8vIHJlbGF0aXZlLXBhdGggY29tcGV0aW5nIGltcG9ydCDigJQgZXNidWlsZCB3b3VsZCBvdGhlcndpc2UgdHJhbnNmb3JtXG4gICAgLy8gYm90aCBjb3BpZXMgYW5kIHRoZSBzd2MgcGx1Z2luIHdvdWxkIGdlbmVyYXRlIGR1cGxpY2F0ZSBzdGVwIElEcy5cbiAgICBjb25zdCBlbWl0dGVkSW1wb3J0SWRlbnRpdGllcyA9IG5ldyBTZXQ8c3RyaW5nPihbYnVpbHRJblN0ZXBzXSk7XG4gICAgY29uc3QgYnVpbGRJbXBvcnRzID0gKGZpbGVzOiBzdHJpbmdbXSk6IHN0cmluZyA9PlxuICAgICAgZmlsZXNcbiAgICAgICAgLmZpbHRlcigoZmlsZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkZW50aXR5ID0gbW9kdWxlSWRlbnRpdHlLZXkoZmlsZSwgdGhpcy5tb2R1bGVTcGVjaWZpZXJSb290KTtcbiAgICAgICAgICBpZiAoZW1pdHRlZEltcG9ydElkZW50aXRpZXMuaGFzKGlkZW50aXR5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIGVtaXR0ZWRJbXBvcnRJZGVudGl0aWVzLmFkZChpZGVudGl0eSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoY3JlYXRlSW1wb3J0KVxuICAgICAgICAuam9pbignXFxuJyk7XG5cbiAgICBjb25zdCBzdGVwSW1wb3J0cyA9IGJ1aWxkSW1wb3J0cyhzdGVwRmlsZXMpO1xuXG4gICAgLy8gSW5jbHVkZSBzZXJkZS1vbmx5IGZpbGVzIGZvciBjbGFzcyByZWdpc3RyYXRpb24gc2lkZSBlZmZlY3RzXG4gICAgY29uc3Qgc2VyZGVJbXBvcnRzID0gYnVpbGRJbXBvcnRzKHNlcmRlT25seUZpbGVzKTtcblxuICAgIGNvbnN0IGVudHJ5Q29udGVudCA9IGBcbiAgICAvLyBCdWlsdCBpbiBzdGVwc1xuICAgIGltcG9ydCAnJHtidWlsdEluU3RlcHN9JztcbiAgICAvLyBVc2VyIHN0ZXBzXG4gICAgJHtzdGVwSW1wb3J0c31cbiAgICAvLyBTZXJkZSBmaWxlcyBmb3IgY3Jvc3MtY29udGV4dCBjbGFzcyByZWdpc3RyYXRpb25cbiAgICAke3NlcmRlSW1wb3J0c31cbiAgICAvLyBTZW50aW5lbCBleHBvcnQgc28gYnVuZGxlcnMgKHJvbGx1cCkgZG9uJ3QgdHJlZS1zaGFrZSB0aGlzIG1vZHVsZVxuICAgIC8vIHdoZW4gaXQncyBpbXBvcnRlZCBhcyBhIHNpZGUtZWZmZWN0LW9ubHkgZGVwZW5kZW5jeS5cbiAgICBleHBvcnQgY29uc3QgX19zdGVwc19yZWdpc3RlcmVkID0gdHJ1ZTtgO1xuXG4gICAgLy8gQnVuZGxlIHdpdGggZXNidWlsZCBhbmQgb3VyIGN1c3RvbSBTV0MgcGx1Z2luXG4gICAgY29uc3QgZW50cmllc1RvQnVuZGxlID0gZXh0ZXJuYWxpemVOb25TdGVwc1xuICAgICAgPyBbXG4gICAgICAgICAgLi4uc3RlcEZpbGVzLFxuICAgICAgICAgIC4uLnNlcmRlRmlsZXMsXG4gICAgICAgICAgLi4uKHJlc29sdmVkQnVpbHRJblN0ZXBzID8gW3Jlc29sdmVkQnVpbHRJblN0ZXBzXSA6IFtdKSxcbiAgICAgICAgXVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm9ybWFsaXplZEVudHJpZXNUb0J1bmRsZSA9IGVudHJpZXNUb0J1bmRsZVxuICAgICAgPyBhd2FpdCB3aXRoUmVhbHBhdGhzKGVudHJpZXNUb0J1bmRsZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTaWRlRWZmZWN0RW50cmllcyA9IGF3YWl0IHdpdGhSZWFscGF0aHMoW1xuICAgICAgLi4uc3RlcEZpbGVzLFxuICAgICAgLi4uc2VyZGVPbmx5RmlsZXMsXG4gICAgICAuLi4ocmVzb2x2ZWRCdWlsdEluU3RlcHMgPyBbcmVzb2x2ZWRCdWlsdEluU3RlcHNdIDogW10pLFxuICAgIF0pO1xuICAgIGNvbnN0IGVzYnVpbGRUc2NvbmZpZ09wdGlvbnMgPVxuICAgICAgYXdhaXQgZ2V0RXNidWlsZFRzY29uZmlnT3B0aW9ucyh0c2NvbmZpZ1BhdGgpO1xuICAgIGNvbnN0IHsgYmFubmVyOiBpbXBvcnRNZXRhQmFubmVyLCBkZWZpbmU6IGltcG9ydE1ldGFEZWZpbmUgfSA9XG4gICAgICB0aGlzLmdldENqc0ltcG9ydE1ldGFQb2x5ZmlsbChmb3JtYXQpO1xuICAgIGNvbnN0IGVzbVJlcXVpcmVCYW5uZXIgPSBza2lwRXNtUmVxdWlyZUJhbm5lclxuICAgICAgPyAnJ1xuICAgICAgOiB0aGlzLmdldEVzbVJlcXVpcmVCYW5uZXIoZm9ybWF0KTtcblxuICAgIGNvbnN0IGVzYnVpbGRDdHggPSBhd2FpdCBlc2J1aWxkLmNvbnRleHQoe1xuICAgICAgYmFubmVyOiB7XG4gICAgICAgIGpzOiBgLy8gYmlvbWUtaWdub3JlLWFsbCBsaW50OiBnZW5lcmF0ZWQgZmlsZVxcbi8qIGVzbGludC1kaXNhYmxlICovXFxuJHtpbXBvcnRNZXRhQmFubmVyfSR7ZXNtUmVxdWlyZUJhbm5lcn1gLFxuICAgICAgfSxcbiAgICAgIHN0ZGluOiB7XG4gICAgICAgIGNvbnRlbnRzOiBlbnRyeUNvbnRlbnQsXG4gICAgICAgIHJlc29sdmVEaXI6IHRoaXMuY29uZmlnLndvcmtpbmdEaXIsXG4gICAgICAgIHNvdXJjZWZpbGU6ICd2aXJ0dWFsLWVudHJ5LmpzJyxcbiAgICAgICAgbG9hZGVyOiAnanMnLFxuICAgICAgfSxcbiAgICAgIG91dGZpbGUsXG4gICAgICBhYnNXb3JraW5nRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgZm9ybWF0LFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIGNvbmRpdGlvbnM6IFsnbm9kZSddLFxuICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgIHdyaXRlOiB0cnVlLFxuICAgICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgICBrZWVwTmFtZXM6IHRydWUsXG4gICAgICBtaW5pZnk6IGZhbHNlLFxuICAgICAganN4OiAncHJlc2VydmUnLFxuICAgICAgbG9nTGV2ZWw6ICdlcnJvcicsXG4gICAgICAvLyBVc2UgdHNjb25maWcgZm9yIHBhdGggYWxpYXMgcmVzb2x1dGlvbi5cbiAgICAgIC8vIEZvciBzeW1saW5rZWQgY29uZmlncyB0aGlzIHVzZXMgdHNjb25maWdSYXcgdG8gcHJlc2VydmUgY3dkLXJlbGF0aXZlIGFsaWFzZXMuXG4gICAgICAuLi5lc2J1aWxkVHNjb25maWdPcHRpb25zLFxuICAgICAgZGVmaW5lOiBpbXBvcnRNZXRhRGVmaW5lLFxuICAgICAgcmVzb2x2ZUV4dGVuc2lvbnM6IFtcbiAgICAgICAgJy50cycsXG4gICAgICAgICcudHN4JyxcbiAgICAgICAgJy5tdHMnLFxuICAgICAgICAnLmN0cycsXG4gICAgICAgICcuanMnLFxuICAgICAgICAnLmpzeCcsXG4gICAgICAgICcubWpzJyxcbiAgICAgICAgJy5janMnLFxuICAgICAgXSxcbiAgICAgIC8vIFNvdXJjZSBtYXBzIGZvciBiZXR0ZXIgc3RhY2sgdHJhY2VzIGluIHN0ZXAgZXhlY3V0aW9uLiBTdGVwcyBleGVjdXRlXG4gICAgICAvLyBpbiBOb2RlLmpzIGNvbnRleHQgYW5kIGlubGluZSBzb3VyY2VtYXBzIGdpdmUgbWVhbmluZ2Z1bCBzdGFjayB0cmFjZXNcbiAgICAgIC8vIHdpdGggcHJvcGVyIGZpbGUgbmFtZXMgYW5kIGxpbmUgbnVtYmVycyB3aGVuIGVycm9ycyBvY2N1ciBpbiBkZWVwbHlcbiAgICAgIC8vIG5lc3RlZCBmdW5jdGlvbiBjYWxscyBhY3Jvc3MgbXVsdGlwbGUgZmlsZXMuIERlZmF1bHRzIHRvIGlubGluZSBpblxuICAgICAgLy8gZGV2ZWxvcG1lbnQgYW5kIG9mZiBpbiBwcm9kdWN0aW9uIChzZWUgYGRlZmF1bHRTb3VyY2VtYXBNb2RlYCkgdG8ga2VlcFxuICAgICAgLy8gcHJvZHVjdGlvbiBmdW5jdGlvbiBidW5kbGVzIHNtYWxsOyBvdmVycmlkZSB3aXRoIHRoZSBgc291cmNlbWFwYFxuICAgICAgLy8gY29uZmlnIG9wdGlvbiBvciB0aGUgYFdPUktGTE9XX1NPVVJDRU1BUGAgZW52IHZhci5cbiAgICAgIHNvdXJjZW1hcDogdGhpcy5yZXNvbHZlU291cmNlbWFwKHRoaXMuZGVmYXVsdFNvdXJjZW1hcE1vZGUpLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICAvLyBIYW5kbGUgcHNldWRvLXBhY2thZ2VzIGxpa2UgJ3NlcnZlci1vbmx5JyBhbmQgJ2NsaWVudC1vbmx5JyBieSBwcm92aWRpbmdcbiAgICAgICAgLy8gZW1wdHkgbW9kdWxlcy4gTXVzdCBydW4gZmlyc3QgdG8gaW50ZXJjZXB0IHRoZXNlIGJlZm9yZSBvdGhlciByZXNvbHV0aW9uLlxuICAgICAgICBjcmVhdGVQc2V1ZG9QYWNrYWdlUGx1Z2luKCksXG4gICAgICAgIGNyZWF0ZVN3Y1BsdWdpbih7XG4gICAgICAgICAgbW9kZTogJ3N0ZXAnLFxuICAgICAgICAgIGVudHJpZXNUb0J1bmRsZTogbm9ybWFsaXplZEVudHJpZXNUb0J1bmRsZSxcbiAgICAgICAgICBvdXRkaXI6IG91dGZpbGUgPyBkaXJuYW1lKG91dGZpbGUpIDogdW5kZWZpbmVkLFxuICAgICAgICAgIHByb2plY3RSb290OiB0aGlzLnRyYW5zZm9ybVByb2plY3RSb290LFxuICAgICAgICAgIG1vZHVsZVNwZWNpZmllclJvb3Q6IHRoaXMubW9kdWxlU3BlY2lmaWVyUm9vdCxcbiAgICAgICAgICB3b3JrZmxvd01hbmlmZXN0LFxuICAgICAgICAgIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXMsXG4gICAgICAgICAgcmV3cml0ZVRzRXh0ZW5zaW9ucyxcbiAgICAgICAgICBzaWRlRWZmZWN0RW50cmllczogbm9ybWFsaXplZFNpZGVFZmZlY3RFbnRyaWVzLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgICAvLyBQbHVnaW4gc2hvdWxkIGNhdGNoIG1vc3QgdGhpbmdzLCBidXQgdGhpcyBsZXRzIHVzZXJzIGhhcmQgb3ZlcnJpZGVcbiAgICAgIC8vIGlmIHRoZSBwbHVnaW4gbWlzc2VzIGFueXRoaW5nIHRoYXQgc2hvdWxkIGJlIGV4dGVybmFsaXplZFxuICAgICAgZXh0ZXJuYWw6IFsnYnVuJywgJ2J1bjoqJywgLi4uKHRoaXMuY29uZmlnLmV4dGVybmFsUGFja2FnZXMgfHwgW10pXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN0ZXBzUmVzdWx0ID0gYXdhaXQgZXNidWlsZEN0eC5yZWJ1aWxkKCk7XG5cbiAgICB0aGlzLmxvZ0VzYnVpbGRNZXNzYWdlcyhzdGVwc1Jlc3VsdCwgJ3N0ZXBzIGJ1bmRsZSBjcmVhdGlvbicpO1xuICAgIHRoaXMubG9nQmFzZUJ1aWxkZXJJbmZvKFxuICAgICAgJ0NyZWF0ZWQgc3RlcHMgYnVuZGxlJyxcbiAgICAgIGAke0RhdGUubm93KCkgLSBzdGVwc0J1bmRsZVN0YXJ0fW1zYFxuICAgICk7XG5cbiAgICAvLyBIYW5kbGUgd29ya2Zsb3ctb25seSBmaWxlcyB0aGF0IG1heSBoYXZlIGJlZW4gdHJlZS1zaGFrZW4gZnJvbSB0aGUgYnVuZGxlLlxuICAgIC8vIFRoZXNlIGZpbGVzIGhhdmUgbm8gc3RlcHMsIHNvIGVzYnVpbGQgcmVtb3ZlcyB0aGVtLCBidXQgd2Ugc3RpbGwgbmVlZCB0aGVpclxuICAgIC8vIHdvcmtmbG93IG1ldGFkYXRhIGZvciB0aGUgbWFuaWZlc3QuIFRyYW5zZm9ybSB0aGVtIHNlcGFyYXRlbHkuXG4gICAgY29uc3Qgd29ya2Zsb3dPbmx5RmlsZXMgPSB3b3JrZmxvd0ZpbGVzLmZpbHRlcihcbiAgICAgIChmKSA9PiAhc3RlcEZpbGVzLmluY2x1ZGVzKGYpXG4gICAgKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHdvcmtmbG93T25seUZpbGVzLm1hcChhc3luYyAod29ya2Zsb3dGaWxlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc291cmNlID0gYXdhaXQgcmVhZEZpbGUod29ya2Zsb3dGaWxlLCAndXRmOCcpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlRmlsZXBhdGggPSB0aGlzLmdldFJlbGF0aXZlRmlsZXBhdGgod29ya2Zsb3dGaWxlKTtcbiAgICAgICAgICBjb25zdCB7IHdvcmtmbG93TWFuaWZlc3Q6IGZpbGVNYW5pZmVzdCB9ID0gYXdhaXQgYXBwbHlTd2NUcmFuc2Zvcm0oXG4gICAgICAgICAgICByZWxhdGl2ZUZpbGVwYXRoLFxuICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgJ3dvcmtmbG93JyxcbiAgICAgICAgICAgIHdvcmtmbG93RmlsZSxcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtUHJvamVjdFJvb3QsXG4gICAgICAgICAgICB0aGlzLm1vZHVsZVNwZWNpZmllclJvb3RcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChmaWxlTWFuaWZlc3Qud29ya2Zsb3dzKSB7XG4gICAgICAgICAgICB3b3JrZmxvd01hbmlmZXN0LndvcmtmbG93cyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3Qud29ya2Zsb3dzIHx8IHt9LFxuICAgICAgICAgICAgICBmaWxlTWFuaWZlc3Qud29ya2Zsb3dzXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmlsZU1hbmlmZXN0LmNsYXNzZXMpIHtcbiAgICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3QuY2xhc3NlcyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3QuY2xhc3NlcyB8fCB7fSxcbiAgICAgICAgICAgICAgZmlsZU1hbmlmZXN0LmNsYXNzZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIExvZyB3YXJuaW5nIGJ1dCBjb250aW51ZSAtIGRvbid0IGZhaWwgYnVpbGQgZm9yIHdvcmtmbG93LW9ubHkgZmlsZSBpc3N1ZXNcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgV2FybmluZzogRmFpbGVkIHRvIGV4dHJhY3Qgd29ya2Zsb3cgbWV0YWRhdGEgZnJvbSAke3dvcmtmbG93RmlsZX06YCxcbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGF3YWl0IHRoaXMuZW5zdXJlU3djSWdub3JlZCgpO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLndhdGNoKSB7XG4gICAgICByZXR1cm4geyBjb250ZXh0OiBlc2J1aWxkQ3R4LCBtYW5pZmVzdDogd29ya2Zsb3dNYW5pZmVzdCB9O1xuICAgIH1cbiAgICBhd2FpdCBlc2J1aWxkQ3R4LmRpc3Bvc2UoKTtcbiAgICByZXR1cm4geyBjb250ZXh0OiB1bmRlZmluZWQsIG1hbmlmZXN0OiB3b3JrZmxvd01hbmlmZXN0IH07XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGJ1bmRsZSBmb3Igd29ya2Zsb3cgb3JjaGVzdHJhdGlvbiBmdW5jdGlvbnMuXG4gICAqIFdvcmtmbG93cyBydW4gaW4gYSBzYW5kYm94ZWQgVk0gYW5kIGNvb3JkaW5hdGUgc3RlcCBleGVjdXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBidW5kbGVGaW5hbE91dHB1dCAtIElmIGZhbHNlLCBza2lwcyB0aGUgZmluYWwgYnVuZGxpbmcgc3RlcCAodXNlZCBieSBOZXh0LmpzKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZVdvcmtmbG93c0J1bmRsZSh7XG4gICAgaW5wdXRGaWxlcyxcbiAgICBmb3JtYXQgPSAnZXNtJyxcbiAgICBvdXRmaWxlLFxuICAgIGJ1bmRsZUZpbmFsT3V0cHV0ID0gdHJ1ZSxcbiAgICBrZWVwSW50ZXJpbUJ1bmRsZUNvbnRleHQgPSB0aGlzLmNvbmZpZy53YXRjaCxcbiAgICB0c2NvbmZpZ1BhdGgsXG4gICAgZGlzY292ZXJlZEVudHJpZXMsXG4gIH06IHtcbiAgICB0c2NvbmZpZ1BhdGg/OiBzdHJpbmc7XG4gICAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gICAgb3V0ZmlsZTogc3RyaW5nO1xuICAgIGZvcm1hdD86ICdjanMnIHwgJ2VzbSc7XG4gICAgYnVuZGxlRmluYWxPdXRwdXQ/OiBib29sZWFuO1xuICAgIGtlZXBJbnRlcmltQnVuZGxlQ29udGV4dD86IGJvb2xlYW47XG4gICAgZGlzY292ZXJlZEVudHJpZXM/OiBEaXNjb3ZlcmVkRW50cmllcztcbiAgfSk6IFByb21pc2U8e1xuICAgIG1hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0O1xuICAgIGludGVyaW1CdW5kbGVDdHg/OiBlc2J1aWxkLkJ1aWxkQ29udGV4dDtcbiAgICBidW5kbGVGaW5hbD86IChpbnRlcmltQnVuZGxlUmVzdWx0OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gICAgLyoqIFRoZSByYXcgd29ya2Zsb3cgVk0gY29kZSAoYmVmb3JlIHdyYXBwaW5nIHdpdGggZW50cnlwb2ludCkgKi9cbiAgICBpbnRlcmltQnVuZGxlVGV4dD86IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IGRpc2NvdmVyZWQgPVxuICAgICAgZGlzY292ZXJlZEVudHJpZXMgPz9cbiAgICAgIChhd2FpdCB0aGlzLmRpc2NvdmVyRW50cmllcyhpbnB1dEZpbGVzLCBkaXJuYW1lKG91dGZpbGUpLCB0c2NvbmZpZ1BhdGgpKTtcbiAgICBjb25zdCB3b3JrZmxvd0ZpbGVzID0gWy4uLmRpc2NvdmVyZWQuZGlzY292ZXJlZFdvcmtmbG93c10uc29ydCgpO1xuICAgIGNvbnN0IHNlcmRlRmlsZXMgPSBbLi4uZGlzY292ZXJlZC5kaXNjb3ZlcmVkU2VyZGVGaWxlc10uc29ydCgpO1xuXG4gICAgLy8gSW5jbHVkZSBzZXJkZSBmaWxlcyB0aGF0IGFyZW4ndCBhbHJlYWR5IHdvcmtmbG93IGZpbGVzIGZvciBjcm9zcy1jb250ZXh0IGNsYXNzIHJlZ2lzdHJhdGlvbi5cbiAgICAvLyBDbGFzc2VzIG5lZWQgdG8gYmUgcmVnaXN0ZXJlZCBpbiB0aGUgd29ya2Zsb3cgYnVuZGxlIHNvIHRoZXkgY2FuIGJlIGRlc2VyaWFsaXplZFxuICAgIC8vIHdoZW4gcmVjZWl2aW5nIGRhdGEgZnJvbSBzdGVwcyBvciB3aGVuIHNlcmlhbGl6aW5nIGRhdGEgdG8gc2VuZCB0byBzdGVwcy5cbiAgICBjb25zdCB3b3JrZmxvd0ZpbGVzU2V0ID0gbmV3IFNldCh3b3JrZmxvd0ZpbGVzKTtcbiAgICBjb25zdCBzZXJkZU9ubHlGaWxlcyA9IHNlcmRlRmlsZXMuZmlsdGVyKChmKSA9PiAhd29ya2Zsb3dGaWxlc1NldC5oYXMoZikpO1xuXG4gICAgLy8gbG9nIHRoZSB3b3JrZmxvdyBmaWxlcyBmb3IgZGVidWdnaW5nXG4gICAgYXdhaXQgdGhpcy53cml0ZURlYnVnRmlsZShvdXRmaWxlLCB7IHdvcmtmbG93RmlsZXMsIHNlcmRlT25seUZpbGVzIH0pO1xuXG4gICAgLy8gSGVscGVyIHRvIGNyZWF0ZSBpbXBvcnQgc3RhdGVtZW50IGZyb20gZmlsZSBwYXRoXG4gICAgLy8gRm9yIHBhY2thZ2VzLCB1c2VzIHRoZSBwYWNrYWdlIG5hbWUgc28gZXNidWlsZCB3aWxsIHJlc29sdmUgdGhyb3VnaFxuICAgIC8vIHBhY2thZ2UuanNvbiBleHBvcnRzIHdpdGggY29uZGl0aW9uczogWyd3b3JrZmxvdyddXG4gICAgY29uc3QgY3JlYXRlSW1wb3J0ID0gKGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBpbXBvcnRQYXRoLCBpc1BhY2thZ2UgfSA9IGdldEltcG9ydFBhdGgoXG4gICAgICAgIGZpbGUsXG4gICAgICAgIHRoaXMuY29uZmlnLndvcmtpbmdEaXJcbiAgICAgICk7XG5cbiAgICAgIGlmIChpc1BhY2thZ2UpIHtcbiAgICAgICAgLy8gVXNlIHBhY2thZ2UgbmFtZSAtIGVzYnVpbGQgd2lsbCByZXNvbHZlIHZpYSBwYWNrYWdlLmpzb24gZXhwb3J0c1xuICAgICAgICAvLyBhbmQgYXBwbHkgdGhlICd3b3JrZmxvdycgY29uZGl0aW9uXG4gICAgICAgIHJldHVybiBgaW1wb3J0ICcke2ltcG9ydFBhdGh9JztgO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2NhbCBhcHAgZmlsZSAtIHVzZSByZWxhdGl2ZSBwYXRoXG4gICAgICAvLyBOb3JtYWxpemUgYm90aCBwYXRocyB0byBmb3J3YXJkIHNsYXNoZXMgYmVmb3JlIGNhbGxpbmcgcmVsYXRpdmUoKVxuICAgICAgLy8gVGhpcyBpcyBjcml0aWNhbCBvbiBXaW5kb3dzIHdoZXJlIHJlbGF0aXZlKCkgY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzIHdpdGggbWl4ZWQgcGF0aCBmb3JtYXRzXG4gICAgICBjb25zdCBub3JtYWxpemVkV29ya2luZ0RpciA9IHRoaXMuY29uZmlnLndvcmtpbmdEaXIucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGUgPSBmaWxlLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgIC8vIENhbGN1bGF0ZSByZWxhdGl2ZSBwYXRoIGZyb20gd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIGZpbGVcbiAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShub3JtYWxpemVkV29ya2luZ0Rpciwgbm9ybWFsaXplZEZpbGUpLnJlcGxhY2UoXG4gICAgICAgIC9cXFxcL2csXG4gICAgICAgICcvJ1xuICAgICAgKTtcbiAgICAgIC8vIEVuc3VyZSByZWxhdGl2ZSBwYXRocyBzdGFydCB3aXRoIC4vIHNvIGVzYnVpbGQgcmVzb2x2ZXMgdGhlbSBjb3JyZWN0bHkuXG4gICAgICAvLyBQYXRocyBsaWtlIFwiLm91dHB1dC8uLi5cIiBhcmUgbm90IHZhbGlkIHJlbGF0aXZlIHNwZWNpZmllcnMgYW5kIG11c3RcbiAgICAgIC8vIGJlY29tZSBcIi4vLm91dHB1dC8uLi5cIi5cbiAgICAgIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4vJykgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGBpbXBvcnQgJyR7cmVsYXRpdmVQYXRofSc7YDtcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIGEgdmlydHVhbCBlbnRyeSB0aGF0IGltcG9ydHMgYWxsIHdvcmtmbG93IGZpbGVzLiBEZWR1cGUgYnlcbiAgICAvLyBjYW5vbmljYWwgbW9kdWxlIGlkZW50aXR5IHNvIHNvdXJjZS9kaXN0IGNvcGllcyBvZiB0aGUgc2FtZSB3b3Jrc3BhY2VcbiAgICAvLyBwYWNrYWdlIGV4cG9ydCBkb24ndCBib3RoIGdldCBpbXBvcnRlZCAod2hpY2ggd291bGQgbWFrZSB0aGUgc3djXG4gICAgLy8gcGx1Z2luIGdlbmVyYXRlIGR1cGxpY2F0ZSB3b3JrZmxvdyBJRHMpLlxuICAgIGNvbnN0IGVtaXR0ZWRJbXBvcnRJZGVudGl0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgYnVpbGRJbXBvcnRzID0gKGZpbGVzOiBzdHJpbmdbXSk6IHN0cmluZyA9PlxuICAgICAgZmlsZXNcbiAgICAgICAgLmZpbHRlcigoZmlsZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkZW50aXR5ID0gbW9kdWxlSWRlbnRpdHlLZXkoZmlsZSwgdGhpcy5tb2R1bGVTcGVjaWZpZXJSb290KTtcbiAgICAgICAgICBpZiAoZW1pdHRlZEltcG9ydElkZW50aXRpZXMuaGFzKGlkZW50aXR5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIGVtaXR0ZWRJbXBvcnRJZGVudGl0aWVzLmFkZChpZGVudGl0eSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoY3JlYXRlSW1wb3J0KVxuICAgICAgICAuam9pbignXFxuJyk7XG5cbiAgICAvLyBUaGUgU1dDIHBsdWdpbiBpbiB3b3JrZmxvdyBtb2RlIGVtaXRzIGBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3Muc2V0KHdvcmtmbG93SWQsIGZuKWBcbiAgICAvLyBjYWxscyBkaXJlY3RseSwgc28gd2UganVzdCBuZWVkIHRvIGltcG9ydCB0aGUgZmlsZXMgKE1hcCBpcyBpbml0aWFsaXplZCB2aWEgYmFubmVyKVxuICAgIGNvbnN0IHdvcmtmbG93SW1wb3J0cyA9IGJ1aWxkSW1wb3J0cyh3b3JrZmxvd0ZpbGVzKTtcblxuICAgIC8vIEluY2x1ZGUgc2VyZGUtb25seSBmaWxlcyBmb3IgY2xhc3MgcmVnaXN0cmF0aW9uIHNpZGUgZWZmZWN0c1xuICAgIGNvbnN0IHNlcmRlSW1wb3J0cyA9IGJ1aWxkSW1wb3J0cyhzZXJkZU9ubHlGaWxlcyk7XG5cbiAgICBjb25zdCBpbXBvcnRzID0gc2VyZGVJbXBvcnRzXG4gICAgICA/IGAke3dvcmtmbG93SW1wb3J0c31cXG4vLyBTZXJkZSBmaWxlcyBmb3IgY3Jvc3MtY29udGV4dCBjbGFzcyByZWdpc3RyYXRpb25cXG4ke3NlcmRlSW1wb3J0c31gXG4gICAgICA6IHdvcmtmbG93SW1wb3J0cztcblxuICAgIGNvbnN0IGJ1bmRsZVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd29ya2Zsb3dNYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdCA9IHt9O1xuICAgIGNvbnN0IGVzYnVpbGRUc2NvbmZpZ09wdGlvbnMgPVxuICAgICAgYXdhaXQgZ2V0RXNidWlsZFRzY29uZmlnT3B0aW9ucyh0c2NvbmZpZ1BhdGgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JrZmxvd1NpZGVFZmZlY3RFbnRyaWVzID0gYXdhaXQgd2l0aFJlYWxwYXRocyhbXG4gICAgICAuLi53b3JrZmxvd0ZpbGVzLFxuICAgICAgLi4uc2VyZGVPbmx5RmlsZXMsXG4gICAgXSk7XG5cbiAgICAvLyBCdW5kbGUgd2l0aCBlc2J1aWxkIGFuZCBvdXIgY3VzdG9tIFNXQyBwbHVnaW4gaW4gd29ya2Zsb3cgbW9kZS5cbiAgICAvLyB0aGlzIGJ1bmRsZSB3aWxsIGJlIHJ1biBpbnNpZGUgYSB2bSBpc29sYXRlXG4gICAgY29uc3QgaW50ZXJpbUJ1bmRsZUN0eCA9IGF3YWl0IGVzYnVpbGQuY29udGV4dCh7XG4gICAgICBzdGRpbjoge1xuICAgICAgICBjb250ZW50czogaW1wb3J0cyxcbiAgICAgICAgcmVzb2x2ZURpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgc291cmNlZmlsZTogJ3ZpcnR1YWwtZW50cnkuanMnLFxuICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICB9LFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgIGZvcm1hdDogJ2NqcycsIC8vIFJ1bnMgaW5zaWRlIHRoZSBWTSB3aGljaCBleHBlY3RzIGNqc1xuICAgICAgcGxhdGZvcm06ICduZXV0cmFsJywgLy8gVGhlIHBsYXRmb3JtIGlzIG5laXRoZXIgbm9kZSBub3IgYnJvd3NlclxuICAgICAgbWFpbkZpZWxkczogWydtb2R1bGUnLCAnbWFpbiddLCAvLyBUbyBzdXBwb3J0IG5wbSBzdHlsZSBpbXBvcnRzXG4gICAgICBjb25kaXRpb25zOiBbJ3dvcmtmbG93J10sIC8vIEFsbG93IHBhY2thZ2VzIHRvIGV4cG9ydCAnd29ya2Zsb3cnIGNvbXBsaWFudCB2ZXJzaW9uc1xuICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAga2VlcE5hbWVzOiB0cnVlLFxuICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHdvcmtmbG93IHJlZ2lzdHJ5IGF0IHRoZSB2ZXJ5IHRvcCBvZiB0aGUgYnVuZGxlXG4gICAgICAvLyBUaGlzIG11c3QgYmUgaW4gYmFubmVyIChub3QgdGhlIHZpcnR1YWwgZW50cnkpIGJlY2F1c2UgZXNidWlsZCdzIGJ1bmRsaW5nXG4gICAgICAvLyBjYW4gcmVvcmRlciBjb2RlLCBhbmQgdGhlIC5zZXQoKSBjYWxscyBuZWVkIHRoZSBNYXAgdG8gZXhpc3QgZmlyc3RcbiAgICAgIGJhbm5lcjoge1xuICAgICAgICBqczogJ2dsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93cyA9IG5ldyBNYXAoKTsnLFxuICAgICAgfSxcbiAgICAgIC8vIFNvdXJjZSBtYXBzIGZvciBiZXR0ZXIgc3RhY2sgdHJhY2VzIGluIHdvcmtmbG93IFZNIGV4ZWN1dGlvbi4gVGhpc1xuICAgICAgLy8gaW50ZXJtZWRpYXRlIGJ1bmRsZSBpcyBleGVjdXRlZCB2aWEgcnVuSW5Db250ZXh0KCkgaW4gYSBWTSwgc28gaW5saW5lXG4gICAgICAvLyBzb3VyY2UgbWFwcyBnaXZlIG1lYW5pbmdmdWwgc3RhY2sgdHJhY2VzIGluc3RlYWQgb2ZcbiAgICAgIC8vIFwiZXZhbG1hY2hpbmUuPGFub255bW91cz5cIi4gRGVmYXVsdHMgdG8gaW5saW5lIGluIGRldmVsb3BtZW50IGFuZCBvZmYgaW5cbiAgICAgIC8vIHByb2R1Y3Rpb24gKHNlZSBgZGVmYXVsdFNvdXJjZW1hcE1vZGVgKSB0byBrZWVwIHByb2R1Y3Rpb24gZnVuY3Rpb25cbiAgICAgIC8vIGJ1bmRsZXMgc21hbGw7IG92ZXJyaWRlIHdpdGggdGhlIGBzb3VyY2VtYXBgIGNvbmZpZyBvcHRpb24gb3IgdGhlXG4gICAgICAvLyBgV09SS0ZMT1dfU09VUkNFTUFQYCBlbnYgdmFyLiBUaGUgcnVudGltZSByZW1hcHMgc3RhY2tzIG9ubHkgd2hlbiBhXG4gICAgICAvLyBtYXAgaXMgcHJlc2VudCwgc28gZGlzYWJsaW5nIG1hcHMgZGVncmFkZXMgZ3JhY2VmdWxseS5cbiAgICAgIHNvdXJjZW1hcDogdGhpcy5yZXNvbHZlU291cmNlbWFwKHRoaXMuZGVmYXVsdFNvdXJjZW1hcE1vZGUpLFxuICAgICAgLy8gVXNlIHRzY29uZmlnIGZvciBwYXRoIGFsaWFzIHJlc29sdXRpb24uXG4gICAgICAvLyBGb3Igc3ltbGlua2VkIGNvbmZpZ3MgdGhpcyB1c2VzIHRzY29uZmlnUmF3IHRvIHByZXNlcnZlIGN3ZC1yZWxhdGl2ZSBhbGlhc2VzLlxuICAgICAgLi4uZXNidWlsZFRzY29uZmlnT3B0aW9ucyxcbiAgICAgIHJlc29sdmVFeHRlbnNpb25zOiBbXG4gICAgICAgICcudHMnLFxuICAgICAgICAnLnRzeCcsXG4gICAgICAgICcubXRzJyxcbiAgICAgICAgJy5jdHMnLFxuICAgICAgICAnLmpzJyxcbiAgICAgICAgJy5qc3gnLFxuICAgICAgICAnLm1qcycsXG4gICAgICAgICcuY2pzJyxcbiAgICAgIF0sXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIC8vIEhhbmRsZSBwc2V1ZG8tcGFja2FnZXMgbGlrZSAnc2VydmVyLW9ubHknIGFuZCAnY2xpZW50LW9ubHknIGJ5IHByb3ZpZGluZ1xuICAgICAgICAvLyBlbXB0eSBtb2R1bGVzLiBNdXN0IHJ1biBmaXJzdCB0byBpbnRlcmNlcHQgdGhlc2UgYmVmb3JlIG90aGVyIHJlc29sdXRpb24uXG4gICAgICAgIGNyZWF0ZVBzZXVkb1BhY2thZ2VQbHVnaW4oKSxcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnd29ya2Zsb3cnLFxuICAgICAgICAgIHByb2plY3RSb290OiB0aGlzLnRyYW5zZm9ybVByb2plY3RSb290LFxuICAgICAgICAgIG1vZHVsZVNwZWNpZmllclJvb3Q6IHRoaXMubW9kdWxlU3BlY2lmaWVyUm9vdCxcbiAgICAgICAgICB3b3JrZmxvd01hbmlmZXN0LFxuICAgICAgICAgIHNpZGVFZmZlY3RFbnRyaWVzOiBub3JtYWxpemVkV29ya2Zsb3dTaWRlRWZmZWN0RW50cmllcyxcbiAgICAgICAgfSksXG4gICAgICAgIC8vIFRoaXMgcGx1Z2luIG11c3QgcnVuIGFmdGVyIHRoZSBzd2MgcGx1Z2luIHRvIGVuc3VyZSBkZWFkIGNvZGUgZWxpbWluYXRpb25cbiAgICAgICAgLy8gaGFwcGVucyBmaXJzdCwgcHJldmVudGluZyBmYWxzZSBwb3NpdGl2ZXMgb24gTm9kZS5qcyBpbXBvcnRzIGluIHVudXNlZCBjb2RlIHBhdGhzXG4gICAgICAgIGNyZWF0ZU5vZGVNb2R1bGVFcnJvclBsdWdpbigpLFxuICAgICAgXSxcbiAgICAgIC8vIE5PVEU6IFdlIGludGVudGlvbmFsbHkgZG8gTk9UIHVzZSB0aGUgZXh0ZXJuYWwgb3B0aW9uIGhlcmUgZm9yIHdvcmtmbG93IGJ1bmRsZXMuXG4gICAgICAvLyBXaGVuIHBhY2thZ2VzIGFyZSBtYXJrZWQgZXh0ZXJuYWwgd2l0aCBmb3JtYXQ6ICdjanMnLCBlc2J1aWxkIGdlbmVyYXRlcyByZXF1aXJlKCkgY2FsbHMuXG4gICAgICAvLyBIb3dldmVyLCB0aGUgd29ya2Zsb3cgVk0gKHZtLnJ1bkluQ29udGV4dCkgZG9lcyBub3QgaGF2ZSByZXF1aXJlKCkgZGVmaW5lZCAtIGl0IG9ubHlcbiAgICAgIC8vIHByb3ZpZGVzIG1vZHVsZS5leHBvcnRzIGFuZCBleHBvcnRzLiBFeHRlcm5hbCBwYWNrYWdlcyB3b3VsZCBmYWlsIGF0IHJ1bnRpbWUgd2l0aDpcbiAgICAgIC8vICAgUmVmZXJlbmNlRXJyb3I6IHJlcXVpcmUgaXMgbm90IGRlZmluZWRcbiAgICAgIC8vIEluc3RlYWQsIHdlIGJ1bmRsZSBldmVyeXRoaW5nIGFuZCByZWx5IG9uOlxuICAgICAgLy8gLSBjcmVhdGVQc2V1ZG9QYWNrYWdlUGx1Z2luKCkgdG8gaGFuZGxlIHNlcnZlci1vbmx5L2NsaWVudC1vbmx5IHdpdGggZW1wdHkgbW9kdWxlc1xuICAgICAgLy8gLSBjcmVhdGVOb2RlTW9kdWxlRXJyb3JQbHVnaW4oKSB0byBjYXRjaCBOb2RlLmpzIGJ1aWx0aW4gaW1wb3J0cyBhdCBidWlsZCB0aW1lXG4gICAgfSk7XG4gICAgbGV0IHNob3VsZERpc3Bvc2VJbnRlcmltQnVuZGxlQ3R4ID0gIWtlZXBJbnRlcmltQnVuZGxlQ29udGV4dDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW50ZXJpbUJ1bmRsZSA9IGF3YWl0IGludGVyaW1CdW5kbGVDdHgucmVidWlsZCgpO1xuXG4gICAgICB0aGlzLmxvZ0VzYnVpbGRNZXNzYWdlcyhcbiAgICAgICAgaW50ZXJpbUJ1bmRsZSxcbiAgICAgICAgJ2ludGVybWVkaWF0ZSB3b3JrZmxvdyBidW5kbGUnLFxuICAgICAgICB0cnVlLFxuICAgICAgICB7XG4gICAgICAgICAgc3VwcHJlc3NXYXJuaW5nczogdGhpcy5jb25maWcuc3VwcHJlc3NDcmVhdGVXb3JrZmxvd3NCdW5kbGVXYXJuaW5ncyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHRoaXMubG9nQ3JlYXRlV29ya2Zsb3dzQnVuZGxlSW5mbyhcbiAgICAgICAgJ0NyZWF0ZWQgaW50ZXJtZWRpYXRlIHdvcmtmbG93IGJ1bmRsZScsXG4gICAgICAgIGAke0RhdGUubm93KCkgLSBidW5kbGVTdGFydFRpbWV9bXNgXG4gICAgICApO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcud29ya2Zsb3dNYW5pZmVzdFBhdGgpIHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZShcbiAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgIHRoaXMuY29uZmlnLndvcmtmbG93TWFuaWZlc3RQYXRoXG4gICAgICAgICk7XG4gICAgICAgIGxldCBwcmVmaXggPSAnJztcblxuICAgICAgICBpZiAocmVzb2x2ZWRQYXRoLmVuZHNXaXRoKCcuY2pzJykpIHtcbiAgICAgICAgICBwcmVmaXggPSAnbW9kdWxlLmV4cG9ydHMgPSAnO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHJlc29sdmVkUGF0aC5lbmRzV2l0aCgnLmpzJykgfHxcbiAgICAgICAgICByZXNvbHZlZFBhdGguZW5kc1dpdGgoJy5tanMnKVxuICAgICAgICApIHtcbiAgICAgICAgICBwcmVmaXggPSAnZXhwb3J0IGRlZmF1bHQgJztcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUocmVzb2x2ZWRQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGF3YWl0IHdyaXRlRmlsZShcbiAgICAgICAgICByZXNvbHZlZFBhdGgsXG4gICAgICAgICAgcHJlZml4ICsgSlNPTi5zdHJpbmdpZnkod29ya2Zsb3dNYW5pZmVzdCwgbnVsbCwgMilcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVTd2NJZ25vcmVkKCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgIWludGVyaW1CdW5kbGUub3V0cHV0RmlsZXMgfHxcbiAgICAgICAgaW50ZXJpbUJ1bmRsZS5vdXRwdXRGaWxlcy5sZW5ndGggPT09IDBcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dCdWlsZEVycm9yKCdObyBvdXRwdXQgZmlsZXMgZ2VuZXJhdGVkIGZyb20gZXNidWlsZCcsIHtcbiAgICAgICAgICBoaW50OiAnVGhpcyB1c3VhbGx5IGluZGljYXRlcyBhIG1pc2NvbmZpZ3VyZWQgZW50cnkgcG9pbnQgb3IgYW4gZW1wdHkgd29ya2Zsb3cgZGlyZWN0b3J5LiBDaGVjayB0aGF0IHlvdXIgd29ya2Zsb3cgZmlsZXMgY29udGFpbiBhIGBcInVzZSB3b3JrZmxvd1wiYCBvciBgXCJ1c2Ugc3RlcFwiYCBkaXJlY3RpdmUuJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNlcmRlIGNvbXBsaWFuY2Ugd2FybmluZ3M6IGNoZWNrIGlmIHdvcmtmbG93IGJ1bmRsZSBoYXMgTm9kZS5qcyBpbXBvcnRzXG4gICAgICAvLyBhbG9uZ3NpZGUgc2VyZGUtcmVnaXN0ZXJlZCBjbGFzc2VzICh0aGVzZSB3aWxsIGZhaWwgYXQgcnVudGltZSBpbiB0aGUgc2FuZGJveClcbiAgICAgIGlmIChcbiAgICAgICAgd29ya2Zsb3dNYW5pZmVzdC5jbGFzc2VzICYmXG4gICAgICAgIE9iamVjdC5rZXlzKHdvcmtmbG93TWFuaWZlc3QuY2xhc3NlcykubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHsgYW5hbHl6ZVNlcmRlQ29tcGxpYW5jZSB9ID0gYXdhaXQgaW1wb3J0KCcuL3NlcmRlLWNoZWNrZXIuanMnKTtcbiAgICAgICAgY29uc3QgYnVuZGxlVGV4dCA9IGludGVyaW1CdW5kbGUub3V0cHV0RmlsZXNbMF0udGV4dDtcbiAgICAgICAgY29uc3Qgc2VyZGVSZXN1bHQgPSBhbmFseXplU2VyZGVDb21wbGlhbmNlKHtcbiAgICAgICAgICBzb3VyY2VDb2RlOiAnJyxcbiAgICAgICAgICB3b3JrZmxvd0NvZGU6IGJ1bmRsZVRleHQsXG4gICAgICAgICAgbWFuaWZlc3Q6IHdvcmtmbG93TWFuaWZlc3QsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBEZS1kdXBlIHdhcm5pbmdzOiBncm91cCBpZGVudGljYWwgaXNzdWVzIGFjcm9zcyBjbGFzc2VzXG4gICAgICAgIGNvbnN0IGlzc3Vlc1RvQ2xhc3NlcyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgICAgICAgZm9yIChjb25zdCBjbHMgb2Ygc2VyZGVSZXN1bHQuY2xhc3Nlcykge1xuICAgICAgICAgIGlmICghY2xzLmNvbXBsaWFudCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpc3N1ZSBvZiBjbHMuaXNzdWVzKSB7XG4gICAgICAgICAgICAgIGxldCBhZmZlY3RlZENsYXNzZXMgPSBpc3N1ZXNUb0NsYXNzZXMuZ2V0KGlzc3VlKTtcbiAgICAgICAgICAgICAgaWYgKCFhZmZlY3RlZENsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICBhZmZlY3RlZENsYXNzZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgICAgICAgICBpc3N1ZXNUb0NsYXNzZXMuc2V0KGlzc3VlLCBhZmZlY3RlZENsYXNzZXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGFmZmVjdGVkQ2xhc3Nlcy5hZGQoY2xzLmNsYXNzTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgW2lzc3VlLCBhZmZlY3RlZENsYXNzZXNdIG9mIGlzc3Vlc1RvQ2xhc3Nlcykge1xuICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbLi4uYWZmZWN0ZWRDbGFzc2VzXTtcbiAgICAgICAgICBjb25zdCBjbGFzc0xhYmVsID1cbiAgICAgICAgICAgIGNsYXNzTmFtZXMubGVuZ3RoID09PSAxXG4gICAgICAgICAgICAgID8gYGNsYXNzIFwiJHtjbGFzc05hbWVzWzBdfVwiYFxuICAgICAgICAgICAgICA6IGBjbGFzc2VzICR7Y2xhc3NOYW1lcy5tYXAoKG5hbWUpID0+IGBcIiR7bmFtZX1cImApLmpvaW4oJywgJyl9YDtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBjaGFsay55ZWxsb3coYOKaoCBTZXJkZSB3YXJuaW5nIGZvciAke2NsYXNzTGFiZWx9OiBgKSArIGlzc3VlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB3b3JrZmxvd0VudHJ5cG9pbnRPcHRpb25zQ29kZSA9IGNyZWF0ZVdvcmtmbG93RW50cnlwb2ludE9wdGlvbnNDb2RlKFxuICAgICAgICB7XG4gICAgICAgICAgcm91dGVNb2R1bGVCb2R5U3RhcnRlZEF0OiAnd29ya2Zsb3dSb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXQnLFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBjb25zdCBidW5kbGVGaW5hbCA9IGFzeW5jIChpbnRlcmltQnVuZGxlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dCdW5kbGVDb2RlID0gaW50ZXJpbUJ1bmRsZTtcblxuICAgICAgICBjb25zdCB3b3JrZmxvd0Z1bmN0aW9uQ29kZSA9IGAvLyBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZCBmaWxlXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IHsgd29ya2Zsb3dFbnRyeXBvaW50IH0gZnJvbSAnd29ya2Zsb3cvcnVudGltZSc7XG5cbmNvbnN0IHdvcmtmbG93Um91dGVNb2R1bGVCb2R5U3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbmNvbnN0IHdvcmtmbG93Q29kZSA9IFxcYCR7d29ya2Zsb3dCdW5kbGVDb2RlLnJlcGxhY2UoL1tcXFxcYCRdL2csICdcXFxcJCYnKX1cXGA7XG5cbmV4cG9ydCBjb25zdCBQT1NUID0gd29ya2Zsb3dFbnRyeXBvaW50KHdvcmtmbG93Q29kZSR7d29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGV9KTtgO1xuXG4gICAgICAgIC8vIHdlIHNraXAgdGhlIGZpbmFsIGJ1bmRsaW5nIHN0ZXAgZm9yIE5leHQuanMgc28gaXQgY2FuIGJ1bmRsZSBpdHNlbGZcbiAgICAgICAgaWYgKCFidW5kbGVGaW5hbE91dHB1dCkge1xuICAgICAgICAgIGlmICghb3V0ZmlsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhcmlhbnQ6IG1pc3Npbmcgb3V0ZmlsZSBmb3Igd29ya2Zsb3cgYnVuZGxlYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEVuc3VyZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSBleGlzdHNcbiAgICAgICAgICBjb25zdCBvdXRwdXREaXIgPSBkaXJuYW1lKG91dGZpbGUpO1xuICAgICAgICAgIGF3YWl0IG1rZGlyKG91dHB1dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgICAgICBhd2FpdCB0aGlzLndyaXRlR2VuZXJhdGVkRmlsZShvdXRmaWxlLCB3b3JrZmxvd0Z1bmN0aW9uQ29kZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVuZGxlU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAvLyBOb3cgYnVuZGxlIHRoaXMgc28gd2UgY2FuIHJlc29sdmUgdGhlIEB3b3JrZmxvdy9jb3JlIGRlcGVuZGVuY3lcbiAgICAgICAgLy8gd2UgY291bGQgcmVtb3ZlIHRoaXMgaWYgd2UgZG8gbmZ0IHRyYWNpbmcgb3Igc2ltaWxhciBpbnN0ZWFkXG4gICAgICAgIGNvbnN0IGZpbmFsRXNtUmVxdWlyZUJhbm5lciA9IHRoaXMuZ2V0RXNtUmVxdWlyZUJhbm5lcihmb3JtYXQpO1xuICAgICAgICBjb25zdCBmaW5hbFdvcmtmbG93UmVzdWx0ID0gYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgICAgICAgYmFubmVyOiB7XG4gICAgICAgICAgICBqczogYC8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xcbiR7ZmluYWxFc21SZXF1aXJlQmFubmVyfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGRpbjoge1xuICAgICAgICAgICAgY29udGVudHM6IHdvcmtmbG93RnVuY3Rpb25Db2RlLFxuICAgICAgICAgICAgcmVzb2x2ZURpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgICAgIHNvdXJjZWZpbGU6ICd2aXJ0dWFsLWVudHJ5LmpzJyxcbiAgICAgICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG91dGZpbGUsXG4gICAgICAgICAgLy8gU291cmNlIG1hcHMgZm9yIHRoZSBmaW5hbCB3b3JrZmxvdyBidW5kbGUgd3JhcHBlciAobm90IGltcG9ydGFudCBzaW5jZSB0aGlzIGNvZGVcbiAgICAgICAgICAvLyBkb2Vzbid0IHJ1biBpbiB0aGUgVk0gLSBvbmx5IHRoZSBpbnRlcm1lZGlhdGUgYnVuZGxlIHNvdXJjZW1hcCBpcyByZWxldmFudClcbiAgICAgICAgICBzb3VyY2VtYXA6IHRoaXMucmVzb2x2ZVNvdXJjZW1hcChFTUlUX1NPVVJDRU1BUFNfRk9SX0RFQlVHR0lORyksXG4gICAgICAgICAgYWJzV29ya2luZ0RpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgICBidW5kbGU6IHRydWUsXG4gICAgICAgICAgZm9ybWF0LFxuICAgICAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgICAgICB3cml0ZTogdHJ1ZSxcbiAgICAgICAgICBrZWVwTmFtZXM6IHRydWUsXG4gICAgICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICAgICAgICBleHRlcm5hbDogWydAYXdzLXNkay9jcmVkZW50aWFsLXByb3ZpZGVyLXdlYi1pZGVudGl0eSddLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmxvZ0VzYnVpbGRNZXNzYWdlcyhcbiAgICAgICAgICBmaW5hbFdvcmtmbG93UmVzdWx0LFxuICAgICAgICAgICdmaW5hbCB3b3JrZmxvdyBidW5kbGUnLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3VwcHJlc3NXYXJuaW5nczogdGhpcy5jb25maWcuc3VwcHJlc3NDcmVhdGVXb3JrZmxvd3NCdW5kbGVXYXJuaW5ncyxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubG9nQ3JlYXRlV29ya2Zsb3dzQnVuZGxlSW5mbyhcbiAgICAgICAgICAnQ3JlYXRlZCBmaW5hbCB3b3JrZmxvdyBidW5kbGUnLFxuICAgICAgICAgIGAke0RhdGUubm93KCkgLSBidW5kbGVTdGFydFRpbWV9bXNgXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgICAgY29uc3QgaW50ZXJpbUJ1bmRsZVRleHQgPSBpbnRlcmltQnVuZGxlLm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgICBhd2FpdCBidW5kbGVGaW5hbChpbnRlcmltQnVuZGxlVGV4dCk7XG5cbiAgICAgIGlmIChrZWVwSW50ZXJpbUJ1bmRsZUNvbnRleHQpIHtcbiAgICAgICAgc2hvdWxkRGlzcG9zZUludGVyaW1CdW5kbGVDdHggPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBtYW5pZmVzdDogd29ya2Zsb3dNYW5pZmVzdCxcbiAgICAgICAgICBpbnRlcmltQnVuZGxlQ3R4LFxuICAgICAgICAgIGJ1bmRsZUZpbmFsLFxuICAgICAgICAgIGludGVyaW1CdW5kbGVUZXh0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgbWFuaWZlc3Q6IHdvcmtmbG93TWFuaWZlc3QsIGludGVyaW1CdW5kbGVUZXh0IH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3VsZERpc3Bvc2VJbnRlcmltQnVuZGxlQ3R4ID0gdHJ1ZTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoc2hvdWxkRGlzcG9zZUludGVyaW1CdW5kbGVDdHgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBpbnRlcmltQnVuZGxlQ3R4LmRpc3Bvc2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZGlzcG9zZUVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgJ1dhcm5pbmc6IEZhaWxlZCB0byBkaXNwb3NlIHdvcmtmbG93IGJ1bmRsZSBjb250ZXh0JyxcbiAgICAgICAgICAgIGRpc3Bvc2VFcnJvclxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVjI6IENyZWF0ZXMgYSBjb21iaW5lZCBidW5kbGUgdGhhdCBpbmNsdWRlcyBib3RoIHN0ZXAgcmVnaXN0cmF0aW9ucyBhbmRcbiAgICogd29ya2Zsb3cgb3JjaGVzdHJhdGlvbiBpbiBhIHNpbmdsZSByb3V0ZS4gVGhlIGNvbWJpbmVkIGVudHJ5cG9pbnQgZXhlY3V0ZXNcbiAgICogc3RlcHMgaW5saW5lIHdoZW4gcG9zc2libGUsIHJlZHVjaW5nIGZ1bmN0aW9uIGludm9jYXRpb25zIGFuZCBxdWV1ZSBvdmVyaGVhZC5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgcmV1c2VzIGNyZWF0ZVN0ZXBzQnVuZGxlIChmb3Igc3RlcCByZWdpc3RyYXRpb25zKSBhbmRcbiAgICogY3JlYXRlV29ya2Zsb3dzQnVuZGxlIChmb3Igd29ya2Zsb3cgVk0gY29kZSksIHRoZW4gY29tYmluZXMgdGhlbSBpbnRvXG4gICAqIGEgc2luZ2xlIHJvdXRlIGZpbGUgdXNpbmcgd29ya2Zsb3dFbnRyeXBvaW50KCkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQ29tYmluZWRCdW5kbGUoe1xuICAgIGlucHV0RmlsZXMsXG4gICAgc3RlcHNPdXRmaWxlLFxuICAgIGZsb3dPdXRmaWxlLFxuICAgIGZvcm1hdCA9ICdlc20nLFxuICAgIGJ1bmRsZUZpbmFsT3V0cHV0ID0gdHJ1ZSxcbiAgICB0c2NvbmZpZ1BhdGgsXG4gICAgZXh0ZXJuYWxpemVOb25TdGVwcyxcbiAgICBidW5kbGVUcmFuc2l0aXZlTG9jYWxTdGVwRGVwZW5kZW5jaWVzLFxuICAgIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzLFxuICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICB9OiB7XG4gICAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gICAgLyoqIE91dHB1dCBwYXRoIGZvciB0aGUgc3RlcCByZWdpc3RyYXRpb25zIGJ1bmRsZSAoc2lkZSBlZmZlY3RzIG9ubHkpICovXG4gICAgc3RlcHNPdXRmaWxlOiBzdHJpbmc7XG4gICAgLyoqIE91dHB1dCBwYXRoIGZvciB0aGUgY29tYmluZWQgcm91dGUgZmlsZSAqL1xuICAgIGZsb3dPdXRmaWxlOiBzdHJpbmc7XG4gICAgZm9ybWF0PzogJ2NqcycgfCAnZXNtJztcbiAgICBidW5kbGVGaW5hbE91dHB1dD86IGJvb2xlYW47XG4gICAgdHNjb25maWdQYXRoPzogc3RyaW5nO1xuICAgIGV4dGVybmFsaXplTm9uU3RlcHM/OiBib29sZWFuO1xuICAgIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXM/OiBib29sZWFuO1xuICAgIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzPzogYm9vbGVhbjtcbiAgICBkaXNjb3ZlcmVkRW50cmllcz86IERpc2NvdmVyZWRFbnRyaWVzO1xuICB9KTogUHJvbWlzZTx7XG4gICAgbWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3Q7XG4gICAgc3RlcHNDb250ZXh0PzogZXNidWlsZC5CdWlsZENvbnRleHQ7XG4gICAgaW50ZXJpbUJ1bmRsZUN0eD86IGVzYnVpbGQuQnVpbGRDb250ZXh0O1xuICAgIGJ1bmRsZUZpbmFsPzogKGludGVyaW1CdW5kbGVSZXN1bHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgfT4ge1xuICAgIHRoaXMuc3RhcnRXb3JrZmxvd0J1aWxkVGltZXIoKTtcblxuICAgIC8vIDEuIEJ1aWxkIHN0ZXAgcmVnaXN0cmF0aW9ucyBidW5kbGUgKHVzZWQgYXMgc2VwYXJhdGUgZmlsZSBmb3JcbiAgICAvLyBidW5kbGVGaW5hbE91dHB1dDogZmFsc2UsIG9yIHJlYWQgYmFjayBmb3IgaW5saW5lIGNvbnRlbnQgd2hlbiB0cnVlKVxuICAgIGNvbnN0IHsgY29udGV4dDogc3RlcHNDb250ZXh0LCBtYW5pZmVzdDogc3RlcHNNYW5pZmVzdCB9ID1cbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlU3RlcHNCdW5kbGUoe1xuICAgICAgICBpbnB1dEZpbGVzLFxuICAgICAgICBvdXRmaWxlOiBzdGVwc091dGZpbGUsXG4gICAgICAgIC8vIFdoZW4gYnVuZGxlRmluYWxPdXRwdXQgaXMgdHJ1ZSwgdXNlIEVTTSBmb3IgdGhlIHN0ZXBzIGJ1bmRsZVxuICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHRoZSBmaW5hbCBvdXRwdXQgZm9ybWF0LiBUaGUgZmluYWwgZXNidWlsZCBwYXNzXG4gICAgICAgIC8vIGNvbnZlcnRzIGV2ZXJ5dGhpbmcgdG8gdGhlIHRhcmdldCBmb3JtYXQuIFVzaW5nIENKUyBoZXJlIGNhdXNlc1xuICAgICAgICAvLyBhIG1vZHVsZS5leHBvcnRzIGNvbGxpc2lvbjogdGhlIHN0ZXBzIGJ1bmRsZSdzIHRvcC1sZXZlbFxuICAgICAgICAvLyBtb2R1bGUuZXhwb3J0cyBvdmVyd3JpdGVzIHRoZSBjb21iaW5lZCByb3V0ZSdzIG1vZHVsZS5leHBvcnRzXG4gICAgICAgIC8vIHdoZW4gZXNidWlsZCBpbmxpbmVzIHRoZSBzdGVwcyB3aXRob3V0IGEgX19jb21tb25KUyB3cmFwcGVyLlxuICAgICAgICBmb3JtYXQ6IGJ1bmRsZUZpbmFsT3V0cHV0ID8gJ2VzbScgOiBmb3JtYXQsXG4gICAgICAgIGV4dGVybmFsaXplTm9uU3RlcHMsXG4gICAgICAgIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXMsXG4gICAgICAgIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzLFxuICAgICAgICB0c2NvbmZpZ1BhdGgsXG4gICAgICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgICAgICAvLyBTa2lwIHRoZSBjcmVhdGVSZXF1aXJlIGJhbm5lciBoZXJlIOKAlCB3aGVuIGJ1bmRsZUZpbmFsT3V0cHV0IGlzIHRydWVcbiAgICAgICAgLy8gdGhlIG91dGVyIGVzYnVpbGQgcGFzcyB3aWxsIGlubGluZSB0aGlzIGJ1bmRsZSBhbmQgYWRkIGl0cyBvd25cbiAgICAgICAgLy8gYmFubmVyLiBFbWl0dGluZyBpdCB0d2ljZSBkZWNsYXJlcyBfX2NyZWF0ZVJlcXVpcmUgdHdpY2UuXG4gICAgICAgIHNraXBFc21SZXF1aXJlQmFubmVyOiBidW5kbGVGaW5hbE91dHB1dCxcbiAgICAgIH0pO1xuXG4gICAgLy8gMi4gQnVpbGQgd29ya2Zsb3cgVk0gY29kZVxuICAgIGNvbnN0IHRlbXBXb3JrZmxvd091dGZpbGUgPSBgJHtmbG93T3V0ZmlsZX0uX193Zl90bXAuanNgO1xuICAgIGNvbnN0IHdvcmtmbG93c1Jlc3VsdCA9IGF3YWl0IHRoaXMuY3JlYXRlV29ya2Zsb3dzQnVuZGxlKHtcbiAgICAgIGlucHV0RmlsZXMsXG4gICAgICBvdXRmaWxlOiB0ZW1wV29ya2Zsb3dPdXRmaWxlLFxuICAgICAgZm9ybWF0LFxuICAgICAgYnVuZGxlRmluYWxPdXRwdXQ6IGZhbHNlLFxuICAgICAgdHNjb25maWdQYXRoLFxuICAgICAgZGlzY292ZXJlZEVudHJpZXMsXG4gICAgfSk7XG5cbiAgICBjb25zdCB3b3JrZmxvd1ZNQ29kZSA9IHdvcmtmbG93c1Jlc3VsdC5pbnRlcmltQnVuZGxlVGV4dDtcbiAgICBpZiAoIXdvcmtmbG93Vk1Db2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyZWF0ZVdvcmtmbG93c0J1bmRsZSBkaWQgbm90IHJldHVybiBpbnRlcmltQnVuZGxlVGV4dCcpO1xuICAgIH1cblxuICAgIC8vIENsZWFuIHVwIHRoZSB3cmFwcGVyIGZpbGVcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyB1bmxpbmsgfSA9IGF3YWl0IGltcG9ydCgnbm9kZTpmcy9wcm9taXNlcycpO1xuICAgICAgYXdhaXQgdW5saW5rKHRlbXBXb3JrZmxvd091dGZpbGUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSWdub3JlIGNsZWFudXAgZXJyb3JzXG4gICAgfVxuXG4gICAgLy8gMy4gR2VuZXJhdGUgY29tYmluZWQgcm91dGUgZmlsZVxuICAgIGNvbnN0IHN0ZXBzUmVsYXRpdmVQYXRoID0gYC4vJHtiYXNlbmFtZShzdGVwc091dGZpbGUpLnJlcGxhY2UoL1xcXFwvZywgJy8nKX1gO1xuICAgIGNvbnN0IGVzY2FwZWRWTUNvZGUgPSB3b3JrZmxvd1ZNQ29kZS5yZXBsYWNlKC9bXFxcXGAkXS9nLCAnXFxcXCQmJyk7XG4gICAgY29uc3Qgd29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGUgPSBjcmVhdGVXb3JrZmxvd0VudHJ5cG9pbnRPcHRpb25zQ29kZSh7XG4gICAgICByb3V0ZU1vZHVsZUJvZHlTdGFydGVkQXQ6ICd3b3JrZmxvd1JvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdCcsXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb21iaW5lZEZ1bmN0aW9uQ29kZSA9IGAvLyBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZCBmaWxlXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuaW1wb3J0IHsgX19zdGVwc19yZWdpc3RlcmVkIH0gZnJvbSAnJHtzdGVwc1JlbGF0aXZlUGF0aH0nO1xuaW1wb3J0IHsgd29ya2Zsb3dFbnRyeXBvaW50IH0gZnJvbSAnd29ya2Zsb3cvcnVudGltZSc7XG5cbmNvbnN0IHdvcmtmbG93Um91dGVNb2R1bGVCb2R5U3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcblxuLy8gUHJldmVudCByb2xsdXAgZnJvbSB0cmVlLXNoYWtpbmcgdGhlIHN0ZXBzIHNpZGUtZWZmZWN0IGltcG9ydFxudm9pZCBfX3N0ZXBzX3JlZ2lzdGVyZWQ7XG5cbmNvbnN0IHdvcmtmbG93Q29kZSA9IFxcYCR7ZXNjYXBlZFZNQ29kZX1cXGA7XG5cbmV4cG9ydCBjb25zdCBQT1NUID0gd29ya2Zsb3dFbnRyeXBvaW50KHdvcmtmbG93Q29kZSR7d29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGV9KTtgO1xuXG4gICAgaWYgKCFidW5kbGVGaW5hbE91dHB1dCkge1xuICAgICAgYXdhaXQgdGhpcy53cml0ZUdlbmVyYXRlZEZpbGUoZmxvd091dGZpbGUsIGNvbWJpbmVkRnVuY3Rpb25Db2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQnVuZGxlIHRoZSBjb21iaW5lZCBjb2RlIGZvciBzdGFuZGFsb25lIHVzZVxuICAgICAgY29uc3QgYnVuZGxlU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHsgYmFubmVyOiBpbXBvcnRNZXRhQmFubmVyLCBkZWZpbmU6IGltcG9ydE1ldGFEZWZpbmUgfSA9XG4gICAgICAgIHRoaXMuZ2V0Q2pzSW1wb3J0TWV0YVBvbHlmaWxsKGZvcm1hdCk7XG4gICAgICAvLyBFU00gYmFubmVyIHByb3ZpZGVzIGByZXF1aXJlYCB2aWEgY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpIHNvXG4gICAgICAvLyBDSlMgZGVwZW5kZW5jaWVzIHRoYXQgY2FsbCByZXF1aXJlKCkgZm9yIE5vZGUuanMgYnVpbHRpbnMga2VlcCB3b3JraW5nXG4gICAgICAvLyBpbiB0aGUgRVNNIG91dHB1dCBwcm9kdWNlZCBieSBidW5kbGVGaW5hbE91dHB1dDogdHJ1ZS5cbiAgICAgIGNvbnN0IGZpbmFsRXNtUmVxdWlyZUJhbm5lciA9IHRoaXMuZ2V0RXNtUmVxdWlyZUJhbm5lcihmb3JtYXQpO1xuICAgICAgY29uc3QgZmluYWxSZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgICAgYmFubmVyOiB7XG4gICAgICAgICAganM6IGAvLyBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZCBmaWxlXFxuLyogZXNsaW50LWRpc2FibGUgKi9cXG4ke2ltcG9ydE1ldGFCYW5uZXJ9JHtmaW5hbEVzbVJlcXVpcmVCYW5uZXJ9YCxcbiAgICAgICAgfSxcbiAgICAgICAgc3RkaW46IHtcbiAgICAgICAgICBjb250ZW50czogY29tYmluZWRGdW5jdGlvbkNvZGUsXG4gICAgICAgICAgcmVzb2x2ZURpcjogZGlybmFtZShmbG93T3V0ZmlsZSksXG4gICAgICAgICAgc291cmNlZmlsZTogJ3ZpcnR1YWwtZW50cnkuanMnLFxuICAgICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgICAgfSxcbiAgICAgICAgb3V0ZmlsZTogZmxvd091dGZpbGUsXG4gICAgICAgIGFic1dvcmtpbmdEaXI6IHRoaXMuY29uZmlnLndvcmtpbmdEaXIsXG4gICAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgICAgZm9ybWF0LFxuICAgICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgICB0YXJnZXQ6ICdlczIwMjInLFxuICAgICAgICB3cml0ZTogdHJ1ZSxcbiAgICAgICAga2VlcE5hbWVzOiB0cnVlLFxuICAgICAgICBtaW5pZnk6IGZhbHNlLFxuICAgICAgICBkZWZpbmU6IGltcG9ydE1ldGFEZWZpbmUsXG4gICAgICAgIGV4dGVybmFsOiBbJ0Bhd3Mtc2RrL2NyZWRlbnRpYWwtcHJvdmlkZXItd2ViLWlkZW50aXR5J10sXG4gICAgICB9KTtcbiAgICAgIHRoaXMubG9nRXNidWlsZE1lc3NhZ2VzKGZpbmFsUmVzdWx0LCAnY29tYmluZWQgYnVuZGxlJywgdHJ1ZSk7XG4gICAgICB0aGlzLmxvZ0Jhc2VCdWlsZGVySW5mbyhcbiAgICAgICAgJ0NyZWF0ZWQgY29tYmluZWQgYnVuZGxlJyxcbiAgICAgICAgYCR7RGF0ZS5ub3coKSAtIGJ1bmRsZVN0YXJ0VGltZX1tc2BcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTWVyZ2UgbWFuaWZlc3RzXG4gICAgY29uc3QgbWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3QgPSB7XG4gICAgICAuLi5zdGVwc01hbmlmZXN0LFxuICAgICAgd29ya2Zsb3dzOiB7XG4gICAgICAgIC4uLnN0ZXBzTWFuaWZlc3Qud29ya2Zsb3dzLFxuICAgICAgICAuLi53b3JrZmxvd3NSZXN1bHQubWFuaWZlc3Qud29ya2Zsb3dzLFxuICAgICAgfSxcbiAgICAgIGNsYXNzZXM6IHtcbiAgICAgICAgLi4uc3RlcHNNYW5pZmVzdC5jbGFzc2VzLFxuICAgICAgICAuLi53b3JrZmxvd3NSZXN1bHQubWFuaWZlc3QuY2xhc3NlcyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIENyZWF0ZSBhIGN1c3RvbSBidW5kbGVGaW5hbCBmb3Igd2F0Y2ggbW9kZSB0aGF0IHVzZXMgd29ya2Zsb3dFbnRyeXBvaW50XG4gICAgY29uc3QgY29tYmluZWRCdW5kbGVGaW5hbCA9IGFzeW5jIChpbnRlcmltQnVuZGxlVGV4dDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBlc2NhcGVkID0gaW50ZXJpbUJ1bmRsZVRleHQucmVwbGFjZSgvW1xcXFxgJF0vZywgJ1xcXFwkJicpO1xuICAgICAgY29uc3Qgd29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGUgPSBjcmVhdGVXb3JrZmxvd0VudHJ5cG9pbnRPcHRpb25zQ29kZShcbiAgICAgICAge1xuICAgICAgICAgIHJvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdDogJ3dvcmtmbG93Um91dGVNb2R1bGVCb2R5U3RhcnRlZEF0JyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNvZGUgPSBgLy8gYmlvbWUtaWdub3JlLWFsbCBsaW50OiBnZW5lcmF0ZWQgZmlsZVxuLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCB7IF9fc3RlcHNfcmVnaXN0ZXJlZCB9IGZyb20gJyR7c3RlcHNSZWxhdGl2ZVBhdGh9JztcbmltcG9ydCB7IHdvcmtmbG93RW50cnlwb2ludCB9IGZyb20gJ3dvcmtmbG93L3J1bnRpbWUnO1xuXG5jb25zdCB3b3JrZmxvd1JvdXRlTW9kdWxlQm9keVN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG5cbnZvaWQgX19zdGVwc19yZWdpc3RlcmVkO1xuXG5jb25zdCB3b3JrZmxvd0NvZGUgPSBcXGAke2VzY2FwZWR9XFxgO1xuXG5leHBvcnQgY29uc3QgUE9TVCA9IHdvcmtmbG93RW50cnlwb2ludCh3b3JrZmxvd0NvZGUke3dvcmtmbG93RW50cnlwb2ludE9wdGlvbnNDb2RlfSk7YDtcblxuICAgICAgY29uc3Qgb3V0cHV0RGlyID0gZGlybmFtZShmbG93T3V0ZmlsZSk7XG4gICAgICBhd2FpdCBta2RpcihvdXRwdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgdGhpcy53cml0ZUdlbmVyYXRlZEZpbGUoZmxvd091dGZpbGUsIGNvZGUpO1xuICAgIH07XG5cbiAgICBpZiAodGhpcy5jb25maWcud2F0Y2gpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1hbmlmZXN0LFxuICAgICAgICBzdGVwc0NvbnRleHQsXG4gICAgICAgIGludGVyaW1CdW5kbGVDdHg6IHdvcmtmbG93c1Jlc3VsdC5pbnRlcmltQnVuZGxlQ3R4LFxuICAgICAgICBidW5kbGVGaW5hbDogY29tYmluZWRCdW5kbGVGaW5hbCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbWFuaWZlc3QgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY2xpZW50IGxpYnJhcnkgYnVuZGxlIGZvciB3b3JrZmxvdyBleGVjdXRpb24uXG4gICAqIFRoZSBjbGllbnQgbGlicmFyeSBhbGxvd3MgaW1wb3J0aW5nIGFuZCBjYWxsaW5nIHdvcmtmbG93cyBmcm9tIGFwcGxpY2F0aW9uIGNvZGUuXG4gICAqIE9ubHkgZ2VuZXJhdGVkIGlmIGNsaWVudEJ1bmRsZVBhdGggaXMgc3BlY2lmaWVkIGluIGNvbmZpZy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVDbGllbnRMaWJyYXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25maWcuY2xpZW50QnVuZGxlUGF0aCkge1xuICAgICAgLy8gU2lsZW50bHkgZXhpdCBzaW5jZSBubyBjbGllbnQgYnVuZGxlIHdhcyByZXF1ZXN0ZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvZ0Jhc2VCdWlsZGVySW5mbyhcbiAgICAgICdHZW5lcmF0aW5nIGEgY2xpZW50IGxpYnJhcnkgYXQnLFxuICAgICAgdGhpcy5jb25maWcuY2xpZW50QnVuZGxlUGF0aFxuICAgICk7XG4gICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oXG4gICAgICAnTk9URTogVGhlIHJlY29tbWVuZGVkIHdheSB0byB1c2Ugd29ya2Zsb3cgd2l0aCBhIGZyYW1ld29yayBsaWtlIE5leHRKUyBpcyB1c2luZyB0aGUgbG9hZGVyL3BsdWdpbiB3aXRoIHdlYnBhY2svdHVyYm9icGFjay9yb2xsdXAnXG4gICAgKTtcblxuICAgIC8vIEVuc3VyZSB3ZSBoYXZlIHRoZSBkaXJlY3RvcnkgZm9yIHRoZSBjbGllbnQgYnVuZGxlXG4gICAgY29uc3Qgb3V0cHV0RGlyID0gZGlybmFtZSh0aGlzLmNvbmZpZy5jbGllbnRCdW5kbGVQYXRoKTtcbiAgICBhd2FpdCBta2RpcihvdXRwdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgaW5wdXRGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0SW5wdXRGaWxlcygpO1xuXG4gICAgLy8gRGlzY292ZXIgc2VyZGUgZmlsZXMgZnJvbSB0aGUgaW5wdXQgZmlsZXMnIGRlcGVuZGVuY3kgdHJlZSBmb3IgY3Jvc3MtY29udGV4dCBjbGFzcyByZWdpc3RyYXRpb24uXG4gICAgLy8gQ2xhc3NlcyBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIGNsaWVudCBidW5kbGUgc28gdGhleSBjYW4gYmUgc2VyaWFsaXplZFxuICAgIC8vIHdoZW4gcGFzc2luZyBkYXRhIHRvIHdvcmtmbG93cyB2aWEgc3RhcnQoKSBhbmQgZGVzZXJpYWxpemVkIHdoZW4gcmVjZWl2aW5nIHdvcmtmbG93IHJlc3VsdHMuXG4gICAgY29uc3QgeyBkaXNjb3ZlcmVkU2VyZGVGaWxlcyB9ID0gYXdhaXQgdGhpcy5kaXNjb3ZlckVudHJpZXMoXG4gICAgICBpbnB1dEZpbGVzLFxuICAgICAgb3V0cHV0RGlyXG4gICAgKTtcblxuICAgIC8vIElkZW50aWZ5IHNlcmRlIGZpbGVzIHRoYXQgYXJlbid0IGluIHRoZSBpbnB1dEZpbGVzIChkZWR1cGxpY2F0ZWQpXG4gICAgY29uc3QgaW5wdXRGaWxlc05vcm1hbGl6ZWQgPSBuZXcgU2V0KFxuICAgICAgaW5wdXRGaWxlcy5tYXAoKGYpID0+IGYucmVwbGFjZSgvXFxcXC9nLCAnLycpKVxuICAgICk7XG4gICAgY29uc3Qgc2VyZGVPbmx5RmlsZXMgPSBbLi4uZGlzY292ZXJlZFNlcmRlRmlsZXNdLmZpbHRlcihcbiAgICAgIChmKSA9PiAhaW5wdXRGaWxlc05vcm1hbGl6ZWQuaGFzKGYpXG4gICAgKTtcblxuICAgIC8vIFJlLWV4cG9ydHMgZm9yIGlucHV0IGZpbGVzICh1c2VyJ3Mgd29ya2Zsb3cvc3RlcCBkZWZpbml0aW9ucykuXG4gICAgLy8gVGhlc2UgbXVzdCB1c2UgdmFsaWQgcmVsYXRpdmUgc3BlY2lmaWVycyBiZWNhdXNlIHNvbWUgZnJhbWV3b3JrcyBwYXNzXG4gICAgLy8gZ2VuZXJhdGVkIGZpbGVzIGxpa2UgXCIub3V0cHV0L3NlcnZlci9pbmRleC5tanNcIiBhcyBpbnB1dCBmaWxlcy5cbiAgICBjb25zdCByZWV4cG9ydHMgPSBpbnB1dEZpbGVzXG4gICAgICAubWFwKChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShub3JtYWxpemVkV29ya2luZ0RpciwgZmlsZSkucmVwbGFjZShcbiAgICAgICAgICAvXFxcXC9nLFxuICAgICAgICAgICcvJ1xuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLycpICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgZXhwb3J0ICogZnJvbSAnJHtyZWxhdGl2ZVBhdGh9JztgO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgIC8vIFNpZGUtZWZmZWN0IGltcG9ydHMgZm9yIHNlcmRlIGZpbGVzIG5vdCBpbiBpbnB1dEZpbGVzIChmb3IgY2xhc3MgcmVnaXN0cmF0aW9uKVxuICAgIGNvbnN0IHNlcmRlSW1wb3J0cyA9IHNlcmRlT25seUZpbGVzXG4gICAgICAubWFwKChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShub3JtYWxpemVkV29ya2luZ0RpciwgZmlsZSkucmVwbGFjZShcbiAgICAgICAgICAvXFxcXC9nLFxuICAgICAgICAgICcvJ1xuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLycpICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgaW1wb3J0ICcke3JlbGF0aXZlUGF0aH0nO2A7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgLy8gQ29tYmluZTogc2VyZGUgaW1wb3J0cyAoZm9yIHJlZ2lzdHJhdGlvbiBzaWRlIGVmZmVjdHMpICsgcmUtZXhwb3J0c1xuICAgIGNvbnN0IGVudHJ5Q29udGVudCA9IHNlcmRlSW1wb3J0c1xuICAgICAgPyBgLy8gU2VyZGUgZmlsZXMgZm9yIGNyb3NzLWNvbnRleHQgY2xhc3MgcmVnaXN0cmF0aW9uXFxuJHtzZXJkZUltcG9ydHN9XFxuJHtyZWV4cG9ydHN9YFxuICAgICAgOiByZWV4cG9ydHM7XG5cbiAgICAvLyBCdW5kbGUgd2l0aCBlc2J1aWxkIGFuZCBvdXIgY3VzdG9tIFNXQyBwbHVnaW5cbiAgICBjb25zdCBub3JtYWxpemVkQ2xpZW50U2lkZUVmZmVjdEVudHJpZXMgPSBhd2FpdCB3aXRoUmVhbHBhdGhzKFtcbiAgICAgIC4uLmlucHV0RmlsZXMsXG4gICAgICAuLi5zZXJkZU9ubHlGaWxlcyxcbiAgICBdKTtcbiAgICBjb25zdCBjbGllbnRSZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGJhbm5lcjoge1xuICAgICAgICBqczogJy8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xcbicsXG4gICAgICB9LFxuICAgICAgc3RkaW46IHtcbiAgICAgICAgY29udGVudHM6IGVudHJ5Q29udGVudCxcbiAgICAgICAgcmVzb2x2ZURpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgc291cmNlZmlsZTogJ3ZpcnR1YWwtZW50cnkuanMnLFxuICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICB9LFxuICAgICAgb3V0ZmlsZTogdGhpcy5jb25maWcuY2xpZW50QnVuZGxlUGF0aCxcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAganN4OiAncHJlc2VydmUnLFxuICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgIHdyaXRlOiB0cnVlLFxuICAgICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgICBleHRlcm5hbDogWydAd29ya2Zsb3cvY29yZSddLFxuICAgICAgcmVzb2x2ZUV4dGVuc2lvbnM6IFtcbiAgICAgICAgJy50cycsXG4gICAgICAgICcudHN4JyxcbiAgICAgICAgJy5tdHMnLFxuICAgICAgICAnLmN0cycsXG4gICAgICAgICcuanMnLFxuICAgICAgICAnLmpzeCcsXG4gICAgICAgICcubWpzJyxcbiAgICAgICAgJy5janMnLFxuICAgICAgXSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgcHJvamVjdFJvb3Q6IHRoaXMudHJhbnNmb3JtUHJvamVjdFJvb3QsXG4gICAgICAgICAgbW9kdWxlU3BlY2lmaWVyUm9vdDogdGhpcy5tb2R1bGVTcGVjaWZpZXJSb290LFxuICAgICAgICAgIHNpZGVFZmZlY3RFbnRyaWVzOiBub3JtYWxpemVkQ2xpZW50U2lkZUVmZmVjdEVudHJpZXMsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIHRoaXMubG9nRXNidWlsZE1lc3NhZ2VzKGNsaWVudFJlc3VsdCwgJ2NsaWVudCBsaWJyYXJ5IGJ1bmRsZScpO1xuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTd2NJZ25vcmVkKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHdlYmhvb2sgaGFuZGxlciBidW5kbGUgZm9yIHJlc3VtaW5nIHdvcmtmbG93cyB2aWEgSFRUUCBjYWxsYmFja3MuXG4gICAqXG4gICAqIEBwYXJhbSBidW5kbGUgLSBJZiB0cnVlLCBidW5kbGVzIGRlcGVuZGVuY2llcyAobmVlZGVkIGZvciBCdWlsZCBPdXRwdXQgQVBJKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZVdlYmhvb2tCdW5kbGUoe1xuICAgIG91dGZpbGUsXG4gICAgYnVuZGxlID0gZmFsc2UsXG4gIH06IHtcbiAgICBvdXRmaWxlOiBzdHJpbmc7XG4gICAgYnVuZGxlPzogYm9vbGVhbjtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nQ3JlYXRlV2ViaG9va0J1bmRsZUluZm8oJ0NyZWF0aW5nIHdlYmhvb2sgcm91dGUnKTtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKG91dGZpbGUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIENyZWF0ZSBhIHN0YXRpYyByb3V0ZSB0aGF0IGNhbGxzIHJlc3VtZVdlYmhvb2tcbiAgICAvLyBUaGlzIHJvdXRlIHdvcmtzIGZvciBib3RoIE5leHQuanMgYW5kIFZlcmNlbCBCdWlsZCBPdXRwdXQgQVBJXG4gICAgLy8gQnVuZGxlZCBCdWlsZCBPdXRwdXQgQVBJIHdlYmhvb2sgZnVuY3Rpb25zIG5lZWQgd29ybGQudHMgc3RhdGljYWxseVxuICAgIC8vIHByZXNlbnQgc28gZ2V0V29ybGRMYXp5KCkgY2FuIHVzZSB0aGUgZ2xvYmFsIGdldFdvcmxkIHJlZ2lzdHJhdGlvblxuICAgIC8vIGluc3RlYWQgb2YgZmFsbGluZyBiYWNrIHRvIGEgbWlzc2luZyBzaWJsaW5nIGltcG9ydChcIi4vd29ybGQuanNcIikuXG4gICAgY29uc3Qgcm91dGVDb250ZW50ID0gYCR7YnVuZGxlID8gXCJpbXBvcnQgJ3dvcmtmbG93L3J1bnRpbWUnO1xcblwiIDogJyd9aW1wb3J0IHsgcmVzdW1lV2ViaG9vayB9IGZyb20gJ3dvcmtmbG93L2FwaSc7XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIocmVxdWVzdCkge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcbiAgLy8gRXh0cmFjdCB0b2tlbiBmcm9tIHBhdGhuYW1lOiAvLndlbGwta25vd24vd29ya2Zsb3cvdjEvd2ViaG9vay97dG9rZW59XG4gIGNvbnN0IHBhdGhQYXJ0cyA9IHVybC5wYXRobmFtZS5zcGxpdCgnLycpO1xuICBjb25zdCB0b2tlbiA9IGRlY29kZVVSSUNvbXBvbmVudChwYXRoUGFydHNbcGF0aFBhcnRzLmxlbmd0aCAtIDFdKTtcblxuICBpZiAoIXRva2VuKSB7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZSgnTWlzc2luZyB0b2tlbicsIHsgc3RhdHVzOiA0MDAgfSk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVzdW1lV2ViaG9vayh0b2tlbiwgcmVxdWVzdCk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIFRPRE86IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBpbnZhbGlkIHRva2VuIGFuZCBvdGhlciBlcnJvcnNcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgcmVzdW1lV2ViaG9vaycsIGVycm9yKTtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHsgc3RhdHVzOiA0MDQgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEdFVCA9IGhhbmRsZXI7XG5leHBvcnQgY29uc3QgUE9TVCA9IGhhbmRsZXI7XG5leHBvcnQgY29uc3QgUFVUID0gaGFuZGxlcjtcbmV4cG9ydCBjb25zdCBQQVRDSCA9IGhhbmRsZXI7XG5leHBvcnQgY29uc3QgREVMRVRFID0gaGFuZGxlcjtcbmV4cG9ydCBjb25zdCBIRUFEID0gaGFuZGxlcjtcbmV4cG9ydCBjb25zdCBPUFRJT05TID0gaGFuZGxlcjtgO1xuXG4gICAgaWYgKCFidW5kbGUpIHtcbiAgICAgIC8vIEZvciBOZXh0LmpzLCBqdXN0IHdyaXRlIHRoZSB1bmJ1bmRsZWQgZmlsZVxuICAgICAgYXdhaXQgd3JpdGVGaWxlKG91dGZpbGUsIHJvdXRlQ29udGVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9yIEJ1aWxkIE91dHB1dCBBUEksIGJ1bmRsZSB3aXRoIGVzYnVpbGQgdG8gcmVzb2x2ZSBpbXBvcnRzXG5cbiAgICBjb25zdCB3ZWJob29rRXNtUmVxdWlyZUJhbm5lciA9IHRoaXMuZ2V0RXNtUmVxdWlyZUJhbm5lcignZXNtJyk7XG4gICAgY29uc3Qgd2ViaG9va0J1bmRsZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGJhbm5lcjoge1xuICAgICAgICBqczogYC8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xcbiR7d2ViaG9va0VzbVJlcXVpcmVCYW5uZXJ9YCxcbiAgICAgIH0sXG4gICAgICBzdGRpbjoge1xuICAgICAgICBjb250ZW50czogcm91dGVDb250ZW50LFxuICAgICAgICByZXNvbHZlRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICBzb3VyY2VmaWxlOiAnd2ViaG9vay1yb3V0ZS5qcycsXG4gICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgIH0sXG4gICAgICBvdXRmaWxlLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGpzeDogJ3ByZXNlcnZlJyxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgY29uZGl0aW9uczogWydpbXBvcnQnLCAnbW9kdWxlJywgJ25vZGUnLCAnZGVmYXVsdCddLFxuICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgIHdyaXRlOiB0cnVlLFxuICAgICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgICBrZWVwTmFtZXM6IHRydWUsXG4gICAgICBtaW5pZnk6IGZhbHNlLFxuICAgICAgcmVzb2x2ZUV4dGVuc2lvbnM6IFtcbiAgICAgICAgJy50cycsXG4gICAgICAgICcudHN4JyxcbiAgICAgICAgJy5tdHMnLFxuICAgICAgICAnLmN0cycsXG4gICAgICAgICcuanMnLFxuICAgICAgICAnLmpzeCcsXG4gICAgICAgICcubWpzJyxcbiAgICAgICAgJy5janMnLFxuICAgICAgXSxcbiAgICAgIHNvdXJjZW1hcDogdGhpcy5yZXNvbHZlU291cmNlbWFwKEVNSVRfU09VUkNFTUFQU19GT1JfREVCVUdHSU5HKSxcbiAgICAgIG1haW5GaWVsZHM6IFsnbW9kdWxlJywgJ21haW4nXSxcbiAgICAgIC8vIERvbid0IGV4dGVybmFsaXplIGFueXRoaW5nIC0gYnVuZGxlIGV2ZXJ5dGhpbmcgaW5jbHVkaW5nIHdvcmtmbG93IHBhY2thZ2VzXG4gICAgICBleHRlcm5hbDogW10sXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvZ0VzYnVpbGRNZXNzYWdlcyhyZXN1bHQsICd3ZWJob29rIGJ1bmRsZSBjcmVhdGlvbicpO1xuICAgIHRoaXMubG9nQ3JlYXRlV2ViaG9va0J1bmRsZUluZm8oXG4gICAgICAnQ3JlYXRlZCB3ZWJob29rIGJ1bmRsZScsXG4gICAgICBgJHtEYXRlLm5vdygpIC0gd2ViaG9va0J1bmRsZVN0YXJ0fW1zYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHBhY2thZ2UuanNvbiBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBtb2R1bGUgdHlwZS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVQYWNrYWdlSnNvbihcbiAgICBkaXI6IHN0cmluZyxcbiAgICB0eXBlOiAnY29tbW9uanMnIHwgJ21vZHVsZSdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSB7IHR5cGUgfTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgICBqb2luKGRpciwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIG51bGwsIDIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgLnZjLWNvbmZpZy5qc29uIGZpbGUgZm9yIFZlcmNlbCBCdWlsZCBPdXRwdXQgQVBJIGZ1bmN0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVWY0NvbmZpZyhcbiAgICBkaXI6IHN0cmluZyxcbiAgICBjb25maWc6IHtcbiAgICAgIHJ1bnRpbWU/OiBzdHJpbmc7XG4gICAgICBoYW5kbGVyPzogc3RyaW5nO1xuICAgICAgbGF1bmNoZXJUeXBlPzogc3RyaW5nO1xuICAgICAgYXJjaGl0ZWN0dXJlPzogc3RyaW5nO1xuICAgICAgc2hvdWxkQWRkSGVscGVycz86IGJvb2xlYW47XG4gICAgICBzaG91bGRBZGRTb3VyY2VtYXBTdXBwb3J0PzogYm9vbGVhbjtcbiAgICAgIG1heER1cmF0aW9uPzogbnVtYmVyIHwgJ21heCc7XG4gICAgICBleHBlcmltZW50YWxUcmlnZ2Vycz86IEFycmF5PHtcbiAgICAgICAgdHlwZTogJ3F1ZXVlL3YyYmV0YSc7XG4gICAgICAgIHRvcGljOiBzdHJpbmc7XG4gICAgICAgIGNvbnN1bWVyOiBzdHJpbmc7XG4gICAgICAgIG1heERlbGl2ZXJpZXM/OiBudW1iZXI7XG4gICAgICAgIHJldHJ5QWZ0ZXJTZWNvbmRzPzogbnVtYmVyO1xuICAgICAgICBpbml0aWFsRGVsYXlTZWNvbmRzPzogbnVtYmVyO1xuICAgICAgfT47XG4gICAgfVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2Y0NvbmZpZyA9IHtcbiAgICAgIHJ1bnRpbWU6IGNvbmZpZy5ydW50aW1lID8/ICdub2RlanMyMi54JyxcbiAgICAgIGhhbmRsZXI6IGNvbmZpZy5oYW5kbGVyID8/ICdpbmRleC5tanMnLFxuICAgICAgbGF1bmNoZXJUeXBlOiBjb25maWcubGF1bmNoZXJUeXBlID8/ICdOb2RlanMnLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBjb25maWcuYXJjaGl0ZWN0dXJlID8/ICdhcm02NCcsXG4gICAgICBzaG91bGRBZGRIZWxwZXJzOiBjb25maWcuc2hvdWxkQWRkSGVscGVycyA/PyB0cnVlLFxuICAgICAgLi4uKGNvbmZpZy5tYXhEdXJhdGlvbiAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgbWF4RHVyYXRpb246IGNvbmZpZy5tYXhEdXJhdGlvbixcbiAgICAgIH0pLFxuICAgICAgLi4uKGNvbmZpZy5zaG91bGRBZGRTb3VyY2VtYXBTdXBwb3J0ICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICBzaG91bGRBZGRTb3VyY2VtYXBTdXBwb3J0OiBjb25maWcuc2hvdWxkQWRkU291cmNlbWFwU3VwcG9ydCxcbiAgICAgIH0pLFxuICAgICAgLi4uKGNvbmZpZy5leHBlcmltZW50YWxUcmlnZ2VycyAmJiB7XG4gICAgICAgIGV4cGVyaW1lbnRhbFRyaWdnZXJzOiBjb25maWcuZXhwZXJpbWVudGFsVHJpZ2dlcnMsXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgYXdhaXQgd3JpdGVGaWxlKFxuICAgICAgam9pbihkaXIsICcudmMtY29uZmlnLmpzb24nKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZjQ29uZmlnLCBudWxsLCAyKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsIHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIGRpcmVjdG9yeSBmb3IgYSBmaWxlIHBhdGggZXhpc3RzLCBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZW5zdXJlU3djSWdub3JlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVByb2plY3RTd2NHaXRpZ25vcmVFbnRyeSgpO1xuICAgIGF3YWl0IHRoaXMuY3JlYXRlU3djRGlyZWN0b3J5R2l0aWdub3JlKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZVByb2plY3RTd2NHaXRpZ25vcmVFbnRyeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBnaXRpZ25vcmVQYXRoID0gam9pbih0aGlzLmNvbmZpZy53b3JraW5nRGlyLCAnLmdpdGlnbm9yZScpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gJyc7XG4gICAgICB0cnkge1xuICAgICAgICBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoZ2l0aWdub3JlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFzU3djRW50cnkgPSBjb250ZW50LnNwbGl0KC9cXHI/XFxuLykuc29tZSgobGluZSkgPT4ge1xuICAgICAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgdHJpbW1lZCA9PT0gJy5zd2MnIHx8XG4gICAgICAgICAgdHJpbW1lZCA9PT0gJy5zd2MvJyB8fFxuICAgICAgICAgIHRyaW1tZWQgPT09ICcvLnN3YycgfHxcbiAgICAgICAgICB0cmltbWVkID09PSAnLy5zd2MvJ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChoYXNTd2NFbnRyeSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlcGFyYXRvciA9XG4gICAgICAgIGNvbnRlbnQubGVuZ3RoID4gMCAmJiAhY29udGVudC5lbmRzV2l0aCgnXFxuJykgPyAnXFxuJyA6ICcnO1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKGdpdGlnbm9yZVBhdGgsIGAke2NvbnRlbnR9JHtzZXBhcmF0b3J9Ly5zd2NcXG5gKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFdlJ3JlIGludGVudGlvbmFsbHkgc2lsZW50bHkgaWdub3JpbmcgdGhpcyBlcnJvciAtIHVwZGF0aW5nIC5naXRpZ25vcmUgaXNuJ3QgY3JpdGljYWxcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZVN3Y0RpcmVjdG9yeUdpdGlnbm9yZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKFxuICAgICAgICBqb2luKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsICcuc3djJywgJy5naXRpZ25vcmUnKSxcbiAgICAgICAgJypcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gV2UncmUgaW50ZW50aW9uYWxseSBzaWxlbnRseSBpZ25vcmluZyB0aGlzIGVycm9yIC0gY3JlYXRpbmcgLmdpdGlnbm9yZSBpc24ndCBjcml0aWNhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBtYW5pZmVzdCBzaG91bGQgYmUgZXhwb3NlZCBhcyBhIHB1YmxpYyBIVFRQIHJvdXRlLlxuICAgKiBDb250cm9sbGVkIGJ5IHRoZSBgV09SS0ZMT1dfUFVCTElDX01BTklGRVNUYCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgc2hvdWxkRXhwb3NlUHVibGljTWFuaWZlc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LldPUktGTE9XX1BVQkxJQ19NQU5JRkVTVCA9PT0gJzEnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSB3b3JrZmxvdyBtYW5pZmVzdCBkaWFnbm9zdGljcyBwYXRoLCB3aGVuIHRoaXMgYnVpbGRlciBzaG91bGRcbiAgICogZW1pdCBvbmUuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0RGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5jb25maWcuZGlhZ25vc3RpY3NEaXIpIHtcbiAgICAgIHJldHVybiByZXNvbHZlKFxuICAgICAgICB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICB0aGlzLmNvbmZpZy5kaWFnbm9zdGljc0RpcixcbiAgICAgICAgJ3dvcmtmbG93cy1tYW5pZmVzdC5qc29uJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcuYnVpbGRUYXJnZXQgPT09ICd2ZXJjZWwtYnVpbGQtb3V0cHV0LWFwaScpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVQYXRoKFxuICAgICAgICAnLnZlcmNlbC9vdXRwdXQvZGlhZ25vc3RpY3Mvd29ya2Zsb3dzLW1hbmlmZXN0Lmpzb24nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBkZXZlbG9wbWVudC93YXRjaCBidWlsZCAoZS5nLiBgbmV4dCBkZXZgLCBgbml0cm8gZGV2YCxcbiAgICogb3IgYSBWaXRlLWJhc2VkIGRldiBzZXJ2ZXIgZm9yIGFzdHJvL3N2ZWx0ZWtpdC92aXRlKS4gYGNvbmZpZy53YXRjaGAgaXNcbiAgICogcGx1bWJlZCBieSB0aGUgYnVpbGRlcnMgdGhhdCBvd24gYSBkZXYgc2VydmVyIChuZXh0LCBuaXRybywgbmVzdCk7IHRoZVxuICAgKiBWaXRlLWJhc2VkIGludGVncmF0aW9ucyBkb24ndCBzZXQgaXQgYnV0IHJ1biB3aXRoXG4gICAqIGBOT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50J2AuIFdoZW4gbmVpdGhlciBzaWduYWwgaXMgcHJlc2VudCB3ZSB0cmVhdCB0aGVcbiAgICogYnVpbGQgYXMgcHJvZHVjdGlvbiwgc28gQ0xJL1ZlcmNlbCBwcm9kdWN0aW9uIGJ1aWxkcyBkZWZhdWx0IHRvIG9mZi5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgaXNEZXZlbG9wbWVudEJ1aWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy53YXRjaCA9PT0gdHJ1ZSB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHNvdXJjZSBtYXAgbW9kZSBmb3IgdGhlIHN0YWNrLXJlbGV2YW50IGJ1bmRsZXMgKHN0ZXBzICsgdGhlXG4gICAqIGludGVybWVkaWF0ZSB3b3JrZmxvdyBWTSBidW5kbGUpOiBpbmxpbmUgc291cmNlIG1hcHMgaW4gZGV2ZWxvcG1lbnQgc29cbiAgICogc3RhY2sgdHJhY2VzIHBvaW50IGF0IHNvdXJjZSBmaWxlcywgYW5kIG9mZiBpbiBwcm9kdWN0aW9uIHNvIGZ1bmN0aW9uXG4gICAqIGJ1bmRsZXMgc3RheSBzbWFsbCAoaGVscHMgc3RheSB1bmRlciB0aGUgVmVyY2VsIDI1ME1CIGZ1bmN0aW9uIGxpbWl0KSBhbmRcbiAgICogc2tpcCB0aGUgc291cmNlLW1hcC1zdXBwb3J0IHJ1bnRpbWUgc2hpbS4gVGhlIGBzb3VyY2VtYXBgIGNvbmZpZyBvcHRpb25cbiAgICogYW5kIGBXT1JLRkxPV19TT1VSQ0VNQVBgIGVudiB2YXIgb3ZlcnJpZGUgdGhpcyBpbiBlaXRoZXIgZW52aXJvbm1lbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGRlZmF1bHRTb3VyY2VtYXBNb2RlKCk6IFNvdXJjZW1hcE1vZGUge1xuICAgIHJldHVybiB0aGlzLmlzRGV2ZWxvcG1lbnRCdWlsZCA/ICdpbmxpbmUnIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgZWZmZWN0aXZlIHNvdXJjZSBtYXAgbW9kZSBmb3IgYSBnaXZlbiBjYWxsIHNpdGUuIFByZWNlZGVuY2U6XG4gICAqIGV4cGxpY2l0IGBzb3VyY2VtYXBgIGNvbmZpZyA+IGBXT1JLRkxPV19TT1VSQ0VNQVBgIGVudiB2YXIgPiB0aGUgY2FsbFxuICAgKiBzaXRlJ3MgZGVmYXVsdC4gUmV0dXJuZWQgdmFsdWUgaXMgcGFzc2VkIGRpcmVjdGx5IHRvIGVzYnVpbGQnc1xuICAgKiBgc291cmNlbWFwYCBvcHRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZVNvdXJjZW1hcChkZWZhdWx0TW9kZTogU291cmNlbWFwTW9kZSk6IFNvdXJjZW1hcE1vZGUge1xuICAgIGlmICh0aGlzLmNvbmZpZy5zb3VyY2VtYXAgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuY29uZmlnLnNvdXJjZW1hcDtcbiAgICBjb25zdCBlbnZNb2RlID0gcGFyc2VTb3VyY2VtYXBFbnYocHJvY2Vzcy5lbnYuV09SS0ZMT1dfU09VUkNFTUFQKTtcbiAgICBpZiAoZW52TW9kZSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gZW52TW9kZTtcbiAgICByZXR1cm4gZGVmYXVsdE1vZGU7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcmVzb2x2ZWQgc291cmNlIG1hcCBtb2RlIGVtaXRzIGFueSBzb3VyY2UgbWFwcyBhdCBhbGwuXG4gICAqIFVzZWQgYnkgY29uc3VtZXJzIGxpa2UgdGhlIFZlcmNlbCBidWlsZGVyIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGVcbiAgICogdGhlIHNvdXJjZS1tYXAtc3VwcG9ydCBydW50aW1lIHNoaW0gaW4gZ2VuZXJhdGVkIGZ1bmN0aW9ucy4gVXNlcyB0aGUgc2FtZVxuICAgKiBlbnZpcm9ubWVudC1hd2FyZSBkZWZhdWx0IChgZGVmYXVsdFNvdXJjZW1hcE1vZGVgKSBhcyB0aGUgc3RlcC93b3JrZmxvd1xuICAgKiBidW5kbGVzLCBzbyBhIHByb2R1Y3Rpb24gYnVpbGQgd2l0aCBubyBvdmVycmlkZSBvbWl0cyB0aGUgc2hpbS5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgc291cmNlbWFwc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZVNvdXJjZW1hcCh0aGlzLmRlZmF1bHRTb3VyY2VtYXBNb2RlKSAhPT0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG1hbmlmZXN0IEpTT04gZmlsZSBjb250YWluaW5nIHN0ZXAvd29ya2Zsb3cvY2xhc3MgbWV0YWRhdGFcbiAgICogYW5kIGdyYXBoIGRhdGEgZm9yIHZpc3VhbGl6YXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBtYW5pZmVzdCBKU09OIHN0cmluZywgb3IgdW5kZWZpbmVkIGlmIG1hbmlmZXN0IGNyZWF0aW9uIGZhaWxlZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVNYW5pZmVzdCh7XG4gICAgd29ya2Zsb3dCdW5kbGVQYXRoLFxuICAgIG1hbmlmZXN0RGlyLFxuICAgIG1hbmlmZXN0LFxuICB9OiB7XG4gICAgd29ya2Zsb3dCdW5kbGVQYXRoOiBzdHJpbmc7XG4gICAgbWFuaWZlc3REaXI6IHN0cmluZztcbiAgICBtYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdDtcbiAgfSk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgYnVpbGRTdGFydCA9IERhdGUubm93KCk7XG4gICAgdGhpcy5sb2dDcmVhdGVNYW5pZmVzdEluZm8oJ0NyZWF0aW5nIG1hbmlmZXN0Li4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd29ya2Zsb3dHcmFwaHMgPSBhd2FpdCBleHRyYWN0V29ya2Zsb3dHcmFwaHMod29ya2Zsb3dCdW5kbGVQYXRoKTtcblxuICAgICAgY29uc3Qgc3RlcHMgPSB0aGlzLmNvbnZlcnRTdGVwc01hbmlmZXN0KG1hbmlmZXN0LnN0ZXBzKTtcbiAgICAgIGNvbnN0IHdvcmtmbG93cyA9IHRoaXMuY29udmVydFdvcmtmbG93c01hbmlmZXN0KFxuICAgICAgICBtYW5pZmVzdC53b3JrZmxvd3MsXG4gICAgICAgIHdvcmtmbG93R3JhcGhzXG4gICAgICApO1xuICAgICAgY29uc3QgY2xhc3NlcyA9IHRoaXMuY29udmVydENsYXNzZXNNYW5pZmVzdChtYW5pZmVzdC5jbGFzc2VzKTtcblxuICAgICAgY29uc3Qgb3V0cHV0ID0geyB2ZXJzaW9uOiAnMS4wLjAnLCBzdGVwcywgd29ya2Zsb3dzLCBjbGFzc2VzIH07XG4gICAgICBjb25zdCBtYW5pZmVzdEpzb24gPSBKU09OLnN0cmluZ2lmeShvdXRwdXQsIG51bGwsIDIpO1xuXG4gICAgICBhd2FpdCBta2RpcihtYW5pZmVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCB3cml0ZUZpbGUoam9pbihtYW5pZmVzdERpciwgJ21hbmlmZXN0Lmpzb24nKSwgbWFuaWZlc3RKc29uKTtcblxuICAgICAgY29uc3QgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGggPSB0aGlzLmdldERpYWdub3N0aWNzTWFuaWZlc3RQYXRoKCk7XG4gICAgICBpZiAoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVEaXJlY3RvcnkoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgsIG1hbmlmZXN0SnNvbik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0ZXBDb3VudCA9IE9iamVjdC52YWx1ZXMoc3RlcHMpLnJlZHVjZShcbiAgICAgICAgKGFjYywgcykgPT4gYWNjICsgT2JqZWN0LmtleXMocykubGVuZ3RoLFxuICAgICAgICAwXG4gICAgICApO1xuICAgICAgY29uc3Qgd29ya2Zsb3dDb3VudCA9IE9iamVjdC52YWx1ZXMod29ya2Zsb3dzKS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHcpID0+IGFjYyArIE9iamVjdC5rZXlzKHcpLmxlbmd0aCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNsYXNzQ291bnQgPSBPYmplY3QudmFsdWVzKGNsYXNzZXMpLnJlZHVjZShcbiAgICAgICAgKGFjYywgYykgPT4gYWNjICsgT2JqZWN0LmtleXMoYykubGVuZ3RoLFxuICAgICAgICAwXG4gICAgICApO1xuXG4gICAgICB0aGlzLmxvZ0NyZWF0ZU1hbmlmZXN0SW5mbyhcbiAgICAgICAgYENyZWF0ZWQgbWFuaWZlc3Qgd2l0aCAke3N0ZXBDb3VudH0gJHtwbHVyYWxpemUoJ3N0ZXAnLCAnc3RlcHMnLCBzdGVwQ291bnQpfSwgJHt3b3JrZmxvd0NvdW50fSAke3BsdXJhbGl6ZSgnd29ya2Zsb3cnLCAnd29ya2Zsb3dzJywgd29ya2Zsb3dDb3VudCl9LCBhbmQgJHtjbGFzc0NvdW50fSAke3BsdXJhbGl6ZSgnY2xhc3MnLCAnY2xhc3NlcycsIGNsYXNzQ291bnQpfWAsXG4gICAgICAgIGAke0RhdGUubm93KCkgLSBidWlsZFN0YXJ0fW1zYFxuICAgICAgKTtcblxuICAgICAgaWYgKCF0aGlzLmNvbmZpZy5zdXBwcmVzc0NyZWF0ZU1hbmlmZXN0TG9ncykge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgJHt0aGlzLmdldFdvcmtmbG93QnVpbGRTdW1tYXJ5UHJlZml4KCl9ICgke3N0ZXBDb3VudH0gJHtwbHVyYWxpemUoJ3N0ZXAnLCAnc3RlcHMnLCBzdGVwQ291bnQpfSwgJHt3b3JrZmxvd0NvdW50fSAke3BsdXJhbGl6ZSgnd29ya2Zsb3cnLCAnd29ya2Zsb3dzJywgd29ya2Zsb3dDb3VudCl9LCB0aW1lICR7Zm9ybWF0QnVpbGREdXJhdGlvbih0aGlzLmdldFdvcmtmbG93QnVpbGREdXJhdGlvbigpKX0pYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy53b3JrZmxvd0J1aWxkU3VtbWFyeUNvdW50ICs9IDE7XG4gICAgICB0aGlzLnJlc2V0V29ya2Zsb3dCdWlsZFRpbWVyKCk7XG5cbiAgICAgIHJldHVybiBtYW5pZmVzdEpzb247XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ0ZhaWxlZCB0byBjcmVhdGUgbWFuaWZlc3Q6JyxcbiAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICApO1xuICAgICAgdGhpcy5yZXNldFdvcmtmbG93QnVpbGRUaW1lcigpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRTdGVwc01hbmlmZXN0KFxuICAgIHN0ZXBzOiBXb3JrZmxvd01hbmlmZXN0WydzdGVwcyddXG4gICk6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHsgc3RlcElkOiBzdHJpbmcgfT4+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHsgc3RlcElkOiBzdHJpbmcgfT4+ID0ge307XG4gICAgaWYgKCFzdGVwcykgcmV0dXJuIHJlc3VsdDtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBlbnRyaWVzXSBvZiBPYmplY3QuZW50cmllcyhzdGVwcykpIHtcbiAgICAgIHJlc3VsdFtmaWxlUGF0aF0gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgICAgIHJlc3VsdFtmaWxlUGF0aF1bbmFtZV0gPSB7IHN0ZXBJZDogZGF0YS5zdGVwSWQgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFdvcmtmbG93c01hbmlmZXN0KFxuICAgIHdvcmtmbG93czogV29ya2Zsb3dNYW5pZmVzdFsnd29ya2Zsb3dzJ10sXG4gICAgZ3JhcGhzOiBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICBSZWNvcmQ8c3RyaW5nLCB7IGdyYXBoOiB7IG5vZGVzOiBhbnlbXTsgZWRnZXM6IGFueVtdIH0gfT5cbiAgICA+XG4gICk6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAgeyB3b3JrZmxvd0lkOiBzdHJpbmc7IGdyYXBoOiB7IG5vZGVzOiBhbnlbXTsgZWRnZXM6IGFueVtdIH0gfVxuICAgID5cbiAgPiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICBSZWNvcmQ8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgeyB3b3JrZmxvd0lkOiBzdHJpbmc7IGdyYXBoOiB7IG5vZGVzOiBhbnlbXTsgZWRnZXM6IGFueVtdIH0gfVxuICAgICAgPlxuICAgID4gPSB7fTtcbiAgICBpZiAoIXdvcmtmbG93cykgcmV0dXJuIHJlc3VsdDtcblxuICAgIC8vIEJ1aWxkIGEgbm9ybWFsaXplZCBsb29rdXAgZm9yIGdyYXBocyBzaW5jZSB0aGUgZ3JhcGggZXh0cmFjdG9yIHVzZXNcbiAgICAvLyBwYXRocyBmcm9tIHdvcmtmbG93SWQgKGUuZy4gXCIuL3dvcmtmbG93cy9oZWxsby1hZ2VudFwiKSB3aGlsZSB0aGVcbiAgICAvLyBtYW5pZmVzdCB1c2VzIHNvdXJjZSBmaWxlIHBhdGhzIChlLmcuIFwid29ya2Zsb3dzL2hlbGxvLWFnZW50LnRzXCIpLlxuICAgIC8vIE5vcm1hbGl6ZSBieSBzdHJpcHBpbmcgbGVhZGluZyBcIi4vXCIgYW5kIGZpbGUgZXh0ZW5zaW9ucy5cbiAgICBjb25zdCBub3JtYWxpemVkR3JhcGhzID0gbmV3IE1hcDxcbiAgICAgIHN0cmluZyxcbiAgICAgIFJlY29yZDxzdHJpbmcsIHsgZ3JhcGg6IHsgbm9kZXM6IGFueVtdOyBlZGdlczogYW55W10gfSB9PlxuICAgID4oKTtcbiAgICBmb3IgKGNvbnN0IFtncmFwaFBhdGgsIGdyYXBoRW50cmllc10gb2YgT2JqZWN0LmVudHJpZXMoZ3JhcGhzKSkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IGdyYXBoUGF0aFxuICAgICAgICAucmVwbGFjZSgvXlxcLlxcLy8sICcnKVxuICAgICAgICAucmVwbGFjZSgvXFwuW14vLl0rJC8sICcnKTtcbiAgICAgIG5vcm1hbGl6ZWRHcmFwaHMuc2V0KG5vcm1hbGl6ZWQsIGdyYXBoRW50cmllcyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGVudHJpZXNdIG9mIE9iamVjdC5lbnRyaWVzKHdvcmtmbG93cykpIHtcbiAgICAgIHJlc3VsdFtmaWxlUGF0aF0gPSB7fTtcbiAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgbWFuaWZlc3QgZmlsZSBwYXRoIGZvciBsb29rdXBcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWxlUGF0aCA9IGZpbGVQYXRoXG4gICAgICAgIC5yZXBsYWNlKC9eXFwuXFwvLywgJycpXG4gICAgICAgIC5yZXBsYWNlKC9cXC5bXi8uXSskLywgJycpO1xuXG4gICAgICBjb25zdCBncmFwaEVudHJpZXMgPVxuICAgICAgICBncmFwaHNbZmlsZVBhdGhdIHx8IG5vcm1hbGl6ZWRHcmFwaHMuZ2V0KG5vcm1hbGl6ZWRGaWxlUGF0aCk7XG5cbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgICAgIHJlc3VsdFtmaWxlUGF0aF1bbmFtZV0gPSB7XG4gICAgICAgICAgd29ya2Zsb3dJZDogZGF0YS53b3JrZmxvd0lkLFxuICAgICAgICAgIGdyYXBoOiBncmFwaEVudHJpZXM/LltuYW1lXT8uZ3JhcGggfHwgeyBub2RlczogW10sIGVkZ2VzOiBbXSB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0Q2xhc3Nlc01hbmlmZXN0KFxuICAgIGNsYXNzZXM6IFdvcmtmbG93TWFuaWZlc3RbJ2NsYXNzZXMnXVxuICApOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB7IGNsYXNzSWQ6IHN0cmluZyB9Pj4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgeyBjbGFzc0lkOiBzdHJpbmcgfT4+ID0ge307XG4gICAgaWYgKCFjbGFzc2VzKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGVudHJpZXNdIG9mIE9iamVjdC5lbnRyaWVzKGNsYXNzZXMpKSB7XG4gICAgICByZXN1bHRbZmlsZVBhdGhdID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBkYXRhXSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzKSkge1xuICAgICAgICByZXN1bHRbZmlsZVBhdGhdW25hbWVdID0geyBjbGFzc0lkOiBkYXRhLmNsYXNzSWQgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIl19
|