@decohere/create 0.0.1-dev.48 → 0.0.1-dev.49

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 (124) hide show
  1. package/commonjs/src/cli.js +3 -3
  2. package/commonjs/src/resolve-launch.js +53 -0
  3. package/commonjs/src/runner.js +5 -45
  4. package/commonjs/src/version.js +1 -1
  5. package/es6/src/cli.js +3 -3
  6. package/es6/src/resolve-launch.js +46 -0
  7. package/es6/src/runner.js +8 -57
  8. package/es6/src/version.js +3 -3
  9. package/pack-builder-tgz.mjs +1 -1
  10. package/package.json +4 -11
  11. package/types/src/resolve-launch.d.ts +10 -0
  12. package/types/src/runner.d.ts +3 -13
  13. package/types/src/version.d.ts +0 -2
  14. package/commonjs/src/domain/prompt.js +0 -64
  15. package/commonjs/src/models/compose.model.js +0 -138
  16. package/commonjs/src/models/config-yaml.model.js +0 -88
  17. package/commonjs/src/models/const.js +0 -31
  18. package/commonjs/src/models/dev-container.model.js +0 -100
  19. package/commonjs/src/models/docker-image.model.js +0 -221
  20. package/commonjs/src/models/env-file.model.js +0 -47
  21. package/commonjs/src/models/gitignore.model.js +0 -31
  22. package/commonjs/src/models/launch-json.model.js +0 -74
  23. package/commonjs/src/models/package-json.model.js +0 -133
  24. package/commonjs/src/models/project.model.js +0 -134
  25. package/commonjs/src/models/source-file.js +0 -6
  26. package/commonjs/src/models/tsconfig.model.js +0 -34
  27. package/commonjs/src/models/vscode-settings.model.js +0 -31
  28. package/commonjs/src/program.js +0 -135
  29. package/commonjs/src/resolve-target-dir.js +0 -19
  30. package/commonjs/src/services/scaffold.service.js +0 -62
  31. package/commonjs/src/webapi/api-name.js +0 -95
  32. package/commonjs/src/webapi/const.js +0 -50
  33. package/commonjs/src/webapi/create-api.js +0 -285
  34. package/commonjs/src/webapi/features/auth.feature.js +0 -463
  35. package/commonjs/src/webapi/features/auth0-cli.js +0 -406
  36. package/commonjs/src/webapi/features/biome-format.js +0 -49
  37. package/commonjs/src/webapi/features/database.feature.js +0 -273
  38. package/commonjs/src/webapi/features/finalize.feature.js +0 -91
  39. package/commonjs/src/webapi/features/postman.feature.js +0 -319
  40. package/commonjs/src/webapi/models/api-package-json.model.js +0 -63
  41. package/commonjs/src/webapi/models/auth-config.model.js +0 -26
  42. package/commonjs/src/webapi/models/controller-source-file.model.js +0 -188
  43. package/commonjs/src/webapi/models/github-ci.model.js +0 -193
  44. package/commonjs/src/webapi/models/main-source-file.model.js +0 -165
  45. package/commonjs/src/webapi/models/production-dockerfile.model.js +0 -138
  46. package/commonjs/src/webapi/models/sample-files.model.js +0 -60
  47. package/commonjs/src/webapi/models/webapi-image.model.js +0 -22
  48. package/commonjs/src/webapi/postman/hello-openapi.js +0 -175
  49. package/commonjs/src/webapi/postman/local-view.js +0 -184
  50. package/commonjs/src/webapi/postman/openapi-to-postman.js +0 -202
  51. package/es6/src/domain/prompt.js +0 -43
  52. package/es6/src/models/compose.model.js +0 -132
  53. package/es6/src/models/config-yaml.model.js +0 -76
  54. package/es6/src/models/const.js +0 -21
  55. package/es6/src/models/dev-container.model.js +0 -90
  56. package/es6/src/models/docker-image.model.js +0 -185
  57. package/es6/src/models/env-file.model.js +0 -43
  58. package/es6/src/models/gitignore.model.js +0 -21
  59. package/es6/src/models/launch-json.model.js +0 -64
  60. package/es6/src/models/package-json.model.js +0 -129
  61. package/es6/src/models/project.model.js +0 -119
  62. package/es6/src/models/source-file.js +0 -3
  63. package/es6/src/models/tsconfig.model.js +0 -24
  64. package/es6/src/models/vscode-settings.model.js +0 -21
  65. package/es6/src/program.js +0 -76
  66. package/es6/src/resolve-target-dir.js +0 -9
  67. package/es6/src/services/scaffold.service.js +0 -52
  68. package/es6/src/webapi/api-name.js +0 -59
  69. package/es6/src/webapi/const.js +0 -20
  70. package/es6/src/webapi/create-api.js +0 -265
  71. package/es6/src/webapi/features/auth.feature.js +0 -412
  72. package/es6/src/webapi/features/auth0-cli.js +0 -348
  73. package/es6/src/webapi/features/biome-format.js +0 -42
  74. package/es6/src/webapi/features/database.feature.js +0 -263
  75. package/es6/src/webapi/features/finalize.feature.js +0 -81
  76. package/es6/src/webapi/features/postman.feature.js +0 -253
  77. package/es6/src/webapi/models/api-package-json.model.js +0 -58
  78. package/es6/src/webapi/models/auth-config.model.js +0 -22
  79. package/es6/src/webapi/models/controller-source-file.model.js +0 -179
  80. package/es6/src/webapi/models/github-ci.model.js +0 -186
  81. package/es6/src/webapi/models/main-source-file.model.js +0 -161
  82. package/es6/src/webapi/models/production-dockerfile.model.js +0 -126
  83. package/es6/src/webapi/models/sample-files.model.js +0 -42
  84. package/es6/src/webapi/models/webapi-image.model.js +0 -12
  85. package/es6/src/webapi/postman/hello-openapi.js +0 -168
  86. package/es6/src/webapi/postman/local-view.js +0 -169
  87. package/es6/src/webapi/postman/openapi-to-postman.js +0 -179
  88. package/types/src/domain/prompt.d.ts +0 -4
  89. package/types/src/models/compose.model.d.ts +0 -59
  90. package/types/src/models/config-yaml.model.d.ts +0 -27
  91. package/types/src/models/const.d.ts +0 -19
  92. package/types/src/models/dev-container.model.d.ts +0 -33
  93. package/types/src/models/docker-image.model.d.ts +0 -56
  94. package/types/src/models/env-file.model.d.ts +0 -15
  95. package/types/src/models/gitignore.model.d.ts +0 -6
  96. package/types/src/models/launch-json.model.d.ts +0 -7
  97. package/types/src/models/package-json.model.d.ts +0 -32
  98. package/types/src/models/project.model.d.ts +0 -60
  99. package/types/src/models/source-file.d.ts +0 -11
  100. package/types/src/models/tsconfig.model.d.ts +0 -5
  101. package/types/src/models/vscode-settings.model.d.ts +0 -7
  102. package/types/src/program.d.ts +0 -3
  103. package/types/src/resolve-target-dir.d.ts +0 -5
  104. package/types/src/services/scaffold.service.d.ts +0 -22
  105. package/types/src/webapi/api-name.d.ts +0 -14
  106. package/types/src/webapi/const.d.ts +0 -17
  107. package/types/src/webapi/create-api.d.ts +0 -15
  108. package/types/src/webapi/features/auth.feature.d.ts +0 -10
  109. package/types/src/webapi/features/auth0-cli.d.ts +0 -72
  110. package/types/src/webapi/features/biome-format.d.ts +0 -5
  111. package/types/src/webapi/features/database.feature.d.ts +0 -5
  112. package/types/src/webapi/features/finalize.feature.d.ts +0 -2
  113. package/types/src/webapi/features/postman.feature.d.ts +0 -16
  114. package/types/src/webapi/models/api-package-json.model.d.ts +0 -18
  115. package/types/src/webapi/models/auth-config.model.d.ts +0 -26
  116. package/types/src/webapi/models/controller-source-file.model.d.ts +0 -45
  117. package/types/src/webapi/models/github-ci.model.d.ts +0 -9
  118. package/types/src/webapi/models/main-source-file.model.d.ts +0 -54
  119. package/types/src/webapi/models/production-dockerfile.model.d.ts +0 -20
  120. package/types/src/webapi/models/sample-files.model.d.ts +0 -7
  121. package/types/src/webapi/models/webapi-image.model.d.ts +0 -5
  122. package/types/src/webapi/postman/hello-openapi.d.ts +0 -19
  123. package/types/src/webapi/postman/local-view.d.ts +0 -17
  124. package/types/src/webapi/postman/openapi-to-postman.d.ts +0 -62
@@ -1,319 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- function _export(target, all) {
6
- for(var name in all)Object.defineProperty(target, name, {
7
- enumerable: true,
8
- get: Object.getOwnPropertyDescriptor(all, name).get
9
- });
10
- }
11
- _export(exports, {
12
- get POSTMAN_CALLBACKS () {
13
- return POSTMAN_CALLBACKS;
14
- },
15
- get POSTMAN_SCOPES () {
16
- return POSTMAN_SCOPES;
17
- },
18
- get PostmanFeature () {
19
- return PostmanFeature;
20
- },
21
- get buildHelloOpenApiDocument () {
22
- return _helloopenapi.buildHelloOpenApiDocument;
23
- },
24
- get buildHybridPostmanCollection () {
25
- return buildHybridPostmanCollection;
26
- }
27
- });
28
- const _nodecrypto = require("node:crypto");
29
- const _nodefs = require("node:fs");
30
- const _nodepath = require("node:path");
31
- const _prompt = require("../../domain/prompt.js");
32
- const _const = require("../../models/const.js");
33
- const _helloopenapi = require("../postman/hello-openapi.js");
34
- const _localview = require("../postman/local-view.js");
35
- const _openapitopostman = require("../postman/openapi-to-postman.js");
36
- const _auth0cli = /*#__PURE__*/ _interop_require_wildcard(require("./auth0-cli.js"));
37
- function _getRequireWildcardCache(nodeInterop) {
38
- if (typeof WeakMap !== "function") return null;
39
- var cacheBabelInterop = new WeakMap();
40
- var cacheNodeInterop = new WeakMap();
41
- return (_getRequireWildcardCache = function(nodeInterop) {
42
- return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
43
- })(nodeInterop);
44
- }
45
- function _interop_require_wildcard(obj, nodeInterop) {
46
- if (!nodeInterop && obj && obj.__esModule) {
47
- return obj;
48
- }
49
- if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
50
- return {
51
- default: obj
52
- };
53
- }
54
- var cache = _getRequireWildcardCache(nodeInterop);
55
- if (cache && cache.has(obj)) {
56
- return cache.get(obj);
57
- }
58
- var newObj = {
59
- __proto__: null
60
- };
61
- var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
62
- for(var key in obj){
63
- if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
64
- var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
65
- if (desc && (desc.get || desc.set)) {
66
- Object.defineProperty(newObj, key, desc);
67
- } else {
68
- newObj[key] = obj[key];
69
- }
70
- }
71
- }
72
- newObj.default = obj;
73
- if (cache) {
74
- cache.set(obj, newObj);
75
- }
76
- return newObj;
77
- }
78
- /** Postman OAuth callback URLs (popup + "Authorize using browser"). */ const POSTMAN_CALLBACKS = [
79
- "https://oauth.pstmn.io/v1/callback",
80
- "https://oauth.pstmn.io/v1/browser-callback"
81
- ];
82
- /** Scopes requested for Auth0 access tokens (OIDC + Hello CASL permissions). */ const POSTMAN_SCOPES = [
83
- "openid",
84
- "profile",
85
- "email",
86
- "read:Hello",
87
- "create:Hello",
88
- "update:Hello",
89
- "delete:Hello"
90
- ].join(" ");
91
- const COLLECTION_DESCRIPTION = "Open the project root in Postman Local View (not the postman/ folder). " + "Select the Local environment, then Authorization → Get New Access Token (PKCE). " + "Routes are generated from OpenAPI; Auth0 overlay is hand-authored.";
92
- async function getOptions(_workspace, cliOptions) {
93
- if (cliOptions.postmanProvider != null) return {};
94
- const choices = [
95
- {
96
- label: "none",
97
- description: "skip"
98
- },
99
- {
100
- label: "local",
101
- description: "Local View / Native Git files (no API key)"
102
- },
103
- {
104
- label: "api",
105
- description: "also upload to Postman.com (needs API key)"
106
- }
107
- ];
108
- const selected = await (0, _prompt.pick)("\n Postman: ", choices, (c)=>`${c.label} — ${c.description}`);
109
- const provider = selected?.label ?? "none";
110
- if (provider === "none") return {
111
- postmanProvider: "none"
112
- };
113
- if (provider === "local") return {
114
- postmanProvider: "local"
115
- };
116
- const apiKey = process.env.POSTMAN_API_KEY ?? await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../../domain/prompt.js"))).then((m)=>m.ask("\n Postman API key (app.getpostman.com/settings/me/api-keys): "));
117
- const headers = {
118
- "X-Api-Key": apiKey,
119
- "Content-Type": "application/json"
120
- };
121
- const wsRes = await fetch("https://api.getpostman.com/workspaces", {
122
- headers
123
- });
124
- if (!wsRes.ok) {
125
- console.error("\n Postman API key invalid — falling back to local files.");
126
- return {
127
- postmanProvider: "local"
128
- };
129
- }
130
- const { workspaces } = await wsRes.json();
131
- const wsChoices = [
132
- {
133
- label: "<new workspace>",
134
- id: null
135
- },
136
- ...workspaces.map((w)=>({
137
- label: `${w.name} (${w.type})`,
138
- id: w.id
139
- }))
140
- ];
141
- const wsPicked = await (0, _prompt.pick)("\n Postman workspace: ", wsChoices, (c)=>c.label);
142
- let workspaceId;
143
- if (!wsPicked || wsPicked.id === null) {
144
- const { ask } = await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../../domain/prompt.js")));
145
- const wsName = await ask(` Workspace name: `);
146
- const createRes = await fetch("https://api.getpostman.com/workspaces", {
147
- method: "POST",
148
- headers,
149
- body: JSON.stringify({
150
- workspace: {
151
- name: wsName,
152
- type: "personal"
153
- }
154
- })
155
- });
156
- const { workspace: ws } = await createRes.json();
157
- workspaceId = ws.id;
158
- console.log(` ✓ Workspace created: ${wsName}`);
159
- } else {
160
- workspaceId = wsPicked.id;
161
- }
162
- return {
163
- postmanProvider: "api",
164
- apiKey,
165
- workspaceId
166
- };
167
- }
168
- async function buildHybridPostmanCollection(projectName, auth) {
169
- const openapi = (0, _helloopenapi.buildHelloOpenApiDocument)(projectName);
170
- const base = await (0, _openapitopostman.openApiToPostmanCollection)(openapi);
171
- if (base.info._postman_id == null) {
172
- base.info._postman_id = (0, _nodecrypto.randomUUID)();
173
- }
174
- return (0, _openapitopostman.applyPostmanAuthOverlay)(base, projectName, auth, {
175
- callbacks: POSTMAN_CALLBACKS,
176
- scopes: POSTMAN_SCOPES,
177
- description: COLLECTION_DESCRIPTION
178
- });
179
- }
180
- /** Read a previously scaffolded auth0ClientId so re-scaffold never blanks it. */ function readExistingSpaClientId(targetDir, projectName) {
181
- const envPath = (0, _nodepath.join)(targetDir, "postman/environments", `${projectName}-Local.environment.yaml`);
182
- if (!(0, _nodefs.existsSync)(envPath)) return undefined;
183
- const text = (0, _nodefs.readFileSync)(envPath, "utf8");
184
- const match = text.match(/key:\s*auth0ClientId\s*\n\s*value:\s*["']?([^"'\n]+)/);
185
- const value = match?.[1]?.trim();
186
- return value && value.length > 0 ? value : undefined;
187
- }
188
- /**
189
- * Resolve the Postman SPA client id. Never returns empty — preserves an existing
190
- * env value on Auth0 failure, otherwise throws so we do not write a blank env.
191
- */ function resolveSpaClientId(workspace) {
192
- const appName = `${workspace.name} Postman`;
193
- try {
194
- const app = _auth0cli.ensureSpaApp(appName, [
195
- ...POSTMAN_CALLBACKS
196
- ]);
197
- console.log(app.reused ? ` ✓ Reusing Auth0 SPA app for Postman PKCE (${app.client_id})` : ` ✓ Auth0 SPA app created for Postman PKCE (${app.client_id})`);
198
- try {
199
- _auth0cli.enableConnectionForClient(_auth0cli.DB_CONNECTION_NAME, app.client_id);
200
- console.log(` ✓ Enabled ${_auth0cli.DB_CONNECTION_NAME} on Postman SPA`);
201
- } catch (err) {
202
- console.error(` ✗ Failed to enable DB connection on SPA: ${err instanceof Error ? err.message : err}`);
203
- }
204
- return app.client_id;
205
- } catch (err) {
206
- const existing = readExistingSpaClientId(workspace.targetDir, workspace.name);
207
- if (existing) {
208
- console.error(` ✗ Failed to ensure Auth0 SPA app (${err instanceof Error ? err.message : err})`);
209
- console.log(` ✓ Keeping existing auth0ClientId from Postman environment (${existing})`);
210
- return existing;
211
- }
212
- throw new Error(`Failed to ensure Auth0 SPA app for Postman — auth0ClientId would be empty: ${err instanceof Error ? err.message : err}`);
213
- }
214
- }
215
- async function scaffold(workspace, options) {
216
- if (options.postmanProvider === "none" || options.postmanProvider == null) return;
217
- const authConfigModel = workspace.getModel(_const.WELL_KNOWN_FILES.AUTH_CONFIG);
218
- const authCfg = authConfigModel?.config;
219
- const spaClientId = authCfg?.issuerBaseUrl ? resolveSpaClientId(workspace) : undefined;
220
- const auth0Env = authCfg?.issuerBaseUrl ? {
221
- auth0Domain: authCfg.issuerBaseUrl.replace(/^https?:\/\//, ""),
222
- auth0Audience: authCfg.audience,
223
- auth0ClientId: spaClientId
224
- } : undefined;
225
- const projectName = workspace.name;
226
- const envName = `${projectName} Local`;
227
- const collection = await buildHybridPostmanCollection(projectName, auth0Env);
228
- const localFiles = (0, _localview.buildLocalViewFilesFromCollection)(collection, projectName, auth0Env, {
229
- callbacks: POSTMAN_CALLBACKS,
230
- scopes: POSTMAN_SCOPES
231
- });
232
- const envYaml = (0, _localview.buildEnvironmentYaml)(envName, auth0Env, {
233
- callbacks: POSTMAN_CALLBACKS,
234
- scopes: POSTMAN_SCOPES
235
- });
236
- workspace.addFile({
237
- files: ()=>[
238
- {
239
- filePath: ".postman/resources.yaml",
240
- content: [
241
- "# Open this project root in Postman (Files → Open folder), not the postman/ subfolder.",
242
- "# Postman fills workspace.id when you connect Local View.",
243
- "#",
244
- "# All resources under postman/ are registered automatically.",
245
- "# Route requests are generated from OpenAPI; Auth0 overlay is hand-authored.",
246
- ""
247
- ].join("\n")
248
- },
249
- {
250
- filePath: `postman/environments/${projectName}-Local.environment.yaml`,
251
- content: envYaml
252
- },
253
- ...localFiles
254
- ]
255
- });
256
- if (options.postmanProvider === "api" && options.apiKey) {
257
- const headers = {
258
- "X-Api-Key": options.apiKey,
259
- "Content-Type": "application/json"
260
- };
261
- const colRes = await fetch(`https://api.getpostman.com/collections?workspace=${options.workspaceId}`, {
262
- method: "POST",
263
- headers,
264
- body: JSON.stringify({
265
- collection
266
- })
267
- });
268
- if (colRes.ok) {
269
- console.log(" ✓ Postman collection uploaded");
270
- } else {
271
- console.error(" ✗ Failed to upload Postman collection");
272
- }
273
- const envValues = [
274
- {
275
- key: "baseUrl",
276
- value: "http://localhost:3000",
277
- enabled: true
278
- },
279
- ...auth0Env?.auth0Domain ? [
280
- {
281
- key: "auth0Domain",
282
- value: auth0Env.auth0Domain,
283
- enabled: true
284
- },
285
- {
286
- key: "auth0Audience",
287
- value: auth0Env.auth0Audience ?? "",
288
- enabled: true
289
- },
290
- {
291
- key: "auth0ClientId",
292
- value: auth0Env.auth0ClientId ?? "",
293
- enabled: true
294
- }
295
- ] : []
296
- ];
297
- const envRes = await fetch(`https://api.getpostman.com/environments?workspace=${options.workspaceId}`, {
298
- method: "POST",
299
- headers,
300
- body: JSON.stringify({
301
- environment: {
302
- name: envName,
303
- values: envValues
304
- }
305
- })
306
- });
307
- if (envRes.ok) {
308
- console.log(" ✓ Postman environment uploaded");
309
- } else {
310
- console.error(" ✗ Failed to upload Postman environment");
311
- }
312
- }
313
- }
314
- const PostmanFeature = {
315
- getOptions,
316
- scaffold
317
- };
318
-
319
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL3Bvc3RtYW4uZmVhdHVyZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHBpY2sgfSBmcm9tIFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiO1xuaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlU2NhZmZvbGQgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3Byb2plY3QubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgRmVhdHVyZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zY2FmZm9sZC5zZXJ2aWNlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEF1dGhDb25maWdNb2RlbCB9IGZyb20gXCIuLi9tb2RlbHMvYXV0aC1jb25maWcubW9kZWwuanNcIjtcbmltcG9ydCB7IGJ1aWxkSGVsbG9PcGVuQXBpRG9jdW1lbnQgfSBmcm9tIFwiLi4vcG9zdG1hbi9oZWxsby1vcGVuYXBpLmpzXCI7XG5pbXBvcnQge1xuXHRidWlsZEVudmlyb25tZW50WWFtbCxcblx0YnVpbGRMb2NhbFZpZXdGaWxlc0Zyb21Db2xsZWN0aW9uLFxufSBmcm9tIFwiLi4vcG9zdG1hbi9sb2NhbC12aWV3LmpzXCI7XG5pbXBvcnQge1xuXHR0eXBlIEF1dGgwRW52LFxuXHRhcHBseVBvc3RtYW5BdXRoT3ZlcmxheSxcblx0b3BlbkFwaVRvUG9zdG1hbkNvbGxlY3Rpb24sXG59IGZyb20gXCIuLi9wb3N0bWFuL29wZW5hcGktdG8tcG9zdG1hbi5qc1wiO1xuaW1wb3J0ICogYXMgYXV0aDBDbGkgZnJvbSBcIi4vYXV0aDAtY2xpLmpzXCI7XG5cbi8qKiBQb3N0bWFuIE9BdXRoIGNhbGxiYWNrIFVSTHMgKHBvcHVwICsgXCJBdXRob3JpemUgdXNpbmcgYnJvd3NlclwiKS4gKi9cbmNvbnN0IFBPU1RNQU5fQ0FMTEJBQ0tTID0gW1xuXHRcImh0dHBzOi8vb2F1dGgucHN0bW4uaW8vdjEvY2FsbGJhY2tcIixcblx0XCJodHRwczovL29hdXRoLnBzdG1uLmlvL3YxL2Jyb3dzZXItY2FsbGJhY2tcIixcbl0gYXMgY29uc3Q7XG5cbi8qKiBTY29wZXMgcmVxdWVzdGVkIGZvciBBdXRoMCBhY2Nlc3MgdG9rZW5zIChPSURDICsgSGVsbG8gQ0FTTCBwZXJtaXNzaW9ucykuICovXG5jb25zdCBQT1NUTUFOX1NDT1BFUyA9IFtcblx0XCJvcGVuaWRcIixcblx0XCJwcm9maWxlXCIsXG5cdFwiZW1haWxcIixcblx0XCJyZWFkOkhlbGxvXCIsXG5cdFwiY3JlYXRlOkhlbGxvXCIsXG5cdFwidXBkYXRlOkhlbGxvXCIsXG5cdFwiZGVsZXRlOkhlbGxvXCIsXG5dLmpvaW4oXCIgXCIpO1xuXG5jb25zdCBDT0xMRUNUSU9OX0RFU0NSSVBUSU9OID1cblx0XCJPcGVuIHRoZSBwcm9qZWN0IHJvb3QgaW4gUG9zdG1hbiBMb2NhbCBWaWV3IChub3QgdGhlIHBvc3RtYW4vIGZvbGRlcikuIFwiICtcblx0XCJTZWxlY3QgdGhlIExvY2FsIGVudmlyb25tZW50LCB0aGVuIEF1dGhvcml6YXRpb24g4oaSIEdldCBOZXcgQWNjZXNzIFRva2VuIChQS0NFKS4gXCIgK1xuXHRcIlJvdXRlcyBhcmUgZ2VuZXJhdGVkIGZyb20gT3BlbkFQSTsgQXV0aDAgb3ZlcmxheSBpcyBoYW5kLWF1dGhvcmVkLlwiO1xuXG5leHBvcnQgdHlwZSBQb3N0bWFuT3B0aW9ucyA9IHtcblx0cG9zdG1hblByb3ZpZGVyPzogXCJhcGlcIiB8IFwibG9jYWxcIiB8IFwibm9uZVwiO1xuXHRhcGlLZXk/OiBzdHJpbmc7XG5cdHdvcmtzcGFjZUlkPzogc3RyaW5nO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0T3B0aW9ucyhcblx0X3dvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsXG5cdGNsaU9wdGlvbnM6IFBhcnRpYWw8UG9zdG1hbk9wdGlvbnM+LFxuKTogUHJvbWlzZTxQYXJ0aWFsPFBvc3RtYW5PcHRpb25zPj4ge1xuXHRpZiAoY2xpT3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgIT0gbnVsbCkgcmV0dXJuIHt9O1xuXG5cdGNvbnN0IGNob2ljZXMgPSBbXG5cdFx0eyBsYWJlbDogXCJub25lXCIgYXMgY29uc3QsIGRlc2NyaXB0aW9uOiBcInNraXBcIiB9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiBcImxvY2FsXCIgYXMgY29uc3QsXG5cdFx0XHRkZXNjcmlwdGlvbjogXCJMb2NhbCBWaWV3IC8gTmF0aXZlIEdpdCBmaWxlcyAobm8gQVBJIGtleSlcIixcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiBcImFwaVwiIGFzIGNvbnN0LFxuXHRcdFx0ZGVzY3JpcHRpb246IFwiYWxzbyB1cGxvYWQgdG8gUG9zdG1hbi5jb20gKG5lZWRzIEFQSSBrZXkpXCIsXG5cdFx0fSxcblx0XTtcblx0Y29uc3Qgc2VsZWN0ZWQgPSBhd2FpdCBwaWNrKFxuXHRcdFwiXFxuICBQb3N0bWFuOiBcIixcblx0XHRjaG9pY2VzLFxuXHRcdChjKSA9PiBgJHtjLmxhYmVsfSDigJQgJHtjLmRlc2NyaXB0aW9ufWAsXG5cdCk7XG5cdGNvbnN0IHByb3ZpZGVyID0gc2VsZWN0ZWQ/LmxhYmVsID8/IFwibm9uZVwiO1xuXG5cdGlmIChwcm92aWRlciA9PT0gXCJub25lXCIpIHJldHVybiB7IHBvc3RtYW5Qcm92aWRlcjogXCJub25lXCIgfTtcblx0aWYgKHByb3ZpZGVyID09PSBcImxvY2FsXCIpIHJldHVybiB7IHBvc3RtYW5Qcm92aWRlcjogXCJsb2NhbFwiIH07XG5cblx0Y29uc3QgYXBpS2V5ID1cblx0XHRwcm9jZXNzLmVudi5QT1NUTUFOX0FQSV9LRVkgPz9cblx0XHQoYXdhaXQgaW1wb3J0KFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiKS50aGVuKChtKSA9PlxuXHRcdFx0bS5hc2soXCJcXG4gIFBvc3RtYW4gQVBJIGtleSAoYXBwLmdldHBvc3RtYW4uY29tL3NldHRpbmdzL21lL2FwaS1rZXlzKTogXCIpLFxuXHRcdCkpO1xuXG5cdGNvbnN0IGhlYWRlcnMgPSB7IFwiWC1BcGktS2V5XCI6IGFwaUtleSwgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfTtcblx0Y29uc3Qgd3NSZXMgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vYXBpLmdldHBvc3RtYW4uY29tL3dvcmtzcGFjZXNcIiwgeyBoZWFkZXJzIH0pO1xuXG5cdGlmICghd3NSZXMub2spIHtcblx0XHRjb25zb2xlLmVycm9yKFwiXFxuICBQb3N0bWFuIEFQSSBrZXkgaW52YWxpZCDigJQgZmFsbGluZyBiYWNrIHRvIGxvY2FsIGZpbGVzLlwiKTtcblx0XHRyZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwibG9jYWxcIiB9O1xuXHR9XG5cblx0Y29uc3QgeyB3b3Jrc3BhY2VzIH0gPSAoYXdhaXQgd3NSZXMuanNvbigpKSBhcyB7XG5cdFx0d29ya3NwYWNlczogQXJyYXk8eyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9Pjtcblx0fTtcblxuXHR0eXBlIFdzQ2hvaWNlID0geyBsYWJlbDogc3RyaW5nOyBpZDogc3RyaW5nIHwgbnVsbCB9O1xuXHRjb25zdCB3c0Nob2ljZXM6IFdzQ2hvaWNlW10gPSBbXG5cdFx0eyBsYWJlbDogXCI8bmV3IHdvcmtzcGFjZT5cIiwgaWQ6IG51bGwgfSxcblx0XHQuLi53b3Jrc3BhY2VzLm1hcCgodykgPT4gKHsgbGFiZWw6IGAke3cubmFtZX0gKCR7dy50eXBlfSlgLCBpZDogdy5pZCB9KSksXG5cdF07XG5cblx0Y29uc3Qgd3NQaWNrZWQgPSBhd2FpdCBwaWNrKFwiXFxuICBQb3N0bWFuIHdvcmtzcGFjZTogXCIsIHdzQ2hvaWNlcywgKGMpID0+IGMubGFiZWwpO1xuXG5cdGxldCB3b3Jrc3BhY2VJZDogc3RyaW5nO1xuXHRpZiAoIXdzUGlja2VkIHx8IHdzUGlja2VkLmlkID09PSBudWxsKSB7XG5cdFx0Y29uc3QgeyBhc2sgfSA9IGF3YWl0IGltcG9ydChcIi4uLy4uL2RvbWFpbi9wcm9tcHQuanNcIik7XG5cdFx0Y29uc3Qgd3NOYW1lID0gYXdhaXQgYXNrKGAgIFdvcmtzcGFjZSBuYW1lOiBgKTtcblx0XHRjb25zdCBjcmVhdGVSZXMgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vYXBpLmdldHBvc3RtYW4uY29tL3dvcmtzcGFjZXNcIiwge1xuXHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdGhlYWRlcnMsXG5cdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7IHdvcmtzcGFjZTogeyBuYW1lOiB3c05hbWUsIHR5cGU6IFwicGVyc29uYWxcIiB9IH0pLFxuXHRcdH0pO1xuXHRcdGNvbnN0IHsgd29ya3NwYWNlOiB3cyB9ID0gKGF3YWl0IGNyZWF0ZVJlcy5qc29uKCkpIGFzIHsgd29ya3NwYWNlOiB7IGlkOiBzdHJpbmcgfSB9O1xuXHRcdHdvcmtzcGFjZUlkID0gd3MuaWQ7XG5cdFx0Y29uc29sZS5sb2coYCAg4pyTIFdvcmtzcGFjZSBjcmVhdGVkOiAke3dzTmFtZX1gKTtcblx0fSBlbHNlIHtcblx0XHR3b3Jrc3BhY2VJZCA9IHdzUGlja2VkLmlkO1xuXHR9XG5cblx0cmV0dXJuIHsgcG9zdG1hblByb3ZpZGVyOiBcImFwaVwiLCBhcGlLZXksIHdvcmtzcGFjZUlkIH07XG59XG5cbi8qKiBCdWlsZCBQb3N0bWFuIGNvbGxlY3Rpb246IE9wZW5BUEkgcm91dGVzICsgQXV0aDAgYXV0aCBvdmVybGF5LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSHlicmlkUG9zdG1hbkNvbGxlY3Rpb24ocHJvamVjdE5hbWU6IHN0cmluZywgYXV0aD86IEF1dGgwRW52KSB7XG5cdGNvbnN0IG9wZW5hcGkgPSBidWlsZEhlbGxvT3BlbkFwaURvY3VtZW50KHByb2plY3ROYW1lKTtcblx0Y29uc3QgYmFzZSA9IGF3YWl0IG9wZW5BcGlUb1Bvc3RtYW5Db2xsZWN0aW9uKG9wZW5hcGkpO1xuXHRpZiAoYmFzZS5pbmZvLl9wb3N0bWFuX2lkID09IG51bGwpIHtcblx0XHRiYXNlLmluZm8uX3Bvc3RtYW5faWQgPSByYW5kb21VVUlEKCk7XG5cdH1cblx0cmV0dXJuIGFwcGx5UG9zdG1hbkF1dGhPdmVybGF5KGJhc2UsIHByb2plY3ROYW1lLCBhdXRoLCB7XG5cdFx0Y2FsbGJhY2tzOiBQT1NUTUFOX0NBTExCQUNLUyxcblx0XHRzY29wZXM6IFBPU1RNQU5fU0NPUEVTLFxuXHRcdGRlc2NyaXB0aW9uOiBDT0xMRUNUSU9OX0RFU0NSSVBUSU9OLFxuXHR9KTtcbn1cblxuLyoqIFJlYWQgYSBwcmV2aW91c2x5IHNjYWZmb2xkZWQgYXV0aDBDbGllbnRJZCBzbyByZS1zY2FmZm9sZCBuZXZlciBibGFua3MgaXQuICovXG5mdW5jdGlvbiByZWFkRXhpc3RpbmdTcGFDbGllbnRJZCh0YXJnZXREaXI6IHN0cmluZywgcHJvamVjdE5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGVudlBhdGggPSBqb2luKFxuXHRcdHRhcmdldERpcixcblx0XHRcInBvc3RtYW4vZW52aXJvbm1lbnRzXCIsXG5cdFx0YCR7cHJvamVjdE5hbWV9LUxvY2FsLmVudmlyb25tZW50LnlhbWxgLFxuXHQpO1xuXHRpZiAoIWV4aXN0c1N5bmMoZW52UGF0aCkpIHJldHVybiB1bmRlZmluZWQ7XG5cdGNvbnN0IHRleHQgPSByZWFkRmlsZVN5bmMoZW52UGF0aCwgXCJ1dGY4XCIpO1xuXHRjb25zdCBtYXRjaCA9IHRleHQubWF0Y2goL2tleTpcXHMqYXV0aDBDbGllbnRJZFxccypcXG5cXHMqdmFsdWU6XFxzKltcIiddPyhbXlwiJ1xcbl0rKS8pO1xuXHRjb25zdCB2YWx1ZSA9IG1hdGNoPy5bMV0/LnRyaW0oKTtcblx0cmV0dXJuIHZhbHVlICYmIHZhbHVlLmxlbmd0aCA+IDAgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBQb3N0bWFuIFNQQSBjbGllbnQgaWQuIE5ldmVyIHJldHVybnMgZW1wdHkg4oCUIHByZXNlcnZlcyBhbiBleGlzdGluZ1xuICogZW52IHZhbHVlIG9uIEF1dGgwIGZhaWx1cmUsIG90aGVyd2lzZSB0aHJvd3Mgc28gd2UgZG8gbm90IHdyaXRlIGEgYmxhbmsgZW52LlxuICovXG5mdW5jdGlvbiByZXNvbHZlU3BhQ2xpZW50SWQod29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCk6IHN0cmluZyB7XG5cdGNvbnN0IGFwcE5hbWUgPSBgJHt3b3Jrc3BhY2UubmFtZX0gUG9zdG1hbmA7XG5cdHRyeSB7XG5cdFx0Y29uc3QgYXBwID0gYXV0aDBDbGkuZW5zdXJlU3BhQXBwKGFwcE5hbWUsIFsuLi5QT1NUTUFOX0NBTExCQUNLU10pO1xuXHRcdGNvbnNvbGUubG9nKFxuXHRcdFx0YXBwLnJldXNlZFxuXHRcdFx0XHQ/IGAgIOKckyBSZXVzaW5nIEF1dGgwIFNQQSBhcHAgZm9yIFBvc3RtYW4gUEtDRSAoJHthcHAuY2xpZW50X2lkfSlgXG5cdFx0XHRcdDogYCAg4pyTIEF1dGgwIFNQQSBhcHAgY3JlYXRlZCBmb3IgUG9zdG1hbiBQS0NFICgke2FwcC5jbGllbnRfaWR9KWAsXG5cdFx0KTtcblx0XHR0cnkge1xuXHRcdFx0YXV0aDBDbGkuZW5hYmxlQ29ubmVjdGlvbkZvckNsaWVudChhdXRoMENsaS5EQl9DT05ORUNUSU9OX05BTUUsIGFwcC5jbGllbnRfaWQpO1xuXHRcdFx0Y29uc29sZS5sb2coYCAg4pyTIEVuYWJsZWQgJHthdXRoMENsaS5EQl9DT05ORUNUSU9OX05BTUV9IG9uIFBvc3RtYW4gU1BBYCk7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFxuXHRcdFx0XHRgICDinJcgRmFpbGVkIHRvIGVuYWJsZSBEQiBjb25uZWN0aW9uIG9uIFNQQTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogZXJyfWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gYXBwLmNsaWVudF9pZDtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Y29uc3QgZXhpc3RpbmcgPSByZWFkRXhpc3RpbmdTcGFDbGllbnRJZCh3b3Jrc3BhY2UudGFyZ2V0RGlyLCB3b3Jrc3BhY2UubmFtZSk7XG5cdFx0aWYgKGV4aXN0aW5nKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFxuXHRcdFx0XHRgICDinJcgRmFpbGVkIHRvIGVuc3VyZSBBdXRoMCBTUEEgYXBwICgke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBlcnJ9KWAsXG5cdFx0XHQpO1xuXHRcdFx0Y29uc29sZS5sb2coYCAg4pyTIEtlZXBpbmcgZXhpc3RpbmcgYXV0aDBDbGllbnRJZCBmcm9tIFBvc3RtYW4gZW52aXJvbm1lbnQgKCR7ZXhpc3Rpbmd9KWApO1xuXHRcdFx0cmV0dXJuIGV4aXN0aW5nO1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRgRmFpbGVkIHRvIGVuc3VyZSBBdXRoMCBTUEEgYXBwIGZvciBQb3N0bWFuIOKAlCBhdXRoMENsaWVudElkIHdvdWxkIGJlIGVtcHR5OiAke1xuXHRcdFx0XHRlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogZXJyXG5cdFx0XHR9YCxcblx0XHQpO1xuXHR9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkKHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsIG9wdGlvbnM6IFBvc3RtYW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG5cdGlmIChvcHRpb25zLnBvc3RtYW5Qcm92aWRlciA9PT0gXCJub25lXCIgfHwgb3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgPT0gbnVsbCkgcmV0dXJuO1xuXG5cdGNvbnN0IGF1dGhDb25maWdNb2RlbCA9IHdvcmtzcGFjZS5nZXRNb2RlbDxBdXRoQ29uZmlnTW9kZWw+KFdFTExfS05PV05fRklMRVMuQVVUSF9DT05GSUcpO1xuXHRjb25zdCBhdXRoQ2ZnID0gYXV0aENvbmZpZ01vZGVsPy5jb25maWc7XG5cblx0Y29uc3Qgc3BhQ2xpZW50SWQgPSBhdXRoQ2ZnPy5pc3N1ZXJCYXNlVXJsID8gcmVzb2x2ZVNwYUNsaWVudElkKHdvcmtzcGFjZSkgOiB1bmRlZmluZWQ7XG5cblx0Y29uc3QgYXV0aDBFbnY6IEF1dGgwRW52IHwgdW5kZWZpbmVkID0gYXV0aENmZz8uaXNzdWVyQmFzZVVybFxuXHRcdD8ge1xuXHRcdFx0XHRhdXRoMERvbWFpbjogYXV0aENmZy5pc3N1ZXJCYXNlVXJsLnJlcGxhY2UoL15odHRwcz86XFwvXFwvLywgXCJcIiksXG5cdFx0XHRcdGF1dGgwQXVkaWVuY2U6IGF1dGhDZmcuYXVkaWVuY2UsXG5cdFx0XHRcdGF1dGgwQ2xpZW50SWQ6IHNwYUNsaWVudElkLFxuXHRcdFx0fVxuXHRcdDogdW5kZWZpbmVkO1xuXG5cdGNvbnN0IHByb2plY3ROYW1lID0gd29ya3NwYWNlLm5hbWU7XG5cdGNvbnN0IGVudk5hbWUgPSBgJHtwcm9qZWN0TmFtZX0gTG9jYWxgO1xuXHRjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgYnVpbGRIeWJyaWRQb3N0bWFuQ29sbGVjdGlvbihwcm9qZWN0TmFtZSwgYXV0aDBFbnYpO1xuXHRjb25zdCBsb2NhbEZpbGVzID0gYnVpbGRMb2NhbFZpZXdGaWxlc0Zyb21Db2xsZWN0aW9uKGNvbGxlY3Rpb24sIHByb2plY3ROYW1lLCBhdXRoMEVudiwge1xuXHRcdGNhbGxiYWNrczogUE9TVE1BTl9DQUxMQkFDS1MsXG5cdFx0c2NvcGVzOiBQT1NUTUFOX1NDT1BFUyxcblx0fSk7XG5cdGNvbnN0IGVudllhbWwgPSBidWlsZEVudmlyb25tZW50WWFtbChlbnZOYW1lLCBhdXRoMEVudiwge1xuXHRcdGNhbGxiYWNrczogUE9TVE1BTl9DQUxMQkFDS1MsXG5cdFx0c2NvcGVzOiBQT1NUTUFOX1NDT1BFUyxcblx0fSk7XG5cblx0d29ya3NwYWNlLmFkZEZpbGUoe1xuXHRcdGZpbGVzOiAoKSA9PiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcIi5wb3N0bWFuL3Jlc291cmNlcy55YW1sXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IFtcblx0XHRcdFx0XHRcIiMgT3BlbiB0aGlzIHByb2plY3Qgcm9vdCBpbiBQb3N0bWFuIChGaWxlcyDihpIgT3BlbiBmb2xkZXIpLCBub3QgdGhlIHBvc3RtYW4vIHN1YmZvbGRlci5cIixcblx0XHRcdFx0XHRcIiMgUG9zdG1hbiBmaWxscyB3b3Jrc3BhY2UuaWQgd2hlbiB5b3UgY29ubmVjdCBMb2NhbCBWaWV3LlwiLFxuXHRcdFx0XHRcdFwiI1wiLFxuXHRcdFx0XHRcdFwiIyBBbGwgcmVzb3VyY2VzIHVuZGVyIHBvc3RtYW4vIGFyZSByZWdpc3RlcmVkIGF1dG9tYXRpY2FsbHkuXCIsXG5cdFx0XHRcdFx0XCIjIFJvdXRlIHJlcXVlc3RzIGFyZSBnZW5lcmF0ZWQgZnJvbSBPcGVuQVBJOyBBdXRoMCBvdmVybGF5IGlzIGhhbmQtYXV0aG9yZWQuXCIsXG5cdFx0XHRcdFx0XCJcIixcblx0XHRcdFx0XS5qb2luKFwiXFxuXCIpLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IGBwb3N0bWFuL2Vudmlyb25tZW50cy8ke3Byb2plY3ROYW1lfS1Mb2NhbC5lbnZpcm9ubWVudC55YW1sYCxcblx0XHRcdFx0Y29udGVudDogZW52WWFtbCxcblx0XHRcdH0sXG5cdFx0XHQuLi5sb2NhbEZpbGVzLFxuXHRcdF0sXG5cdH0pO1xuXG5cdGlmIChvcHRpb25zLnBvc3RtYW5Qcm92aWRlciA9PT0gXCJhcGlcIiAmJiBvcHRpb25zLmFwaUtleSkge1xuXHRcdGNvbnN0IGhlYWRlcnMgPSB7IFwiWC1BcGktS2V5XCI6IG9wdGlvbnMuYXBpS2V5LCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9O1xuXG5cdFx0Y29uc3QgY29sUmVzID0gYXdhaXQgZmV0Y2goXG5cdFx0XHRgaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vY29sbGVjdGlvbnM/d29ya3NwYWNlPSR7b3B0aW9ucy53b3Jrc3BhY2VJZH1gLFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRoZWFkZXJzLFxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvbGxlY3Rpb24gfSksXG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0aWYgKGNvbFJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBQb3N0bWFuIGNvbGxlY3Rpb24gdXBsb2FkZWRcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCIgIOKclyBGYWlsZWQgdG8gdXBsb2FkIFBvc3RtYW4gY29sbGVjdGlvblwiKTtcblx0XHR9XG5cblx0XHRjb25zdCBlbnZWYWx1ZXMgPSBbXG5cdFx0XHR7IGtleTogXCJiYXNlVXJsXCIsIHZhbHVlOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMFwiLCBlbmFibGVkOiB0cnVlIH0sXG5cdFx0XHQuLi4oYXV0aDBFbnY/LmF1dGgwRG9tYWluXG5cdFx0XHRcdD8gW1xuXHRcdFx0XHRcdFx0eyBrZXk6IFwiYXV0aDBEb21haW5cIiwgdmFsdWU6IGF1dGgwRW52LmF1dGgwRG9tYWluLCBlbmFibGVkOiB0cnVlIH0sXG5cdFx0XHRcdFx0XHR7IGtleTogXCJhdXRoMEF1ZGllbmNlXCIsIHZhbHVlOiBhdXRoMEVudi5hdXRoMEF1ZGllbmNlID8/IFwiXCIsIGVuYWJsZWQ6IHRydWUgfSxcblx0XHRcdFx0XHRcdHsga2V5OiBcImF1dGgwQ2xpZW50SWRcIiwgdmFsdWU6IGF1dGgwRW52LmF1dGgwQ2xpZW50SWQgPz8gXCJcIiwgZW5hYmxlZDogdHJ1ZSB9LFxuXHRcdFx0XHRcdF1cblx0XHRcdFx0OiBbXSksXG5cdFx0XTtcblx0XHRjb25zdCBlbnZSZXMgPSBhd2FpdCBmZXRjaChcblx0XHRcdGBodHRwczovL2FwaS5nZXRwb3N0bWFuLmNvbS9lbnZpcm9ubWVudHM/d29ya3NwYWNlPSR7b3B0aW9ucy53b3Jrc3BhY2VJZH1gLFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRoZWFkZXJzLFxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdFx0ZW52aXJvbm1lbnQ6IHsgbmFtZTogZW52TmFtZSwgdmFsdWVzOiBlbnZWYWx1ZXMgfSxcblx0XHRcdFx0fSksXG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0aWYgKGVudlJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBQb3N0bWFuIGVudmlyb25tZW50IHVwbG9hZGVkXCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiICDinJcgRmFpbGVkIHRvIHVwbG9hZCBQb3N0bWFuIGVudmlyb25tZW50XCIpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgY29uc3QgUG9zdG1hbkZlYXR1cmU6IEZlYXR1cmU8UG9zdG1hbk9wdGlvbnM+ID0geyBnZXRPcHRpb25zLCBzY2FmZm9sZCB9O1xuZXhwb3J0IHsgYnVpbGRIZWxsb09wZW5BcGlEb2N1bWVudCB9IGZyb20gXCIuLi9wb3N0bWFuL2hlbGxvLW9wZW5hcGkuanNcIjtcbmV4cG9ydCB7IFBPU1RNQU5fQ0FMTEJBQ0tTLCBQT1NUTUFOX1NDT1BFUyB9O1xuIl0sIm5hbWVzIjpbIlBPU1RNQU5fQ0FMTEJBQ0tTIiwiUE9TVE1BTl9TQ09QRVMiLCJQb3N0bWFuRmVhdHVyZSIsImJ1aWxkSGVsbG9PcGVuQXBpRG9jdW1lbnQiLCJidWlsZEh5YnJpZFBvc3RtYW5Db2xsZWN0aW9uIiwiam9pbiIsIkNPTExFQ1RJT05fREVTQ1JJUFRJT04iLCJnZXRPcHRpb25zIiwiX3dvcmtzcGFjZSIsImNsaU9wdGlvbnMiLCJwb3N0bWFuUHJvdmlkZXIiLCJjaG9pY2VzIiwibGFiZWwiLCJkZXNjcmlwdGlvbiIsInNlbGVjdGVkIiwicGljayIsImMiLCJwcm92aWRlciIsImFwaUtleSIsInByb2Nlc3MiLCJlbnYiLCJQT1NUTUFOX0FQSV9LRVkiLCJ0aGVuIiwibSIsImFzayIsImhlYWRlcnMiLCJ3c1JlcyIsImZldGNoIiwib2siLCJjb25zb2xlIiwiZXJyb3IiLCJ3b3Jrc3BhY2VzIiwianNvbiIsIndzQ2hvaWNlcyIsImlkIiwibWFwIiwidyIsIm5hbWUiLCJ0eXBlIiwid3NQaWNrZWQiLCJ3b3Jrc3BhY2VJZCIsIndzTmFtZSIsImNyZWF0ZVJlcyIsIm1ldGhvZCIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5Iiwid29ya3NwYWNlIiwid3MiLCJsb2ciLCJwcm9qZWN0TmFtZSIsImF1dGgiLCJvcGVuYXBpIiwiYmFzZSIsIm9wZW5BcGlUb1Bvc3RtYW5Db2xsZWN0aW9uIiwiaW5mbyIsIl9wb3N0bWFuX2lkIiwicmFuZG9tVVVJRCIsImFwcGx5UG9zdG1hbkF1dGhPdmVybGF5IiwiY2FsbGJhY2tzIiwic2NvcGVzIiwicmVhZEV4aXN0aW5nU3BhQ2xpZW50SWQiLCJ0YXJnZXREaXIiLCJlbnZQYXRoIiwiZXhpc3RzU3luYyIsInVuZGVmaW5lZCIsInRleHQiLCJyZWFkRmlsZVN5bmMiLCJtYXRjaCIsInZhbHVlIiwidHJpbSIsImxlbmd0aCIsInJlc29sdmVTcGFDbGllbnRJZCIsImFwcE5hbWUiLCJhcHAiLCJhdXRoMENsaSIsImVuc3VyZVNwYUFwcCIsInJldXNlZCIsImNsaWVudF9pZCIsImVuYWJsZUNvbm5lY3Rpb25Gb3JDbGllbnQiLCJEQl9DT05ORUNUSU9OX05BTUUiLCJlcnIiLCJFcnJvciIsIm1lc3NhZ2UiLCJleGlzdGluZyIsInNjYWZmb2xkIiwib3B0aW9ucyIsImF1dGhDb25maWdNb2RlbCIsImdldE1vZGVsIiwiV0VMTF9LTk9XTl9GSUxFUyIsIkFVVEhfQ09ORklHIiwiYXV0aENmZyIsImNvbmZpZyIsInNwYUNsaWVudElkIiwiaXNzdWVyQmFzZVVybCIsImF1dGgwRW52IiwiYXV0aDBEb21haW4iLCJyZXBsYWNlIiwiYXV0aDBBdWRpZW5jZSIsImF1ZGllbmNlIiwiYXV0aDBDbGllbnRJZCIsImVudk5hbWUiLCJjb2xsZWN0aW9uIiwibG9jYWxGaWxlcyIsImJ1aWxkTG9jYWxWaWV3RmlsZXNGcm9tQ29sbGVjdGlvbiIsImVudllhbWwiLCJidWlsZEVudmlyb25tZW50WWFtbCIsImFkZEZpbGUiLCJmaWxlcyIsImZpbGVQYXRoIiwiY29udGVudCIsImNvbFJlcyIsImVudlZhbHVlcyIsImtleSIsImVuYWJsZWQiLCJlbnZSZXMiLCJlbnZpcm9ubWVudCIsInZhbHVlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7UUEyUlNBO2VBQUFBOztRQUFtQkM7ZUFBQUE7O1FBRmZDO2VBQUFBOztRQUNKQztlQUFBQSx1Q0FBeUI7O1FBaktaQztlQUFBQTs7OzRCQXpISzt3QkFDYzswQkFDcEI7d0JBQ0E7dUJBQ1k7OEJBSVM7MkJBSW5DO2tDQUtBO2tFQUNtQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTFCLHFFQUFxRSxHQUNyRSxNQUFNSixvQkFBb0I7SUFDekI7SUFDQTtDQUNBO0FBRUQsOEVBQThFLEdBQzlFLE1BQU1DLGlCQUFpQjtJQUN0QjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtDQUNBLENBQUNJLElBQUksQ0FBQztBQUVQLE1BQU1DLHlCQUNMLDRFQUNBLHFGQUNBO0FBUUQsZUFBZUMsV0FDZEMsVUFBNkIsRUFDN0JDLFVBQW1DO0lBRW5DLElBQUlBLFdBQVdDLGVBQWUsSUFBSSxNQUFNLE9BQU8sQ0FBQztJQUVoRCxNQUFNQyxVQUFVO1FBQ2Y7WUFBRUMsT0FBTztZQUFpQkMsYUFBYTtRQUFPO1FBQzlDO1lBQ0NELE9BQU87WUFDUEMsYUFBYTtRQUNkO1FBQ0E7WUFDQ0QsT0FBTztZQUNQQyxhQUFhO1FBQ2Q7S0FDQTtJQUNELE1BQU1DLFdBQVcsTUFBTUMsSUFBQUEsWUFBSSxFQUMxQixpQkFDQUosU0FD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
@@ -1,63 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "ApiPackageJson", {
6
- enumerable: true,
7
- get: function() {
8
- return ApiPackageJson;
9
- }
10
- });
11
- const _const = require("../../models/const.js");
12
- const _version = require("../../version.js");
13
- class ApiPackageJson {
14
- workspaceName;
15
- apiName;
16
- key = _const.WELL_KNOWN_FILES.API_PACKAGE_JSON;
17
- _dependencies;
18
- _devDependencies = {};
19
- constructor(workspaceName, apiName = "api"){
20
- this.workspaceName = workspaceName;
21
- this.apiName = apiName;
22
- this._dependencies = {
23
- "@decohere/cortex": _version.CREATE_VERSION,
24
- "@decohere/crucible": _version.CREATE_VERSION
25
- };
26
- }
27
- addDependency(name, version) {
28
- this._dependencies[name] = version;
29
- return this;
30
- }
31
- addDevDependency(name, version) {
32
- this._devDependencies[name] = version;
33
- return this;
34
- }
35
- files() {
36
- const pkg = {
37
- name: `@${this.workspaceName}/${this.apiName}`,
38
- version: "0.0.1",
39
- private: true,
40
- type: "module",
41
- main: "src/main.ts",
42
- scripts: {
43
- lint: "biome check --write ."
44
- },
45
- dependencies: {
46
- ...this._dependencies
47
- }
48
- };
49
- if (Object.keys(this._devDependencies).length > 0) {
50
- pkg.devDependencies = {
51
- ...this._devDependencies
52
- };
53
- }
54
- return [
55
- {
56
- filePath: "package.json",
57
- content: JSON.stringify(pkg, null, 2)
58
- }
59
- ];
60
- }
61
- }
62
-
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9hcGktcGFja2FnZS1qc29uLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5pbXBvcnQgeyBDUkVBVEVfVkVSU0lPTiB9IGZyb20gXCIuLi8uLi92ZXJzaW9uLmpzXCI7XG5cbi8qKlxuICogQnVpbGRlciBmb3IgYHByb2plY3RzLzxhcGk+L3BhY2thZ2UuanNvbmAuXG4gKlxuICogU3RhcnRzIHdpdGggdGhlIGNvcmUgY29ydGV4ICsgY3J1Y2libGUgZGVwcy4gRmVhdHVyZXMgY2FuIGNhbGxcbiAqIGBhZGREZXBlbmRlbmN5YCAvIGBhZGREZXZEZXBlbmRlbmN5YCB0byBleHRlbmQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlQYWNrYWdlSnNvbiBpbXBsZW1lbnRzIEtleWVkTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5ID0gV0VMTF9LTk9XTl9GSUxFUy5BUElfUEFDS0FHRV9KU09OO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX2RlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblx0cHJpdmF0ZSByZWFkb25seSBfZGV2RGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgd29ya3NwYWNlTmFtZTogc3RyaW5nLFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgYXBpTmFtZSA9IFwiYXBpXCIsXG5cdCkge1xuXHRcdHRoaXMuX2RlcGVuZGVuY2llcyA9IHtcblx0XHRcdFwiQGRlY29oZXJlL2NvcnRleFwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHRcdFwiQGRlY29oZXJlL2NydWNpYmxlXCI6IENSRUFURV9WRVJTSU9OLFxuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgYWRkRGVwZW5kZW5jeShuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2RlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgYWRkRGV2RGVwZW5kZW5jeShuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2RldkRlcGVuZGVuY2llc1tuYW1lXSA9IHZlcnNpb247XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRjb25zdCBwa2c6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuXHRcdFx0bmFtZTogYEAke3RoaXMud29ya3NwYWNlTmFtZX0vJHt0aGlzLmFwaU5hbWV9YCxcblx0XHRcdHZlcnNpb246IFwiMC4wLjFcIixcblx0XHRcdHByaXZhdGU6IHRydWUsXG5cdFx0XHR0eXBlOiBcIm1vZHVsZVwiLFxuXHRcdFx0bWFpbjogXCJzcmMvbWFpbi50c1wiLFxuXHRcdFx0c2NyaXB0czoge1xuXHRcdFx0XHRsaW50OiBcImJpb21lIGNoZWNrIC0td3JpdGUgLlwiLFxuXHRcdFx0fSxcblx0XHRcdGRlcGVuZGVuY2llczogeyAuLi50aGlzLl9kZXBlbmRlbmNpZXMgfSxcblx0XHR9O1xuXHRcdGlmIChPYmplY3Qua2V5cyh0aGlzLl9kZXZEZXBlbmRlbmNpZXMpLmxlbmd0aCA+IDApIHtcblx0XHRcdHBrZy5kZXZEZXBlbmRlbmNpZXMgPSB7IC4uLnRoaXMuX2RldkRlcGVuZGVuY2llcyB9O1xuXHRcdH1cblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJwYWNrYWdlLmpzb25cIixcblx0XHRcdFx0Y29udGVudDogSlNPTi5zdHJpbmdpZnkocGtnLCBudWxsLCAyKSxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkFwaVBhY2thZ2VKc29uIiwia2V5IiwiV0VMTF9LTk9XTl9GSUxFUyIsIkFQSV9QQUNLQUdFX0pTT04iLCJfZGVwZW5kZW5jaWVzIiwiX2RldkRlcGVuZGVuY2llcyIsIndvcmtzcGFjZU5hbWUiLCJhcGlOYW1lIiwiQ1JFQVRFX1ZFUlNJT04iLCJhZGREZXBlbmRlbmN5IiwibmFtZSIsInZlcnNpb24iLCJhZGREZXZEZXBlbmRlbmN5IiwiZmlsZXMiLCJwa2ciLCJwcml2YXRlIiwidHlwZSIsIm1haW4iLCJzY3JpcHRzIiwibGludCIsImRlcGVuZGVuY2llcyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJkZXZEZXBlbmRlbmNpZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJKU09OIiwic3RyaW5naWZ5Il0sIm1hcHBpbmdzIjoiOzs7OytCQVVhQTs7O2VBQUFBOzs7dUJBVm9CO3lCQUVGO0FBUXhCLE1BQU1BOzs7SUFDSUMsTUFBTUMsdUJBQWdCLENBQUNDLGdCQUFnQixDQUFDO0lBRXZDQyxjQUFzQztJQUN0Q0MsbUJBQTJDLENBQUMsRUFBRTtJQUUvRCxZQUNDLEFBQWlCQyxhQUFxQixFQUN0QyxBQUFpQkMsVUFBVSxLQUFLLENBQy9CO2FBRmdCRCxnQkFBQUE7YUFDQUMsVUFBQUE7UUFFakIsSUFBSSxDQUFDSCxhQUFhLEdBQUc7WUFDcEIsb0JBQW9CSSx1QkFBYztZQUNsQyxzQkFBc0JBLHVCQUFjO1FBQ3JDO0lBQ0Q7SUFFT0MsY0FBY0MsSUFBWSxFQUFFQyxPQUFlLEVBQVE7UUFDekQsSUFBSSxDQUFDUCxhQUFhLENBQUNNLEtBQUssR0FBR0M7UUFDM0IsT0FBTyxJQUFJO0lBQ1o7SUFFT0MsaUJBQWlCRixJQUFZLEVBQUVDLE9BQWUsRUFBUTtRQUM1RCxJQUFJLENBQUNOLGdCQUFnQixDQUFDSyxLQUFLLEdBQUdDO1FBQzlCLE9BQU8sSUFBSTtJQUNaO0lBRU9FLFFBQXNCO1FBQzVCLE1BQU1DLE1BQStCO1lBQ3BDSixNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQ0osYUFBYSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUNDLE9BQU8sRUFBRTtZQUM5Q0ksU0FBUztZQUNUSSxTQUFTO1lBQ1RDLE1BQU07WUFDTkMsTUFBTTtZQUNOQyxTQUFTO2dCQUNSQyxNQUFNO1lBQ1A7WUFDQUMsY0FBYztnQkFBRSxHQUFHLElBQUksQ0FBQ2hCLGFBQWE7WUFBQztRQUN2QztRQUNBLElBQUlpQixPQUFPQyxJQUFJLENBQUMsSUFBSSxDQUFDakIsZ0JBQWdCLEVBQUVrQixNQUFNLEdBQUcsR0FBRztZQUNsRFQsSUFBSVUsZUFBZSxHQUFHO2dCQUFFLEdBQUcsSUFBSSxDQUFDbkIsZ0JBQWdCO1lBQUM7UUFDbEQ7UUFDQSxPQUFPO1lBQ047Z0JBQ0NvQixVQUFVO2dCQUNWQyxTQUFTQyxLQUFLQyxTQUFTLENBQUNkLEtBQUssTUFBTTtZQUNwQztTQUNBO0lBQ0Y7QUFDRCJ9
@@ -1,26 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "AuthConfigModel", {
6
- enumerable: true,
7
- get: function() {
8
- return AuthConfigModel;
9
- }
10
- });
11
- const _const = require("../../models/const.js");
12
- class AuthConfigModel {
13
- config;
14
- key = _const.WELL_KNOWN_FILES.AUTH_CONFIG;
15
- constructor(config){
16
- this.config = config;
17
- }
18
- setAdminUser(adminUser) {
19
- this.config.adminUser = adminUser;
20
- }
21
- files() {
22
- return [];
23
- }
24
- }
25
-
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9hdXRoLWNvbmZpZy5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4uLy4uL21vZGVscy9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBLZXllZE1vZGVsLCBTb3VyY2VGaWxlIH0gZnJvbSBcIi4uLy4uL21vZGVscy9zb3VyY2UtZmlsZS5qc1wiO1xuXG5leHBvcnQgdHlwZSBBZG1pblVzZXJDb25maWcgPSB7XG5cdHN1Yjogc3RyaW5nO1xuXHRlbWFpbDogc3RyaW5nO1xuXHRwYXNzd29yZDogc3RyaW5nO1xuXHR1c2VybmFtZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgQXV0aENvbmZpZyA9IHtcblx0aXNzdWVyQmFzZVVybDogc3RyaW5nO1xuXHRhdWRpZW5jZTogc3RyaW5nO1xuXHRhZG1pblVzZXI/OiBBZG1pblVzZXJDb25maWc7XG59O1xuXG4vKipcbiAqIERhdGEtY2FycmllciBtb2RlbCBmb3IgYXV0aCBjb25maWd1cmF0aW9uLlxuICpcbiAqIFJlZ2lzdGVyZWQgYnkgQXV0aEZlYXR1cmUgd2hlbiBhdXRoMCBpcyBjb25maWd1cmVkLiBPdGhlciBmZWF0dXJlcyAoZS5nLlxuICogUG9zdG1hbkZlYXR1cmUpIHJldHJpZXZlIGl0IHZpYSB3b3Jrc3BhY2UuZ2V0TW9kZWwoV0VMTF9LTk9XTl9GSUxFUy5BVVRIX0NPTkZJRykuXG4gKiBQcm9kdWNlcyBubyBmaWxlcyDigJQgZXhpc3RzIHNvbGVseSBzbyBmZWF0dXJlcyBjYW4gY29tbXVuaWNhdGUgYXV0aCBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgQXV0aENvbmZpZ01vZGVsIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHB1YmxpYyByZWFkb25seSBrZXkgPSBXRUxMX0tOT1dOX0ZJTEVTLkFVVEhfQ09ORklHO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgY29uZmlnOiBBdXRoQ29uZmlnKSB7fVxuXG5cdHB1YmxpYyBzZXRBZG1pblVzZXIoYWRtaW5Vc2VyOiBBZG1pblVzZXJDb25maWcpOiB2b2lkIHtcblx0XHR0aGlzLmNvbmZpZy5hZG1pblVzZXIgPSBhZG1pblVzZXI7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRyZXR1cm4gW107XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJBdXRoQ29uZmlnTW9kZWwiLCJrZXkiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiQVVUSF9DT05GSUciLCJjb25maWciLCJzZXRBZG1pblVzZXIiLCJhZG1pblVzZXIiLCJmaWxlcyJdLCJtYXBwaW5ncyI6Ijs7OzsrQkF1QmFBOzs7ZUFBQUE7Ozt1QkF2Qm9CO0FBdUIxQixNQUFNQTs7SUFDSUMsTUFBTUMsdUJBQWdCLENBQUNDLFdBQVcsQ0FBQztJQUVuRCxZQUFtQixBQUFnQkMsTUFBa0IsQ0FBRTthQUFwQkEsU0FBQUE7SUFBcUI7SUFFakRDLGFBQWFDLFNBQTBCLEVBQVE7UUFDckQsSUFBSSxDQUFDRixNQUFNLENBQUNFLFNBQVMsR0FBR0E7SUFDekI7SUFFT0MsUUFBc0I7UUFDNUIsT0FBTyxFQUFFO0lBQ1Y7QUFDRCJ9