@decohere/create 0.0.1-dev.23 → 0.0.1-dev.24

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 (36) hide show
  1. package/commonjs/src/models/compose.model.js +56 -4
  2. package/commonjs/src/models/dev-container.model.js +29 -2
  3. package/commonjs/src/models/package-json.model.js +11 -6
  4. package/commonjs/src/runner.js +18 -2
  5. package/commonjs/src/webapi/create-api.js +65 -5
  6. package/commonjs/src/webapi/features/auth.feature.js +287 -7
  7. package/commonjs/src/webapi/features/auth0-cli.js +140 -9
  8. package/commonjs/src/webapi/features/database.feature.js +56 -24
  9. package/commonjs/src/webapi/features/postman.feature.js +335 -46
  10. package/commonjs/src/webapi/models/api-package-json.model.js +4 -1
  11. package/commonjs/src/webapi/models/auth-config.model.js +4 -1
  12. package/commonjs/src/webapi/models/controller-source-file.model.js +15 -7
  13. package/commonjs/src/webapi/models/main-source-file.model.js +28 -4
  14. package/es6/src/models/compose.model.js +57 -6
  15. package/es6/src/models/dev-container.model.js +30 -8
  16. package/es6/src/models/package-json.model.js +11 -6
  17. package/es6/src/runner.js +19 -3
  18. package/es6/src/webapi/create-api.js +65 -5
  19. package/es6/src/webapi/features/auth.feature.js +287 -7
  20. package/es6/src/webapi/features/auth0-cli.js +122 -9
  21. package/es6/src/webapi/features/database.feature.js +56 -24
  22. package/es6/src/webapi/features/postman.feature.js +322 -43
  23. package/es6/src/webapi/models/api-package-json.model.js +4 -1
  24. package/es6/src/webapi/models/auth-config.model.js +4 -1
  25. package/es6/src/webapi/models/controller-source-file.model.js +15 -7
  26. package/es6/src/webapi/models/main-source-file.model.js +28 -4
  27. package/package.json +2 -2
  28. package/types/src/models/compose.model.d.ts +27 -2
  29. package/types/src/models/dev-container.model.d.ts +12 -0
  30. package/types/src/models/package-json.model.d.ts +2 -0
  31. package/types/src/webapi/features/auth.feature.d.ts +3 -0
  32. package/types/src/webapi/features/auth0-cli.d.ts +25 -3
  33. package/types/src/webapi/features/postman.feature.d.ts +5 -0
  34. package/types/src/webapi/models/auth-config.model.d.ts +8 -0
  35. package/types/src/webapi/models/controller-source-file.model.d.ts +6 -3
  36. package/types/src/webapi/models/main-source-file.model.d.ts +12 -0
@@ -2,12 +2,24 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- Object.defineProperty(exports, "PostmanFeature", {
6
- enumerable: true,
7
- get: function() {
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 () {
8
19
  return PostmanFeature;
9
20
  }
10
21
  });
22
+ const _nodecrypto = require("node:crypto");
11
23
  const _prompt = require("../../domain/prompt.js");
12
24
  const _const = require("../../models/const.js");
13
25
  const _auth0cli = /*#__PURE__*/ _interop_require_wildcard(require("./auth0-cli.js"));
@@ -52,6 +64,19 @@ function _interop_require_wildcard(obj, nodeInterop) {
52
64
  }
53
65
  return newObj;
54
66
  }
67
+ /** Postman OAuth callback URLs (popup + "Authorize using browser"). */ const POSTMAN_CALLBACKS = [
68
+ "https://oauth.pstmn.io/v1/callback",
69
+ "https://oauth.pstmn.io/v1/browser-callback"
70
+ ];
71
+ /** Scopes requested for Auth0 access tokens (OIDC + Hello CASL permissions). */ const POSTMAN_SCOPES = [
72
+ "openid",
73
+ "profile",
74
+ "email",
75
+ "read:Hello",
76
+ "create:Hello",
77
+ "update:Hello",
78
+ "delete:Hello"
79
+ ].join(" ");
55
80
  async function getOptions(_workspace, cliOptions) {
56
81
  if (cliOptions.postmanProvider != null) return {};
57
82
  const choices = [
@@ -61,11 +86,11 @@ async function getOptions(_workspace, cliOptions) {
61
86
  },
62
87
  {
63
88
  label: "local",
64
- description: "write collection + environment files"
89
+ description: "Local View / Native Git files (no API key)"
65
90
  },
66
91
  {
67
92
  label: "api",
68
- description: "write files and upload to Postman.com"
93
+ description: "also upload to Postman.com (needs API key)"
69
94
  }
70
95
  ];
71
96
  const selected = await (0, _prompt.pick)("\n Postman: ", choices, (c)=>`${c.label} — ${c.description}`);
@@ -76,7 +101,6 @@ async function getOptions(_workspace, cliOptions) {
76
101
  if (provider === "local") return {
77
102
  postmanProvider: "local"
78
103
  };
79
- // api: collect API key + workspace selection
80
104
  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): "));
81
105
  const headers = {
82
106
  "X-Api-Key": apiKey,
@@ -129,7 +153,7 @@ async function getOptions(_workspace, cliOptions) {
129
153
  workspaceId
130
154
  };
131
155
  }
132
- function buildCollection(projectName, auth) {
156
+ /** v2.1 JSON — used for Postman.com API upload only. */ function buildCollectionJson(projectName, auth) {
133
157
  const authObj = auth?.auth0Domain ? {
134
158
  type: "oauth2",
135
159
  oauth2: [
@@ -155,9 +179,19 @@ function buildCollection(projectName, auth) {
155
179
  },
156
180
  {
157
181
  key: "scope",
158
- value: "openid profile email",
182
+ value: POSTMAN_SCOPES,
183
+ type: "string"
184
+ },
185
+ {
186
+ key: "redirect_uri",
187
+ value: POSTMAN_CALLBACKS[0],
159
188
  type: "string"
160
189
  },
190
+ {
191
+ key: "useBrowser",
192
+ value: "true",
193
+ type: "boolean"
194
+ },
161
195
  {
162
196
  key: "addTokenTo",
163
197
  value: "header",
@@ -167,13 +201,37 @@ function buildCollection(projectName, auth) {
167
201
  key: "challengeAlgorithm",
168
202
  value: "S256",
169
203
  type: "string"
204
+ },
205
+ {
206
+ key: "client_authentication",
207
+ value: "body",
208
+ type: "string"
209
+ },
210
+ {
211
+ key: "clientSecret",
212
+ value: "",
213
+ type: "string"
214
+ },
215
+ {
216
+ key: "tokenName",
217
+ value: `${projectName} Access Token`,
218
+ type: "string"
170
219
  }
171
220
  ]
172
221
  } : undefined;
222
+ const helloUrl = (path, raw)=>({
223
+ raw: `{{baseUrl}}${raw}`,
224
+ host: [
225
+ "{{baseUrl}}"
226
+ ],
227
+ path: path.split("/").filter(Boolean)
228
+ });
173
229
  return {
174
230
  info: {
231
+ _postman_id: (0, _nodecrypto.randomUUID)(),
175
232
  name: `${projectName} WebAPI`,
176
- schema: "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
233
+ schema: "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
234
+ description: "Open the project root in Postman Local View (not the postman/ folder). " + "Select the Local environment, then Authorization → Get New Access Token (PKCE)."
177
235
  },
178
236
  ...authObj ? {
179
237
  auth: authObj
@@ -181,46 +239,268 @@ function buildCollection(projectName, auth) {
181
239
  item: [
182
240
  {
183
241
  name: "Hello",
184
- request: {
185
- method: "GET",
186
- url: {
187
- raw: "{{baseUrl}}/hello",
188
- host: [
189
- "{{baseUrl}}"
190
- ],
191
- path: [
192
- "hello"
193
- ]
242
+ item: [
243
+ {
244
+ name: "List (anonymous)",
245
+ request: {
246
+ auth: {
247
+ type: "noauth"
248
+ },
249
+ method: "GET",
250
+ url: helloUrl("hello", "/hello")
251
+ }
252
+ },
253
+ {
254
+ name: "Get by id",
255
+ request: {
256
+ method: "GET",
257
+ url: helloUrl("hello/:id", "/hello/:id")
258
+ }
259
+ },
260
+ {
261
+ name: "Create",
262
+ request: {
263
+ method: "POST",
264
+ header: [
265
+ {
266
+ key: "Content-Type",
267
+ value: "application/json"
268
+ }
269
+ ],
270
+ body: {
271
+ mode: "raw",
272
+ raw: '{\n "message": "hello"\n}\n'
273
+ },
274
+ url: helloUrl("hello", "/hello")
275
+ }
276
+ },
277
+ {
278
+ name: "Update",
279
+ request: {
280
+ method: "PUT",
281
+ header: [
282
+ {
283
+ key: "Content-Type",
284
+ value: "application/json"
285
+ }
286
+ ],
287
+ body: {
288
+ mode: "raw",
289
+ raw: '{\n "message": "updated"\n}\n'
290
+ },
291
+ url: helloUrl("hello/:id", "/hello/:id")
292
+ }
293
+ },
294
+ {
295
+ name: "Delete",
296
+ request: {
297
+ method: "DELETE",
298
+ url: helloUrl("hello/:id", "/hello/:id")
299
+ }
194
300
  }
195
- }
301
+ ]
196
302
  }
197
303
  ]
198
304
  };
199
305
  }
200
- function buildEnvironmentYaml(name, auth) {
201
- const auth0Section = auth?.auth0Domain ? [
202
- " - key: auth0Domain",
203
- ` value: ${auth.auth0Domain}`,
204
- " - key: auth0Audience",
205
- ` value: '${auth.auth0Audience ?? ""}'`,
206
- " - key: auth0ClientId",
207
- ` value: '${auth.auth0ClientId ?? ""}'`,
208
- " description: Client ID of the Auth0 SPA application used by Postman for PKCE authentication"
209
- ].join("\n") + "\n" : "";
210
- return `name: ${name}\nvalues:\n - key: baseUrl\n value: 'http://localhost:3000'\n${auth0Section}`;
306
+ function yamlQuote(value) {
307
+ if (/[:#{}[\],&*?|<>=!%@`]/.test(value) || value.includes("\n") || value === "") {
308
+ return JSON.stringify(value);
309
+ }
310
+ return value;
311
+ }
312
+ /** Local View / Native Git environment (YAML). */ function buildEnvironmentYaml(name, auth) {
313
+ const values = [
314
+ {
315
+ key: "baseUrl",
316
+ value: "http://localhost:3000"
317
+ }
318
+ ];
319
+ if (auth?.auth0Domain) {
320
+ values.push({
321
+ key: "auth0Domain",
322
+ value: auth.auth0Domain
323
+ }, {
324
+ key: "auth0Audience",
325
+ value: auth.auth0Audience ?? ""
326
+ }, {
327
+ key: "auth0ClientId",
328
+ value: auth.auth0ClientId ?? ""
329
+ }, {
330
+ key: "authUrl",
331
+ value: `https://${auth.auth0Domain}/authorize?audience=${auth.auth0Audience ?? ""}`
332
+ }, {
333
+ key: "accessTokenUrl",
334
+ value: `https://${auth.auth0Domain}/oauth/token`
335
+ }, {
336
+ key: "callbackUrl",
337
+ value: POSTMAN_CALLBACKS[0]
338
+ }, {
339
+ key: "scope",
340
+ value: POSTMAN_SCOPES
341
+ });
342
+ }
343
+ const lines = [
344
+ `name: ${yamlQuote(name)}`,
345
+ "values:"
346
+ ];
347
+ for (const v of values){
348
+ lines.push(` - key: ${v.key}`);
349
+ lines.push(` value: ${yamlQuote(v.value)}`);
350
+ lines.push(" enabled: true");
351
+ }
352
+ return `${lines.join("\n")}\n`;
353
+ }
354
+ /** Local View / Native Git collection (v3 multi-file YAML). */ function buildLocalViewFiles(projectName, auth) {
355
+ const collectionDir = `postman/collections/${projectName} WebAPI`;
356
+ const files = [];
357
+ // Postman Local View stores OAuth under auth[].credentials (not the v2.1 oauth2 array).
358
+ // Use concrete https URLs — empty Auth URL yields "Invalid protocol for auth URL".
359
+ const authBlock = auth?.auth0Domain ? [
360
+ "auth:",
361
+ ` - id: ${(0, _nodecrypto.randomUUID)()}`,
362
+ " type: oauth2",
363
+ " name: OAuth 2.0",
364
+ " credentials:",
365
+ " addTokenTo: header",
366
+ " grant_type: authorization_code_with_pkce",
367
+ ` authUrl: https://${auth.auth0Domain}/authorize?audience=${auth.auth0Audience ?? ""}`,
368
+ ` accessTokenUrl: https://${auth.auth0Domain}/oauth/token`,
369
+ ` clientId: ${yamlQuote(auth.auth0ClientId ?? "")}`,
370
+ ` scope: ${yamlQuote(POSTMAN_SCOPES)}`,
371
+ ` redirect_uri: ${POSTMAN_CALLBACKS[0]}`,
372
+ " useBrowser: true",
373
+ " challengeAlgorithm: S256",
374
+ // SPA public client: Auth0 token endpoint rejects Basic auth (feacft Unauthorized).
375
+ " client_authentication: body",
376
+ ' clientSecret: ""',
377
+ ` tokenName: ${yamlQuote(`${projectName} Access Token`)}`,
378
+ ""
379
+ ].join("\n") : "";
380
+ files.push({
381
+ filePath: `${collectionDir}/.resources/definition.yaml`,
382
+ content: [
383
+ "$kind: collection",
384
+ `name: ${yamlQuote(`${projectName} WebAPI`)}`,
385
+ "schemaVersion: '3.0'",
386
+ "description: >-",
387
+ " Open this project root in Postman Local View (Files → Open folder).",
388
+ " Select the Local environment, then Authorization → Get New Access Token (PKCE).",
389
+ authBlock
390
+ ].filter((l)=>l !== undefined).join("\n").replace(/\n+$/, "\n")
391
+ });
392
+ files.push({
393
+ filePath: `${collectionDir}/Hello/.resources/definition.yaml`,
394
+ content: [
395
+ "$kind: folder",
396
+ "name: Hello",
397
+ "order: 1000",
398
+ ""
399
+ ].join("\n")
400
+ });
401
+ const requests = [
402
+ {
403
+ file: "List (anonymous).request.yaml",
404
+ yaml: [
405
+ "$kind: http-request",
406
+ "name: List (anonymous)",
407
+ "method: GET",
408
+ 'url: "{{baseUrl}}/hello"',
409
+ "auth:",
410
+ " type: noauth",
411
+ "order: 1000",
412
+ ""
413
+ ].join("\n")
414
+ },
415
+ {
416
+ file: "Get by id.request.yaml",
417
+ yaml: [
418
+ "$kind: http-request",
419
+ "name: Get by id",
420
+ "method: GET",
421
+ 'url: "{{baseUrl}}/hello/:id"',
422
+ "order: 2000",
423
+ ""
424
+ ].join("\n")
425
+ },
426
+ {
427
+ file: "Create.request.yaml",
428
+ yaml: [
429
+ "$kind: http-request",
430
+ "name: Create",
431
+ "method: POST",
432
+ 'url: "{{baseUrl}}/hello"',
433
+ "headers:",
434
+ " Content-Type: application/json",
435
+ "body:",
436
+ " type: json",
437
+ " content: |-",
438
+ " {",
439
+ ' "message": "hello"',
440
+ " }",
441
+ "order: 3000",
442
+ ""
443
+ ].join("\n")
444
+ },
445
+ {
446
+ file: "Update.request.yaml",
447
+ yaml: [
448
+ "$kind: http-request",
449
+ "name: Update",
450
+ "method: PUT",
451
+ 'url: "{{baseUrl}}/hello/:id"',
452
+ "headers:",
453
+ " Content-Type: application/json",
454
+ "body:",
455
+ " type: json",
456
+ " content: |-",
457
+ " {",
458
+ ' "message": "updated"',
459
+ " }",
460
+ "order: 4000",
461
+ ""
462
+ ].join("\n")
463
+ },
464
+ {
465
+ file: "Delete.request.yaml",
466
+ yaml: [
467
+ "$kind: http-request",
468
+ "name: Delete",
469
+ "method: DELETE",
470
+ 'url: "{{baseUrl}}/hello/:id"',
471
+ "order: 5000",
472
+ ""
473
+ ].join("\n")
474
+ }
475
+ ];
476
+ for (const r of requests){
477
+ files.push({
478
+ filePath: `${collectionDir}/Hello/${r.file}`,
479
+ content: r.yaml
480
+ });
481
+ }
482
+ return files;
211
483
  }
212
484
  async function scaffold(workspace, options) {
213
- if (options.postmanProvider === "none") return;
485
+ if (options.postmanProvider === "none" || options.postmanProvider == null) return;
214
486
  const authConfigModel = workspace.getModel(_const.WELL_KNOWN_FILES.AUTH_CONFIG);
215
487
  const authCfg = authConfigModel?.config;
216
488
  let spaClientId;
217
- if (options.postmanProvider === "api" && options.apiKey && authCfg?.issuerBaseUrl) {
489
+ if (authCfg?.issuerBaseUrl) {
218
490
  try {
219
- const app = _auth0cli.createSpaApp(`${workspace.name} Postman`, "https://oauth.pstmn.io/v1/callback");
491
+ const app = _auth0cli.createSpaApp(`${workspace.name} Postman`, [
492
+ ...POSTMAN_CALLBACKS
493
+ ]);
220
494
  spaClientId = app.client_id;
221
495
  console.log(" ✓ Auth0 SPA app created for Postman PKCE");
496
+ try {
497
+ _auth0cli.enableConnectionForClient(_auth0cli.DB_CONNECTION_NAME, spaClientId);
498
+ console.log(` ✓ Enabled ${_auth0cli.DB_CONNECTION_NAME} on Postman SPA`);
499
+ } catch (err) {
500
+ console.error(` ✗ Failed to enable DB connection on SPA: ${err instanceof Error ? err.message : err}`);
501
+ }
222
502
  } catch {
223
- console.error(" ✗ Failed to create Auth0 SPA app — continuing without it.");
503
+ console.error(" ✗ Failed to create Auth0 SPA app — set auth0ClientId in the environment.");
224
504
  }
225
505
  }
226
506
  const auth0Env = authCfg?.issuerBaseUrl ? {
@@ -229,21 +509,30 @@ async function scaffold(workspace, options) {
229
509
  auth0ClientId: spaClientId
230
510
  } : undefined;
231
511
  const projectName = workspace.name;
232
- const collection = buildCollection(projectName, auth0Env);
233
- const envYaml = buildEnvironmentYaml(`${projectName} — Local`, auth0Env);
512
+ const envName = `${projectName} Local`;
513
+ const localFiles = buildLocalViewFiles(projectName, auth0Env);
514
+ const envYaml = buildEnvironmentYaml(envName, auth0Env);
234
515
  workspace.addFile({
235
516
  files: ()=>[
236
517
  {
237
- filePath: `postman/environments/${projectName} \u2014 Local.environment.yaml`,
238
- content: envYaml
518
+ filePath: ".postman/resources.yaml",
519
+ content: [
520
+ "# Open this project root in Postman (Files → Open folder), not the postman/ subfolder.",
521
+ "# Postman fills workspace.id when you connect Local View.",
522
+ "#",
523
+ "# All resources under postman/ are registered automatically.",
524
+ ""
525
+ ].join("\n")
239
526
  },
240
527
  {
241
- filePath: `postman/collections/${projectName}.postman_collection.json`,
242
- content: `${JSON.stringify(collection, null, 2)}\n`
243
- }
528
+ filePath: `postman/environments/${projectName}-Local.environment.yaml`,
529
+ content: envYaml
530
+ },
531
+ ...localFiles
244
532
  ]
245
533
  });
246
534
  if (options.postmanProvider === "api" && options.apiKey) {
535
+ const collection = buildCollectionJson(projectName, auth0Env);
247
536
  const headers = {
248
537
  "X-Api-Key": options.apiKey,
249
538
  "Content-Type": "application/json"
@@ -260,7 +549,7 @@ async function scaffold(workspace, options) {
260
549
  } else {
261
550
  console.error(" ✗ Failed to upload Postman collection");
262
551
  }
263
- const envVars = [
552
+ const envValues = [
264
553
  {
265
554
  key: "baseUrl",
266
555
  value: "http://localhost:3000",
@@ -289,8 +578,8 @@ async function scaffold(workspace, options) {
289
578
  headers,
290
579
  body: JSON.stringify({
291
580
  environment: {
292
- name: `${projectName} — Local`,
293
- values: envVars
581
+ name: envName,
582
+ values: envValues
294
583
  }
295
584
  })
296
585
  });
@@ -306,4 +595,4 @@ const PostmanFeature = {
306
595
  scaffold
307
596
  };
308
597
 
309
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL3Bvc3RtYW4uZmVhdHVyZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwaWNrIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9wcm9tcHQuanNcIjtcbmltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZVNjYWZmb2xkIH0gZnJvbSBcIi4uLy4uL21vZGVscy9wcm9qZWN0Lm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmUgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc2NhZmZvbGQuc2VydmljZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoQ29uZmlnTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxzL2F1dGgtY29uZmlnLm1vZGVsLmpzXCI7XG5pbXBvcnQgKiBhcyBhdXRoMENsaSBmcm9tIFwiLi9hdXRoMC1jbGkuanNcIjtcblxuZXhwb3J0IHR5cGUgUG9zdG1hbk9wdGlvbnMgPSB7XG5cdHBvc3RtYW5Qcm92aWRlcj86IFwiYXBpXCIgfCBcImxvY2FsXCIgfCBcIm5vbmVcIjtcblx0YXBpS2V5Pzogc3RyaW5nO1xuXHR3b3Jrc3BhY2VJZD86IHN0cmluZztcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE9wdGlvbnMoXG5cdF93b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRjbGlPcHRpb25zOiBQYXJ0aWFsPFBvc3RtYW5PcHRpb25zPixcbik6IFByb21pc2U8UGFydGlhbDxQb3N0bWFuT3B0aW9ucz4+IHtcblx0aWYgKGNsaU9wdGlvbnMucG9zdG1hblByb3ZpZGVyICE9IG51bGwpIHJldHVybiB7fTtcblxuXHRjb25zdCBjaG9pY2VzID0gW1xuXHRcdHsgbGFiZWw6IFwibm9uZVwiIGFzIGNvbnN0LCBkZXNjcmlwdGlvbjogXCJza2lwXCIgfSxcblx0XHR7IGxhYmVsOiBcImxvY2FsXCIgYXMgY29uc3QsIGRlc2NyaXB0aW9uOiBcIndyaXRlIGNvbGxlY3Rpb24gKyBlbnZpcm9ubWVudCBmaWxlc1wiIH0sXG5cdFx0eyBsYWJlbDogXCJhcGlcIiBhcyBjb25zdCwgZGVzY3JpcHRpb246IFwid3JpdGUgZmlsZXMgYW5kIHVwbG9hZCB0byBQb3N0bWFuLmNvbVwiIH0sXG5cdF07XG5cdGNvbnN0IHNlbGVjdGVkID0gYXdhaXQgcGljayhcblx0XHRcIlxcbiAgUG9zdG1hbjogXCIsXG5cdFx0Y2hvaWNlcyxcblx0XHQoYykgPT4gYCR7Yy5sYWJlbH0g4oCUICR7Yy5kZXNjcmlwdGlvbn1gLFxuXHQpO1xuXHRjb25zdCBwcm92aWRlciA9IHNlbGVjdGVkPy5sYWJlbCA/PyBcIm5vbmVcIjtcblxuXHRpZiAocHJvdmlkZXIgPT09IFwibm9uZVwiKSByZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwibm9uZVwiIH07XG5cdGlmIChwcm92aWRlciA9PT0gXCJsb2NhbFwiKSByZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwibG9jYWxcIiB9O1xuXG5cdC8vIGFwaTogY29sbGVjdCBBUEkga2V5ICsgd29ya3NwYWNlIHNlbGVjdGlvblxuXHRjb25zdCBhcGlLZXkgPVxuXHRcdHByb2Nlc3MuZW52LlBPU1RNQU5fQVBJX0tFWSA/P1xuXHRcdChhd2FpdCBpbXBvcnQoXCIuLi8uLi9kb21haW4vcHJvbXB0LmpzXCIpLnRoZW4oKG0pID0+XG5cdFx0XHRtLmFzayhcIlxcbiAgUG9zdG1hbiBBUEkga2V5IChhcHAuZ2V0cG9zdG1hbi5jb20vc2V0dGluZ3MvbWUvYXBpLWtleXMpOiBcIiksXG5cdFx0KSk7XG5cblx0Y29uc3QgaGVhZGVycyA9IHsgXCJYLUFwaS1LZXlcIjogYXBpS2V5LCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9O1xuXHRjb25zdCB3c1JlcyA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vd29ya3NwYWNlc1wiLCB7IGhlYWRlcnMgfSk7XG5cblx0aWYgKCF3c1Jlcy5vaykge1xuXHRcdGNvbnNvbGUuZXJyb3IoXCJcXG4gIFBvc3RtYW4gQVBJIGtleSBpbnZhbGlkIOKAlCBmYWxsaW5nIGJhY2sgdG8gbG9jYWwgZmlsZXMuXCIpO1xuXHRcdHJldHVybiB7IHBvc3RtYW5Qcm92aWRlcjogXCJsb2NhbFwiIH07XG5cdH1cblxuXHRjb25zdCB7IHdvcmtzcGFjZXMgfSA9IChhd2FpdCB3c1Jlcy5qc29uKCkpIGFzIHtcblx0XHR3b3Jrc3BhY2VzOiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0+O1xuXHR9O1xuXG5cdHR5cGUgV3NDaG9pY2UgPSB7IGxhYmVsOiBzdHJpbmc7IGlkOiBzdHJpbmcgfCBudWxsIH07XG5cdGNvbnN0IHdzQ2hvaWNlczogV3NDaG9pY2VbXSA9IFtcblx0XHR7IGxhYmVsOiBcIjxuZXcgd29ya3NwYWNlPlwiLCBpZDogbnVsbCB9LFxuXHRcdC4uLndvcmtzcGFjZXMubWFwKCh3KSA9PiAoeyBsYWJlbDogYCR7dy5uYW1lfSAoJHt3LnR5cGV9KWAsIGlkOiB3LmlkIH0pKSxcblx0XTtcblxuXHRjb25zdCB3c1BpY2tlZCA9IGF3YWl0IHBpY2soXCJcXG4gIFBvc3RtYW4gd29ya3NwYWNlOiBcIiwgd3NDaG9pY2VzLCAoYykgPT4gYy5sYWJlbCk7XG5cblx0bGV0IHdvcmtzcGFjZUlkOiBzdHJpbmc7XG5cdGlmICghd3NQaWNrZWQgfHwgd3NQaWNrZWQuaWQgPT09IG51bGwpIHtcblx0XHRjb25zdCB7IGFzayB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiKTtcblx0XHRjb25zdCB3c05hbWUgPSBhd2FpdCBhc2soYCAgV29ya3NwYWNlIG5hbWU6IGApO1xuXHRcdGNvbnN0IGNyZWF0ZVJlcyA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vd29ya3NwYWNlc1wiLCB7XG5cdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0aGVhZGVycyxcblx0XHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgd29ya3NwYWNlOiB7IG5hbWU6IHdzTmFtZSwgdHlwZTogXCJwZXJzb25hbFwiIH0gfSksXG5cdFx0fSk7XG5cdFx0Y29uc3QgeyB3b3Jrc3BhY2U6IHdzIH0gPSAoYXdhaXQgY3JlYXRlUmVzLmpzb24oKSkgYXMgeyB3b3Jrc3BhY2U6IHsgaWQ6IHN0cmluZyB9IH07XG5cdFx0d29ya3NwYWNlSWQgPSB3cy5pZDtcblx0XHRjb25zb2xlLmxvZyhgICDinJMgV29ya3NwYWNlIGNyZWF0ZWQ6ICR7d3NOYW1lfWApO1xuXHR9IGVsc2Uge1xuXHRcdHdvcmtzcGFjZUlkID0gd3NQaWNrZWQuaWQ7XG5cdH1cblxuXHRyZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwiYXBpXCIsIGFwaUtleSwgd29ya3NwYWNlSWQgfTtcbn1cblxudHlwZSBBdXRoMEVudiA9IHtcblx0YXV0aDBEb21haW4/OiBzdHJpbmc7XG5cdGF1dGgwQXVkaWVuY2U/OiBzdHJpbmc7XG5cdGF1dGgwQ2xpZW50SWQ/OiBzdHJpbmc7XG59O1xuXG5mdW5jdGlvbiBidWlsZENvbGxlY3Rpb24ocHJvamVjdE5hbWU6IHN0cmluZywgYXV0aD86IEF1dGgwRW52KTogdW5rbm93biB7XG5cdGNvbnN0IGF1dGhPYmogPSBhdXRoPy5hdXRoMERvbWFpblxuXHRcdD8ge1xuXHRcdFx0XHR0eXBlOiBcIm9hdXRoMlwiLFxuXHRcdFx0XHRvYXV0aDI6IFtcblx0XHRcdFx0XHR7IGtleTogXCJncmFudF90eXBlXCIsIHZhbHVlOiBcImF1dGhvcml6YXRpb25fY29kZV93aXRoX3BrY2VcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGtleTogXCJhdXRoVXJsXCIsXG5cdFx0XHRcdFx0XHR2YWx1ZTogXCJodHRwczovL3t7YXV0aDBEb21haW59fS9hdXRob3JpemU/YXVkaWVuY2U9e3thdXRoMEF1ZGllbmNlfX1cIixcblx0XHRcdFx0XHRcdHR5cGU6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRrZXk6IFwiYWNjZXNzVG9rZW5VcmxcIixcblx0XHRcdFx0XHRcdHZhbHVlOiBcImh0dHBzOi8ve3thdXRoMERvbWFpbn19L29hdXRoL3Rva2VuXCIsXG5cdFx0XHRcdFx0XHR0eXBlOiBcInN0cmluZ1wiLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0eyBrZXk6IFwiY2xpZW50SWRcIiwgdmFsdWU6IFwie3thdXRoMENsaWVudElkfX1cIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRcdHsga2V5OiBcInNjb3BlXCIsIHZhbHVlOiBcIm9wZW5pZCBwcm9maWxlIGVtYWlsXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0XHR7IGtleTogXCJhZGRUb2tlblRvXCIsIHZhbHVlOiBcImhlYWRlclwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG5cdFx0XHRcdFx0eyBrZXk6IFwiY2hhbGxlbmdlQWxnb3JpdGhtXCIsIHZhbHVlOiBcIlMyNTZcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fVxuXHRcdDogdW5kZWZpbmVkO1xuXG5cdHJldHVybiB7XG5cdFx0aW5mbzoge1xuXHRcdFx0bmFtZTogYCR7cHJvamVjdE5hbWV9IFdlYkFQSWAsXG5cdFx0XHRzY2hlbWE6IFwiaHR0cHM6Ly9zY2hlbWEuZ2V0cG9zdG1hbi5jb20vanNvbi9jb2xsZWN0aW9uL3YyLjEuMC9jb2xsZWN0aW9uLmpzb25cIixcblx0XHR9LFxuXHRcdC4uLihhdXRoT2JqID8geyBhdXRoOiBhdXRoT2JqIH0gOiB7fSksXG5cdFx0aXRlbTogW1xuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcIkhlbGxvXCIsXG5cdFx0XHRcdHJlcXVlc3Q6IHtcblx0XHRcdFx0XHRtZXRob2Q6IFwiR0VUXCIsXG5cdFx0XHRcdFx0dXJsOiB7IHJhdzogXCJ7e2Jhc2VVcmx9fS9oZWxsb1wiLCBob3N0OiBbXCJ7e2Jhc2VVcmx9fVwiXSwgcGF0aDogW1wiaGVsbG9cIl0gfSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XSxcblx0fTtcbn1cblxuZnVuY3Rpb24gYnVpbGRFbnZpcm9ubWVudFlhbWwobmFtZTogc3RyaW5nLCBhdXRoPzogQXV0aDBFbnYpOiBzdHJpbmcge1xuXHRjb25zdCBhdXRoMFNlY3Rpb24gPSBhdXRoPy5hdXRoMERvbWFpblxuXHRcdD8gW1xuXHRcdFx0XHRcIiAgLSBrZXk6IGF1dGgwRG9tYWluXCIsXG5cdFx0XHRcdGAgICAgdmFsdWU6ICR7YXV0aC5hdXRoMERvbWFpbn1gLFxuXHRcdFx0XHRcIiAgLSBrZXk6IGF1dGgwQXVkaWVuY2VcIixcblx0XHRcdFx0YCAgICB2YWx1ZTogJyR7YXV0aC5hdXRoMEF1ZGllbmNlID8/IFwiXCJ9J2AsXG5cdFx0XHRcdFwiICAtIGtleTogYXV0aDBDbGllbnRJZFwiLFxuXHRcdFx0XHRgICAgIHZhbHVlOiAnJHthdXRoLmF1dGgwQ2xpZW50SWQgPz8gXCJcIn0nYCxcblx0XHRcdFx0XCIgICAgZGVzY3JpcHRpb246IENsaWVudCBJRCBvZiB0aGUgQXV0aDAgU1BBIGFwcGxpY2F0aW9uIHVzZWQgYnkgUG9zdG1hbiBmb3IgUEtDRSBhdXRoZW50aWNhdGlvblwiLFxuXHRcdFx0XS5qb2luKFwiXFxuXCIpICsgXCJcXG5cIlxuXHRcdDogXCJcIjtcblxuXHRyZXR1cm4gYG5hbWU6ICR7bmFtZX1cXG52YWx1ZXM6XFxuICAtIGtleTogYmFzZVVybFxcbiAgICB2YWx1ZTogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMCdcXG4ke2F1dGgwU2VjdGlvbn1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZCh3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLCBvcHRpb25zOiBQb3N0bWFuT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuXHRpZiAob3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgPT09IFwibm9uZVwiKSByZXR1cm47XG5cblx0Y29uc3QgYXV0aENvbmZpZ01vZGVsID0gd29ya3NwYWNlLmdldE1vZGVsPEF1dGhDb25maWdNb2RlbD4oV0VMTF9LTk9XTl9GSUxFUy5BVVRIX0NPTkZJRyk7XG5cdGNvbnN0IGF1dGhDZmcgPSBhdXRoQ29uZmlnTW9kZWw/LmNvbmZpZztcblxuXHRsZXQgc3BhQ2xpZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuXHRpZiAob3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgPT09IFwiYXBpXCIgJiYgb3B0aW9ucy5hcGlLZXkgJiYgYXV0aENmZz8uaXNzdWVyQmFzZVVybCkge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBhcHAgPSBhdXRoMENsaS5jcmVhdGVTcGFBcHAoXG5cdFx0XHRcdGAke3dvcmtzcGFjZS5uYW1lfSBQb3N0bWFuYCxcblx0XHRcdFx0XCJodHRwczovL29hdXRoLnBzdG1uLmlvL3YxL2NhbGxiYWNrXCIsXG5cdFx0XHQpO1xuXHRcdFx0c3BhQ2xpZW50SWQgPSBhcHAuY2xpZW50X2lkO1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBBdXRoMCBTUEEgYXBwIGNyZWF0ZWQgZm9yIFBvc3RtYW4gUEtDRVwiKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCIgIOKclyBGYWlsZWQgdG8gY3JlYXRlIEF1dGgwIFNQQSBhcHAg4oCUIGNvbnRpbnVpbmcgd2l0aG91dCBpdC5cIik7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3QgYXV0aDBFbnY6IEF1dGgwRW52IHwgdW5kZWZpbmVkID0gYXV0aENmZz8uaXNzdWVyQmFzZVVybFxuXHRcdD8ge1xuXHRcdFx0XHRhdXRoMERvbWFpbjogYXV0aENmZy5pc3N1ZXJCYXNlVXJsLnJlcGxhY2UoL15odHRwcz86XFwvXFwvLywgXCJcIiksXG5cdFx0XHRcdGF1dGgwQXVkaWVuY2U6IGF1dGhDZmcuYXVkaWVuY2UsXG5cdFx0XHRcdGF1dGgwQ2xpZW50SWQ6IHNwYUNsaWVudElkLFxuXHRcdFx0fVxuXHRcdDogdW5kZWZpbmVkO1xuXG5cdGNvbnN0IHByb2plY3ROYW1lID0gd29ya3NwYWNlLm5hbWU7XG5cdGNvbnN0IGNvbGxlY3Rpb24gPSBidWlsZENvbGxlY3Rpb24ocHJvamVjdE5hbWUsIGF1dGgwRW52KTtcblx0Y29uc3QgZW52WWFtbCA9IGJ1aWxkRW52aXJvbm1lbnRZYW1sKGAke3Byb2plY3ROYW1lfSDigJQgTG9jYWxgLCBhdXRoMEVudik7XG5cblx0d29ya3NwYWNlLmFkZEZpbGUoe1xuXHRcdGZpbGVzOiAoKSA9PiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBgcG9zdG1hbi9lbnZpcm9ubWVudHMvJHtwcm9qZWN0TmFtZX0gXFx1MjAxNCBMb2NhbC5lbnZpcm9ubWVudC55YW1sYCxcblx0XHRcdFx0Y29udGVudDogZW52WWFtbCxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBgcG9zdG1hbi9jb2xsZWN0aW9ucy8ke3Byb2plY3ROYW1lfS5wb3N0bWFuX2NvbGxlY3Rpb24uanNvbmAsXG5cdFx0XHRcdGNvbnRlbnQ6IGAke0pTT04uc3RyaW5naWZ5KGNvbGxlY3Rpb24sIG51bGwsIDIpfVxcbmAsXG5cdFx0XHR9LFxuXHRcdF0sXG5cdH0pO1xuXG5cdGlmIChvcHRpb25zLnBvc3RtYW5Qcm92aWRlciA9PT0gXCJhcGlcIiAmJiBvcHRpb25zLmFwaUtleSkge1xuXHRcdGNvbnN0IGhlYWRlcnMgPSB7IFwiWC1BcGktS2V5XCI6IG9wdGlvbnMuYXBpS2V5LCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9O1xuXG5cdFx0Y29uc3QgY29sUmVzID0gYXdhaXQgZmV0Y2goXG5cdFx0XHRgaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vY29sbGVjdGlvbnM/d29ya3NwYWNlPSR7b3B0aW9ucy53b3Jrc3BhY2VJZH1gLFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRoZWFkZXJzLFxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvbGxlY3Rpb24gfSksXG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0aWYgKGNvbFJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBQb3N0bWFuIGNvbGxlY3Rpb24gdXBsb2FkZWRcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCIgIOKclyBGYWlsZWQgdG8gdXBsb2FkIFBvc3RtYW4gY29sbGVjdGlvblwiKTtcblx0XHR9XG5cblx0XHRjb25zdCBlbnZWYXJzID0gW1xuXHRcdFx0eyBrZXk6IFwiYmFzZVVybFwiLCB2YWx1ZTogXCJodHRwOi8vbG9jYWxob3N0OjMwMDBcIiwgZW5hYmxlZDogdHJ1ZSB9LFxuXHRcdFx0Li4uKGF1dGgwRW52Py5hdXRoMERvbWFpblxuXHRcdFx0XHQ/IFtcblx0XHRcdFx0XHRcdHsga2V5OiBcImF1dGgwRG9tYWluXCIsIHZhbHVlOiBhdXRoMEVudi5hdXRoMERvbWFpbiwgZW5hYmxlZDogdHJ1ZSB9LFxuXHRcdFx0XHRcdFx0eyBrZXk6IFwiYXV0aDBBdWRpZW5jZVwiLCB2YWx1ZTogYXV0aDBFbnYuYXV0aDBBdWRpZW5jZSA/PyBcIlwiLCBlbmFibGVkOiB0cnVlIH0sXG5cdFx0XHRcdFx0XHR7IGtleTogXCJhdXRoMENsaWVudElkXCIsIHZhbHVlOiBhdXRoMEVudi5hdXRoMENsaWVudElkID8/IFwiXCIsIGVuYWJsZWQ6IHRydWUgfSxcblx0XHRcdFx0XHRdXG5cdFx0XHRcdDogW10pLFxuXHRcdF07XG5cdFx0Y29uc3QgZW52UmVzID0gYXdhaXQgZmV0Y2goXG5cdFx0XHRgaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vZW52aXJvbm1lbnRzP3dvcmtzcGFjZT0ke29wdGlvbnMud29ya3NwYWNlSWR9YCxcblx0XHRcdHtcblx0XHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdFx0aGVhZGVycyxcblx0XHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoe1xuXHRcdFx0XHRcdGVudmlyb25tZW50OiB7IG5hbWU6IGAke3Byb2plY3ROYW1lfSDigJQgTG9jYWxgLCB2YWx1ZXM6IGVudlZhcnMgfSxcblx0XHRcdFx0fSksXG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0aWYgKGVudlJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBQb3N0bWFuIGVudmlyb25tZW50IHVwbG9hZGVkXCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiICDinJcgRmFpbGVkIHRvIHVwbG9hZCBQb3N0bWFuIGVudmlyb25tZW50XCIpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgY29uc3QgUG9zdG1hbkZlYXR1cmU6IEZlYXR1cmU8UG9zdG1hbk9wdGlvbnM+ID0geyBnZXRPcHRpb25zLCBzY2FmZm9sZCB9O1xuIl0sIm5hbWVzIjpbIlBvc3RtYW5GZWF0dXJlIiwiZ2V0T3B0aW9ucyIsIl93b3Jrc3BhY2UiLCJjbGlPcHRpb25zIiwicG9zdG1hblByb3ZpZGVyIiwiY2hvaWNlcyIsImxhYmVsIiwiZGVzY3JpcHRpb24iLCJzZWxlY3RlZCIsInBpY2siLCJjIiwicHJvdmlkZXIiLCJhcGlLZXkiLCJwcm9jZXNzIiwiZW52IiwiUE9TVE1BTl9BUElfS0VZIiwidGhlbiIsIm0iLCJhc2siLCJoZWFkZXJzIiwid3NSZXMiLCJmZXRjaCIsIm9rIiwiY29uc29sZSIsImVycm9yIiwid29ya3NwYWNlcyIsImpzb24iLCJ3c0Nob2ljZXMiLCJpZCIsIm1hcCIsInciLCJuYW1lIiwidHlwZSIsIndzUGlja2VkIiwid29ya3NwYWNlSWQiLCJ3c05hbWUiLCJjcmVhdGVSZXMiLCJtZXRob2QiLCJib2R5IiwiSlNPTiIsInN0cmluZ2lmeSIsIndvcmtzcGFjZSIsIndzIiwibG9nIiwiYnVpbGRDb2xsZWN0aW9uIiwicHJvamVjdE5hbWUiLCJhdXRoIiwiYXV0aE9iaiIsImF1dGgwRG9tYWluIiwib2F1dGgyIiwia2V5IiwidmFsdWUiLCJ1bmRlZmluZWQiLCJpbmZvIiwic2NoZW1hIiwiaXRlbSIsInJlcXVlc3QiLCJ1cmwiLCJyYXciLCJob3N0IiwicGF0aCIsImJ1aWxkRW52aXJvbm1lbnRZYW1sIiwiYXV0aDBTZWN0aW9uIiwiYXV0aDBBdWRpZW5jZSIsImF1dGgwQ2xpZW50SWQiLCJqb2luIiwic2NhZmZvbGQiLCJvcHRpb25zIiwiYXV0aENvbmZpZ01vZGVsIiwiZ2V0TW9kZWwiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiQVVUSF9DT05GSUciLCJhdXRoQ2ZnIiwiY29uZmlnIiwic3BhQ2xpZW50SWQiLCJpc3N1ZXJCYXNlVXJsIiwiYXBwIiwiYXV0aDBDbGkiLCJjcmVhdGVTcGFBcHAiLCJjbGllbnRfaWQiLCJhdXRoMEVudiIsInJlcGxhY2UiLCJhdWRpZW5jZSIsImNvbGxlY3Rpb24iLCJlbnZZYW1sIiwiYWRkRmlsZSIsImZpbGVzIiwiZmlsZVBhdGgiLCJjb250ZW50IiwiY29sUmVzIiwiZW52VmFycyIsImVuYWJsZWQiLCJlbnZSZXMiLCJlbnZpcm9ubWVudCIsInZhbHVlcyJdLCJtYXBwaW5ncyI6Ijs7OzsrQkEyT2FBOzs7ZUFBQUE7Ozt3QkEzT1E7dUJBQ1k7a0VBSVA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVExQixlQUFlQyxXQUNkQyxVQUE2QixFQUM3QkMsVUFBbUM7SUFFbkMsSUFBSUEsV0FBV0MsZUFBZSxJQUFJLE1BQU0sT0FBTyxDQUFDO0lBRWhELE1BQU1DLFVBQVU7UUFDZjtZQUFFQyxPQUFPO1lBQWlCQyxhQUFhO1FBQU87UUFDOUM7WUFBRUQsT0FBTztZQUFrQkMsYUFBYTtRQUF1QztRQUMvRTtZQUFFRCxPQUFPO1lBQWdCQyxhQUFhO1FBQXdDO0tBQzlFO0lBQ0QsTUFBTUMsV0FBVyxNQUFNQyxJQUFBQSxZQUFJLEVBQzFCLGlCQUNBSixTQUNBLENBQUNLLElBQU0sR0FBR0EsRUFBRUosS0FBSyxDQUFDLEdBQUcsRUFBRUksRUFBRUgsV0FBVyxF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
598
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL3Bvc3RtYW4uZmVhdHVyZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBwaWNrIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9wcm9tcHQuanNcIjtcbmltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZVNjYWZmb2xkIH0gZnJvbSBcIi4uLy4uL21vZGVscy9wcm9qZWN0Lm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmUgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc2NhZmZvbGQuc2VydmljZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoQ29uZmlnTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxzL2F1dGgtY29uZmlnLm1vZGVsLmpzXCI7XG5pbXBvcnQgKiBhcyBhdXRoMENsaSBmcm9tIFwiLi9hdXRoMC1jbGkuanNcIjtcblxuLyoqIFBvc3RtYW4gT0F1dGggY2FsbGJhY2sgVVJMcyAocG9wdXAgKyBcIkF1dGhvcml6ZSB1c2luZyBicm93c2VyXCIpLiAqL1xuY29uc3QgUE9TVE1BTl9DQUxMQkFDS1MgPSBbXG5cdFwiaHR0cHM6Ly9vYXV0aC5wc3Rtbi5pby92MS9jYWxsYmFja1wiLFxuXHRcImh0dHBzOi8vb2F1dGgucHN0bW4uaW8vdjEvYnJvd3Nlci1jYWxsYmFja1wiLFxuXSBhcyBjb25zdDtcblxuLyoqIFNjb3BlcyByZXF1ZXN0ZWQgZm9yIEF1dGgwIGFjY2VzcyB0b2tlbnMgKE9JREMgKyBIZWxsbyBDQVNMIHBlcm1pc3Npb25zKS4gKi9cbmNvbnN0IFBPU1RNQU5fU0NPUEVTID0gW1xuXHRcIm9wZW5pZFwiLFxuXHRcInByb2ZpbGVcIixcblx0XCJlbWFpbFwiLFxuXHRcInJlYWQ6SGVsbG9cIixcblx0XCJjcmVhdGU6SGVsbG9cIixcblx0XCJ1cGRhdGU6SGVsbG9cIixcblx0XCJkZWxldGU6SGVsbG9cIixcbl0uam9pbihcIiBcIik7XG5cbmV4cG9ydCB0eXBlIFBvc3RtYW5PcHRpb25zID0ge1xuXHRwb3N0bWFuUHJvdmlkZXI/OiBcImFwaVwiIHwgXCJsb2NhbFwiIHwgXCJub25lXCI7XG5cdGFwaUtleT86IHN0cmluZztcblx0d29ya3NwYWNlSWQ/OiBzdHJpbmc7XG59O1xuXG5hc3luYyBmdW5jdGlvbiBnZXRPcHRpb25zKFxuXHRfd29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCxcblx0Y2xpT3B0aW9uczogUGFydGlhbDxQb3N0bWFuT3B0aW9ucz4sXG4pOiBQcm9taXNlPFBhcnRpYWw8UG9zdG1hbk9wdGlvbnM+PiB7XG5cdGlmIChjbGlPcHRpb25zLnBvc3RtYW5Qcm92aWRlciAhPSBudWxsKSByZXR1cm4ge307XG5cblx0Y29uc3QgY2hvaWNlcyA9IFtcblx0XHR7IGxhYmVsOiBcIm5vbmVcIiBhcyBjb25zdCwgZGVzY3JpcHRpb246IFwic2tpcFwiIH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IFwibG9jYWxcIiBhcyBjb25zdCxcblx0XHRcdGRlc2NyaXB0aW9uOiBcIkxvY2FsIFZpZXcgLyBOYXRpdmUgR2l0IGZpbGVzIChubyBBUEkga2V5KVwiLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0bGFiZWw6IFwiYXBpXCIgYXMgY29uc3QsXG5cdFx0XHRkZXNjcmlwdGlvbjogXCJhbHNvIHVwbG9hZCB0byBQb3N0bWFuLmNvbSAobmVlZHMgQVBJIGtleSlcIixcblx0XHR9LFxuXHRdO1xuXHRjb25zdCBzZWxlY3RlZCA9IGF3YWl0IHBpY2soXG5cdFx0XCJcXG4gIFBvc3RtYW46IFwiLFxuXHRcdGNob2ljZXMsXG5cdFx0KGMpID0+IGAke2MubGFiZWx9IOKAlCAke2MuZGVzY3JpcHRpb259YCxcblx0KTtcblx0Y29uc3QgcHJvdmlkZXIgPSBzZWxlY3RlZD8ubGFiZWwgPz8gXCJub25lXCI7XG5cblx0aWYgKHByb3ZpZGVyID09PSBcIm5vbmVcIikgcmV0dXJuIHsgcG9zdG1hblByb3ZpZGVyOiBcIm5vbmVcIiB9O1xuXHRpZiAocHJvdmlkZXIgPT09IFwibG9jYWxcIikgcmV0dXJuIHsgcG9zdG1hblByb3ZpZGVyOiBcImxvY2FsXCIgfTtcblxuXHRjb25zdCBhcGlLZXkgPVxuXHRcdHByb2Nlc3MuZW52LlBPU1RNQU5fQVBJX0tFWSA/P1xuXHRcdChhd2FpdCBpbXBvcnQoXCIuLi8uLi9kb21haW4vcHJvbXB0LmpzXCIpLnRoZW4oKG0pID0+XG5cdFx0XHRtLmFzayhcIlxcbiAgUG9zdG1hbiBBUEkga2V5IChhcHAuZ2V0cG9zdG1hbi5jb20vc2V0dGluZ3MvbWUvYXBpLWtleXMpOiBcIiksXG5cdFx0KSk7XG5cblx0Y29uc3QgaGVhZGVycyA9IHsgXCJYLUFwaS1LZXlcIjogYXBpS2V5LCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9O1xuXHRjb25zdCB3c1JlcyA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vd29ya3NwYWNlc1wiLCB7IGhlYWRlcnMgfSk7XG5cblx0aWYgKCF3c1Jlcy5vaykge1xuXHRcdGNvbnNvbGUuZXJyb3IoXCJcXG4gIFBvc3RtYW4gQVBJIGtleSBpbnZhbGlkIOKAlCBmYWxsaW5nIGJhY2sgdG8gbG9jYWwgZmlsZXMuXCIpO1xuXHRcdHJldHVybiB7IHBvc3RtYW5Qcm92aWRlcjogXCJsb2NhbFwiIH07XG5cdH1cblxuXHRjb25zdCB7IHdvcmtzcGFjZXMgfSA9IChhd2FpdCB3c1Jlcy5qc29uKCkpIGFzIHtcblx0XHR3b3Jrc3BhY2VzOiBBcnJheTx7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0+O1xuXHR9O1xuXG5cdHR5cGUgV3NDaG9pY2UgPSB7IGxhYmVsOiBzdHJpbmc7IGlkOiBzdHJpbmcgfCBudWxsIH07XG5cdGNvbnN0IHdzQ2hvaWNlczogV3NDaG9pY2VbXSA9IFtcblx0XHR7IGxhYmVsOiBcIjxuZXcgd29ya3NwYWNlPlwiLCBpZDogbnVsbCB9LFxuXHRcdC4uLndvcmtzcGFjZXMubWFwKCh3KSA9PiAoeyBsYWJlbDogYCR7dy5uYW1lfSAoJHt3LnR5cGV9KWAsIGlkOiB3LmlkIH0pKSxcblx0XTtcblxuXHRjb25zdCB3c1BpY2tlZCA9IGF3YWl0IHBpY2soXCJcXG4gIFBvc3RtYW4gd29ya3NwYWNlOiBcIiwgd3NDaG9pY2VzLCAoYykgPT4gYy5sYWJlbCk7XG5cblx0bGV0IHdvcmtzcGFjZUlkOiBzdHJpbmc7XG5cdGlmICghd3NQaWNrZWQgfHwgd3NQaWNrZWQuaWQgPT09IG51bGwpIHtcblx0XHRjb25zdCB7IGFzayB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiKTtcblx0XHRjb25zdCB3c05hbWUgPSBhd2FpdCBhc2soYCAgV29ya3NwYWNlIG5hbWU6IGApO1xuXHRcdGNvbnN0IGNyZWF0ZVJlcyA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vd29ya3NwYWNlc1wiLCB7XG5cdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0aGVhZGVycyxcblx0XHRcdGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgd29ya3NwYWNlOiB7IG5hbWU6IHdzTmFtZSwgdHlwZTogXCJwZXJzb25hbFwiIH0gfSksXG5cdFx0fSk7XG5cdFx0Y29uc3QgeyB3b3Jrc3BhY2U6IHdzIH0gPSAoYXdhaXQgY3JlYXRlUmVzLmpzb24oKSkgYXMgeyB3b3Jrc3BhY2U6IHsgaWQ6IHN0cmluZyB9IH07XG5cdFx0d29ya3NwYWNlSWQgPSB3cy5pZDtcblx0XHRjb25zb2xlLmxvZyhgICDinJMgV29ya3NwYWNlIGNyZWF0ZWQ6ICR7d3NOYW1lfWApO1xuXHR9IGVsc2Uge1xuXHRcdHdvcmtzcGFjZUlkID0gd3NQaWNrZWQuaWQ7XG5cdH1cblxuXHRyZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwiYXBpXCIsIGFwaUtleSwgd29ya3NwYWNlSWQgfTtcbn1cblxudHlwZSBBdXRoMEVudiA9IHtcblx0YXV0aDBEb21haW4/OiBzdHJpbmc7XG5cdGF1dGgwQXVkaWVuY2U/OiBzdHJpbmc7XG5cdGF1dGgwQ2xpZW50SWQ/OiBzdHJpbmc7XG59O1xuXG4vKiogdjIuMSBKU09OIOKAlCB1c2VkIGZvciBQb3N0bWFuLmNvbSBBUEkgdXBsb2FkIG9ubHkuICovXG5mdW5jdGlvbiBidWlsZENvbGxlY3Rpb25Kc29uKHByb2plY3ROYW1lOiBzdHJpbmcsIGF1dGg/OiBBdXRoMEVudik6IHVua25vd24ge1xuXHRjb25zdCBhdXRoT2JqID0gYXV0aD8uYXV0aDBEb21haW5cblx0XHQ/IHtcblx0XHRcdFx0dHlwZTogXCJvYXV0aDJcIixcblx0XHRcdFx0b2F1dGgyOiBbXG5cdFx0XHRcdFx0eyBrZXk6IFwiZ3JhbnRfdHlwZVwiLCB2YWx1ZTogXCJhdXRob3JpemF0aW9uX2NvZGVfd2l0aF9wa2NlXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRrZXk6IFwiYXV0aFVybFwiLFxuXHRcdFx0XHRcdFx0dmFsdWU6IFwiaHR0cHM6Ly97e2F1dGgwRG9tYWlufX0vYXV0aG9yaXplP2F1ZGllbmNlPXt7YXV0aDBBdWRpZW5jZX19XCIsXG5cdFx0XHRcdFx0XHR0eXBlOiBcInN0cmluZ1wiLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0a2V5OiBcImFjY2Vzc1Rva2VuVXJsXCIsXG5cdFx0XHRcdFx0XHR2YWx1ZTogXCJodHRwczovL3t7YXV0aDBEb21haW59fS9vYXV0aC90b2tlblwiLFxuXHRcdFx0XHRcdFx0dHlwZTogXCJzdHJpbmdcIixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHsga2V5OiBcImNsaWVudElkXCIsIHZhbHVlOiBcInt7YXV0aDBDbGllbnRJZH19XCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0XHR7IGtleTogXCJzY29wZVwiLCB2YWx1ZTogUE9TVE1BTl9TQ09QRVMsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0XHR7IGtleTogXCJyZWRpcmVjdF91cmlcIiwgdmFsdWU6IFBPU1RNQU5fQ0FMTEJBQ0tTWzBdLCB0eXBlOiBcInN0cmluZ1wiIH0sXG5cdFx0XHRcdFx0eyBrZXk6IFwidXNlQnJvd3NlclwiLCB2YWx1ZTogXCJ0cnVlXCIsIHR5cGU6IFwiYm9vbGVhblwiIH0sXG5cdFx0XHRcdFx0eyBrZXk6IFwiYWRkVG9rZW5Ub1wiLCB2YWx1ZTogXCJoZWFkZXJcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRcdHsga2V5OiBcImNoYWxsZW5nZUFsZ29yaXRobVwiLCB2YWx1ZTogXCJTMjU2XCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0XHR7IGtleTogXCJjbGllbnRfYXV0aGVudGljYXRpb25cIiwgdmFsdWU6IFwiYm9keVwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG5cdFx0XHRcdFx0eyBrZXk6IFwiY2xpZW50U2VjcmV0XCIsIHZhbHVlOiBcIlwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG5cdFx0XHRcdFx0eyBrZXk6IFwidG9rZW5OYW1lXCIsIHZhbHVlOiBgJHtwcm9qZWN0TmFtZX0gQWNjZXNzIFRva2VuYCwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fVxuXHRcdDogdW5kZWZpbmVkO1xuXG5cdGNvbnN0IGhlbGxvVXJsID0gKHBhdGg6IHN0cmluZywgcmF3OiBzdHJpbmcpID0+ICh7XG5cdFx0cmF3OiBge3tiYXNlVXJsfX0ke3Jhd31gLFxuXHRcdGhvc3Q6IFtcInt7YmFzZVVybH19XCJdLFxuXHRcdHBhdGg6IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKSxcblx0fSk7XG5cblx0cmV0dXJuIHtcblx0XHRpbmZvOiB7XG5cdFx0XHRfcG9zdG1hbl9pZDogcmFuZG9tVVVJRCgpLFxuXHRcdFx0bmFtZTogYCR7cHJvamVjdE5hbWV9IFdlYkFQSWAsXG5cdFx0XHRzY2hlbWE6IFwiaHR0cHM6Ly9zY2hlbWEuZ2V0cG9zdG1hbi5jb20vanNvbi9jb2xsZWN0aW9uL3YyLjEuMC9jb2xsZWN0aW9uLmpzb25cIixcblx0XHRcdGRlc2NyaXB0aW9uOlxuXHRcdFx0XHRcIk9wZW4gdGhlIHByb2plY3Qgcm9vdCBpbiBQb3N0bWFuIExvY2FsIFZpZXcgKG5vdCB0aGUgcG9zdG1hbi8gZm9sZGVyKS4gXCIgK1xuXHRcdFx0XHRcIlNlbGVjdCB0aGUgTG9jYWwgZW52aXJvbm1lbnQsIHRoZW4gQXV0aG9yaXphdGlvbiDihpIgR2V0IE5ldyBBY2Nlc3MgVG9rZW4gKFBLQ0UpLlwiLFxuXHRcdH0sXG5cdFx0Li4uKGF1dGhPYmogPyB7IGF1dGg6IGF1dGhPYmogfSA6IHt9KSxcblx0XHRpdGVtOiBbXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiSGVsbG9cIixcblx0XHRcdFx0aXRlbTogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwiTGlzdCAoYW5vbnltb3VzKVwiLFxuXHRcdFx0XHRcdFx0cmVxdWVzdDoge1xuXHRcdFx0XHRcdFx0XHRhdXRoOiB7IHR5cGU6IFwibm9hdXRoXCIgfSxcblx0XHRcdFx0XHRcdFx0bWV0aG9kOiBcIkdFVFwiLFxuXHRcdFx0XHRcdFx0XHR1cmw6IGhlbGxvVXJsKFwiaGVsbG9cIiwgXCIvaGVsbG9cIiksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogXCJHZXQgYnkgaWRcIixcblx0XHRcdFx0XHRcdHJlcXVlc3Q6IHtcblx0XHRcdFx0XHRcdFx0bWV0aG9kOiBcIkdFVFwiLFxuXHRcdFx0XHRcdFx0XHR1cmw6IGhlbGxvVXJsKFwiaGVsbG8vOmlkXCIsIFwiL2hlbGxvLzppZFwiKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIkNyZWF0ZVwiLFxuXHRcdFx0XHRcdFx0cmVxdWVzdDoge1xuXHRcdFx0XHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRcdFx0XHRoZWFkZXI6IFt7IGtleTogXCJDb250ZW50LVR5cGVcIiwgdmFsdWU6IFwiYXBwbGljYXRpb24vanNvblwiIH1dLFxuXHRcdFx0XHRcdFx0XHRib2R5OiB7XG5cdFx0XHRcdFx0XHRcdFx0bW9kZTogXCJyYXdcIixcblx0XHRcdFx0XHRcdFx0XHRyYXc6ICd7XFxuICBcIm1lc3NhZ2VcIjogXCJoZWxsb1wiXFxufVxcbicsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHVybDogaGVsbG9VcmwoXCJoZWxsb1wiLCBcIi9oZWxsb1wiKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIlVwZGF0ZVwiLFxuXHRcdFx0XHRcdFx0cmVxdWVzdDoge1xuXHRcdFx0XHRcdFx0XHRtZXRob2Q6IFwiUFVUXCIsXG5cdFx0XHRcdFx0XHRcdGhlYWRlcjogW3sga2V5OiBcIkNvbnRlbnQtVHlwZVwiLCB2YWx1ZTogXCJhcHBsaWNhdGlvbi9qc29uXCIgfV0sXG5cdFx0XHRcdFx0XHRcdGJvZHk6IHtcblx0XHRcdFx0XHRcdFx0XHRtb2RlOiBcInJhd1wiLFxuXHRcdFx0XHRcdFx0XHRcdHJhdzogJ3tcXG4gIFwibWVzc2FnZVwiOiBcInVwZGF0ZWRcIlxcbn1cXG4nLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR1cmw6IGhlbGxvVXJsKFwiaGVsbG8vOmlkXCIsIFwiL2hlbGxvLzppZFwiKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIkRlbGV0ZVwiLFxuXHRcdFx0XHRcdFx0cmVxdWVzdDoge1xuXHRcdFx0XHRcdFx0XHRtZXRob2Q6IFwiREVMRVRFXCIsXG5cdFx0XHRcdFx0XHRcdHVybDogaGVsbG9VcmwoXCJoZWxsby86aWRcIiwgXCIvaGVsbG8vOmlkXCIpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRdLFxuXHRcdFx0fSxcblx0XHRdLFxuXHR9O1xufVxuXG5mdW5jdGlvbiB5YW1sUXVvdGUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG5cdGlmICgvWzoje31bXFxdLCYqP3w8Pj0hJUBgXS8udGVzdCh2YWx1ZSkgfHwgdmFsdWUuaW5jbHVkZXMoXCJcXG5cIikgfHwgdmFsdWUgPT09IFwiXCIpIHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuXHR9XG5cdHJldHVybiB2YWx1ZTtcbn1cblxuLyoqIExvY2FsIFZpZXcgLyBOYXRpdmUgR2l0IGVudmlyb25tZW50IChZQU1MKS4gKi9cbmZ1bmN0aW9uIGJ1aWxkRW52aXJvbm1lbnRZYW1sKG5hbWU6IHN0cmluZywgYXV0aD86IEF1dGgwRW52KTogc3RyaW5nIHtcblx0Y29uc3QgdmFsdWVzOiBBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+ID0gW1xuXHRcdHsga2V5OiBcImJhc2VVcmxcIiwgdmFsdWU6IFwiaHR0cDovL2xvY2FsaG9zdDozMDAwXCIgfSxcblx0XTtcblx0aWYgKGF1dGg/LmF1dGgwRG9tYWluKSB7XG5cdFx0dmFsdWVzLnB1c2goXG5cdFx0XHR7IGtleTogXCJhdXRoMERvbWFpblwiLCB2YWx1ZTogYXV0aC5hdXRoMERvbWFpbiB9LFxuXHRcdFx0eyBrZXk6IFwiYXV0aDBBdWRpZW5jZVwiLCB2YWx1ZTogYXV0aC5hdXRoMEF1ZGllbmNlID8/IFwiXCIgfSxcblx0XHRcdHsga2V5OiBcImF1dGgwQ2xpZW50SWRcIiwgdmFsdWU6IGF1dGguYXV0aDBDbGllbnRJZCA/PyBcIlwiIH0sXG5cdFx0XHR7XG5cdFx0XHRcdGtleTogXCJhdXRoVXJsXCIsXG5cdFx0XHRcdHZhbHVlOiBgaHR0cHM6Ly8ke2F1dGguYXV0aDBEb21haW59L2F1dGhvcml6ZT9hdWRpZW5jZT0ke2F1dGguYXV0aDBBdWRpZW5jZSA/PyBcIlwifWAsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRrZXk6IFwiYWNjZXNzVG9rZW5VcmxcIixcblx0XHRcdFx0dmFsdWU6IGBodHRwczovLyR7YXV0aC5hdXRoMERvbWFpbn0vb2F1dGgvdG9rZW5gLFxuXHRcdFx0fSxcblx0XHRcdHsga2V5OiBcImNhbGxiYWNrVXJsXCIsIHZhbHVlOiBQT1NUTUFOX0NBTExCQUNLU1swXSB9LFxuXHRcdFx0eyBrZXk6IFwic2NvcGVcIiwgdmFsdWU6IFBPU1RNQU5fU0NPUEVTIH0sXG5cdFx0KTtcblx0fVxuXG5cdGNvbnN0IGxpbmVzID0gW2BuYW1lOiAke3lhbWxRdW90ZShuYW1lKX1gLCBcInZhbHVlczpcIl07XG5cdGZvciAoY29uc3QgdiBvZiB2YWx1ZXMpIHtcblx0XHRsaW5lcy5wdXNoKGAgIC0ga2V5OiAke3Yua2V5fWApO1xuXHRcdGxpbmVzLnB1c2goYCAgICB2YWx1ZTogJHt5YW1sUXVvdGUodi52YWx1ZSl9YCk7XG5cdFx0bGluZXMucHVzaChcIiAgICBlbmFibGVkOiB0cnVlXCIpO1xuXHR9XG5cdHJldHVybiBgJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbmA7XG59XG5cbi8qKiBMb2NhbCBWaWV3IC8gTmF0aXZlIEdpdCBjb2xsZWN0aW9uICh2MyBtdWx0aS1maWxlIFlBTUwpLiAqL1xuZnVuY3Rpb24gYnVpbGRMb2NhbFZpZXdGaWxlcyhcblx0cHJvamVjdE5hbWU6IHN0cmluZyxcblx0YXV0aD86IEF1dGgwRW52LFxuKTogQXJyYXk8eyBmaWxlUGF0aDogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfT4ge1xuXHRjb25zdCBjb2xsZWN0aW9uRGlyID0gYHBvc3RtYW4vY29sbGVjdGlvbnMvJHtwcm9qZWN0TmFtZX0gV2ViQVBJYDtcblx0Y29uc3QgZmlsZXM6IEFycmF5PHsgZmlsZVBhdGg6IHN0cmluZzsgY29udGVudDogc3RyaW5nIH0+ID0gW107XG5cblx0Ly8gUG9zdG1hbiBMb2NhbCBWaWV3IHN0b3JlcyBPQXV0aCB1bmRlciBhdXRoW10uY3JlZGVudGlhbHMgKG5vdCB0aGUgdjIuMSBvYXV0aDIgYXJyYXkpLlxuXHQvLyBVc2UgY29uY3JldGUgaHR0cHMgVVJMcyDigJQgZW1wdHkgQXV0aCBVUkwgeWllbGRzIFwiSW52YWxpZCBwcm90b2NvbCBmb3IgYXV0aCBVUkxcIi5cblx0Y29uc3QgYXV0aEJsb2NrID0gYXV0aD8uYXV0aDBEb21haW5cblx0XHQ/IFtcblx0XHRcdFx0XCJhdXRoOlwiLFxuXHRcdFx0XHRgICAtIGlkOiAke3JhbmRvbVVVSUQoKX1gLFxuXHRcdFx0XHRcIiAgICB0eXBlOiBvYXV0aDJcIixcblx0XHRcdFx0XCIgICAgbmFtZTogT0F1dGggMi4wXCIsXG5cdFx0XHRcdFwiICAgIGNyZWRlbnRpYWxzOlwiLFxuXHRcdFx0XHRcIiAgICAgIGFkZFRva2VuVG86IGhlYWRlclwiLFxuXHRcdFx0XHRcIiAgICAgIGdyYW50X3R5cGU6IGF1dGhvcml6YXRpb25fY29kZV93aXRoX3BrY2VcIixcblx0XHRcdFx0YCAgICAgIGF1dGhVcmw6IGh0dHBzOi8vJHthdXRoLmF1dGgwRG9tYWlufS9hdXRob3JpemU/YXVkaWVuY2U9JHthdXRoLmF1dGgwQXVkaWVuY2UgPz8gXCJcIn1gLFxuXHRcdFx0XHRgICAgICAgYWNjZXNzVG9rZW5Vcmw6IGh0dHBzOi8vJHthdXRoLmF1dGgwRG9tYWlufS9vYXV0aC90b2tlbmAsXG5cdFx0XHRcdGAgICAgICBjbGllbnRJZDogJHt5YW1sUXVvdGUoYXV0aC5hdXRoMENsaWVudElkID8/IFwiXCIpfWAsXG5cdFx0XHRcdGAgICAgICBzY29wZTogJHt5YW1sUXVvdGUoUE9TVE1BTl9TQ09QRVMpfWAsXG5cdFx0XHRcdGAgICAgICByZWRpcmVjdF91cmk6ICR7UE9TVE1BTl9DQUxMQkFDS1NbMF19YCxcblx0XHRcdFx0XCIgICAgICB1c2VCcm93c2VyOiB0cnVlXCIsXG5cdFx0XHRcdFwiICAgICAgY2hhbGxlbmdlQWxnb3JpdGhtOiBTMjU2XCIsXG5cdFx0XHRcdC8vIFNQQSBwdWJsaWMgY2xpZW50OiBBdXRoMCB0b2tlbiBlbmRwb2ludCByZWplY3RzIEJhc2ljIGF1dGggKGZlYWNmdCBVbmF1dGhvcml6ZWQpLlxuXHRcdFx0XHRcIiAgICAgIGNsaWVudF9hdXRoZW50aWNhdGlvbjogYm9keVwiLFxuXHRcdFx0XHQnICAgICAgY2xpZW50U2VjcmV0OiBcIlwiJyxcblx0XHRcdFx0YCAgICAgIHRva2VuTmFtZTogJHt5YW1sUXVvdGUoYCR7cHJvamVjdE5hbWV9IEFjY2VzcyBUb2tlbmApfWAsXG5cdFx0XHRcdFwiXCIsXG5cdFx0XHRdLmpvaW4oXCJcXG5cIilcblx0XHQ6IFwiXCI7XG5cblx0ZmlsZXMucHVzaCh7XG5cdFx0ZmlsZVBhdGg6IGAke2NvbGxlY3Rpb25EaXJ9Ly5yZXNvdXJjZXMvZGVmaW5pdGlvbi55YW1sYCxcblx0XHRjb250ZW50OiBbXG5cdFx0XHRcIiRraW5kOiBjb2xsZWN0aW9uXCIsXG5cdFx0XHRgbmFtZTogJHt5YW1sUXVvdGUoYCR7cHJvamVjdE5hbWV9IFdlYkFQSWApfWAsXG5cdFx0XHRcInNjaGVtYVZlcnNpb246ICczLjAnXCIsXG5cdFx0XHRcImRlc2NyaXB0aW9uOiA+LVwiLFxuXHRcdFx0XCIgIE9wZW4gdGhpcyBwcm9qZWN0IHJvb3QgaW4gUG9zdG1hbiBMb2NhbCBWaWV3IChGaWxlcyDihpIgT3BlbiBmb2xkZXIpLlwiLFxuXHRcdFx0XCIgIFNlbGVjdCB0aGUgTG9jYWwgZW52aXJvbm1lbnQsIHRoZW4gQXV0aG9yaXphdGlvbiDihpIgR2V0IE5ldyBBY2Nlc3MgVG9rZW4gKFBLQ0UpLlwiLFxuXHRcdFx0YXV0aEJsb2NrLFxuXHRcdF1cblx0XHRcdC5maWx0ZXIoKGwpID0+IGwgIT09IHVuZGVmaW5lZClcblx0XHRcdC5qb2luKFwiXFxuXCIpXG5cdFx0XHQucmVwbGFjZSgvXFxuKyQvLCBcIlxcblwiKSxcblx0fSk7XG5cblx0ZmlsZXMucHVzaCh7XG5cdFx0ZmlsZVBhdGg6IGAke2NvbGxlY3Rpb25EaXJ9L0hlbGxvLy5yZXNvdXJjZXMvZGVmaW5pdGlvbi55YW1sYCxcblx0XHRjb250ZW50OiBbXCIka2luZDogZm9sZGVyXCIsIFwibmFtZTogSGVsbG9cIiwgXCJvcmRlcjogMTAwMFwiLCBcIlwiXS5qb2luKFwiXFxuXCIpLFxuXHR9KTtcblxuXHRjb25zdCByZXF1ZXN0czogQXJyYXk8e1xuXHRcdGZpbGU6IHN0cmluZztcblx0XHR5YW1sOiBzdHJpbmc7XG5cdH0+ID0gW1xuXHRcdHtcblx0XHRcdGZpbGU6IFwiTGlzdCAoYW5vbnltb3VzKS5yZXF1ZXN0LnlhbWxcIixcblx0XHRcdHlhbWw6IFtcblx0XHRcdFx0XCIka2luZDogaHR0cC1yZXF1ZXN0XCIsXG5cdFx0XHRcdFwibmFtZTogTGlzdCAoYW5vbnltb3VzKVwiLFxuXHRcdFx0XHRcIm1ldGhvZDogR0VUXCIsXG5cdFx0XHRcdCd1cmw6IFwie3tiYXNlVXJsfX0vaGVsbG9cIicsXG5cdFx0XHRcdFwiYXV0aDpcIixcblx0XHRcdFx0XCIgIHR5cGU6IG5vYXV0aFwiLFxuXHRcdFx0XHRcIm9yZGVyOiAxMDAwXCIsXG5cdFx0XHRcdFwiXCIsXG5cdFx0XHRdLmpvaW4oXCJcXG5cIiksXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRmaWxlOiBcIkdldCBieSBpZC5yZXF1ZXN0LnlhbWxcIixcblx0XHRcdHlhbWw6IFtcblx0XHRcdFx0XCIka2luZDogaHR0cC1yZXF1ZXN0XCIsXG5cdFx0XHRcdFwibmFtZTogR2V0IGJ5IGlkXCIsXG5cdFx0XHRcdFwibWV0aG9kOiBHRVRcIixcblx0XHRcdFx0J3VybDogXCJ7e2Jhc2VVcmx9fS9oZWxsby86aWRcIicsXG5cdFx0XHRcdFwib3JkZXI6IDIwMDBcIixcblx0XHRcdFx0XCJcIixcblx0XHRcdF0uam9pbihcIlxcblwiKSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGZpbGU6IFwiQ3JlYXRlLnJlcXVlc3QueWFtbFwiLFxuXHRcdFx0eWFtbDogW1xuXHRcdFx0XHRcIiRraW5kOiBodHRwLXJlcXVlc3RcIixcblx0XHRcdFx0XCJuYW1lOiBDcmVhdGVcIixcblx0XHRcdFx0XCJtZXRob2Q6IFBPU1RcIixcblx0XHRcdFx0J3VybDogXCJ7e2Jhc2VVcmx9fS9oZWxsb1wiJyxcblx0XHRcdFx0XCJoZWFkZXJzOlwiLFxuXHRcdFx0XHRcIiAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXCIsXG5cdFx0XHRcdFwiYm9keTpcIixcblx0XHRcdFx0XCIgIHR5cGU6IGpzb25cIixcblx0XHRcdFx0XCIgIGNvbnRlbnQ6IHwtXCIsXG5cdFx0XHRcdFwiICAgIHtcIixcblx0XHRcdFx0JyAgICAgIFwibWVzc2FnZVwiOiBcImhlbGxvXCInLFxuXHRcdFx0XHRcIiAgICB9XCIsXG5cdFx0XHRcdFwib3JkZXI6IDMwMDBcIixcblx0XHRcdFx0XCJcIixcblx0XHRcdF0uam9pbihcIlxcblwiKSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGZpbGU6IFwiVXBkYXRlLnJlcXVlc3QueWFtbFwiLFxuXHRcdFx0eWFtbDogW1xuXHRcdFx0XHRcIiRraW5kOiBodHRwLXJlcXVlc3RcIixcblx0XHRcdFx0XCJuYW1lOiBVcGRhdGVcIixcblx0XHRcdFx0XCJtZXRob2Q6IFBVVFwiLFxuXHRcdFx0XHQndXJsOiBcInt7YmFzZVVybH19L2hlbGxvLzppZFwiJyxcblx0XHRcdFx0XCJoZWFkZXJzOlwiLFxuXHRcdFx0XHRcIiAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uXCIsXG5cdFx0XHRcdFwiYm9keTpcIixcblx0XHRcdFx0XCIgIHR5cGU6IGpzb25cIixcblx0XHRcdFx0XCIgIGNvbnRlbnQ6IHwtXCIsXG5cdFx0XHRcdFwiICAgIHtcIixcblx0XHRcdFx0JyAgICAgIFwibWVzc2FnZVwiOiBcInVwZGF0ZWRcIicsXG5cdFx0XHRcdFwiICAgIH1cIixcblx0XHRcdFx0XCJvcmRlcjogNDAwMFwiLFxuXHRcdFx0XHRcIlwiLFxuXHRcdFx0XS5qb2luKFwiXFxuXCIpLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0ZmlsZTogXCJEZWxldGUucmVxdWVzdC55YW1sXCIsXG5cdFx0XHR5YW1sOiBbXG5cdFx0XHRcdFwiJGtpbmQ6IGh0dHAtcmVxdWVzdFwiLFxuXHRcdFx0XHRcIm5hbWU6IERlbGV0ZVwiLFxuXHRcdFx0XHRcIm1ldGhvZDogREVMRVRFXCIsXG5cdFx0XHRcdCd1cmw6IFwie3tiYXNlVXJsfX0vaGVsbG8vOmlkXCInLFxuXHRcdFx0XHRcIm9yZGVyOiA1MDAwXCIsXG5cdFx0XHRcdFwiXCIsXG5cdFx0XHRdLmpvaW4oXCJcXG5cIiksXG5cdFx0fSxcblx0XTtcblxuXHRmb3IgKGNvbnN0IHIgb2YgcmVxdWVzdHMpIHtcblx0XHRmaWxlcy5wdXNoKHtcblx0XHRcdGZpbGVQYXRoOiBgJHtjb2xsZWN0aW9uRGlyfS9IZWxsby8ke3IuZmlsZX1gLFxuXHRcdFx0Y29udGVudDogci55YW1sLFxuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIGZpbGVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZCh3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLCBvcHRpb25zOiBQb3N0bWFuT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuXHRpZiAob3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgPT09IFwibm9uZVwiIHx8IG9wdGlvbnMucG9zdG1hblByb3ZpZGVyID09IG51bGwpIHJldHVybjtcblxuXHRjb25zdCBhdXRoQ29uZmlnTW9kZWwgPSB3b3Jrc3BhY2UuZ2V0TW9kZWw8QXV0aENvbmZpZ01vZGVsPihXRUxMX0tOT1dOX0ZJTEVTLkFVVEhfQ09ORklHKTtcblx0Y29uc3QgYXV0aENmZyA9IGF1dGhDb25maWdNb2RlbD8uY29uZmlnO1xuXG5cdGxldCBzcGFDbGllbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5cdGlmIChhdXRoQ2ZnPy5pc3N1ZXJCYXNlVXJsKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGFwcCA9IGF1dGgwQ2xpLmNyZWF0ZVNwYUFwcChgJHt3b3Jrc3BhY2UubmFtZX0gUG9zdG1hbmAsIFsuLi5QT1NUTUFOX0NBTExCQUNLU10pO1xuXHRcdFx0c3BhQ2xpZW50SWQgPSBhcHAuY2xpZW50X2lkO1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBBdXRoMCBTUEEgYXBwIGNyZWF0ZWQgZm9yIFBvc3RtYW4gUEtDRVwiKTtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF1dGgwQ2xpLmVuYWJsZUNvbm5lY3Rpb25Gb3JDbGllbnQoYXV0aDBDbGkuREJfQ09OTkVDVElPTl9OQU1FLCBzcGFDbGllbnRJZCk7XG5cdFx0XHRcdGNvbnNvbGUubG9nKGAgIOKckyBFbmFibGVkICR7YXV0aDBDbGkuREJfQ09OTkVDVElPTl9OQU1FfSBvbiBQb3N0bWFuIFNQQWApO1xuXHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoXG5cdFx0XHRcdFx0YCAg4pyXIEZhaWxlZCB0byBlbmFibGUgREIgY29ubmVjdGlvbiBvbiBTUEE6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycn1gLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2gge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcblx0XHRcdFx0XCIgIOKclyBGYWlsZWQgdG8gY3JlYXRlIEF1dGgwIFNQQSBhcHAg4oCUIHNldCBhdXRoMENsaWVudElkIGluIHRoZSBlbnZpcm9ubWVudC5cIixcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0Y29uc3QgYXV0aDBFbnY6IEF1dGgwRW52IHwgdW5kZWZpbmVkID0gYXV0aENmZz8uaXNzdWVyQmFzZVVybFxuXHRcdD8ge1xuXHRcdFx0XHRhdXRoMERvbWFpbjogYXV0aENmZy5pc3N1ZXJCYXNlVXJsLnJlcGxhY2UoL15odHRwcz86XFwvXFwvLywgXCJcIiksXG5cdFx0XHRcdGF1dGgwQXVkaWVuY2U6IGF1dGhDZmcuYXVkaWVuY2UsXG5cdFx0XHRcdGF1dGgwQ2xpZW50SWQ6IHNwYUNsaWVudElkLFxuXHRcdFx0fVxuXHRcdDogdW5kZWZpbmVkO1xuXG5cdGNvbnN0IHByb2plY3ROYW1lID0gd29ya3NwYWNlLm5hbWU7XG5cdGNvbnN0IGVudk5hbWUgPSBgJHtwcm9qZWN0TmFtZX0gTG9jYWxgO1xuXHRjb25zdCBsb2NhbEZpbGVzID0gYnVpbGRMb2NhbFZpZXdGaWxlcyhwcm9qZWN0TmFtZSwgYXV0aDBFbnYpO1xuXHRjb25zdCBlbnZZYW1sID0gYnVpbGRFbnZpcm9ubWVudFlhbWwoZW52TmFtZSwgYXV0aDBFbnYpO1xuXG5cdHdvcmtzcGFjZS5hZGRGaWxlKHtcblx0XHRmaWxlczogKCkgPT4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCIucG9zdG1hbi9yZXNvdXJjZXMueWFtbFwiLFxuXHRcdFx0XHRjb250ZW50OiBbXG5cdFx0XHRcdFx0XCIjIE9wZW4gdGhpcyBwcm9qZWN0IHJvb3QgaW4gUG9zdG1hbiAoRmlsZXMg4oaSIE9wZW4gZm9sZGVyKSwgbm90IHRoZSBwb3N0bWFuLyBzdWJmb2xkZXIuXCIsXG5cdFx0XHRcdFx0XCIjIFBvc3RtYW4gZmlsbHMgd29ya3NwYWNlLmlkIHdoZW4geW91IGNvbm5lY3QgTG9jYWwgVmlldy5cIixcblx0XHRcdFx0XHRcIiNcIixcblx0XHRcdFx0XHRcIiMgQWxsIHJlc291cmNlcyB1bmRlciBwb3N0bWFuLyBhcmUgcmVnaXN0ZXJlZCBhdXRvbWF0aWNhbGx5LlwiLFxuXHRcdFx0XHRcdFwiXCIsXG5cdFx0XHRcdF0uam9pbihcIlxcblwiKSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBgcG9zdG1hbi9lbnZpcm9ubWVudHMvJHtwcm9qZWN0TmFtZX0tTG9jYWwuZW52aXJvbm1lbnQueWFtbGAsXG5cdFx0XHRcdGNvbnRlbnQ6IGVudllhbWwsXG5cdFx0XHR9LFxuXHRcdFx0Li4ubG9jYWxGaWxlcyxcblx0XHRdLFxuXHR9KTtcblxuXHRpZiAob3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgPT09IFwiYXBpXCIgJiYgb3B0aW9ucy5hcGlLZXkpIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uID0gYnVpbGRDb2xsZWN0aW9uSnNvbihwcm9qZWN0TmFtZSwgYXV0aDBFbnYpO1xuXHRcdGNvbnN0IGhlYWRlcnMgPSB7IFwiWC1BcGktS2V5XCI6IG9wdGlvbnMuYXBpS2V5LCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9O1xuXG5cdFx0Y29uc3QgY29sUmVzID0gYXdhaXQgZmV0Y2goXG5cdFx0XHRgaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vY29sbGVjdGlvbnM/d29ya3NwYWNlPSR7b3B0aW9ucy53b3Jrc3BhY2VJZH1gLFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRoZWFkZXJzLFxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvbGxlY3Rpb24gfSksXG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0aWYgKGNvbFJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBQb3N0bWFuIGNvbGxlY3Rpb24gdXBsb2FkZWRcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCIgIOKclyBGYWlsZWQgdG8gdXBsb2FkIFBvc3RtYW4gY29sbGVjdGlvblwiKTtcblx0XHR9XG5cblx0XHRjb25zdCBlbnZWYWx1ZXMgPSBbXG5cdFx0XHR7IGtleTogXCJiYXNlVXJsXCIsIHZhbHVlOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMFwiLCBlbmFibGVkOiB0cnVlIH0sXG5cdFx0XHQuLi4oYXV0aDBFbnY/LmF1dGgwRG9tYWluXG5cdFx0XHRcdD8gW1xuXHRcdFx0XHRcdFx0eyBrZXk6IFwiYXV0aDBEb21haW5cIiwgdmFsdWU6IGF1dGgwRW52LmF1dGgwRG9tYWluLCBlbmFibGVkOiB0cnVlIH0sXG5cdFx0XHRcdFx0XHR7IGtleTogXCJhdXRoMEF1ZGllbmNlXCIsIHZhbHVlOiBhdXRoMEVudi5hdXRoMEF1ZGllbmNlID8/IFwiXCIsIGVuYWJsZWQ6IHRydWUgfSxcblx0XHRcdFx0XHRcdHsga2V5OiBcImF1dGgwQ2xpZW50SWRcIiwgdmFsdWU6IGF1dGgwRW52LmF1dGgwQ2xpZW50SWQgPz8gXCJcIiwgZW5hYmxlZDogdHJ1ZSB9LFxuXHRcdFx0XHRcdF1cblx0XHRcdFx0OiBbXSksXG5cdFx0XTtcblx0XHRjb25zdCBlbnZSZXMgPSBhd2FpdCBmZXRjaChcblx0XHRcdGBodHRwczovL2FwaS5nZXRwb3N0bWFuLmNvbS9lbnZpcm9ubWVudHM/d29ya3NwYWNlPSR7b3B0aW9ucy53b3Jrc3BhY2VJZH1gLFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRoZWFkZXJzLFxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdFx0ZW52aXJvbm1lbnQ6IHsgbmFtZTogZW52TmFtZSwgdmFsdWVzOiBlbnZWYWx1ZXMgfSxcblx0XHRcdFx0fSksXG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0aWYgKGVudlJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBQb3N0bWFuIGVudmlyb25tZW50IHVwbG9hZGVkXCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiICDinJcgRmFpbGVkIHRvIHVwbG9hZCBQb3N0bWFuIGVudmlyb25tZW50XCIpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgY29uc3QgUG9zdG1hbkZlYXR1cmU6IEZlYXR1cmU8UG9zdG1hbk9wdGlvbnM+ID0geyBnZXRPcHRpb25zLCBzY2FmZm9sZCB9O1xuZXhwb3J0IHsgUE9TVE1BTl9DQUxMQkFDS1MsIFBPU1RNQU5fU0NPUEVTIH07XG4iXSwibmFtZXMiOlsiUE9TVE1BTl9DQUxMQkFDS1MiLCJQT1NUTUFOX1NDT1BFUyIsIlBvc3RtYW5GZWF0dXJlIiwiam9pbiIsImdldE9wdGlvbnMiLCJfd29ya3NwYWNlIiwiY2xpT3B0aW9ucyIsInBvc3RtYW5Qcm92aWRlciIsImNob2ljZXMiLCJsYWJlbCIsImRlc2NyaXB0aW9uIiwic2VsZWN0ZWQiLCJwaWNrIiwiYyIsInByb3ZpZGVyIiwiYXBpS2V5IiwicHJvY2VzcyIsImVudiIsIlBPU1RNQU5fQVBJX0tFWSIsInRoZW4iLCJtIiwiYXNrIiwiaGVhZGVycyIsIndzUmVzIiwiZmV0Y2giLCJvayIsImNvbnNvbGUiLCJlcnJvciIsIndvcmtzcGFjZXMiLCJqc29uIiwid3NDaG9pY2VzIiwiaWQiLCJtYXAiLCJ3IiwibmFtZSIsInR5cGUiLCJ3c1BpY2tlZCIsIndvcmtzcGFjZUlkIiwid3NOYW1lIiwiY3JlYXRlUmVzIiwibWV0aG9kIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ3b3Jrc3BhY2UiLCJ3cyIsImxvZyIsImJ1aWxkQ29sbGVjdGlvbkpzb24iLCJwcm9qZWN0TmFtZSIsImF1dGgiLCJhdXRoT2JqIiwiYXV0aDBEb21haW4iLCJvYXV0aDIiLCJrZXkiLCJ2YWx1ZSIsInVuZGVmaW5lZCIsImhlbGxvVXJsIiwicGF0aCIsInJhdyIsImhvc3QiLCJzcGxpdCIsImZpbHRlciIsIkJvb2xlYW4iLCJpbmZvIiwiX3Bvc3RtYW5faWQiLCJyYW5kb21VVUlEIiwic2NoZW1hIiwiaXRlbSIsInJlcXVlc3QiLCJ1cmwiLCJoZWFkZXIiLCJtb2RlIiwieWFtbFF1b3RlIiwidGVzdCIsImluY2x1ZGVzIiwiYnVpbGRFbnZpcm9ubWVudFlhbWwiLCJ2YWx1ZXMiLCJwdXNoIiwiYXV0aDBBdWRpZW5jZSIsImF1dGgwQ2xpZW50SWQiLCJsaW5lcyIsInYiLCJidWlsZExvY2FsVmlld0ZpbGVzIiwiY29sbGVjdGlvbkRpciIsImZpbGVzIiwiYXV0aEJsb2NrIiwiZmlsZVBhdGgiLCJjb250ZW50IiwibCIsInJlcGxhY2UiLCJyZXF1ZXN0cyIsImZpbGUiLCJ5YW1sIiwiciIsInNjYWZmb2xkIiwib3B0aW9ucyIsImF1dGhDb25maWdNb2RlbCIsImdldE1vZGVsIiwiV0VMTF9LTk9XTl9GSUxFUyIsIkFVVEhfQ09ORklHIiwiYXV0aENmZyIsImNvbmZpZyIsInNwYUNsaWVudElkIiwiaXNzdWVyQmFzZVVybCIsImFwcCIsImF1dGgwQ2xpIiwiY3JlYXRlU3BhQXBwIiwiY2xpZW50X2lkIiwiZW5hYmxlQ29ubmVjdGlvbkZvckNsaWVudCIsIkRCX0NPTk5FQ1RJT05fTkFNRSIsImVyciIsIkVycm9yIiwibWVzc2FnZSIsImF1dGgwRW52IiwiYXVkaWVuY2UiLCJlbnZOYW1lIiwibG9jYWxGaWxlcyIsImVudllhbWwiLCJhZGRGaWxlIiwiY29sbGVjdGlvbiIsImNvbFJlcyIsImVudlZhbHVlcyIsImVuYWJsZWQiLCJlbnZSZXMiLCJlbnZpcm9ubWVudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7UUFzZlNBO2VBQUFBOztRQUFtQkM7ZUFBQUE7O1FBRGZDO2VBQUFBOzs7NEJBcmZjO3dCQUNOO3VCQUNZO2tFQUlQOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFMUIscUVBQXFFLEdBQ3JFLE1BQU1GLG9CQUFvQjtJQUN6QjtJQUNBO0NBQ0E7QUFFRCw4RUFBOEUsR0FDOUUsTUFBTUMsaUJBQWlCO0lBQ3RCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0NBQ0EsQ0FBQ0UsSUFBSSxDQUFDO0FBUVAsZUFBZUMsV0FDZEMsVUFBNkIsRUFDN0JDLFVBQW1DO0lBRW5DLElBQUlBLFdBQVdDLGVBQWUsSUFBSSxNQUFNLE9BQU8sQ0FBQztJQUVoRCxNQUFNQyxVQUFVO1FBQ2Y7WUFBRUMsT0FBTztZQUFpQkMsYUFBYTtRQUFPO1FBQzlDO1lBQ0NELE9BQU87WUFDUEMsYUFBYTtRQUNkO1FBQ0E7WUFDQ0QsT0FBTztZQUNQQyxhQUFhO1FBQ2Q7S0FDQTtJQUNELE1BQU1DLFdBQVcsTUFBTUMsSUFBQUEsWUFBSSxFQUMxQixpQkFDQUosU0FDQSxDQUFDSyxJQUFNLEdBQUdBLEVBQUVKLEtBQUssQ0FBQyxHQUFHLEVBQUVJLEVBQUVILFdBQVcsRUFBRTtJQUV2QyxNQUFNSSxXQUFXSCxVQUFVRixTQUFTO0lBRXBDLElBQUlLLGFBQWEsUUFBUSxPQUFPO1FBQUVQLGlCQUFpQjtJQUFPO0lBQzFELElBQUlPLGFBQWEsU0FBUyxPQUFPO1FBQUVQLGlCQUFpQjtJQUFRO0lBRTVELE1BQU1RLFNBQ0xDLFFBQVFDLEdBQUcsQ0FBQ0MsZUFBZSxJQUMxQixNQUFNLG1FQUFBLFFBQU8sNEJBQTBCQyxJQUFJLENBQUMsQ0FBQ0MsSUFDN0NBLEVBQUVDLEdBQUcsQ0FBQztJQUdSLE1BQU1DLFVBQVU7UUFBRSxhQUFhUDtRQUFRLGdCQUFnQjtJQUFtQjtJQUMxRSxNQUFNUSxRQUFRLE1BQU1DLE1BQU0seUNBQXlDO1FBQUVGO0lBQVE7SUFFN0UsSUFBSSxDQUFDQyxNQUFNRSxFQUFFLEVBQUU7UUFDZEMsUUFBUUMsS0FBSyxDQUFDO1FBQ2QsT0FBTztZQUFFcEIsaUJBQWlCO1FBQVE7SUFDbkM7SUFFQSxNQUFNLEVBQUVxQixVQUFVLEVBQUUsR0FBSSxNQUFNTCxNQUFNTSxJQUFJO0lBS3hDLE1BQU1DLFlBQXdCO1FBQzdCO1lBQUVyQixPQUFPO1lBQW1Cc0IsSUFBSTtRQUFLO1dBQ2xDSCxXQUFXSSxHQUFHLENBQUMsQ0FBQ0MsSUFBTyxDQUFBO2dCQUFFeEIsT0FBTyxHQUFHd0IsRUFBRUMsSUFBSSxDQUFDLEVBQUUsRUFBRUQsRUFBRUUsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFBRUosSUFBSUUsRUFBRUYsRUFBRTtZQUFDLENBQUE7S0FDckU7SUFFRCxNQUFNSyxXQUFXLE1BQU14QixJQUFBQSxZQUFJLEVBQUMsMkJBQTJCa0IsV0FBVyxDQUFDakIsSUFBTUEsRUFBRUosS0FBSztJQUVoRixJQUFJNEI7SUFDSixJQUFJLENBQUNELFlBQVlBLFNBQVNMLEVBQUUsS0FBSyxNQUFNO1FBQ3RDLE1BQU0sRUFBRVYsR0FBRyxFQUFFLEdBQUcsTUFBTSxtRUFBQSxRQUFPO1FBQzdCLE1BQU1pQixTQUFTLE1BQU1qQixJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDN0MsTUFBTWtCLFlBQVksTUFBTWYsTUFBTSx5Q0FBeUM7WUFDdEVnQixRQUFRO1lBQ1JsQjtZQUNBbUIsTUFBTUMsS0FBS0MsU0FBUyxDQUFDO2dCQUFFQyxXQUFXO29CQUFFVixNQUFNSTtvQkFBUUgsTUFBTTtnQkFBVztZQUFFO1FBQ3RFO1FBQ0EsTUFBTSxFQUFFUyxXQUFXQyxFQUFFLEVBQUUsR0FBSSxNQUFNTixVQUFVVixJQUFJO1FBQy9DUSxjQUFjUSxHQUFHZCxFQUFFO1FBQ25CTCxRQUFRb0IsR0FBRyxDQUFDLENBQUMsdUJBQXVCLEVBQUVSLFFBQVE7SUFDL0MsT0FBTztRQUNORCxjQUFjRCxTQUFTTCxFQUFFO0lBQzFCO0lBRUEsT0FBTztRQUFFeEIsaUJBQWlCO1FBQU9RO1FBQVFzQjtJQUFZO0FBQ3REO0FBUUEsc0RBQXNELEdBQ3RELFNBQVNVLG9CQUFvQkMsV0FBbUIsRUFBRUMsSUFBZTtJQUNoRSxNQUFNQyxVQUFVRCxNQUFNRSxjQUNuQjtRQUNBaEIsTUFBTTtRQUNOaUIsUUFBUTtZQUNQO2dCQUFFQyxLQUFLO2dCQUFjQyxPQUFPO2dCQUFnQ25CLE1BQU07WUFBUztZQUMzRTtnQkFDQ2tCLEtBQUs7Z0JBQ0xDLE9BQU87Z0JBQ1BuQixNQUFNO1lBQ1A7WUFDQTtnQkFDQ2tCLEtBQUs7Z0JBQ0xDLE9BQU87Z0JBQ1BuQixNQUFNO1lBQ1A7WUFDQTtnQkFBRWtCLEtBQUs7Z0JBQVlDLE9BQU87Z0JBQXFCbkIsTUFBTTtZQUFTO1lBQzlEO2dCQUFFa0IsS0FBSztnQkFBU0MsT0FBT3JEO2dCQUFnQmtDLE1BQU07WUFBUztZQUN0RDtnQkFBRWtCLEtBQUs7Z0JBQWdCQyxPQUFPdEQsaUJBQWlCLENBQUMsRUFBRTtnQkFBRW1DLE1BQU07WUFBUztZQUNuRTtnQkFBRWtCLEtBQUs7Z0JBQWNDLE9BQU87Z0JBQVFuQixNQUFNO1lBQVU7WUFDcEQ7Z0JBQUVrQixLQUFLO2dCQUFjQyxPQUFPO2dCQUFVbkIsTUFBTTtZQUFTO1lBQ3JEO2dCQUFFa0IsS0FBSztnQkFBc0JDLE9BQU87Z0JBQVFuQixNQUFNO1lBQVM7WUFDM0Q7Z0JBQUVrQixLQUFLO2dCQUF5QkMsT0FBTztnQkFBUW5CLE1BQU07WUFBUztZQUM5RDtnQkFBRWtCLEtBQUs7Z0JBQWdCQyxPQUFPO2dCQUFJbkIsTUFBTTtZQUFTO1lBQ2pEO2dCQUFFa0IsS0FBSztnQkFBYUMsT0FBTyxHQUFHTixZQUFZLGFBQWEsQ0FBQztnQkFBRWIsTUFBTTtZQUFTO1NBQ3pFO0lBQ0YsSUFDQ29CO0lBRUgsTUFBTUMsV0FBVyxDQUFDQyxNQUFjQyxNQUFpQixDQUFBO1lBQ2hEQSxLQUFLLENBQUMsV0FBVyxFQUFFQSxLQUFLO1lBQ3hCQyxNQUFNO2dCQUFDO2FBQWM7WUFDckJGLE1BQU1BLEtBQUtHLEtBQUssQ0FBQyxLQUFLQyxNQUFNLENBQUNDO1FBQzlCLENBQUE7SUFFQSxPQUFPO1FBQ05DLE1BQU07WUFDTEMsYUFBYUMsSUFBQUEsc0JBQVU7WUFDdkIvQixNQUFNLEdBQUdjLFlBQVksT0FBTyxDQUFDO1lBQzdCa0IsUUFBUTtZQUNSeEQsYUFDQyw0RUFDQTtRQUNGO1FBQ0EsR0FBSXdDLFVBQVU7WUFBRUQsTUFBTUM7UUFBUSxJQUFJLENBQUMsQ0FBQztRQUNwQ2lCLE1BQU07WUFDTDtnQkFDQ2pDLE1BQU07Z0JBQ05pQyxNQUFNO29CQUNMO3dCQUNDakMsTUFBTTt3QkFDTmtDLFNBQVM7NEJBQ1JuQixNQUFNO2dDQUFFZCxNQUFNOzRCQUFTOzRCQUN2QkssUUFBUTs0QkFDUjZCLEtBQUtiLFNBQVMsU0FBUzt3QkFDeEI7b0JBQ0Q7b0JBQ0E7d0JBQ0N0QixNQUFNO3dCQUNOa0MsU0FBUzs0QkFDUjVCLFFBQVE7NEJBQ1I2QixLQUFLYixTQUFTLGFBQWE7d0JBQzVCO29CQUNEO29CQUNBO3dCQUNDdEIsTUFBTTt3QkFDTmtDLFNBQVM7NEJBQ1I1QixRQUFROzRCQUNSOEIsUUFBUTtnQ0FBQztvQ0FBRWpCLEtBQUs7b0NBQWdCQyxPQUFPO2dDQUFtQjs2QkFBRTs0QkFDNURiLE1BQU07Z0NBQ0w4QixNQUFNO2dDQUNOYixLQUFLOzRCQUNOOzRCQUNBVyxLQUFLYixTQUFTLFNBQVM7d0JBQ3hCO29CQUNEO29CQUNBO3dCQUNDdEIsTUFBTTt3QkFDTmtDLFNBQVM7NEJBQ1I1QixRQUFROzRCQUNSOEIsUUFBUTtnQ0FBQztvQ0FBRWpCLEtBQUs7b0NBQWdCQyxPQUFPO2dDQUFtQjs2QkFBRTs0QkFDNURiLE1BQU07Z0NBQ0w4QixNQUFNO2dDQUNOYixLQUFLOzRCQUNOOzRCQUNBVyxLQUFLYixTQUFTLGFBQWE7d0JBQzVCO29CQUNEO29CQUNBO3dCQUNDdEIsTUFBTTt3QkFDTmtDLFNBQVM7NEJBQ1I1QixRQUFROzRCQUNSNkIsS0FBS2IsU0FBUyxhQUFhO3dCQUM1QjtvQkFDRDtpQkFDQTtZQUNGO1NBQ0E7SUFDRjtBQUNEO0FBRUEsU0FBU2dCLFVBQVVsQixLQUFhO0lBQy9CLElBQUksd0JBQXdCbUIsSUFBSSxDQUFDbkIsVUFBVUEsTUFBTW9CLFFBQVEsQ0FBQyxTQUFTcEIsVUFBVSxJQUFJO1FBQ2hGLE9BQU9aLEtBQUtDLFNBQVMsQ0FBQ1c7SUFDdkI7SUFDQSxPQUFPQTtBQUNSO0FBRUEsZ0RBQWdELEdBQ2hELFNBQVNxQixxQkFBcUJ6QyxJQUFZLEVBQUVlLElBQWU7SUFDMUQsTUFBTTJCLFNBQWdEO1FBQ3JEO1lBQUV2QixLQUFLO1lBQVdDLE9BQU87UUFBd0I7S0FDakQ7SUFDRCxJQUFJTCxNQUFNRSxhQUFhO1FBQ3RCeUIsT0FBT0MsSUFBSSxDQUNWO1lBQUV4QixLQUFLO1lBQWVDLE9BQU9MLEtBQUtFLFdBQVc7UUFBQyxHQUM5QztZQUFFRSxLQUFLO1lBQWlCQyxPQUFPTCxLQUFLNkIsYUFBYSxJQUFJO1FBQUcsR0FDeEQ7WUFBRXpCLEtBQUs7WUFBaUJDLE9BQU9MLEtBQUs4QixhQUFhLElBQUk7UUFBRyxHQUN4RDtZQUNDMUIsS0FBSztZQUNMQyxPQUFPLENBQUMsUUFBUSxFQUFFTCxLQUFLRSxXQUFXLENBQUMsb0JBQW9CLEVBQUVGLEtBQUs2QixhQUFhLElBQUksSUFBSTtRQUNwRixHQUNBO1lBQ0N6QixLQUFLO1lBQ0xDLE9BQU8sQ0FBQyxRQUFRLEVBQUVMLEtBQUtFLFdBQVcsQ0FBQyxZQUFZLENBQUM7UUFDakQsR0FDQTtZQUFFRSxLQUFLO1lBQWVDLE9BQU90RCxpQkFBaUIsQ0FBQyxFQUFFO1FBQUMsR0FDbEQ7WUFBRXFELEtBQUs7WUFBU0MsT0FBT3JEO1FBQWU7SUFFeEM7SUFFQSxNQUFNK0UsUUFBUTtRQUFDLENBQUMsTUFBTSxFQUFFUixVQUFVdEMsT0FBTztRQUFFO0tBQVU7SUFDckQsS0FBSyxNQUFNK0MsS0FBS0wsT0FBUTtRQUN2QkksTUFBTUgsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFSSxFQUFFNUIsR0FBRyxFQUFFO1FBQzlCMkIsTUFBTUgsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFTCxVQUFVUyxFQUFFM0IsS0FBSyxHQUFHO1FBQzdDMEIsTUFBTUgsSUFBSSxDQUFDO0lBQ1o7SUFDQSxPQUFPLEdBQUdHLE1BQU03RSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDL0I7QUFFQSw2REFBNkQsR0FDN0QsU0FBUytFLG9CQUNSbEMsV0FBbUIsRUFDbkJDLElBQWU7SUFFZixNQUFNa0MsZ0JBQWdCLENBQUMsb0JBQW9CLEVBQUVuQyxZQUFZLE9BQU8sQ0FBQztJQUNqRSxNQUFNb0MsUUFBc0QsRUFBRTtJQUU5RCx3RkFBd0Y7SUFDeEYsbUZBQW1GO0lBQ25GLE1BQU1DLFlBQVlwQyxNQUFNRSxjQUNyQjtRQUNBO1FBQ0EsQ0FBQyxRQUFRLEVBQUVjLElBQUFBLHNCQUFVLEtBQUk7UUFDekI7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLENBQUMsdUJBQXVCLEVBQUVoQixLQUFLRSxXQUFXLENBQUMsb0JBQW9CLEVBQUVGLEtBQUs2QixhQUFhLElBQUksSUFBSTtRQUMzRixDQUFDLDhCQUE4QixFQUFFN0IsS0FBS0UsV0FBVyxDQUFDLFlBQVksQ0FBQztRQUMvRCxDQUFDLGdCQUFnQixFQUFFcUIsVUFBVXZCLEtBQUs4QixhQUFhLElBQUksS0FBSztRQUN4RCxDQUFDLGFBQWEsRUFBRVAsVUFBVXZFLGlCQUFpQjtRQUMzQyxDQUFDLG9CQUFvQixFQUFFRCxpQkFBaUIsQ0FBQyxFQUFFLEVBQUU7UUFDN0M7UUFDQTtRQUNBLG9GQUFvRjtRQUNwRjtRQUNBO1FBQ0EsQ0FBQyxpQkFBaUIsRUFBRXdFLFVBQVUsR0FBR3hCLFlBQVksYUFBYSxDQUFDLEdBQUc7UUFDOUQ7S0FDQSxDQUFDN0MsSUFBSSxDQUFDLFFBQ047SUFFSGlGLE1BQU1QLElBQUksQ0FBQztRQUNWUyxVQUFVLEdBQUdILGNBQWMsMkJBQTJCLENBQUM7UUFDdkRJLFNBQVM7WUFDUjtZQUNBLENBQUMsTUFBTSxFQUFFZixVQUFVLEdBQUd4QixZQUFZLE9BQU8sQ0FBQyxHQUFHO1lBQzdDO1lBQ0E7WUFDQTtZQUNBO1lBQ0FxQztTQUNBLENBQ0N4QixNQUFNLENBQUMsQ0FBQzJCLElBQU1BLE1BQU1qQyxXQUNwQnBELElBQUksQ0FBQyxNQUNMc0YsT0FBTyxDQUFDLFFBQVE7SUFDbkI7SUFFQUwsTUFBTVAsSUFBSSxDQUFDO1FBQ1ZTLFVBQVUsR0FBR0gsY0FBYyxpQ0FBaUMsQ0FBQztRQUM3REksU0FBUztZQUFDO1lBQWlCO1lBQWU7WUFBZTtTQUFHLENBQUNwRixJQUFJLENBQUM7SUFDbkU7SUFFQSxNQUFNdUYsV0FHRDtRQUNKO1lBQ0NDLE1BQU07WUFDTkMsTUFBTTtnQkFDTDtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTthQUNBLENBQUN6RixJQUFJLENBQUM7UUFDUjtRQUNBO1lBQ0N3RixNQUFNO1lBQ05DLE1BQU07Z0JBQ0w7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7YUFDQSxDQUFDekYsSUFBSSxDQUFDO1FBQ1I7UUFDQTtZQUNDd0YsTUFBTTtZQUNOQyxNQUFNO2dCQUNMO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2dCQUNBO2FBQ0EsQ0FBQ3pGLElBQUksQ0FBQztRQUNSO1FBQ0E7WUFDQ3dGLE1BQU07WUFDTkMsTUFBTTtnQkFDTDtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTtnQkFDQTthQUNBLENBQUN6RixJQUFJLENBQUM7UUFDUjtRQUNBO1lBQ0N3RixNQUFNO1lBQ05DLE1BQU07Z0JBQ0w7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7Z0JBQ0E7YUFDQSxDQUFDekYsSUFBSSxDQUFDO1FBQ1I7S0FDQTtJQUVELEtBQUssTUFBTTBGLEtBQUtILFNBQVU7UUFDekJOLE1BQU1QLElBQUksQ0FBQztZQUNWUyxVQUFVLEdBQUdILGNBQWMsT0FBTyxFQUFFVSxFQUFFRixJQUFJLEVBQUU7WUFDNUNKLFNBQVNNLEVBQUVELElBQUk7UUFDaEI7SUFDRDtJQUVBLE9BQU9SO0FBQ1I7QUFFQSxlQUFlVSxTQUFTbEQsU0FBNEIsRUFBRW1ELE9BQXVCO0lBQzVFLElBQUlBLFFBQVF4RixlQUFlLEtBQUssVUFBVXdGLFFBQVF4RixlQUFlLElBQUksTUFBTTtJQUUzRSxNQUFNeUYsa0JBQWtCcEQsVUFBVXFELFFBQVEsQ0FBa0JDLHVCQUFnQixDQUFDQyxXQUFXO0lBQ3hGLE1BQU1DLFVBQVVKLGlCQUFpQks7SUFFakMsSUFBSUM7SUFFSixJQUFJRixTQUFTRyxlQUFlO1FBQzNCLElBQUk7WUFDSCxNQUFNQyxNQUFNQyxVQUFTQyxZQUFZLENBQUMsR0FBRzlELFVBQVVWLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTttQkFBSWxDO2FBQWtCO1lBQ3JGc0csY0FBY0UsSUFBSUcsU0FBUztZQUMzQmpGLFFBQVFvQixHQUFHLENBQUM7WUFDWixJQUFJO2dCQUNIMkQsVUFBU0cseUJBQXlCLENBQUNILFVBQVNJLGtCQUFrQixFQUFFUDtnQkFDaEU1RSxRQUFRb0IsR0FBRyxDQUFDLENBQUMsWUFBWSxFQUFFMkQsVUFBU0ksa0JBQWtCLENBQUMsZUFBZSxDQUFDO1lBQ3hFLEVBQUUsT0FBT0MsS0FBSztnQkFDYnBGLFFBQVFDLEtBQUssQ0FDWixDQUFDLDJDQUEyQyxFQUFFbUYsZUFBZUMsUUFBUUQsSUFBSUUsT0FBTyxHQUFHRixLQUFLO1lBRTFGO1FBQ0QsRUFBRSxPQUFNO1lBQ1BwRixRQUFRQyxLQUFLLENBQ1o7UUFFRjtJQUNEO0lBRUEsTUFBTXNGLFdBQWlDYixTQUFTRyxnQkFDN0M7UUFDQXBELGFBQWFpRCxRQUFRRyxhQUFhLENBQUNkLE9BQU8sQ0FBQyxnQkFBZ0I7UUFDM0RYLGVBQWVzQixRQUFRYyxRQUFRO1FBQy9CbkMsZUFBZXVCO0lBQ2hCLElBQ0MvQztJQUVILE1BQU1QLGNBQWNKLFVBQVVWLElBQUk7SUFDbEMsTUFBTWlGLFVBQVUsR0FBR25FLFlBQVksTUFBTSxDQUFDO0lBQ3RDLE1BQU1vRSxhQUFhbEMsb0JBQW9CbEMsYUFBYWlFO0lBQ3BELE1BQU1JLFVBQVUxQyxxQkFBcUJ3QyxTQUFTRjtJQUU5Q3JFLFVBQVUwRSxPQUFPLENBQUM7UUFDakJsQyxPQUFPLElBQU07Z0JBQ1o7b0JBQ0NFLFVBQVU7b0JBQ1ZDLFNBQVM7d0JBQ1I7d0JBQ0E7d0JBQ0E7d0JBQ0E7d0JBQ0E7cUJBQ0EsQ0FBQ3BGLElBQUksQ0FBQztnQkFDUjtnQkFDQTtvQkFDQ21GLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRXRDLFlBQVksdUJBQXVCLENBQUM7b0JBQ3RFdUMsU0FBUzhCO2dCQUNWO21CQUNHRDthQUNIO0lBQ0Y7SUFFQSxJQUFJckIsUUFBUXhGLGVBQWUsS0FBSyxTQUFTd0YsUUFBUWhGLE1BQU0sRUFBRTtRQUN4RCxNQUFNd0csYUFBYXhFLG9CQUFvQkMsYUFBYWlFO1FBQ3BELE1BQU0zRixVQUFVO1lBQUUsYUFBYXlFLFFBQVFoRixNQUFNO1lBQUUsZ0JBQWdCO1FBQW1CO1FBRWxGLE1BQU15RyxTQUFTLE1BQU1oRyxNQUNwQixDQUFDLGlEQUFpRCxFQUFFdUUsUUFBUTFELFdBQVcsRUFBRSxFQUN6RTtZQUNDRyxRQUFRO1lBQ1JsQjtZQUNBbUIsTUFBTUMsS0FBS0MsU0FBUyxDQUFDO2dCQUFFNEU7WUFBVztRQUNuQztRQUVELElBQUlDLE9BQU8vRixFQUFFLEVBQUU7WUFDZEMsUUFBUW9CLEdBQUcsQ0FBQztRQUNiLE9BQU87WUFDTnBCLFFBQVFDLEtBQUssQ0FBQztRQUNmO1FBRUEsTUFBTThGLFlBQVk7WUFDakI7Z0JBQUVwRSxLQUFLO2dCQUFXQyxPQUFPO2dCQUF5Qm9FLFNBQVM7WUFBSztlQUM1RFQsVUFBVTlELGNBQ1g7Z0JBQ0E7b0JBQUVFLEtBQUs7b0JBQWVDLE9BQU8yRCxTQUFTOUQsV0FBVztvQkFBRXVFLFNBQVM7Z0JBQUs7Z0JBQ2pFO29CQUFFckUsS0FBSztvQkFBaUJDLE9BQU8yRCxTQUFTbkMsYUFBYSxJQUFJO29CQUFJNEMsU0FBUztnQkFBSztnQkFDM0U7b0JBQUVyRSxLQUFLO29CQUFpQkMsT0FBTzJELFNBQVNsQyxhQUFhLElBQUk7b0JBQUkyQyxTQUFTO2dCQUFLO2FBQzNFLEdBQ0EsRUFBRTtTQUNMO1FBQ0QsTUFBTUMsU0FBUyxNQUFNbkcsTUFDcEIsQ0FBQyxrREFBa0QsRUFBRXVFLFFBQVExRCxXQUFXLEVBQUUsRUFDMUU7WUFDQ0csUUFBUTtZQUNSbEI7WUFDQW1CLE1BQU1DLEtBQUtDLFNBQVMsQ0FBQztnQkFDcEJpRixhQUFhO29CQUFFMUYsTUFBTWlGO29CQUFTdkMsUUFBUTZDO2dCQUFVO1lBQ2pEO1FBQ0Q7UUFFRCxJQUFJRSxPQUFPbEcsRUFBRSxFQUFFO1lBQ2RDLFFBQVFvQixHQUFHLENBQUM7UUFDYixPQUFPO1lBQ05wQixRQUFRQyxLQUFLLENBQUM7UUFDZjtJQUNEO0FBQ0Q7QUFFTyxNQUFNekIsaUJBQTBDO0lBQUVFO0lBQVkwRjtBQUFTIn0=
@@ -36,6 +36,9 @@ class ApiPackageJson {
36
36
  version: "0.0.1",
37
37
  type: "module",
38
38
  main: "src/main.ts",
39
+ scripts: {
40
+ lint: "biome check --write ."
41
+ },
39
42
  dependencies: {
40
43
  ...this._dependencies
41
44
  }
@@ -54,4 +57,4 @@ class ApiPackageJson {
54
57
  }
55
58
  }
56
59
 
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9hcGktcGFja2FnZS1qc29uLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5pbXBvcnQgeyBDUkVBVEVfVkVSU0lPTiB9IGZyb20gXCIuLi8uLi92ZXJzaW9uLmpzXCI7XG5cbi8qKlxuICogQnVpbGRlciBmb3IgYHByb2plY3RzL2FwaS9wYWNrYWdlLmpzb25gLlxuICpcbiAqIFN0YXJ0cyB3aXRoIHRoZSBjb3JlIGNvcnRleCArIGNydWNpYmxlIGRlcHMuIEZlYXR1cmVzIGNhbiBjYWxsXG4gKiBgYWRkRGVwZW5kZW5jeWAgLyBgYWRkRGV2RGVwZW5kZW5jeWAgdG8gZXh0ZW5kLlxuICovXG5leHBvcnQgY2xhc3MgQXBpUGFja2FnZUpzb24gaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuQVBJX1BBQ0tBR0VfSlNPTjtcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9kZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdHByaXZhdGUgcmVhZG9ubHkgX2RldkRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb2plY3ROYW1lOiBzdHJpbmcpIHtcblx0XHR0aGlzLl9kZXBlbmRlbmNpZXMgPSB7XG5cdFx0XHRcIkBkZWNvaGVyZS9jb3J0ZXhcIjogQ1JFQVRFX1ZFUlNJT04sXG5cdFx0XHRcIkBkZWNvaGVyZS9jcnVjaWJsZVwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGFkZERlcGVuZGVuY3kobmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9kZXBlbmRlbmNpZXNbbmFtZV0gPSB2ZXJzaW9uO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGFkZERldkRlcGVuZGVuY3kobmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9kZXZEZXBlbmRlbmNpZXNbbmFtZV0gPSB2ZXJzaW9uO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0Y29uc3QgcGtnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcblx0XHRcdG5hbWU6IGBAJHt0aGlzLnByb2plY3ROYW1lfS9hcGlgLFxuXHRcdFx0dmVyc2lvbjogXCIwLjAuMVwiLFxuXHRcdFx0dHlwZTogXCJtb2R1bGVcIixcblx0XHRcdG1haW46IFwic3JjL21haW4udHNcIixcblx0XHRcdGRlcGVuZGVuY2llczogeyAuLi50aGlzLl9kZXBlbmRlbmNpZXMgfSxcblx0XHR9O1xuXHRcdGlmIChPYmplY3Qua2V5cyh0aGlzLl9kZXZEZXBlbmRlbmNpZXMpLmxlbmd0aCA+IDApIHtcblx0XHRcdHBrZy5kZXZEZXBlbmRlbmNpZXMgPSB7IC4uLnRoaXMuX2RldkRlcGVuZGVuY2llcyB9O1xuXHRcdH1cblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJwYWNrYWdlLmpzb25cIixcblx0XHRcdFx0Y29udGVudDogSlNPTi5zdHJpbmdpZnkocGtnLCBudWxsLCAyKSxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkFwaVBhY2thZ2VKc29uIiwia2V5IiwiV0VMTF9LTk9XTl9GSUxFUyIsIkFQSV9QQUNLQUdFX0pTT04iLCJfZGVwZW5kZW5jaWVzIiwiX2RldkRlcGVuZGVuY2llcyIsInByb2plY3ROYW1lIiwiQ1JFQVRFX1ZFUlNJT04iLCJhZGREZXBlbmRlbmN5IiwibmFtZSIsInZlcnNpb24iLCJhZGREZXZEZXBlbmRlbmN5IiwiZmlsZXMiLCJwa2ciLCJ0eXBlIiwibWFpbiIsImRlcGVuZGVuY2llcyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJkZXZEZXBlbmRlbmNpZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJKU09OIiwic3RyaW5naWZ5Il0sIm1hcHBpbmdzIjoiOzs7OytCQVVhQTs7O2VBQUFBOzs7dUJBVm9CO3lCQUVGO0FBUXhCLE1BQU1BOztJQUNJQyxNQUFNQyx1QkFBZ0IsQ0FBQ0MsZ0JBQWdCLENBQUM7SUFFdkNDLGNBQXNDO0lBQ3RDQyxtQkFBMkMsQ0FBQyxFQUFFO0lBRS9ELFlBQW1CLEFBQWlCQyxXQUFtQixDQUFFO2FBQXJCQSxjQUFBQTtRQUNuQyxJQUFJLENBQUNGLGFBQWEsR0FBRztZQUNwQixvQkFBb0JHLHVCQUFjO1lBQ2xDLHNCQUFzQkEsdUJBQWM7UUFDckM7SUFDRDtJQUVPQyxjQUFjQyxJQUFZLEVBQUVDLE9BQWUsRUFBUTtRQUN6RCxJQUFJLENBQUNOLGFBQWEsQ0FBQ0ssS0FBSyxHQUFHQztRQUMzQixPQUFPLElBQUk7SUFDWjtJQUVPQyxpQkFBaUJGLElBQVksRUFBRUMsT0FBZSxFQUFRO1FBQzVELElBQUksQ0FBQ0wsZ0JBQWdCLENBQUNJLEtBQUssR0FBR0M7UUFDOUIsT0FBTyxJQUFJO0lBQ1o7SUFFT0UsUUFBc0I7UUFDNUIsTUFBTUMsTUFBK0I7WUFDcENKLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDSCxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ2hDSSxTQUFTO1lBQ1RJLE1BQU07WUFDTkMsTUFBTTtZQUNOQyxjQUFjO2dCQUFFLEdBQUcsSUFBSSxDQUFDWixhQUFhO1lBQUM7UUFDdkM7UUFDQSxJQUFJYSxPQUFPQyxJQUFJLENBQUMsSUFBSSxDQUFDYixnQkFBZ0IsRUFBRWMsTUFBTSxHQUFHLEdBQUc7WUFDbEROLElBQUlPLGVBQWUsR0FBRztnQkFBRSxHQUFHLElBQUksQ0FBQ2YsZ0JBQWdCO1lBQUM7UUFDbEQ7UUFDQSxPQUFPO1lBQ047Z0JBQ0NnQixVQUFVO2dCQUNWQyxTQUFTQyxLQUFLQyxTQUFTLENBQUNYLEtBQUssTUFBTTtZQUNwQztTQUNBO0lBQ0Y7QUFDRCJ9
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9hcGktcGFja2FnZS1qc29uLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5pbXBvcnQgeyBDUkVBVEVfVkVSU0lPTiB9IGZyb20gXCIuLi8uLi92ZXJzaW9uLmpzXCI7XG5cbi8qKlxuICogQnVpbGRlciBmb3IgYHByb2plY3RzL2FwaS9wYWNrYWdlLmpzb25gLlxuICpcbiAqIFN0YXJ0cyB3aXRoIHRoZSBjb3JlIGNvcnRleCArIGNydWNpYmxlIGRlcHMuIEZlYXR1cmVzIGNhbiBjYWxsXG4gKiBgYWRkRGVwZW5kZW5jeWAgLyBgYWRkRGV2RGVwZW5kZW5jeWAgdG8gZXh0ZW5kLlxuICovXG5leHBvcnQgY2xhc3MgQXBpUGFja2FnZUpzb24gaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuQVBJX1BBQ0tBR0VfSlNPTjtcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9kZXBlbmRlbmNpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cdHByaXZhdGUgcmVhZG9ubHkgX2RldkRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHByb2plY3ROYW1lOiBzdHJpbmcpIHtcblx0XHR0aGlzLl9kZXBlbmRlbmNpZXMgPSB7XG5cdFx0XHRcIkBkZWNvaGVyZS9jb3J0ZXhcIjogQ1JFQVRFX1ZFUlNJT04sXG5cdFx0XHRcIkBkZWNvaGVyZS9jcnVjaWJsZVwiOiBDUkVBVEVfVkVSU0lPTixcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGFkZERlcGVuZGVuY3kobmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9kZXBlbmRlbmNpZXNbbmFtZV0gPSB2ZXJzaW9uO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGFkZERldkRlcGVuZGVuY3kobmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9kZXZEZXBlbmRlbmNpZXNbbmFtZV0gPSB2ZXJzaW9uO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0Y29uc3QgcGtnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcblx0XHRcdG5hbWU6IGBAJHt0aGlzLnByb2plY3ROYW1lfS9hcGlgLFxuXHRcdFx0dmVyc2lvbjogXCIwLjAuMVwiLFxuXHRcdFx0dHlwZTogXCJtb2R1bGVcIixcblx0XHRcdG1haW46IFwic3JjL21haW4udHNcIixcblx0XHRcdHNjcmlwdHM6IHtcblx0XHRcdFx0bGludDogXCJiaW9tZSBjaGVjayAtLXdyaXRlIC5cIixcblx0XHRcdH0sXG5cdFx0XHRkZXBlbmRlbmNpZXM6IHsgLi4udGhpcy5fZGVwZW5kZW5jaWVzIH0sXG5cdFx0fTtcblx0XHRpZiAoT2JqZWN0LmtleXModGhpcy5fZGV2RGVwZW5kZW5jaWVzKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRwa2cuZGV2RGVwZW5kZW5jaWVzID0geyAuLi50aGlzLl9kZXZEZXBlbmRlbmNpZXMgfTtcblx0XHR9XG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwicGFja2FnZS5qc29uXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IEpTT04uc3RyaW5naWZ5KHBrZywgbnVsbCwgMiksXG5cdFx0XHR9LFxuXHRcdF07XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJBcGlQYWNrYWdlSnNvbiIsImtleSIsIldFTExfS05PV05fRklMRVMiLCJBUElfUEFDS0FHRV9KU09OIiwiX2RlcGVuZGVuY2llcyIsIl9kZXZEZXBlbmRlbmNpZXMiLCJwcm9qZWN0TmFtZSIsIkNSRUFURV9WRVJTSU9OIiwiYWRkRGVwZW5kZW5jeSIsIm5hbWUiLCJ2ZXJzaW9uIiwiYWRkRGV2RGVwZW5kZW5jeSIsImZpbGVzIiwicGtnIiwidHlwZSIsIm1haW4iLCJzY3JpcHRzIiwibGludCIsImRlcGVuZGVuY2llcyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJkZXZEZXBlbmRlbmNpZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJKU09OIiwic3RyaW5naWZ5Il0sIm1hcHBpbmdzIjoiOzs7OytCQVVhQTs7O2VBQUFBOzs7dUJBVm9CO3lCQUVGO0FBUXhCLE1BQU1BOztJQUNJQyxNQUFNQyx1QkFBZ0IsQ0FBQ0MsZ0JBQWdCLENBQUM7SUFFdkNDLGNBQXNDO0lBQ3RDQyxtQkFBMkMsQ0FBQyxFQUFFO0lBRS9ELFlBQW1CLEFBQWlCQyxXQUFtQixDQUFFO2FBQXJCQSxjQUFBQTtRQUNuQyxJQUFJLENBQUNGLGFBQWEsR0FBRztZQUNwQixvQkFBb0JHLHVCQUFjO1lBQ2xDLHNCQUFzQkEsdUJBQWM7UUFDckM7SUFDRDtJQUVPQyxjQUFjQyxJQUFZLEVBQUVDLE9BQWUsRUFBUTtRQUN6RCxJQUFJLENBQUNOLGFBQWEsQ0FBQ0ssS0FBSyxHQUFHQztRQUMzQixPQUFPLElBQUk7SUFDWjtJQUVPQyxpQkFBaUJGLElBQVksRUFBRUMsT0FBZSxFQUFRO1FBQzVELElBQUksQ0FBQ0wsZ0JBQWdCLENBQUNJLEtBQUssR0FBR0M7UUFDOUIsT0FBTyxJQUFJO0lBQ1o7SUFFT0UsUUFBc0I7UUFDNUIsTUFBTUMsTUFBK0I7WUFDcENKLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDSCxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ2hDSSxTQUFTO1lBQ1RJLE1BQU07WUFDTkMsTUFBTTtZQUNOQyxTQUFTO2dCQUNSQyxNQUFNO1lBQ1A7WUFDQUMsY0FBYztnQkFBRSxHQUFHLElBQUksQ0FBQ2QsYUFBYTtZQUFDO1FBQ3ZDO1FBQ0EsSUFBSWUsT0FBT0MsSUFBSSxDQUFDLElBQUksQ0FBQ2YsZ0JBQWdCLEVBQUVnQixNQUFNLEdBQUcsR0FBRztZQUNsRFIsSUFBSVMsZUFBZSxHQUFHO2dCQUFFLEdBQUcsSUFBSSxDQUFDakIsZ0JBQWdCO1lBQUM7UUFDbEQ7UUFDQSxPQUFPO1lBQ047Z0JBQ0NrQixVQUFVO2dCQUNWQyxTQUFTQyxLQUFLQyxTQUFTLENBQUNiLEtBQUssTUFBTTtZQUNwQztTQUNBO0lBQ0Y7QUFDRCJ9