@fjall/util 0.88.3 → 0.89.2
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/LICENSE +21 -0
- package/dist/src/Config.d.ts +68 -147
- package/dist/src/Config.js +157 -350
- package/dist/src/caseConversion.d.ts +33 -0
- package/dist/src/caseConversion.js +59 -0
- package/dist/src/domainExports.d.ts +19 -0
- package/dist/src/domainExports.js +18 -0
- package/dist/src/errorUtils.d.ts +24 -0
- package/dist/src/errorUtils.js +69 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.js +18 -2
- package/package.json +4 -4
package/dist/src/Config.js
CHANGED
|
@@ -4,122 +4,91 @@ exports.Config = void 0;
|
|
|
4
4
|
const fs = require("fs");
|
|
5
5
|
const path = require("path");
|
|
6
6
|
const zod_1 = require("zod");
|
|
7
|
+
const logger_js_1 = require("./logger.js");
|
|
7
8
|
/**
|
|
8
9
|
* Maximum depth for searching up the directory tree for config files.
|
|
9
10
|
* Prevents infinite loops when traversing directories.
|
|
10
11
|
*/
|
|
11
12
|
const CONFIG_SEARCH_MAX_DEPTH = 10;
|
|
12
|
-
//
|
|
13
|
-
const
|
|
13
|
+
// Per-app config schemas
|
|
14
|
+
const DeployStageSchema = zod_1.z
|
|
14
15
|
.object({
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
account: zod_1.z.string(),
|
|
17
|
+
regions: zod_1.z.array(zod_1.z.string()).min(1)
|
|
17
18
|
})
|
|
18
19
|
.strict();
|
|
19
|
-
const
|
|
20
|
+
const DomainConfigSchema = zod_1.z
|
|
20
21
|
.object({
|
|
21
|
-
id: zod_1.z.string(),
|
|
22
|
-
type: zod_1.z.string().optional(),
|
|
23
|
-
version: zod_1.z.number().optional(),
|
|
24
|
-
options: zod_1.z.object({}).passthrough().optional(),
|
|
25
|
-
dockerConfig: DockerConfigSchema.optional(),
|
|
26
|
-
apiApplicationId: zod_1.z.string().optional()
|
|
27
|
-
})
|
|
28
|
-
.strict();
|
|
29
|
-
const ProviderAccountSchema = zod_1.z
|
|
30
|
-
.object({
|
|
31
|
-
id: zod_1.z.string(),
|
|
32
22
|
name: zod_1.z.string(),
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
.strict();
|
|
37
|
-
const ProfileSchema = zod_1.z
|
|
38
|
-
.object({
|
|
39
|
-
type: zod_1.z.enum(["iam", "sso", "oidc"]),
|
|
40
|
-
region: zod_1.z.string(),
|
|
41
|
-
ssoAccountId: zod_1.z.string().optional(),
|
|
42
|
-
ssoRoleName: zod_1.z.string().optional(),
|
|
43
|
-
ssoSession: zod_1.z.string().optional(),
|
|
44
|
-
oidcRoleArn: zod_1.z.string().optional(),
|
|
45
|
-
oidcProviderArn: zod_1.z.string().optional(),
|
|
46
|
-
credentialSource: zod_1.z.string().optional(),
|
|
47
|
-
roleArn: zod_1.z.string().optional(),
|
|
48
|
-
roleSessionName: zod_1.z.string().optional()
|
|
49
|
-
})
|
|
50
|
-
.strict();
|
|
51
|
-
const SSOSessionSchema = zod_1.z
|
|
52
|
-
.object({
|
|
53
|
-
ssoRegion: zod_1.z.string(),
|
|
54
|
-
ssoStartUrl: zod_1.z.string()
|
|
55
|
-
})
|
|
56
|
-
.strict();
|
|
57
|
-
const OidcConnectionSchema = zod_1.z
|
|
58
|
-
.object({
|
|
59
|
-
roleArn: zod_1.z.string(),
|
|
60
|
-
externalId: zod_1.z.string()
|
|
23
|
+
type: zod_1.z.enum(["apex", "delegated"]),
|
|
24
|
+
parentDomain: zod_1.z.string().optional(),
|
|
25
|
+
account: zod_1.z.string().optional()
|
|
61
26
|
})
|
|
62
27
|
.strict();
|
|
63
28
|
const RootConfigSchema = zod_1.z
|
|
64
29
|
.object({
|
|
65
30
|
version: zod_1.z.number().optional(),
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
secondaryRegions: zod_1.z.array(zod_1.z.string()).optional(),
|
|
71
|
-
disasterRecoveryRegion: zod_1.z.string().optional(),
|
|
72
|
-
currentProfile: zod_1.z.string().optional(),
|
|
73
|
-
profiles: zod_1.z.record(zod_1.z.string(), ProfileSchema).optional(),
|
|
74
|
-
ssoSessions: zod_1.z.record(zod_1.z.string(), SSOSessionSchema).optional(),
|
|
75
|
-
organisationId: zod_1.z.string().optional(),
|
|
76
|
-
organisationName: zod_1.z.string().optional(),
|
|
77
|
-
organisationEmail: zod_1.z.string().optional(),
|
|
78
|
-
oidcIssuerUrl: zod_1.z.string().optional(),
|
|
79
|
-
oidcConnections: zod_1.z.record(zod_1.z.string(), OidcConnectionSchema).optional(),
|
|
80
|
-
rootOidcRoleArn: zod_1.z.string().optional()
|
|
81
|
-
})
|
|
82
|
-
.strict();
|
|
83
|
-
const CostAllocationTagsSchema = zod_1.z
|
|
84
|
-
.object({
|
|
85
|
-
TagKey: zod_1.z.string(),
|
|
86
|
-
Status: zod_1.z.string()
|
|
31
|
+
generatorVersion: zod_1.z.string().optional(),
|
|
32
|
+
deploy: zod_1.z.record(zod_1.z.string(), DeployStageSchema).optional(),
|
|
33
|
+
activeStage: zod_1.z.string().optional(),
|
|
34
|
+
domains: zod_1.z.array(DomainConfigSchema).optional()
|
|
87
35
|
})
|
|
88
36
|
.strict();
|
|
89
|
-
const AccountSchema = zod_1.z
|
|
90
|
-
.object({
|
|
91
|
-
Id: zod_1.z.string().optional(),
|
|
92
|
-
Arn: zod_1.z.string().optional(),
|
|
93
|
-
Email: zod_1.z.string().optional(),
|
|
94
|
-
Name: zod_1.z.string().optional(),
|
|
95
|
-
Status: zod_1.z.enum(["ACTIVE", "SUSPENDED", "PENDING_CLOSURE"]).optional(),
|
|
96
|
-
JoinedMethod: zod_1.z.enum(["INVITED", "CREATED"]).optional(),
|
|
97
|
-
// z.coerce.date() handles both Date objects (from AWS SDK) and ISO 8601 strings (from JSON parsing)
|
|
98
|
-
JoinedTimestamp: zod_1.z.coerce.date().optional()
|
|
99
|
-
})
|
|
100
|
-
.passthrough();
|
|
101
37
|
/**
|
|
102
38
|
* The current base-version of any newly created config file
|
|
103
39
|
*/
|
|
104
40
|
const BASE_CONFIG_VERSION = 0.1;
|
|
41
|
+
/**
|
|
42
|
+
* Config class for loading and saving per-app fjall-config.json files.
|
|
43
|
+
* Each app has its own config at fjall/<app>/fjall-config.json.
|
|
44
|
+
* Stores deploy mapping, active stage, domains, and generator version.
|
|
45
|
+
* Org-level config (accounts, regions, OIDC) is served by OrgConfigClient from the API.
|
|
46
|
+
*/
|
|
105
47
|
class Config {
|
|
106
|
-
constructor(rootConfig,
|
|
48
|
+
constructor(rootConfig, configPath) {
|
|
49
|
+
this.configPath = null;
|
|
107
50
|
this.rootConfig = rootConfig ?? {
|
|
108
|
-
version: BASE_CONFIG_VERSION
|
|
109
|
-
services: {},
|
|
110
|
-
providerAccounts: []
|
|
51
|
+
version: BASE_CONFIG_VERSION
|
|
111
52
|
};
|
|
112
|
-
this.
|
|
113
|
-
this.costAllocationTagsConfig = costAllocationTagsConfig ?? [];
|
|
53
|
+
this.configPath = configPath ?? null;
|
|
114
54
|
}
|
|
115
|
-
|
|
116
|
-
|
|
55
|
+
/**
|
|
56
|
+
* Find the fjall directory by walking up the directory tree
|
|
57
|
+
*/
|
|
58
|
+
static findFjallDirectory() {
|
|
59
|
+
let currentDir = process.cwd();
|
|
60
|
+
for (let i = 0; i < CONFIG_SEARCH_MAX_DEPTH; i++) {
|
|
61
|
+
const fjallDir = path.join(currentDir, "fjall");
|
|
62
|
+
if (fs.existsSync(fjallDir) && fs.statSync(fjallDir).isDirectory()) {
|
|
63
|
+
return fjallDir;
|
|
64
|
+
}
|
|
65
|
+
const parentDir = path.dirname(currentDir);
|
|
66
|
+
if (parentDir === currentDir)
|
|
67
|
+
break;
|
|
68
|
+
currentDir = parentDir;
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
117
71
|
}
|
|
118
72
|
/**
|
|
119
|
-
* Find the
|
|
120
|
-
*
|
|
73
|
+
* Find the config directory for a specific app or the legacy root config.
|
|
74
|
+
* When appName is provided, looks for fjall/<appName>/fjall-config.json.
|
|
75
|
+
* When omitted, falls back to legacy fjall/fjall-config.json or direct fjall-config.json.
|
|
121
76
|
*/
|
|
122
|
-
static findConfigDirectory() {
|
|
77
|
+
static findConfigDirectory(appName) {
|
|
78
|
+
if (appName) {
|
|
79
|
+
if (appName !== path.basename(appName))
|
|
80
|
+
return null;
|
|
81
|
+
const fjallDir = Config.findFjallDirectory();
|
|
82
|
+
if (!fjallDir)
|
|
83
|
+
return null;
|
|
84
|
+
const appDir = path.join(fjallDir, appName);
|
|
85
|
+
const configFile = path.join(appDir, "fjall-config.json");
|
|
86
|
+
if (fs.existsSync(configFile)) {
|
|
87
|
+
return appDir;
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
// Legacy: look for fjall/fjall-config.json or direct fjall-config.json
|
|
123
92
|
let currentDir = process.cwd();
|
|
124
93
|
for (let i = 0; i < CONFIG_SEARCH_MAX_DEPTH; i++) {
|
|
125
94
|
const fjallDir = path.join(currentDir, "fjall");
|
|
@@ -140,37 +109,32 @@ class Config {
|
|
|
140
109
|
}
|
|
141
110
|
/**
|
|
142
111
|
* Load config file into memory as a raw JSON string
|
|
143
|
-
* @param configFile - Path to the config file
|
|
144
|
-
* @returns Config as JSON string or NULL if no config file accessible
|
|
145
112
|
*/
|
|
146
113
|
static loadConfigFile(configFile) {
|
|
147
114
|
try {
|
|
148
115
|
fs.accessSync(configFile, fs.constants.R_OK | fs.constants.W_OK);
|
|
149
116
|
return fs.readFileSync(configFile, { encoding: "utf8" });
|
|
150
117
|
}
|
|
151
|
-
catch {
|
|
118
|
+
catch (err) {
|
|
119
|
+
logger_js_1.logger.debug("Config", "Config file not accessible", {
|
|
120
|
+
file: configFile,
|
|
121
|
+
error: err instanceof Error ? err.message : String(err)
|
|
122
|
+
});
|
|
152
123
|
return null;
|
|
153
124
|
}
|
|
154
125
|
}
|
|
155
126
|
/**
|
|
156
|
-
* Load configuration from file
|
|
157
|
-
*
|
|
158
|
-
* @returns Loaded configuration
|
|
159
|
-
* @throws Error if config file cannot be parsed or fails schema validation
|
|
127
|
+
* Load configuration from file.
|
|
128
|
+
* @param appName - Optional app name to load config for a specific app
|
|
160
129
|
*/
|
|
161
|
-
static loadConfig() {
|
|
162
|
-
const configDir = Config.findConfigDirectory();
|
|
130
|
+
static loadConfig(appName) {
|
|
131
|
+
const configDir = Config.findConfigDirectory(appName);
|
|
163
132
|
if (!configDir) {
|
|
164
133
|
return new Config();
|
|
165
134
|
}
|
|
166
|
-
const
|
|
167
|
-
const
|
|
168
|
-
const costAllocationTagsJson = Config.loadConfigFile(path.join(configDir, "cost-allocation-tags-config.json"));
|
|
169
|
-
// Parse each config file separately to identify which one fails
|
|
135
|
+
const configFilePath = path.join(configDir, "fjall-config.json");
|
|
136
|
+
const rootConfigJson = Config.loadConfigFile(configFilePath);
|
|
170
137
|
let rootConfig;
|
|
171
|
-
let existingAccountsConfig;
|
|
172
|
-
let costAllocationTagsConfig;
|
|
173
|
-
// 1. Parse root config (fjall-config.json)
|
|
174
138
|
if (rootConfigJson) {
|
|
175
139
|
try {
|
|
176
140
|
rootConfig = RootConfigSchema.parse(JSON.parse(rootConfigJson));
|
|
@@ -179,27 +143,7 @@ class Config {
|
|
|
179
143
|
throw Config.formatZodError(err, "fjall-config.json");
|
|
180
144
|
}
|
|
181
145
|
}
|
|
182
|
-
|
|
183
|
-
if (existingAccountJson) {
|
|
184
|
-
try {
|
|
185
|
-
const raw = JSON.parse(existingAccountJson);
|
|
186
|
-
existingAccountsConfig = zod_1.z.array(AccountSchema).parse(raw);
|
|
187
|
-
}
|
|
188
|
-
catch (err) {
|
|
189
|
-
throw Config.formatZodError(err, "accounts-config.json");
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
// 3. Parse cost allocation tags config
|
|
193
|
-
if (costAllocationTagsJson) {
|
|
194
|
-
try {
|
|
195
|
-
const raw = JSON.parse(costAllocationTagsJson);
|
|
196
|
-
costAllocationTagsConfig = zod_1.z.array(CostAllocationTagsSchema).parse(raw);
|
|
197
|
-
}
|
|
198
|
-
catch (err) {
|
|
199
|
-
throw Config.formatZodError(err, "cost-allocation-tags-config.json");
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
return new Config(rootConfig, existingAccountsConfig, costAllocationTagsConfig);
|
|
146
|
+
return new Config(rootConfig, configFilePath);
|
|
203
147
|
}
|
|
204
148
|
/**
|
|
205
149
|
* Format a Zod error into a readable error message
|
|
@@ -211,7 +155,6 @@ class Config {
|
|
|
211
155
|
.join("; ");
|
|
212
156
|
return new Error(`Failed to parse ${fileName}: ${issueDetails}`);
|
|
213
157
|
}
|
|
214
|
-
// Fall back to the error message, but replace newlines to keep it on one line
|
|
215
158
|
const rawMessage = err instanceof Error ? err.message : String(err);
|
|
216
159
|
const message = rawMessage.replace(/\n/g, " ").substring(0, 500);
|
|
217
160
|
return new Error(`Failed to parse ${fileName}: ${message}`);
|
|
@@ -219,251 +162,115 @@ class Config {
|
|
|
219
162
|
/**
|
|
220
163
|
* Save configuration to file
|
|
221
164
|
*/
|
|
222
|
-
saveConfig() {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
* @param serviceKey Name/key of the service
|
|
238
|
-
* @param config Service configuration properties
|
|
239
|
-
*/
|
|
240
|
-
addService(serviceKey, config) {
|
|
241
|
-
if (!this.rootConfig.services)
|
|
242
|
-
this.rootConfig.services = {};
|
|
243
|
-
this.rootConfig.services[serviceKey] = config;
|
|
244
|
-
}
|
|
245
|
-
getServiceConfig(serviceKey) {
|
|
246
|
-
if (!this.rootConfig.services)
|
|
247
|
-
return null;
|
|
248
|
-
return this.rootConfig.services[serviceKey] || null;
|
|
249
|
-
}
|
|
250
|
-
addProviderAccount(account) {
|
|
251
|
-
if (!this.rootConfig.providerAccounts)
|
|
252
|
-
this.rootConfig.providerAccounts = [];
|
|
253
|
-
// ensure account name is always lowercase
|
|
254
|
-
account.name = account.name.toLocaleLowerCase();
|
|
255
|
-
this.rootConfig.providerAccounts.push(account);
|
|
256
|
-
}
|
|
257
|
-
getProviderAccount(accountName) {
|
|
258
|
-
if (!this.rootConfig.providerAccounts)
|
|
259
|
-
return undefined;
|
|
260
|
-
return this.rootConfig.providerAccounts.find((account) => account.name.toLocaleLowerCase() === accountName.toLocaleLowerCase());
|
|
261
|
-
}
|
|
262
|
-
getProviderAccountById(accountId) {
|
|
263
|
-
if (!this.rootConfig.providerAccounts)
|
|
264
|
-
return undefined;
|
|
265
|
-
return this.rootConfig.providerAccounts.find((account) => account.id === accountId);
|
|
266
|
-
}
|
|
267
|
-
/**
|
|
268
|
-
* Get provider account by environment type
|
|
269
|
-
* @param environment The environment type (e.g., 'platform', 'staging', 'production')
|
|
270
|
-
* @returns The provider account with the specified environment or undefined if not found
|
|
271
|
-
*/
|
|
272
|
-
getAccountByEnvironment(environment) {
|
|
273
|
-
if (!this.rootConfig.providerAccounts)
|
|
274
|
-
return undefined;
|
|
275
|
-
return this.rootConfig.providerAccounts.find((account) => account.environment === environment);
|
|
276
|
-
}
|
|
277
|
-
/**
|
|
278
|
-
* Sets the existing accounts list. This should be called by AccountService
|
|
279
|
-
* after it fetches the accounts from AWS.
|
|
280
|
-
* @param accounts List of AWS accounts from Organizations API
|
|
281
|
-
*/
|
|
282
|
-
setExistingAccountsList(accounts) {
|
|
283
|
-
this.existingAccountsConfig = accounts;
|
|
284
|
-
}
|
|
285
|
-
getExistingAccounts() {
|
|
286
|
-
return this.existingAccountsConfig;
|
|
287
|
-
}
|
|
288
|
-
setPrimaryRegion(region) {
|
|
289
|
-
this.rootConfig.primaryRegion = region;
|
|
290
|
-
}
|
|
291
|
-
setSecondaryRegions(regions) {
|
|
292
|
-
this.rootConfig.secondaryRegions = regions;
|
|
293
|
-
}
|
|
294
|
-
setDisasterRecoveryRegion(region) {
|
|
295
|
-
this.rootConfig.disasterRecoveryRegion = region;
|
|
296
|
-
}
|
|
297
|
-
getPrimaryRegion() {
|
|
298
|
-
return this.rootConfig.primaryRegion;
|
|
299
|
-
}
|
|
300
|
-
getSecondaryRegions() {
|
|
301
|
-
return this.rootConfig.secondaryRegions;
|
|
302
|
-
}
|
|
303
|
-
getDisasterRecoveryRegion() {
|
|
304
|
-
return this.rootConfig.disasterRecoveryRegion;
|
|
305
|
-
}
|
|
306
|
-
getAllRegions() {
|
|
307
|
-
const regions = [];
|
|
308
|
-
if (this.rootConfig.primaryRegion) {
|
|
309
|
-
regions.push(this.rootConfig.primaryRegion);
|
|
310
|
-
}
|
|
311
|
-
if (this.rootConfig.secondaryRegions) {
|
|
312
|
-
regions.push(...this.rootConfig.secondaryRegions);
|
|
313
|
-
}
|
|
314
|
-
if (this.rootConfig.disasterRecoveryRegion &&
|
|
315
|
-
!regions.includes(this.rootConfig.disasterRecoveryRegion)) {
|
|
316
|
-
regions.push(this.rootConfig.disasterRecoveryRegion);
|
|
165
|
+
saveConfig(appName) {
|
|
166
|
+
let targetPath = this.configPath;
|
|
167
|
+
if (!targetPath) {
|
|
168
|
+
if (appName) {
|
|
169
|
+
if (appName !== path.basename(appName)) {
|
|
170
|
+
throw new Error(`Invalid app name: ${appName}`);
|
|
171
|
+
}
|
|
172
|
+
const fjallDir = Config.findFjallDirectory() || path.join(process.cwd(), "fjall");
|
|
173
|
+
const appDir = path.join(fjallDir, appName);
|
|
174
|
+
targetPath = path.join(appDir, "fjall-config.json");
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
const configDir = Config.findConfigDirectory() || path.join(process.cwd(), "fjall");
|
|
178
|
+
targetPath = path.join(configDir, "fjall-config.json");
|
|
179
|
+
}
|
|
317
180
|
}
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
*/
|
|
325
|
-
setCostAllocationTagsList(tags) {
|
|
326
|
-
this.costAllocationTagsConfig = tags;
|
|
327
|
-
}
|
|
328
|
-
getCostAllocationTags() {
|
|
329
|
-
return this.costAllocationTagsConfig;
|
|
181
|
+
const dir = path.dirname(targetPath);
|
|
182
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
183
|
+
const rootJsonString = JSON.stringify(this.rootConfig, null, 2);
|
|
184
|
+
const tmpPath = `${targetPath}.tmp`;
|
|
185
|
+
fs.writeFileSync(tmpPath, rootJsonString, { mode: 0o600 });
|
|
186
|
+
fs.renameSync(tmpPath, targetPath);
|
|
330
187
|
}
|
|
331
188
|
/**
|
|
332
189
|
* Get the fjall config directory path
|
|
333
|
-
* @returns The path to the fjall config directory or null if not found
|
|
334
|
-
*/
|
|
335
|
-
static getConfigDirectory() {
|
|
336
|
-
return Config.findConfigDirectory();
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Profile management methods
|
|
340
190
|
*/
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
* @returns The current profile name, or undefined if no profile is set
|
|
344
|
-
*/
|
|
345
|
-
getCurrentProfile() {
|
|
346
|
-
return this.rootConfig.currentProfile;
|
|
191
|
+
static getConfigDirectory(appName) {
|
|
192
|
+
return Config.findConfigDirectory(appName);
|
|
347
193
|
}
|
|
348
194
|
/**
|
|
349
|
-
*
|
|
350
|
-
* @param name The name of the profile to set as current
|
|
195
|
+
* Discover all app names by scanning fjall/<app>/fjall-config.json
|
|
351
196
|
*/
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
/**
|
|
356
|
-
* Retrieves a profile by name.
|
|
357
|
-
* @param name The name of the profile to retrieve
|
|
358
|
-
* @returns The profile configuration, or undefined if not found
|
|
359
|
-
*/
|
|
360
|
-
getProfile(name) {
|
|
361
|
-
if (!this.rootConfig.profiles)
|
|
362
|
-
return undefined;
|
|
363
|
-
return this.rootConfig.profiles[name];
|
|
364
|
-
}
|
|
365
|
-
getAllProfileNames() {
|
|
366
|
-
if (!this.rootConfig.profiles)
|
|
197
|
+
static discoverApps() {
|
|
198
|
+
const fjallDir = Config.findFjallDirectory();
|
|
199
|
+
if (!fjallDir)
|
|
367
200
|
return [];
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
201
|
+
try {
|
|
202
|
+
const entries = fs.readdirSync(fjallDir, { withFileTypes: true });
|
|
203
|
+
const apps = [];
|
|
204
|
+
for (const entry of entries) {
|
|
205
|
+
if (!entry.isDirectory())
|
|
206
|
+
continue;
|
|
207
|
+
const configFile = path.join(fjallDir, entry.name, "fjall-config.json");
|
|
208
|
+
if (fs.existsSync(configFile)) {
|
|
209
|
+
apps.push(entry.name);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return apps.sort();
|
|
373
213
|
}
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
return;
|
|
379
|
-
delete this.rootConfig.profiles[name];
|
|
380
|
-
// If we removed the current profile, clear it
|
|
381
|
-
if (this.rootConfig.currentProfile === name) {
|
|
382
|
-
this.rootConfig.currentProfile = undefined;
|
|
214
|
+
catch (err) {
|
|
215
|
+
logger_js_1.logger.debug("Config", "Failed to discover apps", {
|
|
216
|
+
error: err instanceof Error ? err.message : String(err)
|
|
217
|
+
});
|
|
218
|
+
return [];
|
|
383
219
|
}
|
|
384
220
|
}
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
return this.rootConfig.ssoSessions[name];
|
|
221
|
+
// Deploy stage management
|
|
222
|
+
getDeployStages() {
|
|
223
|
+
return this.rootConfig.deploy ?? {};
|
|
389
224
|
}
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
this.rootConfig.ssoSessions = {};
|
|
393
|
-
}
|
|
394
|
-
this.rootConfig.ssoSessions[name] = session;
|
|
395
|
-
}
|
|
396
|
-
getOrgLevelConfig() {
|
|
397
|
-
// Derive rootOidcRoleArn from the root account's OIDC profile if available,
|
|
398
|
-
// falling back to the explicitly stored field (set during config pull)
|
|
399
|
-
const rootAccount = this.rootConfig.providerAccounts?.find((a) => a.environment === "root");
|
|
400
|
-
const rootProfileName = rootAccount?.name.toLowerCase();
|
|
401
|
-
const rootProfile = rootProfileName
|
|
402
|
-
? this.rootConfig.profiles?.[rootProfileName]
|
|
403
|
-
: undefined;
|
|
404
|
-
const derivedRoleArn = rootProfile?.type === "oidc" ? rootProfile.oidcRoleArn : undefined;
|
|
405
|
-
return {
|
|
406
|
-
primaryRegion: this.rootConfig.primaryRegion,
|
|
407
|
-
secondaryRegions: this.rootConfig.secondaryRegions,
|
|
408
|
-
disasterRecoveryRegion: this.rootConfig.disasterRecoveryRegion,
|
|
409
|
-
providerAccounts: this.rootConfig.providerAccounts,
|
|
410
|
-
ssoSessions: this.rootConfig.ssoSessions,
|
|
411
|
-
rootOidcRoleArn: derivedRoleArn ?? this.rootConfig.rootOidcRoleArn
|
|
412
|
-
};
|
|
225
|
+
getDeployStage(name) {
|
|
226
|
+
return this.rootConfig.deploy?.[name];
|
|
413
227
|
}
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
this.rootConfig.
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
this.rootConfig.
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
return
|
|
228
|
+
setDeployStage(name, stage) {
|
|
229
|
+
if (!this.rootConfig.deploy) {
|
|
230
|
+
this.rootConfig.deploy = {};
|
|
231
|
+
}
|
|
232
|
+
this.rootConfig.deploy[name] = stage;
|
|
233
|
+
}
|
|
234
|
+
removeDeployStage(name) {
|
|
235
|
+
if (!this.rootConfig.deploy?.[name])
|
|
236
|
+
return false;
|
|
237
|
+
delete this.rootConfig.deploy[name];
|
|
238
|
+
if (this.rootConfig.activeStage === name) {
|
|
239
|
+
this.rootConfig.activeStage = undefined;
|
|
240
|
+
}
|
|
241
|
+
return true;
|
|
428
242
|
}
|
|
429
|
-
|
|
430
|
-
this.rootConfig.
|
|
243
|
+
getActiveStage() {
|
|
244
|
+
return this.rootConfig.activeStage;
|
|
431
245
|
}
|
|
432
|
-
|
|
433
|
-
|
|
246
|
+
setActiveStage(name) {
|
|
247
|
+
this.rootConfig.activeStage = name;
|
|
434
248
|
}
|
|
435
|
-
|
|
436
|
-
|
|
249
|
+
// Domain management
|
|
250
|
+
getDomains() {
|
|
251
|
+
return this.rootConfig.domains ?? [];
|
|
437
252
|
}
|
|
438
|
-
|
|
439
|
-
|
|
253
|
+
setDomains(domains) {
|
|
254
|
+
this.rootConfig.domains = domains;
|
|
440
255
|
}
|
|
441
|
-
|
|
442
|
-
if (!this.rootConfig.
|
|
443
|
-
this.rootConfig.
|
|
256
|
+
addDomain(domain) {
|
|
257
|
+
if (!this.rootConfig.domains) {
|
|
258
|
+
this.rootConfig.domains = [];
|
|
444
259
|
}
|
|
445
|
-
this.rootConfig.
|
|
260
|
+
this.rootConfig.domains.push(domain);
|
|
446
261
|
}
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
if (
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
if (
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
this.rootConfig.providerAccounts = config.providerAccounts;
|
|
459
|
-
}
|
|
460
|
-
if (config.ssoSessions !== undefined) {
|
|
461
|
-
this.rootConfig.ssoSessions = config.ssoSessions;
|
|
462
|
-
}
|
|
463
|
-
if (config.rootOidcRoleArn !== undefined) {
|
|
464
|
-
this.rootConfig.rootOidcRoleArn = config.rootOidcRoleArn;
|
|
465
|
-
}
|
|
262
|
+
getDomain(name) {
|
|
263
|
+
return this.rootConfig.domains?.find((d) => d.name.toLowerCase() === name.toLowerCase());
|
|
264
|
+
}
|
|
265
|
+
removeDomain(name) {
|
|
266
|
+
if (!this.rootConfig.domains)
|
|
267
|
+
return false;
|
|
268
|
+
const index = this.rootConfig.domains.findIndex((d) => d.name.toLowerCase() === name.toLowerCase());
|
|
269
|
+
if (index === -1)
|
|
270
|
+
return false;
|
|
271
|
+
this.rootConfig.domains.splice(index, 1);
|
|
272
|
+
return true;
|
|
466
273
|
}
|
|
467
274
|
}
|
|
468
275
|
exports.Config = Config;
|
|
469
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL0NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLDZCQUF3QjtBQUl4Qjs7O0dBR0c7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztBQTJFbkMsNkJBQTZCO0FBQzdCLE1BQU0sa0JBQWtCLEdBQUcsT0FBQztLQUN6QixNQUFNLENBQUM7SUFDTixjQUFjLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtJQUMxQixhQUFhLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtDQUMxQixDQUFDO0tBQ0QsTUFBTSxFQUFFLENBQUM7QUFFWixNQUFNLG1CQUFtQixHQUFHLE9BQUM7S0FDMUIsTUFBTSxDQUFDO0lBQ04sRUFBRSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7SUFDZCxJQUFJLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUMzQixPQUFPLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM5QixPQUFPLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDOUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsRUFBRTtJQUMzQyxnQkFBZ0IsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ3hDLENBQUM7S0FDRCxNQUFNLEVBQUUsQ0FBQztBQUVaLE1BQU0scUJBQXFCLEdBQUcsT0FBQztLQUM1QixNQUFNLENBQUM7SUFDTixFQUFFLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtJQUNkLElBQUksRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2hCLFdBQVcsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO0lBQ3ZCLE9BQU8sRUFBRSxPQUFDLENB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QyxHQUFHLFVBQVUsQ0FBQztJQUMxRCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsTUFBc0I7UUFDdEMsSUFBSSxNQUFNLENBQUMsYUFBYSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDdkQsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1FBQzdELENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxzQkFBc0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7UUFDN0QsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ25ELENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztRQUMzRCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBbmRELHdCQW1kQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgQWNjb3VudCB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtb3JnYW5pemF0aW9uc1wiO1xuZXhwb3J0IHR5cGUgeyBBY2NvdW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1vcmdhbml6YXRpb25zXCI7XG5cbi8qKlxuICogTWF4aW11bSBkZXB0aCBmb3Igc2VhcmNoaW5nIHVwIHRoZSBkaXJlY3RvcnkgdHJlZSBmb3IgY29uZmlnIGZpbGVzLlxuICogUHJldmVudHMgaW5maW5pdGUgbG9vcHMgd2hlbiB0cmF2ZXJzaW5nIGRpcmVjdG9yaWVzLlxuICovXG5jb25zdCBDT05GSUdfU0VBUkNIX01BWF9ERVBUSCA9IDEwO1xuXG5leHBvcnQgdHlwZSBTZXJ2aWNlQ29uZmlnID0ge1xuICBpZDogc3RyaW5nO1xuICB0eXBlPzogc3RyaW5nO1xuICB2ZXJzaW9uPzogbnVtYmVyO1xuICBvcHRpb25zPzogb2JqZWN0O1xuICBkb2NrZXJDb25maWc/OiB7XG4gICAgZG9ja2VyZmlsZVBhdGg6IHN0cmluZztcbiAgICBjb250YWluZXJQb3J0OiBudW1iZXI7XG4gIH07XG4gIGFwaUFwcGxpY2F0aW9uSWQ/OiBzdHJpbmc7IC8vIEZqYWxsIEFQSSBhcHBsaWNhdGlvbiBJRFxufTtcblxuZXhwb3J0IHR5cGUgUHJvdmlkZXJBY2NvdW50ID0ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIG1hbmFnZWQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgT2lkY0Nvbm5lY3Rpb24gPSB7XG4gIHJvbGVBcm46IHN0cmluZztcbiAgZXh0ZXJuYWxJZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgUHJvZmlsZSA9IHtcbiAgdHlwZTogXCJpYW1cIiB8IFwic3NvXCIgfCBcIm9pZGNcIjtcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIC8vIFNTTyBwcm9maWxlc1xuICBzc29BY2NvdW50SWQ/OiBzdHJpbmc7XG4gIHNzb1JvbGVOYW1lPzogc3RyaW5nO1xuICBzc29TZXNzaW9uPzogc3RyaW5nO1xuICAvLyBPSURDIHByb2ZpbGVzIChDSS9DRCBhbmQgRmphbGwtaXNzdWVkKVxuICBvaWRjUm9sZUFybj86IHN0cmluZztcbiAgb2lkY1Byb3ZpZGVyQXJuPzogc3RyaW5nO1xuICAvLyBSb2xlIGFzc3VtcHRpb24gKHVzZWQgaW4gQVdTIGNvbmZpZyBmaWxlIGdlbmVyYXRpb24pXG4gIGNyZWRlbnRpYWxTb3VyY2U/OiBzdHJpbmc7XG4gIHJvbGVBcm4/OiBzdHJpbmc7XG4gIHJvbGVTZXNzaW9uTmFtZT86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFNTT1Nlc3Npb24gPSB7XG4gIHNzb1JlZ2lvbjogc3RyaW5nO1xuICBzc29TdGFydFVybDogc3RyaW5nO1xufTtcblxudHlwZSBSb290Q29uZmlnID0ge1xuICB2ZXJzaW9uPzogbnVtYmVyO1xuICBkZXZlbG9wbWVudD86IGJvb2xlYW47XG4gIHNlcnZpY2VzPzogeyBba2V5OiBzdHJpbmddOiBTZXJ2aWNlQ29uZmlnIH07XG4gIHByb3ZpZGVyQWNjb3VudHM/OiBQcm92aWRlckFjY291bnRbXTtcbiAgcHJpbWFyeVJlZ2lvbj86IHN0cmluZztcbiAgc2Vjb25kYXJ5UmVnaW9ucz86IHN0cmluZ1tdO1xuICBkaXNhc3RlclJlY292ZXJ5UmVnaW9uPzogc3RyaW5nO1xuICAvLyBQcm9maWxlIG1hbmFnZW1lbnRcbiAgY3VycmVudFByb2ZpbGU/OiBzdHJpbmc7XG4gIHByb2ZpbGVzPzogeyBba2V5OiBzdHJpbmddOiBQcm9maWxlIH07XG4gIHNzb1Nlc3Npb25zPzogeyBba2V5OiBzdHJpbmddOiBTU09TZXNzaW9uIH07XG4gIC8vIE9yZ2FuaXNhdGlvbiBpZGVudGl0eSAoZnJvbSBGamFsbCBBUEkpXG4gIG9yZ2FuaXNhdGlvbklkPzogc3RyaW5nO1xuICBvcmdhbmlzYXRpb25OYW1lPzogc3RyaW5nO1xuICBvcmdhbmlzYXRpb25FbWFpbD86IHN0cmluZztcbiAgLy8gT0lEQyBjb25maWd1cmF0aW9uXG5cbiAgb2lkY0lzc3VlclVybD86IHN0cmluZztcbiAgb2lkY0Nvbm5lY3Rpb25zPzogeyBbYWNjb3VudElkOiBzdHJpbmddOiBPaWRjQ29ubmVjdGlvbiB9O1xuICByb290T2lkY1JvbGVBcm4/OiBzdHJpbmc7XG59O1xuXG50eXBlIENvc3RBbGxvY2F0aW9uVGFncyA9IHtcbiAgVGFnS2V5OiBzdHJpbmc7XG4gIFN0YXR1czogc3RyaW5nO1xufTtcblxuLy8gWm9kIHNjaGVtYXMgZm9yIHZhbGlkYXRpb25cbmNvbnN0IERvY2tlckNvbmZpZ1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgZG9ja2VyZmlsZVBhdGg6IHouc3RyaW5nKCksXG4gICAgY29udGFpbmVyUG9ydDogei5udW1iZXIoKVxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IFNlcnZpY2VDb25maWdTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGlkOiB6LnN0cmluZygpLFxuICAgIHR5cGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB2ZXJzaW9uOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgb3B0aW9uczogei5vYmplY3Qoe30pLnBhc3N0aHJvdWdoKCkub3B0aW9uYWwoKSxcbiAgICBkb2NrZXJDb25maWc6IERvY2tlckNvbmZpZ1NjaGVtYS5vcHRpb25hbCgpLFxuICAgIGFwaUFwcGxpY2F0aW9uSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKVxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IFByb3ZpZGVyQWNjb3VudFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgaWQ6IHouc3RyaW5nKCksXG4gICAgbmFtZTogei5zdHJpbmcoKSxcbiAgICBlbnZpcm9ubWVudDogei5zdHJpbmcoKSxcbiAgICBtYW5hZ2VkOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgUHJvZmlsZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdHlwZTogei5lbnVtKFtcImlhbVwiLCBcInNzb1wiLCBcIm9pZGNcIl0pLFxuICAgIHJlZ2lvbjogei5zdHJpbmcoKSxcbiAgICBzc29BY2NvdW50SWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBzc29Sb2xlTmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIHNzb1Nlc3Npb246IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBvaWRjUm9sZUFybjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIG9pZGNQcm92aWRlckFybjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGNyZWRlbnRpYWxTb3VyY2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICByb2xlQXJuOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgcm9sZVNlc3Npb25OYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKClcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBTU09TZXNzaW9uU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBzc29SZWdpb246IHouc3RyaW5nKCksXG4gICAgc3NvU3RhcnRVcmw6IHouc3RyaW5nKClcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBPaWRjQ29ubmVjdGlvblNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgcm9sZUFybjogei5zdHJpbmcoKSxcbiAgICBleHRlcm5hbElkOiB6LnN0cmluZygpXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgUm9vdENvbmZpZ1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdmVyc2lvbjogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIGRldmVsb3BtZW50OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgIHNlcnZpY2VzOiB6LnJlY29yZCh6LnN0cmluZygpLCBTZXJ2aWNlQ29uZmlnU2NoZW1hKS5vcHRpb25hbCgpLFxuICAgIHByb3ZpZGVyQWNjb3VudHM6IHouYXJyYXkoUHJvdmlkZXJBY2NvdW50U2NoZW1hKS5vcHRpb25hbCgpLFxuICAgIHByaW1hcnlSZWdpb246IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBzZWNvbmRhcnlSZWdpb25zOiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGN1cnJlbnRQcm9maWxlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgcHJvZmlsZXM6IHoucmVjb3JkKHouc3RyaW5nKCksIFByb2ZpbGVTY2hlbWEpLm9wdGlvbmFsKCksXG4gICAgc3NvU2Vzc2lvbnM6IHoucmVjb3JkKHouc3RyaW5nKCksIFNTT1Nlc3Npb25TY2hlbWEpLm9wdGlvbmFsKCksXG4gICAgb3JnYW5pc2F0aW9uSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBvcmdhbmlzYXRpb25OYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgb3JnYW5pc2F0aW9uRW1haWw6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcblxuICAgIG9pZGNJc3N1ZXJVcmw6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBvaWRjQ29ubmVjdGlvbnM6IHoucmVjb3JkKHouc3RyaW5nKCksIE9pZGNDb25uZWN0aW9uU2NoZW1hKS5vcHRpb25hbCgpLFxuICAgIHJvb3RPaWRjUm9sZUFybjogei5zdHJpbmcoKS5vcHRpb25hbCgpXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgQ29zdEFsbG9jYXRpb25UYWdzU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBUYWdLZXk6IHouc3RyaW5nKCksXG4gICAgU3RhdHVzOiB6LnN0cmluZygpXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgQWNjb3VudFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBBcm46IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBFbWFpbDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIE5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBTdGF0dXM6IHouZW51bShbXCJBQ1RJVkVcIiwgXCJTVVNQRU5ERURcIiwgXCJQRU5ESU5HX0NMT1NVUkVcIl0pLm9wdGlvbmFsKCksXG4gICAgSm9pbmVkTWV0aG9kOiB6LmVudW0oW1wiSU5WSVRFRFwiLCBcIkNSRUFURURcIl0pLm9wdGlvbmFsKCksXG4gICAgLy8gei5jb2VyY2UuZGF0ZSgpIGhhbmRsZXMgYm90aCBEYXRlIG9iamVjdHMgKGZyb20gQVdTIFNESykgYW5kIElTTyA4NjAxIHN0cmluZ3MgKGZyb20gSlNPTiBwYXJzaW5nKVxuICAgIEpvaW5lZFRpbWVzdGFtcDogei5jb2VyY2UuZGF0ZSgpLm9wdGlvbmFsKClcbiAgfSlcbiAgLnBhc3N0aHJvdWdoKCk7XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgYmFzZS12ZXJzaW9uIG9mIGFueSBuZXdseSBjcmVhdGVkIGNvbmZpZyBmaWxlXG4gKi9cbmNvbnN0IEJBU0VfQ09ORklHX1ZFUlNJT04gPSAwLjE7XG5cbi8qKlxuICogQ29uZmlnIGNsYXNzIGZvciBsb2FkaW5nIGFuZCBzYXZpbmcgZmphbGwtY29uZmlnLmpzb24gZmlsZVxuICovXG5leHBvcnQgdHlwZSBPcmdMZXZlbENvbmZpZyA9IHtcbiAgcHJpbWFyeVJlZ2lvbj86IHN0cmluZztcbiAgc2Vjb25kYXJ5UmVnaW9ucz86IHN0cmluZ1tdO1xuICBkaXNhc3RlclJlY292ZXJ5UmVnaW9uPzogc3RyaW5nO1xuICBwcm92aWRlckFjY291bnRzPzogUHJvdmlkZXJBY2NvdW50W107XG4gIHNzb1Nlc3Npb25zPzogeyBba2V5OiBzdHJpbmddOiBTU09TZXNzaW9uIH07XG4gIHJvb3RPaWRjUm9sZUFybj86IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBDb25maWcge1xuICByb290Q29uZmlnOiBSb290Q29uZmlnO1xuICBleGlzdGluZ0FjY291bnRzQ29uZmlnOiBBY2NvdW50W107XG4gIGNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZzogQ29zdEFsbG9jYXRpb25UYWdzW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcm9vdENvbmZpZz86IFJvb3RDb25maWcsXG4gICAgZXhpc3RpbmdBY2NvdW50c0NvbmZpZz86IEFjY291bnRbXSxcbiAgICBjb3N0QWxsb2NhdGlvblRhZ3NDb25maWc/OiBDb3N0QWxsb2NhdGlvblRhZ3NbXVxuICApIHtcbiAgICB0aGlzLnJvb3RDb25maWcgPSByb290Q29uZmlnID8/IHtcbiAgICAgIHZlcnNpb246IEJBU0VfQ09ORklHX1ZFUlNJT04sXG4gICAgICBzZXJ2aWNlczoge30sXG4gICAgICBwcm92aWRlckFjY291bnRzOiBbXVxuICAgIH07XG4gICAgdGhpcy5leGlzdGluZ0FjY291bnRzQ29uZmlnID0gZXhpc3RpbmdBY2NvdW50c0NvbmZpZyA/PyBbXTtcbiAgICB0aGlzLmNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZyA9IGNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZyA/PyBbXTtcbiAgfVxuXG4gIGlzRGV2ZWxvcG1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5yb290Q29uZmlnPy5kZXZlbG9wbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBmamFsbCBjb25maWcgZGlyZWN0b3J5IGJ5IHdhbGtpbmcgdXAgdGhlIGRpcmVjdG9yeSB0cmVlXG4gICAqIEByZXR1cm5zIFRoZSBwYXRoIHRvIHRoZSBmamFsbCBjb25maWcgZGlyZWN0b3J5IG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBmaW5kQ29uZmlnRGlyZWN0b3J5KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGxldCBjdXJyZW50RGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ09ORklHX1NFQVJDSF9NQVhfREVQVEg7IGkrKykge1xuICAgICAgY29uc3QgZmphbGxEaXIgPSBwYXRoLmpvaW4oY3VycmVudERpciwgXCJmamFsbFwiKTtcbiAgICAgIGNvbnN0IGNvbmZpZ0ZpbGUgPSBwYXRoLmpvaW4oZmphbGxEaXIsIFwiZmphbGwtY29uZmlnLmpzb25cIik7XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGUpKSB7XG4gICAgICAgIHJldHVybiBmamFsbERpcjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGlyZWN0Q29uZmlnRmlsZSA9IHBhdGguam9pbihjdXJyZW50RGlyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyZWN0Q29uZmlnRmlsZSkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREaXI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudERpciA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKTtcbiAgICAgIGlmIChwYXJlbnREaXIgPT09IGN1cnJlbnREaXIpIGJyZWFrO1xuICAgICAgY3VycmVudERpciA9IHBhcmVudERpcjtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGNvbmZpZyBmaWxlIGludG8gbWVtb3J5IGFzIGEgcmF3IEpTT04gc3RyaW5nXG4gICAqIEBwYXJhbSBjb25maWdGaWxlIC0gUGF0aCB0byB0aGUgY29uZmlnIGZpbGVcbiAgICogQHJldHVybnMgQ29uZmlnIGFzIEpTT04gc3RyaW5nIG9yIE5VTEwgaWYgbm8gY29uZmlnIGZpbGUgYWNjZXNzaWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgbG9hZENvbmZpZ0ZpbGUoY29uZmlnRmlsZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGZzLmFjY2Vzc1N5bmMoY29uZmlnRmlsZSwgZnMuY29uc3RhbnRzLlJfT0sgfCBmcy5jb25zdGFudHMuV19PSyk7XG4gICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGNvbmZpZ0ZpbGUsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgY29uZmlndXJhdGlvbiBmcm9tIGZpbGVcbiAgICpcbiAgICogQHJldHVybnMgTG9hZGVkIGNvbmZpZ3VyYXRpb25cbiAgICogQHRocm93cyBFcnJvciBpZiBjb25maWcgZmlsZSBjYW5ub3QgYmUgcGFyc2VkIG9yIGZhaWxzIHNjaGVtYSB2YWxpZGF0aW9uXG4gICAqL1xuICBzdGF0aWMgbG9hZENvbmZpZygpOiBDb25maWcge1xuICAgIGNvbnN0IGNvbmZpZ0RpciA9IENvbmZpZy5maW5kQ29uZmlnRGlyZWN0b3J5KCk7XG4gICAgaWYgKCFjb25maWdEaXIpIHtcbiAgICAgIHJldHVybiBuZXcgQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm9vdENvbmZpZ0pzb24gPSBDb25maWcubG9hZENvbmZpZ0ZpbGUoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnRGlyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpXG4gICAgKTtcbiAgICBjb25zdCBleGlzdGluZ0FjY291bnRKc29uID0gQ29uZmlnLmxvYWRDb25maWdGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZ0RpciwgXCJhY2NvdW50cy1jb25maWcuanNvblwiKVxuICAgICk7XG4gICAgY29uc3QgY29zdEFsbG9jYXRpb25UYWdzSnNvbiA9IENvbmZpZy5sb2FkQ29uZmlnRmlsZShcbiAgICAgIHBhdGguam9pbihjb25maWdEaXIsIFwiY29zdC1hbGxvY2F0aW9uLXRhZ3MtY29uZmlnLmpzb25cIilcbiAgICApO1xuXG4gICAgLy8gUGFyc2UgZWFjaCBjb25maWcgZmlsZSBzZXBhcmF0ZWx5IHRvIGlkZW50aWZ5IHdoaWNoIG9uZSBmYWlsc1xuICAgIGxldCByb290Q29uZmlnOiBSb290Q29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIGxldCBleGlzdGluZ0FjY291bnRzQ29uZmlnOiBBY2NvdW50W10gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZzogQ29zdEFsbG9jYXRpb25UYWdzW10gfCB1bmRlZmluZWQ7XG5cbiAgICAvLyAxLiBQYXJzZSByb290IGNvbmZpZyAoZmphbGwtY29uZmlnLmpzb24pXG4gICAgaWYgKHJvb3RDb25maWdKc29uKSB7XG4gICAgICB0cnkge1xuICAgICAgICByb290Q29uZmlnID0gUm9vdENvbmZpZ1NjaGVtYS5wYXJzZShKU09OLnBhcnNlKHJvb3RDb25maWdKc29uKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgQ29uZmlnLmZvcm1hdFpvZEVycm9yKGVyciwgXCJmamFsbC1jb25maWcuanNvblwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyLiBQYXJzZSBhY2NvdW50cyBjb25maWcgKGFjY291bnRzLWNvbmZpZy5qc29uKVxuICAgIGlmIChleGlzdGluZ0FjY291bnRKc29uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByYXcgPSBKU09OLnBhcnNlKGV4aXN0aW5nQWNjb3VudEpzb24pO1xuICAgICAgICBleGlzdGluZ0FjY291bnRzQ29uZmlnID0gei5hcnJheShBY2NvdW50U2NoZW1hKS5wYXJzZShyYXcpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IENvbmZpZy5mb3JtYXRab2RFcnJvcihlcnIsIFwiYWNjb3VudHMtY29uZmlnLmpzb25cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMy4gUGFyc2UgY29zdCBhbGxvY2F0aW9uIHRhZ3MgY29uZmlnXG4gICAgaWYgKGNvc3RBbGxvY2F0aW9uVGFnc0pzb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IEpTT04ucGFyc2UoY29zdEFsbG9jYXRpb25UYWdzSnNvbik7XG4gICAgICAgIGNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZyA9IHouYXJyYXkoQ29zdEFsbG9jYXRpb25UYWdzU2NoZW1hKS5wYXJzZShyYXcpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IENvbmZpZy5mb3JtYXRab2RFcnJvcihlcnIsIFwiY29zdC1hbGxvY2F0aW9uLXRhZ3MtY29uZmlnLmpzb25cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBDb25maWcoXG4gICAgICByb290Q29uZmlnLFxuICAgICAgZXhpc3RpbmdBY2NvdW50c0NvbmZpZyxcbiAgICAgIGNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZ1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGEgWm9kIGVycm9yIGludG8gYSByZWFkYWJsZSBlcnJvciBtZXNzYWdlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBmb3JtYXRab2RFcnJvcihlcnI6IHVua25vd24sIGZpbGVOYW1lOiBzdHJpbmcpOiBFcnJvciB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIHouWm9kRXJyb3IgJiYgZXJyLmlzc3Vlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpc3N1ZURldGFpbHMgPSBlcnIuaXNzdWVzXG4gICAgICAgIC5tYXAoKGlzc3VlKSA9PiBgJHtpc3N1ZS5wYXRoLmpvaW4oXCIuXCIpfTogJHtpc3N1ZS5tZXNzYWdlfWApXG4gICAgICAgIC5qb2luKFwiOyBcIik7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgJHtmaWxlTmFtZX06ICR7aXNzdWVEZXRhaWxzfWApO1xuICAgIH1cbiAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGVycm9yIG1lc3NhZ2UsIGJ1dCByZXBsYWNlIG5ld2xpbmVzIHRvIGtlZXAgaXQgb24gb25lIGxpbmVcbiAgICBjb25zdCByYXdNZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSByYXdNZXNzYWdlLnJlcGxhY2UoL1xcbi9nLCBcIiBcIikuc3Vic3RyaW5nKDAsIDUwMCk7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlICR7ZmlsZU5hbWV9OiAke21lc3NhZ2V9YCk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBjb25maWd1cmF0aW9uIHRvIGZpbGVcbiAgICovXG4gIHNhdmVDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3QgY29uZmlnRGlyID1cbiAgICAgIENvbmZpZy5maW5kQ29uZmlnRGlyZWN0b3J5KCkgfHwgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiZmphbGxcIik7XG5cbiAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGZzLm1rZGlyU3luYyhjb25maWdEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3Qgcm9vdEpzb25TdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnJvb3RDb25maWcsIG51bGwsIDIpO1xuICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnRGlyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpLFxuICAgICAgcm9vdEpzb25TdHJpbmcsXG4gICAgICB7XG4gICAgICAgIG1vZGU6IDBvNjAwXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IGV4aXN0aW5nQWNjb3VudHNKc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICB0aGlzLmV4aXN0aW5nQWNjb3VudHNDb25maWcsXG4gICAgICBudWxsLFxuICAgICAgMlxuICAgICk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgIHBhdGguam9pbihjb25maWdEaXIsIFwiYWNjb3VudHMtY29uZmlnLmpzb25cIiksXG4gICAgICBleGlzdGluZ0FjY291bnRzSnNvblN0cmluZyxcbiAgICAgIHsgbW9kZTogMG82MDAgfVxuICAgICk7XG5cbiAgICBjb25zdCBjb3N0QWxsb2NhdGlvblRhZ3NKc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICB0aGlzLmNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZyxcbiAgICAgIG51bGwsXG4gICAgICAyXG4gICAgKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZ0RpciwgXCJjb3N0LWFsbG9jYXRpb24tdGFncy1jb25maWcuanNvblwiKSxcbiAgICAgIGNvc3RBbGxvY2F0aW9uVGFnc0pzb25TdHJpbmcsXG4gICAgICB7IG1vZGU6IDBvNjAwIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBzZXJ2aWNlIHRvIHRoZSBjb25maWcgZmlsZVxuICAgKiBAcGFyYW0gc2VydmljZUtleSBOYW1lL2tleSBvZiB0aGUgc2VydmljZVxuICAgKiBAcGFyYW0gY29uZmlnIFNlcnZpY2UgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzXG4gICAqL1xuICBhZGRTZXJ2aWNlKHNlcnZpY2VLZXk6IHN0cmluZywgY29uZmlnOiBTZXJ2aWNlQ29uZmlnKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcuc2VydmljZXMpIHRoaXMucm9vdENvbmZpZy5zZXJ2aWNlcyA9IHt9O1xuICAgIHRoaXMucm9vdENvbmZpZy5zZXJ2aWNlc1tzZXJ2aWNlS2V5XSA9IGNvbmZpZztcbiAgfVxuXG4gIGdldFNlcnZpY2VDb25maWcoc2VydmljZUtleTogc3RyaW5nKTogU2VydmljZUNvbmZpZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnNlcnZpY2VzKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLnNlcnZpY2VzW3NlcnZpY2VLZXldIHx8IG51bGw7XG4gIH1cblxuICBhZGRQcm92aWRlckFjY291bnQoYWNjb3VudDogUHJvdmlkZXJBY2NvdW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcucHJvdmlkZXJBY2NvdW50cylcbiAgICAgIHRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzID0gW107XG5cbiAgICAvLyBlbnN1cmUgYWNjb3VudCBuYW1lIGlzIGFsd2F5cyBsb3dlcmNhc2VcbiAgICBhY2NvdW50Lm5hbWUgPSBhY2NvdW50Lm5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcblxuICAgIHRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzLnB1c2goYWNjb3VudCk7XG4gIH1cblxuICBnZXRQcm92aWRlckFjY291bnQoYWNjb3VudE5hbWU6IHN0cmluZyk6IFByb3ZpZGVyQWNjb3VudCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcucHJvdmlkZXJBY2NvdW50cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLnByb3ZpZGVyQWNjb3VudHMuZmluZChcbiAgICAgIChhY2NvdW50KSA9PlxuICAgICAgICBhY2NvdW50Lm5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gYWNjb3VudE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICk7XG4gIH1cblxuICBnZXRQcm92aWRlckFjY291bnRCeUlkKGFjY291bnRJZDogc3RyaW5nKTogUHJvdmlkZXJBY2NvdW50IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcucHJvdmlkZXJBY2NvdW50cy5maW5kKFxuICAgICAgKGFjY291bnQpID0+IGFjY291bnQuaWQgPT09IGFjY291bnRJZFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHByb3ZpZGVyIGFjY291bnQgYnkgZW52aXJvbm1lbnQgdHlwZVxuICAgKiBAcGFyYW0gZW52aXJvbm1lbnQgVGhlIGVudmlyb25tZW50IHR5cGUgKGUuZy4sICdwbGF0Zm9ybScsICdzdGFnaW5nJywgJ3Byb2R1Y3Rpb24nKVxuICAgKiBAcmV0dXJucyBUaGUgcHJvdmlkZXIgYWNjb3VudCB3aXRoIHRoZSBzcGVjaWZpZWQgZW52aXJvbm1lbnQgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgZ2V0QWNjb3VudEJ5RW52aXJvbm1lbnQoZW52aXJvbm1lbnQ6IHN0cmluZyk6IFByb3ZpZGVyQWNjb3VudCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcucHJvdmlkZXJBY2NvdW50cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLnByb3ZpZGVyQWNjb3VudHMuZmluZChcbiAgICAgIChhY2NvdW50KSA9PiBhY2NvdW50LmVudmlyb25tZW50ID09PSBlbnZpcm9ubWVudFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZXhpc3RpbmcgYWNjb3VudHMgbGlzdC4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IEFjY291bnRTZXJ2aWNlXG4gICAqIGFmdGVyIGl0IGZldGNoZXMgdGhlIGFjY291bnRzIGZyb20gQVdTLlxuICAgKiBAcGFyYW0gYWNjb3VudHMgTGlzdCBvZiBBV1MgYWNjb3VudHMgZnJvbSBPcmdhbml6YXRpb25zIEFQSVxuICAgKi9cbiAgc2V0RXhpc3RpbmdBY2NvdW50c0xpc3QoYWNjb3VudHM6IEFjY291bnRbXSk6IHZvaWQge1xuICAgIHRoaXMuZXhpc3RpbmdBY2NvdW50c0NvbmZpZyA9IGFjY291bnRzO1xuICB9XG5cbiAgZ2V0RXhpc3RpbmdBY2NvdW50cygpOiBBY2NvdW50W10ge1xuICAgIHJldHVybiB0aGlzLmV4aXN0aW5nQWNjb3VudHNDb25maWc7XG4gIH1cblxuICBzZXRQcmltYXJ5UmVnaW9uKHJlZ2lvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yb290Q29uZmlnLnByaW1hcnlSZWdpb24gPSByZWdpb247XG4gIH1cblxuICBzZXRTZWNvbmRhcnlSZWdpb25zKHJlZ2lvbnM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5yb290Q29uZmlnLnNlY29uZGFyeVJlZ2lvbnMgPSByZWdpb25zO1xuICB9XG5cbiAgc2V0RGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbihyZWdpb246IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucm9vdENvbmZpZy5kaXNhc3RlclJlY292ZXJ5UmVnaW9uID0gcmVnaW9uO1xuICB9XG5cbiAgZ2V0UHJpbWFyeVJlZ2lvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcucHJpbWFyeVJlZ2lvbjtcbiAgfVxuXG4gIGdldFNlY29uZGFyeVJlZ2lvbnMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcuc2Vjb25kYXJ5UmVnaW9ucztcbiAgfVxuXG4gIGdldERpc2FzdGVyUmVjb3ZlcnlSZWdpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb247XG4gIH1cblxuICBnZXRBbGxSZWdpb25zKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZWdpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKHRoaXMucm9vdENvbmZpZy5wcmltYXJ5UmVnaW9uKSB7XG4gICAgICByZWdpb25zLnB1c2godGhpcy5yb290Q29uZmlnLnByaW1hcnlSZWdpb24pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJvb3RDb25maWcuc2Vjb25kYXJ5UmVnaW9ucykge1xuICAgICAgcmVnaW9ucy5wdXNoKC4uLnRoaXMucm9vdENvbmZpZy5zZWNvbmRhcnlSZWdpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnJvb3RDb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbiAmJlxuICAgICAgIXJlZ2lvbnMuaW5jbHVkZXModGhpcy5yb290Q29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb24pXG4gICAgKSB7XG4gICAgICByZWdpb25zLnB1c2godGhpcy5yb290Q29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb24pO1xuICAgIH1cblxuICAgIHJldHVybiByZWdpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNvc3QgYWxsb2NhdGlvbiB0YWdzIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSBBY2NvdW50U2VydmljZVxuICAgKiBhZnRlciBpdCBmZXRjaGVzIHRoZSB0YWdzIGZyb20gQVdTIENvc3QgRXhwbG9yZXIuXG4gICAqIEBwYXJhbSB0YWdzIExpc3Qgb2YgY29zdCBhbGxvY2F0aW9uIHRhZ3NcbiAgICovXG4gIHNldENvc3RBbGxvY2F0aW9uVGFnc0xpc3QodGFnczogQ29zdEFsbG9jYXRpb25UYWdzW10pOiB2b2lkIHtcbiAgICB0aGlzLmNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZyA9IHRhZ3M7XG4gIH1cblxuICBnZXRDb3N0QWxsb2NhdGlvblRhZ3MoKTogQ29zdEFsbG9jYXRpb25UYWdzW10ge1xuICAgIHJldHVybiB0aGlzLmNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZqYWxsIGNvbmZpZyBkaXJlY3RvcnkgcGF0aFxuICAgKiBAcmV0dXJucyBUaGUgcGF0aCB0byB0aGUgZmphbGwgY29uZmlnIGRpcmVjdG9yeSBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgc3RhdGljIGdldENvbmZpZ0RpcmVjdG9yeSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gQ29uZmlnLmZpbmRDb25maWdEaXJlY3RvcnkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9maWxlIG1hbmFnZW1lbnQgbWV0aG9kc1xuICAgKi9cblxuICAvKipcbiAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBwcm9maWxlLlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBwcm9maWxlIG5hbWUsIG9yIHVuZGVmaW5lZCBpZiBubyBwcm9maWxlIGlzIHNldFxuICAgKi9cbiAgZ2V0Q3VycmVudFByb2ZpbGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLmN1cnJlbnRQcm9maWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgcHJvZmlsZS5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb2ZpbGUgdG8gc2V0IGFzIGN1cnJlbnRcbiAgICovXG4gIHNldEN1cnJlbnRQcm9maWxlKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucm9vdENvbmZpZy5jdXJyZW50UHJvZmlsZSA9IG5hbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgcHJvZmlsZSBieSBuYW1lLlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvZmlsZSB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJucyBUaGUgcHJvZmlsZSBjb25maWd1cmF0aW9uLCBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAqL1xuICBnZXRQcm9maWxlKG5hbWU6IHN0cmluZyk6IFByb2ZpbGUgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcucHJvZmlsZXNbbmFtZV07XG4gIH1cblxuICBnZXRBbGxQcm9maWxlTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzKSByZXR1cm4gW107XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucm9vdENvbmZpZy5wcm9maWxlcyk7XG4gIH1cblxuICBhZGRQcm9maWxlKG5hbWU6IHN0cmluZywgcHJvZmlsZTogUHJvZmlsZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcucHJvZmlsZXMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzW25hbWVdID0gcHJvZmlsZTtcbiAgfVxuXG4gIHJlbW92ZVByb2ZpbGUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcucHJvZmlsZXMpIHJldHVybjtcbiAgICBkZWxldGUgdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzW25hbWVdO1xuXG4gICAgLy8gSWYgd2UgcmVtb3ZlZCB0aGUgY3VycmVudCBwcm9maWxlLCBjbGVhciBpdFxuICAgIGlmICh0aGlzLnJvb3RDb25maWcuY3VycmVudFByb2ZpbGUgPT09IG5hbWUpIHtcbiAgICAgIHRoaXMucm9vdENvbmZpZy5jdXJyZW50UHJvZmlsZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBnZXRTU09TZXNzaW9uKG5hbWU6IHN0cmluZyk6IFNTT1Nlc3Npb24gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnNzb1Nlc3Npb25zKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcuc3NvU2Vzc2lvbnNbbmFtZV07XG4gIH1cblxuICBhZGRTU09TZXNzaW9uKG5hbWU6IHN0cmluZywgc2Vzc2lvbjogU1NPU2Vzc2lvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnNzb1Nlc3Npb25zKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcuc3NvU2Vzc2lvbnMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5yb290Q29uZmlnLnNzb1Nlc3Npb25zW25hbWVdID0gc2Vzc2lvbjtcbiAgfVxuXG4gIGdldE9yZ0xldmVsQ29uZmlnKCk6IE9yZ0xldmVsQ29uZmlnIHtcbiAgICAvLyBEZXJpdmUgcm9vdE9pZGNSb2xlQXJuIGZyb20gdGhlIHJvb3QgYWNjb3VudCdzIE9JREMgcHJvZmlsZSBpZiBhdmFpbGFibGUsXG4gICAgLy8gZmFsbGluZyBiYWNrIHRvIHRoZSBleHBsaWNpdGx5IHN0b3JlZCBmaWVsZCAoc2V0IGR1cmluZyBjb25maWcgcHVsbClcbiAgICBjb25zdCByb290QWNjb3VudCA9IHRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzPy5maW5kKFxuICAgICAgKGEpID0+IGEuZW52aXJvbm1lbnQgPT09IFwicm9vdFwiXG4gICAgKTtcbiAgICBjb25zdCByb290UHJvZmlsZU5hbWUgPSByb290QWNjb3VudD8ubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHJvb3RQcm9maWxlID0gcm9vdFByb2ZpbGVOYW1lXG4gICAgICA/IHRoaXMucm9vdENvbmZpZy5wcm9maWxlcz8uW3Jvb3RQcm9maWxlTmFtZV1cbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlcml2ZWRSb2xlQXJuID1cbiAgICAgIHJvb3RQcm9maWxlPy50eXBlID09PSBcIm9pZGNcIiA/IHJvb3RQcm9maWxlLm9pZGNSb2xlQXJuIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByaW1hcnlSZWdpb246IHRoaXMucm9vdENvbmZpZy5wcmltYXJ5UmVnaW9uLFxuICAgICAgc2Vjb25kYXJ5UmVnaW9uczogdGhpcy5yb290Q29uZmlnLnNlY29uZGFyeVJlZ2lvbnMsXG4gICAgICBkaXNhc3RlclJlY292ZXJ5UmVnaW9uOiB0aGlzLnJvb3RDb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbixcbiAgICAgIHByb3ZpZGVyQWNjb3VudHM6IHRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzLFxuICAgICAgc3NvU2Vzc2lvbnM6IHRoaXMucm9vdENvbmZpZy5zc29TZXNzaW9ucyxcbiAgICAgIHJvb3RPaWRjUm9sZUFybjogZGVyaXZlZFJvbGVBcm4gPz8gdGhpcy5yb290Q29uZmlnLnJvb3RPaWRjUm9sZUFyblxuICAgIH07XG4gIH1cblxuICBnZXRPcmdhbmlzYXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcub3JnYW5pc2F0aW9uSWQ7XG4gIH1cblxuICBzZXRPcmdhbmlzYXRpb25JZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yb290Q29uZmlnLm9yZ2FuaXNhdGlvbklkID0gaWQ7XG4gIH1cblxuICBnZXRPcmdhbmlzYXRpb25OYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5vcmdhbmlzYXRpb25OYW1lO1xuICB9XG5cbiAgc2V0T3JnYW5pc2F0aW9uTmFtZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJvb3RDb25maWcub3JnYW5pc2F0aW9uTmFtZSA9IG5hbWU7XG4gIH1cblxuICBnZXRPcmdhbmlzYXRpb25FbWFpbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcub3JnYW5pc2F0aW9uRW1haWw7XG4gIH1cblxuICBzZXRPcmdhbmlzYXRpb25FbWFpbChlbWFpbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yb290Q29uZmlnLm9yZ2FuaXNhdGlvbkVtYWlsID0gZW1haWw7XG4gIH1cblxuICBnZXRPaWRjSXNzdWVyVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5vaWRjSXNzdWVyVXJsO1xuICB9XG5cbiAgc2V0T2lkY0lzc3VlclVybCh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucm9vdENvbmZpZy5vaWRjSXNzdWVyVXJsID0gdXJsO1xuICB9XG5cbiAgZ2V0T2lkY0Nvbm5lY3Rpb24oYWNjb3VudElkOiBzdHJpbmcpOiBPaWRjQ29ubmVjdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5vaWRjQ29ubmVjdGlvbnM/LlthY2NvdW50SWRdO1xuICB9XG5cbiAgc2V0T2lkY0Nvbm5lY3Rpb24oYWNjb3VudElkOiBzdHJpbmcsIGNvbm5lY3Rpb246IE9pZGNDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcub2lkY0Nvbm5lY3Rpb25zKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcub2lkY0Nvbm5lY3Rpb25zID0ge307XG4gICAgfVxuICAgIHRoaXMucm9vdENvbmZpZy5vaWRjQ29ubmVjdGlvbnNbYWNjb3VudElkXSA9IGNvbm5lY3Rpb247XG4gIH1cblxuICBzZXRPcmdMZXZlbENvbmZpZyhjb25maWc6IE9yZ0xldmVsQ29uZmlnKTogdm9pZCB7XG4gICAgaWYgKGNvbmZpZy5wcmltYXJ5UmVnaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucm9vdENvbmZpZy5wcmltYXJ5UmVnaW9uID0gY29uZmlnLnByaW1hcnlSZWdpb247XG4gICAgfVxuICAgIGlmIChjb25maWcuc2Vjb25kYXJ5UmVnaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcuc2Vjb25kYXJ5UmVnaW9ucyA9IGNvbmZpZy5zZWNvbmRhcnlSZWdpb25zO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yb290Q29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb24gPSBjb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbjtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5wcm92aWRlckFjY291bnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzID0gY29uZmlnLnByb3ZpZGVyQWNjb3VudHM7XG4gICAgfVxuICAgIGlmIChjb25maWcuc3NvU2Vzc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yb290Q29uZmlnLnNzb1Nlc3Npb25zID0gY29uZmlnLnNzb1Nlc3Npb25zO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJvb3RPaWRjUm9sZUFybiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcucm9vdE9pZGNSb2xlQXJuID0gY29uZmlnLnJvb3RPaWRjUm9sZUFybjtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
276
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL0NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLDZCQUF3QjtBQUN4QiwyQ0FBcUM7QUFFckM7OztHQUdHO0FBQ0gsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLENBQUM7QUEyQm5DLHlCQUF5QjtBQUN6QixNQUFNLGlCQUFpQixHQUFHLE9BQUM7S0FDeEIsTUFBTSxDQUFDO0lBQ04sT0FBTyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7SUFDbkIsT0FBTyxFQUFFLE9BQUMsQ0FBQyxLQUFLLENBQUMsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUNwQyxDQUFDO0tBQ0QsTUFBTSxFQUFFLENBQUM7QUFJWixNQUFNLGtCQUFrQixHQUFHLE9BQUM7S0FDekIsTUFBTSxDQUFDO0lBQ04sSUFBSSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7SUFDaEIsSUFBSSxFQUFFLE9BQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDbkMsWUFBWSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDbkMsT0FBTyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDL0IsQ0FBQztLQUNELE1BQU0sRUFBRSxDQUFDO0FBSVosTUFBTSxnQkFBZ0IsR0FBRyxPQUFDO0tBQ3ZCLE1BQU0sQ0FBQztJQUNOLE9BQU8sRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzlCLGdCQUFnQixFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDdkMsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsT0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLGlC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Q0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUNuRCxDQUFDO0lBQ0osQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFZO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU87WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMzQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQzdDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FDbkQsQ0FBQztRQUNGLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUExUUQsd0JBMFFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2VyLmpzXCI7XG5cbi8qKlxuICogTWF4aW11bSBkZXB0aCBmb3Igc2VhcmNoaW5nIHVwIHRoZSBkaXJlY3RvcnkgdHJlZSBmb3IgY29uZmlnIGZpbGVzLlxuICogUHJldmVudHMgaW5maW5pdGUgbG9vcHMgd2hlbiB0cmF2ZXJzaW5nIGRpcmVjdG9yaWVzLlxuICovXG5jb25zdCBDT05GSUdfU0VBUkNIX01BWF9ERVBUSCA9IDEwO1xuXG5leHBvcnQgdHlwZSBQcm92aWRlckFjY291bnQgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgbWFuYWdlZD86IGJvb2xlYW47XG59O1xuXG4vLyBTdGFuZGFsb25lIHR5cGVzIOKAlCB1c2VkIGJ5IFByb2ZpbGVSZXNvbHZlciBhbmQgYXV0aCBzeXN0ZW0sIG5vdCBpbiBjb25maWcgZmlsZVxuZXhwb3J0IHR5cGUgUHJvZmlsZSA9IHtcbiAgdHlwZTogXCJzc29cIiB8IFwib2lkY1wiO1xuICByZWdpb246IHN0cmluZztcbiAgc3NvQWNjb3VudElkPzogc3RyaW5nO1xuICBzc29Sb2xlTmFtZT86IHN0cmluZztcbiAgc3NvU2Vzc2lvbj86IHN0cmluZztcbiAgb2lkY1JvbGVBcm4/OiBzdHJpbmc7XG4gIG9pZGNQcm92aWRlckFybj86IHN0cmluZztcbiAgcm9sZUFybj86IHN0cmluZztcbiAgcm9sZVNlc3Npb25OYW1lPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU1NPU2Vzc2lvbiA9IHtcbiAgc3NvUmVnaW9uOiBzdHJpbmc7XG4gIHNzb1N0YXJ0VXJsOiBzdHJpbmc7XG59O1xuXG4vLyBQZXItYXBwIGNvbmZpZyBzY2hlbWFzXG5jb25zdCBEZXBsb3lTdGFnZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgYWNjb3VudDogei5zdHJpbmcoKSxcbiAgICByZWdpb25zOiB6LmFycmF5KHouc3RyaW5nKCkpLm1pbigxKVxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmV4cG9ydCB0eXBlIERlcGxveVN0YWdlID0gei5pbmZlcjx0eXBlb2YgRGVwbG95U3RhZ2VTY2hlbWE+O1xuXG5jb25zdCBEb21haW5Db25maWdTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIG5hbWU6IHouc3RyaW5nKCksXG4gICAgdHlwZTogei5lbnVtKFtcImFwZXhcIiwgXCJkZWxlZ2F0ZWRcIl0pLFxuICAgIHBhcmVudERvbWFpbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGFjY291bnQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKVxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmV4cG9ydCB0eXBlIERvbWFpbkNvbmZpZyA9IHouaW5mZXI8dHlwZW9mIERvbWFpbkNvbmZpZ1NjaGVtYT47XG5cbmNvbnN0IFJvb3RDb25maWdTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHZlcnNpb246IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICBnZW5lcmF0b3JWZXJzaW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgZGVwbG95OiB6LnJlY29yZCh6LnN0cmluZygpLCBEZXBsb3lTdGFnZVNjaGVtYSkub3B0aW9uYWwoKSxcbiAgICBhY3RpdmVTdGFnZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGRvbWFpbnM6IHouYXJyYXkoRG9tYWluQ29uZmlnU2NoZW1hKS5vcHRpb25hbCgpXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxudHlwZSBSb290Q29uZmlnID0gei5pbmZlcjx0eXBlb2YgUm9vdENvbmZpZ1NjaGVtYT47XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgYmFzZS12ZXJzaW9uIG9mIGFueSBuZXdseSBjcmVhdGVkIGNvbmZpZyBmaWxlXG4gKi9cbmNvbnN0IEJBU0VfQ09ORklHX1ZFUlNJT04gPSAwLjE7XG5cbi8qKlxuICogQ29uZmlnIGNsYXNzIGZvciBsb2FkaW5nIGFuZCBzYXZpbmcgcGVyLWFwcCBmamFsbC1jb25maWcuanNvbiBmaWxlcy5cbiAqIEVhY2ggYXBwIGhhcyBpdHMgb3duIGNvbmZpZyBhdCBmamFsbC88YXBwPi9mamFsbC1jb25maWcuanNvbi5cbiAqIFN0b3JlcyBkZXBsb3kgbWFwcGluZywgYWN0aXZlIHN0YWdlLCBkb21haW5zLCBhbmQgZ2VuZXJhdG9yIHZlcnNpb24uXG4gKiBPcmctbGV2ZWwgY29uZmlnIChhY2NvdW50cywgcmVnaW9ucywgT0lEQykgaXMgc2VydmVkIGJ5IE9yZ0NvbmZpZ0NsaWVudCBmcm9tIHRoZSBBUEkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25maWcge1xuICByb290Q29uZmlnOiBSb290Q29uZmlnO1xuICBwcml2YXRlIGNvbmZpZ1BhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHJvb3RDb25maWc/OiBSb290Q29uZmlnLCBjb25maWdQYXRoPzogc3RyaW5nKSB7XG4gICAgdGhpcy5yb290Q29uZmlnID0gcm9vdENvbmZpZyA/PyB7XG4gICAgICB2ZXJzaW9uOiBCQVNFX0NPTkZJR19WRVJTSU9OXG4gICAgfTtcbiAgICB0aGlzLmNvbmZpZ1BhdGggPSBjb25maWdQYXRoID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgZmphbGwgZGlyZWN0b3J5IGJ5IHdhbGtpbmcgdXAgdGhlIGRpcmVjdG9yeSB0cmVlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBmaW5kRmphbGxEaXJlY3RvcnkoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgbGV0IGN1cnJlbnREaXIgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBDT05GSUdfU0VBUkNIX01BWF9ERVBUSDsgaSsrKSB7XG4gICAgICBjb25zdCBmamFsbERpciA9IHBhdGguam9pbihjdXJyZW50RGlyLCBcImZqYWxsXCIpO1xuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmamFsbERpcikgJiYgZnMuc3RhdFN5bmMoZmphbGxEaXIpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgcmV0dXJuIGZqYWxsRGlyO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudERpcik7XG4gICAgICBpZiAocGFyZW50RGlyID09PSBjdXJyZW50RGlyKSBicmVhaztcbiAgICAgIGN1cnJlbnREaXIgPSBwYXJlbnREaXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgY29uZmlnIGRpcmVjdG9yeSBmb3IgYSBzcGVjaWZpYyBhcHAgb3IgdGhlIGxlZ2FjeSByb290IGNvbmZpZy5cbiAgICogV2hlbiBhcHBOYW1lIGlzIHByb3ZpZGVkLCBsb29rcyBmb3IgZmphbGwvPGFwcE5hbWU+L2ZqYWxsLWNvbmZpZy5qc29uLlxuICAgKiBXaGVuIG9taXR0ZWQsIGZhbGxzIGJhY2sgdG8gbGVnYWN5IGZqYWxsL2ZqYWxsLWNvbmZpZy5qc29uIG9yIGRpcmVjdCBmamFsbC1jb25maWcuanNvbi5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZpbmRDb25maWdEaXJlY3RvcnkoYXBwTmFtZT86IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmIChhcHBOYW1lKSB7XG4gICAgICBpZiAoYXBwTmFtZSAhPT0gcGF0aC5iYXNlbmFtZShhcHBOYW1lKSkgcmV0dXJuIG51bGw7XG5cbiAgICAgIGNvbnN0IGZqYWxsRGlyID0gQ29uZmlnLmZpbmRGamFsbERpcmVjdG9yeSgpO1xuICAgICAgaWYgKCFmamFsbERpcikgcmV0dXJuIG51bGw7XG5cbiAgICAgIGNvbnN0IGFwcERpciA9IHBhdGguam9pbihmamFsbERpciwgYXBwTmFtZSk7XG4gICAgICBjb25zdCBjb25maWdGaWxlID0gcGF0aC5qb2luKGFwcERpciwgXCJmamFsbC1jb25maWcuanNvblwiKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGUpKSB7XG4gICAgICAgIHJldHVybiBhcHBEaXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBMZWdhY3k6IGxvb2sgZm9yIGZqYWxsL2ZqYWxsLWNvbmZpZy5qc29uIG9yIGRpcmVjdCBmamFsbC1jb25maWcuanNvblxuICAgIGxldCBjdXJyZW50RGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ09ORklHX1NFQVJDSF9NQVhfREVQVEg7IGkrKykge1xuICAgICAgY29uc3QgZmphbGxEaXIgPSBwYXRoLmpvaW4oY3VycmVudERpciwgXCJmamFsbFwiKTtcbiAgICAgIGNvbnN0IGNvbmZpZ0ZpbGUgPSBwYXRoLmpvaW4oZmphbGxEaXIsIFwiZmphbGwtY29uZmlnLmpzb25cIik7XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGUpKSB7XG4gICAgICAgIHJldHVybiBmamFsbERpcjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGlyZWN0Q29uZmlnRmlsZSA9IHBhdGguam9pbihjdXJyZW50RGlyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyZWN0Q29uZmlnRmlsZSkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREaXI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudERpciA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKTtcbiAgICAgIGlmIChwYXJlbnREaXIgPT09IGN1cnJlbnREaXIpIGJyZWFrO1xuICAgICAgY3VycmVudERpciA9IHBhcmVudERpcjtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGNvbmZpZyBmaWxlIGludG8gbWVtb3J5IGFzIGEgcmF3IEpTT04gc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBsb2FkQ29uZmlnRmlsZShjb25maWdGaWxlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgZnMuYWNjZXNzU3luYyhjb25maWdGaWxlLCBmcy5jb25zdGFudHMuUl9PSyB8IGZzLmNvbnN0YW50cy5XX09LKTtcbiAgICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMoY29uZmlnRmlsZSwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJDb25maWdcIiwgXCJDb25maWcgZmlsZSBub3QgYWNjZXNzaWJsZVwiLCB7XG4gICAgICAgIGZpbGU6IGNvbmZpZ0ZpbGUsXG4gICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycilcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgY29uZmlndXJhdGlvbiBmcm9tIGZpbGUuXG4gICAqIEBwYXJhbSBhcHBOYW1lIC0gT3B0aW9uYWwgYXBwIG5hbWUgdG8gbG9hZCBjb25maWcgZm9yIGEgc3BlY2lmaWMgYXBwXG4gICAqL1xuICBzdGF0aWMgbG9hZENvbmZpZyhhcHBOYW1lPzogc3RyaW5nKTogQ29uZmlnIHtcbiAgICBjb25zdCBjb25maWdEaXIgPSBDb25maWcuZmluZENvbmZpZ0RpcmVjdG9yeShhcHBOYW1lKTtcbiAgICBpZiAoIWNvbmZpZ0Rpcikge1xuICAgICAgcmV0dXJuIG5ldyBDb25maWcoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWdGaWxlUGF0aCA9IHBhdGguam9pbihjb25maWdEaXIsIFwiZmphbGwtY29uZmlnLmpzb25cIik7XG4gICAgY29uc3Qgcm9vdENvbmZpZ0pzb24gPSBDb25maWcubG9hZENvbmZpZ0ZpbGUoY29uZmlnRmlsZVBhdGgpO1xuXG4gICAgbGV0IHJvb3RDb25maWc6IFJvb3RDb25maWcgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAocm9vdENvbmZpZ0pzb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJvb3RDb25maWcgPSBSb290Q29uZmlnU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uocm9vdENvbmZpZ0pzb24pKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBDb25maWcuZm9ybWF0Wm9kRXJyb3IoZXJyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgQ29uZmlnKHJvb3RDb25maWcsIGNvbmZpZ0ZpbGVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgYSBab2QgZXJyb3IgaW50byBhIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2VcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZvcm1hdFpvZEVycm9yKGVycjogdW5rbm93biwgZmlsZU5hbWU6IHN0cmluZyk6IEVycm9yIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2Ygei5ab2RFcnJvciAmJiBlcnIuaXNzdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlzc3VlRGV0YWlscyA9IGVyci5pc3N1ZXNcbiAgICAgICAgLm1hcCgoaXNzdWUpID0+IGAke2lzc3VlLnBhdGguam9pbihcIi5cIil9OiAke2lzc3VlLm1lc3NhZ2V9YClcbiAgICAgICAgLmpvaW4oXCI7IFwiKTtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSAke2ZpbGVOYW1lfTogJHtpc3N1ZURldGFpbHN9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJhd01lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgY29uc3QgbWVzc2FnZSA9IHJhd01lc3NhZ2UucmVwbGFjZSgvXFxuL2csIFwiIFwiKS5zdWJzdHJpbmcoMCwgNTAwKTtcbiAgICByZXR1cm4gbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgJHtmaWxlTmFtZX06ICR7bWVzc2FnZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGNvbmZpZ3VyYXRpb24gdG8gZmlsZVxuICAgKi9cbiAgc2F2ZUNvbmZpZyhhcHBOYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IHRhcmdldFBhdGggPSB0aGlzLmNvbmZpZ1BhdGg7XG5cbiAgICBpZiAoIXRhcmdldFBhdGgpIHtcbiAgICAgIGlmIChhcHBOYW1lKSB7XG4gICAgICAgIGlmIChhcHBOYW1lICE9PSBwYXRoLmJhc2VuYW1lKGFwcE5hbWUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFwcCBuYW1lOiAke2FwcE5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmphbGxEaXIgPVxuICAgICAgICAgIENvbmZpZy5maW5kRmphbGxEaXJlY3RvcnkoKSB8fCBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJmamFsbFwiKTtcbiAgICAgICAgY29uc3QgYXBwRGlyID0gcGF0aC5qb2luKGZqYWxsRGlyLCBhcHBOYW1lKTtcbiAgICAgICAgdGFyZ2V0UGF0aCA9IHBhdGguam9pbihhcHBEaXIsIFwiZmphbGwtY29uZmlnLmpzb25cIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb25maWdEaXIgPVxuICAgICAgICAgIENvbmZpZy5maW5kQ29uZmlnRGlyZWN0b3J5KCkgfHwgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiZmphbGxcIik7XG4gICAgICAgIHRhcmdldFBhdGggPSBwYXRoLmpvaW4oY29uZmlnRGlyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZSh0YXJnZXRQYXRoKTtcbiAgICBmcy5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHJvb3RKc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodGhpcy5yb290Q29uZmlnLCBudWxsLCAyKTtcbiAgICBjb25zdCB0bXBQYXRoID0gYCR7dGFyZ2V0UGF0aH0udG1wYDtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRtcFBhdGgsIHJvb3RKc29uU3RyaW5nLCB7IG1vZGU6IDBvNjAwIH0pO1xuICAgIGZzLnJlbmFtZVN5bmModG1wUGF0aCwgdGFyZ2V0UGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmamFsbCBjb25maWcgZGlyZWN0b3J5IHBhdGhcbiAgICovXG4gIHN0YXRpYyBnZXRDb25maWdEaXJlY3RvcnkoYXBwTmFtZT86IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiBDb25maWcuZmluZENvbmZpZ0RpcmVjdG9yeShhcHBOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb3ZlciBhbGwgYXBwIG5hbWVzIGJ5IHNjYW5uaW5nIGZqYWxsLzxhcHA+L2ZqYWxsLWNvbmZpZy5qc29uXG4gICAqL1xuICBzdGF0aWMgZGlzY292ZXJBcHBzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBmamFsbERpciA9IENvbmZpZy5maW5kRmphbGxEaXJlY3RvcnkoKTtcbiAgICBpZiAoIWZqYWxsRGlyKSByZXR1cm4gW107XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGZqYWxsRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgICBjb25zdCBhcHBzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgY29uZmlnRmlsZSA9IHBhdGguam9pbihmamFsbERpciwgZW50cnkubmFtZSwgXCJmamFsbC1jb25maWcuanNvblwiKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnRmlsZSkpIHtcbiAgICAgICAgICBhcHBzLnB1c2goZW50cnkubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFwcHMuc29ydCgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiQ29uZmlnXCIsIFwiRmFpbGVkIHRvIGRpc2NvdmVyIGFwcHNcIiwge1xuICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvLyBEZXBsb3kgc3RhZ2UgbWFuYWdlbWVudFxuXG4gIGdldERlcGxveVN0YWdlcygpOiBSZWNvcmQ8c3RyaW5nLCBEZXBsb3lTdGFnZT4ge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcuZGVwbG95ID8/IHt9O1xuICB9XG5cbiAgZ2V0RGVwbG95U3RhZ2UobmFtZTogc3RyaW5nKTogRGVwbG95U3RhZ2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcuZGVwbG95Py5bbmFtZV07XG4gIH1cblxuICBzZXREZXBsb3lTdGFnZShuYW1lOiBzdHJpbmcsIHN0YWdlOiBEZXBsb3lTdGFnZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLmRlcGxveSkge1xuICAgICAgdGhpcy5yb290Q29uZmlnLmRlcGxveSA9IHt9O1xuICAgIH1cbiAgICB0aGlzLnJvb3RDb25maWcuZGVwbG95W25hbWVdID0gc3RhZ2U7XG4gIH1cblxuICByZW1vdmVEZXBsb3lTdGFnZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMucm9vdENvbmZpZy5kZXBsb3k/LltuYW1lXSkgcmV0dXJuIGZhbHNlO1xuICAgIGRlbGV0ZSB0aGlzLnJvb3RDb25maWcuZGVwbG95W25hbWVdO1xuXG4gICAgaWYgKHRoaXMucm9vdENvbmZpZy5hY3RpdmVTdGFnZSA9PT0gbmFtZSkge1xuICAgICAgdGhpcy5yb290Q29uZmlnLmFjdGl2ZVN0YWdlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldEFjdGl2ZVN0YWdlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5hY3RpdmVTdGFnZTtcbiAgfVxuXG4gIHNldEFjdGl2ZVN0YWdlKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucm9vdENvbmZpZy5hY3RpdmVTdGFnZSA9IG5hbWU7XG4gIH1cblxuICAvLyBEb21haW4gbWFuYWdlbWVudFxuXG4gIGdldERvbWFpbnMoKTogRG9tYWluQ29uZmlnW10ge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcuZG9tYWlucyA/PyBbXTtcbiAgfVxuXG4gIHNldERvbWFpbnMoZG9tYWluczogRG9tYWluQ29uZmlnW10pOiB2b2lkIHtcbiAgICB0aGlzLnJvb3RDb25maWcuZG9tYWlucyA9IGRvbWFpbnM7XG4gIH1cblxuICBhZGREb21haW4oZG9tYWluOiBEb21haW5Db25maWcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucm9vdENvbmZpZy5kb21haW5zKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcuZG9tYWlucyA9IFtdO1xuICAgIH1cbiAgICB0aGlzLnJvb3RDb25maWcuZG9tYWlucy5wdXNoKGRvbWFpbik7XG4gIH1cblxuICBnZXREb21haW4obmFtZTogc3RyaW5nKTogRG9tYWluQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLmRvbWFpbnM/LmZpbmQoXG4gICAgICAoZCkgPT4gZC5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKVxuICAgICk7XG4gIH1cblxuICByZW1vdmVEb21haW4obmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcuZG9tYWlucykgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yb290Q29uZmlnLmRvbWFpbnMuZmluZEluZGV4KFxuICAgICAgKGQpID0+IGQubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICApO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnJvb3RDb25maWcuZG9tYWlucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iXX0=
|