Files
speckle-server/scratch/edge-debug-selection/Default/Cache/Cache_Data/f_0000dc
T

193 lines
32 KiB
Plaintext

import { invariant } from "/_nuxt/node_modules/@apollo/client/utilities/globals/index.js?v=e4f18c29";
import { argumentsObjectFromField, DeepMerger, isNonEmptyArray, isNonNullObject, } from "/_nuxt/node_modules/@apollo/client/utilities/index.js?v=e4f18c29";
import { hasOwn, isArray } from "/_nuxt/node_modules/@apollo/client/cache/inmemory/helpers.js?v=e4f18c29";
// Mapping from JSON-encoded KeySpecifier strings to associated information.
var specifierInfoCache = Object.create(null);
function lookupSpecifierInfo(spec) {
// It's safe to encode KeySpecifier arrays with JSON.stringify, since they're
// just arrays of strings or nested KeySpecifier arrays, and the order of the
// array elements is important (and suitably preserved by JSON.stringify).
var cacheKey = JSON.stringify(spec);
return (specifierInfoCache[cacheKey] ||
(specifierInfoCache[cacheKey] = Object.create(null)));
}
export function keyFieldsFnFromSpecifier(specifier) {
var info = lookupSpecifierInfo(specifier);
return (info.keyFieldsFn || (info.keyFieldsFn = function (object, context) {
var extract = function (from, key) {
return context.readField(key, from);
};
var keyObject = (context.keyObject = collectSpecifierPaths(specifier, function (schemaKeyPath) {
var extracted = extractKeyPath(context.storeObject, schemaKeyPath,
// Using context.readField to extract paths from context.storeObject
// allows the extraction to see through Reference objects and respect
// custom read functions.
extract);
if (extracted === void 0 &&
object !== context.storeObject &&
hasOwn.call(object, schemaKeyPath[0])) {
// If context.storeObject fails to provide a value for the requested
// path, fall back to the raw result object, if it has a top-level key
// matching the first key in the path (schemaKeyPath[0]). This allows
// key fields included in the written data to be saved in the cache
// even if they are not selected explicitly in context.selectionSet.
// Not being mentioned by context.selectionSet is convenient here,
// since it means these extra fields cannot be affected by field
// aliasing, which is why we can use extractKey instead of
// context.readField for this extraction.
extracted = extractKeyPath(object, schemaKeyPath, extractKey);
}
invariant(extracted !== void 0, 5, schemaKeyPath.join("."), object);
return extracted;
}));
return "".concat(context.typename, ":").concat(JSON.stringify(keyObject));
}));
}
// The keyArgs extraction process is roughly analogous to keyFields extraction,
// but there are no aliases involved, missing fields are tolerated (by merely
// omitting them from the key), and drawing from field.directives or variables
// is allowed (in addition to drawing from the field's arguments object).
// Concretely, these differences mean passing a different key path extractor
// function to collectSpecifierPaths, reusing the shared extractKeyPath helper
// wherever possible.
export function keyArgsFnFromSpecifier(specifier) {
var info = lookupSpecifierInfo(specifier);
return (info.keyArgsFn ||
(info.keyArgsFn = function (args, _a) {
var field = _a.field, variables = _a.variables, fieldName = _a.fieldName;
var collected = collectSpecifierPaths(specifier, function (keyPath) {
var firstKey = keyPath[0];
var firstChar = firstKey.charAt(0);
if (firstChar === "@") {
if (field && isNonEmptyArray(field.directives)) {
var directiveName_1 = firstKey.slice(1);
// If the directive appears multiple times, only the first
// occurrence's arguments will be used. TODO Allow repetition?
// TODO Cache this work somehow, a la aliasMap?
var d = field.directives.find(function (d) { return d.name.value === directiveName_1; });
// Fortunately argumentsObjectFromField works for DirectiveNode!
var directiveArgs = d && argumentsObjectFromField(d, variables);
// For directives without arguments (d defined, but directiveArgs ===
// null), the presence or absence of the directive still counts as
// part of the field key, so we return null in those cases. If no
// directive with this name was found for this field (d undefined and
// thus directiveArgs undefined), we return undefined, which causes
// this value to be omitted from the key object returned by
// collectSpecifierPaths.
return (directiveArgs &&
extractKeyPath(directiveArgs,
// If keyPath.length === 1, this code calls extractKeyPath with an
// empty path, which works because it uses directiveArgs as the
// extracted value.
keyPath.slice(1)));
}
// If the key started with @ but there was no corresponding directive,
// we want to omit this value from the key object, not fall through to
// treating @whatever as a normal argument name.
return;
}
if (firstChar === "$") {
var variableName = firstKey.slice(1);
if (variables && hasOwn.call(variables, variableName)) {
var varKeyPath = keyPath.slice(0);
varKeyPath[0] = variableName;
return extractKeyPath(variables, varKeyPath);
}
// If the key started with $ but there was no corresponding variable, we
// want to omit this value from the key object, not fall through to
// treating $whatever as a normal argument name.
return;
}
if (args) {
return extractKeyPath(args, keyPath);
}
});
var suffix = JSON.stringify(collected);
// If no arguments were passed to this field, and it didn't have any other
// field key contributions from directives or variables, hide the empty
// :{} suffix from the field key. However, a field passed no arguments can
// still end up with a non-empty :{...} suffix if its key configuration
// refers to directives or variables.
if (args || suffix !== "{}") {
fieldName += ":" + suffix;
}
return fieldName;
}));
}
export function collectSpecifierPaths(specifier, extractor) {
// For each path specified by specifier, invoke the extractor, and repeatedly
// merge the results together, with appropriate ancestor context.
var merger = new DeepMerger();
return getSpecifierPaths(specifier).reduce(function (collected, path) {
var _a;
var toMerge = extractor(path);
if (toMerge !== void 0) {
// This path is not expected to contain array indexes, so the toMerge
// reconstruction will not contain arrays. TODO Fix this?
for (var i = path.length - 1; i >= 0; --i) {
toMerge = (_a = {}, _a[path[i]] = toMerge, _a);
}
collected = merger.merge(collected, toMerge);
}
return collected;
}, Object.create(null));
}
export function getSpecifierPaths(spec) {
var info = lookupSpecifierInfo(spec);
if (!info.paths) {
var paths_1 = (info.paths = []);
var currentPath_1 = [];
spec.forEach(function (s, i) {
if (isArray(s)) {
getSpecifierPaths(s).forEach(function (p) { return paths_1.push(currentPath_1.concat(p)); });
currentPath_1.length = 0;
}
else {
currentPath_1.push(s);
if (!isArray(spec[i + 1])) {
paths_1.push(currentPath_1.slice(0));
currentPath_1.length = 0;
}
}
});
}
return info.paths;
}
function extractKey(object, key) {
return object[key];
}
export function extractKeyPath(object, path, extract) {
// For each key in path, extract the corresponding child property from obj,
// flattening arrays if encountered (uncommon for keyFields and keyArgs, but
// possible). The final result of path.reduce is normalized so unexpected leaf
// objects have their keys safely sorted. That final result is difficult to
// type as anything other than any. You're welcome to try to improve the
// return type, but keep in mind extractKeyPath is not a public function
// (exported only for testing), so the effort may not be worthwhile unless the
// limited set of actual callers (see above) pass arguments that TypeScript
// can statically type. If we know only that path is some array of strings
// (and not, say, a specific tuple of statically known strings), any (or
// possibly unknown) is the honest answer.
extract = extract || extractKey;
return normalize(path.reduce(function reducer(obj, key) {
return isArray(obj) ?
obj.map(function (child) { return reducer(child, key); })
: obj && extract(obj, key);
}, object));
}
function normalize(value) {
// Usually the extracted value will be a scalar value, since most primary
// key fields are scalar, but just in case we get an object or an array, we
// need to do some normalization of the order of (nested) keys.
if (isNonNullObject(value)) {
if (isArray(value)) {
return value.map(normalize);
}
return collectSpecifierPaths(Object.keys(value).sort(), function (path) {
return extractKeyPath(value, path);
});
}
return value;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5LWV4dHJhY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jYWNoZS9pbm1lbW9yeS9rZXktZXh0cmFjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUU3RCxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLFVBQVUsRUFDVixlQUFlLEVBQ2YsZUFBZSxHQUNoQixNQUFNLDBCQUEwQixDQUFDO0FBRWxDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBTy9DLDRFQUE0RTtBQUM1RSxJQUFNLGtCQUFrQixHQU9wQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBRXhCLFNBQVMsbUJBQW1CLENBQUMsSUFBa0I7SUFDN0MsNkVBQTZFO0lBQzdFLDZFQUE2RTtJQUM3RSwwRUFBMEU7SUFDMUUsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxPQUFPLENBQ0wsa0JBQWtCLENBQUMsUUFBUSxDQUFDO1FBQzVCLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUNyRCxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsU0FBdUI7SUFFdkIsSUFBTSxJQUFJLEdBQUcsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFNUMsT0FBTyxDQUNMLElBQUksQ0FBQyxXQUFXO1FBQ2hCLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFDLE1BQU0sRUFBRSxPQUFPO1lBQ2xDLElBQU0sT0FBTyxHQUFzQixVQUFDLElBQUksRUFBRSxHQUFHO2dCQUMzQyxPQUFBLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztZQUE1QixD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aEMsT0FBTyxTQUFTLENBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRztRQUNuQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pCLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBQyxLQUFLLElBQUssT0FBQSxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFuQixDQUFtQixDQUFDO1lBQ3pDLENBQUMsQ0FBQyxHQUFHLElBQUksT0FBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNoQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQ1gsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBSSxLQUFRO0lBQzVCLHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UsK0RBQStEO0lBQy9ELElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDM0IsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuQixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFRLENBQUM7UUFDckMsQ0FBQztRQUNELE9BQU8scUJBQXFCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxVQUFDLElBQUk7WUFDM0QsT0FBQSxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztRQUEzQixDQUEyQixDQUN2QixDQUFDO0lBQ1QsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGludmFyaWFudCB9IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvZ2xvYmFscy9pbmRleC5qc1wiO1xuXG5pbXBvcnQge1xuICBhcmd1bWVudHNPYmplY3RGcm9tRmllbGQsXG4gIERlZXBNZXJnZXIsXG4gIGlzTm9uRW1wdHlBcnJheSxcbiAgaXNOb25OdWxsT2JqZWN0LFxufSBmcm9tIFwiLi4vLi4vdXRpbGl0aWVzL2luZGV4LmpzXCI7XG5cbmltcG9ydCB7IGhhc093biwgaXNBcnJheSB9IGZyb20gXCIuL2hlbHBlcnMuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgS2V5U3BlY2lmaWVyLFxuICBLZXlGaWVsZHNGdW5jdGlvbixcbiAgS2V5QXJnc0Z1bmN0aW9uLFxufSBmcm9tIFwiLi9wb2xpY2llcy5qc1wiO1xuXG4vLyBNYXBwaW5nIGZyb20gSlNPTi1lbmNvZGVkIEtleVNwZWNpZmllciBzdHJpbmdzIHRvIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24uXG5jb25zdCBzcGVjaWZpZXJJbmZvQ2FjaGU6IFJlY29yZDxcbiAgc3RyaW5nLFxuICB7XG4gICAgcGF0aHM/OiBzdHJpbmdbXVtdO1xuICAgIGtleUZpZWxkc0ZuPzogS2V5RmllbGRzRnVuY3Rpb247XG4gICAga2V5QXJnc0ZuPzogS2V5QXJnc0Z1bmN0aW9uO1xuICB9XG4+ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuZnVuY3Rpb24gbG9va3VwU3BlY2lmaWVySW5mbyhzcGVjOiBLZXlTcGVjaWZpZXIpIHtcbiAgLy8gSXQncyBzYWZlIHRvIGVuY29kZSBLZXlTcGVjaWZpZXIgYXJyYXlzIHdpdGggSlNPTi5zdHJpbmdpZnksIHNpbmNlIHRoZXkncmVcbiAgLy8ganVzdCBhcnJheXMgb2Ygc3RyaW5ncyBvciBuZXN0ZWQgS2V5U3BlY2lmaWVyIGFycmF5cywgYW5kIHRoZSBvcmRlciBvZiB0aGVcbiAgLy8gYXJyYXkgZWxlbWVudHMgaXMgaW1wb3J0YW50IChhbmQgc3VpdGFibHkgcHJlc2VydmVkIGJ5IEpTT04uc3RyaW5naWZ5KS5cbiAgY29uc3QgY2FjaGVLZXkgPSBKU09OLnN0cmluZ2lmeShzcGVjKTtcbiAgcmV0dXJuIChcbiAgICBzcGVjaWZpZXJJbmZvQ2FjaGVbY2FjaGVLZXldIHx8XG4gICAgKHNwZWNpZmllckluZm9DYWNoZVtjYWNoZUtleV0gPSBPYmplY3QuY3JlYXRlKG51bGwpKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga2V5RmllbGRzRm5Gcm9tU3BlY2lmaWVyKFxuICBzcGVjaWZpZXI6IEtleVNwZWNpZmllclxuKTogS2V5RmllbGRzRnVuY3Rpb24ge1xuICBjb25zdCBpbmZvID0gbG9va3VwU3BlY2lmaWVySW5mbyhzcGVjaWZpZXIpO1xuXG4gIHJldHVybiAoXG4gICAgaW5mby5rZXlGaWVsZHNGbiB8fFxuICAgIChpbmZvLmtleUZpZWxkc0ZuID0gKG9iamVjdCwgY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgZXh0cmFjdDogdHlwZW9mIGV4dHJhY3RLZXkgPSAoZnJvbSwga2V5KSA9PlxuICAgICAgICBjb250ZXh0LnJlYWRGaWVsZChrZXksIGZyb20pO1xuXG4gICAgICBjb25zdCBrZXlPYmplY3QgPSAoY29udGV4dC5rZXlPYmplY3QgPSBjb2xsZWN0U3BlY2lmaWVyUGF0aHMoXG4gICAgICAgIHNwZWNpZmllcixcbiAgICAgICAgKHNjaGVtYUtleVBhdGgpID0+IHtcbiAgICAgICAgICBsZXQgZXh0cmFjdGVkID0gZXh0cmFjdEtleVBhdGgoXG4gICAgICAgICAgICBjb250ZXh0LnN0b3JlT2JqZWN0LFxuICAgICAgICAgICAgc2NoZW1hS2V5UGF0aCxcbiAgICAgICAgICAgIC8vIFVzaW5nIGNvbnRleHQucmVhZEZpZWxkIHRvIGV4dHJhY3QgcGF0aHMgZnJvbSBjb250ZXh0LnN0b3JlT2JqZWN0XG4gICAgICAgICAgICAvLyBhbGxvd3MgdGhlIGV4dHJhY3Rpb24gdG8gc2VlIHRocm91Z2ggUmVmZXJlbmNlIG9iamVjdHMgYW5kIHJlc3BlY3RcbiAgICAgICAgICAgIC8vIGN1c3RvbSByZWFkIGZ1bmN0aW9ucy5cbiAgICAgICAgICAgIGV4dHJhY3RcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXh0cmFjdGVkID09PSB2b2lkIDAgJiZcbiAgICAgICAgICAgIG9iamVjdCAhPT0gY29udGV4dC5zdG9yZU9iamVjdCAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwob2JqZWN0LCBzY2hlbWFLZXlQYXRoWzBdKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gSWYgY29udGV4dC5zdG9yZU9iamVjdCBmYWlscyB0byBwcm92aWRlIGEgdmFsdWUgZm9yIHRoZSByZXF1ZXN0ZWRcbiAgICAgICAgICAgIC8vIHBhdGgsIGZhbGwgYmFjayB0byB0aGUgcmF3IHJlc3VsdCBvYmplY3QsIGlmIGl0IGhhcyBhIHRvcC1sZXZlbCBrZXlcbiAgICAgICAgICAgIC8vIG1hdGNoaW5nIHRoZSBmaXJzdCBrZXkgaW4gdGhlIHBhdGggKHNjaGVtYUtleVBhdGhbMF0pLiBUaGlzIGFsbG93c1xuICAgICAgICAgICAgLy8ga2V5IGZpZWxkcyBpbmNsdWRlZCBpbiB0aGUgd3JpdHRlbiBkYXRhIHRvIGJlIHNhdmVkIGluIHRoZSBjYWNoZVxuICAgICAgICAgICAgLy8gZXZlbiBpZiB0aGV5IGFyZSBub3Qgc2VsZWN0ZWQgZXhwbGljaXRseSBpbiBjb250ZXh0LnNlbGVjdGlvblNldC5cbiAgICAgICAgICAgIC8vIE5vdCBiZWluZyBtZW50aW9uZWQgYnkgY29udGV4dC5zZWxlY3Rpb25TZXQgaXMgY29udmVuaWVudCBoZXJlLFxuICAgICAgICAgICAgLy8gc2luY2UgaXQgbWVhbnMgdGhlc2UgZXh0cmEgZmllbGRzIGNhbm5vdCBiZSBhZmZlY3RlZCBieSBmaWVsZFxuICAgICAgICAgICAgLy8gYWxpYXNpbmcsIHdoaWNoIGlzIHdoeSB3ZSBjYW4gdXNlIGV4dHJhY3RLZXkgaW5zdGVhZCBvZlxuICAgICAgICAgICAgLy8gY29udGV4dC5yZWFkRmllbGQgZm9yIHRoaXMgZXh0cmFjdGlvbi5cbiAgICAgICAgICAgIGV4dHJhY3RlZCA9IGV4dHJhY3RLZXlQYXRoKG9iamVjdCwgc2NoZW1hS2V5UGF0aCwgZXh0cmFjdEtleSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaW52YXJpYW50KFxuICAgICAgICAgICAgZXh0cmFjdGVkICE9PSB2b2lkIDAsXG4gICAgICAgICAgICBgTWlzc2luZyBmaWVsZCAnJXMnIHdoaWxlIGV4dHJhY3Rpbmcga2V5RmllbGRzIGZyb20gJXNgLFxuICAgICAgICAgICAgc2NoZW1hS2V5UGF0aC5qb2luKFwiLlwiKSxcbiAgICAgICAgICAgIG9iamVjdFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gZXh0cmFjdGVkO1xuICAgICAgICB9XG4gICAgICApKTtcblxuICAgICAgcmV0dXJuIGAke2NvbnRleHQudHlwZW5hbWV9OiR7SlNPTi5zdHJpbmdpZnkoa2V5T2JqZWN0KX1gO1xuICAgIH0pXG4gICk7XG59XG5cbi8vIFRoZSBrZXlBcmdzIGV4dHJhY3Rpb24gcHJvY2VzcyBpcyByb3VnaGx5IGFuYWxvZ291cyB0byBrZXlGaWVsZHMgZXh0cmFjdGlvbixcbi8vIGJ1dCB0aGVyZSBhcmUgbm8gYWxpYXNlcyBpbnZvbHZlZCwgbWlzc2luZyBmaWVsZHMgYXJlIHRvbGVyYXRlZCAoYnkgbWVyZWx5XG4vLyBvbWl0dGluZyB0aGVtIGZyb20gdGhlIGtleSksIGFuZCBkcmF3aW5nIGZyb20gZmllbGQuZGlyZWN0aXZlcyBvciB2YXJpYWJsZXNcbi8vIGlzIGFsbG93ZWQgKGluIGFkZGl0aW9uIHRvIGRyYXdpbmcgZnJvbSB0aGUgZmllbGQncyBhcmd1bWVudHMgb2JqZWN0KS5cbi8vIENvbmNyZXRlbHksIHRoZXNlIGRpZmZlcmVuY2VzIG1lYW4gcGFzc2luZyBhIGRpZmZlcmVudCBrZXkgcGF0aCBleHRyYWN0b3Jcbi8vIGZ1bmN0aW9uIHRvIGNvbGxlY3RTcGVjaWZpZXJQYXRocywgcmV1c2luZyB0aGUgc2hhcmVkIGV4dHJhY3RLZXlQYXRoIGhlbHBlclxuLy8gd2hlcmV2ZXIgcG9zc2libGUuXG5leHBvcnQgZnVuY3Rpb24ga2V5QXJnc0ZuRnJvbVNwZWNpZmllcihcbiAgc3BlY2lmaWVyOiBLZXlTcGVjaWZpZXJcbik6IEtleUFyZ3NGdW5jdGlvbiB7XG4gIGNvbnN0IGluZm8gPSBsb29rdXBTcGVjaWZpZXJJbmZvKHNwZWNpZmllcik7XG5cbiAgcmV0dXJuIChcbiAgICBpbmZvLmtleUFyZ3NGbiB8fFxuICAgIChpbmZvLmtleUFyZ3NGbiA9IChhcmdzLCB7IGZpZWxkLCB2YXJpYWJsZXMsIGZpZWxkTmFtZSB9KSA9PiB7XG4gICAgICBjb25zdCBjb2xsZWN0ZWQgPSBjb2xsZWN0U3BlY2lmaWVyUGF0aHMoc3BlY2lmaWVyLCAoa2V5UGF0aCkgPT4ge1xuICAgICAgICBjb25zdCBmaXJzdEtleSA9IGtleVBhdGhbMF07XG4gICAgICAgIGNvbnN0IGZpcnN0Q2hhciA9IGZpcnN0S2V5LmNoYXJBdCgwKTtcblxuICAgICAgICBpZiAoZmlyc3RDaGFyID09PSBcIkBcIikge1xuICAgICAgICAgIGlmIChmaWVsZCAmJiBpc05vbkVtcHR5QXJyYXkoZmllbGQuZGlyZWN0aXZlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGl2ZU5hbWUgPSBmaXJzdEtleS5zbGljZSgxKTtcbiAgICAgICAgICAgIC8vIElmIHRoZSBkaXJlY3RpdmUgYXBwZWFycyBtdWx0aXBsZSB0aW1lcywgb25seSB0aGUgZmlyc3RcbiAgICAgICAgICAgIC8vIG9jY3VycmVuY2UncyBhcmd1bWVudHMgd2lsbCBiZSB1c2VkLiBUT0RPIEFsbG93IHJlcGV0aXRpb24/XG4gICAgICAgICAgICAvLyBUT0RPIENhY2hlIHRoaXMgd29yayBzb21laG93LCBhIGxhIGFsaWFzTWFwP1xuICAgICAgICAgICAgY29uc3QgZCA9IGZpZWxkLmRpcmVjdGl2ZXMuZmluZChcbiAgICAgICAgICAgICAgKGQpID0+IGQubmFtZS52YWx1ZSA9PT0gZGlyZWN0aXZlTmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIEZvcnR1bmF0ZWx5IGFyZ3VtZW50c09iamVjdEZyb21GaWVsZCB3b3JrcyBmb3IgRGlyZWN0aXZlTm9kZSFcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGl2ZUFyZ3MgPSBkICYmIGFyZ3VtZW50c09iamVjdEZyb21GaWVsZChkLCB2YXJpYWJsZXMpO1xuICAgICAgICAgICAgLy8gRm9yIGRpcmVjdGl2ZXMgd2l0aG91dCBhcmd1bWVudHMgKGQgZGVmaW5lZCwgYnV0IGRpcmVjdGl2ZUFyZ3MgPT09XG4gICAgICAgICAgICAvLyBudWxsKSwgdGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgdGhlIGRpcmVjdGl2ZSBzdGlsbCBjb3VudHMgYXNcbiAgICAgICAgICAgIC8vIHBhcnQgb2YgdGhlIGZpZWxkIGtleSwgc28gd2UgcmV0dXJuIG51bGwgaW4gdGhvc2UgY2FzZXMuIElmIG5vXG4gICAgICAgICAgICAvLyBkaXJlY3RpdmUgd2l0aCB0aGlzIG5hbWUgd2FzIGZvdW5kIGZvciB0aGlzIGZpZWxkIChkIHVuZGVmaW5lZCBhbmRcbiAgICAgICAgICAgIC8vIHRodXMgZGlyZWN0aXZlQXJncyB1bmRlZmluZWQpLCB3ZSByZXR1cm4gdW5kZWZpbmVkLCB3aGljaCBjYXVzZXNcbiAgICAgICAgICAgIC8vIHRoaXMgdmFsdWUgdG8gYmUgb21pdHRlZCBmcm9tIHRoZSBrZXkgb2JqZWN0IHJldHVybmVkIGJ5XG4gICAgICAgICAgICAvLyBjb2xsZWN0U3BlY2lmaWVyUGF0aHMuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICBkaXJlY3RpdmVBcmdzICYmXG4gICAgICAgICAgICAgIGV4dHJhY3RLZXlQYXRoKFxuICAgICAgICAgICAgICAgIGRpcmVjdGl2ZUFyZ3MsXG4gICAgICAgICAgICAgICAgLy8gSWYga2V5UGF0aC5sZW5ndGggPT09IDEsIHRoaXMgY29kZSBjYWxscyBleHRyYWN0S2V5UGF0aCB3aXRoIGFuXG4gICAgICAgICAgICAgICAgLy8gZW1wdHkgcGF0aCwgd2hpY2ggd29ya3MgYmVjYXVzZSBpdCB1c2VzIGRpcmVjdGl2ZUFyZ3MgYXMgdGhlXG4gICAgICAgICAgICAgICAgLy8gZXh0cmFjdGVkIHZhbHVlLlxuICAgICAgICAgICAgICAgIGtleVBhdGguc2xpY2UoMSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWYgdGhlIGtleSBzdGFydGVkIHdpdGggQCBidXQgdGhlcmUgd2FzIG5vIGNvcnJlc3BvbmRpbmcgZGlyZWN0aXZlLFxuICAgICAgICAgIC8vIHdlIHdhbnQgdG8gb21pdCB0aGlzIHZhbHVlIGZyb20gdGhlIGtleSBvYmplY3QsIG5vdCBmYWxsIHRocm91Z2ggdG9cbiAgICAgICAgICAvLyB0cmVhdGluZyBAd2hhdGV2ZXIgYXMgYSBub3JtYWwgYXJndW1lbnQgbmFtZS5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlyc3RDaGFyID09PSBcIiRcIikge1xuICAgICAgICAgIGNvbnN0IHZhcmlhYmxlTmFtZSA9IGZpcnN0S2V5LnNsaWNlKDEpO1xuICAgICAgICAgIGlmICh2YXJpYWJsZXMgJiYgaGFzT3duLmNhbGwodmFyaWFibGVzLCB2YXJpYWJsZU5hbWUpKSB7XG4gICAgICAgICAgICBjb25zdCB2YXJLZXlQYXRoID0ga2V5UGF0aC5zbGljZSgwKTtcbiAgICAgICAgICAgIHZhcktleVBhdGhbMF0gPSB2YXJpYWJsZU5hbWU7XG4gICAgICAgICAgICByZXR1cm4gZXh0cmFjdEtleVBhdGgodmFyaWFibGVzLCB2YXJLZXlQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gSWYgdGhlIGtleSBzdGFydGVkIHdpdGggJCBidXQgdGhlcmUgd2FzIG5vIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUsIHdlXG4gICAgICAgICAgLy8gd2FudCB0byBvbWl0IHRoaXMgdmFsdWUgZnJvbSB0aGUga2V5IG9iamVjdCwgbm90IGZhbGwgdGhyb3VnaCB0b1xuICAgICAgICAgIC8vIHRyZWF0aW5nICR3aGF0ZXZlciBhcyBhIG5vcm1hbCBhcmd1bWVudCBuYW1lLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIGV4dHJhY3RLZXlQYXRoKGFyZ3MsIGtleVBhdGgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc3VmZml4ID0gSlNPTi5zdHJpbmdpZnkoY29sbGVjdGVkKTtcblxuICAgICAgLy8gSWYgbm8gYXJndW1lbnRzIHdlcmUgcGFzc2VkIHRvIHRoaXMgZmllbGQsIGFuZCBpdCBkaWRuJ3QgaGF2ZSBhbnkgb3RoZXJcbiAgICAgIC8vIGZpZWxkIGtleSBjb250cmlidXRpb25zIGZyb20gZGlyZWN0aXZlcyBvciB2YXJpYWJsZXMsIGhpZGUgdGhlIGVtcHR5XG4gICAgICAvLyA6e30gc3VmZml4IGZyb20gdGhlIGZpZWxkIGtleS4gSG93ZXZlciwgYSBmaWVsZCBwYXNzZWQgbm8gYXJndW1lbnRzIGNhblxuICAgICAgLy8gc3RpbGwgZW5kIHVwIHdpdGggYSBub24tZW1wdHkgOnsuLi59IHN1ZmZpeCBpZiBpdHMga2V5IGNvbmZpZ3VyYXRpb25cbiAgICAgIC8vIHJlZmVycyB0byBkaXJlY3RpdmVzIG9yIHZhcmlhYmxlcy5cbiAgICAgIGlmIChhcmdzIHx8IHN1ZmZpeCAhPT0gXCJ7fVwiKSB7XG4gICAgICAgIGZpZWxkTmFtZSArPSBcIjpcIiArIHN1ZmZpeDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZpZWxkTmFtZTtcbiAgICB9KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdFNwZWNpZmllclBhdGhzKFxuICBzcGVjaWZpZXI6IEtleVNwZWNpZmllcixcbiAgZXh0cmFjdG9yOiAocGF0aDogc3RyaW5nW10pID0+IGFueVxuKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIC8vIEZvciBlYWNoIHBhdGggc3BlY2lmaWVkIGJ5IHNwZWNpZmllciwgaW52b2tlIHRoZSBleHRyYWN0b3IsIGFuZCByZXBlYXRlZGx5XG4gIC8vIG1lcmdlIHRoZSByZXN1bHRzIHRvZ2V0aGVyLCB3aXRoIGFwcHJvcHJpYXRlIGFuY2VzdG9yIGNvbnRleHQuXG4gIGNvbnN0IG1lcmdlciA9IG5ldyBEZWVwTWVyZ2VyKCk7XG4gIHJldHVybiBnZXRTcGVjaWZpZXJQYXRocyhzcGVjaWZpZXIpLnJlZHVjZSgoY29sbGVjdGVkLCBwYXRoKSA9PiB7XG4gICAgbGV0IHRvTWVyZ2UgPSBleHRyYWN0b3IocGF0aCk7XG4gICAgaWYgKHRvTWVyZ2UgIT09IHZvaWQgMCkge1xuICAgICAgLy8gVGhpcyBwYXRoIGlzIG5vdCBleHBlY3RlZCB0byBjb250YWluIGFycmF5IGluZGV4ZXMsIHNvIHRoZSB0b01lcmdlXG4gICAgICAvLyByZWNvbnN0cnVjdGlvbiB3aWxsIG5vdCBjb250YWluIGFycmF5cy4gVE9ETyBGaXggdGhpcz9cbiAgICAgIGZvciAobGV0IGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHRvTWVyZ2UgPSB7IFtwYXRoW2ldXTogdG9NZXJnZSB9O1xuICAgICAgfVxuICAgICAgY29sbGVjdGVkID0gbWVyZ2VyLm1lcmdlKGNvbGxlY3RlZCwgdG9NZXJnZSk7XG4gICAgfVxuICAgIHJldHVybiBjb2xsZWN0ZWQ7XG4gIH0sIE9iamVjdC5jcmVhdGUobnVsbCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BlY2lmaWVyUGF0aHMoc3BlYzogS2V5U3BlY2lmaWVyKTogc3RyaW5nW11bXSB7XG4gIGNvbnN0IGluZm8gPSBsb29rdXBTcGVjaWZpZXJJbmZvKHNwZWMpO1xuXG4gIGlmICghaW5mby5wYXRocykge1xuICAgIGNvbnN0IHBhdGhzOiBzdHJpbmdbXVtdID0gKGluZm8ucGF0aHMgPSBbXSk7XG4gICAgY29uc3QgY3VycmVudFBhdGg6IHN0cmluZ1tdID0gW107XG5cbiAgICBzcGVjLmZvckVhY2goKHMsIGkpID0+IHtcbiAgICAgIGlmIChpc0FycmF5KHMpKSB7XG4gICAgICAgIGdldFNwZWNpZmllclBhdGhzKHMpLmZvckVhY2goKHApID0+IHBhdGhzLnB1c2goY3VycmVudFBhdGguY29uY2F0KHApKSk7XG4gICAgICAgIGN1cnJlbnRQYXRoLmxlbmd0aCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50UGF0aC5wdXNoKHMpO1xuICAgICAgICBpZiAoIWlzQXJyYXkoc3BlY1tpICsgMV0pKSB7XG4gICAgICAgICAgcGF0aHMucHVzaChjdXJyZW50UGF0aC5zbGljZSgwKSk7XG4gICAgICAgICAgY3VycmVudFBhdGgubGVuZ3RoID0gMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGluZm8ucGF0aHMhO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0S2V5PFRPYmogZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBUS2V5IGV4dGVuZHMgc3RyaW5nPihcbiAgb2JqZWN0OiBUT2JqLFxuICBrZXk6IFRLZXlcbik6IFRPYmpbVEtleV0gfCB1bmRlZmluZWQge1xuICByZXR1cm4gb2JqZWN0W2tleV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0S2V5UGF0aChcbiAgb2JqZWN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBwYXRoOiBzdHJpbmdbXSxcbiAgZXh0cmFjdD86IHR5cGVvZiBleHRyYWN0S2V5XG4pOiBhbnkge1xuICAvLyBGb3IgZWFjaCBrZXkgaW4gcGF0aCwgZXh0cmFjdCB0aGUgY29ycmVzcG9uZGluZyBjaGlsZCBwcm9wZXJ0eSBmcm9tIG9iaixcbiAgLy8gZmxhdHRlbmluZyBhcnJheXMgaWYgZW5jb3VudGVyZWQgKHVuY29tbW9uIGZvciBrZXlGaWVsZHMgYW5kIGtleUFyZ3MsIGJ1dFxuICAvLyBwb3NzaWJsZSkuIFRoZSBmaW5hbCByZXN1bHQgb2YgcGF0aC5yZWR1Y2UgaXMgbm9ybWFsaXplZCBzbyB1bmV4cGVjdGVkIGxlYWZcbiAgLy8gb2JqZWN0cyBoYXZlIHRoZWlyIGtleXMgc2FmZWx5IHNvcnRlZC4gVGhhdCBmaW5hbCByZXN1bHQgaXMgZGlmZmljdWx0IHRvXG4gIC8vIHR5cGUgYXMgYW55dGhpbmcgb3RoZXIgdGhhbiBhbnkuIFlvdSdyZSB3ZWxjb21lIHRvIHRyeSB0byBpbXByb3ZlIHRoZVxuICAvLyByZXR1cm4gdHlwZSwgYnV0IGtlZXAgaW4gbWluZCBleHRyYWN0S2V5UGF0aCBpcyBub3QgYSBwdWJsaWMgZnVuY3Rpb25cbiAgLy8gKGV4cG9ydGVkIG9ubHkgZm9yIHRlc3RpbmcpLCBzbyB0aGUgZWZmb3J0IG1heSBub3QgYmUgd29ydGh3aGlsZSB1bmxlc3MgdGhlXG4gIC8vIGxpbWl0ZWQgc2V0IG9mIGFjdHVhbCBjYWxsZXJzIChzZWUgYWJvdmUpIHBhc3MgYXJndW1lbnRzIHRoYXQgVHlwZVNjcmlwdFxuICAvLyBjYW4gc3RhdGljYWxseSB0eXBlLiBJZiB3ZSBrbm93IG9ubHkgdGhhdCBwYXRoIGlzIHNvbWUgYXJyYXkgb2Ygc3RyaW5nc1xuICAvLyAoYW5kIG5vdCwgc2F5LCBhIHNwZWNpZmljIHR1cGxlIG9mIHN0YXRpY2FsbHkga25vd24gc3RyaW5ncyksIGFueSAob3JcbiAgLy8gcG9zc2libHkgdW5rbm93bikgaXMgdGhlIGhvbmVzdCBhbnN3ZXIuXG4gIGV4dHJhY3QgPSBleHRyYWN0IHx8IGV4dHJhY3RLZXk7XG4gIHJldHVybiBub3JtYWxpemUoXG4gICAgcGF0aC5yZWR1Y2UoZnVuY3Rpb24gcmVkdWNlcihvYmosIGtleSk6IGFueSB7XG4gICAgICByZXR1cm4gaXNBcnJheShvYmopID9cbiAgICAgICAgICBvYmoubWFwKChjaGlsZCkgPT4gcmVkdWNlcihjaGlsZCwga2V5KSlcbiAgICAgICAgOiBvYmogJiYgZXh0cmFjdCEob2JqLCBrZXkpO1xuICAgIH0sIG9iamVjdClcbiAgKTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplPFQ+KHZhbHVlOiBUKTogVCB7XG4gIC8vIFVzdWFsbHkgdGhlIGV4dHJhY3RlZCB2YWx1ZSB3aWxsIGJlIGEgc2NhbGFyIHZhbHVlLCBzaW5jZSBtb3N0IHByaW1hcnlcbiAgLy8ga2V5IGZpZWxkcyBhcmUgc2NhbGFyLCBidXQganVzdCBpbiBjYXNlIHdlIGdldCBhbiBvYmplY3Qgb3IgYW4gYXJyYXksIHdlXG4gIC8vIG5lZWQgdG8gZG8gc29tZSBub3JtYWxpemF0aW9uIG9mIHRoZSBvcmRlciBvZiAobmVzdGVkKSBrZXlzLlxuICBpZiAoaXNOb25OdWxsT2JqZWN0KHZhbHVlKSkge1xuICAgIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLm1hcChub3JtYWxpemUpIGFzIGFueTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbGxlY3RTcGVjaWZpZXJQYXRocyhPYmplY3Qua2V5cyh2YWx1ZSkuc29ydCgpLCAocGF0aCkgPT5cbiAgICAgIGV4dHJhY3RLZXlQYXRoKHZhbHVlLCBwYXRoKVxuICAgICkgYXMgVDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzBdfQ==