@pipeline-builder/pipeline-manager 4.1.14 → 4.1.16

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.
Files changed (92) hide show
  1. package/config.yml +16 -37
  2. package/dist/boilerplate.js +10 -2
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +97 -79
  5. package/dist/commands/audit-stacks.js +3 -3
  6. package/dist/commands/create-pat.d.ts +2 -3
  7. package/dist/commands/create-pat.d.ts.map +1 -1
  8. package/dist/commands/create-pat.js +3 -4
  9. package/dist/commands/create-pipeline.d.ts.map +1 -1
  10. package/dist/commands/create-pipeline.js +198 -190
  11. package/dist/commands/list-pipelines.js +2 -2
  12. package/dist/commands/list-plugins.js +2 -2
  13. package/dist/commands/login.d.ts +2 -2
  14. package/dist/commands/login.js +3 -3
  15. package/dist/commands/new-plugin.d.ts +48 -5
  16. package/dist/commands/new-plugin.d.ts.map +1 -1
  17. package/dist/commands/new-plugin.js +261 -95
  18. package/dist/commands/plugin-lifecycle.d.ts +29 -0
  19. package/dist/commands/plugin-lifecycle.d.ts.map +1 -0
  20. package/dist/commands/plugin-lifecycle.js +147 -0
  21. package/dist/commands/provision.d.ts +42 -2
  22. package/dist/commands/provision.d.ts.map +1 -1
  23. package/dist/commands/provision.js +184 -147
  24. package/dist/commands/publish-plugin.d.ts +62 -0
  25. package/dist/commands/publish-plugin.d.ts.map +1 -0
  26. package/dist/commands/publish-plugin.js +224 -0
  27. package/dist/commands/redrive-events.d.ts +1 -1
  28. package/dist/commands/redrive-events.js +2 -2
  29. package/dist/commands/store-token.d.ts +46 -1
  30. package/dist/commands/store-token.d.ts.map +1 -1
  31. package/dist/commands/store-token.js +127 -102
  32. package/dist/commands/test-plugin.d.ts +72 -0
  33. package/dist/commands/test-plugin.d.ts.map +1 -0
  34. package/dist/commands/test-plugin.js +285 -0
  35. package/dist/commands/upload-plugin.d.ts +6 -7
  36. package/dist/commands/upload-plugin.d.ts.map +1 -1
  37. package/dist/commands/upload-plugin.js +127 -189
  38. package/dist/commands/validate-plugin.d.ts +37 -4
  39. package/dist/commands/validate-plugin.d.ts.map +1 -1
  40. package/dist/commands/validate-plugin.js +129 -144
  41. package/dist/commands/validate-templates.d.ts.map +1 -1
  42. package/dist/commands/validate-templates.js +8 -9
  43. package/dist/config/plugin-catalog-assets.d.ts +13 -0
  44. package/dist/config/plugin-catalog-assets.d.ts.map +1 -0
  45. package/dist/config/plugin-catalog-assets.js +21 -0
  46. package/dist/config.yml +16 -37
  47. package/dist/lambda/token-renew-handler.d.ts.map +1 -1
  48. package/dist/lambda/token-renew-handler.js +109 -154
  49. package/dist/types/config.d.ts +2 -6
  50. package/dist/types/config.d.ts.map +1 -1
  51. package/dist/types/config.js +1 -1
  52. package/dist/types/plugin.d.ts +21 -0
  53. package/dist/types/plugin.d.ts.map +1 -1
  54. package/dist/types/plugin.js +1 -1
  55. package/dist/utils/aws-env.d.ts +1 -2
  56. package/dist/utils/aws-env.d.ts.map +1 -1
  57. package/dist/utils/aws-env.js +2 -3
  58. package/dist/utils/catalog-prompt.d.ts +26 -0
  59. package/dist/utils/catalog-prompt.d.ts.map +1 -0
  60. package/dist/utils/catalog-prompt.js +113 -0
  61. package/dist/utils/command-utils.d.ts.map +1 -1
  62. package/dist/utils/command-utils.js +14 -3
  63. package/dist/utils/config-loader.d.ts.map +1 -1
  64. package/dist/utils/config-loader.js +4 -6
  65. package/dist/utils/credential-store.d.ts +16 -0
  66. package/dist/utils/credential-store.d.ts.map +1 -1
  67. package/dist/utils/credential-store.js +57 -2
  68. package/dist/utils/deploy-runner.d.ts.map +1 -1
  69. package/dist/utils/deploy-runner.js +7 -2
  70. package/dist/utils/pipeline-config.d.ts +1 -2
  71. package/dist/utils/pipeline-config.d.ts.map +1 -1
  72. package/dist/utils/pipeline-config.js +1 -1
  73. package/dist/utils/plugin-docker.d.ts +44 -0
  74. package/dist/utils/plugin-docker.d.ts.map +1 -0
  75. package/dist/utils/plugin-docker.js +71 -0
  76. package/dist/utils/plugin-package.d.ts +40 -0
  77. package/dist/utils/plugin-package.d.ts.map +1 -0
  78. package/dist/utils/plugin-package.js +159 -0
  79. package/dist/utils/plugin-resolver.d.ts.map +1 -1
  80. package/dist/utils/plugin-resolver.js +43 -29
  81. package/dist/utils/plugin-scan.d.ts +22 -0
  82. package/dist/utils/plugin-scan.d.ts.map +1 -0
  83. package/dist/utils/plugin-scan.js +52 -0
  84. package/dist/utils/plugin-zip.d.ts +15 -0
  85. package/dist/utils/plugin-zip.d.ts.map +1 -0
  86. package/dist/utils/plugin-zip.js +96 -0
  87. package/dist/utils/registry.d.ts +15 -0
  88. package/dist/utils/registry.d.ts.map +1 -1
  89. package/dist/utils/registry.js +17 -2
  90. package/dist/utils/service-account.d.ts.map +1 -1
  91. package/dist/utils/service-account.js +9 -10
  92. package/package.json +45 -8
@@ -30,7 +30,7 @@ const DEFAULT_RENEW_CRON = '0 0 * * *';
30
30
  *
31
31
  * A scoped key exchanges to a token with no permissions and no admin flags at
32
32
  * all — only the one capability — so it is the shape every automation that does
33
- * exactly one thing should hold (#12). The unscoped `platform` credential is the
33
+ * exactly one thing should hold. The unscoped `platform` credential is the
34
34
  * remaining full-privilege one: synth/deploy callbacks and the plugin-lookup
35
35
  * Lambda call the ordinary API surface, which no single scope covers.
36
36
  */
@@ -86,7 +86,7 @@ async function deployRenewSchedule(opts) {
86
86
  `RenewDays=${opts.days}`,
87
87
  `ScheduleExpression=${scheduleExpression}`,
88
88
  `NameSuffix=${nameSuffix}`,
89
- // Recorded for provenance only — the rotator no longer installs the CLI at
89
+ // Recorded for provenance only — the rotator does not install the CLI at
90
90
  // runtime (it speaks to the platform directly), but knowing which CLI
91
91
  // deployed a stack is worth keeping.
92
92
  `PipelineManagerVersion=${APP_VERSION}`,
@@ -133,13 +133,122 @@ async function previousKeyId(secretName, aws) {
133
133
  return {};
134
134
  }
135
135
  }
136
+ /** Print the dry-run plan (JSON or human). Stays entirely offline. */
137
+ export function printDryRunPlan(plan, json) {
138
+ if (json) {
139
+ console.log(JSON.stringify({ success: true, dryRun: true, ...plan }, null, 2));
140
+ return;
141
+ }
142
+ console.log('');
143
+ printSection('Dry Run — No Changes Made');
144
+ printKeyValue({
145
+ 'Service Account': plan.serviceAccount,
146
+ 'Roles': plan.roles,
147
+ 'Key Scope': plan.scope,
148
+ 'Secret Name': plan.secretName,
149
+ 'Region': plan.region,
150
+ 'Expires In': `${plan.expiresInDays} days`,
151
+ });
152
+ printSuccess('Dry run complete — no account, key or secret was created');
153
+ }
154
+ /**
155
+ * The Secrets Manager payload: `{ username: orgId, password: <pb_sa_ key>, ...metadata }`.
156
+ * - username/password satisfy CodeBuild's `secretsManagerCredentials` (HTTP
157
+ * Basic, sent to pipeline-image-registry's /token endpoint, which exchanges
158
+ * the opaque key like every other service does).
159
+ * - `password` is the canonical field: the plugin-lookup Lambda, the events
160
+ * Lambda and `--store-tokens` all read it.
161
+ * - keyId / serviceAccountId are what the rotation Lambda needs to retire the
162
+ * key it replaces.
163
+ */
164
+ export function buildSecretValue(provisioned, platformUrl, expiresInSeconds) {
165
+ return JSON.stringify({
166
+ username: provisioned.organizationId,
167
+ password: provisioned.key,
168
+ platformUrl,
169
+ organizationId: provisioned.organizationId,
170
+ serviceAccountId: provisioned.serviceAccountId,
171
+ serviceAccountName: provisioned.serviceAccountName,
172
+ keyId: provisioned.keyId,
173
+ scope: provisioned.scope,
174
+ expiresIn: expiresInSeconds,
175
+ expiresAt: provisioned.expiresAt,
176
+ createdAt: new Date().toISOString(),
177
+ });
178
+ }
179
+ /**
180
+ * Retire the credential this run replaced — AFTER the new one is stored, never
181
+ * before. A failure here leaves a superfluous key that expires on its own;
182
+ * doing it in the other order would leave the secret naming a revoked key if
183
+ * the write failed.
184
+ */
185
+ export async function retirePreviousKey(client, password, provisioned, previous) {
186
+ if (!previous.keyId || previous.serviceAccountId !== provisioned.serviceAccountId)
187
+ return;
188
+ try {
189
+ await revokeServiceAccountKey(client, password, provisioned.organizationId, provisioned.serviceAccountId, previous.keyId);
190
+ printSuccess(`Retired the previous key (${previous.keyId})`);
191
+ }
192
+ catch (err) {
193
+ printWarning(`Stored the new key, but could not revoke the previous one (${previous.keyId}): `
194
+ + `${errorMessage(err)}. It expires on its own; revoke it from `
195
+ + 'Settings → Service accounts if you want it gone now.');
196
+ }
197
+ }
198
+ /** Print the stored key's summary (JSON or human) plus the next steps. */
199
+ export function printStoredKey(r) {
200
+ const { secretName, arn, region, accountName, provisioned, days, scheduleExpression } = r;
201
+ if (r.json) {
202
+ console.log(JSON.stringify({
203
+ success: true,
204
+ secretName,
205
+ secretArn: arn,
206
+ region,
207
+ serviceAccount: accountName,
208
+ serviceAccountId: provisioned.serviceAccountId,
209
+ keyId: provisioned.keyId,
210
+ scope: provisioned.scope,
211
+ expiresInDays: days,
212
+ expiresAt: provisioned.expiresAt,
213
+ schedule: scheduleExpression ?? null,
214
+ }, null, 2));
215
+ }
216
+ else {
217
+ console.log('');
218
+ printSection('Key Stored');
219
+ printKeyValue({
220
+ 'Secret Name': secretName,
221
+ 'Secret ARN': arn,
222
+ 'Region': region,
223
+ 'Service Account': accountName,
224
+ 'Key Scope': provisioned.scope ?? '(none — full platform credential)',
225
+ 'Key Id': provisioned.keyId,
226
+ 'Expires In': `${days} days`,
227
+ 'Renew By': provisioned.expiresAt,
228
+ 'Auto-Rotate': scheduleExpression ? `✓ ${scheduleExpression}` : 'off (pass --schedule to enable)',
229
+ 'Status': '✓ Stored',
230
+ });
231
+ console.log('');
232
+ printSuccess('Key stored. To use with synth/deploy:');
233
+ printInfo(` export PLATFORM_SECRET_NAME=${secretName}`);
234
+ printInfo(' pipeline-manager pipeline synth --id <pipeline-id> --store-tokens');
235
+ console.log('');
236
+ if (scheduleExpression) {
237
+ printInfo(`Auto-rotation is active (${scheduleExpression}); the secret is replaced before ${provisioned.expiresAt}.`);
238
+ }
239
+ else {
240
+ printInfo(`Rotate before ${provisioned.expiresAt} with: pipeline-manager infra store-token --days ${days}`);
241
+ printInfo(' (or pass --schedule to install a daily auto-rotation stack)');
242
+ }
243
+ }
244
+ }
136
245
  /**
137
246
  * Registers the `store-token` command with the CLI program.
138
247
  *
139
248
  * Provisions the org's machine identity — a SERVICE ACCOUNT and one `pb_sa_…`
140
249
  * key — and stores the key in AWS Secrets Manager for CDK deployments,
141
250
  * CodeBuild's registry credentials, the plugin-lookup Lambda and the event
142
- * ingestion Lambda (#12 / #N2). Nothing stored is tied to a person's session any
251
+ * ingestion Lambda. Nothing stored is tied to a person's session any
143
252
  * more: the account outlives its creator, takes no seat, and every audit row it
144
253
  * produces names the account.
145
254
  *
@@ -210,30 +319,14 @@ export function storeToken(program) {
210
319
  if (options.dryRun) {
211
320
  // Dry run stays entirely OFFLINE — it must not create an account or
212
321
  // burn a key just to show what it would do.
213
- const plan = {
322
+ printDryRunPlan({
214
323
  serviceAccount: accountName,
215
324
  roles: scope ? 'none (scoped, least privilege)' : 'org admin',
216
325
  scope: scope ?? '(none — full platform credential)',
217
326
  secretName: process.env.PLATFORM_SECRET_NAME || `${secretNameForOrg('<orgId>', scope ? scopeSecretLeaf(scope) : 'platform')}`,
218
327
  region,
219
328
  expiresInDays: days,
220
- };
221
- if (options.json) {
222
- console.log(JSON.stringify({ success: true, dryRun: true, ...plan }, null, 2));
223
- }
224
- else {
225
- console.log('');
226
- printSection('Dry Run — No Changes Made');
227
- printKeyValue({
228
- 'Service Account': plan.serviceAccount,
229
- 'Roles': plan.roles,
230
- 'Key Scope': plan.scope,
231
- 'Secret Name': plan.secretName,
232
- 'Region': plan.region,
233
- 'Expires In': `${days} days`,
234
- });
235
- printSuccess('Dry run complete — no account, key or secret was created');
236
- }
329
+ }, !!options.json);
237
330
  return;
238
331
  }
239
332
  const keyName = `${accountName}-${new Date().toISOString().slice(0, 10)}`;
@@ -273,47 +366,12 @@ export function storeToken(program) {
273
366
  // What this run is REPLACING, read before the write so the old key can be
274
367
  // retired after the new one is safely stored.
275
368
  const previous = await previousKeyId(secretName, aws);
276
- // Schema: { username: orgId, password: <pb_sa_ key>, ...metadata }
277
- // - username/password satisfy CodeBuild's `secretsManagerCredentials`
278
- // (HTTP Basic, sent to pipeline-image-registry's /token endpoint, which
279
- // exchanges the opaque key like every other service does)
280
- // - `password` stays the canonical field: the plugin-lookup Lambda, the
281
- // events Lambda and `--store-tokens` all read it. Only its VALUE changed,
282
- // from a machine-session JWT to an opaque service-account key.
283
- // - keyId / serviceAccountId are what the rotation Lambda needs to retire
284
- // the key it replaces.
285
- const secretValue = JSON.stringify({
286
- username: provisioned.organizationId,
287
- password: provisioned.key,
288
- platformUrl: client.getBaseUrl(),
289
- organizationId: provisioned.organizationId,
290
- serviceAccountId: provisioned.serviceAccountId,
291
- serviceAccountName: provisioned.serviceAccountName,
292
- keyId: provisioned.keyId,
293
- scope: provisioned.scope,
294
- expiresIn: expiresInSeconds,
295
- expiresAt: provisioned.expiresAt,
296
- createdAt: new Date().toISOString(),
297
- });
369
+ const secretValue = buildSecretValue(provisioned, client.getBaseUrl(), expiresInSeconds);
298
370
  printSection('Store Key');
299
371
  const description = `Pipeline Builder service-account key (${accountName}; renew by ${provisioned.expiresAt})`;
300
372
  await upsertSecret(secretName, secretValue, description, aws);
301
373
  const arn = await getSecretArn(secretName, aws);
302
- // Retire the credential this run replaced — AFTER the new one is stored,
303
- // never before. A failure here leaves a superfluous key that expires on
304
- // its own; doing it in the other order would leave the secret naming a
305
- // revoked key if the write failed.
306
- if (previous.keyId && previous.serviceAccountId === provisioned.serviceAccountId) {
307
- try {
308
- await revokeServiceAccountKey(client, password, provisioned.organizationId, provisioned.serviceAccountId, previous.keyId);
309
- printSuccess(`Retired the previous key (${previous.keyId})`);
310
- }
311
- catch (err) {
312
- printWarning(`Stored the new key, but could not revoke the previous one (${previous.keyId}): `
313
- + `${errorMessage(err)}. It expires on its own; revoke it from `
314
- + 'Settings → Service accounts if you want it gone now.');
315
- }
316
- }
374
+ await retirePreviousKey(client, password, provisioned, previous);
317
375
  // Optionally install the once-a-day rotation stack so this key never lapses.
318
376
  let scheduleExpression;
319
377
  if (options.schedule) {
@@ -326,49 +384,16 @@ export function storeToken(program) {
326
384
  profile: options.profile,
327
385
  });
328
386
  }
329
- if (options.json) {
330
- console.log(JSON.stringify({
331
- success: true,
332
- secretName,
333
- secretArn: arn,
334
- region,
335
- serviceAccount: accountName,
336
- serviceAccountId: provisioned.serviceAccountId,
337
- keyId: provisioned.keyId,
338
- scope: provisioned.scope,
339
- expiresInDays: days,
340
- expiresAt: provisioned.expiresAt,
341
- schedule: scheduleExpression ?? null,
342
- }, null, 2));
343
- }
344
- else {
345
- console.log('');
346
- printSection('Key Stored');
347
- printKeyValue({
348
- 'Secret Name': secretName,
349
- 'Secret ARN': arn,
350
- 'Region': region,
351
- 'Service Account': accountName,
352
- 'Key Scope': provisioned.scope ?? '(none — full platform credential)',
353
- 'Key Id': provisioned.keyId,
354
- 'Expires In': `${days} days`,
355
- 'Renew By': provisioned.expiresAt,
356
- 'Auto-Rotate': scheduleExpression ? `✓ ${scheduleExpression}` : 'off (pass --schedule to enable)',
357
- 'Status': '✓ Stored',
358
- });
359
- console.log('');
360
- printSuccess('Key stored. To use with synth/deploy:');
361
- printInfo(` export PLATFORM_SECRET_NAME=${secretName}`);
362
- printInfo(' pipeline-manager pipeline synth --id <pipeline-id> --store-tokens');
363
- console.log('');
364
- if (scheduleExpression) {
365
- printInfo(`Auto-rotation is active (${scheduleExpression}); the secret is replaced before ${provisioned.expiresAt}.`);
366
- }
367
- else {
368
- printInfo(`Rotate before ${provisioned.expiresAt} with: pipeline-manager infra store-token --days ${days}`);
369
- printInfo(' (or pass --schedule to install a daily auto-rotation stack)');
370
- }
371
- }
387
+ printStoredKey({
388
+ json: !!options.json,
389
+ secretName,
390
+ arn,
391
+ region,
392
+ accountName,
393
+ provisioned,
394
+ days,
395
+ scheduleExpression,
396
+ });
372
397
  }
373
398
  catch (error) {
374
399
  handleError(error, ERROR_CODES.API_REQUEST, {
@@ -383,4 +408,4 @@ export function storeToken(program) {
383
408
  }
384
409
  });
385
410
  }
386
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtdG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc3RvcmUtdG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRixPQUFPLEVBQUUsOEJBQThCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JLLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM5RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFbEcsMERBQTBEO0FBQzFELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFFL0QsTUFBTSxnQkFBZ0IsR0FBRyw4QkFBOEIsQ0FBQztBQUN4RCwrRUFBK0U7QUFDL0UsTUFBTSxpQkFBaUIsR0FBRyw4QkFBOEIsQ0FBQztBQUN6RCxnR0FBZ0c7QUFDaEcsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQUM7QUFFdkM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLGFBQWEsR0FBNkQ7SUFDOUUsa0JBQWtCLEVBQUU7UUFDbEIsT0FBTyxFQUFFLGtCQUFrQjtRQUMzQixXQUFXLEVBQUUsd0VBQXdFO0tBQ3RGO0lBQ0QsZUFBZSxFQUFFO1FBQ2YsT0FBTyxFQUFFLGVBQWU7UUFDeEIsV0FBVyxFQUFFLHlFQUF5RTtLQUN2RjtDQUNGLENBQUM7QUFFRiw2RUFBNkU7QUFDN0UsTUFBTSxnQkFBZ0IsR0FBRztJQUN2QixPQUFPLEVBQUUscUJBQXFCO0lBQzlCLFdBQVcsRUFBRSxpRkFBaUY7Q0FDL0YsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILEtBQUssVUFBVSxtQkFBbUIsQ0FBQyxJQU1sQztJQUNDLE1BQU0sa0JBQWtCLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsMkJBQTJCO0lBRTdGLDJFQUEyRTtJQUMzRSxpRUFBaUU7SUFDakUsNkVBQTZFO0lBQzdFLHNFQUFzRTtJQUN0RSxzRUFBc0U7SUFDdEUsa0VBQWtFO0lBQ2xFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLHNDQUFzQztJQUM5RixNQUFNLFVBQVUsR0FBRyxVQUFVLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNsRyxNQUFNLFNBQVMsR0FBRyxHQUFHLGdCQUFnQixHQUFHLFVBQVUsRUFBRSxDQUFDO0lBQ3JELE1BQU0sVUFBVSxHQUFHLEdBQUcsaUJBQWlCLEdBQUcsVUFBVSxFQUFFLENBQUM7SUFFdkQsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDbEMsU0FBUyxDQUFDLFlBQVksRUFBRTtRQUN0QixLQUFLLEVBQUUsU0FBUztRQUNoQixRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWE7UUFDNUIsV0FBVyxFQUFFLGtCQUFrQjtRQUMvQixTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUk7S0FDckIsQ0FBQyxDQUFDO0lBRUgsZ0VBQWdFO0lBQ2hFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHFDQUFxQyxDQUFDLENBQUM7SUFDakYsTUFBTSxPQUFPLEdBQUc7UUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1FBQzFCLGNBQWMsRUFBRSxTQUFTO1FBQ3pCLGlCQUFpQixFQUFFLFlBQVk7UUFDL0IsdUJBQXVCO1FBQ3ZCLHNCQUFzQixJQUFJLENBQUMsVUFBVSxFQUFFO1FBQ3ZDLGFBQWEsSUFBSSxDQUFDLElBQUksRUFBRTtRQUN4QixzQkFBc0Isa0JBQWtCLEVBQUU7UUFDMUMsY0FBYyxVQUFVLEVBQUU7UUFDMUIsMkVBQTJFO1FBQzNFLHNFQUFzRTtRQUN0RSxxQ0FBcUM7UUFDckMsMEJBQTBCLFdBQVcsRUFBRTtRQUN2QyxnQkFBZ0IsRUFBRSxzQkFBc0I7UUFDeEMsOEJBQThCO1FBQzlCLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTTtLQUN4QixDQUFDO0lBQ0YsSUFBSSxJQUFJLENBQUMsT0FBTztRQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxRCxZQUFZLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBRW5ELGdGQUFnRjtJQUNoRiwwRUFBMEU7SUFDMUUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztJQUM1RSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLFVBQVUsMkJBQTJCLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLElBQUksQ0FBQztRQUNILEVBQUUsQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDNUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDL0MsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRWxGLE1BQU0sWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLHlCQUF5QixDQUFDO1lBQ3BELFlBQVksRUFBRSxVQUFVO1lBQ3hCLE9BQU8sRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztTQUNsQyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7WUFBUyxDQUFDO1FBQ1QsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxZQUFZLENBQUMsdUJBQXVCLGtCQUFrQixHQUFHLENBQUMsQ0FBQztJQUMzRCxPQUFPLGtCQUFrQixDQUFDO0FBQzVCLENBQUM7QUFFRCx3RUFBd0U7QUFDeEUsS0FBSyxVQUFVLGFBQWEsQ0FDMUIsVUFBa0IsRUFDbEIsR0FBeUM7SUFFekMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLEdBQUcsTUFBTSxjQUFjLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFrRCxDQUFDO1FBQ2hGLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUM1RSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtRQUN2RSxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsT0FBZ0I7SUFDekMsY0FBYyxDQUNaLGlCQUFpQixDQUNmLGdCQUFnQixDQUFDLE9BQU87U0FDckIsT0FBTyxDQUFDLGFBQWEsQ0FBQztTQUN0QixXQUFXLENBQUMseUhBQXlILENBQUM7U0FDdEksTUFBTSxDQUFDLCtCQUErQixFQUFFLHNEQUFzRCxDQUFDO1NBQy9GLE1BQU0sQ0FBQywyQkFBMkIsRUFBRSxnR0FBZ0csQ0FBQztTQUNySSxNQUFNLENBQUMsZUFBZSxFQUFFLGdDQUFnQyxFQUFFLElBQUksQ0FBQztTQUMvRCxNQUFNLENBQUMsaUJBQWlCLEVBQUUsOEZBQThGLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7U0FDaEssTUFBTSxDQUFDLGtCQUFrQixFQUFFLHlGQUF5RixDQUFDO1NBQ3JILE1BQU0sQ0FBQyxXQUFXLEVBQUUsMkZBQTJGLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FDNUg7U0FDRSxNQUFNLENBQUMsWUFBWSxFQUFFLG9HQUFvRyxFQUFFLEtBQUssQ0FBQztTQUNqSSxNQUFNLENBQUMsZUFBZSxFQUFFLG9JQUFvSSxDQUFDO1NBQzdKLE1BQU0sQ0FBQyxRQUFRLEVBQUUsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLENBQ3BEO1NBQ0UsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUN4QixNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTFGLElBQUksQ0FBQztZQUNILGVBQWUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFbkMsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hELE1BQU0sR0FBRyxHQUFHLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBNkIsRUFBRSxDQUFDO1lBRXZFLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDMUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFFN0MsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQTJCLENBQUM7WUFDbEQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM1RCxJQUFJLEtBQUssSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixLQUFLLGlCQUFpQixNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckcsQ0FBQztZQUNELHFFQUFxRTtZQUNyRSxrRUFBa0U7WUFDbEUsTUFBTSxRQUFRLEdBQUcsVUFBVSxJQUFJLGdCQUFnQixDQUFDO1lBQ2hELE1BQU0sV0FBVyxHQUFJLE9BQU8sQ0FBQyxPQUE4QixJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFFaEYseUVBQXlFO1lBQ3pFLDBFQUEwRTtZQUMxRSx1RUFBdUU7WUFDdkUsd0VBQXdFO1lBQ3hFLHdFQUF3RTtZQUN4RSxNQUFNLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRW5DLDBFQUEwRTtZQUMxRSxxRUFBcUU7WUFDckUsb0RBQW9EO1lBQ3BELE1BQU0sUUFBUSxHQUFJLE9BQU8sQ0FBQyxRQUErQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUM7WUFDM0YsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxJQUFJLEtBQUssQ0FDYixpR0FBaUc7c0JBQy9GLHVEQUF1RCxDQUMxRCxDQUFDO1lBQ0osQ0FBQztZQUVELFlBQVksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBRTlDLE1BQU0sTUFBTSxHQUFHLE1BQU0sOEJBQThCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFN0QsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ25CLG9FQUFvRTtnQkFDcEUsNENBQTRDO2dCQUM1QyxNQUFNLElBQUksR0FBRztvQkFDWCxjQUFjLEVBQUUsV0FBVztvQkFDM0IsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDLFdBQVc7b0JBQzdELEtBQUssRUFBRSxLQUFLLElBQUksbUNBQW1DO29CQUNuRCxVQUFVLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsSUFBSSxHQUFHLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQzdILE1BQU07b0JBQ04sYUFBYSxFQUFFLElBQUk7aUJBQ3BCLENBQUM7Z0JBQ0YsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqRixDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDaEIsWUFBWSxDQUFDLDJCQUEyQixDQUFDLENBQUM7b0JBQzFDLGFBQWEsQ0FBQzt3QkFDWixpQkFBaUIsRUFBRSxJQUFJLENBQUMsY0FBYzt3QkFDdEMsT0FBTyxFQUFFLElBQUksQ0FBQyxLQUFLO3dCQUNuQixXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUs7d0JBQ3ZCLGFBQWEsRUFBRSxJQUFJLENBQUMsVUFBVTt3QkFDOUIsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNO3dCQUNyQixZQUFZLEVBQUUsR0FBRyxJQUFJLE9BQU87cUJBQzdCLENBQUMsQ0FBQztvQkFDSCxZQUFZLENBQUMsMERBQTBELENBQUMsQ0FBQztnQkFDM0UsQ0FBQztnQkFDRCxPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sT0FBTyxHQUFHLEdBQUcsV0FBVyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzFFLE1BQU0sV0FBVyxHQUFHLE1BQU0sMEJBQTBCLENBQUM7Z0JBQ25ELE1BQU07Z0JBQ04sUUFBUSxFQUFFLFFBQVM7Z0JBQ25CLFdBQVc7Z0JBQ1gsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO2dCQUNqQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU87Z0JBQy9CLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDM0IsZ0JBQWdCO2dCQUNoQixPQUFPO2FBQ1IsQ0FBQyxDQUFDO1lBRUgsWUFBWSxDQUFDLGtDQUFrQyxXQUFXLGNBQWMsV0FBVyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFFbEcsb0VBQW9FO1lBQ3BFLHFFQUFxRTtZQUNyRSxzRUFBc0U7WUFDdEUsd0NBQXdDO1lBQ3hDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CO21CQUM5QyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUUvRixRQUFRLENBQUMsYUFBYSxFQUFFO2dCQUN0QixXQUFXO2dCQUNYLFVBQVU7Z0JBQ1YsSUFBSTtnQkFDSixjQUFjLEVBQUUsV0FBVztnQkFDM0IsS0FBSyxFQUFFLEtBQUssSUFBSSxJQUFJO2dCQUNwQixLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUs7YUFDekIsQ0FBQyxDQUFDO1lBRUgsU0FBUyxDQUFDLFlBQVksRUFBRTtnQkFDdEIsVUFBVTtnQkFDVixNQUFNO2dCQUNOLGNBQWMsRUFBRSxXQUFXO2dCQUMzQixLQUFLLEVBQUUsS0FBSyxJQUFJLFFBQVE7Z0JBQ3hCLElBQUk7Z0JBQ0osU0FBUyxFQUFFLEdBQUcsZ0JBQWdCLEdBQUc7YUFDbEMsQ0FBQyxDQUFDO1lBRUgsMEVBQTBFO1lBQzFFLDhDQUE4QztZQUM5QyxNQUFNLFFBQVEsR0FBRyxNQUFNLGFBQWEsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFdEQsbUVBQW1FO1lBQ25FLHNFQUFzRTtZQUN0RSwwRUFBMEU7WUFDMUUsNERBQTREO1lBQzVELHdFQUF3RTtZQUN4RSw0RUFBNEU7WUFDNUUsaUVBQWlFO1lBQ2pFLDBFQUEwRTtZQUMxRSx5QkFBeUI7WUFDekIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDakMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxjQUFjO2dCQUNwQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEdBQUc7Z0JBQ3pCLFdBQVcsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFO2dCQUNoQyxjQUFjLEVBQUUsV0FBVyxDQUFDLGNBQWM7Z0JBQzFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxnQkFBZ0I7Z0JBQzlDLGtCQUFrQixFQUFFLFdBQVcsQ0FBQyxrQkFBa0I7Z0JBQ2xELEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSztnQkFDeEIsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLO2dCQUN4QixTQUFTLEVBQUUsZ0JBQWdCO2dCQUMzQixTQUFTLEVBQUUsV0FBVyxDQUFDLFNBQVM7Z0JBQ2hDLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRTthQUNwQyxDQUFDLENBQUM7WUFFSCxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFMUIsTUFBTSxXQUFXLEdBQUcseUNBQXlDLFdBQVcsY0FBYyxXQUFXLENBQUMsU0FBUyxHQUFHLENBQUM7WUFDL0csTUFBTSxZQUFZLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFOUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxZQUFZLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBRWhELHlFQUF5RTtZQUN6RSx3RUFBd0U7WUFDeEUsdUVBQXVFO1lBQ3ZFLG1DQUFtQztZQUNuQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLGdCQUFnQixLQUFLLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNqRixJQUFJLENBQUM7b0JBQ0gsTUFBTSx1QkFBdUIsQ0FDM0IsTUFBTSxFQUFFLFFBQVMsRUFBRSxXQUFXLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUM1RixDQUFDO29CQUNGLFlBQVksQ0FBQyw2QkFBNkIsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQy9ELENBQUM7Z0JBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztvQkFDYixZQUFZLENBQ1YsOERBQThELFFBQVEsQ0FBQyxLQUFLLEtBQUs7MEJBQy9FLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQywwQ0FBMEM7MEJBQzlELHNEQUFzRCxDQUN6RCxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1lBRUQsNkVBQTZFO1lBQzdFLElBQUksa0JBQXNDLENBQUM7WUFDM0MsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsSUFBSSxrQkFBa0IsQ0FBQztnQkFDN0Ysa0JBQWtCLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQztvQkFDN0MsVUFBVTtvQkFDVixJQUFJO29CQUNKLGFBQWE7b0JBQ2IsTUFBTTtvQkFDTixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87aUJBQ3pCLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUN6QixPQUFPLEVBQUUsSUFBSTtvQkFDYixVQUFVO29CQUNWLFNBQVMsRUFBRSxHQUFHO29CQUNkLE1BQU07b0JBQ04sY0FBYyxFQUFFLFdBQVc7b0JBQzNCLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxnQkFBZ0I7b0JBQzlDLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSztvQkFDeEIsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLO29CQUN4QixhQUFhLEVBQUUsSUFBSTtvQkFDbkIsU0FBUyxFQUFFLFdBQVcsQ0FBQyxTQUFTO29CQUNoQyxRQUFRLEVBQUUsa0JBQWtCLElBQUksSUFBSTtpQkFDckMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNmLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQixZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBRTNCLGFBQWEsQ0FBQztvQkFDWixhQUFhLEVBQUUsVUFBVTtvQkFDekIsWUFBWSxFQUFFLEdBQUc7b0JBQ2pCLFFBQVEsRUFBRSxNQUFNO29CQUNoQixpQkFBaUIsRUFBRSxXQUFXO29CQUM5QixXQUFXLEVBQUUsV0FBVyxDQUFDLEtBQUssSUFBSSxtQ0FBbUM7b0JBQ3JFLFFBQVEsRUFBRSxXQUFXLENBQUMsS0FBSztvQkFDM0IsWUFBWSxFQUFFLEdBQUcsSUFBSSxPQUFPO29CQUM1QixVQUFVLEVBQUUsV0FBVyxDQUFDLFNBQVM7b0JBQ2pDLGFBQWEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7b0JBQ2pHLFFBQVEsRUFBRSxVQUFVO2lCQUNyQixDQUFDLENBQUM7Z0JBRUgsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDaEIsWUFBWSxDQUFDLHVDQUF1QyxDQUFDLENBQUM7Z0JBQ3RELFNBQVMsQ0FBQyxpQ0FBaUMsVUFBVSxFQUFFLENBQUMsQ0FBQztnQkFDekQsU0FBUyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7Z0JBQ2pGLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2hCLElBQUksa0JBQWtCLEVBQUUsQ0FBQztvQkFDdkIsU0FBUyxDQUFDLDRCQUE0QixrQkFBa0Isb0NBQW9DLFdBQVcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO2dCQUN4SCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sU0FBUyxDQUFDLGlCQUFpQixXQUFXLENBQUMsU0FBUyxvREFBb0QsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDNUcsU0FBUyxDQUFDLCtEQUErRCxDQUFDLENBQUM7Z0JBQzdFLENBQUM7WUFDSCxDQUFDO1FBRUgsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixXQUFXLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxXQUFXLEVBQUU7Z0JBQzFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSztnQkFDM0IsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsT0FBTyxFQUFFO29CQUNQLE9BQU8sRUFBRSxhQUFhO29CQUN0QixXQUFXO29CQUNYLFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixJQUFJLHdCQUF3QjtpQkFDekU7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGV4ZWNGaWxlU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgTGFtYmRhQ2xpZW50LCBVcGRhdGVGdW5jdGlvbkNvZGVDb21tYW5kIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWxhbWJkYSc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IEFQUF9WRVJTSU9OLCB2YWxpZGF0ZU51bWJlciB9IGZyb20gJy4uL2NvbmZpZy9jbGkuY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IGF1ZGl0TG9nIH0gZnJvbSAnLi4vdXRpbHMvYXVkaXQtbG9nLmpzJztcbmltcG9ydCB7IHJlc29sdmVBd3NSZWdpb24gfSBmcm9tICcuLi91dGlscy9hd3MtZW52LmpzJztcbmltcG9ydCB7IHVwc2VydFNlY3JldCwgZ2V0U2VjcmV0QXJuLCBnZXRTZWNyZXRWYWx1ZSB9IGZyb20gJy4uL3V0aWxzL2F3cy1zZWNyZXRzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnRBc3luYywgcHJpbnRDb21tYW5kSGVhZGVyLCBwcmludFNzbFdhcm5pbmcsIHdpdGhQcm9maWxlT3B0aW9uLCB3aXRoUmVnaW9uT3B0aW9uLCB3aXRoU3NsT3B0aW9ucyB9IGZyb20gJy4uL3V0aWxzL2NvbW1hbmQtdXRpbHMuanMnO1xuaW1wb3J0IHsgdG9FdmVudEJyaWRnZUNyb24gfSBmcm9tICcuLi91dGlscy9jcm9uLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRJbmZvLCBwcmludEtleVZhbHVlLCBwcmludFNlY3Rpb24sIHByaW50U3VjY2VzcywgcHJpbnRXYXJuaW5nIH0gZnJvbSAnLi4vdXRpbHMvb3V0cHV0LXV0aWxzLmpzJztcbmltcG9ydCB7IGVuc3VyZVBsYXRmb3JtVG9rZW4sIHNjb3BlU2VjcmV0TGVhZiwgc2VjcmV0TmFtZUZvck9yZyB9IGZyb20gJy4uL3V0aWxzL3BsYXRmb3JtLXNlY3JldC5qcyc7XG5pbXBvcnQgeyBwcm92aXNpb25TZXJ2aWNlQWNjb3VudEtleSwgcmV2b2tlU2VydmljZUFjY291bnRLZXkgfSBmcm9tICcuLi91dGlscy9zZXJ2aWNlLWFjY291bnQuanMnO1xuXG4vLyBFU00gaGFzIG5vIF9fZGlybmFtZTsgZGVyaXZlIGl0IGZyb20gdGhpcyBtb2R1bGUncyBVUkwuXG5jb25zdCBfX2Rpcm5hbWUgPSBwYXRoLmRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxuY29uc3QgUkVORVdfU1RBQ0tfTkFNRSA9ICdwaXBlbGluZS1idWlsZGVyLXRva2VuLXJlbmV3Jztcbi8vIENGTi1tYW5hZ2VkIExhbWJkYSBmdW5jdGlvbiBuYW1lIOKAlCBrZWVwIGluIHN5bmMgd2l0aCB0b2tlbi1yZW5ldy1zdGFjay5qc29uLlxuY29uc3QgUkVORVdfTEFNQkRBX05BTUUgPSAncGlwZWxpbmUtYnVpbGRlci10b2tlbi1yZW5ldyc7XG4vLyBEZWZhdWx0IDUtZmllbGQgY3JvbiAoZGFpbHkgYXQgbWlkbmlnaHQpIHdoZW4gbmVpdGhlciAtLWNyb24gbm9yIFRPS0VOX1JFTkVXX1NDSEVEVUxFIGlzIHNldC5cbmNvbnN0IERFRkFVTFRfUkVORVdfQ1JPTiA9ICcwIDAgKiAqIConO1xuXG4vKipcbiAqIENhcGFiaWxpdHkgc2NvcGVzIGEgc3RvcmVkIGNyZWRlbnRpYWwgbWF5IGNhcnJ5LCBhbmQgd2hhdCBlYWNoIG9uZSBpcyBGT1IuXG4gKlxuICogQSBzY29wZWQga2V5IGV4Y2hhbmdlcyB0byBhIHRva2VuIHdpdGggbm8gcGVybWlzc2lvbnMgYW5kIG5vIGFkbWluIGZsYWdzIGF0XG4gKiBhbGwg4oCUIG9ubHkgdGhlIG9uZSBjYXBhYmlsaXR5IOKAlCBzbyBpdCBpcyB0aGUgc2hhcGUgZXZlcnkgYXV0b21hdGlvbiB0aGF0IGRvZXNcbiAqIGV4YWN0bHkgb25lIHRoaW5nIHNob3VsZCBob2xkICgjMTIpLiBUaGUgdW5zY29wZWQgYHBsYXRmb3JtYCBjcmVkZW50aWFsIGlzIHRoZVxuICogcmVtYWluaW5nIGZ1bGwtcHJpdmlsZWdlIG9uZTogc3ludGgvZGVwbG95IGNhbGxiYWNrcyBhbmQgdGhlIHBsdWdpbi1sb29rdXBcbiAqIExhbWJkYSBjYWxsIHRoZSBvcmRpbmFyeSBBUEkgc3VyZmFjZSwgd2hpY2ggbm8gc2luZ2xlIHNjb3BlIGNvdmVycy5cbiAqL1xuY29uc3QgU0NPUEVfQ0FUQUxPRzogUmVjb3JkPHN0cmluZywgeyBhY2NvdW50OiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmcgfT4gPSB7XG4gICdyZXBvcnRpbmc6aW5nZXN0Jzoge1xuICAgIGFjY291bnQ6ICdyZXBvcnRpbmctaW5nZXN0JyxcbiAgICBkZXNjcmlwdGlvbjogJ0FXUyBwaXBlbGluZS1ldmVudCBpbmdlc3Rpb24gKHRoZSBldmVudHMgTGFtYmRhIFBPU1RzIC9yZXBvcnRzL2V2ZW50cyknLFxuICB9LFxuICAncmVnaXN0cnk6cHVzaCc6IHtcbiAgICBhY2NvdW50OiAncmVnaXN0cnktcHVzaCcsXG4gICAgZGVzY3JpcHRpb246ICdDSSBpbWFnZSBwdXNoZXMgaW50byB0aGlzIG9yZ+KAmXMgcmVnaXN0cnkgbmFtZXNwYWNlIChDb2RlQnVpbGQg4oaSIC90b2tlbiknLFxuICB9LFxufTtcblxuLyoqIFRoZSBhY2NvdW50IHRoYXQgaG9sZHMgdGhlIHVuc2NvcGVkLCBmdWxsLXByaXZpbGVnZSBzdG9yZWQgY3JlZGVudGlhbC4gKi9cbmNvbnN0IFBMQVRGT1JNX0FDQ09VTlQgPSB7XG4gIGFjY291bnQ6ICdwbGF0Zm9ybS1hdXRvbWF0aW9uJyxcbiAgZGVzY3JpcHRpb246ICdTdG9yZWQgcGxhdGZvcm0gY3JlZGVudGlhbCBmb3IgQ0RLIHN5bnRoL2RlcGxveSwgcGx1Z2luIGxvb2t1cCBhbmQgaW1hZ2UgcHVzaGVzJyxcbn07XG5cbi8qKlxuICogRGVwbG95IChvciB1cGRhdGUpIHRoZSBvbmNlLWEtZGF5IEtFWSBST1RBVElPTiBzdGFjazogYSBzY2hlZHVsZWQgTGFtYmRhIHRoYXRcbiAqIHJlcGxhY2VzIHRoZSBzZXJ2aWNlLWFjY291bnQga2V5IGluIHRoaXMgc2VjcmV0IGJlZm9yZSBpdCBleHBpcmVzLiBNaXJyb3JzXG4gKiBzZXR1cC1ldmVudHMg4oCUIGBhd3MgY2xvdWRmb3JtYXRpb24gZGVwbG95YCBmb3IgdGhlIGluZnJhLCB0aGVuIGEgZGlyZWN0XG4gKiBVcGRhdGVGdW5jdGlvbkNvZGUgd2l0aCB0aGUgcm90YXRvciBoYW5kbGVyIGNvbXBpbGVkIGFsb25nc2lkZSB0aGlzIENMSSAoc2VlXG4gKiBzcmMvbGFtYmRhL3Rva2VuLXJlbmV3LWhhbmRsZXIudHMpLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZXBsb3lSZW5ld1NjaGVkdWxlKG9wdHM6IHtcbiAgc2VjcmV0TmFtZTogc3RyaW5nO1xuICBkYXlzOiBudW1iZXI7XG4gIGZpdmVGaWVsZENyb246IHN0cmluZztcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIHByb2ZpbGU/OiBzdHJpbmc7XG59KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgc2NoZWR1bGVFeHByZXNzaW9uID0gdG9FdmVudEJyaWRnZUNyb24ob3B0cy5maXZlRmllbGRDcm9uKTsgLy8gdmFsaWRhdGVzICsgMTUtbWluIGd1YXJkXG5cbiAgLy8gTmFtZSByZW5ld2FsIHJlc291cmNlcyBwZXItc2VjcmV0IHNvIGEgc2NvcGVkLWNyZWRlbnRpYWwgc3RhY2sgKGUuZy4gdGhlXG4gIC8vIHJlcG9ydGluZy1pbmdlc3Qga2V5IHRoZSBldmVudCBMYW1iZGEgcmVhZHMpIGNvZXhpc3RzIHdpdGggdGhlXG4gIC8vIHBsYXRmb3JtLWNyZWRlbnRpYWwgc3RhY2sgaW5zdGVhZCBvZiBjb2xsaWRpbmcgb24gdGhlIChhY2NvdW50LWdsb2JhbCkgSUFNXG4gIC8vIHJvbGUgLyBMYW1iZGEgLyBydWxlIG5hbWVzLiBUaGUgcGxhdGZvcm0gc2VjcmV0IGtlZXBzIHRoZSBiYXJlIG5hbWVcbiAgLy8gKHN1ZmZpeCAnJykgc28gZXhpc3RpbmcgZGVwbG95bWVudHMnIHN0YWNrIGlzIHVwZGF0ZWQgaW4gcGxhY2UsIG5vdFxuICAvLyBkdXBsaWNhdGVkOyBhbnkgb3RoZXIgc2VjcmV0IGFwcGVuZHMgaXRzIHRyYWlsaW5nIHBhdGggc2VnbWVudC5cbiAgY29uc3Qgc2VjcmV0TGVhZiA9IG9wdHMuc2VjcmV0TmFtZS5yZXBsYWNlKC8uKlxcLy8sICcnKTsgLy8gJ3BsYXRmb3JtJyB8ICdyZXBvcnRpbmctaW5nZXN0JyB8IOKAplxuICBjb25zdCBuYW1lU3VmZml4ID0gc2VjcmV0TGVhZiA9PT0gJ3BsYXRmb3JtJyA/ICcnIDogYC0ke3NlY3JldExlYWYucmVwbGFjZSgvW15hLXowLTldKy9naSwgJy0nKX1gO1xuICBjb25zdCBzdGFja05hbWUgPSBgJHtSRU5FV19TVEFDS19OQU1FfSR7bmFtZVN1ZmZpeH1gO1xuICBjb25zdCBsYW1iZGFOYW1lID0gYCR7UkVORVdfTEFNQkRBX05BTUV9JHtuYW1lU3VmZml4fWA7XG5cbiAgcHJpbnRTZWN0aW9uKCdTY2hlZHVsZSBSb3RhdGlvbicpO1xuICBwcmludEluZm8oJ1BhcmFtZXRlcnMnLCB7XG4gICAgc3RhY2s6IHN0YWNrTmFtZSxcbiAgICBzY2hlZHVsZTogb3B0cy5maXZlRmllbGRDcm9uLFxuICAgIGV2ZW50YnJpZGdlOiBzY2hlZHVsZUV4cHJlc3Npb24sXG4gICAgcmVuZXdEYXlzOiBvcHRzLmRheXMsXG4gIH0pO1xuXG4gIC8vIFN0ZXAgMTogaW5mcmEgKExhbWJkYSBnZXRzIHBsYWNlaG9sZGVyIGNvZGUgb24gZmlyc3QgY3JlYXRlKS5cbiAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL3RlbXBsYXRlcy90b2tlbi1yZW5ldy1zdGFjay5qc29uJyk7XG4gIGNvbnN0IGNmbkFyZ3MgPSBbXG4gICAgJ2Nsb3VkZm9ybWF0aW9uJywgJ2RlcGxveScsXG4gICAgJy0tc3RhY2stbmFtZScsIHN0YWNrTmFtZSxcbiAgICAnLS10ZW1wbGF0ZS1maWxlJywgdGVtcGxhdGVQYXRoLFxuICAgICctLXBhcmFtZXRlci1vdmVycmlkZXMnLFxuICAgIGBQbGF0Zm9ybVNlY3JldE5hbWU9JHtvcHRzLnNlY3JldE5hbWV9YCxcbiAgICBgUmVuZXdEYXlzPSR7b3B0cy5kYXlzfWAsXG4gICAgYFNjaGVkdWxlRXhwcmVzc2lvbj0ke3NjaGVkdWxlRXhwcmVzc2lvbn1gLFxuICAgIGBOYW1lU3VmZml4PSR7bmFtZVN1ZmZpeH1gLFxuICAgIC8vIFJlY29yZGVkIGZvciBwcm92ZW5hbmNlIG9ubHkg4oCUIHRoZSByb3RhdG9yIG5vIGxvbmdlciBpbnN0YWxscyB0aGUgQ0xJIGF0XG4gICAgLy8gcnVudGltZSAoaXQgc3BlYWtzIHRvIHRoZSBwbGF0Zm9ybSBkaXJlY3RseSksIGJ1dCBrbm93aW5nIHdoaWNoIENMSVxuICAgIC8vIGRlcGxveWVkIGEgc3RhY2sgaXMgd29ydGgga2VlcGluZy5cbiAgICBgUGlwZWxpbmVNYW5hZ2VyVmVyc2lvbj0ke0FQUF9WRVJTSU9OfWAsXG4gICAgJy0tY2FwYWJpbGl0aWVzJywgJ0NBUEFCSUxJVFlfTkFNRURfSUFNJyxcbiAgICAnLS1uby1mYWlsLW9uLWVtcHR5LWNoYW5nZXNldCcsXG4gICAgJy0tcmVnaW9uJywgb3B0cy5yZWdpb24sXG4gIF07XG4gIGlmIChvcHRzLnByb2ZpbGUpIGNmbkFyZ3MucHVzaCgnLS1wcm9maWxlJywgb3B0cy5wcm9maWxlKTtcbiAgZXhlY0ZpbGVTeW5jKCdhd3MnLCBjZm5BcmdzLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG5cbiAgLy8gU3RlcCAyOiB1cGxvYWQgdGhlIHJlYWwgaGFuZGxlci4gSXQncyBFU00sIHNvIHRoZSB6aXAgZW50cnkgbXVzdCBiZSBpbmRleC5tanNcbiAgLy8gKEhhbmRsZXIgc3RheXMgaW5kZXguaGFuZGxlciDigJQgbm9kZWpzMjQueCByZXNvbHZlcyB0aGUgLm1qcyBleHRlbnNpb24pLlxuICBjb25zdCBoYW5kbGVyU3JjID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2xhbWJkYS90b2tlbi1yZW5ldy1oYW5kbGVyLmpzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhoYW5kbGVyU3JjKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVG9rZW4tcmVuZXcgaGFuZGxlciBub3QgZm91bmQgYXQgJHtoYW5kbGVyU3JjfSDigJQgd2FzIHRoZSBwYWNrYWdlIGJ1aWx0P2ApO1xuICB9XG4gIGNvbnN0IHRtcERpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3Rva2VuLXJlbmV3LScpKTtcbiAgdHJ5IHtcbiAgICBmcy5jb3B5RmlsZVN5bmMoaGFuZGxlclNyYywgcGF0aC5qb2luKHRtcERpciwgJ2luZGV4Lm1qcycpKTtcbiAgICBjb25zdCB6aXBQYXRoID0gcGF0aC5qb2luKHRtcERpciwgJ2luZGV4LnppcCcpO1xuICAgIGV4ZWNGaWxlU3luYygnemlwJywgWyctaicsIHppcFBhdGgsICdpbmRleC5tanMnXSwgeyBjd2Q6IHRtcERpciwgc3RkaW86ICdwaXBlJyB9KTtcblxuICAgIGNvbnN0IGxhbWJkYUNsaWVudCA9IG5ldyBMYW1iZGFDbGllbnQoeyByZWdpb246IG9wdHMucmVnaW9uIH0pO1xuICAgIGF3YWl0IGxhbWJkYUNsaWVudC5zZW5kKG5ldyBVcGRhdGVGdW5jdGlvbkNvZGVDb21tYW5kKHtcbiAgICAgIEZ1bmN0aW9uTmFtZTogbGFtYmRhTmFtZSxcbiAgICAgIFppcEZpbGU6IGZzLnJlYWRGaWxlU3luYyh6aXBQYXRoKSxcbiAgICB9KSk7XG4gIH0gZmluYWxseSB7XG4gICAgZnMucm1TeW5jKHRtcERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpbnRTdWNjZXNzKGBSb3RhdGlvbiBzY2hlZHVsZWQgKCR7c2NoZWR1bGVFeHByZXNzaW9ufSlgKTtcbiAgcmV0dXJuIHNjaGVkdWxlRXhwcmVzc2lvbjtcbn1cblxuLyoqIFJlYWQgdGhlIGtleSBpZCBhIHByZXZpb3VzIHJ1biBzdG9yZWQsIHNvIHRoaXMgcnVuIGNhbiByZXRpcmUgaXQuICovXG5hc3luYyBmdW5jdGlvbiBwcmV2aW91c0tleUlkKFxuICBzZWNyZXROYW1lOiBzdHJpbmcsXG4gIGF3czogeyByZWdpb246IHN0cmluZzsgcHJvZmlsZT86IHN0cmluZyB9LFxuKTogUHJvbWlzZTx7IGtleUlkPzogc3RyaW5nOyBzZXJ2aWNlQWNjb3VudElkPzogc3RyaW5nIH0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBhd2FpdCBnZXRTZWNyZXRWYWx1ZShzZWNyZXROYW1lLCBhd3MpO1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyB7IGtleUlkPzogc3RyaW5nOyBzZXJ2aWNlQWNjb3VudElkPzogc3RyaW5nIH07XG4gICAgcmV0dXJuIHsga2V5SWQ6IHBhcnNlZC5rZXlJZCwgc2VydmljZUFjY291bnRJZDogcGFyc2VkLnNlcnZpY2VBY2NvdW50SWQgfTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gc2VjcmV0IHlldCAoZmlyc3QgcnVuKSwgb3Igb25lIHdyaXR0ZW4gYmVmb3JlIHRoZSBzZXJ2aWNlLWFjY291bnRcbiAgICAvLyBjdXRvdmVyIChubyBrZXlJZCkuIEVpdGhlciB3YXkgdGhlcmUgaXMgbm90aGluZyB0aGlzIHJ1biBjYW4gcmV0aXJlLlxuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgYHN0b3JlLXRva2VuYCBjb21tYW5kIHdpdGggdGhlIENMSSBwcm9ncmFtLlxuICpcbiAqIFByb3Zpc2lvbnMgdGhlIG9yZydzIG1hY2hpbmUgaWRlbnRpdHkg4oCUIGEgU0VSVklDRSBBQ0NPVU5UIGFuZCBvbmUgYHBiX3NhX+KApmBcbiAqIGtleSDigJQgYW5kIHN0b3JlcyB0aGUga2V5IGluIEFXUyBTZWNyZXRzIE1hbmFnZXIgZm9yIENESyBkZXBsb3ltZW50cyxcbiAqIENvZGVCdWlsZCdzIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzLCB0aGUgcGx1Z2luLWxvb2t1cCBMYW1iZGEgYW5kIHRoZSBldmVudFxuICogaW5nZXN0aW9uIExhbWJkYSAoIzEyIC8gI04yKS4gTm90aGluZyBzdG9yZWQgaXMgdGllZCB0byBhIHBlcnNvbidzIHNlc3Npb24gYW55XG4gKiBtb3JlOiB0aGUgYWNjb3VudCBvdXRsaXZlcyBpdHMgY3JlYXRvciwgdGFrZXMgbm8gc2VhdCwgYW5kIGV2ZXJ5IGF1ZGl0IHJvdyBpdFxuICogcHJvZHVjZXMgbmFtZXMgdGhlIGFjY291bnQuXG4gKlxuICogQmVjYXVzZSBjcmVhdGluZyBhbiBhY2NvdW50IGFuZCBpc3N1aW5nIGl0cyBrZXkgYXJlIHN0ZXAtdXAgZ2F0ZWQsIHRoaXMgbmVlZHNcbiAqIHRoZSBvcGVyYXRvcidzIHBhc3N3b3JkIOKAlCBgLS1wYXNzd29yZGAsIG9yIHRoZSBgUExBVEZPUk1fUEFTU1dPUkRgIGVudiB2YXJcbiAqIChwcmVmZXJyZWQ6IGl0IGtlZXBzIHRoZSBwYXNzd29yZCBvdXQgb2Ygc2hlbGwgaGlzdG9yeSBhbmQgcGxhbiBvdXRwdXQpLlxuICpcbiAqIEJ5IGRlZmF1bHQgaXQgT05MWSB3cml0ZXMgdGhlIHNlY3JldC4gUGFzcyAtLXNjaGVkdWxlIHRvIGFsc28gZGVwbG95IHRoZSBkYWlseVxuICogS0VZIFJPVEFUSU9OIHN0YWNrIChhIExhbWJkYSB0aGF0IHJlcGxhY2VzIHRoZSBrZXkgYmVmb3JlIGl0IGV4cGlyZXMpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBiYXNoXG4gKiBQTEFURk9STV9QQVNTV09SRD0qKiogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXJlZ2lvbiB1cy1lYXN0LTFcbiAqIFBMQVRGT1JNX1BBU1NXT1JEPSoqKiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tZGF5cyA5MCAtLXJlZ2lvbiB1cy1lYXN0LTFcbiAqIFBMQVRGT1JNX1BBU1NXT1JEPSoqKiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tc2NoZWR1bGUgLS1yZWdpb24gdXMtZWFzdC0xICAgICAjICsgZGFpbHkgcm90YXRpb25cbiAqIFBMQVRGT1JNX1BBU1NXT1JEPSoqKiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tc2NvcGUgcmVwb3J0aW5nOmluZ2VzdCAtLXNjaGVkdWxlXG4gKiBQTEFURk9STV9QQVNTV09SRD0qKiogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXNjb3BlIHJlZ2lzdHJ5OnB1c2ggLS1zY2hlZHVsZVxuICogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLWRyeS1ydW5cbiAqIHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW4gLXUgYWRtaW4gLXAgJyoqKicgLS1yZWdpb24gdXMtZWFzdC0xXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlVG9rZW4ocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICB3aXRoU3NsT3B0aW9ucyhcbiAgICB3aXRoUHJvZmlsZU9wdGlvbihcbiAgICAgIHdpdGhSZWdpb25PcHRpb24ocHJvZ3JhbVxuICAgICAgICAuY29tbWFuZCgnc3RvcmUtdG9rZW4nKVxuICAgICAgICAuZGVzY3JpcHRpb24oJ1Byb3Zpc2lvbiBhbiBvcmcgc2VydmljZS1hY2NvdW50IGtleSAoaXRzIG93biBtYWNoaW5lIGlkZW50aXR5KSBhbmQgc3RvcmUgaXQgaW4gQVdTIFNlY3JldHMgTWFuYWdlciBmb3IgQ0RLIGRlcGxveW1lbnRzJylcbiAgICAgICAgLm9wdGlvbignLXUsIC0taWRlbnRpZmllciA8aWRlbnRpZmllcj4nLCAnVXNlcm5hbWUgb3IgZW1haWwgKHNraXBzIFBMQVRGT1JNX1RPS0VOIHJlcXVpcmVtZW50KScpXG4gICAgICAgIC5vcHRpb24oJy1wLCAtLXBhc3N3b3JkIDxwYXNzd29yZD4nLCAnTG9naW4gcGFzc3dvcmQg4oCUIGFsc28gdXNlZCBmb3IgdGhlIHN0ZXAtdXAgZXZlcnkga2V5IHdyaXRlIHJlcXVpcmVzIChwcmVmZXIgUExBVEZPUk1fUEFTU1dPUkQpJylcbiAgICAgICAgLm9wdGlvbignLS1kYXlzIDxkYXlzPicsICdLZXkgbGlmZXRpbWUgaW4gZGF5cyAobWF4IDM2NSknLCAnMzAnKVxuICAgICAgICAub3B0aW9uKCctLXNjb3BlIDxzY29wZT4nLCBgUHJvdmlzaW9uIGEgbGVhc3QtcHJpdmlsZWdlIHNjb3BlZCBrZXkgaW5zdGVhZCBvZiB0aGUgZnVsbC1wcml2aWxlZ2UgcGxhdGZvcm0gb25lLiBPbmUgb2Y6ICR7T2JqZWN0LmtleXMoU0NPUEVfQ0FUQUxPRykuam9pbignLCAnKX1gKVxuICAgICAgICAub3B0aW9uKCctLWFjY291bnQgPG5hbWU+JywgJ092ZXJyaWRlIHRoZSBzZXJ2aWNlLWFjY291bnQgbmFtZSB0aGlzIGtleSBpcyBpc3N1ZWQgb24gKGRlZmF1bHQ6IGRlcml2ZWQgZnJvbSAtLXNjb3BlKScpXG4gICAgICAgIC5vcHRpb24oJy0tZHJ5LXJ1bicsICdTaG93IHdoYXQgd291bGQgYmUgcHJvdmlzaW9uZWQgd2l0aG91dCBjYWxsaW5nIHRoZSBwbGF0Zm9ybSBvciB3cml0aW5nIHRvIFNlY3JldHMgTWFuYWdlcicsIGZhbHNlKSksXG4gICAgKVxuICAgICAgLm9wdGlvbignLS1zY2hlZHVsZScsICdBbHNvIGRlcGxveSB0aGUgZGFpbHkga2V5LXJvdGF0aW9uIHN0YWNrIHRoYXQgcmVwbGFjZXMgdGhpcyBrZXkgYmVmb3JlIGl0IGV4cGlyZXMgKG9mZiBieSBkZWZhdWx0KScsIGZhbHNlKVxuICAgICAgLm9wdGlvbignLS1jcm9uIDxleHByPicsICdSb3RhdGlvbiBzY2hlZHVsZSBhcyBhIDUtZmllbGQgY3JvbiwgdXNlZCB3aXRoIC0tc2NoZWR1bGUgKGRlZmF1bHQ6IFRPS0VOX1JFTkVXX1NDSEVEVUxFIGVudiBvciBcIjAgMCAqICogKlwiOyBtaW4gZXZlcnkgMTUgbWludXRlcyknKVxuICAgICAgLm9wdGlvbignLS1qc29uJywgJ091dHB1dCByZXN1bHQgYXMgSlNPTicsIGZhbHNlKSxcbiAgKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gcHJpbnRDb21tYW5kSGVhZGVyKCdTdG9yZSBUb2tlbicsIHVuZGVmaW5lZCwgeyBxdWlldDogb3B0aW9ucy5qc29uIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBwcmludFNzbFdhcm5pbmcob3B0aW9ucy52ZXJpZnlTc2wpO1xuXG4gICAgICAgIGNvbnN0IHJlZ2lvbiA9IHJlc29sdmVBd3NSZWdpb24ob3B0aW9ucy5yZWdpb24pO1xuICAgICAgICBjb25zdCBhd3MgPSB7IHJlZ2lvbiwgcHJvZmlsZTogb3B0aW9ucy5wcm9maWxlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCB9O1xuXG4gICAgICAgIGNvbnN0IGRheXMgPSB2YWxpZGF0ZU51bWJlcihvcHRpb25zLmRheXMsICdkYXlzJywgMSwgMzY1KTtcbiAgICAgICAgY29uc3QgZXhwaXJlc0luU2Vjb25kcyA9IGRheXMgKiAyNCAqIDYwICogNjA7XG5cbiAgICAgICAgY29uc3Qgc2NvcGUgPSBvcHRpb25zLnNjb3BlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgY2F0YWxvZ3VlZCA9IHNjb3BlID8gU0NPUEVfQ0FUQUxPR1tzY29wZV0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChzY29wZSAmJiAhY2F0YWxvZ3VlZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biAtLXNjb3BlIFwiJHtzY29wZX1cIi4gU3VwcG9ydGVkOiAke09iamVjdC5rZXlzKFNDT1BFX0NBVEFMT0cpLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hpY2ggbWFjaGluZSBpZGVudGl0eSB0aGlzIGNyZWRlbnRpYWwgYmVsb25ncyB0bzogdGhlIHNjb3BlJ3Mgb3duXG4gICAgICAgIC8vIGFjY291bnQsIG9yIHRoZSBvcmcncyBzaW5nbGUgZnVsbC1wcml2aWxlZ2UgYXV0b21hdGlvbiBhY2NvdW50LlxuICAgICAgICBjb25zdCBpZGVudGl0eSA9IGNhdGFsb2d1ZWQgPz8gUExBVEZPUk1fQUNDT1VOVDtcbiAgICAgICAgY29uc3QgYWNjb3VudE5hbWUgPSAob3B0aW9ucy5hY2NvdW50IGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gaWRlbnRpdHkuYWNjb3VudDtcblxuICAgICAgICAvLyBTdGVwIDA6IGxvZyBpbiBmaXJzdCB3aGVuIGNyZWRzIGFyZSBhdmFpbGFibGUgYW5kIG5vIFBMQVRGT1JNX1RPS0VOIGlzXG4gICAgICAgIC8vIHNldCAoc2hhcmVkIHdpdGggc2V0dXAtZXZlbnRzKS4gQ3JlZHMgY29tZSBmcm9tIC0taWRlbnRpZmllci8tLXBhc3N3b3JkXG4gICAgICAgIC8vIE9SIHRoZSBlbnYgdmFycyBQTEFURk9STV9JREVOVElGSUVSL1BMQVRGT1JNX1BBU1NXT1JEIOKAlCB0aGUgZW52IHBhdGhcbiAgICAgICAgLy8gbGV0cyBjYWxsZXJzIGxpa2UgYHByb3Zpc2lvbiAtLXdpdGgtZXZlbnRzYCBwYXNzIHRoZW0gd2l0aG91dCBwdXR0aW5nXG4gICAgICAgIC8vIHRoZSBwYXNzd29yZCBvbiB0aGUgY29tbWFuZCBsaW5lICh3aGVyZSBpdCB3b3VsZCBzaG93IGluIHBsYW5zL2xvZ3MpLlxuICAgICAgICBhd2FpdCBlbnN1cmVQbGF0Zm9ybVRva2VuKG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFRoZSBwYXNzd29yZCBpcyBBTFNPIHRoZSBzdGVwLXVwIGZhY3RvciBmb3IgYm90aCB3cml0ZXMgYmVsb3csIHNvIGl0IGlzXG4gICAgICAgIC8vIHJlcXVpcmVkIGV2ZW4gd2hlbiBQTEFURk9STV9UT0tFTiBpcyBhbHJlYWR5IHNldC4gU2F5IHRoYXQgcGxhaW5seVxuICAgICAgICAvLyByYXRoZXIgdGhhbiBmYWlsaW5nIHRocmVlIGNhbGxzIGxhdGVyIHdpdGggYSA0MDMuXG4gICAgICAgIGNvbnN0IHBhc3N3b3JkID0gKG9wdGlvbnMucGFzc3dvcmQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSB8fCBwcm9jZXNzLmVudi5QTEFURk9STV9QQVNTV09SRDtcbiAgICAgICAgaWYgKCFwYXNzd29yZCAmJiAhb3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnQSBwYXNzd29yZCBpcyByZXF1aXJlZDogY3JlYXRpbmcgYSBzZXJ2aWNlIGFjY291bnQgYW5kIGlzc3VpbmcgaXRzIGtleSBhcmUgYm90aCBzdGVwLXVwIGdhdGVkLiAnXG4gICAgICAgICAgICArICdTZXQgUExBVEZPUk1fUEFTU1dPUkQgKHByZWZlcnJlZCkgb3IgcGFzcyAtLXBhc3N3b3JkLicsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50U2VjdGlvbignUHJvdmlzaW9uIFNlcnZpY2UtQWNjb3VudCBLZXknKTtcblxuICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50QXN5bmMob3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgICAgLy8gRHJ5IHJ1biBzdGF5cyBlbnRpcmVseSBPRkZMSU5FIOKAlCBpdCBtdXN0IG5vdCBjcmVhdGUgYW4gYWNjb3VudCBvclxuICAgICAgICAgIC8vIGJ1cm4gYSBrZXkganVzdCB0byBzaG93IHdoYXQgaXQgd291bGQgZG8uXG4gICAgICAgICAgY29uc3QgcGxhbiA9IHtcbiAgICAgICAgICAgIHNlcnZpY2VBY2NvdW50OiBhY2NvdW50TmFtZSxcbiAgICAgICAgICAgIHJvbGVzOiBzY29wZSA/ICdub25lIChzY29wZWQsIGxlYXN0IHByaXZpbGVnZSknIDogJ29yZyBhZG1pbicsXG4gICAgICAgICAgICBzY29wZTogc2NvcGUgPz8gJyhub25lIOKAlCBmdWxsIHBsYXRmb3JtIGNyZWRlbnRpYWwpJyxcbiAgICAgICAgICAgIHNlY3JldE5hbWU6IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFQ1JFVF9OQU1FIHx8IGAke3NlY3JldE5hbWVGb3JPcmcoJzxvcmdJZD4nLCBzY29wZSA/IHNjb3BlU2VjcmV0TGVhZihzY29wZSkgOiAncGxhdGZvcm0nKX1gLFxuICAgICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgICAgZXhwaXJlc0luRGF5czogZGF5cyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgc3VjY2VzczogdHJ1ZSwgZHJ5UnVuOiB0cnVlLCAuLi5wbGFuIH0sIG51bGwsIDIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICAgICAgcHJpbnRTZWN0aW9uKCdEcnkgUnVuIOKAlCBObyBDaGFuZ2VzIE1hZGUnKTtcbiAgICAgICAgICAgIHByaW50S2V5VmFsdWUoe1xuICAgICAgICAgICAgICAnU2VydmljZSBBY2NvdW50JzogcGxhbi5zZXJ2aWNlQWNjb3VudCxcbiAgICAgICAgICAgICAgJ1JvbGVzJzogcGxhbi5yb2xlcyxcbiAgICAgICAgICAgICAgJ0tleSBTY29wZSc6IHBsYW4uc2NvcGUsXG4gICAgICAgICAgICAgICdTZWNyZXQgTmFtZSc6IHBsYW4uc2VjcmV0TmFtZSxcbiAgICAgICAgICAgICAgJ1JlZ2lvbic6IHBsYW4ucmVnaW9uLFxuICAgICAgICAgICAgICAnRXhwaXJlcyBJbic6IGAke2RheXN9IGRheXNgLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcmludFN1Y2Nlc3MoJ0RyeSBydW4gY29tcGxldGUg4oCUIG5vIGFjY291bnQsIGtleSBvciBzZWNyZXQgd2FzIGNyZWF0ZWQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5TmFtZSA9IGAke2FjY291bnROYW1lfS0ke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCl9YDtcbiAgICAgICAgY29uc3QgcHJvdmlzaW9uZWQgPSBhd2FpdCBwcm92aXNpb25TZXJ2aWNlQWNjb3VudEtleSh7XG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCEsXG4gICAgICAgICAgYWNjb3VudE5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGlkZW50aXR5LmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHJvbGVzOiBzY29wZSA/ICdub25lJyA6ICdhZG1pbicsXG4gICAgICAgICAgLi4uKHNjb3BlID8geyBzY29wZSB9IDoge30pLFxuICAgICAgICAgIGV4cGlyZXNJblNlY29uZHMsXG4gICAgICAgICAga2V5TmFtZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJpbnRTdWNjZXNzKGBLZXkgaXNzdWVkIG9uIHNlcnZpY2UgYWNjb3VudCAnJHthY2NvdW50TmFtZX0nIChleHBpcmVzICR7cHJvdmlzaW9uZWQuZXhwaXJlc0F0fSlgKTtcblxuICAgICAgICAvLyBBbiBleHBsaWNpdCBQTEFURk9STV9TRUNSRVRfTkFNRSBzdGlsbCB3aW5zICh0aGUgZXNjYXBlIGhhdGNoIGZvclxuICAgICAgICAvLyBoYW5kLW1hbmFnZWQgcGF0aHMpOyBvdGhlcndpc2UgZGVyaXZlIGl0IGZyb20gdGhlIG9yZyB0aGUgcGxhdGZvcm1cbiAgICAgICAgLy8gcmVwb3J0ZWQsIHdoaWNoIHdvcmtzIHdpdGggYW4gb3BhcXVlIGFjY2VzcyBrZXkgYXMgUExBVEZPUk1fVE9LRU4g4oCUXG4gICAgICAgIC8vIGEga2V5IGNhcnJpZXMgbm8gb3JnIGNsYWltIHRvIGRlY29kZS5cbiAgICAgICAgY29uc3Qgc2VjcmV0TmFtZSA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFQ1JFVF9OQU1FXG4gICAgICAgICAgfHwgc2VjcmV0TmFtZUZvck9yZyhwcm92aXNpb25lZC5vcmdhbml6YXRpb25JZCwgc2NvcGUgPyBzY29wZVNlY3JldExlYWYoc2NvcGUpIDogJ3BsYXRmb3JtJyk7XG5cbiAgICAgICAgYXVkaXRMb2coJ3N0b3JlLXRva2VuJywge1xuICAgICAgICAgIGV4ZWN1dGlvbklkLFxuICAgICAgICAgIHNlY3JldE5hbWUsXG4gICAgICAgICAgZGF5cyxcbiAgICAgICAgICBzZXJ2aWNlQWNjb3VudDogYWNjb3VudE5hbWUsXG4gICAgICAgICAgc2NvcGU6IHNjb3BlID8/IG51bGwsXG4gICAgICAgICAga2V5SWQ6IHByb3Zpc2lvbmVkLmtleUlkLFxuICAgICAgICB9KTtcblxuICAgICAgICBwcmludEluZm8oJ1BhcmFtZXRlcnMnLCB7XG4gICAgICAgICAgc2VjcmV0TmFtZSxcbiAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgc2VydmljZUFjY291bnQ6IGFjY291bnROYW1lLFxuICAgICAgICAgIHNjb3BlOiBzY29wZSA/PyAnKG5vbmUpJyxcbiAgICAgICAgICBkYXlzLFxuICAgICAgICAgIGV4cGlyZXNJbjogYCR7ZXhwaXJlc0luU2Vjb25kc31zYCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gV2hhdCB0aGlzIHJ1biBpcyBSRVBMQUNJTkcsIHJlYWQgYmVmb3JlIHRoZSB3cml0ZSBzbyB0aGUgb2xkIGtleSBjYW4gYmVcbiAgICAgICAgLy8gcmV0aXJlZCBhZnRlciB0aGUgbmV3IG9uZSBpcyBzYWZlbHkgc3RvcmVkLlxuICAgICAgICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHByZXZpb3VzS2V5SWQoc2VjcmV0TmFtZSwgYXdzKTtcblxuICAgICAgICAvLyBTY2hlbWE6IHsgdXNlcm5hbWU6IG9yZ0lkLCBwYXNzd29yZDogPHBiX3NhXyBrZXk+LCAuLi5tZXRhZGF0YSB9XG4gICAgICAgIC8vIC0gdXNlcm5hbWUvcGFzc3dvcmQgc2F0aXNmeSBDb2RlQnVpbGQncyBgc2VjcmV0c01hbmFnZXJDcmVkZW50aWFsc2BcbiAgICAgICAgLy8gICAoSFRUUCBCYXNpYywgc2VudCB0byBwaXBlbGluZS1pbWFnZS1yZWdpc3RyeSdzIC90b2tlbiBlbmRwb2ludCwgd2hpY2hcbiAgICAgICAgLy8gICBleGNoYW5nZXMgdGhlIG9wYXF1ZSBrZXkgbGlrZSBldmVyeSBvdGhlciBzZXJ2aWNlIGRvZXMpXG4gICAgICAgIC8vIC0gYHBhc3N3b3JkYCBzdGF5cyB0aGUgY2Fub25pY2FsIGZpZWxkOiB0aGUgcGx1Z2luLWxvb2t1cCBMYW1iZGEsIHRoZVxuICAgICAgICAvLyAgIGV2ZW50cyBMYW1iZGEgYW5kIGAtLXN0b3JlLXRva2Vuc2AgYWxsIHJlYWQgaXQuIE9ubHkgaXRzIFZBTFVFIGNoYW5nZWQsXG4gICAgICAgIC8vICAgZnJvbSBhIG1hY2hpbmUtc2Vzc2lvbiBKV1QgdG8gYW4gb3BhcXVlIHNlcnZpY2UtYWNjb3VudCBrZXkuXG4gICAgICAgIC8vIC0ga2V5SWQgLyBzZXJ2aWNlQWNjb3VudElkIGFyZSB3aGF0IHRoZSByb3RhdGlvbiBMYW1iZGEgbmVlZHMgdG8gcmV0aXJlXG4gICAgICAgIC8vICAgdGhlIGtleSBpdCByZXBsYWNlcy5cbiAgICAgICAgY29uc3Qgc2VjcmV0VmFsdWUgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgdXNlcm5hbWU6IHByb3Zpc2lvbmVkLm9yZ2FuaXphdGlvbklkLFxuICAgICAgICAgIHBhc3N3b3JkOiBwcm92aXNpb25lZC5rZXksXG4gICAgICAgICAgcGxhdGZvcm1Vcmw6IGNsaWVudC5nZXRCYXNlVXJsKCksXG4gICAgICAgICAgb3JnYW5pemF0aW9uSWQ6IHByb3Zpc2lvbmVkLm9yZ2FuaXphdGlvbklkLFxuICAgICAgICAgIHNlcnZpY2VBY2NvdW50SWQ6IHByb3Zpc2lvbmVkLnNlcnZpY2VBY2NvdW50SWQsXG4gICAgICAgICAgc2VydmljZUFjY291bnROYW1lOiBwcm92aXNpb25lZC5zZXJ2aWNlQWNjb3VudE5hbWUsXG4gICAgICAgICAga2V5SWQ6IHByb3Zpc2lvbmVkLmtleUlkLFxuICAgICAgICAgIHNjb3BlOiBwcm92aXNpb25lZC5zY29wZSxcbiAgICAgICAgICBleHBpcmVzSW46IGV4cGlyZXNJblNlY29uZHMsXG4gICAgICAgICAgZXhwaXJlc0F0OiBwcm92aXNpb25lZC5leHBpcmVzQXQsXG4gICAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHByaW50U2VjdGlvbignU3RvcmUgS2V5Jyk7XG5cbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBgUGlwZWxpbmUgQnVpbGRlciBzZXJ2aWNlLWFjY291bnQga2V5ICgke2FjY291bnROYW1lfTsgcmVuZXcgYnkgJHtwcm92aXNpb25lZC5leHBpcmVzQXR9KWA7XG4gICAgICAgIGF3YWl0IHVwc2VydFNlY3JldChzZWNyZXROYW1lLCBzZWNyZXRWYWx1ZSwgZGVzY3JpcHRpb24sIGF3cyk7XG5cbiAgICAgICAgY29uc3QgYXJuID0gYXdhaXQgZ2V0U2VjcmV0QXJuKHNlY3JldE5hbWUsIGF3cyk7XG5cbiAgICAgICAgLy8gUmV0aXJlIHRoZSBjcmVkZW50aWFsIHRoaXMgcnVuIHJlcGxhY2VkIOKAlCBBRlRFUiB0aGUgbmV3IG9uZSBpcyBzdG9yZWQsXG4gICAgICAgIC8vIG5ldmVyIGJlZm9yZS4gQSBmYWlsdXJlIGhlcmUgbGVhdmVzIGEgc3VwZXJmbHVvdXMga2V5IHRoYXQgZXhwaXJlcyBvblxuICAgICAgICAvLyBpdHMgb3duOyBkb2luZyBpdCBpbiB0aGUgb3RoZXIgb3JkZXIgd291bGQgbGVhdmUgdGhlIHNlY3JldCBuYW1pbmcgYVxuICAgICAgICAvLyByZXZva2VkIGtleSBpZiB0aGUgd3JpdGUgZmFpbGVkLlxuICAgICAgICBpZiAocHJldmlvdXMua2V5SWQgJiYgcHJldmlvdXMuc2VydmljZUFjY291bnRJZCA9PT0gcHJvdmlzaW9uZWQuc2VydmljZUFjY291bnRJZCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCByZXZva2VTZXJ2aWNlQWNjb3VudEtleShcbiAgICAgICAgICAgICAgY2xpZW50LCBwYXNzd29yZCEsIHByb3Zpc2lvbmVkLm9yZ2FuaXphdGlvbklkLCBwcm92aXNpb25lZC5zZXJ2aWNlQWNjb3VudElkLCBwcmV2aW91cy5rZXlJZCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwcmludFN1Y2Nlc3MoYFJldGlyZWQgdGhlIHByZXZpb3VzIGtleSAoJHtwcmV2aW91cy5rZXlJZH0pYCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAgIGBTdG9yZWQgdGhlIG5ldyBrZXksIGJ1dCBjb3VsZCBub3QgcmV2b2tlIHRoZSBwcmV2aW91cyBvbmUgKCR7cHJldmlvdXMua2V5SWR9KTogYFxuICAgICAgICAgICAgICArIGAke2Vycm9yTWVzc2FnZShlcnIpfS4gSXQgZXhwaXJlcyBvbiBpdHMgb3duOyByZXZva2UgaXQgZnJvbSBgXG4gICAgICAgICAgICAgICsgJ1NldHRpbmdzIOKGkiBTZXJ2aWNlIGFjY291bnRzIGlmIHlvdSB3YW50IGl0IGdvbmUgbm93LicsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsbHkgaW5zdGFsbCB0aGUgb25jZS1hLWRheSByb3RhdGlvbiBzdGFjayBzbyB0aGlzIGtleSBuZXZlciBsYXBzZXMuXG4gICAgICAgIGxldCBzY2hlZHVsZUV4cHJlc3Npb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKG9wdGlvbnMuc2NoZWR1bGUpIHtcbiAgICAgICAgICBjb25zdCBmaXZlRmllbGRDcm9uID0gb3B0aW9ucy5jcm9uIHx8IHByb2Nlc3MuZW52LlRPS0VOX1JFTkVXX1NDSEVEVUxFIHx8IERFRkFVTFRfUkVORVdfQ1JPTjtcbiAgICAgICAgICBzY2hlZHVsZUV4cHJlc3Npb24gPSBhd2FpdCBkZXBsb3lSZW5ld1NjaGVkdWxlKHtcbiAgICAgICAgICAgIHNlY3JldE5hbWUsXG4gICAgICAgICAgICBkYXlzLFxuICAgICAgICAgICAgZml2ZUZpZWxkQ3JvbixcbiAgICAgICAgICAgIHJlZ2lvbixcbiAgICAgICAgICAgIHByb2ZpbGU6IG9wdGlvbnMucHJvZmlsZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgc2VjcmV0TmFtZSxcbiAgICAgICAgICAgIHNlY3JldEFybjogYXJuLFxuICAgICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgICAgc2VydmljZUFjY291bnQ6IGFjY291bnROYW1lLFxuICAgICAgICAgICAgc2VydmljZUFjY291bnRJZDogcHJvdmlzaW9uZWQuc2VydmljZUFjY291bnRJZCxcbiAgICAgICAgICAgIGtleUlkOiBwcm92aXNpb25lZC5rZXlJZCxcbiAgICAgICAgICAgIHNjb3BlOiBwcm92aXNpb25lZC5zY29wZSxcbiAgICAgICAgICAgIGV4cGlyZXNJbkRheXM6IGRheXMsXG4gICAgICAgICAgICBleHBpcmVzQXQ6IHByb3Zpc2lvbmVkLmV4cGlyZXNBdCxcbiAgICAgICAgICAgIHNjaGVkdWxlOiBzY2hlZHVsZUV4cHJlc3Npb24gPz8gbnVsbCxcbiAgICAgICAgICB9LCBudWxsLCAyKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICAgIHByaW50U2VjdGlvbignS2V5IFN0b3JlZCcpO1xuXG4gICAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgICAnU2VjcmV0IE5hbWUnOiBzZWNyZXROYW1lLFxuICAgICAgICAgICAgJ1NlY3JldCBBUk4nOiBhcm4sXG4gICAgICAgICAgICAnUmVnaW9uJzogcmVnaW9uLFxuICAgICAgICAgICAgJ1NlcnZpY2UgQWNjb3VudCc6IGFjY291bnROYW1lLFxuICAgICAgICAgICAgJ0tleSBTY29wZSc6IHByb3Zpc2lvbmVkLnNjb3BlID8/ICcobm9uZSDigJQgZnVsbCBwbGF0Zm9ybSBjcmVkZW50aWFsKScsXG4gICAgICAgICAgICAnS2V5IElkJzogcHJvdmlzaW9uZWQua2V5SWQsXG4gICAgICAgICAgICAnRXhwaXJlcyBJbic6IGAke2RheXN9IGRheXNgLFxuICAgICAgICAgICAgJ1JlbmV3IEJ5JzogcHJvdmlzaW9uZWQuZXhwaXJlc0F0LFxuICAgICAgICAgICAgJ0F1dG8tUm90YXRlJzogc2NoZWR1bGVFeHByZXNzaW9uID8gYOKckyAke3NjaGVkdWxlRXhwcmVzc2lvbn1gIDogJ29mZiAocGFzcyAtLXNjaGVkdWxlIHRvIGVuYWJsZSknLFxuICAgICAgICAgICAgJ1N0YXR1cyc6ICfinJMgU3RvcmVkJyxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgICBwcmludFN1Y2Nlc3MoJ0tleSBzdG9yZWQuIFRvIHVzZSB3aXRoIHN5bnRoL2RlcGxveTonKTtcbiAgICAgICAgICBwcmludEluZm8oYCAgZXhwb3J0IFBMQVRGT1JNX1NFQ1JFVF9OQU1FPSR7c2VjcmV0TmFtZX1gKTtcbiAgICAgICAgICBwcmludEluZm8oJyAgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aCAtLWlkIDxwaXBlbGluZS1pZD4gLS1zdG9yZS10b2tlbnMnKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgaWYgKHNjaGVkdWxlRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgcHJpbnRJbmZvKGBBdXRvLXJvdGF0aW9uIGlzIGFjdGl2ZSAoJHtzY2hlZHVsZUV4cHJlc3Npb259KTsgdGhlIHNlY3JldCBpcyByZXBsYWNlZCBiZWZvcmUgJHtwcm92aXNpb25lZC5leHBpcmVzQXR9LmApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcmludEluZm8oYFJvdGF0ZSBiZWZvcmUgJHtwcm92aXNpb25lZC5leHBpcmVzQXR9IHdpdGg6IHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW4gLS1kYXlzICR7ZGF5c31gKTtcbiAgICAgICAgICAgIHByaW50SW5mbygnICAob3IgcGFzcyAtLXNjaGVkdWxlIHRvIGluc3RhbGwgYSBkYWlseSBhdXRvLXJvdGF0aW9uIHN0YWNrKScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuQVBJX1JFUVVFU1QsIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICBjb21tYW5kOiAnc3RvcmUtdG9rZW4nLFxuICAgICAgICAgICAgZXhlY3V0aW9uSWQsXG4gICAgICAgICAgICBzZWNyZXROYW1lOiBwcm9jZXNzLmVudi5QTEFURk9STV9TRUNSRVRfTkFNRSB8fCAnKGRlcml2ZWQgZnJvbSB0aGUgb3JnKScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG59XG4iXX0=
411
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUtdG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvc3RvcmUtdG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXpFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRixPQUFPLEVBQUUsOEJBQThCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JLLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFB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QUFJO2dCQUNWLE9BQU8sRUFBRTtvQkFDUCxPQUFPLEVBQUUsYUFBYTtvQkFDdEIsV0FBVztvQkFDWCxVQUFVLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsSUFBSSx3QkFBd0I7aUJBQ3pFO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBleGVjRmlsZVN5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IExhbWJkYUNsaWVudCwgVXBkYXRlRnVuY3Rpb25Db2RlQ29tbWFuZCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1sYW1iZGEnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBBUFBfVkVSU0lPTiwgdmFsaWRhdGVOdW1iZXIgfSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IEFwaUNsaWVudCB9IGZyb20gJy4uL3V0aWxzL2FwaS1jbGllbnQuanMnO1xuaW1wb3J0IHsgYXVkaXRMb2cgfSBmcm9tICcuLi91dGlscy9hdWRpdC1sb2cuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUF3c1JlZ2lvbiB9IGZyb20gJy4uL3V0aWxzL2F3cy1lbnYuanMnO1xuaW1wb3J0IHsgdXBzZXJ0U2VjcmV0LCBnZXRTZWNyZXRBcm4sIGdldFNlY3JldFZhbHVlIH0gZnJvbSAnLi4vdXRpbHMvYXdzLXNlY3JldHMuanMnO1xuaW1wb3J0IHsgY3JlYXRlQXV0aGVudGljYXRlZENsaWVudEFzeW5jLCBwcmludENvbW1hbmRIZWFkZXIsIHByaW50U3NsV2FybmluZywgd2l0aFByb2ZpbGVPcHRpb24sIHdpdGhSZWdpb25PcHRpb24sIHdpdGhTc2xPcHRpb25zIH0gZnJvbSAnLi4vdXRpbHMvY29tbWFuZC11dGlscy5qcyc7XG5pbXBvcnQgeyB0b0V2ZW50QnJpZGdlQ3JvbiB9IGZyb20gJy4uL3V0aWxzL2Nyb24uanMnO1xuaW1wb3J0IHsgRVJST1JfQ09ERVMsIGhhbmRsZUVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBwcmludEluZm8sIHByaW50S2V5VmFsdWUsIHByaW50U2VjdGlvbiwgcHJpbnRTdWNjZXNzLCBwcmludFdhcm5pbmcgfSBmcm9tICcuLi91dGlscy9vdXRwdXQtdXRpbHMuanMnO1xuaW1wb3J0IHsgZW5zdXJlUGxhdGZvcm1Ub2tlbiwgc2NvcGVTZWNyZXRMZWFmLCBzZWNyZXROYW1lRm9yT3JnIH0gZnJvbSAnLi4vdXRpbHMvcGxhdGZvcm0tc2VjcmV0LmpzJztcbmltcG9ydCB7IHByb3Zpc2lvblNlcnZpY2VBY2NvdW50S2V5LCByZXZva2VTZXJ2aWNlQWNjb3VudEtleSwgdHlwZSBQcm92aXNpb25lZEtleSB9IGZyb20gJy4uL3V0aWxzL3NlcnZpY2UtYWNjb3VudC5qcyc7XG5cbi8vIEVTTSBoYXMgbm8gX19kaXJuYW1lOyBkZXJpdmUgaXQgZnJvbSB0aGlzIG1vZHVsZSdzIFVSTC5cbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuXG5jb25zdCBSRU5FV19TVEFDS19OQU1FID0gJ3BpcGVsaW5lLWJ1aWxkZXItdG9rZW4tcmVuZXcnO1xuLy8gQ0ZOLW1hbmFnZWQgTGFtYmRhIGZ1bmN0aW9uIG5hbWUg4oCUIGtlZXAgaW4gc3luYyB3aXRoIHRva2VuLXJlbmV3LXN0YWNrLmpzb24uXG5jb25zdCBSRU5FV19MQU1CREFfTkFNRSA9ICdwaXBlbGluZS1idWlsZGVyLXRva2VuLXJlbmV3Jztcbi8vIERlZmF1bHQgNS1maWVsZCBjcm9uIChkYWlseSBhdCBtaWRuaWdodCkgd2hlbiBuZWl0aGVyIC0tY3JvbiBub3IgVE9LRU5fUkVORVdfU0NIRURVTEUgaXMgc2V0LlxuY29uc3QgREVGQVVMVF9SRU5FV19DUk9OID0gJzAgMCAqICogKic7XG5cbi8qKlxuICogQ2FwYWJpbGl0eSBzY29wZXMgYSBzdG9yZWQgY3JlZGVudGlhbCBtYXkgY2FycnksIGFuZCB3aGF0IGVhY2ggb25lIGlzIEZPUi5cbiAqXG4gKiBBIHNjb3BlZCBrZXkgZXhjaGFuZ2VzIHRvIGEgdG9rZW4gd2l0aCBubyBwZXJtaXNzaW9ucyBhbmQgbm8gYWRtaW4gZmxhZ3MgYXRcbiAqIGFsbCDigJQgb25seSB0aGUgb25lIGNhcGFiaWxpdHkg4oCUIHNvIGl0IGlzIHRoZSBzaGFwZSBldmVyeSBhdXRvbWF0aW9uIHRoYXQgZG9lc1xuICogZXhhY3RseSBvbmUgdGhpbmcgc2hvdWxkIGhvbGQuIFRoZSB1bnNjb3BlZCBgcGxhdGZvcm1gIGNyZWRlbnRpYWwgaXMgdGhlXG4gKiByZW1haW5pbmcgZnVsbC1wcml2aWxlZ2Ugb25lOiBzeW50aC9kZXBsb3kgY2FsbGJhY2tzIGFuZCB0aGUgcGx1Z2luLWxvb2t1cFxuICogTGFtYmRhIGNhbGwgdGhlIG9yZGluYXJ5IEFQSSBzdXJmYWNlLCB3aGljaCBubyBzaW5nbGUgc2NvcGUgY292ZXJzLlxuICovXG5jb25zdCBTQ09QRV9DQVRBTE9HOiBSZWNvcmQ8c3RyaW5nLCB7IGFjY291bnQ6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZyB9PiA9IHtcbiAgJ3JlcG9ydGluZzppbmdlc3QnOiB7XG4gICAgYWNjb3VudDogJ3JlcG9ydGluZy1pbmdlc3QnLFxuICAgIGRlc2NyaXB0aW9uOiAnQVdTIHBpcGVsaW5lLWV2ZW50IGluZ2VzdGlvbiAodGhlIGV2ZW50cyBMYW1iZGEgUE9TVHMgL3JlcG9ydHMvZXZlbnRzKScsXG4gIH0sXG4gICdyZWdpc3RyeTpwdXNoJzoge1xuICAgIGFjY291bnQ6ICdyZWdpc3RyeS1wdXNoJyxcbiAgICBkZXNjcmlwdGlvbjogJ0NJIGltYWdlIHB1c2hlcyBpbnRvIHRoaXMgb3Jn4oCZcyByZWdpc3RyeSBuYW1lc3BhY2UgKENvZGVCdWlsZCDihpIgL3Rva2VuKScsXG4gIH0sXG59O1xuXG4vKiogVGhlIGFjY291bnQgdGhhdCBob2xkcyB0aGUgdW5zY29wZWQsIGZ1bGwtcHJpdmlsZWdlIHN0b3JlZCBjcmVkZW50aWFsLiAqL1xuY29uc3QgUExBVEZPUk1fQUNDT1VOVCA9IHtcbiAgYWNjb3VudDogJ3BsYXRmb3JtLWF1dG9tYXRpb24nLFxuICBkZXNjcmlwdGlvbjogJ1N0b3JlZCBwbGF0Zm9ybSBjcmVkZW50aWFsIGZvciBDREsgc3ludGgvZGVwbG95LCBwbHVnaW4gbG9va3VwIGFuZCBpbWFnZSBwdXNoZXMnLFxufTtcblxuLyoqXG4gKiBEZXBsb3kgKG9yIHVwZGF0ZSkgdGhlIG9uY2UtYS1kYXkgS0VZIFJPVEFUSU9OIHN0YWNrOiBhIHNjaGVkdWxlZCBMYW1iZGEgdGhhdFxuICogcmVwbGFjZXMgdGhlIHNlcnZpY2UtYWNjb3VudCBrZXkgaW4gdGhpcyBzZWNyZXQgYmVmb3JlIGl0IGV4cGlyZXMuIE1pcnJvcnNcbiAqIHNldHVwLWV2ZW50cyDigJQgYGF3cyBjbG91ZGZvcm1hdGlvbiBkZXBsb3lgIGZvciB0aGUgaW5mcmEsIHRoZW4gYSBkaXJlY3RcbiAqIFVwZGF0ZUZ1bmN0aW9uQ29kZSB3aXRoIHRoZSByb3RhdG9yIGhhbmRsZXIgY29tcGlsZWQgYWxvbmdzaWRlIHRoaXMgQ0xJIChzZWVcbiAqIHNyYy9sYW1iZGEvdG9rZW4tcmVuZXctaGFuZGxlci50cykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlcGxveVJlbmV3U2NoZWR1bGUob3B0czoge1xuICBzZWNyZXROYW1lOiBzdHJpbmc7XG4gIGRheXM6IG51bWJlcjtcbiAgZml2ZUZpZWxkQ3Jvbjogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgcHJvZmlsZT86IHN0cmluZztcbn0pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBzY2hlZHVsZUV4cHJlc3Npb24gPSB0b0V2ZW50QnJpZGdlQ3JvbihvcHRzLmZpdmVGaWVsZENyb24pOyAvLyB2YWxpZGF0ZXMgKyAxNS1taW4gZ3VhcmRcblxuICAvLyBOYW1lIHJlbmV3YWwgcmVzb3VyY2VzIHBlci1zZWNyZXQgc28gYSBzY29wZWQtY3JlZGVudGlhbCBzdGFjayAoZS5nLiB0aGVcbiAgLy8gcmVwb3J0aW5nLWluZ2VzdCBrZXkgdGhlIGV2ZW50IExhbWJkYSByZWFkcykgY29leGlzdHMgd2l0aCB0aGVcbiAgLy8gcGxhdGZvcm0tY3JlZGVudGlhbCBzdGFjayBpbnN0ZWFkIG9mIGNvbGxpZGluZyBvbiB0aGUgKGFjY291bnQtZ2xvYmFsKSBJQU1cbiAgLy8gcm9sZSAvIExhbWJkYSAvIHJ1bGUgbmFtZXMuIFRoZSBwbGF0Zm9ybSBzZWNyZXQga2VlcHMgdGhlIGJhcmUgbmFtZVxuICAvLyAoc3VmZml4ICcnKSBzbyBleGlzdGluZyBkZXBsb3ltZW50cycgc3RhY2sgaXMgdXBkYXRlZCBpbiBwbGFjZSwgbm90XG4gIC8vIGR1cGxpY2F0ZWQ7IGFueSBvdGhlciBzZWNyZXQgYXBwZW5kcyBpdHMgdHJhaWxpbmcgcGF0aCBzZWdtZW50LlxuICBjb25zdCBzZWNyZXRMZWFmID0gb3B0cy5zZWNyZXROYW1lLnJlcGxhY2UoLy4qXFwvLywgJycpOyAvLyAncGxhdGZvcm0nIHwgJ3JlcG9ydGluZy1pbmdlc3QnIHwg4oCmXG4gIGNvbnN0IG5hbWVTdWZmaXggPSBzZWNyZXRMZWFmID09PSAncGxhdGZvcm0nID8gJycgOiBgLSR7c2VjcmV0TGVhZi5yZXBsYWNlKC9bXmEtejAtOV0rL2dpLCAnLScpfWA7XG4gIGNvbnN0IHN0YWNrTmFtZSA9IGAke1JFTkVXX1NUQUNLX05BTUV9JHtuYW1lU3VmZml4fWA7XG4gIGNvbnN0IGxhbWJkYU5hbWUgPSBgJHtSRU5FV19MQU1CREFfTkFNRX0ke25hbWVTdWZmaXh9YDtcblxuICBwcmludFNlY3Rpb24oJ1NjaGVkdWxlIFJvdGF0aW9uJyk7XG4gIHByaW50SW5mbygnUGFyYW1ldGVycycsIHtcbiAgICBzdGFjazogc3RhY2tOYW1lLFxuICAgIHNjaGVkdWxlOiBvcHRzLmZpdmVGaWVsZENyb24sXG4gICAgZXZlbnRicmlkZ2U6IHNjaGVkdWxlRXhwcmVzc2lvbixcbiAgICByZW5ld0RheXM6IG9wdHMuZGF5cyxcbiAgfSk7XG5cbiAgLy8gU3RlcCAxOiBpbmZyYSAoTGFtYmRhIGdldHMgcGxhY2Vob2xkZXIgY29kZSBvbiBmaXJzdCBjcmVhdGUpLlxuICBjb25zdCB0ZW1wbGF0ZVBhdGggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vdGVtcGxhdGVzL3Rva2VuLXJlbmV3LXN0YWNrLmpzb24nKTtcbiAgY29uc3QgY2ZuQXJncyA9IFtcbiAgICAnY2xvdWRmb3JtYXRpb24nLCAnZGVwbG95JyxcbiAgICAnLS1zdGFjay1uYW1lJywgc3RhY2tOYW1lLFxuICAgICctLXRlbXBsYXRlLWZpbGUnLCB0ZW1wbGF0ZVBhdGgsXG4gICAgJy0tcGFyYW1ldGVyLW92ZXJyaWRlcycsXG4gICAgYFBsYXRmb3JtU2VjcmV0TmFtZT0ke29wdHMuc2VjcmV0TmFtZX1gLFxuICAgIGBSZW5ld0RheXM9JHtvcHRzLmRheXN9YCxcbiAgICBgU2NoZWR1bGVFeHByZXNzaW9uPSR7c2NoZWR1bGVFeHByZXNzaW9ufWAsXG4gICAgYE5hbWVTdWZmaXg9JHtuYW1lU3VmZml4fWAsXG4gICAgLy8gUmVjb3JkZWQgZm9yIHByb3ZlbmFuY2Ugb25seSDigJQgdGhlIHJvdGF0b3IgZG9lcyBub3QgaW5zdGFsbCB0aGUgQ0xJIGF0XG4gICAgLy8gcnVudGltZSAoaXQgc3BlYWtzIHRvIHRoZSBwbGF0Zm9ybSBkaXJlY3RseSksIGJ1dCBrbm93aW5nIHdoaWNoIENMSVxuICAgIC8vIGRlcGxveWVkIGEgc3RhY2sgaXMgd29ydGgga2VlcGluZy5cbiAgICBgUGlwZWxpbmVNYW5hZ2VyVmVyc2lvbj0ke0FQUF9WRVJTSU9OfWAsXG4gICAgJy0tY2FwYWJpbGl0aWVzJywgJ0NBUEFCSUxJVFlfTkFNRURfSUFNJyxcbiAgICAnLS1uby1mYWlsLW9uLWVtcHR5LWNoYW5nZXNldCcsXG4gICAgJy0tcmVnaW9uJywgb3B0cy5yZWdpb24sXG4gIF07XG4gIGlmIChvcHRzLnByb2ZpbGUpIGNmbkFyZ3MucHVzaCgnLS1wcm9maWxlJywgb3B0cy5wcm9maWxlKTtcbiAgZXhlY0ZpbGVTeW5jKCdhd3MnLCBjZm5BcmdzLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG5cbiAgLy8gU3RlcCAyOiB1cGxvYWQgdGhlIHJlYWwgaGFuZGxlci4gSXQncyBFU00sIHNvIHRoZSB6aXAgZW50cnkgbXVzdCBiZSBpbmRleC5tanNcbiAgLy8gKEhhbmRsZXIgc3RheXMgaW5kZXguaGFuZGxlciDigJQgbm9kZWpzMjQueCByZXNvbHZlcyB0aGUgLm1qcyBleHRlbnNpb24pLlxuICBjb25zdCBoYW5kbGVyU3JjID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2xhbWJkYS90b2tlbi1yZW5ldy1oYW5kbGVyLmpzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhoYW5kbGVyU3JjKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVG9rZW4tcmVuZXcgaGFuZGxlciBub3QgZm91bmQgYXQgJHtoYW5kbGVyU3JjfSDigJQgd2FzIHRoZSBwYWNrYWdlIGJ1aWx0P2ApO1xuICB9XG4gIGNvbnN0IHRtcERpciA9IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3Rva2VuLXJlbmV3LScpKTtcbiAgdHJ5IHtcbiAgICBmcy5jb3B5RmlsZVN5bmMoaGFuZGxlclNyYywgcGF0aC5qb2luKHRtcERpciwgJ2luZGV4Lm1qcycpKTtcbiAgICBjb25zdCB6aXBQYXRoID0gcGF0aC5qb2luKHRtcERpciwgJ2luZGV4LnppcCcpO1xuICAgIGV4ZWNGaWxlU3luYygnemlwJywgWyctaicsIHppcFBhdGgsICdpbmRleC5tanMnXSwgeyBjd2Q6IHRtcERpciwgc3RkaW86ICdwaXBlJyB9KTtcblxuICAgIGNvbnN0IGxhbWJkYUNsaWVudCA9IG5ldyBMYW1iZGFDbGllbnQoeyByZWdpb246IG9wdHMucmVnaW9uIH0pO1xuICAgIGF3YWl0IGxhbWJkYUNsaWVudC5zZW5kKG5ldyBVcGRhdGVGdW5jdGlvbkNvZGVDb21tYW5kKHtcbiAgICAgIEZ1bmN0aW9uTmFtZTogbGFtYmRhTmFtZSxcbiAgICAgIFppcEZpbGU6IGZzLnJlYWRGaWxlU3luYyh6aXBQYXRoKSxcbiAgICB9KSk7XG4gIH0gZmluYWxseSB7XG4gICAgZnMucm1TeW5jKHRtcERpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpbnRTdWNjZXNzKGBSb3RhdGlvbiBzY2hlZHVsZWQgKCR7c2NoZWR1bGVFeHByZXNzaW9ufSlgKTtcbiAgcmV0dXJuIHNjaGVkdWxlRXhwcmVzc2lvbjtcbn1cblxuLyoqIFJlYWQgdGhlIGtleSBpZCBhIHByZXZpb3VzIHJ1biBzdG9yZWQsIHNvIHRoaXMgcnVuIGNhbiByZXRpcmUgaXQuICovXG5hc3luYyBmdW5jdGlvbiBwcmV2aW91c0tleUlkKFxuICBzZWNyZXROYW1lOiBzdHJpbmcsXG4gIGF3czogeyByZWdpb246IHN0cmluZzsgcHJvZmlsZT86IHN0cmluZyB9LFxuKTogUHJvbWlzZTx7IGtleUlkPzogc3RyaW5nOyBzZXJ2aWNlQWNjb3VudElkPzogc3RyaW5nIH0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBhd2FpdCBnZXRTZWNyZXRWYWx1ZShzZWNyZXROYW1lLCBhd3MpO1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyB7IGtleUlkPzogc3RyaW5nOyBzZXJ2aWNlQWNjb3VudElkPzogc3RyaW5nIH07XG4gICAgcmV0dXJuIHsga2V5SWQ6IHBhcnNlZC5rZXlJZCwgc2VydmljZUFjY291bnRJZDogcGFyc2VkLnNlcnZpY2VBY2NvdW50SWQgfTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gc2VjcmV0IHlldCAoZmlyc3QgcnVuKSwgb3Igb25lIHdyaXR0ZW4gYmVmb3JlIHRoZSBzZXJ2aWNlLWFjY291bnRcbiAgICAvLyBjdXRvdmVyIChubyBrZXlJZCkuIEVpdGhlciB3YXkgdGhlcmUgaXMgbm90aGluZyB0aGlzIHJ1biBjYW4gcmV0aXJlLlxuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKiogV2hhdCBhIGRyeSBydW4gcmVwb3J0cyBpdCBXT1VMRCBwcm92aXNpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JlVG9rZW5QbGFuIHtcbiAgc2VydmljZUFjY291bnQ6IHN0cmluZztcbiAgcm9sZXM6IHN0cmluZztcbiAgc2NvcGU6IHN0cmluZztcbiAgc2VjcmV0TmFtZTogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgZXhwaXJlc0luRGF5czogbnVtYmVyO1xufVxuXG4vKiogUHJpbnQgdGhlIGRyeS1ydW4gcGxhbiAoSlNPTiBvciBodW1hbikuIFN0YXlzIGVudGlyZWx5IG9mZmxpbmUuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpbnREcnlSdW5QbGFuKHBsYW46IFN0b3JlVG9rZW5QbGFuLCBqc29uOiBib29sZWFuKTogdm9pZCB7XG4gIGlmIChqc29uKSB7XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBzdWNjZXNzOiB0cnVlLCBkcnlSdW46IHRydWUsIC4uLnBsYW4gfSwgbnVsbCwgMikpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zb2xlLmxvZygnJyk7XG4gIHByaW50U2VjdGlvbignRHJ5IFJ1biDigJQgTm8gQ2hhbmdlcyBNYWRlJyk7XG4gIHByaW50S2V5VmFsdWUoe1xuICAgICdTZXJ2aWNlIEFjY291bnQnOiBwbGFuLnNlcnZpY2VBY2NvdW50LFxuICAgICdSb2xlcyc6IHBsYW4ucm9sZXMsXG4gICAgJ0tleSBTY29wZSc6IHBsYW4uc2NvcGUsXG4gICAgJ1NlY3JldCBOYW1lJzogcGxhbi5zZWNyZXROYW1lLFxuICAgICdSZWdpb24nOiBwbGFuLnJlZ2lvbixcbiAgICAnRXhwaXJlcyBJbic6IGAke3BsYW4uZXhwaXJlc0luRGF5c30gZGF5c2AsXG4gIH0pO1xuICBwcmludFN1Y2Nlc3MoJ0RyeSBydW4gY29tcGxldGUg4oCUIG5vIGFjY291bnQsIGtleSBvciBzZWNyZXQgd2FzIGNyZWF0ZWQnKTtcbn1cblxuLyoqXG4gKiBUaGUgU2VjcmV0cyBNYW5hZ2VyIHBheWxvYWQ6IGB7IHVzZXJuYW1lOiBvcmdJZCwgcGFzc3dvcmQ6IDxwYl9zYV8ga2V5PiwgLi4ubWV0YWRhdGEgfWAuXG4gKiAtIHVzZXJuYW1lL3Bhc3N3b3JkIHNhdGlzZnkgQ29kZUJ1aWxkJ3MgYHNlY3JldHNNYW5hZ2VyQ3JlZGVudGlhbHNgIChIVFRQXG4gKiAgIEJhc2ljLCBzZW50IHRvIHBpcGVsaW5lLWltYWdlLXJlZ2lzdHJ5J3MgL3Rva2VuIGVuZHBvaW50LCB3aGljaCBleGNoYW5nZXNcbiAqICAgdGhlIG9wYXF1ZSBrZXkgbGlrZSBldmVyeSBvdGhlciBzZXJ2aWNlIGRvZXMpLlxuICogLSBgcGFzc3dvcmRgIGlzIHRoZSBjYW5vbmljYWwgZmllbGQ6IHRoZSBwbHVnaW4tbG9va3VwIExhbWJkYSwgdGhlIGV2ZW50c1xuICogICBMYW1iZGEgYW5kIGAtLXN0b3JlLXRva2Vuc2AgYWxsIHJlYWQgaXQuXG4gKiAtIGtleUlkIC8gc2VydmljZUFjY291bnRJZCBhcmUgd2hhdCB0aGUgcm90YXRpb24gTGFtYmRhIG5lZWRzIHRvIHJldGlyZSB0aGVcbiAqICAga2V5IGl0IHJlcGxhY2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTZWNyZXRWYWx1ZShwcm92aXNpb25lZDogUHJvdmlzaW9uZWRLZXksIHBsYXRmb3JtVXJsOiBzdHJpbmcsIGV4cGlyZXNJblNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgdXNlcm5hbWU6IHByb3Zpc2lvbmVkLm9yZ2FuaXphdGlvbklkLFxuICAgIHBhc3N3b3JkOiBwcm92aXNpb25lZC5rZXksXG4gICAgcGxhdGZvcm1VcmwsXG4gICAgb3JnYW5pemF0aW9uSWQ6IHByb3Zpc2lvbmVkLm9yZ2FuaXphdGlvbklkLFxuICAgIHNlcnZpY2VBY2NvdW50SWQ6IHByb3Zpc2lvbmVkLnNlcnZpY2VBY2NvdW50SWQsXG4gICAgc2VydmljZUFjY291bnROYW1lOiBwcm92aXNpb25lZC5zZXJ2aWNlQWNjb3VudE5hbWUsXG4gICAga2V5SWQ6IHByb3Zpc2lvbmVkLmtleUlkLFxuICAgIHNjb3BlOiBwcm92aXNpb25lZC5zY29wZSxcbiAgICBleHBpcmVzSW46IGV4cGlyZXNJblNlY29uZHMsXG4gICAgZXhwaXJlc0F0OiBwcm92aXNpb25lZC5leHBpcmVzQXQsXG4gICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gIH0pO1xufVxuXG4vKipcbiAqIFJldGlyZSB0aGUgY3JlZGVudGlhbCB0aGlzIHJ1biByZXBsYWNlZCDigJQgQUZURVIgdGhlIG5ldyBvbmUgaXMgc3RvcmVkLCBuZXZlclxuICogYmVmb3JlLiBBIGZhaWx1cmUgaGVyZSBsZWF2ZXMgYSBzdXBlcmZsdW91cyBrZXkgdGhhdCBleHBpcmVzIG9uIGl0cyBvd247XG4gKiBkb2luZyBpdCBpbiB0aGUgb3RoZXIgb3JkZXIgd291bGQgbGVhdmUgdGhlIHNlY3JldCBuYW1pbmcgYSByZXZva2VkIGtleSBpZlxuICogdGhlIHdyaXRlIGZhaWxlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJldGlyZVByZXZpb3VzS2V5KFxuICBjbGllbnQ6IEFwaUNsaWVudCxcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgcHJvdmlzaW9uZWQ6IFByb3Zpc2lvbmVkS2V5LFxuICBwcmV2aW91czogeyBrZXlJZD86IHN0cmluZzsgc2VydmljZUFjY291bnRJZD86IHN0cmluZyB9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghcHJldmlvdXMua2V5SWQgfHwgcHJldmlvdXMuc2VydmljZUFjY291bnRJZCAhPT0gcHJvdmlzaW9uZWQuc2VydmljZUFjY291bnRJZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGF3YWl0IHJldm9rZVNlcnZpY2VBY2NvdW50S2V5KFxuICAgICAgY2xpZW50LCBwYXNzd29yZCwgcHJvdmlzaW9uZWQub3JnYW5pemF0aW9uSWQsIHByb3Zpc2lvbmVkLnNlcnZpY2VBY2NvdW50SWQsIHByZXZpb3VzLmtleUlkLFxuICAgICk7XG4gICAgcHJpbnRTdWNjZXNzKGBSZXRpcmVkIHRoZSBwcmV2aW91cyBrZXkgKCR7cHJldmlvdXMua2V5SWR9KWApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBwcmludFdhcm5pbmcoXG4gICAgICBgU3RvcmVkIHRoZSBuZXcga2V5LCBidXQgY291bGQgbm90IHJldm9rZSB0aGUgcHJldmlvdXMgb25lICgke3ByZXZpb3VzLmtleUlkfSk6IGBcbiAgICAgICsgYCR7ZXJyb3JNZXNzYWdlKGVycil9LiBJdCBleHBpcmVzIG9uIGl0cyBvd247IHJldm9rZSBpdCBmcm9tIGBcbiAgICAgICsgJ1NldHRpbmdzIOKGkiBTZXJ2aWNlIGFjY291bnRzIGlmIHlvdSB3YW50IGl0IGdvbmUgbm93LicsXG4gICAgKTtcbiAgfVxufVxuXG4vKiogUHJpbnQgdGhlIHN0b3JlZCBrZXkncyBzdW1tYXJ5IChKU09OIG9yIGh1bWFuKSBwbHVzIHRoZSBuZXh0IHN0ZXBzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3RvcmVkS2V5KHI6IHtcbiAganNvbjogYm9vbGVhbjtcbiAgc2VjcmV0TmFtZTogc3RyaW5nO1xuICBhcm46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIGFjY291bnROYW1lOiBzdHJpbmc7XG4gIHByb3Zpc2lvbmVkOiBQcm92aXNpb25lZEtleTtcbiAgZGF5czogbnVtYmVyO1xuICBzY2hlZHVsZUV4cHJlc3Npb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbn0pOiB2b2lkIHtcbiAgY29uc3QgeyBzZWNyZXROYW1lLCBhcm4sIHJlZ2lvbiwgYWNjb3VudE5hbWUsIHByb3Zpc2lvbmVkLCBkYXlzLCBzY2hlZHVsZUV4cHJlc3Npb24gfSA9IHI7XG4gIGlmIChyLmpzb24pIHtcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgc2VjcmV0TmFtZSxcbiAgICAgIHNlY3JldEFybjogYXJuLFxuICAgICAgcmVnaW9uLFxuICAgICAgc2VydmljZUFjY291bnQ6IGFjY291bnROYW1lLFxuICAgICAgc2VydmljZUFjY291bnRJZDogcHJvdmlzaW9uZWQuc2VydmljZUFjY291bnRJZCxcbiAgICAgIGtleUlkOiBwcm92aXNpb25lZC5rZXlJZCxcbiAgICAgIHNjb3BlOiBwcm92aXNpb25lZC5zY29wZSxcbiAgICAgIGV4cGlyZXNJbkRheXM6IGRheXMsXG4gICAgICBleHBpcmVzQXQ6IHByb3Zpc2lvbmVkLmV4cGlyZXNBdCxcbiAgICAgIHNjaGVkdWxlOiBzY2hlZHVsZUV4cHJlc3Npb24gPz8gbnVsbCxcbiAgICB9LCBudWxsLCAyKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coJycpO1xuICAgIHByaW50U2VjdGlvbignS2V5IFN0b3JlZCcpO1xuXG4gICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAnU2VjcmV0IE5hbWUnOiBzZWNyZXROYW1lLFxuICAgICAgJ1NlY3JldCBBUk4nOiBhcm4sXG4gICAgICAnUmVnaW9uJzogcmVnaW9uLFxuICAgICAgJ1NlcnZpY2UgQWNjb3VudCc6IGFjY291bnROYW1lLFxuICAgICAgJ0tleSBTY29wZSc6IHByb3Zpc2lvbmVkLnNjb3BlID8/ICcobm9uZSDigJQgZnVsbCBwbGF0Zm9ybSBjcmVkZW50aWFsKScsXG4gICAgICAnS2V5IElkJzogcHJvdmlzaW9uZWQua2V5SWQsXG4gICAgICAnRXhwaXJlcyBJbic6IGAke2RheXN9IGRheXNgLFxuICAgICAgJ1JlbmV3IEJ5JzogcHJvdmlzaW9uZWQuZXhwaXJlc0F0LFxuICAgICAgJ0F1dG8tUm90YXRlJzogc2NoZWR1bGVFeHByZXNzaW9uID8gYOKckyAke3NjaGVkdWxlRXhwcmVzc2lvbn1gIDogJ29mZiAocGFzcyAtLXNjaGVkdWxlIHRvIGVuYWJsZSknLFxuICAgICAgJ1N0YXR1cyc6ICfinJMgU3RvcmVkJyxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICBwcmludFN1Y2Nlc3MoJ0tleSBzdG9yZWQuIFRvIHVzZSB3aXRoIHN5bnRoL2RlcGxveTonKTtcbiAgICBwcmludEluZm8oYCAgZXhwb3J0IFBMQVRGT1JNX1NFQ1JFVF9OQU1FPSR7c2VjcmV0TmFtZX1gKTtcbiAgICBwcmludEluZm8oJyAgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aCAtLWlkIDxwaXBlbGluZS1pZD4gLS1zdG9yZS10b2tlbnMnKTtcbiAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgaWYgKHNjaGVkdWxlRXhwcmVzc2lvbikge1xuICAgICAgcHJpbnRJbmZvKGBBdXRvLXJvdGF0aW9uIGlzIGFjdGl2ZSAoJHtzY2hlZHVsZUV4cHJlc3Npb259KTsgdGhlIHNlY3JldCBpcyByZXBsYWNlZCBiZWZvcmUgJHtwcm92aXNpb25lZC5leHBpcmVzQXR9LmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmludEluZm8oYFJvdGF0ZSBiZWZvcmUgJHtwcm92aXNpb25lZC5leHBpcmVzQXR9IHdpdGg6IHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW4gLS1kYXlzICR7ZGF5c31gKTtcbiAgICAgIHByaW50SW5mbygnICAob3IgcGFzcyAtLXNjaGVkdWxlIHRvIGluc3RhbGwgYSBkYWlseSBhdXRvLXJvdGF0aW9uIHN0YWNrKScpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgYHN0b3JlLXRva2VuYCBjb21tYW5kIHdpdGggdGhlIENMSSBwcm9ncmFtLlxuICpcbiAqIFByb3Zpc2lvbnMgdGhlIG9yZydzIG1hY2hpbmUgaWRlbnRpdHkg4oCUIGEgU0VSVklDRSBBQ0NPVU5UIGFuZCBvbmUgYHBiX3NhX+KApmBcbiAqIGtleSDigJQgYW5kIHN0b3JlcyB0aGUga2V5IGluIEFXUyBTZWNyZXRzIE1hbmFnZXIgZm9yIENESyBkZXBsb3ltZW50cyxcbiAqIENvZGVCdWlsZCdzIHJlZ2lzdHJ5IGNyZWRlbnRpYWxzLCB0aGUgcGx1Z2luLWxvb2t1cCBMYW1iZGEgYW5kIHRoZSBldmVudFxuICogaW5nZXN0aW9uIExhbWJkYS4gTm90aGluZyBzdG9yZWQgaXMgdGllZCB0byBhIHBlcnNvbidzIHNlc3Npb24gYW55XG4gKiBtb3JlOiB0aGUgYWNjb3VudCBvdXRsaXZlcyBpdHMgY3JlYXRvciwgdGFrZXMgbm8gc2VhdCwgYW5kIGV2ZXJ5IGF1ZGl0IHJvdyBpdFxuICogcHJvZHVjZXMgbmFtZXMgdGhlIGFjY291bnQuXG4gKlxuICogQmVjYXVzZSBjcmVhdGluZyBhbiBhY2NvdW50IGFuZCBpc3N1aW5nIGl0cyBrZXkgYXJlIHN0ZXAtdXAgZ2F0ZWQsIHRoaXMgbmVlZHNcbiAqIHRoZSBvcGVyYXRvcidzIHBhc3N3b3JkIOKAlCBgLS1wYXNzd29yZGAsIG9yIHRoZSBgUExBVEZPUk1fUEFTU1dPUkRgIGVudiB2YXJcbiAqIChwcmVmZXJyZWQ6IGl0IGtlZXBzIHRoZSBwYXNzd29yZCBvdXQgb2Ygc2hlbGwgaGlzdG9yeSBhbmQgcGxhbiBvdXRwdXQpLlxuICpcbiAqIEJ5IGRlZmF1bHQgaXQgT05MWSB3cml0ZXMgdGhlIHNlY3JldC4gUGFzcyAtLXNjaGVkdWxlIHRvIGFsc28gZGVwbG95IHRoZSBkYWlseVxuICogS0VZIFJPVEFUSU9OIHN0YWNrIChhIExhbWJkYSB0aGF0IHJlcGxhY2VzIHRoZSBrZXkgYmVmb3JlIGl0IGV4cGlyZXMpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBiYXNoXG4gKiBQTEFURk9STV9QQVNTV09SRD0qKiogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXJlZ2lvbiB1cy1lYXN0LTFcbiAqIFBMQVRGT1JNX1BBU1NXT1JEPSoqKiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tZGF5cyA5MCAtLXJlZ2lvbiB1cy1lYXN0LTFcbiAqIFBMQVRGT1JNX1BBU1NXT1JEPSoqKiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tc2NoZWR1bGUgLS1yZWdpb24gdXMtZWFzdC0xICAgICAjICsgZGFpbHkgcm90YXRpb25cbiAqIFBMQVRGT1JNX1BBU1NXT1JEPSoqKiBwaXBlbGluZS1tYW5hZ2VyIGluZnJhIHN0b3JlLXRva2VuIC0tc2NvcGUgcmVwb3J0aW5nOmluZ2VzdCAtLXNjaGVkdWxlXG4gKiBQTEFURk9STV9QQVNTV09SRD0qKiogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLXNjb3BlIHJlZ2lzdHJ5OnB1c2ggLS1zY2hlZHVsZVxuICogcGlwZWxpbmUtbWFuYWdlciBpbmZyYSBzdG9yZS10b2tlbiAtLWRyeS1ydW5cbiAqIHBpcGVsaW5lLW1hbmFnZXIgaW5mcmEgc3RvcmUtdG9rZW4gLXUgYWRtaW4gLXAgJyoqKicgLS1yZWdpb24gdXMtZWFzdC0xXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0b3JlVG9rZW4ocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICB3aXRoU3NsT3B0aW9ucyhcbiAgICB3aXRoUHJvZmlsZU9wdGlvbihcbiAgICAgIHdpdGhSZWdpb25PcHRpb24ocHJvZ3JhbVxuICAgICAgICAuY29tbWFuZCgnc3RvcmUtdG9rZW4nKVxuICAgICAgICAuZGVzY3JpcHRpb24oJ1Byb3Zpc2lvbiBhbiBvcmcgc2VydmljZS1hY2NvdW50IGtleSAoaXRzIG93biBtYWNoaW5lIGlkZW50aXR5KSBhbmQgc3RvcmUgaXQgaW4gQVdTIFNlY3JldHMgTWFuYWdlciBmb3IgQ0RLIGRlcGxveW1lbnRzJylcbiAgICAgICAgLm9wdGlvbignLXUsIC0taWRlbnRpZmllciA8aWRlbnRpZmllcj4nLCAnVXNlcm5hbWUgb3IgZW1haWwgKHNraXBzIFBMQVRGT1JNX1RPS0VOIHJlcXVpcmVtZW50KScpXG4gICAgICAgIC5vcHRpb24oJy1wLCAtLXBhc3N3b3JkIDxwYXNzd29yZD4nLCAnTG9naW4gcGFzc3dvcmQg4oCUIGFsc28gdXNlZCBmb3IgdGhlIHN0ZXAtdXAgZXZlcnkga2V5IHdyaXRlIHJlcXVpcmVzIChwcmVmZXIgUExBVEZPUk1fUEFTU1dPUkQpJylcbiAgICAgICAgLm9wdGlvbignLS1kYXlzIDxkYXlzPicsICdLZXkgbGlmZXRpbWUgaW4gZGF5cyAobWF4IDM2NSknLCAnMzAnKVxuICAgICAgICAub3B0aW9uKCctLXNjb3BlIDxzY29wZT4nLCBgUHJvdmlzaW9uIGEgbGVhc3QtcHJpdmlsZWdlIHNjb3BlZCBrZXkgaW5zdGVhZCBvZiB0aGUgZnVsbC1wcml2aWxlZ2UgcGxhdGZvcm0gb25lLiBPbmUgb2Y6ICR7T2JqZWN0LmtleXMoU0NPUEVfQ0FUQUxPRykuam9pbignLCAnKX1gKVxuICAgICAgICAub3B0aW9uKCctLWFjY291bnQgPG5hbWU+JywgJ092ZXJyaWRlIHRoZSBzZXJ2aWNlLWFjY291bnQgbmFtZSB0aGlzIGtleSBpcyBpc3N1ZWQgb24gKGRlZmF1bHQ6IGRlcml2ZWQgZnJvbSAtLXNjb3BlKScpXG4gICAgICAgIC5vcHRpb24oJy0tZHJ5LXJ1bicsICdTaG93IHdoYXQgd291bGQgYmUgcHJvdmlzaW9uZWQgd2l0aG91dCBjYWxsaW5nIHRoZSBwbGF0Zm9ybSBvciB3cml0aW5nIHRvIFNlY3JldHMgTWFuYWdlcicsIGZhbHNlKSksXG4gICAgKVxuICAgICAgLm9wdGlvbignLS1zY2hlZHVsZScsICdBbHNvIGRlcGxveSB0aGUgZGFpbHkga2V5LXJvdGF0aW9uIHN0YWNrIHRoYXQgcmVwbGFjZXMgdGhpcyBrZXkgYmVmb3JlIGl0IGV4cGlyZXMgKG9mZiBieSBkZWZhdWx0KScsIGZhbHNlKVxuICAgICAgLm9wdGlvbignLS1jcm9uIDxleHByPicsICdSb3RhdGlvbiBzY2hlZHVsZSBhcyBhIDUtZmllbGQgY3JvbiwgdXNlZCB3aXRoIC0tc2NoZWR1bGUgKGRlZmF1bHQ6IFRPS0VOX1JFTkVXX1NDSEVEVUxFIGVudiBvciBcIjAgMCAqICogKlwiOyBtaW4gZXZlcnkgMTUgbWludXRlcyknKVxuICAgICAgLm9wdGlvbignLS1qc29uJywgJ091dHB1dCByZXN1bHQgYXMgSlNPTicsIGZhbHNlKSxcbiAgKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbklkID0gcHJpbnRDb21tYW5kSGVhZGVyKCdTdG9yZSBUb2tlbicsIHVuZGVmaW5lZCwgeyBxdWlldDogb3B0aW9ucy5qc29uIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBwcmludFNzbFdhcm5pbmcob3B0aW9ucy52ZXJpZnlTc2wpO1xuXG4gICAgICAgIGNvbnN0IHJlZ2lvbiA9IHJlc29sdmVBd3NSZWdpb24ob3B0aW9ucy5yZWdpb24pO1xuICAgICAgICBjb25zdCBhd3MgPSB7IHJlZ2lvbiwgcHJvZmlsZTogb3B0aW9ucy5wcm9maWxlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCB9O1xuXG4gICAgICAgIGNvbnN0IGRheXMgPSB2YWxpZGF0ZU51bWJlcihvcHRpb25zLmRheXMsICdkYXlzJywgMSwgMzY1KTtcbiAgICAgICAgY29uc3QgZXhwaXJlc0luU2Vjb25kcyA9IGRheXMgKiAyNCAqIDYwICogNjA7XG5cbiAgICAgICAgY29uc3Qgc2NvcGUgPSBvcHRpb25zLnNjb3BlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgY2F0YWxvZ3VlZCA9IHNjb3BlID8gU0NPUEVfQ0FUQUxPR1tzY29wZV0gOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChzY29wZSAmJiAhY2F0YWxvZ3VlZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biAtLXNjb3BlIFwiJHtzY29wZX1cIi4gU3VwcG9ydGVkOiAke09iamVjdC5rZXlzKFNDT1BFX0NBVEFMT0cpLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2hpY2ggbWFjaGluZSBpZGVudGl0eSB0aGlzIGNyZWRlbnRpYWwgYmVsb25ncyB0bzogdGhlIHNjb3BlJ3Mgb3duXG4gICAgICAgIC8vIGFjY291bnQsIG9yIHRoZSBvcmcncyBzaW5nbGUgZnVsbC1wcml2aWxlZ2UgYXV0b21hdGlvbiBhY2NvdW50LlxuICAgICAgICBjb25zdCBpZGVudGl0eSA9IGNhdGFsb2d1ZWQgPz8gUExBVEZPUk1fQUNDT1VOVDtcbiAgICAgICAgY29uc3QgYWNjb3VudE5hbWUgPSAob3B0aW9ucy5hY2NvdW50IGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gaWRlbnRpdHkuYWNjb3VudDtcblxuICAgICAgICAvLyBTdGVwIDA6IGxvZyBpbiBmaXJzdCB3aGVuIGNyZWRzIGFyZSBhdmFpbGFibGUgYW5kIG5vIFBMQVRGT1JNX1RPS0VOIGlzXG4gICAgICAgIC8vIHNldCAoc2hhcmVkIHdpdGggc2V0dXAtZXZlbnRzKS4gQ3JlZHMgY29tZSBmcm9tIC0taWRlbnRpZmllci8tLXBhc3N3b3JkXG4gICAgICAgIC8vIE9SIHRoZSBlbnYgdmFycyBQTEFURk9STV9JREVOVElGSUVSL1BMQVRGT1JNX1BBU1NXT1JEIOKAlCB0aGUgZW52IHBhdGhcbiAgICAgICAgLy8gbGV0cyBjYWxsZXJzIGxpa2UgYHByb3Zpc2lvbiAtLXdpdGgtZXZlbnRzYCBwYXNzIHRoZW0gd2l0aG91dCBwdXR0aW5nXG4gICAgICAgIC8vIHRoZSBwYXNzd29yZCBvbiB0aGUgY29tbWFuZCBsaW5lICh3aGVyZSBpdCB3b3VsZCBzaG93IGluIHBsYW5zL2xvZ3MpLlxuICAgICAgICBhd2FpdCBlbnN1cmVQbGF0Zm9ybVRva2VuKG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFRoZSBwYXNzd29yZCBpcyBBTFNPIHRoZSBzdGVwLXVwIGZhY3RvciBmb3IgYm90aCB3cml0ZXMgYmVsb3csIHNvIGl0IGlzXG4gICAgICAgIC8vIHJlcXVpcmVkIGV2ZW4gd2hlbiBQTEFURk9STV9UT0tFTiBpcyBhbHJlYWR5IHNldC4gU2F5IHRoYXQgcGxhaW5seVxuICAgICAgICAvLyByYXRoZXIgdGhhbiBmYWlsaW5nIHRocmVlIGNhbGxzIGxhdGVyIHdpdGggYSA0MDMuXG4gICAgICAgIGNvbnN0IHBhc3N3b3JkID0gKG9wdGlvbnMucGFzc3dvcmQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSB8fCBwcm9jZXNzLmVudi5QTEFURk9STV9QQVNTV09SRDtcbiAgICAgICAgaWYgKCFwYXNzd29yZCAmJiAhb3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnQSBwYXNzd29yZCBpcyByZXF1aXJlZDogY3JlYXRpbmcgYSBzZXJ2aWNlIGFjY291bnQgYW5kIGlzc3VpbmcgaXRzIGtleSBhcmUgYm90aCBzdGVwLXVwIGdhdGVkLiAnXG4gICAgICAgICAgICArICdTZXQgUExBVEZPUk1fUEFTU1dPUkQgKHByZWZlcnJlZCkgb3IgcGFzcyAtLXBhc3N3b3JkLicsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50U2VjdGlvbignUHJvdmlzaW9uIFNlcnZpY2UtQWNjb3VudCBLZXknKTtcblxuICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50QXN5bmMob3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgICAgLy8gRHJ5IHJ1biBzdGF5cyBlbnRpcmVseSBPRkZMSU5FIOKAlCBpdCBtdXN0IG5vdCBjcmVhdGUgYW4gYWNjb3VudCBvclxuICAgICAgICAgIC8vIGJ1cm4gYSBrZXkganVzdCB0byBzaG93IHdoYXQgaXQgd291bGQgZG8uXG4gICAgICAgICAgcHJpbnREcnlSdW5QbGFuKHtcbiAgICAgICAgICAgIHNlcnZpY2VBY2NvdW50OiBhY2NvdW50TmFtZSxcbiAgICAgICAgICAgIHJvbGVzOiBzY29wZSA/ICdub25lIChzY29wZWQsIGxlYXN0IHByaXZpbGVnZSknIDogJ29yZyBhZG1pbicsXG4gICAgICAgICAgICBzY29wZTogc2NvcGUgPz8gJyhub25lIOKAlCBmdWxsIHBsYXRmb3JtIGNyZWRlbnRpYWwpJyxcbiAgICAgICAgICAgIHNlY3JldE5hbWU6IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFQ1JFVF9OQU1FIHx8IGAke3NlY3JldE5hbWVGb3JPcmcoJzxvcmdJZD4nLCBzY29wZSA/IHNjb3BlU2VjcmV0TGVhZihzY29wZSkgOiAncGxhdGZvcm0nKX1gLFxuICAgICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgICAgZXhwaXJlc0luRGF5czogZGF5cyxcbiAgICAgICAgICB9LCAhIW9wdGlvbnMuanNvbik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5TmFtZSA9IGAke2FjY291bnROYW1lfS0ke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCl9YDtcbiAgICAgICAgY29uc3QgcHJvdmlzaW9uZWQgPSBhd2FpdCBwcm92aXNpb25TZXJ2aWNlQWNjb3VudEtleSh7XG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCEsXG4gICAgICAgICAgYWNjb3VudE5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGlkZW50aXR5LmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHJvbGVzOiBzY29wZSA/ICdub25lJyA6ICdhZG1pbicsXG4gICAgICAgICAgLi4uKHNjb3BlID8geyBzY29wZSB9IDoge30pLFxuICAgICAgICAgIGV4cGlyZXNJblNlY29uZHMsXG4gICAgICAgICAga2V5TmFtZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJpbnRTdWNjZXNzKGBLZXkgaXNzdWVkIG9uIHNlcnZpY2UgYWNjb3VudCAnJHthY2NvdW50TmFtZX0nIChleHBpcmVzICR7cHJvdmlzaW9uZWQuZXhwaXJlc0F0fSlgKTtcblxuICAgICAgICAvLyBBbiBleHBsaWNpdCBQTEFURk9STV9TRUNSRVRfTkFNRSBzdGlsbCB3aW5zICh0aGUgZXNjYXBlIGhhdGNoIGZvclxuICAgICAgICAvLyBoYW5kLW1hbmFnZWQgcGF0aHMpOyBvdGhlcndpc2UgZGVyaXZlIGl0IGZyb20gdGhlIG9yZyB0aGUgcGxhdGZvcm1cbiAgICAgICAgLy8gcmVwb3J0ZWQsIHdoaWNoIHdvcmtzIHdpdGggYW4gb3BhcXVlIGFjY2VzcyBrZXkgYXMgUExBVEZPUk1fVE9LRU4g4oCUXG4gICAgICAgIC8vIGEga2V5IGNhcnJpZXMgbm8gb3JnIGNsYWltIHRvIGRlY29kZS5cbiAgICAgICAgY29uc3Qgc2VjcmV0TmFtZSA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFQ1JFVF9OQU1FXG4gICAgICAgICAgfHwgc2VjcmV0TmFtZUZvck9yZyhwcm92aXNpb25lZC5vcmdhbml6YXRpb25JZCwgc2NvcGUgPyBzY29wZVNlY3JldExlYWYoc2NvcGUpIDogJ3BsYXRmb3JtJyk7XG5cbiAgICAgICAgYXVkaXRMb2coJ3N0b3JlLXRva2VuJywge1xuICAgICAgICAgIGV4ZWN1dGlvbklkLFxuICAgICAgICAgIHNlY3JldE5hbWUsXG4gICAgICAgICAgZGF5cyxcbiAgICAgICAgICBzZXJ2aWNlQWNjb3VudDogYWNjb3VudE5hbWUsXG4gICAgICAgICAgc2NvcGU6IHNjb3BlID8/IG51bGwsXG4gICAgICAgICAga2V5SWQ6IHByb3Zpc2lvbmVkLmtleUlkLFxuICAgICAgICB9KTtcblxuICAgICAgICBwcmludEluZm8oJ1BhcmFtZXRlcnMnLCB7XG4gICAgICAgICAgc2VjcmV0TmFtZSxcbiAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgc2VydmljZUFjY291bnQ6IGFjY291bnROYW1lLFxuICAgICAgICAgIHNjb3BlOiBzY29wZSA/PyAnKG5vbmUpJyxcbiAgICAgICAgICBkYXlzLFxuICAgICAgICAgIGV4cGlyZXNJbjogYCR7ZXhwaXJlc0luU2Vjb25kc31zYCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gV2hhdCB0aGlzIHJ1biBpcyBSRVBMQUNJTkcsIHJlYWQgYmVmb3JlIHRoZSB3cml0ZSBzbyB0aGUgb2xkIGtleSBjYW4gYmVcbiAgICAgICAgLy8gcmV0aXJlZCBhZnRlciB0aGUgbmV3IG9uZSBpcyBzYWZlbHkgc3RvcmVkLlxuICAgICAgICBjb25zdCBwcmV2aW91cyA9IGF3YWl0IHByZXZpb3VzS2V5SWQoc2VjcmV0TmFtZSwgYXdzKTtcblxuICAgICAgICBjb25zdCBzZWNyZXRWYWx1ZSA9IGJ1aWxkU2VjcmV0VmFsdWUocHJvdmlzaW9uZWQsIGNsaWVudC5nZXRCYXNlVXJsKCksIGV4cGlyZXNJblNlY29uZHMpO1xuXG4gICAgICAgIHByaW50U2VjdGlvbignU3RvcmUgS2V5Jyk7XG5cbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBgUGlwZWxpbmUgQnVpbGRlciBzZXJ2aWNlLWFjY291bnQga2V5ICgke2FjY291bnROYW1lfTsgcmVuZXcgYnkgJHtwcm92aXNpb25lZC5leHBpcmVzQXR9KWA7XG4gICAgICAgIGF3YWl0IHVwc2VydFNlY3JldChzZWNyZXROYW1lLCBzZWNyZXRWYWx1ZSwgZGVzY3JpcHRpb24sIGF3cyk7XG5cbiAgICAgICAgY29uc3QgYXJuID0gYXdhaXQgZ2V0U2VjcmV0QXJuKHNlY3JldE5hbWUsIGF3cyk7XG5cbiAgICAgICAgYXdhaXQgcmV0aXJlUHJldmlvdXNLZXkoY2xpZW50LCBwYXNzd29yZCEsIHByb3Zpc2lvbmVkLCBwcmV2aW91cyk7XG5cbiAgICAgICAgLy8gT3B0aW9uYWxseSBpbnN0YWxsIHRoZSBvbmNlLWEtZGF5IHJvdGF0aW9uIHN0YWNrIHNvIHRoaXMga2V5IG5ldmVyIGxhcHNlcy5cbiAgICAgICAgbGV0IHNjaGVkdWxlRXhwcmVzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAob3B0aW9ucy5zY2hlZHVsZSkge1xuICAgICAgICAgIGNvbnN0IGZpdmVGaWVsZENyb24gPSBvcHRpb25zLmNyb24gfHwgcHJvY2Vzcy5lbnYuVE9LRU5fUkVORVdfU0NIRURVTEUgfHwgREVGQVVMVF9SRU5FV19DUk9OO1xuICAgICAgICAgIHNjaGVkdWxlRXhwcmVzc2lvbiA9IGF3YWl0IGRlcGxveVJlbmV3U2NoZWR1bGUoe1xuICAgICAgICAgICAgc2VjcmV0TmFtZSxcbiAgICAgICAgICAgIGRheXMsXG4gICAgICAgICAgICBmaXZlRmllbGRDcm9uLFxuICAgICAgICAgICAgcmVnaW9uLFxuICAgICAgICAgICAgcHJvZmlsZTogb3B0aW9ucy5wcm9maWxlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpbnRTdG9yZWRLZXkoe1xuICAgICAgICAgIGpzb246ICEhb3B0aW9ucy5qc29uLFxuICAgICAgICAgIHNlY3JldE5hbWUsXG4gICAgICAgICAgYXJuLFxuICAgICAgICAgIHJlZ2lvbixcbiAgICAgICAgICBhY2NvdW50TmFtZSxcbiAgICAgICAgICBwcm92aXNpb25lZCxcbiAgICAgICAgICBkYXlzLFxuICAgICAgICAgIHNjaGVkdWxlRXhwcmVzc2lvbixcbiAgICAgICAgfSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5BUElfUkVRVUVTVCwge1xuICAgICAgICAgIGRlYnVnOiBwcm9ncmFtLm9wdHMoKS5kZWJ1ZyxcbiAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgIGNvbW1hbmQ6ICdzdG9yZS10b2tlbicsXG4gICAgICAgICAgICBleGVjdXRpb25JZCxcbiAgICAgICAgICAgIHNlY3JldE5hbWU6IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFQ1JFVF9OQU1FIHx8ICcoZGVyaXZlZCBmcm9tIHRoZSBvcmcpJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,72 @@
1
+ import { Command } from 'commander';
2
+ import { type Exec } from '../utils/plugin-docker.js';
3
+ /** Mount point of the sample workspace inside the container (the step's source dir). */
4
+ export declare const CONTAINER_WORKSPACE = "/workspace";
5
+ export interface TestPluginOptions {
6
+ dir: string;
7
+ image?: string;
8
+ workspace?: string;
9
+ env?: string[];
10
+ metadata?: string[];
11
+ var?: string[];
12
+ keep?: boolean;
13
+ }
14
+ /** A plugin run that failed: the step would be red in CodeBuild. */
15
+ export declare class PluginTestFailure extends Error {
16
+ constructor(message: string);
17
+ }
18
+ /** `KEY=VALUE` flags → a record (the value may itself contain `=`). */
19
+ export declare function parseKeyValues(pairs: string[] | undefined, flag: string): Record<string, string>;
20
+ /** What a run needs, resolved from the spec + flags (no side effects). */
21
+ export interface TestPlan {
22
+ name: string;
23
+ version: string;
24
+ failureBehavior: 'fail' | 'warn' | 'ignore';
25
+ /** Plain env passed as `-e KEY=VALUE`. */
26
+ env: Record<string, string>;
27
+ /** Secret NAMES passed as `-e NAME` (docker reads the value from this process's env). */
28
+ secretNames: string[];
29
+ missingOptionalSecrets: string[];
30
+ installScript: string;
31
+ buildScript: string;
32
+ primaryOutputDirectory: string | undefined;
33
+ smokeTest: string | undefined;
34
+ timeoutMs: number | undefined;
35
+ }
36
+ /**
37
+ * Resolve the spec the way the pipeline step does: `{{ … }}` templates against
38
+ * the given pipeline metadata/vars, env = spec env ← non-namespaced metadata ←
39
+ * `--env`, the step's WORKDIR bootstrap, and the build commands wrapped for the
40
+ * effective failureBehavior (a security-category plugin is always `fail`).
41
+ */
42
+ export declare function planPluginTest(spec: Record<string, unknown>, flags: {
43
+ env?: Record<string, string>;
44
+ metadata?: Record<string, string>;
45
+ vars?: Record<string, string>;
46
+ }, hostEnv?: NodeJS.ProcessEnv): TestPlan;
47
+ /** `docker run` arguments for one phase (secret VALUES never appear here). */
48
+ export declare function dockerRunArgs(image: string, workspace: string, plan: Pick<TestPlan, 'env' | 'secretNames'>, script: string): string[];
49
+ /** Copy the sample workspace to a scratch dir the container's uid 1000 can write. */
50
+ export declare function prepareWorkspace(source: string | undefined): string;
51
+ /** Where the step's primary output lands on the host, honouring a relative WORKDIR. */
52
+ export declare function outputPath(workspace: string, plan: Pick<TestPlan, 'env' | 'primaryOutputDirectory'>): string | null;
53
+ /**
54
+ * Build (or take) the image, then run the plugin as its CodeBuild step would:
55
+ * install phase, build phase (failureBehavior applied), the primary output
56
+ * check, then the spec's smokeTest. Any failure throws — a step that can't run
57
+ * or that fails is red, never green.
58
+ */
59
+ export declare function runPluginTest(options: TestPluginOptions, exec?: Exec): Promise<{
60
+ outputFiles: number | null;
61
+ }>;
62
+ /**
63
+ * Register `plugin test` — run a plugin's install + build commands locally in
64
+ * its image against a sample workspace, check its primary output, and run its
65
+ * smokeTest. Exits non-zero on any failure.
66
+ *
67
+ * Usage:
68
+ * pipeline-manager plugin test --dir ./my-linter --workspace ./sample-app
69
+ * pipeline-manager plugin test --dir ./my-linter --image my-linter:dev --metadata STAGE=dev
70
+ */
71
+ export declare function testPlugin(program: Command): void;
72
+ //# sourceMappingURL=test-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-plugin.d.ts","sourceRoot":"","sources":["../../src/commands/test-plugin.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,EACoF,KAAK,IAAI,EACnG,MAAM,2BAA2B,CAAC;AAGnC,wFAAwF;AACxF,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,oEAAoE;AACpE,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACF;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQhG;AAID,0EAA0E;AAC1E,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC5C,0CAA0C;IAC1C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,yFAAyF;IACzF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EACzG,OAAO,GAAE,MAAM,CAAC,UAAwB,GACvC,QAAQ,CAsDV;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAUrI;AAED,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAmBnE;AAED,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,wBAAwB,CAAC,GAAG,MAAM,GAAG,IAAI,CAOnH;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,iBAAiB,EAAE,IAAI,GAAE,IAAgB,GAAG,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CA4F/H;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwBjD"}