socket-function 1.2.2 → 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 +43 -7
  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 -707
@@ -1,386 +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"; 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
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
6
- //exports.RequireController = exports.allowAllNodeModules = exports.setRequireBootRequire = exports.getIsAllowClient = exports.lazyImport = void 0;
7
- const fs_1 = __importDefault(require("fs"));
8
- const SocketFunction_1 = require("../SocketFunction");
9
- const callHTTPHandler_1 = require("../src/callHTTPHandler");
10
- const misc_1 = require("../src/misc");
11
- const zlib_1 = __importDefault(require("zlib"));
12
- const caching_1 = require("../src/caching");
13
- const createSingleton_1 = require("../src/createSingleton");
14
- const require_1 = require("./require");
15
- const path_1 = __importDefault(require("path"));
16
- const extMapper_1 = require("./extMapper");
17
- const COMPRESS_CACHE_SIZE = 1024 * 1024 * 128;
18
- module.allowclient = true;
19
- /** Imports it, serverside, delayed. For dynamic imports, which we need to include once, but don't want to include
20
- * immediately (due to cyclic issues), and isn't included initially.
21
- */
22
- function lazyImport(getModule) {
23
- if (!(0, misc_1.isNode)())
24
- return;
25
- // Import it, asynchronously, so it isn't preloaded, but it is available for clientside imports.
26
- // NOTE: We track delayed imports (somewhere), and don't preload them by default in RequireController.
27
- void Promise.resolve().then(() => getModule());
28
- }
29
- exports.lazyImport = lazyImport;
30
- let nextModuleSeqNum = 1;
31
- const requireSeqNumProcessId = "requireSeqNumProcessId_" + Date.now() + "_" + Math.random();
32
- const BEFORE_ENTRY_TEMPLATE = "<!-- BEFORE_ENTRY_TEMPLATE -->";
33
- const ENTRY_TEMPLATE = "<!-- ENTRY_TEMPLATE -->";
34
- const resolvedHTMLFile = (0, caching_1.lazy)(() => {
35
- const bufferShim = fs_1.default.readFileSync(__dirname + "/buffer.js").toString();
36
- return fs_1.default.readFileSync(__dirname + "/require.html").toString()
37
- .replace(BEFORE_ENTRY_TEMPLATE, `
38
- <script>${bufferShim}</script>
39
- <script>(${require_1.requireMain.toString()})()</script>
40
-
41
- ${BEFORE_ENTRY_TEMPLATE}
42
- `);
43
- });
44
- // All of these are mutated by the static helpers below (injectHTMLBeforeStartup, addStaticRoot,
45
- // addMapGetModules), which callers invoke on RequireController. But only the first-registered
46
- // copy's controller actually serves requireHTML/getModules, and it reads these vars. So they must
47
- // be shared across copies, or a caller using a different copy would add (ex) before-entry HTML
48
- // that the serving controller never reads. See createSingleton.
49
- const beforeEntryText = (0, createSingleton_1.createSingleton)("RequireController.beforeEntryText", 1, () => []).get();
50
- function injectHTMLBeforeStartup(text) {
51
- beforeEntryText.push(text);
52
- }
53
- const staticRoots = (0, createSingleton_1.createSingleton)("RequireController.staticRoots", 1, () => []).get();
54
- function addStaticRoot(root) {
55
- if (!root.endsWith("/")) {
56
- root += "/";
57
- }
58
- staticRoots.push(root);
59
- }
60
- const mapGetModules = (0, createSingleton_1.createSingleton)("RequireController.mapGetModules", 1, () => []).get();
61
- function addMapGetModules(remap) {
62
- mapGetModules.push({ remap });
63
- }
64
- class RequireControllerBase {
65
- constructor() {
66
- this.rootResolvePath = "";
67
- }
68
- async requireHTML(config) {
69
- let { requireCalls, cacheTime } = config || {};
70
- let httpRequest = (0, callHTTPHandler_1.getCurrentHTTPRequest)();
71
- let headers = {
72
- "Content-Type": "text/html"
73
- };
74
- if (cacheTime) {
75
- headers["Cache-Control"] = `max-age=${Math.floor(cacheTime / 1000)}`;
76
- }
77
- if (httpRequest) {
78
- let urlObj = new URL("https://" + httpRequest.headers.host + httpRequest.url);
79
- if (urlObj.pathname !== "/" && staticRoots.length > 0) {
80
- if (urlObj.pathname.includes("..")) {
81
- throw new Error(`Invalid path, may not have ".." in the path, ${urlObj.pathname}`);
82
- }
83
- let result;
84
- for (let root of staticRoots) {
85
- let resolved = root + urlObj.pathname;
86
- if (fs_1.default.existsSync(resolved)) {
87
- let rootResolved = path_1.default.resolve(resolved);
88
- let finalResolved = path_1.default.resolve(rootResolved);
89
- if (!finalResolved.startsWith(rootResolved)) {
90
- throw new Error(`Invalid access, did not stay in namespace: ${JSON.stringify(rootResolved)}, but escaped: ${JSON.stringify(finalResolved)}`);
91
- }
92
- result = await fs_1.default.promises.readFile(resolved);
93
- break;
94
- }
95
- }
96
- if (result) {
97
- let contentType = (0, extMapper_1.getContentTypeFromBuffer)(result);
98
- if (!contentType) {
99
- let ext = path_1.default.extname(urlObj.pathname);
100
- contentType = (0, extMapper_1.getExtContentType)(ext);
101
- }
102
- headers["Content-Type"] = contentType;
103
- return (0, callHTTPHandler_1.setHTTPResultHeaders)(result, headers);
104
- }
105
- return (0, callHTTPHandler_1.setHTTPResultHeaders)(Buffer.from(`Static file not found, ${urlObj.pathname}, have static roots: ${JSON.stringify(staticRoots)}`), headers);
106
- }
107
- }
108
- if (!this.rootResolvePath) {
109
- let dir = path_1.default.resolve(".");
110
- dir = dir.replaceAll("\\", "/");
111
- this.rootResolvePath = dir;
112
- }
113
- let result = resolvedHTMLFile();
114
- if (beforeEntryText.length > 0) {
115
- let resolved = [];
116
- for (let text of beforeEntryText) {
117
- if (typeof text === "string") {
118
- resolved.push(text);
119
- }
120
- else {
121
- resolved.push(await text());
122
- }
123
- }
124
- result = result.replace(BEFORE_ENTRY_TEMPLATE, resolved.join("\n"));
125
- }
126
- if (requireCalls) {
127
- async function requireAll(calls) {
128
- // NOTE: awaiting isn't just for better and consistent load order, it also greatly improves load efficiency,
129
- // as parallel calls can't know what files will be loaded, so there is a lot of duplicate loading. Loading
130
- // 1 at a time allows require to efficiently require only files that previous imports haven't loaded.
131
- for (let call of calls) {
132
- try {
133
- await require(call);
134
- }
135
- catch (e) {
136
- // Detach the error so we can continue
137
- setTimeout(() => { throw e; });
138
- }
139
- }
140
- }
141
- result = result.replace(ENTRY_TEMPLATE, `<script>\n(${requireAll.toString()})(${JSON.stringify(requireCalls)});\n</script>`);
142
- }
143
- else {
144
- result = result.replace(ENTRY_TEMPLATE, "");
145
- }
146
- return (0, callHTTPHandler_1.setHTTPResultHeaders)(Buffer.from(result), headers);
147
- }
148
- async getModules(pathRequests, alreadyHave, config) {
149
- var _a;
150
- let httpRequest = (0, callHTTPHandler_1.getCurrentHTTPRequest)();
151
- let seqNums = {};
152
- if ((alreadyHave === null || alreadyHave === void 0 ? void 0 : alreadyHave.requireSeqNumProcessId) === requireSeqNumProcessId) {
153
- for (let { s, e } of alreadyHave.seqNumRanges) {
154
- if (e === undefined) {
155
- e = s + 1;
156
- }
157
- for (let i = s; i < e; i++) {
158
- seqNums[i] = 1;
159
- }
160
- }
161
- }
162
- let modules = Object.create(null);
163
- function addModule(module, rootImport = false) {
164
- var _a;
165
- if (!rootImport && module.lazyload)
166
- return;
167
- if (!module.requireControllerSeqNum) {
168
- module.requireControllerSeqNum = nextModuleSeqNum++;
169
- }
170
- if (seqNums[module.requireControllerSeqNum]) {
171
- return;
172
- }
173
- if (module.filename in modules)
174
- return;
175
- // TODO: Remove unused exports. We know why the module is being requested, so we can
176
- // actually very effectively know which exports it has which will never be used.
177
- // - Of course, we would need to make the module specially, so if any new modules
178
- // use it we can know... what was removed? It becomes complicated with
179
- // lazy modules, but... it is still very important.
180
- // IMPORTANT! Use module.filename, to strip the ".CLIENT_NAMEPSACE" extension
181
- modules[module.filename] = {
182
- originalId: module.id,
183
- filename: module.filename,
184
- // NOTE: Due to recursive sets of allowclient, it is very possible for allowclient && serveronly to be set.
185
- allowclient: getIsAllowClient(module),
186
- serveronly: module.serveronly,
187
- requests: Object.create(null),
188
- seqNum: module.requireControllerSeqNum,
189
- size: module.size,
190
- version: module.version,
191
- asyncRequests: module.asyncRequires || {},
192
- flags: {},
193
- };
194
- let flags = modules[module.filename].flags;
195
- for (let [flag, value] of Object.entries(module)) {
196
- if (value === true) {
197
- flags[flag] = value;
198
- }
199
- }
200
- let moduleObj = modules[module.filename];
201
- if (moduleObj.allowclient) {
202
- moduleObj.source = module.moduleContents;
203
- if (module.filename.endsWith(".json") && !moduleObj.source) {
204
- moduleObj.source = module.moduleContents = fs_1.default.readFileSync(module.filename).toString();
205
- }
206
- }
207
- // NOTE: Iterate on children even if it isn't allowed client, as the module may have children
208
- // that are allowed clientside, and that have side-effects! (Mostly for static resources)
209
- // - Surprisingly, this only increases the returned size by about 8% (probably more like 16%
210
- // if we turn source maps off), so... it's fine. And with compression most of the extra
211
- // size will go away, as paths are highly repetitive.
212
- // - And now it increases the size by much less, as we ignore any subtree which are entirely
213
- // not allowed on the client.
214
- for (let request in module.requires) {
215
- let requireResolvedPath = module.requires[request];
216
- let requiredModule = require.cache[requireResolvedPath];
217
- if (requiredModule) {
218
- // Only include synchronous modules. BUT, DO include the requests, so when/if the request is made
219
- // it can be resolved correctly.
220
- if (!((_a = module.asyncRequires) === null || _a === void 0 ? void 0 : _a[request])) {
221
- addModule(requiredModule);
222
- }
223
- moduleObj.requests[request] = requiredModule.filename;
224
- }
225
- else {
226
- moduleObj.requests[request] = "";
227
- }
228
- }
229
- }
230
- let searchPaths = [];
231
- {
232
- searchPaths.push(this.rootResolvePath);
233
- let pathParts = this.rootResolvePath.replaceAll("\\", "/").split("/");
234
- for (let i = 0; i < pathParts.length; i++) {
235
- // Skip empty path parts, to preventing the case where the path ends
236
- // with a /, which would result in "D:/test//node_modules"
237
- if (!pathParts[i])
238
- continue;
239
- searchPaths.push(pathParts.slice(0, i + 1).join("/") + "/node_modules");
240
- }
241
- }
242
- let requestsResolvedPaths = [];
243
- for (let pathRequest of pathRequests) {
244
- let resolvedPath = "";
245
- try {
246
- resolvedPath = require.resolve(pathRequest, { paths: searchPaths });
247
- }
248
- catch (_b) { }
249
- requestsResolvedPaths.push(resolvedPath);
250
- function createNotFoundModule(error) {
251
- console.warn(error);
252
- return {
253
- exports: {},
254
- children: [],
255
- filename: resolvedPath,
256
- id: resolvedPath,
257
- isPreloading: false,
258
- require: null,
259
- loaded: true,
260
- load: null,
261
- parent: undefined,
262
- path: "",
263
- paths: [],
264
- requires: {},
265
- asyncRequires: {},
266
- allowclient: true,
267
- moduleContents: `console.warn(${JSON.stringify(error)})`,
268
- };
269
- }
270
- // TODO: We could use import() here... but that would only make the root call asynchronous,
271
- // which wouldn't prevent synchronous blocking by that much anyway...
272
- //require(rootPath);
273
- let clientModule = require.cache[resolvedPath];
274
- if (!clientModule) {
275
- // NOTE: Root requires will be asynchronous, so throwing should be just as good as
276
- // warning, except throwing can be caught and retried on another server.
277
- throw new Error(`Module ${pathRequest} (resolved to ${JSON.stringify(resolvedPath)}) was not included serverside. Resolved from root dir ${JSON.stringify(this.rootResolvePath)} (set by call to setRequireBootRequire), resolve search paths: ${JSON.stringify(searchPaths)})}`);
278
- }
279
- if (!clientModule.allowclient) {
280
- clientModule = createNotFoundModule(`Module ${pathRequest} (resolved to ${resolvedPath}) is not allowed clientside (set module.allowclient in it, or call setFlag when it is imported).`);
281
- }
282
- addModule(clientModule, true);
283
- }
284
- let result = { requestsResolvedPaths, modules, requireSeqNumProcessId };
285
- for (let remap of mapGetModules) {
286
- result = await remap.remap(result, [pathRequests, alreadyHave, config]);
287
- }
288
- // NOTE: Handling compression ourself allows us to efficiently cache (otherwise caching would require
289
- // hashing the output, which takes almost as long as compression!)
290
- if (httpRequest && SocketFunction_1.SocketFunction.HTTP_COMPRESS && ((_a = httpRequest.headers["accept-encoding"]) === null || _a === void 0 ? void 0 : _a.includes("gzip"))) {
291
- let simplifiedResult = {
292
- ...result,
293
- modules: Object.entries(result.modules).map(x => {
294
- var _a;
295
- return [x[0], {
296
- filename: x[1].filename,
297
- version: x[1].version,
298
- sourceLength: (_a = x[1].source) === null || _a === void 0 ? void 0 : _a.length,
299
- }];
300
- }),
301
- };
302
- let key = (0, misc_1.sha256Hash)(JSON.stringify(simplifiedResult));
303
- let uncompressedBuffer = Buffer.from(JSON.stringify(result));
304
- let buffer = await compressCached(key, () => uncompressedBuffer);
305
- (0, callHTTPHandler_1.setHTTPResultHeaders)(buffer, {
306
- "Content-Type": "application/json",
307
- "Content-Encoding": "gzip",
308
- "Content-Length": buffer.length.toString(),
309
- "X-Uncompressed-Content-Length": uncompressedBuffer.length.toString(),
310
- });
311
- return buffer;
312
- }
313
- return result;
314
- }
315
- }
316
- let compressCacheSize = 0;
317
- let compressCache = new Map();
318
- async function compressCached(bufferKey, buffer) {
319
- let cached = compressCache.get(bufferKey);
320
- if (!cached) {
321
- cached = await new Promise((resolve, reject) => {
322
- zlib_1.default.gzip(buffer(), {}, (err, result) => {
323
- if (err) {
324
- reject(err);
325
- }
326
- else {
327
- resolve(result);
328
- }
329
- });
330
- });
331
- compressCacheSize += cached.length;
332
- // TODO: Make the cache LRU eviction, instead of just resetting it
333
- if (compressCacheSize > COMPRESS_CACHE_SIZE) {
334
- compressCache.clear();
335
- compressCacheSize = cached.length;
336
- }
337
- compressCache.set(bufferKey, cached);
338
- }
339
- return cached;
340
- }
341
- function getIsAllowClient(module) {
342
- if (module.serveronly)
343
- return false;
344
- // IMPORTANT! We do not allow everything in node modules by default, as most things in node modules, you don't want to import client-side, and it will break if you import it client-side. Many of these are imported, but will never end up being called client-side, so it's fine to exclude them.
345
- if (allowAllNodeModulesFlag.get().value && module.filename.includes("node_modules")) {
346
- return true;
347
- }
348
- return module.allowclient;
349
- }
350
- exports.getIsAllowClient = getIsAllowClient;
351
- // Shared across copies of this package, so the registered controller and rootResolvePath (set by
352
- // setRequireBootRequire) are the same instance everyone reads/writes. See createSingleton.
353
- const baseController = (0, createSingleton_1.createSingleton)("RequireController.baseController", 1, () => new RequireControllerBase()).get();
354
- /** @deprecated, not needed, as this defaults to ".", which is a lot easier to reason about anyways. */
355
- function setRequireBootRequire(dir) {
356
- dir = path_1.default.resolve(dir);
357
- dir = dir.replaceAll("\\", "/");
358
- if (!dir.endsWith("/")) {
359
- dir += "/";
360
- }
361
- baseController.rootResolvePath = dir;
362
- }
363
- exports.setRequireBootRequire = setRequireBootRequire;
364
- // Shared across copies, so calling allowAllNodeModules() on any copy is seen by the serving
365
- // controller's getIsAllowClient. See createSingleton.
366
- const allowAllNodeModulesFlag = (0, createSingleton_1.createSingleton)("RequireController.allowAllNodeModules", 1, () => ({ value: false }));
367
- function allowAllNodeModules() {
368
- allowAllNodeModulesFlag.get().value = true;
369
- }
370
- exports.allowAllNodeModules = allowAllNodeModules;
371
- exports.RequireController = SocketFunction_1.SocketFunction.register("RequireController-e2f811f3-14b8-4759-b0d6-73f14516cf1d", baseController, () => ({
372
- getModules: {},
373
- requireHTML: {},
374
- bufferJS: {},
375
- requireJS: {},
376
- }), undefined, {
377
- noAutoExpose: true,
378
- statics: {
379
- injectHTMLBeforeStartup,
380
- addMapGetModules,
381
- addStaticRoot,
382
- allowAllNodeModules,
383
- }
384
- });
385
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVxdWlyZUNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJSZXF1aXJlQ29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSw0Q0FBb0I7QUFDcEIsc0RBQW1EO0FBQ25ELDREQUFxRjtBQUNyRixzQ0FBc0c7QUFDdEcsZ0RBQXdCO0FBQ3hCLDRDQUFvRDtBQUNwRCw0REFBeUQ7QUFFekQsdUNBQXdDO0FBQ3hDLGdEQUF3QjtBQUN4QiwyQ0FBMEU7QUFFMUUsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUU5QyxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztBQTRDMUI7O0dBRUc7QUFDSCxTQUFnQixVQUFVLENBQUMsU0FBaUM7SUFDeEQsSUFBSSxDQUFDLElBQUEsYUFBTSxHQUFFO1FBQUUsT0FBTztJQUN0QixnR0FBZ0c7SUFDaEcsdUdBQXVHO0lBQ3ZHLEtBQUssT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFMRCxnQ0FLQztBQUdELElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBRXpCLE1BQU0sc0JBQXNCLEdBQUcseUJBQXlCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7QUFFNUYsTUFBTSxxQkFBcUIsR0FBRyxnQ0FBZ0MsQ0FBQztBQUMvRCxNQUFNLGNBQWMsR0FBRyx5QkFBeUIsQ0FBQztBQUVqRCxNQUFNLGdCQUFnQixHQUFHLElBQUEsY0FBSSxFQUFDLEdBQUcsRUFBRTtJQUMvQixNQUFNLFVBQVUsR0FBRyxZQUFFLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN4RSxPQUFPLFlBQUUsQ0FBQyxZQUFZ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QUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNyQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUNELGNBQWMsQ0FBQyxlQUFlLEdBQUcsR0FBRyxDQUFDO0FBQ3pDLENBQUM7QUFQRCxzREFPQztBQUVELDRGQUE0RjtBQUM1Rix1REFBdUQ7QUFDdkQsTUFBTSx1QkFBdUIsR0FBRyxJQUFBLGlDQUFlLEVBQUMsdUNBQXVDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RILFNBQWdCLG1CQUFtQjtJQUMvQix1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQy9DLENBQUM7QUFGRCxrREFFQztBQUVZLFFBQUEsaUJBQWlCLEdBQUcsK0JBQWMsQ0FBQyxRQUFRLENBQ3BELHdEQUF3RCxFQUN4RCxjQUFjLEVBQ2QsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNILFVBQVUsRUFBRSxFQUFFO0lBQ2QsV0FBVyxFQUFFLEVBQUU7SUFDZixRQUFRLEVBQUUsRUFBRTtJQUNaLFNBQVMsRUFBRSxFQUFFO0NBQ2hCLENBQUMsRUFDRixTQUFTLEVBQ1Q7SUFDSSxZQUFZLEVBQUUsSUFBSTtJQUNsQixPQUFPLEVBQUU7UUFDTCx1QkFBdUI7UUFDdkIsZ0JBQWdCO1FBQ2hCLGFBQWE7UUFDYixtQkFBbUI7S0FDdEI7Q0FDSixDQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwZW5vZGUvaW5kZXguZC50c1wiIC8+XG5pbXBvcnQgZGVidWdicmVhayBmcm9tIFwiZGVidWdicmVha1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgU29ja2V0RnVuY3Rpb24gfSBmcm9tIFwiLi4vU29ja2V0RnVuY3Rpb25cIjtcbmltcG9ydCB7IGdldEN1cnJlbnRIVFRQUmVxdWVzdCwgc2V0SFRUUFJlc3VsdEhlYWRlcnMgfSBmcm9tIFwiLi4vc3JjL2NhbGxIVFRQSGFuZGxlclwiO1xuaW1wb3J0IHsgZm9ybWF0TnVtYmVyU3VmZml4ZWQsIGlzTm9kZSwgaXNOb2RlVHJ1ZSwgc2hhMjU2SGFzaCwgc2hhMjU2SGFzaFByb21pc2UgfSBmcm9tIFwiLi4vc3JjL21pc2NcIjtcbmltcG9ydCB6bGliIGZyb20gXCJ6bGliXCI7XG5pbXBvcnQgeyBjYWNoZUxpbWl0ZWQsIGxhenkgfSBmcm9tIFwiLi4vc3JjL2NhY2hpbmdcIjtcbmltcG9ydCB7IGNyZWF0ZVNpbmdsZXRvbiB9IGZyb20gXCIuLi9zcmMvY3JlYXRlU2luZ2xldG9uXCI7XG5pbXBvcnQgeyBmb3JtYXROdW1iZXIgfSBmcm9tIFwiLi4vc3JjL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQgeyByZXF1aXJlTWFpbiB9IGZyb20gXCIuL3JlcXVpcmVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBnZXRDb250ZW50VHlwZUZyb21CdWZmZXIsIGdldEV4dENvbnRlbnRUeXBlIH0gZnJvbSBcIi4vZXh0TWFwcGVyXCI7XG5cbmNvbnN0IENPTVBSRVNTX0NBQ0hFX1NJWkUgPSAxMDI0ICogMTAyNCAqIDEyODtcblxubW9kdWxlLmFsbG93Y2xpZW50ID0gdHJ1ZTtcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIG5hbWVzcGFjZSBOb2RlSlMge1xuICAgICAgICBpbnRlcmZhY2UgTW9kdWxlIHtcbiAgICAgICAgICAgIC8qKiBJbmRpY2F0ZXMgdGhlIG1vZHVsZSBpcyBhbGxvd2VkIGNsaWVudHNpZGUuXG4gICAgICAgICAgICAgKiAgTk9URTogU2V0IHdpdGggYG1vZHVsZS5hbGxvd2NsaWVudCA9IHRydWVgLiBIT1dFVkVSLCBhY2Nlc3MgdmlhIGdldElzQWxsb3dDbGllbnQsIHdoaWNoIHdpbGwgY2hlY2sgXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGFsbG93Y2xpZW50PzogYm9vbGVhbjtcblxuICAgICAgICAgICAgLyoqIENhdXNlcyB0aGUgbW9kdWxlIHRvIG5vdCBwcmVsb2FkLCByZXF1aXJpbmcgYGF3YWl0IGltcG9ydCgpYCBmb3IgaXQgdG8gbG9hZCBjb3JyZWN0bHlcbiAgICAgICAgICAgICAqICAgICAgLSBTaG91bGRuJ3QgYmUgc2V0IHJlY3Vyc2l2ZWx5LCBvdGhlcndpc2UgbmVzdGVkIHBhY2thZ2VzIHdpbGwgYnJlYWsuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGxhenlsb2FkPzogYm9vbGVhbjtcblxuICAgICAgICAgICAgLyoqIEluZGljYXRlcyB0aGUgbW9kdWxlIGlzIGRlZmluaXRlbHkgbm90IGFsbG93ZWQgY2xpZW50c2lkZSAqL1xuICAgICAgICAgICAgc2VydmVyb25seT86IGJvb2xlYW47XG5cbiAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgc2VxTnVtIGludG8gdGhlIGFjdHVhbCBjb21waWxhdGlvbiwgYW5kIG1ha2UgaXQgaW5jcmVtZW50LFxuICAgICAgICAgICAgLy8gIHNvIHRoZSBjbGllbnRzaWRlIGNhbiBwcm9wZXJseSBoYW5kbGUgcmFjZSBjb25kaXRpb25zIGR1cmluZyBob3QgcmVsb2FkaW5nLlxuICAgICAgICAgICAgLy8gIEFuZC4uLiBtYXliZSBpdCBpcyB1c2VmdWwgaW4gb3RoZXIgY2FzZXM/XG4gICAgICAgICAgICAvKiogVXNlZCBpbnRlcm5hbGx5IGJ5IFJlcXVpcmVDb250cm9sbGVyICovXG4gICAgICAgICAgICByZXF1aXJlQ29udHJvbGxlclNlcU51bT86IG51bWJlcjtcblxuICAgICAgICAgICAgLy8gVGltZXMgYXJlIGJvdGggdW5pcXVlICh0d28gbW9kdWxlcyBldmFsdWF0ZWQgYXQgdGhlIHNhbWUgRGF0ZS5ub3coKSB3aWxsIGhhdmUgZGlmZmVyZW50IHZhbHVlcykuXG4gICAgICAgICAgICBldmFsU3RhcnRUaW1lPzogbnVtYmVyO1xuICAgICAgICAgICAgZXZhbEVuZFRpbWU/OiBudW1iZXI7XG5cbiAgICAgICAgICAgIC8qKiAoUHJlc2VudGx5IG9ubHkgY2FsbGVkIGJ5IHJlcXVpcmUuanMpXG4gICAgICAgICAgICAgKiAgICAgIENhbGxlZCBvbiByZXF1aXJlIGNhbGxzLCB0byBhbGxvdyBwcm92aWRlcnMgdG8gY3JlYXRlIGN1c3RvbSBleHBvcnRzIGRlcGVuZGluZyBvbiB0aGUgY2FsbGVyLlxuICAgICAgICAgICAgICogICAgICAgICAgLSBNb3N0bHkgdXNlZCB0byBhbGxvdyBmdW5jdGlvbnMgdG8ga25vdyB0aGUgY2FsbGluZyBtb2R1bGUuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHJlbWFwRXhwb3J0cz86IChleHBvcnRzOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSwgY2FsbGVyTW9kdWxlOiBOb2RlSlMuTW9kdWxlKSA9PiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfTtcblxuICAgICAgICAgICAgLyoqIE9ubHkgc2V0IGlmIGNsaWVudHNpZGUgKGFuZCBhbGxvd2VkIGNsaWVudHNpZGUpICovXG4gICAgICAgICAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIGNsaWVudHNpZGVCb290VGltZTogbnVtYmVyO1xuICAgIH1cbiAgICB2YXIgc3VwcHJlc3NVbmV4cGVjdGVkTW9kdWxlV2FybmluZzogbnVtYmVyIHwgdW5kZWZpbmVkO1xufVxuXG4vKiogSW1wb3J0cyBpdCwgc2VydmVyc2lkZSwgZGVsYXllZC4gRm9yIGR5bmFtaWMgaW1wb3J0cywgd2hpY2ggd2UgbmVlZCB0byBpbmNsdWRlIG9uY2UsIGJ1dCBkb24ndCB3YW50IHRvIGluY2x1ZGVcbiAqICAgICAgaW1tZWRpYXRlbHkgKGR1ZSB0byBjeWNsaWMgaXNzdWVzKSwgYW5kIGlzbid0IGluY2x1ZGVkIGluaXRpYWxseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhenlJbXBvcnQoZ2V0TW9kdWxlOiAoKSA9PiBQcm9taXNlPHVua25vd24+KSB7XG4gICAgaWYgKCFpc05vZGUoKSkgcmV0dXJuO1xuICAgIC8vIEltcG9ydCBpdCwgYXN5bmNocm9ub3VzbHksIHNvIGl0IGlzbid0IHByZWxvYWRlZCwgYnV0IGl0IGlzIGF2YWlsYWJsZSBmb3IgY2xpZW50c2lkZSBpbXBvcnRzLlxuICAgIC8vICBOT1RFOiBXZSB0cmFjayBkZWxheWVkIGltcG9ydHMgKHNvbWV3aGVyZSksIGFuZCBkb24ndCBwcmVsb2FkIHRoZW0gYnkgZGVmYXVsdCBpbiBSZXF1aXJlQ29udHJvbGxlci5cbiAgICB2b2lkIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gZ2V0TW9kdWxlKCkpO1xufVxuXG5cbmxldCBuZXh0TW9kdWxlU2VxTnVtID0gMTtcblxuY29uc3QgcmVxdWlyZVNlcU51bVByb2Nlc3NJZCA9IFwicmVxdWlyZVNlcU51bVByb2Nlc3NJZF9cIiArIERhdGUubm93KCkgKyBcIl9cIiArIE1hdGgucmFuZG9tKCk7XG5cbmNvbnN0IEJFRk9SRV9FTlRSWV9URU1QTEFURSA9IFwiPCEtLSBCRUZPUkVfRU5UUllfVEVNUExBVEUgLS0+XCI7XG5jb25zdCBFTlRSWV9URU1QTEFURSA9IFwiPCEtLSBFTlRSWV9URU1QTEFURSAtLT5cIjtcblxuY29uc3QgcmVzb2x2ZWRIVE1MRmlsZSA9IGxhenkoKCkgPT4ge1xuICAgIGNvbnN0IGJ1ZmZlclNoaW0gPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgXCIvYnVmZmVyLmpzXCIpLnRvU3RyaW5nKCk7XG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyBcIi9yZXF1aXJlLmh0bWxcIikudG9TdHJpbmcoKVxuICAgICAgICAucmVwbGFjZShCRUZPUkVfRU5UUllfVEVNUExBVEUsXG4gICAgICAgICAgICBgXG4gICAgICAgICAgICAgICAgPHNjcmlwdD4ke2J1ZmZlclNoaW19PC9zY3JpcHQ+XG4gICAgICAgICAgICAgICAgPHNjcmlwdD4oJHtyZXF1aXJlTWFpbi50b1N0cmluZygpfSkoKTwvc2NyaXB0PlxuXG4gICAgICAgICAgICAgICAgJHtCRUZPUkVfRU5UUllfVEVNUExBVEV9XG4gICAgICAgICAgICBgXG4gICAgICAgICk7XG59KTtcblxuLy8gQWxsIG9mIHRoZXNlIGFyZSBtdXRhdGVkIGJ5IHRoZSBzdGF0aWMgaGVscGVycyBiZWxvdyAoaW5qZWN0SFRNTEJlZm9yZVN0YXJ0dXAsIGFkZFN0YXRpY1Jvb3QsXG4vLyAgYWRkTWFwR2V0TW9kdWxlcyksIHdoaWNoIGNhbGxlcnMgaW52b2tlIG9uIFJlcXVpcmVDb250cm9sbGVyLiBCdXQgb25seSB0aGUgZmlyc3QtcmVnaXN0ZXJlZFxuLy8gIGNvcHkncyBjb250cm9sbGVyIGFjdHVhbGx5IHNlcnZlcyByZXF1aXJlSFRNTC9nZXRNb2R1bGVzLCBhbmQgaXQgcmVhZHMgdGhlc2UgdmFycy4gU28gdGhleSBtdXN0XG4vLyAgYmUgc2hhcmVkIGFjcm9zcyBjb3BpZXMsIG9yIGEgY2FsbGVyIHVzaW5nIGEgZGlmZmVyZW50IGNvcHkgd291bGQgYWRkIChleCkgYmVmb3JlLWVudHJ5IEhUTUxcbi8vICB0aGF0IHRoZSBzZXJ2aW5nIGNvbnRyb2xsZXIgbmV2ZXIgcmVhZHMuIFNlZSBjcmVhdGVTaW5nbGV0b24uXG5jb25zdCBiZWZvcmVFbnRyeVRleHQgPSBjcmVhdGVTaW5nbGV0b24oXCJSZXF1aXJlQ29udHJvbGxlci5iZWZvcmVFbnRyeVRleHRcIiwgMSwgKCkgPT4gW10gYXMgKHN0cmluZyB8ICgoKSA9PiBQcm9taXNlPHN0cmluZz4pKVtdKS5nZXQoKTtcbmZ1bmN0aW9uIGluamVjdEhUTUxCZWZvcmVTdGFydHVwKHRleHQ6IHN0cmluZyB8ICgoKSA9PiBQcm9taXNlPHN0cmluZz4pKSB7XG4gICAgYmVmb3JlRW50cnlUZXh0LnB1c2godGV4dCk7XG59XG5jb25zdCBzdGF0aWNSb290cyA9IGNyZWF0ZVNpbmdsZXRvbihcIlJlcXVpcmVDb250cm9sbGVyLnN0YXRpY1Jvb3RzXCIsIDEsICgpID0+IFtdIGFzIHN0cmluZ1tdKS5nZXQoKTtcbmZ1bmN0aW9uIGFkZFN0YXRpY1Jvb3Qocm9vdDogc3RyaW5nKSB7XG4gICAgaWYgKCFyb290LmVuZHNXaXRoKFwiL1wiKSkge1xuICAgICAgICByb290ICs9IFwiL1wiO1xuICAgIH1cbiAgICBzdGF0aWNSb290cy5wdXNoKHJvb3QpO1xufVxuXG50eXBlIEdldE1vZHVsZXNSZXN1bHQgPSBSZXR1cm5UeXBlPFJlcXVpcmVDb250cm9sbGVyQmFzZVtcImdldE1vZHVsZXNcIl0+IGV4dGVuZHMgUHJvbWlzZTxpbmZlciBUPiA/IFQgOiBuZXZlcjtcbmV4cG9ydCB0eXBlIEdldE1vZHVsZXNBcmdzID0gUGFyYW1ldGVyczxSZXF1aXJlQ29udHJvbGxlckJhc2VbXCJnZXRNb2R1bGVzXCJdPjtcbmNvbnN0IG1hcEdldE1vZHVsZXMgPSBjcmVhdGVTaW5nbGV0b24oXCJSZXF1aXJlQ29udHJvbGxlci5tYXBHZXRNb2R1bGVzXCIsIDEsICgpID0+IFtdIGFzIHtcbiAgICByZW1hcChyZXN1bHQ6IEdldE1vZHVsZXNSZXN1bHQsIGFyZ3M6IEdldE1vZHVsZXNBcmdzKTogUHJvbWlzZTxHZXRNb2R1bGVzUmVzdWx0PlxufVtdKS5nZXQoKTtcbmZ1bmN0aW9uIGFkZE1hcEdldE1vZHVsZXMocmVtYXA6IHR5cGVvZiBtYXBHZXRNb2R1bGVzW251bWJlcl1bXCJyZW1hcFwiXSkge1xuICAgIG1hcEdldE1vZHVsZXMucHVzaCh7IHJlbWFwIH0pO1xufVxuXG5jbGFzcyBSZXF1aXJlQ29udHJvbGxlckJhc2Uge1xuICAgIHB1YmxpYyByb290UmVzb2x2ZVBhdGggPSBcIlwiO1xuXG4gICAgcHVibGljIGFzeW5jIHJlcXVpcmVIVE1MKGNvbmZpZz86IHtcbiAgICAgICAgcmVxdWlyZUNhbGxzPzogc3RyaW5nW107XG4gICAgICAgIGNhY2hlVGltZT86IG51bWJlcjtcbiAgICB9KTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICAgICAgbGV0IHsgcmVxdWlyZUNhbGxzLCBjYWNoZVRpbWUgfSA9IGNvbmZpZyB8fCB7fTtcbiAgICAgICAgbGV0IGh0dHBSZXF1ZXN0ID0gZ2V0Q3VycmVudEhUVFBSZXF1ZXN0KCk7XG4gICAgICAgIGxldCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJ0ZXh0L2h0bWxcIlxuICAgICAgICB9O1xuICAgICAgICBpZiAoY2FjaGVUaW1lKSB7XG4gICAgICAgICAgICBoZWFkZXJzW1wiQ2FjaGUtQ29udHJvbFwiXSA9IGBtYXgtYWdlPSR7TWF0aC5mbG9vcihjYWNoZVRpbWUgLyAxMDAwKX1gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChodHRwUmVxdWVzdCkge1xuICAgICAgICAgICAgbGV0IHVybE9iaiA9IG5ldyBVUkwoXCJodHRwczovL1wiICsgaHR0cFJlcXVlc3QuaGVhZGVycy5ob3N0ICsgaHR0cFJlcXVlc3QudXJsKTtcbiAgICAgICAgICAgIGlmICh1cmxPYmoucGF0aG5hbWUgIT09IFwiL1wiICYmIHN0YXRpY1Jvb3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodXJsT2JqLnBhdGhuYW1lLmluY2x1ZGVzKFwiLi5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhdGgsIG1heSBub3QgaGF2ZSBcIi4uXCIgaW4gdGhlIHBhdGgsICR7dXJsT2JqLnBhdGhuYW1lfWApO1xuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHJvb3Qgb2Ygc3RhdGljUm9vdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlc29sdmVkID0gcm9vdCArIHVybE9iai5wYXRobmFtZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocmVzb2x2ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm9vdFJlc29sdmVkID0gcGF0aC5yZXNvbHZlKHJlc29sdmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbFJlc29sdmVkID0gcGF0aC5yZXNvbHZlKHJvb3RSZXNvbHZlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmFsUmVzb2x2ZWQuc3RhcnRzV2l0aChyb290UmVzb2x2ZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFjY2VzcywgZGlkIG5vdCBzdGF5IGluIG5hbWVzcGFjZTogJHtKU09OLnN0cmluZ2lmeShyb290UmVzb2x2ZWQpfSwgYnV0IGVzY2FwZWQ6ICR7SlNPTi5zdHJpbmdpZnkoZmluYWxSZXNvbHZlZCl9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShyZXNvbHZlZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50VHlwZSA9IGdldENvbnRlbnRUeXBlRnJvbUJ1ZmZlcihyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRlbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXh0ID0gcGF0aC5leHRuYW1lKHVybE9iai5wYXRobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IGdldEV4dENvbnRlbnRUeXBlKGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IGNvbnRlbnRUeXBlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMocmVzdWx0LCBoZWFkZXJzKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc2V0SFRUUFJlc3VsdEhlYWRlcnMoQnVmZmVyLmZyb20oYFN0YXRpYyBmaWxlIG5vdCBmb3VuZCwgJHt1cmxPYmoucGF0aG5hbWV9LCBoYXZlIHN0YXRpYyByb290czogJHtKU09OLnN0cmluZ2lmeShzdGF0aWNSb290cyl9YCksIGhlYWRlcnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnJvb3RSZXNvbHZlUGF0aCkge1xuICAgICAgICAgICAgbGV0IGRpciA9IHBhdGgucmVzb2x2ZShcIi5cIik7XG4gICAgICAgICAgICBkaXIgPSBkaXIucmVwbGFjZUFsbChcIlxcXFxcIiwgXCIvXCIpO1xuICAgICAgICAgICAgdGhpcy5yb290UmVzb2x2ZVBhdGggPSBkaXI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlc29sdmVkSFRNTEZpbGUoKTtcbiAgICAgICAgaWYgKGJlZm9yZUVudHJ5VGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgcmVzb2x2ZWQ6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCB0ZXh0IG9mIGJlZm9yZUVudHJ5VGV4dCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGV4dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlZC5wdXNoKHRleHQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkLnB1c2goYXdhaXQgdGV4dCgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShCRUZPUkVfRU5UUllfVEVNUExBVEUsIHJlc29sdmVkLmpvaW4oXCJcXG5cIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXF1aXJlQ2FsbHMpIHtcbiAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVBbGwoY2FsbHM6IHN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgLy8gTk9URTogYXdhaXRpbmcgaXNuJ3QganVzdCBmb3IgYmV0dGVyIGFuZCBjb25zaXN0ZW50IGxvYWQgb3JkZXIsIGl0IGFsc28gZ3JlYXRseSBpbXByb3ZlcyBsb2FkIGVmZmljaWVuY3ksXG4gICAgICAgICAgICAgICAgLy8gIGFzIHBhcmFsbGVsIGNhbGxzIGNhbid0IGtub3cgd2hhdCBmaWxlcyB3aWxsIGJlIGxvYWRlZCwgc28gdGhlcmUgaXMgYSBsb3Qgb2YgZHVwbGljYXRlIGxvYWRpbmcuIExvYWRpbmdcbiAgICAgICAgICAgICAgICAvLyAgMSBhdCBhIHRpbWUgYWxsb3dzIHJlcXVpcmUgdG8gZWZmaWNpZW50bHkgcmVxdWlyZSBvbmx5IGZpbGVzIHRoYXQgcHJldmlvdXMgaW1wb3J0cyBoYXZlbid0IGxvYWRlZC5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjYWxsIG9mIGNhbGxzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCByZXF1aXJlKGNhbGwpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXRhY2ggdGhlIGVycm9yIHNvIHdlIGNhbiBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRocm93IGU7IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoRU5UUllfVEVNUExBVEUsIGA8c2NyaXB0Plxcbigke3JlcXVpcmVBbGwudG9TdHJpbmcoKX0pKCR7SlNPTi5zdHJpbmdpZnkocmVxdWlyZUNhbGxzKX0pO1xcbjwvc2NyaXB0PmApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoRU5UUllfVEVNUExBVEUsIFwiXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXRIVFRQUmVzdWx0SGVhZGVycyhCdWZmZXIuZnJvbShyZXN1bHQpLCBoZWFkZXJzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0TW9kdWxlcyhcbiAgICAgICAgcGF0aFJlcXVlc3RzOiBzdHJpbmdbXSxcbiAgICAgICAgYWxyZWFkeUhhdmU/OiB7XG4gICAgICAgICAgICByZXF1aXJlU2VxTnVtUHJvY2Vzc0lkOiBzdHJpbmc7XG4gICAgICAgICAgICAvLyBOT1RFOiBIaWdobHkgb3B0aW1pemVkLCBhcyBvdGhlcndpc2UgdGhpcyBjYW4gZWFzaWx5IGJlIEtCcyAoSSB3YXMgc2VlaW5nIDlLQiksXG4gICAgICAgICAgICAvLyAgd2hpY2ggaXMgdXBsb2FkZWQsIGFuZCBzbyBjYW4gYmUgcXVpdGUgc2xvdyBvbiBzbG93IGNvbm5lY3Rpb25zLlxuICAgICAgICAgICAgc2VxTnVtUmFuZ2VzOiB7XG4gICAgICAgICAgICAgICAgczogbnVtYmVyO1xuICAgICAgICAgICAgICAgIC8vIHVuZGVmaW5lZCBtZWFucyBzICsgMSAoc28ganVzdCBhIHNpbmdsZSBudW1iZXIpXG4gICAgICAgICAgICAgICAgZT86IG51bWJlcjtcbiAgICAgICAgICAgIH1bXTtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlnPzoge31cbiAgICApOiBQcm9taXNlPHtcbiAgICAgICAgcmVxdWVzdHNSZXNvbHZlZFBhdGhzOiBzdHJpbmdbXTtcbiAgICAgICAgbW9kdWxlczoge1xuICAgICAgICAgICAgW3Jlc29sdmVkUGF0aDogc3RyaW5nXTogU2VyaWFsaXplZE1vZHVsZTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWlyZVNlcU51bVByb2Nlc3NJZDogc3RyaW5nO1xuICAgIH0+IHtcbiAgICAgICAgbGV0IGh0dHBSZXF1ZXN0ID0gZ2V0Q3VycmVudEhUVFBSZXF1ZXN0KCk7XG5cbiAgICAgICAgbGV0IHNlcU51bXM6IHsgW3NlcU51bTogbnVtYmVyXTogMSB9ID0ge307XG4gICAgICAgIGlmIChhbHJlYWR5SGF2ZT8ucmVxdWlyZVNlcU51bVByb2Nlc3NJZCA9PT0gcmVxdWlyZVNlcU51bVByb2Nlc3NJZCkge1xuICAgICAgICAgICAgZm9yIChsZXQgeyBzLCBlIH0gb2YgYWxyZWFkeUhhdmUuc2VxTnVtUmFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBlID0gcyArIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBzOyBpIDwgZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlcU51bXNbaV0gPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtb2R1bGVzOiB7XG4gICAgICAgICAgICBbcmVzb2x2ZWRQYXRoOiBzdHJpbmddOiBTZXJpYWxpemVkTW9kdWxlO1xuICAgICAgICB9ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgZnVuY3Rpb24gYWRkTW9kdWxlKG1vZHVsZTogTm9kZUpTLk1vZHVsZSwgcm9vdEltcG9ydCA9IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAoIXJvb3RJbXBvcnQgJiYgbW9kdWxlLmxhenlsb2FkKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoIW1vZHVsZS5yZXF1aXJlQ29udHJvbGxlclNlcU51bSkge1xuICAgICAgICAgICAgICAgIG1vZHVsZS5yZXF1aXJlQ29udHJvbGxlclNlcU51bSA9IG5leHRNb2R1bGVTZXFOdW0rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZXFOdW1zW21vZHVsZS5yZXF1aXJlQ29udHJvbGxlclNlcU51bV0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobW9kdWxlLmZpbGVuYW1lIGluIG1vZHVsZXMpIHJldHVybjtcblxuICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHVudXNlZCBleHBvcnRzLiBXZSBrbm93IHdoeSB0aGUgbW9kdWxlIGlzIGJlaW5nIHJlcXVlc3RlZCwgc28gd2UgY2FuXG4gICAgICAgICAgICAvLyAgYWN0dWFsbHkgdmVyeSBlZmZlY3RpdmVseSBrbm93IHdoaWNoIGV4cG9ydHMgaXQgaGFzIHdoaWNoIHdpbGwgbmV2ZXIgYmUgdXNlZC5cbiAgICAgICAgICAgIC8vICAtIE9mIGNvdXJzZSwgd2Ugd291bGQgbmVlZCB0byBtYWtlIHRoZSBtb2R1bGUgc3BlY2lhbGx5LCBzbyBpZiBhbnkgbmV3IG1vZHVsZXNcbiAgICAgICAgICAgIC8vICAgICAgdXNlIGl0IHdlIGNhbiBrbm93Li4uIHdoYXQgd2FzIHJlbW92ZWQ/IEl0IGJlY29tZXMgY29tcGxpY2F0ZWQgd2l0aFxuICAgICAgICAgICAgLy8gICAgICBsYXp5IG1vZHVsZXMsIGJ1dC4uLiBpdCBpcyBzdGlsbCB2ZXJ5IGltcG9ydGFudC5cblxuICAgICAgICAgICAgLy8gSU1QT1JUQU5UISBVc2UgbW9kdWxlLmZpbGVuYW1lLCB0byBzdHJpcCB0aGUgXCIuQ0xJRU5UX05BTUVQU0FDRVwiIGV4dGVuc2lvblxuICAgICAgICAgICAgbW9kdWxlc1ttb2R1bGUuZmlsZW5hbWVdID0ge1xuICAgICAgICAgICAgICAgIG9yaWdpbmFsSWQ6IG1vZHVsZS5pZCxcbiAgICAgICAgICAgICAgICBmaWxlbmFtZTogbW9kdWxlLmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IER1ZSB0byByZWN1cnNpdmUgc2V0cyBvZiBhbGxvd2NsaWVudCwgaXQgaXMgdmVyeSBwb3NzaWJsZSBmb3IgYWxsb3djbGllbnQgJiYgc2VydmVyb25seSB0byBiZSBzZXQuXG4gICAgICAgICAgICAgICAgYWxsb3djbGllbnQ6IGdldElzQWxsb3dDbGllbnQobW9kdWxlKSxcbiAgICAgICAgICAgICAgICBzZXJ2ZXJvbmx5OiBtb2R1bGUuc2VydmVyb25seSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0czogT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgICAgICBzZXFOdW06IG1vZHVsZS5yZXF1aXJlQ29udHJvbGxlclNlcU51bSxcbiAgICAgICAgICAgICAgICBzaXplOiBtb2R1bGUuc2l6ZSxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiBtb2R1bGUudmVyc2lvbixcbiAgICAgICAgICAgICAgICBhc3luY1JlcXVlc3RzOiBtb2R1bGUuYXN5bmNSZXF1aXJlcyB8fCB7fSxcbiAgICAgICAgICAgICAgICBmbGFnczoge30sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IGZsYWdzID0gbW9kdWxlc1ttb2R1bGUuZmlsZW5hbWVdLmZsYWdzITtcbiAgICAgICAgICAgIGZvciAobGV0IFtmbGFnLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobW9kdWxlKSkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBmbGFnc1tmbGFnXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBtb2R1bGVPYmogPSBtb2R1bGVzW21vZHVsZS5maWxlbmFtZV07XG4gICAgICAgICAgICBpZiAobW9kdWxlT2JqLmFsbG93Y2xpZW50KSB7XG4gICAgICAgICAgICAgICAgbW9kdWxlT2JqLnNvdXJjZSA9IG1vZHVsZS5tb2R1bGVDb250ZW50cztcbiAgICAgICAgICAgICAgICBpZiAobW9kdWxlLmZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikgJiYgIW1vZHVsZU9iai5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlT2JqLnNvdXJjZSA9IG1vZHVsZS5tb2R1bGVDb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhtb2R1bGUuZmlsZW5hbWUpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBOT1RFOiBJdGVyYXRlIG9uIGNoaWxkcmVuIGV2ZW4gaWYgaXQgaXNuJ3QgYWxsb3dlZCBjbGllbnQsIGFzIHRoZSBtb2R1bGUgbWF5IGhhdmUgY2hpbGRyZW5cbiAgICAgICAgICAgIC8vICB0aGF0IGFyZSBhbGxvd2VkIGNsaWVudHNpZGUsIGFuZCB0aGF0IGhhdmUgc2lkZS1lZmZlY3RzISAoTW9zdGx5IGZvciBzdGF0aWMgcmVzb3VyY2VzKVxuICAgICAgICAgICAgLy8gIC0gU3VycHJpc2luZ2x5LCB0aGlzIG9ubHkgaW5jcmVhc2VzIHRoZSByZXR1cm5lZCBzaXplIGJ5IGFib3V0IDglIChwcm9iYWJseSBtb3JlIGxpa2UgMTYlXG4gICAgICAgICAgICAvLyAgICAgIGlmIHdlIHR1cm4gc291cmNlIG1hcHMgb2ZmKSwgc28uLi4gaXQncyBmaW5lLiBBbmQgd2l0aCBjb21wcmVzc2lvbiBtb3N0IG9mIHRoZSBleHRyYVxuICAgICAgICAgICAgLy8gICAgICBzaXplIHdpbGwgZ28gYXdheSwgYXMgcGF0aHMgYXJlIGhpZ2hseSByZXBldGl0aXZlLlxuICAgICAgICAgICAgLy8gICAgICAtIEFuZCBub3cgaXQgaW5jcmVhc2VzIHRoZSBzaXplIGJ5IG11Y2ggbGVzcywgYXMgd2UgaWdub3JlIGFueSBzdWJ0cmVlIHdoaWNoIGFyZSBlbnRpcmVseVxuICAgICAgICAgICAgLy8gICAgICAgICAgbm90IGFsbG93ZWQgb24gdGhlIGNsaWVudC5cbiAgICAgICAgICAgIGZvciAobGV0IHJlcXVlc3QgaW4gbW9kdWxlLnJlcXVpcmVzKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgcmVxdWlyZVJlc29sdmVkUGF0aCA9IG1vZHVsZS5yZXF1aXJlc1tyZXF1ZXN0XTtcbiAgICAgICAgICAgICAgICBsZXQgcmVxdWlyZWRNb2R1bGUgPSByZXF1aXJlLmNhY2hlW3JlcXVpcmVSZXNvbHZlZFBhdGhdO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkTW9kdWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgaW5jbHVkZSBzeW5jaHJvbm91cyBtb2R1bGVzLiBCVVQsIERPIGluY2x1ZGUgdGhlIHJlcXVlc3RzLCBzbyB3aGVuL2lmIHRoZSByZXF1ZXN0IGlzIG1hZGVcbiAgICAgICAgICAgICAgICAgICAgLy8gIGl0IGNhbiBiZSByZXNvbHZlZCBjb3JyZWN0bHkuXG4gICAgICAgICAgICAgICAgICAgIGlmICghbW9kdWxlLmFzeW5jUmVxdWlyZXM/LltyZXF1ZXN0XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkTW9kdWxlKHJlcXVpcmVkTW9kdWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtb2R1bGVPYmoucmVxdWVzdHNbcmVxdWVzdF0gPSByZXF1aXJlZE1vZHVsZS5maWxlbmFtZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtb2R1bGVPYmoucmVxdWVzdHNbcmVxdWVzdF0gPSBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzZWFyY2hQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAge1xuICAgICAgICAgICAgc2VhcmNoUGF0aHMucHVzaCh0aGlzLnJvb3RSZXNvbHZlUGF0aCk7XG4gICAgICAgICAgICBsZXQgcGF0aFBhcnRzID0gdGhpcy5yb290UmVzb2x2ZVBhdGgucmVwbGFjZUFsbChcIlxcXFxcIiwgXCIvXCIpLnNwbGl0KFwiL1wiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aFBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gU2tpcCBlbXB0eSBwYXRoIHBhcnRzLCB0byBwcmV2ZW50aW5nIHRoZSBjYXNlIHdoZXJlIHRoZSBwYXRoIGVuZHNcbiAgICAgICAgICAgICAgICAvLyAgd2l0aCBhIC8sIHdoaWNoIHdvdWxkIHJlc3VsdCBpbiBcIkQ6L3Rlc3QvL25vZGVfbW9kdWxlc1wiXG4gICAgICAgICAgICAgICAgaWYgKCFwYXRoUGFydHNbaV0pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHNlYXJjaFBhdGhzLnB1c2gocGF0aFBhcnRzLnNsaWNlKDAsIGkgKyAxKS5qb2luKFwiL1wiKSArIFwiL25vZGVfbW9kdWxlc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlcXVlc3RzUmVzb2x2ZWRQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgcGF0aFJlcXVlc3Qgb2YgcGF0aFJlcXVlc3RzKSB7XG4gICAgICAgICAgICBsZXQgcmVzb2x2ZWRQYXRoID0gXCJcIjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gcmVxdWlyZS5yZXNvbHZlKHBhdGhSZXF1ZXN0LCB7IHBhdGhzOiBzZWFyY2hQYXRocyB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggeyB9XG4gICAgICAgICAgICByZXF1ZXN0c1Jlc29sdmVkUGF0aHMucHVzaChyZXNvbHZlZFBhdGgpO1xuXG4gICAgICAgICAgICBmdW5jdGlvbiBjcmVhdGVOb3RGb3VuZE1vZHVsZShlcnJvcjogc3RyaW5nKTogTm9kZUpTLk1vZHVsZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogcmVzb2x2ZWRQYXRoLFxuICAgICAgICAgICAgICAgICAgICBpZDogcmVzb2x2ZWRQYXRoLFxuICAgICAgICAgICAgICAgICAgICBpc1ByZWxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlOiBudWxsIGFzIGFueSxcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBsb2FkOiBudWxsIGFzIGFueSxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIHBhdGhzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXM6IHt9LFxuICAgICAgICAgICAgICAgICAgICBhc3luY1JlcXVpcmVzOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgYWxsb3djbGllbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZUNvbnRlbnRzOiBgY29uc29sZS53YXJuKCR7SlNPTi5zdHJpbmdpZnkoZXJyb3IpfSlgLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRPRE86IFdlIGNvdWxkIHVzZSBpbXBvcnQoKSBoZXJlLi4uIGJ1dCB0aGF0IHdvdWxkIG9ubHkgbWFrZSB0aGUgcm9vdCBjYWxsIGFzeW5jaHJvbm91cyxcbiAgICAgICAgICAgIC8vICB3aGljaCB3b3VsZG4ndCBwcmV2ZW50IHN5bmNocm9ub3VzIGJsb2NraW5nIGJ5IHRoYXQgbXVjaCBhbnl3YXkuLi5cbiAgICAgICAgICAgIC8vcmVxdWlyZShyb290UGF0aCk7XG4gICAgICAgICAgICBsZXQgY2xpZW50TW9kdWxlID0gcmVxdWlyZS5jYWNoZVtyZXNvbHZlZFBhdGhdO1xuICAgICAgICAgICAgaWYgKCFjbGllbnRNb2R1bGUpIHtcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBSb290IHJlcXVpcmVzIHdpbGwgYmUgYXN5bmNocm9ub3VzLCBzbyB0aHJvd2luZyBzaG91bGQgYmUganVzdCBhcyBnb29kIGFzXG4gICAgICAgICAgICAgICAgLy8gIHdhcm5pbmcsIGV4Y2VwdCB0aHJvd2luZyBjYW4gYmUgY2F1Z2h0IGFuZCByZXRyaWVkIG9uIGFub3RoZXIgc2VydmVyLlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kdWxlICR7cGF0aFJlcXVlc3R9IChyZXNvbHZlZCB0byAke0pTT04uc3RyaW5naWZ5KHJlc29sdmVkUGF0aCl9KSB3YXMgbm90IGluY2x1ZGVkIHNlcnZlcnNpZGUuIFJlc29sdmVkIGZyb20gcm9vdCBkaXIgJHtKU09OLnN0cmluZ2lmeSh0aGlzLnJvb3RSZXNvbHZlUGF0aCl9IChzZXQgYnkgY2FsbCB0byBzZXRSZXF1aXJlQm9vdFJlcXVpcmUpLCByZXNvbHZlIHNlYXJjaCBwYXRoczogJHtKU09OLnN0cmluZ2lmeShzZWFyY2hQYXRocyl9KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghY2xpZW50TW9kdWxlLmFsbG93Y2xpZW50KSB7XG4gICAgICAgICAgICAgICAgY2xpZW50TW9kdWxlID0gY3JlYXRlTm90Rm91bmRNb2R1bGUoYE1vZHVsZSAke3BhdGhSZXF1ZXN0fSAocmVzb2x2ZWQgdG8gJHtyZXNvbHZlZFBhdGh9KSBpcyBub3QgYWxsb3dlZCBjbGllbnRzaWRlIChzZXQgbW9kdWxlLmFsbG93Y2xpZW50IGluIGl0LCBvciBjYWxsIHNldEZsYWcgd2hlbiBpdCBpcyBpbXBvcnRlZCkuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFkZE1vZHVsZShjbGllbnRNb2R1bGUsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdDogR2V0TW9kdWxlc1Jlc3VsdCA9IHsgcmVxdWVzdHNSZXNvbHZlZFBhdGhzLCBtb2R1bGVzLCByZXF1aXJlU2VxTnVtUHJvY2Vzc0lkIH07XG4gICAgICAgIGZvciAobGV0IHJlbWFwIG9mIG1hcEdldE1vZHVsZXMpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlbWFwLnJlbWFwKHJlc3VsdCwgW3BhdGhSZXF1ZXN0cywgYWxyZWFkeUhhdmUsIGNvbmZpZ10pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogSGFuZGxpbmcgY29tcHJlc3Npb24gb3Vyc2VsZiBhbGxvd3MgdXMgdG8gZWZmaWNpZW50bHkgY2FjaGUgKG90aGVyd2lzZSBjYWNoaW5nIHdvdWxkIHJlcXVpcmVcbiAgICAgICAgLy8gICAgICBoYXNoaW5nIHRoZSBvdXRwdXQsIHdoaWNoIHRha2VzIGFsbW9zdCBhcyBsb25nIGFzIGNvbXByZXNzaW9uISlcbiAgICAgICAgaWYgKGh0dHBSZXF1ZXN0ICYmIFNvY2tldEZ1bmN0aW9uLkhUVFBfQ09NUFJFU1MgJiYgaHR0cFJlcXVlc3QuaGVhZGVyc1tcImFjY2VwdC1lbmNvZGluZ1wiXT8uaW5jbHVkZXMoXCJnemlwXCIpKSB7XG4gICAgICAgICAgICBsZXQgc2ltcGxpZmllZFJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgICAgICAgbW9kdWxlczogT2JqZWN0LmVudHJpZXMocmVzdWx0Lm1vZHVsZXMpLm1hcCh4ID0+IFt4WzBdLCB7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiB4WzFdLmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uOiB4WzFdLnZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUxlbmd0aDogeFsxXS5zb3VyY2U/Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICB9XSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IGtleSA9IHNoYTI1Nkhhc2goSlNPTi5zdHJpbmdpZnkoc2ltcGxpZmllZFJlc3VsdCkpO1xuICAgICAgICAgICAgbGV0IHVuY29tcHJlc3NlZEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpO1xuICAgICAgICAgICAgbGV0IGJ1ZmZlciA9IGF3YWl0IGNvbXByZXNzQ2FjaGVkKGtleSwgKCkgPT4gdW5jb21wcmVzc2VkQnVmZmVyKTtcbiAgICAgICAgICAgIHNldEhUVFBSZXN1bHRIZWFkZXJzKGJ1ZmZlciwge1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1FbmNvZGluZ1wiOiBcImd6aXBcIixcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtTGVuZ3RoXCI6IGJ1ZmZlci5sZW5ndGgudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICBcIlgtVW5jb21wcmVzc2VkLUNvbnRlbnQtTGVuZ3RoXCI6IHVuY29tcHJlc3NlZEJ1ZmZlci5sZW5ndGgudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlciBhcyBhbnk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxubGV0IGNvbXByZXNzQ2FjaGVTaXplID0gMDtcbmxldCBjb21wcmVzc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEJ1ZmZlcj4oKTtcbmFzeW5jIGZ1bmN0aW9uIGNvbXByZXNzQ2FjaGVkKGJ1ZmZlcktleTogc3RyaW5nLCBidWZmZXI6ICgpID0+IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgbGV0IGNhY2hlZCA9IGNvbXByZXNzQ2FjaGUuZ2V0KGJ1ZmZlcktleSk7XG4gICAgaWYgKCFjYWNoZWQpIHtcbiAgICAgICAgY2FjaGVkID0gYXdhaXQgbmV3IFByb21pc2U8QnVmZmVyPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB6bGliLmd6aXAoYnVmZmVyKCksIHt9LCAoZXJyLCByZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbXByZXNzQ2FjaGVTaXplICs9IGNhY2hlZC5sZW5ndGg7XG4gICAgICAgIC8vIFRPRE86IE1ha2UgdGhlIGNhY2hlIExSVSBldmljdGlvbiwgaW5zdGVhZCBvZiBqdXN0IHJlc2V0dGluZyBpdFxuICAgICAgICBpZiAoY29tcHJlc3NDYWNoZVNpemUgPiBDT01QUkVTU19DQUNIRV9TSVpFKSB7XG4gICAgICAgICAgICBjb21wcmVzc0NhY2hlLmNsZWFyKCk7XG4gICAgICAgICAgICBjb21wcmVzc0NhY2hlU2l6ZSA9IGNhY2hlZC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgY29tcHJlc3NDYWNoZS5zZXQoYnVmZmVyS2V5LCBjYWNoZWQpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXNBbGxvd0NsaWVudChtb2R1bGU6IE5vZGVKUy5Nb2R1bGUpIHtcbiAgICBpZiAobW9kdWxlLnNlcnZlcm9ubHkpIHJldHVybiBmYWxzZTtcbiAgICAvLyBJTVBPUlRBTlQhIFdlIGRvIG5vdCBhbGxvdyBldmVyeXRoaW5nIGluIG5vZGUgbW9kdWxlcyBieSBkZWZhdWx0LCBhcyBtb3N0IHRoaW5ncyBpbiBub2RlIG1vZHVsZXMsIHlvdSBkb24ndCB3YW50IHRvIGltcG9ydCBjbGllbnQtc2lkZSwgYW5kIGl0IHdpbGwgYnJlYWsgaWYgeW91IGltcG9ydCBpdCBjbGllbnQtc2lkZS4gTWFueSBvZiB0aGVzZSBhcmUgaW1wb3J0ZWQsIGJ1dCB3aWxsIG5ldmVyIGVuZCB1cCBiZWluZyBjYWxsZWQgY2xpZW50LXNpZGUsIHNvIGl0J3MgZmluZSB0byBleGNsdWRlIHRoZW0uXG4gICAgaWYgKGFsbG93QWxsTm9kZU1vZHVsZXNGbGFnLmdldCgpLnZhbHVlICYmIG1vZHVsZS5maWxlbmFtZS5pbmNsdWRlcyhcIm5vZGVfbW9kdWxlc1wiKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG1vZHVsZS5hbGxvd2NsaWVudDtcbn1cblxudHlwZSBDbGllbnRSZW1hcENhbGxiYWNrID0gKGFyZ3M6IEdldE1vZHVsZXNBcmdzKSA9PiBQcm9taXNlPEdldE1vZHVsZXNBcmdzPjtcbmRlY2xhcmUgZ2xvYmFsIHtcbiAgICAvKiogTXVzdCBiZSBzZXQgY2xpZW50c2lkZSBCRUZPUkUgcmVxdWVzdHMgYXJlIG1hZGUgKHNvIHlvdSBsaWtlbHkgd2FudCB0byB1c2UgUmVxdWlyZUNvbnRyb2xsZXIuYWRkTWFwR2V0TW9kdWxlc1xuICAgICAqICAgICAgdG8gaW5qZWN0IGNvZGUgdGhhdCB3aWxsIHVzZSB0aGlzKSAqL1xuICAgIHZhciByZW1hcEltcG9ydFJlcXVlc3RzQ2xpZW50c2lkZTogdW5kZWZpbmVkIHwgQ2xpZW50UmVtYXBDYWxsYmFja1tdO1xufVxuXG4vLyBTaGFyZWQgYWNyb3NzIGNvcGllcyBvZiB0aGlzIHBhY2thZ2UsIHNvIHRoZSByZWdpc3RlcmVkIGNvbnRyb2xsZXIgYW5kIHJvb3RSZXNvbHZlUGF0aCAoc2V0IGJ5XG4vLyAgc2V0UmVxdWlyZUJvb3RSZXF1aXJlKSBhcmUgdGhlIHNhbWUgaW5zdGFuY2UgZXZlcnlvbmUgcmVhZHMvd3JpdGVzLiBTZWUgY3JlYXRlU2luZ2xldG9uLlxuY29uc3QgYmFzZUNvbnRyb2xsZXIgPSBjcmVhdGVTaW5nbGV0b24oXCJSZXF1aXJlQ29udHJvbGxlci5iYXNlQ29udHJvbGxlclwiLCAxLCAoKSA9PiBuZXcgUmVxdWlyZUNvbnRyb2xsZXJCYXNlKCkpLmdldCgpO1xuLyoqIEBkZXByZWNhdGVkLCBub3QgbmVlZGVkLCBhcyB0aGlzIGRlZmF1bHRzIHRvIFwiLlwiLCB3aGljaCBpcyBhIGxvdCBlYXNpZXIgdG8gcmVhc29uIGFib3V0IGFueXdheXMuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UmVxdWlyZUJvb3RSZXF1aXJlKGRpcjogc3RyaW5nKSB7XG4gICAgZGlyID0gcGF0aC5yZXNvbHZlKGRpcik7XG4gICAgZGlyID0gZGlyLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiL1wiKTtcbiAgICBpZiAoIWRpci5lbmRzV2l0aChcIi9cIikpIHtcbiAgICAgICAgZGlyICs9IFwiL1wiO1xuICAgIH1cbiAgICBiYXNlQ29udHJvbGxlci5yb290UmVzb2x2ZVBhdGggPSBkaXI7XG59XG5cbi8vIFNoYXJlZCBhY3Jvc3MgY29waWVzLCBzbyBjYWxsaW5nIGFsbG93QWxsTm9kZU1vZHVsZXMoKSBvbiBhbnkgY29weSBpcyBzZWVuIGJ5IHRoZSBzZXJ2aW5nXG4vLyAgY29udHJvbGxlcidzIGdldElzQWxsb3dDbGllbnQuIFNlZSBjcmVhdGVTaW5nbGV0b24uXG5jb25zdCBhbGxvd0FsbE5vZGVNb2R1bGVzRmxhZyA9IGNyZWF0ZVNpbmdsZXRvbihcIlJlcXVpcmVDb250cm9sbGVyLmFsbG93QWxsTm9kZU1vZHVsZXNcIiwgMSwgKCkgPT4gKHsgdmFsdWU6IGZhbHNlIH0pKTtcbmV4cG9ydCBmdW5jdGlvbiBhbGxvd0FsbE5vZGVNb2R1bGVzKCkge1xuICAgIGFsbG93QWxsTm9kZU1vZHVsZXNGbGFnLmdldCgpLnZhbHVlID0gdHJ1ZTtcbn1cblxuZXhwb3J0IGNvbnN0IFJlcXVpcmVDb250cm9sbGVyID0gU29ja2V0RnVuY3Rpb24ucmVnaXN0ZXIoXG4gICAgXCJSZXF1aXJlQ29udHJvbGxlci1lMmY4MTFmMy0xNGI4LTQ3NTktYjBkNi03M2YxNDUxNmNmMWRcIixcbiAgICBiYXNlQ29udHJvbGxlcixcbiAgICAoKSA9PiAoe1xuICAgICAgICBnZXRNb2R1bGVzOiB7fSxcbiAgICAgICAgcmVxdWlyZUhUTUw6IHt9LFxuICAgICAgICBidWZmZXJKUzoge30sXG4gICAgICAgIHJlcXVpcmVKUzoge30sXG4gICAgfSksXG4gICAgdW5kZWZpbmVkLFxuICAgIHtcbiAgICAgICAgbm9BdXRvRXhwb3NlOiB0cnVlLFxuICAgICAgICBzdGF0aWNzOiB7XG4gICAgICAgICAgICBpbmplY3RIVE1MQmVmb3JlU3RhcnR1cCxcbiAgICAgICAgICAgIGFkZE1hcEdldE1vZHVsZXMsXG4gICAgICAgICAgICBhZGRTdGF0aWNSb290LFxuICAgICAgICAgICAgYWxsb3dBbGxOb2RlTW9kdWxlcyxcbiAgICAgICAgfVxuICAgIH1cbik7Il19
386
- /* _JS_SOURCE_HASH = "fe9fd1e530d2e0b492e48cceb5996f27ce6f6e9ad2503ec764c6cf3661446752"; */
@@ -1,41 +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"; 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
- Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
- //exports.setFlag = exports.forceModule = void 0;
4
- /// <reference path="./RequireController.ts" />
5
- module.allowclient = true;
6
- /**
7
- * Adds a global function setFlag(require, "typescript", flag) which sets a flag on the client
8
- * - Ex, setFlag(require, "typescript", "allowclient") so allowclient = true on the typescript module.
9
- * - Passing true as the fourth argument sets it recursively
10
- */
11
- // We need at least 1 export, to force this to be treated like a module
12
- exports.forceModule = true;
13
- function setRecursive(bangPart, module) {
14
- let m = module;
15
- m.recursiveBangs = m.recursiveBangs || {};
16
- if (m.recursiveBangs[bangPart])
17
- return;
18
- m.recursiveBangs[bangPart] = true;
19
- Object.assign(module, { [bangPart]: true });
20
- for (let child of module.children) {
21
- setRecursive(bangPart, child);
22
- }
23
- }
24
- globalThis.setFlag = setFlag;
25
- function setFlag(require, request, flag, recursive) {
26
- let resolvedPath = require.resolve(request);
27
- let module = require.cache[resolvedPath];
28
- if (!module) {
29
- console.warn(`setFlag cannot resolve module ${request}`);
30
- return;
31
- }
32
- if (recursive) {
33
- setRecursive(flag, module);
34
- }
35
- else {
36
- module[flag] = true;
37
- }
38
- }
39
- exports.setFlag = setFlag;
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZUZsYWdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tcGlsZUZsYWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtDQUErQztBQUMvQyxNQUFNLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztBQUUxQjs7OztHQUlHO0FBRUgsdUVBQXVFO0FBQzFELFFBQUEsV0FBVyxHQUFHLElBQUksQ0FBQztBQU1oQyxTQUFTLFlBQVksQ0FBQyxRQUFnQixFQUFFLE1BQXFCO0lBQ3pELElBQUksQ0FBQyxHQUFHLE1BQWEsQ0FBQztJQUN0QixDQUFDLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO0lBRTFDLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7UUFBRSxPQUFPO0lBRXZDLENBQUMsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBRWxDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLEtBQUssSUFBSSxLQUFLLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLFlBQVksQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztBQUNMLENBQUM7QUFFQSxVQUFrQixDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7QUFDdEMsU0FBZ0IsT0FBTyxDQUFDLE9BQW9CLEVBQUUsT0FBZSxFQUFFLElBQVksRUFBRSxTQUFtQjtJQUM1RixJQUFJLFlBQVksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFRLENBQUM7SUFDaEQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN6RCxPQUFPO0lBQ1gsQ0FBQztJQUNELElBQUksU0FBUyxFQUFFLENBQUM7UUFDWixZQUFZLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7U0FBTSxDQUFDO1FBQ0osTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0FBQ0wsQ0FBQztBQVpELDBCQVlDIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4vUmVxdWlyZUNvbnRyb2xsZXIudHNcIiAvPlxubW9kdWxlLmFsbG93Y2xpZW50ID0gdHJ1ZTtcblxuLyoqXG4gKiAgICAgIEFkZHMgYSBnbG9iYWwgZnVuY3Rpb24gc2V0RmxhZyhyZXF1aXJlLCBcInR5cGVzY3JpcHRcIiwgZmxhZykgd2hpY2ggc2V0cyBhIGZsYWcgb24gdGhlIGNsaWVudFxuICogICAgICAgICAgLSBFeCwgc2V0RmxhZyhyZXF1aXJlLCBcInR5cGVzY3JpcHRcIiwgXCJhbGxvd2NsaWVudFwiKSBzbyBhbGxvd2NsaWVudCA9IHRydWUgb24gdGhlIHR5cGVzY3JpcHQgbW9kdWxlLlxuICogICAgICAgICAgLSBQYXNzaW5nIHRydWUgYXMgdGhlIGZvdXJ0aCBhcmd1bWVudCBzZXRzIGl0IHJlY3Vyc2l2ZWx5XG4gKi9cblxuLy8gV2UgbmVlZCBhdCBsZWFzdCAxIGV4cG9ydCwgdG8gZm9yY2UgdGhpcyB0byBiZSB0cmVhdGVkIGxpa2UgYSBtb2R1bGVcbmV4cG9ydCBjb25zdCBmb3JjZU1vZHVsZSA9IHRydWU7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgICAvL2Z1bmN0aW9uIHNldEZsYWcocmVxdWlyZTogTm9kZVJlcXVpcmUsIHJlcXVlc3Q6IHN0cmluZywgZmxhZzogc3RyaW5nLCByZWN1cnNpdmU/OiBib29sZWFuKTogdm9pZDtcbn1cblxuZnVuY3Rpb24gc2V0UmVjdXJzaXZlKGJhbmdQYXJ0OiBzdHJpbmcsIG1vZHVsZTogTm9kZUpTLk1vZHVsZSkge1xuICAgIGxldCBtID0gbW9kdWxlIGFzIGFueTtcbiAgICBtLnJlY3Vyc2l2ZUJhbmdzID0gbS5yZWN1cnNpdmVCYW5ncyB8fCB7fTtcblxuICAgIGlmIChtLnJlY3Vyc2l2ZUJhbmdzW2JhbmdQYXJ0XSkgcmV0dXJuO1xuXG4gICAgbS5yZWN1cnNpdmVCYW5nc1tiYW5nUGFydF0gPSB0cnVlO1xuXG4gICAgT2JqZWN0LmFzc2lnbihtb2R1bGUsIHsgW2JhbmdQYXJ0XTogdHJ1ZSB9KTtcbiAgICBmb3IgKGxldCBjaGlsZCBvZiBtb2R1bGUuY2hpbGRyZW4pIHtcbiAgICAgICAgc2V0UmVjdXJzaXZlKGJhbmdQYXJ0LCBjaGlsZCk7XG4gICAgfVxufVxuXG4oZ2xvYmFsVGhpcyBhcyBhbnkpLnNldEZsYWcgPSBzZXRGbGFnO1xuZXhwb3J0IGZ1bmN0aW9uIHNldEZsYWcocmVxdWlyZTogTm9kZVJlcXVpcmUsIHJlcXVlc3Q6IHN0cmluZywgZmxhZzogc3RyaW5nLCByZWN1cnNpdmU/OiBib29sZWFuKSB7XG4gICAgbGV0IHJlc29sdmVkUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShyZXF1ZXN0KTtcbiAgICBsZXQgbW9kdWxlID0gcmVxdWlyZS5jYWNoZVtyZXNvbHZlZFBhdGhdIGFzIGFueTtcbiAgICBpZiAoIW1vZHVsZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYHNldEZsYWcgY2Fubm90IHJlc29sdmUgbW9kdWxlICR7cmVxdWVzdH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVjdXJzaXZlKSB7XG4gICAgICAgIHNldFJlY3Vyc2l2ZShmbGFnLCBtb2R1bGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG1vZHVsZVtmbGFnXSA9IHRydWU7XG4gICAgfVxufSJdfQ==
41
- /* _JS_SOURCE_HASH = "063a6c45a4e2b0ef6a411afcc472c348cb33d746faaa213f659249a8441ac4e3"; */