@workflow/builders 5.0.0-beta.43 → 5.0.0-beta.46

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 (43) hide show
  1. package/README.md +1 -1
  2. package/dist/base-builder.d.ts +19 -2
  3. package/dist/base-builder.d.ts.map +1 -1
  4. package/dist/base-builder.js +77 -56
  5. package/dist/constants.d.ts +2 -2
  6. package/dist/constants.js +3 -3
  7. package/dist/fast-discovery.d.ts +1 -1
  8. package/dist/fast-discovery.js +1 -1
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -1
  12. package/dist/manifest-ids.d.ts +35 -0
  13. package/dist/manifest-ids.d.ts.map +1 -0
  14. package/dist/manifest-ids.js +69 -0
  15. package/dist/manifest-ids.test.d.ts +2 -0
  16. package/dist/manifest-ids.test.d.ts.map +1 -0
  17. package/dist/manifest-ids.test.js +86 -0
  18. package/dist/module-specifier.d.ts +1 -1
  19. package/dist/module-specifier.js +2 -2
  20. package/dist/node-module-esbuild-plugin.js +3 -3
  21. package/dist/optional-otel-api.d.ts +1 -1
  22. package/dist/optional-otel-api.js +2 -2
  23. package/dist/optional-typescript.js +2 -2
  24. package/dist/optional-ws-native.d.ts +1 -1
  25. package/dist/optional-ws-native.js +2 -2
  26. package/dist/step-source-registration.test.js +61 -1
  27. package/dist/swc-esbuild-plugin.d.ts +1 -1
  28. package/dist/swc-esbuild-plugin.d.ts.map +1 -1
  29. package/dist/swc-esbuild-plugin.js +14 -42
  30. package/dist/swc-esbuild-plugin.test.js +81 -1
  31. package/dist/types.d.ts +3 -3
  32. package/dist/types.js +1 -1
  33. package/dist/vercel-build-output-api.js +2 -2
  34. package/dist/workflow-bundle-boundary.test.d.ts +2 -0
  35. package/dist/workflow-bundle-boundary.test.d.ts.map +1 -0
  36. package/dist/workflow-bundle-boundary.test.js +78 -0
  37. package/dist/write-if-changed.d.ts +20 -0
  38. package/dist/write-if-changed.d.ts.map +1 -0
  39. package/dist/write-if-changed.js +44 -0
  40. package/dist/write-if-changed.test.d.ts +2 -0
  41. package/dist/write-if-changed.test.d.ts.map +1 -0
  42. package/dist/write-if-changed.test.js +186 -0
  43. package/package.json +4 -4
@@ -0,0 +1,69 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { WorkflowBuildError } from '@workflow/errors';
3
+ /**
4
+ * Hash source file contents for manifest-entry equivalence comparison.
5
+ */
6
+ export function hashManifestSource(source) {
7
+ return createHash('sha256').update(source).digest('hex');
8
+ }
9
+ function formatIdLocation(location) {
10
+ return `${location.filePath}#${location.name}`;
11
+ }
12
+ function assertUniqueManifestIds(entriesByFile, ids, getId, label, contentHash) {
13
+ for (const [filePath, entries] of Object.entries(entriesByFile || {})) {
14
+ for (const [name, data] of Object.entries(entries)) {
15
+ const id = getId(data);
16
+ const existing = ids.get(id);
17
+ const current = { filePath, name, contentHash };
18
+ if (existing &&
19
+ (existing.filePath !== current.filePath ||
20
+ existing.name !== current.name)) {
21
+ // Two *different* files generated the same ID. If both files have
22
+ // identical contents and the ID belongs to the same symbol, they are
23
+ // duplicate copies of the same logical module rather than a genuine
24
+ // collision. The main producer of such copies is pnpm, which
25
+ // materializes one package version once per peer-dependency
26
+ // resolution (node_modules/.pnpm/pkg@1.0.0_peer-a@.../ and
27
+ // .../pkg@1.0.0_peer-b@.../ hard-link the same store files), while
28
+ // the canonical ID intentionally describes the logical module
29
+ // (`name/subpath@version`) and ignores installation topology.
30
+ // Registering equivalent definitions is harmless — they run the same
31
+ // code under the same ID — so keep the first one and continue.
32
+ if (existing.name === current.name &&
33
+ existing.contentHash !== undefined &&
34
+ existing.contentHash === current.contentHash) {
35
+ continue;
36
+ }
37
+ const idName = label === 'step' ? 'workflow step ID' : 'workflow ID';
38
+ const functionName = `${label} function`;
39
+ const capitalizedLabel = label === 'step' ? 'Step' : 'Workflow';
40
+ throw new WorkflowBuildError(`Duplicate ${idName} "${id}" generated for ${formatIdLocation(existing)} and ${formatIdLocation(current)}.`, {
41
+ hint: `${capitalizedLabel} IDs must be unique across a build. ` +
42
+ `If you own one of the colliding files, rename the ${functionName} or export ` +
43
+ `the package file through a unique package subpath. If the collision is in a ` +
44
+ `transitive dependency you don't control, file an issue with the upstream ` +
45
+ `package or pin to a non-colliding version.`,
46
+ });
47
+ }
48
+ ids.set(id, current);
49
+ }
50
+ }
51
+ }
52
+ /**
53
+ * Merge one file's transform manifest into the build-wide manifest, failing
54
+ * the build on genuine duplicate step/workflow IDs while deduplicating
55
+ * equivalent copies of the same module (e.g. pnpm peer-dependency variants
56
+ * of one package version).
57
+ *
58
+ * @param contentHash - Fingerprint of the source file that produced
59
+ * `incoming` (see {@link hashManifestSource}). Callers merge one file's
60
+ * manifest at a time, so a single hash covers every incoming entry.
61
+ */
62
+ export function mergeWorkflowManifest(target, incoming, stepIds, workflowIds, contentHash) {
63
+ assertUniqueManifestIds(incoming.steps, stepIds, (data) => data.stepId, 'step', contentHash);
64
+ assertUniqueManifestIds(incoming.workflows, workflowIds, (data) => data.workflowId, 'workflow', contentHash);
65
+ target.workflows = Object.assign(target.workflows || {}, incoming.workflows);
66
+ target.steps = Object.assign(target.steps || {}, incoming.steps);
67
+ target.classes = Object.assign(target.classes || {}, incoming.classes);
68
+ }
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuaWZlc3QtaWRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21hbmlmZXN0LWlkcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBc0J0RDs7R0FFRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFjO0lBQy9DLE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsUUFBK0I7SUFDdkQsT0FBTyxHQUFHLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ2pELENBQUM7QUFFRCxTQUFTLHVCQUF1QixDQUM5QixhQUFpRSxFQUNqRSxHQUF1QyxFQUN2QyxLQUFnQyxFQUNoQyxLQUEwQixFQUMxQixXQUErQjtJQUUvQixLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUN0RSxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ25ELE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sT0FBTyxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUNoRCxJQUNFLFFBQVE7Z0JBQ1IsQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxRQUFRO29CQUNyQyxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDakMsQ0FBQztnQkFDRCxrRUFBa0U7Z0JBQ2xFLHFFQUFxRTtnQkFDckUsb0VBQW9FO2dCQUNwRSw2REFBNkQ7Z0JBQzdELDREQUE0RDtnQkFDNUQsMkRBQTJEO2dCQUMzRCxtRUFBbUU7Z0JBQ25FLDhEQUE4RDtnQkFDOUQsOERBQThEO2dCQUM5RCxxRUFBcUU7Z0JBQ3JFLCtEQUErRDtnQkFDL0QsSUFDRSxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJO29CQUM5QixRQUFRLENBQUMsV0FBVyxLQUFLLFNBQVM7b0JBQ2xDLFFBQVEsQ0FBQyxXQUFXLEtBQUssT0FBTyxDQUFDLFdBQVcsRUFDNUMsQ0FBQztvQkFDRCxTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsTUFBTSxNQUFNLEdBQUcsS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztnQkFDckUsTUFBTSxZQUFZLEdBQUcsR0FBRyxLQUFLLFdBQVcsQ0FBQztnQkFDekMsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztnQkFDaEUsTUFBTSxJQUFJLGtCQUFrQixDQUMxQixhQUFhLE1BQU0sS0FBSyxFQUFFLG1CQUFtQixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUMzRztvQkFDRSxJQUFJLEVBQ0YsR0FBRyxnQkFBZ0Isc0NBQXNDO3dCQUN6RCxxREFBcUQsWUFBWSxhQUFhO3dCQUM5RSw4RUFBOEU7d0JBQzlFLDJFQUEyRTt3QkFDM0UsNENBQTRDO2lCQUMvQyxDQUNGLENBQUM7WUFDSixDQUFDO1lBQ0QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxNQUF3QixFQUN4QixRQUEwQixFQUMxQixPQUEyQyxFQUMzQyxXQUErQyxFQUMvQyxXQUFvQjtJQUVwQix1QkFBdUIsQ0FDckIsUUFBUSxDQUFDLEtBQUssRUFDZCxPQUFPLEVBQ1AsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQ3JCLE1BQU0sRUFDTixXQUFXLENBQ1osQ0FBQztJQUNGLHVCQUF1QixDQUNyQixRQUFRLENBQUMsU0FBUyxFQUNsQixXQUFXLEVBQ1gsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQ3pCLFVBQVUsRUFDVixXQUFXLENBQ1osQ0FBQztJQUVGLE1BQU0sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0UsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRSxNQUFNLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgV29ya2Zsb3dCdWlsZEVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93TWFuaWZlc3QgfSBmcm9tICcuL2FwcGx5LXN3Yy10cmFuc2Zvcm0uanMnO1xuXG4vKipcbiAqIExvY2F0aW9uIChhbmQgaWRlbnRpdHkgZmluZ2VycHJpbnQpIG9mIGEgbWFuaWZlc3QgZW50cnkgdGhhdCBwcm9kdWNlZCBhXG4gKiB3b3JrZmxvdy9zdGVwIElEIGR1cmluZyBhIGJ1aWxkLiBTaGFyZWQgYnkgdGhlIGR1cGxpY2F0ZS1JRCBjaGVja3MgaW5cbiAqIGBzd2MtZXNidWlsZC1wbHVnaW4udHNgIChlc2J1aWxkIGJ1bmRsaW5nIHBhdGgpIGFuZCBgYmFzZS1idWlsZGVyLnRzYFxuICogKHNvdXJjZSByZWdpc3RyYXRpb24gcGF0aCkuXG4gKi9cbmV4cG9ydCB0eXBlIE1hbmlmZXN0RW50cnlMb2NhdGlvbiA9IHtcbiAgZmlsZVBhdGg6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogRmluZ2VycHJpbnQgKFNIQS0yNTYpIG9mIHRoZSBzb3VyY2UgZmlsZSBjb250ZW50cyB0aGF0IHByb2R1Y2VkIHRoaXNcbiAgICogZW50cnkuIFVzZWQgdG8gcmVjb2duaXplIGVxdWl2YWxlbnQgZHVwbGljYXRlIGNvcGllcyBvZiB0aGUgc2FtZSBtb2R1bGVcbiAgICogKHNlZSBgYXNzZXJ0VW5pcXVlTWFuaWZlc3RJZHNgKS4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgY2FsbGVyIGNhbm5vdFxuICAgKiBwcm92aWRlIHRoZSBzb3VyY2UgY29udGVudHMsIHdoaWNoIGRpc2FibGVzIGRlZHVwbGljYXRpb24gYW5kIHByZXNlcnZlc1xuICAgKiB0aGUgY29sbGlzaW9uIGVycm9yLlxuICAgKi9cbiAgY29udGVudEhhc2g/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIEhhc2ggc291cmNlIGZpbGUgY29udGVudHMgZm9yIG1hbmlmZXN0LWVudHJ5IGVxdWl2YWxlbmNlIGNvbXBhcmlzb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoTWFuaWZlc3RTb3VyY2Uoc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHNvdXJjZSkuZGlnZXN0KCdoZXgnKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0SWRMb2NhdGlvbihsb2NhdGlvbjogTWFuaWZlc3RFbnRyeUxvY2F0aW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2xvY2F0aW9uLmZpbGVQYXRofSMke2xvY2F0aW9uLm5hbWV9YDtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0VW5pcXVlTWFuaWZlc3RJZHM8VEVudHJ5PihcbiAgZW50cmllc0J5RmlsZTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgVEVudHJ5Pj4gfCB1bmRlZmluZWQsXG4gIGlkczogTWFwPHN0cmluZywgTWFuaWZlc3RFbnRyeUxvY2F0aW9uPixcbiAgZ2V0SWQ6IChlbnRyeTogVEVudHJ5KSA9PiBzdHJpbmcsXG4gIGxhYmVsOiAnc3RlcCcgfCAnd29ya2Zsb3cnLFxuICBjb250ZW50SGFzaDogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGVudHJpZXNdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXNCeUZpbGUgfHwge30pKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgZGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0SWQoZGF0YSk7XG4gICAgICBjb25zdCBleGlzdGluZyA9IGlkcy5nZXQoaWQpO1xuICAgICAgY29uc3QgY3VycmVudCA9IHsgZmlsZVBhdGgsIG5hbWUsIGNvbnRlbnRIYXNoIH07XG4gICAgICBpZiAoXG4gICAgICAgIGV4aXN0aW5nICYmXG4gICAgICAgIChleGlzdGluZy5maWxlUGF0aCAhPT0gY3VycmVudC5maWxlUGF0aCB8fFxuICAgICAgICAgIGV4aXN0aW5nLm5hbWUgIT09IGN1cnJlbnQubmFtZSlcbiAgICAgICkge1xuICAgICAgICAvLyBUd28gKmRpZmZlcmVudCogZmlsZXMgZ2VuZXJhdGVkIHRoZSBzYW1lIElELiBJZiBib3RoIGZpbGVzIGhhdmVcbiAgICAgICAgLy8gaWRlbnRpY2FsIGNvbnRlbnRzIGFuZCB0aGUgSUQgYmVsb25ncyB0byB0aGUgc2FtZSBzeW1ib2wsIHRoZXkgYXJlXG4gICAgICAgIC8vIGR1cGxpY2F0ZSBjb3BpZXMgb2YgdGhlIHNhbWUgbG9naWNhbCBtb2R1bGUgcmF0aGVyIHRoYW4gYSBnZW51aW5lXG4gICAgICAgIC8vIGNvbGxpc2lvbi4gVGhlIG1haW4gcHJvZHVjZXIgb2Ygc3VjaCBjb3BpZXMgaXMgcG5wbSwgd2hpY2hcbiAgICAgICAgLy8gbWF0ZXJpYWxpemVzIG9uZSBwYWNrYWdlIHZlcnNpb24gb25jZSBwZXIgcGVlci1kZXBlbmRlbmN5XG4gICAgICAgIC8vIHJlc29sdXRpb24gKG5vZGVfbW9kdWxlcy8ucG5wbS9wa2dAMS4wLjBfcGVlci1hQC4uLi8gYW5kXG4gICAgICAgIC8vIC4uLi9wa2dAMS4wLjBfcGVlci1iQC4uLi8gaGFyZC1saW5rIHRoZSBzYW1lIHN0b3JlIGZpbGVzKSwgd2hpbGVcbiAgICAgICAgLy8gdGhlIGNhbm9uaWNhbCBJRCBpbnRlbnRpb25hbGx5IGRlc2NyaWJlcyB0aGUgbG9naWNhbCBtb2R1bGVcbiAgICAgICAgLy8gKGBuYW1lL3N1YnBhdGhAdmVyc2lvbmApIGFuZCBpZ25vcmVzIGluc3RhbGxhdGlvbiB0b3BvbG9neS5cbiAgICAgICAgLy8gUmVnaXN0ZXJpbmcgZXF1aXZhbGVudCBkZWZpbml0aW9ucyBpcyBoYXJtbGVzcyDigJQgdGhleSBydW4gdGhlIHNhbWVcbiAgICAgICAgLy8gY29kZSB1bmRlciB0aGUgc2FtZSBJRCDigJQgc28ga2VlcCB0aGUgZmlyc3Qgb25lIGFuZCBjb250aW51ZS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGV4aXN0aW5nLm5hbWUgPT09IGN1cnJlbnQubmFtZSAmJlxuICAgICAgICAgIGV4aXN0aW5nLmNvbnRlbnRIYXNoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBleGlzdGluZy5jb250ZW50SGFzaCA9PT0gY3VycmVudC5jb250ZW50SGFzaFxuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpZE5hbWUgPSBsYWJlbCA9PT0gJ3N0ZXAnID8gJ3dvcmtmbG93IHN0ZXAgSUQnIDogJ3dvcmtmbG93IElEJztcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gYCR7bGFiZWx9IGZ1bmN0aW9uYDtcbiAgICAgICAgY29uc3QgY2FwaXRhbGl6ZWRMYWJlbCA9IGxhYmVsID09PSAnc3RlcCcgPyAnU3RlcCcgOiAnV29ya2Zsb3cnO1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dCdWlsZEVycm9yKFxuICAgICAgICAgIGBEdXBsaWNhdGUgJHtpZE5hbWV9IFwiJHtpZH1cIiBnZW5lcmF0ZWQgZm9yICR7Zm9ybWF0SWRMb2NhdGlvbihleGlzdGluZyl9IGFuZCAke2Zvcm1hdElkTG9jYXRpb24oY3VycmVudCl9LmAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDpcbiAgICAgICAgICAgICAgYCR7Y2FwaXRhbGl6ZWRMYWJlbH0gSURzIG11c3QgYmUgdW5pcXVlIGFjcm9zcyBhIGJ1aWxkLiBgICtcbiAgICAgICAgICAgICAgYElmIHlvdSBvd24gb25lIG9mIHRoZSBjb2xsaWRpbmcgZmlsZXMsIHJlbmFtZSB0aGUgJHtmdW5jdGlvbk5hbWV9IG9yIGV4cG9ydCBgICtcbiAgICAgICAgICAgICAgYHRoZSBwYWNrYWdlIGZpbGUgdGhyb3VnaCBhIHVuaXF1ZSBwYWNrYWdlIHN1YnBhdGguIElmIHRoZSBjb2xsaXNpb24gaXMgaW4gYSBgICtcbiAgICAgICAgICAgICAgYHRyYW5zaXRpdmUgZGVwZW5kZW5jeSB5b3UgZG9uJ3QgY29udHJvbCwgZmlsZSBhbiBpc3N1ZSB3aXRoIHRoZSB1cHN0cmVhbSBgICtcbiAgICAgICAgICAgICAgYHBhY2thZ2Ugb3IgcGluIHRvIGEgbm9uLWNvbGxpZGluZyB2ZXJzaW9uLmAsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWRzLnNldChpZCwgY3VycmVudCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTWVyZ2Ugb25lIGZpbGUncyB0cmFuc2Zvcm0gbWFuaWZlc3QgaW50byB0aGUgYnVpbGQtd2lkZSBtYW5pZmVzdCwgZmFpbGluZ1xuICogdGhlIGJ1aWxkIG9uIGdlbnVpbmUgZHVwbGljYXRlIHN0ZXAvd29ya2Zsb3cgSURzIHdoaWxlIGRlZHVwbGljYXRpbmdcbiAqIGVxdWl2YWxlbnQgY29waWVzIG9mIHRoZSBzYW1lIG1vZHVsZSAoZS5nLiBwbnBtIHBlZXItZGVwZW5kZW5jeSB2YXJpYW50c1xuICogb2Ygb25lIHBhY2thZ2UgdmVyc2lvbikuXG4gKlxuICogQHBhcmFtIGNvbnRlbnRIYXNoIC0gRmluZ2VycHJpbnQgb2YgdGhlIHNvdXJjZSBmaWxlIHRoYXQgcHJvZHVjZWRcbiAqIGBpbmNvbWluZ2AgKHNlZSB7QGxpbmsgaGFzaE1hbmlmZXN0U291cmNlfSkuIENhbGxlcnMgbWVyZ2Ugb25lIGZpbGUnc1xuICogbWFuaWZlc3QgYXQgYSB0aW1lLCBzbyBhIHNpbmdsZSBoYXNoIGNvdmVycyBldmVyeSBpbmNvbWluZyBlbnRyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlV29ya2Zsb3dNYW5pZmVzdChcbiAgdGFyZ2V0OiBXb3JrZmxvd01hbmlmZXN0LFxuICBpbmNvbWluZzogV29ya2Zsb3dNYW5pZmVzdCxcbiAgc3RlcElkczogTWFwPHN0cmluZywgTWFuaWZlc3RFbnRyeUxvY2F0aW9uPixcbiAgd29ya2Zsb3dJZHM6IE1hcDxzdHJpbmcsIE1hbmlmZXN0RW50cnlMb2NhdGlvbj4sXG4gIGNvbnRlbnRIYXNoPzogc3RyaW5nXG4pOiB2b2lkIHtcbiAgYXNzZXJ0VW5pcXVlTWFuaWZlc3RJZHMoXG4gICAgaW5jb21pbmcuc3RlcHMsXG4gICAgc3RlcElkcyxcbiAgICAoZGF0YSkgPT4gZGF0YS5zdGVwSWQsXG4gICAgJ3N0ZXAnLFxuICAgIGNvbnRlbnRIYXNoXG4gICk7XG4gIGFzc2VydFVuaXF1ZU1hbmlmZXN0SWRzKFxuICAgIGluY29taW5nLndvcmtmbG93cyxcbiAgICB3b3JrZmxvd0lkcyxcbiAgICAoZGF0YSkgPT4gZGF0YS53b3JrZmxvd0lkLFxuICAgICd3b3JrZmxvdycsXG4gICAgY29udGVudEhhc2hcbiAgKTtcblxuICB0YXJnZXQud29ya2Zsb3dzID0gT2JqZWN0LmFzc2lnbih0YXJnZXQud29ya2Zsb3dzIHx8IHt9LCBpbmNvbWluZy53b3JrZmxvd3MpO1xuICB0YXJnZXQuc3RlcHMgPSBPYmplY3QuYXNzaWduKHRhcmdldC5zdGVwcyB8fCB7fSwgaW5jb21pbmcuc3RlcHMpO1xuICB0YXJnZXQuY2xhc3NlcyA9IE9iamVjdC5hc3NpZ24odGFyZ2V0LmNsYXNzZXMgfHwge30sIGluY29taW5nLmNsYXNzZXMpO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=manifest-ids.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-ids.test.d.ts","sourceRoot":"","sources":["../src/manifest-ids.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { hashManifestSource, mergeWorkflowManifest, } from './manifest-ids.js';
3
+ function createMaps() {
4
+ return {
5
+ stepIds: new Map(),
6
+ workflowIds: new Map(),
7
+ };
8
+ }
9
+ function stepManifest(filePath, name, stepId) {
10
+ return {
11
+ steps: {
12
+ [filePath]: {
13
+ [name]: { stepId },
14
+ },
15
+ },
16
+ };
17
+ }
18
+ function workflowManifest(filePath, name, workflowId) {
19
+ return {
20
+ workflows: {
21
+ [filePath]: {
22
+ [name]: { workflowId },
23
+ },
24
+ },
25
+ };
26
+ }
27
+ const PEER_A_FILE = 'node_modules/.pnpm/pkg@1.0.0_peer-a@1.0.0/node_modules/pkg/dist/steps.js';
28
+ const PEER_B_FILE = 'node_modules/.pnpm/pkg@1.0.0_peer-b@2.0.0/node_modules/pkg/dist/steps.js';
29
+ const STEP_ID = 'step//pkg/steps@1.0.0//doWork';
30
+ const WORKFLOW_ID = 'workflow//pkg/steps@1.0.0//orchestrate';
31
+ describe('mergeWorkflowManifest duplicate ID handling', () => {
32
+ it('throws when two different files emit the same step ID with different contents', () => {
33
+ const { stepIds, workflowIds } = createMaps();
34
+ const target = {};
35
+ mergeWorkflowManifest(target, stepManifest(PEER_A_FILE, 'doWork', STEP_ID), stepIds, workflowIds, hashManifestSource('export const doWork = 1;'));
36
+ expect(() => mergeWorkflowManifest(target, stepManifest(PEER_B_FILE, 'doWork', STEP_ID), stepIds, workflowIds, hashManifestSource('export const doWork = 2;'))).toThrow(/Duplicate workflow step ID/);
37
+ });
38
+ it('deduplicates identical copies of the same module emitting the same step ID', () => {
39
+ const { stepIds, workflowIds } = createMaps();
40
+ const target = {};
41
+ const contentHash = hashManifestSource('export const doWork = 1;');
42
+ mergeWorkflowManifest(target, stepManifest(PEER_A_FILE, 'doWork', STEP_ID), stepIds, workflowIds, contentHash);
43
+ mergeWorkflowManifest(target, stepManifest(PEER_B_FILE, 'doWork', STEP_ID), stepIds, workflowIds, contentHash);
44
+ // The first registration wins in the ID map...
45
+ expect(stepIds.get(STEP_ID)?.filePath).toBe(PEER_A_FILE);
46
+ // ...but both file entries stay in the manifest (both copies register
47
+ // the same ID at runtime, which is harmless for identical code).
48
+ expect(Object.keys(target.steps ?? {})).toEqual([PEER_A_FILE, PEER_B_FILE]);
49
+ });
50
+ it('deduplicates identical copies emitting the same workflow ID', () => {
51
+ const { stepIds, workflowIds } = createMaps();
52
+ const target = {};
53
+ const contentHash = hashManifestSource('export const orchestrate = 1;');
54
+ mergeWorkflowManifest(target, workflowManifest(PEER_A_FILE, 'orchestrate', WORKFLOW_ID), stepIds, workflowIds, contentHash);
55
+ expect(() => mergeWorkflowManifest(target, workflowManifest(PEER_B_FILE, 'orchestrate', WORKFLOW_ID), stepIds, workflowIds, contentHash)).not.toThrow();
56
+ expect(workflowIds.get(WORKFLOW_ID)?.filePath).toBe(PEER_A_FILE);
57
+ });
58
+ it('throws when the same workflow ID comes from different contents', () => {
59
+ const { stepIds, workflowIds } = createMaps();
60
+ const target = {};
61
+ mergeWorkflowManifest(target, workflowManifest(PEER_A_FILE, 'orchestrate', WORKFLOW_ID), stepIds, workflowIds, hashManifestSource('a'));
62
+ expect(() => mergeWorkflowManifest(target, workflowManifest(PEER_B_FILE, 'orchestrate', WORKFLOW_ID), stepIds, workflowIds, hashManifestSource('b'))).toThrow(/Duplicate workflow ID/);
63
+ });
64
+ it('throws when content hashes are unavailable, even for equal names', () => {
65
+ const { stepIds, workflowIds } = createMaps();
66
+ const target = {};
67
+ mergeWorkflowManifest(target, stepManifest(PEER_A_FILE, 'doWork', STEP_ID), stepIds, workflowIds);
68
+ expect(() => mergeWorkflowManifest(target, stepManifest(PEER_B_FILE, 'doWork', STEP_ID), stepIds, workflowIds)).toThrow(/Duplicate workflow step ID/);
69
+ });
70
+ it('throws when identical contents map the same ID to different symbol names', () => {
71
+ const { stepIds, workflowIds } = createMaps();
72
+ const target = {};
73
+ const contentHash = hashManifestSource('shared');
74
+ mergeWorkflowManifest(target, stepManifest(PEER_A_FILE, 'doWork', STEP_ID), stepIds, workflowIds, contentHash);
75
+ expect(() => mergeWorkflowManifest(target, stepManifest(PEER_B_FILE, 'doOtherWork', STEP_ID), stepIds, workflowIds, contentHash)).toThrow(/Duplicate workflow step ID/);
76
+ });
77
+ it('allows re-merging the same file without error', () => {
78
+ const { stepIds, workflowIds } = createMaps();
79
+ const target = {};
80
+ const manifest = stepManifest(PEER_A_FILE, 'doWork', STEP_ID);
81
+ const contentHash = hashManifestSource('export const doWork = 1;');
82
+ mergeWorkflowManifest(target, manifest, stepIds, workflowIds, contentHash);
83
+ expect(() => mergeWorkflowManifest(target, manifest, stepIds, workflowIds, contentHash)).not.toThrow();
84
+ });
85
+ });
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuaWZlc3QtaWRzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbWFuaWZlc3QtaWRzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBRTlDLE9BQU8sRUFDTCxrQkFBa0IsRUFFbEIscUJBQXFCLEdBQ3RCLE1BQU0sbUJBQW1CLENBQUM7QUFFM0IsU0FBUyxVQUFVO0lBQ2pCLE9BQU87UUFDTCxPQUFPLEVBQUUsSUFBSSxHQUFHLEVBQWlDO1FBQ2pELFdBQVcsRUFBRSxJQUFJLEdBQUcsRUFBaUM7S0FDdEQsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxRQUFnQixFQUFFLElBQVksRUFBRSxNQUFjO0lBQ2xFLE9BQU87UUFDTCxLQUFLLEVBQUU7WUFDTCxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUNWLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUU7YUFDbkI7U0FDRjtLQUN5QixDQUFDO0FBQy9CLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLFFBQWdCLEVBQUUsSUFBWSxFQUFFLFVBQWtCO0lBQzFFLE9BQU87UUFDTCxTQUFTLEVBQUU7WUFDVCxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUNWLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUU7YUFDdkI7U0FDRjtLQUN5QixDQUFDO0FBQy9CLENBQUM7QUFFRCxNQUFNLFdBQVcsR0FDZiwwRUFBMEUsQ0FBQztBQUM3RSxNQUFNLFdBQVcsR0FDZiwwRUFBMEUsQ0FBQztBQUM3RSxNQUFNLE9BQU8sR0FBRywrQkFBK0IsQ0FBQztBQUNoRCxNQUFNLFdBQVcsR0FBRyx3Q0FBd0MsQ0FBQztBQUU3RCxRQUFRLENBQUMsNkNBQTZDLEVBQUUsR0FBRyxFQUFFO0lBQzNELEVBQUUsQ0FBQywrRUFBK0UsRUFBRSxHQUFH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RWpELHFCQUFxQixDQUNuQixNQUFNLEVBQ04sWUFBWSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQzVDLE9BQU8sRUFDUCxXQUFXLEVBQ1gsV0FBVyxDQUNaLENBQUM7UUFDRixNQUFNLENBQUMsR0FBRyxFQUFFLENBQ1YscUJBQXFCLENBQ25CLE1BQU0sRUFDTixZQUFZLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsRUFDakQsT0FBTyxFQUNQLFdBQVcsRUFDWCxXQUFXLENBQ1osQ0FDRixDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQzFDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLCtDQUErQyxFQUFFLEdBQUcsRUFBRTtRQUN2RCxNQUFNLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzlDLE1BQU0sTUFBTSxHQUFxQixFQUFFLENBQUM7UUFDcEMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUQsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUVuRSxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDM0UsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUNWLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FDM0UsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBleHBlY3QsIGl0IH0gZnJvbSAndml0ZXN0JztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dNYW5pZmVzdCB9IGZyb20gJy4vYXBwbHktc3djLXRyYW5zZm9ybS5qcyc7XG5pbXBvcnQge1xuICBoYXNoTWFuaWZlc3RTb3VyY2UsXG4gIHR5cGUgTWFuaWZlc3RFbnRyeUxvY2F0aW9uLFxuICBtZXJnZVdvcmtmbG93TWFuaWZlc3QsXG59IGZyb20gJy4vbWFuaWZlc3QtaWRzLmpzJztcblxuZnVuY3Rpb24gY3JlYXRlTWFwcygpIHtcbiAgcmV0dXJuIHtcbiAgICBzdGVwSWRzOiBuZXcgTWFwPHN0cmluZywgTWFuaWZlc3RFbnRyeUxvY2F0aW9uPigpLFxuICAgIHdvcmtmbG93SWRzOiBuZXcgTWFwPHN0cmluZywgTWFuaWZlc3RFbnRyeUxvY2F0aW9uPigpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBzdGVwTWFuaWZlc3QoZmlsZVBhdGg6IHN0cmluZywgbmFtZTogc3RyaW5nLCBzdGVwSWQ6IHN0cmluZykge1xuICByZXR1cm4ge1xuICAgIHN0ZXBzOiB7XG4gICAgICBbZmlsZVBhdGhdOiB7XG4gICAgICAgIFtuYW1lXTogeyBzdGVwSWQgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSBzYXRpc2ZpZXMgV29ya2Zsb3dNYW5pZmVzdDtcbn1cblxuZnVuY3Rpb24gd29ya2Zsb3dNYW5pZmVzdChmaWxlUGF0aDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHdvcmtmbG93SWQ6IHN0cmluZykge1xuICByZXR1cm4ge1xuICAgIHdvcmtmbG93czoge1xuICAgICAgW2ZpbGVQYXRoXToge1xuICAgICAgICBbbmFtZV06IHsgd29ya2Zsb3dJZCB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9IHNhdGlzZmllcyBXb3JrZmxvd01hbmlmZXN0O1xufVxuXG5jb25zdCBQRUVSX0FfRklMRSA9XG4gICdub2RlX21vZHVsZXMvLnBucG0vcGtnQDEuMC4wX3BlZXItYUAxLjAuMC9ub2RlX21vZHVsZXMvcGtnL2Rpc3Qvc3RlcHMuanMnO1xuY29uc3QgUEVFUl9CX0ZJTEUgPVxuICAnbm9kZV9tb2R1bGVzLy5wbnBtL3BrZ0AxLjAuMF9wZWVyLWJAMi4wLjAvbm9kZV9tb2R1bGVzL3BrZy9kaXN0L3N0ZXBzLmpzJztcbmNvbnN0IFNURVBfSUQgPSAnc3RlcC8vcGtnL3N0ZXBzQDEuMC4wLy9kb1dvcmsnO1xuY29uc3QgV09SS0ZMT1dfSUQgPSAnd29ya2Zsb3cvL3BrZy9zdGVwc0AxLjAuMC8vb3JjaGVzdHJhdGUnO1xuXG5kZXNjcmliZSgnbWVyZ2VXb3JrZmxvd01hbmlmZXN0IGR1cGxpY2F0ZSBJRCBoYW5kbGluZycsICgpID0+IHtcbiAgaXQoJ3Rocm93cyB3aGVuIHR3byBkaWZmZXJlbnQgZmlsZXMgZW1pdCB0aGUgc2FtZSBzdGVwIElEIHdpdGggZGlmZmVyZW50IGNvbnRlbnRzJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RlcElkcywgd29ya2Zsb3dJZHMgfSA9IGNyZWF0ZU1hcHMoKTtcbiAgICBjb25zdCB0YXJnZXQ6IFdvcmtmbG93TWFuaWZlc3QgPSB7fTtcblxuICAgIG1lcmdlV29ya2Zsb3dNYW5pZmVzdChcbiAgICAgIHRhcmdldCxcbiAgICAgIHN0ZXBNYW5pZmVzdChQRUVSX0FfRklMRSwgJ2RvV29yaycsIFNURVBfSUQpLFxuICAgICAgc3RlcElkcyxcbiAgICAgIHdvcmtmbG93SWRzLFxuICAgICAgaGFzaE1hbmlmZXN0U291cmNlKCdleHBvcnQgY29uc3QgZG9Xb3JrID0gMTsnKVxuICAgICk7XG5cbiAgICBleHBlY3QoKCkgPT5cbiAgICAgIG1lcmdlV29ya2Zsb3dNYW5pZmVzdChcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBzdGVwTWFuaWZlc3QoUEVFUl9CX0ZJTEUsICdkb1dvcmsnLCBTVEVQX0lEKSxcbiAgICAgICAgc3RlcElkcyxcbiAgICAgICAgd29ya2Zsb3dJZHMsXG4gICAgICAgIGhhc2hNYW5pZmVzdFNvdXJjZSgnZXhwb3J0IGNvbnN0IGRvV29yayA9IDI7JylcbiAgICAgIClcbiAgICApLnRvVGhyb3coL0R1cGxpY2F0ZSB3b3JrZmxvdyBzdGVwIElELyk7XG4gIH0pO1xuXG4gIGl0KCdkZWR1cGxpY2F0ZXMgaWRlbnRpY2FsIGNvcGllcyBvZiB0aGUgc2FtZSBtb2R1bGUgZW1pdHRpbmcgdGhlIHNhbWUgc3RlcCBJRCcsICgpID0+IHtcbiAgICBjb25zdCB7IHN0ZXBJZHMsIHdvcmtmbG93SWRzIH0gPSBjcmVhdGVNYXBzKCk7XG4gICAgY29uc3QgdGFyZ2V0OiBXb3JrZmxvd01hbmlmZXN0ID0ge307XG4gICAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoTWFuaWZlc3RTb3VyY2UoJ2V4cG9ydCBjb25zdCBkb1dvcmsgPSAxOycpO1xuXG4gICAgbWVyZ2VXb3JrZmxvd01hbmlmZXN0KFxuICAgICAgdGFyZ2V0LFxuICAgICAgc3RlcE1hbmlmZXN0KFBFRVJfQV9GSUxFLCAnZG9Xb3JrJywgU1RFUF9JRCksXG4gICAgICBzdGVwSWRzLFxuICAgICAgd29ya2Zsb3dJZHMsXG4gICAgICBjb250ZW50SGFzaFxuICAgICk7XG4gICAgbWVyZ2VXb3JrZmxvd01hbmlmZXN0KFxuICAgICAgdGFyZ2V0LFxuICAgICAgc3RlcE1hbmlmZXN0KFBFRVJfQl9GSUxFLCAnZG9Xb3JrJywgU1RFUF9JRCksXG4gICAgICBzdGVwSWRzLFxuICAgICAgd29ya2Zsb3dJZHMsXG4gICAgICBjb250ZW50SGFzaFxuICAgICk7XG5cbiAgICAvLyBUaGUgZmlyc3QgcmVnaXN0cmF0aW9uIHdpbnMgaW4gdGhlIElEIG1hcC4uLlxuICAgIGV4cGVjdChzdGVwSWRzLmdldChTVEVQX0lEKT8uZmlsZVBhdGgpLnRvQmUoUEVFUl9BX0ZJTEUpO1xuICAgIC8vIC4uLmJ1dCBib3RoIGZpbGUgZW50cmllcyBzdGF5IGluIHRoZSBtYW5pZmVzdCAoYm90aCBjb3BpZXMgcmVnaXN0ZXJcbiAgICAvLyB0aGUgc2FtZSBJRCBhdCBydW50aW1lLCB3aGljaCBpcyBoYXJtbGVzcyBmb3IgaWRlbnRpY2FsIGNvZGUpLlxuICAgIGV4cGVjdChPYmplY3Qua2V5cyh0YXJnZXQuc3RlcHMgPz8ge30pKS50b0VxdWFsKFtQRUVSX0FfRklMRSwgUEVFUl9CX0ZJTEVdKTtcbiAgfSk7XG5cbiAgaXQoJ2RlZHVwbGljYXRlcyBpZGVudGljYWwgY29waWVzIGVtaXR0aW5nIHRoZSBzYW1lIHdvcmtmbG93IElEJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RlcElkcywgd29ya2Zsb3dJZHMgfSA9IGNyZWF0ZU1hcHMoKTtcbiAgICBjb25zdCB0YXJnZXQ6IFdvcmtmbG93TWFuaWZlc3QgPSB7fTtcbiAgICBjb25zdCBjb250ZW50SGFzaCA9IGhhc2hNYW5pZmVzdFNvdXJjZSgnZXhwb3J0IGNvbnN0IG9yY2hlc3RyYXRlID0gMTsnKTtcblxuICAgIG1lcmdlV29ya2Zsb3dNYW5pZmVzdChcbiAgICAgIHRhcmdldCxcbiAgICAgIHdvcmtmbG93TWFuaWZlc3QoUEVFUl9BX0ZJTEUsICdvcmNoZXN0cmF0ZScsIFdPUktGTE9XX0lEKSxcbiAgICAgIHN0ZXBJZHMsXG4gICAgICB3b3JrZmxvd0lkcyxcbiAgICAgIGNvbnRlbnRIYXNoXG4gICAgKTtcbiAgICBleHBlY3QoKCkgPT5cbiAgICAgIG1lcmdlV29ya2Zsb3dNYW5pZmVzdChcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0KFBFRVJfQl9GSUxFLCAnb3JjaGVzdHJhdGUnLCBXT1JLRkxPV19JRCksXG4gICAgICAgIHN0ZXBJZHMsXG4gICAgICAgIHdvcmtmbG93SWRzLFxuICAgICAgICBjb250ZW50SGFzaFxuICAgICAgKVxuICAgICkubm90LnRvVGhyb3coKTtcbiAgICBleHBlY3Qod29ya2Zsb3dJZHMuZ2V0KFdPUktGTE9XX0lEKT8uZmlsZVBhdGgpLnRvQmUoUEVFUl9BX0ZJTEUpO1xuICB9KTtcblxuICBpdCgndGhyb3dzIHdoZW4gdGhlIHNhbWUgd29ya2Zsb3cgSUQgY29tZXMgZnJvbSBkaWZmZXJlbnQgY29udGVudHMnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGVwSWRzLCB3b3JrZmxvd0lkcyB9ID0gY3JlYXRlTWFwcygpO1xuICAgIGNvbnN0IHRhcmdldDogV29ya2Zsb3dNYW5pZmVzdCA9IHt9O1xuXG4gICAgbWVyZ2VXb3JrZmxvd01hbmlmZXN0KFxuICAgICAgdGFyZ2V0LFxuICAgICAgd29ya2Zsb3dNYW5pZmVzdChQRUVSX0FfRklMRSwgJ29yY2hlc3RyYXRlJywgV09SS0ZMT1dfSUQpLFxuICAgICAgc3RlcElkcyxcbiAgICAgIHdvcmtmbG93SWRzLFxuICAgICAgaGFzaE1hbmlmZXN0U291cmNlKCdhJylcbiAgICApO1xuICAgIGV4cGVjdCgoKSA9PlxuICAgICAgbWVyZ2VXb3JrZmxvd01hbmlmZXN0KFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHdvcmtmbG93TWFuaWZlc3QoUEVFUl9CX0ZJTEUsICdvcmNoZXN0cmF0ZScsIFdPUktGTE9XX0lEKSxcbiAgICAgICAgc3RlcElkcyxcbiAgICAgICAgd29ya2Zsb3dJZHMsXG4gICAgICAgIGhhc2hNYW5pZmVzdFNvdXJjZSgnYicpXG4gICAgICApXG4gICAgKS50b1Rocm93KC9EdXBsaWNhdGUgd29ya2Zsb3cgSUQvKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyB3aGVuIGNvbnRlbnQgaGFzaGVzIGFyZSB1bmF2YWlsYWJsZSwgZXZlbiBmb3IgZXF1YWwgbmFtZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgeyBzdGVwSWRzLCB3b3JrZmxvd0lkcyB9ID0gY3JlYXRlTWFwcygpO1xuICAgIGNvbnN0IHRhcmdldDogV29ya2Zsb3dNYW5pZmVzdCA9IHt9O1xuXG4gICAgbWVyZ2VXb3JrZmxvd01hbmlmZXN0KFxuICAgICAgdGFyZ2V0LFxuICAgICAgc3RlcE1hbmlmZXN0KFBFRVJfQV9GSUxFLCAnZG9Xb3JrJywgU1RFUF9JRCksXG4gICAgICBzdGVwSWRzLFxuICAgICAgd29ya2Zsb3dJZHNcbiAgICApO1xuICAgIGV4cGVjdCgoKSA9PlxuICAgICAgbWVyZ2VXb3JrZmxvd01hbmlmZXN0KFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHN0ZXBNYW5pZmVzdChQRUVSX0JfRklMRSwgJ2RvV29yaycsIFNURVBfSUQpLFxuICAgICAgICBzdGVwSWRzLFxuICAgICAgICB3b3JrZmxvd0lkc1xuICAgICAgKVxuICAgICkudG9UaHJvdygvRHVwbGljYXRlIHdvcmtmbG93IHN0ZXAgSUQvKTtcbiAgfSk7XG5cbiAgaXQoJ3Rocm93cyB3aGVuIGlkZW50aWNhbCBjb250ZW50cyBtYXAgdGhlIHNhbWUgSUQgdG8gZGlmZmVyZW50IHN5bWJvbCBuYW1lcycsICgpID0+IHtcbiAgICBjb25zdCB7IHN0ZXBJZHMsIHdvcmtmbG93SWRzIH0gPSBjcmVhdGVNYXBzKCk7XG4gICAgY29uc3QgdGFyZ2V0OiBXb3JrZmxvd01hbmlmZXN0ID0ge307XG4gICAgY29uc3QgY29udGVudEhhc2ggPSBoYXNoTWFuaWZlc3RTb3VyY2UoJ3NoYXJlZCcpO1xuXG4gICAgbWVyZ2VXb3JrZmxvd01hbmlmZXN0KFxuICAgICAgdGFyZ2V0LFxuICAgICAgc3RlcE1hbmlmZXN0KFBFRVJfQV9GSUxFLCAnZG9Xb3JrJywgU1RFUF9JRCksXG4gICAgICBzdGVwSWRzLFxuICAgICAgd29ya2Zsb3dJZHMsXG4gICAgICBjb250ZW50SGFzaFxuICAgICk7XG4gICAgZXhwZWN0KCgpID0+XG4gICAgICBtZXJnZVdvcmtmbG93TWFuaWZlc3QoXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgc3RlcE1hbmlmZXN0KFBFRVJfQl9GSUxFLCAnZG9PdGhlcldvcmsnLCBTVEVQX0lEKSxcbiAgICAgICAgc3RlcElkcyxcbiAgICAgICAgd29ya2Zsb3dJZHMsXG4gICAgICAgIGNvbnRlbnRIYXNoXG4gICAgICApXG4gICAgKS50b1Rocm93KC9EdXBsaWNhdGUgd29ya2Zsb3cgc3RlcCBJRC8pO1xuICB9KTtcblxuICBpdCgnYWxsb3dzIHJlLW1lcmdpbmcgdGhlIHNhbWUgZmlsZSB3aXRob3V0IGVycm9yJywgKCkgPT4ge1xuICAgIGNvbnN0IHsgc3RlcElkcywgd29ya2Zsb3dJZHMgfSA9IGNyZWF0ZU1hcHMoKTtcbiAgICBjb25zdCB0YXJnZXQ6IFdvcmtmbG93TWFuaWZlc3QgPSB7fTtcbiAgICBjb25zdCBtYW5pZmVzdCA9IHN0ZXBNYW5pZmVzdChQRUVSX0FfRklMRSwgJ2RvV29yaycsIFNURVBfSUQpO1xuICAgIGNvbnN0IGNvbnRlbnRIYXNoID0gaGFzaE1hbmlmZXN0U291cmNlKCdleHBvcnQgY29uc3QgZG9Xb3JrID0gMTsnKTtcblxuICAgIG1lcmdlV29ya2Zsb3dNYW5pZmVzdCh0YXJnZXQsIG1hbmlmZXN0LCBzdGVwSWRzLCB3b3JrZmxvd0lkcywgY29udGVudEhhc2gpO1xuICAgIGV4cGVjdCgoKSA9PlxuICAgICAgbWVyZ2VXb3JrZmxvd01hbmlmZXN0KHRhcmdldCwgbWFuaWZlc3QsIHN0ZXBJZHMsIHdvcmtmbG93SWRzLCBjb250ZW50SGFzaClcbiAgICApLm5vdC50b1Rocm93KCk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -52,7 +52,7 @@ export declare function resolveModuleSpecifier(filePath: string, projectRoot: st
52
52
  * `@workflow/ai/agent@5.0.0-beta.5` as the same logical module).
53
53
  *
54
54
  * Colocated with `resolveModuleSpecifier` so the construction and parsing
55
- * stay in sync see the `${pkg.name}${subpath}@${pkg.version}` and
55
+ * stay in sync; see the `${pkg.name}${subpath}@${pkg.version}` and
56
56
  * `${pkg.name}@${pkg.version}` paths above.
57
57
  */
58
58
  export declare function stripPackageVersion(specifier: string): string;
@@ -329,7 +329,7 @@ export function resolveModuleSpecifier(filePath, projectRoot) {
329
329
  * `@workflow/ai/agent@5.0.0-beta.5` as the same logical module).
330
330
  *
331
331
  * Colocated with `resolveModuleSpecifier` so the construction and parsing
332
- * stay in sync see the `${pkg.name}${subpath}@${pkg.version}` and
332
+ * stay in sync; see the `${pkg.name}${subpath}@${pkg.version}` and
333
333
  * `${pkg.name}@${pkg.version}` paths above.
334
334
  */
335
335
  export function stripPackageVersion(specifier) {
@@ -520,4 +520,4 @@ export function getImportPath(filePath, projectRoot) {
520
520
  isPackage: false,
521
521
  };
522
522
  }
523
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLXNwZWNpZmllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tb2R1bGUtc3BlY2lmaWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBMkJsRTs7O0dBR0c7QUFDSCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO0FBRS9EOzs7R0FHRztBQUNILFNBQVMsZUFBZSxDQUFDLFFBQWdCO0lBQ3ZDLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUU1QixnRUFBZ0U7SUFDaEUsTUFBTSxXQUFXLEdBQWEsRUFBRSxDQUFDO0lBRWpDLG1EQUFtRDtJQUNuRCxPQUFPLEdBQUcsS0FBSyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QixvQkFBb0I7UUFDcEIsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLG1FQUFtRTtZQUNuRSxLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNyQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzNDLENBQUM7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV0QixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2xELElBQUksVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFD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QUF1RTtZQUN2RSw2QkFBNkI7WUFDN0Isc0VBQXNFO1lBQ3RFLGlFQUFpRTtZQUNqRSwwQkFBMEI7WUFDMUIsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osT0FBTztvQkFDTCxVQUFVLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLE9BQU8sRUFBRTtvQkFDbkMsU0FBUyxFQUFFLElBQUk7aUJBQ2hCLENBQUM7WUFDSixDQUFDO1lBRUQsa0VBQWtFO1lBQ2xFLHNFQUFzRTtZQUN0RSxnRUFBZ0U7WUFDaEUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxPQUFPO29CQUNMLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDO29CQUN2RCxTQUFTLEVBQUUsS0FBSztpQkFDakIsQ0FBQztZQUNKLENBQUM7WUFFRCxPQUFPO2dCQUNMLFVBQVUsRUFBRSxHQUFHLENBQUMsSUFBSTtnQkFDcEIsU0FBUyxFQUFFLElBQUk7YUFDaEIsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQscUNBQXFDO0lBQ3JDLE9BQU87UUFDTCxVQUFVLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQztRQUN2RCxTQUFTLEVBQUUsS0FBSztLQUNqQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVsYXRpdmUsIHJlc29sdmUsIHNlcCB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbi8qKlxuICogUmVzdWx0IG9mIHJlc29sdmluZyBhIG1vZHVsZSBzcGVjaWZpZXIgZm9yIGEgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVTcGVjaWZpZXJSZXN1bHQge1xuICAvKipcbiAgICogVGhlIG1vZHVsZSBzcGVjaWZpZXIgdG8gdXNlIGZvciBJRCBnZW5lcmF0aW9uLlxuICAgKiAtIEZvciBwYWNrYWdlczogXCJ7bmFtZX1Ae3ZlcnNpb259XCIgb3IgXCJ7bmFtZX0ve3N1YnBhdGh9QHt2ZXJzaW9ufVwiXG4gICAqICAgKGUuZy4sIFwicG9pbnRAMS4wLjBcIiwgXCJAbXlvcmcvc2hhcmVkQDIuMC4wXCIsIFwid29ya2Zsb3cvaW50ZXJuYWwvYnVpbHRpbnNANC4wLjBcIilcbiAgICogLSBGb3IgbG9jYWwgZmlsZXM6IHVuZGVmaW5lZCAocGx1Z2luIHdpbGwgdXNlIGRlZmF1bHQgXCIuL3JlbGF0aXZlL3BhdGhcIiBmb3JtYXQpXG4gICAqL1xuICBtb2R1bGVTcGVjaWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQYXJzZWQgcGFja2FnZS5qc29uIGRhdGEgd2l0aCBkaXJlY3RvcnkgaW5mb3JtYXRpb24uXG4gKi9cbmludGVyZmFjZSBQYWNrYWdlSW5mbyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBkaXI6IHN0cmluZztcbiAgZXhwb3J0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBtYWluPzogc3RyaW5nO1xuICBtb2R1bGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ2FjaGUgZm9yIHBhY2thZ2UuanNvbiBsb29rdXBzIHRvIGF2b2lkIHJlcGVhdGVkIGZpbGVzeXN0ZW0gcmVhZHMuXG4gKiBNYXBzIGRpcmVjdG9yeSBwYXRoIHRvIHBhcnNlZCBwYWNrYWdlLmpzb24gaW5mbyBvciBudWxsIGlmIG5vdCBmb3VuZC5cbiAqL1xuY29uc3QgcGFja2FnZUpzb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQYWNrYWdlSW5mbyB8IG51bGw+KCk7XG5cbi8qKlxuICogRmluZCBhbmQgcmVhZCB0aGUgbmVhcmVzdCBwYWNrYWdlLmpzb24gZm9yIGEgZ2l2ZW4gZmlsZSBwYXRoLlxuICogUmVzdWx0cyBhcmUgY2FjaGVkIGZvciBwZXJmb3JtYW5jZS5cbiAqL1xuZnVuY3Rpb24gZmluZFBhY2thZ2VKc29uKGZpbGVQYXRoOiBzdHJpbmcpOiBQYWNrYWdlSW5mbyB8IG51bGwge1xuICBsZXQgZGlyID0gZGlybmFtZShmaWxlUGF0aCk7XG5cbiAgLy8gVHJhY2sgZGlyZWN0b3JpZXMgd2UndmUgdmlzaXRlZCBzbyB3ZSBjYW4gYmFjay1maWxsIHRoZSBjYWNoZVxuICBjb25zdCB2aXNpdGVkRGlyczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBXYWxrIHVwIHRoZSBkaXJlY3RvcnkgdHJlZSB1bnRpbCB3ZSBoaXQgdGhlIHJvb3RcbiAgd2hpbGUgKGRpciAhPT0gZGlybmFtZShkaXIpKSB7XG4gICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3RcbiAgICBjb25zdCBjYWNoZWQgPSBwYWNrYWdlSnNvbkNhY2hlLmdldChkaXIpO1xuICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQmFjay1maWxsIGNhY2hlIGZvciBhbGwgdmlzaXRlZCBkaXJlY3RvcmllcyB3aXRoIHRoZSBzYW1lIHJlc3VsdFxuICAgICAgZm9yIChjb25zdCB2aXNpdGVkRGlyIG9mIHZpc2l0ZWREaXJzKSB7XG4gICAgICAgIHBhY2thZ2VKc29uQ2FjaGUuc2V0KHZpc2l0ZWREaXIsIGNhY2hlZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIHZpc2l0ZWREaXJzLnB1c2goZGlyKTtcblxuICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGpvaW4oZGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGYtOCcpO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgICAgICBpZiAocGFyc2VkLm5hbWUgJiYgcGFyc2VkLnZlcnNpb24pIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQ6IFBhY2thZ2VJbmZvID0ge1xuICAgICAgICAgICAgbmFtZTogcGFyc2VkLm5hbWUsXG4gICAgICAgICAgICB2ZXJzaW9uOiBwYXJzZWQudmVyc2lvbixcbiAgICAgICAgICAgIGRpcixcbiAgICAgICAgICAgIGV4cG9ydHM6IHBhcnNlZC5leHBvcnRzLFxuICAgICAgICAgICAgbWFpbjogcGFyc2VkLm1haW4sXG4gICAgICAgICAgICBtb2R1bGU6IHBhcnNlZC5tb2R1bGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBDYWNoZSB0aGUgcmVzdWx0IGZvciB0aGlzIGRpcmVjdG9yeSBhbmQgYWxsIHZpc2l0ZWQgZGlyZWN0b3JpZXNcbiAgICAgICAgICBwYWNrYWdlSnNvbkNhY2hlLnNldChkaXIsIHJlc3VsdCk7XG4gICAgICAgICAgZm9yIChjb25zdCB2aXNpdGVkRGlyIG9mIHZpc2l0ZWREaXJzKSB7XG4gICAgICAgICAgICBwYWNrYWdlSnNvbkNhY2hlLnNldCh2aXNpdGVkRGlyLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gSW52YWxpZCBKU09OIG9yIG1pc3NpbmcgZmllbGRzLCBjb250aW51ZSBzZWFyY2hpbmdcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkaXIgPSBkaXJuYW1lKGRpcik7XG4gIH1cblxuICAvLyBObyBwYWNrYWdlLmpzb24gZm91bmQgLSBjYWNoZSBudWxsIGZvciBhbGwgdmlzaXRlZCBkaXJlY3Rvcmllc1xuICBmb3IgKGNvbnN0IHZpc2l0ZWREaXIgb2YgdmlzaXRlZERpcnMpIHtcbiAgICBwYWNrYWdlSnNvbkNhY2hlLnNldCh2aXNpdGVkRGlyLCBudWxsKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGV4cG9ydCBzdWJwYXRoIGZvciBhIGZpbGUgd2l0aGluIGEgcGFja2FnZS5cbiAqIExvb2tzIHVwIHRoZSBwYWNrYWdlLmpzb24gZXhwb3J0cyBmaWVsZCB0byBmaW5kIHdoaWNoIHN1YnBhdGggbWFwcyB0byB0aGUgZmlsZS5cbiAqXG4gKiBAcGFyYW0gZmlsZVBhdGggLSBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlXG4gKiBAcGFyYW0gcGtnIC0gUGFja2FnZSBpbmZvIGZyb20gZmluZFBhY2thZ2VKc29uXG4gKiBAcmV0dXJucyBUaGUgc3VicGF0aCAoZS5nLiwgXCIvaW50ZXJuYWwvYnVpbHRpbnNcIikgb3IgZW1wdHkgc3RyaW5nIGZvciByb290IGV4cG9ydFxuICovXG5mdW5jdGlvbiB0b1BhY2thZ2VSZWxhdGl2ZVBhdGgoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIHBrZzogUGFja2FnZUluZm9cbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQa2dEaXIgPSBwa2cuZGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgaWYgKCFub3JtYWxpemVkRmlsZVBhdGguc3RhcnRzV2l0aChub3JtYWxpemVkUGtnRGlyICsgJy8nKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aC5zdWJzdHJpbmcobm9ybWFsaXplZFBrZ0Rpci5sZW5ndGggKyAxKTtcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlRmFsbGJhY2tFeHBvcnRUYXJnZXRzKHJlbGF0aXZlUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBmYWxsYmFja1RhcmdldHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZXh0ZW5zaW9uRmFsbGJhY2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7XG4gICAgJy50cyc6IFsnLmpzJ10sXG4gICAgJy50c3gnOiBbJy5qcyddLFxuICAgICcubXRzJzogWycubWpzJ10sXG4gICAgJy5jdHMnOiBbJy5janMnXSxcbiAgICAnLmpzeCc6IFsnLmpzJ10sXG4gIH07XG5cbiAgY29uc3QgZXh0ZW5zaW9uTWF0Y2ggPSByZWxhdGl2ZVBhdGgubWF0Y2goLyhcXC5bXi4vXFxcXF0rKSQvKTtcbiAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uTWF0Y2g/LlsxXT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKCFleHRlbnNpb24pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBwYXRoV2l0aG91dEV4dGVuc2lvbiA9IHJlbGF0aXZlUGF0aC5zbGljZSgwLCAtZXh0ZW5zaW9uLmxlbmd0aCk7XG4gIGNvbnN0IGV4dGVuc2lvblRhcmdldHMgPSBleHRlbnNpb25GYWxsYmFja3NbZXh0ZW5zaW9uXSA/PyBbXTtcbiAgZm9yIChjb25zdCBmYWxsYmFja0V4dGVuc2lvbiBvZiBleHRlbnNpb25UYXJnZXRzKSB7XG4gICAgZmFsbGJhY2tUYXJnZXRzLmFkZChgJHtwYXRoV2l0aG91dEV4dGVuc2lvbn0ke2ZhbGxiYWNrRXh0ZW5zaW9ufWApO1xuICB9XG5cbiAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCdzcmMvJykpIHtcbiAgICBjb25zdCBkaXN0UGF0aFdpdGhvdXRQcmVmaXggPSByZWxhdGl2ZVBhdGguc2xpY2UoJ3NyYy8nLmxlbmd0aCk7XG4gICAgZm9yIChjb25zdCBmYWxsYmFja0V4dGVuc2lvbiBvZiBleHRlbnNpb25UYXJnZXRzKSB7XG4gICAgICBmYWxsYmFja1RhcmdldHMuYWRkKFxuICAgICAgICBgZGlzdC8ke2Rpc3RQYXRoV2l0aG91dFByZWZpeC5zbGljZSgwLCAtZXh0ZW5zaW9uLmxlbmd0aCl9JHtmYWxsYmFja0V4dGVuc2lvbn1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKGZhbGxiYWNrVGFyZ2V0cyk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVFeHBvcnRTdWJwYXRoKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBwa2c6IFBhY2thZ2VJbmZvLFxuICBvcHRpb25zPzogeyBhbGxvd1NvdXJjZUZhbGxiYWNrPzogYm9vbGVhbiB9XG4pOiBzdHJpbmcge1xuICBpZiAoIXBrZy5leHBvcnRzIHx8IHR5cGVvZiBwa2cuZXhwb3J0cyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCByZWxhdGl2ZVBhdGggPSB0b1BhY2thZ2VSZWxhdGl2ZVBhdGgoZmlsZVBhdGgsIHBrZyk7XG4gIGlmICghcmVsYXRpdmVQYXRoKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgY29tcGFyYWJsZVRhcmdldHMgPSBuZXcgU2V0KFtgLi8ke3JlbGF0aXZlUGF0aH1gXSk7XG4gIGlmIChvcHRpb25zPy5hbGxvd1NvdXJjZUZhbGxiYWNrKSB7XG4gICAgZm9yIChjb25zdCBmYWxsYmFja1RhcmdldCBvZiBnZXRTb3VyY2VGYWxsYmFja0V4cG9ydFRhcmdldHMocmVsYXRpdmVQYXRoKSkge1xuICAgICAgY29tcGFyYWJsZVRhcmdldHMuYWRkKGAuLyR7ZmFsbGJhY2tUYXJnZXR9YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2VhcmNoIHRocm91Z2ggZXhwb3J0cyB0byBmaW5kIGEgbWF0Y2hpbmcgc3VicGF0aFxuICBmb3IgKGNvbnN0IFtzdWJwYXRoLCB0YXJnZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBrZy5leHBvcnRzKSkge1xuICAgIGNvbnN0IHJlc29sdmVkVGFyZ2V0ID0gcmVzb2x2ZUV4cG9ydFRhcmdldCh0YXJnZXQpO1xuICAgIGlmIChcbiAgICAgIHJlc29sdmVkVGFyZ2V0ICYmXG4gICAgICBjb21wYXJhYmxlVGFyZ2V0cy5oYXMobm9ybWFsaXplRXhwb3J0UGF0aChyZXNvbHZlZFRhcmdldCkpXG4gICAgKSB7XG4gICAgICAvLyBGb3VuZCBhIG1hdGNoIC0gcmV0dXJuIHRoZSBzdWJwYXRoIHdpdGhvdXQgdGhlIGxlYWRpbmcgXCIuXCJcbiAgICAgIC8vIGUuZy4sIFwiLi9pbnRlcm5hbC9idWlsdGluc1wiIC0+IFwiL2ludGVybmFsL2J1aWx0aW5zXCJcbiAgICAgIHJldHVybiBzdWJwYXRoID09PSAnLicgPyAnJyA6IHN1YnBhdGguc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGFuIGV4cG9ydCB0YXJnZXQgdG8gYSBmaWxlIHBhdGgsIGhhbmRsaW5nIGNvbmRpdGlvbmFsIGV4cG9ydHMgYW5kIGFycmF5cy5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUV4cG9ydFRhcmdldCh0YXJnZXQ6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBhcnJheSBleHBvcnRzIChmYWxsYmFjayBjaGFpbnMpXG4gIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGFyZ2V0KSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVFeHBvcnRUYXJnZXQoaXRlbSk7XG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gQ29uZGl0aW9uYWwgZXhwb3J0IC0gdHJ5IGNvbW1vbiBjb25kaXRpb25zIGluIG9yZGVyIG9mIHByZWZlcmVuY2VcbiAgICBjb25zdCBjb25kaXRpb25zID0gWyd3b3JrZmxvdycsICdkZWZhdWx0JywgJ3JlcXVpcmUnLCAnaW1wb3J0JywgJ25vZGUnXTtcbiAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9ICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2NvbmRpdGlvbl07XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgbmVzdGVkIGNvbmRpdGlvbmFscyBvciBhcnJheXNcbiAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IG5lc3RlZCA9IHJlc29sdmVFeHBvcnRUYXJnZXQodmFsdWUpO1xuICAgICAgICBpZiAobmVzdGVkKSByZXR1cm4gbmVzdGVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhbiBleHBvcnQgcGF0aCBmb3IgY29tcGFyaXNvbi5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRXhwb3J0UGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBFbnN1cmUgaXQgc3RhcnRzIHdpdGggLi9cbiAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoJy4vJykpIHtcbiAgICByZXR1cm4gJy4vJyArIHBhdGg7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBmaWxlIHBhdGggaXMgaW5zaWRlIG5vZGVfbW9kdWxlcy5cbiAqL1xuZnVuY3Rpb24gaXNJbk5vZGVNb2R1bGVzKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBmaWxlUGF0aC5zcGxpdChzZXApLmpvaW4oJy8nKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLycpO1xufVxuXG4vKipcbiAqIENhY2hlIGZvciBwcm9qZWN0IGRlcGVuZGVuY2llcyB0byBhdm9pZCByZXBlYXRlZCBmaWxlc3lzdGVtIHJlYWRzLlxuICogTWFwcyBwcm9qZWN0IHJvb3QgdG8gc2V0IG9mIGRlcGVuZGVuY3kgcGFja2FnZSBuYW1lcy5cbiAqL1xuY29uc3QgcHJvamVjdERlcHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblxuLyoqXG4gKiBHZXQgYWxsIGRlcGVuZGVuY2llcyAoaW5jbHVkaW5nIGRldkRlcGVuZGVuY2llcykgZm9yIGEgcHJvamVjdC5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJvamVjdERlcGVuZGVuY2llcyhwcm9qZWN0Um9vdDogc3RyaW5nKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSBwcm9qZWN0RGVwc0NhY2hlLmdldChwcm9qZWN0Um9vdCk7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgY29uc3QgZGVwcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBwa2dQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgJ3BhY2thZ2UuanNvbicpO1xuXG4gIGlmIChleGlzdHNTeW5jKHBrZ1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMocGtnUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuXG4gICAgICAvLyBDb2xsZWN0IGFsbCBkZXBlbmRlbmN5IHR5cGVzXG4gICAgICBmb3IgKGNvbnN0IGRlcFR5cGUgb2YgW1xuICAgICAgICAnZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgJ2RldkRlcGVuZGVuY2llcycsXG4gICAgICAgICdwZWVyRGVwZW5kZW5jaWVzJyxcbiAgICAgICAgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJyxcbiAgICAgIF0pIHtcbiAgICAgICAgY29uc3QgZGVwT2JqID0gcGFyc2VkW2RlcFR5cGVdO1xuICAgICAgICBpZiAoZGVwT2JqICYmIHR5cGVvZiBkZXBPYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRlcE9iaikpIHtcbiAgICAgICAgICAgIGRlcHMuYWRkKG5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSW52YWxpZCBKU09OIG9yIGZpbGUgbm90IHJlYWRhYmxlXG4gICAgfVxuICB9XG5cbiAgcHJvamVjdERlcHNDYWNoZS5zZXQocHJvamVjdFJvb3QsIGRlcHMpO1xuICByZXR1cm4gZGVwcztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGZpbGUgcGF0aCBpcyBpbnNpZGUgYSB3b3Jrc3BhY2UgcGFja2FnZSB0aGF0IGlzIGEgZGVwZW5kZW5jeSBvZiB0aGUgcHJvamVjdC5cbiAqIFRoaXMgaXMgYSBoZXVyaXN0aWMgLSB3ZSBjaGVjayBpZiB0aGUgZmlsZSBpcyBpbiBhIGRpcmVjdG9yeSB3aXRoIGEgcGFja2FnZS5qc29uXG4gKiB0aGF0IGhhcyBhIFwibmFtZVwiIGZpZWxkLCBpcyBOT1QgaW4gbm9kZV9tb2R1bGVzLCBhbmQgaXMgbGlzdGVkIGFzIGEgZGVwZW5kZW5jeVxuICogb2YgdGhlIHByb2plY3QuXG4gKi9cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUGFja2FnZShmaWxlUGF0aDogc3RyaW5nLCBwcm9qZWN0Um9vdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChpc0luTm9kZU1vZHVsZXMoZmlsZVBhdGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcGtnID0gZmluZFBhY2thZ2VKc29uKGZpbGVQYXRoKTtcbiAgaWYgKCFwa2cpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGUgcGFja2FnZS5qc29uIGlzIG5vdCB0aGUgcm9vdCBwYWNrYWdlLmpzb25cbiAgLy8gVXNlIHJlc29sdmUoKSB0byBub3JtYWxpemUgcGF0aHMgZm9yIGNyb3NzLXBsYXRmb3JtIGNvbXBhcmlzb25cbiAgY29uc3Qgcm9vdFBrZ0RpciA9IHJlc29sdmUocHJvamVjdFJvb3QpO1xuICBjb25zdCBwa2dEaXIgPSByZXNvbHZlKHBrZy5kaXIpO1xuXG4gIC8vIElmIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSBpcyB0aGUgcHJvamVjdCByb290LCBpdCdzIG5vdCBhIHdvcmtzcGFjZSBwYWNrYWdlXG4gIGlmIChwa2dEaXIgPT09IHJvb3RQa2dEaXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBGb3VuZCBhIHBhY2thZ2UuanNvbiB0aGF0J3Mgbm90IHRoZSByb290LlxuICAvLyBPbmx5IHRyZWF0IGl0IGFzIGEgd29ya3NwYWNlIHBhY2thZ2UgaWYgaXQncyBhY3R1YWxseSBhIGRlcGVuZGVuY3lcbiAgLy8gb2YgdGhlIGN1cnJlbnQgcHJvamVjdC4gVGhpcyBwcmV2ZW50cyBzaWJsaW5nIGFwcHMgaW4gYSBtb25vcmVwb1xuICAvLyBmcm9tIGJlaW5nIGluY29ycmVjdGx5IHRyZWF0ZWQgYXMgaW1wb3J0YWJsZSBwYWNrYWdlcy5cbiAgY29uc3QgcHJvamVjdERlcHMgPSBnZXRQcm9qZWN0RGVwZW5kZW5jaWVzKHByb2plY3RSb290KTtcbiAgcmV0dXJuIHByb2plY3REZXBzLmhhcyhwa2cubmFtZSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgbW9kdWxlIHNwZWNpZmllciBmb3IgYSBmaWxlLlxuICpcbiAqIEBwYXJhbSBmaWxlUGF0aCAtIEFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUgYmVpbmcgdHJhbnNmb3JtZWRcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdCAodXN1YWxseSBwcm9jZXNzLmN3ZCgpKVxuICogQHJldHVybnMgVGhlIG1vZHVsZSBzcGVjaWZpZXIgcmVzdWx0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZpbGUgaW4gbm9kZV9tb2R1bGVzIChyb290IGV4cG9ydClcbiAqIHJlc29sdmVNb2R1bGVTcGVjaWZpZXIoJy9wcm9qZWN0L25vZGVfbW9kdWxlcy9wb2ludC9kaXN0L2luZGV4LmpzJywgJy9wcm9qZWN0JylcbiAqIC8vID0+IHsgbW9kdWxlU3BlY2lmaWVyOiAncG9pbnRAMS4wLjAnIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRmlsZSBpbiBub2RlX21vZHVsZXMgKHN1YnBhdGggZXhwb3J0KVxuICogcmVzb2x2ZU1vZHVsZVNwZWNpZmllcignL3Byb2plY3Qvbm9kZV9tb2R1bGVzL3dvcmtmbG93L2Rpc3QvaW50ZXJuYWwvYnVpbHRpbnMuanMnLCAnL3Byb2plY3QnKVxuICogLy8gPT4geyBtb2R1bGVTcGVjaWZpZXI6ICd3b3JrZmxvdy9pbnRlcm5hbC9idWlsdGluc0A0LjAuMCcgfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFeHBvcnRlZCByb290IGZpbGUgaW4gd29ya3NwYWNlIHBhY2thZ2VcbiAqIHJlc29sdmVNb2R1bGVTcGVjaWZpZXIoJy9wcm9qZWN0L3BhY2thZ2VzL3NoYXJlZC9zcmMvaW5kZXgudHMnLCAnL3Byb2plY3QnKVxuICogLy8gPT4geyBtb2R1bGVTcGVjaWZpZXI6ICdAbXlvcmcvc2hhcmVkQDAuMC4wJyB9XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE5vbi1leHBvcnRlZCAvIGRlZXAgcGFja2FnZSBmaWxlXG4gKiByZXNvbHZlTW9kdWxlU3BlY2lmaWVyKCcvcHJvamVjdC9wYWNrYWdlcy9zaGFyZWQvc3JjL2ludGVybmFsL2Zvby50cycsICcvcHJvamVjdCcpXG4gKiAvLyA9PiB7IG1vZHVsZVNwZWNpZmllcjogdW5kZWZpbmVkIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTG9jYWwgYXBwIGZpbGVcbiAqIHJlc29sdmVNb2R1bGVTcGVjaWZpZXIoJy9wcm9qZWN0L3NyYy93b3JrZmxvd3Mvb3JkZXIudHMnLCAnL3Byb2plY3QnKVxuICogLy8gPT4geyBtb2R1bGVTcGVjaWZpZXI6IHVuZGVmaW5lZCB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTW9kdWxlU3BlY2lmaWVyKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBwcm9qZWN0Um9vdDogc3RyaW5nXG4pOiBNb2R1bGVTcGVjaWZpZXJSZXN1bHQge1xuICAvLyBDaGVjayBpZiBmaWxlIGlzIGluIG5vZGVfbW9kdWxlcyBvciBhIHdvcmtzcGFjZSBwYWNrYWdlXG4gIGNvbnN0IGluTm9kZU1vZHVsZXMgPSBpc0luTm9kZU1vZHVsZXMoZmlsZVBhdGgpO1xuICBjb25zdCBpbldvcmtzcGFjZSA9XG4gICAgIWluTm9kZU1vZHVsZXMgJiYgaXNXb3Jrc3BhY2VQYWNrYWdlKGZpbGVQYXRoLCBwcm9qZWN0Um9vdCk7XG5cbiAgaWYgKCFpbk5vZGVNb2R1bGVzICYmICFpbldvcmtzcGFjZSkge1xuICAgIC8vIExvY2FsIGFwcCBmaWxlIC0gdXNlIGRlZmF1bHQgcmVsYXRpdmUgcGF0aCBmb3JtYXRcbiAgICByZXR1cm4geyBtb2R1bGVTcGVjaWZpZXI6IHVuZGVmaW5lZCB9O1xuICB9XG5cbiAgLy8gRmluZCB0aGUgcGFja2FnZS5qc29uIGZvciB0aGlzIGZpbGVcbiAgY29uc3QgcGtnID0gZmluZFBhY2thZ2VKc29uKGZpbGVQYXRoKTtcbiAgaWYgKCFwa2cpIHtcbiAgICAvLyBDb3VsZG4ndCBmaW5kIHBhY2thZ2UuanNvbiAtIGZhbGwgYmFjayB0byBkZWZhdWx0XG4gICAgcmV0dXJuIHsgbW9kdWxlU3BlY2lmaWVyOiB1bmRlZmluZWQgfTtcbiAgfVxuXG4gIC8vIFJlc29sdmUgdGhlIGV4cG9ydCBzdWJwYXRoIChlLmcuLCBcIi9pbnRlcm5hbC9idWlsdGluc1wiIGZvciBcIndvcmtmbG93L2ludGVybmFsL2J1aWx0aW5zXCIpXG4gIGNvbnN0IHN1YnBhdGggPSByZXNvbHZlRXhwb3J0U3VicGF0aChmaWxlUGF0aCwgcGtnLCB7XG4gICAgYWxsb3dTb3VyY2VGYWxsYmFjazogdHJ1ZSxcbiAgfSk7XG5cbiAgaWYgKHN1YnBhdGgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlU3BlY2lmaWVyOiBgJHtwa2cubmFtZX0ke3N1YnBhdGh9QCR7cGtnLnZlcnNpb259YCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGlzUm9vdEVudHJ5cG9pbnRGaWxlKGZpbGVQYXRoLCBwa2cpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZVNwZWNpZmllcjogYCR7cGtnLm5hbWV9QCR7cGtnLnZlcnNpb259YCxcbiAgICB9O1xuICB9XG5cbiAgLy8gTm9uLWV4cG9ydGVkIHBhY2thZ2UgZmlsZSAoZGVlcCBpbXBvcnQgdGhhdCBpc24ndCByZWFjaGFibGUgYXMgYVxuICAvLyBwYWNrYWdlIHNwZWNpZmllcikuIFJldHVybmluZyB1bmRlZmluZWQgbWFrZXMgdGhlIFNXQyBwbHVnaW4gZmFsbCBiYWNrXG4gIC8vIHRvIHRoZSByZWxhdGl2ZSBmaWxlIHBhdGgsIHdoaWNoIGtlZXBzIElEcyB1bmlxdWUgcGVyIGZpbGUuIFByZXZpb3VzbHlcbiAgLy8gZXZlcnkgbm9uLWV4cG9ydGVkIGZpbGUgY29sbGFwc2VkIHRvIFwibmFtZUB2ZXJzaW9uXCIsIGNhdXNpbmcgc2FtZS1uYW1lZFxuICAvLyBzdGVwL3dvcmtmbG93IGZ1bmN0aW9ucyBpbiBkaWZmZXJlbnQgZmlsZXMgdG8gc2lsZW50bHkgb3ZlcndyaXRlIGVhY2hcbiAgLy8gb3RoZXIgYXQgcnVudGltZSByZWdpc3RyYXRpb247IHRoZSBidWlsZC10aW1lIGR1cGxpY2F0ZS1JRCBjaGVjayBub3dcbiAgLy8gYWxzbyBjYXRjaGVzIHRoYXQgY2xhc3Mgb2YgY29sbGlzaW9uLlxuICByZXR1cm4ge1xuICAgIG1vZHVsZVNwZWNpZmllcjogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIFN0cmlwIHRoZSB0cmFpbGluZyBcIkA8dmVyc2lvbj5cIiBzdWZmaXggZnJvbSBhIG1vZHVsZSBzcGVjaWZpZXIgcHJvZHVjZWQgYnlcbiAqIGByZXNvbHZlTW9kdWxlU3BlY2lmaWVyYCwgbGVhdmluZyB0aGUgYmFyZSBgbmFtZWAgb3IgYG5hbWUvc3VicGF0aGAgZm9ybS5cbiAqXG4gKiBVc2UgdGhpcyB3aGVuIHlvdSB3YW50IHRvIGNvbXBhcmUgb3IgZGVkdXBlIHNwZWNpZmllcnMgYWNyb3NzIHZlcnNpb25zXG4gKiAoZS5nLiB0cmVhdGluZyBgQHdvcmtmbG93L2FpL2FnZW50QDUuMC4wLWJldGEuNGAgYW5kXG4gKiBgQHdvcmtmbG93L2FpL2FnZW50QDUuMC4wLWJldGEuNWAgYXMgdGhlIHNhbWUgbG9naWNhbCBtb2R1bGUpLlxuICpcbiAqIENvbG9jYXRlZCB3aXRoIGByZXNvbHZlTW9kdWxlU3BlY2lmaWVyYCBzbyB0aGUgY29uc3RydWN0aW9uIGFuZCBwYXJzaW5nXG4gKiBzdGF5IGluIHN5bmMg4oCUIHNlZSB0aGUgYCR7cGtnLm5hbWV9JHtzdWJwYXRofUAke3BrZy52ZXJzaW9ufWAgYW5kXG4gKiBgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn1gIHBhdGhzIGFib3ZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBQYWNrYWdlVmVyc2lvbihzcGVjaWZpZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFRoZSB2ZXJzaW9uIGlzIGFsd2F5cyB0aGUgZmluYWwgc2VnbWVudCBhZnRlciB0aGUgbGFzdCBcIkBcIi4gQ29uc3RyYWluXG4gIC8vIG1hdGNoaW5nIHRvIGNoYXJhY3RlcnMgdGhhdCBjYW4ndCBhcHBlYXIgaW4gYSBwYWNrYWdlIG5hbWUgb3Igc3VicGF0aFxuICAvLyAobm8gXCIvXCIsIG5vIG5lc3RlZCBcIkBcIikgc28gc2NvcGVkIHBhY2thZ2VzIGxpa2UgYEB3b3JrZmxvdy9haUAxLjAuMGBcbiAgLy8ga2VlcCB0aGVpciBsZWFkaW5nIFwiQHdvcmtmbG93L2FpXCIuXG4gIHJldHVybiBzcGVjaWZpZXIucmVwbGFjZSgvQFteL0BdKyQvLCAnJyk7XG59XG5cbi8qKlxuICogQ2xlYXIgdGhlIHBhY2thZ2UuanNvbiBjYWNoZS4gVXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gcGFja2FnZS5qc29uIGZpbGVzIG1heSBoYXZlIGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhck1vZHVsZVNwZWNpZmllckNhY2hlKCk6IHZvaWQge1xuICBwYWNrYWdlSnNvbkNhY2hlLmNsZWFyKCk7XG4gIHByb2plY3REZXBzQ2FjaGUuY2xlYXIoKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgZmlsZSBwYXRoIHRvIGEgcmVsYXRpdmUgaW1wb3J0IHBhdGggZnJvbSBwcm9qZWN0IHJvb3QuXG4gKi9cbmZ1bmN0aW9uIHRvUmVsYXRpdmVJbXBvcnRQYXRoKGZpbGVQYXRoOiBzdHJpbmcsIHByb2plY3RSb290OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBub3JtYWxpemVkUHJvamVjdFJvb3QgPSBwcm9qZWN0Um9vdC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRGaWxlUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcblxuICBsZXQgcmVsYXRpdmVQYXRoOiBzdHJpbmc7XG4gIGlmIChub3JtYWxpemVkRmlsZVBhdGguc3RhcnRzV2l0aChub3JtYWxpemVkUHJvamVjdFJvb3QgKyAnLycpKSB7XG4gICAgcmVsYXRpdmVQYXRoID0gbm9ybWFsaXplZEZpbGVQYXRoLnN1YnN0cmluZyhcbiAgICAgIG5vcm1hbGl6ZWRQcm9qZWN0Um9vdC5sZW5ndGggKyAxXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBGaWxlIGlzIG91dHNpZGUgcHJvamVjdCByb290LCB1c2UgdGhlIGZ1bGwgcGF0aCBzZWdtZW50cyBhZnRlciBjb21tb24gYW5jZXN0b3JcbiAgICByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShwcm9qZWN0Um9vdCwgZmlsZVBhdGgpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgfVxuXG4gIC8vIEVuc3VyZSByZWxhdGl2ZSBwYXRocyBzdGFydCB3aXRoIC4vXG4gIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gIH1cblxuICByZXR1cm4gcmVsYXRpdmVQYXRoO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHBhY2thZ2UgZXhwb3J0cyBpbmNsdWRlIGEgcm9vdCBlbnRyeSAoXCIuXCIpLlxuICogU3RyaW5nL2FycmF5L2NvbmRpdGlvbmFsIG9iamVjdCBleHBvcnRzIGFyZSBhbGwgY29uc2lkZXJlZCByb290IGV4cG9ydHMuXG4gKi9cbmZ1bmN0aW9uIGhhc1Jvb3RFeHBvcnQoZXhwb3J0c0ZpZWxkOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgZXhwb3J0c0ZpZWxkID09PSAnc3RyaW5nJyB8fCBBcnJheS5pc0FycmF5KGV4cG9ydHNGaWVsZCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghZXhwb3J0c0ZpZWxkIHx8IHR5cGVvZiBleHBvcnRzRmllbGQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV4cG9ydHNGaWVsZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gIC8vIENvbmRpdGlvbmFsIGV4cG9ydHMgb2JqZWN0IChlLmcuIHsgXCJpbXBvcnRcIjogXCIuLi5cIiwgXCJkZWZhdWx0XCI6IFwiLi4uXCIgfSlcbiAgLy8gcmVwcmVzZW50cyB0aGUgcm9vdCBleHBvcnQuXG4gIGlmIChrZXlzLmxlbmd0aCA+IDAgJiYga2V5cy5ldmVyeSgoa2V5KSA9PiAha2V5LnN0YXJ0c1dpdGgoJy4nKSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiAnLicgaW4gKGV4cG9ydHNGaWVsZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGEgcGFja2FnZSB0YXJnZXQgcGF0aCB0byBhIGNvbXBhcmFibGUgcGFja2FnZS1yZWxhdGl2ZSBwYXRoLlxuICogUmV0dXJucyBudWxsIGZvciBpbnZhbGlkL3Vuc3VwcG9ydGVkIHBhdGhzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQYWNrYWdlVGFyZ2V0UGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKCcuLycpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDIpO1xuICB9XG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBub3JtYWxpemVkLnN1YnN0cmluZygxKTtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgZmlsZVBhdGggaXMgdGhlIHBhY2thZ2Ugcm9vdCBlbnRyeXBvaW50LlxuICogVGhpcyBjaGVja3Mgcm9vdCBleHBvcnRzIGZpcnN0LCB0aGVuIG1haW4vbW9kdWxlL2luZGV4IGZhbGxiYWNrcyB3aGVuIGV4cG9ydHMgYXJlIGFic2VudC5cbiAqL1xuZnVuY3Rpb24gaXNSb290RW50cnlwb2ludEZpbGUoZmlsZVBhdGg6IHN0cmluZywgcGtnOiBQYWNrYWdlSW5mbyk6IGJvb2xlYW4ge1xuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQa2dEaXIgPSBwa2cuZGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcblxuICBpZiAoIW5vcm1hbGl6ZWRGaWxlUGF0aC5zdGFydHNXaXRoKG5vcm1hbGl6ZWRQa2dEaXIgKyAnLycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcmVsYXRpdmVGaWxlUGF0aCA9IG5vcm1hbGl6ZWRGaWxlUGF0aC5zdWJzdHJpbmcoXG4gICAgbm9ybWFsaXplZFBrZ0Rpci5sZW5ndGggKyAxXG4gICk7XG5cbiAgaWYgKHBrZy5leHBvcnRzKSB7XG4gICAgbGV0IHJvb3RUYXJnZXQ6IHVua25vd247XG5cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgcGtnLmV4cG9ydHMgPT09ICdvYmplY3QnICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShwa2cuZXhwb3J0cykgJiZcbiAgICAgICcuJyBpbiBwa2cuZXhwb3J0c1xuICAgICkge1xuICAgICAgcm9vdFRhcmdldCA9IChwa2cuZXhwb3J0cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbJy4nXTtcbiAgICB9IGVsc2UgaWYgKGhhc1Jvb3RFeHBvcnQocGtnLmV4cG9ydHMpKSB7XG4gICAgICByb290VGFyZ2V0ID0gcGtnLmV4cG9ydHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZFRhcmdldCA9IHJlc29sdmVFeHBvcnRUYXJnZXQocm9vdFRhcmdldCk7XG4gICAgaWYgKCFyZXNvbHZlZFRhcmdldCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXQgPSBub3JtYWxpemVQYWNrYWdlVGFyZ2V0UGF0aChyZXNvbHZlZFRhcmdldCk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRUYXJnZXQgPT09IHJlbGF0aXZlRmlsZVBhdGg7XG4gIH1cblxuICBjb25zdCByb290Q2FuZGlkYXRlcyA9IFtcbiAgICBwa2cubW9kdWxlLFxuICAgIHBrZy5tYWluLFxuICAgICdpbmRleC5qcycsXG4gICAgJ2luZGV4Lm1qcycsXG4gICAgJ2luZGV4LmNqcycsXG4gICAgJ2luZGV4LnRzJyxcbiAgICAnaW5kZXgubXRzJyxcbiAgICAnaW5kZXguY3RzJyxcbiAgXVxuICAgIC5maWx0ZXIoKGNhbmRpZGF0ZSk6IGNhbmRpZGF0ZSBpcyBzdHJpbmcgPT4gdHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ3N0cmluZycpXG4gICAgLm1hcCgoY2FuZGlkYXRlKSA9PiBub3JtYWxpemVQYWNrYWdlVGFyZ2V0UGF0aChjYW5kaWRhdGUpKVxuICAgIC5maWx0ZXIoKGNhbmRpZGF0ZSk6IGNhbmRpZGF0ZSBpcyBzdHJpbmcgPT4gY2FuZGlkYXRlICE9PSBudWxsKTtcblxuICByZXR1cm4gcm9vdENhbmRpZGF0ZXMuaW5jbHVkZXMocmVsYXRpdmVGaWxlUGF0aCk7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHJlc29sdmluZyBhbiBpbXBvcnQgcGF0aCBmb3IgYSBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydFBhdGhSZXN1bHQge1xuICAvKipcbiAgICogVGhlIGltcG9ydCBwYXRoIHRvIHVzZS5cbiAgICogLSBGb3Igd29ya3NwYWNlIHBhY2thZ2VzOiB0aGUgcGFja2FnZSBuYW1lIChlLmcuLCBcIkBteW9yZy9zaGFyZWRcIilcbiAgICogLSBGb3Igbm9kZV9tb2R1bGVzIHBhY2thZ2VzOiB0aGUgcGFja2FnZSBuYW1lXG4gICAqIC0gRm9yIGxvY2FsIGZpbGVzOiBhIHJlbGF0aXZlIHBhdGggKGUuZy4sIFwiLi9zcmMvd29ya2Zsb3dzL29yZGVyLnRzXCIpXG4gICAqL1xuICBpbXBvcnRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBmaWxlIGlzIGZyb20gYSBwYWNrYWdlICh3b3Jrc3BhY2Ugb3Igbm9kZV9tb2R1bGVzKS5cbiAgICogV2hlbiB0cnVlLCB0aGUgaW1wb3J0IHNob3VsZCBnbyB0aHJvdWdoIHBhY2thZ2UgcmVzb2x1dGlvbiB3aGljaCByZXNwZWN0cyBleHBvcnQgY29uZGl0aW9ucy5cbiAgICovXG4gIGlzUGFja2FnZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGltcG9ydCBwYXRoIHRvIHVzZSBmb3IgYSBmaWxlIGluIGEgYnVuZGxlJ3MgdmlydHVhbCBlbnRyeS5cbiAqXG4gKiBGb3Igd29ya3NwYWNlIHBhY2thZ2VzIGFuZCBub2RlX21vZHVsZXMgcGFja2FnZXMsIHJldHVybnMgdGhlIHBhY2thZ2UgbmFtZVxuICogc28gdGhhdCBidW5kbGVyIHJlc29sdXRpb24gd2lsbCByZXNwZWN0IHBhY2thZ2UuanNvbiBleHBvcnRzIGFuZCBjb25kaXRpb25zLlxuICpcbiAqIEZvciBsb2NhbCBhcHAgZmlsZXMsIHJldHVybnMgYSByZWxhdGl2ZSBwYXRoLlxuICpcbiAqIEBwYXJhbSBmaWxlUGF0aCAtIEFic29sdXRlIHBhdGggdG8gdGhlIGZpbGVcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdFxuICogQHJldHVybnMgVGhlIGltcG9ydCBwYXRoIGFuZCB3aGV0aGVyIGl0J3MgYSBwYWNrYWdlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdvcmtzcGFjZSBwYWNrYWdlXG4gKiBnZXRJbXBvcnRQYXRoKCcvcHJvamVjdC9wYWNrYWdlcy9zaGFyZWQvc3JjL2luZGV4LnRzJywgJy9wcm9qZWN0JylcbiAqIC8vID0+IHsgaW1wb3J0UGF0aDogJ0BteW9yZy9zaGFyZWQnLCBpc1BhY2thZ2U6IHRydWUgfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBMb2NhbCBhcHAgZmlsZVxuICogZ2V0SW1wb3J0UGF0aCgnL3Byb2plY3Qvc3JjL3dvcmtmbG93cy9vcmRlci50cycsICcvcHJvamVjdCcpXG4gKiAvLyA9PiB7IGltcG9ydFBhdGg6ICcuL3NyYy93b3JrZmxvd3Mvb3JkZXIudHMnLCBpc1BhY2thZ2U6IGZhbHNlIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEltcG9ydFBhdGgoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIHByb2plY3RSb290OiBzdHJpbmdcbik6IEltcG9ydFBhdGhSZXN1bHQge1xuICAvLyBDaGVjayBpZiBmaWxlIGlzIGluIG5vZGVfbW9kdWxlcyBvciBhIHdvcmtzcGFjZSBwYWNrYWdlXG4gIGNvbnN0IGluTm9kZU1vZHVsZXMgPSBpc0luTm9kZU1vZHVsZXMoZmlsZVBhdGgpO1xuICBjb25zdCBpbldvcmtzcGFjZSA9XG4gICAgIWluTm9kZU1vZHVsZXMgJiYgaXNXb3Jrc3BhY2VQYWNrYWdlKGZpbGVQYXRoLCBwcm9qZWN0Um9vdCk7XG5cbiAgaWYgKGluTm9kZU1vZHVsZXMgfHwgaW5Xb3Jrc3BhY2UpIHtcbiAgICAvLyBGaW5kIHRoZSBwYWNrYWdlLmpzb24gZm9yIHRoaXMgZmlsZVxuICAgIGNvbnN0IHBrZyA9IGZpbmRQYWNrYWdlSnNvbihmaWxlUGF0aCk7XG4gICAgaWYgKHBrZykge1xuICAgICAgY29uc3QgaXNEaXJlY3RQcm9qZWN0RGVwZW5kZW5jeSA9IGdldFByb2plY3REZXBlbmRlbmNpZXMocHJvamVjdFJvb3QpLmhhcyhcbiAgICAgICAgcGtnLm5hbWVcbiAgICAgICk7XG4gICAgICBjb25zdCBjYW5Vc2VQYWNrYWdlU3BlY2lmaWVyID0gaW5Xb3Jrc3BhY2UgfHwgaXNEaXJlY3RQcm9qZWN0RGVwZW5kZW5jeTtcblxuICAgICAgLy8gRm9yIHRyYW5zaXRpdmUgbm9kZV9tb2R1bGVzIGRlcGVuZGVuY2llcyB1bmRlciBzdHJpY3QgcGFja2FnZSBtYW5hZ2Vyc1xuICAgICAgLy8gKGZvciBleGFtcGxlLCBwbnBtKSwgaW1wb3J0aW5nIGJ5IHBhY2thZ2UgbmFtZSBjYW4gZmFpbC4gVXNlIGEgZGlyZWN0XG4gICAgICAvLyBmaWxlIHBhdGggaW1wb3J0IGluIHRob3NlIGNhc2VzLlxuICAgICAgaWYgKCFjYW5Vc2VQYWNrYWdlU3BlY2lmaWVyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW1wb3J0UGF0aDogdG9SZWxhdGl2ZUltcG9ydFBhdGgoZmlsZVBhdGgsIHByb2plY3RSb290KSxcbiAgICAgICAgICBpc1BhY2thZ2U6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBQcmVmZXIgYSBwYWNrYWdlIHN1YnBhdGggaW1wb3J0IHdoZW4gdGhpcyBmaWxlIG1hcHMgdG8gYW4gZXhwb3J0LlxuICAgICAgLy8gVGhpcyBwcmVzZXJ2ZXMgdGhlIGV4YWN0IG1vZHVsZSBiZWluZyBidW5kbGVkIHdoaWxlIHN0aWxsIHJlc3BlY3RpbmdcbiAgICAgIC8vIHBhY2thZ2UgZXhwb3J0IGNvbmRpdGlvbnMuXG4gICAgICAvLyBOb3RlOiByZXNvbHZlRXhwb3J0U3VicGF0aCByZXR1cm5zIFwiXCIgZm9yIGJvdGggcm9vdCBcIi5cIiBtYXRjaGVzIGFuZFxuICAgICAgLy8gbm8gbWF0Y2g7IHJvb3QgZW50cnlwb2ludHMgYXJlIGludGVudGlvbmFsbHkgaGFuZGxlZCBiZWxvdyB2aWFcbiAgICAgIC8vIGlzUm9vdEVudHJ5cG9pbnRGaWxlKCkuXG4gICAgICBjb25zdCBzdWJwYXRoID0gcmVzb2x2ZUV4cG9ydFN1YnBhdGgoZmlsZVBhdGgsIHBrZyk7XG4gICAgICBpZiAoc3VicGF0aCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGltcG9ydFBhdGg6IGAke3BrZy5uYW1lfSR7c3VicGF0aH1gLFxuICAgICAgICAgIGlzUGFja2FnZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gT25seSBpbXBvcnQgcGFja2FnZSByb290IHdoZW4gdGhpcyBmaWxlIGlzIHRoZSByb290IGVudHJ5cG9pbnQuXG4gICAgICAvLyBGb3IgZGVlcC9pbnRlcm5hbCBmaWxlcywgZmFsbCBiYWNrIHRvIGRpcmVjdCByZWxhdGl2ZSBpbXBvcnRzIHNvIHdlXG4gICAgICAvLyBkb24ndCBhY2NpZGVudGFsbHkgaW1wb3J0IGEgbm9uLWV4aXN0ZW50IG9yIGRpZmZlcmVudCBtb2R1bGUuXG4gICAgICBpZiAoIWlzUm9vdEVudHJ5cG9pbnRGaWxlKGZpbGVQYXRoLCBwa2cpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW1wb3J0UGF0aDogdG9SZWxhdGl2ZUltcG9ydFBhdGgoZmlsZVBhdGgsIHByb2plY3RSb290KSxcbiAgICAgICAgICBpc1BhY2thZ2U6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbXBvcnRQYXRoOiBwa2cubmFtZSxcbiAgICAgICAgaXNQYWNrYWdlOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBMb2NhbCBhcHAgZmlsZSAtIHVzZSByZWxhdGl2ZSBwYXRoXG4gIHJldHVybiB7XG4gICAgaW1wb3J0UGF0aDogdG9SZWxhdGl2ZUltcG9ydFBhdGgoZmlsZVBhdGgsIHByb2plY3RSb290KSxcbiAgICBpc1BhY2thZ2U6IGZhbHNlLFxuICB9O1xufVxuIl19
523
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLXNwZWNpZmllci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tb2R1bGUtc3BlY2lmaWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBMkJsRTs7O0dBR0c7QUFDSCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO0FBRS9EOzs7R0FHRztBQUNILFNBQVMsZUFBZSxDQUFDLFFBQWdCO0lBQ3ZDLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUU1QixnRUFBZ0U7SUFDaEUsTUFBTSxXQUFXLEdBQWEsRUFBRSxDQUFDO0lBRWpDLG1EQUFtRDtJQUNuRCxPQUFPLEdBQUcsS0FBSyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QixvQkFBb0I7UUFDcEIsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLG1FQUFtRTtZQUNuRSxLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNyQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzNDLENBQUM7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV0QixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ2xELElBQUksVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFD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QUF1RTtZQUN2RSw2QkFBNkI7WUFDN0Isc0VBQXNFO1lBQ3RFLGlFQUFpRTtZQUNqRSwwQkFBMEI7WUFDMUIsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osT0FBTztvQkFDTCxVQUFVLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLE9BQU8sRUFBRTtvQkFDbkMsU0FBUyxFQUFFLElBQUk7aUJBQ2hCLENBQUM7WUFDSixDQUFDO1lBRUQsa0VBQWtFO1lBQ2xFLHNFQUFzRTtZQUN0RSxnRUFBZ0U7WUFDaEUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN6QyxPQUFPO29CQUNMLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDO29CQUN2RCxTQUFTLEVBQUUsS0FBSztpQkFDakIsQ0FBQztZQUNKLENBQUM7WUFFRCxPQUFPO2dCQUNMLFVBQVUsRUFBRSxHQUFHLENBQUMsSUFBSTtnQkFDcEIsU0FBUyxFQUFFLElBQUk7YUFDaEIsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQscUNBQXFDO0lBQ3JDLE9BQU87UUFDTCxVQUFVLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQztRQUN2RCxTQUFTLEVBQUUsS0FBSztLQUNqQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVsYXRpdmUsIHJlc29sdmUsIHNlcCB9IGZyb20gJ25vZGU6cGF0aCc7XG5cbi8qKlxuICogUmVzdWx0IG9mIHJlc29sdmluZyBhIG1vZHVsZSBzcGVjaWZpZXIgZm9yIGEgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2R1bGVTcGVjaWZpZXJSZXN1bHQge1xuICAvKipcbiAgICogVGhlIG1vZHVsZSBzcGVjaWZpZXIgdG8gdXNlIGZvciBJRCBnZW5lcmF0aW9uLlxuICAgKiAtIEZvciBwYWNrYWdlczogXCJ7bmFtZX1Ae3ZlcnNpb259XCIgb3IgXCJ7bmFtZX0ve3N1YnBhdGh9QHt2ZXJzaW9ufVwiXG4gICAqICAgKGUuZy4sIFwicG9pbnRAMS4wLjBcIiwgXCJAbXlvcmcvc2hhcmVkQDIuMC4wXCIsIFwid29ya2Zsb3cvaW50ZXJuYWwvYnVpbHRpbnNANC4wLjBcIilcbiAgICogLSBGb3IgbG9jYWwgZmlsZXM6IHVuZGVmaW5lZCAocGx1Z2luIHdpbGwgdXNlIGRlZmF1bHQgXCIuL3JlbGF0aXZlL3BhdGhcIiBmb3JtYXQpXG4gICAqL1xuICBtb2R1bGVTcGVjaWZpZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQYXJzZWQgcGFja2FnZS5qc29uIGRhdGEgd2l0aCBkaXJlY3RvcnkgaW5mb3JtYXRpb24uXG4gKi9cbmludGVyZmFjZSBQYWNrYWdlSW5mbyB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xuICBkaXI6IHN0cmluZztcbiAgZXhwb3J0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBtYWluPzogc3RyaW5nO1xuICBtb2R1bGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ2FjaGUgZm9yIHBhY2thZ2UuanNvbiBsb29rdXBzIHRvIGF2b2lkIHJlcGVhdGVkIGZpbGVzeXN0ZW0gcmVhZHMuXG4gKiBNYXBzIGRpcmVjdG9yeSBwYXRoIHRvIHBhcnNlZCBwYWNrYWdlLmpzb24gaW5mbyBvciBudWxsIGlmIG5vdCBmb3VuZC5cbiAqL1xuY29uc3QgcGFja2FnZUpzb25DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQYWNrYWdlSW5mbyB8IG51bGw+KCk7XG5cbi8qKlxuICogRmluZCBhbmQgcmVhZCB0aGUgbmVhcmVzdCBwYWNrYWdlLmpzb24gZm9yIGEgZ2l2ZW4gZmlsZSBwYXRoLlxuICogUmVzdWx0cyBhcmUgY2FjaGVkIGZvciBwZXJmb3JtYW5jZS5cbiAqL1xuZnVuY3Rpb24gZmluZFBhY2thZ2VKc29uKGZpbGVQYXRoOiBzdHJpbmcpOiBQYWNrYWdlSW5mbyB8IG51bGwge1xuICBsZXQgZGlyID0gZGlybmFtZShmaWxlUGF0aCk7XG5cbiAgLy8gVHJhY2sgZGlyZWN0b3JpZXMgd2UndmUgdmlzaXRlZCBzbyB3ZSBjYW4gYmFjay1maWxsIHRoZSBjYWNoZVxuICBjb25zdCB2aXNpdGVkRGlyczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBXYWxrIHVwIHRoZSBkaXJlY3RvcnkgdHJlZSB1bnRpbCB3ZSBoaXQgdGhlIHJvb3RcbiAgd2hpbGUgKGRpciAhPT0gZGlybmFtZShkaXIpKSB7XG4gICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3RcbiAgICBjb25zdCBjYWNoZWQgPSBwYWNrYWdlSnNvbkNhY2hlLmdldChkaXIpO1xuICAgIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQmFjay1maWxsIGNhY2hlIGZvciBhbGwgdmlzaXRlZCBkaXJlY3RvcmllcyB3aXRoIHRoZSBzYW1lIHJlc3VsdFxuICAgICAgZm9yIChjb25zdCB2aXNpdGVkRGlyIG9mIHZpc2l0ZWREaXJzKSB7XG4gICAgICAgIHBhY2thZ2VKc29uQ2FjaGUuc2V0KHZpc2l0ZWREaXIsIGNhY2hlZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIHZpc2l0ZWREaXJzLnB1c2goZGlyKTtcblxuICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGpvaW4oZGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGYtOCcpO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgICAgICBpZiAocGFyc2VkLm5hbWUgJiYgcGFyc2VkLnZlcnNpb24pIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQ6IFBhY2thZ2VJbmZvID0ge1xuICAgICAgICAgICAgbmFtZTogcGFyc2VkLm5hbWUsXG4gICAgICAgICAgICB2ZXJzaW9uOiBwYXJzZWQudmVyc2lvbixcbiAgICAgICAgICAgIGRpcixcbiAgICAgICAgICAgIGV4cG9ydHM6IHBhcnNlZC5leHBvcnRzLFxuICAgICAgICAgICAgbWFpbjogcGFyc2VkLm1haW4sXG4gICAgICAgICAgICBtb2R1bGU6IHBhcnNlZC5tb2R1bGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBDYWNoZSB0aGUgcmVzdWx0IGZvciB0aGlzIGRpcmVjdG9yeSBhbmQgYWxsIHZpc2l0ZWQgZGlyZWN0b3JpZXNcbiAgICAgICAgICBwYWNrYWdlSnNvbkNhY2hlLnNldChkaXIsIHJlc3VsdCk7XG4gICAgICAgICAgZm9yIChjb25zdCB2aXNpdGVkRGlyIG9mIHZpc2l0ZWREaXJzKSB7XG4gICAgICAgICAgICBwYWNrYWdlSnNvbkNhY2hlLnNldCh2aXNpdGVkRGlyLCByZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gSW52YWxpZCBKU09OIG9yIG1pc3NpbmcgZmllbGRzLCBjb250aW51ZSBzZWFyY2hpbmdcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkaXIgPSBkaXJuYW1lKGRpcik7XG4gIH1cblxuICAvLyBObyBwYWNrYWdlLmpzb24gZm91bmQgLSBjYWNoZSBudWxsIGZvciBhbGwgdmlzaXRlZCBkaXJlY3Rvcmllc1xuICBmb3IgKGNvbnN0IHZpc2l0ZWREaXIgb2YgdmlzaXRlZERpcnMpIHtcbiAgICBwYWNrYWdlSnNvbkNhY2hlLnNldCh2aXNpdGVkRGlyLCBudWxsKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGV4cG9ydCBzdWJwYXRoIGZvciBhIGZpbGUgd2l0aGluIGEgcGFja2FnZS5cbiAqIExvb2tzIHVwIHRoZSBwYWNrYWdlLmpzb24gZXhwb3J0cyBmaWVsZCB0byBmaW5kIHdoaWNoIHN1YnBhdGggbWFwcyB0byB0aGUgZmlsZS5cbiAqXG4gKiBAcGFyYW0gZmlsZVBhdGggLSBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlXG4gKiBAcGFyYW0gcGtnIC0gUGFja2FnZSBpbmZvIGZyb20gZmluZFBhY2thZ2VKc29uXG4gKiBAcmV0dXJucyBUaGUgc3VicGF0aCAoZS5nLiwgXCIvaW50ZXJuYWwvYnVpbHRpbnNcIikgb3IgZW1wdHkgc3RyaW5nIGZvciByb290IGV4cG9ydFxuICovXG5mdW5jdGlvbiB0b1BhY2thZ2VSZWxhdGl2ZVBhdGgoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIHBrZzogUGFja2FnZUluZm9cbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQa2dEaXIgPSBwa2cuZGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgaWYgKCFub3JtYWxpemVkRmlsZVBhdGguc3RhcnRzV2l0aChub3JtYWxpemVkUGtnRGlyICsgJy8nKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWRGaWxlUGF0aC5zdWJzdHJpbmcobm9ybWFsaXplZFBrZ0Rpci5sZW5ndGggKyAxKTtcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlRmFsbGJhY2tFeHBvcnRUYXJnZXRzKHJlbGF0aXZlUGF0aDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBmYWxsYmFja1RhcmdldHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZXh0ZW5zaW9uRmFsbGJhY2tzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7XG4gICAgJy50cyc6IFsnLmpzJ10sXG4gICAgJy50c3gnOiBbJy5qcyddLFxuICAgICcubXRzJzogWycubWpzJ10sXG4gICAgJy5jdHMnOiBbJy5janMnXSxcbiAgICAnLmpzeCc6IFsnLmpzJ10sXG4gIH07XG5cbiAgY29uc3QgZXh0ZW5zaW9uTWF0Y2ggPSByZWxhdGl2ZVBhdGgubWF0Y2goLyhcXC5bXi4vXFxcXF0rKSQvKTtcbiAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uTWF0Y2g/LlsxXT8udG9Mb3dlckNhc2UoKTtcbiAgaWYgKCFleHRlbnNpb24pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBwYXRoV2l0aG91dEV4dGVuc2lvbiA9IHJlbGF0aXZlUGF0aC5zbGljZSgwLCAtZXh0ZW5zaW9uLmxlbmd0aCk7XG4gIGNvbnN0IGV4dGVuc2lvblRhcmdldHMgPSBleHRlbnNpb25GYWxsYmFja3NbZXh0ZW5zaW9uXSA/PyBbXTtcbiAgZm9yIChjb25zdCBmYWxsYmFja0V4dGVuc2lvbiBvZiBleHRlbnNpb25UYXJnZXRzKSB7XG4gICAgZmFsbGJhY2tUYXJnZXRzLmFkZChgJHtwYXRoV2l0aG91dEV4dGVuc2lvbn0ke2ZhbGxiYWNrRXh0ZW5zaW9ufWApO1xuICB9XG5cbiAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCdzcmMvJykpIHtcbiAgICBjb25zdCBkaXN0UGF0aFdpdGhvdXRQcmVmaXggPSByZWxhdGl2ZVBhdGguc2xpY2UoJ3NyYy8nLmxlbmd0aCk7XG4gICAgZm9yIChjb25zdCBmYWxsYmFja0V4dGVuc2lvbiBvZiBleHRlbnNpb25UYXJnZXRzKSB7XG4gICAgICBmYWxsYmFja1RhcmdldHMuYWRkKFxuICAgICAgICBgZGlzdC8ke2Rpc3RQYXRoV2l0aG91dFByZWZpeC5zbGljZSgwLCAtZXh0ZW5zaW9uLmxlbmd0aCl9JHtmYWxsYmFja0V4dGVuc2lvbn1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKGZhbGxiYWNrVGFyZ2V0cyk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVFeHBvcnRTdWJwYXRoKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBwa2c6IFBhY2thZ2VJbmZvLFxuICBvcHRpb25zPzogeyBhbGxvd1NvdXJjZUZhbGxiYWNrPzogYm9vbGVhbiB9XG4pOiBzdHJpbmcge1xuICBpZiAoIXBrZy5leHBvcnRzIHx8IHR5cGVvZiBwa2cuZXhwb3J0cyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCByZWxhdGl2ZVBhdGggPSB0b1BhY2thZ2VSZWxhdGl2ZVBhdGgoZmlsZVBhdGgsIHBrZyk7XG4gIGlmICghcmVsYXRpdmVQYXRoKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgY29tcGFyYWJsZVRhcmdldHMgPSBuZXcgU2V0KFtgLi8ke3JlbGF0aXZlUGF0aH1gXSk7XG4gIGlmIChvcHRpb25zPy5hbGxvd1NvdXJjZUZhbGxiYWNrKSB7XG4gICAgZm9yIChjb25zdCBmYWxsYmFja1RhcmdldCBvZiBnZXRTb3VyY2VGYWxsYmFja0V4cG9ydFRhcmdldHMocmVsYXRpdmVQYXRoKSkge1xuICAgICAgY29tcGFyYWJsZVRhcmdldHMuYWRkKGAuLyR7ZmFsbGJhY2tUYXJnZXR9YCk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2VhcmNoIHRocm91Z2ggZXhwb3J0cyB0byBmaW5kIGEgbWF0Y2hpbmcgc3VicGF0aFxuICBmb3IgKGNvbnN0IFtzdWJwYXRoLCB0YXJnZXRdIG9mIE9iamVjdC5lbnRyaWVzKHBrZy5leHBvcnRzKSkge1xuICAgIGNvbnN0IHJlc29sdmVkVGFyZ2V0ID0gcmVzb2x2ZUV4cG9ydFRhcmdldCh0YXJnZXQpO1xuICAgIGlmIChcbiAgICAgIHJlc29sdmVkVGFyZ2V0ICYmXG4gICAgICBjb21wYXJhYmxlVGFyZ2V0cy5oYXMobm9ybWFsaXplRXhwb3J0UGF0aChyZXNvbHZlZFRhcmdldCkpXG4gICAgKSB7XG4gICAgICAvLyBGb3VuZCBhIG1hdGNoIC0gcmV0dXJuIHRoZSBzdWJwYXRoIHdpdGhvdXQgdGhlIGxlYWRpbmcgXCIuXCJcbiAgICAgIC8vIGUuZy4sIFwiLi9pbnRlcm5hbC9idWlsdGluc1wiIC0+IFwiL2ludGVybmFsL2J1aWx0aW5zXCJcbiAgICAgIHJldHVybiBzdWJwYXRoID09PSAnLicgPyAnJyA6IHN1YnBhdGguc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGFuIGV4cG9ydCB0YXJnZXQgdG8gYSBmaWxlIHBhdGgsIGhhbmRsaW5nIGNvbmRpdGlvbmFsIGV4cG9ydHMgYW5kIGFycmF5cy5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUV4cG9ydFRhcmdldCh0YXJnZXQ6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIC8vIEhhbmRsZSBhcnJheSBleHBvcnRzIChmYWxsYmFjayBjaGFpbnMpXG4gIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGFyZ2V0KSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVFeHBvcnRUYXJnZXQoaXRlbSk7XG4gICAgICBpZiAocmVzb2x2ZWQpIHJldHVybiByZXNvbHZlZDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gQ29uZGl0aW9uYWwgZXhwb3J0IC0gdHJ5IGNvbW1vbiBjb25kaXRpb25zIGluIG9yZGVyIG9mIHByZWZlcmVuY2VcbiAgICBjb25zdCBjb25kaXRpb25zID0gWyd3b3JrZmxvdycsICdkZWZhdWx0JywgJ3JlcXVpcmUnLCAnaW1wb3J0JywgJ25vZGUnXTtcbiAgICBmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9ICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2NvbmRpdGlvbl07XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICAvLyBIYW5kbGUgbmVzdGVkIGNvbmRpdGlvbmFscyBvciBhcnJheXNcbiAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IG5lc3RlZCA9IHJlc29sdmVFeHBvcnRUYXJnZXQodmFsdWUpO1xuICAgICAgICBpZiAobmVzdGVkKSByZXR1cm4gbmVzdGVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhbiBleHBvcnQgcGF0aCBmb3IgY29tcGFyaXNvbi5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplRXhwb3J0UGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBFbnN1cmUgaXQgc3RhcnRzIHdpdGggLi9cbiAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoJy4vJykpIHtcbiAgICByZXR1cm4gJy4vJyArIHBhdGg7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBmaWxlIHBhdGggaXMgaW5zaWRlIG5vZGVfbW9kdWxlcy5cbiAqL1xuZnVuY3Rpb24gaXNJbk5vZGVNb2R1bGVzKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBmaWxlUGF0aC5zcGxpdChzZXApLmpvaW4oJy8nKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLycpO1xufVxuXG4vKipcbiAqIENhY2hlIGZvciBwcm9qZWN0IGRlcGVuZGVuY2llcyB0byBhdm9pZCByZXBlYXRlZCBmaWxlc3lzdGVtIHJlYWRzLlxuICogTWFwcyBwcm9qZWN0IHJvb3QgdG8gc2V0IG9mIGRlcGVuZGVuY3kgcGFja2FnZSBuYW1lcy5cbiAqL1xuY29uc3QgcHJvamVjdERlcHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblxuLyoqXG4gKiBHZXQgYWxsIGRlcGVuZGVuY2llcyAoaW5jbHVkaW5nIGRldkRlcGVuZGVuY2llcykgZm9yIGEgcHJvamVjdC5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJvamVjdERlcGVuZGVuY2llcyhwcm9qZWN0Um9vdDogc3RyaW5nKTogU2V0PHN0cmluZz4ge1xuICBjb25zdCBjYWNoZWQgPSBwcm9qZWN0RGVwc0NhY2hlLmdldChwcm9qZWN0Um9vdCk7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgY29uc3QgZGVwcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBwa2dQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgJ3BhY2thZ2UuanNvbicpO1xuXG4gIGlmIChleGlzdHNTeW5jKHBrZ1BhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMocGtnUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuXG4gICAgICAvLyBDb2xsZWN0IGFsbCBkZXBlbmRlbmN5IHR5cGVzXG4gICAgICBmb3IgKGNvbnN0IGRlcFR5cGUgb2YgW1xuICAgICAgICAnZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgJ2RldkRlcGVuZGVuY2llcycsXG4gICAgICAgICdwZWVyRGVwZW5kZW5jaWVzJyxcbiAgICAgICAgJ29wdGlvbmFsRGVwZW5kZW5jaWVzJyxcbiAgICAgIF0pIHtcbiAgICAgICAgY29uc3QgZGVwT2JqID0gcGFyc2VkW2RlcFR5cGVdO1xuICAgICAgICBpZiAoZGVwT2JqICYmIHR5cGVvZiBkZXBPYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRlcE9iaikpIHtcbiAgICAgICAgICAgIGRlcHMuYWRkKG5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gSW52YWxpZCBKU09OIG9yIGZpbGUgbm90IHJlYWRhYmxlXG4gICAgfVxuICB9XG5cbiAgcHJvamVjdERlcHNDYWNoZS5zZXQocHJvamVjdFJvb3QsIGRlcHMpO1xuICByZXR1cm4gZGVwcztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGZpbGUgcGF0aCBpcyBpbnNpZGUgYSB3b3Jrc3BhY2UgcGFja2FnZSB0aGF0IGlzIGEgZGVwZW5kZW5jeSBvZiB0aGUgcHJvamVjdC5cbiAqIFRoaXMgaXMgYSBoZXVyaXN0aWMgLSB3ZSBjaGVjayBpZiB0aGUgZmlsZSBpcyBpbiBhIGRpcmVjdG9yeSB3aXRoIGEgcGFja2FnZS5qc29uXG4gKiB0aGF0IGhhcyBhIFwibmFtZVwiIGZpZWxkLCBpcyBOT1QgaW4gbm9kZV9tb2R1bGVzLCBhbmQgaXMgbGlzdGVkIGFzIGEgZGVwZW5kZW5jeVxuICogb2YgdGhlIHByb2plY3QuXG4gKi9cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUGFja2FnZShmaWxlUGF0aDogc3RyaW5nLCBwcm9qZWN0Um9vdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChpc0luTm9kZU1vZHVsZXMoZmlsZVBhdGgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcGtnID0gZmluZFBhY2thZ2VKc29uKGZpbGVQYXRoKTtcbiAgaWYgKCFwa2cpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDaGVjayBpZiB0aGUgcGFja2FnZS5qc29uIGlzIG5vdCB0aGUgcm9vdCBwYWNrYWdlLmpzb25cbiAgLy8gVXNlIHJlc29sdmUoKSB0byBub3JtYWxpemUgcGF0aHMgZm9yIGNyb3NzLXBsYXRmb3JtIGNvbXBhcmlzb25cbiAgY29uc3Qgcm9vdFBrZ0RpciA9IHJlc29sdmUocHJvamVjdFJvb3QpO1xuICBjb25zdCBwa2dEaXIgPSByZXNvbHZlKHBrZy5kaXIpO1xuXG4gIC8vIElmIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSBpcyB0aGUgcHJvamVjdCByb290LCBpdCdzIG5vdCBhIHdvcmtzcGFjZSBwYWNrYWdlXG4gIGlmIChwa2dEaXIgPT09IHJvb3RQa2dEaXIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBGb3VuZCBhIHBhY2thZ2UuanNvbiB0aGF0J3Mgbm90IHRoZSByb290LlxuICAvLyBPbmx5IHRyZWF0IGl0IGFzIGEgd29ya3NwYWNlIHBhY2thZ2UgaWYgaXQncyBhY3R1YWxseSBhIGRlcGVuZGVuY3lcbiAgLy8gb2YgdGhlIGN1cnJlbnQgcHJvamVjdC4gVGhpcyBwcmV2ZW50cyBzaWJsaW5nIGFwcHMgaW4gYSBtb25vcmVwb1xuICAvLyBmcm9tIGJlaW5nIGluY29ycmVjdGx5IHRyZWF0ZWQgYXMgaW1wb3J0YWJsZSBwYWNrYWdlcy5cbiAgY29uc3QgcHJvamVjdERlcHMgPSBnZXRQcm9qZWN0RGVwZW5kZW5jaWVzKHByb2plY3RSb290KTtcbiAgcmV0dXJuIHByb2plY3REZXBzLmhhcyhwa2cubmFtZSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgbW9kdWxlIHNwZWNpZmllciBmb3IgYSBmaWxlLlxuICpcbiAqIEBwYXJhbSBmaWxlUGF0aCAtIEFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUgYmVpbmcgdHJhbnNmb3JtZWRcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdCAodXN1YWxseSBwcm9jZXNzLmN3ZCgpKVxuICogQHJldHVybnMgVGhlIG1vZHVsZSBzcGVjaWZpZXIgcmVzdWx0XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZpbGUgaW4gbm9kZV9tb2R1bGVzIChyb290IGV4cG9ydClcbiAqIHJlc29sdmVNb2R1bGVTcGVjaWZpZXIoJy9wcm9qZWN0L25vZGVfbW9kdWxlcy9wb2ludC9kaXN0L2luZGV4LmpzJywgJy9wcm9qZWN0JylcbiAqIC8vID0+IHsgbW9kdWxlU3BlY2lmaWVyOiAncG9pbnRAMS4wLjAnIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRmlsZSBpbiBub2RlX21vZHVsZXMgKHN1YnBhdGggZXhwb3J0KVxuICogcmVzb2x2ZU1vZHVsZVNwZWNpZmllcignL3Byb2plY3Qvbm9kZV9tb2R1bGVzL3dvcmtmbG93L2Rpc3QvaW50ZXJuYWwvYnVpbHRpbnMuanMnLCAnL3Byb2plY3QnKVxuICogLy8gPT4geyBtb2R1bGVTcGVjaWZpZXI6ICd3b3JrZmxvdy9pbnRlcm5hbC9idWlsdGluc0A0LjAuMCcgfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFeHBvcnRlZCByb290IGZpbGUgaW4gd29ya3NwYWNlIHBhY2thZ2VcbiAqIHJlc29sdmVNb2R1bGVTcGVjaWZpZXIoJy9wcm9qZWN0L3BhY2thZ2VzL3NoYXJlZC9zcmMvaW5kZXgudHMnLCAnL3Byb2plY3QnKVxuICogLy8gPT4geyBtb2R1bGVTcGVjaWZpZXI6ICdAbXlvcmcvc2hhcmVkQDAuMC4wJyB9XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE5vbi1leHBvcnRlZCAvIGRlZXAgcGFja2FnZSBmaWxlXG4gKiByZXNvbHZlTW9kdWxlU3BlY2lmaWVyKCcvcHJvamVjdC9wYWNrYWdlcy9zaGFyZWQvc3JjL2ludGVybmFsL2Zvby50cycsICcvcHJvamVjdCcpXG4gKiAvLyA9PiB7IG1vZHVsZVNwZWNpZmllcjogdW5kZWZpbmVkIH1cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTG9jYWwgYXBwIGZpbGVcbiAqIHJlc29sdmVNb2R1bGVTcGVjaWZpZXIoJy9wcm9qZWN0L3NyYy93b3JrZmxvd3Mvb3JkZXIudHMnLCAnL3Byb2plY3QnKVxuICogLy8gPT4geyBtb2R1bGVTcGVjaWZpZXI6IHVuZGVmaW5lZCB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlTW9kdWxlU3BlY2lmaWVyKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBwcm9qZWN0Um9vdDogc3RyaW5nXG4pOiBNb2R1bGVTcGVjaWZpZXJSZXN1bHQge1xuICAvLyBDaGVjayBpZiBmaWxlIGlzIGluIG5vZGVfbW9kdWxlcyBvciBhIHdvcmtzcGFjZSBwYWNrYWdlXG4gIGNvbnN0IGluTm9kZU1vZHVsZXMgPSBpc0luTm9kZU1vZHVsZXMoZmlsZVBhdGgpO1xuICBjb25zdCBpbldvcmtzcGFjZSA9XG4gICAgIWluTm9kZU1vZHVsZXMgJiYgaXNXb3Jrc3BhY2VQYWNrYWdlKGZpbGVQYXRoLCBwcm9qZWN0Um9vdCk7XG5cbiAgaWYgKCFpbk5vZGVNb2R1bGVzICYmICFpbldvcmtzcGFjZSkge1xuICAgIC8vIExvY2FsIGFwcCBmaWxlIC0gdXNlIGRlZmF1bHQgcmVsYXRpdmUgcGF0aCBmb3JtYXRcbiAgICByZXR1cm4geyBtb2R1bGVTcGVjaWZpZXI6IHVuZGVmaW5lZCB9O1xuICB9XG5cbiAgLy8gRmluZCB0aGUgcGFja2FnZS5qc29uIGZvciB0aGlzIGZpbGVcbiAgY29uc3QgcGtnID0gZmluZFBhY2thZ2VKc29uKGZpbGVQYXRoKTtcbiAgaWYgKCFwa2cpIHtcbiAgICAvLyBDb3VsZG4ndCBmaW5kIHBhY2thZ2UuanNvbiAtIGZhbGwgYmFjayB0byBkZWZhdWx0XG4gICAgcmV0dXJuIHsgbW9kdWxlU3BlY2lmaWVyOiB1bmRlZmluZWQgfTtcbiAgfVxuXG4gIC8vIFJlc29sdmUgdGhlIGV4cG9ydCBzdWJwYXRoIChlLmcuLCBcIi9pbnRlcm5hbC9idWlsdGluc1wiIGZvciBcIndvcmtmbG93L2ludGVybmFsL2J1aWx0aW5zXCIpXG4gIGNvbnN0IHN1YnBhdGggPSByZXNvbHZlRXhwb3J0U3VicGF0aChmaWxlUGF0aCwgcGtnLCB7XG4gICAgYWxsb3dTb3VyY2VGYWxsYmFjazogdHJ1ZSxcbiAgfSk7XG5cbiAgaWYgKHN1YnBhdGgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlU3BlY2lmaWVyOiBgJHtwa2cubmFtZX0ke3N1YnBhdGh9QCR7cGtnLnZlcnNpb259YCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGlzUm9vdEVudHJ5cG9pbnRGaWxlKGZpbGVQYXRoLCBwa2cpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZVNwZWNpZmllcjogYCR7cGtnLm5hbWV9QCR7cGtnLnZlcnNpb259YCxcbiAgICB9O1xuICB9XG5cbiAgLy8gTm9uLWV4cG9ydGVkIHBhY2thZ2UgZmlsZSAoZGVlcCBpbXBvcnQgdGhhdCBpc24ndCByZWFjaGFibGUgYXMgYVxuICAvLyBwYWNrYWdlIHNwZWNpZmllcikuIFJldHVybmluZyB1bmRlZmluZWQgbWFrZXMgdGhlIFNXQyBwbHVnaW4gZmFsbCBiYWNrXG4gIC8vIHRvIHRoZSByZWxhdGl2ZSBmaWxlIHBhdGgsIHdoaWNoIGtlZXBzIElEcyB1bmlxdWUgcGVyIGZpbGUuIFByZXZpb3VzbHlcbiAgLy8gZXZlcnkgbm9uLWV4cG9ydGVkIGZpbGUgY29sbGFwc2VkIHRvIFwibmFtZUB2ZXJzaW9uXCIsIGNhdXNpbmcgc2FtZS1uYW1lZFxuICAvLyBzdGVwL3dvcmtmbG93IGZ1bmN0aW9ucyBpbiBkaWZmZXJlbnQgZmlsZXMgdG8gc2lsZW50bHkgb3ZlcndyaXRlIGVhY2hcbiAgLy8gb3RoZXIgYXQgcnVudGltZSByZWdpc3RyYXRpb247IHRoZSBidWlsZC10aW1lIGR1cGxpY2F0ZS1JRCBjaGVjayBub3dcbiAgLy8gYWxzbyBjYXRjaGVzIHRoYXQgY2xhc3Mgb2YgY29sbGlzaW9uLlxuICByZXR1cm4ge1xuICAgIG1vZHVsZVNwZWNpZmllcjogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vKipcbiAqIFN0cmlwIHRoZSB0cmFpbGluZyBcIkA8dmVyc2lvbj5cIiBzdWZmaXggZnJvbSBhIG1vZHVsZSBzcGVjaWZpZXIgcHJvZHVjZWQgYnlcbiAqIGByZXNvbHZlTW9kdWxlU3BlY2lmaWVyYCwgbGVhdmluZyB0aGUgYmFyZSBgbmFtZWAgb3IgYG5hbWUvc3VicGF0aGAgZm9ybS5cbiAqXG4gKiBVc2UgdGhpcyB3aGVuIHlvdSB3YW50IHRvIGNvbXBhcmUgb3IgZGVkdXBlIHNwZWNpZmllcnMgYWNyb3NzIHZlcnNpb25zXG4gKiAoZS5nLiB0cmVhdGluZyBgQHdvcmtmbG93L2FpL2FnZW50QDUuMC4wLWJldGEuNGAgYW5kXG4gKiBgQHdvcmtmbG93L2FpL2FnZW50QDUuMC4wLWJldGEuNWAgYXMgdGhlIHNhbWUgbG9naWNhbCBtb2R1bGUpLlxuICpcbiAqIENvbG9jYXRlZCB3aXRoIGByZXNvbHZlTW9kdWxlU3BlY2lmaWVyYCBzbyB0aGUgY29uc3RydWN0aW9uIGFuZCBwYXJzaW5nXG4gKiBzdGF5IGluIHN5bmM7IHNlZSB0aGUgYCR7cGtnLm5hbWV9JHtzdWJwYXRofUAke3BrZy52ZXJzaW9ufWAgYW5kXG4gKiBgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn1gIHBhdGhzIGFib3ZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBQYWNrYWdlVmVyc2lvbihzcGVjaWZpZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFRoZSB2ZXJzaW9uIGlzIGFsd2F5cyB0aGUgZmluYWwgc2VnbWVudCBhZnRlciB0aGUgbGFzdCBcIkBcIi4gQ29uc3RyYWluXG4gIC8vIG1hdGNoaW5nIHRvIGNoYXJhY3RlcnMgdGhhdCBjYW4ndCBhcHBlYXIgaW4gYSBwYWNrYWdlIG5hbWUgb3Igc3VicGF0aFxuICAvLyAobm8gXCIvXCIsIG5vIG5lc3RlZCBcIkBcIikgc28gc2NvcGVkIHBhY2thZ2VzIGxpa2UgYEB3b3JrZmxvdy9haUAxLjAuMGBcbiAgLy8ga2VlcCB0aGVpciBsZWFkaW5nIFwiQHdvcmtmbG93L2FpXCIuXG4gIHJldHVybiBzcGVjaWZpZXIucmVwbGFjZSgvQFteL0BdKyQvLCAnJyk7XG59XG5cbi8qKlxuICogQ2xlYXIgdGhlIHBhY2thZ2UuanNvbiBjYWNoZS4gVXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gcGFja2FnZS5qc29uIGZpbGVzIG1heSBoYXZlIGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhck1vZHVsZVNwZWNpZmllckNhY2hlKCk6IHZvaWQge1xuICBwYWNrYWdlSnNvbkNhY2hlLmNsZWFyKCk7XG4gIHByb2plY3REZXBzQ2FjaGUuY2xlYXIoKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgZmlsZSBwYXRoIHRvIGEgcmVsYXRpdmUgaW1wb3J0IHBhdGggZnJvbSBwcm9qZWN0IHJvb3QuXG4gKi9cbmZ1bmN0aW9uIHRvUmVsYXRpdmVJbXBvcnRQYXRoKGZpbGVQYXRoOiBzdHJpbmcsIHByb2plY3RSb290OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBub3JtYWxpemVkUHJvamVjdFJvb3QgPSBwcm9qZWN0Um9vdC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRGaWxlUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcblxuICBsZXQgcmVsYXRpdmVQYXRoOiBzdHJpbmc7XG4gIGlmIChub3JtYWxpemVkRmlsZVBhdGguc3RhcnRzV2l0aChub3JtYWxpemVkUHJvamVjdFJvb3QgKyAnLycpKSB7XG4gICAgcmVsYXRpdmVQYXRoID0gbm9ybWFsaXplZEZpbGVQYXRoLnN1YnN0cmluZyhcbiAgICAgIG5vcm1hbGl6ZWRQcm9qZWN0Um9vdC5sZW5ndGggKyAxXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBGaWxlIGlzIG91dHNpZGUgcHJvamVjdCByb290LCB1c2UgdGhlIGZ1bGwgcGF0aCBzZWdtZW50cyBhZnRlciBjb21tb24gYW5jZXN0b3JcbiAgICByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShwcm9qZWN0Um9vdCwgZmlsZVBhdGgpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgfVxuXG4gIC8vIEVuc3VyZSByZWxhdGl2ZSBwYXRocyBzdGFydCB3aXRoIC4vXG4gIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4nKSkge1xuICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gIH1cblxuICByZXR1cm4gcmVsYXRpdmVQYXRoO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHBhY2thZ2UgZXhwb3J0cyBpbmNsdWRlIGEgcm9vdCBlbnRyeSAoXCIuXCIpLlxuICogU3RyaW5nL2FycmF5L2NvbmRpdGlvbmFsIG9iamVjdCBleHBvcnRzIGFyZSBhbGwgY29uc2lkZXJlZCByb290IGV4cG9ydHMuXG4gKi9cbmZ1bmN0aW9uIGhhc1Jvb3RFeHBvcnQoZXhwb3J0c0ZpZWxkOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgZXhwb3J0c0ZpZWxkID09PSAnc3RyaW5nJyB8fCBBcnJheS5pc0FycmF5KGV4cG9ydHNGaWVsZCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghZXhwb3J0c0ZpZWxkIHx8IHR5cGVvZiBleHBvcnRzRmllbGQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV4cG9ydHNGaWVsZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gIC8vIENvbmRpdGlvbmFsIGV4cG9ydHMgb2JqZWN0IChlLmcuIHsgXCJpbXBvcnRcIjogXCIuLi5cIiwgXCJkZWZhdWx0XCI6IFwiLi4uXCIgfSlcbiAgLy8gcmVwcmVzZW50cyB0aGUgcm9vdCBleHBvcnQuXG4gIGlmIChrZXlzLmxlbmd0aCA+IDAgJiYga2V5cy5ldmVyeSgoa2V5KSA9PiAha2V5LnN0YXJ0c1dpdGgoJy4nKSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiAnLicgaW4gKGV4cG9ydHNGaWVsZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGEgcGFja2FnZSB0YXJnZXQgcGF0aCB0byBhIGNvbXBhcmFibGUgcGFja2FnZS1yZWxhdGl2ZSBwYXRoLlxuICogUmV0dXJucyBudWxsIGZvciBpbnZhbGlkL3Vuc3VwcG9ydGVkIHBhdGhzLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQYWNrYWdlVGFyZ2V0UGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKCcuLycpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQuc3Vic3RyaW5nKDIpO1xuICB9XG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBub3JtYWxpemVkLnN1YnN0cmluZygxKTtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgZmlsZVBhdGggaXMgdGhlIHBhY2thZ2Ugcm9vdCBlbnRyeXBvaW50LlxuICogVGhpcyBjaGVja3Mgcm9vdCBleHBvcnRzIGZpcnN0LCB0aGVuIG1haW4vbW9kdWxlL2luZGV4IGZhbGxiYWNrcyB3aGVuIGV4cG9ydHMgYXJlIGFic2VudC5cbiAqL1xuZnVuY3Rpb24gaXNSb290RW50cnlwb2ludEZpbGUoZmlsZVBhdGg6IHN0cmluZywgcGtnOiBQYWNrYWdlSW5mbyk6IGJvb2xlYW4ge1xuICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQa2dEaXIgPSBwa2cuZGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcblxuICBpZiAoIW5vcm1hbGl6ZWRGaWxlUGF0aC5zdGFydHNXaXRoKG5vcm1hbGl6ZWRQa2dEaXIgKyAnLycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcmVsYXRpdmVGaWxlUGF0aCA9IG5vcm1hbGl6ZWRGaWxlUGF0aC5zdWJzdHJpbmcoXG4gICAgbm9ybWFsaXplZFBrZ0Rpci5sZW5ndGggKyAxXG4gICk7XG5cbiAgaWYgKHBrZy5leHBvcnRzKSB7XG4gICAgbGV0IHJvb3RUYXJnZXQ6IHVua25vd247XG5cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgcGtnLmV4cG9ydHMgPT09ICdvYmplY3QnICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShwa2cuZXhwb3J0cykgJiZcbiAgICAgICcuJyBpbiBwa2cuZXhwb3J0c1xuICAgICkge1xuICAgICAgcm9vdFRhcmdldCA9IChwa2cuZXhwb3J0cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbJy4nXTtcbiAgICB9IGVsc2UgaWYgKGhhc1Jvb3RFeHBvcnQocGtnLmV4cG9ydHMpKSB7XG4gICAgICByb290VGFyZ2V0ID0gcGtnLmV4cG9ydHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZFRhcmdldCA9IHJlc29sdmVFeHBvcnRUYXJnZXQocm9vdFRhcmdldCk7XG4gICAgaWYgKCFyZXNvbHZlZFRhcmdldCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXQgPSBub3JtYWxpemVQYWNrYWdlVGFyZ2V0UGF0aChyZXNvbHZlZFRhcmdldCk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRUYXJnZXQgPT09IHJlbGF0aXZlRmlsZVBhdGg7XG4gIH1cblxuICBjb25zdCByb290Q2FuZGlkYXRlcyA9IFtcbiAgICBwa2cubW9kdWxlLFxuICAgIHBrZy5tYWluLFxuICAgICdpbmRleC5qcycsXG4gICAgJ2luZGV4Lm1qcycsXG4gICAgJ2luZGV4LmNqcycsXG4gICAgJ2luZGV4LnRzJyxcbiAgICAnaW5kZXgubXRzJyxcbiAgICAnaW5kZXguY3RzJyxcbiAgXVxuICAgIC5maWx0ZXIoKGNhbmRpZGF0ZSk6IGNhbmRpZGF0ZSBpcyBzdHJpbmcgPT4gdHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ3N0cmluZycpXG4gICAgLm1hcCgoY2FuZGlkYXRlKSA9PiBub3JtYWxpemVQYWNrYWdlVGFyZ2V0UGF0aChjYW5kaWRhdGUpKVxuICAgIC5maWx0ZXIoKGNhbmRpZGF0ZSk6IGNhbmRpZGF0ZSBpcyBzdHJpbmcgPT4gY2FuZGlkYXRlICE9PSBudWxsKTtcblxuICByZXR1cm4gcm9vdENhbmRpZGF0ZXMuaW5jbHVkZXMocmVsYXRpdmVGaWxlUGF0aCk7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHJlc29sdmluZyBhbiBpbXBvcnQgcGF0aCBmb3IgYSBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydFBhdGhSZXN1bHQge1xuICAvKipcbiAgICogVGhlIGltcG9ydCBwYXRoIHRvIHVzZS5cbiAgICogLSBGb3Igd29ya3NwYWNlIHBhY2thZ2VzOiB0aGUgcGFja2FnZSBuYW1lIChlLmcuLCBcIkBteW9yZy9zaGFyZWRcIilcbiAgICogLSBGb3Igbm9kZV9tb2R1bGVzIHBhY2thZ2VzOiB0aGUgcGFja2FnZSBuYW1lXG4gICAqIC0gRm9yIGxvY2FsIGZpbGVzOiBhIHJlbGF0aXZlIHBhdGggKGUuZy4sIFwiLi9zcmMvd29ya2Zsb3dzL29yZGVyLnRzXCIpXG4gICAqL1xuICBpbXBvcnRQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBmaWxlIGlzIGZyb20gYSBwYWNrYWdlICh3b3Jrc3BhY2Ugb3Igbm9kZV9tb2R1bGVzKS5cbiAgICogV2hlbiB0cnVlLCB0aGUgaW1wb3J0IHNob3VsZCBnbyB0aHJvdWdoIHBhY2thZ2UgcmVzb2x1dGlvbiB3aGljaCByZXNwZWN0cyBleHBvcnQgY29uZGl0aW9ucy5cbiAgICovXG4gIGlzUGFja2FnZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGltcG9ydCBwYXRoIHRvIHVzZSBmb3IgYSBmaWxlIGluIGEgYnVuZGxlJ3MgdmlydHVhbCBlbnRyeS5cbiAqXG4gKiBGb3Igd29ya3NwYWNlIHBhY2thZ2VzIGFuZCBub2RlX21vZHVsZXMgcGFja2FnZXMsIHJldHVybnMgdGhlIHBhY2thZ2UgbmFtZVxuICogc28gdGhhdCBidW5kbGVyIHJlc29sdXRpb24gd2lsbCByZXNwZWN0IHBhY2thZ2UuanNvbiBleHBvcnRzIGFuZCBjb25kaXRpb25zLlxuICpcbiAqIEZvciBsb2NhbCBhcHAgZmlsZXMsIHJldHVybnMgYSByZWxhdGl2ZSBwYXRoLlxuICpcbiAqIEBwYXJhbSBmaWxlUGF0aCAtIEFic29sdXRlIHBhdGggdG8gdGhlIGZpbGVcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdFxuICogQHJldHVybnMgVGhlIGltcG9ydCBwYXRoIGFuZCB3aGV0aGVyIGl0J3MgYSBwYWNrYWdlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdvcmtzcGFjZSBwYWNrYWdlXG4gKiBnZXRJbXBvcnRQYXRoKCcvcHJvamVjdC9wYWNrYWdlcy9zaGFyZWQvc3JjL2luZGV4LnRzJywgJy9wcm9qZWN0JylcbiAqIC8vID0+IHsgaW1wb3J0UGF0aDogJ0BteW9yZy9zaGFyZWQnLCBpc1BhY2thZ2U6IHRydWUgfVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBMb2NhbCBhcHAgZmlsZVxuICogZ2V0SW1wb3J0UGF0aCgnL3Byb2plY3Qvc3JjL3dvcmtmbG93cy9vcmRlci50cycsICcvcHJvamVjdCcpXG4gKiAvLyA9PiB7IGltcG9ydFBhdGg6ICcuL3NyYy93b3JrZmxvd3Mvb3JkZXIudHMnLCBpc1BhY2thZ2U6IGZhbHNlIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEltcG9ydFBhdGgoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIHByb2plY3RSb290OiBzdHJpbmdcbik6IEltcG9ydFBhdGhSZXN1bHQge1xuICAvLyBDaGVjayBpZiBmaWxlIGlzIGluIG5vZGVfbW9kdWxlcyBvciBhIHdvcmtzcGFjZSBwYWNrYWdlXG4gIGNvbnN0IGluTm9kZU1vZHVsZXMgPSBpc0luTm9kZU1vZHVsZXMoZmlsZVBhdGgpO1xuICBjb25zdCBpbldvcmtzcGFjZSA9XG4gICAgIWluTm9kZU1vZHVsZXMgJiYgaXNXb3Jrc3BhY2VQYWNrYWdlKGZpbGVQYXRoLCBwcm9qZWN0Um9vdCk7XG5cbiAgaWYgKGluTm9kZU1vZHVsZXMgfHwgaW5Xb3Jrc3BhY2UpIHtcbiAgICAvLyBGaW5kIHRoZSBwYWNrYWdlLmpzb24gZm9yIHRoaXMgZmlsZVxuICAgIGNvbnN0IHBrZyA9IGZpbmRQYWNrYWdlSnNvbihmaWxlUGF0aCk7XG4gICAgaWYgKHBrZykge1xuICAgICAgY29uc3QgaXNEaXJlY3RQcm9qZWN0RGVwZW5kZW5jeSA9IGdldFByb2plY3REZXBlbmRlbmNpZXMocHJvamVjdFJvb3QpLmhhcyhcbiAgICAgICAgcGtnLm5hbWVcbiAgICAgICk7XG4gICAgICBjb25zdCBjYW5Vc2VQYWNrYWdlU3BlY2lmaWVyID0gaW5Xb3Jrc3BhY2UgfHwgaXNEaXJlY3RQcm9qZWN0RGVwZW5kZW5jeTtcblxuICAgICAgLy8gRm9yIHRyYW5zaXRpdmUgbm9kZV9tb2R1bGVzIGRlcGVuZGVuY2llcyB1bmRlciBzdHJpY3QgcGFja2FnZSBtYW5hZ2Vyc1xuICAgICAgLy8gKGZvciBleGFtcGxlLCBwbnBtKSwgaW1wb3J0aW5nIGJ5IHBhY2thZ2UgbmFtZSBjYW4gZmFpbC4gVXNlIGEgZGlyZWN0XG4gICAgICAvLyBmaWxlIHBhdGggaW1wb3J0IGluIHRob3NlIGNhc2VzLlxuICAgICAgaWYgKCFjYW5Vc2VQYWNrYWdlU3BlY2lmaWVyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW1wb3J0UGF0aDogdG9SZWxhdGl2ZUltcG9ydFBhdGgoZmlsZVBhdGgsIHByb2plY3RSb290KSxcbiAgICAgICAgICBpc1BhY2thZ2U6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBQcmVmZXIgYSBwYWNrYWdlIHN1YnBhdGggaW1wb3J0IHdoZW4gdGhpcyBmaWxlIG1hcHMgdG8gYW4gZXhwb3J0LlxuICAgICAgLy8gVGhpcyBwcmVzZXJ2ZXMgdGhlIGV4YWN0IG1vZHVsZSBiZWluZyBidW5kbGVkIHdoaWxlIHN0aWxsIHJlc3BlY3RpbmdcbiAgICAgIC8vIHBhY2thZ2UgZXhwb3J0IGNvbmRpdGlvbnMuXG4gICAgICAvLyBOb3RlOiByZXNvbHZlRXhwb3J0U3VicGF0aCByZXR1cm5zIFwiXCIgZm9yIGJvdGggcm9vdCBcIi5cIiBtYXRjaGVzIGFuZFxuICAgICAgLy8gbm8gbWF0Y2g7IHJvb3QgZW50cnlwb2ludHMgYXJlIGludGVudGlvbmFsbHkgaGFuZGxlZCBiZWxvdyB2aWFcbiAgICAgIC8vIGlzUm9vdEVudHJ5cG9pbnRGaWxlKCkuXG4gICAgICBjb25zdCBzdWJwYXRoID0gcmVzb2x2ZUV4cG9ydFN1YnBhdGgoZmlsZVBhdGgsIHBrZyk7XG4gICAgICBpZiAoc3VicGF0aCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGltcG9ydFBhdGg6IGAke3BrZy5uYW1lfSR7c3VicGF0aH1gLFxuICAgICAgICAgIGlzUGFja2FnZTogdHJ1ZSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gT25seSBpbXBvcnQgcGFja2FnZSByb290IHdoZW4gdGhpcyBmaWxlIGlzIHRoZSByb290IGVudHJ5cG9pbnQuXG4gICAgICAvLyBGb3IgZGVlcC9pbnRlcm5hbCBmaWxlcywgZmFsbCBiYWNrIHRvIGRpcmVjdCByZWxhdGl2ZSBpbXBvcnRzIHNvIHdlXG4gICAgICAvLyBkb24ndCBhY2NpZGVudGFsbHkgaW1wb3J0IGEgbm9uLWV4aXN0ZW50IG9yIGRpZmZlcmVudCBtb2R1bGUuXG4gICAgICBpZiAoIWlzUm9vdEVudHJ5cG9pbnRGaWxlKGZpbGVQYXRoLCBwa2cpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW1wb3J0UGF0aDogdG9SZWxhdGl2ZUltcG9ydFBhdGgoZmlsZVBhdGgsIHByb2plY3RSb290KSxcbiAgICAgICAgICBpc1BhY2thZ2U6IGZhbHNlLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbXBvcnRQYXRoOiBwa2cubmFtZSxcbiAgICAgICAgaXNQYWNrYWdlOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBMb2NhbCBhcHAgZmlsZSAtIHVzZSByZWxhdGl2ZSBwYXRoXG4gIHJldHVybiB7XG4gICAgaW1wb3J0UGF0aDogdG9SZWxhdGl2ZUltcG9ydFBhdGgoZmlsZVBhdGgsIHByb2plY3RSb290KSxcbiAgICBpc1BhY2thZ2U6IGZhbHNlLFxuICB9O1xufVxuIl19