sliftutils 1.8.1 → 1.8.3
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/package.json +1 -1
- package/security/authorizedKeys/daemon/dist/paths.ts.cache +2 -2
- package/security/authorizedKeys/daemon/dist/readSignedRepo.ts.cache +35 -20
- package/security/authorizedKeys/daemon/readSignedRepo.d.ts +28 -4
- package/security/authorizedKeys/daemon/readSignedRepo.ts +38 -13
- package/security/authorizedKeys/dist/authorizedKeys.ts.cache +2 -2
- package/security/authorizedKeys/dist/keysRepo.ts.cache +2 -2
- package/security/authorizedKeys/dist/revokeSource.ts.cache +2 -2
- package/security/authorizedKeys/dist/sources.ts.cache +2 -2
- package/security/helpers/dist/paths.ts.cache +2 -2
- package/security/helpers/dist/remoteSSH.ts.cache +2 -2
- package/security/helpers/dist/spawn.ts.cache +2 -2
- package/security/keys/dist/deriveKey.ts.cache +2 -2
- package/security/keys/dist/sshKeyFile.ts.cache +2 -2
- package/security/machines/dist/addMachine.ts.cache +7 -5
- package/security/machines/dist/machines.ts.cache +18 -6
- package/security/machines/dist/printMachineId.ts.cache +100 -7
- package/security/machines/machines.ts +18 -5
- package/security/machines/printMachineId.ts +36 -1
- package/security/notifications/dist/discord.ts.cache +2 -2
- package/storage/proxydatabase/dist/ivfEmbeddingDatabase.ts.cache +17 -5
- package/storage/proxydatabase/ivfEmbeddingDatabase.ts +16 -3
- package/storage/remoteStorage/createArchives.ts +2 -2
- package/storage/remoteStorage/dist/createArchives.ts.cache +4 -4
|
@@ -1,21 +1,114 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
3
|
const certs_1 = require("../../misc/https/certs");
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
const keysRepo_1 = require("../authorizedKeys/keysRepo");
|
|
5
|
+
const readSignedRepo_1 = require("../authorizedKeys/daemon/readSignedRepo");
|
|
6
|
+
const repoFiles_1 = require("../authorizedKeys/daemon/repoFiles");
|
|
7
|
+
const machines_1 = require("./machines");
|
|
8
|
+
// Who this machine is, and who it believes everyone else is. One command, because working out
|
|
9
|
+
// whether a machine is trusted means holding both halves at once: our own id under each domain,
|
|
10
|
+
// and the ids the signed repo lists with the addresses each is allowed from.
|
|
11
|
+
async function printOwnIds() {
|
|
7
12
|
let domains = (0, certs_1.DEV_listIdentityDomains)();
|
|
8
13
|
if (!domains.length) {
|
|
9
|
-
|
|
14
|
+
console.log(`This machine has no identities yet. One is created the first time it needs one.`);
|
|
15
|
+
return;
|
|
10
16
|
}
|
|
17
|
+
console.log(`This machine:`);
|
|
18
|
+
let ids = [];
|
|
11
19
|
for (let domain of domains) {
|
|
12
20
|
await (0, certs_1.loadIdentityCA)(domain);
|
|
13
|
-
|
|
21
|
+
let machineId = (0, certs_1.getOwnMachineId)(domain);
|
|
22
|
+
ids.push(machineId);
|
|
23
|
+
console.log(` ${domain} ${machineId}`);
|
|
24
|
+
}
|
|
25
|
+
return ids;
|
|
26
|
+
}
|
|
27
|
+
async function printRepo(ownIds) {
|
|
28
|
+
let repo;
|
|
29
|
+
try {
|
|
30
|
+
repo = await (0, keysRepo_1.resolveKeysRepo)();
|
|
31
|
+
}
|
|
32
|
+
catch (e) {
|
|
33
|
+
console.log(`\nNo keys repo to read, so there is nothing to say about who is trusted. ${e}`);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
let { repoPath, sourceURL } = repo;
|
|
37
|
+
console.log(`\nKeys repo ${repoPath}`);
|
|
38
|
+
console.log(` from ${sourceURL}`);
|
|
39
|
+
// Pulled first, or a revocation another machine wrote minutes ago is missing from a picture
|
|
40
|
+
// whose whole purpose is to explain why something is being refused.
|
|
41
|
+
try {
|
|
42
|
+
await (0, repoFiles_1.syncRepoFiles)((0, repoFiles_1.revokeRepo)(sourceURL));
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
console.log(` Could not pull the revocations, showing the ones already here. ${e}`);
|
|
46
|
+
}
|
|
47
|
+
let files;
|
|
48
|
+
try {
|
|
49
|
+
files = (await (0, readSignedRepo_1.readSignedRepo)({ repoPath, sourceURL })).files;
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
console.log(`\nIts signature does not check out, so nothing in it counts. ${e}`);
|
|
53
|
+
return;
|
|
14
54
|
}
|
|
55
|
+
// Only the machine files the signature covers - readSignedRepo has already dropped anything
|
|
56
|
+
// unsigned or frozen, so this is the list this machine would actually accept.
|
|
57
|
+
let machines = [];
|
|
58
|
+
for (let [filePath, contents] of files) {
|
|
59
|
+
if (!filePath.startsWith(`${machines_1.MACHINES_DIR}/`) || !filePath.endsWith(".json")) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
let parsed = JSON.parse(contents.toString("utf8"));
|
|
64
|
+
machines.push({
|
|
65
|
+
machineId: parsed.machineId || filePath.slice(machines_1.MACHINES_DIR.length + 1, -".json".length),
|
|
66
|
+
ips: parsed.ips || [],
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
console.log(` Ignoring unreadable ${filePath}. ${e}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
console.log(`\nTrusted machines (${machines.length}), and the addresses each may talk from:`);
|
|
74
|
+
for (let machine of machines) {
|
|
75
|
+
let us = ownIds.includes(machine.machineId) && " <- this machine" || "";
|
|
76
|
+
console.log(` ${machine.machineId} ${machine.ips.join(", ") || "(no addresses, so it is never accepted)"}${us}`);
|
|
77
|
+
}
|
|
78
|
+
// Frozen machines are already gone from the list above, which is exactly why they have to be
|
|
79
|
+
// named here - otherwise a machine being refused everywhere simply is not mentioned anywhere.
|
|
80
|
+
let revocations = (0, readSignedRepo_1.listRevocations)();
|
|
81
|
+
let frozen = revocations.filter(revocation => !revocation.forgiven);
|
|
82
|
+
console.log(`\nFrozen (${frozen.length}), refused everywhere until unrevoked:`);
|
|
83
|
+
for (let revocation of frozen) {
|
|
84
|
+
let us = ownIds.includes(revocation.identity) && " <- this machine" || "";
|
|
85
|
+
console.log(` ${revocation.identity} used from ${revocation.ip || "an unrecorded address"}`
|
|
86
|
+
+ `${revocation.revokedAt && ` at ${revocation.revokedAt}` || ""}`
|
|
87
|
+
+ `${revocation.revokedBy && `, noticed by ${revocation.revokedBy}` || ""}${us}`);
|
|
88
|
+
console.log(` ${revocation.revocationId}`);
|
|
89
|
+
}
|
|
90
|
+
if (!frozen.length) {
|
|
91
|
+
console.log(` (nothing is frozen)`);
|
|
92
|
+
}
|
|
93
|
+
let forgiven = revocations.filter(revocation => revocation.forgiven);
|
|
94
|
+
if (forgiven.length) {
|
|
95
|
+
console.log(`\nRevoked, then allowed again (${forgiven.length}):`);
|
|
96
|
+
for (let revocation of forgiven) {
|
|
97
|
+
console.log(` ${revocation.identity} from ${revocation.ip || "an unrecorded address"}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
console.log(`\nSigned files (${files.size}):`);
|
|
101
|
+
for (let filePath of [...files.keys()].sort()) {
|
|
102
|
+
console.log(` ${filePath}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async function main() {
|
|
106
|
+
let ownIds = await printOwnIds();
|
|
107
|
+
await printRepo(ownIds || []);
|
|
15
108
|
}
|
|
16
109
|
main().catch(e => {
|
|
17
110
|
console.error(`${e}`);
|
|
18
111
|
process.exitCode = 1;
|
|
19
112
|
}).finally(() => process.exit());
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnRNYWNoaW5lSWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwcmludE1hY2hpbmVJZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtEQUFrRztBQUVsRyxnR0FBZ0c7QUFDaEcsNkVBQTZFO0FBQzdFLEtBQUssVUFBVSxJQUFJO0lBQ2YsSUFBSSxPQUFPLEdBQUcsSUFBQSwrQkFBdUIsR0FBRSxDQUFDO0lBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDRCxLQUFLLElBQUksTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBQSxzQkFBYyxFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLElBQUksSUFBQSx1QkFBZSxFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDO0FBQ0wsQ0FBQztBQUVELElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtJQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RCLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERFVl9saXN0SWRlbnRpdHlEb21haW5zLCBnZXRPd25NYWNoaW5lSWQsIGxvYWRJZGVudGl0eUNBIH0gZnJvbSBcIi4uLy4uL21pc2MvaHR0cHMvY2VydHNcIjtcblxuLy8gUHJpbnRzIHRoaXMgbWFjaGluZSdzIGlkIHVuZGVyIGV2ZXJ5IGRvbWFpbiBpdCBoYXMgYW4gaWRlbnRpdHkgZm9yLiBBIG1hY2hpbmUgaGFzIGEgZGlmZmVyZW50XG4vLyBpZGVudGl0eSwgYW5kIHNvIGEgZGlmZmVyZW50IG1hY2hpbmUgaWQsIHVuZGVyIGV2ZXJ5IGRvbWFpbiBpdCBydW5zIHVuZGVyLlxuYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgICBsZXQgZG9tYWlucyA9IERFVl9saXN0SWRlbnRpdHlEb21haW5zKCk7XG4gICAgaWYgKCFkb21haW5zLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoaXMgbWFjaGluZSBoYXMgbm8gaWRlbnRpdGllc2ApO1xuICAgIH1cbiAgICBmb3IgKGxldCBkb21haW4gb2YgZG9tYWlucykge1xuICAgICAgICBhd2FpdCBsb2FkSWRlbnRpdHlDQShkb21haW4pO1xuICAgICAgICBjb25zb2xlLmxvZyhgJHtkb21haW59ICR7Z2V0T3duTWFjaGluZUlkKGRvbWFpbil9YCk7XG4gICAgfVxufVxuXG5tYWluKCkuY2F0Y2goZSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihgJHtlfWApO1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xufSkuZmluYWxseSgoKSA9PiBwcm9jZXNzLmV4aXQoKSk7XG4iXX0//=
|
|
21
|
-
/* _JS_SOURCE_HASH = "
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnRNYWNoaW5lSWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJwcmludE1hY2hpbmVJZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLGtEQUFrRztBQUNsRyx5REFBNkQ7QUFDN0QsNEVBQTBGO0FBQzFGLGtFQUErRTtBQUMvRSx5Q0FBMEM7QUFFMUMsOEZBQThGO0FBQzlGLGdHQUFnRztBQUNoRyw2RUFBNkU7QUFFN0UsS0FBSyxVQUFVLFdBQVc7SUFDdEIsSUFBSSxPQUFPLEdBQUcsSUFBQSwrQkFBdUIsR0FBRSxDQUFDO0lBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpRkFBaUYsQ0FBQyxDQUFDO1FBQy9GLE9BQU87SUFDWCxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM3QixJQUFJLEdBQUcsR0FBYSxFQUFFLENBQUM7SUFDdkIsS0FBSyxJQUFJLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN6QixNQUFNLElBQUEsc0JBQWMsRUFBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixJQUFJLFNBQVMsR0FBRyxJQUFBLHVCQUFlLEVBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sTUFBTSxJQUFJLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQztBQUVELEtBQUssVUFBVSxTQUFTLENBQUMsTUFBZ0I7SUFDckMsSUFBSSxJQUFJLENBQUM7SUFDVCxJQUFJLENBQUM7UUFDRCxJQUFJLEdBQUcsTUFBTSxJQUFBLDBCQUFlLEdBQUUsQ0FBQztJQUNuQyxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNULE9BQU8sQ0FBQyxHQUFHLENB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QUFDLENBQUM7UUFDaEcsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUMvQyxLQUFLLElBQUksUUFBUSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7QUFDTCxDQUFDO0FBRUQsS0FBSyxVQUFVLElBQUk7SUFDZixJQUFJLE1BQU0sR0FBRyxNQUFNLFdBQVcsRUFBRSxDQUFDO0lBQ2pDLE1BQU0sU0FBUyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO0lBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEIsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDekIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgREVWX2xpc3RJZGVudGl0eURvbWFpbnMsIGdldE93bk1hY2hpbmVJZCwgbG9hZElkZW50aXR5Q0EgfSBmcm9tIFwiLi4vLi4vbWlzYy9odHRwcy9jZXJ0c1wiO1xuaW1wb3J0IHsgcmVzb2x2ZUtleXNSZXBvIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2tleXNSZXBvXCI7XG5pbXBvcnQgeyBsaXN0UmV2b2NhdGlvbnMsIHJlYWRTaWduZWRSZXBvIH0gZnJvbSBcIi4uL2F1dGhvcml6ZWRLZXlzL2RhZW1vbi9yZWFkU2lnbmVkUmVwb1wiO1xuaW1wb3J0IHsgcmV2b2tlUmVwbywgc3luY1JlcG9GaWxlcyB9IGZyb20gXCIuLi9hdXRob3JpemVkS2V5cy9kYWVtb24vcmVwb0ZpbGVzXCI7XG5pbXBvcnQgeyBNQUNISU5FU19ESVIgfSBmcm9tIFwiLi9tYWNoaW5lc1wiO1xuXG4vLyBXaG8gdGhpcyBtYWNoaW5lIGlzLCBhbmQgd2hvIGl0IGJlbGlldmVzIGV2ZXJ5b25lIGVsc2UgaXMuIE9uZSBjb21tYW5kLCBiZWNhdXNlIHdvcmtpbmcgb3V0XG4vLyB3aGV0aGVyIGEgbWFjaGluZSBpcyB0cnVzdGVkIG1lYW5zIGhvbGRpbmcgYm90aCBoYWx2ZXMgYXQgb25jZTogb3VyIG93biBpZCB1bmRlciBlYWNoIGRvbWFpbixcbi8vIGFuZCB0aGUgaWRzIHRoZSBzaWduZWQgcmVwbyBsaXN0cyB3aXRoIHRoZSBhZGRyZXNzZXMgZWFjaCBpcyBhbGxvd2VkIGZyb20uXG5cbmFzeW5jIGZ1bmN0aW9uIHByaW50T3duSWRzKCkge1xuICAgIGxldCBkb21haW5zID0gREVWX2xpc3RJZGVudGl0eURvbWFpbnMoKTtcbiAgICBpZiAoIWRvbWFpbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBUaGlzIG1hY2hpbmUgaGFzIG5vIGlkZW50aXRpZXMgeWV0LiBPbmUgaXMgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSBpdCBuZWVkcyBvbmUuYCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5sb2coYFRoaXMgbWFjaGluZTpgKTtcbiAgICBsZXQgaWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGRvbWFpbiBvZiBkb21haW5zKSB7XG4gICAgICAgIGF3YWl0IGxvYWRJZGVudGl0eUNBKGRvbWFpbik7XG4gICAgICAgIGxldCBtYWNoaW5lSWQgPSBnZXRPd25NYWNoaW5lSWQoZG9tYWluKTtcbiAgICAgICAgaWRzLnB1c2gobWFjaGluZUlkKTtcbiAgICAgICAgY29uc29sZS5sb2coYCAgICAke2RvbWFpbn0gJHttYWNoaW5lSWR9YCk7XG4gICAgfVxuICAgIHJldHVybiBpZHM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHByaW50UmVwbyhvd25JZHM6IHN0cmluZ1tdKSB7XG4gICAgbGV0IHJlcG87XG4gICAgdHJ5IHtcbiAgICAgICAgcmVwbyA9IGF3YWl0IHJlc29sdmVLZXlzUmVwbygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFxcbk5vIGtleXMgcmVwbyB0byByZWFkLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIHNheSBhYm91dCB3aG8gaXMgdHJ1c3RlZC4gJHtlfWApO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB7IHJlcG9QYXRoLCBzb3VyY2VVUkwgfSA9IHJlcG87XG4gICAgY29uc29sZS5sb2coYFxcbktleXMgcmVwbyAke3JlcG9QYXRofWApO1xuICAgIGNvbnNvbGUubG9nKGAgICAgZnJvbSAke3NvdXJjZVVSTH1gKTtcblxuICAgIC8vIFB1bGxlZCBmaXJzdCwgb3IgYSByZXZvY2F0aW9uIGFub3RoZXIgbWFjaGluZSB3cm90ZSBtaW51dGVzIGFnbyBpcyBtaXNzaW5nIGZyb20gYSBwaWN0dXJlXG4gICAgLy8gd2hvc2Ugd2hvbGUgcHVycG9zZSBpcyB0byBleHBsYWluIHdoeSBzb21ldGhpbmcgaXMgYmVpbmcgcmVmdXNlZC5cbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBzeW5jUmVwb0ZpbGVzKHJldm9rZVJlcG8oc291cmNlVVJMKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAgIENvdWxkIG5vdCBwdWxsIHRoZSByZXZvY2F0aW9ucywgc2hvd2luZyB0aGUgb25lcyBhbHJlYWR5IGhlcmUuICR7ZX1gKTtcbiAgICB9XG5cbiAgICBsZXQgZmlsZXM7XG4gICAgdHJ5IHtcbiAgICAgICAgZmlsZXMgPSAoYXdhaXQgcmVhZFNpZ25lZFJlcG8oeyByZXBvUGF0aCwgc291cmNlVVJMIH0pKS5maWxlcztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBcXG5JdHMgc2lnbmF0dXJlIGRvZXMgbm90IGNoZWNrIG91dCwgc28gbm90aGluZyBpbiBpdCBjb3VudHMuICR7ZX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9ubHkgdGhlIG1hY2hpbmUgZmlsZXMgdGhlIHNpZ25hdHVyZSBjb3ZlcnMgLSByZWFkU2lnbmVkUmVwbyBoYXMgYWxyZWFkeSBkcm9wcGVkIGFueXRoaW5nXG4gICAgLy8gdW5zaWduZWQgb3IgZnJvemVuLCBzbyB0aGlzIGlzIHRoZSBsaXN0IHRoaXMgbWFjaGluZSB3b3VsZCBhY3R1YWxseSBhY2NlcHQuXG4gICAgbGV0IG1hY2hpbmVzOiB7IG1hY2hpbmVJZDogc3RyaW5nOyBpcHM6IHN0cmluZ1tdIH1bXSA9IFtdO1xuICAgIGZvciAobGV0IFtmaWxlUGF0aCwgY29udGVudHNdIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmICghZmlsZVBhdGguc3RhcnRzV2l0aChgJHtNQUNISU5FU19ESVJ9L2ApIHx8ICFmaWxlUGF0aC5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHBhcnNlZCA9IEpTT04ucGFyc2UoY29udGVudHMudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgICAgICAgICAgIG1hY2hpbmVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG1hY2hpbmVJZDogcGFyc2VkLm1hY2hpbmVJZCB8fCBmaWxlUGF0aC5zbGljZShNQUNISU5FU19ESVIubGVuZ3RoICsgMSwgLVwiLmpzb25cIi5sZW5ndGgpLFxuICAgICAgICAgICAgICAgIGlwczogcGFyc2VkLmlwcyB8fCBbXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgICAgIElnbm9yaW5nIHVucmVhZGFibGUgJHtmaWxlUGF0aH0uICR7ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBcXG5UcnVzdGVkIG1hY2hpbmVzICgke21hY2hpbmVzLmxlbmd0aH0pLCBhbmQgdGhlIGFkZHJlc3NlcyBlYWNoIG1heSB0YWxrIGZyb206YCk7XG4gICAgZm9yIChsZXQgbWFjaGluZSBvZiBtYWNoaW5lcykge1xuICAgICAgICBsZXQgdXMgPSBvd25JZHMuaW5jbHVkZXMobWFjaGluZS5tYWNoaW5lSWQpICYmIFwiICA8LSB0aGlzIG1hY2hpbmVcIiB8fCBcIlwiO1xuICAgICAgICBjb25zb2xlLmxvZyhgICAgICR7bWFjaGluZS5tYWNoaW5lSWR9ICAke21hY2hpbmUuaXBzLmpvaW4oXCIsIFwiKSB8fCBcIihubyBhZGRyZXNzZXMsIHNvIGl0IGlzIG5ldmVyIGFjY2VwdGVkKVwifSR7dXN9YCk7XG4gICAgfVxuXG4gICAgLy8gRnJvemVuIG1hY2hpbmVzIGFyZSBhbHJlYWR5IGdvbmUgZnJvbSB0aGUgbGlzdCBhYm92ZSwgd2hpY2ggaXMgZXhhY3RseSB3aHkgdGhleSBoYXZlIHRvIGJlXG4gICAgLy8gbmFtZWQgaGVyZSAtIG90aGVyd2lzZSBhIG1hY2hpbmUgYmVpbmcgcmVmdXNlZCBldmVyeXdoZXJlIHNpbXBseSBpcyBub3QgbWVudGlvbmVkIGFueXdoZXJlLlxuICAgIGxldCByZXZvY2F0aW9ucyA9IGxpc3RSZXZvY2F0aW9ucygpO1xuICAgIGxldCBmcm96ZW4gPSByZXZvY2F0aW9ucy5maWx0ZXIocmV2b2NhdGlvbiA9PiAhcmV2b2NhdGlvbi5mb3JnaXZlbik7XG4gICAgY29uc29sZS5sb2coYFxcbkZyb3plbiAoJHtmcm96ZW4ubGVuZ3RofSksIHJlZnVzZWQgZXZlcnl3aGVyZSB1bnRpbCB1bnJldm9rZWQ6YCk7XG4gICAgZm9yIChsZXQgcmV2b2NhdGlvbiBvZiBmcm96ZW4pIHtcbiAgICAgICAgbGV0IHVzID0gb3duSWRzLmluY2x1ZGVzKHJldm9jYXRpb24uaWRlbnRpdHkpICYmIFwiICA8LSB0aGlzIG1hY2hpbmVcIiB8fCBcIlwiO1xuICAgICAgICBjb25zb2xlLmxvZyhgICAgICR7cmV2b2NhdGlvbi5pZGVudGl0eX0gIHVzZWQgZnJvbSAke3Jldm9jYXRpb24uaXAgfHwgXCJhbiB1bnJlY29yZGVkIGFkZHJlc3NcIn1gXG4gICAgICAgICAgICArIGAke3Jldm9jYXRpb24ucmV2b2tlZEF0ICYmIGAgYXQgJHtyZXZvY2F0aW9uLnJldm9rZWRBdH1gIHx8IFwiXCJ9YFxuICAgICAgICAgICAgKyBgJHtyZXZvY2F0aW9uLnJldm9rZWRCeSAmJiBgLCBub3RpY2VkIGJ5ICR7cmV2b2NhdGlvbi5yZXZva2VkQnl9YCB8fCBcIlwifSR7dXN9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICAgICAgICR7cmV2b2NhdGlvbi5yZXZvY2F0aW9uSWR9YCk7XG4gICAgfVxuICAgIGlmICghZnJvemVuLmxlbmd0aCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAgIChub3RoaW5nIGlzIGZyb3plbilgKTtcbiAgICB9XG5cbiAgICBsZXQgZm9yZ2l2ZW4gPSByZXZvY2F0aW9ucy5maWx0ZXIocmV2b2NhdGlvbiA9PiByZXZvY2F0aW9uLmZvcmdpdmVuKTtcbiAgICBpZiAoZm9yZ2l2ZW4ubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBcXG5SZXZva2VkLCB0aGVuIGFsbG93ZWQgYWdhaW4gKCR7Zm9yZ2l2ZW4ubGVuZ3RofSk6YCk7XG4gICAgICAgIGZvciAobGV0IHJldm9jYXRpb24gb2YgZm9yZ2l2ZW4pIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGAgICAgJHtyZXZvY2F0aW9uLmlkZW50aXR5fSAgZnJvbSAke3Jldm9jYXRpb24uaXAgfHwgXCJhbiB1bnJlY29yZGVkIGFkZHJlc3NcIn1gKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBcXG5TaWduZWQgZmlsZXMgKCR7ZmlsZXMuc2l6ZX0pOmApO1xuICAgIGZvciAobGV0IGZpbGVQYXRoIG9mIFsuLi5maWxlcy5rZXlzKCldLnNvcnQoKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAgICR7ZmlsZVBhdGh9YCk7XG4gICAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBtYWluKCkge1xuICAgIGxldCBvd25JZHMgPSBhd2FpdCBwcmludE93bklkcygpO1xuICAgIGF3YWl0IHByaW50UmVwbyhvd25JZHMgfHwgW10pO1xufVxuXG5tYWluKCkuY2F0Y2goZSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihgJHtlfWApO1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xufSkuZmluYWxseSgoKSA9PiBwcm9jZXNzLmV4aXQoKSk7XG4iXX0//=
|
|
114
|
+
/* _JS_SOURCE_HASH = "20d477b9dfec3400b0338edeb17c4064d10f3da0725ae6f5953cc9676f703db6"; */
|
|
@@ -6,7 +6,7 @@ import { revokeRepo, syncRepoFiles } from "../authorizedKeys/daemon/repoFiles";
|
|
|
6
6
|
import { newRevocationId } from "../authorizedKeys/daemon/revocation";
|
|
7
7
|
import { runGit, syncRepo } from "../authorizedKeys/daemon/git";
|
|
8
8
|
import { ensureRevokeKey } from "../authorizedKeys/daemon/repoFiles";
|
|
9
|
-
import {
|
|
9
|
+
import { identityFrozenBy, isPairRevoked, isPairUnrevoked, noteRevocation, readSignedRepo } from "../authorizedKeys/daemon/readSignedRepo";
|
|
10
10
|
import { revokeRepoPath, revokeRepoURL } from "../authorizedKeys/revokeSource";
|
|
11
11
|
import { notify } from "../authorizedKeys/daemon/notify";
|
|
12
12
|
import { areDiscordNotificationsConfigured, configureDiscordNotifications, DEFAULT_WEBHOOK_FILE_PATH } from "../notifications/discord";
|
|
@@ -303,13 +303,14 @@ async function recordMachineRevocation(config: {
|
|
|
303
303
|
let repoPath = revokeRepoPath(sourceURL);
|
|
304
304
|
let keyPath = await ensureRevokeKey(sourceURL);
|
|
305
305
|
let revocationId = newRevocationId(machineId);
|
|
306
|
+
let revokedAt = new Date().toISOString();
|
|
306
307
|
let directory = path.join(repoPath, REVOCATIONS_DIR);
|
|
307
308
|
await fs.mkdir(directory, { recursive: true });
|
|
308
309
|
await fs.writeFile(path.join(directory, `${revocationId}.json`), JSON.stringify({
|
|
309
310
|
revocationId,
|
|
310
311
|
machineId,
|
|
311
312
|
ip,
|
|
312
|
-
revokedAt
|
|
313
|
+
revokedAt,
|
|
313
314
|
revokedBy: hostLabel,
|
|
314
315
|
reason: REVOCATION_REASON,
|
|
315
316
|
}, undefined, 4) + "\n");
|
|
@@ -325,7 +326,7 @@ async function recordMachineRevocation(config: {
|
|
|
325
326
|
console.log(`Could not push the revocation of ${machineId} from ${ip}. ${(push.stdout + push.stderr).trim()}`);
|
|
326
327
|
return false;
|
|
327
328
|
}
|
|
328
|
-
noteRevocation(revocationId, machineId, ip);
|
|
329
|
+
noteRevocation(revocationId, { identity: machineId, ip, revokedAt, revokedBy: hostLabel });
|
|
329
330
|
console.log(`Revoked ${machineId} from ${ip}, ${revocationId}`);
|
|
330
331
|
|
|
331
332
|
// Said by whoever wrote the revocation, once, the same as for an ssh key. Machines that only
|
|
@@ -386,8 +387,20 @@ export async function isMachineAccepted(config: {
|
|
|
386
387
|
// machine in it is trusted, and a machine missing from it is either unknown or frozen.
|
|
387
388
|
let machine = (await getTrustedMachines()).find(entry => entry.machineId === machineId);
|
|
388
389
|
if (!machine) {
|
|
389
|
-
|
|
390
|
-
|
|
390
|
+
let frozen = identityFrozenBy(machineId);
|
|
391
|
+
if (frozen) {
|
|
392
|
+
return {
|
|
393
|
+
verdict: {
|
|
394
|
+
accepted: false,
|
|
395
|
+
reason:
|
|
396
|
+
`Machine ${machineId} is frozen: it was used from ${frozen.ip || "an address nothing recorded"}`
|
|
397
|
+
+ `${frozen.revokedAt && `, at ${frozen.revokedAt}` || ""}`
|
|
398
|
+
+ `${frozen.revokedBy && `, noticed by ${frozen.revokedBy}` || ""}`
|
|
399
|
+
+ `, which is not an address it is allowed from (revocation ${frozen.revocationId}).`
|
|
400
|
+
+ ` To give it access again, run in the keys repo: yarn unrevoke git`,
|
|
401
|
+
},
|
|
402
|
+
froze: false,
|
|
403
|
+
};
|
|
391
404
|
}
|
|
392
405
|
return { verdict: { accepted: false, reason: `Machine ${machineId} is not trusted. ${addMachineCommand({ machineId, ip, domain })}` }, froze: false };
|
|
393
406
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { DEV_listIdentityDomains, getOwnMachineId, loadIdentityCA } from "../../misc/https/certs";
|
|
2
2
|
import { resolveKeysRepo } from "../authorizedKeys/keysRepo";
|
|
3
|
-
import { readSignedRepo } from "../authorizedKeys/daemon/readSignedRepo";
|
|
3
|
+
import { listRevocations, readSignedRepo } from "../authorizedKeys/daemon/readSignedRepo";
|
|
4
|
+
import { revokeRepo, syncRepoFiles } from "../authorizedKeys/daemon/repoFiles";
|
|
4
5
|
import { MACHINES_DIR } from "./machines";
|
|
5
6
|
|
|
6
7
|
// Who this machine is, and who it believes everyone else is. One command, because working out
|
|
@@ -36,6 +37,14 @@ async function printRepo(ownIds: string[]) {
|
|
|
36
37
|
console.log(`\nKeys repo ${repoPath}`);
|
|
37
38
|
console.log(` from ${sourceURL}`);
|
|
38
39
|
|
|
40
|
+
// Pulled first, or a revocation another machine wrote minutes ago is missing from a picture
|
|
41
|
+
// whose whole purpose is to explain why something is being refused.
|
|
42
|
+
try {
|
|
43
|
+
await syncRepoFiles(revokeRepo(sourceURL));
|
|
44
|
+
} catch (e) {
|
|
45
|
+
console.log(` Could not pull the revocations, showing the ones already here. ${e}`);
|
|
46
|
+
}
|
|
47
|
+
|
|
39
48
|
let files;
|
|
40
49
|
try {
|
|
41
50
|
files = (await readSignedRepo({ repoPath, sourceURL })).files;
|
|
@@ -68,6 +77,32 @@ async function printRepo(ownIds: string[]) {
|
|
|
68
77
|
console.log(` ${machine.machineId} ${machine.ips.join(", ") || "(no addresses, so it is never accepted)"}${us}`);
|
|
69
78
|
}
|
|
70
79
|
|
|
80
|
+
// Frozen machines are already gone from the list above, which is exactly why they have to be
|
|
81
|
+
// named here - otherwise a machine being refused everywhere simply is not mentioned anywhere.
|
|
82
|
+
let revocations = listRevocations();
|
|
83
|
+
let frozen = revocations.filter(revocation => !revocation.forgiven);
|
|
84
|
+
console.log(`\nFrozen (${frozen.length}), refused everywhere until unrevoked:`);
|
|
85
|
+
for (let revocation of frozen) {
|
|
86
|
+
let us = ownIds.includes(revocation.identity) && " <- this machine" || "";
|
|
87
|
+
console.log(` ${revocation.identity} used from ${revocation.ip || "an unrecorded address"}`
|
|
88
|
+
+ `${revocation.revokedAt && ` at ${revocation.revokedAt}` || ""}`
|
|
89
|
+
+ `${revocation.revokedBy && `, noticed by ${revocation.revokedBy}` || ""}${us}`);
|
|
90
|
+
console.log(` ${revocation.revocationId}`);
|
|
91
|
+
}
|
|
92
|
+
if (frozen.length) {
|
|
93
|
+
console.log(` To give these access again, run in ${repoPath}: yarn unrevoke git`);
|
|
94
|
+
} else {
|
|
95
|
+
console.log(` (nothing is frozen)`);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
let forgiven = revocations.filter(revocation => revocation.forgiven);
|
|
99
|
+
if (forgiven.length) {
|
|
100
|
+
console.log(`\nRevoked, then allowed again (${forgiven.length}):`);
|
|
101
|
+
for (let revocation of forgiven) {
|
|
102
|
+
console.log(` ${revocation.identity} from ${revocation.ip || "an unrecorded address"}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
71
106
|
console.log(`\nSigned files (${files.size}):`);
|
|
72
107
|
for (let filePath of [...files.keys()].sort()) {
|
|
73
108
|
console.log(` ${filePath}`);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
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
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
@@ -203,4 +203,4 @@ function stopDiscordNotifications() {
|
|
|
203
203
|
}
|
|
204
204
|
exports.stopDiscordNotifications = stopDiscordNotifications;
|
|
205
205
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY29yZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImRpc2NvcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMkRBQTZCO0FBRTdCLHNIQUFzSDtBQUN0SCxrR0FBa0c7QUFDbEcsOENBQThDO0FBRWpDLFFBQUEseUJBQXlCLEdBQUcsaUNBQWlDLENBQUM7QUFDM0UsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUM3QyxNQUFNLHNCQUFzQixHQUFHO0lBQzNCLG1DQUFtQztJQUNuQyxzQ0FBc0M7SUFDdEMsMENBQTBDO0NBQzdDLENBQUM7QUFDRixNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQztBQUNuQyxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQztBQUNsQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQUM1QixNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQUNqQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFFekMsSUFBSSxpQkFJUyxDQUFDO0FBRWQsc0ZBQXNGO0FBQ3RGLDRDQUE0QztBQUM1QyxJQUFJLFNBQVMsR0FBcUIsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBRXBEO3NDQUNzQztBQUN0QyxTQUFnQixnQkFBZ0IsQ0FBQyxNQUFnRDtJQUM3RSxJQUFJLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUN0QyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN4RyxJQUFJLFVBQVUsR0FBRyxL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Q29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzL3Byb21pc2VzXCI7XG5cbi8vIFBPUlRFRCBDT0RFOiBzZWN1cml0eS9hdXRob3JpemVkS2V5cy9kYWVtb24vcG9ydHNlY3VyZURhZW1vbi5qcyBlbWJlZHMgYSBoYW5kIHBvcnQgb2YgdGhpcyBmaWxlIGluIHBsYWluIEpTLCBzbyB0aGVcbi8vIGRhZW1vbiBjYW4gcnVuIHdpdGggbm8gZGVwZW5kZW5jaWVzLiBUaGUgdHdvIGFyZSBleHBlY3RlZCB0byBiZWhhdmUgaWRlbnRpY2FsbHkgLSBpZiB5b3UgY2hhbmdlXG4vLyBvbmUsIG1ha2UgdGhlIG1hdGNoaW5nIGNoYW5nZSBpbiB0aGUgb3RoZXIuXG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRIID0gXCIvZXRjL3BvcnRzZWN1cmUvZGlzY29yZC13ZWJob29rXCI7XG5jb25zdCBERUZBVUxUX0NIRUNLX0lOVEVSVkFMID0gNSAqIDYwICogMTAwMDtcbmNvbnN0IFZBTElEX1dFQkhPT0tfUFJFRklYRVMgPSBbXG4gICAgXCJodHRwczovL2Rpc2NvcmQuY29tL2FwaS93ZWJob29rcy9cIixcbiAgICBcImh0dHBzOi8vZGlzY29yZGFwcC5jb20vYXBpL3dlYmhvb2tzL1wiLFxuICAgIFwiaHR0cHM6Ly9jYW5hcnkuZGlzY29yZC5jb20vYXBpL3dlYmhvb2tzL1wiLFxuXTtcbmNvbnN0IERJU0NPUkRfTUVTU0FHRV9MSU1JVCA9IDIwMDA7XG5jb25zdCBNQVhfRVJST1JfQk9EWV9MRU5HVEggPSA1MDA7XG5jb25zdCBNQVhfU0VORF9BVFRFTVBUUyA9IDM7XG5jb25zdCBSRURBQ1RFRF9UT0tFTl9WSVNJQkxFID0gODtcbmNvbnN0IERFRkFVTFRfUkFURV9MSU1JVF9XQUlUID0gMiAqIDEwMDA7XG5cbmxldCBub3RpZmljYXRpb25TdGF0ZToge1xuICAgIGZpbGVQYXRoOiBzdHJpbmc7XG4gICAgd2ViaG9va1VSTDogc3RyaW5nO1xuICAgIGNoZWNrVGltZXI6IE5vZGVKUy5UaW1lb3V0O1xufSB8IHVuZGVmaW5lZDtcblxuLy8gRGlzY29yZCB3ZWJob29rcyBhcmUgcmF0ZSBsaW1pdGVkIChyb3VnaGx5IDUgcmVxdWVzdHMgcGVyIDIgc2Vjb25kcyksIHNvIGV2ZXJ5IHNlbmRcbi8vIGdvZXMgdGhyb3VnaCBvbmUgY2hhaW4gaW5zdGVhZCBvZiByYWNpbmcuXG5sZXQgc2VuZENoYWluOiBQcm9taXNlPHVua25vd24+ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbi8qKiBQdWxscyB0aGUgd2ViaG9vayBVUkwgb3V0IG9mIHdlYmhvb2sgZmlsZSBjb250ZW50cy4gYHNvdXJjZU5hbWVgIG9ubHkgYXBwZWFycyBpbiBlcnJvcnMsIHNvXG4gICAgY2FsbGVycyBjYW4gbmFtZSBhIHJlbW90ZSBwYXRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlV2ViaG9va0ZpbGUoY29uZmlnOiB7IGNvbnRlbnRzOiBzdHJpbmc7IHNvdXJjZU5hbWU6IHN0cmluZyB9KSB7XG4gICAgbGV0IHsgY29udGVudHMsIHNvdXJjZU5hbWUgfSA9IGNvbmZpZztcbiAgICBsZXQgbGluZXMgPSBjb250ZW50cy5zcGxpdChcIlxcblwiKS5tYXAobGluZSA9PiBsaW5lLnRyaW0oKSkuZmlsdGVyKGxpbmUgPT4gbGluZSAmJiAhbGluZS5zdGFydHNXaXRoKFwiI1wiKSk7XG4gICAgbGV0IHdlYmhvb2tVUkwgPSBsaW5lc1swXTtcbiAgICBpZiAoIXdlYmhvb2tVUkwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIERpc2NvcmQgd2ViaG9vayBVUkwgaW4gJHtzb3VyY2VOYW1lfSwgdGhlIGZpbGUgaGFzIG5vIHVzYWJsZSBsaW5lc2ApO1xuICAgIH1cbiAgICBpZiAoIVZBTElEX1dFQkhPT0tfUFJFRklYRVMuc29tZShwcmVmaXggPT4gd2ViaG9va1VSTC5zdGFydHNXaXRoKHByZWZpeCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCBhIERpc2NvcmQgd2ViaG9vayBVUkwgc3RhcnRpbmcgd2l0aCBvbmUgb2YgJHtWQUxJRF9XRUJIT09LX1BSRUZJWEVTLmpvaW4oXCIsIFwiKX0sIGBcbiAgICAgICAgICAgICsgYHdhcyAke3dlYmhvb2tVUkwuc2xpY2UoMCwgTUFYX0VSUk9SX0JPRFlfTEVOR1RIKX0gKGluICR7c291cmNlTmFtZX0pYFxuICAgICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gd2ViaG9va1VSTDtcbn1cblxuLyoqIEtlZXBzIHRoZSBpZCBhbmQgYm90aCBlbmRzIG9mIHRoZSB0b2tlbiwgc28gYSByZWFkZXIgY2FuIGNvbmZpcm0gd2hpY2ggd2ViaG9vayByZXBsYWNlZCB0aGVpcnNcbiAgICB3aXRob3V0IHJlY2VpdmluZyBvbmUgdGhleSBjb3VsZCBwb3N0IHRvLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZGFjdFdlYmhvb2tVUkwod2ViaG9va1VSTDogc3RyaW5nKSB7XG4gICAgbGV0IHNlcGFyYXRvckluZGV4ID0gd2ViaG9va1VSTC5sYXN0SW5kZXhPZihcIi9cIik7XG4gICAgbGV0IGJhc2UgPSB3ZWJob29rVVJMLnNsaWNlKDAsIHNlcGFyYXRvckluZGV4ICsgMSk7XG4gICAgbGV0IHRva2VuID0gd2ViaG9va1VSTC5zbGljZShzZXBhcmF0b3JJbmRleCArIDEpO1xuICAgIGlmICh0b2tlbi5sZW5ndGggPD0gUkVEQUNURURfVE9LRU5fVklTSUJMRSAqIDIpIHtcbiAgICAgICAgLy8gVG9vIHNob3J0IHRvIHNob3cgYm90aCBlbmRzIHdpdGhvdXQgZ2l2aW5nIGF3YXkgdGhlIHdob2xlIHRva2VuLlxuICAgICAgICByZXR1cm4gYCR7YmFzZX0ke3Rva2VuLnNsaWNlKDAsIFJFREFDVEVEX1RPS0VOX1ZJU0lCTEUpfS4uLmA7XG4gICAgfVxuICAgIHJldHVybiBgJHtiYXNlfSR7dG9rZW4uc2xpY2UoMCwgUkVEQUNURURfVE9LRU5fVklTSUJMRSl9Li4uJHt0b2tlbi5zbGljZSgtUkVEQUNURURfVE9LRU5fVklTSUJMRSl9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFdlYmhvb2tGaWxlKHdlYmhvb2tVUkw6IHN0cmluZykge1xuICAgIHJldHVybiBgIyBwb3J0c2VjdXJlIERpc2NvcmQgd2ViaG9vay4gRmlyc3Qgbm9uLWNvbW1lbnQgbGluZSBpcyB1c2VkLlxcbiR7d2ViaG9va1VSTH1cXG5gO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkV2ViaG9va0ZpbGUoZmlsZVBhdGg6IHN0cmluZykge1xuICAgIGxldCBjb250ZW50cztcbiAgICB0cnkge1xuICAgICAgICBjb250ZW50cyA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCBcInV0ZjhcIik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgcmVhZGFibGUgRGlzY29yZCB3ZWJob29rIGZpbGUgYXQgJHtmaWxlUGF0aH0sICR7ZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlV2ViaG9va0ZpbGUoeyBjb250ZW50cywgc291cmNlTmFtZTogZmlsZVBhdGggfSk7XG59XG5cbi8qKiBXaGVuIHRoZSBtZXNzYWdlIHdhcyBzZW50LCBpbiB0aGUgc2VuZGluZyBtYWNoaW5lJ3Mgb3duIHRpbWUgem9uZS4gRGlzY29yZCBzaG93cyB3aGVuIGl0XG4gICAgcmVjZWl2ZWQgc29tZXRoaW5nLCB3aGljaCBpcyBub3QgdGhlIHNhbWUgdGhpbmcgd2hlbiBhIG1hY2hpbmUgaGFzIGJlZW4gb2ZmbGluZSBvciBhIHNlbmQgaGFzXG4gICAgYmVlbiByZXRyaWVkLCBhbmQgdGhlIHpvbmUgbWF0dGVycyB3aGVuIHRoZSBtYWNoaW5lcyBhcmUgbm90IGFsbCBpbiBvbmUgcGxhY2UuICovXG5leHBvcnQgZnVuY3Rpb24gbWVzc2FnZVRpbWVzdGFtcChub3c6IERhdGUpIHtcbiAgICBsZXQgZGF0ZSA9IG5vdy50b0xvY2FsZURhdGVTdHJpbmcoXCJlbi1DQVwiKTtcbiAgICBsZXQgdGltZSA9IG5vdy50b0xvY2FsZVRpbWVTdHJpbmcoXCJlbi1VU1wiLCB7XG4gICAgICAgIGhvdXI6IFwiMi1kaWdpdFwiLFxuICAgICAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgICAgICBzZWNvbmQ6IFwiMi1kaWdpdFwiLFxuICAgICAgICBob3VyMTI6IHRydWUsXG4gICAgICAgIHRpbWVab25lTmFtZTogXCJzaG9ydFwiLFxuICAgIH0pO1xuICAgIHJldHVybiBgJHtkYXRlfSAke3RpbWV9YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcG9zdFRvV2ViaG9vayh3ZWJob29rVVJMOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZykge1xuICAgIC8vIFN0YW1wZWQgb25jZSByYXRoZXIgdGhhbiBwZXIgYXR0ZW1wdCwgc28gYSByZXRyeSBzYXlzIHdoZW4gdGhlIHRoaW5nIGhhcHBlbmVkIHJhdGhlciB0aGFuXG4gICAgLy8gd2hlbiB3ZSBsYXN0IG1hbmFnZWQgdG8gZ2V0IGl0IG91dC4gQXQgdGhlIGVuZCwgYmVjYXVzZSB0aGUgZmlyc3QgbGluZSBvZiBhIG1lc3NhZ2UgaXMgdGhlXG4gICAgLy8gbm90aWZpY2F0aW9uIHByZXZpZXcgYW5kIGEgdGltZXN0YW1wIHRoZXJlIHdvdWxkIHNwZW5kIGl0IHNheWluZyBub3RoaW5nLlxuICAgIGxldCBjb250ZW50ID0gYCR7bWVzc2FnZX0gwrcgXFxgJHttZXNzYWdlVGltZXN0YW1wKG5ldyBEYXRlKCkpfVxcYGA7XG4gICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gRElTQ09SRF9NRVNTQUdFX0xJTUlUKSB7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDAsIERJU0NPUkRfTUVTU0FHRV9MSU1JVCAtIDMpICsgXCIuLi5cIjtcbiAgICB9XG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gTUFYX1NFTkRfQVRURU1QVFM7IGF0dGVtcHQrKykge1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh3ZWJob29rVVJMLCB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb250ZW50IH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGJvZHkgPSAoYXdhaXQgcmVzcG9uc2UudGV4dCgpKS5zbGljZSgwLCBNQVhfRVJST1JfQk9EWV9MRU5HVEgpO1xuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MjkgJiYgYXR0ZW1wdCA8IE1BWF9TRU5EX0FUVEVNUFRTKSB7XG4gICAgICAgICAgICBsZXQgcmV0cnlBZnRlciA9IE51bWJlcihyZXNwb25zZS5oZWFkZXJzLmdldChcInJldHJ5LWFmdGVyXCIpKTtcbiAgICAgICAgICAgIGxldCB3YWl0VGltZSA9IHJldHJ5QWZ0ZXIgJiYgcmV0cnlBZnRlciAqIDEwMDAgfHwgREVGQVVMVF9SQVRFX0xJTUlUX1dBSVQ7XG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgd2FpdFRpbWUpKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCBhIDJ4eCByZXNwb25zZSBmcm9tIHRoZSBEaXNjb3JkIHdlYmhvb2ssIHdhcyAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fSwgYm9keSAke2JvZHl9YFxuICAgICAgICApO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcXVldWVTZW5kKHdlYmhvb2tVUkw6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgbGV0IHNlbmQgPSAoKSA9PiBwb3N0VG9XZWJob29rKHdlYmhvb2tVUkwsIG1lc3NhZ2UpO1xuICAgIGxldCByZXN1bHQgPSBzZW5kQ2hhaW4udGhlbihzZW5kLCBzZW5kKTtcbiAgICBzZW5kQ2hhaW4gPSByZXN1bHQuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogU2VuZHMgdG8gYW4gZXhwbGljaXQgd2ViaG9vayBVUkwsIGZvciB0b29saW5nIHRoYXQgYWN0cyBvbiBhIHdlYmhvb2sgYmVmb3JlIChvciBpbnN0ZWFkIG9mKVxuICAgIGNvbmZpZ3VyZURpc2NvcmROb3RpZmljYXRpb25zIC0gc2V0dXAsIG1pZ3JhdGlvbnMsIGNvbm5lY3Rpdml0eSBjaGVja3MuICovXG5leHBvcnQgZnVuY3Rpb24gc2VuZFRvV2ViaG9va1VSTChjb25maWc6IHsgd2ViaG9va1VSTDogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfSkge1xuICAgIHJldHVybiBxdWV1ZVNlbmQoY29uZmlnLndlYmhvb2tVUkwsIGNvbmZpZy5tZXNzYWdlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2hlY2tXZWJob29rRmlsZUNoYW5nZWQoKSB7XG4gICAgbGV0IHN0YXRlID0gbm90aWZpY2F0aW9uU3RhdGU7XG4gICAgaWYgKCFzdGF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBuZXdXZWJob29rVVJMO1xuICAgIHRyeSB7XG4gICAgICAgIG5ld1dlYmhvb2tVUkwgPSBhd2FpdCByZWFkV2ViaG9va0ZpbGUoc3RhdGUuZmlsZVBhdGgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgcG9ydHNlY3VyZTogRGlzY29yZCB3ZWJob29rIGZpbGUgaXMgbm8gbG9uZ2VyIHJlYWRhYmxlLCBzdGlsbCB1c2luZyB0aGUgbG9hZGVkIHdlYmhvb2suICR7ZX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmV3V2ViaG9va1VSTCA9PT0gc3RhdGUud2ViaG9va1VSTCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFdhcm4gdGhlIG9sZCBjaGFubmVsIGZpcnN0LCB3aXRoIHRoZSBuZXcgd2ViaG9vayByZWRhY3RlZCwgc28gYSBzdG9sZW4gb2xkIHdlYmhvb2sgZG9lcyBub3RcbiAgICAvLyBoYW5kIHRoZSBhdHRhY2tlciBhIHVzYWJsZSBuZXcgb25lLlxuICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHF1ZXVlU2VuZChcbiAgICAgICAgICAgIHN0YXRlLndlYmhvb2tVUkwsXG4gICAgICAgICAgICBgKipwb3J0c2VjdXJlKio6ICoqTk9USUZJQ0FUSU9OUyBBUkUgTU9WSU5HIFRPIEFOT1RIRVIgQ0hBTk5FTCoqYFxuICAgICAgICAgICAgKyBgXFxuXFxuVGhpcyBjaGFubmVsIHN0b3BzIHJlY2VpdmluZyB0aGVtIG5vdy4gSWYgdGhhdCB3YXMgbm90IHlvdSwgc29tZWJvZHkgd2l0aCBhY2Nlc3NgXG4gICAgICAgICAgICArIGAgdG8gdGhpcyBtYWNoaW5lIGp1c3QgcmVkaXJlY3RlZCBpdHMgYWxlcnRzLmBcbiAgICAgICAgICAgICsgYFxcblxcbm5ldyB3ZWJob29rOiBcXGAke3JlZGFjdFdlYmhvb2tVUkwobmV3V2ViaG9va1VSTCl9XFxgYFxuICAgICAgICAgICAgKyBgXFxuc2V0IGluOiBcXGAke3N0YXRlLmZpbGVQYXRofVxcYGBcbiAgICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYHBvcnRzZWN1cmU6IGZhaWxlZCB0byB3YXJuIHRoZSBvbGQgRGlzY29yZCB3ZWJob29rIGFib3V0IHRoZSBjaGFuZ2UuICR7ZX1gKTtcbiAgICB9XG4gICAgc3RhdGUud2ViaG9va1VSTCA9IG5ld1dlYmhvb2tVUkw7XG59XG5cbi8qKiBNdXN0IGJlIGNhbGxlZCBvbmNlIG9uIHN0YXJ0dXAsIGJlZm9yZSBhbnkgbm90aWZpY2F0aW9uIGlzIHNlbnQuIEFib3J0cyB0aGUgcHJvY2VzcyBpZiB0aGVcbiAgICB3ZWJob29rIGZpbGUgaXMgbWlzc2luZyBvciBpbnZhbGlkLCB0aGVuIHJlLWNoZWNrcyB0aGUgZmlsZSBvbiBhbiBpbnRlcnZhbCBhbmQgd2FybnMgdGhlIG9sZFxuICAgIHdlYmhvb2sgd2hlbmV2ZXIgaXQgY2hhbmdlcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25maWd1cmVEaXNjb3JkTm90aWZpY2F0aW9ucyhjb25maWc/OiB7XG4gICAgZmlsZVBhdGg/OiBzdHJpbmc7XG4gICAgY2hlY2tJbnRlcnZhbD86IG51bWJlcjtcbn0pIHtcbiAgICBpZiAobm90aWZpY2F0aW9uU3RhdGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBjb25maWd1cmVEaXNjb3JkTm90aWZpY2F0aW9ucyB0byBiZSBjYWxsZWQgb25jZSwgd2FzIGNhbGxlZCBhZ2FpbiAoYWxyZWFkeSB1c2luZyAke25vdGlmaWNhdGlvblN0YXRlLmZpbGVQYXRofSlgKTtcbiAgICB9XG4gICAgbGV0IGZpbGVQYXRoID0gY29uZmlnPy5maWxlUGF0aCB8fCBERUZBVUxUX1dFQkhPT0tfRklMRV9QQVRIO1xuICAgIGxldCBjaGVja0ludGVydmFsID0gY29uZmlnPy5jaGVja0ludGVydmFsIHx8IERFRkFVTFRfQ0hFQ0tfSU5URVJWQUw7XG4gICAgbGV0IHdlYmhvb2tVUkw7XG4gICAgdHJ5IHtcbiAgICAgICAgd2ViaG9va1VSTCA9IGF3YWl0IHJlYWRXZWJob29rRmlsZShmaWxlUGF0aCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBwb3J0c2VjdXJlOiByZWZ1c2luZyB0byBzdGFydCB3aXRob3V0IGEgdmFsaWQgRGlzY29yZCB3ZWJob29rIGZpbGUuXFxuJHtlfWApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICAgIGxldCBjaGVja1RpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBjaGVja1dlYmhvb2tGaWxlQ2hhbmdlZCgpLmNhdGNoKGUgPT4gY29uc29sZS5lcnJvcihgcG9ydHNlY3VyZTogRGlzY29yZCB3ZWJob29rIGZpbGUgY2hlY2sgZmFpbGVkLiAke2V9YCkpO1xuICAgIH0sIGNoZWNrSW50ZXJ2YWwpO1xuICAgIC8vIFRoZSBjaGVjayBzaG91bGQgbmV2ZXIgYmUgdGhlIHJlYXNvbiB0aGUgcHJvY2VzcyBzdGF5cyBhbGl2ZS5cbiAgICBjaGVja1RpbWVyLnVucmVmKCk7XG4gICAgbm90aWZpY2F0aW9uU3RhdGUgPSB7IGZpbGVQYXRoLCB3ZWJob29rVVJMLCBjaGVja1RpbWVyIH07XG4gICAgcmV0dXJuIHsgZmlsZVBhdGgsIGNoZWNrSW50ZXJ2YWwgfTtcbn1cblxuLy8gRE8gTk9UIGFkZCBuZXcgY2FsbHMgdG8gdGhpcy4gRXZlcnkgbWVzc2FnZSBnb2VzIHRvIGEgcmVhbCBEaXNjb3JkIHNlcnZlciBzb21lb25lIHJlYWRzLCBzbyBhXG4vLyBub3RpZmljYXRpb24gaXMgb25seSBldmVyIGFkZGVkIHdoZW4gdGhlIHVzZXIgZXhwbGljaXRseSBhc2tzIGZvciB0aGF0IHNwZWNpZmljIGNhc2UuIFN0YXJ0dXAsXG4vLyBzdWNjZXNzLCBlcnJvcnMsIHJldHJpZXMgYW5kIHJlY292ZXJpZXMgYWxsIGJlbG9uZyBpbiBhIGxvZyBpbnN0ZWFkLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmREaXNjb3JkTm90aWZpY2F0aW9uKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIGxldCBzdGF0ZSA9IG5vdGlmaWNhdGlvblN0YXRlO1xuICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBjb25maWd1cmVEaXNjb3JkTm90aWZpY2F0aW9ucyB0byBiZSBjYWxsZWQgYmVmb3JlIHNlbmRpbmcsIHdhcyBjYWxsZWQgd2l0aCBtZXNzYWdlICR7bWVzc2FnZS5zbGljZSgwLCBNQVhfRVJST1JfQk9EWV9MRU5HVEgpfWApO1xuICAgIH1cbiAgICBhd2FpdCBxdWV1ZVNlbmQoc3RhdGUud2ViaG9va1VSTCwgbWVzc2FnZSk7XG59XG5cbi8qKiBXaGV0aGVyIG5vdGlmaWNhdGlvbnMgYXJlIHNldCB1cCBpbiB0aGlzIHByb2Nlc3MuIEZvciBjb2RlIHRoYXQgbWF5IHJ1biBvdXRzaWRlIHRoZSBkYWVtb24sXG4gICAgd2hlcmUgc2VuZGluZyBpcyB3b3J0aCBkb2luZyBpZiBpdCBjYW4gYmUgYW5kIG5vdCB3b3J0aCBmYWlsaW5nIG92ZXIgaWYgaXQgY2Fubm90LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFyZURpc2NvcmROb3RpZmljYXRpb25zQ29uZmlndXJlZCgpIHtcbiAgICByZXR1cm4gISFub3RpZmljYXRpb25TdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0b3BEaXNjb3JkTm90aWZpY2F0aW9ucygpIHtcbiAgICBpZiAoIW5vdGlmaWNhdGlvblN0YXRlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY2xlYXJJbnRlcnZhbChub3RpZmljYXRpb25TdGF0ZS5jaGVja1RpbWVyKTtcbiAgICBub3RpZmljYXRpb25TdGF0ZSA9IHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
206
|
-
/* _JS_SOURCE_HASH = "
|
|
206
|
+
/* _JS_SOURCE_HASH = "a4fe18f537fa6da028d1607b16331b146697f9fabb96c6de058f0b41c5553b17"; */
|
|
@@ -40,6 +40,18 @@ function rankCellsByCloseness(embedding, centroids) {
|
|
|
40
40
|
ranked.sort((left, right) => right.closeness - left.closeness);
|
|
41
41
|
return ranked.map(entry => entry.cellId);
|
|
42
42
|
}
|
|
43
|
+
// Synced functions rerun (and are predicted client-side), so the rebalance roll must be identical on every run of the same call — derive it from the inserted items instead of Math.random(). FNV-1a over each ref plus its embedding hash, mapped to [0, 1).
|
|
44
|
+
function seededRandomFromItems(items) {
|
|
45
|
+
let hash = 2166136261;
|
|
46
|
+
for (const item of items) {
|
|
47
|
+
const key = item.ref + (0, embeddingFormats_1.hashEmbedding)(item.embedding);
|
|
48
|
+
for (let index = 0; index < key.length; index++) {
|
|
49
|
+
hash ^= key.charCodeAt(index);
|
|
50
|
+
hash = Math.imul(hash, 16777619);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return (hash >>> 0) / 2 ** 32;
|
|
54
|
+
}
|
|
43
55
|
// Per-write chance of a full rebuild. Zero at/under the target size, then rises (cubically) past it so cells stay roughly between target and ~2x target.
|
|
44
56
|
function rebalanceProbability(fillRatio) {
|
|
45
57
|
if (fillRatio <= 1) {
|
|
@@ -292,10 +304,10 @@ function insertEmbeddings(database, items) {
|
|
|
292
304
|
}
|
|
293
305
|
}
|
|
294
306
|
const averageFill = newCount / Math.max(1, centroids.size) / config.cellTargetSize;
|
|
295
|
-
if (
|
|
296
|
-
|
|
307
|
+
if (seededRandomFromItems(items) < rebalanceProbability(averageFill)) {
|
|
308
|
+
return true;
|
|
297
309
|
}
|
|
298
|
-
return
|
|
310
|
+
return false;
|
|
299
311
|
};
|
|
300
312
|
if (shouldRegenerate(database)) {
|
|
301
313
|
rebuildStructure(database);
|
|
@@ -382,5 +394,5 @@ function removeEmbeddings(database, refs) {
|
|
|
382
394
|
}
|
|
383
395
|
}
|
|
384
396
|
exports.removeEmbeddings = removeEmbeddings;
|
|
385
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXZmRW1iZWRkaW5nRGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpdmZFbWJlZGRpbmdEYXRhYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvREFBMkI7QUFDM0IseUNBQXlEO0FBQ3pELHFEQUFzSTtBQUN0SSwwREFBeUo7QUF5QnpKLE1BQU0sYUFBYSxHQUFHLElBQUksZ0JBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNuRSxTQUFTLGNBQWMsQ0FBQyxTQUEwQjtJQUM5QyxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFlLENBQUM7QUFDekQsQ0FBQztBQUNELFNBQVMsY0FBYyxDQUFDLEtBQWlCO0lBQ3JDLE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQW9CLENBQUM7QUFDMUQsQ0FBQztBQUVELGlHQUFpRztBQUNqRyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDeEIseUpBQXlKO0FBQ3pKLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3BDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQztBQUN2QixxSEFBcUg7QUFDckgsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFDakMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFFL0IsU0FBUyxTQUFTLENBQUMsUUFBb0M7SUFDbkQsT0FBTyxJQUFBLDRCQUFpQixFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBQ0QsU0FBUyxhQUFhLENBQUMsUUFBb0M7SUFDdkQsT0FBTyxJQUFBLDRCQUFpQixFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBQ0QsU0FBUyxT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YUFBYSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUNELEtBQUssTUFBTSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDNUIsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQ0QsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckIsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7QUFDTCxDQUFDO0FBaEZELDRDQWdGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjYm9yeCBmcm9tIFwiY2Jvci14XCI7XG5pbXBvcnQgeyBEYXRhYmFzZSwgbmFtZXNwYWNlRGF0YWJhc2UgfSBmcm9tIFwiLi9EYXRhYmFzZVwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25TZXRTdG9yZSwgdHJhbnNhY3Rpb25SZWFkLCB0cmFuc2FjdGlvbk11dGF0ZSwgdHJhbnNhY3Rpb25EZWxldGUsIHJlcGxheVRyYW5zYWN0aW9uU3RvcmUgfSBmcm9tIFwiLi90cmFuc2FjdGlvblNldFwiO1xuaW1wb3J0IHsgU3RvcmVkRW1iZWRkaW5nLCBFbWJlZGRpbmdGb3JtYXQsIGdldENsb3NlbmVzcywgZW1iZWRkaW5nVG9GbG9hdDMyLCByZWxlYXNlRmxvYXQzMiwgZW5jb2RlRW1iZWRkaW5nLCBoYXNoRW1iZWRkaW5nIH0gZnJvbSBcIi4uL2VtYmVkZGluZ0Zvcm1hdHNcIjtcblxuZXhwb3J0IHR5cGUgSXZmQ29uZmlnID0ge1xuICAgIG1vZGVsOiBzdHJpbmc7XG4gICAgZm9ybWF0OiBFbWJlZGRpbmdGb3JtYXQ7XG4gICAgLy8gVGFyZ2V0IG51bWJlciBvZiBlbWJlZGRpbmdzIHBlciBjZWxsLlxuICAgIGNlbGxUYXJnZXRTaXplOiBudW1iZXI7XG59O1xuXG4vLyBUaWVyZWQgc3RvcmFnZS4gQmVsb3cgRkxBVF9MSU1JVCBlbWJlZGRpbmdzIHRoZSB3aG9sZSBzZXQgbGl2ZXMgaW4gb25lIGZsYXQgdHJhbnNhY3Rpb24gc2V0IChubyBJVkYpOyBvbmNlIGl0IGdyb3dzIHBhc3QgdGhhdCB3ZSBidWlsZCB0aGUgSVZGIChjZW50cm9pZHMgKyBwZXItY2VsbCBzZXRzKSBhbmQgc3RheSB0aGVyZSBmb3JldmVyLiBgY291bnRgIGlzIHRoZSBsaXZlIGVtYmVkZGluZyBjb3VudCAocmUtZGVyaXZlZCBleGFjdGx5IG9uIGEgcmVidWlsZCkuIGBzdGVwc2AgcmVjb3JkcyBvbmUtdGltZSB1cGdyYWRlcyB0aGF0IG11c3QgbmV2ZXIgcmUtcnVuIGV2ZW4gaWYgdGhlIHNldCBsYXRlciBzaHJpbmtzIGFuZCByZWdyb3dzLlxuZXhwb3J0IHR5cGUgSXZmRW1iZWRkaW5nUm9vdCA9IHtcbiAgICBjb25maWc6IEl2ZkNvbmZpZztcbiAgICBjb3VudDogbnVtYmVyO1xuICAgIGZsYXQ6IFRyYW5zYWN0aW9uU2V0U3RvcmU8U3RvcmVkRW1iZWRkaW5nPjtcbiAgICAvLyBEaXJlY3QgcmVmIC0+IGVtYmVkZGluZyBpbmRleC4gRWFjaCBlbnRyeSBpcyBvbmUgQ0JPUiBibG9iIGF0IGl0cyBvd24ga2V5LCBzbyBhIGxvb2t1cCBvciBkZWxldGUgaXMgYSBzaW5nbGUga2V5LXZhbHVlIG9wIChubyB0cmFuc2FjdGlvbi1zZXQgcmVwbGF5KSBhbmQgZGVsZXRlRGF0YSBjYW4gZHJvcCBpdCAoaXQncyBhIHByaW1pdGl2ZSBsZWFmKS4gUmVmcyBhbmQgdGhlaXIgZW1iZWRkaW5ncyBuZXZlciBtb3ZlLCBzbyBhIHJlYnVpbGQgbGVhdmVzIHRoaXMgdW50b3VjaGVkLlxuICAgIGJ5UmVmOiB7IFtyZWY6IHN0cmluZ106IFVpbnQ4QXJyYXkgfTtcbiAgICBzdGVwczogeyBbc3RlcDogc3RyaW5nXTogYm9vbGVhbiB9O1xuICAgIGNlbnRyb2lkczogVHJhbnNhY3Rpb25TZXRTdG9yZTxTdG9yZWRFbWJlZGRpbmc+O1xuICAgIGNlbGxzOiB7IFtjZWxsSWQ6IHN0cmluZ106IFRyYW5zYWN0aW9uU2V0U3RvcmU8U3RvcmVkRW1iZWRkaW5nPiB9O1xufTtcblxuZXhwb3J0IHR5cGUgRW1iZWRkaW5nSW5wdXQgPSB7IHJlZjogc3RyaW5nOyBlbWJlZGRpbmc6IFN0b3JlZEVtYmVkZGluZyB9O1xuZXhwb3J0IHR5cGUgU2VhcmNoSGl0ID0geyByZWY6IHN0cmluZzsgY2xvc2VuZXNzOiBudW1iZXIgfTtcbnR5cGUgQ2VsbEVudHJ5ID0geyByZWY6IHN0cmluZzsgZW1iZWRkaW5nOiBTdG9yZWRFbWJlZGRpbmcgfTtcblxuY29uc3QgZW1iZWRkaW5nQ2JvciA9IG5ldyBjYm9yeC5FbmNvZGVyKHsgc3RydWN0dXJlZENsb25lOiB0cnVlIH0pO1xuZnVuY3Rpb24gZW5jb2RlUmVmVmFsdWUoZW1iZWRkaW5nOiBTdG9yZWRFbWJlZGRpbmcpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gZW1iZWRkaW5nQ2Jvci5lbmNvZGUoZW1iZWRkaW5nKSBhcyBVaW50OEFycmF5O1xufVxuZnVuY3Rpb24gZGVjb2RlUmVmVmFsdWUodmFsdWU6IFVpbnQ4QXJyYXkpOiBTdG9yZWRFbWJlZGRpbmcge1xuICAgIHJldHVybiBlbWJlZGRpbmdDYm9yLmRlY29kZSh2YWx1ZSkgYXMgU3RvcmVkRW1iZWRkaW5nO1xufVxuXG4vLyBCZWxvdyB0aGlzIG1hbnkgZW1iZWRkaW5ncyB3ZSBza2lwIHRoZSBJVkYgZW50aXJlbHkgKGZsYXQgc3RvcmUpLiAxMDI0ID0gYSBjbGVhbiBwb3dlciBvZiB0d28uXG5jb25zdCBGTEFUX0xJTUlUID0gMTAyNDtcbi8vIEZvcmNlIGEgZnJvbS1zY3JhdGNoIHJlYnVpbGQgb25jZSBhdCBlYWNoIG9mIHRoZXNlIChtdWx0aXBsZXMgb2YgNCBhYm92ZSBGTEFUX0xJTUlULCB1cCB0byB+MTZrKSwgZ2F0ZWQgYnkgYSBzdGVwIGZsYWcgc28gZWFjaCBydW5zIGF0IG1vc3Qgb25jZSBldmVyLlxuY29uc3QgUkVHRU5FUkFURV9BVCA9IFs0MDk2LCAxNjM4NF07XG5jb25zdCBTVEVQX0lWRiA9IFwiaXZmXCI7XG4vLyBPbiBkZWxldGUsIHRoZSBtZW1iZXIncyBleGFjdCBjZWxsIHBsdXMgdGhpcyBtYW55IG5lYXJieSBjZWxscyBhcmUgY2hlY2tlZCwgaW4gY2FzZSBhIHJlYnVpbGQgbGVmdCBpdCBub24tb3B0aW1hbC5cbmNvbnN0IERFTEVURV9GQUxMQkFDS19DRUxMUyA9IDEwO1xuY29uc3QgUkVCQUxBTkNFX0lURVJBVElPTlMgPSA0O1xuXG5mdW5jdGlvbiBmbGF0U3RvcmUoZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+KTogRGF0YWJhc2U8VHJhbnNhY3Rpb25TZXRTdG9yZTxTdG9yZWRFbWJlZGRpbmc+PiB7XG4gICAgcmV0dXJuIG5hbWVzcGFjZURhdGFiYXNlKGRhdGFiYXNlLCByb290ID0+IHJvb3QuZmxhdCk7XG59XG5mdW5jdGlvbiBjZW50cm9pZFN0b3JlKGRhdGFiYXNlOiBEYXRhYmFzZTxJdmZFbWJlZGRpbmdSb290Pik6IERhdGFiYXNlPFRyYW5zYWN0aW9uU2V0U3RvcmU8U3RvcmVkRW1iZWRkaW5nPj4ge1xuICAgIHJldHVybiBuYW1lc3BhY2VEYXRhYmFzZShkYXRhYmFzZSwgcm9vdCA9PiByb290LmNlbnRyb2lkcyk7XG59XG5mdW5jdGlvbiBjZWxsU3RvcmUoZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+LCBjZWxsSWQ6IHN0cmluZyk6IERhdGFiYXNlPFRyYW5zYWN0aW9uU2V0U3RvcmU8U3RvcmVkRW1iZWRkaW5nPj4ge1xuICAgIHJldHVybiBuYW1lc3BhY2VEYXRhYmFzZShkYXRhYmFzZSwgcm9vdCA9PiByb290LmNlbGxzW2NlbGxJZF0pO1xufVxuXG5mdW5jdGlvbiByYW5rQ2VsbHNCeUNsb3NlbmVzcyhlbWJlZGRpbmc6IFN0b3JlZEVtYmVkZGluZywgY2VudHJvaWRzOiBNYXA8c3RyaW5nLCBTdG9yZWRFbWJlZGRpbmc+KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHJhbmtlZDogeyBjZWxsSWQ6IHN0cmluZzsgY2xvc2VuZXNzOiBudW1iZXIgfVtdID0gW107XG4gICAgZm9yIChjb25zdCBjZWxsSWQgb2YgY2VudHJvaWRzLmtleXMoKSkge1xuICAgICAgICByYW5rZWQucHVzaCh7IGNlbGxJZCwgY2xvc2VuZXNzOiBnZXRDbG9zZW5lc3MoZW1iZWRkaW5nLCBjZW50cm9pZHMuZ2V0KGNlbGxJZCkhKSB9KTtcbiAgICB9XG4gICAgcmFua2VkLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiByaWdodC5jbG9zZW5lc3MgLSBsZWZ0LmNsb3NlbmVzcyk7XG4gICAgcmV0dXJuIHJhbmtlZC5tYXAoZW50cnkgPT4gZW50cnkuY2VsbElkKTtcbn1cblxuLy8gUGVyLXdyaXRlIGNoYW5jZSBvZiBhIGZ1bGwgcmVidWlsZC4gWmVybyBhdC91bmRlciB0aGUgdGFyZ2V0IHNpemUsIHRoZW4gcmlzZXMgKGN1YmljYWxseSkgcGFzdCBpdCBzbyBjZWxscyBzdGF5IHJvdWdobHkgYmV0d2VlbiB0YXJnZXQgYW5kIH4yeCB0YXJnZXQuXG5mdW5jdGlvbiByZWJhbGFuY2VQcm9iYWJpbGl0eShmaWxsUmF0aW86IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKGZpbGxSYXRpbyA8PSAxKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBvdmVyID0gZmlsbFJhdGlvIC0gMTtcbiAgICByZXR1cm4gTWF0aC5taW4oMSwgb3ZlciAqIG92ZXIgKiBvdmVyICogMC4yNSk7XG59XG5cbi8vIGstbWVhbnMuIERlY29kZXMgZXZlcnkgbWVtYmVyIHRvIGEgcG9vbGVkIGZsb2F0MzIgYnVmZmVyIE9OQ0UsIHRoZW4gYXNzaWducyB3aXRoIGEgcGxhaW4gaW50ZXJuYWwgZmxvYXQgZG90IChubyBnZXRDbG9zZW5lc3MgY2FsbCDigJQgY29tcGFyaW5nIHR3byBmbG9hdCB2ZWN0b3JzIGlzIHRyaXZpYWwpIGFuZCBrZWVwcyBjZW50cm9pZHMgYXMgZmxvYXQgbWVhbnMsIGVuY29kaW5nIHRoZW0gdG8gU3RvcmVkRW1iZWRkaW5nIG9ubHkgYXQgdGhlIGVuZC4gUmVsZWFzZXMgdGhlIGJvcnJvd2VkIGJ1ZmZlcnMgd2hlbiBkb25lLlxuZnVuY3Rpb24gY2x1c3Rlck1lbWJlcnMobWVtYmVyczogQ2VsbEVudHJ5W10sIGNsdXN0ZXJDb3VudDogbnVtYmVyLCBjb25maWc6IEl2ZkNvbmZpZyk6IHsgY2VudHJvaWQ6IFN0b3JlZEVtYmVkZGluZzsgbWVtYmVyczogQ2VsbEVudHJ5W10gfVtdIHtcbiAgICBjb25zdCBtZW1iZXJGbG9hdHM6IEZsb2F0MzJBcnJheVtdID0gW107XG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycykge1xuICAgICAgICBtZW1iZXJGbG9hdHMucHVzaChlbWJlZGRpbmdUb0Zsb2F0MzIobWVtYmVyLmVtYmVkZGluZywgdHJ1ZSkpO1xuICAgIH1cbiAgICBjb25zdCBsZW5ndGggPSBtZW1iZXJGbG9hdHMubGVuZ3RoID8gbWVtYmVyRmxvYXRzWzBdLmxlbmd0aCA6IDA7XG4gICAgbGV0IGNlbnRyb2lkczogRmxvYXQzMkFycmF5W10gPSBbXTtcbiAgICBjb25zdCBzZWVkU3RlcCA9IG1lbWJlcnMubGVuZ3RoIC8gY2x1c3RlckNvdW50O1xuICAgIGZvciAobGV0IGNsdXN0ZXJJbmRleCA9IDA7IGNsdXN0ZXJJbmRleCA8IGNsdXN0ZXJDb3VudDsgY2x1c3RlckluZGV4KyspIHtcbiAgICAgICAgY2VudHJvaWRzLnB1c2gobmV3IEZsb2F0MzJBcnJheShtZW1iZXJGbG9hdHNbTWF0aC5mbG9vcihjbHVzdGVySW5kZXggKiBzZWVkU3RlcCldKSk7XG4gICAgfVxuICAgIGxldCBncm91cHM6IG51bWJlcltdW10gPSBbXTtcbiAgICBmb3IgKGxldCBpdGVyYXRpb24gPSAwOyBpdGVyYXRpb24gPCBSRUJBTEFOQ0VfSVRFUkFUSU9OUzsgaXRlcmF0aW9uKyspIHtcbiAgICAgICAgZ3JvdXBzID0gW107XG4gICAgICAgIGZvciAobGV0IGNsdXN0ZXJJbmRleCA9IDA7IGNsdXN0ZXJJbmRleCA8IGNlbnRyb2lkcy5sZW5ndGg7IGNsdXN0ZXJJbmRleCsrKSB7XG4gICAgICAgICAgICBncm91cHMucHVzaChbXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgbWVtYmVySW5kZXggPSAwOyBtZW1iZXJJbmRleCA8IG1lbWJlckZsb2F0cy5sZW5ndGg7IG1lbWJlckluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1lbWJlckZsb2F0ID0gbWVtYmVyRmxvYXRzW21lbWJlckluZGV4XTtcbiAgICAgICAgICAgIGxldCBiZXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IGJlc3REb3QgPSAtSW5maW5pdHk7XG4gICAgICAgICAgICBmb3IgKGxldCBjZW50cm9pZEluZGV4ID0gMDsgY2VudHJvaWRJbmRleCA8IGNlbnRyb2lkcy5sZW5ndGg7IGNlbnRyb2lkSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbnRyb2lkRmxvYXQgPSBjZW50cm9pZHNbY2VudHJvaWRJbmRleF07XG4gICAgICAgICAgICAgICAgbGV0IGRvdCA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZGltID0gMDsgZGltIDwgbGVuZ3RoOyBkaW0rKykge1xuICAgICAgICAgICAgICAgICAgICBkb3QgKz0gbWVtYmVyRmxvYXRbZGltXSAqIGNlbnRyb2lkRmxvYXRbZGltXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRvdCA+IGJlc3REb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgYmVzdERvdCA9IGRvdDtcbiAgICAgICAgICAgICAgICAgICAgYmVzdEluZGV4ID0gY2VudHJvaWRJbmRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncm91cHNbYmVzdEluZGV4XS5wdXNoKG1lbWJlckluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0Q2VudHJvaWRzOiBGbG9hdDMyQXJyYXlbXSA9IFtdO1xuICAgICAgICBjb25zdCBuZXh0R3JvdXBzOiBudW1iZXJbXVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgICAgICAgICBpZiAoIWdyb3VwLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVhbiA9IG5ldyBGbG9hdDMyQXJyYXkobGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbWVtYmVySW5kZXggb2YgZ3JvdXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZW1iZXJGbG9hdCA9IG1lbWJlckZsb2F0c1ttZW1iZXJJbmRleF07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZGltID0gMDsgZGltIDwgbGVuZ3RoOyBkaW0rKykge1xuICAgICAgICAgICAgICAgICAgICBtZWFuW2RpbV0gKz0gbWVtYmVyRmxvYXRbZGltXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbm9ybSA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBkaW0gPSAwOyBkaW0gPCBsZW5ndGg7IGRpbSsrKSB7XG4gICAgICAgICAgICAgICAgbm9ybSArPSBtZWFuW2RpbV0gKiBtZWFuW2RpbV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtYWduaXR1ZGUgPSBNYXRoLnNxcnQobm9ybSkgfHwgMTtcbiAgICAgICAgICAgIGZvciAobGV0IGRpbSA9IDA7IGRpbSA8IGxlbmd0aDsgZGltKyspIHtcbiAgICAgICAgICAgICAgICBtZWFuW2RpbV0gLz0gbWFnbml0dWRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dENlbnRyb2lkcy5wdXNoKG1lYW4pO1xuICAgICAgICAgICAgbmV4dEdyb3Vwcy5wdXNoKGdyb3VwKTtcbiAgICAgICAgfVxuICAgICAgICBjZW50cm9pZHMgPSBuZXh0Q2VudHJvaWRzO1xuICAgICAgICBncm91cHMgPSBuZXh0R3JvdXBzO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQ6IHsgY2VudHJvaWQ6IFN0b3JlZEVtYmVkZGluZzsgbWVtYmVyczogQ2VsbEVudHJ5W10gfVtdID0gW107XG4gICAgZm9yIChsZXQgY2x1c3RlckluZGV4ID0gMDsgY2x1c3RlckluZGV4IDwgY2VudHJvaWRzLmxlbmd0aDsgY2x1c3RlckluZGV4KyspIHtcbiAgICAgICAgY29uc3QgY2VudHJvaWQgPSBlbmNvZGVFbWJlZGRpbmcoeyBpbnB1dDogY2VudHJvaWRzW2NsdXN0ZXJJbmRleF0sIGZvcm1hdDogY29uZmlnLmZvcm1hdCwgbW9kZWw6IGNvbmZpZy5tb2RlbCB9KTtcbiAgICAgICAgY29uc3QgY2VsbE1lbWJlcnM6IENlbGxFbnRyeVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbWVtYmVySW5kZXggb2YgZ3JvdXBzW2NsdXN0ZXJJbmRleF0pIHtcbiAgICAgICAgICAgIGNlbGxNZW1iZXJzLnB1c2gobWVtYmVyc1ttZW1iZXJJbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKHsgY2VudHJvaWQsIG1lbWJlcnM6IGNlbGxNZW1iZXJzIH0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1lbWJlckZsb2F0IG9mIG1lbWJlckZsb2F0cykge1xuICAgICAgICByZWxlYXNlRmxvYXQzMihtZW1iZXJGbG9hdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIFJlLWNsdXN0ZXIgRVZFUlkgZW1iZWRkaW5nIChmbGF0IHRpZXIgKyBhbGwgY2VsbHMpIGludG8gYSBmcmVzaCBJVkYsIGNsZWFyIHRoZSBmbGF0IHRpZXIsIGFuZCBtYXJrIElWRiBtb2RlLiBUaGlzIGlzIHRoZSByZWFycmFuZ2VyOiBydW4gcHJvYmFiaWxpc3RpY2FsbHkgYXMgdGhlIHNldCBncm93cywgb25jZSBhdCBlYWNoIHJlZ2VuZXJhdGUgdGhyZXNob2xkLCBhbmQgb25jZSB0byB1cGdyYWRlIGZyb20gZmxhdC4gUmVhZHMgZXZlcnl0aGluZyBpdCB1c2VzLCBzbyBpdCBiYWlscyAoZG9lcyBub3RoaW5nKSBpZiBhbnl0aGluZyBpc24ndCBzeW5jZWQgYW5kIHRoZSBjYWxsZXIncyByZXRyeSByZS1ydW5zIGl0OyBubyBjYWxsZXIgY2FyZXMgYWJvdXQgaXRzIHJlc3VsdC5cbmV4cG9ydCBmdW5jdGlvbiByZWJ1aWxkU3RydWN0dXJlKGRhdGFiYXNlOiBEYXRhYmFzZTxJdmZFbWJlZGRpbmdSb290Pik6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpZyA9IGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gcm9vdC5jb25maWcpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm47XG4gICAgY29uc3Qgc3RlcHMgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHJvb3Quc3RlcHMpO1xuICAgIGlmICghc3RlcHMpIHJldHVybjtcblxuICAgIGNvbnN0IGFsbE1lbWJlcnM6IENlbGxFbnRyeVtdID0gW107XG4gICAgLy8gT25seSB0aGUgb25lLXRpbWUgZmxhdC0+SVZGIHVwZ3JhZGUgcHVsbHMgZnJvbSB0aGUgZmxhdCB0aWVyLiBPbmNlIFNURVBfSVZGIGlzIHNldCB0aGUgZmxhdCBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gZm9sZGVkIGludG8gY2VsbHMsIHNvIGxhdGVyIHJlYnVpbGRzIGlnbm9yZSBpdC4gSXQncyBsZWZ0IGluIHBsYWNlLCBuZXZlciBkZWxldGVkOiBkZWxldGVEYXRhIG9ubHkgcmVtb3ZlcyBwcmltaXRpdmUgbGVhdmVzLCBub3QgYSB3aG9sZSBzdG9yZSwgYW5kIHRoZSBmbGF0IHRpZXIgaXMgc21hbGwgZW5vdWdoIG5vdCB0byBtYXR0ZXIuXG4gICAgaWYgKCFzdGVwc1tTVEVQX0lWRl0pIHtcbiAgICAgICAgY29uc3QgZmxhdCA9IHRyYW5zYWN0aW9uUmVhZChmbGF0U3RvcmUoZGF0YWJhc2UpKTtcbiAgICAgICAgaWYgKCFmbGF0KSByZXR1cm47XG4gICAgICAgIGZvciAoY29uc3QgcmVmIG9mIGZsYXQua2V5cygpKSB7XG4gICAgICAgICAgICBhbGxNZW1iZXJzLnB1c2goeyByZWYsIGVtYmVkZGluZzogZmxhdC5nZXQocmVmKSEgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2VudHJvaWRzID0gdHJhbnNhY3Rpb25SZWFkKGNlbnRyb2lkU3RvcmUoZGF0YWJhc2UpKTtcbiAgICBpZiAoIWNlbnRyb2lkcykgcmV0dXJuO1xuICAgIGNvbnN0IG9sZENlbGxJZHMgPSBBcnJheS5mcm9tKGNlbnRyb2lkcy5rZXlzKCkpO1xuICAgIGNvbnN0IGNlbGxTdG9yZXMgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IG9sZENlbGxJZHMubWFwKGNlbGxJZCA9PiByb290LmNlbGxzW2NlbGxJZF0pKTtcbiAgICBpZiAoIWNlbGxTdG9yZXMpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IHN0b3JlIG9mIGNlbGxTdG9yZXMpIHtcbiAgICAgICAgY29uc3QgbWVtYmVycyA9IHJlcGxheVRyYW5zYWN0aW9uU3RvcmU8U3RvcmVkRW1iZWRkaW5nPihzdG9yZSk7XG4gICAgICAgIGZvciAoY29uc3QgcmVmIG9mIG1lbWJlcnMua2V5cygpKSB7XG4gICAgICAgICAgICBhbGxNZW1iZXJzLnB1c2goeyByZWYsIGVtYmVkZGluZzogbWVtYmVycy5nZXQocmVmKSEgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFhbGxNZW1iZXJzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY2x1c3RlckNvdW50ID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChhbGxNZW1iZXJzLmxlbmd0aCAvIGNvbmZpZy5jZWxsVGFyZ2V0U2l6ZSkpO1xuICAgIGNvbnN0IGNsdXN0ZXJzID0gY2x1c3Rlck1lbWJlcnMoYWxsTWVtYmVycywgY2x1c3RlckNvdW50LCBjb25maWcpO1xuXG4gICAgY29uc3QgbmV3Q2VsbElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGNlbnRyb2lkV3JpdGVzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogU3RvcmVkRW1iZWRkaW5nIHwgdW5kZWZpbmVkIH1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2x1c3RlciBvZiBjbHVzdGVycykge1xuICAgICAgICBjb25zdCBjZWxsSWQgPSBoYXNoRW1iZWRkaW5nKGNsdXN0ZXIuY2VudHJvaWQpO1xuICAgICAgICBuZXdDZWxsSWRzLmFkZChjZWxsSWQpO1xuICAgICAgICBjZW50cm9pZFdyaXRlcy5wdXNoKHsga2V5OiBjZWxsSWQsIHZhbHVlOiBjbHVzdGVyLmNlbnRyb2lkIH0pO1xuICAgICAgICBjb25zdCBtZW1iZXJXcml0ZXMgPSBjbHVzdGVyLm1lbWJlcnMubWFwKG1lbWJlciA9PiAoeyBrZXk6IG1lbWJlci5yZWYsIHZhbHVlOiBtZW1iZXIuZW1iZWRkaW5nIH0pKTtcbiAgICAgICAgdHJhbnNhY3Rpb25NdXRhdGUoY2VsbFN0b3JlKGRhdGFiYXNlLCBjZWxsSWQpLCBtZW1iZXJXcml0ZXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG9sZENlbGxJZCBvZiBvbGRDZWxsSWRzKSB7XG4gICAgICAgIGlmIChuZXdDZWxsSWRzLmhhcyhvbGRDZWxsSWQpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjZW50cm9pZFdyaXRlcy5wdXNoKHsga2V5OiBvbGRDZWxsSWQsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgIHRyYW5zYWN0aW9uRGVsZXRlKGNlbGxTdG9yZShkYXRhYmFzZSwgb2xkQ2VsbElkKSk7XG4gICAgfVxuICAgIHRyYW5zYWN0aW9uTXV0YXRlKGNlbnRyb2lkU3RvcmUoZGF0YWJhc2UpLCBjZW50cm9pZFdyaXRlcyk7XG4gICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5jb3VudCwgYWxsTWVtYmVycy5sZW5ndGgpO1xuICAgIGRhdGFiYXNlLndyaXRlRGF0YShyb290ID0+IHJvb3Quc3RlcHNbU1RFUF9JVkZdLCB0cnVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaEVtYmVkZGluZ3MoXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+LFxuICAgIHF1ZXJ5OiBTdG9yZWRFbWJlZGRpbmcsXG4gICAgb3B0aW9uczogeyBwcm9iZUJ1ZGdldDogbnVtYmVyOyByZXN1bHRDb3VudDogbnVtYmVyIH0sXG4pOiBTZWFyY2hIaXRbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29uZmlnID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiByb290LmNvbmZpZyk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3RlcHMgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHJvb3Quc3RlcHMpO1xuICAgIGlmICghc3RlcHMpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBoaXRzOiBTZWFyY2hIaXRbXSA9IFtdO1xuICAgIGlmICghc3RlcHNbU1RFUF9JVkZdKSB7XG4gICAgICAgIGNvbnN0IGZsYXQgPSB0cmFuc2FjdGlvblJlYWQoZmxhdFN0b3JlKGRhdGFiYXNlKSk7XG4gICAgICAgIGlmICghZmxhdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCByZWYgb2YgZmxhdC5rZXlzKCkpIHtcbiAgICAgICAgICAgIGhpdHMucHVzaCh7IHJlZiwgY2xvc2VuZXNzOiBnZXRDbG9zZW5lc3MocXVlcnksIGZsYXQuZ2V0KHJlZikhKSB9KTtcbiAgICAgICAgfVxuICAgICAgICBoaXRzLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiByaWdodC5jbG9zZW5lc3MgLSBsZWZ0LmNsb3NlbmVzcyk7XG4gICAgICAgIHJldHVybiBoaXRzLnNsaWNlKDAsIG9wdGlvbnMucmVzdWx0Q291bnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGNlbnRyb2lkcyA9IHRyYW5zYWN0aW9uUmVhZChjZW50cm9pZFN0b3JlKGRhdGFiYXNlKSk7XG4gICAgaWYgKCFjZW50cm9pZHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKCFjZW50cm9pZHMuc2l6ZSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHByb2JlQ2VsbENvdW50ID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKG9wdGlvbnMucHJvYmVCdWRnZXQgLyBjb25maWcuY2VsbFRhcmdldFNpemUpKTtcbiAgICBjb25zdCBwcm9iZUNlbGxJZHMgPSByYW5rQ2VsbHNCeUNsb3NlbmVzcyhxdWVyeSwgY2VudHJvaWRzKS5zbGljZSgwLCBwcm9iZUNlbGxDb3VudCk7XG4gICAgY29uc3Qgc3RvcmVzID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiBwcm9iZUNlbGxJZHMubWFwKGNlbGxJZCA9PiByb290LmNlbGxzW2NlbGxJZF0pKTtcbiAgICBpZiAoIXN0b3JlcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IHN0b3JlIG9mIHN0b3Jlcykge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gcmVwbGF5VHJhbnNhY3Rpb25TdG9yZTxTdG9yZWRFbWJlZGRpbmc+KHN0b3JlKTtcbiAgICAgICAgZm9yIChjb25zdCByZWYgb2YgbWVtYmVycy5rZXlzKCkpIHtcbiAgICAgICAgICAgIGhpdHMucHVzaCh7IHJlZiwgY2xvc2VuZXNzOiBnZXRDbG9zZW5lc3MocXVlcnksIG1lbWJlcnMuZ2V0KHJlZikhKSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoaXRzLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiByaWdodC5jbG9zZW5lc3MgLSBsZWZ0LmNsb3NlbmVzcyk7XG4gICAgcmV0dXJuIGhpdHMuc2xpY2UoMCwgb3B0aW9ucy5yZXN1bHRDb3VudCk7XG59XG5cbi8vIERpcmVjdCByZWYgLT4gc3RvcmVkIGVtYmVkZGluZyBsb29rdXAgdGhyb3VnaCB0aGUgYnlSZWYgaW5kZXg6IG9uZSBrZXktdmFsdWUgcmVhZCBwZXIgcmVmLCBubyBjZWxsIHNjYW4uIEEgc2VhcmNoIHJldHVybnMgcmVmczsgdGhpcyBmZXRjaGVzIHRoZSBkYXRhIGJlaGluZCB0aGVtLiBTa2lwcyByZWZzIHRoYXQgYXJlbid0IHByZXNlbnQ7IHVuZGVmaW5lZCBpZiBub3Qgc3luY2VkLlxuZXhwb3J0IGZ1bmN0aW9uIGxvb2t1cEVtYmVkZGluZ3MoXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+LFxuICAgIHJlZnM6IHN0cmluZ1tdLFxuKTogTWFwPHN0cmluZywgU3RvcmVkRW1iZWRkaW5nPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdmFsdWVzID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiByZWZzLm1hcChyZWYgPT4gcm9vdC5ieVJlZltyZWZdKSk7XG4gICAgaWYgKCF2YWx1ZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIFN0b3JlZEVtYmVkZGluZz4oKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcmVmcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaW5kZXhdO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zZXQocmVmc1tpbmRleF0sIGRlY29kZVJlZlZhbHVlKHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEVtYmVkZGluZ3MoXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+LFxuICAgIGl0ZW1zOiBFbWJlZGRpbmdJbnB1dFtdLFxuKSB7XG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBjb25maWcgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHJvb3QuY29uZmlnKTtcbiAgICBjb25zdCBzdGVwcyA9IGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gcm9vdC5zdGVwcyk7XG4gICAgbGV0IGNvdW50ID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiByb290LmNvdW50KTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuO1xuICAgIGlmICghc3RlcHMpIHJldHVybjtcbiAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld0NvdW50ID0gY291bnQgKyBpdGVtcy5sZW5ndGg7XG5cbiAgICBpZiAoIXN0ZXBzW1NURVBfSVZGXSkge1xuICAgICAgICBjb25zdCBmbGF0V3JpdGVzID0gaXRlbXMubWFwKGl0ZW0gPT4gKHsga2V5OiBpdGVtLnJlZiwgdmFsdWU6IGl0ZW0uZW1iZWRkaW5nIH0pKTtcbiAgICAgICAgdHJhbnNhY3Rpb25NdXRhdGUoZmxhdFN0b3JlKGRhdGFiYXNlKSwgZmxhdFdyaXRlcyk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5ieVJlZltpdGVtLnJlZl0sIGVuY29kZVJlZlZhbHVlKGl0ZW0uZW1iZWRkaW5nKSk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5jb3VudCwgbmV3Q291bnQpO1xuICAgICAgICBpZiAobmV3Q291bnQgPiBGTEFUX0xJTUlUKSB7XG4gICAgICAgICAgICByZWJ1aWxkU3RydWN0dXJlKGRhdGFiYXNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2VudHJvaWRzID0gdHJhbnNhY3Rpb25SZWFkKGNlbnRyb2lkU3RvcmUoZGF0YWJhc2UpKTtcbiAgICBpZiAoIWNlbnRyb2lkcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBpdGVtc0J5Q2VsbCA9IG5ldyBNYXA8c3RyaW5nLCBFbWJlZGRpbmdJbnB1dFtdPigpO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICBjb25zdCBjZWxsSWQgPSByYW5rQ2VsbHNCeUNsb3NlbmVzcyhpdGVtLmVtYmVkZGluZywgY2VudHJvaWRzKVswXTtcbiAgICAgICAgbGV0IGdyb3VwID0gaXRlbXNCeUNlbGwuZ2V0KGNlbGxJZCk7XG4gICAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgICAgIGdyb3VwID0gW107XG4gICAgICAgICAgICBpdGVtc0J5Q2VsbC5zZXQoY2VsbElkLCBncm91cCk7XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXAucHVzaChpdGVtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjZWxsSWQgb2YgaXRlbXNCeUNlbGwua2V5cygpKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gaXRlbXNCeUNlbGwuZ2V0KGNlbGxJZCkhO1xuICAgICAgICBjb25zdCBtZW1iZXJXcml0ZXMgPSBncm91cC5tYXAoaXRlbSA9PiAoeyBrZXk6IGl0ZW0ucmVmLCB2YWx1ZTogaXRlbS5lbWJlZGRpbmcgfSkpO1xuICAgICAgICB0cmFuc2FjdGlvbk11dGF0ZShjZWxsU3RvcmUoZGF0YWJhc2UsIGNlbGxJZCksIG1lbWJlcldyaXRlcyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICBkYXRhYmFzZS53cml0ZURhdGEocm9vdCA9PiByb290LmJ5UmVmW2l0ZW0ucmVmXSwgZW5jb2RlUmVmVmFsdWUoaXRlbS5lbWJlZGRpbmcpKTtcbiAgICB9XG4gICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5jb3VudCwgbmV3Q291bnQpO1xuXG5cbiAgICBjb25zdCBzaG91bGRSZWdlbmVyYXRlID0gKGRhdGFiYXNlOiBEYXRhYmFzZTxJdmZFbWJlZGRpbmdSb290PikgPT4ge1xuICAgICAgICBsZXQgc3RlcHMgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHJvb3Quc3RlcHMpO1xuICAgICAgICBpZiAoIXN0ZXBzKSByZXR1cm47XG4gICAgICAgIGZvciAoY29uc3QgdGhyZXNob2xkIG9mIFJFR0VORVJBVEVfQVQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBOYW1lID0gXCJyZWdlblwiICsgdGhyZXNob2xkO1xuICAgICAgICAgICAgaWYgKCFzdGVwc1tzdGVwTmFtZV0gJiYgbmV3Q291bnQgPiB0aHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICBkYXRhYmFzZS53cml0ZURhdGEocm9vdCA9PiByb290LnN0ZXBzW3N0ZXBOYW1lXSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXZlcmFnZUZpbGwgPSBuZXdDb3VudCAvIE1hdGgubWF4KDEsIGNlbnRyb2lkcy5zaXplKSAvIGNvbmZpZy5jZWxsVGFyZ2V0U2l6ZTtcbiAgICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPCByZWJhbGFuY2VQcm9iYWJpbGl0eShhdmVyYWdlRmlsbCkpIHtcbiAgICAgICAgICAgIHJlYnVpbGRTdHJ1Y3R1cmUoZGF0YWJhc2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgaWYgKHNob3VsZFJlZ2VuZXJhdGUoZGF0YWJhc2UpKSB7XG4gICAgICAgIHJlYnVpbGRTdHJ1Y3R1cmUoZGF0YWJhc2UpO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUVtYmVkZGluZ3MoXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+LFxuICAgIHJlZnM6IHN0cmluZ1tdLFxuKSB7XG4gICAgaWYgKCFyZWZzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IHN0ZXBzID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiByb290LnN0ZXBzKTtcbiAgICBjb25zdCBjb3VudCA9IGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gcm9vdC5jb3VudCk7XG4gICAgaWYgKCFzdGVwcykgcmV0dXJuO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICBpZiAoIXN0ZXBzW1NURVBfSVZGXSkge1xuICAgICAgICBjb25zdCBmbGF0RGVsZXRlcyA9IHJlZnMubWFwKHJlZiA9PiAoeyBrZXk6IHJlZiwgdmFsdWU6IHVuZGVmaW5lZCB9KSk7XG4gICAgICAgIHRyYW5zYWN0aW9uTXV0YXRlKGZsYXRTdG9yZShkYXRhYmFzZSksIGZsYXREZWxldGVzKTtcbiAgICAgICAgZm9yIChjb25zdCByZWYgb2YgcmVmcykge1xuICAgICAgICAgICAgZGF0YWJhc2UuZGVsZXRlRGF0YShyb290ID0+IHJvb3QuYnlSZWZbcmVmXSk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5jb3VudCwgTWF0aC5tYXgoMCwgY291bnQgLSByZWZzLmxlbmd0aCkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2VudHJvaWRzID0gdHJhbnNhY3Rpb25SZWFkKGNlbnRyb2lkU3RvcmUoZGF0YWJhc2UpKTtcbiAgICBpZiAoIWNlbnRyb2lkcykgcmV0dXJuO1xuICAgIGlmICghY2VudHJvaWRzLnNpemUpIHJldHVybjtcblxuICAgIC8vIExvb2sgdXAgZWFjaCByZWYncyBlbWJlZGRpbmcgdGhyb3VnaCBieVJlZiwgdGhlbiByYW5rIGl0cyBjZWxscyB0aGUgd2F5IGFuIGluc2VydCB3b3VsZCwgc28gd2UgZGVsZXRlIGZyb20gdGhlIGNlbGwgaXQgYWN0dWFsbHkgbGFuZGVkIGluIChwbHVzIGEgZmV3IG5laWdoYm91cnMsIGluIGNhc2UgYSByZWJ1aWxkIG51ZGdlZCBpdCBhY3Jvc3MgYSBib3VuZGFyeSkuXG4gICAgY29uc3QgcmVmVmFsdWVzID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiByZWZzLm1hcChyZWYgPT4gcm9vdC5ieVJlZltyZWZdKSk7XG4gICAgaWYgKCFyZWZWYWx1ZXMpIHJldHVybjtcbiAgICBjb25zdCBjYW5kaWRhdGVzQnlJdGVtOiB7IHJlZjogc3RyaW5nOyBjZWxsSWRzOiBzdHJpbmdbXSB9W10gPSBbXTtcbiAgICBjb25zdCBjYW5kaWRhdGVTZXQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcmVmcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSByZWZWYWx1ZXNbaW5kZXhdO1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbWJlZGRpbmcgPSBkZWNvZGVSZWZWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IGNlbGxJZHMgPSByYW5rQ2VsbHNCeUNsb3NlbmVzcyhlbWJlZGRpbmcsIGNlbnRyb2lkcykuc2xpY2UoMCwgMSArIERFTEVURV9GQUxMQkFDS19DRUxMUyk7XG4gICAgICAgIGNhbmRpZGF0ZXNCeUl0ZW0ucHVzaCh7IHJlZjogcmVmc1tpbmRleF0sIGNlbGxJZHMgfSk7XG4gICAgICAgIGZvciAoY29uc3QgY2VsbElkIG9mIGNlbGxJZHMpIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZVNldC5hZGQoY2VsbElkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNhbmRpZGF0ZUNlbGxJZHMgPSBBcnJheS5mcm9tKGNhbmRpZGF0ZVNldCk7XG4gICAgY29uc3Qgc3RvcmVzID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiBjYW5kaWRhdGVDZWxsSWRzLm1hcChjZWxsSWQgPT4gcm9vdC5jZWxsc1tjZWxsSWRdKSk7XG4gICAgaWYgKCFzdG9yZXMpIHJldHVybjtcbiAgICBjb25zdCBtZW1iZXJzQnlDZWxsID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFN0b3JlZEVtYmVkZGluZz4+KCk7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNhbmRpZGF0ZUNlbGxJZHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIG1lbWJlcnNCeUNlbGwuc2V0KGNhbmRpZGF0ZUNlbGxJZHNbaW5kZXhdLCByZXBsYXlUcmFuc2FjdGlvblN0b3JlKHN0b3Jlc1tpbmRleF0pKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWxldGVzQnlDZWxsID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICAgIGNvbnN0IGRlbGV0ZWRSZWZzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXNCeUl0ZW0pIHtcbiAgICAgICAgZm9yIChjb25zdCBjZWxsSWQgb2YgY2FuZGlkYXRlLmNlbGxJZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lbWJlcnMgPSBtZW1iZXJzQnlDZWxsLmdldChjZWxsSWQpO1xuICAgICAgICAgICAgaWYgKCFtZW1iZXJzIHx8ICFtZW1iZXJzLmhhcyhjYW5kaWRhdGUucmVmKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNlbGxSZWZzID0gZGVsZXRlc0J5Q2VsbC5nZXQoY2VsbElkKTtcbiAgICAgICAgICAgIGlmICghY2VsbFJlZnMpIHtcbiAgICAgICAgICAgICAgICBjZWxsUmVmcyA9IFtdO1xuICAgICAgICAgICAgICAgIGRlbGV0ZXNCeUNlbGwuc2V0KGNlbGxJZCwgY2VsbFJlZnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2VsbFJlZnMucHVzaChjYW5kaWRhdGUucmVmKTtcbiAgICAgICAgICAgIGRlbGV0ZWRSZWZzLnB1c2goY2FuZGlkYXRlLnJlZik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2VsbElkIG9mIGRlbGV0ZXNCeUNlbGwua2V5cygpKSB7XG4gICAgICAgIGNvbnN0IGNlbGxSZWZzID0gZGVsZXRlc0J5Q2VsbC5nZXQoY2VsbElkKSE7XG4gICAgICAgIGNvbnN0IG1lbWJlckRlbGV0ZXMgPSBjZWxsUmVmcy5tYXAocmVmID0+ICh7IGtleTogcmVmLCB2YWx1ZTogdW5kZWZpbmVkIH0pKTtcbiAgICAgICAgdHJhbnNhY3Rpb25NdXRhdGUoY2VsbFN0b3JlKGRhdGFiYXNlLCBjZWxsSWQpLCBtZW1iZXJEZWxldGVzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByZWYgb2YgZGVsZXRlZFJlZnMpIHtcbiAgICAgICAgZGF0YWJhc2UuZGVsZXRlRGF0YShyb290ID0+IHJvb3QuYnlSZWZbcmVmXSk7XG4gICAgfVxuICAgIGlmIChkZWxldGVkUmVmcy5sZW5ndGgpIHtcbiAgICAgICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5jb3VudCwgTWF0aC5tYXgoMCwgY291bnQgLSBkZWxldGVkUmVmcy5sZW5ndGgpKTtcbiAgICB9XG59XG4iXX0=
|
|
386
|
-
/* _JS_SOURCE_HASH = "
|
|
397
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXZmRW1iZWRkaW5nRGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpdmZFbWJlZGRpbmdEYXRhYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvREFBMkI7QUFDM0IseUNBQXlEO0FBQ3pELHFEQUFzSTtBQUN0SSwwREFBeUo7QUF5QnpKLE1BQU0sYUFBYSxHQUFHLElBQUksZ0JBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNuRSxTQUFTLGNBQWMsQ0FBQyxTQUEwQjtJQUM5QyxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFlLENBQUM7QUFDekQsQ0FBQztBQUNELFNBQVMsY0FBYyxDQUFDLEtBQWlCO0lBQ3JDLE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQW9CLENBQUM7QUFDMUQsQ0FBQztBQUVELGlHQUFpRztBQUNqRyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDeEIseUpBQXlKO0FBQ3pKLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3BDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQztBQUN2QixxSEFBcUg7QUFDckgsTUFBTSxxQkFBcUIsR0FBRyxFQUFFLENBQUM7QUFDakMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFFL0IsU0FBUyxTQUFTLENBQUMsUUFBb0M7SUFDbkQsT0FBTyxJQUFBLDRCQUFpQixFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBQ0QsU0FBUyxhQUFhLENBQUMsUUFBb0M7SUFDdkQsT0FBTyxJQUFBLDRCQUFpQixFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBQ0QsU0FBUyxT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IHsgRGF0YWJhc2UsIG5hbWVzcGFjZURhdGFiYXNlIH0gZnJvbSBcIi4vRGF0YWJhc2VcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uU2V0U3RvcmUsIHRyYW5zYWN0aW9uUmVhZCwgdHJhbnNhY3Rpb25NdXRhdGUsIHRyYW5zYWN0aW9uRGVsZXRlLCByZXBsYXlUcmFuc2FjdGlvblN0b3JlIH0gZnJvbSBcIi4vdHJhbnNhY3Rpb25TZXRcIjtcbmltcG9ydCB7IFN0b3JlZEVtYmVkZGluZywgRW1iZWRkaW5nRm9ybWF0LCBnZXRDbG9zZW5lc3MsIGVtYmVkZGluZ1RvRmxvYXQzMiwgcmVsZWFzZUZsb2F0MzIsIGVuY29kZUVtYmVkZGluZywgaGFzaEVtYmVkZGluZyB9IGZyb20gXCIuLi9lbWJlZGRpbmdGb3JtYXRzXCI7XG5cbmV4cG9ydCB0eXBlIEl2ZkNvbmZpZyA9IHtcbiAgICBtb2RlbDogc3RyaW5nO1xuICAgIGZvcm1hdDogRW1iZWRkaW5nRm9ybWF0O1xuICAgIC8vIFRhcmdldCBudW1iZXIgb2YgZW1iZWRkaW5ncyBwZXIgY2VsbC5cbiAgICBjZWxsVGFyZ2V0U2l6ZTogbnVtYmVyO1xufTtcblxuLy8gVGllcmVkIHN0b3JhZ2UuIEJlbG93IEZMQVRfTElNSVQgZW1iZWRkaW5ncyB0aGUgd2hvbGUgc2V0IGxpdmVzIGluIG9uZSBmbGF0IHRyYW5zYWN0aW9uIHNldCAobm8gSVZGKTsgb25jZSBpdCBncm93cyBwYXN0IHRoYXQgd2UgYnVpbGQgdGhlIElWRiAoY2VudHJvaWRzICsgcGVyLWNlbGwgc2V0cykgYW5kIHN0YXkgdGhlcmUgZm9yZXZlci4gYGNvdW50YCBpcyB0aGUgbGl2ZSBlbWJlZGRpbmcgY291bnQgKHJlLWRlcml2ZWQgZXhhY3RseSBvbiBhIHJlYnVpbGQpLiBgc3RlcHNgIHJlY29yZHMgb25lLXRpbWUgdXBncmFkZXMgdGhhdCBtdXN0IG5ldmVyIHJlLXJ1biBldmVuIGlmIHRoZSBzZXQgbGF0ZXIgc2hyaW5rcyBhbmQgcmVncm93cy5cbmV4cG9ydCB0eXBlIEl2ZkVtYmVkZGluZ1Jvb3QgPSB7XG4gICAgY29uZmlnOiBJdmZDb25maWc7XG4gICAgY291bnQ6IG51bWJlcjtcbiAgICBmbGF0OiBUcmFuc2FjdGlvblNldFN0b3JlPFN0b3JlZEVtYmVkZGluZz47XG4gICAgLy8gRGlyZWN0IHJlZiAtPiBlbWJlZGRpbmcgaW5kZXguIEVhY2ggZW50cnkgaXMgb25lIENCT1IgYmxvYiBhdCBpdHMgb3duIGtleSwgc28gYSBsb29rdXAgb3IgZGVsZXRlIGlzIGEgc2luZ2xlIGtleS12YWx1ZSBvcCAobm8gdHJhbnNhY3Rpb24tc2V0IHJlcGxheSkgYW5kIGRlbGV0ZURhdGEgY2FuIGRyb3AgaXQgKGl0J3MgYSBwcmltaXRpdmUgbGVhZikuIFJlZnMgYW5kIHRoZWlyIGVtYmVkZGluZ3MgbmV2ZXIgbW92ZSwgc28gYSByZWJ1aWxkIGxlYXZlcyB0aGlzIHVudG91Y2hlZC5cbiAgICBieVJlZjogeyBbcmVmOiBzdHJpbmddOiBVaW50OEFycmF5IH07XG4gICAgc3RlcHM6IHsgW3N0ZXA6IHN0cmluZ106IGJvb2xlYW4gfTtcbiAgICBjZW50cm9pZHM6IFRyYW5zYWN0aW9uU2V0U3RvcmU8U3RvcmVkRW1iZWRkaW5nPjtcbiAgICBjZWxsczogeyBbY2VsbElkOiBzdHJpbmddOiBUcmFuc2FjdGlvblNldFN0b3JlPFN0b3JlZEVtYmVkZGluZz4gfTtcbn07XG5cbmV4cG9ydCB0eXBlIEVtYmVkZGluZ0lucHV0ID0geyByZWY6IHN0cmluZzsgZW1iZWRkaW5nOiBTdG9yZWRFbWJlZGRpbmcgfTtcbmV4cG9ydCB0eXBlIFNlYXJjaEhpdCA9IHsgcmVmOiBzdHJpbmc7IGNsb3NlbmVzczogbnVtYmVyIH07XG50eXBlIENlbGxFbnRyeSA9IHsgcmVmOiBzdHJpbmc7IGVtYmVkZGluZzogU3RvcmVkRW1iZWRkaW5nIH07XG5cbmNvbnN0IGVtYmVkZGluZ0Nib3IgPSBuZXcgY2JvcnguRW5jb2Rlcih7IHN0cnVjdHVyZWRDbG9uZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIGVuY29kZVJlZlZhbHVlKGVtYmVkZGluZzogU3RvcmVkRW1iZWRkaW5nKTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuIGVtYmVkZGluZ0Nib3IuZW5jb2RlKGVtYmVkZGluZykgYXMgVWludDhBcnJheTtcbn1cbmZ1bmN0aW9uIGRlY29kZVJlZlZhbHVlKHZhbHVlOiBVaW50OEFycmF5KTogU3RvcmVkRW1iZWRkaW5nIHtcbiAgICByZXR1cm4gZW1iZWRkaW5nQ2Jvci5kZWNvZGUodmFsdWUpIGFzIFN0b3JlZEVtYmVkZGluZztcbn1cblxuLy8gQmVsb3cgdGhpcyBtYW55IGVtYmVkZGluZ3Mgd2Ugc2tpcCB0aGUgSVZGIGVudGlyZWx5IChmbGF0IHN0b3JlKS4gMTAyNCA9IGEgY2xlYW4gcG93ZXIgb2YgdHdvLlxuY29uc3QgRkxBVF9MSU1JVCA9IDEwMjQ7XG4vLyBGb3JjZSBhIGZyb20tc2NyYXRjaCByZWJ1aWxkIG9uY2UgYXQgZWFjaCBvZiB0aGVzZSAobXVsdGlwbGVzIG9mIDQgYWJvdmUgRkxBVF9MSU1JVCwgdXAgdG8gfjE2ayksIGdhdGVkIGJ5IGEgc3RlcCBmbGFnIHNvIGVhY2ggcnVucyBhdCBtb3N0IG9uY2UgZXZlci5cbmNvbnN0IFJFR0VORVJBVEVfQVQgPSBbNDA5NiwgMTYzODRdO1xuY29uc3QgU1RFUF9JVkYgPSBcIml2ZlwiO1xuLy8gT24gZGVsZXRlLCB0aGUgbWVtYmVyJ3MgZXhhY3QgY2VsbCBwbHVzIHRoaXMgbWFueSBuZWFyYnkgY2VsbHMgYXJlIGNoZWNrZWQsIGluIGNhc2UgYSByZWJ1aWxkIGxlZnQgaXQgbm9uLW9wdGltYWwuXG5jb25zdCBERUxFVEVfRkFMTEJBQ0tfQ0VMTFMgPSAxMDtcbmNvbnN0IFJFQkFMQU5DRV9JVEVSQVRJT05TID0gNDtcblxuZnVuY3Rpb24gZmxhdFN0b3JlKGRhdGFiYXNlOiBEYXRhYmFzZTxJdmZFbWJlZGRpbmdSb290Pik6IERhdGFiYXNlPFRyYW5zYWN0aW9uU2V0U3RvcmU8U3RvcmVkRW1iZWRkaW5nPj4ge1xuICAgIHJldHVybiBuYW1lc3BhY2VEYXRhYmFzZShkYXRhYmFzZSwgcm9vdCA9PiByb290LmZsYXQpO1xufVxuZnVuY3Rpb24gY2VudHJvaWRTdG9yZShkYXRhYmFzZTogRGF0YWJhc2U8SXZmRW1iZWRkaW5nUm9vdD4pOiBEYXRhYmFzZTxUcmFuc2FjdGlvblNldFN0b3JlPFN0b3JlZEVtYmVkZGluZz4+IHtcbiAgICByZXR1cm4gbmFtZXNwYWNlRGF0YWJhc2UoZGF0YWJhc2UsIHJvb3QgPT4gcm9vdC5jZW50cm9pZHMpO1xufVxuZnVuY3Rpb24gY2VsbFN0b3JlKGRhdGFiYXNlOiBEYXRhYmFzZTxJdmZFbWJlZGRpbmdSb290PiwgY2VsbElkOiBzdHJpbmcpOiBEYXRhYmFzZTxUcmFuc2FjdGlvblNldFN0b3JlPFN0b3JlZEVtYmVkZGluZz4+IHtcbiAgICByZXR1cm4gbmFtZXNwYWNlRGF0YWJhc2UoZGF0YWJhc2UsIHJvb3QgPT4gcm9vdC5jZWxsc1tjZWxsSWRdKTtcbn1cblxuZnVuY3Rpb24gcmFua0NlbGxzQnlDbG9zZW5lc3MoZW1iZWRkaW5nOiBTdG9yZWRFbWJlZGRpbmcsIGNlbnRyb2lkczogTWFwPHN0cmluZywgU3RvcmVkRW1iZWRkaW5nPik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByYW5rZWQ6IHsgY2VsbElkOiBzdHJpbmc7IGNsb3NlbmVzczogbnVtYmVyIH1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2VsbElkIG9mIGNlbnRyb2lkcy5rZXlzKCkpIHtcbiAgICAgICAgcmFua2VkLnB1c2goeyBjZWxsSWQsIGNsb3NlbmVzczogZ2V0Q2xvc2VuZXNzKGVtYmVkZGluZywgY2VudHJvaWRzLmdldChjZWxsSWQpISkgfSk7XG4gICAgfVxuICAgIHJhbmtlZC5zb3J0KChsZWZ0LCByaWdodCkgPT4gcmlnaHQuY2xvc2VuZXNzIC0gbGVmdC5jbG9zZW5lc3MpO1xuICAgIHJldHVybiByYW5rZWQubWFwKGVudHJ5ID0+IGVudHJ5LmNlbGxJZCk7XG59XG5cbi8vIFN5bmNlZCBmdW5jdGlvbnMgcmVydW4gKGFuZCBhcmUgcHJlZGljdGVkIGNsaWVudC1zaWRlKSwgc28gdGhlIHJlYmFsYW5jZSByb2xsIG11c3QgYmUgaWRlbnRpY2FsIG9uIGV2ZXJ5IHJ1biBvZiB0aGUgc2FtZSBjYWxsIOKAlCBkZXJpdmUgaXQgZnJvbSB0aGUgaW5zZXJ0ZWQgaXRlbXMgaW5zdGVhZCBvZiBNYXRoLnJhbmRvbSgpLiBGTlYtMWEgb3ZlciBlYWNoIHJlZiBwbHVzIGl0cyBlbWJlZGRpbmcgaGFzaCwgbWFwcGVkIHRvIFswLCAxKS5cbmZ1bmN0aW9uIHNlZWRlZFJhbmRvbUZyb21JdGVtcyhpdGVtczogRW1iZWRkaW5nSW5wdXRbXSk6IG51bWJlciB7XG4gICAgbGV0IGhhc2ggPSAyMTY2MTM2MjYxO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICBjb25zdCBrZXkgPSBpdGVtLnJlZiArIGhhc2hFbWJlZGRpbmcoaXRlbS5lbWJlZGRpbmcpO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwga2V5Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgaGFzaCBePSBrZXkuY2hhckNvZGVBdChpbmRleCk7XG4gICAgICAgICAgICBoYXNoID0gTWF0aC5pbXVsKGhhc2gsIDE2Nzc3NjE5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKGhhc2ggPj4+IDApIC8gMiAqKiAzMjtcbn1cblxuLy8gUGVyLXdyaXRlIGNoYW5jZSBvZiBhIGZ1bGwgcmVidWlsZC4gWmVybyBhdC91bmRlciB0aGUgdGFyZ2V0IHNpemUsIHRoZW4gcmlzZXMgKGN1YmljYWxseSkgcGFzdCBpdCBzbyBjZWxscyBzdGF5IHJvdWdobHkgYmV0d2VlbiB0YXJnZXQgYW5kIH4yeCB0YXJnZXQuXG5mdW5jdGlvbiByZWJhbGFuY2VQcm9iYWJpbGl0eShmaWxsUmF0aW86IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKGZpbGxSYXRpbyA8PSAxKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBvdmVyID0gZmlsbFJhdGlvIC0gMTtcbiAgICByZXR1cm4gTWF0aC5taW4oMSwgb3ZlciAqIG92ZXIgKiBvdmVyICogMC4yNSk7XG59XG5cbi8vIGstbWVhbnMuIERlY29kZXMgZXZlcnkgbWVtYmVyIHRvIGEgcG9vbGVkIGZsb2F0MzIgYnVmZmVyIE9OQ0UsIHRoZW4gYXNzaWducyB3aXRoIGEgcGxhaW4gaW50ZXJuYWwgZmxvYXQgZG90IChubyBnZXRDbG9zZW5lc3MgY2FsbCDigJQgY29tcGFyaW5nIHR3byBmbG9hdCB2ZWN0b3JzIGlzIHRyaXZpYWwpIGFuZCBrZWVwcyBjZW50cm9pZHMgYXMgZmxvYXQgbWVhbnMsIGVuY29kaW5nIHRoZW0gdG8gU3RvcmVkRW1iZWRkaW5nIG9ubHkgYXQgdGhlIGVuZC4gUmVsZWFzZXMgdGhlIGJvcnJvd2VkIGJ1ZmZlcnMgd2hlbiBkb25lLlxuZnVuY3Rpb24gY2x1c3Rlck1lbWJlcnMobWVtYmVyczogQ2VsbEVudHJ5W10sIGNsdXN0ZXJDb3VudDogbnVtYmVyLCBjb25maWc6IEl2ZkNvbmZpZyk6IHsgY2VudHJvaWQ6IFN0b3JlZEVtYmVkZGluZzsgbWVtYmVyczogQ2VsbEVudHJ5W10gfVtdIHtcbiAgICBjb25zdCBtZW1iZXJGbG9hdHM6IEZsb2F0MzJBcnJheVtdID0gW107XG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgbWVtYmVycykge1xuICAgICAgICBtZW1iZXJGbG9hdHMucHVzaChlbWJlZGRpbmdUb0Zsb2F0MzIobWVtYmVyLmVtYmVkZGluZywgdHJ1ZSkpO1xuICAgIH1cbiAgICBjb25zdCBsZW5ndGggPSBtZW1iZXJGbG9hdHMubGVuZ3RoID8gbWVtYmVyRmxvYXRzWzBdLmxlbmd0aCA6IDA7XG4gICAgbGV0IGNlbnRyb2lkczogRmxvYXQzMkFycmF5W10gPSBbXTtcbiAgICBjb25zdCBzZWVkU3RlcCA9IG1lbWJlcnMubGVuZ3RoIC8gY2x1c3RlckNvdW50O1xuICAgIGZvciAobGV0IGNsdXN0ZXJJbmRleCA9IDA7IGNsdXN0ZXJJbmRleCA8IGNsdXN0ZXJDb3VudDsgY2x1c3RlckluZGV4KyspIHtcbiAgICAgICAgY2VudHJvaWRzLnB1c2gobmV3IEZsb2F0MzJBcnJheShtZW1iZXJGbG9hdHNbTWF0aC5mbG9vcihjbHVzdGVySW5kZXggKiBzZWVkU3RlcCldKSk7XG4gICAgfVxuICAgIGxldCBncm91cHM6IG51bWJlcltdW10gPSBbXTtcbiAgICBmb3IgKGxldCBpdGVyYXRpb24gPSAwOyBpdGVyYXRpb24gPCBSRUJBTEFOQ0VfSVRFUkFUSU9OUzsgaXRlcmF0aW9uKyspIHtcbiAgICAgICAgZ3JvdXBzID0gW107XG4gICAgICAgIGZvciAobGV0IGNsdXN0ZXJJbmRleCA9IDA7IGNsdXN0ZXJJbmRleCA8IGNlbnRyb2lkcy5sZW5ndGg7IGNsdXN0ZXJJbmRleCsrKSB7XG4gICAgICAgICAgICBncm91cHMucHVzaChbXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgbWVtYmVySW5kZXggPSAwOyBtZW1iZXJJbmRleCA8IG1lbWJlckZsb2F0cy5sZW5ndGg7IG1lbWJlckluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1lbWJlckZsb2F0ID0gbWVtYmVyRmxvYXRzW21lbWJlckluZGV4XTtcbiAgICAgICAgICAgIGxldCBiZXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgbGV0IGJlc3REb3QgPSAtSW5maW5pdHk7XG4gICAgICAgICAgICBmb3IgKGxldCBjZW50cm9pZEluZGV4ID0gMDsgY2VudHJvaWRJbmRleCA8IGNlbnRyb2lkcy5sZW5ndGg7IGNlbnRyb2lkSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNlbnRyb2lkRmxvYXQgPSBjZW50cm9pZHNbY2VudHJvaWRJbmRleF07XG4gICAgICAgICAgICAgICAgbGV0IGRvdCA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZGltID0gMDsgZGltIDwgbGVuZ3RoOyBkaW0rKykge1xuICAgICAgICAgICAgICAgICAgICBkb3QgKz0gbWVtYmVyRmxvYXRbZGltXSAqIGNlbnRyb2lkRmxvYXRbZGltXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGRvdCA+IGJlc3REb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgYmVzdERvdCA9IGRvdDtcbiAgICAgICAgICAgICAgICAgICAgYmVzdEluZGV4ID0gY2VudHJvaWRJbmRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncm91cHNbYmVzdEluZGV4XS5wdXNoKG1lbWJlckluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0Q2VudHJvaWRzOiBGbG9hdDMyQXJyYXlbXSA9IFtdO1xuICAgICAgICBjb25zdCBuZXh0R3JvdXBzOiBudW1iZXJbXVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgICAgICAgICBpZiAoIWdyb3VwLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVhbiA9IG5ldyBGbG9hdDMyQXJyYXkobGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbWVtYmVySW5kZXggb2YgZ3JvdXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZW1iZXJGbG9hdCA9IG1lbWJlckZsb2F0c1ttZW1iZXJJbmRleF07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZGltID0gMDsgZGltIDwgbGVuZ3RoOyBkaW0rKykge1xuICAgICAgICAgICAgICAgICAgICBtZWFuW2RpbV0gKz0gbWVtYmVyRmxvYXRbZGltXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbm9ybSA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBkaW0gPSAwOyBkaW0gPCBsZW5ndGg7IGRpbSsrKSB7XG4gICAgICAgICAgICAgICAgbm9ybSArPSBtZWFuW2RpbV0gKiBtZWFuW2RpbV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBtYWduaXR1ZGUgPSBNYXRoLnNxcnQobm9ybSkgfHwgMTtcbiAgICAgICAgICAgIGZvciAobGV0IGRpbSA9IDA7IGRpbSA8IGxlbmd0aDsgZGltKyspIHtcbiAgICAgICAgICAgICAgICBtZWFuW2RpbV0gLz0gbWFnbml0dWRlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dENlbnRyb2lkcy5wdXNoKG1lYW4pO1xuICAgICAgICAgICAgbmV4dEdyb3Vwcy5wdXNoKGdyb3VwKTtcbiAgICAgICAgfVxuICAgICAgICBjZW50cm9pZHMgPSBuZXh0Q2VudHJvaWRzO1xuICAgICAgICBncm91cHMgPSBuZXh0R3JvdXBzO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQ6IHsgY2VudHJvaWQ6IFN0b3JlZEVtYmVkZGluZzsgbWVtYmVyczogQ2VsbEVudHJ5W10gfVtdID0gW107XG4gICAgZm9yIChsZXQgY2x1c3RlckluZGV4ID0gMDsgY2x1c3RlckluZGV4IDwgY2VudHJvaWRzLmxlbmd0aDsgY2x1c3RlckluZGV4KyspIHtcbiAgICAgICAgY29uc3QgY2VudHJvaWQgPSBlbmNvZGVFbWJlZGRpbmcoeyBpbnB1dDogY2VudHJvaWRzW2NsdXN0ZXJJbmRleF0sIGZvcm1hdDogY29uZmlnLmZvcm1hdCwgbW9kZWw6IGNvbmZpZy5tb2RlbCB9KTtcbiAgICAgICAgY29uc3QgY2VsbE1lbWJlcnM6IENlbGxFbnRyeVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbWVtYmVySW5kZXggb2YgZ3JvdXBzW2NsdXN0ZXJJbmRleF0pIHtcbiAgICAgICAgICAgIGNlbGxNZW1iZXJzLnB1c2gobWVtYmVyc1ttZW1iZXJJbmRleF0pO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdC5wdXNoKHsgY2VudHJvaWQsIG1lbWJlcnM6IGNlbGxNZW1iZXJzIH0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG1lbWJlckZsb2F0IG9mIG1lbWJlckZsb2F0cykge1xuICAgICAgICByZWxlYXNlRmxvYXQzMihtZW1iZXJGbG9hdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8vIFJlLWNsdXN0ZXIgRVZFUlkgZW1iZWRkaW5nIChmbGF0IHRpZXIgKyBhbGwgY2VsbHMpIGludG8gYSBmcmVzaCBJVkYsIGNsZWFyIHRoZSBmbGF0IHRpZXIsIGFuZCBtYXJrIElWRiBtb2RlLiBUaGlzIGlzIHRoZSByZWFycmFuZ2VyOiBydW4gcHJvYmFiaWxpc3RpY2FsbHkgYXMgdGhlIHNldCBncm93cywgb25jZSBhdCBlYWNoIHJlZ2VuZXJhdGUgdGhyZXNob2xkLCBhbmQgb25jZSB0byB1cGdyYWRlIGZyb20gZmxhdC4gUmVhZHMgZXZlcnl0aGluZyBpdCB1c2VzLCBzbyBpdCBiYWlscyAoZG9lcyBub3RoaW5nKSBpZiBhbnl0aGluZyBpc24ndCBzeW5jZWQgYW5kIHRoZSBjYWxsZXIncyByZXRyeSByZS1ydW5zIGl0OyBubyBjYWxsZXIgY2FyZXMgYWJvdXQgaXRzIHJlc3VsdC5cbmV4cG9ydCBmdW5jdGlvbiByZWJ1aWxkU3RydWN0dXJlKGRhdGFiYXNlOiBEYXRhYmFzZTxJdmZFbWJlZGRpbmdSb290Pik6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpZyA9IGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gcm9vdC5jb25maWcpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm47XG4gICAgY29uc3Qgc3RlcHMgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHJvb3Quc3RlcHMpO1xuICAgIGlmICghc3RlcHMpIHJldHVybjtcblxuICAgIGNvbnN0IGFsbE1lbWJlcnM6IENlbGxFbnRyeVtdID0gW107XG4gICAgLy8gT25seSB0aGUgb25lLXRpbWUgZmxhdC0+SVZGIHVwZ3JhZGUgcHVsbHMgZnJvbSB0aGUgZmxhdCB0aWVyLiBPbmNlIFNURVBfSVZGIGlzIHNldCB0aGUgZmxhdCBkYXRhIGhhcyBhbHJlYWR5IGJlZW4gZm9sZGVkIGludG8gY2VsbHMsIHNvIGxhdGVyIHJlYnVpbGRzIGlnbm9yZSBpdC4gSXQncyBsZWZ0IGluIHBsYWNlLCBuZXZlciBkZWxldGVkOiBkZWxldGVEYXRhIG9ubHkgcmVtb3ZlcyBwcmltaXRpdmUgbGVhdmVzLCBub3QgYSB3aG9sZSBzdG9yZSwgYW5kIHRoZSBmbGF0IHRpZXIgaXMgc21hbGwgZW5vdWdoIG5vdCB0byBtYXR0ZXIuXG4gICAgaWYgKCFzdGVwc1tTVEVQX0lWRl0pIHtcbiAgICAgICAgY29uc3QgZmxhdCA9IHRyYW5zYWN0aW9uUmVhZChmbGF0U3RvcmUoZGF0YWJhc2UpKTtcbiAgICAgICAgaWYgKCFmbGF0KSByZXR1cm47XG4gICAgICAgIGZvciAoY29uc3QgcmVmIG9mIGZsYXQua2V5cygpKSB7XG4gICAgICAgICAgICBhbGxNZW1iZXJzLnB1c2goeyByZWYsIGVtYmVkZGluZzogZmxhdC5nZXQocmVmKSEgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2VudHJvaWRzID0gdHJhbnNhY3Rpb25SZWFkKGNlbnRyb2lkU3RvcmUoZGF0YWJhc2UpKTtcbiAgICBpZiAoIWNlbnRyb2lkcykgcmV0dXJuO1xuICAgIGNvbnN0IG9sZENlbGxJZHMgPSBBcnJheS5mcm9tKGNlbnRyb2lkcy5rZXlzKCkpO1xuICAgIGNvbnN0IGNlbGxTdG9yZXMgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IG9sZENlbGxJZHMubWFwKGNlbGxJZCA9PiByb290LmNlbGxzW2NlbGxJZF0pKTtcbiAgICBpZiAoIWNlbGxTdG9yZXMpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IHN0b3JlIG9mIGNlbGxTdG9yZXMpIHtcbiAgICAgICAgY29uc3QgbWVtYmVycyA9IHJlcGxheVRyYW5zYWN0aW9uU3RvcmU8U3RvcmVkRW1iZWRkaW5nPihzdG9yZSk7XG4gICAgICAgIGZvciAoY29uc3QgcmVmIG9mIG1lbWJlcnMua2V5cygpKSB7XG4gICAgICAgICAgICBhbGxNZW1iZXJzLnB1c2goeyByZWYsIGVtYmVkZGluZzogbWVtYmVycy5nZXQocmVmKSEgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFhbGxNZW1iZXJzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY2x1c3RlckNvdW50ID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZChhbGxNZW1iZXJzLmxlbmd0aCAvIGNvbmZpZy5jZWxsVGFyZ2V0U2l6ZSkpO1xuICAgIGNvbnN0IGNsdXN0ZXJzID0gY2x1c3Rlck1lbWJlcnMoYWxsTWVtYmVycywgY2x1c3RlckNvdW50LCBjb25maWcpO1xuXG4gICAgY29uc3QgbmV3Q2VsbElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGNlbnRyb2lkV3JpdGVzOiB7IGtleTogc3RyaW5nOyB2YWx1ZTogU3RvcmVkRW1iZWRkaW5nIHwgdW5kZWZpbmVkIH1bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2x1c3RlciBvZiBjbHVzdGVycykge1xuICAgICAgICBjb25zdCBjZWxsSWQgPSBoYXNoRW1iZWRkaW5nKGNsdXN0ZXIuY2VudHJvaWQpO1xuICAgICAgICBuZXdDZWxsSWRzLmFkZChjZWxsSWQpO1xuICAgICAgICBjZW50cm9pZFdyaXRlcy5wdXNoKHsga2V5OiBjZWxsSWQsIHZhbHVlOiBjbHVzdGVyLmNlbnRyb2lkIH0pO1xuICAgICAgICBjb25zdCBtZW1iZXJXcml0ZXMgPSBjbHVzdGVyLm1lbWJlcnMubWFwKG1lbWJlciA9PiAoeyBrZXk6IG1lbWJlci5yZWYsIHZhbHVlOiBtZW1iZXIuZW1iZWRkaW5nIH0pKTtcbiAgICAgICAgdHJhbnNhY3Rpb25NdXRhdGUoY2VsbFN0b3JlKGRhdGFiYXNlLCBjZWxsSWQpLCBtZW1iZXJXcml0ZXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG9sZENlbGxJZCBvZiBvbGRDZWxsSWRzKSB7XG4gICAgICAgIGlmIChuZXdDZWxsSWRzLmhhcyhvbGRDZWxsSWQpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjZW50cm9pZFdyaXRlcy5wdXNoKHsga2V5OiBvbGRDZWxsSWQsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgIHRyYW5zYWN0aW9uRGVsZXRlKGNlbGxTdG9yZShkYXRhYmFzZSwgb2xkQ2VsbElkKSk7XG4gICAgfVxuICAgIHRyYW5zYWN0aW9uTXV0YXRlKGNlbnRyb2lkU3RvcmUoZGF0YWJhc2UpLCBjZW50cm9pZFdyaXRlcyk7XG4gICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5jb3VudCwgYWxsTWVtYmVycy5sZW5ndGgpO1xuICAgIGRhdGFiYXNlLndyaXRlRGF0YShyb290ID0+IHJvb3Quc3RlcHNbU1RFUF9JVkZdLCB0cnVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaEVtYmVkZGluZ3MoXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+LFxuICAgIHF1ZXJ5OiBTdG9yZWRFbWJlZGRpbmcsXG4gICAgb3B0aW9uczogeyBwcm9iZUJ1ZGdldDogbnVtYmVyOyByZXN1bHRDb3VudDogbnVtYmVyIH0sXG4pOiBTZWFyY2hIaXRbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29uZmlnID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiByb290LmNvbmZpZyk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3RlcHMgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHJvb3Quc3RlcHMpO1xuICAgIGlmICghc3RlcHMpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBoaXRzOiBTZWFyY2hIaXRbXSA9IFtdO1xuICAgIGlmICghc3RlcHNbU1RFUF9JVkZdKSB7XG4gICAgICAgIGNvbnN0IGZsYXQgPSB0cmFuc2FjdGlvblJlYWQoZmxhdFN0b3JlKGRhdGFiYXNlKSk7XG4gICAgICAgIGlmICghZmxhdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCByZWYgb2YgZmxhdC5rZXlzKCkpIHtcbiAgICAgICAgICAgIGhpdHMucHVzaCh7IHJlZiwgY2xvc2VuZXNzOiBnZXRDbG9zZW5lc3MocXVlcnksIGZsYXQuZ2V0KHJlZikhKSB9KTtcbiAgICAgICAgfVxuICAgICAgICBoaXRzLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiByaWdodC5jbG9zZW5lc3MgLSBsZWZ0LmNsb3NlbmVzcyk7XG4gICAgICAgIHJldHVybiBoaXRzLnNsaWNlKDAsIG9wdGlvbnMucmVzdWx0Q291bnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGNlbnRyb2lkcyA9IHRyYW5zYWN0aW9uUmVhZChjZW50cm9pZFN0b3JlKGRhdGFiYXNlKSk7XG4gICAgaWYgKCFjZW50cm9pZHMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKCFjZW50cm9pZHMuc2l6ZSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHByb2JlQ2VsbENvdW50ID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKG9wdGlvbnMucHJvYmVCdWRnZXQgLyBjb25maWcuY2VsbFRhcmdldFNpemUpKTtcbiAgICBjb25zdCBwcm9iZUNlbGxJZHMgPSByYW5rQ2VsbHNCeUNsb3NlbmVzcyhxdWVyeSwgY2VudHJvaWRzKS5zbGljZSgwLCBwcm9iZUNlbGxDb3VudCk7XG4gICAgY29uc3Qgc3RvcmVzID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiBwcm9iZUNlbGxJZHMubWFwKGNlbGxJZCA9PiByb290LmNlbGxzW2NlbGxJZF0pKTtcbiAgICBpZiAoIXN0b3JlcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IHN0b3JlIG9mIHN0b3Jlcykge1xuICAgICAgICBjb25zdCBtZW1iZXJzID0gcmVwbGF5VHJhbnNhY3Rpb25TdG9yZTxTdG9yZWRFbWJlZGRpbmc+KHN0b3JlKTtcbiAgICAgICAgZm9yIChjb25zdCByZWYgb2YgbWVtYmVycy5rZXlzKCkpIHtcbiAgICAgICAgICAgIGhpdHMucHVzaCh7IHJlZiwgY2xvc2VuZXNzOiBnZXRDbG9zZW5lc3MocXVlcnksIG1lbWJlcnMuZ2V0KHJlZikhKSB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoaXRzLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiByaWdodC5jbG9zZW5lc3MgLSBsZWZ0LmNsb3NlbmVzcyk7XG4gICAgcmV0dXJuIGhpdHMuc2xpY2UoMCwgb3B0aW9ucy5yZXN1bHRDb3VudCk7XG59XG5cbi8vIERpcmVjdCByZWYgLT4gc3RvcmVkIGVtYmVkZGluZyBsb29rdXAgdGhyb3VnaCB0aGUgYnlSZWYgaW5kZXg6IG9uZSBrZXktdmFsdWUgcmVhZCBwZXIgcmVmLCBubyBjZWxsIHNjYW4uIEEgc2VhcmNoIHJldHVybnMgcmVmczsgdGhpcyBmZXRjaGVzIHRoZSBkYXRhIGJlaGluZCB0aGVtLiBTa2lwcyByZWZzIHRoYXQgYXJlbid0IHByZXNlbnQ7IHVuZGVmaW5lZCBpZiBub3Qgc3luY2VkLlxuZXhwb3J0IGZ1bmN0aW9uIGxvb2t1cEVtYmVkZGluZ3MoXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+LFxuICAgIHJlZnM6IHN0cmluZ1tdLFxuKTogTWFwPHN0cmluZywgU3RvcmVkRW1iZWRkaW5nPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdmFsdWVzID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiByZWZzLm1hcChyZWYgPT4gcm9vdC5ieVJlZltyZWZdKSk7XG4gICAgaWYgKCF2YWx1ZXMpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIFN0b3JlZEVtYmVkZGluZz4oKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcmVmcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZXNbaW5kZXhdO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zZXQocmVmc1tpbmRleF0sIGRlY29kZVJlZlZhbHVlKHZhbHVlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEVtYmVkZGluZ3MoXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPEl2ZkVtYmVkZGluZ1Jvb3Q+LFxuICAgIGl0ZW1zOiBFbWJlZGRpbmdJbnB1dFtdLFxuKSB7XG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBjb25maWcgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHJvb3QuY29uZmlnKTtcbiAgICBjb25zdCBzdGVwcyA9IGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gcm9vdC5zdGVwcyk7XG4gICAgbGV0IGNvdW50ID0gZGF0YWJhc2UucmVhZERhdGEocm9vdCA9PiByb290LmNvdW50KTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuO1xuICAgIGlmICghc3RlcHMpIHJldHVybjtcbiAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld0NvdW50ID0gY291bnQgKyBpdGVtcy5sZW5ndGg7XG5cbiAgICBpZiAoIXN0ZXBzW1NURVBfSVZGXSkge1xuICAgICAgICBjb25zdCBmbGF0V3JpdGVzID0gaXRlbXMubWFwKGl0ZW0gPT4gKHsga2V5OiBpdGVtLnJlZiwgdmFsdWU6IGl0ZW0uZW1iZWRkaW5nIH0pKTtcbiAgICAgICAgdHJhbnNhY3Rpb25NdXRhdGUoZmxhdFN0b3JlKGRhdGFiYXNlKSwgZmxhdFdyaXRlcyk7XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICAgICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5ieVJlZltpdGVtLnJlZl0sIGVuY29kZVJlZlZhbHVlKGl0ZW0uZW1iZWRkaW5nKSk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5jb3VudCwgbmV3Q291bnQpO1xuICAgICAgICBpZiAobmV3Q291bnQgPiBGTEFUX0xJTUlUKSB7XG4gICAgICAgICAgICByZWJ1aWxkU3RydWN0dXJlKGRhdGFiYXNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2VudHJvaWRzID0gdHJhbnNhY3Rpb25SZWFkKGNlbnRyb2lkU3RvcmUoZGF0YWJhc2UpKTtcbiAgICBpZiAoIWNlbnRyb2lkcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBpdGVtc0J5Q2VsbCA9IG5ldyBNYXA8c3RyaW5nLCBFbWJlZGRpbmdJbnB1dFtdPigpO1xuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICBjb25zdCBjZWxsSWQgPSByYW5rQ2VsbHNCeUNsb3NlbmVzcyhpdGVtLmVtYmVkZGluZywgY2VudHJvaWRzKVswXTtcbiAgICAgICAgbGV0IGdyb3VwID0gaXRlbXNCeUNlbGwuZ2V0KGNlbGxJZCk7XG4gICAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgICAgIGdyb3VwID0gW107XG4gICAgICAgICAgICBpdGVtc0J5Q2VsbC5zZXQoY2VsbElkLCBncm91cCk7XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXAucHVzaChpdGVtKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjZWxsSWQgb2YgaXRlbXNCeUNlbGwua2V5cygpKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gaXRlbXNCeUNlbGwuZ2V0KGNlbGxJZCkhO1xuICAgICAgICBjb25zdCBtZW1iZXJXcml0ZXMgPSBncm91cC5tYXAoaXRlbSA9PiAoeyBrZXk6IGl0ZW0ucmVmLCB2YWx1ZTogaXRlbS5lbWJlZGRpbmcgfSkpO1xuICAgICAgICB0cmFuc2FjdGlvbk11dGF0ZShjZWxsU3RvcmUoZGF0YWJhc2UsIGNlbGxJZCksIG1lbWJlcldyaXRlcyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgICAgICBkYXRhYmFzZS53cml0ZURhdGEocm9vdCA9PiByb290LmJ5UmVmW2l0ZW0ucmVmXSwgZW5jb2RlUmVmVmFsdWUoaXRlbS5lbWJlZGRpbmcpKTtcbiAgICB9XG4gICAgZGF0YWJhc2Uud3JpdGVEYXRhKHJvb3QgPT4gcm9vdC5jb3VudCwgbmV3Q291bnQpO1xuXG5cbiAgICBjb25zdCBzaG91bGRSZWdlbmVyYXRlID0gKGRhdGFiYXNlOiBEYXRhYmFzZTxJdmZFbWJlZGRpbmdSb290PikgPT4ge1xuICAgICAgICBsZXQgc3RlcHMgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHJvb3Quc3RlcHMpO1xuICAgICAgICBpZiAoIXN0ZXBzKSByZXR1cm47XG4gICAgICAgIGZvciAoY29uc3QgdGhyZXNob2xkIG9mIFJFR0VORVJBVEVfQVQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBOYW1lID0gXCJyZWdlblwiICsgdGhyZXNob2xkO1xuICAgICAgICAgICAgaWYgKCFzdGVwc1tzdGVwTmFtZV0gJiYgbmV3Q291bnQgPiB0aHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICBkYXRhYmFzZS53cml0ZURhdGEocm9vdCA9PiByb290LnN0ZXBzW3N0ZXBOYW1lXSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXZlcmFnZUZpbGwgPSBuZXdDb3VudCAvIE1hdGgubWF4KDEsIGNlbnRyb2lkcy5zaXplKSAvIGNvbmZpZy5jZWxsVGFyZ2V0U2l6ZTtcbiAgICAgICAgaWYgKHNlZWRlZFJhbmRvbUZyb21JdGVtcyhpdGVtcykgPCByZWJhbGFuY2VQcm9iYWJpbGl0eShhdmVyYWdlRmlsbCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIGlmIChzaG91bGRSZWdlbmVyYXRlKGRhdGFiYXNlKSkge1xuICAgICAgICByZWJ1aWxkU3RydWN0dXJlKGRhdGFiYXNlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVFbWJlZGRpbmdzKFxuICAgIGRhdGFiYXNlOiBEYXRhYmFzZTxJdmZFbWJlZGRpbmdSb290PixcbiAgICByZWZzOiBzdHJpbmdbXSxcbikge1xuICAgIGlmICghcmVmcy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBzdGVwcyA9IGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gcm9vdC5zdGVwcyk7XG4gICAgY29uc3QgY291bnQgPSBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IHJvb3QuY291bnQpO1xuICAgIGlmICghc3RlcHMpIHJldHVybjtcbiAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgaWYgKCFzdGVwc1tTVEVQX0lWRl0pIHtcbiAgICAgICAgY29uc3QgZmxhdERlbGV0ZXMgPSByZWZzLm1hcChyZWYgPT4gKHsga2V5OiByZWYsIHZhbHVlOiB1bmRlZmluZWQgfSkpO1xuICAgICAgICB0cmFuc2FjdGlvbk11dGF0ZShmbGF0U3RvcmUoZGF0YWJhc2UpLCBmbGF0RGVsZXRlcyk7XG4gICAgICAgIGZvciAoY29uc3QgcmVmIG9mIHJlZnMpIHtcbiAgICAgICAgICAgIGRhdGFiYXNlLmRlbGV0ZURhdGEocm9vdCA9PiByb290LmJ5UmVmW3JlZl0pO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFiYXNlLndyaXRlRGF0YShyb290ID0+IHJvb3QuY291bnQsIE1hdGgubWF4KDAsIGNvdW50IC0gcmVmcy5sZW5ndGgpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNlbnRyb2lkcyA9IHRyYW5zYWN0aW9uUmVhZChjZW50cm9pZFN0b3JlKGRhdGFiYXNlKSk7XG4gICAgaWYgKCFjZW50cm9pZHMpIHJldHVybjtcbiAgICBpZiAoIWNlbnRyb2lkcy5zaXplKSByZXR1cm47XG5cbiAgICAvLyBMb29rIHVwIGVhY2ggcmVmJ3MgZW1iZWRkaW5nIHRocm91Z2ggYnlSZWYsIHRoZW4gcmFuayBpdHMgY2VsbHMgdGhlIHdheSBhbiBpbnNlcnQgd291bGQsIHNvIHdlIGRlbGV0ZSBmcm9tIHRoZSBjZWxsIGl0IGFjdHVhbGx5IGxhbmRlZCBpbiAocGx1cyBhIGZldyBuZWlnaGJvdXJzLCBpbiBjYXNlIGEgcmVidWlsZCBudWRnZWQgaXQgYWNyb3NzIGEgYm91bmRhcnkpLlxuICAgIGNvbnN0IHJlZlZhbHVlcyA9IGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gcmVmcy5tYXAocmVmID0+IHJvb3QuYnlSZWZbcmVmXSkpO1xuICAgIGlmICghcmVmVmFsdWVzKSByZXR1cm47XG4gICAgY29uc3QgY2FuZGlkYXRlc0J5SXRlbTogeyByZWY6IHN0cmluZzsgY2VsbElkczogc3RyaW5nW10gfVtdID0gW107XG4gICAgY29uc3QgY2FuZGlkYXRlU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHJlZnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gcmVmVmFsdWVzW2luZGV4XTtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW1iZWRkaW5nID0gZGVjb2RlUmVmVmFsdWUodmFsdWUpO1xuICAgICAgICBjb25zdCBjZWxsSWRzID0gcmFua0NlbGxzQnlDbG9zZW5lc3MoZW1iZWRkaW5nLCBjZW50cm9pZHMpLnNsaWNlKDAsIDEgKyBERUxFVEVfRkFMTEJBQ0tfQ0VMTFMpO1xuICAgICAgICBjYW5kaWRhdGVzQnlJdGVtLnB1c2goeyByZWY6IHJlZnNbaW5kZXhdLCBjZWxsSWRzIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IGNlbGxJZCBvZiBjZWxsSWRzKSB7XG4gICAgICAgICAgICBjYW5kaWRhdGVTZXQuYWRkKGNlbGxJZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjYW5kaWRhdGVDZWxsSWRzID0gQXJyYXkuZnJvbShjYW5kaWRhdGVTZXQpO1xuICAgIGNvbnN0IHN0b3JlcyA9IGRhdGFiYXNlLnJlYWREYXRhKHJvb3QgPT4gY2FuZGlkYXRlQ2VsbElkcy5tYXAoY2VsbElkID0+IHJvb3QuY2VsbHNbY2VsbElkXSkpO1xuICAgIGlmICghc3RvcmVzKSByZXR1cm47XG4gICAgY29uc3QgbWVtYmVyc0J5Q2VsbCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBTdG9yZWRFbWJlZGRpbmc+PigpO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjYW5kaWRhdGVDZWxsSWRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBtZW1iZXJzQnlDZWxsLnNldChjYW5kaWRhdGVDZWxsSWRzW2luZGV4XSwgcmVwbGF5VHJhbnNhY3Rpb25TdG9yZShzdG9yZXNbaW5kZXhdKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsZXRlc0J5Q2VsbCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgICBjb25zdCBkZWxldGVkUmVmczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzQnlJdGVtKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2VsbElkIG9mIGNhbmRpZGF0ZS5jZWxsSWRzKSB7XG4gICAgICAgICAgICBjb25zdCBtZW1iZXJzID0gbWVtYmVyc0J5Q2VsbC5nZXQoY2VsbElkKTtcbiAgICAgICAgICAgIGlmICghbWVtYmVycyB8fCAhbWVtYmVycy5oYXMoY2FuZGlkYXRlLnJlZikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjZWxsUmVmcyA9IGRlbGV0ZXNCeUNlbGwuZ2V0KGNlbGxJZCk7XG4gICAgICAgICAgICBpZiAoIWNlbGxSZWZzKSB7XG4gICAgICAgICAgICAgICAgY2VsbFJlZnMgPSBbXTtcbiAgICAgICAgICAgICAgICBkZWxldGVzQnlDZWxsLnNldChjZWxsSWQsIGNlbGxSZWZzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNlbGxSZWZzLnB1c2goY2FuZGlkYXRlLnJlZik7XG4gICAgICAgICAgICBkZWxldGVkUmVmcy5wdXNoKGNhbmRpZGF0ZS5yZWYpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNlbGxJZCBvZiBkZWxldGVzQnlDZWxsLmtleXMoKSkge1xuICAgICAgICBjb25zdCBjZWxsUmVmcyA9IGRlbGV0ZXNCeUNlbGwuZ2V0KGNlbGxJZCkhO1xuICAgICAgICBjb25zdCBtZW1iZXJEZWxldGVzID0gY2VsbFJlZnMubWFwKHJlZiA9PiAoeyBrZXk6IHJlZiwgdmFsdWU6IHVuZGVmaW5lZCB9KSk7XG4gICAgICAgIHRyYW5zYWN0aW9uTXV0YXRlKGNlbGxTdG9yZShkYXRhYmFzZSwgY2VsbElkKSwgbWVtYmVyRGVsZXRlcyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcmVmIG9mIGRlbGV0ZWRSZWZzKSB7XG4gICAgICAgIGRhdGFiYXNlLmRlbGV0ZURhdGEocm9vdCA9PiByb290LmJ5UmVmW3JlZl0pO1xuICAgIH1cbiAgICBpZiAoZGVsZXRlZFJlZnMubGVuZ3RoKSB7XG4gICAgICAgIGRhdGFiYXNlLndyaXRlRGF0YShyb290ID0+IHJvb3QuY291bnQsIE1hdGgubWF4KDAsIGNvdW50IC0gZGVsZXRlZFJlZnMubGVuZ3RoKSk7XG4gICAgfVxufVxuIl19
|
|
398
|
+
/* _JS_SOURCE_HASH = "7738edfe7274720d37653564293cf51b8d98ca738046a46cc7458562ed13a7bf"; */
|
|
@@ -62,6 +62,19 @@ function rankCellsByCloseness(embedding: StoredEmbedding, centroids: Map<string,
|
|
|
62
62
|
return ranked.map(entry => entry.cellId);
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
+
// Synced functions rerun (and are predicted client-side), so the rebalance roll must be identical on every run of the same call — derive it from the inserted items instead of Math.random(). FNV-1a over each ref plus its embedding hash, mapped to [0, 1).
|
|
66
|
+
function seededRandomFromItems(items: EmbeddingInput[]): number {
|
|
67
|
+
let hash = 2166136261;
|
|
68
|
+
for (const item of items) {
|
|
69
|
+
const key = item.ref + hashEmbedding(item.embedding);
|
|
70
|
+
for (let index = 0; index < key.length; index++) {
|
|
71
|
+
hash ^= key.charCodeAt(index);
|
|
72
|
+
hash = Math.imul(hash, 16777619);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return (hash >>> 0) / 2 ** 32;
|
|
76
|
+
}
|
|
77
|
+
|
|
65
78
|
// Per-write chance of a full rebuild. Zero at/under the target size, then rises (cubically) past it so cells stay roughly between target and ~2x target.
|
|
66
79
|
function rebalanceProbability(fillRatio: number): number {
|
|
67
80
|
if (fillRatio <= 1) {
|
|
@@ -316,10 +329,10 @@ export function insertEmbeddings(
|
|
|
316
329
|
}
|
|
317
330
|
}
|
|
318
331
|
const averageFill = newCount / Math.max(1, centroids.size) / config.cellTargetSize;
|
|
319
|
-
if (
|
|
320
|
-
|
|
332
|
+
if (seededRandomFromItems(items) < rebalanceProbability(averageFill)) {
|
|
333
|
+
return true;
|
|
321
334
|
}
|
|
322
|
-
return
|
|
335
|
+
return false;
|
|
323
336
|
};
|
|
324
337
|
if (shouldRegenerate(database)) {
|
|
325
338
|
rebuildStructure(database);
|