socket-function 1.1.49 → 1.2.1

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 (53) hide show
  1. package/SocketFunction.d.ts +1 -1
  2. package/SocketFunctionTypes.d.ts +1 -1
  3. package/dist/SetProcessVariables.ts.cache +9 -0
  4. package/dist/SocketFunction.ts.cache +467 -0
  5. package/hot/HotReloadController.d.ts +3 -3
  6. package/hot/dist/HotReloadController.ts.cache +252 -0
  7. package/index.d.ts +10 -25
  8. package/package.json +1 -1
  9. package/require/CSSShim.d.ts +1 -1
  10. package/require/RequireController.d.ts +2 -2
  11. package/require/compileFlags.d.ts +1 -1
  12. package/require/dist/RequireController.ts.cache +386 -0
  13. package/require/dist/compileFlags.ts.cache +41 -0
  14. package/require/dist/extMapper.ts.cache +368 -0
  15. package/require/dist/require.ts.cache +676 -0
  16. package/require/require.d.ts +1 -1
  17. package/src/JSONLACKS/dist/JSONLACKS.ts.cache +469 -0
  18. package/src/callManager.d.ts +1 -1
  19. package/src/dist/CallFactory.ts.cache +930 -0
  20. package/src/dist/Zip.ts.cache +156 -0
  21. package/src/dist/batching.ts.cache +377 -0
  22. package/src/dist/bits.ts.cache +121 -0
  23. package/src/dist/buffers.ts.cache +76 -0
  24. package/src/dist/caching.ts.cache +302 -0
  25. package/src/dist/callHTTPHandler.ts.cache +264 -0
  26. package/src/dist/callManager.ts.cache +159 -0
  27. package/src/dist/certStore.ts.cache +59 -0
  28. package/src/dist/createSingleton.ts.cache +62 -0
  29. package/src/dist/fixLargeNetworkCalls.ts.cache +17 -0
  30. package/src/dist/forwardPort.ts.cache +222 -0
  31. package/src/dist/https.ts.cache +141 -0
  32. package/src/dist/misc.ts.cache +499 -0
  33. package/src/dist/nodeCache.ts.cache +136 -0
  34. package/src/dist/nodeProxy.ts.cache +57 -0
  35. package/src/dist/protocolNegotiation.ts.cache +101 -0
  36. package/src/dist/tlsParsing.ts.cache +85 -0
  37. package/src/dist/types.ts.cache +9 -0
  38. package/src/dist/webSocketServer.ts.cache +365 -0
  39. package/src/dist/websocketFactory.ts.cache +53 -0
  40. package/src/formatting/dist/colors.ts.cache +98 -0
  41. package/src/formatting/dist/format.ts.cache +396 -0
  42. package/src/formatting/dist/logColors.ts.cache +28 -0
  43. package/src/lz4/dist/LZ4.ts.cache +53 -0
  44. package/src/profiling/dist/getOwnTime.ts.cache +100 -0
  45. package/src/profiling/dist/measure.ts.cache +338 -0
  46. package/src/profiling/dist/stats.ts.cache +202 -0
  47. package/src/profiling/dist/statsFormat.ts.cache +45 -0
  48. package/src/profiling/getOwnTime.ts +7 -1
  49. package/src/profiling/measure.ts +25 -16
  50. package/test.ts +11 -5
  51. package/time/dist/trueTimeShim.ts.cache +656 -0
  52. package/time/trueTimeShim.d.ts +1 -16
  53. package/time/trueTimeShim.ts +7 -43
@@ -0,0 +1,676 @@
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
+ /// <reference path="../src/src.d.ts" />
3
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
4
+ //exports.requireMain = void 0;
5
+ function requireMain() {
6
+ var _a;
7
+ async function requestText(endpoint, values) {
8
+ var _a, _b, _c;
9
+ let url = new URL(endpoint);
10
+ let json = JSON.stringify(values);
11
+ let response;
12
+ if (json.length < 6000) {
13
+ // NOTE: Try to use a GET, as GETs can be cached! However, if the data is too large,
14
+ // we have to use a post, or else the request url will be too large
15
+ for (let key in values) {
16
+ url.searchParams.set(key, JSON.stringify(values[key]));
17
+ }
18
+ response = await fetch(url.toString(), {
19
+ method: "GET",
20
+ credentials: "include",
21
+ });
22
+ }
23
+ else {
24
+ response = await fetch(url.toString(), {
25
+ method: "POST",
26
+ body: json,
27
+ credentials: "include",
28
+ });
29
+ }
30
+ let compressionRatio = 1;
31
+ let uncompressedLength = response.headers.get("X-Uncompressed-Content-Length");
32
+ let compressedLength = response.headers.get("Content-Length");
33
+ if (uncompressedLength && compressedLength) {
34
+ compressionRatio = +uncompressedLength / +compressedLength;
35
+ }
36
+ let totalLength = +(uncompressedLength || compressedLength || 0);
37
+ if (totalLength) {
38
+ (_a = globalThis.onProgressHandler) === null || _a === void 0 ? void 0 : _a.call(globalThis, {
39
+ type: "Download",
40
+ addValue: 0,
41
+ addMax: Math.floor(totalLength / compressionRatio),
42
+ });
43
+ }
44
+ // If it's an error, set requestError
45
+ if (!response.ok) {
46
+ (_b = globalThis.onErrorHandler) === null || _b === void 0 ? void 0 : _b.call(globalThis, response.statusText);
47
+ }
48
+ // Stream it, so we can get progrss
49
+ let reader = response.body.getReader();
50
+ let result = "";
51
+ while (true) {
52
+ let { done, value } = await reader.read();
53
+ if (done)
54
+ break;
55
+ result += new TextDecoder().decode(value);
56
+ let cur = ((value === null || value === void 0 ? void 0 : value.length) || 0) / compressionRatio;
57
+ (_c = globalThis.onProgressHandler) === null || _c === void 0 ? void 0 : _c.call(globalThis, {
58
+ type: "Download",
59
+ addValue: cur,
60
+ addMax: 0,
61
+ });
62
+ }
63
+ return result;
64
+ }
65
+ const g = globalThis;
66
+ let startTime = Date.now();
67
+ globalThis.BOOT_TIME = startTime;
68
+ // Set to the first rootDomain, unless the first import does not have a domain
69
+ let mainRootOrigin = location.origin + location.pathname;
70
+ let isFirstImport = true;
71
+ Symbol.dispose = Symbol.dispose || Symbol("dispose");
72
+ Symbol.asyncDispose = Symbol.asyncDispose || Symbol("asyncDispose");
73
+ // Globals
74
+ Object.assign(window, {
75
+ process: {
76
+ argv: ((_a = window === null || window === void 0 ? void 0 : window.process) === null || _a === void 0 ? void 0 : _a.argv) || [],
77
+ env: {
78
+ // Mirror the tnode.js setting
79
+ NODE_ENV: "production",
80
+ },
81
+ versions: {},
82
+ },
83
+ setImmediate(callback) {
84
+ setTimeout(callback, 0);
85
+ },
86
+ // Ignore flags for now, even though they should work fine if we just hardcoded compileFlags.ts here.
87
+ setFlag() { },
88
+ global: window,
89
+ });
90
+ // Not real modules, as we just define their exports
91
+ const builtInModuleExports = {
92
+ worker_threads: {
93
+ isMainThread: true,
94
+ },
95
+ util: {
96
+ // https://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor
97
+ inherits(constructor, superConstructor) {
98
+ Object.setPrototypeOf(constructor.prototype, superConstructor.prototype);
99
+ },
100
+ TextDecoder: TextDecoder,
101
+ TextEncoder: TextEncoder,
102
+ },
103
+ buffer: { Buffer },
104
+ stream: {
105
+ // HACK: Needed to get SAX JS to work correctly.
106
+ Stream: function () { },
107
+ Transform: function () { },
108
+ },
109
+ timers: {
110
+ // TODO: Add all members of timers
111
+ setImmediate: window.setImmediate,
112
+ },
113
+ child_process: {},
114
+ events: {},
115
+ };
116
+ globalThis.builtInModuleExports = globalThis.builtInModuleExports || {};
117
+ Object.assign(globalThis.builtInModuleExports, builtInModuleExports);
118
+ let lastTime = 0;
119
+ function nextTime() {
120
+ let time = Date.now();
121
+ if (time <= lastTime) {
122
+ // NOTE: We SHOULD really add epsilon, but... this is a lot easier, and is close enough,
123
+ // as times will never have too large of a magnitude.
124
+ time = lastTime + 0.01;
125
+ }
126
+ lastTime = time;
127
+ return time;
128
+ }
129
+ /** @type {{
130
+ [resolvePath: string]: {
131
+ // May be different then the module filename
132
+ filename: string;
133
+ // If a module is not allowed clientside it is likely requests will be empty,
134
+ // to save effort parsing requests for modules that only exist to give better
135
+ // error messages.
136
+ requests: {
137
+ // request => resolvedPath
138
+ [request: string]: string;
139
+ };
140
+ asyncRequests: { [request: string]: true };
141
+ // NOTE: IF !allowclient && !serveronly, it might just mean we didn't add allowclient
142
+ // to the module yet. BUT, if serveronly, then we know for sure we don't want it client.
143
+ // So the messages and behavior will be different.
144
+ allowclient?: boolean;
145
+ serveronly?: boolean;
146
+
147
+ source?: string;
148
+ }
149
+ }} */
150
+ let serializedModules = Object.create(null);
151
+ let moduleCache = Object.create(null);
152
+ let alreadyHave;
153
+ let rootResolveCache = Object.create(null);
154
+ rootRequire.cache = moduleCache;
155
+ // Expose require for debugging, not so it can be called
156
+ g.require = rootRequire;
157
+ g.import = rootRequire;
158
+ g.r = function r(text) {
159
+ text = text.toLowerCase();
160
+ return Object.values(moduleCache).filter((x) => x.filename.toLowerCase().includes(text))[0].exports;
161
+ };
162
+ let requireBatch;
163
+ function rootRequire(request, batch) {
164
+ if (request.includes("file://")) {
165
+ // How does this happen? It definitely breaks things, and we could remove the file://, but... how
166
+ // does it even happen?
167
+ debugger;
168
+ }
169
+ if (isFirstImport) {
170
+ isFirstImport = false;
171
+ if (request.startsWith("https://")) {
172
+ mainRootOrigin = getRootDomain(request);
173
+ }
174
+ }
175
+ if (!request.startsWith("https://")) {
176
+ request = mainRootOrigin + request;
177
+ }
178
+ if (!batch) {
179
+ if (request in rootResolveCache) {
180
+ let resolvedRequest = rootResolveCache[request];
181
+ if (resolvedRequest in rootRequire.cache) {
182
+ return rootRequire.cache[resolvedRequest].exports;
183
+ }
184
+ }
185
+ if (request in rootRequire.cache) {
186
+ return rootRequire.cache[request].exports;
187
+ }
188
+ }
189
+ if (request in builtInModuleExports) {
190
+ return builtInModuleExports[request];
191
+ }
192
+ if (batch) {
193
+ if (!requireBatch) {
194
+ requireBatch = requireBatch || {};
195
+ setTimeout(() => {
196
+ if (!requireBatch)
197
+ throw new Error("Impossible");
198
+ let requests = Object.keys(requireBatch);
199
+ let callbacks = Object.values(requireBatch).reduce((a, b) => a.concat(b), []);
200
+ requireBatch = undefined;
201
+ void rootRequireMultiple(requests).then(() => {
202
+ for (let callback of callbacks) {
203
+ callback();
204
+ }
205
+ }, (err) => {
206
+ throw err;
207
+ });
208
+ }, 0);
209
+ }
210
+ return new Promise((resolve) => {
211
+ if (!requireBatch)
212
+ throw new Error("Impossible");
213
+ requireBatch[request] = requireBatch[request] || [];
214
+ requireBatch[request].push(resolve);
215
+ });
216
+ }
217
+ else {
218
+ return rootRequireMultiple([request]).then((x) => x[0].exports);
219
+ }
220
+ }
221
+ function getRootDomain(request) {
222
+ let url = new URL(request);
223
+ let origin = url.origin;
224
+ // Fix stupid :443 erasure (other ports aren't erased, except 80, but we'll never use HTTP,
225
+ // so that's fine).
226
+ {
227
+ let remaining = request.slice(origin.length);
228
+ if (remaining.startsWith(":443/")) {
229
+ origin += ":443";
230
+ }
231
+ }
232
+ return origin + "/";
233
+ }
234
+ async function rootRequireMultiple(requests) {
235
+ var _a, _b;
236
+ console.log(`%cimport(${requests.join(", ")}) at ${Date.now() - startTime}ms`, "color: orange");
237
+ let time = Date.now();
238
+ let alreadyHaveRanges;
239
+ if (alreadyHave) {
240
+ let seqNums = Object.keys(alreadyHave.seqNums).map((x) => +x);
241
+ seqNums.sort((a, b) => a - b);
242
+ let seqNumRanges = [];
243
+ alreadyHaveRanges = { requireSeqNumProcessId: alreadyHave.requireSeqNumProcessId, seqNumRanges };
244
+ for (let seqNum of seqNums) {
245
+ let prev = seqNumRanges[seqNumRanges.length - 1];
246
+ if ((prev === null || prev === void 0 ? void 0 : prev.e) === seqNum) {
247
+ prev.e++;
248
+ }
249
+ else {
250
+ seqNumRanges.push({ s: seqNum, e: seqNum + 1 });
251
+ }
252
+ }
253
+ for (let range of seqNumRanges) {
254
+ if (range.s + 1 === range.e) {
255
+ delete range.e;
256
+ }
257
+ }
258
+ }
259
+ let domainOrigin = "";
260
+ let originalRequests = requests;
261
+ if (requests.some(x => x.startsWith("https://"))) {
262
+ requests = requests.map((request) => {
263
+ if (!request.startsWith("https://")) {
264
+ throw new Error(`Mixed domains with non-domain requests is not supported presently. Requests: ${requests.join(" | ")}`);
265
+ }
266
+ let origin = getRootDomain(request);
267
+ if (domainOrigin && domainOrigin !== origin) {
268
+ // TODO: If this happens, we can probably just split the call up into multiple calls?
269
+ throw new Error(`Mixed domains in require call is not supported presently. Requests: ${requests.join(" | ")}`);
270
+ }
271
+ domainOrigin = origin;
272
+ // By stripping by length, we can turn https://example.com/./test => "./test"
273
+ // (where as if we used pathname, it would turn into "/test"
274
+ return request.slice(domainOrigin.length);
275
+ });
276
+ }
277
+ let args = [requests, alreadyHaveRanges];
278
+ // We have to add hardcoded support for droppermissions, because... this call
279
+ // doesn't have the conventional persisted code sending code, because... it's
280
+ // all on its own.
281
+ let searchParams = new URLSearchParams(location.search);
282
+ if (searchParams.get("droppermissions") !== null) {
283
+ args.push(true);
284
+ }
285
+ let requestUrlBase = location.origin + location.pathname;
286
+ if (domainOrigin) {
287
+ requestUrlBase = domainOrigin;
288
+ }
289
+ let requestUrl = requestUrlBase + `?classGuid=RequireController-e2f811f3-14b8-4759-b0d6-73f14516cf1d&functionName=getModules`;
290
+ let remapImportRequestsClientside = globalThis.remapImportRequestsClientside;
291
+ if (remapImportRequestsClientside) {
292
+ for (let fnc of remapImportRequestsClientside) {
293
+ args = await fnc(args);
294
+ }
295
+ }
296
+ let rawText = await requestText(requestUrl, { args });
297
+ let resultObj;
298
+ try {
299
+ resultObj = JSON.parse(rawText);
300
+ }
301
+ catch (e) {
302
+ throw new Error(`require(${JSON.stringify(requests)}). Likely a permissions error, possibly fixed by restarting the local http server. Start of response was: ${JSON.stringify(rawText.slice(0, 100))}. Error is: ${e.stack}`);
303
+ }
304
+ let { modules, requestsResolvedPaths, requireSeqNumProcessId, error } = resultObj;
305
+ if (error) {
306
+ let errorObj = new Error();
307
+ errorObj.stack = error;
308
+ throw errorObj;
309
+ }
310
+ if (Object.keys(modules).length === 1 && "" in modules) {
311
+ debugger;
312
+ eval(modules[""].source || "");
313
+ throw new Error(`Failed to find modules for ${originalRequests.join(", ")} (mapped to ${requests.join(", ")})`);
314
+ }
315
+ if (domainOrigin) {
316
+ function fixDomain(request) {
317
+ if (!request)
318
+ return request;
319
+ return domainOrigin + request;
320
+ }
321
+ requests = requests.map(fixDomain);
322
+ for (let [id, module] of Object.entries(modules)) {
323
+ delete modules[id];
324
+ modules[fixDomain(id)] = module;
325
+ module.filename = fixDomain(module.filename);
326
+ module.requests = Object.fromEntries(Object.entries(module.requests).map(([k, v]) => [k, fixDomain(v)]));
327
+ module.originalId = fixDomain(module.originalId);
328
+ }
329
+ requestsResolvedPaths = requestsResolvedPaths.map(fixDomain);
330
+ }
331
+ for (let i = 0; i < requests.length; i++) {
332
+ rootResolveCache[requests[i]] = requestsResolvedPaths[i];
333
+ }
334
+ (_a = globalThis.onProgressHandler) === null || _a === void 0 ? void 0 : _a.call(globalThis, {
335
+ type: "Compile",
336
+ addValue: 0,
337
+ addMax: Object.keys(modules).length,
338
+ });
339
+ // Store the function, so we only call it if it exists BEFORE we import
340
+ // (which means we already have something loading, so this is likely hot reloading...)
341
+ let observerOnHotReload = g.observerOnHotReload;
342
+ setTimeout(() => {
343
+ if (observerOnHotReload) {
344
+ observerOnHotReload();
345
+ }
346
+ }, 0);
347
+ time = Date.now() - time;
348
+ let moduleCount = Object.values(modules).filter((x) => x.source).length;
349
+ let requireModuleCount = Object.values(modules).filter((x) => !x.source).length;
350
+ let dependenciesOnlyText = requireModuleCount ? ` (+${requireModuleCount} dependencies only)` : "";
351
+ console.log(`%cimport(${requests.join(", ")}) finished download ${time.toFixed(0)}ms, ${Math.ceil(rawText.length / 1024)}KB, ${moduleCount} modules${dependenciesOnlyText} at ${(Date.now() - startTime).toFixed(0)}ms`, "color: lightgreen");
352
+ if ((alreadyHave === null || alreadyHave === void 0 ? void 0 : alreadyHave.requireSeqNumProcessId) !== requireSeqNumProcessId) {
353
+ alreadyHave = undefined;
354
+ }
355
+ alreadyHave = alreadyHave || { requireSeqNumProcessId, seqNums: {} };
356
+ for (let id in modules) {
357
+ let module = modules[id];
358
+ alreadyHave.seqNums[module.seqNum] = 1;
359
+ serializedModules[id] = module;
360
+ }
361
+ time = Date.now();
362
+ let lastWaitTime = time;
363
+ for (let key of Object.keys(modules)) {
364
+ getModule(key, "preload");
365
+ // Wait, so we can render progress (and in generals, so the UI remains somewhat responsive)
366
+ if (Date.now() - lastWaitTime > 10) {
367
+ await new Promise(resolve => setTimeout(resolve, 0));
368
+ lastWaitTime = Date.now();
369
+ }
370
+ }
371
+ time = Date.now() - time;
372
+ console.log(`%cimport(${requests.join(", ")}) finished compile ${time.toFixed(0)}ms (${moduleCount} modules) at ${(Date.now() - startTime).toFixed(0)}ms`, "color: hotpink");
373
+ (_b = globalThis.onProgressHandler) === null || _b === void 0 ? void 0 : _b.call(globalThis, {
374
+ type: "Evaluate",
375
+ addValue: 0,
376
+ addMax: Object.keys(modules).length,
377
+ });
378
+ time = Date.now();
379
+ try {
380
+ return requestsResolvedPaths.map((x) => getModule(x));
381
+ }
382
+ finally {
383
+ time = Date.now() - time;
384
+ console.log(`%cimport(${requests.join(", ")}) finished evaluate ${time.toFixed(0)}ms (${moduleCount} modules) at ${(Date.now() - startTime).toFixed(0)}ms`, "color: lightblue");
385
+ }
386
+ }
387
+ function createRequire(module, serializedModule, asyncIsFineOuter) {
388
+ require.cache = moduleCache;
389
+ // Dynamically get folder, incase our filename changes
390
+ function getModuleFolder() {
391
+ return module.filename.replace(/\\/g, "/").split("/").slice(0, -1).join("/") + "/";
392
+ }
393
+ function resolve(request) {
394
+ let requests = serializedModule.requests;
395
+ if (request in requests) {
396
+ return requests[request];
397
+ }
398
+ let absolutePath = request;
399
+ if (absolutePath.startsWith("./") || absolutePath.startsWith("../")) {
400
+ let folderParts = getModuleFolder().split("/");
401
+ while (absolutePath.startsWith("./") || absolutePath.startsWith("../")) {
402
+ if (absolutePath.startsWith("./")) {
403
+ absolutePath = absolutePath.slice("./".length);
404
+ }
405
+ else {
406
+ folderParts.pop();
407
+ absolutePath = absolutePath.slice("../".length);
408
+ }
409
+ }
410
+ absolutePath = folderParts.join("/") + "/" + absolutePath;
411
+ }
412
+ // Still use the same domain
413
+ if (!absolutePath.startsWith("https://")) {
414
+ absolutePath = mainRootOrigin + absolutePath;
415
+ }
416
+ return absolutePath;
417
+ }
418
+ require.resolve = resolve;
419
+ return require;
420
+ function require(request, asyncIsFine) {
421
+ var _a, _b;
422
+ if (asyncIsFineOuter) {
423
+ asyncIsFine = true;
424
+ }
425
+ if (typeof asyncIsFine !== "boolean") {
426
+ asyncIsFine = false;
427
+ }
428
+ if (request in serializedModule.asyncRequests) {
429
+ asyncIsFine = true;
430
+ }
431
+ if (request in builtInModuleExports) {
432
+ return builtInModuleExports[request];
433
+ }
434
+ let absolutePath = resolve(request);
435
+ let resolvedPath;
436
+ if (request in moduleCache) {
437
+ resolvedPath = request;
438
+ }
439
+ else if (absolutePath in moduleCache) {
440
+ resolvedPath = absolutePath;
441
+ }
442
+ else {
443
+ if (!(request in serializedModule.requests)) {
444
+ if (!asyncIsFine && !globalThis.suppressUnexpectedModuleWarning) {
445
+ console.warn(`Accessed unexpected module %c${request}%c in %c${module.id}%c\n\tTreating it as an async require.\n\tAll modules require synchronously clientside must be required serverside at a module level. Expected imports: ${Object.keys(serializedModule.requests).join(" | ")}`, "color: red", "color: unset", "color: red", "color: unset");
446
+ }
447
+ return rootRequire(absolutePath);
448
+ }
449
+ // Built in modules that we haven't been implemented
450
+ if (serializedModule.requests[request] === "") {
451
+ return {};
452
+ }
453
+ resolvedPath = serializedModule.requests[request];
454
+ }
455
+ if (resolvedPath !== "NOTALLOWEDCLIENTSIDE" && !serializedModules[resolvedPath]) {
456
+ if (!asyncIsFine) {
457
+ console.warn(`Accessed unexpected module %c${request}%c in %c${module.id}%c\n\tTreating it as an async require.\n\tAll modules require synchronously clientside must be required serverside at a module level. Expected imports: ${Object.keys(serializedModule.requests).join(" | ")}`, "color: red", "color: unset", "color: red", "color: unset");
458
+ }
459
+ return rootRequire(resolvedPath);
460
+ }
461
+ let exportsOverride;
462
+ if (resolvedPath === "NOTALLOWEDCLIENTSIDE" || !((_a = serializedModules[resolvedPath]) === null || _a === void 0 ? void 0 : _a.allowclient)) {
463
+ let childId = resolvedPath === "NOTALLOWEDCLIENTSIDE" ? request : resolvedPath;
464
+ if ((_b = serializedModules[resolvedPath]) === null || _b === void 0 ? void 0 : _b.serveronly) {
465
+ exportsOverride = new Proxy({}, {
466
+ get(target, property) {
467
+ if (property === "__esModule")
468
+ return undefined;
469
+ // NOTE: Return a toString that evaluates to "" so we can EXPLICITLY detect non-loaded modules
470
+ if (property === unloadedModule)
471
+ return true;
472
+ if (property === "default")
473
+ return exportsOverride;
474
+ throw new Error(`Module ${childId} is serverside only. Tried to access ${String(property)} from ${module.id}`);
475
+ },
476
+ });
477
+ }
478
+ else {
479
+ exportsOverride = new Proxy({}, {
480
+ get(target, property) {
481
+ if (property === "__esModule")
482
+ return undefined;
483
+ // NOTE: Return a toString that evaluates to "" so we can EXPLICITLY detect non-loaded modules
484
+ if (property === unloadedModule)
485
+ return true;
486
+ if (property === "default")
487
+ return exportsOverride;
488
+ let type = "non-whitelisted";
489
+ if (!serializedModules[resolvedPath]) {
490
+ type = "missing module";
491
+ }
492
+ console.warn(`Accessed ${type} module %c${childId}%c, specifically property %c${String(property)}%c.\n\tAdd %cmodule.allowclient = true%c to the file to allow access.\n\t(IF it is a 3rd party library, use the global "setFlag" helper (in the file you imported the module) to set properties on other modules (it can even recursively set properties)).\n\n\tFrom ${module.id}`, "color: red", "color: unset", "color: red", "color: unset", "color: red", "color: unset");
493
+ return undefined;
494
+ },
495
+ });
496
+ }
497
+ }
498
+ if (resolvedPath === "NOTALLOWEDCLIENTSIDE") {
499
+ return exportsOverride;
500
+ }
501
+ let providerModule = getModule(resolvedPath);
502
+ module.children.push(providerModule);
503
+ if (exportsOverride !== undefined) {
504
+ providerModule.exports = exportsOverride;
505
+ }
506
+ let exports = providerModule.exports;
507
+ let remapExports = providerModule.remapExports;
508
+ if (remapExports && typeof remapExports === "function") {
509
+ exports = remapExports(exports, module);
510
+ }
511
+ return exports;
512
+ }
513
+ }
514
+ /** Generates the module root function, which can be called to evaluate the module,
515
+ * and has code equal to contents.
516
+ * - filename is just for debugging / stack traces
517
+ */
518
+ function wrapSafe(filename, contents) {
519
+ // TODO: Have the serverside inform us of the correct loader, or... have it actually emit a .json loader.
520
+ if (filename.endsWith(".json")) {
521
+ return (exports, require, module) => (module.exports = contents && JSON.parse(contents));
522
+ }
523
+ // NOTE: debugName only matters during module evaluation. After that the sourcemap should work.
524
+ let debugName = filename
525
+ .replace(/\\/g, "/")
526
+ .split("/")
527
+ .slice(-1)[0]
528
+ .replace(/\./g, "_")
529
+ .replace(/[^a-zA-Z_]/g, "");
530
+ // NOTE: eval is used instead of new Function, as new Function inject lines, which messes
531
+ // up our sourcemaps.
532
+ // NOTE: All on one line, so we don't break sourcemaps by TOO much. We could also parse
533
+ // the sourcemap and adjust it, but... it is much easier to just not change the line counts.
534
+ return eval(`(function ${debugName}(exports, require, module, __filename, __dirname, importDynamic) {"use strict";${contents}\n })`);
535
+ }
536
+ const unloadedModule = Symbol("unloadedModule");
537
+ let currentModuleEvaluationStack = [];
538
+ // See https://nodejs.org/api/modules.html
539
+ function getModule(resolvedId, preload) {
540
+ var _a;
541
+ if (resolvedId === "") {
542
+ return {};
543
+ }
544
+ if (resolvedId in moduleCache) {
545
+ let module = moduleCache[resolvedId];
546
+ if (!preload && !module.loaded) {
547
+ module.loaded = true;
548
+ module.load();
549
+ }
550
+ return module;
551
+ }
552
+ let serializedModule = serializedModules[resolvedId];
553
+ if (!serializedModule) {
554
+ // I can't figure out why this happens as it seems to happen very rarely and only when I'm debugging other code.
555
+ // - I have had it happen immediately after starting the app. Although in theory a hot reload could have
556
+ // triggered due to VS code writing to a file.
557
+ // - I've had times when it happens once after startup and then it goes away and other times where it
558
+ // happens every single time and never goes away until I restart aipaint.
559
+ // - Maybe it happens if we switch servers and so the root paths are different in some way?
560
+ debugger;
561
+ console.warn(`Failed to find module ${resolvedId}. The server should have given an error about this.`, serializedModules);
562
+ }
563
+ let module = Object.create(null);
564
+ moduleCache[resolvedId] = module;
565
+ module.id = resolvedId;
566
+ module.filename = (serializedModule === null || serializedModule === void 0 ? void 0 : serializedModule.filename) || "";
567
+ module.exports = {};
568
+ // Default default of exports to the exports itself
569
+ module.exports.default = module.exports;
570
+ module.children = [];
571
+ for (let key in (serializedModule === null || serializedModule === void 0 ? void 0 : serializedModule.flags) || {}) {
572
+ if (key === "loaded")
573
+ continue;
574
+ module[key] = true;
575
+ }
576
+ module.load = load;
577
+ let originalSource = (serializedModule === null || serializedModule === void 0 ? void 0 : serializedModule.source) || "";
578
+ let moduleFnc = wrapSafe(module.id, originalSource);
579
+ (_a = globalThis.onProgressHandler) === null || _a === void 0 ? void 0 : _a.call(globalThis, {
580
+ type: "Compile",
581
+ addValue: 1,
582
+ addMax: 0,
583
+ });
584
+ if (!preload) {
585
+ module.loaded = true;
586
+ module.load();
587
+ }
588
+ function load() {
589
+ var _a;
590
+ const serializedModule = serializedModules[resolvedId];
591
+ if (!serializedModule)
592
+ return;
593
+ if (!module.loaded) {
594
+ module.evaluateStarted = false;
595
+ if (alreadyHave) {
596
+ delete alreadyHave.seqNums[serializedModule.seqNum];
597
+ }
598
+ // NOTE: There is almost never a way to recover from module downloading errors, so just don't catch them
599
+ return Promise.resolve()
600
+ .then(() => rootRequire(resolvedId, true))
601
+ .then(async () => {
602
+ module.loaded = true;
603
+ await load();
604
+ });
605
+ }
606
+ // Skip double loads
607
+ if (module.evaluateStarted)
608
+ return;
609
+ module.original = serializedModule;
610
+ module.requires = serializedModule.requests;
611
+ module.require = createRequire(module, serializedModule);
612
+ // TODO: Once typescript supports dynamic import, map import() to importDynamic, so it
613
+ // uses our import function, instead of the built in one.
614
+ // (As apparently we can't just override import on a per module basis, because
615
+ // we can't have an identify called "import"... which is annoying).
616
+ let importDynamic = createRequire(module, serializedModule, true);
617
+ module.import = importDynamic;
618
+ let source = serializedModule.source;
619
+ module.allowclient = !!serializedModule.source;
620
+ // Import children, as the children may be allowed clientside, and may have side-effects!
621
+ if (!source) {
622
+ let requests = Object.keys(serializedModule.requests)
623
+ .filter((x) => x !== "NOTALLOWEDCLIENTSIDE")
624
+ .filter((x) => !(x in serializedModule.asyncRequests));
625
+ source = requests.map((id) => `require(${JSON.stringify(id)});\n`).join("");
626
+ }
627
+ module.size = source.length;
628
+ module.source = source;
629
+ if (source !== originalSource) {
630
+ originalSource = source;
631
+ moduleFnc = wrapSafe(module.id, originalSource);
632
+ }
633
+ let dirname = module.filename.replace(/\\/g, "/").split("/").slice(0, -1).join("/");
634
+ let time = Date.now();
635
+ currentModuleEvaluationStack.push(module.filename);
636
+ try {
637
+ module.evaluateStarted = true;
638
+ module.isPreloading = true;
639
+ module.evalStartTime = nextTime();
640
+ module.evalEndTime = undefined;
641
+ moduleFnc.call({
642
+ // NOTE: Adding __importStar to the module causes typescript to use our implementation,
643
+ // which checks for unloadedModule and returns undefined in that case.
644
+ __importStar(mod) {
645
+ if (mod[unloadedModule])
646
+ return undefined;
647
+ return mod;
648
+ },
649
+ __importDefault(mod) {
650
+ return mod.default ? mod : { default: mod };
651
+ },
652
+ }, module.exports,
653
+ // eslint-disable-next-line @typescript-eslint/unbound-method
654
+ module.require, module, module.filename, dirname, importDynamic);
655
+ module.evalEndTime = nextTime();
656
+ time = Date.now() - time;
657
+ // NOTE: This log statment is disabled as I believe it causes lag (when devtools is open).
658
+ // As in, adding about 500ms to our load time, which is annoying when debugging.
659
+ //console.debug(`Evaluated module ${module.filename} ${Math.ceil(source.length / 1024)}KB`);
660
+ }
661
+ finally {
662
+ module.isPreloading = false;
663
+ currentModuleEvaluationStack.pop();
664
+ (_a = globalThis.onProgressHandler) === null || _a === void 0 ? void 0 : _a.call(globalThis, {
665
+ type: "Evaluate",
666
+ addValue: 1,
667
+ addMax: 0,
668
+ });
669
+ }
670
+ }
671
+ return module;
672
+ }
673
+ }
674
+ exports.requireMain = requireMain;
675
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWlyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJlcXVpcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdDQUF3Qzs7O0FBb0J4QyxTQUFnQixXQUFXOztJQUN2QixLQUFLLFVBQVUsV0FBVyxDQUFDLFFBQWdCLEVBQUUsTUFBVzs7UUFDcEQsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFNUIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxJQUFJLFFBQWtCLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDO1lBQ3JCLG9GQUFvRjtZQUNwRixvRUFBb0U7WUFDcEUsS0FBSyxJQUFJLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDckIsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDbkMsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsV0FBVyxFQUFFLFNBQVM7YUFDekIsQ0FBQyxDQUFDO1FBQ1AsQ0FBQzthQUFNLENBQUM7WUFDSixRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNuQyxNQUFNLEVBQUUsTUFBTTtnQkFDZCxJQUFJLEVBQUUsSUFBSTtnQkFDVixXQUFXLEVBQUUsU0FBUzthQUN6QixDQUFDLENBQUM7UUFDUCxDQUFDO1FBRUQsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDekIsSUFBSSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQy9FLElBQUksZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM5RCxJQUFJLGtCQUFrQixJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDekMsZ0JBQWdCLEdBQUcsQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLGdCQUFnQixDQUFDO1FBQy9ELENBQUM7UUFDRCxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsa0JBQWtCLElBQUksZ0JBQWdCLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDakUsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNkLE1BQUEsVUFBVSxDQUFDLGlCQUFpQiwyREFBRztnQkFDM0IsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLFFBQVEsRUFBRSxDQUFDO2dCQUNYLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQzthQUNyRCxDQUFDLENBQUM7UUFDUCxDQUFDO1FBRUQscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDZixNQUFBLFVBQVUsQ0FBQyxjQUFjLDJEQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBRUQsbUNBQW1DO1FBQ25DLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDeEMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDVixJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzFDLElBQUksSUFBSTtnQkFBRSxNQUFNO1lBQ2hCLE1BQU0sSUFBSSxJQUFJLFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUEsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLE1BQU0sS0FBSSxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQztZQUNsRCxNQUFBLFVBQVUsQ0FBQyxpQkFBaUIsMkRBQUc7Z0JBQzNCLElBQUksRUFBRSxVQUFVO2dCQUNoQixRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsQ0FBQzthQUNaLENBQUMsQ0FBQztRQUNQLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQUcsVUFBaUIsQ0FBQztJQUM1QixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDM0IsVUFBVSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFFakMsOEVBQThFO0lBQzlFLElBQUksY0FBYyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUN6RCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUM7SUFFeEIsTUFBYyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3RCxNQUFjLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRTdFLFVBQVU7SUFDVixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtRQUNsQixPQUFPLEVBQUU7WUFDTCxJQUFJLEVBQUUsQ0FBQSxNQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxPQUFPLDBDQUFFLElBQUksS0FBSSxFQUFFO1lBQ2pDLEdBQUcsRUFBRTtnQkFDRCw4QkFBOEI7Z0JBQzlCLFFBQVEsRUFBRSxZQUFZO2FBQ3pCO1lBQ0QsUUFBUSxFQUFFLEVBQUU7U0FDZjtRQUNELFlBQVksQ0FBQyxRQUFvQjtZQUM3QixVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxxR0FBcUc7UUFDckcsT0FBTyxLQUFLLENBQUM7UUFDYixNQUFNLEVBQUUsTUFBTTtLQUNqQixDQUFDLENBQUM7SUFFSCxvREFBb0Q7SUFDcEQsTUFBTSxvQkFBb0IsR0FBRztRQUN6QixjQUFjLEVBQUU7WUFDWixZQUFZLEVBQUUsSUFBSTtTQUNyQjtRQUNELElBQUksRUFBRTtZQUNGLG1GQUFtRjtZQUNuRixRQUFRLENBQUMsV0FBZ0IsRUFBRSxnQkFBcUI7Z0JBQzVDLE1BQU0sQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3RSxDQUFDO1lBQ0QsV0FBVyxFQUFFLFdBQVc7WUFDeEIsV0FBVyxFQUFFLFdBQVc7U0FDM0I7UUFDRCxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUU7UUFDbEIsTUFBTSxFQUFFO1lBQ0osZ0RBQWdEO1lBQ2hELE1BQU0sRUFBRSxjQUFjLENBQUM7WUFDdkIsU0FBUyxFQUFFLGNBQWMsQ0FBQztTQUM3QjtRQUNELE1BQU0sRUFBRTtZQUNKLGtDQUFrQztZQUNsQyxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVk7U0FDcEM7UUFDRCxhQUFhLEVBQUUsRUFBRTtRQUNqQixNQUFNLEVBQUUsRUFBRTtLQUNiLENBQUM7SUFDRixVQUFVLENBQUMsb0JBQW9CLEdBQUcsVUFBVSxDQUFDLG9CQUFvQixJQUFJLEVBQUUsQ0FBQztJQUN4RSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBRXJFLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztJQUNqQixTQUFTLFFBQVE7UUFDYixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7WUFDbkIsd0ZBQXdGO1lBQ3hGLHNEQUFzRDtZQUN0RCxJQUFJLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQztRQUMzQixDQUFDO1FBQ0QsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNoQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBb0JLO0lBQ0wsSUFBSSxpQkFBaUIsR0FBbUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQXFCNUYsSUFBSSxXQUFXLEdBQWlDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEUsSUFBSSxXQUdTLENBQUM7SUFFZCxJQUFJLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFM0MsV0FBVyxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUM7SUFDaEMsd0RBQXdEO0lBQ3hELENBQUMsQ0FBQyxPQUFPLEdBQUcsV0FBVyxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO0lBRXZCLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsSUFBWTtRQUN6QixJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQ3hHLENBQUMsQ0FBQztJQUVGLElBQUksWUFBK0QsQ0FBQztJQUNwRSxTQUFTLFdBQVcsQ0FBQyxPQUFlLEVBQUUsS0FBZTtRQUNqRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM5QixpR0FBaUc7WUFDakcsd0JBQXdCO1lBQ3hCLFFBQVEsQ0FBQztRQUNiLENBQUM7UUFDRCxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2hCLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDdEIsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLGNBQWMsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sR0FBRyxjQUFjLEdBQUcsT0FBTyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDVCxJQUFJLE9BQU8sSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUM5QixJQUFJLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDaEQsSUFBSSxlQUFlLElBQUksV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUN2QyxPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUN0RCxDQUFDO1lBQ0wsQ0FBQztZQUVELElBQUksT0FBTyxJQUFJLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDL0IsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUM5QyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksT0FBTyxJQUFJLG9CQUFvQixFQUFFLENBQUM7WUFDbEMsT0FBTyxvQkFBb0IsQ0FBQyxPQUE0QyxDQUFDLENBQUM7UUFDOUUsQ0FBQztRQUNELElBQUksS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2hCLFlBQVksR0FBRyxZQUFZLElBQUksRUFBRSxDQUFDO2dCQUNsQyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNaLElBQUksQ0FBQyxZQUFZO3dCQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ2pELElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ3pDLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDOUUsWUFBWSxHQUFHLFNBQVMsQ0FBQztvQkFDekIsS0FBSyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQ25DLEdBQUcsRUFBRTt3QkFDRCxLQUFLLElBQUksUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDOzRCQUM3QixRQUFRLEVBQUUsQ0FBQzt3QkFDZixDQUFDO29CQUNMLENBQUMsRUFDRCxDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUNKLE1BQU0sR0FBRyxDQUFDO29CQUNkLENBQUMsQ0FDSixDQUFDO2dCQUNOLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNWLENBQUM7WUFDRCxPQUFPLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxZQUFZO29CQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ2pELFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNwRCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLG1CQUFtQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwRSxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVMsYUFBYSxDQUFDLE9BQWU7UUFDbEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0IsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUN4QiwyRkFBMkY7UUFDM0Ysb0JBQW9CO1FBQ3BCLENBQUM7WUFDRyxJQUFJLFNBQVMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxJQUFJLE1BQU0sQ0FBQztZQUNyQixDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sTUFBTSxHQUFHLEdBQUcsQ0FBQztJQUN4QixDQUFDO0lBRUQsS0FBSyxVQUFVLG1CQUFtQixDQUFDLFFBQWtCOztRQUNqRCxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFaEcsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXRCLElBQUksaUJBQWlCLENBQUM7UUFDdEIsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNkLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzlCLElBQUksWUFBWSxHQUFnQyxFQUFFLENBQUM7WUFDbkQsaUJBQWlCLEdBQUcsRUFBRSxzQkFBc0IsRUFBRSxXQUFXLENBQUMsc0JBQXNCLEVBQUUsWUFBWSxFQUFFLENBQUM7WUFDakcsS0FBSyxJQUFJLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxJQUFJLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsQ0FBQyxNQUFLLE1BQU0sRUFBRSxDQUFDO29CQUNyQixJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2IsQ0FBQztxQkFBTSxDQUFDO29CQUNKLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEQsQ0FBQztZQUNMLENBQUM7WUFDRCxLQUFLLElBQUksS0FBSyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUM3QixJQUFJLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDMUIsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNuQixDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7UUFDaEMsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0MsUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztvQkFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRkFBZ0YsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzVILENBQUM7Z0JBQ0QsSUFBSSxNQUFNLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLFlBQVksSUFBSSxZQUFZLEtBQUssTUFBTSxFQUFFLENBQUM7b0JBQzFDLHFGQUFxRjtvQkFDckYsTUFBTSxJQUFJLEtBQUssQ0FBQyx1RUFBdUUsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ25ILENBQUM7Z0JBQ0QsWUFBWSxHQUFHLE1BQU0sQ0FBQztnQkFDdEIsNkVBQTZFO2dCQUM3RSw2REFBNkQ7Z0JBQzdELE9BQU8sT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBRUQsSUFBSSxJQUFJLEdBQW1CLENBQUMsUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDekQsNkVBQTZFO1FBQzdFLDhFQUE4RTtRQUM5RSxtQkFBbUI7UUFDbkIsSUFBSSxZQUFZLEdBQUcsSUFBSSxlQUFlLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hELElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUVELElBQUksY0FBYyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUN6RCxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2YsY0FBYyxHQUFHLFlBQVksQ0FBQztRQUNsQyxDQUFDO1FBQ0QsSUFBSSxVQUFVLEdBQUcsY0FBYyxHQUFHLDJGQUEyRixDQUFDO1FBRTlILElBQUksNkJBQTZCLEdBQUcsVUFBVSxDQUFDLDZCQUE2QixDQUFDO1FBQzdFLElBQUksNkJBQTZCLEVBQUUsQ0FBQztZQUNoQyxLQUFLLElBQUksR0FBRyxJQUFJLDZCQUE2QixFQUFFLENBQUM7Z0JBQzVDLElBQUksR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksT0FBTyxHQUFHLE1BQU0sV0FBVyxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEQsSUFBSSxTQUtILENBQUM7UUFDRixJQUFJLENBQUM7WUFDRCxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyw2R0FBNkcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ25PLENBQUM7UUFDRCxJQUFJLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLEtBQUssRUFBRSxHQUFHLFNBQVMsQ0FBQztRQUVsRixJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1IsSUFBSSxRQUFRLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUMzQixRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUN2QixNQUFNLFFBQVEsQ0FBQztRQUNuQixDQUFDO1FBR0QsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ3JELFFBQVEsQ0FBQztZQUNULElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwSCxDQUFDO1FBR0QsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNmLFNBQVMsU0FBUyxDQUFDLE9BQWU7Z0JBQzlCLElBQUksQ0FBQyxPQUFPO29CQUFFLE9BQU8sT0FBTyxDQUFDO2dCQUM3QixPQUFPLFlBQVksR0FBRyxPQUFPLENBQUM7WUFDbEMsQ0FBQztZQUNELFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25DLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQy9DLE9BQU8sT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNuQixPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO2dCQUNoQyxNQUFNLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzdDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6RyxNQUFNLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUNELHFCQUFxQixHQUFHLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBR0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBRUQsTUFBQSxVQUFVLENBQUMsaUJBQWlCLDJEQUFHO1lBQzNCLElBQUksRUFBRSxTQUFTO1lBQ2YsUUFBUSxFQUFFLENBQUM7WUFDWCxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNO1NBQ3RDLENBQUMsQ0FBQztRQUVILHVFQUF1RTtRQUN2RSx1RkFBdUY7UUFDdkYsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLENBQUMsbUJBQW1CLENBQUM7UUFDaEQsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksbUJBQW1CLEVBQUUsQ0FBQztnQkFDdEIsbUJBQW1CLEVBQUUsQ0FBQztZQUMxQixDQUFDO1FBQ0wsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRU4sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDeEUsSUFBSSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ2hGLElBQUksb0JBQW9CLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sa0JBQWtCLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkcsT0FBTyxDQUFDLEdBQUcsQ0FDUCxZQUFZLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQ2pGLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUN4QixPQUFPLFdBQVcsV0FBVyxvQkFBb0IsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFDaEcsbUJBQW1CLENBQ3RCLENBQUM7UUFJRixJQUFJLENBQUEsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLHNCQUFzQixNQUFLLHNCQUFzQixFQUFFLENBQUM7WUFDakUsV0FBVyxHQUFHLFNBQVMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsV0FBVyxHQUFHLFdBQVcsSUFBSSxFQUFFLHNCQUFzQixFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUVyRSxLQUFLLElBQUksRUFBRSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ3JCLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QixXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ25DLENBQUM7UUFFRCxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQztRQUN4QixLQUFLLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxTQUFTLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzFCLDJGQUEyRjtZQUMzRixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxZQUFZLEdBQUcsRUFBRSxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDOUIsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztRQUN6QixPQUFPLENBQUMsR0FBRyxDQUNQLFlBQVksUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sV0FBVyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQzdJLGdCQUFnQixDQUNuQixDQUFDO1FBR0YsTUFBQSxVQUFVLENBQUMsaUJBQWlCLDJEQUFHO1lBQzNCLElBQUksRUFBRSxVQUFVO1lBQ2hCLFFBQVEsRUFBRSxDQUFDO1lBQ1gsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTTtTQUN0QyxDQUFDLENBQUM7UUFFSCxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQztZQUNELE9BQU8scUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxDQUFDO2dCQUFTLENBQUM7WUFDUCxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztZQUN6QixPQUFPLENBQUMsR0FBRyxDQUNQLFlBQVksUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sV0FBVyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQzlJLGtCQUFrQixDQUNyQixDQUFDO1FBQ04sQ0FBQztJQUNMLENBQUM7SUFFRCxTQUFTLGFBQWEsQ0FBQyxNQUFrQixFQUFFLGdCQUFrQyxFQUFFLGdCQUEwQjtRQUNyRyxPQUFPLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQztRQUM1QixzREFBc0Q7UUFDdEQsU0FBUyxlQUFlO1lBQ3BCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN2RixDQUFDO1FBQ0QsU0FBUyxPQUFPLENBQUMsT0FBZTtZQUM1QixJQUFJLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7WUFDekMsSUFBSSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQ3RCLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdCLENBQUM7WUFDRCxJQUFJLFlBQVksR0FBRyxPQUFPLENBQUM7WUFDM0IsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEUsSUFBSSxXQUFXLEdBQUcsZUFBZSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMvQyxPQUFPLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNyRSxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzt3QkFDaEMsWUFBWSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNuRCxDQUFDO3lCQUFNLENBQUM7d0JBQ0osV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNsQixZQUFZLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ3BELENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxZQUFZLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsWUFBWSxDQUFDO1lBQzlELENBQUM7WUFDRCw0QkFBNEI7WUFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsWUFBWSxHQUFHLGNBQWMsR0FBRyxZQUFZLENBQUM7WUFDakQsQ0FBQztZQUNELE9BQU8sWUFBWSxDQUFDO1FBQ3hCLENBQUM7UUFDRCxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUMxQixPQUFPLE9BQU8sQ0FBQztRQUNmLFNBQVMsT0FBTyxDQUFDLE9BQWUsRUFBRSxXQUFxQjs7WUFDbkQsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNuQixXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxJQUFJLE9BQU8sV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNuQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLENBQUM7WUFDRCxJQUFJLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDNUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN2QixDQUFDO1lBQ0QsSUFBSSxPQUFPLElBQUksb0JBQW9CLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxvQkFBb0IsQ0FBQyxPQUE0QyxDQUFDLENBQUM7WUFDOUUsQ0FBQztZQUVELElBQUksWUFBWSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVwQyxJQUFJLFlBQWdDLENBQUM7WUFDckMsSUFBSSxPQUFPLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ3pCLFlBQVksR0FBRyxPQUFPLENBQUM7WUFDM0IsQ0FBQztpQkFBTSxJQUFJLFlBQVksSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDckMsWUFBWSxHQUFHLFlBQVksQ0FBQztZQUNoQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7b0JBQzFDLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxVQUFVLENBQUMsK0JBQStCLEVBQUUsQ0FBQzt3QkFDOUQsT0FBTyxDQUFDLElBQUksQ0FDUixnQ0FBZ0MsT0FBTyxXQUFXLE1BQU0sQ0FBQyxFQUFFLDJKQUEySixNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUMxUSxZQUFZLEVBQ1osY0FBYyxFQUNkLFlBQVksRUFDWixjQUFjLENBQ2pCLENBQUM7b0JBQ04sQ0FBQztvQkFDRCxPQUFPLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDckMsQ0FBQztnQkFFRCxvREFBb0Q7Z0JBQ3BELElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO29CQUM1QyxPQUFPLEVBQUUsQ0FBQztnQkFDZCxDQUFDO2dCQUVELFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEQsQ0FBQztZQUNELElBQUksWUFBWSxLQUFLLHNCQUFzQixJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDOUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNmLE9BQU8sQ0FBQyxJQUFJLENBQ1IsZ0NBQWdDLE9BQU8sV0FBVyxNQUFNLENBQUMsRUFBRSwySkFBMkosTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFDMVEsWUFBWSxFQUNaLGNBQWMsRUFDZCxZQUFZLEVBQ1osY0FBYyxDQUNqQixDQUFDO2dCQUNOLENBQUM7Z0JBQ0QsT0FBTyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDckMsQ0FBQztZQUVELElBQUksZUFBb0MsQ0FBQztZQUN6QyxJQUFJLFlBQVksS0FBSyxzQkFBc0IsSUFBSSxDQUFDLENBQUEsTUFBQSxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsMENBQUUsV0FBVyxDQUFBLEVBQUUsQ0FBQztnQkFDM0YsSUFBSSxPQUFPLEdBQUcsWUFBWSxLQUFLLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztnQkFDL0UsSUFBSSxNQUFBLGlCQUFpQixDQUFDLFlBQVksQ0FBQywwQ0FBRSxVQUFVLEVBQUUsQ0FBQztvQkFDOUMsZUFBZSxHQUFHLElBQUksS0FBSyxDQUN2QixFQUFFLEVBQ0Y7d0JBQ0ksR0FBRyxDQUFDLE1BQU0sRUFBRSxRQUFROzRCQUNoQixJQUFJLFFBQVEsS0FBSyxZQUFZO2dDQUFFLE9BQU8sU0FBUyxDQUFDOzRCQUNoRCw4RkFBOEY7NEJBQzlGLElBQUksUUFBUSxLQUFLLGNBQWM7Z0NBQUUsT0FBTyxJQUFJLENBQUM7NEJBQzdDLElBQUksUUFBUSxLQUFLLFNBQVM7Z0NBQUUsT0FBTyxlQUFlLENBQUM7NEJBRW5ELE1BQU0sSUFBSSxLQUFLLENBQ1gsVUFBVSxPQUFPLHdDQUF3QyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUNoRyxDQUFDO3dCQUNOLENBQUM7cUJBQ0osQ0FDSixDQUFDO2dCQUNOLENBQUM7cUJBQU0sQ0FBQztvQkFDSixlQUFlLEdBQUcsSUFBSSxLQUFLLENBQ3ZCLEVBQUUsRUFDRjt3QkFDSSxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVE7NEJBQ2hCLElBQUksUUFBUSxLQUFLLFlBQVk7Z0NBQUUsT0FBTyxTQUFTLENBQUM7NEJBQ2hELDhGQUE4Rjs0QkFDOUYsSUFBSSxRQUFRLEtBQUssY0FBYztnQ0FBRSxPQUFPLElBQUksQ0FBQzs0QkFDN0MsSUFBSSxRQUFRLEtBQUssU0FBUztnQ0FBRSxPQUFPLGVBQWUsQ0FBQzs0QkFFbkQsSUFBSSxJQUFJLEdBQUcsaUJBQWlCLENBQUM7NEJBQzdCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFhLENBQUMsRUFBRSxDQUFDO2dDQUNwQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7NEJBQzVCLENBQUM7NEJBRUQsT0FBTyxDQUFDLElBQUksQ0FDUixZQUFZLElBQUksYUFBYSxPQUFPLCtCQUErQixNQUFNLENBQ3JFLFFBQVEsQ0FDWCx5UUFBeVEsTUFBTSxDQUFDLEVBQ2pSLEVBQUUsRUFDRixZQUFZLEVBQ1osY0FBYyxFQUNkLFlBQVksRUFDWixjQUFjLEVBQ2QsWUFBWSxFQUNaLGNBQWMsQ0FDakIsQ0FBQzs0QkFDRixPQUFPLFNBQVMsQ0FBQzt3QkFDckIsQ0FBQztxQkFDSixDQUNKLENBQUM7Z0JBQ04sQ0FBQztZQUNMLENBQUM7WUFFRCxJQUFJLFlBQVksS0FBSyxzQkFBc0IsRUFBRSxDQUFDO2dCQUMxQyxPQUFPLGVBQWUsQ0FBQztZQUMzQixDQUFDO1lBRUQsSUFBSSxjQUFjLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzdDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3JDLElBQUksZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNoQyxjQUFjLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQztZQUM3QyxDQUFDO1lBRUQsSUFBSSxPQUFPLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQztZQUNyQyxJQUFJLFlBQVksR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDO1lBQy9DLElBQUksWUFBWSxJQUFJLE9BQU8sWUFBWSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUNyRCxPQUFPLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBRUQsT0FBTyxPQUFPLENBQUM7UUFDbkIsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLFFBQVEsQ0FBQyxRQUFnQixFQUFFLFFBQWdCO1FBQ2hELHlHQUF5RztRQUN6RyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLENBQUMsT0FBZ0IsRUFBRSxPQUFnQixFQUFFLE1BQWtCLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQzNILENBQUM7UUFFRCwrRkFBK0Y7UUFDL0YsSUFBSSxTQUFTLEdBQUcsUUFBUTthQUNuQixPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQzthQUNuQixLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ1YsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ1osT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7YUFDbkIsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNoQyx5RkFBeUY7UUFDekYsc0JBQXNCO1FBQ3RCLHVGQUF1RjtRQUN2Riw2RkFBNkY7UUFDN0YsT0FBTyxJQUFJLENBQ1AsYUFBYSxTQUFTLGtGQUFrRixRQUFRLE9BQU8sQ0FDMUgsQ0FBQztJQUNOLENBQUM7SUFFRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUVoRCxJQUFJLDRCQUE0QixHQUFhLEVBQUUsQ0FBQztJQUNoRCwwQ0FBMEM7SUFDMUMsU0FBUyxTQUFTLENBQUMsVUFBa0IsRUFBRSxPQUFtQjs7UUFDdEQsSUFBSSxVQUFVLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDcEIsT0FBTyxFQUFnQixDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUM1QixJQUFJLE1BQU0sR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDN0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQztRQUVELElBQUksZ0JBQWdCLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDcEIsZ0hBQWdIO1lBQ2hILHlHQUF5RztZQUN6RyxvREFBb0Q7WUFDcEQsc0dBQXNHO1lBQ3RHLDhFQUE4RTtZQUM5RSw0RkFBNEY7WUFDNUYsUUFBUSxDQUFDO1lBQ1QsT0FBTyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsVUFBVSxxREFBcUQsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlILENBQUM7UUFFRCxJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBZSxDQUFDO1FBQy9DLFdBQVcsQ0FBQyxVQUFVLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDakMsTUFBTSxDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUM7UUFDdkIsTUFBTSxDQUFDLFFBQVEsR0FBRyxDQUFBLGdCQUFnQixhQUFoQixnQkFBZ0IsdUJBQWhCLGdCQUFnQixDQUFFLFFBQVEsS0FBSSxFQUFFLENBQUM7UUFDbkQsTUFBTSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDcEIsbURBQW1EO1FBQ2xELE1BQU0sQ0FBQyxPQUFlLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDakQsTUFBTSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDckIsS0FBSyxJQUFJLEdBQUcsSUFBSSxDQUFBLGdCQUFnQixhQUFoQixnQkFBZ0IsdUJBQWhCLGdCQUFnQixDQUFFLEtBQUssS0FBSSxFQUFFLEVBQUUsQ0FBQztZQUM1QyxJQUFJLEdBQUcsS0FBSyxRQUFRO2dCQUFFLFNBQVM7WUFDOUIsTUFBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNoQyxDQUFDO1FBRUQsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFFbkIsSUFBSSxjQUFjLEdBQUcsQ0FBQSxnQkFBZ0IsYUFBaEIsZ0JBQWdCLHVCQUFoQixnQkFBZ0IsQ0FBRSxNQUFNLEtBQUksRUFBRSxDQUFDO1FBQ3BELElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRXBELE1BQUEsVUFBVSxDQUFDLGlCQUFpQiwyREFBRztZQUMzQixJQUFJLEVBQUUsU0FBUztZQUNmLFFBQVEsRUFBRSxDQUFDO1lBQ1gsTUFBTSxFQUFFLENBQUM7U0FDWixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDWCxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNyQixNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsQ0FBQztRQUVELFNBQVMsSUFBSTs7WUFDVCxNQUFNLGdCQUFnQixHQUFHLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxnQkFBZ0I7Z0JBQUUsT0FBTztZQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNqQixNQUFNLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztnQkFDL0IsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDZCxPQUFPLFdBQVcsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3hELENBQUM7Z0JBQ0Qsd0dBQXdHO2dCQUN4RyxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUU7cUJBQ25CLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO3FCQUN6QyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQ2IsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7b0JBQ3JCLE1BQU0sSUFBSSxFQUFFLENBQUM7Z0JBQ2pCLENBQUMsQ0FBQyxDQUFDO1lBQ1gsQ0FBQztZQUVELG9CQUFvQjtZQUNwQixJQUFJLE1BQU0sQ0FBQyxlQUFlO2dCQUFFLE9BQU87WUFFbkMsTUFBTSxDQUFDLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQztZQUVuQyxNQUFNLENBQUMsUUFBUSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztZQUM1QyxNQUFNLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQVEsQ0FBQztZQUNoRSxzRkFBc0Y7WUFDdEYsMERBQTBEO1lBQzFELCtFQUErRTtZQUMvRSx3RUFBd0U7WUFDeEUsSUFBSSxhQUFhLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsRSxNQUFNLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQztZQUU5QixJQUFJLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7WUFFckMsTUFBTSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO1lBRS9DLHlGQUF5RjtZQUN6RixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ1YsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7cUJBQ2hELE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLHNCQUFzQixDQUFDO3FCQUMzQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDM0QsTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFdBQVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLENBQUM7WUFFRCxNQUFNLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDNUIsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFFdkIsSUFBSSxNQUFNLEtBQUssY0FBYyxFQUFFLENBQUM7Z0JBQzVCLGNBQWMsR0FBRyxNQUFNLENBQUM7Z0JBQ3hCLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNwRCxDQUFDO1lBRUQsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXBGLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN0Qiw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQztnQkFDRCxNQUFNLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztnQkFDOUIsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQzNCLE1BQU0sQ0FBQyxhQUFhLEdBQUcsUUFBUSxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO2dCQUMvQixTQUFTLENBQUMsSUFBSSxDQUNWO29CQUNJLHVGQUF1RjtvQkFDdkYsdUVBQXVFO29CQUN2RSxZQUFZLENBQUMsR0FBUTt3QkFDakIsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDOzRCQUFFLE9BQU8sU0FBUyxDQUFDO3dCQUMxQyxPQUFPLEdBQUcsQ0FBQztvQkFDZixDQUFDO29CQUNELGVBQWUsQ0FBQyxHQUFRO3dCQUNwQixPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7b0JBQ2hELENBQUM7aUJBQ0osRUFDRCxNQUFNLENBQUMsT0FBTztnQkFDZCw2REFBNkQ7Z0JBQzdELE1BQU0sQ0FBQyxPQUFPLEVBQ2QsTUFBTSxFQUNOLE1BQU0sQ0FBQyxRQUFRLEVBQ2YsT0FBTyxFQUNQLGFBQWEsQ0FDaEIsQ0FBQztnQkFDRixNQUFNLENBQUMsV0FBVyxHQUFHLFFBQVEsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztnQkFDekIsMEZBQTBGO2dCQUMxRixpRkFBaUY7Z0JBQ2pGLDRGQUE0RjtZQUNoRyxDQUFDO29CQUFTLENBQUM7Z0JBQ1AsTUFBTSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQzVCLDRCQUE0QixDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUVuQyxNQUFBLFVBQVUsQ0FBQyxpQkFBaUIsMkRBQUc7b0JBQzNCLElBQUksRUFBRSxVQUFVO29CQUNoQixRQUFRLEVBQUUsQ0FBQztvQkFDWCxNQUFNLEVBQUUsQ0FBQztpQkFDWixDQUFDLENBQUM7WUFDUCxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7QUFDTCxDQUFDO0FBbHlCRCxrQ0FreUJDIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL3NyYy9zcmMuZC50c1wiIC8+XG5cbmltcG9ydCB7IEdldE1vZHVsZXNBcmdzIH0gZnJvbSBcIi4vUmVxdWlyZUNvbnRyb2xsZXJcIjtcblxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgdmFyIG9uUHJvZ3Jlc3NIYW5kbGVyOiB1bmRlZmluZWQgfCAoKHByb2dyZXNzOiB7XG4gICAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgICAgYWRkVmFsdWU6IG51bWJlcjtcbiAgICAgICAgYWRkTWF4OiBudW1iZXI7XG4gICAgfSkgPT4gdm9pZCk7XG4gICAgdmFyIG9uRXJyb3JIYW5kbGVyOiB1bmRlZmluZWQgfCAoKGVycm9yOiBzdHJpbmcpID0+IHZvaWQpO1xuXG5cbiAgICB2YXIgQk9PVF9USU1FOiBudW1iZXI7XG4gICAgdmFyIGJ1aWx0SW5Nb2R1bGVFeHBvcnRzOiB7XG4gICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVNYWluKCkge1xuICAgIGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RUZXh0KGVuZHBvaW50OiBzdHJpbmcsIHZhbHVlczogYW55KSB7XG4gICAgICAgIGxldCB1cmwgPSBuZXcgVVJMKGVuZHBvaW50KTtcblxuICAgICAgICBsZXQganNvbiA9IEpTT04uc3RyaW5naWZ5KHZhbHVlcyk7XG4gICAgICAgIGxldCByZXNwb25zZTogUmVzcG9uc2U7XG4gICAgICAgIGlmIChqc29uLmxlbmd0aCA8IDYwMDApIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFRyeSB0byB1c2UgYSBHRVQsIGFzIEdFVHMgY2FuIGJlIGNhY2hlZCEgSG93ZXZlciwgaWYgdGhlIGRhdGEgaXMgdG9vIGxhcmdlLFxuICAgICAgICAgICAgLy8gIHdlIGhhdmUgdG8gdXNlIGEgcG9zdCwgb3IgZWxzZSB0aGUgcmVxdWVzdCB1cmwgd2lsbCBiZSB0b28gbGFyZ2VcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiB2YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChrZXksIEpTT04uc3RyaW5naWZ5KHZhbHVlc1trZXldKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybC50b1N0cmluZygpLCB7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwudG9TdHJpbmcoKSwge1xuICAgICAgICAgICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgICAgICAgICAgYm9keToganNvbixcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb21wcmVzc2lvblJhdGlvID0gMTtcbiAgICAgICAgbGV0IHVuY29tcHJlc3NlZExlbmd0aCA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiWC1VbmNvbXByZXNzZWQtQ29udGVudC1MZW5ndGhcIik7XG4gICAgICAgIGxldCBjb21wcmVzc2VkTGVuZ3RoID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJDb250ZW50LUxlbmd0aFwiKTtcbiAgICAgICAgaWYgKHVuY29tcHJlc3NlZExlbmd0aCAmJiBjb21wcmVzc2VkTGVuZ3RoKSB7XG4gICAgICAgICAgICBjb21wcmVzc2lvblJhdGlvID0gK3VuY29tcHJlc3NlZExlbmd0aCAvICtjb21wcmVzc2VkTGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b3RhbExlbmd0aCA9ICsodW5jb21wcmVzc2VkTGVuZ3RoIHx8IGNvbXByZXNzZWRMZW5ndGggfHwgMCk7XG4gICAgICAgIGlmICh0b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgZ2xvYmFsVGhpcy5vblByb2dyZXNzSGFuZGxlcj8uKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIkRvd25sb2FkXCIsXG4gICAgICAgICAgICAgICAgYWRkVmFsdWU6IDAsXG4gICAgICAgICAgICAgICAgYWRkTWF4OiBNYXRoLmZsb29yKHRvdGFsTGVuZ3RoIC8gY29tcHJlc3Npb25SYXRpbyksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIGl0J3MgYW4gZXJyb3IsIHNldCByZXF1ZXN0RXJyb3JcbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgICAgZ2xvYmFsVGhpcy5vbkVycm9ySGFuZGxlcj8uKHJlc3BvbnNlLnN0YXR1c1RleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RyZWFtIGl0LCBzbyB3ZSBjYW4gZ2V0IHByb2dyc3NcbiAgICAgICAgbGV0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkhLmdldFJlYWRlcigpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGxldCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgaWYgKGRvbmUpIGJyZWFrO1xuICAgICAgICAgICAgcmVzdWx0ICs9IG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgICAgICBsZXQgY3VyID0gKHZhbHVlPy5sZW5ndGggfHwgMCkgLyBjb21wcmVzc2lvblJhdGlvO1xuICAgICAgICAgICAgZ2xvYmFsVGhpcy5vblByb2dyZXNzSGFuZGxlcj8uKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIkRvd25sb2FkXCIsXG4gICAgICAgICAgICAgICAgYWRkVmFsdWU6IGN1cixcbiAgICAgICAgICAgICAgICBhZGRNYXg6IDAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgZyA9IGdsb2JhbFRoaXMgYXMgYW55O1xuICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGdsb2JhbFRoaXMuQk9PVF9USU1FID0gc3RhcnRUaW1lO1xuXG4gICAgLy8gU2V0IHRvIHRoZSBmaXJzdCByb290RG9tYWluLCB1bmxlc3MgdGhlIGZpcnN0IGltcG9ydCBkb2VzIG5vdCBoYXZlIGEgZG9tYWluXG4gICAgbGV0IG1haW5Sb290T3JpZ2luID0gbG9jYXRpb24ub3JpZ2luICsgbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgbGV0IGlzRmlyc3RJbXBvcnQgPSB0cnVlO1xuXG4gICAgKFN5bWJvbCBhcyBhbnkpLmRpc3Bvc2UgPSBTeW1ib2wuZGlzcG9zZSB8fCBTeW1ib2woXCJkaXNwb3NlXCIpO1xuICAgIChTeW1ib2wgYXMgYW55KS5hc3luY0Rpc3Bvc2UgPSBTeW1ib2wuYXN5bmNEaXNwb3NlIHx8IFN5bWJvbChcImFzeW5jRGlzcG9zZVwiKTtcblxuICAgIC8vIEdsb2JhbHNcbiAgICBPYmplY3QuYXNzaWduKHdpbmRvdywge1xuICAgICAgICBwcm9jZXNzOiB7XG4gICAgICAgICAgICBhcmd2OiB3aW5kb3c/LnByb2Nlc3M/LmFyZ3YgfHwgW10sXG4gICAgICAgICAgICBlbnY6IHtcbiAgICAgICAgICAgICAgICAvLyBNaXJyb3IgdGhlIHRub2RlLmpzIHNldHRpbmdcbiAgICAgICAgICAgICAgICBOT0RFX0VOVjogXCJwcm9kdWN0aW9uXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdmVyc2lvbnM6IHt9LFxuICAgICAgICB9LFxuICAgICAgICBzZXRJbW1lZGlhdGUoY2FsbGJhY2s6ICgpID0+IHZvaWQpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIDApO1xuICAgICAgICB9LFxuICAgICAgICAvLyBJZ25vcmUgZmxhZ3MgZm9yIG5vdywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGQgd29yayBmaW5lIGlmIHdlIGp1c3QgaGFyZGNvZGVkIGNvbXBpbGVGbGFncy50cyBoZXJlLlxuICAgICAgICBzZXRGbGFnKCkgeyB9LFxuICAgICAgICBnbG9iYWw6IHdpbmRvdyxcbiAgICB9KTtcblxuICAgIC8vIE5vdCByZWFsIG1vZHVsZXMsIGFzIHdlIGp1c3QgZGVmaW5lIHRoZWlyIGV4cG9ydHNcbiAgICBjb25zdCBidWlsdEluTW9kdWxlRXhwb3J0cyA9IHtcbiAgICAgICAgd29ya2VyX3RocmVhZHM6IHtcbiAgICAgICAgICAgIGlzTWFpblRocmVhZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgdXRpbDoge1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9ub2RlanMub3JnL2FwaS91dGlsLmh0bWwjdXRpbF91dGlsX2luaGVyaXRzX2NvbnN0cnVjdG9yX3N1cGVyY29uc3RydWN0b3JcbiAgICAgICAgICAgIGluaGVyaXRzKGNvbnN0cnVjdG9yOiBhbnksIHN1cGVyQ29uc3RydWN0b3I6IGFueSkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihjb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBUZXh0RGVjb2RlcjogVGV4dERlY29kZXIsXG4gICAgICAgICAgICBUZXh0RW5jb2RlcjogVGV4dEVuY29kZXIsXG4gICAgICAgIH0sXG4gICAgICAgIGJ1ZmZlcjogeyBCdWZmZXIgfSxcbiAgICAgICAgc3RyZWFtOiB7XG4gICAgICAgICAgICAvLyBIQUNLOiBOZWVkZWQgdG8gZ2V0IFNBWCBKUyB0byB3b3JrIGNvcnJlY3RseS5cbiAgICAgICAgICAgIFN0cmVhbTogZnVuY3Rpb24gKCkgeyB9LFxuICAgICAgICAgICAgVHJhbnNmb3JtOiBmdW5jdGlvbiAoKSB7IH0sXG4gICAgICAgIH0sXG4gICAgICAgIHRpbWVyczoge1xuICAgICAgICAgICAgLy8gVE9ETzogQWRkIGFsbCBtZW1iZXJzIG9mIHRpbWVyc1xuICAgICAgICAgICAgc2V0SW1tZWRpYXRlOiB3aW5kb3cuc2V0SW1tZWRpYXRlLFxuICAgICAgICB9LFxuICAgICAgICBjaGlsZF9wcm9jZXNzOiB7fSxcbiAgICAgICAgZXZlbnRzOiB7fSxcbiAgICB9O1xuICAgIGdsb2JhbFRoaXMuYnVpbHRJbk1vZHVsZUV4cG9ydHMgPSBnbG9iYWxUaGlzLmJ1aWx0SW5Nb2R1bGVFeHBvcnRzIHx8IHt9O1xuICAgIE9iamVjdC5hc3NpZ24oZ2xvYmFsVGhpcy5idWlsdEluTW9kdWxlRXhwb3J0cywgYnVpbHRJbk1vZHVsZUV4cG9ydHMpO1xuXG4gICAgbGV0IGxhc3RUaW1lID0gMDtcbiAgICBmdW5jdGlvbiBuZXh0VGltZSgpIHtcbiAgICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAodGltZSA8PSBsYXN0VGltZSkge1xuICAgICAgICAgICAgLy8gTk9URTogV2UgU0hPVUxEIHJlYWxseSBhZGQgZXBzaWxvbiwgYnV0Li4uIHRoaXMgaXMgYSBsb3QgZWFzaWVyLCBhbmQgaXMgY2xvc2UgZW5vdWdoLFxuICAgICAgICAgICAgLy8gIGFzIHRpbWVzIHdpbGwgbmV2ZXIgaGF2ZSB0b28gbGFyZ2Ugb2YgYSBtYWduaXR1ZGUuXG4gICAgICAgICAgICB0aW1lID0gbGFzdFRpbWUgKyAwLjAxO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RUaW1lID0gdGltZTtcbiAgICAgICAgcmV0dXJuIHRpbWU7XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHt7XG4gICAgICAgIFtyZXNvbHZlUGF0aDogc3RyaW5nXToge1xuICAgICAgICAgICAgLy8gTWF5IGJlIGRpZmZlcmVudCB0aGVuIHRoZSBtb2R1bGUgZmlsZW5hbWVcbiAgICAgICAgICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICAvLyBJZiBhIG1vZHVsZSBpcyBub3QgYWxsb3dlZCBjbGllbnRzaWRlIGl0IGlzIGxpa2VseSByZXF1ZXN0cyB3aWxsIGJlIGVtcHR5LFxuICAgICAgICAgICAgLy8gIHRvIHNhdmUgZWZmb3J0IHBhcnNpbmcgcmVxdWVzdHMgZm9yIG1vZHVsZXMgdGhhdCBvbmx5IGV4aXN0IHRvIGdpdmUgYmV0dGVyXG4gICAgICAgICAgICAvLyAgZXJyb3IgbWVzc2FnZXMuXG4gICAgICAgICAgICByZXF1ZXN0czoge1xuICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgPT4gcmVzb2x2ZWRQYXRoXG4gICAgICAgICAgICAgICAgW3JlcXVlc3Q6IHN0cmluZ106IHN0cmluZztcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBhc3luY1JlcXVlc3RzOiB7IFtyZXF1ZXN0OiBzdHJpbmddOiB0cnVlIH07XG4gICAgICAgICAgICAvLyBOT1RFOiBJRiAhYWxsb3djbGllbnQgJiYgIXNlcnZlcm9ubHksIGl0IG1pZ2h0IGp1c3QgbWVhbiB3ZSBkaWRuJ3QgYWRkIGFsbG93Y2xpZW50XG4gICAgICAgICAgICAvLyAgdG8gdGhlIG1vZHVsZSB5ZXQuIEJVVCwgaWYgc2VydmVyb25seSwgdGhlbiB3ZSBrbm93IGZvciBzdXJlIHdlIGRvbid0IHdhbnQgaXQgY2xpZW50LlxuICAgICAgICAgICAgLy8gIFNvIHRoZSBtZXNzYWdlcyBhbmQgYmVoYXZpb3Igd2lsbCBiZSBkaWZmZXJlbnQuXG4gICAgICAgICAgICBhbGxvd2NsaWVudD86IGJvb2xlYW47XG4gICAgICAgICAgICBzZXJ2ZXJvbmx5PzogYm9vbGVhbjtcbiAgICBcbiAgICAgICAgICAgIHNvdXJjZT86IHN0cmluZztcbiAgICAgICAgfVxuICAgIH19ICovXG4gICAgbGV0IHNlcmlhbGl6ZWRNb2R1bGVzOiB7IFtpZDogc3RyaW5nXTogU2VyaWFsaXplZE1vZHVsZSB8IHVuZGVmaW5lZCB9ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIHR5cGUgTW9kdWxlVHlwZSA9IE5vZGVKUy5Nb2R1bGUgJiB7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgIGZpbGVuYW1lOiBzdHJpbmc7XG4gICAgICAgIGV4cG9ydHM6IHVua25vd247XG4gICAgICAgIGNoaWxkcmVuOiBNb2R1bGVUeXBlW107XG4gICAgICAgIGZsYWdzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfTtcbiAgICAgICAgbG9hZDogKCkgPT4gdm9pZDtcbiAgICAgICAgbG9hZGVkOiBib29sZWFuO1xuICAgICAgICBpc1ByZWxvYWRpbmc6IGJvb2xlYW47XG4gICAgICAgIGV2YWxTdGFydFRpbWU6IG51bWJlcjtcbiAgICAgICAgZXZhbEVuZFRpbWU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgZXZhbHVhdGVTdGFydGVkOiBib29sZWFuO1xuICAgICAgICBzb3VyY2U6IHN0cmluZztcbiAgICAgICAgYWxsb3djbGllbnQ6IGJvb2xlYW47XG4gICAgICAgIHNpemU6IG51bWJlcjtcbiAgICAgICAgb3JpZ2luYWw6IFNlcmlhbGl6ZWRNb2R1bGU7XG4gICAgICAgIGltcG9ydDogKHJlcXVlc3Q6IHN0cmluZywgYXN5bmNJc0ZpbmU/OiBib29sZWFuKSA9PiB1bmtub3duO1xuICAgIH07XG5cbiAgICBsZXQgbW9kdWxlQ2FjaGU6IHsgW2lkOiBzdHJpbmddOiBNb2R1bGVUeXBlIH0gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGxldCBhbHJlYWR5SGF2ZToge1xuICAgICAgICByZXF1aXJlU2VxTnVtUHJvY2Vzc0lkOiBzdHJpbmc7XG4gICAgICAgIHNlcU51bXM6IHsgW3NlcU51bTogc3RyaW5nXTogdHJ1ZSB8IDEgfCAwIHwgdW5kZWZpbmVkIH07XG4gICAgfSB8IHVuZGVmaW5lZDtcblxuICAgIGxldCByb290UmVzb2x2ZUNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgIHJvb3RSZXF1aXJlLmNhY2hlID0gbW9kdWxlQ2FjaGU7XG4gICAgLy8gRXhwb3NlIHJlcXVpcmUgZm9yIGRlYnVnZ2luZywgbm90IHNvIGl0IGNhbiBiZSBjYWxsZWRcbiAgICBnLnJlcXVpcmUgPSByb290UmVxdWlyZTtcbiAgICBnLmltcG9ydCA9IHJvb3RSZXF1aXJlO1xuXG4gICAgZy5yID0gZnVuY3Rpb24gcih0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMobW9kdWxlQ2FjaGUpLmZpbHRlcigoeCkgPT4geC5maWxlbmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRleHQpKVswXS5leHBvcnRzO1xuICAgIH07XG5cbiAgICBsZXQgcmVxdWlyZUJhdGNoOiB7IFtyZXF1ZXN0OiBzdHJpbmddOiAoKCkgPT4gdm9pZClbXSB9IHwgdW5kZWZpbmVkO1xuICAgIGZ1bmN0aW9uIHJvb3RSZXF1aXJlKHJlcXVlc3Q6IHN0cmluZywgYmF0Y2g/OiBib29sZWFuKTogdW5rbm93biB7XG4gICAgICAgIGlmIChyZXF1ZXN0LmluY2x1ZGVzKFwiZmlsZTovL1wiKSkge1xuICAgICAgICAgICAgLy8gSG93IGRvZXMgdGhpcyBoYXBwZW4/IEl0IGRlZmluaXRlbHkgYnJlYWtzIHRoaW5ncywgYW5kIHdlIGNvdWxkIHJlbW92ZSB0aGUgZmlsZTovLywgYnV0Li4uIGhvd1xuICAgICAgICAgICAgLy8gIGRvZXMgaXQgZXZlbiBoYXBwZW4/XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNGaXJzdEltcG9ydCkge1xuICAgICAgICAgICAgaXNGaXJzdEltcG9ydCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHJlcXVlc3Quc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSB7XG4gICAgICAgICAgICAgICAgbWFpblJvb3RPcmlnaW4gPSBnZXRSb290RG9tYWluKHJlcXVlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcmVxdWVzdC5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIikpIHtcbiAgICAgICAgICAgIHJlcXVlc3QgPSBtYWluUm9vdE9yaWdpbiArIHJlcXVlc3Q7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWJhdGNoKSB7XG4gICAgICAgICAgICBpZiAocmVxdWVzdCBpbiByb290UmVzb2x2ZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc29sdmVkUmVxdWVzdCA9IHJvb3RSZXNvbHZlQ2FjaGVbcmVxdWVzdF07XG4gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkUmVxdWVzdCBpbiByb290UmVxdWlyZS5jYWNoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9vdFJlcXVpcmUuY2FjaGVbcmVzb2x2ZWRSZXF1ZXN0XS5leHBvcnRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlcXVlc3QgaW4gcm9vdFJlcXVpcmUuY2FjaGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcm9vdFJlcXVpcmUuY2FjaGVbcmVxdWVzdF0uZXhwb3J0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXF1ZXN0IGluIGJ1aWx0SW5Nb2R1bGVFeHBvcnRzKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVpbHRJbk1vZHVsZUV4cG9ydHNbcmVxdWVzdCBhcyBrZXlvZiB0eXBlb2YgYnVpbHRJbk1vZHVsZUV4cG9ydHNdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiYXRjaCkge1xuICAgICAgICAgICAgaWYgKCFyZXF1aXJlQmF0Y2gpIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlQmF0Y2ggPSByZXF1aXJlQmF0Y2ggfHwge307XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWlyZUJhdGNoKSB0aHJvdyBuZXcgRXJyb3IoXCJJbXBvc3NpYmxlXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdHMgPSBPYmplY3Qua2V5cyhyZXF1aXJlQmF0Y2gpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2FsbGJhY2tzID0gT2JqZWN0LnZhbHVlcyhyZXF1aXJlQmF0Y2gpLnJlZHVjZSgoYSwgYikgPT4gYS5jb25jYXQoYiksIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZUJhdGNoID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICB2b2lkIHJvb3RSZXF1aXJlTXVsdGlwbGUocmVxdWVzdHMpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2FsbGJhY2sgb2YgY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlcXVpcmVCYXRjaCkgdGhyb3cgbmV3IEVycm9yKFwiSW1wb3NzaWJsZVwiKTtcbiAgICAgICAgICAgICAgICByZXF1aXJlQmF0Y2hbcmVxdWVzdF0gPSByZXF1aXJlQmF0Y2hbcmVxdWVzdF0gfHwgW107XG4gICAgICAgICAgICAgICAgcmVxdWlyZUJhdGNoW3JlcXVlc3RdLnB1c2gocmVzb2x2ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByb290UmVxdWlyZU11bHRpcGxlKFtyZXF1ZXN0XSkudGhlbigoeCkgPT4geFswXS5leHBvcnRzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFJvb3REb21haW4ocmVxdWVzdDogc3RyaW5nKSB7XG4gICAgICAgIGxldCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QpO1xuICAgICAgICBsZXQgb3JpZ2luID0gdXJsLm9yaWdpbjtcbiAgICAgICAgLy8gRml4IHN0dXBpZCA6NDQzIGVyYXN1cmUgKG90aGVyIHBvcnRzIGFyZW4ndCBlcmFzZWQsIGV4Y2VwdCA4MCwgYnV0IHdlJ2xsIG5ldmVyIHVzZSBIVFRQLFxuICAgICAgICAvLyAgc28gdGhhdCdzIGZpbmUpLlxuICAgICAgICB7XG4gICAgICAgICAgICBsZXQgcmVtYWluaW5nID0gcmVxdWVzdC5zbGljZShvcmlnaW4ubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmIChyZW1haW5pbmcuc3RhcnRzV2l0aChcIjo0NDMvXCIpKSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luICs9IFwiOjQ0M1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcmlnaW4gKyBcIi9cIjtcbiAgICB9XG5cbiAgICBhc3luYyBmdW5jdGlvbiByb290UmVxdWlyZU11bHRpcGxlKHJlcXVlc3RzOiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgJWNpbXBvcnQoJHtyZXF1ZXN0cy5qb2luKFwiLCBcIil9KSBhdCAke0RhdGUubm93KCkgLSBzdGFydFRpbWV9bXNgLCBcImNvbG9yOiBvcmFuZ2VcIik7XG5cbiAgICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIGxldCBhbHJlYWR5SGF2ZVJhbmdlcztcbiAgICAgICAgaWYgKGFscmVhZHlIYXZlKSB7XG4gICAgICAgICAgICBsZXQgc2VxTnVtcyA9IE9iamVjdC5rZXlzKGFscmVhZHlIYXZlLnNlcU51bXMpLm1hcCgoeCkgPT4gK3gpO1xuICAgICAgICAgICAgc2VxTnVtcy5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgICAgICBsZXQgc2VxTnVtUmFuZ2VzOiB7IHM6IG51bWJlcjsgZT86IG51bWJlciB9W10gPSBbXTtcbiAgICAgICAgICAgIGFscmVhZHlIYXZlUmFuZ2VzID0geyByZXF1aXJlU2VxTnVtUHJvY2Vzc0lkOiBhbHJlYWR5SGF2ZS5yZXF1aXJlU2VxTnVtUHJvY2Vzc0lkLCBzZXFOdW1SYW5nZXMgfTtcbiAgICAgICAgICAgIGZvciAobGV0IHNlcU51bSBvZiBzZXFOdW1zKSB7XG4gICAgICAgICAgICAgICAgbGV0IHByZXYgPSBzZXFOdW1SYW5nZXNbc2VxTnVtUmFuZ2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2Py5lID09PSBzZXFOdW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJldi5lKys7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VxTnVtUmFuZ2VzLnB1c2goeyBzOiBzZXFOdW0sIGU6IHNlcU51bSArIDEgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgcmFuZ2Ugb2Ygc2VxTnVtUmFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlLnMgKyAxID09PSByYW5nZS5lKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByYW5nZS5lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkb21haW5PcmlnaW4gPSBcIlwiO1xuICAgICAgICBsZXQgb3JpZ2luYWxSZXF1ZXN0cyA9IHJlcXVlc3RzO1xuICAgICAgICBpZiAocmVxdWVzdHMuc29tZSh4ID0+IHguc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSkge1xuICAgICAgICAgICAgcmVxdWVzdHMgPSByZXF1ZXN0cy5tYXAoKHJlcXVlc3QpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3Quc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWl4ZWQgZG9tYWlucyB3aXRoIG5vbi1kb21haW4gcmVxdWVzdHMgaXMgbm90IHN1cHBvcnRlZCBwcmVzZW50bHkuIFJlcXVlc3RzOiAke3JlcXVlc3RzLmpvaW4oXCIgfCBcIil9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBvcmlnaW4gPSBnZXRSb290RG9tYWluKHJlcXVlc3QpO1xuICAgICAgICAgICAgICAgIGlmIChkb21haW5PcmlnaW4gJiYgZG9tYWluT3JpZ2luICE9PSBvcmlnaW4pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogSWYgdGhpcyBoYXBwZW5zLCB3ZSBjYW4gcHJvYmFibHkganVzdCBzcGxpdCB0aGUgY2FsbCB1cCBpbnRvIG11bHRpcGxlIGNhbGxzP1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1peGVkIGRvbWFpbnMgaW4gcmVxdWlyZSBjYWxsIGlzIG5vdCBzdXBwb3J0ZWQgcHJlc2VudGx5LiBSZXF1ZXN0czogJHtyZXF1ZXN0cy5qb2luKFwiIHwgXCIpfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb21haW5PcmlnaW4gPSBvcmlnaW47XG4gICAgICAgICAgICAgICAgLy8gQnkgc3RyaXBwaW5nIGJ5IGxlbmd0aCwgd2UgY2FuIHR1cm4gaHR0cHM6Ly9leGFtcGxlLmNvbS8uL3Rlc3QgPT4gXCIuL3Rlc3RcIlxuICAgICAgICAgICAgICAgIC8vICAod2hlcmUgYXMgaWYgd2UgdXNlZCBwYXRobmFtZSwgaXQgd291bGQgdHVybiBpbnRvIFwiL3Rlc3RcIlxuICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LnNsaWNlKGRvbWFpbk9yaWdpbi5sZW5ndGgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYXJnczogR2V0TW9kdWxlc0FyZ3MgPSBbcmVxdWVzdHMsIGFscmVhZHlIYXZlUmFuZ2VzXTtcbiAgICAgICAgLy8gV2UgaGF2ZSB0byBhZGQgaGFyZGNvZGVkIHN1cHBvcnQgZm9yIGRyb3BwZXJtaXNzaW9ucywgYmVjYXVzZS4uLiB0aGlzIGNhbGxcbiAgICAgICAgLy8gIGRvZXNuJ3QgaGF2ZSB0aGUgY29udmVudGlvbmFsIHBlcnNpc3RlZCBjb2RlIHNlbmRpbmcgY29kZSwgYmVjYXVzZS4uLiBpdCdzXG4gICAgICAgIC8vICBhbGwgb24gaXRzIG93bi5cbiAgICAgICAgbGV0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24uc2VhcmNoKTtcbiAgICAgICAgaWYgKHNlYXJjaFBhcmFtcy5nZXQoXCJkcm9wcGVybWlzc2lvbnNcIikgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaCh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXF1ZXN0VXJsQmFzZSA9IGxvY2F0aW9uLm9yaWdpbiArIGxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgICBpZiAoZG9tYWluT3JpZ2luKSB7XG4gICAgICAgICAgICByZXF1ZXN0VXJsQmFzZSA9IGRvbWFpbk9yaWdpbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVxdWVzdFVybCA9IHJlcXVlc3RVcmxCYXNlICsgYD9jbGFzc0d1aWQ9UmVxdWlyZUNvbnRyb2xsZXItZTJmODExZjMtMTRiOC00NzU5LWIwZDYtNzNmMTQ1MTZjZjFkJmZ1bmN0aW9uTmFtZT1nZXRNb2R1bGVzYDtcblxuICAgICAgICBsZXQgcmVtYXBJbXBvcnRSZXF1ZXN0c0NsaWVudHNpZGUgPSBnbG9iYWxUaGlzLnJlbWFwSW1wb3J0UmVxdWVzdHNDbGllbnRzaWRlO1xuICAgICAgICBpZiAocmVtYXBJbXBvcnRSZXF1ZXN0c0NsaWVudHNpZGUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGZuYyBvZiByZW1hcEltcG9ydFJlcXVlc3RzQ2xpZW50c2lkZSkge1xuICAgICAgICAgICAgICAgIGFyZ3MgPSBhd2FpdCBmbmMoYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJhd1RleHQgPSBhd2FpdCByZXF1ZXN0VGV4dChyZXF1ZXN0VXJsLCB7IGFyZ3MgfSk7XG4gICAgICAgIGxldCByZXN1bHRPYmo6IHtcbiAgICAgICAgICAgIG1vZHVsZXM6IHsgW2lkOiBzdHJpbmddOiBTZXJpYWxpemVkTW9kdWxlIH07XG4gICAgICAgICAgICByZXF1ZXN0c1Jlc29sdmVkUGF0aHM6IHN0cmluZ1tdO1xuICAgICAgICAgICAgcmVxdWlyZVNlcU51bVByb2Nlc3NJZDogc3RyaW5nO1xuICAgICAgICAgICAgZXJyb3I/OiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHRPYmogPSBKU09OLnBhcnNlKHJhd1RleHQpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcmVxdWlyZSgke0pTT04uc3RyaW5naWZ5KHJlcXVlc3RzKX0pLiBMaWtlbHkgYSBwZXJtaXNzaW9ucyBlcnJvciwgcG9zc2libHkgZml4ZWQgYnkgcmVzdGFydGluZyB0aGUgbG9jYWwgaHR0cCBzZXJ2ZXIuIFN0YXJ0IG9mIHJlc3BvbnNlIHdhczogJHtKU09OLnN0cmluZ2lmeShyYXdUZXh0LnNsaWNlKDAsIDEwMCkpfS4gRXJyb3IgaXM6ICR7ZS5zdGFja31gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBtb2R1bGVzLCByZXF1ZXN0c1Jlc29sdmVkUGF0aHMsIHJlcXVpcmVTZXFOdW1Qcm9jZXNzSWQsIGVycm9yIH0gPSByZXN1bHRPYmo7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3JPYmogPSBuZXcgRXJyb3IoKTtcbiAgICAgICAgICAgIGVycm9yT2JqLnN0YWNrID0gZXJyb3I7XG4gICAgICAgICAgICB0aHJvdyBlcnJvck9iajtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1vZHVsZXMpLmxlbmd0aCA9PT0gMSAmJiBcIlwiIGluIG1vZHVsZXMpIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgZXZhbChtb2R1bGVzW1wiXCJdLnNvdXJjZSB8fCBcIlwiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZpbmQgbW9kdWxlcyBmb3IgJHtvcmlnaW5hbFJlcXVlc3RzLmpvaW4oXCIsIFwiKX0gKG1hcHBlZCB0byAke3JlcXVlc3RzLmpvaW4oXCIsIFwiKX0pYCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGlmIChkb21haW5PcmlnaW4pIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIGZpeERvbWFpbihyZXF1ZXN0OiBzdHJpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3QpIHJldHVybiByZXF1ZXN0O1xuICAgICAgICAgICAgICAgIHJldHVybiBkb21haW5PcmlnaW4gKyByZXF1ZXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVxdWVzdHMgPSByZXF1ZXN0cy5tYXAoZml4RG9tYWluKTtcbiAgICAgICAgICAgIGZvciAobGV0IFtpZCwgbW9kdWxlXSBvZiBPYmplY3QuZW50cmllcyhtb2R1bGVzKSkge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBtb2R1bGVzW2lkXTtcbiAgICAgICAgICAgICAgICBtb2R1bGVzW2ZpeERvbWFpbihpZCldID0gbW9kdWxlO1xuICAgICAgICAgICAgICAgIG1vZHVsZS5maWxlbmFtZSA9IGZpeERvbWFpbihtb2R1bGUuZmlsZW5hbWUpO1xuICAgICAgICAgICAgICAgIG1vZHVsZS5yZXF1ZXN0cyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhtb2R1bGUucmVxdWVzdHMpLm1hcCgoW2ssIHZdKSA9PiBbaywgZml4RG9tYWluKHYpXSkpO1xuICAgICAgICAgICAgICAgIG1vZHVsZS5vcmlnaW5hbElkID0gZml4RG9tYWluKG1vZHVsZS5vcmlnaW5hbElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcXVlc3RzUmVzb2x2ZWRQYXRocyA9IHJlcXVlc3RzUmVzb2x2ZWRQYXRocy5tYXAoZml4RG9tYWluKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1ZXN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcm9vdFJlc29sdmVDYWNoZVtyZXF1ZXN0c1tpXV0gPSByZXF1ZXN0c1Jlc29sdmVkUGF0aHNbaV07XG4gICAgICAgIH1cblxuICAgICAgICBnbG9iYWxUaGlzLm9uUHJvZ3Jlc3NIYW5kbGVyPy4oe1xuICAgICAgICAgICAgdHlwZTogXCJDb21waWxlXCIsXG4gICAgICAgICAgICBhZGRWYWx1ZTogMCxcbiAgICAgICAgICAgIGFkZE1heDogT2JqZWN0LmtleXMobW9kdWxlcykubGVuZ3RoLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTdG9yZSB0aGUgZnVuY3Rpb24sIHNvIHdlIG9ubHkgY2FsbCBpdCBpZiBpdCBleGlzdHMgQkVGT1JFIHdlIGltcG9ydFxuICAgICAgICAvLyAgKHdoaWNoIG1lYW5zIHdlIGFscmVhZHkgaGF2ZSBzb21ldGhpbmcgbG9hZGluZywgc28gdGhpcyBpcyBsaWtlbHkgaG90IHJlbG9hZGluZy4uLilcbiAgICAgICAgbGV0IG9ic2VydmVyT25Ib3RSZWxvYWQgPSBnLm9ic2VydmVyT25Ib3RSZWxvYWQ7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9ic2VydmVyT25Ib3RSZWxvYWQpIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlck9uSG90UmVsb2FkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDApO1xuXG4gICAgICAgIHRpbWUgPSBEYXRlLm5vdygpIC0gdGltZTtcbiAgICAgICAgbGV0IG1vZHVsZUNvdW50ID0gT2JqZWN0LnZhbHVlcyhtb2R1bGVzKS5maWx0ZXIoKHgpID0+IHguc291cmNlKS5sZW5ndGg7XG4gICAgICAgIGxldCByZXF1aXJlTW9kdWxlQ291bnQgPSBPYmplY3QudmFsdWVzKG1vZHVsZXMpLmZpbHRlcigoeCkgPT4gIXguc291cmNlKS5sZW5ndGg7XG4gICAgICAgIGxldCBkZXBlbmRlbmNpZXNPbmx5VGV4dCA9IHJlcXVpcmVNb2R1bGVDb3VudCA/IGAgKCske3JlcXVpcmVNb2R1bGVDb3VudH0gZGVwZW5kZW5jaWVzIG9ubHkpYCA6IFwiXCI7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYCVjaW1wb3J0KCR7cmVxdWVzdHMuam9pbihcIiwgXCIpfSkgZmluaXNoZWQgZG93bmxvYWQgJHt0aW1lLnRvRml4ZWQoMCl9bXMsICR7TWF0aC5jZWlsKFxuICAgICAgICAgICAgICAgIHJhd1RleHQubGVuZ3RoIC8gMTAyNFxuICAgICAgICAgICAgKX1LQiwgJHttb2R1bGVDb3VudH0gbW9kdWxlcyR7ZGVwZW5kZW5jaWVzT25seVRleHR9IGF0ICR7KERhdGUubm93KCkgLSBzdGFydFRpbWUpLnRvRml4ZWQoMCl9bXNgLFxuICAgICAgICAgICAgXCJjb2xvcjogbGlnaHRncmVlblwiXG4gICAgICAgICk7XG5cblxuXG4gICAgICAgIGlmIChhbHJlYWR5SGF2ZT8ucmVxdWlyZVNlcU51bVByb2Nlc3NJZCAhPT0gcmVxdWlyZVNlcU51bVByb2Nlc3NJZCkge1xuICAgICAgICAgICAgYWxyZWFkeUhhdmUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgYWxyZWFkeUhhdmUgPSBhbHJlYWR5SGF2ZSB8fCB7IHJlcXVpcmVTZXFOdW1Qcm9jZXNzSWQsIHNlcU51bXM6IHt9IH07XG5cbiAgICAgICAgZm9yIChsZXQgaWQgaW4gbW9kdWxlcykge1xuICAgICAgICAgICAgbGV0IG1vZHVsZSA9IG1vZHVsZXNbaWRdO1xuICAgICAgICAgICAgYWxyZWFkeUhhdmUuc2VxTnVtc1ttb2R1bGUuc2VxTnVtXSA9IDE7XG4gICAgICAgICAgICBzZXJpYWxpemVkTW9kdWxlc1tpZF0gPSBtb2R1bGU7XG4gICAgICAgIH1cblxuICAgICAgICB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGxhc3RXYWl0VGltZSA9IHRpbWU7XG4gICAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhtb2R1bGVzKSkge1xuICAgICAgICAgICAgZ2V0TW9kdWxlKGtleSwgXCJwcmVsb2FkXCIpO1xuICAgICAgICAgICAgLy8gV2FpdCwgc28gd2UgY2FuIHJlbmRlciBwcm9ncmVzcyAoYW5kIGluIGdlbmVyYWxzLCBzbyB0aGUgVUkgcmVtYWlucyBzb21ld2hhdCByZXNwb25zaXZlKVxuICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSBsYXN0V2FpdFRpbWUgPiAxMCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XG4gICAgICAgICAgICAgICAgbGFzdFdhaXRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRpbWUgPSBEYXRlLm5vdygpIC0gdGltZTtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgJWNpbXBvcnQoJHtyZXF1ZXN0cy5qb2luKFwiLCBcIil9KSBmaW5pc2hlZCBjb21waWxlICR7dGltZS50b0ZpeGVkKDApfW1zICgke21vZHVsZUNvdW50fSBtb2R1bGVzKSBhdCAkeyhEYXRlLm5vdygpIC0gc3RhcnRUaW1lKS50b0ZpeGVkKDApfW1zYCxcbiAgICAgICAgICAgIFwiY29sb3I6IGhvdHBpbmtcIlxuICAgICAgICApO1xuXG5cbiAgICAgICAgZ2xvYmFsVGhpcy5vblByb2dyZXNzSGFuZGxlcj8uKHtcbiAgICAgICAgICAgIHR5cGU6IFwiRXZhbHVhdGVcIixcbiAgICAgICAgICAgIGFkZFZhbHVlOiAwLFxuICAgICAgICAgICAgYWRkTWF4OiBPYmplY3Qua2V5cyhtb2R1bGVzKS5sZW5ndGgsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RzUmVzb2x2ZWRQYXRocy5tYXAoKHgpID0+IGdldE1vZHVsZSh4KSk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aW1lID0gRGF0ZS5ub3coKSAtIHRpbWU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICBgJWNpbXBvcnQoJHtyZXF1ZXN0cy5qb2luKFwiLCBcIil9KSBmaW5pc2hlZCBldmFsdWF0ZSAke3RpbWUudG9GaXhlZCgwKX1tcyAoJHttb2R1bGVDb3VudH0gbW9kdWxlcykgYXQgJHsoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSkudG9GaXhlZCgwKX1tc2AsXG4gICAgICAgICAgICAgICAgXCJjb2xvcjogbGlnaHRibHVlXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVSZXF1aXJlKG1vZHVsZTogTW9kdWxlVHlwZSwgc2VyaWFsaXplZE1vZHVsZTogU2VyaWFsaXplZE1vZHVsZSwgYXN5bmNJc0ZpbmVPdXRlcj86IGJvb2xlYW4pIHtcbiAgICAgICAgcmVxdWlyZS5jYWNoZSA9IG1vZHVsZUNhY2hlO1xuICAgICAgICAvLyBEeW5hbWljYWxseSBnZXQgZm9sZGVyLCBpbmNhc2Ugb3VyIGZpbGVuYW1lIGNoYW5nZXNcbiAgICAgICAgZnVuY3Rpb24gZ2V0TW9kdWxlRm9sZGVyKCkge1xuICAgICAgICAgICAgcmV0dXJuIG1vZHVsZS5maWxlbmFtZS5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKS5zcGxpdChcIi9cIikuc2xpY2UoMCwgLTEpLmpvaW4oXCIvXCIpICsgXCIvXCI7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVzb2x2ZShyZXF1ZXN0OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIGxldCByZXF1ZXN0cyA9IHNlcmlhbGl6ZWRNb2R1bGUucmVxdWVzdHM7XG4gICAgICAgICAgICBpZiAocmVxdWVzdCBpbiByZXF1ZXN0cykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0c1tyZXF1ZXN0XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhYnNvbHV0ZVBhdGggPSByZXF1ZXN0O1xuICAgICAgICAgICAgaWYgKGFic29sdXRlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgfHwgYWJzb2x1dGVQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgZm9sZGVyUGFydHMgPSBnZXRNb2R1bGVGb2xkZXIoKS5zcGxpdChcIi9cIik7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGFic29sdXRlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgfHwgYWJzb2x1dGVQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFic29sdXRlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlUGF0aCA9IGFic29sdXRlUGF0aC5zbGljZShcIi4vXCIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlclBhcnRzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVQYXRoID0gYWJzb2x1dGVQYXRoLnNsaWNlKFwiLi4vXCIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhYnNvbHV0ZVBhdGggPSBmb2xkZXJQYXJ0cy5qb2luKFwiL1wiKSArIFwiL1wiICsgYWJzb2x1dGVQYXRoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU3RpbGwgdXNlIHRoZSBzYW1lIGRvbWFpblxuICAgICAgICAgICAgaWYgKCFhYnNvbHV0ZVBhdGguc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpKSB7XG4gICAgICAgICAgICAgICAgYWJzb2x1dGVQYXRoID0gbWFpblJvb3RPcmlnaW4gKyBhYnNvbHV0ZVBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWJzb2x1dGVQYXRoO1xuICAgICAgICB9XG4gICAgICAgIHJlcXVpcmUucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgIHJldHVybiByZXF1aXJlO1xuICAgICAgICBmdW5jdGlvbiByZXF1aXJlKHJlcXVlc3Q6IHN0cmluZywgYXN5bmNJc0ZpbmU/OiBib29sZWFuKSB7XG4gICAgICAgICAgICBpZiAoYXN5bmNJc0ZpbmVPdXRlcikge1xuICAgICAgICAgICAgICAgIGFzeW5jSXNGaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXN5bmNJc0ZpbmUgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICAgICAgYXN5bmNJc0ZpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0IGluIHNlcmlhbGl6ZWRNb2R1bGUuYXN5bmNSZXF1ZXN0cykge1xuICAgICAgICAgICAgICAgIGFzeW5jSXNGaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0IGluIGJ1aWx0SW5Nb2R1bGVFeHBvcnRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWx0SW5Nb2R1bGVFeHBvcnRzW3JlcXVlc3QgYXMga2V5b2YgdHlwZW9mIGJ1aWx0SW5Nb2R1bGVFeHBvcnRzXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGFic29sdXRlUGF0aCA9IHJlc29sdmUocmVxdWVzdCk7XG5cbiAgICAgICAgICAgIGxldCByZXNvbHZlZFBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0IGluIG1vZHVsZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcmVxdWVzdDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYWJzb2x1dGVQYXRoIGluIG1vZHVsZUNhY2hlKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gYWJzb2x1dGVQYXRoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIShyZXF1ZXN0IGluIHNlcmlhbGl6ZWRNb2R1bGUucmVxdWVzdHMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghYXN5bmNJc0ZpbmUgJiYgIWdsb2JhbFRoaXMuc3VwcHJlc3NVbmV4cGVjdGVkTW9kdWxlV2FybmluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBBY2Nlc3NlZCB1bmV4cGVjdGVkIG1vZHVsZSAlYyR7cmVxdWVzdH0lYyBpbiAlYyR7bW9kdWxlLmlkfSVjXFxuXFx0VHJlYXRpbmcgaXQgYXMgYW4gYXN5bmMgcmVxdWlyZS5cXG5cXHRBbGwgbW9kdWxlcyByZXF1aXJlIHN5bmNocm9ub3VzbHkgY2xpZW50c2lkZSBtdXN0IGJlIHJlcXVpcmVkIHNlcnZlcnNpZGUgYXQgYSBtb2R1bGUgbGV2ZWwuIEV4cGVjdGVkIGltcG9ydHM6ICR7T2JqZWN0LmtleXMoc2VyaWFsaXplZE1vZHVsZS5yZXF1ZXN0cykuam9pbihcIiB8IFwiKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3I6IHJlZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3I6IHVuc2V0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvcjogcmVkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvcjogdW5zZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9vdFJlcXVpcmUoYWJzb2x1dGVQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBCdWlsdCBpbiBtb2R1bGVzIHRoYXQgd2UgaGF2ZW4ndCBiZWVuIGltcGxlbWVudGVkXG4gICAgICAgICAgICAgICAgaWYgKHNlcmlhbGl6ZWRNb2R1bGUucmVxdWVzdHNbcmVxdWVzdF0gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlc29sdmVkUGF0aCA9IHNlcmlhbGl6ZWRNb2R1bGUucmVxdWVzdHNbcmVxdWVzdF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzb2x2ZWRQYXRoICE9PSBcIk5PVEFMTE9XRURDTElFTlRTSURFXCIgJiYgIXNlcmlhbGl6ZWRNb2R1bGVzW3Jlc29sdmVkUGF0aF0pIHtcbiAgICAgICAgICAgICAgICBpZiAoIWFzeW5jSXNGaW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgIGBBY2Nlc3NlZCB1bmV4cGVjdGVkIG1vZHVsZSAlYyR7cmVxdWVzdH0lYyBpbiAlYyR7bW9kdWxlLmlkfSVjXFxuXFx0VHJlYXRpbmcgaXQgYXMgYW4gYXN5bmMgcmVxdWlyZS5cXG5cXHRBbGwgbW9kdWxlcyByZXF1aXJlIHN5bmNocm9ub3VzbHkgY2xpZW50c2lkZSBtdXN0IGJlIHJlcXVpcmVkIHNlcnZlcnNpZGUgYXQgYSBtb2R1bGUgbGV2ZWwuIEV4cGVjdGVkIGltcG9ydHM6ICR7T2JqZWN0LmtleXMoc2VyaWFsaXplZE1vZHVsZS5yZXF1ZXN0cykuam9pbihcIiB8IFwiKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvcjogcmVkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yOiB1bnNldFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjb2xvcjogcmVkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yOiB1bnNldFwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByb290UmVxdWlyZShyZXNvbHZlZFBhdGgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZXhwb3J0c092ZXJyaWRlOiB1bmtub3duIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHJlc29sdmVkUGF0aCA9PT0gXCJOT1RBTExPV0VEQ0xJRU5UU0lERVwiIHx8ICFzZXJpYWxpemVkTW9kdWxlc1tyZXNvbHZlZFBhdGhdPy5hbGxvd2NsaWVudCkge1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZElkID0gcmVzb2x2ZWRQYXRoID09PSBcIk5PVEFMTE9XRURDTElFTlRTSURFXCIgPyByZXF1ZXN0IDogcmVzb2x2ZWRQYXRoO1xuICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVkTW9kdWxlc1tyZXNvbHZlZFBhdGhdPy5zZXJ2ZXJvbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cG9ydHNPdmVycmlkZSA9IG5ldyBQcm94eShcbiAgICAgICAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCh0YXJnZXQsIHByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gXCJfX2VzTW9kdWxlXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IFJldHVybiBhIHRvU3RyaW5nIHRoYXQgZXZhbHVhdGVzIHRvIFwiXCIgc28gd2UgY2FuIEVYUExJQ0lUTFkgZGV0ZWN0IG5vbi1sb2FkZWQgbW9kdWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkgPT09IHVubG9hZGVkTW9kdWxlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09PSBcImRlZmF1bHRcIikgcmV0dXJuIGV4cG9ydHNPdmVycmlkZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTW9kdWxlICR7Y2hpbGRJZH0gaXMgc2VydmVyc2lkZSBvbmx5LiBUcmllZCB0byBhY2Nlc3MgJHtTdHJpbmcocHJvcGVydHkpfSBmcm9tICR7bW9kdWxlLmlkfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cG9ydHNPdmVycmlkZSA9IG5ldyBQcm94eShcbiAgICAgICAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCh0YXJnZXQsIHByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gXCJfX2VzTW9kdWxlXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IFJldHVybiBhIHRvU3RyaW5nIHRoYXQgZXZhbHVhdGVzIHRvIFwiXCIgc28gd2UgY2FuIEVYUExJQ0lUTFkgZGV0ZWN0IG5vbi1sb2FkZWQgbW9kdWxlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkgPT09IHVubG9hZGVkTW9kdWxlKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09PSBcImRlZmF1bHRcIikgcmV0dXJuIGV4cG9ydHNPdmVycmlkZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IFwibm9uLXdoaXRlbGlzdGVkXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VyaWFsaXplZE1vZHVsZXNbcmVzb2x2ZWRQYXRoIV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBcIm1pc3NpbmcgbW9kdWxlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQWNjZXNzZWQgJHt0eXBlfSBtb2R1bGUgJWMke2NoaWxkSWR9JWMsIHNwZWNpZmljYWxseSBwcm9wZXJ0eSAlYyR7U3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfSVjLlxcblxcdEFkZCAlY21vZHVsZS5hbGxvd2NsaWVudCA9IHRydWUlYyB0byB0aGUgZmlsZSB0byBhbGxvdyBhY2Nlc3MuXFxuXFx0KElGIGl0IGlzIGEgM3JkIHBhcnR5IGxpYnJhcnksIHVzZSB0aGUgZ2xvYmFsIFwic2V0RmxhZ1wiIGhlbHBlciAoaW4gdGhlIGZpbGUgeW91IGltcG9ydGVkIHRoZSBtb2R1bGUpIHRvIHNldCBwcm9wZXJ0aWVzIG9uIG90aGVyIG1vZHVsZXMgKGl0IGNhbiBldmVuIHJlY3Vyc2l2ZWx5IHNldCBwcm9wZXJ0aWVzKSkuXFxuXFxuXFx0RnJvbSAke21vZHVsZS5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yOiByZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3I6IHVuc2V0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yOiByZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3I6IHVuc2V0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbG9yOiByZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29sb3I6IHVuc2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlc29sdmVkUGF0aCA9PT0gXCJOT1RBTExPV0VEQ0xJRU5UU0lERVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGV4cG9ydHNPdmVycmlkZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHByb3ZpZGVyTW9kdWxlID0gZ2V0TW9kdWxlKHJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgICBtb2R1bGUuY2hpbGRyZW4ucHVzaChwcm92aWRlck1vZHVsZSk7XG4gICAgICAgICAgICBpZiAoZXhwb3J0c092ZXJyaWRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBwcm92aWRlck1vZHVsZS5leHBvcnRzID0gZXhwb3J0c092ZXJyaWRlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZXhwb3J0cyA9IHByb3ZpZGVyTW9kdWxlLmV4cG9ydHM7XG4gICAgICAgICAgICBsZXQgcmVtYXBFeHBvcnRzID0gcHJvdmlkZXJNb2R1bGUucmVtYXBFeHBvcnRzO1xuICAgICAgICAgICAgaWYgKHJlbWFwRXhwb3J0cyAmJiB0eXBlb2YgcmVtYXBFeHBvcnRzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBleHBvcnRzID0gcmVtYXBFeHBvcnRzKGV4cG9ydHMsIG1vZHVsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBleHBvcnRzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEdlbmVyYXRlcyB0aGUgbW9kdWxlIHJvb3QgZnVuY3Rpb24sIHdoaWNoIGNhbiBiZSBjYWxsZWQgdG8gZXZhbHVhdGUgdGhlIG1vZHVsZSxcbiAgICAgKiAgICAgIGFuZCBoYXMgY29kZSBlcXVhbCB0byBjb250ZW50cy5cbiAgICAgKiAgICAgIC0gZmlsZW5hbWUgaXMganVzdCBmb3IgZGVidWdnaW5nIC8gc3RhY2sgdHJhY2VzXG4gICAgICovXG4gICAgZnVuY3Rpb24gd3JhcFNhZmUoZmlsZW5hbWU6IHN0cmluZywgY29udGVudHM6IHN0cmluZykge1xuICAgICAgICAvLyBUT0RPOiBIYXZlIHRoZSBzZXJ2ZXJzaWRlIGluZm9ybSB1cyBvZiB0aGUgY29ycmVjdCBsb2FkZXIsIG9yLi4uIGhhdmUgaXQgYWN0dWFsbHkgZW1pdCBhIC5qc29uIGxvYWRlci5cbiAgICAgICAgaWYgKGZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgIHJldHVybiAoZXhwb3J0czogdW5rbm93biwgcmVxdWlyZTogdW5rbm93biwgbW9kdWxlOiBNb2R1bGVUeXBlKSA9PiAobW9kdWxlLmV4cG9ydHMgPSBjb250ZW50cyAmJiBKU09OLnBhcnNlKGNvbnRlbnRzKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOT1RFOiBkZWJ1Z05hbWUgb25seSBtYXR0ZXJzIGR1cmluZyBtb2R1bGUgZXZhbHVhdGlvbi4gQWZ0ZXIgdGhhdCB0aGUgc291cmNlbWFwIHNob3VsZCB3b3JrLlxuICAgICAgICBsZXQgZGVidWdOYW1lID0gZmlsZW5hbWVcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKVxuICAgICAgICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgICAgICAgLnNsaWNlKC0xKVswXVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcLi9nLCBcIl9cIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC9bXmEtekEtWl9dL2csIFwiXCIpO1xuICAgICAgICAvLyBOT1RFOiBldmFsIGlzIHVzZWQgaW5zdGVhZCBvZiBuZXcgRnVuY3Rpb24sIGFzIG5ldyBGdW5jdGlvbiBpbmplY3QgbGluZXMsIHdoaWNoIG1lc3Nlc1xuICAgICAgICAvLyAgdXAgb3VyIHNvdXJjZW1hcHMuXG4gICAgICAgIC8vIE5PVEU6IEFsbCBvbiBvbmUgbGluZSwgc28gd2UgZG9uJ3QgYnJlYWsgc291cmNlbWFwcyBieSBUT08gbXVjaC4gV2UgY291bGQgYWxzbyBwYXJzZVxuICAgICAgICAvLyAgdGhlIHNvdXJjZW1hcCBhbmQgYWRqdXN0IGl0LCBidXQuLi4gaXQgaXMgbXVjaCBlYXNpZXIgdG8ganVzdCBub3QgY2hhbmdlIHRoZSBsaW5lIGNvdW50cy5cbiAgICAgICAgcmV0dXJuIGV2YWwoXG4gICAgICAgICAgICBgKGZ1bmN0aW9uICR7ZGVidWdOYW1lfShleHBvcnRzLCByZXF1aXJlLCBtb2R1bGUsIF9fZmlsZW5hbWUsIF9fZGlybmFtZSwgaW1wb3J0RHluYW1pYykge1widXNlIHN0cmljdFwiOyR7Y29udGVudHN9XFxuIH0pYFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHVubG9hZGVkTW9kdWxlID0gU3ltYm9sKFwidW5sb2FkZWRNb2R1bGVcIik7XG5cbiAgICBsZXQgY3VycmVudE1vZHVsZUV2YWx1YXRpb25TdGFjazogc3RyaW5nW10gPSBbXTtcbiAgICAvLyBTZWUgaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9tb2R1bGVzLmh0bWxcbiAgICBmdW5jdGlvbiBnZXRNb2R1bGUocmVzb2x2ZWRJZDogc3RyaW5nLCBwcmVsb2FkPzogXCJwcmVsb2FkXCIpOiBNb2R1bGVUeXBlIHtcbiAgICAgICAgaWYgKHJlc29sdmVkSWQgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7fSBhcyBNb2R1bGVUeXBlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvbHZlZElkIGluIG1vZHVsZUNhY2hlKSB7XG4gICAgICAgICAgICBsZXQgbW9kdWxlID0gbW9kdWxlQ2FjaGVbcmVzb2x2ZWRJZF07XG4gICAgICAgICAgICBpZiAoIXByZWxvYWQgJiYgIW1vZHVsZS5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICBtb2R1bGUubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBtb2R1bGUubG9hZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzZXJpYWxpemVkTW9kdWxlID0gc2VyaWFsaXplZE1vZHVsZXNbcmVzb2x2ZWRJZF07XG4gICAgICAgIGlmICghc2VyaWFsaXplZE1vZHVsZSkge1xuICAgICAgICAgICAgLy8gSSBjYW4ndCBmaWd1cmUgb3V0IHdoeSB0aGlzIGhhcHBlbnMgYXMgaXQgc2VlbXMgdG8gaGFwcGVuIHZlcnkgcmFyZWx5IGFuZCBvbmx5IHdoZW4gSSdtIGRlYnVnZ2luZyBvdGhlciBjb2RlLlxuICAgICAgICAgICAgLy8gIC0gSSBoYXZlIGhhZCBpdCBoYXBwZW4gaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnRpbmcgdGhlIGFwcC4gQWx0aG91Z2ggaW4gdGhlb3J5IGEgaG90IHJlbG9hZCBjb3VsZCBoYXZlXG4gICAgICAgICAgICAvLyAgICAgIHRyaWdnZXJlZCBkdWUgdG8gVlMgY29kZSB3cml0aW5nIHRvIGEgZmlsZS4gXG4gICAgICAgICAgICAvLyAgLSBJJ3ZlIGhhZCB0aW1lcyB3aGVuIGl0IGhhcHBlbnMgb25jZSBhZnRlciBzdGFydHVwIGFuZCB0aGVuIGl0IGdvZXMgYXdheSBhbmQgb3RoZXIgdGltZXMgd2hlcmUgaXRcbiAgICAgICAgICAgIC8vICAgICAgaGFwcGVucyBldmVyeSBzaW5nbGUgdGltZSBhbmQgbmV2ZXIgZ29lcyBhd2F5IHVudGlsIEkgcmVzdGFydCBhaXBhaW50LlxuICAgICAgICAgICAgLy8gIC0gTWF5YmUgaXQgaGFwcGVucyBpZiB3ZSBzd2l0Y2ggc2VydmVycyBhbmQgc28gdGhlIHJvb3QgcGF0aHMgYXJlIGRpZmZlcmVudCBpbiBzb21lIHdheT9cbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gZmluZCBtb2R1bGUgJHtyZXNvbHZlZElkfS4gVGhlIHNlcnZlciBzaG91bGQgaGF2ZSBnaXZlbiBhbiBlcnJvciBhYm91dCB0aGlzLmAsIHNlcmlhbGl6ZWRNb2R1bGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtb2R1bGUgPSBPYmplY3QuY3JlYXRlKG51bGwpIGFzIE1vZHVsZVR5cGU7XG4gICAgICAgIG1vZHVsZUNhY2hlW3Jlc29sdmVkSWRdID0gbW9kdWxlO1xuICAgICAgICBtb2R1bGUuaWQgPSByZXNvbHZlZElkO1xuICAgICAgICBtb2R1bGUuZmlsZW5hbWUgPSBzZXJpYWxpemVkTW9kdWxlPy5maWxlbmFtZSB8fCBcIlwiO1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuICAgICAgICAvLyBEZWZhdWx0IGRlZmF1bHQgb2YgZXhwb3J0cyB0byB0aGUgZXhwb3J0cyBpdHNlbGZcbiAgICAgICAgKG1vZHVsZS5leHBvcnRzIGFzIGFueSkuZGVmYXVsdCA9IG1vZHVsZS5leHBvcnRzO1xuICAgICAgICBtb2R1bGUuY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHNlcmlhbGl6ZWRNb2R1bGU/LmZsYWdzIHx8IHt9KSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSBcImxvYWRlZFwiKSBjb250aW51ZTtcbiAgICAgICAgICAgIChtb2R1bGUgYXMgYW55KVtrZXldID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1vZHVsZS5sb2FkID0gbG9hZDtcblxuICAgICAgICBsZXQgb3JpZ2luYWxTb3VyY2UgPSBzZXJpYWxpemVkTW9kdWxlPy5zb3VyY2UgfHwgXCJcIjtcbiAgICAgICAgbGV0IG1vZHVsZUZuYyA9IHdyYXBTYWZlKG1vZHVsZS5pZCwgb3JpZ2luYWxTb3VyY2UpO1xuXG4gICAgICAgIGdsb2JhbFRoaXMub25Qcm9ncmVzc0hhbmRsZXI/Lih7XG4gICAgICAgICAgICB0eXBlOiBcIkNvbXBpbGVcIixcbiAgICAgICAgICAgIGFkZFZhbHVlOiAxLFxuICAgICAgICAgICAgYWRkTWF4OiAwLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXByZWxvYWQpIHtcbiAgICAgICAgICAgIG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgbW9kdWxlLmxvYWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGxvYWQoKSB7XG4gICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkTW9kdWxlID0gc2VyaWFsaXplZE1vZHVsZXNbcmVzb2x2ZWRJZF07XG4gICAgICAgICAgICBpZiAoIXNlcmlhbGl6ZWRNb2R1bGUpIHJldHVybjtcbiAgICAgICAgICAgIGlmICghbW9kdWxlLmxvYWRlZCkge1xuICAgICAgICAgICAgICAgIG1vZHVsZS5ldmFsdWF0ZVN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoYWxyZWFkeUhhdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFscmVhZHlIYXZlLnNlcU51bXNbc2VyaWFsaXplZE1vZHVsZS5zZXFOdW1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBUaGVyZSBpcyBhbG1vc3QgbmV2ZXIgYSB3YXkgdG8gcmVjb3ZlciBmcm9tIG1vZHVsZSBkb3dubG9hZGluZyBlcnJvcnMsIHNvIGp1c3QgZG9uJ3QgY2F0Y2ggdGhlbVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiByb290UmVxdWlyZShyZXNvbHZlZElkLCB0cnVlKSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBsb2FkKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTa2lwIGRvdWJsZSBsb2Fkc1xuICAgICAgICAgICAgaWYgKG1vZHVsZS5ldmFsdWF0ZVN0YXJ0ZWQpIHJldHVybjtcblxuICAgICAgICAgICAgbW9kdWxlLm9yaWdpbmFsID0gc2VyaWFsaXplZE1vZHVsZTtcblxuICAgICAgICAgICAgbW9kdWxlLnJlcXVpcmVzID0gc2VyaWFsaXplZE1vZHVsZS5yZXF1ZXN0cztcbiAgICAgICAgICAgIG1vZHVsZS5yZXF1aXJlID0gY3JlYXRlUmVxdWlyZShtb2R1bGUsIHNlcmlhbGl6ZWRNb2R1bGUpIGFzIGFueTtcbiAgICAgICAgICAgIC8vIFRPRE86IE9uY2UgdHlwZXNjcmlwdCBzdXBwb3J0cyBkeW5hbWljIGltcG9ydCwgbWFwIGltcG9ydCgpIHRvIGltcG9ydER5bmFtaWMsIHNvIGl0XG4gICAgICAgICAgICAvLyAgdXNlcyBvdXIgaW1wb3J0IGZ1bmN0aW9uLCBpbnN0ZWFkIG9mIHRoZSBidWlsdCBpbiBvbmUuXG4gICAgICAgICAgICAvLyAgKEFzIGFwcGFyZW50bHkgd2UgY2FuJ3QganVzdCBvdmVycmlkZSBpbXBvcnQgb24gYSBwZXIgbW9kdWxlIGJhc2lzLCBiZWNhdXNlXG4gICAgICAgICAgICAvLyAgICAgIHdlIGNhbid0IGhhdmUgYW4gaWRlbnRpZnkgY2FsbGVkIFwiaW1wb3J0XCIuLi4gd2hpY2ggaXMgYW5ub3lpbmcpLlxuICAgICAgICAgICAgbGV0IGltcG9ydER5bmFtaWMgPSBjcmVhdGVSZXF1aXJlKG1vZHVsZSwgc2VyaWFsaXplZE1vZHVsZSwgdHJ1ZSk7XG4gICAgICAgICAgICBtb2R1bGUuaW1wb3J0ID0gaW1wb3J0RHluYW1pYztcblxuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHNlcmlhbGl6ZWRNb2R1bGUuc291cmNlO1xuXG4gICAgICAgICAgICBtb2R1bGUuYWxsb3djbGllbnQgPSAhIXNlcmlhbGl6ZWRNb2R1bGUuc291cmNlO1xuXG4gICAgICAgICAgICAvLyBJbXBvcnQgY2hpbGRyZW4sIGFzIHRoZSBjaGlsZHJlbiBtYXkgYmUgYWxsb3dlZCBjbGllbnRzaWRlLCBhbmQgbWF5IGhhdmUgc2lkZS1lZmZlY3RzIVxuICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdHMgPSBPYmplY3Qua2V5cyhzZXJpYWxpemVkTW9kdWxlLnJlcXVlc3RzKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCh4KSA9PiB4ICE9PSBcIk5PVEFMTE9XRURDTElFTlRTSURFXCIpXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHgpID0+ICEoeCBpbiBzZXJpYWxpemVkTW9kdWxlLmFzeW5jUmVxdWVzdHMpKTtcbiAgICAgICAgICAgICAgICBzb3VyY2UgPSByZXF1ZXN0cy5tYXAoKGlkKSA9PiBgcmVxdWlyZSgke0pTT04uc3RyaW5naWZ5KGlkKX0pO1xcbmApLmpvaW4oXCJcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1vZHVsZS5zaXplID0gc291cmNlLmxlbmd0aDtcbiAgICAgICAgICAgIG1vZHVsZS5zb3VyY2UgPSBzb3VyY2U7XG5cbiAgICAgICAgICAgIGlmIChzb3VyY2UgIT09IG9yaWdpbmFsU291cmNlKSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxTb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgICAgICAgICAgbW9kdWxlRm5jID0gd3JhcFNhZmUobW9kdWxlLmlkLCBvcmlnaW5hbFNvdXJjZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBkaXJuYW1lID0gbW9kdWxlLmZpbGVuYW1lLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpLnNwbGl0KFwiL1wiKS5zbGljZSgwLCAtMSkuam9pbihcIi9cIik7XG5cbiAgICAgICAgICAgIGxldCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGN1cnJlbnRNb2R1bGVFdmFsdWF0aW9uU3RhY2sucHVzaChtb2R1bGUuZmlsZW5hbWUpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBtb2R1bGUuZXZhbHVhdGVTdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBtb2R1bGUuaXNQcmVsb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBtb2R1bGUuZXZhbFN0YXJ0VGltZSA9IG5leHRUaW1lKCk7XG4gICAgICAgICAgICAgICAgbW9kdWxlLmV2YWxFbmRUaW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIG1vZHVsZUZuYy5jYWxsKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBBZGRpbmcgX19pbXBvcnRTdGFyIHRvIHRoZSBtb2R1bGUgY2F1c2VzIHR5cGVzY3JpcHQgdG8gdXNlIG91ciBpbXBsZW1lbnRhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICB3aGljaCBjaGVja3MgZm9yIHVubG9hZGVkTW9kdWxlIGFuZCByZXR1cm5zIHVuZGVmaW5lZCBpbiB0aGF0IGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBfX2ltcG9ydFN0YXIobW9kOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kW3VubG9hZGVkTW9kdWxlXSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9faW1wb3J0RGVmYXVsdChtb2Q6IGFueSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2QuZGVmYXVsdCA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyxcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgICAgICAgICAgICAgICAgICBtb2R1bGUucmVxdWlyZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlLFxuICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGRpcm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGltcG9ydER5bmFtaWNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIG1vZHVsZS5ldmFsRW5kVGltZSA9IG5leHRUaW1lKCk7XG4gICAgICAgICAgICAgICAgdGltZSA9IERhdGUubm93KCkgLSB0aW1lO1xuICAgICAgICAgICAgICAgIC8vIE5PVEU6IFRoaXMgbG9nIHN0YXRtZW50IGlzIGRpc2FibGVkIGFzIEkgYmVsaWV2ZSBpdCBjYXVzZXMgbGFnICh3aGVuIGRldnRvb2xzIGlzIG9wZW4pLlxuICAgICAgICAgICAgICAgIC8vICBBcyBpbiwgYWRkaW5nIGFib3V0IDUwMG1zIHRvIG91ciBsb2FkIHRpbWUsIHdoaWNoIGlzIGFubm95aW5nIHdoZW4gZGVidWdnaW5nLlxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhgRXZhbHVhdGVkIG1vZHVsZSAke21vZHVsZS5maWxlbmFtZX0gJHtNYXRoLmNlaWwoc291cmNlLmxlbmd0aCAvIDEwMjQpfUtCYCk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIG1vZHVsZS5pc1ByZWxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjdXJyZW50TW9kdWxlRXZhbHVhdGlvblN0YWNrLnBvcCgpO1xuXG4gICAgICAgICAgICAgICAgZ2xvYmFsVGhpcy5vblByb2dyZXNzSGFuZGxlcj8uKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJFdmFsdWF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBhZGRWYWx1ZTogMSxcbiAgICAgICAgICAgICAgICAgICAgYWRkTWF4OiAwLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1vZHVsZTtcbiAgICB9XG59Il19
676
+ /* _JS_SOURCE_HASH = "15af84828acbac04ce4afc013df34adb3fef63924b44dbeeddf60bb9cf7d838b"; */