dcdx 1.3.0-next.34 → 1.3.0-next.36

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.
@@ -4,16 +4,19 @@ import { asyncExitHook, gracefulExit } from 'exit-hook';
4
4
  import { glob } from 'glob';
5
5
  import { join, resolve, dirname } from 'path';
6
6
  import { cwd } from 'process';
7
- import { select, input, password, confirm } from '@inquirer/prompts';
7
+ import { input, confirm, password, select } from '@inquirer/prompts';
8
+ import { existsSync, readFileSync, createReadStream, rmSync, writeFileSync, mkdirSync, createWriteStream, realpathSync } from 'fs';
8
9
  import axios from 'axios';
9
10
  import { SingleBar, Presets } from 'cli-progress';
10
11
  import { parse } from 'content-disposition';
11
- import { createReadStream, rmSync, mkdirSync, createWriteStream, existsSync, readFileSync, realpathSync } from 'fs';
12
12
  import { homedir } from 'os';
13
13
  import FormData from 'form-data';
14
+ import simpleGit from 'simple-git';
15
+ import { spawn, execSync } from 'child_process';
16
+ import inquirer from 'inquirer';
17
+ import PressToContinuePrompt from 'inquirer-press-to-continue';
14
18
  import { z } from 'zod';
15
19
  import { DOMParser, XMLSerializer } from '@xmldom/xmldom';
16
- import { spawn, execSync } from 'child_process';
17
20
  import { XMLParser } from 'fast-xml-parser';
18
21
  import xpath from 'xpath';
19
22
  import { watch } from 'chokidar';
@@ -21,6 +24,81 @@ import Dockerode from 'dockerode';
21
24
 
22
25
  const app3hour = 'AAABCA0ODAoPeNpdj01PwkAURffzKyZxZ1IyUzARkllQ24gRaQMtGnaP8VEmtjPNfFT59yJVFyzfubkn796Ux0Bz6SmbUM5nbDzj97RISxozHpMUnbSq88poUaLztFEStUN6MJZ2TaiVpu/YY2M6tI6sQrtHmx8qd74EZ+TBIvyUU/AoYs7jiE0jzknWQxMuifA2IBlUbnQ7AulVjwN9AaU9atASs69O2dNFU4wXJLc1aOUGw9w34JwCTTZoe7RPqUgep2X0Vm0n0fNut4gSxl/Jcnj9nFb6Q5tP/Ueu3L+0PHW4ghZFmm2zZV5k6/95CbR7Y9bYGo/zGrV3Ir4jRbDyCA6vt34DO8p3SDAsAhQnJjLD5k9Fr3uaIzkXKf83o5vDdQIUe4XequNCC3D+9ht9ZYhNZFKmnhc=X02dh';
23
26
 
27
+ const capitalize = (value) => value.charAt(0).toUpperCase() + value.slice(1);
28
+
29
+ const emptyLine = () => console.log('​');
30
+ const provisioning = {
31
+ header: `
32
+ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____ _____
33
+ | _ | __ | | | | | __| | | | | | | | __|
34
+ | __| -| | | | |- -|__ |- -| | | | | |- -| | | | | |
35
+ |__| |__|__|_____|\\___/|_____|_____|_____|_____|_|___|_____|_|___|_____|
36
+
37
+ We will now start provisioning AWS using the Atlassian Data Center App Performace Toolkit (DCAPT) Terraform configuration.
38
+
39
+ In order to do this, we need the following information:
40
+
41
+ 1. The location of the Data Center App Performance Toolkit on your disk
42
+ 2. AWS credentials
43
+ 3. Product license
44
+ `,
45
+ askForAWSCredentials: (product) => `
46
+ In order to provision the ${capitalize(product)} cluster, we need Administrator credentials for AWS.
47
+ Please refer to the DCAPT documentation to find more information on how to create the AWS access keys:
48
+
49
+ https://developer.atlassian.com/platform/marketplace/dc-apps-performance-toolkit-user-guide-${product}/#setup-${product}-data-center-development-environment-on-k8s-
50
+ `,
51
+ askForEnvironment: `
52
+ When provisioning the cluster, we need a unique environment name.
53
+ This will allow you to create multiple clusters (i.e. for different host products) and to identify which cluster to use during testing & teardown.
54
+ `,
55
+ askForHostLicense: `
56
+ The host product requires a valid license.
57
+
58
+ By default we use the 72h developer license provided by Atlassian. If you need a more extensive license,
59
+ you can generate an evaluation license from my.atlassian.com or ask Atlassian Marketplace Developer Support for a test license.
60
+ `,
61
+ askForAppLicense: `
62
+ The app requires a valid license.
63
+
64
+ By default we use the 3 hour timebomb license provided by Atlassian. If you need a more extensive license,
65
+ you can generate an evaluation license from my.atlassian.com or ask Atlassian Marketplace Developer Support for a test license.
66
+ `,
67
+ ready: `
68
+ We have now gathered all the information required to provision the cluster.
69
+
70
+ !! IMPORTANT !!
71
+
72
+ We will be writing the configuration to disk. This will overwrite existing configuration.
73
+ Please note that provisioning the environment will incur AWS usage costs.
74
+ `,
75
+ awsCredentialsPersisted: '✔ AWS credentials written to app/util/k8s/aws_envs',
76
+ terraformConfigurationPersisted: `✔ Terraform configuration written to app/util/k8s/dcapt.tfvars`
77
+ };
78
+ const Restart = {
79
+ header: `
80
+ _____ _____ _____ _____ _____ _____ _____
81
+ | __ | __| __|_ _| _ | __ |_ _|
82
+ | -| __|__ | | | | | -| | |
83
+ |__|__|_____|_____| |_| |__|__|__|__| |_|
84
+
85
+ We will now restart the cluster used in the Data Center Application Performance testing.
86
+ `
87
+ };
88
+
89
+ const getAppLicense = (license, force) => {
90
+ const appLicense = license && existsSync(license) ? readFileSync(license, 'utf8') : license;
91
+ if (force) {
92
+ return appLicense || app3hour;
93
+ }
94
+ console.log(provisioning.askForAppLicense);
95
+ return input({
96
+ message: `License`,
97
+ default: appLicense || app3hour,
98
+ required: true
99
+ });
100
+ };
101
+
24
102
  const uploadToUPM = async (baseUrl, path, username, password, verbose = true) => {
25
103
  const credentials = username && password ? Buffer.from(`${username}:${password}`).toString('base64') : null;
26
104
  const response = await axios.get(`${baseUrl}/rest/plugins/1.0/?os_authType=basic`, credentials ? {
@@ -93,6 +171,242 @@ const registerLicense = async (appKey, license, baseUrl, username, password, ver
93
171
  return true;
94
172
  };
95
173
 
174
+ const getAptDictory = async (cwd$1, mustUseDefaultConfiguration, force) => {
175
+ // Translate common relative paths to absolute paths
176
+ let result = cwd$1 ?
177
+ cwd$1.startsWith('~/')
178
+ ? cwd$1.replace('~/', homedir())
179
+ : cwd$1.startsWith('./')
180
+ ? cwd$1.replace('./', cwd() + '/')
181
+ : cwd$1 === '.'
182
+ ? cwd()
183
+ : cwd$1
184
+ : cwd();
185
+ // If we are in interactive mode, we should ask questions first
186
+ if (!force) {
187
+ // Check if we are currently in the APT directory
188
+ const isCurrentDirectoryEligable = existsSync(join(result, 'app/util/k8s/dcapt.tfvars'));
189
+ // If this is the APT directory, we will be using the current directory...
190
+ let useCurrentDirectory = isCurrentDirectoryEligable;
191
+ // ...unless told otherwise
192
+ if (isCurrentDirectoryEligable) {
193
+ console.log(` We've found the App Performance Toolkit in the specified directory:
194
+ ${result}
195
+ `);
196
+ useCurrentDirectory = await confirm({
197
+ message: `Do you wish to use this directory?`,
198
+ default: true,
199
+ });
200
+ }
201
+ // If we are not going to use the current directory, ask for the alternative
202
+ let directory = result;
203
+ if (!useCurrentDirectory) {
204
+ directory = await input({
205
+ message: 'Please specify the location where the App Peformance Toolkit is located',
206
+ default: result,
207
+ required: true
208
+ });
209
+ }
210
+ // Translate common relative paths to absolute paths
211
+ directory = directory.startsWith('~/')
212
+ ? directory.replace('~/', homedir() + '/')
213
+ : directory.startsWith('./')
214
+ ? directory.replace('./', cwd() + '/')
215
+ : directory === '.'
216
+ ? cwd()
217
+ : directory;
218
+ // Check if the provided alternative is a DCAPT directory
219
+ const isDirectoryEligable = existsSync(resolve(join(directory, 'app/util/k8s/dcapt.tfvars')));
220
+ if (!isDirectoryEligable) {
221
+ // If it is not a DCAPT directory, ask if we need to clone it from Github
222
+ const mustCloneAPT = await confirm({
223
+ message: `The directory either doesn't exist, or it doesn't contain the App Peformance Toolkit. Do you want to clone DCAPT from source?`,
224
+ });
225
+ // If we must clone it from Github, we should clone it from Github
226
+ if (mustCloneAPT) {
227
+ await simpleGit().clone('https://github.com/atlassian/dc-app-performance-toolkit.git', directory);
228
+ }
229
+ }
230
+ // Check if this needs to be a default configuration (for performance regression testing)
231
+ if (mustUseDefaultConfiguration) {
232
+ // Ask nicely...
233
+ const isDefaultConfiguration = await confirm({
234
+ message: 'Please confirm that the chosen directory is using the default configuration for DCAPT (master branch)'
235
+ });
236
+ // ...but also, No is not an option
237
+ if (!isDefaultConfiguration) {
238
+ throw new Error('It is required to use the default configuration from master to continue');
239
+ }
240
+ }
241
+ else {
242
+ // Ask nicely...
243
+ const isAppSpecificConfiguration = await confirm({
244
+ message: 'Please confirm that the chosen directory has a DCAPT installation with app-specific actions'
245
+ });
246
+ // ...but also, No is not an option
247
+ if (!isAppSpecificConfiguration) {
248
+ throw new Error('It is required to have app-specific actions in order to continue');
249
+ }
250
+ }
251
+ // Set the result to the provided directory
252
+ result = directory;
253
+ // If we are in non-interactive mode and we need to use the default configuration, we will clone it from Github
254
+ }
255
+ else if (mustUseDefaultConfiguration) {
256
+ // If the provided directory does not exists we can use it
257
+ // Otherwise use a temporary directory to ensure a fresh non-persistent checkout
258
+ result = !existsSync(result)
259
+ ? result
260
+ : join(homedir(), '.dcdx', 'dcapt');
261
+ // Inform the user of the chosen directory
262
+ console.log(' Installing default configuration of DCAPT from source (non-interactive mode)');
263
+ console.log(` ${result}`);
264
+ // Make sure the directory is empty
265
+ rmSync(result, { force: true, recursive: true });
266
+ // Retrieve DCAPT from github
267
+ await simpleGit().clone('https://github.com/atlassian/dc-app-performance-toolkit.git', result);
268
+ console.log('✔ Finished installing default configuration of DCAPT from source (non-interactive mode)');
269
+ // If we are in non-interactive mode and we need to use app specific configuration, make sure that it exists
270
+ }
271
+ else {
272
+ // Check if we are currently in the APT directory
273
+ const isCurrentDirectoryEligable = existsSync(join(result, 'app/util/k8s/dcapt.tfvars'));
274
+ // If this is not a DCAPT directory, we cannot continue
275
+ if (!isCurrentDirectoryEligable) {
276
+ throw new Error(`Could not find App Performance Toolkit in the current directory ${result}`);
277
+ }
278
+ console.log(' Using DCAPT from current directory (non-interactive mode)');
279
+ console.log(` ${result}`);
280
+ emptyLine();
281
+ }
282
+ // This should not occur, because either we have established the current directory has DCAPT
283
+ // or we have cloned it into a (new) directory. This is merely a check for if the latter failed.
284
+ if (!existsSync(join(result, 'app/util/k8s/dcapt.tfvars'))) {
285
+ throw new Error(`Could not find the App Performance Toolkit in the provided directory ${result}`);
286
+ }
287
+ // Some additional checks to ensure that we are in a valid DCAPT directory
288
+ const hasEnvFile = existsSync(join(result, 'app/util/k8s/aws_envs'));
289
+ const hasSnapshotJSON = existsSync(join(result, 'app/util/k8s/dcapt-snapshots.json'));
290
+ const hasTerraformVariables = existsSync(join(result, 'app/util/k8s/dcapt.tfvars'));
291
+ if (!hasEnvFile) {
292
+ throw new Error(`Could not find the required 'aws_ens' file. Expected to find it in ${join(result, 'app/util/k8s/aws_envs')}`);
293
+ }
294
+ else if (!hasSnapshotJSON) {
295
+ throw new Error(`Could not find the required 'dcapt-snapshots.json' file. Expected to find it in ${join(result, 'app/util/k8s/dcapt-snapshots.json')}`);
296
+ }
297
+ else if (!hasTerraformVariables) {
298
+ throw new Error(`Could not find the required 'dcapt.tfvars' file. Expected to find it in ${join(result, 'app/util/k8s/dcapt.tfvars')}`);
299
+ }
300
+ return result;
301
+ };
302
+
303
+ const getAWSCredentials = async (product, force) => {
304
+ // Try getting the AWS credentials from environment variables
305
+ const { AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY } = process.env;
306
+ // If they exists as environment variables, return them immediately
307
+ if (AWS_ACCESS_KEY_ID && AWS_SECRET_ACCESS_KEY) {
308
+ return [AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY];
309
+ }
310
+ // If we are not in non-interactive mode, we should ask for them
311
+ if (!force) {
312
+ // Show a message asking nicely
313
+ console.log(provisioning.askForAWSCredentials(product));
314
+ const aws_access_key_id = await password({
315
+ message: `AWS Access Key ID`,
316
+ validate: (input) => typeof input === 'string' && input.length > 0
317
+ });
318
+ const aws_secret_access_key = await password({
319
+ message: `AWS Secret Access Key`,
320
+ validate: (input) => typeof input === 'string' && input.length > 0
321
+ });
322
+ return [aws_access_key_id, aws_secret_access_key];
323
+ }
324
+ // If we are in non-interactive mode, and the credentials have not been found, we should throw an error
325
+ throw new Error(`The AWS credentials could not be found. Please provide the 'AWS_ACCESS_KEY_ID' and 'AWS_SECRET_ACCESS_KEY' environment variables`);
326
+ };
327
+
328
+ const getEnvironmentName = async () => {
329
+ console.log(provisioning.askForEnvironment);
330
+ return input({
331
+ message: `Environment name`,
332
+ required: true
333
+ });
334
+ };
335
+
336
+ const getProduct = async () => {
337
+ return select({
338
+ message: `Please choose the product for which you wish to run DCAPT`,
339
+ choices: [
340
+ { name: 'Jira', value: 'jira' },
341
+ { name: 'Confluence', value: 'confluence' },
342
+ { name: 'Bamboo', value: 'bamboo' },
343
+ { name: 'Bitbucket', value: 'bitbucket' }
344
+ ]
345
+ });
346
+ };
347
+
348
+ const restart = async (cwd, environment, product) => {
349
+ writeFileSync(join(cwd, './app/util/k8s/delete_pod.sh'), `
350
+ aws eks update-kubeconfig --name atlas-$ENVIRONMENT_NAME-cluster --region $REGION
351
+ kubectl rollout restart sts/$PRODUCT -n atlassian
352
+ kubectl rollout status sts $PRODUCT -n atlassian`, 'utf8');
353
+ await new Promise((resolve, reject) => {
354
+ const docker = spawn('docker', [
355
+ 'run',
356
+ '-it',
357
+ `--pull=always`,
358
+ '--env-file', './app/util/k8s/aws_envs',
359
+ '-e', `REGION=us-east-2`,
360
+ '-e', `ENVIRONMENT_NAME=${environment}`,
361
+ '-e', `PRODUCT=${product}`,
362
+ '-v', `${cwd}:/data-center-terraform/dc-app-performance-toolkit`,
363
+ '-v', `${cwd}/app/util/k8s/delete_pod.sh:/data-center-terraform/delete_pod.sh`,
364
+ 'atlassianlabs/terraform:latest',
365
+ 'bash', 'delete_pod.sh'
366
+ ], { cwd, stdio: 'inherit' });
367
+ docker.on('exit', (code) => (code === 0) ? resolve() : reject(new Error(`Docker exited with code ${code}`)));
368
+ });
369
+ };
370
+
371
+ const persistAWSCredentials = (cwd, aws_access_key_id, aws_secret_access_key) => {
372
+ writeFileSync(join(cwd, 'app/util/k8s/aws_envs'), `
373
+ # aws_envs file should contain AWS variables needed for authorization (without quotes)
374
+ AWS_ACCESS_KEY_ID=${aws_access_key_id}
375
+ AWS_SECRET_ACCESS_KEY=${aws_secret_access_key}
376
+ `.trim(), 'utf-8');
377
+ console.log(provisioning.awsCredentialsPersisted);
378
+ };
379
+
380
+ inquirer.registerPrompt('press-to-continue', PressToContinuePrompt);
381
+ const waitForUserInput = async (message, force) => {
382
+ const { key } = await inquirer.prompt({
383
+ name: 'key',
384
+ type: 'press-to-continue',
385
+ anyKey: true,
386
+ pressToContinueMessage: message,
387
+ when: !force
388
+ });
389
+ return key || { value: undefined };
390
+ };
391
+
392
+ const restartCluster = async (options) => {
393
+ // Show nice little welcome message
394
+ console.log(Restart.header);
395
+ // Ask for the proper directory of APT
396
+ const directory = await getAptDictory(options.cwd, true, options.force);
397
+ // Ask for the AWS credentials
398
+ const [aws_access_key_id, aws_secret_access_key] = await getAWSCredentials(options.product, options.force);
399
+ // Write AWS credentials to disk
400
+ persistAWSCredentials(directory, aws_access_key_id, aws_secret_access_key);
401
+ // Ask the user if they are ready to say goodbye to their cluster
402
+ await waitForUserInput('Press a key to continue...', options.force);
403
+ emptyLine();
404
+ // Terminate it!
405
+ await restart(directory, options.environment, options.product);
406
+ // Ask the user to quit the program
407
+ await waitForUserInput('Press a key to exit...', options.force);
408
+ };
409
+
96
410
  const progressBar = new SingleBar({
97
411
  format: ' [{bar}] {percentage}% | ETA: {eta_formatted}m',
98
412
  formatTime: (value) => {
@@ -127,15 +441,20 @@ const download = async (addonKey) => {
127
441
  }).catch(() => null);
128
442
  return tmpFile;
129
443
  };
130
- const installApp = async (baseUrl, appKey, license = app3hour, username = 'admin', password$1 = 'admin', force) => {
444
+ const installApp = async (options) => {
445
+ // Set default value for username/password
446
+ const username = options.username || 'admin';
447
+ const password$1 = options.password || 'admin';
131
448
  // If we are in non-interactive mode, we will download it from MPAC
132
- if (force) {
449
+ if (options.force) {
133
450
  // In order to do so, we need an appkey. If this is not provided, throw a hissy fit
134
- if (!appKey) {
451
+ if (!options.appKey) {
135
452
  throw new Error('Failed to automatically install app into cluster, `appKey` was not provided');
136
453
  }
454
+ // Get the app license
455
+ const appLicense = await getAppLicense(options.license, options.force);
137
456
  // Download the file from MPAC
138
- const file = await download(appKey);
457
+ const file = await download(options.appKey);
139
458
  let count = 0;
140
459
  let timerId = null;
141
460
  let isInstalledSuccesfully = false;
@@ -143,27 +462,53 @@ const installApp = async (baseUrl, appKey, license = app3hour, username = 'admin
143
462
  try {
144
463
  if (count === 0) {
145
464
  console.log(`
146
- Installing the app (${appKey}) into the cluster using the Universal Plugin Manager REST API`);
465
+ Installing the app (${options.appKey}) into the cluster using the Universal Plugin Manager REST API`);
147
466
  }
148
467
  else {
149
468
  console.log(`
150
- Retrying installation of the app (${appKey}) into the cluster using the Universal Plugin Manager REST API (attempt ${count + 1})`);
469
+ Retrying installation of the app (${options.appKey}) into the cluster using the Universal Plugin Manager REST API (attempt ${count + 1})`);
151
470
  }
152
471
  // Show a progress bar
153
472
  progressBar.start(180, 0);
154
473
  timerId = setInterval(() => progressBar.increment(), 1000);
155
474
  // Upload it into the cluster using the UPM REST API
156
- const isInstalled = await uploadToUPM(baseUrl, file, username, password$1, false);
475
+ const isInstalled = await uploadToUPM(options.baseUrl, file, username, password$1, false);
157
476
  if (!isInstalled) {
158
477
  throw new Error('Failed to install app into the cluster using the Universal Plugin Manager REST API');
159
478
  }
479
+ // Check if we need to restart the application container
480
+ if (options.restartAfterInstall) {
481
+ // For restarts, the product option is required
482
+ if (!options.product) {
483
+ console.log(' Failed to restart application, required option `product` is missing');
484
+ // For restarts, the environment option is required
485
+ }
486
+ else if (!options.environment) {
487
+ console.log(' Failed to restart application, required option `product` is missing');
488
+ // Ok, good to go!
489
+ }
490
+ else {
491
+ // Oh right, we also need DCAPT in order to be able to restart the cluster
492
+ const cwd = await getAptDictory(options.cwd, false, options.force);
493
+ // We are now going to restart the cluster and hope for the best
494
+ console.log(` Restarting ${options.product} to ensure app installation`);
495
+ await restartCluster({
496
+ cwd,
497
+ product: options.product,
498
+ environment: options.environment,
499
+ aws_access_key_id: options.aws_access_key_id,
500
+ aws_secret_access_key: options.aws_secret_access_key,
501
+ force: options.force
502
+ });
503
+ }
504
+ }
160
505
  // Wait for the plugin to be enabled
161
- const isEnabled = await waitForPluginToBeEnabled(appKey, baseUrl, username, password$1, false);
506
+ const isEnabled = await waitForPluginToBeEnabled(options.appKey, options.baseUrl, username, password$1, false);
162
507
  if (!isEnabled) {
163
508
  throw new Error('The app could not be enabled on the cluster, please refer to the application log files for more information');
164
509
  }
165
510
  // Register the license (use the 3 hour timebomb in non-interactive mode)
166
- const isLicensed = await registerLicense(appKey, license, baseUrl, username, password$1, false);
511
+ const isLicensed = await registerLicense(options.appKey, appLicense, options.baseUrl, username, password$1, false);
167
512
  if (!isLicensed) {
168
513
  throw new Error('The license could not be applied for the app on the cluster, please refer to the application log files for more information');
169
514
  }
@@ -190,7 +535,7 @@ const installApp = async (baseUrl, appKey, license = app3hour, username = 'admin
190
535
  // Remove the temporary file
191
536
  rmSync(file, { force: true });
192
537
  // Tell them we succeeded
193
- console.log(`✔ Finished installing the app (${appKey})`);
538
+ console.log(`✔ Finished installing the app (${options.appKey})`);
194
539
  // If we're in interactive mode, let's be nice
195
540
  }
196
541
  else {
@@ -213,15 +558,11 @@ const installApp = async (baseUrl, appKey, license = app3hour, username = 'admin
213
558
  // Ask them nicely for the app key
214
559
  const addonKey = await input({
215
560
  message: 'Please provide the key of the app to be installed',
216
- default: appKey,
561
+ default: options.appKey,
217
562
  required: true
218
563
  });
219
564
  // Ask them nicely for the app license to be used
220
- const appLicense = await input({
221
- message: `License`,
222
- default: license,
223
- required: true
224
- });
565
+ const appLicense = await getAppLicense(options.license, options.force);
225
566
  // Ask them nicely for the username
226
567
  const adminUsername = await input({
227
568
  message: 'Please provide the username of a system administrator',
@@ -233,6 +574,10 @@ const installApp = async (baseUrl, appKey, license = app3hour, username = 'admin
233
574
  message: 'Please provide the username of a system administrator',
234
575
  validate: item => typeof item === 'string' && item.length > 0
235
576
  });
577
+ // Ask them nicely if we need to restart the application
578
+ const restartAfterInstall = await confirm({
579
+ message: 'Restart the host application after installation?',
580
+ });
236
581
  // Tell them we are starting
237
582
  console.log(`
238
583
  Installing the app (${addonKey}) into the cluster using the Universal Plugin Manager REST API`);
@@ -242,17 +587,38 @@ const installApp = async (baseUrl, appKey, license = app3hour, username = 'admin
242
587
  // Download the file from MPAC
243
588
  const file = await download(addonKey);
244
589
  // Upload it into the cluster using the UPM REST API
245
- const isInstalled = await uploadToUPM(baseUrl, file, adminUsername, adminPassword, false);
590
+ const isInstalled = await uploadToUPM(options.baseUrl, file, adminUsername, adminPassword, false);
246
591
  if (!isInstalled) {
247
592
  throw new Error('Failed to install app into the cluster using the Universal Plugin Manager REST API');
248
593
  }
594
+ // Check if we need to restart the application container
595
+ if (restartAfterInstall) {
596
+ // Ask them nicely for the host product
597
+ const product = options.product || await getProduct();
598
+ // Ask for the AWS credentials
599
+ const [aws_access_key_id, aws_secret_access_key] = await getAWSCredentials(product, options.force);
600
+ // Ask for the environment name
601
+ const environment = options.environment || await getEnvironmentName();
602
+ // Oh right, we also need DCAPT in order to be able to restart the cluster
603
+ const cwd = await getAptDictory(options.cwd, false, options.force);
604
+ // We are now going to restart the cluster and hope for the best
605
+ console.log(` Restarting ${options.product} to ensure app installation`);
606
+ await restartCluster({
607
+ cwd,
608
+ product: product,
609
+ environment: environment,
610
+ aws_access_key_id: aws_access_key_id,
611
+ aws_secret_access_key: aws_secret_access_key,
612
+ force: options.force
613
+ });
614
+ }
249
615
  // Wait for the plugin to be enabled
250
- const isEnabled = await waitForPluginToBeEnabled(addonKey, baseUrl, adminUsername, adminPassword, false);
616
+ const isEnabled = await waitForPluginToBeEnabled(addonKey, options.baseUrl, adminUsername, adminPassword, false);
251
617
  if (!isEnabled) {
252
618
  throw new Error('The app could not be enabled on the cluster, please refer to the application log files for more information');
253
619
  }
254
620
  // Register the provided license
255
- const isLicensed = await registerLicense(addonKey, appLicense, baseUrl, adminUsername, adminPassword, false);
621
+ const isLicensed = await registerLicense(addonKey, appLicense, options.baseUrl, adminUsername, adminPassword, false);
256
622
  if (!isLicensed) {
257
623
  throw new Error('The license could not be applied for the app on the cluster, please refer to the application log files for more information');
258
624
  }
@@ -271,7 +637,7 @@ const installApp = async (baseUrl, appKey, license = app3hour, username = 'admin
271
637
  You can now install the app manually into the cluster.
272
638
  Please go to the following page:
273
639
 
274
- ${baseUrl}/plugins/servlet/upm?source=side_nav_manage_addons
640
+ ${options.baseUrl}/plugins/servlet/upm?source=side_nav_manage_addons
275
641
  `);
276
642
  // Make them grovel
277
643
  const isInstalledManually = await confirm({
@@ -9208,6 +9574,7 @@ var mssql = [
9208
9574
  "2019-CU29-ubuntu-20.04",
9209
9575
  "2019-CU3-ubuntu-16.04",
9210
9576
  "2019-CU3-ubuntu-18.04",
9577
+ "2019-CU30-ubuntu-20.04",
9211
9578
  "2019-CU4-ubuntu-16.04",
9212
9579
  "2019-CU4-ubuntu-18.04",
9213
9580
  "2019-CU5-ubuntu-16.04",
@@ -9761,7 +10128,15 @@ const Command = () => {
9761
10128
  else if (!options.appKey) {
9762
10129
  throw new InvalidOptionArgumentError('Missing argument "--appKey", required for installing from the Atlassian Marketplace');
9763
10130
  }
9764
- await installApp(options.baseUrl, options.appKey, undefined, options.username, options.password, true);
10131
+ await installApp({
10132
+ baseUrl: options.baseUrl,
10133
+ appKey: options.appKey,
10134
+ license: await getAppLicense(options.license, true),
10135
+ username: options.username,
10136
+ password: options.password,
10137
+ restartAfterInstall: false,
10138
+ force: true
10139
+ });
9765
10140
  }
9766
10141
  else {
9767
10142
  if (!amps.isAtlassianPlugin()) {
@@ -9816,6 +10191,7 @@ If there is a running instance, it will try to install the plugin using QuickRel
9816
10191
  .addOption(new Option('--mpac', 'Install the app from the Atlassian Marketplace'))
9817
10192
  .addOption(new Option('--baseUrl <url>', 'URL of the instance (required with --mpac)'))
9818
10193
  .addOption(new Option('--appKey <key>', 'The key of the app to be installed (required with --mpac)'))
10194
+ .addOption(new Option('--license <path_or_license>', 'The app license, either as a path to a file or the license itself'))
9819
10195
  .addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the AMPS configuration'))
9820
10196
  .action(options => ActionHandler(program, Command(), { ...options, install: true }));
9821
10197
  program.parseAsync(process.argv).catch(() => gracefulExit(1));
@@ -9823,4 +10199,4 @@ process.on('SIGINT', () => {
9823
10199
  console.log(`Received term signal, trying to stop gracefully 💪`);
9824
10200
  gracefulExit(1);
9825
10201
  });
9826
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vZGlzdC9zcmMvaGVscGVycy9saWNlbmNlcy5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2hlbHBlcnMvdXBtLmpzIiwiLi4vLi4vZGlzdC9zcmMvYXB0L2hlbHBlcnMvaW5zdGFsbEFwcC5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2hlbHBlcnMvQWN0aW9uSGFuZGxlci5qcyIsIi4uLy4uL2Rpc3Qvc3JjL3R5cGVzL0RhdGFiYXNlLmpzIiwiLi4vLi4vZGlzdC9zcmMvdHlwZXMvQXBwbGljYXRpb24uanMiLCIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL2FtcHMuanMiLCIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL2lzUmVjdXJzaXZlQnVpbGQuanMiLCIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL3Nob3dSZWN1cnNpdmVCdWlsZFdhcm5pbmcuanMiLCIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL0N1c3RvbUJ1aWxkZXIuanMiLCIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL2RvY2tlci5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2hlbHBlcnMvSW5zdGFsbGVyLmpzIiwiLi4vLi4vZGlzdC9zcmMvaGVscGVycy9GaWxlV2F0Y2hlci5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2hlbHBlcnMvdG9BYnNvbHV0ZVBhdGguanMiLCIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL2dldFZlcnNpb25zLmpzIiwiLi4vLi4vZGlzdC9zcmMvY29tbWFuZHMvaW5zdGFsbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgdGltZWJvbWIgPSB7XG4gICAgJ2ppcmEnOiAnQUFBQ0JBME9EQW9QZU5wOWtsMXYyakFVaHUveks0NjBPeVFIU0x1VklrVWFUYndOVkJLVWhFbmJ1Z3NURHVBMnNTUGJnYkZmUHhPQzFpKzR5RVhPNSt2blBSK3lHaUdTVy9DdW9YYzd2Qm9NdlQ0RU5BT3Y1L1djdFVJVUcxbFZxTng3bnFQUVNKZmNjQ2w4R21VMG1TWGpsRHBSWFM1UXhhdTVScVY5MG5jQ0tRekxUY1JLOUV1OTQ0SXAvY1EvTTFNd3JUa1RiaTVMWjFhcmZNTTBoc3lnNy9YNkE5THZFODl6MmozWnZzSm1RQkJQcHpRSnhxUDdVNHIrcWJqYU4zMnpHKy9iYVIyZE1sNmMzNWVpMnFJYWgvNGR2YUhrT3Z6cGtVL3g1SVo4dmJvZE9JOWNNYmRTY2xubnhqMzhFQzFYWnNjVXVuWXkzNkp2VkkzT3hHWm1iWlhkendJVTVsVkpXaTkwcm5qVlFHb2k3MEI4NzNHTmhQT1FPNTFPRkdma1M1eVFXUktIOHlBYnh4R1pwOVFtL0VDaHBiR0V4UjdNQnFHZEFsVGtjb2tLN01NZU1UZndhMk5NOVREc2R0ZlNmUUduV3h3N0NCNDdmcnNRU2hEU3dKSnJvL2lpTm1nbmN3MUdRbDVySTB0cnRldFk0c0tnWUNKL1k0cVZGU1IwbE5HUTNQMDRhRHhyVEt2V09qTVhUMEx1eENVMzN0eGFTaVBmZnVSanIzZnNPL21DNm9nL1Ztc211R1lOMElqOTNURlljVlh1blFhYURiNCt3SmJGZDd2ZzBPSTVJZjUzTkVOdG9LMkFsVlF3R1NjalNGdDVscmpkV3ltdThXRUlnU3d0cHB5ekFzTGd4Ums4UDVoRzlQTUEzYktpUHNwZHNVTGpKUndYN3VrZjUvTlg3VEF0QWhVQWhRU0h6OURneWNPWDd3Y3dFUk1KYjNUTEdiNENGR2tCL3hVV1NSSzNCWkxyUEY5Um42Wm1yVXFKWDAyb2MnLFxuICAgICdjb25mbHVlbmNlJzogJ0FBQUN6ZzBPREFvUGVOcDlWTzl2MmpBUS9aNi93dEsrSVlXR3NFS0hGR21RbUphdS9HZ0ltOWlZSmhNT1lwcllrZTFBNGErZlNjaEdLdHFQUHZ2ZXZYdjN6cC82Z3FMSExFYjJIYktzVHZOenA5bEM5OE1BMlpiZE5LWWdkaUFHbnRQRFEyejY4OEhjZEgvYU03UDVvMmtaVHpRRUppRTRwREFpQ1RnQm5nYUQwYjBSQ3I1ZjFTOXVIZmNVV1hTUUJ6dUllUXJDQ0RsYjEwbW82QTRjSlRMUVNWbElsekZVZ2dwSThpY2tNYkFWRWJJK3lwSWxpUEc2UjVJbDV6NGtYRUYzQTB4SnAxR3l3YThwRlFlUEtIQW1EZHQ2K0E5Y0pWUUVLNXlXbWhNVjhIR1pMUldrd3JGOFBaTWdwR1BmR2g3SVVOQlVVYzZjQUtSQ2NWRVlyYmxBYVp4dEtFT3JzcWo4Vi9VUzg1enhYZCtmVUd3RDcwaWNrUnd5ZjdBUkFDemlxVVlvKzhJcm10L2pVWUQ5aVQrWVltTklLRlBBQ0F1dnlISWFRRVVTSFlnejBHOHJvcmdDOHJwNXF2YUVaVnAzcHQwdThzdmUzVGlUQ3NTSXIwQTZsbEdyMVZ3ZmR3UHNtYjI1UGpqYlZ3cTJFY1pjbTZuUzZES1grSTNpVDF5UC9DeTQyVEJlNEZBSzBXaFpWdHU2YXpZYlplWmxCMFUyd3JwbmtRb3FxNDBVeXN0NjdScUI5elU4azY0b2xZZXFLbkdtTkN6V2lzZU9Vb0t3aExMb0sxRXhrWklTVmc5NWNyM1pOL1lxZHVlU1lXNjQ5L21kcmZKQVpPUU0zYjNiOTZEUnVoVmszMjYxa2tGdmV4d2U0MVVRdEpOMTJ1NUd6NkdjUFQ3UG43MUg3MHQ2OUNQY2J4L2E5cmNqM3JEdXdsazR4cHJLQ0E1Vk4rb0pqc2FCMlIvNzVzUWZlek0zR0l4SDVteUtUNlBOL1FFcnREd2dGUUU2RTlWRENMVVp0TjhGMzBLbzBLOUlxWFRSdWJuWjhIcEZsWnR6QXlZVUdiL3J5T09JY1lWV1ZDcEJsNWtDalV3bFVoeUYybVk4MFdhb1h4ZHpFaE9XZTJZc05vUlJXV3hNdDZ4WC9oSDZQNXV4RjhiM3JMSklsejFMcFFXOTVwUVB2cWZMcTBrbXdvaEllTHMybDlQTXpmUTQ4THZ2V1RiZk1ZMUFYRGc5S0pETENWMkM5SFVNSCtDYUpmT2Z1ZGkvdjBrSUdWc3dMQUlVRU1ROVg3N2dxR0JkZkgwSEl6QmFWOE5hZFBVQ0ZCbitSaVVBNEQrSXFWUXBUVG91TFZZNjZhQ0dYMDIxMjEnLFxuICAgICdiaXRidWNrZXQnOiAnQUFBQm1nME9EQW9QZU5wOVVsMXYwekFVZmMrdnNNUmJKYWRKdGpHcFVpUzJKSlJPTk9sYUI0U0FCOWU5VzB4VHU3SnZDdjMzZUltRE9vUjR2ZWZlNC9QaE41OWhSNWJja1BpV1JOZXpLSjVGQ1prdkdVbWlKQTR5clpBTExQa0JVckhYb3RFbnU1ZUJSVzZiOEtNVW9DeXc4eEg2QlZaczJLS2NlM1RKcFVKUVhBa29maDJsT2VjY0lWMWRmUmhKQzdmUlhySnV3SnpBTFBMMC9xRitwSTlYR2FQeit1R0dzcHZia2RSeDhBd2NyMG5SZE9DbmxYbm1TbHFPVXF2MERsdHVyZVRLZzZ2T2lJWmI2SjlQb3ZpYVJtOXBISHMwTTlDZi9SdjFEdi9TUDVsTXlvclI5OVdhcnRaVlhtZHNVWlcwM2hRT1NIdENGK24yVExBQjRobElvWVRlZ1NGSG8zK0FRUEsxUVR4K20wMm56enJrbytKUTZNTzBIUzRvREJmZlE1SnJvalNTbmJSbzVMWkRjTXpTRXRSRWRCYjFBWXdOUnpzWGZmMEpnakN3TGpHLzRtQjVnaUUrSnpoYkYzZXN5T245bHhmMUYyMTQ1YTZPV3UyVi9xbUMvMmRWZG9jdG1PcXB0azVQR2lkK1hKeDQydzNOUFBIV1F1RDlmWEpiTDhQa3RmTGhVMkF2K04ycllNWTZ1VUVGcG5jWS9BWUNnZkZBTUN3Q0ZIemtCbGtHSC92UmRUZWVCU2ZVTXpVRGI0VzJBaFF5TTg5M1dQZzJROG9RQVlSZEJTeUtlVlVkb2c9PVgwMmpyJyxcbiAgICAnYmFtYm9vJzogJ0FBQUIzdzBPREFvUGVOcDlVbHRyMnpBWWZmZXZFT3d0b01SMTBxWUxHSmJZV3NubzdHQTdnOTBlWlBscm90V1dqQ1Nuelg3OUZGOElZV2tmRFBKM09lZHd6dmNoMnpkb1dTdmt6cEY3djVqZExyd3BDa2lhSWMvMVBPZVJNeEFhc21NTkVhM0F6MnhuSFQwNGdRSnF1QlFoTmVCNzd2UUd1elBzM2prNXJYSXB4NVFaZmdEZnFBYUdVdFJVT2FqNGFkWCtQa3BHeStVT2hORSt2bkdHNWxhRGFnczlMM210dVRvT0pGNVBramE1Wm9yWEp3RVhIRytwSlFkYU52Uy9jWXRMQXlzQlZGZnUxOWVodnhYUFFyNElKd1YxQUdVTEt6SW5lQmIrOFBCZC9HV09INllmNzUxTm85aWVhdWpsZVlNSEtZbDgrK0ZiMTNWR28xRVVaL2h6bk9CTkVvZmJJRnZIRWQ2bXhEYjgxa1FvVUg1RVpnK29wMGRFTUZtQVFyV1NmNEFaOUhOdlRQMXJNWm5zckxHbXBGcHpLc1pNVnBPeTI4RFFiZndlbzFBaUlRMHF1RGFLNTQwQmk4dzFNaEt4Umh0WldYdkhUZ2huK3pMUUJ2VTQ2RWxhMXJMWmNZRUtPRUFwYXp2dmZLWGNlaVNvWUcva2NUWGhUVWxGRytYVmJnS1ZOSEErZ0Y3Qk44dDNVdVU1c2RwUndYVVhHbm1sVlYwQ0NtUlZVM0c4RXZmNU1LVXc5dnFJRlYzNnRYN21vTmpmbzdDUFR4ZmVuWklKRXJMTVNJaFgzMDlwdkRkOFNVZ0szc21LTXBKc2tuVktCdHIyNnQ0RCtnZDNBQzVxTUN3Q0ZIT2FUV2ZGdkxDTEpQZnQzcWt0Vm8zRmFmbVpBaFJvamI5SUF4ajhLRXFQRFF5MHN0b3MzOTRTUVE9PVgwMm1xJ1xufTtcbmV4cG9ydCBjb25zdCBhcHAzaG91ciA9ICdBQUFCQ0EwT0RBb1BlTnBkajAxUHdrQVVSZmZ6S3laeFoxSXlVekFSa2xsUTI0Z1JhUU10R25hUDhWRW10alBOZkZUNTl5SlZGeXpmdWJrbjc5NlV4MEJ6NlNtYlVNNW5iRHpqOTdSSVN4b3pIcE1VbmJTcTg4cG9VYUx6dEZFU3RVTjZNSloyVGFpVnB1L1lZMk02dEk2c1FydEhteDhxZDc0RVorVEJJdnlVVS9Bb1lzN2ppRTBqemtuV1F4TXVpZkEySUJsVWJuUTdBdWxWandOOUFhVTlhdEFTczY5TzJkTkZVNHdYSkxjMWFPVUd3OXczNEp3Q1RUWm9lN1JQcVVnZXAyWDBWbTBuMGZOdXQ0Z1N4bC9KY25qOW5GYjZRNXRQL1VldTNMKzBQSFc0Z2haRm1tMnpaVjVrNi85NUNiUjdZOWJZR28vekdyVjNJcjRqUmJEeUNBNnZ0MzRETzhwM1NEQXNBaFFuSmpMRDVrOUZyM3VhSXprWEtmODNvNXZEZFFJVWU0WGVxdU5DQzNEKzlodDlaWWhOWkZLbW5oYz1YMDJkaCc7XG4iLCJpbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IEZvcm1EYXRhIGZyb20gJ2Zvcm0tZGF0YSc7XG5pbXBvcnQgeyBjcmVhdGVSZWFkU3RyZWFtIH0gZnJvbSAnZnMnO1xuZXhwb3J0IGNvbnN0IHVwbG9hZFRvVVBNID0gYXN5bmMgKGJhc2VVcmwsIHBhdGgsIHVzZXJuYW1lLCBwYXNzd29yZCwgdmVyYm9zZSA9IHRydWUpID0+IHtcbiAgICBjb25zdCBjcmVkZW50aWFscyA9IHVzZXJuYW1lICYmIHBhc3N3b3JkID8gQnVmZmVyLmZyb20oYCR7dXNlcm5hbWV9OiR7cGFzc3dvcmR9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpIDogbnVsbDtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLmdldChgJHtiYXNlVXJsfS9yZXN0L3BsdWdpbnMvMS4wLz9vc19hdXRoVHlwZT1iYXNpY2AsIGNyZWRlbnRpYWxzID8ge1xuICAgICAgICBoZWFkZXJzOiB7ICdBdXRob3JpemF0aW9uJzogYEJhc2ljICR7Y3JlZGVudGlhbHN9YCB9XG4gICAgfSA6IHVuZGVmaW5lZCkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgdmVyYm9zZSAmJiBjb25zb2xlLmxvZygnRmFpbGVkIHRvIHVwbG9hZCBwbHVnaW4gYXJjaGl2ZSBmaWxlIHRvIFVQTSwgdW5hYmxlIHRvIHJldHJpZXZlIHRva2VuJywgZXJyKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gcmVzcG9uc2UuaGVhZGVyc1sndXBtLXRva2VuJ107XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgncGx1Z2luJywgY3JlYXRlUmVhZFN0cmVhbShwYXRoKSk7XG4gICAgICAgICAgICByZXR1cm4gYXhpb3MucG9zdChgJHtiYXNlVXJsfS9yZXN0L3BsdWdpbnMvMS4wLz90b2tlbj0ke3Rva2VufWAsIGZvcm1EYXRhLCB7IGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uZm9ybURhdGEuZ2V0SGVhZGVycygpLFxuICAgICAgICAgICAgICAgICAgICAuLi5jcmVkZW50aWFscyA/IHsgJ0F1dGhvcml6YXRpb24nOiBgQmFzaWMgJHtjcmVkZW50aWFsc31gIH0gOiB7fVxuICAgICAgICAgICAgICAgIH0gfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmVyYm9zZSAmJiBjb25zb2xlLmxvZygnRmluaXNoZWQgdXBsb2FkaW5nIHBsdWdpbiBhcmNoaXZlIHRvIFVQTScpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2ZXJib3NlICYmIGNvbnNvbGUubG9nKCdGYWlsZWQgdG8gdXBsb2FkIHBsdWdpbiBhcmNoaXZlIGZpbGUgdG8gVVBNLCB1bmFibGUgdG8gcmV0cmlldmUgdG9rZW4gZnJvbSBoZWFkZXJzOicsIEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlLmhlYWRlcnMsIG51bGwsIDIpKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuZXhwb3J0IGNvbnN0IHdhaXRGb3JQbHVnaW5Ub0JlRW5hYmxlZCA9IGFzeW5jIChhcHBLZXksIGJhc2VVcmwsIHVzZXJuYW1lLCBwYXNzd29yZCwgdmVyYm9zZSA9IHRydWUpID0+IHtcbiAgICBjb25zdCBjcmVkZW50aWFscyA9IHVzZXJuYW1lICYmIHBhc3N3b3JkID8gQnVmZmVyLmZyb20oYCR7dXNlcm5hbWV9OiR7cGFzc3dvcmR9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpIDogbnVsbDtcbiAgICB2ZXJib3NlICYmIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciBwbHVnaW4gdG8gYmVjb21lIGVuYWJsZWQnKTtcbiAgICBsZXQgaXNFbmFibGVkID0gZmFsc2U7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICB3aGlsZSAoIWlzRW5hYmxlZCAmJiBjb3VudCA8IDEyMCkge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwMCkpO1xuICAgICAgICB2ZXJib3NlICYmIGNvbnNvbGUubG9nKGBXYWl0aW5nIGZvciBwbHVnaW4gdG8gYmVjb21lIGVuYWJsZWQuLi4gJHtjb3VudH1zYCk7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXhpb3MuZ2V0KGAke2Jhc2VVcmx9L3Jlc3QvcGx1Z2lucy8xLjAvJHthcHBLZXl9LWtleWAsIGNyZWRlbnRpYWxzID8ge1xuICAgICAgICAgICAgaGVhZGVyczogeyAnQXV0aG9yaXphdGlvbic6IGBCYXNpYyAke2NyZWRlbnRpYWxzfWAgfVxuICAgICAgICB9IDogdW5kZWZpbmVkKS5jYXRjaCgoKSA9PiAoeyBkYXRhOiB7IGVuYWJsZWQ6IGZhbHNlIH0gfSkpO1xuICAgICAgICBpc0VuYWJsZWQgPSBkYXRhPy5lbmFibGVkO1xuICAgICAgICBjb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gaXNFbmFibGVkO1xufTtcbmV4cG9ydCBjb25zdCByZWdpc3RlckxpY2Vuc2UgPSBhc3luYyAoYXBwS2V5LCBsaWNlbnNlLCBiYXNlVXJsLCB1c2VybmFtZSwgcGFzc3dvcmQsIHZlcmJvc2UgPSB0cnVlKSA9PiB7XG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSB1c2VybmFtZSAmJiBwYXNzd29yZCA/IEJ1ZmZlci5mcm9tKGAke3VzZXJuYW1lfToke3Bhc3N3b3JkfWApLnRvU3RyaW5nKCdiYXNlNjQnKSA6IG51bGw7XG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBheGlvcy5nZXQoYCR7YmFzZVVybH0vcmVzdC9wbHVnaW5zLzEuMC8ke2FwcEtleX0ta2V5L2xpY2Vuc2VgLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdYLUF0bGFzc2lhbi1Ub2tlbic6ICduby1jaGVjaycsXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3ZuZC5hdGwucGx1Z2lucytqc29uJyxcbiAgICAgICAgICAgIC4uLmNyZWRlbnRpYWxzID8geyAnQXV0aG9yaXphdGlvbic6IGBCYXNpYyAke2NyZWRlbnRpYWxzfWAgfSA6IHt9XG4gICAgICAgIH1cbiAgICB9KS5jYXRjaCgoKSA9PiAoeyBkYXRhOiB7fSB9KSk7XG4gICAgY29uc3QgeyByYXdMaWNlbnNlIH0gPSBkYXRhO1xuICAgIGlmICghcmF3TGljZW5zZSB8fCByYXdMaWNlbnNlICE9PSBsaWNlbnNlKSB7XG4gICAgICAgIHJldHVybiBheGlvcy5wdXQoYCR7YmFzZVVybH0vcmVzdC9wbHVnaW5zLzEuMC8ke2FwcEtleX0ta2V5L2xpY2Vuc2VgLCBgeyBcInJhd0xpY2Vuc2VcIjogXCIke2xpY2Vuc2V9XCIgfWAsIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnWC1BdGxhc3NpYW4tVG9rZW4nOiAnbm8tY2hlY2snLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vdm5kLmF0bC5wbHVnaW5zK2pzb24nLFxuICAgICAgICAgICAgICAgIC4uLmNyZWRlbnRpYWxzID8geyAnQXV0aG9yaXphdGlvbic6IGBCYXNpYyAke2NyZWRlbnRpYWxzfWAgfSA6IHt9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdmVyYm9zZSAmJiBjb25zb2xlLmxvZygnRmluaXNoZWQgdXBsb2FkaW5nIGxpY2Vuc2UgdG8gVVBNJyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIHZlcmJvc2UgJiYgY29uc29sZS5sb2coJ0ZhaWxlZCB0byB1cGxvYWQgbGljZW5zZSB0byBVUE0nLCBlcnIpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuIiwiaW1wb3J0IHsgY29uZmlybSwgaW5wdXQsIHBhc3N3b3JkIGFzIHBhc3N3b3JkUHJvbXB0LCBzZWxlY3QgfSBmcm9tICdAaW5xdWlyZXIvcHJvbXB0cyc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgUHJlc2V0cywgU2luZ2xlQmFyIH0gZnJvbSAnY2xpLXByb2dyZXNzJztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnY29udGVudC1kaXNwb3NpdGlvbic7XG5pbXBvcnQgeyBjcmVhdGVXcml0ZVN0cmVhbSwgbWtkaXJTeW5jLCBybVN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgYXBwM2hvdXIgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2xpY2VuY2VzJztcbmltcG9ydCB7IHJlZ2lzdGVyTGljZW5zZSwgdXBsb2FkVG9VUE0sIHdhaXRGb3JQbHVnaW5Ub0JlRW5hYmxlZCB9IGZyb20gJy4uLy4uL2hlbHBlcnMvdXBtJztcbmNvbnN0IHByb2dyZXNzQmFyID0gbmV3IFNpbmdsZUJhcih7XG4gICAgZm9ybWF0OiAnICBbe2Jhcn1dIHtwZXJjZW50YWdlfSUgfCBFVEE6IHtldGFfZm9ybWF0dGVkfW0nLFxuICAgIGZvcm1hdFRpbWU6ICh2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCB0b3RhbCA9IHByb2dyZXNzQmFyLmdldFRvdGFsKCkgLyA2MDtcbiAgICAgICAgY29uc3QgdGltZVBhc3NlZCA9IHJvdW5kKChwcm9ncmVzc0Jhci5nZXRUb3RhbCgpIC0gdmFsdWUpIC8gNjAsIDAuNSk7XG4gICAgICAgIHJldHVybiB0aW1lUGFzc2VkID09PSB0b3RhbCA/IGAke3RvdGFsfWAgOiBgJHt0b3RhbCAtIHRpbWVQYXNzZWR9YDtcbiAgICB9LFxuICAgIGhpZGVDdXJzb3I6IHRydWVcbn0sIFByZXNldHMubGVnYWN5KTtcbmNvbnN0IHJvdW5kID0gKHZhbHVlLCBzdGVwID0gMS4wKSA9PiB7XG4gICAgY29uc3QgaW52ID0gMS4wIC8gc3RlcDtcbiAgICByZXR1cm4gTWF0aC5mbG9vcih2YWx1ZSAqIGludikgLyBpbnY7XG59O1xuY29uc3QgZG93bmxvYWQgPSBhc3luYyAoYWRkb25LZXkpID0+IHtcbiAgICBjb25zdCB0bXBEaXIgPSBqb2luKGhvbWVkaXIoKSwgJy5kY2R4JywgJ3RtcCcpO1xuICAgIGxldCB0bXBGaWxlID0gam9pbih0bXBEaXIsIGFkZG9uS2V5KTtcbiAgICBta2RpclN5bmModG1wRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgZG93bmxvYWRVcmwgPSBgaHR0cHM6Ly9tYXJrZXRwbGFjZS5hdGxhc3NpYW4uY29tL2Rvd25sb2FkL3BsdWdpbnMvJHthZGRvbktleX1gO1xuICAgIGNvbnN0IHsgZGF0YTogbGlzdGluZyB9ID0gYXdhaXQgYXhpb3MuZ2V0KGBodHRwczovL21hcmtldHBsYWNlLmF0bGFzc2lhbi5jb20vcmVzdC8yL2FkZG9ucy8ke2FkZG9uS2V5fT9ob3N0aW5nPWRhdGFjZW50ZXImd2l0aFZlcnNpb249dHJ1ZWApLmNhdGNoKCgpID0+ICh7IGRhdGE6IG51bGwgfSkpO1xuICAgIGlmIChsaXN0aW5nKSB7XG4gICAgICAgIGRvd25sb2FkVXJsID0gbGlzdGluZy5fZW1iZWRkZWQ/LnZlcnNpb24/Ll9lbWJlZGRlZD8uYXJ0aWZhY3Q/Ll9saW5rcz8uYmluYXJ5Py5ocmVmIHx8IGRvd25sb2FkVXJsO1xuICAgIH1cbiAgICBhd2FpdCBheGlvcyh7XG4gICAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgICAgIHVybDogZG93bmxvYWRVcmwsXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ3N0cmVhbSdcbiAgICB9KS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgY29uc3QgZGlzcG9zaXRpb24gPSBwYXJzZShyZXNwb25zZS5oZWFkZXJzWydjb250ZW50LWRpc3Bvc2l0aW9uJ10pO1xuICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGRpc3Bvc2l0aW9uPy5wYXJhbWV0ZXJzPy5maWxlbmFtZSB8fCBhZGRvbktleTtcbiAgICAgICAgdG1wRmlsZSA9IGZpbGVuYW1lO1xuICAgICAgICByZXNwb25zZS5kYXRhLnBpcGUoY3JlYXRlV3JpdGVTdHJlYW0odG1wRmlsZSkpO1xuICAgIH0pLmNhdGNoKCgpID0+IG51bGwpO1xuICAgIHJldHVybiB0bXBGaWxlO1xufTtcbmV4cG9ydCBjb25zdCBpbnN0YWxsQXBwID0gYXN5bmMgKGJhc2VVcmwsIGFwcEtleSwgbGljZW5zZSA9IGFwcDNob3VyLCB1c2VybmFtZSA9ICdhZG1pbicsIHBhc3N3b3JkID0gJ2FkbWluJywgZm9yY2UpID0+IHtcbiAgICAvLyBJZiB3ZSBhcmUgaW4gbm9uLWludGVyYWN0aXZlIG1vZGUsIHdlIHdpbGwgZG93bmxvYWQgaXQgZnJvbSBNUEFDXG4gICAgaWYgKGZvcmNlKSB7XG4gICAgICAgIC8vIEluIG9yZGVyIHRvIGRvIHNvLCB3ZSBuZWVkIGFuIGFwcGtleS4gSWYgdGhpcyBpcyBub3QgcHJvdmlkZWQsIHRocm93IGEgaGlzc3kgZml0XG4gICAgICAgIGlmICghYXBwS2V5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBhdXRvbWF0aWNhbGx5IGluc3RhbGwgYXBwIGludG8gY2x1c3RlciwgYGFwcEtleWAgd2FzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIERvd25sb2FkIHRoZSBmaWxlIGZyb20gTVBBQ1xuICAgICAgICBjb25zdCBmaWxlID0gYXdhaXQgZG93bmxvYWQoYXBwS2V5KTtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgbGV0IHRpbWVySWQgPSBudWxsO1xuICAgICAgICBsZXQgaXNJbnN0YWxsZWRTdWNjZXNmdWxseSA9IGZhbHNlO1xuICAgICAgICB3aGlsZSAoIWlzSW5zdGFsbGVkU3VjY2VzZnVsbHkgJiYgY291bnQgPD0gNCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFxuICBJbnN0YWxsaW5nIHRoZSBhcHAgKCR7YXBwS2V5fSkgaW50byB0aGUgY2x1c3RlciB1c2luZyB0aGUgVW5pdmVyc2FsIFBsdWdpbiBNYW5hZ2VyIFJFU1QgQVBJYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgXG4gIFJldHJ5aW5nIGluc3RhbGxhdGlvbiBvZiB0aGUgYXBwICgke2FwcEtleX0pIGludG8gdGhlIGNsdXN0ZXIgdXNpbmcgdGhlIFVuaXZlcnNhbCBQbHVnaW4gTWFuYWdlciBSRVNUIEFQSSAoYXR0ZW1wdCAke2NvdW50ICsgMX0pYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFNob3cgYSBwcm9ncmVzcyBiYXJcbiAgICAgICAgICAgICAgICBwcm9ncmVzc0Jhci5zdGFydCgxODAsIDApO1xuICAgICAgICAgICAgICAgIHRpbWVySWQgPSBzZXRJbnRlcnZhbCgoKSA9PiBwcm9ncmVzc0Jhci5pbmNyZW1lbnQoKSwgMTAwMCk7XG4gICAgICAgICAgICAgICAgLy8gVXBsb2FkIGl0IGludG8gdGhlIGNsdXN0ZXIgdXNpbmcgdGhlIFVQTSBSRVNUIEFQSVxuICAgICAgICAgICAgICAgIGNvbnN0IGlzSW5zdGFsbGVkID0gYXdhaXQgdXBsb2FkVG9VUE0oYmFzZVVybCwgZmlsZSwgdXNlcm5hbWUsIHBhc3N3b3JkLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0luc3RhbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBpbnN0YWxsIGFwcCBpbnRvIHRoZSBjbHVzdGVyIHVzaW5nIHRoZSBVbml2ZXJzYWwgUGx1Z2luIE1hbmFnZXIgUkVTVCBBUEknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHBsdWdpbiB0byBiZSBlbmFibGVkXG4gICAgICAgICAgICAgICAgY29uc3QgaXNFbmFibGVkID0gYXdhaXQgd2FpdEZvclBsdWdpblRvQmVFbmFibGVkKGFwcEtleSwgYmFzZVVybCwgdXNlcm5hbWUsIHBhc3N3b3JkLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYXBwIGNvdWxkIG5vdCBiZSBlbmFibGVkIG9uIHRoZSBjbHVzdGVyLCBwbGVhc2UgcmVmZXIgdG8gdGhlIGFwcGxpY2F0aW9uIGxvZyBmaWxlcyBmb3IgbW9yZSBpbmZvcm1hdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBSZWdpc3RlciB0aGUgbGljZW5zZSAodXNlIHRoZSAzIGhvdXIgdGltZWJvbWIgaW4gbm9uLWludGVyYWN0aXZlIG1vZGUpXG4gICAgICAgICAgICAgICAgY29uc3QgaXNMaWNlbnNlZCA9IGF3YWl0IHJlZ2lzdGVyTGljZW5zZShhcHBLZXksIGxpY2Vuc2UsIGJhc2VVcmwsIHVzZXJuYW1lLCBwYXNzd29yZCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmICghaXNMaWNlbnNlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBsaWNlbnNlIGNvdWxkIG5vdCBiZSBhcHBsaWVkIGZvciB0aGUgYXBwIG9uIHRoZSBjbHVzdGVyLCBwbGVhc2UgcmVmZXIgdG8gdGhlIGFwcGxpY2F0aW9uIGxvZyBmaWxlcyBmb3IgbW9yZSBpbmZvcm1hdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpc0luc3RhbGxlZFN1Y2Nlc2Z1bGx5ID0gaXNJbnN0YWxsZWQgJiYgaXNFbmFibGVkICYmIGlzTGljZW5zZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50IDw9IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2FpdCBhIG1pbnV0ZSAoY29vbGRvd24gcGVyaW9kKSBiZWZvcmUgcmV0cnlpbmdcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICAgIC8vIFN0b3AgdGhlIHByb2dyZXNzIGJhclxuICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyLnN0b3AoKTtcbiAgICAgICAgICAgICAgICBpZiAodGltZXJJZCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVySWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBSZW1vdmUgdGhlIHRlbXBvcmFyeSBmaWxlXG4gICAgICAgIHJtU3luYyhmaWxlLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICAvLyBUZWxsIHRoZW0gd2Ugc3VjY2VlZGVkXG4gICAgICAgIGNvbnNvbGUubG9nKGDinJQgRmluaXNoZWQgaW5zdGFsbGluZyB0aGUgYXBwICgke2FwcEtleX0pYCk7XG4gICAgICAgIC8vIElmIHdlJ3JlIGluIGludGVyYWN0aXZlIG1vZGUsIGxldCdzIGJlIG5pY2VcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFRlbGwgdGhlIHVzZXIgdGhleSBoYXZlIG9wdGlvbnNcbiAgICAgICAgY29uc29sZS5sb2coYFxuICBJdCBpcyBub3cgcmVxdWlyZWQgdG8gaW5zdGFsbCB0aGUgYXBwIGludG8gdGhlIEppcmEgY2x1c3Rlci5cbiAgV2UgY2FuIGluc3RhbGwgaXQgZnJvbSB0aGUgQXRsYXNzaWFuIE1hcmtldHBsYWNlIG9yIHlvdSBjYW4gaW5zdGFsbCBpdCBtYW51YWxseS5cbmApO1xuICAgICAgICAvLyBBc2sgdGhlbSBpZiB0aGV5IHByZWZlciBhdXRvbWF0aW9uIG9yIHRlZGlvdXMgbWFudWFsIHRhc2tzXG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IGF3YWl0IHNlbGVjdCh7XG4gICAgICAgICAgICBtZXNzYWdlOiBgSG93IGRvIHlvdSB3YW50IHRvIGluc3RhbGwgdGhlIGFwcD9gLFxuICAgICAgICAgICAgZGVmYXVsdDogJ21wYWMnLFxuICAgICAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICAgICAgIHsgbmFtZTogJ01hcmtldHBsYWNlJywgdmFsdWU6ICdtcGFjJyB9LFxuICAgICAgICAgICAgICAgIHsgbmFtZTogJ01hbnVhbCcsIHZhbHVlOiAnbWFudWFsJyB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBJZiB0aGV5IGNob3NlIGF1dG9tYXRpb24sIGxldCdzIGF1dG9tYXRlIVxuICAgICAgICBpZiAobWV0aG9kID09PSAnbXBhYycpIHtcbiAgICAgICAgICAgIC8vIEFzayB0aGVtIG5pY2VseSBmb3IgdGhlIGFwcCBrZXlcbiAgICAgICAgICAgIGNvbnN0IGFkZG9uS2V5ID0gYXdhaXQgaW5wdXQoe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQbGVhc2UgcHJvdmlkZSB0aGUga2V5IG9mIHRoZSBhcHAgdG8gYmUgaW5zdGFsbGVkJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBhcHBLZXksXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQXNrIHRoZW0gbmljZWx5IGZvciB0aGUgYXBwIGxpY2Vuc2UgdG8gYmUgdXNlZFxuICAgICAgICAgICAgY29uc3QgYXBwTGljZW5zZSA9IGF3YWl0IGlucHV0KHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgTGljZW5zZWAsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogbGljZW5zZSxcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBBc2sgdGhlbSBuaWNlbHkgZm9yIHRoZSB1c2VybmFtZVxuICAgICAgICAgICAgY29uc3QgYWRtaW5Vc2VybmFtZSA9IGF3YWl0IGlucHV0KHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUGxlYXNlIHByb3ZpZGUgdGhlIHVzZXJuYW1lIG9mIGEgc3lzdGVtIGFkbWluaXN0cmF0b3InLFxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHVzZXJuYW1lLFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIEFzayB0aGVtIG5pY2VseSBmb3IgdGhlIHVzZXJuYW1lXG4gICAgICAgICAgICBjb25zdCBhZG1pblBhc3N3b3JkID0gYXdhaXQgcGFzc3dvcmRQcm9tcHQoe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQbGVhc2UgcHJvdmlkZSB0aGUgdXNlcm5hbWUgb2YgYSBzeXN0ZW0gYWRtaW5pc3RyYXRvcicsXG4gICAgICAgICAgICAgICAgdmFsaWRhdGU6IGl0ZW0gPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnICYmIGl0ZW0ubGVuZ3RoID4gMFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBUZWxsIHRoZW0gd2UgYXJlIHN0YXJ0aW5nXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgXG4gIEluc3RhbGxpbmcgdGhlIGFwcCAoJHthZGRvbktleX0pIGludG8gdGhlIGNsdXN0ZXIgdXNpbmcgdGhlIFVuaXZlcnNhbCBQbHVnaW4gTWFuYWdlciBSRVNUIEFQSWApO1xuICAgICAgICAgICAgLy8gU2hvdyBhIHByb2dyZXNzIGJhclxuICAgICAgICAgICAgcHJvZ3Jlc3NCYXIuc3RhcnQoMTgwLCAwKTtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVySWQgPSBzZXRJbnRlcnZhbCgoKSA9PiBwcm9ncmVzc0Jhci5pbmNyZW1lbnQoKSwgMTAwMCk7XG4gICAgICAgICAgICAvLyBEb3dubG9hZCB0aGUgZmlsZSBmcm9tIE1QQUNcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBkb3dubG9hZChhZGRvbktleSk7XG4gICAgICAgICAgICAvLyBVcGxvYWQgaXQgaW50byB0aGUgY2x1c3RlciB1c2luZyB0aGUgVVBNIFJFU1QgQVBJXG4gICAgICAgICAgICBjb25zdCBpc0luc3RhbGxlZCA9IGF3YWl0IHVwbG9hZFRvVVBNKGJhc2VVcmwsIGZpbGUsIGFkbWluVXNlcm5hbWUsIGFkbWluUGFzc3dvcmQsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghaXNJbnN0YWxsZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBpbnN0YWxsIGFwcCBpbnRvIHRoZSBjbHVzdGVyIHVzaW5nIHRoZSBVbml2ZXJzYWwgUGx1Z2luIE1hbmFnZXIgUkVTVCBBUEknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBwbHVnaW4gdG8gYmUgZW5hYmxlZFxuICAgICAgICAgICAgY29uc3QgaXNFbmFibGVkID0gYXdhaXQgd2FpdEZvclBsdWdpblRvQmVFbmFibGVkKGFkZG9uS2V5LCBiYXNlVXJsLCBhZG1pblVzZXJuYW1lLCBhZG1pblBhc3N3b3JkLCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGFwcCBjb3VsZCBub3QgYmUgZW5hYmxlZCBvbiB0aGUgY2x1c3RlciwgcGxlYXNlIHJlZmVyIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2cgZmlsZXMgZm9yIG1vcmUgaW5mb3JtYXRpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBwcm92aWRlZCBsaWNlbnNlXG4gICAgICAgICAgICBjb25zdCBpc0xpY2Vuc2VkID0gYXdhaXQgcmVnaXN0ZXJMaWNlbnNlKGFkZG9uS2V5LCBhcHBMaWNlbnNlLCBiYXNlVXJsLCBhZG1pblVzZXJuYW1lLCBhZG1pblBhc3N3b3JkLCBmYWxzZSk7XG4gICAgICAgICAgICBpZiAoIWlzTGljZW5zZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBsaWNlbnNlIGNvdWxkIG5vdCBiZSBhcHBsaWVkIGZvciB0aGUgYXBwIG9uIHRoZSBjbHVzdGVyLCBwbGVhc2UgcmVmZXIgdG8gdGhlIGFwcGxpY2F0aW9uIGxvZyBmaWxlcyBmb3IgbW9yZSBpbmZvcm1hdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICAgICAgcm1TeW5jKGZpbGUsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgICAgICAvLyBTdG9wIHRoZSBwcm9ncmVzcyBiYXJcbiAgICAgICAgICAgIHByb2dyZXNzQmFyLnN0b3AoKTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXJJZCk7XG4gICAgICAgICAgICAvLyBUZWxsIHRoZW0gd2Ugc3VjY2VlZGVkXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhg4pyUIEZpbmlzaGVkIGluc3RhbGxpbmcgdGhlIGFwcCAoJHthZGRvbktleX0pYCk7XG4gICAgICAgICAgICAvLyBUaGV5IGNob3NlIHZpb2xlbmNlXG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBSdWIgaXQgaW4gdGhlaXIgZmFjZVxuICAgICAgICAgICAgY29uc29sZS5sb2coYFxuICBZb3UgY2FuIG5vdyBpbnN0YWxsIHRoZSBhcHAgbWFudWFsbHkgaW50byB0aGUgY2x1c3Rlci5cbiAgUGxlYXNlIGdvIHRvIHRoZSBmb2xsb3dpbmcgcGFnZTpcbiAgICBcbiAgJHtiYXNlVXJsfS9wbHVnaW5zL3NlcnZsZXQvdXBtP3NvdXJjZT1zaWRlX25hdl9tYW5hZ2VfYWRkb25zXG5gKTtcbiAgICAgICAgICAgIC8vIE1ha2UgdGhlbSBncm92ZWxcbiAgICAgICAgICAgIGNvbnN0IGlzSW5zdGFsbGVkTWFudWFsbHkgPSBhd2FpdCBjb25maXJtKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgUGxlYXNlIGNvbmZpcm0gdGhhdCB5b3UgaGF2ZSBpbnN0YWxsZWQgdGhlIGFwcCBtYW51YWxseWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gSWYgdGhlIGFwcCBhaW4ndCBpbnN0YWxsZWQsIHdlIGFpbid0IGRvaW5nIG5vdGhpbicuIFNvIHdlIGJldHRlciB0aHJvdyBhIGhpc3N5IGZpdFxuICAgICAgICAgICAgaWYgKCFpc0luc3RhbGxlZE1hbnVhbGx5KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJdCBpcyByZXF1aXJlZCB0byBpbnN0YWxsIHRoZSBhcHAgdG8gcnVuIHRoZSBzZWNvbmQgcGVyZm9ybWFuY2UgcmVncmVzc2lvbiB0ZXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuIiwiaW1wb3J0IHsgYXN5bmNFeGl0SG9vaywgZ3JhY2VmdWxFeGl0IH0gZnJvbSAnZXhpdC1ob29rJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuZXhwb3J0IGNvbnN0IEFjdGlvbkhhbmRsZXIgPSBhc3luYyAocHJvZ3JhbSwgeyBhY3Rpb24sIGVycm9ySGFuZGxlciB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3BzID0gb3B0aW9ucyB8fCBwcm9ncmFtLm9wdHMoKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgoXywgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSAnJztcbiAgICAgICAgYXN5bmNFeGl0SG9vayhhc3luYyAoY29kZSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlcnJvckhhbmRsZXIob3BzKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgcmVqZWN0aW5nIHRoZSBwcm9taXNlIHRvIGF2b2lkIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBcIkNhbGxpbmcgcHJvY2Vzcy5leGl0XCIgbG9nIG1lc3NhZ2UgZnJvbSBleGl0LWhvb2tcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycjtcbiAgICAgICAgICAgICAgICByZWplY3QobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHdhaXQ6IDYwICogMSAqIDEwMDBcbiAgICAgICAgfSk7XG4gICAgICAgIGFjdGlvbihvcHMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZ3JhY2VmdWxFeGl0KDApO1xuICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIHouWm9kRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnIuaXNzdWVzLmZvckVhY2goaXNzdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFVuYWJsZSB0byBwYXJzZSBvcHRpb24gJHtpc3N1ZS5wYXRoLmpvaW4oJywnKX06ICR7aXNzdWUubWVzc2FnZX1cXG5gO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgfHwgdHlwZW9mIGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnIudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyYWNlZnVsRXhpdCgxKTtcbiAgICAgICAgfSk7XG4gICAgfSkuY2F0Y2gobWVzc2FnZSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwcm9ncmFtLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZSxcbiAgICAgICAgICAgIC8vIHdlIGNhbiBhc3N1bWUgYSBjbGVhbiBleGl0XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB2ZXJzaW9ucyBmcm9tICcuLi8uLi9hc3NldHMvdmVyc2lvbnMuanNvbic7XG5leHBvcnQgY29uc3QgU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzID0gei5lbnVtKFtcbiAgICAncG9zdGdyZXNxbCcsXG4gICAgJ215c3FsJyxcbiAgICAnbXNzcWwnXG5dKTtcbmV4cG9ydCBjb25zdCBTdXBwb3J0ZWRNU1NRTEVkaXRpb25zID0gei5lbnVtKFtcbiAgICAnRGV2ZWxvcGVyJyxcbiAgICAnRXhwcmVzcycsXG4gICAgJ1N0YW5kYXJkJyxcbiAgICAnRW50ZXJwcmlzZScsXG4gICAgJ0VudGVycHJpc2VDb3JlJ1xuXSk7XG5leHBvcnQgY29uc3QgRGF0YWJhc2VPcHRpb25zID0gei5vYmplY3Qoe1xuICAgIG5hbWU6IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcyxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkudHJhbnNmb3JtKE51bWJlcikucmVmaW5lKGl0ZW0gPT4gIWlzTmFOKGl0ZW0pKSksXG4gICAgZGF0YWJhc2U6IHouc3RyaW5nKCkuZGVmYXVsdCgnZGNkeCcpLFxuICAgIHVzZXJuYW1lOiB6LnN0cmluZygpLmRlZmF1bHQoJ2RjZHgnKSxcbiAgICBwYXNzd29yZDogei5zdHJpbmcoKS5kZWZhdWx0KCdkY2R4JyksXG4gICAgY2xlYW46IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICAgIHBydW5lOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgICB2ZXJib3NlOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgICBkcml2ZXI6IHouc3RyaW5nKClcbn0pO1xuZXhwb3J0IGNvbnN0IFBvc3RncmVTUUxPcHRpb25zID0gRGF0YWJhc2VPcHRpb25zLmV4dGVuZCh7XG4gICAgbmFtZTogU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzLnJlZmluZShpdGVtID0+IGl0ZW0gPT09IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5WYWx1ZXMucG9zdGdyZXNxbCkuZGVmYXVsdChTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLnBvc3RncmVzcWwpLFxuICAgIHRhZzogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiB2ZXJzaW9uc1tTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLnBvc3RncmVzcWxdLmluY2x1ZGVzKGl0ZW0pKS5kZWZhdWx0KCdsYXRlc3QnKSxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkudHJhbnNmb3JtKE51bWJlcikucmVmaW5lKGl0ZW0gPT4gIWlzTmFOKGl0ZW0pKSkuZGVmYXVsdCg1NDMyKSxcbiAgICBkcml2ZXI6IHouc3RyaW5nKCkucmVmaW5lKGl0ZW0gPT4gaXRlbSA9PT0gJ29yZy5wb3N0Z3Jlc3FsLkRyaXZlcicpLmRlZmF1bHQoJ29yZy5wb3N0Z3Jlc3FsLkRyaXZlcicpXG59KTtcbmV4cG9ydCBjb25zdCBNeVNRTE9wdGlvbnMgPSBEYXRhYmFzZU9wdGlvbnMuZXh0ZW5kKHtcbiAgICBuYW1lOiBTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMucmVmaW5lKGl0ZW0gPT4gaXRlbSA9PT0gU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzLlZhbHVlcy5teXNxbCkuZGVmYXVsdChTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLm15c3FsKSxcbiAgICB0YWc6IHouc3RyaW5nKCkucmVmaW5lKGl0ZW0gPT4gdmVyc2lvbnNbU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzLlZhbHVlcy5teXNxbF0uaW5jbHVkZXMoaXRlbSkpLmRlZmF1bHQoJ2xhdGVzdCcpLFxuICAgIHBvcnQ6IHoubnVtYmVyKCkub3Ioei5zdHJpbmcoKS50cmFuc2Zvcm0oTnVtYmVyKS5yZWZpbmUoaXRlbSA9PiAhaXNOYU4oaXRlbSkpKS5kZWZhdWx0KDMzMDYpLFxuICAgIGRyaXZlcjogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiBpdGVtID09PSAnY29tLm15c3FsLmpkYmMuRHJpdmVyJykuZGVmYXVsdCgnY29tLm15c3FsLmpkYmMuRHJpdmVyJylcbn0pO1xuZXhwb3J0IGNvbnN0IE1TU1FMT3B0aW9ucyA9IERhdGFiYXNlT3B0aW9ucy5leHRlbmQoe1xuICAgIG5hbWU6IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5yZWZpbmUoaXRlbSA9PiBpdGVtID09PSBTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLm1zc3FsKS5kZWZhdWx0KFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5WYWx1ZXMubXNzcWwpLFxuICAgIHRhZzogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiB2ZXJzaW9uc1tTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLm1zc3FsXS5pbmNsdWRlcyhpdGVtKSkuZGVmYXVsdCgnbGF0ZXN0JyksXG4gICAgZWRpdGlvbjogU3VwcG9ydGVkTVNTUUxFZGl0aW9ucy5kZWZhdWx0KCdEZXZlbG9wZXInKSxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkudHJhbnNmb3JtKE51bWJlcikucmVmaW5lKGl0ZW0gPT4gIWlzTmFOKGl0ZW0pKSkuZGVmYXVsdCgxNDMzKSxcbiAgICB1c2VybmFtZTogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiBpdGVtID09PSAnc2EnKS5kZWZhdWx0KCdzYScpLFxuICAgIHBhc3N3b3JkOiB6LnN0cmluZygpLmRlZmF1bHQoJ0RhdGFDZW50ZXJEWCEnKSxcbiAgICBkcml2ZXI6IHouc3RyaW5nKCkucmVmaW5lKGl0ZW0gPT4gaXRlbSA9PT0gJ2NvbS5taWNyb3NvZnQuc3Fsc2VydmVyLmpkYmMuU1FMU2VydmVyRHJpdmVyJykuZGVmYXVsdCgnY29tLm1pY3Jvc29mdC5zcWxzZXJ2ZXIuamRiYy5TUUxTZXJ2ZXJEcml2ZXInKVxufSk7XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcyB9IGZyb20gJy4vRGF0YWJhc2UnO1xuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZEFwcGxpY2F0aW9ucyA9IHouZW51bShbXG4gICAgJ2ppcmEnLFxuICAgICdjb25mbHVlbmNlJyxcbiAgICAnYml0YnVja2V0JyxcbiAgICAnYmFtYm9vJ1xuXSk7XG5leHBvcnQgY29uc3QgQXBwbGljYXRpb25PcHRpb25zID0gei5vYmplY3Qoe1xuICAgIG5hbWU6IFN1cHBvcnRlZEFwcGxpY2F0aW9ucyxcbiAgICB0YWc6IHouc3RyaW5nKCkuZGVmYXVsdCgnbGF0ZXN0JyksXG4gICAgZGF0YWJhc2U6IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5kZWZhdWx0KCdwb3N0Z3Jlc3FsJyksXG4gICAgZGF0YWJhc2VUYWc6IHouc3RyaW5nKCkuZGVmYXVsdCgnbGF0ZXN0JyksXG4gICAgcG9ydDogei5zdHJpbmcoKS50cmFuc2Zvcm0oTnVtYmVyKS5yZWZpbmUoaXRlbSA9PiAhaXNOYU4oaXRlbSkpLmRlZmF1bHQoJzgwJyksXG4gICAgY29udGV4dFBhdGg6IHouc3RyaW5nKCksXG4gICAgeG1zOiB6LnN0cmluZygpLmRlZmF1bHQoJzEwMjRtJyksXG4gICAgeG14OiB6LnN0cmluZygpLmRlZmF1bHQoJzEwMjRtJyksXG4gICAgd2F0Y2g6IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICAgIGV4dDogei5hcnJheSh6LnN0cmluZygpKSxcbiAgICBpbnN0YWxsOiB6LmJvb2xlYW4oKSxcbiAgICBvdXRwdXREaXJlY3Rvcnk6IHouc3RyaW5nKCksXG4gICAgYWN0aXZhdGVQcm9maWxlczogei5zdHJpbmcoKSxcbiAgICBjbGVhbjogei5ib29sZWFuKCkuZGVmYXVsdChmYWxzZSksXG4gICAgcHJ1bmU6IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICAgIGRlYnVnOiB6LmJvb2xlYW4oKS5kZWZhdWx0KHRydWUpLFxuICAgIGN3ZDogei5zdHJpbmcoKVxufSkucGFydGlhbCh7XG4gICAgY29udGV4dFBhdGg6IHRydWUsXG4gICAgZXh0OiB0cnVlLFxuICAgIGluc3RhbGw6IHRydWUsXG4gICAgb3V0cHV0RGlyZWN0b3J5OiB0cnVlLFxuICAgIGFjdGl2YXRlUHJvZmlsZXM6IHRydWUsXG4gICAgY3dkOiB0cnVlXG59KTtcbiIsImltcG9ydCB7IERPTVBhcnNlciwgWE1MU2VyaWFsaXplciB9IGZyb20gJ0B4bWxkb20veG1sZG9tJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBYTUxQYXJzZXIgfSBmcm9tICdmYXN0LXhtbC1wYXJzZXInO1xuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgY3dkIH0gZnJvbSAncHJvY2Vzcyc7XG5pbXBvcnQgeHBhdGggZnJvbSAneHBhdGgnO1xuaW1wb3J0IHsgU3VwcG9ydGVkQXBwbGljYXRpb25zIH0gZnJvbSAnLi4vdHlwZXMvQXBwbGljYXRpb24nO1xuZXhwb3J0IGNsYXNzIEFNUFMge1xuICAgIG9wdGlvbnM7XG4gICAgbWF2ZW4gPSBudWxsO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7XG4gICAgICAgIHByb2ZpbGVzOiBbXVxuICAgIH0pIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzXG4gICAgc3RvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMubWF2ZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGtpbGxlZCA9IHRoaXMubWF2ZW4ua2lsbCgwKTtcbiAgICAgICAgICAgIGlmICgha2lsbGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gdGVybWluYXRlIGV4aXN0aW5nIE1hdmVuIHByb2Nlc3MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBidWlsZChhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5tYXZlbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtpbGxlZCA9IHRoaXMubWF2ZW4ua2lsbCgwKTtcbiAgICAgICAgICAgICAgICBpZiAoIWtpbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gdGVybWluYXRlIGV4aXN0aW5nIE1hdmVuIHByb2Nlc3MnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tYXZlbiA9IHNwYXduKCdtdm4nLCBbJ3BhY2thZ2UnLCAuLi5hcmdzXSwgeyBjd2Q6IHRoaXMub3B0aW9ucz8uY3dkIHx8IGN3ZCgpLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgICAgICAgICAgdGhpcy5tYXZlbi5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXZlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDAgfHwgY29kZSA9PT0gMTMwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYE1hdmVuIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlzQXRsYXNzaWFuUGx1Z2luID0gKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLmdldE5vZGVzKCcvLypbbG9jYWwtbmFtZSgpPVxcJ3BhY2thZ2luZ1xcJ10nKTtcbiAgICAgICAgICAgIHJldHVybiBub2Rlcy5zb21lKGl0ZW0gPT4gaXRlbS50ZXh0Q29udGVudCA9PT0gJ2F0bGFzc2lhbi1wbHVnaW4nKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGdldEFwcGxpY2F0aW9uVmVyc2lvbigpIHtcbiAgICAgICAgY29uc3QgYXBwbGljYXRpb25zID0gdGhpcy5nZXRBcHBsaWNhdGlvbnMoKTtcbiAgICAgICAgaWYgKGFwcGxpY2F0aW9ucy5zaXplID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IEFycmF5LmZyb20oYXBwbGljYXRpb25zKVswXTtcbiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFwcGxpY2F0aW9ucy5zaXplID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgQXRsYXNzaWFuIFBsdWdpbiBwcm9qZWN0IGNvbnRhaW5zIG11bHRpcGxlIEFNUFMgY29uZmlndXJhdGlvbiwgdW5hYmxlIHRvIGRlY2lkZSB3aGljaCBwcm9kdWN0IHRvIHVzZSDwn5iwJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0QXBwbGljYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGFwcGxpY2F0aW9ucyA9IHRoaXMuZ2V0QXBwbGljYXRpb25zKCk7XG4gICAgICAgIGlmIChhcHBsaWNhdGlvbnMuc2l6ZSA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3QgW25hbWVdID0gQXJyYXkuZnJvbShhcHBsaWNhdGlvbnMpWzBdO1xuICAgICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXBwbGljYXRpb25zLnNpemUgPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBBdGxhc3NpYW4gUGx1Z2luIHByb2plY3QgY29udGFpbnMgbXVsdGlwbGUgQU1QUyBjb25maWd1cmF0aW9uLCB1bmFibGUgdG8gZGVjaWRlIHdoaWNoIHByb2R1Y3QgdG8gdXNlIPCfmLAnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZ2V0QXBwbGljYXRpb25zKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5nZXROb2RlcygnLy8qW2xvY2FsLW5hbWUoKT1cXCdncm91cElkXFwnIGFuZCB0ZXh0KCk9XFwnY29tLmF0bGFzc2lhbi5tYXZlbi5wbHVnaW5zXFwnXScpO1xuICAgICAgICBjb25zdCBub2Rlc1dpdGhBY3RpdmVQcm9maWxlID0gbm9kZXMuZmlsdGVyKG5vZGUgPT4gdGhpcy5pc0FjdGl2YXRlZFByb2ZpbGUobm9kZSkpO1xuICAgICAgICBub2Rlc1dpdGhBY3RpdmVQcm9maWxlLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHBsdWdpbiB9ID0gdGhpcy50b09iamVjdChwYXJlbnROb2RlKTtcbiAgICAgICAgICAgICAgICBpZiAoJ2FtcHMtbWF2ZW4tcGx1Z2luJyA9PT0gcGx1Z2luPy5hcnRpZmFjdElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgY29uZmlndXJhdGlvbiB9ID0gcGx1Z2luIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbj8ucHJvZHVjdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZ3VyYXRpb24/LnByb2R1Y3RzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24ucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXBwb3J0ZWRBcHBsaWNhdGlvbiA9IHRoaXMuZ2V0U3VwcG9ydGVkQXBwbGljYXRpb24ocHJvZHVjdC5pZCkgfHwgdGhpcy5nZXRTdXBwb3J0ZWRBcHBsaWNhdGlvbihwcm9kdWN0Lmluc3RhbmNlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydGVkQXBwbGljYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmRvUHJvcGVydHlSZXBsYWNlbWVudChwcm9kdWN0LnZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0KHN1cHBvcnRlZEFwcGxpY2F0aW9uLCB2ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBwcm9kdWN0IH0gPSBjb25maWd1cmF0aW9uPy5wcm9kdWN0cyB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvZHVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXBwb3J0ZWRBcHBsaWNhdGlvbiA9IHRoaXMuZ2V0U3VwcG9ydGVkQXBwbGljYXRpb24ocHJvZHVjdC5pZCkgfHwgdGhpcy5nZXRTdXBwb3J0ZWRBcHBsaWNhdGlvbihwcm9kdWN0Lmluc3RhbmNlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydGVkQXBwbGljYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmRvUHJvcGVydHlSZXBsYWNlbWVudChwcm9kdWN0LnZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0KHN1cHBvcnRlZEFwcGxpY2F0aW9uLCB2ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VwcG9ydGVkQXBwbGljYXRpb24gPSB0aGlzLmdldFN1cHBvcnRlZEFwcGxpY2F0aW9uKHBsdWdpbj8uYXJ0aWZhY3RJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmdldFZlcnNpb24obm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0ZWRBcHBsaWNhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChzdXBwb3J0ZWRBcHBsaWNhdGlvbiwgdmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzXG4gICAgZ2V0U3VwcG9ydGVkQXBwbGljYXRpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlPy5pbmNsdWRlcyhTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmppcmEpKSB7XG4gICAgICAgICAgICByZXR1cm4gU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5qaXJhO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlPy5pbmNsdWRlcyhTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmNvbmZsdWVuY2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5jb25mbHVlbmNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlPy5pbmNsdWRlcyhTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmJhbWJvbykpIHtcbiAgICAgICAgICAgIHJldHVybiBTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmJhbWJvbztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZT8uaW5jbHVkZXMoU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5iaXRidWNrZXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5iaXRidWNrZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGdldFZlcnNpb24obm9kZSkge1xuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgY29uc3QgeyBwbHVnaW4gfSA9IHRoaXMudG9PYmplY3QocGFyZW50Tm9kZSk7XG4gICAgICAgICAgICBjb25zdCB7IGNvbmZpZ3VyYXRpb24gfSA9IHBsdWdpbiB8fCB7fTtcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uPy5wcm9kdWN0VmVyc2lvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRvUHJvcGVydHlSZXBsYWNlbWVudChwbHVnaW4uY29uZmlndXJhdGlvbi5wcm9kdWN0VmVyc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb25maWd1cmF0aW9uPy5wcm9kdWN0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2R1Y3QgPSBBcnJheS5pc0FycmF5KGNvbmZpZ3VyYXRpb24/LnByb2R1Y3RzKSA/IGNvbmZpZ3VyYXRpb24/LnByb2R1Y3RzWzBdIDogY29uZmlndXJhdGlvbi5wcm9kdWN0cy5wcm9kdWN0O1xuICAgICAgICAgICAgICAgIGlmIChwcm9kdWN0ICYmIHByb2R1Y3QudmVyc2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1Byb3BlcnR5UmVwbGFjZW1lbnQocHJvZHVjdC52ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZG9Qcm9wZXJ0eVJlcGxhY2VtZW50KHZhbHVlKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBwcm9maWxlLCByZXBsYWNlIHByb2ZpbGUgcHJvcGVydGllcyBmaXJzdCBhcyB0aGV5IHRha2UgcHJlY2VkZW5jZVxuICAgICAgICBjb25zdCBwcm9maWxlUHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcygpO1xuICAgICAgICBPYmplY3QuZW50cmllcyhwcm9maWxlUHJvcGVydGllcykuZm9yRWFjaCgoW3Byb3BlcnR5S2V5LCBwcm9wZXJ0eVZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VBbGwoYCRcXHske3Byb3BlcnR5S2V5fX1gLCBwcm9wZXJ0eVZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLmdldFByb3BlcnRpZXMoKTtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocHJvcGVydGllcykuZm9yRWFjaCgoW3Byb3BlcnR5S2V5LCBwcm9wZXJ0eVZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VBbGwoYCRcXHske3Byb3BlcnR5S2V5fX1gLCBwcm9wZXJ0eVZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGdldFByb3BlcnRpZXMoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICBjb25zdCBub2RlcyA9IHRoaXMuZ2V0Tm9kZXMoJy8vKltsb2NhbC1uYW1lKCk9XFwncHJvcGVydGllc1xcJ10nKTtcbiAgICAgICAgY29uc3Qgbm9kZXNXaXRoQWN0aXZlUHJvZmlsZSA9IG5vZGVzLmZpbHRlcihub2RlID0+IHRoaXMuaXNBY3RpdmF0ZWRQcm9maWxlKG5vZGUpKTtcbiAgICAgICAgbm9kZXNXaXRoQWN0aXZlUHJvZmlsZS5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBwcm9wZXJ0aWVzIH0gPSB0aGlzLnRvT2JqZWN0KG5vZGUpO1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocHJvcGVydGllcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiByZXN1bHRba2V5XSA9IHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGdldE5vZGVzKGV4cHJlc3Npb24sIHNpbmdsZSkge1xuICAgICAgICBjb25zdCBwb21GaWxlUGF0aCA9IGpvaW4odGhpcy5vcHRpb25zPy5jd2QgfHwgY3dkKCksICcuL3BvbS54bWwnKTtcbiAgICAgICAgY29uc3QgaGFzUG9tRmlsZSA9IGV4aXN0c1N5bmMocG9tRmlsZVBhdGgpO1xuICAgICAgICBpZiAoaGFzUG9tRmlsZSkge1xuICAgICAgICAgICAgY29uc3QgeG1sID0gcmVhZEZpbGVTeW5jKHBvbUZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICAgICAgY29uc3QgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh4bWwsICd0ZXh0L3htbCcpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBzaW5nbGUgPyB4cGF0aC5zZWxlY3QoZXhwcmVzc2lvbiwgZG9jLCB0cnVlKSA6IHhwYXRoLnNlbGVjdChleHByZXNzaW9uLCBkb2MsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGVzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpbmdsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHRvT2JqZWN0KG5vZGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBYTUxQYXJzZXIoKTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZXIucGFyc2UobmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhub2RlKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmluZFBhcmVudE5vZGVCeVRhZ05hbWUodGFnTmFtZSwgbm9kZSkge1xuICAgICAgICBjb25zdCB7IHBhcmVudE5vZGUgfSA9IG5vZGU7XG4gICAgICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50Tm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRQYXJlbnROb2RlQnlUYWdOYW1lKHRhZ05hbWUsIHBhcmVudE5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpc0FjdGl2YXRlZFByb2ZpbGUobm9kZSkge1xuICAgICAgICBjb25zdCBwcm9maWxlUGFyZW50Tm9kZSA9IHRoaXMuZmluZFBhcmVudE5vZGVCeVRhZ05hbWUoJ3Byb2ZpbGUnLCBub2RlKTtcbiAgICAgICAgY29uc3QgcHJvZmlsZU5vZGUgPSBwcm9maWxlUGFyZW50Tm9kZSA/IHRoaXMudG9PYmplY3QocHJvZmlsZVBhcmVudE5vZGUpIDogbnVsbDtcbiAgICAgICAgaWYgKCFwcm9maWxlTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHJvZmlsZU5vZGUgJiYgKHByb2ZpbGVOb2RlLmFjdGl2ZUJ5RGVmYXVsdCA9PT0gJ3RydWUnIHx8IHRoaXMub3B0aW9ucy5wcm9maWxlcy5pbmNsdWRlcyhwcm9maWxlTm9kZS5wcm9maWxlLmlkKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IGlzUmVjdXJzaXZlQnVpbGQgPSAobGFzdEJ1aWxkQ29tcGxldGVkKSA9PiBsYXN0QnVpbGRDb21wbGV0ZWQgPiAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSA1ICogMTAwMCk7XG4iLCJleHBvcnQgY29uc3Qgc2hvd1JlY3Vyc2l2ZUJ1aWxkV2FybmluZyA9IChvdXRwdXREaXJlY3RvcnkpID0+IHtcbiAgICBjb25zb2xlLmxvZyhgXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJlY3Vyc2l2ZSBidWlsZCB0cmlnZ2VyIGRldGVjdGVkLiBUaGUgbGFzdCBidWlsZCBjb21wbGV0ZWQgbGFzdCB0aGFuIDUgc2Vjb25kcyBhZ29cblRoaXMgbWF5IGluZGljYXRlIHRoYXQgdGhlIGJ1aWxkIGNoYW5nZXMgZmlsZXMgb3V0c2lkZSBvZiB0aGUgb3V0cHV0IGRpcmVjdG9yeVxuQWx0ZXJuYXRpdmVseSwgTWF2ZW4gaXMgdXNpbmcgYSBkaWZmZXJlbnQgb3V0cHV0IGRpcmVjdG9yeSB0aGFuIGNvbmZpZ3VyZWQ6XG4nJHtvdXRwdXREaXJlY3Rvcnl9J1xuXG5QbGVhc2UgbWFrZSBzdXJlIHRvIGNoZWNrIHlvdXIgYnVpbGQgcHJvY2VzcyBhbmQvb3Igc3BlY2lmeSBhIGRpZmZlcmVudCBvdXRwdXQgZGlyZWN0b3J5IHVzaW5nIHRoZSAnLW8nIG9wdGlvblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09YCk7XG59O1xuIiwiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IGN3ZCB9IGZyb20gJ3Byb2Nlc3MnO1xuZXhwb3J0IGNsYXNzIEN1c3RvbUJ1aWxkZXIge1xuICAgIG9wdGlvbnM7XG4gICAgcHJvYyA9IG51bGw7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHNcbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9jKSB7XG4gICAgICAgICAgICBjb25zdCBraWxsZWQgPSB0aGlzLnByb2Mua2lsbCgwKTtcbiAgICAgICAgICAgIGlmICgha2lsbGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gdGVybWluYXRlIGV4aXN0aW5nIGJ1aWxkIHByb2Nlc3MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBidWlsZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb2MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBraWxsZWQgPSB0aGlzLnByb2Mua2lsbCgwKTtcbiAgICAgICAgICAgICAgICBpZiAoIWtpbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gdGVybWluYXRlIGV4aXN0aW5nIGJ1aWxkIHByb2Nlc3MnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBleGVjU3luYyh0aGlzLm9wdGlvbnMuY21kLCB7IGN3ZDogdGhpcy5vcHRpb25zPy5jd2QgfHwgY3dkKCksIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgc3RhdHVzIH0gPSBlcnI7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQnVpbGQgZXhpdGVkIHdpdGggY29kZSAke3N0YXR1c31gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgRG9ja2Vyb2RlIGZyb20gJ2RvY2tlcm9kZSc7XG5pbXBvcnQgeyBjd2QgfSBmcm9tICdwcm9jZXNzJztcbmNvbnN0IGRvY2tlciA9IG5ldyBEb2NrZXJvZGUoKTtcbmV4cG9ydCBjb25zdCBnZXRSdW5uaW5nQ29udGFpbmVySWRzID0gYXN5bmMgKGFwcGxpY2F0aW9uKSA9PiB7XG4gICAgY29uc3QgY29udGFpbmVycyA9IGF3YWl0IGRvY2tlci5saXN0Q29udGFpbmVycyh7IGZpbHRlcnM6IHtcbiAgICAgICAgICAgIHN0YXR1czogWydydW5uaW5nJ10sXG4gICAgICAgICAgICBsYWJlbDogW2Bjb20uZG9ja2VyLmNvbXBvc2Uuc2VydmljZT0ke2FwcGxpY2F0aW9ufWBdXG4gICAgICAgIH0gfSk7XG4gICAgcmV0dXJuIGNvbnRhaW5lcnMubWFwKGl0ZW0gPT4gaXRlbS5JZCk7XG59O1xuZXhwb3J0IGNvbnN0IGNvcHkgPSBhc3luYyAoc291cmNlUGF0aCwgZGVzdGluYXRpb25QYXRoKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgZG9ja2VyID0gc3Bhd24oJ2RvY2tlcicsIFsnY3AnLCBzb3VyY2VQYXRoLCBkZXN0aW5hdGlvblBhdGhdLCB7IGN3ZDogY3dkKCksIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgICAgIGRvY2tlci5vbignZXJyb3InLCByZWplY3QpO1xuICAgICAgICBkb2NrZXIub24oJ2V4aXQnLCAoY29kZSkgPT4gKGNvZGUgPT09IDApID8gcmVzb2x2ZSgpIDogcmVqZWN0KG5ldyBFcnJvcihgRG9ja2VyIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKSk7XG4gICAgfSk7XG59O1xuIiwiaW1wb3J0IHsgcmVzb2x2ZSBhcyByZXNvbHZlUGF0aCB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgY3dkIH0gZnJvbSAncHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBEb2NrZXIgZnJvbSAnLi9kb2NrZXInO1xuaW1wb3J0IHsgdXBsb2FkVG9VUE0gfSBmcm9tICcuL3VwbSc7XG5leHBvcnQgY29uc3QgSW5zdGFsbGVyID0gYXN5bmMgKG5hbWUsIHBhdGgsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBjb250YWluZXJJZHMgPSBhd2FpdCBEb2NrZXIuZ2V0UnVubmluZ0NvbnRhaW5lcklkcyhuYW1lKTtcbiAgICBpZiAoIWNvbnRhaW5lcklkcyB8fCBjb250YWluZXJJZHMubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coYFRoZXJlIGFyZSBubyBydW5uaW5nIGluc3RhbmNlIG9mICR7bmFtZX0sIHVuYWJsZSB0byBpbnN0YWxsIHBsdWdpbiDwn6SUYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29udGFpbmVySWRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFRoZXJlIGFyZSBtdWx0cGxlIHJ1bm5pbmcgaW5zdGFuY2Ugb2YgJHtuYW1lfSwgdW5hYmxlIHRvIGRldGVybWluZSB3aGljaCBvbmUgdG8gdXNlIPCfpJRgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb250YWluZXJJZCA9IGNvbnRhaW5lcklkc1swXTtcbiAgICBpZiAoY29udGFpbmVySWQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMub2JyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRm91bmQgdXBkYXRlZCBwbHVnaW4sIHVwbG9hZGluZyBpdCB0byBVUE0gb24gcnVubmluZyBpbnN0YW5jZXMgb2YgJHtuYW1lfWApO1xuICAgICAgICAgICAgY29uc3QgaG9zdFVybCA9IG9wdGlvbnMucG9ydCA/IGBsb2NhbGhvc3Q6JHtvcHRpb25zLnBvcnR9YCA6IGBsb2NhbGhvc3RgO1xuICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9IG9wdGlvbnMudXNlcm5hbWUgJiYgb3B0aW9ucy5wYXNzd29yZCA/IGBodHRwOi8vJHtvcHRpb25zLnVzZXJuYW1lfToke29wdGlvbnMucGFzc3dvcmR9QCR7aG9zdFVybH1gIDogYGh0dHA6Ly8ke2hvc3RVcmx9YDtcbiAgICAgICAgICAgIGF3YWl0IHVwbG9hZFRvVVBNKHJlc29sdmVQYXRoKG9wdGlvbnMuY3dkIHx8IGN3ZCgpLCBwYXRoKSwgYmFzZVVybCkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIHRvIHVwbG9hZCBwbHVnaW4gYXJjaGl2ZSBmaWxlIHRvIFVQTScsIGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGb3VuZCB1cGRhdGVkIHBsdWdpbiwgdXBsb2FkaW5nIGl0IHRvIFF1aWNrUmVsb2FkIG9uIHJ1bm5pbmcgaW5zdGFuY2VzIG9mICR7bmFtZX1gKTtcbiAgICAgICAgICAgIGF3YWl0IERvY2tlci5jb3B5KHJlc29sdmVQYXRoKG9wdGlvbnMuY3dkIHx8IGN3ZCgpLCBwYXRoKSwgYCR7Y29udGFpbmVySWR9Oi9vcHQvcXVpY2tyZWxvYWQvYClcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiBjb25zb2xlLmxvZygnRmluaXNoZWQgdXBsb2FkaW5nIHBsdWdpbiBhcmNoaXZlIHRvIFF1aWNrUmVsb2FkJykpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiBjb25zb2xlLmxvZygnRmFpbGVkIHRvIHVwbG9hZCBwbHVnaW4gYXJjaGl2ZSBmaWxlIHRvIFF1aWNrUmVsb2FkJywgZXJyKSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuIiwiaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICdjaG9raWRhcic7XG5pbXBvcnQgeyBjd2QgfSBmcm9tICdwcm9jZXNzJztcbmltcG9ydCB7IGlzUmVjdXJzaXZlQnVpbGQgfSBmcm9tICcuLi9oZWxwZXJzL2lzUmVjdXJzaXZlQnVpbGQnO1xuaW1wb3J0IHsgc2hvd1JlY3Vyc2l2ZUJ1aWxkV2FybmluZyB9IGZyb20gJy4uL2hlbHBlcnMvc2hvd1JlY3Vyc2l2ZUJ1aWxkV2FybmluZyc7XG5pbXBvcnQgeyBBTVBTIH0gZnJvbSAnLi9hbXBzJztcbmltcG9ydCB7IEN1c3RvbUJ1aWxkZXIgfSBmcm9tICcuL0N1c3RvbUJ1aWxkZXInO1xuaW1wb3J0IHsgSW5zdGFsbGVyIH0gZnJvbSAnLi9JbnN0YWxsZXInO1xuZXhwb3J0IGNvbnN0IEZpbGVXYXRjaGVyID0gKG5hbWUsIG9wdGlvbnMsIG1hdmVuT3B0cywgaW5zdGFsbE9ubHkgPSBmYWxzZSkgPT4ge1xuICAgIGxldCBsYXN0QnVpbGRDb21wbGV0ZWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICBjb25zdCBvdXRwdXREaXJlY3RvcnkgPSBvcHRpb25zLm91dHB1dERpcmVjdG9yeSB8fCAndGFyZ2V0JztcbiAgICBjb25zdCBwYXR0ZXJucyA9IG9wdGlvbnMuZXh0IHx8IFsnKiovKiddO1xuICAgIGNvbnNvbGUubG9nKGBXYXRjaGluZyBmaWxlc3lzdGVtIGZvciBjaGFuZ2VzIHRvIHNvdXJjZSBmaWxlcyAoJHtwYXR0ZXJucy5qb2luKCcsICcpfSlgKTtcbiAgICBjb25zdCBhbXBzID0gbmV3IEFNUFMoe1xuICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgICBwcm9maWxlczogb3B0aW9ucy5hY3RpdmF0ZVByb2ZpbGVzPy5zcGxpdCgnLCcpIHx8IFtdXG4gICAgfSk7XG4gICAgY29uc3QgZGVsaXZlcmFibGVFeHRlbnNpb24gPSBvcHRpb25zLm9iciA/ICcub2JyJyA6ICcuamFyJztcbiAgICByZXR1cm4gd2F0Y2gocGF0dGVybnMsIHtcbiAgICAgICAgY3dkOiBvcHRpb25zLmN3ZCB8fCBjd2QoKSxcbiAgICAgICAgdXNlUG9sbGluZzogdHJ1ZSxcbiAgICAgICAgaW50ZXJ2YWw6IDIgKiAxMDAwLFxuICAgICAgICBiaW5hcnlJbnRlcnZhbDogMiAqIDEwMDAsXG4gICAgICAgIGF3YWl0V3JpdGVGaW5pc2g6IHRydWUsXG4gICAgICAgIHBlcnNpc3RlbnQ6IHRydWUsXG4gICAgICAgIGF0b21pYzogdHJ1ZVxuICAgIH0pLm9uKCdjaGFuZ2UnLCBhc3luYyAocGF0aCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucy5pbnN0YWxsICYmIHBhdGguc3RhcnRzV2l0aChvdXRwdXREaXJlY3RvcnkpICYmIHBhdGgudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChkZWxpdmVyYWJsZUV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIGF3YWl0IEluc3RhbGxlcihuYW1lLCBwYXRoLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghcGF0aC5zdGFydHNXaXRoKG91dHB1dERpcmVjdG9yeSkgJiYgIWluc3RhbGxPbmx5KSB7XG4gICAgICAgICAgICBpZiAoaXNSZWN1cnNpdmVCdWlsZChsYXN0QnVpbGRDb21wbGV0ZWQpKSB7XG4gICAgICAgICAgICAgICAgc2hvd1JlY3Vyc2l2ZUJ1aWxkV2FybmluZyhvdXRwdXREaXJlY3RvcnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0RldGVjdGVkIGZpbGUgY2hhbmdlLCByZWJ1aWxkaW5nIEF0bGFzaWFuIERhdGEgQ2VudGVyIHBsdWdpbicpO1xuICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5leGVjKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFtcHMuYnVpbGQobWF2ZW5PcHRzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGaW5pc2hlZCBidWlsZGluZyBBdGxhc3NpYW4gRGF0YSBDZW50ZXIgcGx1Z2luIGZvciAke25hbWV9Li4uIPCfkqpgKTtcbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEZhaWxlZCB0byBidWlsZCBBdGxhc3NpYW4gRGF0YSBDZW50ZXIgcGx1Z2luIGZvciAke25hbWV9Li4uIPCfmLBgKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IEN1c3RvbUJ1aWxkZXIoeyBjbWQ6IG9wdGlvbnMuZXhlYywgY3dkOiBvcHRpb25zLmN3ZCB8fCBjd2QoKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEZpbmlzaGVkIGJ1aWxkaW5nIEF0bGFzc2lhbiBEYXRhIENlbnRlciBwbHVnaW4gZm9yICR7bmFtZX0uLi4g8J+SqmApO1xuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIGJ1aWxkIEF0bGFzc2lhbiBEYXRhIENlbnRlciBwbHVnaW4gZm9yICR7bmFtZX0uLi4g8J+YsGApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGFzdEJ1aWxkQ29tcGxldGVkID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG4iLCJpbXBvcnQgeyByZWFscGF0aFN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSAncGF0aCc7XG5leHBvcnQgY29uc3QgdG9BYnNvbHV0ZVBhdGggPSAocmVsYXRpdmVQYXRoKSA9PiB7XG4gICAgY29uc3QgWywgZmlsZVBhdGhdID0gcHJvY2Vzcy5hcmd2O1xuICAgIGNvbnN0IGV4ZWN1dGFibGVGaWxlRGlyID0gZGlybmFtZShyZWFscGF0aFN5bmMoZmlsZVBhdGgpKTtcbiAgICBjb25zdCBiYXNlZGlyID0gZXhlY3V0YWJsZUZpbGVEaXIuc3Vic3RyaW5nKDAsIGV4ZWN1dGFibGVGaWxlRGlyLmluZGV4T2YoJ2RjZHgnKSArIDQpO1xuICAgIHJldHVybiBqb2luKGJhc2VkaXIsIHJlbGF0aXZlUGF0aC5yZXBsYWNlQWxsKCcuLi8nLCAnJykpO1xufTtcbiIsImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IHRvQWJzb2x1dGVQYXRoIH0gZnJvbSAnLi90b0Fic29sdXRlUGF0aCc7XG5leHBvcnQgY29uc3QgZ2V0VmVyc2lvbnMgPSAoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyh0b0Fic29sdXRlUGF0aCgnLi4vLi4vYXNzZXRzL3ZlcnNpb25zLmpzb24nKSwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgdmVyc2lvbnMgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgIHJldHVybiB2ZXJzaW9ucztcbn07XG4iLCIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgeyBDb21tYW5kIGFzIENvbW1hbmRlciwgSW52YWxpZE9wdGlvbkFyZ3VtZW50RXJyb3IsIE9wdGlvbiB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBncmFjZWZ1bEV4aXQgfSBmcm9tICdleGl0LWhvb2snO1xuaW1wb3J0IHsgZ2xvYiB9IGZyb20gJ2dsb2InO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgY3dkIH0gZnJvbSAncHJvY2Vzcyc7XG5pbXBvcnQgeyBpbnN0YWxsQXBwIH0gZnJvbSAnLi4vYXB0L2hlbHBlcnMvaW5zdGFsbEFwcCc7XG5pbXBvcnQgeyBBY3Rpb25IYW5kbGVyIH0gZnJvbSAnLi4vaGVscGVycy9BY3Rpb25IYW5kbGVyJztcbmltcG9ydCB7IEFNUFMgfSBmcm9tICcuLi9oZWxwZXJzL2FtcHMnO1xuaW1wb3J0IHsgRmlsZVdhdGNoZXIgfSBmcm9tICcuLi9oZWxwZXJzL0ZpbGVXYXRjaGVyJztcbmltcG9ydCB7IGdldFZlcnNpb25zIH0gZnJvbSAnLi4vaGVscGVycy9nZXRWZXJzaW9ucyc7XG5pbXBvcnQgeyBJbnN0YWxsZXIgfSBmcm9tICcuLi9oZWxwZXJzL0luc3RhbGxlcic7XG5jb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmRlcigpO1xuY29uc3QgdmVyc2lvbnMgPSBnZXRWZXJzaW9ucygpO1xuY29uc3QgQ29tbWFuZCA9ICgpID0+IHtcbiAgICBsZXQgcXVpY2tSZWxvYWQgPSBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFjdGlvbjogYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFtcHMgPSBuZXcgQU1QUyh7XG4gICAgICAgICAgICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICAgICAgICAgICAgICBwcm9maWxlczogb3B0aW9ucy5hY3RpdmF0ZVByb2ZpbGVzPy5zcGxpdCgnLCcpIHx8IFtdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLm1wYWMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuYmFzZVVybCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wdGlvbkFyZ3VtZW50RXJyb3IoJ01pc3NpbmcgYXJndW1lbnQgXCItLWJhc2VVcmxcIiwgcmVxdWlyZWQgZm9yIGluc3RhbGxpbmcgZnJvbSB0aGUgQXRsYXNzaWFuIE1hcmtldHBsYWNlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFvcHRpb25zLmFwcEtleSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wdGlvbkFyZ3VtZW50RXJyb3IoJ01pc3NpbmcgYXJndW1lbnQgXCItLWFwcEtleVwiLCByZXF1aXJlZCBmb3IgaW5zdGFsbGluZyBmcm9tIHRoZSBBdGxhc3NpYW4gTWFya2V0cGxhY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgaW5zdGFsbEFwcChvcHRpb25zLmJhc2VVcmwsIG9wdGlvbnMuYXBwS2V5LCB1bmRlZmluZWQsIG9wdGlvbnMudXNlcm5hbWUsIG9wdGlvbnMucGFzc3dvcmQsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhbXBzLmlzQXRsYXNzaWFuUGx1Z2luKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBhbiBBdGxhc3NpYW4gUGx1Z2luIHByb2plY3QgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IPCfpJQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGFtcHMuZ2V0QXBwbGljYXRpb24oKTtcbiAgICAgICAgICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgQXRsYXNzaWFuIFBsdWdpbiBwcm9qZWN0IGRvZXMgbm90IGNvbnRhaW4gYW4gQU1QUyBjb25maWd1cmF0aW9uLCB1bmFibGUgdG8gZGV0ZWN0IHByb2R1Y3Qg8J+YsCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gYW1wcy5nZXRBcHBsaWNhdGlvblZlcnNpb24oKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZGV0ZXJtaW5lIHZlcnNpb24gZnJvbSBBTVBTIGFuZCBubyBwcm9kdWN0IHZlcnNpb24gcHJvdmlkZWQgKC0tdGFnKScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghdmVyc2lvbnNbbmFtZV0uaW5jbHVkZXModmVyc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9kdWN0IHZlcnNpb24gJyR7dmVyc2lvbn0nIGlzIGludmFsaWQuIEFsbG93ZWQgY2hvaWNlcyBhcmUgJHt2ZXJzaW9uc1tuYW1lXS5qb2luKCcsICcpfS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMub2JyICYmICFvcHRpb25zLnVzZXJuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3B0aW9uQXJndW1lbnRFcnJvcignTWlzc2luZyBhcmd1bWVudCBcIi0tdXNlcm5hbWVcIiwgcmVxdWlyZWQgZm9yIGluc3RhbGxpbmcgT0JSIGFydGlmYWN0cycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLm9iciAmJiAhb3B0aW9ucy5wYXNzd29yZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wdGlvbkFyZ3VtZW50RXJyb3IoJ01pc3NpbmcgYXJndW1lbnQgXCItLXBhc3N3b3JkXCIsIHJlcXVpcmVkIGZvciBpbnN0YWxsaW5nIE9CUiBhcnRpZmFjdHMnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMud2F0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcXVpY2tSZWxvYWQgPSBGaWxlV2F0Y2hlcihuYW1lLCBvcHRpb25zLCBbXSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dERpcmVjdG9yeSA9IG9wdGlvbnMub3V0cHV0RGlyZWN0b3J5IHx8ICd0YXJnZXQnO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbGl2ZXJhYmxlRXh0ZW5zaW9uID0gb3B0aW9ucy5vYnIgPyAnb2JyJyA6ICdqYXInO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZ2xvYihgJHtvdXRwdXREaXJlY3Rvcnl9LyouJHtkZWxpdmVyYWJsZUV4dGVuc2lvbn1gLCB7IGN3ZDogcmVzb2x2ZShvcHRpb25zLmN3ZCB8fCBjd2QoKSkgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoZmlsZXMubWFwKHBhdGggPT4gSW5zdGFsbGVyKG5hbWUsIHBhdGgsIG9wdGlvbnMpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9ySGFuZGxlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHF1aWNrUmVsb2FkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFN0b3BwaW5nIGZpbGVzeXN0ZW0gd2F0Y2hlci4uLiDij7NgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBxdWlja1JlbG9hZC5jbG9zZSgpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coYFN1Y2Nlc3NmdWxseSBzdG9wcGVkIGFsbCBydW5uaW5nIHByb2Nlc3NlcyDwn5KqYCk7XG4gICAgICAgIH1cbiAgICB9O1xufTtcbnByb2dyYW1cbiAgICAubmFtZSgnZGNkeCBpbnN0YWxsJylcbiAgICAuZGVzY3JpcHRpb24oYEluc3RhbGwgdGhlIEF0bGFzc2lhbiBEYXRhIENlbnRlciBwbHVnaW4gdXNpbmcgdGhlIEF0bGFzc2lhbiBNYXZlbiBQbHVnaW4gU3VpdGUgKEFNUFMpIGNvbmZpZ3VyYXRpb24uXG5JZiB0aGVyZSBpcyBhIHJ1bm5pbmcgaW5zdGFuY2UsIGl0IHdpbGwgdHJ5IHRvIGluc3RhbGwgdGhlIHBsdWdpbiB1c2luZyBRdWlja1JlbG9hZCBvciB0aGUgVVBNIChmb3IgT0JSKS5gKVxuICAgIC5zaG93SGVscEFmdGVyRXJyb3IodHJ1ZSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy13LCAtLXdhdGNoJywgJ1dhdGNoIGZvciBmaWxlc3lzdGVtIGNoYW5nZXMgdG8gSkFSIG9yIE9CUiBmaWxlcyBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeScpLmRlZmF1bHQoZmFsc2UpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLW8sIC0tb3V0cHV0RGlyZWN0b3J5IDxkaXJlY3Rvcnk+JywgJ091dHB1dCBkaXJlY3Rvcnkgd2hlcmUgdG8gbG9vayBmb3IgZ2VuZXJhdGVkIEpBUiBvciBPQlIgZmlsZXMgKGRlZmF1bHRzIHRvIGB0YXJnZXRgKScpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLVAsIC0tYWN0aXZhdGUtcHJvZmlsZXMgPGFyZz4nLCAnQ29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgcHJvZmlsZXMgdG8gYWN0aXZhdGUnKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tb2JyJywgJ1VwbG9hZCBnZW5lcmF0ZWQgT0JSIGZpbGUgaW5zdGVhZCBvZiBKQVIgZmlsZSB3aGVuIGluc3RhbGxpbmcgdGhlIGFwcCcpLmRlZmF1bHQoZmFsc2UpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS11c2VybmFtZSA8dXNlcm5hbWU+JywgJ1RoZSB1c2VybmFtZSBvZiB0aGUgYWRtaW5pc3RyYXRvciAocmVxdWlyZWQgd2l0aCAtLW9iciwgb3B0aW9uYWwgZm9yIC0tbXBhYyknKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tcGFzc3dvcmQgPHBhc3N3b3JkPicsICdUaGUgcGFzc3dvcmQgb2YgdGhlIGFkbWluaXN0cmF0b3IgKHJlcXVpcmVkIHdpdGggLS1vYnIsIG9wdGlvbmFsIGZvciAtLW1wYWMpJykpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLW1wYWMnLCAnSW5zdGFsbCB0aGUgYXBwIGZyb20gdGhlIEF0bGFzc2lhbiBNYXJrZXRwbGFjZScpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1iYXNlVXJsIDx1cmw+JywgJ1VSTCBvZiB0aGUgaW5zdGFuY2UgKHJlcXVpcmVkIHdpdGggLS1tcGFjKScpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1hcHBLZXkgPGtleT4nLCAnVGhlIGtleSBvZiB0aGUgYXBwIHRvIGJlIGluc3RhbGxlZCAocmVxdWlyZWQgd2l0aCAtLW1wYWMpJykpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLWN3ZCA8ZGlyZWN0b3J5PicsICdTcGVjaWZ5IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVyZSB0byBmaW5kIHRoZSBBTVBTIGNvbmZpZ3VyYXRpb24nKSlcbiAgICAuYWN0aW9uKG9wdGlvbnMgPT4gQWN0aW9uSGFuZGxlcihwcm9ncmFtLCBDb21tYW5kKCksIHsgLi4ub3B0aW9ucywgaW5zdGFsbDogdHJ1ZSB9KSk7XG5wcm9ncmFtLnBhcnNlQXN5bmMocHJvY2Vzcy5hcmd2KS5jYXRjaCgoKSA9PiBncmFjZWZ1bEV4aXQoMSkpO1xucHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGBSZWNlaXZlZCB0ZXJtIHNpZ25hbCwgdHJ5aW5nIHRvIHN0b3AgZ3JhY2VmdWxseSDwn5KqYCk7XG4gICAgZ3JhY2VmdWxFeGl0KDEpO1xufSk7XG4iXSwibmFtZXMiOlsicGFzc3dvcmQiLCJwYXNzd29yZFByb21wdCIsInZlcnNpb25zIiwiRG9ja2VyLmdldFJ1bm5pbmdDb250YWluZXJJZHMiLCJyZXNvbHZlUGF0aCIsIkRvY2tlci5jb3B5IiwiQ29tbWFuZGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNTyxNQUFNLFFBQVEsR0FBRywyYUFBMmE7O0FDSDViLE1BQU0sV0FBVyxHQUFHLE9BQU8sT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sR0FBRyxJQUFJLEtBQUs7QUFDeEYsSUFBSSxNQUFNLFdBQVcsR0FBRyxRQUFR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QUM1QixTQUFTO0FBQ1QsS0FBSyxDQUFDLENBQUM7QUFDUCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hETSxNQUFN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
10202
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vZGlzdC9zcmMvaGVscGVycy9saWNlbmNlcy5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2hlbHBlcnMvY2FwaXRhbGl6ZS5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2FwdC9tZXNzYWdlcy5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2FwdC9oZWxwZXJzL2dldEFwcExpY2Vuc2UuanMiLCIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL3VwbS5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2FwdC9oZWxwZXJzL2dldEFwdERpcmVjdG9yeS5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2FwdC9oZWxwZXJzL2dldEFXU0NyZWRlbnRpYWxzLmpzIiwiLi4vLi4vZGlzdC9zcmMvYXB0L2hlbHBlcnMvZ2V0RW52aXJvbm1lbnROYW1lLmpzIiwiLi4vLi4vZGlzdC9zcmMvYXB0L2hlbHBlcnMvZ2V0UHJvZHVjdC5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2FwdC9oZWxwZXJzL2RjYXB0LmpzIiwiLi4vLi4vZGlzdC9zcmMvYXB0L2hlbHBlcnMvcGVyc2lzdHNBV1NDcmVkZW50aWFscy5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2FwdC9oZWxwZXJzL3dhaXRGb3JVc2VySW5wdXQuanMiLCIuLi8uLi9kaXN0L3NyYy9hcHQvaGVscGVycy9yZXN0YXJ0Q2x1c3Rlci5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2FwdC9oZWxwZXJzL2luc3RhbGxBcHAuanMiLCIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL0FjdGlvbkhhbmRsZXIuanMiLCIuLi8uLi9kaXN0L3NyYy90eXBlcy9EYXRhYmFzZS5qcyIsIi4uLy4uL2Rpc3Qvc3JjL3R5cGVzL0FwcGxpY2F0aW9uLmpzIiwiLi4vLi4vZGlzdC9zcmMvaGVscGVycy9hbXBzLmpzIiwiLi4vLi4vZGlzdC9zcmMvaGVscGVycy9pc1JlY3Vyc2l2ZUJ1aWxkLmpzIiwiLi4vLi4vZGlzdC9zcmMvaGVscGVycy9zaG93UmVjdXJzaXZlQnVpbGRXYXJuaW5nLmpzIiwiLi4vLi4vZGlzdC9zcmMvaGVscGVycy9DdXN0b21CdWlsZGVyLmpzIiwiLi4vLi4vZGlzdC9zcmMvaGVscGVycy9kb2NrZXIuanMiLCIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL0luc3RhbGxlci5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2hlbHBlcnMvRmlsZVdhdGNoZXIuanMiLCIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL3RvQWJzb2x1dGVQYXRoLmpzIiwiLi4vLi4vZGlzdC9zcmMvaGVscGVycy9nZXRWZXJzaW9ucy5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2NvbW1hbmRzL2luc3RhbGwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHRpbWVib21iID0ge1xuICAgICdqaXJhJzogJ0FBQUNCQTBPREFvUGVOcDlrbDF2MmpBVWh1L3pLNDYwT3lRSFNMdVZJa1VhVGJ3TlZCS1VoRW5idWdzVER1QTJzU1BiZ2JGZlB4T0MxaSs0eUVYTzUrdm5QUit5R2lHU1cvQ3VvWGM3dkJvTXZUNEVOQU92NS9XY3RVSVVHMWxWcU54N25xUFFTSmZjY0NsOEdtVTBtU1hqbERwUlhTNVF4YXU1UnFWOTBuY0NLUXpMVGNSSzlFdTk0NElwL2NRL00xTXdyVGtUYmk1TFoxYXJmTU0waHN5ZzcvWDZBOUx2RTg5ejJqM1p2c0ptUUJCUHB6UUp4cVA3VTRyK3FiamFOMzJ6RysvYmFSMmRNbDZjMzVlaTJxSWFoLzRkdmFIa092enBrVS94NUlaOHZib2RPSTljTWJkU2Nsbm54ajM4RUMxWFpzY1V1bll5MzZKdlZJM094R1ptYlpYZHp3SVU1bFZKV2k5MHJualZRR29pNzBCODczR05oUE9RTzUxT0ZHZmtTNXlRV1JLSDh5QWJ4eEdacDlRbS9FQ2hwYkdFeFI3TUJxR2RBbFRrY29rSzdNTWVNVGZ3YTJOTTlURHNkdGZTZlFHbld4dzdDQjQ3ZnJzUVNoRFN3Skpyby9paU5tZ25jdzFHUWw1ckkwdHJ0ZXRZNHNLZ1lDSi9ZNHFWRlNSMGxOR1EzUDA0YUR4clRLdldPak1YVDBMdXhDVTMzdHhhU2lQZmZ1UmpyM2ZzTy9tQzZvZy9WbXNtdUdZTjBJajkzVEZZY1ZYdW5RYWFEYjQrd0piRmQ3dmcwT0k1SWY1M05FTnRvSzJBbFZRd0dTY2pTRnQ1bHJqZFd5bXU4V0VJZ1N3dHBweXpBc0xneFJrOFA1aEc5UE1BM2JLaVBzcGRzVUxqSlJ3WDd1a2Y1L05YN1RBdEFoVUFoUVNIejlEZ3ljT1g3d2N3RVJNSmIzVExHYjRDRkdrQi94VVdTUkszQlpMclBGOVJuNlptclVxSlgwMm9jJyxcbiAgICAnY29uZmx1ZW5jZSc6ICdBQUFDemcwT0RBb1BlTnA5Vk85djJqQVEvWjYvd3RLK0lZV0dzRUtIRkdtUW1KYXUvR2dJbTlpWUpoTU9ZcHJZa2UxQTRhK2ZTY2hHS3RxUFB2dmV2WHYzenAvNmdxTEhMRWIySGJLc1R2TnpwOWxDOThNQTJaYmROS1lnZGlBR250UERRMno2ODhIY2RIL2FNN1A1bzJrWlR6UUVKaUU0cERBaUNUZ0JuZ2FEMGIwUkNyNWYxUzl1SGZjVVdYU1FCenVJZVFyQ0NEbGIxMG1vNkE0Y0pUTFFTVmxJbHpGVWdncEk4aWNrTWJBVkViSSt5cElsaVBHNlI1SWw1ejRrWEVGM0EweEpwMUd5d2E4cEZRZVBLSEFtRGR0NitBOWNKVlFFSzV5V21oTVY4SEdaTFJXa3dyRjhQWk1ncEdQZkdoN0lVTkJVVWM2Y0FLUkNjVkVZcmJsQWFaeHRLRU9yc3FqOFYvVVM4NXp4WGQrZlVHd0Q3MGlja1J3eWY3QVJBQ3ppcVVZbys4SXJtdC9qVVlEOWlUK1lZbU5JS0ZQQUNBdXZ5SElhUUVVU0hZZ3owRzhyb3JnQzhycDVxdmFFWlZwM3B0MHU4c3ZlM1RpVENzU0lyMEE2bGxHcjFWd2Zkd1BzbWIyNVBqamJWd3EyRWNaY202blM2REtYK0kzaVQxeVAvQ3k0MlRCZTRGQUswV2haVnR1NmF6WWJaZVpsQjBVMndycG5rUW9xcTQwVXlzdDY3UnFCOXpVOGs2NG9sWWVxS25HbU5Deldpc2VPVW9Ld2hMTG9LMUV4a1pJU1ZnOTVjcjNaTi9ZcWR1ZVNZVzY0OS9tZHJmSkFaT1FNM2IzYjk2RFJ1aFZrMzI2MWtrRnZleHdlNDFVUXRKTjEydTVHejZHY1BUN1BuNzFINzB0NjlDUGNieC9hOXJjajNyRHV3bGs0eHByS0NBNVZOK29KanNhQjJSLzc1c1FmZXpNM0dJeEg1bXlLVDZQTi9RRXJ0RHdnRlFFNkU5VkRDTFVadE44RjMwS28wSzlJcVhUUnViblo4SHBGbFp0ekF5WVVHYi9yeU9PSWNZVldWQ3BCbDVrQ2pVd2xVaHlGMm1ZODBXYW9YeGR6RWhPV2UyWXNOb1JSV1d4TXQ2eFgvaEg2UDV1eEY4YjNyTEpJbHoxTHBRVzk1cFFQdnFmTHEwa213b2hJZUxzMmw5UE16ZlE0OEx2dldUYmZNWTFBWERnOUtKRExDVjJDOUhVTUgrQ2FKZk9mdWRpL3Ywa0lHVnN3TEFJVUVNUTlYNzdncUdCZGZIMEhJekJhVjhOYWRQVUNGQm4rUmlVQTREK0lxVlFwVFRvdUxWWTY2YUNHWDAyMTIxJyxcbiAgICAnYml0YnVja2V0JzogJ0FBQUJtZzBPREFvUGVOcDlVbDF2MHpBVWZjK3ZzTVJiSmFkSnRqR3BVaVMySkpST05PbGFCNFNBQjllOVcweFR1N0p2Q3YzM2VJbURPb1I0dmVmZTQvUGhONTloUjViY2tQaVdSTmV6S0o1RkNaa3ZHVW1pSkE0eXJaQUxMUGtCVXJIWG90RW51NWVCUlc2YjhLTVVvQ3l3OHhINkJWWnMyS0tjZTNUSnBVSlFYQWtvZmgybE9lY2NJVjFkZlJoSkM3ZlJYckp1d0p6QUxQTDAvcUYrcEk5WEdhUHordUdHc3B2YmtkUng4QXdjcjBuUmRPQ25sWG5tU2xxT1VxdjBEbHR1cmVUS2c2dk9pSVpiNko5UG92aWFSbTlwSEhzME05Q2YvUnYxRHYvU1A1bE15b3JSOTlXYXJ0WlZYbWRzVVpXMDNoUU9TSHRDRituMlRMQUI0aGxJb1lUZWdTRkhvMytBUVBLMVFUeCttMDJuenpya28rSlE2TU8wSFM0b0RCZmZRNUpyb2pTU25iUm81TFpEY016U0V0UkVkQmIxQVl3TlJ6c1hmZjBKZ2pDd0xqRy80bUI1Z2lFK0p6aGJGM2VzeU9uOWx4ZjFGMjE0NWE2T1d1MlYvcW1DLzJkVmRvY3RtT3FwdGs1UEdpZCtYSng0MnczTlBQSFdRdUQ5ZlhKYkw4UGt0ZkxoVTJBditOMnJZTVk2dVVFRnBuY1kvQVlDZ2ZGQU1Dd0NGSHprQmxrR0gvdlJkVGVlQlNmVU16VURiNFcyQWhReU04OTNXUGcyUThvUUFZUmRCU3lLZVZVZG9nPT1YMDJqcicsXG4gICAgJ2JhbWJvbyc6ICdBQUFCM3cwT0RBb1BlTnA5VWx0cjJ6QVlmZmV2RU93dG9NUjEwcVlMR0piWVdzbm83R0E3ZzkwZVpQbHJvdFdXakNTbnpYNzlGRjhJWVdrZkRQSjNPZWR3enZjaDJ6ZG9XU3ZrenBGN3Y1amRMcndwQ2tpYUljLzFQT2VSTXhBYXNtTU5FYTNBejJ4bkhUMDRnUUpxdUJRaE5lQjc3dlFHdXpQczNqazVyWElweDVRWmZnRGZxQWFHVXRSVU9hajRhZFgrUGtwR3krVU9oTkUrdm5HRzVsYURhZ3M5TDNtdHVUb09KRjVQa2phNVpvclhKd0VYSEcrcEpRZGFOdlMvY1l0TEF5c0JWRmZ1MTllaHZ4WFBRcjRJSndWMUFHVUxLekluZUJiKzhQQmQvR1dPSDZZZjc1MU5vOWllYXVqbGVZTUhLWWw4KytGYjEzVkdvMUVVWi9oem5PQk5Fb2ZiSUZ2SEVkNm14RGI4MWtRb1VINUVaZytvcDBkRU1GbUFRcldTZjRBWjlITnZUUDFyTVpuc3JMR21wRnB6S3NaTVZwT3kyOERRYmZ3ZW8xQWlJUTBxdURhSzU0MEJpOHcxTWhLeFJodFpXWHZIVGdobit6TFFCdlU0NkVsYTFyTFpjWUVLT0VBcGF6dnZmS1hjZWlTb1lHL2tjVFhoVFVsRkcrWFZiZ0tWTkhBK2dGN0JOOHQzVXVVNXNkcFJ3WFVYR25tbFZWMENDbVJWVTNHOEV2ZjVNS1V3OXZxSUZWMzZ0WDdtb05qZm83Q1BUeGZlblpJSkVyTE1TSWhYMzA5cHZEZDhTVWdLM3NtS01wSnNrblZLQnRyMjZ0NEQrZ2QzQUM1cU1Dd0NGSE9hVFdmRnZMQ0xKUGZ0M3FrdFZvM0ZhZm1aQWhSb2piOUlBeGo4S0VxUERReTBzdG9zMzk0U1FRPT1YMDJtcSdcbn07XG5leHBvcnQgY29uc3QgYXBwM2hvdXIgPSAnQUFBQkNBME9EQW9QZU5wZGowMVB3a0FVUmZmekt5WnhaMUl5VXpBUmtsbFEyNGdSYVFNdEduYVA4VkVtdGpQTmZGVDU5eUpWRnl6ZnVia243OTZVeDBCejZTbWJVTTVuYkR6ajk3UklTeG96SHBNVW5iU3E4OHBvVWFMenRGRVN0VU42TUpaMlRhaVZwdS9ZWTJNNnRJNnNRcnRIbXg4cWQ3NEVaK1RCSXZ5VVUvQW9ZczdqaUUwanprbldReE11aWZBMklCbFViblE3QXVsVmp3TjlBYVU5YXRBU3M2OU8yZE5GVTR3WEpMYzFhT1VHdzl3MzRKd0NUVFpvZTdSUHFVZ2VwMlgwVm0wbjBmTnV0NGdTeGwvSmNuajluRmI2UTV0UC9VZXUzTCswUEhXNGdoWkZtbTJ6WlY1azYvOTVDYlI3WTliWUdvL3pHclYzSXI0alJiRHlDQTZ2dDM0RE84cDNTREFzQWhRbkpqTEQ1azlGcjN1YUl6a1hLZjgzbzV2RGRRSVVlNFhlcXVOQ0MzRCs5aHQ5WlloTlpGS21uaGM9WDAyZGgnO1xuIiwiZXhwb3J0IGNvbnN0IGNhcGl0YWxpemUgPSAodmFsdWUpID0+IHZhbHVlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSk7XG4iLCJpbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBjYXBpdGFsaXplIH0gZnJvbSAnLi4vaGVscGVycy9jYXBpdGFsaXplJztcbmltcG9ydCB7IGdldFJ1bkZvclN0YWdlIH0gZnJvbSAnLi9oZWxwZXJzL2dldFJ1bkZvclN0YWdlJztcbmNvbnN0IHRvTnVtYmVyID0gKHN0YWdlKSA9PiB7XG4gICAgc3dpdGNoIChzdGFnZSkge1xuICAgICAgICBjYXNlICdvbmUtbm9kZSc6IHJldHVybiAndGhpcmQnO1xuICAgICAgICBjYXNlICd0d28tbm9kZSc6IHJldHVybiAnZm91cnRoJztcbiAgICAgICAgY2FzZSAnZm91ci1ub2RlJzogcmV0dXJuICdmaWZ0aCc7XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBlbXB0eUxpbmUgPSAoKSA9PiBjb25zb2xlLmxvZygn4oCLJyk7XG5leHBvcnQgY29uc3QgZ2VuZXJpYyA9IHtcbiAgICBoZWFkZXI6IGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgX19fXyAgICAgIF8gICAgICAgICAgX19fX18gICAgICAgICBfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIFxcXFwgX19ffCB8XyBfX18gICB8ICAgICB8X19fIF9fX3wgfF8gX19fIF9fXyAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICB8ICB8ICB8IC4nfCAgX3wgLid8ICB8ICAgLS18IC1ffCAgIHwgIF98IC1ffCAgX3wgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fXy98X18sfF98IHxfXyx8ICB8X19fX198X19ffF98X3xffCB8X19ffF98ICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgX19fX18gICAgICAgICAgICBfX19fXyAgICAgICAgIF9fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fXyAgICAgICAgIF8gXyAgIF8gXyAgIFxuICB8ICBfICB8X19fIF9fXyAgIHwgIF8gIHxfX18gX19ffCAgX3xfX18gX19fIF9fX19fIF9fXyBfX18gX19fIF9fXyAgIHxfICAgX3xfX18gX19ffCB8IHxffF98IHxfIFxuICB8ICAgICB8IC4gfCAuIHwgIHwgICBfX3wgLV98ICBffCAgX3wgLiB8ICBffCAgICAgfCAuJ3wgICB8ICBffCAtX3wgICAgfCB8IHwgLiB8IC4gfCB8ICdffCB8ICBffFxuICB8X198X198ICBffCAgX3wgIHxfX3wgIHxfX198X3wgfF98IHxfX198X3wgfF98X3xffF9fLHxffF98X19ffF9fX3wgICAgfF98IHxfX198X19ffF98XyxffF98X3wgIFxuICAgICAgICB8X3wgfF98ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG4gIFdlbGNvbWUgdG8gdGhlIGF1dG9tYXRlZCBEYXRhIENlbnRlciBBcHAgUGVyZm9ybWFuY2UgVG9vbGtpdCAoRENBUFQpLlxuICBUaGlzIHdpbGwgZ3VpZGUgeW91IHRocm91Z2ggYWxsIHRoZSBzdGVwcyB0byBwcm9kdWNlIHRoZSByZXF1aXJlZCBwZXJmb3JtYW5jZSB0ZXN0aW5nIHJlc3VsdHNcbiAgZm9yIHlvdXIgKGFubnVhbCkgRGF0YSBDZW50ZXIgYXBwcm92YWwuXG5gXG59O1xuZXhwb3J0IGNvbnN0IGluaXQgPSB7XG4gICAgaGVhZGVyOiAocHJvZHVjdCkgPT4gYFxuICBXZSB3aWxsIG5vdyBmb2xsb3cgYWxsIHRoZSBzdGVwcyBhcyBkb2N1bWVudGVkIGluIHRoZSBEYXRhIENlbnRlciBBcHAgUGVyZm9ybWFuY2UgVG9vbGtpdCBVc2VyIEd1aWRlIEZvciAke2NhcGl0YWxpemUocHJvZHVjdCl9LlxuICBQbGVhc2UgY29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbiBwcmlvciB0byBzdGFydGluZyB0aGUgdGVzdCBydW46XG5cbiAgaHR0cHM6Ly9kZXZlbG9wZXIuYXRsYXNzaWFuLmNvbS9wbGF0Zm9ybS9tYXJrZXRwbGFjZS9kYy1hcHBzLXBlcmZvcm1hbmNlLXRvb2xraXQtdXNlci1ndWlkZS0ke3Byb2R1Y3R9L1xuXG4gIE9uY2UgeW91IHN0YXJ0IHRoZSB0ZXN0IHJ1biB3ZSB3aWxsIHByb3Zpc2lvbiB0aGUgZW52aXJvbm1lbnQgb24gQVdTLiBcbiAgSU1QT1JUQU5UOiBUaGlzIGNhbiBpbmN1ciBjb3N0cy5cbiAgXG4gIFlvdSBjYW4gc3RvcCB0aGlzIHByb2Nlc3MgYXQgYW55IHRpbWUgYnkgZXhpdGluZyB0aGlzIHByb2dyYW0uIEJlIHN1cmUgdG8gcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZCB0byByZXNldCBcbiAgdGhlIEFXUyBlbnZpcm9ubWVudCBhbmQgcHJldmVudCB1bmV4cGVjdGVkIGNvc3RzLlxuXG4gICQgZGNkeCBhcHQgdGVhcmRvd25cblxuICBZb3UgY2FuIGFsc28gcmVzdW1lL3Jlc3RhcnQgZXZlcnkgcGFydCBvZiB0aGUgdGVzdCBydW4gdXNpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6XG5cbiAgJCBkY2R4IGFwdCBpbml0IC0tcHJvZHVjdCAke3Byb2R1Y3R9XG4gICQgZGNkeCBhcHQgcHJvdmlzaW9uIC0tcHJvZHVjdCAke3Byb2R1Y3R9XG4gICQgZGNkeCBhcHQgcnVuMSAtLXByb2R1Y3QgJHtwcm9kdWN0fVxuICAkIGRjZHggYXB0IHJ1bjIgLS1wcm9kdWN0ICR7cHJvZHVjdH1cbiAgJCBkY2R4IGFwdCBydW4zIC0tcHJvZHVjdCAke3Byb2R1Y3R9XG4gICQgZGNkeCBhcHQgcnVuNCAtLXByb2R1Y3QgJHtwcm9kdWN0fVxuICAkIGRjZHggYXB0IHJ1bjUgLS1wcm9kdWN0ICR7cHJvZHVjdH1cblxuICBXZSB3aWxsIGNvbnRpbnVlIHdpdGggdGhlIGZvbGxvd2luZyBzdGVwczpcbiR7cHJvZHVjdCA9PT0gJ2ppcmEnID8gYFxuICAxLiAgUHJvdmlzaW9uIHRoZSBlbnZpcm9ubWVudFxuICAyLiAgUGVyZm9ybWFuY2UgcmVncmVzc2lvbiB3aXRob3V0IGFwcCBpbnN0YWxsZWQgKHJ1biAxKVxuICAzLiAgTHVjZW5lIEluZGV4IHRpbWluZyB0ZXN0IHdpdGggYXBwIGluc3RhbGxlZCAocnVuIDIpXG4gIDQuICBQZXJmb3JtYW5jZSByZWdyZXNzaW9uIHdpdGggYXBwIGluc3RhbGxlZCAocnVuIDIpXG4gIDUuICBTY2FsYWJpbGl0eSB0ZXN0aW5nIG9uIG9uZS1ub2RlIGNsdXN0ZXIgd2l0aCBhcHAtc3BlY2lmaWMgYWN0aW9ucyAocnVuIDMpXG4gIDYuICBTY2FsYWJpbGl0eSB0ZXN0aW5nIG9uIHR3by1ub2RlIGNsdXN0ZXIgd2l0aCBhcHAtc3BlY2lmaWMgYWN0aW9ucyAocnVuIDQpXG4gIDcuICBTY2FsYWJpbGl0eSB0ZXN0aW5nIG9uIGZvdXItbm9kZSBjbHVzdGVyIHdpdGggYXBwLXNwZWNpZmljIGFjdGlvbnMgKHJ1biA1KVxuICA4LiAgR2VuZXJhdGUgcmVwb3J0c1xuICA5LiAgVGVhcmRvd24gb2YgZW52aXJvbm1lbnRcbiAgMTAuIFNlY3VyaXR5IFNjYW5uZXIgZm9yIERhdGEgQ2VudGVyIGFwcHNcbmAgOiBgXG4gIDEuIFByb3Zpc2lvbiB0aGUgZW52aXJvbm1lbnRcbiAgMi4gUGVyZm9ybWFuY2UgcmVncmVzc2lvbiB3aXRob3V0IGFwcCBpbnN0YWxsZWQgKHJ1biAxKVxuICAzLiBQZXJmb3JtYW5jZSByZWdyZXNzaW9uIHdpdGggYXBwIGluc3RhbGxlZCAocnVuIDIpXG4gIDQuIFNjYWxhYmlsaXR5IHRlc3Rpbmcgb24gb25lLW5vZGUgY2x1c3RlciB3aXRoIGFwcC1zcGVjaWZpYyBhY3Rpb25zIChydW4gMylcbiAgNS4gU2NhbGFiaWxpdHkgdGVzdGluZyBvbiB0d28tbm9kZSBjbHVzdGVyIHdpdGggYXBwLXNwZWNpZmljIGFjdGlvbnMgKHJ1biA0KVxuICA2LiBTY2FsYWJpbGl0eSB0ZXN0aW5nIG9uIGZvdXItbm9kZSBjbHVzdGVyIHdpdGggYXBwLXNwZWNpZmljIGFjdGlvbnMgKHJ1biA1KVxuICA3LiBHZW5lcmF0ZSByZXBvcnRzXG4gIDguIFRlYXJkb3duIG9mIGVudmlyb25tZW50XG4gIDkuIFNlY3VyaXR5IFNjYW5uZXIgZm9yIERhdGEgQ2VudGVyIGFwcHNcbmB9YCxcbn07XG5leHBvcnQgY29uc3QgcHJvdmlzaW9uaW5nID0ge1xuICAgIGhlYWRlcjogYFxuICBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBcbiAgfCAgXyAgfCBfXyAgfCAgICAgfCAgfCAgfCAgICAgfCAgIF9ffCAgICAgfCAgICAgfCAgIHwgfCAgICAgfCAgIHwgfCAgIF9ffFxuICB8ICAgX198ICAgIC18ICB8ICB8ICB8ICB8LSAgIC18X18gICB8LSAgIC18ICB8ICB8IHwgfCB8LSAgIC18IHwgfCB8ICB8ICB8XG4gIHxfX3wgIHxfX3xfX3xfX19fX3xcXFxcX19fL3xfX19fX3xfX19fX3xfX19fX3xfX19fX3xffF9fX3xfX19fX3xffF9fX3xfX19fX3xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgV2Ugd2lsbCBub3cgc3RhcnQgcHJvdmlzaW9uaW5nIEFXUyB1c2luZyB0aGUgQXRsYXNzaWFuIERhdGEgQ2VudGVyIEFwcCBQZXJmb3JtYWNlIFRvb2xraXQgKERDQVBUKSBUZXJyYWZvcm0gY29uZmlndXJhdGlvbi5cblxuICBJbiBvcmRlciB0byBkbyB0aGlzLCB3ZSBuZWVkIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246XG5cbiAgMS4gVGhlIGxvY2F0aW9uIG9mIHRoZSBEYXRhIENlbnRlciBBcHAgUGVyZm9ybWFuY2UgVG9vbGtpdCBvbiB5b3VyIGRpc2tcbiAgMi4gQVdTIGNyZWRlbnRpYWxzXG4gIDMuIFByb2R1Y3QgbGljZW5zZVxuYCxcbiAgICBhc2tGb3JBV1NDcmVkZW50aWFsczogKHByb2R1Y3QpID0+IGBcbiAgSW4gb3JkZXIgdG8gcHJvdmlzaW9uIHRoZSAke2NhcGl0YWxpemUocHJvZHVjdCl9IGNsdXN0ZXIsIHdlIG5lZWQgQWRtaW5pc3RyYXRvciBjcmVkZW50aWFscyBmb3IgQVdTLlxuICBQbGVhc2UgcmVmZXIgdG8gdGhlIERDQVBUIGRvY3VtZW50YXRpb24gdG8gZmluZCBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjcmVhdGUgdGhlIEFXUyBhY2Nlc3Mga2V5czpcblxuICBodHRwczovL2RldmVsb3Blci5hdGxhc3NpYW4uY29tL3BsYXRmb3JtL21hcmtldHBsYWNlL2RjLWFwcHMtcGVyZm9ybWFuY2UtdG9vbGtpdC11c2VyLWd1aWRlLSR7cHJvZHVjdH0vI3NldHVwLSR7cHJvZHVjdH0tZGF0YS1jZW50ZXItZGV2ZWxvcG1lbnQtZW52aXJvbm1lbnQtb24tazhzLVxuYCxcbiAgICBhc2tGb3JFbnZpcm9ubWVudDogYFxuICBXaGVuIHByb3Zpc2lvbmluZyB0aGUgY2x1c3Rlciwgd2UgbmVlZCBhIHVuaXF1ZSBlbnZpcm9ubWVudCBuYW1lLlxuICBUaGlzIHdpbGwgYWxsb3cgeW91IHRvIGNyZWF0ZSBtdWx0aXBsZSBjbHVzdGVycyAoaS5lLiBmb3IgZGlmZmVyZW50IGhvc3QgcHJvZHVjdHMpIGFuZCB0byBpZGVudGlmeSB3aGljaCBjbHVzdGVyIHRvIHVzZSBkdXJpbmcgdGVzdGluZyAmIHRlYXJkb3duLlxuYCxcbiAgICBhc2tGb3JIb3N0TGljZW5zZTogYFxuICBUaGUgaG9zdCBwcm9kdWN0IHJlcXVpcmVzIGEgdmFsaWQgbGljZW5zZS5cblxuICBCeSBkZWZhdWx0IHdlIHVzZSB0aGUgNzJoIGRldmVsb3BlciBsaWNlbnNlIHByb3ZpZGVkIGJ5IEF0bGFzc2lhbi4gSWYgeW91IG5lZWQgYSBtb3JlIGV4dGVuc2l2ZSBsaWNlbnNlLFxuICB5b3UgY2FuIGdlbmVyYXRlIGFuIGV2YWx1YXRpb24gbGljZW5zZSBmcm9tIG15LmF0bGFzc2lhbi5jb20gb3IgYXNrIEF0bGFzc2lhbiBNYXJrZXRwbGFjZSBEZXZlbG9wZXIgU3VwcG9ydCBmb3IgYSB0ZXN0IGxpY2Vuc2UuXG5gLFxuICAgIGFza0ZvckFwcExpY2Vuc2U6IGBcblRoZSBhcHAgcmVxdWlyZXMgYSB2YWxpZCBsaWNlbnNlLlxuXG5CeSBkZWZhdWx0IHdlIHVzZSB0aGUgMyBob3VyIHRpbWVib21iIGxpY2Vuc2UgcHJvdmlkZWQgYnkgQXRsYXNzaWFuLiBJZiB5b3UgbmVlZCBhIG1vcmUgZXh0ZW5zaXZlIGxpY2Vuc2UsXG55b3UgY2FuIGdlbmVyYXRlIGFuIGV2YWx1YXRpb24gbGljZW5zZSBmcm9tIG15LmF0bGFzc2lhbi5jb20gb3IgYXNrIEF0bGFzc2lhbiBNYXJrZXRwbGFjZSBEZXZlbG9wZXIgU3VwcG9ydCBmb3IgYSB0ZXN0IGxpY2Vuc2UuXG5gLFxuICAgIHJlYWR5OiBgXG4gIFdlIGhhdmUgbm93IGdhdGhlcmVkIGFsbCB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gcHJvdmlzaW9uIHRoZSBjbHVzdGVyLlxuXG4gICEhIElNUE9SVEFOVCAhIVxuICBcbiAgV2Ugd2lsbCBiZSB3cml0aW5nIHRoZSBjb25maWd1cmF0aW9uIHRvIGRpc2suIFRoaXMgd2lsbCBvdmVyd3JpdGUgZXhpc3RpbmcgY29uZmlndXJhdGlvbi5cbiAgUGxlYXNlIG5vdGUgdGhhdCBwcm92aXNpb25pbmcgdGhlIGVudmlyb25tZW50IHdpbGwgaW5jdXIgQVdTIHVzYWdlIGNvc3RzLlxuYCxcbiAgICBhd3NDcmVkZW50aWFsc1BlcnNpc3RlZDogJ+KclCBBV1MgY3JlZGVudGlhbHMgd3JpdHRlbiB0byBhcHAvdXRpbC9rOHMvYXdzX2VudnMnLFxuICAgIHRlcnJhZm9ybUNvbmZpZ3VyYXRpb25QZXJzaXN0ZWQ6IGDinJQgVGVycmFmb3JtIGNvbmZpZ3VyYXRpb24gd3JpdHRlbiB0byBhcHAvdXRpbC9rOHMvZGNhcHQudGZ2YXJzYFxufTtcbmV4cG9ydCBjb25zdCBSdW4xID0ge1xuICAgIGhlYWRlcjogKCkgPT4gYFxuICBfX19fXyBfX19fXyBfX19fXyAgICBfX18gICBcbiAgfCBfXyAgfCAgfCAgfCAgIHwgfCAgfF8gIHwgIFxuICB8ICAgIC18ICB8ICB8IHwgfCB8ICAgX3wgfF8gXG4gIHxfX3xfX3xfX19fX3xffF9fX3wgIHxfX19fX3xcblxuICBXZSB3aWxsIG5vdyBzdGFydCB0aGUgcGVyZm9ybWFuY2UgcmVncmVzc2lvbiB0ZXN0aW5nIHdpdGhvdXQgYXBwIGluc3RhbGxlZCAocnVuIDEpXG4gIFRoaXMgd2lsbCBwcm9kdWNlIHRoZSBwZXJmb3JtYW5jZSBiYXNlbGluZSByZXN1bHRzLlxuXG4gIEl0IGlzIGltcG9ydGFudCB0aGF0IHlvdSBhcmUgcnVubmluZyB0aGUgYmFzZWxpbmUgdGVzdCBvbiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLlxuICBZb3UgY2FuIGdldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZyb20gdGhlIEFQVCBzb3VyY2VzOlxuXG4gIGh0dHBzOi8vZ2l0aHViLmNvbS9hdGxhc3NpYW4vZGMtYXBwLXBlcmZvcm1hbmNlLXRvb2xraXRcbmAsXG4gICAgcmVhZHlGb3JQcm92aXNpb25pbmc6IGBcbkluIG9yZGVyIHRvIGJlIGFibGUgdG8gc3RhcnQgdGhlIHBlcmZvcm1hbmNlIHJlZ3Jlc3Npb24gdGVzdCwgd2Ugd2lsbCBub3cgY29uZmlndXJlIHRoZSBEQyBjbHVzdGVyIG9uIEFXU1xuXG4hISBJTVBPUlRBTlQgISFcblxuV2Ugd2lsbCBiZSB3cml0aW5nIHRoZSBjb25maWd1cmF0aW9uIHRvIGRpc2suIFRoaXMgd2lsbCBvdmVyd3JpdGUgZXhpc3RpbmcgY29uZmlndXJhdGlvbi5cblBsZWFzZSBub3RlIHRoYXQgcHJvdmlzaW9uaW5nIHRoZSBlbnZpcm9ubWVudCB3aWxsIGluY3VyIEFXUyB1c2FnZSBjb3N0cy5cbmAsXG4gICAgc3RhcnRUZXN0OiBgXG5XZSB3aWxsIG5vdyBzdGFydCB0aGUgUGVyZm9ybWFuY2UgUmVncmVzc2lvbiB0ZXN0XG5gLFxuICAgIHN1Y2Nlc3M6IGBcbuKclCBGaW5pc2hlZCB0aGUgcGVyZm9ybWFuY2UgcmVncmVzc2lvbiB0ZXN0aW5nIHdpdGhvdXQgYXBwIGluc3RhbGxlZCAocnVuIDEpXG5gLFxuICAgIGZhaWx1cmU6IChzdGFnZSwgY3dkLCBwcm9kdWN0LCBlbnZpcm9ubWVudCwgcmVzdWx0c0Jhc2VEaXIsIHJlc3VsdHMpID0+IHtcbiAgICAgICAgbGV0IG91dHB1dCA9IGBcbiAg4pyUIEZpbmlzaGVkIHRoZSBwZXJmb3JtYW5jZSAke3N0YWdlfSB0ZXN0aW5nIHdpdGhvdXQgYXBwIGluc3RhbGxlZCAocnVuIDEpXG5cbiAgVW5mb3J0dW5hdGVseSwgdGhlIHRlc3QgcnVuIHdhcyBmaW5pc2hlZCB1bnN1Y2Nlc2Z1bC4gXG4gIFBsZWFzZSByZXZpZXcgdGhlIHRlc3QgcmVzdWx0cyBhbmQgYWRqdXN0IHRoZSBjb25maWd1cmF0aW9uIGlmIHJlcXVpcmVkLlxuYDtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzdWx0cykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiBvdXRwdXQgKz0gYCAgJHtrZXl9OiAke3ZhbHVlfVxcbmApO1xuICAgICAgICBvdXRwdXQgKz0gYFxuICBGdWxsIHJlcG9ydCBjYW4gYmUgZm91bmQgaGVyZTpcbiAgJHtqb2luKHJlc3VsdHNCYXNlRGlyLCAncmVzdWx0c19zdW1tYXJ5LmxvZycpfVxuXG4gIFlvdSBjYW4gcmVzdGFydCB0aGUgcGVyZm9ybWFuY2UgdGVzdGluZyB1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6XG4gIFxuICAkIGRjZHggYXB0IHJ1bjEgLS1wcm9kdWN0ICR7cHJvZHVjdH0gLS1jd2QgJHtjd2R9IC0tZW52aXJvbm1lbnQgJHtlbnZpcm9ubWVudH1cbmA7XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfVxufTtcbmV4cG9ydCBjb25zdCBSdW4yID0ge1xuICAgIGhlYWRlcjogKHByb2R1Y3QpID0+IGBcbiAgX19fX18gX19fX18gX19fX18gICAgX19fIFxuICB8IF9fICB8ICB8ICB8ICAgfCB8ICB8XyAgfFxuICB8ICAgIC18ICB8ICB8IHwgfCB8ICB8ICBffFxuICB8X198X198X19fX198X3xfX198ICB8X19ffFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgV2Ugd2lsbCBub3cgc3RhcnQgdGhlIHBlcmZvcm1hbmNlIHJlZ3Jlc3Npb24gdGVzdGluZyB3aXRoIGFwcCBpbnN0YWxsZWQgKHJ1biAyKVxuICBUaGlzIHdpbGwgYWxsb3cgdGhlIGdlbmVyYXRpb24gb2YgYSBwZXJmb3JtYW5jZSByZWdyZXNzaW9uIHJlcG9ydC5cbiR7cHJvZHVjdCA9PT0gJ2ppcmEnID8gYFxuICBJbiBhZGRpdGlvbiwgYSBMdWNlbmUgSW5kZXggVGltaW5nIFRlc3QgaXMgYWxzbyBwYXJ0IG9mIHRoZSBwZXJmb3JtYW5jZSByZWdyZXNzaW9uIHRlc3RzLmAgOiAnJ31cbiAgVGhlIHNlY29uZCBydW4gY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBzdGVwczpcbiR7cHJvZHVjdCA9PT0gJ2ppcmEnID8gYFxuICAxLiBJbnN0YWxsIHRoZSBhcHAgaW50byB0aGUgY2x1c3RlclxuICAyLiBCZW5jaG1hcmsgdGhlIHJlLWluZGV4IHRpbWUgd2l0aCB5b3VyIGFwcCBpbnN0YWxsZWRcbiAgMy4gUGVyZm9ybWFuY2UgcmVzdWx0cyBnZW5lcmF0aW9uIHdpdGggdGhlIGFwcCBpbnN0YWxsZWRcbmAgOiBgXG4gIDEuIEluc3RhbGwgdGhlIGFwcCBpbnRvIHRoZSBjbHVzdGVyXG4gIDIuIFBlcmZvcm1hbmNlIHJlc3VsdHMgZ2VuZXJhdGlvbiB3aXRoIHRoZSBhcHAgaW5zdGFsbGVkXG5gfVxuICBJdCBpcyBpbXBvcnRhbnQgdGhhdCB5b3UgYXJlIHJ1bm5pbmcgdGhlIHBlcmZvcm1hbmNlIHJlZ3Jlc3Npb24gdGVzdCBvbiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLlxuICBZb3UgY2FuIGdldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZyb20gdGhlIEFQVCBzb3VyY2VzOlxuXG4gIGh0dHBzOi8vZ2l0aHViLmNvbS9hdGxhc3NpYW4vZGMtYXBwLXBlcmZvcm1hbmNlLXRvb2xraXRcbmAsXG4gICAgcmVhZHlGb3JQcm92aXNpb25pbmc6IGBcbkluIG9yZGVyIHRvIGJlIGFibGUgdG8gc3RhcnQgdGhlIHBlcmZvcm1hbmNlIHJlZ3Jlc3Npb24gdGVzdCwgd2Ugd2lsbCBub3cgY29uZmlndXJlIHRoZSBEQyBjbHVzdGVyIG9uIEFXU1xuXG4hISBJTVBPUlRBTlQgISFcblxuV2Ugd2lsbCBiZSB3cml0aW5nIHRoZSBjb25maWd1cmF0aW9uIHRvIGRpc2suIFRoaXMgd2lsbCBvdmVyd3JpdGUgZXhpc3RpbmcgY29uZmlndXJhdGlvbi5cblBsZWFzZSBub3RlIHRoYXQgcHJvdmlzaW9uaW5nIHRoZSBlbnZpcm9ubWVudCB3aWxsIGluY3VyIEFXUyB1c2FnZSBjb3N0cy5cbmAsXG4gICAgc3RhcnRUZXN0OiBgXG4gIFdlIHdpbGwgbm93IHN0YXJ0IHRoZSBQZXJmb3JtYW5jZSBSZWdyZXNzaW9uIHRlc3RcbmAsXG4gICAgc3VjY2VzczogYFxu4pyUIEZpbmlzaGVkIHRoZSBwZXJmb3JtYW5jZSByZWdyZXNzaW9uIHRlc3Rpbmcgd2l0aCBhcHAgaW5zdGFsbGVkIChydW4gMilcbmAsXG4gICAgZmFpbHVyZTogKHN0YWdlLCBjd2QsIHByb2R1Y3QsIGVudmlyb25tZW50LCByZXN1bHRzQmFzZURpciwgcmVzdWx0cykgPT4ge1xuICAgICAgICBsZXQgb3V0cHV0ID0gYFxuICDinJQgRmluaXNoZWQgdGhlIHBlcmZvcm1hbmNlICR7c3RhZ2V9IHRlc3Rpbmcgd2l0aCBhcHAgaW5zdGFsbGVkIChydW4gMilcblxuICBVbmZvcnR1bmF0ZWx5LCB0aGUgdGVzdCBydW4gd2FzIGZpbmlzaGVkIHVuc3VjY2VzZnVsLiBcbiAgUGxlYXNlIHJldmlldyB0aGUgdGVzdCByZXN1bHRzIGFuZCBhZGp1c3QgdGhlIGNvbmZpZ3VyYXRpb24gaWYgcmVxdWlyZWQuXG5gO1xuICAgICAgICBPYmplY3QuZW50cmllcyhyZXN1bHRzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IG91dHB1dCArPSBgICAke2tleX06ICR7dmFsdWV9XFxuYCk7XG4gICAgICAgIG91dHB1dCArPSBgXG4gIEZ1bGwgcmVwb3J0IGNhbiBiZSBmb3VuZCBoZXJlOlxuICAke2pvaW4ocmVzdWx0c0Jhc2VEaXIsICdyZXN1bHRzX3N1bW1hcnkubG9nJyl9XG5cbiAgWW91IGNhbiByZXN0YXJ0IHRoZSBwZXJmb3JtYW5jZSB0ZXN0aW5nIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZDpcbiAgXG4gICQgZGNkeCBhcHQgcnVuMiAtLXByb2R1Y3QgJHtwcm9kdWN0fSAtLWN3ZCAke2N3ZH0gLS1lbnZpcm9ubWVudCAke2Vudmlyb25tZW50fVxuYDtcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IEx1Y2VuZVRpbWluZ1Rlc3QgPSB7XG4gICAgaGVhZGVyOiAoX3Byb2R1Y3QsIHN0YWdlKSA9PiBgXG4gIF9fICAgIF9fX19fIF9fX19fIF9fX19fIF9fX19fIF9fX19fIFxuICB8ICB8ICB8ICB8ICB8ICAgICB8ICAgX198ICAgfCB8ICAgX198XG4gIHwgIHxfX3wgIHwgIHwgICAtLXwgICBfX3wgfCB8IHwgICBfX3xcbiAgfF9fX19ffF9fX19ffF9fX19ffF9fX19ffF98X19ffF9fX19ffFxuICBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBcbiAgfF8gICBffCAgICAgfCAgICAgfCAgICAgfCAgIHwgfCAgIF9ffFxuICAgIHwgfCB8LSAgIC18IHwgfCB8LSAgIC18IHwgfCB8ICB8ICB8XG4gICAgfF98IHxfX19fX3xffF98X3xfX19fX3xffF9fX3xfX19fX3xcbiAgICAgIF9fX19fIF9fX19fIF9fX19fIF9fX19fICAgICAgICAgXG4gICAgICB8XyAgIF98ICAgX198ICAgX198XyAgIF98ICAgICAgICBcbiAgICAgICAgfCB8IHwgICBfX3xfXyAgIHwgfCB8ICAgICAgICAgIFxuICAgICAgICB8X3wgfF9fX19ffF9fX19ffCB8X3wgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgV2Ugd2lsbCBub3cgc3RhcnQgdGhlIEx1Y2VuZSBJbmRleCBUaW1pbmcgdGVzdCB3aXRoIGFwcCBpbnN0YWxsZWRcbiAgVGhpcyBpcyBwYXJ0IG9mIHRoZSBQZXJmb3JtYW5jZSAke3N0YWdlfSB0ZXN0IChydW4gMilcblxuICBBZnRlciB0aGUgcmUtaW5kZXggaXMgY29tcGxldGVkIGEgc2NyZWVuc2hvdCBpcyBjcmVhdGVkIHdoaWNoIGlzIHBhcnQgb2YgdGhlIHJlcXVpcmVkIHRlc3QgcmVzdWx0c1xuXG4gIEl0IGlzIGltcG9ydGFudCB0aGF0IHlvdSBhcmUgcnVubmluZyB0aGUgTHVjZW5lIGluZGV4IHRpbWluZyB0ZXN0IG9uIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uXG4gIFlvdSBjYW4gZ2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgQVBUIHNvdXJjZXM6XG5cbiAgaHR0cHM6Ly9naXRodWIuY29tL2F0bGFzc2lhbi9kYy1hcHAtcGVyZm9ybWFuY2UtdG9vbGtpdFxuYCxcbiAgICByZWFkeUZvclByb3Zpc2lvbmluZzogYFxuSW4gb3JkZXIgdG8gYmUgYWJsZSB0byBzdGFydCB0aGUgTHVjZW5lIGluZGV4IHRpbWluZyB0ZXN0LCB3ZSB3aWxsIG5vdyBjb25maWd1cmUgdGhlIERDIGNsdXN0ZXIgb24gQVdTXG5cbiEhIElNUE9SVEFOVCAhIVxuXG5XZSB3aWxsIGJlIHdyaXRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gdG8gZGlzay4gVGhpcyB3aWxsIG92ZXJ3cml0ZSBleGlzdGluZyBjb25maWd1cmF0aW9uLlxuUGxlYXNlIG5vdGUgdGhhdCBwcm92aXNpb25pbmcgdGhlIGVudmlyb25tZW50IHdpbGwgaW5jdXIgQVdTIHVzYWdlIGNvc3RzLlxuYCxcbiAgICBzdGFydFRlc3Q6IGBcbiAgV2UgYXJlIHJlYWR5IHRvIHN0YXJ0IHRoZSBMdWNlbmUgSW5kZXggdGltaW5nIHRlc3RcbiAgT25jZSB0aGUgdGVzdCBpcyBmaW5pc2hlZCwgYSBicm93c2VyIHdpbmRvdyBpcyBvcGVuZWQgdG8gY2FwdHVyZSB0aGUgdGVzdCByZXN1bHRzLlxuXG4gICEhIElNUE9SVEFOVCAhIVxuXG4gIFRoaXMgbWF5IHRha2UgfjUwIG1pbnV0ZXMuIFBsZWFzZSBkbyBub3QgdGVybWluYXRlIHRoZSBwcm9ncmFtXG4gIERvIG5vdCBjbG9zZSB0aGUgYnJvd3NlciB3aW5kb3csIG9yIGVsc2UgdGhlIHRlc3Qgd2lsbCBmYWlsXG5gLFxuICAgIHN1Y2Nlc3M6IGBcbuKclCBGaW5pc2hlZCB0aGUgTHVjZW5lIEluZGV4IFRpbWluaWcgdGVzdCB3aXRoIGFwcCBpbnN0YWxsZWQgKHJ1biAyKVxuYCxcbiAgICBmYWlsdXJlOiAoX3N0YWdlLCBjd2QsIHByb2R1Y3QsIGVudmlyb25tZW50KSA9PiBgXG4gIOKclCBGaW5pc2hlZCB0aGUgTHVjZW5lIEluZGV4IFRpbWluZyB0ZXN0IHdpdGggYXBwIGluc3RhbGxlZCAocnVuIDIpXG5cbiAgVW5mb3J0dW5hdGVseSwgdGhlIHRlc3QgcnVuIHdhcyBmaW5pc2hlZCB1bnN1Y2Nlc2Z1bC4gXG4gIFBsZWFzZSByZXZpZXcgdGhlIHRlc3QgcmVzdWx0cyBhbmQgYWRqdXN0IHRoZSBjb25maWd1cmF0aW9uIGlmIHJlcXVpcmVkLlxuXG4gIFlvdSBjYW4gcmVzdGFydCB0aGUgTHVjZW5lIEluZGV4IFRpbWluZyB0ZXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZDpcbiAgXG4gICQgZGNkeCBhcHQgcmVpbmRleCAtLXByb2R1Y3QgJHtwcm9kdWN0fSAtLWN3ZCAke2N3ZH0gLS1lbnZpcm9ubWVudCAke2Vudmlyb25tZW50fVxuYFxufTtcbmV4cG9ydCBjb25zdCBQZXJmb3JtYW5jZVJlcG9ydE1lc3NhZ2VzID0ge1xuICAgIGhlYWRlcjogYFxuICBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyAgIFxuICB8ICBfICB8ICAgX198IF9fICB8ICAgX198ICAgICB8IF9fICB8ICAgICB8ICBfICB8ICAgfCB8ICAgICB8ICAgX198ICBcbiAgfCAgIF9ffCAgIF9ffCAgICAtfCAgIF9ffCAgfCAgfCAgICAtfCB8IHwgfCAgICAgfCB8IHwgfCAgIC0tfCAgIF9ffCAgXG4gIHxfX3wgIHxfX19fX3xfX3xfX3xfX3wgIHxfX19fX3xfX3xfX3xffF98X3xfX3xfX3xffF9fX3xfX19fX3xfX19fX3wgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgX19fX18gX19fX18gX19fX18gX19fX18gX19fX18gX19fX18gX19fX18gX19fX18gX19fX18gX19fX18gICAgIFxuICAgICAgfCBfXyAgfCAgIF9ffCAgIF9ffCBfXyAgfCAgIF9ffCAgIF9ffCAgIF9ffCAgICAgfCAgICAgfCAgIHwgfCAgICBcbiAgICAgIHwgICAgLXwgICBfX3wgIHwgIHwgICAgLXwgICBfX3xfXyAgIHxfXyAgIHwtICAgLXwgIHwgIHwgfCB8IHwgICAgXG4gICAgICB8X198X198X19fX198X19fX198X198X198X19fX198X19fX198X19fX198X19fX198X19fX198X3xfX198ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICB8IF9fICB8ICAgX198ICBfICB8ICAgICB8IF9fICB8XyAgIF98ICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgfCAgICAtfCAgIF9ffCAgIF9ffCAgfCAgfCAgICAtfCB8IHwgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIHxfX3xfX3xfX19fX3xfX3wgIHxfX19fX3xfX3xfX3wgfF98ICAgICAgICAgICAgICAgICAgICAgIFxuXG5cbiAgV2UgYXJlIGdvaW5nIHRvIGdlbmVyYXRlIHRoZSBwZXJmb3JtYW5jZSByZWdyZXNzaW9uIHJlcG9ydFxuICBUaGUgcmVwb3J0IGNvbnN0aXN0cyBvZiBhIENTViBhbmQgUE5HIGZpbGUgdGhhdCBhcmUgcmVxdWlyZWQgZm9yIFxuICB0aGUgKGFubnVhbCkgRGF0YSBDZW50ZXIgYXBwIHJldmlld1xuYFxufTtcbmV4cG9ydCBjb25zdCBTY2FsYWJpbGl0eVRlc3RNZXNzYWdlcyA9IHtcbiAgICBoZWFkZXI6IChwcm9kdWN0LCBzdGFnZSkgPT4gYFxuJHtzdGFnZSA9PT0gJ29uZS1ub2RlJyA/IGBcbiAgX19fX18gX19fX18gX19fX18gICAgX19fIFxuICB8IF9fICB8ICB8ICB8ICAgfCB8ICB8XyAgfFxuICB8ICAgIC18ICB8ICB8IHwgfCB8ICB8XyAgfFxuICB8X198X198X19fX198X3xfX198ICB8X19ffFxuYCA6IHN0YWdlID09PSAndHdvLW5vZGUnID8gYFxuICBfX19fXyBfX19fXyBfX19fXyAgICBfX18gXG4gIHwgX18gIHwgIHwgIHwgICB8IHwgIHwgfCB8XG4gIHwgICAgLXwgIHwgIHwgfCB8IHwgIHxfICB8XG4gIHxfX3xfX3xfX19fX3xffF9fX3wgICAgfF98ICAgICAgICAgICAgICAgICAgICAgICAgICBcbmAgOiBgXG4gIF9fX19fIF9fX19fIF9fX19fICAgIF9fXyBcbiAgfCBfXyAgfCAgfCAgfCAgIHwgfCAgfCAgX3xcbiAgfCAgICAtfCAgfCAgfCB8IHwgfCAgfF8gIHxcbiAgfF9ffF9ffF9fX19ffF98X19ffCAgfF9fX3wgICAgICAgICAgICAgICAgICAgICAgICAgIFxuYH1cblxuICBXZSB3aWxsIG5vdyBzdGFydCB0aGUgc2NhbGFiaWxpdHkgYmVuY2htYXJrIGZvciAke3N0YWdlfSAke2NhcGl0YWxpemUocHJvZHVjdCl9IERDIGNsdXN0ZXIgd2l0aCBhcHAtc3BlY2lmaWMgYWN0aW9uczogKHJ1biAke2dldFJ1bkZvclN0YWdlKHN0YWdlKX0pXG5cbiAgVGhlICR7dG9OdW1iZXIoc3RhZ2UpfSBydW4gY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBzdGVwczpcbiAgMS4gQWRqdXN0IHRoZSBlbnZpcm9ubWVudCB0byBhICR7c3RhZ2V9IGNsdXN0ZXJcbiAgMS4gSW5zdGFsbCB0aGUgYXBwIGludG8gdGhlIGNsdXN0ZXJcbiAgMy4gU2NhbGFiaWxpdHkgYmVuY2htYXJrIHRlc3Rpbmcgd2l0aCB0aGUgYXBwIGluc3RhbGxlZFxuXG4gIEl0IGlzIGltcG9ydGFudCB0aGF0IHlvdSBhcmUgcnVubmluZyB0aGUgc2NhbGFiaWxpdHkgYmVuY2htYXJrIHRlc3Qgb24gYSBEQ0FQVCB2ZXJzaW9uIHRoYXQgaGFzIGFwcC1zcGVjaWZpYyBhY3Rpb25zXG4gIE1vcmUgaW5mb3JtYXRpb24gb24gZGV2ZWxvcGluZyBhcHAtc3BlY2lmaWMgYWN0aW9ucyBjYW4gYmUgZm91bmQgaGVyZTpcblxuJHtwcm9kdWN0ID09PSAnamlyYScgP1xuICAgICAgICBgICBodHRwczovL2RldmVsb3Blci5hdGxhc3NpYW4uY29tL3BsYXRmb3JtL21hcmtldHBsYWNlL2RjLWFwcHMtcGVyZm9ybWFuY2UtdG9vbGtpdC11c2VyLWd1aWRlLWppcmEvIzMtLWRldmVsb3AtYW5kLXRlc3QtYXBwLXNwZWNpZmljLWFjdGlvbi1sb2NhbGx5YFxuICAgICAgICA6IHByb2R1Y3QgPT09ICdjb25mbHVlbmNlJyA/XG4gICAgICAgICAgICBgICBodHRwczovL2RldmVsb3Blci5hdGxhc3NpYW4uY29tL3BsYXRmb3JtL21hcmtldHBsYWNlL2RjLWFwcHMtcGVyZm9ybWFuY2UtdG9vbGtpdC11c2VyLWd1aWRlLWNvbmZsdWVuY2UvIzMtLWRldmVsb3AtYW5kLXRlc3QtYXBwLXNwZWNpZmljLWFjdGlvbnMtbG9jYWxseWBcbiAgICAgICAgICAgIDogcHJvZHVjdCA9PT0gJ2JhbWJvbycgP1xuICAgICAgICAgICAgICAgICcgIGh0dHBzOi8vZGV2ZWxvcGVyLmF0bGFzc2lhbi5jb20vcGxhdGZvcm0vbWFya2V0cGxhY2UvZGMtYXBwcy1wZXJmb3JtYW5jZS10b29sa2l0LXVzZXItZ3VpZGUtYmFtYm9vLyMyLS1hcHAtc3BlY2lmaWMtYWN0aW9ucy1kZXZlbG9wbWVudCdcbiAgICAgICAgICAgICAgICAvLyBwcm9kdWN0ID09PSAnYml0YnVja2V0J1xuICAgICAgICAgICAgICAgIDogJyAgaHR0cHM6Ly9kZXZlbG9wZXIuYXRsYXNzaWFuLmNvbS9wbGF0Zm9ybS9tYXJrZXRwbGFjZS9kYy1hcHBzLXBlcmZvcm1hbmNlLXRvb2xraXQtdXNlci1ndWlkZS1iaXRidWNrZXQvIzMtLWRldmVsb3AtYW5kLXRlc3QtYXBwLXNwZWNpZmljLWFjdGlvbi1sb2NhbGx5J31cbmAsXG4gICAgcmVhZHlGb3JQcm92aXNpb25pbmc6IGBcbiAgSW4gb3JkZXIgdG8gYmUgYWJsZSB0byBzdGFydCB0aGUgc2NhbGFiaWxpdHkgYmVuY2htYXJrLCB3ZSB3aWxsIG5vdyByZWNvbmZpZ3VyZSB0aGUgREMgY2x1c3RlciBvbiBBV1NcblxuICAhISBJTVBPUlRBTlQgISFcbiAgXG4gIFdlIHdpbGwgYmUgd3JpdGluZyB0aGUgY29uZmlndXJhdGlvbiB0byBkaXNrLiBUaGlzIHdpbGwgb3ZlcndyaXRlIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24uXG4gIFBsZWFzZSBub3RlIHRoYXQgcHJvdmlzaW9uaW5nIHRoZSBlbnZpcm9ubWVudCB3aWxsIGluY3VyIEFXUyB1c2FnZSBjb3N0cy5cbmAsXG4gICAgc3RhcnRUZXN0OiBgXG4gIFJlYWR5IHRvIHN0YXJ0IHRoZSBzY2FsYWJpbGl0eSBiZW5jaG1hcmsgdGVzdCB3aXRoIGFwcC1zcGVjaWZpYyBhY3Rpb25zXG5gLFxuICAgIHN1Y2Nlc3M6IGBcbuKclCBGaW5pc2hlZCB0aGUgc2NhbGFiaWxpdHkgYmVuY2htYXJrIHRlc3Qgd2l0aCBhcHAtc3BlY2lmaWMgYWN0aW9uc1xuYCxcbiAgICBmYWlsdXJlOiAoc3RhZ2UsIGN3ZCwgcHJvZHVjdCwgZW52aXJvbm1lbnQsIHJlc3VsdHNCYXNlRGlyLCByZXN1bHRzKSA9PiB7XG4gICAgICAgIGxldCBvdXRwdXQgPSBgXG7inJQgRmluaXNoZWQgdGhlIHNjYWxhYmlsaXR5IGJlbmNobWFyayB0ZXN0IHdpdGggYXBwLXNwZWNpZmljIGFjdGlvbnNcblxuICBVbmZvcnR1bmF0ZWx5LCB0aGUgdGVzdCBydW4gd2FzIGZpbmlzaGVkIHVuc3VjY2VzZnVsLiBcbiAgUGxlYXNlIHJldmlldyB0aGUgdGVzdCByZXN1bHRzIGFuZCBhZGp1c3QgdGhlIGNvbmZpZ3VyYXRpb24gaWYgcmVxdWlyZWQuXG5gO1xuICAgICAgICBPYmplY3QuZW50cmllcyhyZXN1bHRzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IG91dHB1dCArPSBgICAke2tleX06ICR7dmFsdWV9XFxuYCk7XG4gICAgICAgIG91dHB1dCArPSBgXG4gIEZ1bGwgcmVwb3J0IGNhbiBiZSBmb3VuZCBoZXJlOlxuICAke2pvaW4ocmVzdWx0c0Jhc2VEaXIsICdyZXN1bHRzX3N1bW1hcnkubG9nJyl9XG5cbiAgWW91IGNhbiByZXN0YXJ0IHRoZSBzY2FsYWJpbGl0eSBiZW5jaG1hcmsgdGVzdCB1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6XG4gIFxuICAkIGRjZHggYXB0IHJ1biR7Z2V0UnVuRm9yU3RhZ2Uoc3RhZ2UpfSAtLXByb2R1Y3QgJHtwcm9kdWN0fSAtLWN3ZCAke2N3ZH0gLS1lbnZpcm9ubWVudCAke2Vudmlyb25tZW50fVxuYDtcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG59O1xuZXhwb3J0IGNvbnN0IFNjYWxhYmlsaXR5UmVwb3J0TWVzc2FnZXMgPSB7XG4gICAgaGVhZGVyOiBgXG4gIF9fX19fIF9fX19fIF9fX19fIF9fICAgIF9fX19fIF9fX19fIF9fX19fIF9fICAgIF9fX19fIF9fX19fIF9fIF9fIFxuICB8ICAgX198ICAgICB8ICBfICB8ICB8ICB8ICBfICB8IF9fICB8ICAgICB8ICB8ICB8ICAgICB8XyAgIF98ICB8ICB8XG4gIHxfXyAgIHwgICAtLXwgICAgIHwgIHxfX3wgICAgIHwgX18gLXwtICAgLXwgIHxfX3wtICAgLXwgfCB8IHxfICAgX3xcbiAgfF9fX19ffF9fX19ffF9ffF9ffF9fX19ffF9ffF9ffF9fX19ffF9fX19ffF9fX19ffF9fX19ffCB8X3wgICB8X3wgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgX19fX18gX19fX18gX19fX18gX19fX18gX19fX18gX19fX18gICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIHwgX18gIHwgICBfX3wgIF8gIHwgICAgIHwgX18gIHxfICAgX3wgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgfCAgICAtfCAgIF9ffCAgIF9ffCAgfCAgfCAgICAtfCB8IHwgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICB8X198X198X19fX198X198ICB8X19fX198X198X198IHxffCAgICAgICAgICAgICAgICAgICAgXG5gXG59O1xuZXhwb3J0IGNvbnN0IFJlc3RhcnQgPSB7XG4gICAgaGVhZGVyOiBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBfX19fXyBcbiAgfCBfXyAgfCAgIF9ffCAgIF9ffF8gICBffCAgXyAgfCBfXyAgfF8gICBffFxuICB8ICAgIC18ICAgX198X18gICB8IHwgfCB8ICAgICB8ICAgIC18IHwgfCAgXG4gIHxfX3xfX3xfX19fX3xfX19fX3wgfF98IHxfX3xfX3xfX3xfX3wgfF98ICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgV2Ugd2lsbCBub3cgcmVzdGFydCB0aGUgY2x1c3RlciB1c2VkIGluIHRoZSBEYXRhIENlbnRlciBBcHBsaWNhdGlvbiBQZXJmb3JtYW5jZSB0ZXN0aW5nLlxuYFxufTtcbmV4cG9ydCBjb25zdCBUZWFyZG93biA9IHtcbiAgICBoZWFkZXI6IGBcbiAgX19fX18gX19fX18gX19fX18gX19fX18gX19fXyAgX19fX18gXyBfIF8gX19fX18gXG4gIHxfICAgX3wgICBfX3wgIF8gIHwgX18gIHwgICAgXFxcXHwgICAgIHwgfCB8IHwgICB8IHxcbiAgICB8IHwgfCAgIF9ffCAgICAgfCAgICAtfCAgfCAgfCAgfCAgfCB8IHwgfCB8IHwgfFxuICAgIHxffCB8X19fX198X198X198X198X198X19fXy98X19fX198X19fX198X3xfX198XG5cbiAgV2Ugd2lsbCBub3cgdGVybWluYXRlIHRoZSBjbHVzdGVyIHVzZWQgaW4gdGhlIERhdGEgQ2VudGVyIEFwcGxpY2F0aW9uIFBlcmZvcm1hbmNlIHRlc3RpbmcuXG5gXG59O1xuIiwiaW1wb3J0IHsgaW5wdXQgfSBmcm9tICdAaW5xdWlyZXIvcHJvbXB0cyc7XG5pbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBhcHAzaG91ciB9IGZyb20gJy4uLy4uL2hlbHBlcnMvbGljZW5jZXMnO1xuaW1wb3J0IHsgcHJvdmlzaW9uaW5nIH0gZnJvbSAnLi4vbWVzc2FnZXMnO1xuZXhwb3J0IGNvbnN0IGdldEFwcExpY2Vuc2UgPSAobGljZW5zZSwgZm9yY2UpID0+IHtcbiAgICBjb25zdCBhcHBMaWNlbnNlID0gbGljZW5zZSAmJiBleGlzdHNTeW5jKGxpY2Vuc2UpID8gcmVhZEZpbGVTeW5jKGxpY2Vuc2UsICd1dGY4JykgOiBsaWNlbnNlO1xuICAgIGlmIChmb3JjZSkge1xuICAgICAgICByZXR1cm4gYXBwTGljZW5zZSB8fCBhcHAzaG91cjtcbiAgICB9XG4gICAgY29uc29sZS5sb2cocHJvdmlzaW9uaW5nLmFza0ZvckFwcExpY2Vuc2UpO1xuICAgIHJldHVybiBpbnB1dCh7XG4gICAgICAgIG1lc3NhZ2U6IGBMaWNlbnNlYCxcbiAgICAgICAgZGVmYXVsdDogYXBwTGljZW5zZSB8fCBhcHAzaG91cixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICB9KTtcbn07XG4iLCJpbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IEZvcm1EYXRhIGZyb20gJ2Zvcm0tZGF0YSc7XG5pbXBvcnQgeyBjcmVhdGVSZWFkU3RyZWFtIH0gZnJvbSAnZnMnO1xuZXhwb3J0IGNvbnN0IHVwbG9hZFRvVVBNID0gYXN5bmMgKGJhc2VVcmwsIHBhdGgsIHVzZXJuYW1lLCBwYXNzd29yZCwgdmVyYm9zZSA9IHRydWUpID0+IHtcbiAgICBjb25zdCBjcmVkZW50aWFscyA9IHVzZXJuYW1lICYmIHBhc3N3b3JkID8gQnVmZmVyLmZyb20oYCR7dXNlcm5hbWV9OiR7cGFzc3dvcmR9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpIDogbnVsbDtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLmdldChgJHtiYXNlVXJsfS9yZXN0L3BsdWdpbnMvMS4wLz9vc19hdXRoVHlwZT1iYXNpY2AsIGNyZWRlbnRpYWxzID8ge1xuICAgICAgICBoZWFkZXJzOiB7ICdBdXRob3JpemF0aW9uJzogYEJhc2ljICR7Y3JlZGVudGlhbHN9YCB9XG4gICAgfSA6IHVuZGVmaW5lZCkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgdmVyYm9zZSAmJiBjb25zb2xlLmxvZygnRmFpbGVkIHRvIHVwbG9hZCBwbHVnaW4gYXJjaGl2ZSBmaWxlIHRvIFVQTSwgdW5hYmxlIHRvIHJldHJpZXZlIHRva2VuJywgZXJyKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSk7XG4gICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gcmVzcG9uc2UuaGVhZGVyc1sndXBtLXRva2VuJ107XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgncGx1Z2luJywgY3JlYXRlUmVhZFN0cmVhbShwYXRoKSk7XG4gICAgICAgICAgICByZXR1cm4gYXhpb3MucG9zdChgJHtiYXNlVXJsfS9yZXN0L3BsdWdpbnMvMS4wLz90b2tlbj0ke3Rva2VufWAsIGZvcm1EYXRhLCB7IGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uZm9ybURhdGEuZ2V0SGVhZGVycygpLFxuICAgICAgICAgICAgICAgICAgICAuLi5jcmVkZW50aWFscyA/IHsgJ0F1dGhvcml6YXRpb24nOiBgQmFzaWMgJHtjcmVkZW50aWFsc31gIH0gOiB7fVxuICAgICAgICAgICAgICAgIH0gfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmVyYm9zZSAmJiBjb25zb2xlLmxvZygnRmluaXNoZWQgdXBsb2FkaW5nIHBsdWdpbiBhcmNoaXZlIHRvIFVQTScpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2ZXJib3NlICYmIGNvbnNvbGUubG9nKCdGYWlsZWQgdG8gdXBsb2FkIHBsdWdpbiBhcmNoaXZlIGZpbGUgdG8gVVBNLCB1bmFibGUgdG8gcmV0cmlldmUgdG9rZW4gZnJvbSBoZWFkZXJzOicsIEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlLmhlYWRlcnMsIG51bGwsIDIpKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuZXhwb3J0IGNvbnN0IHdhaXRGb3JQbHVnaW5Ub0JlRW5hYmxlZCA9IGFzeW5jIChhcHBLZXksIGJhc2VVcmwsIHVzZXJuYW1lLCBwYXNzd29yZCwgdmVyYm9zZSA9IHRydWUpID0+IHtcbiAgICBjb25zdCBjcmVkZW50aWFscyA9IHVzZXJuYW1lICYmIHBhc3N3b3JkID8gQnVmZmVyLmZyb20oYCR7dXNlcm5hbWV9OiR7cGFzc3dvcmR9YCkudG9TdHJpbmcoJ2Jhc2U2NCcpIDogbnVsbDtcbiAgICB2ZXJib3NlICYmIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciBwbHVnaW4gdG8gYmVjb21lIGVuYWJsZWQnKTtcbiAgICBsZXQgaXNFbmFibGVkID0gZmFsc2U7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICB3aGlsZSAoIWlzRW5hYmxlZCAmJiBjb3VudCA8IDEyMCkge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwMCkpO1xuICAgICAgICB2ZXJib3NlICYmIGNvbnNvbGUubG9nKGBXYWl0aW5nIGZvciBwbHVnaW4gdG8gYmVjb21lIGVuYWJsZWQuLi4gJHtjb3VudH1zYCk7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXhpb3MuZ2V0KGAke2Jhc2VVcmx9L3Jlc3QvcGx1Z2lucy8xLjAvJHthcHBLZXl9LWtleWAsIGNyZWRlbnRpYWxzID8ge1xuICAgICAgICAgICAgaGVhZGVyczogeyAnQXV0aG9yaXphdGlvbic6IGBCYXNpYyAke2NyZWRlbnRpYWxzfWAgfVxuICAgICAgICB9IDogdW5kZWZpbmVkKS5jYXRjaCgoKSA9PiAoeyBkYXRhOiB7IGVuYWJsZWQ6IGZhbHNlIH0gfSkpO1xuICAgICAgICBpc0VuYWJsZWQgPSBkYXRhPy5lbmFibGVkO1xuICAgICAgICBjb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gaXNFbmFibGVkO1xufTtcbmV4cG9ydCBjb25zdCByZWdpc3RlckxpY2Vuc2UgPSBhc3luYyAoYXBwS2V5LCBsaWNlbnNlLCBiYXNlVXJsLCB1c2VybmFtZSwgcGFzc3dvcmQsIHZlcmJvc2UgPSB0cnVlKSA9PiB7XG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSB1c2VybmFtZSAmJiBwYXNzd29yZCA/IEJ1ZmZlci5mcm9tKGAke3VzZXJuYW1lfToke3Bhc3N3b3JkfWApLnRvU3RyaW5nKCdiYXNlNjQnKSA6IG51bGw7XG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBheGlvcy5nZXQoYCR7YmFzZVVybH0vcmVzdC9wbHVnaW5zLzEuMC8ke2FwcEtleX0ta2V5L2xpY2Vuc2VgLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdYLUF0bGFzc2lhbi1Ub2tlbic6ICduby1jaGVjaycsXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3ZuZC5hdGwucGx1Z2lucytqc29uJyxcbiAgICAgICAgICAgIC4uLmNyZWRlbnRpYWxzID8geyAnQXV0aG9yaXphdGlvbic6IGBCYXNpYyAke2NyZWRlbnRpYWxzfWAgfSA6IHt9XG4gICAgICAgIH1cbiAgICB9KS5jYXRjaCgoKSA9PiAoeyBkYXRhOiB7fSB9KSk7XG4gICAgY29uc3QgeyByYXdMaWNlbnNlIH0gPSBkYXRhO1xuICAgIGlmICghcmF3TGljZW5zZSB8fCByYXdMaWNlbnNlICE9PSBsaWNlbnNlKSB7XG4gICAgICAgIHJldHVybiBheGlvcy5wdXQoYCR7YmFzZVVybH0vcmVzdC9wbHVnaW5zLzEuMC8ke2FwcEtleX0ta2V5L2xpY2Vuc2VgLCBgeyBcInJhd0xpY2Vuc2VcIjogXCIke2xpY2Vuc2V9XCIgfWAsIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnWC1BdGxhc3NpYW4tVG9rZW4nOiAnbm8tY2hlY2snLFxuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vdm5kLmF0bC5wbHVnaW5zK2pzb24nLFxuICAgICAgICAgICAgICAgIC4uLmNyZWRlbnRpYWxzID8geyAnQXV0aG9yaXphdGlvbic6IGBCYXNpYyAke2NyZWRlbnRpYWxzfWAgfSA6IHt9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdmVyYm9zZSAmJiBjb25zb2xlLmxvZygnRmluaXNoZWQgdXBsb2FkaW5nIGxpY2Vuc2UgdG8gVVBNJyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIHZlcmJvc2UgJiYgY29uc29sZS5sb2coJ0ZhaWxlZCB0byB1cGxvYWQgbGljZW5zZSB0byBVUE0nLCBlcnIpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuIiwiaW1wb3J0IHsgY29uZmlybSwgaW5wdXQgfSBmcm9tICdAaW5xdWlyZXIvcHJvbXB0cyc7XG5pbXBvcnQgeyBleGlzdHNTeW5jLCBybVN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHsgam9pbiwgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgY3dkIGFzIHB3ZCB9IGZyb20gJ3Byb2Nlc3MnO1xuaW1wb3J0IHNpbXBsZUdpdCBmcm9tICdzaW1wbGUtZ2l0JztcbmltcG9ydCB7IGVtcHR5TGluZSB9IGZyb20gJy4uL21lc3NhZ2VzJztcbmV4cG9ydCBjb25zdCBnZXRBcHREaWN0b3J5ID0gYXN5bmMgKGN3ZCwgbXVzdFVzZURlZmF1bHRDb25maWd1cmF0aW9uLCBmb3JjZSkgPT4ge1xuICAgIC8vIFRyYW5zbGF0ZSBjb21tb24gcmVsYXRpdmUgcGF0aHMgdG8gYWJzb2x1dGUgcGF0aHNcbiAgICBsZXQgcmVzdWx0ID0gY3dkID9cbiAgICAgICAgY3dkLnN0YXJ0c1dpdGgoJ34vJylcbiAgICAgICAgICAgID8gY3dkLnJlcGxhY2UoJ34vJywgaG9tZWRpcigpKVxuICAgICAgICAgICAgOiBjd2Quc3RhcnRzV2l0aCgnLi8nKVxuICAgICAgICAgICAgICAgID8gY3dkLnJlcGxhY2UoJy4vJywgcHdkKCkgKyAnLycpXG4gICAgICAgICAgICAgICAgOiBjd2QgPT09ICcuJ1xuICAgICAgICAgICAgICAgICAgICA/IHB3ZCgpXG4gICAgICAgICAgICAgICAgICAgIDogY3dkXG4gICAgICAgIDogcHdkKCk7XG4gICAgLy8gSWYgd2UgYXJlIGluIGludGVyYWN0aXZlIG1vZGUsIHdlIHNob3VsZCBhc2sgcXVlc3Rpb25zIGZpcnN0XG4gICAgaWYgKCFmb3JjZSkge1xuICAgICAgICAvLyBDaGVjayBpZiB3ZSBhcmUgY3VycmVudGx5IGluIHRoZSBBUFQgZGlyZWN0b3J5XG4gICAgICAgIGNvbnN0IGlzQ3VycmVudERpcmVjdG9yeUVsaWdhYmxlID0gZXhpc3RzU3luYyhqb2luKHJlc3VsdCwgJ2FwcC91dGlsL2s4cy9kY2FwdC50ZnZhcnMnKSk7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIEFQVCBkaXJlY3RvcnksIHdlIHdpbGwgYmUgdXNpbmcgdGhlIGN1cnJlbnQgZGlyZWN0b3J5Li4uXG4gICAgICAgIGxldCB1c2VDdXJyZW50RGlyZWN0b3J5ID0gaXNDdXJyZW50RGlyZWN0b3J5RWxpZ2FibGU7XG4gICAgICAgIC8vIC4uLnVubGVzcyB0b2xkIG90aGVyd2lzZVxuICAgICAgICBpZiAoaXNDdXJyZW50RGlyZWN0b3J5RWxpZ2FibGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgIFdlJ3ZlIGZvdW5kIHRoZSBBcHAgUGVyZm9ybWFuY2UgVG9vbGtpdCBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeTpcbiAgJHtyZXN1bHR9XG5gKTtcbiAgICAgICAgICAgIHVzZUN1cnJlbnREaXJlY3RvcnkgPSBhd2FpdCBjb25maXJtKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRG8geW91IHdpc2ggdG8gdXNlIHRoaXMgZGlyZWN0b3J5P2AsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHdlIGFyZSBub3QgZ29pbmcgdG8gdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYXNrIGZvciB0aGUgYWx0ZXJuYXRpdmVcbiAgICAgICAgbGV0IGRpcmVjdG9yeSA9IHJlc3VsdDtcbiAgICAgICAgaWYgKCF1c2VDdXJyZW50RGlyZWN0b3J5KSB7XG4gICAgICAgICAgICBkaXJlY3RvcnkgPSBhd2FpdCBpbnB1dCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1BsZWFzZSBzcGVjaWZ5IHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgQXBwIFBlZm9ybWFuY2UgVG9vbGtpdCBpcyBsb2NhdGVkJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXN1bHQsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyYW5zbGF0ZSBjb21tb24gcmVsYXRpdmUgcGF0aHMgdG8gYWJzb2x1dGUgcGF0aHNcbiAgICAgICAgZGlyZWN0b3J5ID0gZGlyZWN0b3J5LnN0YXJ0c1dpdGgoJ34vJylcbiAgICAgICAgICAgID8gZGlyZWN0b3J5LnJlcGxhY2UoJ34vJywgaG9tZWRpcigpICsgJy8nKVxuICAgICAgICAgICAgOiBkaXJlY3Rvcnkuc3RhcnRzV2l0aCgnLi8nKVxuICAgICAgICAgICAgICAgID8gZGlyZWN0b3J5LnJlcGxhY2UoJy4vJywgcHdkKCkgKyAnLycpXG4gICAgICAgICAgICAgICAgOiBkaXJlY3RvcnkgPT09ICcuJ1xuICAgICAgICAgICAgICAgICAgICA/IHB3ZCgpXG4gICAgICAgICAgICAgICAgICAgIDogZGlyZWN0b3J5O1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZWQgYWx0ZXJuYXRpdmUgaXMgYSBEQ0FQVCBkaXJlY3RvcnlcbiAgICAgICAgY29uc3QgaXNEaXJlY3RvcnlFbGlnYWJsZSA9IGV4aXN0c1N5bmMocmVzb2x2ZShqb2luKGRpcmVjdG9yeSwgJ2FwcC91dGlsL2s4cy9kY2FwdC50ZnZhcnMnKSkpO1xuICAgICAgICBpZiAoIWlzRGlyZWN0b3J5RWxpZ2FibGUpIHtcbiAgICAgICAgICAgIC8vIElmIGl0IGlzIG5vdCBhIERDQVBUIGRpcmVjdG9yeSwgYXNrIGlmIHdlIG5lZWQgdG8gY2xvbmUgaXQgZnJvbSBHaXRodWJcbiAgICAgICAgICAgIGNvbnN0IG11c3RDbG9uZUFQVCA9IGF3YWl0IGNvbmZpcm0oe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBUaGUgZGlyZWN0b3J5IGVpdGhlciBkb2Vzbid0IGV4aXN0LCBvciBpdCBkb2Vzbid0IGNvbnRhaW4gdGhlIEFwcCBQZWZvcm1hbmNlIFRvb2xraXQuIERvIHlvdSB3YW50IHRvIGNsb25lIERDQVBUIGZyb20gc291cmNlP2AsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIElmIHdlIG11c3QgY2xvbmUgaXQgZnJvbSBHaXRodWIsIHdlIHNob3VsZCBjbG9uZSBpdCBmcm9tIEdpdGh1YlxuICAgICAgICAgICAgaWYgKG11c3RDbG9uZUFQVCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHNpbXBsZUdpdCgpLmNsb25lKCdodHRwczovL2dpdGh1Yi5jb20vYXRsYXNzaWFuL2RjLWFwcC1wZXJmb3JtYW5jZS10b29sa2l0LmdpdCcsIGRpcmVjdG9yeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBuZWVkcyB0byBiZSBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiAoZm9yIHBlcmZvcm1hbmNlIHJlZ3Jlc3Npb24gdGVzdGluZylcbiAgICAgICAgaWYgKG11c3RVc2VEZWZhdWx0Q29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgLy8gQXNrIG5pY2VseS4uLlxuICAgICAgICAgICAgY29uc3QgaXNEZWZhdWx0Q29uZmlndXJhdGlvbiA9IGF3YWl0IGNvbmZpcm0oe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQbGVhc2UgY29uZmlybSB0aGF0IHRoZSBjaG9zZW4gZGlyZWN0b3J5IGlzIHVzaW5nIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIERDQVBUIChtYXN0ZXIgYnJhbmNoKSdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gLi4uYnV0IGFsc28sIE5vIGlzIG5vdCBhbiBvcHRpb25cbiAgICAgICAgICAgIGlmICghaXNEZWZhdWx0Q29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSXQgaXMgcmVxdWlyZWQgdG8gdXNlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZnJvbSBtYXN0ZXIgdG8gY29udGludWUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIEFzayBuaWNlbHkuLi5cbiAgICAgICAgICAgIGNvbnN0IGlzQXBwU3BlY2lmaWNDb25maWd1cmF0aW9uID0gYXdhaXQgY29uZmlybSh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1BsZWFzZSBjb25maXJtIHRoYXQgdGhlIGNob3NlbiBkaXJlY3RvcnkgaGFzIGEgRENBUFQgaW5zdGFsbGF0aW9uIHdpdGggYXBwLXNwZWNpZmljIGFjdGlvbnMnXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIC4uLmJ1dCBhbHNvLCBObyBpcyBub3QgYW4gb3B0aW9uXG4gICAgICAgICAgICBpZiAoIWlzQXBwU3BlY2lmaWNDb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJdCBpcyByZXF1aXJlZCB0byBoYXZlIGFwcC1zcGVjaWZpYyBhY3Rpb25zIGluIG9yZGVyIHRvIGNvbnRpbnVlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IHRoZSByZXN1bHQgdG8gdGhlIHByb3ZpZGVkIGRpcmVjdG9yeVxuICAgICAgICByZXN1bHQgPSBkaXJlY3Rvcnk7XG4gICAgICAgIC8vIElmIHdlIGFyZSBpbiBub24taW50ZXJhY3RpdmUgbW9kZSBhbmQgd2UgbmVlZCB0byB1c2UgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiwgd2Ugd2lsbCBjbG9uZSBpdCBmcm9tIEdpdGh1YlxuICAgIH1cbiAgICBlbHNlIGlmIChtdXN0VXNlRGVmYXVsdENvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgLy8gSWYgdGhlIHByb3ZpZGVkIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdHMgd2UgY2FuIHVzZSBpdFxuICAgICAgICAvLyBPdGhlcndpc2UgdXNlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0byBlbnN1cmUgYSBmcmVzaCBub24tcGVyc2lzdGVudCBjaGVja291dFxuICAgICAgICByZXN1bHQgPSAhZXhpc3RzU3luYyhyZXN1bHQpXG4gICAgICAgICAgICA/IHJlc3VsdFxuICAgICAgICAgICAgOiBqb2luKGhvbWVkaXIoKSwgJy5kY2R4JywgJ2RjYXB0Jyk7XG4gICAgICAgIC8vIEluZm9ybSB0aGUgdXNlciBvZiB0aGUgY2hvc2VuIGRpcmVjdG9yeVxuICAgICAgICBjb25zb2xlLmxvZygnICBJbnN0YWxsaW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiBEQ0FQVCBmcm9tIHNvdXJjZSAobm9uLWludGVyYWN0aXZlIG1vZGUpJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICR7cmVzdWx0fWApO1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBpcyBlbXB0eVxuICAgICAgICBybVN5bmMocmVzdWx0LCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIC8vIFJldHJpZXZlIERDQVBUIGZyb20gZ2l0aHViXG4gICAgICAgIGF3YWl0IHNpbXBsZUdpdCgpLmNsb25lKCdodHRwczovL2dpdGh1Yi5jb20vYXRsYXNzaWFuL2RjLWFwcC1wZXJmb3JtYW5jZS10b29sa2l0LmdpdCcsIHJlc3VsdCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCfinJQgRmluaXNoZWQgaW5zdGFsbGluZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2YgRENBUFQgZnJvbSBzb3VyY2UgKG5vbi1pbnRlcmFjdGl2ZSBtb2RlKScpO1xuICAgICAgICAvLyBJZiB3ZSBhcmUgaW4gbm9uLWludGVyYWN0aXZlIG1vZGUgYW5kIHdlIG5lZWQgdG8gdXNlIGFwcCBzcGVjaWZpYyBjb25maWd1cmF0aW9uLCBtYWtlIHN1cmUgdGhhdCBpdCBleGlzdHNcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSBjdXJyZW50bHkgaW4gdGhlIEFQVCBkaXJlY3RvcnlcbiAgICAgICAgY29uc3QgaXNDdXJyZW50RGlyZWN0b3J5RWxpZ2FibGUgPSBleGlzdHNTeW5jKGpvaW4ocmVzdWx0LCAnYXBwL3V0aWwvazhzL2RjYXB0LnRmdmFycycpKTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgYSBEQ0FQVCBkaXJlY3RvcnksIHdlIGNhbm5vdCBjb250aW51ZVxuICAgICAgICBpZiAoIWlzQ3VycmVudERpcmVjdG9yeUVsaWdhYmxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIEFwcCBQZXJmb3JtYW5jZSBUb29sa2l0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAke3Jlc3VsdH1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygnICBVc2luZyBEQ0FQVCBmcm9tIGN1cnJlbnQgZGlyZWN0b3J5IChub24taW50ZXJhY3RpdmUgbW9kZSknKTtcbiAgICAgICAgY29uc29sZS5sb2coYCAgJHtyZXN1bHR9YCk7XG4gICAgICAgIGVtcHR5TGluZSgpO1xuICAgIH1cbiAgICAvLyBUaGlzIHNob3VsZCBub3Qgb2NjdXIsIGJlY2F1c2UgZWl0aGVyIHdlIGhhdmUgZXN0YWJsaXNoZWQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGhhcyBEQ0FQVFxuICAgIC8vIG9yIHdlIGhhdmUgY2xvbmVkIGl0IGludG8gYSAobmV3KSBkaXJlY3RvcnkuIFRoaXMgaXMgbWVyZWx5IGEgY2hlY2sgZm9yIGlmIHRoZSBsYXR0ZXIgZmFpbGVkLlxuICAgIGlmICghZXhpc3RzU3luYyhqb2luKHJlc3VsdCwgJ2FwcC91dGlsL2s4cy9kY2FwdC50ZnZhcnMnKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCB0aGUgQXBwIFBlcmZvcm1hbmNlIFRvb2xraXQgaW4gdGhlIHByb3ZpZGVkIGRpcmVjdG9yeSAke3Jlc3VsdH1gKTtcbiAgICB9XG4gICAgLy8gU29tZSBhZGRpdGlvbmFsIGNoZWNrcyB0byBlbnN1cmUgdGhhdCB3ZSBhcmUgaW4gYSB2YWxpZCBEQ0FQVCBkaXJlY3RvcnlcbiAgICBjb25zdCBoYXNFbnZGaWxlID0gZXhpc3RzU3luYyhqb2luKHJlc3VsdCwgJ2FwcC91dGlsL2s4cy9hd3NfZW52cycpKTtcbiAgICBjb25zdCBoYXNTbmFwc2hvdEpTT04gPSBleGlzdHNTeW5jKGpvaW4ocmVzdWx0LCAnYXBwL3V0aWwvazhzL2RjYXB0LXNuYXBzaG90cy5qc29uJykpO1xuICAgIGNvbnN0IGhhc1RlcnJhZm9ybVZhcmlhYmxlcyA9IGV4aXN0c1N5bmMoam9pbihyZXN1bHQsICdhcHAvdXRpbC9rOHMvZGNhcHQudGZ2YXJzJykpO1xuICAgIGlmICghaGFzRW52RmlsZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHRoZSByZXF1aXJlZCAnYXdzX2VucycgZmlsZS4gRXhwZWN0ZWQgdG8gZmluZCBpdCBpbiAke2pvaW4ocmVzdWx0LCAnYXBwL3V0aWwvazhzL2F3c19lbnZzJyl9YCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCFoYXNTbmFwc2hvdEpTT04pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCB0aGUgcmVxdWlyZWQgJ2RjYXB0LXNuYXBzaG90cy5qc29uJyBmaWxlLiBFeHBlY3RlZCB0byBmaW5kIGl0IGluICR7am9pbihyZXN1bHQsICdhcHAvdXRpbC9rOHMvZGNhcHQtc25hcHNob3RzLmpzb24nKX1gKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIWhhc1RlcnJhZm9ybVZhcmlhYmxlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHRoZSByZXF1aXJlZCAnZGNhcHQudGZ2YXJzJyBmaWxlLiBFeHBlY3RlZCB0byBmaW5kIGl0IGluICR7am9pbihyZXN1bHQsICdhcHAvdXRpbC9rOHMvZGNhcHQudGZ2YXJzJyl9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuIiwiaW1wb3J0IHsgcGFzc3dvcmQgfSBmcm9tICdAaW5xdWlyZXIvcHJvbXB0cyc7XG5pbXBvcnQgeyBwcm92aXNpb25pbmcgfSBmcm9tICcuLi9tZXNzYWdlcyc7XG5leHBvcnQgY29uc3QgZ2V0QVdTQ3JlZGVudGlhbHMgPSBhc3luYyAocHJvZHVjdCwgZm9yY2UpID0+IHtcbiAgICAvLyBUcnkgZ2V0dGluZyB0aGUgQVdTIGNyZWRlbnRpYWxzIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAgY29uc3QgeyBBV1NfQUNDRVNTX0tFWV9JRCwgQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZIH0gPSBwcm9jZXNzLmVudjtcbiAgICAvLyBJZiB0aGV5IGV4aXN0cyBhcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHJldHVybiB0aGVtIGltbWVkaWF0ZWx5XG4gICAgaWYgKEFXU19BQ0NFU1NfS0VZX0lEICYmIEFXU19TRUNSRVRfQUNDRVNTX0tFWSkge1xuICAgICAgICByZXR1cm4gW0FXU19BQ0NFU1NfS0VZX0lELCBBV1NfU0VDUkVUX0FDQ0VTU19LRVldO1xuICAgIH1cbiAgICAvLyBJZiB3ZSBhcmUgbm90IGluIG5vbi1pbnRlcmFjdGl2ZSBtb2RlLCB3ZSBzaG91bGQgYXNrIGZvciB0aGVtXG4gICAgaWYgKCFmb3JjZSkge1xuICAgICAgICAvLyBTaG93IGEgbWVzc2FnZSBhc2tpbmcgbmljZWx5XG4gICAgICAgIGNvbnNvbGUubG9nKHByb3Zpc2lvbmluZy5hc2tGb3JBV1NDcmVkZW50aWFscyhwcm9kdWN0KSk7XG4gICAgICAgIGNvbnN0IGF3c19hY2Nlc3Nfa2V5X2lkID0gYXdhaXQgcGFzc3dvcmQoe1xuICAgICAgICAgICAgbWVzc2FnZTogYEFXUyBBY2Nlc3MgS2V5IElEYCxcbiAgICAgICAgICAgIHZhbGlkYXRlOiAoaW5wdXQpID0+IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgJiYgaW5wdXQubGVuZ3RoID4gMFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgYXdzX3NlY3JldF9hY2Nlc3Nfa2V5ID0gYXdhaXQgcGFzc3dvcmQoe1xuICAgICAgICAgICAgbWVzc2FnZTogYEFXUyBTZWNyZXQgQWNjZXNzIEtleWAsXG4gICAgICAgICAgICB2YWxpZGF0ZTogKGlucHV0KSA9PiB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnICYmIGlucHV0Lmxlbmd0aCA+IDBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBbYXdzX2FjY2Vzc19rZXlfaWQsIGF3c19zZWNyZXRfYWNjZXNzX2tleV07XG4gICAgfVxuICAgIC8vIElmIHdlIGFyZSBpbiBub24taW50ZXJhY3RpdmUgbW9kZSwgYW5kIHRoZSBjcmVkZW50aWFscyBoYXZlIG5vdCBiZWVuIGZvdW5kLCB3ZSBzaG91bGQgdGhyb3cgYW4gZXJyb3JcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBBV1MgY3JlZGVudGlhbHMgY291bGQgbm90IGJlIGZvdW5kLiBQbGVhc2UgcHJvdmlkZSB0aGUgJ0FXU19BQ0NFU1NfS0VZX0lEJyBhbmQgJ0FXU19TRUNSRVRfQUNDRVNTX0tFWScgZW52aXJvbm1lbnQgdmFyaWFibGVzYCk7XG59O1xuIiwiaW1wb3J0IHsgaW5wdXQgfSBmcm9tICdAaW5xdWlyZXIvcHJvbXB0cyc7XG5pbXBvcnQgeyBwcm92aXNpb25pbmcgfSBmcm9tICcuLi9tZXNzYWdlcyc7XG5leHBvcnQgY29uc3QgZ2V0RW52aXJvbm1lbnROYW1lID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKHByb3Zpc2lvbmluZy5hc2tGb3JFbnZpcm9ubWVudCk7XG4gICAgcmV0dXJuIGlucHV0KHtcbiAgICAgICAgbWVzc2FnZTogYEVudmlyb25tZW50IG5hbWVgLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0pO1xufTtcbiIsImltcG9ydCB7IHNlbGVjdCB9IGZyb20gJ0BpbnF1aXJlci9wcm9tcHRzJztcbmV4cG9ydCBjb25zdCBnZXRQcm9kdWN0ID0gYXN5bmMgKCkgPT4ge1xuICAgIHJldHVybiBzZWxlY3Qoe1xuICAgICAgICBtZXNzYWdlOiBgUGxlYXNlIGNob29zZSB0aGUgcHJvZHVjdCBmb3Igd2hpY2ggeW91IHdpc2ggdG8gcnVuIERDQVBUYCxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICAgeyBuYW1lOiAnSmlyYScsIHZhbHVlOiAnamlyYScgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ0NvbmZsdWVuY2UnLCB2YWx1ZTogJ2NvbmZsdWVuY2UnIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdCYW1ib28nLCB2YWx1ZTogJ2JhbWJvbycgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ0JpdGJ1Y2tldCcsIHZhbHVlOiAnYml0YnVja2V0JyB9XG4gICAgICAgIF1cbiAgICB9KTtcbn07XG4iLCJpbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgd3JpdGVGaWxlU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IGpvaW4sIHJlc29sdmUgfSBmcm9tICdwYXRoJztcbmV4cG9ydCBjb25zdCBpbnN0YWxsID0gYXN5bmMgKGN3ZCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGBcbiAgU3RhcnQgcHJvdmlzaW9uaW5nIEFXUyB1c2luZyB0aGUgQXRsYXNzaWFuIERhdGEgQ2VudGVyIEFwcCBQZXJmb3JtYWNlIFRvb2xraXQgKERDQVBUKSBUZXJyYWZvcm0gY29uZmlndXJhdGlvblxuICBVc2luZyBEQ0FQVCBjb25maWd1cmF0aW9uIGZyb20gJHtjd2R9XG5gKTtcbiAgICBjb25zdCBiYXNlRGlyID0gam9pbihjd2QsICdhcHAvdXRpbC9rOHMnKTtcbiAgICB3cml0ZUZpbGVTeW5jKGpvaW4oYmFzZURpciwgJ291dHB1dHMuanNvbicpLCAnIyB0ZXJyYWZvcm0gb3V0cHV0JywgJ3V0Zi04Jyk7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBkb2NrZXIgPSBzcGF3bignZG9ja2VyJywgW1xuICAgICAgICAgICAgJ3J1bicsXG4gICAgICAgICAgICAnLWl0JyxcbiAgICAgICAgICAgIGAtLXB1bGw9YWx3YXlzYCxcbiAgICAgICAgICAgICctLWVudi1maWxlJywgJ2F3c19lbnZzJyxcbiAgICAgICAgICAgICctdicsIGAke2Jhc2VEaXJ9L2RjYXB0LnRmdmFyczovZGF0YS1jZW50ZXItdGVycmFmb3JtL2NvbmYudGZ2YXJzYCxcbiAgICAgICAgICAgICctdicsIGAke2Jhc2VEaXJ9L2RjYXB0LXNuYXBzaG90cy5qc29uOi9kYXRhLWNlbnRlci10ZXJyYWZvcm0vZGNhcHQtc25hcHNob3RzLmpzb25gLFxuICAgICAgICAgICAgJy12JywgYCR7YmFzZURpcn0vbG9nczovZGF0YS1jZW50ZXItdGVycmFmb3JtL2xvZ3NgLFxuICAgICAgICAgICAgJy12JywgYCR7YmFzZURpcn0vb3V0cHV0cy5qc29uOi9kYXRhLWNlbnRlci10ZXJyYWZvcm0vb3V0cHV0cy5qc29uYCxcbiAgICAgICAgICAgICdhdGxhc3NpYW5sYWJzL3RlcnJhZm9ybTpsYXRlc3QnLFxuICAgICAgICAgICAgJy4vaW5zdGFsbC5zaCcsICctYycsICdjb25mLnRmdmFycydcbiAgICAgICAgXSwgeyBjd2Q6IGJhc2VEaXIsIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgICAgIGRvY2tlci5vbignZXhpdCcsIChjb2RlKSA9PiAoY29kZSA9PT0gMCkgPyByZXNvbHZlKCkgOiByZWplY3QobmV3IEVycm9yKGBEb2NrZXIgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCkpKTtcbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZyhgXG7inJQgRmluaXNoZWQgcHJvdmlzaW9uaW5nIEFXUyB1c2luZyB0aGUgQXRsYXNzaWFuIERhdGEgQ2VudGVyIEFwcCBQZXJmb3JtYWNlIFRvb2xraXQgKERDQVBUKSBUZXJyYWZvcm0gY29uZmlndXJhdGlvblxuICBDbHVzdGVyIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluICR7YmFzZURpcn0vb3V0cHV0cy5qc29uXG5gKTtcbn07XG5leHBvcnQgY29uc3QgcnVuVGVzdCA9IGFzeW5jIChjd2QsIGVudmlyb25tZW50LCBwcm9kdWN0KSA9PiB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBkb2NrZXIgPSBzcGF3bignZG9ja2VyJywgW1xuICAgICAgICAgICAgJ3J1bicsXG4gICAgICAgICAgICAnLWl0JyxcbiAgICAgICAgICAgIGAtLXB1bGw9YWx3YXlzYCxcbiAgICAgICAgICAgICctLWVudi1maWxlJywgJy4vYXBwL3V0aWwvazhzL2F3c19lbnZzJyxcbiAgICAgICAgICAgICctZScsIGBSRUdJT049dXMtZWFzdC0yYCxcbiAgICAgICAgICAgICctZScsIGBFTlZJUk9OTUVOVF9OQU1FPSR7ZW52aXJvbm1lbnR9YCxcbiAgICAgICAgICAgICctdicsIGAke2N3ZH06L2RhdGEtY2VudGVyLXRlcnJhZm9ybS9kYy1hcHAtcGVyZm9ybWFuY2UtdG9vbGtpdGAsXG4gICAgICAgICAgICAnLXYnLCBgJHtjd2R9L2FwcC91dGlsL2s4cy9ienRfb25fcG9kLnNoOi9kYXRhLWNlbnRlci10ZXJyYWZvcm0vYnp0X29uX3BvZC5zaGAsXG4gICAgICAgICAgICAnYXRsYXNzaWFubGFicy90ZXJyYWZvcm06bGF0ZXN0JyxcbiAgICAgICAgICAgICdiYXNoJywgJ2J6dF9vbl9wb2Quc2gnLCBgJHtwcm9kdWN0fS55bWxgXG4gICAgICAgIF0sIHsgY3dkLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgICAgICBkb2NrZXIub24oJ2V4aXQnLCAoY29kZSkgPT4gKGNvZGUgPT09IDApID8gcmVzb2x2ZSgpIDogcmVqZWN0KG5ldyBFcnJvcihgRG9ja2VyIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKSk7XG4gICAgfSk7XG59O1xuZXhwb3J0IGNvbnN0IHJlZ3Jlc3Npb25SZXBvcnQgPSBhc3luYyAoY3dkLCBydW4xRGlyLCBydW4yRGlyKSA9PiB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBkb2NrZXIgPSBzcGF3bignZG9ja2VyJywgW1xuICAgICAgICAgICAgJ3J1bicsXG4gICAgICAgICAgICAnLWl0JyxcbiAgICAgICAgICAgIGAtLXB1bGw9YWx3YXlzYCxcbiAgICAgICAgICAgICctLXdvcmtkaXInLCAnLy9kYy1hcHAtcGVyZm9ybWFuY2UtdG9vbGtpdC9hcHAvcmVwb3J0c19nZW5lcmF0aW9uJyxcbiAgICAgICAgICAgICctLWVudHJ5cG9pbnQnLCAncHl0aG9uJyxcbiAgICAgICAgICAgICctdicsIGAke2N3ZH06L2RjLWFwcC1wZXJmb3JtYW5jZS10b29sa2l0YCxcbiAgICAgICAgICAgICctdicsIGAke3J1bjFEaXJ9Oi9yZXN1bHRzL3J1bjFgLFxuICAgICAgICAgICAgJy12JywgYCR7cnVuMkRpcn06L3Jlc3VsdHMvcnVuMmAsXG4gICAgICAgICAgICAnYXRsYXNzaWFuL2RjYXB0JyxcbiAgICAgICAgICAgICdjc3ZfY2hhcnRfZ2VuZXJhdG9yLnB5JywgJ3BlcmZvcm1hbmNlX3Byb2ZpbGUueW1sJ1xuICAgICAgICBdLCB7IGN3ZCwgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICAgICAgZG9ja2VyLm9uKCdleGl0JywgKGNvZGUpID0+IChjb2RlID09PSAwKSA/IHJlc29sdmUoKSA6IHJlamVjdChuZXcgRXJyb3IoYERvY2tlciBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gKSkpO1xuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKGDinJQgRmluaXNoZWQgZ2VuZXJhdGluZyB0aGUgUGVyZm9ybWFuY2UgUmVncmVzc2lvbiBSZXBvcnRgKTtcbn07XG5leHBvcnQgY29uc3Qgc2NhbGFiaWxpdHlSZXBvcnQgPSBhc3luYyAoY3dkLCByZXN1bHRzRGlyMSwgcmVzdWx0c0RpcjIsIHJlc3VsdHNEaXIzKSA9PiB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBkb2NrZXIgPSBzcGF3bignZG9ja2VyJywgW1xuICAgICAgICAgICAgJ3J1bicsXG4gICAgICAgICAgICAnLWl0JyxcbiAgICAgICAgICAgIGAtLXB1bGw9YWx3YXlzYCxcbiAgICAgICAgICAgICctLXdvcmtkaXInLCAnLy9kYy1hcHAtcGVyZm9ybWFuY2UtdG9vbGtpdC9hcHAvcmVwb3J0c19nZW5lcmF0aW9uJyxcbiAgICAgICAgICAgICctLWVudHJ5cG9pbnQnLCAncHl0aG9uJyxcbiAgICAgICAgICAgICctdicsIGAke2N3ZH06L2RjLWFwcC1wZXJmb3JtYW5jZS10b29sa2l0YCxcbiAgICAgICAgICAgICctdicsIGAke3Jlc3VsdHNEaXIxfTovZGNhcHQvc2NhbGVfcmVzdWx0c18xYCxcbiAgICAgICAgICAgICctdicsIGAke3Jlc3VsdHNEaXIyfTovZGNhcHQvc2NhbGVfcmVzdWx0c18yYCxcbiAgICAgICAgICAgICctdicsIGAke3Jlc3VsdHNEaXIzfTovZGNhcHQvc2NhbGVfcmVzdWx0c18zYCxcbiAgICAgICAgICAgICdhdGxhc3NpYW4vZGNhcHQnLFxuICAgICAgICAgICAgJ2Nzdl9jaGFydF9nZW5lcmF0b3IucHknLCAnc2NhbGVfcHJvZmlsZS55bWwnXG4gICAgICAgIF0sIHsgY3dkLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgICAgICBkb2NrZXIub24oJ2V4aXQnLCAoY29kZSkgPT4gKGNvZGUgPT09IDApID8gcmVzb2x2ZSgpIDogcmVqZWN0KG5ldyBFcnJvcihgRG9ja2VyIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKSk7XG4gICAgfSk7XG4gICAgY29uc29sZS5sb2coYOKclCBGaW5pc2hlZCBnZW5lcmF0aW5nIHRoZSBTY2FsYWJpbGl0eSBCZW5jaG1hcmsgUmVwb3J0YCk7XG59O1xuZXhwb3J0IGNvbnN0IHJlc3RhcnQgPSBhc3luYyAoY3dkLCBlbnZpcm9ubWVudCwgcHJvZHVjdCkgPT4ge1xuICAgIHdyaXRlRmlsZVN5bmMoam9pbihjd2QsICcuL2FwcC91dGlsL2s4cy9kZWxldGVfcG9kLnNoJyksIGBcbmF3cyBla3MgdXBkYXRlLWt1YmVjb25maWcgLS1uYW1lIGF0bGFzLSRFTlZJUk9OTUVOVF9OQU1FLWNsdXN0ZXIgLS1yZWdpb24gJFJFR0lPTlxua3ViZWN0bCByb2xsb3V0IHJlc3RhcnQgc3RzLyRQUk9EVUNUIC1uIGF0bGFzc2lhblxua3ViZWN0bCByb2xsb3V0IHN0YXR1cyBzdHMgJFBST0RVQ1QgLW4gYXRsYXNzaWFuYCwgJ3V0ZjgnKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGRvY2tlciA9IHNwYXduKCdkb2NrZXInLCBbXG4gICAgICAgICAgICAncnVuJyxcbiAgICAgICAgICAgICctaXQnLFxuICAgICAgICAgICAgYC0tcHVsbD1hbHdheXNgLFxuICAgICAgICAgICAgJy0tZW52LWZpbGUnLCAnLi9hcHAvdXRpbC9rOHMvYXdzX2VudnMnLFxuICAgICAgICAgICAgJy1lJywgYFJFR0lPTj11cy1lYXN0LTJgLFxuICAgICAgICAgICAgJy1lJywgYEVOVklST05NRU5UX05BTUU9JHtlbnZpcm9ubWVudH1gLFxuICAgICAgICAgICAgJy1lJywgYFBST0RVQ1Q9JHtwcm9kdWN0fWAsXG4gICAgICAgICAgICAnLXYnLCBgJHtjd2R9Oi9kYXRhLWNlbnRlci10ZXJyYWZvcm0vZGMtYXBwLXBlcmZvcm1hbmNlLXRvb2xraXRgLFxuICAgICAgICAgICAgJy12JywgYCR7Y3dkfS9hcHAvdXRpbC9rOHMvZGVsZXRlX3BvZC5zaDovZGF0YS1jZW50ZXItdGVycmFmb3JtL2RlbGV0ZV9wb2Quc2hgLFxuICAgICAgICAgICAgJ2F0bGFzc2lhbmxhYnMvdGVycmFmb3JtOmxhdGVzdCcsXG4gICAgICAgICAgICAnYmFzaCcsICdkZWxldGVfcG9kLnNoJ1xuICAgICAgICBdLCB7IGN3ZCwgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICAgICAgZG9ja2VyLm9uKCdleGl0JywgKGNvZGUpID0+IChjb2RlID09PSAwKSA/IHJlc29sdmUoKSA6IHJlamVjdChuZXcgRXJyb3IoYERvY2tlciBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gKSkpO1xuICAgIH0pO1xufTtcbmV4cG9ydCBjb25zdCB0ZXJtaW5hdGUgPSBhc3luYyAoY3dkLCBlbnZpcm9ubWVudCkgPT4ge1xuICAgIGNvbnN0IGJhc2VEaXIgPSByZXNvbHZlKGpvaW4oY3dkLCAnYXBwL3V0aWwvazhzJykpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgZG9ja2VyID0gc3Bhd24oJ2RvY2tlcicsIFtcbiAgICAgICAgICAgICdydW4nLFxuICAgICAgICAgICAgYC0tcHVsbD1hbHdheXNgLFxuICAgICAgICAgICAgJy0tZW52LWZpbGUnLCAnYXdzX2VudnMnLFxuICAgICAgICAgICAgJy0td29ya2RpcicsICcvL2RhdGEtY2VudGVyLXRlcnJhZm9ybScsXG4gICAgICAgICAgICAnLS1lbnRyeXBvaW50JywgJ3B5dGhvbicsXG4gICAgICAgICAgICAnLXYnLCBgJHtiYXNlRGlyfS90ZXJtaW5hdGVfY2x1c3Rlci5weTovZGF0YS1jZW50ZXItdGVycmFmb3JtL3Rlcm1pbmF0ZV9jbHVzdGVyLnB5YCxcbiAgICAgICAgICAgICdhdGxhc3NpYW4vZGNhcHQnLFxuICAgICAgICAgICAgJ3Rlcm1pbmF0ZV9jbHVzdGVyLnB5JywgJy0tY2x1c3Rlcl9uYW1lJywgYGF0bGFzLSR7ZW52aXJvbm1lbnR9LWNsdXN0ZXJgLCAnLS1hd3NfcmVnaW9uJywgJ3VzLWVhc3QtMidcbiAgICAgICAgXSwgeyBjd2Q6IGpvaW4oY3dkLCAnYXBwL3V0aWwvazhzJyksIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgICAgIGRvY2tlci5vbignZXhpdCcsIChjb2RlKSA9PiAoY29kZSA9PT0gMCkgPyByZXNvbHZlKCkgOiByZWplY3QobmV3IEVycm9yKGBEb2NrZXIgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9YCkpKTtcbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZyhg4pyUIEZpbmlzaGVkIHRlcm1pbmF0aW5nIHRoZSBEQyBjbHVzdGVyIG9uIEFXUyB1c2luZyB0aGUgQXRsYXNzaWFuIERhdGEgQ2VudGVyIEFwcCBQZXJmb3JtYWNlIFRvb2xraXQgKERDQVBUKSBUZXJyYWZvcm0gY29uZmlndXJhdGlvbmApO1xufTtcbiIsImltcG9ydCB7IHdyaXRlRmlsZVN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBwcm92aXNpb25pbmcgfSBmcm9tICcuLi9tZXNzYWdlcyc7XG5leHBvcnQgY29uc3QgcGVyc2lzdEFXU0NyZWRlbnRpYWxzID0gKGN3ZCwgYXdzX2FjY2Vzc19rZXlfaWQsIGF3c19zZWNyZXRfYWNjZXNzX2tleSkgPT4ge1xuICAgIHdyaXRlRmlsZVN5bmMoam9pbihjd2QsICdhcHAvdXRpbC9rOHMvYXdzX2VudnMnKSwgYFxuIyBhd3NfZW52cyBmaWxlIHNob3VsZCBjb250YWluIEFXUyB2YXJpYWJsZXMgbmVlZGVkIGZvciBhdXRob3JpemF0aW9uICh3aXRob3V0IHF1b3RlcylcbkFXU19BQ0NFU1NfS0VZX0lEPSR7YXdzX2FjY2Vzc19rZXlfaWR9XG5BV1NfU0VDUkVUX0FDQ0VTU19LRVk9JHthd3Nfc2VjcmV0X2FjY2Vzc19rZXl9XG5gLnRyaW0oKSwgJ3V0Zi04Jyk7XG4gICAgY29uc29sZS5sb2cocHJvdmlzaW9uaW5nLmF3c0NyZWRlbnRpYWxzUGVyc2lzdGVkKTtcbn07XG4iLCJpbXBvcnQgaW5xdWlyZXIgZnJvbSAnaW5xdWlyZXInO1xuaW1wb3J0IFByZXNzVG9Db250aW51ZVByb21wdCBmcm9tICdpbnF1aXJlci1wcmVzcy10by1jb250aW51ZSc7XG5pbnF1aXJlci5yZWdpc3RlclByb21wdCgncHJlc3MtdG8tY29udGludWUnLCBQcmVzc1RvQ29udGludWVQcm9tcHQpO1xuZXhwb3J0IGNvbnN0IHdhaXRGb3JVc2VySW5wdXQgPSBhc3luYyAobWVzc2FnZSwgZm9yY2UpID0+IHtcbiAgICBjb25zdCB7IGtleSB9ID0gYXdhaXQgaW5xdWlyZXIucHJvbXB0KHtcbiAgICAgICAgbmFtZTogJ2tleScsXG4gICAgICAgIHR5cGU6ICdwcmVzcy10by1jb250aW51ZScsXG4gICAgICAgIGFueUtleTogdHJ1ZSxcbiAgICAgICAgcHJlc3NUb0NvbnRpbnVlTWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgd2hlbjogIWZvcmNlXG4gICAgfSk7XG4gICAgcmV0dXJuIGtleSB8fCB7IHZhbHVlOiB1bmRlZmluZWQgfTtcbn07XG4iLCJpbXBvcnQgeyBlbXB0eUxpbmUsIFJlc3RhcnQgfSBmcm9tICcuLi9tZXNzYWdlcyc7XG5pbXBvcnQgeyByZXN0YXJ0IH0gZnJvbSAnLi9kY2FwdCc7XG5pbXBvcnQgeyBnZXRBcHREaWN0b3J5IH0gZnJvbSAnLi9nZXRBcHREaXJlY3RvcnknO1xuaW1wb3J0IHsgZ2V0QVdTQ3JlZGVudGlhbHMgfSBmcm9tICcuL2dldEFXU0NyZWRlbnRpYWxzJztcbmltcG9ydCB7IHBlcnNpc3RBV1NDcmVkZW50aWFscyB9IGZyb20gJy4vcGVyc2lzdHNBV1NDcmVkZW50aWFscyc7XG5pbXBvcnQgeyB3YWl0Rm9yVXNlcklucHV0IH0gZnJvbSAnLi93YWl0Rm9yVXNlcklucHV0JztcbmV4cG9ydCBjb25zdCByZXN0YXJ0Q2x1c3RlciA9IGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgLy8gU2hvdyBuaWNlIGxpdHRsZSB3ZWxjb21lIG1lc3NhZ2VcbiAgICBjb25zb2xlLmxvZyhSZXN0YXJ0LmhlYWRlcik7XG4gICAgLy8gQXNrIGZvciB0aGUgcHJvcGVyIGRpcmVjdG9yeSBvZiBBUFRcbiAgICBjb25zdCBkaXJlY3RvcnkgPSBhd2FpdCBnZXRBcHREaWN0b3J5KG9wdGlvbnMuY3dkLCB0cnVlLCBvcHRpb25zLmZvcmNlKTtcbiAgICAvLyBBc2sgZm9yIHRoZSBBV1MgY3JlZGVudGlhbHNcbiAgICBjb25zdCBbYXdzX2FjY2Vzc19rZXlfaWQsIGF3c19zZWNyZXRfYWNjZXNzX2tleV0gPSBhd2FpdCBnZXRBV1NDcmVkZW50aWFscyhvcHRpb25zLnByb2R1Y3QsIG9wdGlvbnMuZm9yY2UpO1xuICAgIC8vIFdyaXRlIEFXUyBjcmVkZW50aWFscyB0byBkaXNrXG4gICAgcGVyc2lzdEFXU0NyZWRlbnRpYWxzKGRpcmVjdG9yeSwgYXdzX2FjY2Vzc19rZXlfaWQsIGF3c19zZWNyZXRfYWNjZXNzX2tleSk7XG4gICAgLy8gQXNrIHRoZSB1c2VyIGlmIHRoZXkgYXJlIHJlYWR5IHRvIHNheSBnb29kYnllIHRvIHRoZWlyIGNsdXN0ZXJcbiAgICBhd2FpdCB3YWl0Rm9yVXNlcklucHV0KCdQcmVzcyBhIGtleSB0byBjb250aW51ZS4uLicsIG9wdGlvbnMuZm9yY2UpO1xuICAgIGVtcHR5TGluZSgpO1xuICAgIC8vIFRlcm1pbmF0ZSBpdCFcbiAgICBhd2FpdCByZXN0YXJ0KGRpcmVjdG9yeSwgb3B0aW9ucy5lbnZpcm9ubWVudCwgb3B0aW9ucy5wcm9kdWN0KTtcbiAgICAvLyBBc2sgdGhlIHVzZXIgdG8gcXVpdCB0aGUgcHJvZ3JhbVxuICAgIGF3YWl0IHdhaXRGb3JVc2VySW5wdXQoJ1ByZXNzIGEga2V5IHRvIGV4aXQuLi4nLCBvcHRpb25zLmZvcmNlKTtcbn07XG4iLCJpbXBvcnQgeyBjb25maXJtLCBpbnB1dCwgcGFzc3dvcmQgYXMgcGFzc3dvcmRQcm9tcHQsIHNlbGVjdCB9IGZyb20gJ0BpbnF1aXJlci9wcm9tcHRzJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgeyBQcmVzZXRzLCBTaW5nbGVCYXIgfSBmcm9tICdjbGktcHJvZ3Jlc3MnO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICdjb250ZW50LWRpc3Bvc2l0aW9uJztcbmltcG9ydCB7IGNyZWF0ZVdyaXRlU3RyZWFtLCBta2RpclN5bmMsIHJtU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyByZWdpc3RlckxpY2Vuc2UsIHVwbG9hZFRvVVBNLCB3YWl0Rm9yUGx1Z2luVG9CZUVuYWJsZWQgfSBmcm9tICcuLi8uLi9oZWxwZXJzL3VwbSc7XG5pbXBvcnQgeyBnZXRBcHBMaWNlbnNlIH0gZnJvbSAnLi9nZXRBcHBMaWNlbnNlJztcbmltcG9ydCB7IGdldEFwdERpY3RvcnkgfSBmcm9tICcuL2dldEFwdERpcmVjdG9yeSc7XG5pbXBvcnQgeyBnZXRBV1NDcmVkZW50aWFscyB9IGZyb20gJy4vZ2V0QVdTQ3JlZGVudGlhbHMnO1xuaW1wb3J0IHsgZ2V0RW52aXJvbm1lbnROYW1lIH0gZnJvbSAnLi9nZXRFbnZpcm9ubWVudE5hbWUnO1xuaW1wb3J0IHsgZ2V0UHJvZHVjdCB9IGZyb20gJy4vZ2V0UHJvZHVjdCc7XG5pbXBvcnQgeyByZXN0YXJ0Q2x1c3RlciB9IGZyb20gJy4vcmVzdGFydENsdXN0ZXInO1xuY29uc3QgcHJvZ3Jlc3NCYXIgPSBuZXcgU2luZ2xlQmFyKHtcbiAgICBmb3JtYXQ6ICcgIFt7YmFyfV0ge3BlcmNlbnRhZ2V9JSB8IEVUQToge2V0YV9mb3JtYXR0ZWR9bScsXG4gICAgZm9ybWF0VGltZTogKHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gcHJvZ3Jlc3NCYXIuZ2V0VG90YWwoKSAvIDYwO1xuICAgICAgICBjb25zdCB0aW1lUGFzc2VkID0gcm91bmQoKHByb2dyZXNzQmFyLmdldFRvdGFsKCkgLSB2YWx1ZSkgLyA2MCwgMC41KTtcbiAgICAgICAgcmV0dXJuIHRpbWVQYXNzZWQgPT09IHRvdGFsID8gYCR7dG90YWx9YCA6IGAke3RvdGFsIC0gdGltZVBhc3NlZH1gO1xuICAgIH0sXG4gICAgaGlkZUN1cnNvcjogdHJ1ZVxufSwgUHJlc2V0cy5sZWdhY3kpO1xuY29uc3Qgcm91bmQgPSAodmFsdWUsIHN0ZXAgPSAxLjApID0+IHtcbiAgICBjb25zdCBpbnYgPSAxLjAgLyBzdGVwO1xuICAgIHJldHVybiBNYXRoLmZsb29yKHZhbHVlICogaW52KSAvIGludjtcbn07XG5jb25zdCBkb3dubG9hZCA9IGFzeW5jIChhZGRvbktleSkgPT4ge1xuICAgIGNvbnN0IHRtcERpciA9IGpvaW4oaG9tZWRpcigpLCAnLmRjZHgnLCAndG1wJyk7XG4gICAgbGV0IHRtcEZpbGUgPSBqb2luKHRtcERpciwgYWRkb25LZXkpO1xuICAgIG1rZGlyU3luYyh0bXBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGxldCBkb3dubG9hZFVybCA9IGBodHRwczovL21hcmtldHBsYWNlLmF0bGFzc2lhbi5jb20vZG93bmxvYWQvcGx1Z2lucy8ke2FkZG9uS2V5fWA7XG4gICAgY29uc3QgeyBkYXRhOiBsaXN0aW5nIH0gPSBhd2FpdCBheGlvcy5nZXQoYGh0dHBzOi8vbWFya2V0cGxhY2UuYXRsYXNzaWFuLmNvbS9yZXN0LzIvYWRkb25zLyR7YWRkb25LZXl9P2hvc3Rpbmc9ZGF0YWNlbnRlciZ3aXRoVmVyc2lvbj10cnVlYCkuY2F0Y2goKCkgPT4gKHsgZGF0YTogbnVsbCB9KSk7XG4gICAgaWYgKGxpc3RpbmcpIHtcbiAgICAgICAgZG93bmxvYWRVcmwgPSBsaXN0aW5nLl9lbWJlZGRlZD8udmVyc2lvbj8uX2VtYmVkZGVkPy5hcnRpZmFjdD8uX2xpbmtzPy5iaW5hcnk/LmhyZWYgfHwgZG93bmxvYWRVcmw7XG4gICAgfVxuICAgIGF3YWl0IGF4aW9zKHtcbiAgICAgICAgbWV0aG9kOiAnZ2V0JyxcbiAgICAgICAgdXJsOiBkb3dubG9hZFVybCxcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnc3RyZWFtJ1xuICAgIH0pLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICBjb25zdCBkaXNwb3NpdGlvbiA9IHBhcnNlKHJlc3BvbnNlLmhlYWRlcnNbJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSk7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gZGlzcG9zaXRpb24/LnBhcmFtZXRlcnM/LmZpbGVuYW1lIHx8IGFkZG9uS2V5O1xuICAgICAgICB0bXBGaWxlID0gZmlsZW5hbWU7XG4gICAgICAgIHJlc3BvbnNlLmRhdGEucGlwZShjcmVhdGVXcml0ZVN0cmVhbSh0bXBGaWxlKSk7XG4gICAgfSkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgcmV0dXJuIHRtcEZpbGU7XG59O1xuZXhwb3J0IGNvbnN0IGluc3RhbGxBcHAgPSBhc3luYyAob3B0aW9ucykgPT4ge1xuICAgIC8vIFNldCBkZWZhdWx0IHZhbHVlIGZvciB1c2VybmFtZS9wYXNzd29yZFxuICAgIGNvbnN0IHVzZXJuYW1lID0gb3B0aW9ucy51c2VybmFtZSB8fCAnYWRtaW4nO1xuICAgIGNvbnN0IHBhc3N3b3JkID0gb3B0aW9ucy5wYXNzd29yZCB8fCAnYWRtaW4nO1xuICAgIC8vIElmIHdlIGFyZSBpbiBub24taW50ZXJhY3RpdmUgbW9kZSwgd2Ugd2lsbCBkb3dubG9hZCBpdCBmcm9tIE1QQUNcbiAgICBpZiAob3B0aW9ucy5mb3JjZSkge1xuICAgICAgICAvLyBJbiBvcmRlciB0byBkbyBzbywgd2UgbmVlZCBhbiBhcHBrZXkuIElmIHRoaXMgaXMgbm90IHByb3ZpZGVkLCB0aHJvdyBhIGhpc3N5IGZpdFxuICAgICAgICBpZiAoIW9wdGlvbnMuYXBwS2V5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBhdXRvbWF0aWNhbGx5IGluc3RhbGwgYXBwIGludG8gY2x1c3RlciwgYGFwcEtleWAgd2FzIG5vdCBwcm92aWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdldCB0aGUgYXBwIGxpY2Vuc2VcbiAgICAgICAgY29uc3QgYXBwTGljZW5zZSA9IGF3YWl0IGdldEFwcExpY2Vuc2Uob3B0aW9ucy5saWNlbnNlLCBvcHRpb25zLmZvcmNlKTtcbiAgICAgICAgLy8gRG93bmxvYWQgdGhlIGZpbGUgZnJvbSBNUEFDXG4gICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBkb3dubG9hZChvcHRpb25zLmFwcEtleSk7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGxldCB0aW1lcklkID0gbnVsbDtcbiAgICAgICAgbGV0IGlzSW5zdGFsbGVkU3VjY2VzZnVsbHkgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKCFpc0luc3RhbGxlZFN1Y2Nlc2Z1bGx5ICYmIGNvdW50IDw9IDQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBcbiAgSW5zdGFsbGluZyB0aGUgYXBwICgke29wdGlvbnMuYXBwS2V5fSkgaW50byB0aGUgY2x1c3RlciB1c2luZyB0aGUgVW5pdmVyc2FsIFBsdWdpbiBNYW5hZ2VyIFJFU1QgQVBJYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgXG4gIFJldHJ5aW5nIGluc3RhbGxhdGlvbiBvZiB0aGUgYXBwICgke29wdGlvbnMuYXBwS2V5fSkgaW50byB0aGUgY2x1c3RlciB1c2luZyB0aGUgVW5pdmVyc2FsIFBsdWdpbiBNYW5hZ2VyIFJFU1QgQVBJIChhdHRlbXB0ICR7Y291bnQgKyAxfSlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU2hvdyBhIHByb2dyZXNzIGJhclxuICAgICAgICAgICAgICAgIHByb2dyZXNzQmFyLnN0YXJ0KDE4MCwgMCk7XG4gICAgICAgICAgICAgICAgdGltZXJJZCA9IHNldEludGVydmFsKCgpID0+IHByb2dyZXNzQmFyLmluY3JlbWVudCgpLCAxMDAwKTtcbiAgICAgICAgICAgICAgICAvLyBVcGxvYWQgaXQgaW50byB0aGUgY2x1c3RlciB1c2luZyB0aGUgVVBNIFJFU1QgQVBJXG4gICAgICAgICAgICAgICAgY29uc3QgaXNJbnN0YWxsZWQgPSBhd2FpdCB1cGxvYWRUb1VQTShvcHRpb25zLmJhc2VVcmwsIGZpbGUsIHVzZXJuYW1lLCBwYXNzd29yZCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmICghaXNJbnN0YWxsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gaW5zdGFsbCBhcHAgaW50byB0aGUgY2x1c3RlciB1c2luZyB0aGUgVW5pdmVyc2FsIFBsdWdpbiBNYW5hZ2VyIFJFU1QgQVBJJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gcmVzdGFydCB0aGUgYXBwbGljYXRpb24gY29udGFpbmVyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVzdGFydEFmdGVySW5zdGFsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgcmVzdGFydHMsIHRoZSBwcm9kdWN0IG9wdGlvbiBpcyByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMucHJvZHVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyAgRmFpbGVkIHRvIHJlc3RhcnQgYXBwbGljYXRpb24sIHJlcXVpcmVkIG9wdGlvbiBgcHJvZHVjdGAgaXMgbWlzc2luZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHJlc3RhcnRzLCB0aGUgZW52aXJvbm1lbnQgb3B0aW9uIGlzIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIW9wdGlvbnMuZW52aXJvbm1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCcgIEZhaWxlZCB0byByZXN0YXJ0IGFwcGxpY2F0aW9uLCByZXF1aXJlZCBvcHRpb24gYHByb2R1Y3RgIGlzIG1pc3NpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9rLCBnb29kIHRvIGdvIVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT2ggcmlnaHQsIHdlIGFsc28gbmVlZCBEQ0FQVCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHJlc3RhcnQgdGhlIGNsdXN0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN3ZCA9IGF3YWl0IGdldEFwdERpY3Rvcnkob3B0aW9ucy5jd2QsIGZhbHNlLCBvcHRpb25zLmZvcmNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBub3cgZ29pbmcgdG8gcmVzdGFydCB0aGUgY2x1c3RlciBhbmQgaG9wZSBmb3IgdGhlIGJlc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgIFJlc3RhcnRpbmcgJHtvcHRpb25zLnByb2R1Y3R9IHRvIGVuc3VyZSBhcHAgaW5zdGFsbGF0aW9uYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXN0YXJ0Q2x1c3Rlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Q6IG9wdGlvbnMucHJvZHVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudDogb3B0aW9ucy5lbnZpcm9ubWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd3NfYWNjZXNzX2tleV9pZDogb3B0aW9ucy5hd3NfYWNjZXNzX2tleV9pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd3Nfc2VjcmV0X2FjY2Vzc19rZXk6IG9wdGlvbnMuYXdzX3NlY3JldF9hY2Nlc3Nfa2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlOiBvcHRpb25zLmZvcmNlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgcGx1Z2luIHRvIGJlIGVuYWJsZWRcbiAgICAgICAgICAgICAgICBjb25zdCBpc0VuYWJsZWQgPSBhd2FpdCB3YWl0Rm9yUGx1Z2luVG9CZUVuYWJsZWQob3B0aW9ucy5hcHBLZXksIG9wdGlvbnMuYmFzZVVybCwgdXNlcm5hbWUsIHBhc3N3b3JkLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYXBwIGNvdWxkIG5vdCBiZSBlbmFibGVkIG9uIHRoZSBjbHVzdGVyLCBwbGVhc2UgcmVmZXIgdG8gdGhlIGFwcGxpY2F0aW9uIGxvZyBmaWxlcyBmb3IgbW9yZSBpbmZvcm1hdGlvbicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBSZWdpc3RlciB0aGUgbGljZW5zZSAodXNlIHRoZSAzIGhvdXIgdGltZWJvbWIgaW4gbm9uLWludGVyYWN0aXZlIG1vZGUpXG4gICAgICAgICAgICAgICAgY29uc3QgaXNMaWNlbnNlZCA9IGF3YWl0IHJlZ2lzdGVyTGljZW5zZShvcHRpb25zLmFwcEtleSwgYXBwTGljZW5zZSwgb3B0aW9ucy5iYXNlVXJsLCB1c2VybmFtZSwgcGFzc3dvcmQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTGljZW5zZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgbGljZW5zZSBjb3VsZCBub3QgYmUgYXBwbGllZCBmb3IgdGhlIGFwcCBvbiB0aGUgY2x1c3RlciwgcGxlYXNlIHJlZmVyIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2cgZmlsZXMgZm9yIG1vcmUgaW5mb3JtYXRpb24nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXNJbnN0YWxsZWRTdWNjZXNmdWxseSA9IGlzSW5zdGFsbGVkICYmIGlzRW5hYmxlZCAmJiBpc0xpY2Vuc2VkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChjb3VudCA8PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdhaXQgYSBtaW51dGUgKGNvb2xkb3duIHBlcmlvZCkgYmVmb3JlIHJldHJ5aW5nXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDAwKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgICAgICAvLyBTdG9wIHRoZSBwcm9ncmVzcyBiYXJcbiAgICAgICAgICAgICAgICBwcm9ncmVzc0Jhci5zdG9wKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRpbWVySWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcklkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSB0ZW1wb3JhcnkgZmlsZVxuICAgICAgICBybVN5bmMoZmlsZSwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgICAgLy8gVGVsbCB0aGVtIHdlIHN1Y2NlZWRlZFxuICAgICAgICBjb25zb2xlLmxvZyhg4pyUIEZpbmlzaGVkIGluc3RhbGxpbmcgdGhlIGFwcCAoJHtvcHRpb25zLmFwcEtleX0pYCk7XG4gICAgICAgIC8vIElmIHdlJ3JlIGluIGludGVyYWN0aXZlIG1vZGUsIGxldCdzIGJlIG5pY2VcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFRlbGwgdGhlIHVzZXIgdGhleSBoYXZlIG9wdGlvbnNcbiAgICAgICAgY29uc29sZS5sb2coYFxuICBJdCBpcyBub3cgcmVxdWlyZWQgdG8gaW5zdGFsbCB0aGUgYXBwIGludG8gdGhlIEppcmEgY2x1c3Rlci5cbiAgV2UgY2FuIGluc3RhbGwgaXQgZnJvbSB0aGUgQXRsYXNzaWFuIE1hcmtldHBsYWNlIG9yIHlvdSBjYW4gaW5zdGFsbCBpdCBtYW51YWxseS5cbmApO1xuICAgICAgICAvLyBBc2sgdGhlbSBpZiB0aGV5IHByZWZlciBhdXRvbWF0aW9uIG9yIHRlZGlvdXMgbWFudWFsIHRhc2tzXG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IGF3YWl0IHNlbGVjdCh7XG4gICAgICAgICAgICBtZXNzYWdlOiBgSG93IGRvIHlvdSB3YW50IHRvIGluc3RhbGwgdGhlIGFwcD9gLFxuICAgICAgICAgICAgZGVmYXVsdDogJ21wYWMnLFxuICAgICAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICAgICAgIHsgbmFtZTogJ01hcmtldHBsYWNlJywgdmFsdWU6ICdtcGFjJyB9LFxuICAgICAgICAgICAgICAgIHsgbmFtZTogJ01hbnVhbCcsIHZhbHVlOiAnbWFudWFsJyB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBJZiB0aGV5IGNob3NlIGF1dG9tYXRpb24sIGxldCdzIGF1dG9tYXRlIVxuICAgICAgICBpZiAobWV0aG9kID09PSAnbXBhYycpIHtcbiAgICAgICAgICAgIC8vIEFzayB0aGVtIG5pY2VseSBmb3IgdGhlIGFwcCBrZXlcbiAgICAgICAgICAgIGNvbnN0IGFkZG9uS2V5ID0gYXdhaXQgaW5wdXQoe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdQbGVhc2UgcHJvdmlkZSB0aGUga2V5IG9mIHRoZSBhcHAgdG8gYmUgaW5zdGFsbGVkJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBvcHRpb25zLmFwcEtleSxcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBBc2sgdGhlbSBuaWNlbHkgZm9yIHRoZSBhcHAgbGljZW5zZSB0byBiZSB1c2VkXG4gICAgICAgICAgICBjb25zdCBhcHBMaWNlbnNlID0gYXdhaXQgZ2V0QXBwTGljZW5zZShvcHRpb25zLmxpY2Vuc2UsIG9wdGlvbnMuZm9yY2UpO1xuICAgICAgICAgICAgLy8gQXNrIHRoZW0gbmljZWx5IGZvciB0aGUgdXNlcm5hbWVcbiAgICAgICAgICAgIGNvbnN0IGFkbWluVXNlcm5hbWUgPSBhd2FpdCBpbnB1dCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ1BsZWFzZSBwcm92aWRlIHRoZSB1c2VybmFtZSBvZiBhIHN5c3RlbSBhZG1pbmlzdHJhdG9yJyxcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB1c2VybmFtZSxcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBBc2sgdGhlbSBuaWNlbHkgZm9yIHRoZSB1c2VybmFtZVxuICAgICAgICAgICAgY29uc3QgYWRtaW5QYXNzd29yZCA9IGF3YWl0IHBhc3N3b3JkUHJvbXB0KHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUGxlYXNlIHByb3ZpZGUgdGhlIHVzZXJuYW1lIG9mIGEgc3lzdGVtIGFkbWluaXN0cmF0b3InLFxuICAgICAgICAgICAgICAgIHZhbGlkYXRlOiBpdGVtID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyAmJiBpdGVtLmxlbmd0aCA+IDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQXNrIHRoZW0gbmljZWx5IGlmIHdlIG5lZWQgdG8gcmVzdGFydCB0aGUgYXBwbGljYXRpb25cbiAgICAgICAgICAgIGNvbnN0IHJlc3RhcnRBZnRlckluc3RhbGwgPSBhd2FpdCBjb25maXJtKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUmVzdGFydCB0aGUgaG9zdCBhcHBsaWNhdGlvbiBhZnRlciBpbnN0YWxsYXRpb24/JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gVGVsbCB0aGVtIHdlIGFyZSBzdGFydGluZ1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFxuICBJbnN0YWxsaW5nIHRoZSBhcHAgKCR7YWRkb25LZXl9KSBpbnRvIHRoZSBjbHVzdGVyIHVzaW5nIHRoZSBVbml2ZXJzYWwgUGx1Z2luIE1hbmFnZXIgUkVTVCBBUElgKTtcbiAgICAgICAgICAgIC8vIFNob3cgYSBwcm9ncmVzcyBiYXJcbiAgICAgICAgICAgIHByb2dyZXNzQmFyLnN0YXJ0KDE4MCwgMCk7XG4gICAgICAgICAgICBjb25zdCB0aW1lcklkID0gc2V0SW50ZXJ2YWwoKCkgPT4gcHJvZ3Jlc3NCYXIuaW5jcmVtZW50KCksIDEwMDApO1xuICAgICAgICAgICAgLy8gRG93bmxvYWQgdGhlIGZpbGUgZnJvbSBNUEFDXG4gICAgICAgICAgICBjb25zdCBmaWxlID0gYXdhaXQgZG93bmxvYWQoYWRkb25LZXkpO1xuICAgICAgICAgICAgLy8gVXBsb2FkIGl0IGludG8gdGhlIGNsdXN0ZXIgdXNpbmcgdGhlIFVQTSBSRVNUIEFQSVxuICAgICAgICAgICAgY29uc3QgaXNJbnN0YWxsZWQgPSBhd2FpdCB1cGxvYWRUb1VQTShvcHRpb25zLmJhc2VVcmwsIGZpbGUsIGFkbWluVXNlcm5hbWUsIGFkbWluUGFzc3dvcmQsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghaXNJbnN0YWxsZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBpbnN0YWxsIGFwcCBpbnRvIHRoZSBjbHVzdGVyIHVzaW5nIHRoZSBVbml2ZXJzYWwgUGx1Z2luIE1hbmFnZXIgUkVTVCBBUEknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gcmVzdGFydCB0aGUgYXBwbGljYXRpb24gY29udGFpbmVyXG4gICAgICAgICAgICBpZiAocmVzdGFydEFmdGVySW5zdGFsbCkge1xuICAgICAgICAgICAgICAgIC8vIEFzayB0aGVtIG5pY2VseSBmb3IgdGhlIGhvc3QgcHJvZHVjdFxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2R1Y3QgPSBvcHRpb25zLnByb2R1Y3QgfHwgYXdhaXQgZ2V0UHJvZHVjdCgpO1xuICAgICAgICAgICAgICAgIC8vIEFzayBmb3IgdGhlIEFXUyBjcmVkZW50aWFsc1xuICAgICAgICAgICAgICAgIGNvbnN0IFthd3NfYWNjZXNzX2tleV9pZCwgYXdzX3NlY3JldF9hY2Nlc3Nfa2V5XSA9IGF3YWl0IGdldEFXU0NyZWRlbnRpYWxzKHByb2R1Y3QsIG9wdGlvbnMuZm9yY2UpO1xuICAgICAgICAgICAgICAgIC8vIEFzayBmb3IgdGhlIGVudmlyb25tZW50IG5hbWVcbiAgICAgICAgICAgICAgICBjb25zdCBlbnZpcm9ubWVudCA9IG9wdGlvbnMuZW52aXJvbm1lbnQgfHwgYXdhaXQgZ2V0RW52aXJvbm1lbnROYW1lKCk7XG4gICAgICAgICAgICAgICAgLy8gT2ggcmlnaHQsIHdlIGFsc28gbmVlZCBEQ0FQVCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHJlc3RhcnQgdGhlIGNsdXN0ZXJcbiAgICAgICAgICAgICAgICBjb25zdCBjd2QgPSBhd2FpdCBnZXRBcHREaWN0b3J5KG9wdGlvbnMuY3dkLCBmYWxzZSwgb3B0aW9ucy5mb3JjZSk7XG4gICAgICAgICAgICAgICAgLy8gV2UgYXJlIG5vdyBnb2luZyB0byByZXN0YXJ0IHRoZSBjbHVzdGVyIGFuZCBob3BlIGZvciB0aGUgYmVzdFxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgIFJlc3RhcnRpbmcgJHtvcHRpb25zLnByb2R1Y3R9IHRvIGVuc3VyZSBhcHAgaW5zdGFsbGF0aW9uYCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcmVzdGFydENsdXN0ZXIoe1xuICAgICAgICAgICAgICAgICAgICBjd2QsXG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3Q6IHByb2R1Y3QsXG4gICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50OiBlbnZpcm9ubWVudCxcbiAgICAgICAgICAgICAgICAgICAgYXdzX2FjY2Vzc19rZXlfaWQ6IGF3c19hY2Nlc3Nfa2V5X2lkLFxuICAgICAgICAgICAgICAgICAgICBhd3Nfc2VjcmV0X2FjY2Vzc19rZXk6IGF3c19zZWNyZXRfYWNjZXNzX2tleSxcbiAgICAgICAgICAgICAgICAgICAgZm9yY2U6IG9wdGlvbnMuZm9yY2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBwbHVnaW4gdG8gYmUgZW5hYmxlZFxuICAgICAgICAgICAgY29uc3QgaXNFbmFibGVkID0gYXdhaXQgd2FpdEZvclBsdWdpblRvQmVFbmFibGVkKGFkZG9uS2V5LCBvcHRpb25zLmJhc2VVcmwsIGFkbWluVXNlcm5hbWUsIGFkbWluUGFzc3dvcmQsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmICghaXNFbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYXBwIGNvdWxkIG5vdCBiZSBlbmFibGVkIG9uIHRoZSBjbHVzdGVyLCBwbGVhc2UgcmVmZXIgdG8gdGhlIGFwcGxpY2F0aW9uIGxvZyBmaWxlcyBmb3IgbW9yZSBpbmZvcm1hdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIHByb3ZpZGVkIGxpY2Vuc2VcbiAgICAgICAgICAgIGNvbnN0IGlzTGljZW5zZWQgPSBhd2FpdCByZWdpc3RlckxpY2Vuc2UoYWRkb25LZXksIGFwcExpY2Vuc2UsIG9wdGlvbnMuYmFzZVVybCwgYWRtaW5Vc2VybmFtZSwgYWRtaW5QYXNzd29yZCwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKCFpc0xpY2Vuc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgbGljZW5zZSBjb3VsZCBub3QgYmUgYXBwbGllZCBmb3IgdGhlIGFwcCBvbiB0aGUgY2x1c3RlciwgcGxlYXNlIHJlZmVyIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2cgZmlsZXMgZm9yIG1vcmUgaW5mb3JtYXRpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdGVtcG9yYXJ5IGZpbGVcbiAgICAgICAgICAgIHJtU3luYyhmaWxlLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICAgICAgLy8gU3RvcCB0aGUgcHJvZ3Jlc3MgYmFyXG4gICAgICAgICAgICBwcm9ncmVzc0Jhci5zdG9wKCk7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRpbWVySWQpO1xuICAgICAgICAgICAgLy8gVGVsbCB0aGVtIHdlIHN1Y2NlZWRlZFxuICAgICAgICAgICAgY29uc29sZS5sb2coYOKclCBGaW5pc2hlZCBpbnN0YWxsaW5nIHRoZSBhcHAgKCR7YWRkb25LZXl9KWApO1xuICAgICAgICAgICAgLy8gVGhleSBjaG9zZSB2aW9sZW5jZVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gUnViIGl0IGluIHRoZWlyIGZhY2VcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBcbiAgWW91IGNhbiBub3cgaW5zdGFsbCB0aGUgYXBwIG1hbnVhbGx5IGludG8gdGhlIGNsdXN0ZXIuXG4gIFBsZWFzZSBnbyB0byB0aGUgZm9sbG93aW5nIHBhZ2U6XG4gICAgXG4gICR7b3B0aW9ucy5iYXNlVXJsfS9wbHVnaW5zL3NlcnZsZXQvdXBtP3NvdXJjZT1zaWRlX25hdl9tYW5hZ2VfYWRkb25zXG5gKTtcbiAgICAgICAgICAgIC8vIE1ha2UgdGhlbSBncm92ZWxcbiAgICAgICAgICAgIGNvbnN0IGlzSW5zdGFsbGVkTWFudWFsbHkgPSBhd2FpdCBjb25maXJtKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgUGxlYXNlIGNvbmZpcm0gdGhhdCB5b3UgaGF2ZSBpbnN0YWxsZWQgdGhlIGFwcCBtYW51YWxseWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gSWYgdGhlIGFwcCBhaW4ndCBpbnN0YWxsZWQsIHdlIGFpbid0IGRvaW5nIG5vdGhpbicuIFNvIHdlIGJldHRlciB0aHJvdyBhIGhpc3N5IGZpdFxuICAgICAgICAgICAgaWYgKCFpc0luc3RhbGxlZE1hbnVhbGx5KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJdCBpcyByZXF1aXJlZCB0byBpbnN0YWxsIHRoZSBhcHAgdG8gcnVuIHRoZSBzZWNvbmQgcGVyZm9ybWFuY2UgcmVncmVzc2lvbiB0ZXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuIiwiaW1wb3J0IHsgYXN5bmNFeGl0SG9vaywgZ3JhY2VmdWxFeGl0IH0gZnJvbSAnZXhpdC1ob29rJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuZXhwb3J0IGNvbnN0IEFjdGlvbkhhbmRsZXIgPSBhc3luYyAocHJvZ3JhbSwgeyBhY3Rpb24sIGVycm9ySGFuZGxlciB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3BzID0gb3B0aW9ucyB8fCBwcm9ncmFtLm9wdHMoKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgoXywgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSAnJztcbiAgICAgICAgYXN5bmNFeGl0SG9vayhhc3luYyAoY29kZSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlcnJvckhhbmRsZXIob3BzKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgcmVqZWN0aW5nIHRoZSBwcm9taXNlIHRvIGF2b2lkIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBcIkNhbGxpbmcgcHJvY2Vzcy5leGl0XCIgbG9nIG1lc3NhZ2UgZnJvbSBleGl0LWhvb2tcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycjtcbiAgICAgICAgICAgICAgICByZWplY3QobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHdhaXQ6IDYwICogMSAqIDEwMDBcbiAgICAgICAgfSk7XG4gICAgICAgIGFjdGlvbihvcHMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZ3JhY2VmdWxFeGl0KDApO1xuICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIHouWm9kRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnIuaXNzdWVzLmZvckVhY2goaXNzdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFVuYWJsZSB0byBwYXJzZSBvcHRpb24gJHtpc3N1ZS5wYXRoLmpvaW4oJywnKX06ICR7aXNzdWUubWVzc2FnZX1cXG5gO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgfHwgdHlwZW9mIGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnIudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyYWNlZnVsRXhpdCgxKTtcbiAgICAgICAgfSk7XG4gICAgfSkuY2F0Y2gobWVzc2FnZSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwcm9ncmFtLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZSxcbiAgICAgICAgICAgIC8vIHdlIGNhbiBhc3N1bWUgYSBjbGVhbiBleGl0XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB2ZXJzaW9ucyBmcm9tICcuLi8uLi9hc3NldHMvdmVyc2lvbnMuanNvbic7XG5leHBvcnQgY29uc3QgU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzID0gei5lbnVtKFtcbiAgICAncG9zdGdyZXNxbCcsXG4gICAgJ215c3FsJyxcbiAgICAnbXNzcWwnXG5dKTtcbmV4cG9ydCBjb25zdCBTdXBwb3J0ZWRNU1NRTEVkaXRpb25zID0gei5lbnVtKFtcbiAgICAnRGV2ZWxvcGVyJyxcbiAgICAnRXhwcmVzcycsXG4gICAgJ1N0YW5kYXJkJyxcbiAgICAnRW50ZXJwcmlzZScsXG4gICAgJ0VudGVycHJpc2VDb3JlJ1xuXSk7XG5leHBvcnQgY29uc3QgRGF0YWJhc2VPcHRpb25zID0gei5vYmplY3Qoe1xuICAgIG5hbWU6IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcyxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkudHJhbnNmb3JtKE51bWJlcikucmVmaW5lKGl0ZW0gPT4gIWlzTmFOKGl0ZW0pKSksXG4gICAgZGF0YWJhc2U6IHouc3RyaW5nKCkuZGVmYXVsdCgnZGNkeCcpLFxuICAgIHVzZXJuYW1lOiB6LnN0cmluZygpLmRlZmF1bHQoJ2RjZHgnKSxcbiAgICBwYXNzd29yZDogei5zdHJpbmcoKS5kZWZhdWx0KCdkY2R4JyksXG4gICAgY2xlYW46IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICAgIHBydW5lOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgICB2ZXJib3NlOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgICBkcml2ZXI6IHouc3RyaW5nKClcbn0pO1xuZXhwb3J0IGNvbnN0IFBvc3RncmVTUUxPcHRpb25zID0gRGF0YWJhc2VPcHRpb25zLmV4dGVuZCh7XG4gICAgbmFtZTogU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzLnJlZmluZShpdGVtID0+IGl0ZW0gPT09IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5WYWx1ZXMucG9zdGdyZXNxbCkuZGVmYXVsdChTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLnBvc3RncmVzcWwpLFxuICAgIHRhZzogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiB2ZXJzaW9uc1tTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLnBvc3RncmVzcWxdLmluY2x1ZGVzKGl0ZW0pKS5kZWZhdWx0KCdsYXRlc3QnKSxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkudHJhbnNmb3JtKE51bWJlcikucmVmaW5lKGl0ZW0gPT4gIWlzTmFOKGl0ZW0pKSkuZGVmYXVsdCg1NDMyKSxcbiAgICBkcml2ZXI6IHouc3RyaW5nKCkucmVmaW5lKGl0ZW0gPT4gaXRlbSA9PT0gJ29yZy5wb3N0Z3Jlc3FsLkRyaXZlcicpLmRlZmF1bHQoJ29yZy5wb3N0Z3Jlc3FsLkRyaXZlcicpXG59KTtcbmV4cG9ydCBjb25zdCBNeVNRTE9wdGlvbnMgPSBEYXRhYmFzZU9wdGlvbnMuZXh0ZW5kKHtcbiAgICBuYW1lOiBTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMucmVmaW5lKGl0ZW0gPT4gaXRlbSA9PT0gU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzLlZhbHVlcy5teXNxbCkuZGVmYXVsdChTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLm15c3FsKSxcbiAgICB0YWc6IHouc3RyaW5nKCkucmVmaW5lKGl0ZW0gPT4gdmVyc2lvbnNbU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzLlZhbHVlcy5teXNxbF0uaW5jbHVkZXMoaXRlbSkpLmRlZmF1bHQoJ2xhdGVzdCcpLFxuICAgIHBvcnQ6IHoubnVtYmVyKCkub3Ioei5zdHJpbmcoKS50cmFuc2Zvcm0oTnVtYmVyKS5yZWZpbmUoaXRlbSA9PiAhaXNOYU4oaXRlbSkpKS5kZWZhdWx0KDMzMDYpLFxuICAgIGRyaXZlcjogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiBpdGVtID09PSAnY29tLm15c3FsLmpkYmMuRHJpdmVyJykuZGVmYXVsdCgnY29tLm15c3FsLmpkYmMuRHJpdmVyJylcbn0pO1xuZXhwb3J0IGNvbnN0IE1TU1FMT3B0aW9ucyA9IERhdGFiYXNlT3B0aW9ucy5leHRlbmQoe1xuICAgIG5hbWU6IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5yZWZpbmUoaXRlbSA9PiBpdGVtID09PSBTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLm1zc3FsKS5kZWZhdWx0KFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5WYWx1ZXMubXNzcWwpLFxuICAgIHRhZzogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiB2ZXJzaW9uc1tTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLm1zc3FsXS5pbmNsdWRlcyhpdGVtKSkuZGVmYXVsdCgnbGF0ZXN0JyksXG4gICAgZWRpdGlvbjogU3VwcG9ydGVkTVNTUUxFZGl0aW9ucy5kZWZhdWx0KCdEZXZlbG9wZXInKSxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkudHJhbnNmb3JtKE51bWJlcikucmVmaW5lKGl0ZW0gPT4gIWlzTmFOKGl0ZW0pKSkuZGVmYXVsdCgxNDMzKSxcbiAgICB1c2VybmFtZTogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiBpdGVtID09PSAnc2EnKS5kZWZhdWx0KCdzYScpLFxuICAgIHBhc3N3b3JkOiB6LnN0cmluZygpLmRlZmF1bHQoJ0RhdGFDZW50ZXJEWCEnKSxcbiAgICBkcml2ZXI6IHouc3RyaW5nKCkucmVmaW5lKGl0ZW0gPT4gaXRlbSA9PT0gJ2NvbS5taWNyb3NvZnQuc3Fsc2VydmVyLmpkYmMuU1FMU2VydmVyRHJpdmVyJykuZGVmYXVsdCgnY29tLm1pY3Jvc29mdC5zcWxzZXJ2ZXIuamRiYy5TUUxTZXJ2ZXJEcml2ZXInKVxufSk7XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcyB9IGZyb20gJy4vRGF0YWJhc2UnO1xuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZEFwcGxpY2F0aW9ucyA9IHouZW51bShbXG4gICAgJ2ppcmEnLFxuICAgICdjb25mbHVlbmNlJyxcbiAgICAnYml0YnVja2V0JyxcbiAgICAnYmFtYm9vJ1xuXSk7XG5leHBvcnQgY29uc3QgQXBwbGljYXRpb25PcHRpb25zID0gei5vYmplY3Qoe1xuICAgIG5hbWU6IFN1cHBvcnRlZEFwcGxpY2F0aW9ucyxcbiAgICB0YWc6IHouc3RyaW5nKCkuZGVmYXVsdCgnbGF0ZXN0JyksXG4gICAgZGF0YWJhc2U6IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5kZWZhdWx0KCdwb3N0Z3Jlc3FsJyksXG4gICAgZGF0YWJhc2VUYWc6IHouc3RyaW5nKCkuZGVmYXVsdCgnbGF0ZXN0JyksXG4gICAgcG9ydDogei5zdHJpbmcoKS50cmFuc2Zvcm0oTnVtYmVyKS5yZWZpbmUoaXRlbSA9PiAhaXNOYU4oaXRlbSkpLmRlZmF1bHQoJzgwJyksXG4gICAgY29udGV4dFBhdGg6IHouc3RyaW5nKCksXG4gICAgeG1zOiB6LnN0cmluZygpLmRlZmF1bHQoJzEwMjRtJyksXG4gICAgeG14OiB6LnN0cmluZygpLmRlZmF1bHQoJzEwMjRtJyksXG4gICAgd2F0Y2g6IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICAgIGV4dDogei5hcnJheSh6LnN0cmluZygpKSxcbiAgICBpbnN0YWxsOiB6LmJvb2xlYW4oKSxcbiAgICBvdXRwdXREaXJlY3Rvcnk6IHouc3RyaW5nKCksXG4gICAgYWN0aXZhdGVQcm9maWxlczogei5zdHJpbmcoKSxcbiAgICBjbGVhbjogei5ib29sZWFuKCkuZGVmYXVsdChmYWxzZSksXG4gICAgcHJ1bmU6IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICAgIGRlYnVnOiB6LmJvb2xlYW4oKS5kZWZhdWx0KHRydWUpLFxuICAgIGN3ZDogei5zdHJpbmcoKVxufSkucGFydGlhbCh7XG4gICAgY29udGV4dFBhdGg6IHRydWUsXG4gICAgZXh0OiB0cnVlLFxuICAgIGluc3RhbGw6IHRydWUsXG4gICAgb3V0cHV0RGlyZWN0b3J5OiB0cnVlLFxuICAgIGFjdGl2YXRlUHJvZmlsZXM6IHRydWUsXG4gICAgY3dkOiB0cnVlXG59KTtcbiIsImltcG9ydCB7IERPTVBhcnNlciwgWE1MU2VyaWFsaXplciB9IGZyb20gJ0B4bWxkb20veG1sZG9tJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBYTUxQYXJzZXIgfSBmcm9tICdmYXN0LXhtbC1wYXJzZXInO1xuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgY3dkIH0gZnJvbSAncHJvY2Vzcyc7XG5pbXBvcnQgeHBhdGggZnJvbSAneHBhdGgnO1xuaW1wb3J0IHsgU3VwcG9ydGVkQXBwbGljYXRpb25zIH0gZnJvbSAnLi4vdHlwZXMvQXBwbGljYXRpb24nO1xuZXhwb3J0IGNsYXNzIEFNUFMge1xuICAgIG9wdGlvbnM7XG4gICAgbWF2ZW4gPSBudWxsO1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7XG4gICAgICAgIHByb2ZpbGVzOiBbXVxuICAgIH0pIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzXG4gICAgc3RvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMubWF2ZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGtpbGxlZCA9IHRoaXMubWF2ZW4ua2lsbCgwKTtcbiAgICAgICAgICAgIGlmICgha2lsbGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gdGVybWluYXRlIGV4aXN0aW5nIE1hdmVuIHByb2Nlc3MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBidWlsZChhcmdzKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5tYXZlbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtpbGxlZCA9IHRoaXMubWF2ZW4ua2lsbCgwKTtcbiAgICAgICAgICAgICAgICBpZiAoIWtpbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gdGVybWluYXRlIGV4aXN0aW5nIE1hdmVuIHByb2Nlc3MnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tYXZlbiA9IHNwYXduKCdtdm4nLCBbJ3BhY2thZ2UnLCAuLi5hcmdzXSwgeyBjd2Q6IHRoaXMub3B0aW9ucz8uY3dkIHx8IGN3ZCgpLCBzdGRpbzogJ2luaGVyaXQnIH0pO1xuICAgICAgICAgICAgdGhpcy5tYXZlbi5vbignZXhpdCcsIChjb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXZlbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IDAgfHwgY29kZSA9PT0gMTMwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYE1hdmVuIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlzQXRsYXNzaWFuUGx1Z2luID0gKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLmdldE5vZGVzKCcvLypbbG9jYWwtbmFtZSgpPVxcJ3BhY2thZ2luZ1xcJ10nKTtcbiAgICAgICAgICAgIHJldHVybiBub2Rlcy5zb21lKGl0ZW0gPT4gaXRlbS50ZXh0Q29udGVudCA9PT0gJ2F0bGFzc2lhbi1wbHVnaW4nKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGdldEFwcGxpY2F0aW9uVmVyc2lvbigpIHtcbiAgICAgICAgY29uc3QgYXBwbGljYXRpb25zID0gdGhpcy5nZXRBcHBsaWNhdGlvbnMoKTtcbiAgICAgICAgaWYgKGFwcGxpY2F0aW9ucy5zaXplID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBbLCB2ZXJzaW9uXSA9IEFycmF5LmZyb20oYXBwbGljYXRpb25zKVswXTtcbiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGFwcGxpY2F0aW9ucy5zaXplID4gMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgQXRsYXNzaWFuIFBsdWdpbiBwcm9qZWN0IGNvbnRhaW5zIG11bHRpcGxlIEFNUFMgY29uZmlndXJhdGlvbiwgdW5hYmxlIHRvIGRlY2lkZSB3aGljaCBwcm9kdWN0IHRvIHVzZSDwn5iwJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0QXBwbGljYXRpb24oKSB7XG4gICAgICAgIGNvbnN0IGFwcGxpY2F0aW9ucyA9IHRoaXMuZ2V0QXBwbGljYXRpb25zKCk7XG4gICAgICAgIGlmIChhcHBsaWNhdGlvbnMuc2l6ZSA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3QgW25hbWVdID0gQXJyYXkuZnJvbShhcHBsaWNhdGlvbnMpWzBdO1xuICAgICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYXBwbGljYXRpb25zLnNpemUgPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBBdGxhc3NpYW4gUGx1Z2luIHByb2plY3QgY29udGFpbnMgbXVsdGlwbGUgQU1QUyBjb25maWd1cmF0aW9uLCB1bmFibGUgdG8gZGVjaWRlIHdoaWNoIHByb2R1Y3QgdG8gdXNlIPCfmLAnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZ2V0QXBwbGljYXRpb25zKCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5nZXROb2RlcygnLy8qW2xvY2FsLW5hbWUoKT1cXCdncm91cElkXFwnIGFuZCB0ZXh0KCk9XFwnY29tLmF0bGFzc2lhbi5tYXZlbi5wbHVnaW5zXFwnXScpO1xuICAgICAgICBjb25zdCBub2Rlc1dpdGhBY3RpdmVQcm9maWxlID0gbm9kZXMuZmlsdGVyKG5vZGUgPT4gdGhpcy5pc0FjdGl2YXRlZFByb2ZpbGUobm9kZSkpO1xuICAgICAgICBub2Rlc1dpdGhBY3RpdmVQcm9maWxlLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHBsdWdpbiB9ID0gdGhpcy50b09iamVjdChwYXJlbnROb2RlKTtcbiAgICAgICAgICAgICAgICBpZiAoJ2FtcHMtbWF2ZW4tcGx1Z2luJyA9PT0gcGx1Z2luPy5hcnRpZmFjdElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgY29uZmlndXJhdGlvbiB9ID0gcGx1Z2luIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbj8ucHJvZHVjdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZ3VyYXRpb24/LnByb2R1Y3RzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24ucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXBwb3J0ZWRBcHBsaWNhdGlvbiA9IHRoaXMuZ2V0U3VwcG9ydGVkQXBwbGljYXRpb24ocHJvZHVjdC5pZCkgfHwgdGhpcy5nZXRTdXBwb3J0ZWRBcHBsaWNhdGlvbihwcm9kdWN0Lmluc3RhbmNlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydGVkQXBwbGljYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmRvUHJvcGVydHlSZXBsYWNlbWVudChwcm9kdWN0LnZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0KHN1cHBvcnRlZEFwcGxpY2F0aW9uLCB2ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBwcm9kdWN0IH0gPSBjb25maWd1cmF0aW9uPy5wcm9kdWN0cyB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvZHVjdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXBwb3J0ZWRBcHBsaWNhdGlvbiA9IHRoaXMuZ2V0U3VwcG9ydGVkQXBwbGljYXRpb24ocHJvZHVjdC5pZCkgfHwgdGhpcy5nZXRTdXBwb3J0ZWRBcHBsaWNhdGlvbihwcm9kdWN0Lmluc3RhbmNlSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydGVkQXBwbGljYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmRvUHJvcGVydHlSZXBsYWNlbWVudChwcm9kdWN0LnZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0KHN1cHBvcnRlZEFwcGxpY2F0aW9uLCB2ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VwcG9ydGVkQXBwbGljYXRpb24gPSB0aGlzLmdldFN1cHBvcnRlZEFwcGxpY2F0aW9uKHBsdWdpbj8uYXJ0aWZhY3RJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmdldFZlcnNpb24obm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0ZWRBcHBsaWNhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNldChzdXBwb3J0ZWRBcHBsaWNhdGlvbiwgdmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJpdmF0ZSBNZXRob2RzXG4gICAgZ2V0U3VwcG9ydGVkQXBwbGljYXRpb24odmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlPy5pbmNsdWRlcyhTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmppcmEpKSB7XG4gICAgICAgICAgICByZXR1cm4gU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5qaXJhO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlPy5pbmNsdWRlcyhTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmNvbmZsdWVuY2UpKSB7XG4gICAgICAgICAgICByZXR1cm4gU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5jb25mbHVlbmNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHZhbHVlPy5pbmNsdWRlcyhTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmJhbWJvbykpIHtcbiAgICAgICAgICAgIHJldHVybiBTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmJhbWJvbztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh2YWx1ZT8uaW5jbHVkZXMoU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5iaXRidWNrZXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5iaXRidWNrZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGdldFZlcnNpb24obm9kZSkge1xuICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICBpZiAocGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgY29uc3QgeyBwbHVnaW4gfSA9IHRoaXMudG9PYmplY3QocGFyZW50Tm9kZSk7XG4gICAgICAgICAgICBjb25zdCB7IGNvbmZpZ3VyYXRpb24gfSA9IHBsdWdpbiB8fCB7fTtcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uPy5wcm9kdWN0VmVyc2lvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRvUHJvcGVydHlSZXBsYWNlbWVudChwbHVnaW4uY29uZmlndXJhdGlvbi5wcm9kdWN0VmVyc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjb25maWd1cmF0aW9uPy5wcm9kdWN0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb2R1Y3QgPSBBcnJheS5pc0FycmF5KGNvbmZpZ3VyYXRpb24/LnByb2R1Y3RzKSA/IGNvbmZpZ3VyYXRpb24/LnByb2R1Y3RzWzBdIDogY29uZmlndXJhdGlvbi5wcm9kdWN0cy5wcm9kdWN0O1xuICAgICAgICAgICAgICAgIGlmIChwcm9kdWN0ICYmIHByb2R1Y3QudmVyc2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1Byb3BlcnR5UmVwbGFjZW1lbnQocHJvZHVjdC52ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZG9Qcm9wZXJ0eVJlcGxhY2VtZW50KHZhbHVlKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBwcm9maWxlLCByZXBsYWNlIHByb2ZpbGUgcHJvcGVydGllcyBmaXJzdCBhcyB0aGV5IHRha2UgcHJlY2VkZW5jZVxuICAgICAgICBjb25zdCBwcm9maWxlUHJvcGVydGllcyA9IHRoaXMuZ2V0UHJvcGVydGllcygpO1xuICAgICAgICBPYmplY3QuZW50cmllcyhwcm9maWxlUHJvcGVydGllcykuZm9yRWFjaCgoW3Byb3BlcnR5S2V5LCBwcm9wZXJ0eVZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VBbGwoYCRcXHske3Byb3BlcnR5S2V5fX1gLCBwcm9wZXJ0eVZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB0aGlzLmdldFByb3BlcnRpZXMoKTtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocHJvcGVydGllcykuZm9yRWFjaCgoW3Byb3BlcnR5S2V5LCBwcm9wZXJ0eVZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VBbGwoYCRcXHske3Byb3BlcnR5S2V5fX1gLCBwcm9wZXJ0eVZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGdldFByb3BlcnRpZXMoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICBjb25zdCBub2RlcyA9IHRoaXMuZ2V0Tm9kZXMoJy8vKltsb2NhbC1uYW1lKCk9XFwncHJvcGVydGllc1xcJ10nKTtcbiAgICAgICAgY29uc3Qgbm9kZXNXaXRoQWN0aXZlUHJvZmlsZSA9IG5vZGVzLmZpbHRlcihub2RlID0+IHRoaXMuaXNBY3RpdmF0ZWRQcm9maWxlKG5vZGUpKTtcbiAgICAgICAgbm9kZXNXaXRoQWN0aXZlUHJvZmlsZS5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBwcm9wZXJ0aWVzIH0gPSB0aGlzLnRvT2JqZWN0KG5vZGUpO1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocHJvcGVydGllcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiByZXN1bHRba2V5XSA9IHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGdldE5vZGVzKGV4cHJlc3Npb24sIHNpbmdsZSkge1xuICAgICAgICBjb25zdCBwb21GaWxlUGF0aCA9IGpvaW4odGhpcy5vcHRpb25zPy5jd2QgfHwgY3dkKCksICcuL3BvbS54bWwnKTtcbiAgICAgICAgY29uc3QgaGFzUG9tRmlsZSA9IGV4aXN0c1N5bmMocG9tRmlsZVBhdGgpO1xuICAgICAgICBpZiAoaGFzUG9tRmlsZSkge1xuICAgICAgICAgICAgY29uc3QgeG1sID0gcmVhZEZpbGVTeW5jKHBvbUZpbGVQYXRoLCAndXRmOCcpO1xuICAgICAgICAgICAgY29uc3QgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh4bWwsICd0ZXh0L3htbCcpO1xuICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBzaW5nbGUgPyB4cGF0aC5zZWxlY3QoZXhwcmVzc2lvbiwgZG9jLCB0cnVlKSA6IHhwYXRoLnNlbGVjdChleHByZXNzaW9uLCBkb2MsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGVzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHNpbmdsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHRvT2JqZWN0KG5vZGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBYTUxQYXJzZXIoKTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZXIucGFyc2UobmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyhub2RlKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZmluZFBhcmVudE5vZGVCeVRhZ05hbWUodGFnTmFtZSwgbm9kZSkge1xuICAgICAgICBjb25zdCB7IHBhcmVudE5vZGUgfSA9IG5vZGU7XG4gICAgICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YWdOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50Tm9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbmRQYXJlbnROb2RlQnlUYWdOYW1lKHRhZ05hbWUsIHBhcmVudE5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpc0FjdGl2YXRlZFByb2ZpbGUobm9kZSkge1xuICAgICAgICBjb25zdCBwcm9maWxlUGFyZW50Tm9kZSA9IHRoaXMuZmluZFBhcmVudE5vZGVCeVRhZ05hbWUoJ3Byb2ZpbGUnLCBub2RlKTtcbiAgICAgICAgY29uc3QgcHJvZmlsZU5vZGUgPSBwcm9maWxlUGFyZW50Tm9kZSA/IHRoaXMudG9PYmplY3QocHJvZmlsZVBhcmVudE5vZGUpIDogbnVsbDtcbiAgICAgICAgaWYgKCFwcm9maWxlTm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocHJvZmlsZU5vZGUgJiYgKHByb2ZpbGVOb2RlLmFjdGl2ZUJ5RGVmYXVsdCA9PT0gJ3RydWUnIHx8IHRoaXMub3B0aW9ucy5wcm9maWxlcy5pbmNsdWRlcyhwcm9maWxlTm9kZS5wcm9maWxlLmlkKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IGlzUmVjdXJzaXZlQnVpbGQgPSAobGFzdEJ1aWxkQ29tcGxldGVkKSA9PiBsYXN0QnVpbGRDb21wbGV0ZWQgPiAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSA1ICogMTAwMCk7XG4iLCJleHBvcnQgY29uc3Qgc2hvd1JlY3Vyc2l2ZUJ1aWxkV2FybmluZyA9IChvdXRwdXREaXJlY3RvcnkpID0+IHtcbiAgICBjb25zb2xlLmxvZyhgXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJlY3Vyc2l2ZSBidWlsZCB0cmlnZ2VyIGRldGVjdGVkLiBUaGUgbGFzdCBidWlsZCBjb21wbGV0ZWQgbGFzdCB0aGFuIDUgc2Vjb25kcyBhZ29cblRoaXMgbWF5IGluZGljYXRlIHRoYXQgdGhlIGJ1aWxkIGNoYW5nZXMgZmlsZXMgb3V0c2lkZSBvZiB0aGUgb3V0cHV0IGRpcmVjdG9yeVxuQWx0ZXJuYXRpdmVseSwgTWF2ZW4gaXMgdXNpbmcgYSBkaWZmZXJlbnQgb3V0cHV0IGRpcmVjdG9yeSB0aGFuIGNvbmZpZ3VyZWQ6XG4nJHtvdXRwdXREaXJlY3Rvcnl9J1xuXG5QbGVhc2UgbWFrZSBzdXJlIHRvIGNoZWNrIHlvdXIgYnVpbGQgcHJvY2VzcyBhbmQvb3Igc3BlY2lmeSBhIGRpZmZlcmVudCBvdXRwdXQgZGlyZWN0b3J5IHVzaW5nIHRoZSAnLW8nIG9wdGlvblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09YCk7XG59O1xuIiwiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IGN3ZCB9IGZyb20gJ3Byb2Nlc3MnO1xuZXhwb3J0IGNsYXNzIEN1c3RvbUJ1aWxkZXIge1xuICAgIG9wdGlvbnM7XG4gICAgcHJvYyA9IG51bGw7XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0cnVjdG9yXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIH1cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHVibGljIE1ldGhvZHNcbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9jKSB7XG4gICAgICAgICAgICBjb25zdCBraWxsZWQgPSB0aGlzLnByb2Mua2lsbCgwKTtcbiAgICAgICAgICAgIGlmICgha2lsbGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gdGVybWluYXRlIGV4aXN0aW5nIGJ1aWxkIHByb2Nlc3MnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBidWlsZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb2MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBraWxsZWQgPSB0aGlzLnByb2Mua2lsbCgwKTtcbiAgICAgICAgICAgICAgICBpZiAoIWtpbGxlZCkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdGYWlsZWQgdG8gdGVybWluYXRlIGV4aXN0aW5nIGJ1aWxkIHByb2Nlc3MnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBleGVjU3luYyh0aGlzLm9wdGlvbnMuY21kLCB7IGN3ZDogdGhpcy5vcHRpb25zPy5jd2QgfHwgY3dkKCksIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgc3RhdHVzIH0gPSBlcnI7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQnVpbGQgZXhpdGVkIHdpdGggY29kZSAke3N0YXR1c31gKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IHNwYXduIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgRG9ja2Vyb2RlIGZyb20gJ2RvY2tlcm9kZSc7XG5pbXBvcnQgeyBjd2QgfSBmcm9tICdwcm9jZXNzJztcbmNvbnN0IGRvY2tlciA9IG5ldyBEb2NrZXJvZGUoKTtcbmV4cG9ydCBjb25zdCBnZXRSdW5uaW5nQ29udGFpbmVySWRzID0gYXN5bmMgKGFwcGxpY2F0aW9uKSA9PiB7XG4gICAgY29uc3QgY29udGFpbmVycyA9IGF3YWl0IGRvY2tlci5saXN0Q29udGFpbmVycyh7IGZpbHRlcnM6IHtcbiAgICAgICAgICAgIHN0YXR1czogWydydW5uaW5nJ10sXG4gICAgICAgICAgICBsYWJlbDogW2Bjb20uZG9ja2VyLmNvbXBvc2Uuc2VydmljZT0ke2FwcGxpY2F0aW9ufWBdXG4gICAgICAgIH0gfSk7XG4gICAgcmV0dXJuIGNvbnRhaW5lcnMubWFwKGl0ZW0gPT4gaXRlbS5JZCk7XG59O1xuZXhwb3J0IGNvbnN0IGNvcHkgPSBhc3luYyAoc291cmNlUGF0aCwgZGVzdGluYXRpb25QYXRoKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgZG9ja2VyID0gc3Bhd24oJ2RvY2tlcicsIFsnY3AnLCBzb3VyY2VQYXRoLCBkZXN0aW5hdGlvblBhdGhdLCB7IGN3ZDogY3dkKCksIHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgICAgIGRvY2tlci5vbignZXJyb3InLCByZWplY3QpO1xuICAgICAgICBkb2NrZXIub24oJ2V4aXQnLCAoY29kZSkgPT4gKGNvZGUgPT09IDApID8gcmVzb2x2ZSgpIDogcmVqZWN0KG5ldyBFcnJvcihgRG9ja2VyIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKSk7XG4gICAgfSk7XG59O1xuIiwiaW1wb3J0IHsgcmVzb2x2ZSBhcyByZXNvbHZlUGF0aCB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgY3dkIH0gZnJvbSAncHJvY2Vzcyc7XG5pbXBvcnQgKiBhcyBEb2NrZXIgZnJvbSAnLi9kb2NrZXInO1xuaW1wb3J0IHsgdXBsb2FkVG9VUE0gfSBmcm9tICcuL3VwbSc7XG5leHBvcnQgY29uc3QgSW5zdGFsbGVyID0gYXN5bmMgKG5hbWUsIHBhdGgsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBjb250YWluZXJJZHMgPSBhd2FpdCBEb2NrZXIuZ2V0UnVubmluZ0NvbnRhaW5lcklkcyhuYW1lKTtcbiAgICBpZiAoIWNvbnRhaW5lcklkcyB8fCBjb250YWluZXJJZHMubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coYFRoZXJlIGFyZSBubyBydW5uaW5nIGluc3RhbmNlIG9mICR7bmFtZX0sIHVuYWJsZSB0byBpbnN0YWxsIHBsdWdpbiDwn6SUYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxzZSBpZiAoY29udGFpbmVySWRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFRoZXJlIGFyZSBtdWx0cGxlIHJ1bm5pbmcgaW5zdGFuY2Ugb2YgJHtuYW1lfSwgdW5hYmxlIHRvIGRldGVybWluZSB3aGljaCBvbmUgdG8gdXNlIPCfpJRgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb250YWluZXJJZCA9IGNvbnRhaW5lcklkc1swXTtcbiAgICBpZiAoY29udGFpbmVySWQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMub2JyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRm91bmQgdXBkYXRlZCBwbHVnaW4sIHVwbG9hZGluZyBpdCB0byBVUE0gb24gcnVubmluZyBpbnN0YW5jZXMgb2YgJHtuYW1lfWApO1xuICAgICAgICAgICAgY29uc3QgaG9zdFVybCA9IG9wdGlvbnMucG9ydCA/IGBsb2NhbGhvc3Q6JHtvcHRpb25zLnBvcnR9YCA6IGBsb2NhbGhvc3RgO1xuICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9IG9wdGlvbnMudXNlcm5hbWUgJiYgb3B0aW9ucy5wYXNzd29yZCA/IGBodHRwOi8vJHtvcHRpb25zLnVzZXJuYW1lfToke29wdGlvbnMucGFzc3dvcmR9QCR7aG9zdFVybH1gIDogYGh0dHA6Ly8ke2hvc3RVcmx9YDtcbiAgICAgICAgICAgIGF3YWl0IHVwbG9hZFRvVVBNKHJlc29sdmVQYXRoKG9wdGlvbnMuY3dkIHx8IGN3ZCgpLCBwYXRoKSwgYmFzZVVybCkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIHRvIHVwbG9hZCBwbHVnaW4gYXJjaGl2ZSBmaWxlIHRvIFVQTScsIGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGb3VuZCB1cGRhdGVkIHBsdWdpbiwgdXBsb2FkaW5nIGl0IHRvIFF1aWNrUmVsb2FkIG9uIHJ1bm5pbmcgaW5zdGFuY2VzIG9mICR7bmFtZX1gKTtcbiAgICAgICAgICAgIGF3YWl0IERvY2tlci5jb3B5KHJlc29sdmVQYXRoKG9wdGlvbnMuY3dkIHx8IGN3ZCgpLCBwYXRoKSwgYCR7Y29udGFpbmVySWR9Oi9vcHQvcXVpY2tyZWxvYWQvYClcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiBjb25zb2xlLmxvZygnRmluaXNoZWQgdXBsb2FkaW5nIHBsdWdpbiBhcmNoaXZlIHRvIFF1aWNrUmVsb2FkJykpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiBjb25zb2xlLmxvZygnRmFpbGVkIHRvIHVwbG9hZCBwbHVnaW4gYXJjaGl2ZSBmaWxlIHRvIFF1aWNrUmVsb2FkJywgZXJyKSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuIiwiaW1wb3J0IHsgd2F0Y2ggfSBmcm9tICdjaG9raWRhcic7XG5pbXBvcnQgeyBjd2QgfSBmcm9tICdwcm9jZXNzJztcbmltcG9ydCB7IGlzUmVjdXJzaXZlQnVpbGQgfSBmcm9tICcuLi9oZWxwZXJzL2lzUmVjdXJzaXZlQnVpbGQnO1xuaW1wb3J0IHsgc2hvd1JlY3Vyc2l2ZUJ1aWxkV2FybmluZyB9IGZyb20gJy4uL2hlbHBlcnMvc2hvd1JlY3Vyc2l2ZUJ1aWxkV2FybmluZyc7XG5pbXBvcnQgeyBBTVBTIH0gZnJvbSAnLi9hbXBzJztcbmltcG9ydCB7IEN1c3RvbUJ1aWxkZXIgfSBmcm9tICcuL0N1c3RvbUJ1aWxkZXInO1xuaW1wb3J0IHsgSW5zdGFsbGVyIH0gZnJvbSAnLi9JbnN0YWxsZXInO1xuZXhwb3J0IGNvbnN0IEZpbGVXYXRjaGVyID0gKG5hbWUsIG9wdGlvbnMsIG1hdmVuT3B0cywgaW5zdGFsbE9ubHkgPSBmYWxzZSkgPT4ge1xuICAgIGxldCBsYXN0QnVpbGRDb21wbGV0ZWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICBjb25zdCBvdXRwdXREaXJlY3RvcnkgPSBvcHRpb25zLm91dHB1dERpcmVjdG9yeSB8fCAndGFyZ2V0JztcbiAgICBjb25zdCBwYXR0ZXJucyA9IG9wdGlvbnMuZXh0IHx8IFsnKiovKiddO1xuICAgIGNvbnNvbGUubG9nKGBXYXRjaGluZyBmaWxlc3lzdGVtIGZvciBjaGFuZ2VzIHRvIHNvdXJjZSBmaWxlcyAoJHtwYXR0ZXJucy5qb2luKCcsICcpfSlgKTtcbiAgICBjb25zdCBhbXBzID0gbmV3IEFNUFMoe1xuICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgICBwcm9maWxlczogb3B0aW9ucy5hY3RpdmF0ZVByb2ZpbGVzPy5zcGxpdCgnLCcpIHx8IFtdXG4gICAgfSk7XG4gICAgY29uc3QgZGVsaXZlcmFibGVFeHRlbnNpb24gPSBvcHRpb25zLm9iciA/ICcub2JyJyA6ICcuamFyJztcbiAgICByZXR1cm4gd2F0Y2gocGF0dGVybnMsIHtcbiAgICAgICAgY3dkOiBvcHRpb25zLmN3ZCB8fCBjd2QoKSxcbiAgICAgICAgdXNlUG9sbGluZzogdHJ1ZSxcbiAgICAgICAgaW50ZXJ2YWw6IDIgKiAxMDAwLFxuICAgICAgICBiaW5hcnlJbnRlcnZhbDogMiAqIDEwMDAsXG4gICAgICAgIGF3YWl0V3JpdGVGaW5pc2g6IHRydWUsXG4gICAgICAgIHBlcnNpc3RlbnQ6IHRydWUsXG4gICAgICAgIGF0b21pYzogdHJ1ZVxuICAgIH0pLm9uKCdjaGFuZ2UnLCBhc3luYyAocGF0aCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucy5pbnN0YWxsICYmIHBhdGguc3RhcnRzV2l0aChvdXRwdXREaXJlY3RvcnkpICYmIHBhdGgudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChkZWxpdmVyYWJsZUV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIGF3YWl0IEluc3RhbGxlcihuYW1lLCBwYXRoLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghcGF0aC5zdGFydHNXaXRoKG91dHB1dERpcmVjdG9yeSkgJiYgIWluc3RhbGxPbmx5KSB7XG4gICAgICAgICAgICBpZiAoaXNSZWN1cnNpdmVCdWlsZChsYXN0QnVpbGRDb21wbGV0ZWQpKSB7XG4gICAgICAgICAgICAgICAgc2hvd1JlY3Vyc2l2ZUJ1aWxkV2FybmluZyhvdXRwdXREaXJlY3RvcnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0RldGVjdGVkIGZpbGUgY2hhbmdlLCByZWJ1aWxkaW5nIEF0bGFzaWFuIERhdGEgQ2VudGVyIHBsdWdpbicpO1xuICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5leGVjKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFtcHMuYnVpbGQobWF2ZW5PcHRzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGaW5pc2hlZCBidWlsZGluZyBBdGxhc3NpYW4gRGF0YSBDZW50ZXIgcGx1Z2luIGZvciAke25hbWV9Li4uIPCfkqpgKTtcbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEZhaWxlZCB0byBidWlsZCBBdGxhc3NpYW4gRGF0YSBDZW50ZXIgcGx1Z2luIGZvciAke25hbWV9Li4uIPCfmLBgKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IEN1c3RvbUJ1aWxkZXIoeyBjbWQ6IG9wdGlvbnMuZXhlYywgY3dkOiBvcHRpb25zLmN3ZCB8fCBjd2QoKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEZpbmlzaGVkIGJ1aWxkaW5nIEF0bGFzc2lhbiBEYXRhIENlbnRlciBwbHVnaW4gZm9yICR7bmFtZX0uLi4g8J+SqmApO1xuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIGJ1aWxkIEF0bGFzc2lhbiBEYXRhIENlbnRlciBwbHVnaW4gZm9yICR7bmFtZX0uLi4g8J+YsGApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGFzdEJ1aWxkQ29tcGxldGVkID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG4iLCJpbXBvcnQgeyByZWFscGF0aFN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSAncGF0aCc7XG5leHBvcnQgY29uc3QgdG9BYnNvbHV0ZVBhdGggPSAocmVsYXRpdmVQYXRoKSA9PiB7XG4gICAgY29uc3QgWywgZmlsZVBhdGhdID0gcHJvY2Vzcy5hcmd2O1xuICAgIGNvbnN0IGV4ZWN1dGFibGVGaWxlRGlyID0gZGlybmFtZShyZWFscGF0aFN5bmMoZmlsZVBhdGgpKTtcbiAgICBjb25zdCBiYXNlZGlyID0gZXhlY3V0YWJsZUZpbGVEaXIuc3Vic3RyaW5nKDAsIGV4ZWN1dGFibGVGaWxlRGlyLmluZGV4T2YoJ2RjZHgnKSArIDQpO1xuICAgIHJldHVybiBqb2luKGJhc2VkaXIsIHJlbGF0aXZlUGF0aC5yZXBsYWNlQWxsKCcuLi8nLCAnJykpO1xufTtcbiIsImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IHRvQWJzb2x1dGVQYXRoIH0gZnJvbSAnLi90b0Fic29sdXRlUGF0aCc7XG5leHBvcnQgY29uc3QgZ2V0VmVyc2lvbnMgPSAoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyh0b0Fic29sdXRlUGF0aCgnLi4vLi4vYXNzZXRzL3ZlcnNpb25zLmpzb24nKSwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgdmVyc2lvbnMgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgIHJldHVybiB2ZXJzaW9ucztcbn07XG4iLCIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQgeyBDb21tYW5kIGFzIENvbW1hbmRlciwgSW52YWxpZE9wdGlvbkFyZ3VtZW50RXJyb3IsIE9wdGlvbiB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBncmFjZWZ1bEV4aXQgfSBmcm9tICdleGl0LWhvb2snO1xuaW1wb3J0IHsgZ2xvYiB9IGZyb20gJ2dsb2InO1xuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgY3dkIH0gZnJvbSAncHJvY2Vzcyc7XG5pbXBvcnQgeyBnZXRBcHBMaWNlbnNlIH0gZnJvbSAnLi4vYXB0L2hlbHBlcnMvZ2V0QXBwTGljZW5zZSc7XG5pbXBvcnQgeyBpbnN0YWxsQXBwIH0gZnJvbSAnLi4vYXB0L2hlbHBlcnMvaW5zdGFsbEFwcCc7XG5pbXBvcnQgeyBBY3Rpb25IYW5kbGVyIH0gZnJvbSAnLi4vaGVscGVycy9BY3Rpb25IYW5kbGVyJztcbmltcG9ydCB7IEFNUFMgfSBmcm9tICcuLi9oZWxwZXJzL2FtcHMnO1xuaW1wb3J0IHsgRmlsZVdhdGNoZXIgfSBmcm9tICcuLi9oZWxwZXJzL0ZpbGVXYXRjaGVyJztcbmltcG9ydCB7IGdldFZlcnNpb25zIH0gZnJvbSAnLi4vaGVscGVycy9nZXRWZXJzaW9ucyc7XG5pbXBvcnQgeyBJbnN0YWxsZXIgfSBmcm9tICcuLi9oZWxwZXJzL0luc3RhbGxlcic7XG5jb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmRlcigpO1xuY29uc3QgdmVyc2lvbnMgPSBnZXRWZXJzaW9ucygpO1xuY29uc3QgQ29tbWFuZCA9ICgpID0+IHtcbiAgICBsZXQgcXVpY2tSZWxvYWQgPSBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFjdGlvbjogYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFtcHMgPSBuZXcgQU1QUyh7XG4gICAgICAgICAgICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICAgICAgICAgICAgICBwcm9maWxlczogb3B0aW9ucy5hY3RpdmF0ZVByb2ZpbGVzPy5zcGxpdCgnLCcpIHx8IFtdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLm1wYWMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuYmFzZVVybCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wdGlvbkFyZ3VtZW50RXJyb3IoJ01pc3NpbmcgYXJndW1lbnQgXCItLWJhc2VVcmxcIiwgcmVxdWlyZWQgZm9yIGluc3RhbGxpbmcgZnJvbSB0aGUgQXRsYXNzaWFuIE1hcmtldHBsYWNlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFvcHRpb25zLmFwcEtleSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wdGlvbkFyZ3VtZW50RXJyb3IoJ01pc3NpbmcgYXJndW1lbnQgXCItLWFwcEtleVwiLCByZXF1aXJlZCBmb3IgaW5zdGFsbGluZyBmcm9tIHRoZSBBdGxhc3NpYW4gTWFya2V0cGxhY2UnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYXdhaXQgaW5zdGFsbEFwcCh7XG4gICAgICAgICAgICAgICAgICAgIGJhc2VVcmw6IG9wdGlvbnMuYmFzZVVybCxcbiAgICAgICAgICAgICAgICAgICAgYXBwS2V5OiBvcHRpb25zLmFwcEtleSxcbiAgICAgICAgICAgICAgICAgICAgbGljZW5zZTogYXdhaXQgZ2V0QXBwTGljZW5zZShvcHRpb25zLmxpY2Vuc2UsIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICB1c2VybmFtZTogb3B0aW9ucy51c2VybmFtZSxcbiAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ6IG9wdGlvbnMucGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgICAgIHJlc3RhcnRBZnRlckluc3RhbGw6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBmb3JjZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhbXBzLmlzQXRsYXNzaWFuUGx1Z2luKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBhbiBBdGxhc3NpYW4gUGx1Z2luIHByb2plY3QgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IPCfpJQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGFtcHMuZ2V0QXBwbGljYXRpb24oKTtcbiAgICAgICAgICAgICAgICBpZiAoIW5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgQXRsYXNzaWFuIFBsdWdpbiBwcm9qZWN0IGRvZXMgbm90IGNvbnRhaW4gYW4gQU1QUyBjb25maWd1cmF0aW9uLCB1bmFibGUgdG8gZGV0ZWN0IHByb2R1Y3Qg8J+YsCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gYW1wcy5nZXRBcHBsaWNhdGlvblZlcnNpb24oKTtcbiAgICAgICAgICAgICAgICBpZiAoIXZlcnNpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZGV0ZXJtaW5lIHZlcnNpb24gZnJvbSBBTVBTIGFuZCBubyBwcm9kdWN0IHZlcnNpb24gcHJvdmlkZWQgKC0tdGFnKScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICghdmVyc2lvbnNbbmFtZV0uaW5jbHVkZXModmVyc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9kdWN0IHZlcnNpb24gJyR7dmVyc2lvbn0nIGlzIGludmFsaWQuIEFsbG93ZWQgY2hvaWNlcyBhcmUgJHt2ZXJzaW9uc1tuYW1lXS5qb2luKCcsICcpfS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMub2JyICYmICFvcHRpb25zLnVzZXJuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3B0aW9uQXJndW1lbnRFcnJvcignTWlzc2luZyBhcmd1bWVudCBcIi0tdXNlcm5hbWVcIiwgcmVxdWlyZWQgZm9yIGluc3RhbGxpbmcgT0JSIGFydGlmYWN0cycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChvcHRpb25zLm9iciAmJiAhb3B0aW9ucy5wYXNzd29yZCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wdGlvbkFyZ3VtZW50RXJyb3IoJ01pc3NpbmcgYXJndW1lbnQgXCItLXBhc3N3b3JkXCIsIHJlcXVpcmVkIGZvciBpbnN0YWxsaW5nIE9CUiBhcnRpZmFjdHMnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMud2F0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcXVpY2tSZWxvYWQgPSBGaWxlV2F0Y2hlcihuYW1lLCBvcHRpb25zLCBbXSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dERpcmVjdG9yeSA9IG9wdGlvbnMub3V0cHV0RGlyZWN0b3J5IHx8ICd0YXJnZXQnO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbGl2ZXJhYmxlRXh0ZW5zaW9uID0gb3B0aW9ucy5vYnIgPyAnb2JyJyA6ICdqYXInO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZ2xvYihgJHtvdXRwdXREaXJlY3Rvcnl9LyouJHtkZWxpdmVyYWJsZUV4dGVuc2lvbn1gLCB7IGN3ZDogcmVzb2x2ZShvcHRpb25zLmN3ZCB8fCBjd2QoKSkgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoZmlsZXMubWFwKHBhdGggPT4gSW5zdGFsbGVyKG5hbWUsIHBhdGgsIG9wdGlvbnMpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9ySGFuZGxlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHF1aWNrUmVsb2FkKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFN0b3BwaW5nIGZpbGVzeXN0ZW0gd2F0Y2hlci4uLiDij7NgKTtcbiAgICAgICAgICAgICAgICBhd2FpdCBxdWlja1JlbG9hZC5jbG9zZSgpLmNhdGNoKCgpID0+IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coYFN1Y2Nlc3NmdWxseSBzdG9wcGVkIGFsbCBydW5uaW5nIHByb2Nlc3NlcyDwn5KqYCk7XG4gICAgICAgIH1cbiAgICB9O1xufTtcbnByb2dyYW1cbiAgICAubmFtZSgnZGNkeCBpbnN0YWxsJylcbiAgICAuZGVzY3JpcHRpb24oYEluc3RhbGwgdGhlIEF0bGFzc2lhbiBEYXRhIENlbnRlciBwbHVnaW4gdXNpbmcgdGhlIEF0bGFzc2lhbiBNYXZlbiBQbHVnaW4gU3VpdGUgKEFNUFMpIGNvbmZpZ3VyYXRpb24uXG5JZiB0aGVyZSBpcyBhIHJ1bm5pbmcgaW5zdGFuY2UsIGl0IHdpbGwgdHJ5IHRvIGluc3RhbGwgdGhlIHBsdWdpbiB1c2luZyBRdWlja1JlbG9hZCBvciB0aGUgVVBNIChmb3IgT0JSKS5gKVxuICAgIC5zaG93SGVscEFmdGVyRXJyb3IodHJ1ZSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy13LCAtLXdhdGNoJywgJ1dhdGNoIGZvciBmaWxlc3lzdGVtIGNoYW5nZXMgdG8gSkFSIG9yIE9CUiBmaWxlcyBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeScpLmRlZmF1bHQoZmFsc2UpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLW8sIC0tb3V0cHV0RGlyZWN0b3J5IDxkaXJlY3Rvcnk+JywgJ091dHB1dCBkaXJlY3Rvcnkgd2hlcmUgdG8gbG9vayBmb3IgZ2VuZXJhdGVkIEpBUiBvciBPQlIgZmlsZXMgKGRlZmF1bHRzIHRvIGB0YXJnZXRgKScpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLVAsIC0tYWN0aXZhdGUtcHJvZmlsZXMgPGFyZz4nLCAnQ29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgcHJvZmlsZXMgdG8gYWN0aXZhdGUnKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tb2JyJywgJ1VwbG9hZCBnZW5lcmF0ZWQgT0JSIGZpbGUgaW5zdGVhZCBvZiBKQVIgZmlsZSB3aGVuIGluc3RhbGxpbmcgdGhlIGFwcCcpLmRlZmF1bHQoZmFsc2UpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS11c2VybmFtZSA8dXNlcm5hbWU+JywgJ1RoZSB1c2VybmFtZSBvZiB0aGUgYWRtaW5pc3RyYXRvciAocmVxdWlyZWQgd2l0aCAtLW9iciwgb3B0aW9uYWwgZm9yIC0tbXBhYyknKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tcGFzc3dvcmQgPHBhc3N3b3JkPicsICdUaGUgcGFzc3dvcmQgb2YgdGhlIGFkbWluaXN0cmF0b3IgKHJlcXVpcmVkIHdpdGggLS1vYnIsIG9wdGlvbmFsIGZvciAtLW1wYWMpJykpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLW1wYWMnLCAnSW5zdGFsbCB0aGUgYXBwIGZyb20gdGhlIEF0bGFzc2lhbiBNYXJrZXRwbGFjZScpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1iYXNlVXJsIDx1cmw+JywgJ1VSTCBvZiB0aGUgaW5zdGFuY2UgKHJlcXVpcmVkIHdpdGggLS1tcGFjKScpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1hcHBLZXkgPGtleT4nLCAnVGhlIGtleSBvZiB0aGUgYXBwIHRvIGJlIGluc3RhbGxlZCAocmVxdWlyZWQgd2l0aCAtLW1wYWMpJykpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLWxpY2Vuc2UgPHBhdGhfb3JfbGljZW5zZT4nLCAnVGhlIGFwcCBsaWNlbnNlLCBlaXRoZXIgYXMgYSBwYXRoIHRvIGEgZmlsZSBvciB0aGUgbGljZW5zZSBpdHNlbGYnKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tY3dkIDxkaXJlY3Rvcnk+JywgJ1NwZWNpZnkgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZXJlIHRvIGZpbmQgdGhlIEFNUFMgY29uZmlndXJhdGlvbicpKVxuICAgIC5hY3Rpb24ob3B0aW9ucyA9PiBBY3Rpb25IYW5kbGVyKHByb2dyYW0sIENvbW1hbmQoKSwgeyAuLi5vcHRpb25zLCBpbnN0YWxsOiB0cnVlIH0pKTtcbnByb2dyYW0ucGFyc2VBc3luYyhwcm9jZXNzLmFyZ3YpLmNhdGNoKCgpID0+IGdyYWNlZnVsRXhpdCgxKSk7XG5wcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coYFJlY2VpdmVkIHRlcm0gc2lnbmFsLCB0cnlpbmcgdG8gc3RvcCBncmFjZWZ1bGx5IPCfkqpgKTtcbiAgICBncmFjZWZ1bEV4aXQoMSk7XG59KTtcbiJdLCJuYW1lcyI6WyJjd2QiLCJwd2QiLCJwYXNzd29yZCIsInBhc3N3b3JkUHJvbXB0IiwidmVyc2lvbnMiLCJEb2NrZXIuZ2V0UnVubmluZ0NvbnRhaW5lcklkcyIsInJlc29sdmVQYXRoIiwiRG9ja2VyLmNvcHkiLCJDb21tYW5kZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1PLE1BQU0sUUFBUSxHQUFHLDJhQUEyYTs7QUNONWIsTUFBTSxVQUFVLEdBQUcsQ0FB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O0FBQ0E7QUFDQSxTQUFTO0FBQ1QsYUFBYTtBQUNiLFlBQVksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixTQUFTO0FBQ1QsS0FBSyxDQUFDLENBQUM7QUFDUCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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