@psync/patch-package 1.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.
@@ -0,0 +1,450 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.makePatch = makePatch;
7
+ exports.logPatchSequenceError = logPatchSequenceError;
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const console_1 = __importDefault(require("console"));
10
+ const fs_1 = require("fs");
11
+ const fs_extra_1 = require("fs-extra");
12
+ const tmp_1 = require("tmp");
13
+ const zlib_1 = require("zlib");
14
+ const applyPatches_1 = require("./applyPatches");
15
+ const createIssue_1 = require("./createIssue");
16
+ const filterFiles_1 = require("./filterFiles");
17
+ const getPackageResolution_1 = require("./getPackageResolution");
18
+ const getPackageVersion_1 = require("./getPackageVersion");
19
+ const hash_1 = require("./hash");
20
+ const PackageDetails_1 = require("./PackageDetails");
21
+ const parse_1 = require("./patch/parse");
22
+ const patchFs_1 = require("./patchFs");
23
+ const path_1 = require("./path");
24
+ const resolveRelativeFileDependencies_1 = require("./resolveRelativeFileDependencies");
25
+ const spawnSafe_1 = require("./spawnSafe");
26
+ const stateFile_1 = require("./stateFile");
27
+ function printNoPackageFoundError(packageName, packageJsonPath) {
28
+ console_1.default.log(`No such package ${packageName}
29
+
30
+ File not found: ${packageJsonPath}`);
31
+ }
32
+ function makePatch({ packagePathSpecifier, appPath, packageManager, includePaths, excludePaths, patchDir, createIssue, mode, }) {
33
+ const packageDetails = (0, PackageDetails_1.getPatchDetailsFromCliString)(packagePathSpecifier);
34
+ if (!packageDetails) {
35
+ console_1.default.log("No such package", packagePathSpecifier);
36
+ return;
37
+ }
38
+ const state = (0, stateFile_1.getPatchApplicationState)(packageDetails);
39
+ const isRebasing = state?.isRebasing ?? false;
40
+ // If we are rebasing and no patches have been applied, --append is the only valid option because
41
+ // there are no previous patches to overwrite/update
42
+ if (isRebasing &&
43
+ state?.patches.filter((p) => p.didApply).length === 0 &&
44
+ mode.type === "overwrite_last") {
45
+ mode = { type: "append", name: "initial" };
46
+ }
47
+ if (isRebasing && state) {
48
+ (0, stateFile_1.verifyAppliedPatches)({ appPath, patchDir, state });
49
+ }
50
+ if (mode.type === "overwrite_last" &&
51
+ isRebasing &&
52
+ state?.patches.length === 0) {
53
+ mode = { type: "append", name: "initial" };
54
+ }
55
+ const existingPatches = (0, patchFs_1.getGroupedPatches)(patchDir).pathSpecifierToPatchFiles[packageDetails.pathSpecifier] || [];
56
+ // apply all existing patches if appending
57
+ // otherwise apply all but the last
58
+ const previouslyAppliedPatches = state?.patches.filter((p) => p.didApply);
59
+ const patchesToApplyBeforeDiffing = isRebasing
60
+ ? mode.type === "append"
61
+ ? existingPatches.slice(0, previouslyAppliedPatches.length)
62
+ : state.patches[state.patches.length - 1].didApply
63
+ ? existingPatches.slice(0, previouslyAppliedPatches.length - 1)
64
+ : existingPatches.slice(0, previouslyAppliedPatches.length)
65
+ : mode.type === "append"
66
+ ? existingPatches
67
+ : existingPatches.slice(0, -1);
68
+ if (createIssue && mode.type === "append") {
69
+ console_1.default.log("--create-issue is not compatible with --append.");
70
+ process.exit(1);
71
+ }
72
+ if (createIssue && isRebasing) {
73
+ console_1.default.log("--create-issue is not compatible with rebasing.");
74
+ process.exit(1);
75
+ }
76
+ const numPatchesAfterCreate = mode.type === "append" || existingPatches.length === 0
77
+ ? existingPatches.length + 1
78
+ : existingPatches.length;
79
+ const vcs = (0, createIssue_1.getPackageVCSDetails)(packageDetails);
80
+ const canCreateIssue = !isRebasing &&
81
+ (0, createIssue_1.shouldRecommendIssue)(vcs) &&
82
+ numPatchesAfterCreate === 1 &&
83
+ mode.type !== "append";
84
+ const appPackageJson = require((0, path_1.join)(appPath, "package.json"));
85
+ const packagePath = (0, path_1.join)(appPath, packageDetails.path);
86
+ const packageJsonPath = (0, path_1.join)(packagePath, "package.json");
87
+ if (!(0, fs_extra_1.existsSync)(packageJsonPath)) {
88
+ printNoPackageFoundError(packagePathSpecifier, packageJsonPath);
89
+ process.exit(1);
90
+ }
91
+ const tmpRepo = (0, tmp_1.dirSync)({ unsafeCleanup: true });
92
+ const tmpRepoPackagePath = (0, path_1.join)(tmpRepo.name, packageDetails.path);
93
+ const tmpRepoNpmRoot = tmpRepoPackagePath.slice(0, -`/node_modules/${packageDetails.name}`.length);
94
+ const tmpRepoPackageJsonPath = (0, path_1.join)(tmpRepoNpmRoot, "package.json");
95
+ try {
96
+ const patchesDir = (0, path_1.resolve)((0, path_1.join)(appPath, patchDir));
97
+ console_1.default.info(chalk_1.default.grey("•"), "Creating temporary folder");
98
+ // make a blank package.json
99
+ (0, fs_extra_1.mkdirpSync)(tmpRepoNpmRoot);
100
+ (0, fs_extra_1.writeFileSync)(tmpRepoPackageJsonPath, JSON.stringify({
101
+ dependencies: {
102
+ [packageDetails.name]: (0, getPackageResolution_1.getPackageResolution)({
103
+ packageDetails,
104
+ packageManager,
105
+ appPath,
106
+ }),
107
+ },
108
+ resolutions: (0, resolveRelativeFileDependencies_1.resolveRelativeFileDependencies)(appPath, appPackageJson.resolutions || {}),
109
+ }));
110
+ const packageVersion = (0, getPackageVersion_1.getPackageVersion)((0, path_1.join)((0, path_1.resolve)(packageDetails.path), "package.json"));
111
+ [".npmrc", ".yarnrc", ".yarn"].forEach((rcFile) => {
112
+ const rcPath = (0, path_1.join)(appPath, rcFile);
113
+ if ((0, fs_extra_1.existsSync)(rcPath)) {
114
+ (0, fs_extra_1.copySync)(rcPath, (0, path_1.join)(tmpRepo.name, rcFile), { dereference: true });
115
+ }
116
+ });
117
+ if (packageManager === "yarn") {
118
+ console_1.default.info(chalk_1.default.grey("•"), `Installing ${packageDetails.name}@${packageVersion} with yarn`);
119
+ try {
120
+ // try first without ignoring scripts in case they are required
121
+ // this works in 99.99% of cases
122
+ (0, spawnSafe_1.spawnSafeSync)(`yarn`, ["install", "--ignore-engines"], {
123
+ cwd: tmpRepoNpmRoot,
124
+ logStdErrOnError: false,
125
+ });
126
+ }
127
+ catch (e) {
128
+ // try again while ignoring scripts in case the script depends on
129
+ // an implicit context which we haven't reproduced
130
+ (0, spawnSafe_1.spawnSafeSync)(`yarn`, ["install", "--ignore-engines", "--ignore-scripts"], {
131
+ cwd: tmpRepoNpmRoot,
132
+ });
133
+ }
134
+ }
135
+ else if (packageManager === "bun") {
136
+ console_1.default.info(chalk_1.default.grey("•"), `Installing ${packageDetails.name}@${packageVersion} with bun`);
137
+ try {
138
+ (0, spawnSafe_1.spawnSafeSync)(`bun`, ["install"], {
139
+ cwd: tmpRepoNpmRoot,
140
+ logStdErrOnError: false,
141
+ });
142
+ }
143
+ catch (e) {
144
+ (0, spawnSafe_1.spawnSafeSync)(`bun`, ["install", "--no-save"], {
145
+ cwd: tmpRepoNpmRoot,
146
+ });
147
+ }
148
+ }
149
+ else {
150
+ console_1.default.info(chalk_1.default.grey("•"), `Installing ${packageDetails.name}@${packageVersion} with npm`);
151
+ try {
152
+ // try first without ignoring scripts in case they are required
153
+ // this works in 99.99% of cases
154
+ (0, spawnSafe_1.spawnSafeSync)(`npm`, ["i", "--force"], {
155
+ cwd: tmpRepoNpmRoot,
156
+ logStdErrOnError: false,
157
+ stdio: "ignore",
158
+ });
159
+ }
160
+ catch (e) {
161
+ // try again while ignoring scripts in case the script depends on
162
+ // an implicit context which we haven't reproduced
163
+ (0, spawnSafe_1.spawnSafeSync)(`npm`, ["i", "--ignore-scripts", "--force"], {
164
+ cwd: tmpRepoNpmRoot,
165
+ stdio: "ignore",
166
+ });
167
+ }
168
+ }
169
+ const git = (...args) => (0, spawnSafe_1.spawnSafeSync)("git", args, {
170
+ cwd: tmpRepo.name,
171
+ env: { ...process.env, HOME: tmpRepo.name },
172
+ maxBuffer: 1024 * 1024 * 100,
173
+ });
174
+ // remove nested node_modules just to be safe
175
+ (0, fs_extra_1.removeSync)((0, path_1.join)(tmpRepoPackagePath, "node_modules"));
176
+ // remove .git just to be safe
177
+ (0, fs_extra_1.removeSync)((0, path_1.join)(tmpRepoPackagePath, ".git"));
178
+ // remove patch-package state file
179
+ (0, fs_extra_1.removeSync)((0, path_1.join)(tmpRepoPackagePath, stateFile_1.STATE_FILE_NAME));
180
+ // commit the package
181
+ console_1.default.info(chalk_1.default.grey("•"), "Diffing your files with clean files");
182
+ (0, fs_extra_1.writeFileSync)((0, path_1.join)(tmpRepo.name, ".gitignore"), "!/node_modules\n\n");
183
+ git("init");
184
+ git("config", "--local", "user.name", "patch-package");
185
+ git("config", "--local", "user.email", "patch@pack.age");
186
+ // remove ignored files first
187
+ (0, filterFiles_1.removeIgnoredFiles)(tmpRepoPackagePath, includePaths, excludePaths);
188
+ for (const patchDetails of patchesToApplyBeforeDiffing) {
189
+ if (!(0, applyPatches_1.applyPatch)({
190
+ patchDetails,
191
+ patchDir,
192
+ patchFilePath: (0, path_1.join)(appPath, patchDir, patchDetails.patchFilename),
193
+ reverse: false,
194
+ cwd: tmpRepo.name,
195
+ bestEffort: false,
196
+ })) {
197
+ // TODO: add better error message once --rebase is implemented
198
+ console_1.default.log(`Failed to apply patch ${patchDetails.patchFilename} to ${packageDetails.pathSpecifier}`);
199
+ process.exit(1);
200
+ }
201
+ }
202
+ git("add", "-f", packageDetails.path);
203
+ git("commit", "--allow-empty", "-m", "init");
204
+ // replace package with user's version
205
+ (0, fs_extra_1.removeSync)(tmpRepoPackagePath);
206
+ // pnpm installs packages as symlinks, copySync would copy only the symlink
207
+ (0, fs_extra_1.copySync)((0, fs_extra_1.realpathSync)(packagePath), tmpRepoPackagePath);
208
+ // remove nested node_modules just to be safe
209
+ (0, fs_extra_1.removeSync)((0, path_1.join)(tmpRepoPackagePath, "node_modules"));
210
+ // remove .git just to be safe
211
+ (0, fs_extra_1.removeSync)((0, path_1.join)(tmpRepoPackagePath, ".git"));
212
+ // remove patch-package state file
213
+ (0, fs_extra_1.removeSync)((0, path_1.join)(tmpRepoPackagePath, stateFile_1.STATE_FILE_NAME));
214
+ // also remove ignored files like before
215
+ (0, filterFiles_1.removeIgnoredFiles)(tmpRepoPackagePath, includePaths, excludePaths);
216
+ // stage all files
217
+ git("add", "-f", packageDetails.path);
218
+ // get diff of changes
219
+ const diffResult = git("diff", "--cached", "--no-color", "--ignore-space-at-eol", "--no-ext-diff", "--src-prefix=a/", "--dst-prefix=b/");
220
+ if (diffResult.stdout.length === 0) {
221
+ console_1.default.log(`⁉️ Not creating patch file for package '${packagePathSpecifier}'`);
222
+ console_1.default.log(`⁉️ There don't appear to be any changes.`);
223
+ if (isRebasing && mode.type === "overwrite_last") {
224
+ console_1.default.log("\n💡 To remove a patch file, delete it and then reinstall node_modules from scratch.");
225
+ }
226
+ process.exit(1);
227
+ return;
228
+ }
229
+ try {
230
+ (0, parse_1.parsePatchFile)(diffResult.stdout.toString());
231
+ }
232
+ catch (e) {
233
+ if (e.message.includes("Unexpected file mode string: 120000")) {
234
+ console_1.default.log(`
235
+ ⛔️ ${chalk_1.default.red.bold("ERROR")}
236
+
237
+ Your changes involve creating symlinks. patch-package does not yet support
238
+ symlinks.
239
+
240
+ ️Please use ${chalk_1.default.bold("--include")} and/or ${chalk_1.default.bold("--exclude")} to narrow the scope of your patch if
241
+ this was unintentional.
242
+ `);
243
+ }
244
+ else {
245
+ const outPath = "./patch-package-error.json.gz";
246
+ (0, fs_extra_1.writeFileSync)(outPath, (0, zlib_1.gzipSync)(JSON.stringify({
247
+ error: {
248
+ message: e.message,
249
+ stack: e.stack,
250
+ },
251
+ patch: diffResult.stdout.toString(),
252
+ })));
253
+ console_1.default.log(`
254
+ ⛔️ ${chalk_1.default.red.bold("ERROR")}
255
+
256
+ patch-package was unable to read the patch-file made by git. This should not
257
+ happen.
258
+
259
+ A diagnostic file was written to
260
+
261
+ ${outPath}
262
+
263
+ Please attach it to a github issue
264
+
265
+ https://github.com/ds300/patch-package/issues/new?title=New+patch+parse+failed&body=Please+attach+the+diagnostic+file+by+dragging+it+into+here+🙏
266
+
267
+ Note that this diagnostic file will contain code from the package you were
268
+ attempting to patch.
269
+
270
+ `);
271
+ }
272
+ process.exit(1);
273
+ return;
274
+ }
275
+ // maybe delete existing
276
+ if (mode.type === "append" && !isRebasing && existingPatches.length === 1) {
277
+ // if we are appending to an existing patch that doesn't have a sequence number let's rename it
278
+ const prevPatch = existingPatches[0];
279
+ if (prevPatch.sequenceNumber === undefined) {
280
+ const newFileName = createPatchFileName({
281
+ packageDetails,
282
+ packageVersion,
283
+ sequenceNumber: 1,
284
+ sequenceName: prevPatch.sequenceName ?? "initial",
285
+ });
286
+ const oldPath = (0, path_1.join)(appPath, patchDir, prevPatch.patchFilename);
287
+ const newPath = (0, path_1.join)(appPath, patchDir, newFileName);
288
+ (0, fs_1.renameSync)(oldPath, newPath);
289
+ prevPatch.sequenceNumber = 1;
290
+ prevPatch.patchFilename = newFileName;
291
+ prevPatch.sequenceName = prevPatch.sequenceName ?? "initial";
292
+ }
293
+ }
294
+ const lastPatch = existingPatches[state ? state.patches.length - 1 : existingPatches.length - 1];
295
+ const sequenceName = mode.type === "append" ? mode.name : lastPatch?.sequenceName;
296
+ const sequenceNumber = mode.type === "append"
297
+ ? (lastPatch?.sequenceNumber ?? 0) + 1
298
+ : lastPatch?.sequenceNumber;
299
+ const patchFileName = createPatchFileName({
300
+ packageDetails,
301
+ packageVersion,
302
+ sequenceName,
303
+ sequenceNumber,
304
+ });
305
+ const patchPath = (0, path_1.join)(patchesDir, patchFileName);
306
+ if (!(0, fs_extra_1.existsSync)((0, path_1.dirname)(patchPath))) {
307
+ // scoped package
308
+ (0, fs_extra_1.mkdirSync)((0, path_1.dirname)(patchPath));
309
+ }
310
+ // if we are inserting a new patch into a sequence we most likely need to update the sequence numbers
311
+ if (isRebasing && mode.type === "append") {
312
+ const patchesToNudge = existingPatches.slice(state.patches.length);
313
+ if (sequenceNumber === undefined) {
314
+ throw new Error("sequenceNumber is undefined while rebasing");
315
+ }
316
+ if (patchesToNudge[0]?.sequenceNumber !== undefined &&
317
+ patchesToNudge[0].sequenceNumber <= sequenceNumber) {
318
+ let next = sequenceNumber + 1;
319
+ for (const p of patchesToNudge) {
320
+ const newName = createPatchFileName({
321
+ packageDetails,
322
+ packageVersion,
323
+ sequenceName: p.sequenceName,
324
+ sequenceNumber: next++,
325
+ });
326
+ console_1.default.log("Renaming", chalk_1.default.bold(p.patchFilename), "to", chalk_1.default.bold(newName));
327
+ const oldPath = (0, path_1.join)(appPath, patchDir, p.patchFilename);
328
+ const newPath = (0, path_1.join)(appPath, patchDir, newName);
329
+ (0, fs_1.renameSync)(oldPath, newPath);
330
+ }
331
+ }
332
+ }
333
+ (0, fs_extra_1.writeFileSync)(patchPath, diffResult.stdout);
334
+ console_1.default.log(`${chalk_1.default.green("✔")} Created file ${(0, path_1.join)(patchDir, patchFileName)}\n`);
335
+ const prevState = patchesToApplyBeforeDiffing.map((p) => ({
336
+ patchFilename: p.patchFilename,
337
+ didApply: true,
338
+ patchContentHash: (0, hash_1.hashFile)((0, path_1.join)(appPath, patchDir, p.patchFilename)),
339
+ }));
340
+ const nextState = [
341
+ ...prevState,
342
+ {
343
+ patchFilename: patchFileName,
344
+ didApply: true,
345
+ patchContentHash: (0, hash_1.hashFile)(patchPath),
346
+ },
347
+ ];
348
+ // if any patches come after this one we just made, we should reapply them
349
+ let didFailWhileFinishingRebase = false;
350
+ if (isRebasing) {
351
+ const currentPatches = (0, patchFs_1.getGroupedPatches)((0, path_1.join)(appPath, patchDir))
352
+ .pathSpecifierToPatchFiles[packageDetails.pathSpecifier];
353
+ const previouslyUnappliedPatches = currentPatches.slice(nextState.length);
354
+ if (previouslyUnappliedPatches.length) {
355
+ console_1.default.log(`Fast forwarding...`);
356
+ for (const patch of previouslyUnappliedPatches) {
357
+ const patchFilePath = (0, path_1.join)(appPath, patchDir, patch.patchFilename);
358
+ if (!(0, applyPatches_1.applyPatch)({
359
+ patchDetails: patch,
360
+ patchDir,
361
+ patchFilePath,
362
+ reverse: false,
363
+ cwd: process.cwd(),
364
+ bestEffort: false,
365
+ })) {
366
+ didFailWhileFinishingRebase = true;
367
+ logPatchSequenceError({ patchDetails: patch });
368
+ nextState.push({
369
+ patchFilename: patch.patchFilename,
370
+ didApply: false,
371
+ patchContentHash: (0, hash_1.hashFile)(patchFilePath),
372
+ });
373
+ break;
374
+ }
375
+ else {
376
+ console_1.default.log(` ${chalk_1.default.green("✔")} ${patch.patchFilename}`);
377
+ nextState.push({
378
+ patchFilename: patch.patchFilename,
379
+ didApply: true,
380
+ patchContentHash: (0, hash_1.hashFile)(patchFilePath),
381
+ });
382
+ }
383
+ }
384
+ }
385
+ }
386
+ if (isRebasing || numPatchesAfterCreate > 1) {
387
+ (0, stateFile_1.savePatchApplicationState)({
388
+ packageDetails,
389
+ patches: nextState,
390
+ isRebasing: didFailWhileFinishingRebase,
391
+ });
392
+ }
393
+ else {
394
+ (0, stateFile_1.clearPatchApplicationState)(packageDetails);
395
+ }
396
+ if (canCreateIssue) {
397
+ if (createIssue) {
398
+ (0, createIssue_1.openIssueCreationLink)({
399
+ packageDetails,
400
+ patchFileContents: diffResult.stdout.toString(),
401
+ packageVersion,
402
+ patchPath,
403
+ });
404
+ }
405
+ else {
406
+ (0, createIssue_1.maybePrintIssueCreationPrompt)(vcs, packageDetails, packageManager);
407
+ }
408
+ }
409
+ }
410
+ catch (e) {
411
+ console_1.default.log(e);
412
+ throw e;
413
+ }
414
+ finally {
415
+ tmpRepo.removeCallback();
416
+ }
417
+ }
418
+ function createPatchFileName({ packageDetails, packageVersion, sequenceNumber, sequenceName, }) {
419
+ const packageNames = packageDetails.packageNames
420
+ .map((name) => name.replace(/\//g, "+"))
421
+ .join("++");
422
+ const nameAndVersion = `${packageNames}+${packageVersion}`;
423
+ const num = sequenceNumber === undefined
424
+ ? ""
425
+ : `+${sequenceNumber.toString().padStart(3, "0")}`;
426
+ const name = !sequenceName ? "" : `+${sequenceName}`;
427
+ return `${nameAndVersion}${num}${name}.patch`;
428
+ }
429
+ function logPatchSequenceError({ patchDetails, }) {
430
+ console_1.default.log(`
431
+ ${chalk_1.default.red.bold("⛔ ERROR")}
432
+
433
+ Failed to apply patch file ${chalk_1.default.bold(patchDetails.patchFilename)}.
434
+
435
+ If this patch file is no longer useful, delete it and run
436
+
437
+ ${chalk_1.default.bold(`patch-package`)}
438
+
439
+ To partially apply the patch (if possible) and output a log of errors to fix, run
440
+
441
+ ${chalk_1.default.bold(`patch-package --partial`)}
442
+
443
+ After which you should make any required changes inside ${patchDetails.path}, and finally run
444
+
445
+ ${chalk_1.default.bold(`patch-package ${patchDetails.pathSpecifier}`)}
446
+
447
+ to update the patch file.
448
+ `);
449
+ }
450
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZVBhdGNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21ha2VQYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXdEQSw4QkFrZ0JDO0FBMkJELHNEQTBCQztBQS9tQkQsa0RBQXlCO0FBQ3pCLHNEQUE2QjtBQUM3QiwyQkFBK0I7QUFDL0IsdUNBUWlCO0FBQ2pCLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFDL0IsaURBQTJDO0FBQzNDLCtDQUtzQjtBQUV0QiwrQ0FBa0Q7QUFDbEQsaUVBQTZEO0FBQzdELDJEQUF1RDtBQUN2RCxpQ0FBaUM7QUFDakMscURBSXlCO0FBQ3pCLHlDQUE4QztBQUM5Qyx1Q0FBNkM7QUFDN0MsaUNBQStDO0FBQy9DLHVGQUFtRjtBQUNuRiwyQ0FBMkM7QUFDM0MsMkNBT29CO0FBRXBCLFNBQVMsd0JBQXdCLENBQy9CLFdBQW1CLEVBQ25CLGVBQXVCO0lBRXZCLGlCQUFPLENBQUMsR0FBRyxDQUNULG1CQUFtQixXQUFXOztvQkFFZCxlQUFlLEVBQUUsQ0FDbEMsQ0FBQTtBQUNILENBQUM7QUFFRCxTQUFnQixTQUFTLENBQUMsRUFDeEIsb0JBQW9CLEVBQ3BCLE9BQU8sRUFDUCxjQUFjLEVBQ2QsWUFBWSxFQUNaLFlBQVksRUFDWixRQUFRLEVBQ1IsV0FBVyxFQUNYLElBQUksR0FVTDtJQUNDLE1BQU0sY0FBYyxHQUFHLElBQUEsNkNBQTRCLEVBQUMsb0JBQW9CLENBQUMsQ0FBQTtJQUV6RSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDcEIsaUJBQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQTtRQUNwRCxPQUFNO0lBQ1IsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLElBQUEsb0NBQXdCLEVBQUMsY0FBYyxDQUFDLENBQUE7SUFDdEQsTUFBTSxVQUFVLEdBQUcsS0FBSyxFQUFFLFVBQVUsSUFBSSxLQUFLLENBQUE7SUFFN0MsaUdBQWlHO0lBQ2pH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LEdBR2I7SUFDQyxpQkFBTyxDQUFDLEdBQUcsQ0FBQztFQUNaLGVBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzs7NkJBRUUsZUFBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDOzs7O0lBSS9ELGVBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDOzs7O0lBSTNCLGVBQUssQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUM7OzBEQUdyQyxZQUFZLENBQUMsSUFDZjs7SUFFRSxlQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixZQUFZLENBQUMsYUFBYSxFQUFFLENBQUM7OztDQUc1RCxDQUFDLENBQUE7QUFDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsa1wiXHJcbmltcG9ydCBjb25zb2xlIGZyb20gXCJjb25zb2xlXCJcclxuaW1wb3J0IHsgcmVuYW1lU3luYyB9IGZyb20gXCJmc1wiXHJcbmltcG9ydCB7XHJcbiAgY29weVN5bmMsXHJcbiAgZXhpc3RzU3luYyxcclxuICBta2RpcnBTeW5jLFxyXG4gIG1rZGlyU3luYyxcclxuICByZWFscGF0aFN5bmMsXHJcbiAgcmVtb3ZlU3luYyxcclxuICB3cml0ZUZpbGVTeW5jLFxyXG59IGZyb20gXCJmcy1leHRyYVwiXHJcbmltcG9ydCB7IGRpclN5bmMgfSBmcm9tIFwidG1wXCJcclxuaW1wb3J0IHsgZ3ppcFN5bmMgfSBmcm9tIFwiemxpYlwiXHJcbmltcG9ydCB7IGFwcGx5UGF0Y2ggfSBmcm9tIFwiLi9hcHBseVBhdGNoZXNcIlxyXG5pbXBvcnQge1xyXG4gIGdldFBhY2thZ2VWQ1NEZXRhaWxzLFxyXG4gIG1heWJlUHJpbnRJc3N1ZUNyZWF0aW9uUHJvbXB0LFxyXG4gIG9wZW5Jc3N1ZUNyZWF0aW9uTGluayxcclxuICBzaG91bGRSZWNvbW1lbmRJc3N1ZSxcclxufSBmcm9tIFwiLi9jcmVhdGVJc3N1ZVwiXHJcbmltcG9ydCB7IFBhY2thZ2VNYW5hZ2VyIH0gZnJvbSBcIi4vZGV0ZWN0UGFja2FnZU1hbmFnZXJcIlxyXG5pbXBvcnQgeyByZW1vdmVJZ25vcmVkRmlsZXMgfSBmcm9tIFwiLi9maWx0ZXJGaWxlc1wiXHJcbmltcG9ydCB7IGdldFBhY2thZ2VSZXNvbHV0aW9uIH0gZnJvbSBcIi4vZ2V0UGFja2FnZVJlc29sdXRpb25cIlxyXG5pbXBvcnQgeyBnZXRQYWNrYWdlVmVyc2lvbiB9IGZyb20gXCIuL2dldFBhY2thZ2VWZXJzaW9uXCJcclxuaW1wb3J0IHsgaGFzaEZpbGUgfSBmcm9tIFwiLi9oYXNoXCJcclxuaW1wb3J0IHtcclxuICBnZXRQYXRjaERldGFpbHNGcm9tQ2xpU3RyaW5nLFxyXG4gIFBhY2thZ2VEZXRhaWxzLFxyXG4gIFBhdGNoZWRQYWNrYWdlRGV0YWlscyxcclxufSBmcm9tIFwiLi9QYWNrYWdlRGV0YWlsc1wiXHJcbmltcG9ydCB7IHBhcnNlUGF0Y2hGaWxlIH0gZnJvbSBcIi4vcGF0Y2gvcGFyc2VcIlxyXG5pbXBvcnQgeyBnZXRHcm91cGVkUGF0Y2hlcyB9IGZyb20gXCIuL3BhdGNoRnNcIlxyXG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luLCByZXNvbHZlIH0gZnJvbSBcIi4vcGF0aFwiXHJcbmltcG9ydCB7IHJlc29sdmVSZWxhdGl2ZUZpbGVEZXBlbmRlbmNpZXMgfSBmcm9tIFwiLi9yZXNvbHZlUmVsYXRpdmVGaWxlRGVwZW5kZW5jaWVzXCJcclxuaW1wb3J0IHsgc3Bhd25TYWZlU3luYyB9IGZyb20gXCIuL3NwYXduU2FmZVwiXHJcbmltcG9ydCB7XHJcbiAgY2xlYXJQYXRjaEFwcGxpY2F0aW9uU3RhdGUsXHJcbiAgZ2V0UGF0Y2hBcHBsaWNhdGlvblN0YXRlLFxyXG4gIFBhdGNoU3RhdGUsXHJcbiAgc2F2ZVBhdGNoQXBwbGljYXRpb25TdGF0ZSxcclxuICBTVEFURV9GSUxFX05BTUUsXHJcbiAgdmVyaWZ5QXBwbGllZFBhdGNoZXMsXHJcbn0gZnJvbSBcIi4vc3RhdGVGaWxlXCJcclxuXHJcbmZ1bmN0aW9uIHByaW50Tm9QYWNrYWdlRm91bmRFcnJvcihcclxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxyXG4gIHBhY2thZ2VKc29uUGF0aDogc3RyaW5nLFxyXG4pIHtcclxuICBjb25zb2xlLmxvZyhcclxuICAgIGBObyBzdWNoIHBhY2thZ2UgJHtwYWNrYWdlTmFtZX1cclxuXHJcbiAgRmlsZSBub3QgZm91bmQ6ICR7cGFja2FnZUpzb25QYXRofWAsXHJcbiAgKVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWFrZVBhdGNoKHtcclxuICBwYWNrYWdlUGF0aFNwZWNpZmllcixcclxuICBhcHBQYXRoLFxyXG4gIHBhY2thZ2VNYW5hZ2VyLFxyXG4gIGluY2x1ZGVQYXRocyxcclxuICBleGNsdWRlUGF0aHMsXHJcbiAgcGF0Y2hEaXIsXHJcbiAgY3JlYXRlSXNzdWUsXHJcbiAgbW9kZSxcclxufToge1xyXG4gIHBhY2thZ2VQYXRoU3BlY2lmaWVyOiBzdHJpbmdcclxuICBhcHBQYXRoOiBzdHJpbmdcclxuICBwYWNrYWdlTWFuYWdlcjogUGFja2FnZU1hbmFnZXJcclxuICBpbmNsdWRlUGF0aHM6IFJlZ0V4cFxyXG4gIGV4Y2x1ZGVQYXRoczogUmVnRXhwXHJcbiAgcGF0Y2hEaXI6IHN0cmluZ1xyXG4gIGNyZWF0ZUlzc3VlOiBib29sZWFuXHJcbiAgbW9kZTogeyB0eXBlOiBcIm92ZXJ3cml0ZV9sYXN0XCIgfSB8IHsgdHlwZTogXCJhcHBlbmRcIjsgbmFtZT86IHN0cmluZyB9XHJcbn0pIHtcclxuICBjb25zdCBwYWNrYWdlRGV0YWlscyA9IGdldFBhdGNoRGV0YWlsc0Zyb21DbGlTdHJpbmcocGFja2FnZVBhdGhTcGVjaWZpZXIpXHJcblxyXG4gIGlmICghcGFja2FnZURldGFpbHMpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiTm8gc3VjaCBwYWNrYWdlXCIsIHBhY2thZ2VQYXRoU3BlY2lmaWVyKVxyXG4gICAgcmV0dXJuXHJcbiAgfVxyXG5cclxuICBjb25zdCBzdGF0ZSA9IGdldFBhdGNoQXBwbGljYXRpb25TdGF0ZShwYWNrYWdlRGV0YWlscylcclxuICBjb25zdCBpc1JlYmFzaW5nID0gc3RhdGU/LmlzUmViYXNpbmcgPz8gZmFsc2VcclxuXHJcbiAgLy8gSWYgd2UgYXJlIHJlYmFzaW5nIGFuZCBubyBwYXRjaGVzIGhhdmUgYmVlbiBhcHBsaWVkLCAtLWFwcGVuZCBpcyB0aGUgb25seSB2YWxpZCBvcHRpb24gYmVjYXVzZVxyXG4gIC8vIHRoZXJlIGFyZSBubyBwcmV2aW91cyBwYXRjaGVzIHRvIG92ZXJ3cml0ZS91cGRhdGVcclxuICBpZiAoXHJcbiAgICBpc1JlYmFzaW5nICYmXHJcbiAgICBzdGF0ZT8ucGF0Y2hlcy5maWx0ZXIoKHApID0+IHAuZGlkQXBwbHkpLmxlbmd0aCA9PT0gMCAmJlxyXG4gICAgbW9kZS50eXBlID09PSBcIm92ZXJ3cml0ZV9sYXN0XCJcclxuICApIHtcclxuICAgIG1vZGUgPSB7IHR5cGU6IFwiYXBwZW5kXCIsIG5hbWU6IFwiaW5pdGlhbFwiIH1cclxuICB9XHJcblxyXG4gIGlmIChpc1JlYmFzaW5nICYmIHN0YXRlKSB7XHJcbiAgICB2ZXJpZnlBcHBsaWVkUGF0Y2hlcyh7IGFwcFBhdGgsIHBhdGNoRGlyLCBzdGF0ZSB9KVxyXG4gIH1cclxuXHJcbiAgaWYgKFxyXG4gICAgbW9kZS50eXBlID09PSBcIm92ZXJ3cml0ZV9sYXN0XCIgJiZcclxuICAgIGlzUmViYXNpbmcgJiZcclxuICAgIHN0YXRlPy5wYXRjaGVzLmxlbmd0aCA9PT0gMFxyXG4gICkge1xyXG4gICAgbW9kZSA9IHsgdHlwZTogXCJhcHBlbmRcIiwgbmFtZTogXCJpbml0aWFsXCIgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgZXhpc3RpbmdQYXRjaGVzID1cclxuICAgIGdldEdyb3VwZWRQYXRjaGVzKHBhdGNoRGlyKS5wYXRoU3BlY2lmaWVyVG9QYXRjaEZpbGVzW1xyXG4gICAgICBwYWNrYWdlRGV0YWlscy5wYXRoU3BlY2lmaWVyXHJcbiAgICBdIHx8IFtdXHJcblxyXG4gIC8vIGFwcGx5IGFsbCBleGlzdGluZyBwYXRjaGVzIGlmIGFwcGVuZGluZ1xyXG4gIC8vIG90aGVyd2lzZSBhcHBseSBhbGwgYnV0IHRoZSBsYXN0XHJcbiAgY29uc3QgcHJldmlvdXNseUFwcGxpZWRQYXRjaGVzID0gc3RhdGU/LnBhdGNoZXMuZmlsdGVyKChwKSA9PiBwLmRpZEFwcGx5KVxyXG4gIGNvbnN0IHBhdGNoZXNUb0FwcGx5QmVmb3JlRGlmZmluZzogUGF0Y2hlZFBhY2thZ2VEZXRhaWxzW10gPSBpc1JlYmFzaW5nXHJcbiAgICA/IG1vZGUudHlwZSA9PT0gXCJhcHBlbmRcIlxyXG4gICAgICA/IGV4aXN0aW5nUGF0Y2hlcy5zbGljZSgwLCBwcmV2aW91c2x5QXBwbGllZFBhdGNoZXMhLmxlbmd0aClcclxuICAgICAgOiBzdGF0ZSEucGF0Y2hlc1tzdGF0ZSEucGF0Y2hlcy5sZW5ndGggLSAxXS5kaWRBcHBseVxyXG4gICAgICAgID8gZXhpc3RpbmdQYXRjaGVzLnNsaWNlKDAsIHByZXZpb3VzbHlBcHBsaWVkUGF0Y2hlcyEubGVuZ3RoIC0gMSlcclxuICAgICAgICA6IGV4aXN0aW5nUGF0Y2hlcy5zbGljZSgwLCBwcmV2aW91c2x5QXBwbGllZFBhdGNoZXMhLmxlbmd0aClcclxuICAgIDogbW9kZS50eXBlID09PSBcImFwcGVuZFwiXHJcbiAgICAgID8gZXhpc3RpbmdQYXRjaGVzXHJcbiAgICAgIDogZXhpc3RpbmdQYXRjaGVzLnNsaWNlKDAsIC0xKVxyXG5cclxuICBpZiAoY3JlYXRlSXNzdWUgJiYgbW9kZS50eXBlID09PSBcImFwcGVuZFwiKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIi0tY3JlYXRlLWlzc3VlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggLS1hcHBlbmQuXCIpXHJcbiAgICBwcm9jZXNzLmV4aXQoMSlcclxuICB9XHJcblxyXG4gIGlmIChjcmVhdGVJc3N1ZSAmJiBpc1JlYmFzaW5nKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIi0tY3JlYXRlLWlzc3VlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggcmViYXNpbmcuXCIpXHJcbiAgICBwcm9jZXNzLmV4aXQoMSlcclxuICB9XHJcblxyXG4gIGNvbnN0IG51bVBhdGNoZXNBZnRlckNyZWF0ZSA9XHJcbiAgICBtb2RlLnR5cGUgPT09IFwiYXBwZW5kXCIgfHwgZXhpc3RpbmdQYXRjaGVzLmxlbmd0aCA9PT0gMFxyXG4gICAgICA/IGV4aXN0aW5nUGF0Y2hlcy5sZW5ndGggKyAxXHJcbiAgICAgIDogZXhpc3RpbmdQYXRjaGVzLmxlbmd0aFxyXG4gIGNvbnN0IHZjcyA9IGdldFBhY2thZ2VWQ1NEZXRhaWxzKHBhY2thZ2VEZXRhaWxzKVxyXG4gIGNvbnN0IGNhbkNyZWF0ZUlzc3VlID1cclxuICAgICFpc1JlYmFzaW5nICYmXHJcbiAgICBzaG91bGRSZWNvbW1lbmRJc3N1ZSh2Y3MpICYmXHJcbiAgICBudW1QYXRjaGVzQWZ0ZXJDcmVhdGUgPT09IDEgJiZcclxuICAgIG1vZGUudHlwZSAhPT0gXCJhcHBlbmRcIlxyXG5cclxuICBjb25zdCBhcHBQYWNrYWdlSnNvbiA9IHJlcXVpcmUoam9pbihhcHBQYXRoLCBcInBhY2thZ2UuanNvblwiKSlcclxuICBjb25zdCBwYWNrYWdlUGF0aCA9IGpvaW4oYXBwUGF0aCwgcGFja2FnZURldGFpbHMucGF0aClcclxuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBqb2luKHBhY2thZ2VQYXRoLCBcInBhY2thZ2UuanNvblwiKVxyXG5cclxuICBpZiAoIWV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xyXG4gICAgcHJpbnROb1BhY2thZ2VGb3VuZEVycm9yKHBhY2thZ2VQYXRoU3BlY2lmaWVyLCBwYWNrYWdlSnNvblBhdGgpXHJcbiAgICBwcm9jZXNzLmV4aXQoMSlcclxuICB9XHJcblxyXG4gIGNvbnN0IHRtcFJlcG8gPSBkaXJTeW5jKHsgdW5zYWZlQ2xlYW51cDogdHJ1ZSB9KVxyXG4gIGNvbnN0IHRtcFJlcG9QYWNrYWdlUGF0aCA9IGpvaW4odG1wUmVwby5uYW1lLCBwYWNrYWdlRGV0YWlscy5wYXRoKVxyXG4gIGNvbnN0IHRtcFJlcG9OcG1Sb290ID0gdG1wUmVwb1BhY2thZ2VQYXRoLnNsaWNlKFxyXG4gICAgMCxcclxuICAgIC1gL25vZGVfbW9kdWxlcy8ke3BhY2thZ2VEZXRhaWxzLm5hbWV9YC5sZW5ndGgsXHJcbiAgKVxyXG5cclxuICBjb25zdCB0bXBSZXBvUGFja2FnZUpzb25QYXRoID0gam9pbih0bXBSZXBvTnBtUm9vdCwgXCJwYWNrYWdlLmpzb25cIilcclxuXHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IHBhdGNoZXNEaXIgPSByZXNvbHZlKGpvaW4oYXBwUGF0aCwgcGF0Y2hEaXIpKVxyXG5cclxuICAgIGNvbnNvbGUuaW5mbyhjaGFsay5ncmV5KFwi4oCiXCIpLCBcIkNyZWF0aW5nIHRlbXBvcmFyeSBmb2xkZXJcIilcclxuXHJcbiAgICAvLyBtYWtlIGEgYmxhbmsgcGFja2FnZS5qc29uXHJcbiAgICBta2RpcnBTeW5jKHRtcFJlcG9OcG1Sb290KVxyXG4gICAgd3JpdGVGaWxlU3luYyhcclxuICAgICAgdG1wUmVwb1BhY2thZ2VKc29uUGF0aCxcclxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgIGRlcGVuZGVuY2llczoge1xyXG4gICAgICAgICAgW3BhY2thZ2VEZXRhaWxzLm5hbWVdOiBnZXRQYWNrYWdlUmVzb2x1dGlvbih7XHJcbiAgICAgICAgICAgIHBhY2thZ2VEZXRhaWxzLFxyXG4gICAgICAgICAgICBwYWNrYWdlTWFuYWdlcixcclxuICAgICAgICAgICAgYXBwUGF0aCxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVzb2x1dGlvbnM6IHJlc29sdmVSZWxhdGl2ZUZpbGVEZXBlbmRlbmNpZXMoXHJcbiAgICAgICAgICBhcHBQYXRoLFxyXG4gICAgICAgICAgYXBwUGFja2FnZUpzb24ucmVzb2x1dGlvbnMgfHwge30sXHJcbiAgICAgICAgKSxcclxuICAgICAgfSksXHJcbiAgICApXHJcblxyXG4gICAgY29uc3QgcGFja2FnZVZlcnNpb24gPSBnZXRQYWNrYWdlVmVyc2lvbihcclxuICAgICAgam9pbihyZXNvbHZlKHBhY2thZ2VEZXRhaWxzLnBhdGgpLCBcInBhY2thZ2UuanNvblwiKSxcclxuICAgIClcclxuXHJcbiAgICAvLyBjb3B5IC5ucG1yYy8ueWFybnJjIGluIGNhc2UgcGFja2FnZXMgYXJlIGhvc3RlZCBpbiBwcml2YXRlIHJlZ2lzdHJ5XHJcbiAgICAvLyBjb3B5IC55YXJuIGRpcmVjdG9yeSBhcyB3ZWxsIHRvIGVuc3VyZSBpbnN0YWxsYXRpb25zIHdvcmsgaW4geWFybiAyXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6YWxpZ25cclxuICAgIDtbXCIubnBtcmNcIiwgXCIueWFybnJjXCIsIFwiLnlhcm5cIl0uZm9yRWFjaCgocmNGaWxlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJjUGF0aCA9IGpvaW4oYXBwUGF0aCwgcmNGaWxlKVxyXG4gICAgICBpZiAoZXhpc3RzU3luYyhyY1BhdGgpKSB7XHJcbiAgICAgICAgY29weVN5bmMocmNQYXRoLCBqb2luKHRtcFJlcG8ubmFtZSwgcmNGaWxlKSwgeyBkZXJlZmVyZW5jZTogdHJ1ZSB9KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gXCJ5YXJuXCIpIHtcclxuICAgICAgY29uc29sZS5pbmZvKFxyXG4gICAgICAgIGNoYWxrLmdyZXkoXCLigKJcIiksXHJcbiAgICAgICAgYEluc3RhbGxpbmcgJHtwYWNrYWdlRGV0YWlscy5uYW1lfUAke3BhY2thZ2VWZXJzaW9ufSB3aXRoIHlhcm5gLFxyXG4gICAgICApXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gdHJ5IGZpcnN0IHdpdGhvdXQgaWdub3Jpbmcgc2NyaXB0cyBpbiBjYXNlIHRoZXkgYXJlIHJlcXVpcmVkXHJcbiAgICAgICAgLy8gdGhpcyB3b3JrcyBpbiA5OS45OSUgb2YgY2FzZXNcclxuICAgICAgICBzcGF3blNhZmVTeW5jKGB5YXJuYCwgW1wiaW5zdGFsbFwiLCBcIi0taWdub3JlLWVuZ2luZXNcIl0sIHtcclxuICAgICAgICAgIGN3ZDogdG1wUmVwb05wbVJvb3QsXHJcbiAgICAgICAgICBsb2dTdGRFcnJPbkVycm9yOiBmYWxzZSxcclxuICAgICAgICB9KVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgLy8gdHJ5IGFnYWluIHdoaWxlIGlnbm9yaW5nIHNjcmlwdHMgaW4gY2FzZSB0aGUgc2NyaXB0IGRlcGVuZHMgb25cclxuICAgICAgICAvLyBhbiBpbXBsaWNpdCBjb250ZXh0IHdoaWNoIHdlIGhhdmVuJ3QgcmVwcm9kdWNlZFxyXG4gICAgICAgIHNwYXduU2FmZVN5bmMoXHJcbiAgICAgICAgICBgeWFybmAsXHJcbiAgICAgICAgICBbXCJpbnN0YWxsXCIsIFwiLS1pZ25vcmUtZW5naW5lc1wiLCBcIi0taWdub3JlLXNjcmlwdHNcIl0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGN3ZDogdG1wUmVwb05wbVJvb3QsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChwYWNrYWdlTWFuYWdlciA9PT0gXCJidW5cIikge1xyXG4gICAgICBjb25zb2xlLmluZm8oXHJcbiAgICAgICAgY2hhbGsuZ3JleShcIuKAolwiKSxcclxuICAgICAgICBgSW5zdGFsbGluZyAke3BhY2thZ2VEZXRhaWxzLm5hbWV9QCR7cGFja2FnZVZlcnNpb259IHdpdGggYnVuYCxcclxuICAgICAgKVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHNwYXduU2FmZVN5bmMoYGJ1bmAsIFtcImluc3RhbGxcIl0sIHtcclxuICAgICAgICAgIGN3ZDogdG1wUmVwb05wbVJvb3QsXHJcbiAgICAgICAgICBsb2dTdGRFcnJPbkVycm9yOiBmYWxzZSxcclxuICAgICAgICB9KVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgc3Bhd25TYWZlU3luYyhgYnVuYCwgW1wiaW5zdGFsbFwiLCBcIi0tbm8tc2F2ZVwiXSwge1xyXG4gICAgICAgICAgY3dkOiB0bXBSZXBvTnBtUm9vdCxcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmluZm8oXHJcbiAgICAgICAgY2hhbGsuZ3JleShcIuKAolwiKSxcclxuICAgICAgICBgSW5zdGFsbGluZyAke3BhY2thZ2VEZXRhaWxzLm5hbWV9QCR7cGFja2FnZVZlcnNpb259IHdpdGggbnBtYCxcclxuICAgICAgKVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIC8vIHRyeSBmaXJzdCB3aXRob3V0IGlnbm9yaW5nIHNjcmlwdHMgaW4gY2FzZSB0aGV5IGFyZSByZXF1aXJlZFxyXG4gICAgICAgIC8vIHRoaXMgd29ya3MgaW4gOTkuOTklIG9mIGNhc2VzXHJcbiAgICAgICAgc3Bhd25TYWZlU3luYyhgbnBtYCwgW1wiaVwiLCBcIi0tZm9yY2VcIl0sIHtcclxuICAgICAgICAgIGN3ZDogdG1wUmVwb05wbVJvb3QsXHJcbiAgICAgICAgICBsb2dTdGRFcnJPbkVycm9yOiBmYWxzZSxcclxuICAgICAgICAgIHN0ZGlvOiBcImlnbm9yZVwiLFxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAvLyB0cnkgYWdhaW4gd2hpbGUgaWdub3Jpbmcgc2NyaXB0cyBpbiBjYXNlIHRoZSBzY3JpcHQgZGVwZW5kcyBvblxyXG4gICAgICAgIC8vIGFuIGltcGxpY2l0IGNvbnRleHQgd2hpY2ggd2UgaGF2ZW4ndCByZXByb2R1Y2VkXHJcbiAgICAgICAgc3Bhd25TYWZlU3luYyhgbnBtYCwgW1wiaVwiLCBcIi0taWdub3JlLXNjcmlwdHNcIiwgXCItLWZvcmNlXCJdLCB7XHJcbiAgICAgICAgICBjd2Q6IHRtcFJlcG9OcG1Sb290LFxyXG4gICAgICAgICAgc3RkaW86IFwiaWdub3JlXCIsXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGdpdCA9ICguLi5hcmdzOiBzdHJpbmdbXSkgPT5cclxuICAgICAgc3Bhd25TYWZlU3luYyhcImdpdFwiLCBhcmdzLCB7XHJcbiAgICAgICAgY3dkOiB0bXBSZXBvLm5hbWUsXHJcbiAgICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCBIT01FOiB0bXBSZXBvLm5hbWUgfSxcclxuICAgICAgICBtYXhCdWZmZXI6IDEwMjQgKiAxMDI0ICogMTAwLFxyXG4gICAgICB9KVxyXG5cclxuICAgIC8vIHJlbW92ZSBuZXN0ZWQgbm9kZV9tb2R1bGVzIGp1c3QgdG8gYmUgc2FmZVxyXG4gICAgcmVtb3ZlU3luYyhqb2luKHRtcFJlcG9QYWNrYWdlUGF0aCwgXCJub2RlX21vZHVsZXNcIikpXHJcbiAgICAvLyByZW1vdmUgLmdpdCBqdXN0IHRvIGJlIHNhZmVcclxuICAgIHJlbW92ZVN5bmMoam9pbih0bXBSZXBvUGFja2FnZVBhdGgsIFwiLmdpdFwiKSlcclxuICAgIC8vIHJlbW92ZSBwYXRjaC1wYWNrYWdlIHN0YXRlIGZpbGVcclxuICAgIHJlbW92ZVN5bmMoam9pbih0bXBSZXBvUGFja2FnZVBhdGgsIFNUQVRFX0ZJTEVfTkFNRSkpXHJcblxyXG4gICAgLy8gY29tbWl0IHRoZSBwYWNrYWdlXHJcbiAgICBjb25zb2xlLmluZm8oY2hhbGsuZ3JleShcIuKAolwiKSwgXCJEaWZmaW5nIHlvdXIgZmlsZXMgd2l0aCBjbGVhbiBmaWxlc1wiKVxyXG4gICAgd3JpdGVGaWxlU3luYyhqb2luKHRtcFJlcG8ubmFtZSwgXCIuZ2l0aWdub3JlXCIpLCBcIiEvbm9kZV9tb2R1bGVzXFxuXFxuXCIpXHJcbiAgICBnaXQoXCJpbml0XCIpXHJcbiAgICBnaXQoXCJjb25maWdcIiwgXCItLWxvY2FsXCIsIFwidXNlci5uYW1lXCIsIFwicGF0Y2gtcGFja2FnZVwiKVxyXG4gICAgZ2l0KFwiY29uZmlnXCIsIFwiLS1sb2NhbFwiLCBcInVzZXIuZW1haWxcIiwgXCJwYXRjaEBwYWNrLmFnZVwiKVxyXG5cclxuICAgIC8vIHJlbW92ZSBpZ25vcmVkIGZpbGVzIGZpcnN0XHJcbiAgICByZW1vdmVJZ25vcmVkRmlsZXModG1wUmVwb1BhY2thZ2VQYXRoLCBpbmNsdWRlUGF0aHMsIGV4Y2x1ZGVQYXRocylcclxuXHJcbiAgICBmb3IgKGNvbnN0IHBhdGNoRGV0YWlscyBvZiBwYXRjaGVzVG9BcHBseUJlZm9yZURpZmZpbmcpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgICFhcHBseVBhdGNoKHtcclxuICAgICAgICAgIHBhdGNoRGV0YWlscyxcclxuICAgICAgICAgIHBhdGNoRGlyLFxyXG4gICAgICAgICAgcGF0Y2hGaWxlUGF0aDogam9pbihhcHBQYXRoLCBwYXRjaERpciwgcGF0Y2hEZXRhaWxzLnBhdGNoRmlsZW5hbWUpLFxyXG4gICAgICAgICAgcmV2ZXJzZTogZmFsc2UsXHJcbiAgICAgICAgICBjd2Q6IHRtcFJlcG8ubmFtZSxcclxuICAgICAgICAgIGJlc3RFZmZvcnQ6IGZhbHNlLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICkge1xyXG4gICAgICAgIC8vIFRPRE86IGFkZCBiZXR0ZXIgZXJyb3IgbWVzc2FnZSBvbmNlIC0tcmViYXNlIGlzIGltcGxlbWVudGVkXHJcbiAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICBgRmFpbGVkIHRvIGFwcGx5IHBhdGNoICR7cGF0Y2hEZXRhaWxzLnBhdGNoRmlsZW5hbWV9IHRvICR7cGFja2FnZURldGFpbHMucGF0aFNwZWNpZmllcn1gLFxyXG4gICAgICAgIClcclxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2l0KFwiYWRkXCIsIFwiLWZcIiwgcGFja2FnZURldGFpbHMucGF0aClcclxuICAgIGdpdChcImNvbW1pdFwiLCBcIi0tYWxsb3ctZW1wdHlcIiwgXCItbVwiLCBcImluaXRcIilcclxuXHJcbiAgICAvLyByZXBsYWNlIHBhY2thZ2Ugd2l0aCB1c2VyJ3MgdmVyc2lvblxyXG4gICAgcmVtb3ZlU3luYyh0bXBSZXBvUGFja2FnZVBhdGgpXHJcblxyXG4gICAgLy8gcG5wbSBpbnN0YWxscyBwYWNrYWdlcyBhcyBzeW1saW5rcywgY29weVN5bmMgd291bGQgY29weSBvbmx5IHRoZSBzeW1saW5rXHJcbiAgICBjb3B5U3luYyhyZWFscGF0aFN5bmMocGFja2FnZVBhdGgpLCB0bXBSZXBvUGFja2FnZVBhdGgpXHJcblxyXG4gICAgLy8gcmVtb3ZlIG5lc3RlZCBub2RlX21vZHVsZXMganVzdCB0byBiZSBzYWZlXHJcbiAgICByZW1vdmVTeW5jKGpvaW4odG1wUmVwb1BhY2thZ2VQYXRoLCBcIm5vZGVfbW9kdWxlc1wiKSlcclxuICAgIC8vIHJlbW92ZSAuZ2l0IGp1c3QgdG8gYmUgc2FmZVxyXG4gICAgcmVtb3ZlU3luYyhqb2luKHRtcFJlcG9QYWNrYWdlUGF0aCwgXCIuZ2l0XCIpKVxyXG4gICAgLy8gcmVtb3ZlIHBhdGNoLXBhY2thZ2Ugc3RhdGUgZmlsZVxyXG4gICAgcmVtb3ZlU3luYyhqb2luKHRtcFJlcG9QYWNrYWdlUGF0aCwgU1RBVEVfRklMRV9OQU1FKSlcclxuXHJcbiAgICAvLyBhbHNvIHJlbW92ZSBpZ25vcmVkIGZpbGVzIGxpa2UgYmVmb3JlXHJcbiAgICByZW1vdmVJZ25vcmVkRmlsZXModG1wUmVwb1BhY2thZ2VQYXRoLCBpbmNsdWRlUGF0aHMsIGV4Y2x1ZGVQYXRocylcclxuXHJcbiAgICAvLyBzdGFnZSBhbGwgZmlsZXNcclxuICAgIGdpdChcImFkZFwiLCBcIi1mXCIsIHBhY2thZ2VEZXRhaWxzLnBhdGgpXHJcblxyXG4gICAgLy8gZ2V0IGRpZmYgb2YgY2hhbmdlc1xyXG4gICAgY29uc3QgZGlmZlJlc3VsdCA9IGdpdChcclxuICAgICAgXCJkaWZmXCIsXHJcbiAgICAgIFwiLS1jYWNoZWRcIixcclxuICAgICAgXCItLW5vLWNvbG9yXCIsXHJcbiAgICAgIFwiLS1pZ25vcmUtc3BhY2UtYXQtZW9sXCIsXHJcbiAgICAgIFwiLS1uby1leHQtZGlmZlwiLFxyXG4gICAgICBcIi0tc3JjLXByZWZpeD1hL1wiLFxyXG4gICAgICBcIi0tZHN0LXByZWZpeD1iL1wiLFxyXG4gICAgKVxyXG5cclxuICAgIGlmIChkaWZmUmVzdWx0LnN0ZG91dC5sZW5ndGggPT09IDApIHtcclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgYOKBie+4jyAgTm90IGNyZWF0aW5nIHBhdGNoIGZpbGUgZm9yIHBhY2thZ2UgJyR7cGFja2FnZVBhdGhTcGVjaWZpZXJ9J2AsXHJcbiAgICAgIClcclxuICAgICAgY29uc29sZS5sb2coYOKBie+4jyAgVGhlcmUgZG9uJ3QgYXBwZWFyIHRvIGJlIGFueSBjaGFuZ2VzLmApXHJcbiAgICAgIGlmIChpc1JlYmFzaW5nICYmIG1vZGUudHlwZSA9PT0gXCJvdmVyd3JpdGVfbGFzdFwiKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICBcIlxcbvCfkqEgVG8gcmVtb3ZlIGEgcGF0Y2ggZmlsZSwgZGVsZXRlIGl0IGFuZCB0aGVuIHJlaW5zdGFsbCBub2RlX21vZHVsZXMgZnJvbSBzY3JhdGNoLlwiLFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBwcm9jZXNzLmV4aXQoMSlcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgcGFyc2VQYXRjaEZpbGUoZGlmZlJlc3VsdC5zdGRvdXQudG9TdHJpbmcoKSlcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIChlIGFzIEVycm9yKS5tZXNzYWdlLmluY2x1ZGVzKFwiVW5leHBlY3RlZCBmaWxlIG1vZGUgc3RyaW5nOiAxMjAwMDBcIilcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYFxyXG7im5TvuI8gJHtjaGFsay5yZWQuYm9sZChcIkVSUk9SXCIpfVxyXG5cclxuICBZb3VyIGNoYW5nZXMgaW52b2x2ZSBjcmVhdGluZyBzeW1saW5rcy4gcGF0Y2gtcGFja2FnZSBkb2VzIG5vdCB5ZXQgc3VwcG9ydFxyXG4gIHN5bWxpbmtzLlxyXG5cclxuICDvuI9QbGVhc2UgdXNlICR7Y2hhbGsuYm9sZChcIi0taW5jbHVkZVwiKX0gYW5kL29yICR7Y2hhbGsuYm9sZChcclxuICAgIFwiLS1leGNsdWRlXCIsXHJcbiAgKX0gdG8gbmFycm93IHRoZSBzY29wZSBvZiB5b3VyIHBhdGNoIGlmXHJcbiAgdGhpcyB3YXMgdW5pbnRlbnRpb25hbC5cclxuYClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBvdXRQYXRoID0gXCIuL3BhdGNoLXBhY2thZ2UtZXJyb3IuanNvbi5nelwiXHJcbiAgICAgICAgd3JpdGVGaWxlU3luYyhcclxuICAgICAgICAgIG91dFBhdGgsXHJcbiAgICAgICAgICBnemlwU3luYyhcclxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICAgIGVycm9yOiB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAoZSBhcyBFcnJvcikubWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIHN0YWNrOiAoZSBhcyBFcnJvcikuc3RhY2ssXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBwYXRjaDogZGlmZlJlc3VsdC5zdGRvdXQudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgIClcclxuICAgICAgICBjb25zb2xlLmxvZyhgXHJcbuKblO+4jyAke2NoYWxrLnJlZC5ib2xkKFwiRVJST1JcIil9XHJcblxyXG4gIHBhdGNoLXBhY2thZ2Ugd2FzIHVuYWJsZSB0byByZWFkIHRoZSBwYXRjaC1maWxlIG1hZGUgYnkgZ2l0LiBUaGlzIHNob3VsZCBub3RcclxuICBoYXBwZW4uXHJcblxyXG4gIEEgZGlhZ25vc3RpYyBmaWxlIHdhcyB3cml0dGVuIHRvXHJcblxyXG4gICAgJHtvdXRQYXRofVxyXG5cclxuICBQbGVhc2UgYXR0YWNoIGl0IHRvIGEgZ2l0aHViIGlzc3VlXHJcblxyXG4gICAgaHR0cHM6Ly9naXRodWIuY29tL2RzMzAwL3BhdGNoLXBhY2thZ2UvaXNzdWVzL25ldz90aXRsZT1OZXcrcGF0Y2grcGFyc2UrZmFpbGVkJmJvZHk9UGxlYXNlK2F0dGFjaCt0aGUrZGlhZ25vc3RpYytmaWxlK2J5K2RyYWdnaW5nK2l0K2ludG8raGVyZSvwn5mPXHJcblxyXG4gIE5vdGUgdGhhdCB0aGlzIGRpYWdub3N0aWMgZmlsZSB3aWxsIGNvbnRhaW4gY29kZSBmcm9tIHRoZSBwYWNrYWdlIHlvdSB3ZXJlXHJcbiAgYXR0ZW1wdGluZyB0byBwYXRjaC5cclxuXHJcbmApXHJcbiAgICAgIH1cclxuICAgICAgcHJvY2Vzcy5leGl0KDEpXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIC8vIG1heWJlIGRlbGV0ZSBleGlzdGluZ1xyXG4gICAgaWYgKG1vZGUudHlwZSA9PT0gXCJhcHBlbmRcIiAmJiAhaXNSZWJhc2luZyAmJiBleGlzdGluZ1BhdGNoZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIC8vIGlmIHdlIGFyZSBhcHBlbmRpbmcgdG8gYW4gZXhpc3RpbmcgcGF0Y2ggdGhhdCBkb2Vzbid0IGhhdmUgYSBzZXF1ZW5jZSBudW1iZXIgbGV0J3MgcmVuYW1lIGl0XHJcbiAgICAgIGNvbnN0IHByZXZQYXRjaCA9IGV4aXN0aW5nUGF0Y2hlc1swXVxyXG4gICAgICBpZiAocHJldlBhdGNoLnNlcXVlbmNlTnVtYmVyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBuZXdGaWxlTmFtZSA9IGNyZWF0ZVBhdGNoRmlsZU5hbWUoe1xyXG4gICAgICAgICAgcGFja2FnZURldGFpbHMsXHJcbiAgICAgICAgICBwYWNrYWdlVmVyc2lvbixcclxuICAgICAgICAgIHNlcXVlbmNlTnVtYmVyOiAxLFxyXG4gICAgICAgICAgc2VxdWVuY2VOYW1lOiBwcmV2UGF0Y2guc2VxdWVuY2VOYW1lID8/IFwiaW5pdGlhbFwiLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3Qgb2xkUGF0aCA9IGpvaW4oYXBwUGF0aCwgcGF0Y2hEaXIsIHByZXZQYXRjaC5wYXRjaEZpbGVuYW1lKVxyXG4gICAgICAgIGNvbnN0IG5ld1BhdGggPSBqb2luKGFwcFBhdGgsIHBhdGNoRGlyLCBuZXdGaWxlTmFtZSlcclxuICAgICAgICByZW5hbWVTeW5jKG9sZFBhdGgsIG5ld1BhdGgpXHJcbiAgICAgICAgcHJldlBhdGNoLnNlcXVlbmNlTnVtYmVyID0gMVxyXG4gICAgICAgIHByZXZQYXRjaC5wYXRjaEZpbGVuYW1lID0gbmV3RmlsZU5hbWVcclxuICAgICAgICBwcmV2UGF0Y2guc2VxdWVuY2VOYW1lID0gcHJldlBhdGNoLnNlcXVlbmNlTmFtZSA/PyBcImluaXRpYWxcIlxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbGFzdFBhdGNoID0gZXhpc3RpbmdQYXRjaGVzW1xyXG4gICAgICBzdGF0ZSA/IHN0YXRlLnBhdGNoZXMubGVuZ3RoIC0gMSA6IGV4aXN0aW5nUGF0Y2hlcy5sZW5ndGggLSAxXHJcbiAgICBdIGFzIFBhdGNoZWRQYWNrYWdlRGV0YWlscyB8IHVuZGVmaW5lZFxyXG4gICAgY29uc3Qgc2VxdWVuY2VOYW1lID1cclxuICAgICAgbW9kZS50eXBlID09PSBcImFwcGVuZFwiID8gbW9kZS5uYW1lIDogbGFzdFBhdGNoPy5zZXF1ZW5jZU5hbWVcclxuICAgIGNvbnN0IHNlcXVlbmNlTnVtYmVyID1cclxuICAgICAgbW9kZS50eXBlID09PSBcImFwcGVuZFwiXHJcbiAgICAgICAgPyAobGFzdFBhdGNoPy5zZXF1ZW5jZU51bWJlciA/PyAwKSArIDFcclxuICAgICAgICA6IGxhc3RQYXRjaD8uc2VxdWVuY2VOdW1iZXJcclxuXHJcbiAgICBjb25zdCBwYXRjaEZpbGVOYW1lID0gY3JlYXRlUGF0Y2hGaWxlTmFtZSh7XHJcbiAgICAgIHBhY2thZ2VEZXRhaWxzLFxyXG4gICAgICBwYWNrYWdlVmVyc2lvbixcclxuICAgICAgc2VxdWVuY2VOYW1lLFxyXG4gICAgICBzZXF1ZW5jZU51bWJlcixcclxuICAgIH0pXHJcblxyXG4gICAgY29uc3QgcGF0Y2hQYXRoOiBzdHJpbmcgPSBqb2luKHBhdGNoZXNEaXIsIHBhdGNoRmlsZU5hbWUpXHJcbiAgICBpZiAoIWV4aXN0c1N5bmMoZGlybmFtZShwYXRjaFBhdGgpKSkge1xyXG4gICAgICAvLyBzY29wZWQgcGFja2FnZVxyXG4gICAgICBta2RpclN5bmMoZGlybmFtZShwYXRjaFBhdGgpKVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIHdlIGFyZSBpbnNlcnRpbmcgYSBuZXcgcGF0Y2ggaW50byBhIHNlcXVlbmNlIHdlIG1vc3QgbGlrZWx5IG5lZWQgdG8gdXBkYXRlIHRoZSBzZXF1ZW5jZSBudW1iZXJzXHJcbiAgICBpZiAoaXNSZWJhc2luZyAmJiBtb2RlLnR5cGUgPT09IFwiYXBwZW5kXCIpIHtcclxuICAgICAgY29uc3QgcGF0Y2hlc1RvTnVkZ2UgPSBleGlzdGluZ1BhdGNoZXMuc2xpY2Uoc3RhdGUhLnBhdGNoZXMubGVuZ3RoKVxyXG4gICAgICBpZiAoc2VxdWVuY2VOdW1iZXIgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInNlcXVlbmNlTnVtYmVyIGlzIHVuZGVmaW5lZCB3aGlsZSByZWJhc2luZ1wiKVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChcclxuICAgICAgICBwYXRjaGVzVG9OdWRnZVswXT8uc2VxdWVuY2VOdW1iZXIgIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICAgIHBhdGNoZXNUb051ZGdlWzBdLnNlcXVlbmNlTnVtYmVyIDw9IHNlcXVlbmNlTnVtYmVyXHJcbiAgICAgICkge1xyXG4gICAgICAgIGxldCBuZXh0ID0gc2VxdWVuY2VOdW1iZXIgKyAxXHJcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHBhdGNoZXNUb051ZGdlKSB7XHJcbiAgICAgICAgICBjb25zdCBuZXdOYW1lID0gY3JlYXRlUGF0Y2hGaWxlTmFtZSh7XHJcbiAgICAgICAgICAgIHBhY2thZ2VEZXRhaWxzLFxyXG4gICAgICAgICAgICBwYWNrYWdlVmVyc2lvbixcclxuICAgICAgICAgICAgc2VxdWVuY2VOYW1lOiBwLnNlcXVlbmNlTmFtZSxcclxuICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXI6IG5leHQrKyxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgXCJSZW5hbWluZ1wiLFxyXG4gICAgICAgICAgICBjaGFsay5ib2xkKHAucGF0Y2hGaWxlbmFtZSksXHJcbiAgICAgICAgICAgIFwidG9cIixcclxuICAgICAgICAgICAgY2hhbGsuYm9sZChuZXdOYW1lKSxcclxuICAgICAgICAgIClcclxuICAgICAgICAgIGNvbnN0IG9sZFBhdGggPSBqb2luKGFwcFBhdGgsIHBhdGNoRGlyLCBwLnBhdGNoRmlsZW5hbWUpXHJcbiAgICAgICAgICBjb25zdCBuZXdQYXRoID0gam9pbihhcHBQYXRoLCBwYXRjaERpciwgbmV3TmFtZSlcclxuICAgICAgICAgIHJlbmFtZVN5bmMob2xkUGF0aCwgbmV3UGF0aClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB3cml0ZUZpbGVTeW5jKHBhdGNoUGF0aCwgZGlmZlJlc3VsdC5zdGRvdXQpXHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgYCR7Y2hhbGsuZ3JlZW4oXCLinJRcIil9IENyZWF0ZWQgZmlsZSAke2pvaW4ocGF0Y2hEaXIsIHBhdGNoRmlsZU5hbWUpfVxcbmAsXHJcbiAgICApXHJcblxyXG4gICAgY29uc3QgcHJldlN0YXRlOiBQYXRjaFN0YXRlW10gPSBwYXRjaGVzVG9BcHBseUJlZm9yZURpZmZpbmcubWFwKFxyXG4gICAgICAocCk6IFBhdGNoU3RhdGUgPT4gKHtcclxuICAgICAgICBwYXRjaEZpbGVuYW1lOiBwLnBhdGNoRmlsZW5hbWUsXHJcbiAgICAgICAgZGlkQXBwbHk6IHRydWUsXHJcbiAgICAgICAgcGF0Y2hDb250ZW50SGFzaDogaGFzaEZpbGUoam9pbihhcHBQYXRoLCBwYXRjaERpciwgcC5wYXRjaEZpbGVuYW1lKSksXHJcbiAgICAgIH0pLFxyXG4gICAgKVxyXG4gICAgY29uc3QgbmV4dFN0YXRlOiBQYXRjaFN0YXRlW10gPSBbXHJcbiAgICAgIC4uLnByZXZTdGF0ZSxcclxuICAgICAge1xyXG4gICAgICAgIHBhdGNoRmlsZW5hbWU6IHBhdGNoRmlsZU5hbWUsXHJcbiAgICAgICAgZGlkQXBwbHk6IHRydWUsXHJcbiAgICAgICAgcGF0Y2hDb250ZW50SGFzaDogaGFzaEZpbGUocGF0Y2hQYXRoKSxcclxuICAgICAgfSxcclxuICAgIF1cclxuXHJcbiAgICAvLyBpZiBhbnkgcGF0Y2hlcyBjb21lIGFmdGVyIHRoaXMgb25lIHdlIGp1c3QgbWFkZSwgd2Ugc2hvdWxkIHJlYXBwbHkgdGhlbVxyXG4gICAgbGV0IGRpZEZhaWxXaGlsZUZpbmlzaGluZ1JlYmFzZSA9IGZhbHNlXHJcbiAgICBpZiAoaXNSZWJhc2luZykge1xyXG4gICAgICBjb25zdCBjdXJyZW50UGF0Y2hlcyA9IGdldEdyb3VwZWRQYXRjaGVzKGpvaW4oYXBwUGF0aCwgcGF0Y2hEaXIpKVxyXG4gICAgICAgIC5wYXRoU3BlY2lmaWVyVG9QYXRjaEZpbGVzW3BhY2thZ2VEZXRhaWxzLnBhdGhTcGVjaWZpZXJdXHJcblxyXG4gICAgICBjb25zdCBwcmV2aW91c2x5VW5hcHBsaWVkUGF0Y2hlcyA9IGN1cnJlbnRQYXRjaGVzLnNsaWNlKG5leHRTdGF0ZS5sZW5ndGgpXHJcbiAgICAgIGlmIChwcmV2aW91c2x5VW5hcHBsaWVkUGF0Y2hlcy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgRmFzdCBmb3J3YXJkaW5nLi4uYClcclxuICAgICAgICBmb3IgKGNvbnN0IHBhdGNoIG9mIHByZXZpb3VzbHlVbmFwcGxpZWRQYXRjaGVzKSB7XHJcbiAgICAgICAgICBjb25zdCBwYXRjaEZpbGVQYXRoID0gam9pbihhcHBQYXRoLCBwYXRjaERpciwgcGF0Y2gucGF0Y2hGaWxlbmFtZSlcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgIWFwcGx5UGF0Y2goe1xyXG4gICAgICAgICAgICAgIHBhdGNoRGV0YWlsczogcGF0Y2gsXHJcbiAgICAgICAgICAgICAgcGF0Y2hEaXIsXHJcbiAgICAgICAgICAgICAgcGF0Y2hGaWxlUGF0aCxcclxuICAgICAgICAgICAgICByZXZlcnNlOiBmYWxzZSxcclxuICAgICAgICAgICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXHJcbiAgICAgICAgICAgICAgYmVzdEVmZm9ydDogZmFsc2UsXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgZGlkRmFpbFdoaWxlRmluaXNoaW5nUmViYXNlID0gdHJ1ZVxyXG4gICAgICAgICAgICBsb2dQYXRjaFNlcXVlbmNlRXJyb3IoeyBwYXRjaERldGFpbHM6IHBhdGNoIH0pXHJcbiAgICAgICAgICAgIG5leHRTdGF0ZS5wdXNoKHtcclxuICAgICAgICAgICAgICBwYXRjaEZpbGVuYW1lOiBwYXRjaC5wYXRjaEZpbGVuYW1lLFxyXG4gICAgICAgICAgICAgIGRpZEFwcGx5OiBmYWxzZSxcclxuICAgICAgICAgICAgICBwYXRjaENvbnRlbnRIYXNoOiBoYXNoRmlsZShwYXRjaEZpbGVQYXRoKSxcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICR7Y2hhbGsuZ3JlZW4oXCLinJRcIil9ICR7cGF0Y2gucGF0Y2hGaWxlbmFtZX1gKVxyXG4gICAgICAgICAgICBuZXh0U3RhdGUucHVzaCh7XHJcbiAgICAgICAgICAgICAgcGF0Y2hGaWxlbmFtZTogcGF0Y2gucGF0Y2hGaWxlbmFtZSxcclxuICAgICAgICAgICAgICBkaWRBcHBseTogdHJ1ZSxcclxuICAgICAgICAgICAgICBwYXRjaENvbnRlbnRIYXNoOiBoYXNoRmlsZShwYXRjaEZpbGVQYXRoKSxcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXNSZWJhc2luZyB8fCBudW1QYXRjaGVzQWZ0ZXJDcmVhdGUgPiAxKSB7XHJcbiAgICAgIHNhdmVQYXRjaEFwcGxpY2F0aW9uU3RhdGUoe1xyXG4gICAgICAgIHBhY2thZ2VEZXRhaWxzLFxyXG4gICAgICAgIHBhdGNoZXM6IG5leHRTdGF0ZSxcclxuICAgICAgICBpc1JlYmFzaW5nOiBkaWRGYWlsV2hpbGVGaW5pc2hpbmdSZWJhc2UsXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjbGVhclBhdGNoQXBwbGljYXRpb25TdGF0ZShwYWNrYWdlRGV0YWlscylcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2FuQ3JlYXRlSXNzdWUpIHtcclxuICAgICAgaWYgKGNyZWF0ZUlzc3VlKSB7XHJcbiAgICAgICAgb3Blbklzc3VlQ3JlYXRpb25MaW5rKHtcclxuICAgICAgICAgIHBhY2thZ2VEZXRhaWxzLFxyXG4gICAgICAgICAgcGF0Y2hGaWxlQ29udGVudHM6IGRpZmZSZXN1bHQuc3Rkb3V0LnRvU3RyaW5nKCksXHJcbiAgICAgICAgICBwYWNrYWdlVmVyc2lvbixcclxuICAgICAgICAgIHBhdGNoUGF0aCxcclxuICAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIG1heWJlUHJpbnRJc3N1ZUNyZWF0aW9uUHJvbXB0KHZjcywgcGFja2FnZURldGFpbHMsIHBhY2thZ2VNYW5hZ2VyKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgY29uc29sZS5sb2coZSlcclxuICAgIHRocm93IGVcclxuICB9IGZpbmFsbHkge1xyXG4gICAgdG1wUmVwby5yZW1vdmVDYWxsYmFjaygpXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVQYXRjaEZpbGVOYW1lKHtcclxuICBwYWNrYWdlRGV0YWlscyxcclxuICBwYWNrYWdlVmVyc2lvbixcclxuICBzZXF1ZW5jZU51bWJlcixcclxuICBzZXF1ZW5jZU5hbWUsXHJcbn06IHtcclxuICBwYWNrYWdlRGV0YWlsczogUGFja2FnZURldGFpbHNcclxuICBwYWNrYWdlVmVyc2lvbjogc3RyaW5nXHJcbiAgc2VxdWVuY2VOdW1iZXI/OiBudW1iZXJcclxuICBzZXF1ZW5jZU5hbWU/OiBzdHJpbmdcclxufSkge1xyXG4gIGNvbnN0IHBhY2thZ2VOYW1lcyA9IHBhY2thZ2VEZXRhaWxzLnBhY2thZ2VOYW1lc1xyXG4gICAgLm1hcCgobmFtZSkgPT4gbmFtZS5yZXBsYWNlKC9cXC8vZywgXCIrXCIpKVxyXG4gICAgLmpvaW4oXCIrK1wiKVxyXG5cclxuICBjb25zdCBuYW1lQW5kVmVyc2lvbiA9IGAke3BhY2thZ2VOYW1lc30rJHtwYWNrYWdlVmVyc2lvbn1gXHJcbiAgY29uc3QgbnVtID1cclxuICAgIHNlcXVlbmNlTnVtYmVyID09PSB1bmRlZmluZWRcclxuICAgICAgPyBcIlwiXHJcbiAgICAgIDogYCske3NlcXVlbmNlTnVtYmVyLnRvU3RyaW5nKCkucGFkU3RhcnQoMywgXCIwXCIpfWBcclxuICBjb25zdCBuYW1lID0gIXNlcXVlbmNlTmFtZSA/IFwiXCIgOiBgKyR7c2VxdWVuY2VOYW1lfWBcclxuXHJcbiAgcmV0dXJuIGAke25hbWVBbmRWZXJzaW9ufSR7bnVtfSR7bmFtZX0ucGF0Y2hgXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2dQYXRjaFNlcXVlbmNlRXJyb3Ioe1xyXG4gIHBhdGNoRGV0YWlscyxcclxufToge1xyXG4gIHBhdGNoRGV0YWlsczogUGF0Y2hlZFBhY2thZ2VEZXRhaWxzXHJcbn0pIHtcclxuICBjb25zb2xlLmxvZyhgXHJcbiR7Y2hhbGsucmVkLmJvbGQoXCLim5QgRVJST1JcIil9XHJcblxyXG5GYWlsZWQgdG8gYXBwbHkgcGF0Y2ggZmlsZSAke2NoYWxrLmJvbGQocGF0Y2hEZXRhaWxzLnBhdGNoRmlsZW5hbWUpfS5cclxuXHJcbklmIHRoaXMgcGF0Y2ggZmlsZSBpcyBubyBsb25nZXIgdXNlZnVsLCBkZWxldGUgaXQgYW5kIHJ1blxyXG5cclxuICAke2NoYWxrLmJvbGQoYHBhdGNoLXBhY2thZ2VgKX1cclxuXHJcblRvIHBhcnRpYWxseSBhcHBseSB0aGUgcGF0Y2ggKGlmIHBvc3NpYmxlKSBhbmQgb3V0cHV0IGEgbG9nIG9mIGVycm9ycyB0byBmaXgsIHJ1blxyXG5cclxuICAke2NoYWxrLmJvbGQoYHBhdGNoLXBhY2thZ2UgLS1wYXJ0aWFsYCl9XHJcblxyXG5BZnRlciB3aGljaCB5b3Ugc2hvdWxkIG1ha2UgYW55IHJlcXVpcmVkIGNoYW5nZXMgaW5zaWRlICR7XHJcbiAgICBwYXRjaERldGFpbHMucGF0aFxyXG4gIH0sIGFuZCBmaW5hbGx5IHJ1blxyXG5cclxuICAke2NoYWxrLmJvbGQoYHBhdGNoLXBhY2thZ2UgJHtwYXRjaERldGFpbHMucGF0aFNwZWNpZmllcn1gKX1cclxuXHJcbnRvIHVwZGF0ZSB0aGUgcGF0Y2ggZmlsZS5cclxuYClcclxufVxyXG4iXX0=
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.makeRegExp = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const makeRegExp = (reString, name, defaultValue, caseSensitive) => {
9
+ if (!reString) {
10
+ return defaultValue;
11
+ }
12
+ else {
13
+ try {
14
+ return new RegExp(reString, caseSensitive ? "" : "i");
15
+ }
16
+ catch (_) {
17
+ console.log(`${chalk_1.default.red.bold("***ERROR***")}
18
+ Invalid format for option --${name}
19
+
20
+ Unable to convert the string ${JSON.stringify(reString)} to a regular expression.
21
+ `);
22
+ process.exit(1);
23
+ return /unreachable/;
24
+ }
25
+ }
26
+ };
27
+ exports.makeRegExp = makeRegExp;
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZVJlZ0V4cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tYWtlUmVnRXhwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUF5QjtBQUVsQixNQUFNLFVBQVUsR0FBRyxDQUN4QixRQUFnQixFQUNoQixJQUFZLEVBQ1osWUFBb0IsRUFDcEIsYUFBc0IsRUFDZCxFQUFFO0lBQ1YsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsT0FBTyxZQUFZLENBQUE7SUFDckIsQ0FBQztTQUFNLENBQUM7UUFDTixJQUFJLENBQUM7WUFDSCxPQUFPLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDdkQsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDOzhCQUNwQixJQUFJOztpQ0FFRCxJQUFJLENBQUMsU0FBUyxDQUMzQyxRQUFRLENBQ1Q7Q0FDRixDQUFDLENBQUE7WUFFSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2YsT0FBTyxhQUFhLENBQUE7UUFDdEIsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDLENBQUE7QUF4QlksUUFBQSxVQUFVLGNBd0J0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIlxyXG5cclxuZXhwb3J0IGNvbnN0IG1ha2VSZWdFeHAgPSAoXHJcbiAgcmVTdHJpbmc6IHN0cmluZyxcclxuICBuYW1lOiBzdHJpbmcsXHJcbiAgZGVmYXVsdFZhbHVlOiBSZWdFeHAsXHJcbiAgY2FzZVNlbnNpdGl2ZTogYm9vbGVhbixcclxuKTogUmVnRXhwID0+IHtcclxuICBpZiAoIXJlU3RyaW5nKSB7XHJcbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlXHJcbiAgfSBlbHNlIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiBuZXcgUmVnRXhwKHJlU3RyaW5nLCBjYXNlU2Vuc2l0aXZlID8gXCJcIiA6IFwiaVwiKVxyXG4gICAgfSBjYXRjaCAoXykge1xyXG4gICAgICBjb25zb2xlLmxvZyhgJHtjaGFsay5yZWQuYm9sZChcIioqKkVSUk9SKioqXCIpfVxyXG5JbnZhbGlkIGZvcm1hdCBmb3Igb3B0aW9uIC0tJHtuYW1lfVxyXG5cclxuICBVbmFibGUgdG8gY29udmVydCB0aGUgc3RyaW5nICR7SlNPTi5zdHJpbmdpZnkoXHJcbiAgICByZVN0cmluZyxcclxuICApfSB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvbi5cclxuYClcclxuXHJcbiAgICAgIHByb2Nlc3MuZXhpdCgxKVxyXG4gICAgICByZXR1cm4gL3VucmVhY2hhYmxlL1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.packageIsDevDependency = packageIsDevDependency;
4
+ const path_1 = require("./path");
5
+ const fs_1 = require("fs");
6
+ function packageIsDevDependency({ appPath, patchDetails, }) {
7
+ const packageJsonPath = (0, path_1.join)(appPath, "package.json");
8
+ if (!(0, fs_1.existsSync)(packageJsonPath)) {
9
+ return false;
10
+ }
11
+ const { devDependencies } = require(packageJsonPath);
12
+ return Boolean(devDependencies && devDependencies[patchDetails.packageNames[0]]);
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZUlzRGV2RGVwZW5kZW5jeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wYWNrYWdlSXNEZXZEZXBlbmRlbmN5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBSUEsd0RBZUM7QUFsQkQsaUNBQTZCO0FBQzdCLDJCQUErQjtBQUUvQixTQUFnQixzQkFBc0IsQ0FBQyxFQUNyQyxPQUFPLEVBQ1AsWUFBWSxHQUliO0lBQ0MsTUFBTSxlQUFlLEdBQUcsSUFBQSxXQUFJLEVBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBQ3JELElBQUksQ0FBQyxJQUFBLGVBQVUsRUFBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUNELE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7SUFDcEQsT0FBTyxPQUFPLENBQ1osZUFBZSxJQUFJLGVBQWUsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2pFLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGF0Y2hlZFBhY2thZ2VEZXRhaWxzIH0gZnJvbSBcIi4vUGFja2FnZURldGFpbHNcIlxyXG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIi4vcGF0aFwiXHJcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tIFwiZnNcIlxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhY2thZ2VJc0RldkRlcGVuZGVuY3koe1xyXG4gIGFwcFBhdGgsXHJcbiAgcGF0Y2hEZXRhaWxzLFxyXG59OiB7XHJcbiAgYXBwUGF0aDogc3RyaW5nXHJcbiAgcGF0Y2hEZXRhaWxzOiBQYXRjaGVkUGFja2FnZURldGFpbHNcclxufSkge1xyXG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGpvaW4oYXBwUGF0aCwgXCJwYWNrYWdlLmpzb25cIilcclxuICBpZiAoIWV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG4gIGNvbnN0IHsgZGV2RGVwZW5kZW5jaWVzIH0gPSByZXF1aXJlKHBhY2thZ2VKc29uUGF0aClcclxuICByZXR1cm4gQm9vbGVhbihcclxuICAgIGRldkRlcGVuZGVuY2llcyAmJiBkZXZEZXBlbmRlbmNpZXNbcGF0Y2hEZXRhaWxzLnBhY2thZ2VOYW1lc1swXV0sXHJcbiAgKVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseBunLockfile = parseBunLockfile;
4
+ const child_process_1 = require("child_process");
5
+ // Adapted from https://github.com/oven-sh/bun/blob/main/packages/bun-vscode/src/features/lockfile.ts,
6
+ // rewritten to use spawnSync instead of spawn.
7
+ function parseBunLockfile(lockFilePath) {
8
+ const process = (0, child_process_1.spawnSync)("bun", [lockFilePath], {
9
+ stdio: ["ignore", "pipe", "pipe"],
10
+ });
11
+ if (process.status !== 0) {
12
+ throw new Error(`Bun exited with code: ${process.status}\n${process.stderr.toString()}`);
13
+ }
14
+ return process.stdout.toString();
15
+ }
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VCdW5Mb2NrZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXJzZUJ1bkxvY2tmaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBSUEsNENBVUM7QUFkRCxpREFBeUM7QUFFekMsc0dBQXNHO0FBQ3RHLCtDQUErQztBQUMvQyxTQUFnQixnQkFBZ0IsQ0FBQyxZQUFvQjtJQUNuRCxNQUFNLE9BQU8sR0FBRyxJQUFBLHlCQUFTLEVBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUU7UUFDL0MsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7S0FDbEMsQ0FBQyxDQUFBO0lBQ0YsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQ2IseUJBQXlCLE9BQU8sQ0FBQyxNQUFNLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUN4RSxDQUFBO0lBQ0gsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQTtBQUNsQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3Bhd25TeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIlxyXG5cclxuLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9vdmVuLXNoL2J1bi9ibG9iL21haW4vcGFja2FnZXMvYnVuLXZzY29kZS9zcmMvZmVhdHVyZXMvbG9ja2ZpbGUudHMsXHJcbi8vIHJld3JpdHRlbiB0byB1c2Ugc3Bhd25TeW5jIGluc3RlYWQgb2Ygc3Bhd24uXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJ1bkxvY2tmaWxlKGxvY2tGaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICBjb25zdCBwcm9jZXNzID0gc3Bhd25TeW5jKFwiYnVuXCIsIFtsb2NrRmlsZVBhdGhdLCB7XHJcbiAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwicGlwZVwiLCBcInBpcGVcIl0sXHJcbiAgfSlcclxuICBpZiAocHJvY2Vzcy5zdGF0dXMgIT09IDApIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgYEJ1biBleGl0ZWQgd2l0aCBjb2RlOiAke3Byb2Nlc3Muc3RhdHVzfVxcbiR7cHJvY2Vzcy5zdGRlcnIudG9TdHJpbmcoKX1gLFxyXG4gICAgKVxyXG4gIH1cclxuICByZXR1cm4gcHJvY2Vzcy5zdGRvdXQudG9TdHJpbmcoKVxyXG59XHJcbiJdfQ==