obsidian-dev-utils 96.6.0 → 98.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/LICENSE +1 -1
  3. package/dist/integration-test-plugin/main.js +1762 -4197
  4. package/dist/lib/cjs/__merged.cjs +17 -9
  5. package/dist/lib/cjs/__merged.d.cts +3 -1
  6. package/dist/lib/cjs/desktop-zip-extractor.cjs +276 -0
  7. package/dist/lib/cjs/desktop-zip-extractor.d.cts +94 -0
  8. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  9. package/dist/lib/cjs/index.cjs +4 -1
  10. package/dist/lib/cjs/index.d.cts +1 -0
  11. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +38 -38
  12. package/dist/lib/cjs/obsidian/demo-vault-naming.cjs +167 -0
  13. package/dist/lib/cjs/obsidian/demo-vault-naming.d.cts +54 -0
  14. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +20 -21
  15. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +21 -16
  16. package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +9 -9
  17. package/dist/lib/cjs/obsidian/desktop-trusted-input.d.cts +23 -4
  18. package/dist/lib/cjs/obsidian/index.cjs +10 -1
  19. package/dist/lib/cjs/obsidian/index.d.cts +3 -0
  20. package/dist/lib/cjs/obsidian/mobile-trusted-input.cjs +195 -0
  21. package/dist/lib/cjs/obsidian/mobile-trusted-input.d.cts +93 -0
  22. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +2 -1
  23. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +4 -0
  24. package/dist/lib/cjs/obsidian/resource-lock.cjs +122 -122
  25. package/dist/lib/cjs/obsidian/trusted-input.cjs +206 -0
  26. package/dist/lib/cjs/obsidian/trusted-input.d.cts +126 -0
  27. package/dist/lib/cjs/script-utils/build.cjs +30 -6
  28. package/dist/lib/cjs/script-utils/build.d.cts +5 -0
  29. package/dist/lib/cjs/script-utils/demo-vault.cjs +26 -6
  30. package/dist/lib/cjs/script-utils/demo-vault.d.cts +12 -8
  31. package/dist/lib/cjs/script-utils/exec.cjs +1 -1
  32. package/dist/lib/cjs/script-utils/formatters/dprint.cjs +3 -2
  33. package/dist/lib/cjs/script-utils/index.cjs +4 -1
  34. package/dist/lib/cjs/script-utils/index.d.cts +1 -0
  35. package/dist/lib/cjs/script-utils/linters/cspell.cjs +3 -3
  36. package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +39 -1
  37. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +16 -1
  38. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.d.cts +5 -0
  39. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.cjs +254 -0
  40. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.d.cts +54 -0
  41. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.cjs +217 -0
  42. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.d.cts +141 -0
  43. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.cjs +214 -0
  44. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.d.cts +32 -0
  45. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.cjs +215 -0
  46. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.d.cts +30 -0
  47. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.cjs +318 -0
  48. package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.d.cts +45 -0
  49. package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +9 -1
  50. package/dist/lib/cjs/script-utils/linters/eslint.cjs +3 -2
  51. package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +4 -4
  52. package/dist/lib/cjs/script-utils/npm-run.cjs +4 -3
  53. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +10 -1
  54. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +37 -1
  55. package/dist/lib/cjs/script-utils/package-manager.cjs +287 -0
  56. package/dist/lib/cjs/script-utils/package-manager.d.cts +77 -0
  57. package/dist/lib/cjs/script-utils/version.cjs +21 -9
  58. package/dist/lib/esm/__merged.d.mts +3 -1
  59. package/dist/lib/esm/__merged.mjs +18 -10
  60. package/dist/lib/esm/desktop-zip-extractor.d.mts +94 -0
  61. package/dist/lib/esm/desktop-zip-extractor.mjs +174 -0
  62. package/dist/lib/esm/generated-during-build.mjs +1 -1
  63. package/dist/lib/esm/index.d.mts +1 -0
  64. package/dist/lib/esm/index.mjs +3 -1
  65. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +38 -38
  66. package/dist/lib/esm/obsidian/demo-vault-naming.d.mts +54 -0
  67. package/dist/lib/esm/obsidian/demo-vault-naming.mjs +61 -0
  68. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +21 -16
  69. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +23 -11
  70. package/dist/lib/esm/obsidian/desktop-trusted-input.d.mts +23 -4
  71. package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +9 -9
  72. package/dist/lib/esm/obsidian/index.d.mts +3 -0
  73. package/dist/lib/esm/obsidian/index.mjs +7 -1
  74. package/dist/lib/esm/obsidian/mobile-trusted-input.d.mts +93 -0
  75. package/dist/lib/esm/obsidian/mobile-trusted-input.mjs +84 -0
  76. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +4 -0
  77. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +2 -1
  78. package/dist/lib/esm/obsidian/resource-lock.mjs +122 -122
  79. package/dist/lib/esm/obsidian/trusted-input.d.mts +126 -0
  80. package/dist/lib/esm/obsidian/trusted-input.mjs +85 -0
  81. package/dist/lib/esm/script-utils/build.d.mts +5 -0
  82. package/dist/lib/esm/script-utils/build.mjs +30 -6
  83. package/dist/lib/esm/script-utils/demo-vault.d.mts +12 -8
  84. package/dist/lib/esm/script-utils/demo-vault.mjs +29 -6
  85. package/dist/lib/esm/script-utils/exec.mjs +1 -1
  86. package/dist/lib/esm/script-utils/formatters/dprint.mjs +3 -2
  87. package/dist/lib/esm/script-utils/index.d.mts +1 -0
  88. package/dist/lib/esm/script-utils/index.mjs +3 -1
  89. package/dist/lib/esm/script-utils/linters/cspell.mjs +3 -3
  90. package/dist/lib/esm/script-utils/linters/eslint-config.mjs +39 -1
  91. package/dist/lib/esm/script-utils/linters/eslint-rules/index.d.mts +5 -0
  92. package/dist/lib/esm/script-utils/linters/eslint-rules/index.mjs +11 -1
  93. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.d.mts +54 -0
  94. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.mjs +148 -0
  95. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.d.mts +141 -0
  96. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.mjs +92 -0
  97. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.d.mts +32 -0
  98. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.mjs +111 -0
  99. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.d.mts +30 -0
  100. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.mjs +112 -0
  101. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.d.mts +45 -0
  102. package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.mjs +217 -0
  103. package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +9 -1
  104. package/dist/lib/esm/script-utils/linters/eslint.mjs +3 -2
  105. package/dist/lib/esm/script-utils/linters/markdownlint.mjs +4 -4
  106. package/dist/lib/esm/script-utils/npm-run.mjs +4 -3
  107. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +37 -1
  108. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +10 -1
  109. package/dist/lib/esm/script-utils/package-manager.d.mts +77 -0
  110. package/dist/lib/esm/script-utils/package-manager.mjs +173 -0
  111. package/dist/lib/esm/script-utils/version.mjs +21 -9
  112. package/obsidian/demo-vault-naming/package.json +6 -0
  113. package/obsidian/mobile-trusted-input/package.json +6 -0
  114. package/obsidian/trusted-input/package.json +6 -0
  115. package/package.json +19 -17
  116. package/script-utils/linters/eslint-rules/manifest-description/package.json +6 -0
  117. package/script-utils/linters/eslint-rules/manifest-helpers/package.json +6 -0
  118. package/script-utils/linters/eslint-rules/manifest-id/package.json +6 -0
  119. package/script-utils/linters/eslint-rules/manifest-name/package.json +6 -0
  120. package/script-utils/linters/eslint-rules/manifest-schema/package.json +6 -0
  121. package/script-utils/package-manager/package.json +6 -0
@@ -0,0 +1,167 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureBrowserProcess() {
8
+ const browserProcess = {
9
+ browser: true,
10
+ cwd() {
11
+ return '/';
12
+ },
13
+ env: {},
14
+ platform: 'android'
15
+ };
16
+
17
+ // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
18
+ const existingProcess = globalThis.process;
19
+
20
+ if (!existingProcess) {
21
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
22
+ globalThis.process = browserProcess;
23
+ return;
24
+ }
25
+
26
+ if (existingProcess.versions?.node) {
27
+ return;
28
+ }
29
+
30
+ const existingProcessRecord = existingProcess;
31
+
32
+ for (const [key, value] of Object.entries(browserProcess)) {
33
+ existingProcessRecord[key] ??= value;
34
+ }
35
+
36
+ existingProcessRecord['browser'] = true;
37
+ }
38
+
39
+ function keepName($unknown) {
40
+ return $unknown;
41
+ }
42
+
43
+ (function initCjs() {
44
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
45
+ const globalThisRecord = globalThis;
46
+ globalThisRecord['__name'] ??= keepName;
47
+ const originalRequire = require;
48
+ if (originalRequire && !originalRequire.__isPatched) {
49
+ // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
50
+ require = Object.assign(
51
+ (id) => requirePatched(id),
52
+ originalRequire,
53
+ {
54
+ __isPatched: true
55
+ }
56
+ );
57
+ }
58
+
59
+ globalThisRecord['__extractDefault'] ??= extractDefault;
60
+
61
+ ensureBrowserProcess();
62
+
63
+ function extractDefault(module) {
64
+ return module && module.__esModule && 'default' in module ? module.default : module;
65
+ }
66
+
67
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
68
+ '@codemirror/autocomplete',
69
+ '@codemirror/collab',
70
+ '@codemirror/commands',
71
+ '@codemirror/language',
72
+ '@codemirror/lint',
73
+ '@codemirror/search',
74
+ '@codemirror/state',
75
+ '@codemirror/text',
76
+ '@codemirror/view',
77
+ '@lezer/common',
78
+ '@lezer/highlight',
79
+ '@lezer/lr',
80
+ 'obsidian']
81
+ );
82
+
83
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
84
+ '@codemirror/closebrackets',
85
+ '@codemirror/comment',
86
+ '@codemirror/fold',
87
+ '@codemirror/gutter',
88
+ '@codemirror/highlight',
89
+ '@codemirror/history',
90
+ '@codemirror/matchbrackets',
91
+ '@codemirror/panel',
92
+ '@codemirror/rangeset',
93
+ '@codemirror/rectangular-selection',
94
+ '@codemirror/stream-parser',
95
+ '@codemirror/tooltip']
96
+ );
97
+
98
+ function requirePatched(id) {
99
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
100
+ return originalRequire?.(id);
101
+ }
102
+
103
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
104
+ if (globalThis.app.isMobile) {
105
+ if (id === 'process' || id === 'node:process') {
106
+ // eslint-disable-next-line no-console -- Valid usage.
107
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
108
+
109
+ return process;
110
+ }
111
+ } else {
112
+ const module = originalRequire?.(id);
113
+ if (module) {
114
+ return extractDefault(module);
115
+ }
116
+ }
117
+
118
+ // eslint-disable-next-line no-console -- Valid usage.
119
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
120
+ return {};
121
+ }
122
+ })();
123
+ })();
124
+
125
+ "use strict";
126
+ var __defProp = Object.defineProperty;
127
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
128
+ var __getOwnPropNames = Object.getOwnPropertyNames;
129
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
130
+ var __export = (target, all) => {
131
+ for (var name in all)
132
+ __defProp(target, name, { get: all[name], enumerable: true });
133
+ };
134
+ var __copyProps = (to, from, except, desc) => {
135
+ if (from && typeof from === "object" || typeof from === "function") {
136
+ for (let key of __getOwnPropNames(from))
137
+ if (!__hasOwnProp.call(to, key) && key !== except)
138
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
139
+ }
140
+ return to;
141
+ };
142
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
143
+ var demo_vault_naming_exports = {};
144
+ __export(demo_vault_naming_exports, {
145
+ getDemoVaultArchiveFileName: () => getDemoVaultArchiveFileName,
146
+ getDemoVaultFolderName: () => getDemoVaultFolderName
147
+ });
148
+ module.exports = __toCommonJS(demo_vault_naming_exports);
149
+ function getDemoVaultArchiveFileName(pluginId) {
150
+ return `${getDemoVaultBaseName(pluginId)}.zip`;
151
+ }
152
+ function getDemoVaultFolderName(params) {
153
+ const {
154
+ pluginId,
155
+ version
156
+ } = params;
157
+ return `${getDemoVaultBaseName(pluginId)}-${version}`;
158
+ }
159
+ function getDemoVaultBaseName(pluginId) {
160
+ return `${pluginId}-demo-vault`;
161
+ }
162
+ // Annotate the CommonJS export names for ESM import in node:
163
+ 0 && (module.exports = {
164
+ getDemoVaultArchiveFileName,
165
+ getDemoVaultFolderName
166
+ });
167
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2RlbW8tdmF1bHQtbmFtaW5nLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIG5hbWVzIGEgcGx1Z2luJ3MgZGVtby12YXVsdCByZWxlYXNlIGFydGlmYWN0IGNhcnJpZXMgXHUyMDE0IHRoZSBvbmUgY29udHJhY3QgYmV0d2VlbiB0aGUgcmVsZWFzZS10aW1lXG4gKiBwYWNrYWdpbmcgc3RlcCBhbmQgdGhlIHJ1bnRpbWUgb3BlbmVyLlxuICpcbiAqIFRoZSB0d28gbGl2ZSBmYXIgYXBhcnQ6IGBzY3JpcHQtdXRpbHMvZGVtby12YXVsdC50c2AgcnVucyB1bmRlciBOb2RlIGF0IHJlbGVhc2UgdGltZSBhbmQgV1JJVEVTIHRoZVxuICogYXJjaGl2ZSwgd2hpbGUgYGRlc2t0b3AtZGVtby12YXVsdC1vcGVuZXIudHNgIHJ1bnMgaW5zaWRlIE9ic2lkaWFuIGFuZCBET1dOTE9BRFMgaXQgYnkgbmFtZS4gVGhleSB1c2VkXG4gKiB0byBhZ3JlZSBieSBhIGNvbW1lbnQgb24gZWFjaCBzaWRlIHNheWluZyB0aGUgb3RoZXIgbXVzdCBiZSBjaGFuZ2VkIHRvbywgd2hpY2ggaXMgZXhhY3RseSB0aGUgc29ydCBvZlxuICogcGFpcmluZyB0aGF0IHN1cnZpdmVzIHVudGlsIHRoZSBkYXkgaXQgZG9lcyBub3QuIEJvdGggbm93IGRlcml2ZSBldmVyeSBzaGFyZWQgbmFtZSBmcm9tIGhlcmUuXG4gKlxuICogS2VwdCBmcmVlIG9mIGBvYnNpZGlhbmAgYW5kIGBub2RlOmAgaW1wb3J0cyBvbiBwdXJwb3NlOiB0aGUgcGFja2FnaW5nIHN0ZXAgcnVucyB1bmRlciBOb2RlLCB3aGVyZSB0aGVcbiAqIGBvYnNpZGlhbmAgbW9kdWxlIGRvZXMgbm90IGV4aXN0LCBhbmQgdGhlIG9wZW5lciBzaXRzIGluIHRoZSBnZW5lcmF0ZWQgYmFycmVscywgd2hpY2ggbXVzdCBzdGF5IHNhZmUgdG9cbiAqIGV2YWx1YXRlIG9uIG1vYmlsZS5cbiAqL1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXREZW1vVmF1bHRGb2xkZXJOYW1lfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXREZW1vVmF1bHRGb2xkZXJOYW1lUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaWQgdGhlIHZhdWx0IGRlbW9uc3RyYXRlcywgZnJvbSB0aGF0IHBsdWdpbidzIGBtYW5pZmVzdC5qc29uYC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gdmVyc2lvbiB0aGUgdmF1bHQgc2hpcHMgd2l0aC5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZmlsZSBuYW1lIG9mIHRoZSBkZW1vLXZhdWx0IGFyY2hpdmUgYXR0YWNoZWQgdG8gYSBwbHVnaW4ncyBHaXRIdWIgcmVsZWFzZS5cbiAqXG4gKiBDYXJyaWVzIHRoZSBwbHVnaW4gaWQgc28gc2V2ZXJhbCBwbHVnaW5zJyBkZW1vIHZhdWx0cyBuZXZlciBjb2xsaWRlLCBhbmQgZGVsaWJlcmF0ZWx5IE5PVCB0aGUgdmVyc2lvbjpcbiAqIGEgcmVsZWFzZSBhc3NldCBpcyBhbHJlYWR5IG5hbWVzcGFjZWQgYnkgaXRzIHJlbGVhc2UgdGFnIChgXHUyMDI2L3JlbGVhc2VzL2Rvd25sb2FkLzx2ZXJzaW9uPi9cdTIwMjZgKSwgc28gdGhlXG4gKiB2ZXJzaW9uIGJvdWdodCBubyBkaXNhbWJpZ3VhdGlvbiB3aGlsZSBtYWtpbmcgdGhlIGFzc2V0IG5hbWUgY2hhbmdlIG9uIGV2ZXJ5IHJlbGVhc2UgXHUyMDE0IHdoaWNoIGlzIHdoYXRcbiAqIGJyb2tlIHRoZSBDb21tdW5pdHkgZGlyZWN0b3J5J3MgZmluZGluZyBvdmVycmlkZXMsIHdob3NlIGZpbmdlcnByaW50IGluY2x1ZGVzIHRoZSBuYW1lLiBUaGUgdmVyc2lvblxuICogbGl2ZXMgaW5zaWRlIHRoZSBhcmNoaXZlIGluc3RlYWQsIGFzIHtAbGluayBnZXREZW1vVmF1bHRGb2xkZXJOYW1lfSBhbmQgb24gdGhlIFJFQURNRSdzIGhlYWRpbmcuXG4gKlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIHBsdWdpbiBpZCB0aGUgdmF1bHQgZGVtb25zdHJhdGVzLlxuICogQHJldHVybnMgVGhlIGFyY2hpdmUgZmlsZSBuYW1lLCBlLmcuIGBteS1wbHVnaW4tZGVtby12YXVsdC56aXBgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVtb1ZhdWx0QXJjaGl2ZUZpbGVOYW1lKHBsdWdpbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Z2V0RGVtb1ZhdWx0QmFzZU5hbWUocGx1Z2luSWQpfS56aXBgO1xufVxuXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBkZW1vIHZhdWx0J3Mgb3duIGZvbGRlciBcdTIwMTQgdGhlIGFyY2hpdmUncyBzaW5nbGUgdG9wLWxldmVsIGVudHJ5LCBhbmQgdGhlIGZvbGRlciB0aGVcbiAqIG9wZW5lciBleHRyYWN0cyBpdCB0by5cbiAqXG4gKiBPbmUgbmFtZSBzZXJ2ZXMgYm90aCBiZWNhdXNlIHRoZXkgYXJlIHRoZSBzYW1lIGZvbGRlciBzZWVuIHR3aWNlOiBhIHVzZXIgd2hvIHVuemlwcyB0aGUgYXJjaGl2ZSBieSBoYW5kXG4gKiBnZXRzIGEgc2VsZi1kZXNjcmliaW5nLCB2ZXJzaW9uLWRpc3RpbmN0IGZvbGRlciByYXRoZXIgdGhhbiBhbiBhbm9ueW1vdXMgb25lLCBhbmQgYSB1c2VyIHdobyBydW5zIHRoZVxuICogYE9wZW4gZGVtbyB2YXVsdGAgY29tbWFuZCBzZWVzIHRoYXQgc2FtZSBuYW1lIGluIE9ic2lkaWFuJ3MgdmF1bHQgc3dpdGNoZXIuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgR2V0RGVtb1ZhdWx0Rm9sZGVyTmFtZVBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgZm9sZGVyIG5hbWUsIGUuZy4gYG15LXBsdWdpbi1kZW1vLXZhdWx0LTEuMi4zYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbW9WYXVsdEZvbGRlck5hbWUocGFyYW1zOiBHZXREZW1vVmF1bHRGb2xkZXJOYW1lUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3Qge1xuICAgIHBsdWdpbklkLFxuICAgIHZlcnNpb25cbiAgfSA9IHBhcmFtcztcbiAgcmV0dXJuIGAke2dldERlbW9WYXVsdEJhc2VOYW1lKHBsdWdpbklkKX0tJHt2ZXJzaW9ufWA7XG59XG5cbmZ1bmN0aW9uIGdldERlbW9WYXVsdEJhc2VOYW1lKHBsdWdpbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7cGx1Z2luSWR9LWRlbW8tdmF1bHRgO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTJDTyxTQUFTLDRCQUE0QixVQUEwQjtBQUNwRSxTQUFPLEdBQUcscUJBQXFCLFFBQVEsQ0FBQztBQUMxQztBQWFPLFNBQVMsdUJBQXVCLFFBQThDO0FBQ25GLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUNKLFNBQU8sR0FBRyxxQkFBcUIsUUFBUSxDQUFDLElBQUksT0FBTztBQUNyRDtBQUVBLFNBQVMscUJBQXFCLFVBQTBCO0FBQ3RELFNBQU8sR0FBRyxRQUFRO0FBQ3BCOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,54 @@
1
+ /// <reference path="../library.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The names a plugin's demo-vault release artifact carries — the one contract between the release-time
6
+ * packaging step and the runtime opener.
7
+ *
8
+ * The two live far apart: `script-utils/demo-vault.ts` runs under Node at release time and WRITES the
9
+ * archive, while `desktop-demo-vault-opener.ts` runs inside Obsidian and DOWNLOADS it by name. They used
10
+ * to agree by a comment on each side saying the other must be changed too, which is exactly the sort of
11
+ * pairing that survives until the day it does not. Both now derive every shared name from here.
12
+ *
13
+ * Kept free of `obsidian` and `node:` imports on purpose: the packaging step runs under Node, where the
14
+ * `obsidian` module does not exist, and the opener sits in the generated barrels, which must stay safe to
15
+ * evaluate on mobile.
16
+ */
17
+ /**
18
+ * Parameters for {@link getDemoVaultFolderName}.
19
+ */
20
+ export interface GetDemoVaultFolderNameParams {
21
+ /**
22
+ * The plugin id the vault demonstrates, from that plugin's `manifest.json`.
23
+ */
24
+ readonly pluginId: string;
25
+ /**
26
+ * The plugin version the vault ships with.
27
+ */
28
+ readonly version: string;
29
+ }
30
+ /**
31
+ * The file name of the demo-vault archive attached to a plugin's GitHub release.
32
+ *
33
+ * Carries the plugin id so several plugins' demo vaults never collide, and deliberately NOT the version:
34
+ * a release asset is already namespaced by its release tag (`…/releases/download/<version>/…`), so the
35
+ * version bought no disambiguation while making the asset name change on every release — which is what
36
+ * broke the Community directory's finding overrides, whose fingerprint includes the name. The version
37
+ * lives inside the archive instead, as {@link getDemoVaultFolderName} and on the README's heading.
38
+ *
39
+ * @param pluginId - The plugin id the vault demonstrates.
40
+ * @returns The archive file name, e.g. `my-plugin-demo-vault.zip`.
41
+ */
42
+ export declare function getDemoVaultArchiveFileName(pluginId: string): string;
43
+ /**
44
+ * The name of the demo vault's own folder — the archive's single top-level entry, and the folder the
45
+ * opener extracts it to.
46
+ *
47
+ * One name serves both because they are the same folder seen twice: a user who unzips the archive by hand
48
+ * gets a self-describing, version-distinct folder rather than an anonymous one, and a user who runs the
49
+ * `Open demo vault` command sees that same name in Obsidian's vault switcher.
50
+ *
51
+ * @param params - The {@link GetDemoVaultFolderNameParams}.
52
+ * @returns The folder name, e.g. `my-plugin-demo-vault-1.2.3`.
53
+ */
54
+ export declare function getDemoVaultFolderName(params: GetDemoVaultFolderNameParams): string;
@@ -123,11 +123,9 @@ function keepName($unknown) {
123
123
  })();
124
124
 
125
125
  "use strict";
126
- var __create = Object.create;
127
126
  var __defProp = Object.defineProperty;
128
127
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
129
128
  var __getOwnPropNames = Object.getOwnPropertyNames;
130
- var __getProtoOf = Object.getPrototypeOf;
131
129
  var __hasOwnProp = Object.prototype.hasOwnProperty;
132
130
  var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
133
131
  var __typeError = (msg) => {
@@ -145,14 +143,6 @@ var __copyProps = (to, from, except, desc) => {
145
143
  }
146
144
  return to;
147
145
  };
148
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
149
- // If the importer is in node compatibility mode or this is not an ESM
150
- // file that has been converted to a CommonJS file using a Babel-
151
- // compatible transform (i.e. "__esModule" has not been set), then set
152
- // "default" to the CommonJS "module.exports" for node compatibility.
153
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
154
- mod
155
- ));
156
146
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
157
147
  var __using = (stack, value, async) => {
158
148
  if (value != null) {
@@ -205,9 +195,11 @@ var import_node_buffer = require('node:buffer');
205
195
  var import_node_fs = require('node:fs');
206
196
  var import_node_os = require('node:os');
207
197
  var import_obsidian = require('obsidian');
198
+ var import_desktop_zip_extractor = require('../desktop-zip-extractor.cjs');
208
199
  var import_path = require('../path.cjs');
209
200
  var import_community_plugins = require('./community-plugins.cjs');
210
201
  var import_plugin_notice_component = require('./components/plugin-notice-component.cjs');
202
+ var import_demo_vault_naming = require('./demo-vault-naming.cjs');
211
203
  var import_select_option = require('./modals/select-option.cjs');
212
204
  const DEMO_VAULTS_CACHE_FOLDER = "obsidian-demo-vaults";
213
205
  const ARCHIVES_SUBFOLDER = "archives";
@@ -278,7 +270,7 @@ async function openDemoVault(params) {
278
270
  }
279
271
  progressNotice.setContent(`Extracting demo vault for ${pluginName} v${versionToOpen}\u2026`);
280
272
  cleanupOrphanedExtractedVaults();
281
- const vaultDirectory = await extractDemoVaultToFreshFolder({
273
+ const vaultDirectory = extractDemoVaultToFreshFolder({
282
274
  archive,
283
275
  pluginId,
284
276
  version: versionToOpen
@@ -308,20 +300,27 @@ function cleanupOrphanedExtractedVaults() {
308
300
  }
309
301
  }
310
302
  }
311
- async function extractDemoVaultArchive(archive, targetDirectory) {
312
- const { default: AdmZip } = await import("adm-zip");
303
+ function extractDemoVaultArchive(archive, targetDirectory) {
313
304
  const originalFs = window.require('node:original-fs');
314
- const zip = new AdmZip(archive, { fs: originalFs });
315
- zip.extractAllTo(targetDirectory, true);
305
+ (0, import_desktop_zip_extractor.extractZipArchive)({
306
+ archive,
307
+ fileSystem: originalFs,
308
+ targetDirectory
309
+ });
316
310
  }
317
- async function extractDemoVaultToFreshFolder(params) {
311
+ function extractDemoVaultToFreshFolder(params) {
318
312
  const { archive, pluginId, version } = params;
319
313
  const extractedVaultsRoot = (0, import_path.join)((0, import_node_os.tmpdir)(), DEMO_VAULTS_CACHE_FOLDER, EXTRACTED_VAULTS_SUBFOLDER);
320
314
  (0, import_node_fs.mkdirSync)(extractedVaultsRoot, { recursive: true });
321
315
  const uniqueParentDirectory = (0, import_node_fs.mkdtempSync)((0, import_path.join)(extractedVaultsRoot, `${pluginId}-${version}-`));
322
- const vaultDirectory = (0, import_path.join)(uniqueParentDirectory, `${pluginId}-${version}.demo-vault`);
323
- await extractDemoVaultArchive(archive, vaultDirectory);
324
- return vaultDirectory;
316
+ extractDemoVaultArchive(archive, uniqueParentDirectory);
317
+ return (0, import_path.join)(
318
+ uniqueParentDirectory,
319
+ (0, import_demo_vault_naming.getDemoVaultFolderName)({
320
+ pluginId,
321
+ version
322
+ })
323
+ );
325
324
  }
326
325
  async function resolveDemoVaultArchive(params) {
327
326
  const {
@@ -338,7 +337,7 @@ async function resolveDemoVaultArchive(params) {
338
337
  return (0, import_node_fs.readFileSync)(archivePath);
339
338
  }
340
339
  progressNotice.setContent(`Downloading demo vault for ${pluginName} v${version}\u2026`);
341
- const assetUrl = `https://github.com/${repo}/releases/download/${version}/${pluginId}-demo-vault-${version}.zip`;
340
+ const assetUrl = `https://github.com/${repo}/releases/download/${version}/${(0, import_demo_vault_naming.getDemoVaultArchiveFileName)(pluginId)}`;
342
341
  const response = await (0, import_obsidian.requestUrl)({
343
342
  throw: false,
344
343
  url: assetUrl
@@ -356,4 +355,4 @@ async function resolveDemoVaultArchive(params) {
356
355
  0 && (module.exports = {
357
356
  openDemoVault
358
357
  });
359
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2Rlc2t0b3AtZGVtby12YXVsdC1vcGVuZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEb3dubG9hZHMgYW5kIG9wZW5zIGEgcGx1Z2luJ3Mgc2hpcHBlZCBkZW1vIHZhdWx0IGluIGEgbmV3IE9ic2lkaWFuIHdpbmRvdyAoZGVza3RvcCBvbmx5KS5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gYXR0YWNoIGEgYDxwbHVnaW4taWQ+LWRlbW8tdmF1bHQtPHZlcnNpb24+LnppcGAgYXJjaGl2ZSB0byBlYWNoIEdpdEh1YiByZWxlYXNlIChzZWVcbiAqIGBhcmNoaXZlUGx1Z2luRGVtb1ZhdWx0YCBpbiBgc2NyaXB0LXV0aWxzL2RlbW8tdmF1bHQudHNgKS4gVGhpcyByZXNvbHZlcyB0aGUgcGx1Z2luJ3MgcmVwb3NpdG9yeVxuICogZnJvbSBPYnNpZGlhbidzIGNvbW11bml0eSByZWdpc3RyeSwgZG93bmxvYWRzIHRoZSBhcmNoaXZlIGZvciB0aGUgY2hvc2VuIHZlcnNpb24sIGFuZCBvcGVucyBpdCBhcyBhXG4gKiB2YXVsdCBpbiBhIG5ldyB3aW5kb3cuIFdoZW4gdGhlIGluc3RhbGxlZCBwbHVnaW4gdmVyc2lvbiBpcyBiZWhpbmQgdGhlIGxhdGVzdCByZWxlYXNlLCB0aGUgdXNlciBpc1xuICogb2ZmZXJlZCBhIGNob2ljZSBiZXR3ZWVuIHRoZSB0d28gdmVyc2lvbnMuXG4gKlxuICogQSBwcm9ncmVzcyBub3RpY2UgaXMgc2hvd24gaW1tZWRpYXRlbHkgKGRvd25sb2FkICsgZXh0cmFjdGlvbiBjYW4gdGFrZSBhIHdoaWxlLCBzbyB0aGUgdXNlciBtdXN0IHNlZVxuICogc29tZXRoaW5nIGlzIGhhcHBlbmluZyByaWdodCBhd2F5KS4gT25seSB0aGUgZG93bmxvYWRlZCBBUkNISVZFIGlzIGNhY2hlZCAodW5kZXIgdGhlIE9TIHRlbXBcbiAqIGRpcmVjdG9yeSk7IGV2ZXJ5IGludm9jYXRpb24gZXh0cmFjdHMgYSBGUkVTSCBjb3B5IGludG8gaXRzIG93biB0ZW1wb3JhcnkgZm9sZGVyIGFuZCBvcGVucyB0aGF0LCBzbyBhXG4gKiBwcmV2aW91cyBzZXNzaW9uJ3MgZWRpdHMgbmV2ZXIgbGVhayBpbnRvIGEgbmV3IG9uZS4gVGhlIGV4dHJhY3RlZCB2YXVsdCBmb2xkZXIgaXMgbmFtZWRcbiAqIGA8cGx1Z2luLWlkPi08dmVyc2lvbj4uZGVtby12YXVsdGAgc28gaXQgcmVhZHMgbmljZWx5IGluIE9ic2lkaWFuJ3MgdmF1bHQgc3dpdGNoZXIuIE9ycGhhbmVkXG4gKiBleHRyYWN0ZWQgZm9sZGVycyBsZWZ0IG92ZXIgZnJvbSBlYXJsaWVyIHNlc3Npb25zIGFyZSBjbGVhbmVkIHVwIChiZXN0LWVmZm9ydCkgb24gZWFjaCBvcGVuLlxuICpcbiAqICoqYGFkbS16aXBgIGlzIGxvYWRlZCBsYXppbHksIGFuZCBtdXN0IHN0YXkgdGhhdCB3YXkuKiogVGhlIGBub2RlOmAgaW1wb3J0cyBiZWxvdyBhcmUgc2FmZSB0byBtZXJlbHlcbiAqIGV2YWx1YXRlIG9uIG1vYmlsZSBcdTIwMTQgYHJlcXVpcmVgIGhhbmRzIGJhY2sgYHVuZGVmaW5lZGAgdGhlcmUgYW5kIG5vdGhpbmcgcmVhZHMgaXQgYXQgbG9hZCB0aW1lIFx1MjAxNCBidXRcbiAqIGBhZG0temlwYCdzIHppcC1jcnlwdG8gbWV0aG9kIG9wZW5zIHdpdGggYSB0b3AtbGV2ZWwgYGNvbnN0IHsgcmFuZG9tRmlsbFN5bmMgfSA9IHJlcXVpcmUoJ2NyeXB0bycpYCxcbiAqIHdoaWNoIHRocm93cyB0aGUgbW9tZW50IHRoZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQuIEJlY2F1c2UgdGhlIGdlbmVyYXRlZCBiYXJyZWxzIHJlLWV4cG9ydCB0aGlzIG1vZHVsZSxcbiAqIGEgc3RhdGljIGBpbXBvcnQgQWRtWmlwIGZyb20gJ2FkbS16aXAnYCB0aGVyZWZvcmUga2lsbGVkIHRoZSB3aG9sZSBsaWJyYXJ5J3MgbG9hZCBvbiBBbmRyb2lkIChzZWUgdGhlXG4gKiBtb2JpbGUtbG9hZCBjaGVjayBpbiBgc2NyaXB0cy9oZWxwZXJzL2Fzc2VydC1tb2JpbGUtbG9hZGFibGUtYnVuZGxlLnRzYCwgd2hpY2ggZmFpbHMgdGhlIGJ1aWxkIG9uXG4gKiBleGFjdGx5IHRoYXQpLiBBbnkgZnV0dXJlIGRlcGVuZGVuY3kgdGhhdCB0b3VjaGVzIGEgcGxhdGZvcm0tb25seSBBUEkgd2hpbGUgaW5pdGlhbGl6aW5nIGhhcyB0byBiZVxuICogZGVmZXJyZWQgdGhlIHNhbWUgd2F5LlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC14L25vLW5vZGVqcy1tb2R1bGVzIC0tIERlc2t0b3Atb25seSBmZWF0dXJlIGdhdGVkIGJ5IGBQbGF0Zm9ybS5pc0Rlc2t0b3BBcHBgOyB0aGUgY29tbWFuZCBpcyBoaWRkZW4gb24gbW9iaWxlIHNvIHRoZXNlIE5vZGUgQVBJcyBhcmUgbmV2ZXIgcmVhY2hlZCB0aGVyZS4gKi9cbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ25vZGU6YnVmZmVyJztcbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgbWtkdGVtcFN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHJtU3luYyxcbiAgc3RhdFN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbi8qIGVzbGludC1lbmFibGUgaW1wb3J0LXgvbm8tbm9kZWpzLW1vZHVsZXMgLS0gRGVza3RvcC1vbmx5IGZlYXR1cmUgZ2F0ZWQgYnkgYFBsYXRmb3JtLmlzRGVza3RvcEFwcGA7IHRoZSBjb21tYW5kIGlzIGhpZGRlbiBvbiBtb2JpbGUgc28gdGhlc2UgTm9kZSBBUElzIGFyZSBuZXZlciByZWFjaGVkIHRoZXJlLiAqL1xuaW1wb3J0IHsgcmVxdWVzdFVybCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBQbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gIFBsdWdpbk5vdGljZUNvbXBvbmVudERlbGF5ZWROb3RpY2Vcbn0gZnJvbSAnLi9jb21wb25lbnRzL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgam9pbiB9IGZyb20gJy4uL3BhdGgudHMnO1xuaW1wb3J0IHtcbiAgZ2V0Q29tbXVuaXR5UGx1Z2luUmVwbyxcbiAgZ2V0TGF0ZXN0UmVsZWFzZVZlcnNpb25cbn0gZnJvbSAnLi9jb21tdW5pdHktcGx1Z2lucy50cyc7XG5pbXBvcnQgeyBQbHVnaW5Ob3RpY2VNb2RlIH0gZnJvbSAnLi9jb21wb25lbnRzL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IHNlbGVjdE9wdGlvbiB9IGZyb20gJy4vbW9kYWxzL3NlbGVjdC1vcHRpb24udHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBvcGVuRGVtb1ZhdWx0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuRGVtb1ZhdWx0UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBpZCwgdXNlZCB0byBsb2NhdGUgdGhlIEdpdEh1YiByZXBvc2l0b3J5LCB0byBuYW1lIHRoZSBhcmNoaXZlIGFzc2V0LCBhbmQgdG8gbmFtZSB0aGVcbiAgICogY2FjaGVkIGFyY2hpdmUgYW5kIHRoZSBleHRyYWN0ZWQgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBkaXNwbGF5IG5hbWUsIHVzZWQgdG8gbGFiZWwgdGhlIG5vdGljZXMgYW5kIHRoZSB2ZXJzaW9uLWNob2ljZSBkaWFsb2cuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBub3RpY2UgY29tcG9uZW50IHVzZWQgdG8gcmVwb3J0IHByb2dyZXNzIGFuZCBwcm9ibGVtcyAocGx1Z2luIG5vdCBpbiB0aGUgcmVnaXN0cnksIG1pc3NpbmdcbiAgICogYXJjaGl2ZSkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnRseSBpbnN0YWxsZWQgcGx1Z2luIHZlcnNpb24sIG9mZmVyZWQgYXMgb25lIG9mIHRoZSB2ZXJzaW9uIGNob2ljZXMuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5WZXJzaW9uOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBFeHRyYWN0RGVtb1ZhdWx0VG9GcmVzaEZvbGRlclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFyY2hpdmU6IEJ1ZmZlcjtcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUmVzb2x2ZURlbW9WYXVsdEFyY2hpdmVQYXJhbXMge1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICByZWFkb25seSBwcm9ncmVzc05vdGljZTogUGx1Z2luTm90aWNlQ29tcG9uZW50RGVsYXllZE5vdGljZTtcbiAgcmVhZG9ubHkgcmVwbzogc3RyaW5nO1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbmNvbnN0IERFTU9fVkFVTFRTX0NBQ0hFX0ZPTERFUiA9ICdvYnNpZGlhbi1kZW1vLXZhdWx0cyc7XG5jb25zdCBBUkNISVZFU19TVUJGT0xERVIgPSAnYXJjaGl2ZXMnO1xuY29uc3QgRVhUUkFDVEVEX1ZBVUxUU19TVUJGT0xERVIgPSAnZXh0cmFjdGVkJztcbmNvbnN0IEhUVFBfU1RBVFVTX09LID0gMjAwO1xuLy8gT25lIGRheSBpbiBtaWxsaXNlY29uZHMgKDI0ICogNjAgKiA2MCAqIDEwMDApLlxuY29uc3QgT1JQSEFORURfRVhUUkFDVEVEX1ZBVUxUX01BWF9BR0VfSU5fTUlMTElTRUNPTkRTID0gODZfNDAwXzAwMDtcblxuLyoqXG4gKiBEb3dubG9hZHMgYW5kIG9wZW5zIHRoZSBwbHVnaW4ncyBkZW1vIHZhdWx0IGluIGEgbmV3IE9ic2lkaWFuIHdpbmRvdy4gRGVza3RvcCBvbmx5LlxuICpcbiAqIElmIHRoZSBpbnN0YWxsZWQgcGx1Z2luIHZlcnNpb24gaXMgdGhlIGxhdGVzdCAob3IgbmV3ZXIpLCBpdHMgZGVtbyB2YXVsdCBvcGVucyBkaXJlY3RseTsgb3RoZXJ3aXNlXG4gKiB0aGUgdXNlciBjaG9vc2VzIGJldHdlZW4gdGhlIGxhdGVzdCBhbmQgdGhlIGN1cnJlbnRseS1pbnN0YWxsZWQgdmVyc2lvbi4gQSBwcm9ncmVzcyBub3RpY2UgaXMgc2hvd25cbiAqIGltbWVkaWF0ZWx5LiBUaGUgY2hvc2VuIHZlcnNpb24ncyBhcmNoaXZlIGlzIGRvd25sb2FkZWQgb25jZSAodGhlbiByZXVzZWQgZnJvbSB0aGUgYXJjaGl2ZSBjYWNoZSksXG4gKiBidXQgYSBmcmVzaCBjb3B5IGlzIGV4dHJhY3RlZCBpbnRvIGl0cyBvd24gdGVtcG9yYXJ5IGZvbGRlciBvbiBldmVyeSBvcGVuIFx1MjAxNCB0aGUgdmF1bHQgaXMgbmV2ZXIgcmV1c2VkXG4gKiBhY3Jvc3Mgc2Vzc2lvbnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgT3BlbkRlbW9WYXVsdFBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHZhdWx0IGhhcyBiZWVuIG9wZW5lZCwgb3Igb25jZSB0aGUgb3BlcmF0aW9uIGhhc1xuICogYmVlbiByZXBvcnRlZCBhcyBub3QgcG9zc2libGUgKG5vdGljZSBzaG93bikgb3IgY2FuY2VsbGVkIGJ5IHRoZSB1c2VyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlbkRlbW9WYXVsdChwYXJhbXM6IE9wZW5EZW1vVmF1bHRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBwbHVnaW5JZCxcbiAgICBwbHVnaW5OYW1lLFxuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICBwbHVnaW5WZXJzaW9uXG4gIH0gPSBwYXJhbXM7XG5cbiAgLy8gU2hvd24gaW1tZWRpYXRlbHkgKGBkZWxheUluTWlsbGlzZWNvbmRzOiAwYCk6IHJlc29sdmluZyB0aGUgcmVsZWFzZSwgZG93bmxvYWRpbmcgYW5kIGV4dHJhY3RpbmcgY2FuXG4gIC8vIEVhY2ggdGFrZSBhIHdoaWxlLCBzbyB0aGUgdXNlciBtdXN0IHNlZSBwcm9ncmVzcyB0aGUgbW9tZW50IHRoZSBjb21tYW5kIGlzIGludm9rZWQuXG4gIC8vXG4gIC8vIEtlcHQgb3V0IG9mIHRoZSBzaGFyZWQgc2xvdCAoYFNlcGFyYXRlYCksIGJlY2F1c2UgdGhpcyB2ZXJ5IGZ1bmN0aW9uIHJhaXNlcyBvcmRpbmFyeSBub3RpY2VzIHdoaWxlXG4gIC8vIFRoZSBvcGVyYXRpb24gaXMgc3RpbGwgcnVubmluZyBcdTIwMTQgXCJub3QgaW4gdGhlIHJlZ2lzdHJ5XCIsIFwibm8gZGVtbyB2YXVsdCBmb3IgdGhpcyB2ZXJzaW9uXCIgXHUyMDE0IGFuZCBhXG4gIC8vIFNsb3Qgbm90aWNlIHdvdWxkIGhpZGUgdGhlIHByb2dyZXNzIG5vdGljZSByYXRoZXIgdGhhbiBhcHBlYXIgYmVzaWRlIGl0LlxuICB1c2luZyBwcm9ncmVzc05vdGljZSA9IHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlQWZ0ZXJEZWxheSh7XG4gICAgY29udGVudDogYE9wZW5pbmcgZGVtbyB2YXVsdCBmb3IgJHtwbHVnaW5OYW1lfVx1MjAyNmAsXG4gICAgZGVsYXlJbk1pbGxpc2Vjb25kczogMCxcbiAgICBtb2RlOiBQbHVnaW5Ob3RpY2VNb2RlLlNlcGFyYXRlXG4gIH0pO1xuXG4gIGNvbnN0IHJlcG8gPSBhd2FpdCBnZXRDb21tdW5pdHlQbHVnaW5SZXBvKHBsdWdpbklkKTtcbiAgaWYgKCFyZXBvKSB7XG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UoYENvdWxkIG5vdCBmaW5kIHBsdWdpbiAke3BsdWdpbk5hbWV9IGluIHRoZSBjb21tdW5pdHkgcGx1Z2lucyByZWdpc3RyeS5gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjdXJyZW50VmVyc2lvbiA9IHBsdWdpblZlcnNpb247XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBhd2FpdCBnZXRMYXRlc3RSZWxlYXNlVmVyc2lvbihyZXBvKTtcblxuICBsZXQgdmVyc2lvblRvT3Blbjogc3RyaW5nO1xuICBpZiAoY29tcGFyZVZlcnNpb25zKGN1cnJlbnRWZXJzaW9uLCBsYXRlc3RWZXJzaW9uKSA+PSAwKSB7XG4gICAgdmVyc2lvblRvT3BlbiA9IGN1cnJlbnRWZXJzaW9uO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGNob3NlblZlcnNpb24gPSBhd2FpdCBzZWxlY3RPcHRpb248bnVsbCB8IHN0cmluZz4oe1xuICAgICAgYXBwLFxuICAgICAgbWVzc2FnZTogYEN1cnJlbnQgdmVyc2lvbiBvZiBwbHVnaW4gJHtwbHVnaW5OYW1lfSB2JHtjdXJyZW50VmVyc2lvbn0gaXMgbm90IHRoZSBsYXRlc3QgKHYke2xhdGVzdFZlcnNpb259KWAsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBpc0N0YTogdHJ1ZSxcbiAgICAgICAgICB0ZXh0OiBgT3BlbiBkZW1vIHZhdWx0IGZvciBsYXRlc3QgdmVyc2lvbiAodiR7bGF0ZXN0VmVyc2lvbn0pYCxcbiAgICAgICAgICB2YWx1ZTogbGF0ZXN0VmVyc2lvblxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogYE9wZW4gZGVtbyB2YXVsdCBmb3IgY3VycmVudCB2ZXJzaW9uICh2JHtjdXJyZW50VmVyc2lvbn0pYCxcbiAgICAgICAgICB2YWx1ZTogY3VycmVudFZlcnNpb25cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6ICdDYW5jZWwnLFxuICAgICAgICAgIHZhbHVlOiBudWxsXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICB0aXRsZTogcGx1Z2luTmFtZVxuICAgIH0pO1xuICAgIGlmIChjaG9zZW5WZXJzaW9uID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZlcnNpb25Ub09wZW4gPSBjaG9zZW5WZXJzaW9uO1xuICB9XG5cbiAgY29uc3QgYXJjaGl2ZSA9IGF3YWl0IHJlc29sdmVEZW1vVmF1bHRBcmNoaXZlKHtcbiAgICBwbHVnaW5JZCxcbiAgICBwbHVnaW5OYW1lLFxuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICBwcm9ncmVzc05vdGljZSxcbiAgICByZXBvLFxuICAgIHZlcnNpb246IHZlcnNpb25Ub09wZW5cbiAgfSk7XG4gIGlmICghYXJjaGl2ZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHByb2dyZXNzTm90aWNlLnNldENvbnRlbnQoYEV4dHJhY3RpbmcgZGVtbyB2YXVsdCBmb3IgJHtwbHVnaW5OYW1lfSB2JHt2ZXJzaW9uVG9PcGVufVx1MjAyNmApO1xuICBjbGVhbnVwT3JwaGFuZWRFeHRyYWN0ZWRWYXVsdHMoKTtcbiAgY29uc3QgdmF1bHREaXJlY3RvcnkgPSBhd2FpdCBleHRyYWN0RGVtb1ZhdWx0VG9GcmVzaEZvbGRlcih7XG4gICAgYXJjaGl2ZSxcbiAgICBwbHVnaW5JZCxcbiAgICB2ZXJzaW9uOiB2ZXJzaW9uVG9PcGVuXG4gIH0pO1xuXG4gIHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYygndmF1bHQtb3BlbicsIHZhdWx0RGlyZWN0b3J5LCBmYWxzZSk7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBleHRyYWN0ZWQgZGVtby12YXVsdCBmb2xkZXJzIGxlZnQgb3ZlciBmcm9tIGVhcmxpZXIgc2Vzc2lvbnMgKGJlc3QtZWZmb3J0KS5cbiAqXG4gKiBFdmVyeSBvcGVuIGV4dHJhY3RzIGEgZnJlc2ggY29weSBpbnRvIGl0cyBvd24gZm9sZGVyIGFuZCBuZXZlciBkZWxldGVzIGl0IGFmdGVyd2FyZHMgKHRoZSB2YXVsdCBzdGF5c1xuICogb3BlbiBpbiBpdHMgd2luZG93KSwgc28gdGhlc2UgYWNjdW11bGF0ZS4gVGhpcyBkcm9wcyBmb2xkZXJzIG9sZGVyIHRoYW5cbiAqIHtAbGluayBPUlBIQU5FRF9FWFRSQUNURURfVkFVTFRfTUFYX0FHRV9JTl9NSUxMSVNFQ09ORFN9LiBBIGZvbGRlciB3aG9zZSB2YXVsdCBpcyBzdGlsbCBvcGVuIGluIGFub3RoZXJcbiAqIHdpbmRvdyBpcyBsb2NrZWQgb24gV2luZG93cyBhbmQgY2Fubm90IGJlIHJlbW92ZWQgXHUyMDE0IHRoZSByZW1vdmFsIGlzIHdyYXBwZWQgc28gc3VjaCBhIGZvbGRlciBpcyBzaW1wbHlcbiAqIHNraXBwZWQgYW5kIHJldHJpZWQgb24gYSBsYXRlciBvcGVuLlxuICovXG5mdW5jdGlvbiBjbGVhbnVwT3JwaGFuZWRFeHRyYWN0ZWRWYXVsdHMoKTogdm9pZCB7XG4gIGNvbnN0IGV4dHJhY3RlZFZhdWx0c1Jvb3QgPSBqb2luKHRtcGRpcigpLCBERU1PX1ZBVUxUU19DQUNIRV9GT0xERVIsIEVYVFJBQ1RFRF9WQVVMVFNfU1VCRk9MREVSKTtcbiAgaWYgKCFleGlzdHNTeW5jKGV4dHJhY3RlZFZhdWx0c1Jvb3QpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgZm9yIChjb25zdCBlbnRyeU5hbWUgb2YgcmVhZGRpclN5bmMoZXh0cmFjdGVkVmF1bHRzUm9vdCkpIHtcbiAgICBjb25zdCBlbnRyeVBhdGggPSBqb2luKGV4dHJhY3RlZFZhdWx0c1Jvb3QsIGVudHJ5TmFtZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRzID0gc3RhdFN5bmMoZW50cnlQYXRoKTtcbiAgICAgIGlmIChub3cgLSBzdGF0cy5tdGltZU1zIDwgT1JQSEFORURfRVhUUkFDVEVEX1ZBVUxUX01BWF9BR0VfSU5fTUlMTElTRUNPTkRTKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcm1TeW5jKGVudHJ5UGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQmVzdC1lZmZvcnQgY2xlYW51cDogYW4gb3JwaGFuIHdob3NlIHZhdWx0IGlzIHN0aWxsIG9wZW4gKGxvY2tlZCBvbiBXaW5kb3dzKSBjYW5ub3QgYmUgcmVtb3ZlZDsgc2tpcCBpdCBhbmQgcmV0cnkgb24gYSBsYXRlciBvcGVuLlxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3RzIGEgZG93bmxvYWRlZCBkZW1vLXZhdWx0IGFyY2hpdmUgdG8gZGlzay5cbiAqXG4gKiBFbGVjdHJvbidzIGFzYXIgbGF5ZXIgaW50ZXJjZXB0cyBgZnNgIG9wZXJhdGlvbnMgb24gYW55IHBhdGggY29udGFpbmluZyBgLmFzYXJgIGFuZCB0aHJvd3MgYEVOT0VOVGBcbiAqIHdoZW4gYGNobW9kYC1pbmcgYW4gYC5hc2FyYCBmaWxlIChpdCB0cmVhdHMgaXQgYXMgYW4gYXJjaGl2ZSByb290IHJhdGhlciB0aGFuIGEgcGxhaW4gZmlsZSkuIEEgZGVtb1xuICogdmF1bHQgbWF5IHNoaXAgc3VjaCBhIGZpbGUgKGUuZy4gYF9hc3NldHMvQ29kZVNjcmlwdFRvb2xraXQvbW9kdWxlLmFzYXJgIGRlbW9uc3RyYXRpbmcgdGhlIEFTQVJcbiAqIHJlcXVpcmUgZmVhdHVyZSksIGFuZCBhZG0temlwIGBjaG1vZGBzIGV2ZXJ5IGV4dHJhY3RlZCBmaWxlLCBzbyBleHRyYWN0aW9uIHdvdWxkIG90aGVyd2lzZSBjcmFzaC5cbiAqIEhhbmQgYWRtLXppcCBFbGVjdHJvbidzIGBvcmlnaW5hbC1mc2AgXHUyMDE0IHRoZSByZWFsIGBmc2Agd2l0aCBhc2FyIGludGVyY2VwdGlvbiBkaXNhYmxlZCBcdTIwMTQgc28gdGhlXG4gKiBgLmFzYXJgIGZpbGUgaXMgdHJlYXRlZCBhcyBhIHBsYWluIGZpbGUgYW5kIGBjaG1vZGAgc3VjY2VlZHMuIEl0IGlzIGEgZGVza3RvcC1vbmx5IEVsZWN0cm9uIG1vZHVsZVxuICogd2l0aCBubyBidW5kbGVkIHR5cGVzLCBzbyBpdCBpcyBsb2FkZWQgdmlhIGB3aW5kb3cucmVxdWlyZWAgYW5kIHR5cGVkIGFzIGBub2RlOmZzYCdzIHNoYXBlLlxuICpcbiAqIGBhZG0temlwYCBpcyBpbXBvcnRlZCBoZXJlIHJhdGhlciB0aGFuIGF0IHRoZSB0b3Agb2YgdGhlIG1vZHVsZTogaXQgaW5pdGlhbGl6ZXMgYSBOb2RlLW9ubHkgZGVwZW5kZW5jeVxuICogKGByZXF1aXJlKCdjcnlwdG8nKWApLCBzbyBhIHN0YXRpYyBpbXBvcnQgd291bGQgYnJlYWsgdGhlIGxpYnJhcnkncyBsb2FkIG9uIG1vYmlsZSBldmVuIHRob3VnaCB0aGlzXG4gKiBmdW5jdGlvbiBvbmx5IGV2ZXIgcnVucyBvbiBkZXNrdG9wLiBTZWUgdGhlIG1vZHVsZSdzIGBAZmlsZWAgbm90ZS5cbiAqXG4gKiBAcGFyYW0gYXJjaGl2ZSAtIFRoZSByYXcgemlwIGFyY2hpdmUgYnl0ZXMuXG4gKiBAcGFyYW0gdGFyZ2V0RGlyZWN0b3J5IC0gVGhlIGRpcmVjdG9yeSB0byBleHRyYWN0IGludG8uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGFyY2hpdmUgaGFzIGJlZW4gZXh0cmFjdGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBleHRyYWN0RGVtb1ZhdWx0QXJjaGl2ZShhcmNoaXZlOiBCdWZmZXIsIHRhcmdldERpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZGVmYXVsdDogQWRtWmlwIH0gPSBhd2FpdCBpbXBvcnQoJ2FkbS16aXAnKTtcbiAgY29uc3Qgb3JpZ2luYWxGcyA9IHdpbmRvdy5yZXF1aXJlKCdub2RlOm9yaWdpbmFsLWZzJykgYXMgdHlwZW9mIGltcG9ydCgnbm9kZTpmcycpO1xuICBjb25zdCB6aXAgPSBuZXcgQWRtWmlwKGFyY2hpdmUsIHsgZnM6IG9yaWdpbmFsRnMgfSk7XG4gIHppcC5leHRyYWN0QWxsVG8odGFyZ2V0RGlyZWN0b3J5LCB0cnVlKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgYXJjaGl2ZSBpbnRvIGEgZnJlc2gsIHVuaXF1ZWx5LW5hbWVkIHRlbXBvcmFyeSBmb2xkZXIgYW5kIHJldHVybnMgdGhlIHZhdWx0IHBhdGguXG4gKlxuICogQSB1bmlxdWUgcGFyZW50IGZvbGRlciAoYG1rZHRlbXBTeW5jYCkgZ3VhcmFudGVlcyBhIGJyYW5kLW5ldyBleHRyYWN0aW9uIGV2ZXJ5IHRpbWUgXHUyMDE0IHRoZSBkZW1vIHZhdWx0XG4gKiBpcyBuZXZlciByZXVzZWQgYWNyb3NzIG9wZW5zLCBzbyBhIHByZXZpb3VzIHNlc3Npb24ncyBlZGl0cyBuZXZlciBsZWFrIGluLiBJbnNpZGUgaXQsIHRoZSB2YXVsdCBmb2xkZXJcbiAqIGlzIG5hbWVkIGA8cGx1Z2luLWlkPi08dmVyc2lvbj4uZGVtby12YXVsdGAgc28gT2JzaWRpYW4ncyB2YXVsdCBzd2l0Y2hlciBzaG93cyBhIGZyaWVuZGx5IG5hbWUgKGl0c1xuICogYmFzZW5hbWUpIHJhdGhlciB0aGFuIHRoZSByYW5kb20gdGVtcCBpZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBFeHRyYWN0RGVtb1ZhdWx0VG9GcmVzaEZvbGRlclBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSByZXNvbHZpbmcgdG8gdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZyZXNobHkgZXh0cmFjdGVkIHZhdWx0IGZvbGRlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXh0cmFjdERlbW9WYXVsdFRvRnJlc2hGb2xkZXIocGFyYW1zOiBFeHRyYWN0RGVtb1ZhdWx0VG9GcmVzaEZvbGRlclBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgYXJjaGl2ZSwgcGx1Z2luSWQsIHZlcnNpb24gfSA9IHBhcmFtcztcbiAgY29uc3QgZXh0cmFjdGVkVmF1bHRzUm9vdCA9IGpvaW4odG1wZGlyKCksIERFTU9fVkFVTFRTX0NBQ0hFX0ZPTERFUiwgRVhUUkFDVEVEX1ZBVUxUU19TVUJGT0xERVIpO1xuICBta2RpclN5bmMoZXh0cmFjdGVkVmF1bHRzUm9vdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IHVuaXF1ZVBhcmVudERpcmVjdG9yeSA9IG1rZHRlbXBTeW5jKGpvaW4oZXh0cmFjdGVkVmF1bHRzUm9vdCwgYCR7cGx1Z2luSWR9LSR7dmVyc2lvbn0tYCkpO1xuICBjb25zdCB2YXVsdERpcmVjdG9yeSA9IGpvaW4odW5pcXVlUGFyZW50RGlyZWN0b3J5LCBgJHtwbHVnaW5JZH0tJHt2ZXJzaW9ufS5kZW1vLXZhdWx0YCk7XG4gIGF3YWl0IGV4dHJhY3REZW1vVmF1bHRBcmNoaXZlKGFyY2hpdmUsIHZhdWx0RGlyZWN0b3J5KTtcbiAgcmV0dXJuIHZhdWx0RGlyZWN0b3J5O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkZW1vLXZhdWx0IGFyY2hpdmUgYnl0ZXMgZm9yIGEgdmVyc2lvbiwgZG93bmxvYWRpbmcgYW5kIGNhY2hpbmcgdGhlbSBvbiBmaXJzdCB1c2UuXG4gKlxuICogT25seSB0aGUgYXJjaGl2ZSBpcyBjYWNoZWQgKGtleWVkIGJ5IHBsdWdpbiBpZCArIHZlcnNpb24pOyB0aGUgZXh0cmFjdGVkIHZhdWx0IGlzIG5vdC4gQSBjYWNoZSBoaXQgaXNcbiAqIHJldHVybmVkIHdpdGhvdXQgYW55IG5ldHdvcmsgcmVxdWVzdDsgYSBtaXNzIGRvd25sb2FkcyB0aGUgcmVsZWFzZSBhc3NldCwgd3JpdGVzIGl0IHRvIHRoZSBhcmNoaXZlXG4gKiBjYWNoZSwgYW5kIHJldHVybnMgdGhlIGZyZXNobHkgZG93bmxvYWRlZCBieXRlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBSZXNvbHZlRGVtb1ZhdWx0QXJjaGl2ZVBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSByZXNvbHZpbmcgdG8gdGhlIGFyY2hpdmUgYnl0ZXMsIG9yIGBudWxsYCB3aGVuIG5vIGFyY2hpdmUgaXMgYXZhaWxhYmxlIGZvclxuICogdGhlIHZlcnNpb24gKGEgbm90aWNlIGhhcyBiZWVuIHNob3duKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURlbW9WYXVsdEFyY2hpdmUocGFyYW1zOiBSZXNvbHZlRGVtb1ZhdWx0QXJjaGl2ZVBhcmFtcyk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICBjb25zdCB7XG4gICAgcGx1Z2luSWQsXG4gICAgcGx1Z2luTmFtZSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgcHJvZ3Jlc3NOb3RpY2UsXG4gICAgcmVwbyxcbiAgICB2ZXJzaW9uXG4gIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgYXJjaGl2ZXNEaXJlY3RvcnkgPSBqb2luKHRtcGRpcigpLCBERU1PX1ZBVUxUU19DQUNIRV9GT0xERVIsIEFSQ0hJVkVTX1NVQkZPTERFUik7XG4gIGNvbnN0IGFyY2hpdmVQYXRoID0gam9pbihhcmNoaXZlc0RpcmVjdG9yeSwgYCR7cGx1Z2luSWR9LSR7dmVyc2lvbn0uemlwYCk7XG4gIGlmIChleGlzdHNTeW5jKGFyY2hpdmVQYXRoKSkge1xuICAgIHJldHVybiByZWFkRmlsZVN5bmMoYXJjaGl2ZVBhdGgpO1xuICB9XG5cbiAgcHJvZ3Jlc3NOb3RpY2Uuc2V0Q29udGVudChgRG93bmxvYWRpbmcgZGVtbyB2YXVsdCBmb3IgJHtwbHVnaW5OYW1lfSB2JHt2ZXJzaW9ufVx1MjAyNmApO1xuICBjb25zdCBhc3NldFVybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvfS9yZWxlYXNlcy9kb3dubG9hZC8ke3ZlcnNpb259LyR7cGx1Z2luSWR9LWRlbW8tdmF1bHQtJHt2ZXJzaW9ufS56aXBgO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RVcmwoe1xuICAgIHRocm93OiBmYWxzZSxcbiAgICB1cmw6IGFzc2V0VXJsXG4gIH0pO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSBIVFRQX1NUQVRVU19PSykge1xuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKGBObyBkZW1vIHZhdWx0IGlzIGF2YWlsYWJsZSBmb3IgcGx1Z2luICR7cGx1Z2luTmFtZX0gdiR7dmVyc2lvbn0uYCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBhcmNoaXZlID0gQnVmZmVyLmZyb20ocmVzcG9uc2UuYXJyYXlCdWZmZXIpO1xuICBta2RpclN5bmMoYXJjaGl2ZXNEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB3cml0ZUZpbGVTeW5jKGFyY2hpdmVQYXRoLCBhcmNoaXZlKTtcbiAgcmV0dXJuIGFyY2hpdmU7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUE4QkEsOEJBQWdDO0FBRWhDLHlCQUF1QjtBQUN2QixxQkFTTztBQUNQLHFCQUF1QjtBQUV2QixzQkFBMkI7QUFPM0Isa0JBQXFCO0FBQ3JCLCtCQUdPO0FBQ1AscUNBQWlDO0FB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TyxRQUFRLGtCQUFrQjtBQUNwRCxRQUFNLE1BQU0sSUFBSSxPQUFPLFNBQVMsRUFBRSxJQUFJLFdBQVcsQ0FBQztBQUNsRCxNQUFJLGFBQWEsaUJBQWlCLElBQUk7QUFDeEM7QUFhQSxlQUFlLDhCQUE4QixRQUE4RDtBQUN6RyxRQUFNLEVBQUUsU0FBUyxVQUFVLFFBQVEsSUFBSTtBQUN2QyxRQUFNLDBCQUFzQixzQkFBSyx1QkFBTyxHQUFHLDBCQUEwQiwwQkFBMEI7QUFDL0YsZ0NBQVUscUJBQXFCLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDbEQsUUFBTSw0QkFBd0IsZ0NBQVksa0JBQUsscUJBQXFCLEdBQUcsUUFBUSxJQUFJLE9BQU8sR0FBRyxDQUFDO0FBQzlGLFFBQU0scUJBQWlCLGtCQUFLLHVCQUF1QixHQUFHLFFBQVEsSUFBSSxPQUFPLGFBQWE7QUFDdEYsUUFBTSx3QkFBd0IsU0FBUyxjQUFjO0FBQ3JELFNBQU87QUFDVDtBQWFBLGVBQWUsd0JBQXdCLFFBQStEO0FBQ3BHLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFFSixRQUFNLHdCQUFvQixzQkFBSyx1QkFBTyxHQUFHLDBCQUEwQixrQkFBa0I7QUFDckYsUUFBTSxrQkFBYyxrQkFBSyxtQkFBbUIsR0FBRyxRQUFRLElBQUksT0FBTyxNQUFNO0FBQ3hFLFVBQUksMkJBQVcsV0FBVyxHQUFHO0FBQzNCLGVBQU8sNkJBQWEsV0FBVztBQUFBLEVBQ2pDO0FBRUEsaUJBQWUsV0FBVyw4QkFBOEIsVUFBVSxLQUFLLE9BQU8sUUFBRztBQUNqRixRQUFNLFdBQVcsc0JBQXNCLElBQUksc0JBQXNCLE9BQU8sSUFBSSxRQUFRLGVBQWUsT0FBTztBQUMxRyxRQUFNLFdBQVcsVUFBTSw0QkFBVztBQUFBLElBQ2hDLE9BQU87QUFBQSxJQUNQLEtBQUs7QUFBQSxFQUNQLENBQUM7QUFDRCxNQUFJLFNBQVMsV0FBVyxnQkFBZ0I7QUFDdEMsMEJBQXNCLFdBQVcseUNBQXlDLFVBQVUsS0FBSyxPQUFPLEdBQUc7QUFDbkcsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLFVBQVUsMEJBQU8sS0FBSyxTQUFTLFdBQVc7QUFDaEQsZ0NBQVUsbUJBQW1CLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDaEQsb0NBQWMsYUFBYSxPQUFPO0FBQ2xDLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
358
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2Rlc2t0b3AtZGVtby12YXVsdC1vcGVuZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEb3dubG9hZHMgYW5kIG9wZW5zIGEgcGx1Z2luJ3Mgc2hpcHBlZCBkZW1vIHZhdWx0IGluIGEgbmV3IE9ic2lkaWFuIHdpbmRvdyAoZGVza3RvcCBvbmx5KS5cbiAqXG4gKiBBIHBsdWdpbiBjYW4gYXR0YWNoIGEgYDxwbHVnaW4taWQ+LWRlbW8tdmF1bHQuemlwYCBhcmNoaXZlIHRvIGVhY2ggR2l0SHViIHJlbGVhc2UgKHNlZVxuICogYGFyY2hpdmVQbHVnaW5EZW1vVmF1bHRgIGluIGBzY3JpcHQtdXRpbHMvZGVtby12YXVsdC50c2A7IGV2ZXJ5IG5hbWUgc2hhcmVkIHdpdGggaXQgY29tZXMgZnJvbVxuICogYGRlbW8tdmF1bHQtbmFtaW5nLnRzYCkuIFRoaXMgcmVzb2x2ZXMgdGhlIHBsdWdpbidzIHJlcG9zaXRvcnkgZnJvbSBPYnNpZGlhbidzIGNvbW11bml0eSByZWdpc3RyeSxcbiAqIGRvd25sb2FkcyB0aGUgYXJjaGl2ZSBmb3IgdGhlIGNob3NlbiB2ZXJzaW9uLCBhbmQgb3BlbnMgaXQgYXMgYSB2YXVsdCBpbiBhIG5ldyB3aW5kb3cuIFdoZW4gdGhlXG4gKiBpbnN0YWxsZWQgcGx1Z2luIHZlcnNpb24gaXMgYmVoaW5kIHRoZSBsYXRlc3QgcmVsZWFzZSwgdGhlIHVzZXIgaXMgb2ZmZXJlZCBhIGNob2ljZSBiZXR3ZWVuIHRoZSB0d29cbiAqIHZlcnNpb25zLlxuICpcbiAqIEEgcHJvZ3Jlc3Mgbm90aWNlIGlzIHNob3duIGltbWVkaWF0ZWx5IChkb3dubG9hZCArIGV4dHJhY3Rpb24gY2FuIHRha2UgYSB3aGlsZSwgc28gdGhlIHVzZXIgbXVzdCBzZWVcbiAqIHNvbWV0aGluZyBpcyBoYXBwZW5pbmcgcmlnaHQgYXdheSkuIE9ubHkgdGhlIGRvd25sb2FkZWQgQVJDSElWRSBpcyBjYWNoZWQgKHVuZGVyIHRoZSBPUyB0ZW1wXG4gKiBkaXJlY3RvcnkpOyBldmVyeSBpbnZvY2F0aW9uIGV4dHJhY3RzIGEgRlJFU0ggY29weSBpbnRvIGl0cyBvd24gdGVtcG9yYXJ5IGZvbGRlciBhbmQgb3BlbnMgdGhhdCwgc28gYVxuICogcHJldmlvdXMgc2Vzc2lvbidzIGVkaXRzIG5ldmVyIGxlYWsgaW50byBhIG5ldyBvbmUuIFRoZSB2YXVsdCBmb2xkZXIgaXMgdGhlIGFyY2hpdmUncyBvd24gc2luZ2xlXG4gKiB0b3AtbGV2ZWwgZm9sZGVyLCBgPHBsdWdpbi1pZD4tZGVtby12YXVsdC08dmVyc2lvbj5gLCB3aGljaCByZWFkcyBuaWNlbHkgaW4gT2JzaWRpYW4ncyB2YXVsdCBzd2l0Y2hlclxuICogYW5kIGlzIHRoZSBzYW1lIG5hbWUgYSBoYW5kLXVuemlwcGVkIGFyY2hpdmUgcHJvZHVjZXMuIE9ycGhhbmVkIGV4dHJhY3RlZCBmb2xkZXJzIGxlZnQgb3ZlciBmcm9tXG4gKiBlYXJsaWVyIHNlc3Npb25zIGFyZSBjbGVhbmVkIHVwIChiZXN0LWVmZm9ydCkgb24gZWFjaCBvcGVuLlxuICpcbiAqICoqTm90aGluZyBoZXJlIG1heSB0b3VjaCBhIHBsYXRmb3JtLW9ubHkgQVBJIHdoaWxlIHRoZSBtb2R1bGUgSU5JVElBTElaRVMuKiogVGhlIGBub2RlOmAgaW1wb3J0cyBiZWxvd1xuICogYXJlIHNhZmUgdG8gbWVyZWx5IGV2YWx1YXRlIG9uIG1vYmlsZSBcdTIwMTQgYHJlcXVpcmVgIGhhbmRzIGJhY2sgYHVuZGVmaW5lZGAgdGhlcmUgYW5kIG5vdGhpbmcgcmVhZHMgaXQgYXRcbiAqIGxvYWQgdGltZSBcdTIwMTQgYW5kIGJlY2F1c2UgdGhlIGdlbmVyYXRlZCBiYXJyZWxzIHJlLWV4cG9ydCB0aGlzIG1vZHVsZSwgdGhhdCBpcyBhIGxvYWQtYmVhcmluZyBwcm9wZXJ0eSBvZlxuICogdGhlIHdob2xlIGxpYnJhcnkgcmF0aGVyIHRoYW4gYSBkZXRhaWwgb2YgdGhpcyBmaWxlLiBJdCB3YXMgbGVhcm5lZCB0aGUgaGFyZCB3YXk6IHRoaXMgbW9kdWxlIG9uY2VcbiAqIGltcG9ydGVkIGBhZG0temlwYCwgd2hvc2UgemlwLWNyeXB0byBtZXRob2Qgb3BlbnMgd2l0aCBhIHRvcC1sZXZlbFxuICogYGNvbnN0IHsgcmFuZG9tRmlsbFN5bmMgfSA9IHJlcXVpcmUoJ2NyeXB0bycpYCwgYW5kIGEgc3RhdGljIGBpbXBvcnQgQWRtWmlwIGZyb20gJ2FkbS16aXAnYCB0aGVyZWZvcmVcbiAqIGtpbGxlZCB0aGUgbGlicmFyeSdzIGxvYWQgb24gQW5kcm9pZCAoc2VlIHRoZSBtb2JpbGUtbG9hZCBjaGVjayBpblxuICogYHNjcmlwdHMvaGVscGVycy9hc3NlcnQtbW9iaWxlLWxvYWRhYmxlLWJ1bmRsZS50c2AsIHdoaWNoIGZhaWxzIHRoZSBidWlsZCBvbiBleGFjdGx5IHRoYXQpLiBFeHRyYWN0aW9uXG4gKiBub3cgZ29lcyB0aHJvdWdoIGBkZXNrdG9wLXppcC1leHRyYWN0b3IudHNgLCB3aGljaCBuZWVkcyBubyBkZXBlbmRlbmN5IGF0IGFsbCBcdTIwMTQgYnV0IGFueSBmdXR1cmVcbiAqIGRlcGVuZGVuY3kgdGhhdCBpbml0aWFsaXplcyBhZ2FpbnN0IGEgcGxhdGZvcm0tb25seSBBUEkgc3RpbGwgaGFzIHRvIGJlIGRlZmVycmVkIGJlaGluZCBhIGNhbGwtdGltZVxuICogYGltcG9ydCgpYC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgY29tcGFyZVZlcnNpb25zIH0gZnJvbSAnY29tcGFyZS12ZXJzaW9ucyc7XG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQteC9uby1ub2RlanMtbW9kdWxlcyAtLSBEZXNrdG9wLW9ubHkgZmVhdHVyZSBnYXRlZCBieSBgUGxhdGZvcm0uaXNEZXNrdG9wQXBwYDsgdGhlIGNvbW1hbmQgaXMgaGlkZGVuIG9uIG1vYmlsZSBzbyB0aGVzZSBOb2RlIEFQSXMgYXJlIG5ldmVyIHJlYWNoZWQgdGhlcmUuICovXG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdub2RlOmJ1ZmZlcic7XG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICBybVN5bmMsXG4gIHN0YXRTeW5jLFxuICB3cml0ZUZpbGVTeW5jXG59IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG4vKiBlc2xpbnQtZW5hYmxlIGltcG9ydC14L25vLW5vZGVqcy1tb2R1bGVzIC0tIERlc2t0b3Atb25seSBmZWF0dXJlIGdhdGVkIGJ5IGBQbGF0Zm9ybS5pc0Rlc2t0b3BBcHBgOyB0aGUgY29tbWFuZCBpcyBoaWRkZW4gb24gbW9iaWxlIHNvIHRoZXNlIE5vZGUgQVBJcyBhcmUgbmV2ZXIgcmVhY2hlZCB0aGVyZS4gKi9cbmltcG9ydCB7IHJlcXVlc3RVcmwgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luTm90aWNlQ29tcG9uZW50LFxuICBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlXG59IGZyb20gJy4vY29tcG9uZW50cy9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5cbmltcG9ydCB7IGV4dHJhY3RaaXBBcmNoaXZlIH0gZnJvbSAnLi4vZGVza3RvcC16aXAtZXh0cmFjdG9yLnRzJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7XG4gIGdldENvbW11bml0eVBsdWdpblJlcG8sXG4gIGdldExhdGVzdFJlbGVhc2VWZXJzaW9uXG59IGZyb20gJy4vY29tbXVuaXR5LXBsdWdpbnMudHMnO1xuaW1wb3J0IHsgUGx1Z2luTm90aWNlTW9kZSB9IGZyb20gJy4vY29tcG9uZW50cy9wbHVnaW4tbm90aWNlLWNvbXBvbmVudC50cyc7XG5pbXBvcnQge1xuICBnZXREZW1vVmF1bHRBcmNoaXZlRmlsZU5hbWUsXG4gIGdldERlbW9WYXVsdEZvbGRlck5hbWVcbn0gZnJvbSAnLi9kZW1vLXZhdWx0LW5hbWluZy50cyc7XG5pbXBvcnQgeyBzZWxlY3RPcHRpb24gfSBmcm9tICcuL21vZGFscy9zZWxlY3Qtb3B0aW9uLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgb3BlbkRlbW9WYXVsdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkRlbW9WYXVsdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaWQsIHVzZWQgdG8gbG9jYXRlIHRoZSBHaXRIdWIgcmVwb3NpdG9yeSwgdG8gbmFtZSB0aGUgYXJjaGl2ZSBhc3NldCwgYW5kIHRvIG5hbWUgdGhlXG4gICAqIGNhY2hlZCBhcmNoaXZlIGFuZCB0aGUgZXh0cmFjdGVkIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gZGlzcGxheSBuYW1lLCB1c2VkIHRvIGxhYmVsIHRoZSBub3RpY2VzIGFuZCB0aGUgdmVyc2lvbi1jaG9pY2UgZGlhbG9nLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbm90aWNlIGNvbXBvbmVudCB1c2VkIHRvIHJlcG9ydCBwcm9ncmVzcyBhbmQgcHJvYmxlbXMgKHBsdWdpbiBub3QgaW4gdGhlIHJlZ2lzdHJ5LCBtaXNzaW5nXG4gICAqIGFyY2hpdmUpLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50bHkgaW5zdGFsbGVkIHBsdWdpbiB2ZXJzaW9uLCBvZmZlcmVkIGFzIG9uZSBvZiB0aGUgdmVyc2lvbiBjaG9pY2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luVmVyc2lvbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgRXh0cmFjdERlbW9WYXVsdFRvRnJlc2hGb2xkZXJQYXJhbXMge1xuICByZWFkb25seSBhcmNoaXZlOiBCdWZmZXI7XG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFJlc29sdmVEZW1vVmF1bHRBcmNoaXZlUGFyYW1zIHtcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgcmVhZG9ubHkgcHJvZ3Jlc3NOb3RpY2U6IFBsdWdpbk5vdGljZUNvbXBvbmVudERlbGF5ZWROb3RpY2U7XG4gIHJlYWRvbmx5IHJlcG86IHN0cmluZztcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG5jb25zdCBERU1PX1ZBVUxUU19DQUNIRV9GT0xERVIgPSAnb2JzaWRpYW4tZGVtby12YXVsdHMnO1xuY29uc3QgQVJDSElWRVNfU1VCRk9MREVSID0gJ2FyY2hpdmVzJztcbmNvbnN0IEVYVFJBQ1RFRF9WQVVMVFNfU1VCRk9MREVSID0gJ2V4dHJhY3RlZCc7XG5jb25zdCBIVFRQX1NUQVRVU19PSyA9IDIwMDtcbi8vIE9uZSBkYXkgaW4gbWlsbGlzZWNvbmRzICgyNCAqIDYwICogNjAgKiAxMDAwKS5cbmNvbnN0IE9SUEhBTkVEX0VYVFJBQ1RFRF9WQVVMVF9NQVhfQUdFX0lOX01JTExJU0VDT05EUyA9IDg2XzQwMF8wMDA7XG5cbi8qKlxuICogRG93bmxvYWRzIGFuZCBvcGVucyB0aGUgcGx1Z2luJ3MgZGVtbyB2YXVsdCBpbiBhIG5ldyBPYnNpZGlhbiB3aW5kb3cuIERlc2t0b3Agb25seS5cbiAqXG4gKiBJZiB0aGUgaW5zdGFsbGVkIHBsdWdpbiB2ZXJzaW9uIGlzIHRoZSBsYXRlc3QgKG9yIG5ld2VyKSwgaXRzIGRlbW8gdmF1bHQgb3BlbnMgZGlyZWN0bHk7IG90aGVyd2lzZVxuICogdGhlIHVzZXIgY2hvb3NlcyBiZXR3ZWVuIHRoZSBsYXRlc3QgYW5kIHRoZSBjdXJyZW50bHktaW5zdGFsbGVkIHZlcnNpb24uIEEgcHJvZ3Jlc3Mgbm90aWNlIGlzIHNob3duXG4gKiBpbW1lZGlhdGVseS4gVGhlIGNob3NlbiB2ZXJzaW9uJ3MgYXJjaGl2ZSBpcyBkb3dubG9hZGVkIG9uY2UgKHRoZW4gcmV1c2VkIGZyb20gdGhlIGFyY2hpdmUgY2FjaGUpLFxuICogYnV0IGEgZnJlc2ggY29weSBpcyBleHRyYWN0ZWQgaW50byBpdHMgb3duIHRlbXBvcmFyeSBmb2xkZXIgb24gZXZlcnkgb3BlbiBcdTIwMTQgdGhlIHZhdWx0IGlzIG5ldmVyIHJldXNlZFxuICogYWNyb3NzIHNlc3Npb25zLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIE9wZW5EZW1vVmF1bHRQYXJhbXN9LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSB2YXVsdCBoYXMgYmVlbiBvcGVuZWQsIG9yIG9uY2UgdGhlIG9wZXJhdGlvbiBoYXNcbiAqIGJlZW4gcmVwb3J0ZWQgYXMgbm90IHBvc3NpYmxlIChub3RpY2Ugc2hvd24pIG9yIGNhbmNlbGxlZCBieSB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5EZW1vVmF1bHQocGFyYW1zOiBPcGVuRGVtb1ZhdWx0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgcGx1Z2luSWQsXG4gICAgcGx1Z2luTmFtZSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgcGx1Z2luVmVyc2lvblxuICB9ID0gcGFyYW1zO1xuXG4gIC8vIFNob3duIGltbWVkaWF0ZWx5IChgZGVsYXlJbk1pbGxpc2Vjb25kczogMGApOiByZXNvbHZpbmcgdGhlIHJlbGVhc2UsIGRvd25sb2FkaW5nIGFuZCBleHRyYWN0aW5nIGNhblxuICAvLyBFYWNoIHRha2UgYSB3aGlsZSwgc28gdGhlIHVzZXIgbXVzdCBzZWUgcHJvZ3Jlc3MgdGhlIG1vbWVudCB0aGUgY29tbWFuZCBpcyBpbnZva2VkLlxuICAvL1xuICAvLyBLZXB0IG91dCBvZiB0aGUgc2hhcmVkIHNsb3QgKGBTZXBhcmF0ZWApLCBiZWNhdXNlIHRoaXMgdmVyeSBmdW5jdGlvbiByYWlzZXMgb3JkaW5hcnkgbm90aWNlcyB3aGlsZVxuICAvLyBUaGUgb3BlcmF0aW9uIGlzIHN0aWxsIHJ1bm5pbmcgXHUyMDE0IFwibm90IGluIHRoZSByZWdpc3RyeVwiLCBcIm5vIGRlbW8gdmF1bHQgZm9yIHRoaXMgdmVyc2lvblwiIFx1MjAxNCBhbmQgYVxuICAvLyBTbG90IG5vdGljZSB3b3VsZCBoaWRlIHRoZSBwcm9ncmVzcyBub3RpY2UgcmF0aGVyIHRoYW4gYXBwZWFyIGJlc2lkZSBpdC5cbiAgdXNpbmcgcHJvZ3Jlc3NOb3RpY2UgPSBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXkoe1xuICAgIGNvbnRlbnQ6IGBPcGVuaW5nIGRlbW8gdmF1bHQgZm9yICR7cGx1Z2luTmFtZX1cdTIwMjZgLFxuICAgIGRlbGF5SW5NaWxsaXNlY29uZHM6IDAsXG4gICAgbW9kZTogUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZVxuICB9KTtcblxuICBjb25zdCByZXBvID0gYXdhaXQgZ2V0Q29tbXVuaXR5UGx1Z2luUmVwbyhwbHVnaW5JZCk7XG4gIGlmICghcmVwbykge1xuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKGBDb3VsZCBub3QgZmluZCBwbHVnaW4gJHtwbHVnaW5OYW1lfSBpbiB0aGUgY29tbXVuaXR5IHBsdWdpbnMgcmVnaXN0cnkuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY3VycmVudFZlcnNpb24gPSBwbHVnaW5WZXJzaW9uO1xuICBjb25zdCBsYXRlc3RWZXJzaW9uID0gYXdhaXQgZ2V0TGF0ZXN0UmVsZWFzZVZlcnNpb24ocmVwbyk7XG5cbiAgbGV0IHZlcnNpb25Ub09wZW46IHN0cmluZztcbiAgaWYgKGNvbXBhcmVWZXJzaW9ucyhjdXJyZW50VmVyc2lvbiwgbGF0ZXN0VmVyc2lvbikgPj0gMCkge1xuICAgIHZlcnNpb25Ub09wZW4gPSBjdXJyZW50VmVyc2lvbjtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBjaG9zZW5WZXJzaW9uID0gYXdhaXQgc2VsZWN0T3B0aW9uPG51bGwgfCBzdHJpbmc+KHtcbiAgICAgIGFwcCxcbiAgICAgIG1lc3NhZ2U6IGBDdXJyZW50IHZlcnNpb24gb2YgcGx1Z2luICR7cGx1Z2luTmFtZX0gdiR7Y3VycmVudFZlcnNpb259IGlzIG5vdCB0aGUgbGF0ZXN0ICh2JHtsYXRlc3RWZXJzaW9ufSlgLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgaXNDdGE6IHRydWUsXG4gICAgICAgICAgdGV4dDogYE9wZW4gZGVtbyB2YXVsdCBmb3IgbGF0ZXN0IHZlcnNpb24gKHYke2xhdGVzdFZlcnNpb259KWAsXG4gICAgICAgICAgdmFsdWU6IGxhdGVzdFZlcnNpb25cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IGBPcGVuIGRlbW8gdmF1bHQgZm9yIGN1cnJlbnQgdmVyc2lvbiAodiR7Y3VycmVudFZlcnNpb259KWAsXG4gICAgICAgICAgdmFsdWU6IGN1cnJlbnRWZXJzaW9uXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcbiAgICAgICAgICB2YWx1ZTogbnVsbFxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgdGl0bGU6IHBsdWdpbk5hbWVcbiAgICB9KTtcbiAgICBpZiAoY2hvc2VuVmVyc2lvbiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2ZXJzaW9uVG9PcGVuID0gY2hvc2VuVmVyc2lvbjtcbiAgfVxuXG4gIGNvbnN0IGFyY2hpdmUgPSBhd2FpdCByZXNvbHZlRGVtb1ZhdWx0QXJjaGl2ZSh7XG4gICAgcGx1Z2luSWQsXG4gICAgcGx1Z2luTmFtZSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgcHJvZ3Jlc3NOb3RpY2UsXG4gICAgcmVwbyxcbiAgICB2ZXJzaW9uOiB2ZXJzaW9uVG9PcGVuXG4gIH0pO1xuICBpZiAoIWFyY2hpdmUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwcm9ncmVzc05vdGljZS5zZXRDb250ZW50KGBFeHRyYWN0aW5nIGRlbW8gdmF1bHQgZm9yICR7cGx1Z2luTmFtZX0gdiR7dmVyc2lvblRvT3Blbn1cdTIwMjZgKTtcbiAgY2xlYW51cE9ycGhhbmVkRXh0cmFjdGVkVmF1bHRzKCk7XG4gIGNvbnN0IHZhdWx0RGlyZWN0b3J5ID0gZXh0cmFjdERlbW9WYXVsdFRvRnJlc2hGb2xkZXIoe1xuICAgIGFyY2hpdmUsXG4gICAgcGx1Z2luSWQsXG4gICAgdmVyc2lvbjogdmVyc2lvblRvT3BlblxuICB9KTtcblxuICB3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmMoJ3ZhdWx0LW9wZW4nLCB2YXVsdERpcmVjdG9yeSwgZmFsc2UpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgZXh0cmFjdGVkIGRlbW8tdmF1bHQgZm9sZGVycyBsZWZ0IG92ZXIgZnJvbSBlYXJsaWVyIHNlc3Npb25zIChiZXN0LWVmZm9ydCkuXG4gKlxuICogRXZlcnkgb3BlbiBleHRyYWN0cyBhIGZyZXNoIGNvcHkgaW50byBpdHMgb3duIGZvbGRlciBhbmQgbmV2ZXIgZGVsZXRlcyBpdCBhZnRlcndhcmRzICh0aGUgdmF1bHQgc3RheXNcbiAqIG9wZW4gaW4gaXRzIHdpbmRvdyksIHNvIHRoZXNlIGFjY3VtdWxhdGUuIFRoaXMgZHJvcHMgZm9sZGVycyBvbGRlciB0aGFuXG4gKiB7QGxpbmsgT1JQSEFORURfRVhUUkFDVEVEX1ZBVUxUX01BWF9BR0VfSU5fTUlMTElTRUNPTkRTfS4gQSBmb2xkZXIgd2hvc2UgdmF1bHQgaXMgc3RpbGwgb3BlbiBpbiBhbm90aGVyXG4gKiB3aW5kb3cgaXMgbG9ja2VkIG9uIFdpbmRvd3MgYW5kIGNhbm5vdCBiZSByZW1vdmVkIFx1MjAxNCB0aGUgcmVtb3ZhbCBpcyB3cmFwcGVkIHNvIHN1Y2ggYSBmb2xkZXIgaXMgc2ltcGx5XG4gKiBza2lwcGVkIGFuZCByZXRyaWVkIG9uIGEgbGF0ZXIgb3Blbi5cbiAqL1xuZnVuY3Rpb24gY2xlYW51cE9ycGhhbmVkRXh0cmFjdGVkVmF1bHRzKCk6IHZvaWQge1xuICBjb25zdCBleHRyYWN0ZWRWYXVsdHNSb290ID0gam9pbih0bXBkaXIoKSwgREVNT19WQVVMVFNfQ0FDSEVfRk9MREVSLCBFWFRSQUNURURfVkFVTFRTX1NVQkZPTERFUik7XG4gIGlmICghZXhpc3RzU3luYyhleHRyYWN0ZWRWYXVsdHNSb290KSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGZvciAoY29uc3QgZW50cnlOYW1lIG9mIHJlYWRkaXJTeW5jKGV4dHJhY3RlZFZhdWx0c1Jvb3QpKSB7XG4gICAgY29uc3QgZW50cnlQYXRoID0gam9pbihleHRyYWN0ZWRWYXVsdHNSb290LCBlbnRyeU5hbWUpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0cyA9IHN0YXRTeW5jKGVudHJ5UGF0aCk7XG4gICAgICBpZiAobm93IC0gc3RhdHMubXRpbWVNcyA8IE9SUEhBTkVEX0VYVFJBQ1RFRF9WQVVMVF9NQVhfQUdFX0lOX01JTExJU0VDT05EUykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJtU3luYyhlbnRyeVBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEJlc3QtZWZmb3J0IGNsZWFudXA6IGFuIG9ycGhhbiB3aG9zZSB2YXVsdCBpcyBzdGlsbCBvcGVuIChsb2NrZWQgb24gV2luZG93cykgY2Fubm90IGJlIHJlbW92ZWQ7IHNraXAgaXQgYW5kIHJldHJ5IG9uIGEgbGF0ZXIgb3Blbi5cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBhIGRvd25sb2FkZWQgZGVtby12YXVsdCBhcmNoaXZlIHRvIGRpc2suXG4gKlxuICogRXh0cmFjdGlvbiBpcyB3cml0dGVuIHdpdGggRWxlY3Ryb24ncyBgb3JpZ2luYWwtZnNgIFx1MjAxNCB0aGUgcmVhbCBgZnNgIHdpdGggYXNhciBpbnRlcmNlcHRpb24gZGlzYWJsZWQgXHUyMDE0XG4gKiByYXRoZXIgdGhhbiB3aXRoIGBub2RlOmZzYC4gQSBkZW1vIHZhdWx0IG1heSBzaGlwIGEgZmlsZSB0aGF0IG1lcmVseSBMT09LUyBsaWtlIGFuIEVsZWN0cm9uIGFyY2hpdmVcbiAqIChlLmcuIGBfYXNzZXRzL0NvZGVTY3JpcHRUb29sa2l0L21vZHVsZS5hc2FyYCBkZW1vbnN0cmF0aW5nIHRoZSBBU0FSIHJlcXVpcmUgZmVhdHVyZSksIGFuZCBFbGVjdHJvbidzXG4gKiBhc2FyIGxheWVyIGludGVyY2VwdHMgYGZzYCBvcGVyYXRpb25zIG9uIGFueSBwYXRoIGNvbnRhaW5pbmcgYC5hc2FyYCwgdHJlYXRpbmcgaXQgYXMgYW4gYXJjaGl2ZSByb290XG4gKiByYXRoZXIgdGhhbiBhIHBsYWluIGZpbGUuIFRoYXQgYWxyZWFkeSBjb3N0IG9uZSBwcm9kdWN0aW9uIGJ1ZyB3aGVuIHRoZSBleHRyYWN0b3IgYGNobW9kYC1lZCBzdWNoIGFcbiAqIGZpbGUgYW5kIGdvdCBgRU5PRU5UYDsgbm90aGluZyBgY2htb2RgcyBhbnkgbW9yZSwgYnV0IHdyaXRpbmcgdGhvc2UgYnl0ZXMgdGhyb3VnaCB0aGUgY29weSB0aGF0IGhhcyBub1xuICogYXNhciBsYXllciBjb3N0cyBub3RoaW5nIGFuZCBrZWVwcyB0aGUgd2hvbGUgY2xhc3Mgb2YgZmFpbHVyZSBvZmYgdGhpcyBwYXRoLiBgb3JpZ2luYWwtZnNgIGlzIGEgZGVza3RvcC1vbmx5XG4gKiBFbGVjdHJvbiBtb2R1bGUgd2l0aCBubyBidW5kbGVkIHR5cGVzLCBzbyBpdCBpcyBsb2FkZWQgdmlhIGB3aW5kb3cucmVxdWlyZWAgYW5kIHR5cGVkIGFzIGBub2RlOmZzYCdzXG4gKiBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gYXJjaGl2ZSAtIFRoZSByYXcgemlwIGFyY2hpdmUgYnl0ZXMuXG4gKiBAcGFyYW0gdGFyZ2V0RGlyZWN0b3J5IC0gVGhlIGRpcmVjdG9yeSB0byBleHRyYWN0IGludG8uXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3REZW1vVmF1bHRBcmNoaXZlKGFyY2hpdmU6IEJ1ZmZlciwgdGFyZ2V0RGlyZWN0b3J5OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxGcyA9IHdpbmRvdy5yZXF1aXJlKCdub2RlOm9yaWdpbmFsLWZzJykgYXMgdHlwZW9mIGltcG9ydCgnbm9kZTpmcycpO1xuICBleHRyYWN0WmlwQXJjaGl2ZSh7XG4gICAgYXJjaGl2ZSxcbiAgICBmaWxlU3lzdGVtOiBvcmlnaW5hbEZzLFxuICAgIHRhcmdldERpcmVjdG9yeVxuICB9KTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgYXJjaGl2ZSBpbnRvIGEgZnJlc2gsIHVuaXF1ZWx5LW5hbWVkIHRlbXBvcmFyeSBmb2xkZXIgYW5kIHJldHVybnMgdGhlIHZhdWx0IHBhdGguXG4gKlxuICogQSB1bmlxdWUgcGFyZW50IGZvbGRlciAoYG1rZHRlbXBTeW5jYCkgZ3VhcmFudGVlcyBhIGJyYW5kLW5ldyBleHRyYWN0aW9uIGV2ZXJ5IHRpbWUgXHUyMDE0IHRoZSBkZW1vIHZhdWx0XG4gKiBpcyBuZXZlciByZXVzZWQgYWNyb3NzIG9wZW5zLCBzbyBhIHByZXZpb3VzIHNlc3Npb24ncyBlZGl0cyBuZXZlciBsZWFrIGluLiBUaGUgYXJjaGl2ZSBpcyBleHRyYWN0ZWRcbiAqIGludG8gdGhhdCBwYXJlbnQgYW5kIHRoZSB2YXVsdCBpcyB0aGUgc2luZ2xlIGA8cGx1Z2luLWlkPi1kZW1vLXZhdWx0LTx2ZXJzaW9uPmAgZm9sZGVyIGl0IGNvbnRhaW5zLCBzb1xuICogT2JzaWRpYW4ncyB2YXVsdCBzd2l0Y2hlciBzaG93cyBhIGZyaWVuZGx5IG5hbWUgKGl0cyBiYXNlbmFtZSkgcmF0aGVyIHRoYW4gdGhlIHJhbmRvbSB0ZW1wIGlkLlxuICpcbiAqIFRoYXQgZm9sZGVyIGlzIG5vdCBzZWFyY2hlZCBmb3I6IHtAbGluayBnZXREZW1vVmF1bHRGb2xkZXJOYW1lfSBuYW1lcyBpdCBvbiBib3RoIHNpZGVzLCBzbyB0aGUgcGF0aCBpc1xuICoga25vd24gYmVmb3JlIGEgYnl0ZSBpcyB3cml0dGVuLiBXaGljaCBrZWVwcyB0aGUgZXh0cmFjdG9yIGZyZWUgb2YgYW55IHJlYWQgXHUyMDE0IGRlbGliZXJhdGUsIGJlY2F1c2VcbiAqIEVsZWN0cm9uJ3MgYXNhciBsYXllciBpbnRlcmNlcHRzIGBmc2AgcmVhZHMgb24gYW55IHBhdGggY29udGFpbmluZyBgLmFzYXJgLCBhbmQgYSBkZW1vIHZhdWx0IG1heVxuICogbGVnaXRpbWF0ZWx5IHNoaXAgc3VjaCBhIGZpbGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgRXh0cmFjdERlbW9WYXVsdFRvRnJlc2hGb2xkZXJQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZyZXNobHkgZXh0cmFjdGVkIHZhdWx0IGZvbGRlci5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdERlbW9WYXVsdFRvRnJlc2hGb2xkZXIocGFyYW1zOiBFeHRyYWN0RGVtb1ZhdWx0VG9GcmVzaEZvbGRlclBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgYXJjaGl2ZSwgcGx1Z2luSWQsIHZlcnNpb24gfSA9IHBhcmFtcztcbiAgY29uc3QgZXh0cmFjdGVkVmF1bHRzUm9vdCA9IGpvaW4odG1wZGlyKCksIERFTU9fVkFVTFRTX0NBQ0hFX0ZPTERFUiwgRVhUUkFDVEVEX1ZBVUxUU19TVUJGT0xERVIpO1xuICBta2RpclN5bmMoZXh0cmFjdGVkVmF1bHRzUm9vdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvbnN0IHVuaXF1ZVBhcmVudERpcmVjdG9yeSA9IG1rZHRlbXBTeW5jKGpvaW4oZXh0cmFjdGVkVmF1bHRzUm9vdCwgYCR7cGx1Z2luSWR9LSR7dmVyc2lvbn0tYCkpO1xuICBleHRyYWN0RGVtb1ZhdWx0QXJjaGl2ZShhcmNoaXZlLCB1bmlxdWVQYXJlbnREaXJlY3RvcnkpO1xuICByZXR1cm4gam9pbihcbiAgICB1bmlxdWVQYXJlbnREaXJlY3RvcnksXG4gICAgZ2V0RGVtb1ZhdWx0Rm9sZGVyTmFtZSh7XG4gICAgICBwbHVnaW5JZCxcbiAgICAgIHZlcnNpb25cbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBkZW1vLXZhdWx0IGFyY2hpdmUgYnl0ZXMgZm9yIGEgdmVyc2lvbiwgZG93bmxvYWRpbmcgYW5kIGNhY2hpbmcgdGhlbSBvbiBmaXJzdCB1c2UuXG4gKlxuICogT25seSB0aGUgYXJjaGl2ZSBpcyBjYWNoZWQgKGtleWVkIGJ5IHBsdWdpbiBpZCArIHZlcnNpb24pOyB0aGUgZXh0cmFjdGVkIHZhdWx0IGlzIG5vdC4gQSBjYWNoZSBoaXQgaXNcbiAqIHJldHVybmVkIHdpdGhvdXQgYW55IG5ldHdvcmsgcmVxdWVzdDsgYSBtaXNzIGRvd25sb2FkcyB0aGUgcmVsZWFzZSBhc3NldCwgd3JpdGVzIGl0IHRvIHRoZSBhcmNoaXZlXG4gKiBjYWNoZSwgYW5kIHJldHVybnMgdGhlIGZyZXNobHkgZG93bmxvYWRlZCBieXRlcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBSZXNvbHZlRGVtb1ZhdWx0QXJjaGl2ZVBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSByZXNvbHZpbmcgdG8gdGhlIGFyY2hpdmUgYnl0ZXMsIG9yIGBudWxsYCB3aGVuIG5vIGFyY2hpdmUgaXMgYXZhaWxhYmxlIGZvclxuICogdGhlIHZlcnNpb24gKGEgbm90aWNlIGhhcyBiZWVuIHNob3duKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURlbW9WYXVsdEFyY2hpdmUocGFyYW1zOiBSZXNvbHZlRGVtb1ZhdWx0QXJjaGl2ZVBhcmFtcyk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICBjb25zdCB7XG4gICAgcGx1Z2luSWQsXG4gICAgcGx1Z2luTmFtZSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgcHJvZ3Jlc3NOb3RpY2UsXG4gICAgcmVwbyxcbiAgICB2ZXJzaW9uXG4gIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgYXJjaGl2ZXNEaXJlY3RvcnkgPSBqb2luKHRtcGRpcigpLCBERU1PX1ZBVUxUU19DQUNIRV9GT0xERVIsIEFSQ0hJVkVTX1NVQkZPTERFUik7XG4gIGNvbnN0IGFyY2hpdmVQYXRoID0gam9pbihhcmNoaXZlc0RpcmVjdG9yeSwgYCR7cGx1Z2luSWR9LSR7dmVyc2lvbn0uemlwYCk7XG4gIGlmIChleGlzdHNTeW5jKGFyY2hpdmVQYXRoKSkge1xuICAgIHJldHVybiByZWFkRmlsZVN5bmMoYXJjaGl2ZVBhdGgpO1xuICB9XG5cbiAgcHJvZ3Jlc3NOb3RpY2Uuc2V0Q29udGVudChgRG93bmxvYWRpbmcgZGVtbyB2YXVsdCBmb3IgJHtwbHVnaW5OYW1lfSB2JHt2ZXJzaW9ufVx1MjAyNmApO1xuICBjb25zdCBhc3NldFVybCA9IGBodHRwczovL2dpdGh1Yi5jb20vJHtyZXBvfS9yZWxlYXNlcy9kb3dubG9hZC8ke3ZlcnNpb259LyR7Z2V0RGVtb1ZhdWx0QXJjaGl2ZUZpbGVOYW1lKHBsdWdpbklkKX1gO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3RVcmwoe1xuICAgIHRocm93OiBmYWxzZSxcbiAgICB1cmw6IGFzc2V0VXJsXG4gIH0pO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSBIVFRQX1NUQVRVU19PSykge1xuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKGBObyBkZW1vIHZhdWx0IGlzIGF2YWlsYWJsZSBmb3IgcGx1Z2luICR7cGx1Z2luTmFtZX0gdiR7dmVyc2lvbn0uYCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBhcmNoaXZlID0gQnVmZmVyLmZyb20ocmVzcG9uc2UuYXJyYXlCdWZmZXIpO1xuICBta2RpclN5bmMoYXJjaGl2ZXNEaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB3cml0ZUZpbGVTeW5jKGFyY2hpdmVQYXRoLCBhcmNoaXZlKTtcbiAgcmV0dXJuIGFyY2hpdmU7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQW1DQSw4QkFBZ0M7QUFFaEMseUJBQXVCO0FBQ3ZCLHFCQVNPO0FBQ1AscUJBQXVCO0FBRXZCLHNCQUEyQjtBQU8zQixtQ0FBa0M7QUFDbEMsa0JBQXFCO0FBQ3JCLCtCQUdPO0FBQ1AscUNBQWlDO0FBQ2pDLCtCQUdPO0FBQ1AsMkJBQTZCO0FBaUQ3QixNQUFNLDJCQUEyQjtBQUNqQyxNQUFNLHFCQUFxQjtBQUMzQixNQUFNLDZCQUE2QjtBQUNuQyxNQUFNLGlCQUFpQjtBQUV2QixNQUFNLG1EQUFtRDtBQWV6RCxlQUFzQixjQUFjLFFBQTRDO0FBZTlFO0FBQUE7QUFkQSxVQUFNO0FBQUEsTUFDSjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLElBQUk7QUFRSixVQUFNLGlCQUFpQixzQ0FBc0IscUJBQXFCO0FBQUEsTUFDaEUsU0FBUywwQkFBMEIs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
@@ -4,27 +4,32 @@
4
4
  *
5
5
  * Downloads and opens a plugin's shipped demo vault in a new Obsidian window (desktop only).
6
6
  *
7
- * A plugin can attach a `<plugin-id>-demo-vault-<version>.zip` archive to each GitHub release (see
8
- * `archivePluginDemoVault` in `script-utils/demo-vault.ts`). This resolves the plugin's repository
9
- * from Obsidian's community registry, downloads the archive for the chosen version, and opens it as a
10
- * vault in a new window. When the installed plugin version is behind the latest release, the user is
11
- * offered a choice between the two versions.
7
+ * A plugin can attach a `<plugin-id>-demo-vault.zip` archive to each GitHub release (see
8
+ * `archivePluginDemoVault` in `script-utils/demo-vault.ts`; every name shared with it comes from
9
+ * `demo-vault-naming.ts`). This resolves the plugin's repository from Obsidian's community registry,
10
+ * downloads the archive for the chosen version, and opens it as a vault in a new window. When the
11
+ * installed plugin version is behind the latest release, the user is offered a choice between the two
12
+ * versions.
12
13
  *
13
14
  * A progress notice is shown immediately (download + extraction can take a while, so the user must see
14
15
  * something is happening right away). Only the downloaded ARCHIVE is cached (under the OS temp
15
16
  * directory); every invocation extracts a FRESH copy into its own temporary folder and opens that, so a
16
- * previous session's edits never leak into a new one. The extracted vault folder is named
17
- * `<plugin-id>-<version>.demo-vault` so it reads nicely in Obsidian's vault switcher. Orphaned
18
- * extracted folders left over from earlier sessions are cleaned up (best-effort) on each open.
17
+ * previous session's edits never leak into a new one. The vault folder is the archive's own single
18
+ * top-level folder, `<plugin-id>-demo-vault-<version>`, which reads nicely in Obsidian's vault switcher
19
+ * and is the same name a hand-unzipped archive produces. Orphaned extracted folders left over from
20
+ * earlier sessions are cleaned up (best-effort) on each open.
19
21
  *
20
- * **`adm-zip` is loaded lazily, and must stay that way.** The `node:` imports below are safe to merely
21
- * evaluate on mobile — `require` hands back `undefined` there and nothing reads it at load time — but
22
- * `adm-zip`'s zip-crypto method opens with a top-level `const { randomFillSync } = require('crypto')`,
23
- * which throws the moment the module is initialized. Because the generated barrels re-export this module,
24
- * a static `import AdmZip from 'adm-zip'` therefore killed the whole library's load on Android (see the
25
- * mobile-load check in `scripts/helpers/assert-mobile-loadable-bundle.ts`, which fails the build on
26
- * exactly that). Any future dependency that touches a platform-only API while initializing has to be
27
- * deferred the same way.
22
+ * **Nothing here may touch a platform-only API while the module INITIALIZES.** The `node:` imports below
23
+ * are safe to merely evaluate on mobile — `require` hands back `undefined` there and nothing reads it at
24
+ * load time and because the generated barrels re-export this module, that is a load-bearing property of
25
+ * the whole library rather than a detail of this file. It was learned the hard way: this module once
26
+ * imported `adm-zip`, whose zip-crypto method opens with a top-level
27
+ * `const { randomFillSync } = require('crypto')`, and a static `import AdmZip from 'adm-zip'` therefore
28
+ * killed the library's load on Android (see the mobile-load check in
29
+ * `scripts/helpers/assert-mobile-loadable-bundle.ts`, which fails the build on exactly that). Extraction
30
+ * now goes through `desktop-zip-extractor.ts`, which needs no dependency at all — but any future
31
+ * dependency that initializes against a platform-only API still has to be deferred behind a call-time
32
+ * `import()`.
28
33
  */
29
34
  import type { App } from 'obsidian' with { 'resolution-mode': 'import' };
30
35
  import type { PluginNoticeComponent } from './components/plugin-notice-component.cjs';