@decohere/create 0.0.1-dev.36 → 0.0.1-dev.38

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.
@@ -3,6 +3,9 @@ import { existsSync, readFileSync } from "node:fs";
3
3
  import { join } from "node:path";
4
4
  import { pick } from "../../domain/prompt.js";
5
5
  import { WELL_KNOWN_FILES } from "../../models/const.js";
6
+ import { buildHelloOpenApiDocument } from "../postman/hello-openapi.js";
7
+ import { buildEnvironmentYaml, buildLocalViewFilesFromCollection } from "../postman/local-view.js";
8
+ import { applyPostmanAuthOverlay, openApiToPostmanCollection } from "../postman/openapi-to-postman.js";
6
9
  import * as auth0Cli from "./auth0-cli.js";
7
10
  /** Postman OAuth callback URLs (popup + "Authorize using browser"). */ const POSTMAN_CALLBACKS = [
8
11
  "https://oauth.pstmn.io/v1/callback",
@@ -17,6 +20,7 @@ import * as auth0Cli from "./auth0-cli.js";
17
20
  "update:Hello",
18
21
  "delete:Hello"
19
22
  ].join(" ");
23
+ 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.";
20
24
  async function getOptions(_workspace, cliOptions) {
21
25
  if (cliOptions.postmanProvider != null) return {};
22
26
  const choices = [
@@ -93,333 +97,17 @@ async function getOptions(_workspace, cliOptions) {
93
97
  workspaceId
94
98
  };
95
99
  }
96
- /** v2.1 JSON — used for Postman.com API upload only. */ function buildCollectionJson(projectName, auth) {
97
- const authObj = auth?.auth0Domain ? {
98
- type: "oauth2",
99
- oauth2: [
100
- {
101
- key: "grant_type",
102
- value: "authorization_code_with_pkce",
103
- type: "string"
104
- },
105
- {
106
- key: "authUrl",
107
- value: "https://{{auth0Domain}}/authorize?audience={{auth0Audience}}",
108
- type: "string"
109
- },
110
- {
111
- key: "accessTokenUrl",
112
- value: "https://{{auth0Domain}}/oauth/token",
113
- type: "string"
114
- },
115
- {
116
- key: "clientId",
117
- value: "{{auth0ClientId}}",
118
- type: "string"
119
- },
120
- {
121
- key: "scope",
122
- value: POSTMAN_SCOPES,
123
- type: "string"
124
- },
125
- {
126
- key: "redirect_uri",
127
- value: POSTMAN_CALLBACKS[0],
128
- type: "string"
129
- },
130
- {
131
- key: "useBrowser",
132
- value: "true",
133
- type: "boolean"
134
- },
135
- {
136
- key: "addTokenTo",
137
- value: "header",
138
- type: "string"
139
- },
140
- {
141
- key: "challengeAlgorithm",
142
- value: "S256",
143
- type: "string"
144
- },
145
- {
146
- key: "client_authentication",
147
- value: "body",
148
- type: "string"
149
- },
150
- {
151
- key: "clientSecret",
152
- value: "",
153
- type: "string"
154
- },
155
- {
156
- key: "tokenName",
157
- value: `${projectName} Access Token`,
158
- type: "string"
159
- }
160
- ]
161
- } : undefined;
162
- const helloUrl = (path, raw)=>({
163
- raw: `{{baseUrl}}${raw}`,
164
- host: [
165
- "{{baseUrl}}"
166
- ],
167
- path: path.split("/").filter(Boolean)
168
- });
169
- return {
170
- info: {
171
- _postman_id: randomUUID(),
172
- name: `${projectName} WebAPI`,
173
- schema: "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
174
- description: "Open the project root in Postman Local View (not the postman/ folder). " + "Select the Local environment, then Authorization → Get New Access Token (PKCE)."
175
- },
176
- ...authObj ? {
177
- auth: authObj
178
- } : {},
179
- item: [
180
- {
181
- name: "Hello",
182
- item: [
183
- {
184
- name: "List (anonymous)",
185
- request: {
186
- auth: {
187
- type: "noauth"
188
- },
189
- method: "GET",
190
- url: helloUrl("hello", "/hello")
191
- }
192
- },
193
- {
194
- name: "Get by id",
195
- request: {
196
- method: "GET",
197
- url: helloUrl("hello/:id", "/hello/:id")
198
- }
199
- },
200
- {
201
- name: "Create",
202
- request: {
203
- method: "POST",
204
- header: [
205
- {
206
- key: "Content-Type",
207
- value: "application/json"
208
- }
209
- ],
210
- body: {
211
- mode: "raw",
212
- raw: '{\n "message": "hello"\n}\n'
213
- },
214
- url: helloUrl("hello", "/hello")
215
- }
216
- },
217
- {
218
- name: "Update",
219
- request: {
220
- method: "PUT",
221
- header: [
222
- {
223
- key: "Content-Type",
224
- value: "application/json"
225
- }
226
- ],
227
- body: {
228
- mode: "raw",
229
- raw: '{\n "message": "updated"\n}\n'
230
- },
231
- url: helloUrl("hello/:id", "/hello/:id")
232
- }
233
- },
234
- {
235
- name: "Delete",
236
- request: {
237
- method: "DELETE",
238
- url: helloUrl("hello/:id", "/hello/:id")
239
- }
240
- }
241
- ]
242
- }
243
- ]
244
- };
245
- }
246
- function yamlQuote(value) {
247
- if (/[:#{}[\],&*?|<>=!%@`]/.test(value) || value.includes("\n") || value === "") {
248
- return JSON.stringify(value);
249
- }
250
- return value;
251
- }
252
- /** Local View / Native Git environment (YAML). */ function buildEnvironmentYaml(name, auth) {
253
- const values = [
254
- {
255
- key: "baseUrl",
256
- value: "http://localhost:3000"
257
- }
258
- ];
259
- if (auth?.auth0Domain) {
260
- values.push({
261
- key: "auth0Domain",
262
- value: auth.auth0Domain
263
- }, {
264
- key: "auth0Audience",
265
- value: auth.auth0Audience ?? ""
266
- }, {
267
- key: "auth0ClientId",
268
- value: auth.auth0ClientId ?? ""
269
- }, {
270
- key: "authUrl",
271
- value: `https://${auth.auth0Domain}/authorize?audience=${auth.auth0Audience ?? ""}`
272
- }, {
273
- key: "accessTokenUrl",
274
- value: `https://${auth.auth0Domain}/oauth/token`
275
- }, {
276
- key: "callbackUrl",
277
- value: POSTMAN_CALLBACKS[0]
278
- }, {
279
- key: "scope",
280
- value: POSTMAN_SCOPES
281
- });
282
- }
283
- const lines = [
284
- `name: ${yamlQuote(name)}`,
285
- "values:"
286
- ];
287
- for (const v of values){
288
- lines.push(` - key: ${v.key}`);
289
- lines.push(` value: ${yamlQuote(v.value)}`);
290
- lines.push(" enabled: true");
100
+ /** Build Postman collection: OpenAPI routes + Auth0 auth overlay. */ export async function buildHybridPostmanCollection(projectName, auth) {
101
+ const openapi = buildHelloOpenApiDocument(projectName);
102
+ const base = await openApiToPostmanCollection(openapi);
103
+ if (base.info._postman_id == null) {
104
+ base.info._postman_id = randomUUID();
291
105
  }
292
- return `${lines.join("\n")}\n`;
293
- }
294
- /** Local View / Native Git collection (v3 multi-file YAML). */ function buildLocalViewFiles(projectName, auth) {
295
- const collectionDir = `postman/collections/${projectName} WebAPI`;
296
- const files = [];
297
- // Postman Local View stores OAuth under auth[].credentials (not the v2.1 oauth2 array).
298
- // Use concrete https URLs — empty Auth URL yields "Invalid protocol for auth URL".
299
- const authBlock = auth?.auth0Domain ? [
300
- "auth:",
301
- ` - id: ${randomUUID()}`,
302
- " type: oauth2",
303
- " name: OAuth 2.0",
304
- " credentials:",
305
- " addTokenTo: header",
306
- " grant_type: authorization_code_with_pkce",
307
- ` authUrl: https://${auth.auth0Domain}/authorize?audience=${auth.auth0Audience ?? ""}`,
308
- ` accessTokenUrl: https://${auth.auth0Domain}/oauth/token`,
309
- ` clientId: ${yamlQuote(auth.auth0ClientId ?? "")}`,
310
- ` scope: ${yamlQuote(POSTMAN_SCOPES)}`,
311
- ` redirect_uri: ${POSTMAN_CALLBACKS[0]}`,
312
- " useBrowser: true",
313
- " challengeAlgorithm: S256",
314
- // SPA public client: Auth0 token endpoint rejects Basic auth (feacft Unauthorized).
315
- " client_authentication: body",
316
- ' clientSecret: ""',
317
- ` tokenName: ${yamlQuote(`${projectName} Access Token`)}`,
318
- ""
319
- ].join("\n") : "";
320
- files.push({
321
- filePath: `${collectionDir}/.resources/definition.yaml`,
322
- content: [
323
- "$kind: collection",
324
- `name: ${yamlQuote(`${projectName} WebAPI`)}`,
325
- "schemaVersion: '3.0'",
326
- "description: >-",
327
- " Open this project root in Postman Local View (Files → Open folder).",
328
- " Select the Local environment, then Authorization → Get New Access Token (PKCE).",
329
- authBlock
330
- ].filter((l)=>l !== undefined).join("\n").replace(/\n+$/, "\n")
106
+ return applyPostmanAuthOverlay(base, projectName, auth, {
107
+ callbacks: POSTMAN_CALLBACKS,
108
+ scopes: POSTMAN_SCOPES,
109
+ description: COLLECTION_DESCRIPTION
331
110
  });
332
- files.push({
333
- filePath: `${collectionDir}/Hello/.resources/definition.yaml`,
334
- content: [
335
- "$kind: folder",
336
- "name: Hello",
337
- "order: 1000",
338
- ""
339
- ].join("\n")
340
- });
341
- const requests = [
342
- {
343
- file: "List (anonymous).request.yaml",
344
- yaml: [
345
- "$kind: http-request",
346
- "name: List (anonymous)",
347
- "method: GET",
348
- 'url: "{{baseUrl}}/hello"',
349
- "auth:",
350
- " type: noauth",
351
- "order: 1000",
352
- ""
353
- ].join("\n")
354
- },
355
- {
356
- file: "Get by id.request.yaml",
357
- yaml: [
358
- "$kind: http-request",
359
- "name: Get by id",
360
- "method: GET",
361
- 'url: "{{baseUrl}}/hello/:id"',
362
- "order: 2000",
363
- ""
364
- ].join("\n")
365
- },
366
- {
367
- file: "Create.request.yaml",
368
- yaml: [
369
- "$kind: http-request",
370
- "name: Create",
371
- "method: POST",
372
- 'url: "{{baseUrl}}/hello"',
373
- "headers:",
374
- " Content-Type: application/json",
375
- "body:",
376
- " type: json",
377
- " content: |-",
378
- " {",
379
- ' "message": "hello"',
380
- " }",
381
- "order: 3000",
382
- ""
383
- ].join("\n")
384
- },
385
- {
386
- file: "Update.request.yaml",
387
- yaml: [
388
- "$kind: http-request",
389
- "name: Update",
390
- "method: PUT",
391
- 'url: "{{baseUrl}}/hello/:id"',
392
- "headers:",
393
- " Content-Type: application/json",
394
- "body:",
395
- " type: json",
396
- " content: |-",
397
- " {",
398
- ' "message": "updated"',
399
- " }",
400
- "order: 4000",
401
- ""
402
- ].join("\n")
403
- },
404
- {
405
- file: "Delete.request.yaml",
406
- yaml: [
407
- "$kind: http-request",
408
- "name: Delete",
409
- "method: DELETE",
410
- 'url: "{{baseUrl}}/hello/:id"',
411
- "order: 5000",
412
- ""
413
- ].join("\n")
414
- }
415
- ];
416
- for (const r of requests){
417
- files.push({
418
- filePath: `${collectionDir}/Hello/${r.file}`,
419
- content: r.yaml
420
- });
421
- }
422
- return files;
423
111
  }
424
112
  /** Read a previously scaffolded auth0ClientId so re-scaffold never blanks it. */ function readExistingSpaClientId(targetDir, projectName) {
425
113
  const envPath = join(targetDir, "postman/environments", `${projectName}-Local.environment.yaml`);
@@ -468,8 +156,15 @@ async function scaffold(workspace, options) {
468
156
  } : undefined;
469
157
  const projectName = workspace.name;
470
158
  const envName = `${projectName} Local`;
471
- const localFiles = buildLocalViewFiles(projectName, auth0Env);
472
- const envYaml = buildEnvironmentYaml(envName, auth0Env);
159
+ const collection = await buildHybridPostmanCollection(projectName, auth0Env);
160
+ const localFiles = buildLocalViewFilesFromCollection(collection, projectName, auth0Env, {
161
+ callbacks: POSTMAN_CALLBACKS,
162
+ scopes: POSTMAN_SCOPES
163
+ });
164
+ const envYaml = buildEnvironmentYaml(envName, auth0Env, {
165
+ callbacks: POSTMAN_CALLBACKS,
166
+ scopes: POSTMAN_SCOPES
167
+ });
473
168
  workspace.addFile({
474
169
  files: ()=>[
475
170
  {
@@ -479,6 +174,7 @@ async function scaffold(workspace, options) {
479
174
  "# Postman fills workspace.id when you connect Local View.",
480
175
  "#",
481
176
  "# All resources under postman/ are registered automatically.",
177
+ "# Route requests are generated from OpenAPI; Auth0 overlay is hand-authored.",
482
178
  ""
483
179
  ].join("\n")
484
180
  },
@@ -490,7 +186,6 @@ async function scaffold(workspace, options) {
490
186
  ]
491
187
  });
492
188
  if (options.postmanProvider === "api" && options.apiKey) {
493
- const collection = buildCollectionJson(projectName, auth0Env);
494
189
  const headers = {
495
190
  "X-Api-Key": options.apiKey,
496
191
  "Content-Type": "application/json"
@@ -552,6 +247,7 @@ export const PostmanFeature = {
552
247
  getOptions,
553
248
  scaffold
554
249
  };
250
+ export { buildHelloOpenApiDocument } from "../postman/hello-openapi.js";
555
251
  export { POSTMAN_CALLBACKS, POSTMAN_SCOPES };
556
252
 
557
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL3Bvc3RtYW4uZmVhdHVyZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHBpY2sgfSBmcm9tIFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiO1xuaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlU2NhZmZvbGQgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3Byb2plY3QubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgRmVhdHVyZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zY2FmZm9sZC5zZXJ2aWNlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEF1dGhDb25maWdNb2RlbCB9IGZyb20gXCIuLi9tb2RlbHMvYXV0aC1jb25maWcubW9kZWwuanNcIjtcbmltcG9ydCAqIGFzIGF1dGgwQ2xpIGZyb20gXCIuL2F1dGgwLWNsaS5qc1wiO1xuXG4vKiogUG9zdG1hbiBPQXV0aCBjYWxsYmFjayBVUkxzIChwb3B1cCArIFwiQXV0aG9yaXplIHVzaW5nIGJyb3dzZXJcIikuICovXG5jb25zdCBQT1NUTUFOX0NBTExCQUNLUyA9IFtcblx0XCJodHRwczovL29hdXRoLnBzdG1uLmlvL3YxL2NhbGxiYWNrXCIsXG5cdFwiaHR0cHM6Ly9vYXV0aC5wc3Rtbi5pby92MS9icm93c2VyLWNhbGxiYWNrXCIsXG5dIGFzIGNvbnN0O1xuXG4vKiogU2NvcGVzIHJlcXVlc3RlZCBmb3IgQXV0aDAgYWNjZXNzIHRva2VucyAoT0lEQyArIEhlbGxvIENBU0wgcGVybWlzc2lvbnMpLiAqL1xuY29uc3QgUE9TVE1BTl9TQ09QRVMgPSBbXG5cdFwib3BlbmlkXCIsXG5cdFwicHJvZmlsZVwiLFxuXHRcImVtYWlsXCIsXG5cdFwicmVhZDpIZWxsb1wiLFxuXHRcImNyZWF0ZTpIZWxsb1wiLFxuXHRcInVwZGF0ZTpIZWxsb1wiLFxuXHRcImRlbGV0ZTpIZWxsb1wiLFxuXS5qb2luKFwiIFwiKTtcblxuZXhwb3J0IHR5cGUgUG9zdG1hbk9wdGlvbnMgPSB7XG5cdHBvc3RtYW5Qcm92aWRlcj86IFwiYXBpXCIgfCBcImxvY2FsXCIgfCBcIm5vbmVcIjtcblx0YXBpS2V5Pzogc3RyaW5nO1xuXHR3b3Jrc3BhY2VJZD86IHN0cmluZztcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE9wdGlvbnMoXG5cdF93b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLFxuXHRjbGlPcHRpb25zOiBQYXJ0aWFsPFBvc3RtYW5PcHRpb25zPixcbik6IFByb21pc2U8UGFydGlhbDxQb3N0bWFuT3B0aW9ucz4+IHtcblx0aWYgKGNsaU9wdGlvbnMucG9zdG1hblByb3ZpZGVyICE9IG51bGwpIHJldHVybiB7fTtcblxuXHRjb25zdCBjaG9pY2VzID0gW1xuXHRcdHsgbGFiZWw6IFwibm9uZVwiIGFzIGNvbnN0LCBkZXNjcmlwdGlvbjogXCJza2lwXCIgfSxcblx0XHR7XG5cdFx0XHRsYWJlbDogXCJsb2NhbFwiIGFzIGNvbnN0LFxuXHRcdFx0ZGVzY3JpcHRpb246IFwiTG9jYWwgVmlldyAvIE5hdGl2ZSBHaXQgZmlsZXMgKG5vIEFQSSBrZXkpXCIsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRsYWJlbDogXCJhcGlcIiBhcyBjb25zdCxcblx0XHRcdGRlc2NyaXB0aW9uOiBcImFsc28gdXBsb2FkIHRvIFBvc3RtYW4uY29tIChuZWVkcyBBUEkga2V5KVwiLFxuXHRcdH0sXG5cdF07XG5cdGNvbnN0IHNlbGVjdGVkID0gYXdhaXQgcGljayhcblx0XHRcIlxcbiAgUG9zdG1hbjogXCIsXG5cdFx0Y2hvaWNlcyxcblx0XHQoYykgPT4gYCR7Yy5sYWJlbH0g4oCUICR7Yy5kZXNjcmlwdGlvbn1gLFxuXHQpO1xuXHRjb25zdCBwcm92aWRlciA9IHNlbGVjdGVkPy5sYWJlbCA/PyBcIm5vbmVcIjtcblxuXHRpZiAocHJvdmlkZXIgPT09IFwibm9uZVwiKSByZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwibm9uZVwiIH07XG5cdGlmIChwcm92aWRlciA9PT0gXCJsb2NhbFwiKSByZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwibG9jYWxcIiB9O1xuXG5cdGNvbnN0IGFwaUtleSA9XG5cdFx0cHJvY2Vzcy5lbnYuUE9TVE1BTl9BUElfS0VZID8/XG5cdFx0KGF3YWl0IGltcG9ydChcIi4uLy4uL2RvbWFpbi9wcm9tcHQuanNcIikudGhlbigobSkgPT5cblx0XHRcdG0uYXNrKFwiXFxuICBQb3N0bWFuIEFQSSBrZXkgKGFwcC5nZXRwb3N0bWFuLmNvbS9zZXR0aW5ncy9tZS9hcGkta2V5cyk6IFwiKSxcblx0XHQpKTtcblxuXHRjb25zdCBoZWFkZXJzID0geyBcIlgtQXBpLUtleVwiOiBhcGlLZXksIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH07XG5cdGNvbnN0IHdzUmVzID0gYXdhaXQgZmV0Y2goXCJodHRwczovL2FwaS5nZXRwb3N0bWFuLmNvbS93b3Jrc3BhY2VzXCIsIHsgaGVhZGVycyB9KTtcblxuXHRpZiAoIXdzUmVzLm9rKSB7XG5cdFx0Y29uc29sZS5lcnJvcihcIlxcbiAgUG9zdG1hbiBBUEkga2V5IGludmFsaWQg4oCUIGZhbGxpbmcgYmFjayB0byBsb2NhbCBmaWxlcy5cIik7XG5cdFx0cmV0dXJuIHsgcG9zdG1hblByb3ZpZGVyOiBcImxvY2FsXCIgfTtcblx0fVxuXG5cdGNvbnN0IHsgd29ya3NwYWNlcyB9ID0gKGF3YWl0IHdzUmVzLmpzb24oKSkgYXMge1xuXHRcdHdvcmtzcGFjZXM6IEFycmF5PHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmcgfT47XG5cdH07XG5cblx0dHlwZSBXc0Nob2ljZSA9IHsgbGFiZWw6IHN0cmluZzsgaWQ6IHN0cmluZyB8IG51bGwgfTtcblx0Y29uc3Qgd3NDaG9pY2VzOiBXc0Nob2ljZVtdID0gW1xuXHRcdHsgbGFiZWw6IFwiPG5ldyB3b3Jrc3BhY2U+XCIsIGlkOiBudWxsIH0sXG5cdFx0Li4ud29ya3NwYWNlcy5tYXAoKHcpID0+ICh7IGxhYmVsOiBgJHt3Lm5hbWV9ICgke3cudHlwZX0pYCwgaWQ6IHcuaWQgfSkpLFxuXHRdO1xuXG5cdGNvbnN0IHdzUGlja2VkID0gYXdhaXQgcGljayhcIlxcbiAgUG9zdG1hbiB3b3Jrc3BhY2U6IFwiLCB3c0Nob2ljZXMsIChjKSA9PiBjLmxhYmVsKTtcblxuXHRsZXQgd29ya3NwYWNlSWQ6IHN0cmluZztcblx0aWYgKCF3c1BpY2tlZCB8fCB3c1BpY2tlZC5pZCA9PT0gbnVsbCkge1xuXHRcdGNvbnN0IHsgYXNrIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi8uLi9kb21haW4vcHJvbXB0LmpzXCIpO1xuXHRcdGNvbnN0IHdzTmFtZSA9IGF3YWl0IGFzayhgICBXb3Jrc3BhY2UgbmFtZTogYCk7XG5cdFx0Y29uc3QgY3JlYXRlUmVzID0gYXdhaXQgZmV0Y2goXCJodHRwczovL2FwaS5nZXRwb3N0bWFuLmNvbS93b3Jrc3BhY2VzXCIsIHtcblx0XHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0XHRoZWFkZXJzLFxuXHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoeyB3b3Jrc3BhY2U6IHsgbmFtZTogd3NOYW1lLCB0eXBlOiBcInBlcnNvbmFsXCIgfSB9KSxcblx0XHR9KTtcblx0XHRjb25zdCB7IHdvcmtzcGFjZTogd3MgfSA9IChhd2FpdCBjcmVhdGVSZXMuanNvbigpKSBhcyB7IHdvcmtzcGFjZTogeyBpZDogc3RyaW5nIH0gfTtcblx0XHR3b3Jrc3BhY2VJZCA9IHdzLmlkO1xuXHRcdGNvbnNvbGUubG9nKGAgIOKckyBXb3Jrc3BhY2UgY3JlYXRlZDogJHt3c05hbWV9YCk7XG5cdH0gZWxzZSB7XG5cdFx0d29ya3NwYWNlSWQgPSB3c1BpY2tlZC5pZDtcblx0fVxuXG5cdHJldHVybiB7IHBvc3RtYW5Qcm92aWRlcjogXCJhcGlcIiwgYXBpS2V5LCB3b3Jrc3BhY2VJZCB9O1xufVxuXG50eXBlIEF1dGgwRW52ID0ge1xuXHRhdXRoMERvbWFpbj86IHN0cmluZztcblx0YXV0aDBBdWRpZW5jZT86IHN0cmluZztcblx0YXV0aDBDbGllbnRJZD86IHN0cmluZztcbn07XG5cbi8qKiB2Mi4xIEpTT04g4oCUIHVzZWQgZm9yIFBvc3RtYW4uY29tIEFQSSB1cGxvYWQgb25seS4gKi9cbmZ1bmN0aW9uIGJ1aWxkQ29sbGVjdGlvbkpzb24ocHJvamVjdE5hbWU6IHN0cmluZywgYXV0aD86IEF1dGgwRW52KTogdW5rbm93biB7XG5cdGNvbnN0IGF1dGhPYmogPSBhdXRoPy5hdXRoMERvbWFpblxuXHRcdD8ge1xuXHRcdFx0XHR0eXBlOiBcIm9hdXRoMlwiLFxuXHRcdFx0XHRvYXV0aDI6IFtcblx0XHRcdFx0XHR7IGtleTogXCJncmFudF90eXBlXCIsIHZhbHVlOiBcImF1dGhvcml6YXRpb25fY29kZV93aXRoX3BrY2VcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGtleTogXCJhdXRoVXJsXCIsXG5cdFx0XHRcdFx0XHR2YWx1ZTogXCJodHRwczovL3t7YXV0aDBEb21haW59fS9hdXRob3JpemU/YXVkaWVuY2U9e3thdXRoMEF1ZGllbmNlfX1cIixcblx0XHRcdFx0XHRcdHR5cGU6IFwic3RyaW5nXCIsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRrZXk6IFwiYWNjZXNzVG9rZW5VcmxcIixcblx0XHRcdFx0XHRcdHZhbHVlOiBcImh0dHBzOi8ve3thdXRoMERvbWFpbn19L29hdXRoL3Rva2VuXCIsXG5cdFx0XHRcdFx0XHR0eXBlOiBcInN0cmluZ1wiLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0eyBrZXk6IFwiY2xpZW50SWRcIiwgdmFsdWU6IFwie3thdXRoMENsaWVudElkfX1cIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRcdHsga2V5OiBcInNjb3BlXCIsIHZhbHVlOiBQT1NUTUFOX1NDT1BFUywgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRcdHsga2V5OiBcInJlZGlyZWN0X3VyaVwiLCB2YWx1ZTogUE9TVE1BTl9DQUxMQkFDS1NbMF0sIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0XHR7IGtleTogXCJ1c2VCcm93c2VyXCIsIHZhbHVlOiBcInRydWVcIiwgdHlwZTogXCJib29sZWFuXCIgfSxcblx0XHRcdFx0XHR7IGtleTogXCJhZGRUb2tlblRvXCIsIHZhbHVlOiBcImhlYWRlclwiLCB0eXBlOiBcInN0cmluZ1wiIH0sXG5cdFx0XHRcdFx0eyBrZXk6IFwiY2hhbGxlbmdlQWxnb3JpdGhtXCIsIHZhbHVlOiBcIlMyNTZcIiwgdHlwZTogXCJzdHJpbmdcIiB9LFxuXHRcdFx0XHRcdHsga2V5OiBcImNsaWVudF9hdXRoZW50aWNhdGlvblwiLCB2YWx1ZTogXCJib2R5XCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0XHR7IGtleTogXCJjbGllbnRTZWNyZXRcIiwgdmFsdWU6IFwiXCIsIHR5cGU6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0XHR7IGtleTogXCJ0b2tlbk5hbWVcIiwgdmFsdWU6IGAke3Byb2plY3ROYW1lfSBBY2Nlc3MgVG9rZW5gLCB0eXBlOiBcInN0cmluZ1wiIH0sXG5cdFx0XHRcdF0sXG5cdFx0XHR9XG5cdFx0OiB1bmRlZmluZWQ7XG5cblx0Y29uc3QgaGVsbG9VcmwgPSAocGF0aDogc3RyaW5nLCByYXc6IHN0cmluZykgPT4gKHtcblx0XHRyYXc6IGB7e2Jhc2VVcmx9fSR7cmF3fWAsXG5cdFx0aG9zdDogW1wie3tiYXNlVXJsfX1cIl0sXG5cdFx0cGF0aDogcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pLFxuXHR9KTtcblxuXHRyZXR1cm4ge1xuXHRcdGluZm86IHtcblx0XHRcdF9wb3N0bWFuX2lkOiByYW5kb21VVUlEKCksXG5cdFx0XHRuYW1lOiBgJHtwcm9qZWN0TmFtZX0gV2ViQVBJYCxcblx0XHRcdHNjaGVtYTogXCJodHRwczovL3NjaGVtYS5nZXRwb3N0bWFuLmNvbS9qc29uL2NvbGxlY3Rpb24vdjIuMS4wL2NvbGxlY3Rpb24uanNvblwiLFxuXHRcdFx0ZGVzY3JpcHRpb246XG5cdFx0XHRcdFwiT3BlbiB0aGUgcHJvamVjdCByb290IGluIFBvc3RtYW4gTG9jYWwgVmlldyAobm90IHRoZSBwb3N0bWFuLyBmb2xkZXIpLiBcIiArXG5cdFx0XHRcdFwiU2VsZWN0IHRoZSBMb2NhbCBlbnZpcm9ubWVudCwgdGhlbiBBdXRob3JpemF0aW9uIOKGkiBHZXQgTmV3IEFjY2VzcyBUb2tlbiAoUEtDRSkuXCIsXG5cdFx0fSxcblx0XHQuLi4oYXV0aE9iaiA/IHsgYXV0aDogYXV0aE9iaiB9IDoge30pLFxuXHRcdGl0ZW06IFtcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJIZWxsb1wiLFxuXHRcdFx0XHRpdGVtOiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0bmFtZTogXCJMaXN0IChhbm9ueW1vdXMpXCIsXG5cdFx0XHRcdFx0XHRyZXF1ZXN0OiB7XG5cdFx0XHRcdFx0XHRcdGF1dGg6IHsgdHlwZTogXCJub2F1dGhcIiB9LFxuXHRcdFx0XHRcdFx0XHRtZXRob2Q6IFwiR0VUXCIsXG5cdFx0XHRcdFx0XHRcdHVybDogaGVsbG9VcmwoXCJoZWxsb1wiLCBcIi9oZWxsb1wiKSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIkdldCBieSBpZFwiLFxuXHRcdFx0XHRcdFx0cmVxdWVzdDoge1xuXHRcdFx0XHRcdFx0XHRtZXRob2Q6IFwiR0VUXCIsXG5cdFx0XHRcdFx0XHRcdHVybDogaGVsbG9VcmwoXCJoZWxsby86aWRcIiwgXCIvaGVsbG8vOmlkXCIpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwiQ3JlYXRlXCIsXG5cdFx0XHRcdFx0XHRyZXF1ZXN0OiB7XG5cdFx0XHRcdFx0XHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0XHRcdFx0XHRcdGhlYWRlcjogW3sga2V5OiBcIkNvbnRlbnQtVHlwZVwiLCB2YWx1ZTogXCJhcHBsaWNhdGlvbi9qc29uXCIgfV0sXG5cdFx0XHRcdFx0XHRcdGJvZHk6IHtcblx0XHRcdFx0XHRcdFx0XHRtb2RlOiBcInJhd1wiLFxuXHRcdFx0XHRcdFx0XHRcdHJhdzogJ3tcXG4gIFwibWVzc2FnZVwiOiBcImhlbGxvXCJcXG59XFxuJyxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0dXJsOiBoZWxsb1VybChcImhlbGxvXCIsIFwiL2hlbGxvXCIpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwiVXBkYXRlXCIsXG5cdFx0XHRcdFx0XHRyZXF1ZXN0OiB7XG5cdFx0XHRcdFx0XHRcdG1ldGhvZDogXCJQVVRcIixcblx0XHRcdFx0XHRcdFx0aGVhZGVyOiBbeyBrZXk6IFwiQ29udGVudC1UeXBlXCIsIHZhbHVlOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9XSxcblx0XHRcdFx0XHRcdFx0Ym9keToge1xuXHRcdFx0XHRcdFx0XHRcdG1vZGU6IFwicmF3XCIsXG5cdFx0XHRcdFx0XHRcdFx0cmF3OiAne1xcbiAgXCJtZXNzYWdlXCI6IFwidXBkYXRlZFwiXFxufVxcbicsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHVybDogaGVsbG9VcmwoXCJoZWxsby86aWRcIiwgXCIvaGVsbG8vOmlkXCIpLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdG5hbWU6IFwiRGVsZXRlXCIsXG5cdFx0XHRcdFx0XHRyZXF1ZXN0OiB7XG5cdFx0XHRcdFx0XHRcdG1ldGhvZDogXCJERUxFVEVcIixcblx0XHRcdFx0XHRcdFx0dXJsOiBoZWxsb1VybChcImhlbGxvLzppZFwiLCBcIi9oZWxsby86aWRcIiksXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0sXG5cdFx0XHR9LFxuXHRcdF0sXG5cdH07XG59XG5cbmZ1bmN0aW9uIHlhbWxRdW90ZSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcblx0aWYgKC9bOiN7fVtcXF0sJio/fDw+PSElQGBdLy50ZXN0KHZhbHVlKSB8fCB2YWx1ZS5pbmNsdWRlcyhcIlxcblwiKSB8fCB2YWx1ZSA9PT0gXCJcIikge1xuXHRcdHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG5cdH1cblx0cmV0dXJuIHZhbHVlO1xufVxuXG4vKiogTG9jYWwgVmlldyAvIE5hdGl2ZSBHaXQgZW52aXJvbm1lbnQgKFlBTUwpLiAqL1xuZnVuY3Rpb24gYnVpbGRFbnZpcm9ubWVudFlhbWwobmFtZTogc3RyaW5nLCBhdXRoPzogQXV0aDBFbnYpOiBzdHJpbmcge1xuXHRjb25zdCB2YWx1ZXM6IEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4gPSBbXG5cdFx0eyBrZXk6IFwiYmFzZVVybFwiLCB2YWx1ZTogXCJodHRwOi8vbG9jYWxob3N0OjMwMDBcIiB9LFxuXHRdO1xuXHRpZiAoYXV0aD8uYXV0aDBEb21haW4pIHtcblx0XHR2YWx1ZXMucHVzaChcblx0XHRcdHsga2V5OiBcImF1dGgwRG9tYWluXCIsIHZhbHVlOiBhdXRoLmF1dGgwRG9tYWluIH0sXG5cdFx0XHR7IGtleTogXCJhdXRoMEF1ZGllbmNlXCIsIHZhbHVlOiBhdXRoLmF1dGgwQXVkaWVuY2UgPz8gXCJcIiB9LFxuXHRcdFx0eyBrZXk6IFwiYXV0aDBDbGllbnRJZFwiLCB2YWx1ZTogYXV0aC5hdXRoMENsaWVudElkID8/IFwiXCIgfSxcblx0XHRcdHtcblx0XHRcdFx0a2V5OiBcImF1dGhVcmxcIixcblx0XHRcdFx0dmFsdWU6IGBodHRwczovLyR7YXV0aC5hdXRoMERvbWFpbn0vYXV0aG9yaXplP2F1ZGllbmNlPSR7YXV0aC5hdXRoMEF1ZGllbmNlID8/IFwiXCJ9YCxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGtleTogXCJhY2Nlc3NUb2tlblVybFwiLFxuXHRcdFx0XHR2YWx1ZTogYGh0dHBzOi8vJHthdXRoLmF1dGgwRG9tYWlufS9vYXV0aC90b2tlbmAsXG5cdFx0XHR9LFxuXHRcdFx0eyBrZXk6IFwiY2FsbGJhY2tVcmxcIiwgdmFsdWU6IFBPU1RNQU5fQ0FMTEJBQ0tTWzBdIH0sXG5cdFx0XHR7IGtleTogXCJzY29wZVwiLCB2YWx1ZTogUE9TVE1BTl9TQ09QRVMgfSxcblx0XHQpO1xuXHR9XG5cblx0Y29uc3QgbGluZXMgPSBbYG5hbWU6ICR7eWFtbFF1b3RlKG5hbWUpfWAsIFwidmFsdWVzOlwiXTtcblx0Zm9yIChjb25zdCB2IG9mIHZhbHVlcykge1xuXHRcdGxpbmVzLnB1c2goYCAgLSBrZXk6ICR7di5rZXl9YCk7XG5cdFx0bGluZXMucHVzaChgICAgIHZhbHVlOiAke3lhbWxRdW90ZSh2LnZhbHVlKX1gKTtcblx0XHRsaW5lcy5wdXNoKFwiICAgIGVuYWJsZWQ6IHRydWVcIik7XG5cdH1cblx0cmV0dXJuIGAke2xpbmVzLmpvaW4oXCJcXG5cIil9XFxuYDtcbn1cblxuLyoqIExvY2FsIFZpZXcgLyBOYXRpdmUgR2l0IGNvbGxlY3Rpb24gKHYzIG11bHRpLWZpbGUgWUFNTCkuICovXG5mdW5jdGlvbiBidWlsZExvY2FsVmlld0ZpbGVzKFxuXHRwcm9qZWN0TmFtZTogc3RyaW5nLFxuXHRhdXRoPzogQXV0aDBFbnYsXG4pOiBBcnJheTx7IGZpbGVQYXRoOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZyB9PiB7XG5cdGNvbnN0IGNvbGxlY3Rpb25EaXIgPSBgcG9zdG1hbi9jb2xsZWN0aW9ucy8ke3Byb2plY3ROYW1lfSBXZWJBUElgO1xuXHRjb25zdCBmaWxlczogQXJyYXk8eyBmaWxlUGF0aDogc3RyaW5nOyBjb250ZW50OiBzdHJpbmcgfT4gPSBbXTtcblxuXHQvLyBQb3N0bWFuIExvY2FsIFZpZXcgc3RvcmVzIE9BdXRoIHVuZGVyIGF1dGhbXS5jcmVkZW50aWFscyAobm90IHRoZSB2Mi4xIG9hdXRoMiBhcnJheSkuXG5cdC8vIFVzZSBjb25jcmV0ZSBodHRwcyBVUkxzIOKAlCBlbXB0eSBBdXRoIFVSTCB5aWVsZHMgXCJJbnZhbGlkIHByb3RvY29sIGZvciBhdXRoIFVSTFwiLlxuXHRjb25zdCBhdXRoQmxvY2sgPSBhdXRoPy5hdXRoMERvbWFpblxuXHRcdD8gW1xuXHRcdFx0XHRcImF1dGg6XCIsXG5cdFx0XHRcdGAgIC0gaWQ6ICR7cmFuZG9tVVVJRCgpfWAsXG5cdFx0XHRcdFwiICAgIHR5cGU6IG9hdXRoMlwiLFxuXHRcdFx0XHRcIiAgICBuYW1lOiBPQXV0aCAyLjBcIixcblx0XHRcdFx0XCIgICAgY3JlZGVudGlhbHM6XCIsXG5cdFx0XHRcdFwiICAgICAgYWRkVG9rZW5UbzogaGVhZGVyXCIsXG5cdFx0XHRcdFwiICAgICAgZ3JhbnRfdHlwZTogYXV0aG9yaXphdGlvbl9jb2RlX3dpdGhfcGtjZVwiLFxuXHRcdFx0XHRgICAgICAgYXV0aFVybDogaHR0cHM6Ly8ke2F1dGguYXV0aDBEb21haW59L2F1dGhvcml6ZT9hdWRpZW5jZT0ke2F1dGguYXV0aDBBdWRpZW5jZSA/PyBcIlwifWAsXG5cdFx0XHRcdGAgICAgICBhY2Nlc3NUb2tlblVybDogaHR0cHM6Ly8ke2F1dGguYXV0aDBEb21haW59L29hdXRoL3Rva2VuYCxcblx0XHRcdFx0YCAgICAgIGNsaWVudElkOiAke3lhbWxRdW90ZShhdXRoLmF1dGgwQ2xpZW50SWQgPz8gXCJcIil9YCxcblx0XHRcdFx0YCAgICAgIHNjb3BlOiAke3lhbWxRdW90ZShQT1NUTUFOX1NDT1BFUyl9YCxcblx0XHRcdFx0YCAgICAgIHJlZGlyZWN0X3VyaTogJHtQT1NUTUFOX0NBTExCQUNLU1swXX1gLFxuXHRcdFx0XHRcIiAgICAgIHVzZUJyb3dzZXI6IHRydWVcIixcblx0XHRcdFx0XCIgICAgICBjaGFsbGVuZ2VBbGdvcml0aG06IFMyNTZcIixcblx0XHRcdFx0Ly8gU1BBIHB1YmxpYyBjbGllbnQ6IEF1dGgwIHRva2VuIGVuZHBvaW50IHJlamVjdHMgQmFzaWMgYXV0aCAoZmVhY2Z0IFVuYXV0aG9yaXplZCkuXG5cdFx0XHRcdFwiICAgICAgY2xpZW50X2F1dGhlbnRpY2F0aW9uOiBib2R5XCIsXG5cdFx0XHRcdCcgICAgICBjbGllbnRTZWNyZXQ6IFwiXCInLFxuXHRcdFx0XHRgICAgICAgdG9rZW5OYW1lOiAke3lhbWxRdW90ZShgJHtwcm9qZWN0TmFtZX0gQWNjZXNzIFRva2VuYCl9YCxcblx0XHRcdFx0XCJcIixcblx0XHRcdF0uam9pbihcIlxcblwiKVxuXHRcdDogXCJcIjtcblxuXHRmaWxlcy5wdXNoKHtcblx0XHRmaWxlUGF0aDogYCR7Y29sbGVjdGlvbkRpcn0vLnJlc291cmNlcy9kZWZpbml0aW9uLnlhbWxgLFxuXHRcdGNvbnRlbnQ6IFtcblx0XHRcdFwiJGtpbmQ6IGNvbGxlY3Rpb25cIixcblx0XHRcdGBuYW1lOiAke3lhbWxRdW90ZShgJHtwcm9qZWN0TmFtZX0gV2ViQVBJYCl9YCxcblx0XHRcdFwic2NoZW1hVmVyc2lvbjogJzMuMCdcIixcblx0XHRcdFwiZGVzY3JpcHRpb246ID4tXCIsXG5cdFx0XHRcIiAgT3BlbiB0aGlzIHByb2plY3Qgcm9vdCBpbiBQb3N0bWFuIExvY2FsIFZpZXcgKEZpbGVzIOKGkiBPcGVuIGZvbGRlcikuXCIsXG5cdFx0XHRcIiAgU2VsZWN0IHRoZSBMb2NhbCBlbnZpcm9ubWVudCwgdGhlbiBBdXRob3JpemF0aW9uIOKGkiBHZXQgTmV3IEFjY2VzcyBUb2tlbiAoUEtDRSkuXCIsXG5cdFx0XHRhdXRoQmxvY2ssXG5cdFx0XVxuXHRcdFx0LmZpbHRlcigobCkgPT4gbCAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0LmpvaW4oXCJcXG5cIilcblx0XHRcdC5yZXBsYWNlKC9cXG4rJC8sIFwiXFxuXCIpLFxuXHR9KTtcblxuXHRmaWxlcy5wdXNoKHtcblx0XHRmaWxlUGF0aDogYCR7Y29sbGVjdGlvbkRpcn0vSGVsbG8vLnJlc291cmNlcy9kZWZpbml0aW9uLnlhbWxgLFxuXHRcdGNvbnRlbnQ6IFtcIiRraW5kOiBmb2xkZXJcIiwgXCJuYW1lOiBIZWxsb1wiLCBcIm9yZGVyOiAxMDAwXCIsIFwiXCJdLmpvaW4oXCJcXG5cIiksXG5cdH0pO1xuXG5cdGNvbnN0IHJlcXVlc3RzOiBBcnJheTx7XG5cdFx0ZmlsZTogc3RyaW5nO1xuXHRcdHlhbWw6IHN0cmluZztcblx0fT4gPSBbXG5cdFx0e1xuXHRcdFx0ZmlsZTogXCJMaXN0IChhbm9ueW1vdXMpLnJlcXVlc3QueWFtbFwiLFxuXHRcdFx0eWFtbDogW1xuXHRcdFx0XHRcIiRraW5kOiBodHRwLXJlcXVlc3RcIixcblx0XHRcdFx0XCJuYW1lOiBMaXN0IChhbm9ueW1vdXMpXCIsXG5cdFx0XHRcdFwibWV0aG9kOiBHRVRcIixcblx0XHRcdFx0J3VybDogXCJ7e2Jhc2VVcmx9fS9oZWxsb1wiJyxcblx0XHRcdFx0XCJhdXRoOlwiLFxuXHRcdFx0XHRcIiAgdHlwZTogbm9hdXRoXCIsXG5cdFx0XHRcdFwib3JkZXI6IDEwMDBcIixcblx0XHRcdFx0XCJcIixcblx0XHRcdF0uam9pbihcIlxcblwiKSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdGZpbGU6IFwiR2V0IGJ5IGlkLnJlcXVlc3QueWFtbFwiLFxuXHRcdFx0eWFtbDogW1xuXHRcdFx0XHRcIiRraW5kOiBodHRwLXJlcXVlc3RcIixcblx0XHRcdFx0XCJuYW1lOiBHZXQgYnkgaWRcIixcblx0XHRcdFx0XCJtZXRob2Q6IEdFVFwiLFxuXHRcdFx0XHQndXJsOiBcInt7YmFzZVVybH19L2hlbGxvLzppZFwiJyxcblx0XHRcdFx0XCJvcmRlcjogMjAwMFwiLFxuXHRcdFx0XHRcIlwiLFxuXHRcdFx0XS5qb2luKFwiXFxuXCIpLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0ZmlsZTogXCJDcmVhdGUucmVxdWVzdC55YW1sXCIsXG5cdFx0XHR5YW1sOiBbXG5cdFx0XHRcdFwiJGtpbmQ6IGh0dHAtcmVxdWVzdFwiLFxuXHRcdFx0XHRcIm5hbWU6IENyZWF0ZVwiLFxuXHRcdFx0XHRcIm1ldGhvZDogUE9TVFwiLFxuXHRcdFx0XHQndXJsOiBcInt7YmFzZVVybH19L2hlbGxvXCInLFxuXHRcdFx0XHRcImhlYWRlcnM6XCIsXG5cdFx0XHRcdFwiICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cIixcblx0XHRcdFx0XCJib2R5OlwiLFxuXHRcdFx0XHRcIiAgdHlwZToganNvblwiLFxuXHRcdFx0XHRcIiAgY29udGVudDogfC1cIixcblx0XHRcdFx0XCIgICAge1wiLFxuXHRcdFx0XHQnICAgICAgXCJtZXNzYWdlXCI6IFwiaGVsbG9cIicsXG5cdFx0XHRcdFwiICAgIH1cIixcblx0XHRcdFx0XCJvcmRlcjogMzAwMFwiLFxuXHRcdFx0XHRcIlwiLFxuXHRcdFx0XS5qb2luKFwiXFxuXCIpLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0ZmlsZTogXCJVcGRhdGUucmVxdWVzdC55YW1sXCIsXG5cdFx0XHR5YW1sOiBbXG5cdFx0XHRcdFwiJGtpbmQ6IGh0dHAtcmVxdWVzdFwiLFxuXHRcdFx0XHRcIm5hbWU6IFVwZGF0ZVwiLFxuXHRcdFx0XHRcIm1ldGhvZDogUFVUXCIsXG5cdFx0XHRcdCd1cmw6IFwie3tiYXNlVXJsfX0vaGVsbG8vOmlkXCInLFxuXHRcdFx0XHRcImhlYWRlcnM6XCIsXG5cdFx0XHRcdFwiICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb25cIixcblx0XHRcdFx0XCJib2R5OlwiLFxuXHRcdFx0XHRcIiAgdHlwZToganNvblwiLFxuXHRcdFx0XHRcIiAgY29udGVudDogfC1cIixcblx0XHRcdFx0XCIgICAge1wiLFxuXHRcdFx0XHQnICAgICAgXCJtZXNzYWdlXCI6IFwidXBkYXRlZFwiJyxcblx0XHRcdFx0XCIgICAgfVwiLFxuXHRcdFx0XHRcIm9yZGVyOiA0MDAwXCIsXG5cdFx0XHRcdFwiXCIsXG5cdFx0XHRdLmpvaW4oXCJcXG5cIiksXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRmaWxlOiBcIkRlbGV0ZS5yZXF1ZXN0LnlhbWxcIixcblx0XHRcdHlhbWw6IFtcblx0XHRcdFx0XCIka2luZDogaHR0cC1yZXF1ZXN0XCIsXG5cdFx0XHRcdFwibmFtZTogRGVsZXRlXCIsXG5cdFx0XHRcdFwibWV0aG9kOiBERUxFVEVcIixcblx0XHRcdFx0J3VybDogXCJ7e2Jhc2VVcmx9fS9oZWxsby86aWRcIicsXG5cdFx0XHRcdFwib3JkZXI6IDUwMDBcIixcblx0XHRcdFx0XCJcIixcblx0XHRcdF0uam9pbihcIlxcblwiKSxcblx0XHR9LFxuXHRdO1xuXG5cdGZvciAoY29uc3QgciBvZiByZXF1ZXN0cykge1xuXHRcdGZpbGVzLnB1c2goe1xuXHRcdFx0ZmlsZVBhdGg6IGAke2NvbGxlY3Rpb25EaXJ9L0hlbGxvLyR7ci5maWxlfWAsXG5cdFx0XHRjb250ZW50OiByLnlhbWwsXG5cdFx0fSk7XG5cdH1cblxuXHRyZXR1cm4gZmlsZXM7XG59XG5cbi8qKiBSZWFkIGEgcHJldmlvdXNseSBzY2FmZm9sZGVkIGF1dGgwQ2xpZW50SWQgc28gcmUtc2NhZmZvbGQgbmV2ZXIgYmxhbmtzIGl0LiAqL1xuZnVuY3Rpb24gcmVhZEV4aXN0aW5nU3BhQ2xpZW50SWQodGFyZ2V0RGlyOiBzdHJpbmcsIHByb2plY3ROYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRjb25zdCBlbnZQYXRoID0gam9pbihcblx0XHR0YXJnZXREaXIsXG5cdFx0XCJwb3N0bWFuL2Vudmlyb25tZW50c1wiLFxuXHRcdGAke3Byb2plY3ROYW1lfS1Mb2NhbC5lbnZpcm9ubWVudC55YW1sYCxcblx0KTtcblx0aWYgKCFleGlzdHNTeW5jKGVudlBhdGgpKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRjb25zdCB0ZXh0ID0gcmVhZEZpbGVTeW5jKGVudlBhdGgsIFwidXRmOFwiKTtcblx0Y29uc3QgbWF0Y2ggPSB0ZXh0Lm1hdGNoKC9rZXk6XFxzKmF1dGgwQ2xpZW50SWRcXHMqXFxuXFxzKnZhbHVlOlxccypbXCInXT8oW15cIidcXG5dKykvKTtcblx0Y29uc3QgdmFsdWUgPSBtYXRjaD8uWzFdPy50cmltKCk7XG5cdHJldHVybiB2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPiAwID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgUG9zdG1hbiBTUEEgY2xpZW50IGlkLiBOZXZlciByZXR1cm5zIGVtcHR5IOKAlCBwcmVzZXJ2ZXMgYW4gZXhpc3RpbmdcbiAqIGVudiB2YWx1ZSBvbiBBdXRoMCBmYWlsdXJlLCBvdGhlcndpc2UgdGhyb3dzIHNvIHdlIGRvIG5vdCB3cml0ZSBhIGJsYW5rIGVudi5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVNwYUNsaWVudElkKHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQpOiBzdHJpbmcge1xuXHRjb25zdCBhcHBOYW1lID0gYCR7d29ya3NwYWNlLm5hbWV9IFBvc3RtYW5gO1xuXHR0cnkge1xuXHRcdGNvbnN0IGFwcCA9IGF1dGgwQ2xpLmVuc3VyZVNwYUFwcChhcHBOYW1lLCBbLi4uUE9TVE1BTl9DQUxMQkFDS1NdKTtcblx0XHRjb25zb2xlLmxvZyhcblx0XHRcdGFwcC5yZXVzZWRcblx0XHRcdFx0PyBgICDinJMgUmV1c2luZyBBdXRoMCBTUEEgYXBwIGZvciBQb3N0bWFuIFBLQ0UgKCR7YXBwLmNsaWVudF9pZH0pYFxuXHRcdFx0XHQ6IGAgIOKckyBBdXRoMCBTUEEgYXBwIGNyZWF0ZWQgZm9yIFBvc3RtYW4gUEtDRSAoJHthcHAuY2xpZW50X2lkfSlgLFxuXHRcdCk7XG5cdFx0dHJ5IHtcblx0XHRcdGF1dGgwQ2xpLmVuYWJsZUNvbm5lY3Rpb25Gb3JDbGllbnQoYXV0aDBDbGkuREJfQ09OTkVDVElPTl9OQU1FLCBhcHAuY2xpZW50X2lkKTtcblx0XHRcdGNvbnNvbGUubG9nKGAgIOKckyBFbmFibGVkICR7YXV0aDBDbGkuREJfQ09OTkVDVElPTl9OQU1FfSBvbiBQb3N0bWFuIFNQQWApO1xuXHRcdH0gY2F0Y2ggKGVycikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcblx0XHRcdFx0YCAg4pyXIEZhaWxlZCB0byBlbmFibGUgREIgY29ubmVjdGlvbiBvbiBTUEE6ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycn1gLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0cmV0dXJuIGFwcC5jbGllbnRfaWQ7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdGNvbnN0IGV4aXN0aW5nID0gcmVhZEV4aXN0aW5nU3BhQ2xpZW50SWQod29ya3NwYWNlLnRhcmdldERpciwgd29ya3NwYWNlLm5hbWUpO1xuXHRcdGlmIChleGlzdGluZykge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcblx0XHRcdFx0YCAg4pyXIEZhaWxlZCB0byBlbnN1cmUgQXV0aDAgU1BBIGFwcCAoJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogZXJyfSlgLFxuXHRcdFx0KTtcblx0XHRcdGNvbnNvbGUubG9nKGAgIOKckyBLZWVwaW5nIGV4aXN0aW5nIGF1dGgwQ2xpZW50SWQgZnJvbSBQb3N0bWFuIGVudmlyb25tZW50ICgke2V4aXN0aW5nfSlgKTtcblx0XHRcdHJldHVybiBleGlzdGluZztcblx0XHR9XG5cdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0YEZhaWxlZCB0byBlbnN1cmUgQXV0aDAgU1BBIGFwcCBmb3IgUG9zdG1hbiDigJQgYXV0aDBDbGllbnRJZCB3b3VsZCBiZSBlbXB0eTogJHtcblx0XHRcdFx0ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVyclxuXHRcdFx0fWAsXG5cdFx0KTtcblx0fVxufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZCh3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLCBvcHRpb25zOiBQb3N0bWFuT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuXHRpZiAob3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgPT09IFwibm9uZVwiIHx8IG9wdGlvbnMucG9zdG1hblByb3ZpZGVyID09IG51bGwpIHJldHVybjtcblxuXHRjb25zdCBhdXRoQ29uZmlnTW9kZWwgPSB3b3Jrc3BhY2UuZ2V0TW9kZWw8QXV0aENvbmZpZ01vZGVsPihXRUxMX0tOT1dOX0ZJTEVTLkFVVEhfQ09ORklHKTtcblx0Y29uc3QgYXV0aENmZyA9IGF1dGhDb25maWdNb2RlbD8uY29uZmlnO1xuXG5cdGNvbnN0IHNwYUNsaWVudElkID0gYXV0aENmZz8uaXNzdWVyQmFzZVVybCA/IHJlc29sdmVTcGFDbGllbnRJZCh3b3Jrc3BhY2UpIDogdW5kZWZpbmVkO1xuXG5cdGNvbnN0IGF1dGgwRW52OiBBdXRoMEVudiB8IHVuZGVmaW5lZCA9IGF1dGhDZmc/Lmlzc3VlckJhc2VVcmxcblx0XHQ/IHtcblx0XHRcdFx0YXV0aDBEb21haW46IGF1dGhDZmcuaXNzdWVyQmFzZVVybC5yZXBsYWNlKC9eaHR0cHM/OlxcL1xcLy8sIFwiXCIpLFxuXHRcdFx0XHRhdXRoMEF1ZGllbmNlOiBhdXRoQ2ZnLmF1ZGllbmNlLFxuXHRcdFx0XHRhdXRoMENsaWVudElkOiBzcGFDbGllbnRJZCxcblx0XHRcdH1cblx0XHQ6IHVuZGVmaW5lZDtcblxuXHRjb25zdCBwcm9qZWN0TmFtZSA9IHdvcmtzcGFjZS5uYW1lO1xuXHRjb25zdCBlbnZOYW1lID0gYCR7cHJvamVjdE5hbWV9IExvY2FsYDtcblx0Y29uc3QgbG9jYWxGaWxlcyA9IGJ1aWxkTG9jYWxWaWV3RmlsZXMocHJvamVjdE5hbWUsIGF1dGgwRW52KTtcblx0Y29uc3QgZW52WWFtbCA9IGJ1aWxkRW52aXJvbm1lbnRZYW1sKGVudk5hbWUsIGF1dGgwRW52KTtcblxuXHR3b3Jrc3BhY2UuYWRkRmlsZSh7XG5cdFx0ZmlsZXM6ICgpID0+IFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLnBvc3RtYW4vcmVzb3VyY2VzLnlhbWxcIixcblx0XHRcdFx0Y29udGVudDogW1xuXHRcdFx0XHRcdFwiIyBPcGVuIHRoaXMgcHJvamVjdCByb290IGluIFBvc3RtYW4gKEZpbGVzIOKGkiBPcGVuIGZvbGRlciksIG5vdCB0aGUgcG9zdG1hbi8gc3ViZm9sZGVyLlwiLFxuXHRcdFx0XHRcdFwiIyBQb3N0bWFuIGZpbGxzIHdvcmtzcGFjZS5pZCB3aGVuIHlvdSBjb25uZWN0IExvY2FsIFZpZXcuXCIsXG5cdFx0XHRcdFx0XCIjXCIsXG5cdFx0XHRcdFx0XCIjIEFsbCByZXNvdXJjZXMgdW5kZXIgcG9zdG1hbi8gYXJlIHJlZ2lzdGVyZWQgYXV0b21hdGljYWxseS5cIixcblx0XHRcdFx0XHRcIlwiLFxuXHRcdFx0XHRdLmpvaW4oXCJcXG5cIiksXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogYHBvc3RtYW4vZW52aXJvbm1lbnRzLyR7cHJvamVjdE5hbWV9LUxvY2FsLmVudmlyb25tZW50LnlhbWxgLFxuXHRcdFx0XHRjb250ZW50OiBlbnZZYW1sLFxuXHRcdFx0fSxcblx0XHRcdC4uLmxvY2FsRmlsZXMsXG5cdFx0XSxcblx0fSk7XG5cblx0aWYgKG9wdGlvbnMucG9zdG1hblByb3ZpZGVyID09PSBcImFwaVwiICYmIG9wdGlvbnMuYXBpS2V5KSB7XG5cdFx0Y29uc3QgY29sbGVjdGlvbiA9IGJ1aWxkQ29sbGVjdGlvbkpzb24ocHJvamVjdE5hbWUsIGF1dGgwRW52KTtcblx0XHRjb25zdCBoZWFkZXJzID0geyBcIlgtQXBpLUtleVwiOiBvcHRpb25zLmFwaUtleSwgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfTtcblxuXHRcdGNvbnN0IGNvbFJlcyA9IGF3YWl0IGZldGNoKFxuXHRcdFx0YGh0dHBzOi8vYXBpLmdldHBvc3RtYW4uY29tL2NvbGxlY3Rpb25zP3dvcmtzcGFjZT0ke29wdGlvbnMud29ya3NwYWNlSWR9YCxcblx0XHRcdHtcblx0XHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdFx0aGVhZGVycyxcblx0XHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoeyBjb2xsZWN0aW9uIH0pLFxuXHRcdFx0fSxcblx0XHQpO1xuXHRcdGlmIChjb2xSZXMub2spIHtcblx0XHRcdGNvbnNvbGUubG9nKFwiICDinJMgUG9zdG1hbiBjb2xsZWN0aW9uIHVwbG9hZGVkXCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiICDinJcgRmFpbGVkIHRvIHVwbG9hZCBQb3N0bWFuIGNvbGxlY3Rpb25cIik7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZW52VmFsdWVzID0gW1xuXHRcdFx0eyBrZXk6IFwiYmFzZVVybFwiLCB2YWx1ZTogXCJodHRwOi8vbG9jYWxob3N0OjMwMDBcIiwgZW5hYmxlZDogdHJ1ZSB9LFxuXHRcdFx0Li4uKGF1dGgwRW52Py5hdXRoMERvbWFpblxuXHRcdFx0XHQ/IFtcblx0XHRcdFx0XHRcdHsga2V5OiBcImF1dGgwRG9tYWluXCIsIHZhbHVlOiBhdXRoMEVudi5hdXRoMERvbWFpbiwgZW5hYmxlZDogdHJ1ZSB9LFxuXHRcdFx0XHRcdFx0eyBrZXk6IFwiYXV0aDBBdWRpZW5jZVwiLCB2YWx1ZTogYXV0aDBFbnYuYXV0aDBBdWRpZW5jZSA/PyBcIlwiLCBlbmFibGVkOiB0cnVlIH0sXG5cdFx0XHRcdFx0XHR7IGtleTogXCJhdXRoMENsaWVudElkXCIsIHZhbHVlOiBhdXRoMEVudi5hdXRoMENsaWVudElkID8/IFwiXCIsIGVuYWJsZWQ6IHRydWUgfSxcblx0XHRcdFx0XHRdXG5cdFx0XHRcdDogW10pLFxuXHRcdF07XG5cdFx0Y29uc3QgZW52UmVzID0gYXdhaXQgZmV0Y2goXG5cdFx0XHRgaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vZW52aXJvbm1lbnRzP3dvcmtzcGFjZT0ke29wdGlvbnMud29ya3NwYWNlSWR9YCxcblx0XHRcdHtcblx0XHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdFx0aGVhZGVycyxcblx0XHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoe1xuXHRcdFx0XHRcdGVudmlyb25tZW50OiB7IG5hbWU6IGVudk5hbWUsIHZhbHVlczogZW52VmFsdWVzIH0sXG5cdFx0XHRcdH0pLFxuXHRcdFx0fSxcblx0XHQpO1xuXHRcdGlmIChlbnZSZXMub2spIHtcblx0XHRcdGNvbnNvbGUubG9nKFwiICDinJMgUG9zdG1hbiBlbnZpcm9ubWVudCB1cGxvYWRlZFwiKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc29sZS5lcnJvcihcIiAg4pyXIEZhaWxlZCB0byB1cGxvYWQgUG9zdG1hbiBlbnZpcm9ubWVudFwiKTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGNvbnN0IFBvc3RtYW5GZWF0dXJlOiBGZWF0dXJlPFBvc3RtYW5PcHRpb25zPiA9IHsgZ2V0T3B0aW9ucywgc2NhZmZvbGQgfTtcbmV4cG9ydCB7IFBPU1RNQU5fQ0FMTEJBQ0tTLCBQT1NUTUFOX1NDT1BFUyB9O1xuIl0sIm5hbWVzIjpbInJhbmRvbVVVSUQiLCJleGlzdHNTeW5jIiwicmVhZEZpbGVTeW5jIiwiam9pbiIsInBpY2siLCJXRUxMX0tOT1dOX0ZJTEVTIiwiYXV0aDBDbGkiLCJQT1NUTUFOX0NBTExCQUNLUyIsIlBPU1RNQU5fU0NPUEVTIiwiZ2V0T3B0aW9ucyIsIl93b3Jrc3BhY2UiLCJjbGlPcHRpb25zIiwicG9zdG1hblByb3ZpZGVyIiwiY2hvaWNlcyIsImxhYmVsIiwiZGVzY3JpcHRpb24iLCJzZWxlY3RlZCIsImMiLCJwcm92aWRlciIsImFwaUtleSIsInByb2Nlc3MiLCJlbnYiLCJQT1NUTUFOX0FQSV9LRVkiLCJ0aGVuIiwibSIsImFzayIsImhlYWRlcnMiLCJ3c1JlcyIsImZldGNoIiwib2siLCJjb25zb2xlIiwiZXJyb3IiLCJ3b3Jrc3BhY2VzIiwianNvbiIsIndzQ2hvaWNlcyIsImlkIiwibWFwIiwidyIsIm5hbWUiLCJ0eXBlIiwid3NQaWNrZWQiLCJ3b3Jrc3BhY2VJZCIsIndzTmFtZSIsImNyZWF0ZVJlcyIsIm1ldGhvZCIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5Iiwid29ya3NwYWNlIiwid3MiLCJsb2ciLCJidWlsZENvbGxlY3Rpb25Kc29uIiwicHJvamVjdE5hbWUiLCJhdXRoIiwiYXV0aE9iaiIsImF1dGgwRG9tYWluIiwib2F1dGgyIiwia2V5IiwidmFsdWUiLCJ1bmRlZmluZWQiLCJoZWxsb1VybCIsInBhdGgiLCJyYXciLCJob3N0Iiwic3BsaXQiLCJmaWx0ZXIiLCJCb29sZWFuIiwiaW5mbyIsIl9wb3N0bWFuX2lkIiwic2NoZW1hIiwiaXRlbSIsInJlcXVlc3QiLCJ1cmwiLCJoZWFkZXIiLCJtb2RlIiwieWFtbFF1b3RlIiwidGVzdCIsImluY2x1ZGVzIiwiYnVpbGRFbnZpcm9ubWVudFlhbWwiLCJ2YWx1ZXMiLCJwdXNoIiwiYXV0aDBBdWRpZW5jZSIsImF1dGgwQ2xpZW50SWQiLCJsaW5lcyIsInYiLCJidWlsZExvY2FsVmlld0ZpbGVzIiwiY29sbGVjdGlvbkRpciIsImZpbGVzIiwiYXV0aEJsb2NrIiwiZmlsZVBhdGgiLCJjb250ZW50IiwibCIsInJlcGxhY2UiLCJyZXF1ZXN0cyIsImZpbGUiLCJ5YW1sIiwiciIsInJlYWRFeGlzdGluZ1NwYUNsaWVudElkIiwidGFyZ2V0RGlyIiwiZW52UGF0aCIsInRleHQiLCJtYXRjaCIsInRyaW0iLCJsZW5ndGgiLCJyZXNvbHZlU3BhQ2xpZW50SWQiLCJhcHBOYW1lIiwiYXBwIiwiZW5zdXJlU3BhQXBwIiwicmV1c2VkIiwiY2xpZW50X2lkIiwiZW5hYmxlQ29ubmVjdGlvbkZvckNsaWVudCIsIkRCX0NPTk5FQ1RJT05fTkFNRSIsImVyciIsIkVycm9yIiwibWVzc2FnZSIsImV4aXN0aW5nIiwic2NhZmZvbGQiLCJvcHRpb25zIiwiYXV0aENvbmZpZ01vZGVsIiwiZ2V0TW9kZWwiLCJBVVRIX0NPTkZJRyIsImF1dGhDZmciLCJjb25maWciLCJzcGFDbGllbnRJZCIsImlzc3VlckJhc2VVcmwiLCJhdXRoMEVudiIsImF1ZGllbmNlIiwiZW52TmFtZSIsImxvY2FsRmlsZXMiLCJlbnZZYW1sIiwiYWRkRmlsZSIsImNvbGxlY3Rpb24iLCJjb2xSZXMiLCJlbnZWYWx1ZXMiLCJlbmFibGVkIiwiZW52UmVzIiwiZW52aXJvbm1lbnQiLCJQb3N0bWFuRmVhdHVyZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsVUFBVSxRQUFRLGNBQWM7QUFDekMsU0FBU0MsVUFBVSxFQUFFQyxZQUFZLFFBQVEsVUFBVTtBQUNuRCxTQUFTQyxJQUFJLFFBQVEsWUFBWTtBQUNqQyxTQUFTQyxJQUFJLFFBQVEseUJBQXlCO0FBQzlDLFNBQVNDLGdCQUFnQixRQUFRLHdCQUF3QjtBQUl6RCxZQUFZQyxjQUFjLGlCQUFpQjtBQUUzQyxxRUFBcUUsR0FDckUsTUFBTUMsb0JBQW9CO0lBQ3pCO0lBQ0E7Q0FDQTtBQUVELDhFQUE4RSxHQUM5RSxNQUFNQyxpQkFBaUI7SUFDdEI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7Q0FDQSxDQUFDTCxJQUFJLENBQUM7QUFRUCxlQUFlTSxXQUNkQyxVQUE2QixFQUM3QkMsVUFBbUM7SUFFbkMsSUFBSUEsV0FBV0MsZUFBZSxJQUFJLE1BQU0sT0FBTyxDQUFDO0lBRWhELE1BQU1DLFVBQVU7UUFDZjtZQUFFQyxPQUFPO1lBQWlCQyxhQUFhO1FBQU87UUFDOUM7WUFDQ0QsT0FBTztZQUNQQyxhQUFhO1FBQ2Q7UUFDQTtZQUNDRCxPQUFPO1lBQ1BDLGFBQWE7UUFDZDtLQUNBO0lBQ0QsTUFBTUMsV0FBVyxNQUFNWixLQUN0QixpQkFDQVMsU0FDQSxDQUFDSSxJQUFNLEdBQUdBLEVBQUVILEtBQUssQ0FBQyxHQUFHLEVBQUVHLEVBQUVGLFdBQVcsRUFBRTtJQUV2QyxNQUFNRyxXQUFXRixVQUFVRixTQUFTO0lBRXBDLElBQUlJLGFBQWEsUUFBUSxPQUFPO1FBQUVOLGlCQUFpQjtJQUFPO0lBQzFELElBQUlNLGFBQWEsU0FBUyxPQUFPO1FBQUVOLGlCQUFpQjtJQUFRO0lBRTVELE1BQU1PLFNBQ0xDLFFBQVFDLEdBQUcsQ0FB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
253
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL3Bvc3RtYW4uZmVhdHVyZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHBpY2sgfSBmcm9tIFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiO1xuaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlU2NhZmZvbGQgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3Byb2plY3QubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgRmVhdHVyZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zY2FmZm9sZC5zZXJ2aWNlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEF1dGhDb25maWdNb2RlbCB9IGZyb20gXCIuLi9tb2RlbHMvYXV0aC1jb25maWcubW9kZWwuanNcIjtcbmltcG9ydCB7IGJ1aWxkSGVsbG9PcGVuQXBpRG9jdW1lbnQgfSBmcm9tIFwiLi4vcG9zdG1hbi9oZWxsby1vcGVuYXBpLmpzXCI7XG5pbXBvcnQge1xuXHRidWlsZEVudmlyb25tZW50WWFtbCxcblx0YnVpbGRMb2NhbFZpZXdGaWxlc0Zyb21Db2xsZWN0aW9uLFxufSBmcm9tIFwiLi4vcG9zdG1hbi9sb2NhbC12aWV3LmpzXCI7XG5pbXBvcnQge1xuXHR0eXBlIEF1dGgwRW52LFxuXHRhcHBseVBvc3RtYW5BdXRoT3ZlcmxheSxcblx0b3BlbkFwaVRvUG9zdG1hbkNvbGxlY3Rpb24sXG59IGZyb20gXCIuLi9wb3N0bWFuL29wZW5hcGktdG8tcG9zdG1hbi5qc1wiO1xuaW1wb3J0ICogYXMgYXV0aDBDbGkgZnJvbSBcIi4vYXV0aDAtY2xpLmpzXCI7XG5cbi8qKiBQb3N0bWFuIE9BdXRoIGNhbGxiYWNrIFVSTHMgKHBvcHVwICsgXCJBdXRob3JpemUgdXNpbmcgYnJvd3NlclwiKS4gKi9cbmNvbnN0IFBPU1RNQU5fQ0FMTEJBQ0tTID0gW1xuXHRcImh0dHBzOi8vb2F1dGgucHN0bW4uaW8vdjEvY2FsbGJhY2tcIixcblx0XCJodHRwczovL29hdXRoLnBzdG1uLmlvL3YxL2Jyb3dzZXItY2FsbGJhY2tcIixcbl0gYXMgY29uc3Q7XG5cbi8qKiBTY29wZXMgcmVxdWVzdGVkIGZvciBBdXRoMCBhY2Nlc3MgdG9rZW5zIChPSURDICsgSGVsbG8gQ0FTTCBwZXJtaXNzaW9ucykuICovXG5jb25zdCBQT1NUTUFOX1NDT1BFUyA9IFtcblx0XCJvcGVuaWRcIixcblx0XCJwcm9maWxlXCIsXG5cdFwiZW1haWxcIixcblx0XCJyZWFkOkhlbGxvXCIsXG5cdFwiY3JlYXRlOkhlbGxvXCIsXG5cdFwidXBkYXRlOkhlbGxvXCIsXG5cdFwiZGVsZXRlOkhlbGxvXCIsXG5dLmpvaW4oXCIgXCIpO1xuXG5jb25zdCBDT0xMRUNUSU9OX0RFU0NSSVBUSU9OID1cblx0XCJPcGVuIHRoZSBwcm9qZWN0IHJvb3QgaW4gUG9zdG1hbiBMb2NhbCBWaWV3IChub3QgdGhlIHBvc3RtYW4vIGZvbGRlcikuIFwiICtcblx0XCJTZWxlY3QgdGhlIExvY2FsIGVudmlyb25tZW50LCB0aGVuIEF1dGhvcml6YXRpb24g4oaSIEdldCBOZXcgQWNjZXNzIFRva2VuIChQS0NFKS4gXCIgK1xuXHRcIlJvdXRlcyBhcmUgZ2VuZXJhdGVkIGZyb20gT3BlbkFQSTsgQXV0aDAgb3ZlcmxheSBpcyBoYW5kLWF1dGhvcmVkLlwiO1xuXG5leHBvcnQgdHlwZSBQb3N0bWFuT3B0aW9ucyA9IHtcblx0cG9zdG1hblByb3ZpZGVyPzogXCJhcGlcIiB8IFwibG9jYWxcIiB8IFwibm9uZVwiO1xuXHRhcGlLZXk/OiBzdHJpbmc7XG5cdHdvcmtzcGFjZUlkPzogc3RyaW5nO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0T3B0aW9ucyhcblx0X3dvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsXG5cdGNsaU9wdGlvbnM6IFBhcnRpYWw8UG9zdG1hbk9wdGlvbnM+LFxuKTogUHJvbWlzZTxQYXJ0aWFsPFBvc3RtYW5PcHRpb25zPj4ge1xuXHRpZiAoY2xpT3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgIT0gbnVsbCkgcmV0dXJuIHt9O1xuXG5cdGNvbnN0IGNob2ljZXMgPSBbXG5cdFx0eyBsYWJlbDogXCJub25lXCIgYXMgY29uc3QsIGRlc2NyaXB0aW9uOiBcInNraXBcIiB9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiBcImxvY2FsXCIgYXMgY29uc3QsXG5cdFx0XHRkZXNjcmlwdGlvbjogXCJMb2NhbCBWaWV3IC8gTmF0aXZlIEdpdCBmaWxlcyAobm8gQVBJIGtleSlcIixcblx0XHR9LFxuXHRcdHtcblx0XHRcdGxhYmVsOiBcImFwaVwiIGFzIGNvbnN0LFxuXHRcdFx0ZGVzY3JpcHRpb246IFwiYWxzbyB1cGxvYWQgdG8gUG9zdG1hbi5jb20gKG5lZWRzIEFQSSBrZXkpXCIsXG5cdFx0fSxcblx0XTtcblx0Y29uc3Qgc2VsZWN0ZWQgPSBhd2FpdCBwaWNrKFxuXHRcdFwiXFxuICBQb3N0bWFuOiBcIixcblx0XHRjaG9pY2VzLFxuXHRcdChjKSA9PiBgJHtjLmxhYmVsfSDigJQgJHtjLmRlc2NyaXB0aW9ufWAsXG5cdCk7XG5cdGNvbnN0IHByb3ZpZGVyID0gc2VsZWN0ZWQ/LmxhYmVsID8/IFwibm9uZVwiO1xuXG5cdGlmIChwcm92aWRlciA9PT0gXCJub25lXCIpIHJldHVybiB7IHBvc3RtYW5Qcm92aWRlcjogXCJub25lXCIgfTtcblx0aWYgKHByb3ZpZGVyID09PSBcImxvY2FsXCIpIHJldHVybiB7IHBvc3RtYW5Qcm92aWRlcjogXCJsb2NhbFwiIH07XG5cblx0Y29uc3QgYXBpS2V5ID1cblx0XHRwcm9jZXNzLmVudi5QT1NUTUFOX0FQSV9LRVkgPz9cblx0XHQoYXdhaXQgaW1wb3J0KFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiKS50aGVuKChtKSA9PlxuXHRcdFx0bS5hc2soXCJcXG4gIFBvc3RtYW4gQVBJIGtleSAoYXBwLmdldHBvc3RtYW4uY29tL3NldHRpbmdzL21lL2FwaS1rZXlzKTogXCIpLFxuXHRcdCkpO1xuXG5cdGNvbnN0IGhlYWRlcnMgPSB7IFwiWC1BcGktS2V5XCI6IGFwaUtleSwgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfTtcblx0Y29uc3Qgd3NSZXMgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vYXBpLmdldHBvc3RtYW4uY29tL3dvcmtzcGFjZXNcIiwgeyBoZWFkZXJzIH0pO1xuXG5cdGlmICghd3NSZXMub2spIHtcblx0XHRjb25zb2xlLmVycm9yKFwiXFxuICBQb3N0bWFuIEFQSSBrZXkgaW52YWxpZCDigJQgZmFsbGluZyBiYWNrIHRvIGxvY2FsIGZpbGVzLlwiKTtcblx0XHRyZXR1cm4geyBwb3N0bWFuUHJvdmlkZXI6IFwibG9jYWxcIiB9O1xuXHR9XG5cblx0Y29uc3QgeyB3b3Jrc3BhY2VzIH0gPSAoYXdhaXQgd3NSZXMuanNvbigpKSBhcyB7XG5cdFx0d29ya3NwYWNlczogQXJyYXk8eyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9Pjtcblx0fTtcblxuXHR0eXBlIFdzQ2hvaWNlID0geyBsYWJlbDogc3RyaW5nOyBpZDogc3RyaW5nIHwgbnVsbCB9O1xuXHRjb25zdCB3c0Nob2ljZXM6IFdzQ2hvaWNlW10gPSBbXG5cdFx0eyBsYWJlbDogXCI8bmV3IHdvcmtzcGFjZT5cIiwgaWQ6IG51bGwgfSxcblx0XHQuLi53b3Jrc3BhY2VzLm1hcCgodykgPT4gKHsgbGFiZWw6IGAke3cubmFtZX0gKCR7dy50eXBlfSlgLCBpZDogdy5pZCB9KSksXG5cdF07XG5cblx0Y29uc3Qgd3NQaWNrZWQgPSBhd2FpdCBwaWNrKFwiXFxuICBQb3N0bWFuIHdvcmtzcGFjZTogXCIsIHdzQ2hvaWNlcywgKGMpID0+IGMubGFiZWwpO1xuXG5cdGxldCB3b3Jrc3BhY2VJZDogc3RyaW5nO1xuXHRpZiAoIXdzUGlja2VkIHx8IHdzUGlja2VkLmlkID09PSBudWxsKSB7XG5cdFx0Y29uc3QgeyBhc2sgfSA9IGF3YWl0IGltcG9ydChcIi4uLy4uL2RvbWFpbi9wcm9tcHQuanNcIik7XG5cdFx0Y29uc3Qgd3NOYW1lID0gYXdhaXQgYXNrKGAgIFdvcmtzcGFjZSBuYW1lOiBgKTtcblx0XHRjb25zdCBjcmVhdGVSZXMgPSBhd2FpdCBmZXRjaChcImh0dHBzOi8vYXBpLmdldHBvc3RtYW4uY29tL3dvcmtzcGFjZXNcIiwge1xuXHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdGhlYWRlcnMsXG5cdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7IHdvcmtzcGFjZTogeyBuYW1lOiB3c05hbWUsIHR5cGU6IFwicGVyc29uYWxcIiB9IH0pLFxuXHRcdH0pO1xuXHRcdGNvbnN0IHsgd29ya3NwYWNlOiB3cyB9ID0gKGF3YWl0IGNyZWF0ZVJlcy5qc29uKCkpIGFzIHsgd29ya3NwYWNlOiB7IGlkOiBzdHJpbmcgfSB9O1xuXHRcdHdvcmtzcGFjZUlkID0gd3MuaWQ7XG5cdFx0Y29uc29sZS5sb2coYCAg4pyTIFdvcmtzcGFjZSBjcmVhdGVkOiAke3dzTmFtZX1gKTtcblx0fSBlbHNlIHtcblx0XHR3b3Jrc3BhY2VJZCA9IHdzUGlja2VkLmlkO1xuXHR9XG5cblx0cmV0dXJuIHsgcG9zdG1hblByb3ZpZGVyOiBcImFwaVwiLCBhcGlLZXksIHdvcmtzcGFjZUlkIH07XG59XG5cbi8qKiBCdWlsZCBQb3N0bWFuIGNvbGxlY3Rpb246IE9wZW5BUEkgcm91dGVzICsgQXV0aDAgYXV0aCBvdmVybGF5LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkSHlicmlkUG9zdG1hbkNvbGxlY3Rpb24ocHJvamVjdE5hbWU6IHN0cmluZywgYXV0aD86IEF1dGgwRW52KSB7XG5cdGNvbnN0IG9wZW5hcGkgPSBidWlsZEhlbGxvT3BlbkFwaURvY3VtZW50KHByb2plY3ROYW1lKTtcblx0Y29uc3QgYmFzZSA9IGF3YWl0IG9wZW5BcGlUb1Bvc3RtYW5Db2xsZWN0aW9uKG9wZW5hcGkpO1xuXHRpZiAoYmFzZS5pbmZvLl9wb3N0bWFuX2lkID09IG51bGwpIHtcblx0XHRiYXNlLmluZm8uX3Bvc3RtYW5faWQgPSByYW5kb21VVUlEKCk7XG5cdH1cblx0cmV0dXJuIGFwcGx5UG9zdG1hbkF1dGhPdmVybGF5KGJhc2UsIHByb2plY3ROYW1lLCBhdXRoLCB7XG5cdFx0Y2FsbGJhY2tzOiBQT1NUTUFOX0NBTExCQUNLUyxcblx0XHRzY29wZXM6IFBPU1RNQU5fU0NPUEVTLFxuXHRcdGRlc2NyaXB0aW9uOiBDT0xMRUNUSU9OX0RFU0NSSVBUSU9OLFxuXHR9KTtcbn1cblxuLyoqIFJlYWQgYSBwcmV2aW91c2x5IHNjYWZmb2xkZWQgYXV0aDBDbGllbnRJZCBzbyByZS1zY2FmZm9sZCBuZXZlciBibGFua3MgaXQuICovXG5mdW5jdGlvbiByZWFkRXhpc3RpbmdTcGFDbGllbnRJZCh0YXJnZXREaXI6IHN0cmluZywgcHJvamVjdE5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cdGNvbnN0IGVudlBhdGggPSBqb2luKFxuXHRcdHRhcmdldERpcixcblx0XHRcInBvc3RtYW4vZW52aXJvbm1lbnRzXCIsXG5cdFx0YCR7cHJvamVjdE5hbWV9LUxvY2FsLmVudmlyb25tZW50LnlhbWxgLFxuXHQpO1xuXHRpZiAoIWV4aXN0c1N5bmMoZW52UGF0aCkpIHJldHVybiB1bmRlZmluZWQ7XG5cdGNvbnN0IHRleHQgPSByZWFkRmlsZVN5bmMoZW52UGF0aCwgXCJ1dGY4XCIpO1xuXHRjb25zdCBtYXRjaCA9IHRleHQubWF0Y2goL2tleTpcXHMqYXV0aDBDbGllbnRJZFxccypcXG5cXHMqdmFsdWU6XFxzKltcIiddPyhbXlwiJ1xcbl0rKS8pO1xuXHRjb25zdCB2YWx1ZSA9IG1hdGNoPy5bMV0/LnRyaW0oKTtcblx0cmV0dXJuIHZhbHVlICYmIHZhbHVlLmxlbmd0aCA+IDAgPyB2YWx1ZSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBQb3N0bWFuIFNQQSBjbGllbnQgaWQuIE5ldmVyIHJldHVybnMgZW1wdHkg4oCUIHByZXNlcnZlcyBhbiBleGlzdGluZ1xuICogZW52IHZhbHVlIG9uIEF1dGgwIGZhaWx1cmUsIG90aGVyd2lzZSB0aHJvd3Mgc28gd2UgZG8gbm90IHdyaXRlIGEgYmxhbmsgZW52LlxuICovXG5mdW5jdGlvbiByZXNvbHZlU3BhQ2xpZW50SWQod29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCk6IHN0cmluZyB7XG5cdGNvbnN0IGFwcE5hbWUgPSBgJHt3b3Jrc3BhY2UubmFtZX0gUG9zdG1hbmA7XG5cdHRyeSB7XG5cdFx0Y29uc3QgYXBwID0gYXV0aDBDbGkuZW5zdXJlU3BhQXBwKGFwcE5hbWUsIFsuLi5QT1NUTUFOX0NBTExCQUNLU10pO1xuXHRcdGNvbnNvbGUubG9nKFxuXHRcdFx0YXBwLnJldXNlZFxuXHRcdFx0XHQ/IGAgIOKckyBSZXVzaW5nIEF1dGgwIFNQQSBhcHAgZm9yIFBvc3RtYW4gUEtDRSAoJHthcHAuY2xpZW50X2lkfSlgXG5cdFx0XHRcdDogYCAg4pyTIEF1dGgwIFNQQSBhcHAgY3JlYXRlZCBmb3IgUG9zdG1hbiBQS0NFICgke2FwcC5jbGllbnRfaWR9KWAsXG5cdFx0KTtcblx0XHR0cnkge1xuXHRcdFx0YXV0aDBDbGkuZW5hYmxlQ29ubmVjdGlvbkZvckNsaWVudChhdXRoMENsaS5EQl9DT05ORUNUSU9OX05BTUUsIGFwcC5jbGllbnRfaWQpO1xuXHRcdFx0Y29uc29sZS5sb2coYCAg4pyTIEVuYWJsZWQgJHthdXRoMENsaS5EQl9DT05ORUNUSU9OX05BTUV9IG9uIFBvc3RtYW4gU1BBYCk7XG5cdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFxuXHRcdFx0XHRgICDinJcgRmFpbGVkIHRvIGVuYWJsZSBEQiBjb25uZWN0aW9uIG9uIFNQQTogJHtlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogZXJyfWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gYXBwLmNsaWVudF9pZDtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Y29uc3QgZXhpc3RpbmcgPSByZWFkRXhpc3RpbmdTcGFDbGllbnRJZCh3b3Jrc3BhY2UudGFyZ2V0RGlyLCB3b3Jrc3BhY2UubmFtZSk7XG5cdFx0aWYgKGV4aXN0aW5nKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFxuXHRcdFx0XHRgICDinJcgRmFpbGVkIHRvIGVuc3VyZSBBdXRoMCBTUEEgYXBwICgke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBlcnJ9KWAsXG5cdFx0XHQpO1xuXHRcdFx0Y29uc29sZS5sb2coYCAg4pyTIEtlZXBpbmcgZXhpc3RpbmcgYXV0aDBDbGllbnRJZCBmcm9tIFBvc3RtYW4gZW52aXJvbm1lbnQgKCR7ZXhpc3Rpbmd9KWApO1xuXHRcdFx0cmV0dXJuIGV4aXN0aW5nO1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRgRmFpbGVkIHRvIGVuc3VyZSBBdXRoMCBTUEEgYXBwIGZvciBQb3N0bWFuIOKAlCBhdXRoMENsaWVudElkIHdvdWxkIGJlIGVtcHR5OiAke1xuXHRcdFx0XHRlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogZXJyXG5cdFx0XHR9YCxcblx0XHQpO1xuXHR9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkKHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsIG9wdGlvbnM6IFBvc3RtYW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG5cdGlmIChvcHRpb25zLnBvc3RtYW5Qcm92aWRlciA9PT0gXCJub25lXCIgfHwgb3B0aW9ucy5wb3N0bWFuUHJvdmlkZXIgPT0gbnVsbCkgcmV0dXJuO1xuXG5cdGNvbnN0IGF1dGhDb25maWdNb2RlbCA9IHdvcmtzcGFjZS5nZXRNb2RlbDxBdXRoQ29uZmlnTW9kZWw+KFdFTExfS05PV05fRklMRVMuQVVUSF9DT05GSUcpO1xuXHRjb25zdCBhdXRoQ2ZnID0gYXV0aENvbmZpZ01vZGVsPy5jb25maWc7XG5cblx0Y29uc3Qgc3BhQ2xpZW50SWQgPSBhdXRoQ2ZnPy5pc3N1ZXJCYXNlVXJsID8gcmVzb2x2ZVNwYUNsaWVudElkKHdvcmtzcGFjZSkgOiB1bmRlZmluZWQ7XG5cblx0Y29uc3QgYXV0aDBFbnY6IEF1dGgwRW52IHwgdW5kZWZpbmVkID0gYXV0aENmZz8uaXNzdWVyQmFzZVVybFxuXHRcdD8ge1xuXHRcdFx0XHRhdXRoMERvbWFpbjogYXV0aENmZy5pc3N1ZXJCYXNlVXJsLnJlcGxhY2UoL15odHRwcz86XFwvXFwvLywgXCJcIiksXG5cdFx0XHRcdGF1dGgwQXVkaWVuY2U6IGF1dGhDZmcuYXVkaWVuY2UsXG5cdFx0XHRcdGF1dGgwQ2xpZW50SWQ6IHNwYUNsaWVudElkLFxuXHRcdFx0fVxuXHRcdDogdW5kZWZpbmVkO1xuXG5cdGNvbnN0IHByb2plY3ROYW1lID0gd29ya3NwYWNlLm5hbWU7XG5cdGNvbnN0IGVudk5hbWUgPSBgJHtwcm9qZWN0TmFtZX0gTG9jYWxgO1xuXHRjb25zdCBjb2xsZWN0aW9uID0gYXdhaXQgYnVpbGRIeWJyaWRQb3N0bWFuQ29sbGVjdGlvbihwcm9qZWN0TmFtZSwgYXV0aDBFbnYpO1xuXHRjb25zdCBsb2NhbEZpbGVzID0gYnVpbGRMb2NhbFZpZXdGaWxlc0Zyb21Db2xsZWN0aW9uKGNvbGxlY3Rpb24sIHByb2plY3ROYW1lLCBhdXRoMEVudiwge1xuXHRcdGNhbGxiYWNrczogUE9TVE1BTl9DQUxMQkFDS1MsXG5cdFx0c2NvcGVzOiBQT1NUTUFOX1NDT1BFUyxcblx0fSk7XG5cdGNvbnN0IGVudllhbWwgPSBidWlsZEVudmlyb25tZW50WWFtbChlbnZOYW1lLCBhdXRoMEVudiwge1xuXHRcdGNhbGxiYWNrczogUE9TVE1BTl9DQUxMQkFDS1MsXG5cdFx0c2NvcGVzOiBQT1NUTUFOX1NDT1BFUyxcblx0fSk7XG5cblx0d29ya3NwYWNlLmFkZEZpbGUoe1xuXHRcdGZpbGVzOiAoKSA9PiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcIi5wb3N0bWFuL3Jlc291cmNlcy55YW1sXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IFtcblx0XHRcdFx0XHRcIiMgT3BlbiB0aGlzIHByb2plY3Qgcm9vdCBpbiBQb3N0bWFuIChGaWxlcyDihpIgT3BlbiBmb2xkZXIpLCBub3QgdGhlIHBvc3RtYW4vIHN1YmZvbGRlci5cIixcblx0XHRcdFx0XHRcIiMgUG9zdG1hbiBmaWxscyB3b3Jrc3BhY2UuaWQgd2hlbiB5b3UgY29ubmVjdCBMb2NhbCBWaWV3LlwiLFxuXHRcdFx0XHRcdFwiI1wiLFxuXHRcdFx0XHRcdFwiIyBBbGwgcmVzb3VyY2VzIHVuZGVyIHBvc3RtYW4vIGFyZSByZWdpc3RlcmVkIGF1dG9tYXRpY2FsbHkuXCIsXG5cdFx0XHRcdFx0XCIjIFJvdXRlIHJlcXVlc3RzIGFyZSBnZW5lcmF0ZWQgZnJvbSBPcGVuQVBJOyBBdXRoMCBvdmVybGF5IGlzIGhhbmQtYXV0aG9yZWQuXCIsXG5cdFx0XHRcdFx0XCJcIixcblx0XHRcdFx0XS5qb2luKFwiXFxuXCIpLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IGBwb3N0bWFuL2Vudmlyb25tZW50cy8ke3Byb2plY3ROYW1lfS1Mb2NhbC5lbnZpcm9ubWVudC55YW1sYCxcblx0XHRcdFx0Y29udGVudDogZW52WWFtbCxcblx0XHRcdH0sXG5cdFx0XHQuLi5sb2NhbEZpbGVzLFxuXHRcdF0sXG5cdH0pO1xuXG5cdGlmIChvcHRpb25zLnBvc3RtYW5Qcm92aWRlciA9PT0gXCJhcGlcIiAmJiBvcHRpb25zLmFwaUtleSkge1xuXHRcdGNvbnN0IGhlYWRlcnMgPSB7IFwiWC1BcGktS2V5XCI6IG9wdGlvbnMuYXBpS2V5LCBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9O1xuXG5cdFx0Y29uc3QgY29sUmVzID0gYXdhaXQgZmV0Y2goXG5cdFx0XHRgaHR0cHM6Ly9hcGkuZ2V0cG9zdG1hbi5jb20vY29sbGVjdGlvbnM/d29ya3NwYWNlPSR7b3B0aW9ucy53b3Jrc3BhY2VJZH1gLFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRoZWFkZXJzLFxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvbGxlY3Rpb24gfSksXG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0aWYgKGNvbFJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBQb3N0bWFuIGNvbGxlY3Rpb24gdXBsb2FkZWRcIik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCIgIOKclyBGYWlsZWQgdG8gdXBsb2FkIFBvc3RtYW4gY29sbGVjdGlvblwiKTtcblx0XHR9XG5cblx0XHRjb25zdCBlbnZWYWx1ZXMgPSBbXG5cdFx0XHR7IGtleTogXCJiYXNlVXJsXCIsIHZhbHVlOiBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMFwiLCBlbmFibGVkOiB0cnVlIH0sXG5cdFx0XHQuLi4oYXV0aDBFbnY/LmF1dGgwRG9tYWluXG5cdFx0XHRcdD8gW1xuXHRcdFx0XHRcdFx0eyBrZXk6IFwiYXV0aDBEb21haW5cIiwgdmFsdWU6IGF1dGgwRW52LmF1dGgwRG9tYWluLCBlbmFibGVkOiB0cnVlIH0sXG5cdFx0XHRcdFx0XHR7IGtleTogXCJhdXRoMEF1ZGllbmNlXCIsIHZhbHVlOiBhdXRoMEVudi5hdXRoMEF1ZGllbmNlID8/IFwiXCIsIGVuYWJsZWQ6IHRydWUgfSxcblx0XHRcdFx0XHRcdHsga2V5OiBcImF1dGgwQ2xpZW50SWRcIiwgdmFsdWU6IGF1dGgwRW52LmF1dGgwQ2xpZW50SWQgPz8gXCJcIiwgZW5hYmxlZDogdHJ1ZSB9LFxuXHRcdFx0XHRcdF1cblx0XHRcdFx0OiBbXSksXG5cdFx0XTtcblx0XHRjb25zdCBlbnZSZXMgPSBhd2FpdCBmZXRjaChcblx0XHRcdGBodHRwczovL2FwaS5nZXRwb3N0bWFuLmNvbS9lbnZpcm9ubWVudHM/d29ya3NwYWNlPSR7b3B0aW9ucy53b3Jrc3BhY2VJZH1gLFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRoZWFkZXJzLFxuXHRcdFx0XHRib2R5OiBKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdFx0ZW52aXJvbm1lbnQ6IHsgbmFtZTogZW52TmFtZSwgdmFsdWVzOiBlbnZWYWx1ZXMgfSxcblx0XHRcdFx0fSksXG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0aWYgKGVudlJlcy5vaykge1xuXHRcdFx0Y29uc29sZS5sb2coXCIgIOKckyBQb3N0bWFuIGVudmlyb25tZW50IHVwbG9hZGVkXCIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKFwiICDinJcgRmFpbGVkIHRvIHVwbG9hZCBQb3N0bWFuIGVudmlyb25tZW50XCIpO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgY29uc3QgUG9zdG1hbkZlYXR1cmU6IEZlYXR1cmU8UG9zdG1hbk9wdGlvbnM+ID0geyBnZXRPcHRpb25zLCBzY2FmZm9sZCB9O1xuZXhwb3J0IHsgYnVpbGRIZWxsb09wZW5BcGlEb2N1bWVudCB9IGZyb20gXCIuLi9wb3N0bWFuL2hlbGxvLW9wZW5hcGkuanNcIjtcbmV4cG9ydCB7IFBPU1RNQU5fQ0FMTEJBQ0tTLCBQT1NUTUFOX1NDT1BFUyB9O1xuIl0sIm5hbWVzIjpbInJhbmRvbVVVSUQiLCJleGlzdHNTeW5jIiwicmVhZEZpbGVTeW5jIiwiam9pbiIsInBpY2siLCJXRUxMX0tOT1dOX0ZJTEVTIiwiYnVpbGRIZWxsb09wZW5BcGlEb2N1bWVudCIsImJ1aWxkRW52aXJvbm1lbnRZYW1sIiwiYnVpbGRMb2NhbFZpZXdGaWxlc0Zyb21Db2xsZWN0aW9uIiwiYXBwbHlQb3N0bWFuQXV0aE92ZXJsYXkiLCJvcGVuQXBpVG9Qb3N0bWFuQ29sbGVjdGlvbiIsImF1dGgwQ2xpIiwiUE9TVE1BTl9DQUxMQkFDS1MiLCJQT1NUTUFOX1NDT1BFUyIsIkNPTExFQ1RJT05fREVTQ1JJUFRJT04iLCJnZXRPcHRpb25zIiwiX3dvcmtzcGFjZSIsImNsaU9wdGlvbnMiLCJwb3N0bWFuUHJvdmlkZXIiLCJjaG9pY2VzIiwibGFiZWwiLCJkZXNjcmlwdGlvbiIsInNlbGVjdGVkIiwiYyIsInByb3ZpZGVyIiwiYXBpS2V5IiwicHJvY2VzcyIsImVudiIsIlBPU1RNQU5fQVBJX0tFWSIsInRoZW4iLCJtIiwiYXNrIiwiaGVhZGVycyIsIndzUmVzIiwiZmV0Y2giLCJvayIsImNvbnNvbGUiLCJlcnJvciIsIndvcmtzcGFjZXMiLCJqc29uIiwid3NDaG9pY2VzIiwiaWQiLCJtYXAiLCJ3IiwibmFtZSIsInR5cGUiLCJ3c1BpY2tlZCIsIndvcmtzcGFjZUlkIiwid3NOYW1lIiwiY3JlYXRlUmVzIiwibWV0aG9kIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJ3b3Jrc3BhY2UiLCJ3cyIsImxvZyIsImJ1aWxkSHlicmlkUG9zdG1hbkNvbGxlY3Rpb24iLCJwcm9qZWN0TmFtZSIsImF1dGgiLCJvcGVuYXBpIiwiYmFzZSIsImluZm8iLCJfcG9zdG1hbl9pZCIsImNhbGxiYWNrcyIsInNjb3BlcyIsInJlYWRFeGlzdGluZ1NwYUNsaWVudElkIiwidGFyZ2V0RGlyIiwiZW52UGF0aCIsInVuZGVmaW5lZCIsInRleHQiLCJtYXRjaCIsInZhbHVlIiwidHJpbSIsImxlbmd0aCIsInJlc29sdmVTcGFDbGllbnRJZCIsImFwcE5hbWUiLCJhcHAiLCJlbnN1cmVTcGFBcHAiLCJyZXVzZWQiLCJjbGllbnRfaWQiLCJlbmFibGVDb25uZWN0aW9uRm9yQ2xpZW50IiwiREJfQ09OTkVDVElPTl9OQU1FIiwiZXJyIiwiRXJyb3IiLCJtZXNzYWdlIiwiZXhpc3RpbmciLCJzY2FmZm9sZCIsIm9wdGlvbnMiLCJhdXRoQ29uZmlnTW9kZWwiLCJnZXRNb2RlbCIsIkFVVEhfQ09ORklHIiwiYXV0aENmZyIsImNvbmZpZyIsInNwYUNsaWVudElkIiwiaXNzdWVyQmFzZVVybCIsImF1dGgwRW52IiwiYXV0aDBEb21haW4iLCJyZXBsYWNlIiwiYXV0aDBBdWRpZW5jZSIsImF1ZGllbmNlIiwiYXV0aDBDbGllbnRJZCIsImVudk5hbWUiLCJjb2xsZWN0aW9uIiwibG9jYWxGaWxlcyIsImVudllhbWwiLCJhZGRGaWxlIiwiZmlsZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJjb2xSZXMiLCJlbnZWYWx1ZXMiLCJrZXkiLCJlbmFibGVkIiwiZW52UmVzIiwiZW52aXJvbm1lbnQiLCJ2YWx1ZXMiLCJQb3N0bWFuRmVhdHVyZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsVUFBVSxRQUFRLGNBQWM7QUFDekMsU0FBU0MsVUFBVSxFQUFFQyxZQUFZLFFBQVEsVUFBVTtBQUNuRCxTQUFTQyxJQUFJLFFBQVEsWUFBWTtBQUNqQyxTQUFTQyxJQUFJLFFBQVEseUJBQXlCO0FBQzlDLFNBQVNDLGdCQUFnQixRQUFRLHdCQUF3QjtBQUl6RCxTQUFTQyx5QkFBeUIsUUFBUSw4QkFBOEI7QUFDeEUsU0FDQ0Msb0JBQW9CLEVBQ3BCQyxpQ0FBaUMsUUFDM0IsMkJBQTJCO0FBQ2xDLFNBRUNDLHVCQUF1QixFQUN2QkMsMEJBQTBCLFFBQ3BCLG1DQUFtQztBQUMxQyxZQUFZQyxjQUFjLGlCQUFpQjtBQUUzQyxxRUFBcUUsR0FDckUsTUFBTUMsb0JBQW9CO0lBQ3pCO0lBQ0E7Q0FDQTtBQUVELDhFQUE4RSxHQUM5RSxNQUFNQyxpQkFBaUI7SUFDdEI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7Q0FDQSxDQUFDVixJQUFJLENBQUM7QUFFUCxNQUFNVyx5QkFDTCw0RUFDQSxxRkFDQTtBQVFELGVBQWVDLFdBQ2RDLFVBQTZCLEVBQzdCQyxVQUFtQztJQUVuQyxJQUFJQSxXQUFXQyxlQUFlLElBQUksTUFBTSxPQUFPLENBQUM7SUFFaEQsTUFBTUMsVUFBVTtRQUNmO1lBQUVDLE9BQU87WUFBaUJDLGFBQWE7UUFBTztRQUM5QztZQUNDRCxPQUFPO1lBQ1BDLGFBQWE7UUFDZDtRQUNBO1lBQ0NELE9BQU87WUFDUEMsYUFBYTtRQUNkO0tBQ0E7SUFDRCxNQUFNQyxXQUFXLE1BQU1sQixLQUN0QixpQkFDQWUsU0FDQSxDQUFDSSxJQUFNLEdBQUdBLEVBQUVILEtBQUssQ0FBQyxHQUFHLEVBQUVHLEVBQUVGLFdBQVcsRUFBRTtJQUV2QyxNQUFNRyxXQUFXRixVQUFVRixTQUFTO0lBRXBDLElBQUlJLGFBQWEsUUFBUSxPQUFPO1FBQUVOLGlCQUFpQjtJQUFPO0lBQzFELElBQUlNLGFBQWEsU0FBUyxPQUFPO1FBQUVOLGlCQUFpQjtJQUFRO0lBRTVELE1BQU1PLFNBQ0xDLFFBQVFDLEdBQUcsQ0FBQ0MsZUFBZSxJQUMxQixNQUFNLE1BQU0sQ0FBQywwQkFBMEJDLElBQUksQ0FBQyxDQUFDQyxJQUM3Q0EsRUFBRUMsR0FBRyxDQUFDO0lBR1IsTUFBTUMsVUFBVTtRQUFFLGFBQWFQO1FBQVEsZ0JBQWdCO0lBQW1CO0lBQzFFLE1BQU1RLFFBQVEsTUFBTUMsTUFBTSx5Q0FBeUM7UUFBRUY7SUFBUTtJQUU3RSxJQUFJLENBQUNDLE1BQU1FLEVBQUUsRUFBRTtRQUNkQyxRQUFRQyxLQUFLLENBQUM7UUFDZCxPQUFPO1lBQUVuQixpQkFBaUI7UUFBUTtJQUNuQztJQUVBLE1BQU0sRUFBRW9CLFVBQVUsRUFBRSxHQUFJLE1BQU1MLE1BQU1NLElBQUk7SUFLeEMsTUFBTUMsWUFBd0I7UUFDN0I7WUFBRXBCLE9BQU87WUFBbUJxQixJQUFJO1FBQUs7V0FDbENILFdBQVdJLEdBQUcsQ0FBQyxDQUFDQyxJQUFPLENBQUE7Z0JBQUV2QixPQUFPLEdBQUd1QixFQUFFQyxJQUFJLENBQUMsRUFBRSxFQUFFRCxFQUFFRSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUFFSixJQUFJRSxFQUFFRixFQUFFO1lBQUMsQ0FBQTtLQUNyRTtJQUVELE1BQU1LLFdBQVcsTUFBTTFDLEtBQUssMkJBQTJCb0MsV0FBVyxDQUFDakIsSUFBTUEsRUFBRUgsS0FBSztJQUVoRixJQUFJMkI7SUFDSixJQUFJLENBQUNELFlBQVlBLFNBQVNMLEVBQUUsS0FBSyxNQUFNO1FBQ3RDLE1BQU0sRUFBRVYsR0FBRyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUM7UUFDN0IsTUFBTWlCLFNBQVMsTUFBTWpCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUM3QyxNQUFNa0IsWUFBWSxNQUFNZixNQUFNLHlDQUF5QztZQUN0RWdCLFFBQVE7WUFDUmxCO1lBQ0FtQixNQUFNQyxLQUFLQyxTQUFTLENBQUM7Z0JBQUVDLFdBQVc7b0JBQUVWLE1BQU1JO29CQUFRSCxNQUFNO2dCQUFXO1lBQUU7UUFDdEU7UUFDQSxNQUFNLEVBQUVTLFdBQVdDLEVBQUUsRUFBRSxHQUFJLE1BQU1OLFVBQVVWLElBQUk7UUFDL0NRLGNBQWNRLEdBQUdkLEVBQUU7UUFDbkJMLFFBQVFvQixHQUFHLENBQUMsQ0FBQyx1QkFBdUIsRUFBRVIsUUFBUTtJQUMvQyxPQUFPO1FBQ05ELGNBQWNELFNBQVNMLEVBQUU7SUFDMUI7SUFFQSxPQUFPO1FBQUV2QixpQkFBaUI7UUFBT087UUFBUXNCO0lBQVk7QUFDdEQ7QUFFQSxtRUFBbUUsR0FDbkUsT0FBTyxlQUFlVSw2QkFBNkJDLFdBQW1CLEVBQUVDLElBQWU7SUFDdEYsTUFBTUMsVUFBVXRELDBCQUEwQm9EO0lBQzFDLE1BQU1HLE9BQU8sTUFBTW5ELDJCQUEyQmtEO0lBQzlDLElBQUlDLEtBQUtDLElBQUksQ0FBQ0MsV0FBVyxJQUFJLE1BQU07UUFDbENGLEtBQUtDLElBQUksQ0FBQ0MsV0FBVyxHQUFHL0Q7SUFDekI7SUFDQSxPQUFPUyx3QkFBd0JvRCxNQUFNSCxhQUFhQyxNQUFNO1FBQ3ZESyxXQUFXcEQ7UUFDWHFELFFBQVFwRDtRQUNSUSxhQUFhUDtJQUNkO0FBQ0Q7QUFFQSwrRUFBK0UsR0FDL0UsU0FBU29ELHdCQUF3QkMsU0FBaUIsRUFBRVQsV0FBbUI7SUFDdEUsTUFBTVUsVUFBVWpFLEtBQ2ZnRSxXQUNBLHdCQUNBLEdBQUdULFlBQVksdUJBQXVCLENBQUM7SUFFeEMsSUFBSSxDQUFDekQsV0FBV21FLFVBQVUsT0FBT0M7SUFDakMsTUFBTUMsT0FBT3BFLGFBQWFrRSxTQUFTO0lBQ25DLE1BQU1HLFFBQVFELEtBQUtDLEtBQUssQ0FBQztJQUN6QixNQUFNQyxRQUFRRCxPQUFPLENBQUMsRUFBRSxFQUFFRTtJQUMxQixPQUFPRCxTQUFTQSxNQUFNRSxNQUFNLEdBQUcsSUFBSUYsUUFBUUg7QUFDNUM7QUFFQTs7O0NBR0MsR0FDRCxTQUFTTSxtQkFBbUJyQixTQUE0QjtJQUN2RCxNQUFNc0IsVUFBVSxHQUFHdEIsVUFBVVYsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUMzQyxJQUFJO1FBQ0gsTUFBTWlDLE1BQU1sRSxTQUFTbUUsWUFBWSxDQUFDRixTQUFTO2VBQUloRTtTQUFrQjtRQUNqRXdCLFFBQVFvQixHQUFHLENBQ1ZxQixJQUFJRSxNQUFNLEdBQ1AsQ0FBQyw0Q0FBNEMsRUFBRUYsSUFBSUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUMvRCxDQUFDLDRDQUE0QyxFQUFFSCxJQUFJRyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRW5FLElBQUk7WUFDSHJFLFNBQVNzRSx5QkFBeUIsQ0FBQ3RFLFNBQVN1RSxrQkFBa0IsRUFBRUwsSUFBSUcsU0FBUztZQUM3RTVDLFFBQVFvQixHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUU3QyxTQUFTdUUsa0JBQWtCLENBQUMsZUFBZSxDQUFDO1FBQ3hFLEVBQUUsT0FBT0MsS0FBSztZQUNiL0MsUUFBUUMsS0FBSyxDQUNaLENBQUMsMkNBQTJDLEVBQUU4QyxlQUFlQyxRQUFRRCxJQUFJRSxPQUFPLEdBQUdGLEtBQUs7UUFFMUY7UUFDQSxPQUFPTixJQUFJRyxTQUFTO0lBQ3JCLEVBQUUsT0FBT0csS0FBSztRQUNiLE1BQU1HLFdBQVdwQix3QkFBd0JaLFVBQVVhLFNBQVMsRUFBRWIsVUFBVVYsSUFBSTtRQUM1RSxJQUFJMEMsVUFBVTtZQUNibEQsUUFBUUMsS0FBSyxDQUNaLENBQUMsb0NBQW9DLEVBQUU4QyxlQUFlQyxRQUFRRCxJQUFJRSxPQUFPLEdBQUdGLElBQUksQ0FBQyxDQUFDO1lBRW5GL0MsUUFBUW9CLEdBQUcsQ0FBQyxDQUFDLDZEQUE2RCxFQUFFOEIsU0FBUyxDQUFDLENBQUM7WUFDdkYsT0FBT0E7UUFDUjtRQUNBLE1BQU0sSUFBSUYsTUFDVCxDQUFDLDJFQUEyRSxFQUMzRUQsZUFBZUMsUUFBUUQsSUFBSUUsT0FBTyxHQUFHRixLQUNwQztJQUVKO0FBQ0Q7QUFFQSxlQUFlSSxTQUFTakMsU0FBNEIsRUFBRWtDLE9BQXVCO0lBQzVFLElBQUlBLFFBQVF0RSxlQUFlLEtBQUssVUFBVXNFLFFBQVF0RSxlQUFlLElBQUksTUFBTTtJQUUzRSxNQUFNdUUsa0JBQWtCbkMsVUFBVW9DLFFBQVEsQ0FBa0JyRixpQkFBaUJzRixXQUFXO0lBQ3hGLE1BQU1DLFVBQVVILGlCQUFpQkk7SUFFakMsTUFBTUMsY0FBY0YsU0FBU0csZ0JBQWdCcEIsbUJBQW1CckIsYUFBYWU7SUFFN0UsTUFBTTJCLFdBQWlDSixTQUFTRyxnQkFDN0M7UUFDQUUsYUFBYUwsUUFBUUcsYUFBYSxDQUFDRyxPQUFPLENBQUMsZ0JBQWdCO1FBQzNEQyxlQUFlUCxRQUFRUSxRQUFRO1FBQy9CQyxlQUFlUDtJQUNoQixJQUNDekI7SUFFSCxNQUFNWCxjQUFjSixVQUFVVixJQUFJO0lBQ2xDLE1BQU0wRCxVQUFVLEdBQUc1QyxZQUFZLE1BQU0sQ0FBQztJQUN0QyxNQUFNNkMsYUFBYSxNQUFNOUMsNkJBQTZCQyxhQUFhc0M7SUFDbkUsTUFBTVEsYUFBYWhHLGtDQUFrQytGLFlBQVk3QyxhQUFhc0MsVUFBVTtRQUN2RmhDLFdBQVdwRDtRQUNYcUQsUUFBUXBEO0lBQ1Q7SUFDQSxNQUFNNEYsVUFBVWxHLHFCQUFxQitGLFNBQVNOLFVBQVU7UUFDdkRoQyxXQUFXcEQ7UUFDWHFELFFBQVFwRDtJQUNUO0lBRUF5QyxVQUFVb0QsT0FBTyxDQUFDO1FBQ2pCQyxPQUFPLElBQU07Z0JBQ1o7b0JBQ0NDLFVBQVU7b0JBQ1ZDLFNBQVM7d0JBQ1I7d0JBQ0E7d0JBQ0E7d0JBQ0E7d0JBQ0E7d0JBQ0E7cUJBQ0EsQ0FBQzFHLElBQUksQ0FBQztnQkFDUjtnQkFDQTtvQkFDQ3lHLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRWxELFlBQVksdUJBQXVCLENBQUM7b0JBQ3RFbUQsU0FBU0o7Z0JBQ1Y7bUJBQ0dEO2FBQ0g7SUFDRjtJQUVBLElBQUloQixRQUFRdEUsZUFBZSxLQUFLLFNBQVNzRSxRQUFRL0QsTUFBTSxFQUFFO1FBQ3hELE1BQU1PLFVBQVU7WUFBRSxhQUFhd0QsUUFBUS9ELE1BQU07WUFBRSxnQkFBZ0I7UUFBbUI7UUFFbEYsTUFBTXFGLFNBQVMsTUFBTTVFLE1BQ3BCLENBQUMsaURBQWlELEVBQUVzRCxRQUFRekMsV0FBVyxFQUFFLEVBQ3pFO1lBQ0NHLFFBQVE7WUFDUmxCO1lBQ0FtQixNQUFNQyxLQUFLQyxTQUFTLENBQUM7Z0JBQUVrRDtZQUFXO1FBQ25DO1FBRUQsSUFBSU8sT0FBTzNFLEVBQUUsRUFBRTtZQUNkQyxRQUFRb0IsR0FBRyxDQUFDO1FBQ2IsT0FBTztZQUNOcEIsUUFBUUMsS0FBSyxDQUFDO1FBQ2Y7UUFFQSxNQUFNMEUsWUFBWTtZQUNqQjtnQkFBRUMsS0FBSztnQkFBV3hDLE9BQU87Z0JBQXlCeUMsU0FBUztZQUFLO2VBQzVEakIsVUFBVUMsY0FDWDtnQkFDQTtvQkFBRWUsS0FBSztvQkFBZXhDLE9BQU93QixTQUFTQyxXQUFXO29CQUFFZ0IsU0FBUztnQkFBSztnQkFDakU7b0JBQUVELEtBQUs7b0JBQWlCeEMsT0FBT3dCLFNBQVNHLGFBQWEsSUFBSTtvQkFBSWMsU0FBUztnQkFBSztnQkFDM0U7b0JBQUVELEtBQUs7b0JBQWlCeEMsT0FBT3dCLFNBQVNLLGFBQWEsSUFBSTtvQkFBSVksU0FBUztnQkFBSzthQUMzRSxHQUNBLEVBQUU7U0FDTDtRQUNELE1BQU1DLFNBQVMsTUFBTWhGLE1BQ3BCLENBQUMsa0RBQWtELEVBQUVzRCxRQUFRekMsV0FBVyxFQUFFLEVBQzFFO1lBQ0NHLFFBQVE7WUFDUmxCO1lBQ0FtQixNQUFNQyxLQUFLQyxTQUFTLENBQUM7Z0JBQ3BCOEQsYUFBYTtvQkFBRXZFLE1BQU0wRDtvQkFBU2MsUUFBUUw7Z0JBQVU7WUFDakQ7UUFDRDtRQUVELElBQUlHLE9BQU8vRSxFQUFFLEVBQUU7WUFDZEMsUUFBUW9CLEdBQUcsQ0FBQztRQUNiLE9BQU87WUFDTnBCLFFBQVFDLEtBQUssQ0FBQztRQUNmO0lBQ0Q7QUFDRDtBQUVBLE9BQU8sTUFBTWdGLGlCQUEwQztJQUFFdEc7SUFBWXdFO0FBQVMsRUFBRTtBQUNoRixTQUFTakYseUJBQXlCLFFBQVEsOEJBQThCO0FBQ3hFLFNBQVNNLGlCQUFpQixFQUFFQyxjQUFjLEdBQUcifQ==