aws-cdk 2.175.1 → 2.176.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.
- package/CONTRIBUTING.md +4 -4
- package/build-info.json +2 -2
- package/db.json.gz +0 -0
- package/lib/api/aws-auth/credential-plugins.js +5 -5
- package/lib/api/aws-auth/sdk-provider.js +3 -2
- package/lib/api/aws-auth/sdk.js +3 -2
- package/lib/api/cxapp/cloud-assembly.js +4 -4
- package/lib/api/deploy-stack.js +11 -10
- package/lib/api/deployments.js +4 -4
- package/lib/api/environment-access.js +3 -2
- package/lib/api/environment-resources.js +3 -2
- package/lib/api/garbage-collection/garbage-collector.js +9 -9
- package/lib/api/garbage-collection/progress-printer.js +3 -3
- package/lib/api/hotswap-deployments.js +11 -10
- package/lib/api/logs/find-cloudwatch-logs.js +3 -2
- package/lib/api/logs/logs-monitor.js +3 -3
- package/lib/api/nested-stack-helpers.js +3 -2
- package/lib/api/plugin/plugin.js +1 -1
- package/lib/api/util/cloudformation/stack-activity-monitor.d.ts +4 -4
- package/lib/api/util/cloudformation/stack-activity-monitor.js +9 -9
- package/lib/api/util/cloudformation/stack-event-poller.js +3 -2
- package/lib/api/util/cloudformation.js +3 -3
- package/lib/cdk-toolkit.js +32 -33
- package/lib/cli.js +12 -7
- package/lib/commands/context.js +20 -20
- package/lib/commands/docs.js +2 -2
- package/lib/commands/doctor.js +9 -9
- package/lib/commands/migrate.js +16 -16
- package/lib/config.d.ts +6 -3
- package/lib/config.js +10 -7
- package/lib/context-providers/ami.js +2 -2
- package/lib/context-providers/index.js +3 -2
- package/lib/convert-to-user-input.d.ts +3 -0
- package/lib/convert-to-user-input.js +431 -0
- package/lib/diff.js +3 -3
- package/lib/import.js +6 -6
- package/lib/index.js +50 -35
- package/lib/init-hooks.js +3 -2
- package/lib/init-templates/.init-version.json +1 -1
- package/lib/init-templates/.recommended-feature-flags.json +2 -1
- package/lib/init-templates/app/csharp/src/%name.PascalCased%/%name.PascalCased%.template.csproj +1 -1
- package/lib/init-templates/app/fsharp/src/%name.PascalCased%/%name.PascalCased%.template.fsproj +1 -1
- package/lib/init-templates/sample-app/csharp/src/%name.PascalCased%/%name.PascalCased%.template.csproj +1 -1
- package/lib/init-templates/sample-app/fsharp/src/%name.PascalCased%/%name.PascalCased%.template.fsproj +1 -1
- package/lib/init.d.ts +1 -1
- package/lib/init.js +20 -19
- package/lib/logging.d.ts +112 -48
- package/lib/logging.js +176 -133
- package/lib/notices.js +13 -12
- package/lib/parse-command-line-arguments.js +2 -2
- package/lib/settings.d.ts +2 -0
- package/lib/settings.js +3 -1
- package/lib/toolkit/cli-io-host.d.ts +56 -25
- package/lib/toolkit/cli-io-host.js +49 -22
- package/lib/toolkit/error.js +2 -2
- package/lib/{cli-arguments.d.ts → user-input.d.ts} +8 -8
- package/lib/user-input.js +3 -0
- package/lib/util/archive.js +3 -2
- package/lib/util/asset-publishing.js +3 -3
- package/lib/util/error.d.ts +9 -0
- package/lib/util/error.js +22 -0
- package/lib/version.js +2 -2
- package/package.json +12 -11
- package/scripts/user-input-gen +2 -0
- package/scripts/user-input-gen.js +17 -0
- package/test/api/exec.test.js +3 -3
- package/test/api/fake-sts.js +3 -2
- package/test/api/logs/logging.test.js +269 -0
- package/test/api/sdk-provider.test.js +3 -3
- package/test/api/stack-activity-monitor.test.js +16 -16
- package/test/api/util/error.test.d.ts +1 -0
- package/test/api/util/error.test.js +26 -0
- package/test/cli-arguments.test.js +126 -81
- package/test/cli.test.js +8 -8
- package/test/init.test.js +5 -5
- package/test/jest-bufferedconsole.d.ts +14 -0
- package/test/jest-bufferedconsole.js +72 -0
- package/test/notices.test.js +14 -14
- package/test/toolkit/cli-io-host.test.js +93 -188
- package/test/util/silent.js +2 -2
- package/test/version.test.js +5 -5
- package/lib/cli-arguments.js +0 -3
- package/lib/convert-to-cli-args.d.ts +0 -2
- package/lib/convert-to-cli-args.js +0 -234
- package/scripts/cli-args-gen +0 -2
- package/scripts/cli-args-gen.js +0 -16
- package/test/api/logs/cli-logging.test.js +0 -135
- /package/scripts/{cli-args-gen.d.ts → user-input-gen.d.ts} +0 -0
- /package/test/api/logs/{cli-logging.test.d.ts → logging.test.d.ts} +0 -0
package/test/api/fake-sts.js
CHANGED
|
@@ -5,6 +5,7 @@ const client_sts_1 = require("@aws-sdk/client-sts");
|
|
|
5
5
|
const nock = require("nock");
|
|
6
6
|
const uuid = require("uuid");
|
|
7
7
|
const xmlJs = require("xml-js");
|
|
8
|
+
const error_1 = require("../../lib/util/error");
|
|
8
9
|
const mock_sdk_1 = require("../util/mock-sdk");
|
|
9
10
|
/**
|
|
10
11
|
* Class for mocking AWS HTTP Requests and pretending to be STS
|
|
@@ -57,7 +58,7 @@ class FakeSts {
|
|
|
57
58
|
Error: {
|
|
58
59
|
Type: 'Sender',
|
|
59
60
|
Code: e.name ?? 'Error',
|
|
60
|
-
Message: e
|
|
61
|
+
Message: (0, error_1.formatErrorMessage)(e),
|
|
61
62
|
},
|
|
62
63
|
RequestId: '1',
|
|
63
64
|
},
|
|
@@ -268,4 +269,4 @@ function urldecode(body) {
|
|
|
268
269
|
}
|
|
269
270
|
return ret;
|
|
270
271
|
}
|
|
271
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFrZS1zdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmYWtlLXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxvREFBdUY7QUFDdkYsNkJBQTZCO0FBQzdCLDZCQUE2QjtBQUM3QixnQ0FBZ0M7QUFDaEMsK0NBQWlEO0FBd0JqRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLE9BQU87SUFNbEI7UUFMZ0IsaUJBQVksR0FBRyxJQUFJLEtBQUssRUFBZSxDQUFDO1FBRWhELGVBQVUsR0FBdUMsRUFBRSxDQUFDO1FBQ3BELFVBQUssR0FBbUMsRUFBRSxDQUFDO0lBRXBDLENBQUM7SUFFaEI7O09BRUc7SUFDSSxLQUFLO1FBQ1YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBRWxCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEIsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUM7YUFDUCxPQUFPLEVBQUU7YUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ1YsS0FBSyxDQUFDLFVBQWdCLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNsQyxNQUFNLFVBQVUsR0FBRyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBRXJFLElBQUksQ0FBQztnQkFDSCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO29CQUNsQyxHQUFHO29CQUNILElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJO29CQUMzQixVQUFVO29CQUNWLE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU87aUJBQzFCLENBQUMsQ0FBQztnQkFDSCxFQUFFLENB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QUFLLEVBQUUsQ0FBQztRQUN6QixNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFzc3VtZVJvbGVDb21tYW5kLCBHZXRDYWxsZXJJZGVudGl0eUNvbW1hbmQsIFRhZyB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zdHMnO1xuaW1wb3J0ICogYXMgbm9jayBmcm9tICdub2NrJztcbmltcG9ydCAqIGFzIHV1aWQgZnJvbSAndXVpZCc7XG5pbXBvcnQgKiBhcyB4bWxKcyBmcm9tICd4bWwtanMnO1xuaW1wb3J0IHsgbW9ja1NUU0NsaWVudCB9IGZyb20gJy4uL3V0aWwvbW9jay1zZGsnO1xuXG5pbnRlcmZhY2UgUmVnaXN0ZXJlZElkZW50aXR5IHtcbiAgcmVhZG9ubHkgYWNjb3VudDogc3RyaW5nO1xuICByZWFkb25seSBhcm46IHN0cmluZztcbiAgcmVhZG9ubHkgdXNlcklkOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSZWdpc3RlcmVkUm9sZSB7XG4gIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgYWxsb3dlZEFjY291bnRzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgYXJuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJvbGVOYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBBc3N1bWVkUm9sZSB7XG4gIHJlYWRvbmx5IHJvbGVBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgc2VyaWFsTnVtYmVyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRva2VuQ29kZTogc3RyaW5nO1xuICByZWFkb25seSByb2xlU2Vzc2lvbk5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgdGFncz86IFRhZ1tdO1xuICByZWFkb25seSB0cmFuc2l0aXZlVGFnS2V5cz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENsYXNzIGZvciBtb2NraW5nIEFXUyBIVFRQIFJlcXVlc3RzIGFuZCBwcmV0ZW5kaW5nIHRvIGJlIFNUU1xuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciB0ZXN0aW5nIG91ciBhdXRoZW50aWNhdGlvbiBsYXllci4gTW9zdCBvdGhlciBtb2NraW5nXG4gKiBsaWJyYXJpZXMgZG9uJ3QgY29uc2lkZXIgYXMgdGhleSBtb2NrIGZ1bmN0aW9uYWwgbWV0aG9kcyB3aGljaCBoYXBwZW4gQkVGT1JFXG4gKiB0aGUgU0RLJ3MgSFRUUC9BdXRoZW50aWNhdGlvbiBsYXllci5cbiAqXG4gKiBJbnN0ZWFkLCB3ZSB3YW50IHRvIHZhbGlkYXRlIGhvdyB3ZSdyZSBzZXR0aW5nIHVwIGNyZWRlbnRpYWxzIGZvciB0aGVcbiAqIFNESywgc28gd2UgcHJldGVuZCB0byBiZSB0aGUgU1RTIHNlcnZlciBhbmQgaGF2ZSBhbiBpbi1tZW1vcnkgZGF0YWJhc2VcbiAqIG9mIHVzZXJzIGFuZCByb2xlcy5cbiAqXG4gKiBXaXRoIHRoZSB2MyB1cGdyYWRlLCB0aGlzIGlzIG9ubHkgbm93IGhhbGYgd2F5IGJlaW5nIHVzZWQgYXNcbiAqL1xuZXhwb3J0IGNsYXNzIEZha2VTdHMge1xuICBwdWJsaWMgcmVhZG9ubHkgYXNzdW1lZFJvbGVzID0gbmV3IEFycmF5PEFzc3VtZWRSb2xlPigpO1xuXG4gIHByaXZhdGUgaWRlbnRpdGllczogUmVjb3JkPHN0cmluZywgUmVnaXN0ZXJlZElkZW50aXR5PiA9IHt9O1xuICBwcml2YXRlIHJvbGVzOiBSZWNvcmQ8c3RyaW5nLCBSZWdpc3RlcmVkUm9sZT4gPSB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEJlZ2luIG1vY2tpbmdcbiAgICovXG4gIHB1YmxpYyBiZWdpbigpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIG5vY2suZGlzYWJsZU5ldENvbm5lY3QoKTtcbiAgICBpZiAoIW5vY2suaXNBY3RpdmUoKSkge1xuICAgICAgbm9jay5hY3RpdmF0ZSgpO1xuICAgIH1cbiAgICBub2NrKC8uKi8pXG4gICAgICAucGVyc2lzdCgpXG4gICAgICAucG9zdCgvLiovKVxuICAgICAgLnJlcGx5KGZ1bmN0aW9uICh0aGlzLCB1cmksIGJvZHksIGNiKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZEJvZHkgPSB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgPyB1cmxkZWNvZGUoYm9keSkgOiBib2R5O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBzZWxmLmhhbmRsZVJlcXVlc3Qoe1xuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgaG9zdDogdGhpcy5yZXEuaGVhZGVycy5ob3N0LFxuICAgICAgICAgICAgcGFyc2VkQm9keSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMucmVxLmhlYWRlcnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY2IobnVsbCwgWzIwMCwgeG1sSnMuanMyeG1sKHJlc3BvbnNlLCB7IGNvbXBhY3Q6IHRydWUgfSldKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgY2IobnVsbCwgW1xuICAgICAgICAgICAgNDAwLFxuICAgICAgICAgICAgeG1sSnMuanMyeG1sKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgRXJyb3JSZXNwb25zZToge1xuICAgICAgICAgICAgICAgICAgX2F0dHJpYnV0ZXM6IHsgeG1sbnM6ICdodHRwczovL3N0cy5hbWF6b25hd3MuY29tL2RvYy8yMDExLTA2LTE1LycgfSxcbiAgICAgICAgICAgICAgICAgIEVycm9yOiB7XG4gICAgICAgICAgICAgICAgICAgIFR5cGU6ICdTZW5kZXInLFxuICAgICAgICAgICAgICAgICAgICBDb2RlOiBlLm5hbWUgPz8gJ0Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIFJlcXVlc3RJZDogJzEnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgY29tcGFjdDogdHJ1ZSB9LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAvLyBTY3J1YiBzb21lIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IG1pZ2h0IGJlIHNldCBpZiB3ZSdyZSBydW5uaW5nIG9uIENvZGVCdWlsZCB3aGljaCB3aWxsIGludGVyZmVyZSB3aXRoIHRoZSB0ZXN0cy5cbiAgICBkZWxldGUgcHJvY2Vzcy5lbnYuQVdTX1BST0ZJTEU7XG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkFXU19SRUdJT047XG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkFXU19ERUZBVUxUX1JFR0lPTjtcbiAgICBkZWxldGUgcHJvY2Vzcy5lbnYuQVdTX0FDQ0VTU19LRVlfSUQ7XG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkFXU19TRUNSRVRfQUNDRVNTX0tFWTtcbiAgICBkZWxldGUgcHJvY2Vzcy5lbnYuQVdTX1NFU1NJT05fVE9LRU47XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBldmVyeXRoaW5nIHRvIG5vcm1hbFxuICAgKi9cbiAgcHVibGljIHJlc3RvcmUoKSB7XG4gICAgbm9jay5yZXN0b3JlKCk7IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2NrL25vY2svaXNzdWVzLzE4MTdcbiAgICBub2NrLmNsZWFuQWxsKCk7XG4gICAgbm9jay5lbmFibGVOZXRDb25uZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSB1c2VyXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJVc2VyKGFjY291bnQ6IHN0cmluZywgYWNjZXNzS2V5OiBzdHJpbmcsIG9wdGlvbnM6IFJlZ2lzdGVyVXNlck9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHVzZXJOYW1lID0gb3B0aW9ucy5uYW1lID8/IGBVc2VyJHtPYmplY3Qua2V5cyh0aGlzLmlkZW50aXRpZXMpLmxlbmd0aCArIDF9YDtcbiAgICBjb25zdCBhcm4gPSBgYXJuOiR7b3B0aW9ucy5wYXJ0aXRpb24gPz8gJ2F3cyd9OnN0czo6JHthY2NvdW50fTp1c2VyLyR7dXNlck5hbWV9YDtcbiAgICBjb25zdCB1c2VySWQgPSBgJHthY2Nlc3NLZXl9OiR7dXNlck5hbWV9YDtcblxuICAgIHRoaXMuaWRlbnRpdGllc1thY2Nlc3NLZXldID0ge1xuICAgICAgYWNjb3VudCxcbiAgICAgIGFybixcbiAgICAgIHVzZXJJZCxcbiAgICB9O1xuXG4gICAgdGhpcy5zZXRTVFNNb2NrcyhhY2NvdW50LCBhcm4sIHVzZXJOYW1lLCBhY2Nlc3NLZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGFuIGFzc3VtYWJsZSByb2xlXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJSb2xlKGFjY291bnQ6IHN0cmluZywgcm9sZUFybjogc3RyaW5nLCBvcHRpb25zOiBSZWdpc3RlclJvbGVPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCByb2xlTmFtZSA9IG9wdGlvbnMubmFtZSA/PyBgUm9sZSR7T2JqZWN0LmtleXModGhpcy5yb2xlcykubGVuZ3RoICsgMX1gO1xuXG4gICAgdGhpcy5yb2xlc1tyb2xlQXJuXSA9IHtcbiAgICAgIGFsbG93ZWRBY2NvdW50czogb3B0aW9ucy5hbGxvd2VkQWNjb3VudHMgPz8gW2FjY291bnRdLFxuICAgICAgYXJuOiByb2xlQXJuLFxuICAgICAgcm9sZU5hbWUsXG4gICAgICBhY2NvdW50LFxuICAgIH07XG5cbiAgICB0aGlzLnNldFNUU01vY2tzKGFjY291bnQsIHJvbGVBcm4sIHJvbGVBcm4pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTVFNNb2NrcyhhY2NvdW50OiBzdHJpbmcsIHJvbGVBcm46IHN0cmluZywgbmFtZTogc3RyaW5nLCBhY2Nlc3NLZXk/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY2Nlc3NLZXlJZCA9IGFjY2Vzc0tleSA/PyB1dWlkLnY0KCk7XG4gICAgbW9ja1NUU0NsaWVudFxuICAgICAgLm9uKEdldENhbGxlcklkZW50aXR5Q29tbWFuZClcbiAgICAgIC5yZXNvbHZlcyh7XG4gICAgICAgIEFjY291bnQ6IGFjY291bnQsXG4gICAgICAgIEFybjogcm9sZUFybixcbiAgICAgICAgVXNlcklkOiBuYW1lLFxuICAgICAgfSlcbiAgICAgIC5vbihBc3N1bWVSb2xlQ29tbWFuZClcbiAgICAgIC5yZXNvbHZlcyh7XG4gICAgICAgIEFzc3VtZWRSb2xlVXNlcjoge1xuICAgICAgICAgIEFybjogcm9sZUFybixcbiAgICAgICAgICBBc3N1bWVkUm9sZUlkOiBgJHthY2Nlc3NLZXlJZH06JHtuYW1lfWAsXG4gICAgICAgIH0sXG4gICAgICAgIENyZWRlbnRpYWxzOiB7XG4gICAgICAgICAgQWNjZXNzS2V5SWQ6IGFjY2Vzc0tleUlkLFxuICAgICAgICAgIFNlY3JldEFjY2Vzc0tleTogJ1NlY3JldCcsXG4gICAgICAgICAgU2Vzc2lvblRva2VuOiAnVG9rZW4nLFxuICAgICAgICAgIEV4cGlyYXRpb246IG5ldyBEYXRlKERhdGUubm93KCkgKyAzNjAwICogMTAwMCksXG4gICAgICAgIH0sXG4gICAgICAgIFBhY2tlZFBvbGljeVNpemU6IDYsXG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUmVxdWVzdChtb2NrUmVxdWVzdDogTW9ja1JlcXVlc3QpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICBjb25zdCByZXNwb25zZSA9ICgoKSA9PiB7XG4gICAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMuaWRlbnRpdHkobW9ja1JlcXVlc3QpO1xuXG4gICAgICBzd2l0Y2ggKG1vY2tSZXF1ZXN0LnBhcnNlZEJvZHkuQWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ0dldENhbGxlcklkZW50aXR5Q29tbWFuZCc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlR2V0Q2FsbGVySWRlbnRpdHkoaWRlbnRpdHkpO1xuXG4gICAgICAgIGNhc2UgJ0Fzc3VtZVJvbGVDb21tYW5kJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVBc3N1bWVSb2xlKGlkZW50aXR5LCBtb2NrUmVxdWVzdCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIEFjdGlvbiBpbiBNb2NrQXdzSHR0cDogJHttb2NrUmVxdWVzdC5wYXJzZWRCb2R5LkFjdGlvbn1gKTtcbiAgICB9KSgpO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlR2V0Q2FsbGVySWRlbnRpdHkoaWRlbnRpdHk6IFJlZ2lzdGVyZWRJZGVudGl0eSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHJldHVybiB7XG4gICAgICBHZXRDYWxsZXJJZGVudGl0eVJlc3BvbnNlOiB7XG4gICAgICAgIF9hdHRyaWJ1dGVzOiB7IHhtbG5zOiAnaHR0cHM6Ly9zdHMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMS0wNi0xNS8nIH0sXG4gICAgICAgIEdldENhbGxlcklkZW50aXR5UmVzdWx0OiB7XG4gICAgICAgICAgQXJuOiBpZGVudGl0eS5hcm4sXG4gICAgICAgICAgVXNlcklkOiBpZGVudGl0eS51c2VySWQsXG4gICAgICAgICAgQWNjb3VudDogaWRlbnRpdHkuYWNjb3VudCxcbiAgICAgICAgfSxcbiAgICAgICAgUmVzcG9uc2VNZXRhZGF0YToge1xuICAgICAgICAgIFJlcXVlc3RJZDogJzEnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgaGF2ZSBhIGZ1bmt5IGVuY29kaW5nIHRvIHRoZW0gd2hlbiBzZW50IHRvIFNUUy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vU1RTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc3VtZVJvbGUuaHRtbFxuICAgKi9cbiAgcHJpdmF0ZSBkZWNvZGVNYXBGcm9tUmVxdWVzdEJvZHkocGFyYW1ldGVyOiBzdHJpbmcsIGJvZHk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBUYWdbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGJvZHkpXG4gICAgICAuZmlsdGVyKChba2V5LCBfXSkgPT4ga2V5LnN0YXJ0c1dpdGgoYCR7cGFyYW1ldGVyfS5tZW1iZXIuYCkgJiYga2V5LmVuZHNXaXRoKCcuS2V5JykpXG4gICAgICAubWFwKChba2V5LCB0YWdLZXldKSA9PiAoe1xuICAgICAgICBLZXk6IHRhZ0tleSxcbiAgICAgICAgVmFsdWU6IGJvZHlbYCR7cGFyYW1ldGVyfS5tZW1iZXIuJHtrZXkuc3BsaXQoJy4nKVsyXX0uVmFsdWVgXSxcbiAgICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyBoYXZlIGEgZnVua3kgZW5jb2Rpbmcgd2hlbiBzZW50IHRvIFNUUy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vU1RTL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Fzc3VtZVJvbGUuaHRtbFxuICAgKi9cbiAgcHJpdmF0ZSBkZWNvZGVMaXN0S2V5c0Zyb21SZXF1ZXN0Qm9keShwYXJhbWV0ZXI6IHN0cmluZywgYm9keTogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoYm9keSlcbiAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiBrZXkuc3RhcnRzV2l0aChgJHtwYXJhbWV0ZXJ9Lm1lbWJlci5gKSlcbiAgICAgIC5tYXAoKFssIHZhbHVlXSkgPT4gdmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVBc3N1bWVSb2xlKGlkZW50aXR5OiBSZWdpc3RlcmVkSWRlbnRpdHksIG1vY2tSZXF1ZXN0OiBNb2NrUmVxdWVzdCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIHRoaXMuY2hlY2tGb3JGYWlsdXJlKG1vY2tSZXF1ZXN0LnBhcnNlZEJvZHkuUm9sZUFybik7XG5cbiAgICB0aGlzLmFzc3VtZWRSb2xlcy5wdXNoKHtcbiAgICAgIHJvbGVBcm46IG1vY2tSZXF1ZXN0LnBhcnNlZEJvZHkuUm9sZUFybixcbiAgICAgIHJvbGVTZXNzaW9uTmFtZTogbW9ja1JlcXVlc3QucGFyc2VkQm9keS5Sb2xlU2Vzc2lvbk5hbWUsXG4gICAgICBzZXJpYWxOdW1iZXI6IG1vY2tSZXF1ZXN0LnBhcnNlZEJvZHkuU2VyaWFsTnVtYmVyLFxuICAgICAgdG9rZW5Db2RlOiBtb2NrUmVxdWVzdC5wYXJzZWRCb2R5LlRva2VuQ29kZSxcbiAgICAgIHRhZ3M6IHRoaXMuZGVjb2RlTWFwRnJvbVJlcXVlc3RCb2R5KCdUYWdzJywgbW9ja1JlcXVlc3QucGFyc2VkQm9keSksXG4gICAgICB0cmFuc2l0aXZlVGFnS2V5czogdGhpcy5kZWNvZGVMaXN0S2V5c0Zyb21SZXF1ZXN0Qm9keSgnVHJhbnNpdGl2ZVRhZ0tleXMnLCBtb2NrUmVxdWVzdC5wYXJzZWRCb2R5KSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJvbGVBcm4gPSBtb2NrUmVxdWVzdC5wYXJzZWRCb2R5LlJvbGVBcm47XG4gICAgY29uc3QgdGFyZ2V0Um9sZSA9IHRoaXMucm9sZXNbcm9sZUFybl07XG4gICAgaWYgKCF0YXJnZXRSb2xlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHN1Y2ggcm9sZTogJHtyb2xlQXJufWApO1xuICAgIH1cblxuICAgIGlmICghdGFyZ2V0Um9sZS5hbGxvd2VkQWNjb3VudHMuaW5jbHVkZXMoaWRlbnRpdHkuYWNjb3VudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYElkZW50aXR5IGZyb20gYWNjb3VudDogJHtpZGVudGl0eS5hY2NvdW50fSBub3QgYWxsb3dlZCB0byBhc3N1bWUgJHtyb2xlQXJufSwgbXVzdCBiZSBvbmUgb2Y6ICR7dGFyZ2V0Um9sZS5hbGxvd2VkQWNjb3VudHN9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZnJlc2hBY2Nlc3NLZXkgPSB1dWlkLnY0KCk7XG5cbiAgICAvLyBSZWdpc3RlciBhIG5ldyBcInVzZXJcIiAoaWRlbnRpdHkpIGZvciB0aGlzIGFjY2VzcyBrZXlcbiAgICB0aGlzLnJlZ2lzdGVyVXNlcih0YXJnZXRSb2xlLmFjY291bnQsIGZyZXNoQWNjZXNzS2V5LCB7XG4gICAgICBuYW1lOiBgQXNzdW1lZFJvbGUtJHt0YXJnZXRSb2xlLnJvbGVOYW1lfS0ke2lkZW50aXR5LnVzZXJJZH1gLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIEFzc3VtZVJvbGVSZXNwb25zZToge1xuICAgICAgICBfYXR0cmlidXRlczogeyB4bWxuczogJ2h0dHBzOi8vc3RzLmFtYXpvbmF3cy5jb20vZG9jLzIwMTEtMDYtMTUvJyB9LFxuICAgICAgICBBc3N1bWVSb2xlUmVzdWx0OiB7XG4gICAgICAgICAgQXNzdW1lZFJvbGVVc2VyOiB7XG4gICAgICAgICAgICBBcm46IHJvbGVBcm4sXG4gICAgICAgICAgICBBc3N1bWVkUm9sZUlkOiBgJHtmcmVzaEFjY2Vzc0tleX06JHt0YXJnZXRSb2xlLnJvbGVOYW1lfWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBDcmVkZW50aWFsczoge1xuICAgICAgICAgICAgQWNjZXNzS2V5SWQ6IGZyZXNoQWNjZXNzS2V5LFxuICAgICAgICAgICAgU2VjcmV0QWNjZXNzS2V5OiAnU2VjcmV0JyxcbiAgICAgICAgICAgIFNlc3Npb25Ub2tlbjogJ1Rva2VuJyxcbiAgICAgICAgICAgIEV4cGlyYXRpb246IG5ldyBEYXRlKERhdGUubm93KCkgKyAzNjAwICogMTAwMCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFBhY2tlZFBvbGljeVNpemU6IDYsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgUmVzcG9uc2VNZXRhZGF0YToge1xuICAgICAgICBSZXF1ZXN0SWQ6ICcxJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tGb3JGYWlsdXJlKHM6IHN0cmluZykge1xuICAgIGNvbnN0IGZhaWx1cmVSZXF1ZXN0ZWQgPSBzLm1hdGNoKC88RkFJTDooW14+XSspPi8pO1xuICAgIGlmIChmYWlsdXJlUmVxdWVzdGVkKSB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoYFNUUyBmYWlsaW5nIGJ5IHVzZXIgcmVxdWVzdDogJHtmYWlsdXJlUmVxdWVzdGVkWzFdfWApO1xuICAgICAgKGVyciBhcyBhbnkpLm5hbWUgPSBmYWlsdXJlUmVxdWVzdGVkWzFdO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaWRlbnRpdHkobW9ja1JlcXVlc3Q6IE1vY2tSZXF1ZXN0KSB7XG4gICAgY29uc3Qga2V5SWQgPSB0aGlzLmFjY2Vzc0tleUlkKG1vY2tSZXF1ZXN0KTtcbiAgICB0aGlzLmNoZWNrRm9yRmFpbHVyZShrZXlJZCk7XG5cbiAgICBjb25zdCByZXQgPSB0aGlzLmlkZW50aXRpZXNba2V5SWRdO1xuICAgIGlmICghcmV0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBhY2Nlc3Mga2V5IHVzZWQ6ICR7a2V5SWR9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBhY2Nlc3Mga2V5IGZyb20gYSBzaWduZWQgcmVxdWVzdFxuICAgKi9cbiAgcHJpdmF0ZSBhY2Nlc3NLZXlJZChtb2NrUmVxdWVzdDogTW9ja1JlcXVlc3QpOiBzdHJpbmcge1xuICAgIC8vIFwiQVdTNC1ITUFDLVNIQTI1NiBDcmVkZW50aWFsPShhYjFhNWU0Yy1mZjQxLTQ4MTEtYWM1Zi02ZDEyMzBmN2FhOTApYWNjZXNzLzIwMjAxMjEwL2V1LWJsYS01L3N0cy9hd3M0X3JlcXVlc3QsIFNpZ25lZEhlYWRlcnM9aG9zdDt4LWFtei1jb250ZW50LXNoYTI1Njt4LWFtei1kYXRlLCBTaWduYXR1cmU9OWIzMTAxMTE3M2E3ODQyZmEzNzJkNGVmN2M0MzFjMDhmMGIxNTE0ZmRhZjU0MTQ1NTYwYTRkYjdlY2QyNDUyOVwiXG4gICAgY29uc3QgYXV0aCA9IG1vY2tSZXF1ZXN0LmhlYWRlcnMuYXV0aG9yaXphdGlvbjtcblxuICAgIGNvbnN0IG0gPSBhdXRoPy5tYXRjaCgvQ3JlZGVudGlhbD0oW15cXC9dKykvKTtcbiAgICBpZiAoIW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY29ycmVjdCBhdXRob3JpemF0aW9uIGhlYWRlcjogJHthdXRofWApO1xuICAgIH1cbiAgICByZXR1cm4gbVsxXTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdGVyVXNlck9wdGlvbnMge1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBwYXJ0aXRpb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJSb2xlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGFsbG93ZWRBY2NvdW50cz86IHN0cmluZ1tdO1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNUU01vY2tzT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGFjY2Vzc0tleT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE1vY2tSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgaG9zdDogc3RyaW5nO1xuICByZWFkb25seSB1cmk6IHN0cmluZztcbiAgcmVhZG9ubHkgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcmVhZG9ubHkgcGFyc2VkQm9keTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcmVhZG9ubHkgc2Vzc2lvblRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG5mdW5jdGlvbiB1cmxkZWNvZGUoYm9keTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHBhcnRzID0gYm9keS5zcGxpdCgnJicpO1xuICBjb25zdCByZXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgY29uc3QgW2ssIHZdID0gcGFydC5zcGxpdCgnPScpO1xuICAgIHJldFtkZWNvZGVVUklDb21wb25lbnQoayldID0gZGVjb2RlVVJJQ29tcG9uZW50KHYpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG4iXX0=
|
|
272
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFrZS1zdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmYWtlLXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxvREFBdUY7QUFDdkYsNkJBQTZCO0FBQzdCLDZCQUE2QjtBQUM3QixnQ0FBZ0M7QUFDaEMsZ0RBQTBEO0FBQzFELCtDQUFpRDtBQXdCakQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBYSxPQUFPO0lBTWxCO1FBTGdCLGlCQUFZLEdBQUcsSUFBSSxLQUFLLEVBQWUsQ0FBQztRQUVoRCxlQUFVLEdBQXVDLEVBQUUsQ0FBQztRQUNwRCxVQUFLLEdBQW1DLEVBQUUsQ0FBQztJQUVwQyxDQUFDO0lBRWhCOztPQUVHO0lBQ0ksS0FBSztRQUNWLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztRQUVsQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ1AsT0FBTyxFQUFFO2FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQzthQUNWLEtBQUssQ0FBQyxVQUFnQixHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDbEMsTUFBTSxVQUFVLEdBQUcsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUVyRSxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztvQkFDbEMsR0FBRztvQkFDSCxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSTtvQkFDM0IsVUFBVTtvQkFDVixPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPO2lCQUMxQixDQUFDLENBQUM7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Q3ZDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3N1bWVSb2xlQ29tbWFuZCwgR2V0Q2FsbGVySWRlbnRpdHlDb21tYW5kLCBUYWcgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtc3RzJztcbmltcG9ydCAqIGFzIG5vY2sgZnJvbSAnbm9jayc7XG5pbXBvcnQgKiBhcyB1dWlkIGZyb20gJ3V1aWQnO1xuaW1wb3J0ICogYXMgeG1sSnMgZnJvbSAneG1sLWpzJztcbmltcG9ydCB7IGZvcm1hdEVycm9yTWVzc2FnZSB9IGZyb20gJy4uLy4uL2xpYi91dGlsL2Vycm9yJztcbmltcG9ydCB7IG1vY2tTVFNDbGllbnQgfSBmcm9tICcuLi91dGlsL21vY2stc2RrJztcblxuaW50ZXJmYWNlIFJlZ2lzdGVyZWRJZGVudGl0eSB7XG4gIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgYXJuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHVzZXJJZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUmVnaXN0ZXJlZFJvbGUge1xuICByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFsbG93ZWRBY2NvdW50czogc3RyaW5nW107XG4gIHJlYWRvbmx5IGFybjogc3RyaW5nO1xuICByZWFkb25seSByb2xlTmFtZTogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQXNzdW1lZFJvbGUge1xuICByZWFkb25seSByb2xlQXJuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNlcmlhbE51bWJlcjogc3RyaW5nO1xuICByZWFkb25seSB0b2tlbkNvZGU6IHN0cmluZztcbiAgcmVhZG9ubHkgcm9sZVNlc3Npb25OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhZ3M/OiBUYWdbXTtcbiAgcmVhZG9ubHkgdHJhbnNpdGl2ZVRhZ0tleXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgbW9ja2luZyBBV1MgSFRUUCBSZXF1ZXN0cyBhbmQgcHJldGVuZGluZyB0byBiZSBTVFNcbiAqXG4gKiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGVzdGluZyBvdXIgYXV0aGVudGljYXRpb24gbGF5ZXIuIE1vc3Qgb3RoZXIgbW9ja2luZ1xuICogbGlicmFyaWVzIGRvbid0IGNvbnNpZGVyIGFzIHRoZXkgbW9jayBmdW5jdGlvbmFsIG1ldGhvZHMgd2hpY2ggaGFwcGVuIEJFRk9SRVxuICogdGhlIFNESydzIEhUVFAvQXV0aGVudGljYXRpb24gbGF5ZXIuXG4gKlxuICogSW5zdGVhZCwgd2Ugd2FudCB0byB2YWxpZGF0ZSBob3cgd2UncmUgc2V0dGluZyB1cCBjcmVkZW50aWFscyBmb3IgdGhlXG4gKiBTREssIHNvIHdlIHByZXRlbmQgdG8gYmUgdGhlIFNUUyBzZXJ2ZXIgYW5kIGhhdmUgYW4gaW4tbWVtb3J5IGRhdGFiYXNlXG4gKiBvZiB1c2VycyBhbmQgcm9sZXMuXG4gKlxuICogV2l0aCB0aGUgdjMgdXBncmFkZSwgdGhpcyBpcyBvbmx5IG5vdyBoYWxmIHdheSBiZWluZyB1c2VkIGFzXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWtlU3RzIHtcbiAgcHVibGljIHJlYWRvbmx5IGFzc3VtZWRSb2xlcyA9IG5ldyBBcnJheTxBc3N1bWVkUm9sZT4oKTtcblxuICBwcml2YXRlIGlkZW50aXRpZXM6IFJlY29yZDxzdHJpbmcsIFJlZ2lzdGVyZWRJZGVudGl0eT4gPSB7fTtcbiAgcHJpdmF0ZSByb2xlczogUmVjb3JkPHN0cmluZywgUmVnaXN0ZXJlZFJvbGU+ID0ge307XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBCZWdpbiBtb2NraW5nXG4gICAqL1xuICBwdWJsaWMgYmVnaW4oKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBub2NrLmRpc2FibGVOZXRDb25uZWN0KCk7XG4gICAgaWYgKCFub2NrLmlzQWN0aXZlKCkpIHtcbiAgICAgIG5vY2suYWN0aXZhdGUoKTtcbiAgICB9XG4gICAgbm9jaygvLiovKVxuICAgICAgLnBlcnNpc3QoKVxuICAgICAgLnBvc3QoLy4qLylcbiAgICAgIC5yZXBseShmdW5jdGlvbiAodGhpcywgdXJpLCBib2R5LCBjYikge1xuICAgICAgICBjb25zdCBwYXJzZWRCb2R5ID0gdHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnID8gdXJsZGVjb2RlKGJvZHkpIDogYm9keTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gc2VsZi5oYW5kbGVSZXF1ZXN0KHtcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGhvc3Q6IHRoaXMucmVxLmhlYWRlcnMuaG9zdCxcbiAgICAgICAgICAgIHBhcnNlZEJvZHksXG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLnJlcS5oZWFkZXJzLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNiKG51bGwsIFsyMDAsIHhtbEpzLmpzMnhtbChyZXNwb25zZSwgeyBjb21wYWN0OiB0cnVlIH0pXSk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIGNiKG51bGwsIFtcbiAgICAgICAgICAgIDQwMCxcbiAgICAgICAgICAgIHhtbEpzLmpzMnhtbChcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIEVycm9yUmVzcG9uc2U6IHtcbiAgICAgICAgICAgICAgICAgIF9hdHRyaWJ1dGVzOiB7IHhtbG5zOiAnaHR0cHM6Ly9zdHMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMS0wNi0xNS8nIH0sXG4gICAgICAgICAgICAgICAgICBFcnJvcjoge1xuICAgICAgICAgICAgICAgICAgICBUeXBlOiAnU2VuZGVyJyxcbiAgICAgICAgICAgICAgICAgICAgQ29kZTogZS5uYW1lID8/ICdFcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2U6IGZvcm1hdEVycm9yTWVzc2FnZShlKSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBSZXF1ZXN0SWQ6ICcxJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7IGNvbXBhY3Q6IHRydWUgfSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgLy8gU2NydWIgc29tZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCBtaWdodCBiZSBzZXQgaWYgd2UncmUgcnVubmluZyBvbiBDb2RlQnVpbGQgd2hpY2ggd2lsbCBpbnRlcmZlcmUgd2l0aCB0aGUgdGVzdHMuXG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkFXU19QUk9GSUxFO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5BV1NfUkVHSU9OO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5BV1NfREVGQVVMVF9SRUdJT047XG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkFXU19BQ0NFU1NfS0VZX0lEO1xuICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5BV1NfU0VDUkVUX0FDQ0VTU19LRVk7XG4gICAgZGVsZXRlIHByb2Nlc3MuZW52LkFXU19TRVNTSU9OX1RPS0VOO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RvcmUgZXZlcnl0aGluZyB0byBub3JtYWxcbiAgICovXG4gIHB1YmxpYyByZXN0b3JlKCkge1xuICAgIG5vY2sucmVzdG9yZSgpOyAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9jay9ub2NrL2lzc3Vlcy8xODE3XG4gICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIG5vY2suZW5hYmxlTmV0Q29ubmVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgdXNlclxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVXNlcihhY2NvdW50OiBzdHJpbmcsIGFjY2Vzc0tleTogc3RyaW5nLCBvcHRpb25zOiBSZWdpc3RlclVzZXJPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB1c2VyTmFtZSA9IG9wdGlvbnMubmFtZSA/PyBgVXNlciR7T2JqZWN0LmtleXModGhpcy5pZGVudGl0aWVzKS5sZW5ndGggKyAxfWA7XG4gICAgY29uc3QgYXJuID0gYGFybjoke29wdGlvbnMucGFydGl0aW9uID8/ICdhd3MnfTpzdHM6OiR7YWNjb3VudH06dXNlci8ke3VzZXJOYW1lfWA7XG4gICAgY29uc3QgdXNlcklkID0gYCR7YWNjZXNzS2V5fToke3VzZXJOYW1lfWA7XG5cbiAgICB0aGlzLmlkZW50aXRpZXNbYWNjZXNzS2V5XSA9IHtcbiAgICAgIGFjY291bnQsXG4gICAgICBhcm4sXG4gICAgICB1c2VySWQsXG4gICAgfTtcblxuICAgIHRoaXMuc2V0U1RTTW9ja3MoYWNjb3VudCwgYXJuLCB1c2VyTmFtZSwgYWNjZXNzS2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhbiBhc3N1bWFibGUgcm9sZVxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyUm9sZShhY2NvdW50OiBzdHJpbmcsIHJvbGVBcm46IHN0cmluZywgb3B0aW9uczogUmVnaXN0ZXJSb2xlT3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3Qgcm9sZU5hbWUgPSBvcHRpb25zLm5hbWUgPz8gYFJvbGUke09iamVjdC5rZXlzKHRoaXMucm9sZXMpLmxlbmd0aCArIDF9YDtcblxuICAgIHRoaXMucm9sZXNbcm9sZUFybl0gPSB7XG4gICAgICBhbGxvd2VkQWNjb3VudHM6IG9wdGlvbnMuYWxsb3dlZEFjY291bnRzID8/IFthY2NvdW50XSxcbiAgICAgIGFybjogcm9sZUFybixcbiAgICAgIHJvbGVOYW1lLFxuICAgICAgYWNjb3VudCxcbiAgICB9O1xuXG4gICAgdGhpcy5zZXRTVFNNb2NrcyhhY2NvdW50LCByb2xlQXJuLCByb2xlQXJuKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U1RTTW9ja3MoYWNjb3VudDogc3RyaW5nLCByb2xlQXJuOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgYWNjZXNzS2V5Pzogc3RyaW5nKSB7XG4gICAgY29uc3QgYWNjZXNzS2V5SWQgPSBhY2Nlc3NLZXkgPz8gdXVpZC52NCgpO1xuICAgIG1vY2tTVFNDbGllbnRcbiAgICAgIC5vbihHZXRDYWxsZXJJZGVudGl0eUNvbW1hbmQpXG4gICAgICAucmVzb2x2ZXMoe1xuICAgICAgICBBY2NvdW50OiBhY2NvdW50LFxuICAgICAgICBBcm46IHJvbGVBcm4sXG4gICAgICAgIFVzZXJJZDogbmFtZSxcbiAgICAgIH0pXG4gICAgICAub24oQXNzdW1lUm9sZUNvbW1hbmQpXG4gICAgICAucmVzb2x2ZXMoe1xuICAgICAgICBBc3N1bWVkUm9sZVVzZXI6IHtcbiAgICAgICAgICBBcm46IHJvbGVBcm4sXG4gICAgICAgICAgQXNzdW1lZFJvbGVJZDogYCR7YWNjZXNzS2V5SWR9OiR7bmFtZX1gLFxuICAgICAgICB9LFxuICAgICAgICBDcmVkZW50aWFsczoge1xuICAgICAgICAgIEFjY2Vzc0tleUlkOiBhY2Nlc3NLZXlJZCxcbiAgICAgICAgICBTZWNyZXRBY2Nlc3NLZXk6ICdTZWNyZXQnLFxuICAgICAgICAgIFNlc3Npb25Ub2tlbjogJ1Rva2VuJyxcbiAgICAgICAgICBFeHBpcmF0aW9uOiBuZXcgRGF0ZShEYXRlLm5vdygpICsgMzYwMCAqIDEwMDApLFxuICAgICAgICB9LFxuICAgICAgICBQYWNrZWRQb2xpY3lTaXplOiA2LFxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlcXVlc3QobW9ja1JlcXVlc3Q6IE1vY2tSZXF1ZXN0KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSAoKCkgPT4ge1xuICAgICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLmlkZW50aXR5KG1vY2tSZXF1ZXN0KTtcblxuICAgICAgc3dpdGNoIChtb2NrUmVxdWVzdC5wYXJzZWRCb2R5LkFjdGlvbikge1xuICAgICAgICBjYXNlICdHZXRDYWxsZXJJZGVudGl0eUNvbW1hbmQnOlxuICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUdldENhbGxlcklkZW50aXR5KGlkZW50aXR5KTtcblxuICAgICAgICBjYXNlICdBc3N1bWVSb2xlQ29tbWFuZCc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlQXNzdW1lUm9sZShpZGVudGl0eSwgbW9ja1JlcXVlc3QpO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBBY3Rpb24gaW4gTW9ja0F3c0h0dHA6ICR7bW9ja1JlcXVlc3QucGFyc2VkQm9keS5BY3Rpb259YCk7XG4gICAgfSkoKTtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUdldENhbGxlcklkZW50aXR5KGlkZW50aXR5OiBSZWdpc3RlcmVkSWRlbnRpdHkpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4ge1xuICAgICAgR2V0Q2FsbGVySWRlbnRpdHlSZXNwb25zZToge1xuICAgICAgICBfYXR0cmlidXRlczogeyB4bWxuczogJ2h0dHBzOi8vc3RzLmFtYXpvbmF3cy5jb20vZG9jLzIwMTEtMDYtMTUvJyB9LFxuICAgICAgICBHZXRDYWxsZXJJZGVudGl0eVJlc3VsdDoge1xuICAgICAgICAgIEFybjogaWRlbnRpdHkuYXJuLFxuICAgICAgICAgIFVzZXJJZDogaWRlbnRpdHkudXNlcklkLFxuICAgICAgICAgIEFjY291bnQ6IGlkZW50aXR5LmFjY291bnQsXG4gICAgICAgIH0sXG4gICAgICAgIFJlc3BvbnNlTWV0YWRhdGE6IHtcbiAgICAgICAgICBSZXF1ZXN0SWQ6ICcxJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXBzIGhhdmUgYSBmdW5reSBlbmNvZGluZyB0byB0aGVtIHdoZW4gc2VudCB0byBTVFMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL1NUUy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Bc3N1bWVSb2xlLmh0bWxcbiAgICovXG4gIHByaXZhdGUgZGVjb2RlTWFwRnJvbVJlcXVlc3RCb2R5KHBhcmFtZXRlcjogc3RyaW5nLCBib2R5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogVGFnW10ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhib2R5KVxuICAgICAgLmZpbHRlcigoW2tleSwgX10pID0+IGtleS5zdGFydHNXaXRoKGAke3BhcmFtZXRlcn0ubWVtYmVyLmApICYmIGtleS5lbmRzV2l0aCgnLktleScpKVxuICAgICAgLm1hcCgoW2tleSwgdGFnS2V5XSkgPT4gKHtcbiAgICAgICAgS2V5OiB0YWdLZXksXG4gICAgICAgIFZhbHVlOiBib2R5W2Ake3BhcmFtZXRlcn0ubWVtYmVyLiR7a2V5LnNwbGl0KCcuJylbMl19LlZhbHVlYF0sXG4gICAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgaGF2ZSBhIGZ1bmt5IGVuY29kaW5nIHdoZW4gc2VudCB0byBTVFMuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL1NUUy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Bc3N1bWVSb2xlLmh0bWxcbiAgICovXG4gIHByaXZhdGUgZGVjb2RlTGlzdEtleXNGcm9tUmVxdWVzdEJvZHkocGFyYW1ldGVyOiBzdHJpbmcsIGJvZHk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGJvZHkpXG4gICAgICAuZmlsdGVyKChba2V5XSkgPT4ga2V5LnN0YXJ0c1dpdGgoYCR7cGFyYW1ldGVyfS5tZW1iZXIuYCkpXG4gICAgICAubWFwKChbLCB2YWx1ZV0pID0+IHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQXNzdW1lUm9sZShpZGVudGl0eTogUmVnaXN0ZXJlZElkZW50aXR5LCBtb2NrUmVxdWVzdDogTW9ja1JlcXVlc3QpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICB0aGlzLmNoZWNrRm9yRmFpbHVyZShtb2NrUmVxdWVzdC5wYXJzZWRCb2R5LlJvbGVBcm4pO1xuXG4gICAgdGhpcy5hc3N1bWVkUm9sZXMucHVzaCh7XG4gICAgICByb2xlQXJuOiBtb2NrUmVxdWVzdC5wYXJzZWRCb2R5LlJvbGVBcm4sXG4gICAgICByb2xlU2Vzc2lvbk5hbWU6IG1vY2tSZXF1ZXN0LnBhcnNlZEJvZHkuUm9sZVNlc3Npb25OYW1lLFxuICAgICAgc2VyaWFsTnVtYmVyOiBtb2NrUmVxdWVzdC5wYXJzZWRCb2R5LlNlcmlhbE51bWJlcixcbiAgICAgIHRva2VuQ29kZTogbW9ja1JlcXVlc3QucGFyc2VkQm9keS5Ub2tlbkNvZGUsXG4gICAgICB0YWdzOiB0aGlzLmRlY29kZU1hcEZyb21SZXF1ZXN0Qm9keSgnVGFncycsIG1vY2tSZXF1ZXN0LnBhcnNlZEJvZHkpLFxuICAgICAgdHJhbnNpdGl2ZVRhZ0tleXM6IHRoaXMuZGVjb2RlTGlzdEtleXNGcm9tUmVxdWVzdEJvZHkoJ1RyYW5zaXRpdmVUYWdLZXlzJywgbW9ja1JlcXVlc3QucGFyc2VkQm9keSksXG4gICAgfSk7XG5cbiAgICBjb25zdCByb2xlQXJuID0gbW9ja1JlcXVlc3QucGFyc2VkQm9keS5Sb2xlQXJuO1xuICAgIGNvbnN0IHRhcmdldFJvbGUgPSB0aGlzLnJvbGVzW3JvbGVBcm5dO1xuICAgIGlmICghdGFyZ2V0Um9sZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBzdWNoIHJvbGU6ICR7cm9sZUFybn1gKTtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldFJvbGUuYWxsb3dlZEFjY291bnRzLmluY2x1ZGVzKGlkZW50aXR5LmFjY291bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJZGVudGl0eSBmcm9tIGFjY291bnQ6ICR7aWRlbnRpdHkuYWNjb3VudH0gbm90IGFsbG93ZWQgdG8gYXNzdW1lICR7cm9sZUFybn0sIG11c3QgYmUgb25lIG9mOiAke3RhcmdldFJvbGUuYWxsb3dlZEFjY291bnRzfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGZyZXNoQWNjZXNzS2V5ID0gdXVpZC52NCgpO1xuXG4gICAgLy8gUmVnaXN0ZXIgYSBuZXcgXCJ1c2VyXCIgKGlkZW50aXR5KSBmb3IgdGhpcyBhY2Nlc3Mga2V5XG4gICAgdGhpcy5yZWdpc3RlclVzZXIodGFyZ2V0Um9sZS5hY2NvdW50LCBmcmVzaEFjY2Vzc0tleSwge1xuICAgICAgbmFtZTogYEFzc3VtZWRSb2xlLSR7dGFyZ2V0Um9sZS5yb2xlTmFtZX0tJHtpZGVudGl0eS51c2VySWR9YCxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBBc3N1bWVSb2xlUmVzcG9uc2U6IHtcbiAgICAgICAgX2F0dHJpYnV0ZXM6IHsgeG1sbnM6ICdodHRwczovL3N0cy5hbWF6b25hd3MuY29tL2RvYy8yMDExLTA2LTE1LycgfSxcbiAgICAgICAgQXNzdW1lUm9sZVJlc3VsdDoge1xuICAgICAgICAgIEFzc3VtZWRSb2xlVXNlcjoge1xuICAgICAgICAgICAgQXJuOiByb2xlQXJuLFxuICAgICAgICAgICAgQXNzdW1lZFJvbGVJZDogYCR7ZnJlc2hBY2Nlc3NLZXl9OiR7dGFyZ2V0Um9sZS5yb2xlTmFtZX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgQ3JlZGVudGlhbHM6IHtcbiAgICAgICAgICAgIEFjY2Vzc0tleUlkOiBmcmVzaEFjY2Vzc0tleSxcbiAgICAgICAgICAgIFNlY3JldEFjY2Vzc0tleTogJ1NlY3JldCcsXG4gICAgICAgICAgICBTZXNzaW9uVG9rZW46ICdUb2tlbicsXG4gICAgICAgICAgICBFeHBpcmF0aW9uOiBuZXcgRGF0ZShEYXRlLm5vdygpICsgMzYwMCAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBQYWNrZWRQb2xpY3lTaXplOiA2LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIFJlc3BvbnNlTWV0YWRhdGE6IHtcbiAgICAgICAgUmVxdWVzdElkOiAnMScsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGNoZWNrRm9yRmFpbHVyZShzOiBzdHJpbmcpIHtcbiAgICBjb25zdCBmYWlsdXJlUmVxdWVzdGVkID0gcy5tYXRjaCgvPEZBSUw6KFtePl0rKT4vKTtcbiAgICBpZiAoZmFpbHVyZVJlcXVlc3RlZCkge1xuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKGBTVFMgZmFpbGluZyBieSB1c2VyIHJlcXVlc3Q6ICR7ZmFpbHVyZVJlcXVlc3RlZFsxXX1gKTtcbiAgICAgIChlcnIgYXMgYW55KS5uYW1lID0gZmFpbHVyZVJlcXVlc3RlZFsxXTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlkZW50aXR5KG1vY2tSZXF1ZXN0OiBNb2NrUmVxdWVzdCkge1xuICAgIGNvbnN0IGtleUlkID0gdGhpcy5hY2Nlc3NLZXlJZChtb2NrUmVxdWVzdCk7XG4gICAgdGhpcy5jaGVja0ZvckZhaWx1cmUoa2V5SWQpO1xuXG4gICAgY29uc3QgcmV0ID0gdGhpcy5pZGVudGl0aWVzW2tleUlkXTtcbiAgICBpZiAoIXJldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgYWNjZXNzIGtleSB1c2VkOiAke2tleUlkfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgYWNjZXNzIGtleSBmcm9tIGEgc2lnbmVkIHJlcXVlc3RcbiAgICovXG4gIHByaXZhdGUgYWNjZXNzS2V5SWQobW9ja1JlcXVlc3Q6IE1vY2tSZXF1ZXN0KTogc3RyaW5nIHtcbiAgICAvLyBcIkFXUzQtSE1BQy1TSEEyNTYgQ3JlZGVudGlhbD0oYWIxYTVlNGMtZmY0MS00ODExLWFjNWYtNmQxMjMwZjdhYTkwKWFjY2Vzcy8yMDIwMTIxMC9ldS1ibGEtNS9zdHMvYXdzNF9yZXF1ZXN0LCBTaWduZWRIZWFkZXJzPWhvc3Q7eC1hbXotY29udGVudC1zaGEyNTY7eC1hbXotZGF0ZSwgU2lnbmF0dXJlPTliMzEwMTExNzNhNzg0MmZhMzcyZDRlZjdjNDMxYzA4ZjBiMTUxNGZkYWY1NDE0NTU2MGE0ZGI3ZWNkMjQ1MjlcIlxuICAgIGNvbnN0IGF1dGggPSBtb2NrUmVxdWVzdC5oZWFkZXJzLmF1dGhvcml6YXRpb247XG5cbiAgICBjb25zdCBtID0gYXV0aD8ubWF0Y2goL0NyZWRlbnRpYWw9KFteXFwvXSspLyk7XG4gICAgaWYgKCFtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGNvcnJlY3QgYXV0aG9yaXphdGlvbiBoZWFkZXI6ICR7YXV0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIG1bMV07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlclVzZXJPcHRpb25zIHtcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcGFydGl0aW9uPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdGVyUm9sZU9wdGlvbnMge1xuICByZWFkb25seSBhbGxvd2VkQWNjb3VudHM/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTVFNNb2Nrc09wdGlvbnMge1xuICByZWFkb25seSBhY2Nlc3NLZXk/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBNb2NrUmVxdWVzdCB7XG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgdXJpOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHJlYWRvbmx5IHBhcnNlZEJvZHk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHJlYWRvbmx5IHNlc3Npb25UYWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuZnVuY3Rpb24gdXJsZGVjb2RlKGJvZHk6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBwYXJ0cyA9IGJvZHkuc3BsaXQoJyYnKTtcbiAgY29uc3QgcmV0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgIGNvbnN0IFtrLCB2XSA9IHBhcnQuc3BsaXQoJz0nKTtcbiAgICByZXRbZGVjb2RlVVJJQ29tcG9uZW50KGspXSA9IGRlY29kZVVSSUNvbXBvbmVudCh2KTtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuIl19
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const logging_1 = require("../../../lib/logging");
|
|
4
|
+
describe('logging', () => {
|
|
5
|
+
let mockStdout;
|
|
6
|
+
let mockStderr;
|
|
7
|
+
const stripAnsi = (str) => {
|
|
8
|
+
const ansiRegex = /\u001b\[[0-9;]*[a-zA-Z]/g;
|
|
9
|
+
return str.replace(ansiRegex, '');
|
|
10
|
+
};
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
(0, logging_1.setIoMessageThreshold)('info');
|
|
13
|
+
(0, logging_1.setCI)(false);
|
|
14
|
+
mockStdout = jest.fn();
|
|
15
|
+
mockStderr = jest.fn();
|
|
16
|
+
jest.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
17
|
+
mockStdout(stripAnsi(chunk.toString()));
|
|
18
|
+
return true;
|
|
19
|
+
});
|
|
20
|
+
jest.spyOn(process.stderr, 'write').mockImplementation((chunk) => {
|
|
21
|
+
mockStderr(stripAnsi(chunk.toString()));
|
|
22
|
+
return true;
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
jest.restoreAllMocks();
|
|
27
|
+
});
|
|
28
|
+
describe('stream selection', () => {
|
|
29
|
+
test('data() always writes to stdout with both styles', () => {
|
|
30
|
+
// String style
|
|
31
|
+
(0, logging_1.data)('test message');
|
|
32
|
+
expect(mockStdout).toHaveBeenCalledWith('test message\n');
|
|
33
|
+
// Object style
|
|
34
|
+
(0, logging_1.data)({ message: 'test message 2' });
|
|
35
|
+
expect(mockStdout).toHaveBeenCalledWith('test message 2\n');
|
|
36
|
+
expect(mockStderr).not.toHaveBeenCalled();
|
|
37
|
+
});
|
|
38
|
+
test('error() always writes to stderr with both styles', () => {
|
|
39
|
+
// String style
|
|
40
|
+
(0, logging_1.error)('test error');
|
|
41
|
+
expect(mockStderr).toHaveBeenCalledWith('test error\n');
|
|
42
|
+
// Object style
|
|
43
|
+
(0, logging_1.error)({ message: 'test error 2' });
|
|
44
|
+
expect(mockStderr).toHaveBeenCalledWith('test error 2\n');
|
|
45
|
+
expect(mockStdout).not.toHaveBeenCalled();
|
|
46
|
+
});
|
|
47
|
+
test('info() writes to stderr by default with both styles', () => {
|
|
48
|
+
// String style
|
|
49
|
+
(0, logging_1.info)('test print');
|
|
50
|
+
expect(mockStderr).toHaveBeenCalledWith('test print\n');
|
|
51
|
+
// Object style
|
|
52
|
+
(0, logging_1.info)({ message: 'test print 2' });
|
|
53
|
+
expect(mockStderr).toHaveBeenCalledWith('test print 2\n');
|
|
54
|
+
expect(mockStdout).not.toHaveBeenCalled();
|
|
55
|
+
});
|
|
56
|
+
test('info() writes to stdout in CI mode with both styles', () => {
|
|
57
|
+
(0, logging_1.setCI)(true);
|
|
58
|
+
// String style
|
|
59
|
+
(0, logging_1.info)('test print');
|
|
60
|
+
expect(mockStdout).toHaveBeenCalledWith('test print\n');
|
|
61
|
+
// Object style
|
|
62
|
+
(0, logging_1.info)({ message: 'test print 2' });
|
|
63
|
+
expect(mockStdout).toHaveBeenCalledWith('test print 2\n');
|
|
64
|
+
expect(mockStderr).not.toHaveBeenCalled();
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('log levels', () => {
|
|
68
|
+
test('respects log level settings with both styles', () => {
|
|
69
|
+
(0, logging_1.setIoMessageThreshold)('error');
|
|
70
|
+
// String style
|
|
71
|
+
(0, logging_1.error)('error message');
|
|
72
|
+
(0, logging_1.warning)('warning message');
|
|
73
|
+
(0, logging_1.info)('print message');
|
|
74
|
+
// Object style
|
|
75
|
+
(0, logging_1.error)({ message: 'error message 2' });
|
|
76
|
+
(0, logging_1.warning)({ message: 'warning message 2' });
|
|
77
|
+
(0, logging_1.info)({ message: 'print message 2' });
|
|
78
|
+
expect(mockStderr).toHaveBeenCalledWith('error message\n');
|
|
79
|
+
expect(mockStderr).toHaveBeenCalledWith('error message 2\n');
|
|
80
|
+
expect(mockStderr).not.toHaveBeenCalledWith('warning message\n');
|
|
81
|
+
expect(mockStderr).not.toHaveBeenCalledWith('warning message 2\n');
|
|
82
|
+
expect(mockStderr).not.toHaveBeenCalledWith('print message\n');
|
|
83
|
+
expect(mockStderr).not.toHaveBeenCalledWith('print message 2\n');
|
|
84
|
+
});
|
|
85
|
+
test('debug messages only show at debug level with both styles', () => {
|
|
86
|
+
(0, logging_1.setIoMessageThreshold)('info');
|
|
87
|
+
(0, logging_1.debug)('debug message');
|
|
88
|
+
(0, logging_1.debug)({ message: 'debug message 2' });
|
|
89
|
+
expect(mockStderr).not.toHaveBeenCalled();
|
|
90
|
+
(0, logging_1.setIoMessageThreshold)('debug');
|
|
91
|
+
(0, logging_1.debug)('debug message');
|
|
92
|
+
(0, logging_1.debug)({ message: 'debug message 2' });
|
|
93
|
+
expect(mockStderr).toHaveBeenCalledWith(expect.stringMatching(/^\[\d{2}:\d{2}:\d{2}\] debug message\n$/));
|
|
94
|
+
expect(mockStderr).toHaveBeenCalledWith(expect.stringMatching(/^\[\d{2}:\d{2}:\d{2}\] debug message 2\n$/));
|
|
95
|
+
});
|
|
96
|
+
test('trace messages only show at trace level with both styles', () => {
|
|
97
|
+
(0, logging_1.setIoMessageThreshold)('debug');
|
|
98
|
+
(0, logging_1.trace)('trace message');
|
|
99
|
+
(0, logging_1.trace)({ message: 'trace message 2' });
|
|
100
|
+
expect(mockStderr).not.toHaveBeenCalled();
|
|
101
|
+
(0, logging_1.setIoMessageThreshold)('trace');
|
|
102
|
+
(0, logging_1.trace)('trace message');
|
|
103
|
+
(0, logging_1.trace)({ message: 'trace message 2' });
|
|
104
|
+
expect(mockStderr).toHaveBeenCalledWith(expect.stringMatching(/^\[\d{2}:\d{2}:\d{2}\] trace message\n$/));
|
|
105
|
+
expect(mockStderr).toHaveBeenCalledWith(expect.stringMatching(/^\[\d{2}:\d{2}:\d{2}\] trace message 2\n$/));
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
describe('formatted messages', () => {
|
|
109
|
+
test('handles format strings correctly with both styles', () => {
|
|
110
|
+
// String style
|
|
111
|
+
(0, logging_1.info)('Hello %s, you have %d messages', 'User', 5);
|
|
112
|
+
expect(mockStderr).toHaveBeenCalledWith('Hello User, you have 5 messages\n');
|
|
113
|
+
// Object style
|
|
114
|
+
(0, logging_1.info)({ message: 'Hello %s, you have %d messages' }, 'User', 5);
|
|
115
|
+
expect(mockStderr).toHaveBeenCalledWith('Hello User, you have 5 messages\n');
|
|
116
|
+
});
|
|
117
|
+
test('handles objects in format strings with both styles', () => {
|
|
118
|
+
const obj = { name: 'test' };
|
|
119
|
+
// String style
|
|
120
|
+
(0, logging_1.info)('Object: %j', obj);
|
|
121
|
+
expect(mockStderr).toHaveBeenCalledWith('Object: {"name":"test"}\n');
|
|
122
|
+
// Object style
|
|
123
|
+
(0, logging_1.info)({ message: 'Object: %j' }, obj);
|
|
124
|
+
expect(mockStderr).toHaveBeenCalledWith('Object: {"name":"test"}\n');
|
|
125
|
+
});
|
|
126
|
+
test('handles multiple style changes in single call', () => {
|
|
127
|
+
const obj = { id: 123 };
|
|
128
|
+
(0, logging_1.success)('Processing %s: %j at %d%%', 'task', obj, 50);
|
|
129
|
+
expect(mockStderr).toHaveBeenCalledWith('Processing task: {"id":123} at 50%\n');
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
describe('styled output', () => {
|
|
133
|
+
test('success() adds green color to output with both styles', () => {
|
|
134
|
+
// String style
|
|
135
|
+
(0, logging_1.success)('operation completed');
|
|
136
|
+
expect(mockStderr).toHaveBeenCalledWith('operation completed\n');
|
|
137
|
+
// Object style
|
|
138
|
+
(0, logging_1.success)({ message: 'operation completed 2' });
|
|
139
|
+
expect(mockStderr).toHaveBeenCalledWith('operation completed 2\n');
|
|
140
|
+
});
|
|
141
|
+
test('highlight() adds bold formatting to output with both styles', () => {
|
|
142
|
+
// String style
|
|
143
|
+
(0, logging_1.highlight)('important message');
|
|
144
|
+
expect(mockStderr).toHaveBeenCalledWith('important message\n');
|
|
145
|
+
// Object style
|
|
146
|
+
(0, logging_1.highlight)({ message: 'important message 2' });
|
|
147
|
+
expect(mockStderr).toHaveBeenCalledWith('important message 2\n');
|
|
148
|
+
});
|
|
149
|
+
test('success handles format strings with styling', () => {
|
|
150
|
+
(0, logging_1.success)('completed task %d of %d', 1, 3);
|
|
151
|
+
expect(mockStderr).toHaveBeenCalledWith('completed task 1 of 3\n');
|
|
152
|
+
// Remove the code from the test since it's an implementation detail
|
|
153
|
+
(0, logging_1.success)({ message: 'completed task %d of %d' }, 2, 3);
|
|
154
|
+
expect(mockStderr).toHaveBeenCalledWith('completed task 2 of 3\n');
|
|
155
|
+
});
|
|
156
|
+
test('highlight handles complex objects with styling', () => {
|
|
157
|
+
const complexObj = { status: 'active', count: 42 };
|
|
158
|
+
(0, logging_1.highlight)('Status: %j', complexObj);
|
|
159
|
+
expect(mockStderr).toHaveBeenCalledWith('Status: {"status":"active","count":42}\n');
|
|
160
|
+
// Remove the code from the test since it's an implementation detail
|
|
161
|
+
(0, logging_1.highlight)({ message: 'Status: %j' }, complexObj);
|
|
162
|
+
expect(mockStderr).toHaveBeenCalledWith('Status: {"status":"active","count":42}\n');
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
describe('edge cases', () => {
|
|
166
|
+
test('handles null and undefined arguments with both styles', () => {
|
|
167
|
+
// String style
|
|
168
|
+
(0, logging_1.info)('Values: %s, %s', null, undefined);
|
|
169
|
+
expect(mockStderr).toHaveBeenCalledWith('Values: null, undefined\n');
|
|
170
|
+
// Object style
|
|
171
|
+
(0, logging_1.info)({ message: 'Values: %s, %s' }, null, undefined);
|
|
172
|
+
expect(mockStderr).toHaveBeenCalledWith('Values: null, undefined\n');
|
|
173
|
+
});
|
|
174
|
+
test('handles circular references in objects with both styles', () => {
|
|
175
|
+
const obj = { name: 'test' };
|
|
176
|
+
obj.self = obj;
|
|
177
|
+
// String style
|
|
178
|
+
(0, logging_1.info)('Object: %j', obj);
|
|
179
|
+
expect(mockStderr).toHaveBeenCalledWith(expect.stringContaining('[Circular'));
|
|
180
|
+
// Object style
|
|
181
|
+
(0, logging_1.info)({ message: 'Object: %j' }, obj);
|
|
182
|
+
expect(mockStderr).toHaveBeenCalledWith(expect.stringContaining('[Circular'));
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe('message codes', () => {
|
|
186
|
+
test('validates message codes correctly', () => {
|
|
187
|
+
// Valid codes
|
|
188
|
+
expect(() => (0, logging_1.error)({ message: 'test', code: 'CDK_TOOLKIT_E0001' })).not.toThrow();
|
|
189
|
+
expect(() => (0, logging_1.warning)({ message: 'test', code: 'CDK_ASSETS_W4999' })).not.toThrow();
|
|
190
|
+
expect(() => (0, logging_1.info)({ message: 'test', code: 'CDK_SDK_I0000' })).not.toThrow();
|
|
191
|
+
});
|
|
192
|
+
test('uses default codes when none provided', () => {
|
|
193
|
+
(0, logging_1.error)('test error');
|
|
194
|
+
expect(mockStderr).toHaveBeenCalledWith(expect.stringContaining('test error'));
|
|
195
|
+
// Would need to modify the code to expose the actual message code for verification
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
describe('corked logging', () => {
|
|
199
|
+
test('buffers messages when corked', async () => {
|
|
200
|
+
await (0, logging_1.withCorkedLogging)(async () => {
|
|
201
|
+
(0, logging_1.info)('message 1');
|
|
202
|
+
(0, logging_1.info)({ message: 'message 2' });
|
|
203
|
+
expect(mockStderr).not.toHaveBeenCalled();
|
|
204
|
+
});
|
|
205
|
+
expect(mockStderr).toHaveBeenCalledWith('message 1\n');
|
|
206
|
+
expect(mockStderr).toHaveBeenCalledWith('message 2\n');
|
|
207
|
+
});
|
|
208
|
+
test('handles nested corking correctly', async () => {
|
|
209
|
+
await (0, logging_1.withCorkedLogging)(async () => {
|
|
210
|
+
(0, logging_1.info)('outer 1');
|
|
211
|
+
await (0, logging_1.withCorkedLogging)(async () => {
|
|
212
|
+
(0, logging_1.info)({ message: 'inner' });
|
|
213
|
+
});
|
|
214
|
+
(0, logging_1.info)({ message: 'outer 2' });
|
|
215
|
+
expect(mockStderr).not.toHaveBeenCalled();
|
|
216
|
+
});
|
|
217
|
+
expect(mockStderr).toHaveBeenCalledTimes(3);
|
|
218
|
+
expect(mockStderr).toHaveBeenCalledWith('outer 1\n');
|
|
219
|
+
expect(mockStderr).toHaveBeenCalledWith('inner\n');
|
|
220
|
+
expect(mockStderr).toHaveBeenCalledWith('outer 2\n');
|
|
221
|
+
});
|
|
222
|
+
test('handles errors in corked block while preserving buffer', async () => {
|
|
223
|
+
await expect((0, logging_1.withCorkedLogging)(async () => {
|
|
224
|
+
(0, logging_1.info)('message 1');
|
|
225
|
+
throw new Error('test error');
|
|
226
|
+
})).rejects.toThrow('test error');
|
|
227
|
+
// The buffered message should still be printed even if the block throws
|
|
228
|
+
expect(mockStderr).toHaveBeenCalledWith('message 1\n');
|
|
229
|
+
});
|
|
230
|
+
test('maintains correct order with mixed log levels in corked block', async () => {
|
|
231
|
+
// Set threshold to debug to allow debug messages
|
|
232
|
+
(0, logging_1.setIoMessageThreshold)('debug');
|
|
233
|
+
await (0, logging_1.withCorkedLogging)(async () => {
|
|
234
|
+
(0, logging_1.error)('error message');
|
|
235
|
+
(0, logging_1.warning)('warning message');
|
|
236
|
+
(0, logging_1.success)('success message');
|
|
237
|
+
(0, logging_1.debug)('debug message');
|
|
238
|
+
});
|
|
239
|
+
const calls = mockStderr.mock.calls.map(call => call[0]);
|
|
240
|
+
expect(calls).toEqual([
|
|
241
|
+
'error message\n',
|
|
242
|
+
'warning message\n',
|
|
243
|
+
'success message\n',
|
|
244
|
+
expect.stringMatching(/^\[\d{2}:\d{2}:\d{2}\] debug message\n$/),
|
|
245
|
+
]);
|
|
246
|
+
// Reset threshold back to info for other tests
|
|
247
|
+
(0, logging_1.setIoMessageThreshold)('info');
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
describe('CI mode behavior', () => {
|
|
251
|
+
test('correctly switches between stdout and stderr based on CI mode', () => {
|
|
252
|
+
(0, logging_1.setCI)(true);
|
|
253
|
+
(0, logging_1.warning)('warning in CI');
|
|
254
|
+
(0, logging_1.success)('success in CI');
|
|
255
|
+
(0, logging_1.error)('error in CI');
|
|
256
|
+
expect(mockStdout).toHaveBeenCalledWith('warning in CI\n');
|
|
257
|
+
expect(mockStdout).toHaveBeenCalledWith('success in CI\n');
|
|
258
|
+
expect(mockStderr).toHaveBeenCalledWith('error in CI\n');
|
|
259
|
+
(0, logging_1.setCI)(false);
|
|
260
|
+
(0, logging_1.warning)('warning not in CI');
|
|
261
|
+
(0, logging_1.success)('success not in CI');
|
|
262
|
+
(0, logging_1.error)('error not in CI');
|
|
263
|
+
expect(mockStderr).toHaveBeenCalledWith('warning not in CI\n');
|
|
264
|
+
expect(mockStderr).toHaveBeenCalledWith('success not in CI\n');
|
|
265
|
+
expect(mockStderr).toHaveBeenCalledWith('error not in CI\n');
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibG9nZ2luZy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsa0RBQXFKO0FBRXJKLFFBQVEsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBQ3ZCLElBQUksVUFBcUIsQ0FBQztJQUMxQixJQUFJLFVBQXFCLENBQUM7SUFFMUIsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFXLEVBQVUsRUFBRTtRQUN4QyxNQUFNLFNBQVMsR0FBRywwQkFBMEIsQ0FBQztRQUM3QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BDLENBQUMsQ0FBQztJQUVGLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxJQUFBLCtCQUFxQixFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLElBQUEsZUFBSyxFQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsVUFBVSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN2QixVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBRXZCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ3BFLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDcEUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sSUFBSSxDQUFDO1FBQ2Qs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LGVBQUssRUFBQyxLQUFLLENBQUMsQ0FBQztZQUNiLElBQUEsaUJBQU8sRUFBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzdCLElBQUEsaUJBQU8sRUFBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzdCLElBQUEsZUFBSyxFQUFDLGlCQUFpQixDQUFDLENBQUM7WUFFekIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDL0QsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDL0QsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc2V0SW9NZXNzYWdlVGhyZXNob2xkLCBzZXRDSSwgZGF0YSwgc3VjY2VzcywgaGlnaGxpZ2h0LCBlcnJvciwgd2FybmluZywgaW5mbywgZGVidWcsIHRyYWNlLCB3aXRoQ29ya2VkTG9nZ2luZyB9IGZyb20gJy4uLy4uLy4uL2xpYi9sb2dnaW5nJztcblxuZGVzY3JpYmUoJ2xvZ2dpbmcnLCAoKSA9PiB7XG4gIGxldCBtb2NrU3Rkb3V0OiBqZXN0Lk1vY2s7XG4gIGxldCBtb2NrU3RkZXJyOiBqZXN0Lk1vY2s7XG5cbiAgY29uc3Qgc3RyaXBBbnNpID0gKHN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBhbnNpUmVnZXggPSAvXFx1MDAxYlxcW1swLTk7XSpbYS16QS1aXS9nO1xuICAgIHJldHVybiBzdHIucmVwbGFjZShhbnNpUmVnZXgsICcnKTtcbiAgfTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBzZXRJb01lc3NhZ2VUaHJlc2hvbGQoJ2luZm8nKTtcbiAgICBzZXRDSShmYWxzZSk7XG5cbiAgICBtb2NrU3Rkb3V0ID0gamVzdC5mbigpO1xuICAgIG1vY2tTdGRlcnIgPSBqZXN0LmZuKCk7XG5cbiAgICBqZXN0LnNweU9uKHByb2Nlc3Muc3Rkb3V0LCAnd3JpdGUnKS5tb2NrSW1wbGVtZW50YXRpb24oKGNodW5rOiBhbnkpID0+IHtcbiAgICAgIG1vY2tTdGRvdXQoc3RyaXBBbnNpKGNodW5rLnRvU3RyaW5nKCkpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgamVzdC5zcHlPbihwcm9jZXNzLnN0ZGVyciwgJ3dyaXRlJykubW9ja0ltcGxlbWVudGF0aW9uKChjaHVuazogYW55KSA9PiB7XG4gICAgICBtb2NrU3RkZXJyKHN0cmlwQW5zaShjaHVuay50b1N0cmluZygpKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBqZXN0LnJlc3RvcmVBbGxNb2NrcygpO1xuICB9KTtcblxuICBkZXNjcmliZSgnc3RyZWFtIHNlbGVjdGlvbicsICgpID0+IHtcbiAgICB0ZXN0KCdkYXRhKCkgYWx3YXlzIHdyaXRlcyB0byBzdGRvdXQgd2l0aCBib3RoIHN0eWxlcycsICgpID0+IHtcbiAgICAgIC8vIFN0cmluZyBzdHlsZVxuICAgICAgZGF0YSgndGVzdCBtZXNzYWdlJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZG91dCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3Rlc3QgbWVzc2FnZVxcbicpO1xuXG4gICAgICAvLyBPYmplY3Qgc3R5bGVcbiAgICAgIGRhdGEoeyBtZXNzYWdlOiAndGVzdCBtZXNzYWdlIDInIH0pO1xuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCd0ZXN0IG1lc3NhZ2UgMlxcbicpO1xuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdlcnJvcigpIGFsd2F5cyB3cml0ZXMgdG8gc3RkZXJyIHdpdGggYm90aCBzdHlsZXMnLCAoKSA9PiB7XG4gICAgICAvLyBTdHJpbmcgc3R5bGVcbiAgICAgIGVycm9yKCd0ZXN0IGVycm9yJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3Rlc3QgZXJyb3JcXG4nKTtcblxuICAgICAgLy8gT2JqZWN0IHN0eWxlXG4gICAgICBlcnJvcih7IG1lc3NhZ2U6ICd0ZXN0IGVycm9yIDInIH0pO1xuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCd0ZXN0IGVycm9yIDJcXG4nKTtcbiAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnaW5mbygpIHdyaXRlcyB0byBzdGRlcnIgYnkgZGVmYXVsdCB3aXRoIGJvdGggc3R5bGVzJywgKCkgPT4ge1xuICAgICAgLy8gU3RyaW5nIHN0eWxlXG4gICAgICBpbmZvKCd0ZXN0IHByaW50Jyk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3Rlc3QgcHJpbnRcXG4nKTtcblxuICAgICAgLy8gT2JqZWN0IHN0eWxlXG4gICAgICBpbmZvKHsgbWVzc2FnZTogJ3Rlc3QgcHJpbnQgMicgfSk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3Rlc3QgcHJpbnQgMlxcbicpO1xuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdpbmZvKCkgd3JpdGVzIHRvIHN0ZG91dCBpbiBDSSBtb2RlIHdpdGggYm90aCBzdHlsZXMnLCAoKSA9PiB7XG4gICAgICBzZXRDSSh0cnVlKTtcbiAgICAgIC8vIFN0cmluZyBzdHlsZVxuICAgICAgaW5mbygndGVzdCBwcmludCcpO1xuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCd0ZXN0IHByaW50XFxuJyk7XG5cbiAgICAgIC8vIE9iamVjdCBzdHlsZVxuICAgICAgaW5mbyh7IG1lc3NhZ2U6ICd0ZXN0IHByaW50IDInIH0pO1xuICAgICAgZXhwZWN0KG1vY2tTdGRvdXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCd0ZXN0IHByaW50IDJcXG4nKTtcbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbG9nIGxldmVscycsICgpID0+IHtcbiAgICB0ZXN0KCdyZXNwZWN0cyBsb2cgbGV2ZWwgc2V0dGluZ3Mgd2l0aCBib3RoIHN0eWxlcycsICgpID0+IHtcbiAgICAgIHNldElvTWVzc2FnZVRocmVzaG9sZCgnZXJyb3InKTtcblxuICAgICAgLy8gU3RyaW5nIHN0eWxlXG4gICAgICBlcnJvcignZXJyb3IgbWVzc2FnZScpO1xuICAgICAgd2FybmluZygnd2FybmluZyBtZXNzYWdlJyk7XG4gICAgICBpbmZvKCdwcmludCBtZXNzYWdlJyk7XG5cbiAgICAgIC8vIE9iamVjdCBzdHlsZVxuICAgICAgZXJyb3IoeyBtZXNzYWdlOiAnZXJyb3IgbWVzc2FnZSAyJyB9KTtcbiAgICAgIHdhcm5pbmcoeyBtZXNzYWdlOiAnd2FybmluZyBtZXNzYWdlIDInIH0pO1xuICAgICAgaW5mbyh7IG1lc3NhZ2U6ICdwcmludCBtZXNzYWdlIDInIH0pO1xuXG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2Vycm9yIG1lc3NhZ2VcXG4nKTtcbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnZXJyb3IgbWVzc2FnZSAyXFxuJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikubm90LnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCd3YXJuaW5nIG1lc3NhZ2VcXG4nKTtcbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS5ub3QudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3dhcm5pbmcgbWVzc2FnZSAyXFxuJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikubm90LnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdwcmludCBtZXNzYWdlXFxuJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikubm90LnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdwcmludCBtZXNzYWdlIDJcXG4nKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2RlYnVnIG1lc3NhZ2VzIG9ubHkgc2hvdyBhdCBkZWJ1ZyBsZXZlbCB3aXRoIGJvdGggc3R5bGVzJywgKCkgPT4ge1xuICAgICAgc2V0SW9NZXNzYWdlVGhyZXNob2xkKCdpbmZvJyk7XG4gICAgICBkZWJ1ZygnZGVidWcgbWVzc2FnZScpO1xuICAgICAgZGVidWcoeyBtZXNzYWdlOiAnZGVidWcgbWVzc2FnZSAyJyB9KTtcbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuXG4gICAgICBzZXRJb01lc3NhZ2VUaHJlc2hvbGQoJ2RlYnVnJyk7XG4gICAgICBkZWJ1ZygnZGVidWcgbWVzc2FnZScpO1xuICAgICAgZGVidWcoeyBtZXNzYWdlOiAnZGVidWcgbWVzc2FnZSAyJyB9KTtcbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0LnN0cmluZ01hdGNoaW5nKC9eXFxbXFxkezJ9OlxcZHsyfTpcXGR7Mn1cXF0gZGVidWcgbWVzc2FnZVxcbiQvKSxcbiAgICAgICk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIGV4cGVjdC5zdHJpbmdNYXRjaGluZygvXlxcW1xcZHsyfTpcXGR7Mn06XFxkezJ9XFxdIGRlYnVnIG1lc3NhZ2UgMlxcbiQvKSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd0cmFjZSBtZXNzYWdlcyBvbmx5IHNob3cgYXQgdHJhY2UgbGV2ZWwgd2l0aCBib3RoIHN0eWxlcycsICgpID0+IHtcbiAgICAgIHNldElvTWVzc2FnZVRocmVzaG9sZCgnZGVidWcnKTtcbiAgICAgIHRyYWNlKCd0cmFjZSBtZXNzYWdlJyk7XG4gICAgICB0cmFjZSh7IG1lc3NhZ2U6ICd0cmFjZSBtZXNzYWdlIDInIH0pO1xuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG5cbiAgICAgIHNldElvTWVzc2FnZVRocmVzaG9sZCgndHJhY2UnKTtcbiAgICAgIHRyYWNlKCd0cmFjZSBtZXNzYWdlJyk7XG4gICAgICB0cmFjZSh7IG1lc3NhZ2U6ICd0cmFjZSBtZXNzYWdlIDInIH0pO1xuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Quc3RyaW5nTWF0Y2hpbmcoL15cXFtcXGR7Mn06XFxkezJ9OlxcZHsyfVxcXSB0cmFjZSBtZXNzYWdlXFxuJC8pLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0LnN0cmluZ01hdGNoaW5nKC9eXFxbXFxkezJ9OlxcZHsyfTpcXGR7Mn1cXF0gdHJhY2UgbWVzc2FnZSAyXFxuJC8pLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Zvcm1hdHRlZCBtZXNzYWdlcycsICgpID0+IHtcbiAgICB0ZXN0KCdoYW5kbGVzIGZvcm1hdCBzdHJpbmdzIGNvcnJlY3RseSB3aXRoIGJvdGggc3R5bGVzJywgKCkgPT4ge1xuICAgICAgLy8gU3RyaW5nIHN0eWxlXG4gICAgICBpbmZvKCdIZWxsbyAlcywgeW91IGhhdmUgJWQgbWVzc2FnZXMnLCAnVXNlcicsIDUpO1xuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdIZWxsbyBVc2VyLCB5b3UgaGF2ZSA1IG1lc3NhZ2VzXFxuJyk7XG5cbiAgICAgIC8vIE9iamVjdCBzdHlsZVxuICAgICAgaW5mbyh7IG1lc3NhZ2U6ICdIZWxsbyAlcywgeW91IGhhdmUgJWQgbWVzc2FnZXMnIH0sICdVc2VyJywgNSk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ0hlbGxvIFVzZXIsIHlvdSBoYXZlIDUgbWVzc2FnZXNcXG4nKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2hhbmRsZXMgb2JqZWN0cyBpbiBmb3JtYXQgc3RyaW5ncyB3aXRoIGJvdGggc3R5bGVzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2JqID0geyBuYW1lOiAndGVzdCcgfTtcbiAgICAgIC8vIFN0cmluZyBzdHlsZVxuICAgICAgaW5mbygnT2JqZWN0OiAlaicsIG9iaik7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ09iamVjdDoge1wibmFtZVwiOlwidGVzdFwifVxcbicpO1xuXG4gICAgICAvLyBPYmplY3Qgc3R5bGVcbiAgICAgIGluZm8oeyBtZXNzYWdlOiAnT2JqZWN0OiAlaicgfSwgb2JqKTtcbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnT2JqZWN0OiB7XCJuYW1lXCI6XCJ0ZXN0XCJ9XFxuJyk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdoYW5kbGVzIG11bHRpcGxlIHN0eWxlIGNoYW5nZXMgaW4gc2luZ2xlIGNhbGwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvYmogPSB7IGlkOiAxMjMgfTtcbiAgICAgIHN1Y2Nlc3MoJ1Byb2Nlc3NpbmcgJXM6ICVqIGF0ICVkJSUnLCAndGFzaycsIG9iaiwgNTApO1xuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICAnUHJvY2Vzc2luZyB0YXNrOiB7XCJpZFwiOjEyM30gYXQgNTAlXFxuJyxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdHlsZWQgb3V0cHV0JywgKCkgPT4ge1xuICAgIHRlc3QoJ3N1Y2Nlc3MoKSBhZGRzIGdyZWVuIGNvbG9yIHRvIG91dHB1dCB3aXRoIGJvdGggc3R5bGVzJywgKCkgPT4ge1xuICAgICAgLy8gU3RyaW5nIHN0eWxlXG4gICAgICBzdWNjZXNzKCdvcGVyYXRpb24gY29tcGxldGVkJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ29wZXJhdGlvbiBjb21wbGV0ZWRcXG4nKTtcblxuICAgICAgLy8gT2JqZWN0IHN0eWxlXG4gICAgICBzdWNjZXNzKHsgbWVzc2FnZTogJ29wZXJhdGlvbiBjb21wbGV0ZWQgMicgfSk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ29wZXJhdGlvbiBjb21wbGV0ZWQgMlxcbicpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnaGlnaGxpZ2h0KCkgYWRkcyBib2xkIGZvcm1hdHRpbmcgdG8gb3V0cHV0IHdpdGggYm90aCBzdHlsZXMnLCAoKSA9PiB7XG4gICAgICAvLyBTdHJpbmcgc3R5bGVcbiAgICAgIGhpZ2hsaWdodCgnaW1wb3J0YW50IG1lc3NhZ2UnKTtcbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnaW1wb3J0YW50IG1lc3NhZ2VcXG4nKTtcblxuICAgICAgLy8gT2JqZWN0IHN0eWxlXG4gICAgICBoaWdobGlnaHQoeyBtZXNzYWdlOiAnaW1wb3J0YW50IG1lc3NhZ2UgMicgfSk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2ltcG9ydGFudCBtZXNzYWdlIDJcXG4nKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3N1Y2Nlc3MgaGFuZGxlcyBmb3JtYXQgc3RyaW5ncyB3aXRoIHN0eWxpbmcnLCAoKSA9PiB7XG4gICAgICBzdWNjZXNzKCdjb21wbGV0ZWQgdGFzayAlZCBvZiAlZCcsIDEsIDMpO1xuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdjb21wbGV0ZWQgdGFzayAxIG9mIDNcXG4nKTtcblxuICAgICAgLy8gUmVtb3ZlIHRoZSBjb2RlIGZyb20gdGhlIHRlc3Qgc2luY2UgaXQncyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxcbiAgICAgIHN1Y2Nlc3MoeyBtZXNzYWdlOiAnY29tcGxldGVkIHRhc2sgJWQgb2YgJWQnIH0sIDIsIDMpO1xuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdjb21wbGV0ZWQgdGFzayAyIG9mIDNcXG4nKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2hpZ2hsaWdodCBoYW5kbGVzIGNvbXBsZXggb2JqZWN0cyB3aXRoIHN0eWxpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21wbGV4T2JqID0geyBzdGF0dXM6ICdhY3RpdmUnLCBjb3VudDogNDIgfTtcbiAgICAgIGhpZ2hsaWdodCgnU3RhdHVzOiAlaicsIGNvbXBsZXhPYmopO1xuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdTdGF0dXM6IHtcInN0YXR1c1wiOlwiYWN0aXZlXCIsXCJjb3VudFwiOjQyfVxcbicpO1xuXG4gICAgICAvLyBSZW1vdmUgdGhlIGNvZGUgZnJvbSB0aGUgdGVzdCBzaW5jZSBpdCdzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbFxuICAgICAgaGlnaGxpZ2h0KHsgbWVzc2FnZTogJ1N0YXR1czogJWonIH0sIGNvbXBsZXhPYmopO1xuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdTdGF0dXM6IHtcInN0YXR1c1wiOlwiYWN0aXZlXCIsXCJjb3VudFwiOjQyfVxcbicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZWRnZSBjYXNlcycsICgpID0+IHtcbiAgICB0ZXN0KCdoYW5kbGVzIG51bGwgYW5kIHVuZGVmaW5lZCBhcmd1bWVudHMgd2l0aCBib3RoIHN0eWxlcycsICgpID0+IHtcbiAgICAgIC8vIFN0cmluZyBzdHlsZVxuICAgICAgaW5mbygnVmFsdWVzOiAlcywgJXMnLCBudWxsLCB1bmRlZmluZWQpO1xuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdWYWx1ZXM6IG51bGwsIHVuZGVmaW5lZFxcbicpO1xuXG4gICAgICAvLyBPYmplY3Qgc3R5bGVcbiAgICAgIGluZm8oeyBtZXNzYWdlOiAnVmFsdWVzOiAlcywgJXMnIH0sIG51bGwsIHVuZGVmaW5lZCk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ1ZhbHVlczogbnVsbCwgdW5kZWZpbmVkXFxuJyk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdoYW5kbGVzIGNpcmN1bGFyIHJlZmVyZW5jZXMgaW4gb2JqZWN0cyB3aXRoIGJvdGggc3R5bGVzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb2JqOiBhbnkgPSB7IG5hbWU6ICd0ZXN0JyB9O1xuICAgICAgb2JqLnNlbGYgPSBvYmo7XG5cbiAgICAgIC8vIFN0cmluZyBzdHlsZVxuICAgICAgaW5mbygnT2JqZWN0OiAlaicsIG9iaik7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ1tDaXJjdWxhcicpKTtcblxuICAgICAgLy8gT2JqZWN0IHN0eWxlXG4gICAgICBpbmZvKHsgbWVzc2FnZTogJ09iamVjdDogJWonIH0sIG9iaik7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ1tDaXJjdWxhcicpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ21lc3NhZ2UgY29kZXMnLCAoKSA9PiB7XG4gICAgdGVzdCgndmFsaWRhdGVzIG1lc3NhZ2UgY29kZXMgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgLy8gVmFsaWQgY29kZXNcbiAgICAgIGV4cGVjdCgoKSA9PiBlcnJvcih7IG1lc3NhZ2U6ICd0ZXN0JywgY29kZTogJ0NES19UT09MS0lUX0UwMDAxJyB9KSkubm90LnRvVGhyb3coKTtcbiAgICAgIGV4cGVjdCgoKSA9PiB3YXJuaW5nKHsgbWVzc2FnZTogJ3Rlc3QnLCBjb2RlOiAnQ0RLX0FTU0VUU19XNDk5OScgfSkpLm5vdC50b1Rocm93KCk7XG4gICAgICBleHBlY3QoKCkgPT4gaW5mbyh7IG1lc3NhZ2U6ICd0ZXN0JywgY29kZTogJ0NES19TREtfSTAwMDAnIH0pKS5ub3QudG9UaHJvdygpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgndXNlcyBkZWZhdWx0IGNvZGVzIHdoZW4gbm9uZSBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGVycm9yKCd0ZXN0IGVycm9yJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ3Rlc3QgZXJyb3InKSk7XG4gICAgICAvLyBXb3VsZCBuZWVkIHRvIG1vZGlmeSB0aGUgY29kZSB0byBleHBvc2UgdGhlIGFjdHVhbCBtZXNzYWdlIGNvZGUgZm9yIHZlcmlmaWNhdGlvblxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnY29ya2VkIGxvZ2dpbmcnLCAoKSA9PiB7XG4gICAgdGVzdCgnYnVmZmVycyBtZXNzYWdlcyB3aGVuIGNvcmtlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHdpdGhDb3JrZWRMb2dnaW5nKGFzeW5jICgpID0+IHtcbiAgICAgICAgaW5mbygnbWVzc2FnZSAxJyk7XG4gICAgICAgIGluZm8oeyBtZXNzYWdlOiAnbWVzc2FnZSAyJyB9KTtcbiAgICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdtZXNzYWdlIDFcXG4nKTtcbiAgICAgIGV4cGVjdChtb2NrU3RkZXJyKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnbWVzc2FnZSAyXFxuJyk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdoYW5kbGVzIG5lc3RlZCBjb3JraW5nIGNvcnJlY3RseScsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHdpdGhDb3JrZWRMb2dnaW5nKGFzeW5jICgpID0+IHtcbiAgICAgICAgaW5mbygnb3V0ZXIgMScpO1xuICAgICAgICBhd2FpdCB3aXRoQ29ya2VkTG9nZ2luZyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaW5mbyh7IG1lc3NhZ2U6ICdpbm5lcicgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpbmZvKHsgbWVzc2FnZTogJ291dGVyIDInIH0pO1xuICAgICAgICBleHBlY3QobW9ja1N0ZGVycikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDMpO1xuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdvdXRlciAxXFxuJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2lubmVyXFxuJyk7XG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ291dGVyIDJcXG4nKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2hhbmRsZXMgZXJyb3JzIGluIGNvcmtlZCBibG9jayB3aGlsZSBwcmVzZXJ2aW5nIGJ1ZmZlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGV4cGVjdCh3aXRoQ29ya2VkTG9nZ2luZyhhc3luYyAoKSA9PiB7XG4gICAgICAgIGluZm8oJ21lc3NhZ2UgMScpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Rlc3QgZXJyb3InKTtcbiAgICAgIH0pKS5yZWplY3RzLnRvVGhyb3coJ3Rlc3QgZXJyb3InKTtcblxuICAgICAgLy8gVGhlIGJ1ZmZlcmVkIG1lc3NhZ2Ugc2hvdWxkIHN0aWxsIGJlIHByaW50ZWQgZXZlbiBpZiB0aGUgYmxvY2sgdGhyb3dzXG4gICAgICBleHBlY3QobW9ja1N0ZGVycikudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ21lc3NhZ2UgMVxcbicpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnbWFpbnRhaW5zIGNvcnJlY3Qgb3JkZXIgd2l0aCBtaXhlZCBsb2cgbGV2ZWxzIGluIGNvcmtlZCBibG9jaycsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFNldCB0aHJlc2hvbGQgdG8gZGVidWcgdG8gYWxsb3cgZGVidWcgbWVzc2FnZXNcbiAgICAgIHNldElvTWVzc2FnZVRocmVzaG9sZCgnZGVidWcnKTtcblxuICAgICAgYXdhaXQgd2l0aENvcmtlZExvZ2dpbmcoYXN5bmMgKCkgPT4ge1xuICAgICAgICBlcnJvcignZXJyb3IgbWVzc2FnZScpO1xuICAgICAgICB3YXJuaW5nKCd3YXJuaW5nIG1lc3NhZ2UnKTtcbiAgICAgICAgc3VjY2Vzcygnc3VjY2VzcyBtZXNzYWdlJyk7XG4gICAgICAgIGRlYnVnKCdkZWJ1ZyBtZXNzYWdlJyk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY2FsbHMgPSBtb2NrU3RkZXJyLm1vY2suY2FsbHMubWFwKGNhbGwgPT4gY2FsbFswXSk7XG4gICAgICBleHBlY3QoY2FsbHMpLnRvRXF1YWwoW1xuICAgICAgICAnZXJyb3IgbWVzc2FnZVxcbicsXG4gICAgICAgICd3YXJuaW5nIG1lc3NhZ2VcXG4nLFxuICAgICAgICAnc3VjY2VzcyBtZXNzYWdlXFxuJyxcbiAgICAgICAgZXhwZWN0LnN0cmluZ01hdGNoaW5nKC9eXFxbXFxkezJ9OlxcZHsyfTpcXGR7Mn1cXF0gZGVidWcgbWVzc2FnZVxcbiQvKSxcbiAgICAgIF0pO1xuXG4gICAgICAvLyBSZXNldCB0aHJlc2hvbGQgYmFjayB0byBpbmZvIGZvciBvdGhlciB0ZXN0c1xuICAgICAgc2V0SW9NZXNzYWdlVGhyZXNob2xkKCdpbmZvJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDSSBtb2RlIGJlaGF2aW9yJywgKCkgPT4ge1xuICAgIHRlc3QoJ2NvcnJlY3RseSBzd2l0Y2hlcyBiZXR3ZWVuIHN0ZG91dCBhbmQgc3RkZXJyIGJhc2VkIG9uIENJIG1vZGUnLCAoKSA9PiB7XG4gICAgICBzZXRDSSh0cnVlKTtcbiAgICAgIHdhcm5pbmcoJ3dhcm5pbmcgaW4gQ0knKTtcbiAgICAgIHN1Y2Nlc3MoJ3N1Y2Nlc3MgaW4gQ0knKTtcbiAgICAgIGVycm9yKCdlcnJvciBpbiBDSScpO1xuXG4gICAgICBleHBlY3QobW9ja1N0ZG91dCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3dhcm5pbmcgaW4gQ0lcXG4nKTtcbiAgICAgIGV4cGVjdChtb2NrU3Rkb3V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnc3VjY2VzcyBpbiBDSVxcbicpO1xuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdlcnJvciBpbiBDSVxcbicpO1xuXG4gICAgICBzZXRDSShmYWxzZSk7XG4gICAgICB3YXJuaW5nKCd3YXJuaW5nIG5vdCBpbiBDSScpO1xuICAgICAgc3VjY2Vzcygnc3VjY2VzcyBub3QgaW4gQ0knKTtcbiAgICAgIGVycm9yKCdlcnJvciBub3QgaW4gQ0knKTtcblxuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCd3YXJuaW5nIG5vdCBpbiBDSVxcbicpO1xuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdzdWNjZXNzIG5vdCBpbiBDSVxcbicpO1xuICAgICAgZXhwZWN0KG1vY2tTdGRlcnIpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdlcnJvciBub3QgaW4gQ0lcXG4nKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|