@milkio/stargate 1.0.0-beta.99 → 1.0.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 (4) hide show
  1. package/LICENSE +20 -20
  2. package/index.d.ts +65 -43
  3. package/index.js +208 -42
  4. package/package.json +12 -1
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2023 akirarika
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
1
+ MIT License
2
+
3
+ Copyright (c) 2023 akirarika
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.
package/index.d.ts CHANGED
@@ -3,14 +3,28 @@ export type MilkioStargateOptions = {
3
3
  timeout?: number;
4
4
  fetch?: typeof fetch;
5
5
  abort?: typeof AbortController;
6
+ cacheStorage?: CacheStorage;
7
+ cacheEncryption?: boolean;
6
8
  };
7
9
  export type Mixin<T, U> = U & Omit<T, keyof U>;
8
- export type ExecuteOptions = {
10
+ export type CacheStrategy = 'off' | 'fallback' | 'throttle';
11
+ export type RetryStrategy = boolean | number;
12
+ export interface CacheStorage {
13
+ get: (key: string) => Promise<{
14
+ data: any;
15
+ timestamp: number;
16
+ } | null>;
17
+ set: (key: string, data: any) => Promise<void>;
18
+ }
19
+ export type ExecuteOptions<T extends any> = {
9
20
  params?: Record<any, any>;
10
21
  headers?: Record<string, string>;
11
22
  timeout?: number;
12
- type?: "action" | "stream";
13
23
  baseUrl?: string | (() => string) | (() => Promise<string>);
24
+ cacheStrategy?: CacheStrategy;
25
+ cacheThrottleMs?: number;
26
+ onCacheHit?: (result: T) => void | Promise<void>;
27
+ retryStrategy?: RetryStrategy;
14
28
  };
15
29
  export type ExecuteResultsOption = {
16
30
  executeId: string;
@@ -34,11 +48,8 @@ export declare function createStargate<Generated extends {
34
48
  routeSchema: any;
35
49
  rejectCode: any;
36
50
  }>(stargateOptions: MilkioStargateOptions): Promise<{
37
- $types: {
38
- generated: Generated;
39
- };
40
51
  options: MilkioStargateOptions;
41
- execute<Path extends keyof Generated["routeSchema"]>(path: Path, options?: Mixin<ExecuteOptions, {
52
+ execute<Path extends keyof Generated["routeSchema"]>(path: Path, options: Mixin<ExecuteOptions<Generated["routeSchema"][Path]["types"]["result"]>, {
42
53
  params?: Generated["routeSchema"][Path]["types"]["params"];
43
54
  }>): Promise<Generated["routeSchema"][Path]["types"]["\uD83E\uDD5B"] extends boolean ? // action
44
55
  [Partial<Generated["rejectCode"]>, null, ExecuteResultsOption] | [null, Generated["routeSchema"][Path]["types"]["result"], ExecuteResultsOption] : // stream
@@ -49,25 +60,31 @@ export declare function createStargate<Generated extends {
49
60
  ping(options?: {
50
61
  timeout?: number;
51
62
  }): Promise<Ping>;
63
+ $types: {
64
+ generated: Generated;
65
+ error: Generated["rejectCode"];
66
+ params: { [Path in keyof Generated["routeSchema"]]: Generated["routeSchema"][Path]["types"]["params"]; };
67
+ results: { [Path in keyof Generated["routeSchema"]]: Generated["routeSchema"][Path]["types"]["\uD83E\uDD5B"] extends boolean ? Generated["routeSchema"][Path]["types"]["result"] : AsyncGenerator<[Partial<Generated["rejectCode"]>, null] | [null, GeneratorGeneric<Generated["routeSchema"][Path]["types"]["result"]>], undefined>; };
68
+ };
52
69
  on: <Key extends keyof {
53
- "milkio:executeBefore": {
70
+ 'milkio:executeBefore': {
54
71
  path: string;
55
- options: Mixin<ExecuteOptions, {
72
+ options: Mixin<ExecuteOptions<any>, {
56
73
  headers: Record<string, string>;
57
74
  baseUrl: string;
58
75
  }>;
59
76
  };
60
- "milkio:fetchBefore": {
77
+ 'milkio:fetchBefore': {
61
78
  path: string;
62
- options: Mixin<ExecuteOptions, {
79
+ options: Mixin<ExecuteOptions<any>, {
63
80
  headers: Record<string, string>;
64
81
  baseUrl: string;
65
82
  }>;
66
83
  body: string;
67
84
  };
68
- "milkio:executeError": {
85
+ 'milkio:executeError': {
69
86
  path: string;
70
- options: Mixin<ExecuteOptions, {
87
+ options: Mixin<ExecuteOptions<any>, {
71
88
  headers: Record<string, string>;
72
89
  baseUrl: string;
73
90
  }>;
@@ -75,24 +92,24 @@ export declare function createStargate<Generated extends {
75
92
  handleError: <K extends keyof Partial<Generated["rejectCode"]>>(error: any, key: K, handler: (error: Partial<Generated["rejectCode"][K]>) => boolean | Promise<boolean>) => Promise<void>;
76
93
  };
77
94
  }, Handler extends (event: {
78
- "milkio:executeBefore": {
95
+ 'milkio:executeBefore': {
79
96
  path: string;
80
- options: Mixin<ExecuteOptions, {
97
+ options: Mixin<ExecuteOptions<any>, {
81
98
  headers: Record<string, string>;
82
99
  baseUrl: string;
83
100
  }>;
84
101
  };
85
- "milkio:fetchBefore": {
102
+ 'milkio:fetchBefore': {
86
103
  path: string;
87
- options: Mixin<ExecuteOptions, {
104
+ options: Mixin<ExecuteOptions<any>, {
88
105
  headers: Record<string, string>;
89
106
  baseUrl: string;
90
107
  }>;
91
108
  body: string;
92
109
  };
93
- "milkio:executeError": {
110
+ 'milkio:executeError': {
94
111
  path: string;
95
- options: Mixin<ExecuteOptions, {
112
+ options: Mixin<ExecuteOptions<any>, {
96
113
  headers: Record<string, string>;
97
114
  baseUrl: string;
98
115
  }>;
@@ -101,24 +118,24 @@ export declare function createStargate<Generated extends {
101
118
  };
102
119
  }[Key]) => void>(key: Key, handler: Handler) => () => void;
103
120
  off: <Key extends keyof {
104
- "milkio:executeBefore": {
121
+ 'milkio:executeBefore': {
105
122
  path: string;
106
- options: Mixin<ExecuteOptions, {
123
+ options: Mixin<ExecuteOptions<any>, {
107
124
  headers: Record<string, string>;
108
125
  baseUrl: string;
109
126
  }>;
110
127
  };
111
- "milkio:fetchBefore": {
128
+ 'milkio:fetchBefore': {
112
129
  path: string;
113
- options: Mixin<ExecuteOptions, {
130
+ options: Mixin<ExecuteOptions<any>, {
114
131
  headers: Record<string, string>;
115
132
  baseUrl: string;
116
133
  }>;
117
134
  body: string;
118
135
  };
119
- "milkio:executeError": {
136
+ 'milkio:executeError': {
120
137
  path: string;
121
- options: Mixin<ExecuteOptions, {
138
+ options: Mixin<ExecuteOptions<any>, {
122
139
  headers: Record<string, string>;
123
140
  baseUrl: string;
124
141
  }>;
@@ -126,24 +143,24 @@ export declare function createStargate<Generated extends {
126
143
  handleError: <K extends keyof Partial<Generated["rejectCode"]>>(error: any, key: K, handler: (error: Partial<Generated["rejectCode"][K]>) => boolean | Promise<boolean>) => Promise<void>;
127
144
  };
128
145
  }, Handler extends (event: {
129
- "milkio:executeBefore": {
146
+ 'milkio:executeBefore': {
130
147
  path: string;
131
- options: Mixin<ExecuteOptions, {
148
+ options: Mixin<ExecuteOptions<any>, {
132
149
  headers: Record<string, string>;
133
150
  baseUrl: string;
134
151
  }>;
135
152
  };
136
- "milkio:fetchBefore": {
153
+ 'milkio:fetchBefore': {
137
154
  path: string;
138
- options: Mixin<ExecuteOptions, {
155
+ options: Mixin<ExecuteOptions<any>, {
139
156
  headers: Record<string, string>;
140
157
  baseUrl: string;
141
158
  }>;
142
159
  body: string;
143
160
  };
144
- "milkio:executeError": {
161
+ 'milkio:executeError': {
145
162
  path: string;
146
- options: Mixin<ExecuteOptions, {
163
+ options: Mixin<ExecuteOptions<any>, {
147
164
  headers: Record<string, string>;
148
165
  baseUrl: string;
149
166
  }>;
@@ -152,24 +169,24 @@ export declare function createStargate<Generated extends {
152
169
  };
153
170
  }[Key]) => void>(key: Key, handler: Handler) => void;
154
171
  emit: <Key extends keyof {
155
- "milkio:executeBefore": {
172
+ 'milkio:executeBefore': {
156
173
  path: string;
157
- options: Mixin<ExecuteOptions, {
174
+ options: Mixin<ExecuteOptions<any>, {
158
175
  headers: Record<string, string>;
159
176
  baseUrl: string;
160
177
  }>;
161
178
  };
162
- "milkio:fetchBefore": {
179
+ 'milkio:fetchBefore': {
163
180
  path: string;
164
- options: Mixin<ExecuteOptions, {
181
+ options: Mixin<ExecuteOptions<any>, {
165
182
  headers: Record<string, string>;
166
183
  baseUrl: string;
167
184
  }>;
168
185
  body: string;
169
186
  };
170
- "milkio:executeError": {
187
+ 'milkio:executeError': {
171
188
  path: string;
172
- options: Mixin<ExecuteOptions, {
189
+ options: Mixin<ExecuteOptions<any>, {
173
190
  headers: Record<string, string>;
174
191
  baseUrl: string;
175
192
  }>;
@@ -177,24 +194,24 @@ export declare function createStargate<Generated extends {
177
194
  handleError: <K extends keyof Partial<Generated["rejectCode"]>>(error: any, key: K, handler: (error: Partial<Generated["rejectCode"][K]>) => boolean | Promise<boolean>) => Promise<void>;
178
195
  };
179
196
  }, Value extends {
180
- "milkio:executeBefore": {
197
+ 'milkio:executeBefore': {
181
198
  path: string;
182
- options: Mixin<ExecuteOptions, {
199
+ options: Mixin<ExecuteOptions<any>, {
183
200
  headers: Record<string, string>;
184
201
  baseUrl: string;
185
202
  }>;
186
203
  };
187
- "milkio:fetchBefore": {
204
+ 'milkio:fetchBefore': {
188
205
  path: string;
189
- options: Mixin<ExecuteOptions, {
206
+ options: Mixin<ExecuteOptions<any>, {
190
207
  headers: Record<string, string>;
191
208
  baseUrl: string;
192
209
  }>;
193
210
  body: string;
194
211
  };
195
- "milkio:executeError": {
212
+ 'milkio:executeError': {
196
213
  path: string;
197
- options: Mixin<ExecuteOptions, {
214
+ options: Mixin<ExecuteOptions<any>, {
198
215
  headers: Record<string, string>;
199
216
  baseUrl: string;
200
217
  }>;
@@ -203,6 +220,7 @@ export declare function createStargate<Generated extends {
203
220
  };
204
221
  }[Key]>(key: Key, value: Value) => Promise<void>;
205
222
  }>;
223
+ export declare function reviveJSONParse<T>(json: T): T;
206
224
  export interface ExecuteStreamOptions {
207
225
  headers?: Record<string, string>;
208
226
  timeout?: number;
@@ -249,7 +267,7 @@ export interface ExecuteResultSuccess<Result> {
249
267
  data: Result;
250
268
  }
251
269
  export type GeneratorGeneric<T> = T extends AsyncGenerator<infer I> ? I : never;
252
- export type FlattenKeys<T, Prefix extends string = ""> = {
270
+ export type FlattenKeys<T, Prefix extends string = ''> = {
253
271
  [K in keyof T]: T[K] extends object ? FlattenKeys<T[K], `${Prefix}${Exclude<K, symbol>}.`> : `$input.${Prefix}${Exclude<K, symbol>}`;
254
272
  }[keyof T];
255
273
  /**
@@ -282,3 +300,7 @@ export declare function getLines(onLine: (line: Uint8Array, fieldLength: number)
282
300
  */
283
301
  export declare function getMessages(onMessage?: (msg: EventSourceMessage) => void): (line: Uint8Array, fieldLength: number) => void;
284
302
  export declare function withResolvers<T = any>(): PromiseWithResolvers<T>;
303
+ export declare function createDefaultCacheStorage(options?: {
304
+ encryption?: boolean;
305
+ encryptionKey?: string;
306
+ }): Promise<CacheStorage>;
package/index.js CHANGED
@@ -56,13 +56,8 @@ async function createStargate(stargateOptions) {
56
56
  const baseUrl = bootstrap();
57
57
  const stargate = {
58
58
  ...eventManager,
59
- $types: {
60
- generated: undefined
61
- },
62
59
  options: stargateOptions,
63
60
  async execute(path, options) {
64
- if (!options)
65
- options = {};
66
61
  if (options.headers === undefined)
67
62
  options.headers = {};
68
63
  let url;
@@ -76,47 +71,102 @@ async function createStargate(stargateOptions) {
76
71
  } else {
77
72
  url = await baseUrl + path;
78
73
  }
79
- if (options.type !== "stream") {
74
+ if (!path.endsWith("~")) {
80
75
  if (options.headers.Accept === undefined)
81
76
  options.headers.Accept = "application/json";
82
77
  if (options.headers["Content-Type"] === undefined)
83
78
  options.headers["Content-Type"] = "application/json";
84
- let result;
85
- try {
86
- await eventManager.emit("milkio:executeBefore", { path, options });
87
- const body = JSON.stringify(options.params) ?? "";
88
- await eventManager.emit("milkio:fetchBefore", { path, options, body });
89
- const response = await new Promise(async (resolve, reject) => {
90
- const timeout = options?.timeout ?? options?.timeout ?? 6000;
91
- const timer = setTimeout(() => {
92
- reject([{ REQUEST_TIMEOUT: { timeout, message: `Execute timeout after ${timeout}ms.` } }, null]);
93
- }, timeout);
79
+ const cacheStrategy = options.cacheStrategy ?? "off";
80
+ let retryCount = 0;
81
+ if (options.retryStrategy === true || options.retryStrategy === 2) {
82
+ retryCount = 2;
83
+ } else if (typeof options.retryStrategy === "number" && options.retryStrategy > 0) {
84
+ retryCount = options.retryStrategy;
85
+ }
86
+ const cacheThrottleMs = options.cacheThrottleMs ?? 0;
87
+ const cacheKey = generateCacheKey(path, options.params);
88
+ let cacheStorage = stargateOptions.cacheStorage;
89
+ if (cacheStrategy !== "off" && !cacheStorage) {
90
+ cacheStorage = await createDefaultCacheStorage({ encryption: stargateOptions.cacheEncryption });
91
+ }
92
+ if (cacheStrategy !== "off" && cacheStorage && options.onCacheHit) {
93
+ const cached = await cacheStorage.get(cacheKey);
94
+ if (cached) {
94
95
  try {
95
- const value = await (await $fetch(url, { method: "POST", body, headers: options.headers })).text();
96
- clearTimeout(timer);
97
- resolve(value);
98
- } catch (error) {
99
- reject(error);
100
- }
101
- });
102
- result = { value: reviveJSONParse(JSON.parse(response)) };
103
- } catch (error) {
96
+ await options.onCacheHit(cached.data);
97
+ } catch {}
98
+ }
99
+ }
100
+ if (cacheStrategy === "throttle" && cacheStorage) {
101
+ const cached = await cacheStorage.get(cacheKey);
102
+ if (cached && Date.now() - cached.timestamp < cacheThrottleMs) {
103
+ return [null, cached.data, { executeId: "cached" }];
104
+ }
105
+ }
106
+ const executeRequest = async (isRetry) => {
107
+ try {
108
+ await eventManager.emit("milkio:executeBefore", { path, options });
109
+ const body = JSON.stringify(options.params) ?? "";
110
+ await eventManager.emit("milkio:fetchBefore", { path, options, body });
111
+ const response = await new Promise(async (resolve, reject) => {
112
+ const timeout = options?.timeout ?? stargateOptions?.timeout ?? 6000;
113
+ const timer = setTimeout(() => {
114
+ reject([{ REQUEST_TIMEOUT: { timeout, message: `Execute timeout after ${timeout}ms.` } }, null]);
115
+ }, timeout);
116
+ try {
117
+ const value = await (await $fetch(url, { method: "POST", body, headers: options.headers })).text();
118
+ clearTimeout(timer);
119
+ resolve(value);
120
+ } catch (error2) {
121
+ reject(error2);
122
+ }
123
+ });
124
+ const parsed = reviveJSONParse(JSON.parse(response));
125
+ return { result: { value: parsed }, error: null, isNetworkError: false };
126
+ } catch (error2) {
127
+ const isNetworkError2 = !error2?.[0]?.REQUEST_TIMEOUT;
128
+ return { result: null, error: error2, isNetworkError: isNetworkError2 };
129
+ }
130
+ };
131
+ let { result, error, isNetworkError } = await executeRequest(false);
132
+ for (let retryIndex = 0;retryIndex < retryCount && error && isNetworkError; retryIndex++) {
133
+ if (retryIndex > 0) {
134
+ await new Promise((resolve) => setTimeout(resolve, 500));
135
+ }
136
+ const retryResult = await executeRequest(true);
137
+ result = retryResult.result;
138
+ error = retryResult.error;
139
+ isNetworkError = retryResult.isNetworkError;
140
+ }
141
+ if (error) {
104
142
  if (error?.[0]?.REQUEST_TIMEOUT) {
105
143
  await eventManager.emit("milkio:executeError", { handleError, path, options, error });
106
144
  return error;
107
145
  }
146
+ if (cacheStrategy !== "off" && cacheStorage && isNetworkError) {
147
+ const cached = await cacheStorage.get(cacheKey);
148
+ if (cached) {
149
+ return [null, cached.data, { executeId: "cached" }];
150
+ }
151
+ }
108
152
  const errorPined = { REQUEST_FAIL: error };
109
153
  await eventManager.emit("milkio:executeError", { handleError, path, options, error: errorPined });
110
154
  return [errorPined, null, { executeId: "unknown" }];
111
155
  }
112
156
  if (result.value.success !== true) {
113
- const error = {};
114
- error[result.value.code] = result.value.reject ?? null;
115
- await eventManager.emit("milkio:executeError", { handleError, path, options, error });
116
- return [error, null, { executeId: "unknown" }];
157
+ const err = {};
158
+ err[result.value.code] = result.value.reject ?? null;
159
+ await eventManager.emit("milkio:executeError", { handleError, path, options, error: err });
160
+ return [err, null, { executeId: result.value.executeId }];
161
+ }
162
+ if (cacheStrategy !== "off" && cacheStorage) {
163
+ await cacheStorage.set(cacheKey, result.value.data);
117
164
  }
118
165
  return [null, result.value.data, { executeId: result.value.executeId }];
119
166
  } else {
167
+ options.cacheStrategy = "off";
168
+ options.onCacheHit = undefined;
169
+ options.cacheThrottleMs = undefined;
120
170
  if (options.headers.Accept === undefined)
121
171
  options.headers.Accept = "text/event-stream";
122
172
  if (options.headers["Content-Type"] === undefined)
@@ -348,7 +398,7 @@ async function createStargate(stargateOptions) {
348
398
  resolve([{ connect: false, delay: endsTime - startsTime, error: { REQUEST_TIMEOUT: { timeout, message: `Execute timeout after ${timeout}ms.` } } }, null]);
349
399
  }, timeout);
350
400
  try {
351
- const response = await await $fetch(url, { method: "HEAD" });
401
+ const response = await $fetch(url, { method: "HEAD" });
352
402
  const endsTime = Date.now();
353
403
  clearTimeout(timer);
354
404
  if (response.status !== 204) {
@@ -360,18 +410,20 @@ async function createStargate(stargateOptions) {
360
410
  return [{ connect: false, delay: endsTime - startsTime, error }, null];
361
411
  }
362
412
  });
363
- }
413
+ },
414
+ $types: undefined
364
415
  };
365
416
  return stargate;
366
417
  }
418
+ var isoDatePattern = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?)(Z|[+-]\d{2}:?\d{2})?$/;
367
419
  function reviveJSONParse(json) {
368
- const isoDatePattern = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?)(Z|[+-]\d{2}:?\d{2})?$/;
369
- if (json instanceof Date)
370
- return json;
371
- if (Array.isArray(json)) {
372
- return json.map((item) => reviveJSONParse(item));
373
- }
374
- if (typeof json === "object" && json !== null) {
420
+ if (json !== null && typeof json === "object") {
421
+ if (json instanceof Date || typeof json.getTime === "function" && typeof json.toISOString === "function") {
422
+ return json;
423
+ }
424
+ if (Array.isArray(json)) {
425
+ return json.map((item) => reviveJSONParse(item));
426
+ }
375
427
  return Object.entries(json).reduce((acc, [key, value]) => {
376
428
  acc[key] = reviveJSONParse(value);
377
429
  return acc;
@@ -423,8 +475,11 @@ function getLines(onLine) {
423
475
  fieldLength = position - lineStart;
424
476
  }
425
477
  break;
426
- case 13:
478
+ case 13: {
427
479
  discardTrailingNewline = true;
480
+ lineEnd = position;
481
+ break;
482
+ }
428
483
  case 10:
429
484
  lineEnd = position;
430
485
  break;
@@ -485,13 +540,124 @@ function withResolvers() {
485
540
  });
486
541
  return { promise, resolve, reject };
487
542
  }
543
+ var DB_NAME = "Stargate";
544
+ var STORE_NAME = "caches";
545
+ var dbInstance = null;
546
+ async function openDB() {
547
+ if (dbInstance)
548
+ return dbInstance;
549
+ return new Promise((resolve, reject) => {
550
+ const request = indexedDB.open(DB_NAME, 1);
551
+ request.onerror = () => reject(request.error);
552
+ request.onsuccess = () => {
553
+ dbInstance = request.result;
554
+ resolve(dbInstance);
555
+ };
556
+ request.onupgradeneeded = (event) => {
557
+ const db = event.target.result;
558
+ if (!db.objectStoreNames.contains(STORE_NAME)) {
559
+ db.createObjectStore(STORE_NAME);
560
+ }
561
+ };
562
+ });
563
+ }
564
+ async function createDefaultCacheStorage(options) {
565
+ await openDB();
566
+ let encryptionKey = null;
567
+ const counter = new Uint8Array(16);
568
+ if (options?.encryption) {
569
+ const keyString = options.encryptionKey ?? DB_NAME;
570
+ new TextEncoder().encode(keyString).forEach((byte, i) => {
571
+ if (i < 16)
572
+ counter[i] = byte;
573
+ });
574
+ const encoder = new TextEncoder;
575
+ const keyData = encoder.encode(keyString);
576
+ const importedKey = await crypto.subtle.importKey("raw", keyData, { name: "PBKDF2" }, false, ["deriveKey"]);
577
+ encryptionKey = await crypto.subtle.deriveKey({
578
+ name: "PBKDF2",
579
+ salt: encoder.encode("milkio-stargate-cache"),
580
+ iterations: 1e5,
581
+ hash: "SHA-256"
582
+ }, importedKey, { name: "AES-CTR", length: 256 }, false, ["encrypt", "decrypt"]);
583
+ }
584
+ const encryptData = async (data) => {
585
+ if (!encryptionKey)
586
+ return data;
587
+ const jsonString = JSON.stringify(data);
588
+ const encoder = new TextEncoder;
589
+ const dataBytes = encoder.encode(jsonString);
590
+ const encryptedArrayBuffer = await crypto.subtle.encrypt({
591
+ name: "AES-CTR",
592
+ counter,
593
+ length: 64
594
+ }, encryptionKey, dataBytes);
595
+ return new Uint8Array(encryptedArrayBuffer);
596
+ };
597
+ const decryptData = async (encryptedData) => {
598
+ if (!encryptionKey || !encryptedData)
599
+ return encryptedData;
600
+ const arrayBuffer = encryptedData instanceof Uint8Array ? encryptedData.buffer : encryptedData;
601
+ const decryptedBytes = await crypto.subtle.decrypt({
602
+ name: "AES-CTR",
603
+ counter,
604
+ length: 64
605
+ }, encryptionKey, arrayBuffer);
606
+ const decoder = new TextDecoder;
607
+ const jsonString = decoder.decode(decryptedBytes);
608
+ return reviveJSONParse(JSON.parse(jsonString));
609
+ };
610
+ return {
611
+ async get(key) {
612
+ const db = await openDB();
613
+ return new Promise((resolve, reject) => {
614
+ const transaction = db.transaction(STORE_NAME, "readonly");
615
+ const store = transaction.objectStore(STORE_NAME);
616
+ const request = store.get(key);
617
+ request.onerror = () => reject(request.error);
618
+ request.onsuccess = async () => {
619
+ const result = request.result;
620
+ if (!result) {
621
+ resolve(null);
622
+ return;
623
+ }
624
+ if (options?.encryption && (result.data instanceof ArrayBuffer || result.data instanceof Uint8Array)) {
625
+ const decryptedData = await decryptData(result.data);
626
+ resolve({ data: decryptedData, timestamp: result.timestamp });
627
+ return;
628
+ }
629
+ resolve(result ?? null);
630
+ };
631
+ });
632
+ },
633
+ async set(key, data) {
634
+ const db = await openDB();
635
+ let dataToStore = data;
636
+ if (options?.encryption) {
637
+ dataToStore = await encryptData(data);
638
+ }
639
+ return new Promise((resolve, reject) => {
640
+ const transaction = db.transaction(STORE_NAME, "readwrite");
641
+ const store = transaction.objectStore(STORE_NAME);
642
+ const request = store.put({ data: dataToStore, timestamp: Date.now() }, key);
643
+ request.onerror = () => reject(request.error);
644
+ request.onsuccess = () => resolve();
645
+ });
646
+ }
647
+ };
648
+ }
649
+ function generateCacheKey(path, params) {
650
+ return `${path}:${JSON.stringify(params ?? {})}`;
651
+ }
488
652
  export {
489
653
  withResolvers,
654
+ reviveJSONParse,
490
655
  getMessages,
491
656
  getLines,
492
657
  getBytes,
493
- createStargate
658
+ createStargate,
659
+ createDefaultCacheStorage
494
660
  };
495
661
 
496
- //# debugId=2669F6A35237C41964756E2164756E21
497
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXGluZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImV4cG9ydCB0eXBlIE1pbGtpb1N0YXJnYXRlT3B0aW9ucyA9IHtcbiAgYmFzZVVybDogc3RyaW5nIHwgKCgpID0+IHN0cmluZykgfCAoKCkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgZmV0Y2g/OiB0eXBlb2YgZmV0Y2g7XG4gIGFib3J0PzogdHlwZW9mIEFib3J0Q29udHJvbGxlcjtcbn07XG5cbmV4cG9ydCB0eXBlIE1peGluPFQsIFU+ID0gVSAmIE9taXQ8VCwga2V5b2YgVT47XG5cbmV4cG9ydCB0eXBlIEV4ZWN1dGVPcHRpb25zID0ge1xuICBwYXJhbXM/OiBSZWNvcmQ8YW55LCBhbnk+O1xuICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgdHlwZT86IFwiYWN0aW9uXCIgfCBcInN0cmVhbVwiO1xuICBiYXNlVXJsPzogc3RyaW5nIHwgKCgpID0+IHN0cmluZykgfCAoKCkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbn07XG5cbmV4cG9ydCB0eXBlIEV4ZWN1dGVSZXN1bHRzT3B0aW9uID0geyBleGVjdXRlSWQ6IHN0cmluZyB9O1xuXG5leHBvcnQgdHlwZSBQaW5nID1cbiAgfCBbXG4gICAgICB7XG4gICAgICAgIGNvbm5lY3Q6IGZhbHNlO1xuICAgICAgICBkZWxheTogbnVtYmVyO1xuICAgICAgICBlcnJvcjogYW55O1xuICAgICAgfSxcbiAgICAgIG51bGwsXG4gICAgXVxuICB8IFtcbiAgICAgIG51bGwsXG4gICAgICB7XG4gICAgICAgIGNvbm5lY3Q6IHRydWU7XG4gICAgICAgIGRlbGF5OiBudW1iZXI7XG4gICAgICAgIHNlcnZlclRpbWVzdGFtcDogbnVtYmVyO1xuICAgICAgfSxcbiAgICBdO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN0YXJnYXRlPEdlbmVyYXRlZCBleHRlbmRzIHsgcm91dGVTY2hlbWE6IGFueTsgcmVqZWN0Q29kZTogYW55IH0+KHN0YXJnYXRlT3B0aW9uczogTWlsa2lvU3RhcmdhdGVPcHRpb25zKSB7XG4gIGNvbnN0ICRmZXRjaCA9IHN0YXJnYXRlT3B0aW9ucy5mZXRjaCA/PyBmZXRjaDtcbiAgY29uc3QgJGFib3J0ID0gc3RhcmdhdGVPcHRpb25zLmFib3J0ID8/IEFib3J0Q29udHJvbGxlcjtcblxuICB0eXBlIFN0YXJnYXRlRXZlbnRzID0ge1xuICAgIFwibWlsa2lvOmV4ZWN1dGVCZWZvcmVcIjogeyBwYXRoOiBzdHJpbmc7IG9wdGlvbnM6IE1peGluPEV4ZWN1dGVPcHRpb25zLCB7IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IGJhc2VVcmw6IHN0cmluZyB9PiB9O1xuICAgIFwibWlsa2lvOmZldGNoQmVmb3JlXCI6IHsgcGF0aDogc3RyaW5nOyBvcHRpb25zOiBNaXhpbjxFeGVjdXRlT3B0aW9ucywgeyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBiYXNlVXJsOiBzdHJpbmcgfT47IGJvZHk6IHN0cmluZyB9O1xuICAgIFwibWlsa2lvOmV4ZWN1dGVFcnJvclwiOiB7XG4gICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICBvcHRpb25zOiBNaXhpbjxFeGVjdXRlT3B0aW9ucywgeyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBiYXNlVXJsOiBzdHJpbmcgfT47XG4gICAgICBlcnJvcjogUGFydGlhbDxHZW5lcmF0ZWRbXCJyZWplY3RDb2RlXCJdPjtcbiAgICAgIGhhbmRsZUVycm9yOiA8SyBleHRlbmRzIGtleW9mIFBhcnRpYWw8R2VuZXJhdGVkW1wicmVqZWN0Q29kZVwiXT4+KGVycm9yOiBhbnksIGtleTogSywgaGFuZGxlcjogKGVycm9yOiBQYXJ0aWFsPEdlbmVyYXRlZFtcInJlamVjdENvZGVcIl1bS10+KSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUVycm9yOiBhbnkgPSBhc3luYyAoZXJyb3I6IGFueSwga2V5OiBzdHJpbmcsIGhhbmRsZXI6IChlcnJvcjogYW55KSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPikgPT4ge1xuICAgIGlmIChrZXkgaW4gZXJyb3IpIHtcbiAgICAgIGNvbnN0IGhhbmRsZWQgPSBhd2FpdCBoYW5kbGVyKGVycm9yW2tleV0pO1xuICAgICAgaWYgKGhhbmRsZWQpIGRlbGV0ZSBlcnJvcltrZXldO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBfX2luaXRFdmVudE1hbmFnZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSBuZXcgTWFwPChldmVudDogYW55KSA9PiB2b2lkLCBzdHJpbmc+KCk7XG4gICAgY29uc3QgaW5kZXhlZCA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8KGV2ZW50OiBhbnkpID0+IHZvaWQ+PigpO1xuXG4gICAgY29uc3QgZXZlbnRNYW5hZ2VyID0ge1xuICAgICAgb246IDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgSGFuZGxlciBleHRlbmRzIChldmVudDogU3RhcmdhdGVFdmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgaGFuZGxlcnMuc2V0KGhhbmRsZXIsIGtleSBhcyBzdHJpbmcpO1xuICAgICAgICBpZiAoaW5kZXhlZC5oYXMoa2V5IGFzIHN0cmluZykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgaW5kZXhlZC5zZXQoa2V5IGFzIHN0cmluZywgbmV3IFNldCgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKSE7XG4gICAgICAgIHNldC5hZGQoaGFuZGxlcik7XG4gICAgICAgIGhhbmRsZXJzLnNldChoYW5kbGVyLCBrZXkgYXMgc3RyaW5nKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIG9mZjogPEtleSBleHRlbmRzIGtleW9mIFN0YXJnYXRlRXZlbnRzLCBIYW5kbGVyIGV4dGVuZHMgKGV2ZW50OiBTdGFyZ2F0ZUV2ZW50c1tLZXldKSA9PiB2b2lkPihrZXk6IEtleSwgaGFuZGxlcjogSGFuZGxlcikgPT4ge1xuICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgaWYgKCFzZXQpIHJldHVybjtcbiAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgfSxcbiAgICAgIGVtaXQ6IGFzeW5jIDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgVmFsdWUgZXh0ZW5kcyBTdGFyZ2F0ZUV2ZW50c1tLZXldPihrZXk6IEtleSwgdmFsdWU6IFZhbHVlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGNvbnN0IGggPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgaWYgKGgpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaCkge1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gZXZlbnRNYW5hZ2VyO1xuICB9O1xuXG4gIGNvbnN0IGV2ZW50TWFuYWdlciA9IF9faW5pdEV2ZW50TWFuYWdlcigpO1xuXG4gIGNvbnN0IGJvb3RzdHJhcCA9IGFzeW5jICgpID0+IHtcbiAgICBsZXQgYmFzZVVybCA9IHN0YXJnYXRlT3B0aW9ucy5iYXNlVXJsO1xuICAgIGlmICh0eXBlb2YgYmFzZVVybCA9PT0gXCJmdW5jdGlvblwiKSBiYXNlVXJsID0gYXdhaXQgYmFzZVVybCgpO1xuICAgIGlmIChiYXNlVXJsLmVuZHNXaXRoKFwiL1wiKSkgYmFzZVVybCA9IGJhc2VVcmwuc2xpY2UoMCwgLTEpO1xuXG4gICAgcmV0dXJuIGJhc2VVcmw7XG4gIH07XG5cbiAgY29uc3QgYmFzZVVybDogUHJvbWlzZTxzdHJpbmc+ID0gYm9vdHN0cmFwKCk7XG5cbiAgY29uc3Qgc3RhcmdhdGUgPSB7XG4gICAgLi4uZXZlbnRNYW5hZ2VyLFxuICAgICR0eXBlczoge1xuICAgICAgZ2VuZXJhdGVkOiB2b2lkIDAgYXMgdW5rbm93biBhcyBHZW5lcmF0ZWQsXG4gICAgfSxcbiAgICBvcHRpb25zOiBzdGFyZ2F0ZU9wdGlvbnMsXG4gICAgYXN5bmMgZXhlY3V0ZTxQYXRoIGV4dGVuZHMga2V5b2YgR2VuZXJhdGVkW1wicm91dGVTY2hlbWFcIl0+KFxuICAgICAgcGF0aDogUGF0aCxcbiAgICAgIG9wdGlvbnM/OiBNaXhpbjxcbiAgICAgICAgRXhlY3V0ZU9wdGlvbnMsXG4gICAgICAgIHtcbiAgICAgICAgICBwYXJhbXM/OiBHZW5lcmF0ZWRbXCJyb3V0ZVNjaGVtYVwiXVtQYXRoXVtcInR5cGVzXCJdW1wicGFyYW1zXCJdO1xuICAgICAgICB9XG4gICAgICA+LFxuICAgICk6IFByb21pc2U8XG4gICAgICBHZW5lcmF0ZWRbXCJyb3V0ZVNjaGVtYVwiXVtQYXRoXVtcInR5cGVzXCJdW1wi8J+lm1wiXSBleHRlbmRzIGJvb2xlYW5cbiAgICAgICAgPyAvLyBhY3Rpb25cbiAgICAgICAgICBbUGFydGlhbDxHZW5lcmF0ZWRbXCJyZWplY3RDb2RlXCJdPiwgbnVsbCwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dIHwgW251bGwsIEdlbmVyYXRlZFtcInJvdXRlU2NoZW1hXCJdW1BhdGhdW1widHlwZXNcIl1bXCJyZXN1bHRcIl0sIEV4ZWN1dGVSZXN1bHRzT3B0aW9uXVxuICAgICAgICA6IC8vIHN0cmVhbVxuICAgICAgICAgIFtQYXJ0aWFsPEdlbmVyYXRlZFtcInJlamVjdENvZGVcIl0+LCBudWxsLCBFeGVjdXRlUmVzdWx0c09wdGlvbl0gfCBbbnVsbCwgQXN5bmNHZW5lcmF0b3I8W1BhcnRpYWw8R2VuZXJhdGVkW1wicmVqZWN0Q29kZVwiXT4sIG51bGxdIHwgW251bGwsIEdlbmVyYXRvckdlbmVyaWM8R2VuZXJhdGVkW1wicm91dGVTY2hlbWFcIl1bUGF0aF1bXCJ0eXBlc1wiXVtcInJlc3VsdFwiXT5dLCB1bmRlZmluZWQ+LCBFeGVjdXRlUmVzdWx0c09wdGlvbl1cbiAgICA+IHtcbiAgICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuICAgICAgaWYgKG9wdGlvbnMuaGVhZGVycyA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnMgPSB7fTtcblxuICAgICAgbGV0IHVybDogc3RyaW5nO1xuICAgICAgaWYgKG9wdGlvbnMuYmFzZVVybCkge1xuICAgICAgICBsZXQgYmFzZVVybCA9IG9wdGlvbnMuYmFzZVVybDtcbiAgICAgICAgaWYgKHR5cGVvZiBiYXNlVXJsID09PSBcImZ1bmN0aW9uXCIpIGJhc2VVcmwgPSBhd2FpdCBiYXNlVXJsKCk7XG4gICAgICAgIGlmIChiYXNlVXJsLmVuZHNXaXRoKFwiL1wiKSkgYmFzZVVybCA9IGJhc2VVcmwuc2xpY2UoMCwgLTEpO1xuICAgICAgICB1cmwgPSBiYXNlVXJsICsgKHBhdGggYXMgc3RyaW5nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVybCA9IChhd2FpdCBiYXNlVXJsKSArIChwYXRoIGFzIHN0cmluZyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLnR5cGUgIT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgLy8gYWN0aW9uXG4gICAgICAgIGlmIChvcHRpb25zLmhlYWRlcnMuQWNjZXB0ID09PSB1bmRlZmluZWQpIG9wdGlvbnMuaGVhZGVycy5BY2NlcHQgPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgaWYgKG9wdGlvbnMuaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICAgICAgbGV0IHJlc3VsdDogeyB2YWx1ZTogUmVjb3JkPGFueSwgYW55PiB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoXCJtaWxraW86ZXhlY3V0ZUJlZm9yZVwiLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSB9KTtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLnBhcmFtcykgPz8gXCJcIjtcbiAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdChcIm1pbGtpbzpmZXRjaEJlZm9yZVwiLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgYm9keSB9KTtcblxuICAgICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3luY1Byb21pc2VFeGVjdXRvcjogPGV4cGxhbmF0aW9uPlxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dCA/PyBvcHRpb25zPy50aW1lb3V0ID8/IDYwMDA7XG4gICAgICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoW3sgUkVRVUVTVF9USU1FT1VUOiB7IHRpbWVvdXQsIG1lc3NhZ2U6IGBFeGVjdXRlIHRpbWVvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zLmAgfSB9LCBudWxsXSk7XG4gICAgICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCAoYXdhaXQgJGZldGNoKHVybCwgeyBtZXRob2Q6IFwiUE9TVFwiLCBib2R5LCBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnMgfSkpLnRleHQoKTtcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlc3VsdCA9IHsgdmFsdWU6IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKHJlc3BvbnNlKSkgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgIGlmIChlcnJvcj8uWzBdPy5SRVFVRVNUX1RJTUVPVVQpIHtcbiAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KFwibWlsa2lvOmV4ZWN1dGVFcnJvclwiLCB7IGhhbmRsZUVycm9yLCBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGVycm9yIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBlcnJvclBpbmVkID0geyBSRVFVRVNUX0ZBSUw6IGVycm9yIH07XG4gICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoXCJtaWxraW86ZXhlY3V0ZUVycm9yXCIsIHsgaGFuZGxlRXJyb3IsIHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgZXJyb3I6IGVycm9yUGluZWQgfSk7XG4gICAgICAgICAgcmV0dXJuIFtlcnJvclBpbmVkLCBudWxsLCB7IGV4ZWN1dGVJZDogXCJ1bmtub3duXCIgfV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC52YWx1ZS5zdWNjZXNzICE9PSB0cnVlKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3I6IGFueSA9IHt9O1xuICAgICAgICAgIGVycm9yW3Jlc3VsdC52YWx1ZS5jb2RlXSA9IHJlc3VsdC52YWx1ZS5yZWplY3QgPz8gbnVsbDtcbiAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdChcIm1pbGtpbzpleGVjdXRlRXJyb3JcIiwgeyBoYW5kbGVFcnJvciwgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBlcnJvciB9KTtcbiAgICAgICAgICByZXR1cm4gW2Vycm9yLCBudWxsLCB7IGV4ZWN1dGVJZDogXCJ1bmtub3duXCIgfV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdC52YWx1ZS5kYXRhLCB7IGV4ZWN1dGVJZDogcmVzdWx0LnZhbHVlLmV4ZWN1dGVJZCB9XSBhcyBhbnk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzdHJlYW1cbiAgICAgICAgaWYgKG9wdGlvbnMuaGVhZGVycy5BY2NlcHQgPT09IHVuZGVmaW5lZCkgb3B0aW9ucy5oZWFkZXJzLkFjY2VwdCA9IFwidGV4dC9ldmVudC1zdHJlYW1cIjtcbiAgICAgICAgaWYgKG9wdGlvbnMuaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcblxuICAgICAgICBjb25zdCBzdGFja3M6IE1hcDxcbiAgICAgICAgICBudW1iZXIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZG9uZTogYm9vbGVhbjtcbiAgICAgICAgICAgIHByb21pc2U6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8YW55Pj47XG4gICAgICAgICAgICByZXNvbHZlOiAodmFsdWU6IEl0ZXJhdG9yUmVzdWx0PGFueT4pID0+IHZvaWQ7XG4gICAgICAgICAgICByZWplY3Q6IChyZWFzb246IGFueSkgPT4gdm9pZDtcbiAgICAgICAgICB9XG4gICAgICAgID4gPSBuZXcgTWFwKCk7XG4gICAgICAgIGxldCBzdGFja3NJbmRleCA9IDA7XG4gICAgICAgIGxldCBpdGVyYXRvckluZGV4ID0gMDtcbiAgICAgICAgbGV0IHN0cmVhbVJlc3VsdDogYW55O1xuICAgICAgICBjb25zdCBzdHJlYW1SZXN1bHRGZXRjaGVkID0gd2l0aFJlc29sdmVyczx1bmRlZmluZWQ+KCk7XG5cbiAgICAgICAgY29uc3QgdGltZW91dCA9IHN0YXJnYXRlT3B0aW9ucz8udGltZW91dCA/PyBvcHRpb25zPy50aW1lb3V0ID8/IDYwMDA7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgc3RyZWFtUmVzdWx0RmV0Y2hlZC5yZWplY3QoW3sgUkVRVUVTVF9USU1FT1VUOiB7IHRpbWVvdXQsIG1lc3NhZ2U6IGBFeGVjdXRlIHRpbWVvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zLmAgfSB9LCBudWxsLCB7IGV4ZWN1dGVJZDogXCJ1bmtub3duXCIgfV0pO1xuICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICBjb25zdCBvbm1lc3NhZ2UgPSAoZXZlbnQ6IEV2ZW50U291cmNlTWVzc2FnZSkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC5kYXRhLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBzdHJlYW1SZXN1bHQgPSByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhLnNsaWNlKDEpKSk7XG4gICAgICAgICAgICAgIHN0cmVhbVJlc3VsdEZldGNoZWQucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0RmV0Y2hlZC5yZWplY3QoW3sgUkVRVUVTVF9GQUlMOiBlcnJvciB9LCBudWxsLCB7IGV4ZWN1dGVJZDogXCJ1bmtub3duXCIgfV0pO1xuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9ICsrc3RhY2tzSW5kZXg7XG4gICAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCkpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBzdGFja3MuZ2V0KGluZGV4KTtcbiAgICAgICAgICAgICAgc3RhY2shLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICBzdGFjayEucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWU6IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGV2ZW50LmRhdGEpKSB9KTtcbiAgICAgICAgICAgICAgc3RhY2tzLnNldChpbmRleCwgeyAuLi5zdGFjaywgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBjdXJSZXF1ZXN0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuXG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgICAgICBjdXJSZXF1ZXN0Q29udHJvbGxlciA9IG5ldyAkYWJvcnQoKTtcbiAgICAgICAgICBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsICgpID0+IHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdChcIm1pbGtpbzpleGVjdXRlQmVmb3JlXCIsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55IH0pO1xuXG4gICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucyEucGFyYW1zKSA/PyBcIlwiO1xuICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoXCJtaWxraW86ZmV0Y2hCZWZvcmVcIiwgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGJvZHkgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKHVybCwge1xuICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICBoZWFkZXJzOiBvcHRpb25zIS5oZWFkZXJzLFxuICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICBzaWduYWw6IGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiQ29udGVudC1UeXBlXCIpO1xuICAgICAgICAgICAgaWYgKCFjb250ZW50VHlwZT8uc3RhcnRzV2l0aChcInRleHQvZXZlbnQtc3RyZWFtXCIpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgY29udGVudC10eXBlIHRvIGJlICR7XCJ0ZXh0L2V2ZW50LXN0cmVhbVwifSwgQWN0dWFsOiAke2NvbnRlbnRUeXBlfWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCBnZXRCeXRlcyhyZXNwb25zZS5ib2R5ISwgZ2V0TGluZXMoZ2V0TWVzc2FnZXMob25tZXNzYWdlKSkpO1xuXG4gICAgICAgICAgICBhd2FpdCBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHsgUkVRVUVTVF9GQUlMOiBlcnIgfTtcbiAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KFwibWlsa2lvOmV4ZWN1dGVFcnJvclwiLCB7IGhhbmRsZUVycm9yLCBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGVycm9yIH0pO1xuICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3IudGhyb3coZXJyKTtcbiAgICAgICAgICAgIHN0cmVhbVJlc3VsdEZldGNoZWQucmVqZWN0KFtlcnJvciwgbnVsbCwgeyBleGVjdXRlSWQ6IFwidW5rbm93blwiIH1dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2b2lkIGNyZWF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgIC4uLih7XG4gICAgICAgICAgICBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dW5rbm93bj4+IHtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSArK2l0ZXJhdG9ySW5kZXg7XG4gICAgICAgICAgICAgIGlmIChzdGFja3MuaGFzKGluZGV4IC0gMikpIHN0YWNrcy5kZWxldGUoaW5kZXggLSAyKTtcbiAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiAhY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICBzdGFja3Muc2V0KGluZGV4LCB7IC4uLnN0YWNrLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucHJvbWlzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIXN0YWNrcy5oYXMoaW5kZXgpICYmIGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnByb21pc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrcy5nZXQoaW5kZXgpIS5wcm9taXNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFzeW5jIHJldHVybigpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XG4gICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgdGhyb3coZXJyOiBhbnkpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XG4gICAgICAgICAgICAgIHN0cmVhbVJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBleGVjdXRlSWQ6IHN0cmVhbVJlc3VsdD8uZXhlY3V0ZUlkID8/IFwiXCIsXG4gICAgICAgICAgICAgICAgZmFpbDoge1xuICAgICAgICAgICAgICAgICAgY29kZTogXCJORVRXT1JLX0VSUk9SXCIsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIk5ldHdvcmsgRXJyb3JcIixcbiAgICAgICAgICAgICAgICAgIGZyb21DbGllbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICBkYXRhOiBlcnIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBbX2luZGV4LCBzdGFja10gb2Ygc3RhY2tzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YWNrLmRvbmUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHN0YWNrLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gc2F0aXNmaWVzIEFzeW5jSXRlcmF0b3I8dW5rbm93bj4pLFxuICAgICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgc3RyZWFtUmVzdWx0RmV0Y2hlZC5wcm9taXNlO1xuICAgICAgICAgIHJldHVybiBbbnVsbCwgaXRlcmF0b3IsIHsgZXhlY3V0ZUlkOiBzdHJlYW1SZXN1bHQuZXhlY3V0ZUlkIH1dIGFzIGFueTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3IgYXMgYW55O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBfX2Nvb2tib29rOiB7XG4gICAgICBzdWJzY3JpYmU6IGFzeW5jIChiYXNlVXJsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICBBY2NlcHQ6IFwidGV4dC9ldmVudC1zdHJlYW1cIixcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge307XG5cbiAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcykgPz8gXCJcIjtcbiAgICAgICAgY29uc3Qgc3RhY2tzOiBNYXA8XG4gICAgICAgICAgbnVtYmVyLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRvbmU6IGJvb2xlYW47XG4gICAgICAgICAgICBwcm9taXNlOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PGFueT4+O1xuICAgICAgICAgICAgcmVzb2x2ZTogKHZhbHVlOiBJdGVyYXRvclJlc3VsdDxhbnk+KSA9PiB2b2lkO1xuICAgICAgICAgICAgcmVqZWN0OiAocmVhc29uOiBhbnkpID0+IHZvaWQ7XG4gICAgICAgICAgfVxuICAgICAgICA+ID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgc3RhY2tzSW5kZXggPSAwO1xuICAgICAgICBsZXQgaXRlcmF0b3JJbmRleCA9IDA7XG5cbiAgICAgICAgY29uc3Qgb25tZXNzYWdlID0gKGV2ZW50OiBFdmVudFNvdXJjZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9ICsrc3RhY2tzSW5kZXg7XG4gICAgICAgICAgaWYgKHN0YWNrcy5oYXMoaW5kZXgpKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFjayA9IHN0YWNrcy5nZXQoaW5kZXgpO1xuICAgICAgICAgICAgc3RhY2shLnJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWU6IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGV2ZW50LmRhdGEpKSB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICBzdGFjay5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhKSkgfSk7XG4gICAgICAgICAgICBzdGFja3Muc2V0KGluZGV4LCB7IC4uLnN0YWNrLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGN1clJlcXVlc3RDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyID0gbmV3ICRhYm9ydCgpO1xuICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4ge1xuICAgICAgICAgICAgaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKGAke2Jhc2VVcmx9LyRzdWJzY3JpYmVgLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgIHNpZ25hbDogY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIik7XG4gICAgICAgICAgICBpZiAoIWNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKFwidGV4dC9ldmVudC1zdHJlYW1cIikpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBjb250ZW50LXR5cGUgdG8gYmUgJHtcInRleHQvZXZlbnQtc3RyZWFtXCJ9LCBBY3R1YWw6ICR7Y29udGVudFR5cGV9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IGdldEJ5dGVzKHJlc3BvbnNlLmJvZHkhLCBnZXRMaW5lcyhnZXRNZXNzYWdlcyhvbm1lc3NhZ2UpKSk7XG5cbiAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLnRocm93KGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdm9pZCBjcmVhdGUoKTtcblxuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAuLi4oe1xuICAgICAgICAgICAgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHVua25vd24+PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gKytpdGVyYXRvckluZGV4O1xuICAgICAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCAtIDIpKSBzdGFja3MuZGVsZXRlKGluZGV4IC0gMik7XG4gICAgICAgICAgICAgIGlmICghc3RhY2tzLmhhcyhpbmRleCkgJiYgIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgc3RhY2tzLnNldChpbmRleCwgeyAuLi5zdGFjaywgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnByb21pc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBzdGFja3MuZ2V0KGluZGV4KSEucHJvbWlzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBpdGVyYXRvcl0gb2Ygc3RhY2tzKSBpdGVyYXRvci5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFzeW5jIHRocm93KGVycjogYW55KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBpdGVyYXRvcl0gb2Ygc3RhY2tzKSBpdGVyYXRvci5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IHNhdGlzZmllcyBBc3luY0l0ZXJhdG9yPHVua25vd24+KSxcbiAgICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3IgYXMgYW55O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gICAgYXN5bmMgcGluZyhvcHRpb25zPzogeyB0aW1lb3V0PzogbnVtYmVyIH0pOiBQcm9taXNlPFBpbmc+IHtcbiAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3luY1Byb21pc2VFeGVjdXRvcjogPGV4cGxhbmF0aW9uPlxuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPFBpbmc+KGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke2F3YWl0IGJhc2VVcmx9L2dlbmVyYXRlXzIwNGA7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzdGFyZ2F0ZU9wdGlvbnM/LnRpbWVvdXQgPz8gb3B0aW9ucz8udGltZW91dCA/PyA2MDAwO1xuICAgICAgICBjb25zdCBzdGFydHNUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBlbmRzVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgcmVzb2x2ZShbeyBjb25uZWN0OiBmYWxzZSwgZGVsYXk6IGVuZHNUaW1lIC0gc3RhcnRzVGltZSwgZXJyb3I6IHsgUkVRVUVTVF9USU1FT1VUOiB7IHRpbWVvdXQsIG1lc3NhZ2U6IGBFeGVjdXRlIHRpbWVvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zLmAgfSB9IH0sIG51bGxdKTtcbiAgICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF3YWl0ICRmZXRjaCh1cmwsIHsgbWV0aG9kOiBcIkhFQURcIiB9KTtcbiAgICAgICAgICBjb25zdCBlbmRzVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJlc29sdmUoW3sgY29ubmVjdDogZmFsc2UsIGRlbGF5OiBlbmRzVGltZSAtIHN0YXJ0c1RpbWUsIGVycm9yOiB7IFJFUVVFU1RfRkFJTDogeyByZXNwb25zZSwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIG1lc3NhZ2U6IFwiU3RhdHVzIGNvZGUgbm90IDIwNFwiIH0gfSB9LCBudWxsXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZShbbnVsbCwgeyBjb25uZWN0OiB0cnVlLCBkZWxheTogZW5kc1RpbWUgLSBzdGFydHNUaW1lLCBzZXJ2ZXJUaW1lc3RhbXA6IE51bWJlcihyZXNwb25zZS5oZWFkZXJzLmdldChcIkNvbnRlbnQtVHlwZVwiKSEuc3Vic3RyaW5nKDE3KSkgfV0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgY29uc3QgZW5kc1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIHJldHVybiBbeyBjb25uZWN0OiBmYWxzZSwgZGVsYXk6IGVuZHNUaW1lIC0gc3RhcnRzVGltZSwgZXJyb3IgfSwgbnVsbF07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIHN0YXJnYXRlO1xufVxuXG5mdW5jdGlvbiByZXZpdmVKU09OUGFyc2U8VD4oanNvbjogVCk6IFQge1xuICBjb25zdCBpc29EYXRlUGF0dGVybiA9IC9eKFxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkezEsM30pPykoWnxbKy1dXFxkezJ9Oj9cXGR7Mn0pPyQvO1xuXG4gIGlmIChqc29uIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGpzb247XG4gIGlmIChBcnJheS5pc0FycmF5KGpzb24pKSB7XG4gICAgcmV0dXJuIGpzb24ubWFwKChpdGVtKSA9PiByZXZpdmVKU09OUGFyc2UoaXRlbSkpIGFzIGFueTtcbiAgfVxuICBpZiAodHlwZW9mIGpzb24gPT09IFwib2JqZWN0XCIgJiYganNvbiAhPT0gbnVsbCkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhqc29uKS5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBhY2Nba2V5IGFzIGtleW9mIFRdID0gcmV2aXZlSlNPTlBhcnNlKHZhbHVlKTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgVCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBqc29uID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBqc29uLm1hdGNoKGlzb0RhdGVQYXR0ZXJuKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRlU3RyaW5nID0gbWF0Y2hbMl0gPyBgJHttYXRjaFsxXX0ke21hdGNoWzJdLnJlcGxhY2UoXCI6XCIsIFwiXCIpfWAgOiBgJHttYXRjaFsxXX1aYDtcbiAgICAgIHJldHVybiBuZXcgRGF0ZShub3JtYWxpemVkRGF0ZVN0cmluZykgYXMgYW55O1xuICAgIH1cbiAgfVxuICByZXR1cm4ganNvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRlU3RyZWFtT3B0aW9ucyB7XG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwaVNjaGVtYUV4dGVuZCB7XG4gIGFwaVZhbGlkYXRvcjoge1xuICAgIGdlbmVyYXRlZEF0OiBudW1iZXI7XG4gICAgdmFsaWRhdGU6IFJlY29yZDxhbnksIGFueT47XG4gIH07XG4gIGFwaU1ldGhvZHNTY2hlbWE6IFJlY29yZDxhbnksIGFueT47XG4gIGFwaU1ldGhvZHNUeXBlU2NoZW1hOiBSZWNvcmQ8YW55LCBhbnk+O1xuICBhcGlUZXN0c1NjaGVtYTogUmVjb3JkPGFueSwgYW55Pjtcbn1cblxuZXhwb3J0IHR5cGUgRmFpbENvZGVFeHRlbmQgPSBSZWNvcmQ8YW55LCAoLi4uYXJnczogQXJyYXk8YW55PikgPT4gYW55PjtcblxuZXhwb3J0IHR5cGUgQm9vdHN0cmFwTWlkZGxld2FyZSA9IChkYXRhOiB7IHN0b3JhZ2U6IENsaWVudFN0b3JhZ2UgfSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5leHBvcnQgdHlwZSBCZWZvcmVFeGVjdXRlTWlkZGxld2FyZSA9IChkYXRhOiB7IHBhdGg6IHN0cmluZzsgcGFyYW1zOiBhbnk7IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IHN0b3JhZ2U6IENsaWVudFN0b3JhZ2UgfSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5leHBvcnQgdHlwZSBBZnRlckV4ZWN1dGVNaWRkbGV3YXJlID0gKGRhdGE6IHsgcGF0aDogc3RyaW5nOyByZXN1bHQ6IHsgdmFsdWU6IGFueSB9OyBzdG9yYWdlOiBDbGllbnRTdG9yYWdlIH0pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1pZGRsZXdhcmVPcHRpb25zIHtcbiAgYm9vdHN0cmFwPzogQm9vdHN0cmFwTWlkZGxld2FyZTtcbiAgYmVmb3JlRXhlY3V0ZT86IEJlZm9yZUV4ZWN1dGVNaWRkbGV3YXJlO1xuICBhZnRlckV4ZWN1dGU/OiBBZnRlckV4ZWN1dGVNaWRkbGV3YXJlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFN0b3JhZ2Uge1xuICBnZXRJdGVtOiAoa2V5OiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIHNldEl0ZW06IChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmVtb3ZlSXRlbTogKGtleTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGVSZXN1bHRTdWNjZXNzPFJlc3VsdD4ge1xuICBleGVjdXRlSWQ6IHN0cmluZztcbiAgc3VjY2VzczogdHJ1ZTtcbiAgZGF0YTogUmVzdWx0O1xufVxuXG5leHBvcnQgdHlwZSBHZW5lcmF0b3JHZW5lcmljPFQ+ID0gVCBleHRlbmRzIEFzeW5jR2VuZXJhdG9yPGluZmVyIEk+ID8gSSA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBGbGF0dGVuS2V5czxULCBQcmVmaXggZXh0ZW5kcyBzdHJpbmcgPSBcIlwiPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBvYmplY3QgPyBGbGF0dGVuS2V5czxUW0tdLCBgJHtQcmVmaXh9JHtFeGNsdWRlPEssIHN5bWJvbD59LmA+IDogYCRpbnB1dC4ke1ByZWZpeH0ke0V4Y2x1ZGU8Sywgc3ltYm9sPn1gO1xufVtrZXlvZiBUXTtcblxuLy8gKioqIFRoaXMgcGFydCBvZiB0aGUgY29kZSBpcyBiYXNlZCBvbiBgQG1pY3Jvc29mdC9mZXRjaC1ldmVudC1zb3VyY2VgIHJld3JpdGUsIHRoYW5rcyB0byB0aGUgd29yayBvZiBNaWNyb3NvZnQgKioqIC8vXG4vLyAqKiogaHR0cHM6Ly9naXRodWIuY29tL0F6dXJlL2ZldGNoLWV2ZW50LXNvdXJjZS9ibG9iL21haW4vc3JjL3BhcnNlLnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiogLy9cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbWVzc2FnZSBzZW50IGluIGFuIGV2ZW50IHN0cmVhbVxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZlci1zZW50X2V2ZW50cy9Vc2luZ19zZXJ2ZXItc2VudF9ldmVudHMjRXZlbnRfc3RyZWFtX2Zvcm1hdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50U291cmNlTWVzc2FnZSB7XG4gIGRhdGE6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIFJlYWRhYmxlU3RyZWFtIGludG8gYSBjYWxsYmFjayBwYXR0ZXJuLlxuICogQHBhcmFtIHN0cmVhbSBUaGUgaW5wdXQgUmVhZGFibGVTdHJlYW0uXG4gKiBAcGFyYW0gb25DaHVuayBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBuZXcgYnl0ZSBjaHVuayBpbiB0aGUgc3RyZWFtLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgc3RyZWFtIGNsb3Nlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ5dGVzKHN0cmVhbTogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4sIG9uQ2h1bms6IChhcnI6IFVpbnQ4QXJyYXkpID0+IHZvaWQpIHtcbiAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICBsZXQgcmVzdWx0OiBSZWFkYWJsZVN0cmVhbVJlYWRSZXN1bHQ8VWludDhBcnJheT47XG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiA8ZXhwbGFuYXRpb24+XG4gIHdoaWxlICghKHJlc3VsdCA9IGF3YWl0IHJlYWRlci5yZWFkKCkpLmRvbmUpIHtcbiAgICBvbkNodW5rKHJlc3VsdC52YWx1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgYXJiaXRhcnkgYnl0ZSBjaHVua3MgaW50byBFdmVudFNvdXJjZSBsaW5lIGJ1ZmZlcnMuXG4gKiBFYWNoIGxpbmUgc2hvdWxkIGJlIG9mIHRoZSBmb3JtYXQgXCJmaWVsZDogdmFsdWVcIiBhbmQgZW5kcyB3aXRoIFxcciwgXFxuLCBvciBcXHJcXG4uXG4gKiBAcGFyYW0gb25MaW5lIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIG5ldyBFdmVudFNvdXJjZSBsaW5lLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgZm9yIGVhY2ggaW5jb21pbmcgYnl0ZSBjaHVuay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpbmVzKG9uTGluZTogKGxpbmU6IFVpbnQ4QXJyYXksIGZpZWxkTGVuZ3RoOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgbGV0IGJ1ZmZlcjogVWludDhBcnJheSB8IHVuZGVmaW5lZDtcbiAgbGV0IHBvc2l0aW9uOiBudW1iZXI7IC8vIGN1cnJlbnQgcmVhZCBwb3NpdGlvblxuICBsZXQgZmllbGRMZW5ndGg6IG51bWJlcjsgLy8gbGVuZ3RoIG9mIHRoZSBgZmllbGRgIHBvcnRpb24gb2YgdGhlIGxpbmVcbiAgbGV0IGRpc2NhcmRUcmFpbGluZ05ld2xpbmUgPSBmYWxzZTtcblxuICAvLyByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNhbiBwcm9jZXNzIGVhY2ggaW5jb21pbmcgYnl0ZSBjaHVuazpcbiAgcmV0dXJuIGZ1bmN0aW9uIG9uQ2h1bmsoYXJyOiBVaW50OEFycmF5KSB7XG4gICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBidWZmZXIgPSBhcnI7XG4gICAgICBwb3NpdGlvbiA9IDA7XG4gICAgICBmaWVsZExlbmd0aCA9IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB3ZSdyZSBzdGlsbCBwYXJzaW5nIHRoZSBvbGQgbGluZS4gQXBwZW5kIHRoZSBuZXcgYnl0ZXMgaW50byBidWZmZXI6XG4gICAgICBidWZmZXIgPSBjb25jYXQoYnVmZmVyLCBhcnIpO1xuICAgIH1cblxuICAgIGNvbnN0IGJ1Zkxlbmd0aCA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgbGV0IGxpbmVTdGFydCA9IDA7IC8vIGluZGV4IHdoZXJlIHRoZSBjdXJyZW50IGxpbmUgc3RhcnRzXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgYnVmTGVuZ3RoKSB7XG4gICAgICBpZiAoZGlzY2FyZFRyYWlsaW5nTmV3bGluZSkge1xuICAgICAgICBpZiAoYnVmZmVyW3Bvc2l0aW9uXSA9PT0gMTApIHtcbiAgICAgICAgICBsaW5lU3RhcnQgPSArK3Bvc2l0aW9uOyAvLyBza2lwIHRvIG5leHQgY2hhclxuICAgICAgICB9XG5cbiAgICAgICAgZGlzY2FyZFRyYWlsaW5nTmV3bGluZSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBzdGFydCBsb29raW5nIGZvcndhcmQgdGlsbCB0aGUgZW5kIG9mIGxpbmU6XG4gICAgICBsZXQgbGluZUVuZCA9IC0xOyAvLyBpbmRleCBvZiB0aGUgXFxyIG9yIFxcbiBjaGFyXG4gICAgICBmb3IgKDsgcG9zaXRpb24gPCBidWZMZW5ndGggJiYgbGluZUVuZCA9PT0gLTE7ICsrcG9zaXRpb24pIHtcbiAgICAgICAgc3dpdGNoIChidWZmZXJbcG9zaXRpb25dKSB7XG4gICAgICAgICAgY2FzZSA1ODpcbiAgICAgICAgICAgIGlmIChmaWVsZExlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgLy8gZmlyc3QgY29sb24gaW4gbGluZVxuICAgICAgICAgICAgICBmaWVsZExlbmd0aCA9IHBvc2l0aW9uIC0gbGluZVN0YXJ0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0ZhbGx0aHJvdWdoU3dpdGNoQ2xhdXNlOiA8ZXhwbGFuYXRpb24+XG4gICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgIGRpc2NhcmRUcmFpbGluZ05ld2xpbmUgPSB0cnVlO1xuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICBsaW5lRW5kID0gcG9zaXRpb247XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobGluZUVuZCA9PT0gLTEpIHtcbiAgICAgICAgLy8gV2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgYnV0IHRoZSBsaW5lIGhhc24ndCBlbmRlZC5cbiAgICAgICAgLy8gV2FpdCBmb3IgdGhlIG5leHQgYXJyIGFuZCB0aGVuIGNvbnRpbnVlIHBhcnNpbmc6XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyB3ZSd2ZSByZWFjaGVkIHRoZSBsaW5lIGVuZCwgc2VuZCBpdCBvdXQ6XG4gICAgICBvbkxpbmUoYnVmZmVyLnN1YmFycmF5KGxpbmVTdGFydCwgbGluZUVuZCksIGZpZWxkTGVuZ3RoKTtcbiAgICAgIGxpbmVTdGFydCA9IHBvc2l0aW9uOyAvLyB3ZSdyZSBub3cgb24gdGhlIG5leHQgbGluZVxuICAgICAgZmllbGRMZW5ndGggPSAtMTtcbiAgICB9XG5cbiAgICBpZiAobGluZVN0YXJ0ID09PSBidWZMZW5ndGgpIHtcbiAgICAgIGJ1ZmZlciA9IHVuZGVmaW5lZDsgLy8gd2UndmUgZmluaXNoZWQgcmVhZGluZyBpdFxuICAgIH0gZWxzZSBpZiAobGluZVN0YXJ0ICE9PSAwKSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgdmlldyBpbnRvIGJ1ZmZlciBiZWdpbm5pbmcgYXQgbGluZVN0YXJ0IHNvIHdlIGRvbid0XG4gICAgICAvLyBuZWVkIHRvIGNvcHkgb3ZlciB0aGUgcHJldmlvdXMgbGluZXMgd2hlbiB3ZSBnZXQgdGhlIG5ldyBhcnI6XG4gICAgICBidWZmZXIgPSBidWZmZXIuc3ViYXJyYXkobGluZVN0YXJ0KTtcbiAgICAgIHBvc2l0aW9uIC09IGxpbmVTdGFydDtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUGFyc2VzIGxpbmUgYnVmZmVycyBpbnRvIEV2ZW50U291cmNlTWVzc2FnZXMuXG4gKiBAcGFyYW0gb25JZCBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBgaWRgIGZpZWxkLlxuICogQHBhcmFtIG9uUmV0cnkgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggYHJldHJ5YCBmaWVsZC5cbiAqIEBwYXJhbSBvbk1lc3NhZ2UgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggbWVzc2FnZS5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIGZvciBlYWNoIGluY29taW5nIGxpbmUgYnVmZmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVzc2FnZXMob25NZXNzYWdlPzogKG1zZzogRXZlbnRTb3VyY2VNZXNzYWdlKSA9PiB2b2lkKSB7XG4gIGxldCBtZXNzYWdlID0gbmV3TWVzc2FnZSgpO1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbiAgLy8gcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4gcHJvY2VzcyBlYWNoIGluY29taW5nIGxpbmUgYnVmZmVyOlxuICByZXR1cm4gZnVuY3Rpb24gb25MaW5lKGxpbmU6IFVpbnQ4QXJyYXksIGZpZWxkTGVuZ3RoOiBudW1iZXIpIHtcbiAgICBpZiAobGluZS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIGVtcHR5IGxpbmUgZGVub3RlcyBlbmQgb2YgbWVzc2FnZS4gVHJpZ2dlciB0aGUgY2FsbGJhY2sgYW5kIHN0YXJ0IGEgbmV3IG1lc3NhZ2U6XG4gICAgICBvbk1lc3NhZ2U/LihtZXNzYWdlKTtcbiAgICAgIG1lc3NhZ2UgPSBuZXdNZXNzYWdlKCk7XG4gICAgfSBlbHNlIGlmIChmaWVsZExlbmd0aCA+IDApIHtcbiAgICAgIC8vIGV4Y2x1ZGUgY29tbWVudHMgYW5kIGxpbmVzIHdpdGggbm8gdmFsdWVzXG4gICAgICAvLyBsaW5lIGlzIG9mIGZvcm1hdCBcIjxmaWVsZD46PHZhbHVlPlwiIG9yIFwiPGZpZWxkPjogPHZhbHVlPlwiXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZXJ2ZXItc2VudC1ldmVudHMuaHRtbCNldmVudC1zdHJlYW0taW50ZXJwcmV0YXRpb25cbiAgICAgIGNvbnN0IGZpZWxkID0gZGVjb2Rlci5kZWNvZGUobGluZS5zdWJhcnJheSgwLCBmaWVsZExlbmd0aCkpO1xuICAgICAgY29uc3QgdmFsdWVPZmZzZXQgPSBmaWVsZExlbmd0aCArIChsaW5lW2ZpZWxkTGVuZ3RoICsgMV0gPT09IDMyID8gMiA6IDEpO1xuICAgICAgY29uc3QgdmFsdWUgPSBkZWNvZGVyLmRlY29kZShsaW5lLnN1YmFycmF5KHZhbHVlT2Zmc2V0KSk7XG5cbiAgICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICAgICAgY2FzZSBcImRhdGFcIjpcbiAgICAgICAgICAvLyBpZiB0aGlzIG1lc3NhZ2UgYWxyZWFkeSBoYXMgZGF0YSwgYXBwZW5kIHRoZSBuZXcgdmFsdWUgdG8gdGhlIG9sZC5cbiAgICAgICAgICAvLyBvdGhlcndpc2UsIGp1c3Qgc2V0IHRvIHRoZSBuZXcgdmFsdWU6XG4gICAgICAgICAgbWVzc2FnZS5kYXRhID0gbWVzc2FnZS5kYXRhID8gYCR7bWVzc2FnZS5kYXRhfVxcbiR7dmFsdWV9YCA6IHZhbHVlOyAvLyBvdGhlcndpc2UsXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb25jYXQoYTogVWludDhBcnJheSwgYjogVWludDhBcnJheSkge1xuICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShhLmxlbmd0aCArIGIubGVuZ3RoKTtcbiAgcmVzLnNldChhKTtcbiAgcmVzLnNldChiLCBhLmxlbmd0aCk7XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIG5ld01lc3NhZ2UoKTogRXZlbnRTb3VyY2VNZXNzYWdlIHtcbiAgcmV0dXJuIHtcbiAgICBkYXRhOiBcIlwiLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFJlc29sdmVyczxUID0gYW55PigpOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XG4gIGxldCByZXNvbHZlOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPltcInJlc29sdmVcIl07XG4gIGxldCByZWplY3Q6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+W1wicmVqZWN0XCJdO1xuICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlcywgcmVqKSA9PiB7XG4gICAgcmVzb2x2ZSA9IHJlcztcbiAgICByZWplY3QgPSByZWo7XG4gIH0pO1xuICByZXR1cm4geyBwcm9taXNlLCByZXNvbHZlOiByZXNvbHZlISwgcmVqZWN0OiByZWplY3QhIH07XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBb0NBLGVBQXNCLGNBQXVFLENBQUMsaUJBQXdDO0FBQUEsRUFDcEksTUFBTSxTQUFTLGdCQUFnQixTQUFTO0FBQUEsRUFDeEMsTUFBTSxTQUFTLGdCQUFnQixTQUFTO0FBQUEsRUFheEMsTUFBTSxjQUFtQixPQUFPLE9BQVksS0FBYSxZQUF3RDtBQUFBLElBQy9HLElBQUksT0FBTyxPQUFPO0FBQUEsTUFDaEIsTUFBTSxVQUFVLE1BQU0sUUFBUSxNQUFNLElBQUk7QUFBQSxNQUN4QyxJQUFJO0FBQUEsUUFBUyxPQUFPLE1BQU07QUFBQSxJQUM1QjtBQUFBO0FBQUEsRUFHRixNQUFNLHFCQUFxQixNQUFNO0FBQUEsSUFDL0IsTUFBTSxXQUFXLElBQUk7QUFBQSxJQUNy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RSxNQUFNLFFBQVEsUUFBUSxPQUFPLEtBQUssU0FBUyxXQUFXLENBQUM7QUFBQSxNQUV2RCxRQUFRO0FBQUEsYUFDRDtBQUFBLFVBR0gsUUFBUSxPQUFPLFFBQVEsT0FBTyxHQUFHLFFBQVE7QUFBQSxFQUFTLFVBQVU7QUFBQSxVQUM1RDtBQUFBO0FBQUEsSUFFTjtBQUFBO0FBQUE7QUFJSixTQUFTLE1BQU0sQ0FBQyxHQUFlLEdBQWU7QUFBQSxFQUM1QyxNQUFNLE1BQU0sSUFBSSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU07QUFBQSxFQUM5QyxJQUFJLElBQUksQ0FBQztBQUFBLEVBQ1QsSUFBSSxJQUFJLEdBQUcsRUFBRSxNQUFNO0FBQUEsRUFDbkIsT0FBTztBQUFBO0FBR1QsU0FBUyxVQUFVLEdBQXVCO0FBQUEsRUFDeEMsT0FBTztBQUFBLElBQ0wsTUFBTTtBQUFBLEVBQ1I7QUFBQTtBQUdLLFNBQVMsYUFBc0IsR0FBNEI7QUFBQSxFQUNoRSxJQUFJO0FBQUEsRUFDSixJQUFJO0FBQUEsRUFDSixNQUFNLFVBQVUsSUFBSSxRQUFXLENBQUMsS0FBSyxRQUFRO0FBQUEsSUFDM0MsVUFBVTtBQUFBLElBQ1YsU0FBUztBQUFBLEdBQ1Y7QUFBQSxFQUNELE9BQU8sRUFBRSxTQUFTLFNBQW1CLE9BQWdCO0FBQUE7IiwKICAiZGVidWdJZCI6ICIyNjY5RjZBMzUyMzdDNDE5NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
662
+ //# debugId=604353D58061DA3E64756E2164756E21
663
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IHR5cGUgTWlsa2lvU3RhcmdhdGVPcHRpb25zID0ge1xuICBiYXNlVXJsOiBzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKSB8ICgoKSA9PiBQcm9taXNlPHN0cmluZz4pO1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICBmZXRjaD86IHR5cGVvZiBmZXRjaDtcbiAgYWJvcnQ/OiB0eXBlb2YgQWJvcnRDb250cm9sbGVyO1xuICBjYWNoZVN0b3JhZ2U/OiBDYWNoZVN0b3JhZ2U7XG4gIGNhY2hlRW5jcnlwdGlvbj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBNaXhpbjxULCBVPiA9IFUgJiBPbWl0PFQsIGtleW9mIFU+O1xuXG5leHBvcnQgdHlwZSBDYWNoZVN0cmF0ZWd5ID0gJ29mZicgfCAnZmFsbGJhY2snIHwgJ3Rocm90dGxlJztcblxuZXhwb3J0IHR5cGUgUmV0cnlTdHJhdGVneSA9IGJvb2xlYW4gfCBudW1iZXI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVTdG9yYWdlIHtcbiAgZ2V0OiAoa2V5OiBzdHJpbmcpID0+IFByb21pc2U8eyBkYXRhOiBhbnk7IHRpbWVzdGFtcDogbnVtYmVyIH0gfCBudWxsPjtcbiAgc2V0OiAoa2V5OiBzdHJpbmcsIGRhdGE6IGFueSkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IHR5cGUgRXhlY3V0ZU9wdGlvbnM8VCBleHRlbmRzIGFueT4gPSB7XG4gIHBhcmFtcz86IFJlY29yZDxhbnksIGFueT47XG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICBiYXNlVXJsPzogc3RyaW5nIHwgKCgpID0+IHN0cmluZykgfCAoKCkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgY2FjaGVTdHJhdGVneT86IENhY2hlU3RyYXRlZ3k7XG4gIGNhY2hlVGhyb3R0bGVNcz86IG51bWJlcjtcbiAgb25DYWNoZUhpdD86IChyZXN1bHQ6IFQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICByZXRyeVN0cmF0ZWd5PzogUmV0cnlTdHJhdGVneTtcbn07XG5cbmV4cG9ydCB0eXBlIEV4ZWN1dGVSZXN1bHRzT3B0aW9uID0geyBleGVjdXRlSWQ6IHN0cmluZyB9O1xuXG5leHBvcnQgdHlwZSBQaW5nID1cbiAgfCBbXG4gICAgICB7XG4gICAgICAgIGNvbm5lY3Q6IGZhbHNlO1xuICAgICAgICBkZWxheTogbnVtYmVyO1xuICAgICAgICBlcnJvcjogYW55O1xuICAgICAgfSxcbiAgICAgIG51bGwsXG4gICAgXVxuICB8IFtcbiAgICAgIG51bGwsXG4gICAgICB7XG4gICAgICAgIGNvbm5lY3Q6IHRydWU7XG4gICAgICAgIGRlbGF5OiBudW1iZXI7XG4gICAgICAgIHNlcnZlclRpbWVzdGFtcDogbnVtYmVyO1xuICAgICAgfSxcbiAgICBdO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN0YXJnYXRlPEdlbmVyYXRlZCBleHRlbmRzIHsgcm91dGVTY2hlbWE6IGFueTsgcmVqZWN0Q29kZTogYW55IH0+KHN0YXJnYXRlT3B0aW9uczogTWlsa2lvU3RhcmdhdGVPcHRpb25zKSB7XG4gIGNvbnN0ICRmZXRjaCA9IHN0YXJnYXRlT3B0aW9ucy5mZXRjaCA/PyBmZXRjaDtcbiAgY29uc3QgJGFib3J0ID0gc3RhcmdhdGVPcHRpb25zLmFib3J0ID8/IEFib3J0Q29udHJvbGxlcjtcblxuICB0eXBlIFN0YXJnYXRlRXZlbnRzID0ge1xuICAgICdtaWxraW86ZXhlY3V0ZUJlZm9yZSc6IHsgcGF0aDogc3RyaW5nOyBvcHRpb25zOiBNaXhpbjxFeGVjdXRlT3B0aW9uczxhbnk+LCB7IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IGJhc2VVcmw6IHN0cmluZyB9PiB9O1xuICAgICdtaWxraW86ZmV0Y2hCZWZvcmUnOiB7IHBhdGg6IHN0cmluZzsgb3B0aW9uczogTWl4aW48RXhlY3V0ZU9wdGlvbnM8YW55PiwgeyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBiYXNlVXJsOiBzdHJpbmcgfT47IGJvZHk6IHN0cmluZyB9O1xuICAgICdtaWxraW86ZXhlY3V0ZUVycm9yJzoge1xuICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgb3B0aW9uczogTWl4aW48RXhlY3V0ZU9wdGlvbnM8YW55PiwgeyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBiYXNlVXJsOiBzdHJpbmcgfT47XG4gICAgICBlcnJvcjogUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT47XG4gICAgICBoYW5kbGVFcnJvcjogPEsgZXh0ZW5kcyBrZXlvZiBQYXJ0aWFsPEdlbmVyYXRlZFsncmVqZWN0Q29kZSddPj4oZXJyb3I6IGFueSwga2V5OiBLLCBoYW5kbGVyOiAoZXJyb3I6IFBhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ11bS10+KSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICB9O1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUVycm9yOiBhbnkgPSBhc3luYyAoZXJyb3I6IGFueSwga2V5OiBzdHJpbmcsIGhhbmRsZXI6IChlcnJvcjogYW55KSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPikgPT4ge1xuICAgIGlmIChrZXkgaW4gZXJyb3IpIHtcbiAgICAgIGNvbnN0IGhhbmRsZWQgPSBhd2FpdCBoYW5kbGVyKGVycm9yW2tleV0pO1xuICAgICAgaWYgKGhhbmRsZWQpIGRlbGV0ZSBlcnJvcltrZXldO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBfX2luaXRFdmVudE1hbmFnZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSBuZXcgTWFwPChldmVudDogYW55KSA9PiB2b2lkLCBzdHJpbmc+KCk7XG4gICAgY29uc3QgaW5kZXhlZCA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8KGV2ZW50OiBhbnkpID0+IHZvaWQ+PigpO1xuXG4gICAgY29uc3QgZXZlbnRNYW5hZ2VyID0ge1xuICAgICAgb246IDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgSGFuZGxlciBleHRlbmRzIChldmVudDogU3RhcmdhdGVFdmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgaGFuZGxlcnMuc2V0KGhhbmRsZXIsIGtleSBhcyBzdHJpbmcpO1xuICAgICAgICBpZiAoaW5kZXhlZC5oYXMoa2V5IGFzIHN0cmluZykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgaW5kZXhlZC5zZXQoa2V5IGFzIHN0cmluZywgbmV3IFNldCgpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKSE7XG4gICAgICAgIHNldC5hZGQoaGFuZGxlcik7XG4gICAgICAgIGhhbmRsZXJzLnNldChoYW5kbGVyLCBrZXkgYXMgc3RyaW5nKTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIG9mZjogPEtleSBleHRlbmRzIGtleW9mIFN0YXJnYXRlRXZlbnRzLCBIYW5kbGVyIGV4dGVuZHMgKGV2ZW50OiBTdGFyZ2F0ZUV2ZW50c1tLZXldKSA9PiB2b2lkPihrZXk6IEtleSwgaGFuZGxlcjogSGFuZGxlcikgPT4ge1xuICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgaWYgKCFzZXQpIHJldHVybjtcbiAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgfSxcbiAgICAgIGVtaXQ6IGFzeW5jIDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgVmFsdWUgZXh0ZW5kcyBTdGFyZ2F0ZUV2ZW50c1tLZXldPihrZXk6IEtleSwgdmFsdWU6IFZhbHVlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGNvbnN0IGggPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgaWYgKGgpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaCkge1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gZXZlbnRNYW5hZ2VyO1xuICB9O1xuXG4gIGNvbnN0IGV2ZW50TWFuYWdlciA9IF9faW5pdEV2ZW50TWFuYWdlcigpO1xuXG4gIGNvbnN0IGJvb3RzdHJhcCA9IGFzeW5jICgpID0+IHtcbiAgICBsZXQgYmFzZVVybCA9IHN0YXJnYXRlT3B0aW9ucy5iYXNlVXJsO1xuICAgIGlmICh0eXBlb2YgYmFzZVVybCA9PT0gJ2Z1bmN0aW9uJykgYmFzZVVybCA9IGF3YWl0IGJhc2VVcmwoKTtcbiAgICBpZiAoYmFzZVVybC5lbmRzV2l0aCgnLycpKSBiYXNlVXJsID0gYmFzZVVybC5zbGljZSgwLCAtMSk7XG5cbiAgICByZXR1cm4gYmFzZVVybDtcbiAgfTtcblxuICBjb25zdCBiYXNlVXJsOiBQcm9taXNlPHN0cmluZz4gPSBib290c3RyYXAoKTtcblxuICBjb25zdCBzdGFyZ2F0ZSA9IHtcbiAgICAuLi5ldmVudE1hbmFnZXIsXG4gICAgb3B0aW9uczogc3RhcmdhdGVPcHRpb25zLFxuICAgIGFzeW5jIGV4ZWN1dGU8UGF0aCBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXT4oXG4gICAgICBwYXRoOiBQYXRoLFxuICAgICAgb3B0aW9uczogTWl4aW48XG4gICAgICAgIEV4ZWN1dGVPcHRpb25zPEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncmVzdWx0J10+LFxuICAgICAgICB7XG4gICAgICAgICAgcGFyYW1zPzogR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydwYXJhbXMnXTtcbiAgICAgICAgfVxuICAgICAgPixcbiAgICApOiBQcm9taXNlPFxuICAgICAgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWyfwn6WbJ10gZXh0ZW5kcyBib29sZWFuXG4gICAgICAgID8gLy8gYWN0aW9uXG4gICAgICAgICAgICBbUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT4sIG51bGwsIEV4ZWN1dGVSZXN1bHRzT3B0aW9uXSB8IFtudWxsLCBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ3Jlc3VsdCddLCBFeGVjdXRlUmVzdWx0c09wdGlvbl1cbiAgICAgICAgOiAvLyBzdHJlYW1cbiAgICAgICAgICAgIFtQYXJ0aWFsPEdlbmVyYXRlZFsncmVqZWN0Q29kZSddPiwgbnVsbCwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dIHwgW251bGwsIEFzeW5jR2VuZXJhdG9yPFtQYXJ0aWFsPEdlbmVyYXRlZFsncmVqZWN0Q29kZSddPiwgbnVsbF0gfCBbbnVsbCwgR2VuZXJhdG9yR2VuZXJpYzxHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ3Jlc3VsdCddPl0sIHVuZGVmaW5lZD4sIEV4ZWN1dGVSZXN1bHRzT3B0aW9uXVxuICAgID4ge1xuICAgICAgaWYgKG9wdGlvbnMuaGVhZGVycyA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnMgPSB7fTtcblxuICAgICAgbGV0IHVybDogc3RyaW5nO1xuICAgICAgaWYgKG9wdGlvbnMuYmFzZVVybCkge1xuICAgICAgICBsZXQgYmFzZVVybCA9IG9wdGlvbnMuYmFzZVVybDtcbiAgICAgICAgaWYgKHR5cGVvZiBiYXNlVXJsID09PSAnZnVuY3Rpb24nKSBiYXNlVXJsID0gYXdhaXQgYmFzZVVybCgpO1xuICAgICAgICBpZiAoYmFzZVVybC5lbmRzV2l0aCgnLycpKSBiYXNlVXJsID0gYmFzZVVybC5zbGljZSgwLCAtMSk7XG4gICAgICAgIHVybCA9IGJhc2VVcmwgKyAocGF0aCBhcyBzdHJpbmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXJsID0gKGF3YWl0IGJhc2VVcmwpICsgKHBhdGggYXMgc3RyaW5nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEocGF0aCBhcyBzdHJpbmcpLmVuZHNXaXRoKCd+JykpIHtcbiAgICAgICAgLy8gYWN0aW9uXG4gICAgICAgIGlmIChvcHRpb25zLmhlYWRlcnMuQWNjZXB0ID09PSB1bmRlZmluZWQpIG9wdGlvbnMuaGVhZGVycy5BY2NlcHQgPSAnYXBwbGljYXRpb24vanNvbic7XG4gICAgICAgIGlmIChvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID09PSB1bmRlZmluZWQpIG9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgY29uc3QgY2FjaGVTdHJhdGVneSA9IG9wdGlvbnMuY2FjaGVTdHJhdGVneSA/PyAnb2ZmJztcbiAgICAgICAgbGV0IHJldHJ5Q291bnQgPSAwO1xuICAgICAgICBpZiAob3B0aW9ucy5yZXRyeVN0cmF0ZWd5ID09PSB0cnVlIHx8IG9wdGlvbnMucmV0cnlTdHJhdGVneSA9PT0gMikge1xuICAgICAgICAgIHJldHJ5Q291bnQgPSAyO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLnJldHJ5U3RyYXRlZ3kgPT09ICdudW1iZXInICYmIG9wdGlvbnMucmV0cnlTdHJhdGVneSA+IDApIHtcbiAgICAgICAgICByZXRyeUNvdW50ID0gb3B0aW9ucy5yZXRyeVN0cmF0ZWd5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNhY2hlVGhyb3R0bGVNcyA9IG9wdGlvbnMuY2FjaGVUaHJvdHRsZU1zID8/IDA7XG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gZ2VuZXJhdGVDYWNoZUtleShwYXRoIGFzIHN0cmluZywgb3B0aW9ucy5wYXJhbXMpO1xuXG4gICAgICAgIGxldCBjYWNoZVN0b3JhZ2UgPSBzdGFyZ2F0ZU9wdGlvbnMuY2FjaGVTdG9yYWdlO1xuICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSAhPT0gJ29mZicgJiYgIWNhY2hlU3RvcmFnZSkge1xuICAgICAgICAgIGNhY2hlU3RvcmFnZSA9IGF3YWl0IGNyZWF0ZURlZmF1bHRDYWNoZVN0b3JhZ2UoeyBlbmNyeXB0aW9uOiBzdGFyZ2F0ZU9wdGlvbnMuY2FjaGVFbmNyeXB0aW9uIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgIT09ICdvZmYnICYmIGNhY2hlU3RvcmFnZSAmJiBvcHRpb25zLm9uQ2FjaGVIaXQpIHtcbiAgICAgICAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCBjYWNoZVN0b3JhZ2UuZ2V0KGNhY2hlS2V5KTtcbiAgICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLm9uQ2FjaGVIaXQoY2FjaGVkLmRhdGEpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIC8vIGlnbm9yZSBvbkNhY2hlSGl0IGVycm9yc1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYWNoZVN0cmF0ZWd5ID09PSAndGhyb3R0bGUnICYmIGNhY2hlU3RvcmFnZSkge1xuICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IGNhY2hlU3RvcmFnZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgICAgIGlmIChjYWNoZWQgJiYgRGF0ZS5ub3coKSAtIGNhY2hlZC50aW1lc3RhbXAgPCBjYWNoZVRocm90dGxlTXMpIHtcbiAgICAgICAgICAgIHJldHVybiBbbnVsbCwgY2FjaGVkLmRhdGEsIHsgZXhlY3V0ZUlkOiAnY2FjaGVkJyB9XSBhcyBhbnk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhlY3V0ZVJlcXVlc3QgPSBhc3luYyAoaXNSZXRyeTogYm9vbGVhbik6IFByb21pc2U8eyByZXN1bHQ6IHsgdmFsdWU6IFJlY29yZDxhbnksIGFueT4gfSB8IG51bGw7IGVycm9yOiBhbnk7IGlzTmV0d29ya0Vycm9yOiBib29sZWFuIH0+ID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlQmVmb3JlJywgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnkgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLnBhcmFtcykgPz8gJyc7XG4gICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmZldGNoQmVmb3JlJywgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGJvZHkgfSk7XG5cbiAgICAgICAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dCA/PyBzdGFyZ2F0ZU9wdGlvbnM/LnRpbWVvdXQgPz8gNjAwMDtcbiAgICAgICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoW3sgUkVRVUVTVF9USU1FT1VUOiB7IHRpbWVvdXQsIG1lc3NhZ2U6IGBFeGVjdXRlIHRpbWVvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zLmAgfSB9LCBudWxsXSk7XG4gICAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCAoYXdhaXQgJGZldGNoKHVybCwgeyBtZXRob2Q6ICdQT1NUJywgYm9keSwgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzIH0pKS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UocmVzcG9uc2UpKTtcbiAgICAgICAgICAgIHJldHVybiB7IHJlc3VsdDogeyB2YWx1ZTogcGFyc2VkIH0sIGVycm9yOiBudWxsLCBpc05ldHdvcmtFcnJvcjogZmFsc2UgfTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBjb25zdCBpc05ldHdvcmtFcnJvciA9ICFlcnJvcj8uWzBdPy5SRVFVRVNUX1RJTUVPVVQ7XG4gICAgICAgICAgICByZXR1cm4geyByZXN1bHQ6IG51bGwsIGVycm9yLCBpc05ldHdvcmtFcnJvciB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgeyByZXN1bHQsIGVycm9yLCBpc05ldHdvcmtFcnJvciB9ID0gYXdhaXQgZXhlY3V0ZVJlcXVlc3QoZmFsc2UpO1xuXG4gICAgICAgIGZvciAobGV0IHJldHJ5SW5kZXggPSAwOyByZXRyeUluZGV4IDwgcmV0cnlDb3VudCAmJiBlcnJvciAmJiBpc05ldHdvcmtFcnJvcjsgcmV0cnlJbmRleCsrKSB7XG4gICAgICAgICAgaWYgKHJldHJ5SW5kZXggPiAwKSB7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MDApKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmV0cnlSZXN1bHQgPSBhd2FpdCBleGVjdXRlUmVxdWVzdCh0cnVlKTtcbiAgICAgICAgICByZXN1bHQgPSByZXRyeVJlc3VsdC5yZXN1bHQ7XG4gICAgICAgICAgZXJyb3IgPSByZXRyeVJlc3VsdC5lcnJvcjtcbiAgICAgICAgICBpc05ldHdvcmtFcnJvciA9IHJldHJ5UmVzdWx0LmlzTmV0d29ya0Vycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgaWYgKGVycm9yPy5bMF0/LlJFUVVFU1RfVElNRU9VVCkge1xuICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlRXJyb3InLCB7IGhhbmRsZUVycm9yLCBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGVycm9yIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjYWNoZVN0cmF0ZWd5ICE9PSAnb2ZmJyAmJiBjYWNoZVN0b3JhZ2UgJiYgaXNOZXR3b3JrRXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IGNhY2hlU3RvcmFnZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgICByZXR1cm4gW251bGwsIGNhY2hlZC5kYXRhLCB7IGV4ZWN1dGVJZDogJ2NhY2hlZCcgfV0gYXMgYW55O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVycm9yUGluZWQgPSB7IFJFUVVFU1RfRkFJTDogZXJyb3IgfTtcbiAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVFcnJvcicsIHsgaGFuZGxlRXJyb3IsIHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgZXJyb3I6IGVycm9yUGluZWQgfSk7XG4gICAgICAgICAgcmV0dXJuIFtlcnJvclBpbmVkLCBudWxsLCB7IGV4ZWN1dGVJZDogJ3Vua25vd24nIH1dO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCEudmFsdWUuc3VjY2VzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIGNvbnN0IGVycjogYW55ID0ge307XG4gICAgICAgICAgZXJyW3Jlc3VsdCEudmFsdWUuY29kZV0gPSByZXN1bHQhLnZhbHVlLnJlamVjdCA/PyBudWxsO1xuICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUVycm9yJywgeyBoYW5kbGVFcnJvciwgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBlcnJvcjogZXJyIH0pO1xuICAgICAgICAgIHJldHVybiBbZXJyLCBudWxsLCB7IGV4ZWN1dGVJZDogcmVzdWx0IS52YWx1ZS5leGVjdXRlSWQgfV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSAhPT0gJ29mZicgJiYgY2FjaGVTdG9yYWdlKSB7XG4gICAgICAgICAgYXdhaXQgY2FjaGVTdG9yYWdlLnNldChjYWNoZUtleSwgcmVzdWx0IS52YWx1ZS5kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0IS52YWx1ZS5kYXRhLCB7IGV4ZWN1dGVJZDogcmVzdWx0IS52YWx1ZS5leGVjdXRlSWQgfV0gYXMgYW55O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gc3RyZWFtXG4gICAgICAgIG9wdGlvbnMuY2FjaGVTdHJhdGVneSA9ICdvZmYnO1xuICAgICAgICBvcHRpb25zLm9uQ2FjaGVIaXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIG9wdGlvbnMuY2FjaGVUaHJvdHRsZU1zID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmhlYWRlcnMuQWNjZXB0ID09PSB1bmRlZmluZWQpIG9wdGlvbnMuaGVhZGVycy5BY2NlcHQgPSAndGV4dC9ldmVudC1zdHJlYW0nO1xuICAgICAgICBpZiAob3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVR5cGUnXSA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgIGNvbnN0IHN0YWNrczogTWFwPFxuICAgICAgICAgIG51bWJlcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkb25lOiBib29sZWFuO1xuICAgICAgICAgICAgcHJvbWlzZTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxhbnk+PjtcbiAgICAgICAgICAgIHJlc29sdmU6ICh2YWx1ZTogSXRlcmF0b3JSZXN1bHQ8YW55PikgPT4gdm9pZDtcbiAgICAgICAgICAgIHJlamVjdDogKHJlYXNvbjogYW55KSA9PiB2b2lkO1xuICAgICAgICAgIH1cbiAgICAgICAgPiA9IG5ldyBNYXAoKTtcbiAgICAgICAgbGV0IHN0YWNrc0luZGV4ID0gMDtcbiAgICAgICAgbGV0IGl0ZXJhdG9ySW5kZXggPSAwO1xuICAgICAgICBsZXQgc3RyZWFtUmVzdWx0OiBhbnk7XG4gICAgICAgIGNvbnN0IHN0cmVhbVJlc3VsdEZldGNoZWQgPSB3aXRoUmVzb2x2ZXJzPHVuZGVmaW5lZD4oKTtcblxuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc3RhcmdhdGVPcHRpb25zPy50aW1lb3V0ID8/IG9wdGlvbnM/LnRpbWVvdXQgPz8gNjAwMDtcbiAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBzdHJlYW1SZXN1bHRGZXRjaGVkLnJlamVjdChbeyBSRVFVRVNUX1RJTUVPVVQ6IHsgdGltZW91dCwgbWVzc2FnZTogYEV4ZWN1dGUgdGltZW91dCBhZnRlciAke3RpbWVvdXR9bXMuYCB9IH0sIG51bGwsIHsgZXhlY3V0ZUlkOiAndW5rbm93bicgfV0pO1xuICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICBjb25zdCBvbm1lc3NhZ2UgPSAoZXZlbnQ6IEV2ZW50U291cmNlTWVzc2FnZSkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC5kYXRhLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0ID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YS5zbGljZSgxKSkpO1xuICAgICAgICAgICAgICBzdHJlYW1SZXN1bHRGZXRjaGVkLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHN0cmVhbVJlc3VsdEZldGNoZWQucmVqZWN0KFt7IFJFUVVFU1RfRkFJTDogZXJyb3IgfSwgbnVsbCwgeyBleGVjdXRlSWQ6ICd1bmtub3duJyB9XSk7XG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gKytzdGFja3NJbmRleDtcbiAgICAgICAgICAgIGlmIChzdGFja3MuaGFzKGluZGV4KSkge1xuICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHN0YWNrcy5nZXQoaW5kZXgpO1xuICAgICAgICAgICAgICBzdGFjayEuZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgIHN0YWNrIS5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhKSkgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpIH0pO1xuICAgICAgICAgICAgICBzdGFja3Muc2V0KGluZGV4LCB7IC4uLnN0YWNrLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGN1clJlcXVlc3RDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyID0gbmV3ICRhYm9ydCgpO1xuICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHtcbiAgICAgICAgICAgIGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVCZWZvcmUnLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSB9KTtcblxuICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMhLnBhcmFtcykgPz8gJyc7XG4gICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmZldGNoQmVmb3JlJywgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGJvZHkgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKHVybCwge1xuICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucyEuaGVhZGVycyxcbiAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgc2lnbmFsOiBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJyk7XG4gICAgICAgICAgICBpZiAoIWNvbnRlbnRUeXBlPy5zdGFydHNXaXRoKCd0ZXh0L2V2ZW50LXN0cmVhbScpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgY29udGVudC10eXBlIHRvIGJlICR7J3RleHQvZXZlbnQtc3RyZWFtJ30sIEFjdHVhbDogJHtjb250ZW50VHlwZX1gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXdhaXQgZ2V0Qnl0ZXMocmVzcG9uc2UuYm9keSEsIGdldExpbmVzKGdldE1lc3NhZ2VzKG9ubWVzc2FnZSkpKTtcblxuICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSB7IFJFUVVFU1RfRkFJTDogZXJyIH07XG4gICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVFcnJvcicsIHsgaGFuZGxlRXJyb3IsIHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgZXJyb3IgfSk7XG4gICAgICAgICAgICBhd2FpdCBpdGVyYXRvci50aHJvdyhlcnIpO1xuICAgICAgICAgICAgc3RyZWFtUmVzdWx0RmV0Y2hlZC5yZWplY3QoW2Vycm9yLCBudWxsLCB7IGV4ZWN1dGVJZDogJ3Vua25vd24nIH1dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2b2lkIGNyZWF0ZSgpO1xuXG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgIC4uLih7XG4gICAgICAgICAgICBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dW5rbm93bj4+IHtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSArK2l0ZXJhdG9ySW5kZXg7XG4gICAgICAgICAgICAgIGlmIChzdGFja3MuaGFzKGluZGV4IC0gMikpIHN0YWNrcy5kZWxldGUoaW5kZXggLSAyKTtcbiAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiAhY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICBzdGFja3Muc2V0KGluZGV4LCB7IC4uLnN0YWNrLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucHJvbWlzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoIXN0YWNrcy5oYXMoaW5kZXgpICYmIGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnByb21pc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrcy5nZXQoaW5kZXgpIS5wcm9taXNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFzeW5jIHJldHVybigpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XG4gICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXN5bmMgdGhyb3coZXJyOiBhbnkpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XG4gICAgICAgICAgICAgIHN0cmVhbVJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBleGVjdXRlSWQ6IHN0cmVhbVJlc3VsdD8uZXhlY3V0ZUlkID8/ICcnLFxuICAgICAgICAgICAgICAgIGZhaWw6IHtcbiAgICAgICAgICAgICAgICAgIGNvZGU6ICdORVRXT1JLX0VSUk9SJyxcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdOZXR3b3JrIEVycm9yJyxcbiAgICAgICAgICAgICAgICAgIGZyb21DbGllbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICBkYXRhOiBlcnIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBbX2luZGV4LCBzdGFja10gb2Ygc3RhY2tzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YWNrLmRvbmUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHN0YWNrLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0gc2F0aXNmaWVzIEFzeW5jSXRlcmF0b3I8dW5rbm93bj4pLFxuICAgICAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgc3RyZWFtUmVzdWx0RmV0Y2hlZC5wcm9taXNlO1xuICAgICAgICAgIHJldHVybiBbbnVsbCwgaXRlcmF0b3IsIHsgZXhlY3V0ZUlkOiBzdHJlYW1SZXN1bHQuZXhlY3V0ZUlkIH1dIGFzIGFueTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3IgYXMgYW55O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBfX2Nvb2tib29rOiB7XG4gICAgICBzdWJzY3JpYmU6IGFzeW5jIChiYXNlVXJsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgIEFjY2VwdDogJ3RleHQvZXZlbnQtc3RyZWFtJyxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge307XG5cbiAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcykgPz8gJyc7XG4gICAgICAgIGNvbnN0IHN0YWNrczogTWFwPFxuICAgICAgICAgIG51bWJlcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkb25lOiBib29sZWFuO1xuICAgICAgICAgICAgcHJvbWlzZTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxhbnk+PjtcbiAgICAgICAgICAgIHJlc29sdmU6ICh2YWx1ZTogSXRlcmF0b3JSZXN1bHQ8YW55PikgPT4gdm9pZDtcbiAgICAgICAgICAgIHJlamVjdDogKHJlYXNvbjogYW55KSA9PiB2b2lkO1xuICAgICAgICAgIH1cbiAgICAgICAgPiA9IG5ldyBNYXAoKTtcbiAgICAgICAgbGV0IHN0YWNrc0luZGV4ID0gMDtcbiAgICAgICAgbGV0IGl0ZXJhdG9ySW5kZXggPSAwO1xuXG4gICAgICAgIGNvbnN0IG9ubWVzc2FnZSA9IChldmVudDogRXZlbnRTb3VyY2VNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSArK3N0YWNrc0luZGV4O1xuICAgICAgICAgIGlmIChzdGFja3MuaGFzKGluZGV4KSkge1xuICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBzdGFja3MuZ2V0KGluZGV4KTtcbiAgICAgICAgICAgIHN0YWNrIS5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhKSkgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpIH0pO1xuICAgICAgICAgICAgc3RhY2tzLnNldChpbmRleCwgeyAuLi5zdGFjaywgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBjdXJSZXF1ZXN0Q29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuXG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgICAgICBjdXJSZXF1ZXN0Q29udHJvbGxlciA9IG5ldyAkYWJvcnQoKTtcbiAgICAgICAgICBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgICAgICBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAkZmV0Y2goYCR7YmFzZVVybH0vJHN1YnNjcmliZWAsIHtcbiAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgIHNpZ25hbDogY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuICAgICAgICAgICAgaWYgKCFjb250ZW50VHlwZT8uc3RhcnRzV2l0aCgndGV4dC9ldmVudC1zdHJlYW0nKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGNvbnRlbnQtdHlwZSB0byBiZSAkeyd0ZXh0L2V2ZW50LXN0cmVhbSd9LCBBY3R1YWw6ICR7Y29udGVudFR5cGV9YCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IGdldEJ5dGVzKHJlc3BvbnNlLmJvZHkhLCBnZXRMaW5lcyhnZXRNZXNzYWdlcyhvbm1lc3NhZ2UpKSk7XG5cbiAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLnRocm93KGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdm9pZCBjcmVhdGUoKTtcblxuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAuLi4oe1xuICAgICAgICAgICAgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHVua25vd24+PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gKytpdGVyYXRvckluZGV4O1xuICAgICAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCAtIDIpKSBzdGFja3MuZGVsZXRlKGluZGV4IC0gMik7XG4gICAgICAgICAgICAgIGlmICghc3RhY2tzLmhhcyhpbmRleCkgJiYgIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgc3RhY2tzLnNldChpbmRleCwgeyAuLi5zdGFjaywgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnByb21pc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBzdGFja3MuZ2V0KGluZGV4KSEucHJvbWlzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBpdGVyYXRvcl0gb2Ygc3RhY2tzKSBpdGVyYXRvci5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFzeW5jIHRocm93KGVycjogYW55KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xuICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBpdGVyYXRvcl0gb2Ygc3RhY2tzKSBpdGVyYXRvci5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IHNhdGlzZmllcyBBc3luY0l0ZXJhdG9yPHVua25vd24+KSxcbiAgICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3IgYXMgYW55O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0sXG4gICAgYXN5bmMgcGluZyhvcHRpb25zPzogeyB0aW1lb3V0PzogbnVtYmVyIH0pOiBQcm9taXNlPFBpbmc+IHtcbiAgICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8UGluZz4oYXN5bmMgKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7YXdhaXQgYmFzZVVybH0vZ2VuZXJhdGVfMjA0YDtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHN0YXJnYXRlT3B0aW9ucz8udGltZW91dCA/PyBvcHRpb25zPy50aW1lb3V0ID8/IDYwMDA7XG4gICAgICAgIGNvbnN0IHN0YXJ0c1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVuZHNUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICByZXNvbHZlKFt7IGNvbm5lY3Q6IGZhbHNlLCBkZWxheTogZW5kc1RpbWUgLSBzdGFydHNUaW1lLCBlcnJvcjogeyBSRVFVRVNUX1RJTUVPVVQ6IHsgdGltZW91dCwgbWVzc2FnZTogYEV4ZWN1dGUgdGltZW91dCBhZnRlciAke3RpbWVvdXR9bXMuYCB9IH0gfSwgbnVsbF0pO1xuICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKHVybCwgeyBtZXRob2Q6ICdIRUFEJyB9KTtcbiAgICAgICAgICBjb25zdCBlbmRzVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJlc29sdmUoW3sgY29ubmVjdDogZmFsc2UsIGRlbGF5OiBlbmRzVGltZSAtIHN0YXJ0c1RpbWUsIGVycm9yOiB7IFJFUVVFU1RfRkFJTDogeyByZXNwb25zZSwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIG1lc3NhZ2U6ICdTdGF0dXMgY29kZSBub3QgMjA0JyB9IH0gfSwgbnVsbF0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoW251bGwsIHsgY29ubmVjdDogdHJ1ZSwgZGVsYXk6IGVuZHNUaW1lIC0gc3RhcnRzVGltZSwgc2VydmVyVGltZXN0YW1wOiBOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpIS5zdWJzdHJpbmcoMTcpKSB9XSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICBjb25zdCBlbmRzVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgcmV0dXJuIFt7IGNvbm5lY3Q6IGZhbHNlLCBkZWxheTogZW5kc1RpbWUgLSBzdGFydHNUaW1lLCBlcnJvciB9LCBudWxsXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICAkdHlwZXM6IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIHtcbiAgICAgIGdlbmVyYXRlZDogR2VuZXJhdGVkO1xuICAgICAgZXJyb3I6IEdlbmVyYXRlZFsncmVqZWN0Q29kZSddO1xuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIFtQYXRoIGluIGtleW9mIEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXV06IEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncGFyYW1zJ107XG4gICAgICB9O1xuICAgICAgcmVzdWx0czoge1xuICAgICAgICBbUGF0aCBpbiBrZXlvZiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11dOiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ/CfpZsnXSBleHRlbmRzIGJvb2xlYW5cbiAgICAgICAgICA/IC8vIGFjdGlvblxuICAgICAgICAgICAgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydyZXN1bHQnXVxuICAgICAgICAgIDogLy8gc3RyZWFtXG4gICAgICAgICAgICBBc3luY0dlbmVyYXRvcjxbUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT4sIG51bGxdIHwgW251bGwsIEdlbmVyYXRvckdlbmVyaWM8R2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydyZXN1bHQnXT5dLCB1bmRlZmluZWQ+O1xuICAgICAgfTtcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiBzdGFyZ2F0ZTtcbn1cblxuY29uc3QgaXNvRGF0ZVBhdHRlcm4gPSAvXihcXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZHsxLDN9KT8pKFp8WystXVxcZHsyfTo/XFxkezJ9KT8kLztcblxuZXhwb3J0IGZ1bmN0aW9uIHJldml2ZUpTT05QYXJzZTxUPihqc29uOiBUKTogVCB7XG4gIGlmIChqc29uICE9PSBudWxsICYmIHR5cGVvZiBqc29uID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChqc29uIGluc3RhbmNlb2YgRGF0ZSB8fCAodHlwZW9mIChqc29uIGFzIGFueSkuZ2V0VGltZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgKGpzb24gYXMgYW55KS50b0lTT1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uKSkge1xuICAgICAgcmV0dXJuIGpzb24ubWFwKChpdGVtKSA9PiByZXZpdmVKU09OUGFyc2UoaXRlbSkpIGFzIGFueTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGpzb24pLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGFjY1trZXkgYXMga2V5b2YgVF0gPSByZXZpdmVKU09OUGFyc2UodmFsdWUpO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBUKTtcbiAgfVxuICBpZiAodHlwZW9mIGpzb24gPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBqc29uLm1hdGNoKGlzb0RhdGVQYXR0ZXJuKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRlU3RyaW5nID0gbWF0Y2hbMl0gPyBgJHttYXRjaFsxXX0ke21hdGNoWzJdLnJlcGxhY2UoJzonLCAnJyl9YCA6IGAke21hdGNoWzFdfVpgO1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKG5vcm1hbGl6ZWREYXRlU3RyaW5nKSBhcyBhbnk7XG4gICAgfVxuICB9XG4gIHJldHVybiBqc29uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGVTdHJlYW1PcHRpb25zIHtcbiAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBpU2NoZW1hRXh0ZW5kIHtcbiAgYXBpVmFsaWRhdG9yOiB7XG4gICAgZ2VuZXJhdGVkQXQ6IG51bWJlcjtcbiAgICB2YWxpZGF0ZTogUmVjb3JkPGFueSwgYW55PjtcbiAgfTtcbiAgYXBpTWV0aG9kc1NjaGVtYTogUmVjb3JkPGFueSwgYW55PjtcbiAgYXBpTWV0aG9kc1R5cGVTY2hlbWE6IFJlY29yZDxhbnksIGFueT47XG4gIGFwaVRlc3RzU2NoZW1hOiBSZWNvcmQ8YW55LCBhbnk+O1xufVxuXG5leHBvcnQgdHlwZSBGYWlsQ29kZUV4dGVuZCA9IFJlY29yZDxhbnksICguLi5hcmdzOiBBcnJheTxhbnk+KSA9PiBhbnk+O1xuXG5leHBvcnQgdHlwZSBCb290c3RyYXBNaWRkbGV3YXJlID0gKGRhdGE6IHsgc3RvcmFnZTogQ2xpZW50U3RvcmFnZSB9KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbmV4cG9ydCB0eXBlIEJlZm9yZUV4ZWN1dGVNaWRkbGV3YXJlID0gKGRhdGE6IHsgcGF0aDogc3RyaW5nOyBwYXJhbXM6IGFueTsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgc3RvcmFnZTogQ2xpZW50U3RvcmFnZSB9KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbmV4cG9ydCB0eXBlIEFmdGVyRXhlY3V0ZU1pZGRsZXdhcmUgPSAoZGF0YTogeyBwYXRoOiBzdHJpbmc7IHJlc3VsdDogeyB2YWx1ZTogYW55IH07IHN0b3JhZ2U6IENsaWVudFN0b3JhZ2UgfSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlkZGxld2FyZU9wdGlvbnMge1xuICBib290c3RyYXA/OiBCb290c3RyYXBNaWRkbGV3YXJlO1xuICBiZWZvcmVFeGVjdXRlPzogQmVmb3JlRXhlY3V0ZU1pZGRsZXdhcmU7XG4gIGFmdGVyRXhlY3V0ZT86IEFmdGVyRXhlY3V0ZU1pZGRsZXdhcmU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50U3RvcmFnZSB7XG4gIGdldEl0ZW06IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgc2V0SXRlbTogKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZW1vdmVJdGVtOiAoa2V5OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0ZVJlc3VsdFN1Y2Nlc3M8UmVzdWx0PiB7XG4gIGV4ZWN1dGVJZDogc3RyaW5nO1xuICBzdWNjZXNzOiB0cnVlO1xuICBkYXRhOiBSZXN1bHQ7XG59XG5cbmV4cG9ydCB0eXBlIEdlbmVyYXRvckdlbmVyaWM8VD4gPSBUIGV4dGVuZHMgQXN5bmNHZW5lcmF0b3I8aW5mZXIgST4gPyBJIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIEZsYXR0ZW5LZXlzPFQsIFByZWZpeCBleHRlbmRzIHN0cmluZyA9ICcnPiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBvYmplY3QgPyBGbGF0dGVuS2V5czxUW0tdLCBgJHtQcmVmaXh9JHtFeGNsdWRlPEssIHN5bWJvbD59LmA+IDogYCRpbnB1dC4ke1ByZWZpeH0ke0V4Y2x1ZGU8Sywgc3ltYm9sPn1gO1xufVtrZXlvZiBUXTtcblxuLy8gKioqIFRoaXMgcGFydCBvZiB0aGUgY29kZSBpcyBiYXNlZCBvbiBgQG1pY3Jvc29mdC9mZXRjaC1ldmVudC1zb3VyY2VgIHJld3JpdGUsIHRoYW5rcyB0byB0aGUgd29yayBvZiBNaWNyb3NvZnQgKioqIC8vXG4vLyAqKiogaHR0cHM6Ly9naXRodWIuY29tL0F6dXJlL2ZldGNoLWV2ZW50LXNvdXJjZS9ibG9iL21haW4vc3JjL3BhcnNlLnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiogLy9cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbWVzc2FnZSBzZW50IGluIGFuIGV2ZW50IHN0cmVhbVxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZlci1zZW50X2V2ZW50cy9Vc2luZ19zZXJ2ZXItc2VudF9ldmVudHMjRXZlbnRfc3RyZWFtX2Zvcm1hdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50U291cmNlTWVzc2FnZSB7XG4gIGRhdGE6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIFJlYWRhYmxlU3RyZWFtIGludG8gYSBjYWxsYmFjayBwYXR0ZXJuLlxuICogQHBhcmFtIHN0cmVhbSBUaGUgaW5wdXQgUmVhZGFibGVTdHJlYW0uXG4gKiBAcGFyYW0gb25DaHVuayBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBuZXcgYnl0ZSBjaHVuayBpbiB0aGUgc3RyZWFtLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgc3RyZWFtIGNsb3Nlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ5dGVzKHN0cmVhbTogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4sIG9uQ2h1bms6IChhcnI6IFVpbnQ4QXJyYXkpID0+IHZvaWQpIHtcbiAgY29uc3QgcmVhZGVyID0gc3RyZWFtLmdldFJlYWRlcigpO1xuICBsZXQgcmVzdWx0OiBSZWFkYWJsZVN0cmVhbVJlYWRSZXN1bHQ8VWludDhBcnJheT47XG4gIC8vIEB0cy1pZ25vcmVcbiAgd2hpbGUgKCEocmVzdWx0ID0gYXdhaXQgcmVhZGVyLnJlYWQoKSkuZG9uZSkge1xuICAgIG9uQ2h1bmsocmVzdWx0LnZhbHVlKTtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyBhcmJpdGFyeSBieXRlIGNodW5rcyBpbnRvIEV2ZW50U291cmNlIGxpbmUgYnVmZmVycy5cbiAqIEVhY2ggbGluZSBzaG91bGQgYmUgb2YgdGhlIGZvcm1hdCBcImZpZWxkOiB2YWx1ZVwiIGFuZCBlbmRzIHdpdGggXFxyLCBcXG4sIG9yIFxcclxcbi5cbiAqIEBwYXJhbSBvbkxpbmUgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggbmV3IEV2ZW50U291cmNlIGxpbmUuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBpbmNvbWluZyBieXRlIGNodW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGluZXMob25MaW5lOiAobGluZTogVWludDhBcnJheSwgZmllbGRMZW5ndGg6IG51bWJlcikgPT4gdm9pZCkge1xuICBsZXQgYnVmZmVyOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xuICBsZXQgcG9zaXRpb246IG51bWJlcjsgLy8gY3VycmVudCByZWFkIHBvc2l0aW9uXG4gIGxldCBmaWVsZExlbmd0aDogbnVtYmVyOyAvLyBsZW5ndGggb2YgdGhlIGBmaWVsZGAgcG9ydGlvbiBvZiB0aGUgbGluZVxuICBsZXQgZGlzY2FyZFRyYWlsaW5nTmV3bGluZSA9IGZhbHNlO1xuXG4gIC8vIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgY2FuIHByb2Nlc3MgZWFjaCBpbmNvbWluZyBieXRlIGNodW5rOlxuICByZXR1cm4gZnVuY3Rpb24gb25DaHVuayhhcnI6IFVpbnQ4QXJyYXkpIHtcbiAgICBpZiAoYnVmZmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJ1ZmZlciA9IGFycjtcbiAgICAgIHBvc2l0aW9uID0gMDtcbiAgICAgIGZpZWxkTGVuZ3RoID0gLTE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHdlJ3JlIHN0aWxsIHBhcnNpbmcgdGhlIG9sZCBsaW5lLiBBcHBlbmQgdGhlIG5ldyBieXRlcyBpbnRvIGJ1ZmZlcjpcbiAgICAgIGJ1ZmZlciA9IGNvbmNhdChidWZmZXIsIGFycik7XG4gICAgfVxuXG4gICAgY29uc3QgYnVmTGVuZ3RoID0gYnVmZmVyLmxlbmd0aDtcbiAgICBsZXQgbGluZVN0YXJ0ID0gMDsgLy8gaW5kZXggd2hlcmUgdGhlIGN1cnJlbnQgbGluZSBzdGFydHNcbiAgICB3aGlsZSAocG9zaXRpb24gPCBidWZMZW5ndGgpIHtcbiAgICAgIGlmIChkaXNjYXJkVHJhaWxpbmdOZXdsaW5lKSB7XG4gICAgICAgIGlmIChidWZmZXJbcG9zaXRpb25dID09PSAxMCkge1xuICAgICAgICAgIGxpbmVTdGFydCA9ICsrcG9zaXRpb247IC8vIHNraXAgdG8gbmV4dCBjaGFyXG4gICAgICAgIH1cblxuICAgICAgICBkaXNjYXJkVHJhaWxpbmdOZXdsaW5lID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIHN0YXJ0IGxvb2tpbmcgZm9yd2FyZCB0aWxsIHRoZSBlbmQgb2YgbGluZTpcbiAgICAgIGxldCBsaW5lRW5kID0gLTE7IC8vIGluZGV4IG9mIHRoZSBcXHIgb3IgXFxuIGNoYXJcbiAgICAgIGZvciAoOyBwb3NpdGlvbiA8IGJ1Zkxlbmd0aCAmJiBsaW5lRW5kID09PSAtMTsgKytwb3NpdGlvbikge1xuICAgICAgICBzd2l0Y2ggKGJ1ZmZlcltwb3NpdGlvbl0pIHtcbiAgICAgICAgICBjYXNlIDU4OlxuICAgICAgICAgICAgaWYgKGZpZWxkTGVuZ3RoID09PSAtMSkge1xuICAgICAgICAgICAgICAvLyBmaXJzdCBjb2xvbiBpbiBsaW5lXG4gICAgICAgICAgICAgIGZpZWxkTGVuZ3RoID0gcG9zaXRpb24gLSBsaW5lU3RhcnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDEzOiB7XG4gICAgICAgICAgICBkaXNjYXJkVHJhaWxpbmdOZXdsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIGxpbmVFbmQgPSBwb3NpdGlvbjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgbGluZUVuZCA9IHBvc2l0aW9uO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGxpbmVFbmQgPT09IC0xKSB7XG4gICAgICAgIC8vIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGJ1dCB0aGUgbGluZSBoYXNuJ3QgZW5kZWQuXG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBuZXh0IGFyciBhbmQgdGhlbiBjb250aW51ZSBwYXJzaW5nOlxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gd2UndmUgcmVhY2hlZCB0aGUgbGluZSBlbmQsIHNlbmQgaXQgb3V0OlxuICAgICAgb25MaW5lKGJ1ZmZlci5zdWJhcnJheShsaW5lU3RhcnQsIGxpbmVFbmQpLCBmaWVsZExlbmd0aCk7XG4gICAgICBsaW5lU3RhcnQgPSBwb3NpdGlvbjsgLy8gd2UncmUgbm93IG9uIHRoZSBuZXh0IGxpbmVcbiAgICAgIGZpZWxkTGVuZ3RoID0gLTE7XG4gICAgfVxuXG4gICAgaWYgKGxpbmVTdGFydCA9PT0gYnVmTGVuZ3RoKSB7XG4gICAgICBidWZmZXIgPSB1bmRlZmluZWQ7IC8vIHdlJ3ZlIGZpbmlzaGVkIHJlYWRpbmcgaXRcbiAgICB9IGVsc2UgaWYgKGxpbmVTdGFydCAhPT0gMCkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHZpZXcgaW50byBidWZmZXIgYmVnaW5uaW5nIGF0IGxpbmVTdGFydCBzbyB3ZSBkb24ndFxuICAgICAgLy8gbmVlZCB0byBjb3B5IG92ZXIgdGhlIHByZXZpb3VzIGxpbmVzIHdoZW4gd2UgZ2V0IHRoZSBuZXcgYXJyOlxuICAgICAgYnVmZmVyID0gYnVmZmVyLnN1YmFycmF5KGxpbmVTdGFydCk7XG4gICAgICBwb3NpdGlvbiAtPSBsaW5lU3RhcnQ7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFBhcnNlcyBsaW5lIGJ1ZmZlcnMgaW50byBFdmVudFNvdXJjZU1lc3NhZ2VzLlxuICogQHBhcmFtIG9uSWQgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggYGlkYCBmaWVsZC5cbiAqIEBwYXJhbSBvblJldHJ5IEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIGByZXRyeWAgZmllbGQuXG4gKiBAcGFyYW0gb25NZXNzYWdlIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBpbmNvbWluZyBsaW5lIGJ1ZmZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1lc3NhZ2VzKG9uTWVzc2FnZT86IChtc2c6IEV2ZW50U291cmNlTWVzc2FnZSkgPT4gdm9pZCkge1xuICBsZXQgbWVzc2FnZSA9IG5ld01lc3NhZ2UoKTtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4gIC8vIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgY2FuIHByb2Nlc3MgZWFjaCBpbmNvbWluZyBsaW5lIGJ1ZmZlcjpcbiAgcmV0dXJuIGZ1bmN0aW9uIG9uTGluZShsaW5lOiBVaW50OEFycmF5LCBmaWVsZExlbmd0aDogbnVtYmVyKSB7XG4gICAgaWYgKGxpbmUubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBlbXB0eSBsaW5lIGRlbm90ZXMgZW5kIG9mIG1lc3NhZ2UuIFRyaWdnZXIgdGhlIGNhbGxiYWNrIGFuZCBzdGFydCBhIG5ldyBtZXNzYWdlOlxuICAgICAgb25NZXNzYWdlPy4obWVzc2FnZSk7XG4gICAgICBtZXNzYWdlID0gbmV3TWVzc2FnZSgpO1xuICAgIH0gZWxzZSBpZiAoZmllbGRMZW5ndGggPiAwKSB7XG4gICAgICAvLyBleGNsdWRlIGNvbW1lbnRzIGFuZCBsaW5lcyB3aXRoIG5vIHZhbHVlc1xuICAgICAgLy8gbGluZSBpcyBvZiBmb3JtYXQgXCI8ZmllbGQ+Ojx2YWx1ZT5cIiBvciBcIjxmaWVsZD46IDx2YWx1ZT5cIlxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VydmVyLXNlbnQtZXZlbnRzLmh0bWwjZXZlbnQtc3RyZWFtLWludGVycHJldGF0aW9uXG4gICAgICBjb25zdCBmaWVsZCA9IGRlY29kZXIuZGVjb2RlKGxpbmUuc3ViYXJyYXkoMCwgZmllbGRMZW5ndGgpKTtcbiAgICAgIGNvbnN0IHZhbHVlT2Zmc2V0ID0gZmllbGRMZW5ndGggKyAobGluZVtmaWVsZExlbmd0aCArIDFdID09PSAzMiA/IDIgOiAxKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gZGVjb2Rlci5kZWNvZGUobGluZS5zdWJhcnJheSh2YWx1ZU9mZnNldCkpO1xuXG4gICAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgICAgIGNhc2UgJ2RhdGEnOlxuICAgICAgICAgIC8vIGlmIHRoaXMgbWVzc2FnZSBhbHJlYWR5IGhhcyBkYXRhLCBhcHBlbmQgdGhlIG5ldyB2YWx1ZSB0byB0aGUgb2xkLlxuICAgICAgICAgIC8vIG90aGVyd2lzZSwganVzdCBzZXQgdG8gdGhlIG5ldyB2YWx1ZTpcbiAgICAgICAgICBtZXNzYWdlLmRhdGEgPSBtZXNzYWdlLmRhdGEgPyBgJHttZXNzYWdlLmRhdGF9XFxuJHt2YWx1ZX1gIDogdmFsdWU7IC8vIG90aGVyd2lzZSxcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbmNhdChhOiBVaW50OEFycmF5LCBiOiBVaW50OEFycmF5KSB7XG4gIGNvbnN0IHJlcyA9IG5ldyBVaW50OEFycmF5KGEubGVuZ3RoICsgYi5sZW5ndGgpO1xuICByZXMuc2V0KGEpO1xuICByZXMuc2V0KGIsIGEubGVuZ3RoKTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gbmV3TWVzc2FnZSgpOiBFdmVudFNvdXJjZU1lc3NhZ2Uge1xuICByZXR1cm4ge1xuICAgIGRhdGE6ICcnLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFJlc29sdmVyczxUID0gYW55PigpOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPiB7XG4gIGxldCByZXNvbHZlOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPlsncmVzb2x2ZSddO1xuICBsZXQgcmVqZWN0OiBQcm9taXNlV2l0aFJlc29sdmVyczxUPlsncmVqZWN0J107XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxUPigocmVzLCByZWopID0+IHtcbiAgICByZXNvbHZlID0gcmVzO1xuICAgIHJlamVjdCA9IHJlajtcbiAgfSk7XG4gIHJldHVybiB7IHByb21pc2UsIHJlc29sdmU6IHJlc29sdmUhLCByZWplY3Q6IHJlamVjdCEgfTtcbn1cblxuY29uc3QgREJfTkFNRSA9ICdTdGFyZ2F0ZSc7XG5jb25zdCBTVE9SRV9OQU1FID0gJ2NhY2hlcyc7XG5sZXQgZGJJbnN0YW5jZTogSURCRGF0YWJhc2UgfCBudWxsID0gbnVsbDtcblxuYXN5bmMgZnVuY3Rpb24gb3BlbkRCKCk6IFByb21pc2U8SURCRGF0YWJhc2U+IHtcbiAgaWYgKGRiSW5zdGFuY2UpIHJldHVybiBkYkluc3RhbmNlO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKERCX05BTUUsIDEpO1xuICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTtcbiAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgIGRiSW5zdGFuY2UgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgIHJlc29sdmUoZGJJbnN0YW5jZSk7XG4gICAgfTtcbiAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudCkgPT4ge1xuICAgICAgY29uc3QgZGIgPSAoZXZlbnQudGFyZ2V0IGFzIElEQk9wZW5EQlJlcXVlc3QpLnJlc3VsdDtcbiAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhTVE9SRV9OQU1FKSkge1xuICAgICAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShTVE9SRV9OQU1FKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRDYWNoZVN0b3JhZ2Uob3B0aW9ucz86IHsgZW5jcnlwdGlvbj86IGJvb2xlYW47IGVuY3J5cHRpb25LZXk/OiBzdHJpbmcgfSk6IFByb21pc2U8Q2FjaGVTdG9yYWdlPiB7XG4gIGF3YWl0IG9wZW5EQigpO1xuXG4gIGxldCBlbmNyeXB0aW9uS2V5OiBDcnlwdG9LZXkgfCBudWxsID0gbnVsbDtcbiAgY29uc3QgY291bnRlciA9IG5ldyBVaW50OEFycmF5KDE2KTtcblxuICBpZiAob3B0aW9ucz8uZW5jcnlwdGlvbikge1xuICAgIGNvbnN0IGtleVN0cmluZyA9IG9wdGlvbnMuZW5jcnlwdGlvbktleSA/PyBEQl9OQU1FO1xuICAgIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShrZXlTdHJpbmcpLmZvckVhY2goKGJ5dGUsIGkpID0+IHtcbiAgICAgIGlmIChpIDwgMTYpIGNvdW50ZXJbaV0gPSBieXRlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIGNvbnN0IGtleURhdGEgPSBlbmNvZGVyLmVuY29kZShrZXlTdHJpbmcpO1xuICAgIGNvbnN0IGltcG9ydGVkS2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoJ3JhdycsIGtleURhdGEsIHsgbmFtZTogJ1BCS0RGMicgfSwgZmFsc2UsIFsnZGVyaXZlS2V5J10pO1xuXG4gICAgZW5jcnlwdGlvbktleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVyaXZlS2V5KFxuICAgICAge1xuICAgICAgICBuYW1lOiAnUEJLREYyJyxcbiAgICAgICAgc2FsdDogZW5jb2Rlci5lbmNvZGUoJ21pbGtpby1zdGFyZ2F0ZS1jYWNoZScpLFxuICAgICAgICBpdGVyYXRpb25zOiAxMDAwMDAsXG4gICAgICAgIGhhc2g6ICdTSEEtMjU2JyxcbiAgICAgIH0sXG4gICAgICBpbXBvcnRlZEtleSxcbiAgICAgIHsgbmFtZTogJ0FFUy1DVFInLCBsZW5ndGg6IDI1NiB9LFxuICAgICAgZmFsc2UsXG4gICAgICBbJ2VuY3J5cHQnLCAnZGVjcnlwdCddLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBlbmNyeXB0RGF0YSA9IGFzeW5jIChkYXRhOiBhbnkpOiBQcm9taXNlPFVpbnQ4QXJyYXk+ID0+IHtcbiAgICBpZiAoIWVuY3J5cHRpb25LZXkpIHJldHVybiBkYXRhO1xuXG4gICAgY29uc3QganNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICBjb25zdCBkYXRhQnl0ZXMgPSBlbmNvZGVyLmVuY29kZShqc29uU3RyaW5nKTtcblxuICAgIGNvbnN0IGVuY3J5cHRlZEFycmF5QnVmZmVyID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxuICAgICAge1xuICAgICAgICBuYW1lOiAnQUVTLUNUUicsXG4gICAgICAgIGNvdW50ZXI6IGNvdW50ZXIsXG4gICAgICAgIGxlbmd0aDogNjQsXG4gICAgICB9LFxuICAgICAgZW5jcnlwdGlvbktleSEsXG4gICAgICBkYXRhQnl0ZXMsXG4gICAgKTtcblxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShlbmNyeXB0ZWRBcnJheUJ1ZmZlcik7XG4gIH07XG5cbiAgY29uc3QgZGVjcnlwdERhdGEgPSBhc3luYyAoZW5jcnlwdGVkRGF0YTogQXJyYXlCdWZmZXIgfCBVaW50OEFycmF5KTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgICBpZiAoIWVuY3J5cHRpb25LZXkgfHwgIWVuY3J5cHRlZERhdGEpIHJldHVybiBlbmNyeXB0ZWREYXRhO1xuXG4gICAgY29uc3QgYXJyYXlCdWZmZXIgPSBlbmNyeXB0ZWREYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSA/IChlbmNyeXB0ZWREYXRhLmJ1ZmZlciBhcyBBcnJheUJ1ZmZlcikgOiBlbmNyeXB0ZWREYXRhO1xuXG4gICAgY29uc3QgZGVjcnlwdGVkQnl0ZXMgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdBRVMtQ1RSJyxcbiAgICAgICAgY291bnRlcjogY291bnRlcixcbiAgICAgICAgbGVuZ3RoOiA2NCxcbiAgICAgIH0sXG4gICAgICBlbmNyeXB0aW9uS2V5ISxcbiAgICAgIGFycmF5QnVmZmVyLFxuICAgICk7XG5cbiAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgY29uc3QganNvblN0cmluZyA9IGRlY29kZXIuZGVjb2RlKGRlY3J5cHRlZEJ5dGVzKTtcbiAgICByZXR1cm4gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoanNvblN0cmluZykpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTx7IGRhdGE6IGFueTsgdGltZXN0YW1wOiBudW1iZXIgfSB8IG51bGw+IHtcbiAgICAgIGNvbnN0IGRiID0gYXdhaXQgb3BlbkRCKCk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsICdyZWFkb25seScpO1xuICAgICAgICBjb25zdCBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKFNUT1JFX05BTUUpO1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUuZ2V0KGtleSk7XG4gICAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG9wdGlvbnM/LmVuY3J5cHRpb24gJiYgKHJlc3VsdC5kYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgcmVzdWx0LmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgICAgICAgY29uc3QgZGVjcnlwdGVkRGF0YSA9IGF3YWl0IGRlY3J5cHREYXRhKHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgIHJlc29sdmUoeyBkYXRhOiBkZWNyeXB0ZWREYXRhLCB0aW1lc3RhbXA6IHJlc3VsdC50aW1lc3RhbXAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQgPz8gbnVsbCk7XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGFzeW5jIHNldChrZXk6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBkYiA9IGF3YWl0IG9wZW5EQigpO1xuICAgICAgbGV0IGRhdGFUb1N0b3JlOiBhbnkgPSBkYXRhO1xuXG4gICAgICBpZiAob3B0aW9ucz8uZW5jcnlwdGlvbikge1xuICAgICAgICBkYXRhVG9TdG9yZSA9IGF3YWl0IGVuY3J5cHREYXRhKGRhdGEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsICdyZWFkd3JpdGUnKTtcbiAgICAgICAgY29uc3Qgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShTVE9SRV9OQU1FKTtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLnB1dCh7IGRhdGE6IGRhdGFUb1N0b3JlLCB0aW1lc3RhbXA6IERhdGUubm93KCkgfSwga2V5KTtcbiAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ2FjaGVLZXkocGF0aDogc3RyaW5nLCBwYXJhbXM6IGFueSk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtwYXRofToke0pTT04uc3RyaW5naWZ5KHBhcmFtcyA/PyB7fSl9YDtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFrREEsZUFBc0IsY0FBdUUsQ0FBQyxpQkFBd0M7QUFBQSxFQUNwSSxNQUFNLFNBQVMsZ0JBQWdCLFNBQVM7QUFBQSxFQUN4QyxNQUFNLFNBQVMsZ0JBQWdCLFNBQVM7QUFBQSxFQWF4QyxNQUFNLGNBQW1CLE9BQU8sT0FBWSxLQUFhLFlBQXdEO0FBQUEsSUFDL0csSUFB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
package/package.json CHANGED
@@ -1 +1,12 @@
1
- {"name":"@milkio/stargate","version":"1.0.0-beta.99","type":"module","module":"./index.js","types":"./index.d.ts","dependencies":{}}
1
+ {
2
+ "name": "@milkio/stargate",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "exports": "./index.js",
6
+ "types": "./index.d.ts",
7
+ "dependencies": {},
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/akirarika/milkio"
11
+ }
12
+ }