@workflow/next 5.0.0-beta.4 → 5.0.0-beta.41

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.
Files changed (40) hide show
  1. package/dist/builder-eager.d.ts +1 -1
  2. package/dist/builder-eager.d.ts.map +1 -1
  3. package/dist/builder-eager.js +377 -220
  4. package/dist/builder.d.ts +1 -4
  5. package/dist/builder.d.ts.map +1 -1
  6. package/dist/builder.js +2 -28
  7. package/dist/index.d.ts +8 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +333 -55
  10. package/dist/loader.d.ts +5 -0
  11. package/dist/loader.d.ts.map +1 -1
  12. package/dist/loader.js +15 -341
  13. package/dist/runtime.d.ts +1 -1
  14. package/dist/runtime.d.ts.map +1 -1
  15. package/dist/runtime.js +2 -2
  16. package/dist/swc-plugin-cache.d.ts +7 -0
  17. package/dist/swc-plugin-cache.d.ts.map +1 -0
  18. package/dist/swc-plugin-cache.js +23 -0
  19. package/dist/watch-ignore.d.ts +51 -0
  20. package/dist/watch-ignore.d.ts.map +1 -0
  21. package/dist/watch-ignore.js +264 -0
  22. package/dist/watch-rebuild.d.ts +63 -0
  23. package/dist/watch-rebuild.d.ts.map +1 -0
  24. package/dist/watch-rebuild.js +399 -0
  25. package/docs/api-reference/with-workflow.mdx +56 -2
  26. package/docs/next.mdx +12 -6
  27. package/package.json +10 -7
  28. package/dist/builder-deferred.d.ts +0 -2
  29. package/dist/builder-deferred.d.ts.map +0 -1
  30. package/dist/builder-deferred.js +0 -1401
  31. package/dist/builder-deferred.js.map +0 -1
  32. package/dist/builder-eager.js.map +0 -1
  33. package/dist/builder.js.map +0 -1
  34. package/dist/index.js.map +0 -1
  35. package/dist/loader.js.map +0 -1
  36. package/dist/runtime.js.map +0 -1
  37. package/dist/socket-server.d.ts +0 -48
  38. package/dist/socket-server.d.ts.map +0 -1
  39. package/dist/socket-server.js +0 -154
  40. package/dist/socket-server.js.map +0 -1
package/dist/builder.d.ts CHANGED
@@ -1,5 +1,2 @@
1
- export declare const DEFERRED_BUILDER_MIN_VERSION = "16.2.0-canary.48";
2
- export declare const WORKFLOW_DEFERRED_ENTRIES: readonly ["/.well-known/workflow/v1/flow", "/.well-known/workflow/v1/step", "/.well-known/workflow/v1/webhook/[token]"];
3
- export declare function shouldUseDeferredBuilder(nextVersion: string): boolean;
4
- export declare function getNextBuilder(nextVersion: string): Promise<any>;
1
+ export declare function getNextBuilder(_nextVersion: string): Promise<any>;
5
2
  //# sourceMappingURL=builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,4BAA4B,qBAAqB,CAAC;AAE/D,eAAO,MAAM,yBAAyB,yHAI5B,CAAC;AAIX,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAerE;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,gBAMvD"}
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAEA,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,gBAExD"}
package/dist/builder.js CHANGED
@@ -1,34 +1,8 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.WORKFLOW_DEFERRED_ENTRIES = exports.DEFERRED_BUILDER_MIN_VERSION = void 0;
7
- exports.shouldUseDeferredBuilder = shouldUseDeferredBuilder;
8
3
  exports.getNextBuilder = getNextBuilder;
9
- const semver_1 = __importDefault(require("semver"));
10
- const builder_deferred_js_1 = require("./builder-deferred.js");
11
4
  const builder_eager_js_1 = require("./builder-eager.js");
12
- exports.DEFERRED_BUILDER_MIN_VERSION = '16.2.0-canary.48';
13
- exports.WORKFLOW_DEFERRED_ENTRIES = [
14
- '/.well-known/workflow/v1/flow',
15
- '/.well-known/workflow/v1/step',
16
- '/.well-known/workflow/v1/webhook/[token]',
17
- ];
18
- let warnedAboutFlagAndVersion = false;
19
- function shouldUseDeferredBuilder(nextVersion) {
20
- const flagEnabled = Boolean(process.env.WORKFLOW_NEXT_LAZY_DISCOVERY);
21
- const versionCompatible = semver_1.default.gte(nextVersion, exports.DEFERRED_BUILDER_MIN_VERSION);
22
- if (flagEnabled && !versionCompatible && !warnedAboutFlagAndVersion) {
23
- warnedAboutFlagAndVersion = true;
24
- console.warn(`Enabled lazyDiscovery but Next.js version is not compatible, needs ${exports.DEFERRED_BUILDER_MIN_VERSION} have ${nextVersion}`);
25
- }
26
- return flagEnabled && versionCompatible;
27
- }
28
- async function getNextBuilder(nextVersion) {
29
- if (shouldUseDeferredBuilder(nextVersion)) {
30
- return (0, builder_deferred_js_1.getNextBuilderDeferred)();
31
- }
5
+ async function getNextBuilder(_nextVersion) {
32
6
  return (0, builder_eager_js_1.getNextBuilderEager)();
33
7
  }
34
- //# sourceMappingURL=builder.js.map
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsd0NBRUM7QUFKRCx5REFBeUQ7QUFFbEQsS0FBSyxVQUFVLGNBQWMsQ0FBQyxZQUFvQjtJQUN2RCxPQUFPLElBQUEsc0NBQW1CLEdBQUUsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0TmV4dEJ1aWxkZXJFYWdlciB9IGZyb20gJy4vYnVpbGRlci1lYWdlci5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXROZXh0QnVpbGRlcihfbmV4dFZlcnNpb246IHN0cmluZykge1xuICByZXR1cm4gZ2V0TmV4dEJ1aWxkZXJFYWdlcigpO1xufVxuIl19
package/dist/index.d.ts CHANGED
@@ -3,10 +3,17 @@ export declare function withWorkflow(nextConfigOrFn: NextConfig | ((phase: strin
3
3
  defaultConfig: NextConfig;
4
4
  }) => Promise<NextConfig>), { workflows, }?: {
5
5
  workflows?: {
6
- lazyDiscovery?: boolean;
7
6
  local?: {
8
7
  port?: number;
9
8
  };
9
+ /**
10
+ * Controls how source maps are emitted for workflow bundles. Accepts
11
+ * the same values as esbuild's `sourcemap` option: `true`/`'inline'`
12
+ * (default), `'linked'`, `'external'`, `'both'`, or `false` to omit
13
+ * source maps. Can also be set via the `WORKFLOW_SOURCEMAP`
14
+ * environment variable.
15
+ */
16
+ sourcemap?: boolean | 'inline' | 'linked' | 'external' | 'both';
10
17
  };
11
18
  }): (phase: string, ctx: {
12
19
  defaultConfig: NextConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AA6CvC,wBAAgB,YAAY,CAC1B,cAAc,EACV,UAAU,GACV,CAAC,CACC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE;IAAE,aAAa,EAAE,UAAU,CAAA;CAAE,KAC/B,OAAO,CAAC,UAAU,CAAC,CAAC,EAC7B,EACE,SAAS,GACV,GAAE;IACD,SAAS,CAAC,EAAE;QACV,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,KAAK,CAAC,EAAE;YACN,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,CAAC;KACH,CAAC;CACE,IAsBJ,OAAO,MAAM,EACb,KAAK;IAAE,aAAa,EAAE,UAAU,CAAA;CAAE,yBAwLrC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAgVvC,wBAAgB,YAAY,CAC1B,cAAc,EACV,UAAU,GACV,CAAC,CACC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE;IAAE,aAAa,EAAE,UAAU,CAAA;CAAE,KAC/B,OAAO,CAAC,UAAU,CAAC,CAAC,EAC7B,EACE,SAAS,GACV,GAAE;IACD,SAAS,CAAC,EAAE;QACV,KAAK,CAAC,EAAE;YACN,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,CAAC;QACF;;;;;;WAMG;QACH,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;KACjE,CAAC;CACE,IAkBJ,OAAO,MAAM,EACb,KAAK;IAAE,aAAa,EAAE,UAAU,CAAA;CAAE,yBAsOrC"}
package/dist/index.js CHANGED
@@ -1,11 +1,186 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
5
38
  Object.defineProperty(exports, "__esModule", { value: true });
6
39
  exports.withWorkflow = withWorkflow;
40
+ const node_fs_1 = require("node:fs");
41
+ const promises_1 = require("node:fs/promises");
42
+ const node_path_1 = require("node:path");
43
+ const builders_1 = require("@workflow/builders");
7
44
  const semver_1 = __importDefault(require("semver"));
8
45
  const builder_js_1 = require("./builder.js");
46
+ const VERCEL_WORLD_PACKAGE = '@workflow/world-vercel';
47
+ const VERCEL_WORLD_DEPENDENCY_PACKAGES = [
48
+ '@vercel/queue',
49
+ '@vercel/oidc',
50
+ '@vercel/cli-auth',
51
+ '@napi-rs/keyring',
52
+ ];
53
+ const VERCEL_WORLD_SERVER_EXTERNAL_PACKAGES = [
54
+ VERCEL_WORLD_PACKAGE,
55
+ ...VERCEL_WORLD_DEPENDENCY_PACKAGES,
56
+ ];
57
+ const useWorkflowPattern = /^\s*(['"])use workflow\1;?\s*$/m;
58
+ const useStepPattern = /^\s*(['"])use step\1;?\s*$/m;
59
+ const workflowSerdeImportPattern = /from\s+(['"])@workflow\/serde\1/;
60
+ const workflowSerdeSymbolPattern = /Symbol\.for\s*\(\s*(['"])workflow-(?:serialize|deserialize)\1\s*\)/;
61
+ const workflowSerdeComputedPropertyPattern = /\[\s*WORKFLOW_(?:SERIALIZE|DESERIALIZE)\s*\]/;
62
+ const PSEUDO_EXTERNAL_PACKAGES = new Set(['server-only', 'client-only']);
63
+ const warnedAutoRemovedServerExternalPackages = new Set();
64
+ const BASE_PATH_SYMBOL = Symbol.for('@workflow/core/basePath');
65
+ const globalConfig = globalThis;
66
+ // Keep this local: @workflow/next is CommonJS, while @workflow/utils is ESM-only.
67
+ function setWorkflowBasePath(basePath) {
68
+ globalConfig[BASE_PATH_SYMBOL] = basePath ?? '';
69
+ }
70
+ function isPlainObject(value) {
71
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
72
+ }
73
+ function isResolvablePackageSpecifier(specifier) {
74
+ if (specifier.startsWith('.') || specifier.startsWith('/')) {
75
+ return false;
76
+ }
77
+ if (specifier.startsWith('$')) {
78
+ return false;
79
+ }
80
+ if (specifier.includes('*') || specifier.includes(':')) {
81
+ return false;
82
+ }
83
+ return true;
84
+ }
85
+ function detectWorkflowPatterns(source) {
86
+ const hasUseWorkflow = useWorkflowPattern.test(source);
87
+ const hasUseStep = useStepPattern.test(source);
88
+ const hasSerdeImport = workflowSerdeImportPattern.test(source);
89
+ const hasSerdeSymbol = workflowSerdeSymbolPattern.test(source);
90
+ const hasSerdeComputedProperty = workflowSerdeComputedPropertyPattern.test(source);
91
+ return {
92
+ hasUseWorkflow,
93
+ hasUseStep,
94
+ hasSerde: hasSerdeImport || hasSerdeSymbol || hasSerdeComputedProperty,
95
+ };
96
+ }
97
+ function getIssueLabels(detected) {
98
+ const issues = [];
99
+ if (detected.hasUseWorkflow) {
100
+ issues.push('"use workflow" functions');
101
+ }
102
+ if (detected.hasUseStep) {
103
+ issues.push('"use step" functions');
104
+ }
105
+ if (detected.hasSerde) {
106
+ issues.push('serialization classes');
107
+ }
108
+ return issues;
109
+ }
110
+ function hasWorkflowSerdeDependency(packageJson) {
111
+ if (!isPlainObject(packageJson)) {
112
+ return false;
113
+ }
114
+ const dependencies = isPlainObject(packageJson.dependencies)
115
+ ? packageJson.dependencies
116
+ : {};
117
+ const peerDependencies = isPlainObject(packageJson.peerDependencies)
118
+ ? packageJson.peerDependencies
119
+ : {};
120
+ return (Object.hasOwn(dependencies, '@workflow/serde') ||
121
+ Object.hasOwn(peerDependencies, '@workflow/serde'));
122
+ }
123
+ async function detectServerExternalPackage(packageName, workingDir) {
124
+ if (!isResolvablePackageSpecifier(packageName)) {
125
+ return null;
126
+ }
127
+ let hasUseWorkflow = false;
128
+ let hasUseStep = false;
129
+ let hasSerde = false;
130
+ try {
131
+ const packageJsonPath = require.resolve(`${packageName}/package.json`, {
132
+ paths: [workingDir],
133
+ });
134
+ const packageJsonSource = await (0, promises_1.readFile)(packageJsonPath, 'utf-8');
135
+ const packageJson = JSON.parse(packageJsonSource);
136
+ hasSerde = hasWorkflowSerdeDependency(packageJson);
137
+ }
138
+ catch {
139
+ // Best-effort only. Continue to source scanning.
140
+ }
141
+ try {
142
+ const entryPath = require.resolve(packageName, {
143
+ paths: [workingDir],
144
+ });
145
+ const source = await (0, promises_1.readFile)(entryPath, 'utf-8');
146
+ const patterns = detectWorkflowPatterns(source);
147
+ hasUseWorkflow = patterns.hasUseWorkflow;
148
+ hasUseStep = patterns.hasUseStep;
149
+ hasSerde ||= patterns.hasSerde;
150
+ }
151
+ catch {
152
+ // Best-effort only. Use whichever signal we already have.
153
+ }
154
+ if (!hasUseWorkflow && !hasUseStep && !hasSerde) {
155
+ return null;
156
+ }
157
+ return {
158
+ packageName,
159
+ hasUseWorkflow,
160
+ hasUseStep,
161
+ hasSerde,
162
+ };
163
+ }
164
+ function warnAboutAutoRemovedServerExternalPackages(detectedPackages) {
165
+ const newlyDetectedPackages = detectedPackages.filter(({ packageName }) => {
166
+ return !warnedAutoRemovedServerExternalPackages.has(packageName);
167
+ });
168
+ if (newlyDetectedPackages.length === 0) {
169
+ return;
170
+ }
171
+ for (const { packageName } of newlyDetectedPackages) {
172
+ warnedAutoRemovedServerExternalPackages.add(packageName);
173
+ }
174
+ const packageDescriptions = newlyDetectedPackages
175
+ .map((detected) => `"${detected.packageName}" (${getIssueLabels(detected).join(', ')})`)
176
+ .join(', ');
177
+ const packageNames = newlyDetectedPackages
178
+ .map((detected) => `"${detected.packageName}"`)
179
+ .join(', ');
180
+ console.warn(`\n⚠ Workflow found workflow code in serverExternalPackages: ${packageDescriptions}.` +
181
+ `\n Workflow removed the affected entries from serverExternalPackages for this build and is compiling the packages anyway.` +
182
+ `\n Remove ${packageNames} from serverExternalPackages in next.config to silence this warning.\n`);
183
+ }
9
184
  function resolveNextVersion(workingDir) {
10
185
  const errors = [];
11
186
  // Try resolving from the consuming project's working directory first.
@@ -36,10 +211,82 @@ function resolveNextVersion(workingDir) {
36
211
  }
37
212
  throw new AggregateError(errors, `Could not resolve Next.js version. Ensure \`next\` is installed in your project (working directory: ${workingDir}).`);
38
213
  }
39
- function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
40
- if (workflows?.lazyDiscovery) {
41
- process.env.WORKFLOW_NEXT_LAZY_DISCOVERY = '1';
214
+ function fileExists(path) {
215
+ try {
216
+ const stats = (0, node_fs_1.statSync)(path);
217
+ return stats.isFile();
42
218
  }
219
+ catch {
220
+ return false;
221
+ }
222
+ }
223
+ function getWorkflowManifestCopyPaths({ projectDir, distDir, }) {
224
+ const manifestCandidates = [
225
+ (0, node_path_1.join)(projectDir, 'app/.well-known/workflow/v1/manifest.json'),
226
+ (0, node_path_1.join)(projectDir, 'src/app/.well-known/workflow/v1/manifest.json'),
227
+ (0, node_path_1.join)(projectDir, 'public/.well-known/workflow/v1/manifest.json'),
228
+ ];
229
+ const manifestPath = manifestCandidates.find(fileExists);
230
+ if (!manifestPath) {
231
+ return;
232
+ }
233
+ const resolvedDistDir = (0, node_path_1.isAbsolute)(distDir)
234
+ ? distDir
235
+ : (0, node_path_1.join)(projectDir, distDir);
236
+ const diagnosticsManifestPath = (0, node_path_1.join)(resolvedDistDir, 'diagnostics', 'workflows-manifest.json');
237
+ return { manifestPath, diagnosticsManifestPath };
238
+ }
239
+ async function copyWorkflowDiagnosticsManifest(metadata) {
240
+ const paths = getWorkflowManifestCopyPaths(metadata);
241
+ if (!paths) {
242
+ return;
243
+ }
244
+ const { manifestPath, diagnosticsManifestPath } = paths;
245
+ await (0, promises_1.mkdir)((0, node_path_1.dirname)(diagnosticsManifestPath), { recursive: true });
246
+ await (0, promises_1.copyFile)(manifestPath, diagnosticsManifestPath);
247
+ }
248
+ function copyWorkflowDiagnosticsManifestSync(metadata) {
249
+ const paths = getWorkflowManifestCopyPaths(metadata);
250
+ if (!paths) {
251
+ return;
252
+ }
253
+ const { manifestPath, diagnosticsManifestPath } = paths;
254
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(diagnosticsManifestPath), { recursive: true });
255
+ (0, node_fs_1.copyFileSync)(manifestPath, diagnosticsManifestPath);
256
+ }
257
+ function registerWorkflowDiagnosticsManifestCopy(metadata) {
258
+ const marker = '__workflowDiagnosticsManifestCopies';
259
+ const globalWithMarker = globalThis;
260
+ if (!globalWithMarker[marker]) {
261
+ globalWithMarker[marker] = [];
262
+ process.once('exit', () => {
263
+ for (const copyMetadata of globalWithMarker[marker] || []) {
264
+ copyWorkflowDiagnosticsManifestSync(copyMetadata);
265
+ }
266
+ });
267
+ }
268
+ globalWithMarker[marker].push(metadata);
269
+ }
270
+ /**
271
+ * Mark `ws`'s optional native accelerators external on the webpack server
272
+ * build, which otherwise bundles their JS wrapper without the native `.node`
273
+ * binding and throws "bufferUtil.mask is not a function" at runtime. See
274
+ * `WORKFLOW_OPTIONAL_WS_NATIVE_MODULES`; `@workflow/rollup` handles the
275
+ * Rollup/Vite/Nitro side.
276
+ */
277
+ function externalizeWsNativeAccelerators(webpackConfig) {
278
+ const names = [...builders_1.WORKFLOW_OPTIONAL_WS_NATIVE_MODULES];
279
+ if (Array.isArray(webpackConfig.externals)) {
280
+ webpackConfig.externals.push(...names);
281
+ }
282
+ else if (webpackConfig.externals) {
283
+ webpackConfig.externals = [webpackConfig.externals, ...names];
284
+ }
285
+ else {
286
+ webpackConfig.externals = names;
287
+ }
288
+ }
289
+ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
43
290
  if (!process.env.VERCEL_DEPLOYMENT_ID) {
44
291
  if (!process.env.WORKFLOW_TARGET_WORLD) {
45
292
  process.env.WORKFLOW_TARGET_WORLD = 'local';
@@ -56,8 +303,13 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
56
303
  }
57
304
  }
58
305
  return async function buildConfig(phase, ctx) {
306
+ if (phase === 'phase-development-server' ||
307
+ phase === 'phase-production-build') {
308
+ const { prewarmWorkflowSwcPluginCache } = await Promise.resolve().then(() => __importStar(require('./swc-plugin-cache.js')));
309
+ // Loader workers inherit this cwd and read from the same SWC cache.
310
+ prewarmWorkflowSwcPluginCache(process.cwd());
311
+ }
59
312
  const loaderPath = require.resolve('./loader');
60
- let runDeferredBuildFromCallback;
61
313
  let nextConfig;
62
314
  if (typeof nextConfigOrFn === 'function') {
63
315
  nextConfig = await nextConfigOrFn(phase, ctx);
@@ -67,6 +319,47 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
67
319
  }
68
320
  // shallow clone to avoid read-only on top-level
69
321
  nextConfig = Object.assign({}, nextConfig);
322
+ const workflowBasePath = nextConfig.basePath;
323
+ setWorkflowBasePath(workflowBasePath);
324
+ nextConfig.serverExternalPackages = [
325
+ ...new Set([
326
+ ...(nextConfig.serverExternalPackages || []),
327
+ // Keep the Vercel world and its native-prone dependencies external so
328
+ // local builds do not try to parse @vercel/queue's keyring dependency
329
+ // tree.
330
+ ...VERCEL_WORLD_SERVER_EXTERNAL_PACKAGES,
331
+ ]),
332
+ ];
333
+ const existingCompiler = nextConfig.compiler ?? {};
334
+ const existingRunAfterProductionCompile = existingCompiler.runAfterProductionCompile;
335
+ const configuredServerExternalPackages = Array.isArray(nextConfig.serverExternalPackages)
336
+ ? nextConfig.serverExternalPackages
337
+ : [];
338
+ let effectiveServerExternalPackages = configuredServerExternalPackages;
339
+ if (configuredServerExternalPackages.length > 0) {
340
+ const detectedWorkflowPackages = [];
341
+ for (const packageName of configuredServerExternalPackages) {
342
+ if (PSEUDO_EXTERNAL_PACKAGES.has(packageName)) {
343
+ continue;
344
+ }
345
+ try {
346
+ const detected = await detectServerExternalPackage(packageName, process.cwd());
347
+ if (detected) {
348
+ detectedWorkflowPackages.push(detected);
349
+ }
350
+ }
351
+ catch {
352
+ // Best-effort only. Never block config generation.
353
+ }
354
+ }
355
+ if (detectedWorkflowPackages.length > 0) {
356
+ const removedPackages = new Set(detectedWorkflowPackages.map((detected) => detected.packageName));
357
+ effectiveServerExternalPackages =
358
+ configuredServerExternalPackages.filter((packageName) => !removedPackages.has(packageName));
359
+ nextConfig.serverExternalPackages = effectiveServerExternalPackages;
360
+ warnAboutAutoRemovedServerExternalPackages(detectedWorkflowPackages);
361
+ }
362
+ }
70
363
  // configure the loader if turbopack is being used
71
364
  if (!nextConfig.turbopack) {
72
365
  nextConfig.turbopack = {};
@@ -75,35 +368,51 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
75
368
  nextConfig.turbopack.rules = {};
76
369
  }
77
370
  const existingRules = nextConfig.turbopack.rules;
78
- const nextVersion = resolveNextVersion(process.cwd());
371
+ const workingDir = process.cwd();
372
+ const nextVersion = resolveNextVersion(workingDir);
373
+ const configuredProjectRoot = nextConfig.outputFileTracingRoot ?? nextConfig.turbopack?.root;
374
+ const projectRoot = configuredProjectRoot
375
+ ? (0, builders_1.resolveConfiguredProjectRoot)(workingDir, configuredProjectRoot)
376
+ : (0, builders_1.resolveProjectRoot)(workingDir);
79
377
  const supportsTurboCondition = semver_1.default.gte(nextVersion, 'v16.0.0');
80
- const useDeferredBuilder = (0, builder_js_1.shouldUseDeferredBuilder)(nextVersion);
81
- // Deferred builder discovers files via loader socket notifications, so
82
- // turbopack content conditions are only needed with the eager builder.
83
- const shouldApplyTurboCondition = supportsTurboCondition && !useDeferredBuilder;
84
378
  const shouldWatch = process.env.NODE_ENV === 'development';
85
379
  let workflowBuilderPromise;
86
380
  const distDir = nextConfig.distDir || '.next';
381
+ nextConfig.compiler = {
382
+ ...existingCompiler,
383
+ runAfterProductionCompile: async (metadata) => {
384
+ if (existingRunAfterProductionCompile) {
385
+ await existingRunAfterProductionCompile(metadata);
386
+ }
387
+ await copyWorkflowDiagnosticsManifest(metadata);
388
+ registerWorkflowDiagnosticsManifestCopy(metadata);
389
+ },
390
+ };
87
391
  const getWorkflowBuilder = async () => {
88
392
  if (!workflowBuilderPromise) {
89
393
  workflowBuilderPromise = (async () => {
90
394
  const NextBuilder = await (0, builder_js_1.getNextBuilder)(nextVersion);
91
395
  return new NextBuilder({
92
396
  watch: shouldWatch,
93
- // discover workflows from pages/app entries
94
- dirs: ['pages', 'app', 'src/pages', 'src/app'],
95
- projectRoot: nextConfig.outputFileTracingRoot,
96
- workingDir: process.cwd(),
397
+ // getInputFiles filters the project to Next.js entrypoints
398
+ dirs: ['.'],
399
+ pageExtensions: nextConfig.pageExtensions ?? [
400
+ 'tsx',
401
+ 'ts',
402
+ 'jsx',
403
+ 'js',
404
+ ],
405
+ projectRoot,
406
+ moduleSpecifierRoot: workingDir,
407
+ workingDir,
97
408
  distDir,
409
+ basePath: workflowBasePath,
98
410
  diagnosticsDir: `${distDir}/diagnostics`,
99
411
  buildTarget: 'next',
100
412
  workflowsBundlePath: '', // not used in base
101
413
  stepsBundlePath: '', // not used in base
102
414
  webhookBundlePath: '', // node used in base
103
- suppressCreateWorkflowsBundleLogs: useDeferredBuilder,
104
- suppressCreateWorkflowsBundleWarnings: useDeferredBuilder,
105
- suppressCreateWebhookBundleLogs: useDeferredBuilder,
106
- suppressCreateManifestLogs: useDeferredBuilder,
415
+ sourcemap: workflows?.sourcemap,
107
416
  externalPackages: [
108
417
  // server-only and client-only are pseudo-packages handled by Next.js
109
418
  // during its build process. We mark them as external to prevent esbuild
@@ -111,47 +420,13 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
111
420
  // See: https://nextjs.org/docs/app/getting-started/server-and-client-components
112
421
  'server-only',
113
422
  'client-only',
114
- ...(nextConfig.serverExternalPackages || []),
423
+ ...effectiveServerExternalPackages,
115
424
  ],
116
425
  });
117
426
  })();
118
427
  }
119
428
  return workflowBuilderPromise;
120
429
  };
121
- if (useDeferredBuilder) {
122
- runDeferredBuildFromCallback = async () => {
123
- const workflowBuilder = await getWorkflowBuilder();
124
- if (typeof workflowBuilder.onBeforeDeferredEntries === 'function') {
125
- await workflowBuilder.onBeforeDeferredEntries();
126
- }
127
- };
128
- const existingExperimental = (nextConfig.experimental ?? {});
129
- const existingDeferredEntries = Array.isArray(existingExperimental.deferredEntries)
130
- ? existingExperimental.deferredEntries
131
- : [];
132
- const existingOnBeforeDeferredEntries = typeof existingExperimental.onBeforeDeferredEntries === 'function'
133
- ? existingExperimental.onBeforeDeferredEntries
134
- : undefined;
135
- nextConfig.experimental = {
136
- ...existingExperimental,
137
- // biome-ignore lint/suspicious/noTsIgnore: expect-error is wrong as it will work on valid version
138
- // @ts-ignore this is only available in canary Next.js
139
- deferredEntries: [
140
- ...new Set([
141
- ...existingDeferredEntries,
142
- ...builder_js_1.WORKFLOW_DEFERRED_ENTRIES,
143
- ]),
144
- ],
145
- onBeforeDeferredEntries: async (...args) => {
146
- if (existingOnBeforeDeferredEntries) {
147
- await existingOnBeforeDeferredEntries(...args);
148
- }
149
- if (runDeferredBuildFromCallback) {
150
- await runDeferredBuildFromCallback();
151
- }
152
- },
153
- };
154
- }
155
430
  for (const key of [
156
431
  '*.tsx',
157
432
  '*.ts',
@@ -163,7 +438,7 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
163
438
  '*.cts',
164
439
  ]) {
165
440
  nextConfig.turbopack.rules[key] = {
166
- ...(shouldApplyTurboCondition
441
+ ...(supportsTurboCondition
167
442
  ? {
168
443
  condition: {
169
444
  // Use 'all' to combine: must match content AND must NOT be in generated path
@@ -200,8 +475,11 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
200
475
  test: /.*\.(mjs|cjs|cts|ts|tsx|js|jsx)$/,
201
476
  loader: loaderPath,
202
477
  });
478
+ if (args[1]?.isServer) {
479
+ externalizeWsNativeAccelerators(webpackConfig);
480
+ }
203
481
  return existingWebpackModify
204
- ? existingWebpackModify(...args)
482
+ ? (existingWebpackModify(...args) ?? webpackConfig)
205
483
  : webpackConfig;
206
484
  };
207
485
  // only run this in the main process so it only runs once
@@ -215,4 +493,4 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
215
493
  return nextConfig;
216
494
  };
217
495
  }
218
- //# sourceMappingURL=index.js.map
496
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3VkEsb0NBZ1JDO0FBeG1CRCxxQ0FBNEQ7QUFDNUQsK0NBQTZEO0FBQzdELHlDQUFzRDtBQUN0RCxpREFJNEI7QUFFNUIsb0RBQTRCO0FBQzVCLDZDQUE4QztBQUU5QyxNQUFNLG9CQUFvQixHQUFHLHdCQUF3QixDQUFDO0FBQ3RELE1BQU0sZ0NBQWdDLEdBQUc7SUFDdkMsZUFBZTtJQUNmLGNBQWM7SUFDZCxrQkFBa0I7SUFDbEIsa0JBQWtCO0NBQ25CLENBQUM7QUFDRixNQUFNLHFDQUFxQyxHQUFHO0lBQzVDLG9CQUFvQjtJQUNwQixHQUFHLGdDQUFnQztDQUNwQyxDQUFDO0FBQ0YsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUM3RCxNQUFNLGNBQWMsR0FBRyw2QkFBNkIsQ0FBQztBQUNyRCxNQUFNLDBCQUEwQixHQUFHLGlDQUFpQyxDQUFDO0FBQ3JFLE1BQU0sMEJBQTBCLEdBQzlCLG9FQUFvRSxDQUFDO0FBQ3ZFLE1BQU0sb0NBQW9DLEdBQ3hDLDhDQUE4QyxDQUFDO0FBRWpELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztBQUN6RSxNQUFNLHVDQUF1QyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFDbEUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDL0QsTUFBTSxZQUFZLEdBQUcsVUFDZSxDQUFDO0FBRXJDLGtGQUFrRjtBQUNsRixTQUFTLG1CQUFtQixDQUFDLFFBQTRCO0lBQ3ZELFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLFFBQVEsSUFBSSxFQUFFLENBQUM7QUFDbEQsQ0FBQztBQWVE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bm9kZTpmcyc7XG5pbXBvcnQgeyBjb3B5RmlsZSwgbWtkaXIsIHJlYWRGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBpc0Fic29sdXRlLCBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7XG4gIHJlc29sdmVDb25maWd1cmVkUHJvamVjdFJvb3QsXG4gIHJlc29sdmVQcm9qZWN0Um9vdCxcbiAgV09SS0ZMT1dfT1BUSU9OQUxfV1NfTkFUSVZFX01PRFVMRVMsXG59IGZyb20gJ0B3b3JrZmxvdy9idWlsZGVycyc7XG5pbXBvcnQgdHlwZSB7IE5leHRDb25maWcgfSBmcm9tICduZXh0JztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IGdldE5leHRCdWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuY29uc3QgVkVSQ0VMX1dPUkxEX1BBQ0tBR0UgPSAnQHdvcmtmbG93L3dvcmxkLXZlcmNlbCc7XG5jb25zdCBWRVJDRUxfV09STERfREVQRU5ERU5DWV9QQUNLQUdFUyA9IFtcbiAgJ0B2ZXJjZWwvcXVldWUnLFxuICAnQHZlcmNlbC9vaWRjJyxcbiAgJ0B2ZXJjZWwvY2xpLWF1dGgnLFxuICAnQG5hcGktcnMva2V5cmluZycsXG5dO1xuY29uc3QgVkVSQ0VMX1dPUkxEX1NFUlZFUl9FWFRFUk5BTF9QQUNLQUdFUyA9IFtcbiAgVkVSQ0VMX1dPUkxEX1BBQ0tBR0UsXG4gIC4uLlZFUkNFTF9XT1JMRF9ERVBFTkRFTkNZX1BBQ0tBR0VTLFxuXTtcbmNvbnN0IHVzZVdvcmtmbG93UGF0dGVybiA9IC9eXFxzKihbJ1wiXSl1c2Ugd29ya2Zsb3dcXDE7P1xccyokL207XG5jb25zdCB1c2VTdGVwUGF0dGVybiA9IC9eXFxzKihbJ1wiXSl1c2Ugc3RlcFxcMTs/XFxzKiQvbTtcbmNvbnN0IHdvcmtmbG93U2VyZGVJbXBvcnRQYXR0ZXJuID0gL2Zyb21cXHMrKFsnXCJdKUB3b3JrZmxvd1xcL3NlcmRlXFwxLztcbmNvbnN0IHdvcmtmbG93U2VyZGVTeW1ib2xQYXR0ZXJuID1cbiAgL1N5bWJvbFxcLmZvclxccypcXChcXHMqKFsnXCJdKXdvcmtmbG93LSg/OnNlcmlhbGl6ZXxkZXNlcmlhbGl6ZSlcXDFcXHMqXFwpLztcbmNvbnN0IHdvcmtmbG93U2VyZGVDb21wdXRlZFByb3BlcnR5UGF0dGVybiA9XG4gIC9cXFtcXHMqV09SS0ZMT1dfKD86U0VSSUFMSVpFfERFU0VSSUFMSVpFKVxccypcXF0vO1xuXG5jb25zdCBQU0VVRE9fRVhURVJOQUxfUEFDS0FHRVMgPSBuZXcgU2V0KFsnc2VydmVyLW9ubHknLCAnY2xpZW50LW9ubHknXSk7XG5jb25zdCB3YXJuZWRBdXRvUmVtb3ZlZFNlcnZlckV4dGVybmFsUGFja2FnZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbmNvbnN0IEJBU0VfUEFUSF9TWU1CT0wgPSBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvY29yZS9iYXNlUGF0aCcpO1xuY29uc3QgZ2xvYmFsQ29uZmlnID0gZ2xvYmFsVGhpcyBhcyB0eXBlb2YgZ2xvYmFsVGhpcyAmXG4gIFJlY29yZDxzeW1ib2wsIHN0cmluZyB8IHVuZGVmaW5lZD47XG5cbi8vIEtlZXAgdGhpcyBsb2NhbDogQHdvcmtmbG93L25leHQgaXMgQ29tbW9uSlMsIHdoaWxlIEB3b3JrZmxvdy91dGlscyBpcyBFU00tb25seS5cbmZ1bmN0aW9uIHNldFdvcmtmbG93QmFzZVBhdGgoYmFzZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBnbG9iYWxDb25maWdbQkFTRV9QQVRIX1NZTUJPTF0gPSBiYXNlUGF0aCA/PyAnJztcbn1cblxuaW50ZXJmYWNlIFdvcmtmbG93UGF0dGVybk1hdGNoIHtcbiAgaGFzVXNlV29ya2Zsb3c6IGJvb2xlYW47XG4gIGhhc1VzZVN0ZXA6IGJvb2xlYW47XG4gIGhhc1NlcmRlOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRGV0ZWN0ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2Uge1xuICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICBoYXNVc2VXb3JrZmxvdzogYm9vbGVhbjtcbiAgaGFzVXNlU3RlcDogYm9vbGVhbjtcbiAgaGFzU2VyZGU6IGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNSZXNvbHZhYmxlUGFja2FnZVNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4nKSB8fCBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChzcGVjaWZpZXIuc3RhcnRzV2l0aCgnJCcpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChzcGVjaWZpZXIuaW5jbHVkZXMoJyonKSB8fCBzcGVjaWZpZXIuaW5jbHVkZXMoJzonKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zKHNvdXJjZTogc3RyaW5nKTogV29ya2Zsb3dQYXR0ZXJuTWF0Y2gge1xuICBjb25zdCBoYXNVc2VXb3JrZmxvdyA9IHVzZVdvcmtmbG93UGF0dGVybi50ZXN0KHNvdXJjZSk7XG4gIGNvbnN0IGhhc1VzZVN0ZXAgPSB1c2VTdGVwUGF0dGVybi50ZXN0KHNvdXJjZSk7XG4gIGNvbnN0IGhhc1NlcmRlSW1wb3J0ID0gd29ya2Zsb3dTZXJkZUltcG9ydFBhdHRlcm4udGVzdChzb3VyY2UpO1xuICBjb25zdCBoYXNTZXJkZVN5bWJvbCA9IHdvcmtmbG93U2VyZGVTeW1ib2xQYXR0ZXJuLnRlc3Qoc291cmNlKTtcbiAgY29uc3QgaGFzU2VyZGVDb21wdXRlZFByb3BlcnR5ID1cbiAgICB3b3JrZmxvd1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eVBhdHRlcm4udGVzdChzb3VyY2UpO1xuXG4gIHJldHVybiB7XG4gICAgaGFzVXNlV29ya2Zsb3csXG4gICAgaGFzVXNlU3RlcCxcbiAgICBoYXNTZXJkZTogaGFzU2VyZGVJbXBvcnQgfHwgaGFzU2VyZGVTeW1ib2wgfHwgaGFzU2VyZGVDb21wdXRlZFByb3BlcnR5LFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRJc3N1ZUxhYmVscyhkZXRlY3RlZDogRGV0ZWN0ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2UpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGlzc3Vlczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGRldGVjdGVkLmhhc1VzZVdvcmtmbG93KSB7XG4gICAgaXNzdWVzLnB1c2goJ1widXNlIHdvcmtmbG93XCIgZnVuY3Rpb25zJyk7XG4gIH1cbiAgaWYgKGRldGVjdGVkLmhhc1VzZVN0ZXApIHtcbiAgICBpc3N1ZXMucHVzaCgnXCJ1c2Ugc3RlcFwiIGZ1bmN0aW9ucycpO1xuICB9XG4gIGlmIChkZXRlY3RlZC5oYXNTZXJkZSkge1xuICAgIGlzc3Vlcy5wdXNoKCdzZXJpYWxpemF0aW9uIGNsYXNzZXMnKTtcbiAgfVxuICByZXR1cm4gaXNzdWVzO1xufVxuXG5mdW5jdGlvbiBoYXNXb3JrZmxvd1NlcmRlRGVwZW5kZW5jeShwYWNrYWdlSnNvbjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWlzUGxhaW5PYmplY3QocGFja2FnZUpzb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gaXNQbGFpbk9iamVjdChwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMpXG4gICAgPyBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXNcbiAgICA6IHt9O1xuICBjb25zdCBwZWVyRGVwZW5kZW5jaWVzID0gaXNQbGFpbk9iamVjdChwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzKVxuICAgID8gcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llc1xuICAgIDoge307XG5cbiAgcmV0dXJuIChcbiAgICBPYmplY3QuaGFzT3duKGRlcGVuZGVuY2llcywgJ0B3b3JrZmxvdy9zZXJkZScpIHx8XG4gICAgT2JqZWN0Lmhhc093bihwZWVyRGVwZW5kZW5jaWVzLCAnQHdvcmtmbG93L3NlcmRlJylcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGV0ZWN0U2VydmVyRXh0ZXJuYWxQYWNrYWdlKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICB3b3JraW5nRGlyOiBzdHJpbmdcbik6IFByb21pc2U8RGV0ZWN0ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2UgfCBudWxsPiB7XG4gIGlmICghaXNSZXNvbHZhYmxlUGFja2FnZVNwZWNpZmllcihwYWNrYWdlTmFtZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBoYXNVc2VXb3JrZmxvdyA9IGZhbHNlO1xuICBsZXQgaGFzVXNlU3RlcCA9IGZhbHNlO1xuICBsZXQgaGFzU2VyZGUgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShgJHtwYWNrYWdlTmFtZX0vcGFja2FnZS5qc29uYCwge1xuICAgICAgcGF0aHM6IFt3b3JraW5nRGlyXSxcbiAgICB9KTtcbiAgICBjb25zdCBwYWNrYWdlSnNvblNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uU291cmNlKSBhcyB1bmtub3duO1xuICAgIGhhc1NlcmRlID0gaGFzV29ya2Zsb3dTZXJkZURlcGVuZGVuY3kocGFja2FnZUpzb24pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBCZXN0LWVmZm9ydCBvbmx5LiBDb250aW51ZSB0byBzb3VyY2Ugc2Nhbm5pbmcuXG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGVudHJ5UGF0aCA9IHJlcXVpcmUucmVzb2x2ZShwYWNrYWdlTmFtZSwge1xuICAgICAgcGF0aHM6IFt3b3JraW5nRGlyXSxcbiAgICB9KTtcbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZWFkRmlsZShlbnRyeVBhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IHBhdHRlcm5zID0gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2UpO1xuICAgIGhhc1VzZVdvcmtmbG93ID0gcGF0dGVybnMuaGFzVXNlV29ya2Zsb3c7XG4gICAgaGFzVXNlU3RlcCA9IHBhdHRlcm5zLmhhc1VzZVN0ZXA7XG4gICAgaGFzU2VyZGUgfHw9IHBhdHRlcm5zLmhhc1NlcmRlO1xuICB9IGNhdGNoIHtcbiAgICAvLyBCZXN0LWVmZm9ydCBvbmx5LiBVc2Ugd2hpY2hldmVyIHNpZ25hbCB3ZSBhbHJlYWR5IGhhdmUuXG4gIH1cblxuICBpZiAoIWhhc1VzZVdvcmtmbG93ICYmICFoYXNVc2VTdGVwICYmICFoYXNTZXJkZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYWNrYWdlTmFtZSxcbiAgICBoYXNVc2VXb3JrZmxvdyxcbiAgICBoYXNVc2VTdGVwLFxuICAgIGhhc1NlcmRlLFxuICB9O1xufVxuXG5mdW5jdGlvbiB3YXJuQWJvdXRBdXRvUmVtb3ZlZFNlcnZlckV4dGVybmFsUGFja2FnZXMoXG4gIGRldGVjdGVkUGFja2FnZXM6IERldGVjdGVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlW11cbik6IHZvaWQge1xuICBjb25zdCBuZXdseURldGVjdGVkUGFja2FnZXMgPSBkZXRlY3RlZFBhY2thZ2VzLmZpbHRlcigoeyBwYWNrYWdlTmFtZSB9KSA9PiB7XG4gICAgcmV0dXJuICF3YXJuZWRBdXRvUmVtb3ZlZFNlcnZlckV4dGVybmFsUGFja2FnZXMuaGFzKHBhY2thZ2VOYW1lKTtcbiAgfSk7XG5cbiAgaWYgKG5ld2x5RGV0ZWN0ZWRQYWNrYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGNvbnN0IHsgcGFja2FnZU5hbWUgfSBvZiBuZXdseURldGVjdGVkUGFja2FnZXMpIHtcbiAgICB3YXJuZWRBdXRvUmVtb3ZlZFNlcnZlckV4dGVybmFsUGFja2FnZXMuYWRkKHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VEZXNjcmlwdGlvbnMgPSBuZXdseURldGVjdGVkUGFja2FnZXNcbiAgICAubWFwKFxuICAgICAgKGRldGVjdGVkKSA9PlxuICAgICAgICBgXCIke2RldGVjdGVkLnBhY2thZ2VOYW1lfVwiICgke2dldElzc3VlTGFiZWxzKGRldGVjdGVkKS5qb2luKCcsICcpfSlgXG4gICAgKVxuICAgIC5qb2luKCcsICcpO1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXdseURldGVjdGVkUGFja2FnZXNcbiAgICAubWFwKChkZXRlY3RlZCkgPT4gYFwiJHtkZXRlY3RlZC5wYWNrYWdlTmFtZX1cImApXG4gICAgLmpvaW4oJywgJyk7XG5cbiAgY29uc29sZS53YXJuKFxuICAgIGBcXG7imqAgV29ya2Zsb3cgZm91bmQgd29ya2Zsb3cgY29kZSBpbiBzZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzOiAke3BhY2thZ2VEZXNjcmlwdGlvbnN9LmAgK1xuICAgICAgYFxcbiAgV29ya2Zsb3cgcmVtb3ZlZCB0aGUgYWZmZWN0ZWQgZW50cmllcyBmcm9tIHNlcnZlckV4dGVybmFsUGFja2FnZXMgZm9yIHRoaXMgYnVpbGQgYW5kIGlzIGNvbXBpbGluZyB0aGUgcGFja2FnZXMgYW55d2F5LmAgK1xuICAgICAgYFxcbiAgUmVtb3ZlICR7cGFja2FnZU5hbWVzfSBmcm9tIHNlcnZlckV4dGVybmFsUGFja2FnZXMgaW4gbmV4dC5jb25maWcgdG8gc2lsZW5jZSB0aGlzIHdhcm5pbmcuXFxuYFxuICApO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlTmV4dFZlcnNpb24od29ya2luZ0Rpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXJyb3JzOiB1bmtub3duW10gPSBbXTtcblxuICAvLyBUcnkgcmVzb2x2aW5nIGZyb20gdGhlIGNvbnN1bWluZyBwcm9qZWN0J3Mgd29ya2luZyBkaXJlY3RvcnkgZmlyc3QuXG4gIC8vIFRoaXMgaGFuZGxlcyBtb25vcmVwbyBzZXR1cHMgd2hlcmUgYG5leHRgIG1heSBub3QgYmUgaG9pc3RlZCB0byB0aGVcbiAgLy8gc2FtZSBsb2NhdGlvbiBhcyBgQHdvcmtmbG93L25leHRgLlxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnbmV4dC9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBwYXRoczogW3dvcmtpbmdEaXJdLFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc29sdmVkUGFja2FnZUpzb24gPSByZXF1aXJlKHBhY2thZ2VKc29uUGF0aCkgYXMge1xuICAgICAgdmVyc2lvbj86IHVua25vd247XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkUGFja2FnZUpzb24udmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiByZXNvbHZlZFBhY2thZ2VKc29uLnZlcnNpb247XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgZXJyb3JzLnB1c2goZSk7XG4gIH1cblxuICAvLyBGYWxsIGJhY2sgdG8gcmVzb2x2aW5nIHJlbGF0aXZlIHRvIHRoaXMgcGFja2FnZSdzIGxvY2F0aW9uLlxuICB0cnkge1xuICAgIGNvbnN0IHZlcnNpb24gPSAocmVxdWlyZSgnbmV4dC9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiB1bmtub3duIH0pXG4gICAgICAudmVyc2lvbjtcbiAgICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmVyc2lvbjtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvcnMucHVzaChlKTtcbiAgfVxuXG4gIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihcbiAgICBlcnJvcnMsXG4gICAgYENvdWxkIG5vdCByZXNvbHZlIE5leHQuanMgdmVyc2lvbi4gRW5zdXJlIFxcYG5leHRcXGAgaXMgaW5zdGFsbGVkIGluIHlvdXIgcHJvamVjdCAod29ya2luZyBkaXJlY3Rvcnk6ICR7d29ya2luZ0Rpcn0pLmBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZmlsZUV4aXN0cyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IHN0YXRTeW5jKHBhdGgpO1xuICAgIHJldHVybiBzdGF0cy5pc0ZpbGUoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdvcmtmbG93TWFuaWZlc3RDb3B5UGF0aHMoe1xuICBwcm9qZWN0RGlyLFxuICBkaXN0RGlyLFxufToge1xuICBwcm9qZWN0RGlyOiBzdHJpbmc7XG4gIGRpc3REaXI6IHN0cmluZztcbn0pOiB7IG1hbmlmZXN0UGF0aDogc3RyaW5nOyBkaWFnbm9zdGljc01hbmlmZXN0UGF0aDogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBtYW5pZmVzdENhbmRpZGF0ZXMgPSBbXG4gICAgam9pbihwcm9qZWN0RGlyLCAnYXBwLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL21hbmlmZXN0Lmpzb24nKSxcbiAgICBqb2luKHByb2plY3REaXIsICdzcmMvYXBwLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL21hbmlmZXN0Lmpzb24nKSxcbiAgICBqb2luKHByb2plY3REaXIsICdwdWJsaWMvLndlbGwta25vd24vd29ya2Zsb3cvdjEvbWFuaWZlc3QuanNvbicpLFxuICBdO1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBtYW5pZmVzdENhbmRpZGF0ZXMuZmluZChmaWxlRXhpc3RzKTtcblxuICBpZiAoIW1hbmlmZXN0UGF0aCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkRGlzdERpciA9IGlzQWJzb2x1dGUoZGlzdERpcilcbiAgICA/IGRpc3REaXJcbiAgICA6IGpvaW4ocHJvamVjdERpciwgZGlzdERpcik7XG4gIGNvbnN0IGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoID0gam9pbihcbiAgICByZXNvbHZlZERpc3REaXIsXG4gICAgJ2RpYWdub3N0aWNzJyxcbiAgICAnd29ya2Zsb3dzLW1hbmlmZXN0Lmpzb24nXG4gICk7XG4gIHJldHVybiB7IG1hbmlmZXN0UGF0aCwgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGggfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29weVdvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdChtZXRhZGF0YToge1xuICBwcm9qZWN0RGlyOiBzdHJpbmc7XG4gIGRpc3REaXI6IHN0cmluZztcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGF0aHMgPSBnZXRXb3JrZmxvd01hbmlmZXN0Q29weVBhdGhzKG1ldGFkYXRhKTtcbiAgaWYgKCFwYXRocykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgbWFuaWZlc3RQYXRoLCBkaWFnbm9zdGljc01hbmlmZXN0UGF0aCB9ID0gcGF0aHM7XG4gIGF3YWl0IG1rZGlyKGRpcm5hbWUoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgY29weUZpbGUobWFuaWZlc3RQYXRoLCBkaWFnbm9zdGljc01hbmlmZXN0UGF0aCk7XG59XG5cbmZ1bmN0aW9uIGNvcHlXb3JrZmxvd0RpYWdub3N0aWNzTWFuaWZlc3RTeW5jKG1ldGFkYXRhOiB7XG4gIHByb2plY3REaXI6IHN0cmluZztcbiAgZGlzdERpcjogc3RyaW5nO1xufSk6IHZvaWQge1xuICBjb25zdCBwYXRocyA9IGdldFdvcmtmbG93TWFuaWZlc3RDb3B5UGF0aHMobWV0YWRhdGEpO1xuICBpZiAoIXBhdGhzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBtYW5pZmVzdFBhdGgsIGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoIH0gPSBwYXRocztcbiAgbWtkaXJTeW5jKGRpcm5hbWUoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29weUZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlcldvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdENvcHkobWV0YWRhdGE6IHtcbiAgcHJvamVjdERpcjogc3RyaW5nO1xuICBkaXN0RGlyOiBzdHJpbmc7XG59KTogdm9pZCB7XG4gIGNvbnN0IG1hcmtlciA9ICdfX3dvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdENvcGllcyc7XG4gIGNvbnN0IGdsb2JhbFdpdGhNYXJrZXIgPSBnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICAgIFttYXJrZXJdPzogQXJyYXk8eyBwcm9qZWN0RGlyOiBzdHJpbmc7IGRpc3REaXI6IHN0cmluZyB9PjtcbiAgfTtcblxuICBpZiAoIWdsb2JhbFdpdGhNYXJrZXJbbWFya2VyXSkge1xuICAgIGdsb2JhbFdpdGhNYXJrZXJbbWFya2VyXSA9IFtdO1xuICAgIHByb2Nlc3Mub25jZSgnZXhpdCcsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY29weU1ldGFkYXRhIG9mIGdsb2JhbFdpdGhNYXJrZXJbbWFya2VyXSB8fCBbXSkge1xuICAgICAgICBjb3B5V29ya2Zsb3dEaWFnbm9zdGljc01hbmlmZXN0U3luYyhjb3B5TWV0YWRhdGEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2xvYmFsV2l0aE1hcmtlclttYXJrZXJdLnB1c2gobWV0YWRhdGEpO1xufVxuXG4vKipcbiAqIE1hcmsgYHdzYCdzIG9wdGlvbmFsIG5hdGl2ZSBhY2NlbGVyYXRvcnMgZXh0ZXJuYWwgb24gdGhlIHdlYnBhY2sgc2VydmVyXG4gKiBidWlsZCwgd2hpY2ggb3RoZXJ3aXNlIGJ1bmRsZXMgdGhlaXIgSlMgd3JhcHBlciB3aXRob3V0IHRoZSBuYXRpdmUgYC5ub2RlYFxuICogYmluZGluZyBhbmQgdGhyb3dzIFwiYnVmZmVyVXRpbC5tYXNrIGlzIG5vdCBhIGZ1bmN0aW9uXCIgYXQgcnVudGltZS4gU2VlXG4gKiBgV09SS0ZMT1dfT1BUSU9OQUxfV1NfTkFUSVZFX01PRFVMRVNgOyBgQHdvcmtmbG93L3JvbGx1cGAgaGFuZGxlcyB0aGVcbiAqIFJvbGx1cC9WaXRlL05pdHJvIHNpZGUuXG4gKi9cbmZ1bmN0aW9uIGV4dGVybmFsaXplV3NOYXRpdmVBY2NlbGVyYXRvcnMod2VicGFja0NvbmZpZzoge1xuICBleHRlcm5hbHM/OiB1bmtub3duO1xufSk6IHZvaWQge1xuICBjb25zdCBuYW1lcyA9IFsuLi5XT1JLRkxPV19PUFRJT05BTF9XU19OQVRJVkVfTU9EVUxFU107XG4gIGlmIChBcnJheS5pc0FycmF5KHdlYnBhY2tDb25maWcuZXh0ZXJuYWxzKSkge1xuICAgIHdlYnBhY2tDb25maWcuZXh0ZXJuYWxzLnB1c2goLi4ubmFtZXMpO1xuICB9IGVsc2UgaWYgKHdlYnBhY2tDb25maWcuZXh0ZXJuYWxzKSB7XG4gICAgd2VicGFja0NvbmZpZy5leHRlcm5hbHMgPSBbd2VicGFja0NvbmZpZy5leHRlcm5hbHMsIC4uLm5hbWVzXTtcbiAgfSBlbHNlIHtcbiAgICB3ZWJwYWNrQ29uZmlnLmV4dGVybmFscyA9IG5hbWVzO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoV29ya2Zsb3coXG4gIG5leHRDb25maWdPckZuOlxuICAgIHwgTmV4dENvbmZpZ1xuICAgIHwgKChcbiAgICAgICAgcGhhc2U6IHN0cmluZyxcbiAgICAgICAgY3R4OiB7IGRlZmF1bHRDb25maWc6IE5leHRDb25maWcgfVxuICAgICAgKSA9PiBQcm9taXNlPE5leHRDb25maWc+KSxcbiAge1xuICAgIHdvcmtmbG93cyxcbiAgfToge1xuICAgIHdvcmtmbG93cz86IHtcbiAgICAgIGxvY2FsPzoge1xuICAgICAgICBwb3J0PzogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQ29udHJvbHMgaG93IHNvdXJjZSBtYXBzIGFyZSBlbWl0dGVkIGZvciB3b3JrZmxvdyBidW5kbGVzLiBBY2NlcHRzXG4gICAgICAgKiB0aGUgc2FtZSB2YWx1ZXMgYXMgZXNidWlsZCdzIGBzb3VyY2VtYXBgIG9wdGlvbjogYHRydWVgL2AnaW5saW5lJ2BcbiAgICAgICAqIChkZWZhdWx0KSwgYCdsaW5rZWQnYCwgYCdleHRlcm5hbCdgLCBgJ2JvdGgnYCwgb3IgYGZhbHNlYCB0byBvbWl0XG4gICAgICAgKiBzb3VyY2UgbWFwcy4gQ2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgYFdPUktGTE9XX1NPVVJDRU1BUGBcbiAgICAgICAqIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICAgICAgICovXG4gICAgICBzb3VyY2VtYXA/OiBib29sZWFuIHwgJ2lubGluZScgfCAnbGlua2VkJyB8ICdleHRlcm5hbCcgfCAnYm90aCc7XG4gICAgfTtcbiAgfSA9IHt9XG4pIHtcbiAgaWYgKCFwcm9jZXNzLmVudi5WRVJDRUxfREVQTE9ZTUVOVF9JRCkge1xuICAgIGlmICghcHJvY2Vzcy5lbnYuV09SS0ZMT1dfVEFSR0VUX1dPUkxEKSB7XG4gICAgICBwcm9jZXNzLmVudi5XT1JLRkxPV19UQVJHRVRfV09STEQgPSAnbG9jYWwnO1xuICAgICAgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfTE9DQUxfREFUQV9ESVIgPSAnLm5leHQvd29ya2Zsb3ctZGF0YSc7XG4gICAgfVxuICAgIGNvbnN0IG1heWJlUG9ydCA9IHdvcmtmbG93cz8ubG9jYWw/LnBvcnQ7XG4gICAgaWYgKG1heWJlUG9ydCkge1xuICAgICAgcHJvY2Vzcy5lbnYuUE9SVCA9IG1heWJlUG9ydC50b1N0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoIXByb2Nlc3MuZW52LldPUktGTE9XX1RBUkdFVF9XT1JMRCkge1xuICAgICAgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfVEFSR0VUX1dPUkxEID0gJ3ZlcmNlbCc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ29uZmlnKFxuICAgIHBoYXNlOiBzdHJpbmcsXG4gICAgY3R4OiB7IGRlZmF1bHRDb25maWc6IE5leHRDb25maWcgfVxuICApIHtcbiAgICBpZiAoXG4gICAgICBwaGFzZSA9PT0gJ3BoYXNlLWRldmVsb3BtZW50LXNlcnZlcicgfHxcbiAgICAgIHBoYXNlID09PSAncGhhc2UtcHJvZHVjdGlvbi1idWlsZCdcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcHJld2FybVdvcmtmbG93U3djUGx1Z2luQ2FjaGUgfSA9IGF3YWl0IGltcG9ydChcbiAgICAgICAgJy4vc3djLXBsdWdpbi1jYWNoZS5qcydcbiAgICAgICk7XG4gICAgICAvLyBMb2FkZXIgd29ya2VycyBpbmhlcml0IHRoaXMgY3dkIGFuZCByZWFkIGZyb20gdGhlIHNhbWUgU1dDIGNhY2hlLlxuICAgICAgcHJld2FybVdvcmtmbG93U3djUGx1Z2luQ2FjaGUocHJvY2Vzcy5jd2QoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgbG9hZGVyUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnLi9sb2FkZXInKTtcbiAgICBsZXQgbmV4dENvbmZpZzogTmV4dENvbmZpZztcblxuICAgIGlmICh0eXBlb2YgbmV4dENvbmZpZ09yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG5leHRDb25maWcgPSBhd2FpdCBuZXh0Q29uZmlnT3JGbihwaGFzZSwgY3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dENvbmZpZyA9IG5leHRDb25maWdPckZuO1xuICAgIH1cbiAgICAvLyBzaGFsbG93IGNsb25lIHRvIGF2b2lkIHJlYWQtb25seSBvbiB0b3AtbGV2ZWxcbiAgICBuZXh0Q29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgbmV4dENvbmZpZyk7XG4gICAgY29uc3Qgd29ya2Zsb3dCYXNlUGF0aCA9IG5leHRDb25maWcuYmFzZVBhdGg7XG4gICAgc2V0V29ya2Zsb3dCYXNlUGF0aCh3b3JrZmxvd0Jhc2VQYXRoKTtcbiAgICBuZXh0Q29uZmlnLnNlcnZlckV4dGVybmFsUGFja2FnZXMgPSBbXG4gICAgICAuLi5uZXcgU2V0KFtcbiAgICAgICAgLi4uKG5leHRDb25maWcuc2VydmVyRXh0ZXJuYWxQYWNrYWdlcyB8fCBbXSksXG4gICAgICAgIC8vIEtlZXAgdGhlIFZlcmNlbCB3b3JsZCBhbmQgaXRzIG5hdGl2ZS1wcm9uZSBkZXBlbmRlbmNpZXMgZXh0ZXJuYWwgc29cbiAgICAgICAgLy8gbG9jYWwgYnVpbGRzIGRvIG5vdCB0cnkgdG8gcGFyc2UgQHZlcmNlbC9xdWV1ZSdzIGtleXJpbmcgZGVwZW5kZW5jeVxuICAgICAgICAvLyB0cmVlLlxuICAgICAgICAuLi5WRVJDRUxfV09STERfU0VSVkVSX0VYVEVSTkFMX1BBQ0tBR0VTLFxuICAgICAgXSksXG4gICAgXTtcbiAgICBjb25zdCBleGlzdGluZ0NvbXBpbGVyID0gbmV4dENvbmZpZy5jb21waWxlciA/PyB7fTtcbiAgICBjb25zdCBleGlzdGluZ1J1bkFmdGVyUHJvZHVjdGlvbkNvbXBpbGUgPSAoXG4gICAgICBleGlzdGluZ0NvbXBpbGVyIGFzIHtcbiAgICAgICAgcnVuQWZ0ZXJQcm9kdWN0aW9uQ29tcGlsZT86IChtZXRhZGF0YToge1xuICAgICAgICAgIHByb2plY3REaXI6IHN0cmluZztcbiAgICAgICAgICBkaXN0RGlyOiBzdHJpbmc7XG4gICAgICAgIH0pID0+IFByb21pc2U8dm9pZD47XG4gICAgICB9XG4gICAgKS5ydW5BZnRlclByb2R1Y3Rpb25Db21waWxlO1xuXG4gICAgY29uc3QgY29uZmlndXJlZFNlcnZlckV4dGVybmFsUGFja2FnZXMgPSBBcnJheS5pc0FycmF5KFxuICAgICAgbmV4dENvbmZpZy5zZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzXG4gICAgKVxuICAgICAgPyBuZXh0Q29uZmlnLnNlcnZlckV4dGVybmFsUGFja2FnZXNcbiAgICAgIDogW107XG4gICAgbGV0IGVmZmVjdGl2ZVNlcnZlckV4dGVybmFsUGFja2FnZXMgPSBjb25maWd1cmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcztcblxuICAgIGlmIChjb25maWd1cmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkZXRlY3RlZFdvcmtmbG93UGFja2FnZXM6IERldGVjdGVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZU5hbWUgb2YgY29uZmlndXJlZFNlcnZlckV4dGVybmFsUGFja2FnZXMpIHtcbiAgICAgICAgaWYgKFBTRVVET19FWFRFUk5BTF9QQUNLQUdFUy5oYXMocGFja2FnZU5hbWUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRldGVjdGVkID0gYXdhaXQgZGV0ZWN0U2VydmVyRXh0ZXJuYWxQYWNrYWdlKFxuICAgICAgICAgICAgcGFja2FnZU5hbWUsXG4gICAgICAgICAgICBwcm9jZXNzLmN3ZCgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZGV0ZWN0ZWQpIHtcbiAgICAgICAgICAgIGRldGVjdGVkV29ya2Zsb3dQYWNrYWdlcy5wdXNoKGRldGVjdGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IG9ubHkuIE5ldmVyIGJsb2NrIGNvbmZpZyBnZW5lcmF0aW9uLlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkZXRlY3RlZFdvcmtmbG93UGFja2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCByZW1vdmVkUGFja2FnZXMgPSBuZXcgU2V0KFxuICAgICAgICAgIGRldGVjdGVkV29ya2Zsb3dQYWNrYWdlcy5tYXAoKGRldGVjdGVkKSA9PiBkZXRlY3RlZC5wYWNrYWdlTmFtZSlcbiAgICAgICAgKTtcbiAgICAgICAgZWZmZWN0aXZlU2VydmVyRXh0ZXJuYWxQYWNrYWdlcyA9XG4gICAgICAgICAgY29uZmlndXJlZFNlcnZlckV4dGVybmFsUGFja2FnZXMuZmlsdGVyKFxuICAgICAgICAgICAgKHBhY2thZ2VOYW1lKSA9PiAhcmVtb3ZlZFBhY2thZ2VzLmhhcyhwYWNrYWdlTmFtZSlcbiAgICAgICAgICApO1xuICAgICAgICBuZXh0Q29uZmlnLnNlcnZlckV4dGVybmFsUGFja2FnZXMgPSBlZmZlY3RpdmVTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzO1xuICAgICAgICB3YXJuQWJvdXRBdXRvUmVtb3ZlZFNlcnZlckV4dGVybmFsUGFja2FnZXMoZGV0ZWN0ZWRXb3JrZmxvd1BhY2thZ2VzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25maWd1cmUgdGhlIGxvYWRlciBpZiB0dXJib3BhY2sgaXMgYmVpbmcgdXNlZFxuICAgIGlmICghbmV4dENvbmZpZy50dXJib3BhY2spIHtcbiAgICAgIG5leHRDb25maWcudHVyYm9wYWNrID0ge307XG4gICAgfVxuICAgIGlmICghbmV4dENvbmZpZy50dXJib3BhY2sucnVsZXMpIHtcbiAgICAgIG5leHRDb25maWcudHVyYm9wYWNrLnJ1bGVzID0ge307XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nUnVsZXMgPSBuZXh0Q29uZmlnLnR1cmJvcGFjay5ydWxlcyBhcyBhbnk7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgbmV4dFZlcnNpb24gPSByZXNvbHZlTmV4dFZlcnNpb24od29ya2luZ0Rpcik7XG4gICAgY29uc3QgY29uZmlndXJlZFByb2plY3RSb290ID1cbiAgICAgIG5leHRDb25maWcub3V0cHV0RmlsZVRyYWNpbmdSb290ID8/IG5leHRDb25maWcudHVyYm9wYWNrPy5yb290O1xuICAgIGNvbnN0IHByb2plY3RSb290ID0gY29uZmlndXJlZFByb2plY3RSb290XG4gICAgICA/IHJlc29sdmVDb25maWd1cmVkUHJvamVjdFJvb3Qod29ya2luZ0RpciwgY29uZmlndXJlZFByb2plY3RSb290KVxuICAgICAgOiByZXNvbHZlUHJvamVjdFJvb3Qod29ya2luZ0Rpcik7XG4gICAgY29uc3Qgc3VwcG9ydHNUdXJib0NvbmRpdGlvbiA9IHNlbXZlci5ndGUobmV4dFZlcnNpb24sICd2MTYuMC4wJyk7XG5cbiAgICBjb25zdCBzaG91bGRXYXRjaCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnO1xuICAgIGxldCB3b3JrZmxvd0J1aWxkZXJQcm9taXNlOiBQcm9taXNlPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGlzdERpciA9IG5leHRDb25maWcuZGlzdERpciB8fCAnLm5leHQnO1xuXG4gICAgbmV4dENvbmZpZy5jb21waWxlciA9IHtcbiAgICAgIC4uLmV4aXN0aW5nQ29tcGlsZXIsXG4gICAgICBydW5BZnRlclByb2R1Y3Rpb25Db21waWxlOiBhc3luYyAobWV0YWRhdGEpID0+IHtcbiAgICAgICAgaWYgKGV4aXN0aW5nUnVuQWZ0ZXJQcm9kdWN0aW9uQ29tcGlsZSkge1xuICAgICAgICAgIGF3YWl0IGV4aXN0aW5nUnVuQWZ0ZXJQcm9kdWN0aW9uQ29tcGlsZShtZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgY29weVdvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdChtZXRhZGF0YSk7XG4gICAgICAgIHJlZ2lzdGVyV29ya2Zsb3dEaWFnbm9zdGljc01hbmlmZXN0Q29weShtZXRhZGF0YSk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBnZXRXb3JrZmxvd0J1aWxkZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXdvcmtmbG93QnVpbGRlclByb21pc2UpIHtcbiAgICAgICAgd29ya2Zsb3dCdWlsZGVyUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgTmV4dEJ1aWxkZXIgPSBhd2FpdCBnZXROZXh0QnVpbGRlcihuZXh0VmVyc2lvbik7XG4gICAgICAgICAgcmV0dXJuIG5ldyBOZXh0QnVpbGRlcih7XG4gICAgICAgICAgICB3YXRjaDogc2hvdWxkV2F0Y2gsXG4gICAgICAgICAgICAvLyBnZXRJbnB1dEZpbGVzIGZpbHRlcnMgdGhlIHByb2plY3QgdG8gTmV4dC5qcyBlbnRyeXBvaW50c1xuICAgICAgICAgICAgZGlyczogWycuJ10sXG4gICAgICAgICAgICBwYWdlRXh0ZW5zaW9uczogbmV4dENvbmZpZy5wYWdlRXh0ZW5zaW9ucyA/PyBbXG4gICAgICAgICAgICAgICd0c3gnLFxuICAgICAgICAgICAgICAndHMnLFxuICAgICAgICAgICAgICAnanN4JyxcbiAgICAgICAgICAgICAgJ2pzJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBwcm9qZWN0Um9vdCxcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllclJvb3Q6IHdvcmtpbmdEaXIsXG4gICAgICAgICAgICB3b3JraW5nRGlyLFxuICAgICAgICAgICAgZGlzdERpcixcbiAgICAgICAgICAgIGJhc2VQYXRoOiB3b3JrZmxvd0Jhc2VQYXRoLFxuICAgICAgICAgICAgZGlhZ25vc3RpY3NEaXI6IGAke2Rpc3REaXJ9L2RpYWdub3N0aWNzYCxcbiAgICAgICAgICAgIGJ1aWxkVGFyZ2V0OiAnbmV4dCcsXG4gICAgICAgICAgICB3b3JrZmxvd3NCdW5kbGVQYXRoOiAnJywgLy8gbm90IHVzZWQgaW4gYmFzZVxuICAgICAgICAgICAgc3RlcHNCdW5kbGVQYXRoOiAnJywgLy8gbm90IHVzZWQgaW4gYmFzZVxuICAgICAgICAgICAgd2ViaG9va0J1bmRsZVBhdGg6ICcnLCAvLyBub2RlIHVzZWQgaW4gYmFzZVxuICAgICAgICAgICAgc291cmNlbWFwOiB3b3JrZmxvd3M/LnNvdXJjZW1hcCxcbiAgICAgICAgICAgIGV4dGVybmFsUGFja2FnZXM6IFtcbiAgICAgICAgICAgICAgLy8gc2VydmVyLW9ubHkgYW5kIGNsaWVudC1vbmx5IGFyZSBwc2V1ZG8tcGFja2FnZXMgaGFuZGxlZCBieSBOZXh0LmpzXG4gICAgICAgICAgICAgIC8vIGR1cmluZyBpdHMgYnVpbGQgcHJvY2Vzcy4gV2UgbWFyayB0aGVtIGFzIGV4dGVybmFsIHRvIHByZXZlbnQgZXNidWlsZFxuICAgICAgICAgICAgICAvLyBmcm9tIGZhaWxpbmcgd2hlbiBidW5kbGluZyBjb2RlIHRoYXQgaW1wb3J0cyB0aGVtLlxuICAgICAgICAgICAgICAvLyBTZWU6IGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwcC9nZXR0aW5nLXN0YXJ0ZWQvc2VydmVyLWFuZC1jbGllbnQtY29tcG9uZW50c1xuICAgICAgICAgICAgICAnc2VydmVyLW9ubHknLFxuICAgICAgICAgICAgICAnY2xpZW50LW9ubHknLFxuICAgICAgICAgICAgICAuLi5lZmZlY3RpdmVTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHdvcmtmbG93QnVpbGRlclByb21pc2U7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIFtcbiAgICAgICcqLnRzeCcsXG4gICAgICAnKi50cycsXG4gICAgICAnKi5qc3gnLFxuICAgICAgJyouanMnLFxuICAgICAgJyoubWpzJyxcbiAgICAgICcqLm10cycsXG4gICAgICAnKi5janMnLFxuICAgICAgJyouY3RzJyxcbiAgICBdKSB7XG4gICAgICBuZXh0Q29uZmlnLnR1cmJvcGFjay5ydWxlc1trZXldID0ge1xuICAgICAgICAuLi4oc3VwcG9ydHNUdXJib0NvbmRpdGlvblxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBjb25kaXRpb246IHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgJ2FsbCcgdG8gY29tYmluZTogbXVzdCBtYXRjaCBjb250ZW50IEFORCBtdXN0IE5PVCBiZSBpbiBnZW5lcmF0ZWQgcGF0aFxuICAgICAgICAgICAgICAgIC8vIE1lcmdlIHdpdGggYW55IGV4aXN0aW5nICdhbGwnIGNvbmRpdGlvbnMgZnJvbSB1c2VyIGNvbmZpZ1xuICAgICAgICAgICAgICAgIGFsbDogW1xuICAgICAgICAgICAgICAgICAgLi4uKGV4aXN0aW5nUnVsZXNba2V5XT8uY29uZGl0aW9uPy5hbGwgfHwgW10pLFxuICAgICAgICAgICAgICAgICAgLy8gRXhjbHVkZSBnZW5lcmF0ZWQgd29ya2Zsb3cgcm91dGUgZmlsZXMgZnJvbSB0cmFuc2Zvcm1hdGlvblxuICAgICAgICAgICAgICAgICAgeyBub3Q6IHsgcGF0aDogL1svXFxcXF1cXC53ZWxsLWtub3duWy9cXFxcXXdvcmtmbG93Wy9cXFxcXS8gfSB9LFxuICAgICAgICAgICAgICAgICAgLy8gTWF0Y2ggZmlsZXMgd2l0aCB3b3JrZmxvdyBkaXJlY3RpdmVzIG9yIGN1c3RvbSBzZXJpYWxpemF0aW9uIHBhdHRlcm5zXG4gICAgICAgICAgICAgICAgICAvLyBVc2VzIGJhY2tyZWZlcmVuY2VzIChcXDIsIFxcMykgdG8gZW5zdXJlIG1hdGNoaW5nIHF1b3RlIHR5cGVzXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6XG4gICAgICAgICAgICAgICAgICAgICAgLyh1c2Ugd29ya2Zsb3d8dXNlIHN0ZXB8ZnJvbVxccysoWydcIl0pQHdvcmtmbG93XFwvc2VyZGVcXDJ8U3ltYm9sXFwuZm9yXFxzKlxcKFxccyooWydcIl0pd29ya2Zsb3ctKD86c2VyaWFsaXplfGRlc2VyaWFsaXplKVxcM1xccypcXCkpLyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgbG9hZGVyczogWy4uLihleGlzdGluZ1J1bGVzW2tleV0/LmxvYWRlcnMgfHwgW10pLCBsb2FkZXJQYXRoXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gY29uZmlndXJlIHRoZSBsb2FkZXIgZm9yIHdlYnBhY2tcbiAgICBjb25zdCBleGlzdGluZ1dlYnBhY2tNb2RpZnkgPSBuZXh0Q29uZmlnLndlYnBhY2s7XG4gICAgbmV4dENvbmZpZy53ZWJwYWNrID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGNvbnN0IFt3ZWJwYWNrQ29uZmlnXSA9IGFyZ3M7XG4gICAgICBpZiAoIXdlYnBhY2tDb25maWcubW9kdWxlKSB7XG4gICAgICAgIHdlYnBhY2tDb25maWcubW9kdWxlID0ge307XG4gICAgICB9XG4gICAgICBpZiAoIXdlYnBhY2tDb25maWcubW9kdWxlLnJ1bGVzKSB7XG4gICAgICAgIHdlYnBhY2tDb25maWcubW9kdWxlLnJ1bGVzID0gW107XG4gICAgICB9XG4gICAgICAvLyBsb2FkZXJzIGluIHdlYnBhY2sgYXBwbHkgYm90dG9tLT51cCBzbyBlbnN1cmVcbiAgICAgIC8vIG91cnMgY29tZXMgYmVmb3JlIHRoZSBkZWZhdWx0IHN3YyB0cmFuc2Zvcm1cbiAgICAgIHdlYnBhY2tDb25maWcubW9kdWxlLnJ1bGVzLnB1c2goe1xuICAgICAgICB0ZXN0OiAvLipcXC4obWpzfGNqc3xjdHN8dHN8dHN4fGpzfGpzeCkkLyxcbiAgICAgICAgbG9hZGVyOiBsb2FkZXJQYXRoLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChhcmdzWzFdPy5pc1NlcnZlcikge1xuICAgICAgICBleHRlcm5hbGl6ZVdzTmF0aXZlQWNjZWxlcmF0b3JzKHdlYnBhY2tDb25maWcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhpc3RpbmdXZWJwYWNrTW9kaWZ5XG4gICAgICAgID8gKGV4aXN0aW5nV2VicGFja01vZGlmeSguLi5hcmdzKSA/PyB3ZWJwYWNrQ29uZmlnKVxuICAgICAgICA6IHdlYnBhY2tDb25maWc7XG4gICAgfTtcbiAgICAvLyBvbmx5IHJ1biB0aGlzIGluIHRoZSBtYWluIHByb2Nlc3Mgc28gaXQgb25seSBydW5zIG9uY2VcbiAgICAvLyBhcyBOZXh0LmpzIHVzZXMgY2hpbGQgcHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgYnVpbGRzXG4gICAgaWYgKFxuICAgICAgIXByb2Nlc3MuZW52LldPUktGTE9XX05FWFRfUFJJVkFURV9CVUlMVCAmJlxuICAgICAgcGhhc2UgIT09ICdwaGFzZS1wcm9kdWN0aW9uLXNlcnZlcidcbiAgICApIHtcbiAgICAgIGNvbnN0IHdvcmtmbG93QnVpbGRlciA9IGF3YWl0IGdldFdvcmtmbG93QnVpbGRlcigpO1xuXG4gICAgICBhd2FpdCB3b3JrZmxvd0J1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHByb2Nlc3MuZW52LldPUktGTE9XX05FWFRfUFJJVkFURV9CVUlMVCA9ICcxJztcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dENvbmZpZztcbiAgfTtcbn1cbiJdfQ==