socket-function 1.1.49 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/SocketFunction.d.ts +1 -1
  2. package/SocketFunctionTypes.d.ts +1 -1
  3. package/dist/SetProcessVariables.ts.cache +9 -0
  4. package/dist/SocketFunction.ts.cache +467 -0
  5. package/hot/HotReloadController.d.ts +3 -3
  6. package/hot/dist/HotReloadController.ts.cache +252 -0
  7. package/index.d.ts +10 -25
  8. package/package.json +1 -1
  9. package/require/CSSShim.d.ts +1 -1
  10. package/require/RequireController.d.ts +2 -2
  11. package/require/compileFlags.d.ts +1 -1
  12. package/require/dist/RequireController.ts.cache +386 -0
  13. package/require/dist/compileFlags.ts.cache +41 -0
  14. package/require/dist/extMapper.ts.cache +368 -0
  15. package/require/dist/require.ts.cache +676 -0
  16. package/require/require.d.ts +1 -1
  17. package/src/JSONLACKS/dist/JSONLACKS.ts.cache +469 -0
  18. package/src/callManager.d.ts +1 -1
  19. package/src/dist/CallFactory.ts.cache +930 -0
  20. package/src/dist/Zip.ts.cache +156 -0
  21. package/src/dist/batching.ts.cache +377 -0
  22. package/src/dist/bits.ts.cache +121 -0
  23. package/src/dist/buffers.ts.cache +76 -0
  24. package/src/dist/caching.ts.cache +302 -0
  25. package/src/dist/callHTTPHandler.ts.cache +264 -0
  26. package/src/dist/callManager.ts.cache +159 -0
  27. package/src/dist/certStore.ts.cache +59 -0
  28. package/src/dist/createSingleton.ts.cache +62 -0
  29. package/src/dist/fixLargeNetworkCalls.ts.cache +17 -0
  30. package/src/dist/forwardPort.ts.cache +222 -0
  31. package/src/dist/https.ts.cache +141 -0
  32. package/src/dist/misc.ts.cache +499 -0
  33. package/src/dist/nodeCache.ts.cache +136 -0
  34. package/src/dist/nodeProxy.ts.cache +57 -0
  35. package/src/dist/protocolNegotiation.ts.cache +101 -0
  36. package/src/dist/tlsParsing.ts.cache +85 -0
  37. package/src/dist/types.ts.cache +9 -0
  38. package/src/dist/webSocketServer.ts.cache +365 -0
  39. package/src/dist/websocketFactory.ts.cache +53 -0
  40. package/src/formatting/dist/colors.ts.cache +98 -0
  41. package/src/formatting/dist/format.ts.cache +396 -0
  42. package/src/formatting/dist/logColors.ts.cache +28 -0
  43. package/src/lz4/dist/LZ4.ts.cache +53 -0
  44. package/src/profiling/dist/getOwnTime.ts.cache +100 -0
  45. package/src/profiling/dist/measure.ts.cache +338 -0
  46. package/src/profiling/dist/stats.ts.cache +202 -0
  47. package/src/profiling/dist/statsFormat.ts.cache +45 -0
  48. package/src/profiling/getOwnTime.ts +7 -1
  49. package/src/profiling/measure.ts +25 -16
  50. package/test.ts +11 -5
  51. package/time/dist/trueTimeShim.ts.cache +656 -0
  52. package/time/trueTimeShim.d.ts +1 -16
  53. package/time/trueTimeShim.ts +7 -43
@@ -1,4 +1,4 @@
1
- /// <reference path="../src/src.d.ts" />
1
+ /// <reference types="socket-function/src/src" />
2
2
  declare global {
3
3
  var onProgressHandler: undefined | ((progress: {
4
4
  type: string;
@@ -0,0 +1,469 @@
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
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
29
+ exports.JSONLACKS = void 0;
30
+ const measure_1 = require("../profiling/measure");
31
+ const fs_1 = __importDefault(require("fs"));
32
+ const JSONLACKS_generated_js_1 = __importDefault(require("./JSONLACKS.generated.js"));
33
+ const misc_1 = require("../misc");
34
+ const types_1 = require("../types");
35
+ const batching_1 = require("../batching");
36
+ const SERIALIZE_OBJECT_BATCH_COUNT = 1000;
37
+ const PARSE_BYTE_CHUNK_SIZE = 1024 * 1024 * 10;
38
+ // Supports json and also:
39
+ // - Non quoted field names "{ x: 1 }"?
40
+ // - Trailing commas
41
+ // NOTE: Comma only syntax is not supported, ex, "[,,]", which is an array of length 2 in javascript
42
+ // - Comments on input, but not on output
43
+ // - References
44
+ // - Buffers (just Buffers, not typed arrays)
45
+ // The stringify function always creates valid json, as the syntax for references and buffers
46
+ // will just be special property names and values.
47
+ // NOTE: We don't support Date serialization. Never store Dates, store "number".
48
+ class JSONLACKS {
49
+ static stringify(obj, config) {
50
+ let serialized = JSONLACKS.escapeSpecialObjects(obj, config);
51
+ return JSON.stringify(serialized);
52
+ }
53
+ /** Is useful when serializing an array to a file with one object per line */
54
+ static async stringifyFile(obj, config) {
55
+ let serialized = JSONLACKS.escapeSpecialObjects(obj, config);
56
+ let buffers = [];
57
+ for (let i = 0; i < serialized.length; i += SERIALIZE_OBJECT_BATCH_COUNT) {
58
+ let str = serialized.slice(i, i + SERIALIZE_OBJECT_BATCH_COUNT).map(x => JSON.stringify(x) + "\n").join("");
59
+ buffers.push(Buffer.from(str));
60
+ await (0, batching_1.delay)("immediate");
61
+ }
62
+ // Break up into chunks, as string => Buffer i
63
+ return Buffer.concat(buffers);
64
+ }
65
+ static stringifyFileSync(obj, config) {
66
+ let serialized = JSONLACKS.escapeSpecialObjects(obj, config);
67
+ let buffers = [];
68
+ for (let i = 0; i < serialized.length; i += SERIALIZE_OBJECT_BATCH_COUNT) {
69
+ let str = serialized.slice(i, i + SERIALIZE_OBJECT_BATCH_COUNT).map(x => JSON.stringify(x) + "\n").join("");
70
+ buffers.push(Buffer.from(str));
71
+ }
72
+ // Break up into chunks, as string => Buffer i
73
+ return Buffer.concat(buffers);
74
+ }
75
+ // TIMING: Seems to be about 40X slower than JSON.parse unless extended is set to false,
76
+ // then it is about 2X slower (although it depends on the size and complexity of the objects!)
77
+ static parse(text, config, hydrateState) {
78
+ var _a;
79
+ // Empty string should parse to SOMETHING
80
+ if (text.trim() === "")
81
+ return undefined;
82
+ let obj;
83
+ let extendedParsing = (_a = config === null || config === void 0 ? void 0 : config.extended) !== null && _a !== void 0 ? _a : JSONLACKS.EXTENDED_PARSER;
84
+ if (extendedParsing) {
85
+ obj = JSONLACKS_generated_js_1.default.parse(text);
86
+ }
87
+ else {
88
+ try {
89
+ obj = JSON.parse(text);
90
+ }
91
+ catch (_b) {
92
+ obj = JSONLACKS_generated_js_1.default.parse(text);
93
+ }
94
+ }
95
+ return JSONLACKS.hydrateSpecialObjects(obj, hydrateState, config);
96
+ }
97
+ static async parseLines(buffer, config) {
98
+ let output = [];
99
+ let pos = 0;
100
+ let hydrateState = {
101
+ references: new Map(),
102
+ visited: new Set(),
103
+ };
104
+ function parseChunk() {
105
+ let start = pos;
106
+ let lastNewLine = 0;
107
+ while (pos < buffer.length && (!lastNewLine || (pos - start) < PARSE_BYTE_CHUNK_SIZE)) {
108
+ let byte = buffer[pos];
109
+ if (byte === 10) {
110
+ lastNewLine = pos;
111
+ }
112
+ pos++;
113
+ }
114
+ if (pos === buffer.length) {
115
+ lastNewLine = pos;
116
+ }
117
+ pos = lastNewLine + 1;
118
+ let text = buffer.slice(start, lastNewLine).toString("utf8");
119
+ let lines = text
120
+ .replaceAll("\r", "")
121
+ .split("\n")
122
+ .filter(x => x && !x.startsWith("//"));
123
+ let linesJSON = "[";
124
+ for (let i = 0; i < lines.length; i++) {
125
+ if (i !== 0)
126
+ linesJSON += ",";
127
+ linesJSON += lines[i];
128
+ }
129
+ linesJSON += "]";
130
+ if (config === null || config === void 0 ? void 0 : config.discardMissingReferences) {
131
+ try {
132
+ let parts = JSONLACKS.parse(linesJSON, config, hydrateState);
133
+ for (let part of parts) {
134
+ output.push(part);
135
+ }
136
+ }
137
+ catch (e) {
138
+ if (!e.message.includes("Reference to undefined id")) {
139
+ throw e;
140
+ }
141
+ for (let line of lines) {
142
+ try {
143
+ let part = JSONLACKS.parse(line, config, hydrateState);
144
+ output.push(part);
145
+ }
146
+ catch (e) {
147
+ if (!e.message.includes("Reference to undefined id")) {
148
+ throw e;
149
+ }
150
+ }
151
+ }
152
+ }
153
+ }
154
+ else {
155
+ let parts = JSONLACKS.parse(linesJSON, config, hydrateState);
156
+ for (let part of parts) {
157
+ output.push(part);
158
+ }
159
+ }
160
+ }
161
+ while (pos < buffer.length) {
162
+ parseChunk();
163
+ // Wait, to allow other thread to do work. We wait a long time... because we parse 10MB at once,
164
+ // so... this gives us 2s of delay per 1GB of parsing, which should only be a fraction of our parse time
165
+ if (pos < buffer.length) {
166
+ await (0, batching_1.delay)(20);
167
+ }
168
+ }
169
+ return output;
170
+ }
171
+ static escapeSpecialObjects(obj, config) {
172
+ // I think iterating twice for references is the fastest way to do it?
173
+ let objects = new Set();
174
+ // NOTE: Use unique values for references, to allow concatenating files without having to
175
+ // deal with escaping references.
176
+ let refPrefix = Date.now() + Math.random() + "";
177
+ let nextRefId = 0;
178
+ function getNextRefKey() {
179
+ return refPrefix + "_" + nextRefId++;
180
+ }
181
+ let refObjects = new Map();
182
+ findReferences(obj);
183
+ function findReferences(obj) {
184
+ if (!(0, types_1.canHaveChildren)(obj))
185
+ return;
186
+ if (refObjects.has(obj))
187
+ return;
188
+ if (objects.has(obj)) {
189
+ let refKey = getNextRefKey();
190
+ refObjects.set(obj, refKey);
191
+ return;
192
+ }
193
+ objects.add(obj);
194
+ for (let key in obj) {
195
+ findReferences(obj[key]);
196
+ }
197
+ }
198
+ let refsSeen = new Set();
199
+ return iterate(obj);
200
+ function iterate(obj, refHandled) {
201
+ if (!(0, types_1.canHaveChildren)(obj))
202
+ return obj;
203
+ if (!refHandled) {
204
+ let refKey = refObjects.get(obj);
205
+ if (refKey) {
206
+ if (refsSeen.has(obj)) {
207
+ return {
208
+ [JSONLACKS.LACKS_KEY]: "ref",
209
+ id: refKey,
210
+ };
211
+ }
212
+ refsSeen.add(obj);
213
+ return {
214
+ [JSONLACKS.LACKS_KEY]: "define",
215
+ id: refKey,
216
+ value: iterate(obj, true),
217
+ };
218
+ }
219
+ }
220
+ if (JSONLACKS.LACKS_KEY in obj) {
221
+ let restOfObj = { ...obj };
222
+ let escapedValue = restOfObj[JSONLACKS.LACKS_KEY];
223
+ delete restOfObj[JSONLACKS.LACKS_KEY];
224
+ return {
225
+ [JSONLACKS.LACKS_KEY]: "removedSpecialKey",
226
+ escapedValue: iterate(escapedValue),
227
+ restOfObj: iterate(restOfObj),
228
+ };
229
+ }
230
+ if (obj instanceof Buffer) {
231
+ return {
232
+ [JSONLACKS.LACKS_KEY]: "Buffer",
233
+ data: obj.toString("base64"),
234
+ };
235
+ }
236
+ let cloned = config === null || config === void 0 ? void 0 : config.allowObjectMutation;
237
+ function cloneObj() {
238
+ if (cloned)
239
+ return;
240
+ cloned = true;
241
+ if (Array.isArray(obj)) {
242
+ obj = [...obj];
243
+ }
244
+ else {
245
+ obj = { ...obj };
246
+ }
247
+ }
248
+ ;
249
+ for (let key in obj) {
250
+ let originalValue = obj[key];
251
+ let value = iterate(originalValue);
252
+ if (value !== originalValue) {
253
+ cloneObj();
254
+ obj[key] = value;
255
+ }
256
+ }
257
+ return obj;
258
+ }
259
+ }
260
+ static hydrateSpecialObjects(obj, hydrateState, config) {
261
+ let references = (hydrateState === null || hydrateState === void 0 ? void 0 : hydrateState.references) || new Map();
262
+ let visited = (hydrateState === null || hydrateState === void 0 ? void 0 : hydrateState.visited) || new Set();
263
+ return iterate(obj);
264
+ function iterate(obj) {
265
+ if (!(0, types_1.canHaveChildren)(obj))
266
+ return obj;
267
+ if (visited.has(obj))
268
+ return obj;
269
+ visited.add(obj);
270
+ let type = obj[JSONLACKS.LACKS_KEY];
271
+ if (!type) {
272
+ for (let key in obj) {
273
+ let originalValue = obj[key];
274
+ let value = iterate(originalValue);
275
+ if (value !== originalValue) {
276
+ obj[key] = value;
277
+ }
278
+ }
279
+ return obj;
280
+ }
281
+ if (type === "removedSpecialKey") {
282
+ let restOfObj = iterate(obj.restOfObj);
283
+ let escapedValue = iterate(obj.escapedValue);
284
+ return { ...restOfObj, [JSONLACKS.LACKS_KEY]: escapedValue };
285
+ }
286
+ if (type === "Buffer") {
287
+ return Buffer.from(obj.data, "base64");
288
+ }
289
+ if (type === "define") {
290
+ references.set(obj.id, iterate(obj.value));
291
+ return obj.value;
292
+ }
293
+ if (type === "ref") {
294
+ let id = obj.id;
295
+ if (!JSONLACKS.IGNORE_MISSING_REFERENCES && !references.has(id)) {
296
+ throw new Error(`Reference to undefined id "${id}"`);
297
+ }
298
+ return references.get(id);
299
+ }
300
+ throw new Error(`Unknown lacks type "${type}"`);
301
+ }
302
+ }
303
+ }
304
+ exports.JSONLACKS = JSONLACKS;
305
+ JSONLACKS.LACKS_KEY = "__JSONLACKS__98cfb4a05fa34d828661cae15b8779ce__";
306
+ /** If set to true parses non-quoted field names, comments, trailing commas, etc */
307
+ JSONLACKS.EXTENDED_PARSER = false;
308
+ JSONLACKS.IGNORE_MISSING_REFERENCES = false;
309
+ async function benchmark() {
310
+ const loops = 1000 * 100;
311
+ let inputs = [];
312
+ for (let i = 0; i < loops; i++) {
313
+ inputs.push(JSON.stringify({
314
+ i,
315
+ hello_there: i,
316
+ example: 5,
317
+ list: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
318
+ }) + " ");
319
+ }
320
+ JSON.parse(inputs[0]);
321
+ JSONLACKS_generated_js_1.default.parse(inputs[0]);
322
+ (0, measure_1.measureCodeSync)(function measure() {
323
+ (0, measure_1.measureBlock)(function JSON_PARSE() {
324
+ for (let i = 0; i < loops; i++) {
325
+ JSON.parse(inputs[i]);
326
+ }
327
+ });
328
+ (0, measure_1.measureBlock)(function JSON_PARSE_FREEZE() {
329
+ for (let i = 0; i < loops; i++) {
330
+ let obj = JSON.parse(inputs[i]);
331
+ (0, misc_1.recursiveFreeze)(obj);
332
+ }
333
+ });
334
+ (0, measure_1.measureBlock)(function EXTENDED_PARSE() {
335
+ for (let i = 0; i < loops; i++) {
336
+ JSONLACKS_generated_js_1.default.parse(inputs[i]);
337
+ }
338
+ });
339
+ (0, measure_1.measureBlock)(function JSONLACKS_PARSE() {
340
+ for (let i = 0; i < loops; i++) {
341
+ JSONLACKS.parse(inputs[i]);
342
+ }
343
+ });
344
+ (0, measure_1.measureBlock)(function JSONLACKS_PARSE_SIMPLE() {
345
+ for (let i = 0; i < loops; i++) {
346
+ JSONLACKS.parse(inputs[i], { extended: false });
347
+ }
348
+ });
349
+ }, {
350
+ thresholdInTable: 0
351
+ });
352
+ }
353
+ //benchmark().catch(console.error).finally(() => process.exit());
354
+ async function testJSONLACKS() {
355
+ {
356
+ let obj = {};
357
+ let str = JSONLACKS.stringify({
358
+ a: obj,
359
+ b: obj,
360
+ });
361
+ let parsed = JSONLACKS.parse(str);
362
+ if (parsed.a !== parsed.b) {
363
+ throw new Error("Failed to maintain references");
364
+ }
365
+ if (typeof parsed.a !== "object") {
366
+ throw new Error("Object become corrupted");
367
+ }
368
+ }
369
+ // Test LACKS_KEY is escaped correctly
370
+ {
371
+ let obj = { [JSONLACKS.LACKS_KEY]: "hello" };
372
+ let str = JSONLACKS.stringify(obj);
373
+ let parsed = JSONLACKS.parse(str);
374
+ if (JSON.stringify(obj) !== JSON.stringify(parsed)) {
375
+ throw new Error("Failed to escape LACKS_KEY");
376
+ }
377
+ }
378
+ // Test buffers are preserved
379
+ {
380
+ let obj = { a: Buffer.from("hello") };
381
+ let str = JSONLACKS.stringify(obj);
382
+ let parsed = JSONLACKS.parse(str);
383
+ if (obj.a.toString() !== parsed.a.toString()) {
384
+ throw new Error(`Failed to preserve buffers`);
385
+ }
386
+ }
387
+ // Test references 2
388
+ {
389
+ let base = {};
390
+ let arr = [base, base];
391
+ let obj = { x: arr, y: arr };
392
+ let result = JSONLACKS.parse(JSONLACKS.stringify(obj), { extended: false });
393
+ if (JSON.stringify(result) !== JSON.stringify(obj)) {
394
+ throw new Error(`Corrupted values, expected ${JSON.stringify(obj)}, got ${JSON.stringify(result)}`);
395
+ }
396
+ if (result.x !== result.y) {
397
+ throw new Error(`Failed to maintain references`);
398
+ }
399
+ if (result.x[0] !== result.x[1]) {
400
+ throw new Error(`Failed to maintain references`);
401
+ }
402
+ }
403
+ }
404
+ //testJSONLACKS().catch(console.error).finally(() => process.exit());
405
+ async function generateAndVerifyParser() {
406
+ const pegjs = await Promise.resolve().then(() => __importStar(require("pegjs")));
407
+ var grammar = fs_1.default.readFileSync(__dirname + "/JSONLACKS.pegjs", "utf8");
408
+ var parserSource = pegjs.generate(grammar, { output: "source", format: "commonjs" });
409
+ fs_1.default.writeFileSync(__dirname + "/JSONLACKS.generated.js", parserSource);
410
+ var module = { exports: {} };
411
+ eval(parserSource);
412
+ const parser = module.exports;
413
+ function verify(text, forcedObj) {
414
+ var parsed = parser.parse(text);
415
+ var result = JSON.stringify(parsed);
416
+ let realResult = forcedObj !== null && forcedObj !== void 0 ? forcedObj : JSON.stringify(eval("(" + text + ")"));
417
+ if (result !== realResult) {
418
+ throw new Error(`Failed to parse: ${text} should be ${realResult}, was ${result}`);
419
+ }
420
+ console.log("Parsed correctly: ", text);
421
+ }
422
+ verify(`
423
+ {
424
+ "hello_there": 1,
425
+ }
426
+ `);
427
+ verify(`
428
+ {
429
+ hello_there: 1,
430
+ }
431
+ `);
432
+ verify(`
433
+ {
434
+ hello_there: 1,
435
+ more: 1,
436
+ }
437
+ `);
438
+ verify(`{ list: [1,], }`);
439
+ verify(`{ list: [1,], list2: [1,], }`);
440
+ verify(`{ /* test */ list: [1,], list2: [1,], }`);
441
+ verify(`{ /* test */ /* test 2 */ list: [1,], list2: [1,], }`);
442
+ verify(`
443
+ {
444
+ /* test */
445
+ /* test 2 */
446
+ list: [1,],
447
+ // Single line comment
448
+ list2: [1,],
449
+ // list3: [3],
450
+ }
451
+ `);
452
+ // Multiline double quote strings
453
+ verify(`
454
+ {
455
+ value: "a
456
+ b"
457
+ }
458
+ `, JSON.stringify({ value: "a\nb" }));
459
+ // Single quotes
460
+ verify(`
461
+ {
462
+ value: 'a'
463
+ }
464
+ `);
465
+ verify(`undefined`);
466
+ }
467
+ //generateAndVerifyParser().catch(console.error).finally(() => process.exit());
468
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSlNPTkxBQ0tTLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiSlNPTkxBQ0tTLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0Esa0RBQWtIO0FBSWxILDRDQUFvQjtBQUVwQixzRkFBOEM7QUFDOUMsa0NBQTBDO0FBQzFDLG9DQUEyQztBQUMzQywwQ0FBb0M7QUFFcEMsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLENBQUM7QUFDMUMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztBQW9CL0MsMEJBQTBCO0FBQzFCLHdDQUF3QztBQUN4QyxxQkFBcUI7QUFDckIseUdBQXlHO0FBQ3pHLDBDQUEwQztBQUMxQyxnQkFBZ0I7QUFDaEIsOENBQThDO0FBQzlDLDZGQUE2RjtBQUM3RixtREFBbUQ7QUFDbkQsZ0ZBQWdGO0FBQ2hGLE1BQWEsU0FBUztJQU9YLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBWSxFQUFFLE1BQWtDO1FBQ3BFLElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFDRCw2RUFBNkU7SUFDdEUsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsR0FBYyxFQUFFLE1BQWtDO1FBQ2hGLElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFjLENBQUM7UUFDMUUsSUFBSSxPQUFPLEdBQWEsRUFBRSxDQUFDO1FBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSw0QkFBNEIsRUFBRSxDQUFDO1lBQ3ZFLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENB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S0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLGNBQWMsVUFBVSxTQUFTLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdkYsQ0FBQztRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELE1BQU0sQ0FBQzs7OztLQUlOLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQzs7OztLQUlOLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQzs7Ozs7S0FLTixDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMxQixNQUFNLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUV2QyxNQUFNLENBQUMseUNBQXlDLENBQUMsQ0FBQztJQUNsRCxNQUFNLENBQUMsc0RBQXNELENBQUMsQ0FBQztJQUMvRCxNQUFNLENBQUM7Ozs7Ozs7OztLQVNOLENBQUMsQ0FBQztJQUNILGlDQUFpQztJQUNqQyxNQUFNLENBQUM7Ozs7O0tBS04sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV0QyxnQkFBZ0I7SUFDaEIsTUFBTSxDQUFDOzs7O0tBSU4sQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFDRCwrRUFBK0UiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7IGVuYWJsZU1lYXN1cmVtZW50cywgbWVhc3VyZUJsb2NrLCBtZWFzdXJlQ29kZSwgbWVhc3VyZUNvZGVTeW5jLCBtZWFzdXJlRm5jIH0gZnJvbSBcIi4uL3Byb2ZpbGluZy9tZWFzdXJlXCI7XG4vLyBlbmFibGVNZWFzdXJlbWVudHMoKTtcblxuaW1wb3J0IGRlYnVnYnJlYWsgZnJvbSBcImRlYnVnYnJlYWtcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcblxuaW1wb3J0IHBhcnNlciBmcm9tIFwiLi9KU09OTEFDS1MuZ2VuZXJhdGVkLmpzXCI7XG5pbXBvcnQgeyByZWN1cnNpdmVGcmVlemUgfSBmcm9tIFwiLi4vbWlzY1wiO1xuaW1wb3J0IHsgY2FuSGF2ZUNoaWxkcmVuIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCIuLi9iYXRjaGluZ1wiO1xuXG5jb25zdCBTRVJJQUxJWkVfT0JKRUNUX0JBVENIX0NPVU5UID0gMTAwMDtcbmNvbnN0IFBBUlNFX0JZVEVfQ0hVTktfU0laRSA9IDEwMjQgKiAxMDI0ICogMTA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSlNPTkxBQ0tTX1BhcnNlQ29uZmlnIHtcbiAgICAvLyBEZWZhdWx0cyB0byB0cnVlLiBFbmFibGVzIHBhcnNpbmcgb2Y6XG4gICAgLy8gIC0gVHJhaWxpbmcgY29tbWFzXG4gICAgLy8gIC0gTm9uLXF1b3RlZCBmaWVsZCBuYW1lcyAoZXgsIFwieyB4OiAxIH1cIilcbiAgICAvLyAgLSBDb21tZW50cyAoc3RyaXBzIHRoZW0sIGJ1dCBkb2Vzbid0IHRocm93KVxuICAgIGV4dGVuZGVkPzogYm9vbGVhbjtcbiAgICBkaXNjYXJkTWlzc2luZ1JlZmVyZW5jZXM/OiBib29sZWFuO1xufVxuZXhwb3J0IGludGVyZmFjZSBKU09OTEFDS1NfU3RyaW5naWZ5Q29uZmlnIHtcbiAgICAvLyBJZiBzcGVjaWZpZWQsIHdlIGFyZSBhbGxvd2VkIHRvIG11dGF0ZSB0aGUgcHJvdmlkZWQgb2JqZWN0LiBTcGVlZHMgdXAgc2VyaWFsaXphdGlvbi5cbiAgICBhbGxvd09iamVjdE11dGF0aW9uPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEh5ZHJhdGVTdGF0ZSB7XG4gICAgcmVmZXJlbmNlczogTWFwPHN0cmluZywgdW5rbm93bj4sXG4gICAgdmlzaXRlZDogU2V0PHVua25vd24+LFxufVxuXG4vLyBTdXBwb3J0cyBqc29uIGFuZCBhbHNvOlxuLy8gIC0gTm9uIHF1b3RlZCBmaWVsZCBuYW1lcyBcInsgeDogMSB9XCI/XG4vLyAgLSBUcmFpbGluZyBjb21tYXNcbi8vICAgICAgTk9URTogQ29tbWEgb25seSBzeW50YXggaXMgbm90IHN1cHBvcnRlZCwgZXgsIFwiWywsXVwiLCB3aGljaCBpcyBhbiBhcnJheSBvZiBsZW5ndGggMiBpbiBqYXZhc2NyaXB0XG4vLyAgLSBDb21tZW50cyBvbiBpbnB1dCwgYnV0IG5vdCBvbiBvdXRwdXRcbi8vICAtIFJlZmVyZW5jZXNcbi8vICAtIEJ1ZmZlcnMgKGp1c3QgQnVmZmVycywgbm90IHR5cGVkIGFycmF5cylcbi8vIFRoZSBzdHJpbmdpZnkgZnVuY3Rpb24gYWx3YXlzIGNyZWF0ZXMgdmFsaWQganNvbiwgYXMgdGhlIHN5bnRheCBmb3IgcmVmZXJlbmNlcyBhbmQgYnVmZmVyc1xuLy8gIHdpbGwganVzdCBiZSBzcGVjaWFsIHByb3BlcnR5IG5hbWVzIGFuZCB2YWx1ZXMuXG4vLyBOT1RFOiBXZSBkb24ndCBzdXBwb3J0IERhdGUgc2VyaWFsaXphdGlvbi4gTmV2ZXIgc3RvcmUgRGF0ZXMsIHN0b3JlIFwibnVtYmVyXCIuXG5leHBvcnQgY2xhc3MgSlNPTkxBQ0tTIHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IExBQ0tTX0tFWSA9IFwiX19KU09OTEFDS1NfXzk4Y2ZiNGEwNWZhMzRkODI4NjYxY2FlMTViODc3OWNlX19cIjtcblxuICAgIC8qKiBJZiBzZXQgdG8gdHJ1ZSBwYXJzZXMgbm9uLXF1b3RlZCBmaWVsZCBuYW1lcywgY29tbWVudHMsIHRyYWlsaW5nIGNvbW1hcywgZXRjICovXG4gICAgcHVibGljIHN0YXRpYyBFWFRFTkRFRF9QQVJTRVIgPSBmYWxzZTtcbiAgICBwdWJsaWMgc3RhdGljIElHTk9SRV9NSVNTSU5HX1JFRkVSRU5DRVMgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5naWZ5KG9iajogdW5rbm93biwgY29uZmlnPzogSlNPTkxBQ0tTX1N0cmluZ2lmeUNvbmZpZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBzZXJpYWxpemVkID0gSlNPTkxBQ0tTLmVzY2FwZVNwZWNpYWxPYmplY3RzKG9iaiwgY29uZmlnKTtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpO1xuICAgIH1cbiAgICAvKiogSXMgdXNlZnVsIHdoZW4gc2VyaWFsaXppbmcgYW4gYXJyYXkgdG8gYSBmaWxlIHdpdGggb25lIG9iamVjdCBwZXIgbGluZSAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgc3RyaW5naWZ5RmlsZShvYmo6IHVua25vd25bXSwgY29uZmlnPzogSlNPTkxBQ0tTX1N0cmluZ2lmeUNvbmZpZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgICAgIGxldCBzZXJpYWxpemVkID0gSlNPTkxBQ0tTLmVzY2FwZVNwZWNpYWxPYmplY3RzKG9iaiwgY29uZmlnKSBhcyB1bmtub3duW107XG4gICAgICAgIGxldCBidWZmZXJzOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlcmlhbGl6ZWQubGVuZ3RoOyBpICs9IFNFUklBTElaRV9PQkpFQ1RfQkFUQ0hfQ09VTlQpIHtcbiAgICAgICAgICAgIGxldCBzdHIgPSBzZXJpYWxpemVkLnNsaWNlKGksIGkgKyBTRVJJQUxJWkVfT0JKRUNUX0JBVENIX0NPVU5UKS5tYXAoeCA9PiBKU09OLnN0cmluZ2lmeSh4KSArIFwiXFxuXCIpLmpvaW4oXCJcIik7XG4gICAgICAgICAgICBidWZmZXJzLnB1c2goQnVmZmVyLmZyb20oc3RyKSk7XG4gICAgICAgICAgICBhd2FpdCBkZWxheShcImltbWVkaWF0ZVwiKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBCcmVhayB1cCBpbnRvIGNodW5rcywgYXMgc3RyaW5nID0+IEJ1ZmZlciBpXG4gICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIHN0cmluZ2lmeUZpbGVTeW5jKG9iajogdW5rbm93bltdLCBjb25maWc/OiBKU09OTEFDS1NfU3RyaW5naWZ5Q29uZmlnKTogQnVmZmVyIHtcbiAgICAgICAgbGV0IHNlcmlhbGl6ZWQgPSBKU09OTEFDS1MuZXNjYXBlU3BlY2lhbE9iamVjdHMob2JqLCBjb25maWcpIGFzIHVua25vd25bXTtcbiAgICAgICAgbGV0IGJ1ZmZlcnM6IEJ1ZmZlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VyaWFsaXplZC5sZW5ndGg7IGkgKz0gU0VSSUFMSVpFX09CSkVDVF9CQVRDSF9DT1VOVCkge1xuICAgICAgICAgICAgbGV0IHN0ciA9IHNlcmlhbGl6ZWQuc2xpY2UoaSwgaSArIFNFUklBTElaRV9PQkpFQ1RfQkFUQ0hfQ09VTlQpLm1hcCh4ID0+IEpTT04uc3RyaW5naWZ5KHgpICsgXCJcXG5cIikuam9pbihcIlwiKTtcbiAgICAgICAgICAgIGJ1ZmZlcnMucHVzaChCdWZmZXIuZnJvbShzdHIpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBCcmVhayB1cCBpbnRvIGNodW5rcywgYXMgc3RyaW5nID0+IEJ1ZmZlciBpXG4gICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGJ1ZmZlcnMpO1xuICAgIH1cbiAgICAvLyBUSU1JTkc6IFNlZW1zIHRvIGJlIGFib3V0IDQwWCBzbG93ZXIgdGhhbiBKU09OLnBhcnNlIHVubGVzcyBleHRlbmRlZCBpcyBzZXQgdG8gZmFsc2UsXG4gICAgLy8gIHRoZW4gaXQgaXMgYWJvdXQgMlggc2xvd2VyIChhbHRob3VnaCBpdCBkZXBlbmRzIG9uIHRoZSBzaXplIGFuZCBjb21wbGV4aXR5IG9mIHRoZSBvYmplY3RzISlcbiAgICBwdWJsaWMgc3RhdGljIHBhcnNlPFQ+KHRleHQ6IHN0cmluZywgY29uZmlnPzogSlNPTkxBQ0tTX1BhcnNlQ29uZmlnLCBoeWRyYXRlU3RhdGU/OiBIeWRyYXRlU3RhdGUpOiBUIHtcbiAgICAgICAgLy8gRW1wdHkgc3RyaW5nIHNob3VsZCBwYXJzZSB0byBTT01FVEhJTkdcbiAgICAgICAgaWYgKHRleHQudHJpbSgpID09PSBcIlwiKSByZXR1cm4gdW5kZWZpbmVkIGFzIFQ7XG4gICAgICAgIGxldCBvYmo6IHVua25vd247XG5cbiAgICAgICAgbGV0IGV4dGVuZGVkUGFyc2luZyA9IGNvbmZpZz8uZXh0ZW5kZWQgPz8gSlNPTkxBQ0tTLkVYVEVOREVEX1BBUlNFUjtcblxuICAgICAgICBpZiAoZXh0ZW5kZWRQYXJzaW5nKSB7XG4gICAgICAgICAgICBvYmogPSBwYXJzZXIucGFyc2UodGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG9iaiA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBvYmogPSBwYXJzZXIucGFyc2UodGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gSlNPTkxBQ0tTLmh5ZHJhdGVTcGVjaWFsT2JqZWN0cyhvYmosIGh5ZHJhdGVTdGF0ZSwgY29uZmlnKSBhcyBUO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIHBhcnNlTGluZXM8VD4oYnVmZmVyOiBCdWZmZXIsIGNvbmZpZz86IEpTT05MQUNLU19QYXJzZUNvbmZpZyk6IFByb21pc2U8VFtdPiB7XG4gICAgICAgIGxldCBvdXRwdXQ6IFRbXSA9IFtdO1xuICAgICAgICBsZXQgcG9zID0gMDtcbiAgICAgICAgbGV0IGh5ZHJhdGVTdGF0ZTogSHlkcmF0ZVN0YXRlID0ge1xuICAgICAgICAgICAgcmVmZXJlbmNlczogbmV3IE1hcCgpLFxuICAgICAgICAgICAgdmlzaXRlZDogbmV3IFNldCgpLFxuICAgICAgICB9O1xuICAgICAgICBmdW5jdGlvbiBwYXJzZUNodW5rKCkge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gcG9zO1xuICAgICAgICAgICAgbGV0IGxhc3ROZXdMaW5lID0gMDtcbiAgICAgICAgICAgIHdoaWxlIChwb3MgPCBidWZmZXIubGVuZ3RoICYmICghbGFzdE5ld0xpbmUgfHwgKHBvcyAtIHN0YXJ0KSA8IFBBUlNFX0JZVEVfQ0hVTktfU0laRSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgYnl0ZSA9IGJ1ZmZlcltwb3NdO1xuICAgICAgICAgICAgICAgIGlmIChieXRlID09PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0TmV3TGluZSA9IHBvcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcG9zKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocG9zID09PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbGFzdE5ld0xpbmUgPSBwb3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3MgPSBsYXN0TmV3TGluZSArIDE7XG5cbiAgICAgICAgICAgIGxldCB0ZXh0ID0gYnVmZmVyLnNsaWNlKHN0YXJ0LCBsYXN0TmV3TGluZSkudG9TdHJpbmcoXCJ1dGY4XCIpO1xuICAgICAgICAgICAgbGV0IGxpbmVzID0gdGV4dFxuICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKFwiXFxyXCIsIFwiXCIpXG4gICAgICAgICAgICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAgICAgICAgICAgLmZpbHRlcih4ID0+IHggJiYgIXguc3RhcnRzV2l0aChcIi8vXCIpKVxuICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgIGxldCBsaW5lc0pTT04gPSBcIltcIjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSAhPT0gMCkgbGluZXNKU09OICs9IFwiLFwiO1xuICAgICAgICAgICAgICAgIGxpbmVzSlNPTiArPSBsaW5lc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpbmVzSlNPTiArPSBcIl1cIjtcbiAgICAgICAgICAgIGlmIChjb25maWc/LmRpc2NhcmRNaXNzaW5nUmVmZXJlbmNlcykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJ0cyA9IEpTT05MQUNLUy5wYXJzZShsaW5lc0pTT04sIGNvbmZpZywgaHlkcmF0ZVN0YXRlKSBhcyBUW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHBhcnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZS5tZXNzYWdlLmluY2x1ZGVzKFwiUmVmZXJlbmNlIHRvIHVuZGVmaW5lZCBpZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJ0ID0gSlNPTkxBQ0tTLnBhcnNlKGxpbmUsIGNvbmZpZywgaHlkcmF0ZVN0YXRlKSBhcyBUO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKHBhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlLm1lc3NhZ2UuaW5jbHVkZXMoXCJSZWZlcmVuY2UgdG8gdW5kZWZpbmVkIGlkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFydHMgPSBKU09OTEFDS1MucGFyc2UobGluZXNKU09OLCBjb25maWcsIGh5ZHJhdGVTdGF0ZSkgYXMgVFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2gocGFydCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChwb3MgPCBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICBwYXJzZUNodW5rKCk7XG4gICAgICAgICAgICAvLyBXYWl0LCB0byBhbGxvdyBvdGhlciB0aHJlYWQgdG8gZG8gd29yay4gV2Ugd2FpdCBhIGxvbmcgdGltZS4uLiBiZWNhdXNlIHdlIHBhcnNlIDEwTUIgYXQgb25jZSxcbiAgICAgICAgICAgIC8vICBzby4uLiB0aGlzIGdpdmVzIHVzIDJzIG9mIGRlbGF5IHBlciAxR0Igb2YgcGFyc2luZywgd2hpY2ggc2hvdWxkIG9ubHkgYmUgYSBmcmFjdGlvbiBvZiBvdXIgcGFyc2UgdGltZVxuICAgICAgICAgICAgaWYgKHBvcyA8IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheSgyMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBlc2NhcGVTcGVjaWFsT2JqZWN0cyhvYmo6IHVua25vd24sIGNvbmZpZz86IEpTT05MQUNLU19TdHJpbmdpZnlDb25maWcpOiB1bmtub3duIHtcbiAgICAgICAgLy8gSSB0aGluayBpdGVyYXRpbmcgdHdpY2UgZm9yIHJlZmVyZW5jZXMgaXMgdGhlIGZhc3Rlc3Qgd2F5IHRvIGRvIGl0P1xuICAgICAgICBsZXQgb2JqZWN0cyA9IG5ldyBTZXQ8dW5rbm93bj4oKTtcbiAgICAgICAgLy8gTk9URTogVXNlIHVuaXF1ZSB2YWx1ZXMgZm9yIHJlZmVyZW5jZXMsIHRvIGFsbG93IGNvbmNhdGVuYXRpbmcgZmlsZXMgd2l0aG91dCBoYXZpbmcgdG9cbiAgICAgICAgLy8gIGRlYWwgd2l0aCBlc2NhcGluZyByZWZlcmVuY2VzLlxuICAgICAgICBsZXQgcmVmUHJlZml4ID0gRGF0ZS5ub3coKSArIE1hdGgucmFuZG9tKCkgKyBcIlwiO1xuICAgICAgICBsZXQgbmV4dFJlZklkID0gMDtcbiAgICAgICAgZnVuY3Rpb24gZ2V0TmV4dFJlZktleSgpIHtcbiAgICAgICAgICAgIHJldHVybiByZWZQcmVmaXggKyBcIl9cIiArIG5leHRSZWZJZCsrO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZWZPYmplY3RzID0gbmV3IE1hcDx1bmtub3duLCBzdHJpbmc+KCk7XG4gICAgICAgIGZpbmRSZWZlcmVuY2VzKG9iaik7XG4gICAgICAgIGZ1bmN0aW9uIGZpbmRSZWZlcmVuY2VzKG9iajogdW5rbm93bikge1xuICAgICAgICAgICAgaWYgKCFjYW5IYXZlQ2hpbGRyZW4ob2JqKSkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHJlZk9iamVjdHMuaGFzKG9iaikpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChvYmplY3RzLmhhcyhvYmopKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlZktleSA9IGdldE5leHRSZWZLZXkoKTtcbiAgICAgICAgICAgICAgICByZWZPYmplY3RzLnNldChvYmosIHJlZktleSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2JqZWN0cy5hZGQob2JqKTtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBmaW5kUmVmZXJlbmNlcyhvYmpba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVmc1NlZW4gPSBuZXcgU2V0PHVua25vd24+KCk7XG4gICAgICAgIHJldHVybiBpdGVyYXRlKG9iaik7XG4gICAgICAgIGZ1bmN0aW9uIGl0ZXJhdGUob2JqOiB1bmtub3duLCByZWZIYW5kbGVkPzogYm9vbGVhbik6IHVua25vd24ge1xuICAgICAgICAgICAgaWYgKCFjYW5IYXZlQ2hpbGRyZW4ob2JqKSkgcmV0dXJuIG9iajtcbiAgICAgICAgICAgIGlmICghcmVmSGFuZGxlZCkge1xuICAgICAgICAgICAgICAgIGxldCByZWZLZXkgPSByZWZPYmplY3RzLmdldChvYmopO1xuICAgICAgICAgICAgICAgIGlmIChyZWZLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZnNTZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtKU09OTEFDS1MuTEFDS1NfS0VZXTogXCJyZWZcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcmVmS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZWZzU2Vlbi5hZGQob2JqKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFtKU09OTEFDS1MuTEFDS1NfS0VZXTogXCJkZWZpbmVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiByZWZLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlcmF0ZShvYmosIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKEpTT05MQUNLUy5MQUNLU19LRVkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3RPZk9iaiA9IHsgLi4ub2JqIH07XG4gICAgICAgICAgICAgICAgbGV0IGVzY2FwZWRWYWx1ZSA9IHJlc3RPZk9ialtKU09OTEFDS1MuTEFDS1NfS0VZXTtcbiAgICAgICAgICAgICAgICBkZWxldGUgcmVzdE9mT2JqW0pTT05MQUNLUy5MQUNLU19LRVldO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIFtKU09OTEFDS1MuTEFDS1NfS0VZXTogXCJyZW1vdmVkU3BlY2lhbEtleVwiLFxuICAgICAgICAgICAgICAgICAgICBlc2NhcGVkVmFsdWU6IGl0ZXJhdGUoZXNjYXBlZFZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgcmVzdE9mT2JqOiBpdGVyYXRlKHJlc3RPZk9iaiksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIFtKU09OTEFDS1MuTEFDS1NfS0VZXTogXCJCdWZmZXJcIixcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogb2JqLnRvU3RyaW5nKFwiYmFzZTY0XCIpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjbG9uZWQgPSBjb25maWc/LmFsbG93T2JqZWN0TXV0YXRpb247XG4gICAgICAgICAgICBmdW5jdGlvbiBjbG9uZU9iaigpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2xvbmVkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgY2xvbmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICAgICAgICAgIG9iaiA9IFsuLi5vYmpdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG9iaiA9IHsgLi4ub2JqIGFzIGFueSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgbGV0IG9yaWdpbmFsVmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBpdGVyYXRlKG9yaWdpbmFsVmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gb3JpZ2luYWxWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjbG9uZU9iaigpO1xuICAgICAgICAgICAgICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBoeWRyYXRlU3BlY2lhbE9iamVjdHMob2JqOiB1bmtub3duLCBoeWRyYXRlU3RhdGU/OiBIeWRyYXRlU3RhdGUsIGNvbmZpZz86IEpTT05MQUNLU19QYXJzZUNvbmZpZyk6IHVua25vd24ge1xuICAgICAgICBsZXQgcmVmZXJlbmNlcyA9IGh5ZHJhdGVTdGF0ZT8ucmVmZXJlbmNlcyB8fCBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcbiAgICAgICAgbGV0IHZpc2l0ZWQgPSBoeWRyYXRlU3RhdGU/LnZpc2l0ZWQgfHwgbmV3IFNldDx1bmtub3duPigpO1xuICAgICAgICByZXR1cm4gaXRlcmF0ZShvYmopO1xuICAgICAgICBmdW5jdGlvbiBpdGVyYXRlKG9iajogdW5rbm93bikge1xuICAgICAgICAgICAgaWYgKCFjYW5IYXZlQ2hpbGRyZW4ob2JqKSkgcmV0dXJuIG9iajtcbiAgICAgICAgICAgIGlmICh2aXNpdGVkLmhhcyhvYmopKSByZXR1cm4gb2JqO1xuICAgICAgICAgICAgdmlzaXRlZC5hZGQob2JqKTtcbiAgICAgICAgICAgIGxldCB0eXBlID0gb2JqW0pTT05MQUNLUy5MQUNLU19LRVldO1xuICAgICAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIG9iaikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3JpZ2luYWxWYWx1ZSA9IG9ialtrZXldO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBpdGVyYXRlKG9yaWdpbmFsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IG9yaWdpbmFsVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcInJlbW92ZWRTcGVjaWFsS2V5XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdE9mT2JqID0gaXRlcmF0ZShvYmoucmVzdE9mT2JqKSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgbGV0IGVzY2FwZWRWYWx1ZSA9IGl0ZXJhdGUob2JqLmVzY2FwZWRWYWx1ZSkgYXMgYW55O1xuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLnJlc3RPZk9iaiwgW0pTT05MQUNLUy5MQUNLU19LRVldOiBlc2NhcGVkVmFsdWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcIkJ1ZmZlclwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKG9iai5kYXRhIGFzIHN0cmluZywgXCJiYXNlNjRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJkZWZpbmVcIikge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZXMuc2V0KG9iai5pZCBhcyBzdHJpbmcsIGl0ZXJhdGUob2JqLnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iai52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcInJlZlwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IGlkID0gb2JqLmlkIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICBpZiAoIUpTT05MQUNLUy5JR05PUkVfTUlTU0lOR19SRUZFUkVOQ0VTICYmICFyZWZlcmVuY2VzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWZlcmVuY2UgdG8gdW5kZWZpbmVkIGlkIFwiJHtpZH1cImApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlcy5nZXQoaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGxhY2tzIHR5cGUgXCIke3R5cGV9XCJgKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYmVuY2htYXJrKCkge1xuICAgIGNvbnN0IGxvb3BzID0gMTAwMCAqIDEwMDtcbiAgICBsZXQgaW5wdXRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9vcHM7IGkrKykge1xuICAgICAgICBpbnB1dHMucHVzaChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgaGVsbG9fdGhlcmU6IGksXG4gICAgICAgICAgICBleGFtcGxlOiA1LFxuICAgICAgICAgICAgbGlzdDogWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXSxcbiAgICAgICAgfSkgKyBcIiBcIik7XG4gICAgfVxuICAgIEpTT04ucGFyc2UoaW5wdXRzWzBdKTtcbiAgICBwYXJzZXIucGFyc2UoaW5wdXRzWzBdKTtcblxuICAgIG1lYXN1cmVDb2RlU3luYyhmdW5jdGlvbiBtZWFzdXJlKCkge1xuICAgICAgICBtZWFzdXJlQmxvY2soZnVuY3Rpb24gSlNPTl9QQVJTRSgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9vcHM7IGkrKykge1xuICAgICAgICAgICAgICAgIEpTT04ucGFyc2UoaW5wdXRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG1lYXN1cmVCbG9jayhmdW5jdGlvbiBKU09OX1BBUlNFX0ZSRUVaRSgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9vcHM7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBvYmogPSBKU09OLnBhcnNlKGlucHV0c1tpXSk7XG4gICAgICAgICAgICAgICAgcmVjdXJzaXZlRnJlZXplKG9iaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG1lYXN1cmVCbG9jayhmdW5jdGlvbiBFWFRFTkRFRF9QQVJTRSgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9vcHM7IGkrKykge1xuICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZShpbnB1dHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBtZWFzdXJlQmxvY2soZnVuY3Rpb24gSlNPTkxBQ0tTX1BBUlNFKCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29wczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgSlNPTkxBQ0tTLnBhcnNlKGlucHV0c1tpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBtZWFzdXJlQmxvY2soZnVuY3Rpb24gSlNPTkxBQ0tTX1BBUlNFX1NJTVBMRSgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9vcHM7IGkrKykge1xuICAgICAgICAgICAgICAgIEpTT05MQUNLUy5wYXJzZShpbnB1dHNbaV0sIHsgZXh0ZW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH0sIHtcbiAgICAgICAgdGhyZXNob2xkSW5UYWJsZTogMFxuICAgIH0pO1xuXG59XG4vL2JlbmNobWFyaygpLmNhdGNoKGNvbnNvbGUuZXJyb3IpLmZpbmFsbHkoKCkgPT4gcHJvY2Vzcy5leGl0KCkpO1xuXG5cbmFzeW5jIGZ1bmN0aW9uIHRlc3RKU09OTEFDS1MoKSB7XG4gICAge1xuICAgICAgICBsZXQgb2JqID0ge307XG4gICAgICAgIGxldCBzdHIgPSBKU09OTEFDS1Muc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGE6IG9iaixcbiAgICAgICAgICAgIGI6IG9iaixcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBwYXJzZWQgPSBKU09OTEFDS1MucGFyc2Uoc3RyKSBhcyBhbnk7XG4gICAgICAgIGlmIChwYXJzZWQuYSAhPT0gcGFyc2VkLmIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBtYWludGFpbiByZWZlcmVuY2VzXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGFyc2VkLmEgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk9iamVjdCBiZWNvbWUgY29ycnVwdGVkXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGVzdCBMQUNLU19LRVkgaXMgZXNjYXBlZCBjb3JyZWN0bHlcbiAgICB7XG4gICAgICAgIGxldCBvYmogPSB7IFtKU09OTEFDS1MuTEFDS1NfS0VZXTogXCJoZWxsb1wiIH07XG4gICAgICAgIGxldCBzdHIgPSBKU09OTEFDS1Muc3RyaW5naWZ5KG9iaik7XG4gICAgICAgIGxldCBwYXJzZWQgPSBKU09OTEFDS1MucGFyc2Uoc3RyKSBhcyBhbnk7XG4gICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShvYmopICE9PSBKU09OLnN0cmluZ2lmeShwYXJzZWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZXNjYXBlIExBQ0tTX0tFWVwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBUZXN0IGJ1ZmZlcnMgYXJlIHByZXNlcnZlZFxuICAgIHtcbiAgICAgICAgbGV0IG9iaiA9IHsgYTogQnVmZmVyLmZyb20oXCJoZWxsb1wiKSB9O1xuICAgICAgICBsZXQgc3RyID0gSlNPTkxBQ0tTLnN0cmluZ2lmeShvYmopO1xuICAgICAgICBsZXQgcGFyc2VkID0gSlNPTkxBQ0tTLnBhcnNlKHN0cikgYXMgYW55O1xuICAgICAgICBpZiAob2JqLmEudG9TdHJpbmcoKSAhPT0gcGFyc2VkLmEudG9TdHJpbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcHJlc2VydmUgYnVmZmVyc2ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGVzdCByZWZlcmVuY2VzIDJcbiAgICB7XG4gICAgICAgIGxldCBiYXNlID0ge307XG4gICAgICAgIGxldCBhcnIgPSBbYmFzZSwgYmFzZV07XG4gICAgICAgIGxldCBvYmogPSB7IHg6IGFyciwgeTogYXJyIH07XG4gICAgICAgIGxldCByZXN1bHQgPSBKU09OTEFDS1MucGFyc2UoSlNPTkxBQ0tTLnN0cmluZ2lmeShvYmopLCB7IGV4dGVuZGVkOiBmYWxzZSB9KSBhcyB0eXBlb2Ygb2JqO1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSAhPT0gSlNPTi5zdHJpbmdpZnkob2JqKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3JydXB0ZWQgdmFsdWVzLCBleHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KG9iail9LCBnb3QgJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQueCAhPT0gcmVzdWx0LnkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIG1haW50YWluIHJlZmVyZW5jZXNgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LnhbMF0gIT09IHJlc3VsdC54WzFdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBtYWludGFpbiByZWZlcmVuY2VzYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vL3Rlc3RKU09OTEFDS1MoKS5jYXRjaChjb25zb2xlLmVycm9yKS5maW5hbGx5KCgpID0+IHByb2Nlc3MuZXhpdCgpKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVBbmRWZXJpZnlQYXJzZXIoKSB7XG4gICAgY29uc3QgcGVnanMgPSBhd2FpdCBpbXBvcnQoXCJwZWdqc1wiKTtcblxuICAgIHZhciBncmFtbWFyID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArIFwiL0pTT05MQUNLUy5wZWdqc1wiLCBcInV0ZjhcIik7XG4gICAgdmFyIHBhcnNlclNvdXJjZSA9IHBlZ2pzLmdlbmVyYXRlKGdyYW1tYXIsIHsgb3V0cHV0OiBcInNvdXJjZVwiLCBmb3JtYXQ6IFwiY29tbW9uanNcIiB9KTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKF9fZGlybmFtZSArIFwiL0pTT05MQUNLUy5nZW5lcmF0ZWQuanNcIiwgcGFyc2VyU291cmNlKTtcblxuICAgIHZhciBtb2R1bGUgPSB7IGV4cG9ydHM6IHt9IH07XG4gICAgZXZhbChwYXJzZXJTb3VyY2UpO1xuICAgIGNvbnN0IHBhcnNlciA9IG1vZHVsZS5leHBvcnRzIGFzIGFueTtcbiAgICBmdW5jdGlvbiB2ZXJpZnkodGV4dDogc3RyaW5nLCBmb3JjZWRPYmo/OiB1bmtub3duKSB7XG4gICAgICAgIHZhciBwYXJzZWQgPSBwYXJzZXIucGFyc2UodGV4dCk7XG4gICAgICAgIHZhciByZXN1bHQgPSBKU09OLnN0cmluZ2lmeShwYXJzZWQpO1xuICAgICAgICBsZXQgcmVhbFJlc3VsdCA9IGZvcmNlZE9iaiA/PyBKU09OLnN0cmluZ2lmeShldmFsKFwiKFwiICsgdGV4dCArIFwiKVwiKSk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IHJlYWxSZXN1bHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlOiAke3RleHR9IHNob3VsZCBiZSAke3JlYWxSZXN1bHR9LCB3YXMgJHtyZXN1bHR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coXCJQYXJzZWQgY29ycmVjdGx5OiBcIiwgdGV4dCk7XG4gICAgfVxuXG4gICAgdmVyaWZ5KGBcbiAgICB7XG4gICAgICAgIFwiaGVsbG9fdGhlcmVcIjogMSxcbiAgICB9XG4gICAgYCk7XG4gICAgdmVyaWZ5KGBcbiAgICB7XG4gICAgICAgIGhlbGxvX3RoZXJlOiAxLFxuICAgIH1cbiAgICBgKTtcbiAgICB2ZXJpZnkoYFxuICAgIHtcbiAgICAgICAgaGVsbG9fdGhlcmU6IDEsXG4gICAgICAgIG1vcmU6IDEsXG4gICAgfVxuICAgIGApO1xuICAgIHZlcmlmeShgeyBsaXN0OiBbMSxdLCB9YCk7XG4gICAgdmVyaWZ5KGB7IGxpc3Q6IFsxLF0sIGxpc3QyOiBbMSxdLCB9YCk7XG5cbiAgICB2ZXJpZnkoYHsgLyogdGVzdCAqLyBsaXN0OiBbMSxdLCBsaXN0MjogWzEsXSwgfWApO1xuICAgIHZlcmlmeShgeyAvKiB0ZXN0ICovIC8qIHRlc3QgMiAqLyBsaXN0OiBbMSxdLCBsaXN0MjogWzEsXSwgfWApO1xuICAgIHZlcmlmeShgXG4gICAge1xuICAgICAgICAvKiB0ZXN0ICovXG4gICAgICAgIC8qIHRlc3QgMiAqL1xuICAgICAgICBsaXN0OiBbMSxdLFxuICAgICAgICAvLyBTaW5nbGUgbGluZSBjb21tZW50XG4gICAgICAgIGxpc3QyOiBbMSxdLFxuICAgICAgICAvLyBsaXN0MzogWzNdLFxuICAgIH1cbiAgICBgKTtcbiAgICAvLyBNdWx0aWxpbmUgZG91YmxlIHF1b3RlIHN0cmluZ3NcbiAgICB2ZXJpZnkoYFxuICAgIHtcbiAgICAgICAgdmFsdWU6IFwiYVxuYlwiXG4gICAgfVxuICAgIGAsIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IFwiYVxcbmJcIiB9KSk7XG5cbiAgICAvLyBTaW5nbGUgcXVvdGVzXG4gICAgdmVyaWZ5KGBcbiAgICB7XG4gICAgICAgIHZhbHVlOiAnYSdcbiAgICB9XG4gICAgYCk7XG4gICAgdmVyaWZ5KGB1bmRlZmluZWRgKTtcbn1cbi8vZ2VuZXJhdGVBbmRWZXJpZnlQYXJzZXIoKS5jYXRjaChjb25zb2xlLmVycm9yKS5maW5hbGx5KCgpID0+IHByb2Nlc3MuZXhpdCgpKTsiXX0=
469
+ /* _JS_SOURCE_HASH = "1ed5449cbb7f4a390b58c0657e5b462d47e1493ed0d92180605b08712028c036"; */
@@ -1,4 +1,4 @@
1
- /// <reference path="../hot/HotReloadController.d.ts" />
1
+ /// <reference types="socket-function/hot/hotreloadcontroller" />
2
2
  import { CallerContext, CallType, ClientHookContext, FullCallType, FunctionFlags, HookContext, SocketExposedInterface, SocketExposedShape, SocketFunctionClientHook, SocketFunctionHook, SocketRegistered } from "../SocketFunctionTypes";
3
3
  export declare function getCallFlags(call: CallType): FunctionFlags | undefined;
4
4
  export declare function shouldCompressCall(call: CallType): boolean | "LZ4" | undefined;