@decaf-ts/integrations 0.3.12 → 0.4.1-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 (196) hide show
  1. package/README.md +11 -3
  2. package/dist/integrations.cjs +445 -7
  3. package/dist/integrations.js +479 -8
  4. package/jest.config.cjs +1 -1
  5. package/lib/cjs/feature-flags/constants.cjs +16 -0
  6. package/lib/cjs/feature-flags/decorators.cjs +65 -0
  7. package/lib/cjs/feature-flags/environment.cjs +26 -0
  8. package/lib/cjs/feature-flags/index.cjs +31 -0
  9. package/lib/cjs/feature-flags/models/FeatureFlag.model.cjs +81 -0
  10. package/lib/cjs/feature-flags/models/FeatureFlagAccess.model.cjs +78 -0
  11. package/lib/cjs/feature-flags/readers/FeatureFlagReader.cjs +25 -0
  12. package/lib/cjs/feature-flags/readers/index.cjs +19 -0
  13. package/lib/cjs/feature-flags/services/FeatureFlag.service.cjs +259 -0
  14. package/lib/cjs/feature-flags/types.cjs +4 -0
  15. package/lib/cjs/feature-flags/utils.cjs +141 -0
  16. package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs +9 -9
  17. package/lib/cjs/graph/shared/nodes/flow-control.cjs +4 -3
  18. package/lib/cjs/graph/shared/types.cjs +2 -2
  19. package/lib/cjs/index.cjs +6 -5
  20. package/lib/cjs/kibana/builders/KibanaIndexBuilder.cjs +329 -0
  21. package/lib/cjs/kibana/builders/KibanaIndexBuilderCollection.cjs +37 -0
  22. package/lib/cjs/kibana/builders/index.cjs +20 -0
  23. package/lib/cjs/kibana/helpers.cjs +20 -16
  24. package/lib/cjs/kibana/index.cjs +3 -2
  25. package/lib/cjs/kibana/types.cjs +11 -2
  26. package/lib/cjs/loader/ObjectLoader.cjs +154 -0
  27. package/lib/cjs/loader/families.cjs +78 -0
  28. package/lib/cjs/loader/index.cjs +28 -0
  29. package/lib/cjs/loader/types.cjs +4 -0
  30. package/lib/cjs/nest/decorators.cjs +17 -0
  31. package/lib/cjs/nest/index.cjs +3 -3
  32. package/lib/cjs/nest/keycloakAuthHandler.cjs +74 -35
  33. package/lib/cjs/nest/keycloakModule.cjs +7 -10
  34. package/lib/cjs/nest/types.cjs +2 -2
  35. package/lib/cjs/nest/utils.cjs +58 -50
  36. package/lib/cjs/plugins/contract.cjs +76 -0
  37. package/lib/cjs/plugins/index.cjs +35 -0
  38. package/lib/cjs/plugins/kibana/host.cjs +24 -0
  39. package/lib/cjs/plugins/kibana/index.cjs +38 -0
  40. package/lib/cjs/plugins/kibana/installer.cjs +180 -0
  41. package/lib/cjs/plugins/kibana/manifest.cjs +33 -0
  42. package/lib/cjs/plugins/kibana/templates.cjs +503 -0
  43. package/lib/cjs/plugins/kibana/types.cjs +33 -0
  44. package/lib/cjs/plugins/superset/host.cjs +26 -0
  45. package/lib/cjs/plugins/superset/index.cjs +40 -0
  46. package/lib/cjs/plugins/superset/installer.cjs +232 -0
  47. package/lib/cjs/plugins/superset/manifest.cjs +35 -0
  48. package/lib/cjs/plugins/superset/templates.cjs +844 -0
  49. package/lib/cjs/plugins/superset/types.cjs +39 -0
  50. package/lib/esm/feature-flags/constants.js +12 -0
  51. package/lib/esm/feature-flags/decorators.js +49 -0
  52. package/lib/esm/feature-flags/environment.js +18 -0
  53. package/lib/esm/feature-flags/index.js +14 -0
  54. package/lib/esm/feature-flags/models/FeatureFlag.model.js +72 -0
  55. package/lib/esm/feature-flags/models/FeatureFlagAccess.model.js +69 -0
  56. package/lib/esm/feature-flags/readers/FeatureFlagReader.js +19 -0
  57. package/lib/esm/feature-flags/readers/index.js +2 -0
  58. package/lib/esm/feature-flags/services/FeatureFlag.service.js +250 -0
  59. package/lib/esm/feature-flags/types.js +2 -0
  60. package/lib/esm/feature-flags/utils.js +126 -0
  61. package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js +8 -8
  62. package/lib/esm/graph/shared/nodes/flow-control.js +3 -2
  63. package/lib/esm/graph/shared/types.js +1 -1
  64. package/lib/esm/index.js +5 -4
  65. package/lib/esm/kibana/builders/KibanaIndexBuilder.js +319 -0
  66. package/lib/esm/kibana/builders/KibanaIndexBuilderCollection.js +32 -0
  67. package/lib/esm/kibana/builders/index.js +3 -0
  68. package/lib/esm/kibana/helpers.js +19 -15
  69. package/lib/esm/kibana/index.js +2 -1
  70. package/lib/esm/kibana/types.js +13 -2
  71. package/lib/esm/loader/ObjectLoader.js +115 -0
  72. package/lib/esm/loader/families.js +66 -0
  73. package/lib/esm/loader/index.js +11 -0
  74. package/lib/esm/loader/types.js +2 -0
  75. package/lib/esm/nest/decorators.js +12 -0
  76. package/lib/esm/nest/index.js +2 -2
  77. package/lib/esm/nest/keycloakAuthHandler.js +67 -35
  78. package/lib/esm/nest/keycloakModule.js +7 -10
  79. package/lib/esm/nest/types.js +1 -1
  80. package/lib/esm/nest/utils.js +55 -46
  81. package/lib/esm/plugins/contract.js +68 -0
  82. package/lib/esm/plugins/index.js +18 -0
  83. package/lib/esm/plugins/kibana/host.js +19 -0
  84. package/lib/esm/plugins/kibana/index.js +14 -0
  85. package/lib/esm/plugins/kibana/installer.js +140 -0
  86. package/lib/esm/plugins/kibana/manifest.js +32 -0
  87. package/lib/esm/plugins/kibana/templates.js +499 -0
  88. package/lib/esm/plugins/kibana/types.js +10 -0
  89. package/lib/esm/plugins/superset/host.js +21 -0
  90. package/lib/esm/plugins/superset/index.js +16 -0
  91. package/lib/esm/plugins/superset/installer.js +192 -0
  92. package/lib/esm/plugins/superset/manifest.js +30 -0
  93. package/lib/esm/plugins/superset/templates.js +840 -0
  94. package/lib/esm/plugins/superset/types.js +11 -0
  95. package/lib/types/feature-flags/constants.d.cts +11 -0
  96. package/lib/types/feature-flags/constants.d.mts +11 -0
  97. package/lib/types/feature-flags/decorators.d.cts +11 -0
  98. package/lib/types/feature-flags/decorators.d.mts +11 -0
  99. package/lib/types/feature-flags/environment.d.cts +11 -0
  100. package/lib/types/feature-flags/environment.d.mts +11 -0
  101. package/lib/types/feature-flags/index.d.cts +13 -0
  102. package/lib/types/feature-flags/index.d.mts +13 -0
  103. package/lib/types/feature-flags/models/FeatureFlag.model.d.cts +16 -0
  104. package/lib/types/feature-flags/models/FeatureFlag.model.d.mts +16 -0
  105. package/lib/types/feature-flags/models/FeatureFlagAccess.model.d.cts +15 -0
  106. package/lib/types/feature-flags/models/FeatureFlagAccess.model.d.mts +15 -0
  107. package/lib/types/feature-flags/readers/FeatureFlagReader.d.cts +10 -0
  108. package/lib/types/feature-flags/readers/FeatureFlagReader.d.mts +10 -0
  109. package/lib/types/feature-flags/readers/index.d.cts +1 -0
  110. package/lib/types/feature-flags/readers/index.d.mts +1 -0
  111. package/lib/types/feature-flags/services/FeatureFlag.service.d.cts +43 -0
  112. package/lib/types/feature-flags/services/FeatureFlag.service.d.mts +43 -0
  113. package/lib/types/feature-flags/types.d.cts +39 -0
  114. package/lib/types/feature-flags/types.d.mts +39 -0
  115. package/lib/types/feature-flags/utils.d.cts +13 -0
  116. package/lib/types/feature-flags/utils.d.mts +13 -0
  117. package/lib/types/graph/engine/execution/SwitchGraphNodeExecutor.d.cts +2 -2
  118. package/lib/types/graph/engine/execution/SwitchGraphNodeExecutor.d.mts +2 -2
  119. package/lib/types/graph/shared/types.d.cts +3 -3
  120. package/lib/types/graph/shared/types.d.mts +3 -3
  121. package/lib/types/index.d.cts +3 -2
  122. package/lib/types/index.d.mts +3 -2
  123. package/lib/types/kibana/builders/KibanaIndexBuilder.d.cts +67 -0
  124. package/lib/types/kibana/builders/KibanaIndexBuilder.d.mts +67 -0
  125. package/lib/types/kibana/builders/KibanaIndexBuilderCollection.d.cts +17 -0
  126. package/lib/types/kibana/builders/KibanaIndexBuilderCollection.d.mts +17 -0
  127. package/lib/types/kibana/builders/index.d.cts +2 -0
  128. package/lib/types/kibana/builders/index.d.mts +2 -0
  129. package/lib/types/kibana/index.d.cts +1 -0
  130. package/lib/types/kibana/index.d.mts +1 -0
  131. package/lib/types/kibana/types.d.cts +11 -0
  132. package/lib/types/kibana/types.d.mts +11 -0
  133. package/lib/types/loader/ObjectLoader.d.cts +27 -0
  134. package/lib/types/loader/ObjectLoader.d.mts +27 -0
  135. package/lib/types/loader/families.d.cts +34 -0
  136. package/lib/types/loader/families.d.mts +34 -0
  137. package/lib/types/loader/index.d.cts +10 -0
  138. package/lib/types/loader/index.d.mts +10 -0
  139. package/lib/types/loader/types.d.cts +24 -0
  140. package/lib/types/loader/types.d.mts +24 -0
  141. package/lib/types/nest/decorators.d.cts +8 -0
  142. package/lib/types/nest/decorators.d.mts +8 -0
  143. package/lib/types/nest/index.d.cts +1 -1
  144. package/lib/types/nest/index.d.mts +1 -1
  145. package/lib/types/nest/keycloakAuthHandler.d.cts +19 -42
  146. package/lib/types/nest/keycloakAuthHandler.d.mts +19 -42
  147. package/lib/types/nest/keycloakModule.d.cts +3 -5
  148. package/lib/types/nest/keycloakModule.d.mts +3 -5
  149. package/lib/types/nest/types.d.cts +2 -0
  150. package/lib/types/nest/types.d.mts +2 -0
  151. package/lib/types/nest/utils.d.cts +3 -4
  152. package/lib/types/nest/utils.d.mts +3 -4
  153. package/lib/types/plugins/contract.d.cts +180 -0
  154. package/lib/types/plugins/contract.d.mts +180 -0
  155. package/lib/types/plugins/index.d.cts +17 -0
  156. package/lib/types/plugins/index.d.mts +17 -0
  157. package/lib/types/plugins/kibana/host.d.cts +18 -0
  158. package/lib/types/plugins/kibana/host.d.mts +18 -0
  159. package/lib/types/plugins/kibana/index.d.cts +13 -0
  160. package/lib/types/plugins/kibana/index.d.mts +13 -0
  161. package/lib/types/plugins/kibana/installer.d.cts +45 -0
  162. package/lib/types/plugins/kibana/installer.d.mts +45 -0
  163. package/lib/types/plugins/kibana/manifest.d.cts +31 -0
  164. package/lib/types/plugins/kibana/manifest.d.mts +31 -0
  165. package/lib/types/plugins/kibana/templates.d.cts +12 -0
  166. package/lib/types/plugins/kibana/templates.d.mts +12 -0
  167. package/lib/types/plugins/kibana/types.d.cts +9 -0
  168. package/lib/types/plugins/kibana/types.d.mts +9 -0
  169. package/lib/types/plugins/superset/host.d.cts +20 -0
  170. package/lib/types/plugins/superset/host.d.mts +20 -0
  171. package/lib/types/plugins/superset/index.d.cts +15 -0
  172. package/lib/types/plugins/superset/index.d.mts +15 -0
  173. package/lib/types/plugins/superset/installer.d.cts +70 -0
  174. package/lib/types/plugins/superset/installer.d.mts +70 -0
  175. package/lib/types/plugins/superset/manifest.d.cts +28 -0
  176. package/lib/types/plugins/superset/manifest.d.mts +28 -0
  177. package/lib/types/plugins/superset/templates.d.cts +12 -0
  178. package/lib/types/plugins/superset/templates.d.mts +12 -0
  179. package/lib/types/plugins/superset/types.d.cts +10 -0
  180. package/lib/types/plugins/superset/types.d.mts +10 -0
  181. package/package.json +62 -3
  182. package/plugins/kibana/.gitignore +16 -0
  183. package/plugins/kibana/Dockerfile +19 -0
  184. package/plugins/kibana/docker-compose.yml +50 -0
  185. package/plugins/kibana/host/index.html +101 -0
  186. package/plugins/kibana/setup-dashboards.sh +84 -0
  187. package/plugins/superset/.gitignore +17 -0
  188. package/plugins/superset/Dockerfile +79 -0
  189. package/plugins/superset/docker-compose.yml +62 -0
  190. package/plugins/superset/host/index.html +168 -0
  191. package/plugins/superset/setup-dashboards.sh +106 -0
  192. package/plugins/superset/superset_config.py +49 -0
  193. package/lib/cjs/nest/authService.cjs +0 -91
  194. package/lib/esm/nest/authService.js +0 -86
  195. package/lib/types/nest/authService.d.cts +0 -63
  196. package/lib/types/nest/authService.d.mts +0 -63
@@ -0,0 +1,192 @@
1
+ /**
2
+ * @module integrations/plugins/superset/installer
3
+ * @summary Superset dashboard embed plugin installer.
4
+ * @description Implements `DashboardEmbedPlugin` for Superset using a
5
+ * patch-and-build strategy. Decaf holds patch scripts that modify Superset's
6
+ * internal embedded frontend and SDK source files to add a `switchDashboard`
7
+ * method. `install` materializes the scripts, clones/uses Superset source,
8
+ * applies patches, and builds (SDK + frontend + optionally Docker image).
9
+ *
10
+ * The same `DashboardEmbedPlugin` API as Kibana is exposed. `sendSwitchDashboardMessage`
11
+ * delegates to `target.switchDashboard(dashboardId, guestToken)` (the Superset
12
+ * SDK handle) instead of `postMessage`.
13
+ */
14
+ import { InternalError } from "@decaf-ts/db-decorators";
15
+ import { UnsupportedError } from "@decaf-ts/core";
16
+ import * as fs from "node:fs";
17
+ import * as path from "node:path";
18
+ import { execFile } from "node:child_process";
19
+ import { createSwitchDashboardMessage, sendSwitchDashboardMessage as sendShared, } from "./../contract.js";
20
+ import { SUPERSET_APP_ID, SUPERSET_PLUGIN_ID, SUPERSET_PLUGIN_VERSION, buildSupersetManifest, } from "./manifest.js";
21
+ import { supersetPatchFiles } from "./templates.js";
22
+ /** Default Superset base path when none is provided. */
23
+ export const SUPERSET_DEFAULT_BASE_PATH = "superset";
24
+ /**
25
+ * Build the Superset embedded URL.
26
+ *
27
+ * For Superset, the `dashboardId` field in `EmbedUrlOptions` is the
28
+ * embedded-configuration UUID used in `/embedded/:uuid`.
29
+ *
30
+ * @example
31
+ * buildSupersetEmbedUrl({ host: "superset.example.com", dashboardId: "abc-uuid", parentOrigin: "https://app.example.com" })
32
+ * // => "//superset.example.com/superset/embedded/abc-uuid?parentOrigin=https%3A%2F%2Fapp.example.com"
33
+ */
34
+ export function buildSupersetEmbedUrl(options) {
35
+ const basePath = options.basePath ?? SUPERSET_DEFAULT_BASE_PATH;
36
+ const params = new URLSearchParams();
37
+ params.set("parentOrigin", options.parentOrigin);
38
+ if (options.view?.timeRange) {
39
+ params.set("timeRange", JSON.stringify(options.view.timeRange));
40
+ }
41
+ return `//${options.host}/${basePath}/embedded/${options.dashboardId}?${params.toString()}`;
42
+ }
43
+ /**
44
+ * @class SupersetDashboardEmbedPlugin
45
+ * @summary Superset implementation of the `DashboardEmbedPlugin` contract.
46
+ * @description Org-agnostic multi-tenant dashboard embed plugin for Superset
47
+ * using a patch-and-build strategy. Same API as `KibanaDashboardEmbedPlugin`.
48
+ */
49
+ export class SupersetDashboardEmbedPlugin {
50
+ constructor(targetVersion = "superset") {
51
+ this.descriptor = {
52
+ id: SUPERSET_PLUGIN_ID,
53
+ appId: SUPERSET_APP_ID,
54
+ version: SUPERSET_PLUGIN_VERSION,
55
+ targetVersion,
56
+ tool: "superset",
57
+ };
58
+ }
59
+ manifest(targetVersion = this.descriptor.targetVersion) {
60
+ return buildSupersetManifest(targetVersion);
61
+ }
62
+ buildEmbedUrl(options) {
63
+ return buildSupersetEmbedUrl(options);
64
+ }
65
+ createSwitchDashboardMessage(payload) {
66
+ return createSwitchDashboardMessage(payload);
67
+ }
68
+ sendSwitchDashboardMessage(target, payload, targetOrigin) {
69
+ sendShared(target, payload, targetOrigin);
70
+ }
71
+ /**
72
+ * Materialize the patch and build scripts into `targetPath/`, and when
73
+ * `build` is true, clone/use Superset source, apply patches, and build
74
+ * (SDK + frontend + optionally Docker image).
75
+ *
76
+ * Unlike Kibana (which generates plugin source), Superset's "plugin" is a
77
+ * patch-and-build strategy: Decaf holds scripts that modify Superset's
78
+ * existing internal source files.
79
+ */
80
+ async install(options) {
81
+ const ctx = options.context;
82
+ if (ctx) {
83
+ void ctx;
84
+ }
85
+ if (!options.targetPath || options.targetPath.trim().length === 0) {
86
+ throw new UnsupportedError("install targetPath is required");
87
+ }
88
+ const targetVersion = options.targetVersion ?? this.descriptor.targetVersion;
89
+ const pluginDir = path.resolve(options.targetPath, SUPERSET_APP_ID);
90
+ if (fs.existsSync(pluginDir)) {
91
+ if (!options.overwrite) {
92
+ throw new InternalError(`Plugin directory already exists: ${pluginDir} (use overwrite: true)`);
93
+ }
94
+ fs.rmSync(pluginDir, { recursive: true, force: true });
95
+ }
96
+ const files = supersetPatchFiles();
97
+ const written = [];
98
+ for (const file of files) {
99
+ const fullPath = path.join(pluginDir, file.path);
100
+ fs.mkdirSync(path.dirname(fullPath), { recursive: true });
101
+ fs.writeFileSync(fullPath, file.content, "utf8");
102
+ if (file.executable) {
103
+ fs.chmodSync(fullPath, 0o755);
104
+ }
105
+ written.push(file.path);
106
+ }
107
+ let built = false;
108
+ let buildOutput;
109
+ if (options.build) {
110
+ const supersetRoot = await this.resolveSupersetRoot(pluginDir, options);
111
+ const result = await this.runPatchAndBuild(pluginDir, supersetRoot, options).catch((err) => ({
112
+ ok: false,
113
+ output: err.message,
114
+ }));
115
+ built = result.ok;
116
+ buildOutput = result.output;
117
+ }
118
+ return {
119
+ pluginPath: pluginDir,
120
+ descriptor: { ...this.descriptor, targetVersion },
121
+ files: written,
122
+ built,
123
+ buildOutput,
124
+ };
125
+ }
126
+ /**
127
+ * Resolve the Superset source root: use an existing checkout or clone via git.
128
+ */
129
+ async resolveSupersetRoot(pluginDir, options) {
130
+ if (options.supersetSourcePath) {
131
+ const resolved = path.resolve(options.supersetSourcePath);
132
+ if (!fs.existsSync(path.join(resolved, "superset-frontend", "src", "embedded", "index.tsx"))) {
133
+ throw new InternalError(`Superset source not found at: ${resolved} (missing superset-frontend/src/embedded/index.tsx)`);
134
+ }
135
+ return resolved;
136
+ }
137
+ const gitUrl = options.supersetGitUrl ?? "https://github.com/apache/superset.git";
138
+ const gitRef = options.supersetGitRef ?? options.targetVersion ?? "6.1.0";
139
+ const cloneDir = path.join(pluginDir, ".superset-source");
140
+ if (fs.existsSync(cloneDir)) {
141
+ fs.rmSync(cloneDir, { recursive: true, force: true });
142
+ }
143
+ await this.runCommand("git", ["clone", "--depth", "1", "--branch", gitRef, gitUrl, cloneDir], pluginDir);
144
+ return cloneDir;
145
+ }
146
+ /**
147
+ * Apply patches, verify, and build (SDK + frontend + optionally Docker).
148
+ */
149
+ async runPatchAndBuild(pluginDir, supersetRoot, options) {
150
+ const outputs = [];
151
+ // 1. Apply patch
152
+ const patchResult = await this.runCommand("python3", [path.join(pluginDir, "patches", "apply_superset_6_1_patch.py"), supersetRoot], pluginDir);
153
+ outputs.push(patchResult);
154
+ // 2. Verify patch
155
+ const verifyResult = await this.runCommand(path.join(pluginDir, "patches", "verify_patch.sh"), [supersetRoot], pluginDir);
156
+ outputs.push(verifyResult);
157
+ // 3. Build (Docker image or SDK + frontend)
158
+ if (options.dockerImageTag) {
159
+ const dockerResult = await this.runCommand(path.join(pluginDir, "build", "build-docker-image.sh"), [supersetRoot, options.dockerImageTag], pluginDir);
160
+ outputs.push(dockerResult);
161
+ }
162
+ else {
163
+ const sdkResult = await this.runCommand(path.join(pluginDir, "build", "build-sdk.sh"), [supersetRoot], pluginDir);
164
+ outputs.push(sdkResult);
165
+ const frontendResult = await this.runCommand(path.join(pluginDir, "build", "build-superset-frontend.sh"), [supersetRoot], pluginDir);
166
+ outputs.push(frontendResult);
167
+ }
168
+ return { ok: true, output: outputs.join("\n") };
169
+ }
170
+ /**
171
+ * Run a command and capture stdout+stderr.
172
+ */
173
+ runCommand(cmd, args, cwd) {
174
+ return new Promise((resolve, reject) => {
175
+ execFile(cmd, args, { cwd, timeout: 600000 }, (error, stdout, stderr) => {
176
+ const output = `${stdout ?? ""}${stderr ?? ""}`.trim();
177
+ if (error) {
178
+ reject(new Error(output || error.message));
179
+ return;
180
+ }
181
+ resolve(output);
182
+ });
183
+ });
184
+ }
185
+ }
186
+ /** Default singleton instance. */
187
+ export const supersetDashboardEmbedPlugin = new SupersetDashboardEmbedPlugin();
188
+ /** Factory accepting a target Superset version. */
189
+ export function createSupersetDashboardEmbedPlugin(targetVersion) {
190
+ return new SupersetDashboardEmbedPlugin(targetVersion);
191
+ }
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3BsdWdpbnMvc3VwZXJzZXQvaW5zdGFsbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQXNCLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEUsT0FBTyxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxLQUFLLElBQUksTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlDLE9BQU8sRUFDTCw0QkFBNEIsRUFDNUIsMEJBQTBCLElBQUksVUFBVSxHQVN6Qyx5QkFBb0I7QUFDckIsT0FBTyxFQUNMLGVBQWUsRUFDZixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixHQUN0QixzQkFBbUI7QUFDcEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLHVCQUFvQjtBQUVqRCx3REFBd0Q7QUFDeEQsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsVUFBVSxDQUFDO0FBZ0JyRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsT0FBd0I7SUFDNUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSwwQkFBMEIsQ0FBQztJQUNoRSxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ3JDLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDNUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMs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Q0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUVELE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbEQsQ0FBQztJQUVEOztPQUVHO0lBQ08sVUFBVSxDQUNsQixHQUFXLEVBQ1gsSUFBYyxFQUNkLEdBQVc7UUFFWCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLFFBQVEsQ0FDTixHQUFHLEVBQ0gsSUFBSSxFQUNKLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFDeEIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUN4QixNQUFNLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN2RCxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUNWLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQzNDLE9BQU87Z0JBQ1QsQ0FBQztnQkFDRCxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEIsQ0FBQyxDQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVELGtDQUFrQztBQUNsQyxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLDRCQUE0QixFQUFFLENBQUM7QUFFL0UsbURBQW1EO0FBQ25ELE1BQU0sVUFBVSxrQ0FBa0MsQ0FDaEQsYUFBcUI7SUFFckIsT0FBTyxJQUFJLDRCQUE0QixDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ3pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL3BsdWdpbnMvc3VwZXJzZXQvaW5zdGFsbGVyXG4gKiBAc3VtbWFyeSBTdXBlcnNldCBkYXNoYm9hcmQgZW1iZWQgcGx1Z2luIGluc3RhbGxlci5cbiAqIEBkZXNjcmlwdGlvbiBJbXBsZW1lbnRzIGBEYXNoYm9hcmRFbWJlZFBsdWdpbmAgZm9yIFN1cGVyc2V0IHVzaW5nIGFcbiAqIHBhdGNoLWFuZC1idWlsZCBzdHJhdGVneS4gRGVjYWYgaG9sZHMgcGF0Y2ggc2NyaXB0cyB0aGF0IG1vZGlmeSBTdXBlcnNldCdzXG4gKiBpbnRlcm5hbCBlbWJlZGRlZCBmcm9udGVuZCBhbmQgU0RLIHNvdXJjZSBmaWxlcyB0byBhZGQgYSBgc3dpdGNoRGFzaGJvYXJkYFxuICogbWV0aG9kLiBgaW5zdGFsbGAgbWF0ZXJpYWxpemVzIHRoZSBzY3JpcHRzLCBjbG9uZXMvdXNlcyBTdXBlcnNldCBzb3VyY2UsXG4gKiBhcHBsaWVzIHBhdGNoZXMsIGFuZCBidWlsZHMgKFNESyArIGZyb250ZW5kICsgb3B0aW9uYWxseSBEb2NrZXIgaW1hZ2UpLlxuICpcbiAqIFRoZSBzYW1lIGBEYXNoYm9hcmRFbWJlZFBsdWdpbmAgQVBJIGFzIEtpYmFuYSBpcyBleHBvc2VkLiBgc2VuZFN3aXRjaERhc2hib2FyZE1lc3NhZ2VgXG4gKiBkZWxlZ2F0ZXMgdG8gYHRhcmdldC5zd2l0Y2hEYXNoYm9hcmQoZGFzaGJvYXJkSWQsIGd1ZXN0VG9rZW4pYCAodGhlIFN1cGVyc2V0XG4gKiBTREsgaGFuZGxlKSBpbnN0ZWFkIG9mIGBwb3N0TWVzc2FnZWAuXG4gKi9cbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IsIE1heWJlQ29udGV4dHVhbEFyZyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZXhlY0ZpbGUgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5cbmltcG9ydCB7XG4gIGNyZWF0ZVN3aXRjaERhc2hib2FyZE1lc3NhZ2UsXG4gIHNlbmRTd2l0Y2hEYXNoYm9hcmRNZXNzYWdlIGFzIHNlbmRTaGFyZWQsXG4gIHR5cGUgRGFzaGJvYXJkRW1iZWRQbHVnaW4sXG4gIHR5cGUgRGFzaGJvYXJkRW1iZWRQbHVnaW5EZXNjcmlwdG9yLFxuICB0eXBlIEVtYmVkTWVzc2FnZVRhcmdldCxcbiAgdHlwZSBFbWJlZFVybE9wdGlvbnMsXG4gIHR5cGUgUGx1Z2luSW5zdGFsbE9wdGlvbnMsXG4gIHR5cGUgUGx1Z2luSW5zdGFsbFJlc3VsdCxcbiAgdHlwZSBTd2l0Y2hEYXNoYm9hcmRQYXlsb2FkLFxuICB0eXBlIFN3aXRjaERhc2hib2FyZE1lc3NhZ2UsXG59IGZyb20gXCIuLi9jb250cmFjdFwiO1xuaW1wb3J0IHtcbiAgU1VQRVJTRVRfQVBQX0lELFxuICBTVVBFUlNFVF9QTFVHSU5fSUQsXG4gIFNVUEVSU0VUX1BMVUdJTl9WRVJTSU9OLFxuICBidWlsZFN1cGVyc2V0TWFuaWZlc3QsXG59IGZyb20gXCIuL21hbmlmZXN0XCI7XG5pbXBvcnQgeyBzdXBlcnNldFBhdGNoRmlsZXMgfSBmcm9tIFwiLi90ZW1wbGF0ZXNcIjtcblxuLyoqIERlZmF1bHQgU3VwZXJzZXQgYmFzZSBwYXRoIHdoZW4gbm9uZSBpcyBwcm92aWRlZC4gKi9cbmV4cG9ydCBjb25zdCBTVVBFUlNFVF9ERUZBVUxUX0JBU0VfUEFUSCA9IFwic3VwZXJzZXRcIjtcblxuLyoqXG4gKiBFeHRlbnNpb24gb2YgYFBsdWdpbkluc3RhbGxPcHRpb25zYCBmb3IgU3VwZXJzZXQtc3BlY2lmaWMgYnVpbGQgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdXBlcnNldEluc3RhbGxPcHRpb25zIGV4dGVuZHMgUGx1Z2luSW5zdGFsbE9wdGlvbnMge1xuICAvKiogUGF0aCB0byBhbiBleGlzdGluZyBTdXBlcnNldCBzb3VyY2UgY2hlY2tvdXQuIElmIGFic2VudCwgdGhlIGluc3RhbGxlciBjbG9uZXMgdmlhIGdpdC4gKi9cbiAgc3VwZXJzZXRTb3VyY2VQYXRoPzogc3RyaW5nO1xuICAvKiogR2l0IFVSTCB0byBjbG9uZSBTdXBlcnNldCBmcm9tICh1c2VkIHdoZW4gYHN1cGVyc2V0U291cmNlUGF0aGAgaXMgYWJzZW50KS4gKi9cbiAgc3VwZXJzZXRHaXRVcmw/OiBzdHJpbmc7XG4gIC8qKiBHaXQgcmVmL2JyYW5jaC90YWcgdG8gY2hlY2tvdXQgYWZ0ZXIgY2xvbmluZy4gKi9cbiAgc3VwZXJzZXRHaXRSZWY/OiBzdHJpbmc7XG4gIC8qKiBEb2NrZXIgaW1hZ2UgdGFnIHRvIGJ1aWxkICh3aGVuIHByb3ZpZGVkLCBidWlsZHMgYSBEb2NrZXIgaW1hZ2UgaW5zdGVhZCBvZiBqdXN0IFNESytmcm9udGVuZCkuICovXG4gIGRvY2tlckltYWdlVGFnPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBTdXBlcnNldCBlbWJlZGRlZCBVUkwuXG4gKlxuICogRm9yIFN1cGVyc2V0LCB0aGUgYGRhc2hib2FyZElkYCBmaWVsZCBpbiBgRW1iZWRVcmxPcHRpb25zYCBpcyB0aGVcbiAqIGVtYmVkZGVkLWNvbmZpZ3VyYXRpb24gVVVJRCB1c2VkIGluIGAvZW1iZWRkZWQvOnV1aWRgLlxuICpcbiAqIEBleGFtcGxlXG4gKiAgIGJ1aWxkU3VwZXJzZXRFbWJlZFVybCh7IGhvc3Q6IFwic3VwZXJzZXQuZXhhbXBsZS5jb21cIiwgZGFzaGJvYXJkSWQ6IFwiYWJjLXV1aWRcIiwgcGFyZW50T3JpZ2luOiBcImh0dHBzOi8vYXBwLmV4YW1wbGUuY29tXCIgfSlcbiAqICAgLy8gPT4gXCIvL3N1cGVyc2V0LmV4YW1wbGUuY29tL3N1cGVyc2V0L2VtYmVkZGVkL2FiYy11dWlkP3BhcmVudE9yaWdpbj1odHRwcyUzQSUyRiUyRmFwcC5leGFtcGxlLmNvbVwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFN1cGVyc2V0RW1iZWRVcmwob3B0aW9uczogRW1iZWRVcmxPcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZVBhdGggPSBvcHRpb25zLmJhc2VQYXRoID8/IFNVUEVSU0VUX0RFRkFVTFRfQkFTRV9QQVRIO1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gIHBhcmFtcy5zZXQoXCJwYXJlbnRPcmlnaW5cIiwgb3B0aW9ucy5wYXJlbnRPcmlnaW4pO1xuICBpZiAob3B0aW9ucy52aWV3Py50aW1lUmFuZ2UpIHtcbiAgICBwYXJhbXMuc2V0KFwidGltZVJhbmdlXCIsIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMudmlldy50aW1lUmFuZ2UpKTtcbiAgfVxuICByZXR1cm4gYC8vJHtvcHRpb25zLmhvc3R9LyR7YmFzZVBhdGh9L2VtYmVkZGVkLyR7b3B0aW9ucy5kYXNoYm9hcmRJZH0/JHtwYXJhbXMudG9TdHJpbmcoKX1gO1xufVxuXG4vKipcbiAqIEBjbGFzcyBTdXBlcnNldERhc2hib2FyZEVtYmVkUGx1Z2luXG4gKiBAc3VtbWFyeSBTdXBlcnNldCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYERhc2hib2FyZEVtYmVkUGx1Z2luYCBjb250cmFjdC5cbiAqIEBkZXNjcmlwdGlvbiBPcmctYWdub3N0aWMgbXVsdGktdGVuYW50IGRhc2hib2FyZCBlbWJlZCBwbHVnaW4gZm9yIFN1cGVyc2V0XG4gKiB1c2luZyBhIHBhdGNoLWFuZC1idWlsZCBzdHJhdGVneS4gU2FtZSBBUEkgYXMgYEtpYmFuYURhc2hib2FyZEVtYmVkUGx1Z2luYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFN1cGVyc2V0RGFzaGJvYXJkRW1iZWRQbHVnaW4gaW1wbGVtZW50cyBEYXNoYm9hcmRFbWJlZFBsdWdpbiB7XG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdG9yOiBEYXNoYm9hcmRFbWJlZFBsdWdpbkRlc2NyaXB0b3I7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRhcmdldFZlcnNpb246IHN0cmluZyA9IFwic3VwZXJzZXRcIikge1xuICAgIHRoaXMuZGVzY3JpcHRvciA9IHtcbiAgICAgIGlkOiBTVVBFUlNFVF9QTFVHSU5fSUQsXG4gICAgICBhcHBJZDogU1VQRVJTRVRfQVBQX0lELFxuICAgICAgdmVyc2lvbjogU1VQRVJTRVRfUExVR0lOX1ZFUlNJT04sXG4gICAgICB0YXJnZXRWZXJzaW9uLFxuICAgICAgdG9vbDogXCJzdXBlcnNldFwiLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgbWFuaWZlc3QodGFyZ2V0VmVyc2lvbjogc3RyaW5nID0gdGhpcy5kZXNjcmlwdG9yLnRhcmdldFZlcnNpb24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIGJ1aWxkU3VwZXJzZXRNYW5pZmVzdCh0YXJnZXRWZXJzaW9uKSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgcHVibGljIGJ1aWxkRW1iZWRVcmwob3B0aW9uczogRW1iZWRVcmxPcHRpb25zKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYnVpbGRTdXBlcnNldEVtYmVkVXJsKG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVN3aXRjaERhc2hib2FyZE1lc3NhZ2UoXG4gICAgcGF5bG9hZDogU3dpdGNoRGFzaGJvYXJkUGF5bG9hZFxuICApOiBTd2l0Y2hEYXNoYm9hcmRNZXNzYWdlIHtcbiAgICByZXR1cm4gY3JlYXRlU3dpdGNoRGFzaGJvYXJkTWVzc2FnZShwYXlsb2FkKTtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kU3dpdGNoRGFzaGJvYXJkTWVzc2FnZShcbiAgICB0YXJnZXQ6IEVtYmVkTWVzc2FnZVRhcmdldCxcbiAgICBwYXlsb2FkOiBTd2l0Y2hEYXNoYm9hcmRQYXlsb2FkLFxuICAgIHRhcmdldE9yaWdpbjogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIHNlbmRTaGFyZWQodGFyZ2V0LCBwYXlsb2FkLCB0YXJnZXRPcmlnaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hdGVyaWFsaXplIHRoZSBwYXRjaCBhbmQgYnVpbGQgc2NyaXB0cyBpbnRvIGB0YXJnZXRQYXRoL2AsIGFuZCB3aGVuXG4gICAqIGBidWlsZGAgaXMgdHJ1ZSwgY2xvbmUvdXNlIFN1cGVyc2V0IHNvdXJjZSwgYXBwbHkgcGF0Y2hlcywgYW5kIGJ1aWxkXG4gICAqIChTREsgKyBmcm9udGVuZCArIG9wdGlvbmFsbHkgRG9ja2VyIGltYWdlKS5cbiAgICpcbiAgICogVW5saWtlIEtpYmFuYSAod2hpY2ggZ2VuZXJhdGVzIHBsdWdpbiBzb3VyY2UpLCBTdXBlcnNldCdzIFwicGx1Z2luXCIgaXMgYVxuICAgKiBwYXRjaC1hbmQtYnVpbGQgc3RyYXRlZ3k6IERlY2FmIGhvbGRzIHNjcmlwdHMgdGhhdCBtb2RpZnkgU3VwZXJzZXQnc1xuICAgKiBleGlzdGluZyBpbnRlcm5hbCBzb3VyY2UgZmlsZXMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW5zdGFsbChcbiAgICBvcHRpb25zOiBTdXBlcnNldEluc3RhbGxPcHRpb25zXG4gICk6IFByb21pc2U8UGx1Z2luSW5zdGFsbFJlc3VsdD4ge1xuICAgIGNvbnN0IGN0eCA9IG9wdGlvbnMuY29udGV4dCBhcyBNYXliZUNvbnRleHR1YWxBcmc8YW55PiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoY3R4KSB7XG4gICAgICB2b2lkIGN0eDtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLnRhcmdldFBhdGggfHwgb3B0aW9ucy50YXJnZXRQYXRoLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFwiaW5zdGFsbCB0YXJnZXRQYXRoIGlzIHJlcXVpcmVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldFZlcnNpb24gPSBvcHRpb25zLnRhcmdldFZlcnNpb24gPz8gdGhpcy5kZXNjcmlwdG9yLnRhcmdldFZlcnNpb247XG4gICAgY29uc3QgcGx1Z2luRGlyID0gcGF0aC5yZXNvbHZlKFxuICAgICAgb3B0aW9ucy50YXJnZXRQYXRoLFxuICAgICAgU1VQRVJTRVRfQVBQX0lEXG4gICAgKTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKHBsdWdpbkRpcikpIHtcbiAgICAgIGlmICghb3B0aW9ucy5vdmVyd3JpdGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYFBsdWdpbiBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHM6ICR7cGx1Z2luRGlyfSAodXNlIG92ZXJ3cml0ZTogdHJ1ZSlgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBmcy5ybVN5bmMocGx1Z2luRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsZXMgPSBzdXBlcnNldFBhdGNoRmlsZXMoKTtcbiAgICBjb25zdCB3cml0dGVuOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4ocGx1Z2luRGlyLCBmaWxlLnBhdGgpO1xuICAgICAgZnMubWtkaXJTeW5jKHBhdGguZGlybmFtZShmdWxsUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhmdWxsUGF0aCwgZmlsZS5jb250ZW50LCBcInV0ZjhcIik7XG4gICAgICBpZiAoZmlsZS5leGVjdXRhYmxlKSB7XG4gICAgICAgIGZzLmNobW9kU3luYyhmdWxsUGF0aCwgMG83NTUpO1xuICAgICAgfVxuICAgICAgd3JpdHRlbi5wdXNoKGZpbGUucGF0aCk7XG4gICAgfVxuXG4gICAgbGV0IGJ1aWx0ID0gZmFsc2U7XG4gICAgbGV0IGJ1aWxkT3V0cHV0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAob3B0aW9ucy5idWlsZCkge1xuICAgICAgY29uc3Qgc3VwZXJzZXRSb290ID0gYXdhaXQgdGhpcy5yZXNvbHZlU3VwZXJzZXRSb290KHBsdWdpbkRpciwgb3B0aW9ucyk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1blBhdGNoQW5kQnVpbGQoXG4gICAgICAgIHBsdWdpbkRpcixcbiAgICAgICAgc3VwZXJzZXRSb290LFxuICAgICAgICBvcHRpb25zXG4gICAgICApLmNhdGNoKChlcnI6IEVycm9yKSA9PiAoe1xuICAgICAgICBvazogZmFsc2UgYXMgY29uc3QsXG4gICAgICAgIG91dHB1dDogZXJyLm1lc3NhZ2UsXG4gICAgICB9KSk7XG4gICAgICBidWlsdCA9IHJlc3VsdC5vaztcbiAgICAgIGJ1aWxkT3V0cHV0ID0gcmVzdWx0Lm91dHB1dDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGx1Z2luUGF0aDogcGx1Z2luRGlyLFxuICAgICAgZGVzY3JpcHRvcjogeyAuLi50aGlzLmRlc2NyaXB0b3IsIHRhcmdldFZlcnNpb24gfSxcbiAgICAgIGZpbGVzOiB3cml0dGVuLFxuICAgICAgYnVpbHQsXG4gICAgICBidWlsZE91dHB1dCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIFN1cGVyc2V0IHNvdXJjZSByb290OiB1c2UgYW4gZXhpc3RpbmcgY2hlY2tvdXQgb3IgY2xvbmUgdmlhIGdpdC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyByZXNvbHZlU3VwZXJzZXRSb290KFxuICAgIHBsdWdpbkRpcjogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFN1cGVyc2V0SW5zdGFsbE9wdGlvbnNcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAob3B0aW9ucy5zdXBlcnNldFNvdXJjZVBhdGgpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcGF0aC5yZXNvbHZlKG9wdGlvbnMuc3VwZXJzZXRTb3VyY2VQYXRoKTtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocmVzb2x2ZWQsIFwic3VwZXJzZXQtZnJvbnRlbmRcIiwgXCJzcmNcIiwgXCJlbWJlZGRlZFwiLCBcImluZGV4LnRzeFwiKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYFN1cGVyc2V0IHNvdXJjZSBub3QgZm91bmQgYXQ6ICR7cmVzb2x2ZWR9IChtaXNzaW5nIHN1cGVyc2V0LWZyb250ZW5kL3NyYy9lbWJlZGRlZC9pbmRleC50c3gpYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGdpdFVybCA9IG9wdGlvbnMuc3VwZXJzZXRHaXRVcmwgPz8gXCJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3N1cGVyc2V0LmdpdFwiO1xuICAgIGNvbnN0IGdpdFJlZiA9IG9wdGlvbnMuc3VwZXJzZXRHaXRSZWYgPz8gb3B0aW9ucy50YXJnZXRWZXJzaW9uID8/IFwiNi4xLjBcIjtcbiAgICBjb25zdCBjbG9uZURpciA9IHBhdGguam9pbihwbHVnaW5EaXIsIFwiLnN1cGVyc2V0LXNvdXJjZVwiKTtcblxuICAgIGlmIChmcy5leGlzdHNTeW5jKGNsb25lRGlyKSkge1xuICAgICAgZnMucm1TeW5jKGNsb25lRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5ydW5Db21tYW5kKFwiZ2l0XCIsIFtcImNsb25lXCIsIFwiLS1kZXB0aFwiLCBcIjFcIiwgXCItLWJyYW5jaFwiLCBnaXRSZWYsIGdpdFVybCwgY2xvbmVEaXJdLCBwbHVnaW5EaXIpO1xuICAgIHJldHVybiBjbG9uZURpcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBwYXRjaGVzLCB2ZXJpZnksIGFuZCBidWlsZCAoU0RLICsgZnJvbnRlbmQgKyBvcHRpb25hbGx5IERvY2tlcikuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcnVuUGF0Y2hBbmRCdWlsZChcbiAgICBwbHVnaW5EaXI6IHN0cmluZyxcbiAgICBzdXBlcnNldFJvb3Q6IHN0cmluZyxcbiAgICBvcHRpb25zOiBTdXBlcnNldEluc3RhbGxPcHRpb25zXG4gICk6IFByb21pc2U8eyBvazogYm9vbGVhbjsgb3V0cHV0OiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IG91dHB1dHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyAxLiBBcHBseSBwYXRjaFxuICAgIGNvbnN0IHBhdGNoUmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5Db21tYW5kKFxuICAgICAgXCJweXRob24zXCIsXG4gICAgICBbcGF0aC5qb2luKHBsdWdpbkRpciwgXCJwYXRjaGVzXCIsIFwiYXBwbHlfc3VwZXJzZXRfNl8xX3BhdGNoLnB5XCIpLCBzdXBlcnNldFJvb3RdLFxuICAgICAgcGx1Z2luRGlyXG4gICAgKTtcbiAgICBvdXRwdXRzLnB1c2gocGF0Y2hSZXN1bHQpO1xuXG4gICAgLy8gMi4gVmVyaWZ5IHBhdGNoXG4gICAgY29uc3QgdmVyaWZ5UmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5Db21tYW5kKFxuICAgICAgcGF0aC5qb2luKHBsdWdpbkRpciwgXCJwYXRjaGVzXCIsIFwidmVyaWZ5X3BhdGNoLnNoXCIpLFxuICAgICAgW3N1cGVyc2V0Um9vdF0sXG4gICAgICBwbHVnaW5EaXJcbiAgICApO1xuICAgIG91dHB1dHMucHVzaCh2ZXJpZnlSZXN1bHQpO1xuXG4gICAgLy8gMy4gQnVpbGQgKERvY2tlciBpbWFnZSBvciBTREsgKyBmcm9udGVuZClcbiAgICBpZiAob3B0aW9ucy5kb2NrZXJJbWFnZVRhZykge1xuICAgICAgY29uc3QgZG9ja2VyUmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5Db21tYW5kKFxuICAgICAgICBwYXRoLmpvaW4ocGx1Z2luRGlyLCBcImJ1aWxkXCIsIFwiYnVpbGQtZG9ja2VyLWltYWdlLnNoXCIpLFxuICAgICAgICBbc3VwZXJzZXRSb290LCBvcHRpb25zLmRvY2tlckltYWdlVGFnXSxcbiAgICAgICAgcGx1Z2luRGlyXG4gICAgICApO1xuICAgICAgb3V0cHV0cy5wdXNoKGRvY2tlclJlc3VsdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNka1Jlc3VsdCA9IGF3YWl0IHRoaXMucnVuQ29tbWFuZChcbiAgICAgICAgcGF0aC5qb2luKHBsdWdpbkRpciwgXCJidWlsZFwiLCBcImJ1aWxkLXNkay5zaFwiKSxcbiAgICAgICAgW3N1cGVyc2V0Um9vdF0sXG4gICAgICAgIHBsdWdpbkRpclxuICAgICAgKTtcbiAgICAgIG91dHB1dHMucHVzaChzZGtSZXN1bHQpO1xuXG4gICAgICBjb25zdCBmcm9udGVuZFJlc3VsdCA9IGF3YWl0IHRoaXMucnVuQ29tbWFuZChcbiAgICAgICAgcGF0aC5qb2luKHBsdWdpbkRpciwgXCJidWlsZFwiLCBcImJ1aWxkLXN1cGVyc2V0LWZyb250ZW5kLnNoXCIpLFxuICAgICAgICBbc3VwZXJzZXRSb290XSxcbiAgICAgICAgcGx1Z2luRGlyXG4gICAgICApO1xuICAgICAgb3V0cHV0cy5wdXNoKGZyb250ZW5kUmVzdWx0KTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBvazogdHJ1ZSwgb3V0cHV0OiBvdXRwdXRzLmpvaW4oXCJcXG5cIikgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYSBjb21tYW5kIGFuZCBjYXB0dXJlIHN0ZG91dCtzdGRlcnIuXG4gICAqL1xuICBwcm90ZWN0ZWQgcnVuQ29tbWFuZChcbiAgICBjbWQ6IHN0cmluZyxcbiAgICBhcmdzOiBzdHJpbmdbXSxcbiAgICBjd2Q6IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgY21kLFxuICAgICAgICBhcmdzLFxuICAgICAgICB7IGN3ZCwgdGltZW91dDogNjAwMDAwIH0sXG4gICAgICAgIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgICBjb25zdCBvdXRwdXQgPSBgJHtzdGRvdXQgPz8gXCJcIn0ke3N0ZGVyciA/PyBcIlwifWAudHJpbSgpO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihvdXRwdXQgfHwgZXJyb3IubWVzc2FnZSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKG91dHB1dCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIERlZmF1bHQgc2luZ2xldG9uIGluc3RhbmNlLiAqL1xuZXhwb3J0IGNvbnN0IHN1cGVyc2V0RGFzaGJvYXJkRW1iZWRQbHVnaW4gPSBuZXcgU3VwZXJzZXREYXNoYm9hcmRFbWJlZFBsdWdpbigpO1xuXG4vKiogRmFjdG9yeSBhY2NlcHRpbmcgYSB0YXJnZXQgU3VwZXJzZXQgdmVyc2lvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdXBlcnNldERhc2hib2FyZEVtYmVkUGx1Z2luKFxuICB0YXJnZXRWZXJzaW9uOiBzdHJpbmdcbik6IFN1cGVyc2V0RGFzaGJvYXJkRW1iZWRQbHVnaW4ge1xuICByZXR1cm4gbmV3IFN1cGVyc2V0RGFzaGJvYXJkRW1iZWRQbHVnaW4odGFyZ2V0VmVyc2lvbik7XG59XG4iXX0=
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @module integrations/plugins/superset/manifest
3
+ * @summary Superset embed plugin manifest builder (stub).
4
+ * @description Superset has no Kibana-style native plugin system. This builder
5
+ * returns a placeholder manifest describing the embed strategy. Detailed
6
+ * Superset support is deferred ("to be ignored for now").
7
+ */
8
+ import { EMBED_MESSAGE_TYPE } from "./../contract.js";
9
+ export const SUPERSET_PLUGIN_ID = "orgDashboardEmbedSuperset";
10
+ export const SUPERSET_APP_ID = "org_dashboard_embed_superset";
11
+ export const SUPERSET_PLUGIN_VERSION = "1.0.0";
12
+ /**
13
+ * Build the placeholder Superset manifest for a target Superset version.
14
+ */
15
+ export function buildSupersetManifest(targetVersion = "superset") {
16
+ return {
17
+ id: SUPERSET_PLUGIN_ID,
18
+ version: SUPERSET_PLUGIN_VERSION,
19
+ targetVersion,
20
+ tool: "superset",
21
+ server: true,
22
+ ui: true,
23
+ embedStrategy: "iframe",
24
+ status: "stub",
25
+ requiredPlugins: [],
26
+ optionalPlugins: [],
27
+ };
28
+ }
29
+ export { EMBED_MESSAGE_TYPE };
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuaWZlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcGx1Z2lucy9zdXBlcnNldC9tYW5pZmVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUseUJBQW9CO0FBRWpELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLDJCQUEyQixDQUFDO0FBQzlELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyw4QkFBOEIsQ0FBQztBQUM5RCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxPQUFPLENBQUM7QUFlL0M7O0dBRUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLGdCQUF3QixVQUFVO0lBRWxDLE9BQU87UUFDTCxFQUFFLEVBQUUsa0JBQWtCO1FBQ3RCLE9BQU8sRUFBRSx1QkFBdUI7UUFDaEMsYUFBYTtRQUNiLElBQUksRUFBRSxVQUFVO1FBQ2hCLE1BQU0sRUFBRSxJQUFJO1FBQ1osRUFBRSxFQUFFLElBQUk7UUFDUixhQUFhLEVBQUUsUUFBUTtRQUN2QixNQUFNLEVBQUUsTUFBTTtRQUNkLGVBQWUsRUFBRSxFQUFFO1FBQ25CLGVBQWUsRUFBRSxFQUFFO0tBQ3BCLENBQUM7QUFDSixDQUFDO0FBRUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL3BsdWdpbnMvc3VwZXJzZXQvbWFuaWZlc3RcbiAqIEBzdW1tYXJ5IFN1cGVyc2V0IGVtYmVkIHBsdWdpbiBtYW5pZmVzdCBidWlsZGVyIChzdHViKS5cbiAqIEBkZXNjcmlwdGlvbiBTdXBlcnNldCBoYXMgbm8gS2liYW5hLXN0eWxlIG5hdGl2ZSBwbHVnaW4gc3lzdGVtLiBUaGlzIGJ1aWxkZXJcbiAqIHJldHVybnMgYSBwbGFjZWhvbGRlciBtYW5pZmVzdCBkZXNjcmliaW5nIHRoZSBlbWJlZCBzdHJhdGVneS4gRGV0YWlsZWRcbiAqIFN1cGVyc2V0IHN1cHBvcnQgaXMgZGVmZXJyZWQgKFwidG8gYmUgaWdub3JlZCBmb3Igbm93XCIpLlxuICovXG5pbXBvcnQgeyBFTUJFRF9NRVNTQUdFX1RZUEUgfSBmcm9tIFwiLi4vY29udHJhY3RcIjtcblxuZXhwb3J0IGNvbnN0IFNVUEVSU0VUX1BMVUdJTl9JRCA9IFwib3JnRGFzaGJvYXJkRW1iZWRTdXBlcnNldFwiO1xuZXhwb3J0IGNvbnN0IFNVUEVSU0VUX0FQUF9JRCA9IFwib3JnX2Rhc2hib2FyZF9lbWJlZF9zdXBlcnNldFwiO1xuZXhwb3J0IGNvbnN0IFNVUEVSU0VUX1BMVUdJTl9WRVJTSU9OID0gXCIxLjAuMFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN1cGVyc2V0TWFuaWZlc3Qge1xuICBpZDogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIHRhcmdldFZlcnNpb246IHN0cmluZztcbiAgdG9vbDogXCJzdXBlcnNldFwiO1xuICBzZXJ2ZXI6IGJvb2xlYW47XG4gIHVpOiBib29sZWFuO1xuICBlbWJlZFN0cmF0ZWd5OiBcImlmcmFtZVwiO1xuICBzdGF0dXM6IFwic3R1YlwiO1xuICByZXF1aXJlZFBsdWdpbnM6IHN0cmluZ1tdO1xuICBvcHRpb25hbFBsdWdpbnM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBwbGFjZWhvbGRlciBTdXBlcnNldCBtYW5pZmVzdCBmb3IgYSB0YXJnZXQgU3VwZXJzZXQgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3VwZXJzZXRNYW5pZmVzdChcbiAgdGFyZ2V0VmVyc2lvbjogc3RyaW5nID0gXCJzdXBlcnNldFwiXG4pOiBTdXBlcnNldE1hbmlmZXN0IHtcbiAgcmV0dXJuIHtcbiAgICBpZDogU1VQRVJTRVRfUExVR0lOX0lELFxuICAgIHZlcnNpb246IFNVUEVSU0VUX1BMVUdJTl9WRVJTSU9OLFxuICAgIHRhcmdldFZlcnNpb24sXG4gICAgdG9vbDogXCJzdXBlcnNldFwiLFxuICAgIHNlcnZlcjogdHJ1ZSxcbiAgICB1aTogdHJ1ZSxcbiAgICBlbWJlZFN0cmF0ZWd5OiBcImlmcmFtZVwiLFxuICAgIHN0YXR1czogXCJzdHViXCIsXG4gICAgcmVxdWlyZWRQbHVnaW5zOiBbXSxcbiAgICBvcHRpb25hbFBsdWdpbnM6IFtdLFxuICB9O1xufVxuXG5leHBvcnQgeyBFTUJFRF9NRVNTQUdFX1RZUEUgfTtcbiJdfQ==