socket-function 1.2.1 → 1.2.4

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 (51) hide show
  1. package/SocketFunction.d.ts +1 -1
  2. package/SocketFunctionTypes.d.ts +1 -1
  3. package/hot/HotReloadController.d.ts +3 -3
  4. package/index.d.ts +25 -10
  5. package/package.json +1 -1
  6. package/require/CSSShim.d.ts +1 -1
  7. package/require/RequireController.d.ts +2 -2
  8. package/require/compileFlags.d.ts +1 -1
  9. package/require/require.d.ts +1 -1
  10. package/src/callManager.d.ts +1 -1
  11. package/test.ts +5 -11
  12. package/time/trueTimeShim.d.ts +16 -1
  13. package/time/trueTimeShim.ts +121 -34
  14. package/dist/SetProcessVariables.ts.cache +0 -9
  15. package/dist/SocketFunction.ts.cache +0 -467
  16. package/hot/dist/HotReloadController.ts.cache +0 -252
  17. package/require/dist/RequireController.ts.cache +0 -386
  18. package/require/dist/compileFlags.ts.cache +0 -41
  19. package/require/dist/extMapper.ts.cache +0 -368
  20. package/require/dist/require.ts.cache +0 -676
  21. package/src/JSONLACKS/dist/JSONLACKS.ts.cache +0 -469
  22. package/src/dist/CallFactory.ts.cache +0 -930
  23. package/src/dist/Zip.ts.cache +0 -156
  24. package/src/dist/batching.ts.cache +0 -377
  25. package/src/dist/bits.ts.cache +0 -121
  26. package/src/dist/buffers.ts.cache +0 -76
  27. package/src/dist/caching.ts.cache +0 -302
  28. package/src/dist/callHTTPHandler.ts.cache +0 -264
  29. package/src/dist/callManager.ts.cache +0 -159
  30. package/src/dist/certStore.ts.cache +0 -59
  31. package/src/dist/createSingleton.ts.cache +0 -62
  32. package/src/dist/fixLargeNetworkCalls.ts.cache +0 -17
  33. package/src/dist/forwardPort.ts.cache +0 -222
  34. package/src/dist/https.ts.cache +0 -141
  35. package/src/dist/misc.ts.cache +0 -499
  36. package/src/dist/nodeCache.ts.cache +0 -136
  37. package/src/dist/nodeProxy.ts.cache +0 -57
  38. package/src/dist/protocolNegotiation.ts.cache +0 -101
  39. package/src/dist/tlsParsing.ts.cache +0 -85
  40. package/src/dist/types.ts.cache +0 -9
  41. package/src/dist/webSocketServer.ts.cache +0 -365
  42. package/src/dist/websocketFactory.ts.cache +0 -53
  43. package/src/formatting/dist/colors.ts.cache +0 -98
  44. package/src/formatting/dist/format.ts.cache +0 -396
  45. package/src/formatting/dist/logColors.ts.cache +0 -28
  46. package/src/lz4/dist/LZ4.ts.cache +0 -53
  47. package/src/profiling/dist/getOwnTime.ts.cache +0 -100
  48. package/src/profiling/dist/measure.ts.cache +0 -338
  49. package/src/profiling/dist/stats.ts.cache +0 -202
  50. package/src/profiling/dist/statsFormat.ts.cache +0 -45
  51. package/time/dist/trueTimeShim.ts.cache +0 -656
@@ -1,676 +0,0 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWlyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJlcXVpcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdDQUF3Qzs7O0FBb0J4QyxTQUFnQixXQUFXOztJQUN2QixLQUFLLFVBQVUsV0FBVyxDQUFDLFFBQWdCLEVBQUUsTUFBVzs7UUFDcEQsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFNUIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsQyxJQUFJLFFBQWtCLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksRUFBRSxDQUFDO1lBQ3JCLG9GQUFvRjtZQUNwRixvRUFBb0U7WUFDcEUsS0FBSyxJQUFJLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDckIsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDbkMsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsV0FBVyxFQUFFLFNBQVM7YUFDekIsQ0FBQyxDQUFDO1FBQ1AsQ0FBQzthQUFNLENBQUM7WUFDSixRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNuQyxNQUFNLEVBQUUsTUFBTTtnQkFDZCxJQUFJLEVBQUUsSUFBSTtnQkFDVixXQUFXLEVBQUUsU0FBUzthQUN6QixDQUFDLENBQUM7UUFDUCxDQUFDO1FBRUQsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDekIsSUFBSSxrQkFBa0IsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0Is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QyxRQUFRLEVBQ2YsT0FBTyxFQUNQLGFBQWEsQ0FDaEIsQ0FBQztnQkFDRixNQUFNLENBQUMsV0FBVyxHQUFHLFFBQVEsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztnQkFDekIsMEZBQTBGO2dCQUMxRixpRkFBaUY7Z0JBQ2pGLDRGQUE0RjtZQUNoRyxDQUFDO29CQUFTLENBQUM7Z0JBQ1AsTUFBTSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQzVCLDRCQUE0QixDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUVuQyxNQUFBLFVBQVUsQ0FBQyxpQkFBaUIsMkRBQUc7b0JBQzNCLElBQUksRUFBRSxVQUFVO29CQUNoQixRQUFRLEVBQUUsQ0FBQztvQkFDWCxNQUFNLEVBQUUsQ0FBQztpQkFDWixDQUFDLENBQUM7WUFDUCxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7QUFDTCxDQUFDO0FBbHlCRCxrQ0FreUJDIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL3NyYy9zcmMuZC50c1wiIC8+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"; */