gitlab-ci-local 4.65.1 → 4.66.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/src/commander.js DELETED
@@ -1,247 +0,0 @@
1
- import chalk from "chalk-template";
2
- import { Utils } from "./utils.js";
3
- import { Executor } from "./executor.js";
4
- import fs from "fs-extra";
5
- import { AssertionError } from "assert";
6
- export class Commander {
7
- static async runPipeline(argv, parser, writeStreams) {
8
- const jobs = parser.jobs;
9
- const stages = parser.stages;
10
- let potentialStarters = [...jobs.values()];
11
- potentialStarters = potentialStarters.filter(j => j.when !== "never");
12
- potentialStarters = potentialStarters.filter(j => j.when !== "manual" || argv.manual.includes(j.name));
13
- await Executor.runLoop(argv, jobs, stages, potentialStarters);
14
- await Commander.printReport({
15
- cwd: argv.cwd,
16
- showTimestamps: argv.showTimestamps,
17
- stateDir: argv.stateDir,
18
- writeStreams: writeStreams,
19
- jobs: jobs,
20
- stages: stages,
21
- jobNamePad: parser.jobNamePad,
22
- });
23
- }
24
- static async runJobsInStage(argv, parser, writeStreams) {
25
- const jobs = parser.jobs.filter(j => j.stage === argv.stage);
26
- const stages = parser.stages;
27
- let potentialStarters = [...jobs.values()];
28
- potentialStarters = potentialStarters.filter(j => j.when !== "never");
29
- potentialStarters = potentialStarters.filter(j => j.when !== "manual" || argv.manual.includes(j.name));
30
- potentialStarters = potentialStarters.filter(j => j.stage === argv.stage);
31
- await Executor.runLoop(argv, jobs, stages, potentialStarters);
32
- await Commander.printReport({
33
- cwd: argv.cwd,
34
- showTimestamps: argv.showTimestamps,
35
- stateDir: argv.stateDir,
36
- writeStreams: writeStreams,
37
- jobs: jobs,
38
- stages: stages,
39
- jobNamePad: parser.jobNamePad,
40
- });
41
- }
42
- static async runJobs(argv, parser, writeStreams) {
43
- const needs = argv.needs || argv.onlyNeeds;
44
- const jobArgs = argv.job;
45
- const jobs = parser.jobs;
46
- const stages = parser.stages;
47
- const potentialStarters = [];
48
- const jobSet = needs ? new Set(jobs) : new Set();
49
- jobArgs.forEach(jobArgName => {
50
- const baseJobs = jobs.filter(j => j.baseName == jobArgName || j.name === jobArgName);
51
- for (const b of baseJobs) {
52
- jobSet.add(b);
53
- if (needs) {
54
- potentialStarters.push(...Executor.getPastToWaitFor(jobs, stages, b, argv.manual));
55
- }
56
- potentialStarters.push(b);
57
- }
58
- });
59
- if (potentialStarters.length === 0) {
60
- throw new AssertionError({ message: chalk `{blueBright ${jobArgs.join(",")}} could not be found` });
61
- }
62
- const starters = argv.onlyNeeds ?
63
- potentialStarters.filter(p => !jobArgs.includes(p.name)) :
64
- potentialStarters;
65
- await Executor.runLoop(argv, Array.from(jobSet), stages, starters);
66
- await Commander.printReport({
67
- cwd: argv.cwd,
68
- showTimestamps: argv.showTimestamps,
69
- stateDir: argv.stateDir,
70
- writeStreams: writeStreams,
71
- jobs: jobs,
72
- stages: stages,
73
- jobNamePad: parser.jobNamePad,
74
- });
75
- }
76
- static async printReport({ cwd, stateDir, showTimestamps, writeStreams, jobs, stages, jobNamePad }) {
77
- writeStreams.stdout("\n");
78
- const renderDuration = (duration) => showTimestamps ? ` [${duration.padStart(7)}]` : "";
79
- const preScripts = {
80
- successful: [],
81
- failed: [],
82
- warned: [],
83
- };
84
- const afterScripts = {
85
- warned: [],
86
- };
87
- for (const job of jobs.values()) {
88
- if (job.started && job.afterScriptsExitCode !== 0) {
89
- afterScripts.warned.push(job);
90
- }
91
- }
92
- for (const job of jobs.values()) {
93
- if (!job.started) {
94
- continue;
95
- }
96
- if (job.jobStatus === "success") {
97
- preScripts.successful.push(job);
98
- }
99
- else if (job.jobStatus === "warning") {
100
- preScripts.warned.push(job);
101
- }
102
- else {
103
- preScripts.failed.push(job);
104
- }
105
- }
106
- if (preScripts.successful.length !== 0) {
107
- preScripts.successful.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
108
- preScripts.successful.forEach(({ argv, coveragePercent, name, prettyDuration }) => {
109
- let prefix = "";
110
- if (argv.childPipelineDepth > 0)
111
- prefix = `[${argv.variable.GCL_TRIGGERER}] -> `;
112
- const namePad = name.padEnd(jobNamePad);
113
- writeStreams.stdout(chalk `{black.bgGreenBright PASS }${renderDuration(prettyDuration)} {blueBright ${prefix}${namePad}}`);
114
- if (coveragePercent) {
115
- writeStreams.stdout(chalk ` ${coveragePercent}% {grey coverage}`);
116
- }
117
- writeStreams.stdout("\n");
118
- });
119
- }
120
- if (preScripts.warned.length !== 0) {
121
- preScripts.warned.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
122
- for (const { name, prettyDuration } of preScripts.warned) {
123
- const namePad = name.padEnd(jobNamePad);
124
- const safeName = Utils.safeDockerString(name);
125
- writeStreams.stdout(chalk `{black.bgYellowBright WARN }${renderDuration(prettyDuration)} {blueBright ${namePad}} pre_script\n`);
126
- const outputLog = await fs.readFile(`${cwd}/${stateDir}/output/${safeName}.log`, "utf8");
127
- for (const line of outputLog.split(/\r?\n/).filter(j => !j.includes("[32m$ ")).filter(j => j !== "").slice(-3)) {
128
- writeStreams.stdout(chalk ` {yellow >} ${line}\n`);
129
- }
130
- }
131
- }
132
- if (afterScripts.warned.length !== 0) {
133
- afterScripts.warned.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
134
- afterScripts.warned.forEach(({ name, prettyDuration }) => {
135
- const namePad = name.padEnd(jobNamePad);
136
- writeStreams.stdout(chalk `{black.bgYellowBright WARN }${renderDuration(prettyDuration)} {blueBright ${namePad}} after_script\n`);
137
- });
138
- }
139
- if (preScripts.failed.length !== 0) {
140
- preScripts.failed.sort((a, b) => stages.indexOf(a.stage) - stages.indexOf(b.stage));
141
- for (const { name, prettyDuration } of preScripts.failed) {
142
- const namePad = name.padEnd(jobNamePad);
143
- const safeName = Utils.safeDockerString(name);
144
- writeStreams.stdout(chalk `{black.bgRed FAIL }${renderDuration(prettyDuration)} {blueBright ${namePad}}\n`);
145
- const outputLog = await fs.readFile(`${cwd}/${stateDir}/output/${safeName}.log`, "utf8");
146
- for (const line of outputLog.split(/\r?\n/).filter(j => !j.includes("[32m$ ")).filter(j => j !== "").slice(-3)) {
147
- writeStreams.stdout(chalk ` {red >} ${line}\n`);
148
- }
149
- }
150
- }
151
- for (const job of preScripts.successful) {
152
- const e = job.environment;
153
- if (e == null) {
154
- continue;
155
- }
156
- const name = e.name;
157
- const url = e.url;
158
- writeStreams.stdout(chalk `{blueBright ${job.name}} environment: \{ name: {bold ${name}}`);
159
- if (url != null) {
160
- writeStreams.stdout(chalk `, url: {bold ${url}}`);
161
- }
162
- writeStreams.stdout(" }\n");
163
- }
164
- }
165
- static runList(parser, writeStreams, listAll) {
166
- const stages = parser.stages;
167
- let jobs = [...parser.jobs.values()];
168
- jobs.sort((a, b) => {
169
- return stages.indexOf(a.stage) - stages.indexOf(b.stage);
170
- });
171
- let whenPadEnd = 4;
172
- jobs.forEach(j => whenPadEnd = Math.max(j.when.length, whenPadEnd));
173
- let stagePadEnd = 5;
174
- stages.forEach(s => stagePadEnd = Math.max(s.length, stagePadEnd));
175
- let descriptionPadEnd = 11;
176
- jobs.forEach(j => descriptionPadEnd = Math.max(j.description.length, descriptionPadEnd));
177
- const jobNamePad = parser.jobNamePad;
178
- if (!listAll) {
179
- jobs = jobs.filter(j => j.when !== "never");
180
- }
181
- writeStreams.stdout(chalk `{grey ${"name".padEnd(jobNamePad)} ${"description".padEnd(descriptionPadEnd)}} `);
182
- writeStreams.stdout(chalk `{grey ${"stage".padEnd(stagePadEnd)} ${"when".padEnd(whenPadEnd)}} `);
183
- writeStreams.stdout(chalk `{grey allow_failure needs}\n`);
184
- const renderLine = (job) => {
185
- const needs = job.needs?.filter(n => !n.project && !n.pipeline).map(n => n.job);
186
- const allowFailure = job.allowFailure ? "true " : "false ";
187
- let jobLine = chalk `{blueBright ${job.name.padEnd(jobNamePad)}} ${job.description.padEnd(descriptionPadEnd)} `;
188
- jobLine += chalk `{yellow ${job.stage.padEnd(stagePadEnd)}} ${job.when.padEnd(whenPadEnd)} ${allowFailure.padEnd(11)}`;
189
- if (needs) {
190
- jobLine += chalk ` [{blueBright ${needs}}]`;
191
- }
192
- writeStreams.stdout(`${jobLine}\n`);
193
- };
194
- jobs.forEach((job) => renderLine(job));
195
- }
196
- static runJson(parser, writeStreams) {
197
- const jobs = [...parser.jobs.values()];
198
- const json = [];
199
- jobs.forEach((job) => {
200
- json.push({
201
- name: job.name,
202
- description: job.description,
203
- stage: job.stage,
204
- when: job.when,
205
- allow_failure: job.allowFailure,
206
- needs: job.needs?.filter(n => !n.project && !n.pipeline),
207
- ...job.rules ? { rules: job.rules } : {},
208
- });
209
- });
210
- writeStreams.stdout(`${JSON.stringify(json, null, 2)}\n`);
211
- }
212
- static runCsv(parser, writeStreams, all) {
213
- const stages = parser.stages;
214
- let jobs = [...parser.jobs.values()];
215
- jobs.sort((a, b) => {
216
- return stages.indexOf(a.stage) - stages.indexOf(b.stage);
217
- });
218
- if (!all) {
219
- jobs = jobs.filter(j => j.when !== "never");
220
- }
221
- writeStreams.stdout("name;description;stage;when;allowFailure;needs\n");
222
- jobs.forEach((job) => {
223
- const needs = job.needs?.filter(n => !n.project && !n.pipeline).map(n => n.job).join(",") ?? [];
224
- writeStreams.stdout(`${job.name};"${job.description}";${job.stage};${job.when};${job.allowFailure ? "true" : "false"};[${needs}]\n`);
225
- });
226
- }
227
- static validateDependencyChain(parser) {
228
- const allJobs = parser.jobs;
229
- // This is only the jobs that will actually run
230
- const activeJobs = allJobs.filter(j => j.when !== "never");
231
- const stages = parser.stages;
232
- // This will throw an assertion errror if the dependency chain is broken due to needs keyword on specific events without having to run the full pipeline
233
- Executor.getStartCandidates(allJobs, stages, activeJobs, []);
234
- const activeJobNames = new Set(activeJobs.map(job => job.name));
235
- // This willl throw an assertion error if the dependency chain is broken due to dependencies keyword (a job depending on artifacts from a job that will never run) without having to run the full pipeline
236
- for (const job of activeJobs) {
237
- if (job.dependencies) {
238
- for (const dependency of job.dependencies) {
239
- if (!activeJobNames.has(dependency)) {
240
- throw new AssertionError({ message: chalk `{blueBright ${dependency}} is when:never, but its depended on by {blueBright ${job.name}}` });
241
- }
242
- }
243
- }
244
- }
245
- }
246
- }
247
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbWFuZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBR25DLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFakMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFMUIsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUV0QyxNQUFNLE9BQU8sU0FBUztJQUVsQixNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBRSxJQUFVLEVBQUUsTUFBYyxFQUFFLFlBQTBCO1FBQzVFLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUU3QixJQUFJLGlCQUFpQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMzQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDO1FBQ3RFLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3ZHLE1BQU0sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlELE1BQU0sU0FBUyxDQUFDLFdBQVcsQ0FBQztZQUN4QixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7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Q0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7d0JBQ2xDLE1BQU0sSUFBSSxjQUFjLENBQUMsRUFBQyxPQUFPLEVBQUUsS0FBSyxDQUFBLGVBQWUsVUFBVSx1REFBdUQsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFDLENBQUMsQ0FBQztvQkFDMUksQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrLXRlbXBsYXRlXCI7XG5pbXBvcnQge0pvYn0gZnJvbSBcIi4vam9iLmpzXCI7XG5pbXBvcnQge1BhcnNlcn0gZnJvbSBcIi4vcGFyc2VyLmpzXCI7XG5pbXBvcnQge1V0aWxzfSBmcm9tIFwiLi91dGlscy5qc1wiO1xuaW1wb3J0IHtXcml0ZVN0cmVhbXN9IGZyb20gXCIuL3dyaXRlLXN0cmVhbXMuanNcIjtcbmltcG9ydCB7RXhlY3V0b3J9IGZyb20gXCIuL2V4ZWN1dG9yLmpzXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCI7XG5pbXBvcnQge0FyZ3Z9IGZyb20gXCIuL2FyZ3YuanNcIjtcbmltcG9ydCB7QXNzZXJ0aW9uRXJyb3J9IGZyb20gXCJhc3NlcnRcIjtcblxuZXhwb3J0IGNsYXNzIENvbW1hbmRlciB7XG5cbiAgICBzdGF0aWMgYXN5bmMgcnVuUGlwZWxpbmUgKGFyZ3Y6IEFyZ3YsIHBhcnNlcjogUGFyc2VyLCB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcykge1xuICAgICAgICBjb25zdCBqb2JzID0gcGFyc2VyLmpvYnM7XG4gICAgICAgIGNvbnN0IHN0YWdlcyA9IHBhcnNlci5zdGFnZXM7XG5cbiAgICAgICAgbGV0IHBvdGVudGlhbFN0YXJ0ZXJzID0gWy4uLmpvYnMudmFsdWVzKCldO1xuICAgICAgICBwb3RlbnRpYWxTdGFydGVycyA9IHBvdGVudGlhbFN0YXJ0ZXJzLmZpbHRlcihqID0+IGoud2hlbiAhPT0gXCJuZXZlclwiKTtcbiAgICAgICAgcG90ZW50aWFsU3RhcnRlcnMgPSBwb3RlbnRpYWxTdGFydGVycy5maWx0ZXIoaiA9PiBqLndoZW4gIT09IFwibWFudWFsXCIgfHwgYXJndi5tYW51YWwuaW5jbHVkZXMoai5uYW1lKSk7XG4gICAgICAgIGF3YWl0IEV4ZWN1dG9yLnJ1bkxvb3AoYXJndiwgam9icywgc3RhZ2VzLCBwb3RlbnRpYWxTdGFydGVycyk7XG4gICAgICAgIGF3YWl0IENvbW1hbmRlci5wcmludFJlcG9ydCh7XG4gICAgICAgICAgICBjd2Q6IGFyZ3YuY3dkLFxuICAgICAgICAgICAgc2hvd1RpbWVzdGFtcHM6IGFyZ3Yuc2hvd1RpbWVzdGFtcHMsXG4gICAgICAgICAgICBzdGF0ZURpcjogYXJndi5zdGF0ZURpcixcbiAgICAgICAgICAgIHdyaXRlU3RyZWFtczogd3JpdGVTdHJlYW1zLFxuICAgICAgICAgICAgam9iczogam9icyxcbiAgICAgICAgICAgIHN0YWdlczogc3RhZ2VzLFxuICAgICAgICAgICAgam9iTmFtZVBhZDogcGFyc2VyLmpvYk5hbWVQYWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3luYyBydW5Kb2JzSW5TdGFnZSAoYXJndjogQXJndiwgcGFyc2VyOiBQYXJzZXIsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKSB7XG4gICAgICAgIGNvbnN0IGpvYnMgPSBwYXJzZXIuam9icy5maWx0ZXIoaiA9PiBqLnN0YWdlID09PSBhcmd2LnN0YWdlKTtcbiAgICAgICAgY29uc3Qgc3RhZ2VzID0gcGFyc2VyLnN0YWdlcztcblxuICAgICAgICBsZXQgcG90ZW50aWFsU3RhcnRlcnMgPSBbLi4uam9icy52YWx1ZXMoKV07XG4gICAgICAgIHBvdGVudGlhbFN0YXJ0ZXJzID0gcG90ZW50aWFsU3RhcnRlcnMuZmlsdGVyKGogPT4gai53aGVuICE9PSBcIm5ldmVyXCIpO1xuICAgICAgICBwb3RlbnRpYWxTdGFydGVycyA9IHBvdGVudGlhbFN0YXJ0ZXJzLmZpbHRlcihqID0+IGoud2hlbiAhPT0gXCJtYW51YWxcIiB8fCBhcmd2Lm1hbnVhbC5pbmNsdWRlcyhqLm5hbWUpKTtcbiAgICAgICAgcG90ZW50aWFsU3RhcnRlcnMgPSBwb3RlbnRpYWxTdGFydGVycy5maWx0ZXIoaiA9PiBqLnN0YWdlID09PSBhcmd2LnN0YWdlKTtcbiAgICAgICAgYXdhaXQgRXhlY3V0b3IucnVuTG9vcChhcmd2LCBqb2JzLCBzdGFnZXMsIHBvdGVudGlhbFN0YXJ0ZXJzKTtcbiAgICAgICAgYXdhaXQgQ29tbWFuZGVyLnByaW50UmVwb3J0KHtcbiAgICAgICAgICAgIGN3ZDogYXJndi5jd2QsXG4gICAgICAgICAgICBzaG93VGltZXN0YW1wczogYXJndi5zaG93VGltZXN0YW1wcyxcbiAgICAgICAgICAgIHN0YXRlRGlyOiBhcmd2LnN0YXRlRGlyLFxuICAgICAgICAgICAgd3JpdGVTdHJlYW1zOiB3cml0ZVN0cmVhbXMsXG4gICAgICAgICAgICBqb2JzOiBqb2JzLFxuICAgICAgICAgICAgc3RhZ2VzOiBzdGFnZXMsXG4gICAgICAgICAgICBqb2JOYW1lUGFkOiBwYXJzZXIuam9iTmFtZVBhZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIHJ1bkpvYnMgKGFyZ3Y6IEFyZ3YsIHBhcnNlcjogUGFyc2VyLCB3cml0ZVN0cmVhbXM6IFdyaXRlU3RyZWFtcykge1xuICAgICAgICBjb25zdCBuZWVkcyA9IGFyZ3YubmVlZHMgfHwgYXJndi5vbmx5TmVlZHM7XG4gICAgICAgIGNvbnN0IGpvYkFyZ3MgPSBhcmd2LmpvYjtcbiAgICAgICAgY29uc3Qgam9icyA9IHBhcnNlci5qb2JzO1xuICAgICAgICBjb25zdCBzdGFnZXMgPSBwYXJzZXIuc3RhZ2VzO1xuXG4gICAgICAgIGNvbnN0IHBvdGVudGlhbFN0YXJ0ZXJzOiBKb2JbXSA9IFtdO1xuICAgICAgICBjb25zdCBqb2JTZXQgPSBuZWVkcyA/IG5ldyBTZXQoam9icykgOiBuZXcgU2V0PEpvYj4oKTtcbiAgICAgICAgam9iQXJncy5mb3JFYWNoKGpvYkFyZ05hbWUgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmFzZUpvYnMgPSBqb2JzLmZpbHRlcihqID0+IGouYmFzZU5hbWUgPT0gam9iQXJnTmFtZSB8fCBqLm5hbWUgPT09IGpvYkFyZ05hbWUpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBiIG9mIGJhc2VKb2JzKSB7XG4gICAgICAgICAgICAgICAgam9iU2V0LmFkZChiKTtcbiAgICAgICAgICAgICAgICBpZiAobmVlZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsU3RhcnRlcnMucHVzaCguLi5FeGVjdXRvci5nZXRQYXN0VG9XYWl0Rm9yKGpvYnMsIHN0YWdlcywgYiwgYXJndi5tYW51YWwpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcG90ZW50aWFsU3RhcnRlcnMucHVzaChiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHBvdGVudGlhbFN0YXJ0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKHttZXNzYWdlOiBjaGFsa2B7Ymx1ZUJyaWdodCAke2pvYkFyZ3Muam9pbihcIixcIil9fSBjb3VsZCBub3QgYmUgZm91bmRgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGFydGVycyA9IGFyZ3Yub25seU5lZWRzID9cbiAgICAgICAgICAgIHBvdGVudGlhbFN0YXJ0ZXJzLmZpbHRlcihwID0+ICFqb2JBcmdzLmluY2x1ZGVzKHAubmFtZSkpIDpcbiAgICAgICAgICAgIHBvdGVudGlhbFN0YXJ0ZXJzO1xuXG4gICAgICAgIGF3YWl0IEV4ZWN1dG9yLnJ1bkxvb3AoYXJndiwgQXJyYXkuZnJvbShqb2JTZXQpLCBzdGFnZXMsIHN0YXJ0ZXJzKTtcbiAgICAgICAgYXdhaXQgQ29tbWFuZGVyLnByaW50UmVwb3J0KHtcbiAgICAgICAgICAgIGN3ZDogYXJndi5jd2QsXG4gICAgICAgICAgICBzaG93VGltZXN0YW1wczogYXJndi5zaG93VGltZXN0YW1wcyxcbiAgICAgICAgICAgIHN0YXRlRGlyOiBhcmd2LnN0YXRlRGlyLFxuICAgICAgICAgICAgd3JpdGVTdHJlYW1zOiB3cml0ZVN0cmVhbXMsXG4gICAgICAgICAgICBqb2JzOiBqb2JzLFxuICAgICAgICAgICAgc3RhZ2VzOiBzdGFnZXMsXG4gICAgICAgICAgICBqb2JOYW1lUGFkOiBwYXJzZXIuam9iTmFtZVBhZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIHByaW50UmVwb3J0ICh7Y3dkLCBzdGF0ZURpciwgc2hvd1RpbWVzdGFtcHMsIHdyaXRlU3RyZWFtcywgam9icywgc3RhZ2VzLCBqb2JOYW1lUGFkfToge1xuICAgICAgICBjd2Q6IHN0cmluZztcbiAgICAgICAgc2hvd1RpbWVzdGFtcHM6IGJvb2xlYW47XG4gICAgICAgIHN0YXRlRGlyOiBzdHJpbmc7XG4gICAgICAgIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zO1xuICAgICAgICBqb2JzOiBSZWFkb25seUFycmF5PEpvYj47XG4gICAgICAgIHN0YWdlczogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgICAgIGpvYk5hbWVQYWQ6IG51bWJlcjtcbiAgICB9KSB7XG5cbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChcIlxcblwiKTtcblxuICAgICAgICBjb25zdCByZW5kZXJEdXJhdGlvbiA9IChkdXJhdGlvbjogc3RyaW5nKSA9PiBzaG93VGltZXN0YW1wcyA/IGAgWyR7ZHVyYXRpb24ucGFkU3RhcnQoNyl9XWAgOiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IHByZVNjcmlwdHM6IHtzdWNjZXNzZnVsOiBKb2JbXTsgZmFpbGVkOiBKb2JbXTsgd2FybmVkOiBKb2JbXX0gPSB7XG4gICAgICAgICAgICBzdWNjZXNzZnVsOiBbXSxcbiAgICAgICAgICAgIGZhaWxlZDogW10sXG4gICAgICAgICAgICB3YXJuZWQ6IFtdLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBhZnRlclNjcmlwdHM6IHt3YXJuZWQ6IEpvYltdfSA9IHtcbiAgICAgICAgICAgIHdhcm5lZDogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChjb25zdCBqb2Igb2Ygam9icy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKGpvYi5zdGFydGVkICYmIGpvYi5hZnRlclNjcmlwdHNFeGl0Q29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGFmdGVyU2NyaXB0cy53YXJuZWQucHVzaChqb2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBqb2Igb2Ygam9icy52YWx1ZXMoKSkge1xuICAgICAgICAgICAgaWYgKCFqb2Iuc3RhcnRlZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoam9iLmpvYlN0YXR1cyA9PT0gXCJzdWNjZXNzXCIpIHtcbiAgICAgICAgICAgICAgICBwcmVTY3JpcHRzLnN1Y2Nlc3NmdWwucHVzaChqb2IpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChqb2Iuam9iU3RhdHVzID09PSBcIndhcm5pbmdcIikge1xuICAgICAgICAgICAgICAgIHByZVNjcmlwdHMud2FybmVkLnB1c2goam9iKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJlU2NyaXB0cy5mYWlsZWQucHVzaChqb2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByZVNjcmlwdHMuc3VjY2Vzc2Z1bC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHByZVNjcmlwdHMuc3VjY2Vzc2Z1bC5zb3J0KChhLCBiKSA9PiBzdGFnZXMuaW5kZXhPZihhLnN0YWdlKSAtIHN0YWdlcy5pbmRleE9mKGIuc3RhZ2UpKTtcbiAgICAgICAgICAgIHByZVNjcmlwdHMuc3VjY2Vzc2Z1bC5mb3JFYWNoKCh7YXJndiwgY292ZXJhZ2VQZXJjZW50LCBuYW1lLCBwcmV0dHlEdXJhdGlvbn0pID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcHJlZml4ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoYXJndi5jaGlsZFBpcGVsaW5lRGVwdGggPiAwKSBwcmVmaXggPSBgWyR7YXJndi52YXJpYWJsZS5HQ0xfVFJJR0dFUkVSfV0gLT4gYDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVQYWQgPSBuYW1lLnBhZEVuZChqb2JOYW1lUGFkKTtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtibGFjay5iZ0dyZWVuQnJpZ2h0ICBQQVNTIH0ke3JlbmRlckR1cmF0aW9uKHByZXR0eUR1cmF0aW9uKX0ge2JsdWVCcmlnaHQgJHtwcmVmaXh9JHtuYW1lUGFkfX1gKTtcbiAgICAgICAgICAgICAgICBpZiAoY292ZXJhZ2VQZXJjZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgICR7Y292ZXJhZ2VQZXJjZW50fSUge2dyZXkgY292ZXJhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoXCJcXG5cIik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmVTY3JpcHRzLndhcm5lZC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHByZVNjcmlwdHMud2FybmVkLnNvcnQoKGEsIGIpID0+IHN0YWdlcy5pbmRleE9mKGEuc3RhZ2UpIC0gc3RhZ2VzLmluZGV4T2YoYi5zdGFnZSkpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB7bmFtZSwgcHJldHR5RHVyYXRpb259IG9mIHByZVNjcmlwdHMud2FybmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZVBhZCA9IG5hbWUucGFkRW5kKGpvYk5hbWVQYWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNhZmVOYW1lID0gVXRpbHMuc2FmZURvY2tlclN0cmluZyhuYW1lKTtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtibGFjay5iZ1llbGxvd0JyaWdodCAgV0FSTiB9JHtyZW5kZXJEdXJhdGlvbihwcmV0dHlEdXJhdGlvbil9IHtibHVlQnJpZ2h0ICR7bmFtZVBhZH19ICBwcmVfc2NyaXB0XFxuYCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0TG9nID0gYXdhaXQgZnMucmVhZEZpbGUoYCR7Y3dkfS8ke3N0YXRlRGlyfS9vdXRwdXQvJHtzYWZlTmFtZX0ubG9nYCwgXCJ1dGY4XCIpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBvdXRwdXRMb2cuc3BsaXQoL1xccj9cXG4vKS5maWx0ZXIoaiA9PiAhai5pbmNsdWRlcyhcIlszMm0kIFwiKSkuZmlsdGVyKGogPT4gaiAhPT0gXCJcIikuc2xpY2UoLTMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgICB7eWVsbG93ID59ICR7bGluZX1cXG5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWZ0ZXJTY3JpcHRzLndhcm5lZC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIGFmdGVyU2NyaXB0cy53YXJuZWQuc29ydCgoYSwgYikgPT4gc3RhZ2VzLmluZGV4T2YoYS5zdGFnZSkgLSBzdGFnZXMuaW5kZXhPZihiLnN0YWdlKSk7XG4gICAgICAgICAgICBhZnRlclNjcmlwdHMud2FybmVkLmZvckVhY2goKHtuYW1lLCBwcmV0dHlEdXJhdGlvbn0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lUGFkID0gbmFtZS5wYWRFbmQoam9iTmFtZVBhZCk7XG4gICAgICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2B7YmxhY2suYmdZZWxsb3dCcmlnaHQgIFdBUk4gfSR7cmVuZGVyRHVyYXRpb24ocHJldHR5RHVyYXRpb24pfSB7Ymx1ZUJyaWdodCAke25hbWVQYWR9fSAgYWZ0ZXJfc2NyaXB0XFxuYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmVTY3JpcHRzLmZhaWxlZC5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHByZVNjcmlwdHMuZmFpbGVkLnNvcnQoKGEsIGIpID0+IHN0YWdlcy5pbmRleE9mKGEuc3RhZ2UpIC0gc3RhZ2VzLmluZGV4T2YoYi5zdGFnZSkpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB7bmFtZSwgcHJldHR5RHVyYXRpb259IG9mIHByZVNjcmlwdHMuZmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZVBhZCA9IG5hbWUucGFkRW5kKGpvYk5hbWVQYWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNhZmVOYW1lID0gVXRpbHMuc2FmZURvY2tlclN0cmluZyhuYW1lKTtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtibGFjay5iZ1JlZCAgRkFJTCB9JHtyZW5kZXJEdXJhdGlvbihwcmV0dHlEdXJhdGlvbil9IHtibHVlQnJpZ2h0ICR7bmFtZVBhZH19XFxuYCk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0TG9nID0gYXdhaXQgZnMucmVhZEZpbGUoYCR7Y3dkfS8ke3N0YXRlRGlyfS9vdXRwdXQvJHtzYWZlTmFtZX0ubG9nYCwgXCJ1dGY4XCIpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBvdXRwdXRMb2cuc3BsaXQoL1xccj9cXG4vKS5maWx0ZXIoaiA9PiAhai5pbmNsdWRlcyhcIlszMm0kIFwiKSkuZmlsdGVyKGogPT4gaiAhPT0gXCJcIikuc2xpY2UoLTMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtgICB7cmVkID59ICR7bGluZX1cXG5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGpvYiBvZiBwcmVTY3JpcHRzLnN1Y2Nlc3NmdWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGUgPSBqb2IuZW52aXJvbm1lbnQ7XG4gICAgICAgICAgICBpZiAoZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gZS5uYW1lO1xuICAgICAgICAgICAgY29uc3QgdXJsID0gZS51cmw7XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtibHVlQnJpZ2h0ICR7am9iLm5hbWV9fSBlbnZpcm9ubWVudDogXFx7IG5hbWU6IHtib2xkICR7bmFtZX19YCk7XG4gICAgICAgICAgICBpZiAodXJsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYCwgdXJsOiB7Ym9sZCAke3VybH19YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KFwiIH1cXG5cIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgcnVuTGlzdCAocGFyc2VyOiBQYXJzZXIsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBsaXN0QWxsOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHN0YWdlcyA9IHBhcnNlci5zdGFnZXM7XG4gICAgICAgIGxldCBqb2JzID0gWy4uLnBhcnNlci5qb2JzLnZhbHVlcygpXTtcbiAgICAgICAgam9icy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhZ2VzLmluZGV4T2YoYS5zdGFnZSkgLSBzdGFnZXMuaW5kZXhPZihiLnN0YWdlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHdoZW5QYWRFbmQgPSA0O1xuICAgICAgICBqb2JzLmZvckVhY2goaiA9PiB3aGVuUGFkRW5kID0gTWF0aC5tYXgoai53aGVuLmxlbmd0aCwgd2hlblBhZEVuZCkpO1xuXG4gICAgICAgIGxldCBzdGFnZVBhZEVuZCA9IDU7XG4gICAgICAgIHN0YWdlcy5mb3JFYWNoKHMgPT4gc3RhZ2VQYWRFbmQgPSBNYXRoLm1heChzLmxlbmd0aCwgc3RhZ2VQYWRFbmQpKTtcblxuICAgICAgICBsZXQgZGVzY3JpcHRpb25QYWRFbmQgPSAxMTtcbiAgICAgICAgam9icy5mb3JFYWNoKGogPT4gZGVzY3JpcHRpb25QYWRFbmQgPSBNYXRoLm1heChqLmRlc2NyaXB0aW9uLmxlbmd0aCwgZGVzY3JpcHRpb25QYWRFbmQpKTtcblxuICAgICAgICBjb25zdCBqb2JOYW1lUGFkID0gcGFyc2VyLmpvYk5hbWVQYWQ7XG5cbiAgICAgICAgaWYgKCFsaXN0QWxsKSB7XG4gICAgICAgICAgICBqb2JzID0gam9icy5maWx0ZXIoaiA9PiBqLndoZW4gIT09IFwibmV2ZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGNoYWxrYHtncmV5ICR7XCJuYW1lXCIucGFkRW5kKGpvYk5hbWVQYWQpfSAgJHtcImRlc2NyaXB0aW9uXCIucGFkRW5kKGRlc2NyaXB0aW9uUGFkRW5kKX19ICBgKTtcbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChjaGFsa2B7Z3JleSAke1wic3RhZ2VcIi5wYWRFbmQoc3RhZ2VQYWRFbmQpfSAgJHtcIndoZW5cIi5wYWRFbmQod2hlblBhZEVuZCl9fSAgYCk7XG4gICAgICAgIHdyaXRlU3RyZWFtcy5zdGRvdXQoY2hhbGtge2dyZXkgYWxsb3dfZmFpbHVyZSAgbmVlZHN9XFxuYCk7XG5cbiAgICAgICAgY29uc3QgcmVuZGVyTGluZSA9IChqb2I6IEpvYikgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmVlZHMgPSBqb2IubmVlZHM/LmZpbHRlcihuID0+ICFuLnByb2plY3QgJiYgIW4ucGlwZWxpbmUpLm1hcChuID0+IG4uam9iKTtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93RmFpbHVyZSA9IGpvYi5hbGxvd0ZhaWx1cmUgPyBcInRydWUgXCIgOiBcImZhbHNlIFwiO1xuICAgICAgICAgICAgbGV0IGpvYkxpbmUgPSBjaGFsa2B7Ymx1ZUJyaWdodCAke2pvYi5uYW1lLnBhZEVuZChqb2JOYW1lUGFkKX19ICAke2pvYi5kZXNjcmlwdGlvbi5wYWRFbmQoZGVzY3JpcHRpb25QYWRFbmQpfSAgYDtcbiAgICAgICAgICAgIGpvYkxpbmUgKz0gY2hhbGtge3llbGxvdyAke2pvYi5zdGFnZS5wYWRFbmQoc3RhZ2VQYWRFbmQpfX0gICR7am9iLndoZW4ucGFkRW5kKHdoZW5QYWRFbmQpfSAgJHthbGxvd0ZhaWx1cmUucGFkRW5kKDExKX1gO1xuICAgICAgICAgICAgaWYgKG5lZWRzKSB7XG4gICAgICAgICAgICAgICAgam9iTGluZSArPSBjaGFsa2AgICAgW3tibHVlQnJpZ2h0ICR7bmVlZHN9fV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChgJHtqb2JMaW5lfVxcbmApO1xuICAgICAgICB9O1xuXG4gICAgICAgIGpvYnMuZm9yRWFjaCgoam9iKSA9PiByZW5kZXJMaW5lKGpvYikpO1xuICAgIH1cblxuICAgIHN0YXRpYyBydW5Kc29uIChwYXJzZXI6IFBhcnNlciwgd3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMpIHtcbiAgICAgICAgY29uc3Qgam9icyA9IFsuLi5wYXJzZXIuam9icy52YWx1ZXMoKV07XG4gICAgICAgIGNvbnN0IGpzb246IGFueVtdID0gW107XG5cbiAgICAgICAgam9icy5mb3JFYWNoKChqb2IpID0+IHtcbiAgICAgICAgICAgIGpzb24ucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogam9iLm5hbWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGpvYi5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICBzdGFnZTogam9iLnN0YWdlLFxuICAgICAgICAgICAgICAgIHdoZW46IGpvYi53aGVuLFxuICAgICAgICAgICAgICAgIGFsbG93X2ZhaWx1cmU6IGpvYi5hbGxvd0ZhaWx1cmUsXG4gICAgICAgICAgICAgICAgbmVlZHM6IGpvYi5uZWVkcz8uZmlsdGVyKG4gPT4gIW4ucHJvamVjdCAmJiAhbi5waXBlbGluZSksXG4gICAgICAgICAgICAgICAgLi4uam9iLnJ1bGVzID8ge3J1bGVzOiBqb2IucnVsZXN9IDoge30sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgd3JpdGVTdHJlYW1zLnN0ZG91dChgJHtKU09OLnN0cmluZ2lmeShqc29uLCBudWxsLCAyKX1cXG5gKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcnVuQ3N2IChwYXJzZXI6IFBhcnNlciwgd3JpdGVTdHJlYW1zOiBXcml0ZVN0cmVhbXMsIGFsbDogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBzdGFnZXMgPSBwYXJzZXIuc3RhZ2VzO1xuICAgICAgICBsZXQgam9icyA9IFsuLi5wYXJzZXIuam9icy52YWx1ZXMoKV07XG4gICAgICAgIGpvYnMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHN0YWdlcy5pbmRleE9mKGEuc3RhZ2UpIC0gc3RhZ2VzLmluZGV4T2YoYi5zdGFnZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghYWxsKSB7XG4gICAgICAgICAgICBqb2JzID0gam9icy5maWx0ZXIoaiA9PiBqLndoZW4gIT09IFwibmV2ZXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KFwibmFtZTtkZXNjcmlwdGlvbjtzdGFnZTt3aGVuO2FsbG93RmFpbHVyZTtuZWVkc1xcblwiKTtcbiAgICAgICAgam9icy5mb3JFYWNoKChqb2IpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5lZWRzID0gam9iLm5lZWRzPy5maWx0ZXIobiA9PiAhbi5wcm9qZWN0ICYmICFuLnBpcGVsaW5lKS5tYXAobiA9PiBuLmpvYikuam9pbihcIixcIikgPz8gW107XG4gICAgICAgICAgICB3cml0ZVN0cmVhbXMuc3Rkb3V0KGAke2pvYi5uYW1lfTtcIiR7am9iLmRlc2NyaXB0aW9ufVwiOyR7am9iLnN0YWdlfTske2pvYi53aGVufTske2pvYi5hbGxvd0ZhaWx1cmUgPyBcInRydWVcIiA6IFwiZmFsc2VcIn07WyR7bmVlZHN9XVxcbmApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgdmFsaWRhdGVEZXBlbmRlbmN5Q2hhaW4gKHBhcnNlcjogUGFyc2VyKSB7XG4gICAgICAgIGNvbnN0IGFsbEpvYnMgPSBwYXJzZXIuam9icztcbiAgICAgICAgLy8gVGhpcyBpcyBvbmx5IHRoZSBqb2JzIHRoYXQgd2lsbCBhY3R1YWxseSBydW5cbiAgICAgICAgY29uc3QgYWN0aXZlSm9icyA9IGFsbEpvYnMuZmlsdGVyKGogPT4gai53aGVuICE9PSBcIm5ldmVyXCIpO1xuICAgICAgICBjb25zdCBzdGFnZXMgPSBwYXJzZXIuc3RhZ2VzO1xuICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgYW4gYXNzZXJ0aW9uIGVycnJvciBpZiB0aGUgZGVwZW5kZW5jeSBjaGFpbiBpcyBicm9rZW4gZHVlIHRvIG5lZWRzIGtleXdvcmQgb24gc3BlY2lmaWMgZXZlbnRzIHdpdGhvdXQgaGF2aW5nIHRvIHJ1biB0aGUgZnVsbCBwaXBlbGluZVxuICAgICAgICBFeGVjdXRvci5nZXRTdGFydENhbmRpZGF0ZXMoYWxsSm9icywgc3RhZ2VzLCBhY3RpdmVKb2JzLCBbXSk7XG5cbiAgICAgICAgY29uc3QgYWN0aXZlSm9iTmFtZXMgPSBuZXcgU2V0KGFjdGl2ZUpvYnMubWFwKGpvYiA9PiBqb2IubmFtZSkpO1xuICAgICAgICAvLyBUaGlzIHdpbGxsIHRocm93IGFuIGFzc2VydGlvbiBlcnJvciBpZiB0aGUgZGVwZW5kZW5jeSBjaGFpbiBpcyBicm9rZW4gZHVlIHRvIGRlcGVuZGVuY2llcyBrZXl3b3JkIChhIGpvYiBkZXBlbmRpbmcgb24gYXJ0aWZhY3RzIGZyb20gYSBqb2IgdGhhdCB3aWxsIG5ldmVyIHJ1bikgd2l0aG91dCBoYXZpbmcgdG8gcnVuIHRoZSBmdWxsIHBpcGVsaW5lXG4gICAgICAgIGZvciAoY29uc3Qgam9iIG9mIGFjdGl2ZUpvYnMpIHtcbiAgICAgICAgICAgIGlmIChqb2IuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIGpvYi5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhY3RpdmVKb2JOYW1lcy5oYXMoZGVwZW5kZW5jeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcih7bWVzc2FnZTogY2hhbGtge2JsdWVCcmlnaHQgJHtkZXBlbmRlbmN5fX0gaXMgd2hlbjpuZXZlciwgYnV0IGl0cyBkZXBlbmRlZCBvbiBieSB7Ymx1ZUJyaWdodCAke2pvYi5uYW1lfX1gfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -1,220 +0,0 @@
1
- import chalk from "chalk-template";
2
- import deepExtend from "deep-extend";
3
- import assert, { AssertionError } from "assert";
4
- import { Job } from "./job.js";
5
- import { traverse } from "object-traversal";
6
- import { Utils } from "./utils.js";
7
- const extendsMaxDepth = 11;
8
- const extendsRecurse = (gitlabData, jobName, jobData, parents, depth) => {
9
- assert(depth < extendsMaxDepth, chalk `{blueBright ${jobName}}: circular dependency detected in \`extends\``);
10
- depth++;
11
- jobData.extends = typeof jobData.extends === "string" ? [jobData.extends] : jobData.extends;
12
- jobData.extends = jobData.extends ?? [];
13
- for (const parentName of jobData.extends) {
14
- const parentData = gitlabData[parentName];
15
- assert(parentData != null, chalk `{blueBright ${parentName}} is unspecified, used by {blueBright ${jobName}} extends`);
16
- extendsRecurse(gitlabData, parentName, parentData, parents, depth);
17
- parents.push(parentData);
18
- }
19
- return parents;
20
- };
21
- export function jobExtends(gitlabData) {
22
- for (const [jobName, jobData] of Object.entries(gitlabData)) {
23
- if (Job.illegalJobNames.has(jobName))
24
- continue;
25
- if (!Utils.isObject(jobData))
26
- continue;
27
- const parentDatas = extendsRecurse(gitlabData, jobName, jobData, [], 0);
28
- gitlabData[jobName] = deepExtend({}, ...parentDatas, jobData);
29
- }
30
- for (const [jobName, jobData] of Object.entries(gitlabData)) {
31
- if (Job.illegalJobNames.has(jobName))
32
- continue;
33
- if (!Utils.isObject(jobData))
34
- continue;
35
- delete jobData.extends;
36
- }
37
- }
38
- export function reference(gitlabData, recurseData) {
39
- for (const [key, value] of Object.entries(recurseData || {})) {
40
- if (value?.referenceData) {
41
- if (Object.keys(value).length > 1) {
42
- recurseData[key] = { ...getSubDataByReference(gitlabData, value.referenceData), ...recurseData[key] };
43
- delete recurseData[key].referenceData;
44
- }
45
- else {
46
- recurseData[key] = getSubDataByReference(gitlabData, value.referenceData);
47
- }
48
- }
49
- else if (typeof value === "object") {
50
- reference(gitlabData, value);
51
- }
52
- if (hasCircularChain(recurseData)) {
53
- throw new AssertionError({ message: `!reference circular chain detected [${value.referenceData}]` });
54
- }
55
- }
56
- }
57
- const getSubDataByReference = (gitlabData, referenceData) => {
58
- let gitlabSubData = gitlabData;
59
- referenceData.forEach((referencePointer) => {
60
- assert(gitlabSubData[referencePointer] != null, `!reference [${referenceData.join(", ")}] is undefined`);
61
- gitlabSubData = gitlabSubData[referencePointer];
62
- });
63
- return gitlabSubData;
64
- };
65
- function hasCircularChain(data) {
66
- try {
67
- JSON.stringify(data);
68
- }
69
- catch (e) {
70
- if (e instanceof TypeError && e.message.startsWith("Converting circular structure to JSON")) {
71
- return true;
72
- }
73
- }
74
- return false;
75
- }
76
- /**
77
- Transform the globally defined ["image", "services", "cache", "before_script", "after_script"] into the default.x syntax
78
- https://docs.gitlab.com/ee/ci/yaml/index.html#globally-defined-image-services-cache-before_script-after_script
79
- */
80
- export function transformDeprecatedGlobalDefaultSyntax(gitlabData) {
81
- const GITLAB_DEPRECATED_GLOBALLY_DEFINED_KEYWORDS = ["image", "services", "cache", "before_script", "after_script"];
82
- gitlabData.default = gitlabData.default ?? {};
83
- for (const g of GITLAB_DEPRECATED_GLOBALLY_DEFINED_KEYWORDS) {
84
- if (gitlabData[g] !== undefined) {
85
- gitlabData.default[g] = gitlabData[g];
86
- delete gitlabData[g]; // Since this is deprecated, deleting it to prevent us from using it internally
87
- }
88
- }
89
- }
90
- export function normalize(gitlabData) {
91
- normalizeGlobalVariables(gitlabData);
92
- for (const [jobName, jobData] of Object.entries(gitlabData)) {
93
- if (Job.illegalJobNames.has(jobName) || jobName.startsWith("."))
94
- continue;
95
- needsEach(jobName, gitlabData);
96
- cacheEach(jobName, gitlabData);
97
- servicesEach(jobName, gitlabData);
98
- imageEach(jobName, gitlabData);
99
- jobData.after_script = (typeof jobData.after_script === "string" && jobData.after_script !== "") ? [jobData.after_script] : jobData.after_script;
100
- jobData.before_script = (typeof jobData.before_script === "string" && jobData.before_script !== "") ? [jobData.before_script] : jobData.before_script;
101
- jobData.script = (typeof jobData.script === "string" && jobData.script !== "") ? [jobData.script] : jobData.script;
102
- }
103
- }
104
- export function needsComplex(data) {
105
- const needs = {
106
- job: data.job ?? data,
107
- artifacts: data.artifacts ?? true,
108
- ...(data.pipeline ? { pipeline: data.pipeline } : {}),
109
- ...(data.project ? { project: data.project } : {}),
110
- ...(data.ref ? { ref: data.ref } : {}),
111
- ...(data.optional ? { optional: data.optional } : {}),
112
- };
113
- // In needs:project/needs:pipeline, `optional` is not an allowed property
114
- if (!data.project && !data.pipeline && data.optional === undefined) {
115
- needs.optional = false;
116
- }
117
- return needs;
118
- }
119
- export function needsEach(jobName, gitlabData) {
120
- const jobData = gitlabData[jobName];
121
- if (!jobData.needs)
122
- return;
123
- for (const [i, n] of Object.entries(jobData.needs)) {
124
- jobData.needs[i] = needsComplex(n);
125
- }
126
- }
127
- export function cacheComplex(data) {
128
- return {
129
- key: data.key,
130
- paths: data.paths,
131
- policy: data.policy ?? "pull-push",
132
- when: data.when ?? "on_success",
133
- };
134
- }
135
- export function cacheEach(jobName, gitlabData) {
136
- const jobData = gitlabData[jobName];
137
- const cache = jobData.cache;
138
- if (!cache)
139
- return;
140
- jobData.cache = Array.isArray(cache) ? cache : [cache];
141
- for (const [i, c] of Object.entries(jobData.cache)) {
142
- if (c.key?.files instanceof Array) {
143
- assert(c.key.files.length === 1 || c.key.files.length === 2, `cache:key:files should be an array of one or two file paths. Got ${c.key.files.length}`);
144
- }
145
- jobData.cache[i] = cacheComplex(c);
146
- }
147
- // Remove cache elements with empty paths array (gitlab.com works the same way.)
148
- jobData.cache = jobData.cache.filter((c) => c.paths?.length !== undefined);
149
- }
150
- export function servicesComplex(data) {
151
- return {
152
- name: typeof data === "string" ? data : data.name,
153
- entrypoint: data.entrypoint,
154
- command: data.command,
155
- alias: data.alias,
156
- variables: data.variables,
157
- };
158
- }
159
- export function servicesEach(jobName, gitlabData) {
160
- const jobData = gitlabData[jobName];
161
- const services = jobData.services;
162
- if (!services)
163
- return;
164
- jobData.services = Array.isArray(services) ? services : [services];
165
- for (const [i, s] of Object.entries(jobData.services)) {
166
- jobData.services[i] = servicesComplex(s);
167
- }
168
- }
169
- export function imageComplex(data) {
170
- if (data == null)
171
- return data;
172
- return {
173
- name: typeof data === "string" ? data : data.name,
174
- entrypoint: data.entrypoint,
175
- ...(data.docker?.user ? { docker: { user: data.docker?.user } } : {}),
176
- };
177
- }
178
- export function imageEach(jobName, gitlabData) {
179
- const jobData = gitlabData[jobName];
180
- const image = jobData.image;
181
- if (!image)
182
- return;
183
- jobData.image = imageComplex(jobData.image);
184
- }
185
- export function inheritDefault(gitlabData) {
186
- for (const [jobName, jobData] of Object.entries(gitlabData)) {
187
- if (jobData.inherit?.default === false)
188
- continue;
189
- if (Job.illegalJobNames.has(jobName) || jobName.startsWith(".")) {
190
- // skip hidden jobs as they might just contain shared yaml
191
- // see https://github.com/firecow/gitlab-ci-local/issues/1277
192
- continue;
193
- }
194
- const keywordsToInheritFrom = (Array.isArray(jobData.inherit?.default)) ?
195
- jobData.inherit.default :
196
- ["artifacts", "cache", "services", "image", "before_script", "after_script"];
197
- for (const keyword of keywordsToInheritFrom) {
198
- if (gitlabData.default[keyword] !== undefined)
199
- jobData[keyword] = jobData[keyword] ?? gitlabData.default[keyword];
200
- }
201
- }
202
- }
203
- function normalizeGlobalVariables(gitlabData) {
204
- for (const [key, value] of Object.entries(gitlabData.variables ?? {})) {
205
- gitlabData.variables[key] = Utils.normalizeVariables(value);
206
- }
207
- }
208
- export function flattenLists(gitlabData) {
209
- traverse(gitlabData, ({ parent, key, value, meta }) => {
210
- if (parent != null && key != null && Array.isArray(value)) {
211
- assert(!value.flat(9).some(Array.isArray), chalk `This Gitlab CI configuration is invalid: {blueBright ${meta.nodePath}} config should be string or a nested array of strings up to 10 level deep`);
212
- }
213
- }, { cycleHandling: true });
214
- traverse(gitlabData, ({ parent, key, value }) => {
215
- if (parent != null && key != null && Array.isArray(value)) {
216
- parent[key] = value.flat(9);
217
- }
218
- }, { cycleHandling: false });
219
- }
220
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1leHBhbmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRhdGEtZXhwYW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkMsT0FBTyxVQUFVLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sTUFBTSxFQUFFLEVBQUMsY0FBYyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzlDLE9BQU8sRUFBQyxHQUFHLEVBQU8sTUFBTSxVQUFVLENBQUM7QUFDbkMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFakMsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQzNCLE1BQU0sY0FBYyxHQUFHLENBQUMsVUFBZSxFQUFFLE9BQWUsRUFBRSxPQUFZLEVBQUUsT0FBYyxFQUFFLEtBQWEsRUFBRSxFQUFFO0lBQ3JHLE1BQU0sQ0FBQyxLQUFLLEdBQUcsZUFBZSxFQUFFLEtBQUssQ0FBQSxlQUFlLE9BQU8sZ0RBQWdELENBQUMsQ0FBQztJQUM3RyxLQUFLLEVBQUUsQ0FBQztJQUVSLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxPQUFPLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDNUYsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUV4QyxLQUFLLE1BQU0sVUFBVSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN2QyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUUsS0FBSyxDQUFBLGVBQWUsVUFBVSx5Q0FBeUMs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QUMsRUFBRSxFQUFFO1FBQ2hELElBQUksTUFBTSxJQUFJLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFBLHdEQUF3RCxJQUFJLENBQUMsUUFBUSw0RUFBNEUsQ0FBQyxDQUFDO1FBQ3ZNLENBQUM7SUFDTCxDQUFDLEVBQUUsRUFBQyxhQUFhLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztJQUUxQixRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBQyxFQUFFLEVBQUU7UUFDMUMsSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7SUFDTCxDQUFDLEVBQUUsRUFBQyxhQUFhLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsay10ZW1wbGF0ZVwiO1xuaW1wb3J0IGRlZXBFeHRlbmQgZnJvbSBcImRlZXAtZXh0ZW5kXCI7XG5pbXBvcnQgYXNzZXJ0LCB7QXNzZXJ0aW9uRXJyb3J9IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7Sm9iLCBOZWVkfSBmcm9tIFwiLi9qb2IuanNcIjtcbmltcG9ydCB7dHJhdmVyc2V9IGZyb20gXCJvYmplY3QtdHJhdmVyc2FsXCI7XG5pbXBvcnQge1V0aWxzfSBmcm9tIFwiLi91dGlscy5qc1wiO1xuXG5jb25zdCBleHRlbmRzTWF4RGVwdGggPSAxMTtcbmNvbnN0IGV4dGVuZHNSZWN1cnNlID0gKGdpdGxhYkRhdGE6IGFueSwgam9iTmFtZTogc3RyaW5nLCBqb2JEYXRhOiBhbnksIHBhcmVudHM6IGFueVtdLCBkZXB0aDogbnVtYmVyKSA9PiB7XG4gICAgYXNzZXJ0KGRlcHRoIDwgZXh0ZW5kc01heERlcHRoLCBjaGFsa2B7Ymx1ZUJyaWdodCAke2pvYk5hbWV9fTogY2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZCBpbiBcXGBleHRlbmRzXFxgYCk7XG4gICAgZGVwdGgrKztcblxuICAgIGpvYkRhdGEuZXh0ZW5kcyA9IHR5cGVvZiBqb2JEYXRhLmV4dGVuZHMgPT09IFwic3RyaW5nXCIgPyBbam9iRGF0YS5leHRlbmRzXSA6IGpvYkRhdGEuZXh0ZW5kcztcbiAgICBqb2JEYXRhLmV4dGVuZHMgPSBqb2JEYXRhLmV4dGVuZHMgPz8gW107XG5cbiAgICBmb3IgKGNvbnN0IHBhcmVudE5hbWUgb2Ygam9iRGF0YS5leHRlbmRzKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudERhdGEgPSBnaXRsYWJEYXRhW3BhcmVudE5hbWVdO1xuICAgICAgICBhc3NlcnQocGFyZW50RGF0YSAhPSBudWxsLCBjaGFsa2B7Ymx1ZUJyaWdodCAke3BhcmVudE5hbWV9fSBpcyB1bnNwZWNpZmllZCwgdXNlZCBieSB7Ymx1ZUJyaWdodCAke2pvYk5hbWV9fSBleHRlbmRzYCk7XG4gICAgICAgIGV4dGVuZHNSZWN1cnNlKGdpdGxhYkRhdGEsIHBhcmVudE5hbWUsIHBhcmVudERhdGEsIHBhcmVudHMsIGRlcHRoKTtcbiAgICAgICAgcGFyZW50cy5wdXNoKHBhcmVudERhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50cztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBqb2JFeHRlbmRzIChnaXRsYWJEYXRhOiBhbnkpIHtcbiAgICBmb3IgKGNvbnN0IFtqb2JOYW1lLCBqb2JEYXRhXSBvZiBPYmplY3QuZW50cmllczxhbnk+KGdpdGxhYkRhdGEpKSB7XG4gICAgICAgIGlmIChKb2IuaWxsZWdhbEpvYk5hbWVzLmhhcyhqb2JOYW1lKSkgY29udGludWU7XG4gICAgICAgIGlmICghVXRpbHMuaXNPYmplY3Qoam9iRGF0YSkpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBwYXJlbnREYXRhcyA9IGV4dGVuZHNSZWN1cnNlKGdpdGxhYkRhdGEsIGpvYk5hbWUsIGpvYkRhdGEsIFtdLCAwKTtcbiAgICAgICAgZ2l0bGFiRGF0YVtqb2JOYW1lXSA9IGRlZXBFeHRlbmQoe30sIC4uLnBhcmVudERhdGFzLCBqb2JEYXRhKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtqb2JOYW1lLCBqb2JEYXRhXSBvZiBPYmplY3QuZW50cmllczxhbnk+KGdpdGxhYkRhdGEpKSB7XG4gICAgICAgIGlmIChKb2IuaWxsZWdhbEpvYk5hbWVzLmhhcyhqb2JOYW1lKSkgY29udGludWU7XG4gICAgICAgIGlmICghVXRpbHMuaXNPYmplY3Qoam9iRGF0YSkpIGNvbnRpbnVlO1xuICAgICAgICBkZWxldGUgam9iRGF0YS5leHRlbmRzO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZmVyZW5jZSAoZ2l0bGFiRGF0YTogYW55LCByZWN1cnNlRGF0YTogYW55KSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXM8YW55PihyZWN1cnNlRGF0YSB8fCB7fSkpIHtcbiAgICAgICAgaWYgKHZhbHVlPy5yZWZlcmVuY2VEYXRhKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICByZWN1cnNlRGF0YVtrZXldID0gey4uLmdldFN1YkRhdGFCeVJlZmVyZW5jZShnaXRsYWJEYXRhLCB2YWx1ZS5yZWZlcmVuY2VEYXRhKSwgLi4ucmVjdXJzZURhdGFba2V5XX07XG4gICAgICAgICAgICAgICAgZGVsZXRlIHJlY3Vyc2VEYXRhW2tleV0ucmVmZXJlbmNlRGF0YTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVjdXJzZURhdGFba2V5XSA9IGdldFN1YkRhdGFCeVJlZmVyZW5jZShnaXRsYWJEYXRhLCB2YWx1ZS5yZWZlcmVuY2VEYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHJlZmVyZW5jZShnaXRsYWJEYXRhLCB2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzQ2lyY3VsYXJDaGFpbihyZWN1cnNlRGF0YSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcih7bWVzc2FnZTogYCFyZWZlcmVuY2UgY2lyY3VsYXIgY2hhaW4gZGV0ZWN0ZWQgWyR7dmFsdWUucmVmZXJlbmNlRGF0YX1dYH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5jb25zdCBnZXRTdWJEYXRhQnlSZWZlcmVuY2UgPSAoZ2l0bGFiRGF0YTogYW55LCByZWZlcmVuY2VEYXRhOiBzdHJpbmdbXSkgPT4ge1xuICAgIGxldCBnaXRsYWJTdWJEYXRhID0gZ2l0bGFiRGF0YTtcbiAgICByZWZlcmVuY2VEYXRhLmZvckVhY2goKHJlZmVyZW5jZVBvaW50ZXIpID0+IHtcbiAgICAgICAgYXNzZXJ0KGdpdGxhYlN1YkRhdGFbcmVmZXJlbmNlUG9pbnRlcl0gIT0gbnVsbCwgYCFyZWZlcmVuY2UgWyR7cmVmZXJlbmNlRGF0YS5qb2luKFwiLCBcIil9XSBpcyB1bmRlZmluZWRgKTtcbiAgICAgICAgZ2l0bGFiU3ViRGF0YSA9IGdpdGxhYlN1YkRhdGFbcmVmZXJlbmNlUG9pbnRlcl07XG4gICAgfSk7XG4gICAgcmV0dXJuIGdpdGxhYlN1YkRhdGE7XG59O1xuXG5mdW5jdGlvbiBoYXNDaXJjdWxhckNoYWluIChkYXRhOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgICBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgVHlwZUVycm9yICYmIGUubWVzc2FnZS5zdGFydHNXaXRoKFwiQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gSlNPTlwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAgVHJhbnNmb3JtIHRoZSBnbG9iYWxseSBkZWZpbmVkIFtcImltYWdlXCIsIFwic2VydmljZXNcIiwgXCJjYWNoZVwiLCBcImJlZm9yZV9zY3JpcHRcIiwgXCJhZnRlcl9zY3JpcHRcIl0gaW50byB0aGUgZGVmYXVsdC54IHN5bnRheFxuICBodHRwczovL2RvY3MuZ2l0bGFiLmNvbS9lZS9jaS95YW1sL2luZGV4Lmh0bWwjZ2xvYmFsbHktZGVmaW5lZC1pbWFnZS1zZXJ2aWNlcy1jYWNoZS1iZWZvcmVfc2NyaXB0LWFmdGVyX3NjcmlwdFxuKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1EZXByZWNhdGVkR2xvYmFsRGVmYXVsdFN5bnRheCAoZ2l0bGFiRGF0YTogYW55KSB7XG4gICAgY29uc3QgR0lUTEFCX0RFUFJFQ0FURURfR0xPQkFMTFlfREVGSU5FRF9LRVlXT1JEUyA9IFtcImltYWdlXCIsIFwic2VydmljZXNcIiwgXCJjYWNoZVwiLCBcImJlZm9yZV9zY3JpcHRcIiwgXCJhZnRlcl9zY3JpcHRcIl07XG5cbiAgICBnaXRsYWJEYXRhLmRlZmF1bHQgPSBnaXRsYWJEYXRhLmRlZmF1bHQgPz8ge307XG4gICAgZm9yIChjb25zdCBnIG9mIEdJVExBQl9ERVBSRUNBVEVEX0dMT0JBTExZX0RFRklORURfS0VZV09SRFMpIHtcbiAgICAgICAgaWYgKGdpdGxhYkRhdGFbZ10gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZ2l0bGFiRGF0YS5kZWZhdWx0W2ddID0gZ2l0bGFiRGF0YVtnXTtcbiAgICAgICAgICAgIGRlbGV0ZSBnaXRsYWJEYXRhW2ddOyAvLyBTaW5jZSB0aGlzIGlzIGRlcHJlY2F0ZWQsIGRlbGV0aW5nIGl0IHRvIHByZXZlbnQgdXMgZnJvbSB1c2luZyBpdCBpbnRlcm5hbGx5XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUgKGdpdGxhYkRhdGE6IGFueSkge1xuICAgIG5vcm1hbGl6ZUdsb2JhbFZhcmlhYmxlcyhnaXRsYWJEYXRhKTtcblxuICAgIGZvciAoY29uc3QgW2pvYk5hbWUsIGpvYkRhdGFdIG9mIE9iamVjdC5lbnRyaWVzPGFueT4oZ2l0bGFiRGF0YSkpIHtcbiAgICAgICAgaWYgKEpvYi5pbGxlZ2FsSm9iTmFtZXMuaGFzKGpvYk5hbWUpIHx8IGpvYk5hbWUuc3RhcnRzV2l0aChcIi5cIikpIGNvbnRpbnVlO1xuICAgICAgICBuZWVkc0VhY2goam9iTmFtZSwgZ2l0bGFiRGF0YSk7XG4gICAgICAgIGNhY2hlRWFjaChqb2JOYW1lLCBnaXRsYWJEYXRhKTtcbiAgICAgICAgc2VydmljZXNFYWNoKGpvYk5hbWUsIGdpdGxhYkRhdGEpO1xuICAgICAgICBpbWFnZUVhY2goam9iTmFtZSwgZ2l0bGFiRGF0YSk7XG5cbiAgICAgICAgam9iRGF0YS5hZnRlcl9zY3JpcHQgPSAodHlwZW9mIGpvYkRhdGEuYWZ0ZXJfc2NyaXB0ID09PSBcInN0cmluZ1wiICYmIGpvYkRhdGEuYWZ0ZXJfc2NyaXB0ICE9PSBcIlwiKSA/IFtqb2JEYXRhLmFmdGVyX3NjcmlwdF0gOiBqb2JEYXRhLmFmdGVyX3NjcmlwdDtcbiAgICAgICAgam9iRGF0YS5iZWZvcmVfc2NyaXB0ID0gKHR5cGVvZiBqb2JEYXRhLmJlZm9yZV9zY3JpcHQgPT09IFwic3RyaW5nXCIgJiYgam9iRGF0YS5iZWZvcmVfc2NyaXB0ICE9PSBcIlwiKSA/IFtqb2JEYXRhLmJlZm9yZV9zY3JpcHRdIDogam9iRGF0YS5iZWZvcmVfc2NyaXB0O1xuICAgICAgICBqb2JEYXRhLnNjcmlwdCA9ICh0eXBlb2Ygam9iRGF0YS5zY3JpcHQgPT09IFwic3RyaW5nXCIgJiYgam9iRGF0YS5zY3JpcHQgIT09IFwiXCIpID8gW2pvYkRhdGEuc2NyaXB0XSA6IGpvYkRhdGEuc2NyaXB0O1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZWRzQ29tcGxleCAoZGF0YTogYW55KSB7XG4gICAgY29uc3QgbmVlZHM6IE5lZWQgPSB7XG4gICAgICAgIGpvYjogZGF0YS5qb2IgPz8gZGF0YSxcbiAgICAgICAgYXJ0aWZhY3RzOiBkYXRhLmFydGlmYWN0cyA/PyB0cnVlLFxuICAgICAgICAuLi4oZGF0YS5waXBlbGluZSA/IHtwaXBlbGluZTogZGF0YS5waXBlbGluZX0gOiB7fSksXG4gICAgICAgIC4uLihkYXRhLnByb2plY3QgPyB7cHJvamVjdDogZGF0YS5wcm9qZWN0fSA6IHt9KSxcbiAgICAgICAgLi4uKGRhdGEucmVmID8ge3JlZjogZGF0YS5yZWZ9IDoge30pLFxuICAgICAgICAuLi4oZGF0YS5vcHRpb25hbCA/IHtvcHRpb25hbDogZGF0YS5vcHRpb25hbH0gOiB7fSksXG4gICAgfTtcblxuICAgIC8vIEluIG5lZWRzOnByb2plY3QvbmVlZHM6cGlwZWxpbmUsIGBvcHRpb25hbGAgaXMgbm90IGFuIGFsbG93ZWQgcHJvcGVydHlcbiAgICBpZiAoIWRhdGEucHJvamVjdCAmJiAhZGF0YS5waXBlbGluZSAmJiBkYXRhLm9wdGlvbmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmVlZHMub3B0aW9uYWwgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIG5lZWRzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmVlZHNFYWNoIChqb2JOYW1lOiBzdHJpbmcsIGdpdGxhYkRhdGE6IGFueSkge1xuICAgIGNvbnN0IGpvYkRhdGEgPSBnaXRsYWJEYXRhW2pvYk5hbWVdO1xuICAgIGlmICgham9iRGF0YS5uZWVkcykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBbaSwgbl0gb2YgT2JqZWN0LmVudHJpZXM8YW55Pihqb2JEYXRhLm5lZWRzKSkge1xuICAgICAgICBqb2JEYXRhLm5lZWRzW2ldID0gbmVlZHNDb21wbGV4KG4pO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlQ29tcGxleCAoZGF0YTogYW55KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAga2V5OiBkYXRhLmtleSxcbiAgICAgICAgcGF0aHM6IGRhdGEucGF0aHMsXG4gICAgICAgIHBvbGljeTogZGF0YS5wb2xpY3kgPz8gXCJwdWxsLXB1c2hcIixcbiAgICAgICAgd2hlbjogZGF0YS53aGVuID8/IFwib25fc3VjY2Vzc1wiLFxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZUVhY2ggKGpvYk5hbWU6IHN0cmluZywgZ2l0bGFiRGF0YTogYW55KSB7XG4gICAgY29uc3Qgam9iRGF0YSA9IGdpdGxhYkRhdGFbam9iTmFtZV07XG4gICAgY29uc3QgY2FjaGUgPSBqb2JEYXRhLmNhY2hlO1xuICAgIGlmICghY2FjaGUpIHJldHVybjtcblxuICAgIGpvYkRhdGEuY2FjaGUgPSBBcnJheS5pc0FycmF5KGNhY2hlKSA/IGNhY2hlIDogW2NhY2hlXTtcbiAgICBmb3IgKGNvbnN0IFtpLCBjXSBvZiBPYmplY3QuZW50cmllczxhbnk+KGpvYkRhdGEuY2FjaGUpKSB7XG4gICAgICAgIGlmIChjLmtleT8uZmlsZXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgYXNzZXJ0KGMua2V5LmZpbGVzLmxlbmd0aCA9PT0gMSB8fCBjLmtleS5maWxlcy5sZW5ndGggPT09IDIsIGBjYWNoZTprZXk6ZmlsZXMgc2hvdWxkIGJlIGFuIGFycmF5IG9mIG9uZSBvciB0d28gZmlsZSBwYXRocy4gR290ICR7Yy5rZXkuZmlsZXMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGpvYkRhdGEuY2FjaGVbaV0gPSBjYWNoZUNvbXBsZXgoYyk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGNhY2hlIGVsZW1lbnRzIHdpdGggZW1wdHkgcGF0aHMgYXJyYXkgKGdpdGxhYi5jb20gd29ya3MgdGhlIHNhbWUgd2F5LilcbiAgICBqb2JEYXRhLmNhY2hlID0gam9iRGF0YS5jYWNoZS5maWx0ZXIoKGM6IGFueSkgPT4gYy5wYXRocz8ubGVuZ3RoICE9PSB1bmRlZmluZWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZXNDb21wbGV4IChkYXRhOiBhbnkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IGRhdGEgOiBkYXRhLm5hbWUsXG4gICAgICAgIGVudHJ5cG9pbnQ6IGRhdGEuZW50cnlwb2ludCxcbiAgICAgICAgY29tbWFuZDogZGF0YS5jb21tYW5kLFxuICAgICAgICBhbGlhczogZGF0YS5hbGlhcyxcbiAgICAgICAgdmFyaWFibGVzOiBkYXRhLnZhcmlhYmxlcyxcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VydmljZXNFYWNoIChqb2JOYW1lOiBzdHJpbmcsIGdpdGxhYkRhdGE6IGFueSkge1xuICAgIGNvbnN0IGpvYkRhdGEgPSBnaXRsYWJEYXRhW2pvYk5hbWVdO1xuICAgIGNvbnN0IHNlcnZpY2VzID0gam9iRGF0YS5zZXJ2aWNlcztcbiAgICBpZiAoIXNlcnZpY2VzKSByZXR1cm47XG5cbiAgICBqb2JEYXRhLnNlcnZpY2VzID0gQXJyYXkuaXNBcnJheShzZXJ2aWNlcykgPyBzZXJ2aWNlcyA6IFtzZXJ2aWNlc107XG5cbiAgICBmb3IgKGNvbnN0IFtpLCBzXSBvZiBPYmplY3QuZW50cmllczxhbnk+KGpvYkRhdGEuc2VydmljZXMpKSB7XG4gICAgICAgIGpvYkRhdGEuc2VydmljZXNbaV0gPSBzZXJ2aWNlc0NvbXBsZXgocyk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW1hZ2VDb21wbGV4IChkYXRhOiBhbnkpIHtcbiAgICBpZiAoZGF0YSA9PSBudWxsKSByZXR1cm4gZGF0YTtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiA/IGRhdGEgOiBkYXRhLm5hbWUsXG4gICAgICAgIGVudHJ5cG9pbnQ6IGRhdGEuZW50cnlwb2ludCxcbiAgICAgICAgLi4uKGRhdGEuZG9ja2VyPy51c2VyID8ge2RvY2tlcjoge3VzZXI6IGRhdGEuZG9ja2VyPy51c2VyfX0gOiB7fSksXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGltYWdlRWFjaCAoam9iTmFtZTogc3RyaW5nLCBnaXRsYWJEYXRhOiBhbnkpIHtcbiAgICBjb25zdCBqb2JEYXRhID0gZ2l0bGFiRGF0YVtqb2JOYW1lXTtcbiAgICBjb25zdCBpbWFnZSA9IGpvYkRhdGEuaW1hZ2U7XG4gICAgaWYgKCFpbWFnZSkgcmV0dXJuO1xuXG4gICAgam9iRGF0YS5pbWFnZSA9IGltYWdlQ29tcGxleChqb2JEYXRhLmltYWdlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaGVyaXREZWZhdWx0IChnaXRsYWJEYXRhOiBhbnkpIHtcbiAgICBmb3IgKGNvbnN0IFtqb2JOYW1lLCBqb2JEYXRhXSBvZiBPYmplY3QuZW50cmllczxhbnk+KGdpdGxhYkRhdGEpKSB7XG4gICAgICAgIGlmIChqb2JEYXRhLmluaGVyaXQ/LmRlZmF1bHQgPT09IGZhbHNlKSBjb250aW51ZTtcblxuICAgICAgICBpZiAoSm9iLmlsbGVnYWxKb2JOYW1lcy5oYXMoam9iTmFtZSkgfHwgam9iTmFtZS5zdGFydHNXaXRoKFwiLlwiKSkge1xuICAgICAgICAgICAgLy8gc2tpcCBoaWRkZW4gam9icyBhcyB0aGV5IG1pZ2h0IGp1c3QgY29udGFpbiBzaGFyZWQgeWFtbFxuICAgICAgICAgICAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9maXJlY293L2dpdGxhYi1jaS1sb2NhbC9pc3N1ZXMvMTI3N1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBrZXl3b3Jkc1RvSW5oZXJpdEZyb20gPSAoQXJyYXkuaXNBcnJheShqb2JEYXRhLmluaGVyaXQ/LmRlZmF1bHQpKSA/XG4gICAgICAgICAgICBqb2JEYXRhLmluaGVyaXQuZGVmYXVsdCA6XG4gICAgICAgICAgICBbXCJhcnRpZmFjdHNcIiwgXCJjYWNoZVwiLCBcInNlcnZpY2VzXCIsIFwiaW1hZ2VcIiwgXCJiZWZvcmVfc2NyaXB0XCIsIFwiYWZ0ZXJfc2NyaXB0XCJdO1xuXG4gICAgICAgIGZvciAoY29uc3Qga2V5d29yZCBvZiBrZXl3b3Jkc1RvSW5oZXJpdEZyb20pIHtcbiAgICAgICAgICAgIGlmIChnaXRsYWJEYXRhLmRlZmF1bHRba2V5d29yZF0gIT09IHVuZGVmaW5lZCkgam9iRGF0YVtrZXl3b3JkXSA9IGpvYkRhdGFba2V5d29yZF0gPz8gZ2l0bGFiRGF0YS5kZWZhdWx0W2tleXdvcmRdO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVHbG9iYWxWYXJpYWJsZXMgKGdpdGxhYkRhdGE6IGFueSkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzPGFueT4oZ2l0bGFiRGF0YS52YXJpYWJsZXMgPz8ge30pKSB7XG4gICAgICAgIGdpdGxhYkRhdGEudmFyaWFibGVzW2tleV0gPSBVdGlscy5ub3JtYWxpemVWYXJpYWJsZXModmFsdWUpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5MaXN0cyAoZ2l0bGFiRGF0YTogYW55KSB7XG4gICAgdHJhdmVyc2UoZ2l0bGFiRGF0YSwgKHtwYXJlbnQsIGtleSwgdmFsdWUsIG1ldGF9KSA9PiB7XG4gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBrZXkgIT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgYXNzZXJ0KCF2YWx1ZS5mbGF0KDkpLnNvbWUoQXJyYXkuaXNBcnJheSksIGNoYWxrYFRoaXMgR2l0bGFiIENJIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZDoge2JsdWVCcmlnaHQgJHttZXRhLm5vZGVQYXRofX0gY29uZmlnIHNob3VsZCBiZSBzdHJpbmcgb3IgYSBuZXN0ZWQgYXJyYXkgb2Ygc3RyaW5ncyB1cCB0byAxMCBsZXZlbCBkZWVwYCk7XG4gICAgICAgIH1cbiAgICB9LCB7Y3ljbGVIYW5kbGluZzogdHJ1ZX0pO1xuXG4gICAgdHJhdmVyc2UoZ2l0bGFiRGF0YSwgKHtwYXJlbnQsIGtleSwgdmFsdWV9KSA9PiB7XG4gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBrZXkgIT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgcGFyZW50W2tleV0gPSB2YWx1ZS5mbGF0KDkpO1xuICAgICAgICB9XG4gICAgfSwge2N5Y2xlSGFuZGxpbmc6IGZhbHNlfSk7XG59XG4iXX0=