sliftutils 1.7.13 → 1.7.14
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.
- package/.claude/settings.local.json +2 -1
- package/index.d.ts +64 -38
- package/misc/dist/getSecret.ts.cache +2 -2
- package/misc/dist/strings.ts.cache +2 -2
- package/misc/https/dist/certs.ts.cache +2 -2
- package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
- package/misc/https/hostServer.d.ts +7 -0
- package/misc/https/hostServer.ts +89 -20
- package/misc/openrouter.ts +17 -14
- package/package.json +2 -2
- package/storage/ArchivesDisk.d.ts +1 -1
- package/storage/ArchivesDisk.ts +2 -1
- package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/blockCache.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/mergeLock.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/streamLog.ts.cache +2 -2
- package/storage/BulkDatabase2/dist/syncClient.ts.cache +2 -2
- package/storage/IArchives.d.ts +5 -1
- package/storage/IArchives.ts +5 -1
- package/storage/backblaze.d.ts +1 -1
- package/storage/backblaze.ts +9 -6
- package/storage/remoteStorage/ArchivesRemote.d.ts +1 -1
- package/storage/remoteStorage/ArchivesRemote.ts +2 -1
- package/storage/remoteStorage/ArchivesUrl.d.ts +1 -1
- package/storage/remoteStorage/ArchivesUrl.ts +13 -9
- package/storage/remoteStorage/blobStore.d.ts +6 -2
- package/storage/remoteStorage/blobStore.ts +46 -6
- package/storage/remoteStorage/createArchives.d.ts +10 -11
- package/storage/remoteStorage/createArchives.ts +74 -26
- package/storage/remoteStorage/deployTakeover.d.ts +24 -0
- package/storage/remoteStorage/deployTakeover.ts +373 -0
- package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +16 -11
- package/storage/remoteStorage/dist/blobStore.ts.cache +39 -4
- package/storage/remoteStorage/dist/createArchives.ts.cache +91 -9
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +371 -0
- package/storage/remoteStorage/dist/remoteConfig.ts.cache +9 -3
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +3 -3
- package/storage/remoteStorage/dist/storageController.ts.cache +11 -12
- package/storage/remoteStorage/dist/storageServerState.ts.cache +120 -19
- package/storage/remoteStorage/remoteConfig.d.ts +1 -0
- package/storage/remoteStorage/remoteConfig.ts +6 -0
- package/storage/remoteStorage/storageServer.ts +14 -1
- package/storage/remoteStorage/storageServerState.d.ts +3 -0
- package/storage/remoteStorage/storageServerState.ts +55 -8
- package/yarn.lock +4 -4
- package/storage/dist/faceFramesData.ts.cache +0 -55
- package/storage/embeddingBench.d.ts +0 -1
- package/storage/embeddingBench.ts +0 -152
- package/storage/faceFramesData.d.ts +0 -1
- package/storage/faceFramesData.ts +0 -49
- package/storage/faceFramesServer.d.ts +0 -1
- package/storage/faceFramesServer.ts +0 -56
- package/storage/proxydatabase/ivfDbCheck.d.ts +0 -1
- package/storage/proxydatabase/ivfDbCheck.ts +0 -85
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
"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.getMainPortAcquireDelay = exports.getFlushDeadline = exports.applyDeployRemap = exports.onTakeoverEvent = exports.registerAltPort = exports.initDeployTakeover = void 0;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const child_process_1 = require("child_process");
|
|
10
|
+
const remoteConfig_1 = require("./remoteConfig");
|
|
11
|
+
// Deploy takeover: the deploy manager (querysub's parametersTimeline) writes <n>-parameters.json
|
|
12
|
+
// files into our instance folder describing when each version runs and when it is shut down. Old
|
|
13
|
+
// and new version overlap for the overlap time (O = oldEnd - newStart). We turn that overlap into
|
|
14
|
+
// an atomic write handoff by REINTERPRETING every routing source that points at us: its valid
|
|
15
|
+
// window is split so that the middle of the overlap ([S + 0.5*O, S + 1.5*O]) points at the new
|
|
16
|
+
// process's temporary alternate port. The existing valid-window machinery then does everything -
|
|
17
|
+
// the old process starts rejecting fresh writes at the first boundary, clients re-resolve, and the
|
|
18
|
+
// new process (which recognizes the alternate port as itself) takes over. The remap is an
|
|
19
|
+
// INTERPRETATION OVERLAY, applied where routing configs are used (see applyDeployRemap callers) -
|
|
20
|
+
// it is never written to disk, never synchronized, and never part of any stored configuration.
|
|
21
|
+
//
|
|
22
|
+
// Everything here is recomputed idempotently from its inputs (timeline files, the port registry,
|
|
23
|
+
// our ancestor pids, the clock) - files can appear or change at any moment, and we can start at
|
|
24
|
+
// any point during a switchover.
|
|
25
|
+
const PARAMETERS_TIMELINE_FILE_REGEX = /^(\d+)-parameters\.json$/;
|
|
26
|
+
const ALIVE_WINDOW_FOREVER = Number.MAX_SAFE_INTEGER;
|
|
27
|
+
const TIMELINE_POLL_INTERVAL = 60 * 1000;
|
|
28
|
+
// Processes listening on an alternate port register it here (sibling of the storage folder), keyed
|
|
29
|
+
// by their actual pid; content includes their ancestor pids so the timeline entry pid (a shell
|
|
30
|
+
// ancestor of the process) can be matched to a registry entry
|
|
31
|
+
const PORT_REGISTRY_FOLDER_NAME = "storagePortRegistry";
|
|
32
|
+
// Main-port acquisition attempts run this often, tightening near the predecessor's scheduled death
|
|
33
|
+
const ACQUIRE_SLOW_DELAY = 30 * 1000;
|
|
34
|
+
const ACQUIRE_FAST_DELAY = 5 * 1000;
|
|
35
|
+
const ACQUIRE_FAST_WINDOW = 60 * 1000;
|
|
36
|
+
// Disk rescans fire this far before and after the write handoff, catching files the other process
|
|
37
|
+
// wrote (the BulkDatabase2 index is atomic but its entries land at write time, not file time)
|
|
38
|
+
const SWITCH_SCAN_LEAD = 10 * 1000;
|
|
39
|
+
// The dying process must have flushed everything before the handoff: fast-write delays never
|
|
40
|
+
// extend past S + overlap * this fraction, and after that point fast writes flush immediately
|
|
41
|
+
const FLUSH_DEADLINE_FRACTION = 0.25;
|
|
42
|
+
const BOUNDARY_A_FRACTION = 0.5;
|
|
43
|
+
const BOUNDARY_B_FRACTION = 1.5;
|
|
44
|
+
const REMAP_EXPIRE_FRACTION = 2;
|
|
45
|
+
let initialized;
|
|
46
|
+
let ancestorPids = new Set();
|
|
47
|
+
let timelineFolder;
|
|
48
|
+
let ourAltPort;
|
|
49
|
+
let current = {};
|
|
50
|
+
let currentKey = JSON.stringify(current);
|
|
51
|
+
let eventListeners = [];
|
|
52
|
+
let eventTimers = [];
|
|
53
|
+
function execText(command) {
|
|
54
|
+
return new Promise((resolve, reject) => {
|
|
55
|
+
(0, child_process_1.exec)(command, (error, stdout) => {
|
|
56
|
+
if (error) {
|
|
57
|
+
reject(error);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
resolve(stdout);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// The timeline entry pid is the screen shell that spawned us - an ancestor - so we walk our whole
|
|
65
|
+
// ancestor chain to find which entry is us
|
|
66
|
+
async function getAncestorPids() {
|
|
67
|
+
let pids = new Set([process.pid]);
|
|
68
|
+
let currentPid = process.pid;
|
|
69
|
+
while (true) {
|
|
70
|
+
let ppid;
|
|
71
|
+
if (currentPid === process.pid && process.ppid) {
|
|
72
|
+
ppid = process.ppid;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
try {
|
|
76
|
+
ppid = parseInt((await execText(`ps -o ppid= -p ${currentPid}`)).trim());
|
|
77
|
+
}
|
|
78
|
+
catch (_a) {
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (!ppid || Number.isNaN(ppid) || ppid <= 1 || pids.has(ppid))
|
|
83
|
+
break;
|
|
84
|
+
pids.add(ppid);
|
|
85
|
+
currentPid = ppid;
|
|
86
|
+
}
|
|
87
|
+
return pids;
|
|
88
|
+
}
|
|
89
|
+
async function findTimelineFolder() {
|
|
90
|
+
let dir = process.cwd();
|
|
91
|
+
while (true) {
|
|
92
|
+
let files = [];
|
|
93
|
+
try {
|
|
94
|
+
files = await fs_1.default.promises.readdir(dir);
|
|
95
|
+
}
|
|
96
|
+
catch (_a) { }
|
|
97
|
+
if (files.some(file => PARAMETERS_TIMELINE_FILE_REGEX.test(file))) {
|
|
98
|
+
return dir.replaceAll("\\", "/") + "/";
|
|
99
|
+
}
|
|
100
|
+
let parent = path_1.default.dirname(dir);
|
|
101
|
+
if (parent === dir)
|
|
102
|
+
return undefined;
|
|
103
|
+
dir = parent;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function pidAlive(pid) {
|
|
107
|
+
try {
|
|
108
|
+
process.kill(pid, 0);
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
return e.code === "EPERM";
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function getRegistryFolder() {
|
|
116
|
+
if (!initialized) {
|
|
117
|
+
throw new Error(`Deploy takeover is not initialized`);
|
|
118
|
+
}
|
|
119
|
+
return path_1.default.join(path_1.default.dirname(path_1.default.resolve(initialized.storageFolder)), PORT_REGISTRY_FOLDER_NAME);
|
|
120
|
+
}
|
|
121
|
+
async function readPortRegistry() {
|
|
122
|
+
let folder = getRegistryFolder();
|
|
123
|
+
let files = [];
|
|
124
|
+
try {
|
|
125
|
+
files = await fs_1.default.promises.readdir(folder);
|
|
126
|
+
}
|
|
127
|
+
catch (_a) {
|
|
128
|
+
return [];
|
|
129
|
+
}
|
|
130
|
+
let entries = [];
|
|
131
|
+
for (let file of files) {
|
|
132
|
+
let match = /^(\d+)\.json$/.exec(file);
|
|
133
|
+
if (!match)
|
|
134
|
+
continue;
|
|
135
|
+
let pid = parseInt(match[1]);
|
|
136
|
+
if (!pidAlive(pid)) {
|
|
137
|
+
try {
|
|
138
|
+
await fs_1.default.promises.unlink(path_1.default.join(folder, file));
|
|
139
|
+
}
|
|
140
|
+
catch (_b) { }
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
try {
|
|
144
|
+
let entry = JSON.parse(await fs_1.default.promises.readFile(path_1.default.join(folder, file), "utf8"));
|
|
145
|
+
entries.push({ ...entry, pid });
|
|
146
|
+
}
|
|
147
|
+
catch (_c) { }
|
|
148
|
+
}
|
|
149
|
+
return entries;
|
|
150
|
+
}
|
|
151
|
+
async function readTimelineEntries() {
|
|
152
|
+
var _a;
|
|
153
|
+
if (!timelineFolder)
|
|
154
|
+
return [];
|
|
155
|
+
let entries = [];
|
|
156
|
+
for (let file of await fs_1.default.promises.readdir(timelineFolder)) {
|
|
157
|
+
if (!PARAMETERS_TIMELINE_FILE_REGEX.test(file))
|
|
158
|
+
continue;
|
|
159
|
+
try {
|
|
160
|
+
entries.push(JSON.parse(await fs_1.default.promises.readFile(timelineFolder + file, "utf8")));
|
|
161
|
+
}
|
|
162
|
+
catch (e) {
|
|
163
|
+
console.warn(`Could not read deploy timeline file ${timelineFolder + file}: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return entries;
|
|
167
|
+
}
|
|
168
|
+
function makeRemap(successorStart, overlap, altPort) {
|
|
169
|
+
return {
|
|
170
|
+
boundaryA: successorStart + overlap * BOUNDARY_A_FRACTION,
|
|
171
|
+
boundaryB: successorStart + overlap * BOUNDARY_B_FRACTION,
|
|
172
|
+
expire: successorStart + overlap * REMAP_EXPIRE_FRACTION,
|
|
173
|
+
altPort,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
function emit(event) {
|
|
177
|
+
var _a;
|
|
178
|
+
for (let listener of eventListeners) {
|
|
179
|
+
try {
|
|
180
|
+
listener(event);
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
console.error(`Deploy takeover listener failed: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function scheduleEvents() {
|
|
188
|
+
for (let timer of eventTimers) {
|
|
189
|
+
clearTimeout(timer);
|
|
190
|
+
}
|
|
191
|
+
eventTimers = [];
|
|
192
|
+
let now = Date.now();
|
|
193
|
+
let schedule = (time, fnc) => {
|
|
194
|
+
var _a, _b;
|
|
195
|
+
if (time <= now)
|
|
196
|
+
return;
|
|
197
|
+
let timer = setTimeout(fnc, time - now);
|
|
198
|
+
(_b = (_a = timer).unref) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
199
|
+
eventTimers.push(timer);
|
|
200
|
+
};
|
|
201
|
+
let remap = current.remap;
|
|
202
|
+
if (remap) {
|
|
203
|
+
schedule(remap.boundaryA - SWITCH_SCAN_LEAD, () => emit("diskScan"));
|
|
204
|
+
schedule(remap.boundaryA + SWITCH_SCAN_LEAD, () => emit("diskScan"));
|
|
205
|
+
schedule(remap.expire, () => void recompute().catch((e) => { var _a; return console.error(`Deploy takeover recompute failed: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`); }));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
async function recompute() {
|
|
209
|
+
if (!initialized || !timelineFolder)
|
|
210
|
+
return;
|
|
211
|
+
let now = Date.now();
|
|
212
|
+
let entries = await readTimelineEntries();
|
|
213
|
+
let registry = await readPortRegistry();
|
|
214
|
+
let us;
|
|
215
|
+
for (let entry of entries) {
|
|
216
|
+
if (entry.pid && ancestorPids.has(entry.pid)) {
|
|
217
|
+
us = entry;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
let computed = {};
|
|
221
|
+
if (us) {
|
|
222
|
+
let usStart = us.aliveWindow[0];
|
|
223
|
+
let next;
|
|
224
|
+
let prev;
|
|
225
|
+
for (let entry of entries) {
|
|
226
|
+
if (entry === us)
|
|
227
|
+
continue;
|
|
228
|
+
if (entry.aliveWindow[0] > usStart && (!next || entry.aliveWindow[0] < next.aliveWindow[0])) {
|
|
229
|
+
next = entry;
|
|
230
|
+
}
|
|
231
|
+
if (entry.aliveWindow[0] < usStart && (!prev || entry.aliveWindow[0] > prev.aliveWindow[0])) {
|
|
232
|
+
prev = entry;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
if (next && us.aliveWindow[1] !== ALIVE_WINDOW_FOREVER && next.aliveWindow[0] <= us.aliveWindow[1]) {
|
|
236
|
+
let overlap = us.aliveWindow[1] - next.aliveWindow[0];
|
|
237
|
+
let successorStart = next.aliveWindow[0];
|
|
238
|
+
if (overlap > 0 && now < successorStart + overlap * REMAP_EXPIRE_FRACTION) {
|
|
239
|
+
computed.dying = { successorStart, overlap };
|
|
240
|
+
const successorPid = next.pid;
|
|
241
|
+
if (successorPid) {
|
|
242
|
+
let successorEntry = registry.find(x => x.ancestorPids.includes(successorPid));
|
|
243
|
+
if (successorEntry) {
|
|
244
|
+
computed.remap = makeRemap(successorStart, overlap, successorEntry.port);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (prev && prev.aliveWindow[1] > usStart) {
|
|
250
|
+
let overlap = prev.aliveWindow[1] - usStart;
|
|
251
|
+
computed.predecessorEnd = prev.aliveWindow[1];
|
|
252
|
+
if (overlap > 0 && ourAltPort && now < usStart + overlap * REMAP_EXPIRE_FRACTION && !computed.remap) {
|
|
253
|
+
computed.remap = makeRemap(usStart, overlap, ourAltPort);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
let key = JSON.stringify(computed);
|
|
258
|
+
if (key === currentKey)
|
|
259
|
+
return;
|
|
260
|
+
current = computed;
|
|
261
|
+
currentKey = key;
|
|
262
|
+
console.log(`Deploy takeover state changed: ${key}`);
|
|
263
|
+
scheduleEvents();
|
|
264
|
+
emit("remapChanged");
|
|
265
|
+
}
|
|
266
|
+
/** Starts the takeover machinery. Returns whether a deploy timeline exists - when it doesn't,
|
|
267
|
+
* everything here stays inert (and the caller must NOT fall back to alternate ports, since a busy
|
|
268
|
+
* port then means a real misconfiguration, not a deploy). */
|
|
269
|
+
async function initDeployTakeover(config) {
|
|
270
|
+
var _a, _b;
|
|
271
|
+
initialized = config;
|
|
272
|
+
ancestorPids = await getAncestorPids();
|
|
273
|
+
timelineFolder = await findTimelineFolder();
|
|
274
|
+
if (!timelineFolder)
|
|
275
|
+
return false;
|
|
276
|
+
await recompute();
|
|
277
|
+
let poll = setInterval(() => {
|
|
278
|
+
void recompute().catch((e) => { var _a; return console.error(`Deploy takeover recompute failed: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`); });
|
|
279
|
+
}, TIMELINE_POLL_INTERVAL);
|
|
280
|
+
(_b = (_a = poll).unref) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
283
|
+
exports.initDeployTakeover = initDeployTakeover;
|
|
284
|
+
/** Called when we had to listen on an alternate port (the main port was still held by our
|
|
285
|
+
* predecessor): registers it so the predecessor can route the middle overlap window to us. */
|
|
286
|
+
async function registerAltPort(port) {
|
|
287
|
+
ourAltPort = port;
|
|
288
|
+
let folder = getRegistryFolder();
|
|
289
|
+
await fs_1.default.promises.mkdir(folder, { recursive: true });
|
|
290
|
+
let entry = { pid: process.pid, port, ancestorPids: [...ancestorPids] };
|
|
291
|
+
await fs_1.default.promises.writeFile(path_1.default.join(folder, `${process.pid}.json`), JSON.stringify(entry));
|
|
292
|
+
await recompute();
|
|
293
|
+
}
|
|
294
|
+
exports.registerAltPort = registerAltPort;
|
|
295
|
+
function onTakeoverEvent(listener) {
|
|
296
|
+
eventListeners.push(listener);
|
|
297
|
+
}
|
|
298
|
+
exports.onTakeoverEvent = onTakeoverEvent;
|
|
299
|
+
/** The interpretation overlay: splits every source pointing at our domain+main port so the middle
|
|
300
|
+
* of the deploy overlap points at the alternate port. Pure, in-memory only - the stored routing
|
|
301
|
+
* config is never modified, and this must never be applied to data that gets persisted. */
|
|
302
|
+
function applyDeployRemap(routing) {
|
|
303
|
+
let remap = current.remap;
|
|
304
|
+
let init = initialized;
|
|
305
|
+
if (!remap || !init)
|
|
306
|
+
return routing;
|
|
307
|
+
let sources = [];
|
|
308
|
+
let slice = (source, start, end, url) => {
|
|
309
|
+
return { ...source, url: url || source.url, validWindow: [start, end] };
|
|
310
|
+
};
|
|
311
|
+
for (let source of routing.sources) {
|
|
312
|
+
if (typeof source === "string" || source.type !== "remote") {
|
|
313
|
+
sources.push(source);
|
|
314
|
+
continue;
|
|
315
|
+
}
|
|
316
|
+
let parsed;
|
|
317
|
+
try {
|
|
318
|
+
parsed = (0, remoteConfig_1.parseHostedUrl)(source.url);
|
|
319
|
+
}
|
|
320
|
+
catch (_a) {
|
|
321
|
+
sources.push(source);
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
if (parsed.address !== init.domain || parsed.port !== init.mainPort) {
|
|
325
|
+
sources.push(source);
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
let [start, end] = source.validWindow;
|
|
329
|
+
let a = Math.max(start, Math.min(remap.boundaryA, end));
|
|
330
|
+
let b = Math.max(start, Math.min(remap.boundaryB, end));
|
|
331
|
+
let added = false;
|
|
332
|
+
if (a > start) {
|
|
333
|
+
sources.push(slice(source, start, a));
|
|
334
|
+
added = true;
|
|
335
|
+
}
|
|
336
|
+
if (b > a) {
|
|
337
|
+
sources.push(slice(source, a, b, (0, remoteConfig_1.replaceHostedUrlPort)(source.url, remap.altPort)));
|
|
338
|
+
added = true;
|
|
339
|
+
}
|
|
340
|
+
if (end > b) {
|
|
341
|
+
sources.push(slice(source, b, end));
|
|
342
|
+
added = true;
|
|
343
|
+
}
|
|
344
|
+
if (!added) {
|
|
345
|
+
sources.push(source);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return { version: routing.version, sources };
|
|
349
|
+
}
|
|
350
|
+
exports.applyDeployRemap = applyDeployRemap;
|
|
351
|
+
/** For the dying process: fast-write flush delays must never extend past this time, and after it
|
|
352
|
+
* fast writes flush immediately - so nothing is left in memory when the write window transfers. */
|
|
353
|
+
function getFlushDeadline() {
|
|
354
|
+
let dying = current.dying;
|
|
355
|
+
if (!dying)
|
|
356
|
+
return undefined;
|
|
357
|
+
return dying.successorStart + dying.overlap * FLUSH_DEADLINE_FRACTION;
|
|
358
|
+
}
|
|
359
|
+
exports.getFlushDeadline = getFlushDeadline;
|
|
360
|
+
/** How long to wait between main-port acquisition attempts: tight around the predecessor's
|
|
361
|
+
* scheduled death (when the port actually frees), relaxed otherwise. */
|
|
362
|
+
function getMainPortAcquireDelay() {
|
|
363
|
+
let end = current.predecessorEnd;
|
|
364
|
+
if (end !== undefined && Math.abs(Date.now() - end) <= ACQUIRE_FAST_WINDOW) {
|
|
365
|
+
return ACQUIRE_FAST_DELAY;
|
|
366
|
+
}
|
|
367
|
+
return ACQUIRE_SLOW_DELAY;
|
|
368
|
+
}
|
|
369
|
+
exports.getMainPortAcquireDelay = getMainPortAcquireDelay;
|
|
370
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95VGFrZW92ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZXBsb3lUYWtlb3Zlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLGlEQUFxQztBQUVyQyxpREFBc0U7QUFFdEUsaUdBQWlHO0FBQ2pHLGlHQUFpRztBQUNqRyxrR0FBa0c7QUFDbEcsOEZBQThGO0FBQzlGLCtGQUErRjtBQUMvRixpR0FBaUc7QUFDakcsbUdBQW1HO0FBQ25HLDBGQUEwRjtBQUMxRixrR0FBa0c7QUFDbEcsK0ZBQStGO0FBQy9GLEVBQUU7QUFDRixpR0FBaUc7QUFDakcsZ0dBQWdHO0FBQ2hHLGlDQUFpQztBQUVqQyxNQUFNLDhCQUE4QixHQUFHLDBCQUEwQixDQUFDO0FBQ2xFLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0FBQ3JELE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN6QyxtR0FBbUc7QUFDbkcsK0ZBQStGO0FBQy9GLDhEQUE4RDtBQUM5RCxNQUFNLHlCQUF5QixHQUFHLHFCQUFxQixDQUFDO0FBQ3hELG1HQUFtRztBQUNuRyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDckMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN0QyxrR0FBa0c7QUFDbEcsOEZBQThGO0FBQzlGLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUNuQyw2RkFBNkY7QUFDN0YsOEZBQThGO0FBQzlGLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0FBQ3JDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0scUJBQXFCLEdB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S0FBSyxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsT0FBTyxHQUFHLHVCQUF1QixDQUFDO0FBQzFFLENBQUM7QUFKRCw0Q0FJQztBQUVEO3lFQUN5RTtBQUN6RSxTQUFnQix1QkFBdUI7SUFDbkMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztJQUNqQyxJQUFJLEdBQUcsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUN6RSxPQUFPLGtCQUFrQixDQUFDO0lBQzlCLENBQUM7SUFDRCxPQUFPLGtCQUFrQixDQUFDO0FBQzlCLENBQUM7QUFORCwwREFNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IFJlbW90ZUNvbmZpZywgUmVtb3RlQ29uZmlnQmFzZSwgSG9zdGVkQ29uZmlnIH0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgcGFyc2VIb3N0ZWRVcmwsIHJlcGxhY2VIb3N0ZWRVcmxQb3J0IH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5cbi8vIERlcGxveSB0YWtlb3ZlcjogdGhlIGRlcGxveSBtYW5hZ2VyIChxdWVyeXN1YidzIHBhcmFtZXRlcnNUaW1lbGluZSkgd3JpdGVzIDxuPi1wYXJhbWV0ZXJzLmpzb25cbi8vIGZpbGVzIGludG8gb3VyIGluc3RhbmNlIGZvbGRlciBkZXNjcmliaW5nIHdoZW4gZWFjaCB2ZXJzaW9uIHJ1bnMgYW5kIHdoZW4gaXQgaXMgc2h1dCBkb3duLiBPbGRcbi8vIGFuZCBuZXcgdmVyc2lvbiBvdmVybGFwIGZvciB0aGUgb3ZlcmxhcCB0aW1lIChPID0gb2xkRW5kIC0gbmV3U3RhcnQpLiBXZSB0dXJuIHRoYXQgb3ZlcmxhcCBpbnRvXG4vLyBhbiBhdG9taWMgd3JpdGUgaGFuZG9mZiBieSBSRUlOVEVSUFJFVElORyBldmVyeSByb3V0aW5nIHNvdXJjZSB0aGF0IHBvaW50cyBhdCB1czogaXRzIHZhbGlkXG4vLyB3aW5kb3cgaXMgc3BsaXQgc28gdGhhdCB0aGUgbWlkZGxlIG9mIHRoZSBvdmVybGFwIChbUyArIDAuNSpPLCBTICsgMS41Kk9dKSBwb2ludHMgYXQgdGhlIG5ld1xuLy8gcHJvY2VzcydzIHRlbXBvcmFyeSBhbHRlcm5hdGUgcG9ydC4gVGhlIGV4aXN0aW5nIHZhbGlkLXdpbmRvdyBtYWNoaW5lcnkgdGhlbiBkb2VzIGV2ZXJ5dGhpbmcgLVxuLy8gdGhlIG9sZCBwcm9jZXNzIHN0YXJ0cyByZWplY3RpbmcgZnJlc2ggd3JpdGVzIGF0IHRoZSBmaXJzdCBib3VuZGFyeSwgY2xpZW50cyByZS1yZXNvbHZlLCBhbmQgdGhlXG4vLyBuZXcgcHJvY2VzcyAod2hpY2ggcmVjb2duaXplcyB0aGUgYWx0ZXJuYXRlIHBvcnQgYXMgaXRzZWxmKSB0YWtlcyBvdmVyLiBUaGUgcmVtYXAgaXMgYW5cbi8vIElOVEVSUFJFVEFUSU9OIE9WRVJMQVksIGFwcGxpZWQgd2hlcmUgcm91dGluZyBjb25maWdzIGFyZSB1c2VkIChzZWUgYXBwbHlEZXBsb3lSZW1hcCBjYWxsZXJzKSAtXG4vLyBpdCBpcyBuZXZlciB3cml0dGVuIHRvIGRpc2ssIG5ldmVyIHN5bmNocm9uaXplZCwgYW5kIG5ldmVyIHBhcnQgb2YgYW55IHN0b3JlZCBjb25maWd1cmF0aW9uLlxuLy9cbi8vIEV2ZXJ5dGhpbmcgaGVyZSBpcyByZWNvbXB1dGVkIGlkZW1wb3RlbnRseSBmcm9tIGl0cyBpbnB1dHMgKHRpbWVsaW5lIGZpbGVzLCB0aGUgcG9ydCByZWdpc3RyeSxcbi8vIG91ciBhbmNlc3RvciBwaWRzLCB0aGUgY2xvY2spIC0gZmlsZXMgY2FuIGFwcGVhciBvciBjaGFuZ2UgYXQgYW55IG1vbWVudCwgYW5kIHdlIGNhbiBzdGFydCBhdFxuLy8gYW55IHBvaW50IGR1cmluZyBhIHN3aXRjaG92ZXIuXG5cbmNvbnN0IFBBUkFNRVRFUlNfVElNRUxJTkVfRklMRV9SRUdFWCA9IC9eKFxcZCspLXBhcmFtZXRlcnNcXC5qc29uJC87XG5jb25zdCBBTElWRV9XSU5ET1dfRk9SRVZFUiA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuY29uc3QgVElNRUxJTkVfUE9MTF9JTlRFUlZBTCA9IDYwICogMTAwMDtcbi8vIFByb2Nlc3NlcyBsaXN0ZW5pbmcgb24gYW4gYWx0ZXJuYXRlIHBvcnQgcmVnaXN0ZXIgaXQgaGVyZSAoc2libGluZyBvZiB0aGUgc3RvcmFnZSBmb2xkZXIpLCBrZXllZFxuLy8gYnkgdGhlaXIgYWN0dWFsIHBpZDsgY29udGVudCBpbmNsdWRlcyB0aGVpciBhbmNlc3RvciBwaWRzIHNvIHRoZSB0aW1lbGluZSBlbnRyeSBwaWQgKGEgc2hlbGxcbi8vIGFuY2VzdG9yIG9mIHRoZSBwcm9jZXNzKSBjYW4gYmUgbWF0Y2hlZCB0byBhIHJlZ2lzdHJ5IGVudHJ5XG5jb25zdCBQT1JUX1JFR0lTVFJZX0ZPTERFUl9OQU1FID0gXCJzdG9yYWdlUG9ydFJlZ2lzdHJ5XCI7XG4vLyBNYWluLXBvcnQgYWNxdWlzaXRpb24gYXR0ZW1wdHMgcnVuIHRoaXMgb2Z0ZW4sIHRpZ2h0ZW5pbmcgbmVhciB0aGUgcHJlZGVjZXNzb3IncyBzY2hlZHVsZWQgZGVhdGhcbmNvbnN0IEFDUVVJUkVfU0xPV19ERUxBWSA9IDMwICogMTAwMDtcbmNvbnN0IEFDUVVJUkVfRkFTVF9ERUxBWSA9IDUgKiAxMDAwO1xuY29uc3QgQUNRVUlSRV9GQVNUX1dJTkRPVyA9IDYwICogMTAwMDtcbi8vIERpc2sgcmVzY2FucyBmaXJlIHRoaXMgZmFyIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHdyaXRlIGhhbmRvZmYsIGNhdGNoaW5nIGZpbGVzIHRoZSBvdGhlciBwcm9jZXNzXG4vLyB3cm90ZSAodGhlIEJ1bGtEYXRhYmFzZTIgaW5kZXggaXMgYXRvbWljIGJ1dCBpdHMgZW50cmllcyBsYW5kIGF0IHdyaXRlIHRpbWUsIG5vdCBmaWxlIHRpbWUpXG5jb25zdCBTV0lUQ0hfU0NBTl9MRUFEID0gMTAgKiAxMDAwO1xuLy8gVGhlIGR5aW5nIHByb2Nlc3MgbXVzdCBoYXZlIGZsdXNoZWQgZXZlcnl0aGluZyBiZWZvcmUgdGhlIGhhbmRvZmY6IGZhc3Qtd3JpdGUgZGVsYXlzIG5ldmVyXG4vLyBleHRlbmQgcGFzdCBTICsgb3ZlcmxhcCAqIHRoaXMgZnJhY3Rpb24sIGFuZCBhZnRlciB0aGF0IHBvaW50IGZhc3Qgd3JpdGVzIGZsdXNoIGltbWVkaWF0ZWx5XG5jb25zdCBGTFVTSF9ERUFETElORV9GUkFDVElPTiA9IDAuMjU7XG5jb25zdCBCT1VOREFSWV9BX0ZSQUNUSU9OID0gMC41O1xuY29uc3QgQk9VTkRBUllfQl9GUkFDVElPTiA9IDEuNTtcbmNvbnN0IFJFTUFQX0VYUElSRV9GUkFDVElPTiA9IDI7XG5cbnR5cGUgVGltZWxpbmVFbnRyeSA9IHtcbiAgICBwaWQ/OiBudW1iZXI7XG4gICAgYWxpdmVXaW5kb3c6IFtudW1iZXIsIG51bWJlcl07XG4gICAgcGFyYW1ldGVyczogdW5rbm93bjtcbn07XG5cbnR5cGUgVGFrZW92ZXJDb21wdXRlZCA9IHtcbiAgICAvLyBXZSBhcmUgc2NoZWR1bGVkIHRvIGRpZSB3aXRoIGEgc3VjY2Vzc29yIG92ZXJsYXBwaW5nIHVzIChrbm93biBmcm9tIHRoZSBmaWxlcyBhbG9uZSwgYmVmb3JlXG4gICAgLy8gdGhlIHN1Y2Nlc3NvcidzIHBvcnQgaXMgZGlzY292ZXJlZCAtIHRoZSBmbHVzaCBkZWFkbGluZSBhcHBsaWVzIGltbWVkaWF0ZWx5KVxuICAgIGR5aW5nPzogeyBzdWNjZXNzb3JTdGFydDogbnVtYmVyOyBvdmVybGFwOiBudW1iZXIgfTtcbiAgICAvLyBUaGUgd2luZG93IHJlaW50ZXJwcmV0YXRpb24sIG9uY2UgdGhlIG1pZGRsZSB3aW5kb3cncyBwb3J0IGlzIGtub3duICh0aGUgc3VjY2Vzc29yJ3NcbiAgICAvLyByZWdpc3RlcmVkIGFsdGVybmF0ZSBwb3J0IC0gb3Igb3VyIG93biwgd2hlbiB3ZSBBUkUgdGhlIHN1Y2Nlc3NvcilcbiAgICByZW1hcD86IHsgYm91bmRhcnlBOiBudW1iZXI7IGJvdW5kYXJ5QjogbnVtYmVyOyBleHBpcmU6IG51bWJlcjsgYWx0UG9ydDogbnVtYmVyIH07XG4gICAgLy8gV2hlbiBvdXIgcHJlZGVjZXNzb3IgZGllcyBhbmQgZnJlZXMgdGhlIG1haW4gcG9ydCAoZm9yIGFjcXVpc2l0aW9uIHBhY2luZylcbiAgICBwcmVkZWNlc3NvckVuZD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFRha2VvdmVyRXZlbnQgPSBcInJlbWFwQ2hhbmdlZFwiIHwgXCJkaXNrU2NhblwiO1xuXG5sZXQgaW5pdGlhbGl6ZWQ6IHsgZG9tYWluOiBzdHJpbmc7IG1haW5Qb3J0OiBudW1iZXI7IHN0b3JhZ2VGb2xkZXI6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xubGV0IGFuY2VzdG9yUGlkcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xubGV0IHRpbWVsaW5lRm9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5sZXQgb3VyQWx0UG9ydDogbnVtYmVyIHwgdW5kZWZpbmVkO1xubGV0IGN1cnJlbnQ6IFRha2VvdmVyQ29tcHV0ZWQgPSB7fTtcbmxldCBjdXJyZW50S2V5ID0gSlNPTi5zdHJpbmdpZnkoY3VycmVudCk7XG5sZXQgZXZlbnRMaXN0ZW5lcnM6ICgoZXZlbnQ6IFRha2VvdmVyRXZlbnQpID0+IHZvaWQpW10gPSBbXTtcbmxldCBldmVudFRpbWVyczogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD5bXSA9IFtdO1xuXG5mdW5jdGlvbiBleGVjVGV4dChjb21tYW5kOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGV4ZWMoY29tbWFuZCwgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLy8gVGhlIHRpbWVsaW5lIGVudHJ5IHBpZCBpcyB0aGUgc2NyZWVuIHNoZWxsIHRoYXQgc3Bhd25lZCB1cyAtIGFuIGFuY2VzdG9yIC0gc28gd2Ugd2FsayBvdXIgd2hvbGVcbi8vIGFuY2VzdG9yIGNoYWluIHRvIGZpbmQgd2hpY2ggZW50cnkgaXMgdXNcbmFzeW5jIGZ1bmN0aW9uIGdldEFuY2VzdG9yUGlkcygpOiBQcm9taXNlPFNldDxudW1iZXI+PiB7XG4gICAgbGV0IHBpZHMgPSBuZXcgU2V0PG51bWJlcj4oW3Byb2Nlc3MucGlkXSk7XG4gICAgbGV0IGN1cnJlbnRQaWQgPSBwcm9jZXNzLnBpZDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBsZXQgcHBpZDogbnVtYmVyO1xuICAgICAgICBpZiAoY3VycmVudFBpZCA9PT0gcHJvY2Vzcy5waWQgJiYgcHJvY2Vzcy5wcGlkKSB7XG4gICAgICAgICAgICBwcGlkID0gcHJvY2Vzcy5wcGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwcGlkID0gcGFyc2VJbnQoKGF3YWl0IGV4ZWNUZXh0KGBwcyAtbyBwcGlkPSAtcCAke2N1cnJlbnRQaWR9YCkpLnRyaW0oKSk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBwaWQgfHwgTnVtYmVyLmlzTmFOKHBwaWQpIHx8IHBwaWQgPD0gMSB8fCBwaWRzLmhhcyhwcGlkKSkgYnJlYWs7XG4gICAgICAgIHBpZHMuYWRkKHBwaWQpO1xuICAgICAgICBjdXJyZW50UGlkID0gcHBpZDtcbiAgICB9XG4gICAgcmV0dXJuIHBpZHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbmRUaW1lbGluZUZvbGRlcigpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCBkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGxldCBmaWxlczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZpbGVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihkaXIpO1xuICAgICAgICB9IGNhdGNoIHsgfVxuICAgICAgICBpZiAoZmlsZXMuc29tZShmaWxlID0+IFBBUkFNRVRFUlNfVElNRUxJTkVfRklMRV9SRUdFWC50ZXN0KGZpbGUpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGRpci5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIikgKyBcIi9cIjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFyZW50ID0gcGF0aC5kaXJuYW1lKGRpcik7XG4gICAgICAgIGlmIChwYXJlbnQgPT09IGRpcikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgZGlyID0gcGFyZW50O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcGlkQWxpdmUocGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICBwcm9jZXNzLmtpbGwocGlkLCAwKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gKGUgYXMgeyBjb2RlPzogc3RyaW5nIH0pLmNvZGUgPT09IFwiRVBFUk1cIjtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlZ2lzdHJ5Rm9sZGVyKCk6IHN0cmluZyB7XG4gICAgaWYgKCFpbml0aWFsaXplZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlcGxveSB0YWtlb3ZlciBpcyBub3QgaW5pdGlhbGl6ZWRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbihwYXRoLmRpcm5hbWUocGF0aC5yZXNvbHZlKGluaXRpYWxpemVkLnN0b3JhZ2VGb2xkZXIpKSwgUE9SVF9SRUdJU1RSWV9GT0xERVJfTkFNRSk7XG59XG5cbnR5cGUgUmVnaXN0cnlFbnRyeSA9IHsgcGlkOiBudW1iZXI7IHBvcnQ6IG51bWJlcjsgYW5jZXN0b3JQaWRzOiBudW1iZXJbXSB9O1xuXG5hc3luYyBmdW5jdGlvbiByZWFkUG9ydFJlZ2lzdHJ5KCk6IFByb21pc2U8UmVnaXN0cnlFbnRyeVtdPiB7XG4gICAgbGV0IGZvbGRlciA9IGdldFJlZ2lzdHJ5Rm9sZGVyKCk7XG4gICAgbGV0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICAgIGZpbGVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihmb2xkZXIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGxldCBlbnRyaWVzOiBSZWdpc3RyeUVudHJ5W10gPSBbXTtcbiAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IC9eKFxcZCspXFwuanNvbiQvLmV4ZWMoZmlsZSk7XG4gICAgICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgcGlkID0gcGFyc2VJbnQobWF0Y2hbMV0pO1xuICAgICAgICBpZiAoIXBpZEFsaXZlKHBpZCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMudW5saW5rKHBhdGguam9pbihmb2xkZXIsIGZpbGUpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggeyB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZm9sZGVyLCBmaWxlKSwgXCJ1dGY4XCIpKSBhcyBSZWdpc3RyeUVudHJ5O1xuICAgICAgICAgICAgZW50cmllcy5wdXNoKHsgLi4uZW50cnksIHBpZCB9KTtcbiAgICAgICAgfSBjYXRjaCB7IH1cbiAgICB9XG4gICAgcmV0dXJuIGVudHJpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRUaW1lbGluZUVudHJpZXMoKTogUHJvbWlzZTxUaW1lbGluZUVudHJ5W10+IHtcbiAgICBpZiAoIXRpbWVsaW5lRm9sZGVyKSByZXR1cm4gW107XG4gICAgbGV0IGVudHJpZXM6IFRpbWVsaW5lRW50cnlbXSA9IFtdO1xuICAgIGZvciAobGV0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih0aW1lbGluZUZvbGRlcikpIHtcbiAgICAgICAgaWYgKCFQQVJBTUVURVJTX1RJTUVMSU5FX0ZJTEVfUkVHRVgudGVzdChmaWxlKSkgY29udGludWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSh0aW1lbGluZUZvbGRlciArIGZpbGUsIFwidXRmOFwiKSkgYXMgVGltZWxpbmVFbnRyeSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ291bGQgbm90IHJlYWQgZGVwbG95IHRpbWVsaW5lIGZpbGUgJHt0aW1lbGluZUZvbGRlciArIGZpbGV9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbnRyaWVzO1xufVxuXG5mdW5jdGlvbiBtYWtlUmVtYXAoc3VjY2Vzc29yU3RhcnQ6IG51bWJlciwgb3ZlcmxhcDogbnVtYmVyLCBhbHRQb3J0OiBudW1iZXIpOiBUYWtlb3ZlckNvbXB1dGVkW1wicmVtYXBcIl0ge1xuICAgIHJldHVybiB7XG4gICAgICAgIGJvdW5kYXJ5QTogc3VjY2Vzc29yU3RhcnQgKyBvdmVybGFwICogQk9VTkRBUllfQV9GUkFDVElPTixcbiAgICAgICAgYm91bmRhcnlCOiBzdWNjZXNzb3JTdGFydCArIG92ZXJsYXAgKiBCT1VOREFSWV9CX0ZSQUNUSU9OLFxuICAgICAgICBleHBpcmU6IHN1Y2Nlc3NvclN0YXJ0ICsgb3ZlcmxhcCAqIFJFTUFQX0VYUElSRV9GUkFDVElPTixcbiAgICAgICAgYWx0UG9ydCxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBlbWl0KGV2ZW50OiBUYWtlb3ZlckV2ZW50KTogdm9pZCB7XG4gICAgZm9yIChsZXQgbGlzdGVuZXIgb2YgZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRGVwbG95IHRha2VvdmVyIGxpc3RlbmVyIGZhaWxlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVFdmVudHMoKTogdm9pZCB7XG4gICAgZm9yIChsZXQgdGltZXIgb2YgZXZlbnRUaW1lcnMpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9XG4gICAgZXZlbnRUaW1lcnMgPSBbXTtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgc2NoZWR1bGUgPSAodGltZTogbnVtYmVyLCBmbmM6ICgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgaWYgKHRpbWUgPD0gbm93KSByZXR1cm47XG4gICAgICAgIGxldCB0aW1lciA9IHNldFRpbWVvdXQoZm5jLCB0aW1lIC0gbm93KTtcbiAgICAgICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgZXZlbnRUaW1lcnMucHVzaCh0aW1lcik7XG4gICAgfTtcbiAgICBsZXQgcmVtYXAgPSBjdXJyZW50LnJlbWFwO1xuICAgIGlmIChyZW1hcCkge1xuICAgICAgICBzY2hlZHVsZShyZW1hcC5ib3VuZGFyeUEgLSBTV0lUQ0hfU0NBTl9MRUFELCAoKSA9PiBlbWl0KFwiZGlza1NjYW5cIikpO1xuICAgICAgICBzY2hlZHVsZShyZW1hcC5ib3VuZGFyeUEgKyBTV0lUQ0hfU0NBTl9MRUFELCAoKSA9PiBlbWl0KFwiZGlza1NjYW5cIikpO1xuICAgICAgICBzY2hlZHVsZShyZW1hcC5leHBpcmUsICgpID0+IHZvaWQgcmVjb21wdXRlKCkuY2F0Y2goKGU6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBEZXBsb3kgdGFrZW92ZXIgcmVjb21wdXRlIGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpKTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlY29tcHV0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWluaXRpYWxpemVkIHx8ICF0aW1lbGluZUZvbGRlcikgcmV0dXJuO1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBlbnRyaWVzID0gYXdhaXQgcmVhZFRpbWVsaW5lRW50cmllcygpO1xuICAgIGxldCByZWdpc3RyeSA9IGF3YWl0IHJlYWRQb3J0UmVnaXN0cnkoKTtcbiAgICBsZXQgdXM6IFRpbWVsaW5lRW50cnkgfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoZW50cnkucGlkICYmIGFuY2VzdG9yUGlkcy5oYXMoZW50cnkucGlkKSkge1xuICAgICAgICAgICAgdXMgPSBlbnRyeTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgY29tcHV0ZWQ6IFRha2VvdmVyQ29tcHV0ZWQgPSB7fTtcbiAgICBpZiAodXMpIHtcbiAgICAgICAgbGV0IHVzU3RhcnQgPSB1cy5hbGl2ZVdpbmRvd1swXTtcbiAgICAgICAgbGV0IG5leHQ6IFRpbWVsaW5lRW50cnkgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBwcmV2OiBUaW1lbGluZUVudHJ5IHwgdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkgPT09IHVzKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChlbnRyeS5hbGl2ZVdpbmRvd1swXSA+IHVzU3RhcnQgJiYgKCFuZXh0IHx8IGVudHJ5LmFsaXZlV2luZG93WzBdIDwgbmV4dC5hbGl2ZVdpbmRvd1swXSkpIHtcbiAgICAgICAgICAgICAgICBuZXh0ID0gZW50cnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZW50cnkuYWxpdmVXaW5kb3dbMF0gPCB1c1N0YXJ0ICYmICghcHJldiB8fCBlbnRyeS5hbGl2ZVdpbmRvd1swXSA+IHByZXYuYWxpdmVXaW5kb3dbMF0pKSB7XG4gICAgICAgICAgICAgICAgcHJldiA9IGVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChuZXh0ICYmIHVzLmFsaXZlV2luZG93WzFdICE9PSBBTElWRV9XSU5ET1dfRk9SRVZFUiAmJiBuZXh0LmFsaXZlV2luZG93WzBdIDw9IHVzLmFsaXZlV2luZG93WzFdKSB7XG4gICAgICAgICAgICBsZXQgb3ZlcmxhcCA9IHVzLmFsaXZlV2luZG93WzFdIC0gbmV4dC5hbGl2ZVdpbmRvd1swXTtcbiAgICAgICAgICAgIGxldCBzdWNjZXNzb3JTdGFydCA9IG5leHQuYWxpdmVXaW5kb3dbMF07XG4gICAgICAgICAgICBpZiAob3ZlcmxhcCA+IDAgJiYgbm93IDwgc3VjY2Vzc29yU3RhcnQgKyBvdmVybGFwICogUkVNQVBfRVhQSVJFX0ZSQUNUSU9OKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWQuZHlpbmcgPSB7IHN1Y2Nlc3NvclN0YXJ0LCBvdmVybGFwIH07XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VjY2Vzc29yUGlkID0gbmV4dC5waWQ7XG4gICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3NvclBpZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3VjY2Vzc29yRW50cnkgPSByZWdpc3RyeS5maW5kKHggPT4geC5hbmNlc3RvclBpZHMuaW5jbHVkZXMoc3VjY2Vzc29yUGlkKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzb3JFbnRyeSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQucmVtYXAgPSBtYWtlUmVtYXAoc3VjY2Vzc29yU3RhcnQsIG92ZXJsYXAsIHN1Y2Nlc3NvckVudHJ5LnBvcnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcmV2ICYmIHByZXYuYWxpdmVXaW5kb3dbMV0gPiB1c1N0YXJ0KSB7XG4gICAgICAgICAgICBsZXQgb3ZlcmxhcCA9IHByZXYuYWxpdmVXaW5kb3dbMV0gLSB1c1N0YXJ0O1xuICAgICAgICAgICAgY29tcHV0ZWQucHJlZGVjZXNzb3JFbmQgPSBwcmV2LmFsaXZlV2luZG93WzFdO1xuICAgICAgICAgICAgaWYgKG92ZXJsYXAgPiAwICYmIG91ckFsdFBvcnQgJiYgbm93IDwgdXNTdGFydCArIG92ZXJsYXAgKiBSRU1BUF9FWFBJUkVfRlJBQ1RJT04gJiYgIWNvbXB1dGVkLnJlbWFwKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWQucmVtYXAgPSBtYWtlUmVtYXAodXNTdGFydCwgb3ZlcmxhcCwgb3VyQWx0UG9ydCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IGtleSA9IEpTT04uc3RyaW5naWZ5KGNvbXB1dGVkKTtcbiAgICBpZiAoa2V5ID09PSBjdXJyZW50S2V5KSByZXR1cm47XG4gICAgY3VycmVudCA9IGNvbXB1dGVkO1xuICAgIGN1cnJlbnRLZXkgPSBrZXk7XG4gICAgY29uc29sZS5sb2coYERlcGxveSB0YWtlb3ZlciBzdGF0ZSBjaGFuZ2VkOiAke2tleX1gKTtcbiAgICBzY2hlZHVsZUV2ZW50cygpO1xuICAgIGVtaXQoXCJyZW1hcENoYW5nZWRcIik7XG59XG5cbi8qKiBTdGFydHMgdGhlIHRha2VvdmVyIG1hY2hpbmVyeS4gUmV0dXJucyB3aGV0aGVyIGEgZGVwbG95IHRpbWVsaW5lIGV4aXN0cyAtIHdoZW4gaXQgZG9lc24ndCxcbiAqICBldmVyeXRoaW5nIGhlcmUgc3RheXMgaW5lcnQgKGFuZCB0aGUgY2FsbGVyIG11c3QgTk9UIGZhbGwgYmFjayB0byBhbHRlcm5hdGUgcG9ydHMsIHNpbmNlIGEgYnVzeVxuICogIHBvcnQgdGhlbiBtZWFucyBhIHJlYWwgbWlzY29uZmlndXJhdGlvbiwgbm90IGEgZGVwbG95KS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0RGVwbG95VGFrZW92ZXIoY29uZmlnOiB7IGRvbWFpbjogc3RyaW5nOyBtYWluUG9ydDogbnVtYmVyOyBzdG9yYWdlRm9sZGVyOiBzdHJpbmcgfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGluaXRpYWxpemVkID0gY29uZmlnO1xuICAgIGFuY2VzdG9yUGlkcyA9IGF3YWl0IGdldEFuY2VzdG9yUGlkcygpO1xuICAgIHRpbWVsaW5lRm9sZGVyID0gYXdhaXQgZmluZFRpbWVsaW5lRm9sZGVyKCk7XG4gICAgaWYgKCF0aW1lbGluZUZvbGRlcikgcmV0dXJuIGZhbHNlO1xuICAgIGF3YWl0IHJlY29tcHV0ZSgpO1xuICAgIGxldCBwb2xsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICB2b2lkIHJlY29tcHV0ZSgpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgRGVwbG95IHRha2VvdmVyIHJlY29tcHV0ZSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICB9LCBUSU1FTElORV9QT0xMX0lOVEVSVkFMKTtcbiAgICAocG9sbCBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBDYWxsZWQgd2hlbiB3ZSBoYWQgdG8gbGlzdGVuIG9uIGFuIGFsdGVybmF0ZSBwb3J0ICh0aGUgbWFpbiBwb3J0IHdhcyBzdGlsbCBoZWxkIGJ5IG91clxuICogIHByZWRlY2Vzc29yKTogcmVnaXN0ZXJzIGl0IHNvIHRoZSBwcmVkZWNlc3NvciBjYW4gcm91dGUgdGhlIG1pZGRsZSBvdmVybGFwIHdpbmRvdyB0byB1cy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlckFsdFBvcnQocG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgb3VyQWx0UG9ydCA9IHBvcnQ7XG4gICAgbGV0IGZvbGRlciA9IGdldFJlZ2lzdHJ5Rm9sZGVyKCk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgZW50cnk6IFJlZ2lzdHJ5RW50cnkgPSB7IHBpZDogcHJvY2Vzcy5waWQsIHBvcnQsIGFuY2VzdG9yUGlkczogWy4uLmFuY2VzdG9yUGlkc10gfTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGZvbGRlciwgYCR7cHJvY2Vzcy5waWR9Lmpzb25gKSwgSlNPTi5zdHJpbmdpZnkoZW50cnkpKTtcbiAgICBhd2FpdCByZWNvbXB1dGUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uVGFrZW92ZXJFdmVudChsaXN0ZW5lcjogKGV2ZW50OiBUYWtlb3ZlckV2ZW50KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgZXZlbnRMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG59XG5cbi8qKiBUaGUgaW50ZXJwcmV0YXRpb24gb3ZlcmxheTogc3BsaXRzIGV2ZXJ5IHNvdXJjZSBwb2ludGluZyBhdCBvdXIgZG9tYWluK21haW4gcG9ydCBzbyB0aGUgbWlkZGxlXG4gKiAgb2YgdGhlIGRlcGxveSBvdmVybGFwIHBvaW50cyBhdCB0aGUgYWx0ZXJuYXRlIHBvcnQuIFB1cmUsIGluLW1lbW9yeSBvbmx5IC0gdGhlIHN0b3JlZCByb3V0aW5nXG4gKiAgY29uZmlnIGlzIG5ldmVyIG1vZGlmaWVkLCBhbmQgdGhpcyBtdXN0IG5ldmVyIGJlIGFwcGxpZWQgdG8gZGF0YSB0aGF0IGdldHMgcGVyc2lzdGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RGVwbG95UmVtYXAocm91dGluZzogUmVtb3RlQ29uZmlnKTogUmVtb3RlQ29uZmlnIHtcbiAgICBsZXQgcmVtYXAgPSBjdXJyZW50LnJlbWFwO1xuICAgIGxldCBpbml0ID0gaW5pdGlhbGl6ZWQ7XG4gICAgaWYgKCFyZW1hcCB8fCAhaW5pdCkgcmV0dXJuIHJvdXRpbmc7XG4gICAgbGV0IHNvdXJjZXM6IFJlbW90ZUNvbmZpZ0Jhc2VbXSA9IFtdO1xuICAgIGxldCBzbGljZSA9IChzb3VyY2U6IEhvc3RlZENvbmZpZywgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHVybD86IHN0cmluZyk6IEhvc3RlZENvbmZpZyA9PiB7XG4gICAgICAgIHJldHVybiB7IC4uLnNvdXJjZSwgdXJsOiB1cmwgfHwgc291cmNlLnVybCwgdmFsaWRXaW5kb3c6IFtzdGFydCwgZW5kXSB9O1xuICAgIH07XG4gICAgZm9yIChsZXQgc291cmNlIG9mIHJvdXRpbmcuc291cmNlcykge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiB8fCBzb3VyY2UudHlwZSAhPT0gXCJyZW1vdGVcIikge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFyc2VkOiB7IGFkZHJlc3M6IHN0cmluZzsgcG9ydDogbnVtYmVyIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBwYXJzZUhvc3RlZFVybChzb3VyY2UudXJsKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWQuYWRkcmVzcyAhPT0gaW5pdC5kb21haW4gfHwgcGFyc2VkLnBvcnQgIT09IGluaXQubWFpblBvcnQpIHtcbiAgICAgICAgICAgIHNvdXJjZXMucHVzaChzb3VyY2UpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IFtzdGFydCwgZW5kXSA9IHNvdXJjZS52YWxpZFdpbmRvdztcbiAgICAgICAgbGV0IGEgPSBNYXRoLm1heChzdGFydCwgTWF0aC5taW4ocmVtYXAuYm91bmRhcnlBLCBlbmQpKTtcbiAgICAgICAgbGV0IGIgPSBNYXRoLm1heChzdGFydCwgTWF0aC5taW4ocmVtYXAuYm91bmRhcnlCLCBlbmQpKTtcbiAgICAgICAgbGV0IGFkZGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChhID4gc3RhcnQpIHtcbiAgICAgICAgICAgIHNvdXJjZXMucHVzaChzbGljZShzb3VyY2UsIHN0YXJ0LCBhKSk7XG4gICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgPiBhKSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc2xpY2Uoc291cmNlLCBhLCBiLCByZXBsYWNlSG9zdGVkVXJsUG9ydChzb3VyY2UudXJsLCByZW1hcC5hbHRQb3J0KSkpO1xuICAgICAgICAgICAgYWRkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgPiBiKSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc2xpY2Uoc291cmNlLCBiLCBlbmQpKTtcbiAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFkZGVkKSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB2ZXJzaW9uOiByb3V0aW5nLnZlcnNpb24sIHNvdXJjZXMgfTtcbn1cblxuLyoqIEZvciB0aGUgZHlpbmcgcHJvY2VzczogZmFzdC13cml0ZSBmbHVzaCBkZWxheXMgbXVzdCBuZXZlciBleHRlbmQgcGFzdCB0aGlzIHRpbWUsIGFuZCBhZnRlciBpdFxuICogIGZhc3Qgd3JpdGVzIGZsdXNoIGltbWVkaWF0ZWx5IC0gc28gbm90aGluZyBpcyBsZWZ0IGluIG1lbW9yeSB3aGVuIHRoZSB3cml0ZSB3aW5kb3cgdHJhbnNmZXJzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZsdXNoRGVhZGxpbmUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgZHlpbmcgPSBjdXJyZW50LmR5aW5nO1xuICAgIGlmICghZHlpbmcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGR5aW5nLnN1Y2Nlc3NvclN0YXJ0ICsgZHlpbmcub3ZlcmxhcCAqIEZMVVNIX0RFQURMSU5FX0ZSQUNUSU9OO1xufVxuXG4vKiogSG93IGxvbmcgdG8gd2FpdCBiZXR3ZWVuIG1haW4tcG9ydCBhY3F1aXNpdGlvbiBhdHRlbXB0czogdGlnaHQgYXJvdW5kIHRoZSBwcmVkZWNlc3NvcidzXG4gKiAgc2NoZWR1bGVkIGRlYXRoICh3aGVuIHRoZSBwb3J0IGFjdHVhbGx5IGZyZWVzKSwgcmVsYXhlZCBvdGhlcndpc2UuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpblBvcnRBY3F1aXJlRGVsYXkoKTogbnVtYmVyIHtcbiAgICBsZXQgZW5kID0gY3VycmVudC5wcmVkZWNlc3NvckVuZDtcbiAgICBpZiAoZW5kICE9PSB1bmRlZmluZWQgJiYgTWF0aC5hYnMoRGF0ZS5ub3coKSAtIGVuZCkgPD0gQUNRVUlSRV9GQVNUX1dJTkRPVykge1xuICAgICAgICByZXR1cm4gQUNRVUlSRV9GQVNUX0RFTEFZO1xuICAgIH1cbiAgICByZXR1cm4gQUNRVUlSRV9TTE9XX0RFTEFZO1xufVxuIl19
|
|
371
|
+
/* _JS_SOURCE_HASH = "154a9252e403e54777d49b60b4db16fad1a05679ee037ae5a6db6ba73d410da3"; */
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
|
-
//exports.serializeRemoteConfig = exports.parseRoutingData = exports.normalizeRemoteConfig = exports.normalizeSource = exports.parseBackblazeUrl = exports.parseHostedUrl = exports.buildFileUrl = exports.getBucketBaseUrl = exports.getConfigVersion = exports.routeIntersection = exports.routesOverlap = exports.routeContains = exports.getRoute = exports.parseVariableRoute = exports.ROUTING_FILE = void 0;
|
|
3
|
+
//exports.serializeRemoteConfig = exports.parseRoutingData = exports.normalizeRemoteConfig = exports.normalizeSource = exports.replaceHostedUrlPort = exports.parseBackblazeUrl = exports.parseHostedUrl = exports.buildFileUrl = exports.getBucketBaseUrl = exports.getConfigVersion = exports.routeIntersection = exports.routesOverlap = exports.routeContains = exports.getRoute = exports.parseVariableRoute = exports.ROUTING_FILE = void 0;
|
|
4
4
|
module.allowclient = true;
|
|
5
5
|
const misc_1 = require("socket-function/src/misc");
|
|
6
6
|
const bits_1 = require("socket-function/src/bits");
|
|
@@ -99,6 +99,12 @@ function parseBackblazeUrl(url) {
|
|
|
99
99
|
return { bucketName: decodeURIComponent(parts[1]) };
|
|
100
100
|
}
|
|
101
101
|
exports.parseBackblazeUrl = parseBackblazeUrl;
|
|
102
|
+
function replaceHostedUrlPort(url, port) {
|
|
103
|
+
let u = new URL(url);
|
|
104
|
+
u.port = String(port);
|
|
105
|
+
return u.toString();
|
|
106
|
+
}
|
|
107
|
+
exports.replaceHostedUrlPort = replaceHostedUrlPort;
|
|
102
108
|
function normalizeSource(source) {
|
|
103
109
|
if (typeof source !== "string") {
|
|
104
110
|
let window = source.validWindow;
|
|
@@ -202,5 +208,5 @@ function serializeRemoteConfig(config) {
|
|
|
202
208
|
return Buffer.from(JSON.stringify(config, undefined, 4));
|
|
203
209
|
}
|
|
204
210
|
exports.serializeRemoteConfig = serializeRemoteConfig;
|
|
205
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVtb3RlQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBRTFCLG1EQUFrRTtBQUNsRSxtREFBd0Q7QUFDeEQsNENBQTRJO0FBRTVJLDBGQUEwRjtBQUMxRiwrRkFBK0Y7QUFDL0YsNkZBQTZGO0FBQzdGLHNCQUFzQjtBQUVULFFBQUEsWUFBWSxHQUFHLDZCQUE2QixDQUFDO0FBQzFELE1BQU0sY0FBYyxHQUFHLEdBQUcsR0FBRyxvQkFBWSxDQUFDO0FBRTFDLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRTNDLG9MQUFvTDtBQUNwTCxTQUFnQixrQkFBa0IsQ0FBQyxHQUFXO0lBQzFDLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsMEJBQWMsQ0FBQyxDQUFDO0lBQ3hDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ25DLElBQUksS0FBSyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRywwQkFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDL0UsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM3QixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLENBQUM7QUFORCxnREFNQztBQUVELHdHQUF3RztBQUN4RyxTQUFnQixRQUFRLENBQUMsR0FBVztJQUNoQyxJQUFJLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QyxJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDNUMsSUFBSSxJQUFJLEdBQUcsSUFBQSxtQkFBWSxFQUFDLElBQUEsdUJBQWdC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QUM7SUFDOUMsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFDRCxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDMUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0REFBNEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RHLENBQUM7SUFDRCxPQUFPLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFaRCw0Q0FZQztBQUVELFNBQWdCLHFCQUFxQixDQUFDLE1BQW9CO0lBQ3RELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuYWxsb3djbGllbnQgPSB0cnVlO1xuXG5pbXBvcnQgeyBzb3J0LCBzaGEyNTZIYXNoQnVmZmVyIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZ2V0QnVmZmVySW50IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYml0c1wiO1xuaW1wb3J0IHsgUmVtb3RlQ29uZmlnLCBSZW1vdGVDb25maWdCYXNlLCBIb3N0ZWRDb25maWcsIEJhY2tibGF6ZUNvbmZpZywgRlVMTF9WQUxJRF9XSU5ET1csIEZVTExfUk9VVEUsIFZBUklBQkxFX1NIQVJEIH0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuXG4vLyBQYXJzaW5nIC8gbm9ybWFsaXphdGlvbiBvZiBSZW1vdGVDb25maWcgKHNlZSBJQXJjaGl2ZXMudHMpLiBFdmVyeSBidWNrZXQgc3RvcmVzIGl0cyBvd25cbi8vIGNvbmZpZ3VyYXRpb24gKGEgUmVtb3RlQ29uZmlnKSBpbnNpZGUgaXRzZWxmLCBhdCBST1VUSU5HX0ZJTEUuIFdyaXRpbmcgdGhhdCBmaWxlIGNyZWF0ZXMgdGhlXG4vLyBidWNrZXQgLyByZWNvbmZpZ3VyZXMgaXQgKHNlZSBzdG9yYWdlU2VydmVyU3RhdGUudHMpOyBjbGllbnRzIHJlY29uY2lsZSBpdCBieSB2ZXJzaW9uIChzZWVcbi8vIGNyZWF0ZUFyY2hpdmVzLnRzKS5cblxuZXhwb3J0IGNvbnN0IFJPVVRJTkdfRklMRSA9IFwic3RvcmFnZS9zdG9yYWdlcm91dGluZy5qc29uXCI7XG5jb25zdCBST1VUSU5HX1NVRkZJWCA9IFwiL1wiICsgUk9VVElOR19GSUxFO1xuXG5jb25zdCBST1VURV9QUkVDSVNJT04gPSAxMDAwICogMTAwMCAqIDEwMDA7XG5cbi8qKiBUaGUgdmFyaWFibGUtc2hhcmQgcm91dGUgb3ZlcnJpZGUgZW1iZWRkZWQgaW4gdGhlIGtleSAoXCI8c2VudGluZWw+Xzx2YWx1ZT5cIiwgc2VlIFZBUklBQkxFX1NIQVJEKSwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIGtleSBoYXMgbm8gc2VudGluZWwgb3IgdGhlIHNlbnRpbmVsIGhhcyBubyB2YWx1ZSB5ZXQuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWYXJpYWJsZVJvdXRlKGtleTogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaW5kZXggPSBrZXkuaW5kZXhPZihWQVJJQUJMRV9TSEFSRCk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBsZXQgbWF0Y2ggPSAvXl8oXFxkKyg/OlxcLlxcZCspPykvLmV4ZWMoa2V5LnNsaWNlKGluZGV4ICsgVkFSSUFCTEVfU0hBUkQubGVuZ3RoKSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gK21hdGNoWzFdO1xufVxuXG4vKiogV2hlcmUgYSBrZXkgcm91dGVzIGluIFswLCAxKS4gQSBtYXRlcmlhbGl6ZWQgdmFyaWFibGUtc2hhcmQgc3VmZml4IGNvbXBsZXRlbHkgb3ZlcnJpZGVzIHRoZSBoYXNoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvdXRlKGtleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBsZXQgb3ZlcnJpZGUgPSBwYXJzZVZhcmlhYmxlUm91dGUoa2V5KTtcbiAgICBpZiAob3ZlcnJpZGUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIG92ZXJyaWRlO1xuICAgIGxldCBoYXNoID0gZ2V0QnVmZmVySW50KHNoYTI1Nkhhc2hCdWZmZXIoa2V5KSk7XG4gICAgcmV0dXJuIGhhc2ggJSBST1VURV9QUkVDSVNJT04gLyBST1VURV9QUkVDSVNJT047XG59XG5cbi8vIFJvdXRlIHJhbmdlcyBhcmUgW3N0YXJ0LCBlbmQpIC0gaW5jbHVzaXZlIHN0YXJ0LCBleGNsdXNpdmUgZW5kXG5leHBvcnQgZnVuY3Rpb24gcm91dGVDb250YWlucyhyb3V0ZTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgdmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghcm91dGUpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiByb3V0ZVswXSA8PSB2YWx1ZSAmJiB2YWx1ZSA8IHJvdXRlWzFdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJvdXRlc092ZXJsYXAoYTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgYjogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGxldCBbYVN0YXJ0LCBhRW5kXSA9IGEgfHwgRlVMTF9ST1VURTtcbiAgICBsZXQgW2JTdGFydCwgYkVuZF0gPSBiIHx8IEZVTExfUk9VVEU7XG4gICAgcmV0dXJuIGFTdGFydCA8IGJFbmQgJiYgYlN0YXJ0IDwgYUVuZDtcbn1cbi8qKiBUaGUgb3ZlcmxhcCBvZiB0d28gcm91dGUgcmFuZ2VzLCBvciB1bmRlZmluZWQgd2hlbiB0aGV5IGRvbid0IG92ZXJsYXAuICovXG5leHBvcnQgZnVuY3Rpb24gcm91dGVJbnRlcnNlY3Rpb24oYTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgYjogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCk6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQge1xuICAgIGxldCBbYVN0YXJ0LCBhRW5kXSA9IGEgfHwgRlVMTF9ST1VURTtcbiAgICBsZXQgW2JTdGFydCwgYkVuZF0gPSBiIHx8IEZVTExfUk9VVEU7XG4gICAgbGV0IHN0YXJ0ID0gTWF0aC5tYXgoYVN0YXJ0LCBiU3RhcnQpO1xuICAgIGxldCBlbmQgPSBNYXRoLm1pbihhRW5kLCBiRW5kKTtcbiAgICBpZiAoc3RhcnQgPj0gZW5kKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBbc3RhcnQsIGVuZF07XG59XG5cbi8vIEEgbWlzc2luZyB2ZXJzaW9uIGNvdW50cyBhcyAtMSwgc28gYW55IGV4cGxpY2l0bHkgdmVyc2lvbmVkIGNvbmZpZyBiZWF0cyBhbiB1bnZlcnNpb25lZCBvbmVcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWdWZXJzaW9uKGNvbmZpZzogUmVtb3RlQ29uZmlnKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY29uZmlnLnZlcnNpb24gPz8gLTE7XG59XG5cbi8qKiBTdHJpcHMgdGhlIHJvdXRpbmctZmlsZSBzdWZmaXgsIGxlYXZpbmcgdGhlIGJ1Y2tldCdzIHB1YmxpYyBiYXNlIFVSTCAoZmlsZSBwYXRocyBhcHBlbmQgdG8gaXQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1Y2tldEJhc2VVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdXJsLmVuZHNXaXRoKFJPVVRJTkdfU1VGRklYKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgYnVja2V0IHJvdXRpbmcgVVJMIGVuZGluZyB3aXRoICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19TVUZGSVgpfSwgd2FzICR7SlNPTi5zdHJpbmdpZnkodXJsKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHVybC5zbGljZSgwLCAtUk9VVElOR19TVUZGSVgubGVuZ3RoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmlsZVVybChiYXNlVXJsOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBiYXNlVXJsICsgXCIvXCIgKyBmaWxlUGF0aC5zcGxpdChcIi9cIikubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbihcIi9cIik7XG59XG5cbi8vIEV4OiBodHRwczovL3N0b3JhZ2UyLnZpZGdyaWR3ZWIuY29tOjQ0NDUvZmlsZS9leGFtcGxlYWNjb3VudC9leGFtcGxlYnVja2V0L3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSG9zdGVkVXJsKHVybDogc3RyaW5nKTogeyBhZGRyZXNzOiBzdHJpbmc7IHBvcnQ6IG51bWJlcjsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmcgfSB7XG4gICAgbGV0IGJhc2UgPSBnZXRCdWNrZXRCYXNlVXJsKHVybCk7XG4gICAgbGV0IHUgPSBuZXcgVVJMKGJhc2UpO1xuICAgIGlmICh1LnByb3RvY29sICE9PSBcImh0dHBzOlwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBVUkwgbXVzdCB1c2UgaHR0cHMsIGdvdCAke0pTT04uc3RyaW5naWZ5KHUucHJvdG9jb2wpfSBpbiAke0pTT04uc3RyaW5naWZ5KHVybCl9YCk7XG4gICAgfVxuICAgIGxldCBwYXJ0cyA9IHUucGF0aG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcih4ID0+IHgpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMgfHwgcGFydHNbMF0gIT09IFwiZmlsZVwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBob3N0ZWQgYnVja2V0IFVSTCBsaWtlIGh0dHBzOi8vaG9zdDpwb3J0L2ZpbGUvPGFjY291bnQ+LzxidWNrZXROYW1lPiR7Uk9VVElOR19TVUZGSVh9LCB3YXMgJHtKU09OLnN0cmluZ2lmeSh1cmwpfWApO1xuICAgIH1cbiAgICByZXR1cm4geyBhZGRyZXNzOiB1Lmhvc3RuYW1lLCBwb3J0OiArdS5wb3J0IHx8IDQ0MywgYWNjb3VudDogZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzFdKSwgYnVja2V0TmFtZTogZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzJdKSB9O1xufVxuXG4vLyBFeDogaHR0cHM6Ly9mMDAyLmJhY2tibGF6ZWIyLmNvbS9maWxlL3F1ZXJ5c3VidGVzdC1jb20tcHVibGljLWltbXV0YWJsZS9zdG9yYWdlL3N0b3JhZ2Vyb3V0aW5nLmpzb25cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJhY2tibGF6ZVVybCh1cmw6IHN0cmluZyk6IHsgYnVja2V0TmFtZTogc3RyaW5nIH0ge1xuICAgIGxldCBiYXNlID0gZ2V0QnVja2V0QmFzZVVybCh1cmwpO1xuICAgIGxldCB1ID0gbmV3IFVSTChiYXNlKTtcbiAgICBsZXQgcGFydHMgPSB1LnBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoeCA9PiB4KTtcbiAgICBpZiAocGFydHMubGVuZ3RoICE9PSAyIHx8IHBhcnRzWzBdICE9PSBcImZpbGVcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgYmFja2JsYXplIGJ1Y2tldCBVUkwgbGlrZSBodHRwczovL2YwMDIuYmFja2JsYXplYjIuY29tL2ZpbGUvPGJ1Y2tldE5hbWU+JHtST1VUSU5HX1NVRkZJWH0sIHdhcyAke0pTT04uc3RyaW5naWZ5KHVybCl9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IGJ1Y2tldE5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0c1sxXSkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVNvdXJjZShzb3VyY2U6IFJlbW90ZUNvbmZpZ0Jhc2UpOiBIb3N0ZWRDb25maWcgfCBCYWNrYmxhemVDb25maWcge1xuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGxldCB3aW5kb3cgPSBzb3VyY2UudmFsaWRXaW5kb3c7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh3aW5kb3cpIHx8IHdpbmRvdy5sZW5ndGggIT09IDIgfHwgIXdpbmRvdy5ldmVyeSh4ID0+IHR5cGVvZiB4ID09PSBcIm51bWJlclwiKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPYmplY3Qgc291cmNlIGNvbmZpZ3MgbXVzdCBzcGVjaWZ5IHZhbGlkV2luZG93IChbc3RhcnRNcywgZW5kTXNdIG9mIHRoZSB3cml0ZSB0aW1lcyB0aGUgc291cmNlIGlzIHZhbGlkIGZvcikgLSBjb25maWd1cmF0aW9uIGNoYW5nZXMgbXVzdCBiZSBzY2hlZHVsZWQsIG5vdCBmbGlwcGVkIGluc3RhbnRseS4gVXNlIEZVTExfVkFMSURfV0lORE9XIHdoZW4gdGhlIHNvdXJjZSBpcyBhbHdheXMgdmFsaWQuIFdhcyAke0pTT04uc3RyaW5naWZ5KHdpbmRvdyl9IG9uICR7SlNPTi5zdHJpbmdpZnkoc291cmNlKS5zbGljZSgwLCA1MDApfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByb3V0ZSA9IHNvdXJjZS5yb3V0ZTtcbiAgICAgICAgaWYgKHJvdXRlICE9PSB1bmRlZmluZWQgJiYgKCFBcnJheS5pc0FycmF5KHJvdXRlKSB8fCByb3V0ZS5sZW5ndGggIT09IDIgfHwgIXJvdXRlLmV2ZXJ5KHggPT4gdHlwZW9mIHggPT09IFwibnVtYmVyXCIpIHx8IHJvdXRlWzBdIDwgMCB8fCByb3V0ZVsxXSA+IDEgfHwgcm91dGVbMF0gPj0gcm91dGVbMV0pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSByb3V0ZSBtdXN0IGJlIGEgW3N0YXJ0LCBlbmQpIGZyYWN0aW9uIHJhbmdlIHdpdGhpbiBbMCwgMV0gd2l0aCBzdGFydCA8IGVuZCwgd2FzICR7SlNPTi5zdHJpbmdpZnkocm91dGUpfSBvbiAke0pTT04uc3RyaW5naWZ5KHNvdXJjZSkuc2xpY2UoMCwgNTAwKX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc291cmNlLnJlYWRlckRpc2tMaW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZS5yZWFkZXJEaXNrTGltaXQgIT09IFwibnVtYmVyXCIgfHwgc291cmNlLnJlYWRlckRpc2tMaW1pdCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGByZWFkZXJEaXNrTGltaXQgbXVzdCBiZSBhIHBvc2l0aXZlIGJ5dGUgY291bnQsIHdhcyAke0pTT04uc3RyaW5naWZ5KHNvdXJjZS5yZWFkZXJEaXNrTGltaXQpfSBvbiAke0pTT04uc3RyaW5naWZ5KHNvdXJjZSkuc2xpY2UoMCwgNTAwKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc291cmNlLm5vRnVsbFN5bmMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJlYWRlckRpc2tMaW1pdCByZXF1aXJlcyBub0Z1bGxTeW5jOiBhIGZ1bGwgY29weSBjYW5ub3QgYmUgYm91bmRlZCwgb25seSBhIHJlYWQgY2FjaGUgY2FuLiBPbiAke0pTT04uc3RyaW5naWZ5KHNvdXJjZSkuc2xpY2UoMCwgNTAwKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc291cmNlLnR5cGUgPT09IFwicmVtb3RlXCIpIHtcbiAgICAgICAgICAgIC8vIFRocm93cyBpZiB0aGUgVVJMIGlzIG1hbGZvcm1lZCwgc28gYmFkIGNvbmZpZ3MgYXJlIHJlamVjdGVkIGJlZm9yZSB0aGV5J3JlIHN0b3JlZFxuICAgICAgICAgICAgcGFyc2VIb3N0ZWRVcmwoc291cmNlLnVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9XG4gICAgbGV0IGhvc3RuYW1lID0gbmV3IFVSTChzb3VyY2UpLmhvc3RuYW1lO1xuICAgIGlmIChob3N0bmFtZS5lbmRzV2l0aChcIi5iYWNrYmxhemViMi5jb21cIikpIHtcbiAgICAgICAgLy8gVmFsaWRhdGVzIHRoZSBVUkwgKHRocm93cyBvbiBtYWxmb3JtZWQpIGJlZm9yZSBpdCdzIHN0b3JlZDsgdGhlIGJ1Y2tldCBuYW1lIGlzIHJlYWQgYmFja1xuICAgICAgICAvLyBvdXQgb2YgdGhlIFVSTCBhdCB1c2Ugc2l0ZXMsIG5ldmVyIHN0b3JlZCBvbiB0aGUgY29uZmlnLlxuICAgICAgICBwYXJzZUJhY2tibGF6ZVVybChzb3VyY2UpO1xuICAgICAgICByZXR1cm4geyB0eXBlOiBcImJhY2tibGF6ZVwiLCB1cmw6IHNvdXJjZSwgdmFsaWRXaW5kb3c6IEZVTExfVkFMSURfV0lORE9XIH07XG4gICAgfVxuICAgIHBhcnNlSG9zdGVkVXJsKHNvdXJjZSk7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJyZW1vdGVcIiwgdXJsOiBzb3VyY2UsIHZhbGlkV2luZG93OiBGVUxMX1ZBTElEX1dJTkRPVyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUmVtb3RlQ29uZmlnKGNvbmZpZzogUmVtb3RlQ29uZmlnIHwgUmVtb3RlQ29uZmlnQmFzZSk6IFJlbW90ZUNvbmZpZyB7XG4gICAgbGV0IHJlc3VsdDogUmVtb3RlQ29uZmlnO1xuICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSBcInN0cmluZ1wiICYmIFwic291cmNlc1wiIGluIGNvbmZpZykge1xuICAgICAgICByZXN1bHQgPSB7IHZlcnNpb246IGNvbmZpZy52ZXJzaW9uLCBzb3VyY2VzOiBjb25maWcuc291cmNlcy5tYXAobm9ybWFsaXplU291cmNlKSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IHsgc291cmNlczogW25vcm1hbGl6ZVNvdXJjZShjb25maWcpXSB9O1xuICAgIH1cbiAgICAvLyBNaXhlZCBpbW11dGFiaWxpdHkgbWFrZXMgbm8gc2Vuc2UgQU1PTkcgc291cmNlcyB2YWxpZCBhdCB0aGUgc2FtZSB0aW1lOiBhIG11dGFibGUgc291cmNlXG4gICAgLy8gd291bGQgYWNjZXB0IG92ZXJ3cml0ZXMgdGhhdCBpdHMgaW1tdXRhYmxlIHBlZXJzIHJlZnVzZSB0byBzeW5jaHJvbml6ZSwgZm9ya2luZyB0aGVpclxuICAgIC8vIGNvbnRlbnRzLiBTb3VyY2VzIGFyZSBncm91cGVkIGJ5IHRyYW5zaXRpdmVseSBvdmVybGFwcGluZyB2YWxpZCB3aW5kb3dzIChhYnNvcmIgZXZlcnl0aGluZ1xuICAgIC8vIG92ZXJsYXBwaW5nIHRoZSBncm91cCwgZXh0ZW5kIHRoZSBncm91cCdzIGVuZCwgcmVwZWF0KSAtIGEgc29mdCBjaGVjayB0aGF0IGlzIGNvcnJlY3QgYXNcbiAgICAvLyBsb25nIGFzIHdpbmRvd3MgaGF2ZSBjbGVhbiBicmVha3MgKGEgZ3JvdXAgZW5kcyBleGFjdGx5IHdoZXJlIHRoZSBuZXh0IGJlZ2lucykuXG4gICAgbGV0IHNvdXJjZXMgPSByZXN1bHQuc291cmNlcy5tYXAobm9ybWFsaXplU291cmNlKTtcbiAgICBsZXQgc29ydGVkID0gWy4uLnNvdXJjZXNdO1xuICAgIHNvcnQoc29ydGVkLCB4ID0+IHgudmFsaWRXaW5kb3dbMF0pO1xuICAgIGxldCBncm91cDogdHlwZW9mIHNvdXJjZXMgPSBbXTtcbiAgICBsZXQgZ3JvdXBFbmQgPSAwO1xuICAgIGZ1bmN0aW9uIGNoZWNrR3JvdXAoKSB7XG4gICAgICAgIGxldCBpbW11dGFibGVDb3VudCA9IGdyb3VwLmZpbHRlcih4ID0+IHguaW1tdXRhYmxlKS5sZW5ndGg7XG4gICAgICAgIGlmIChpbW11dGFibGVDb3VudCAmJiBpbW11dGFibGVDb3VudCAhPT0gZ3JvdXAubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZXMgd2l0aCBvdmVybGFwcGluZyB2YWxpZCB3aW5kb3dzIG11c3QgYWdyZWUgb24gaW1tdXRhYmlsaXR5OiAke2ltbXV0YWJsZUNvdW50fSBvZiAke2dyb3VwLmxlbmd0aH0gYXJlIGltbXV0YWJsZS4gU291cmNlczogJHtKU09OLnN0cmluZ2lmeShncm91cC5tYXAoeCA9PiAoeyB1cmw6IHgudXJsLCB2YWxpZFdpbmRvdzogeC52YWxpZFdpbmRvdywgaW1tdXRhYmxlOiAhIXguaW1tdXRhYmxlIH0pKSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIHNvdXJjZXMgdmFsaWQgYXQgYW55IGluc3RhbnQgbXVzdCBjb3ZlciB0aGUgd2hvbGUga2V5IHNwYWNlLCBvciBrZXlzIHJvdXRpbmcgaW50byBhXG4gICAgICAgIC8vIGdhcCBjb3VsZCBuZXZlciBiZSByZWFkXG4gICAgICAgIGxldCByb3V0ZXMgPSBncm91cC5tYXAoeCA9PiB4LnJvdXRlIHx8IEZVTExfUk9VVEUpO1xuICAgICAgICBzb3J0KHJvdXRlcywgeCA9PiB4WzBdKTtcbiAgICAgICAgbGV0IGNvdmVyZWQgPSAwO1xuICAgICAgICBmb3IgKGxldCByb3V0ZSBvZiByb3V0ZXMpIHtcbiAgICAgICAgICAgIGlmIChyb3V0ZVswXSA+IGNvdmVyZWQpIGJyZWFrO1xuICAgICAgICAgICAgY292ZXJlZCA9IE1hdGgubWF4KGNvdmVyZWQsIHJvdXRlWzFdKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY292ZXJlZCA8IDEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlcyB3aXRoIG92ZXJsYXBwaW5nIHZhbGlkIHdpbmRvd3MgbXVzdCBjb3ZlciB0aGUgZnVsbCByb3V0ZSBzcGFjZSBbMCwgMSk7IGNvdmVyYWdlIHN0b3BzIGF0ICR7Y292ZXJlZH0uIFNvdXJjZXM6ICR7SlNPTi5zdHJpbmdpZnkoZ3JvdXAubWFwKHggPT4gKHsgdXJsOiB4LnVybCwgdmFsaWRXaW5kb3c6IHgudmFsaWRXaW5kb3csIHJvdXRlOiB4LnJvdXRlIHx8IEZVTExfUk9VVEUgfSkpKX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGxldCBzb3VyY2Ugb2Ygc29ydGVkKSB7XG4gICAgICAgIGlmIChncm91cC5sZW5ndGggJiYgc291cmNlLnZhbGlkV2luZG93WzBdID49IGdyb3VwRW5kKSB7XG4gICAgICAgICAgICBjaGVja0dyb3VwKCk7XG4gICAgICAgICAgICBncm91cCA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGdyb3VwLnB1c2goc291cmNlKTtcbiAgICAgICAgZ3JvdXBFbmQgPSBNYXRoLm1heChncm91cEVuZCwgc291cmNlLnZhbGlkV2luZG93WzFdKTtcbiAgICB9XG4gICAgY2hlY2tHcm91cCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJvdXRpbmdEYXRhKGRhdGE6IEJ1ZmZlcik6IFJlbW90ZUNvbmZpZyB7XG4gICAgbGV0IHRleHQgPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgbGV0IHBhcnNlZDogUmVtb3RlQ29uZmlnO1xuICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UodGV4dCkgYXMgUmVtb3RlQ29uZmlnO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0aW5nIGNvbmZpZyBpcyBub3QgdmFsaWQgSlNPTiAoJHtTdHJpbmcoZSl9KS4gRGF0YTogJHt0ZXh0LnNsaWNlKDAsIDUwMCl9YCk7XG4gICAgfVxuICAgIGlmICghcGFyc2VkIHx8IHR5cGVvZiBwYXJzZWQgIT09IFwib2JqZWN0XCIgfHwgIUFycmF5LmlzQXJyYXkocGFyc2VkLnNvdXJjZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUm91dGluZyBjb25maWcgbXVzdCBiZSB7IHZlcnNpb24/LCBzb3VyY2VzOiBbLi4uXSB9LCB3YXMgJHt0ZXh0LnNsaWNlKDAsIDUwMCl9YCk7XG4gICAgfVxuICAgIHJldHVybiBub3JtYWxpemVSZW1vdGVDb25maWcocGFyc2VkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZVJlbW90ZUNvbmZpZyhjb25maWc6IFJlbW90ZUNvbmZpZyk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KGNvbmZpZywgdW5kZWZpbmVkLCA0KSk7XG59XG4iXX0=
|
|
206
|
-
/* _JS_SOURCE_HASH = "
|
|
211
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVtb3RlQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBRTFCLG1EQUFrRTtBQUNsRSxtREFBd0Q7QUFDeEQsNENBQTRJO0FBRTVJLDBGQUEwRjtBQUMxRiwrRkFBK0Y7QUFDL0YsNkZBQTZGO0FBQzdGLHNCQUFzQjtBQUVULFFBQUEsWUFBWSxHQUFHLDZCQUE2QixDQUFDO0FBQzFELE1BQU0sY0FBYyxHQUFHLEdBQUcsR0FBRyxvQkFBWSxDQUFDO0FBRTFDLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBRTNDLG9MQUFvTDtBQUNwTCxTQUFnQixrQkFBa0IsQ0FBQyxHQUFXO0lBQzFDLElBQUksS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsMEJBQWMsQ0FBQyxDQUFDO0lBQ3hDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ25DLElBQUksS0FBSyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRywwQkFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDL0UsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM3QixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JCLENBQUM7QUFORCxnREFNQztBQUVELHdHQUF3RztBQUN4RyxTQUFnQixRQUFRLENBQUMsR0FBVztJQUNoQyxJQUFJLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QyxJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDNUMsSUFBSSxJQUFJLEdBQUcsSUFBQSxtQkFBWSxFQUFDLElBQUEsdUJBQWdC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QUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBN0NELHNEQTZDQztBQUVELFNBQWdCLGdCQUFnQixDQUFDLElBQVk7SUFDekMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLElBQUksTUFBb0IsQ0FBQztJQUN6QixJQUFJLENBQUM7UUFDRCxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQWlCLENBQUM7SUFDOUMsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFDRCxJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDMUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0REFBNEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RHLENBQUM7SUFDRCxPQUFPLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFaRCw0Q0FZQztBQUVELFNBQWdCLHFCQUFxQixDQUFDLE1BQW9CO0lBQ3RELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRkQsc0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuYWxsb3djbGllbnQgPSB0cnVlO1xuXG5pbXBvcnQgeyBzb3J0LCBzaGEyNTZIYXNoQnVmZmVyIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZ2V0QnVmZmVySW50IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYml0c1wiO1xuaW1wb3J0IHsgUmVtb3RlQ29uZmlnLCBSZW1vdGVDb25maWdCYXNlLCBIb3N0ZWRDb25maWcsIEJhY2tibGF6ZUNvbmZpZywgRlVMTF9WQUxJRF9XSU5ET1csIEZVTExfUk9VVEUsIFZBUklBQkxFX1NIQVJEIH0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuXG4vLyBQYXJzaW5nIC8gbm9ybWFsaXphdGlvbiBvZiBSZW1vdGVDb25maWcgKHNlZSBJQXJjaGl2ZXMudHMpLiBFdmVyeSBidWNrZXQgc3RvcmVzIGl0cyBvd25cbi8vIGNvbmZpZ3VyYXRpb24gKGEgUmVtb3RlQ29uZmlnKSBpbnNpZGUgaXRzZWxmLCBhdCBST1VUSU5HX0ZJTEUuIFdyaXRpbmcgdGhhdCBmaWxlIGNyZWF0ZXMgdGhlXG4vLyBidWNrZXQgLyByZWNvbmZpZ3VyZXMgaXQgKHNlZSBzdG9yYWdlU2VydmVyU3RhdGUudHMpOyBjbGllbnRzIHJlY29uY2lsZSBpdCBieSB2ZXJzaW9uIChzZWVcbi8vIGNyZWF0ZUFyY2hpdmVzLnRzKS5cblxuZXhwb3J0IGNvbnN0IFJPVVRJTkdfRklMRSA9IFwic3RvcmFnZS9zdG9yYWdlcm91dGluZy5qc29uXCI7XG5jb25zdCBST1VUSU5HX1NVRkZJWCA9IFwiL1wiICsgUk9VVElOR19GSUxFO1xuXG5jb25zdCBST1VURV9QUkVDSVNJT04gPSAxMDAwICogMTAwMCAqIDEwMDA7XG5cbi8qKiBUaGUgdmFyaWFibGUtc2hhcmQgcm91dGUgb3ZlcnJpZGUgZW1iZWRkZWQgaW4gdGhlIGtleSAoXCI8c2VudGluZWw+Xzx2YWx1ZT5cIiwgc2VlIFZBUklBQkxFX1NIQVJEKSwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIGtleSBoYXMgbm8gc2VudGluZWwgb3IgdGhlIHNlbnRpbmVsIGhhcyBubyB2YWx1ZSB5ZXQuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWYXJpYWJsZVJvdXRlKGtleTogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaW5kZXggPSBrZXkuaW5kZXhPZihWQVJJQUJMRV9TSEFSRCk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBsZXQgbWF0Y2ggPSAvXl8oXFxkKyg/OlxcLlxcZCspPykvLmV4ZWMoa2V5LnNsaWNlKGluZGV4ICsgVkFSSUFCTEVfU0hBUkQubGVuZ3RoKSk7XG4gICAgaWYgKCFtYXRjaCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gK21hdGNoWzFdO1xufVxuXG4vKiogV2hlcmUgYSBrZXkgcm91dGVzIGluIFswLCAxKS4gQSBtYXRlcmlhbGl6ZWQgdmFyaWFibGUtc2hhcmQgc3VmZml4IGNvbXBsZXRlbHkgb3ZlcnJpZGVzIHRoZSBoYXNoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJvdXRlKGtleTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBsZXQgb3ZlcnJpZGUgPSBwYXJzZVZhcmlhYmxlUm91dGUoa2V5KTtcbiAgICBpZiAob3ZlcnJpZGUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIG92ZXJyaWRlO1xuICAgIGxldCBoYXNoID0gZ2V0QnVmZmVySW50KHNoYTI1Nkhhc2hCdWZmZXIoa2V5KSk7XG4gICAgcmV0dXJuIGhhc2ggJSBST1VURV9QUkVDSVNJT04gLyBST1VURV9QUkVDSVNJT047XG59XG5cbi8vIFJvdXRlIHJhbmdlcyBhcmUgW3N0YXJ0LCBlbmQpIC0gaW5jbHVzaXZlIHN0YXJ0LCBleGNsdXNpdmUgZW5kXG5leHBvcnQgZnVuY3Rpb24gcm91dGVDb250YWlucyhyb3V0ZTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgdmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICghcm91dGUpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiByb3V0ZVswXSA8PSB2YWx1ZSAmJiB2YWx1ZSA8IHJvdXRlWzFdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJvdXRlc092ZXJsYXAoYTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgYjogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGxldCBbYVN0YXJ0LCBhRW5kXSA9IGEgfHwgRlVMTF9ST1VURTtcbiAgICBsZXQgW2JTdGFydCwgYkVuZF0gPSBiIHx8IEZVTExfUk9VVEU7XG4gICAgcmV0dXJuIGFTdGFydCA8IGJFbmQgJiYgYlN0YXJ0IDwgYUVuZDtcbn1cbi8qKiBUaGUgb3ZlcmxhcCBvZiB0d28gcm91dGUgcmFuZ2VzLCBvciB1bmRlZmluZWQgd2hlbiB0aGV5IGRvbid0IG92ZXJsYXAuICovXG5leHBvcnQgZnVuY3Rpb24gcm91dGVJbnRlcnNlY3Rpb24oYTogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgYjogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCk6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQge1xuICAgIGxldCBbYVN0YXJ0LCBhRW5kXSA9IGEgfHwgRlVMTF9ST1VURTtcbiAgICBsZXQgW2JTdGFydCwgYkVuZF0gPSBiIHx8IEZVTExfUk9VVEU7XG4gICAgbGV0IHN0YXJ0ID0gTWF0aC5tYXgoYVN0YXJ0LCBiU3RhcnQpO1xuICAgIGxldCBlbmQgPSBNYXRoLm1pbihhRW5kLCBiRW5kKTtcbiAgICBpZiAoc3RhcnQgPj0gZW5kKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBbc3RhcnQsIGVuZF07XG59XG5cbi8vIEEgbWlzc2luZyB2ZXJzaW9uIGNvdW50cyBhcyAtMSwgc28gYW55IGV4cGxpY2l0bHkgdmVyc2lvbmVkIGNvbmZpZyBiZWF0cyBhbiB1bnZlcnNpb25lZCBvbmVcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWdWZXJzaW9uKGNvbmZpZzogUmVtb3RlQ29uZmlnKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY29uZmlnLnZlcnNpb24gPz8gLTE7XG59XG5cbi8qKiBTdHJpcHMgdGhlIHJvdXRpbmctZmlsZSBzdWZmaXgsIGxlYXZpbmcgdGhlIGJ1Y2tldCdzIHB1YmxpYyBiYXNlIFVSTCAoZmlsZSBwYXRocyBhcHBlbmQgdG8gaXQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1Y2tldEJhc2VVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdXJsLmVuZHNXaXRoKFJPVVRJTkdfU1VGRklYKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgYnVja2V0IHJvdXRpbmcgVVJMIGVuZGluZyB3aXRoICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19TVUZGSVgpfSwgd2FzICR7SlNPTi5zdHJpbmdpZnkodXJsKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHVybC5zbGljZSgwLCAtUk9VVElOR19TVUZGSVgubGVuZ3RoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmlsZVVybChiYXNlVXJsOiBzdHJpbmcsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBiYXNlVXJsICsgXCIvXCIgKyBmaWxlUGF0aC5zcGxpdChcIi9cIikubWFwKGVuY29kZVVSSUNvbXBvbmVudCkuam9pbihcIi9cIik7XG59XG5cbi8vIEV4OiBodHRwczovL3N0b3JhZ2UyLnZpZGdyaWR3ZWIuY29tOjQ0NDUvZmlsZS9leGFtcGxlYWNjb3VudC9leGFtcGxlYnVja2V0L3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSG9zdGVkVXJsKHVybDogc3RyaW5nKTogeyBhZGRyZXNzOiBzdHJpbmc7IHBvcnQ6IG51bWJlcjsgYWNjb3VudDogc3RyaW5nOyBidWNrZXROYW1lOiBzdHJpbmcgfSB7XG4gICAgbGV0IGJhc2UgPSBnZXRCdWNrZXRCYXNlVXJsKHVybCk7XG4gICAgbGV0IHUgPSBuZXcgVVJMKGJhc2UpO1xuICAgIGlmICh1LnByb3RvY29sICE9PSBcImh0dHBzOlwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RvcmFnZSBVUkwgbXVzdCB1c2UgaHR0cHMsIGdvdCAke0pTT04uc3RyaW5naWZ5KHUucHJvdG9jb2wpfSBpbiAke0pTT04uc3RyaW5naWZ5KHVybCl9YCk7XG4gICAgfVxuICAgIGxldCBwYXJ0cyA9IHUucGF0aG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcih4ID0+IHgpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMgfHwgcGFydHNbMF0gIT09IFwiZmlsZVwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYSBob3N0ZWQgYnVja2V0IFVSTCBsaWtlIGh0dHBzOi8vaG9zdDpwb3J0L2ZpbGUvPGFjY291bnQ+LzxidWNrZXROYW1lPiR7Uk9VVElOR19TVUZGSVh9LCB3YXMgJHtKU09OLnN0cmluZ2lmeSh1cmwpfWApO1xuICAgIH1cbiAgICByZXR1cm4geyBhZGRyZXNzOiB1Lmhvc3RuYW1lLCBwb3J0OiArdS5wb3J0IHx8IDQ0MywgYWNjb3VudDogZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzFdKSwgYnVja2V0TmFtZTogZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRzWzJdKSB9O1xufVxuXG4vLyBFeDogaHR0cHM6Ly9mMDAyLmJhY2tibGF6ZWIyLmNvbS9maWxlL3F1ZXJ5c3VidGVzdC1jb20tcHVibGljLWltbXV0YWJsZS9zdG9yYWdlL3N0b3JhZ2Vyb3V0aW5nLmpzb25cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUJhY2tibGF6ZVVybCh1cmw6IHN0cmluZyk6IHsgYnVja2V0TmFtZTogc3RyaW5nIH0ge1xuICAgIGxldCBiYXNlID0gZ2V0QnVja2V0QmFzZVVybCh1cmwpO1xuICAgIGxldCB1ID0gbmV3IFVSTChiYXNlKTtcbiAgICBsZXQgcGFydHMgPSB1LnBhdGhuYW1lLnNwbGl0KFwiL1wiKS5maWx0ZXIoeCA9PiB4KTtcbiAgICBpZiAocGFydHMubGVuZ3RoICE9PSAyIHx8IHBhcnRzWzBdICE9PSBcImZpbGVcIikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgYmFja2JsYXplIGJ1Y2tldCBVUkwgbGlrZSBodHRwczovL2YwMDIuYmFja2JsYXplYjIuY29tL2ZpbGUvPGJ1Y2tldE5hbWU+JHtST1VUSU5HX1NVRkZJWH0sIHdhcyAke0pTT04uc3RyaW5naWZ5KHVybCl9YCk7XG4gICAgfVxuICAgIHJldHVybiB7IGJ1Y2tldE5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0c1sxXSkgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VIb3N0ZWRVcmxQb3J0KHVybDogc3RyaW5nLCBwb3J0OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGxldCB1ID0gbmV3IFVSTCh1cmwpO1xuICAgIHUucG9ydCA9IFN0cmluZyhwb3J0KTtcbiAgICByZXR1cm4gdS50b1N0cmluZygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU291cmNlKHNvdXJjZTogUmVtb3RlQ29uZmlnQmFzZSk6IEhvc3RlZENvbmZpZyB8IEJhY2tibGF6ZUNvbmZpZyB7XG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgbGV0IHdpbmRvdyA9IHNvdXJjZS52YWxpZFdpbmRvdztcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHdpbmRvdykgfHwgd2luZG93Lmxlbmd0aCAhPT0gMiB8fCAhd2luZG93LmV2ZXJ5KHggPT4gdHlwZW9mIHggPT09IFwibnVtYmVyXCIpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE9iamVjdCBzb3VyY2UgY29uZmlncyBtdXN0IHNwZWNpZnkgdmFsaWRXaW5kb3cgKFtzdGFydE1zLCBlbmRNc10gb2YgdGhlIHdyaXRlIHRpbWVzIHRoZSBzb3VyY2UgaXMgdmFsaWQgZm9yKSAtIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBtdXN0IGJlIHNjaGVkdWxlZCwgbm90IGZsaXBwZWQgaW5zdGFudGx5LiBVc2UgRlVMTF9WQUxJRF9XSU5ET1cgd2hlbiB0aGUgc291cmNlIGlzIGFsd2F5cyB2YWxpZC4gV2FzICR7SlNPTi5zdHJpbmdpZnkod2luZG93KX0gb24gJHtKU09OLnN0cmluZ2lmeShzb3VyY2UpLnNsaWNlKDAsIDUwMCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJvdXRlID0gc291cmNlLnJvdXRlO1xuICAgICAgICBpZiAocm91dGUgIT09IHVuZGVmaW5lZCAmJiAoIUFycmF5LmlzQXJyYXkocm91dGUpIHx8IHJvdXRlLmxlbmd0aCAhPT0gMiB8fCAhcm91dGUuZXZlcnkoeCA9PiB0eXBlb2YgeCA9PT0gXCJudW1iZXJcIikgfHwgcm91dGVbMF0gPCAwIHx8IHJvdXRlWzFdID4gMSB8fCByb3V0ZVswXSA+PSByb3V0ZVsxXSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlIHJvdXRlIG11c3QgYmUgYSBbc3RhcnQsIGVuZCkgZnJhY3Rpb24gcmFuZ2Ugd2l0aGluIFswLCAxXSB3aXRoIHN0YXJ0IDwgZW5kLCB3YXMgJHtKU09OLnN0cmluZ2lmeShyb3V0ZSl9IG9uICR7SlNPTi5zdHJpbmdpZnkoc291cmNlKS5zbGljZSgwLCA1MDApfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2UucmVhZGVyRGlza0xpbWl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlLnJlYWRlckRpc2tMaW1pdCAhPT0gXCJudW1iZXJcIiB8fCBzb3VyY2UucmVhZGVyRGlza0xpbWl0IDw9IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHJlYWRlckRpc2tMaW1pdCBtdXN0IGJlIGEgcG9zaXRpdmUgYnl0ZSBjb3VudCwgd2FzICR7SlNPTi5zdHJpbmdpZnkoc291cmNlLnJlYWRlckRpc2tMaW1pdCl9IG9uICR7SlNPTi5zdHJpbmdpZnkoc291cmNlKS5zbGljZSgwLCA1MDApfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzb3VyY2Uubm9GdWxsU3luYykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcmVhZGVyRGlza0xpbWl0IHJlcXVpcmVzIG5vRnVsbFN5bmM6IGEgZnVsbCBjb3B5IGNhbm5vdCBiZSBib3VuZGVkLCBvbmx5IGEgcmVhZCBjYWNoZSBjYW4uIE9uICR7SlNPTi5zdHJpbmdpZnkoc291cmNlKS5zbGljZSgwLCA1MDApfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2UudHlwZSA9PT0gXCJyZW1vdGVcIikge1xuICAgICAgICAgICAgLy8gVGhyb3dzIGlmIHRoZSBVUkwgaXMgbWFsZm9ybWVkLCBzbyBiYWQgY29uZmlncyBhcmUgcmVqZWN0ZWQgYmVmb3JlIHRoZXkncmUgc3RvcmVkXG4gICAgICAgICAgICBwYXJzZUhvc3RlZFVybChzb3VyY2UudXJsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgIH1cbiAgICBsZXQgaG9zdG5hbWUgPSBuZXcgVVJMKHNvdXJjZSkuaG9zdG5hbWU7XG4gICAgaWYgKGhvc3RuYW1lLmVuZHNXaXRoKFwiLmJhY2tibGF6ZWIyLmNvbVwiKSkge1xuICAgICAgICAvLyBWYWxpZGF0ZXMgdGhlIFVSTCAodGhyb3dzIG9uIG1hbGZvcm1lZCkgYmVmb3JlIGl0J3Mgc3RvcmVkOyB0aGUgYnVja2V0IG5hbWUgaXMgcmVhZCBiYWNrXG4gICAgICAgIC8vIG91dCBvZiB0aGUgVVJMIGF0IHVzZSBzaXRlcywgbmV2ZXIgc3RvcmVkIG9uIHRoZSBjb25maWcuXG4gICAgICAgIHBhcnNlQmFja2JsYXplVXJsKHNvdXJjZSk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFwiYmFja2JsYXplXCIsIHVybDogc291cmNlLCB2YWxpZFdpbmRvdzogRlVMTF9WQUxJRF9XSU5ET1cgfTtcbiAgICB9XG4gICAgcGFyc2VIb3N0ZWRVcmwoc291cmNlKTtcbiAgICByZXR1cm4geyB0eXBlOiBcInJlbW90ZVwiLCB1cmw6IHNvdXJjZSwgdmFsaWRXaW5kb3c6IEZVTExfVkFMSURfV0lORE9XIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVSZW1vdGVDb25maWcoY29uZmlnOiBSZW1vdGVDb25maWcgfCBSZW1vdGVDb25maWdCYXNlKTogUmVtb3RlQ29uZmlnIHtcbiAgICBsZXQgcmVzdWx0OiBSZW1vdGVDb25maWc7XG4gICAgaWYgKHR5cGVvZiBjb25maWcgIT09IFwic3RyaW5nXCIgJiYgXCJzb3VyY2VzXCIgaW4gY29uZmlnKSB7XG4gICAgICAgIHJlc3VsdCA9IHsgdmVyc2lvbjogY29uZmlnLnZlcnNpb24sIHNvdXJjZXM6IGNvbmZpZy5zb3VyY2VzLm1hcChub3JtYWxpemVTb3VyY2UpIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0ID0geyBzb3VyY2VzOiBbbm9ybWFsaXplU291cmNlKGNvbmZpZyldIH07XG4gICAgfVxuICAgIC8vIE1peGVkIGltbXV0YWJpbGl0eSBtYWtlcyBubyBzZW5zZSBBTU9ORyBzb3VyY2VzIHZhbGlkIGF0IHRoZSBzYW1lIHRpbWU6IGEgbXV0YWJsZSBzb3VyY2VcbiAgICAvLyB3b3VsZCBhY2NlcHQgb3ZlcndyaXRlcyB0aGF0IGl0cyBpbW11dGFibGUgcGVlcnMgcmVmdXNlIHRvIHN5bmNocm9uaXplLCBmb3JraW5nIHRoZWlyXG4gICAgLy8gY29udGVudHMuIFNvdXJjZXMgYXJlIGdyb3VwZWQgYnkgdHJhbnNpdGl2ZWx5IG92ZXJsYXBwaW5nIHZhbGlkIHdpbmRvd3MgKGFic29yYiBldmVyeXRoaW5nXG4gICAgLy8gb3ZlcmxhcHBpbmcgdGhlIGdyb3VwLCBleHRlbmQgdGhlIGdyb3VwJ3MgZW5kLCByZXBlYXQpIC0gYSBzb2Z0IGNoZWNrIHRoYXQgaXMgY29ycmVjdCBhc1xuICAgIC8vIGxvbmcgYXMgd2luZG93cyBoYXZlIGNsZWFuIGJyZWFrcyAoYSBncm91cCBlbmRzIGV4YWN0bHkgd2hlcmUgdGhlIG5leHQgYmVnaW5zKS5cbiAgICBsZXQgc291cmNlcyA9IHJlc3VsdC5zb3VyY2VzLm1hcChub3JtYWxpemVTb3VyY2UpO1xuICAgIGxldCBzb3J0ZWQgPSBbLi4uc291cmNlc107XG4gICAgc29ydChzb3J0ZWQsIHggPT4geC52YWxpZFdpbmRvd1swXSk7XG4gICAgbGV0IGdyb3VwOiB0eXBlb2Ygc291cmNlcyA9IFtdO1xuICAgIGxldCBncm91cEVuZCA9IDA7XG4gICAgZnVuY3Rpb24gY2hlY2tHcm91cCgpIHtcbiAgICAgICAgbGV0IGltbXV0YWJsZUNvdW50ID0gZ3JvdXAuZmlsdGVyKHggPT4geC5pbW11dGFibGUpLmxlbmd0aDtcbiAgICAgICAgaWYgKGltbXV0YWJsZUNvdW50ICYmIGltbXV0YWJsZUNvdW50ICE9PSBncm91cC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlcyB3aXRoIG92ZXJsYXBwaW5nIHZhbGlkIHdpbmRvd3MgbXVzdCBhZ3JlZSBvbiBpbW11dGFiaWxpdHk6ICR7aW1tdXRhYmxlQ291bnR9IG9mICR7Z3JvdXAubGVuZ3RofSBhcmUgaW1tdXRhYmxlLiBTb3VyY2VzOiAke0pTT04uc3RyaW5naWZ5KGdyb3VwLm1hcCh4ID0+ICh7IHVybDogeC51cmwsIHZhbGlkV2luZG93OiB4LnZhbGlkV2luZG93LCBpbW11dGFibGU6ICEheC5pbW11dGFibGUgfSkpKX1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgc291cmNlcyB2YWxpZCBhdCBhbnkgaW5zdGFudCBtdXN0IGNvdmVyIHRoZSB3aG9sZSBrZXkgc3BhY2UsIG9yIGtleXMgcm91dGluZyBpbnRvIGFcbiAgICAgICAgLy8gZ2FwIGNvdWxkIG5ldmVyIGJlIHJlYWRcbiAgICAgICAgbGV0IHJvdXRlcyA9IGdyb3VwLm1hcCh4ID0+IHgucm91dGUgfHwgRlVMTF9ST1VURSk7XG4gICAgICAgIHNvcnQocm91dGVzLCB4ID0+IHhbMF0pO1xuICAgICAgICBsZXQgY292ZXJlZCA9IDA7XG4gICAgICAgIGZvciAobGV0IHJvdXRlIG9mIHJvdXRlcykge1xuICAgICAgICAgICAgaWYgKHJvdXRlWzBdID4gY292ZXJlZCkgYnJlYWs7XG4gICAgICAgICAgICBjb3ZlcmVkID0gTWF0aC5tYXgoY292ZXJlZCwgcm91dGVbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3ZlcmVkIDwgMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTb3VyY2VzIHdpdGggb3ZlcmxhcHBpbmcgdmFsaWQgd2luZG93cyBtdXN0IGNvdmVyIHRoZSBmdWxsIHJvdXRlIHNwYWNlIFswLCAxKTsgY292ZXJhZ2Ugc3RvcHMgYXQgJHtjb3ZlcmVkfS4gU291cmNlczogJHtKU09OLnN0cmluZ2lmeShncm91cC5tYXAoeCA9PiAoeyB1cmw6IHgudXJsLCB2YWxpZFdpbmRvdzogeC52YWxpZFdpbmRvdywgcm91dGU6IHgucm91dGUgfHwgRlVMTF9ST1VURSB9KSkpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAobGV0IHNvdXJjZSBvZiBzb3J0ZWQpIHtcbiAgICAgICAgaWYgKGdyb3VwLmxlbmd0aCAmJiBzb3VyY2UudmFsaWRXaW5kb3dbMF0gPj0gZ3JvdXBFbmQpIHtcbiAgICAgICAgICAgIGNoZWNrR3JvdXAoKTtcbiAgICAgICAgICAgIGdyb3VwID0gW107XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXAucHVzaChzb3VyY2UpO1xuICAgICAgICBncm91cEVuZCA9IE1hdGgubWF4KGdyb3VwRW5kLCBzb3VyY2UudmFsaWRXaW5kb3dbMV0pO1xuICAgIH1cbiAgICBjaGVja0dyb3VwKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUm91dGluZ0RhdGEoZGF0YTogQnVmZmVyKTogUmVtb3RlQ29uZmlnIHtcbiAgICBsZXQgdGV4dCA9IGRhdGEudG9TdHJpbmcoKTtcbiAgICBsZXQgcGFyc2VkOiBSZW1vdGVDb25maWc7XG4gICAgdHJ5IHtcbiAgICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KSBhcyBSZW1vdGVDb25maWc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvdXRpbmcgY29uZmlnIGlzIG5vdCB2YWxpZCBKU09OICgke1N0cmluZyhlKX0pLiBEYXRhOiAke3RleHQuc2xpY2UoMCwgNTAwKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwYXJzZWQgfHwgdHlwZW9mIHBhcnNlZCAhPT0gXCJvYmplY3RcIiB8fCAhQXJyYXkuaXNBcnJheShwYXJzZWQuc291cmNlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0aW5nIGNvbmZpZyBtdXN0IGJlIHsgdmVyc2lvbj8sIHNvdXJjZXM6IFsuLi5dIH0sIHdhcyAke3RleHQuc2xpY2UoMCwgNTAwKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVJlbW90ZUNvbmZpZyhwYXJzZWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplUmVtb3RlQ29uZmlnKGNvbmZpZzogUmVtb3RlQ29uZmlnKTogQnVmZmVyIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkoY29uZmlnLCB1bmRlZmluZWQsIDQpKTtcbn1cbiJdfQ==
|
|
212
|
+
/* _JS_SOURCE_HASH = "74b88ee67a0e83e047adda50a28b23d34b59b4a31e42c9153d90a6d3f6b03a5a"; */
|