@pipeline-builder/pipeline-manager 4.4.6 → 4.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/ai.d.ts +11 -0
- package/dist/agent/ai.d.ts.map +1 -1
- package/dist/agent/ai.js +47 -4
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +9 -2
- package/dist/commands/create-pat.d.ts.map +1 -1
- package/dist/commands/create-pat.js +3 -1
- package/dist/commands/create-pipeline.d.ts.map +1 -1
- package/dist/commands/create-pipeline.js +11 -2
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +20 -2
- package/dist/commands/report.js +4 -4
- package/dist/commands/security-report.d.ts +42 -0
- package/dist/commands/security-report.d.ts.map +1 -0
- package/dist/commands/security-report.js +89 -0
- package/dist/commands/setup-events.d.ts.map +1 -1
- package/dist/commands/setup-events.js +14 -1
- package/dist/commands/store-token.d.ts +1 -0
- package/dist/commands/store-token.d.ts.map +1 -1
- package/dist/commands/store-token.js +45 -19
- package/dist/commands/synth.d.ts +7 -1
- package/dist/commands/synth.d.ts.map +1 -1
- package/dist/commands/synth.js +66 -4
- package/dist/commands/verify-plugins.d.ts +45 -0
- package/dist/commands/verify-plugins.d.ts.map +1 -0
- package/dist/commands/verify-plugins.js +134 -0
- package/dist/lambda/token-renew-handler.d.ts +3 -1
- package/dist/lambda/token-renew-handler.d.ts.map +1 -1
- package/dist/lambda/token-renew-handler.js +31 -5
- package/dist/templates/events-stack.json +10 -0
- package/dist/utils/api-client.d.ts.map +1 -1
- package/dist/utils/api-client.js +20 -3
- package/dist/utils/auth-utils.d.ts.map +1 -1
- package/dist/utils/auth-utils.js +3 -1
- package/dist/utils/cdk-utils.js +2 -2
- package/dist/utils/command-utils.d.ts.map +1 -1
- package/dist/utils/command-utils.js +5 -2
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +9 -4
- package/dist/utils/deploy-runner.d.ts +25 -0
- package/dist/utils/deploy-runner.d.ts.map +1 -1
- package/dist/utils/deploy-runner.js +34 -5
- package/dist/utils/device-auth.d.ts.map +1 -1
- package/dist/utils/device-auth.js +4 -3
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +8 -1
- package/dist/utils/pipeline-config.d.ts +3 -0
- package/dist/utils/pipeline-config.d.ts.map +1 -1
- package/dist/utils/pipeline-config.js +4 -3
- package/dist/utils/platform-secret.d.ts.map +1 -1
- package/dist/utils/platform-secret.js +3 -1
- package/dist/utils/plugin-resolver.d.ts +41 -3
- package/dist/utils/plugin-resolver.d.ts.map +1 -1
- package/dist/utils/plugin-resolver.js +125 -21
- package/dist/utils/registration-client.d.ts +28 -0
- package/dist/utils/registration-client.d.ts.map +1 -0
- package/dist/utils/registration-client.js +57 -0
- package/dist/utils/request-context.d.ts +11 -0
- package/dist/utils/request-context.d.ts.map +1 -0
- package/dist/utils/request-context.js +62 -0
- package/dist/utils/service-account.d.ts +6 -4
- package/dist/utils/service-account.d.ts.map +1 -1
- package/dist/utils/service-account.js +14 -9
- package/package.json +6 -5
|
@@ -6,7 +6,8 @@ import { fileURLToPath } from 'node:url';
|
|
|
6
6
|
import * as os from 'os';
|
|
7
7
|
import path from 'path';
|
|
8
8
|
import { LambdaClient, UpdateFunctionCodeCommand } from '@aws-sdk/client-lambda';
|
|
9
|
-
import { errorMessage } from '@pipeline-builder/api-core';
|
|
9
|
+
import { AUTOMATION_ACCOUNT_BUNDLES, errorMessage, SEED_BUNDLES } from '@pipeline-builder/api-core';
|
|
10
|
+
import { PIPELINE_REGISTRATION_CAPABILITY } from '@pipeline-builder/pipeline-core';
|
|
10
11
|
import { Command } from 'commander';
|
|
11
12
|
import { APP_VERSION, validateNumber } from '../config/cli.constants.js';
|
|
12
13
|
import { auditLog } from '../utils/audit-log.js';
|
|
@@ -26,29 +27,51 @@ const RENEW_LAMBDA_NAME = 'pipeline-builder-token-renew';
|
|
|
26
27
|
// Default 5-field cron (daily at midnight) when neither --cron nor TOKEN_RENEW_SCHEDULE is set.
|
|
27
28
|
const DEFAULT_RENEW_CRON = '0 0 * * *';
|
|
28
29
|
/**
|
|
29
|
-
*
|
|
30
|
+
* The least-privilege credentials `--scope` selects, and what each one is FOR.
|
|
30
31
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
32
|
+
* Two shapes, one flag:
|
|
33
|
+
* - a KEY scope (`reporting:ingest`, `registry:push`): the key exchanges to a
|
|
34
|
+
* token carrying only that scope — no permissions, no admin flags — for a
|
|
35
|
+
* route that checks the scope itself;
|
|
36
|
+
* - a CAPABILITY (`pipeline_registry:write`): an ordinary permission, so the key
|
|
37
|
+
* is unscoped and its account holds the one built-in Role carrying it
|
|
38
|
+
* (Pipeline Registration). Used where the route is gated by
|
|
39
|
+
* `requirePermission`, which people satisfy through their own Roles.
|
|
40
|
+
*
|
|
41
|
+
* Which Role each account holds comes from api-core's
|
|
42
|
+
* `AUTOMATION_ACCOUNT_BUNDLES` — the same table the platform's startup backfill
|
|
43
|
+
* moves existing accounts with.
|
|
36
44
|
*/
|
|
37
45
|
const SCOPE_CATALOG = {
|
|
38
46
|
'reporting:ingest': {
|
|
39
47
|
account: 'reporting-ingest',
|
|
40
|
-
description: 'AWS pipeline-event ingestion (the
|
|
48
|
+
description: 'AWS pipeline-event ingestion and step security-report uploads (the reporting:ingest scope)',
|
|
49
|
+
keyScope: 'reporting:ingest',
|
|
41
50
|
},
|
|
42
51
|
'registry:push': {
|
|
43
52
|
account: 'registry-push',
|
|
44
|
-
description: 'CI image pushes into this org’s registry namespace (CodeBuild → /token)',
|
|
53
|
+
description: 'CI image pushes and pulls into this org’s registry namespace (CodeBuild → /token)',
|
|
54
|
+
keyScope: 'registry:push',
|
|
55
|
+
},
|
|
56
|
+
[PIPELINE_REGISTRATION_CAPABILITY]: {
|
|
57
|
+
account: 'pipeline-register',
|
|
58
|
+
description: 'The CodeBuild synth registering its step manifest (POST/DELETE /pipelines/registry)',
|
|
45
59
|
},
|
|
46
60
|
};
|
|
47
|
-
/**
|
|
61
|
+
/**
|
|
62
|
+
* The account behind the default (no `--scope`) credential: the CodeBuild synth,
|
|
63
|
+
* `pipeline deploy --store-tokens`, the plugin-lookup Lambda and the run-time
|
|
64
|
+
* vulnerability check. It holds the Pipeline Automation Role — pipeline and
|
|
65
|
+
* plugin reads — and nothing more; it is no longer an org admin.
|
|
66
|
+
*/
|
|
48
67
|
const PLATFORM_ACCOUNT = {
|
|
49
68
|
account: 'platform-automation',
|
|
50
|
-
description: 'Stored platform credential for CDK synth/deploy, plugin lookup and
|
|
69
|
+
description: 'Stored platform credential for CDK synth/deploy, plugin lookup and the run-time vulnerability check',
|
|
51
70
|
};
|
|
71
|
+
/** The built-in Role (seed bundle) a NEW account for `entry` is granted, if any. */
|
|
72
|
+
function roleFor(entry) {
|
|
73
|
+
return AUTOMATION_ACCOUNT_BUNDLES[entry.account] ?? undefined;
|
|
74
|
+
}
|
|
52
75
|
/**
|
|
53
76
|
* Deploy (or update) the once-a-day KEY ROTATION stack: a scheduled Lambda that
|
|
54
77
|
* replaces the service-account key in this secret before it expires. Mirrors
|
|
@@ -221,7 +244,7 @@ export function printStoredKey(r) {
|
|
|
221
244
|
'Secret ARN': arn,
|
|
222
245
|
'Region': region,
|
|
223
246
|
'Service Account': accountName,
|
|
224
|
-
'Key Scope': provisioned.scope ?? '(none —
|
|
247
|
+
'Key Scope': provisioned.scope ?? '(none — the account\'s Role is its authority)',
|
|
225
248
|
'Key Id': provisioned.keyId,
|
|
226
249
|
'Expires In': `${days} days`,
|
|
227
250
|
'Renew By': provisioned.expiresAt,
|
|
@@ -266,6 +289,7 @@ export function printStoredKey(r) {
|
|
|
266
289
|
* PLATFORM_PASSWORD=*** pipeline-manager infra store-token --schedule --region us-east-1 # + daily rotation
|
|
267
290
|
* PLATFORM_PASSWORD=*** pipeline-manager infra store-token --scope reporting:ingest --schedule
|
|
268
291
|
* PLATFORM_PASSWORD=*** pipeline-manager infra store-token --scope registry:push --schedule
|
|
292
|
+
* PLATFORM_PASSWORD=*** pipeline-manager infra store-token --scope pipeline_registry:write --schedule
|
|
269
293
|
* pipeline-manager infra store-token --dry-run
|
|
270
294
|
* pipeline-manager infra store-token -u admin -p '***' --region us-east-1
|
|
271
295
|
* ```
|
|
@@ -277,7 +301,7 @@ export function storeToken(program) {
|
|
|
277
301
|
.option('-u, --identifier <identifier>', 'Username or email (skips PLATFORM_TOKEN requirement)')
|
|
278
302
|
.option('-p, --password <password>', 'Login password — also used for the step-up every key write requires (prefer PLATFORM_PASSWORD)')
|
|
279
303
|
.option('--days <days>', 'Key lifetime in days (max 365)', '30')
|
|
280
|
-
.option('--scope <scope>', `Provision a
|
|
304
|
+
.option('--scope <scope>', `Provision a single-purpose credential instead of the platform one. One of: ${Object.keys(SCOPE_CATALOG).join(', ')}`)
|
|
281
305
|
.option('--account <name>', 'Override the service-account name this key is issued on (default: derived from --scope)')
|
|
282
306
|
.option('--dry-run', 'Show what would be provisioned without calling the platform or writing to Secrets Manager', false)))
|
|
283
307
|
.option('--schedule', 'Also deploy the daily key-rotation stack that replaces this key before it expires (off by default)', false)
|
|
@@ -297,9 +321,11 @@ export function storeToken(program) {
|
|
|
297
321
|
throw new Error(`Unknown --scope "${scope}". Supported: ${Object.keys(SCOPE_CATALOG).join(', ')}`);
|
|
298
322
|
}
|
|
299
323
|
// Which machine identity this credential belongs to: the scope's own
|
|
300
|
-
// account, or the org's
|
|
324
|
+
// account, or the org's platform automation account.
|
|
301
325
|
const identity = catalogued ?? PLATFORM_ACCOUNT;
|
|
302
326
|
const accountName = options.account ?? identity.account;
|
|
327
|
+
const role = roleFor(identity);
|
|
328
|
+
const keyScope = identity.keyScope;
|
|
303
329
|
// Step 0: log in first when creds are available and no PLATFORM_TOKEN is
|
|
304
330
|
// set (shared with setup-events). Creds come from --identifier/--password
|
|
305
331
|
// OR the env vars PLATFORM_IDENTIFIER/PLATFORM_PASSWORD — the env path
|
|
@@ -321,8 +347,8 @@ export function storeToken(program) {
|
|
|
321
347
|
// burn a key just to show what it would do.
|
|
322
348
|
printDryRunPlan({
|
|
323
349
|
serviceAccount: accountName,
|
|
324
|
-
roles:
|
|
325
|
-
scope:
|
|
350
|
+
roles: role ? SEED_BUNDLES[role].name : 'none (scoped key, least privilege)',
|
|
351
|
+
scope: keyScope ?? '(none — the account\'s Role is its authority)',
|
|
326
352
|
secretName: process.env.PLATFORM_SECRET_NAME || `${secretNameForOrg('<orgId>', scope ? scopeSecretLeaf(scope) : 'platform')}`,
|
|
327
353
|
region,
|
|
328
354
|
expiresInDays: days,
|
|
@@ -335,8 +361,8 @@ export function storeToken(program) {
|
|
|
335
361
|
password: password,
|
|
336
362
|
accountName,
|
|
337
363
|
description: identity.description,
|
|
338
|
-
|
|
339
|
-
...(
|
|
364
|
+
...(role ? { role } : {}),
|
|
365
|
+
...(keyScope ? { scope: keyScope } : {}),
|
|
340
366
|
expiresInSeconds,
|
|
341
367
|
keyName,
|
|
342
368
|
});
|
|
@@ -408,4 +434,4 @@ export function storeToken(program) {
|
|
|
408
434
|
}
|
|
409
435
|
});
|
|
410
436
|
}
|
|
411
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtdG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc3RvcmUtdG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRixPQUFPLEVBQUUsOEJBQThCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JLLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFB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QUFJO2dCQUNWLE9BQU8sRUFBRTtvQkFDUCxPQUFPLEVBQUUsYUFBYTtvQkFDdEIsV0FBVztvQkFDWCxVQUFVLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsSUFBSSx3QkFBd0I7aUJBQ3pFO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IExhbWJkYUNsaWVudCwgVXBkYXRlRnVuY3Rpb25Db2RlQ29tbWFuZCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1sYW1iZGEnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBBUFBfVkVSU0lPTiwgdmFsaWRhdGVOdW1iZXIgfSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEFwaUNsaWVudCB9IGZyb20gJy4uL3V0aWxzL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHsgYXVkaXRMb2cgfSBmcm9tICcuLi91dGlscy9hdWRpdC1sb2cuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUF3c1JlZ2lvbiB9IGZyb20gJy4uL3V0aWxzL2F3cy1lbnYuanMnO1xuaW1wb3J0IHsgdXBzZXJ0U2VjcmV0LCBnZXRTZWNyZXRBcm4sIGdldFNlY3JldFZhbHVlIH0gZnJvbSAnLi4vdXRpbHMvYXdzLXNlY3JldHMuanMnO1xuaW1wb3J0IHsgY3JlYXRlQXV0aGVudGljYXRlZENsaWVudEFzeW5jLCBwcmludENvbW1hbmRIZWFkZXIsIHByaW50U3NsV2FybmluZywgd2l0aFByb2ZpbGVPcHRpb24sIHdpdGhSZWdpb25PcHRpb24sIHdpdGhTc2xPcHRpb25zIH0gZnJvbSAnLi4vdXRpbHMvY29tbWFuZC11dGlscy5qcyc7XG5pbXBvcnQgeyB0b0V2ZW50QnJpZGdlQ3JvbiB9IGZyb20gJy4uL3V0aWxzL2Nyb24uanMnO1xuaW1wb3J0IHsgRVJST1JfQ09ERVMsIGhhbmRsZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBwcmludEluZm8sIHByaW50S2V5VmFsdWUsIHByaW50U2VjdGlvbiwgcHJpbnRTdWNjZXNzLCBwcmludFdhcm5pbmcgfSBmcm9tICcuLi91dGlscy9vdXRwdXQtdXRpbHMuanMnO1xuaW1wb3J0IHsgZW5zdXJlUGxhdGZvcm1Ub2tlbiwgc2NvcGVTZWNyZXRMZWFmLCBzZWNyZXROYW1lRm9yT3JnIH0gZnJvbSAnLi4vdXRpbHMvcGxhdGZvcm0tc2VjcmV0LmpzJztcbmltcG9ydCB7IHByb3Zpc2lvblNlcnZpY2VBY2NvdW50S2V5LCByZXZva2VTZXJ2aWNlQWNjb3VudEtleSwgdHlwZSBQcm92aXNpb25lZEtleSB9IGZyb20gJy4uL3V0aWxzL3NlcnZpY2UtYWNjb3VudC5qcyc7XG5cbi8vIEVTTSBoYXMgbm8gX19kaXJuYW1lOyBkZXJpdmUgaXQgZnJvbSB0aGlzIG1vZHVsZSdzIFVSTC5cbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuXG5jb25zdCBSRU5FV19TVEFDS19OQU1FID0gJ3BpcGVsaW5lLWJ1aWxkZXItdG9rZW4tcmVuZXcnO1xuLy8gQ0ZOLW1hbmFnZWQgTGFtYmRhIGZ1bmN0aW9uIG5hbWUg4oCUIGtlZXAgaW4gc3luYyB3aXRoIHRva2VuLXJlbmV3LXN0YWNrLmpzb24uXG5jb25zdCBSRU5FV19MQU1CREFfTkFNRSA9ICdwaXBlbGluZS1idWlsZGVyLXRva2VuLXJlbmV3Jztcbi8vIERlZmF1bHQgNS1maWVsZCBjcm9uIChkYWlseSBhdCBtaWRuaWdodCkgd2hlbiBuZWl0aGVyIC0tY3JvbiBub3IgVE9LRU5fUkVORVdfU0NIRURVTEUgaXMgc2V0LlxuY29uc3QgREVGQVVMVF9SRU5FV19DUk9OID0gJzAgMCAqICogKic7XG5cbi8qKlxuICogQ2FwYWJpbGl0eSBzY29wZXMgYSBzdG9yZWQgY3JlZGVudGlhbCBtYXkgY2FycnksIGFuZCB3aGF0IGVhY2ggb25lIGlzIEZPUi5cbiAqXG4gKiBBIHNjb3BlZCBrZXkgZXhjaGFuZ2VzIHRvIGEgdG9rZW4gd2l0aCBubyBwZXJtaXNzaW9ucyBhbmQgbm8gYWRtaW4gZmxhZ3MgYXRcbiAqIGFsbCDigJQgb25seSB0aGUgb25lIGNhcGFiaWxpdHkg4oCUIHNvIGl0IGlzIHRoZSBzaGFwZSBldmVyeSBhdXRvbWF0aW9uIHRoYXQgZG9lc1xuICogZXhhY3RseSBvbmUgdGhpbmcgc2hvdWxkIGhvbGQuIFRoZSB1bnNjb3BlZCBgcGxhdGZvcm1gIGNyZWRlbnRpYWwgaXMgdGhlXG4gKiByZW1haW5pbmcgZnVsbC1wcml2aWxlZ2Ugb25lOiBzeW50aC9kZXBsb3kgY2FsbGJhY2tzIGFuZCB0aGUgcGx1Z2luLWxvb2t1cFxuICogTGFtYmRhIGNhbGwgdGhlIG9yZGluYXJ5IEFQSSBzdXJmYWNlLCB3aGljaCBubyBzaW5nbGUgc2NvcGUgY292ZXJzLlxuICovXG5jb25zdCBTQ09QRV9DQVRBTE9HOiBSZWNvcmQ8c3RyaW5nLCB7IGFjY291bnQ6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9PiA9IHtcbiAgJ3JlcG9ydGluZzppbmdlc3QnOiB7XG4gICAgYWNjb3VudDogJ3JlcG9ydGluZy1pbmdlc3QnLFxuICAgIGRlc2NyaXB0aW9uOiAnQVdTIHBpcGVsaW5lLWV2ZW50IGluZ2VzdGlvbiAodGhlIGV2ZW50cyBMYW1iZGEgUE9TVHMgL3JlcG9ydHMvZXZlbnRzKScsXG4gIH0sXG4gICdyZWdpc3RyeTpwdXNoJzoge1xuICAgIGFjY291bnQ6ICdyZWdpc3RyeS1wdXNoJyxcbiAgICBkZXNjcmlwdGlvbjogJ0NJIGltYWdlIHB1c2hlcyBpbnRvIHRoaXMgb3Jn4oCZcyByZWdpc3RyeSBuYW1lc3BhY2UgKENvZGVCdWlsZCDihpIgL3Rva2VuKScsXG4gIH0sXG59O1xuXG4vKiogVGhlIGFjY291bnQgdGhhdCBob2xkcyB0aGUgdW5zY29wZWQsIGZ1bGwtcHJpdmlsZWdlIHN0b3JlZCBjcmVkZW50aWFsLiAqL1xuY29uc3QgUExBVEZPUk1fQUNDT1VOVCA9IHtcbiAgYWNjb3VudDogJ3BsYXRmb3JtLWF1dG9tYXRpb24nLFxuICBkZXNjcmlwdGlvbjogJ1N0b3JlZCBwbGF0Zm9ybSBjcmVkZW50aWFsIGZvciBDREsgc3ludGgvZGVwbG95LCBwbHVnaW4gbG9va3VwIGFuZCBpbWFnZSBwdXNoZXMnLFxufTtcblxuLyoqXG4gKiBEZXBsb3kgKG9yIHVwZGF0ZSkgdGhlIG9uY2UtYS1kYXkgS0VZIFJPVEFUSU9OIHN0YWNrOiBhIHNjaGVkdWxlZCBMYW1iZGEgdGhhdFxuICogcmVwbGFjZXMgdGhlIHNlcnZpY2UtYWNjb3VudCBrZXkgaW4gdGhpcyBzZWNyZXQgYmVmb3JlIGl0IGV4cGlyZXMuIE1pcnJvcnNcbiAqIHNldHVwLWV2ZW50cyDigJQgYGF3cyBjbG91ZGZvcm1hdGlvbiBkZXBsb3lgIGZvciB0aGUgaW5mcmEsIHRoZW4gYSBkaXJlY3RcbiAqIFVwZGF0ZUZ1bmN0aW9uQ29kZSB3aXRoIHRoZSByb3RhdG9yIGhhbmRsZXIgY29tcGlsZWQgYWxvbmdzaWRlIHRoaXMgQ0xJIChzZWVcbiAqIHNyYy9sYW1iZGEvdG9rZW4tcmVuZXctaGFuZGxlci50cykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlcGxveVJlbmV3U2NoZWR1bGUob3B0czoge1xuICBzZWNyZXROYW1lOiBzdHJpbmc7XG4gIGRheXM6IG51bWJlcjtcbiAgZml2ZUZpZWxkQ3Jvbjogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgcHJvZmlsZT86IHN0cmluZztcbn0pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBzY2hlZHVsZUV4cHJlc3Npb24gPSB0b0V2ZW50QnJpZGdlQ3JvbihvcHRzLmZpdmVGaWVsZENyb24pOyAvLyB2YWxpZGF0ZXMgKyAxNS1taW4gZ3VhcmRcblxuICAvLyBOYW1lIHJlbmV3YWwgcmVzb3VyY2VzIHBlci1zZWNyZXQgc28gYSBzY29wZWQtY3JlZGVudGlhbCBzdGFjayAoZS5nLiB0aGVcbiAgLy8gcmVwb3J0aW5nLWluZ2VzdCBrZXkgdGhlIGV2ZW50IExhbWJkYSByZWFkcykgY29leGlzdHMgd2l0aCB0aGVcbiAgLy8gcGxhdGZvcm0tY3JlZGVudGlhbCBzdGFjayBpbnN0ZWFkIG9mIGNvbGxpZGluZyBvbiB0aGUgKGFjY291bnQtZ2xvYmFsKSBJQU1cbiAgLy8gcm9sZSAvIExhbWJkYSAvIHJ1bGUgbmFtZXMuIFRoZSBwbGF0Zm9ybSBzZWNyZXQga2VlcHMgdGhlIGJhcmUgbmFtZVxuICAvLyAoc3VmZml4ICcnKSBzbyBleGlzdGluZyBkZXBsb3ltZW50cycgc3RhY2sgaXMgdXBkYXRlZCBpbiBwbGFjZSwgbm90XG4gIC8vIGR1cGxpY2F0ZWQ7IGFueSBvdGhlciBzZWNyZXQgYXBwZW5kcyBpdHMgdHJhaWxpbmcgcGF0aCBzZWdtZW50LlxuICBjb25zdCBzZWNyZXRMZWFmID0gb3B0cy5zZWNyZXROYW1lLnJlcGxhY2UoLy4qXFwvLywgJycpOyAvLyAncGxhdGZvcm0nIHwgJ3JlcG9ydGluZy1pbmdlc3QnIHwg4oCmXG4gIGNvbnN0IG5hbWVTdWZmaXggPSBzZWNyZXRMZWFmID09PSAncGxhdGZvcm0nID8gJycgOiBgLSR7c2VjcmV0TGVhZi5yZXBsYWNlKC9bXmEtejAtOV0rL2dpLCAnLScpfWA7XG4gIGNvbnN0IHN0YWNrTmFtZSA9IGAke1JFTkVXX1NUQUNLX05BTUV9JHtuYW1lU3VmZml4fWA7XG4gIGNvbnN0IGxhbWJkYU5hbWUgPSBgJHtSRU5FV19MQU1CREFfTkFNRX0ke25hbWVTdWZmaXh9YDtcblxuICBwcmludFNlY3Rpb24oJ1NjaGVkdWxlIFJvdGF0aW9uJyk7XG4gIHByaW50SW5mbygnUGFyYW1ldGVycycsIHtcbiAgICBzdGFjazogc3RhY2tOYW1lLFxuICAgIHNjaGVkdWxlOiBvcHRzLmZpdmVGaWVsZENyb24sXG4gICAgZXZlbnRicmlkZ2U6IHNjaGVkdWxlRXhwcmVzc2lvbixcbiAgICByZW5ld0RheXM6IG9wdHMuZGF5cyxcbiAgfSk7XG5cbiAgLy8gU3RlcCAxOiBpbmZyYSAoTGFtYmRhIGdldHMgcGxhY2Vob2xkZXIgY29kZSBvbiBmaXJzdCBjcmVhdGUpLlxuICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vdGVtcGxhdGVzL3Rva2VuLXJlbmV3LXN0YWNrLmpzb24nKTtcbiAgY29uc3QgY2ZuQXJncyA9IFtcbiAgICAnY2xvdWRmb3JtYXRpb24nLCAnZGVwbG95JyxcbiAgICAnLS1zdGFjay1uYW1lJywgc3RhY2tOYW1lLFxuICAgICctLXRlbXBsYXRlLWZpbGUnLCB0ZW1wbGF0ZVBhdGgsXG4gICAgJy0tcGFyYW1ldGVyLW92ZXJyaWRlcycsXG4gICAgYFBsYXRmb3JtU2VjcmV0TmFtZT0ke29wdHMuc2VjcmV0TmFtZX1gLFxuICAgIGBSZW5ld0RheXM9JHtvcHRzLmRheXN9YCxcbiAgICBgU2NoZWR1bGVFeHByZXNzaW9uPSR7c2NoZWR1bGVFeHByZXNzaW9ufWAsXG4gICAgYE5hbWVTdWZmaXg9JHtuYW1lU3VmZml4fWAsXG4gICAgLy8gUmVjb3JkZWQgZm9yIHByb3ZlbmFuY2Ugb25seSDigJQgdGhlIHJvdGF0b3IgZG9lcyBub3QgaW5zdGFsbCB0aGUgQ0xJIGF0XG4gICAgLy8gcnVudGltZSAoaXQgc3BlYWtzIHRvIHRoZSBwbGF0Zm9ybSBkaXJlY3RseSksIGJ1dCBrbm93aW5nIHdoaWNoIENMSVxuICAgIC8vIGRlcGxveWVkIGEgc3RhY2sgaXMgd29ydGgga2VlcGluZy5cbiAgICBgUGlwZWxpbmVNYW5hZ2VyVmVyc2lvbj0ke0FQUF9WRVJTSU9OfWAsXG4gICAgJy0tY2FwYWJpbGl0aWVzJywgJ0NBUEFCSUxJVFlfTkFNRURfSUFNJyxcbiAgICAnLS1uby1mYWlsLW9uLWVtcHR5LWNoYW5nZXNldCcsXG4gICAgJy0tcmVnaW9uJywgb3B0cy5yZWdpb24sXG4gIF07XG4gIGlmIChvcHRzLnByb2ZpbGUpIGNmbkFyZ3MucHVzaCgnLS1wcm9maWxlJywgb3B0cy5wcm9maWxlKTtcbiAgZXhlY0ZpbGVTeW5jKCdhd3MnLCBjZm5BcmdzLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG5cbiAgLy8gU3RlcCAyOiB1cGxvYWQgdGhlIHJlYWwgaGFuZGxlci4gSXQncyBFU00sIHNvIHRoZSB6aXAgZW50cnkgbXVzdCBiZSBpbmRleC5tanNcbiAgLy8gKEhhbmRsZXIgc3RheXMgaW5kZXguaGFuZGxlciDigJQgbm9kZWpzMjYueCByZXNvbHZlcyB0aGUgLm1qcyBleHRlbnNpb24pLlxuICBjb25zdCBoYW5kbGVyU3JjID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2xhbWJkYS90b2tlbi1yZW5ldy1oYW5kbGVyLmpzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhoYW5kbGVyU3JjKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVG9rZW4tcmVuZXcgaGFuZGxlciBub3QgZm91bmQgYXQgJHtoYW5kbGVyU3JjfSDigJQgd2FzIHRoZSBwYWNrYWdlIGJ1aWx0P2ApO1xuICB9XG4gIGNvbnN0IHRtcERpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3Rva2VuLXJlbmV3LScpKTtcbiAgdHJ5IHtcbiAgICBmcy5jb3B5RmlsZVN5bmMoaGFuZGxlclNyYywgcGF0aC5qb2luKHRtcERpciwgJ2luZGV4Lm1qcycpKTtcbiAgICBjb25zdCB6aXBQYXRoID0gcGF0aC5qb2luKHRtcERpciwgJ2luZGV4LnppcCcpO1xuICAgIGV4ZWNGaWxlU3luYygnemlwJywgWyctaicsIHppcFBhdGgsICdpbmRleC5tanMnXSwgeyBjd2Q6IHRtcERpciwgc3RkaW86ICdwaXBlJyB9KTtcblxuICAgIGNvbnN0IGxhbWJkYUNsaWVudCA9IG5ldyBMYW1iZGFDbGllbnQoeyByZWdpb246IG9wdHMucmVnaW9uIH0pO1xuICAgIGF3YWl0IGxhbWJkYUNsaWVudC5zZW5kKG5ldyBVcGRhdGVGdW5jdGlvbkNvZGVDb21tYW5kKHtcbiAgICAgIEZ1bmN0aW9uTmFtZTogbGFtYmRhTmFtZSxcbiAgICAgIFppcEZpbGU6IGZzLnJlYWRGaWxlU3luYyh6aXBQYXRoKSxcbiAgICB9KSk7XG4gIH0gZmluYWxseSB7XG4gICAgZnMucm1TeW5jKHRtcERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpbnRTdWNjZXNzKGBSb3RhdGlvbiBzY2hlZHVsZWQgKCR7c2NoZWR1bGVFeHByZXNzaW9ufSlgKTtcbiAgcmV0dXJuIHNjaGVkdWxlRXhwcmVzc2lvbjtcbn1cblxuLyoqIFJlYWQgdGhlIGtleSBpZCBhIHByZXZpb3VzIHJ1biBzdG9yZWQsIHNvIHRoaXMgcnVuIGNhbiByZXRpcmUgaXQuICovXG5hc3luYyBmdW5jdGlvbiBwcmV2aW91c0tleUlkKFxuICBzZWNyZXROYW1lOiBzdHJpbmcsXG4gIGF3czogeyByZWdpb246IHN0cmluZzsgcHJvZmlsZT86IHN0cmluZyB9LFxuKTogUHJvbWlzZTx7IGtleUlkPzogc3RyaW5nOyBzZXJ2aWNlQWNjb3VudElkPzogc3RyaW5nIH0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBhd2FpdCBnZXRTZWNyZXRWYWx1ZShzZWNyZXROYW1lLCBhd3MpO1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyB7IGtleUlkPzogc3RyaW5nOyBzZXJ2aWNlQWNjb3VudElkPzogc3RyaW5nIH07XG4gICAgcmV0dXJuIHsga2V5SWQ6IHBhcnNlZC5rZXlJZCwgc2VydmljZUFjY291bnRJZDogcGFyc2VkLnNlcnZpY2VBY2NvdW50SWQgfTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gc2VjcmV0IHlldCAoZmlyc3QgcnVuKSwgb3Igb25lIHdyaXR0ZW4gYmVmb3JlIHRoZSBzZXJ2aWNlLWFjY291bnRcbiAgICAvLyBjdXRvdmVyIChubyBrZXlJZCkuIEVpdGhlciB3YXkgdGhlcmUgaXMgbm90aGluZyB0aGlzIHJ1biBjYW4gcmV0aXJlLlxuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKiogV2hhdCBhIGRyeSBydW4gcmVwb3J0cyBpdCBXT1VMRCBwcm92aXNpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JlVG9rZW5QbGFuIHtcbiAgc2VydmljZUFjY291bnQ6IHN0cmluZztcbiAgcm9sZXM6IHN0cmluZztcbiAgc2NvcGU6IHN0cmluZztcbiAgc2VjcmV0TmFtZTogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgZXhwaXJlc0luRGF5czogbnVtYmVyO1xufVxuXG4vKiogUHJpbnQgdGhlIGRyeS1ydW4gcGxhbiAoSlNPTiBvciBodW1hbikuIFN0YXlzIGVudGlyZWx5IG9mZmxpbmUuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpbnREcnlSdW5QbGFuKHBsYW46IFN0b3JlVG9rZW5QbGFuLCBqc29uOiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChqc29uKSB7XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBzdWNjZXNzOiB0cnVlLCBkcnlSdW46IHRydWUsIC4uLnBsYW4gfSwgbnVsbCwgMikpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLmxvZygnJyk7XG4gIHByaW50U2VjdGlvbignRHJ5IFJ1biDigJQgTm8gQ2hhbmdlcyBNYWRlJyk7XG4gIHByaW50S2V5VmFsdWUoe1xuICAgICdTZXJ2aWNlIEFjY291bnQnOiBwbGFuLnNlcnZpY2VBY2NvdW50LFxuICAgICdSb2xlcyc6IHBsYW4ucm9sZXMsXG4gICAgJ0tleSBTY29wZSc6IHBsYW4uc2NvcGUsXG4gICAgJ1NlY3JldCBOYW1lJzogcGxhbi5zZWNyZXROYW1lLFxuICAgICdSZWdpb24nOiBwbGFuLnJlZ2lvbixcbiAgICAnRXhwaXJlcyBJbic6IGAke3BsYW4uZXhwaXJlc0luRGF5c30gZGF5c2AsXG4gIH0pO1xuICBwcmludFN1Y2Nlc3MoJ0RyeSBydW4gY29tcGxldGUg4oCUIG5vIGFjY291bnQsIGtleSBvciBzZWNyZXQgd2FzIGNyZWF0ZWQnKTtcbn1cblxuLyoqXG4gKiBUaGUgU2VjcmV0cyBNYW5hZ2VyIHBheWxvYWQ6IGB7IHVzZXJuYW1lOiBvcmdJZCwgcGFzc3dvcmQ6IDxwYl9zYV8ga2V5PiwgLi4ubWV0YWRhdGEgfWAuXG4gKiAtIHVzZXJuYW1lL3Bhc3N3b3JkIHNhdGlzZnkgQ29kZUJ1aWxkJ3MgYHNlY3JldHNNYW5hZ2VyQ3JlZGVudGlhbHNgIChIVFRQXG4gKiAgIEJhc2ljLCBzZW50IHRvIHBpcGVsaW5lLWltYWdlLXJlZ2lzdHJ5J3MgL3Rva2VuIGVuZHBvaW50LCB3aGljaCBleGNoYW5nZXNcbiAqICAgdGhlIG9wYXF1ZSBrZXkgbGlrZSBldmVyeSBvdGhlciBzZXJ2aWNlIGRvZXMpLlxuICogLSBgcGFzc3dvcmRgIGlzIHRoZSBjYW5vbmljYWwgZmllbGQ6IHRoZSBwbHVnaW4tbG9va3VwIExhbWJkYSwgdGhlIGV2ZW50c1xuICogICBMYW1iZGEgYW5kIGAtLXN0b3JlLXRva2Vuc2AgYWxsIHJlYWQgaXQuXG4gKiAtIGtleUlkIC8gc2VydmljZUFjY291bnRJZCBhcmUgd2hhdCB0aGUgcm90YXRpb24gTGFtYmRhIG5lZWRzIHRvIHJldGlyZSB0aGVcbiAqICAga2V5IGl0IHJlcGxhY2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTZWNyZXRWYWx1ZShwcm92aXNpb25lZDogUHJvdmlzaW9uZWRLZXksIHBsYXRmb3JtVXJsOiBzdHJpbmcsIGV4cGlyZXNJblNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgdXNlcm5hbWU6IHByb3Zpc2lvbmVkLm9yZ2FuaXphdGlvbklkLFxuICAgIHBhc3N3b3JkOiBwcm92aXNpb25lZC5rZXksXG4gICAgcGxhdGZvcm1VcmwsXG4gICAgb3JnYW5pemF0aW9uSWQ6IHByb3Zpc2lvbmVkLm9yZ2FuaXphdGlvbklkLFxuICAgIHNlcnZpY2VBY2NvdW50SWQ6IHByb3Zpc2lvbmVkLnNlcnZpY2VBY2NvdW50SWQsXG4gICAgc2VydmljZUFjY291bnROYW1lOiBwcm92aXNpb25lZC5zZXJ2aWNlQWNjb3VudE5hbWUsXG4gICAga2V5SWQ6IHByb3Zpc2lvbmVkLmtleUlkLFxuICAgIHNjb3BlOiBwcm92aXNpb25lZC5zY29wZSxcbiAgICBleHBpcmVzSW46IGV4cGlyZXNJblNlY29uZHMsXG4gICAgZXhwaXJlc0F0OiBwcm92aXNpb25lZC5leHBpcmVzQXQsXG4gICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gIH0pO1xufVxuXG4vKipcbiAqIFJldGlyZSB0aGUgY3JlZGVudGlhbCB0aGlzIHJ1biByZXBsYWNlZCDigJQgQUZURVIgdGhlIG5ldyBvbmUgaXMgc3RvcmVkLCBuZXZlclxuICogYmVmb3JlLiBBIGZhaWx1cmUgaGVyZSBsZWF2ZXMgYSBzdXBlcmZsdW91cyBrZXkgdGhhdCBleHBpcmVzIG9uIGl0cyBvd247XG4gKiBkb2luZyBpdCBpbiB0aGUgb3RoZXIgb3JkZXIgd291bGQgbGVhdmUgdGhlIHNlY3JldCBuYW1pbmcgYSByZXZva2VkIGtleSBpZlxuICogdGhlIHdyaXRlIGZhaWxlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJldGlyZVByZXZpb3VzS2V5KFxuICBjbGllbnQ6IEFwaUNsaWVudCxcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgcHJvdmlzaW9uZWQ6IFByb3Zpc2lvbmVkS2V5LFxuICBwcmV2aW91czogeyBrZXlJZD86IHN0cmluZzsgc2VydmljZUFjY291bnRJZD86IHN0cmluZyB9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghcHJldmlvdXMua2V5SWQgfHwgcHJldmlvdXMuc2VydmljZUFjY291bnRJZCAhPT0gcHJvdmlzaW9uZWQuc2VydmljZUFjY291bnRJZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGF3YWl0IHJldm9rZVNlcnZpY2VBY2NvdW50S2V5KFxuICAgICAgY2xpZW50LCBwYXNzd29yZCwgcHJvdmlzaW9uZWQub3JnYW5pemF0aW9uSWQsIHByb3Zpc2lvbmVkLnNlcnZpY2VBY2NvdW50SWQsIHByZXZpb3VzLmtleUlkLFxuICAgICk7XG4gICAgcHJpbnRTdWNjZXNzKGBSZXRpcmVkIHRoZSBwcmV2aW91cyBrZXkgKCR7cHJldmlvdXMua2V5SWR9KWApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBwcmludFdhcm5pbmcoXG4gICAgICBgU3RvcmVkIHRoZSBuZXcga2V5LCBidXQgY291bGQgbm90IHJldm9rZSB0aGUgcHJldmlvdXMgb25lICgke3ByZXZpb3VzLmtleUlkfSk6IGBcbiAgICAgICsgYCR7ZXJyb3JNZXNzYWdlKGVycil9LiBJdCBleHBpcmVzIG9uIGl0cyBvd247IHJldm9rZSBpdCBmcm9tIGBcbiAgICAgICsgJ1NldHRpbmdzIOKGkiBTZXJ2aWNlIGFjY291bnRzIGlmIHlvdSB3YW50IGl0IGdvbmUgbm93LicsXG4gICAgKTtcbiAgfVxufVxuXG4vKiogUHJpbnQgdGhlIHN0b3JlZCBrZXkncyBzdW1tYXJ5IChKU09OIG9yIGh1bWFuKSBwbHVzIHRoZSBuZXh0IHN0ZXBzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RvcmVkS2V5KHI6IHtcbiAganNvbjogYm9vbGVhbjtcbiAgc2VjcmV0TmFtZTogc3RyaW5nO1xuICBhcm46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIGFjY291bnROYW1lOiBzdHJpbmc7XG4gIHByb3Zpc2lvbmVkOiBQcm92aXNpb25lZEtleTtcbiAgZGF5czogbnVtYmVyO1xuICBzY2hlZHVsZUV4cHJlc3Npb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn0pOiB2b2lkIHtcbiAgY29uc3QgeyBzZWNyZXROYW1lLCBhcm4sIHJlZ2lvbiwgYWNjb3VudE5hbWUsIHByb3Zpc2lvbmVkLCBkYXlzLCBzY2hlZHVsZUV4cHJlc3Npb24gfSA9IHI7XG4gIGlmIChyLmpzb24pIHtcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgc2VjcmV0TmFtZSxcbiAgICAgIHNlY3JldEFybjogYXJuLFxuICAgICAgcmVnaW9uLFxuICAgICAgc2VydmljZUFjY291bnQ6IGFjY291bnROYW1lLFxuICAgICAgc2VydmljZUFjY291bnRJZDogcHJvdmlzaW9uZWQuc2VydmljZUFjY291bnRJZCxcbiAgICAgIGtleUlkOiBwcm92aXNpb25lZC5rZXlJZCxcbiAgICAgIHNjb3BlOiBwcm92aXNpb25lZC5zY29wZSxcbiAgICAgIGV4cGlyZXNJbkRheXM6IGRheXMsXG4gICAgICBleHBpcmVzQXQ6IHByb3Zpc2lvbmVkLmV4cGlyZXNBdCxcbiAgICAgIHNjaGVkdWxlOiBzY2hlZHVsZUV4cHJlc3Npb24gPz8gbnVsbCxcbiAgICB9LCBudWxsLCAyKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coJycpO1xuICAgIHByaW50U2VjdGlvbignS2V5IFN0b3JlZCcpO1xuXG4gICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAnU2VjcmV0IE5hbWUnOiBzZWNyZXROYW1lLFxuICAgICAgJ1NlY3JldCBBUk4nOiBhcm4sXG4gICAgICAnUmVnaW9uJzogcmVnaW9uLFxuICAgICAgJ1NlcnZpY2UgQWNjb3VudCc6IGFjY291bnROYW1lLFxuICAgICAgJ0tleSBTY29wZSc6IHByb3Zpc2lvbmVkLnNjb3BlID8/ICcobm9uZSDigJQgZnVsbCBwbGF0Zm9ybSBjcmVkZW50aWFsKScsXG4gICAgICAnS2V5IElkJzogcHJvdmlzaW9uZWQua2V5SWQsXG4gICAgICAnRXhwaXJlcyBJbic6IGAke2RheXN9IGRheXNgLFxuICAgICAgJ1JlbmV3IEJ5JzogcHJvdmlzaW9uZWQuZXhwaXJlc0F0LFxuICAgICAgJ0F1dG8tUm90YXRlJzogc2NoZWR1bGVFeHByZXNzaW9uID8gYOKckyAke3NjaGVkdWxlRXhwcmVzc2lvbn1gIDogJ29mZiAocGFzcyAtLXNjaGVkdWxlIHRvIGVuYWJsZSknLFxuICAgICAgJ1N0YXR1cyc6ICfinJMgU3RvcmVkJyxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICBwcmludFN1Y2Nlc3MoJ0tleSBzdG9yZWQuIFRvIHVzZSB3aXRoIHN5bnRoL2RlcGxveTonKTtcbiAgICBwcmludEluZm8oYCAgZXhwb3J0IFBMQVRGT1JNX1NFQ1JFVF9OQU1FPSR7c2VjcmV0TmFtZX1gKTtcbiAgICBwcmludEluZm8oJyAgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aCAtLWlkIDxwaXBlbGluZS1pZD4gLS1zdG9yZS10b2tlbnMnKTtcbiAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgaWYgKHNjaGVkdWxlRXhwcmVzc2lvbikge1xuICAgICAgcHJpbnRJbmZvKGBBdXRvLXJvdGF0aW9uIGlzIGFjdGl2ZSAoJHtzY2hlZHVsZUV4cHJlc3Npb259KTsgdGhlIHNlY3JldCBpcyByZXBsYWNlZCBiZWZvcmUgJHtwcm92aXNpb25lZC5leHBpcmVzQXR9LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmludEluZm8oYFJvdGF0ZSBiZWZvcmUgJHtwcm92aXNpb25lZC5leHBpcmVzQXR9IHdpdGg6IHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW4gLS1kYXlzICR7ZGF5c31gKTtcbiAgICAgIHByaW50SW5mbygnICAob3IgcGFzcyAtLXNjaGVkdWxlIHRvIGluc3RhbGwgYSBkYWlseSBhdXRvLXJvdGF0aW9uIHN0YWNrKScpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgYHN0b3JlLXRva2VuYCBjb21tYW5kIHdpdGggdGhlIENMSSBwcm9ncmFtLlxuICpcbiAqIFByb3Zpc2lvbnMgdGhlIG9yZydzIG1hY2hpbmUgaWRlbnRpdHkg4oCUIGEgU0VSVklDRSBBQ0NPVU5UIGFuZCBvbmUgYHBiX3NhX+KApmBcbiAqIGtleSDigJQgYW5kIHN0b3JlcyB0aGUga2V5IGluIEFXUyBTZWNyZXRzIE1hbmFnZXIgZm9yIENESyBkZXBsb3ltZW50cyxcbiAqIENvZGVCdWlsZCdzIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzLCB0aGUgcGx1Z2luLWxvb2t1cCBMYW1iZGEgYW5kIHRoZSBldmVudFxuICogaW5nZXN0aW9uIExhbWJkYS4gTm90aGluZyBzdG9yZWQgaXMgdGllZCB0byBhIHBlcnNvbidzIHNlc3Npb24gYW55XG4gKiBtb3JlOiB0aGUgYWNjb3VudCBvdXRsaXZlcyBpdHMgY3JlYXRvciwgdGFrZXMgbm8gc2VhdCwgYW5kIGV2ZXJ5IGF1ZGl0IHJvdyBpdFxuICogcHJvZHVjZXMgbmFtZXMgdGhlIGFjY291bnQuXG4gKlxuICogQmVjYXVzZSBjcmVhdGluZyBhbiBhY2NvdW50IGFuZCBpc3N1aW5nIGl0cyBrZXkgYXJlIHN0ZXAtdXAgZ2F0ZWQsIHRoaXMgbmVlZHNcbiAqIHRoZSBvcGVyYXRvcidzIHBhc3N3b3JkIOKAlCBgLS1wYXNzd29yZGAsIG9yIHRoZSBgUExBVEZPUk1fUEFTU1dPUkRgIGVudiB2YXJcbiAqIChwcmVmZXJyZWQ6IGl0IGtlZXBzIHRoZSBwYXNzd29yZCBvdXQgb2Ygc2hlbGwgaGlzdG9yeSBhbmQgcGxhbiBvdXRwdXQpLlxuICpcbiAqIEJ5IGRlZmF1bHQgaXQgT05MWSB3cml0ZXMgdGhlIHNlY3JldC4gUGFzcyAtLXNjaGVkdWxlIHRvIGFsc28gZGVwbG95IHRoZSBkYWlseVxuICogS0VZIFJPVEFUSU9OIHN0YWNrIChhIExhbWJkYSB0aGF0IHJlcGxhY2VzIHRoZSBrZXkgYmVmb3JlIGl0IGV4cGlyZXMpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBiYXNoXG4gKiBQTEFURk9STV9QQVNTV09SRD0qKiogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXJlZ2lvbiB1cy1lYXN0LTFcbiAqIFBMQVRGT1JNX1BBU1NXT1JEPSoqKiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tZGF5cyA5MCAtLXJlZ2lvbiB1cy1lYXN0LTFcbiAqIFBMQVRGT1JNX1BBU1NXT1JEPSoqKiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tc2NoZWR1bGUgLS1yZWdpb24gdXMtZWFzdC0xICAgICAjICsgZGFpbHkgcm90YXRpb25cbiAqIFBMQVRGT1JNX1BBU1NXT1JEPSoqKiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tc2NvcGUgcmVwb3J0aW5nOmluZ2VzdCAtLXNjaGVkdWxlXG4gKiBQTEFURk9STV9QQVNTV09SRD0qKiogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXNjb3BlIHJlZ2lzdHJ5OnB1c2ggLS1zY2hlZHVsZVxuICogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLWRyeS1ydW5cbiAqIHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW4gLXUgYWRtaW4gLXAgJyoqKicgLS1yZWdpb24gdXMtZWFzdC0xXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlVG9rZW4ocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICB3aXRoU3NsT3B0aW9ucyhcbiAgICB3aXRoUHJvZmlsZU9wdGlvbihcbiAgICAgIHdpdGhSZWdpb25PcHRpb24ocHJvZ3JhbVxuICAgICAgICAuY29tbWFuZCgnc3RvcmUtdG9rZW4nKVxuICAgICAgICAuZGVzY3JpcHRpb24oJ1Byb3Zpc2lvbiBhbiBvcmcgc2VydmljZS1hY2NvdW50IGtleSAoaXRzIG93biBtYWNoaW5lIGlkZW50aXR5KSBhbmQgc3RvcmUgaXQgaW4gQVdTIFNlY3JldHMgTWFuYWdlciBmb3IgQ0RLIGRlcGxveW1lbnRzJylcbiAgICAgICAgLm9wdGlvbignLXUsIC0taWRlbnRpZmllciA8aWRlbnRpZmllcj4nLCAnVXNlcm5hbWUgb3IgZW1haWwgKHNraXBzIFBMQVRGT1JNX1RPS0VOIHJlcXVpcmVtZW50KScpXG4gICAgICAgIC5vcHRpb24oJy1wLCAtLXBhc3N3b3JkIDxwYXNzd29yZD4nLCAnTG9naW4gcGFzc3dvcmQg4oCUIGFsc28gdXNlZCBmb3IgdGhlIHN0ZXAtdXAgZXZlcnkga2V5IHdyaXRlIHJlcXVpcmVzIChwcmVmZXIgUExBVEZPUk1fUEFTU1dPUkQpJylcbiAgICAgICAgLm9wdGlvbignLS1kYXlzIDxkYXlzPicsICdLZXkgbGlmZXRpbWUgaW4gZGF5cyAobWF4IDM2NSknLCAnMzAnKVxuICAgICAgICAub3B0aW9uKCctLXNjb3BlIDxzY29wZT4nLCBgUHJvdmlzaW9uIGEgbGVhc3QtcHJpdmlsZWdlIHNjb3BlZCBrZXkgaW5zdGVhZCBvZiB0aGUgZnVsbC1wcml2aWxlZ2UgcGxhdGZvcm0gb25lLiBPbmUgb2Y6ICR7T2JqZWN0LmtleXMoU0NPUEVfQ0FUQUxPRykuam9pbignLCAnKX1gKVxuICAgICAgICAub3B0aW9uKCctLWFjY291bnQgPG5hbWU+JywgJ092ZXJyaWRlIHRoZSBzZXJ2aWNlLWFjY291bnQgbmFtZSB0aGlzIGtleSBpcyBpc3N1ZWQgb24gKGRlZmF1bHQ6IGRlcml2ZWQgZnJvbSAtLXNjb3BlKScpXG4gICAgICAgIC5vcHRpb24oJy0tZHJ5LXJ1bicsICdTaG93IHdoYXQgd291bGQgYmUgcHJvdmlzaW9uZWQgd2l0aG91dCBjYWxsaW5nIHRoZSBwbGF0Zm9ybSBvciB3cml0aW5nIHRvIFNlY3JldHMgTWFuYWdlcicsIGZhbHNlKSksXG4gICAgKVxuICAgICAgLm9wdGlvbignLS1zY2hlZHVsZScsICdBbHNvIGRlcGxveSB0aGUgZGFpbHkga2V5LXJvdGF0aW9uIHN0YWNrIHRoYXQgcmVwbGFjZXMgdGhpcyBrZXkgYmVmb3JlIGl0IGV4cGlyZXMgKG9mZiBieSBkZWZhdWx0KScsIGZhbHNlKVxuICAgICAgLm9wdGlvbignLS1jcm9uIDxleHByPicsICdSb3RhdGlvbiBzY2hlZHVsZSBhcyBhIDUtZmllbGQgY3JvbiwgdXNlZCB3aXRoIC0tc2NoZWR1bGUgKGRlZmF1bHQ6IFRPS0VOX1JFTkVXX1NDSEVEVUxFIGVudiBvciBcIjAgMCAqICogKlwiOyBtaW4gZXZlcnkgMTUgbWludXRlcyknKVxuICAgICAgLm9wdGlvbignLS1qc29uJywgJ091dHB1dCByZXN1bHQgYXMgSlNPTicsIGZhbHNlKSxcbiAgKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gcHJpbnRDb21tYW5kSGVhZGVyKCdTdG9yZSBUb2tlbicsIHVuZGVmaW5lZCwgeyBxdWlldDogb3B0aW9ucy5qc29uIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBwcmludFNzbFdhcm5pbmcob3B0aW9ucy52ZXJpZnlTc2wpO1xuXG4gICAgICAgIGNvbnN0IHJlZ2lvbiA9IHJlc29sdmVBd3NSZWdpb24ob3B0aW9ucy5yZWdpb24pO1xuICAgICAgICBjb25zdCBhd3MgPSB7IHJlZ2lvbiwgcHJvZmlsZTogb3B0aW9ucy5wcm9maWxlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCB9O1xuXG4gICAgICAgIGNvbnN0IGRheXMgPSB2YWxpZGF0ZU51bWJlcihvcHRpb25zLmRheXMsICdkYXlzJywgMSwgMzY1KTtcbiAgICAgICAgY29uc3QgZXhwaXJlc0luU2Vjb25kcyA9IGRheXMgKiAyNCAqIDYwICogNjA7XG5cbiAgICAgICAgY29uc3Qgc2NvcGUgPSBvcHRpb25zLnNjb3BlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgY2F0YWxvZ3VlZCA9IHNjb3BlID8gU0NPUEVfQ0FUQUxPR1tzY29wZV0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChzY29wZSAmJiAhY2F0YWxvZ3VlZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biAtLXNjb3BlIFwiJHtzY29wZX1cIi4gU3VwcG9ydGVkOiAke09iamVjdC5rZXlzKFNDT1BFX0NBVEFMT0cpLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hpY2ggbWFjaGluZSBpZGVudGl0eSB0aGlzIGNyZWRlbnRpYWwgYmVsb25ncyB0bzogdGhlIHNjb3BlJ3Mgb3duXG4gICAgICAgIC8vIGFjY291bnQsIG9yIHRoZSBvcmcncyBzaW5nbGUgZnVsbC1wcml2aWxlZ2UgYXV0b21hdGlvbiBhY2NvdW50LlxuICAgICAgICBjb25zdCBpZGVudGl0eSA9IGNhdGFsb2d1ZWQgPz8gUExBVEZPUk1fQUNDT1VOVDtcbiAgICAgICAgY29uc3QgYWNjb3VudE5hbWUgPSAob3B0aW9ucy5hY2NvdW50IGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gaWRlbnRpdHkuYWNjb3VudDtcblxuICAgICAgICAvLyBTdGVwIDA6IGxvZyBpbiBmaXJzdCB3aGVuIGNyZWRzIGFyZSBhdmFpbGFibGUgYW5kIG5vIFBMQVRGT1JNX1RPS0VOIGlzXG4gICAgICAgIC8vIHNldCAoc2hhcmVkIHdpdGggc2V0dXAtZXZlbnRzKS4gQ3JlZHMgY29tZSBmcm9tIC0taWRlbnRpZmllci8tLXBhc3N3b3JkXG4gICAgICAgIC8vIE9SIHRoZSBlbnYgdmFycyBQTEFURk9STV9JREVOVElGSUVSL1BMQVRGT1JNX1BBU1NXT1JEIOKAlCB0aGUgZW52IHBhdGhcbiAgICAgICAgLy8gbGV0cyBjYWxsZXJzIGxpa2UgYHByb3Zpc2lvbiAtLXdpdGgtZXZlbnRzYCBwYXNzIHRoZW0gd2l0aG91dCBwdXR0aW5nXG4gICAgICAgIC8vIHRoZSBwYXNzd29yZCBvbiB0aGUgY29tbWFuZCBsaW5lICh3aGVyZSBpdCB3b3VsZCBzaG93IGluIHBsYW5zL2xvZ3MpLlxuICAgICAgICBhd2FpdCBlbnN1cmVQbGF0Zm9ybVRva2VuKG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFRoZSBwYXNzd29yZCBpcyBBTFNPIHRoZSBzdGVwLXVwIGZhY3RvciBmb3IgYm90aCB3cml0ZXMgYmVsb3csIHNvIGl0IGlzXG4gICAgICAgIC8vIHJlcXVpcmVkIGV2ZW4gd2hlbiBQTEFURk9STV9UT0tFTiBpcyBhbHJlYWR5IHNldC4gU2F5IHRoYXQgcGxhaW5seVxuICAgICAgICAvLyByYXRoZXIgdGhhbiBmYWlsaW5nIHRocmVlIGNhbGxzIGxhdGVyIHdpdGggYSA0MDMuXG4gICAgICAgIGNvbnN0IHBhc3N3b3JkID0gKG9wdGlvbnMucGFzc3dvcmQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSB8fCBwcm9jZXNzLmVudi5QTEFURk9STV9QQVNTV09SRDtcbiAgICAgICAgaWYgKCFwYXNzd29yZCAmJiAhb3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnQSBwYXNzd29yZCBpcyByZXF1aXJlZDogY3JlYXRpbmcgYSBzZXJ2aWNlIGFjY291bnQgYW5kIGlzc3VpbmcgaXRzIGtleSBhcmUgYm90aCBzdGVwLXVwIGdhdGVkLiAnXG4gICAgICAgICAgICArICdTZXQgUExBVEZPUk1fUEFTU1dPUkQgKHByZWZlcnJlZCkgb3IgcGFzcyAtLXBhc3N3b3JkLicsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50U2VjdGlvbignUHJvdmlzaW9uIFNlcnZpY2UtQWNjb3VudCBLZXknKTtcblxuICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50QXN5bmMob3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgICAgLy8gRHJ5IHJ1biBzdGF5cyBlbnRpcmVseSBPRkZMSU5FIOKAlCBpdCBtdXN0IG5vdCBjcmVhdGUgYW4gYWNjb3VudCBvclxuICAgICAgICAgIC8vIGJ1cm4gYSBrZXkganVzdCB0byBzaG93IHdoYXQgaXQgd291bGQgZG8uXG4gICAgICAgICAgcHJpbnREcnlSdW5QbGFuKHtcbiAgICAgICAgICAgIHNlcnZpY2VBY2NvdW50OiBhY2NvdW50TmFtZSxcbiAgICAgICAgICAgIHJvbGVzOiBzY29wZSA/ICdub25lIChzY29wZWQsIGxlYXN0IHByaXZpbGVnZSknIDogJ29yZyBhZG1pbicsXG4gICAgICAgICAgICBzY29wZTogc2NvcGUgPz8gJyhub25lIOKAlCBmdWxsIHBsYXRmb3JtIGNyZWRlbnRpYWwpJyxcbiAgICAgICAgICAgIHNlY3JldE5hbWU6IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFQ1JFVF9OQU1FIHx8IGAke3NlY3JldE5hbWVGb3JPcmcoJzxvcmdJZD4nLCBzY29wZSA/IHNjb3BlU2VjcmV0TGVhZihzY29wZSkgOiAncGxhdGZvcm0nKX1gLFxuICAgICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgICAgZXhwaXJlc0luRGF5czogZGF5cyxcbiAgICAgICAgICB9LCAhIW9wdGlvbnMuanNvbik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5TmFtZSA9IGAke2FjY291bnROYW1lfS0ke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCl9YDtcbiAgICAgICAgY29uc3QgcHJvdmlzaW9uZWQgPSBhd2FpdCBwcm92aXNpb25TZXJ2aWNlQWNjb3VudEtleSh7XG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCEsXG4gICAgICAgICAgYWNjb3VudE5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGlkZW50aXR5LmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHJvbGVzOiBzY29wZSA/ICdub25lJyA6ICdhZG1pbicsXG4gICAgICAgICAgLi4uKHNjb3BlID8geyBzY29wZSB9IDoge30pLFxuICAgICAgICAgIGV4cGlyZXNJblNlY29uZHMsXG4gICAgICAgICAga2V5TmFtZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJpbnRTdWNjZXNzKGBLZXkgaXNzdWVkIG9uIHNlcnZpY2UgYWNjb3VudCAnJHthY2NvdW50TmFtZX0nIChleHBpcmVzICR7cHJvdmlzaW9uZWQuZXhwaXJlc0F0fSlgKTtcblxuICAgICAgICAvLyBBbiBleHBsaWNpdCBQTEFURk9STV9TRUNSRVRfTkFNRSBzdGlsbCB3aW5zICh0aGUgZXNjYXBlIGhhdGNoIGZvclxuICAgICAgICAvLyBoYW5kLW1hbmFnZWQgcGF0aHMpOyBvdGhlcndpc2UgZGVyaXZlIGl0IGZyb20gdGhlIG9yZyB0aGUgcGxhdGZvcm1cbiAgICAgICAgLy8gcmVwb3J0ZWQsIHdoaWNoIHdvcmtzIHdpdGggYW4gb3BhcXVlIGFjY2VzcyBrZXkgYXMgUExBVEZPUk1fVE9LRU4g4oCUXG4gICAgICAgIC8vIGEga2V5IGNhcnJpZXMgbm8gb3JnIGNsYWltIHRvIGRlY29kZS5cbiAgICAgICAgY29uc3Qgc2VjcmV0TmFtZSA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFQ1JFVF9OQU1FXG4gICAgICAgICAgfHwgc2VjcmV0TmFtZUZvck9yZyhwcm92aXNpb25lZC5vcmdhbml6YXRpb25JZCwgc2NvcGUgPyBzY29wZVNlY3JldExlYWYoc2NvcGUpIDogJ3BsYXRmb3JtJyk7XG5cbiAgICAgICAgYXVkaXRMb2coJ3N0b3JlLXRva2VuJywge1xuICAgICAgICAgIGV4ZWN1dGlvbklkLFxuICAgICAgICAgIHNlY3JldE5hbWUsXG4gICAgICAgICAgZGF5cyxcbiAgICAgICAgICBzZXJ2aWNlQWNjb3VudDogYWNjb3VudE5hbWUsXG4gICAgICAgICAgc2NvcGU6IHNjb3BlID8/IG51bGwsXG4gICAgICAgICAga2V5SWQ6IHByb3Zpc2lvbmVkLmtleUlkLFxuICAgICAgICB9KTtcblxuICAgICAgICBwcmludEluZm8oJ1BhcmFtZXRlcnMnLCB7XG4gICAgICAgICAgc2VjcmV0TmFtZSxcbiAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgc2VydmljZUFjY291bnQ6IGFjY291bnROYW1lLFxuICAgICAgICAgIHNjb3BlOiBzY29wZSA/PyAnKG5vbmUpJyxcbiAgICAgICAgICBkYXlzLFxuICAgICAgICAgIGV4cGlyZXNJbjogYCR7ZXhwaXJlc0luU2Vjb25kc31zYCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gV2hhdCB0aGlzIHJ1biBpcyBSRVBMQUNJTkcsIHJlYWQgYmVmb3JlIHRoZSB3cml0ZSBzbyB0aGUgb2xkIGtleSBjYW4gYmVcbiAgICAgICAgLy8gcmV0aXJlZCBhZnRlciB0aGUgbmV3IG9uZSBpcyBzYWZlbHkgc3RvcmVkLlxuICAgICAgICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHByZXZpb3VzS2V5SWQoc2VjcmV0TmFtZSwgYXdzKTtcblxuICAgICAgICBjb25zdCBzZWNyZXRWYWx1ZSA9IGJ1aWxkU2VjcmV0VmFsdWUocHJvdmlzaW9uZWQsIGNsaWVudC5nZXRCYXNlVXJsKCksIGV4cGlyZXNJblNlY29uZHMpO1xuXG4gICAgICAgIHByaW50U2VjdGlvbignU3RvcmUgS2V5Jyk7XG5cbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBgUGlwZWxpbmUgQnVpbGRlciBzZXJ2aWNlLWFjY291bnQga2V5ICgke2FjY291bnROYW1lfTsgcmVuZXcgYnkgJHtwcm92aXNpb25lZC5leHBpcmVzQXR9KWA7XG4gICAgICAgIGF3YWl0IHVwc2VydFNlY3JldChzZWNyZXROYW1lLCBzZWNyZXRWYWx1ZSwgZGVzY3JpcHRpb24sIGF3cyk7XG5cbiAgICAgICAgY29uc3QgYXJuID0gYXdhaXQgZ2V0U2VjcmV0QXJuKHNlY3JldE5hbWUsIGF3cyk7XG5cbiAgICAgICAgYXdhaXQgcmV0aXJlUHJldmlvdXNLZXkoY2xpZW50LCBwYXNzd29yZCEsIHByb3Zpc2lvbmVkLCBwcmV2aW91cyk7XG5cbiAgICAgICAgLy8gT3B0aW9uYWxseSBpbnN0YWxsIHRoZSBvbmNlLWEtZGF5IHJvdGF0aW9uIHN0YWNrIHNvIHRoaXMga2V5IG5ldmVyIGxhcHNlcy5cbiAgICAgICAgbGV0IHNjaGVkdWxlRXhwcmVzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAob3B0aW9ucy5zY2hlZHVsZSkge1xuICAgICAgICAgIGNvbnN0IGZpdmVGaWVsZENyb24gPSBvcHRpb25zLmNyb24gfHwgcHJvY2Vzcy5lbnYuVE9LRU5fUkVORVdfU0NIRURVTEUgfHwgREVGQVVMVF9SRU5FV19DUk9OO1xuICAgICAgICAgIHNjaGVkdWxlRXhwcmVzc2lvbiA9IGF3YWl0IGRlcGxveVJlbmV3U2NoZWR1bGUoe1xuICAgICAgICAgICAgc2VjcmV0TmFtZSxcbiAgICAgICAgICAgIGRheXMsXG4gICAgICAgICAgICBmaXZlRmllbGRDcm9uLFxuICAgICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgICAgcHJvZmlsZTogb3B0aW9ucy5wcm9maWxlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpbnRTdG9yZWRLZXkoe1xuICAgICAgICAgIGpzb246ICEhb3B0aW9ucy5qc29uLFxuICAgICAgICAgIHNlY3JldE5hbWUsXG4gICAgICAgICAgYXJuLFxuICAgICAgICAgIHJlZ2lvbixcbiAgICAgICAgICBhY2NvdW50TmFtZSxcbiAgICAgICAgICBwcm92aXNpb25lZCxcbiAgICAgICAgICBkYXlzLFxuICAgICAgICAgIHNjaGVkdWxlRXhwcmVzc2lvbixcbiAgICAgICAgfSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5BUElfUkVRVUVTVCwge1xuICAgICAgICAgIGRlYnVnOiBwcm9ncmFtLm9wdHMoKS5kZWJ1ZyxcbiAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgIGNvbW1hbmQ6ICdzdG9yZS10b2tlbicsXG4gICAgICAgICAgICBleGVjdXRpb25JZCxcbiAgICAgICAgICAgIHNlY3JldE5hbWU6IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFQ1JFVF9OQU1FIHx8ICcoZGVyaXZlZCBmcm9tIHRoZSBvcmcpJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
|
|
437
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtdG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc3RvcmUtdG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXBHLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV6RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNySyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRCxPQUFP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QWtCLENBQUM7Z0JBQzdGLGtCQUFrQixHQUFHLE1BQU0sbUJBQW1CLENBQUM7b0JBQzdDLFVBQVU7b0JBQ1YsSUFBSTtvQkFDSixhQUFhO29CQUNiLE1BQU07b0JBQ04sT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2lCQUN6QixDQUFDLENBQUM7WUFDTCxDQUFDO1lBRUQsY0FBYyxDQUFDO2dCQUNiLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUk7Z0JBQ3BCLFVBQVU7Z0JBQ1YsR0FBRztnQkFDSCxNQUFNO2dCQUNOLFdBQVc7Z0JBQ1gsV0FBVztnQkFDWCxJQUFJO2dCQUNKLGtCQUFrQjthQUNuQixDQUFDLENBQUM7UUFFTCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLFdBQVcsRUFBRTtnQkFDMUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLO2dCQUMzQixJQUFJLEVBQUUsSUFBSTtnQkFDVixPQUFPLEVBQUU7b0JBQ1AsT0FBTyxFQUFFLGFBQWE7b0JBQ3RCLFdBQVc7b0JBQ1gsVUFBVSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLElBQUksd0JBQXdCO2lCQUN6RTthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBMYW1iZGFDbGllbnQsIFVwZGF0ZUZ1bmN0aW9uQ29kZUNvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtbGFtYmRhJztcbmltcG9ydCB7IEFVVE9NQVRJT05fQUNDT1VOVF9CVU5ETEVTLCBlcnJvck1lc3NhZ2UsIFNFRURfQlVORExFUyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgU2VlZEJ1bmRsZUlkLCBUb2tlblNjb3BlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgUElQRUxJTkVfUkVHSVNUUkFUSU9OX0NBUEFCSUxJVFkgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgQVBQX1ZFUlNJT04sIHZhbGlkYXRlTnVtYmVyIH0gZnJvbSAnLi4vY29uZmlnL2NsaS5jb25zdGFudHMuanMnO1xuaW1wb3J0IHR5cGUgeyBBcGlDbGllbnQgfSBmcm9tICcuLi91dGlscy9hcGktY2xpZW50LmpzJztcbmltcG9ydCB7IGF1ZGl0TG9nIH0gZnJvbSAnLi4vdXRpbHMvYXVkaXQtbG9nLmpzJztcbmltcG9ydCB7IHJlc29sdmVBd3NSZWdpb24gfSBmcm9tICcuLi91dGlscy9hd3MtZW52LmpzJztcbmltcG9ydCB7IHVwc2VydFNlY3JldCwgZ2V0U2VjcmV0QXJuLCBnZXRTZWNyZXRWYWx1ZSB9IGZyb20gJy4uL3V0aWxzL2F3cy1zZWNyZXRzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnRBc3luYywgcHJpbnRDb21tYW5kSGVhZGVyLCBwcmludFNzbFdhcm5pbmcsIHdpdGhQcm9maWxlT3B0aW9uLCB3aXRoUmVnaW9uT3B0aW9uLCB3aXRoU3NsT3B0aW9ucyB9IGZyb20gJy4uL3V0aWxzL2NvbW1hbmQtdXRpbHMuanMnO1xuaW1wb3J0IHsgdG9FdmVudEJyaWRnZUNyb24gfSBmcm9tICcuLi91dGlscy9jcm9uLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRJbmZvLCBwcmludEtleVZhbHVlLCBwcmludFNlY3Rpb24sIHByaW50U3VjY2VzcywgcHJpbnRXYXJuaW5nIH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LXV0aWxzLmpzJztcbmltcG9ydCB7IGVuc3VyZVBsYXRmb3JtVG9rZW4sIHNjb3BlU2VjcmV0TGVhZiwgc2VjcmV0TmFtZUZvck9yZyB9IGZyb20gJy4uL3V0aWxzL3BsYXRmb3JtLXNlY3JldC5qcyc7XG5pbXBvcnQgeyBwcm92aXNpb25TZXJ2aWNlQWNjb3VudEtleSwgcmV2b2tlU2VydmljZUFjY291bnRLZXksIHR5cGUgUHJvdmlzaW9uZWRLZXkgfSBmcm9tICcuLi91dGlscy9zZXJ2aWNlLWFjY291bnQuanMnO1xuXG4vLyBFU00gaGFzIG5vIF9fZGlybmFtZTsgZGVyaXZlIGl0IGZyb20gdGhpcyBtb2R1bGUncyBVUkwuXG5jb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxuY29uc3QgUkVORVdfU1RBQ0tfTkFNRSA9ICdwaXBlbGluZS1idWlsZGVyLXRva2VuLXJlbmV3Jztcbi8vIENGTi1tYW5hZ2VkIExhbWJkYSBmdW5jdGlvbiBuYW1lIOKAlCBrZWVwIGluIHN5bmMgd2l0aCB0b2tlbi1yZW5ldy1zdGFjay5qc29uLlxuY29uc3QgUkVORVdfTEFNQkRBX05BTUUgPSAncGlwZWxpbmUtYnVpbGRlci10b2tlbi1yZW5ldyc7XG4vLyBEZWZhdWx0IDUtZmllbGQgY3JvbiAoZGFpbHkgYXQgbWlkbmlnaHQpIHdoZW4gbmVpdGhlciAtLWNyb24gbm9yIFRPS0VOX1JFTkVXX1NDSEVEVUxFIGlzIHNldC5cbmNvbnN0IERFRkFVTFRfUkVORVdfQ1JPTiA9ICcwIDAgKiAqIConO1xuXG4vKiogT25lIGxlYXN0LXByaXZpbGVnZSBtYWNoaW5lIGlkZW50aXR5IGBzdG9yZS10b2tlbmAgY2FuIHByb3Zpc2lvbi4gKi9cbmludGVyZmFjZSBDYXRhbG9nRW50cnkge1xuICAvKiogVGhlIHNlcnZpY2UgYWNjb3VudCB0aGUga2V5IGlzIGlzc3VlZCBvbi4gKi9cbiAgYWNjb3VudDoga2V5b2YgdHlwZW9mIEFVVE9NQVRJT05fQUNDT1VOVF9CVU5ETEVTO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogQSBjYXBhYmlsaXR5IFNDT1BFIHN0YW1wZWQgb24gdGhlIEtFWTogdGhlIGV4Y2hhbmdlZCB0b2tlbiBjYXJyaWVzIHRoaXMgb25lXG4gICAqIHNjb3BlIGFuZCBubyBwZXJtaXNzaW9ucyBhdCBhbGwsIHNvIHRoZSBhY2NvdW50IG5lZWRzIG5vIFJvbGUuXG4gICAqL1xuICBrZXlTY29wZT86IFRva2VuU2NvcGU7XG59XG5cbi8qKlxuICogVGhlIGxlYXN0LXByaXZpbGVnZSBjcmVkZW50aWFscyBgLS1zY29wZWAgc2VsZWN0cywgYW5kIHdoYXQgZWFjaCBvbmUgaXMgRk9SLlxuICpcbiAqIFR3byBzaGFwZXMsIG9uZSBmbGFnOlxuICogIC0gYSBLRVkgc2NvcGUgKGByZXBvcnRpbmc6aW5nZXN0YCwgYHJlZ2lzdHJ5OnB1c2hgKTogdGhlIGtleSBleGNoYW5nZXMgdG8gYVxuICogICAgdG9rZW4gY2Fycnlpbmcgb25seSB0aGF0IHNjb3BlIOKAlCBubyBwZXJtaXNzaW9ucywgbm8gYWRtaW4gZmxhZ3Mg4oCUIGZvciBhXG4gKiAgICByb3V0ZSB0aGF0IGNoZWNrcyB0aGUgc2NvcGUgaXRzZWxmO1xuICogIC0gYSBDQVBBQklMSVRZIChgcGlwZWxpbmVfcmVnaXN0cnk6d3JpdGVgKTogYW4gb3JkaW5hcnkgcGVybWlzc2lvbiwgc28gdGhlIGtleVxuICogICAgaXMgdW5zY29wZWQgYW5kIGl0cyBhY2NvdW50IGhvbGRzIHRoZSBvbmUgYnVpbHQtaW4gUm9sZSBjYXJyeWluZyBpdFxuICogICAgKFBpcGVsaW5lIFJlZ2lzdHJhdGlvbikuIFVzZWQgd2hlcmUgdGhlIHJvdXRlIGlzIGdhdGVkIGJ5XG4gKiAgICBgcmVxdWlyZVBlcm1pc3Npb25gLCB3aGljaCBwZW9wbGUgc2F0aXNmeSB0aHJvdWdoIHRoZWlyIG93biBSb2xlcy5cbiAqXG4gKiBXaGljaCBSb2xlIGVhY2ggYWNjb3VudCBob2xkcyBjb21lcyBmcm9tIGFwaS1jb3JlJ3NcbiAqIGBBVVRPTUFUSU9OX0FDQ09VTlRfQlVORExFU2Ag4oCUIHRoZSBzYW1lIHRhYmxlIHRoZSBwbGF0Zm9ybSdzIHN0YXJ0dXAgYmFja2ZpbGxcbiAqIG1vdmVzIGV4aXN0aW5nIGFjY291bnRzIHdpdGguXG4gKi9cbmNvbnN0IFNDT1BFX0NBVEFMT0c6IFJlY29yZDxzdHJpbmcsIENhdGFsb2dFbnRyeT4gPSB7XG4gICdyZXBvcnRpbmc6aW5nZXN0Jzoge1xuICAgIGFjY291bnQ6ICdyZXBvcnRpbmctaW5nZXN0JyxcbiAgICBkZXNjcmlwdGlvbjogJ0FXUyBwaXBlbGluZS1ldmVudCBpbmdlc3Rpb24gYW5kIHN0ZXAgc2VjdXJpdHktcmVwb3J0IHVwbG9hZHMgKHRoZSByZXBvcnRpbmc6aW5nZXN0IHNjb3BlKScsXG4gICAga2V5U2NvcGU6ICdyZXBvcnRpbmc6aW5nZXN0JyxcbiAgfSxcbiAgJ3JlZ2lzdHJ5OnB1c2gnOiB7XG4gICAgYWNjb3VudDogJ3JlZ2lzdHJ5LXB1c2gnLFxuICAgIGRlc2NyaXB0aW9uOiAnQ0kgaW1hZ2UgcHVzaGVzIGFuZCBwdWxscyBpbnRvIHRoaXMgb3Jn4oCZcyByZWdpc3RyeSBuYW1lc3BhY2UgKENvZGVCdWlsZCDihpIgL3Rva2VuKScsXG4gICAga2V5U2NvcGU6ICdyZWdpc3RyeTpwdXNoJyxcbiAgfSxcbiAgW1BJUEVMSU5FX1JFR0lTVFJBVElPTl9DQVBBQklMSVRZXToge1xuICAgIGFjY291bnQ6ICdwaXBlbGluZS1yZWdpc3RlcicsXG4gICAgZGVzY3JpcHRpb246ICdUaGUgQ29kZUJ1aWxkIHN5bnRoIHJlZ2lzdGVyaW5nIGl0cyBzdGVwIG1hbmlmZXN0IChQT1NUL0RFTEVURSAvcGlwZWxpbmVzL3JlZ2lzdHJ5KScsXG4gIH0sXG59O1xuXG4vKipcbiAqIFRoZSBhY2NvdW50IGJlaGluZCB0aGUgZGVmYXVsdCAobm8gYC0tc2NvcGVgKSBjcmVkZW50aWFsOiB0aGUgQ29kZUJ1aWxkIHN5bnRoLFxuICogYHBpcGVsaW5lIGRlcGxveSAtLXN0b3JlLXRva2Vuc2AsIHRoZSBwbHVnaW4tbG9va3VwIExhbWJkYSBhbmQgdGhlIHJ1bi10aW1lXG4gKiB2dWxuZXJhYmlsaXR5IGNoZWNrLiBJdCBob2xkcyB0aGUgUGlwZWxpbmUgQXV0b21hdGlvbiBSb2xlIOKAlCBwaXBlbGluZSBhbmRcbiAqIHBsdWdpbiByZWFkcyDigJQgYW5kIG5vdGhpbmcgbW9yZTsgaXQgaXMgbm8gbG9uZ2VyIGFuIG9yZyBhZG1pbi5cbiAqL1xuY29uc3QgUExBVEZPUk1fQUNDT1VOVDogQ2F0YWxvZ0VudHJ5ID0ge1xuICBhY2NvdW50OiAncGxhdGZvcm0tYXV0b21hdGlvbicsXG4gIGRlc2NyaXB0aW9uOiAnU3RvcmVkIHBsYXRmb3JtIGNyZWRlbnRpYWwgZm9yIENESyBzeW50aC9kZXBsb3ksIHBsdWdpbiBsb29rdXAgYW5kIHRoZSBydW4tdGltZSB2dWxuZXJhYmlsaXR5IGNoZWNrJyxcbn07XG5cbi8qKiBUaGUgYnVpbHQtaW4gUm9sZSAoc2VlZCBidW5kbGUpIGEgTkVXIGFjY291bnQgZm9yIGBlbnRyeWAgaXMgZ3JhbnRlZCwgaWYgYW55LiAqL1xuZnVuY3Rpb24gcm9sZUZvcihlbnRyeTogQ2F0YWxvZ0VudHJ5KTogU2VlZEJ1bmRsZUlkIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIEFVVE9NQVRJT05fQUNDT1VOVF9CVU5ETEVTW2VudHJ5LmFjY291bnRdID8/IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBEZXBsb3kgKG9yIHVwZGF0ZSkgdGhlIG9uY2UtYS1kYXkgS0VZIFJPVEFUSU9OIHN0YWNrOiBhIHNjaGVkdWxlZCBMYW1iZGEgdGhhdFxuICogcmVwbGFjZXMgdGhlIHNlcnZpY2UtYWNjb3VudCBrZXkgaW4gdGhpcyBzZWNyZXQgYmVmb3JlIGl0IGV4cGlyZXMuIE1pcnJvcnNcbiAqIHNldHVwLWV2ZW50cyDigJQgYGF3cyBjbG91ZGZvcm1hdGlvbiBkZXBsb3lgIGZvciB0aGUgaW5mcmEsIHRoZW4gYSBkaXJlY3RcbiAqIFVwZGF0ZUZ1bmN0aW9uQ29kZSB3aXRoIHRoZSByb3RhdG9yIGhhbmRsZXIgY29tcGlsZWQgYWxvbmdzaWRlIHRoaXMgQ0xJIChzZWVcbiAqIHNyYy9sYW1iZGEvdG9rZW4tcmVuZXctaGFuZGxlci50cykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlcGxveVJlbmV3U2NoZWR1bGUob3B0czoge1xuICBzZWNyZXROYW1lOiBzdHJpbmc7XG4gIGRheXM6IG51bWJlcjtcbiAgZml2ZUZpZWxkQ3Jvbjogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgcHJvZmlsZT86IHN0cmluZztcbn0pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBzY2hlZHVsZUV4cHJlc3Npb24gPSB0b0V2ZW50QnJpZGdlQ3JvbihvcHRzLmZpdmVGaWVsZENyb24pOyAvLyB2YWxpZGF0ZXMgKyAxNS1taW4gZ3VhcmRcblxuICAvLyBOYW1lIHJlbmV3YWwgcmVzb3VyY2VzIHBlci1zZWNyZXQgc28gYSBzY29wZWQtY3JlZGVudGlhbCBzdGFjayAoZS5nLiB0aGVcbiAgLy8gcmVwb3J0aW5nLWluZ2VzdCBrZXkgdGhlIGV2ZW50IExhbWJkYSByZWFkcykgY29leGlzdHMgd2l0aCB0aGVcbiAgLy8gcGxhdGZvcm0tY3JlZGVudGlhbCBzdGFjayBpbnN0ZWFkIG9mIGNvbGxpZGluZyBvbiB0aGUgKGFjY291bnQtZ2xvYmFsKSBJQU1cbiAgLy8gcm9sZSAvIExhbWJkYSAvIHJ1bGUgbmFtZXMuIFRoZSBwbGF0Zm9ybSBzZWNyZXQga2VlcHMgdGhlIGJhcmUgbmFtZVxuICAvLyAoc3VmZml4ICcnKSBzbyBleGlzdGluZyBkZXBsb3ltZW50cycgc3RhY2sgaXMgdXBkYXRlZCBpbiBwbGFjZSwgbm90XG4gIC8vIGR1cGxpY2F0ZWQ7IGFueSBvdGhlciBzZWNyZXQgYXBwZW5kcyBpdHMgdHJhaWxpbmcgcGF0aCBzZWdtZW50LlxuICBjb25zdCBzZWNyZXRMZWFmID0gb3B0cy5zZWNyZXROYW1lLnJlcGxhY2UoLy4qXFwvLywgJycpOyAvLyAncGxhdGZvcm0nIHwgJ3JlcG9ydGluZy1pbmdlc3QnIHwg4oCmXG4gIGNvbnN0IG5hbWVTdWZmaXggPSBzZWNyZXRMZWFmID09PSAncGxhdGZvcm0nID8gJycgOiBgLSR7c2VjcmV0TGVhZi5yZXBsYWNlKC9bXmEtejAtOV0rL2dpLCAnLScpfWA7XG4gIGNvbnN0IHN0YWNrTmFtZSA9IGAke1JFTkVXX1NUQUNLX05BTUV9JHtuYW1lU3VmZml4fWA7XG4gIGNvbnN0IGxhbWJkYU5hbWUgPSBgJHtSRU5FV19MQU1CREFfTkFNRX0ke25hbWVTdWZmaXh9YDtcblxuICBwcmludFNlY3Rpb24oJ1NjaGVkdWxlIFJvdGF0aW9uJyk7XG4gIHByaW50SW5mbygnUGFyYW1ldGVycycsIHtcbiAgICBzdGFjazogc3RhY2tOYW1lLFxuICAgIHNjaGVkdWxlOiBvcHRzLmZpdmVGaWVsZENyb24sXG4gICAgZXZlbnRicmlkZ2U6IHNjaGVkdWxlRXhwcmVzc2lvbixcbiAgICByZW5ld0RheXM6IG9wdHMuZGF5cyxcbiAgfSk7XG5cbiAgLy8gU3RlcCAxOiBpbmZyYSAoTGFtYmRhIGdldHMgcGxhY2Vob2xkZXIgY29kZSBvbiBmaXJzdCBjcmVhdGUpLlxuICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vdGVtcGxhdGVzL3Rva2VuLXJlbmV3LXN0YWNrLmpzb24nKTtcbiAgY29uc3QgY2ZuQXJncyA9IFtcbiAgICAnY2xvdWRmb3JtYXRpb24nLCAnZGVwbG95JyxcbiAgICAnLS1zdGFjay1uYW1lJywgc3RhY2tOYW1lLFxuICAgICctLXRlbXBsYXRlLWZpbGUnLCB0ZW1wbGF0ZVBhdGgsXG4gICAgJy0tcGFyYW1ldGVyLW92ZXJyaWRlcycsXG4gICAgYFBsYXRmb3JtU2VjcmV0TmFtZT0ke29wdHMuc2VjcmV0TmFtZX1gLFxuICAgIGBSZW5ld0RheXM9JHtvcHRzLmRheXN9YCxcbiAgICBgU2NoZWR1bGVFeHByZXNzaW9uPSR7c2NoZWR1bGVFeHByZXNzaW9ufWAsXG4gICAgYE5hbWVTdWZmaXg9JHtuYW1lU3VmZml4fWAsXG4gICAgLy8gUmVjb3JkZWQgZm9yIHByb3ZlbmFuY2Ugb25seSDigJQgdGhlIHJvdGF0b3IgZG9lcyBub3QgaW5zdGFsbCB0aGUgQ0xJIGF0XG4gICAgLy8gcnVudGltZSAoaXQgc3BlYWtzIHRvIHRoZSBwbGF0Zm9ybSBkaXJlY3RseSksIGJ1dCBrbm93aW5nIHdoaWNoIENMSVxuICAgIC8vIGRlcGxveWVkIGEgc3RhY2sgaXMgd29ydGgga2VlcGluZy5cbiAgICBgUGlwZWxpbmVNYW5hZ2VyVmVyc2lvbj0ke0FQUF9WRVJTSU9OfWAsXG4gICAgJy0tY2FwYWJpbGl0aWVzJywgJ0NBUEFCSUxJVFlfTkFNRURfSUFNJyxcbiAgICAnLS1uby1mYWlsLW9uLWVtcHR5LWNoYW5nZXNldCcsXG4gICAgJy0tcmVnaW9uJywgb3B0cy5yZWdpb24sXG4gIF07XG4gIGlmIChvcHRzLnByb2ZpbGUpIGNmbkFyZ3MucHVzaCgnLS1wcm9maWxlJywgb3B0cy5wcm9maWxlKTtcbiAgZXhlY0ZpbGVTeW5jKCdhd3MnLCBjZm5BcmdzLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG5cbiAgLy8gU3RlcCAyOiB1cGxvYWQgdGhlIHJlYWwgaGFuZGxlci4gSXQncyBFU00sIHNvIHRoZSB6aXAgZW50cnkgbXVzdCBiZSBpbmRleC5tanNcbiAgLy8gKEhhbmRsZXIgc3RheXMgaW5kZXguaGFuZGxlciDigJQgbm9kZWpzMjYueCByZXNvbHZlcyB0aGUgLm1qcyBleHRlbnNpb24pLlxuICBjb25zdCBoYW5kbGVyU3JjID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2xhbWJkYS90b2tlbi1yZW5ldy1oYW5kbGVyLmpzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhoYW5kbGVyU3JjKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVG9rZW4tcmVuZXcgaGFuZGxlciBub3QgZm91bmQgYXQgJHtoYW5kbGVyU3JjfSDigJQgd2FzIHRoZSBwYWNrYWdlIGJ1aWx0P2ApO1xuICB9XG4gIGNvbnN0IHRtcERpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3Rva2VuLXJlbmV3LScpKTtcbiAgdHJ5IHtcbiAgICBmcy5jb3B5RmlsZVN5bmMoaGFuZGxlclNyYywgcGF0aC5qb2luKHRtcERpciwgJ2luZGV4Lm1qcycpKTtcbiAgICBjb25zdCB6aXBQYXRoID0gcGF0aC5qb2luKHRtcERpciwgJ2luZGV4LnppcCcpO1xuICAgIGV4ZWNGaWxlU3luYygnemlwJywgWyctaicsIHppcFBhdGgsICdpbmRleC5tanMnXSwgeyBjd2Q6IHRtcERpciwgc3RkaW86ICdwaXBlJyB9KTtcblxuICAgIGNvbnN0IGxhbWJkYUNsaWVudCA9IG5ldyBMYW1iZGFDbGllbnQoeyByZWdpb246IG9wdHMucmVnaW9uIH0pO1xuICAgIGF3YWl0IGxhbWJkYUNsaWVudC5zZW5kKG5ldyBVcGRhdGVGdW5jdGlvbkNvZGVDb21tYW5kKHtcbiAgICAgIEZ1bmN0aW9uTmFtZTogbGFtYmRhTmFtZSxcbiAgICAgIFppcEZpbGU6IGZzLnJlYWRGaWxlU3luYyh6aXBQYXRoKSxcbiAgICB9KSk7XG4gIH0gZmluYWxseSB7XG4gICAgZnMucm1TeW5jKHRtcERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpbnRTdWNjZXNzKGBSb3RhdGlvbiBzY2hlZHVsZWQgKCR7c2NoZWR1bGVFeHByZXNzaW9ufSlgKTtcbiAgcmV0dXJuIHNjaGVkdWxlRXhwcmVzc2lvbjtcbn1cblxuLyoqIFJlYWQgdGhlIGtleSBpZCBhIHByZXZpb3VzIHJ1biBzdG9yZWQsIHNvIHRoaXMgcnVuIGNhbiByZXRpcmUgaXQuICovXG5hc3luYyBmdW5jdGlvbiBwcmV2aW91c0tleUlkKFxuICBzZWNyZXROYW1lOiBzdHJpbmcsXG4gIGF3czogeyByZWdpb246IHN0cmluZzsgcHJvZmlsZT86IHN0cmluZyB9LFxuKTogUHJvbWlzZTx7IGtleUlkPzogc3RyaW5nOyBzZXJ2aWNlQWNjb3VudElkPzogc3RyaW5nIH0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBhd2FpdCBnZXRTZWNyZXRWYWx1ZShzZWNyZXROYW1lLCBhd3MpO1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyB7IGtleUlkPzogc3RyaW5nOyBzZXJ2aWNlQWNjb3VudElkPzogc3RyaW5nIH07XG4gICAgcmV0dXJuIHsga2V5SWQ6IHBhcnNlZC5rZXlJZCwgc2VydmljZUFjY291bnRJZDogcGFyc2VkLnNlcnZpY2VBY2NvdW50SWQgfTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gc2VjcmV0IHlldCAoZmlyc3QgcnVuKSwgb3Igb25lIHdyaXR0ZW4gYmVmb3JlIHRoZSBzZXJ2aWNlLWFjY291bnRcbiAgICAvLyBjdXRvdmVyIChubyBrZXlJZCkuIEVpdGhlciB3YXkgdGhlcmUgaXMgbm90aGluZyB0aGlzIHJ1biBjYW4gcmV0aXJlLlxuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKiogV2hhdCBhIGRyeSBydW4gcmVwb3J0cyBpdCBXT1VMRCBwcm92aXNpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JlVG9rZW5QbGFuIHtcbiAgc2VydmljZUFjY291bnQ6IHN0cmluZztcbiAgcm9sZXM6IHN0cmluZztcbiAgc2NvcGU6IHN0cmluZztcbiAgc2VjcmV0TmFtZTogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgZXhwaXJlc0luRGF5czogbnVtYmVyO1xufVxuXG4vKiogUHJpbnQgdGhlIGRyeS1ydW4gcGxhbiAoSlNPTiBvciBodW1hbikuIFN0YXlzIGVudGlyZWx5IG9mZmxpbmUuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpbnREcnlSdW5QbGFuKHBsYW46IFN0b3JlVG9rZW5QbGFuLCBqc29uOiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChqc29uKSB7XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBzdWNjZXNzOiB0cnVlLCBkcnlSdW46IHRydWUsIC4uLnBsYW4gfSwgbnVsbCwgMikpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLmxvZygnJyk7XG4gIHByaW50U2VjdGlvbignRHJ5IFJ1biDigJQgTm8gQ2hhbmdlcyBNYWRlJyk7XG4gIHByaW50S2V5VmFsdWUoe1xuICAgICdTZXJ2aWNlIEFjY291bnQnOiBwbGFuLnNlcnZpY2VBY2NvdW50LFxuICAgICdSb2xlcyc6IHBsYW4ucm9sZXMsXG4gICAgJ0tleSBTY29wZSc6IHBsYW4uc2NvcGUsXG4gICAgJ1NlY3JldCBOYW1lJzogcGxhbi5zZWNyZXROYW1lLFxuICAgICdSZWdpb24nOiBwbGFuLnJlZ2lvbixcbiAgICAnRXhwaXJlcyBJbic6IGAke3BsYW4uZXhwaXJlc0luRGF5c30gZGF5c2AsXG4gIH0pO1xuICBwcmludFN1Y2Nlc3MoJ0RyeSBydW4gY29tcGxldGUg4oCUIG5vIGFjY291bnQsIGtleSBvciBzZWNyZXQgd2FzIGNyZWF0ZWQnKTtcbn1cblxuLyoqXG4gKiBUaGUgU2VjcmV0cyBNYW5hZ2VyIHBheWxvYWQ6IGB7IHVzZXJuYW1lOiBvcmdJZCwgcGFzc3dvcmQ6IDxwYl9zYV8ga2V5PiwgLi4ubWV0YWRhdGEgfWAuXG4gKiAtIHVzZXJuYW1lL3Bhc3N3b3JkIHNhdGlzZnkgQ29kZUJ1aWxkJ3MgYHNlY3JldHNNYW5hZ2VyQ3JlZGVudGlhbHNgIChIVFRQXG4gKiAgIEJhc2ljLCBzZW50IHRvIHBpcGVsaW5lLWltYWdlLXJlZ2lzdHJ5J3MgL3Rva2VuIGVuZHBvaW50LCB3aGljaCBleGNoYW5nZXNcbiAqICAgdGhlIG9wYXF1ZSBrZXkgbGlrZSBldmVyeSBvdGhlciBzZXJ2aWNlIGRvZXMpLlxuICogLSBgcGFzc3dvcmRgIGlzIHRoZSBjYW5vbmljYWwgZmllbGQ6IHRoZSBwbHVnaW4tbG9va3VwIExhbWJkYSwgdGhlIGV2ZW50c1xuICogICBMYW1iZGEgYW5kIGAtLXN0b3JlLXRva2Vuc2AgYWxsIHJlYWQgaXQuXG4gKiAtIGtleUlkIC8gc2VydmljZUFjY291bnRJZCBhcmUgd2hhdCB0aGUgcm90YXRpb24gTGFtYmRhIG5lZWRzIHRvIHJldGlyZSB0aGVcbiAqICAga2V5IGl0IHJlcGxhY2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTZWNyZXRWYWx1ZShwcm92aXNpb25lZDogUHJvdmlzaW9uZWRLZXksIHBsYXRmb3JtVXJsOiBzdHJpbmcsIGV4cGlyZXNJblNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgdXNlcm5hbWU6IHByb3Zpc2lvbmVkLm9yZ2FuaXphdGlvbklkLFxuICAgIHBhc3N3b3JkOiBwcm92aXNpb25lZC5rZXksXG4gICAgcGxhdGZvcm1VcmwsXG4gICAgb3JnYW5pemF0aW9uSWQ6IHByb3Zpc2lvbmVkLm9yZ2FuaXphdGlvbklkLFxuICAgIHNlcnZpY2VBY2NvdW50SWQ6IHByb3Zpc2lvbmVkLnNlcnZpY2VBY2NvdW50SWQsXG4gICAgc2VydmljZUFjY291bnROYW1lOiBwcm92aXNpb25lZC5zZXJ2aWNlQWNjb3VudE5hbWUsXG4gICAga2V5SWQ6IHByb3Zpc2lvbmVkLmtleUlkLFxuICAgIHNjb3BlOiBwcm92aXNpb25lZC5zY29wZSxcbiAgICBleHBpcmVzSW46IGV4cGlyZXNJblNlY29uZHMsXG4gICAgZXhwaXJlc0F0OiBwcm92aXNpb25lZC5leHBpcmVzQXQsXG4gICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gIH0pO1xufVxuXG4vKipcbiAqIFJldGlyZSB0aGUgY3JlZGVudGlhbCB0aGlzIHJ1biByZXBsYWNlZCDigJQgQUZURVIgdGhlIG5ldyBvbmUgaXMgc3RvcmVkLCBuZXZlclxuICogYmVmb3JlLiBBIGZhaWx1cmUgaGVyZSBsZWF2ZXMgYSBzdXBlcmZsdW91cyBrZXkgdGhhdCBleHBpcmVzIG9uIGl0cyBvd247XG4gKiBkb2luZyBpdCBpbiB0aGUgb3RoZXIgb3JkZXIgd291bGQgbGVhdmUgdGhlIHNlY3JldCBuYW1pbmcgYSByZXZva2VkIGtleSBpZlxuICogdGhlIHdyaXRlIGZhaWxlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJldGlyZVByZXZpb3VzS2V5KFxuICBjbGllbnQ6IEFwaUNsaWVudCxcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgcHJvdmlzaW9uZWQ6IFByb3Zpc2lvbmVkS2V5LFxuICBwcmV2aW91czogeyBrZXlJZD86IHN0cmluZzsgc2VydmljZUFjY291bnRJZD86IHN0cmluZyB9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghcHJldmlvdXMua2V5SWQgfHwgcHJldmlvdXMuc2VydmljZUFjY291bnRJZCAhPT0gcHJvdmlzaW9uZWQuc2VydmljZUFjY291bnRJZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGF3YWl0IHJldm9rZVNlcnZpY2VBY2NvdW50S2V5KFxuICAgICAgY2xpZW50LCBwYXNzd29yZCwgcHJvdmlzaW9uZWQub3JnYW5pemF0aW9uSWQsIHByb3Zpc2lvbmVkLnNlcnZpY2VBY2NvdW50SWQsIHByZXZpb3VzLmtleUlkLFxuICAgICk7XG4gICAgcHJpbnRTdWNjZXNzKGBSZXRpcmVkIHRoZSBwcmV2aW91cyBrZXkgKCR7cHJldmlvdXMua2V5SWR9KWApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBwcmludFdhcm5pbmcoXG4gICAgICBgU3RvcmVkIHRoZSBuZXcga2V5LCBidXQgY291bGQgbm90IHJldm9rZSB0aGUgcHJldmlvdXMgb25lICgke3ByZXZpb3VzLmtleUlkfSk6IGBcbiAgICAgICsgYCR7ZXJyb3JNZXNzYWdlKGVycil9LiBJdCBleHBpcmVzIG9uIGl0cyBvd247IHJldm9rZSBpdCBmcm9tIGBcbiAgICAgICsgJ1NldHRpbmdzIOKGkiBTZXJ2aWNlIGFjY291bnRzIGlmIHlvdSB3YW50IGl0IGdvbmUgbm93LicsXG4gICAgKTtcbiAgfVxufVxuXG4vKiogUHJpbnQgdGhlIHN0b3JlZCBrZXkncyBzdW1tYXJ5IChKU09OIG9yIGh1bWFuKSBwbHVzIHRoZSBuZXh0IHN0ZXBzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RvcmVkS2V5KHI6IHtcbiAganNvbjogYm9vbGVhbjtcbiAgc2VjcmV0TmFtZTogc3RyaW5nO1xuICBhcm46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIGFjY291bnROYW1lOiBzdHJpbmc7XG4gIHByb3Zpc2lvbmVkOiBQcm92aXNpb25lZEtleTtcbiAgZGF5czogbnVtYmVyO1xuICBzY2hlZHVsZUV4cHJlc3Npb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn0pOiB2b2lkIHtcbiAgY29uc3QgeyBzZWNyZXROYW1lLCBhcm4sIHJlZ2lvbiwgYWNjb3VudE5hbWUsIHByb3Zpc2lvbmVkLCBkYXlzLCBzY2hlZHVsZUV4cHJlc3Npb24gfSA9IHI7XG4gIGlmIChyLmpzb24pIHtcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgc2VjcmV0TmFtZSxcbiAgICAgIHNlY3JldEFybjogYXJuLFxuICAgICAgcmVnaW9uLFxuICAgICAgc2VydmljZUFjY291bnQ6IGFjY291bnROYW1lLFxuICAgICAgc2VydmljZUFjY291bnRJZDogcHJvdmlzaW9uZWQuc2VydmljZUFjY291bnRJZCxcbiAgICAgIGtleUlkOiBwcm92aXNpb25lZC5rZXlJZCxcbiAgICAgIHNjb3BlOiBwcm92aXNpb25lZC5zY29wZSxcbiAgICAgIGV4cGlyZXNJbkRheXM6IGRheXMsXG4gICAgICBleHBpcmVzQXQ6IHByb3Zpc2lvbmVkLmV4cGlyZXNBdCxcbiAgICAgIHNjaGVkdWxlOiBzY2hlZHVsZUV4cHJlc3Npb24gPz8gbnVsbCxcbiAgICB9LCBudWxsLCAyKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coJycpO1xuICAgIHByaW50U2VjdGlvbignS2V5IFN0b3JlZCcpO1xuXG4gICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAnU2VjcmV0IE5hbWUnOiBzZWNyZXROYW1lLFxuICAgICAgJ1NlY3JldCBBUk4nOiBhcm4sXG4gICAgICAnUmVnaW9uJzogcmVnaW9uLFxuICAgICAgJ1NlcnZpY2UgQWNjb3VudCc6IGFjY291bnROYW1lLFxuICAgICAgJ0tleSBTY29wZSc6IHByb3Zpc2lvbmVkLnNjb3BlID8/ICcobm9uZSDigJQgdGhlIGFjY291bnRcXCdzIFJvbGUgaXMgaXRzIGF1dGhvcml0eSknLFxuICAgICAgJ0tleSBJZCc6IHByb3Zpc2lvbmVkLmtleUlkLFxuICAgICAgJ0V4cGlyZXMgSW4nOiBgJHtkYXlzfSBkYXlzYCxcbiAgICAgICdSZW5ldyBCeSc6IHByb3Zpc2lvbmVkLmV4cGlyZXNBdCxcbiAgICAgICdBdXRvLVJvdGF0ZSc6IHNjaGVkdWxlRXhwcmVzc2lvbiA/IGDinJMgJHtzY2hlZHVsZUV4cHJlc3Npb259YCA6ICdvZmYgKHBhc3MgLS1zY2hlZHVsZSB0byBlbmFibGUpJyxcbiAgICAgICdTdGF0dXMnOiAn4pyTIFN0b3JlZCcsXG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgcHJpbnRTdWNjZXNzKCdLZXkgc3RvcmVkLiBUbyB1c2Ugd2l0aCBzeW50aC9kZXBsb3k6Jyk7XG4gICAgcHJpbnRJbmZvKGAgIGV4cG9ydCBQTEFURk9STV9TRUNSRVRfTkFNRT0ke3NlY3JldE5hbWV9YCk7XG4gICAgcHJpbnRJbmZvKCcgIHBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgc3ludGggLS1pZCA8cGlwZWxpbmUtaWQ+IC0tc3RvcmUtdG9rZW5zJyk7XG4gICAgY29uc29sZS5sb2coJycpO1xuICAgIGlmIChzY2hlZHVsZUV4cHJlc3Npb24pIHtcbiAgICAgIHByaW50SW5mbyhgQXV0by1yb3RhdGlvbiBpcyBhY3RpdmUgKCR7c2NoZWR1bGVFeHByZXNzaW9ufSk7IHRoZSBzZWNyZXQgaXMgcmVwbGFjZWQgYmVmb3JlICR7cHJvdmlzaW9uZWQuZXhwaXJlc0F0fS5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJpbnRJbmZvKGBSb3RhdGUgYmVmb3JlICR7cHJvdmlzaW9uZWQuZXhwaXJlc0F0fSB3aXRoOiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tZGF5cyAke2RheXN9YCk7XG4gICAgICBwcmludEluZm8oJyAgKG9yIHBhc3MgLS1zY2hlZHVsZSB0byBpbnN0YWxsIGEgZGFpbHkgYXV0by1yb3RhdGlvbiBzdGFjayknKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGBzdG9yZS10b2tlbmAgY29tbWFuZCB3aXRoIHRoZSBDTEkgcHJvZ3JhbS5cbiAqXG4gKiBQcm92aXNpb25zIHRoZSBvcmcncyBtYWNoaW5lIGlkZW50aXR5IOKAlCBhIFNFUlZJQ0UgQUNDT1VOVCBhbmQgb25lIGBwYl9zYV/igKZgXG4gKiBrZXkg4oCUIGFuZCBzdG9yZXMgdGhlIGtleSBpbiBBV1MgU2VjcmV0cyBNYW5hZ2VyIGZvciBDREsgZGVwbG95bWVudHMsXG4gKiBDb2RlQnVpbGQncyByZWdpc3RyeSBjcmVkZW50aWFscywgdGhlIHBsdWdpbi1sb29rdXAgTGFtYmRhIGFuZCB0aGUgZXZlbnRcbiAqIGluZ2VzdGlvbiBMYW1iZGEuIE5vdGhpbmcgc3RvcmVkIGlzIHRpZWQgdG8gYSBwZXJzb24ncyBzZXNzaW9uIGFueVxuICogbW9yZTogdGhlIGFjY291bnQgb3V0bGl2ZXMgaXRzIGNyZWF0b3IsIHRha2VzIG5vIHNlYXQsIGFuZCBldmVyeSBhdWRpdCByb3cgaXRcbiAqIHByb2R1Y2VzIG5hbWVzIHRoZSBhY2NvdW50LlxuICpcbiAqIEJlY2F1c2UgY3JlYXRpbmcgYW4gYWNjb3VudCBhbmQgaXNzdWluZyBpdHMga2V5IGFyZSBzdGVwLXVwIGdhdGVkLCB0aGlzIG5lZWRzXG4gKiB0aGUgb3BlcmF0b3IncyBwYXNzd29yZCDigJQgYC0tcGFzc3dvcmRgLCBvciB0aGUgYFBMQVRGT1JNX1BBU1NXT1JEYCBlbnYgdmFyXG4gKiAocHJlZmVycmVkOiBpdCBrZWVwcyB0aGUgcGFzc3dvcmQgb3V0IG9mIHNoZWxsIGhpc3RvcnkgYW5kIHBsYW4gb3V0cHV0KS5cbiAqXG4gKiBCeSBkZWZhdWx0IGl0IE9OTFkgd3JpdGVzIHRoZSBzZWNyZXQuIFBhc3MgLS1zY2hlZHVsZSB0byBhbHNvIGRlcGxveSB0aGUgZGFpbHlcbiAqIEtFWSBST1RBVElPTiBzdGFjayAoYSBMYW1iZGEgdGhhdCByZXBsYWNlcyB0aGUga2V5IGJlZm9yZSBpdCBleHBpcmVzKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgYmFzaFxuICogUExBVEZPUk1fUEFTU1dPUkQ9KioqIHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW4gLS1yZWdpb24gdXMtZWFzdC0xXG4gKiBQTEFURk9STV9QQVNTV09SRD0qKiogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLWRheXMgOTAgLS1yZWdpb24gdXMtZWFzdC0xXG4gKiBQTEFURk9STV9QQVNTV09SRD0qKiogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXNjaGVkdWxlIC0tcmVnaW9uIHVzLWVhc3QtMSAgICAgIyArIGRhaWx5IHJvdGF0aW9uXG4gKiBQTEFURk9STV9QQVNTV09SRD0qKiogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXNjb3BlIHJlcG9ydGluZzppbmdlc3QgLS1zY2hlZHVsZVxuICogUExBVEZPUk1fUEFTU1dPUkQ9KioqIHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW4gLS1zY29wZSByZWdpc3RyeTpwdXNoIC0tc2NoZWR1bGVcbiAqIFBMQVRGT1JNX1BBU1NXT1JEPSoqKiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tc2NvcGUgcGlwZWxpbmVfcmVnaXN0cnk6d3JpdGUgLS1zY2hlZHVsZVxuICogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLWRyeS1ydW5cbiAqIHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW4gLXUgYWRtaW4gLXAgJyoqKicgLS1yZWdpb24gdXMtZWFzdC0xXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlVG9rZW4ocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICB3aXRoU3NsT3B0aW9ucyhcbiAgICB3aXRoUHJvZmlsZU9wdGlvbihcbiAgICAgIHdpdGhSZWdpb25PcHRpb24ocHJvZ3JhbVxuICAgICAgICAuY29tbWFuZCgnc3RvcmUtdG9rZW4nKVxuICAgICAgICAuZGVzY3JpcHRpb24oJ1Byb3Zpc2lvbiBhbiBvcmcgc2VydmljZS1hY2NvdW50IGtleSAoaXRzIG93biBtYWNoaW5lIGlkZW50aXR5KSBhbmQgc3RvcmUgaXQgaW4gQVdTIFNlY3JldHMgTWFuYWdlciBmb3IgQ0RLIGRlcGxveW1lbnRzJylcbiAgICAgICAgLm9wdGlvbignLXUsIC0taWRlbnRpZmllciA8aWRlbnRpZmllcj4nLCAnVXNlcm5hbWUgb3IgZW1haWwgKHNraXBzIFBMQVRGT1JNX1RPS0VOIHJlcXVpcmVtZW50KScpXG4gICAgICAgIC5vcHRpb24oJy1wLCAtLXBhc3N3b3JkIDxwYXNzd29yZD4nLCAnTG9naW4gcGFzc3dvcmQg4oCUIGFsc28gdXNlZCBmb3IgdGhlIHN0ZXAtdXAgZXZlcnkga2V5IHdyaXRlIHJlcXVpcmVzIChwcmVmZXIgUExBVEZPUk1fUEFTU1dPUkQpJylcbiAgICAgICAgLm9wdGlvbignLS1kYXlzIDxkYXlzPicsICdLZXkgbGlmZXRpbWUgaW4gZGF5cyAobWF4IDM2NSknLCAnMzAnKVxuICAgICAgICAub3B0aW9uKCctLXNjb3BlIDxzY29wZT4nLCBgUHJvdmlzaW9uIGEgc2luZ2xlLXB1cnBvc2UgY3JlZGVudGlhbCBpbnN0ZWFkIG9mIHRoZSBwbGF0Zm9ybSBvbmUuIE9uZSBvZjogJHtPYmplY3Qua2V5cyhTQ09QRV9DQVRBTE9HKS5qb2luKCcsICcpfWApXG4gICAgICAgIC5vcHRpb24oJy0tYWNjb3VudCA8bmFtZT4nLCAnT3ZlcnJpZGUgdGhlIHNlcnZpY2UtYWNjb3VudCBuYW1lIHRoaXMga2V5IGlzIGlzc3VlZCBvbiAoZGVmYXVsdDogZGVyaXZlZCBmcm9tIC0tc2NvcGUpJylcbiAgICAgICAgLm9wdGlvbignLS1kcnktcnVuJywgJ1Nob3cgd2hhdCB3b3VsZCBiZSBwcm92aXNpb25lZCB3aXRob3V0IGNhbGxpbmcgdGhlIHBsYXRmb3JtIG9yIHdyaXRpbmcgdG8gU2VjcmV0cyBNYW5hZ2VyJywgZmFsc2UpKSxcbiAgICApXG4gICAgICAub3B0aW9uKCctLXNjaGVkdWxlJywgJ0Fsc28gZGVwbG95IHRoZSBkYWlseSBrZXktcm90YXRpb24gc3RhY2sgdGhhdCByZXBsYWNlcyB0aGlzIGtleSBiZWZvcmUgaXQgZXhwaXJlcyAob2ZmIGJ5IGRlZmF1bHQpJywgZmFsc2UpXG4gICAgICAub3B0aW9uKCctLWNyb24gPGV4cHI+JywgJ1JvdGF0aW9uIHNjaGVkdWxlIGFzIGEgNS1maWVsZCBjcm9uLCB1c2VkIHdpdGggLS1zY2hlZHVsZSAoZGVmYXVsdDogVE9LRU5fUkVORVdfU0NIRURVTEUgZW52IG9yIFwiMCAwICogKiAqXCI7IG1pbiBldmVyeSAxNSBtaW51dGVzKScpXG4gICAgICAub3B0aW9uKCctLWpzb24nLCAnT3V0cHV0IHJlc3VsdCBhcyBKU09OJywgZmFsc2UpLFxuICApXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uSWQgPSBwcmludENvbW1hbmRIZWFkZXIoJ1N0b3JlIFRva2VuJywgdW5kZWZpbmVkLCB7IHF1aWV0OiBvcHRpb25zLmpzb24gfSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHByaW50U3NsV2FybmluZyhvcHRpb25zLnZlcmlmeVNzbCk7XG5cbiAgICAgICAgY29uc3QgcmVnaW9uID0gcmVzb2x2ZUF3c1JlZ2lvbihvcHRpb25zLnJlZ2lvbik7XG4gICAgICAgIGNvbnN0IGF3cyA9IHsgcmVnaW9uLCBwcm9maWxlOiBvcHRpb25zLnByb2ZpbGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkIH07XG5cbiAgICAgICAgY29uc3QgZGF5cyA9IHZhbGlkYXRlTnVtYmVyKG9wdGlvbnMuZGF5cywgJ2RheXMnLCAxLCAzNjUpO1xuICAgICAgICBjb25zdCBleHBpcmVzSW5TZWNvbmRzID0gZGF5cyAqIDI0ICogNjAgKiA2MDtcblxuICAgICAgICBjb25zdCBzY29wZSA9IG9wdGlvbnMuc2NvcGUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBjYXRhbG9ndWVkID0gc2NvcGUgPyBTQ09QRV9DQVRBTE9HW3Njb3BlXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHNjb3BlICYmICFjYXRhbG9ndWVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIC0tc2NvcGUgXCIke3Njb3BlfVwiLiBTdXBwb3J0ZWQ6ICR7T2JqZWN0LmtleXMoU0NPUEVfQ0FUQUxPRykuam9pbignLCAnKX1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXaGljaCBtYWNoaW5lIGlkZW50aXR5IHRoaXMgY3JlZGVudGlhbCBiZWxvbmdzIHRvOiB0aGUgc2NvcGUncyBvd25cbiAgICAgICAgLy8gYWNjb3VudCwgb3IgdGhlIG9yZydzIHBsYXRmb3JtIGF1dG9tYXRpb24gYWNjb3VudC5cbiAgICAgICAgY29uc3QgaWRlbnRpdHkgPSBjYXRhbG9ndWVkID8/IFBMQVRGT1JNX0FDQ09VTlQ7XG4gICAgICAgIGNvbnN0IGFjY291bnROYW1lID0gKG9wdGlvbnMuYWNjb3VudCBhcyBzdHJpbmcgfCB1bmRlZmluZWQpID8/IGlkZW50aXR5LmFjY291bnQ7XG4gICAgICAgIGNvbnN0IHJvbGUgPSByb2xlRm9yKGlkZW50aXR5KTtcbiAgICAgICAgY29uc3Qga2V5U2NvcGUgPSBpZGVudGl0eS5rZXlTY29wZTtcblxuICAgICAgICAvLyBTdGVwIDA6IGxvZyBpbiBmaXJzdCB3aGVuIGNyZWRzIGFyZSBhdmFpbGFibGUgYW5kIG5vIFBMQVRGT1JNX1RPS0VOIGlzXG4gICAgICAgIC8vIHNldCAoc2hhcmVkIHdpdGggc2V0dXAtZXZlbnRzKS4gQ3JlZHMgY29tZSBmcm9tIC0taWRlbnRpZmllci8tLXBhc3N3b3JkXG4gICAgICAgIC8vIE9SIHRoZSBlbnYgdmFycyBQTEFURk9STV9JREVOVElGSUVSL1BMQVRGT1JNX1BBU1NXT1JEIOKAlCB0aGUgZW52IHBhdGhcbiAgICAgICAgLy8gbGV0cyBjYWxsZXJzIGxpa2UgYHByb3Zpc2lvbiAtLXdpdGgtZXZlbnRzYCBwYXNzIHRoZW0gd2l0aG91dCBwdXR0aW5nXG4gICAgICAgIC8vIHRoZSBwYXNzd29yZCBvbiB0aGUgY29tbWFuZCBsaW5lICh3aGVyZSBpdCB3b3VsZCBzaG93IGluIHBsYW5zL2xvZ3MpLlxuICAgICAgICBhd2FpdCBlbnN1cmVQbGF0Zm9ybVRva2VuKG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFRoZSBwYXNzd29yZCBpcyBBTFNPIHRoZSBzdGVwLXVwIGZhY3RvciBmb3IgYm90aCB3cml0ZXMgYmVsb3csIHNvIGl0IGlzXG4gICAgICAgIC8vIHJlcXVpcmVkIGV2ZW4gd2hlbiBQTEFURk9STV9UT0tFTiBpcyBhbHJlYWR5IHNldC4gU2F5IHRoYXQgcGxhaW5seVxuICAgICAgICAvLyByYXRoZXIgdGhhbiBmYWlsaW5nIHRocmVlIGNhbGxzIGxhdGVyIHdpdGggYSA0MDMuXG4gICAgICAgIGNvbnN0IHBhc3N3b3JkID0gKG9wdGlvbnMucGFzc3dvcmQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSB8fCBwcm9jZXNzLmVudi5QTEFURk9STV9QQVNTV09SRDtcbiAgICAgICAgaWYgKCFwYXNzd29yZCAmJiAhb3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnQSBwYXNzd29yZCBpcyByZXF1aXJlZDogY3JlYXRpbmcgYSBzZXJ2aWNlIGFjY291bnQgYW5kIGlzc3VpbmcgaXRzIGtleSBhcmUgYm90aCBzdGVwLXVwIGdhdGVkLiAnXG4gICAgICAgICAgICArICdTZXQgUExBVEZPUk1fUEFTU1dPUkQgKHByZWZlcnJlZCkgb3IgcGFzcyAtLXBhc3N3b3JkLicsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50U2VjdGlvbignUHJvdmlzaW9uIFNlcnZpY2UtQWNjb3VudCBLZXknKTtcblxuICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50QXN5bmMob3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgICAgLy8gRHJ5IHJ1biBzdGF5cyBlbnRpcmVseSBPRkZMSU5FIOKAlCBpdCBtdXN0IG5vdCBjcmVhdGUgYW4gYWNjb3VudCBvclxuICAgICAgICAgIC8vIGJ1cm4gYSBrZXkganVzdCB0byBzaG93IHdoYXQgaXQgd291bGQgZG8uXG4gICAgICAgICAgcHJpbnREcnlSdW5QbGFuKHtcbiAgICAgICAgICAgIHNlcnZpY2VBY2NvdW50OiBhY2NvdW50TmFtZSxcbiAgICAgICAgICAgIHJvbGVzOiByb2xlID8gU0VFRF9CVU5ETEVTW3JvbGVdLm5hbWUgOiAnbm9uZSAoc2NvcGVkIGtleSwgbGVhc3QgcHJpdmlsZWdlKScsXG4gICAgICAgICAgICBzY29wZToga2V5U2NvcGUgPz8gJyhub25lIOKAlCB0aGUgYWNjb3VudFxcJ3MgUm9sZSBpcyBpdHMgYXV0aG9yaXR5KScsXG4gICAgICAgICAgICBzZWNyZXROYW1lOiBwcm9jZXNzLmVudi5QTEFURk9STV9TRUNSRVRfTkFNRSB8fCBgJHtzZWNyZXROYW1lRm9yT3JnKCc8b3JnSWQ+Jywgc2NvcGUgPyBzY29wZVNlY3JldExlYWYoc2NvcGUpIDogJ3BsYXRmb3JtJyl9YCxcbiAgICAgICAgICAgIHJlZ2lvbixcbiAgICAgICAgICAgIGV4cGlyZXNJbkRheXM6IGRheXMsXG4gICAgICAgICAgfSwgISFvcHRpb25zLmpzb24pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGtleU5hbWUgPSBgJHthY2NvdW50TmFtZX0tJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApfWA7XG4gICAgICAgIGNvbnN0IHByb3Zpc2lvbmVkID0gYXdhaXQgcHJvdmlzaW9uU2VydmljZUFjY291bnRLZXkoe1xuICAgICAgICAgIGNsaWVudCxcbiAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQhLFxuICAgICAgICAgIGFjY291bnROYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBpZGVudGl0eS5kZXNjcmlwdGlvbixcbiAgICAgICAgICAuLi4ocm9sZSA/IHsgcm9sZSB9IDoge30pLFxuICAgICAgICAgIC4uLihrZXlTY29wZSA/IHsgc2NvcGU6IGtleVNjb3BlIH0gOiB7fSksXG4gICAgICAgICAgZXhwaXJlc0luU2Vjb25kcyxcbiAgICAgICAgICBrZXlOYW1lLFxuICAgICAgICB9KTtcblxuICAgICAgICBwcmludFN1Y2Nlc3MoYEtleSBpc3N1ZWQgb24gc2VydmljZSBhY2NvdW50ICcke2FjY291bnROYW1lfScgKGV4cGlyZXMgJHtwcm92aXNpb25lZC5leHBpcmVzQXR9KWApO1xuXG4gICAgICAgIC8vIEFuIGV4cGxpY2l0IFBMQVRGT1JNX1NFQ1JFVF9OQU1FIHN0aWxsIHdpbnMgKHRoZSBlc2NhcGUgaGF0Y2ggZm9yXG4gICAgICAgIC8vIGhhbmQtbWFuYWdlZCBwYXRocyk7IG90aGVyd2lzZSBkZXJpdmUgaXQgZnJvbSB0aGUgb3JnIHRoZSBwbGF0Zm9ybVxuICAgICAgICAvLyByZXBvcnRlZCwgd2hpY2ggd29ya3Mgd2l0aCBhbiBvcGFxdWUgYWNjZXNzIGtleSBhcyBQTEFURk9STV9UT0tFTiDigJRcbiAgICAgICAgLy8gYSBrZXkgY2FycmllcyBubyBvcmcgY2xhaW0gdG8gZGVjb2RlLlxuICAgICAgICBjb25zdCBzZWNyZXROYW1lID0gcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VDUkVUX05BTUVcbiAgICAgICAgICB8fCBzZWNyZXROYW1lRm9yT3JnKHByb3Zpc2lvbmVkLm9yZ2FuaXphdGlvbklkLCBzY29wZSA/IHNjb3BlU2VjcmV0TGVhZihzY29wZSkgOiAncGxhdGZvcm0nKTtcblxuICAgICAgICBhdWRpdExvZygnc3RvcmUtdG9rZW4nLCB7XG4gICAgICAgICAgZXhlY3V0aW9uSWQsXG4gICAgICAgICAgc2VjcmV0TmFtZSxcbiAgICAgICAgICBkYXlzLFxuICAgICAgICAgIHNlcnZpY2VBY2NvdW50OiBhY2NvdW50TmFtZSxcbiAgICAgICAgICBzY29wZTogc2NvcGUgPz8gbnVsbCxcbiAgICAgICAgICBrZXlJZDogcHJvdmlzaW9uZWQua2V5SWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHByaW50SW5mbygnUGFyYW1ldGVycycsIHtcbiAgICAgICAgICBzZWNyZXROYW1lLFxuICAgICAgICAgIHJlZ2lvbixcbiAgICAgICAgICBzZXJ2aWNlQWNjb3VudDogYWNjb3VudE5hbWUsXG4gICAgICAgICAgc2NvcGU6IHNjb3BlID8/ICcobm9uZSknLFxuICAgICAgICAgIGRheXMsXG4gICAgICAgICAgZXhwaXJlc0luOiBgJHtleHBpcmVzSW5TZWNvbmRzfXNgLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBXaGF0IHRoaXMgcnVuIGlzIFJFUExBQ0lORywgcmVhZCBiZWZvcmUgdGhlIHdyaXRlIHNvIHRoZSBvbGQga2V5IGNhbiBiZVxuICAgICAgICAvLyByZXRpcmVkIGFmdGVyIHRoZSBuZXcgb25lIGlzIHNhZmVseSBzdG9yZWQuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gYXdhaXQgcHJldmlvdXNLZXlJZChzZWNyZXROYW1lLCBhd3MpO1xuXG4gICAgICAgIGNvbnN0IHNlY3JldFZhbHVlID0gYnVpbGRTZWNyZXRWYWx1ZShwcm92aXNpb25lZCwgY2xpZW50LmdldEJhc2VVcmwoKSwgZXhwaXJlc0luU2Vjb25kcyk7XG5cbiAgICAgICAgcHJpbnRTZWN0aW9uKCdTdG9yZSBLZXknKTtcblxuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGBQaXBlbGluZSBCdWlsZGVyIHNlcnZpY2UtYWNjb3VudCBrZXkgKCR7YWNjb3VudE5hbWV9OyByZW5ldyBieSAke3Byb3Zpc2lvbmVkLmV4cGlyZXNBdH0pYDtcbiAgICAgICAgYXdhaXQgdXBzZXJ0U2VjcmV0KHNlY3JldE5hbWUsIHNlY3JldFZhbHVlLCBkZXNjcmlwdGlvbiwgYXdzKTtcblxuICAgICAgICBjb25zdCBhcm4gPSBhd2FpdCBnZXRTZWNyZXRBcm4oc2VjcmV0TmFtZSwgYXdzKTtcblxuICAgICAgICBhd2FpdCByZXRpcmVQcmV2aW91c0tleShjbGllbnQsIHBhc3N3b3JkISwgcHJvdmlzaW9uZWQsIHByZXZpb3VzKTtcblxuICAgICAgICAvLyBPcHRpb25hbGx5IGluc3RhbGwgdGhlIG9uY2UtYS1kYXkgcm90YXRpb24gc3RhY2sgc28gdGhpcyBrZXkgbmV2ZXIgbGFwc2VzLlxuICAgICAgICBsZXQgc2NoZWR1bGVFeHByZXNzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChvcHRpb25zLnNjaGVkdWxlKSB7XG4gICAgICAgICAgY29uc3QgZml2ZUZpZWxkQ3JvbiA9IG9wdGlvbnMuY3JvbiB8fCBwcm9jZXNzLmVudi5UT0tFTl9SRU5FV19TQ0hFRFVMRSB8fCBERUZBVUxUX1JFTkVXX0NST047XG4gICAgICAgICAgc2NoZWR1bGVFeHByZXNzaW9uID0gYXdhaXQgZGVwbG95UmVuZXdTY2hlZHVsZSh7XG4gICAgICAgICAgICBzZWNyZXROYW1lLFxuICAgICAgICAgICAgZGF5cyxcbiAgICAgICAgICAgIGZpdmVGaWVsZENyb24sXG4gICAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgICBwcm9maWxlOiBvcHRpb25zLnByb2ZpbGUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBwcmludFN0b3JlZEtleSh7XG4gICAgICAgICAganNvbjogISFvcHRpb25zLmpzb24sXG4gICAgICAgICAgc2VjcmV0TmFtZSxcbiAgICAgICAgICBhcm4sXG4gICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgIGFjY291bnROYW1lLFxuICAgICAgICAgIHByb3Zpc2lvbmVkLFxuICAgICAgICAgIGRheXMsXG4gICAgICAgICAgc2NoZWR1bGVFeHByZXNzaW9uLFxuICAgICAgICB9KTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkFQSV9SRVFVRVNULCB7XG4gICAgICAgICAgZGVidWc6IHByb2dyYW0ub3B0cygpLmRlYnVnLFxuICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgY29tbWFuZDogJ3N0b3JlLXRva2VuJyxcbiAgICAgICAgICAgIGV4ZWN1dGlvbklkLFxuICAgICAgICAgICAgc2VjcmV0TmFtZTogcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VDUkVUX05BTUUgfHwgJyhkZXJpdmVkIGZyb20gdGhlIG9yZyknLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xufVxuIl19
|
package/dist/commands/synth.d.ts
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* Print the one-line machine-readable failure (`PB_SYNTH_FAILURE {…}`) the
|
|
4
|
+
* events Lambda lifts out of the failed build's log and attaches to the
|
|
5
|
+
* execution event. Only inside CodeBuild — elsewhere a human reads the error.
|
|
6
|
+
*/
|
|
7
|
+
export declare function emitSynthFailure(error: unknown): void;
|
|
2
8
|
/**
|
|
3
9
|
* Registers the `synth` command with the CLI program.
|
|
4
10
|
*
|
|
@@ -12,7 +18,7 @@ import { Command } from 'commander';
|
|
|
12
18
|
*
|
|
13
19
|
* @example
|
|
14
20
|
* ```bash
|
|
15
|
-
* pipeline-manager pipeline synth --id <pipeline-id>
|
|
21
|
+
* pipeline-manager pipeline synth --id <pipeline-id>
|
|
16
22
|
* pipeline-manager pipeline synth --id <pipeline-id> --store-tokens
|
|
17
23
|
* pipeline-manager pipeline synth --quiet --no-notices # CodePipeline (uses env vars)
|
|
18
24
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"synth.d.ts","sourceRoot":"","sources":["../../src/commands/synth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"synth.d.ts","sourceRoot":"","sources":["../../src/commands/synth.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwDpC;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAMrD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6I5C"}
|
package/dist/commands/synth.js
CHANGED
|
@@ -2,14 +2,20 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import { dirname } from 'node:path';
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { errorMessage } from '@pipeline-builder/api-core';
|
|
6
|
+
import { formatSynthFailure, synthFailure } from '@pipeline-builder/pipeline-core';
|
|
5
7
|
import { Command } from 'commander';
|
|
6
8
|
import { assertShellSafe } from '../config/cli.constants.js';
|
|
7
9
|
import { auditLog } from '../utils/audit-log.js';
|
|
8
10
|
import { executeCdkShellCommand, resolveBoilerplatePath } from '../utils/cdk-utils.js';
|
|
9
11
|
import { createAuthenticatedClientAsync, printCommandHeader, printSslWarning, withProfileOption, withRegionOption, withSslOptions } from '../utils/command-utils.js';
|
|
12
|
+
import { registerPipeline } from '../utils/deploy-runner.js';
|
|
10
13
|
import { ERROR_CODES, handleError } from '../utils/error-handler.js';
|
|
11
14
|
import { printInfo, printKeyValue, printSection, printSuccess, printWarning } from '../utils/output-utils.js';
|
|
12
15
|
import { fetchPipelineProps, printResolvedOrExit } from '../utils/pipeline-config.js';
|
|
16
|
+
import { PluginResolutionError, printLookupWarningSummary } from '../utils/plugin-resolver.js';
|
|
17
|
+
import { resolveRegistrationClient } from '../utils/registration-client.js';
|
|
18
|
+
import { setPipelineId } from '../utils/request-context.js';
|
|
13
19
|
import { relaxTlsForCli } from '../utils/tls.js';
|
|
14
20
|
// ESM has no __dirname; derive it from this module's URL.
|
|
15
21
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
@@ -19,7 +25,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
|
19
25
|
*/
|
|
20
26
|
async function fetchPipelineConfig(pipelineId, options) {
|
|
21
27
|
const client = await createAuthenticatedClientAsync(options);
|
|
22
|
-
const { propsWithIds, baseUrl } = await fetchPipelineProps(client, pipelineId);
|
|
28
|
+
const { pipeline, propsWithIds, baseUrl, pluginWarnings } = await fetchPipelineProps(client, pipelineId);
|
|
23
29
|
process.env.PIPELINE_PROPS = Buffer.from(JSON.stringify(propsWithIds)).toString('base64');
|
|
24
30
|
// Propagate the resolved platform base URL into the boilerplate synth (which
|
|
25
31
|
// inherits process.env). The synth uses it for serverConfig.platformUrl (the
|
|
@@ -30,6 +36,24 @@ async function fetchPipelineConfig(pipelineId, options) {
|
|
|
30
36
|
process.env.PLATFORM_BASE_URL = baseUrl;
|
|
31
37
|
}
|
|
32
38
|
printSuccess('Pipeline configuration loaded');
|
|
39
|
+
return { client, pipeline: { ...pipeline, id: pipeline.id || pipelineId }, pluginWarnings };
|
|
40
|
+
}
|
|
41
|
+
/** True inside an AWS CodeBuild build (the self-mutating synth). */
|
|
42
|
+
function inCodeBuild() {
|
|
43
|
+
return !!process.env.CODEBUILD_BUILD_ID;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Print the one-line machine-readable failure (`PB_SYNTH_FAILURE {…}`) the
|
|
47
|
+
* events Lambda lifts out of the failed build's log and attaches to the
|
|
48
|
+
* execution event. Only inside CodeBuild — elsewhere a human reads the error.
|
|
49
|
+
*/
|
|
50
|
+
export function emitSynthFailure(error) {
|
|
51
|
+
if (!inCodeBuild())
|
|
52
|
+
return;
|
|
53
|
+
const failure = error instanceof PluginResolutionError
|
|
54
|
+
? synthFailure(error.message, error.refusals)
|
|
55
|
+
: synthFailure(errorMessage(error));
|
|
56
|
+
console.error(formatSynthFailure(failure));
|
|
33
57
|
}
|
|
34
58
|
/**
|
|
35
59
|
* Registers the `synth` command with the CLI program.
|
|
@@ -44,7 +68,7 @@ async function fetchPipelineConfig(pipelineId, options) {
|
|
|
44
68
|
*
|
|
45
69
|
* @example
|
|
46
70
|
* ```bash
|
|
47
|
-
* pipeline-manager pipeline synth --id <pipeline-id>
|
|
71
|
+
* pipeline-manager pipeline synth --id <pipeline-id>
|
|
48
72
|
* pipeline-manager pipeline synth --id <pipeline-id> --store-tokens
|
|
49
73
|
* pipeline-manager pipeline synth --quiet --no-notices # CodePipeline (uses env vars)
|
|
50
74
|
* ```
|
|
@@ -65,6 +89,9 @@ export function synth(program) {
|
|
|
65
89
|
const executionId = printCommandHeader('CDK Synthesis', undefined, { quiet: options.json });
|
|
66
90
|
try {
|
|
67
91
|
const pipelineId = options.id || process.env.PIPELINE_ID;
|
|
92
|
+
// Every platform call below carries it, so the usage ledger can say which
|
|
93
|
+
// pipeline's synth spent the calls.
|
|
94
|
+
setPipelineId(pipelineId);
|
|
68
95
|
// --show-resolved: preview templates and exit
|
|
69
96
|
if (options.showResolved) {
|
|
70
97
|
await showResolvedPipeline(pipelineId, options);
|
|
@@ -77,9 +104,10 @@ export function synth(program) {
|
|
|
77
104
|
// validation for ALL outbound TLS, including the AWS SDK.
|
|
78
105
|
relaxTlsForCli(options.verifySsl, printWarning);
|
|
79
106
|
// Fetch pipeline config if ID is available and PIPELINE_PROPS not already set
|
|
107
|
+
let fetched;
|
|
80
108
|
if (pipelineId && !process.env.PIPELINE_PROPS) {
|
|
81
109
|
printInfo('Fetching pipeline configuration', { id: pipelineId });
|
|
82
|
-
await fetchPipelineConfig(pipelineId, options);
|
|
110
|
+
fetched = await fetchPipelineConfig(pipelineId, options);
|
|
83
111
|
}
|
|
84
112
|
else if (!pipelineId && !process.env.PIPELINE_PROPS) {
|
|
85
113
|
printWarning('No pipeline ID or PIPELINE_PROPS set');
|
|
@@ -114,6 +142,39 @@ export function synth(program) {
|
|
|
114
142
|
});
|
|
115
143
|
console.log('');
|
|
116
144
|
printSection('Synthesis Complete');
|
|
145
|
+
// A self-mutating pipeline re-synthesizes in CodeBuild on every run and
|
|
146
|
+
// never passes through `pipeline deploy`, so register its step manifest
|
|
147
|
+
// here — otherwise the platform keeps the digests of the LAST manual
|
|
148
|
+
// deploy and its deployed-exposure view goes stale. Best-effort: a
|
|
149
|
+
// failed registration is logged loudly, never fails the synth.
|
|
150
|
+
//
|
|
151
|
+
// Registered with the `pipeline-register` key, NOT the platform key the
|
|
152
|
+
// synth fetched with: that one reads pipelines and plugins only. A
|
|
153
|
+
// missing registration key skips this with a warning (no fallback).
|
|
154
|
+
if (result.success && fetched && inCodeBuild()) {
|
|
155
|
+
const registrationClient = await resolveRegistrationClient({
|
|
156
|
+
client: fetched.client,
|
|
157
|
+
storeTokens: options.storeTokens,
|
|
158
|
+
orgId: fetched.pipeline.orgId,
|
|
159
|
+
region: options.region,
|
|
160
|
+
profile: options.profile,
|
|
161
|
+
});
|
|
162
|
+
if (registrationClient) {
|
|
163
|
+
await registerPipeline({
|
|
164
|
+
client: registrationClient,
|
|
165
|
+
pipelineUrl: registrationClient.getConfig().api.pipelineUrl,
|
|
166
|
+
pipeline: fetched.pipeline,
|
|
167
|
+
region: options.region,
|
|
168
|
+
output: options.output,
|
|
169
|
+
queueOnFailure: false,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Vulnerability/lifecycle state is reported, never enforced: one graded
|
|
174
|
+
// summary line so the warnings printed during resolution aren't lost
|
|
175
|
+
// above the CDK output.
|
|
176
|
+
if (fetched)
|
|
177
|
+
printLookupWarningSummary(fetched.pluginWarnings);
|
|
117
178
|
if (result.success) {
|
|
118
179
|
if (options.json) {
|
|
119
180
|
console.log(JSON.stringify({
|
|
@@ -134,6 +195,7 @@ export function synth(program) {
|
|
|
134
195
|
}
|
|
135
196
|
}
|
|
136
197
|
catch (error) {
|
|
198
|
+
emitSynthFailure(error);
|
|
137
199
|
handleError(error, ERROR_CODES.API_REQUEST, {
|
|
138
200
|
debug: program.opts().debug,
|
|
139
201
|
exit: true,
|
|
@@ -155,4 +217,4 @@ async function showResolvedPipeline(pipelineId, options) {
|
|
|
155
217
|
const { propsWithIds } = await fetchPipelineProps(client, pipelineId);
|
|
156
218
|
await printResolvedOrExit(propsWithIds);
|
|
157
219
|
}
|
|
158
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc3ludGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZGLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckssT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRCwwREFBMEQ7QUFDMUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBRTFEOzs7R0FHRztBQUNILEtBQUssVUFBVSxtQkFBbUIsQ0FDaEMsVUFBa0IsRUFDbEIsT0FBMEY7SUFFMUYsTUFBTSxN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QUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUU7YUFDbkUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsb0JBQW9CLENBQ2pDLFVBQThCLEVBQzlCLE9BQTBGO0lBRTFGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sOEJBQThCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0QsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sbUJBQW1CLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGFzc2VydFNoZWxsU2FmZSB9IGZyb20gJy4uL2NvbmZpZy9jbGkuY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGF1ZGl0TG9nIH0gZnJvbSAnLi4vdXRpbHMvYXVkaXQtbG9nLmpzJztcbmltcG9ydCB7IGV4ZWN1dGVDZGtTaGVsbENvbW1hbmQsIHJlc29sdmVCb2lsZXJwbGF0ZVBhdGggfSBmcm9tICcuLi91dGlscy9jZGstdXRpbHMuanMnO1xuaW1wb3J0IHsgY3JlYXRlQXV0aGVudGljYXRlZENsaWVudEFzeW5jLCBwcmludENvbW1hbmRIZWFkZXIsIHByaW50U3NsV2FybmluZywgd2l0aFByb2ZpbGVPcHRpb24sIHdpdGhSZWdpb25PcHRpb24sIHdpdGhTc2xPcHRpb25zIH0gZnJvbSAnLi4vdXRpbHMvY29tbWFuZC11dGlscy5qcyc7XG5pbXBvcnQgeyBFUlJPUl9DT0RFUywgaGFuZGxlRXJyb3IgfSBmcm9tICcuLi91dGlscy9lcnJvci1oYW5kbGVyLmpzJztcbmltcG9ydCB7IHByaW50SW5mbywgcHJpbnRLZXlWYWx1ZSwgcHJpbnRTZWN0aW9uLCBwcmludFN1Y2Nlc3MsIHByaW50V2FybmluZyB9IGZyb20gJy4uL3V0aWxzL291dHB1dC11dGlscy5qcyc7XG5pbXBvcnQgeyBmZXRjaFBpcGVsaW5lUHJvcHMsIHByaW50UmVzb2x2ZWRPckV4aXQgfSBmcm9tICcuLi91dGlscy9waXBlbGluZS1jb25maWcuanMnO1xuaW1wb3J0IHsgcmVsYXhUbHNGb3JDbGkgfSBmcm9tICcuLi91dGlscy90bHMuanMnO1xuXG4vLyBFU00gaGFzIG5vIF9fZGlybmFtZTsgZGVyaXZlIGl0IGZyb20gdGhpcyBtb2R1bGUncyBVUkwuXG5jb25zdCBfX2Rpcm5hbWUgPSBkaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5cbi8qKlxuICogRmV0Y2ggcGlwZWxpbmUgY29uZmlnIGFuZCBzZXQgUElQRUxJTkVfUFJPUFMgZW52IHZhciBmb3IgdGhlIGJvaWxlcnBsYXRlIGFwcC5cbiAqIFVzZXMgY3JlYXRlQXV0aGVudGljYXRlZENsaWVudEFzeW5jIHdoaWNoIHN1cHBvcnRzIGFsbCB0aHJlZSBhdXRoIG1ldGhvZHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoUGlwZWxpbmVDb25maWcoXG4gIHBpcGVsaW5lSWQ6IHN0cmluZyxcbiAgb3B0aW9uczogeyBzdG9yZVRva2Vucz86IGJvb2xlYW47IHZlcmlmeVNzbD86IGJvb2xlYW47IHJlZ2lvbj86IHN0cmluZzsgcHJvZmlsZT86IHN0cmluZyB9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnRBc3luYyhvcHRpb25zKTtcbiAgY29uc3QgeyBwcm9wc1dpdGhJZHMsIGJhc2VVcmwgfSA9IGF3YWl0IGZldGNoUGlwZWxpbmVQcm9wcyhjbGllbnQsIHBpcGVsaW5lSWQpO1xuXG4gIHByb2Nlc3MuZW52LlBJUEVMSU5FX1BST1BTID0gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkocHJvcHNXaXRoSWRzKSkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gIC8vIFByb3BhZ2F0ZSB0aGUgcmVzb2x2ZWQgcGxhdGZvcm0gYmFzZSBVUkwgaW50byB0aGUgYm9pbGVycGxhdGUgc3ludGggKHdoaWNoXG4gIC8vIGluaGVyaXRzIHByb2Nlc3MuZW52KS4gVGhlIHN5bnRoIHVzZXMgaXQgZm9yIHNlcnZlckNvbmZpZy5wbGF0Zm9ybVVybCAodGhlXG4gIC8vIFBsdWdpbkxvb2t1cCBMYW1iZGEgZW5kcG9pbnQpIGFuZCBhcyB0aGUgbG9hZFJlZ2lzdHJ5Q29uZmlnIHB1bGwtaG9zdFxuICAvLyBmYWxsYmFjay4gV2l0aG91dCB0aGlzLCBhIFVSTCBjb25maWd1cmVkIHZpYSB+Ly5waXBlbGluZS1tYW5hZ2VyL2NvbmZpZy55bWxcbiAgLy8gaXMgaW52aXNpYmxlIHRvIHRoZSBzeW50aCBzdWJwcm9jZXNzIChpdCByZWFkcyBvbmx5IHRoZSBlbnYpLlxuICBpZiAoYmFzZVVybCkge1xuICAgIHByb2Nlc3MuZW52LlBMQVRGT1JNX0JBU0VfVVJMID0gYmFzZVVybDtcbiAgfVxuXG4gIHByaW50U3VjY2VzcygnUGlwZWxpbmUgY29uZmlndXJhdGlvbiBsb2FkZWQnKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGBzeW50aGAgY29tbWFuZCB3aXRoIHRoZSBDTEkgcHJvZ3JhbS5cbiAqXG4gKiBSdW5zIENESyBzeW50aGVzaXMgdXNpbmcgdGhlIGJvaWxlcnBsYXRlIGFwcC4gUGlwZWxpbmUgY29uZmlnIGlzIHJlc29sdmVkIGZyb206XG4gKiAxLiAtLWlkIGZsYWcgb3IgUElQRUxJTkVfSUQgZW52IHZhciDihpIgZmV0Y2hlcyBjb25maWcgZnJvbSBwbGF0Zm9ybSBBUElcbiAqIDIuIFBJUEVMSU5FX1BST1BTIGVudiB2YXIgKHByZS1lbmNvZGVkLCBmcm9tIGRlcGxveSBjb21tYW5kKVxuICpcbiAqIEF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgKGluIHByaW9yaXR5IG9yZGVyKTpcbiAqIC0gUExBVEZPUk1fVE9LRU4gZW52IHZhclxuICogLSAtLXN0b3JlLXRva2VucyDihpIgZmV0Y2ggZnJvbSBBV1MgU2VjcmV0cyBNYW5hZ2VyXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGJhc2hcbiAqIHBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgc3ludGggLS1pZCA8cGlwZWxpbmUtaWQ+IC0tbm8tdmVyaWZ5LXNzbFxuICogcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aCAtLWlkIDxwaXBlbGluZS1pZD4gLS1zdG9yZS10b2tlbnNcbiAqIHBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgc3ludGggLS1xdWlldCAtLW5vLW5vdGljZXMgICAgICAgICAgIyBDb2RlUGlwZWxpbmUgKHVzZXMgZW52IHZhcnMpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN5bnRoKHByb2dyYW06IENvbW1hbmQpOiB2b2lkIHtcbiAgd2l0aFNzbE9wdGlvbnMoXG4gICAgd2l0aFJlZ2lvbk9wdGlvbihcbiAgICAgIHdpdGhQcm9maWxlT3B0aW9uKHByb2dyYW1cbiAgICAgICAgLmNvbW1hbmQoJ3N5bnRoJylcbiAgICAgICAgLmRlc2NyaXB0aW9uKCdSdW4gQ0RLIHN5bnRoZXNpcyB1c2luZyBwaXBlbGluZSBjb25maWd1cmF0aW9uJylcbiAgICAgICAgLm9wdGlvbignLWksIC0taWQgPGlkPicsICdQaXBlbGluZSBJRCAob3Igc2V0IFBJUEVMSU5FX0lEIGVudiB2YXIpJylcbiAgICAgICAgLm9wdGlvbignLS1zdG9yZS10b2tlbnMnLCAnQXV0aGVudGljYXRlIHVzaW5nIHRva2VuIGZyb20gQVdTIFNlY3JldHMgTWFuYWdlciAocmVxdWlyZXMgUExBVEZPUk1fU0VDUkVUX05BTUUgZW52IHZhciknLCBmYWxzZSlcbiAgICAgICAgLm9wdGlvbignLS1vdXRwdXQgPGRpcj4nLCAnQ0RLIG91dHB1dCBkaXJlY3RvcnknLCAnY2RrLm91dCcpKSxcbiAgICApXG4gICAgICAub3B0aW9uKCctLXF1aWV0JywgJ1N1cHByZXNzIENESyBvdXRwdXQnLCBmYWxzZSlcbiAgICAgIC5vcHRpb24oJy0tbm8tbm90aWNlcycsICdTdXBwcmVzcyBDREsgbm90aWNlcycpXG4gICAgICAub3B0aW9uKCctLXZlcmJvc2UnLCAnU2hvdyB2ZXJib3NlIENESyBvdXRwdXQnLCBmYWxzZSlcbiAgICAgIC5vcHRpb24oJy0tanNvbicsICdPdXRwdXQgcmVzdWx0IGFzIEpTT04nLCBmYWxzZSksXG4gIClcbiAgICAub3B0aW9uKCctLXNob3ctcmVzb2x2ZWQnLCAnUHJpbnQgdGhlIHJlc29sdmVkIHBpcGVsaW5lIGNvbmZpZyAod2l0aCB7eyAuLi4gfX0gdGVtcGxhdGVzIGV4cGFuZGVkKSBhbmQgZXhpdCB3aXRob3V0IHJ1bm5pbmcgQ0RLJywgZmFsc2UpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uSWQgPSBwcmludENvbW1hbmRIZWFkZXIoJ0NESyBTeW50aGVzaXMnLCB1bmRlZmluZWQsIHsgcXVpZXQ6IG9wdGlvbnMuanNvbiB9KTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGlwZWxpbmVJZCA9IG9wdGlvbnMuaWQgfHwgcHJvY2Vzcy5lbnYuUElQRUxJTkVfSUQ7XG5cbiAgICAgICAgLy8gLS1zaG93LXJlc29sdmVkOiBwcmV2aWV3IHRlbXBsYXRlcyBhbmQgZXhpdFxuICAgICAgICBpZiAob3B0aW9ucy5zaG93UmVzb2x2ZWQpIHtcbiAgICAgICAgICBhd2FpdCBzaG93UmVzb2x2ZWRQaXBlbGluZShwaXBlbGluZUlkLCBvcHRpb25zKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhdWRpdExvZygnc3ludGgnLCB7IGV4ZWN1dGlvbklkLCBwaXBlbGluZUlkLCBvdXRwdXQ6IG9wdGlvbnMub3V0cHV0LCBwcm9maWxlOiBvcHRpb25zLnByb2ZpbGUgfSk7XG4gICAgICAgIHByaW50U3NsV2FybmluZyhvcHRpb25zLnZlcmlmeVNzbCk7XG5cbiAgICAgICAgLy8gUHJvcGFnYXRlIHRvIHByb2Nlc3MuZW52IHNvIENESyBjb25zdHJ1Y3RzIChMYW1iZGEsIENvZGVCdWlsZCkgaW5oZXJpdCBpdCxcbiAgICAgICAgLy8gYnV0IHJlZnVzZSBpbiBwcm9kdWN0aW9uIChzZWUgcmVsYXhUbHNGb3JDbGkpIOKAlCB0aGUgZmxhZyBkaXNhYmxlcyBjZXJ0XG4gICAgICAgIC8vIHZhbGlkYXRpb24gZm9yIEFMTCBvdXRib3VuZCBUTFMsIGluY2x1ZGluZyB0aGUgQVdTIFNESy5cbiAgICAgICAgcmVsYXhUbHNGb3JDbGkob3B0aW9ucy52ZXJpZnlTc2wsIHByaW50V2FybmluZyk7XG5cbiAgICAgICAgLy8gRmV0Y2ggcGlwZWxpbmUgY29uZmlnIGlmIElEIGlzIGF2YWlsYWJsZSBhbmQgUElQRUxJTkVfUFJPUFMgbm90IGFscmVhZHkgc2V0XG4gICAgICAgIGlmIChwaXBlbGluZUlkICYmICFwcm9jZXNzLmVudi5QSVBFTElORV9QUk9QUykge1xuICAgICAgICAgIHByaW50SW5mbygnRmV0Y2hpbmcgcGlwZWxpbmUgY29uZmlndXJhdGlvbicsIHsgaWQ6IHBpcGVsaW5lSWQgfSk7XG4gICAgICAgICAgYXdhaXQgZmV0Y2hQaXBlbGluZUNvbmZpZyhwaXBlbGluZUlkLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIGlmICghcGlwZWxpbmVJZCAmJiAhcHJvY2Vzcy5lbnYuUElQRUxJTkVfUFJPUFMpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoJ05vIHBpcGVsaW5lIElEIG9yIFBJUEVMSU5FX1BST1BTIHNldCcpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGlwZWxpbmUgSUQgaXMgcmVxdWlyZWQuIFVzZSAtLWlkIDxpZD4gb3Igc2V0IFBJUEVMSU5FX0lEIGVudiB2YXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2NhbC10b29sIHByZXJlcXVpc2l0ZXMgKGNkayArIGVzYnVpbGQvcG5wbSkgYXJlIHZlcmlmaWVkIHVwIGZyb250IGJ5XG4gICAgICAgIC8vIHRoZSBDTEkncyBwcmVBY3Rpb24gaG9vaywgc28gYnkgaGVyZSB0aGV5J3JlIGd1YXJhbnRlZWQgcHJlc2VudC5cblxuICAgICAgICAvLyBCdWlsZCBjZGsgc3ludGggY29tbWFuZFxuICAgICAgICBpZiAob3B0aW9ucy5vdXRwdXQpIGFzc2VydFNoZWxsU2FmZShvcHRpb25zLm91dHB1dCwgJ291dHB1dCcpO1xuICAgICAgICBpZiAob3B0aW9ucy5wcm9maWxlKSBhc3NlcnRTaGVsbFNhZmUob3B0aW9ucy5wcm9maWxlLCAncHJvZmlsZScpO1xuXG4gICAgICAgIGNvbnN0IGJvaWxlcnBsYXRlUGF0aCA9IHJlc29sdmVCb2lsZXJwbGF0ZVBhdGgoX19kaXJuYW1lKTtcbiAgICAgICAgY29uc3QgcGFydHMgPSBbXG4gICAgICAgICAgJ2NkayBzeW50aCcsXG4gICAgICAgICAgYC0tYXBwPVwibm9kZSAke2JvaWxlcnBsYXRlUGF0aH1cImAsXG4gICAgICAgICAgYC0tb3V0cHV0PSR7b3B0aW9ucy5vdXRwdXR9YCxcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAob3B0aW9ucy5wcm9maWxlKSBwYXJ0cy5wdXNoKGAtLXByb2ZpbGU9JHtvcHRpb25zLnByb2ZpbGV9YCk7XG4gICAgICAgIGlmIChvcHRpb25zLnF1aWV0KSBwYXJ0cy5wdXNoKCctLXF1aWV0Jyk7XG4gICAgICAgIGlmIChvcHRpb25zLm5vdGljZXMgPT09IGZhbHNlKSBwYXJ0cy5wdXNoKCctLW5vLW5vdGljZXMnKTtcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkgcGFydHMucHVzaCgnLS12ZXJib3NlJyk7XG5cbiAgICAgICAgY29uc3QgY29tbWFuZCA9IHBhcnRzLmpvaW4oJyAnKTtcblxuICAgICAgICBwcmludEluZm8oJ0V4ZWN1dGluZycsIHsgY29tbWFuZDogKGNvbW1hbmQuc3BsaXQoJy0tYXBwJylbMF0gPz8gJycpLnRyaW0oKSArICcgLi4uJyB9KTtcbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4ZWN1dGVDZGtTaGVsbENvbW1hbmQoY29tbWFuZCwge1xuICAgICAgICAgIHNob3dPdXRwdXQ6ICFvcHRpb25zLnF1aWV0LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgIHByaW50U2VjdGlvbignU3ludGhlc2lzIENvbXBsZXRlJyk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuanNvbikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICBleGVjdXRpb25JZCxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHJlc3VsdC5kdXJhdGlvbixcbiAgICAgICAgICAgICAgb3V0cHV0OiBvcHRpb25zLm91dHB1dCxcbiAgICAgICAgICAgIH0sIG51bGwsIDIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgICAgICdFeGVjdXRpb24gSUQnOiBleGVjdXRpb25JZCxcbiAgICAgICAgICAgICAgJ0R1cmF0aW9uJzogYCR7cmVzdWx0LmR1cmF0aW9ufW1zYCxcbiAgICAgICAgICAgICAgJ091dHB1dCc6IG9wdGlvbnMub3V0cHV0LFxuICAgICAgICAgICAgICAnU3RhdHVzJzogJ+KckyBTdWNjZXNzJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuQVBJX1JFUVVFU1QsIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgICAgICBjb250ZXh0OiB7IGNvbW1hbmQ6ICdzeW50aCcsIGV4ZWN1dGlvbklkLCBwaXBlbGluZUlkOiBvcHRpb25zLmlkIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xufVxuXG4vKipcbiAqIEZldGNoIHRoZSBwaXBlbGluZSBieSBJRCwgYXBwbHkgcGFzcy0xIHNlbGYtcmVmZXJlbmNpbmcgdGVtcGxhdGVcbiAqIHJlc29sdXRpb24sIGFuZCBwcmludCBpdCB0byBzdGRvdXQuIFVzZWQgYnkgYHN5bnRoIC0tc2hvdy1yZXNvbHZlZGBcbiAqIGFuZCBgZGVwbG95IC0tc2hvdy1yZXNvbHZlZGAgdG8gcHJldmlldyBzdWJzdGl0dXRpb24gYmVmb3JlIHJ1bm5pbmcgQ0RLLlxuICovXG5hc3luYyBmdW5jdGlvbiBzaG93UmVzb2x2ZWRQaXBlbGluZShcbiAgcGlwZWxpbmVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiB7IHByb2ZpbGU/OiBzdHJpbmc7IHJlZ2lvbj86IHN0cmluZzsgc3RvcmVUb2tlbnM/OiBib29sZWFuOyB2ZXJpZnlTc2w/OiBib29sZWFuIH0sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFwaXBlbGluZUlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCctLXNob3ctcmVzb2x2ZWQgcmVxdWlyZXMgLS1pZCBvciBQSVBFTElORV9JRCBlbnYgdmFyJyk7XG4gIH1cbiAgY29uc3QgY2xpZW50ID0gYXdhaXQgY3JlYXRlQXV0aGVudGljYXRlZENsaWVudEFzeW5jKG9wdGlvbnMpO1xuICBjb25zdCB7IHByb3BzV2l0aElkcyB9ID0gYXdhaXQgZmV0Y2hQaXBlbGluZVByb3BzKGNsaWVudCwgcGlwZWxpbmVJZCk7XG4gIGF3YWl0IHByaW50UmVzb2x2ZWRPckV4aXQocHJvcHNXaXRoSWRzKTtcbn1cbiJdfQ==
|
|
220
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc3ludGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkYsT0FBTyxFQUFFLDhCQUE4QixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNySyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUcsT0FBTyxFQUF3QixrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FB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Q0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsb0JBQW9CLENBQ2pDLFVBQThCLEVBQzlCLE9BQTBGO0lBRTFGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLE1BQU0sOEJBQThCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0QsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sbUJBQW1CLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBkaXJuYW1lIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBmb3JtYXRTeW50aEZhaWx1cmUsIHN5bnRoRmFpbHVyZSB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBhc3NlcnRTaGVsbFNhZmUgfSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEFwaUNsaWVudCB9IGZyb20gJy4uL3V0aWxzL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHsgYXVkaXRMb2cgfSBmcm9tICcuLi91dGlscy9hdWRpdC1sb2cuanMnO1xuaW1wb3J0IHsgZXhlY3V0ZUNka1NoZWxsQ29tbWFuZCwgcmVzb2x2ZUJvaWxlcnBsYXRlUGF0aCB9IGZyb20gJy4uL3V0aWxzL2Nkay11dGlscy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50QXN5bmMsIHByaW50Q29tbWFuZEhlYWRlciwgcHJpbnRTc2xXYXJuaW5nLCB3aXRoUHJvZmlsZU9wdGlvbiwgd2l0aFJlZ2lvbk9wdGlvbiwgd2l0aFNzbE9wdGlvbnMgfSBmcm9tICcuLi91dGlscy9jb21tYW5kLXV0aWxzLmpzJztcbmltcG9ydCB7IHJlZ2lzdGVyUGlwZWxpbmUgfSBmcm9tICcuLi91dGlscy9kZXBsb3ktcnVubmVyLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRJbmZvLCBwcmludEtleVZhbHVlLCBwcmludFNlY3Rpb24sIHByaW50U3VjY2VzcywgcHJpbnRXYXJuaW5nIH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LXV0aWxzLmpzJztcbmltcG9ydCB7IHR5cGUgRmV0Y2hlZFBpcGVsaW5lLCBmZXRjaFBpcGVsaW5lUHJvcHMsIHByaW50UmVzb2x2ZWRPckV4aXQgfSBmcm9tICcuLi91dGlscy9waXBlbGluZS1jb25maWcuanMnO1xuaW1wb3J0IHsgUGx1Z2luUmVzb2x1dGlvbkVycm9yLCBwcmludExvb2t1cFdhcm5pbmdTdW1tYXJ5IH0gZnJvbSAnLi4vdXRpbHMvcGx1Z2luLXJlc29sdmVyLmpzJztcbmltcG9ydCB7IHJlc29sdmVSZWdpc3RyYXRpb25DbGllbnQgfSBmcm9tICcuLi91dGlscy9yZWdpc3RyYXRpb24tY2xpZW50LmpzJztcbmltcG9ydCB7IHNldFBpcGVsaW5lSWQgfSBmcm9tICcuLi91dGlscy9yZXF1ZXN0LWNvbnRleHQuanMnO1xuaW1wb3J0IHsgcmVsYXhUbHNGb3JDbGkgfSBmcm9tICcuLi91dGlscy90bHMuanMnO1xuXG4vLyBFU00gaGFzIG5vIF9fZGlybmFtZTsgZGVyaXZlIGl0IGZyb20gdGhpcyBtb2R1bGUncyBVUkwuXG5jb25zdCBfX2Rpcm5hbWUgPSBkaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5cbi8qKiBXaGF0IGEgZmV0Y2hlZCBzeW50aCBuZWVkcyBhZnRlcndhcmRzIHRvIHJlZ2lzdGVyIHRoZSBzdGVwIG1hbmlmZXN0LiAqL1xuaW50ZXJmYWNlIEZldGNoZWRGb3JTeW50aCB7XG4gIGNsaWVudDogQXBpQ2xpZW50O1xuICBwaXBlbGluZTogRmV0Y2hlZFBpcGVsaW5lWydwaXBlbGluZSddO1xuICBwbHVnaW5XYXJuaW5nczogRmV0Y2hlZFBpcGVsaW5lWydwbHVnaW5XYXJuaW5ncyddO1xufVxuXG4vKipcbiAqIEZldGNoIHBpcGVsaW5lIGNvbmZpZyBhbmQgc2V0IFBJUEVMSU5FX1BST1BTIGVudiB2YXIgZm9yIHRoZSBib2lsZXJwbGF0ZSBhcHAuXG4gKiBVc2VzIGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnRBc3luYyB3aGljaCBzdXBwb3J0cyBhbGwgdGhyZWUgYXV0aCBtZXRob2RzLlxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaFBpcGVsaW5lQ29uZmlnKFxuICBwaXBlbGluZUlkOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHsgc3RvcmVUb2tlbnM/OiBib29sZWFuOyB2ZXJpZnlTc2w/OiBib29sZWFuOyByZWdpb24/OiBzdHJpbmc7IHByb2ZpbGU/OiBzdHJpbmcgfSxcbik6IFByb21pc2U8RmV0Y2hlZEZvclN5bnRoPiB7XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnRBc3luYyhvcHRpb25zKTtcbiAgY29uc3QgeyBwaXBlbGluZSwgcHJvcHNXaXRoSWRzLCBiYXNlVXJsLCBwbHVnaW5XYXJuaW5ncyB9ID0gYXdhaXQgZmV0Y2hQaXBlbGluZVByb3BzKGNsaWVudCwgcGlwZWxpbmVJZCk7XG5cbiAgcHJvY2Vzcy5lbnYuUElQRUxJTkVfUFJPUFMgPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShwcm9wc1dpdGhJZHMpKS50b1N0cmluZygnYmFzZTY0Jyk7XG5cbiAgLy8gUHJvcGFnYXRlIHRoZSByZXNvbHZlZCBwbGF0Zm9ybSBiYXNlIFVSTCBpbnRvIHRoZSBib2lsZXJwbGF0ZSBzeW50aCAod2hpY2hcbiAgLy8gaW5oZXJpdHMgcHJvY2Vzcy5lbnYpLiBUaGUgc3ludGggdXNlcyBpdCBmb3Igc2VydmVyQ29uZmlnLnBsYXRmb3JtVXJsICh0aGVcbiAgLy8gUGx1Z2luTG9va3VwIExhbWJkYSBlbmRwb2ludCkgYW5kIGFzIHRoZSBsb2FkUmVnaXN0cnlDb25maWcgcHVsbC1ob3N0XG4gIC8vIGZhbGxiYWNrLiBXaXRob3V0IHRoaXMsIGEgVVJMIGNvbmZpZ3VyZWQgdmlhIH4vLnBpcGVsaW5lLW1hbmFnZXIvY29uZmlnLnltbFxuICAvLyBpcyBpbnZpc2libGUgdG8gdGhlIHN5bnRoIHN1YnByb2Nlc3MgKGl0IHJlYWRzIG9ubHkgdGhlIGVudikuXG4gIGlmIChiYXNlVXJsKSB7XG4gICAgcHJvY2Vzcy5lbnYuUExBVEZPUk1fQkFTRV9VUkwgPSBiYXNlVXJsO1xuICB9XG5cbiAgcHJpbnRTdWNjZXNzKCdQaXBlbGluZSBjb25maWd1cmF0aW9uIGxvYWRlZCcpO1xuICByZXR1cm4geyBjbGllbnQsIHBpcGVsaW5lOiB7IC4uLnBpcGVsaW5lLCBpZDogcGlwZWxpbmUuaWQgfHwgcGlwZWxpbmVJZCB9LCBwbHVnaW5XYXJuaW5ncyB9O1xufVxuXG4vKiogVHJ1ZSBpbnNpZGUgYW4gQVdTIENvZGVCdWlsZCBidWlsZCAodGhlIHNlbGYtbXV0YXRpbmcgc3ludGgpLiAqL1xuZnVuY3Rpb24gaW5Db2RlQnVpbGQoKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXByb2Nlc3MuZW52LkNPREVCVUlMRF9CVUlMRF9JRDtcbn1cblxuLyoqXG4gKiBQcmludCB0aGUgb25lLWxpbmUgbWFjaGluZS1yZWFkYWJsZSBmYWlsdXJlIChgUEJfU1lOVEhfRkFJTFVSRSB74oCmfWApIHRoZVxuICogZXZlbnRzIExhbWJkYSBsaWZ0cyBvdXQgb2YgdGhlIGZhaWxlZCBidWlsZCdzIGxvZyBhbmQgYXR0YWNoZXMgdG8gdGhlXG4gKiBleGVjdXRpb24gZXZlbnQuIE9ubHkgaW5zaWRlIENvZGVCdWlsZCDigJQgZWxzZXdoZXJlIGEgaHVtYW4gcmVhZHMgdGhlIGVycm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW1pdFN5bnRoRmFpbHVyZShlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICBpZiAoIWluQ29kZUJ1aWxkKCkpIHJldHVybjtcbiAgY29uc3QgZmFpbHVyZSA9IGVycm9yIGluc3RhbmNlb2YgUGx1Z2luUmVzb2x1dGlvbkVycm9yXG4gICAgPyBzeW50aEZhaWx1cmUoZXJyb3IubWVzc2FnZSwgZXJyb3IucmVmdXNhbHMpXG4gICAgOiBzeW50aEZhaWx1cmUoZXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gIGNvbnNvbGUuZXJyb3IoZm9ybWF0U3ludGhGYWlsdXJlKGZhaWx1cmUpKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGBzeW50aGAgY29tbWFuZCB3aXRoIHRoZSBDTEkgcHJvZ3JhbS5cbiAqXG4gKiBSdW5zIENESyBzeW50aGVzaXMgdXNpbmcgdGhlIGJvaWxlcnBsYXRlIGFwcC4gUGlwZWxpbmUgY29uZmlnIGlzIHJlc29sdmVkIGZyb206XG4gKiAxLiAtLWlkIGZsYWcgb3IgUElQRUxJTkVfSUQgZW52IHZhciDihpIgZmV0Y2hlcyBjb25maWcgZnJvbSBwbGF0Zm9ybSBBUElcbiAqIDIuIFBJUEVMSU5FX1BST1BTIGVudiB2YXIgKHByZS1lbmNvZGVkLCBmcm9tIGRlcGxveSBjb21tYW5kKVxuICpcbiAqIEF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgKGluIHByaW9yaXR5IG9yZGVyKTpcbiAqIC0gUExBVEZPUk1fVE9LRU4gZW52IHZhclxuICogLSAtLXN0b3JlLXRva2VucyDihpIgZmV0Y2ggZnJvbSBBV1MgU2VjcmV0cyBNYW5hZ2VyXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGJhc2hcbiAqIHBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgc3ludGggLS1pZCA8cGlwZWxpbmUtaWQ+XG4gKiBwaXBlbGluZS1tYW5hZ2VyIHBpcGVsaW5lIHN5bnRoIC0taWQgPHBpcGVsaW5lLWlkPiAtLXN0b3JlLXRva2Vuc1xuICogcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aCAtLXF1aWV0IC0tbm8tbm90aWNlcyAgICAgICAgICAjIENvZGVQaXBlbGluZSAodXNlcyBlbnYgdmFycylcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3ludGgocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICB3aXRoU3NsT3B0aW9ucyhcbiAgICB3aXRoUmVnaW9uT3B0aW9uKFxuICAgICAgd2l0aFByb2ZpbGVPcHRpb24ocHJvZ3JhbVxuICAgICAgICAuY29tbWFuZCgnc3ludGgnKVxuICAgICAgICAuZGVzY3JpcHRpb24oJ1J1biBDREsgc3ludGhlc2lzIHVzaW5nIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb24nKVxuICAgICAgICAub3B0aW9uKCctaSwgLS1pZCA8aWQ+JywgJ1BpcGVsaW5lIElEIChvciBzZXQgUElQRUxJTkVfSUQgZW52IHZhciknKVxuICAgICAgICAub3B0aW9uKCctLXN0b3JlLXRva2VucycsICdBdXRoZW50aWNhdGUgdXNpbmcgdG9rZW4gZnJvbSBBV1MgU2VjcmV0cyBNYW5hZ2VyIChyZXF1aXJlcyBQTEFURk9STV9TRUNSRVRfTkFNRSBlbnYgdmFyKScsIGZhbHNlKVxuICAgICAgICAub3B0aW9uKCctLW91dHB1dCA8ZGlyPicsICdDREsgb3V0cHV0IGRpcmVjdG9yeScsICdjZGsub3V0JykpLFxuICAgIClcbiAgICAgIC5vcHRpb24oJy0tcXVpZXQnLCAnU3VwcHJlc3MgQ0RLIG91dHB1dCcsIGZhbHNlKVxuICAgICAgLm9wdGlvbignLS1uby1ub3RpY2VzJywgJ1N1cHByZXNzIENESyBub3RpY2VzJylcbiAgICAgIC5vcHRpb24oJy0tdmVyYm9zZScsICdTaG93IHZlcmJvc2UgQ0RLIG91dHB1dCcsIGZhbHNlKVxuICAgICAgLm9wdGlvbignLS1qc29uJywgJ091dHB1dCByZXN1bHQgYXMgSlNPTicsIGZhbHNlKSxcbiAgKVxuICAgIC5vcHRpb24oJy0tc2hvdy1yZXNvbHZlZCcsICdQcmludCB0aGUgcmVzb2x2ZWQgcGlwZWxpbmUgY29uZmlnICh3aXRoIHt7IC4uLiB9fSB0ZW1wbGF0ZXMgZXhwYW5kZWQpIGFuZCBleGl0IHdpdGhvdXQgcnVubmluZyBDREsnLCBmYWxzZSlcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBleGVjdXRpb25JZCA9IHByaW50Q29tbWFuZEhlYWRlcignQ0RLIFN5bnRoZXNpcycsIHVuZGVmaW5lZCwgeyBxdWlldDogb3B0aW9ucy5qc29uIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwaXBlbGluZUlkID0gb3B0aW9ucy5pZCB8fCBwcm9jZXNzLmVudi5QSVBFTElORV9JRDtcbiAgICAgICAgLy8gRXZlcnkgcGxhdGZvcm0gY2FsbCBiZWxvdyBjYXJyaWVzIGl0LCBzbyB0aGUgdXNhZ2UgbGVkZ2VyIGNhbiBzYXkgd2hpY2hcbiAgICAgICAgLy8gcGlwZWxpbmUncyBzeW50aCBzcGVudCB0aGUgY2FsbHMuXG4gICAgICAgIHNldFBpcGVsaW5lSWQocGlwZWxpbmVJZCk7XG5cbiAgICAgICAgLy8gLS1zaG93LXJlc29sdmVkOiBwcmV2aWV3IHRlbXBsYXRlcyBhbmQgZXhpdFxuICAgICAgICBpZiAob3B0aW9ucy5zaG93UmVzb2x2ZWQpIHtcbiAgICAgICAgICBhd2FpdCBzaG93UmVzb2x2ZWRQaXBlbGluZShwaXBlbGluZUlkLCBvcHRpb25zKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhdWRpdExvZygnc3ludGgnLCB7IGV4ZWN1dGlvbklkLCBwaXBlbGluZUlkLCBvdXRwdXQ6IG9wdGlvbnMub3V0cHV0LCBwcm9maWxlOiBvcHRpb25zLnByb2ZpbGUgfSk7XG4gICAgICAgIHByaW50U3NsV2FybmluZyhvcHRpb25zLnZlcmlmeVNzbCk7XG5cbiAgICAgICAgLy8gUHJvcGFnYXRlIHRvIHByb2Nlc3MuZW52IHNvIENESyBjb25zdHJ1Y3RzIChMYW1iZGEsIENvZGVCdWlsZCkgaW5oZXJpdCBpdCxcbiAgICAgICAgLy8gYnV0IHJlZnVzZSBpbiBwcm9kdWN0aW9uIChzZWUgcmVsYXhUbHNGb3JDbGkpIOKAlCB0aGUgZmxhZyBkaXNhYmxlcyBjZXJ0XG4gICAgICAgIC8vIHZhbGlkYXRpb24gZm9yIEFMTCBvdXRib3VuZCBUTFMsIGluY2x1ZGluZyB0aGUgQVdTIFNESy5cbiAgICAgICAgcmVsYXhUbHNGb3JDbGkob3B0aW9ucy52ZXJpZnlTc2wsIHByaW50V2FybmluZyk7XG5cbiAgICAgICAgLy8gRmV0Y2ggcGlwZWxpbmUgY29uZmlnIGlmIElEIGlzIGF2YWlsYWJsZSBhbmQgUElQRUxJTkVfUFJPUFMgbm90IGFscmVhZHkgc2V0XG4gICAgICAgIGxldCBmZXRjaGVkOiBGZXRjaGVkRm9yU3ludGggfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChwaXBlbGluZUlkICYmICFwcm9jZXNzLmVudi5QSVBFTElORV9QUk9QUykge1xuICAgICAgICAgIHByaW50SW5mbygnRmV0Y2hpbmcgcGlwZWxpbmUgY29uZmlndXJhdGlvbicsIHsgaWQ6IHBpcGVsaW5lSWQgfSk7XG4gICAgICAgICAgZmV0Y2hlZCA9IGF3YWl0IGZldGNoUGlwZWxpbmVDb25maWcocGlwZWxpbmVJZCwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBpcGVsaW5lSWQgJiYgIXByb2Nlc3MuZW52LlBJUEVMSU5FX1BST1BTKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKCdObyBwaXBlbGluZSBJRCBvciBQSVBFTElORV9QUk9QUyBzZXQnKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BpcGVsaW5lIElEIGlzIHJlcXVpcmVkLiBVc2UgLS1pZCA8aWQ+IG9yIHNldCBQSVBFTElORV9JRCBlbnYgdmFyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9jYWwtdG9vbCBwcmVyZXF1aXNpdGVzIChjZGsgKyBlc2J1aWxkL3BucG0pIGFyZSB2ZXJpZmllZCB1cCBmcm9udCBieVxuICAgICAgICAvLyB0aGUgQ0xJJ3MgcHJlQWN0aW9uIGhvb2ssIHNvIGJ5IGhlcmUgdGhleSdyZSBndWFyYW50ZWVkIHByZXNlbnQuXG5cbiAgICAgICAgLy8gQnVpbGQgY2RrIHN5bnRoIGNvbW1hbmRcbiAgICAgICAgaWYgKG9wdGlvbnMub3V0cHV0KSBhc3NlcnRTaGVsbFNhZmUob3B0aW9ucy5vdXRwdXQsICdvdXRwdXQnKTtcbiAgICAgICAgaWYgKG9wdGlvbnMucHJvZmlsZSkgYXNzZXJ0U2hlbGxTYWZlKG9wdGlvbnMucHJvZmlsZSwgJ3Byb2ZpbGUnKTtcblxuICAgICAgICBjb25zdCBib2lsZXJwbGF0ZVBhdGggPSByZXNvbHZlQm9pbGVycGxhdGVQYXRoKF9fZGlybmFtZSk7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgICAgICdjZGsgc3ludGgnLFxuICAgICAgICAgIGAtLWFwcD1cIm5vZGUgJHtib2lsZXJwbGF0ZVBhdGh9XCJgLFxuICAgICAgICAgIGAtLW91dHB1dD0ke29wdGlvbnMub3V0cHV0fWAsXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucHJvZmlsZSkgcGFydHMucHVzaChgLS1wcm9maWxlPSR7b3B0aW9ucy5wcm9maWxlfWApO1xuICAgICAgICBpZiAob3B0aW9ucy5xdWlldCkgcGFydHMucHVzaCgnLS1xdWlldCcpO1xuICAgICAgICBpZiAob3B0aW9ucy5ub3RpY2VzID09PSBmYWxzZSkgcGFydHMucHVzaCgnLS1uby1ub3RpY2VzJyk7XG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHBhcnRzLnB1c2goJy0tdmVyYm9zZScpO1xuXG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSBwYXJ0cy5qb2luKCcgJyk7XG5cbiAgICAgICAgcHJpbnRJbmZvKCdFeGVjdXRpbmcnLCB7IGNvbW1hbmQ6IChjb21tYW5kLnNwbGl0KCctLWFwcCcpWzBdID8/ICcnKS50cmltKCkgKyAnIC4uLicgfSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBleGVjdXRlQ2RrU2hlbGxDb21tYW5kKGNvbW1hbmQsIHtcbiAgICAgICAgICBzaG93T3V0cHV0OiAhb3B0aW9ucy5xdWlldCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludFNlY3Rpb24oJ1N5bnRoZXNpcyBDb21wbGV0ZScpO1xuXG4gICAgICAgIC8vIEEgc2VsZi1tdXRhdGluZyBwaXBlbGluZSByZS1zeW50aGVzaXplcyBpbiBDb2RlQnVpbGQgb24gZXZlcnkgcnVuIGFuZFxuICAgICAgICAvLyBuZXZlciBwYXNzZXMgdGhyb3VnaCBgcGlwZWxpbmUgZGVwbG95YCwgc28gcmVnaXN0ZXIgaXRzIHN0ZXAgbWFuaWZlc3RcbiAgICAgICAgLy8gaGVyZSDigJQgb3RoZXJ3aXNlIHRoZSBwbGF0Zm9ybSBrZWVwcyB0aGUgZGlnZXN0cyBvZiB0aGUgTEFTVCBtYW51YWxcbiAgICAgICAgLy8gZGVwbG95IGFuZCBpdHMgZGVwbG95ZWQtZXhwb3N1cmUgdmlldyBnb2VzIHN0YWxlLiBCZXN0LWVmZm9ydDogYVxuICAgICAgICAvLyBmYWlsZWQgcmVnaXN0cmF0aW9uIGlzIGxvZ2dlZCBsb3VkbHksIG5ldmVyIGZhaWxzIHRoZSBzeW50aC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gUmVnaXN0ZXJlZCB3aXRoIHRoZSBgcGlwZWxpbmUtcmVnaXN0ZXJgIGtleSwgTk9UIHRoZSBwbGF0Zm9ybSBrZXkgdGhlXG4gICAgICAgIC8vIHN5bnRoIGZldGNoZWQgd2l0aDogdGhhdCBvbmUgcmVhZHMgcGlwZWxpbmVzIGFuZCBwbHVnaW5zIG9ubHkuIEFcbiAgICAgICAgLy8gbWlzc2luZyByZWdpc3RyYXRpb24ga2V5IHNraXBzIHRoaXMgd2l0aCBhIHdhcm5pbmcgKG5vIGZhbGxiYWNrKS5cbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzICYmIGZldGNoZWQgJiYgaW5Db2RlQnVpbGQoKSkge1xuICAgICAgICAgIGNvbnN0IHJlZ2lzdHJhdGlvbkNsaWVudCA9IGF3YWl0IHJlc29sdmVSZWdpc3RyYXRpb25DbGllbnQoe1xuICAgICAgICAgICAgY2xpZW50OiBmZXRjaGVkLmNsaWVudCxcbiAgICAgICAgICAgIHN0b3JlVG9rZW5zOiBvcHRpb25zLnN0b3JlVG9rZW5zLFxuICAgICAgICAgICAgb3JnSWQ6IGZldGNoZWQucGlwZWxpbmUub3JnSWQsXG4gICAgICAgICAgICByZWdpb246IG9wdGlvbnMucmVnaW9uLFxuICAgICAgICAgICAgcHJvZmlsZTogb3B0aW9ucy5wcm9maWxlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChyZWdpc3RyYXRpb25DbGllbnQpIHtcbiAgICAgICAgICAgIGF3YWl0IHJlZ2lzdGVyUGlwZWxpbmUoe1xuICAgICAgICAgICAgICBjbGllbnQ6IHJlZ2lzdHJhdGlvbkNsaWVudCxcbiAgICAgICAgICAgICAgcGlwZWxpbmVVcmw6IHJlZ2lzdHJhdGlvbkNsaWVudC5nZXRDb25maWcoKS5hcGkucGlwZWxpbmVVcmwsXG4gICAgICAgICAgICAgIHBpcGVsaW5lOiBmZXRjaGVkLnBpcGVsaW5lLFxuICAgICAgICAgICAgICByZWdpb246IG9wdGlvbnMucmVnaW9uLFxuICAgICAgICAgICAgICBvdXRwdXQ6IG9wdGlvbnMub3V0cHV0LFxuICAgICAgICAgICAgICBxdWV1ZU9uRmFpbHVyZTogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWdWxuZXJhYmlsaXR5L2xpZmVjeWNsZSBzdGF0ZSBpcyByZXBvcnRlZCwgbmV2ZXIgZW5mb3JjZWQ6IG9uZSBncmFkZWRcbiAgICAgICAgLy8gc3VtbWFyeSBsaW5lIHNvIHRoZSB3YXJuaW5ncyBwcmludGVkIGR1cmluZyByZXNvbHV0aW9uIGFyZW4ndCBsb3N0XG4gICAgICAgIC8vIGFib3ZlIHRoZSBDREsgb3V0cHV0LlxuICAgICAgICBpZiAoZmV0Y2hlZCkgcHJpbnRMb29rdXBXYXJuaW5nU3VtbWFyeShmZXRjaGVkLnBsdWdpbldhcm5pbmdzKTtcblxuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgIGV4ZWN1dGlvbklkLFxuICAgICAgICAgICAgICBkdXJhdGlvbjogcmVzdWx0LmR1cmF0aW9uLFxuICAgICAgICAgICAgICBvdXRwdXQ6IG9wdGlvbnMub3V0cHV0LFxuICAgICAgICAgICAgfSwgbnVsbCwgMikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcmludEtleVZhbHVlKHtcbiAgICAgICAgICAgICAgJ0V4ZWN1dGlvbiBJRCc6IGV4ZWN1dGlvbklkLFxuICAgICAgICAgICAgICAnRHVyYXRpb24nOiBgJHtyZXN1bHQuZHVyYXRpb259bXNgLFxuICAgICAgICAgICAgICAnT3V0cHV0Jzogb3B0aW9ucy5vdXRwdXQsXG4gICAgICAgICAgICAgICdTdGF0dXMnOiAn4pyTIFN1Y2Nlc3MnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGVtaXRTeW50aEZhaWx1cmUoZXJyb3IpO1xuICAgICAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuQVBJX1JFUVVFU1QsIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgICAgICBjb250ZXh0OiB7IGNvbW1hbmQ6ICdzeW50aCcsIGV4ZWN1dGlvbklkLCBwaXBlbGluZUlkOiBvcHRpb25zLmlkIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xufVxuXG4vKipcbiAqIEZldGNoIHRoZSBwaXBlbGluZSBieSBJRCwgYXBwbHkgcGFzcy0xIHNlbGYtcmVmZXJlbmNpbmcgdGVtcGxhdGVcbiAqIHJlc29sdXRpb24sIGFuZCBwcmludCBpdCB0byBzdGRvdXQuIFVzZWQgYnkgYHN5bnRoIC0tc2hvdy1yZXNvbHZlZGBcbiAqIGFuZCBgZGVwbG95IC0tc2hvdy1yZXNvbHZlZGAgdG8gcHJldmlldyBzdWJzdGl0dXRpb24gYmVmb3JlIHJ1bm5pbmcgQ0RLLlxuICovXG5hc3luYyBmdW5jdGlvbiBzaG93UmVzb2x2ZWRQaXBlbGluZShcbiAgcGlwZWxpbmVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBvcHRpb25zOiB7IHByb2ZpbGU/OiBzdHJpbmc7IHJlZ2lvbj86IHN0cmluZzsgc3RvcmVUb2tlbnM/OiBib29sZWFuOyB2ZXJpZnlTc2w/OiBib29sZWFuIH0sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFwaXBlbGluZUlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCctLXNob3ctcmVzb2x2ZWQgcmVxdWlyZXMgLS1pZCBvciBQSVBFTElORV9JRCBlbnYgdmFyJyk7XG4gIH1cbiAgY29uc3QgY2xpZW50ID0gYXdhaXQgY3JlYXRlQXV0aGVudGljYXRlZENsaWVudEFzeW5jKG9wdGlvbnMpO1xuICBjb25zdCB7IHByb3BzV2l0aElkcyB9ID0gYXdhaXQgZmV0Y2hQaXBlbGluZVByb3BzKGNsaWVudCwgcGlwZWxpbmVJZCk7XG4gIGF3YWl0IHByaW50UmVzb2x2ZWRPckV4aXQocHJvcHNXaXRoSWRzKTtcbn1cbiJdfQ==
|