aws-cdk 2.1024.0 → 2.1026.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,128 +5,224 @@ exports.displayFlags = displayFlags;
5
5
  const path = require("path");
6
6
  const toolkit_lib_1 = require("@aws-cdk/toolkit-lib");
7
7
  const chalk = require("chalk");
8
+ // @ts-ignore
9
+ const enquirer_1 = require("enquirer");
8
10
  const fs = require("fs-extra");
9
11
  const api_1 = require("../api");
12
+ const obsolete_flags_1 = require("../obsolete-flags");
13
+ var FlagsMenuOptions;
14
+ (function (FlagsMenuOptions) {
15
+ FlagsMenuOptions["ALL_TO_RECOMMENDED"] = "Set all flags to recommended values";
16
+ FlagsMenuOptions["UNCONFIGURED_TO_RECOMMENDED"] = "Set unconfigured flags to recommended values";
17
+ FlagsMenuOptions["UNCONFIGURED_TO_DEFAULT"] = "Set unconfigured flags to their implied configuration (record current behavior)";
18
+ FlagsMenuOptions["MODIFY_SPECIFIC_FLAG"] = "Modify a specific flag";
19
+ FlagsMenuOptions["EXIT"] = "Exit";
20
+ })(FlagsMenuOptions || (FlagsMenuOptions = {}));
10
21
  async function handleFlags(flagData, ioHelper, options, toolkit) {
22
+ flagData = flagData.filter(flag => !obsolete_flags_1.OBSOLETE_FLAGS.includes(flag.name));
23
+ if (flagData.length == 0) {
24
+ await ioHelper.defaults.error('The \'cdk flags\' command is not compatible with the AWS CDK library used by your application. Please upgrade to 2.212.0 or above.');
25
+ return;
26
+ }
27
+ let params = {
28
+ flagData,
29
+ toolkit,
30
+ ioHelper,
31
+ recommended: options.recommended,
32
+ all: options.all,
33
+ value: options.value,
34
+ flagName: options.FLAGNAME,
35
+ default: options.default,
36
+ unconfigured: options.unconfigured,
37
+ };
38
+ const interactiveOptions = Object.values(FlagsMenuOptions);
39
+ if (options.interactive) {
40
+ const prompt = new enquirer_1.Select({
41
+ name: 'option',
42
+ message: 'Menu',
43
+ choices: interactiveOptions,
44
+ });
45
+ const answer = await prompt.run();
46
+ if (answer == FlagsMenuOptions.ALL_TO_RECOMMENDED) {
47
+ params = {
48
+ ...params,
49
+ recommended: true,
50
+ all: true,
51
+ };
52
+ await setMultipleFlags(params);
53
+ }
54
+ else if (answer == FlagsMenuOptions.UNCONFIGURED_TO_RECOMMENDED) {
55
+ params = {
56
+ ...params,
57
+ recommended: true,
58
+ unconfigured: true,
59
+ };
60
+ await setMultipleFlags(params);
61
+ }
62
+ else if (answer == FlagsMenuOptions.UNCONFIGURED_TO_DEFAULT) {
63
+ params = {
64
+ ...params,
65
+ default: true,
66
+ unconfigured: true,
67
+ };
68
+ await setMultipleFlags(params);
69
+ }
70
+ else if (answer == FlagsMenuOptions.MODIFY_SPECIFIC_FLAG) {
71
+ await setFlag(params, true);
72
+ }
73
+ else if (answer == FlagsMenuOptions.EXIT) {
74
+ return;
75
+ }
76
+ return;
77
+ }
11
78
  if (options.FLAGNAME && options.all) {
12
79
  await ioHelper.defaults.error('Error: Cannot use both --all and a specific flag name. Please use either --all to show all flags or specify a single flag name.');
13
80
  return;
14
81
  }
15
- if (options.set && options.all) {
16
- await ioHelper.defaults.error('Error: --set is currently only compatible with a flag name. Please specify which flag you want to set.');
82
+ if ((options.value || options.recommended || options.default || options.unconfigured) && !options.set) {
83
+ await ioHelper.defaults.error('Error: This option can only be used with --set.');
84
+ return;
85
+ }
86
+ if (options.value && !options.FLAGNAME) {
87
+ await ioHelper.defaults.error('Error: --value requires a specific flag name. Please specify a flag name when providing a value.');
88
+ return;
89
+ }
90
+ if (options.recommended && options.default) {
91
+ await ioHelper.defaults.error('Error: Cannot use both --recommended and --default. Please choose one option.');
92
+ return;
93
+ }
94
+ if (options.unconfigured && options.all) {
95
+ await ioHelper.defaults.error('Error: Cannot use both --unconfigured and --all. Please choose one option.');
96
+ return;
97
+ }
98
+ if (options.unconfigured && options.FLAGNAME) {
99
+ await ioHelper.defaults.error('Error: Cannot use --unconfigured with a specific flag name. --unconfigured works on multiple flags.');
100
+ return;
101
+ }
102
+ if (options.set && options.FLAGNAME && !options.value) {
103
+ await ioHelper.defaults.error('Error: When setting a specific flag, you must provide a --value.');
17
104
  return;
18
105
  }
19
- if (options.set && !options.FLAGNAME) {
20
- await ioHelper.defaults.error('Error: --set requires a flag name. Please specify which flag you want to set.');
106
+ if (options.set && options.all && !options.recommended && !options.default) {
107
+ await ioHelper.defaults.error('Error: When using --set with --all, you must specify either --recommended or --default.');
21
108
  return;
22
109
  }
23
- if (options.set && !options.value) {
24
- await ioHelper.defaults.error('Error: --set requires a value. Please specify the value you want to set for the flag.');
110
+ if (options.set && options.unconfigured && !options.recommended && !options.default) {
111
+ await ioHelper.defaults.error('Error: When using --set with --unconfigured, you must specify either --recommended or --default.');
25
112
  return;
26
113
  }
27
114
  if (options.FLAGNAME && !options.set && !options.value) {
28
- await displayFlags(flagData, ioHelper, String(options.FLAGNAME));
115
+ await displayFlags(params);
29
116
  return;
30
117
  }
31
118
  if (options.all && !options.set) {
32
- await displayFlags(flagData, ioHelper, undefined, true);
119
+ await displayFlags(params);
33
120
  return;
34
121
  }
35
- if (options.set && options.FLAGNAME || options.value && options.FLAGNAME) {
36
- await prototypeChanges(flagData, ioHelper, String(options.FLAGNAME), options.value, toolkit);
122
+ if (options.set && options.FLAGNAME && options.value) {
123
+ await setFlag(params);
37
124
  return;
38
125
  }
39
126
  if (!options.FLAGNAME && !options.all && !options.set) {
40
- await displayFlags(flagData, ioHelper, undefined, false);
127
+ await displayFlags(params);
128
+ return;
129
+ }
130
+ if (options.set && options.all && options.recommended) {
131
+ await setMultipleFlags(params);
132
+ return;
133
+ }
134
+ if (options.set && options.all && options.default) {
135
+ await setMultipleFlags(params);
136
+ return;
137
+ }
138
+ if (options.set && options.unconfigured && options.recommended) {
139
+ await setMultipleFlags(params);
140
+ return;
141
+ }
142
+ if (options.set && options.unconfigured && options.default) {
143
+ await setMultipleFlags(params);
144
+ return;
41
145
  }
42
146
  }
43
- async function displayFlags(flagsData, ioHelper, flagName, all) {
44
- if (flagName && flagName.length > 0) {
45
- const flag = flagsData.find(f => f.name === flagName);
147
+ async function setFlag(params, interactive) {
148
+ const { flagData, ioHelper, flagName } = params;
149
+ let updatedParams = params;
150
+ let updatedFlagName = flagName;
151
+ if (interactive) {
152
+ const allFlagNames = flagData.filter(flag => isBooleanFlag(flag) == true).map(flag => flag.name);
153
+ const prompt = new enquirer_1.Select({
154
+ name: 'flag',
155
+ message: 'Select which flag you would like to modify:',
156
+ limit: 100,
157
+ choices: allFlagNames,
158
+ });
159
+ const selectedFlagName = await prompt.run();
160
+ updatedFlagName = [selectedFlagName];
161
+ const valuePrompt = new enquirer_1.Select({
162
+ name: 'value',
163
+ message: 'Select a value:',
164
+ choices: ['true', 'false'],
165
+ });
166
+ const updatedValue = await valuePrompt.run();
167
+ updatedParams = {
168
+ ...params,
169
+ value: updatedValue,
170
+ flagName: updatedFlagName,
171
+ };
172
+ }
173
+ else {
174
+ const flag = flagData.find(f => f.name === flagName[0]);
46
175
  if (!flag) {
47
176
  await ioHelper.defaults.error('Flag not found.');
48
177
  return;
49
178
  }
50
- await ioHelper.defaults.info(`Description: ${flag.explanation}`);
51
- await ioHelper.defaults.info(`Recommended value: ${flag.recommendedValue}`);
52
- await ioHelper.defaults.info(`User value: ${flag.userValue}`);
53
- return;
54
- }
55
- const headers = ['Feature Flag Name', 'Recommended Value', 'User Value'];
56
- const rows = [];
57
- const getFlagPriority = (flag) => {
58
- if (flag.userValue === undefined) {
59
- return 3;
60
- }
61
- else if (String(flag.userValue) === String(flag.recommendedValue)) {
62
- return 1;
63
- }
64
- else {
65
- return 2;
179
+ if (!isBooleanFlag(flag)) {
180
+ await ioHelper.defaults.error(`Flag '${flagName}' is not a boolean flag. Only boolean flags are currently supported.`);
181
+ return;
66
182
  }
67
- };
68
- let flagsToDisplay;
69
- if (all) {
70
- flagsToDisplay = flagsData;
71
183
  }
72
- else {
73
- flagsToDisplay = flagsData.filter(flag => flag.userValue === undefined || String(flag.userValue) !== String(flag.recommendedValue));
184
+ const prototypeSuccess = await prototypeChanges(updatedParams, updatedFlagName);
185
+ if (prototypeSuccess) {
186
+ await handleUserResponse(updatedParams, updatedFlagName);
74
187
  }
75
- const sortedFlags = [...flagsToDisplay].sort((a, b) => {
76
- const priorityA = getFlagPriority(a);
77
- const priorityB = getFlagPriority(b);
78
- if (priorityA !== priorityB) {
79
- return priorityA - priorityB;
80
- }
81
- if (a.module !== b.module) {
82
- return a.module.localeCompare(b.module);
83
- }
84
- return a.name.localeCompare(b.name);
85
- });
86
- let currentModule = '';
87
- sortedFlags.forEach((flag) => {
88
- if (flag.module !== currentModule) {
89
- rows.push([chalk.bold(`Module: ${flag.module}`), '', '']);
90
- currentModule = flag.module;
91
- }
92
- rows.push([
93
- flag.name,
94
- String(flag.recommendedValue),
95
- flag.userValue === undefined ? '<unset>' : String(flag.userValue),
96
- ]);
97
- });
98
- const formattedTable = formatTable(headers, rows);
99
- await ioHelper.defaults.info(formattedTable);
100
188
  }
101
- async function prototypeChanges(flagData, ioHelper, flagName, value, toolkit) {
102
- const flag = flagData.find(f => f.name === flagName);
103
- if (!flag) {
104
- await ioHelper.defaults.error('Flag not found.');
105
- return;
106
- }
107
- if (typeof flag.recommendedValue !== 'boolean' && flag.recommendedValue !== 'true' && flag.recommendedValue !== 'false') {
108
- await ioHelper.defaults.error(`Flag '${flagName}' is not a boolean flag. Only boolean flags are currently supported.`);
109
- return;
110
- }
189
+ async function prototypeChanges(params, flagNames) {
190
+ const { flagData, toolkit, ioHelper, recommended, value } = params;
111
191
  const baseContext = new toolkit_lib_1.CdkAppMultiContext(process.cwd());
112
192
  const baseContextValues = await baseContext.read();
113
193
  const memoryContext = new toolkit_lib_1.MemoryContext(baseContextValues);
114
- const boolValue = value.toLowerCase() === 'true';
115
- if (baseContextValues[flagName] == boolValue) {
116
- await ioHelper.defaults.error('Flag is already set to the specified value. No changes needed.');
117
- return;
118
- }
119
194
  const cdkJson = await JSON.parse(await fs.readFile(path.join(process.cwd(), 'cdk.json'), 'utf-8'));
120
195
  const app = cdkJson.app;
121
196
  const source = await toolkit.fromCdkApp(app, {
122
197
  contextStore: baseContext,
123
198
  outdir: path.join(process.cwd(), 'original'),
124
199
  });
125
- const cx = await toolkit.synth(source);
126
- const assembly = cx.cloudAssembly;
127
200
  const updateObj = {};
128
- updateObj[flagName] = boolValue;
201
+ const boolValue = toBooleanValue(value);
202
+ if (flagNames.length === 1 && value !== undefined) {
203
+ const flagName = flagNames[0];
204
+ if (baseContextValues[flagName] == boolValue) {
205
+ await ioHelper.defaults.info('Flag is already set to the specified value. No changes needed.');
206
+ return false;
207
+ }
208
+ updateObj[flagName] = boolValue;
209
+ }
210
+ else {
211
+ for (const flagName of flagNames) {
212
+ const flag = flagData.find(f => f.name === flagName);
213
+ if (!flag) {
214
+ await ioHelper.defaults.error(`Flag ${flagName} not found.`);
215
+ return false;
216
+ }
217
+ const newValue = recommended
218
+ ? toBooleanValue(flag.recommendedValue)
219
+ : String(flag.unconfiguredBehavesLike?.v2) === 'true';
220
+ updateObj[flagName] = newValue;
221
+ }
222
+ }
129
223
  await memoryContext.update(updateObj);
224
+ const cx = await toolkit.synth(source);
225
+ const assembly = cx.cloudAssembly;
130
226
  const modifiedSource = await toolkit.fromCdkApp(app, {
131
227
  contextStore: memoryContext,
132
228
  outdir: path.join(process.cwd(), 'temp'),
@@ -143,41 +239,70 @@ async function prototypeChanges(flagData, ioHelper, flagName, value, toolkit) {
143
239
  },
144
240
  });
145
241
  }
146
- const userAccepted = await promptUser(ioHelper, flagName, flag.userValue, value?.toLowerCase() === 'true');
147
- if (userAccepted) {
148
- await modifyValues(flagName, value, ioHelper);
149
- await ioHelper.defaults.info('Flag value updated successfully.');
242
+ return true;
243
+ }
244
+ async function setMultipleFlags(params) {
245
+ const { flagData, all } = params;
246
+ let flagsToSet;
247
+ if (all) {
248
+ flagsToSet = flagData.filter(flag => flag.userValue === undefined || !isUserValueEqualToRecommended(flag))
249
+ .filter(flag => isBooleanFlag(flag))
250
+ .map(flag => flag.name);
150
251
  }
151
252
  else {
152
- await ioHelper.defaults.info('Operation cancelled');
253
+ flagsToSet = flagData.filter(flag => flag.userValue === undefined)
254
+ .filter(flag => isBooleanFlag(flag))
255
+ .map(flag => flag.name);
256
+ }
257
+ const prototypeSuccess = await prototypeChanges(params, flagsToSet);
258
+ if (prototypeSuccess) {
259
+ await handleUserResponse(params, flagsToSet);
153
260
  }
154
- const originalDir = path.join(process.cwd(), 'original');
155
- const tempDir = path.join(process.cwd(), 'temp');
156
- await fs.remove(originalDir);
157
- await fs.remove(tempDir);
158
261
  }
159
- async function promptUser(ioHelper, flagName, currentValue, newValue) {
160
- return ioHelper.requestResponse({
262
+ async function handleUserResponse(params, flagNames) {
263
+ const { ioHelper } = params;
264
+ const userAccepted = await ioHelper.requestResponse({
161
265
  time: new Date(),
162
266
  level: 'info',
163
267
  code: 'CDK_TOOLKIT_I9300',
164
268
  message: 'Do you want to accept these changes?',
165
269
  data: {
166
- flagName,
167
- currentValue,
168
- newValue,
270
+ flagNames,
169
271
  responseDescription: 'Enter "y" to apply changes or "n" to cancel',
170
272
  },
171
273
  defaultResponse: false,
172
274
  });
275
+ if (userAccepted) {
276
+ await modifyValues(params, flagNames);
277
+ await ioHelper.defaults.info('Flag value(s) updated successfully.');
278
+ }
279
+ else {
280
+ await ioHelper.defaults.info('Operation cancelled');
281
+ }
282
+ const originalDir = path.join(process.cwd(), 'original');
283
+ const tempDir = path.join(process.cwd(), 'temp');
284
+ await fs.remove(originalDir);
285
+ await fs.remove(tempDir);
173
286
  }
174
- async function modifyValues(flagName, value, ioHelper) {
287
+ async function modifyValues(params, flagNames) {
288
+ const { flagData, ioHelper, value, recommended } = params;
175
289
  const cdkJsonPath = path.join(process.cwd(), 'cdk.json');
176
290
  const cdkJsonContent = await fs.readFile(cdkJsonPath, 'utf-8');
177
291
  const cdkJson = JSON.parse(cdkJsonContent);
178
- const boolValue = value.toLowerCase() === 'true';
179
- cdkJson.context[flagName] = boolValue;
180
- await ioHelper.defaults.info(`Setting flag '${flagName}' to: ${boolValue}`);
292
+ if (flagNames.length == 1) {
293
+ const boolValue = toBooleanValue(value);
294
+ cdkJson.context[String(flagNames[0])] = boolValue;
295
+ await ioHelper.defaults.info(`Setting flag '${flagNames}' to: ${boolValue}`);
296
+ }
297
+ else {
298
+ for (const flagName of flagNames) {
299
+ const flag = flagData.find(f => f.name === flagName);
300
+ const newValue = recommended
301
+ ? toBooleanValue(flag.recommendedValue)
302
+ : String(flag.unconfiguredBehavesLike?.v2) === 'true';
303
+ cdkJson.context[flagName] = newValue;
304
+ }
305
+ }
181
306
  await fs.writeFile(cdkJsonPath, JSON.stringify(cdkJson, null, 2), 'utf-8');
182
307
  }
183
308
  function formatTable(headers, rows) {
@@ -207,4 +332,91 @@ function formatTable(headers, rows) {
207
332
  table += separator;
208
333
  return table;
209
334
  }
210
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZy1vcGVyYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZmxhZy1vcGVyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBU0Esa0NBdUNDO0FBRUQsb0NBZ0VDO0FBbEhELDZCQUE2QjtBQUU3QixzREFBcUY7QUFDckYsK0JBQStCO0FBQy9CLCtCQUErQjtBQUMvQixnQ0FBZ0Q7QUFJekMsS0FBSyxVQUFVLFdBQVcsQ0FBQyxRQUF1QixFQUFFLFFBQWtCLEVBQUUsT0FBcUIsRUFBRSxPQUFnQjtJQUNwSCxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsaUlBQWlJLENBQUMsQ0FBQztRQUNqSyxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDL0IsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyx3R0FBd0csQ0FBQyxDQUFDO1FBQ3hJLE9BQU87SUFDVCxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsK0VBQStFLENBQUMsQ0FBQztRQUMvRyxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNsQyxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLHVGQUF1RixDQUFDLENBQUM7UUFDdkgsT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFD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QUUsRUFBRTtRQUNyQyxPQUFPLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQzlGLENBQUMsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLGVBQWUsRUFBRSxDQUFDO0lBQ3BDLElBQUksS0FBSyxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDN0IsS0FBSyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDbkMsS0FBSyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFFMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ25DLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNuRCxDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILEtBQUssSUFBSSxTQUFTLENBQUM7SUFDbkIsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB0eXBlIHsgRmVhdHVyZUZsYWcsIFRvb2xraXQgfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgeyBDZGtBcHBNdWx0aUNvbnRleHQsIE1lbW9yeUNvbnRleHQsIERpZmZNZXRob2QgfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBTdGFja1NlbGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB0eXBlIHsgSW9IZWxwZXIgfSBmcm9tICcuLi9hcGktcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7IEZsYWdzT3B0aW9ucyB9IGZyb20gJy4uL2NsaS91c2VyLWlucHV0JztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUZsYWdzKGZsYWdEYXRhOiBGZWF0dXJlRmxhZ1tdLCBpb0hlbHBlcjogSW9IZWxwZXIsIG9wdGlvbnM6IEZsYWdzT3B0aW9ucywgdG9vbGtpdDogVG9vbGtpdCkge1xuICBpZiAob3B0aW9ucy5GTEFHTkFNRSAmJiBvcHRpb25zLmFsbCkge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKCdFcnJvcjogQ2Fubm90IHVzZSBib3RoIC0tYWxsIGFuZCBhIHNwZWNpZmljIGZsYWcgbmFtZS4gUGxlYXNlIHVzZSBlaXRoZXIgLS1hbGwgdG8gc2hvdyBhbGwgZmxhZ3Mgb3Igc3BlY2lmeSBhIHNpbmdsZSBmbGFnIG5hbWUuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc2V0ICYmIG9wdGlvbnMuYWxsKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ0Vycm9yOiAtLXNldCBpcyBjdXJyZW50bHkgb25seSBjb21wYXRpYmxlIHdpdGggYSBmbGFnIG5hbWUuIFBsZWFzZSBzcGVjaWZ5IHdoaWNoIGZsYWcgeW91IHdhbnQgdG8gc2V0LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnNldCAmJiAhb3B0aW9ucy5GTEFHTkFNRSkge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKCdFcnJvcjogLS1zZXQgcmVxdWlyZXMgYSBmbGFnIG5hbWUuIFBsZWFzZSBzcGVjaWZ5IHdoaWNoIGZsYWcgeW91IHdhbnQgdG8gc2V0LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnNldCAmJiAhb3B0aW9ucy52YWx1ZSkge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKCdFcnJvcjogLS1zZXQgcmVxdWlyZXMgYSB2YWx1ZS4gUGxlYXNlIHNwZWNpZnkgdGhlIHZhbHVlIHlvdSB3YW50IHRvIHNldCBmb3IgdGhlIGZsYWcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuRkxBR05BTUUgJiYgIW9wdGlvbnMuc2V0ICYmICFvcHRpb25zLnZhbHVlKSB7XG4gICAgYXdhaXQgZGlzcGxheUZsYWdzKGZsYWdEYXRhLCBpb0hlbHBlciwgU3RyaW5nKG9wdGlvbnMuRkxBR05BTUUpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob3B0aW9ucy5hbGwgJiYgIW9wdGlvbnMuc2V0KSB7XG4gICAgYXdhaXQgZGlzcGxheUZsYWdzKGZsYWdEYXRhLCBpb0hlbHBlciwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob3B0aW9ucy5zZXQgJiYgb3B0aW9ucy5GTEFHTkFNRSB8fCBvcHRpb25zLnZhbHVlICYmIG9wdGlvbnMuRkxBR05BTUUpIHtcbiAgICBhd2FpdCBwcm90b3R5cGVDaGFuZ2VzKGZsYWdEYXRhLCBpb0hlbHBlciwgU3RyaW5nKG9wdGlvbnMuRkxBR05BTUUpLCBvcHRpb25zLnZhbHVlLCB0b29sa2l0KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIW9wdGlvbnMuRkxBR05BTUUgJiYgIW9wdGlvbnMuYWxsICYmICFvcHRpb25zLnNldCkge1xuICAgIGF3YWl0IGRpc3BsYXlGbGFncyhmbGFnRGF0YSwgaW9IZWxwZXIsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNwbGF5RmxhZ3MoZmxhZ3NEYXRhOiBGZWF0dXJlRmxhZ1tdLCBpb0hlbHBlcjogSW9IZWxwZXIsIGZsYWdOYW1lPzogc3RyaW5nLCBhbGw/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChmbGFnTmFtZSAmJiBmbGFnTmFtZS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZmxhZyA9IGZsYWdzRGF0YS5maW5kKGYgPT4gZi5uYW1lID09PSBmbGFnTmFtZSk7XG4gICAgaWYgKCFmbGFnKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5lcnJvcignRmxhZyBub3QgZm91bmQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgRGVzY3JpcHRpb246ICR7ZmxhZy5leHBsYW5hdGlvbn1gKTtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKGBSZWNvbW1lbmRlZCB2YWx1ZTogJHtmbGFnLnJlY29tbWVuZGVkVmFsdWV9YCk7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgVXNlciB2YWx1ZTogJHtmbGFnLnVzZXJWYWx1ZX1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBoZWFkZXJzID0gWydGZWF0dXJlIEZsYWcgTmFtZScsICdSZWNvbW1lbmRlZCBWYWx1ZScsICdVc2VyIFZhbHVlJ107XG4gIGNvbnN0IHJvd3M6IHN0cmluZ1tdW10gPSBbXTtcblxuICBjb25zdCBnZXRGbGFnUHJpb3JpdHkgPSAoZmxhZzogRmVhdHVyZUZsYWcpOiBudW1iZXIgPT4ge1xuICAgIGlmIChmbGFnLnVzZXJWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gMztcbiAgICB9IGVsc2UgaWYgKFN0cmluZyhmbGFnLnVzZXJWYWx1ZSkgPT09IFN0cmluZyhmbGFnLnJlY29tbWVuZGVkVmFsdWUpKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDI7XG4gICAgfVxuICB9O1xuXG4gIGxldCBmbGFnc1RvRGlzcGxheTogRmVhdHVyZUZsYWdbXTtcbiAgaWYgKGFsbCkge1xuICAgIGZsYWdzVG9EaXNwbGF5ID0gZmxhZ3NEYXRhO1xuICB9IGVsc2Uge1xuICAgIGZsYWdzVG9EaXNwbGF5ID0gZmxhZ3NEYXRhLmZpbHRlcihmbGFnID0+XG4gICAgICBmbGFnLnVzZXJWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IFN0cmluZyhmbGFnLnVzZXJWYWx1ZSkgIT09IFN0cmluZyhmbGFnLnJlY29tbWVuZGVkVmFsdWUpLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzb3J0ZWRGbGFncyA9IFsuLi5mbGFnc1RvRGlzcGxheV0uc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IHByaW9yaXR5QSA9IGdldEZsYWdQcmlvcml0eShhKTtcbiAgICBjb25zdCBwcmlvcml0eUIgPSBnZXRGbGFnUHJpb3JpdHkoYik7XG5cbiAgICBpZiAocHJpb3JpdHlBICE9PSBwcmlvcml0eUIpIHtcbiAgICAgIHJldHVybiBwcmlvcml0eUEgLSBwcmlvcml0eUI7XG4gICAgfVxuICAgIGlmIChhLm1vZHVsZSAhPT0gYi5tb2R1bGUpIHtcbiAgICAgIHJldHVybiBhLm1vZHVsZS5sb2NhbGVDb21wYXJlKGIubW9kdWxlKTtcbiAgICB9XG4gICAgcmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG4gIH0pO1xuXG4gIGxldCBjdXJyZW50TW9kdWxlID0gJyc7XG4gIHNvcnRlZEZsYWdzLmZvckVhY2goKGZsYWcpID0+IHtcbiAgICBpZiAoZmxhZy5tb2R1bGUgIT09IGN1cnJlbnRNb2R1bGUpIHtcbiAgICAgIHJvd3MucHVzaChbY2hhbGsuYm9sZChgTW9kdWxlOiAke2ZsYWcubW9kdWxlfWApLCAnJywgJyddKTtcbiAgICAgIGN1cnJlbnRNb2R1bGUgPSBmbGFnLm1vZHVsZTtcbiAgICB9XG4gICAgcm93cy5wdXNoKFtcbiAgICAgIGZsYWcubmFtZSxcbiAgICAgIFN0cmluZyhmbGFnLnJlY29tbWVuZGVkVmFsdWUpLFxuICAgICAgZmxhZy51c2VyVmFsdWUgPT09IHVuZGVmaW5lZCA/ICc8dW5zZXQ+JyA6IFN0cmluZyhmbGFnLnVzZXJWYWx1ZSksXG4gICAgXSk7XG4gIH0pO1xuXG4gIGNvbnN0IGZvcm1hdHRlZFRhYmxlID0gZm9ybWF0VGFibGUoaGVhZGVycywgcm93cyk7XG4gIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oZm9ybWF0dGVkVGFibGUpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm90b3R5cGVDaGFuZ2VzKFxuICBmbGFnRGF0YTogRmVhdHVyZUZsYWdbXSxcbiAgaW9IZWxwZXI6IElvSGVscGVyLFxuICBmbGFnTmFtZTogc3RyaW5nLFxuICB2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0b29sa2l0OiBUb29sa2l0LFxuKSB7XG4gIGNvbnN0IGZsYWcgPSBmbGFnRGF0YS5maW5kKGYgPT4gZi5uYW1lID09PSBmbGFnTmFtZSk7XG4gIGlmICghZmxhZykge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKCdGbGFnIG5vdCBmb3VuZC4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodHlwZW9mIGZsYWcucmVjb21tZW5kZWRWYWx1ZSAhPT0gJ2Jvb2xlYW4nICYmIGZsYWcucmVjb21tZW5kZWRWYWx1ZSAhPT0gJ3RydWUnICYmIGZsYWcucmVjb21tZW5kZWRWYWx1ZSAhPT0gJ2ZhbHNlJykge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKGBGbGFnICcke2ZsYWdOYW1lfScgaXMgbm90IGEgYm9vbGVhbiBmbGFnLiBPbmx5IGJvb2xlYW4gZmxhZ3MgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYmFzZUNvbnRleHQgPSBuZXcgQ2RrQXBwTXVsdGlDb250ZXh0KHByb2Nlc3MuY3dkKCkpO1xuICBjb25zdCBiYXNlQ29udGV4dFZhbHVlcyA9IGF3YWl0IGJhc2VDb250ZXh0LnJlYWQoKTtcbiAgY29uc3QgbWVtb3J5Q29udGV4dCA9IG5ldyBNZW1vcnlDb250ZXh0KGJhc2VDb250ZXh0VmFsdWVzKTtcblxuICBjb25zdCBib29sVmFsdWUgPSB2YWx1ZSEudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xuXG4gIGlmIChiYXNlQ29udGV4dFZhbHVlc1tmbGFnTmFtZV0gPT0gYm9vbFZhbHVlKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ0ZsYWcgaXMgYWxyZWFkeSBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gTm8gY2hhbmdlcyBuZWVkZWQuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGNka0pzb24gPSBhd2FpdCBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnY2RrLmpzb24nKSwgJ3V0Zi04JykpO1xuICBjb25zdCBhcHAgPSBjZGtKc29uLmFwcDtcblxuICBjb25zdCBzb3VyY2UgPSBhd2FpdCB0b29sa2l0LmZyb21DZGtBcHAoYXBwLCB7XG4gICAgY29udGV4dFN0b3JlOiBiYXNlQ29udGV4dCxcbiAgICBvdXRkaXI6IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnb3JpZ2luYWwnKSxcbiAgfSk7XG5cbiAgY29uc3QgY3ggPSBhd2FpdCB0b29sa2l0LnN5bnRoKHNvdXJjZSk7XG4gIGNvbnN0IGFzc2VtYmx5ID0gY3guY2xvdWRBc3NlbWJseTtcblxuICBjb25zdCB1cGRhdGVPYmo6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gIHVwZGF0ZU9ialtmbGFnTmFtZV0gPSBib29sVmFsdWU7XG4gIGF3YWl0IG1lbW9yeUNvbnRleHQudXBkYXRlKHVwZGF0ZU9iaik7XG5cbiAgY29uc3QgbW9kaWZpZWRTb3VyY2UgPSBhd2FpdCB0b29sa2l0LmZyb21DZGtBcHAoYXBwLCB7XG4gICAgY29udGV4dFN0b3JlOiBtZW1vcnlDb250ZXh0LFxuICAgIG91dGRpcjogcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICd0ZW1wJyksXG4gIH0pO1xuXG4gIGNvbnN0IG1vZGlmaWVkQ3ggPSBhd2FpdCB0b29sa2l0LnN5bnRoKG1vZGlmaWVkU291cmNlKTtcbiAgY29uc3QgYWxsU3RhY2tzID0gYXNzZW1ibHkuc3RhY2tzUmVjdXJzaXZlbHk7XG5cbiAgZm9yIChjb25zdCBzdGFjayBvZiBhbGxTdGFja3MpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBzdGFjay50ZW1wbGF0ZUZ1bGxQYXRoO1xuICAgIGF3YWl0IHRvb2xraXQuZGlmZihtb2RpZmllZEN4LCB7XG4gICAgICBtZXRob2Q6IERpZmZNZXRob2QuTG9jYWxGaWxlKHRlbXBsYXRlUGF0aCksXG4gICAgICBzdGFja3M6IHtcbiAgICAgICAgc3RyYXRlZ3k6IFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kuUEFUVEVSTl9NVVNUX01BVENIX1NJTkdMRSxcbiAgICAgICAgcGF0dGVybnM6IFtzdGFjay5oaWVyYXJjaGljYWxJZF0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgdXNlckFjY2VwdGVkID0gYXdhaXQgcHJvbXB0VXNlcihcbiAgICBpb0hlbHBlcixcbiAgICBmbGFnTmFtZSxcbiAgICBmbGFnLnVzZXJWYWx1ZSxcbiAgICB2YWx1ZT8udG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnLFxuICApO1xuXG4gIGlmICh1c2VyQWNjZXB0ZWQpIHtcbiAgICBhd2FpdCBtb2RpZnlWYWx1ZXMoZmxhZ05hbWUsIHZhbHVlISwgaW9IZWxwZXIpO1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ0ZsYWcgdmFsdWUgdXBkYXRlZCBzdWNjZXNzZnVsbHkuJyk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygnT3BlcmF0aW9uIGNhbmNlbGxlZCcpO1xuICB9XG5cbiAgY29uc3Qgb3JpZ2luYWxEaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ29yaWdpbmFsJyk7XG4gIGNvbnN0IHRlbXBEaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ3RlbXAnKTtcblxuICBhd2FpdCBmcy5yZW1vdmUob3JpZ2luYWxEaXIpO1xuICBhd2FpdCBmcy5yZW1vdmUodGVtcERpcik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByb21wdFVzZXIoXG4gIGlvSGVscGVyOiBJb0hlbHBlcixcbiAgZmxhZ05hbWU6IHN0cmluZyxcbiAgY3VycmVudFZhbHVlOiB1bmtub3duLFxuICBuZXdWYWx1ZTogYm9vbGVhbixcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gaW9IZWxwZXIucmVxdWVzdFJlc3BvbnNlKHtcbiAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgIGxldmVsOiAnaW5mbycsXG4gICAgY29kZTogJ0NES19UT09MS0lUX0k5MzAwJyxcbiAgICBtZXNzYWdlOiAnRG8geW91IHdhbnQgdG8gYWNjZXB0IHRoZXNlIGNoYW5nZXM/JyxcbiAgICBkYXRhOiB7XG4gICAgICBmbGFnTmFtZSxcbiAgICAgIGN1cnJlbnRWYWx1ZSxcbiAgICAgIG5ld1ZhbHVlLFxuICAgICAgcmVzcG9uc2VEZXNjcmlwdGlvbjogJ0VudGVyIFwieVwiIHRvIGFwcGx5IGNoYW5nZXMgb3IgXCJuXCIgdG8gY2FuY2VsJyxcbiAgICB9LFxuICAgIGRlZmF1bHRSZXNwb25zZTogZmFsc2UsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtb2RpZnlWYWx1ZXMoZmxhZ05hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgaW9IZWxwZXI6IElvSGVscGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNka0pzb25QYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdjZGsuanNvbicpO1xuICBjb25zdCBjZGtKc29uQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGNka0pzb25QYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgY2RrSnNvbiA9IEpTT04ucGFyc2UoY2RrSnNvbkNvbnRlbnQpO1xuXG4gIGNvbnN0IGJvb2xWYWx1ZSA9IHZhbHVlIS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG4gIGNka0pzb24uY29udGV4dFtmbGFnTmFtZV0gPSBib29sVmFsdWU7XG5cbiAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgU2V0dGluZyBmbGFnICcke2ZsYWdOYW1lfScgdG86ICR7Ym9vbFZhbHVlfWApO1xuICBhd2FpdCBmcy53cml0ZUZpbGUoY2RrSnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KGNka0pzb24sIG51bGwsIDIpLCAndXRmLTgnKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VGFibGUoaGVhZGVyczogc3RyaW5nW10sIHJvd3M6IHN0cmluZ1tdW10pOiBzdHJpbmcge1xuICBjb25zdCBjb2x1bW5XaWR0aHMgPSBbXG4gICAgTWF0aC5tYXgoaGVhZGVyc1swXS5sZW5ndGgsIC4uLnJvd3MubWFwKHJvdyA9PiByb3dbMF0ubGVuZ3RoKSksXG4gICAgTWF0aC5tYXgoaGVhZGVyc1sxXS5sZW5ndGgsIC4uLnJvd3MubWFwKHJvdyA9PiByb3dbMV0ubGVuZ3RoKSksXG4gICAgTWF0aC5tYXgoaGVhZGVyc1syXS5sZW5ndGgsIC4uLnJvd3MubWFwKHJvdyA9PiByb3dbMl0ubGVuZ3RoKSksXG4gIF07XG5cbiAgY29uc3QgY3JlYXRlU2VwYXJhdG9yID0gKCkgPT4ge1xuICAgIHJldHVybiAnKycgKyBjb2x1bW5XaWR0aHMubWFwKHdpZHRoID0+ICctJy5yZXBlYXQod2lkdGggKyAyKSkuam9pbignKycpICsgJysnO1xuICB9O1xuXG4gIGNvbnN0IGZvcm1hdFJvdyA9ICh2YWx1ZXM6IHN0cmluZ1tdKSA9PiB7XG4gICAgcmV0dXJuICd8JyArIHZhbHVlcy5tYXAoKHZhbHVlLCBpKSA9PiBgICR7dmFsdWUucGFkRW5kKGNvbHVtbldpZHRoc1tpXSl9IGApLmpvaW4oJ3wnKSArICd8JztcbiAgfTtcblxuICBjb25zdCBzZXBhcmF0b3IgPSBjcmVhdGVTZXBhcmF0b3IoKTtcbiAgbGV0IHRhYmxlID0gc2VwYXJhdG9yICsgJ1xcbic7XG4gIHRhYmxlICs9IGZvcm1hdFJvdyhoZWFkZXJzKSArICdcXG4nO1xuICB0YWJsZSArPSBzZXBhcmF0b3IgKyAnXFxuJztcblxuICByb3dzLmZvckVhY2gocm93ID0+IHtcbiAgICBpZiAocm93WzFdID09PSAnJyAmJiByb3dbMl0gPT09ICcnKSB7XG4gICAgICB0YWJsZSArPSBgICR7cm93WzBdLnBhZEVuZChjb2x1bW5XaWR0aHNbMF0pfSBcXG5gO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YWJsZSArPSBmb3JtYXRSb3cocm93KSArICdcXG4nO1xuICAgIH1cbiAgfSk7XG5cbiAgdGFibGUgKz0gc2VwYXJhdG9yO1xuICByZXR1cm4gdGFibGU7XG59XG4iXX0=
335
+ function getFlagSortOrder(flag) {
336
+ if (flag.userValue === undefined) {
337
+ return 3;
338
+ }
339
+ else if (isUserValueEqualToRecommended(flag)) {
340
+ return 1;
341
+ }
342
+ else {
343
+ return 2;
344
+ }
345
+ }
346
+ async function displayFlagTable(flags, ioHelper) {
347
+ const headers = ['Feature Flag Name', 'Recommended Value', 'User Value'];
348
+ const sortedFlags = [...flags].sort((a, b) => {
349
+ const orderA = getFlagSortOrder(a);
350
+ const orderB = getFlagSortOrder(b);
351
+ if (orderA !== orderB) {
352
+ return orderA - orderB;
353
+ }
354
+ if (a.module !== b.module) {
355
+ return a.module.localeCompare(b.module);
356
+ }
357
+ return a.name.localeCompare(b.name);
358
+ });
359
+ const rows = [];
360
+ let currentModule = '';
361
+ sortedFlags.forEach((flag) => {
362
+ if (flag.module !== currentModule) {
363
+ rows.push([chalk.bold(`Module: ${flag.module}`), '', '']);
364
+ currentModule = flag.module;
365
+ }
366
+ rows.push([
367
+ flag.name,
368
+ String(flag.recommendedValue),
369
+ flag.userValue === undefined ? '<unset>' : String(flag.userValue),
370
+ ]);
371
+ });
372
+ const formattedTable = formatTable(headers, rows);
373
+ await ioHelper.defaults.info(formattedTable);
374
+ }
375
+ async function displayFlags(params) {
376
+ const { flagData, ioHelper, flagName, all } = params;
377
+ if (flagName && flagName.length > 0) {
378
+ const matchingFlags = flagData.filter(f => flagName.some(searchTerm => f.name.toLowerCase().includes(searchTerm.toLowerCase())));
379
+ if (matchingFlags.length === 0) {
380
+ await ioHelper.defaults.error(`Flag matching "${flagName.join(', ')}" not found.`);
381
+ return;
382
+ }
383
+ if (matchingFlags.length === 1) {
384
+ const flag = matchingFlags[0];
385
+ await ioHelper.defaults.info(`Flag name: ${flag.name}`);
386
+ await ioHelper.defaults.info(`Description: ${flag.explanation}`);
387
+ await ioHelper.defaults.info(`Recommended value: ${flag.recommendedValue}`);
388
+ await ioHelper.defaults.info(`User value: ${flag.userValue}`);
389
+ return;
390
+ }
391
+ await ioHelper.defaults.info(`Found ${matchingFlags.length} flags matching "${flagName.join(', ')}":`);
392
+ await displayFlagTable(matchingFlags, ioHelper);
393
+ return;
394
+ }
395
+ let flagsToDisplay;
396
+ if (all) {
397
+ flagsToDisplay = flagData;
398
+ }
399
+ else {
400
+ flagsToDisplay = flagData.filter(flag => flag.userValue === undefined || !isUserValueEqualToRecommended(flag));
401
+ }
402
+ await displayFlagTable(flagsToDisplay, ioHelper);
403
+ }
404
+ function isUserValueEqualToRecommended(flag) {
405
+ return String(flag.userValue) === String(flag.recommendedValue);
406
+ }
407
+ function toBooleanValue(value) {
408
+ if (typeof value === 'boolean') {
409
+ return value;
410
+ }
411
+ if (typeof value === 'string') {
412
+ return value.toLowerCase() === 'true';
413
+ }
414
+ return false;
415
+ }
416
+ function isBooleanFlag(flag) {
417
+ const recommended = flag.recommendedValue;
418
+ return typeof recommended === 'boolean' ||
419
+ recommended === 'true' ||
420
+ recommended === 'false';
421
+ }
422
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZy1vcGVyYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZmxhZy1vcGVyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNENBLGtDQStJQztBQThRRCxvQ0FxQ0M7QUE5ZUQsNkJBQTZCO0FBRTdCLHNEQUFxRjtBQUNyRiwrQkFBK0I7QUFDL0IsYUFBYTtBQUNiLHVDQUFrQztBQUNsQywrQkFBK0I7QUFDL0IsZ0NBQWdEO0FBR2hELHNEQUFtRDtBQUVuRCxJQUFLLGdCQU1KO0FBTkQsV0FBSyxnQkFBZ0I7SUFDbkIsOEVBQTBELENBQUE7SUFDMUQsZ0dBQTRFLENBQUE7SUFDNUUsK0hBQTJHLENBQUE7SUFDM0csbUVBQStDLENBQUE7SUFDL0MsaUNBQWEsQ0FBQTtBQUNmLENBQUMsRUFOSSxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBTXBCO0FBMEJNLEtBQUssVUFBVSxXQUFXLENBQUMsUUFBdUIsRUFBRSxRQUFrQixFQUFFLE9BQXFCLEVBQUUsT0FBZ0I7SUFDcEgsUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLCtCQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRXhFLElBQUksUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN6QixNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLG9JQUFvSSxDQUFDLENBQUM7UUFDcEssT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLE1BQU0sR0FBRztRQUNYLFFBQVE7UUFDUixPQUFPO1FBQ1AsUUFBUTtRQUNSLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztRQUNoQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7UUFDaEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUTtRQUMxQixPQUFPLEVBQUUsT0FB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WUFBWSxHQUFHO1FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQy9ELENBQUM7SUFFRixNQUFNLGVBQWUsR0FBRyxHQUFHLEVBQUU7UUFDM0IsT0FBTyxHQUFHLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNoRixDQUFDLENBQUM7SUFFRixNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQWdCLEVBQUUsRUFBRTtRQUNyQyxPQUFPLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQzlGLENBQUMsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLGVBQWUsRUFBRSxDQUFDO0lBQ3BDLElBQUksS0FBSyxHQUFHLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDN0IsS0FBSyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDbkMsS0FBSyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFFMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNqQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ25DLEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNuRCxDQUFDO2FBQU0sQ0FBQztZQUNOLEtBQUssSUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILEtBQUssSUFBSSxTQUFTLENBQUM7SUFDbkIsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxJQUFpQjtJQUN6QyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDakMsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO1NBQU0sSUFBSSw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQy9DLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7QUFDSCxDQUFDO0FBRUQsS0FBSyxVQUFVLGdCQUFnQixDQUFDLEtBQW9CLEVBQUUsUUFBa0I7SUFDdEUsTUFBTSxPQUFPLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUV6RSxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzNDLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRW5DLElBQUksTUFBTSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3RCLE9BQU8sTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUN6QixDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQixPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLElBQUksR0FBZSxFQUFFLENBQUM7SUFDNUIsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDO0lBRXZCLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUMzQixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssYUFBYSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRCxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM5QixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNSLElBQUksQ0FBQyxJQUFJO1lBQ1QsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztZQUM3QixJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztTQUNsRSxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEQsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRU0sS0FBSyxVQUFVLFlBQVksQ0FBQyxNQUE0QjtJQUM3RCxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBRXJELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDcEMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUN4QyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FDckYsQ0FBQztRQUVGLElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGtCQUFrQixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNuRixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3hELE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7WUFDNUUsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQzlELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLGFBQWEsQ0FBQyxNQUFNLG9CQUFvQixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RyxNQUFNLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNoRCxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksY0FBNkIsQ0FBQztJQUNsQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1IsY0FBYyxHQUFHLFFBQVEsQ0FBQztJQUM1QixDQUFDO1NBQU0sQ0FBQztRQUNOLGNBQWMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ3RDLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLENBQ3JFLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVELFNBQVMsNkJBQTZCLENBQUMsSUFBaUI7SUFDdEQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsS0FBYztJQUNwQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQy9CLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsT0FBTyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssTUFBTSxDQUFDO0lBQ3hDLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxJQUFpQjtJQUN0QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDMUMsT0FBTyxPQUFPLFdBQVcsS0FBSyxTQUFTO1FBQ3JDLFdBQVcsS0FBSyxNQUFNO1FBQ3RCLFdBQVcsS0FBSyxPQUFPLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVGbGFnLCBUb29sa2l0IH0gZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0IHsgQ2RrQXBwTXVsdGlDb250ZXh0LCBNZW1vcnlDb250ZXh0LCBEaWZmTWV0aG9kIH0gZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgU2VsZWN0IH0gZnJvbSAnZW5xdWlyZXInO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgU3RhY2tTZWxlY3Rpb25TdHJhdGVneSB9IGZyb20gJy4uL2FwaSc7XG5pbXBvcnQgdHlwZSB7IElvSGVscGVyIH0gZnJvbSAnLi4vYXBpLXByaXZhdGUnO1xuaW1wb3J0IHR5cGUgeyBGbGFnc09wdGlvbnMgfSBmcm9tICcuLi9jbGkvdXNlci1pbnB1dCc7XG5pbXBvcnQgeyBPQlNPTEVURV9GTEFHUyB9IGZyb20gJy4uL29ic29sZXRlLWZsYWdzJztcblxuZW51bSBGbGFnc01lbnVPcHRpb25zIHtcbiAgQUxMX1RPX1JFQ09NTUVOREVEID0gJ1NldCBhbGwgZmxhZ3MgdG8gcmVjb21tZW5kZWQgdmFsdWVzJyxcbiAgVU5DT05GSUdVUkVEX1RPX1JFQ09NTUVOREVEID0gJ1NldCB1bmNvbmZpZ3VyZWQgZmxhZ3MgdG8gcmVjb21tZW5kZWQgdmFsdWVzJyxcbiAgVU5DT05GSUdVUkVEX1RPX0RFRkFVTFQgPSAnU2V0IHVuY29uZmlndXJlZCBmbGFncyB0byB0aGVpciBpbXBsaWVkIGNvbmZpZ3VyYXRpb24gKHJlY29yZCBjdXJyZW50IGJlaGF2aW9yKScsXG4gIE1PRElGWV9TUEVDSUZJQ19GTEFHID0gJ01vZGlmeSBhIHNwZWNpZmljIGZsYWcnLFxuICBFWElUID0gJ0V4aXQnLFxufVxuXG5pbnRlcmZhY2UgRmxhZ09wZXJhdGlvbnNQYXJhbXMge1xuICBmbGFnRGF0YTogRmVhdHVyZUZsYWdbXTtcbiAgdG9vbGtpdDogVG9vbGtpdDtcbiAgaW9IZWxwZXI6IElvSGVscGVyO1xuXG4gIC8qKiBVc2VyIHJhbiAtLXJlY29tbWVuZGVkIG9wdGlvbiAqL1xuICByZWNvbW1lbmRlZD86IGJvb2xlYW47XG5cbiAgLyoqIFVzZXIgcmFuIC0tYWxsIG9wdGlvbiAqL1xuICBhbGw/OiBib29sZWFuO1xuXG4gIC8qKiBVc2VyIHByb3ZpZGVkIC0tdmFsdWUgZmllbGQgKi9cbiAgdmFsdWU/OiBzdHJpbmc7XG5cbiAgLyoqIFVzZXIgcHJvdmlkZWQgRkxBR05BTUUgZmllbGQgKi9cbiAgZmxhZ05hbWU/OiBzdHJpbmdbXTtcblxuICAvKiogVXNlciByYW4gLS1kZWZhdWx0IG9wdGlvbiAqL1xuICBkZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKiogVXNlciByYW4gLS11bmNvbmZpZ3VyZWQgb3B0aW9uICovXG4gIHVuY29uZmlndXJlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVGbGFncyhmbGFnRGF0YTogRmVhdHVyZUZsYWdbXSwgaW9IZWxwZXI6IElvSGVscGVyLCBvcHRpb25zOiBGbGFnc09wdGlvbnMsIHRvb2xraXQ6IFRvb2xraXQpIHtcbiAgZmxhZ0RhdGEgPSBmbGFnRGF0YS5maWx0ZXIoZmxhZyA9PiAhT0JTT0xFVEVfRkxBR1MuaW5jbHVkZXMoZmxhZy5uYW1lKSk7XG5cbiAgaWYgKGZsYWdEYXRhLmxlbmd0aCA9PSAwKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ1RoZSBcXCdjZGsgZmxhZ3NcXCcgY29tbWFuZCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBBV1MgQ0RLIGxpYnJhcnkgdXNlZCBieSB5b3VyIGFwcGxpY2F0aW9uLiBQbGVhc2UgdXBncmFkZSB0byAyLjIxMi4wIG9yIGFib3ZlLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBwYXJhbXMgPSB7XG4gICAgZmxhZ0RhdGEsXG4gICAgdG9vbGtpdCxcbiAgICBpb0hlbHBlcixcbiAgICByZWNvbW1lbmRlZDogb3B0aW9ucy5yZWNvbW1lbmRlZCxcbiAgICBhbGw6IG9wdGlvbnMuYWxsLFxuICAgIHZhbHVlOiBvcHRpb25zLnZhbHVlLFxuICAgIGZsYWdOYW1lOiBvcHRpb25zLkZMQUdOQU1FLFxuICAgIGRlZmF1bHQ6IG9wdGlvbnMuZGVmYXVsdCxcbiAgICB1bmNvbmZpZ3VyZWQ6IG9wdGlvbnMudW5jb25maWd1cmVkLFxuICB9O1xuXG4gIGNvbnN0IGludGVyYWN0aXZlT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoRmxhZ3NNZW51T3B0aW9ucyk7XG5cbiAgaWYgKG9wdGlvbnMuaW50ZXJhY3RpdmUpIHtcbiAgICBjb25zdCBwcm9tcHQgPSBuZXcgU2VsZWN0KHtcbiAgICAgIG5hbWU6ICdvcHRpb24nLFxuICAgICAgbWVzc2FnZTogJ01lbnUnLFxuICAgICAgY2hvaWNlczogaW50ZXJhY3RpdmVPcHRpb25zLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYW5zd2VyID0gYXdhaXQgcHJvbXB0LnJ1bigpO1xuICAgIGlmIChhbnN3ZXIgPT0gRmxhZ3NNZW51T3B0aW9ucy5BTExfVE9fUkVDT01NRU5ERUQpIHtcbiAgICAgIHBhcmFtcyA9IHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICByZWNvbW1lbmRlZDogdHJ1ZSxcbiAgICAgICAgYWxsOiB0cnVlLFxuICAgICAgfTtcbiAgICAgIGF3YWl0IHNldE11bHRpcGxlRmxhZ3MocGFyYW1zKTtcbiAgICB9IGVsc2UgaWYgKGFuc3dlciA9PSBGbGFnc01lbnVPcHRpb25zLlVOQ09ORklHVVJFRF9UT19SRUNPTU1FTkRFRCkge1xuICAgICAgcGFyYW1zID0ge1xuICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIHJlY29tbWVuZGVkOiB0cnVlLFxuICAgICAgICB1bmNvbmZpZ3VyZWQ6IHRydWUsXG4gICAgICB9O1xuICAgICAgYXdhaXQgc2V0TXVsdGlwbGVGbGFncyhwYXJhbXMpO1xuICAgIH0gZWxzZSBpZiAoYW5zd2VyID09IEZsYWdzTWVudU9wdGlvbnMuVU5DT05GSUdVUkVEX1RPX0RFRkFVTFQpIHtcbiAgICAgIHBhcmFtcyA9IHtcbiAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICB1bmNvbmZpZ3VyZWQ6IHRydWUsXG4gICAgICB9O1xuICAgICAgYXdhaXQgc2V0TXVsdGlwbGVGbGFncyhwYXJhbXMpO1xuICAgIH0gZWxzZSBpZiAoYW5zd2VyID09IEZsYWdzTWVudU9wdGlvbnMuTU9ESUZZX1NQRUNJRklDX0ZMQUcpIHtcbiAgICAgIGF3YWl0IHNldEZsYWcocGFyYW1zLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGFuc3dlciA9PSBGbGFnc01lbnVPcHRpb25zLkVYSVQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuRkxBR05BTUUgJiYgb3B0aW9ucy5hbGwpIHtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5lcnJvcignRXJyb3I6IENhbm5vdCB1c2UgYm90aCAtLWFsbCBhbmQgYSBzcGVjaWZpYyBmbGFnIG5hbWUuIFBsZWFzZSB1c2UgZWl0aGVyIC0tYWxsIHRvIHNob3cgYWxsIGZsYWdzIG9yIHNwZWNpZnkgYSBzaW5nbGUgZmxhZyBuYW1lLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICgob3B0aW9ucy52YWx1ZSB8fCBvcHRpb25zLnJlY29tbWVuZGVkIHx8IG9wdGlvbnMuZGVmYXVsdCB8fCBvcHRpb25zLnVuY29uZmlndXJlZCkgJiYgIW9wdGlvbnMuc2V0KSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ0Vycm9yOiBUaGlzIG9wdGlvbiBjYW4gb25seSBiZSB1c2VkIHdpdGggLS1zZXQuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudmFsdWUgJiYgIW9wdGlvbnMuRkxBR05BTUUpIHtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5lcnJvcignRXJyb3I6IC0tdmFsdWUgcmVxdWlyZXMgYSBzcGVjaWZpYyBmbGFnIG5hbWUuIFBsZWFzZSBzcGVjaWZ5IGEgZmxhZyBuYW1lIHdoZW4gcHJvdmlkaW5nIGEgdmFsdWUuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMucmVjb21tZW5kZWQgJiYgb3B0aW9ucy5kZWZhdWx0KSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ0Vycm9yOiBDYW5ub3QgdXNlIGJvdGggLS1yZWNvbW1lbmRlZCBhbmQgLS1kZWZhdWx0LiBQbGVhc2UgY2hvb3NlIG9uZSBvcHRpb24uJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudW5jb25maWd1cmVkICYmIG9wdGlvbnMuYWxsKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ0Vycm9yOiBDYW5ub3QgdXNlIGJvdGggLS11bmNvbmZpZ3VyZWQgYW5kIC0tYWxsLiBQbGVhc2UgY2hvb3NlIG9uZSBvcHRpb24uJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudW5jb25maWd1cmVkICYmIG9wdGlvbnMuRkxBR05BTUUpIHtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5lcnJvcignRXJyb3I6IENhbm5vdCB1c2UgLS11bmNvbmZpZ3VyZWQgd2l0aCBhIHNwZWNpZmljIGZsYWcgbmFtZS4gLS11bmNvbmZpZ3VyZWQgd29ya3Mgb24gbXVsdGlwbGUgZmxhZ3MuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc2V0ICYmIG9wdGlvbnMuRkxBR05BTUUgJiYgIW9wdGlvbnMudmFsdWUpIHtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5lcnJvcignRXJyb3I6IFdoZW4gc2V0dGluZyBhIHNwZWNpZmljIGZsYWcsIHlvdSBtdXN0IHByb3ZpZGUgYSAtLXZhbHVlLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnNldCAmJiBvcHRpb25zLmFsbCAmJiAhb3B0aW9ucy5yZWNvbW1lbmRlZCAmJiAhb3B0aW9ucy5kZWZhdWx0KSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ0Vycm9yOiBXaGVuIHVzaW5nIC0tc2V0IHdpdGggLS1hbGwsIHlvdSBtdXN0IHNwZWNpZnkgZWl0aGVyIC0tcmVjb21tZW5kZWQgb3IgLS1kZWZhdWx0LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnNldCAmJiBvcHRpb25zLnVuY29uZmlndXJlZCAmJiAhb3B0aW9ucy5yZWNvbW1lbmRlZCAmJiAhb3B0aW9ucy5kZWZhdWx0KSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoJ0Vycm9yOiBXaGVuIHVzaW5nIC0tc2V0IHdpdGggLS11bmNvbmZpZ3VyZWQsIHlvdSBtdXN0IHNwZWNpZnkgZWl0aGVyIC0tcmVjb21tZW5kZWQgb3IgLS1kZWZhdWx0LicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvcHRpb25zLkZMQUdOQU1FICYmICFvcHRpb25zLnNldCAmJiAhb3B0aW9ucy52YWx1ZSkge1xuICAgIGF3YWl0IGRpc3BsYXlGbGFncyhwYXJhbXMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmFsbCAmJiAhb3B0aW9ucy5zZXQpIHtcbiAgICBhd2FpdCBkaXNwbGF5RmxhZ3MocGFyYW1zKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob3B0aW9ucy5zZXQgJiYgb3B0aW9ucy5GTEFHTkFNRSAmJiBvcHRpb25zLnZhbHVlKSB7XG4gICAgYXdhaXQgc2V0RmxhZyhwYXJhbXMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghb3B0aW9ucy5GTEFHTkFNRSAmJiAhb3B0aW9ucy5hbGwgJiYgIW9wdGlvbnMuc2V0KSB7XG4gICAgYXdhaXQgZGlzcGxheUZsYWdzKHBhcmFtcyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc2V0ICYmIG9wdGlvbnMuYWxsICYmIG9wdGlvbnMucmVjb21tZW5kZWQpIHtcbiAgICBhd2FpdCBzZXRNdWx0aXBsZUZsYWdzKHBhcmFtcyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc2V0ICYmIG9wdGlvbnMuYWxsICYmIG9wdGlvbnMuZGVmYXVsdCkge1xuICAgIGF3YWl0IHNldE11bHRpcGxlRmxhZ3MocGFyYW1zKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob3B0aW9ucy5zZXQgJiYgb3B0aW9ucy51bmNvbmZpZ3VyZWQgJiYgb3B0aW9ucy5yZWNvbW1lbmRlZCkge1xuICAgIGF3YWl0IHNldE11bHRpcGxlRmxhZ3MocGFyYW1zKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob3B0aW9ucy5zZXQgJiYgb3B0aW9ucy51bmNvbmZpZ3VyZWQgJiYgb3B0aW9ucy5kZWZhdWx0KSB7XG4gICAgYXdhaXQgc2V0TXVsdGlwbGVGbGFncyhwYXJhbXMpO1xuICAgIHJldHVybjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRGbGFnKHBhcmFtczogRmxhZ09wZXJhdGlvbnNQYXJhbXMsIGludGVyYWN0aXZlPzogYm9vbGVhbikge1xuICBjb25zdCB7IGZsYWdEYXRhLCBpb0hlbHBlciwgZmxhZ05hbWUgfSA9IHBhcmFtcztcbiAgbGV0IHVwZGF0ZWRQYXJhbXMgPSBwYXJhbXM7XG4gIGxldCB1cGRhdGVkRmxhZ05hbWUgPSBmbGFnTmFtZTtcblxuICBpZiAoaW50ZXJhY3RpdmUpIHtcbiAgICBjb25zdCBhbGxGbGFnTmFtZXMgPSBmbGFnRGF0YS5maWx0ZXIoZmxhZyA9PiBpc0Jvb2xlYW5GbGFnKGZsYWcpID09IHRydWUpLm1hcChmbGFnID0+IGZsYWcubmFtZSk7XG5cbiAgICBjb25zdCBwcm9tcHQgPSBuZXcgU2VsZWN0KHtcbiAgICAgIG5hbWU6ICdmbGFnJyxcbiAgICAgIG1lc3NhZ2U6ICdTZWxlY3Qgd2hpY2ggZmxhZyB5b3Ugd291bGQgbGlrZSB0byBtb2RpZnk6JyxcbiAgICAgIGxpbWl0OiAxMDAsXG4gICAgICBjaG9pY2VzOiBhbGxGbGFnTmFtZXMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzZWxlY3RlZEZsYWdOYW1lID0gYXdhaXQgcHJvbXB0LnJ1bigpO1xuICAgIHVwZGF0ZWRGbGFnTmFtZSA9IFtzZWxlY3RlZEZsYWdOYW1lXTtcblxuICAgIGNvbnN0IHZhbHVlUHJvbXB0ID0gbmV3IFNlbGVjdCh7XG4gICAgICBuYW1lOiAndmFsdWUnLFxuICAgICAgbWVzc2FnZTogJ1NlbGVjdCBhIHZhbHVlOicsXG4gICAgICBjaG9pY2VzOiBbJ3RydWUnLCAnZmFsc2UnXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHVwZGF0ZWRWYWx1ZSA9IGF3YWl0IHZhbHVlUHJvbXB0LnJ1bigpO1xuXG4gICAgdXBkYXRlZFBhcmFtcyA9IHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHZhbHVlOiB1cGRhdGVkVmFsdWUsXG4gICAgICBmbGFnTmFtZTogdXBkYXRlZEZsYWdOYW1lLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZmxhZyA9IGZsYWdEYXRhLmZpbmQoZiA9PiBmLm5hbWUgPT09IGZsYWdOYW1lIVswXSk7XG5cbiAgICBpZiAoIWZsYWcpIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKCdGbGFnIG5vdCBmb3VuZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQm9vbGVhbkZsYWcoZmxhZykpIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKGBGbGFnICcke2ZsYWdOYW1lfScgaXMgbm90IGEgYm9vbGVhbiBmbGFnLiBPbmx5IGJvb2xlYW4gZmxhZ3MgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcHJvdG90eXBlU3VjY2VzcyA9IGF3YWl0IHByb3RvdHlwZUNoYW5nZXModXBkYXRlZFBhcmFtcywgdXBkYXRlZEZsYWdOYW1lISk7XG5cbiAgaWYgKHByb3RvdHlwZVN1Y2Nlc3MpIHtcbiAgICBhd2FpdCBoYW5kbGVVc2VyUmVzcG9uc2UodXBkYXRlZFBhcmFtcywgdXBkYXRlZEZsYWdOYW1lISk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvdG90eXBlQ2hhbmdlcyhcbiAgcGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyxcbiAgZmxhZ05hbWVzOiBzdHJpbmdbXSxcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB7IGZsYWdEYXRhLCB0b29sa2l0LCBpb0hlbHBlciwgcmVjb21tZW5kZWQsIHZhbHVlIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGJhc2VDb250ZXh0ID0gbmV3IENka0FwcE11bHRpQ29udGV4dChwcm9jZXNzLmN3ZCgpKTtcbiAgY29uc3QgYmFzZUNvbnRleHRWYWx1ZXMgPSBhd2FpdCBiYXNlQ29udGV4dC5yZWFkKCk7XG4gIGNvbnN0IG1lbW9yeUNvbnRleHQgPSBuZXcgTWVtb3J5Q29udGV4dChiYXNlQ29udGV4dFZhbHVlcyk7XG5cbiAgY29uc3QgY2RrSnNvbiA9IGF3YWl0IEpTT04ucGFyc2UoYXdhaXQgZnMucmVhZEZpbGUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdjZGsuanNvbicpLCAndXRmLTgnKSk7XG4gIGNvbnN0IGFwcCA9IGNka0pzb24uYXBwO1xuXG4gIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHRvb2xraXQuZnJvbUNka0FwcChhcHAsIHtcbiAgICBjb250ZXh0U3RvcmU6IGJhc2VDb250ZXh0LFxuICAgIG91dGRpcjogcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdvcmlnaW5hbCcpLFxuICB9KTtcblxuICBjb25zdCB1cGRhdGVPYmo6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gIGNvbnN0IGJvb2xWYWx1ZSA9IHRvQm9vbGVhblZhbHVlKHZhbHVlKTtcbiAgaWYgKGZsYWdOYW1lcy5sZW5ndGggPT09IDEgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGZsYWdOYW1lID0gZmxhZ05hbWVzWzBdO1xuICAgIGlmIChiYXNlQ29udGV4dFZhbHVlc1tmbGFnTmFtZV0gPT0gYm9vbFZhbHVlKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdGbGFnIGlzIGFscmVhZHkgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIE5vIGNoYW5nZXMgbmVlZGVkLicpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB1cGRhdGVPYmpbZmxhZ05hbWVdID0gYm9vbFZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3QgZmxhZ05hbWUgb2YgZmxhZ05hbWVzKSB7XG4gICAgICBjb25zdCBmbGFnID0gZmxhZ0RhdGEuZmluZChmID0+IGYubmFtZSA9PT0gZmxhZ05hbWUpO1xuICAgICAgaWYgKCFmbGFnKSB7XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmVycm9yKGBGbGFnICR7ZmxhZ05hbWV9IG5vdCBmb3VuZC5gKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3VmFsdWUgPSByZWNvbW1lbmRlZFxuICAgICAgICA/IHRvQm9vbGVhblZhbHVlKGZsYWcucmVjb21tZW5kZWRWYWx1ZSlcbiAgICAgICAgOiBTdHJpbmcoZmxhZy51bmNvbmZpZ3VyZWRCZWhhdmVzTGlrZT8udjIpID09PSAndHJ1ZSc7XG4gICAgICB1cGRhdGVPYmpbZmxhZ05hbWVdID0gbmV3VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgbWVtb3J5Q29udGV4dC51cGRhdGUodXBkYXRlT2JqKTtcbiAgY29uc3QgY3ggPSBhd2FpdCB0b29sa2l0LnN5bnRoKHNvdXJjZSk7XG4gIGNvbnN0IGFzc2VtYmx5ID0gY3guY2xvdWRBc3NlbWJseTtcblxuICBjb25zdCBtb2RpZmllZFNvdXJjZSA9IGF3YWl0IHRvb2xraXQuZnJvbUNka0FwcChhcHAsIHtcbiAgICBjb250ZXh0U3RvcmU6IG1lbW9yeUNvbnRleHQsXG4gICAgb3V0ZGlyOiBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ3RlbXAnKSxcbiAgfSk7XG5cbiAgY29uc3QgbW9kaWZpZWRDeCA9IGF3YWl0IHRvb2xraXQuc3ludGgobW9kaWZpZWRTb3VyY2UpO1xuICBjb25zdCBhbGxTdGFja3MgPSBhc3NlbWJseS5zdGFja3NSZWN1cnNpdmVseTtcblxuICBmb3IgKGNvbnN0IHN0YWNrIG9mIGFsbFN0YWNrcykge1xuICAgIGNvbnN0IHRlbXBsYXRlUGF0aCA9IHN0YWNrLnRlbXBsYXRlRnVsbFBhdGg7XG4gICAgYXdhaXQgdG9vbGtpdC5kaWZmKG1vZGlmaWVkQ3gsIHtcbiAgICAgIG1ldGhvZDogRGlmZk1ldGhvZC5Mb2NhbEZpbGUodGVtcGxhdGVQYXRoKSxcbiAgICAgIHN0YWNrczoge1xuICAgICAgICBzdHJhdGVneTogU3RhY2tTZWxlY3Rpb25TdHJhdGVneS5QQVRURVJOX01VU1RfTUFUQ0hfU0lOR0xFLFxuICAgICAgICBwYXR0ZXJuczogW3N0YWNrLmhpZXJhcmNoaWNhbElkXSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldE11bHRpcGxlRmxhZ3MocGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcykge1xuICBjb25zdCB7IGZsYWdEYXRhLCBhbGwgfSA9IHBhcmFtcztcbiAgbGV0IGZsYWdzVG9TZXQ7XG4gIGlmIChhbGwpIHtcbiAgICBmbGFnc1RvU2V0ID0gZmxhZ0RhdGEuZmlsdGVyKGZsYWcgPT4gZmxhZy51c2VyVmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhaXNVc2VyVmFsdWVFcXVhbFRvUmVjb21tZW5kZWQoZmxhZykpXG4gICAgICAuZmlsdGVyKGZsYWcgPT4gaXNCb29sZWFuRmxhZyhmbGFnKSlcbiAgICAgIC5tYXAoZmxhZyA9PiBmbGFnLm5hbWUpO1xuICB9IGVsc2Uge1xuICAgIGZsYWdzVG9TZXQgPSBmbGFnRGF0YS5maWx0ZXIoZmxhZyA9PlxuICAgICAgZmxhZy51c2VyVmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgIC5maWx0ZXIoZmxhZyA9PiBpc0Jvb2xlYW5GbGFnKGZsYWcpKVxuICAgICAgLm1hcChmbGFnID0+IGZsYWcubmFtZSk7XG4gIH1cbiAgY29uc3QgcHJvdG90eXBlU3VjY2VzcyA9IGF3YWl0IHByb3RvdHlwZUNoYW5nZXMocGFyYW1zLCBmbGFnc1RvU2V0KTtcblxuICBpZiAocHJvdG90eXBlU3VjY2Vzcykge1xuICAgIGF3YWl0IGhhbmRsZVVzZXJSZXNwb25zZShwYXJhbXMsIGZsYWdzVG9TZXQpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVVzZXJSZXNwb25zZShcbiAgcGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyxcbiAgZmxhZ05hbWVzOiBzdHJpbmdbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGlvSGVscGVyIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHVzZXJBY2NlcHRlZCA9IGF3YWl0IGlvSGVscGVyLnJlcXVlc3RSZXNwb25zZSh7XG4gICAgdGltZTogbmV3IERhdGUoKSxcbiAgICBsZXZlbDogJ2luZm8nLFxuICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JOTMwMCcsXG4gICAgbWVzc2FnZTogJ0RvIHlvdSB3YW50IHRvIGFjY2VwdCB0aGVzZSBjaGFuZ2VzPycsXG4gICAgZGF0YToge1xuICAgICAgZmxhZ05hbWVzLFxuICAgICAgcmVzcG9uc2VEZXNjcmlwdGlvbjogJ0VudGVyIFwieVwiIHRvIGFwcGx5IGNoYW5nZXMgb3IgXCJuXCIgdG8gY2FuY2VsJyxcbiAgICB9LFxuICAgIGRlZmF1bHRSZXNwb25zZTogZmFsc2UsXG4gIH0pO1xuICBpZiAodXNlckFjY2VwdGVkKSB7XG4gICAgYXdhaXQgbW9kaWZ5VmFsdWVzKHBhcmFtcywgZmxhZ05hbWVzKTtcbiAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCdGbGFnIHZhbHVlKHMpIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LicpO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oJ09wZXJhdGlvbiBjYW5jZWxsZWQnKTtcbiAgfVxuXG4gIGNvbnN0IG9yaWdpbmFsRGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdvcmlnaW5hbCcpO1xuICBjb25zdCB0ZW1wRGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICd0ZW1wJyk7XG5cbiAgYXdhaXQgZnMucmVtb3ZlKG9yaWdpbmFsRGlyKTtcbiAgYXdhaXQgZnMucmVtb3ZlKHRlbXBEaXIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtb2RpZnlWYWx1ZXMocGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcywgZmxhZ05hbWVzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGZsYWdEYXRhLCBpb0hlbHBlciwgdmFsdWUsIHJlY29tbWVuZGVkIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGNka0pzb25QYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdjZGsuanNvbicpO1xuICBjb25zdCBjZGtKc29uQ29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGNka0pzb25QYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgY2RrSnNvbiA9IEpTT04ucGFyc2UoY2RrSnNvbkNvbnRlbnQpO1xuXG4gIGlmIChmbGFnTmFtZXMubGVuZ3RoID09IDEpIHtcbiAgICBjb25zdCBib29sVmFsdWUgPSB0b0Jvb2xlYW5WYWx1ZSh2YWx1ZSk7XG4gICAgY2RrSnNvbi5jb250ZXh0W1N0cmluZyhmbGFnTmFtZXNbMF0pXSA9IGJvb2xWYWx1ZTtcblxuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oYFNldHRpbmcgZmxhZyAnJHtmbGFnTmFtZXN9JyB0bzogJHtib29sVmFsdWV9YCk7XG4gIH0gZWxzZSB7XG4gICAgZm9yIChjb25zdCBmbGFnTmFtZSBvZiBmbGFnTmFtZXMpIHtcbiAgICAgIGNvbnN0IGZsYWcgPSBmbGFnRGF0YS5maW5kKGYgPT4gZi5uYW1lID09PSBmbGFnTmFtZSk7XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IHJlY29tbWVuZGVkXG4gICAgICAgID8gdG9Cb29sZWFuVmFsdWUoZmxhZyEucmVjb21tZW5kZWRWYWx1ZSlcbiAgICAgICAgOiBTdHJpbmcoZmxhZyEudW5jb25maWd1cmVkQmVoYXZlc0xpa2U/LnYyKSA9PT0gJ3RydWUnO1xuICAgICAgY2RrSnNvbi5jb250ZXh0W2ZsYWdOYW1lXSA9IG5ld1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IGZzLndyaXRlRmlsZShjZGtKc29uUGF0aCwgSlNPTi5zdHJpbmdpZnkoY2RrSnNvbiwgbnVsbCwgMiksICd1dGYtOCcpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUYWJsZShoZWFkZXJzOiBzdHJpbmdbXSwgcm93czogc3RyaW5nW11bXSk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbHVtbldpZHRocyA9IFtcbiAgICBNYXRoLm1heChoZWFkZXJzWzBdLmxlbmd0aCwgLi4ucm93cy5tYXAocm93ID0+IHJvd1swXS5sZW5ndGgpKSxcbiAgICBNYXRoLm1heChoZWFkZXJzWzFdLmxlbmd0aCwgLi4ucm93cy5tYXAocm93ID0+IHJvd1sxXS5sZW5ndGgpKSxcbiAgICBNYXRoLm1heChoZWFkZXJzWzJdLmxlbmd0aCwgLi4ucm93cy5tYXAocm93ID0+IHJvd1syXS5sZW5ndGgpKSxcbiAgXTtcblxuICBjb25zdCBjcmVhdGVTZXBhcmF0b3IgPSAoKSA9PiB7XG4gICAgcmV0dXJuICcrJyArIGNvbHVtbldpZHRocy5tYXAod2lkdGggPT4gJy0nLnJlcGVhdCh3aWR0aCArIDIpKS5qb2luKCcrJykgKyAnKyc7XG4gIH07XG5cbiAgY29uc3QgZm9ybWF0Um93ID0gKHZhbHVlczogc3RyaW5nW10pID0+IHtcbiAgICByZXR1cm4gJ3wnICsgdmFsdWVzLm1hcCgodmFsdWUsIGkpID0+IGAgJHt2YWx1ZS5wYWRFbmQoY29sdW1uV2lkdGhzW2ldKX0gYCkuam9pbignfCcpICsgJ3wnO1xuICB9O1xuXG4gIGNvbnN0IHNlcGFyYXRvciA9IGNyZWF0ZVNlcGFyYXRvcigpO1xuICBsZXQgdGFibGUgPSBzZXBhcmF0b3IgKyAnXFxuJztcbiAgdGFibGUgKz0gZm9ybWF0Um93KGhlYWRlcnMpICsgJ1xcbic7XG4gIHRhYmxlICs9IHNlcGFyYXRvciArICdcXG4nO1xuXG4gIHJvd3MuZm9yRWFjaChyb3cgPT4ge1xuICAgIGlmIChyb3dbMV0gPT09ICcnICYmIHJvd1syXSA9PT0gJycpIHtcbiAgICAgIHRhYmxlICs9IGAgJHtyb3dbMF0ucGFkRW5kKGNvbHVtbldpZHRoc1swXSl9IFxcbmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhYmxlICs9IGZvcm1hdFJvdyhyb3cpICsgJ1xcbic7XG4gICAgfVxuICB9KTtcblxuICB0YWJsZSArPSBzZXBhcmF0b3I7XG4gIHJldHVybiB0YWJsZTtcbn1cblxuZnVuY3Rpb24gZ2V0RmxhZ1NvcnRPcmRlcihmbGFnOiBGZWF0dXJlRmxhZyk6IG51bWJlciB7XG4gIGlmIChmbGFnLnVzZXJWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIDM7XG4gIH0gZWxzZSBpZiAoaXNVc2VyVmFsdWVFcXVhbFRvUmVjb21tZW5kZWQoZmxhZykpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMjtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkaXNwbGF5RmxhZ1RhYmxlKGZsYWdzOiBGZWF0dXJlRmxhZ1tdLCBpb0hlbHBlcjogSW9IZWxwZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaGVhZGVycyA9IFsnRmVhdHVyZSBGbGFnIE5hbWUnLCAnUmVjb21tZW5kZWQgVmFsdWUnLCAnVXNlciBWYWx1ZSddO1xuXG4gIGNvbnN0IHNvcnRlZEZsYWdzID0gWy4uLmZsYWdzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3Qgb3JkZXJBID0gZ2V0RmxhZ1NvcnRPcmRlcihhKTtcbiAgICBjb25zdCBvcmRlckIgPSBnZXRGbGFnU29ydE9yZGVyKGIpO1xuXG4gICAgaWYgKG9yZGVyQSAhPT0gb3JkZXJCKSB7XG4gICAgICByZXR1cm4gb3JkZXJBIC0gb3JkZXJCO1xuICAgIH1cbiAgICBpZiAoYS5tb2R1bGUgIT09IGIubW9kdWxlKSB7XG4gICAgICByZXR1cm4gYS5tb2R1bGUubG9jYWxlQ29tcGFyZShiLm1vZHVsZSk7XG4gICAgfVxuICAgIHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuICB9KTtcblxuICBjb25zdCByb3dzOiBzdHJpbmdbXVtdID0gW107XG4gIGxldCBjdXJyZW50TW9kdWxlID0gJyc7XG5cbiAgc29ydGVkRmxhZ3MuZm9yRWFjaCgoZmxhZykgPT4ge1xuICAgIGlmIChmbGFnLm1vZHVsZSAhPT0gY3VycmVudE1vZHVsZSkge1xuICAgICAgcm93cy5wdXNoKFtjaGFsay5ib2xkKGBNb2R1bGU6ICR7ZmxhZy5tb2R1bGV9YCksICcnLCAnJ10pO1xuICAgICAgY3VycmVudE1vZHVsZSA9IGZsYWcubW9kdWxlO1xuICAgIH1cbiAgICByb3dzLnB1c2goW1xuICAgICAgZmxhZy5uYW1lLFxuICAgICAgU3RyaW5nKGZsYWcucmVjb21tZW5kZWRWYWx1ZSksXG4gICAgICBmbGFnLnVzZXJWYWx1ZSA9PT0gdW5kZWZpbmVkID8gJzx1bnNldD4nIDogU3RyaW5nKGZsYWcudXNlclZhbHVlKSxcbiAgICBdKTtcbiAgfSk7XG5cbiAgY29uc3QgZm9ybWF0dGVkVGFibGUgPSBmb3JtYXRUYWJsZShoZWFkZXJzLCByb3dzKTtcbiAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhmb3JtYXR0ZWRUYWJsZSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNwbGF5RmxhZ3MocGFyYW1zOiBGbGFnT3BlcmF0aW9uc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGZsYWdEYXRhLCBpb0hlbHBlciwgZmxhZ05hbWUsIGFsbCB9ID0gcGFyYW1zO1xuXG4gIGlmIChmbGFnTmFtZSAmJiBmbGFnTmFtZS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgbWF0Y2hpbmdGbGFncyA9IGZsYWdEYXRhLmZpbHRlcihmID0+XG4gICAgICBmbGFnTmFtZS5zb21lKHNlYXJjaFRlcm0gPT4gZi5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpKSksXG4gICAgKTtcblxuICAgIGlmIChtYXRjaGluZ0ZsYWdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuZXJyb3IoYEZsYWcgbWF0Y2hpbmcgXCIke2ZsYWdOYW1lLmpvaW4oJywgJyl9XCIgbm90IGZvdW5kLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtYXRjaGluZ0ZsYWdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZmxhZyA9IG1hdGNoaW5nRmxhZ3NbMF07XG4gICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKGBGbGFnIG5hbWU6ICR7ZmxhZy5uYW1lfWApO1xuICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgRGVzY3JpcHRpb246ICR7ZmxhZy5leHBsYW5hdGlvbn1gKTtcbiAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oYFJlY29tbWVuZGVkIHZhbHVlOiAke2ZsYWcucmVjb21tZW5kZWRWYWx1ZX1gKTtcbiAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oYFVzZXIgdmFsdWU6ICR7ZmxhZy51c2VyVmFsdWV9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgRm91bmQgJHttYXRjaGluZ0ZsYWdzLmxlbmd0aH0gZmxhZ3MgbWF0Y2hpbmcgXCIke2ZsYWdOYW1lLmpvaW4oJywgJyl9XCI6YCk7XG4gICAgYXdhaXQgZGlzcGxheUZsYWdUYWJsZShtYXRjaGluZ0ZsYWdzLCBpb0hlbHBlcik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGZsYWdzVG9EaXNwbGF5OiBGZWF0dXJlRmxhZ1tdO1xuICBpZiAoYWxsKSB7XG4gICAgZmxhZ3NUb0Rpc3BsYXkgPSBmbGFnRGF0YTtcbiAgfSBlbHNlIHtcbiAgICBmbGFnc1RvRGlzcGxheSA9IGZsYWdEYXRhLmZpbHRlcihmbGFnID0+XG4gICAgICBmbGFnLnVzZXJWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8ICFpc1VzZXJWYWx1ZUVxdWFsVG9SZWNvbW1lbmRlZChmbGFnKSxcbiAgICApO1xuICB9XG5cbiAgYXdhaXQgZGlzcGxheUZsYWdUYWJsZShmbGFnc1RvRGlzcGxheSwgaW9IZWxwZXIpO1xufVxuXG5mdW5jdGlvbiBpc1VzZXJWYWx1ZUVxdWFsVG9SZWNvbW1lbmRlZChmbGFnOiBGZWF0dXJlRmxhZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gU3RyaW5nKGZsYWcudXNlclZhbHVlKSA9PT0gU3RyaW5nKGZsYWcucmVjb21tZW5kZWRWYWx1ZSk7XG59XG5cbmZ1bmN0aW9uIHRvQm9vbGVhblZhbHVlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0Jvb2xlYW5GbGFnKGZsYWc6IEZlYXR1cmVGbGFnKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlY29tbWVuZGVkID0gZmxhZy5yZWNvbW1lbmRlZFZhbHVlO1xuICByZXR1cm4gdHlwZW9mIHJlY29tbWVuZGVkID09PSAnYm9vbGVhbicgfHxcbiAgICByZWNvbW1lbmRlZCA9PT0gJ3RydWUnIHx8XG4gICAgcmVjb21tZW5kZWQgPT09ICdmYWxzZSc7XG59XG4iXX0=