@aws-cdk/toolkit-lib 1.28.0 → 1.29.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.
@@ -1,4 +1,3 @@
1
- export * from './archive';
2
1
  export * from './arrays';
3
2
  export * from './bool';
4
3
  export * from './bytes';
package/lib/util/index.js CHANGED
@@ -14,7 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./archive"), exports);
18
17
  __exportStar(require("./arrays"), exports);
19
18
  __exportStar(require("./bool"), exports);
20
19
  __exportStar(require("./bytes"), exports);
@@ -35,4 +34,4 @@ __exportStar(require("./type-brands"), exports);
35
34
  __exportStar(require("./types"), exports);
36
35
  __exportStar(require("./version-range"), exports);
37
36
  __exportStar(require("./yaml-cfn"), exports);
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNENBQTBCO0FBQzFCLDJDQUF5QjtBQUN6Qix5Q0FBdUI7QUFDdkIsMENBQXdCO0FBQ3hCLG1EQUFpQztBQUNqQyxpREFBK0I7QUFDL0IsZ0RBQThCO0FBQzlCLGlEQUErQjtBQUMvQixpREFBK0I7QUFDL0IsbURBQWlDO0FBQ2pDLHlDQUF1QjtBQUN2Qix3Q0FBc0I7QUFDdEIsNENBQTBCO0FBQzFCLDZDQUEyQjtBQUMzQixpREFBK0I7QUFDL0IsOENBQTRCO0FBQzVCLHdEQUFzQztBQUN0QyxnREFBOEI7QUFDOUIsMENBQXdCO0FBQ3hCLGtEQUFnQztBQUNoQyw2Q0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FyY2hpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9hcnJheXMnO1xuZXhwb3J0ICogZnJvbSAnLi9ib29sJztcbmV4cG9ydCAqIGZyb20gJy4vYnl0ZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9jbG91ZGZvcm1hdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRlbnQtaGFzaCc7XG5leHBvcnQgKiBmcm9tICcuL2RpcmVjdG9yaWVzJztcbmV4cG9ydCAqIGZyb20gJy4vZm9ybWF0LWVycm9yJztcbmV4cG9ydCAqIGZyb20gJy4vZ2xvYi1tYXRjaGVyJztcbmV4cG9ydCAqIGZyb20gJy4vZ3Vlc3MtbGFuZ3VhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9qc29uJztcbmV4cG9ydCAqIGZyb20gJy4vbmV0JztcbmV4cG9ydCAqIGZyb20gJy4vb2JqZWN0cyc7XG5leHBvcnQgKiBmcm9tICcuL3BhcmFsbGVsJztcbmV4cG9ydCAqIGZyb20gJy4vcGFja2FnZS1pbmZvJztcbmV4cG9ydCAqIGZyb20gJy4vc2VyaWFsaXplJztcbmV4cG9ydCAqIGZyb20gJy4vc3RyaW5nLW1hbmlwdWxhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3R5cGUtYnJhbmRzJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uLXJhbmdlJztcbmV4cG9ydCAqIGZyb20gJy4veWFtbC1jZm4nO1xuIl19
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXlCO0FBQ3pCLHlDQUF1QjtBQUN2QiwwQ0FBd0I7QUFDeEIsbURBQWlDO0FBQ2pDLGlEQUErQjtBQUMvQixnREFBOEI7QUFDOUIsaURBQStCO0FBQy9CLGlEQUErQjtBQUMvQixtREFBaUM7QUFDakMseUNBQXVCO0FBQ3ZCLHdDQUFzQjtBQUN0Qiw0Q0FBMEI7QUFDMUIsNkNBQTJCO0FBQzNCLGlEQUErQjtBQUMvQiw4Q0FBNEI7QUFDNUIsd0RBQXNDO0FBQ3RDLGdEQUE4QjtBQUM5QiwwQ0FBd0I7QUFDeEIsa0RBQWdDO0FBQ2hDLDZDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYXJyYXlzJztcbmV4cG9ydCAqIGZyb20gJy4vYm9vbCc7XG5leHBvcnQgKiBmcm9tICcuL2J5dGVzJztcbmV4cG9ydCAqIGZyb20gJy4vY2xvdWRmb3JtYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9jb250ZW50LWhhc2gnO1xuZXhwb3J0ICogZnJvbSAnLi9kaXJlY3Rvcmllcyc7XG5leHBvcnQgKiBmcm9tICcuL2Zvcm1hdC1lcnJvcic7XG5leHBvcnQgKiBmcm9tICcuL2dsb2ItbWF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL2d1ZXNzLWxhbmd1YWdlJztcbmV4cG9ydCAqIGZyb20gJy4vanNvbic7XG5leHBvcnQgKiBmcm9tICcuL25ldCc7XG5leHBvcnQgKiBmcm9tICcuL29iamVjdHMnO1xuZXhwb3J0ICogZnJvbSAnLi9wYXJhbGxlbCc7XG5leHBvcnQgKiBmcm9tICcuL3BhY2thZ2UtaW5mbyc7XG5leHBvcnQgKiBmcm9tICcuL3NlcmlhbGl6ZSc7XG5leHBvcnQgKiBmcm9tICcuL3N0cmluZy1tYW5pcHVsYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlLWJyYW5kcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbi1yYW5nZSc7XG5leHBvcnQgKiBmcm9tICcuL3lhbWwtY2ZuJztcbiJdfQ==
package/package.json CHANGED
@@ -35,14 +35,15 @@
35
35
  "organization": true
36
36
  },
37
37
  "devDependencies": {
38
- "@aws-cdk/aws-service-spec": "^0.1.184",
38
+ "@aws-cdk/aws-service-spec": "^0.1.185",
39
39
  "@aws-cdk/cli-plugin-contract": "2.182.2",
40
- "@cdklabs/eslint-plugin": "^2.0.7",
40
+ "@aws-cdk/private-tools": "0.0.0",
41
+ "@cdklabs/eslint-plugin": "^2.0.9",
41
42
  "@jest/environment": "^29.7.0",
42
43
  "@jest/globals": "^29.7.0",
43
44
  "@jest/types": "^29.6.3",
44
- "@microsoft/api-extractor": "^7.58.7",
45
- "@smithy/util-stream": "^4.6.5",
45
+ "@microsoft/api-extractor": "^7.58.8",
46
+ "@smithy/util-stream": "^4.6.6",
46
47
  "@stylistic/eslint-plugin": "^3",
47
48
  "@types/fs-extra": "^11",
48
49
  "@types/jest": "^29.5.14",
@@ -52,14 +53,15 @@
52
53
  "@types/split2": "^4.2.3",
53
54
  "@typescript-eslint/eslint-plugin": "^8",
54
55
  "@typescript-eslint/parser": "^8",
55
- "aws-cdk-lib": "2.257.0",
56
+ "aws-cdk-lib": "2.258.1",
56
57
  "aws-sdk-client-mock": "^4.1.0",
57
58
  "aws-sdk-client-mock-jest": "^4.1.0",
58
59
  "commit-and-tag-version": "^12",
59
60
  "constructs": "^10.0.0",
61
+ "esbuild": "^0.28.1",
60
62
  "eslint": "^9",
61
63
  "eslint-config-prettier": "^10.1.8",
62
- "eslint-import-resolver-typescript": "^4.4.4",
64
+ "eslint-import-resolver-typescript": "^4.4.5",
63
65
  "eslint-plugin-import": "^2.32.0",
64
66
  "eslint-plugin-jest": "^29.15.2",
65
67
  "eslint-plugin-jsdoc": "^62.9.0",
@@ -73,7 +75,7 @@
73
75
  "nock": "13",
74
76
  "nx": "^22.7.5",
75
77
  "prettier": "^2.8",
76
- "projen": "^0.99.70",
78
+ "projen": "^0.99.73",
77
79
  "ts-jest": "^29.4.11",
78
80
  "tsx": "^4.22.4",
79
81
  "typescript": "5.9"
@@ -84,7 +86,7 @@
84
86
  "dependencies": {
85
87
  "@aws-cdk/cdk-assets-lib": "^1",
86
88
  "@aws-cdk/cloud-assembly-api": "2.2.5",
87
- "@aws-cdk/cloud-assembly-schema": ">=54.2.0",
89
+ "@aws-cdk/cloud-assembly-schema": ">=54.3.0",
88
90
  "@aws-cdk/cloudformation-diff": "^2",
89
91
  "@aws-cdk/cx-api": "^2",
90
92
  "@aws-sdk/client-appsync": "^3",
@@ -115,7 +117,7 @@
115
117
  "@smithy/util-retry": "^4",
116
118
  "@smithy/util-waiter": "^4",
117
119
  "archiver": "^7.0.1",
118
- "cdk-from-cfn": "^0.302.0",
120
+ "cdk-from-cfn": "^0.304.0",
119
121
  "chalk": "^4",
120
122
  "chokidar": "^4",
121
123
  "fast-deep-equal": "^3.1.3",
@@ -123,7 +125,7 @@
123
125
  "fs-extra": "^11",
124
126
  "p-limit": "^3",
125
127
  "picomatch": "^4",
126
- "semver": "^7.8.1",
128
+ "semver": "^7.8.4",
127
129
  "split2": "^4.2.0",
128
130
  "wrap-ansi": "^7",
129
131
  "yaml": "^1"
@@ -148,7 +150,7 @@
148
150
  "publishConfig": {
149
151
  "access": "public"
150
152
  },
151
- "version": "1.28.0",
153
+ "version": "1.29.0",
152
154
  "packageManager": "yarn@4.13.0",
153
155
  "types": "lib/index.d.ts",
154
156
  "exports": {
@@ -1,2 +0,0 @@
1
- export declare function zipDirectory(directory: string, outputFile: string): Promise<void>;
2
- //# sourceMappingURL=archive.d.ts.map
@@ -1,86 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.zipDirectory = zipDirectory;
4
- const console_1 = require("console");
5
- const fs_1 = require("fs");
6
- const path = require("path");
7
- const fast_glob_1 = require("fast-glob");
8
- const format_error_1 = require("./format-error");
9
- // eslint-disable-next-line @typescript-eslint/no-require-imports
10
- const archiver = require('archiver');
11
- // Adapted from cdk-assets
12
- async function zipDirectory(directory, outputFile) {
13
- // We write to a temporary file and rename at the last moment. This is so that if we are
14
- // interrupted during this process, we don't leave a half-finished file in the target location.
15
- const temporaryOutputFile = `${outputFile}.${randomString()}._tmp`;
16
- await writeZipFile(directory, temporaryOutputFile);
17
- await moveIntoPlace(temporaryOutputFile, outputFile);
18
- }
19
- function writeZipFile(directory, outputFile) {
20
- return new Promise(async (ok, fail) => {
21
- // The below options are needed to support following symlinks when building zip files:
22
- // - onlyFiles: This will prevent symlinks themselves from being copied into the zip.
23
- // - followSymbolicLinks: This will follow symlinks and copy the files within.
24
- const globOptions = {
25
- dot: true,
26
- onlyFiles: true,
27
- followSymbolicLinks: true,
28
- cwd: directory,
29
- };
30
- const files = (0, fast_glob_1.globSync)('**', globOptions); // The output here is already sorted
31
- const output = (0, fs_1.createWriteStream)(outputFile);
32
- const archive = archiver('zip');
33
- archive.on('warning', fail);
34
- archive.on('error', fail);
35
- // archive has been finalized and the output file descriptor has closed, resolve promise
36
- // this has to be done before calling `finalize` since the events may fire immediately after.
37
- // see https://www.npmjs.com/package/archiver
38
- output.once('close', ok);
39
- archive.pipe(output);
40
- // Append files serially to ensure file order
41
- for (const file of files) {
42
- const fullPath = path.resolve(directory, file);
43
- // Exactly 2 promises
44
- // eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism
45
- const [data, stat] = await Promise.all([fs_1.promises.readFile(fullPath), fs_1.promises.stat(fullPath)]);
46
- archive.append(data, {
47
- name: file,
48
- mode: stat.mode,
49
- });
50
- }
51
- await archive.finalize();
52
- });
53
- }
54
- /**
55
- * Rename the file to the target location, taking into account:
56
- *
57
- * - That we may see EPERM on Windows while an Antivirus scanner still has the
58
- * file open, so retry a couple of times.
59
- * - This same function may be called in parallel and be interrupted at any point.
60
- */
61
- async function moveIntoPlace(source, target) {
62
- let delay = 100;
63
- let attempts = 5;
64
- while (true) {
65
- try {
66
- // 'rename' is guaranteed to overwrite an existing target, as long as it is a file (not a directory)
67
- await fs_1.promises.rename(source, target);
68
- return;
69
- }
70
- catch (e) {
71
- if (e.code !== 'EPERM' || attempts-- <= 0) {
72
- throw e;
73
- }
74
- (0, console_1.error)((0, format_error_1.formatErrorMessage)(e));
75
- await sleep(Math.floor(Math.random() * delay));
76
- delay *= 2;
77
- }
78
- }
79
- }
80
- function sleep(ms) {
81
- return new Promise(ok => setTimeout(ok, ms));
82
- }
83
- function randomString() {
84
- return Math.random().toString(36).replace(/[^a-z0-9]+/g, '');
85
- }
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFyY2hpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFXQSxvQ0FNQztBQWpCRCxxQ0FBZ0M7QUFDaEMsMkJBQXVEO0FBQ3ZELDZCQUE2QjtBQUU3Qix5Q0FBcUM7QUFDckMsaURBQW9EO0FBRXBELGlFQUFpRTtBQUNqRSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7QUFFckMsMEJBQTBCO0FBQ25CLEtBQUssVUFBVSxZQUFZLENBQUMsU0FBaUIsRUFBRSxVQUFrQjtJQUN0RSx3RkFBd0Y7SUFDeEYsK0ZBQStGO0lBQy9GLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxVQUFVLElBQUksWUFBWSxFQUFFLE9BQU8sQ0FBQztJQUNuRSxNQUFNLFlBQVksQ0FBQyxTQUFTLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNuRCxNQUFNLGFBQWEsQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsU0FBaUIsRUFBRSxVQUFrQjtJQUN6RCxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDcEMsc0ZBQXNGO1FBQ3RGLHFGQUFxRjtRQUNyRiw4RUFBOEU7UUFDOUUsTUFBTSxXQUFXLEdBQVk7WUFDM0IsR0FBRyxFQUFFLElBQUk7WUFDVCxTQUFTLEVBQUUsSUFBSTtZQUNmLG1CQUFtQixFQUFFLElBQUk7WUFDekIsR0FBRyxFQUFFLFNBQVM7U0FDZixDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQUcsSUFBQSxvQkFBUSxFQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLG9DQUFvQztRQUUvRSxNQUFNLE1BQU0sR0FBRyxJQUFBLHNCQUFpQixFQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTdDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QixPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUUxQix3RkFBd0Y7UUFDeEYsNkZBQTZGO1FBQzdGLDZDQUE2QztRQUM3QyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUV6QixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXJCLDZDQUE2QztRQUM3QyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9DLHFCQUFxQjtZQUNyQix3RUFBd0U7WUFDeEUsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGFBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25GLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO2dCQUNuQixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7YUFDaEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE1BQU0sT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILEtBQUssVUFBVSxhQUFhLENBQUMsTUFBYyxFQUFFLE1BQWM7SUFDekQsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDO0lBQ2hCLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNqQixPQUFPLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDO1lBQ0gsb0dBQW9HO1lBQ3BHLE1BQU0sYUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDaEMsT0FBTztRQUNULENBQUM7UUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzFDLE1BQU0sQ0FBQyxDQUFDO1lBQ1YsQ0FBQztZQUNELElBQUEsZUFBSyxFQUFDLElBQUEsaUNBQWtCLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQy9DLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDYixDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLEtBQUssQ0FBQyxFQUFVO0lBQ3ZCLE9BQU8sSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVELFNBQVMsWUFBWTtJQUNuQixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXJyb3IgfSBmcm9tICdjb25zb2xlJztcbmltcG9ydCB7IGNyZWF0ZVdyaXRlU3RyZWFtLCBwcm9taXNlcyBhcyBmcyB9IGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgZ2xvYlN5bmMgfSBmcm9tICdmYXN0LWdsb2InO1xuaW1wb3J0IHsgZm9ybWF0RXJyb3JNZXNzYWdlIH0gZnJvbSAnLi9mb3JtYXQtZXJyb3InO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3QgYXJjaGl2ZXIgPSByZXF1aXJlKCdhcmNoaXZlcicpO1xuXG4vLyBBZGFwdGVkIGZyb20gY2RrLWFzc2V0c1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHppcERpcmVjdG9yeShkaXJlY3Rvcnk6IHN0cmluZywgb3V0cHV0RmlsZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFdlIHdyaXRlIHRvIGEgdGVtcG9yYXJ5IGZpbGUgYW5kIHJlbmFtZSBhdCB0aGUgbGFzdCBtb21lbnQuIFRoaXMgaXMgc28gdGhhdCBpZiB3ZSBhcmVcbiAgLy8gaW50ZXJydXB0ZWQgZHVyaW5nIHRoaXMgcHJvY2Vzcywgd2UgZG9uJ3QgbGVhdmUgYSBoYWxmLWZpbmlzaGVkIGZpbGUgaW4gdGhlIHRhcmdldCBsb2NhdGlvbi5cbiAgY29uc3QgdGVtcG9yYXJ5T3V0cHV0RmlsZSA9IGAke291dHB1dEZpbGV9LiR7cmFuZG9tU3RyaW5nKCl9Ll90bXBgO1xuICBhd2FpdCB3cml0ZVppcEZpbGUoZGlyZWN0b3J5LCB0ZW1wb3JhcnlPdXRwdXRGaWxlKTtcbiAgYXdhaXQgbW92ZUludG9QbGFjZSh0ZW1wb3JhcnlPdXRwdXRGaWxlLCBvdXRwdXRGaWxlKTtcbn1cblxuZnVuY3Rpb24gd3JpdGVaaXBGaWxlKGRpcmVjdG9yeTogc3RyaW5nLCBvdXRwdXRGaWxlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChvaywgZmFpbCkgPT4ge1xuICAgIC8vIFRoZSBiZWxvdyBvcHRpb25zIGFyZSBuZWVkZWQgdG8gc3VwcG9ydCBmb2xsb3dpbmcgc3ltbGlua3Mgd2hlbiBidWlsZGluZyB6aXAgZmlsZXM6XG4gICAgLy8gLSBvbmx5RmlsZXM6IFRoaXMgd2lsbCBwcmV2ZW50IHN5bWxpbmtzIHRoZW1zZWx2ZXMgZnJvbSBiZWluZyBjb3BpZWQgaW50byB0aGUgemlwLlxuICAgIC8vIC0gZm9sbG93U3ltYm9saWNMaW5rczogVGhpcyB3aWxsIGZvbGxvdyBzeW1saW5rcyBhbmQgY29weSB0aGUgZmlsZXMgd2l0aGluLlxuICAgIGNvbnN0IGdsb2JPcHRpb25zOiBPcHRpb25zID0ge1xuICAgICAgZG90OiB0cnVlLFxuICAgICAgb25seUZpbGVzOiB0cnVlLFxuICAgICAgZm9sbG93U3ltYm9saWNMaW5rczogdHJ1ZSxcbiAgICAgIGN3ZDogZGlyZWN0b3J5LFxuICAgIH07XG4gICAgY29uc3QgZmlsZXMgPSBnbG9iU3luYygnKionLCBnbG9iT3B0aW9ucyk7IC8vIFRoZSBvdXRwdXQgaGVyZSBpcyBhbHJlYWR5IHNvcnRlZFxuXG4gICAgY29uc3Qgb3V0cHV0ID0gY3JlYXRlV3JpdGVTdHJlYW0ob3V0cHV0RmlsZSk7XG5cbiAgICBjb25zdCBhcmNoaXZlID0gYXJjaGl2ZXIoJ3ppcCcpO1xuICAgIGFyY2hpdmUub24oJ3dhcm5pbmcnLCBmYWlsKTtcbiAgICBhcmNoaXZlLm9uKCdlcnJvcicsIGZhaWwpO1xuXG4gICAgLy8gYXJjaGl2ZSBoYXMgYmVlbiBmaW5hbGl6ZWQgYW5kIHRoZSBvdXRwdXQgZmlsZSBkZXNjcmlwdG9yIGhhcyBjbG9zZWQsIHJlc29sdmUgcHJvbWlzZVxuICAgIC8vIHRoaXMgaGFzIHRvIGJlIGRvbmUgYmVmb3JlIGNhbGxpbmcgYGZpbmFsaXplYCBzaW5jZSB0aGUgZXZlbnRzIG1heSBmaXJlIGltbWVkaWF0ZWx5IGFmdGVyLlxuICAgIC8vIHNlZSBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9hcmNoaXZlclxuICAgIG91dHB1dC5vbmNlKCdjbG9zZScsIG9rKTtcblxuICAgIGFyY2hpdmUucGlwZShvdXRwdXQpO1xuXG4gICAgLy8gQXBwZW5kIGZpbGVzIHNlcmlhbGx5IHRvIGVuc3VyZSBmaWxlIG9yZGVyXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZShkaXJlY3RvcnksIGZpbGUpO1xuICAgICAgLy8gRXhhY3RseSAyIHByb21pc2VzXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGNka2xhYnMvcHJvbWlzZWFsbC1uby11bmJvdW5kZWQtcGFyYWxsZWxpc21cbiAgICAgIGNvbnN0IFtkYXRhLCBzdGF0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtmcy5yZWFkRmlsZShmdWxsUGF0aCksIGZzLnN0YXQoZnVsbFBhdGgpXSk7XG4gICAgICBhcmNoaXZlLmFwcGVuZChkYXRhLCB7XG4gICAgICAgIG5hbWU6IGZpbGUsXG4gICAgICAgIG1vZGU6IHN0YXQubW9kZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IGFyY2hpdmUuZmluYWxpemUoKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVuYW1lIHRoZSBmaWxlIHRvIHRoZSB0YXJnZXQgbG9jYXRpb24sIHRha2luZyBpbnRvIGFjY291bnQ6XG4gKlxuICogLSBUaGF0IHdlIG1heSBzZWUgRVBFUk0gb24gV2luZG93cyB3aGlsZSBhbiBBbnRpdmlydXMgc2Nhbm5lciBzdGlsbCBoYXMgdGhlXG4gKiAgIGZpbGUgb3Blbiwgc28gcmV0cnkgYSBjb3VwbGUgb2YgdGltZXMuXG4gKiAtIFRoaXMgc2FtZSBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGluIHBhcmFsbGVsIGFuZCBiZSBpbnRlcnJ1cHRlZCBhdCBhbnkgcG9pbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG1vdmVJbnRvUGxhY2Uoc291cmNlOiBzdHJpbmcsIHRhcmdldDogc3RyaW5nKSB7XG4gIGxldCBkZWxheSA9IDEwMDtcbiAgbGV0IGF0dGVtcHRzID0gNTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICB0cnkge1xuICAgICAgLy8gJ3JlbmFtZScgaXMgZ3VhcmFudGVlZCB0byBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgdGFyZ2V0LCBhcyBsb25nIGFzIGl0IGlzIGEgZmlsZSAobm90IGEgZGlyZWN0b3J5KVxuICAgICAgYXdhaXQgZnMucmVuYW1lKHNvdXJjZSwgdGFyZ2V0KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGlmIChlLmNvZGUgIT09ICdFUEVSTScgfHwgYXR0ZW1wdHMtLSA8PSAwKSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBlcnJvcihmb3JtYXRFcnJvck1lc3NhZ2UoZSkpO1xuICAgICAgYXdhaXQgc2xlZXAoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogZGVsYXkpKTtcbiAgICAgIGRlbGF5ICo9IDI7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKG9rID0+IHNldFRpbWVvdXQob2ssIG1zKSk7XG59XG5cbmZ1bmN0aW9uIHJhbmRvbVN0cmluZygpIHtcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnJlcGxhY2UoL1teYS16MC05XSsvZywgJycpO1xufVxuIl19