cdk-assets 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +2 -0
- package/README.md +195 -0
- package/bin/cdk-assets +2 -0
- package/bin/cdk-assets.d.ts +1 -0
- package/bin/cdk-assets.js +70 -0
- package/bin/docker-credential-cdk-assets +2 -0
- package/bin/docker-credential-cdk-assets.d.ts +13 -0
- package/bin/docker-credential-cdk-assets.js +39 -0
- package/bin/list.d.ts +3 -0
- package/bin/list.js +10 -0
- package/bin/logging.d.ts +4 -0
- package/bin/logging.js +28 -0
- package/bin/publish.d.ts +5 -0
- package/bin/publish.js +49 -0
- package/lib/asset-manifest.d.ts +162 -0
- package/lib/asset-manifest.js +245 -0
- package/lib/aws-types.d.ts +1660 -0
- package/lib/aws-types.js +138 -0
- package/lib/aws.d.ts +70 -0
- package/lib/aws.js +125 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +21 -0
- package/lib/private/archive.d.ts +3 -0
- package/lib/private/archive.js +87 -0
- package/lib/private/asset-handler.d.ts +54 -0
- package/lib/private/asset-handler.js +3 -0
- package/lib/private/docker-credentials.d.ts +35 -0
- package/lib/private/docker-credentials.js +89 -0
- package/lib/private/docker.d.ts +98 -0
- package/lib/private/docker.js +232 -0
- package/lib/private/fs-extra.d.ts +3 -0
- package/lib/private/fs-extra.js +37 -0
- package/lib/private/handlers/client-options.d.ts +3 -0
- package/lib/private/handlers/client-options.js +12 -0
- package/lib/private/handlers/container-images.d.ts +22 -0
- package/lib/private/handlers/container-images.js +224 -0
- package/lib/private/handlers/files.d.ts +14 -0
- package/lib/private/handlers/files.js +288 -0
- package/lib/private/handlers/index.d.ts +3 -0
- package/lib/private/handlers/index.js +16 -0
- package/lib/private/p-limit.d.ts +10 -0
- package/lib/private/p-limit.js +51 -0
- package/lib/private/placeholders.d.ts +10 -0
- package/lib/private/placeholders.js +34 -0
- package/lib/private/shell.d.ts +24 -0
- package/lib/private/shell.js +131 -0
- package/lib/private/util.d.ts +5 -0
- package/lib/private/util.js +16 -0
- package/lib/progress.d.ts +114 -0
- package/lib/progress.js +104 -0
- package/lib/publishing.d.ts +118 -0
- package/lib/publishing.js +193 -0
- package/package.json +103 -0
- package/scripts/manual-test-manifest.json +12 -0
- package/scripts/manual-test.sh +22 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DockerFactory = exports.Docker = void 0;
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
const os = require("os");
|
|
6
|
+
const path = require("path");
|
|
7
|
+
const docker_credentials_1 = require("./docker-credentials");
|
|
8
|
+
const shell_1 = require("./shell");
|
|
9
|
+
const util_1 = require("./util");
|
|
10
|
+
const progress_1 = require("../progress");
|
|
11
|
+
var InspectImageErrorCode;
|
|
12
|
+
(function (InspectImageErrorCode) {
|
|
13
|
+
InspectImageErrorCode[InspectImageErrorCode["Docker"] = 1] = "Docker";
|
|
14
|
+
InspectImageErrorCode[InspectImageErrorCode["Podman"] = 125] = "Podman";
|
|
15
|
+
})(InspectImageErrorCode || (InspectImageErrorCode = {}));
|
|
16
|
+
class Docker {
|
|
17
|
+
constructor(eventEmitter, subprocessOutputDestination) {
|
|
18
|
+
this.eventEmitter = eventEmitter;
|
|
19
|
+
this.subprocessOutputDestination = subprocessOutputDestination;
|
|
20
|
+
this.configDir = undefined;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Whether an image with the given tag exists
|
|
24
|
+
*/
|
|
25
|
+
async exists(tag) {
|
|
26
|
+
try {
|
|
27
|
+
await this.execute(['inspect', tag], {
|
|
28
|
+
subprocessOutputDestination: 'ignore',
|
|
29
|
+
});
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
const error = e;
|
|
34
|
+
/**
|
|
35
|
+
* The only error we expect to be thrown will have this property and value.
|
|
36
|
+
* If it doesn't, it's unrecognized so re-throw it.
|
|
37
|
+
*/
|
|
38
|
+
if (error.code !== 'PROCESS_FAILED') {
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* If we know the shell command above returned an error, check to see
|
|
43
|
+
* if the exit code is one we know to actually mean that the image doesn't
|
|
44
|
+
* exist.
|
|
45
|
+
*/
|
|
46
|
+
switch (error.exitCode) {
|
|
47
|
+
case InspectImageErrorCode.Docker:
|
|
48
|
+
case InspectImageErrorCode.Podman:
|
|
49
|
+
// Docker and Podman will return this exit code when an image doesn't exist, return false
|
|
50
|
+
// context: https://github.com/aws/aws-cdk/issues/16209
|
|
51
|
+
return false;
|
|
52
|
+
default:
|
|
53
|
+
// This is an error but it's not an exit code we recognize, throw.
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async build(options) {
|
|
59
|
+
const buildCommand = [
|
|
60
|
+
'build',
|
|
61
|
+
...flatten(Object.entries(options.buildArgs || {}).map(([k, v]) => ['--build-arg', `${k}=${v}`])),
|
|
62
|
+
...flatten(Object.entries(options.buildSecrets || {}).map(([k, v]) => ['--secret', `id=${k},${v}`])),
|
|
63
|
+
...(options.buildSsh ? ['--ssh', options.buildSsh] : []),
|
|
64
|
+
'--tag',
|
|
65
|
+
options.tag,
|
|
66
|
+
...(options.target ? ['--target', options.target] : []),
|
|
67
|
+
...(options.file ? ['--file', options.file] : []),
|
|
68
|
+
...(options.networkMode ? ['--network', options.networkMode] : []),
|
|
69
|
+
...(options.platform ? ['--platform', options.platform] : []),
|
|
70
|
+
...(options.outputs ? options.outputs.map((output) => [`--output=${output}`]) : []),
|
|
71
|
+
...(options.cacheFrom
|
|
72
|
+
? [
|
|
73
|
+
...options.cacheFrom
|
|
74
|
+
.map((cacheFrom) => ['--cache-from', this.cacheOptionToFlag(cacheFrom)])
|
|
75
|
+
.flat(),
|
|
76
|
+
]
|
|
77
|
+
: []),
|
|
78
|
+
...(options.cacheTo ? ['--cache-to', this.cacheOptionToFlag(options.cacheTo)] : []),
|
|
79
|
+
...(options.cacheDisabled ? ['--no-cache'] : []),
|
|
80
|
+
'.',
|
|
81
|
+
];
|
|
82
|
+
await this.execute(buildCommand, {
|
|
83
|
+
cwd: options.directory,
|
|
84
|
+
subprocessOutputDestination: this.subprocessOutputDestination,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get credentials from ECR and run docker login
|
|
89
|
+
*/
|
|
90
|
+
async login(ecr) {
|
|
91
|
+
const credentials = await (0, docker_credentials_1.obtainEcrCredentials)(ecr, this.eventEmitter);
|
|
92
|
+
// Use --password-stdin otherwise docker will complain. Loudly.
|
|
93
|
+
await this.execute(['login', '--username', credentials.username, '--password-stdin', credentials.endpoint], {
|
|
94
|
+
input: credentials.password,
|
|
95
|
+
// Need to ignore otherwise Docker will complain
|
|
96
|
+
// 'WARNING! Your password will be stored unencrypted'
|
|
97
|
+
// doesn't really matter since it's a token.
|
|
98
|
+
subprocessOutputDestination: 'ignore',
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
async tag(sourceTag, targetTag) {
|
|
102
|
+
await this.execute(['tag', sourceTag, targetTag]);
|
|
103
|
+
}
|
|
104
|
+
async push(options) {
|
|
105
|
+
await this.execute(['push', options.tag], {
|
|
106
|
+
subprocessOutputDestination: this.subprocessOutputDestination,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* If a CDK Docker Credentials file exists, creates a new Docker config directory.
|
|
111
|
+
* Sets up `docker-credential-cdk-assets` to be the credential helper for each domain in the CDK config.
|
|
112
|
+
* All future commands (e.g., `build`, `push`) will use this config.
|
|
113
|
+
*
|
|
114
|
+
* See https://docs.docker.com/engine/reference/commandline/login/#credential-helpers for more details on cred helpers.
|
|
115
|
+
*
|
|
116
|
+
* @returns true if CDK config was found and configured, false otherwise
|
|
117
|
+
*/
|
|
118
|
+
configureCdkCredentials() {
|
|
119
|
+
const config = (0, docker_credentials_1.cdkCredentialsConfig)();
|
|
120
|
+
if (!config) {
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
this.configDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cdkDockerConfig'));
|
|
124
|
+
const domains = Object.keys(config.domainCredentials);
|
|
125
|
+
const credHelpers = domains.reduce((map, domain) => {
|
|
126
|
+
map[domain] = 'cdk-assets'; // Use docker-credential-cdk-assets for this domain
|
|
127
|
+
return map;
|
|
128
|
+
}, {});
|
|
129
|
+
fs.writeFileSync(path.join(this.configDir, 'config.json'), JSON.stringify({ credHelpers }), {
|
|
130
|
+
encoding: 'utf-8',
|
|
131
|
+
});
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Removes any configured Docker config directory.
|
|
136
|
+
* All future commands (e.g., `build`, `push`) will use the default config.
|
|
137
|
+
*
|
|
138
|
+
* This is useful after calling `configureCdkCredentials` to reset to default credentials.
|
|
139
|
+
*/
|
|
140
|
+
resetAuthPlugins() {
|
|
141
|
+
this.configDir = undefined;
|
|
142
|
+
}
|
|
143
|
+
async execute(args, options = {}) {
|
|
144
|
+
const configArgs = this.configDir ? ['--config', this.configDir] : [];
|
|
145
|
+
const pathToCdkAssets = path.resolve(__dirname, '..', '..', 'bin');
|
|
146
|
+
const shellEventPublisher = (0, progress_1.shellEventPublisherFromEventEmitter)(this.eventEmitter);
|
|
147
|
+
try {
|
|
148
|
+
await (0, shell_1.shell)([getDockerCmd(), ...configArgs, ...args], {
|
|
149
|
+
...options,
|
|
150
|
+
shellEventPublisher: shellEventPublisher,
|
|
151
|
+
env: {
|
|
152
|
+
...process.env,
|
|
153
|
+
...options.env,
|
|
154
|
+
PATH: `${pathToCdkAssets}${path.delimiter}${options.env?.PATH ?? process.env.PATH}`,
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
if (e.code === 'ENOENT') {
|
|
160
|
+
throw new Error("Unable to execute 'docker' in order to build a container asset. Please install 'docker' and try again.");
|
|
161
|
+
}
|
|
162
|
+
throw e;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
cacheOptionToFlag(option) {
|
|
166
|
+
let flag = `type=${option.type}`;
|
|
167
|
+
if (option.params) {
|
|
168
|
+
flag +=
|
|
169
|
+
',' +
|
|
170
|
+
Object.entries(option.params)
|
|
171
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
172
|
+
.join(',');
|
|
173
|
+
}
|
|
174
|
+
return flag;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
exports.Docker = Docker;
|
|
178
|
+
/**
|
|
179
|
+
* Helps get appropriately configured Docker instances during the container
|
|
180
|
+
* image publishing process.
|
|
181
|
+
*/
|
|
182
|
+
class DockerFactory {
|
|
183
|
+
constructor() {
|
|
184
|
+
this.enterLoggedInDestinationsCriticalSection = (0, util_1.createCriticalSection)();
|
|
185
|
+
this.loggedInDestinations = new Set();
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Gets a Docker instance for building images.
|
|
189
|
+
*/
|
|
190
|
+
async forBuild(options) {
|
|
191
|
+
const docker = new Docker(options.eventEmitter, options.subprocessOutputDestination);
|
|
192
|
+
// Default behavior is to login before build so that the Dockerfile can reference images in the ECR repo
|
|
193
|
+
// However, if we're in a pipelines environment (for example),
|
|
194
|
+
// we may have alternative credentials to the default ones to use for the build itself.
|
|
195
|
+
// If the special config file is present, delay the login to the default credentials until the push.
|
|
196
|
+
// If the config file is present, we will configure and use those credentials for the build.
|
|
197
|
+
let cdkDockerCredentialsConfigured = docker.configureCdkCredentials();
|
|
198
|
+
if (!cdkDockerCredentialsConfigured) {
|
|
199
|
+
await this.loginOncePerDestination(docker, options);
|
|
200
|
+
}
|
|
201
|
+
return docker;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Gets a Docker instance for pushing images to ECR.
|
|
205
|
+
*/
|
|
206
|
+
async forEcrPush(options) {
|
|
207
|
+
const docker = new Docker(options.eventEmitter, options.subprocessOutputDestination);
|
|
208
|
+
await this.loginOncePerDestination(docker, options);
|
|
209
|
+
return docker;
|
|
210
|
+
}
|
|
211
|
+
async loginOncePerDestination(docker, options) {
|
|
212
|
+
// Changes: 012345678910.dkr.ecr.us-west-2.amazonaws.com/tagging-test
|
|
213
|
+
// To this: 012345678910.dkr.ecr.us-west-2.amazonaws.com
|
|
214
|
+
const repositoryDomain = options.repoUri.split('/')[0];
|
|
215
|
+
// Ensure one-at-a-time access to loggedInDestinations.
|
|
216
|
+
await this.enterLoggedInDestinationsCriticalSection(async () => {
|
|
217
|
+
if (this.loggedInDestinations.has(repositoryDomain)) {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
await docker.login(options.ecr);
|
|
221
|
+
this.loggedInDestinations.add(repositoryDomain);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
exports.DockerFactory = DockerFactory;
|
|
226
|
+
function getDockerCmd() {
|
|
227
|
+
return process.env.CDK_DOCKER ?? 'docker';
|
|
228
|
+
}
|
|
229
|
+
function flatten(x) {
|
|
230
|
+
return Array.prototype.concat([], ...x);
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9ja2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZG9ja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLDZEQUFrRjtBQUNsRixtQ0FBa0U7QUFDbEUsaUNBQStDO0FBRy9DLDBDQUFnRjtBQW9DaEYsSUFBSyxxQkFHSjtBQUhELFdBQUsscUJBQXFCO0lBQ3hCLHFFQUFVLENBQUE7SUFDVix1RUFBWSxDQUFBO0FBQ2QsQ0FBQyxFQUhJLHFCQUFxQixLQUFyQixxQkFBcUIsUUFHekI7QUFPRCxNQUFhLE1BQU07SUFHakIsWUFDbUIsWUFBMEIsRUFDMUIsMkJBQXdEO1FBRHhELGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdDQUEyQixHQUEzQiwyQkFBMkIsQ0FBNkI7UUFKbkUsY0FBUyxHQUF1QixTQUFTLENBQUM7SUFLL0MsQ0FBQztJQUVKOztPQUVHO0lBQ0ksS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFXO1FBQzdCLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDbkMsMkJBQTJCLEVBQUUsUUFBUTthQUN0QyxDQUFDLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sS0FBSyxHQUF1QixDQUFDLENBQUM7WUFFcEM7OztlQUdHO1lBQ0gsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQztZQUVEOzs7O2VBSUc7WUFDSCxRQUFRLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDdkIsS0FBSyxxQkFBcUIsQ0FBQyxNQUFNLENBQUM7Z0JBQ2xDLEtBQUsscUJBQXFCLENBQUMsTUFBTTtvQkFDL0IseUZBQXlGO29CQUN6Rix1REFBdUQ7b0JBQ3ZELE9BQU8sS0FBSyxDQUFDO2dCQUNmO29CQUNFLGtFQUFrRTtvQkFDbEUsTUFBTSxLQUFLLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFxQjtRQUN0QyxNQUFNLFlBQVksR0FBRztZQUNuQixPQUFPO1lBQ1AsR0FBRyxPQUFPLENBQ1IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ3RGO1lBQ0QsR0FBRyxPQUFPLENBQ1IsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQ3pGO1lBQ0QsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hELE9BQU87WUFDUCxPQUFPLENBQUMsR0FBRztZQUNYLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN2RCxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xFLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM3RCxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuRixHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVM7Z0JBQ25CLENBQUMsQ0FBQztvQkFDQSxHQUFHLE9BQU8sQ0FBQyxTQUFTO3lCQUNqQixHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO3lCQUN2RSxJQUFJLEVBQUU7aUJBQ1Y7Z0JBQ0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNQLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNuRixHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hELEdBQUc7U0FDSixDQUFDO1FBQ0YsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtZQUMvQixHQUFHLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDdEIsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLDJCQUEyQjtTQUM5RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQWU7UUFDaEMsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFBLHlDQUFvQixFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFdkUsK0RBQStEO1FBQy9ELE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FDaEIsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUN2RjtZQUNFLEtBQUssRUFBRSxXQUFXLENBQUMsUUFBUTtZQUUzQixnREFBZ0Q7WUFDaEQsc0RBQXNEO1lBQ3RELDRDQUE0QztZQUM1QywyQkFBMkIsRUFBRSxRQUFRO1NBQ3RDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTSxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQWlCLEVBQUUsU0FBaUI7UUFDbkQsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFTSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQW9CO1FBQ3BDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDeEMsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLDJCQUEyQjtTQUM5RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSx1QkFBdUI7UUFDNUIsTUFBTSxNQUFNLEdBQUcsSUFBQSx5Q0FBb0IsR0FBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFFM0UsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN0RCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBMkIsRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN6RSxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsbURBQW1EO1lBQy9FLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ1AsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUU7WUFDMUYsUUFBUSxFQUFFLE9BQU87U0FDbEIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxnQkFBZ0I7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBYyxFQUFFLFVBQXFELEVBQUU7UUFDM0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFdEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVuRSxNQUFNLG1CQUFtQixHQUFHLElBQUEsOENBQW1DLEVBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25GLElBQUksQ0FBQztZQUNILE1BQU0sSUFBQSxhQUFLLEVBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxHQUFHLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFO2dCQUNwRCxHQUFHLE9BQU87Z0JBQ1YsbUJBQW1CLEVBQUUsbUJBQW1CO2dCQUN4QyxHQUFHLEVBQUU7b0JBQ0gsR0FBRyxPQUFPLENBQUMsR0FBRztvQkFDZCxHQUFHLE9BQU8sQ0FBQyxHQUFHO29CQUNkLElBQUksRUFBRSxHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO2lCQUNwRjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7UUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxJQUFJLEtBQUssQ0FDYix3R0FBd0csQ0FDekcsQ0FBQztZQUNKLENBQUM7WUFDRCxNQUFNLENBQUMsQ0FBQztRQUNWLENBQUM7SUFDSCxDQUFDO0lBRU8saUJBQWlCLENBQUMsTUFBeUI7UUFDakQsSUFBSSxJQUFJLEdBQUcsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakMsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEIsSUFBSTtnQkFDRixHQUFHO29CQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQzt5QkFDMUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO3lCQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGO0FBMUxELHdCQTBMQztBQVNEOzs7R0FHRztBQUNILE1BQWEsYUFBYTtJQUExQjtRQUNVLDZDQUF3QyxHQUFHLElBQUEsNEJBQXFCLEdBQUUsQ0FBQztRQUNuRSx5QkFBb0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBNkNuRCxDQUFDO0lBM0NDOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUE2QjtRQUNqRCxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBRXJGLHdHQUF3RztRQUN4Ryw4REFBOEQ7UUFDOUQsdUZBQXVGO1FBQ3ZGLG9HQUFvRztRQUNwRyw0RkFBNEY7UUFDNUYsSUFBSSw4QkFBOEIsR0FBRyxNQUFNLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUN0RSxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBNkI7UUFDbkQsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUNyRixNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxNQUFjLEVBQUUsT0FBNkI7UUFDakYscUVBQXFFO1FBQ3JFLHdEQUF3RDtRQUN4RCxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZELHVEQUF1RDtRQUN2RCxNQUFNLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUM3RCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO2dCQUNwRCxPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2xELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBL0NELHNDQStDQztBQUVELFNBQVMsWUFBWTtJQUNuQixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQztBQUM1QyxDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsQ0FBYTtJQUM1QixPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQzFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgY2RrQ3JlZGVudGlhbHNDb25maWcsIG9idGFpbkVjckNyZWRlbnRpYWxzIH0gZnJvbSAnLi9kb2NrZXItY3JlZGVudGlhbHMnO1xuaW1wb3J0IHsgc2hlbGwsIFNoZWxsT3B0aW9ucywgUHJvY2Vzc0ZhaWxlZEVycm9yIH0gZnJvbSAnLi9zaGVsbCc7XG5pbXBvcnQgeyBjcmVhdGVDcml0aWNhbFNlY3Rpb24gfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgSUVDUkNsaWVudCB9IGZyb20gJy4uL2F3cyc7XG5pbXBvcnQgeyBTdWJwcm9jZXNzT3V0cHV0RGVzdGluYXRpb24gfSBmcm9tICcuL2Fzc2V0LWhhbmRsZXInO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBzaGVsbEV2ZW50UHVibGlzaGVyRnJvbUV2ZW50RW1pdHRlciB9IGZyb20gJy4uL3Byb2dyZXNzJztcblxuaW50ZXJmYWNlIEJ1aWxkT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGRpcmVjdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYWcgdGhlIGltYWdlIHdpdGggYSBnaXZlbiByZXBvTmFtZTp0YWcgY29tYmluYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IHRhZzogc3RyaW5nO1xuICByZWFkb25seSB0YXJnZXQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGZpbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGJ1aWxkQXJncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHJlYWRvbmx5IGJ1aWxkU2VjcmV0cz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHJlYWRvbmx5IGJ1aWxkU3NoPzogc3RyaW5nO1xuICByZWFkb25seSBuZXR3b3JrTW9kZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcGxhdGZvcm0/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG91dHB1dHM/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgY2FjaGVGcm9tPzogRG9ja2VyQ2FjaGVPcHRpb25bXTtcbiAgcmVhZG9ubHkgY2FjaGVUbz86IERvY2tlckNhY2hlT3B0aW9uO1xuICByZWFkb25seSBjYWNoZURpc2FibGVkPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFB1c2hPcHRpb25zIHtcbiAgcmVhZG9ubHkgdGFnOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9ja2VyQ3JlZGVudGlhbHNDb25maWcge1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRvbWFpbkNyZWRlbnRpYWxzOiBSZWNvcmQ8c3RyaW5nLCBEb2NrZXJEb21haW5DcmVkZW50aWFscz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9ja2VyRG9tYWluQ3JlZGVudGlhbHMge1xuICByZWFkb25seSBzZWNyZXRzTWFuYWdlclNlY3JldElkPzogc3RyaW5nO1xuICByZWFkb25seSBlY3JSZXBvc2l0b3J5Pzogc3RyaW5nO1xufVxuXG5lbnVtIEluc3BlY3RJbWFnZUVycm9yQ29kZSB7XG4gIERvY2tlciA9IDEsXG4gIFBvZG1hbiA9IDEyNSxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEb2NrZXJDYWNoZU9wdGlvbiB7XG4gIHJlYWRvbmx5IHR5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgcGFyYW1zPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuZXhwb3J0IGNsYXNzIERvY2tlciB7XG4gIHByaXZhdGUgY29uZmlnRGlyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBldmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN1YnByb2Nlc3NPdXRwdXREZXN0aW5hdGlvbjogU3VicHJvY2Vzc091dHB1dERlc3RpbmF0aW9uLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYW4gaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4gdGFnIGV4aXN0c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGV4aXN0cyh0YWc6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmV4ZWN1dGUoWydpbnNwZWN0JywgdGFnXSwge1xuICAgICAgICBzdWJwcm9jZXNzT3V0cHV0RGVzdGluYXRpb246ICdpZ25vcmUnLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBQcm9jZXNzRmFpbGVkRXJyb3IgPSBlO1xuXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBvbmx5IGVycm9yIHdlIGV4cGVjdCB0byBiZSB0aHJvd24gd2lsbCBoYXZlIHRoaXMgcHJvcGVydHkgYW5kIHZhbHVlLlxuICAgICAgICogSWYgaXQgZG9lc24ndCwgaXQncyB1bnJlY29nbml6ZWQgc28gcmUtdGhyb3cgaXQuXG4gICAgICAgKi9cbiAgICAgIGlmIChlcnJvci5jb2RlICE9PSAnUFJPQ0VTU19GQUlMRUQnKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIElmIHdlIGtub3cgdGhlIHNoZWxsIGNvbW1hbmQgYWJvdmUgcmV0dXJuZWQgYW4gZXJyb3IsIGNoZWNrIHRvIHNlZVxuICAgICAgICogaWYgdGhlIGV4aXQgY29kZSBpcyBvbmUgd2Uga25vdyB0byBhY3R1YWxseSBtZWFuIHRoYXQgdGhlIGltYWdlIGRvZXNuJ3RcbiAgICAgICAqIGV4aXN0LlxuICAgICAgICovXG4gICAgICBzd2l0Y2ggKGVycm9yLmV4aXRDb2RlKSB7XG4gICAgICAgIGNhc2UgSW5zcGVjdEltYWdlRXJyb3JDb2RlLkRvY2tlcjpcbiAgICAgICAgY2FzZSBJbnNwZWN0SW1hZ2VFcnJvckNvZGUuUG9kbWFuOlxuICAgICAgICAgIC8vIERvY2tlciBhbmQgUG9kbWFuIHdpbGwgcmV0dXJuIHRoaXMgZXhpdCBjb2RlIHdoZW4gYW4gaW1hZ2UgZG9lc24ndCBleGlzdCwgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgLy8gY29udGV4dDogaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy8xNjIwOVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBUaGlzIGlzIGFuIGVycm9yIGJ1dCBpdCdzIG5vdCBhbiBleGl0IGNvZGUgd2UgcmVjb2duaXplLCB0aHJvdy5cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgYnVpbGQob3B0aW9uczogQnVpbGRPcHRpb25zKSB7XG4gICAgY29uc3QgYnVpbGRDb21tYW5kID0gW1xuICAgICAgJ2J1aWxkJyxcbiAgICAgIC4uLmZsYXR0ZW4oXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMuYnVpbGRBcmdzIHx8IHt9KS5tYXAoKFtrLCB2XSkgPT4gWyctLWJ1aWxkLWFyZycsIGAke2t9PSR7dn1gXSksXG4gICAgICApLFxuICAgICAgLi4uZmxhdHRlbihcbiAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5idWlsZFNlY3JldHMgfHwge30pLm1hcCgoW2ssIHZdKSA9PiBbJy0tc2VjcmV0JywgYGlkPSR7a30sJHt2fWBdKSxcbiAgICAgICksXG4gICAgICAuLi4ob3B0aW9ucy5idWlsZFNzaCA/IFsnLS1zc2gnLCBvcHRpb25zLmJ1aWxkU3NoXSA6IFtdKSxcbiAgICAgICctLXRhZycsXG4gICAgICBvcHRpb25zLnRhZyxcbiAgICAgIC4uLihvcHRpb25zLnRhcmdldCA/IFsnLS10YXJnZXQnLCBvcHRpb25zLnRhcmdldF0gOiBbXSksXG4gICAgICAuLi4ob3B0aW9ucy5maWxlID8gWyctLWZpbGUnLCBvcHRpb25zLmZpbGVdIDogW10pLFxuICAgICAgLi4uKG9wdGlvbnMubmV0d29ya01vZGUgPyBbJy0tbmV0d29yaycsIG9wdGlvbnMubmV0d29ya01vZGVdIDogW10pLFxuICAgICAgLi4uKG9wdGlvbnMucGxhdGZvcm0gPyBbJy0tcGxhdGZvcm0nLCBvcHRpb25zLnBsYXRmb3JtXSA6IFtdKSxcbiAgICAgIC4uLihvcHRpb25zLm91dHB1dHMgPyBvcHRpb25zLm91dHB1dHMubWFwKChvdXRwdXQpID0+IFtgLS1vdXRwdXQ9JHtvdXRwdXR9YF0pIDogW10pLFxuICAgICAgLi4uKG9wdGlvbnMuY2FjaGVGcm9tXG4gICAgICAgID8gW1xuICAgICAgICAgIC4uLm9wdGlvbnMuY2FjaGVGcm9tXG4gICAgICAgICAgICAubWFwKChjYWNoZUZyb20pID0+IFsnLS1jYWNoZS1mcm9tJywgdGhpcy5jYWNoZU9wdGlvblRvRmxhZyhjYWNoZUZyb20pXSlcbiAgICAgICAgICAgIC5mbGF0KCksXG4gICAgICAgIF1cbiAgICAgICAgOiBbXSksXG4gICAgICAuLi4ob3B0aW9ucy5jYWNoZVRvID8gWyctLWNhY2hlLXRvJywgdGhpcy5jYWNoZU9wdGlvblRvRmxhZyhvcHRpb25zLmNhY2hlVG8pXSA6IFtdKSxcbiAgICAgIC4uLihvcHRpb25zLmNhY2hlRGlzYWJsZWQgPyBbJy0tbm8tY2FjaGUnXSA6IFtdKSxcbiAgICAgICcuJyxcbiAgICBdO1xuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZShidWlsZENvbW1hbmQsIHtcbiAgICAgIGN3ZDogb3B0aW9ucy5kaXJlY3RvcnksXG4gICAgICBzdWJwcm9jZXNzT3V0cHV0RGVzdGluYXRpb246IHRoaXMuc3VicHJvY2Vzc091dHB1dERlc3RpbmF0aW9uLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjcmVkZW50aWFscyBmcm9tIEVDUiBhbmQgcnVuIGRvY2tlciBsb2dpblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxvZ2luKGVjcjogSUVDUkNsaWVudCkge1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gYXdhaXQgb2J0YWluRWNyQ3JlZGVudGlhbHMoZWNyLCB0aGlzLmV2ZW50RW1pdHRlcik7XG5cbiAgICAvLyBVc2UgLS1wYXNzd29yZC1zdGRpbiBvdGhlcndpc2UgZG9ja2VyIHdpbGwgY29tcGxhaW4uIExvdWRseS5cbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGUoXG4gICAgICBbJ2xvZ2luJywgJy0tdXNlcm5hbWUnLCBjcmVkZW50aWFscy51c2VybmFtZSwgJy0tcGFzc3dvcmQtc3RkaW4nLCBjcmVkZW50aWFscy5lbmRwb2ludF0sXG4gICAgICB7XG4gICAgICAgIGlucHV0OiBjcmVkZW50aWFscy5wYXNzd29yZCxcblxuICAgICAgICAvLyBOZWVkIHRvIGlnbm9yZSBvdGhlcndpc2UgRG9ja2VyIHdpbGwgY29tcGxhaW5cbiAgICAgICAgLy8gJ1dBUk5JTkchIFlvdXIgcGFzc3dvcmQgd2lsbCBiZSBzdG9yZWQgdW5lbmNyeXB0ZWQnXG4gICAgICAgIC8vIGRvZXNuJ3QgcmVhbGx5IG1hdHRlciBzaW5jZSBpdCdzIGEgdG9rZW4uXG4gICAgICAgIHN1YnByb2Nlc3NPdXRwdXREZXN0aW5hdGlvbjogJ2lnbm9yZScsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdGFnKHNvdXJjZVRhZzogc3RyaW5nLCB0YXJnZXRUYWc6IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZShbJ3RhZycsIHNvdXJjZVRhZywgdGFyZ2V0VGFnXSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcHVzaChvcHRpb25zOiBQdXNoT3B0aW9ucykge1xuICAgIGF3YWl0IHRoaXMuZXhlY3V0ZShbJ3B1c2gnLCBvcHRpb25zLnRhZ10sIHtcbiAgICAgIHN1YnByb2Nlc3NPdXRwdXREZXN0aW5hdGlvbjogdGhpcy5zdWJwcm9jZXNzT3V0cHV0RGVzdGluYXRpb24sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgYSBDREsgRG9ja2VyIENyZWRlbnRpYWxzIGZpbGUgZXhpc3RzLCBjcmVhdGVzIGEgbmV3IERvY2tlciBjb25maWcgZGlyZWN0b3J5LlxuICAgKiBTZXRzIHVwIGBkb2NrZXItY3JlZGVudGlhbC1jZGstYXNzZXRzYCB0byBiZSB0aGUgY3JlZGVudGlhbCBoZWxwZXIgZm9yIGVhY2ggZG9tYWluIGluIHRoZSBDREsgY29uZmlnLlxuICAgKiBBbGwgZnV0dXJlIGNvbW1hbmRzIChlLmcuLCBgYnVpbGRgLCBgcHVzaGApIHdpbGwgdXNlIHRoaXMgY29uZmlnLlxuICAgKlxuICAgKiBTZWUgaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9jb21tYW5kbGluZS9sb2dpbi8jY3JlZGVudGlhbC1oZWxwZXJzIGZvciBtb3JlIGRldGFpbHMgb24gY3JlZCBoZWxwZXJzLlxuICAgKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIENESyBjb25maWcgd2FzIGZvdW5kIGFuZCBjb25maWd1cmVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHB1YmxpYyBjb25maWd1cmVDZGtDcmVkZW50aWFscygpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb25maWcgPSBjZGtDcmVkZW50aWFsc0NvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWdEaXIgPSBmcy5ta2R0ZW1wU3luYyhwYXRoLmpvaW4ob3MudG1wZGlyKCksICdjZGtEb2NrZXJDb25maWcnKSk7XG5cbiAgICBjb25zdCBkb21haW5zID0gT2JqZWN0LmtleXMoY29uZmlnLmRvbWFpbkNyZWRlbnRpYWxzKTtcbiAgICBjb25zdCBjcmVkSGVscGVycyA9IGRvbWFpbnMucmVkdWNlKChtYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGRvbWFpbikgPT4ge1xuICAgICAgbWFwW2RvbWFpbl0gPSAnY2RrLWFzc2V0cyc7IC8vIFVzZSBkb2NrZXItY3JlZGVudGlhbC1jZGstYXNzZXRzIGZvciB0aGlzIGRvbWFpblxuICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LCB7fSk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4odGhpcy5jb25maWdEaXIsICdjb25maWcuanNvbicpLCBKU09OLnN0cmluZ2lmeSh7IGNyZWRIZWxwZXJzIH0pLCB7XG4gICAgICBlbmNvZGluZzogJ3V0Zi04JyxcbiAgICB9KTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW55IGNvbmZpZ3VyZWQgRG9ja2VyIGNvbmZpZyBkaXJlY3RvcnkuXG4gICAqIEFsbCBmdXR1cmUgY29tbWFuZHMgKGUuZy4sIGBidWlsZGAsIGBwdXNoYCkgd2lsbCB1c2UgdGhlIGRlZmF1bHQgY29uZmlnLlxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBhZnRlciBjYWxsaW5nIGBjb25maWd1cmVDZGtDcmVkZW50aWFsc2AgdG8gcmVzZXQgdG8gZGVmYXVsdCBjcmVkZW50aWFscy5cbiAgICovXG4gIHB1YmxpYyByZXNldEF1dGhQbHVnaW5zKCkge1xuICAgIHRoaXMuY29uZmlnRGlyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlKGFyZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBPbWl0PFNoZWxsT3B0aW9ucywgJ3NoZWxsRXZlbnRQdWJsaXNoZXInPiA9IHt9KSB7XG4gICAgY29uc3QgY29uZmlnQXJncyA9IHRoaXMuY29uZmlnRGlyID8gWyctLWNvbmZpZycsIHRoaXMuY29uZmlnRGlyXSA6IFtdO1xuXG4gICAgY29uc3QgcGF0aFRvQ2RrQXNzZXRzID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ2JpbicpO1xuXG4gICAgY29uc3Qgc2hlbGxFdmVudFB1Ymxpc2hlciA9IHNoZWxsRXZlbnRQdWJsaXNoZXJGcm9tRXZlbnRFbWl0dGVyKHRoaXMuZXZlbnRFbWl0dGVyKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2hlbGwoW2dldERvY2tlckNtZCgpLCAuLi5jb25maWdBcmdzLCAuLi5hcmdzXSwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBzaGVsbEV2ZW50UHVibGlzaGVyOiBzaGVsbEV2ZW50UHVibGlzaGVyLFxuICAgICAgICBlbnY6IHtcbiAgICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgICAuLi5vcHRpb25zLmVudixcbiAgICAgICAgICBQQVRIOiBgJHtwYXRoVG9DZGtBc3NldHN9JHtwYXRoLmRlbGltaXRlcn0ke29wdGlvbnMuZW52Py5QQVRIID8/IHByb2Nlc3MuZW52LlBBVEh9YCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgaWYgKGUuY29kZSA9PT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiVW5hYmxlIHRvIGV4ZWN1dGUgJ2RvY2tlcicgaW4gb3JkZXIgdG8gYnVpbGQgYSBjb250YWluZXIgYXNzZXQuIFBsZWFzZSBpbnN0YWxsICdkb2NrZXInIGFuZCB0cnkgYWdhaW4uXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FjaGVPcHRpb25Ub0ZsYWcob3B0aW9uOiBEb2NrZXJDYWNoZU9wdGlvbik6IHN0cmluZyB7XG4gICAgbGV0IGZsYWcgPSBgdHlwZT0ke29wdGlvbi50eXBlfWA7XG4gICAgaWYgKG9wdGlvbi5wYXJhbXMpIHtcbiAgICAgIGZsYWcgKz1cbiAgICAgICAgJywnICtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0aW9uLnBhcmFtcylcbiAgICAgICAgICAubWFwKChbaywgdl0pID0+IGAke2t9PSR7dn1gKVxuICAgICAgICAgIC5qb2luKCcsJyk7XG4gICAgfVxuICAgIHJldHVybiBmbGFnO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9ja2VyRmFjdG9yeU9wdGlvbnMge1xuICByZWFkb25seSByZXBvVXJpOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVjcjogSUVDUkNsaWVudDtcbiAgcmVhZG9ubHkgZXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI7XG4gIHJlYWRvbmx5IHN1YnByb2Nlc3NPdXRwdXREZXN0aW5hdGlvbjogU3VicHJvY2Vzc091dHB1dERlc3RpbmF0aW9uO1xufVxuXG4vKipcbiAqIEhlbHBzIGdldCBhcHByb3ByaWF0ZWx5IGNvbmZpZ3VyZWQgRG9ja2VyIGluc3RhbmNlcyBkdXJpbmcgdGhlIGNvbnRhaW5lclxuICogaW1hZ2UgcHVibGlzaGluZyBwcm9jZXNzLlxuICovXG5leHBvcnQgY2xhc3MgRG9ja2VyRmFjdG9yeSB7XG4gIHByaXZhdGUgZW50ZXJMb2dnZWRJbkRlc3RpbmF0aW9uc0NyaXRpY2FsU2VjdGlvbiA9IGNyZWF0ZUNyaXRpY2FsU2VjdGlvbigpO1xuICBwcml2YXRlIGxvZ2dlZEluRGVzdGluYXRpb25zID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqXG4gICAqIEdldHMgYSBEb2NrZXIgaW5zdGFuY2UgZm9yIGJ1aWxkaW5nIGltYWdlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBmb3JCdWlsZChvcHRpb25zOiBEb2NrZXJGYWN0b3J5T3B0aW9ucyk6IFByb21pc2U8RG9ja2VyPiB7XG4gICAgY29uc3QgZG9ja2VyID0gbmV3IERvY2tlcihvcHRpb25zLmV2ZW50RW1pdHRlciwgb3B0aW9ucy5zdWJwcm9jZXNzT3V0cHV0RGVzdGluYXRpb24pO1xuXG4gICAgLy8gRGVmYXVsdCBiZWhhdmlvciBpcyB0byBsb2dpbiBiZWZvcmUgYnVpbGQgc28gdGhhdCB0aGUgRG9ja2VyZmlsZSBjYW4gcmVmZXJlbmNlIGltYWdlcyBpbiB0aGUgRUNSIHJlcG9cbiAgICAvLyBIb3dldmVyLCBpZiB3ZSdyZSBpbiBhIHBpcGVsaW5lcyBlbnZpcm9ubWVudCAoZm9yIGV4YW1wbGUpLFxuICAgIC8vIHdlIG1heSBoYXZlIGFsdGVybmF0aXZlIGNyZWRlbnRpYWxzIHRvIHRoZSBkZWZhdWx0IG9uZXMgdG8gdXNlIGZvciB0aGUgYnVpbGQgaXRzZWxmLlxuICAgIC8vIElmIHRoZSBzcGVjaWFsIGNvbmZpZyBmaWxlIGlzIHByZXNlbnQsIGRlbGF5IHRoZSBsb2dpbiB0byB0aGUgZGVmYXVsdCBjcmVkZW50aWFscyB1bnRpbCB0aGUgcHVzaC5cbiAgICAvLyBJZiB0aGUgY29uZmlnIGZpbGUgaXMgcHJlc2VudCwgd2Ugd2lsbCBjb25maWd1cmUgYW5kIHVzZSB0aG9zZSBjcmVkZW50aWFscyBmb3IgdGhlIGJ1aWxkLlxuICAgIGxldCBjZGtEb2NrZXJDcmVkZW50aWFsc0NvbmZpZ3VyZWQgPSBkb2NrZXIuY29uZmlndXJlQ2RrQ3JlZGVudGlhbHMoKTtcbiAgICBpZiAoIWNka0RvY2tlckNyZWRlbnRpYWxzQ29uZmlndXJlZCkge1xuICAgICAgYXdhaXQgdGhpcy5sb2dpbk9uY2VQZXJEZXN0aW5hdGlvbihkb2NrZXIsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiBkb2NrZXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIERvY2tlciBpbnN0YW5jZSBmb3IgcHVzaGluZyBpbWFnZXMgdG8gRUNSLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZvckVjclB1c2gob3B0aW9uczogRG9ja2VyRmFjdG9yeU9wdGlvbnMpIHtcbiAgICBjb25zdCBkb2NrZXIgPSBuZXcgRG9ja2VyKG9wdGlvbnMuZXZlbnRFbWl0dGVyLCBvcHRpb25zLnN1YnByb2Nlc3NPdXRwdXREZXN0aW5hdGlvbik7XG4gICAgYXdhaXQgdGhpcy5sb2dpbk9uY2VQZXJEZXN0aW5hdGlvbihkb2NrZXIsIG9wdGlvbnMpO1xuICAgIHJldHVybiBkb2NrZXI7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvZ2luT25jZVBlckRlc3RpbmF0aW9uKGRvY2tlcjogRG9ja2VyLCBvcHRpb25zOiBEb2NrZXJGYWN0b3J5T3B0aW9ucykge1xuICAgIC8vIENoYW5nZXM6IDAxMjM0NTY3ODkxMC5ka3IuZWNyLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tL3RhZ2dpbmctdGVzdFxuICAgIC8vIFRvIHRoaXM6IDAxMjM0NTY3ODkxMC5ka3IuZWNyLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tXG4gICAgY29uc3QgcmVwb3NpdG9yeURvbWFpbiA9IG9wdGlvbnMucmVwb1VyaS5zcGxpdCgnLycpWzBdO1xuXG4gICAgLy8gRW5zdXJlIG9uZS1hdC1hLXRpbWUgYWNjZXNzIHRvIGxvZ2dlZEluRGVzdGluYXRpb25zLlxuICAgIGF3YWl0IHRoaXMuZW50ZXJMb2dnZWRJbkRlc3RpbmF0aW9uc0NyaXRpY2FsU2VjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5sb2dnZWRJbkRlc3RpbmF0aW9ucy5oYXMocmVwb3NpdG9yeURvbWFpbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBkb2NrZXIubG9naW4ob3B0aW9ucy5lY3IpO1xuICAgICAgdGhpcy5sb2dnZWRJbkRlc3RpbmF0aW9ucy5hZGQocmVwb3NpdG9yeURvbWFpbik7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RG9ja2VyQ21kKCk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9jZXNzLmVudi5DREtfRE9DS0VSID8/ICdkb2NrZXInO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuKHg6IHN0cmluZ1tdW10pIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQoW10sIC4uLngpO1xufVxuIl19
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pathExists = pathExists;
|
|
4
|
+
exports.emptyDirSync = emptyDirSync;
|
|
5
|
+
exports.rmRfSync = rmRfSync;
|
|
6
|
+
const fs = require("fs");
|
|
7
|
+
const path = require("path");
|
|
8
|
+
const pfs = fs.promises;
|
|
9
|
+
async function pathExists(pathName) {
|
|
10
|
+
try {
|
|
11
|
+
await pfs.stat(pathName);
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
catch (e) {
|
|
15
|
+
if (e.code !== 'ENOENT') {
|
|
16
|
+
throw e;
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function emptyDirSync(dir) {
|
|
22
|
+
fs.readdirSync(dir, { withFileTypes: true }).forEach((dirent) => {
|
|
23
|
+
const fullPath = path.join(dir, dirent.name);
|
|
24
|
+
if (dirent.isDirectory()) {
|
|
25
|
+
emptyDirSync(fullPath);
|
|
26
|
+
fs.rmdirSync(fullPath);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
fs.unlinkSync(fullPath);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function rmRfSync(dir) {
|
|
34
|
+
emptyDirSync(dir);
|
|
35
|
+
fs.rmdirSync(dir);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMtZXh0cmEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJmcy1leHRyYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUtBLGdDQVVDO0FBRUQsb0NBVUM7QUFFRCw0QkFHQztBQWhDRCx5QkFBeUI7QUFDekIsNkJBQTZCO0FBRTdCLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7QUFFakIsS0FBSyxVQUFVLFVBQVUsQ0FBQyxRQUFnQjtJQUMvQyxJQUFJLENBQUM7UUFDSCxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDeEIsTUFBTSxDQUFDLENBQUM7UUFDVixDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQWdCLFlBQVksQ0FBQyxHQUFXO0lBQ3RDLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDOUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDekIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZCLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekIsQ0FBQzthQUFNLENBQUM7WUFDTixFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFnQixRQUFRLENBQUMsR0FBVztJQUNsQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuY29uc3QgcGZzID0gZnMucHJvbWlzZXM7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXRoRXhpc3RzKHBhdGhOYW1lOiBzdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBwZnMuc3RhdChwYXRoTmFtZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgIGlmIChlLmNvZGUgIT09ICdFTk9FTlQnKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5RGlyU3luYyhkaXI6IHN0cmluZykge1xuICBmcy5yZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KS5mb3JFYWNoKChkaXJlbnQpID0+IHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXIsIGRpcmVudC5uYW1lKTtcbiAgICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGVtcHR5RGlyU3luYyhmdWxsUGF0aCk7XG4gICAgICBmcy5ybWRpclN5bmMoZnVsbFBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcy51bmxpbmtTeW5jKGZ1bGxQYXRoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcm1SZlN5bmMoZGlyOiBzdHJpbmcpIHtcbiAgZW1wdHlEaXJTeW5jKGRpcik7XG4gIGZzLnJtZGlyU3luYyhkaXIpO1xufVxuIl19
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.destinationToClientOptions = destinationToClientOptions;
|
|
4
|
+
function destinationToClientOptions(destination) {
|
|
5
|
+
return {
|
|
6
|
+
assumeRoleArn: destination.assumeRoleArn,
|
|
7
|
+
assumeRoleExternalId: destination.assumeRoleExternalId,
|
|
8
|
+
assumeRoleAdditionalOptions: destination.assumeRoleAdditionalOptions,
|
|
9
|
+
region: destination.region,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LW9wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjbGllbnQtb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLGdFQU9DO0FBUEQsU0FBZ0IsMEJBQTBCLENBQUMsV0FBMkI7SUFDcEUsT0FBTztRQUNMLGFBQWEsRUFBRSxXQUFXLENBQUMsYUFBYTtRQUN4QyxvQkFBb0IsRUFBRSxXQUFXLENBQUMsb0JBQW9CO1FBQ3RELDJCQUEyQixFQUFFLFdBQVcsQ0FBQywyQkFBMkI7UUFDcEUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNO0tBQzNCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBd3NEZXN0aW5hdGlvbiB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgdHlwZSB7IENsaWVudE9wdGlvbnMgfSBmcm9tICcuLi8uLi9hd3MnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVzdGluYXRpb25Ub0NsaWVudE9wdGlvbnMoZGVzdGluYXRpb246IEF3c0Rlc3RpbmF0aW9uKTogQ2xpZW50T3B0aW9ucyB7XG4gIHJldHVybiB7XG4gICAgYXNzdW1lUm9sZUFybjogZGVzdGluYXRpb24uYXNzdW1lUm9sZUFybixcbiAgICBhc3N1bWVSb2xlRXh0ZXJuYWxJZDogZGVzdGluYXRpb24uYXNzdW1lUm9sZUV4dGVybmFsSWQsXG4gICAgYXNzdW1lUm9sZUFkZGl0aW9uYWxPcHRpb25zOiBkZXN0aW5hdGlvbi5hc3N1bWVSb2xlQWRkaXRpb25hbE9wdGlvbnMsXG4gICAgcmVnaW9uOiBkZXN0aW5hdGlvbi5yZWdpb24sXG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { DockerImageManifestEntry } from '../../asset-manifest';
|
|
2
|
+
import { IAssetHandler, IHandlerHost, IHandlerOptions } from '../asset-handler';
|
|
3
|
+
export declare class ContainerImageAssetHandler implements IAssetHandler {
|
|
4
|
+
private readonly workDir;
|
|
5
|
+
private readonly asset;
|
|
6
|
+
private readonly host;
|
|
7
|
+
private readonly options;
|
|
8
|
+
private init?;
|
|
9
|
+
constructor(workDir: string, asset: DockerImageManifestEntry, host: IHandlerHost, options: IHandlerOptions);
|
|
10
|
+
build(): Promise<void>;
|
|
11
|
+
isPublished(): Promise<boolean>;
|
|
12
|
+
publish(): Promise<void>;
|
|
13
|
+
private initOnce;
|
|
14
|
+
/**
|
|
15
|
+
* Check whether the image already exists in the ECR repo
|
|
16
|
+
*
|
|
17
|
+
* Use the fields from the destination to do the actual check. The imageUri
|
|
18
|
+
* should correspond to that, but is only used to print Docker image location
|
|
19
|
+
* for user benefit (the format is slightly different).
|
|
20
|
+
*/
|
|
21
|
+
private destinationAlreadyExists;
|
|
22
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ContainerImageAssetHandler = void 0;
|
|
4
|
+
const path = require("path");
|
|
5
|
+
const client_options_1 = require("./client-options");
|
|
6
|
+
const progress_1 = require("../../progress");
|
|
7
|
+
const placeholders_1 = require("../placeholders");
|
|
8
|
+
const shell_1 = require("../shell");
|
|
9
|
+
class ContainerImageAssetHandler {
|
|
10
|
+
constructor(workDir, asset, host, options) {
|
|
11
|
+
this.workDir = workDir;
|
|
12
|
+
this.asset = asset;
|
|
13
|
+
this.host = host;
|
|
14
|
+
this.options = options;
|
|
15
|
+
}
|
|
16
|
+
async build() {
|
|
17
|
+
const initOnce = await this.initOnce();
|
|
18
|
+
if (initOnce.destinationAlreadyExists) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (this.host.aborted) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
const dockerForBuilding = await this.host.dockerFactory.forBuild({
|
|
25
|
+
repoUri: initOnce.repoUri,
|
|
26
|
+
eventEmitter: (m) => this.host.emitMessage(progress_1.EventType.DEBUG, m),
|
|
27
|
+
ecr: initOnce.ecr,
|
|
28
|
+
subprocessOutputDestination: this.options.subprocessOutputDestination,
|
|
29
|
+
});
|
|
30
|
+
const builder = new ContainerImageBuilder(dockerForBuilding, this.workDir, this.asset, this.host);
|
|
31
|
+
const localTagName = await builder.build();
|
|
32
|
+
if (localTagName === undefined || this.host.aborted) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (this.host.aborted) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
await dockerForBuilding.tag(localTagName, initOnce.imageUri);
|
|
39
|
+
}
|
|
40
|
+
async isPublished() {
|
|
41
|
+
try {
|
|
42
|
+
const initOnce = await this.initOnce({ quiet: true });
|
|
43
|
+
return initOnce.destinationAlreadyExists;
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
this.host.emitMessage(progress_1.EventType.DEBUG, `${e.message}`);
|
|
47
|
+
}
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
async publish() {
|
|
51
|
+
const initOnce = await this.initOnce();
|
|
52
|
+
if (initOnce.destinationAlreadyExists) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (this.host.aborted) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const dockerForPushing = await this.host.dockerFactory.forEcrPush({
|
|
59
|
+
repoUri: initOnce.repoUri,
|
|
60
|
+
eventEmitter: this.host.emitMessage,
|
|
61
|
+
ecr: initOnce.ecr,
|
|
62
|
+
subprocessOutputDestination: this.options.subprocessOutputDestination,
|
|
63
|
+
});
|
|
64
|
+
if (this.host.aborted) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
this.host.emitMessage(progress_1.EventType.UPLOAD, `Push ${initOnce.imageUri}`);
|
|
68
|
+
await dockerForPushing.push({
|
|
69
|
+
tag: initOnce.imageUri,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
async initOnce(options = {}) {
|
|
73
|
+
if (this.init) {
|
|
74
|
+
return this.init;
|
|
75
|
+
}
|
|
76
|
+
const destination = await (0, placeholders_1.replaceAwsPlaceholders)(this.asset.destination, this.host.aws);
|
|
77
|
+
const ecr = await this.host.aws.ecrClient({
|
|
78
|
+
...(0, client_options_1.destinationToClientOptions)(destination),
|
|
79
|
+
quiet: options.quiet,
|
|
80
|
+
});
|
|
81
|
+
const account = async () => (await this.host.aws.discoverCurrentAccount())?.accountId;
|
|
82
|
+
const repoUri = await repositoryUri(ecr, destination.repositoryName);
|
|
83
|
+
if (!repoUri) {
|
|
84
|
+
throw new Error(`No ECR repository named '${destination.repositoryName}' in account ${await account()}. Is this account bootstrapped?`);
|
|
85
|
+
}
|
|
86
|
+
const imageUri = `${repoUri}:${destination.imageTag}`;
|
|
87
|
+
this.init = {
|
|
88
|
+
imageUri,
|
|
89
|
+
ecr,
|
|
90
|
+
repoUri,
|
|
91
|
+
destinationAlreadyExists: await this.destinationAlreadyExists(ecr, destination, imageUri),
|
|
92
|
+
};
|
|
93
|
+
return this.init;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Check whether the image already exists in the ECR repo
|
|
97
|
+
*
|
|
98
|
+
* Use the fields from the destination to do the actual check. The imageUri
|
|
99
|
+
* should correspond to that, but is only used to print Docker image location
|
|
100
|
+
* for user benefit (the format is slightly different).
|
|
101
|
+
*/
|
|
102
|
+
async destinationAlreadyExists(ecr, destination, imageUri) {
|
|
103
|
+
this.host.emitMessage(progress_1.EventType.CHECK, `Check ${imageUri}`);
|
|
104
|
+
if (await imageExists(ecr, destination.repositoryName, destination.imageTag)) {
|
|
105
|
+
this.host.emitMessage(progress_1.EventType.FOUND, `Found ${imageUri}`);
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.ContainerImageAssetHandler = ContainerImageAssetHandler;
|
|
112
|
+
class ContainerImageBuilder {
|
|
113
|
+
constructor(docker, workDir, asset, host) {
|
|
114
|
+
this.docker = docker;
|
|
115
|
+
this.workDir = workDir;
|
|
116
|
+
this.asset = asset;
|
|
117
|
+
this.host = host;
|
|
118
|
+
}
|
|
119
|
+
async build() {
|
|
120
|
+
return this.asset.source.executable
|
|
121
|
+
? this.buildExternalAsset(this.asset.source.executable)
|
|
122
|
+
: this.buildDirectoryAsset();
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Build a (local) Docker asset from a directory with a Dockerfile
|
|
126
|
+
*
|
|
127
|
+
* Tags under a deterministic, unique, local identifier wich will skip
|
|
128
|
+
* the build if it already exists.
|
|
129
|
+
*/
|
|
130
|
+
async buildDirectoryAsset() {
|
|
131
|
+
const localTagName = `cdkasset-${this.asset.id.assetId.toLowerCase()}`;
|
|
132
|
+
if (!(await this.isImageCached(localTagName))) {
|
|
133
|
+
if (this.host.aborted) {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
await this.buildImage(localTagName);
|
|
137
|
+
}
|
|
138
|
+
return localTagName;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Build a (local) Docker asset by running an external command
|
|
142
|
+
*
|
|
143
|
+
* External command is responsible for deduplicating the build if possible,
|
|
144
|
+
* and is expected to return the generated image identifier on stdout.
|
|
145
|
+
*/
|
|
146
|
+
async buildExternalAsset(executable, cwd) {
|
|
147
|
+
const assetPath = cwd ?? this.workDir;
|
|
148
|
+
this.host.emitMessage(progress_1.EventType.BUILD, `Building Docker image using command '${executable}'`);
|
|
149
|
+
if (this.host.aborted) {
|
|
150
|
+
return undefined;
|
|
151
|
+
}
|
|
152
|
+
const shellEventPublisher = (0, progress_1.shellEventPublisherFromEventEmitter)(this.host.emitMessage);
|
|
153
|
+
return (await (0, shell_1.shell)(executable, {
|
|
154
|
+
cwd: assetPath,
|
|
155
|
+
shellEventPublisher,
|
|
156
|
+
subprocessOutputDestination: 'ignore',
|
|
157
|
+
})).trim();
|
|
158
|
+
}
|
|
159
|
+
async buildImage(localTagName) {
|
|
160
|
+
const source = this.asset.source;
|
|
161
|
+
if (!source.directory) {
|
|
162
|
+
throw new Error(`'directory' is expected in the DockerImage asset source, got: ${JSON.stringify(source)}`);
|
|
163
|
+
}
|
|
164
|
+
const fullPath = path.resolve(this.workDir, source.directory);
|
|
165
|
+
this.host.emitMessage(progress_1.EventType.BUILD, `Building Docker image at ${fullPath}`);
|
|
166
|
+
await this.docker.build({
|
|
167
|
+
directory: fullPath,
|
|
168
|
+
tag: localTagName,
|
|
169
|
+
buildArgs: source.dockerBuildArgs,
|
|
170
|
+
buildSecrets: source.dockerBuildSecrets,
|
|
171
|
+
buildSsh: source.dockerBuildSsh,
|
|
172
|
+
target: source.dockerBuildTarget,
|
|
173
|
+
file: source.dockerFile,
|
|
174
|
+
networkMode: source.networkMode,
|
|
175
|
+
platform: source.platform,
|
|
176
|
+
outputs: source.dockerOutputs,
|
|
177
|
+
cacheFrom: source.cacheFrom,
|
|
178
|
+
cacheTo: source.cacheTo,
|
|
179
|
+
cacheDisabled: source.cacheDisabled,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
async isImageCached(localTagName) {
|
|
183
|
+
if (await this.docker.exists(localTagName)) {
|
|
184
|
+
this.host.emitMessage(progress_1.EventType.CACHED, `Cached ${localTagName}`);
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
async function imageExists(ecr, repositoryName, imageTag) {
|
|
191
|
+
try {
|
|
192
|
+
await ecr.describeImages({
|
|
193
|
+
repositoryName,
|
|
194
|
+
imageIds: [{ imageTag }],
|
|
195
|
+
});
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
catch (e) {
|
|
199
|
+
if (e.name !== 'ImageNotFoundException') {
|
|
200
|
+
throw e;
|
|
201
|
+
}
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Return the URI for the repository with the given name
|
|
207
|
+
*
|
|
208
|
+
* Returns undefined if the repository does not exist.
|
|
209
|
+
*/
|
|
210
|
+
async function repositoryUri(ecr, repositoryName) {
|
|
211
|
+
try {
|
|
212
|
+
const response = await ecr.describeRepositories({
|
|
213
|
+
repositoryNames: [repositoryName],
|
|
214
|
+
});
|
|
215
|
+
return (response.repositories || [])[0]?.repositoryUri;
|
|
216
|
+
}
|
|
217
|
+
catch (e) {
|
|
218
|
+
if (e.name !== 'RepositoryNotFoundException') {
|
|
219
|
+
throw e;
|
|
220
|
+
}
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLWltYWdlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbnRhaW5lci1pbWFnZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBRTdCLHFEQUE4RDtBQUc5RCw2Q0FBZ0Y7QUFHaEYsa0RBQXlEO0FBQ3pELG9DQUFpQztBQVNqQyxNQUFhLDBCQUEwQjtJQUdyQyxZQUNtQixPQUFlLEVBQ2YsS0FBK0IsRUFDL0IsSUFBa0IsRUFDbEIsT0FBd0I7UUFIeEIsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNmLFVBQUssR0FBTCxLQUFLLENBQTBCO1FBQy9CLFNBQUksR0FBSixJQUFJLENBQWM7UUFDbEIsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7SUFDeEMsQ0FBQztJQUVHLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXZDLElBQUksUUFBUSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDdEMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO1lBQy9ELE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztZQUN6QixZQUFZLEVBQUUsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN0RSxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUc7WUFDakIsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQywyQkFBMkI7U0FDdEUsQ0FBQyxDQUFDO1FBRUgsTUFBTSxPQUFPLEdBQUcsSUFBSSxxQkFBcUIsQ0FDdkMsaUJBQWlC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QUFRLEdBQUcsTUFBTSxHQUFHLENBQUMsb0JBQW9CLENBQUM7WUFDOUMsZUFBZSxFQUFFLENBQUMsY0FBYyxDQUFDO1NBQ2xDLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQztJQUN6RCxDQUFDO0lBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssNkJBQTZCLEVBQUUsQ0FBQztZQUM3QyxNQUFNLENBQUMsQ0FBQztRQUNWLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBEb2NrZXJJbWFnZURlc3RpbmF0aW9uIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCB7IGRlc3RpbmF0aW9uVG9DbGllbnRPcHRpb25zIH0gZnJvbSAnLi9jbGllbnQtb3B0aW9ucyc7XG5pbXBvcnQgeyBEb2NrZXJJbWFnZU1hbmlmZXN0RW50cnkgfSBmcm9tICcuLi8uLi9hc3NldC1tYW5pZmVzdCc7XG5pbXBvcnQgdHlwZSB7IElFQ1JDbGllbnQgfSBmcm9tICcuLi8uLi9hd3MnO1xuaW1wb3J0IHsgRXZlbnRUeXBlLCBzaGVsbEV2ZW50UHVibGlzaGVyRnJvbUV2ZW50RW1pdHRlciB9IGZyb20gJy4uLy4uL3Byb2dyZXNzJztcbmltcG9ydCB7IElBc3NldEhhbmRsZXIsIElIYW5kbGVySG9zdCwgSUhhbmRsZXJPcHRpb25zIH0gZnJvbSAnLi4vYXNzZXQtaGFuZGxlcic7XG5pbXBvcnQgeyBEb2NrZXIgfSBmcm9tICcuLi9kb2NrZXInO1xuaW1wb3J0IHsgcmVwbGFjZUF3c1BsYWNlaG9sZGVycyB9IGZyb20gJy4uL3BsYWNlaG9sZGVycyc7XG5pbXBvcnQgeyBzaGVsbCB9IGZyb20gJy4uL3NoZWxsJztcblxuaW50ZXJmYWNlIENvbnRhaW5lckltYWdlQXNzZXRIYW5kbGVySW5pdCB7XG4gIHJlYWRvbmx5IGVjcjogSUVDUkNsaWVudDtcbiAgcmVhZG9ubHkgcmVwb1VyaTogc3RyaW5nO1xuICByZWFkb25seSBpbWFnZVVyaTogc3RyaW5nO1xuICByZWFkb25seSBkZXN0aW5hdGlvbkFscmVhZHlFeGlzdHM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBDb250YWluZXJJbWFnZUFzc2V0SGFuZGxlciBpbXBsZW1lbnRzIElBc3NldEhhbmRsZXIge1xuICBwcml2YXRlIGluaXQ/OiBDb250YWluZXJJbWFnZUFzc2V0SGFuZGxlckluaXQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSB3b3JrRGlyOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhc3NldDogRG9ja2VySW1hZ2VNYW5pZmVzdEVudHJ5LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaG9zdDogSUhhbmRsZXJIb3N0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogSUhhbmRsZXJPcHRpb25zLFxuICApIHt9XG5cbiAgcHVibGljIGFzeW5jIGJ1aWxkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluaXRPbmNlID0gYXdhaXQgdGhpcy5pbml0T25jZSgpO1xuXG4gICAgaWYgKGluaXRPbmNlLmRlc3RpbmF0aW9uQWxyZWFkeUV4aXN0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5ob3N0LmFib3J0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkb2NrZXJGb3JCdWlsZGluZyA9IGF3YWl0IHRoaXMuaG9zdC5kb2NrZXJGYWN0b3J5LmZvckJ1aWxkKHtcbiAgICAgIHJlcG9Vcmk6IGluaXRPbmNlLnJlcG9VcmksXG4gICAgICBldmVudEVtaXR0ZXI6IChtOiBzdHJpbmcpID0+IHRoaXMuaG9zdC5lbWl0TWVzc2FnZShFdmVudFR5cGUuREVCVUcsIG0pLFxuICAgICAgZWNyOiBpbml0T25jZS5lY3IsXG4gICAgICBzdWJwcm9jZXNzT3V0cHV0RGVzdGluYXRpb246IHRoaXMub3B0aW9ucy5zdWJwcm9jZXNzT3V0cHV0RGVzdGluYXRpb24sXG4gICAgfSk7XG5cbiAgICBjb25zdCBidWlsZGVyID0gbmV3IENvbnRhaW5lckltYWdlQnVpbGRlcihcbiAgICAgIGRvY2tlckZvckJ1aWxkaW5nLFxuICAgICAgdGhpcy53b3JrRGlyLFxuICAgICAgdGhpcy5hc3NldCxcbiAgICAgIHRoaXMuaG9zdCxcbiAgICApO1xuICAgIGNvbnN0IGxvY2FsVGFnTmFtZSA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcblxuICAgIGlmIChsb2NhbFRhZ05hbWUgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmhvc3QuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5ob3N0LmFib3J0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBkb2NrZXJGb3JCdWlsZGluZy50YWcobG9jYWxUYWdOYW1lLCBpbml0T25jZS5pbWFnZVVyaSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaXNQdWJsaXNoZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGluaXRPbmNlID0gYXdhaXQgdGhpcy5pbml0T25jZSh7IHF1aWV0OiB0cnVlIH0pO1xuICAgICAgcmV0dXJuIGluaXRPbmNlLmRlc3RpbmF0aW9uQWxyZWFkeUV4aXN0cztcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRoaXMuaG9zdC5lbWl0TWVzc2FnZShFdmVudFR5cGUuREVCVUcsIGAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHB1Ymxpc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5pdE9uY2UgPSBhd2FpdCB0aGlzLmluaXRPbmNlKCk7XG5cbiAgICBpZiAoaW5pdE9uY2UuZGVzdGluYXRpb25BbHJlYWR5RXhpc3RzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhvc3QuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRvY2tlckZvclB1c2hpbmcgPSBhd2FpdCB0aGlzLmhvc3QuZG9ja2VyRmFjdG9yeS5mb3JFY3JQdXNoKHtcbiAgICAgIHJlcG9Vcmk6IGluaXRPbmNlLnJlcG9VcmksXG4gICAgICBldmVudEVtaXR0ZXI6IHRoaXMuaG9zdC5lbWl0TWVzc2FnZSxcbiAgICAgIGVjcjogaW5pdE9uY2UuZWNyLFxuICAgICAgc3VicHJvY2Vzc091dHB1dERlc3RpbmF0aW9uOiB0aGlzLm9wdGlvbnMuc3VicHJvY2Vzc091dHB1dERlc3RpbmF0aW9uLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuaG9zdC5hYm9ydGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5ob3N0LmVtaXRNZXNzYWdlKEV2ZW50VHlwZS5VUExPQUQsIGBQdXNoICR7aW5pdE9uY2UuaW1hZ2VVcml9YCk7XG4gICAgYXdhaXQgZG9ja2VyRm9yUHVzaGluZy5wdXNoKHtcbiAgICAgIHRhZzogaW5pdE9uY2UuaW1hZ2VVcmksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRPbmNlKFxuICAgIG9wdGlvbnM6IHsgcXVpZXQ/OiBib29sZWFuIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxDb250YWluZXJJbWFnZUFzc2V0SGFuZGxlckluaXQ+IHtcbiAgICBpZiAodGhpcy5pbml0KSB7XG4gICAgICByZXR1cm4gdGhpcy5pbml0O1xuICAgIH1cblxuICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gYXdhaXQgcmVwbGFjZUF3c1BsYWNlaG9sZGVycyh0aGlzLmFzc2V0LmRlc3RpbmF0aW9uLCB0aGlzLmhvc3QuYXdzKTtcbiAgICBjb25zdCBlY3IgPSBhd2FpdCB0aGlzLmhvc3QuYXdzLmVjckNsaWVudCh7XG4gICAgICAuLi5kZXN0aW5hdGlvblRvQ2xpZW50T3B0aW9ucyhkZXN0aW5hdGlvbiksXG4gICAgICBxdWlldDogb3B0aW9ucy5xdWlldCxcbiAgICB9KTtcbiAgICBjb25zdCBhY2NvdW50ID0gYXN5bmMgKCkgPT4gKGF3YWl0IHRoaXMuaG9zdC5hd3MuZGlzY292ZXJDdXJyZW50QWNjb3VudCgpKT8uYWNjb3VudElkO1xuXG4gICAgY29uc3QgcmVwb1VyaSA9IGF3YWl0IHJlcG9zaXRvcnlVcmkoZWNyLCBkZXN0aW5hdGlvbi5yZXBvc2l0b3J5TmFtZSk7XG4gICAgaWYgKCFyZXBvVXJpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBObyBFQ1IgcmVwb3NpdG9yeSBuYW1lZCAnJHtkZXN0aW5hdGlvbi5yZXBvc2l0b3J5TmFtZX0nIGluIGFjY291bnQgJHthd2FpdCBhY2NvdW50KCl9LiBJcyB0aGlzIGFjY291bnQgYm9vdHN0cmFwcGVkP2AsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGltYWdlVXJpID0gYCR7cmVwb1VyaX06JHtkZXN0aW5hdGlvbi5pbWFnZVRhZ31gO1xuXG4gICAgdGhpcy5pbml0ID0ge1xuICAgICAgaW1hZ2VVcmksXG4gICAgICBlY3IsXG4gICAgICByZXBvVXJpLFxuICAgICAgZGVzdGluYXRpb25BbHJlYWR5RXhpc3RzOiBhd2FpdCB0aGlzLmRlc3RpbmF0aW9uQWxyZWFkeUV4aXN0cyhlY3IsIGRlc3RpbmF0aW9uLCBpbWFnZVVyaSksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmluaXQ7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciB0aGUgaW1hZ2UgYWxyZWFkeSBleGlzdHMgaW4gdGhlIEVDUiByZXBvXG4gICAqXG4gICAqIFVzZSB0aGUgZmllbGRzIGZyb20gdGhlIGRlc3RpbmF0aW9uIHRvIGRvIHRoZSBhY3R1YWwgY2hlY2suIFRoZSBpbWFnZVVyaVxuICAgKiBzaG91bGQgY29ycmVzcG9uZCB0byB0aGF0LCBidXQgaXMgb25seSB1c2VkIHRvIHByaW50IERvY2tlciBpbWFnZSBsb2NhdGlvblxuICAgKiBmb3IgdXNlciBiZW5lZml0ICh0aGUgZm9ybWF0IGlzIHNsaWdodGx5IGRpZmZlcmVudCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRlc3RpbmF0aW9uQWxyZWFkeUV4aXN0cyhcbiAgICBlY3I6IElFQ1JDbGllbnQsXG4gICAgZGVzdGluYXRpb246IERvY2tlckltYWdlRGVzdGluYXRpb24sXG4gICAgaW1hZ2VVcmk6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5ob3N0LmVtaXRNZXNzYWdlKEV2ZW50VHlwZS5DSEVDSywgYENoZWNrICR7aW1hZ2VVcml9YCk7XG4gICAgaWYgKGF3YWl0IGltYWdlRXhpc3RzKGVjciwgZGVzdGluYXRpb24ucmVwb3NpdG9yeU5hbWUsIGRlc3RpbmF0aW9uLmltYWdlVGFnKSkge1xuICAgICAgdGhpcy5ob3N0LmVtaXRNZXNzYWdlKEV2ZW50VHlwZS5GT1VORCwgYEZvdW5kICR7aW1hZ2VVcml9YCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuY2xhc3MgQ29udGFpbmVySW1hZ2VCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBkb2NrZXI6IERvY2tlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdvcmtEaXI6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFzc2V0OiBEb2NrZXJJbWFnZU1hbmlmZXN0RW50cnksXG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0OiBJSGFuZGxlckhvc3QsXG4gICkge31cblxuICBhc3luYyBidWlsZCgpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmFzc2V0LnNvdXJjZS5leGVjdXRhYmxlXG4gICAgICA/IHRoaXMuYnVpbGRFeHRlcm5hbEFzc2V0KHRoaXMuYXNzZXQuc291cmNlLmV4ZWN1dGFibGUpXG4gICAgICA6IHRoaXMuYnVpbGREaXJlY3RvcnlBc3NldCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgKGxvY2FsKSBEb2NrZXIgYXNzZXQgZnJvbSBhIGRpcmVjdG9yeSB3aXRoIGEgRG9ja2VyZmlsZVxuICAgKlxuICAgKiBUYWdzIHVuZGVyIGEgZGV0ZXJtaW5pc3RpYywgdW5pcXVlLCBsb2NhbCBpZGVudGlmaWVyIHdpY2ggd2lsbCBza2lwXG4gICAqIHRoZSBidWlsZCBpZiBpdCBhbHJlYWR5IGV4aXN0cy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYnVpbGREaXJlY3RvcnlBc3NldCgpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGxvY2FsVGFnTmFtZSA9IGBjZGthc3NldC0ke3RoaXMuYXNzZXQuaWQuYXNzZXRJZC50b0xvd2VyQ2FzZSgpfWA7XG5cbiAgICBpZiAoIShhd2FpdCB0aGlzLmlzSW1hZ2VDYWNoZWQobG9jYWxUYWdOYW1lKSkpIHtcbiAgICAgIGlmICh0aGlzLmhvc3QuYWJvcnRlZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmJ1aWxkSW1hZ2UobG9jYWxUYWdOYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbG9jYWxUYWdOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgKGxvY2FsKSBEb2NrZXIgYXNzZXQgYnkgcnVubmluZyBhbiBleHRlcm5hbCBjb21tYW5kXG4gICAqXG4gICAqIEV4dGVybmFsIGNvbW1hbmQgaXMgcmVzcG9uc2libGUgZm9yIGRlZHVwbGljYXRpbmcgdGhlIGJ1aWxkIGlmIHBvc3NpYmxlLFxuICAgKiBhbmQgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIHRoZSBnZW5lcmF0ZWQgaW1hZ2UgaWRlbnRpZmllciBvbiBzdGRvdXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJ1aWxkRXh0ZXJuYWxBc3NldChcbiAgICBleGVjdXRhYmxlOiBzdHJpbmdbXSxcbiAgICBjd2Q/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgYXNzZXRQYXRoID0gY3dkID8/IHRoaXMud29ya0RpcjtcblxuICAgIHRoaXMuaG9zdC5lbWl0TWVzc2FnZShFdmVudFR5cGUuQlVJTEQsIGBCdWlsZGluZyBEb2NrZXIgaW1hZ2UgdXNpbmcgY29tbWFuZCAnJHtleGVjdXRhYmxlfSdgKTtcbiAgICBpZiAodGhpcy5ob3N0LmFib3J0ZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hlbGxFdmVudFB1Ymxpc2hlciA9IHNoZWxsRXZlbnRQdWJsaXNoZXJGcm9tRXZlbnRFbWl0dGVyKHRoaXMuaG9zdC5lbWl0TWVzc2FnZSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgc2hlbGwoZXhlY3V0YWJsZSwge1xuICAgICAgICBjd2Q6IGFzc2V0UGF0aCxcbiAgICAgICAgc2hlbGxFdmVudFB1Ymxpc2hlcixcbiAgICAgICAgc3VicHJvY2Vzc091dHB1dERlc3RpbmF0aW9uOiAnaWdub3JlJyxcbiAgICAgIH0pXG4gICAgKS50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkSW1hZ2UobG9jYWxUYWdOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmFzc2V0LnNvdXJjZTtcbiAgICBpZiAoIXNvdXJjZS5kaXJlY3RvcnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCdkaXJlY3RvcnknIGlzIGV4cGVjdGVkIGluIHRoZSBEb2NrZXJJbWFnZSBhc3NldCBzb3VyY2UsIGdvdDogJHtKU09OLnN0cmluZ2lmeShzb3VyY2UpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMud29ya0Rpciwgc291cmNlLmRpcmVjdG9yeSk7XG4gICAgdGhpcy5ob3N0LmVtaXRNZXNzYWdlKEV2ZW50VHlwZS5CVUlMRCwgYEJ1aWxkaW5nIERvY2tlciBpbWFnZSBhdCAke2Z1bGxQYXRofWApO1xuXG4gICAgYXdhaXQgdGhpcy5kb2NrZXIuYnVpbGQoe1xuICAgICAgZGlyZWN0b3J5OiBmdWxsUGF0aCxcbiAgICAgIHRhZzogbG9jYWxUYWdOYW1lLFxuICAgICAgYnVpbGRBcmdzOiBzb3VyY2UuZG9ja2VyQnVpbGRBcmdzLFxuICAgICAgYnVpbGRTZWNyZXRzOiBzb3VyY2UuZG9ja2VyQnVpbGRTZWNyZXRzLFxuICAgICAgYnVpbGRTc2g6IHNvdXJjZS5kb2NrZXJCdWlsZFNzaCxcbiAgICAgIHRhcmdldDogc291cmNlLmRvY2tlckJ1aWxkVGFyZ2V0LFxuICAgICAgZmlsZTogc291cmNlLmRvY2tlckZpbGUsXG4gICAgICBuZXR3b3JrTW9kZTogc291cmNlLm5ldHdvcmtNb2RlLFxuICAgICAgcGxhdGZvcm06IHNvdXJjZS5wbGF0Zm9ybSxcbiAgICAgIG91dHB1dHM6IHNvdXJjZS5kb2NrZXJPdXRwdXRzLFxuICAgICAgY2FjaGVGcm9tOiBzb3VyY2UuY2FjaGVGcm9tLFxuICAgICAgY2FjaGVUbzogc291cmNlLmNhY2hlVG8sXG4gICAgICBjYWNoZURpc2FibGVkOiBzb3VyY2UuY2FjaGVEaXNhYmxlZCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaXNJbWFnZUNhY2hlZChsb2NhbFRhZ05hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmIChhd2FpdCB0aGlzLmRvY2tlci5leGlzdHMobG9jYWxUYWdOYW1lKSkge1xuICAgICAgdGhpcy5ob3N0LmVtaXRNZXNzYWdlKEV2ZW50VHlwZS5DQUNIRUQsIGBDYWNoZWQgJHtsb2NhbFRhZ05hbWV9YCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaW1hZ2VFeGlzdHMoZWNyOiBJRUNSQ2xpZW50LCByZXBvc2l0b3J5TmFtZTogc3RyaW5nLCBpbWFnZVRhZzogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZWNyLmRlc2NyaWJlSW1hZ2VzKHtcbiAgICAgIHJlcG9zaXRvcnlOYW1lLFxuICAgICAgaW1hZ2VJZHM6IFt7IGltYWdlVGFnIH1dLFxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICBpZiAoZS5uYW1lICE9PSAnSW1hZ2VOb3RGb3VuZEV4Y2VwdGlvbicpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiB0aGUgVVJJIGZvciB0aGUgcmVwb3NpdG9yeSB3aXRoIHRoZSBnaXZlbiBuYW1lXG4gKlxuICogUmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIHJlcG9zaXRvcnkgZG9lcyBub3QgZXhpc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcG9zaXRvcnlVcmkoZWNyOiBJRUNSQ2xpZW50LCByZXBvc2l0b3J5TmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGVjci5kZXNjcmliZVJlcG9zaXRvcmllcyh7XG4gICAgICByZXBvc2l0b3J5TmFtZXM6IFtyZXBvc2l0b3J5TmFtZV0sXG4gICAgfSk7XG4gICAgcmV0dXJuIChyZXNwb25zZS5yZXBvc2l0b3JpZXMgfHwgW10pWzBdPy5yZXBvc2l0b3J5VXJpO1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICBpZiAoZS5uYW1lICE9PSAnUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uJykge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FileManifestEntry } from '../../asset-manifest';
|
|
2
|
+
import { IAssetHandler, IHandlerHost, type PublishOptions } from '../asset-handler';
|
|
3
|
+
export declare class FileAssetHandler implements IAssetHandler {
|
|
4
|
+
private readonly workDir;
|
|
5
|
+
private readonly asset;
|
|
6
|
+
private readonly host;
|
|
7
|
+
private readonly fileCacheRoot;
|
|
8
|
+
constructor(workDir: string, asset: FileManifestEntry, host: IHandlerHost);
|
|
9
|
+
build(): Promise<void>;
|
|
10
|
+
isPublished(): Promise<boolean>;
|
|
11
|
+
publish(options?: PublishOptions): Promise<void>;
|
|
12
|
+
private packageFile;
|
|
13
|
+
private externalPackageFile;
|
|
14
|
+
}
|