@aws-cdk-testing/cli-integ 2.173.3 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/.eslintrc.js +9 -0
  2. package/LICENSE +2 -1
  3. package/bin/query-github.js +3 -3
  4. package/bin/query-github.ts +56 -0
  5. package/bin/run-suite.js +3 -3
  6. package/bin/run-suite.ts +140 -0
  7. package/bin/stage-distribution.js +3 -2
  8. package/bin/stage-distribution.ts +267 -0
  9. package/bin/test-root.ts +3 -0
  10. package/lib/aws.js +9 -6
  11. package/lib/aws.ts +263 -0
  12. package/lib/corking.ts +33 -0
  13. package/lib/eventually.js +3 -3
  14. package/lib/eventually.ts +42 -0
  15. package/lib/files.js +3 -2
  16. package/lib/files.ts +80 -0
  17. package/lib/github.js +6 -5
  18. package/lib/github.ts +43 -0
  19. package/lib/index.ts +13 -0
  20. package/lib/integ-test.ts +81 -0
  21. package/lib/lists.ts +9 -0
  22. package/lib/memoize.ts +14 -0
  23. package/lib/npm.ts +41 -0
  24. package/lib/package-sources/release-source.js +3 -2
  25. package/lib/package-sources/release-source.ts +81 -0
  26. package/lib/package-sources/repo-source.ts +111 -0
  27. package/lib/package-sources/repo-tools/npm.js +5 -4
  28. package/lib/package-sources/repo-tools/npm.ts +48 -0
  29. package/lib/package-sources/source.ts +35 -0
  30. package/lib/package-sources/subprocess.ts +15 -0
  31. package/lib/resource-pool.js +2 -2
  32. package/lib/resource-pool.ts +140 -0
  33. package/lib/resources.ts +4 -0
  34. package/lib/shell.js +8 -5
  35. package/lib/shell.ts +168 -0
  36. package/lib/staging/codeartifact.js +11 -8
  37. package/lib/staging/codeartifact.ts +387 -0
  38. package/lib/staging/maven.js +5 -3
  39. package/lib/staging/maven.ts +95 -0
  40. package/lib/staging/npm.ts +62 -0
  41. package/lib/staging/nuget.ts +75 -0
  42. package/lib/staging/parallel-shell.js +2 -2
  43. package/lib/staging/parallel-shell.ts +51 -0
  44. package/lib/staging/pypi.ts +50 -0
  45. package/lib/staging/usage-dir.ts +99 -0
  46. package/lib/with-aws.js +3 -2
  47. package/lib/with-aws.ts +67 -0
  48. package/lib/with-cdk-app.js +23 -14
  49. package/lib/with-cdk-app.ts +742 -0
  50. package/lib/with-cli-lib.ts +134 -0
  51. package/lib/with-packages.ts +15 -0
  52. package/lib/with-sam.js +7 -4
  53. package/lib/with-sam.ts +288 -0
  54. package/lib/with-temporary-directory.ts +35 -0
  55. package/lib/with-timeout.ts +33 -0
  56. package/lib/xpmutex.js +2 -2
  57. package/lib/xpmutex.ts +218 -0
  58. package/package.json +84 -62
  59. package/resources/cloud-assemblies/0.36.0/cdk.out +1 -0
  60. package/resources/cloud-assemblies/1.10.0-lookup-default-vpc/cdk.out +1 -0
  61. package/resources/cloud-assemblies/1.10.0-request-azs/cdk.out +1 -0
  62. package/tests/cli-integ-tests/bootstrapping.integtest.js +22 -13
  63. package/tests/cli-integ-tests/bootstrapping.integtest.ts +493 -0
  64. package/tests/cli-integ-tests/cli-lib.integtest.js +3 -2
  65. package/tests/cli-integ-tests/cli-lib.integtest.ts +90 -0
  66. package/tests/cli-integ-tests/cli.integtest.js +76 -49
  67. package/tests/cli-integ-tests/cli.integtest.ts +2874 -0
  68. package/tests/cli-integ-tests/garbage-collection.integtest.js +2 -2
  69. package/tests/cli-integ-tests/garbage-collection.integtest.ts +392 -0
  70. package/tests/init-csharp/init-csharp.integtest.ts +15 -0
  71. package/tests/init-fsharp/init-fsharp.integtest.ts +15 -0
  72. package/tests/init-go/init-go.integtest.ts +23 -0
  73. package/tests/init-java/init-java.integtest.ts +14 -0
  74. package/tests/init-javascript/init-javascript.integtest.ts +59 -0
  75. package/tests/init-python/init-python.integtest.ts +20 -0
  76. package/tests/init-typescript-app/init-typescript-app.integtest.ts +66 -0
  77. package/tests/init-typescript-lib/init-typescript-lib.integtest.ts +13 -0
  78. package/tests/tool-integrations/amplify.integtest.ts +43 -0
  79. package/tests/tool-integrations/with-tool-context.ts +14 -0
  80. package/tests/uberpackage/uberpackage.integtest.ts +11 -0
  81. package/resources/cdk-apps/cfn-include-app/.gitignore +0 -1
@@ -246,7 +246,7 @@ jest.setTimeout(2 * 60 * 60000); // Includes the time to acquire locks, worst-ca
246
246
  fixture.log('Setup complete!');
247
247
  // Artificially add tagging to the asset in the bootstrap bucket
248
248
  const result = await fixture.aws.s3.send(new client_s3_1.ListObjectsV2Command({ Bucket: bootstrapBucketName }));
249
- const key = result.Contents.filter((c) => c.Key?.split('.')[1] == 'zip')[0].Key; // fancy footwork to make sure we have the asset key
249
+ const key = result.Contents.filter((c) => { var _a; return ((_a = c.Key) === null || _a === void 0 ? void 0 : _a.split('.')[1]) == 'zip'; })[0].Key; // fancy footwork to make sure we have the asset key
250
250
  await fixture.aws.s3.send(new client_s3_1.PutObjectTaggingCommand({
251
251
  Bucket: bootstrapBucketName,
252
252
  Key: key,
@@ -311,4 +311,4 @@ jest.setTimeout(2 * 60 * 60000); // Includes the time to acquire locks, worst-ca
311
311
  ],
312
312
  });
313
313
  }));
314
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FyYmFnZS1jb2xsZWN0aW9uLmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdhcmJhZ2UtY29sbGVjdGlvbi5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxvREFBK0Y7QUFDL0Ysa0RBQTRHO0FBQzVHLG1DQUFzRTtBQUV0RSxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztBQUMzQyxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO0FBRTVDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFNLENBQUMsQ0FBQyxDQUFDLHlFQUF5RTtBQUUzRyxJQUFBLGVBQVMsRUFDUCw4Q0FBOEMsRUFDOUMsSUFBQSxzQkFBZ0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDakMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUM7SUFDcEQsTUFBTSxtQkFBbUIsR0FBRywyQ0FBMkMsSUFBQSxrQkFBWSxHQUFFLEVBQUUsQ0FBQztJQUN4RixPQUFPLENBQUMsc0JBQXNCLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGVBQWU7SUFFcEUsTUFBTSxPQUFPLENBQUMsa0JBQWtCLENBQUM7UUFDL0IsZ0JBQWdCO1FBQ2hCLG1CQUFtQjtLQUNwQixDQUFDLENBQUM7SUFFSCxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQ2hDLE9BQU8sRUFBRTtZQUNQLFdBQVcsRUFBRSxtQkFBbUIsbUJBQW1CLEVBQUU7WUFDckQsV0FBVyxFQUFFLG9DQUFvQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3BFLHNCQUFzQixFQUFFLGdCQUFnQjtZQUN4QyxTQUFTO1NBQ1Y7S0FDRixDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFL0IsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtRQUNqQyxPQUFPLEVBQUU7WUFDUCxXQUFXLEVBQUUsbUJBQW1CLG1CQUFtQixFQUFFO1lBQ3JELFdBQVcsRUFBRSxvQ0FBb0MsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUNwRSxzQkFBc0IsRUFBRSxnQkFBZ0I7WUFDeEMsU0FBUztTQUNWO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsTUFBTSxPQUFPLENBQUMsaUJBQWlCLENBQUM7UUFDOUIsa0JBQWtCLEVBQUUsQ0FBQztRQUNyQixJQUFJLEVBQUUsSUFBSTtRQUNWLGtCQUFrQixFQUFFLGdCQUFnQjtLQUNyQyxDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFFNUMsNENBQTRDO0lBQzVDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksZ0NBQW9CLENBQUMsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO1NBQ2pGLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ2YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMxQyxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUNILENBQUM7QUFFRixJQUFBLGVBQVMsRUFDUCw4Q0FBOEMsRUFDOUMsSUFBQSxzQkFBZ0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDakMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUM7SUFFcEQsTUFBTSxPQUFPLENBQUMsa0JBQWtCLENBQUM7UUFDL0IsZ0JBQWdCO0tBQ2pCLENBQUMsQ0FBQztJQUVILE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFFbkQsTUFBTSxPQUFPLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRTtRQUN2QyxPQUFPLEVBQUU7WUFDUCxXQUFXLEVBQUUsb0NBQW9DLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDcEUsc0JBQXNCLEVBQUUsZ0JBQWdCO1lBQ3hDLFNBQVM7U0FDVjtLQUNGLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUUvQixNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFO1FBQ3hDLE9BQU8sRUFBRTtZQUNQLFdBQVcsRUFBRSxvQ0FBb0MsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUNwRSxzQkFBc0IsRUFBRSxnQkFBZ0I7WUFDeEMsU0FBUztTQUNWO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsTUFBTSxPQUFPLENBQUMsaUJBQWlCLENBQUM7UUFDOUIsa0JBQWtCLEVBQUUsQ0FBQztRQUNyQixJQUFJLEVBQUUsS0FBSztRQUNYLGtCQUFrQixFQUFFLGdCQUFnQjtLQUNyQyxDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFFNUMsZ0RBQWdEO0lBQ2hELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksOEJBQWlCLENBQUMsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUM1RSxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUNmLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDLENBQ0gsQ0FBQztBQUVGLElBQUEsZUFBUyxFQUNQLDRDQUE0QyxFQUM1QyxJQUFBLHNCQUFnQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNqQyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztJQUNwRCxNQUFNLG1CQUFtQixHQUFHLDJDQUEyQyxJQUFBLGtCQUFZLEdBQUUsRUFBRSxDQUFDO0lBQ3hGLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsZUFBZTtJQUVwRSxNQUFNLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztRQUMvQixnQkFBZ0I7UUFDaEIsbUJBQW1CO0tBQ3BCLENBQUMsQ0FBQztJQUVILE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUU7UUFDaEMsT0FBTyxFQUFFO1lBQ1AsV0FBVyxFQUFFLG1CQUFtQixtQkFBbUIsRUFBRTtZQUNyRCxXQUFXLEVBQUUsb0NBQW9DLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDcEUsc0JBQXNCLEVBQUUsZ0JBQWdCO1lBQ3hDLFNBQVM7U0FDVjtLQUNGLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUUvQixNQUFNLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztRQUM5QixrQkFBa0IsRUFBRSxDQUFDO1FBQ3JCLElBQUksRUFBRSxJQUFJO1FBQ1Ysa0JBQWtCLEVBQUUsZ0JBQWdCO0tBQ3JDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUU1QyxrREFBa0Q7SUFDbEQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxnQ0FBb0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxDQUFDLENBQUM7U0FDakYsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDZixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDLENBQUMsQ0FBQztJQUVMLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7UUFDakMsT0FBTyxFQUFFO1lBQ1AsV0FBVyxFQUFFLG1CQUFtQixtQkFBbUIsRUFBRTtZQUNyRCxXQUFXLEVBQUUsb0NBQW9DLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDcEUsc0JBQXNCLEVBQUUsZ0JBQWdCO1lBQ3hDLFNBQVM7U0FDVjtLQUNGLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUMsQ0FDSCxDQUFDO0FBRUYsSUFBQSxlQUFTLEVBQ1AsNENBQTRDLEVBQzVDLElBQUEsc0JBQWdCLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ2pDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDO0lBRXBELE1BQU0sT0FBTyxDQUFDLGtCQUFrQixDQUFDO1FBQy9CLGdCQUFnQjtLQUNqQixDQUFDLENBQUM7SUFFSCxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBRW5ELE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUU7UUFDdkMsT0FBTyxFQUFFO1lBQ1AsV0FBVyxFQUFFLG9DQUFvQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3BFLHNCQUFzQixFQUFFLGdCQUFnQjtZQUN4QyxTQUFTO1NBQ1Y7S0FDRixDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFL0IsTUFBTSxPQUFPLENBQUMsaUJBQWlCLENBQUM7UUFDOUIsa0JBQWtCLEVBQUUsQ0FBQztRQUNyQixJQUFJLEVBQUUsS0FBSztRQUNYLGtCQUFrQixFQUFFLGdCQUFnQjtLQUNyQyxDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFFNUMsZ0RBQWdEO0lBQ2hELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksOEJBQWlCLENBQUMsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUM1RSxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUNmLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLENBQUMsQ0FBQyxDQUFDO0lBRUwsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRTtRQUN4QyxPQUFPLEVBQUU7WUFDUCxXQUFXLEVBQUUsb0NBQW9DLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDcEUsc0JBQXNCLEVBQUUsZ0JBQWdCO1lBQ3hDLFNBQVM7U0FDVjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUNILENBQUM7QUFFRixJQUFBLGVBQVMsRUFDUCwyQ0FBMkMsRUFDM0MsSUFBQSxzQkFBZ0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDakMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUM7SUFDcEQsTUFBTSxtQkFBbUIsR0FBRywyQ0FBMkMsSUFBQSxrQkFBWSxHQUFFLEVBQUUsQ0FBQztJQUN4RixPQUFPLENBQUMsc0JBQXNCLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGVBQWU7SUFFcEUsTUFBTSxPQUFPLENBQUMsa0JBQWtCLENBQUM7UUFDL0IsZ0JBQWdCO1FBQ2hCLG1CQUFtQjtLQUNwQixDQUFDLENBQUM7SUFFSCxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQ2hDLE9BQU8sRUFBRTtZQUNQLFdBQVcsRUFBRSxtQkFBbUIsbUJBQW1CLEVBQUU7WUFDckQsV0FBVyxFQUFFLG9DQUFvQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3BFLHNCQUFzQixFQUFFLGdCQUFnQjtZQUN4QyxTQUFTO1NBQ1Y7S0FDRixDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFL0IsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtRQUNqQyxPQUFPLEVBQUU7WUFDUCxXQUFXLEVBQUUsbUJBQW1CLG1CQUFtQixFQUFFO1lBQ3JELFdBQVcsRUFBRSxvQ0FBb0MsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUNwRSxzQkFBc0IsRUFBRSxnQkFBZ0I7WUFDeEMsU0FBUztTQUNWO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsTUFBTSxPQUFPLENBQUMsaUJBQWlCLENBQUM7UUFDOUIsa0JBQWtCLEVBQUUsR0FBRyxFQUFFLGdGQUFnRjtRQUN6RyxJQUFJLEVBQUUsSUFBSTtRQUNWLGtCQUFrQixFQUFFLGdCQUFnQjtLQUNyQyxDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFFNUMsZ0VBQWdFO0lBQ2hFLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksZ0NBQW9CLENBQUMsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO1NBQ2pGLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0I7UUFDakUsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxtQ0FBdUIsQ0FBQyxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9HLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBRUwsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtRQUNqQyxPQUFPLEVBQUU7WUFDUCxXQUFXLEVBQUUsbUJBQW1CLG1CQUFtQixFQUFFO1lBQ3JELFdBQVcsRUFBRSxvQ0FBb0MsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUNwRSxzQkFBc0IsRUFBRSxnQkFBZ0I7WUFDeEMsU0FBUztTQUNWO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQ0gsQ0FBQztBQUVGLElBQUEsZUFBUyxFQUNQLDJDQUEyQyxFQUMzQyxJQUFBLHNCQUFnQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtJQUNqQyxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztJQUVwRCxNQUFNLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztRQUMvQixnQkFBZ0I7S0FDakIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxRQUFRLEdBQUcsTUFBTSxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUVuRCxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFO1FBQ3ZDLE9BQU8sRUFBRTtZQUNQLFdBQVcsRUFBRSxvQ0FBb0MsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUNwRSxzQkFBc0IsRUFBRSxnQkFBZ0I7WUFDeEMsU0FBUztTQUNWO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBRS9CLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUU7UUFDeEMsT0FBTyxFQUFFO1lBQ1AsV0FBVyxFQUFFLG9DQUFvQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3BFLHNCQUFzQixFQUFFLGdCQUFnQjtZQUN4QyxTQUFTO1NBQ1Y7S0FDRixDQUFDLENBQUM7SUFFSCxNQUFNLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztRQUM5QixrQkFBa0IsRUFBRSxHQUFHLEVBQUUsZ0ZBQWdGO1FBQ3pHLElBQUksRUFBRSxLQUFLO1FBQ1gsa0JBQWtCLEVBQUUsZ0JBQWdCO0tBQ3JDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUU1QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLDhCQUFpQixDQUFDLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDNUUsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDZixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDJDQUEyQztJQUN0RixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUNILENBQUM7QUFFRixJQUFBLGVBQVMsRUFDUCw2Q0FBNkMsRUFDN0MsSUFBQSxzQkFBZ0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDakMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUM7SUFDcEQsTUFBTSxtQkFBbUIsR0FBRywyQ0FBMkMsSUFBQSxrQkFBWSxHQUFFLEVBQUUsQ0FBQztJQUN4RixPQUFPLENBQUMsc0JBQXNCLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGVBQWU7SUFFcEUsTUFBTSxPQUFPLENBQUMsa0JBQWtCLENBQUM7UUFDL0IsZ0JBQWdCO1FBQ2hCLG1CQUFtQjtLQUNwQixDQUFDLENBQUM7SUFFSCxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQ2hDLE9BQU8sRUFBRTtZQUNQLFdBQVcsRUFBRSxtQkFBbUIsbUJBQW1CLEVBQUU7WUFDckQsV0FBVyxFQUFFLG9DQUFvQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3BFLHNCQUFzQixFQUFFLGdCQUFnQjtZQUN4QyxTQUFTO1NBQ1Y7S0FDRixDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFL0IsZ0VBQWdFO0lBQ2hFLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksZ0NBQW9CLENBQUMsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEcsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLG9EQUFvRDtJQUN0SSxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLG1DQUF1QixDQUFDO1FBQ3BELE1BQU0sRUFBRSxtQkFBbUI7UUFDM0IsR0FBRyxFQUFFLEdBQUc7UUFDUixPQUFPLEVBQUU7WUFDUCxNQUFNLEVBQUUsQ0FBQztvQkFDUCxHQUFHLEVBQUUsZUFBZTtvQkFDcEIsS0FBSyxFQUFFLE9BQU87aUJBQ2YsRUFBRTtvQkFDRCxHQUFHLEVBQUUsT0FBTztvQkFDWixLQUFLLEVBQUUsS0FBSztpQkFDYixDQUFDO1NBQ0g7S0FDRixDQUFDLENBQUMsQ0FBQztJQUVKLE1BQU0sT0FBTyxDQUFDLGlCQUFpQixDQUFDO1FBQzlCLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxnRkFBZ0Y7UUFDekcsSUFBSSxFQUFFLElBQUk7UUFDVixrQkFBa0IsRUFBRSxnQkFBZ0I7S0FDckMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBRTVDLDZFQUE2RTtJQUM3RSxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLG1DQUF1QixDQUFDLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFbEgsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QixHQUFHLEVBQUUsT0FBTztZQUNaLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUMsQ0FDSCxDQUFDO0FBRUYsSUFBQSxlQUFTLEVBQ1AsNkNBQTZDLEVBQzdDLElBQUEsc0JBQWdCLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ2pDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDO0lBRXBELE1BQU0sT0FBTyxDQUFDLGtCQUFrQixDQUFDO1FBQy9CLGdCQUFnQjtLQUNqQixDQUFDLENBQUM7SUFFSCxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBRW5ELE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUU7UUFDdkMsT0FBTyxFQUFFO1lBQ1AsV0FBVyxFQUFFLG9DQUFvQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3BFLHNCQUFzQixFQUFFLGdCQUFnQjtZQUN4QyxTQUFTO1NBQ1Y7S0FDRixDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFL0IsZ0VBQWdFO0lBQ2hFLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksOEJBQWlCLENBQUMsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxRQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQ2pELE1BQU0sY0FBYyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksaUNBQW9CLENBQUMsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0ksTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLE1BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7SUFDekQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSw0QkFBZSxDQUFDLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssZ0JBQWdCLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVySyxNQUFNLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztRQUM5QixrQkFBa0IsRUFBRSxHQUFHLEVBQUUsZ0ZBQWdGO1FBQ3pHLElBQUksRUFBRSxLQUFLO1FBQ1gsa0JBQWtCLEVBQUUsZ0JBQWdCO0tBQ3JDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUU1QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLDhCQUFpQixDQUFDLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDNUUsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDZixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtDQUFrQztJQUM3RSxDQUFDLENBQUMsQ0FBQztJQUVMLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUU7UUFDeEMsT0FBTyxFQUFFO1lBQ1AsV0FBVyxFQUFFLG9DQUFvQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3BFLHNCQUFzQixFQUFFLGdCQUFnQjtZQUN4QyxTQUFTO1NBQ1Y7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmF0Y2hHZXRJbWFnZUNvbW1hbmQsIExpc3RJbWFnZXNDb21tYW5kLCBQdXRJbWFnZUNvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtZWNyJztcbmltcG9ydCB7IEdldE9iamVjdFRhZ2dpbmdDb21tYW5kLCBMaXN0T2JqZWN0c1YyQ29tbWFuZCwgUHV0T2JqZWN0VGFnZ2luZ0NvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtczMnO1xuaW1wb3J0IHsgaW50ZWdUZXN0LCByYW5kb21TdHJpbmcsIHdpdGhvdXRCb290c3RyYXAgfSBmcm9tICcuLi8uLi9saWInO1xuXG5jb25zdCBTM19JU09MQVRFRF9UQUcgPSAnYXdzLWNkazppc29sYXRlZCc7XG5jb25zdCBFQ1JfSVNPTEFURURfVEFHID0gJ2F3cy1jZGsuaXNvbGF0ZWQnO1xuXG5qZXN0LnNldFRpbWVvdXQoMiAqIDYwICogNjBfMDAwKTsgLy8gSW5jbHVkZXMgdGhlIHRpbWUgdG8gYWNxdWlyZSBsb2Nrcywgd29yc3QtY2FzZSBzaW5nbGUtdGhyZWFkZWQgcnVudGltZVxuXG5pbnRlZ1Rlc3QoXG4gICdHYXJiYWdlIENvbGxlY3Rpb24gZGVsZXRlcyB1bnVzZWQgczMgb2JqZWN0cycsXG4gIHdpdGhvdXRCb290c3RyYXAoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCB0b29sa2l0U3RhY2tOYW1lID0gZml4dHVyZS5ib290c3RyYXBTdGFja05hbWU7XG4gICAgY29uc3QgYm9vdHN0cmFwQnVja2V0TmFtZSA9IGBhd3MtY2RrLWdhcmJhZ2UtY29sbGVjdC1pbnRlZy10ZXN0LWJja3QtJHtyYW5kb21TdHJpbmcoKX1gO1xuICAgIGZpeHR1cmUucmVtZW1iZXJUb0RlbGV0ZUJ1Y2tldChib290c3RyYXBCdWNrZXROYW1lKTsgLy8ganVzdCBpbiBjYXNlXG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0Jvb3RzdHJhcE1vZGVybih7XG4gICAgICB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgYm9vdHN0cmFwQnVja2V0TmFtZSxcbiAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVwbG95KCdsYW1iZGEnLCB7XG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgICctLWNvbnRleHQnLCBgYm9vdHN0cmFwQnVja2V0PSR7Ym9vdHN0cmFwQnVja2V0TmFtZX1gLFxuICAgICAgICAnLS1jb250ZXh0JywgYEBhd3MtY2RrL2NvcmU6Ym9vdHN0cmFwUXVhbGlmaWVyPSR7Zml4dHVyZS5xdWFsaWZpZXJ9YCxcbiAgICAgICAgJy0tdG9vbGtpdC1zdGFjay1uYW1lJywgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgJy0tZm9yY2UnLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBmaXh0dXJlLmxvZygnU2V0dXAgY29tcGxldGUhJyk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0Rlc3Ryb3koJ2xhbWJkYScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBib290c3RyYXBCdWNrZXQ9JHtib290c3RyYXBCdWNrZXROYW1lfWAsXG4gICAgICAgICctLWNvbnRleHQnLCBgQGF3cy1jZGsvY29yZTpib290c3RyYXBRdWFsaWZpZXI9JHtmaXh0dXJlLnF1YWxpZmllcn1gLFxuICAgICAgICAnLS10b29sa2l0LXN0YWNrLW5hbWUnLCB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAnLS1mb3JjZScsXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtHYXJiYWdlQ29sbGVjdCh7XG4gICAgICByb2xsYmFja0J1ZmZlckRheXM6IDAsXG4gICAgICB0eXBlOiAnczMnLFxuICAgICAgYm9vdHN0cmFwU3RhY2tOYW1lOiB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdHYXJiYWdlIGNvbGxlY3Rpb24gY29tcGxldGUhJyk7XG5cbiAgICAvLyBhc3NlcnQgdGhhdCB0aGUgYm9vdHN0cmFwIGJ1Y2tldCBpcyBlbXB0eVxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLnMzLnNlbmQobmV3IExpc3RPYmplY3RzVjJDb21tYW5kKHsgQnVja2V0OiBib290c3RyYXBCdWNrZXROYW1lIH0pKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LkNvbnRlbnRzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICB9KTtcbiAgfSksXG4pO1xuXG5pbnRlZ1Rlc3QoXG4gICdHYXJiYWdlIENvbGxlY3Rpb24gZGVsZXRlcyB1bnVzZWQgZWNyIGltYWdlcycsXG4gIHdpdGhvdXRCb290c3RyYXAoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCB0b29sa2l0U3RhY2tOYW1lID0gZml4dHVyZS5ib290c3RyYXBTdGFja05hbWU7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0Jvb3RzdHJhcE1vZGVybih7XG4gICAgICB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVwb05hbWUgPSBhd2FpdCBmaXh0dXJlLmJvb3RzdHJhcFJlcG9OYW1lKCk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1NldHVwIGNvbXBsZXRlIScpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXN0cm95KCdkb2NrZXItaW4tdXNlJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYEBhd3MtY2RrL2NvcmU6Ym9vdHN0cmFwUXVhbGlmaWVyPSR7Zml4dHVyZS5xdWFsaWZpZXJ9YCxcbiAgICAgICAgJy0tdG9vbGtpdC1zdGFjay1uYW1lJywgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgJy0tZm9yY2UnLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrR2FyYmFnZUNvbGxlY3Qoe1xuICAgICAgcm9sbGJhY2tCdWZmZXJEYXlzOiAwLFxuICAgICAgdHlwZTogJ2VjcicsXG4gICAgICBib290c3RyYXBTdGFja05hbWU6IHRvb2xraXRTdGFja05hbWUsXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ0dhcmJhZ2UgY29sbGVjdGlvbiBjb21wbGV0ZSEnKTtcblxuICAgIC8vIGFzc2VydCB0aGF0IHRoZSBib290c3RyYXAgcmVwb3NpdG9yeSBpcyBlbXB0eVxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLmVjci5zZW5kKG5ldyBMaXN0SW1hZ2VzQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSB9KSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5pbWFnZUlkcykudG9FcXVhbChbXSk7XG4gICAgICB9KTtcbiAgfSksXG4pO1xuXG5pbnRlZ1Rlc3QoXG4gICdHYXJiYWdlIENvbGxlY3Rpb24ga2VlcHMgaW4gdXNlIHMzIG9iamVjdHMnLFxuICB3aXRob3V0Qm9vdHN0cmFwKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdG9vbGtpdFN0YWNrTmFtZSA9IGZpeHR1cmUuYm9vdHN0cmFwU3RhY2tOYW1lO1xuICAgIGNvbnN0IGJvb3RzdHJhcEJ1Y2tldE5hbWUgPSBgYXdzLWNkay1nYXJiYWdlLWNvbGxlY3QtaW50ZWctdGVzdC1iY2t0LSR7cmFuZG9tU3RyaW5nKCl9YDtcbiAgICBmaXh0dXJlLnJlbWVtYmVyVG9EZWxldGVCdWNrZXQoYm9vdHN0cmFwQnVja2V0TmFtZSk7IC8vIGp1c3QgaW4gY2FzZVxuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtCb290c3RyYXBNb2Rlcm4oe1xuICAgICAgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgIGJvb3RzdHJhcEJ1Y2tldE5hbWUsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnbGFtYmRhJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYGJvb3RzdHJhcEJ1Y2tldD0ke2Jvb3RzdHJhcEJ1Y2tldE5hbWV9YCxcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1NldHVwIGNvbXBsZXRlIScpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtHYXJiYWdlQ29sbGVjdCh7XG4gICAgICByb2xsYmFja0J1ZmZlckRheXM6IDAsXG4gICAgICB0eXBlOiAnczMnLFxuICAgICAgYm9vdHN0cmFwU3RhY2tOYW1lOiB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdHYXJiYWdlIGNvbGxlY3Rpb24gY29tcGxldGUhJyk7XG5cbiAgICAvLyBhc3NlcnQgdGhhdCB0aGUgYm9vdHN0cmFwIGJ1Y2tldCBoYXMgdGhlIG9iamVjdFxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLnMzLnNlbmQobmV3IExpc3RPYmplY3RzVjJDb21tYW5kKHsgQnVja2V0OiBib290c3RyYXBCdWNrZXROYW1lIH0pKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LkNvbnRlbnRzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnbGFtYmRhJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYGJvb3RzdHJhcEJ1Y2tldD0ke2Jvb3RzdHJhcEJ1Y2tldE5hbWV9YCxcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1RlYXJkb3duIGNvbXBsZXRlIScpO1xuICB9KSxcbik7XG5cbmludGVnVGVzdChcbiAgJ0dhcmJhZ2UgQ29sbGVjdGlvbiBrZWVwcyBpbiB1c2UgZWNyIGltYWdlcycsXG4gIHdpdGhvdXRCb290c3RyYXAoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCB0b29sa2l0U3RhY2tOYW1lID0gZml4dHVyZS5ib290c3RyYXBTdGFja05hbWU7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0Jvb3RzdHJhcE1vZGVybih7XG4gICAgICB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVwb05hbWUgPSBhd2FpdCBmaXh0dXJlLmJvb3RzdHJhcFJlcG9OYW1lKCk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1NldHVwIGNvbXBsZXRlIScpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtHYXJiYWdlQ29sbGVjdCh7XG4gICAgICByb2xsYmFja0J1ZmZlckRheXM6IDAsXG4gICAgICB0eXBlOiAnZWNyJyxcbiAgICAgIGJvb3RzdHJhcFN0YWNrTmFtZTogdG9vbGtpdFN0YWNrTmFtZSxcbiAgICB9KTtcbiAgICBmaXh0dXJlLmxvZygnR2FyYmFnZSBjb2xsZWN0aW9uIGNvbXBsZXRlIScpO1xuXG4gICAgLy8gYXNzZXJ0IHRoYXQgdGhlIGJvb3RzdHJhcCByZXBvc2l0b3J5IGlzIGVtcHR5XG4gICAgYXdhaXQgZml4dHVyZS5hd3MuZWNyLnNlbmQobmV3IExpc3RJbWFnZXNDb21tYW5kKHsgcmVwb3NpdG9yeU5hbWU6IHJlcG9OYW1lIH0pKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmltYWdlSWRzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pLFxuKTtcblxuaW50ZWdUZXN0KFxuICAnR2FyYmFnZSBDb2xsZWN0aW9uIHRhZ3MgdW51c2VkIHMzIG9iamVjdHMnLFxuICB3aXRob3V0Qm9vdHN0cmFwKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdG9vbGtpdFN0YWNrTmFtZSA9IGZpeHR1cmUuYm9vdHN0cmFwU3RhY2tOYW1lO1xuICAgIGNvbnN0IGJvb3RzdHJhcEJ1Y2tldE5hbWUgPSBgYXdzLWNkay1nYXJiYWdlLWNvbGxlY3QtaW50ZWctdGVzdC1iY2t0LSR7cmFuZG9tU3RyaW5nKCl9YDtcbiAgICBmaXh0dXJlLnJlbWVtYmVyVG9EZWxldGVCdWNrZXQoYm9vdHN0cmFwQnVja2V0TmFtZSk7IC8vIGp1c3QgaW4gY2FzZVxuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtCb290c3RyYXBNb2Rlcm4oe1xuICAgICAgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgIGJvb3RzdHJhcEJ1Y2tldE5hbWUsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnbGFtYmRhJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYGJvb3RzdHJhcEJ1Y2tldD0ke2Jvb3RzdHJhcEJ1Y2tldE5hbWV9YCxcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1NldHVwIGNvbXBsZXRlIScpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXN0cm95KCdsYW1iZGEnLCB7XG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgICctLWNvbnRleHQnLCBgYm9vdHN0cmFwQnVja2V0PSR7Ym9vdHN0cmFwQnVja2V0TmFtZX1gLFxuICAgICAgICAnLS1jb250ZXh0JywgYEBhd3MtY2RrL2NvcmU6Ym9vdHN0cmFwUXVhbGlmaWVyPSR7Zml4dHVyZS5xdWFsaWZpZXJ9YCxcbiAgICAgICAgJy0tdG9vbGtpdC1zdGFjay1uYW1lJywgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgJy0tZm9yY2UnLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrR2FyYmFnZUNvbGxlY3Qoe1xuICAgICAgcm9sbGJhY2tCdWZmZXJEYXlzOiAxMDAsIC8vIHRoaXMgd2lsbCBlbnN1cmUgdGhhdCB3ZSBkbyBub3QgZGVsZXRlIGFzc2V0cyBpbW1lZGlhdGVseSAoYW5kIGp1c3QgdGFnIHRoZW0pXG4gICAgICB0eXBlOiAnczMnLFxuICAgICAgYm9vdHN0cmFwU3RhY2tOYW1lOiB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdHYXJiYWdlIGNvbGxlY3Rpb24gY29tcGxldGUhJyk7XG5cbiAgICAvLyBhc3NlcnQgdGhhdCB0aGUgYm9vdHN0cmFwIGJ1Y2tldCBoYXMgdGhlIG9iamVjdCBhbmQgaXMgdGFnZ2VkXG4gICAgYXdhaXQgZml4dHVyZS5hd3MuczMuc2VuZChuZXcgTGlzdE9iamVjdHNWMkNvbW1hbmQoeyBCdWNrZXQ6IGJvb3RzdHJhcEJ1Y2tldE5hbWUgfSkpXG4gICAgICAudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuQ29udGVudHMpLnRvSGF2ZUxlbmd0aCgyKTsgLy8gYWxzbyB0aGUgQ0ZOIHRlbXBsYXRlXG4gICAgICAgIGNvbnN0IGtleSA9IHJlc3VsdC5Db250ZW50cyFbMF0uS2V5O1xuICAgICAgICBjb25zdCB0YWdzID0gYXdhaXQgZml4dHVyZS5hd3MuczMuc2VuZChuZXcgR2V0T2JqZWN0VGFnZ2luZ0NvbW1hbmQoeyBCdWNrZXQ6IGJvb3RzdHJhcEJ1Y2tldE5hbWUsIEtleToga2V5IH0pKTtcbiAgICAgICAgZXhwZWN0KHRhZ3MuVGFnU2V0KS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnbGFtYmRhJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYGJvb3RzdHJhcEJ1Y2tldD0ke2Jvb3RzdHJhcEJ1Y2tldE5hbWV9YCxcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pLFxuKTtcblxuaW50ZWdUZXN0KFxuICAnR2FyYmFnZSBDb2xsZWN0aW9uIHRhZ3MgdW51c2VkIGVjciBpbWFnZXMnLFxuICB3aXRob3V0Qm9vdHN0cmFwKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdG9vbGtpdFN0YWNrTmFtZSA9IGZpeHR1cmUuYm9vdHN0cmFwU3RhY2tOYW1lO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtCb290c3RyYXBNb2Rlcm4oe1xuICAgICAgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcG9OYW1lID0gYXdhaXQgZml4dHVyZS5ib290c3RyYXBSZXBvTmFtZSgpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ2RvY2tlci1pbi11c2UnLCB7XG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgICctLWNvbnRleHQnLCBgQGF3cy1jZGsvY29yZTpib290c3RyYXBRdWFsaWZpZXI9JHtmaXh0dXJlLnF1YWxpZmllcn1gLFxuICAgICAgICAnLS10b29sa2l0LXN0YWNrLW5hbWUnLCB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAnLS1mb3JjZScsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdTZXR1cCBjb21wbGV0ZSEnKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0dhcmJhZ2VDb2xsZWN0KHtcbiAgICAgIHJvbGxiYWNrQnVmZmVyRGF5czogMTAwLCAvLyB0aGlzIHdpbGwgZW5zdXJlIHRoYXQgd2UgZG8gbm90IGRlbGV0ZSBhc3NldHMgaW1tZWRpYXRlbHkgKGFuZCBqdXN0IHRhZyB0aGVtKVxuICAgICAgdHlwZTogJ2VjcicsXG4gICAgICBib290c3RyYXBTdGFja05hbWU6IHRvb2xraXRTdGFja05hbWUsXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ0dhcmJhZ2UgY29sbGVjdGlvbiBjb21wbGV0ZSEnKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLmVjci5zZW5kKG5ldyBMaXN0SW1hZ2VzQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSB9KSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5pbWFnZUlkcykudG9IYXZlTGVuZ3RoKDIpOyAvLyB0aGUgc2Vjb25kIHRhZyBjb21lcyBpbiBhcyBhIHNlY29uZCAnaWQnXG4gICAgICB9KTtcbiAgfSksXG4pO1xuXG5pbnRlZ1Rlc3QoXG4gICdHYXJiYWdlIENvbGxlY3Rpb24gdW50YWdzIGluLXVzZSBzMyBvYmplY3RzJyxcbiAgd2l0aG91dEJvb3RzdHJhcChhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIGNvbnN0IHRvb2xraXRTdGFja05hbWUgPSBmaXh0dXJlLmJvb3RzdHJhcFN0YWNrTmFtZTtcbiAgICBjb25zdCBib290c3RyYXBCdWNrZXROYW1lID0gYGF3cy1jZGstZ2FyYmFnZS1jb2xsZWN0LWludGVnLXRlc3QtYmNrdC0ke3JhbmRvbVN0cmluZygpfWA7XG4gICAgZml4dHVyZS5yZW1lbWJlclRvRGVsZXRlQnVja2V0KGJvb3RzdHJhcEJ1Y2tldE5hbWUpOyAvLyBqdXN0IGluIGNhc2VcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrQm9vdHN0cmFwTW9kZXJuKHtcbiAgICAgIHRvb2xraXRTdGFja05hbWUsXG4gICAgICBib290c3RyYXBCdWNrZXROYW1lLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ2xhbWJkYScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBib290c3RyYXBCdWNrZXQ9JHtib290c3RyYXBCdWNrZXROYW1lfWAsXG4gICAgICAgICctLWNvbnRleHQnLCBgQGF3cy1jZGsvY29yZTpib290c3RyYXBRdWFsaWZpZXI9JHtmaXh0dXJlLnF1YWxpZmllcn1gLFxuICAgICAgICAnLS10b29sa2l0LXN0YWNrLW5hbWUnLCB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAnLS1mb3JjZScsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdTZXR1cCBjb21wbGV0ZSEnKTtcblxuICAgIC8vIEFydGlmaWNpYWxseSBhZGQgdGFnZ2luZyB0byB0aGUgYXNzZXQgaW4gdGhlIGJvb3RzdHJhcCBidWNrZXRcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaXh0dXJlLmF3cy5zMy5zZW5kKG5ldyBMaXN0T2JqZWN0c1YyQ29tbWFuZCh7IEJ1Y2tldDogYm9vdHN0cmFwQnVja2V0TmFtZSB9KSk7XG4gICAgY29uc3Qga2V5ID0gcmVzdWx0LkNvbnRlbnRzIS5maWx0ZXIoKGMpID0+IGMuS2V5Py5zcGxpdCgnLicpWzFdID09ICd6aXAnKVswXS5LZXk7IC8vIGZhbmN5IGZvb3R3b3JrIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBhc3NldCBrZXlcbiAgICBhd2FpdCBmaXh0dXJlLmF3cy5zMy5zZW5kKG5ldyBQdXRPYmplY3RUYWdnaW5nQ29tbWFuZCh7XG4gICAgICBCdWNrZXQ6IGJvb3RzdHJhcEJ1Y2tldE5hbWUsXG4gICAgICBLZXk6IGtleSxcbiAgICAgIFRhZ2dpbmc6IHtcbiAgICAgICAgVGFnU2V0OiBbe1xuICAgICAgICAgIEtleTogUzNfSVNPTEFURURfVEFHLFxuICAgICAgICAgIFZhbHVlOiAnMTIzNDUnLFxuICAgICAgICB9LCB7XG4gICAgICAgICAgS2V5OiAnYm9ndXMnLFxuICAgICAgICAgIFZhbHVlOiAndmFsJyxcbiAgICAgICAgfV0sXG4gICAgICB9LFxuICAgIH0pKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrR2FyYmFnZUNvbGxlY3Qoe1xuICAgICAgcm9sbGJhY2tCdWZmZXJEYXlzOiAxMDAsIC8vIHRoaXMgd2lsbCBlbnN1cmUgdGhhdCB3ZSBkbyBub3QgZGVsZXRlIGFzc2V0cyBpbW1lZGlhdGVseSAoYW5kIGp1c3QgdGFnIHRoZW0pXG4gICAgICB0eXBlOiAnczMnLFxuICAgICAgYm9vdHN0cmFwU3RhY2tOYW1lOiB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdHYXJiYWdlIGNvbGxlY3Rpb24gY29tcGxldGUhJyk7XG5cbiAgICAvLyBhc3NlcnQgdGhhdCB0aGUgaXNvbGF0ZWQgb2JqZWN0IHRhZyBpcyByZW1vdmVkIHdoaWxlIHRoZSBvdGhlciB0YWcgcmVtYWluc1xuICAgIGNvbnN0IG5ld1RhZ3MgPSBhd2FpdCBmaXh0dXJlLmF3cy5zMy5zZW5kKG5ldyBHZXRPYmplY3RUYWdnaW5nQ29tbWFuZCh7IEJ1Y2tldDogYm9vdHN0cmFwQnVja2V0TmFtZSwgS2V5OiBrZXkgfSkpO1xuXG4gICAgZXhwZWN0KG5ld1RhZ3MuVGFnU2V0KS50b0VxdWFsKFt7XG4gICAgICBLZXk6ICdib2d1cycsXG4gICAgICBWYWx1ZTogJ3ZhbCcsXG4gICAgfV0pO1xuICB9KSxcbik7XG5cbmludGVnVGVzdChcbiAgJ0dhcmJhZ2UgQ29sbGVjdGlvbiB1bnRhZ3MgaW4tdXNlIGVjciBpbWFnZXMnLFxuICB3aXRob3V0Qm9vdHN0cmFwKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdG9vbGtpdFN0YWNrTmFtZSA9IGZpeHR1cmUuYm9vdHN0cmFwU3RhY2tOYW1lO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtCb290c3RyYXBNb2Rlcm4oe1xuICAgICAgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcG9OYW1lID0gYXdhaXQgZml4dHVyZS5ib290c3RyYXBSZXBvTmFtZSgpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ2RvY2tlci1pbi11c2UnLCB7XG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgICctLWNvbnRleHQnLCBgQGF3cy1jZGsvY29yZTpib290c3RyYXBRdWFsaWZpZXI9JHtmaXh0dXJlLnF1YWxpZmllcn1gLFxuICAgICAgICAnLS10b29sa2l0LXN0YWNrLW5hbWUnLCB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAnLS1mb3JjZScsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdTZXR1cCBjb21wbGV0ZSEnKTtcblxuICAgIC8vIEFydGlmaWNpYWxseSBhZGQgdGFnZ2luZyB0byB0aGUgYXNzZXQgaW4gdGhlIGJvb3RzdHJhcCBidWNrZXRcbiAgICBjb25zdCBpbWFnZUlkcyA9IGF3YWl0IGZpeHR1cmUuYXdzLmVjci5zZW5kKG5ldyBMaXN0SW1hZ2VzQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSB9KSk7XG4gICAgY29uc3QgZGlnZXN0ID0gaW1hZ2VJZHMuaW1hZ2VJZHMhWzBdLmltYWdlRGlnZXN0O1xuICAgIGNvbnN0IGltYWdlTWFuaWZlc3RzID0gYXdhaXQgZml4dHVyZS5hd3MuZWNyLnNlbmQobmV3IEJhdGNoR2V0SW1hZ2VDb21tYW5kKHsgcmVwb3NpdG9yeU5hbWU6IHJlcG9OYW1lLCBpbWFnZUlkczogW3sgaW1hZ2VEaWdlc3Q6IGRpZ2VzdCB9XSB9KSk7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBpbWFnZU1hbmlmZXN0cy5pbWFnZXMhWzBdLmltYWdlTWFuaWZlc3Q7XG4gICAgYXdhaXQgZml4dHVyZS5hd3MuZWNyLnNlbmQobmV3IFB1dEltYWdlQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSwgaW1hZ2VNYW5pZmVzdDogbWFuaWZlc3QsIGltYWdlRGlnZXN0OiBkaWdlc3QsIGltYWdlVGFnOiBgMC0ke0VDUl9JU09MQVRFRF9UQUd9LTEyMzQ1YCB9KSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0dhcmJhZ2VDb2xsZWN0KHtcbiAgICAgIHJvbGxiYWNrQnVmZmVyRGF5czogMTAwLCAvLyB0aGlzIHdpbGwgZW5zdXJlIHRoYXQgd2UgZG8gbm90IGRlbGV0ZSBhc3NldHMgaW1tZWRpYXRlbHkgKGFuZCBqdXN0IHRhZyB0aGVtKVxuICAgICAgdHlwZTogJ2VjcicsXG4gICAgICBib290c3RyYXBTdGFja05hbWU6IHRvb2xraXRTdGFja05hbWUsXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ0dhcmJhZ2UgY29sbGVjdGlvbiBjb21wbGV0ZSEnKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLmVjci5zZW5kKG5ldyBMaXN0SW1hZ2VzQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSB9KSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5pbWFnZUlkcykudG9IYXZlTGVuZ3RoKDEpOyAvLyB0aGUgc2Vjb25kIHRhZyBoYXMgYmVlbiByZW1vdmVkXG4gICAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pLFxuKTtcbiJdfQ==
314
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FyYmFnZS1jb2xsZWN0aW9uLmludGVndGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdhcmJhZ2UtY29sbGVjdGlvbi5pbnRlZ3Rlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxvREFBK0Y7QUFDL0Ysa0RBQTRHO0FBQzVHLG1DQUFzRTtBQUV0RSxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztBQUMzQyxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO0FBRTVDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFNLENBQUMsQ0FBQyxDQUFDLHlFQUF5RTtBQUUzRyxJQUFBLGVBQVMsRUFDUCw4Q0FBOEMsRUFDOUMsSUFBQSxzQkFBZ0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDakMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUM7SUFDcEQsTUFBTSxtQkFBbUIsR0FBRywyQ0FBMkMsSUFBQSxrQkFBWSxHQUFFLEVBQUUsQ0FBQztJQUN4RixPQUFPLENBQUMsc0JBQXNCLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGVBQWU7SUFFcEUsTUFBTSxPQUFPLENBQUMsa0JBQWtCLENBQUM7UUFDL0IsZ0JBQWdCO1FBQ2hCLG1CQUFtQjtLQUNwQixDQUFDLENBQUM7SUFFSCxNQUFNLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFO1FBQ2hDLE9BQU8sRUFBRTtZQUNQLFdBQVcsRUFBRSxtQkFBbUIsbUJBQW1CLEVBQUU7WUFDckQsV0FBVyxFQUFFLG9DQUFvQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3BFLHNCQUFzQixFQUFFLGdCQUFnQjtZQUN4QyxTQUFTO1NBQ1Y7S0FDRixDQUFDLENBQUM7SUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFL0IsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtR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QUFDLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssZ0JBQWdCLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVySyxNQUFNLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztRQUM5QixrQkFBa0IsRUFBRSxHQUFHLEVBQUUsZ0ZBQWdGO1FBQ3pHLElBQUksRUFBRSxLQUFLO1FBQ1gsa0JBQWtCLEVBQUUsZ0JBQWdCO0tBQ3JDLENBQUMsQ0FBQztJQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUU1QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLDhCQUFpQixDQUFDLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDNUUsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDZixNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtDQUFrQztJQUM3RSxDQUFDLENBQUMsQ0FBQztJQUVMLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUU7UUFDeEMsT0FBTyxFQUFFO1lBQ1AsV0FBVyxFQUFFLG9DQUFvQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3BFLHNCQUFzQixFQUFFLGdCQUFnQjtZQUN4QyxTQUFTO1NBQ1Y7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmF0Y2hHZXRJbWFnZUNvbW1hbmQsIExpc3RJbWFnZXNDb21tYW5kLCBQdXRJbWFnZUNvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtZWNyJztcbmltcG9ydCB7IEdldE9iamVjdFRhZ2dpbmdDb21tYW5kLCBMaXN0T2JqZWN0c1YyQ29tbWFuZCwgUHV0T2JqZWN0VGFnZ2luZ0NvbW1hbmQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtczMnO1xuaW1wb3J0IHsgaW50ZWdUZXN0LCByYW5kb21TdHJpbmcsIHdpdGhvdXRCb290c3RyYXAgfSBmcm9tICcuLi8uLi9saWInO1xuXG5jb25zdCBTM19JU09MQVRFRF9UQUcgPSAnYXdzLWNkazppc29sYXRlZCc7XG5jb25zdCBFQ1JfSVNPTEFURURfVEFHID0gJ2F3cy1jZGsuaXNvbGF0ZWQnO1xuXG5qZXN0LnNldFRpbWVvdXQoMiAqIDYwICogNjBfMDAwKTsgLy8gSW5jbHVkZXMgdGhlIHRpbWUgdG8gYWNxdWlyZSBsb2Nrcywgd29yc3QtY2FzZSBzaW5nbGUtdGhyZWFkZWQgcnVudGltZVxuXG5pbnRlZ1Rlc3QoXG4gICdHYXJiYWdlIENvbGxlY3Rpb24gZGVsZXRlcyB1bnVzZWQgczMgb2JqZWN0cycsXG4gIHdpdGhvdXRCb290c3RyYXAoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCB0b29sa2l0U3RhY2tOYW1lID0gZml4dHVyZS5ib290c3RyYXBTdGFja05hbWU7XG4gICAgY29uc3QgYm9vdHN0cmFwQnVja2V0TmFtZSA9IGBhd3MtY2RrLWdhcmJhZ2UtY29sbGVjdC1pbnRlZy10ZXN0LWJja3QtJHtyYW5kb21TdHJpbmcoKX1gO1xuICAgIGZpeHR1cmUucmVtZW1iZXJUb0RlbGV0ZUJ1Y2tldChib290c3RyYXBCdWNrZXROYW1lKTsgLy8ganVzdCBpbiBjYXNlXG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0Jvb3RzdHJhcE1vZGVybih7XG4gICAgICB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgYm9vdHN0cmFwQnVja2V0TmFtZSxcbiAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVwbG95KCdsYW1iZGEnLCB7XG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgICctLWNvbnRleHQnLCBgYm9vdHN0cmFwQnVja2V0PSR7Ym9vdHN0cmFwQnVja2V0TmFtZX1gLFxuICAgICAgICAnLS1jb250ZXh0JywgYEBhd3MtY2RrL2NvcmU6Ym9vdHN0cmFwUXVhbGlmaWVyPSR7Zml4dHVyZS5xdWFsaWZpZXJ9YCxcbiAgICAgICAgJy0tdG9vbGtpdC1zdGFjay1uYW1lJywgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgJy0tZm9yY2UnLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBmaXh0dXJlLmxvZygnU2V0dXAgY29tcGxldGUhJyk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0Rlc3Ryb3koJ2xhbWJkYScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBib290c3RyYXBCdWNrZXQ9JHtib290c3RyYXBCdWNrZXROYW1lfWAsXG4gICAgICAgICctLWNvbnRleHQnLCBgQGF3cy1jZGsvY29yZTpib290c3RyYXBRdWFsaWZpZXI9JHtmaXh0dXJlLnF1YWxpZmllcn1gLFxuICAgICAgICAnLS10b29sa2l0LXN0YWNrLW5hbWUnLCB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAnLS1mb3JjZScsXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtHYXJiYWdlQ29sbGVjdCh7XG4gICAgICByb2xsYmFja0J1ZmZlckRheXM6IDAsXG4gICAgICB0eXBlOiAnczMnLFxuICAgICAgYm9vdHN0cmFwU3RhY2tOYW1lOiB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdHYXJiYWdlIGNvbGxlY3Rpb24gY29tcGxldGUhJyk7XG5cbiAgICAvLyBhc3NlcnQgdGhhdCB0aGUgYm9vdHN0cmFwIGJ1Y2tldCBpcyBlbXB0eVxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLnMzLnNlbmQobmV3IExpc3RPYmplY3RzVjJDb21tYW5kKHsgQnVja2V0OiBib290c3RyYXBCdWNrZXROYW1lIH0pKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LkNvbnRlbnRzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICB9KTtcbiAgfSksXG4pO1xuXG5pbnRlZ1Rlc3QoXG4gICdHYXJiYWdlIENvbGxlY3Rpb24gZGVsZXRlcyB1bnVzZWQgZWNyIGltYWdlcycsXG4gIHdpdGhvdXRCb290c3RyYXAoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCB0b29sa2l0U3RhY2tOYW1lID0gZml4dHVyZS5ib290c3RyYXBTdGFja05hbWU7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0Jvb3RzdHJhcE1vZGVybih7XG4gICAgICB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVwb05hbWUgPSBhd2FpdCBmaXh0dXJlLmJvb3RzdHJhcFJlcG9OYW1lKCk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1NldHVwIGNvbXBsZXRlIScpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXN0cm95KCdkb2NrZXItaW4tdXNlJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYEBhd3MtY2RrL2NvcmU6Ym9vdHN0cmFwUXVhbGlmaWVyPSR7Zml4dHVyZS5xdWFsaWZpZXJ9YCxcbiAgICAgICAgJy0tdG9vbGtpdC1zdGFjay1uYW1lJywgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgJy0tZm9yY2UnLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrR2FyYmFnZUNvbGxlY3Qoe1xuICAgICAgcm9sbGJhY2tCdWZmZXJEYXlzOiAwLFxuICAgICAgdHlwZTogJ2VjcicsXG4gICAgICBib290c3RyYXBTdGFja05hbWU6IHRvb2xraXRTdGFja05hbWUsXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ0dhcmJhZ2UgY29sbGVjdGlvbiBjb21wbGV0ZSEnKTtcblxuICAgIC8vIGFzc2VydCB0aGF0IHRoZSBib290c3RyYXAgcmVwb3NpdG9yeSBpcyBlbXB0eVxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLmVjci5zZW5kKG5ldyBMaXN0SW1hZ2VzQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSB9KSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5pbWFnZUlkcykudG9FcXVhbChbXSk7XG4gICAgICB9KTtcbiAgfSksXG4pO1xuXG5pbnRlZ1Rlc3QoXG4gICdHYXJiYWdlIENvbGxlY3Rpb24ga2VlcHMgaW4gdXNlIHMzIG9iamVjdHMnLFxuICB3aXRob3V0Qm9vdHN0cmFwKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdG9vbGtpdFN0YWNrTmFtZSA9IGZpeHR1cmUuYm9vdHN0cmFwU3RhY2tOYW1lO1xuICAgIGNvbnN0IGJvb3RzdHJhcEJ1Y2tldE5hbWUgPSBgYXdzLWNkay1nYXJiYWdlLWNvbGxlY3QtaW50ZWctdGVzdC1iY2t0LSR7cmFuZG9tU3RyaW5nKCl9YDtcbiAgICBmaXh0dXJlLnJlbWVtYmVyVG9EZWxldGVCdWNrZXQoYm9vdHN0cmFwQnVja2V0TmFtZSk7IC8vIGp1c3QgaW4gY2FzZVxuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtCb290c3RyYXBNb2Rlcm4oe1xuICAgICAgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgIGJvb3RzdHJhcEJ1Y2tldE5hbWUsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnbGFtYmRhJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYGJvb3RzdHJhcEJ1Y2tldD0ke2Jvb3RzdHJhcEJ1Y2tldE5hbWV9YCxcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1NldHVwIGNvbXBsZXRlIScpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtHYXJiYWdlQ29sbGVjdCh7XG4gICAgICByb2xsYmFja0J1ZmZlckRheXM6IDAsXG4gICAgICB0eXBlOiAnczMnLFxuICAgICAgYm9vdHN0cmFwU3RhY2tOYW1lOiB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdHYXJiYWdlIGNvbGxlY3Rpb24gY29tcGxldGUhJyk7XG5cbiAgICAvLyBhc3NlcnQgdGhhdCB0aGUgYm9vdHN0cmFwIGJ1Y2tldCBoYXMgdGhlIG9iamVjdFxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLnMzLnNlbmQobmV3IExpc3RPYmplY3RzVjJDb21tYW5kKHsgQnVja2V0OiBib290c3RyYXBCdWNrZXROYW1lIH0pKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LkNvbnRlbnRzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnbGFtYmRhJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYGJvb3RzdHJhcEJ1Y2tldD0ke2Jvb3RzdHJhcEJ1Y2tldE5hbWV9YCxcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1RlYXJkb3duIGNvbXBsZXRlIScpO1xuICB9KSxcbik7XG5cbmludGVnVGVzdChcbiAgJ0dhcmJhZ2UgQ29sbGVjdGlvbiBrZWVwcyBpbiB1c2UgZWNyIGltYWdlcycsXG4gIHdpdGhvdXRCb290c3RyYXAoYXN5bmMgKGZpeHR1cmUpID0+IHtcbiAgICBjb25zdCB0b29sa2l0U3RhY2tOYW1lID0gZml4dHVyZS5ib290c3RyYXBTdGFja05hbWU7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0Jvb3RzdHJhcE1vZGVybih7XG4gICAgICB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVwb05hbWUgPSBhd2FpdCBmaXh0dXJlLmJvb3RzdHJhcFJlcG9OYW1lKCk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1NldHVwIGNvbXBsZXRlIScpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtHYXJiYWdlQ29sbGVjdCh7XG4gICAgICByb2xsYmFja0J1ZmZlckRheXM6IDAsXG4gICAgICB0eXBlOiAnZWNyJyxcbiAgICAgIGJvb3RzdHJhcFN0YWNrTmFtZTogdG9vbGtpdFN0YWNrTmFtZSxcbiAgICB9KTtcbiAgICBmaXh0dXJlLmxvZygnR2FyYmFnZSBjb2xsZWN0aW9uIGNvbXBsZXRlIScpO1xuXG4gICAgLy8gYXNzZXJ0IHRoYXQgdGhlIGJvb3RzdHJhcCByZXBvc2l0b3J5IGlzIGVtcHR5XG4gICAgYXdhaXQgZml4dHVyZS5hd3MuZWNyLnNlbmQobmV3IExpc3RJbWFnZXNDb21tYW5kKHsgcmVwb3NpdG9yeU5hbWU6IHJlcG9OYW1lIH0pKVxuICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzdWx0LmltYWdlSWRzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pLFxuKTtcblxuaW50ZWdUZXN0KFxuICAnR2FyYmFnZSBDb2xsZWN0aW9uIHRhZ3MgdW51c2VkIHMzIG9iamVjdHMnLFxuICB3aXRob3V0Qm9vdHN0cmFwKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdG9vbGtpdFN0YWNrTmFtZSA9IGZpeHR1cmUuYm9vdHN0cmFwU3RhY2tOYW1lO1xuICAgIGNvbnN0IGJvb3RzdHJhcEJ1Y2tldE5hbWUgPSBgYXdzLWNkay1nYXJiYWdlLWNvbGxlY3QtaW50ZWctdGVzdC1iY2t0LSR7cmFuZG9tU3RyaW5nKCl9YDtcbiAgICBmaXh0dXJlLnJlbWVtYmVyVG9EZWxldGVCdWNrZXQoYm9vdHN0cmFwQnVja2V0TmFtZSk7IC8vIGp1c3QgaW4gY2FzZVxuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtCb290c3RyYXBNb2Rlcm4oe1xuICAgICAgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgIGJvb3RzdHJhcEJ1Y2tldE5hbWUsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0RlcGxveSgnbGFtYmRhJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYGJvb3RzdHJhcEJ1Y2tldD0ke2Jvb3RzdHJhcEJ1Y2tldE5hbWV9YCxcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ1NldHVwIGNvbXBsZXRlIScpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXN0cm95KCdsYW1iZGEnLCB7XG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgICctLWNvbnRleHQnLCBgYm9vdHN0cmFwQnVja2V0PSR7Ym9vdHN0cmFwQnVja2V0TmFtZX1gLFxuICAgICAgICAnLS1jb250ZXh0JywgYEBhd3MtY2RrL2NvcmU6Ym9vdHN0cmFwUXVhbGlmaWVyPSR7Zml4dHVyZS5xdWFsaWZpZXJ9YCxcbiAgICAgICAgJy0tdG9vbGtpdC1zdGFjay1uYW1lJywgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgJy0tZm9yY2UnLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrR2FyYmFnZUNvbGxlY3Qoe1xuICAgICAgcm9sbGJhY2tCdWZmZXJEYXlzOiAxMDAsIC8vIHRoaXMgd2lsbCBlbnN1cmUgdGhhdCB3ZSBkbyBub3QgZGVsZXRlIGFzc2V0cyBpbW1lZGlhdGVseSAoYW5kIGp1c3QgdGFnIHRoZW0pXG4gICAgICB0eXBlOiAnczMnLFxuICAgICAgYm9vdHN0cmFwU3RhY2tOYW1lOiB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdHYXJiYWdlIGNvbGxlY3Rpb24gY29tcGxldGUhJyk7XG5cbiAgICAvLyBhc3NlcnQgdGhhdCB0aGUgYm9vdHN0cmFwIGJ1Y2tldCBoYXMgdGhlIG9iamVjdCBhbmQgaXMgdGFnZ2VkXG4gICAgYXdhaXQgZml4dHVyZS5hd3MuczMuc2VuZChuZXcgTGlzdE9iamVjdHNWMkNvbW1hbmQoeyBCdWNrZXQ6IGJvb3RzdHJhcEJ1Y2tldE5hbWUgfSkpXG4gICAgICAudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXN1bHQuQ29udGVudHMpLnRvSGF2ZUxlbmd0aCgyKTsgLy8gYWxzbyB0aGUgQ0ZOIHRlbXBsYXRlXG4gICAgICAgIGNvbnN0IGtleSA9IHJlc3VsdC5Db250ZW50cyFbMF0uS2V5O1xuICAgICAgICBjb25zdCB0YWdzID0gYXdhaXQgZml4dHVyZS5hd3MuczMuc2VuZChuZXcgR2V0T2JqZWN0VGFnZ2luZ0NvbW1hbmQoeyBCdWNrZXQ6IGJvb3RzdHJhcEJ1Y2tldE5hbWUsIEtleToga2V5IH0pKTtcbiAgICAgICAgZXhwZWN0KHRhZ3MuVGFnU2V0KS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnbGFtYmRhJywge1xuICAgICAgb3B0aW9uczogW1xuICAgICAgICAnLS1jb250ZXh0JywgYGJvb3RzdHJhcEJ1Y2tldD0ke2Jvb3RzdHJhcEJ1Y2tldE5hbWV9YCxcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pLFxuKTtcblxuaW50ZWdUZXN0KFxuICAnR2FyYmFnZSBDb2xsZWN0aW9uIHRhZ3MgdW51c2VkIGVjciBpbWFnZXMnLFxuICB3aXRob3V0Qm9vdHN0cmFwKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdG9vbGtpdFN0YWNrTmFtZSA9IGZpeHR1cmUuYm9vdHN0cmFwU3RhY2tOYW1lO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtCb290c3RyYXBNb2Rlcm4oe1xuICAgICAgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcG9OYW1lID0gYXdhaXQgZml4dHVyZS5ib290c3RyYXBSZXBvTmFtZSgpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ2RvY2tlci1pbi11c2UnLCB7XG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgICctLWNvbnRleHQnLCBgQGF3cy1jZGsvY29yZTpib290c3RyYXBRdWFsaWZpZXI9JHtmaXh0dXJlLnF1YWxpZmllcn1gLFxuICAgICAgICAnLS10b29sa2l0LXN0YWNrLW5hbWUnLCB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAnLS1mb3JjZScsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdTZXR1cCBjb21wbGV0ZSEnKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0dhcmJhZ2VDb2xsZWN0KHtcbiAgICAgIHJvbGxiYWNrQnVmZmVyRGF5czogMTAwLCAvLyB0aGlzIHdpbGwgZW5zdXJlIHRoYXQgd2UgZG8gbm90IGRlbGV0ZSBhc3NldHMgaW1tZWRpYXRlbHkgKGFuZCBqdXN0IHRhZyB0aGVtKVxuICAgICAgdHlwZTogJ2VjcicsXG4gICAgICBib290c3RyYXBTdGFja05hbWU6IHRvb2xraXRTdGFja05hbWUsXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ0dhcmJhZ2UgY29sbGVjdGlvbiBjb21wbGV0ZSEnKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLmVjci5zZW5kKG5ldyBMaXN0SW1hZ2VzQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSB9KSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5pbWFnZUlkcykudG9IYXZlTGVuZ3RoKDIpOyAvLyB0aGUgc2Vjb25kIHRhZyBjb21lcyBpbiBhcyBhIHNlY29uZCAnaWQnXG4gICAgICB9KTtcbiAgfSksXG4pO1xuXG5pbnRlZ1Rlc3QoXG4gICdHYXJiYWdlIENvbGxlY3Rpb24gdW50YWdzIGluLXVzZSBzMyBvYmplY3RzJyxcbiAgd2l0aG91dEJvb3RzdHJhcChhc3luYyAoZml4dHVyZSkgPT4ge1xuICAgIGNvbnN0IHRvb2xraXRTdGFja05hbWUgPSBmaXh0dXJlLmJvb3RzdHJhcFN0YWNrTmFtZTtcbiAgICBjb25zdCBib290c3RyYXBCdWNrZXROYW1lID0gYGF3cy1jZGstZ2FyYmFnZS1jb2xsZWN0LWludGVnLXRlc3QtYmNrdC0ke3JhbmRvbVN0cmluZygpfWA7XG4gICAgZml4dHVyZS5yZW1lbWJlclRvRGVsZXRlQnVja2V0KGJvb3RzdHJhcEJ1Y2tldE5hbWUpOyAvLyBqdXN0IGluIGNhc2VcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrQm9vdHN0cmFwTW9kZXJuKHtcbiAgICAgIHRvb2xraXRTdGFja05hbWUsXG4gICAgICBib290c3RyYXBCdWNrZXROYW1lLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ2xhbWJkYScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBib290c3RyYXBCdWNrZXQ9JHtib290c3RyYXBCdWNrZXROYW1lfWAsXG4gICAgICAgICctLWNvbnRleHQnLCBgQGF3cy1jZGsvY29yZTpib290c3RyYXBRdWFsaWZpZXI9JHtmaXh0dXJlLnF1YWxpZmllcn1gLFxuICAgICAgICAnLS10b29sa2l0LXN0YWNrLW5hbWUnLCB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAnLS1mb3JjZScsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdTZXR1cCBjb21wbGV0ZSEnKTtcblxuICAgIC8vIEFydGlmaWNpYWxseSBhZGQgdGFnZ2luZyB0byB0aGUgYXNzZXQgaW4gdGhlIGJvb3RzdHJhcCBidWNrZXRcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaXh0dXJlLmF3cy5zMy5zZW5kKG5ldyBMaXN0T2JqZWN0c1YyQ29tbWFuZCh7IEJ1Y2tldDogYm9vdHN0cmFwQnVja2V0TmFtZSB9KSk7XG4gICAgY29uc3Qga2V5ID0gcmVzdWx0LkNvbnRlbnRzIS5maWx0ZXIoKGMpID0+IGMuS2V5Py5zcGxpdCgnLicpWzFdID09ICd6aXAnKVswXS5LZXk7IC8vIGZhbmN5IGZvb3R3b3JrIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBhc3NldCBrZXlcbiAgICBhd2FpdCBmaXh0dXJlLmF3cy5zMy5zZW5kKG5ldyBQdXRPYmplY3RUYWdnaW5nQ29tbWFuZCh7XG4gICAgICBCdWNrZXQ6IGJvb3RzdHJhcEJ1Y2tldE5hbWUsXG4gICAgICBLZXk6IGtleSxcbiAgICAgIFRhZ2dpbmc6IHtcbiAgICAgICAgVGFnU2V0OiBbe1xuICAgICAgICAgIEtleTogUzNfSVNPTEFURURfVEFHLFxuICAgICAgICAgIFZhbHVlOiAnMTIzNDUnLFxuICAgICAgICB9LCB7XG4gICAgICAgICAgS2V5OiAnYm9ndXMnLFxuICAgICAgICAgIFZhbHVlOiAndmFsJyxcbiAgICAgICAgfV0sXG4gICAgICB9LFxuICAgIH0pKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrR2FyYmFnZUNvbGxlY3Qoe1xuICAgICAgcm9sbGJhY2tCdWZmZXJEYXlzOiAxMDAsIC8vIHRoaXMgd2lsbCBlbnN1cmUgdGhhdCB3ZSBkbyBub3QgZGVsZXRlIGFzc2V0cyBpbW1lZGlhdGVseSAoYW5kIGp1c3QgdGFnIHRoZW0pXG4gICAgICB0eXBlOiAnczMnLFxuICAgICAgYm9vdHN0cmFwU3RhY2tOYW1lOiB0b29sa2l0U3RhY2tOYW1lLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdHYXJiYWdlIGNvbGxlY3Rpb24gY29tcGxldGUhJyk7XG5cbiAgICAvLyBhc3NlcnQgdGhhdCB0aGUgaXNvbGF0ZWQgb2JqZWN0IHRhZyBpcyByZW1vdmVkIHdoaWxlIHRoZSBvdGhlciB0YWcgcmVtYWluc1xuICAgIGNvbnN0IG5ld1RhZ3MgPSBhd2FpdCBmaXh0dXJlLmF3cy5zMy5zZW5kKG5ldyBHZXRPYmplY3RUYWdnaW5nQ29tbWFuZCh7IEJ1Y2tldDogYm9vdHN0cmFwQnVja2V0TmFtZSwgS2V5OiBrZXkgfSkpO1xuXG4gICAgZXhwZWN0KG5ld1RhZ3MuVGFnU2V0KS50b0VxdWFsKFt7XG4gICAgICBLZXk6ICdib2d1cycsXG4gICAgICBWYWx1ZTogJ3ZhbCcsXG4gICAgfV0pO1xuICB9KSxcbik7XG5cbmludGVnVGVzdChcbiAgJ0dhcmJhZ2UgQ29sbGVjdGlvbiB1bnRhZ3MgaW4tdXNlIGVjciBpbWFnZXMnLFxuICB3aXRob3V0Qm9vdHN0cmFwKGFzeW5jIChmaXh0dXJlKSA9PiB7XG4gICAgY29uc3QgdG9vbGtpdFN0YWNrTmFtZSA9IGZpeHR1cmUuYm9vdHN0cmFwU3RhY2tOYW1lO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtCb290c3RyYXBNb2Rlcm4oe1xuICAgICAgdG9vbGtpdFN0YWNrTmFtZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlcG9OYW1lID0gYXdhaXQgZml4dHVyZS5ib290c3RyYXBSZXBvTmFtZSgpO1xuXG4gICAgYXdhaXQgZml4dHVyZS5jZGtEZXBsb3koJ2RvY2tlci1pbi11c2UnLCB7XG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgICctLWNvbnRleHQnLCBgQGF3cy1jZGsvY29yZTpib290c3RyYXBRdWFsaWZpZXI9JHtmaXh0dXJlLnF1YWxpZmllcn1gLFxuICAgICAgICAnLS10b29sa2l0LXN0YWNrLW5hbWUnLCB0b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAnLS1mb3JjZScsXG4gICAgICBdLFxuICAgIH0pO1xuICAgIGZpeHR1cmUubG9nKCdTZXR1cCBjb21wbGV0ZSEnKTtcblxuICAgIC8vIEFydGlmaWNpYWxseSBhZGQgdGFnZ2luZyB0byB0aGUgYXNzZXQgaW4gdGhlIGJvb3RzdHJhcCBidWNrZXRcbiAgICBjb25zdCBpbWFnZUlkcyA9IGF3YWl0IGZpeHR1cmUuYXdzLmVjci5zZW5kKG5ldyBMaXN0SW1hZ2VzQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSB9KSk7XG4gICAgY29uc3QgZGlnZXN0ID0gaW1hZ2VJZHMuaW1hZ2VJZHMhWzBdLmltYWdlRGlnZXN0O1xuICAgIGNvbnN0IGltYWdlTWFuaWZlc3RzID0gYXdhaXQgZml4dHVyZS5hd3MuZWNyLnNlbmQobmV3IEJhdGNoR2V0SW1hZ2VDb21tYW5kKHsgcmVwb3NpdG9yeU5hbWU6IHJlcG9OYW1lLCBpbWFnZUlkczogW3sgaW1hZ2VEaWdlc3Q6IGRpZ2VzdCB9XSB9KSk7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBpbWFnZU1hbmlmZXN0cy5pbWFnZXMhWzBdLmltYWdlTWFuaWZlc3Q7XG4gICAgYXdhaXQgZml4dHVyZS5hd3MuZWNyLnNlbmQobmV3IFB1dEltYWdlQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSwgaW1hZ2VNYW5pZmVzdDogbWFuaWZlc3QsIGltYWdlRGlnZXN0OiBkaWdlc3QsIGltYWdlVGFnOiBgMC0ke0VDUl9JU09MQVRFRF9UQUd9LTEyMzQ1YCB9KSk7XG5cbiAgICBhd2FpdCBmaXh0dXJlLmNka0dhcmJhZ2VDb2xsZWN0KHtcbiAgICAgIHJvbGxiYWNrQnVmZmVyRGF5czogMTAwLCAvLyB0aGlzIHdpbGwgZW5zdXJlIHRoYXQgd2UgZG8gbm90IGRlbGV0ZSBhc3NldHMgaW1tZWRpYXRlbHkgKGFuZCBqdXN0IHRhZyB0aGVtKVxuICAgICAgdHlwZTogJ2VjcicsXG4gICAgICBib290c3RyYXBTdGFja05hbWU6IHRvb2xraXRTdGFja05hbWUsXG4gICAgfSk7XG4gICAgZml4dHVyZS5sb2coJ0dhcmJhZ2UgY29sbGVjdGlvbiBjb21wbGV0ZSEnKTtcblxuICAgIGF3YWl0IGZpeHR1cmUuYXdzLmVjci5zZW5kKG5ldyBMaXN0SW1hZ2VzQ29tbWFuZCh7IHJlcG9zaXRvcnlOYW1lOiByZXBvTmFtZSB9KSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc3VsdC5pbWFnZUlkcykudG9IYXZlTGVuZ3RoKDEpOyAvLyB0aGUgc2Vjb25kIHRhZyBoYXMgYmVlbiByZW1vdmVkXG4gICAgICB9KTtcblxuICAgIGF3YWl0IGZpeHR1cmUuY2RrRGVzdHJveSgnZG9ja2VyLWluLXVzZScsIHtcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgJy0tY29udGV4dCcsIGBAYXdzLWNkay9jb3JlOmJvb3RzdHJhcFF1YWxpZmllcj0ke2ZpeHR1cmUucXVhbGlmaWVyfWAsXG4gICAgICAgICctLXRvb2xraXQtc3RhY2stbmFtZScsIHRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICctLWZvcmNlJyxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH0pLFxuKTtcbiJdfQ==
@@ -0,0 +1,392 @@
1
+ import { BatchGetImageCommand, ListImagesCommand, PutImageCommand } from '@aws-sdk/client-ecr';
2
+ import { GetObjectTaggingCommand, ListObjectsV2Command, PutObjectTaggingCommand } from '@aws-sdk/client-s3';
3
+ import { integTest, randomString, withoutBootstrap } from '../../lib';
4
+
5
+ const S3_ISOLATED_TAG = 'aws-cdk:isolated';
6
+ const ECR_ISOLATED_TAG = 'aws-cdk.isolated';
7
+
8
+ jest.setTimeout(2 * 60 * 60_000); // Includes the time to acquire locks, worst-case single-threaded runtime
9
+
10
+ integTest(
11
+ 'Garbage Collection deletes unused s3 objects',
12
+ withoutBootstrap(async (fixture) => {
13
+ const toolkitStackName = fixture.bootstrapStackName;
14
+ const bootstrapBucketName = `aws-cdk-garbage-collect-integ-test-bckt-${randomString()}`;
15
+ fixture.rememberToDeleteBucket(bootstrapBucketName); // just in case
16
+
17
+ await fixture.cdkBootstrapModern({
18
+ toolkitStackName,
19
+ bootstrapBucketName,
20
+ });
21
+
22
+ await fixture.cdkDeploy('lambda', {
23
+ options: [
24
+ '--context', `bootstrapBucket=${bootstrapBucketName}`,
25
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
26
+ '--toolkit-stack-name', toolkitStackName,
27
+ '--force',
28
+ ],
29
+ });
30
+ fixture.log('Setup complete!');
31
+
32
+ await fixture.cdkDestroy('lambda', {
33
+ options: [
34
+ '--context', `bootstrapBucket=${bootstrapBucketName}`,
35
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
36
+ '--toolkit-stack-name', toolkitStackName,
37
+ '--force',
38
+ ],
39
+ });
40
+
41
+ await fixture.cdkGarbageCollect({
42
+ rollbackBufferDays: 0,
43
+ type: 's3',
44
+ bootstrapStackName: toolkitStackName,
45
+ });
46
+ fixture.log('Garbage collection complete!');
47
+
48
+ // assert that the bootstrap bucket is empty
49
+ await fixture.aws.s3.send(new ListObjectsV2Command({ Bucket: bootstrapBucketName }))
50
+ .then((result) => {
51
+ expect(result.Contents).toBeUndefined();
52
+ });
53
+ }),
54
+ );
55
+
56
+ integTest(
57
+ 'Garbage Collection deletes unused ecr images',
58
+ withoutBootstrap(async (fixture) => {
59
+ const toolkitStackName = fixture.bootstrapStackName;
60
+
61
+ await fixture.cdkBootstrapModern({
62
+ toolkitStackName,
63
+ });
64
+
65
+ const repoName = await fixture.bootstrapRepoName();
66
+
67
+ await fixture.cdkDeploy('docker-in-use', {
68
+ options: [
69
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
70
+ '--toolkit-stack-name', toolkitStackName,
71
+ '--force',
72
+ ],
73
+ });
74
+ fixture.log('Setup complete!');
75
+
76
+ await fixture.cdkDestroy('docker-in-use', {
77
+ options: [
78
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
79
+ '--toolkit-stack-name', toolkitStackName,
80
+ '--force',
81
+ ],
82
+ });
83
+
84
+ await fixture.cdkGarbageCollect({
85
+ rollbackBufferDays: 0,
86
+ type: 'ecr',
87
+ bootstrapStackName: toolkitStackName,
88
+ });
89
+ fixture.log('Garbage collection complete!');
90
+
91
+ // assert that the bootstrap repository is empty
92
+ await fixture.aws.ecr.send(new ListImagesCommand({ repositoryName: repoName }))
93
+ .then((result) => {
94
+ expect(result.imageIds).toEqual([]);
95
+ });
96
+ }),
97
+ );
98
+
99
+ integTest(
100
+ 'Garbage Collection keeps in use s3 objects',
101
+ withoutBootstrap(async (fixture) => {
102
+ const toolkitStackName = fixture.bootstrapStackName;
103
+ const bootstrapBucketName = `aws-cdk-garbage-collect-integ-test-bckt-${randomString()}`;
104
+ fixture.rememberToDeleteBucket(bootstrapBucketName); // just in case
105
+
106
+ await fixture.cdkBootstrapModern({
107
+ toolkitStackName,
108
+ bootstrapBucketName,
109
+ });
110
+
111
+ await fixture.cdkDeploy('lambda', {
112
+ options: [
113
+ '--context', `bootstrapBucket=${bootstrapBucketName}`,
114
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
115
+ '--toolkit-stack-name', toolkitStackName,
116
+ '--force',
117
+ ],
118
+ });
119
+ fixture.log('Setup complete!');
120
+
121
+ await fixture.cdkGarbageCollect({
122
+ rollbackBufferDays: 0,
123
+ type: 's3',
124
+ bootstrapStackName: toolkitStackName,
125
+ });
126
+ fixture.log('Garbage collection complete!');
127
+
128
+ // assert that the bootstrap bucket has the object
129
+ await fixture.aws.s3.send(new ListObjectsV2Command({ Bucket: bootstrapBucketName }))
130
+ .then((result) => {
131
+ expect(result.Contents).toHaveLength(1);
132
+ });
133
+
134
+ await fixture.cdkDestroy('lambda', {
135
+ options: [
136
+ '--context', `bootstrapBucket=${bootstrapBucketName}`,
137
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
138
+ '--toolkit-stack-name', toolkitStackName,
139
+ '--force',
140
+ ],
141
+ });
142
+ fixture.log('Teardown complete!');
143
+ }),
144
+ );
145
+
146
+ integTest(
147
+ 'Garbage Collection keeps in use ecr images',
148
+ withoutBootstrap(async (fixture) => {
149
+ const toolkitStackName = fixture.bootstrapStackName;
150
+
151
+ await fixture.cdkBootstrapModern({
152
+ toolkitStackName,
153
+ });
154
+
155
+ const repoName = await fixture.bootstrapRepoName();
156
+
157
+ await fixture.cdkDeploy('docker-in-use', {
158
+ options: [
159
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
160
+ '--toolkit-stack-name', toolkitStackName,
161
+ '--force',
162
+ ],
163
+ });
164
+ fixture.log('Setup complete!');
165
+
166
+ await fixture.cdkGarbageCollect({
167
+ rollbackBufferDays: 0,
168
+ type: 'ecr',
169
+ bootstrapStackName: toolkitStackName,
170
+ });
171
+ fixture.log('Garbage collection complete!');
172
+
173
+ // assert that the bootstrap repository is empty
174
+ await fixture.aws.ecr.send(new ListImagesCommand({ repositoryName: repoName }))
175
+ .then((result) => {
176
+ expect(result.imageIds).toHaveLength(1);
177
+ });
178
+
179
+ await fixture.cdkDestroy('docker-in-use', {
180
+ options: [
181
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
182
+ '--toolkit-stack-name', toolkitStackName,
183
+ '--force',
184
+ ],
185
+ });
186
+ }),
187
+ );
188
+
189
+ integTest(
190
+ 'Garbage Collection tags unused s3 objects',
191
+ withoutBootstrap(async (fixture) => {
192
+ const toolkitStackName = fixture.bootstrapStackName;
193
+ const bootstrapBucketName = `aws-cdk-garbage-collect-integ-test-bckt-${randomString()}`;
194
+ fixture.rememberToDeleteBucket(bootstrapBucketName); // just in case
195
+
196
+ await fixture.cdkBootstrapModern({
197
+ toolkitStackName,
198
+ bootstrapBucketName,
199
+ });
200
+
201
+ await fixture.cdkDeploy('lambda', {
202
+ options: [
203
+ '--context', `bootstrapBucket=${bootstrapBucketName}`,
204
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
205
+ '--toolkit-stack-name', toolkitStackName,
206
+ '--force',
207
+ ],
208
+ });
209
+ fixture.log('Setup complete!');
210
+
211
+ await fixture.cdkDestroy('lambda', {
212
+ options: [
213
+ '--context', `bootstrapBucket=${bootstrapBucketName}`,
214
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
215
+ '--toolkit-stack-name', toolkitStackName,
216
+ '--force',
217
+ ],
218
+ });
219
+
220
+ await fixture.cdkGarbageCollect({
221
+ rollbackBufferDays: 100, // this will ensure that we do not delete assets immediately (and just tag them)
222
+ type: 's3',
223
+ bootstrapStackName: toolkitStackName,
224
+ });
225
+ fixture.log('Garbage collection complete!');
226
+
227
+ // assert that the bootstrap bucket has the object and is tagged
228
+ await fixture.aws.s3.send(new ListObjectsV2Command({ Bucket: bootstrapBucketName }))
229
+ .then(async (result) => {
230
+ expect(result.Contents).toHaveLength(2); // also the CFN template
231
+ const key = result.Contents![0].Key;
232
+ const tags = await fixture.aws.s3.send(new GetObjectTaggingCommand({ Bucket: bootstrapBucketName, Key: key }));
233
+ expect(tags.TagSet).toHaveLength(1);
234
+ });
235
+
236
+ await fixture.cdkDestroy('lambda', {
237
+ options: [
238
+ '--context', `bootstrapBucket=${bootstrapBucketName}`,
239
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
240
+ '--toolkit-stack-name', toolkitStackName,
241
+ '--force',
242
+ ],
243
+ });
244
+ }),
245
+ );
246
+
247
+ integTest(
248
+ 'Garbage Collection tags unused ecr images',
249
+ withoutBootstrap(async (fixture) => {
250
+ const toolkitStackName = fixture.bootstrapStackName;
251
+
252
+ await fixture.cdkBootstrapModern({
253
+ toolkitStackName,
254
+ });
255
+
256
+ const repoName = await fixture.bootstrapRepoName();
257
+
258
+ await fixture.cdkDeploy('docker-in-use', {
259
+ options: [
260
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
261
+ '--toolkit-stack-name', toolkitStackName,
262
+ '--force',
263
+ ],
264
+ });
265
+ fixture.log('Setup complete!');
266
+
267
+ await fixture.cdkDestroy('docker-in-use', {
268
+ options: [
269
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
270
+ '--toolkit-stack-name', toolkitStackName,
271
+ '--force',
272
+ ],
273
+ });
274
+
275
+ await fixture.cdkGarbageCollect({
276
+ rollbackBufferDays: 100, // this will ensure that we do not delete assets immediately (and just tag them)
277
+ type: 'ecr',
278
+ bootstrapStackName: toolkitStackName,
279
+ });
280
+ fixture.log('Garbage collection complete!');
281
+
282
+ await fixture.aws.ecr.send(new ListImagesCommand({ repositoryName: repoName }))
283
+ .then((result) => {
284
+ expect(result.imageIds).toHaveLength(2); // the second tag comes in as a second 'id'
285
+ });
286
+ }),
287
+ );
288
+
289
+ integTest(
290
+ 'Garbage Collection untags in-use s3 objects',
291
+ withoutBootstrap(async (fixture) => {
292
+ const toolkitStackName = fixture.bootstrapStackName;
293
+ const bootstrapBucketName = `aws-cdk-garbage-collect-integ-test-bckt-${randomString()}`;
294
+ fixture.rememberToDeleteBucket(bootstrapBucketName); // just in case
295
+
296
+ await fixture.cdkBootstrapModern({
297
+ toolkitStackName,
298
+ bootstrapBucketName,
299
+ });
300
+
301
+ await fixture.cdkDeploy('lambda', {
302
+ options: [
303
+ '--context', `bootstrapBucket=${bootstrapBucketName}`,
304
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
305
+ '--toolkit-stack-name', toolkitStackName,
306
+ '--force',
307
+ ],
308
+ });
309
+ fixture.log('Setup complete!');
310
+
311
+ // Artificially add tagging to the asset in the bootstrap bucket
312
+ const result = await fixture.aws.s3.send(new ListObjectsV2Command({ Bucket: bootstrapBucketName }));
313
+ const key = result.Contents!.filter((c) => c.Key?.split('.')[1] == 'zip')[0].Key; // fancy footwork to make sure we have the asset key
314
+ await fixture.aws.s3.send(new PutObjectTaggingCommand({
315
+ Bucket: bootstrapBucketName,
316
+ Key: key,
317
+ Tagging: {
318
+ TagSet: [{
319
+ Key: S3_ISOLATED_TAG,
320
+ Value: '12345',
321
+ }, {
322
+ Key: 'bogus',
323
+ Value: 'val',
324
+ }],
325
+ },
326
+ }));
327
+
328
+ await fixture.cdkGarbageCollect({
329
+ rollbackBufferDays: 100, // this will ensure that we do not delete assets immediately (and just tag them)
330
+ type: 's3',
331
+ bootstrapStackName: toolkitStackName,
332
+ });
333
+ fixture.log('Garbage collection complete!');
334
+
335
+ // assert that the isolated object tag is removed while the other tag remains
336
+ const newTags = await fixture.aws.s3.send(new GetObjectTaggingCommand({ Bucket: bootstrapBucketName, Key: key }));
337
+
338
+ expect(newTags.TagSet).toEqual([{
339
+ Key: 'bogus',
340
+ Value: 'val',
341
+ }]);
342
+ }),
343
+ );
344
+
345
+ integTest(
346
+ 'Garbage Collection untags in-use ecr images',
347
+ withoutBootstrap(async (fixture) => {
348
+ const toolkitStackName = fixture.bootstrapStackName;
349
+
350
+ await fixture.cdkBootstrapModern({
351
+ toolkitStackName,
352
+ });
353
+
354
+ const repoName = await fixture.bootstrapRepoName();
355
+
356
+ await fixture.cdkDeploy('docker-in-use', {
357
+ options: [
358
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
359
+ '--toolkit-stack-name', toolkitStackName,
360
+ '--force',
361
+ ],
362
+ });
363
+ fixture.log('Setup complete!');
364
+
365
+ // Artificially add tagging to the asset in the bootstrap bucket
366
+ const imageIds = await fixture.aws.ecr.send(new ListImagesCommand({ repositoryName: repoName }));
367
+ const digest = imageIds.imageIds![0].imageDigest;
368
+ const imageManifests = await fixture.aws.ecr.send(new BatchGetImageCommand({ repositoryName: repoName, imageIds: [{ imageDigest: digest }] }));
369
+ const manifest = imageManifests.images![0].imageManifest;
370
+ await fixture.aws.ecr.send(new PutImageCommand({ repositoryName: repoName, imageManifest: manifest, imageDigest: digest, imageTag: `0-${ECR_ISOLATED_TAG}-12345` }));
371
+
372
+ await fixture.cdkGarbageCollect({
373
+ rollbackBufferDays: 100, // this will ensure that we do not delete assets immediately (and just tag them)
374
+ type: 'ecr',
375
+ bootstrapStackName: toolkitStackName,
376
+ });
377
+ fixture.log('Garbage collection complete!');
378
+
379
+ await fixture.aws.ecr.send(new ListImagesCommand({ repositoryName: repoName }))
380
+ .then((result) => {
381
+ expect(result.imageIds).toHaveLength(1); // the second tag has been removed
382
+ });
383
+
384
+ await fixture.cdkDestroy('docker-in-use', {
385
+ options: [
386
+ '--context', `@aws-cdk/core:bootstrapQualifier=${fixture.qualifier}`,
387
+ '--toolkit-stack-name', toolkitStackName,
388
+ '--force',
389
+ ],
390
+ });
391
+ }),
392
+ );
@@ -0,0 +1,15 @@
1
+ import { integTest, withTemporaryDirectory, ShellHelper, withPackages } from '../../lib';
2
+
3
+ ['app', 'sample-app'].forEach(template => {
4
+ integTest(`init C♯ ${template}`, withTemporaryDirectory(withPackages(async (context) => {
5
+ context.packages.assertJsiiPackagesAvailable();
6
+
7
+ const shell = ShellHelper.fromContext(context);
8
+ await context.packages.makeCliAvailable();
9
+
10
+ await shell.shell(['cdk', 'init', '-l', 'csharp', template]);
11
+ await context.packages.initializeDotnetPackages(context.integTestDir);
12
+ await shell.shell(['cdk', 'synth']);
13
+ })));
14
+ });
15
+
@@ -0,0 +1,15 @@
1
+ import { integTest, withTemporaryDirectory, ShellHelper, withPackages } from '../../lib';
2
+
3
+ ['app', 'sample-app'].forEach(template => {
4
+ integTest(`init F♯ ${template}`, withTemporaryDirectory(withPackages(async (context) => {
5
+ context.packages.assertJsiiPackagesAvailable();
6
+
7
+ const shell = ShellHelper.fromContext(context);
8
+ await context.packages.makeCliAvailable();
9
+
10
+ await shell.shell(['cdk', 'init', '-l', 'fsharp', template]);
11
+ await context.packages.initializeDotnetPackages(context.integTestDir);
12
+ await shell.shell(['cdk', 'synth']);
13
+ })));
14
+ });
15
+
@@ -0,0 +1,23 @@
1
+ import { integTest, withTemporaryDirectory, ShellHelper, withPackages } from '../../lib';
2
+
3
+ ['app', 'sample-app'].forEach(template => {
4
+ integTest(`init go ${template}`, withTemporaryDirectory(withPackages(async (context) => {
5
+ const isCanary = !!process.env.IS_CANARY;
6
+ context.packages.assertJsiiPackagesAvailable();
7
+
8
+ const shell = ShellHelper.fromContext(context);
9
+ await context.packages.makeCliAvailable();
10
+
11
+ await shell.shell(['cdk', 'init', '-l', 'go', template]);
12
+
13
+ // Canaries will use the generated go.mod as is
14
+ // For pipeline tests we replace the source with the locally build one
15
+ if (!isCanary) {
16
+ await shell.shell(['go', 'mod', 'edit', '-replace', 'github.com/aws/aws-cdk-go/awscdk/v2=$CODEBUILD_SRC_DIR/go/awscdk']);
17
+ }
18
+
19
+ await shell.shell(['go', 'mod', 'tidy']);
20
+ await shell.shell(['go', 'test']);
21
+ await shell.shell(['cdk', 'synth']);
22
+ })));
23
+ });
@@ -0,0 +1,14 @@
1
+ import { integTest, withTemporaryDirectory, ShellHelper, withPackages } from '../../lib';
2
+
3
+ ['app', 'sample-app'].forEach(template => {
4
+ integTest(`init java ${template}`, withTemporaryDirectory(withPackages(async (context) => {
5
+ context.packages.assertJsiiPackagesAvailable();
6
+
7
+ const shell = ShellHelper.fromContext(context);
8
+ await context.packages.makeCliAvailable();
9
+
10
+ await shell.shell(['cdk', 'init', '-l', 'java', template]);
11
+ await shell.shell(['mvn', 'package']);
12
+ await shell.shell(['cdk', 'synth']);
13
+ })));
14
+ });