@milkio/stargate 1.1.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/index.d.ts +5 -0
  2. package/index.js +40 -47
  3. package/package.json +1 -1
package/index.d.ts CHANGED
@@ -47,6 +47,7 @@ export type Ping = [
47
47
  export declare function createStargate<Generated extends {
48
48
  routeSchema: any;
49
49
  rejectCode: any;
50
+ events: any;
50
51
  }>(stargateOptions: MilkioStargateOptions): Promise<{
51
52
  options: MilkioStargateOptions;
52
53
  execute<Path extends keyof Generated["routeSchema"]>(path: Path, options: Mixin<ExecuteOptions<Generated["routeSchema"][Path]["types"]["result"]>, {
@@ -57,6 +58,10 @@ export declare function createStargate<Generated extends {
57
58
  __cookbook: {
58
59
  subscribe: (baseUrl: string) => Promise<any>;
59
60
  };
61
+ __astraEmitEvent: (key: any, options?: {
62
+ params?: any;
63
+ headers?: Record<string, string>;
64
+ }) => Promise<any[]>;
60
65
  ping(options?: {
61
66
  timeout?: number;
62
67
  }): Promise<Ping>;
package/index.js CHANGED
@@ -1,44 +1,7 @@
1
- import { createRequire } from "node:module";
2
- var __require = /* @__PURE__ */ createRequire(import.meta.url);
3
-
4
1
  // packages/milkio-stargate/index.ts
5
2
  async function createStargate(stargateOptions) {
6
3
  const $fetch = stargateOptions.fetch ?? fetch;
7
4
  const $abort = stargateOptions.abort ?? AbortController;
8
- let nodeHttpRequest = null;
9
- let nodeHttpAgent = null;
10
- try {
11
- if (typeof process !== "undefined" && typeof Bun === "undefined") {
12
- const http = await import("node:http");
13
- nodeHttpRequest = http.request;
14
- nodeHttpAgent = new http.Agent({ keepAlive: true, maxSockets: 100 });
15
- }
16
- } catch {}
17
- const nativeHttpPost = nodeHttpRequest ? (url, headers, body) => {
18
- return new Promise((resolve, reject) => {
19
- const parsedUrl = new URL(url);
20
- const options = {
21
- hostname: parsedUrl.hostname,
22
- port: parsedUrl.port || 80,
23
- path: parsedUrl.pathname + parsedUrl.search,
24
- method: "POST",
25
- headers: { ...headers, "Content-Length": Buffer.byteLength(body) },
26
- agent: nodeHttpAgent
27
- };
28
- const req = nodeHttpRequest(options, (res) => {
29
- let data = "";
30
- res.on("data", (chunk) => {
31
- data += chunk;
32
- });
33
- res.on("end", () => {
34
- resolve(data);
35
- });
36
- });
37
- req.on("error", reject);
38
- req.write(body);
39
- req.end();
40
- });
41
- } : null;
42
5
  const handleError = async (error, key, handler) => {
43
6
  if (key in error) {
44
7
  const handled = await handler(error[key]);
@@ -138,12 +101,8 @@ async function createStargate(stargateOptions) {
138
101
  const body2 = JSON.stringify(options.params) ?? "";
139
102
  await eventManager.emit("milkio:fetchBefore", { path, options, body: body2 });
140
103
  let text;
141
- if (nativeHttpPost) {
142
- text = await nativeHttpPost(url, options.headers, body2);
143
- } else {
144
- const response = await $fetch(url, { method: "POST", body: body2, headers: options.headers });
145
- text = await response.text();
146
- }
104
+ const response = await $fetch(url, { method: "POST", body: body2, headers: options.headers });
105
+ text = await response.text();
147
106
  const parsed = reviveJSONParse(JSON.parse(text));
148
107
  if (parsed.success !== true) {
149
108
  const err = {};
@@ -286,7 +245,7 @@ async function createStargate(stargateOptions) {
286
245
  });
287
246
  const contentType = response.headers.get("Content-Type");
288
247
  if (!contentType?.startsWith("text/event-stream")) {
289
- throw new Error(`Expected content-type to be text/event-stream, Actual: ${contentType}`);
248
+ throw new Error(`Expected content-type to be ${"text/event-stream"}, Actual: ${contentType}`);
290
249
  }
291
250
  await getBytes(response.body, getLines(getMessages(onmessage)));
292
251
  await iterator.return();
@@ -398,7 +357,7 @@ async function createStargate(stargateOptions) {
398
357
  });
399
358
  const contentType = response.headers.get("Content-Type");
400
359
  if (!contentType?.startsWith("text/event-stream")) {
401
- throw new Error(`Expected content-type to be text/event-stream, Actual: ${contentType}`);
360
+ throw new Error(`Expected content-type to be ${"text/event-stream"}, Actual: ${contentType}`);
402
361
  }
403
362
  await getBytes(response.body, getLines(getMessages(onmessage)));
404
363
  await iterator.return();
@@ -453,6 +412,40 @@ async function createStargate(stargateOptions) {
453
412
  }
454
413
  }
455
414
  },
415
+ __astraEmitEvent: async (key, options) => {
416
+ const opts = options ?? {};
417
+ if (opts.headers === undefined)
418
+ opts.headers = {};
419
+ if (opts.headers["Content-Type"] === undefined)
420
+ opts.headers["Content-Type"] = "application/json";
421
+ let url;
422
+ if (!resolvedBaseUrl)
423
+ resolvedBaseUrl = await baseUrlPromise;
424
+ let base64Name;
425
+ if (typeof btoa !== "undefined") {
426
+ base64Name = btoa(key);
427
+ } else if (typeof Buffer !== "undefined") {
428
+ base64Name = Buffer.from(key).toString("base64");
429
+ } else {
430
+ throw new Error("No base64 encoder available");
431
+ }
432
+ url = `${resolvedBaseUrl}/$event/${encodeURIComponent(base64Name)}`;
433
+ try {
434
+ const body = JSON.stringify(opts.params) ?? "";
435
+ const response = await $fetch(url, { method: "POST", body, headers: opts.headers });
436
+ const text = await response.text();
437
+ const parsed = reviveJSONParse(JSON.parse(text));
438
+ if (parsed.success !== true) {
439
+ const err = {};
440
+ err[parsed.code] = parsed.reject ?? null;
441
+ return [err, null, { executeId: parsed.executeId }];
442
+ }
443
+ return [null, parsed.data, { executeId: parsed.executeId }];
444
+ } catch (error) {
445
+ const errorPined = { REQUEST_FAIL: error };
446
+ return [errorPined, null, { executeId: "unknown" }];
447
+ }
448
+ },
456
449
  async ping(options) {
457
450
  return await new Promise(async (resolve) => {
458
451
  const url = `${await baseUrlPromise}/generate_204`;
@@ -748,5 +741,5 @@ export {
748
741
  createDefaultCacheStorage
749
742
  };
750
743
 
751
- //# debugId=678F542D2DB2E79B64756E2164756E21
752
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IHR5cGUgTWlsa2lvU3RhcmdhdGVPcHRpb25zID0ge1xuICAgIGJhc2VVcmw6IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpIHwgKCgpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICBmZXRjaD86IHR5cGVvZiBmZXRjaDtcbiAgICBhYm9ydD86IHR5cGVvZiBBYm9ydENvbnRyb2xsZXI7XG4gICAgY2FjaGVTdG9yYWdlPzogQ2FjaGVTdG9yYWdlO1xuICAgIGNhY2hlRW5jcnlwdGlvbj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBNaXhpbjxULCBVPiA9IFUgJiBPbWl0PFQsIGtleW9mIFU+O1xuXG5leHBvcnQgdHlwZSBDYWNoZVN0cmF0ZWd5ID0gJ29mZicgfCAnZmFsbGJhY2snIHwgJ3Rocm90dGxlJztcblxuZXhwb3J0IHR5cGUgUmV0cnlTdHJhdGVneSA9IGJvb2xlYW4gfCBudW1iZXI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVTdG9yYWdlIHtcbiAgICBnZXQ6IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTx7IGRhdGE6IGFueTsgdGltZXN0YW1wOiBudW1iZXIgfSB8IG51bGw+O1xuICAgIHNldDogKGtleTogc3RyaW5nLCBkYXRhOiBhbnkpID0+IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCB0eXBlIEV4ZWN1dGVPcHRpb25zPFQgZXh0ZW5kcyBhbnk+ID0ge1xuICAgIHBhcmFtcz86IFJlY29yZDxhbnksIGFueT47XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICBiYXNlVXJsPzogc3RyaW5nIHwgKCgpID0+IHN0cmluZykgfCAoKCkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICBjYWNoZVN0cmF0ZWd5PzogQ2FjaGVTdHJhdGVneTtcbiAgICBjYWNoZVRocm90dGxlTXM/OiBudW1iZXI7XG4gICAgb25DYWNoZUhpdD86IChyZXN1bHQ6IFQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIHJldHJ5U3RyYXRlZ3k/OiBSZXRyeVN0cmF0ZWd5O1xufTtcblxuZXhwb3J0IHR5cGUgRXhlY3V0ZVJlc3VsdHNPcHRpb24gPSB7IGV4ZWN1dGVJZDogc3RyaW5nIH07XG5cbmV4cG9ydCB0eXBlIFBpbmcgPVxuICAgIHwgW1xuICAgICAgICB7XG4gICAgICAgICAgICBjb25uZWN0OiBmYWxzZTtcbiAgICAgICAgICAgIGRlbGF5OiBudW1iZXI7XG4gICAgICAgICAgICBlcnJvcjogYW55O1xuICAgICAgICB9LFxuICAgICAgICBudWxsLFxuICAgIF1cbiAgICB8IFtcbiAgICAgICAgbnVsbCxcbiAgICAgICAge1xuICAgICAgICAgICAgY29ubmVjdDogdHJ1ZTtcbiAgICAgICAgICAgIGRlbGF5OiBudW1iZXI7XG4gICAgICAgICAgICBzZXJ2ZXJUaW1lc3RhbXA6IG51bWJlcjtcbiAgICAgICAgfSxcbiAgICBdO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN0YXJnYXRlPEdlbmVyYXRlZCBleHRlbmRzIHsgcm91dGVTY2hlbWE6IGFueTsgcmVqZWN0Q29kZTogYW55IH0+KHN0YXJnYXRlT3B0aW9uczogTWlsa2lvU3RhcmdhdGVPcHRpb25zKSB7XG4gICAgY29uc3QgJGZldGNoID0gc3RhcmdhdGVPcHRpb25zLmZldGNoID8/IGZldGNoO1xuICAgIGNvbnN0ICRhYm9ydCA9IHN0YXJnYXRlT3B0aW9ucy5hYm9ydCA/PyBBYm9ydENvbnRyb2xsZXI7XG5cbiAgICAvLyBEZXRlY3QgaWYgd2UgY2FuIHVzZSBOb2RlLmpzIGh0dHAgbW9kdWxlIGZvciBuYXRpdmUgSFRUUCB0cmFuc3BvcnRcbiAgICAvLyBPbmx5IHVzZSBpbiBwdXJlIE5vZGUuanMgZW52aXJvbm1lbnQgKG5vdCBCdW4sIG5vdCBEZW5vLCBub3Qgc2VydmVybGVzcylcbiAgICBsZXQgbm9kZUh0dHBSZXF1ZXN0OiBhbnkgPSBudWxsO1xuICAgIGxldCBub2RlSHR0cEFnZW50OiBhbnkgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEJ1biBhbHNvIHN1cHBvcnRzIG5vZGU6aHR0cCwgYnV0IGl0cyBmZXRjaCBpcyBhbHJlYWR5IG9wdGltaXplZFxuICAgICAgICAvLyBPbmx5IHVzZSBuYXRpdmUgaHR0cCB3aGVuIHJ1bm5pbmcgaW4gcHVyZSBOb2RlLmpzXG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIChCdW4gYXMgYW55KSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGh0dHAgPSBhd2FpdCBpbXBvcnQoJ25vZGU6aHR0cCcpO1xuICAgICAgICAgICAgbm9kZUh0dHBSZXF1ZXN0ID0gaHR0cC5yZXF1ZXN0O1xuICAgICAgICAgICAgbm9kZUh0dHBBZ2VudCA9IG5ldyBodHRwLkFnZW50KHsga2VlcEFsaXZlOiB0cnVlLCBtYXhTb2NrZXRzOiAxMDAgfSk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTm90IGluIE5vZGUuanMgZW52aXJvbm1lbnQgKERlbm8sIGJyb3dzZXIsIHNlcnZlcmxlc3MsIGV0Yy4pXG4gICAgfVxuXG4gICAgLy8gTmF0aXZlIEhUVFAgUE9TVCB1c2luZyBOb2RlLmpzIGh0dHAgbW9kdWxlIChieXBhc3NlcyB1bmRpY2kgb3ZlcmhlYWQpXG4gICAgLy8gRmFsbHMgYmFjayB0byBmZXRjaCBpbiBub24tTm9kZS5qcyBlbnZpcm9ubWVudHNcbiAgICBjb25zdCBuYXRpdmVIdHRwUG9zdCA9IG5vZGVIdHRwUmVxdWVzdFxuICAgICAgICA/ICh1cmw6IHN0cmluZywgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgYm9keTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lOiBwYXJzZWRVcmwuaG9zdG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IHBhcnNlZFVybC5wb3J0IHx8IDgwLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBwYXJzZWRVcmwucGF0aG5hbWUgKyBwYXJzZWRVcmwuc2VhcmNoLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogeyAuLi5oZWFkZXJzLCAnQ29udGVudC1MZW5ndGgnOiBCdWZmZXIuYnl0ZUxlbmd0aChib2R5KSB9LFxuICAgICAgICAgICAgICAgICAgICBhZ2VudDogbm9kZUh0dHBBZ2VudCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcSA9IG5vZGVIdHRwUmVxdWVzdChvcHRpb25zLCAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgcmVzLm9uKCdkYXRhJywgKGNodW5rOiBhbnkpID0+IHsgZGF0YSArPSBjaHVuazsgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5vbignZW5kJywgKCkgPT4geyByZXNvbHZlKGRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXEub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICByZXEud3JpdGUoYm9keSk7XG4gICAgICAgICAgICAgICAgcmVxLmVuZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgOiBudWxsO1xuXG4gICAgdHlwZSBTdGFyZ2F0ZUV2ZW50cyA9IHtcbiAgICAgICAgJ21pbGtpbzpleGVjdXRlQmVmb3JlJzogeyBwYXRoOiBzdHJpbmc7IG9wdGlvbnM6IE1peGluPEV4ZWN1dGVPcHRpb25zPGFueT4sIHsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgYmFzZVVybDogc3RyaW5nIH0+IH07XG4gICAgICAgICdtaWxraW86ZmV0Y2hCZWZvcmUnOiB7IHBhdGg6IHN0cmluZzsgb3B0aW9uczogTWl4aW48RXhlY3V0ZU9wdGlvbnM8YW55PiwgeyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBiYXNlVXJsOiBzdHJpbmcgfT47IGJvZHk6IHN0cmluZyB9O1xuICAgICAgICAnbWlsa2lvOmV4ZWN1dGVFcnJvcic6IHtcbiAgICAgICAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgICAgICAgIG9wdGlvbnM6IE1peGluPEV4ZWN1dGVPcHRpb25zPGFueT4sIHsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgYmFzZVVybDogc3RyaW5nIH0+O1xuICAgICAgICAgICAgZXJyb3I6IFBhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+O1xuICAgICAgICAgICAgaGFuZGxlRXJyb3I6IDxLIGV4dGVuZHMga2V5b2YgUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT4+KGVycm9yOiBhbnksIGtleTogSywgaGFuZGxlcjogKGVycm9yOiBQYXJ0aWFsPEdlbmVyYXRlZFsncmVqZWN0Q29kZSddW0tdPikgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pID0+IFByb21pc2U8dm9pZD47XG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZUVycm9yOiBhbnkgPSBhc3luYyAoZXJyb3I6IGFueSwga2V5OiBzdHJpbmcsIGhhbmRsZXI6IChlcnJvcjogYW55KSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPikgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIGVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVkID0gYXdhaXQgaGFuZGxlcihlcnJvcltrZXldKTtcbiAgICAgICAgICAgIGlmIChoYW5kbGVkKSBkZWxldGUgZXJyb3Jba2V5XTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBfX2luaXRFdmVudE1hbmFnZXIgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gbmV3IE1hcDwoZXZlbnQ6IGFueSkgPT4gdm9pZCwgc3RyaW5nPigpO1xuICAgICAgICBjb25zdCBpbmRleGVkID0gbmV3IE1hcDxzdHJpbmcsIFNldDwoZXZlbnQ6IGFueSkgPT4gdm9pZD4+KCk7XG5cbiAgICAgICAgY29uc3QgZXZlbnRNYW5hZ2VyID0ge1xuICAgICAgICAgICAgb246IDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgSGFuZGxlciBleHRlbmRzIChldmVudDogU3RhcmdhdGVFdmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ZWQuaGFzKGtleSBhcyBzdHJpbmcpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBpbmRleGVkLnNldChrZXkgYXMgc3RyaW5nLCBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKSE7XG4gICAgICAgICAgICAgICAgc2V0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIHNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvZmY6IDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgSGFuZGxlciBleHRlbmRzIChldmVudDogU3RhcmdhdGVFdmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNldCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVtaXQ6IGFzeW5jIDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgVmFsdWUgZXh0ZW5kcyBTdGFyZ2F0ZUV2ZW50c1tLZXldPihrZXk6IEtleSwgdmFsdWU6IFZhbHVlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgIGlmIChoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGV2ZW50TWFuYWdlcjtcbiAgICB9O1xuXG4gICAgY29uc3QgZXZlbnRNYW5hZ2VyID0gX19pbml0RXZlbnRNYW5hZ2VyKCk7XG5cbiAgICBjb25zdCBib290c3RyYXAgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBiYXNlVXJsID0gc3RhcmdhdGVPcHRpb25zLmJhc2VVcmw7XG4gICAgICAgIGlmICh0eXBlb2YgYmFzZVVybCA9PT0gJ2Z1bmN0aW9uJykgYmFzZVVybCA9IGF3YWl0IGJhc2VVcmwoKTtcbiAgICAgICAgaWYgKGJhc2VVcmwuZW5kc1dpdGgoJy8nKSkgYmFzZVVybCA9IGJhc2VVcmwuc2xpY2UoMCwgLTEpO1xuXG4gICAgICAgIHJldHVybiBiYXNlVXJsO1xuICAgIH07XG5cbiAgICBjb25zdCBiYXNlVXJsUHJvbWlzZTogUHJvbWlzZTxzdHJpbmc+ID0gYm9vdHN0cmFwKCk7XG4gICAgLy8gQ2FjaGUgcmVzb2x2ZWQgYmFzZVVybCB0byBhdm9pZCBhd2FpdCBvdmVyaGVhZCBvbiByZXBlYXRlZCBjYWxsc1xuICAgIGxldCByZXNvbHZlZEJhc2VVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIC8vIENhY2hlIFVSTCBmb3IgbGFzdCBwYXRoIHRvIGF2b2lkIHN0cmluZyBjb25jYXRlbmF0aW9uIHBlciByZXF1ZXN0XG4gICAgbGV0IGNhY2hlZFVybFBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjYWNoZWRVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3Qgc3RhcmdhdGUgPSB7XG4gICAgICAgIC4uLmV2ZW50TWFuYWdlcixcbiAgICAgICAgb3B0aW9uczogc3RhcmdhdGVPcHRpb25zLFxuICAgICAgICBhc3luYyBleGVjdXRlPFBhdGggZXh0ZW5kcyBrZXlvZiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ10+KFxuICAgICAgICAgICAgcGF0aDogUGF0aCxcbiAgICAgICAgICAgIG9wdGlvbnM6IE1peGluPFxuICAgICAgICAgICAgICAgIEV4ZWN1dGVPcHRpb25zPEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncmVzdWx0J10+LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zPzogR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydwYXJhbXMnXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA+LFxuICAgICAgICApOiBQcm9taXNlPFxuICAgICAgICAgICAgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWyfwn6WbJ10gZXh0ZW5kcyBib29sZWFuXG4gICAgICAgICAgICA/IC8vIGFjdGlvblxuICAgICAgICAgICAgW1BhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+LCBudWxsLCBFeGVjdXRlUmVzdWx0c09wdGlvbl0gfCBbbnVsbCwgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydyZXN1bHQnXSwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dXG4gICAgICAgICAgICA6IC8vIHN0cmVhbVxuICAgICAgICAgICAgW1BhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+LCBudWxsLCBFeGVjdXRlUmVzdWx0c09wdGlvbl0gfCBbbnVsbCwgQXN5bmNHZW5lcmF0b3I8W1BhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+LCBudWxsXSB8IFtudWxsLCBHZW5lcmF0b3JHZW5lcmljPEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncmVzdWx0J10+XSwgdW5kZWZpbmVkPiwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dXG4gICAgICAgID4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGVhZGVycyA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnMgPSB7fTtcblxuICAgICAgICAgICAgbGV0IHVybDogc3RyaW5nO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmFzZVVybCkge1xuICAgICAgICAgICAgICAgIGxldCBiYXNlVXJsID0gb3B0aW9ucy5iYXNlVXJsO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYmFzZVVybCA9PT0gJ2Z1bmN0aW9uJykgYmFzZVVybCA9IGF3YWl0IGJhc2VVcmwoKTtcbiAgICAgICAgICAgICAgICBpZiAoYmFzZVVybC5lbmRzV2l0aCgnLycpKSBiYXNlVXJsID0gYmFzZVVybC5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICAgICAgdXJsID0gYmFzZVVybCArIChwYXRoIGFzIHN0cmluZyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWRCYXNlVXJsKSByZXNvbHZlZEJhc2VVcmwgPSBhd2FpdCBiYXNlVXJsUHJvbWlzZTtcbiAgICAgICAgICAgICAgICAvLyBDYWNoZSBVUkwgZm9yIHJlcGVhdGVkIHBhdGggdG8gYXZvaWQgc3RyaW5nIGNvbmNhdGVuYXRpb25cbiAgICAgICAgICAgICAgICBpZiAocGF0aCA9PT0gY2FjaGVkVXJsUGF0aCAmJiBjYWNoZWRVcmwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gY2FjaGVkVXJsO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IHJlc29sdmVkQmFzZVVybCArIChwYXRoIGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgIGNhY2hlZFVybFBhdGggPSBwYXRoIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVkVXJsID0gdXJsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCEocGF0aCBhcyBzdHJpbmcpLmVuZHNXaXRoKCd+JykpIHtcbiAgICAgICAgICAgICAgICAvLyBhY3Rpb25cbiAgICAgICAgICAgICAgICAvLyBTZXQgZGVmYXVsdCBoZWFkZXJzIG9ubHkgaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgICAgICAgICAgICAgIGNvbnN0IGggPSBvcHRpb25zLmhlYWRlcnM7XG4gICAgICAgICAgICAgICAgaWYgKGguQWNjZXB0ID09PSB1bmRlZmluZWQpIGguQWNjZXB0ID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuICAgICAgICAgICAgICAgIGlmIChoWydDb250ZW50LVR5cGUnXSA9PT0gdW5kZWZpbmVkKSBoWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlU3RyYXRlZ3kgPSBvcHRpb25zLmNhY2hlU3RyYXRlZ3kgPz8gJ29mZic7XG4gICAgICAgICAgICAgICAgbGV0IHJldHJ5Q291bnQgPSAwO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnJldHJ5U3RyYXRlZ3kgPT09IHRydWUgfHwgb3B0aW9ucy5yZXRyeVN0cmF0ZWd5ID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJ5Q291bnQgPSAyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMucmV0cnlTdHJhdGVneSA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5yZXRyeVN0cmF0ZWd5ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXRyeUNvdW50ID0gb3B0aW9ucy5yZXRyeVN0cmF0ZWd5O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aDogbm8gY2FjaGUsIG5vIHJldHJ5XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgPT09ICdvZmYnICYmIHJldHJ5Q291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUJlZm9yZScsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMucGFyYW1zKSA/PyAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZmV0Y2hCZWZvcmUnLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgYm9keSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF0aXZlSHR0cFBvc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgTm9kZS5qcyBuYXRpdmUgaHR0cCBtb2R1bGUgZm9yIFBPU1QgKGJ5cGFzc2VzIHVuZGljaSBvdmVyaGVhZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gYXdhaXQgbmF0aXZlSHR0cFBvc3QodXJsLCBvcHRpb25zLmhlYWRlcnMsIGJvZHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICRmZXRjaCh1cmwsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHksIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UodGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5zdWNjZXNzICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJbcGFyc2VkLmNvZGVdID0gcGFyc2VkLnJlamVjdCA/PyBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbZXJyLCBudWxsLCB7IGV4ZWN1dGVJZDogcGFyc2VkLmV4ZWN1dGVJZCB9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbbnVsbCwgcGFyc2VkLmRhdGEsIHsgZXhlY3V0ZUlkOiBwYXJzZWQuZXhlY3V0ZUlkIH1dO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3I/LlswXT8uUkVRVUVTVF9USU1FT1VUKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtlcnJvciwgbnVsbCwgeyBleGVjdXRlSWQ6ICcnIH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JQaW5lZCA9IHsgUkVRVUVTVF9GQUlMOiBlcnJvciB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtlcnJvclBpbmVkLCBudWxsLCB7IGV4ZWN1dGVJZDogJ3Vua25vd24nIH1dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVUaHJvdHRsZU1zID0gb3B0aW9ucy5jYWNoZVRocm90dGxlTXMgPz8gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZUtleSA9IGdlbmVyYXRlQ2FjaGVLZXkocGF0aCBhcyBzdHJpbmcsIG9wdGlvbnMucGFyYW1zKTtcblxuICAgICAgICAgICAgICAgIGxldCBjYWNoZVN0b3JhZ2UgPSBzdGFyZ2F0ZU9wdGlvbnMuY2FjaGVTdG9yYWdlO1xuICAgICAgICAgICAgICAgIGlmIChjYWNoZVN0cmF0ZWd5ICE9PSAnb2ZmJyAmJiAhY2FjaGVTdG9yYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhY2hlU3RvcmFnZSA9IGF3YWl0IGNyZWF0ZURlZmF1bHRDYWNoZVN0b3JhZ2UoeyBlbmNyeXB0aW9uOiBzdGFyZ2F0ZU9wdGlvbnMuY2FjaGVFbmNyeXB0aW9uIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjYWNoZVN0cmF0ZWd5ICE9PSAnb2ZmJyAmJiBjYWNoZVN0b3JhZ2UgJiYgb3B0aW9ucy5vbkNhY2hlSGl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IGNhY2hlU3RvcmFnZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMub25DYWNoZUhpdChjYWNoZWQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgb25DYWNoZUhpdCBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjYWNoZVN0cmF0ZWd5ID09PSAndGhyb3R0bGUnICYmIGNhY2hlU3RvcmFnZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCBjYWNoZVN0b3JhZ2UuZ2V0KGNhY2hlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZCAmJiBEYXRlLm5vdygpIC0gY2FjaGVkLnRpbWVzdGFtcCA8IGNhY2hlVGhyb3R0bGVNcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBjYWNoZWQuZGF0YSwgeyBleGVjdXRlSWQ6ICdjYWNoZWQnIH1dIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUJlZm9yZScsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55IH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLnBhcmFtcykgPz8gJyc7XG4gICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpmZXRjaEJlZm9yZScsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBib2R5IH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZVJlcXVlc3QgPSBhc3luYyAoaXNSZXRyeTogYm9vbGVhbik6IFByb21pc2U8eyByZXN1bHQ6IHsgdmFsdWU6IFJlY29yZDxhbnksIGFueT4gfSB8IG51bGw7IGVycm9yOiBhbnk7IGlzTmV0d29ya0Vycm9yOiBib29sZWFuIH0+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKHVybCwgeyBtZXRob2Q6ICdQT1NUJywgYm9keSwgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyByZXN1bHQ6IHsgdmFsdWU6IHBhcnNlZCB9LCBlcnJvcjogbnVsbCwgaXNOZXR3b3JrRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzTmV0d29ya0Vycm9yID0gIWVycm9yPy5bMF0/LlJFUVVFU1RfVElNRU9VVDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHJlc3VsdDogbnVsbCwgZXJyb3IsIGlzTmV0d29ya0Vycm9yIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgbGV0IHsgcmVzdWx0LCBlcnJvciwgaXNOZXR3b3JrRXJyb3IgfSA9IGF3YWl0IGV4ZWN1dGVSZXF1ZXN0KGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHJldHJ5SW5kZXggPSAwOyByZXRyeUluZGV4IDwgcmV0cnlDb3VudCAmJiBlcnJvciAmJiBpc05ldHdvcmtFcnJvcjsgcmV0cnlJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXRyeUluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0cnlSZXN1bHQgPSBhd2FpdCBleGVjdXRlUmVxdWVzdCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmV0cnlSZXN1bHQucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHJldHJ5UmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgICAgICAgICBpc05ldHdvcmtFcnJvciA9IHJldHJ5UmVzdWx0LmlzTmV0d29ya0Vycm9yO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3I/LlswXT8uUkVRVUVTVF9USU1FT1VUKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVFcnJvcicsIHsgaGFuZGxlRXJyb3IsIHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSAhPT0gJ29mZicgJiYgY2FjaGVTdG9yYWdlICYmIGlzTmV0d29ya0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCBjYWNoZVN0b3JhZ2UuZ2V0KGNhY2hlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW251bGwsIGNhY2hlZC5kYXRhLCB7IGV4ZWN1dGVJZDogJ2NhY2hlZCcgfV0gYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JQaW5lZCA9IHsgUkVRVUVTVF9GQUlMOiBlcnJvciB9O1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVFcnJvcicsIHsgaGFuZGxlRXJyb3IsIHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgZXJyb3I6IGVycm9yUGluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbZXJyb3JQaW5lZCwgbnVsbCwgeyBleGVjdXRlSWQ6ICd1bmtub3duJyB9XTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IS52YWx1ZS5zdWNjZXNzICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycjogYW55ID0ge307XG4gICAgICAgICAgICAgICAgICAgIGVycltyZXN1bHQhLnZhbHVlLmNvZGVdID0gcmVzdWx0IS52YWx1ZS5yZWplY3QgPz8gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlRXJyb3InLCB7IGhhbmRsZUVycm9yLCBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGVycm9yOiBlcnIgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbZXJyLCBudWxsLCB7IGV4ZWN1dGVJZDogcmVzdWx0IS52YWx1ZS5leGVjdXRlSWQgfV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgIT09ICdvZmYnICYmIGNhY2hlU3RvcmFnZSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjYWNoZVN0b3JhZ2Uuc2V0KGNhY2hlS2V5LCByZXN1bHQhLnZhbHVlLmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0IS52YWx1ZS5kYXRhLCB7IGV4ZWN1dGVJZDogcmVzdWx0IS52YWx1ZS5leGVjdXRlSWQgfV0gYXMgYW55O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBzdHJlYW1cbiAgICAgICAgICAgICAgICBvcHRpb25zLmNhY2hlU3RyYXRlZ3kgPSAnb2ZmJztcbiAgICAgICAgICAgICAgICBvcHRpb25zLm9uQ2FjaGVIaXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jYWNoZVRocm90dGxlTXMgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5oZWFkZXJzLkFjY2VwdCA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnMuQWNjZXB0ID0gJ3RleHQvZXZlbnQtc3RyZWFtJztcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVR5cGUnXSA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhY2tzOiBNYXA8XG4gICAgICAgICAgICAgICAgICAgIG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2U6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8YW55Pj47XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiAodmFsdWU6IEl0ZXJhdG9yUmVzdWx0PGFueT4pID0+IHZvaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3Q6IChyZWFzb246IGFueSkgPT4gdm9pZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgID4gPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICAgICAgbGV0IHN0YWNrc0luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgaXRlcmF0b3JJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IHN0cmVhbVJlc3VsdDogYW55O1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbVJlc3VsdEZldGNoZWQgPSB3aXRoUmVzb2x2ZXJzPHVuZGVmaW5lZD4oKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzdGFyZ2F0ZU9wdGlvbnM/LnRpbWVvdXQgPz8gb3B0aW9ucz8udGltZW91dCA/PyA2MDAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbVJlc3VsdEZldGNoZWQucmVqZWN0KFt7IFJFUVVFU1RfVElNRU9VVDogeyB0aW1lb3V0LCBtZXNzYWdlOiBgRXhlY3V0ZSB0aW1lb3V0IGFmdGVyICR7dGltZW91dH1tcy5gIH0gfSwgbnVsbCwgeyBleGVjdXRlSWQ6ICd1bmtub3duJyB9XSk7XG4gICAgICAgICAgICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvbm1lc3NhZ2UgPSAoZXZlbnQ6IEV2ZW50U291cmNlTWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0ID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YS5zbGljZSgxKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVJlc3VsdEZldGNoZWQucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVJlc3VsdEZldGNoZWQucmVqZWN0KFt7IFJFUVVFU1RfRkFJTDogZXJyb3IgfSwgbnVsbCwgeyBleGVjdXRlSWQ6ICd1bmtub3duJyB9XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gKytzdGFja3NJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja3MuaGFzKGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gc3RhY2tzLmdldChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2shLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrIS5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhKSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWU6IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGV2ZW50LmRhdGEpKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja3Muc2V0KGluZGV4LCB7IC4uLnN0YWNrLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBsZXQgY3VyUmVxdWVzdENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcblxuICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyUmVxdWVzdENvbnRyb2xsZXIgPSBuZXcgJGFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUJlZm9yZScsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55IH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucyEucGFyYW1zKSA/PyAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZmV0Y2hCZWZvcmUnLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgYm9keSB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAkZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucyEuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbDogY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZW50VHlwZT8uc3RhcnRzV2l0aCgndGV4dC9ldmVudC1zdHJlYW0nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgY29udGVudC10eXBlIHRvIGJlICR7J3RleHQvZXZlbnQtc3RyZWFtJ30sIEFjdHVhbDogJHtjb250ZW50VHlwZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0Qnl0ZXMocmVzcG9uc2UuYm9keSEsIGdldExpbmVzKGdldE1lc3NhZ2VzKG9ubWVzc2FnZSkpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0geyBSRVFVRVNUX0ZBSUw6IGVyciB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlRXJyb3InLCB7IGhhbmRsZUVycm9yLCBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGVycm9yIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3IudGhyb3coZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVJlc3VsdEZldGNoZWQucmVqZWN0KFtlcnJvciwgbnVsbCwgeyBleGVjdXRlSWQ6ICd1bmtub3duJyB9XSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2b2lkIGNyZWF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLih7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dW5rbm93bj4+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9ICsraXRlcmF0b3JJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCAtIDIpKSBzdGFja3MuZGVsZXRlKGluZGV4IC0gMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiAhY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrcy5zZXQoaW5kZXgsIHsgLi4uc3RhY2ssIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2tzLmdldChpbmRleCkhLnByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgcmV0dXJuKCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyB0aHJvdyhlcnI6IGFueSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1SZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlSWQ6IHN0cmVhbVJlc3VsdD8uZXhlY3V0ZUlkID8/ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnTkVUV09SS19FUlJPUicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTmV0d29yayBFcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tQ2xpZW50OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbX2luZGV4LCBzdGFja10gb2Ygc3RhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5kb25lKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2suZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFzeW5jSXRlcmF0b3I8dW5rbm93bj4pLFxuICAgICAgICAgICAgICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHN0cmVhbVJlc3VsdEZldGNoZWQucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBpdGVyYXRvciwgeyBleGVjdXRlSWQ6IHN0cmVhbVJlc3VsdC5leGVjdXRlSWQgfV0gYXMgYW55O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvciBhcyBhbnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBfX2Nvb2tib29rOiB7XG4gICAgICAgICAgICBzdWJzY3JpYmU6IGFzeW5jIChiYXNlVXJsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICAgICBBY2NlcHQ6ICd0ZXh0L2V2ZW50LXN0cmVhbScsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7fTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXMpID8/ICcnO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrczogTWFwPFxuICAgICAgICAgICAgICAgICAgICBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGJvb2xlYW47XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PGFueT4+O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZTogKHZhbHVlOiBJdGVyYXRvclJlc3VsdDxhbnk+KSA9PiB2b2lkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0OiAocmVhc29uOiBhbnkpID0+IHZvaWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA+ID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgICAgIGxldCBzdGFja3NJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGl0ZXJhdG9ySW5kZXggPSAwO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgb25tZXNzYWdlID0gKGV2ZW50OiBFdmVudFNvdXJjZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSArK3N0YWNrc0luZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gc3RhY2tzLmdldChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjayEucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhKSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFja3Muc2V0KGluZGV4LCB7IC4uLnN0YWNrLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBsZXQgY3VyUmVxdWVzdENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcblxuICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyUmVxdWVzdENvbnRyb2xsZXIgPSBuZXcgJGFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKGAke2Jhc2VVcmx9LyRzdWJzY3JpYmVgLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbDogY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZW50VHlwZT8uc3RhcnRzV2l0aCgndGV4dC9ldmVudC1zdHJlYW0nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgY29udGVudC10eXBlIHRvIGJlICR7J3RleHQvZXZlbnQtc3RyZWFtJ30sIEFjdHVhbDogJHtjb250ZW50VHlwZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0Qnl0ZXMocmVzcG9uc2UuYm9keSEsIGdldExpbmVzKGdldE1lc3NhZ2VzKG9ubWVzc2FnZSkpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLnRocm93KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2b2lkIGNyZWF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLih7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dW5rbm93bj4+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9ICsraXRlcmF0b3JJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCAtIDIpKSBzdGFja3MuZGVsZXRlKGluZGV4IC0gMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiAhY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrcy5zZXQoaW5kZXgsIHsgLi4uc3RhY2ssIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2tzLmdldChpbmRleCkhLnByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgcmV0dXJuKCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyB0aHJvdyhlcnI6IGFueSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFzeW5jSXRlcmF0b3I8dW5rbm93bj4pLFxuICAgICAgICAgICAgICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IgYXMgYW55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIHBpbmcob3B0aW9ucz86IHsgdGltZW91dD86IG51bWJlciB9KTogUHJvbWlzZTxQaW5nPiB7XG4gICAgICAgICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPFBpbmc+KGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gYCR7YXdhaXQgYmFzZVVybFByb21pc2V9L2dlbmVyYXRlXzIwNGA7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHN0YXJnYXRlT3B0aW9ucz8udGltZW91dCA/PyBvcHRpb25zPy50aW1lb3V0ID8/IDYwMDA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRzVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kc1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFt7IGNvbm5lY3Q6IGZhbHNlLCBkZWxheTogZW5kc1RpbWUgLSBzdGFydHNUaW1lLCBlcnJvcjogeyBSRVFVRVNUX1RJTUVPVVQ6IHsgdGltZW91dCwgbWVzc2FnZTogYEV4ZWN1dGUgdGltZW91dCBhZnRlciAke3RpbWVvdXR9bXMuYCB9IH0gfSwgbnVsbF0pO1xuICAgICAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAkZmV0Y2godXJsLCB7IG1ldGhvZDogJ0hFQUQnIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRzVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbeyBjb25uZWN0OiBmYWxzZSwgZGVsYXk6IGVuZHNUaW1lIC0gc3RhcnRzVGltZSwgZXJyb3I6IHsgUkVRVUVTVF9GQUlMOiB7IHJlc3BvbnNlLCBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywgbWVzc2FnZTogJ1N0YXR1cyBjb2RlIG5vdCAyMDQnIH0gfSB9LCBudWxsXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFtudWxsLCB7IGNvbm5lY3Q6IHRydWUsIGRlbGF5OiBlbmRzVGltZSAtIHN0YXJ0c1RpbWUsIHNlcnZlclRpbWVzdGFtcDogTnVtYmVyKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKSEuc3Vic3RyaW5nKDE3KSkgfV0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kc1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3sgY29ubmVjdDogZmFsc2UsIGRlbGF5OiBlbmRzVGltZSAtIHN0YXJ0c1RpbWUsIGVycm9yIH0sIG51bGxdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAkdHlwZXM6IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICAgIGdlbmVyYXRlZDogR2VuZXJhdGVkO1xuICAgICAgICAgICAgZXJyb3I6IEdlbmVyYXRlZFsncmVqZWN0Q29kZSddO1xuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgW1BhdGggaW4ga2V5b2YgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddXTogR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydwYXJhbXMnXTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXN1bHRzOiB7XG4gICAgICAgICAgICAgICAgW1BhdGggaW4ga2V5b2YgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddXTogR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWyfwn6WbJ10gZXh0ZW5kcyBib29sZWFuXG4gICAgICAgICAgICAgICAgPyAvLyBhY3Rpb25cbiAgICAgICAgICAgICAgICBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ3Jlc3VsdCddXG4gICAgICAgICAgICAgICAgOiAvLyBzdHJlYW1cbiAgICAgICAgICAgICAgICBBc3luY0dlbmVyYXRvcjxbUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT4sIG51bGxdIHwgW251bGwsIEdlbmVyYXRvckdlbmVyaWM8R2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydyZXN1bHQnXT5dLCB1bmRlZmluZWQ+O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHN0YXJnYXRlO1xufVxuXG5jb25zdCBpc29EYXRlUGF0dGVybiA9IC9eKFxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkezEsM30pPykoWnxbKy1dXFxkezJ9Oj9cXGR7Mn0pPyQvO1xuXG5leHBvcnQgZnVuY3Rpb24gcmV2aXZlSlNPTlBhcnNlPFQ+KGpzb246IFQpOiBUIHtcbiAgICBpZiAoanNvbiA9PT0gbnVsbCB8fCBqc29uID09PSB1bmRlZmluZWQpIHJldHVybiBqc29uO1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YganNvbjtcbiAgICBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGpzb24gaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4ganNvbjtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IGpzb24ubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJldml2ZUpTT05QYXJzZShqc29uW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBqc29uW2ldKSBqc29uW2ldID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGpzb24gYXMgb2JqZWN0KTtcbiAgICAgICAgY29uc3Qgb2JqID0ganNvbiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJldml2ZUpTT05QYXJzZSh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSB2YWx1ZSkgb2JqW2tleV0gPSByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBzdHIgPSBqc29uIGFzIHVua25vd24gYXMgc3RyaW5nO1xuICAgICAgICAvLyBRdWljayByZWplY3Q6IElTTyBkYXRlIHN0cmluZ3MgbXVzdCBzdGFydCB3aXRoIGEgZGlnaXQgYW5kIGNvbnRhaW4gJ1QnXG4gICAgICAgIGNvbnN0IGxlbiA9IHN0ci5sZW5ndGg7XG4gICAgICAgIGlmIChsZW4gPj0gMjAgJiYgbGVuIDw9IDMyICYmIHN0ci5jaGFyQ29kZUF0KDApID49IDB4MzAgJiYgc3RyLmNoYXJDb2RlQXQoMCkgPD0gMHgzOSAmJiBzdHIuaW5kZXhPZignVCcpICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBzdHIubWF0Y2goaXNvRGF0ZVBhdHRlcm4pO1xuICAgICAgICAgICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9uUG9zID0gbWF0Y2hbMl0uY2hhckNvZGVBdCgzKSA9PT0gNTggPyBtYXRjaFsxXS5sZW5ndGggKyAzIDogLTE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xvblBvcyA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoc3RyLnN1YnN0cmluZygwLCBjb2xvblBvcykgKyBzdHIuc3Vic3RyaW5nKGNvbG9uUG9zICsgMSkpIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoc3RyKSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShtYXRjaFsxXSArICdaJykgYXMgYW55O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBqc29uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGVTdHJlYW1PcHRpb25zIHtcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwaVNjaGVtYUV4dGVuZCB7XG4gICAgYXBpVmFsaWRhdG9yOiB7XG4gICAgICAgIGdlbmVyYXRlZEF0OiBudW1iZXI7XG4gICAgICAgIHZhbGlkYXRlOiBSZWNvcmQ8YW55LCBhbnk+O1xuICAgIH07XG4gICAgYXBpTWV0aG9kc1NjaGVtYTogUmVjb3JkPGFueSwgYW55PjtcbiAgICBhcGlNZXRob2RzVHlwZVNjaGVtYTogUmVjb3JkPGFueSwgYW55PjtcbiAgICBhcGlUZXN0c1NjaGVtYTogUmVjb3JkPGFueSwgYW55Pjtcbn1cblxuZXhwb3J0IHR5cGUgRmFpbENvZGVFeHRlbmQgPSBSZWNvcmQ8YW55LCAoLi4uYXJnczogQXJyYXk8YW55PikgPT4gYW55PjtcblxuZXhwb3J0IHR5cGUgQm9vdHN0cmFwTWlkZGxld2FyZSA9IChkYXRhOiB7IHN0b3JhZ2U6IENsaWVudFN0b3JhZ2UgfSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5leHBvcnQgdHlwZSBCZWZvcmVFeGVjdXRlTWlkZGxld2FyZSA9IChkYXRhOiB7IHBhdGg6IHN0cmluZzsgcGFyYW1zOiBhbnk7IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IHN0b3JhZ2U6IENsaWVudFN0b3JhZ2UgfSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5leHBvcnQgdHlwZSBBZnRlckV4ZWN1dGVNaWRkbGV3YXJlID0gKGRhdGE6IHsgcGF0aDogc3RyaW5nOyByZXN1bHQ6IHsgdmFsdWU6IGFueSB9OyBzdG9yYWdlOiBDbGllbnRTdG9yYWdlIH0pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1pZGRsZXdhcmVPcHRpb25zIHtcbiAgICBib290c3RyYXA/OiBCb290c3RyYXBNaWRkbGV3YXJlO1xuICAgIGJlZm9yZUV4ZWN1dGU/OiBCZWZvcmVFeGVjdXRlTWlkZGxld2FyZTtcbiAgICBhZnRlckV4ZWN1dGU/OiBBZnRlckV4ZWN1dGVNaWRkbGV3YXJlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFN0b3JhZ2Uge1xuICAgIGdldEl0ZW06IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgICBzZXRJdGVtOiAoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gICAgcmVtb3ZlSXRlbTogKGtleTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGVSZXN1bHRTdWNjZXNzPFJlc3VsdD4ge1xuICAgIGV4ZWN1dGVJZDogc3RyaW5nO1xuICAgIHN1Y2Nlc3M6IHRydWU7XG4gICAgZGF0YTogUmVzdWx0O1xufVxuXG5leHBvcnQgdHlwZSBHZW5lcmF0b3JHZW5lcmljPFQ+ID0gVCBleHRlbmRzIEFzeW5jR2VuZXJhdG9yPGluZmVyIEk+ID8gSSA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBGbGF0dGVuS2V5czxULCBQcmVmaXggZXh0ZW5kcyBzdHJpbmcgPSAnJz4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBvYmplY3QgPyBGbGF0dGVuS2V5czxUW0tdLCBgJHtQcmVmaXh9JHtFeGNsdWRlPEssIHN5bWJvbD59LmA+IDogYCRpbnB1dC4ke1ByZWZpeH0ke0V4Y2x1ZGU8Sywgc3ltYm9sPn1gO1xufVtrZXlvZiBUXTtcblxuLy8gKioqIFRoaXMgcGFydCBvZiB0aGUgY29kZSBpcyBiYXNlZCBvbiBgQG1pY3Jvc29mdC9mZXRjaC1ldmVudC1zb3VyY2VgIHJld3JpdGUsIHRoYW5rcyB0byB0aGUgd29yayBvZiBNaWNyb3NvZnQgKioqIC8vXG4vLyAqKiogaHR0cHM6Ly9naXRodWIuY29tL0F6dXJlL2ZldGNoLWV2ZW50LXNvdXJjZS9ibG9iL21haW4vc3JjL3BhcnNlLnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiogLy9cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbWVzc2FnZSBzZW50IGluIGFuIGV2ZW50IHN0cmVhbVxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZlci1zZW50X2V2ZW50cy9Vc2luZ19zZXJ2ZXItc2VudF9ldmVudHMjRXZlbnRfc3RyZWFtX2Zvcm1hdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50U291cmNlTWVzc2FnZSB7XG4gICAgZGF0YTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgUmVhZGFibGVTdHJlYW0gaW50byBhIGNhbGxiYWNrIHBhdHRlcm4uXG4gKiBAcGFyYW0gc3RyZWFtIFRoZSBpbnB1dCBSZWFkYWJsZVN0cmVhbS5cbiAqIEBwYXJhbSBvbkNodW5rIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIG5ldyBieXRlIGNodW5rIGluIHRoZSBzdHJlYW0uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSBzdHJlYW0gY2xvc2VzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Qnl0ZXMoc3RyZWFtOiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Piwgb25DaHVuazogKGFycjogVWludDhBcnJheSkgPT4gdm9pZCkge1xuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICBsZXQgcmVzdWx0OiBSZWFkYWJsZVN0cmVhbVJlYWRSZXN1bHQ8VWludDhBcnJheT47XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdoaWxlICghKHJlc3VsdCA9IGF3YWl0IHJlYWRlci5yZWFkKCkpLmRvbmUpIHtcbiAgICAgICAgb25DaHVuayhyZXN1bHQudmFsdWUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgYXJiaXRhcnkgYnl0ZSBjaHVua3MgaW50byBFdmVudFNvdXJjZSBsaW5lIGJ1ZmZlcnMuXG4gKiBFYWNoIGxpbmUgc2hvdWxkIGJlIG9mIHRoZSBmb3JtYXQgXCJmaWVsZDogdmFsdWVcIiBhbmQgZW5kcyB3aXRoIFxcciwgXFxuLCBvciBcXHJcXG4uXG4gKiBAcGFyYW0gb25MaW5lIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIG5ldyBFdmVudFNvdXJjZSBsaW5lLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgZm9yIGVhY2ggaW5jb21pbmcgYnl0ZSBjaHVuay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpbmVzKG9uTGluZTogKGxpbmU6IFVpbnQ4QXJyYXksIGZpZWxkTGVuZ3RoOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICBsZXQgYnVmZmVyOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xuICAgIGxldCBwb3NpdGlvbjogbnVtYmVyOyAvLyBjdXJyZW50IHJlYWQgcG9zaXRpb25cbiAgICBsZXQgZmllbGRMZW5ndGg6IG51bWJlcjsgLy8gbGVuZ3RoIG9mIHRoZSBgZmllbGRgIHBvcnRpb24gb2YgdGhlIGxpbmVcbiAgICBsZXQgZGlzY2FyZFRyYWlsaW5nTmV3bGluZSA9IGZhbHNlO1xuXG4gICAgLy8gcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4gcHJvY2VzcyBlYWNoIGluY29taW5nIGJ5dGUgY2h1bms6XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG9uQ2h1bmsoYXJyOiBVaW50OEFycmF5KSB7XG4gICAgICAgIGlmIChidWZmZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYnVmZmVyID0gYXJyO1xuICAgICAgICAgICAgcG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgZmllbGRMZW5ndGggPSAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHdlJ3JlIHN0aWxsIHBhcnNpbmcgdGhlIG9sZCBsaW5lLiBBcHBlbmQgdGhlIG5ldyBieXRlcyBpbnRvIGJ1ZmZlcjpcbiAgICAgICAgICAgIGJ1ZmZlciA9IGNvbmNhdChidWZmZXIsIGFycik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWZMZW5ndGggPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICBsZXQgbGluZVN0YXJ0ID0gMDsgLy8gaW5kZXggd2hlcmUgdGhlIGN1cnJlbnQgbGluZSBzdGFydHNcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgYnVmTGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoZGlzY2FyZFRyYWlsaW5nTmV3bGluZSkge1xuICAgICAgICAgICAgICAgIGlmIChidWZmZXJbcG9zaXRpb25dID09PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lU3RhcnQgPSArK3Bvc2l0aW9uOyAvLyBza2lwIHRvIG5leHQgY2hhclxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRpc2NhcmRUcmFpbGluZ05ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gc3RhcnQgbG9va2luZyBmb3J3YXJkIHRpbGwgdGhlIGVuZCBvZiBsaW5lOlxuICAgICAgICAgICAgbGV0IGxpbmVFbmQgPSAtMTsgLy8gaW5kZXggb2YgdGhlIFxcciBvciBcXG4gY2hhclxuICAgICAgICAgICAgZm9yICg7IHBvc2l0aW9uIDwgYnVmTGVuZ3RoICYmIGxpbmVFbmQgPT09IC0xOyArK3Bvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChidWZmZXJbcG9zaXRpb25dKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTg6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRMZW5ndGggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgY29sb24gaW4gbGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTGVuZ3RoID0gcG9zaXRpb24gLSBsaW5lU3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZFRyYWlsaW5nTmV3bGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lRW5kID0gcG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZUVuZCA9IHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGluZUVuZCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBidXQgdGhlIGxpbmUgaGFzbid0IGVuZGVkLlxuICAgICAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBuZXh0IGFyciBhbmQgdGhlbiBjb250aW51ZSBwYXJzaW5nOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB3ZSd2ZSByZWFjaGVkIHRoZSBsaW5lIGVuZCwgc2VuZCBpdCBvdXQ6XG4gICAgICAgICAgICBvbkxpbmUoYnVmZmVyLnN1YmFycmF5KGxpbmVTdGFydCwgbGluZUVuZCksIGZpZWxkTGVuZ3RoKTtcbiAgICAgICAgICAgIGxpbmVTdGFydCA9IHBvc2l0aW9uOyAvLyB3ZSdyZSBub3cgb24gdGhlIG5leHQgbGluZVxuICAgICAgICAgICAgZmllbGRMZW5ndGggPSAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5lU3RhcnQgPT09IGJ1Zkxlbmd0aCkge1xuICAgICAgICAgICAgYnVmZmVyID0gdW5kZWZpbmVkOyAvLyB3ZSd2ZSBmaW5pc2hlZCByZWFkaW5nIGl0XG4gICAgICAgIH0gZWxzZSBpZiAobGluZVN0YXJ0ICE9PSAwKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgdmlldyBpbnRvIGJ1ZmZlciBiZWdpbm5pbmcgYXQgbGluZVN0YXJ0IHNvIHdlIGRvbid0XG4gICAgICAgICAgICAvLyBuZWVkIHRvIGNvcHkgb3ZlciB0aGUgcHJldmlvdXMgbGluZXMgd2hlbiB3ZSBnZXQgdGhlIG5ldyBhcnI6XG4gICAgICAgICAgICBidWZmZXIgPSBidWZmZXIuc3ViYXJyYXkobGluZVN0YXJ0KTtcbiAgICAgICAgICAgIHBvc2l0aW9uIC09IGxpbmVTdGFydDtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8qKlxuICogUGFyc2VzIGxpbmUgYnVmZmVycyBpbnRvIEV2ZW50U291cmNlTWVzc2FnZXMuXG4gKiBAcGFyYW0gb25JZCBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBgaWRgIGZpZWxkLlxuICogQHBhcmFtIG9uUmV0cnkgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggYHJldHJ5YCBmaWVsZC5cbiAqIEBwYXJhbSBvbk1lc3NhZ2UgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggbWVzc2FnZS5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIGZvciBlYWNoIGluY29taW5nIGxpbmUgYnVmZmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVzc2FnZXMob25NZXNzYWdlPzogKG1zZzogRXZlbnRTb3VyY2VNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgbGV0IG1lc3NhZ2UgPSBuZXdNZXNzYWdlKCk7XG4gICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4gICAgLy8gcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4gcHJvY2VzcyBlYWNoIGluY29taW5nIGxpbmUgYnVmZmVyOlxuICAgIHJldHVybiBmdW5jdGlvbiBvbkxpbmUobGluZTogVWludDhBcnJheSwgZmllbGRMZW5ndGg6IG51bWJlcikge1xuICAgICAgICBpZiAobGluZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIGVtcHR5IGxpbmUgZGVub3RlcyBlbmQgb2YgbWVzc2FnZS4gVHJpZ2dlciB0aGUgY2FsbGJhY2sgYW5kIHN0YXJ0IGEgbmV3IG1lc3NhZ2U6XG4gICAgICAgICAgICBvbk1lc3NhZ2U/LihtZXNzYWdlKTtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXdNZXNzYWdlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGRMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBleGNsdWRlIGNvbW1lbnRzIGFuZCBsaW5lcyB3aXRoIG5vIHZhbHVlc1xuICAgICAgICAgICAgLy8gbGluZSBpcyBvZiBmb3JtYXQgXCI8ZmllbGQ+Ojx2YWx1ZT5cIiBvciBcIjxmaWVsZD46IDx2YWx1ZT5cIlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VydmVyLXNlbnQtZXZlbnRzLmh0bWwjZXZlbnQtc3RyZWFtLWludGVycHJldGF0aW9uXG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGRlY29kZXIuZGVjb2RlKGxpbmUuc3ViYXJyYXkoMCwgZmllbGRMZW5ndGgpKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlT2Zmc2V0ID0gZmllbGRMZW5ndGggKyAobGluZVtmaWVsZExlbmd0aCArIDFdID09PSAzMiA/IDIgOiAxKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGVjb2Rlci5kZWNvZGUobGluZS5zdWJhcnJheSh2YWx1ZU9mZnNldCkpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGF0YSc6XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgbWVzc2FnZSBhbHJlYWR5IGhhcyBkYXRhLCBhcHBlbmQgdGhlIG5ldyB2YWx1ZSB0byB0aGUgb2xkLlxuICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGp1c3Qgc2V0IHRvIHRoZSBuZXcgdmFsdWU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YSA9IG1lc3NhZ2UuZGF0YSA/IGAke21lc3NhZ2UuZGF0YX1cXG4ke3ZhbHVlfWAgOiB2YWx1ZTsgLy8gb3RoZXJ3aXNlLFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGNvbmNhdChhOiBVaW50OEFycmF5LCBiOiBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgcmVzID0gbmV3IFVpbnQ4QXJyYXkoYS5sZW5ndGggKyBiLmxlbmd0aCk7XG4gICAgcmVzLnNldChhKTtcbiAgICByZXMuc2V0KGIsIGEubGVuZ3RoKTtcbiAgICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBuZXdNZXNzYWdlKCk6IEV2ZW50U291cmNlTWVzc2FnZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogJycsXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhSZXNvbHZlcnM8VCA9IGFueT4oKTogUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4ge1xuICAgIGxldCByZXNvbHZlOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPlsncmVzb2x2ZSddO1xuICAgIGxldCByZWplY3Q6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+WydyZWplY3QnXTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlcywgcmVqKSA9PiB7XG4gICAgICAgIHJlc29sdmUgPSByZXM7XG4gICAgICAgIHJlamVjdCA9IHJlajtcbiAgICB9KTtcbiAgICByZXR1cm4geyBwcm9taXNlLCByZXNvbHZlOiByZXNvbHZlISwgcmVqZWN0OiByZWplY3QhIH07XG59XG5cbmNvbnN0IERCX05BTUUgPSAnU3RhcmdhdGUnO1xuY29uc3QgU1RPUkVfTkFNRSA9ICdjYWNoZXMnO1xubGV0IGRiSW5zdGFuY2U6IElEQkRhdGFiYXNlIHwgbnVsbCA9IG51bGw7XG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5EQigpOiBQcm9taXNlPElEQkRhdGFiYXNlPiB7XG4gICAgaWYgKGRiSW5zdGFuY2UpIHJldHVybiBkYkluc3RhbmNlO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKERCX05BTUUsIDEpO1xuICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QocmVxdWVzdC5lcnJvcik7XG4gICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgZGJJbnN0YW5jZSA9IHJlcXVlc3QucmVzdWx0O1xuICAgICAgICAgICAgcmVzb2x2ZShkYkluc3RhbmNlKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRiID0gKGV2ZW50LnRhcmdldCBhcyBJREJPcGVuREJSZXF1ZXN0KS5yZXN1bHQ7XG4gICAgICAgICAgICBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoU1RPUkVfTkFNRSkpIHtcbiAgICAgICAgICAgICAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShTVE9SRV9OQU1FKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRDYWNoZVN0b3JhZ2Uob3B0aW9ucz86IHsgZW5jcnlwdGlvbj86IGJvb2xlYW47IGVuY3J5cHRpb25LZXk/OiBzdHJpbmcgfSk6IFByb21pc2U8Q2FjaGVTdG9yYWdlPiB7XG4gICAgYXdhaXQgb3BlbkRCKCk7XG5cbiAgICBsZXQgZW5jcnlwdGlvbktleTogQ3J5cHRvS2V5IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY291bnRlciA9IG5ldyBVaW50OEFycmF5KDE2KTtcblxuICAgIGlmIChvcHRpb25zPy5lbmNyeXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IGtleVN0cmluZyA9IG9wdGlvbnMuZW5jcnlwdGlvbktleSA/PyBEQl9OQU1FO1xuICAgICAgICBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoa2V5U3RyaW5nKS5mb3JFYWNoKChieXRlLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoaSA8IDE2KSBjb3VudGVyW2ldID0gYnl0ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgICAgICBjb25zdCBrZXlEYXRhID0gZW5jb2Rlci5lbmNvZGUoa2V5U3RyaW5nKTtcbiAgICAgICAgY29uc3QgaW1wb3J0ZWRLZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgncmF3Jywga2V5RGF0YSwgeyBuYW1lOiAnUEJLREYyJyB9LCBmYWxzZSwgWydkZXJpdmVLZXknXSk7XG5cbiAgICAgICAgZW5jcnlwdGlvbktleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVyaXZlS2V5KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdQQktERjInLFxuICAgICAgICAgICAgICAgIHNhbHQ6IGVuY29kZXIuZW5jb2RlKCdtaWxraW8tc3RhcmdhdGUtY2FjaGUnKSxcbiAgICAgICAgICAgICAgICBpdGVyYXRpb25zOiAxMDAwMDAsXG4gICAgICAgICAgICAgICAgaGFzaDogJ1NIQS0yNTYnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGltcG9ydGVkS2V5LFxuICAgICAgICAgICAgeyBuYW1lOiAnQUVTLUNUUicsIGxlbmd0aDogMjU2IH0sXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFsnZW5jcnlwdCcsICdkZWNyeXB0J10sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5jcnlwdERhdGEgPSBhc3luYyAoZGF0YTogYW55KTogUHJvbWlzZTxVaW50OEFycmF5PiA9PiB7XG4gICAgICAgIGlmICghZW5jcnlwdGlvbktleSkgcmV0dXJuIGRhdGE7XG5cbiAgICAgICAgY29uc3QganNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIGNvbnN0IGRhdGFCeXRlcyA9IGVuY29kZXIuZW5jb2RlKGpzb25TdHJpbmcpO1xuXG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZEFycmF5QnVmZmVyID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBRVMtQ1RSJyxcbiAgICAgICAgICAgICAgICBjb3VudGVyOiBjb3VudGVyLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogNjQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleSEsXG4gICAgICAgICAgICBkYXRhQnl0ZXMsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGVuY3J5cHRlZEFycmF5QnVmZmVyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZGVjcnlwdERhdGEgPSBhc3luYyAoZW5jcnlwdGVkRGF0YTogQXJyYXlCdWZmZXIgfCBVaW50OEFycmF5KTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgICAgICAgaWYgKCFlbmNyeXB0aW9uS2V5IHx8ICFlbmNyeXB0ZWREYXRhKSByZXR1cm4gZW5jcnlwdGVkRGF0YTtcblxuICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGVuY3J5cHRlZERhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gKGVuY3J5cHRlZERhdGEuYnVmZmVyIGFzIEFycmF5QnVmZmVyKSA6IGVuY3J5cHRlZERhdGE7XG5cbiAgICAgICAgY29uc3QgZGVjcnlwdGVkQnl0ZXMgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FFUy1DVFInLFxuICAgICAgICAgICAgICAgIGNvdW50ZXI6IGNvdW50ZXIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiA2NCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5ISxcbiAgICAgICAgICAgIGFycmF5QnVmZmVyLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgICAgICAgY29uc3QganNvblN0cmluZyA9IGRlY29kZXIuZGVjb2RlKGRlY3J5cHRlZEJ5dGVzKTtcbiAgICAgICAgcmV0dXJuIHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGpzb25TdHJpbmcpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTx7IGRhdGE6IGFueTsgdGltZXN0YW1wOiBudW1iZXIgfSB8IG51bGw+IHtcbiAgICAgICAgICAgIGNvbnN0IGRiID0gYXdhaXQgb3BlbkRCKCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oU1RPUkVfTkFNRSwgJ3JlYWRvbmx5Jyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShTVE9SRV9OQU1FKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uZW5jcnlwdGlvbiAmJiAocmVzdWx0LmRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCByZXN1bHQuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNyeXB0ZWREYXRhID0gYXdhaXQgZGVjcnlwdERhdGEocmVzdWx0LmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7IGRhdGE6IGRlY3J5cHRlZERhdGEsIHRpbWVzdGFtcDogcmVzdWx0LnRpbWVzdGFtcCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0ID8/IG51bGwpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgc2V0KGtleTogc3RyaW5nLCBkYXRhOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgIGNvbnN0IGRiID0gYXdhaXQgb3BlbkRCKCk7XG4gICAgICAgICAgICBsZXQgZGF0YVRvU3RvcmU6IGFueSA9IGRhdGE7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5lbmNyeXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgZGF0YVRvU3RvcmUgPSBhd2FpdCBlbmNyeXB0RGF0YShkYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsICdyZWFkd3JpdGUnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKFNUT1JFX05BTUUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5wdXQoeyBkYXRhOiBkYXRhVG9TdG9yZSwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH0sIGtleSk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVDYWNoZUtleShwYXRoOiBzdHJpbmcsIHBhcmFtczogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cGF0aH06JHtKU09OLnN0cmluZ2lmeShwYXJhbXMgPz8ge30pfWA7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7O0FBa0RBLGVBQXNCLGNBQXVFLENBQUMsaUJBQXdDO0FBQUEsRUFDbEksTUFBTSxTQUFTLGdCQUFnQixTQUFTO0FBQUEsRUFDeEMsTUFBTSxTQUFTLGdCQUFnQixTQUFTO0FBQUEsRUFJeEMsSUFBSSxrQkFBdUI7QUFBQSxFQUMzQixJQUFJLGdCQUFxQjtBQUFBLEVBQ3pCLElBQUk7QUFBQSxJQUdBLElBQUksT0FBTyxZQUFZLGVBQWUsT0FBUSxRQUFnQixhQUFhO0FBQUEsTUFDdkUsTUFBTSxPQUFPLE1BQWE7QUFBQSxNQUMxQixrQkFBa0IsS0FBSztBQUFBLE1BQ3ZCLGdCQUFnQixJQUFJLEtBQUssTUFBTSxFQUFFLFdBQVcsTUFBTSxZQUFZLElBQUksQ0FBQztBQUFBLElBQ3ZFO0FBQUEsSUFDRixNQUFNO0FBQUEsRUFNUixNQUFNLGlCQUFpQixrQkFDakIsQ0FBQyxLQUFhLFNBQWlDLFNBQWtDO0FBQUEsSUFDL0UsT0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFBQSxNQUNwQyxNQUFNLFlBQVksSUFBSSxJQUFJLEdBQUc7QUFBQSxNQUM3QixNQUFNLFVBQVU7QUFBQSxRQUNaLFVBQVUsVUFBVTtBQUFBLFFBQ3BCLE1BQU0sVUFBVSxRQUFRO0FBQUEsUUFDeEIsTUFBTSxV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QUFVO0FBQUEsUUFDekQsTUFBTSxRQUFRLFlBQVksWUFBWSxVQUFVO0FBQUEsUUFDaEQsTUFBTSxVQUFVLE1BQU0sSUFBSSxHQUFHO0FBQUEsUUFDN0IsUUFBUSxVQUFVLE1BQU0sT0FBTyxRQUFRLEtBQUs7QUFBQSxRQUM1QyxRQUFRLFlBQVksWUFBWTtBQUFBLFVBQzVCLE1BQU0sU0FBUyxRQUFRO0FBQUEsVUFDdkIsSUFBSSxDQUFDLFFBQVE7QUFBQSxZQUNULFFBQVEsSUFBSTtBQUFBLFlBQ1o7QUFBQSxVQUNKO0FBQUEsVUFFQSxJQUFJLFNBQVMsZUFBZSxPQUFPLGdCQUFnQixlQUFlLE9BQU8sZ0JBQWdCLGFBQWE7QUFBQSxZQUNsRyxNQUFNLGdCQUFnQixNQUFNLFlBQVksT0FBTyxJQUFJO0FBQUEsWUFDbkQsUUFBUSxFQUFFLE1BQU0sZUFBZSxXQUFXLE9BQU8sVUFBVSxDQUFDO0FBQUEsWUFDNUQ7QUFBQSxVQUNKO0FBQUEsVUFFQSxRQUFRLFVBQVUsSUFBSTtBQUFBO0FBQUEsT0FFN0I7QUFBQTtBQUFBLFNBRUMsSUFBRyxDQUFDLEtBQWEsTUFBMEI7QUFBQSxNQUM3QyxNQUFNLEtBQUssTUFBTSxPQUFPO0FBQUEsTUFDeEIsSUFBSSxjQUFtQjtBQUFBLE1BRXZCLElBQUksU0FBUyxZQUFZO0FBQUEsUUFDckIsY0FBYyxNQUFNLFlBQVksSUFBSTtBQUFBLE1BQ3hDO0FBQUEsTUFFQSxPQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUFBLFFBQ3BDLE1BQU0sY0FBYyxHQUFHLFlBQVksWUFBWSxXQUFXO0FBQUEsUUFDMUQsTUFBTSxRQUFRLFlBQVksWUFBWSxVQUFVO0FBQUEsUUFDaEQsTUFBTSxVQUFVLE1BQU0sSUFBSSxFQUFFLE1BQU0sYUFBYSxXQUFXLEtBQUssSUFBSSxFQUFFLEdBQUcsR0FBRztBQUFBLFFBQzNFLFFBQVEsVUFBVSxNQUFNLE9BQU8sUUFBUSxLQUFLO0FBQUEsUUFDNUMsUUFBUSxZQUFZLE1BQU0sUUFBUTtBQUFBLE9BQ3JDO0FBQUE7QUFBQSxFQUVUO0FBQUE7QUFHSixTQUFTLGdCQUFnQixDQUFDLE1BQWMsUUFBcUI7QUFBQSxFQUN6RCxPQUFPLEdBQUcsUUFBUSxLQUFLLFVBQVUsVUFBVSxDQUFDLENBQUM7QUFBQTsiLAogICJkZWJ1Z0lkIjogIjY3OEY1NDJEMkRCMkU3OUI2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
744
+ //# debugId=1DE05FA24E6D938464756E2164756E21
745
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IHR5cGUgTWlsa2lvU3RhcmdhdGVPcHRpb25zID0ge1xuICAgIGJhc2VVcmw6IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpIHwgKCgpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICBmZXRjaD86IHR5cGVvZiBmZXRjaDtcbiAgICBhYm9ydD86IHR5cGVvZiBBYm9ydENvbnRyb2xsZXI7XG4gICAgY2FjaGVTdG9yYWdlPzogQ2FjaGVTdG9yYWdlO1xuICAgIGNhY2hlRW5jcnlwdGlvbj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBNaXhpbjxULCBVPiA9IFUgJiBPbWl0PFQsIGtleW9mIFU+O1xuXG5leHBvcnQgdHlwZSBDYWNoZVN0cmF0ZWd5ID0gJ29mZicgfCAnZmFsbGJhY2snIHwgJ3Rocm90dGxlJztcblxuZXhwb3J0IHR5cGUgUmV0cnlTdHJhdGVneSA9IGJvb2xlYW4gfCBudW1iZXI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVTdG9yYWdlIHtcbiAgICBnZXQ6IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTx7IGRhdGE6IGFueTsgdGltZXN0YW1wOiBudW1iZXIgfSB8IG51bGw+O1xuICAgIHNldDogKGtleTogc3RyaW5nLCBkYXRhOiBhbnkpID0+IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCB0eXBlIEV4ZWN1dGVPcHRpb25zPFQgZXh0ZW5kcyBhbnk+ID0ge1xuICAgIHBhcmFtcz86IFJlY29yZDxhbnksIGFueT47XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICBiYXNlVXJsPzogc3RyaW5nIHwgKCgpID0+IHN0cmluZykgfCAoKCkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICBjYWNoZVN0cmF0ZWd5PzogQ2FjaGVTdHJhdGVneTtcbiAgICBjYWNoZVRocm90dGxlTXM/OiBudW1iZXI7XG4gICAgb25DYWNoZUhpdD86IChyZXN1bHQ6IFQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIHJldHJ5U3RyYXRlZ3k/OiBSZXRyeVN0cmF0ZWd5O1xufTtcblxuZXhwb3J0IHR5cGUgRXhlY3V0ZVJlc3VsdHNPcHRpb24gPSB7IGV4ZWN1dGVJZDogc3RyaW5nIH07XG5cbmV4cG9ydCB0eXBlIFBpbmcgPVxuICAgIHwgW1xuICAgICAgICB7XG4gICAgICAgICAgICBjb25uZWN0OiBmYWxzZTtcbiAgICAgICAgICAgIGRlbGF5OiBudW1iZXI7XG4gICAgICAgICAgICBlcnJvcjogYW55O1xuICAgICAgICB9LFxuICAgICAgICBudWxsLFxuICAgIF1cbiAgICB8IFtcbiAgICAgICAgbnVsbCxcbiAgICAgICAge1xuICAgICAgICAgICAgY29ubmVjdDogdHJ1ZTtcbiAgICAgICAgICAgIGRlbGF5OiBudW1iZXI7XG4gICAgICAgICAgICBzZXJ2ZXJUaW1lc3RhbXA6IG51bWJlcjtcbiAgICAgICAgfSxcbiAgICBdO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN0YXJnYXRlPEdlbmVyYXRlZCBleHRlbmRzIHsgcm91dGVTY2hlbWE6IGFueTsgcmVqZWN0Q29kZTogYW55OyBldmVudHM6IGFueSB9PihzdGFyZ2F0ZU9wdGlvbnM6IE1pbGtpb1N0YXJnYXRlT3B0aW9ucykge1xuICAgIGNvbnN0ICRmZXRjaCA9IHN0YXJnYXRlT3B0aW9ucy5mZXRjaCA/PyBmZXRjaDtcbiAgICBjb25zdCAkYWJvcnQgPSBzdGFyZ2F0ZU9wdGlvbnMuYWJvcnQgPz8gQWJvcnRDb250cm9sbGVyO1xuXG4gICAgdHlwZSBTdGFyZ2F0ZUV2ZW50cyA9IHtcbiAgICAgICAgJ21pbGtpbzpleGVjdXRlQmVmb3JlJzogeyBwYXRoOiBzdHJpbmc7IG9wdGlvbnM6IE1peGluPEV4ZWN1dGVPcHRpb25zPGFueT4sIHsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgYmFzZVVybDogc3RyaW5nIH0+IH07XG4gICAgICAgICdtaWxraW86ZmV0Y2hCZWZvcmUnOiB7IHBhdGg6IHN0cmluZzsgb3B0aW9uczogTWl4aW48RXhlY3V0ZU9wdGlvbnM8YW55PiwgeyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBiYXNlVXJsOiBzdHJpbmcgfT47IGJvZHk6IHN0cmluZyB9O1xuICAgICAgICAnbWlsa2lvOmV4ZWN1dGVFcnJvcic6IHtcbiAgICAgICAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgICAgICAgIG9wdGlvbnM6IE1peGluPEV4ZWN1dGVPcHRpb25zPGFueT4sIHsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgYmFzZVVybDogc3RyaW5nIH0+O1xuICAgICAgICAgICAgZXJyb3I6IFBhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+O1xuICAgICAgICAgICAgaGFuZGxlRXJyb3I6IDxLIGV4dGVuZHMga2V5b2YgUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT4+KGVycm9yOiBhbnksIGtleTogSywgaGFuZGxlcjogKGVycm9yOiBQYXJ0aWFsPEdlbmVyYXRlZFsncmVqZWN0Q29kZSddW0tdPikgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pID0+IFByb21pc2U8dm9pZD47XG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZUVycm9yOiBhbnkgPSBhc3luYyAoZXJyb3I6IGFueSwga2V5OiBzdHJpbmcsIGhhbmRsZXI6IChlcnJvcjogYW55KSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPikgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIGVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVkID0gYXdhaXQgaGFuZGxlcihlcnJvcltrZXldKTtcbiAgICAgICAgICAgIGlmIChoYW5kbGVkKSBkZWxldGUgZXJyb3Jba2V5XTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBfX2luaXRFdmVudE1hbmFnZXIgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gbmV3IE1hcDwoZXZlbnQ6IGFueSkgPT4gdm9pZCwgc3RyaW5nPigpO1xuICAgICAgICBjb25zdCBpbmRleGVkID0gbmV3IE1hcDxzdHJpbmcsIFNldDwoZXZlbnQ6IGFueSkgPT4gdm9pZD4+KCk7XG5cbiAgICAgICAgY29uc3QgZXZlbnRNYW5hZ2VyID0ge1xuICAgICAgICAgICAgb246IDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgSGFuZGxlciBleHRlbmRzIChldmVudDogU3RhcmdhdGVFdmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ZWQuaGFzKGtleSBhcyBzdHJpbmcpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBpbmRleGVkLnNldChrZXkgYXMgc3RyaW5nLCBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKSE7XG4gICAgICAgICAgICAgICAgc2V0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIHNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvZmY6IDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgSGFuZGxlciBleHRlbmRzIChldmVudDogU3RhcmdhdGVFdmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNldCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVtaXQ6IGFzeW5jIDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgVmFsdWUgZXh0ZW5kcyBTdGFyZ2F0ZUV2ZW50c1tLZXldPihrZXk6IEtleSwgdmFsdWU6IFZhbHVlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgIGlmIChoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGV2ZW50TWFuYWdlcjtcbiAgICB9O1xuXG4gICAgY29uc3QgZXZlbnRNYW5hZ2VyID0gX19pbml0RXZlbnRNYW5hZ2VyKCk7XG5cbiAgICBjb25zdCBib290c3RyYXAgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBiYXNlVXJsID0gc3RhcmdhdGVPcHRpb25zLmJhc2VVcmw7XG4gICAgICAgIGlmICh0eXBlb2YgYmFzZVVybCA9PT0gJ2Z1bmN0aW9uJykgYmFzZVVybCA9IGF3YWl0IGJhc2VVcmwoKTtcbiAgICAgICAgaWYgKGJhc2VVcmwuZW5kc1dpdGgoJy8nKSkgYmFzZVVybCA9IGJhc2VVcmwuc2xpY2UoMCwgLTEpO1xuXG4gICAgICAgIHJldHVybiBiYXNlVXJsO1xuICAgIH07XG5cbiAgICBjb25zdCBiYXNlVXJsUHJvbWlzZTogUHJvbWlzZTxzdHJpbmc+ID0gYm9vdHN0cmFwKCk7XG4gICAgLy8gQ2FjaGUgcmVzb2x2ZWQgYmFzZVVybCB0byBhdm9pZCBhd2FpdCBvdmVyaGVhZCBvbiByZXBlYXRlZCBjYWxsc1xuICAgIGxldCByZXNvbHZlZEJhc2VVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIC8vIENhY2hlIFVSTCBmb3IgbGFzdCBwYXRoIHRvIGF2b2lkIHN0cmluZyBjb25jYXRlbmF0aW9uIHBlciByZXF1ZXN0XG4gICAgbGV0IGNhY2hlZFVybFBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjYWNoZWRVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3Qgc3RhcmdhdGUgPSB7XG4gICAgICAgIC4uLmV2ZW50TWFuYWdlcixcbiAgICAgICAgb3B0aW9uczogc3RhcmdhdGVPcHRpb25zLFxuICAgICAgICBhc3luYyBleGVjdXRlPFBhdGggZXh0ZW5kcyBrZXlvZiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ10+KFxuICAgICAgICAgICAgcGF0aDogUGF0aCxcbiAgICAgICAgICAgIG9wdGlvbnM6IE1peGluPFxuICAgICAgICAgICAgICAgIEV4ZWN1dGVPcHRpb25zPEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncmVzdWx0J10+LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zPzogR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydwYXJhbXMnXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA+LFxuICAgICAgICApOiBQcm9taXNlPFxuICAgICAgICAgICAgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWyfwn6WbJ10gZXh0ZW5kcyBib29sZWFuXG4gICAgICAgICAgICA/IC8vIGFjdGlvblxuICAgICAgICAgICAgW1BhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+LCBudWxsLCBFeGVjdXRlUmVzdWx0c09wdGlvbl0gfCBbbnVsbCwgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydyZXN1bHQnXSwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dXG4gICAgICAgICAgICA6IC8vIHN0cmVhbVxuICAgICAgICAgICAgW1BhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+LCBudWxsLCBFeGVjdXRlUmVzdWx0c09wdGlvbl0gfCBbbnVsbCwgQXN5bmNHZW5lcmF0b3I8W1BhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+LCBudWxsXSB8IFtudWxsLCBHZW5lcmF0b3JHZW5lcmljPEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncmVzdWx0J10+XSwgdW5kZWZpbmVkPiwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dXG4gICAgICAgID4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGVhZGVycyA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnMgPSB7fTtcblxuICAgICAgICAgICAgbGV0IHVybDogc3RyaW5nO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmFzZVVybCkge1xuICAgICAgICAgICAgICAgIGxldCBiYXNlVXJsID0gb3B0aW9ucy5iYXNlVXJsO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYmFzZVVybCA9PT0gJ2Z1bmN0aW9uJykgYmFzZVVybCA9IGF3YWl0IGJhc2VVcmwoKTtcbiAgICAgICAgICAgICAgICBpZiAoYmFzZVVybC5lbmRzV2l0aCgnLycpKSBiYXNlVXJsID0gYmFzZVVybC5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICAgICAgdXJsID0gYmFzZVVybCArIChwYXRoIGFzIHN0cmluZyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWRCYXNlVXJsKSByZXNvbHZlZEJhc2VVcmwgPSBhd2FpdCBiYXNlVXJsUHJvbWlzZTtcbiAgICAgICAgICAgICAgICAvLyBDYWNoZSBVUkwgZm9yIHJlcGVhdGVkIHBhdGggdG8gYXZvaWQgc3RyaW5nIGNvbmNhdGVuYXRpb25cbiAgICAgICAgICAgICAgICBpZiAocGF0aCA9PT0gY2FjaGVkVXJsUGF0aCAmJiBjYWNoZWRVcmwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gY2FjaGVkVXJsO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IHJlc29sdmVkQmFzZVVybCArIChwYXRoIGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgIGNhY2hlZFVybFBhdGggPSBwYXRoIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVkVXJsID0gdXJsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCEocGF0aCBhcyBzdHJpbmcpLmVuZHNXaXRoKCd+JykpIHtcbiAgICAgICAgICAgICAgICAvLyBhY3Rpb25cbiAgICAgICAgICAgICAgICAvLyBTZXQgZGVmYXVsdCBoZWFkZXJzIG9ubHkgaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgICAgICAgICAgICAgIGNvbnN0IGggPSBvcHRpb25zLmhlYWRlcnM7XG4gICAgICAgICAgICAgICAgaWYgKGguQWNjZXB0ID09PSB1bmRlZmluZWQpIGguQWNjZXB0ID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuICAgICAgICAgICAgICAgIGlmIChoWydDb250ZW50LVR5cGUnXSA9PT0gdW5kZWZpbmVkKSBoWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlU3RyYXRlZ3kgPSBvcHRpb25zLmNhY2hlU3RyYXRlZ3kgPz8gJ29mZic7XG4gICAgICAgICAgICAgICAgbGV0IHJldHJ5Q291bnQgPSAwO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnJldHJ5U3RyYXRlZ3kgPT09IHRydWUgfHwgb3B0aW9ucy5yZXRyeVN0cmF0ZWd5ID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJ5Q291bnQgPSAyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMucmV0cnlTdHJhdGVneSA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5yZXRyeVN0cmF0ZWd5ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXRyeUNvdW50ID0gb3B0aW9ucy5yZXRyeVN0cmF0ZWd5O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aDogbm8gY2FjaGUsIG5vIHJldHJ5XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgPT09ICdvZmYnICYmIHJldHJ5Q291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUJlZm9yZScsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMucGFyYW1zKSA/PyAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZmV0Y2hCZWZvcmUnLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgYm9keSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICRmZXRjaCh1cmwsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHksIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZSh0ZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkLnN1Y2Nlc3MgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnI6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycltwYXJzZWQuY29kZV0gPSBwYXJzZWQucmVqZWN0ID8/IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtlcnIsIG51bGwsIHsgZXhlY3V0ZUlkOiBwYXJzZWQuZXhlY3V0ZUlkIH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBwYXJzZWQuZGF0YSwgeyBleGVjdXRlSWQ6IHBhcnNlZC5leGVjdXRlSWQgfV07XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcj8uWzBdPy5SRVFVRVNUX1RJTUVPVVQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2Vycm9yLCBudWxsLCB7IGV4ZWN1dGVJZDogJycgfV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvclBpbmVkID0geyBSRVFVRVNUX0ZBSUw6IGVycm9yIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2Vycm9yUGluZWQsIG51bGwsIHsgZXhlY3V0ZUlkOiAndW5rbm93bicgfV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZVRocm90dGxlTXMgPSBvcHRpb25zLmNhY2hlVGhyb3R0bGVNcyA/PyAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gZ2VuZXJhdGVDYWNoZUtleShwYXRoIGFzIHN0cmluZywgb3B0aW9ucy5wYXJhbXMpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGNhY2hlU3RvcmFnZSA9IHN0YXJnYXRlT3B0aW9ucy5jYWNoZVN0b3JhZ2U7XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgIT09ICdvZmYnICYmICFjYWNoZVN0b3JhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVTdG9yYWdlID0gYXdhaXQgY3JlYXRlRGVmYXVsdENhY2hlU3RvcmFnZSh7IGVuY3J5cHRpb246IHN0YXJnYXRlT3B0aW9ucy5jYWNoZUVuY3J5cHRpb24gfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgIT09ICdvZmYnICYmIGNhY2hlU3RvcmFnZSAmJiBvcHRpb25zLm9uQ2FjaGVIaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FjaGVkID0gYXdhaXQgY2FjaGVTdG9yYWdlLmdldChjYWNoZUtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5vbkNhY2hlSGl0KGNhY2hlZC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBvbkNhY2hlSGl0IGVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgPT09ICd0aHJvdHRsZScgJiYgY2FjaGVTdG9yYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IGNhY2hlU3RvcmFnZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkICYmIERhdGUubm93KCkgLSBjYWNoZWQudGltZXN0YW1wIDwgY2FjaGVUaHJvdHRsZU1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW251bGwsIGNhY2hlZC5kYXRhLCB7IGV4ZWN1dGVJZDogJ2NhY2hlZCcgfV0gYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlQmVmb3JlJywgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnkgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMucGFyYW1zKSA/PyAnJztcbiAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmZldGNoQmVmb3JlJywgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGJvZHkgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBleGVjdXRlUmVxdWVzdCA9IGFzeW5jIChpc1JldHJ5OiBib29sZWFuKTogUHJvbWlzZTx7IHJlc3VsdDogeyB2YWx1ZTogUmVjb3JkPGFueSwgYW55PiB9IHwgbnVsbDsgZXJyb3I6IGFueTsgaXNOZXR3b3JrRXJyb3I6IGJvb2xlYW4gfT4gPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAkZmV0Y2godXJsLCB7IG1ldGhvZDogJ1BPU1QnLCBib2R5LCBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnMgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHJlc3VsdDogeyB2YWx1ZTogcGFyc2VkIH0sIGVycm9yOiBudWxsLCBpc05ldHdvcmtFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNOZXR3b3JrRXJyb3IgPSAhZXJyb3I/LlswXT8uUkVRVUVTVF9USU1FT1VUO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiBudWxsLCBlcnJvciwgaXNOZXR3b3JrRXJyb3IgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBsZXQgeyByZXN1bHQsIGVycm9yLCBpc05ldHdvcmtFcnJvciB9ID0gYXdhaXQgZXhlY3V0ZVJlcXVlc3QoZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcmV0cnlJbmRleCA9IDA7IHJldHJ5SW5kZXggPCByZXRyeUNvdW50ICYmIGVycm9yICYmIGlzTmV0d29ya0Vycm9yOyByZXRyeUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJ5SW5kZXggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MDApKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXRyeVJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVSZXF1ZXN0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXRyeVJlc3VsdC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gcmV0cnlSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIGlzTmV0d29ya0Vycm9yID0gcmV0cnlSZXN1bHQuaXNOZXR3b3JrRXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcj8uWzBdPy5SRVFVRVNUX1RJTUVPVVQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUVycm9yJywgeyBoYW5kbGVFcnJvciwgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZVN0cmF0ZWd5ICE9PSAnb2ZmJyAmJiBjYWNoZVN0b3JhZ2UgJiYgaXNOZXR3b3JrRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IGNhY2hlU3RvcmFnZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbbnVsbCwgY2FjaGVkLmRhdGEsIHsgZXhlY3V0ZUlkOiAnY2FjaGVkJyB9XSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvclBpbmVkID0geyBSRVFVRVNUX0ZBSUw6IGVycm9yIH07XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUVycm9yJywgeyBoYW5kbGVFcnJvciwgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBlcnJvcjogZXJyb3JQaW5lZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtlcnJvclBpbmVkLCBudWxsLCB7IGV4ZWN1dGVJZDogJ3Vua25vd24nIH1dO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQhLnZhbHVlLnN1Y2Nlc3MgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZXJyW3Jlc3VsdCEudmFsdWUuY29kZV0gPSByZXN1bHQhLnZhbHVlLnJlamVjdCA/PyBudWxsO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVFcnJvcicsIHsgaGFuZGxlRXJyb3IsIHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgZXJyb3I6IGVyciB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtlcnIsIG51bGwsIHsgZXhlY3V0ZUlkOiByZXN1bHQhLnZhbHVlLmV4ZWN1dGVJZCB9XTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSAhPT0gJ29mZicgJiYgY2FjaGVTdG9yYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNhY2hlU3RvcmFnZS5zZXQoY2FjaGVLZXksIHJlc3VsdCEudmFsdWUuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtudWxsLCByZXN1bHQhLnZhbHVlLmRhdGEsIHsgZXhlY3V0ZUlkOiByZXN1bHQhLnZhbHVlLmV4ZWN1dGVJZCB9XSBhcyBhbnk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHN0cmVhbVxuICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FjaGVTdHJhdGVneSA9ICdvZmYnO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMub25DYWNoZUhpdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmNhY2hlVGhyb3R0bGVNcyA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmhlYWRlcnMuQWNjZXB0ID09PSB1bmRlZmluZWQpIG9wdGlvbnMuaGVhZGVycy5BY2NlcHQgPSAndGV4dC9ldmVudC1zdHJlYW0nO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID09PSB1bmRlZmluZWQpIG9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzdGFja3M6IE1hcDxcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lOiBib29sZWFuO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxhbnk+PjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmU6ICh2YWx1ZTogSXRlcmF0b3JSZXN1bHQ8YW55PikgPT4gdm9pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdDogKHJlYXNvbjogYW55KSA9PiB2b2lkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPiA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhY2tzSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIGxldCBpdGVyYXRvckluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgc3RyZWFtUmVzdWx0OiBhbnk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtUmVzdWx0RmV0Y2hlZCA9IHdpdGhSZXNvbHZlcnM8dW5kZWZpbmVkPigpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHN0YXJnYXRlT3B0aW9ucz8udGltZW91dCA/PyBvcHRpb25zPy50aW1lb3V0ID8/IDYwMDA7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0RmV0Y2hlZC5yZWplY3QoW3sgUkVRVUVTVF9USU1FT1VUOiB7IHRpbWVvdXQsIG1lc3NhZ2U6IGBFeGVjdXRlIHRpbWVvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zLmAgfSB9LCBudWxsLCB7IGV4ZWN1dGVJZDogJ3Vua25vd24nIH1dKTtcbiAgICAgICAgICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG9ubWVzc2FnZSA9IChldmVudDogRXZlbnRTb3VyY2VNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5kYXRhLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1SZXN1bHQgPSByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhLnNsaWNlKDEpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0RmV0Y2hlZC5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0RmV0Y2hlZC5yZWplY3QoW3sgUkVRVUVTVF9GQUlMOiBlcnJvciB9LCBudWxsLCB7IGV4ZWN1dGVJZDogJ3Vua25vd24nIH1dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSArK3N0YWNrc0luZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrcy5oYXMoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBzdGFja3MuZ2V0KGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjayEuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2shLnJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWU6IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGV2ZW50LmRhdGEpKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrcy5zZXQoaW5kZXgsIHsgLi4uc3RhY2ssIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGxldCBjdXJSZXF1ZXN0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuXG4gICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJSZXF1ZXN0Q29udHJvbGxlciA9IG5ldyAkYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlQmVmb3JlJywgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnkgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zIS5wYXJhbXMpID8/ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpmZXRjaEJlZm9yZScsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBib2R5IH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICRmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBvcHRpb25zIS5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKCd0ZXh0L2V2ZW50LXN0cmVhbScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBjb250ZW50LXR5cGUgdG8gYmUgJHsndGV4dC9ldmVudC1zdHJlYW0nfSwgQWN0dWFsOiAke2NvbnRlbnRUeXBlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBnZXRCeXRlcyhyZXNwb25zZS5ib2R5ISwgZ2V0TGluZXMoZ2V0TWVzc2FnZXMob25tZXNzYWdlKSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB7IFJFUVVFU1RfRkFJTDogZXJyIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVFcnJvcicsIHsgaGFuZGxlRXJyb3IsIHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBpdGVyYXRvci50aHJvdyhlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0RmV0Y2hlZC5yZWplY3QoW2Vycm9yLCBudWxsLCB7IGV4ZWN1dGVJZDogJ3Vua25vd24nIH1dKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZvaWQgY3JlYXRlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx1bmtub3duPj4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gKytpdGVyYXRvckluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja3MuaGFzKGluZGV4IC0gMikpIHN0YWNrcy5kZWxldGUoaW5kZXggLSAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrcy5oYXMoaW5kZXgpICYmICFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tzLnNldChpbmRleCwgeyAuLi5zdGFjaywgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrcy5oYXMoaW5kZXgpICYmIGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFja3MuZ2V0KGluZGV4KSEucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbXywgaXRlcmF0b3JdIG9mIHN0YWNrcykgaXRlcmF0b3IucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIHRocm93KGVycjogYW55KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVJZDogc3RyZWFtUmVzdWx0Py5leGVjdXRlSWQgPz8gJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICdORVRXT1JLX0VSUk9SJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdOZXR3b3JrIEVycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21DbGllbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBlcnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfaW5kZXgsIHN0YWNrXSBvZiBzdGFja3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrLmRvbmUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbXywgaXRlcmF0b3JdIG9mIHN0YWNrcykgaXRlcmF0b3IucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXN5bmNJdGVyYXRvcjx1bmtub3duPiksXG4gICAgICAgICAgICAgICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgc3RyZWFtUmVzdWx0RmV0Y2hlZC5wcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW251bGwsIGl0ZXJhdG9yLCB7IGV4ZWN1dGVJZDogc3RyZWFtUmVzdWx0LmV4ZWN1dGVJZCB9XSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yIGFzIGFueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIF9fY29va2Jvb2s6IHtcbiAgICAgICAgICAgIHN1YnNjcmliZTogYXN5bmMgKGJhc2VVcmw6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgICAgIEFjY2VwdDogJ3RleHQvZXZlbnQtc3RyZWFtJyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcykgPz8gJyc7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhY2tzOiBNYXA8XG4gICAgICAgICAgICAgICAgICAgIG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2U6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8YW55Pj47XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiAodmFsdWU6IEl0ZXJhdG9yUmVzdWx0PGFueT4pID0+IHZvaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3Q6IChyZWFzb246IGFueSkgPT4gdm9pZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgID4gPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICAgICAgbGV0IHN0YWNrc0luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgaXRlcmF0b3JJbmRleCA9IDA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvbm1lc3NhZ2UgPSAoZXZlbnQ6IEV2ZW50U291cmNlTWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9ICsrc3RhY2tzSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFja3MuaGFzKGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBzdGFja3MuZ2V0KGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrIS5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhKSkgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWU6IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGV2ZW50LmRhdGEpKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrcy5zZXQoaW5kZXgsIHsgLi4uc3RhY2ssIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGxldCBjdXJSZXF1ZXN0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuXG4gICAgICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJSZXF1ZXN0Q29udHJvbGxlciA9IG5ldyAkYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAkZmV0Y2goYCR7YmFzZVVybH0vJHN1YnNjcmliZWAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsOiBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKCd0ZXh0L2V2ZW50LXN0cmVhbScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBjb250ZW50LXR5cGUgdG8gYmUgJHsndGV4dC9ldmVudC1zdHJlYW0nfSwgQWN0dWFsOiAke2NvbnRlbnRUeXBlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBnZXRCeXRlcyhyZXNwb25zZS5ib2R5ISwgZ2V0TGluZXMoZ2V0TWVzc2FnZXMob25tZXNzYWdlKSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3IudGhyb3coZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZvaWQgY3JlYXRlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx1bmtub3duPj4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gKytpdGVyYXRvckluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja3MuaGFzKGluZGV4IC0gMikpIHN0YWNrcy5kZWxldGUoaW5kZXggLSAyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrcy5oYXMoaW5kZXgpICYmICFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tzLnNldChpbmRleCwgeyAuLi5zdGFjaywgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrcy5oYXMoaW5kZXgpICYmIGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFja3MuZ2V0KGluZGV4KSEucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbXywgaXRlcmF0b3JdIG9mIHN0YWNrcykgaXRlcmF0b3IucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIHRocm93KGVycjogYW55KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbXywgaXRlcmF0b3JdIG9mIHN0YWNrcykgaXRlcmF0b3IucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXN5bmNJdGVyYXRvcjx1bmtub3duPiksXG4gICAgICAgICAgICAgICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvciBhcyBhbnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgX19hc3RyYUVtaXRFdmVudDogYXN5bmMgKGtleTogYW55LCBvcHRpb25zPzogeyBwYXJhbXM/OiBhbnk7IGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBvcHRpb25zID8/IHt9O1xuICAgICAgICAgICAgaWYgKG9wdHMuaGVhZGVycyA9PT0gdW5kZWZpbmVkKSBvcHRzLmhlYWRlcnMgPSB7fTtcbiAgICAgICAgICAgIGlmIChvcHRzLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID09PSB1bmRlZmluZWQpIG9wdHMuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIGxldCB1cmw6IHN0cmluZztcbiAgICAgICAgICAgIGlmICghcmVzb2x2ZWRCYXNlVXJsKSByZXNvbHZlZEJhc2VVcmwgPSBhd2FpdCBiYXNlVXJsUHJvbWlzZTtcbiAgICAgICAgICAgIC8vIOWFvOWuueS4jeWQjOi/kOihjOaXtu+8muS8mOWFiOS9v+eUqCBidG9h77yM5Zue6YCA5YiwIEJ1ZmZlclxuICAgICAgICAgICAgbGV0IGJhc2U2NE5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYnRvYSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBiYXNlNjROYW1lID0gYnRvYShrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBiYXNlNjROYW1lID0gQnVmZmVyLmZyb20oa2V5IGFzIHN0cmluZykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGJhc2U2NCBlbmNvZGVyIGF2YWlsYWJsZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXJsID0gYCR7cmVzb2x2ZWRCYXNlVXJsfS8kZXZlbnQvJHtlbmNvZGVVUklDb21wb25lbnQoYmFzZTY0TmFtZSl9YDtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkob3B0cy5wYXJhbXMpID8/ICcnO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKHVybCwgeyBtZXRob2Q6ICdQT1NUJywgYm9keSwgaGVhZGVyczogb3B0cy5oZWFkZXJzIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UodGV4dCkpO1xuICAgICAgICAgICAgICAgIGlmIChwYXJzZWQuc3VjY2VzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnI6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBlcnJbcGFyc2VkLmNvZGVdID0gcGFyc2VkLnJlamVjdCA/PyBudWxsO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2VyciwgbnVsbCwgeyBleGVjdXRlSWQ6IHBhcnNlZC5leGVjdXRlSWQgfV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbbnVsbCwgcGFyc2VkLmRhdGEsIHsgZXhlY3V0ZUlkOiBwYXJzZWQuZXhlY3V0ZUlkIH1dO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yUGluZWQgPSB7IFJFUVVFU1RfRkFJTDogZXJyb3IgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2Vycm9yUGluZWQsIG51bGwsIHsgZXhlY3V0ZUlkOiAndW5rbm93bicgfV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgcGluZyhvcHRpb25zPzogeyB0aW1lb3V0PzogbnVtYmVyIH0pOiBQcm9taXNlPFBpbmc+IHtcbiAgICAgICAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8UGluZz4oYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBgJHthd2FpdCBiYXNlVXJsUHJvbWlzZX0vZ2VuZXJhdGVfMjA0YDtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gc3RhcmdhdGVPcHRpb25zPy50aW1lb3V0ID8/IG9wdGlvbnM/LnRpbWVvdXQgPz8gNjAwMDtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydHNUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRzVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoW3sgY29ubmVjdDogZmFsc2UsIGRlbGF5OiBlbmRzVGltZSAtIHN0YXJ0c1RpbWUsIGVycm9yOiB7IFJFUVVFU1RfVElNRU9VVDogeyB0aW1lb3V0LCBtZXNzYWdlOiBgRXhlY3V0ZSB0aW1lb3V0IGFmdGVyICR7dGltZW91dH1tcy5gIH0gfSB9LCBudWxsXSk7XG4gICAgICAgICAgICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICRmZXRjaCh1cmwsIHsgbWV0aG9kOiAnSEVBRCcgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZHNUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFt7IGNvbm5lY3Q6IGZhbHNlLCBkZWxheTogZW5kc1RpbWUgLSBzdGFydHNUaW1lLCBlcnJvcjogeyBSRVFVRVNUX0ZBSUw6IHsgcmVzcG9uc2UsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBtZXNzYWdlOiAnU3RhdHVzIGNvZGUgbm90IDIwNCcgfSB9IH0sIG51bGxdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoW251bGwsIHsgY29ubmVjdDogdHJ1ZSwgZGVsYXk6IGVuZHNUaW1lIC0gc3RhcnRzVGltZSwgc2VydmVyVGltZXN0YW1wOiBOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpIS5zdWJzdHJpbmcoMTcpKSB9XSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRzVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbeyBjb25uZWN0OiBmYWxzZSwgZGVsYXk6IGVuZHNUaW1lIC0gc3RhcnRzVGltZSwgZXJyb3IgfSwgbnVsbF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgICR0eXBlczogdW5kZWZpbmVkIGFzIHVua25vd24gYXMge1xuICAgICAgICAgICAgZ2VuZXJhdGVkOiBHZW5lcmF0ZWQ7XG4gICAgICAgICAgICBlcnJvcjogR2VuZXJhdGVkWydyZWplY3RDb2RlJ107XG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICBbUGF0aCBpbiBrZXlvZiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11dOiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ3BhcmFtcyddO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlc3VsdHM6IHtcbiAgICAgICAgICAgICAgICBbUGF0aCBpbiBrZXlvZiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11dOiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ/CfpZsnXSBleHRlbmRzIGJvb2xlYW5cbiAgICAgICAgICAgICAgICA/IC8vIGFjdGlvblxuICAgICAgICAgICAgICAgIEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncmVzdWx0J11cbiAgICAgICAgICAgICAgICA6IC8vIHN0cmVhbVxuICAgICAgICAgICAgICAgIEFzeW5jR2VuZXJhdG9yPFtQYXJ0aWFsPEdlbmVyYXRlZFsncmVqZWN0Q29kZSddPiwgbnVsbF0gfCBbbnVsbCwgR2VuZXJhdG9yR2VuZXJpYzxHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ3Jlc3VsdCddPl0sIHVuZGVmaW5lZD47XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gc3RhcmdhdGU7XG59XG5cbmNvbnN0IGlzb0RhdGVQYXR0ZXJuID0gL14oXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGR7MSwzfSk/KShafFsrLV1cXGR7Mn06P1xcZHsyfSk/JC87XG5cbmV4cG9ydCBmdW5jdGlvbiByZXZpdmVKU09OUGFyc2U8VD4oanNvbjogVCk6IFQge1xuICAgIGlmIChqc29uID09PSBudWxsIHx8IGpzb24gPT09IHVuZGVmaW5lZCkgcmV0dXJuIGpzb247XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBqc29uO1xuICAgIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAoanNvbiBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBqc29uO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uKSkge1xuICAgICAgICAgICAgY29uc3QgbGVuID0ganNvbi5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmV2aXZlSlNPTlBhcnNlKGpzb25baV0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IGpzb25baV0pIGpzb25baV0gPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4ganNvbjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoanNvbiBhcyBvYmplY3QpO1xuICAgICAgICBjb25zdCBvYmogPSBqc29uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmV2aXZlSlNPTlBhcnNlKHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHZhbHVlKSBvYmpba2V5XSA9IHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ganNvbjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IHN0ciA9IGpzb24gYXMgdW5rbm93biBhcyBzdHJpbmc7XG4gICAgICAgIC8vIFF1aWNrIHJlamVjdDogSVNPIGRhdGUgc3RyaW5ncyBtdXN0IHN0YXJ0IHdpdGggYSBkaWdpdCBhbmQgY29udGFpbiAnVCdcbiAgICAgICAgY29uc3QgbGVuID0gc3RyLmxlbmd0aDtcbiAgICAgICAgaWYgKGxlbiA+PSAyMCAmJiBsZW4gPD0gMzIgJiYgc3RyLmNoYXJDb2RlQXQoMCkgPj0gMHgzMCAmJiBzdHIuY2hhckNvZGVBdCgwKSA8PSAweDM5ICYmIHN0ci5pbmRleE9mKCdUJykgIT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IHN0ci5tYXRjaChpc29EYXRlUGF0dGVybik7XG4gICAgICAgICAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sb25Qb3MgPSBtYXRjaFsyXS5jaGFyQ29kZUF0KDMpID09PSA1OCA/IG1hdGNoWzFdLmxlbmd0aCArIDMgOiAtMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9uUG9zID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShzdHIuc3Vic3RyaW5nKDAsIGNvbG9uUG9zKSArIHN0ci5zdWJzdHJpbmcoY29sb25Qb3MgKyAxKSkgYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShzdHIpIGFzIGFueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG1hdGNoWzFdICsgJ1onKSBhcyBhbnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGpzb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0ZVN0cmVhbU9wdGlvbnMge1xuICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBpU2NoZW1hRXh0ZW5kIHtcbiAgICBhcGlWYWxpZGF0b3I6IHtcbiAgICAgICAgZ2VuZXJhdGVkQXQ6IG51bWJlcjtcbiAgICAgICAgdmFsaWRhdGU6IFJlY29yZDxhbnksIGFueT47XG4gICAgfTtcbiAgICBhcGlNZXRob2RzU2NoZW1hOiBSZWNvcmQ8YW55LCBhbnk+O1xuICAgIGFwaU1ldGhvZHNUeXBlU2NoZW1hOiBSZWNvcmQ8YW55LCBhbnk+O1xuICAgIGFwaVRlc3RzU2NoZW1hOiBSZWNvcmQ8YW55LCBhbnk+O1xufVxuXG5leHBvcnQgdHlwZSBGYWlsQ29kZUV4dGVuZCA9IFJlY29yZDxhbnksICguLi5hcmdzOiBBcnJheTxhbnk+KSA9PiBhbnk+O1xuXG5leHBvcnQgdHlwZSBCb290c3RyYXBNaWRkbGV3YXJlID0gKGRhdGE6IHsgc3RvcmFnZTogQ2xpZW50U3RvcmFnZSB9KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbmV4cG9ydCB0eXBlIEJlZm9yZUV4ZWN1dGVNaWRkbGV3YXJlID0gKGRhdGE6IHsgcGF0aDogc3RyaW5nOyBwYXJhbXM6IGFueTsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgc3RvcmFnZTogQ2xpZW50U3RvcmFnZSB9KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbmV4cG9ydCB0eXBlIEFmdGVyRXhlY3V0ZU1pZGRsZXdhcmUgPSAoZGF0YTogeyBwYXRoOiBzdHJpbmc7IHJlc3VsdDogeyB2YWx1ZTogYW55IH07IHN0b3JhZ2U6IENsaWVudFN0b3JhZ2UgfSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlkZGxld2FyZU9wdGlvbnMge1xuICAgIGJvb3RzdHJhcD86IEJvb3RzdHJhcE1pZGRsZXdhcmU7XG4gICAgYmVmb3JlRXhlY3V0ZT86IEJlZm9yZUV4ZWN1dGVNaWRkbGV3YXJlO1xuICAgIGFmdGVyRXhlY3V0ZT86IEFmdGVyRXhlY3V0ZU1pZGRsZXdhcmU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50U3RvcmFnZSB7XG4gICAgZ2V0SXRlbTogKGtleTogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICAgIHNldEl0ZW06IChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICByZW1vdmVJdGVtOiAoa2V5OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0ZVJlc3VsdFN1Y2Nlc3M8UmVzdWx0PiB7XG4gICAgZXhlY3V0ZUlkOiBzdHJpbmc7XG4gICAgc3VjY2VzczogdHJ1ZTtcbiAgICBkYXRhOiBSZXN1bHQ7XG59XG5cbmV4cG9ydCB0eXBlIEdlbmVyYXRvckdlbmVyaWM8VD4gPSBUIGV4dGVuZHMgQXN5bmNHZW5lcmF0b3I8aW5mZXIgST4gPyBJIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIEZsYXR0ZW5LZXlzPFQsIFByZWZpeCBleHRlbmRzIHN0cmluZyA9ICcnPiA9IHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIG9iamVjdCA/IEZsYXR0ZW5LZXlzPFRbS10sIGAke1ByZWZpeH0ke0V4Y2x1ZGU8Sywgc3ltYm9sPn0uYD4gOiBgJGlucHV0LiR7UHJlZml4fSR7RXhjbHVkZTxLLCBzeW1ib2w+fWA7XG59W2tleW9mIFRdO1xuXG4vLyAqKiogVGhpcyBwYXJ0IG9mIHRoZSBjb2RlIGlzIGJhc2VkIG9uIGBAbWljcm9zb2Z0L2ZldGNoLWV2ZW50LXNvdXJjZWAgcmV3cml0ZSwgdGhhbmtzIHRvIHRoZSB3b3JrIG9mIE1pY3Jvc29mdCAqKiogLy9cbi8vICoqKiBodHRwczovL2dpdGh1Yi5jb20vQXp1cmUvZmV0Y2gtZXZlbnQtc291cmNlL2Jsb2IvbWFpbi9zcmMvcGFyc2UudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiAvL1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBtZXNzYWdlIHNlbnQgaW4gYW4gZXZlbnQgc3RyZWFtXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvU2VydmVyLXNlbnRfZXZlbnRzL1VzaW5nX3NlcnZlci1zZW50X2V2ZW50cyNFdmVudF9zdHJlYW1fZm9ybWF0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRTb3VyY2VNZXNzYWdlIHtcbiAgICBkYXRhOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBSZWFkYWJsZVN0cmVhbSBpbnRvIGEgY2FsbGJhY2sgcGF0dGVybi5cbiAqIEBwYXJhbSBzdHJlYW0gVGhlIGlucHV0IFJlYWRhYmxlU3RyZWFtLlxuICogQHBhcmFtIG9uQ2h1bmsgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggbmV3IGJ5dGUgY2h1bmsgaW4gdGhlIHN0cmVhbS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCB3aWxsIGJlIHJlc29sdmVkIHdoZW4gdGhlIHN0cmVhbSBjbG9zZXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCeXRlcyhzdHJlYW06IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+LCBvbkNodW5rOiAoYXJyOiBVaW50OEFycmF5KSA9PiB2b2lkKSB7XG4gICAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICAgIGxldCByZXN1bHQ6IFJlYWRhYmxlU3RyZWFtUmVhZFJlc3VsdDxVaW50OEFycmF5PjtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2hpbGUgKCEocmVzdWx0ID0gYXdhaXQgcmVhZGVyLnJlYWQoKSkuZG9uZSkge1xuICAgICAgICBvbkNodW5rKHJlc3VsdC52YWx1ZSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyBhcmJpdGFyeSBieXRlIGNodW5rcyBpbnRvIEV2ZW50U291cmNlIGxpbmUgYnVmZmVycy5cbiAqIEVhY2ggbGluZSBzaG91bGQgYmUgb2YgdGhlIGZvcm1hdCBcImZpZWxkOiB2YWx1ZVwiIGFuZCBlbmRzIHdpdGggXFxyLCBcXG4sIG9yIFxcclxcbi5cbiAqIEBwYXJhbSBvbkxpbmUgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggbmV3IEV2ZW50U291cmNlIGxpbmUuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBpbmNvbWluZyBieXRlIGNodW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGluZXMob25MaW5lOiAobGluZTogVWludDhBcnJheSwgZmllbGRMZW5ndGg6IG51bWJlcikgPT4gdm9pZCkge1xuICAgIGxldCBidWZmZXI6IFVpbnQ4QXJyYXkgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHBvc2l0aW9uOiBudW1iZXI7IC8vIGN1cnJlbnQgcmVhZCBwb3NpdGlvblxuICAgIGxldCBmaWVsZExlbmd0aDogbnVtYmVyOyAvLyBsZW5ndGggb2YgdGhlIGBmaWVsZGAgcG9ydGlvbiBvZiB0aGUgbGluZVxuICAgIGxldCBkaXNjYXJkVHJhaWxpbmdOZXdsaW5lID0gZmFsc2U7XG5cbiAgICAvLyByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNhbiBwcm9jZXNzIGVhY2ggaW5jb21pbmcgYnl0ZSBjaHVuazpcbiAgICByZXR1cm4gZnVuY3Rpb24gb25DaHVuayhhcnI6IFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBidWZmZXIgPSBhcnI7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IDA7XG4gICAgICAgICAgICBmaWVsZExlbmd0aCA9IC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gd2UncmUgc3RpbGwgcGFyc2luZyB0aGUgb2xkIGxpbmUuIEFwcGVuZCB0aGUgbmV3IGJ5dGVzIGludG8gYnVmZmVyOlxuICAgICAgICAgICAgYnVmZmVyID0gY29uY2F0KGJ1ZmZlciwgYXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1Zkxlbmd0aCA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgIGxldCBsaW5lU3RhcnQgPSAwOyAvLyBpbmRleCB3aGVyZSB0aGUgY3VycmVudCBsaW5lIHN0YXJ0c1xuICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBidWZMZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChkaXNjYXJkVHJhaWxpbmdOZXdsaW5lKSB7XG4gICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcltwb3NpdGlvbl0gPT09IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVTdGFydCA9ICsrcG9zaXRpb247IC8vIHNraXAgdG8gbmV4dCBjaGFyXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZGlzY2FyZFRyYWlsaW5nTmV3bGluZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzdGFydCBsb29raW5nIGZvcndhcmQgdGlsbCB0aGUgZW5kIG9mIGxpbmU6XG4gICAgICAgICAgICBsZXQgbGluZUVuZCA9IC0xOyAvLyBpbmRleCBvZiB0aGUgXFxyIG9yIFxcbiBjaGFyXG4gICAgICAgICAgICBmb3IgKDsgcG9zaXRpb24gPCBidWZMZW5ndGggJiYgbGluZUVuZCA9PT0gLTE7ICsrcG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGJ1ZmZlcltwb3NpdGlvbl0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1ODpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZExlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBjb2xvbiBpbiBsaW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRMZW5ndGggPSBwb3NpdGlvbiAtIGxpbmVTdGFydDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDEzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkVHJhaWxpbmdOZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVFbmQgPSBwb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lRW5kID0gcG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsaW5lRW5kID09PSAtMSkge1xuICAgICAgICAgICAgICAgIC8vIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGJ1dCB0aGUgbGluZSBoYXNuJ3QgZW5kZWQuXG4gICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIG5leHQgYXJyIGFuZCB0aGVuIGNvbnRpbnVlIHBhcnNpbmc6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHdlJ3ZlIHJlYWNoZWQgdGhlIGxpbmUgZW5kLCBzZW5kIGl0IG91dDpcbiAgICAgICAgICAgIG9uTGluZShidWZmZXIuc3ViYXJyYXkobGluZVN0YXJ0LCBsaW5lRW5kKSwgZmllbGRMZW5ndGgpO1xuICAgICAgICAgICAgbGluZVN0YXJ0ID0gcG9zaXRpb247IC8vIHdlJ3JlIG5vdyBvbiB0aGUgbmV4dCBsaW5lXG4gICAgICAgICAgICBmaWVsZExlbmd0aCA9IC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpbmVTdGFydCA9PT0gYnVmTGVuZ3RoKSB7XG4gICAgICAgICAgICBidWZmZXIgPSB1bmRlZmluZWQ7IC8vIHdlJ3ZlIGZpbmlzaGVkIHJlYWRpbmcgaXRcbiAgICAgICAgfSBlbHNlIGlmIChsaW5lU3RhcnQgIT09IDApIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyB2aWV3IGludG8gYnVmZmVyIGJlZ2lubmluZyBhdCBsaW5lU3RhcnQgc28gd2UgZG9uJ3RcbiAgICAgICAgICAgIC8vIG5lZWQgdG8gY29weSBvdmVyIHRoZSBwcmV2aW91cyBsaW5lcyB3aGVuIHdlIGdldCB0aGUgbmV3IGFycjpcbiAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zdWJhcnJheShsaW5lU3RhcnQpO1xuICAgICAgICAgICAgcG9zaXRpb24gLT0gbGluZVN0YXJ0O1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgbGluZSBidWZmZXJzIGludG8gRXZlbnRTb3VyY2VNZXNzYWdlcy5cbiAqIEBwYXJhbSBvbklkIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIGBpZGAgZmllbGQuXG4gKiBAcGFyYW0gb25SZXRyeSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBgcmV0cnlgIGZpZWxkLlxuICogQHBhcmFtIG9uTWVzc2FnZSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBtZXNzYWdlLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgZm9yIGVhY2ggaW5jb21pbmcgbGluZSBidWZmZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZXNzYWdlcyhvbk1lc3NhZ2U/OiAobXNnOiBFdmVudFNvdXJjZU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICBsZXQgbWVzc2FnZSA9IG5ld01lc3NhZ2UoKTtcbiAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbiAgICAvLyByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNhbiBwcm9jZXNzIGVhY2ggaW5jb21pbmcgbGluZSBidWZmZXI6XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG9uTGluZShsaW5lOiBVaW50OEFycmF5LCBmaWVsZExlbmd0aDogbnVtYmVyKSB7XG4gICAgICAgIGlmIChsaW5lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gZW1wdHkgbGluZSBkZW5vdGVzIGVuZCBvZiBtZXNzYWdlLiBUcmlnZ2VyIHRoZSBjYWxsYmFjayBhbmQgc3RhcnQgYSBuZXcgbWVzc2FnZTpcbiAgICAgICAgICAgIG9uTWVzc2FnZT8uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgbWVzc2FnZSA9IG5ld01lc3NhZ2UoKTtcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZExlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIGV4Y2x1ZGUgY29tbWVudHMgYW5kIGxpbmVzIHdpdGggbm8gdmFsdWVzXG4gICAgICAgICAgICAvLyBsaW5lIGlzIG9mIGZvcm1hdCBcIjxmaWVsZD46PHZhbHVlPlwiIG9yIFwiPGZpZWxkPjogPHZhbHVlPlwiXG4gICAgICAgICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZXJ2ZXItc2VudC1ldmVudHMuaHRtbCNldmVudC1zdHJlYW0taW50ZXJwcmV0YXRpb25cbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZGVjb2Rlci5kZWNvZGUobGluZS5zdWJhcnJheSgwLCBmaWVsZExlbmd0aCkpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVPZmZzZXQgPSBmaWVsZExlbmd0aCArIChsaW5lW2ZpZWxkTGVuZ3RoICsgMV0gPT09IDMyID8gMiA6IDEpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBkZWNvZGVyLmRlY29kZShsaW5lLnN1YmFycmF5KHZhbHVlT2Zmc2V0KSk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkYXRhJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBtZXNzYWdlIGFscmVhZHkgaGFzIGRhdGEsIGFwcGVuZCB0aGUgbmV3IHZhbHVlIHRvIHRoZSBvbGQuXG4gICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwganVzdCBzZXQgdG8gdGhlIG5ldyB2YWx1ZTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhID0gbWVzc2FnZS5kYXRhID8gYCR7bWVzc2FnZS5kYXRhfVxcbiR7dmFsdWV9YCA6IHZhbHVlOyAvLyBvdGhlcndpc2UsXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gY29uY2F0KGE6IFVpbnQ4QXJyYXksIGI6IFVpbnQ4QXJyYXkpIHtcbiAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShhLmxlbmd0aCArIGIubGVuZ3RoKTtcbiAgICByZXMuc2V0KGEpO1xuICAgIHJlcy5zZXQoYiwgYS5sZW5ndGgpO1xuICAgIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIG5ld01lc3NhZ2UoKTogRXZlbnRTb3VyY2VNZXNzYWdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiAnJyxcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFJlc29sdmVyczxUID0gYW55PigpOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XG4gICAgbGV0IHJlc29sdmU6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+WydyZXNvbHZlJ107XG4gICAgbGV0IHJlamVjdDogUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD5bJ3JlamVjdCddO1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzLCByZWopID0+IHtcbiAgICAgICAgcmVzb2x2ZSA9IHJlcztcbiAgICAgICAgcmVqZWN0ID0gcmVqO1xuICAgIH0pO1xuICAgIHJldHVybiB7IHByb21pc2UsIHJlc29sdmU6IHJlc29sdmUhLCByZWplY3Q6IHJlamVjdCEgfTtcbn1cblxuY29uc3QgREJfTkFNRSA9ICdTdGFyZ2F0ZSc7XG5jb25zdCBTVE9SRV9OQU1FID0gJ2NhY2hlcyc7XG5sZXQgZGJJbnN0YW5jZTogSURCRGF0YWJhc2UgfCBudWxsID0gbnVsbDtcblxuYXN5bmMgZnVuY3Rpb24gb3BlbkRCKCk6IFByb21pc2U8SURCRGF0YWJhc2U+IHtcbiAgICBpZiAoZGJJbnN0YW5jZSkgcmV0dXJuIGRiSW5zdGFuY2U7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4oREJfTkFNRSwgMSk7XG4gICAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICBkYkluc3RhbmNlID0gcmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgICAgICByZXNvbHZlKGRiSW5zdGFuY2UpO1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGIgPSAoZXZlbnQudGFyZ2V0IGFzIElEQk9wZW5EQlJlcXVlc3QpLnJlc3VsdDtcbiAgICAgICAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhTVE9SRV9OQU1FKSkge1xuICAgICAgICAgICAgICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKFNUT1JFX05BTUUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdENhY2hlU3RvcmFnZShvcHRpb25zPzogeyBlbmNyeXB0aW9uPzogYm9vbGVhbjsgZW5jcnlwdGlvbktleT86IHN0cmluZyB9KTogUHJvbWlzZTxDYWNoZVN0b3JhZ2U+IHtcbiAgICBhd2FpdCBvcGVuREIoKTtcblxuICAgIGxldCBlbmNyeXB0aW9uS2V5OiBDcnlwdG9LZXkgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBjb3VudGVyID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuXG4gICAgaWYgKG9wdGlvbnM/LmVuY3J5cHRpb24pIHtcbiAgICAgICAgY29uc3Qga2V5U3RyaW5nID0gb3B0aW9ucy5lbmNyeXB0aW9uS2V5ID8/IERCX05BTUU7XG4gICAgICAgIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShrZXlTdHJpbmcpLmZvckVhY2goKGJ5dGUsIGkpID0+IHtcbiAgICAgICAgICAgIGlmIChpIDwgMTYpIGNvdW50ZXJbaV0gPSBieXRlO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIGNvbnN0IGtleURhdGEgPSBlbmNvZGVyLmVuY29kZShrZXlTdHJpbmcpO1xuICAgICAgICBjb25zdCBpbXBvcnRlZEtleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCdyYXcnLCBrZXlEYXRhLCB7IG5hbWU6ICdQQktERjInIH0sIGZhbHNlLCBbJ2Rlcml2ZUtleSddKTtcblxuICAgICAgICBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kZXJpdmVLZXkoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1BCS0RGMicsXG4gICAgICAgICAgICAgICAgc2FsdDogZW5jb2Rlci5lbmNvZGUoJ21pbGtpby1zdGFyZ2F0ZS1jYWNoZScpLFxuICAgICAgICAgICAgICAgIGl0ZXJhdGlvbnM6IDEwMDAwMCxcbiAgICAgICAgICAgICAgICBoYXNoOiAnU0hBLTI1NicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW1wb3J0ZWRLZXksXG4gICAgICAgICAgICB7IG5hbWU6ICdBRVMtQ1RSJywgbGVuZ3RoOiAyNTYgfSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWydlbmNyeXB0JywgJ2RlY3J5cHQnXSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmNyeXB0RGF0YSA9IGFzeW5jIChkYXRhOiBhbnkpOiBQcm9taXNlPFVpbnQ4QXJyYXk+ID0+IHtcbiAgICAgICAgaWYgKCFlbmNyeXB0aW9uS2V5KSByZXR1cm4gZGF0YTtcblxuICAgICAgICBjb25zdCBqc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICAgICAgY29uc3QgZGF0YUJ5dGVzID0gZW5jb2Rlci5lbmNvZGUoanNvblN0cmluZyk7XG5cbiAgICAgICAgY29uc3QgZW5jcnlwdGVkQXJyYXlCdWZmZXIgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FFUy1DVFInLFxuICAgICAgICAgICAgICAgIGNvdW50ZXI6IGNvdW50ZXIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiA2NCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5ISxcbiAgICAgICAgICAgIGRhdGFCeXRlcyxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkQXJyYXlCdWZmZXIpO1xuICAgIH07XG5cbiAgICBjb25zdCBkZWNyeXB0RGF0YSA9IGFzeW5jIChlbmNyeXB0ZWREYXRhOiBBcnJheUJ1ZmZlciB8IFVpbnQ4QXJyYXkpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgICAgICBpZiAoIWVuY3J5cHRpb25LZXkgfHwgIWVuY3J5cHRlZERhdGEpIHJldHVybiBlbmNyeXB0ZWREYXRhO1xuXG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gZW5jcnlwdGVkRGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyAoZW5jcnlwdGVkRGF0YS5idWZmZXIgYXMgQXJyYXlCdWZmZXIpIDogZW5jcnlwdGVkRGF0YTtcblxuICAgICAgICBjb25zdCBkZWNyeXB0ZWRCeXRlcyA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQUVTLUNUUicsXG4gICAgICAgICAgICAgICAgY291bnRlcjogY291bnRlcixcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDY0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXkhLFxuICAgICAgICAgICAgYXJyYXlCdWZmZXIsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICAgICAgICBjb25zdCBqc29uU3RyaW5nID0gZGVjb2Rlci5kZWNvZGUoZGVjcnlwdGVkQnl0ZXMpO1xuICAgICAgICByZXR1cm4gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoanNvblN0cmluZykpO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhc3luYyBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHsgZGF0YTogYW55OyB0aW1lc3RhbXA6IG51bWJlciB9IHwgbnVsbD4ge1xuICAgICAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBvcGVuREIoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihTVE9SRV9OQU1FLCAncmVhZG9ubHknKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKFNUT1JFX05BTUUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QocmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlcXVlc3QucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5lbmNyeXB0aW9uICYmIChyZXN1bHQuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8IHJlc3VsdC5kYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY3J5cHRlZERhdGEgPSBhd2FpdCBkZWNyeXB0RGF0YShyZXN1bHQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHsgZGF0YTogZGVjcnlwdGVkRGF0YSwgdGltZXN0YW1wOiByZXN1bHQudGltZXN0YW1wIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQgPz8gbnVsbCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIGRhdGE6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBvcGVuREIoKTtcbiAgICAgICAgICAgIGxldCBkYXRhVG9TdG9yZTogYW55ID0gZGF0YTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmVuY3J5cHRpb24pIHtcbiAgICAgICAgICAgICAgICBkYXRhVG9TdG9yZSA9IGF3YWl0IGVuY3J5cHREYXRhKGRhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oU1RPUkVfTkFNRSwgJ3JlYWR3cml0ZScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLnB1dCh7IGRhdGE6IGRhdGFUb1N0b3JlLCB0aW1lc3RhbXA6IERhdGUubm93KCkgfSwga2V5KTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QocmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUNhY2hlS2V5KHBhdGg6IHN0cmluZywgcGFyYW1zOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwYXRofToke0pTT04uc3RyaW5naWZ5KHBhcmFtcyA/PyB7fSl9YDtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFrREEsZUFBc0IsY0FBb0YsQ0FBQyxpQkFBd0M7QUFBQSxFQUMvSSxNQUFNLFNBQVMsZ0JBQWdCLFNBQVM7QUFBQSxFQUN4QyxNQUFNLFNBQVMsZ0JBQWdCLFNBQVM7QUFBQSxFQWF4QyxNQUFNLGNBQW1CLE9BQU8sT0FBWSxLQUFhLFlBQXdEO0FBQUEsSUFDN0csSUFBSSxPQUFPLE9BQU87QUFBQSxNQUNkLE1BQU0sVUFBVSxNQUFNLFFBQVEsTUFBTSxJQUFJO0FBQUEsTUFDeEMsSUFBSTtBQUFBLFFBQVMsT0FBTyxNQUFNO0FBQUEsSUFDOUI7QUFBQTtBQUFBLEVBR0osTUFBTSxxQkFBcUIsTUFBTTtBQUFBLElBQzdCLE1BQU0sV0FBVyxJQUFJO0FBQUEsSUFDckIsTUFBTSxVQUFVLElBQUk7QUFBQSxJQUVwQixNQUFNLGdCQUFlO0FBQUEsTUFDakIsSUFBSSxDQUF5RixLQUFVLFlBQXFCO0FBQUEsUUFDeEgsU0FBUyxJQUFJLFNBQVMsR0FBYTtBQUFBLFFBQ25DLElBQUksUUFBUSxJQUFJLEdBQWEsTUFBTSxPQUFPO0FBQUEsVUFDdEMsUUFBUSxJQUFJLEtBQWUsSUFBSSxHQUFLO0FBQUEsUUFDeEM7QUFBQSxRQUNBLE1BQU0sTUFBTSxRQUFRLElBQUksR0FBYTtBQUFBLFFBQ3JDLElBQUksSUFBSSxPQUFPO0FBQUEsUUFDZixTQUFTLElBQUksU0FBUyxHQUFhO0FBQUEsUUFFbkMsT0FBTyxNQUFNO0FBQUEsVUFDVCxTQUFTLE9BQU8sT0FBTztBQUFBLFVBQ3ZCLElBQUksT0FBTyxPQUFPO0FBQUE7QUFBQTtBQUFBLE1BRzFCLEtBQUssQ0FBeUYsS0FBVSxZQUFxQjtBQUFBLFFBQ3pILE1BQU0sTUFBTSxRQUFRLElBQUksR0FBYTtBQUFBLFFBQ3JDLElBQUksQ0FBQztBQUFBLFVBQUs7QUFBQSxRQUNWLFNBQVMsT0FBTyxPQUFPO0FBQUEsUUFDdkIsSUFBSSxPQUFPLE9BQU87QUFBQTtBQUFBLE1BRXRCLE1BQU0sT0FBNEUsS0FBVSxVQUFnQztBQUFBLFFBQ3hILE1BQU0sSUFBSSxRQUFRLElBQUksR0FBYTtBQUFBLFFBQ25DLElBQUksR0FBRztBQUFBLFVBQ0gsV0FBVyxXQUFXLEdBQUc7QUFBQSxZQUNyQixNQUFNLFFBQVEsS0FBSztBQUFBLFVBQ3ZCO0FBQUEsUUFDSjtBQUFBO0FBQUEsSUFFUjtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUEsRUFHWCxNQUFNLGVBQWUsbUJBQW1CO0FBQUEsRUFFeEMsTUFBTSxZQUFZLFlBQVk7QUFBQSxJQUMxQixJQUFJLFVBQVUsZ0JBQWdCO0FBQUEsSUFDOUIsSUFBSSxPQUFPLFlBQVk7QUFBQSxNQUFZLFVBQVUsTUFBTSxRQUFRO0FBQUEsSUFDM0QsSUFBSSxRQUFRLFNBQVMsR0FBRztBQUFBLE1BQUcsVUFBVSxRQUFRLE1BQU0sR0FBRyxFQUFFO0FBQUEsSUFFeEQsT0FBTztBQUFBO0FBQUEsRUFHWCxNQUFNLGlCQUFrQyxVQUFVO0FBQUEsRUFFbEQsSUFBSSxrQkFBaUM7QUFBQSxFQUVyQyxJQUFJLGdCQUErQjtBQUFBLEVBQ25DLElBQUksWUFBMkI7QUFBQSxFQUUvQixNQUFNLFdBQVc7QUFBQSxPQUNWO0FBQUEsSUFDSCxTQUFTO0FBQUEsU0FDSCxRQUFvRCxDQUN0RCxNQUNBLFNBWUY7QUFBQSxNQUNFLElBQUksUUFBUSxZQUFZO0FBQUEsUUFBVyxRQUFRLFVBQVUsQ0FBQztBQUFBLE1BRXRELElBQUk7QUFBQSxNQUNKLElBQUksUUFBUSxTQUFTO0FBQUEsUUFDakIsSUFBSSxVQUFVLFFBQVE7QUFBQSxRQUN0QixJQUFJLE9BQU8sWUFBWTtBQUFBLFVBQVksVUFBVSxNQUFNLFFBQVE7QUFBQSxRQUMzRCxJQUFJLFFBQVEsU0FBUyxHQUFHO0FBQUEsVUFBRyxVQUFVLFFBQVEsTUFBTSxHQUFHLEVBQUU7QUFBQSxRQUN4RCxNQUFNLFVBQVc7QUFBQSxNQUNyQixFQUFPO0FBQUEsUUFDSCxJQUFJLENBQUM7QUFBQSxVQUFpQixrQkFBa0IsTUFBTTtBQUFBLFFBRTlDLElBQUksU0FBUyxpQkFBaUIsY0FBYyxNQUFNO0FBQUEsVUFDOUMsTUFBTTtBQUFBLFFBQ1YsRUFBTztBQUFBLFVBQ0gsTUFBTSxrQkFBbUI7QUFBQSxVQUN6QixnQkFBZ0I7QUFBQSxVQUNoQixZQUFZO0FBQUE7QUFBQTtBQUFBLE1BSXBCLElBQUksQ0FBRSxLQUFnQixTQUFTLEdBQUcsR0FBRztBQUFBLFFBR2pDLE1BQU0sSUFBSSxRQUFRO0FBQUEsUUFDbEIsSUFBSSxFQUFFLFdBQVc7QUFBQSxVQUFXLEVBQUUsU0FBUztBQUFBLFFBQ3ZDLElBQUksRUFBRSxvQkFBb0I7QUFBQSxVQUFXLEVBQUUsa0JBQWtCO0FBQUEsUUFFekQsTUFBTSxnQkFBZ0IsUUFBUSxpQkFBaUI7QUFBQSxRQUMvQyxJQUFJLGFBQWE7QUFBQSxRQUNqQixJQUFJLFFBQVEsa0JBQWtCLFFBQVEsUUFBUSxrQkFBa0IsR0FBRztBQUFBLFVBQy9ELGFBQWE7QUFBQSxRQUNqQixFQUFPLFNBQUksT0FBTyxRQUFRLGtCQUFrQixZQUFZLFFBQVEsZ0JBQWdCLEdBQUc7QUFBQSxVQUMvRSxhQUFhLFFBQVE7QUFBQSxRQUN6QjtBQUFBLFFBR0EsSUFBSSxrQkFBa0IsU0FBUyxlQUFlLEdBQUc7QUFBQSxVQUM3QyxJQUFJO0FBQUEsWUFDQSxNQUFNLGFBQWEsS0FBSyx3QkFBd0IsRUFBRSxNQUFzQixRQUF3QixDQUFDO0FBQUEsWUFDakcsTUFBTSxRQUFPLEtBQUssVUFBVSxRQUFRLE1BQU0sS0FBSztBQUFBLFlBQy9DLE1BQU0sYUFBYSxLQUFLLHNCQUFzQixFQUFFLE1BQXNCLFNBQXlCLFlBQUssQ0FBQztBQUFBLFlBQ3JHLElBQUk7QUFBQSxZQUNKLE1BQU0sV0FBVyxNQUFNLE9BQU8sS0FBSyxFQUFFLFFBQVEsUUFBUSxhQUFNLFNBQVMsUUFBUSxRQUFRLENBQUM7QUFBQSxZQUNyRixPQUFPLE1BQU0sU0FBUyxLQUFLO0FBQUEsWUFDM0IsTUFBTSxTQUFTLGdCQUFnQixLQUFLLE1BQU0sSUFBSSxDQUFDO0FBQUEsWUFDL0MsSUFBSSxPQUFPLFlBQVksTUFBTTtBQUFBLGNBQ3pCLE1BQU0sTUFBVyxDQUFDO0FBQUEsY0FDbEIsSUFBSSxPQUFPLFFBQVEsT0FBTyxVQUFVO0FBQUEsY0FDcEMsT0FBTyxDQUFDLEtBQUssTUFBTSxFQUFFLFdBQVcsT0FBTyxVQUFVLENBQUM7QUFBQSxZQUN0RDtBQUFBLFlBQ0EsT0FBTyxDQUFDLE1BQU0sT0FBTyxNQUFNLEVBQUUsV0FBVyxPQUFPLFVBQVUsQ0FBQztBQUFBLFlBQzVELE9BQU8sUUFBWTtBQUFBLFlBQ2pCLElBQUksU0FBUSxJQUFJLGlCQUFpQjtBQUFBLGNBQzdCLE9BQU8sQ0FBQyxRQUFPLE1BQU0sRUFBRSxXQUFXLEdBQUcsQ0FBQztBQUFBLFlBQzFDO0FBQUEsWUFDQSxNQUFNLGFBQWEsRUFBRSxjQUFjLE9BQU07QUFBQSxZQUN6QyxPQUFPLENBQUMsWUFBWSxNQUFNLEVBQUUsV0FBVyxVQUFVLENBQUM7QUFBQTtBQUFBLFFBRTFEO0FBQUEsUUFFQSxNQUFNLGtCQUFrQixRQUFRLG1CQUFtQjtBQUFBLFFBQ25ELE1BQU0sV0FBVyxpQkFBaUIsTUFBZ0IsUUFBUSxNQUFNO0FBQUEsUUFFaEUsSUFBSSxlQUFlLGdCQUFnQjtBQUFBLFFBQ25DLElBQUksa0JBQWtCLFNBQVMsQ0FBQyxjQUFjO0FBQUEsVUFDMUMsZUFBZSxNQUFNLDBCQUEwQixFQUFFLFlBQVksZ0JBQWdCLGdCQUFnQixDQUFDO0FBQUEsUUFDbEc7QUFBQSxRQUVBLElBQUksa0JBQWtCLFNBQVMsZ0JBQWdCLFFBQVEsWUFBWTtBQUFBLFVBQy9ELE1BQU0sU0FBUyxNQUFNLGFBQWEsSUFBSSxRQUFRO0FBQUEsVUFDOUMsSUFBSSxRQUFRO0FBQUEsWUFDUixJQUFJO0FBQUEsY0FDQSxNQUFNLFFBQVEsV0FBVyxPQUFPLElBQUk7QUFBQSxjQUN0QyxNQUFNO0FBQUEsVUFHWjtBQUFBLFFBQ0o7QUFBQSxRQUVBLElBQUksa0JBQWtCLGNBQWMsY0FBYztBQUFBLFVBQzlDLE1BQU0sU0FBUyxNQUFNLGFBQWEsSUFBSSxRQUFRO0FBQUEsVUFDOUMsSUFBSSxVQUFVLEtBQUssSUFBSSxJQUFJLE9BQU8sWUFBWSxpQkFBaUI7QUFBQSxZQUMzRCxPQUFPLENBQUMsTUFBTSxPQUFPLE1BQU0sRUFBRSxXQUFXLFNBQVMsQ0FBQztBQUFBLFVBQ3REO0FBQUEsUUFDSjtBQUFBLFFBRUEsTUFBTSxhQUFhLEtBQUssd0JBQXdCLEVBQUUsTUFBc0IsUUFBd0IsQ0FBQztBQUFBLFFBQ2pHLE1BQU0sT0FBTyxLQUFLLFVBQVUsUUFBUSxNQUFNLEtBQUs7QUFBQSxRQUMvQyxNQUFNLGFBQWEsS0FBSyxzQkFBc0IsRUFBRSxNQUFzQixTQUF5QixLQUFLLENBQUM7QUFBQSxRQUVyRyxNQUFNLGlCQUFpQixPQUFPLFlBQW1IO0FBQUEsVUFDN0ksSUFBSTtBQUFBLFlBQ0EsTUFBTSxXQUFXLE1BQU0sT0FBTyxLQUFLLEVBQUUsUUFBUSxRQUFRLE1BQU0sU0FBUyxRQUFRLFFBQVEsQ0FBQztBQUFBLFlBQ3JGLE1BQU0sT0FBTyxNQUFNLFNBQVMsS0FBSztBQUFBLFlBQ2pDLE1BQU0sU0FBUyxLQUFLLE1BQU0sSUFBSTtBQUFBLFlBQzlCLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxPQUFPLEdBQUcsT0FBTyxNQUFNLGdCQUFnQixNQUFNO0FBQUEsWUFDekUsT0FBTyxRQUFZO0FBQUEsWUFDakIsTUFBTSxrQkFBaUIsQ0FBQyxTQUFRLElBQUk7QUFBQSxZQUNwQyxPQUFPLEVBQUUsUUFBUSxNQUFNLGVBQU8sZ0NBQWU7QUFBQTtBQUFBO0FBQUEsUUFJckQsTUFBTSxRQUFRLE9BQU8sbUJBQW1CLE1BQU0sZUFBZSxLQUFLO0FBQUEsUUFFbEUsU0FBUyxhQUFhLEVBQUcsYUFBYSxjQUFjLFNBQVMsZ0JBQWdCLGNBQWM7QUFBQSxVQUN2RixJQUFJLGFBQWEsR0FBRztBQUFBLFlBQ2hCLE1BQU0sSUFBSSxRQUFRLENBQUMsWUFBWSxXQUFXLFNBQVMsR0FBRyxDQUFDO0FBQUEsVUFDM0Q7QUFBQSxVQUNBLE1BQU0sY0FBYyxNQUFNLGVBQWUsSUFBSTtBQUFBLFVBQzdDLFNBQVMsWUFBWTtBQUFBLFVBQ3JCLFFBQVEsWUFBWTtBQUFBLFVBQ3BCLGlCQUFpQixZQUFZO0FBQUEsUUFDakM7QUFBQSxRQUVBLElBQUksT0FBTztBQUFBLFVBQ1AsSUFBSSxRQUFRLElBQUksaUJBQWlCO0FBQUEsWUFDN0IsTUFBTSxhQUFhLEtBQUssdUJBQXVCLEVBQUUsYUFBYSxNQUFzQixTQUF5QixNQUFNLENBQUM7QUFBQSxZQUNwSCxPQUFPO0FBQUEsVUFDWDtBQUFBLFVBRUEsSUFBSSxrQkFBa0IsU0FBUyxnQkFBZ0IsZ0JBQWdCO0FBQUEsWUFDM0QsTUFBTSxTQUFTLE1BQU0sYUFBYSxJQUFJLFFBQVE7QUFBQSxZQUM5QyxJQUFJLFFBQVE7QUFBQSxjQUNSLE9BQU8sQ0FBQyxNQUFNLE9BQU8sTUFBTSxFQUFFLFdBQVcsU0FBUyxDQUFDO0FBQUEsWUFDdEQ7QUFBQSxVQUNKO0FBQUEsVUFFQSxNQUFNLGFBQWEsRUFBRSxjQUFjLE1BQU07QUFBQSxVQUN6QyxNQUFNLGFBQWEsS0FBSyx1QkFBdUIsRUFBRSxhQUFhLE1BQXNCLFNBQXlCLE9BQU8sV0FBVyxDQUFDO0FBQUEsVUFDaEksT0FBTyxDQUFDLFlBQVksTUFBTSxFQUFFLFdBQVcsVUFBVSxDQUFDO0FBQUEsUUFDdEQ7QUFBQSxRQUVBLElBQUksT0FBUSxNQUFNLFlBQVksTUFBTTtBQUFBLFVBQ2hDLE1BQU0sTUFBVyxDQUFDO0FBQUEsVUFDbEIsSUFBSSxPQUFRLE1BQU0sUUFBUSxPQUFRLE1BQU0sVUFBVTtBQUFBLFVBQ2xELE1BQU0sYUFBYSxLQUFLLHVCQUF1QixFQUFFLGFBQWEsTUFBc0IsU0FBeUIsT0FBTyxJQUFJLENBQUM7QUFBQSxVQUN6SCxPQUFPLENBQUMsS0FBSyxNQUFNLEVBQUUsV0FBVyxPQUFRLE1BQU0sVUFBVSxDQUFDO0FBQUEsUUFDN0Q7QUFBQSxRQUVBLElBQUksa0JBQWtCLFNBQVMsY0FBYztBQUFBLFVBQ3pDLE1BQU0sYUFBYSxJQUFJLFVBQVUsT0FBUSxNQUFNLElBQUk7QUFBQSxRQUN2RDtBQUFBLFFBRUEsT0FBTyxDQUFDLE1BQU0sT0FBUSxNQUFNLE1BQU0sRUFBRSxXQUFXLE9BQVEsTUFBTSxVQUFVLENBQUM7QUFBQSxNQUM1RSxFQUFPO0FBQUEsUUFFSCxRQUFRLGdCQUFnQjtBQUFBLFFBQ3hCLFFBQVEsYUFBYTtBQUFBLFFBQ3JCLFFBQVEsa0JBQWtCO0FBQUEsUUFFMUIsSUFBSSxRQUFRLFFBQVEsV0FBVztBQUFBLFVBQVcsUUFBUSxRQUFRLFNBQVM7QUFBQSxRQUNuRSxJQUFJLFFBQVEsUUFBUSxvQkFBb0I7QUFBQSxVQUFXLFFBQVEsUUFBUSxrQkFBa0I7QUFBQSxRQUVyRixNQUFNLFNBUUYsSUFBSTtBQUFBLFFBQ1IsSUFBSSxjQUFjO0FBQUEsUUFDbEIsSUFBSSxnQkFBZ0I7QUFBQSxRQUNwQixJQUFJO0FBQUEsUUFDSixNQUFNLHNCQUFzQixjQUF5QjtBQUFBLFFBRXJELE1BQU0sVUFBVSxpQkFBaUIsV0FBVyxTQUFTLFdBQVc7QUFBQSxRQUNoRSxNQUFNLFFBQVEsV0FBVyxNQUFNO0FBQUEsVUFDM0Isb0JBQW9CLE9BQU8sQ0FBQyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsU0FBUyx5QkFBeUIsYUFBYSxFQUFFLEdBQUcsTUFBTSxFQUFFLFdBQVcsVUFBVSxDQUFDLENBQUM7QUFBQSxXQUM5SSxPQUFPO0FBQUEsUUFFVixNQUFNLFlBQVksQ0FBQyxVQUE4QjtBQUFBLFVBQzdDLElBQUksTUFBTSxLQUFLLFdBQVcsR0FBRyxHQUFHO0FBQUEsWUFDNUIsSUFBSTtBQUFBLGNBQ0EsZUFBZSxnQkFBZ0IsS0FBSyxNQUFNLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQUEsY0FDOUQsb0JBQW9CLFFBQVEsU0FBUztBQUFBLGNBQ3JDLGFBQWEsS0FBSztBQUFBLGNBQ3BCLE9BQU8sT0FBTztBQUFBLGNBQ1osb0JBQW9CLE9BQU8sQ0FBQyxFQUFFLGNBQWMsTUFBTSxHQUFHLE1BQU0sRUFBRSxXQUFXLFVBQVUsQ0FBQyxDQUFDO0FBQUEsY0FDcEYsYUFBYSxLQUFLO0FBQUE7QUFBQSxVQUUxQixFQUFPO0FBQUEsWUFDSCxNQUFNLFFBQVEsRUFBRTtBQUFBLFlBQ2hCLElBQUksT0FBTyxJQUFJLEtBQUssR0FBRztBQUFBLGNBQ25CLE1BQU0sUUFBUSxPQUFPLElBQUksS0FBSztBQUFBLGNBQzlCLE1BQU8sT0FBTztBQUFBLGNBQ2QsTUFBTyxRQUFRLEVBQUUsTUFBTSxPQUFPLE9BQU8sZ0JBQWdCLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7QUFBQSxZQUNsRixFQUFPO0FBQUEsY0FDSCxNQUFNLFFBQVEsY0FBbUM7QUFBQSxjQUNqRCxNQUFNLFFBQVEsRUFBRSxNQUFNLE9BQU8sT0FBTyxnQkFBZ0IsS0FBSyxNQUFNLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUFBLGNBQzdFLE9BQU8sSUFBSSxPQUFPLEtBQUssT0FBTyxNQUFNLE1BQU0sQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBLFFBS3ZELElBQUk7QUFBQSxRQUVKLGVBQWUsTUFBTSxHQUFHO0FBQUEsVUFDcEIsdUJBQXVCLElBQUk7QUFBQSxVQUMzQixxQkFBcUIsT0FBTyxpQkFBaUIsU0FBUyxNQUFNO0FBQUEsWUFDeEQsU0FBUyxPQUFPO0FBQUEsV0FDbkI7QUFBQSxVQUNELElBQUk7QUFBQSxZQUNBLE1BQU0sYUFBYSxLQUFLLHdCQUF3QixFQUFFLE1BQXNCLFFBQXdCLENBQUM7QUFBQSxZQUVqRyxNQUFNLE9BQU8sS0FBSyxVQUFVLFFBQVMsTUFBTSxLQUFLO0FBQUEsWUFDaEQsTUFBTSxhQUFhLEtBQUssc0JBQXNCLEVBQUUsTUFBc0IsU0FBeUIsS0FBSyxDQUFDO0FBQUEsWUFFckcsTUFBTSxXQUFXLE1BQU0sT0FBTyxLQUFLO0FBQUEsY0FDL0IsUUFBUTtBQUFBLGNBQ1IsU0FBUyxRQUFTO0FBQUEsY0FDbEI7QUFBQSxjQUNBLFFBQVEscUJBQXFCO0FBQUEsWUFDakMsQ0FBQztBQUFBLFlBRUQsTUFBTSxjQUFjLFNBQVMsUUFBUSxJQUFJLGNBQWM7QUFBQSxZQUN2RCxJQUFJLENBQUMsYUFBYSxXQUFXLG1CQUFtQixHQUFHO0FBQUEsY0FDL0MsTUFBTSxJQUFJLE1BQU0sK0JBQStCLGdDQUFnQyxhQUFhO0FBQUEsWUFDaEc7QUFBQSxZQUVBLE1BQU0sU0FBUyxTQUFTLE1BQU8sU0FBUyxZQUFZLFNBQVMsQ0FBQyxDQUFDO0FBQUEsWUFFL0QsTUFBTSxTQUFTLE9BQU87QUFBQSxZQUN4QixPQUFPLEtBQUs7QUFBQSxZQUNWLElBQUksQ0FBQyxxQkFBcUIsT0FBTztBQUFBLGNBQVMscUJBQXFCLE1BQU07QUFBQSxZQUNyRSxNQUFNLFFBQVEsRUFBRSxjQUFjLElBQUk7QUFBQSxZQUNsQyxNQUFNLGFBQWEsS0FBSyx1QkFBdUIsRUFBRSxhQUFhLE1BQXNCLFNBQXlCLE1BQU0sQ0FBQztBQUFBLFlBQ3BILE1BQU0sU0FBUyxNQUFNLEdBQUc7QUFBQSxZQUN4QixvQkFBb0IsT0FBTyxDQUFDLE9BQU8sTUFBTSxFQUFFLFdBQVcsVUFBVSxDQUFDLENBQUM7QUFBQTtBQUFBO0FBQUEsUUFJckUsT0FBTztBQUFBLFFBRVosTUFBTSxXQUFXO0FBQUEsYUFDVDtBQUFBLFlBQ0EsSUFBSSxHQUFxQztBQUFBLGNBQ3JDLE1BQU0sUUFBUSxFQUFFO0FBQUEsY0FDaEIsSUFBSSxPQUFPLElBQUksUUFBUSxDQUFDO0FBQUEsZ0JBQUcsT0FBTyxPQUFPLFFBQVEsQ0FBQztBQUFBLGNBQ2xELElBQUksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLENBQUMscUJBQXFCLE9BQU8sU0FBUztBQUFBLGdCQUM1RCxNQUFNLFFBQVEsY0FBbUM7QUFBQSxnQkFDakQsT0FBTyxJQUFJLE9BQU8sS0FBSyxPQUFPLE1BQU0sTUFBTSxDQUFDO0FBQUEsZ0JBQzNDLE9BQU8sTUFBTTtBQUFBLGNBQ2pCO0FBQUEsY0FDQSxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssS0FBSyxxQkFBcUIsT0FBTyxTQUFTO0FBQUEsZ0JBQzNELE1BQU0sUUFBUSxjQUFtQztBQUFBLGdCQUNqRCxNQUFNLFFBQVEsRUFBRSxNQUFNLE1BQU0sT0FBTyxVQUFVLENBQUM7QUFBQSxnQkFDOUMsT0FBTyxNQUFNO0FBQUEsY0FDakI7QUFBQSxjQUNBLE9BQU8sT0FBTyxJQUFJLEtBQUssRUFBRztBQUFBO0FBQUEsaUJBRXhCLE9BQU0sR0FBa0M7QUFBQSxjQUMxQyxJQUFJLENBQUMscUJBQXFCLE9BQU87QUFBQSxnQkFBUyxxQkFBcUIsTUFBTTtBQUFBLGNBQ3JFLFlBQVksR0FBRyxjQUFhO0FBQUEsZ0JBQVEsVUFBUyxRQUFRLEVBQUUsTUFBTSxNQUFNLE9BQU8sVUFBVSxDQUFDO0FBQUEsY0FDckYsT0FBTyxFQUFFLE1BQU0sTUFBTSxPQUFPLFVBQVU7QUFBQTtBQUFBLGlCQUVwQyxNQUFLLENBQUMsS0FBeUM7QUFBQSxjQUNqRCxlQUFlO0FBQUEsZ0JBQ1gsU0FBUztBQUFBLGdCQUNULFdBQVcsY0FBYyxhQUFhO0FBQUEsZ0JBQ3RDLE1BQU07QUFBQSxrQkFDRixNQUFNO0FBQUEsa0JBQ04sU0FBUztBQUFBLGtCQUNULFlBQVk7QUFBQSxrQkFDWixNQUFNO0FBQUEsZ0JBQ1Y7QUFBQSxjQUNKO0FBQUEsY0FDQSxZQUFZLFFBQVEsVUFBVSxRQUFRO0FBQUEsZ0JBQ2xDLElBQUksTUFBTTtBQUFBLGtCQUFNO0FBQUEsZ0JBQ2hCLE1BQU0sT0FBTztBQUFBLGdCQUNiLE1BQU0sUUFBUSxFQUFFLE1BQU0sTUFBTSxPQUFPLFVBQVUsQ0FBQztBQUFBLGNBQ2xEO0FBQUEsY0FDQSxJQUFJLENBQUMscUJBQXFCLE9BQU87QUFBQSxnQkFBUyxxQkFBcUIsTUFBTTtBQUFBLGNBQ3JFLFlBQVksR0FBRyxjQUFhO0FBQUEsZ0JBQVEsVUFBUyxRQUFRLEVBQUUsTUFBTSxNQUFNLE9BQU8sVUFBVSxDQUFDO0FBQUEsY0FDckYsT0FBTyxFQUFFLE1BQU0sTUFBTSxPQUFPLFVBQVU7QUFBQTtBQUFBLFVBRTlDO0FBQUEsV0FDQyxPQUFPLGNBQWMsR0FBRztBQUFBLFlBQ3JCLE9BQU87QUFBQTtBQUFBLFFBRWY7QUFBQSxRQUVBLElBQUk7QUFBQSxVQUNBLE1BQU0sb0JBQW9CO0FBQUEsVUFDMUIsT0FBTyxDQUFDLE1BQU0sVUFBVSxFQUFFLFdBQVcsYUFBYSxVQUFVLENBQUM7QUFBQSxVQUMvRCxPQUFPLE9BQU87QUFBQSxVQUNaLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUluQixZQUFZO0FBQUEsTUFDUixXQUFXLE9BQU8sWUFBb0I7QUFBQSxRQUNsQyxNQUFNLFVBQVU7QUFBQSxVQUNaLGdCQUFnQjtBQUFBLFVBQ2hCLFFBQVE7QUFBQSxRQUNaO0FBQUEsUUFDQSxNQUFNLFNBQVMsQ0FBQztBQUFBLFFBRWhCLE1BQU0sT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLO0FBQUEsUUFDdkMsTUFBTSxTQVFGLElBQUk7QUFBQSxRQUNSLElBQUksY0FBYztBQUFBLFFBQ2xCLElBQUksZ0JBQWdCO0FBQUEsUUFFcEIsTUFBTSxZQUFZLENBQUMsVUFBOEI7QUFBQSxVQUM3QyxNQUFNLFFBQVEsRUFBRTtBQUFBLFVBQ2hCLElBQUksT0FBTyxJQUFJLEtBQUssR0FBRztBQUFBLFlBQ25CLE1BQU0sUUFBUSxPQUFPLElBQUksS0FBSztBQUFBLFlBQzlCLE1BQU8sUUFBUSxFQUFFLE1BQU0sT0FBTyxPQUFPLGdCQUFnQixLQUFLLE1BQU0sTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO0FBQUEsVUFDbEYsRUFBTztBQUFBLFlBQ0gsTUFBTSxRQUFRLGNBQW1DO0FBQUEsWUFDakQsTUFBTSxRQUFRLEVBQUUsTUFBTSxPQUFPLE9BQU8sZ0JBQWdCLEtBQUssTUFBTSxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7QUFBQSxZQUM3RSxPQUFPLElBQUksT0FBTyxLQUFLLE9BQU8sTUFBTSxNQUFNLENBQUM7QUFBQTtBQUFBO0FBQUEsUUFJbkQsSUFBSTtBQUFBLFFBRUosZUFBZSxNQUFNLEdBQUc7QUFBQSxVQUNwQix1QkFBdUIsSUFBSTtBQUFBLFVBQzNCLHFCQUFxQixPQUFPLGlCQUFpQixTQUFTLE1BQU07QUFBQSxZQUN4RCxTQUFTLE9BQU87QUFBQSxXQUNuQjtBQUFBLFVBQ0QsSUFBSTtBQUFBLFlBQ0EsTUFBTSxXQUFXLE1BQU0sT0FBTyxHQUFHLHNCQUFzQjtBQUFBLGNBQ25ELFFBQVE7QUFBQSxjQUNSO0FBQUEsY0FDQTtBQUFBLGNBQ0EsUUFBUSxxQkFBcUI7QUFBQSxZQUNqQyxDQUFDO0FBQUEsWUFFRCxNQUFNLGNBQWMsU0FBUyxRQUFRLElBQUksY0FBYztBQUFBLFlBQ3ZELElBQUksQ0FBQyxhQUFhLFdBQVcsbUJBQW1CLEdBQUc7QUFBQSxjQUMvQyxNQUFNLElBQUksTUFBTSwrQkFBK0IsZ0NBQWdDLGFBQWE7QUFBQSxZQUNoRztBQUFBLFlBRUEsTUFBTSxTQUFTLFNBQVMsTUFBTyxTQUFTLFlBQVksU0FBUyxDQUFDLENBQUM7QUFBQSxZQUUvRCxNQUFNLFNBQVMsT0FBTztBQUFBLFlBQ3hCLE9BQU8sS0FBSztBQUFBLFlBQ1YsSUFBSSxDQUFDLHFCQUFxQixPQUFPO0FBQUEsY0FBUyxxQkFBcUIsTUFBTTtBQUFBLFlBQ3JFLE1BQU0sU0FBUyxNQUFNLEdBQUc7QUFBQTtBQUFBO0FBQUEsUUFJM0IsT0FBTztBQUFBLFFBRVosTUFBTSxXQUFXO0FBQUEsYUFDVDtBQUFBLFlBQ0EsSUFBSSxHQUFxQztBQUFBLGNBQ3JDLE1BQU0sUUFBUSxFQUFFO0FBQUEsY0FDaEIsSUFBSSxPQUFPLElBQUksUUFBUSxDQUFDO0FBQUEsZ0JBQUcsT0FBTyxPQUFPLFFBQVEsQ0FBQztBQUFBLGNBQ2xELElBQUksQ0FBQyxPQUFPLElBQUksS0FBSyxLQUFLLENBQUMscUJBQXFCLE9BQU8sU0FBUztBQUFBLGdCQUM1RCxNQUFNLFFBQVEsY0FBbUM7QUFBQSxnQkFDakQsT0FBTyxJQUFJLE9BQU8sS0FBSyxPQUFPLE1BQU0sTUFBTSxDQUFDO0FBQUEsZ0JBQzNDLE9BQU8sTUFBTTtBQUFBLGNBQ2pCO0FBQUEsY0FDQSxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssS0FBSyxxQkFBcUIsT0FBTyxTQUFTO0FBQUEsZ0JBQzNELE1BQU0sUUFBUSxjQUFtQztBQUFBLGdCQUNqRCxNQUFNLFFBQVEsRUFBRSxNQUFNLE1BQU0sT0FBTyxVQUFVLENBQUM7QUFBQSxnQkFDOUMsT0FBTyxNQUFNO0FBQUEsY0FDakI7QUFBQSxjQUNBLE9BQU8sT0FBTyxJQUFJLEtBQUssRUFBRztBQUFBO0FBQUEsaUJBRXhCLE9BQU0sR0FBa0M7QUFBQSxjQUMxQyxJQUFJLENBQUMscUJBQXFCLE9BQU87QUFBQSxnQkFBUyxxQkFBcUIsTUFBTTtBQUFBLGNBQ3JFLFlBQVksR0FBRyxjQUFhO0FBQUEsZ0JBQVEsVUFBUyxRQUFRLEVBQUUsTUFBTSxNQUFNLE9BQU8sVUFBVSxDQUFDO0FBQUEsY0FDckYsT0FBTyxFQUFFLE1BQU0sTUFBTSxPQUFPLFVBQVU7QUFBQTtBQUFBLGlCQUVwQyxNQUFLLENBQUMsS0FBeUM7QUFBQSxjQUNqRCxJQUFJLENBQUMscUJBQXFCLE9BQU87QUFBQSxnQkFBUyxxQkFBcUIsTUFBTTtBQUFBLGNBQ3JFLFlBQVksR0FBRyxjQUFhO0FBQUEsZ0JBQVEsVUFBUyxRQUFRLEVBQUUsTUFBTSxNQUFNLE9BQU8sVUFBVSxDQUFDO0FBQUEsY0FDckYsT0FBTyxFQUFFLE1BQU0sTUFBTSxPQUFPLFVBQVU7QUFBQTtBQUFBLFVBRTlDO0FBQUEsV0FDQyxPQUFPLGNBQWMsR0FBRztBQUFBLFlBQ3JCLE9BQU87QUFBQTtBQUFBLFFBRWY7QUFBQSxRQUVBLElBQUk7QUFBQSxVQUNBLE9BQU87QUFBQSxVQUNULE9BQU8sT0FBTztBQUFBLFVBQ1osT0FBTztBQUFBO0FBQUE7QUFBQSxJQUduQjtBQUFBLElBQ0Esa0JBQWtCLE9BQU8sS0FBVSxZQUFpRTtBQUFBLE1BQ2hHLE1BQU0sT0FBTyxXQUFXLENBQUM7QUFBQSxNQUN6QixJQUFJLEtBQUssWUFBWTtBQUFBLFFBQVcsS0FBSyxVQUFVLENBQUM7QUFBQSxNQUNoRCxJQUFJLEtBQUssUUFBUSxvQkFBb0I7QUFBQSxRQUFXLEtBQUssUUFBUSxrQkFBa0I7QUFBQSxNQUUvRSxJQUFJO0FBQUEsTUFDSixJQUFJLENBQUM7QUFBQSxRQUFpQixrQkFBa0IsTUFBTTtBQUFBLE1BRTlDLElBQUk7QUFBQSxNQUNKLElBQUksT0FBTyxTQUFTLGFBQWE7QUFBQSxRQUM3QixhQUFhLEtBQUssR0FBYTtBQUFBLE1BQ25DLEVBQU8sU0FBSSxPQUFPLFdBQVcsYUFBYTtBQUFBLFFBQ3RDLGFBQWEsT0FBTyxLQUFLLEdBQWEsRUFBRSxTQUFTLFFBQVE7QUFBQSxNQUM3RCxFQUFPO0FBQUEsUUFDSCxNQUFNLElBQUksTUFBTSw2QkFBNkI7QUFBQTtBQUFBLE1BRWpELE1BQU0sR0FBRywwQkFBMEIsbUJBQW1CLFVBQVU7QUFBQSxNQUVoRSxJQUFJO0FBQUEsUUFDQSxNQUFNLE9BQU8sS0FBSyxVQUFVLEtBQUssTUFBTSxLQUFLO0FBQUEsUUFDNUMsTUFBTSxXQUFXLE1BQU0sT0FBTyxLQUFLLEVBQUUsUUFBUSxRQUFRLE1BQU0sU0FBUyxLQUFLLFFBQVEsQ0FBQztBQUFBLFFBQ2xGLE1BQU0sT0FBTyxNQUFNLFNBQVMsS0FBSztBQUFBLFFBQ2pDLE1BQU0sU0FBUyxnQkFBZ0IsS0FBSyxNQUFNLElBQUksQ0FBQztBQUFBLFFBQy9DLElBQUksT0FBTyxZQUFZLE1BQU07QUFBQSxVQUN6QixNQUFNLE1BQVcsQ0FBQztBQUFBLFVBQ2xCLElBQUksT0FBTyxRQUFRLE9BQU8sVUFBVTtBQUFBLFVBQ3BDLE9BQU8sQ0FBQyxLQUFLLE1BQU0sRUFBRSxXQUFXLE9BQU8sVUFBVSxDQUFDO0FBQUEsUUFDdEQ7QUFBQSxRQUNBLE9BQU8sQ0FBQyxNQUFNLE9BQU8sTUFBTSxFQUFFLFdBQVcsT0FBTyxVQUFVLENBQUM7QUFBQSxRQUM1RCxPQUFPLE9BQVk7QUFBQSxRQUNqQixNQUFNLGFBQWEsRUFBRSxjQUFjLE1BQU07QUFBQSxRQUN6QyxPQUFPLENBQUMsWUFBWSxNQUFNLEVBQUUsV0FBVyxVQUFVLENBQUM7QUFBQTtBQUFBO0FBQUEsU0FJcEQsS0FBSSxDQUFDLFNBQStDO0FBQUEsTUFFdEQsT0FBTyxNQUFNLElBQUksUUFBYyxPQUFPLFlBQVk7QUFBQSxRQUM5QyxNQUFNLE1BQU0sR0FBRyxNQUFNO0FBQUEsUUFDckIsTUFBTSxVQUFVLGlCQUFpQixXQUFXLFNBQVMsV0FBVztBQUFBLFFBQ2hFLE1BQU0sYUFBYSxLQUFLLElBQUk7QUFBQSxRQUM1QixNQUFNLFFBQVEsV0FBVyxNQUFNO0FBQUEsVUFDM0IsTUFBTSxXQUFXLEtBQUssSUFBSTtBQUFBLFVBQzFCLFFBQVEsQ0FBQyxFQUFFLFNBQVMsT0FBTyxPQUFPLFdBQVcsWUFBWSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxTQUFTLHlCQUF5QixhQUFhLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQztBQUFBLFdBQzFKLE9BQU87QUFBQSxRQUVWLElBQUk7QUFBQSxVQUNBLE1BQU0sV0FBVyxNQUFNLE9BQU8sS0FBSyxFQUFFLFFBQVEsT0FBTyxDQUFDO0FBQUEsVUFDckQsTUFBTSxXQUFXLEtBQUssSUFBSTtBQUFBLFVBQzFCLGFBQWEsS0FBSztBQUFBLFVBQ2xCLElBQUksU0FBUyxXQUFXLEtBQUs7QUFBQSxZQUN6QixRQUFRLENBQUMsRUFBRSxTQUFTLE9BQU8sT0FBTyxXQUFXLFlBQVksT0FBTyxFQUFFLGNBQWMsRUFBRSxVQUFVLFFBQVEsU0FBUyxRQUFRLFNBQVMsc0JBQXNCLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQztBQUFBLFVBQ3BLO0FBQUEsVUFFQSxRQUFRLENBQUMsTUFBTSxFQUFFLFNBQVMsTUFBTSxPQUFPLFdBQVcsWUFBWSxpQkFBaUIsT0FBTyxTQUFTLFFBQVEsSUFBSSxjQUFjLEVBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFBQSxVQUMvSSxPQUFPLE9BQVk7QUFBQSxVQUNqQixNQUFNLFdBQVcsS0FBSyxJQUFJO0FBQUEsVUFDMUIsT0FBTyxDQUFDLEVBQUUsU0FBUyxPQUFPLE9BQU8sV0FBVyxZQUFZLE1BQU0sR0FBRyxJQUFJO0FBQUE7QUFBQSxPQUU1RTtBQUFBO0FBQUEsSUFFTCxRQUFRO0FBQUEsRUFjWjtBQUFBLEVBRUEsT0FBTztBQUFBO0FBR1gsSUFBTSxpQkFBaUI7QUFFaEIsU0FBUyxlQUFrQixDQUFDLE1BQVk7QUFBQSxFQUMzQyxJQUFJLFNBQVMsUUFBUSxTQUFTO0FBQUEsSUFBVyxPQUFPO0FBQUEsRUFDaEQsTUFBTSxPQUFPLE9BQU87QUFBQSxFQUNwQixJQUFJLFNBQVMsVUFBVTtBQUFBLElBQ25CLElBQUksZ0JBQWdCO0FBQUEsTUFBTSxPQUFPO0FBQUEsSUFDakMsSUFBSSxNQUFNLFFBQVEsSUFBSSxHQUFHO0FBQUEsTUFDckIsTUFBTSxNQUFNLEtBQUs7QUFBQSxNQUNqQixTQUFTLElBQUksRUFBRyxJQUFJLEtBQUssS0FBSztBQUFBLFFBQzFCLE1BQU0sU0FBUyxnQkFBZ0IsS0FBSyxFQUFFO0FBQUEsUUFDdEMsSUFBSSxXQUFXLEtBQUs7QUFBQSxVQUFJLEtBQUssS0FBSztBQUFBLE1BQ3RDO0FBQUEsTUFDQSxPQUFPO0FBQUEsSUFDWDtBQUFBLElBQ0EsTUFBTSxPQUFPLE9BQU8sS0FBSyxJQUFjO0FBQUEsSUFDdkMsTUFBTSxNQUFNO0FBQUEsSUFDWixTQUFTLElBQUksRUFBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQUEsTUFDbEMsTUFBTSxNQUFNLEtBQUs7QUFBQSxNQUNqQixNQUFNLFFBQVEsSUFBSTtBQUFBLE1BQ2xCLE1BQU0sU0FBUyxnQkFBZ0IsS0FBSztBQUFBLE1BQ3BDLElBQUksV0FBVztBQUFBLFFBQU8sSUFBSSxPQUFPO0FBQUEsSUFDckM7QUFBQSxJQUNBLE9BQU87QUFBQSxFQUNYO0FBQUEsRUFDQSxJQUFJLFNBQVMsVUFBVTtBQUFBLElBQ25CLE1BQU0sTUFBTTtBQUFBLElBRVosTUFBTSxNQUFNLElBQUk7QUFBQSxJQUNoQixJQUFJLE9BQU8sTUFBTSxPQUFPLE1BQU0sSUFBSSxXQUFXLENBQUMsS0FBSyxNQUFRLElBQUksV0FBVyxDQUFDLEtBQUssTUFBUSxJQUFJLFFBQVEsR0FBRyxNQUFNLElBQUk7QUFBQSxNQUM3RyxNQUFNLFFBQVEsSUFBSSxNQUFNLGNBQWM7QUFBQSxNQUN0QyxJQUFJLFVBQVUsTUFBTTtBQUFBLFFBQ2hCLElBQUksTUFBTSxJQUFJO0FBQUEsVUFDVixNQUFNLFdBQVcsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEtBQUssTUFBTSxHQUFHLFNBQVMsSUFBSTtBQUFBLFVBQ3ZFLElBQUksWUFBWSxHQUFHO0FBQUEsWUFDZixPQUFPLElBQUksS0FBSyxJQUFJLFVBQVUsR0FBRyxRQUFRLElBQUksSUFBSSxVQUFVLFdBQVcsQ0FBQyxDQUFDO0FBQUEsVUFDNUU7QUFBQSxVQUNBLE9BQU8sSUFBSSxLQUFLLEdBQUc7QUFBQSxRQUN2QjtBQUFBLFFBQ0EsT0FBTyxJQUFJLEtBQUssTUFBTSxLQUFLLEdBQUc7QUFBQSxNQUNsQztBQUFBLElBQ0o7QUFBQSxFQUNKO0FBQUEsRUFDQSxPQUFPO0FBQUE7QUFpRVgsZUFBc0IsUUFBUSxDQUFDLFFBQW9DLFNBQW9DO0FBQUEsRUFDbkcsTUFBTSxTQUFTLE9BQU8sVUFBVTtBQUFBLEVBQ2hDLElBQUk7QUFBQSxFQUVKLE9BQU8sRUFBRSxTQUFTLE1BQU0sT0FBTyxLQUFLLEdBQUcsTUFBTTtBQUFBLElBQ3pDLFFBQVEsT0FBTyxLQUFLO0FBQUEsRUFDeEI7QUFBQTtBQVNHLFNBQVMsUUFBUSxDQUFDLFFBQXlEO0FBQUEsRUFDOUUsSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBQ0osSUFBSSx5QkFBeUI7QUFBQSxFQUc3QixPQUFPLFNBQVMsT0FBTyxDQUFDLEtBQWlCO0FBQUEsSUFDckMsSUFBSSxXQUFXLFdBQVc7QUFBQSxNQUN0QixTQUFTO0FBQUEsTUFDVCxXQUFXO0FBQUEsTUFDWCxjQUFjO0FBQUEsSUFDbEIsRUFBTztBQUFBLE1BRUgsU0FBUyxPQUFPLFFBQVEsR0FBRztBQUFBO0FBQUEsSUFHL0IsTUFBTSxZQUFZLE9BQU87QUFBQSxJQUN6QixJQUFJLFlBQVk7QUFBQSxJQUNoQixPQUFPLFdBQVcsV0FBVztBQUFBLE1BQ3pCLElBQUksd0JBQXdCO0FBQUEsUUFDeEIsSUFBSSxPQUFPLGNBQWMsSUFBSTtBQUFBLFVBQ3pCLFlBQVksRUFBRTtBQUFBLFFBQ2xCO0FBQUEsUUFFQSx5QkFBeUI7QUFBQSxNQUM3QjtBQUFBLE1BR0EsSUFBSSxVQUFVO0FBQUEsTUFDZCxNQUFPLFdBQVcsYUFBYSxZQUFZLElBQUksRUFBRSxVQUFVO0FBQUEsUUFDdkQsUUFBUSxPQUFPO0FBQUEsZUFDTjtBQUFBLFlBQ0QsSUFBSSxnQkFBZ0IsSUFBSTtBQUFBLGNBRXBCLGNBQWMsV0FBVztBQUFBLFlBQzdCO0FBQUEsWUFDQTtBQUFBLGVBQ0MsSUFBSTtBQUFBLFlBQ0wseUJBQXlCO0FBQUEsWUFDekIsVUFBVTtBQUFBLFlBQ1Y7QUFBQSxVQUNKO0FBQUEsZUFDSztBQUFBLFlBQ0QsVUFBVTtBQUFBLFlBQ1Y7QUFBQTtBQUFBLE1BRVo7QUFBQSxNQUVBLElBQUksWUFBWSxJQUFJO0FBQUEsUUFHaEI7QUFBQSxNQUNKO0FBQUEsTUFHQSxPQUFPLE9BQU8sU0FBUyxXQUFXLE9BQU8sR0FBRyxXQUFXO0FBQUEsTUFDdkQsWUFBWTtBQUFBLE1BQ1osY0FBYztBQUFBLElBQ2xCO0FBQUEsSUFFQSxJQUFJLGNBQWMsV0FBVztBQUFBLE1BQ3pCLFNBQVM7QUFBQSxJQUNiLEVBQU8sU0FBSSxjQUFjLEdBQUc7QUFBQSxNQUd4QixTQUFTLE9BQU8sU0FBUyxTQUFTO0FBQUEsTUFDbEMsWUFBWTtBQUFBLElBQ2hCO0FBQUE7QUFBQTtBQVdELFNBQVMsV0FBVyxDQUFDLFdBQStDO0FBQUEsRUFDdkUsSUFBSSxVQUFVLFdBQVc7QUFBQSxFQUN6QixNQUFNLFVBQVUsSUFBSTtBQUFBLEVBR3BCLE9BQU8sU0FBUyxNQUFNLENBQUMsTUFBa0IsYUFBcUI7QUFBQSxJQUMxRCxJQUFJLEtBQUssV0FBVyxHQUFHO0FBQUEsTUFFbkIsWUFBWSxPQUFPO0FBQUEsTUFDbkIsVUFBVSxXQUFXO0FBQUEsSUFDekIsRUFBTyxTQUFJLGNBQWMsR0FBRztBQUFBLE1BSXhCLE1BQU0sUUFBUSxRQUFRLE9BQU8sS0FBSyxTQUFTLEdBQUcsV0FBVyxDQUFDO0FBQUEsTUFDMUQsTUFBTSxjQUFjLGVBQWUsS0FBSyxjQUFjLE9BQU8sS0FBSyxJQUFJO0FBQUEsTUFDdEUsTUFBTSxRQUFRLFFBQVEsT0FBTyxLQUFLLFNBQVMsV0FBVyxDQUFDO0FBQUEsTUFFdkQsUUFBUTtBQUFBLGFBQ0M7QUFBQSxVQUdELFFBQVEsT0FBTyxRQUFRLE9BQU8sR0FBRyxRQUFRO0FBQUEsRUFBUyxVQUFVO0FBQUEsVUFDNUQ7QUFBQTtBQUFBLElBRVo7QUFBQTtBQUFBO0FBSVIsU0FBUyxNQUFNLENBQUMsR0FBZSxHQUFlO0FBQUEsRUFDMUMsTUFBTSxNQUFNLElBQUksV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNO0FBQUEsRUFDOUMsSUFBSSxJQUFJLENBQUM7QUFBQSxFQUNULElBQUksSUFBSSxHQUFHLEVBQUUsTUFBTTtBQUFBLEVBQ25CLE9BQU87QUFBQTtBQUdYLFNBQVMsVUFBVSxHQUF1QjtBQUFBLEVBQ3RDLE9BQU87QUFBQSxJQUNILE1BQU07QUFBQSxFQUNWO0FBQUE7QUFHRyxTQUFTLGFBQXNCLEdBQTRCO0FBQUEsRUFDOUQsSUFBSTtBQUFBLEVBQ0osSUFBSTtBQUFBLEVBQ0osTUFBTSxVQUFVLElBQUksUUFBVyxDQUFDLEtBQUssUUFBUTtBQUFBLElBQ3pDLFVBQVU7QUFBQSxJQUNWLFNBQVM7QUFBQSxHQUNaO0FBQUEsRUFDRCxPQUFPLEVBQUUsU0FBUyxTQUFtQixPQUFnQjtBQUFBO0FBR3pELElBQU0sVUFBVTtBQUNoQixJQUFNLGFBQWE7QUFDbkIsSUFBSSxhQUFpQztBQUVyQyxlQUFlLE1BQU0sR0FBeUI7QUFBQSxFQUMxQyxJQUFJO0FBQUEsSUFBWSxPQUFPO0FBQUEsRUFFdkIsT0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFBQSxJQUNwQyxNQUFNLFVBQVUsVUFBVSxLQUFLLFNBQVMsQ0FBQztBQUFBLElBQ3pDLFFBQVEsVUFBVSxNQUFNLE9BQU8sUUFBUSxLQUFLO0FBQUEsSUFDNUMsUUFBUSxZQUFZLE1BQU07QUFBQSxNQUN0QixhQUFhLFFBQVE7QUFBQSxNQUNyQixRQUFRLFVBQVU7QUFBQTtBQUFBLElBRXRCLFFBQVEsa0JBQWtCLENBQUMsVUFBVTtBQUFBLE1BQ2pDLE1BQU0sS0FBTSxNQUFNLE9BQTRCO0FBQUEsTUFDOUMsSUFBSSxDQUFDLEdBQUcsaUJBQWlCLFNBQVMsVUFBVSxHQUFHO0FBQUEsUUFDM0MsR0FBRyxrQkFBa0IsVUFBVTtBQUFBLE1BQ25DO0FBQUE7QUFBQSxHQUVQO0FBQUE7QUFHTCxlQUFzQix5QkFBeUIsQ0FBQyxTQUFtRjtBQUFBLEVBQy9ILE1BQU0sT0FBTztBQUFBLEVBRWIsSUFBSSxnQkFBa0M7QUFBQSxFQUN0QyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUU7QUFBQSxFQUVqQyxJQUFJLFNBQVMsWUFBWTtBQUFBLElBQ3JCLE1BQU0sWUFBWSxRQUFRLGlCQUFpQjtBQUFBLElBQzNDLElBQUksWUFBWSxFQUFFLE9BQU8sU0FBUyxFQUFFLFFBQVEsQ0FBQyxNQUFNLE1BQU07QUFBQSxNQUNyRCxJQUFJLElBQUk7QUFBQSxRQUFJLFFBQVEsS0FBSztBQUFBLEtBQzVCO0FBQUEsSUFFRCxNQUFNLFVBQVUsSUFBSTtBQUFBLElBQ3BCLE1BQU0sVUFBVSxRQUFRLE9BQU8sU0FBUztBQUFBLElBQ3hDLE1BQU0sY0FBYyxNQUFNLE9BQU8sT0FBTyxVQUFVLE9BQU8sU0FBUyxFQUFFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFBQSxJQUUxRyxnQkFBZ0IsTUFBTSxPQUFPLE9BQU8sVUFDaEM7QUFBQSxNQUNJLE1BQU07QUFBQSxNQUNOLE1BQU0sUUFBUSxPQUFPLHVCQUF1QjtBQUFBLE1BQzVDLFlBQVk7QUFBQSxNQUNaLE1BQU07QUFBQSxJQUNWLEdBQ0EsYUFDQSxFQUFFLE1BQU0sV0FBVyxRQUFRLElBQUksR0FDL0IsT0FDQSxDQUFDLFdBQVcsU0FBUyxDQUN6QjtBQUFBLEVBQ0o7QUFBQSxFQUVBLE1BQU0sY0FBYyxPQUFPLFNBQW1DO0FBQUEsSUFDMUQsSUFBSSxDQUFDO0FBQUEsTUFBZSxPQUFPO0FBQUEsSUFFM0IsTUFBTSxhQUFhLEtBQUssVUFBVSxJQUFJO0FBQUEsSUFDdEMsTUFBTSxVQUFVLElBQUk7QUFBQSxJQUNwQixNQUFNLFlBQVksUUFBUSxPQUFPLFVBQVU7QUFBQSxJQUUzQyxNQUFNLHVCQUF1QixNQUFNLE9BQU8sT0FBTyxRQUM3QztBQUFBLE1BQ0ksTUFBTTtBQUFBLE1BQ047QUFBQSxNQUNBLFFBQVE7QUFBQSxJQUNaLEdBQ0EsZUFDQSxTQUNKO0FBQUEsSUFFQSxPQUFPLElBQUksV0FBVyxvQkFBb0I7QUFBQTtBQUFBLEVBRzlDLE1BQU0sY0FBYyxPQUFPLGtCQUEwRDtBQUFBLElBQ2pGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztBQUFBLE1BQWUsT0FBTztBQUFBLElBRTdDLE1BQU0sY0FBYyx5QkFBeUIsYUFBYyxjQUFjLFNBQXlCO0FBQUEsSUFFbEcsTUFBTSxpQkFBaUIsTUFBTSxPQUFPLE9BQU8sUUFDdkM7QUFBQSxNQUNJLE1BQU07QUFBQSxNQUNOO0FBQUEsTUFDQSxRQUFRO0FBQUEsSUFDWixHQUNBLGVBQ0EsV0FDSjtBQUFBLElBRUEsTUFBTSxVQUFVLElBQUk7QUFBQSxJQUNwQixNQUFNLGFBQWEsUUFBUSxPQUFPLGNBQWM7QUFBQSxJQUNoRCxPQUFPLGdCQUFnQixLQUFLLE1BQU0sVUFBVSxDQUFDO0FBQUE7QUFBQSxFQUdqRCxPQUFPO0FBQUEsU0FDRyxJQUFHLENBQUMsS0FBK0Q7QUFBQSxNQUNyRSxNQUFNLEtBQUssTUFBTSxPQUFPO0FBQUEsTUFDeEIsT0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFBQSxRQUNwQyxNQUFNLGNBQWMsR0FBRyxZQUFZLFlBQVksVUFBVTtBQUFBLFFBQ3pELE1BQU0sUUFBUSxZQUFZLFlBQVksVUFBVTtBQUFBLFFBQ2hELE1BQU0sVUFBVSxNQUFNLElBQUksR0FBRztBQUFBLFFBQzdCLFFBQVEsVUFBVSxNQUFNLE9BQU8sUUFBUSxLQUFLO0FBQUEsUUFDNUMsUUFBUSxZQUFZLFlBQVk7QUFBQSxVQUM1QixNQUFNLFNBQVMsUUFBUTtBQUFBLFVBQ3ZCLElBQUksQ0FBQyxRQUFRO0FBQUEsWUFDVCxRQUFRLElBQUk7QUFBQSxZQUNaO0FBQUEsVUFDSjtBQUFBLFVBRUEsSUFBSSxTQUFTLGVBQWUsT0FBTyxnQkFBZ0IsZUFBZSxPQUFPLGdCQUFnQixhQUFhO0FBQUEsWUFDbEcsTUFBTSxnQkFBZ0IsTUFBTSxZQUFZLE9BQU8sSUFBSTtBQUFBLFlBQ25ELFFBQVEsRUFBRSxNQUFNLGVBQWUsV0FBVyxPQUFPLFVBQVUsQ0FBQztBQUFBLFlBQzVEO0FBQUEsVUFDSjtBQUFBLFVBRUEsUUFBUSxVQUFVLElBQUk7QUFBQTtBQUFBLE9BRTdCO0FBQUE7QUFBQSxTQUVDLElBQUcsQ0FBQyxLQUFhLE1BQTBCO0FBQUEsTUFDN0MsTUFBTSxLQUFLLE1BQU0sT0FBTztBQUFBLE1BQ3hCLElBQUksY0FBbUI7QUFBQSxNQUV2QixJQUFJLFNBQVMsWUFBWTtBQUFBLFFBQ3JCLGNBQWMsTUFBTSxZQUFZLElBQUk7QUFBQSxNQUN4QztBQUFBLE1BRUEsT0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFBQSxRQUNwQyxNQUFNLGNBQWMsR0FBRyxZQUFZLFlBQVksV0FBVztBQUFBLFFBQzFELE1BQU0sUUFBUSxZQUFZLFlBQVksVUFBVTtBQUFBLFFBQ2hELE1BQU0sVUFBVSxNQUFNLElBQUksRUFBRSxNQUFNLGFBQWEsV0FBVyxLQUFLLElBQUksRUFBRSxHQUFHLEdBQUc7QUFBQSxRQUMzRSxRQUFRLFVBQVUsTUFBTSxPQUFPLFFBQVEsS0FBSztBQUFBLFFBQzVDLFFBQVEsWUFBWSxNQUFNLFFBQVE7QUFBQSxPQUNyQztBQUFBO0FBQUEsRUFFVDtBQUFBO0FBR0osU0FBUyxnQkFBZ0IsQ0FBQyxNQUFjLFFBQXFCO0FBQUEsRUFDekQsT0FBTyxHQUFHLFFBQVEsS0FBSyxVQUFVLFVBQVUsQ0FBQyxDQUFDO0FBQUE7IiwKICAiZGVidWdJZCI6ICIxREUwNUZBMjRFNkQ5Mzg0NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milkio/stargate",
3
- "version": "1.1.2",
3
+ "version": "1.2.0",
4
4
  "type": "module",
5
5
  "exports": "./index.js",
6
6
  "types": "./index.d.ts",