@pipeline-builder/pipeline-manager 3.4.70 → 3.4.72

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 (90) hide show
  1. package/README.md +43 -2
  2. package/dist/agent/ai.d.ts +55 -0
  3. package/dist/agent/ai.d.ts.map +1 -0
  4. package/dist/agent/ai.js +130 -0
  5. package/dist/agent/bootstrap.d.ts +54 -0
  6. package/dist/agent/bootstrap.d.ts.map +1 -0
  7. package/dist/agent/bootstrap.js +76 -0
  8. package/dist/agent/executor.d.ts +27 -0
  9. package/dist/agent/executor.d.ts.map +1 -0
  10. package/dist/agent/executor.js +57 -0
  11. package/dist/agent/health.d.ts +22 -0
  12. package/dist/agent/health.d.ts.map +1 -0
  13. package/dist/agent/health.js +55 -0
  14. package/dist/agent/post-steps.d.ts +55 -0
  15. package/dist/agent/post-steps.d.ts.map +1 -0
  16. package/dist/agent/post-steps.js +73 -0
  17. package/dist/agent/prereqs.d.ts +25 -0
  18. package/dist/agent/prereqs.d.ts.map +1 -0
  19. package/dist/agent/prereqs.js +100 -0
  20. package/dist/agent/targets.d.ts +122 -0
  21. package/dist/agent/targets.d.ts.map +1 -0
  22. package/dist/agent/targets.js +180 -0
  23. package/dist/agent/troubleshoot.d.ts +30 -0
  24. package/dist/agent/troubleshoot.d.ts.map +1 -0
  25. package/dist/agent/troubleshoot.js +87 -0
  26. package/dist/boilerplate.js +8 -13
  27. package/dist/cli.d.ts.map +1 -1
  28. package/dist/cli.js +123 -118
  29. package/dist/commands/audit-stacks.js +22 -24
  30. package/dist/commands/audit-tokens.js +25 -27
  31. package/dist/commands/bootstrap.js +29 -37
  32. package/dist/commands/create-pipeline.js +55 -92
  33. package/dist/commands/deploy.d.ts.map +1 -1
  34. package/dist/commands/deploy.js +58 -62
  35. package/dist/commands/get-pipeline.js +24 -28
  36. package/dist/commands/get-plugin.js +24 -28
  37. package/dist/commands/list-pipelines.js +30 -31
  38. package/dist/commands/list-plugins.js +32 -33
  39. package/dist/commands/login.js +44 -49
  40. package/dist/commands/org-export.js +22 -60
  41. package/dist/commands/provision.d.ts +13 -0
  42. package/dist/commands/provision.d.ts.map +1 -0
  43. package/dist/commands/provision.js +489 -0
  44. package/dist/commands/register.js +29 -30
  45. package/dist/commands/setup-events.d.ts.map +1 -1
  46. package/dist/commands/setup-events.js +42 -77
  47. package/dist/commands/status.js +20 -25
  48. package/dist/commands/store-token.js +44 -82
  49. package/dist/commands/synth.d.ts.map +1 -1
  50. package/dist/commands/synth.js +36 -35
  51. package/dist/commands/upload-plugin.js +59 -96
  52. package/dist/commands/validate-templates.d.ts.map +1 -1
  53. package/dist/commands/validate-templates.js +23 -29
  54. package/dist/commands/version.js +42 -47
  55. package/dist/config/cli.constants.d.ts.map +1 -1
  56. package/dist/config/cli.constants.js +24 -31
  57. package/dist/types/config.js +2 -3
  58. package/dist/types/error.js +3 -7
  59. package/dist/types/index.d.ts +4 -4
  60. package/dist/types/index.d.ts.map +1 -1
  61. package/dist/types/index.js +5 -21
  62. package/dist/types/pipeline.js +2 -3
  63. package/dist/types/plugin.js +2 -3
  64. package/dist/utils/api-client.d.ts +1 -1
  65. package/dist/utils/api-client.d.ts.map +1 -1
  66. package/dist/utils/api-client.js +23 -28
  67. package/dist/utils/audit-log.js +16 -22
  68. package/dist/utils/auth-guard.js +2 -5
  69. package/dist/utils/aws-secrets.js +17 -23
  70. package/dist/utils/banner.js +16 -23
  71. package/dist/utils/cdk-utils.js +14 -24
  72. package/dist/utils/command-utils.d.ts +1 -1
  73. package/dist/utils/command-utils.d.ts.map +1 -1
  74. package/dist/utils/command-utils.js +32 -44
  75. package/dist/utils/config-loader.d.ts +1 -1
  76. package/dist/utils/config-loader.d.ts.map +1 -1
  77. package/dist/utils/config-loader.js +24 -58
  78. package/dist/utils/error-handler.d.ts +1 -1
  79. package/dist/utils/error-handler.d.ts.map +1 -1
  80. package/dist/utils/error-handler.js +16 -24
  81. package/dist/utils/list-command-utils.js +15 -20
  82. package/dist/utils/output-utils.d.ts +1 -1
  83. package/dist/utils/output-utils.d.ts.map +1 -1
  84. package/dist/utils/output-utils.js +35 -55
  85. package/dist/utils/plugin-resolver.d.ts +1 -1
  86. package/dist/utils/plugin-resolver.d.ts.map +1 -1
  87. package/dist/utils/plugin-resolver.js +6 -8
  88. package/dist/utils/rate-limiter.js +11 -19
  89. package/dist/utils/registry.js +16 -22
  90. package/package.json +26 -17
package/dist/cli.js CHANGED
@@ -1,41 +1,40 @@
1
1
  #!/usr/bin/env node
2
- "use strict";
3
2
  // Copyright 2026 Pipeline Builder Contributors
4
3
  // SPDX-License-Identifier: Apache-2.0
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.initializeCli = initializeCli;
7
- exports.main = main;
8
- const commander_1 = require("commander");
9
- const audit_stacks_1 = require("./commands/audit-stacks");
10
- const audit_tokens_1 = require("./commands/audit-tokens");
11
- const bootstrap_1 = require("./commands/bootstrap");
12
- const create_pipeline_1 = require("./commands/create-pipeline");
13
- const deploy_1 = require("./commands/deploy");
14
- const get_pipeline_1 = require("./commands/get-pipeline");
15
- const get_plugin_1 = require("./commands/get-plugin");
16
- const list_pipelines_1 = require("./commands/list-pipelines");
17
- const list_plugins_1 = require("./commands/list-plugins");
18
- const login_1 = require("./commands/login");
19
- const org_export_1 = require("./commands/org-export");
20
- const register_1 = require("./commands/register");
21
- const setup_events_1 = require("./commands/setup-events");
22
- const status_1 = require("./commands/status");
23
- const store_token_1 = require("./commands/store-token");
24
- const synth_1 = require("./commands/synth");
25
- const upload_plugin_1 = require("./commands/upload-plugin");
26
- const validate_templates_1 = require("./commands/validate-templates");
27
- const version_1 = require("./commands/version");
28
- const cli_constants_1 = require("./config/cli.constants");
29
- const banner_1 = require("./utils/banner");
30
- const error_handler_1 = require("./utils/error-handler");
31
- const output_utils_1 = require("./utils/output-utils");
4
+ import { realpathSync } from 'node:fs';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { program } from 'commander';
7
+ import { auditStacks } from './commands/audit-stacks.js';
8
+ import { auditTokens } from './commands/audit-tokens.js';
9
+ import { bootstrap } from './commands/bootstrap.js';
10
+ import { createPipeline } from './commands/create-pipeline.js';
11
+ import { deploy } from './commands/deploy.js';
12
+ import { getPipeline } from './commands/get-pipeline.js';
13
+ import { getPlugin } from './commands/get-plugin.js';
14
+ import { listPipelines } from './commands/list-pipelines.js';
15
+ import { listPlugins } from './commands/list-plugins.js';
16
+ import { login } from './commands/login.js';
17
+ import { orgExport } from './commands/org-export.js';
18
+ import { provision } from './commands/provision.js';
19
+ import { register } from './commands/register.js';
20
+ import { setupEvents } from './commands/setup-events.js';
21
+ import { status } from './commands/status.js';
22
+ import { storeToken } from './commands/store-token.js';
23
+ import { synth } from './commands/synth.js';
24
+ import { uploadPlugin } from './commands/upload-plugin.js';
25
+ import { validateTemplatesCommand } from './commands/validate-templates.js';
26
+ import { version } from './commands/version.js';
27
+ import { APP_NAME, APP_DESCRIPTION, APP_VERSION, ENV_VARS, isDebugMode, generateExecutionId, } from './config/cli.constants.js';
28
+ import { banner, miniBanner } from './utils/banner.js';
29
+ import { ERROR_CODES, handleError } from './utils/error-handler.js';
30
+ import { printInfo, printError, printWarning, printDebug, printSection } from './utils/output-utils.js';
32
31
  /**
33
32
  * Check environment and display warnings
34
33
  */
35
34
  function checkEnvironment() {
36
35
  const warnings = [];
37
36
  // Check for required environment variables
38
- if (!process.env[cli_constants_1.ENV_VARS.PLATFORM_TOKEN]) {
37
+ if (!process.env[ENV_VARS.PLATFORM_TOKEN]) {
39
38
  warnings.push('PLATFORM_TOKEN environment variable is not set');
40
39
  warnings.push('Authentication will fail for API operations');
41
40
  }
@@ -47,9 +46,9 @@ function checkEnvironment() {
47
46
  }
48
47
  // Display warnings
49
48
  if (warnings.length > 0) {
50
- (0, output_utils_1.printSection)('Environment Warnings');
49
+ printSection('Environment Warnings');
51
50
  warnings.forEach(warning => {
52
- (0, output_utils_1.printWarning)(warning);
51
+ printWarning(warning);
53
52
  });
54
53
  console.log('');
55
54
  }
@@ -60,11 +59,11 @@ function checkEnvironment() {
60
59
  function displayStartupInfo(options) {
61
60
  if (options.quiet)
62
61
  return;
63
- const executionId = (0, cli_constants_1.generateExecutionId)();
62
+ const executionId = generateExecutionId();
64
63
  if (options.debug || options.verbose) {
65
- (0, output_utils_1.printDebug)('CLI Configuration', {
66
- name: cli_constants_1.APP_NAME,
67
- version: cli_constants_1.APP_VERSION,
64
+ printDebug('CLI Configuration', {
65
+ name: APP_NAME,
66
+ version: APP_VERSION,
68
67
  executionId,
69
68
  node: process.version,
70
69
  platform: process.platform,
@@ -72,14 +71,14 @@ function displayStartupInfo(options) {
72
71
  cwd: process.cwd(),
73
72
  env: {
74
73
  debug: process.env.DEBUG,
75
- token: process.env[cli_constants_1.ENV_VARS.PLATFORM_TOKEN] ? 'set' : 'not set',
76
- url: process.env[cli_constants_1.ENV_VARS.PLATFORM_BASE_URL] || 'default',
74
+ token: process.env[ENV_VARS.PLATFORM_TOKEN] ? 'set' : 'not set',
75
+ url: process.env[ENV_VARS.PLATFORM_BASE_URL] || 'default',
77
76
  },
78
77
  });
79
78
  }
80
79
  else {
81
- (0, output_utils_1.printDebug)('Starting CLI', {
82
- version: cli_constants_1.APP_VERSION,
80
+ printDebug('Starting CLI', {
81
+ version: APP_VERSION,
83
82
  executionId,
84
83
  });
85
84
  }
@@ -88,75 +87,76 @@ function displayStartupInfo(options) {
88
87
  * Register all CLI commands
89
88
  */
90
89
  function registerCommands() {
91
- (0, output_utils_1.printDebug)('Registering commands');
90
+ printDebug('Registering commands');
92
91
  // Configure program
93
- commander_1.program
94
- .name(cli_constants_1.APP_NAME)
95
- .description(cli_constants_1.APP_DESCRIPTION)
96
- .version(cli_constants_1.APP_VERSION, '-v, --version', 'Show CLI version')
92
+ program
93
+ .name(APP_NAME)
94
+ .description(APP_DESCRIPTION)
95
+ .version(APP_VERSION, '-v, --version', 'Show CLI version')
97
96
  .option('--debug', 'Enable debug output with stack traces', false)
98
97
  .option('--verbose', 'Show detailed information', false)
99
98
  .option('--quiet', 'Minimal output (errors only)', false)
100
99
  .option('--no-color', 'Disable colored output', false)
101
100
  .addHelpText('after', `
102
- Environment Variables ${cli_constants_1.ENV_VARS.PLATFORM_TOKEN} Authentication token (required)
103
- ${cli_constants_1.ENV_VARS.PLATFORM_BASE_URL} API base URL (optional)
104
- ${cli_constants_1.ENV_VARS.CLI_CONFIG_PATH} Config file path (optional)
105
- ${cli_constants_1.ENV_VARS.TLS_REJECT_UNAUTHORIZED} Disable SSL verification if '0'
106
- ${cli_constants_1.ENV_VARS.DEBUG} Enable debug mode if 'true'
101
+ Environment Variables ${ENV_VARS.PLATFORM_TOKEN} Authentication token (required)
102
+ ${ENV_VARS.PLATFORM_BASE_URL} API base URL (optional)
103
+ ${ENV_VARS.CLI_CONFIG_PATH} Config file path (optional)
104
+ ${ENV_VARS.TLS_REJECT_UNAUTHORIZED} Disable SSL verification if '0'
105
+ ${ENV_VARS.DEBUG} Enable debug mode if 'true'
107
106
 
108
- Examples $ ${cli_constants_1.APP_NAME} version
109
- $ ${cli_constants_1.APP_NAME} list-pipelines --project my-app
110
- $ ${cli_constants_1.APP_NAME} get-pipeline --id pipe-123 --format json
111
- $ ${cli_constants_1.APP_NAME} store-token --days 30 --region us-east-1
112
- $ ${cli_constants_1.APP_NAME} bootstrap --account 123456789012 --region us-east-1
113
- $ ${cli_constants_1.APP_NAME} deploy --id pipe-123 --profile production
107
+ Examples $ ${APP_NAME} version
108
+ $ ${APP_NAME} list-pipelines --project my-app
109
+ $ ${APP_NAME} get-pipeline --id pipe-123 --format json
110
+ $ ${APP_NAME} store-token --days 30 --region us-east-1
111
+ $ ${APP_NAME} bootstrap --account 123456789012 --region us-east-1
112
+ $ ${APP_NAME} deploy --id pipe-123 --profile production
114
113
 
115
114
  `);
116
115
  // Version command (special handling)
117
- (0, version_1.version)(commander_1.program);
116
+ version(program);
118
117
  // Authentication commands
119
- (0, output_utils_1.printDebug)('Registering authentication commands');
120
- (0, login_1.login)(commander_1.program); // Login and obtain PLATFORM_TOKEN (also supports --refresh)
118
+ printDebug('Registering authentication commands');
119
+ login(program); // Login and obtain PLATFORM_TOKEN (also supports --refresh)
121
120
  // Query commands
122
- (0, output_utils_1.printDebug)('Registering query commands');
123
- (0, get_plugin_1.getPlugin)(commander_1.program); // Single plugin by ID
124
- (0, list_plugins_1.listPlugins)(commander_1.program); // Multiple plugins with filters
125
- (0, get_pipeline_1.getPipeline)(commander_1.program); // Single pipeline by ID
126
- (0, list_pipelines_1.listPipelines)(commander_1.program); // Multiple pipelines with filters
121
+ printDebug('Registering query commands');
122
+ getPlugin(program); // Single plugin by ID
123
+ listPlugins(program); // Multiple plugins with filters
124
+ getPipeline(program); // Single pipeline by ID
125
+ listPipelines(program); // Multiple pipelines with filters
127
126
  // Create/Upload commands
128
- (0, output_utils_1.printDebug)('Registering create/upload commands');
129
- (0, create_pipeline_1.createPipeline)(commander_1.program); // Create pipeline configuration
130
- (0, upload_plugin_1.uploadPlugin)(commander_1.program); // Upload and deploy plugin
127
+ printDebug('Registering create/upload commands');
128
+ createPipeline(program); // Create pipeline configuration
129
+ uploadPlugin(program); // Upload and deploy plugin
131
130
  // Status command
132
- (0, output_utils_1.printDebug)('Registering status command');
133
- (0, status_1.status)(commander_1.program); // Show environment and connectivity status
131
+ printDebug('Registering status command');
132
+ status(program); // Show environment and connectivity status
134
133
  // Org admin commands
135
- (0, output_utils_1.printDebug)('Registering org admin commands');
136
- (0, org_export_1.orgExport)(commander_1.program); // GDPR portability export — sysadmin (any org) or org admin (own org)
134
+ printDebug('Registering org admin commands');
135
+ orgExport(program); // GDPR portability export — sysadmin (any org) or org admin (own org)
137
136
  // Deployment commands
138
- (0, output_utils_1.printDebug)('Registering deployment commands');
139
- (0, store_token_1.storeToken)(commander_1.program); // Generate JWT token and store in Secrets Manager
140
- (0, setup_events_1.setupEvents)(commander_1.program); // Deploy EventBridge event ingestion infrastructure
141
- (0, bootstrap_1.bootstrap)(commander_1.program); // Bootstrap CDK toolkit stack
142
- (0, deploy_1.deploy)(commander_1.program); // Deploy pipeline with CDK (--app prints boilerplate path)
143
- (0, register_1.register)(commander_1.program); // Re-register a deployed pipeline ARN + drain pending intents from prior failed deploys
137
+ printDebug('Registering deployment commands');
138
+ storeToken(program); // Generate JWT token and store in Secrets Manager
139
+ setupEvents(program); // Deploy EventBridge event ingestion infrastructure
140
+ bootstrap(program); // Bootstrap CDK toolkit stack
141
+ deploy(program); // Deploy pipeline with CDK (--app prints boilerplate path)
142
+ register(program); // Re-register a deployed pipeline ARN + drain pending intents from prior failed deploys
143
+ provision(program); // AI-assisted advisor to deploy the PLATFORM (local/minikube/EC2/Fargate) — read-only
144
144
  // Operator audit commands (cron-friendly: exit 1 on findings)
145
- (0, output_utils_1.printDebug)('Registering audit commands');
146
- (0, audit_tokens_1.auditTokens)(commander_1.program); // Scan Secrets Manager for expiring platform tokens
147
- (0, audit_stacks_1.auditStacks)(commander_1.program); // Diff CFN stacks vs pipeline_registry to find drift
148
- (0, synth_1.synth)(commander_1.program); // Run CDK synthesis
149
- (0, validate_templates_1.validateTemplatesCommand)(commander_1.program); // Validate {{... }} templates in a pipeline or plugin
145
+ printDebug('Registering audit commands');
146
+ auditTokens(program); // Scan Secrets Manager for expiring platform tokens
147
+ auditStacks(program); // Diff CFN stacks vs pipeline_registry to find drift
148
+ synth(program); // Run CDK synthesis
149
+ validateTemplatesCommand(program); // Validate {{... }} templates in a pipeline or plugin
150
150
  // Shell completions
151
- (0, output_utils_1.printDebug)('Registering completions command');
152
- commander_1.program
151
+ printDebug('Registering completions command');
152
+ program
153
153
  .command('completions')
154
154
  .description('Generate shell completions (bash, zsh, fish)')
155
155
  .argument('<shell>', 'Shell type: bash, zsh, or fish')
156
156
  .action((shell) => {
157
157
  // Pull command names from commander's registered list so completions never
158
158
  // drift from the actual CLI surface. Sorted for stable output.
159
- const commands = commander_1.program.commands.map(c => c.name()).sort().join(' ');
159
+ const commands = program.commands.map(c => c.name()).sort().join(' ');
160
160
  switch (shell) {
161
161
  case 'bash':
162
162
  console.log(`# pipeline-manager bash completions
@@ -184,7 +184,7 @@ complete -c pipeline-manager -n '__fish_use_subcommand' -a '${commands}'`);
184
184
  process.exit(1);
185
185
  }
186
186
  });
187
- (0, output_utils_1.printDebug)('All commands registered successfully');
187
+ printDebug('All commands registered successfully');
188
188
  }
189
189
  /**
190
190
  * Handle program errors
@@ -193,12 +193,12 @@ function setupErrorHandlers() {
193
193
  // Handle uncaught exceptions
194
194
  process.on('uncaughtException', (error) => {
195
195
  console.error(''); // Empty line
196
- (0, output_utils_1.printError)('Uncaught exception', {
196
+ printError('Uncaught exception', {
197
197
  error: error.message,
198
198
  name: error.name,
199
199
  });
200
- (0, error_handler_1.handleError)(error, error_handler_1.ERROR_CODES.GENERAL, {
201
- debug: (0, cli_constants_1.isDebugMode)(commander_1.program.opts()),
200
+ handleError(error, ERROR_CODES.GENERAL, {
201
+ debug: isDebugMode(program.opts()),
202
202
  exit: true,
203
203
  context: {
204
204
  type: 'uncaughtException',
@@ -208,12 +208,12 @@ function setupErrorHandlers() {
208
208
  // Handle unhandled promise rejections
209
209
  process.on('unhandledRejection', (reason) => {
210
210
  console.error(''); // Empty line
211
- (0, output_utils_1.printError)('Unhandled promise rejection', {
211
+ printError('Unhandled promise rejection', {
212
212
  reason: reason instanceof Error ? reason.message : String(reason),
213
213
  });
214
214
  const error = reason instanceof Error ? reason : new Error(String(reason));
215
- (0, error_handler_1.handleError)(error, error_handler_1.ERROR_CODES.GENERAL, {
216
- debug: (0, cli_constants_1.isDebugMode)(commander_1.program.opts()),
215
+ handleError(error, ERROR_CODES.GENERAL, {
216
+ debug: isDebugMode(program.opts()),
217
217
  exit: true,
218
218
  context: {
219
219
  type: 'unhandledRejection',
@@ -223,14 +223,14 @@ function setupErrorHandlers() {
223
223
  // Handle SIGINT (Ctrl+C)
224
224
  process.on('SIGINT', () => {
225
225
  console.log(''); // Empty line
226
- (0, output_utils_1.printWarning)('Process interrupted by user (SIGINT)');
226
+ printWarning('Process interrupted by user (SIGINT)');
227
227
  console.log(''); // Empty line
228
228
  process.exit(130); // Standard exit code for SIGINT
229
229
  });
230
230
  // Handle SIGTERM
231
231
  process.on('SIGTERM', () => {
232
232
  console.log(''); // Empty line
233
- (0, output_utils_1.printWarning)('Process terminated (SIGTERM)');
233
+ printWarning('Process terminated (SIGTERM)');
234
234
  console.log(''); // Empty line
235
235
  process.exit(143); // Standard exit code for SIGTERM
236
236
  });
@@ -240,7 +240,7 @@ function setupErrorHandlers() {
240
240
  *
241
241
  * @param options - CLI initialization options
242
242
  */
243
- function initializeCli(options = {}) {
243
+ export function initializeCli(options = {}) {
244
244
  const { showBanner = true, minimalBanner = false, debug = false, verbose = false, quiet = false, noColor = false, } = options;
245
245
  // Handle color output
246
246
  if (noColor) {
@@ -249,10 +249,10 @@ function initializeCli(options = {}) {
249
249
  // Display banner
250
250
  if (showBanner && !quiet) {
251
251
  if (minimalBanner) {
252
- (0, banner_1.miniBanner)();
252
+ miniBanner();
253
253
  }
254
254
  else {
255
- (0, banner_1.banner)({
255
+ banner({
256
256
  minimal: false,
257
257
  showDescription: true,
258
258
  showTimestamp: debug || verbose,
@@ -271,14 +271,14 @@ function initializeCli(options = {}) {
271
271
  // Register commands
272
272
  try {
273
273
  registerCommands();
274
- (0, output_utils_1.printDebug)('CLI initialization complete');
274
+ printDebug('CLI initialization complete');
275
275
  }
276
276
  catch (error) {
277
- (0, output_utils_1.printError)('CLI initialization failed', {
277
+ printError('CLI initialization failed', {
278
278
  error: error instanceof Error ? error.message : String(error),
279
279
  });
280
- (0, error_handler_1.handleError)(error, error_handler_1.ERROR_CODES.CONFIGURATION, {
281
- debug: debug || (0, cli_constants_1.isDebugMode)(),
280
+ handleError(error, ERROR_CODES.CONFIGURATION, {
281
+ debug: debug || isDebugMode(),
282
282
  exit: true,
283
283
  context: {
284
284
  stage: 'initialization',
@@ -291,36 +291,36 @@ function initializeCli(options = {}) {
291
291
  */
292
292
  function parseArguments() {
293
293
  try {
294
- commander_1.program.parse(process.argv);
294
+ program.parse(process.argv);
295
295
  // Show help if no command provided
296
296
  const args = process.argv.slice(2);
297
297
  if (args.length === 0) {
298
- (0, output_utils_1.printInfo)('No command specified - displaying help');
298
+ printInfo('No command specified - displaying help');
299
299
  console.log(''); // Empty line
300
- commander_1.program.outputHelp();
300
+ program.outputHelp();
301
301
  process.exit(0);
302
302
  }
303
303
  // Check if command exists
304
304
  const command = args[0];
305
305
  if (command && !command.startsWith('-')) {
306
- const commandExists = commander_1.program.commands.some(cmd => cmd.name() === command);
306
+ const commandExists = program.commands.some(cmd => cmd.name() === command);
307
307
  if (!commandExists) {
308
308
  console.log(''); // Empty line
309
- (0, output_utils_1.printError)(`Unknown command: ${command}`);
309
+ printError(`Unknown command: ${command}`);
310
310
  console.log(''); // Empty line
311
- (0, output_utils_1.printInfo)('Available commands:');
312
- commander_1.program.commands.forEach(cmd => {
311
+ printInfo('Available commands:');
312
+ program.commands.forEach(cmd => {
313
313
  console.log(` • ${cmd.name()} - ${cmd.description()}`);
314
314
  });
315
315
  console.log(''); // Empty line
316
316
  process.exit(1);
317
317
  }
318
318
  }
319
- (0, output_utils_1.printDebug)('Command line arguments parsed successfully');
319
+ printDebug('Command line arguments parsed successfully');
320
320
  }
321
321
  catch (error) {
322
- (0, error_handler_1.handleError)(error, error_handler_1.ERROR_CODES.GENERAL, {
323
- debug: (0, cli_constants_1.isDebugMode)(commander_1.program.opts()),
322
+ handleError(error, ERROR_CODES.GENERAL, {
323
+ debug: isDebugMode(program.opts()),
324
324
  exit: true,
325
325
  context: {
326
326
  stage: 'argument-parsing',
@@ -346,23 +346,23 @@ function parseArguments() {
346
346
  * main({ debug: true, verbose: true });
347
347
  * ```
348
348
  */
349
- function main(options = {}) {
349
+ export function main(options = {}) {
350
350
  try {
351
351
  // Initialize CLI
352
352
  initializeCli(options);
353
353
  // Parse arguments and execute command
354
354
  parseArguments();
355
355
  // If we reach here, command completed successfully
356
- (0, output_utils_1.printDebug)('CLI execution completed successfully');
356
+ printDebug('CLI execution completed successfully');
357
357
  }
358
358
  catch (error) {
359
359
  // Final catch-all error handler
360
360
  console.error(''); // Empty line
361
- (0, output_utils_1.printError)('Fatal CLI error', {
361
+ printError('Fatal CLI error', {
362
362
  error: error instanceof Error ? error.message : String(error),
363
363
  });
364
- (0, error_handler_1.handleError)(error, error_handler_1.ERROR_CODES.GENERAL, {
365
- debug: (0, cli_constants_1.isDebugMode)(options),
364
+ handleError(error, ERROR_CODES.GENERAL, {
365
+ debug: isDebugMode(options),
366
366
  exit: true,
367
367
  context: {
368
368
  stage: 'main',
@@ -372,9 +372,14 @@ function main(options = {}) {
372
372
  }
373
373
  }
374
374
  /**
375
- * Run CLI if executed directly
375
+ * Run CLI if executed directly. ESM has no `require.main`; compare the invoked
376
+ * script to this module's path, resolving symlinks on both sides so the `bin`
377
+ * symlink (node_modules/.bin/pipeline-manager → dist/cli.js) still matches.
376
378
  */
377
- if (require.main === module) {
379
+ const invokedScript = process.argv[1];
380
+ const isMainModule = invokedScript !== undefined
381
+ && realpathSync(invokedScript) === realpathSync(fileURLToPath(import.meta.url));
382
+ if (isMainModule) {
378
383
  // Parse CLI options from environment or command line
379
384
  const options = {
380
385
  debug: process.env.DEBUG === 'true',
@@ -384,4 +389,4 @@ if (require.main === module) {
384
389
  };
385
390
  main(options);
386
391
  }
387
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLCtDQUErQztBQUMvQyxzQ0FBc0M7O0FBc1R0QyxzQ0F5REM7QUFrRUQsb0JBMEJDO0FBemNELHlDQUFvQztBQUNwQywwREFBc0Q7QUFDdEQsMERBQXNEO0FBQ3RELG9EQUFpRDtBQUNqRCxnRUFBNEQ7QUFDNUQsOENBQTJDO0FBQzNDLDBEQUFzRDtBQUN0RCxzREFBa0Q7QUFDbEQsOERBQTBEO0FBQzFELDBEQUFzRDtBQUN0RCw0Q0FBeUM7QUFDekMsc0RBQWtEO0FBQ2xELGtEQUErQztBQUMvQywwREFBc0Q7QUFDdEQsOENBQTJDO0FBQzNDLHdEQUFvRDtBQUNwRCw0Q0FBeUM7QUFDekMsNERBQXdEO0FBQ3hELHNFQUF5RTtBQUN6RSxnREFBNkM7QUFDN0MsMERBT2dDO0FBQ2hDLDJDQUFvRDtBQUNwRCx5REFBaUU7QUFDakUsdURBQXFHO0FBMkNyRzs7R0FFRztBQUNILFNBQVMsZ0JBQWdCO0lBQ3ZCLE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztJQUU5QiwyQ0FBMkM7SUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQzFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUNoRSxRQUFRLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQ3BDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDN0UsSUFBSSxZQUFZ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QUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUMzQyxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssR0FBRztLQUM3RSxDQUFDO0lBRUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG4vLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcHJvZ3JhbSB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBhdWRpdFN0YWNrcyB9IGZyb20gJy4vY29tbWFuZHMvYXVkaXQtc3RhY2tzJztcbmltcG9ydCB7IGF1ZGl0VG9rZW5zIH0gZnJvbSAnLi9jb21tYW5kcy9hdWRpdC10b2tlbnMnO1xuaW1wb3J0IHsgYm9vdHN0cmFwIH0gZnJvbSAnLi9jb21tYW5kcy9ib290c3RyYXAnO1xuaW1wb3J0IHsgY3JlYXRlUGlwZWxpbmUgfSBmcm9tICcuL2NvbW1hbmRzL2NyZWF0ZS1waXBlbGluZSc7XG5pbXBvcnQgeyBkZXBsb3kgfSBmcm9tICcuL2NvbW1hbmRzL2RlcGxveSc7XG5pbXBvcnQgeyBnZXRQaXBlbGluZSB9IGZyb20gJy4vY29tbWFuZHMvZ2V0LXBpcGVsaW5lJztcbmltcG9ydCB7IGdldFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvZ2V0LXBsdWdpbic7XG5pbXBvcnQgeyBsaXN0UGlwZWxpbmVzIH0gZnJvbSAnLi9jb21tYW5kcy9saXN0LXBpcGVsaW5lcyc7XG5pbXBvcnQgeyBsaXN0UGx1Z2lucyB9IGZyb20gJy4vY29tbWFuZHMvbGlzdC1wbHVnaW5zJztcbmltcG9ydCB7IGxvZ2luIH0gZnJvbSAnLi9jb21tYW5kcy9sb2dpbic7XG5pbXBvcnQgeyBvcmdFeHBvcnQgfSBmcm9tICcuL2NvbW1hbmRzL29yZy1leHBvcnQnO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuL2NvbW1hbmRzL3JlZ2lzdGVyJztcbmltcG9ydCB7IHNldHVwRXZlbnRzIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC1ldmVudHMnO1xuaW1wb3J0IHsgc3RhdHVzIH0gZnJvbSAnLi9jb21tYW5kcy9zdGF0dXMnO1xuaW1wb3J0IHsgc3RvcmVUb2tlbiB9IGZyb20gJy4vY29tbWFuZHMvc3RvcmUtdG9rZW4nO1xuaW1wb3J0IHsgc3ludGggfSBmcm9tICcuL2NvbW1hbmRzL3N5bnRoJztcbmltcG9ydCB7IHVwbG9hZFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvdXBsb2FkLXBsdWdpbic7XG5pbXBvcnQgeyB2YWxpZGF0ZVRlbXBsYXRlc0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ZhbGlkYXRlLXRlbXBsYXRlcyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi9jb21tYW5kcy92ZXJzaW9uJztcbmltcG9ydCB7XG4gIEFQUF9OQU1FLFxuICBBUFBfREVTQ1JJUFRJT04sXG4gIEFQUF9WRVJTSU9OLFxuICBFTlZfVkFSUyxcbiAgaXNEZWJ1Z01vZGUsXG4gIGdlbmVyYXRlRXhlY3V0aW9uSWQsXG59IGZyb20gJy4vY29uZmlnL2NsaS5jb25zdGFudHMnO1xuaW1wb3J0IHsgYmFubmVyLCBtaW5pQmFubmVyIH0gZnJvbSAnLi91dGlscy9iYW5uZXInO1xuaW1wb3J0IHsgRVJST1JfQ09ERVMsIGhhbmRsZUVycm9yIH0gZnJvbSAnLi91dGlscy9lcnJvci1oYW5kbGVyJztcbmltcG9ydCB7IHByaW50SW5mbywgcHJpbnRFcnJvciwgcHJpbnRXYXJuaW5nLCBwcmludERlYnVnLCBwcmludFNlY3Rpb24gfSBmcm9tICcuL3V0aWxzL291dHB1dC11dGlscyc7XG5cbi8qKlxuICogQ0xJIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAqL1xuaW50ZXJmYWNlIENsaU9wdGlvbnMge1xuICAvKipcbiAgICogU2hvdyBiYW5uZXIgb24gc3RhcnR1cFxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBzaG93QmFubmVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTWluaW1hbCBiYW5uZXIgKG5vIEFTQ0lJIGFydClcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIG1pbmltYWxCYW5uZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZWJ1ZyBtb2RlXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkZWJ1Zz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFZlcmJvc2Ugb3V0cHV0XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUXVpZXQgbW9kZSAobWluaW1hbCBvdXRwdXQpXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBxdWlldD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE5vIGNvbG9yIG91dHB1dFxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgbm9Db2xvcj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ2hlY2sgZW52aXJvbm1lbnQgYW5kIGRpc3BsYXkgd2FybmluZ3NcbiAqL1xuZnVuY3Rpb24gY2hlY2tFbnZpcm9ubWVudCgpOiB2b2lkIHtcbiAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICBpZiAoIXByb2Nlc3MuZW52W0VOVl9WQVJTLlBMQVRGT1JNX1RPS0VOXSkge1xuICAgIHdhcm5pbmdzLnB1c2goJ1BMQVRGT1JNX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQnKTtcbiAgICB3YXJuaW5ncy5wdXNoKCdBdXRoZW50aWNhdGlvbiB3aWxsIGZhaWwgZm9yIEFQSSBvcGVyYXRpb25zJyk7XG4gIH1cblxuICAvLyBDaGVjayBOb2RlIHZlcnNpb25cbiAgY29uc3Qgbm9kZVZlcnNpb24gPSBwcm9jZXNzLnZlcnNpb247XG4gIGNvbnN0IG1ham9yVmVyc2lvbiA9IHBhcnNlSW50KG5vZGVWZXJzaW9uLnNsaWNlKDEpLnNwbGl0KCcuJylbMF0gfHwgJzAnLCAxMCk7XG4gIGlmIChtYWpvclZlcnNpb24gPCAxOCkge1xuICAgIHdhcm5pbmdzLnB1c2goYE5vZGUuanMgJHtub2RlVmVyc2lvbn0gZGV0ZWN0ZWQgLSB2ZXJzaW9uIDE4KyByZWNvbW1lbmRlZGApO1xuICB9XG5cbiAgLy8gRGlzcGxheSB3YXJuaW5nc1xuICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgIHByaW50U2VjdGlvbignRW52aXJvbm1lbnQgV2FybmluZ3MnKTtcbiAgICB3YXJuaW5ncy5mb3JFYWNoKHdhcm5pbmcgPT4ge1xuICAgICAgcHJpbnRXYXJuaW5nKHdhcm5pbmcpO1xuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BsYXkgc3RhcnR1cCBpbmZvcm1hdGlvblxuICovXG5mdW5jdGlvbiBkaXNwbGF5U3RhcnR1cEluZm8ob3B0aW9uczogQ2xpT3B0aW9ucyk6IHZvaWQge1xuICBpZiAob3B0aW9ucy5xdWlldCkgcmV0dXJuO1xuXG4gIGNvbnN0IGV4ZWN1dGlvbklkID0gZ2VuZXJhdGVFeGVjdXRpb25JZCgpO1xuXG4gIGlmIChvcHRpb25zLmRlYnVnIHx8IG9wdGlvbnMudmVyYm9zZSkge1xuICAgIHByaW50RGVidWcoJ0NMSSBDb25maWd1cmF0aW9uJywge1xuICAgICAgbmFtZTogQVBQX05BTUUsXG4gICAgICB2ZXJzaW9uOiBBUFBfVkVSU0lPTixcbiAgICAgIGV4ZWN1dGlvbklkLFxuICAgICAgbm9kZTogcHJvY2Vzcy52ZXJzaW9uLFxuICAgICAgcGxhdGZvcm06IHByb2Nlc3MucGxhdGZvcm0sXG4gICAgICBhcmNoOiBwcm9jZXNzLmFyY2gsXG4gICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgICBlbnY6IHtcbiAgICAgICAgZGVidWc6IHByb2Nlc3MuZW52LkRFQlVHLFxuICAgICAgICB0b2tlbjogcHJvY2Vzcy5lbnZbRU5WX1ZBUlMuUExBVEZPUk1fVE9LRU5dID8gJ3NldCc6ICdub3Qgc2V0JyxcbiAgICAgICAgdXJsOiBwcm9jZXNzLmVudltFTlZfVkFSUy5QTEFURk9STV9CQVNFX1VSTF0gfHwgJ2RlZmF1bHQnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBwcmludERlYnVnKCdTdGFydGluZyBDTEknLCB7XG4gICAgICB2ZXJzaW9uOiBBUFBfVkVSU0lPTixcbiAgICAgIGV4ZWN1dGlvbklkLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYWxsIENMSSBjb21tYW5kc1xuICovXG5mdW5jdGlvbiByZWdpc3RlckNvbW1hbmRzKCk6IHZvaWQge1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBjb21tYW5kcycpO1xuXG4gIC8vIENvbmZpZ3VyZSBwcm9ncmFtXG4gIHByb2dyYW1cbiAgICAubmFtZShBUFBfTkFNRSlcbiAgICAuZGVzY3JpcHRpb24oQVBQX0RFU0NSSVBUSU9OKVxuICAgIC52ZXJzaW9uKEFQUF9WRVJTSU9OLCAnLXYsIC0tdmVyc2lvbicsICdTaG93IENMSSB2ZXJzaW9uJylcbiAgICAub3B0aW9uKCctLWRlYnVnJywgJ0VuYWJsZSBkZWJ1ZyBvdXRwdXQgd2l0aCBzdGFjayB0cmFjZXMnLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXZlcmJvc2UnLCAnU2hvdyBkZXRhaWxlZCBpbmZvcm1hdGlvbicsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tcXVpZXQnLCAnTWluaW1hbCBvdXRwdXQgKGVycm9ycyBvbmx5KScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tbm8tY29sb3InLCAnRGlzYWJsZSBjb2xvcmVkIG91dHB1dCcsIGZhbHNlKVxuICAgIC5hZGRIZWxwVGV4dCgnYWZ0ZXInLCBgXG5FbnZpcm9ubWVudCBWYXJpYWJsZXMgICR7RU5WX1ZBUlMuUExBVEZPUk1fVE9LRU59IEF1dGhlbnRpY2F0aW9uIHRva2VuIChyZXF1aXJlZClcbiAgJHtFTlZfVkFSUy5QTEFURk9STV9CQVNFX1VSTH0gQVBJIGJhc2UgVVJMIChvcHRpb25hbClcbiAgJHtFTlZfVkFSUy5DTElfQ09ORklHX1BBVEh9IENvbmZpZyBmaWxlIHBhdGggKG9wdGlvbmFsKVxuICAke0VOVl9WQVJTLlRMU19SRUpFQ1RfVU5BVVRIT1JJWkVEfSBEaXNhYmxlIFNTTCB2ZXJpZmljYXRpb24gaWYgJzAnXG4gICR7RU5WX1ZBUlMuREVCVUd9IEVuYWJsZSBkZWJ1ZyBtb2RlIGlmICd0cnVlJ1xuXG5FeGFtcGxlcyAgJCAke0FQUF9OQU1FfSB2ZXJzaW9uXG4gICQgJHtBUFBfTkFNRX0gbGlzdC1waXBlbGluZXMgLS1wcm9qZWN0IG15LWFwcFxuICAkICR7QVBQX05BTUV9IGdldC1waXBlbGluZSAtLWlkIHBpcGUtMTIzIC0tZm9ybWF0IGpzb25cbiAgJCAke0FQUF9OQU1FfSBzdG9yZS10b2tlbiAtLWRheXMgMzAgLS1yZWdpb24gdXMtZWFzdC0xXG4gICQgJHtBUFBfTkFNRX0gYm9vdHN0cmFwIC0tYWNjb3VudCAxMjM0NTY3ODkwMTIgLS1yZWdpb24gdXMtZWFzdC0xXG4gICQgJHtBUFBfTkFNRX0gZGVwbG95IC0taWQgcGlwZS0xMjMgLS1wcm9maWxlIHByb2R1Y3Rpb25cblxuYCk7XG5cbiAgLy8gVmVyc2lvbiBjb21tYW5kIChzcGVjaWFsIGhhbmRsaW5nKVxuICB2ZXJzaW9uKHByb2dyYW0pO1xuXG4gIC8vIEF1dGhlbnRpY2F0aW9uIGNvbW1hbmRzXG4gIHByaW50RGVidWcoJ1JlZ2lzdGVyaW5nIGF1dGhlbnRpY2F0aW9uIGNvbW1hbmRzJyk7XG4gIGxvZ2luKHByb2dyYW0pOyAvLyBMb2dpbiBhbmQgb2J0YWluIFBMQVRGT1JNX1RPS0VOIChhbHNvIHN1cHBvcnRzIC0tcmVmcmVzaClcblxuICAvLyBRdWVyeSBjb21tYW5kc1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBxdWVyeSBjb21tYW5kcycpO1xuICBnZXRQbHVnaW4ocHJvZ3JhbSk7IC8vIFNpbmdsZSBwbHVnaW4gYnkgSURcbiAgbGlzdFBsdWdpbnMocHJvZ3JhbSk7IC8vIE11bHRpcGxlIHBsdWdpbnMgd2l0aCBmaWx0ZXJzXG4gIGdldFBpcGVsaW5lKHByb2dyYW0pOyAvLyBTaW5nbGUgcGlwZWxpbmUgYnkgSURcbiAgbGlzdFBpcGVsaW5lcyhwcm9ncmFtKTsgLy8gTXVsdGlwbGUgcGlwZWxpbmVzIHdpdGggZmlsdGVyc1xuXG4gIC8vIENyZWF0ZS9VcGxvYWQgY29tbWFuZHNcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgY3JlYXRlL3VwbG9hZCBjb21tYW5kcycpO1xuICBjcmVhdGVQaXBlbGluZShwcm9ncmFtKTsgLy8gQ3JlYXRlIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb25cbiAgdXBsb2FkUGx1Z2luKHByb2dyYW0pOyAvLyBVcGxvYWQgYW5kIGRlcGxveSBwbHVnaW5cblxuICAvLyBTdGF0dXMgY29tbWFuZFxuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBzdGF0dXMgY29tbWFuZCcpO1xuICBzdGF0dXMocHJvZ3JhbSk7IC8vIFNob3cgZW52aXJvbm1lbnQgYW5kIGNvbm5lY3Rpdml0eSBzdGF0dXNcblxuICAvLyBPcmcgYWRtaW4gY29tbWFuZHNcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgb3JnIGFkbWluIGNvbW1hbmRzJyk7XG4gIG9yZ0V4cG9ydChwcm9ncmFtKTsgLy8gR0RQUiBwb3J0YWJpbGl0eSBleHBvcnQgw6LCgMKUIHN5c2FkbWluIChhbnkgb3JnKSBvciBvcmcgYWRtaW4gKG93biBvcmcpXG5cbiAgLy8gRGVwbG95bWVudCBjb21tYW5kc1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBkZXBsb3ltZW50IGNvbW1hbmRzJyk7XG4gIHN0b3JlVG9rZW4ocHJvZ3JhbSk7IC8vIEdlbmVyYXRlIEpXVCB0b2tlbiBhbmQgc3RvcmUgaW4gU2VjcmV0cyBNYW5hZ2VyXG4gIHNldHVwRXZlbnRzKHByb2dyYW0pOyAvLyBEZXBsb3kgRXZlbnRCcmlkZ2UgZXZlbnQgaW5nZXN0aW9uIGluZnJhc3RydWN0dXJlXG4gIGJvb3RzdHJhcChwcm9ncmFtKTsgLy8gQm9vdHN0cmFwIENESyB0b29sa2l0IHN0YWNrXG4gIGRlcGxveShwcm9ncmFtKTsgLy8gRGVwbG95IHBpcGVsaW5lIHdpdGggQ0RLICgtLWFwcCBwcmludHMgYm9pbGVycGxhdGUgcGF0aClcbiAgcmVnaXN0ZXIocHJvZ3JhbSk7IC8vIFJlLXJlZ2lzdGVyIGEgZGVwbG95ZWQgcGlwZWxpbmUgQVJOICsgZHJhaW4gcGVuZGluZyBpbnRlbnRzIGZyb20gcHJpb3IgZmFpbGVkIGRlcGxveXNcblxuICAvLyBPcGVyYXRvciBhdWRpdCBjb21tYW5kcyAoY3Jvbi1mcmllbmRseTogZXhpdCAxIG9uIGZpbmRpbmdzKVxuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBhdWRpdCBjb21tYW5kcycpO1xuICBhdWRpdFRva2Vucyhwcm9ncmFtKTsgLy8gU2NhbiBTZWNyZXRzIE1hbmFnZXIgZm9yIGV4cGlyaW5nIHBsYXRmb3JtIHRva2Vuc1xuICBhdWRpdFN0YWNrcyhwcm9ncmFtKTsgLy8gRGlmZiBDRk4gc3RhY2tzIHZzIHBpcGVsaW5lX3JlZ2lzdHJ5IHRvIGZpbmQgZHJpZnRcbiAgc3ludGgocHJvZ3JhbSk7IC8vIFJ1biBDREsgc3ludGhlc2lzXG4gIHZhbGlkYXRlVGVtcGxhdGVzQ29tbWFuZChwcm9ncmFtKTsgLy8gVmFsaWRhdGUge3suLi4gfX0gdGVtcGxhdGVzIGluIGEgcGlwZWxpbmUgb3IgcGx1Z2luXG5cbiAgLy8gU2hlbGwgY29tcGxldGlvbnNcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgY29tcGxldGlvbnMgY29tbWFuZCcpO1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoJ2NvbXBsZXRpb25zJylcbiAgICAuZGVzY3JpcHRpb24oJ0dlbmVyYXRlIHNoZWxsIGNvbXBsZXRpb25zIChiYXNoLCB6c2gsIGZpc2gpJylcbiAgICAuYXJndW1lbnQoJzxzaGVsbD4nLCAnU2hlbGwgdHlwZTogYmFzaCwgenNoLCBvciBmaXNoJylcbiAgICAuYWN0aW9uKChzaGVsbDogc3RyaW5nKSA9PiB7XG4gICAgICAvLyBQdWxsIGNvbW1hbmQgbmFtZXMgZnJvbSBjb21tYW5kZXIncyByZWdpc3RlcmVkIGxpc3Qgc28gY29tcGxldGlvbnMgbmV2ZXJcbiAgICAgIC8vIGRyaWZ0IGZyb20gdGhlIGFjdHVhbCBDTEkgc3VyZmFjZS4gU29ydGVkIGZvciBzdGFibGUgb3V0cHV0LlxuICAgICAgY29uc3QgY29tbWFuZHMgPSBwcm9ncmFtLmNvbW1hbmRzLm1hcChjID0+IGMubmFtZSgpKS5zb3J0KCkuam9pbignICcpO1xuICAgICAgc3dpdGNoIChzaGVsbCkge1xuICAgICAgICBjYXNlICdiYXNoJzpcbiAgICAgICAgICBjb25zb2xlLmxvZyhgIyBwaXBlbGluZS1tYW5hZ2VyIGJhc2ggY29tcGxldGlvbnNcbl9waXBlbGluZV9tYW5hZ2VyX2NvbXBsZXRpb25zKCkge1xuICBsb2NhbCBjdXI9XCJcXCR7Q09NUF9XT1JEU1tDT01QX0NXT1JEXX1cIlxuICBsb2NhbCBjb21tYW5kcz1cIiR7Y29tbWFuZHN9XCJcbiAgQ09NUFJFUExZPSgkKGNvbXBnZW4gLVcgXCJcXCR7Y29tbWFuZHN9XCIgLS0gXCJcXCR7Y3VyfVwiKSlcbn1cbmNvbXBsZXRlIC1GIF9waXBlbGluZV9tYW5hZ2VyX2NvbXBsZXRpb25zIHBpcGVsaW5lLW1hbmFnZXJgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnenNoJzpcbiAgICAgICAgICBjb25zb2xlLmxvZyhgIyBwaXBlbGluZS1tYW5hZ2VyIHpzaCBjb21wbGV0aW9uc1xuX3BpcGVsaW5lX21hbmFnZXIoKSB7XG4gIGxvY2FsIGNvbW1hbmRzPSgke2NvbW1hbmRzfSlcbiAgX2Rlc2NyaWJlICdjb21tYW5kJyBjb21tYW5kc1xufVxuY29tcGRlZiBfcGlwZWxpbmVfbWFuYWdlciBwaXBlbGluZS1tYW5hZ2VyYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Zpc2gnOlxuICAgICAgICAgIGNvbnNvbGUubG9nKGAjIHBpcGVsaW5lLW1hbmFnZXIgZmlzaCBjb21wbGV0aW9uc1xuY29tcGxldGUgLWMgcGlwZWxpbmUtbWFuYWdlciAtbiAnX19maXNoX3VzZV9zdWJjb21tYW5kJyAtYSAnJHtjb21tYW5kc30nYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgVW5rbm93biBzaGVsbDogJHtzaGVsbH0uIFVzZSBiYXNoLCB6c2gsIG9yIGZpc2guYCk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIHByaW50RGVidWcoJ0FsbCBjb21tYW5kcyByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseScpO1xufVxuXG4vKipcbiAqIEhhbmRsZSBwcm9ncmFtIGVycm9yc1xuICovXG5mdW5jdGlvbiBzZXR1cEVycm9ySGFuZGxlcnMoKTogdm9pZCB7XG4gIC8vIEhhbmRsZSB1bmNhdWdodCBleGNlcHRpb25zXG4gIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgKGVycm9yOiBFcnJvcikgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJpbnRFcnJvcignVW5jYXVnaHQgZXhjZXB0aW9uJywge1xuICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UsXG4gICAgICBuYW1lOiBlcnJvci5uYW1lLFxuICAgIH0pO1xuXG4gICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkdFTkVSQUwsIHtcbiAgICAgIGRlYnVnOiBpc0RlYnVnTW9kZShwcm9ncmFtLm9wdHMoKSksXG4gICAgICBleGl0OiB0cnVlLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICB0eXBlOiAndW5jYXVnaHRFeGNlcHRpb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gSGFuZGxlIHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbnNcbiAgcHJvY2Vzcy5vbigndW5oYW5kbGVkUmVqZWN0aW9uJywgKHJlYXNvbjogdW5rbm93bikgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJpbnRFcnJvcignVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywge1xuICAgICAgcmVhc29uOiByZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlYXNvbi5tZXNzYWdlOiBTdHJpbmcocmVhc29uKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGVycm9yID0gcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb246IG5ldyBFcnJvcihTdHJpbmcocmVhc29uKSk7XG5cbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuR0VORVJBTCwge1xuICAgICAgZGVidWc6IGlzRGVidWdNb2RlKHByb2dyYW0ub3B0cygpKSxcbiAgICAgIGV4aXQ6IHRydWUsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHR5cGU6ICd1bmhhbmRsZWRSZWplY3Rpb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gSGFuZGxlIFNJR0lOVCAoQ3RybCtDKVxuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJpbnRXYXJuaW5nKCdQcm9jZXNzIGludGVycnVwdGVkIGJ5IHVzZXIgKFNJR0lOVCknKTtcbiAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcm9jZXNzLmV4aXQoMTMwKTsgLy8gU3RhbmRhcmQgZXhpdCBjb2RlIGZvciBTSUdJTlRcbiAgfSk7XG5cbiAgLy8gSGFuZGxlIFNJR1RFUk1cbiAgcHJvY2Vzcy5vbignU0lHVEVSTScsICgpID0+IHtcbiAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcmludFdhcm5pbmcoJ1Byb2Nlc3MgdGVybWluYXRlZCAoU0lHVEVSTSknKTtcbiAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcm9jZXNzLmV4aXQoMTQzKTsgLy8gU3RhbmRhcmQgZXhpdCBjb2RlIGZvciBTSUdURVJNXG4gIH0pO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgQ0xJIHdpdGggb3B0aW9uc1xuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0xJIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVDbGkob3B0aW9uczogQ2xpT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICBzaG93QmFubmVyID0gdHJ1ZSxcbiAgICBtaW5pbWFsQmFubmVyID0gZmFsc2UsXG4gICAgZGVidWcgPSBmYWxzZSxcbiAgICB2ZXJib3NlID0gZmFsc2UsXG4gICAgcXVpZXQgPSBmYWxzZSxcbiAgICBub0NvbG9yID0gZmFsc2UsXG4gIH0gPSBvcHRpb25zO1xuXG4gIC8vIEhhbmRsZSBjb2xvciBvdXRwdXRcbiAgaWYgKG5vQ29sb3IpIHtcbiAgICBwcm9jZXNzLmVudi5OT19DT0xPUiA9ICcxJztcbiAgfVxuXG4gIC8vIERpc3BsYXkgYmFubmVyXG4gIGlmIChzaG93QmFubmVyICYmICFxdWlldCkge1xuICAgIGlmIChtaW5pbWFsQmFubmVyKSB7XG4gICAgICBtaW5pQmFubmVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhbm5lcih7XG4gICAgICAgIG1pbmltYWw6IGZhbHNlLFxuICAgICAgICBzaG93RGVzY3JpcHRpb246IHRydWUsXG4gICAgICAgIHNob3dUaW1lc3RhbXA6IGRlYnVnIHx8IHZlcmJvc2UsXG4gICAgICAgIHNob3dFeGVjdXRpb25JZDogZGVidWcsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBEaXNwbGF5IHN0YXJ0dXAgaW5mb1xuICBkaXNwbGF5U3RhcnR1cEluZm8oeyBkZWJ1ZywgdmVyYm9zZSwgcXVpZXQgfSk7XG5cbiAgLy8gQ2hlY2sgZW52aXJvbm1lbnRcbiAgaWYgKCFxdWlldCkge1xuICAgIGNoZWNrRW52aXJvbm1lbnQoKTtcbiAgfVxuXG4gIC8vIFNldHVwIGVycm9yIGhhbmRsZXJzXG4gIHNldHVwRXJyb3JIYW5kbGVycygpO1xuXG4gIC8vIFJlZ2lzdGVyIGNvbW1hbmRzXG4gIHRyeSB7XG4gICAgcmVnaXN0ZXJDb21tYW5kcygpO1xuICAgIHByaW50RGVidWcoJ0NMSSBpbml0aWFsaXphdGlvbiBjb21wbGV0ZScpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHByaW50RXJyb3IoJ0NMSSBpbml0aWFsaXphdGlvbiBmYWlsZWQnLCB7XG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2U6IFN0cmluZyhlcnJvciksXG4gICAgfSk7XG5cbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuQ09ORklHVVJBVElPTiwge1xuICAgICAgZGVidWc6IGRlYnVnIHx8IGlzRGVidWdNb2RlKCksXG4gICAgICBleGl0OiB0cnVlLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICBzdGFnZTogJ2luaXRpYWxpemF0aW9uJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQXJndW1lbnRzKCk6IHZvaWQge1xuICB0cnkge1xuICAgIHByb2dyYW0ucGFyc2UocHJvY2Vzcy5hcmd2KTtcblxuICAgIC8vIFNob3cgaGVscCBpZiBubyBjb21tYW5kIHByb3ZpZGVkXG4gICAgY29uc3QgYXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKTtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHByaW50SW5mbygnTm8gY29tbWFuZCBzcGVjaWZpZWQgLSBkaXNwbGF5aW5nIGhlbHAnKTtcbiAgICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgICAgcHJvZ3JhbS5vdXRwdXRIZWxwKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgY29tbWFuZCBleGlzdHNcbiAgICBjb25zdCBjb21tYW5kID0gYXJnc1swXTtcbiAgICBpZiAoY29tbWFuZCAmJiAhY29tbWFuZC5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgIGNvbnN0IGNvbW1hbmRFeGlzdHMgPSBwcm9ncmFtLmNvbW1hbmRzLnNvbWUoY21kID0+IGNtZC5uYW1lKCkgPT09IGNvbW1hbmQpO1xuXG4gICAgICBpZiAoIWNvbW1hbmRFeGlzdHMpIHtcbiAgICAgICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgICAgIHByaW50RXJyb3IoYFVua25vd24gY29tbWFuZDogJHtjb21tYW5kfWApO1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICAgICAgcHJpbnRJbmZvKCdBdmFpbGFibGUgY29tbWFuZHM6Jyk7XG4gICAgICAgIHByb2dyYW0uY29tbWFuZHMuZm9yRWFjaChjbWQgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAg4oCiICR7Y21kLm5hbWUoKX0gLSAke2NtZC5kZXNjcmlwdGlvbigpfWApO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcmludERlYnVnKCdDb21tYW5kIGxpbmUgYXJndW1lbnRzIHBhcnNlZCBzdWNjZXNzZnVsbHknKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuR0VORVJBTCwge1xuICAgICAgZGVidWc6IGlzRGVidWdNb2RlKHByb2dyYW0ub3B0cygpKSxcbiAgICAgIGV4aXQ6IHRydWUsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHN0YWdlOiAnYXJndW1lbnQtcGFyc2luZycsXG4gICAgICAgIGFyZ3Y6IHByb2Nlc3MuYXJndixcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNYWluIENMSSBlbnRyeSBwb2ludFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0xJIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gU3RhbmRhcmQgaW5pdGlhbGl6YXRpb25cbiAqIG1haW4oKTtcbiAqXG4gKiAvLyBNaW5pbWFsIG1vZGVcbiAqIG1haW4oeyBtaW5pbWFsQmFubmVyOiB0cnVlLCBxdWlldDogdHJ1ZSB9KTtcbiAqXG4gKiAvLyBEZWJ1ZyBtb2RlXG4gKiBtYWluKHsgZGVidWc6IHRydWUsIHZlcmJvc2U6IHRydWUgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1haW4ob3B0aW9uczogQ2xpT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gIHRyeSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBDTElcbiAgICBpbml0aWFsaXplQ2xpKG9wdGlvbnMpO1xuXG4gICAgLy8gUGFyc2UgYXJndW1lbnRzIGFuZCBleGVjdXRlIGNvbW1hbmRcbiAgICBwYXJzZUFyZ3VtZW50cygpO1xuXG4gICAgLy8gSWYgd2UgcmVhY2ggaGVyZSwgY29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgcHJpbnREZWJ1ZygnQ0xJIGV4ZWN1dGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRmluYWwgY2F0Y2gtYWxsIGVycm9yIGhhbmRsZXJcbiAgICBjb25zb2xlLmVycm9yKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByaW50RXJyb3IoJ0ZhdGFsIENMSSBlcnJvcicsIHtcbiAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZTogU3RyaW5nKGVycm9yKSxcbiAgICB9KTtcblxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5HRU5FUkFMLCB7XG4gICAgICBkZWJ1ZzogaXNEZWJ1Z01vZGUob3B0aW9ucyksXG4gICAgICBleGl0OiB0cnVlLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICBzdGFnZTogJ21haW4nLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJ1biBDTEkgaWYgZXhlY3V0ZWQgZGlyZWN0bHlcbiAqL1xuaWYgKHJlcXVpcmUubWFpbiA9PT0gbW9kdWxlKSB7XG4gIC8vIFBhcnNlIENMSSBvcHRpb25zIGZyb20gZW52aXJvbm1lbnQgb3IgY29tbWFuZCBsaW5lXG4gIGNvbnN0IG9wdGlvbnM6IENsaU9wdGlvbnMgPSB7XG4gICAgZGVidWc6IHByb2Nlc3MuZW52LkRFQlVHID09PSAndHJ1ZScsXG4gICAgcXVpZXQ6IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1xdWlldCcpLFxuICAgIHZlcmJvc2U6IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS12ZXJib3NlJyksXG4gICAgbm9Db2xvcjogcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLW5vLWNvbG9yJykgfHwgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgPT09ICcxJyxcbiAgfTtcblxuICBtYWluKG9wdGlvbnMpO1xufSJdfQ==
392
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDL0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QyxPQUFP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LE9BQU8sQ0FBQyxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG4vLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmVhbHBhdGhTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHsgcHJvZ3JhbSB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBhdWRpdFN0YWNrcyB9IGZyb20gJy4vY29tbWFuZHMvYXVkaXQtc3RhY2tzLmpzJztcbmltcG9ydCB7IGF1ZGl0VG9rZW5zIH0gZnJvbSAnLi9jb21tYW5kcy9hdWRpdC10b2tlbnMuanMnO1xuaW1wb3J0IHsgYm9vdHN0cmFwIH0gZnJvbSAnLi9jb21tYW5kcy9ib290c3RyYXAuanMnO1xuaW1wb3J0IHsgY3JlYXRlUGlwZWxpbmUgfSBmcm9tICcuL2NvbW1hbmRzL2NyZWF0ZS1waXBlbGluZS5qcyc7XG5pbXBvcnQgeyBkZXBsb3kgfSBmcm9tICcuL2NvbW1hbmRzL2RlcGxveS5qcyc7XG5pbXBvcnQgeyBnZXRQaXBlbGluZSB9IGZyb20gJy4vY29tbWFuZHMvZ2V0LXBpcGVsaW5lLmpzJztcbmltcG9ydCB7IGdldFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvZ2V0LXBsdWdpbi5qcyc7XG5pbXBvcnQgeyBsaXN0UGlwZWxpbmVzIH0gZnJvbSAnLi9jb21tYW5kcy9saXN0LXBpcGVsaW5lcy5qcyc7XG5pbXBvcnQgeyBsaXN0UGx1Z2lucyB9IGZyb20gJy4vY29tbWFuZHMvbGlzdC1wbHVnaW5zLmpzJztcbmltcG9ydCB7IGxvZ2luIH0gZnJvbSAnLi9jb21tYW5kcy9sb2dpbi5qcyc7XG5pbXBvcnQgeyBvcmdFeHBvcnQgfSBmcm9tICcuL2NvbW1hbmRzL29yZy1leHBvcnQuanMnO1xuaW1wb3J0IHsgcHJvdmlzaW9uIH0gZnJvbSAnLi9jb21tYW5kcy9wcm92aXNpb24uanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuL2NvbW1hbmRzL3JlZ2lzdGVyLmpzJztcbmltcG9ydCB7IHNldHVwRXZlbnRzIH0gZnJvbSAnLi9jb21tYW5kcy9zZXR1cC1ldmVudHMuanMnO1xuaW1wb3J0IHsgc3RhdHVzIH0gZnJvbSAnLi9jb21tYW5kcy9zdGF0dXMuanMnO1xuaW1wb3J0IHsgc3RvcmVUb2tlbiB9IGZyb20gJy4vY29tbWFuZHMvc3RvcmUtdG9rZW4uanMnO1xuaW1wb3J0IHsgc3ludGggfSBmcm9tICcuL2NvbW1hbmRzL3N5bnRoLmpzJztcbmltcG9ydCB7IHVwbG9hZFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvdXBsb2FkLXBsdWdpbi5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVRlbXBsYXRlc0NvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL3ZhbGlkYXRlLXRlbXBsYXRlcy5qcyc7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi9jb21tYW5kcy92ZXJzaW9uLmpzJztcbmltcG9ydCB7XG4gIEFQUF9OQU1FLFxuICBBUFBfREVTQ1JJUFRJT04sXG4gIEFQUF9WRVJTSU9OLFxuICBFTlZfVkFSUyxcbiAgaXNEZWJ1Z01vZGUsXG4gIGdlbmVyYXRlRXhlY3V0aW9uSWQsXG59IGZyb20gJy4vY29uZmlnL2NsaS5jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgYmFubmVyLCBtaW5pQmFubmVyIH0gZnJvbSAnLi91dGlscy9iYW5uZXIuanMnO1xuaW1wb3J0IHsgRVJST1JfQ09ERVMsIGhhbmRsZUVycm9yIH0gZnJvbSAnLi91dGlscy9lcnJvci1oYW5kbGVyLmpzJztcbmltcG9ydCB7IHByaW50SW5mbywgcHJpbnRFcnJvciwgcHJpbnRXYXJuaW5nLCBwcmludERlYnVnLCBwcmludFNlY3Rpb24gfSBmcm9tICcuL3V0aWxzL291dHB1dC11dGlscy5qcyc7XG5cbi8qKlxuICogQ0xJIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAqL1xuaW50ZXJmYWNlIENsaU9wdGlvbnMge1xuICAvKipcbiAgICogU2hvdyBiYW5uZXIgb24gc3RhcnR1cFxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBzaG93QmFubmVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTWluaW1hbCBiYW5uZXIgKG5vIEFTQ0lJIGFydClcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIG1pbmltYWxCYW5uZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZWJ1ZyBtb2RlXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkZWJ1Zz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFZlcmJvc2Ugb3V0cHV0XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUXVpZXQgbW9kZSAobWluaW1hbCBvdXRwdXQpXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBxdWlldD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE5vIGNvbG9yIG91dHB1dFxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgbm9Db2xvcj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ2hlY2sgZW52aXJvbm1lbnQgYW5kIGRpc3BsYXkgd2FybmluZ3NcbiAqL1xuZnVuY3Rpb24gY2hlY2tFbnZpcm9ubWVudCgpOiB2b2lkIHtcbiAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICBpZiAoIXByb2Nlc3MuZW52W0VOVl9WQVJTLlBMQVRGT1JNX1RPS0VOXSkge1xuICAgIHdhcm5pbmdzLnB1c2goJ1BMQVRGT1JNX1RPS0VOIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG5vdCBzZXQnKTtcbiAgICB3YXJuaW5ncy5wdXNoKCdBdXRoZW50aWNhdGlvbiB3aWxsIGZhaWwgZm9yIEFQSSBvcGVyYXRpb25zJyk7XG4gIH1cblxuICAvLyBDaGVjayBOb2RlIHZlcnNpb25cbiAgY29uc3Qgbm9kZVZlcnNpb24gPSBwcm9jZXNzLnZlcnNpb247XG4gIGNvbnN0IG1ham9yVmVyc2lvbiA9IHBhcnNlSW50KG5vZGVWZXJzaW9uLnNsaWNlKDEpLnNwbGl0KCcuJylbMF0gfHwgJzAnLCAxMCk7XG4gIGlmIChtYWpvclZlcnNpb24gPCAxOCkge1xuICAgIHdhcm5pbmdzLnB1c2goYE5vZGUuanMgJHtub2RlVmVyc2lvbn0gZGV0ZWN0ZWQgLSB2ZXJzaW9uIDE4KyByZWNvbW1lbmRlZGApO1xuICB9XG5cbiAgLy8gRGlzcGxheSB3YXJuaW5nc1xuICBpZiAod2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgIHByaW50U2VjdGlvbignRW52aXJvbm1lbnQgV2FybmluZ3MnKTtcbiAgICB3YXJuaW5ncy5mb3JFYWNoKHdhcm5pbmcgPT4ge1xuICAgICAgcHJpbnRXYXJuaW5nKHdhcm5pbmcpO1xuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BsYXkgc3RhcnR1cCBpbmZvcm1hdGlvblxuICovXG5mdW5jdGlvbiBkaXNwbGF5U3RhcnR1cEluZm8ob3B0aW9uczogQ2xpT3B0aW9ucyk6IHZvaWQge1xuICBpZiAob3B0aW9ucy5xdWlldCkgcmV0dXJuO1xuXG4gIGNvbnN0IGV4ZWN1dGlvbklkID0gZ2VuZXJhdGVFeGVjdXRpb25JZCgpO1xuXG4gIGlmIChvcHRpb25zLmRlYnVnIHx8IG9wdGlvbnMudmVyYm9zZSkge1xuICAgIHByaW50RGVidWcoJ0NMSSBDb25maWd1cmF0aW9uJywge1xuICAgICAgbmFtZTogQVBQX05BTUUsXG4gICAgICB2ZXJzaW9uOiBBUFBfVkVSU0lPTixcbiAgICAgIGV4ZWN1dGlvbklkLFxuICAgICAgbm9kZTogcHJvY2Vzcy52ZXJzaW9uLFxuICAgICAgcGxhdGZvcm06IHByb2Nlc3MucGxhdGZvcm0sXG4gICAgICBhcmNoOiBwcm9jZXNzLmFyY2gsXG4gICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgICBlbnY6IHtcbiAgICAgICAgZGVidWc6IHByb2Nlc3MuZW52LkRFQlVHLFxuICAgICAgICB0b2tlbjogcHJvY2Vzcy5lbnZbRU5WX1ZBUlMuUExBVEZPUk1fVE9LRU5dID8gJ3NldCc6ICdub3Qgc2V0JyxcbiAgICAgICAgdXJsOiBwcm9jZXNzLmVudltFTlZfVkFSUy5QTEFURk9STV9CQVNFX1VSTF0gfHwgJ2RlZmF1bHQnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBwcmludERlYnVnKCdTdGFydGluZyBDTEknLCB7XG4gICAgICB2ZXJzaW9uOiBBUFBfVkVSU0lPTixcbiAgICAgIGV4ZWN1dGlvbklkLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYWxsIENMSSBjb21tYW5kc1xuICovXG5mdW5jdGlvbiByZWdpc3RlckNvbW1hbmRzKCk6IHZvaWQge1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBjb21tYW5kcycpO1xuXG4gIC8vIENvbmZpZ3VyZSBwcm9ncmFtXG4gIHByb2dyYW1cbiAgICAubmFtZShBUFBfTkFNRSlcbiAgICAuZGVzY3JpcHRpb24oQVBQX0RFU0NSSVBUSU9OKVxuICAgIC52ZXJzaW9uKEFQUF9WRVJTSU9OLCAnLXYsIC0tdmVyc2lvbicsICdTaG93IENMSSB2ZXJzaW9uJylcbiAgICAub3B0aW9uKCctLWRlYnVnJywgJ0VuYWJsZSBkZWJ1ZyBvdXRwdXQgd2l0aCBzdGFjayB0cmFjZXMnLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXZlcmJvc2UnLCAnU2hvdyBkZXRhaWxlZCBpbmZvcm1hdGlvbicsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tcXVpZXQnLCAnTWluaW1hbCBvdXRwdXQgKGVycm9ycyBvbmx5KScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tbm8tY29sb3InLCAnRGlzYWJsZSBjb2xvcmVkIG91dHB1dCcsIGZhbHNlKVxuICAgIC5hZGRIZWxwVGV4dCgnYWZ0ZXInLCBgXG5FbnZpcm9ubWVudCBWYXJpYWJsZXMgICR7RU5WX1ZBUlMuUExBVEZPUk1fVE9LRU59IEF1dGhlbnRpY2F0aW9uIHRva2VuIChyZXF1aXJlZClcbiAgJHtFTlZfVkFSUy5QTEFURk9STV9CQVNFX1VSTH0gQVBJIGJhc2UgVVJMIChvcHRpb25hbClcbiAgJHtFTlZfVkFSUy5DTElfQ09ORklHX1BBVEh9IENvbmZpZyBmaWxlIHBhdGggKG9wdGlvbmFsKVxuICAke0VOVl9WQVJTLlRMU19SRUpFQ1RfVU5BVVRIT1JJWkVEfSBEaXNhYmxlIFNTTCB2ZXJpZmljYXRpb24gaWYgJzAnXG4gICR7RU5WX1ZBUlMuREVCVUd9IEVuYWJsZSBkZWJ1ZyBtb2RlIGlmICd0cnVlJ1xuXG5FeGFtcGxlcyAgJCAke0FQUF9OQU1FfSB2ZXJzaW9uXG4gICQgJHtBUFBfTkFNRX0gbGlzdC1waXBlbGluZXMgLS1wcm9qZWN0IG15LWFwcFxuICAkICR7QVBQX05BTUV9IGdldC1waXBlbGluZSAtLWlkIHBpcGUtMTIzIC0tZm9ybWF0IGpzb25cbiAgJCAke0FQUF9OQU1FfSBzdG9yZS10b2tlbiAtLWRheXMgMzAgLS1yZWdpb24gdXMtZWFzdC0xXG4gICQgJHtBUFBfTkFNRX0gYm9vdHN0cmFwIC0tYWNjb3VudCAxMjM0NTY3ODkwMTIgLS1yZWdpb24gdXMtZWFzdC0xXG4gICQgJHtBUFBfTkFNRX0gZGVwbG95IC0taWQgcGlwZS0xMjMgLS1wcm9maWxlIHByb2R1Y3Rpb25cblxuYCk7XG5cbiAgLy8gVmVyc2lvbiBjb21tYW5kIChzcGVjaWFsIGhhbmRsaW5nKVxuICB2ZXJzaW9uKHByb2dyYW0pO1xuXG4gIC8vIEF1dGhlbnRpY2F0aW9uIGNvbW1hbmRzXG4gIHByaW50RGVidWcoJ1JlZ2lzdGVyaW5nIGF1dGhlbnRpY2F0aW9uIGNvbW1hbmRzJyk7XG4gIGxvZ2luKHByb2dyYW0pOyAvLyBMb2dpbiBhbmQgb2J0YWluIFBMQVRGT1JNX1RPS0VOIChhbHNvIHN1cHBvcnRzIC0tcmVmcmVzaClcblxuICAvLyBRdWVyeSBjb21tYW5kc1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBxdWVyeSBjb21tYW5kcycpO1xuICBnZXRQbHVnaW4ocHJvZ3JhbSk7IC8vIFNpbmdsZSBwbHVnaW4gYnkgSURcbiAgbGlzdFBsdWdpbnMocHJvZ3JhbSk7IC8vIE11bHRpcGxlIHBsdWdpbnMgd2l0aCBmaWx0ZXJzXG4gIGdldFBpcGVsaW5lKHByb2dyYW0pOyAvLyBTaW5nbGUgcGlwZWxpbmUgYnkgSURcbiAgbGlzdFBpcGVsaW5lcyhwcm9ncmFtKTsgLy8gTXVsdGlwbGUgcGlwZWxpbmVzIHdpdGggZmlsdGVyc1xuXG4gIC8vIENyZWF0ZS9VcGxvYWQgY29tbWFuZHNcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgY3JlYXRlL3VwbG9hZCBjb21tYW5kcycpO1xuICBjcmVhdGVQaXBlbGluZShwcm9ncmFtKTsgLy8gQ3JlYXRlIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb25cbiAgdXBsb2FkUGx1Z2luKHByb2dyYW0pOyAvLyBVcGxvYWQgYW5kIGRlcGxveSBwbHVnaW5cblxuICAvLyBTdGF0dXMgY29tbWFuZFxuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBzdGF0dXMgY29tbWFuZCcpO1xuICBzdGF0dXMocHJvZ3JhbSk7IC8vIFNob3cgZW52aXJvbm1lbnQgYW5kIGNvbm5lY3Rpdml0eSBzdGF0dXNcblxuICAvLyBPcmcgYWRtaW4gY29tbWFuZHNcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgb3JnIGFkbWluIGNvbW1hbmRzJyk7XG4gIG9yZ0V4cG9ydChwcm9ncmFtKTsgLy8gR0RQUiBwb3J0YWJpbGl0eSBleHBvcnQgw6LCgMKUIHN5c2FkbWluIChhbnkgb3JnKSBvciBvcmcgYWRtaW4gKG93biBvcmcpXG5cbiAgLy8gRGVwbG95bWVudCBjb21tYW5kc1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBkZXBsb3ltZW50IGNvbW1hbmRzJyk7XG4gIHN0b3JlVG9rZW4ocHJvZ3JhbSk7IC8vIEdlbmVyYXRlIEpXVCB0b2tlbiBhbmQgc3RvcmUgaW4gU2VjcmV0cyBNYW5hZ2VyXG4gIHNldHVwRXZlbnRzKHByb2dyYW0pOyAvLyBEZXBsb3kgRXZlbnRCcmlkZ2UgZXZlbnQgaW5nZXN0aW9uIGluZnJhc3RydWN0dXJlXG4gIGJvb3RzdHJhcChwcm9ncmFtKTsgLy8gQm9vdHN0cmFwIENESyB0b29sa2l0IHN0YWNrXG4gIGRlcGxveShwcm9ncmFtKTsgLy8gRGVwbG95IHBpcGVsaW5lIHdpdGggQ0RLICgtLWFwcCBwcmludHMgYm9pbGVycGxhdGUgcGF0aClcbiAgcmVnaXN0ZXIocHJvZ3JhbSk7IC8vIFJlLXJlZ2lzdGVyIGEgZGVwbG95ZWQgcGlwZWxpbmUgQVJOICsgZHJhaW4gcGVuZGluZyBpbnRlbnRzIGZyb20gcHJpb3IgZmFpbGVkIGRlcGxveXNcbiAgcHJvdmlzaW9uKHByb2dyYW0pOyAvLyBBSS1hc3Npc3RlZCBhZHZpc29yIHRvIGRlcGxveSB0aGUgUExBVEZPUk0gKGxvY2FsL21pbmlrdWJlL0VDMi9GYXJnYXRlKSDigJQgcmVhZC1vbmx5XG5cbiAgLy8gT3BlcmF0b3IgYXVkaXQgY29tbWFuZHMgKGNyb24tZnJpZW5kbHk6IGV4aXQgMSBvbiBmaW5kaW5ncylcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgYXVkaXQgY29tbWFuZHMnKTtcbiAgYXVkaXRUb2tlbnMocHJvZ3JhbSk7IC8vIFNjYW4gU2VjcmV0cyBNYW5hZ2VyIGZvciBleHBpcmluZyBwbGF0Zm9ybSB0b2tlbnNcbiAgYXVkaXRTdGFja3MocHJvZ3JhbSk7IC8vIERpZmYgQ0ZOIHN0YWNrcyB2cyBwaXBlbGluZV9yZWdpc3RyeSB0byBmaW5kIGRyaWZ0XG4gIHN5bnRoKHByb2dyYW0pOyAvLyBSdW4gQ0RLIHN5bnRoZXNpc1xuICB2YWxpZGF0ZVRlbXBsYXRlc0NvbW1hbmQocHJvZ3JhbSk7IC8vIFZhbGlkYXRlIHt7Li4uIH19IHRlbXBsYXRlcyBpbiBhIHBpcGVsaW5lIG9yIHBsdWdpblxuXG4gIC8vIFNoZWxsIGNvbXBsZXRpb25zXG4gIHByaW50RGVidWcoJ1JlZ2lzdGVyaW5nIGNvbXBsZXRpb25zIGNvbW1hbmQnKTtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKCdjb21wbGV0aW9ucycpXG4gICAgLmRlc2NyaXB0aW9uKCdHZW5lcmF0ZSBzaGVsbCBjb21wbGV0aW9ucyAoYmFzaCwgenNoLCBmaXNoKScpXG4gICAgLmFyZ3VtZW50KCc8c2hlbGw+JywgJ1NoZWxsIHR5cGU6IGJhc2gsIHpzaCwgb3IgZmlzaCcpXG4gICAgLmFjdGlvbigoc2hlbGw6IHN0cmluZykgPT4ge1xuICAgICAgLy8gUHVsbCBjb21tYW5kIG5hbWVzIGZyb20gY29tbWFuZGVyJ3MgcmVnaXN0ZXJlZCBsaXN0IHNvIGNvbXBsZXRpb25zIG5ldmVyXG4gICAgICAvLyBkcmlmdCBmcm9tIHRoZSBhY3R1YWwgQ0xJIHN1cmZhY2UuIFNvcnRlZCBmb3Igc3RhYmxlIG91dHB1dC5cbiAgICAgIGNvbnN0IGNvbW1hbmRzID0gcHJvZ3JhbS5jb21tYW5kcy5tYXAoYyA9PiBjLm5hbWUoKSkuc29ydCgpLmpvaW4oJyAnKTtcbiAgICAgIHN3aXRjaCAoc2hlbGwpIHtcbiAgICAgICAgY2FzZSAnYmFzaCc6XG4gICAgICAgICAgY29uc29sZS5sb2coYCMgcGlwZWxpbmUtbWFuYWdlciBiYXNoIGNvbXBsZXRpb25zXG5fcGlwZWxpbmVfbWFuYWdlcl9jb21wbGV0aW9ucygpIHtcbiAgbG9jYWwgY3VyPVwiXFwke0NPTVBfV09SRFNbQ09NUF9DV09SRF19XCJcbiAgbG9jYWwgY29tbWFuZHM9XCIke2NvbW1hbmRzfVwiXG4gIENPTVBSRVBMWT0oJChjb21wZ2VuIC1XIFwiXFwke2NvbW1hbmRzfVwiIC0tIFwiXFwke2N1cn1cIikpXG59XG5jb21wbGV0ZSAtRiBfcGlwZWxpbmVfbWFuYWdlcl9jb21wbGV0aW9ucyBwaXBlbGluZS1tYW5hZ2VyYCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3pzaCc6XG4gICAgICAgICAgY29uc29sZS5sb2coYCMgcGlwZWxpbmUtbWFuYWdlciB6c2ggY29tcGxldGlvbnNcbl9waXBlbGluZV9tYW5hZ2VyKCkge1xuICBsb2NhbCBjb21tYW5kcz0oJHtjb21tYW5kc30pXG4gIF9kZXNjcmliZSAnY29tbWFuZCcgY29tbWFuZHNcbn1cbmNvbXBkZWYgX3BpcGVsaW5lX21hbmFnZXIgcGlwZWxpbmUtbWFuYWdlcmApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdmaXNoJzpcbiAgICAgICAgICBjb25zb2xlLmxvZyhgIyBwaXBlbGluZS1tYW5hZ2VyIGZpc2ggY29tcGxldGlvbnNcbmNvbXBsZXRlIC1jIHBpcGVsaW5lLW1hbmFnZXIgLW4gJ19fZmlzaF91c2Vfc3ViY29tbWFuZCcgLWEgJyR7Y29tbWFuZHN9J2ApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFVua25vd24gc2hlbGw6ICR7c2hlbGx9LiBVc2UgYmFzaCwgenNoLCBvciBmaXNoLmApO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBwcmludERlYnVnKCdBbGwgY29tbWFuZHMgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHknKTtcbn1cblxuLyoqXG4gKiBIYW5kbGUgcHJvZ3JhbSBlcnJvcnNcbiAqL1xuZnVuY3Rpb24gc2V0dXBFcnJvckhhbmRsZXJzKCk6IHZvaWQge1xuICAvLyBIYW5kbGUgdW5jYXVnaHQgZXhjZXB0aW9uc1xuICBwcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIChlcnJvcjogRXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByaW50RXJyb3IoJ1VuY2F1Z2h0IGV4Y2VwdGlvbicsIHtcbiAgICAgIGVycm9yOiBlcnJvci5tZXNzYWdlLFxuICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICB9KTtcblxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5HRU5FUkFMLCB7XG4gICAgICBkZWJ1ZzogaXNEZWJ1Z01vZGUocHJvZ3JhbS5vcHRzKCkpLFxuICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgdHlwZTogJ3VuY2F1Z2h0RXhjZXB0aW9uJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIEhhbmRsZSB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb25zXG4gIHByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIChyZWFzb246IHVua25vd24pID0+IHtcbiAgICBjb25zb2xlLmVycm9yKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByaW50RXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHtcbiAgICAgIHJlYXNvbjogcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb24ubWVzc2FnZTogU3RyaW5nKHJlYXNvbiksXG4gICAgfSk7XG5cbiAgICBjb25zdCBlcnJvciA9IHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVhc29uOiBuZXcgRXJyb3IoU3RyaW5nKHJlYXNvbikpO1xuXG4gICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkdFTkVSQUwsIHtcbiAgICAgIGRlYnVnOiBpc0RlYnVnTW9kZShwcm9ncmFtLm9wdHMoKSksXG4gICAgICBleGl0OiB0cnVlLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICB0eXBlOiAndW5oYW5kbGVkUmVqZWN0aW9uJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIEhhbmRsZSBTSUdJTlQgKEN0cmwrQylcbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByaW50V2FybmluZygnUHJvY2VzcyBpbnRlcnJ1cHRlZCBieSB1c2VyIChTSUdJTlQpJyk7XG4gICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJvY2Vzcy5leGl0KDEzMCk7IC8vIFN0YW5kYXJkIGV4aXQgY29kZSBmb3IgU0lHSU5UXG4gIH0pO1xuXG4gIC8vIEhhbmRsZSBTSUdURVJNXG4gIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJpbnRXYXJuaW5nKCdQcm9jZXNzIHRlcm1pbmF0ZWQgKFNJR1RFUk0pJyk7XG4gICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJvY2Vzcy5leGl0KDE0Myk7IC8vIFN0YW5kYXJkIGV4aXQgY29kZSBmb3IgU0lHVEVSTVxuICB9KTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIENMSSB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENMSSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQ2xpKG9wdGlvbnM6IENsaU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICBjb25zdCB7XG4gICAgc2hvd0Jhbm5lciA9IHRydWUsXG4gICAgbWluaW1hbEJhbm5lciA9IGZhbHNlLFxuICAgIGRlYnVnID0gZmFsc2UsXG4gICAgdmVyYm9zZSA9IGZhbHNlLFxuICAgIHF1aWV0ID0gZmFsc2UsXG4gICAgbm9Db2xvciA9IGZhbHNlLFxuICB9ID0gb3B0aW9ucztcblxuICAvLyBIYW5kbGUgY29sb3Igb3V0cHV0XG4gIGlmIChub0NvbG9yKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgPSAnMSc7XG4gIH1cblxuICAvLyBEaXNwbGF5IGJhbm5lclxuICBpZiAoc2hvd0Jhbm5lciAmJiAhcXVpZXQpIHtcbiAgICBpZiAobWluaW1hbEJhbm5lcikge1xuICAgICAgbWluaUJhbm5lcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYW5uZXIoe1xuICAgICAgICBtaW5pbWFsOiBmYWxzZSxcbiAgICAgICAgc2hvd0Rlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgICBzaG93VGltZXN0YW1wOiBkZWJ1ZyB8fCB2ZXJib3NlLFxuICAgICAgICBzaG93RXhlY3V0aW9uSWQ6IGRlYnVnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGlzcGxheSBzdGFydHVwIGluZm9cbiAgZGlzcGxheVN0YXJ0dXBJbmZvKHsgZGVidWcsIHZlcmJvc2UsIHF1aWV0IH0pO1xuXG4gIC8vIENoZWNrIGVudmlyb25tZW50XG4gIGlmICghcXVpZXQpIHtcbiAgICBjaGVja0Vudmlyb25tZW50KCk7XG4gIH1cblxuICAvLyBTZXR1cCBlcnJvciBoYW5kbGVyc1xuICBzZXR1cEVycm9ySGFuZGxlcnMoKTtcblxuICAvLyBSZWdpc3RlciBjb21tYW5kc1xuICB0cnkge1xuICAgIHJlZ2lzdGVyQ29tbWFuZHMoKTtcbiAgICBwcmludERlYnVnKCdDTEkgaW5pdGlhbGl6YXRpb24gY29tcGxldGUnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwcmludEVycm9yKCdDTEkgaW5pdGlhbGl6YXRpb24gZmFpbGVkJywge1xuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlOiBTdHJpbmcoZXJyb3IpLFxuICAgIH0pO1xuXG4gICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkNPTkZJR1VSQVRJT04sIHtcbiAgICAgIGRlYnVnOiBkZWJ1ZyB8fCBpc0RlYnVnTW9kZSgpLFxuICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgc3RhZ2U6ICdpbml0aWFsaXphdGlvbicsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50c1xuICovXG5mdW5jdGlvbiBwYXJzZUFyZ3VtZW50cygpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBwcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndik7XG5cbiAgICAvLyBTaG93IGhlbHAgaWYgbm8gY29tbWFuZCBwcm92aWRlZFxuICAgIGNvbnN0IGFyZ3MgPSBwcm9jZXNzLmFyZ3Yuc2xpY2UoMik7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBwcmludEluZm8oJ05vIGNvbW1hbmQgc3BlY2lmaWVkIC0gZGlzcGxheWluZyBoZWxwJyk7XG4gICAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICAgIHByb2dyYW0ub3V0cHV0SGVscCgpO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGNvbW1hbmQgZXhpc3RzXG4gICAgY29uc3QgY29tbWFuZCA9IGFyZ3NbMF07XG4gICAgaWYgKGNvbW1hbmQgJiYgIWNvbW1hbmQuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICBjb25zdCBjb21tYW5kRXhpc3RzID0gcHJvZ3JhbS5jb21tYW5kcy5zb21lKGNtZCA9PiBjbWQubmFtZSgpID09PSBjb21tYW5kKTtcblxuICAgICAgaWYgKCFjb21tYW5kRXhpc3RzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgICAgICBwcmludEVycm9yKGBVbmtub3duIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKTtcbiAgICAgICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgICAgIHByaW50SW5mbygnQXZhaWxhYmxlIGNvbW1hbmRzOicpO1xuICAgICAgICBwcm9ncmFtLmNvbW1hbmRzLmZvckVhY2goY21kID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgIOKAoiAke2NtZC5uYW1lKCl9IC0gJHtjbWQuZGVzY3JpcHRpb24oKX1gKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpbnREZWJ1ZygnQ29tbWFuZCBsaW5lIGFyZ3VtZW50cyBwYXJzZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkdFTkVSQUwsIHtcbiAgICAgIGRlYnVnOiBpc0RlYnVnTW9kZShwcm9ncmFtLm9wdHMoKSksXG4gICAgICBleGl0OiB0cnVlLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICBzdGFnZTogJ2FyZ3VtZW50LXBhcnNpbmcnLFxuICAgICAgICBhcmd2OiBwcm9jZXNzLmFyZ3YsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogTWFpbiBDTEkgZW50cnkgcG9pbnRcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENMSSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFN0YW5kYXJkIGluaXRpYWxpemF0aW9uXG4gKiBtYWluKCk7XG4gKlxuICogLy8gTWluaW1hbCBtb2RlXG4gKiBtYWluKHsgbWluaW1hbEJhbm5lcjogdHJ1ZSwgcXVpZXQ6IHRydWUgfSk7XG4gKlxuICogLy8gRGVidWcgbW9kZVxuICogbWFpbih7IGRlYnVnOiB0cnVlLCB2ZXJib3NlOiB0cnVlIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWluKG9wdGlvbnM6IENsaU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICB0cnkge1xuICAgIC8vIEluaXRpYWxpemUgQ0xJXG4gICAgaW5pdGlhbGl6ZUNsaShvcHRpb25zKTtcblxuICAgIC8vIFBhcnNlIGFyZ3VtZW50cyBhbmQgZXhlY3V0ZSBjb21tYW5kXG4gICAgcGFyc2VBcmd1bWVudHMoKTtcblxuICAgIC8vIElmIHdlIHJlYWNoIGhlcmUsIGNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuICAgIHByaW50RGVidWcoJ0NMSSBleGVjdXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseScpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEZpbmFsIGNhdGNoLWFsbCBlcnJvciBoYW5kbGVyXG4gICAgY29uc29sZS5lcnJvcignJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcmludEVycm9yKCdGYXRhbCBDTEkgZXJyb3InLCB7XG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2U6IFN0cmluZyhlcnJvciksXG4gICAgfSk7XG5cbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuR0VORVJBTCwge1xuICAgICAgZGVidWc6IGlzRGVidWdNb2RlKG9wdGlvbnMpLFxuICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgc3RhZ2U6ICdtYWluJyxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSdW4gQ0xJIGlmIGV4ZWN1dGVkIGRpcmVjdGx5LiBFU00gaGFzIG5vIGByZXF1aXJlLm1haW5gOyBjb21wYXJlIHRoZSBpbnZva2VkXG4gKiBzY3JpcHQgdG8gdGhpcyBtb2R1bGUncyBwYXRoLCByZXNvbHZpbmcgc3ltbGlua3Mgb24gYm90aCBzaWRlcyBzbyB0aGUgYGJpbmBcbiAqIHN5bWxpbmsgKG5vZGVfbW9kdWxlcy8uYmluL3BpcGVsaW5lLW1hbmFnZXIg4oaSIGRpc3QvY2xpLmpzKSBzdGlsbCBtYXRjaGVzLlxuICovXG5jb25zdCBpbnZva2VkU2NyaXB0ID0gcHJvY2Vzcy5hcmd2WzFdO1xuY29uc3QgaXNNYWluTW9kdWxlID0gaW52b2tlZFNjcmlwdCAhPT0gdW5kZWZpbmVkXG4gICYmIHJlYWxwYXRoU3luYyhpbnZva2VkU2NyaXB0KSA9PT0gcmVhbHBhdGhTeW5jKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5pZiAoaXNNYWluTW9kdWxlKSB7XG4gIC8vIFBhcnNlIENMSSBvcHRpb25zIGZyb20gZW52aXJvbm1lbnQgb3IgY29tbWFuZCBsaW5lXG4gIGNvbnN0IG9wdGlvbnM6IENsaU9wdGlvbnMgPSB7XG4gICAgZGVidWc6IHByb2Nlc3MuZW52LkRFQlVHID09PSAndHJ1ZScsXG4gICAgcXVpZXQ6IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1xdWlldCcpLFxuICAgIHZlcmJvc2U6IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS12ZXJib3NlJyksXG4gICAgbm9Db2xvcjogcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLW5vLWNvbG9yJykgfHwgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgPT09ICcxJyxcbiAgfTtcblxuICBtYWluKG9wdGlvbnMpO1xufSJdfQ==