aws-cdk 2.178.2 → 2.179.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 (53) hide show
  1. package/THIRD_PARTY_LICENSES +256 -234
  2. package/build-info.json +2 -2
  3. package/lib/api/cxapp/cloud-assembly.d.ts +18 -1
  4. package/lib/api/cxapp/cloud-assembly.js +38 -5
  5. package/lib/api/deployments/asset-publishing.d.ts +4 -27
  6. package/lib/api/deployments/asset-publishing.js +8 -34
  7. package/lib/api/deployments/cloudformation.d.ts +1 -0
  8. package/lib/api/deployments/cloudformation.js +9 -1
  9. package/lib/api/deployments/deployments.d.ts +0 -22
  10. package/lib/api/deployments/deployments.js +1 -29
  11. package/lib/api/garbage-collection/garbage-collector.js +3 -3
  12. package/lib/api/garbage-collection/progress-printer.js +8 -1
  13. package/lib/{import.d.ts → api/resource-import/importer.d.ts} +55 -12
  14. package/lib/api/resource-import/importer.js +332 -0
  15. package/lib/api/resource-import/index.d.ts +2 -0
  16. package/lib/api/resource-import/index.js +19 -0
  17. package/lib/{migrator.d.ts → api/resource-import/migrator.d.ts} +9 -6
  18. package/lib/api/resource-import/migrator.js +74 -0
  19. package/lib/cli/cdk-toolkit.d.ts +7 -0
  20. package/lib/cli/cdk-toolkit.js +20 -9
  21. package/lib/cli/cli.js +4 -3
  22. package/lib/cli/convert-to-user-input.js +1 -1
  23. package/lib/cli/messages.d.ts +30 -0
  24. package/lib/cli/messages.js +112 -0
  25. package/lib/cli/parse-command-line-arguments.js +1 -1
  26. package/lib/cli/user-configuration.js +2 -1
  27. package/lib/cli/user-input.js +1 -1
  28. package/lib/cli/util/yargs-helpers.js +2 -2
  29. package/lib/cli/version.d.ts +1 -1
  30. package/lib/cli/version.js +6 -3
  31. package/lib/commands/doctor.js +2 -2
  32. package/lib/index.js +126 -197
  33. package/lib/init-templates/.init-version.json +1 -1
  34. package/lib/init-templates/app/javascript/package.json +1 -1
  35. package/lib/init-templates/app/typescript/package.json +1 -1
  36. package/lib/init-templates/sample-app/javascript/package.json +1 -1
  37. package/lib/init-templates/sample-app/typescript/package.json +1 -1
  38. package/lib/init.d.ts +13 -1
  39. package/lib/init.js +37 -32
  40. package/lib/list-stacks.d.ts +1 -17
  41. package/lib/list-stacks.js +2 -37
  42. package/package.json +10 -10
  43. package/test/api/deployments/cloudformation-deployments.test.js +27 -3
  44. package/test/api/garbage-collection.test.js +23 -1
  45. package/test/api/resource-import/import.test.js +373 -0
  46. package/test/init.test.js +14 -1
  47. package/test/toolkit/cli-io-host.test.js +18 -10
  48. package/lib/import.js +0 -329
  49. package/lib/migrator.js +0 -67
  50. package/test/_helpers/prompts.d.ts +0 -11
  51. package/test/_helpers/prompts.js +0 -22
  52. package/test/import.test.js +0 -364
  53. /package/test/{import.test.d.ts → api/resource-import/import.test.d.ts} +0 -0
@@ -1,11 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ const stream_1 = require("stream");
3
4
  const chalk = require("chalk");
4
5
  const cli_io_host_1 = require("../../lib/toolkit/cli-io-host");
5
- const prompts_1 = require("../_helpers/prompts");
6
+ let passThrough;
6
7
  const ioHost = cli_io_host_1.CliIoHost.instance({
7
8
  logLevel: 'trace',
8
9
  });
10
+ // Mess with the 'process' global so we can replace its 'process.stdin' member
11
+ global.process = { ...process };
9
12
  describe('CliIoHost', () => {
10
13
  let mockStdout;
11
14
  let mockStderr;
@@ -17,6 +20,7 @@ describe('CliIoHost', () => {
17
20
  ioHost.isTTY = process.stdout.isTTY ?? false;
18
21
  ioHost.isCI = false;
19
22
  ioHost.currentAction = 'synth';
23
+ process.stdin = passThrough = new stream_1.PassThrough();
20
24
  defaultMessage = {
21
25
  time: new Date('2024-01-01T12:00:00'),
22
26
  level: 'info',
@@ -209,8 +213,7 @@ describe('CliIoHost', () => {
209
213
  });
210
214
  describe('boolean', () => {
211
215
  test('respond "yes" to a confirmation prompt', async () => {
212
- (0, prompts_1.sendResponse)('y');
213
- const response = await ioHost.requestResponse({
216
+ const response = await requestResponse('y', {
214
217
  time: new Date(),
215
218
  level: 'info',
216
219
  action: 'synth',
@@ -222,8 +225,7 @@ describe('CliIoHost', () => {
222
225
  expect(response).toBe(true);
223
226
  });
224
227
  test('respond "no" to a confirmation prompt', async () => {
225
- (0, prompts_1.sendResponse)('n');
226
- await expect(() => ioHost.requestResponse({
228
+ await expect(() => requestResponse('n', {
227
229
  time: new Date(),
228
230
  level: 'info',
229
231
  action: 'synth',
@@ -241,8 +243,7 @@ describe('CliIoHost', () => {
241
243
  // simulate the enter key
242
244
  ['\x0A', 'cat'],
243
245
  ])('receives %p and returns %p', async (input, expectedResponse) => {
244
- (0, prompts_1.sendResponse)(input);
245
- const response = await ioHost.requestResponse({
246
+ const response = await requestResponse(input, {
246
247
  time: new Date(),
247
248
  level: 'info',
248
249
  action: 'synth',
@@ -260,8 +261,7 @@ describe('CliIoHost', () => {
260
261
  // simulate the enter key
261
262
  ['\x0A', 1],
262
263
  ])('receives %p and return %p', async (input, expectedResponse) => {
263
- (0, prompts_1.sendResponse)(input);
264
- const response = await ioHost.requestResponse({
264
+ const response = await requestResponse(input, {
265
265
  time: new Date(),
266
266
  level: 'info',
267
267
  action: 'synth',
@@ -330,4 +330,12 @@ describe('CliIoHost', () => {
330
330
  });
331
331
  });
332
332
  });
333
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWlvLWhvc3QudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNsaS1pby1ob3N0LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQkFBK0I7QUFDL0IsK0RBQXFGO0FBQ3JGLGlEQUFtRDtBQUVuRCxNQUFNLE1BQU0sR0FBRyx1QkFBUyxDQUFDLFFBQVEsQ0FBQztJQUNoQyxRQUFRLEVBQUUsT0FBTztDQUNsQixDQUFDLENBQUM7QUFFSCxRQUFRLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRTtJQUN6QixJQUFJLFVBQXFCLENBQUM7SUFDMUIsSUFBSSxVQUFxQixDQUFDO0lBQzFCLElBQUksY0FBa0MsQ0FBQztJQUV2QyxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN2QixVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBRXZCLHdCQUF3QjtRQUN4QixNQUFNLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQztRQUM3QyxNQUFNLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNwQixNQUFNLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztRQUUvQixjQUFjLEdBQUc7WUFDZixJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUM7WUFDckMsS0FBSyxFQUFFLE1BQU07WUFDYixNQUFNLEVBQUUsT0FBTztZQUNmLElBQUksRUFBRSxtQkFBbUI7WUFDekIsT0FBTyxFQUFFLGNBQWM7U0FDeEIsQ0FBQztRQUVGLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQVEsRUFBRSxRQUFjLEVBQUUsRUFBUSxFQUFFLEVBQUU7WUFDNUYsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxD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M0IsQ0FBQyxDQUFDO2dCQUVILE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMxRCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgQ2xpSW9Ib3N0LCBJb01lc3NhZ2UsIElvTWVzc2FnZUxldmVsIH0gZnJvbSAnLi4vLi4vbGliL3Rvb2xraXQvY2xpLWlvLWhvc3QnO1xuaW1wb3J0IHsgc2VuZFJlc3BvbnNlIH0gZnJvbSAnLi4vX2hlbHBlcnMvcHJvbXB0cyc7XG5cbmNvbnN0IGlvSG9zdCA9IENsaUlvSG9zdC5pbnN0YW5jZSh7XG4gIGxvZ0xldmVsOiAndHJhY2UnLFxufSk7XG5cbmRlc2NyaWJlKCdDbGlJb0hvc3QnLCAoKSA9PiB7XG4gIGxldCBtb2NrU3Rkb3V0OiBqZXN0Lk1vY2s7XG4gIGxldCBtb2NrU3RkZXJyOiBqZXN0Lk1vY2s7XG4gIGxldCBkZWZhdWx0TWVzc2FnZTogSW9NZXNzYWdlPHVua25vd24+O1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIG1vY2tTdGRvdXQgPSBqZXN0LmZuKCk7XG4gICAgbW9ja1N0ZGVyciA9IGplc3QuZm4oKTtcblxuICAgIC8vIFJlc2V0IHNpbmdsZXRvbiBzdGF0ZVxuICAgIGlvSG9zdC5pc1RUWSA9IHByb2Nlc3Muc3Rkb3V0LmlzVFRZID8/IGZhbHNlO1xuICAgIGlvSG9zdC5pc0NJID0gZmFsc2U7XG4gICAgaW9Ib3N0LmN1cnJlbnRBY3Rpb24gPSAnc3ludGgnO1xuXG4gICAgZGVmYXVsdE1lc3NhZ2UgPSB7XG4gICAgICB0aW1lOiBuZXcgRGF0ZSgnMjAyNC0wMS0wMVQxMjowMDowMCcpLFxuICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICBtZXNzYWdlOiAndGVzdCBtZXNzYWdlJyxcbiAgICB9O1xuXG4gICAgamVzdC5zcHlPbihwcm9jZXNzLnN0ZG91dCwgJ3dyaXRlJykubW9ja0ltcGxlbWVudGF0aW9uKChzdHI6IGFueSwgZW5jb2Rpbmc/OiBhbnksIGNiPzogYW55KSA9PiB7XG4gICAgICBtb2NrU3Rkb3V0KHN0ci50b1N0cmluZygpKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nID8gZW5jb2RpbmcgOiBjYjtcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgamVzdC5zcHlPbihwcm9jZXNzLnN0ZGVyciwgJ3dyaXRlJykubW9ja0ltcGxlbWVudGF0aW9uKChzdHI6IGFueSwgZW5jb2Rpbmc/OiBhbnksIGNiPzogYW55KSA9PiB7XG4gICAgICBtb2NrU3RkZXJyKHN0ci50b1N0cmluZygpKTtcbiAgICAgIGNvbnN0IGNhbGxiYWNrID0gdHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nID8gZW5jb2RpbmcgOiBjYjtcbiAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9KTtcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIGplc3QucmVzdG9yZUFsbE1vY2tzKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdHJlYW0gc2VsZWN0aW9uJywgKCkgPT4ge1xuICAgIHRlc3QoJ3dyaXRlcyB0byBzdGRlcnIgYnkgZGVmYXVsdCBmb3Igbm9uLWVycm9yIG1lc3NhZ2VzIGluIG5vbi1DSSBtb2RlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgIG1lc3NhZ2U6ICd0ZXN0IG1lc3NhZ2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay53aGl0ZSgndGVzdCBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZG91dCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3dyaXRlcyB0byBzdGRlcnIgZm9yIGVycm9yIGxldmVsIHdpdGggcmVkIGNvbG9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfRTAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnZXJyb3IgbWVzc2FnZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLnJlZCgnZXJyb3IgbWVzc2FnZScpICsgJ1xcbicpO1xuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd3cml0ZXMgdG8gc3Rkb3V0IGZvciByZXN1bHQgbGV2ZWwnLCBhc3luYyAoKSA9PiB7XG4gICAgICBpb0hvc3QuaXNUVFkgPSB0cnVlO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIHRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgIGxldmVsOiAncmVzdWx0JyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAncmVzdWx0IG1lc3NhZ2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay53aGl0ZSgncmVzdWx0IG1lc3NhZ2UnKSArICdcXG4nKTtcbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbWVzc2FnZSBmb3JtYXR0aW5nJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2Zvcm1hdHMgZGVidWcgbWVzc2FnZXMgd2l0aCB0aW1lc3RhbXAnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgLi4uZGVmYXVsdE1lc3NhZ2UsXG4gICAgICAgIGxldmVsOiAnZGVidWcnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChgWzEyOjAwOjAwXSAke2NoYWxrLmdyYXkoJ3Rlc3QgbWVzc2FnZScpfVxcbmApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnZm9ybWF0cyB0cmFjZSBtZXNzYWdlcyB3aXRoIHRpbWVzdGFtcCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICAuLi5kZWZhdWx0TWVzc2FnZSxcbiAgICAgICAgbGV2ZWw6ICd0cmFjZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGBbMTI6MDA6MDBdICR7Y2hhbGsuZ3JheSgndGVzdCBtZXNzYWdlJyl9XFxuYCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdhcHBsaWVzIG5vIHN0eWxpbmcgd2hlbiBUVFkgaXMgZmFsc2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBpb0hvc3QuaXNUVFkgPSBmYWxzZTtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICAuLi5kZWZhdWx0TWVzc2FnZSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3Rlc3QgbWVzc2FnZVxcbicpO1xuICAgIH0pO1xuXG4gICAgdGVzdC5lYWNoKFtcbiAgICAgIFsnZXJyb3InLCAncmVkJywgZmFsc2VdLFxuICAgICAgWyd3YXJuJywgJ3llbGxvdycsIGZhbHNlXSxcbiAgICAgIFsnaW5mbycsICd3aGl0ZScsIGZhbHNlXSxcbiAgICAgIFsnZGVidWcnLCAnZ3JheScsIHRydWVdLFxuICAgICAgWyd0cmFjZScsICdncmF5JywgdHJ1ZV0sXG4gICAgXSBhcyBBcnJheTxbSW9NZXNzYWdlTGV2ZWwsIHR5cGVvZiBjaGFsay5Gb3JlZ3JvdW5kQ29sb3IsIGJvb2xlYW5dPikoJ291dHB1dHMgJXNzIGluICVzIGNvbG9yICcsIGFzeW5jIChsZXZlbCwgY29sb3IsIHNob3VsZEFkZFRpbWUpID0+IHtcbiAgICAgIC8vIEdpdmVuXG4gICAgICBjb25zdCBzdHlsZSA9IGNoYWxrW2NvbG9yXTtcbiAgICAgIGxldCBleHBlY3RlZE91dHB1dCA9IGAke3N0eWxlKCd0ZXN0IG1lc3NhZ2UnKX1cXG5gO1xuICAgICAgaWYgKHNob3VsZEFkZFRpbWUpIHtcbiAgICAgICAgZXhwZWN0ZWRPdXRwdXQgPSBgWzEyOjAwOjAwXSAke2V4cGVjdGVkT3V0cHV0fWA7XG4gICAgICB9XG5cbiAgICAgIC8vIFdoZW5cbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICAuLi5kZWZhdWx0TWVzc2FnZSxcbiAgICAgICAgbGV2ZWwsXG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdGVkT3V0cHV0KTtcbiAgICAgIG1vY2tTdGRvdXQubW9ja0NsZWFyKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhY3Rpb24gaGFuZGxpbmcnLCAoKSA9PiB7XG4gICAgdGVzdCgnc2V0cyBhbmQgZ2V0cyBjdXJyZW50IGFjdGlvbicsICgpID0+IHtcbiAgICAgIGlvSG9zdC5jdXJyZW50QWN0aW9uID0gJ2RlcGxveSc7XG4gICAgICBleHBlY3QoaW9Ib3N0LmN1cnJlbnRBY3Rpb24pLnRvQmUoJ2RlcGxveScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ0kgbW9kZSBiZWhhdmlvcicsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGlvSG9zdC5pc1RUWSA9IHRydWU7XG4gICAgICBpb0hvc3QuaXNDSSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd3cml0ZXMgdG8gc3Rkb3V0IGluIENJIG1vZGUgd2hlbiBsZXZlbCBpcyBub3QgZXJyb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfVzAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnY2kgbWVzc2FnZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLndoaXRlKCdjaSBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3dyaXRlcyB0byBzdGRlcnIgZm9yIGVycm9yIGxldmVsIGluIENJIG1vZGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0UwMDAxJyxcbiAgICAgICAgbWVzc2FnZTogJ2NpIGVycm9yIG1lc3NhZ2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay5yZWQoJ2NpIGVycm9yIG1lc3NhZ2UnKSArICdcXG4nKTtcbiAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndGltZXN0YW1wIGhhbmRsaW5nJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2luY2x1ZGVzIHRpbWVzdGFtcCBmb3IgREVCVUcgbGV2ZWwgd2l0aCBncmF5IGNvbG9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdERhdGUgPSBuZXcgRGF0ZSgnMjAyNC0wMS0wMVQxMjozNDo1NicpO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIHRpbWU6IHRlc3REYXRlLFxuICAgICAgICBsZXZlbDogJ2RlYnVnJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnZGVidWcgbWVzc2FnZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGBbMTI6MzQ6NTZdICR7Y2hhbGsuZ3JheSgnZGVidWcgbWVzc2FnZScpfVxcbmApO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnZXhjbHVkZXMgdGltZXN0YW1wIGZvciBvdGhlciBsZXZlbHMgYnV0IGluY2x1ZGVzIGNvbG9yJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdGVzdERhdGUgPSBuZXcgRGF0ZSgnMjAyNC0wMS0wMVQxMjozNDo1NicpO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIHRpbWU6IHRlc3REYXRlLFxuICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgIG1lc3NhZ2U6ICdpbmZvIG1lc3NhZ2UnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay53aGl0ZSgnaW5mbyBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZXF1ZXN0UmVzcG9uc2UnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBpb0hvc3QuaXNUVFkgPSB0cnVlO1xuICAgICAgaW9Ib3N0LmlzQ0kgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2ZhaWwgaWYgY29uY3VycmVuY3kgaXMgPiAxJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgZXhwZWN0KCgpID0+IGlvSG9zdC5yZXF1ZXN0UmVzcG9uc2Uoe1xuICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgIG1lc3NhZ2U6ICdDb250aW51ZT8nLFxuICAgICAgICBkZWZhdWx0UmVzcG9uc2U6IHRydWUsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBjb25jdXJyZW5jeTogMyxcbiAgICAgICAgfSxcbiAgICAgIH0pKS5yZWplY3RzLnRvVGhyb3coJ2J1dCBjb25jdXJyZW5jeSBpcyBncmVhdGVyIHRoYW4gMScpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2Jvb2xlYW4nLCAoKSA9PiB7XG4gICAgICB0ZXN0KCdyZXNwb25kIFwieWVzXCIgdG8gYSBjb25maXJtYXRpb24gcHJvbXB0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZW5kUmVzcG9uc2UoJ3knKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgICAgbWVzc2FnZTogJ0NvbnRpbnVlPycsXG4gICAgICAgICAgZGVmYXVsdFJlc3BvbnNlOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3QobW9ja1N0ZG91dCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoY2hhbGsuY3lhbignQ29udGludWU/JykgKyAnICh5L24pICcpO1xuICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvQmUodHJ1ZSk7XG4gICAgICB9KTtcblxuICAgICAgdGVzdCgncmVzcG9uZCBcIm5vXCIgdG8gYSBjb25maXJtYXRpb24gcHJvbXB0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBzZW5kUmVzcG9uc2UoJ24nKTtcbiAgICAgICAgYXdhaXQgZXhwZWN0KCgpID0+IGlvSG9zdC5yZXF1ZXN0UmVzcG9uc2Uoe1xuICAgICAgICAgIHRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0kwMDAxJyxcbiAgICAgICAgICBtZXNzYWdlOiAnQ29udGludWU/JyxcbiAgICAgICAgICBkZWZhdWx0UmVzcG9uc2U6IHRydWUsXG4gICAgICAgIH0pKS5yZWplY3RzLnRvVGhyb3coJ0Fib3J0ZWQgYnkgdXNlcicpO1xuXG4gICAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay5jeWFuKCdDb250aW51ZT8nKSArICcgKHkvbikgJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzdHJpbmcnLCAoKSA9PiB7XG4gICAgICB0ZXN0LmVhY2goW1xuICAgICAgICBbJ2JlYXInLCAnYmVhciddLFxuICAgICAgICBbJ2dpcmFmZmUnLCAnZ2lyYWZmZSddLFxuICAgICAgICAvLyBzaW11bGF0ZSB0aGUgZW50ZXIga2V5XG4gICAgICAgIFsnXFx4MEEnLCAnY2F0J10sXG4gICAgICBdKSgncmVjZWl2ZXMgJXAgYW5kIHJldHVybnMgJXAnLCBhc3luYyAoaW5wdXQsIGV4cGVjdGVkUmVzcG9uc2UpID0+IHtcbiAgICAgICAgc2VuZFJlc3BvbnNlKGlucHV0KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgICAgbWVzc2FnZTogJ0Zhdm9yaXRlIGFuaW1hbCcsXG4gICAgICAgICAgZGVmYXVsdFJlc3BvbnNlOiAnY2F0JyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLmN5YW4oJ0Zhdm9yaXRlIGFuaW1hbCcpICsgJyAoY2F0KSAnKTtcbiAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50b0JlKGV4cGVjdGVkUmVzcG9uc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbnVtYmVyJywgKCkgPT4ge1xuICAgICAgdGVzdC5lYWNoKFtcbiAgICAgICAgWyczJywgM10sXG4gICAgICAgIC8vIHNpbXVsYXRlIHRoZSBlbnRlciBrZXlcbiAgICAgICAgWydcXHgwQScsIDFdLFxuICAgICAgXSkoJ3JlY2VpdmVzICVwIGFuZCByZXR1cm4gJXAnLCBhc3luYyAoaW5wdXQsIGV4cGVjdGVkUmVzcG9uc2UpID0+IHtcbiAgICAgICAgc2VuZFJlc3BvbnNlKGlucHV0KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgICAgbWVzc2FnZTogJ0hvdyBtYW55IHdvdWxkIHlvdSBsaWtlPycsXG4gICAgICAgICAgZGVmYXVsdFJlc3BvbnNlOiAxLFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3QobW9ja1N0ZG91dCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoY2hhbGsuY3lhbignSG93IG1hbnkgd291bGQgeW91IGxpa2U/JykgKyAnICgxKSAnKTtcbiAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50b0JlKGV4cGVjdGVkUmVzcG9uc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbm9uLXByb21wdGFibGUgZGF0YScsICgpID0+IHtcbiAgICAgIHRlc3QoJ2xvZ3MgbWVzc2FnZXMgYW5kIHJldHVybnMgZGVmYXVsdCB1bmNoYW5nZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaW9Ib3N0LnJlcXVlc3RSZXNwb25zZSh7XG4gICAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICAgIG1lc3NhZ2U6ICd0ZXN0IG1lc3NhZ2UnLFxuICAgICAgICAgIGRlZmF1bHRSZXNwb25zZTogWzEsIDIsIDNdLFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoY2hhbGsud2hpdGUoJ3Rlc3QgbWVzc2FnZScpICsgJ1xcbicpO1xuICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvRXF1YWwoWzEsIDIsIDNdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ25vbiBUVFkgZW52aXJvbm1lbnQnLCAoKSA9PiB7XG4gICAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgaW9Ib3N0LmlzVFRZID0gZmFsc2U7XG4gICAgICAgIGlvSG9zdC5pc0NJID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgdGVzdCgnZmFpbCBmb3IgYWxsIHByb21wdHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGV4cGVjdCgoKSA9PiBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgICAgbWVzc2FnZTogJ0NvbnRpbnVlPycsXG4gICAgICAgICAgZGVmYXVsdFJlc3BvbnNlOiB0cnVlLFxuICAgICAgICB9KSkucmVqZWN0cy50b1Rocm93KCdVc2VyIGlucHV0IGlzIG5lZWRlZCcpO1xuICAgICAgfSk7XG5cbiAgICAgIHRlc3QoJ2ZhaWwgd2l0aCBzcGVjaWZpYyBtb3RpdmF0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBleHBlY3QoKCkgPT4gaW9Ib3N0LnJlcXVlc3RSZXNwb25zZSh7XG4gICAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdDb250aW51ZT8nLFxuICAgICAgICAgIGRlZmF1bHRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBtb3RpdmF0aW9uOiAnQmFuYW5hcyBhcmUgeWVsbG93JyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSkucmVqZWN0cy50b1Rocm93KCdCYW5hbmFzIGFyZSB5ZWxsb3cnKTtcbiAgICAgIH0pO1xuXG4gICAgICB0ZXN0KCdyZXR1cm5zIHRoZSBkZWZhdWx0IGZvciBub24tcHJvbXB0YWJsZSByZXF1ZXN0cycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgICAgbWVzc2FnZTogJ3Rlc3QgbWVzc2FnZScsXG4gICAgICAgICAgZGVmYXVsdFJlc3BvbnNlOiBbMSwgMiwgM10sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgndGVzdCBtZXNzYWdlXFxuJyk7XG4gICAgICAgIGV4cGVjdChyZXNwb25zZSkudG9FcXVhbChbMSwgMiwgM10pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
333
+ /**
334
+ * Do a requestResponse cycle with the global ioHost, while sending input on the global fake input stream
335
+ */
336
+ async function requestResponse(input, msg) {
337
+ const promise = ioHost.requestResponse(msg);
338
+ passThrough.write(input + '\n');
339
+ return promise;
340
+ }
341
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWlvLWhvc3QudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNsaS1pby1ob3N0LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtQ0FBcUM7QUFDckMsK0JBQStCO0FBQy9CLCtEQUFnRztBQUVoRyxJQUFJLFdBQXdCLENBQUM7QUFFN0IsTUFBTSxNQUFNLEdBQUcsdUJBQVMsQ0FBQyxRQUFRLENBQUM7SUFDaEMsUUFBUSxFQUFFLE9BQU87Q0FDbEIsQ0FBQyxDQUFDO0FBRUgsOEVBQThFO0FBQzlFLE1BQU0sQ0FBQyxPQUFPLEdBQUcsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO0FBRWhDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO0lBQ3pCLElBQUksVUFBcUIsQ0FBQztJQUMxQixJQUFJLFVBQXFCLENBQUM7SUFDMUIsSUFBSSxjQUFrQyxDQUFDO0lBRXZDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZCLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFFdkIsd0JBQXdCO1FBQ3hCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDO1FBQzdDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDO1FBQzlCLE9BQWUsQ0FBQyxLQUFLLEdBQUcsV0FBVyxHQUFHLElBQUksb0JBQVcsRUFBRSxDQUFDO1FBRXpELGNBQWMsR0FBRztZQUNmLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztZQUNyQyxLQUFLLEVBQUUsTUFBTTtZQUNiLE1BQU0sRUFBRSxPQUFPO1lBQ2YsSUFBSSxFQUFFLG1CQUFtQjtZQUN6QixPQUFPLEVBQUUsY0FBYztTQUN4QixDQUFDO1FBRUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsR0FBUSxFQUFFLFFBQWMsRUFBRSxFQUFRLEVBQUUsRUFBRTtZQUM1RixVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDM0IsTUFBTSxRQUFRLEdBQUcsT0FBTyxRQUFRLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNoRSxJQUFJLFFBQVE7Z0JBQUUsUUFBUSxFQUFFLENBQUM7WUFDekIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQVEsRUFBRSxRQUFjLEVBQUUsRUFBUSxFQUFFLEVBQUU7WUFDNUYsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sUUFBUSxHQUFHLE9BQU8sUUFBUSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEUsSUFBSSxRQUFRO2dCQUFFLFFBQVEsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO1FBQ2hDLElBQUksQ0FBQyxtRUFBbUUsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNuRixNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNwQixNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ2xCLElBQUksRUFBRSxJQUFJLElBQUksRUFBRTtnQkFDaEIsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsSUFBSSxFQUFFLG1CQUFtQjtnQkFDekIsT0FBTyxFQUFFLGNBQWM7YUFDeEIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDNUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGlEQUFpRCxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2pFLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDbEIsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUNoQixLQUFLLEVBQUUsT0FBTztnQkFDZCxNQUFNLEVBQUUsT0FBTztnQkFDZixJQUFJLEVBQUUsbUJBQW1CO2dCQUN6QixPQUFPLEVBQUUsZUFBZTthQUN6QixDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUMzRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsbUNBQW1DLEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDbkQsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDcEIsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNsQixJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUU7Z0JBQ2hCLEtBQUssRUFBRSxRQUFRO2dCQUNmLE1BQU0sRUFBRSxPQUFPO2dCQUNmLElBQUksRUFBRSxtQkFBbUI7Z0JBQ3pCLE9BQU8sRUFBRSxnQkFBZ0I7YUFDMUIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUM5RSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUU7UUFDbEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3ZELE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDbEIsR0FBRyxjQUFjO2dCQUNqQixLQUFLLEVBQUUsT0FBTzthQUNmLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hGLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3ZELE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDbEIsR0FBRyxjQUFjO2dCQUNqQixLQUFLLEVBQUUsT0FBTzthQUNmLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hGLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHNDQUFzQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3RELE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDbEIsR0FBRyxjQUFjO2FBQ2xCLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNSLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUM7WUFDdkIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQztZQUN6QixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDO1lBQ3hCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUM7WUFDdkIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQztTQUMwQyxDQUFDLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEVBQUU7WUFDckksUUFBUTtZQUNSLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQixJQUFJLGNBQWMsR0FBRyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ2xELElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ2xCLGNBQWMsR0FBRyxjQUFjLGNBQWMsRUFBRSxDQUFDO1lBQ2xELENBQUM7WUFFRCxPQUFPO1lBQ1AsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNsQixHQUFHLGNBQWM7Z0JBQ2pCLEtBQUs7YUFDTixDQUFDLENBQUM7WUFFSCxPQUFPO1lBQ1AsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3hELFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRTtRQUMvQixJQUFJLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO1lBQ3hDLE1BQU0sQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO1FBQ2hDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNwQixNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxxREFBcUQsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNyRSxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ2xCLElBQUksRUFBRSxJQUFJLElBQUksRUFBRTtnQkFDaEIsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsSUFBSSxFQUFFLG1CQUFtQjtnQkFDekIsT0FBTyxFQUFFLFlBQVk7YUFDdEIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDMUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLDZDQUE2QyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQzdELE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDbEIsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUNoQixLQUFLLEVBQUUsT0FBTztnQkFDZCxNQUFNLEVBQUUsT0FBTztnQkFDZixJQUFJLEVBQUUsbUJBQW1CO2dCQUN6QixPQUFPLEVBQUUsa0JBQWtCO2FBQzVCLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDOUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFO1FBQ2xDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxvREFBb0QsRUFBRSxLQUFLLElBQUksRUFBRTtZQUNwRSxNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDbEIsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsSUFBSSxFQUFFLG1CQUFtQjtnQkFDekIsT0FBTyxFQUFFLGVBQWU7YUFDekIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLGNBQWMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekYsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsd0RBQXdELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDeEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNqRCxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUM7Z0JBQ2xCLElBQUksRUFBRSxRQUFRO2dCQUNkLEtBQUssRUFBRSxNQUFNO2dCQUNiLE1BQU0sRUFBRSxPQUFPO2dCQUNmLElBQUksRUFBRSxtQkFBbUI7Z0JBQ3pCLE9BQU8sRUFBRSxjQUFjO2FBQ3hCLENBQUMsQ0FBQztZQUVILE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzlFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFO1FBQy9CLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNwQixNQUFNLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyw0QkFBNEIsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM1QyxNQUFNLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO2dCQUN4QyxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUU7Z0JBQ2hCLEtBQUssRUFBRSxNQUFNO2dCQUNiLE1BQU0sRUFBRSxPQUFPO2dCQUNmLElBQUksRUFBRSxtQkFBbUI7Z0JBQ3pCLE9BQU8sRUFBRSxXQUFXO2dCQUNwQixlQUFlLEVBQUUsSUFBSTtnQkFDckIsSUFBSSxFQUFFO29CQUNKLFdBQVcsRUFBRSxDQUFDO2lCQUNmO2FBQ0YsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7WUFDdkIsSUFBSSxDQUFDLHdDQUF3QyxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUN4RCxNQUFNLFFBQVEsR0FBRyxNQUFNLGVBQWUsQ0FBQyxHQUFHLEVBQUU7b0JBQzFDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRTtvQkFDaEIsS0FBSyxFQUFFLE1BQU07b0JBQ2IsTUFBTSxFQUFFLE9BQU87b0JBQ2YsSUFBSSxFQUFFLG1CQUFtQjtvQkFDekIsT0FBTyxFQUFFLFdBQVc7b0JBQ3BCLGVBQWUsRUFBRSxJQUFJO2lCQUN0QixDQUFDLENBQUM7Z0JBRUgsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7Z0JBQzdFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUIsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsdUNBQXVDLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3ZELE1BQU0sTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEVBQUU7b0JBQ3RDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRTtvQkFDaEIsS0FBSyxFQUFFLE1BQU07b0JBQ2IsTUFBTSxFQUFFLE9BQU87b0JBQ2YsSUFBSSxFQUFFLG1CQUFtQjtvQkFDekIsT0FBTyxFQUFFLFdBQVc7b0JBQ3BCLGVBQWUsRUFBRSxJQUFJO2lCQUN0QixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBRXZDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQy9FLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxRQUFRLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtZQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNSLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztnQkFDaEIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO2dCQUN0Qix5QkFBeUI7Z0JBQ3pCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQzthQUNoQixDQUFDLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxFQUFFO2dCQUNqRSxNQUFNLFFBQVEsR0FBRyxNQUFNLGVBQWUsQ0FBQyxLQUFLLEVBQUU7b0JBQzVDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRTtvQkFDaEIsS0FBSyxFQUFFLE1BQU07b0JBQ2IsTUFBTSxFQUFFLE9BQU87b0JBQ2YsSUFBSSxFQUFFLG1CQUFtQjtvQkFDekIsT0FBTyxFQUFFLGlCQUFpQjtvQkFDMUIsZUFBZSxFQUFFLEtBQUs7aUJBQ3ZCLENBQUMsQ0FBQztnQkFFSCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO2dCQUNuRixNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILFFBQVEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1lBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ1IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUNSLHlCQUF5QjtnQkFDekIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQ1osQ0FBQyxDQUFDLDJCQUEyQixFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRTtnQkFDaEUsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFlLENBQUMsS0FBSyxFQUFFO29CQUM1QyxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUU7b0JBQ2hCLEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxPQUFPO29CQUNmLElBQUksRUFBRSxtQkFBbUI7b0JBQ3pCLE9BQU8sRUFBRSwwQkFBMEI7b0JBQ25DLGVBQWUsRUFBRSxDQUFDO2lCQUNuQixDQUFDLENBQUM7Z0JBRUgsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztnQkFDMUYsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzFDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxRQUFRLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO1lBQ25DLElBQUksQ0FBQyw2Q0FBNkMsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDN0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsZUFBZSxDQUFDO29CQUM1QyxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUU7b0JBQ2hCLEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxPQUFPO29CQUNmLElBQUksRUFBRSxtQkFBbUI7b0JBQ3pCLE9BQU8sRUFBRSxjQUFjO29CQUN2QixlQUFlLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDM0IsQ0FBQyxDQUFDO2dCQUVILE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2dCQUM1RSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxRQUFRLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO1lBQ25DLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUN0QyxNQUFNLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO29CQUN4QyxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUU7b0JBQ2hCLEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxPQUFPO29CQUNmLElBQUksRUFBRSxtQkFBbUI7b0JBQ3pCLE9BQU8sRUFBRSxXQUFXO29CQUNwQixlQUFlLEVBQUUsSUFBSTtpQkFDdEIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQzlDLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLCtCQUErQixFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUMvQyxNQUFNLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO29CQUN4QyxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUU7b0JBQ2hCLEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxPQUFPO29CQUNmLElBQUksRUFBRSxtQkFBbUI7b0JBQ3pCLE9BQU8sRUFBRSxXQUFXO29CQUNwQixlQUFlLEVBQUUsSUFBSTtvQkFDckIsSUFBSSxFQUFFO3dCQUNKLFVBQVUsRUFBRSxvQkFBb0I7cUJBQ2pDO2lCQUNGLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUM1QyxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxpREFBaUQsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDakUsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsZUFBZSxDQUFDO29CQUM1QyxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUU7b0JBQ2hCLEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxPQUFPO29CQUNmLElBQUksRUFBRSxtQkFBbUI7b0JBQ3pCLE9BQU8sRUFBRSxjQUFjO29CQUN2QixlQUFlLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDM0IsQ0FBQyxDQUFDO2dCQUVILE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMxRCxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUg7O0dBRUc7QUFDSCxLQUFLLFVBQVUsZUFBZSxDQUF5QixLQUFhLEVBQUUsR0FBc0M7SUFDMUcsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNoQyxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFzc1Rocm91Z2ggfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgQ2xpSW9Ib3N0LCBJb01lc3NhZ2UsIElvTWVzc2FnZUxldmVsLCBJb1JlcXVlc3QgfSBmcm9tICcuLi8uLi9saWIvdG9vbGtpdC9jbGktaW8taG9zdCc7XG5cbmxldCBwYXNzVGhyb3VnaDogUGFzc1Rocm91Z2g7XG5cbmNvbnN0IGlvSG9zdCA9IENsaUlvSG9zdC5pbnN0YW5jZSh7XG4gIGxvZ0xldmVsOiAndHJhY2UnLFxufSk7XG5cbi8vIE1lc3Mgd2l0aCB0aGUgJ3Byb2Nlc3MnIGdsb2JhbCBzbyB3ZSBjYW4gcmVwbGFjZSBpdHMgJ3Byb2Nlc3Muc3RkaW4nIG1lbWJlclxuZ2xvYmFsLnByb2Nlc3MgPSB7IC4uLnByb2Nlc3MgfTtcblxuZGVzY3JpYmUoJ0NsaUlvSG9zdCcsICgpID0+IHtcbiAgbGV0IG1vY2tTdGRvdXQ6IGplc3QuTW9jaztcbiAgbGV0IG1vY2tTdGRlcnI6IGplc3QuTW9jaztcbiAgbGV0IGRlZmF1bHRNZXNzYWdlOiBJb01lc3NhZ2U8dW5rbm93bj47XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgbW9ja1N0ZG91dCA9IGplc3QuZm4oKTtcbiAgICBtb2NrU3RkZXJyID0gamVzdC5mbigpO1xuXG4gICAgLy8gUmVzZXQgc2luZ2xldG9uIHN0YXRlXG4gICAgaW9Ib3N0LmlzVFRZID0gcHJvY2Vzcy5zdGRvdXQuaXNUVFkgPz8gZmFsc2U7XG4gICAgaW9Ib3N0LmlzQ0kgPSBmYWxzZTtcbiAgICBpb0hvc3QuY3VycmVudEFjdGlvbiA9ICdzeW50aCc7XG4gICAgKHByb2Nlc3MgYXMgYW55KS5zdGRpbiA9IHBhc3NUaHJvdWdoID0gbmV3IFBhc3NUaHJvdWdoKCk7XG5cbiAgICBkZWZhdWx0TWVzc2FnZSA9IHtcbiAgICAgIHRpbWU6IG5ldyBEYXRlKCcyMDI0LTAxLTAxVDEyOjAwOjAwJyksXG4gICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgY29kZTogJ0NES19UT09MS0lUX0kwMDAxJyxcbiAgICAgIG1lc3NhZ2U6ICd0ZXN0IG1lc3NhZ2UnLFxuICAgIH07XG5cbiAgICBqZXN0LnNweU9uKHByb2Nlc3Muc3Rkb3V0LCAnd3JpdGUnKS5tb2NrSW1wbGVtZW50YXRpb24oKHN0cjogYW55LCBlbmNvZGluZz86IGFueSwgY2I/OiBhbnkpID0+IHtcbiAgICAgIG1vY2tTdGRvdXQoc3RyLnRvU3RyaW5nKCkpO1xuICAgICAgY29uc3QgY2FsbGJhY2sgPSB0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicgPyBlbmNvZGluZyA6IGNiO1xuICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICBqZXN0LnNweU9uKHByb2Nlc3Muc3RkZXJyLCAnd3JpdGUnKS5tb2NrSW1wbGVtZW50YXRpb24oKHN0cjogYW55LCBlbmNvZGluZz86IGFueSwgY2I/OiBhbnkpID0+IHtcbiAgICAgIG1vY2tTdGRlcnIoc3RyLnRvU3RyaW5nKCkpO1xuICAgICAgY29uc3QgY2FsbGJhY2sgPSB0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicgPyBlbmNvZGluZyA6IGNiO1xuICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgamVzdC5yZXN0b3JlQWxsTW9ja3MoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3N0cmVhbSBzZWxlY3Rpb24nLCAoKSA9PiB7XG4gICAgdGVzdCgnd3JpdGVzIHRvIHN0ZGVyciBieSBkZWZhdWx0IGZvciBub24tZXJyb3IgbWVzc2FnZXMgaW4gbm9uLUNJIG1vZGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBpb0hvc3QuaXNUVFkgPSB0cnVlO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIHRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0kwMDAxJyxcbiAgICAgICAgbWVzc2FnZTogJ3Rlc3QgbWVzc2FnZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLndoaXRlKCd0ZXN0IG1lc3NhZ2UnKSArICdcXG4nKTtcbiAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnd3JpdGVzIHRvIHN0ZGVyciBmb3IgZXJyb3IgbGV2ZWwgd2l0aCByZWQgY29sb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICBpb0hvc3QuaXNUVFkgPSB0cnVlO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIHRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9FMDAwMScsXG4gICAgICAgIG1lc3NhZ2U6ICdlcnJvciBtZXNzYWdlJyxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoY2hhbGsucmVkKCdlcnJvciBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZG91dCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3dyaXRlcyB0byBzdGRvdXQgZm9yIHJlc3VsdCBsZXZlbCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGlvSG9zdC5pc1RUWSA9IHRydWU7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgbGV2ZWw6ICdyZXN1bHQnLFxuICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgIG1lc3NhZ2U6ICdyZXN1bHQgbWVzc2FnZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLndoaXRlKCdyZXN1bHQgbWVzc2FnZScpICsgJ1xcbicpO1xuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdtZXNzYWdlIGZvcm1hdHRpbmcnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBpb0hvc3QuaXNUVFkgPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnZm9ybWF0cyBkZWJ1ZyBtZXNzYWdlcyB3aXRoIHRpbWVzdGFtcCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICAuLi5kZWZhdWx0TWVzc2FnZSxcbiAgICAgICAgbGV2ZWw6ICdkZWJ1ZycsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGBbMTI6MDA6MDBdICR7Y2hhbGsuZ3JheSgndGVzdCBtZXNzYWdlJyl9XFxuYCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdmb3JtYXRzIHRyYWNlIG1lc3NhZ2VzIHdpdGggdGltZXN0YW1wJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIC4uLmRlZmF1bHRNZXNzYWdlLFxuICAgICAgICBsZXZlbDogJ3RyYWNlJyxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoYFsxMjowMDowMF0gJHtjaGFsay5ncmF5KCd0ZXN0IG1lc3NhZ2UnKX1cXG5gKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2FwcGxpZXMgbm8gc3R5bGluZyB3aGVuIFRUWSBpcyBmYWxzZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGlvSG9zdC5pc1RUWSA9IGZhbHNlO1xuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIC4uLmRlZmF1bHRNZXNzYWdlLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgndGVzdCBtZXNzYWdlXFxuJyk7XG4gICAgfSk7XG5cbiAgICB0ZXN0LmVhY2goW1xuICAgICAgWydlcnJvcicsICdyZWQnLCBmYWxzZV0sXG4gICAgICBbJ3dhcm4nLCAneWVsbG93JywgZmFsc2VdLFxuICAgICAgWydpbmZvJywgJ3doaXRlJywgZmFsc2VdLFxuICAgICAgWydkZWJ1ZycsICdncmF5JywgdHJ1ZV0sXG4gICAgICBbJ3RyYWNlJywgJ2dyYXknLCB0cnVlXSxcbiAgICBdIGFzIEFycmF5PFtJb01lc3NhZ2VMZXZlbCwgdHlwZW9mIGNoYWxrLkZvcmVncm91bmRDb2xvciwgYm9vbGVhbl0+KSgnb3V0cHV0cyAlc3MgaW4gJXMgY29sb3IgJywgYXN5bmMgKGxldmVsLCBjb2xvciwgc2hvdWxkQWRkVGltZSkgPT4ge1xuICAgICAgLy8gR2l2ZW5cbiAgICAgIGNvbnN0IHN0eWxlID0gY2hhbGtbY29sb3JdO1xuICAgICAgbGV0IGV4cGVjdGVkT3V0cHV0ID0gYCR7c3R5bGUoJ3Rlc3QgbWVzc2FnZScpfVxcbmA7XG4gICAgICBpZiAoc2hvdWxkQWRkVGltZSkge1xuICAgICAgICBleHBlY3RlZE91dHB1dCA9IGBbMTI6MDA6MDBdICR7ZXhwZWN0ZWRPdXRwdXR9YDtcbiAgICAgIH1cblxuICAgICAgLy8gV2hlblxuICAgICAgYXdhaXQgaW9Ib3N0Lm5vdGlmeSh7XG4gICAgICAgIC4uLmRlZmF1bHRNZXNzYWdlLFxuICAgICAgICBsZXZlbCxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUaGVuXG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0ZWRPdXRwdXQpO1xuICAgICAgbW9ja1N0ZG91dC5tb2NrQ2xlYXIoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FjdGlvbiBoYW5kbGluZycsICgpID0+IHtcbiAgICB0ZXN0KCdzZXRzIGFuZCBnZXRzIGN1cnJlbnQgYWN0aW9uJywgKCkgPT4ge1xuICAgICAgaW9Ib3N0LmN1cnJlbnRBY3Rpb24gPSAnZGVwbG95JztcbiAgICAgIGV4cGVjdChpb0hvc3QuY3VycmVudEFjdGlvbikudG9CZSgnZGVwbG95Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDSSBtb2RlIGJlaGF2aW9yJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgaW9Ib3N0LmlzVFRZID0gdHJ1ZTtcbiAgICAgIGlvSG9zdC5pc0NJID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3dyaXRlcyB0byBzdGRvdXQgaW4gQ0kgbW9kZSB3aGVuIGxldmVsIGlzIG5vdCBlcnJvcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9XMDAwMScsXG4gICAgICAgIG1lc3NhZ2U6ICdjaSBtZXNzYWdlJyxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobW9ja1N0ZG91dCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoY2hhbGsud2hpdGUoJ2NpIG1lc3NhZ2UnKSArICdcXG4nKTtcbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnd3JpdGVzIHRvIHN0ZGVyciBmb3IgZXJyb3IgbGV2ZWwgaW4gQ0kgbW9kZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGlvSG9zdC5ub3RpZnkoe1xuICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfRTAwMDEnLFxuICAgICAgICBtZXNzYWdlOiAnY2kgZXJyb3IgbWVzc2FnZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLnJlZCgnY2kgZXJyb3IgbWVzc2FnZScpICsgJ1xcbicpO1xuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0aW1lc3RhbXAgaGFuZGxpbmcnLCAoKSA9PiB7XG4gICAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgICBpb0hvc3QuaXNUVFkgPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnaW5jbHVkZXMgdGltZXN0YW1wIGZvciBERUJVRyBsZXZlbCB3aXRoIGdyYXkgY29sb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0ZXN0RGF0ZSA9IG5ldyBEYXRlKCcyMDI0LTAxLTAxVDEyOjM0OjU2Jyk7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgdGltZTogdGVzdERhdGUsXG4gICAgICAgIGxldmVsOiAnZGVidWcnLFxuICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgIG1lc3NhZ2U6ICdkZWJ1ZyBtZXNzYWdlJyxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoYFsxMjozNDo1Nl0gJHtjaGFsay5ncmF5KCdkZWJ1ZyBtZXNzYWdlJyl9XFxuYCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdleGNsdWRlcyB0aW1lc3RhbXAgZm9yIG90aGVyIGxldmVscyBidXQgaW5jbHVkZXMgY29sb3InLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0ZXN0RGF0ZSA9IG5ldyBEYXRlKCcyMDI0LTAxLTAxVDEyOjM0OjU2Jyk7XG4gICAgICBhd2FpdCBpb0hvc3Qubm90aWZ5KHtcbiAgICAgICAgdGltZTogdGVzdERhdGUsXG4gICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0kwMDAxJyxcbiAgICAgICAgbWVzc2FnZTogJ2luZm8gbWVzc2FnZScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLndoaXRlKCdpbmZvIG1lc3NhZ2UnKSArICdcXG4nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlcXVlc3RSZXNwb25zZScsICgpID0+IHtcbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIGlvSG9zdC5pc1RUWSA9IHRydWU7XG4gICAgICBpb0hvc3QuaXNDSSA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnZmFpbCBpZiBjb25jdXJyZW5jeSBpcyA+IDEnLCBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBleHBlY3QoKCkgPT4gaW9Ib3N0LnJlcXVlc3RSZXNwb25zZSh7XG4gICAgICAgIHRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0kwMDAxJyxcbiAgICAgICAgbWVzc2FnZTogJ0NvbnRpbnVlPycsXG4gICAgICAgIGRlZmF1bHRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIGNvbmN1cnJlbmN5OiAzLFxuICAgICAgICB9LFxuICAgICAgfSkpLnJlamVjdHMudG9UaHJvdygnYnV0IGNvbmN1cnJlbmN5IGlzIGdyZWF0ZXIgdGhhbiAxJyk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnYm9vbGVhbicsICgpID0+IHtcbiAgICAgIHRlc3QoJ3Jlc3BvbmQgXCJ5ZXNcIiB0byBhIGNvbmZpcm1hdGlvbiBwcm9tcHQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdFJlc3BvbnNlKCd5Jywge1xuICAgICAgICAgIHRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0kwMDAxJyxcbiAgICAgICAgICBtZXNzYWdlOiAnQ29udGludWU/JyxcbiAgICAgICAgICBkZWZhdWx0UmVzcG9uc2U6IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay5jeWFuKCdDb250aW51ZT8nKSArICcgKHkvbikgJyk7XG4gICAgICAgIGV4cGVjdChyZXNwb25zZSkudG9CZSh0cnVlKTtcbiAgICAgIH0pO1xuXG4gICAgICB0ZXN0KCdyZXNwb25kIFwibm9cIiB0byBhIGNvbmZpcm1hdGlvbiBwcm9tcHQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGV4cGVjdCgoKSA9PiByZXF1ZXN0UmVzcG9uc2UoJ24nLCB7XG4gICAgICAgICAgdGltZTogbmV3IERhdGUoKSxcbiAgICAgICAgICBsZXZlbDogJ2luZm8nLFxuICAgICAgICAgIGFjdGlvbjogJ3N5bnRoJyxcbiAgICAgICAgICBjb2RlOiAnQ0RLX1RPT0xLSVRfSTAwMDEnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdDb250aW51ZT8nLFxuICAgICAgICAgIGRlZmF1bHRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgfSkpLnJlamVjdHMudG9UaHJvdygnQWJvcnRlZCBieSB1c2VyJyk7XG5cbiAgICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGNoYWxrLmN5YW4oJ0NvbnRpbnVlPycpICsgJyAoeS9uKSAnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3N0cmluZycsICgpID0+IHtcbiAgICAgIHRlc3QuZWFjaChbXG4gICAgICAgIFsnYmVhcicsICdiZWFyJ10sXG4gICAgICAgIFsnZ2lyYWZmZScsICdnaXJhZmZlJ10sXG4gICAgICAgIC8vIHNpbXVsYXRlIHRoZSBlbnRlciBrZXlcbiAgICAgICAgWydcXHgwQScsICdjYXQnXSxcbiAgICAgIF0pKCdyZWNlaXZlcyAlcCBhbmQgcmV0dXJucyAlcCcsIGFzeW5jIChpbnB1dCwgZXhwZWN0ZWRSZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RSZXNwb25zZShpbnB1dCwge1xuICAgICAgICAgIHRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0kwMDAxJyxcbiAgICAgICAgICBtZXNzYWdlOiAnRmF2b3JpdGUgYW5pbWFsJyxcbiAgICAgICAgICBkZWZhdWx0UmVzcG9uc2U6ICdjYXQnLFxuICAgICAgICB9KTtcblxuICAgICAgICBleHBlY3QobW9ja1N0ZG91dCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoY2hhbGsuY3lhbignRmF2b3JpdGUgYW5pbWFsJykgKyAnIChjYXQpICcpO1xuICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvQmUoZXhwZWN0ZWRSZXNwb25zZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdudW1iZXInLCAoKSA9PiB7XG4gICAgICB0ZXN0LmVhY2goW1xuICAgICAgICBbJzMnLCAzXSxcbiAgICAgICAgLy8gc2ltdWxhdGUgdGhlIGVudGVyIGtleVxuICAgICAgICBbJ1xceDBBJywgMV0sXG4gICAgICBdKSgncmVjZWl2ZXMgJXAgYW5kIHJldHVybiAlcCcsIGFzeW5jIChpbnB1dCwgZXhwZWN0ZWRSZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RSZXNwb25zZShpbnB1dCwge1xuICAgICAgICAgIHRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0kwMDAxJyxcbiAgICAgICAgICBtZXNzYWdlOiAnSG93IG1hbnkgd291bGQgeW91IGxpa2U/JyxcbiAgICAgICAgICBkZWZhdWx0UmVzcG9uc2U6IDEsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay5jeWFuKCdIb3cgbWFueSB3b3VsZCB5b3UgbGlrZT8nKSArICcgKDEpICcpO1xuICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvQmUoZXhwZWN0ZWRSZXNwb25zZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdub24tcHJvbXB0YWJsZSBkYXRhJywgKCkgPT4ge1xuICAgICAgdGVzdCgnbG9ncyBtZXNzYWdlcyBhbmQgcmV0dXJucyBkZWZhdWx0IHVuY2hhbmdlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgICAgbWVzc2FnZTogJ3Rlc3QgbWVzc2FnZScsXG4gICAgICAgICAgZGVmYXVsdFJlc3BvbnNlOiBbMSwgMiwgM10sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChjaGFsay53aGl0ZSgndGVzdCBtZXNzYWdlJykgKyAnXFxuJyk7XG4gICAgICAgIGV4cGVjdChyZXNwb25zZSkudG9FcXVhbChbMSwgMiwgM10pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnbm9uIFRUWSBlbnZpcm9ubWVudCcsICgpID0+IHtcbiAgICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBpb0hvc3QuaXNUVFkgPSBmYWxzZTtcbiAgICAgICAgaW9Ib3N0LmlzQ0kgPSBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgICB0ZXN0KCdmYWlsIGZvciBhbGwgcHJvbXB0cycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZXhwZWN0KCgpID0+IGlvSG9zdC5yZXF1ZXN0UmVzcG9uc2Uoe1xuICAgICAgICAgIHRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0kwMDAxJyxcbiAgICAgICAgICBtZXNzYWdlOiAnQ29udGludWU/JyxcbiAgICAgICAgICBkZWZhdWx0UmVzcG9uc2U6IHRydWUsXG4gICAgICAgIH0pKS5yZWplY3RzLnRvVGhyb3coJ1VzZXIgaW5wdXQgaXMgbmVlZGVkJyk7XG4gICAgICB9KTtcblxuICAgICAgdGVzdCgnZmFpbCB3aXRoIHNwZWNpZmljIG1vdGl2YXRpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IGV4cGVjdCgoKSA9PiBpb0hvc3QucmVxdWVzdFJlc3BvbnNlKHtcbiAgICAgICAgICB0aW1lOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGxldmVsOiAnaW5mbycsXG4gICAgICAgICAgYWN0aW9uOiAnc3ludGgnLFxuICAgICAgICAgIGNvZGU6ICdDREtfVE9PTEtJVF9JMDAwMScsXG4gICAgICAgICAgbWVzc2FnZTogJ0NvbnRpbnVlPycsXG4gICAgICAgICAgZGVmYXVsdFJlc3BvbnNlOiB0cnVlLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIG1vdGl2YXRpb246ICdCYW5hbmFzIGFyZSB5ZWxsb3cnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pKS5yZWplY3RzLnRvVGhyb3coJ0JhbmFuYXMgYXJlIHllbGxvdycpO1xuICAgICAgfSk7XG5cbiAgICAgIHRlc3QoJ3JldHVybnMgdGhlIGRlZmF1bHQgZm9yIG5vbi1wcm9tcHRhYmxlIHJlcXVlc3RzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGlvSG9zdC5yZXF1ZXN0UmVzcG9uc2Uoe1xuICAgICAgICAgIHRpbWU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgbGV2ZWw6ICdpbmZvJyxcbiAgICAgICAgICBhY3Rpb246ICdzeW50aCcsXG4gICAgICAgICAgY29kZTogJ0NES19UT09MS0lUX0kwMDAxJyxcbiAgICAgICAgICBtZXNzYWdlOiAndGVzdCBtZXNzYWdlJyxcbiAgICAgICAgICBkZWZhdWx0UmVzcG9uc2U6IFsxLCAyLCAzXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCd0ZXN0IG1lc3NhZ2VcXG4nKTtcbiAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50b0VxdWFsKFsxLCAyLCAzXSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuLyoqXG4gKiBEbyBhIHJlcXVlc3RSZXNwb25zZSBjeWNsZSB3aXRoIHRoZSBnbG9iYWwgaW9Ib3N0LCB3aGlsZSBzZW5kaW5nIGlucHV0IG9uIHRoZSBnbG9iYWwgZmFrZSBpbnB1dCBzdHJlYW1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFJlc3BvbnNlPERhdGFUeXBlLCBSZXNwb25zZVR5cGU+KGlucHV0OiBzdHJpbmcsIG1zZzogSW9SZXF1ZXN0PERhdGFUeXBlLCBSZXNwb25zZVR5cGU+KTogUHJvbWlzZTxSZXNwb25zZVR5cGU+IHtcbiAgY29uc3QgcHJvbWlzZSA9IGlvSG9zdC5yZXF1ZXN0UmVzcG9uc2UobXNnKTtcbiAgcGFzc1Rocm91Z2gud3JpdGUoaW5wdXQgKyAnXFxuJyk7XG4gIHJldHVybiBwcm9taXNlO1xufVxuIl19
package/lib/import.js DELETED
@@ -1,329 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ResourceImporter = void 0;
4
- exports.removeNonImportResources = removeNonImportResources;
5
- const cfnDiff = require("@aws-cdk/cloudformation-diff");
6
- const chalk = require("chalk");
7
- const fs = require("fs-extra");
8
- const promptly = require("promptly");
9
- const deployments_1 = require("./api/deployments");
10
- const logging_1 = require("./logging");
11
- const error_1 = require("./toolkit/error");
12
- /**
13
- * Resource importing utility class
14
- *
15
- * - Determines the resources added to a template (compared to the deployed version)
16
- * - Look up the identification information
17
- * - Load them from a file, or
18
- * - Ask the user, based on information supplied to us by CloudFormation's GetTemplateSummary
19
- * - Translate the input to a structure expected by CloudFormation, update the template to add the
20
- * importable resources, then run an IMPORT changeset.
21
- */
22
- class ResourceImporter {
23
- constructor(stack, cfn) {
24
- this.stack = stack;
25
- this.cfn = cfn;
26
- }
27
- /**
28
- * Ask the user for resources to import
29
- */
30
- async askForResourceIdentifiers(available) {
31
- const ret = { importResources: [], resourceMap: {} };
32
- const resourceIdentifiers = await this.resourceIdentifiers();
33
- for (const resource of available) {
34
- const identifier = await this.askForResourceIdentifier(resourceIdentifiers, resource);
35
- if (!identifier) {
36
- continue;
37
- }
38
- ret.importResources.push(resource);
39
- ret.resourceMap[resource.logicalId] = identifier;
40
- }
41
- return ret;
42
- }
43
- /**
44
- * Load the resources to import from a file
45
- */
46
- async loadResourceIdentifiers(available, filename) {
47
- const contents = await fs.readJson(filename);
48
- const ret = { importResources: [], resourceMap: {} };
49
- for (const resource of available) {
50
- const descr = this.describeResource(resource.logicalId);
51
- const idProps = contents[resource.logicalId];
52
- if (idProps) {
53
- (0, logging_1.info)('%s: importing using %s', chalk.blue(descr), chalk.blue(fmtdict(idProps)));
54
- ret.importResources.push(resource);
55
- ret.resourceMap[resource.logicalId] = idProps;
56
- delete contents[resource.logicalId];
57
- }
58
- else {
59
- (0, logging_1.info)('%s: skipping', chalk.blue(descr));
60
- }
61
- }
62
- const unknown = Object.keys(contents);
63
- if (unknown.length > 0) {
64
- (0, logging_1.warning)(`Unrecognized resource identifiers in mapping file: ${unknown.join(', ')}`);
65
- }
66
- return ret;
67
- }
68
- /**
69
- * Based on the provided resource mapping, prepare CFN structures for import (template,
70
- * ResourcesToImport structure) and perform the import operation (CloudFormation deployment)
71
- *
72
- * @param importMap Mapping from CDK construct tree path to physical resource import identifiers
73
- * @param options Options to pass to CloudFormation deploy operation
74
- */
75
- async importResourcesFromMap(importMap, options) {
76
- const resourcesToImport = await this.makeResourcesToImport(importMap);
77
- const updatedTemplate = await this.currentTemplateWithAdditions(importMap.importResources);
78
- await this.importResources(updatedTemplate, resourcesToImport, options);
79
- }
80
- /**
81
- * Based on the app and resources file generated by cdk migrate. Removes all items from the template that
82
- * cannot be included in an import change-set for new stacks and performs the import operation,
83
- * creating the new stack.
84
- *
85
- * @param resourcesToImport The mapping created by cdk migrate
86
- * @param options Options to pass to CloudFormation deploy operation
87
- */
88
- async importResourcesFromMigrate(resourcesToImport, options) {
89
- const updatedTemplate = this.removeNonImportResources();
90
- await this.importResources(updatedTemplate, resourcesToImport, options);
91
- }
92
- async importResources(overrideTemplate, resourcesToImport, options) {
93
- try {
94
- const result = await this.cfn.deployStack({
95
- stack: this.stack,
96
- deployName: this.stack.stackName,
97
- ...options,
98
- overrideTemplate,
99
- resourcesToImport,
100
- });
101
- (0, deployments_1.assertIsSuccessfulDeployStackResult)(result);
102
- const message = result.noOp
103
- ? ' ✅ %s (no changes)'
104
- : ' ✅ %s';
105
- (0, logging_1.success)('\n' + message, this.stack.displayName);
106
- }
107
- catch (e) {
108
- (0, logging_1.error)('\n ❌ %s failed: %s', chalk.bold(this.stack.displayName), e);
109
- throw e;
110
- }
111
- }
112
- /**
113
- * Perform a diff between the currently running and the new template, ensure that it is valid
114
- * for importing and return a list of resources that are being added in the new version
115
- *
116
- * @return mapping logicalResourceId -> resourceDifference
117
- */
118
- async discoverImportableResources(allowNonAdditions = false) {
119
- const currentTemplate = await this.currentTemplate();
120
- const diff = cfnDiff.fullDiff(currentTemplate, this.stack.template);
121
- // Ignore changes to CDKMetadata
122
- const resourceChanges = Object.entries(diff.resources.changes)
123
- .filter(([logicalId, _]) => logicalId !== 'CDKMetadata');
124
- // Split the changes into additions and non-additions. Imports only make sense
125
- // for newly-added resources.
126
- const nonAdditions = resourceChanges.filter(([_, dif]) => !dif.isAddition);
127
- const additions = resourceChanges.filter(([_, dif]) => dif.isAddition);
128
- if (nonAdditions.length) {
129
- const offendingResources = nonAdditions.map(([logId, _]) => this.describeResource(logId));
130
- if (allowNonAdditions) {
131
- (0, logging_1.warning)(`Ignoring updated/deleted resources (--force): ${offendingResources.join(', ')}`);
132
- }
133
- else {
134
- throw new error_1.ToolkitError('No resource updates or deletes are allowed on import operation. Make sure to resolve pending changes ' +
135
- `to existing resources, before attempting an import. Updated/deleted resources: ${offendingResources.join(', ')} (--force to override)`);
136
- }
137
- }
138
- // Resources in the new template, that are not present in the current template, are a potential import candidates
139
- return {
140
- additions: additions.map(([logicalId, resourceDiff]) => ({
141
- logicalId,
142
- resourceDiff,
143
- resourceDefinition: addDefaultDeletionPolicy(this.stack.template?.Resources?.[logicalId] ?? {}),
144
- })),
145
- hasNonAdditions: nonAdditions.length > 0,
146
- };
147
- }
148
- /**
149
- * Resolves the environment of a stack.
150
- */
151
- async resolveEnvironment() {
152
- return this.cfn.resolveEnvironment(this.stack);
153
- }
154
- /**
155
- * Get currently deployed template of the given stack (SINGLETON)
156
- *
157
- * @returns Currently deployed CloudFormation template
158
- */
159
- async currentTemplate() {
160
- if (!this._currentTemplate) {
161
- this._currentTemplate = await this.cfn.readCurrentTemplate(this.stack);
162
- }
163
- return this._currentTemplate;
164
- }
165
- /**
166
- * Return the current template, with the given resources added to it
167
- */
168
- async currentTemplateWithAdditions(additions) {
169
- const template = await this.currentTemplate();
170
- if (!template.Resources) {
171
- template.Resources = {};
172
- }
173
- for (const add of additions) {
174
- template.Resources[add.logicalId] = add.resourceDefinition;
175
- }
176
- return template;
177
- }
178
- /**
179
- * Get a list of import identifiers for all resource types used in the given
180
- * template that do support the import operation (SINGLETON)
181
- *
182
- * @returns a mapping from a resource type to a list of property names that together identify the resource for import
183
- */
184
- async resourceIdentifiers() {
185
- const ret = {};
186
- const resourceIdentifierSummaries = await this.cfn.resourceIdentifierSummaries(this.stack);
187
- for (const summary of resourceIdentifierSummaries) {
188
- if ('ResourceType' in summary && summary.ResourceType && 'ResourceIdentifiers' in summary && summary.ResourceIdentifiers) {
189
- ret[summary.ResourceType] = (summary.ResourceIdentifiers ?? [])?.map(x => x.split(','));
190
- }
191
- }
192
- return ret;
193
- }
194
- /**
195
- * Ask for the importable identifier for the given resource
196
- *
197
- * There may be more than one identifier under which a resource can be imported. The `import`
198
- * operation needs exactly one of them.
199
- *
200
- * - If we can get one from the template, we will use one.
201
- * - Otherwise, we will ask the user for one of them.
202
- */
203
- async askForResourceIdentifier(resourceIdentifiers, chg) {
204
- const resourceName = this.describeResource(chg.logicalId);
205
- // Skip resources that do not support importing
206
- const resourceType = chg.resourceDiff.newResourceType;
207
- if (resourceType === undefined || !(resourceType in resourceIdentifiers)) {
208
- (0, logging_1.warning)(`${resourceName}: unsupported resource type ${resourceType}, skipping import.`);
209
- return undefined;
210
- }
211
- const idPropSets = resourceIdentifiers[resourceType];
212
- // Retain only literal strings: strip potential CFN intrinsics
213
- const resourceProps = Object.fromEntries(Object.entries(chg.resourceDefinition.Properties ?? {})
214
- .filter(([_, v]) => typeof v === 'string'));
215
- // Find property sets that are fully satisfied in the template, ask the user to confirm them
216
- const satisfiedPropSets = idPropSets.filter(ps => ps.every(p => resourceProps[p]));
217
- for (const satisfiedPropSet of satisfiedPropSets) {
218
- const candidateProps = Object.fromEntries(satisfiedPropSet.map(p => [p, resourceProps[p]]));
219
- const displayCandidateProps = fmtdict(candidateProps);
220
- if (await promptly.confirm(`${chalk.blue(resourceName)} (${resourceType}): import with ${chalk.yellow(displayCandidateProps)} (yes/no) [default: yes]? `, { default: 'yes' })) {
221
- return candidateProps;
222
- }
223
- }
224
- // If we got here and the user rejected any available identifiers, then apparently they don't want the resource at all
225
- if (satisfiedPropSets.length > 0) {
226
- (0, logging_1.info)(chalk.grey(`Skipping import of ${resourceName}`));
227
- return undefined;
228
- }
229
- // We cannot auto-import this, ask the user for one of the props
230
- // The only difference between these cases is what we print: for multiple properties, we print a preamble
231
- const prefix = `${chalk.blue(resourceName)} (${resourceType})`;
232
- let preamble;
233
- let promptPattern;
234
- if (idPropSets.length > 1) {
235
- preamble = `${prefix}: enter one of ${idPropSets.map(x => chalk.blue(x.join('+'))).join(', ')} to import (all empty to skip)`;
236
- promptPattern = `${prefix}: enter %`;
237
- }
238
- else {
239
- promptPattern = `${prefix}: enter %`;
240
- }
241
- // Do the input loop here
242
- if (preamble) {
243
- (0, logging_1.info)(preamble);
244
- }
245
- for (const idProps of idPropSets) {
246
- const input = {};
247
- for (const idProp of idProps) {
248
- // If we have a value from the template, use it as default. This will only be a partial
249
- // identifier if present, otherwise we would have done the import already above.
250
- const defaultValue = resourceProps[idProp] ?? '';
251
- const prompt = [
252
- promptPattern.replace(/%/g, chalk.blue(idProp)),
253
- defaultValue
254
- ? `[${defaultValue}]`
255
- : '(empty to skip)',
256
- ].join(' ') + ':';
257
- const response = await promptly.prompt(prompt, { default: defaultValue, trim: true });
258
- if (!response) {
259
- break;
260
- }
261
- input[idProp] = response;
262
- // Also stick this property into 'resourceProps', so that it may be reused by a subsequent question
263
- // (for a different compound identifier that involves the same property). Just a small UX enhancement.
264
- resourceProps[idProp] = response;
265
- }
266
- // If the user gave inputs for all values, we are complete
267
- if (Object.keys(input).length === idProps.length) {
268
- return input;
269
- }
270
- }
271
- (0, logging_1.info)(chalk.grey(`Skipping import of ${resourceName}`));
272
- return undefined;
273
- }
274
- /**
275
- * Convert the internal "resource mapping" structure to CloudFormation accepted "ResourcesToImport" structure
276
- */
277
- async makeResourcesToImport(resourceMap) {
278
- return resourceMap.importResources.map(res => ({
279
- LogicalResourceId: res.logicalId,
280
- ResourceType: res.resourceDiff.newResourceType,
281
- ResourceIdentifier: resourceMap.resourceMap[res.logicalId],
282
- }));
283
- }
284
- /**
285
- * Convert CloudFormation logical resource ID to CDK construct tree path
286
- *
287
- * @param logicalId CloudFormation logical ID of the resource (the key in the template's Resources section)
288
- * @returns Forward-slash separated path of the resource in CDK construct tree, e.g. MyStack/MyBucket/Resource
289
- */
290
- describeResource(logicalId) {
291
- return this.stack.template?.Resources?.[logicalId]?.Metadata?.['aws:cdk:path'] ?? logicalId;
292
- }
293
- /**
294
- * Removes CDKMetadata and Outputs in the template so that only resources for importing are left.
295
- * @returns template with import resources only
296
- */
297
- removeNonImportResources() {
298
- return removeNonImportResources(this.stack);
299
- }
300
- }
301
- exports.ResourceImporter = ResourceImporter;
302
- /**
303
- * Removes CDKMetadata and Outputs in the template so that only resources for importing are left.
304
- * @returns template with import resources only
305
- */
306
- function removeNonImportResources(stack) {
307
- const template = stack.template;
308
- delete template.Resources.CDKMetadata;
309
- delete template.Outputs;
310
- return template;
311
- }
312
- function fmtdict(xs) {
313
- return Object.entries(xs).map(([k, v]) => `${k}=${v}`).join(', ');
314
- }
315
- /**
316
- * Add a default `DeletionPolicy` policy.
317
- * The default value is set to 'Retain', to lower risk of unintentionally
318
- * deleting stateful resources in the process of importing to CDK.
319
- */
320
- function addDefaultDeletionPolicy(resource) {
321
- if (resource.DeletionPolicy) {
322
- return resource;
323
- }
324
- return {
325
- ...resource,
326
- DeletionPolicy: 'Retain',
327
- };
328
- }
329
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaW1wb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTRZQSw0REFLQztBQWhaRCx3REFBd0Q7QUFHeEQsK0JBQStCO0FBQy9CLCtCQUErQjtBQUMvQixxQ0FBcUM7QUFDckMsbURBQXdKO0FBR3hKLHVDQUEwRDtBQUMxRCwyQ0FBK0M7QUF1Qy9DOzs7Ozs7Ozs7R0FTRztBQUNILE1BQWEsZ0JBQWdCO0lBRzNCLFlBQ21CLEtBQXdDLEVBQ3hDLEdBQWdCO1FBRGhCLFVBQUssR0FBTCxLQUFLLENBQW1DO1FBQ3hDLFFBQUcsR0FBSCxHQUFHLENBQWE7SUFBSSxDQUFDO0lBRXhDOztPQUVHO0lBQ0ksS0FBSyxDQUFDLHlCQUF5QixDQUFDLFNBQStCO1FBQ3BFLE1BQU0sR0FBRyxHQUFjLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDaEUsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBRTdELEtBQUssTUFBTSxRQUFRLElBQUksU0FBUyxFQUFFLENBQUM7WUFDakMsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdEYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNoQixTQUFTO1lBQ1gsQ0FBQztZQUVELEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25DLEdBQUcsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUNuRCxDQUFDO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsU0FBK0IsRUFBRSxRQUFnQjtRQUNwRixNQUFNLFFBQVEsR0FBRyxN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QUFDbEIsQ0FBQztBQXdDRCxTQUFTLE9BQU8sQ0FBSSxFQUFxQjtJQUN2QyxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyx3QkFBd0IsQ0FBQyxRQUFhO0lBQzdDLElBQUksUUFBUSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQUMsT0FBTyxRQUFRLENBQUM7SUFBQyxDQUFDO0lBRWpELE9BQU87UUFDTCxHQUFHLFFBQVE7UUFDWCxjQUFjLEVBQUUsUUFBUTtLQUN6QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERlcGxveU9wdGlvbnMgfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0ICogYXMgY2ZuRGlmZiBmcm9tICdAYXdzLWNkay9jbG91ZGZvcm1hdGlvbi1kaWZmJztcbmltcG9ydCB7IFJlc291cmNlRGlmZmVyZW5jZSB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkZm9ybWF0aW9uLWRpZmYnO1xuaW1wb3J0ICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHByb21wdGx5IGZyb20gJ3Byb21wdGx5JztcbmltcG9ydCB7IGFzc2VydElzU3VjY2Vzc2Z1bERlcGxveVN0YWNrUmVzdWx0LCBEZXBsb3ltZW50cywgRGVwbG95bWVudE1ldGhvZCwgUmVzb3VyY2VJZGVudGlmaWVyUHJvcGVydGllcywgUmVzb3VyY2VzVG9JbXBvcnQgfSBmcm9tICcuL2FwaS9kZXBsb3ltZW50cyc7XG5pbXBvcnQgeyBUYWcgfSBmcm9tICcuL2FwaS90YWdzJztcbmltcG9ydCB7IFN0YWNrQWN0aXZpdHlQcm9ncmVzcyB9IGZyb20gJy4vYXBpL3V0aWwvY2xvdWRmb3JtYXRpb24vc3RhY2stYWN0aXZpdHktbW9uaXRvcic7XG5pbXBvcnQgeyBlcnJvciwgaW5mbywgc3VjY2Vzcywgd2FybmluZyB9IGZyb20gJy4vbG9nZ2luZyc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuL3Rvb2xraXQvZXJyb3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydERlcGxveW1lbnRPcHRpb25zIGV4dGVuZHMgRGVwbG95T3B0aW9ucyB7XG4gIGRlcGxveW1lbnRNZXRob2Q/OiBEZXBsb3ltZW50TWV0aG9kO1xuICBwcm9ncmVzcz86IFN0YWNrQWN0aXZpdHlQcm9ncmVzcztcbiAgdGFncz86IFRhZ1tdO1xufVxuXG4vKipcbiAqIFNldCBvZiBwYXJhbWV0ZXJzIHRoYXQgdW5pcXVlbHkgaWRlbnRpZnkgYSBwaHlzaWNhbCByZXNvdXJjZSBvZiBhIGdpdmVuIHR5cGVcbiAqIGZvciB0aGUgaW1wb3J0IG9wZXJhdGlvbiwgZXhhbXBsZTpcbiAqXG4gKiBgYGBcbiAqIHtcbiAqICAgXCJBV1M6OlMzOjpCdWNrZXRcIjogW1tcIkJ1Y2tldE5hbWVcIl1dLFxuICogICBcIkFXUzo6RHluYW1vREI6Okdsb2JhbFRhYmxlXCI6IFtbXCJUYWJsZU5hbWVcIl0sIFtcIlRhYmxlQXJuXCJdLCBbXCJUYWJsZVN0cmVhbUFyblwiXV0sXG4gKiAgIFwiQVdTOjpSb3V0ZTUzOjpLZXlTaWduaW5nS2V5XCI6IFtbXCJIb3N0ZWRab25lSWRcIiwgXCJOYW1lXCJdXSxcbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBSZXNvdXJjZUlkZW50aWZpZXJzID0geyBbcmVzb3VyY2VUeXBlOiBzdHJpbmddOiBzdHJpbmdbXVtdIH07XG5cbi8qKlxuICogTWFwcGluZyBvZiBDREsgcmVzb3VyY2VzIChMMSBjb25zdHJ1Y3RzKSB0byBwaHlzaWNhbCByZXNvdXJjZXMgdG8gYmUgaW1wb3J0ZWRcbiAqIGluIHRoZWlyIHBsYWNlLCBleGFtcGxlOlxuICpcbiAqIGBgYFxuICoge1xuICogICBcIk15U3RhY2svTXlTM0J1Y2tldC9SZXNvdXJjZVwiOiB7XG4gKiAgICAgXCJCdWNrZXROYW1lXCI6IFwibXktbWFudWFsbHktY3JlYXRlZC1zMy1idWNrZXRcIlxuICogICB9LFxuICogICBcIk15U3RhY2svTXlWcGMvUmVzb3VyY2VcIjoge1xuICogICAgIFwiVnBjSWRcIjogXCJ2cGMtMTIzNDU2Nzg5XCJcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIFJlc291cmNlTWFwID0geyBbbG9naWNhbFJlc291cmNlOiBzdHJpbmddOiBSZXNvdXJjZUlkZW50aWZpZXJQcm9wZXJ0aWVzIH07XG5cbi8qKlxuICogUmVzb3VyY2UgaW1wb3J0aW5nIHV0aWxpdHkgY2xhc3NcbiAqXG4gKiAtIERldGVybWluZXMgdGhlIHJlc291cmNlcyBhZGRlZCB0byBhIHRlbXBsYXRlIChjb21wYXJlZCB0byB0aGUgZGVwbG95ZWQgdmVyc2lvbilcbiAqIC0gTG9vayB1cCB0aGUgaWRlbnRpZmljYXRpb24gaW5mb3JtYXRpb25cbiAqICAgLSBMb2FkIHRoZW0gZnJvbSBhIGZpbGUsIG9yXG4gKiAgIC0gQXNrIHRoZSB1c2VyLCBiYXNlZCBvbiBpbmZvcm1hdGlvbiBzdXBwbGllZCB0byB1cyBieSBDbG91ZEZvcm1hdGlvbidzIEdldFRlbXBsYXRlU3VtbWFyeVxuICogLSBUcmFuc2xhdGUgdGhlIGlucHV0IHRvIGEgc3RydWN0dXJlIGV4cGVjdGVkIGJ5IENsb3VkRm9ybWF0aW9uLCB1cGRhdGUgdGhlIHRlbXBsYXRlIHRvIGFkZCB0aGVcbiAqICAgaW1wb3J0YWJsZSByZXNvdXJjZXMsIHRoZW4gcnVuIGFuIElNUE9SVCBjaGFuZ2VzZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUltcG9ydGVyIHtcbiAgcHJpdmF0ZSBfY3VycmVudFRlbXBsYXRlOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2ZuOiBEZXBsb3ltZW50cykgeyB9XG5cbiAgLyoqXG4gICAqIEFzayB0aGUgdXNlciBmb3IgcmVzb3VyY2VzIHRvIGltcG9ydFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFza0ZvclJlc291cmNlSWRlbnRpZmllcnMoYXZhaWxhYmxlOiBJbXBvcnRhYmxlUmVzb3VyY2VbXSk6IFByb21pc2U8SW1wb3J0TWFwPiB7XG4gICAgY29uc3QgcmV0OiBJbXBvcnRNYXAgPSB7IGltcG9ydFJlc291cmNlczogW10sIHJlc291cmNlTWFwOiB7fSB9O1xuICAgIGNvbnN0IHJlc291cmNlSWRlbnRpZmllcnMgPSBhd2FpdCB0aGlzLnJlc291cmNlSWRlbnRpZmllcnMoKTtcblxuICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgYXZhaWxhYmxlKSB7XG4gICAgICBjb25zdCBpZGVudGlmaWVyID0gYXdhaXQgdGhpcy5hc2tGb3JSZXNvdXJjZUlkZW50aWZpZXIocmVzb3VyY2VJZGVudGlmaWVycywgcmVzb3VyY2UpO1xuICAgICAgaWYgKCFpZGVudGlmaWVyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXQuaW1wb3J0UmVzb3VyY2VzLnB1c2gocmVzb3VyY2UpO1xuICAgICAgcmV0LnJlc291cmNlTWFwW3Jlc291cmNlLmxvZ2ljYWxJZF0gPSBpZGVudGlmaWVyO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgcmVzb3VyY2VzIHRvIGltcG9ydCBmcm9tIGEgZmlsZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvYWRSZXNvdXJjZUlkZW50aWZpZXJzKGF2YWlsYWJsZTogSW1wb3J0YWJsZVJlc291cmNlW10sIGZpbGVuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEltcG9ydE1hcD4ge1xuICAgIGNvbnN0IGNvbnRlbnRzID0gYXdhaXQgZnMucmVhZEpzb24oZmlsZW5hbWUpO1xuXG4gICAgY29uc3QgcmV0OiBJbXBvcnRNYXAgPSB7IGltcG9ydFJlc291cmNlczogW10sIHJlc291cmNlTWFwOiB7fSB9O1xuICAgIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgYXZhaWxhYmxlKSB7XG4gICAgICBjb25zdCBkZXNjciA9IHRoaXMuZGVzY3JpYmVSZXNvdXJjZShyZXNvdXJjZS5sb2dpY2FsSWQpO1xuICAgICAgY29uc3QgaWRQcm9wcyA9IGNvbnRlbnRzW3Jlc291cmNlLmxvZ2ljYWxJZF07XG4gICAgICBpZiAoaWRQcm9wcykge1xuICAgICAgICBpbmZvKCclczogaW1wb3J0aW5nIHVzaW5nICVzJywgY2hhbGsuYmx1ZShkZXNjciksIGNoYWxrLmJsdWUoZm10ZGljdChpZFByb3BzKSkpO1xuXG4gICAgICAgIHJldC5pbXBvcnRSZXNvdXJjZXMucHVzaChyZXNvdXJjZSk7XG4gICAgICAgIHJldC5yZXNvdXJjZU1hcFtyZXNvdXJjZS5sb2dpY2FsSWRdID0gaWRQcm9wcztcbiAgICAgICAgZGVsZXRlIGNvbnRlbnRzW3Jlc291cmNlLmxvZ2ljYWxJZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmZvKCclczogc2tpcHBpbmcnLCBjaGFsay5ibHVlKGRlc2NyKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdW5rbm93biA9IE9iamVjdC5rZXlzKGNvbnRlbnRzKTtcbiAgICBpZiAodW5rbm93bi5sZW5ndGggPiAwKSB7XG4gICAgICB3YXJuaW5nKGBVbnJlY29nbml6ZWQgcmVzb3VyY2UgaWRlbnRpZmllcnMgaW4gbWFwcGluZyBmaWxlOiAke3Vua25vd24uam9pbignLCAnKX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIEJhc2VkIG9uIHRoZSBwcm92aWRlZCByZXNvdXJjZSBtYXBwaW5nLCBwcmVwYXJlIENGTiBzdHJ1Y3R1cmVzIGZvciBpbXBvcnQgKHRlbXBsYXRlLFxuICAgKiBSZXNvdXJjZXNUb0ltcG9ydCBzdHJ1Y3R1cmUpIGFuZCBwZXJmb3JtIHRoZSBpbXBvcnQgb3BlcmF0aW9uIChDbG91ZEZvcm1hdGlvbiBkZXBsb3ltZW50KVxuICAgKlxuICAgKiBAcGFyYW0gaW1wb3J0TWFwIE1hcHBpbmcgZnJvbSBDREsgY29uc3RydWN0IHRyZWUgcGF0aCB0byBwaHlzaWNhbCByZXNvdXJjZSBpbXBvcnQgaWRlbnRpZmllcnNcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIHRvIENsb3VkRm9ybWF0aW9uIGRlcGxveSBvcGVyYXRpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbXBvcnRSZXNvdXJjZXNGcm9tTWFwKGltcG9ydE1hcDogSW1wb3J0TWFwLCBvcHRpb25zOiBJbXBvcnREZXBsb3ltZW50T3B0aW9ucykge1xuICAgIGNvbnN0IHJlc291cmNlc1RvSW1wb3J0OiBSZXNvdXJjZXNUb0ltcG9ydCA9IGF3YWl0IHRoaXMubWFrZVJlc291cmNlc1RvSW1wb3J0KGltcG9ydE1hcCk7XG4gICAgY29uc3QgdXBkYXRlZFRlbXBsYXRlID0gYXdhaXQgdGhpcy5jdXJyZW50VGVtcGxhdGVXaXRoQWRkaXRpb25zKGltcG9ydE1hcC5pbXBvcnRSZXNvdXJjZXMpO1xuXG4gICAgYXdhaXQgdGhpcy5pbXBvcnRSZXNvdXJjZXModXBkYXRlZFRlbXBsYXRlLCByZXNvdXJjZXNUb0ltcG9ydCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQmFzZWQgb24gdGhlIGFwcCBhbmQgcmVzb3VyY2VzIGZpbGUgZ2VuZXJhdGVkIGJ5IGNkayBtaWdyYXRlLiBSZW1vdmVzIGFsbCBpdGVtcyBmcm9tIHRoZSB0ZW1wbGF0ZSB0aGF0XG4gICAqIGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBhbiBpbXBvcnQgY2hhbmdlLXNldCBmb3IgbmV3IHN0YWNrcyBhbmQgcGVyZm9ybXMgdGhlIGltcG9ydCBvcGVyYXRpb24sXG4gICAqIGNyZWF0aW5nIHRoZSBuZXcgc3RhY2suXG4gICAqXG4gICAqIEBwYXJhbSByZXNvdXJjZXNUb0ltcG9ydCBUaGUgbWFwcGluZyBjcmVhdGVkIGJ5IGNkayBtaWdyYXRlXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgdG8gcGFzcyB0byBDbG91ZEZvcm1hdGlvbiBkZXBsb3kgb3BlcmF0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW1wb3J0UmVzb3VyY2VzRnJvbU1pZ3JhdGUocmVzb3VyY2VzVG9JbXBvcnQ6IFJlc291cmNlc1RvSW1wb3J0LCBvcHRpb25zOiBJbXBvcnREZXBsb3ltZW50T3B0aW9ucykge1xuICAgIGNvbnN0IHVwZGF0ZWRUZW1wbGF0ZSA9IHRoaXMucmVtb3ZlTm9uSW1wb3J0UmVzb3VyY2VzKCk7XG5cbiAgICBhd2FpdCB0aGlzLmltcG9ydFJlc291cmNlcyh1cGRhdGVkVGVtcGxhdGUsIHJlc291cmNlc1RvSW1wb3J0LCBvcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW1wb3J0UmVzb3VyY2VzKG92ZXJyaWRlVGVtcGxhdGU6IGFueSwgcmVzb3VyY2VzVG9JbXBvcnQ6IFJlc291cmNlc1RvSW1wb3J0LCBvcHRpb25zOiBJbXBvcnREZXBsb3ltZW50T3B0aW9ucykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNmbi5kZXBsb3lTdGFjayh7XG4gICAgICAgIHN0YWNrOiB0aGlzLnN0YWNrLFxuICAgICAgICBkZXBsb3lOYW1lOiB0aGlzLnN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgb3ZlcnJpZGVUZW1wbGF0ZSxcbiAgICAgICAgcmVzb3VyY2VzVG9JbXBvcnQsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0SXNTdWNjZXNzZnVsRGVwbG95U3RhY2tSZXN1bHQocmVzdWx0KTtcblxuICAgICAgY29uc3QgbWVzc2FnZSA9IHJlc3VsdC5ub09wXG4gICAgICAgID8gJyDinIUgICVzIChubyBjaGFuZ2VzKSdcbiAgICAgICAgOiAnIOKchSAgJXMnO1xuXG4gICAgICBzdWNjZXNzKCdcXG4nICsgbWVzc2FnZSwgdGhpcy5zdGFjay5kaXNwbGF5TmFtZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3IoJ1xcbiDinYwgICVzIGZhaWxlZDogJXMnLCBjaGFsay5ib2xkKHRoaXMuc3RhY2suZGlzcGxheU5hbWUpLCBlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBkaWZmIGJldHdlZW4gdGhlIGN1cnJlbnRseSBydW5uaW5nIGFuZCB0aGUgbmV3IHRlbXBsYXRlLCBlbnN1cmUgdGhhdCBpdCBpcyB2YWxpZFxuICAgKiBmb3IgaW1wb3J0aW5nIGFuZCByZXR1cm4gYSBsaXN0IG9mIHJlc291cmNlcyB0aGF0IGFyZSBiZWluZyBhZGRlZCBpbiB0aGUgbmV3IHZlcnNpb25cbiAgICpcbiAgICogQHJldHVybiBtYXBwaW5nIGxvZ2ljYWxSZXNvdXJjZUlkIC0+IHJlc291cmNlRGlmZmVyZW5jZVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc2NvdmVySW1wb3J0YWJsZVJlc291cmNlcyhhbGxvd05vbkFkZGl0aW9ucyA9IGZhbHNlKTogUHJvbWlzZTxEaXNjb3ZlckltcG9ydGFibGVSZXNvdXJjZXNSZXN1bHQ+IHtcbiAgICBjb25zdCBjdXJyZW50VGVtcGxhdGUgPSBhd2FpdCB0aGlzLmN1cnJlbnRUZW1wbGF0ZSgpO1xuXG4gICAgY29uc3QgZGlmZiA9IGNmbkRpZmYuZnVsbERpZmYoY3VycmVudFRlbXBsYXRlLCB0aGlzLnN0YWNrLnRlbXBsYXRlKTtcblxuICAgIC8vIElnbm9yZSBjaGFuZ2VzIHRvIENES01ldGFkYXRhXG4gICAgY29uc3QgcmVzb3VyY2VDaGFuZ2VzID0gT2JqZWN0LmVudHJpZXMoZGlmZi5yZXNvdXJjZXMuY2hhbmdlcylcbiAgICAgIC5maWx0ZXIoKFtsb2dpY2FsSWQsIF9dKSA9PiBsb2dpY2FsSWQgIT09ICdDREtNZXRhZGF0YScpO1xuXG4gICAgLy8gU3BsaXQgdGhlIGNoYW5nZXMgaW50byBhZGRpdGlvbnMgYW5kIG5vbi1hZGRpdGlvbnMuIEltcG9ydHMgb25seSBtYWtlIHNlbnNlXG4gICAgLy8gZm9yIG5ld2x5LWFkZGVkIHJlc291cmNlcy5cbiAgICBjb25zdCBub25BZGRpdGlvbnMgPSByZXNvdXJjZUNoYW5nZXMuZmlsdGVyKChbXywgZGlmXSkgPT4gIWRpZi5pc0FkZGl0aW9uKTtcbiAgICBjb25zdCBhZGRpdGlvbnMgPSByZXNvdXJjZUNoYW5nZXMuZmlsdGVyKChbXywgZGlmXSkgPT4gZGlmLmlzQWRkaXRpb24pO1xuXG4gICAgaWYgKG5vbkFkZGl0aW9ucy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG9mZmVuZGluZ1Jlc291cmNlcyA9IG5vbkFkZGl0aW9ucy5tYXAoKFtsb2dJZCwgX10pID0+IHRoaXMuZGVzY3JpYmVSZXNvdXJjZShsb2dJZCkpO1xuXG4gICAgICBpZiAoYWxsb3dOb25BZGRpdGlvbnMpIHtcbiAgICAgICAgd2FybmluZyhgSWdub3JpbmcgdXBkYXRlZC9kZWxldGVkIHJlc291cmNlcyAoLS1mb3JjZSk6ICR7b2ZmZW5kaW5nUmVzb3VyY2VzLmpvaW4oJywgJyl9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdObyByZXNvdXJjZSB1cGRhdGVzIG9yIGRlbGV0ZXMgYXJlIGFsbG93ZWQgb24gaW1wb3J0IG9wZXJhdGlvbi4gTWFrZSBzdXJlIHRvIHJlc29sdmUgcGVuZGluZyBjaGFuZ2VzICcgK1xuICAgICAgICAgIGB0byBleGlzdGluZyByZXNvdXJjZXMsIGJlZm9yZSBhdHRlbXB0aW5nIGFuIGltcG9ydC4gVXBkYXRlZC9kZWxldGVkIHJlc291cmNlczogJHtvZmZlbmRpbmdSZXNvdXJjZXMuam9pbignLCAnKX0gKC0tZm9yY2UgdG8gb3ZlcnJpZGUpYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVzb3VyY2VzIGluIHRoZSBuZXcgdGVtcGxhdGUsIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBjdXJyZW50IHRlbXBsYXRlLCBhcmUgYSBwb3RlbnRpYWwgaW1wb3J0IGNhbmRpZGF0ZXNcbiAgICByZXR1cm4ge1xuICAgICAgYWRkaXRpb25zOiBhZGRpdGlvbnMubWFwKChbbG9naWNhbElkLCByZXNvdXJjZURpZmZdKSA9PiAoe1xuICAgICAgICBsb2dpY2FsSWQsXG4gICAgICAgIHJlc291cmNlRGlmZixcbiAgICAgICAgcmVzb3VyY2VEZWZpbml0aW9uOiBhZGREZWZhdWx0RGVsZXRpb25Qb2xpY3kodGhpcy5zdGFjay50ZW1wbGF0ZT8uUmVzb3VyY2VzPy5bbG9naWNhbElkXSA/PyB7fSksXG4gICAgICB9KSksXG4gICAgICBoYXNOb25BZGRpdGlvbnM6IG5vbkFkZGl0aW9ucy5sZW5ndGggPiAwLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGVudmlyb25tZW50IG9mIGEgc3RhY2suXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVzb2x2ZUVudmlyb25tZW50KCk6IFByb21pc2U8Y3hhcGkuRW52aXJvbm1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5jZm4ucmVzb2x2ZUVudmlyb25tZW50KHRoaXMuc3RhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50bHkgZGVwbG95ZWQgdGVtcGxhdGUgb2YgdGhlIGdpdmVuIHN0YWNrIChTSU5HTEVUT04pXG4gICAqXG4gICAqIEByZXR1cm5zIEN1cnJlbnRseSBkZXBsb3llZCBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjdXJyZW50VGVtcGxhdGUoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoIXRoaXMuX2N1cnJlbnRUZW1wbGF0ZSkge1xuICAgICAgdGhpcy5fY3VycmVudFRlbXBsYXRlID0gYXdhaXQgdGhpcy5jZm4ucmVhZEN1cnJlbnRUZW1wbGF0ZSh0aGlzLnN0YWNrKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRUZW1wbGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdGVtcGxhdGUsIHdpdGggdGhlIGdpdmVuIHJlc291cmNlcyBhZGRlZCB0byBpdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjdXJyZW50VGVtcGxhdGVXaXRoQWRkaXRpb25zKGFkZGl0aW9uczogSW1wb3J0YWJsZVJlc291cmNlW10pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gYXdhaXQgdGhpcy5jdXJyZW50VGVtcGxhdGUoKTtcbiAgICBpZiAoIXRlbXBsYXRlLlJlc291cmNlcykge1xuICAgICAgdGVtcGxhdGUuUmVzb3VyY2VzID0ge307XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhZGQgb2YgYWRkaXRpb25zKSB7XG4gICAgICB0ZW1wbGF0ZS5SZXNvdXJjZXNbYWRkLmxvZ2ljYWxJZF0gPSBhZGQucmVzb3VyY2VEZWZpbml0aW9uO1xuICAgIH1cblxuICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBsaXN0IG9mIGltcG9ydCBpZGVudGlmaWVycyBmb3IgYWxsIHJlc291cmNlIHR5cGVzIHVzZWQgaW4gdGhlIGdpdmVuXG4gICAqIHRlbXBsYXRlIHRoYXQgZG8gc3VwcG9ydCB0aGUgaW1wb3J0IG9wZXJhdGlvbiAoU0lOR0xFVE9OKVxuICAgKlxuICAgKiBAcmV0dXJucyBhIG1hcHBpbmcgZnJvbSBhIHJlc291cmNlIHR5cGUgdG8gYSBsaXN0IG9mIHByb3BlcnR5IG5hbWVzIHRoYXQgdG9nZXRoZXIgaWRlbnRpZnkgdGhlIHJlc291cmNlIGZvciBpbXBvcnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb3VyY2VJZGVudGlmaWVycygpOiBQcm9taXNlPFJlc291cmNlSWRlbnRpZmllcnM+IHtcbiAgICBjb25zdCByZXQ6IFJlc291cmNlSWRlbnRpZmllcnMgPSB7fTtcbiAgICBjb25zdCByZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXMgPSBhd2FpdCB0aGlzLmNmbi5yZXNvdXJjZUlkZW50aWZpZXJTdW1tYXJpZXModGhpcy5zdGFjayk7XG4gICAgZm9yIChjb25zdCBzdW1tYXJ5IG9mIHJlc291cmNlSWRlbnRpZmllclN1bW1hcmllcykge1xuICAgICAgaWYgKCdSZXNvdXJjZVR5cGUnIGluIHN1bW1hcnkgJiYgc3VtbWFyeS5SZXNvdXJjZVR5cGUgJiYgJ1Jlc291cmNlSWRlbnRpZmllcnMnIGluIHN1bW1hcnkgJiYgc3VtbWFyeS5SZXNvdXJjZUlkZW50aWZpZXJzKSB7XG4gICAgICAgIHJldFtzdW1tYXJ5LlJlc291cmNlVHlwZV0gPSAoc3VtbWFyeS5SZXNvdXJjZUlkZW50aWZpZXJzID8/IFtdKT8ubWFwKHggPT4geC5zcGxpdCgnLCcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc2sgZm9yIHRoZSBpbXBvcnRhYmxlIGlkZW50aWZpZXIgZm9yIHRoZSBnaXZlbiByZXNvdXJjZVxuICAgKlxuICAgKiBUaGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBpZGVudGlmaWVyIHVuZGVyIHdoaWNoIGEgcmVzb3VyY2UgY2FuIGJlIGltcG9ydGVkLiBUaGUgYGltcG9ydGBcbiAgICogb3BlcmF0aW9uIG5lZWRzIGV4YWN0bHkgb25lIG9mIHRoZW0uXG4gICAqXG4gICAqIC0gSWYgd2UgY2FuIGdldCBvbmUgZnJvbSB0aGUgdGVtcGxhdGUsIHdlIHdpbGwgdXNlIG9uZS5cbiAgICogLSBPdGhlcndpc2UsIHdlIHdpbGwgYXNrIHRoZSB1c2VyIGZvciBvbmUgb2YgdGhlbS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNrRm9yUmVzb3VyY2VJZGVudGlmaWVyKFxuICAgIHJlc291cmNlSWRlbnRpZmllcnM6IFJlc291cmNlSWRlbnRpZmllcnMsXG4gICAgY2hnOiBJbXBvcnRhYmxlUmVzb3VyY2UsXG4gICk6IFByb21pc2U8UmVzb3VyY2VJZGVudGlmaWVyUHJvcGVydGllcyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IHRoaXMuZGVzY3JpYmVSZXNvdXJjZShjaGcubG9naWNhbElkKTtcblxuICAgIC8vIFNraXAgcmVzb3VyY2VzIHRoYXQgZG8gbm90IHN1cHBvcnQgaW1wb3J0aW5nXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlID0gY2hnLnJlc291cmNlRGlmZi5uZXdSZXNvdXJjZVR5cGU7XG4gICAgaWYgKHJlc291cmNlVHlwZSA9PT0gdW5kZWZpbmVkIHx8ICEocmVzb3VyY2VUeXBlIGluIHJlc291cmNlSWRlbnRpZmllcnMpKSB7XG4gICAgICB3YXJuaW5nKGAke3Jlc291cmNlTmFtZX06IHVuc3VwcG9ydGVkIHJlc291cmNlIHR5cGUgJHtyZXNvdXJjZVR5cGV9LCBza2lwcGluZyBpbXBvcnQuYCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGlkUHJvcFNldHMgPSByZXNvdXJjZUlkZW50aWZpZXJzW3Jlc291cmNlVHlwZV07XG5cbiAgICAvLyBSZXRhaW4gb25seSBsaXRlcmFsIHN0cmluZ3M6IHN0cmlwIHBvdGVudGlhbCBDRk4gaW50cmluc2ljc1xuICAgIGNvbnN0IHJlc291cmNlUHJvcHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoY2hnLnJlc291cmNlRGVmaW5pdGlvbi5Qcm9wZXJ0aWVzID8/IHt9KVxuICAgICAgLmZpbHRlcigoW18sIHZdKSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycpKSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gICAgLy8gRmluZCBwcm9wZXJ0eSBzZXRzIHRoYXQgYXJlIGZ1bGx5IHNhdGlzZmllZCBpbiB0aGUgdGVtcGxhdGUsIGFzayB0aGUgdXNlciB0byBjb25maXJtIHRoZW1cbiAgICBjb25zdCBzYXRpc2ZpZWRQcm9wU2V0cyA9IGlkUHJvcFNldHMuZmlsdGVyKHBzID0+IHBzLmV2ZXJ5KHAgPT4gcmVzb3VyY2VQcm9wc1twXSkpO1xuICAgIGZvciAoY29uc3Qgc2F0aXNmaWVkUHJvcFNldCBvZiBzYXRpc2ZpZWRQcm9wU2V0cykge1xuICAgICAgY29uc3QgY2FuZGlkYXRlUHJvcHMgPSBPYmplY3QuZnJvbUVudHJpZXMoc2F0aXNmaWVkUHJvcFNldC5tYXAocCA9PiBbcCwgcmVzb3VyY2VQcm9wc1twXV0pKTtcbiAgICAgIGNvbnN0IGRpc3BsYXlDYW5kaWRhdGVQcm9wcyA9IGZtdGRpY3QoY2FuZGlkYXRlUHJvcHMpO1xuXG4gICAgICBpZiAoYXdhaXQgcHJvbXB0bHkuY29uZmlybShcbiAgICAgICAgYCR7Y2hhbGsuYmx1ZShyZXNvdXJjZU5hbWUpfSAoJHtyZXNvdXJjZVR5cGV9KTogaW1wb3J0IHdpdGggJHtjaGFsay55ZWxsb3coZGlzcGxheUNhbmRpZGF0ZVByb3BzKX0gKHllcy9ubykgW2RlZmF1bHQ6IHllc10/IGAsXG4gICAgICAgIHsgZGVmYXVsdDogJ3llcycgfSxcbiAgICAgICkpIHtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVByb3BzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIGdvdCBoZXJlIGFuZCB0aGUgdXNlciByZWplY3RlZCBhbnkgYXZhaWxhYmxlIGlkZW50aWZpZXJzLCB0aGVuIGFwcGFyZW50bHkgdGhleSBkb24ndCB3YW50IHRoZSByZXNvdXJjZSBhdCBhbGxcbiAgICBpZiAoc2F0aXNmaWVkUHJvcFNldHMubGVuZ3RoID4gMCkge1xuICAgICAgaW5mbyhjaGFsay5ncmV5KGBTa2lwcGluZyBpbXBvcnQgb2YgJHtyZXNvdXJjZU5hbWV9YCkpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBXZSBjYW5ub3QgYXV0by1pbXBvcnQgdGhpcywgYXNrIHRoZSB1c2VyIGZvciBvbmUgb2YgdGhlIHByb3BzXG4gICAgLy8gVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZXNlIGNhc2VzIGlzIHdoYXQgd2UgcHJpbnQ6IGZvciBtdWx0aXBsZSBwcm9wZXJ0aWVzLCB3ZSBwcmludCBhIHByZWFtYmxlXG4gICAgY29uc3QgcHJlZml4ID0gYCR7Y2hhbGsuYmx1ZShyZXNvdXJjZU5hbWUpfSAoJHtyZXNvdXJjZVR5cGV9KWA7XG4gICAgbGV0IHByZWFtYmxlO1xuICAgIGxldCBwcm9tcHRQYXR0ZXJuO1xuICAgIGlmIChpZFByb3BTZXRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHByZWFtYmxlID0gYCR7cHJlZml4fTogZW50ZXIgb25lIG9mICR7aWRQcm9wU2V0cy5tYXAoeCA9PiBjaGFsay5ibHVlKHguam9pbignKycpKSkuam9pbignLCAnKX0gdG8gaW1wb3J0IChhbGwgZW1wdHkgdG8gc2tpcClgO1xuICAgICAgcHJvbXB0UGF0dGVybiA9IGAke3ByZWZpeH06IGVudGVyICVgO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9tcHRQYXR0ZXJuID0gYCR7cHJlZml4fTogZW50ZXIgJWA7XG4gICAgfVxuXG4gICAgLy8gRG8gdGhlIGlucHV0IGxvb3AgaGVyZVxuICAgIGlmIChwcmVhbWJsZSkge1xuICAgICAgaW5mbyhwcmVhbWJsZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaWRQcm9wcyBvZiBpZFByb3BTZXRzKSB7XG4gICAgICBjb25zdCBpbnB1dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBpZFByb3Agb2YgaWRQcm9wcykge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgdmFsdWUgZnJvbSB0aGUgdGVtcGxhdGUsIHVzZSBpdCBhcyBkZWZhdWx0LiBUaGlzIHdpbGwgb25seSBiZSBhIHBhcnRpYWxcbiAgICAgICAgLy8gaWRlbnRpZmllciBpZiBwcmVzZW50LCBvdGhlcndpc2Ugd2Ugd291bGQgaGF2ZSBkb25lIHRoZSBpbXBvcnQgYWxyZWFkeSBhYm92ZS5cbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gcmVzb3VyY2VQcm9wc1tpZFByb3BdID8/ICcnO1xuXG4gICAgICAgIGNvbnN0IHByb21wdCA9IFtcbiAgICAgICAgICBwcm9tcHRQYXR0ZXJuLnJlcGxhY2UoLyUvZywgY2hhbGsuYmx1ZShpZFByb3ApKSxcbiAgICAgICAgICBkZWZhdWx0VmFsdWVcbiAgICAgICAgICAgID8gYFske2RlZmF1bHRWYWx1ZX1dYFxuICAgICAgICAgICAgOiAnKGVtcHR5IHRvIHNraXApJyxcbiAgICAgICAgXS5qb2luKCcgJykgKyAnOic7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcHJvbXB0bHkucHJvbXB0KHByb21wdCxcbiAgICAgICAgICB7IGRlZmF1bHQ6IGRlZmF1bHRWYWx1ZSwgdHJpbTogdHJ1ZSB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0W2lkUHJvcF0gPSByZXNwb25zZTtcbiAgICAgICAgLy8gQWxzbyBzdGljayB0aGlzIHByb3BlcnR5IGludG8gJ3Jlc291cmNlUHJvcHMnLCBzbyB0aGF0IGl0IG1heSBiZSByZXVzZWQgYnkgYSBzdWJzZXF1ZW50IHF1ZXN0aW9uXG4gICAgICAgIC8vIChmb3IgYSBkaWZmZXJlbnQgY29tcG91bmQgaWRlbnRpZmllciB0aGF0IGludm9sdmVzIHRoZSBzYW1lIHByb3BlcnR5KS4gSnVzdCBhIHNtYWxsIFVYIGVuaGFuY2VtZW50LlxuICAgICAgICByZXNvdXJjZVByb3BzW2lkUHJvcF0gPSByZXNwb25zZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIHVzZXIgZ2F2ZSBpbnB1dHMgZm9yIGFsbCB2YWx1ZXMsIHdlIGFyZSBjb21wbGV0ZVxuICAgICAgaWYgKE9iamVjdC5rZXlzKGlucHV0KS5sZW5ndGggPT09IGlkUHJvcHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbmZvKGNoYWxrLmdyZXkoYFNraXBwaW5nIGltcG9ydCBvZiAke3Jlc291cmNlTmFtZX1gKSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRoZSBpbnRlcm5hbCBcInJlc291cmNlIG1hcHBpbmdcIiBzdHJ1Y3R1cmUgdG8gQ2xvdWRGb3JtYXRpb24gYWNjZXB0ZWQgXCJSZXNvdXJjZXNUb0ltcG9ydFwiIHN0cnVjdHVyZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBtYWtlUmVzb3VyY2VzVG9JbXBvcnQocmVzb3VyY2VNYXA6IEltcG9ydE1hcCk6IFByb21pc2U8UmVzb3VyY2VzVG9JbXBvcnQ+IHtcbiAgICByZXR1cm4gcmVzb3VyY2VNYXAuaW1wb3J0UmVzb3VyY2VzLm1hcChyZXMgPT4gKHtcbiAgICAgIExvZ2ljYWxSZXNvdXJjZUlkOiByZXMubG9naWNhbElkLFxuICAgICAgUmVzb3VyY2VUeXBlOiByZXMucmVzb3VyY2VEaWZmLm5ld1Jlc291cmNlVHlwZSEsXG4gICAgICBSZXNvdXJjZUlkZW50aWZpZXI6IHJlc291cmNlTWFwLnJlc291cmNlTWFwW3Jlcy5sb2dpY2FsSWRdLFxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IENsb3VkRm9ybWF0aW9uIGxvZ2ljYWwgcmVzb3VyY2UgSUQgdG8gQ0RLIGNvbnN0cnVjdCB0cmVlIHBhdGhcbiAgICpcbiAgICogQHBhcmFtIGxvZ2ljYWxJZCBDbG91ZEZvcm1hdGlvbiBsb2dpY2FsIElEIG9mIHRoZSByZXNvdXJjZSAodGhlIGtleSBpbiB0aGUgdGVtcGxhdGUncyBSZXNvdXJjZXMgc2VjdGlvbilcbiAgICogQHJldHVybnMgRm9yd2FyZC1zbGFzaCBzZXBhcmF0ZWQgcGF0aCBvZiB0aGUgcmVzb3VyY2UgaW4gQ0RLIGNvbnN0cnVjdCB0cmVlLCBlLmcuIE15U3RhY2svTXlCdWNrZXQvUmVzb3VyY2VcbiAgICovXG4gIHByaXZhdGUgZGVzY3JpYmVSZXNvdXJjZShsb2dpY2FsSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2sudGVtcGxhdGU/LlJlc291cmNlcz8uW2xvZ2ljYWxJZF0/Lk1ldGFkYXRhPy5bJ2F3czpjZGs6cGF0aCddID8/IGxvZ2ljYWxJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIENES01ldGFkYXRhIGFuZCBPdXRwdXRzIGluIHRoZSB0ZW1wbGF0ZSBzbyB0aGF0IG9ubHkgcmVzb3VyY2VzIGZvciBpbXBvcnRpbmcgYXJlIGxlZnQuXG4gICAqIEByZXR1cm5zIHRlbXBsYXRlIHdpdGggaW1wb3J0IHJlc291cmNlcyBvbmx5XG4gICAqL1xuICBwcml2YXRlIHJlbW92ZU5vbkltcG9ydFJlc291cmNlcygpIHtcbiAgICByZXR1cm4gcmVtb3ZlTm9uSW1wb3J0UmVzb3VyY2VzKHRoaXMuc3RhY2spO1xuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlcyBDREtNZXRhZGF0YSBhbmQgT3V0cHV0cyBpbiB0aGUgdGVtcGxhdGUgc28gdGhhdCBvbmx5IHJlc291cmNlcyBmb3IgaW1wb3J0aW5nIGFyZSBsZWZ0LlxuICogQHJldHVybnMgdGVtcGxhdGUgd2l0aCBpbXBvcnQgcmVzb3VyY2VzIG9ubHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU5vbkltcG9ydFJlc291cmNlcyhzdGFjazogY3hhcGkuQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0KSB7XG4gIGNvbnN0IHRlbXBsYXRlID0gc3RhY2sudGVtcGxhdGU7XG4gIGRlbGV0ZSB0ZW1wbGF0ZS5SZXNvdXJjZXMuQ0RLTWV0YWRhdGE7XG4gIGRlbGV0ZSB0ZW1wbGF0ZS5PdXRwdXRzO1xuICByZXR1cm4gdGVtcGxhdGU7XG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgYSByZXNvdXJjZSBpbiB0aGUgdGVtcGxhdGUgdGhhdCBpcyBpbXBvcnRhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1wb3J0YWJsZVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFRoZSBsb2dpY2FsIElEIG9mIHRoZSByZXNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9naWNhbElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBkZWZpbml0aW9uIGluIHRoZSBuZXcgdGVtcGxhdGVcbiAgICovXG4gIHJlYWRvbmx5IHJlc291cmNlRGVmaW5pdGlvbjogYW55O1xuXG4gIC8qKlxuICAgKiBUaGUgZGlmZiBhcyByZXBvcnRlZCBieSBgY2xvdWRmb3JtYXRpb24tZGlmZmAuXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZURpZmY6IFJlc291cmNlRGlmZmVyZW5jZTtcbn1cblxuLyoqXG4gKiBUaGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGV4ZWN1dGUgYW4gaW1wb3J0IG9wZXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydE1hcCB7XG4gIC8qKlxuICAgKiBNYXBwaW5nIGxvZ2ljYWwgSURzIHRvIHBoeXNpY2FsIG5hbWVzXG4gICAqL1xuICByZWFkb25seSByZXNvdXJjZU1hcDogUmVzb3VyY2VNYXA7XG5cbiAgLyoqXG4gICAqIFRoZSBzZWxlY3Rpb24gb2YgcmVzb3VyY2VzIHdlIGFyZSBhY3R1YWxseSBpbXBvcnRpbmdcbiAgICpcbiAgICogRm9yIGVhY2ggb2YgdGhlIHJlc291cmNlcyBpbiB0aGlzIGxpc3QsIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyBlbnRyeSBpblxuICAgKiB0aGUgYHJlc291cmNlTWFwYCBtYXAuXG4gICAqL1xuICByZWFkb25seSBpbXBvcnRSZXNvdXJjZXM6IEltcG9ydGFibGVSZXNvdXJjZVtdO1xufVxuXG5mdW5jdGlvbiBmbXRkaWN0PEE+KHhzOiBSZWNvcmQ8c3RyaW5nLCBBPikge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoeHMpLm1hcCgoW2ssIHZdKSA9PiBgJHtrfT0ke3Z9YCkuam9pbignLCAnKTtcbn1cblxuLyoqXG4gKiBBZGQgYSBkZWZhdWx0IGBEZWxldGlvblBvbGljeWAgcG9saWN5LlxuICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgc2V0IHRvICdSZXRhaW4nLCB0byBsb3dlciByaXNrIG9mIHVuaW50ZW50aW9uYWxseVxuICogZGVsZXRpbmcgc3RhdGVmdWwgcmVzb3VyY2VzIGluIHRoZSBwcm9jZXNzIG9mIGltcG9ydGluZyB0byBDREsuXG4gKi9cbmZ1bmN0aW9uIGFkZERlZmF1bHREZWxldGlvblBvbGljeShyZXNvdXJjZTogYW55KTogYW55IHtcbiAgaWYgKHJlc291cmNlLkRlbGV0aW9uUG9saWN5KSB7IHJldHVybiByZXNvdXJjZTsgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ucmVzb3VyY2UsXG4gICAgRGVsZXRpb25Qb2xpY3k6ICdSZXRhaW4nLFxuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpc2NvdmVySW1wb3J0YWJsZVJlc291cmNlc1Jlc3VsdCB7XG4gIHJlYWRvbmx5IGFkZGl0aW9uczogSW1wb3J0YWJsZVJlc291cmNlW107XG4gIHJlYWRvbmx5IGhhc05vbkFkZGl0aW9uczogYm9vbGVhbjtcbn1cbiJdfQ==