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

605 lines
109 KiB
Plaintext

import { __assign, __rest } from "/_nuxt/node_modules/tslib/tslib.es6.js?v=e4f18c29";
import { invariant, newInvariantError } from "/_nuxt/node_modules/@apollo/client/utilities/globals/index.js?v=e4f18c29";
import { storeKeyNameFromField, argumentsObjectFromField, isReference, getStoreKeyName, isNonNullObject, stringifyForDisplay, } from "/_nuxt/node_modules/@apollo/client/utilities/index.js?v=e4f18c29";
import { hasOwn, fieldNameFromStoreName, storeValueIsStoreObject, selectionSetMatchesResult, TypeOrFieldNameRegExp, defaultDataIdFromObject, isArray, } from "/_nuxt/node_modules/@apollo/client/cache/inmemory/helpers.js?v=e4f18c29";
import { cacheSlot } from "/_nuxt/node_modules/@apollo/client/cache/inmemory/reactiveVars.js?v=e4f18c29";
import { keyArgsFnFromSpecifier, keyFieldsFnFromSpecifier, } from "/_nuxt/node_modules/@apollo/client/cache/inmemory/key-extractor.js?v=e4f18c29";
import { disableWarningsSlot } from "/_nuxt/node_modules/@apollo/client/masking/index.js?v=e4f18c29";
function argsFromFieldSpecifier(spec) {
return (spec.args !== void 0 ? spec.args
: spec.field ? argumentsObjectFromField(spec.field, spec.variables)
: null);
}
var nullKeyFieldsFn = function () { return void 0; };
var simpleKeyArgsFn = function (_args, context) { return context.fieldName; };
// These merge functions can be selected by specifying merge:true or
// merge:false in a field policy.
var mergeTrueFn = function (existing, incoming, _a) {
var mergeObjects = _a.mergeObjects;
return mergeObjects(existing, incoming);
};
var mergeFalseFn = function (_, incoming) { return incoming; };
var Policies = /** @class */ (function () {
function Policies(config) {
this.config = config;
this.typePolicies = Object.create(null);
this.toBeAdded = Object.create(null);
// Map from subtype names to sets of supertype names. Note that this
// representation inverts the structure of possibleTypes (whose keys are
// supertypes and whose values are arrays of subtypes) because it tends
// to be much more efficient to search upwards than downwards.
this.supertypeMap = new Map();
// Any fuzzy subtypes specified by possibleTypes will be converted to
// RegExp objects and recorded here. Every key of this map can also be
// found in supertypeMap. In many cases this Map will be empty, which
// means no fuzzy subtype checking will happen in fragmentMatches.
this.fuzzySubtypes = new Map();
this.rootIdsByTypename = Object.create(null);
this.rootTypenamesById = Object.create(null);
this.usingPossibleTypes = false;
this.config = __assign({ dataIdFromObject: defaultDataIdFromObject }, config);
this.cache = this.config.cache;
this.setRootTypename("Query");
this.setRootTypename("Mutation");
this.setRootTypename("Subscription");
if (config.possibleTypes) {
this.addPossibleTypes(config.possibleTypes);
}
if (config.typePolicies) {
this.addTypePolicies(config.typePolicies);
}
}
Policies.prototype.identify = function (object, partialContext) {
var _a;
var policies = this;
var typename = (partialContext &&
(partialContext.typename || ((_a = partialContext.storeObject) === null || _a === void 0 ? void 0 : _a.__typename))) ||
object.__typename;
// It should be possible to write root Query fields with writeFragment,
// using { __typename: "Query", ... } as the data, but it does not make
// sense to allow the same identification behavior for the Mutation and
// Subscription types, since application code should never be writing
// directly to (or reading directly from) those root objects.
if (typename === this.rootTypenamesById.ROOT_QUERY) {
return ["ROOT_QUERY"];
}
// Default context.storeObject to object if not otherwise provided.
var storeObject = (partialContext && partialContext.storeObject) || object;
var context = __assign(__assign({}, partialContext), { typename: typename, storeObject: storeObject, readField: (partialContext && partialContext.readField) ||
function () {
var options = normalizeReadFieldOptions(arguments, storeObject);
return policies.readField(options, {
store: policies.cache["data"],
variables: options.variables,
});
} });
var id;
var policy = typename && this.getTypePolicy(typename);
var keyFn = (policy && policy.keyFn) || this.config.dataIdFromObject;
disableWarningsSlot.withValue(true, function () {
while (keyFn) {
var specifierOrId = keyFn(__assign(__assign({}, object), storeObject), context);
if (isArray(specifierOrId)) {
keyFn = keyFieldsFnFromSpecifier(specifierOrId);
}
else {
id = specifierOrId;
break;
}
}
});
id = id ? String(id) : void 0;
return context.keyObject ? [id, context.keyObject] : [id];
};
Policies.prototype.addTypePolicies = function (typePolicies) {
var _this = this;
Object.keys(typePolicies).forEach(function (typename) {
var _a = typePolicies[typename], queryType = _a.queryType, mutationType = _a.mutationType, subscriptionType = _a.subscriptionType, incoming = __rest(_a, ["queryType", "mutationType", "subscriptionType"]);
// Though {query,mutation,subscription}Type configurations are rare,
// it's important to call setRootTypename as early as possible,
// since these configurations should apply consistently for the
// entire lifetime of the cache. Also, since only one __typename can
// qualify as one of these root types, these three properties cannot
// be inherited, unlike the rest of the incoming properties. That
// restriction is convenient, because the purpose of this.toBeAdded
// is to delay the processing of type/field policies until the first
// time they're used, allowing policies to be added in any order as
// long as all relevant policies (including policies for supertypes)
// have been added by the time a given policy is used for the first
// time. In other words, since inheritance doesn't matter for these
// properties, there's also no need to delay their processing using
// the this.toBeAdded queue.
if (queryType)
_this.setRootTypename("Query", typename);
if (mutationType)
_this.setRootTypename("Mutation", typename);
if (subscriptionType)
_this.setRootTypename("Subscription", typename);
if (hasOwn.call(_this.toBeAdded, typename)) {
_this.toBeAdded[typename].push(incoming);
}
else {
_this.toBeAdded[typename] = [incoming];
}
});
};
Policies.prototype.updateTypePolicy = function (typename, incoming) {
var _this = this;
var existing = this.getTypePolicy(typename);
var keyFields = incoming.keyFields, fields = incoming.fields;
function setMerge(existing, merge) {
existing.merge =
typeof merge === "function" ? merge
// Pass merge:true as a shorthand for a merge implementation
// that returns options.mergeObjects(existing, incoming).
: merge === true ? mergeTrueFn
// Pass merge:false to make incoming always replace existing
// without any warnings about data clobbering.
: merge === false ? mergeFalseFn
: existing.merge;
}
// Type policies can define merge functions, as an alternative to
// using field policies to merge child objects.
setMerge(existing, incoming.merge);
existing.keyFn =
// Pass false to disable normalization for this typename.
keyFields === false ? nullKeyFieldsFn
// Pass an array of strings to use those fields to compute a
// composite ID for objects of this typename.
: isArray(keyFields) ? keyFieldsFnFromSpecifier(keyFields)
// Pass a function to take full control over identification.
: typeof keyFields === "function" ? keyFields
// Leave existing.keyFn unchanged if above cases fail.
: existing.keyFn;
if (fields) {
Object.keys(fields).forEach(function (fieldName) {
var existing = _this.getFieldPolicy(typename, fieldName, true);
var incoming = fields[fieldName];
if (typeof incoming === "function") {
existing.read = incoming;
}
else {
var keyArgs = incoming.keyArgs, read = incoming.read, merge = incoming.merge;
existing.keyFn =
// Pass false to disable argument-based differentiation of
// field identities.
keyArgs === false ? simpleKeyArgsFn
// Pass an array of strings to use named arguments to
// compute a composite identity for the field.
: isArray(keyArgs) ? keyArgsFnFromSpecifier(keyArgs)
// Pass a function to take full control over field identity.
: typeof keyArgs === "function" ? keyArgs
// Leave existing.keyFn unchanged if above cases fail.
: existing.keyFn;
if (typeof read === "function") {
existing.read = read;
}
setMerge(existing, merge);
}
if (existing.read && existing.merge) {
// If we have both a read and a merge function, assume
// keyArgs:false, because read and merge together can take
// responsibility for interpreting arguments in and out. This
// default assumption can always be overridden by specifying
// keyArgs explicitly in the FieldPolicy.
existing.keyFn = existing.keyFn || simpleKeyArgsFn;
}
});
}
};
Policies.prototype.setRootTypename = function (which, typename) {
if (typename === void 0) { typename = which; }
var rootId = "ROOT_" + which.toUpperCase();
var old = this.rootTypenamesById[rootId];
if (typename !== old) {
invariant(!old || old === which, 6, which);
// First, delete any old __typename associated with this rootId from
// rootIdsByTypename.
if (old)
delete this.rootIdsByTypename[old];
// Now make this the only __typename that maps to this rootId.
this.rootIdsByTypename[typename] = rootId;
// Finally, update the __typename associated with this rootId.
this.rootTypenamesById[rootId] = typename;
}
};
Policies.prototype.addPossibleTypes = function (possibleTypes) {
var _this = this;
this.usingPossibleTypes = true;
Object.keys(possibleTypes).forEach(function (supertype) {
// Make sure all types have an entry in this.supertypeMap, even if
// their supertype set is empty, so we can return false immediately
// from policies.fragmentMatches for unknown supertypes.
_this.getSupertypeSet(supertype, true);
possibleTypes[supertype].forEach(function (subtype) {
_this.getSupertypeSet(subtype, true).add(supertype);
var match = subtype.match(TypeOrFieldNameRegExp);
if (!match || match[0] !== subtype) {
// TODO Don't interpret just any invalid typename as a RegExp.
_this.fuzzySubtypes.set(subtype, new RegExp(subtype));
}
});
});
};
Policies.prototype.getTypePolicy = function (typename) {
var _this = this;
if (!hasOwn.call(this.typePolicies, typename)) {
var policy_1 = (this.typePolicies[typename] = Object.create(null));
policy_1.fields = Object.create(null);
// When the TypePolicy for typename is first accessed, instead of
// starting with an empty policy object, inherit any properties or
// fields from the type policies of the supertypes of typename.
//
// Any properties or fields defined explicitly within the TypePolicy
// for typename will take precedence, and if there are multiple
// supertypes, the properties of policies whose types were added
// later via addPossibleTypes will take precedence over those of
// earlier supertypes. TODO Perhaps we should warn about these
// conflicts in development, and recommend defining the property
// explicitly in the subtype policy?
//
// Field policy inheritance is atomic/shallow: you can't inherit a
// field policy and then override just its read function, since read
// and merge functions often need to cooperate, so changing only one
// of them would be a recipe for inconsistency.
//
// Once the TypePolicy for typename has been accessed, its properties can
// still be updated directly using addTypePolicies, but future changes to
// inherited supertype policies will not be reflected in this subtype
// policy, because this code runs at most once per typename.
var supertypes_1 = this.supertypeMap.get(typename);
if (!supertypes_1 && this.fuzzySubtypes.size) {
// To make the inheritance logic work for unknown typename strings that
// may have fuzzy supertypes, we give this typename an empty supertype
// set and then populate it with any fuzzy supertypes that match.
supertypes_1 = this.getSupertypeSet(typename, true);
// This only works for typenames that are directly matched by a fuzzy
// supertype. What if there is an intermediate chain of supertypes?
// While possible, that situation can only be solved effectively by
// specifying the intermediate relationships via possibleTypes, manually
// and in a non-fuzzy way.
this.fuzzySubtypes.forEach(function (regExp, fuzzy) {
if (regExp.test(typename)) {
// The fuzzy parameter is just the original string version of regExp
// (not a valid __typename string), but we can look up the
// associated supertype(s) in this.supertypeMap.
var fuzzySupertypes = _this.supertypeMap.get(fuzzy);
if (fuzzySupertypes) {
fuzzySupertypes.forEach(function (supertype) {
return supertypes_1.add(supertype);
});
}
}
});
}
if (supertypes_1 && supertypes_1.size) {
supertypes_1.forEach(function (supertype) {
var _a = _this.getTypePolicy(supertype), fields = _a.fields, rest = __rest(_a, ["fields"]);
Object.assign(policy_1, rest);
Object.assign(policy_1.fields, fields);
});
}
}
var inbox = this.toBeAdded[typename];
if (inbox && inbox.length) {
// Merge the pending policies into this.typePolicies, in the order they
// were originally passed to addTypePolicy.
inbox.splice(0).forEach(function (policy) {
_this.updateTypePolicy(typename, policy);
});
}
return this.typePolicies[typename];
};
Policies.prototype.getFieldPolicy = function (typename, fieldName, createIfMissing) {
if (typename) {
var fieldPolicies = this.getTypePolicy(typename).fields;
return (fieldPolicies[fieldName] ||
(createIfMissing && (fieldPolicies[fieldName] = Object.create(null))));
}
};
Policies.prototype.getSupertypeSet = function (subtype, createIfMissing) {
var supertypeSet = this.supertypeMap.get(subtype);
if (!supertypeSet && createIfMissing) {
this.supertypeMap.set(subtype, (supertypeSet = new Set()));
}
return supertypeSet;
};
Policies.prototype.fragmentMatches = function (fragment, typename, result, variables) {
var _this = this;
if (!fragment.typeCondition)
return true;
// If the fragment has a type condition but the object we're matching
// against does not have a __typename, the fragment cannot match.
if (!typename)
return false;
var supertype = fragment.typeCondition.name.value;
// Common case: fragment type condition and __typename are the same.
if (typename === supertype)
return true;
if (this.usingPossibleTypes && this.supertypeMap.has(supertype)) {
var typenameSupertypeSet = this.getSupertypeSet(typename, true);
var workQueue_1 = [typenameSupertypeSet];
var maybeEnqueue_1 = function (subtype) {
var supertypeSet = _this.getSupertypeSet(subtype, false);
if (supertypeSet &&
supertypeSet.size &&
workQueue_1.indexOf(supertypeSet) < 0) {
workQueue_1.push(supertypeSet);
}
};
// We need to check fuzzy subtypes only if we encountered fuzzy
// subtype strings in addPossibleTypes, and only while writing to
// the cache, since that's when selectionSetMatchesResult gives a
// strong signal of fragment matching. The StoreReader class calls
// policies.fragmentMatches without passing a result object, so
// needToCheckFuzzySubtypes is always false while reading.
var needToCheckFuzzySubtypes = !!(result && this.fuzzySubtypes.size);
var checkingFuzzySubtypes = false;
// It's important to keep evaluating workQueue.length each time through
// the loop, because the queue can grow while we're iterating over it.
for (var i = 0; i < workQueue_1.length; ++i) {
var supertypeSet = workQueue_1[i];
if (supertypeSet.has(supertype)) {
if (!typenameSupertypeSet.has(supertype)) {
if (checkingFuzzySubtypes) {
globalThis.__DEV__ !== false && invariant.warn(7, typename, supertype);
}
// Record positive results for faster future lookup.
// Unfortunately, we cannot safely cache negative results,
// because new possibleTypes data could always be added to the
// Policies class.
typenameSupertypeSet.add(supertype);
}
return true;
}
supertypeSet.forEach(maybeEnqueue_1);
if (needToCheckFuzzySubtypes &&
// Start checking fuzzy subtypes only after exhausting all
// non-fuzzy subtypes (after the final iteration of the loop).
i === workQueue_1.length - 1 &&
// We could wait to compare fragment.selectionSet to result
// after we verify the supertype, but this check is often less
// expensive than that search, and we will have to do the
// comparison anyway whenever we find a potential match.
selectionSetMatchesResult(fragment.selectionSet, result, variables)) {
// We don't always need to check fuzzy subtypes (if no result
// was provided, or !this.fuzzySubtypes.size), but, when we do,
// we only want to check them once.
needToCheckFuzzySubtypes = false;
checkingFuzzySubtypes = true;
// If we find any fuzzy subtypes that match typename, extend the
// workQueue to search through the supertypes of those fuzzy
// subtypes. Otherwise the for-loop will terminate and we'll
// return false below.
this.fuzzySubtypes.forEach(function (regExp, fuzzyString) {
var match = typename.match(regExp);
if (match && match[0] === typename) {
maybeEnqueue_1(fuzzyString);
}
});
}
}
}
return false;
};
Policies.prototype.hasKeyArgs = function (typename, fieldName) {
var policy = this.getFieldPolicy(typename, fieldName, false);
return !!(policy && policy.keyFn);
};
Policies.prototype.getStoreFieldName = function (fieldSpec) {
var typename = fieldSpec.typename, fieldName = fieldSpec.fieldName;
var policy = this.getFieldPolicy(typename, fieldName, false);
var storeFieldName;
var keyFn = policy && policy.keyFn;
if (keyFn && typename) {
var context = {
typename: typename,
fieldName: fieldName,
field: fieldSpec.field || null,
variables: fieldSpec.variables,
};
var args = argsFromFieldSpecifier(fieldSpec);
while (keyFn) {
var specifierOrString = keyFn(args, context);
if (isArray(specifierOrString)) {
keyFn = keyArgsFnFromSpecifier(specifierOrString);
}
else {
// If the custom keyFn returns a falsy value, fall back to
// fieldName instead.
storeFieldName = specifierOrString || fieldName;
break;
}
}
}
if (storeFieldName === void 0) {
storeFieldName =
fieldSpec.field ?
storeKeyNameFromField(fieldSpec.field, fieldSpec.variables)
: getStoreKeyName(fieldName, argsFromFieldSpecifier(fieldSpec));
}
// Returning false from a keyArgs function is like configuring
// keyArgs: false, but more dynamic.
if (storeFieldName === false) {
return fieldName;
}
// Make sure custom field names start with the actual field.name.value
// of the field, so we can always figure out which properties of a
// StoreObject correspond to which original field names.
return fieldName === fieldNameFromStoreName(storeFieldName) ? storeFieldName
: fieldName + ":" + storeFieldName;
};
Policies.prototype.readField = function (options, context) {
var objectOrReference = options.from;
if (!objectOrReference)
return;
var nameOrField = options.field || options.fieldName;
if (!nameOrField)
return;
if (options.typename === void 0) {
var typename = context.store.getFieldValue(objectOrReference, "__typename");
if (typename)
options.typename = typename;
}
var storeFieldName = this.getStoreFieldName(options);
var fieldName = fieldNameFromStoreName(storeFieldName);
var existing = context.store.getFieldValue(objectOrReference, storeFieldName);
var policy = this.getFieldPolicy(options.typename, fieldName, false);
var read = policy && policy.read;
if (read) {
var readOptions = makeFieldFunctionOptions(this, objectOrReference, options, context, context.store.getStorage(isReference(objectOrReference) ?
objectOrReference.__ref
: objectOrReference, storeFieldName));
// Call read(existing, readOptions) with cacheSlot holding this.cache.
return cacheSlot.withValue(this.cache, read, [
existing,
readOptions,
]);
}
return existing;
};
Policies.prototype.getReadFunction = function (typename, fieldName) {
var policy = this.getFieldPolicy(typename, fieldName, false);
return policy && policy.read;
};
Policies.prototype.getMergeFunction = function (parentTypename, fieldName, childTypename) {
var policy = this.getFieldPolicy(parentTypename, fieldName, false);
var merge = policy && policy.merge;
if (!merge && childTypename) {
policy = this.getTypePolicy(childTypename);
merge = policy && policy.merge;
}
return merge;
};
Policies.prototype.runMergeFunction = function (existing, incoming, _a, context, storage) {
var field = _a.field, typename = _a.typename, merge = _a.merge;
if (merge === mergeTrueFn) {
// Instead of going to the trouble of creating a full
// FieldFunctionOptions object and calling mergeTrueFn, we can
// simply call mergeObjects, as mergeTrueFn would.
return makeMergeObjectsFunction(context.store)(existing, incoming);
}
if (merge === mergeFalseFn) {
// Likewise for mergeFalseFn, whose implementation is even simpler.
return incoming;
}
// If cache.writeQuery or cache.writeFragment was called with
// options.overwrite set to true, we still call merge functions, but
// the existing data is always undefined, so the merge function will
// not attempt to combine the incoming data with the existing data.
if (context.overwrite) {
existing = void 0;
}
return merge(existing, incoming, makeFieldFunctionOptions(this,
// Unlike options.readField for read functions, we do not fall
// back to the current object if no foreignObjOrRef is provided,
// because it's not clear what the current object should be for
// merge functions: the (possibly undefined) existing object, or
// the incoming object? If you think your merge function needs
// to read sibling fields in order to produce a new value for
// the current field, you might want to rethink your strategy,
// because that's a recipe for making merge behavior sensitive
// to the order in which fields are written into the cache.
// However, readField(name, ref) is useful for merge functions
// that need to deduplicate child objects and references.
void 0, {
typename: typename,
fieldName: field.name.value,
field: field,
variables: context.variables,
}, context, storage || Object.create(null)));
};
return Policies;
}());
export { Policies };
function makeFieldFunctionOptions(policies, objectOrReference, fieldSpec, context, storage) {
var storeFieldName = policies.getStoreFieldName(fieldSpec);
var fieldName = fieldNameFromStoreName(storeFieldName);
var variables = fieldSpec.variables || context.variables;
var _a = context.store, toReference = _a.toReference, canRead = _a.canRead;
return {
args: argsFromFieldSpecifier(fieldSpec),
field: fieldSpec.field || null,
fieldName: fieldName,
storeFieldName: storeFieldName,
variables: variables,
isReference: isReference,
toReference: toReference,
storage: storage,
cache: policies.cache,
canRead: canRead,
readField: function () {
return policies.readField(normalizeReadFieldOptions(arguments, objectOrReference, variables), context);
},
mergeObjects: makeMergeObjectsFunction(context.store),
};
}
export function normalizeReadFieldOptions(readFieldArgs, objectOrReference, variables) {
var fieldNameOrOptions = readFieldArgs[0], from = readFieldArgs[1], argc = readFieldArgs.length;
var options;
if (typeof fieldNameOrOptions === "string") {
options = {
fieldName: fieldNameOrOptions,
// Default to objectOrReference only when no second argument was
// passed for the from parameter, not when undefined is explicitly
// passed as the second argument.
from: argc > 1 ? from : objectOrReference,
};
}
else {
options = __assign({}, fieldNameOrOptions);
// Default to objectOrReference only when fieldNameOrOptions.from is
// actually omitted, rather than just undefined.
if (!hasOwn.call(options, "from")) {
options.from = objectOrReference;
}
}
if (globalThis.__DEV__ !== false && options.from === void 0) {
globalThis.__DEV__ !== false && invariant.warn(8, stringifyForDisplay(Array.from(readFieldArgs)));
}
if (void 0 === options.variables) {
options.variables = variables;
}
return options;
}
function makeMergeObjectsFunction(store) {
return function mergeObjects(existing, incoming) {
if (isArray(existing) || isArray(incoming)) {
throw newInvariantError(9);
}
// These dynamic checks are necessary because the parameters of a
// custom merge function can easily have the any type, so the type
// system cannot always enforce the StoreObject | Reference parameter
// types of options.mergeObjects.
if (isNonNullObject(existing) && isNonNullObject(incoming)) {
var eType = store.getFieldValue(existing, "__typename");
var iType = store.getFieldValue(incoming, "__typename");
var typesDiffer = eType && iType && eType !== iType;
if (typesDiffer) {
return incoming;
}
if (isReference(existing) && storeValueIsStoreObject(incoming)) {
// Update the normalized EntityStore for the entity identified by
// existing.__ref, preferring/overwriting any fields contributed by the
// newer incoming StoreObject.
store.merge(existing.__ref, incoming);
return existing;
}
if (storeValueIsStoreObject(existing) && isReference(incoming)) {
// Update the normalized EntityStore for the entity identified by
// incoming.__ref, taking fields from the older existing object only if
// those fields are not already present in the newer StoreObject
// identified by incoming.__ref.
store.merge(existing, incoming.__ref);
return incoming;
}
if (storeValueIsStoreObject(existing) &&
storeValueIsStoreObject(incoming)) {
return __assign(__assign({}, existing), incoming);
}
}
return incoming;
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWNpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2FjaGUvaW5tZW1vcnkvcG9saWNpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQWVoRixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN4QixXQUFXLEVBQ1gsZUFBZSxFQUNmLGVBQWUsRUFDZixtQkFBbUIsR0FDcEIsTUFBTSwwQkFBMEIsQ0FBQztBQU9sQyxPQUFPLEVBQ0wsTUFBTSxFQUNOLHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIseUJBQXlCLEVBQ3pCLHFCQUFxQixFQUNyQix1QkFBdUIsRUFDdkIsT0FBTyxHQUNSLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQVk5QyxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHdCQUF3QixHQUN6QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBa0g3RCxTQUFTLHNCQUFzQixDQUFDLElBQW9CO0lBQ2xELE9BQU8sQ0FDTCxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSTtRQUNoQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ25FLENBQUMsQ0FBQyxJQUFJLENBQ1AsQ0FBQztBQUNKLENBQUM7QUE2RkQsSUFBTSxlQUFlLEdBQXNCLGNBQU0sT0FBQSxLQUFLLENBQUMsRUFBTixDQUFNLENBQUM7QUFDeEQsSUFBTSxlQUFlLEdBQW9CLFVBQUMsS0FBSyxFQUFFLE9BQU8sSUFBSyxPQUFB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UUFBUSxDQUFDLEVBQ2pDLENBQUM7Z0JBQ0QsNkJBQVksUUFBUSxHQUFLLFFBQVEsRUFBRztZQUN0QyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbnZhcmlhbnQsIG5ld0ludmFyaWFudEVycm9yIH0gZnJvbSBcIi4uLy4uL3V0aWxpdGllcy9nbG9iYWxzL2luZGV4LmpzXCI7XG5cbmltcG9ydCB0eXBlIHtcbiAgSW5saW5lRnJhZ21lbnROb2RlLFxuICBGcmFnbWVudERlZmluaXRpb25Ob2RlLFxuICBTZWxlY3Rpb25TZXROb2RlLFxuICBGaWVsZE5vZGUsXG59IGZyb20gXCJncmFwaHFsXCI7XG5cbmltcG9ydCB0eXBlIHtcbiAgRnJhZ21lbnRNYXAsXG4gIFN0b3JlVmFsdWUsXG4gIFN0b3JlT2JqZWN0LFxuICBSZWZlcmVuY2UsXG59IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvaW5kZXguanNcIjtcbmltcG9ydCB7XG4gIHN0b3JlS2V5TmFtZUZyb21GaWVsZCxcbiAgYXJndW1lbnRzT2JqZWN0RnJvbUZpZWxkLFxuICBpc1JlZmVyZW5jZSxcbiAgZ2V0U3RvcmVLZXlOYW1lLFxuICBpc05vbk51bGxPYmplY3QsXG4gIHN0cmluZ2lmeUZvckRpc3BsYXksXG59IGZyb20gXCIuLi8uLi91dGlsaXRpZXMvaW5kZXguanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgSWRHZXR0ZXIsXG4gIE1lcmdlSW5mbyxcbiAgTm9ybWFsaXplZENhY2hlLFxuICBSZWFkTWVyZ2VNb2RpZnlDb250ZXh0LFxufSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuaW1wb3J0IHtcbiAgaGFzT3duLFxuICBmaWVsZE5hbWVGcm9tU3RvcmVOYW1lLFxuICBzdG9yZVZhbHVlSXNTdG9yZU9iamVjdCxcbiAgc2VsZWN0aW9uU2V0TWF0Y2hlc1Jlc3VsdCxcbiAgVHlwZU9yRmllbGROYW1lUmVnRXhwLFxuICBkZWZhdWx0RGF0YUlkRnJvbU9iamVjdCxcbiAgaXNBcnJheSxcbn0gZnJvbSBcIi4vaGVscGVycy5qc1wiO1xuaW1wb3J0IHsgY2FjaGVTbG90IH0gZnJvbSBcIi4vcmVhY3RpdmVWYXJzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEluTWVtb3J5Q2FjaGUgfSBmcm9tIFwiLi9pbk1lbW9yeUNhY2hlLmpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFNhZmVSZWFkb25seSxcbiAgRmllbGRTcGVjaWZpZXIsXG4gIFRvUmVmZXJlbmNlRnVuY3Rpb24sXG4gIFJlYWRGaWVsZEZ1bmN0aW9uLFxuICBSZWFkRmllbGRPcHRpb25zLFxuICBDYW5SZWFkRnVuY3Rpb24sXG59IGZyb20gXCIuLi9jb3JlL3R5cGVzL2NvbW1vbi5qc1wiO1xuaW1wb3J0IHR5cGUgeyBXcml0ZUNvbnRleHQgfSBmcm9tIFwiLi93cml0ZVRvU3RvcmUuanNcIjtcblxuaW1wb3J0IHtcbiAga2V5QXJnc0ZuRnJvbVNwZWNpZmllcixcbiAga2V5RmllbGRzRm5Gcm9tU3BlY2lmaWVyLFxufSBmcm9tIFwiLi9rZXktZXh0cmFjdG9yLmpzXCI7XG5pbXBvcnQgeyBkaXNhYmxlV2FybmluZ3NTbG90IH0gZnJvbSBcIi4uLy4uL21hc2tpbmcvaW5kZXguanNcIjtcblxuZXhwb3J0IHR5cGUgVHlwZVBvbGljaWVzID0ge1xuICBbX190eXBlbmFtZTogc3RyaW5nXTogVHlwZVBvbGljeTtcbn07XG5cbi8vIFR5cGVTY3JpcHQgMy43IHdpbGwgYWxsb3cgcmVjdXJzaXZlIHR5cGUgYWxpYXNlcywgc28gdGhpcyBzaG91bGQgd29yazpcbi8vIHR5cGUgS2V5U3BlY2lmaWVyID0gKHN0cmluZyB8IEtleVNwZWNpZmllcilbXVxuZXhwb3J0IHR5cGUgS2V5U3BlY2lmaWVyID0gUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBLZXlTcGVjaWZpZXI+O1xuXG5leHBvcnQgdHlwZSBLZXlGaWVsZHNDb250ZXh0ID0ge1xuICAvLyBUaGUgX190eXBlbmFtZSBvZiB0aGUgaW5jb21pbmcgb2JqZWN0LCBldmVuIGlmIHRoZSBfX3R5cGVuYW1lIGZpZWxkIHdhc1xuICAvLyBhbGlhc2VkIHRvIGFub3RoZXIgbmFtZSBpbiB0aGUgcmF3IHJlc3VsdCBvYmplY3QuIE1heSBiZSB1bmRlZmluZWQgd2hlblxuICAvLyBkYXRhSWRGcm9tT2JqZWN0IGlzIGNhbGxlZCBmb3Igb2JqZWN0cyB3aXRob3V0IF9fdHlwZW5hbWUgZmllbGRzLlxuICB0eXBlbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSBvYmplY3QgdG8gYmUgaWRlbnRpZmllZCwgYWZ0ZXIgcHJvY2Vzc2luZyB0byByZW1vdmUgYWxpYXNlcyBhbmRcbiAgLy8gbm9ybWFsaXplIGlkZW50aWZpYWJsZSBjaGlsZCBvYmplY3RzIHdpdGggcmVmZXJlbmNlcy5cbiAgc3RvcmVPYmplY3Q6IFN0b3JlT2JqZWN0O1xuXG4gIC8vIEhhbmR5IHRvb2wgZm9yIHJlYWRpbmcgYWRkaXRpb25hbCBmaWVsZHMgZnJvbSBjb250ZXh0LnN0b3JlT2JqZWN0LCBlaXRoZXJcbiAgLy8gcmVhZEZpZWxkKFwiZmllbGROYW1lXCIpIHRvIHJlYWQgc3RvcmVPYmplY3RbZmllbGROYW1lXSwgb3IgcmVhZEZpZWxkKFwibmFtZVwiLFxuICAvLyBvYmplY3RPclJlZmVyZW5jZSkgdG8gcmVhZCBmcm9tIGFub3RoZXIgb2JqZWN0IG9yIFJlZmVyZW5jZS4gSWYgeW91IHJlYWQgYVxuICAvLyBmaWVsZCB3aXRoIGEgcmVhZCBmdW5jdGlvbiwgdGhhdCBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQuXG4gIHJlYWRGaWVsZDogUmVhZEZpZWxkRnVuY3Rpb247XG5cbiAgLy8gSWYgeW91IGFyZSB3cml0aW5nIGEgY3VzdG9tIGtleUZpZWxkcyBmdW5jdGlvbiwgYW5kIHlvdSBwbGFuIHRvIHVzZSB0aGUgcmF3XG4gIC8vIHJlc3VsdCBvYmplY3QgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCwgeW91IG1heSBhbHNvIG5lZWQgYWNjZXNzIHRvIHRoZVxuICAvLyBzZWxlY3Rpb24gc2V0IGFuZCBhdmFpbGFibGUgZnJhZ21lbnRzIGZvciB0aGlzIG9iamVjdCwganVzdCBpbiBjYXNlIGFueVxuICAvLyBmaWVsZHMgaGF2ZSBhbGlhc2VzLiBTaW5jZSB0aGlzIGxvZ2ljIGlzIHRyaWNreSB0byBnZXQgcmlnaHQsIGFuZCB0aGVzZVxuICAvLyBjb250ZXh0IHByb3BlcnRpZXMgYXJlIG5vdCBldmVuIGFsd2F5cyBwcm92aWRlZCAoZm9yIGV4YW1wbGUsIHRoZXkgYXJlXG4gIC8vIG9taXR0ZWQgd2hlbiBjYWxsaW5nIGNhY2hlLmlkZW50aWZ5KG9iamVjdCksIHdoZXJlIG9iamVjdCBpcyBhc3N1bWVkIHRvIGJlXG4gIC8vIGEgU3RvcmVPYmplY3QpLCB3ZSByZWNvbW1lbmQgeW91IHVzZSBjb250ZXh0LnN0b3JlT2JqZWN0ICh3aGljaCBoYXMgYWxyZWFkeVxuICAvLyBiZWVuIGRlLWFsaWFzZWQpIGFuZCBjb250ZXh0LnJlYWRGaWVsZCAod2hpY2ggY2FuIHJlYWQgZnJvbSByZWZlcmVuY2VzIGFzXG4gIC8vIHdlbGwgYXMgb2JqZWN0cykgaW5zdGVhZCBvZiB0aGUgcmF3IHJlc3VsdCBvYmplY3QgaW4geW91ciBrZXlGaWVsZHNcbiAgLy8gZnVuY3Rpb25zLCBvciBqdXN0IHJlbHkgb24gdGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIGtleUZpZWxkczpbLi4uXVxuICAvLyBzeW50YXggdG8gZ2V0IHRoZXNlIGRldGFpbHMgcmlnaHQgZm9yIHlvdS5cbiAgc2VsZWN0aW9uU2V0PzogU2VsZWN0aW9uU2V0Tm9kZTtcbiAgZnJhZ21lbnRNYXA/OiBGcmFnbWVudE1hcDtcblxuICAvLyBJbnRlcm5hbC4gTWF5IGJlIHNldCBieSB0aGUgS2V5RmllbGRzRnVuY3Rpb24gdG8gcmVwb3J0IGZpZWxkcyB0aGF0IHdlcmVcbiAgLy8gaW52b2x2ZWQgaW4gY29tcHV0aW5nIHRoZSBJRC4gTmV2ZXIgcGFzc2VkIGluIGJ5IHRoZSBjYWxsZXIuXG4gIGtleU9iamVjdD86IFJlY29yZDxzdHJpbmcsIGFueT47XG59O1xuXG5leHBvcnQgdHlwZSBLZXlGaWVsZHNGdW5jdGlvbiA9IChcbiAgb2JqZWN0OiBSZWFkb25seTxTdG9yZU9iamVjdD4sXG4gIGNvbnRleHQ6IEtleUZpZWxkc0NvbnRleHRcbikgPT4gS2V5U3BlY2lmaWVyIHwgZmFsc2UgfCBSZXR1cm5UeXBlPElkR2V0dGVyPjtcblxudHlwZSBLZXlGaWVsZHNSZXN1bHQgPSBFeGNsdWRlPFJldHVyblR5cGU8S2V5RmllbGRzRnVuY3Rpb24+LCBLZXlTcGVjaWZpZXI+O1xuXG4vLyBUT0RPIFNob3VsZCBUeXBlUG9saWN5IGJlIGEgZ2VuZXJpYyB0eXBlLCB3aXRoIGEgVE9iamVjdCBvciBURW50aXR5XG4vLyB0eXBlIHBhcmFtZXRlcj9cbmV4cG9ydCB0eXBlIFR5cGVQb2xpY3kgPSB7XG4gIC8vIEFsbG93cyBkZWZpbmluZyB0aGUgcHJpbWFyeSBrZXkgZmllbGRzIGZvciB0aGlzIHR5cGUsIGVpdGhlciB1c2luZyBhblxuICAvLyBhcnJheSBvZiBmaWVsZCBuYW1lcyBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBhcmJpdHJhcnkgc3RyaW5nLlxuICBrZXlGaWVsZHM/OiBLZXlTcGVjaWZpZXIgfCBLZXlGaWVsZHNGdW5jdGlvbiB8IGZhbHNlO1xuXG4gIC8vIEFsbG93cyBkZWZpbmluZyBhIG1lcmdlIGZ1bmN0aW9uIChvciBtZXJnZTp0cnVlL2ZhbHNlIHNob3J0aGFuZCkgdG9cbiAgLy8gYmUgdXNlZCBmb3IgbWVyZ2luZyBvYmplY3RzIG9mIHRoaXMgdHlwZSB3aGVyZXZlciB0aGV5IGFwcGVhciwgdW5sZXNzXG4gIC8vIHRoZSBwYXJlbnQgZmllbGQgYWxzbyBkZWZpbmVzIGEgbWVyZ2UgZnVuY3Rpb24vYm9vbGVhbiAodGhhdCBpcyxcbiAgLy8gcGFyZW50IGZpZWxkIG1lcmdlIGZ1bmN0aW9ucyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0eXBlIHBvbGljeSBtZXJnZVxuICAvLyBmdW5jdGlvbnMpLiBJbiBtYW55IGNhc2VzLCBkZWZpbmluZyBtZXJnZTp0cnVlIGZvciBhIGdpdmVuIHR5cGVcbiAgLy8gcG9saWN5IGNhbiBzYXZlIHlvdSBmcm9tIHNwZWNpZnlpbmcgbWVyZ2U6dHJ1ZSBmb3IgYWxsIHRoZSBmaWVsZFxuICAvLyBwb2xpY2llcyB3aGVyZSB0aGF0IHR5cGUgbWlnaHQgYmUgZW5jb3VudGVyZWQuXG4gIG1lcmdlPzogRmllbGRNZXJnZUZ1bmN0aW9uIHwgYm9vbGVhbjtcblxuICAvLyBJbiB0aGUgcmFyZSBldmVudCB0aGF0IHlvdXIgc2NoZW1hIGhhcHBlbnMgdG8gdXNlIGEgZGlmZmVyZW50XG4gIC8vIF9fdHlwZW5hbWUgZm9yIHRoZSByb290IFF1ZXJ5LCBNdXRhdGlvbiwgYW5kL29yIFNjaGVtYSB0eXBlcywgeW91IGNhblxuICAvLyBleHByZXNzIHlvdXIgZGV2aWFudCBwcmVmZXJlbmNlcyBieSBlbmFibGluZyBvbmUgb2YgdGhlc2Ugb3B0aW9ucy5cbiAgcXVlcnlUeXBlPzogdHJ1ZTtcbiAgbXV0YXRpb25UeXBlPzogdHJ1ZTtcbiAgc3Vic2NyaXB0aW9uVHlwZT86IHRydWU7XG5cbiAgZmllbGRzPzoge1xuICAgIFtmaWVsZE5hbWU6IHN0cmluZ106IEZpZWxkUG9saWN5PGFueT4gfCBGaWVsZFJlYWRGdW5jdGlvbjxhbnk+O1xuICB9O1xufTtcblxuZXhwb3J0IHR5cGUgS2V5QXJnc0Z1bmN0aW9uID0gKFxuICBhcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCxcbiAgY29udGV4dDoge1xuICAgIHR5cGVuYW1lOiBzdHJpbmc7XG4gICAgZmllbGROYW1lOiBzdHJpbmc7XG4gICAgZmllbGQ6IEZpZWxkTm9kZSB8IG51bGw7XG4gICAgdmFyaWFibGVzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgfVxuKSA9PiBLZXlTcGVjaWZpZXIgfCBmYWxzZSB8IFJldHVyblR5cGU8SWRHZXR0ZXI+O1xuXG5leHBvcnQgdHlwZSBGaWVsZFBvbGljeTxcbiAgLy8gVGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIHVzZWQgdG8gc3RvcmUgdGhlIGZpZWxkJ3MgZGF0YSBpbiB0aGVcbiAgLy8gY2FjaGUuIE11c3QgYmUgSlNPTi1zZXJpYWxpemFibGUgaWYgeW91IHBsYW4gdG8gc2VyaWFsaXplIHRoZSByZXN1bHRcbiAgLy8gb2YgY2FjaGUuZXh0cmFjdCgpIHVzaW5nIEpTT04uXG4gIFRFeGlzdGluZyA9IGFueSxcbiAgLy8gVGhlIHR5cGUgb2YgdGhlIGluY29taW5nIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIG1lcmdlIGZ1bmN0aW9uLFxuICAvLyB0eXBpY2FsbHkgbWF0Y2hpbmcgdGhlIEdyYXBoUUwgcmVzcG9uc2UgZm9ybWF0LCBidXQgd2l0aCBSZWZlcmVuY2VcbiAgLy8gb2JqZWN0cyBzdWJzdGl0dXRlZCBmb3IgYW55IGlkZW50aWZpYWJsZSBjaGlsZCBvYmplY3RzLiBPZnRlbiB0aGVcbiAgLy8gc2FtZSBhcyBURXhpc3RpbmcsIGJ1dCBub3QgbmVjZXNzYXJpbHkuXG4gIFRJbmNvbWluZyA9IFRFeGlzdGluZyxcbiAgLy8gVGhlIHR5cGUgdGhhdCB0aGUgcmVhZCBmdW5jdGlvbiBhY3R1YWxseSByZXR1cm5zLCB1c2luZyBURXhpc3RpbmdcbiAgLy8gZGF0YSBhbmQgb3B0aW9ucy5hcmdzIGFzIGlucHV0LiBVc3VhbGx5IHRoZSBzYW1lIGFzIFRJbmNvbWluZy5cbiAgVFJlYWRSZXN1bHQgPSBUSW5jb21pbmcsXG4gIC8vIEFsbG93cyBGaWVsZEZ1bmN0aW9uT3B0aW9ucyBkZWZpbml0aW9uIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZVxuICAvLyBkZXZlbG9wZXJcbiAgVE9wdGlvbnMgZXh0ZW5kcyBGaWVsZEZ1bmN0aW9uT3B0aW9ucyA9IEZpZWxkRnVuY3Rpb25PcHRpb25zLFxuPiA9IHtcbiAga2V5QXJncz86IEtleVNwZWNpZmllciB8IEtleUFyZ3NGdW5jdGlvbiB8IGZhbHNlO1xuICByZWFkPzogRmllbGRSZWFkRnVuY3Rpb248VEV4aXN0aW5nLCBUUmVhZFJlc3VsdCwgVE9wdGlvbnM+O1xuICBtZXJnZT86IEZpZWxkTWVyZ2VGdW5jdGlvbjxURXhpc3RpbmcsIFRJbmNvbWluZywgVE9wdGlvbnM+IHwgYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VUeXBlID0gUmVjb3JkPHN0cmluZywgYW55PjtcblxuZnVuY3Rpb24gYXJnc0Zyb21GaWVsZFNwZWNpZmllcihzcGVjOiBGaWVsZFNwZWNpZmllcikge1xuICByZXR1cm4gKFxuICAgIHNwZWMuYXJncyAhPT0gdm9pZCAwID8gc3BlYy5hcmdzXG4gICAgOiBzcGVjLmZpZWxkID8gYXJndW1lbnRzT2JqZWN0RnJvbUZpZWxkKHNwZWMuZmllbGQsIHNwZWMudmFyaWFibGVzKVxuICAgIDogbnVsbFxuICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkRnVuY3Rpb25PcHRpb25zPFxuICBUQXJncyA9IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIFRWYXJzID0gUmVjb3JkPHN0cmluZywgYW55Pixcbj4ge1xuICBhcmdzOiBUQXJncyB8IG51bGw7XG5cbiAgLy8gVGhlIG5hbWUgb2YgdGhlIGZpZWxkLCBlcXVhbCB0byBvcHRpb25zLmZpZWxkLm5hbWUudmFsdWUgd2hlblxuICAvLyBvcHRpb25zLmZpZWxkIGlzIGF2YWlsYWJsZS4gVXNlZnVsIGlmIHlvdSByZXVzZSB0aGUgc2FtZSBmdW5jdGlvbiBmb3JcbiAgLy8gbXVsdGlwbGUgZmllbGRzLCBhbmQgeW91IG5lZWQgdG8ga25vdyB3aGljaCBmaWVsZCB5b3UncmUgY3VycmVudGx5XG4gIC8vIHByb2Nlc3NpbmcuIEFsd2F5cyBhIHN0cmluZywgZXZlbiB3aGVuIG9wdGlvbnMuZmllbGQgaXMgbnVsbC5cbiAgZmllbGROYW1lOiBzdHJpbmc7XG5cbiAgLy8gVGhlIGZ1bGwgZmllbGQga2V5IHVzZWQgaW50ZXJuYWxseSwgaW5jbHVkaW5nIHNlcmlhbGl6ZWQga2V5IGFyZ3VtZW50cy5cbiAgc3RvcmVGaWVsZE5hbWU6IHN0cmluZztcblxuICAvLyBUaGUgRmllbGROb2RlIG9iamVjdCB1c2VkIHRvIHJlYWQgdGhpcyBmaWVsZC4gVXNlZnVsIGlmIHlvdSBuZWVkIHRvXG4gIC8vIGtub3cgYWJvdXQgb3RoZXIgYXR0cmlidXRlcyBvZiB0aGUgZmllbGQsIHN1Y2ggYXMgaXRzIGRpcmVjdGl2ZXMuIFRoaXNcbiAgLy8gb3B0aW9uIHdpbGwgYmUgbnVsbCB3aGVuIGEgc3RyaW5nIHdhcyBwYXNzZWQgdG8gb3B0aW9ucy5yZWFkRmllbGQuXG4gIGZpZWxkOiBGaWVsZE5vZGUgfCBudWxsO1xuXG4gIHZhcmlhYmxlcz86IFRWYXJzO1xuXG4gIC8vIFV0aWxpdGllcyBmb3IgZGVhbGluZyB3aXRoIHsgX19yZWYgfSBvYmplY3RzLlxuICBpc1JlZmVyZW5jZTogdHlwZW9mIGlzUmVmZXJlbmNlO1xuICB0b1JlZmVyZW5jZTogVG9SZWZlcmVuY2VGdW5jdGlvbjtcblxuICAvLyBBIGhhbmR5IHBsYWNlIHRvIHB1dCBmaWVsZC1zcGVjaWZpYyBkYXRhIHRoYXQgeW91IHdhbnQgdG8gc3Vydml2ZVxuICAvLyBhY3Jvc3MgbXVsdGlwbGUgcmVhZCBmdW5jdGlvbiBjYWxscy4gVXNlZnVsIGZvciBmaWVsZC1sZXZlbCBjYWNoaW5nLFxuICAvLyBpZiB5b3VyIHJlYWQgZnVuY3Rpb24gZG9lcyBhbnkgZXhwZW5zaXZlIHdvcmsuXG4gIHN0b3JhZ2U6IFN0b3JhZ2VUeXBlO1xuXG4gIGNhY2hlOiBJbk1lbW9yeUNhY2hlO1xuXG4gIC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgcmVhZGluZyBvdGhlciBmaWVsZHMgd2l0aGluIHRoZSBjdXJyZW50IG9iamVjdC5cbiAgLy8gSWYgYSBmb3JlaWduIG9iamVjdCBvciByZWZlcmVuY2UgaXMgcHJvdmlkZWQsIHRoZSBmaWVsZCB3aWxsIGJlIHJlYWRcbiAgLy8gZnJvbSB0aGF0IG9iamVjdCBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IG9iamVjdCwgc28gdGhpcyBmdW5jdGlvbiBjYW5cbiAgLy8gYmUgdXNlZCAodG9nZXRoZXIgd2l0aCBpc1JlZmVyZW5jZSkgdG8gZXhhbWluZSB0aGUgY2FjaGUgb3V0c2lkZSB0aGVcbiAgLy8gY3VycmVudCBvYmplY3QuIElmIGEgRmllbGROb2RlIGlzIHBhc3NlZCBpbnN0ZWFkIG9mIGEgc3RyaW5nLCBhbmRcbiAgLy8gdGhhdCBGaWVsZE5vZGUgaGFzIGFyZ3VtZW50cywgdGhlIHNhbWUgb3B0aW9ucy52YXJpYWJsZXMgd2lsbCBiZSB1c2VkXG4gIC8vIHRvIGNvbXB1dGUgdGhlIGFyZ3VtZW50IHZhbHVlcy4gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gd2lsbCBpbnZva2VcbiAgLy8gY3VzdG9tIHJlYWQgZnVuY3Rpb25zIGZvciBvdGhlciBmaWVsZHMsIGlmIGRlZmluZWQuIEFsd2F5cyByZXR1cm5zXG4gIC8vIGltbXV0YWJsZSBkYXRhIChlbmZvcmNlZCB3aXRoIE9iamVjdC5mcmVlemUgaW4gZGV2ZWxvcG1lbnQpLlxuICByZWFkRmllbGQ6IFJlYWRGaWVsZEZ1bmN0aW9uO1xuXG4gIC8vIFJldHVybnMgdHJ1ZSBmb3Igbm9uLW5vcm1hbGl6ZWQgU3RvcmVPYmplY3RzIGFuZCBub24tZGFuZ2xpbmdcbiAgLy8gUmVmZXJlbmNlcywgaW5kaWNhdGluZyB0aGF0IHJlYWRGaWVsZChuYW1lLCBvYmpPclJlZikgaGFzIGEgY2hhbmNlIG9mXG4gIC8vIHdvcmtpbmcuIFVzZWZ1bCBmb3IgZmlsdGVyaW5nIG91dCBkYW5nbGluZyByZWZlcmVuY2VzIGZyb20gbGlzdHMuXG4gIGNhblJlYWQ6IENhblJlYWRGdW5jdGlvbjtcblxuICAvLyBJbnN0ZWFkIG9mIGp1c3QgbWVyZ2luZyBvYmplY3RzIHdpdGggeyAuLi5leGlzdGluZywgLi4uaW5jb21pbmcgfSwgdGhpc1xuICAvLyBoZWxwZXIgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gbWVyZ2Ugb2JqZWN0cyBpbiBhIHdheSB0aGF0IHJlc3BlY3RzIGFueVxuICAvLyBjdXN0b20gbWVyZ2UgZnVuY3Rpb25zIGRlZmluZWQgZm9yIHRoZWlyIGZpZWxkcy5cbiAgbWVyZ2VPYmplY3RzOiBNZXJnZU9iamVjdHNGdW5jdGlvbjtcbn1cblxudHlwZSBNZXJnZU9iamVjdHNGdW5jdGlvbiA9IDxUIGV4dGVuZHMgU3RvcmVPYmplY3QgfCBSZWZlcmVuY2U+KFxuICBleGlzdGluZzogVCxcbiAgaW5jb21pbmc6IFRcbikgPT4gVDtcblxuZXhwb3J0IHR5cGUgRmllbGRSZWFkRnVuY3Rpb248XG4gIFRFeGlzdGluZyA9IGFueSxcbiAgVFJlYWRSZXN1bHQgPSBURXhpc3RpbmcsXG4gIFRPcHRpb25zIGV4dGVuZHMgRmllbGRGdW5jdGlvbk9wdGlvbnMgPSBGaWVsZEZ1bmN0aW9uT3B0aW9ucyxcbj4gPSAoXG4gIC8vIFdoZW4gcmVhZGluZyBhIGZpZWxkLCBvbmUgb2Z0ZW4gbmVlZHMgdG8ga25vdyBhYm91dCBhbnkgZXhpc3RpbmdcbiAgLy8gdmFsdWUgc3RvcmVkIGZvciB0aGF0IGZpZWxkLiBJZiB0aGUgZmllbGQgaXMgcmVhZCBiZWZvcmUgYW55IHZhbHVlXG4gIC8vIGhhcyBiZWVuIHdyaXR0ZW4gdG8gdGhlIGNhY2hlLCB0aGlzIGV4aXN0aW5nIHBhcmFtZXRlciB3aWxsIGJlXG4gIC8vIHVuZGVmaW5lZCwgd2hpY2ggbWFrZXMgaXQgZWFzeSB0byB1c2UgYSBkZWZhdWx0IHBhcmFtZXRlciBleHByZXNzaW9uXG4gIC8vIHRvIHN1cHBseSB0aGUgaW5pdGlhbCB2YWx1ZS4gVGhpcyBwYXJhbWV0ZXIgaXMgcG9zaXRpb25hbCAocmF0aGVyXG4gIC8vIHRoYW4gb25lIG9mIHRoZSBuYW1lZCBvcHRpb25zKSBiZWNhdXNlIHRoYXQgbWFrZXMgaXQgcG9zc2libGUgZm9yIHRoZVxuICAvLyBkZXZlbG9wZXIgdG8gYW5ub3RhdGUgaXQgd2l0aCBhIHR5cGUsIHdpdGhvdXQgYWxzbyBoYXZpbmcgdG8gcHJvdmlkZVxuICAvLyBhIHdob2xlIG5ldyB0eXBlIGZvciB0aGUgb3B0aW9ucyBvYmplY3QuXG4gIGV4aXN0aW5nOiBTYWZlUmVhZG9ubHk8VEV4aXN0aW5nPiB8IHVuZGVmaW5lZCxcbiAgb3B0aW9uczogVE9wdGlvbnNcbikgPT4gVFJlYWRSZXN1bHQgfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCB0eXBlIEZpZWxkTWVyZ2VGdW5jdGlvbjxcbiAgVEV4aXN0aW5nID0gYW55LFxuICBUSW5jb21pbmcgPSBURXhpc3RpbmcsXG4gIC8vIFBhc3NpbmcgdGhlIHdob2xlIEZpZWxkRnVuY3Rpb25PcHRpb25zIG1ha2VzIHRoZSBjdXJyZW50IGRlZmluaXRpb25cbiAgLy8gaW5kZXBlbmRlbnQgZnJvbSBpdHMgaW1wbGVtZW50YXRpb25cbiAgVE9wdGlvbnMgZXh0ZW5kcyBGaWVsZEZ1bmN0aW9uT3B0aW9ucyA9IEZpZWxkRnVuY3Rpb25PcHRpb25zLFxuPiA9IChcbiAgZXhpc3Rpbmc6IFNhZmVSZWFkb25seTxURXhpc3Rpbmc+IHwgdW5kZWZpbmVkLFxuICAvLyBUaGUgaW5jb21pbmcgcGFyYW1ldGVyIG5lZWRzIHRvIGJlIHBvc2l0aW9uYWwgYXMgd2VsbCwgZm9yIHRoZSBzYW1lXG4gIC8vIHJlYXNvbnMgZGlzY3Vzc2VkIGluIEZpZWxkUmVhZEZ1bmN0aW9uIGFib3ZlLlxuICBpbmNvbWluZzogU2FmZVJlYWRvbmx5PFRJbmNvbWluZz4sXG4gIG9wdGlvbnM6IFRPcHRpb25zXG4pID0+IFNhZmVSZWFkb25seTxURXhpc3Rpbmc+O1xuXG5jb25zdCBudWxsS2V5RmllbGRzRm46IEtleUZpZWxkc0Z1bmN0aW9uID0gKCkgPT4gdm9pZCAwO1xuY29uc3Qgc2ltcGxlS2V5QXJnc0ZuOiBLZXlBcmdzRnVuY3Rpb24gPSAoX2FyZ3MsIGNvbnRleHQpID0+IGNvbnRleHQuZmllbGROYW1lO1xuXG4vLyBUaGVzZSBtZXJnZSBmdW5jdGlvbnMgY2FuIGJlIHNlbGVjdGVkIGJ5IHNwZWNpZnlpbmcgbWVyZ2U6dHJ1ZSBvclxuLy8gbWVyZ2U6ZmFsc2UgaW4gYSBmaWVsZCBwb2xpY3kuXG5jb25zdCBtZXJnZVRydWVGbjogRmllbGRNZXJnZUZ1bmN0aW9uPGFueT4gPSAoXG4gIGV4aXN0aW5nLFxuICBpbmNvbWluZyxcbiAgeyBtZXJnZU9iamVjdHMgfVxuKSA9PiBtZXJnZU9iamVjdHMoZXhpc3RpbmcsIGluY29taW5nKTtcbmNvbnN0IG1lcmdlRmFsc2VGbjogRmllbGRNZXJnZUZ1bmN0aW9uPGFueT4gPSAoXywgaW5jb21pbmcpID0+IGluY29taW5nO1xuXG5leHBvcnQgdHlwZSBQb3NzaWJsZVR5cGVzTWFwID0ge1xuICBbc3VwZXJ0eXBlOiBzdHJpbmddOiBzdHJpbmdbXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBQb2xpY2llcyB7XG4gIHByaXZhdGUgdHlwZVBvbGljaWVzOiB7XG4gICAgW19fdHlwZW5hbWU6IHN0cmluZ106IHtcbiAgICAgIGtleUZuPzogS2V5RmllbGRzRnVuY3Rpb247XG4gICAgICBtZXJnZT86IEZpZWxkTWVyZ2VGdW5jdGlvbjxhbnk+O1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIFtmaWVsZE5hbWU6IHN0cmluZ106IHtcbiAgICAgICAgICBrZXlGbj86IEtleUFyZ3NGdW5jdGlvbjtcbiAgICAgICAgICByZWFkPzogRmllbGRSZWFkRnVuY3Rpb248YW55PjtcbiAgICAgICAgICBtZXJnZT86IEZpZWxkTWVyZ2VGdW5jdGlvbjxhbnk+O1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9O1xuICB9ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICBwcml2YXRlIHRvQmVBZGRlZDoge1xuICAgIFtfX3R5cGVuYW1lOiBzdHJpbmddOiBUeXBlUG9saWN5W107XG4gIH0gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIC8vIE1hcCBmcm9tIHN1YnR5cGUgbmFtZXMgdG8gc2V0cyBvZiBzdXBlcnR5cGUgbmFtZXMuIE5vdGUgdGhhdCB0aGlzXG4gIC8vIHJlcHJlc2VudGF0aW9uIGludmVydHMgdGhlIHN0cnVjdHVyZSBvZiBwb3NzaWJsZVR5cGVzICh3aG9zZSBrZXlzIGFyZVxuICAvLyBzdXBlcnR5cGVzIGFuZCB3aG9zZSB2YWx1ZXMgYXJlIGFycmF5cyBvZiBzdWJ0eXBlcykgYmVjYXVzZSBpdCB0ZW5kc1xuICAvLyB0byBiZSBtdWNoIG1vcmUgZWZmaWNpZW50IHRvIHNlYXJjaCB1cHdhcmRzIHRoYW4gZG93bndhcmRzLlxuICBwcml2YXRlIHN1cGVydHlwZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblxuICAvLyBBbnkgZnV6enkgc3VidHlwZXMgc3BlY2lmaWVkIGJ5IHBvc3NpYmxlVHlwZXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG9cbiAgLy8gUmVnRXhwIG9iamVjdHMgYW5kIHJlY29yZGVkIGhlcmUuIEV2ZXJ5IGtleSBvZiB0aGlzIG1hcCBjYW4gYWxzbyBiZVxuICAvLyBmb3VuZCBpbiBzdXBlcnR5cGVNYXAuIEluIG1hbnkgY2FzZXMgdGhpcyBNYXAgd2lsbCBiZSBlbXB0eSwgd2hpY2hcbiAgLy8gbWVhbnMgbm8gZnV6enkgc3VidHlwZSBjaGVja2luZyB3aWxsIGhhcHBlbiBpbiBmcmFnbWVudE1hdGNoZXMuXG4gIHByaXZhdGUgZnV6enlTdWJ0eXBlcyA9IG5ldyBNYXA8c3RyaW5nLCBSZWdFeHA+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNhY2hlOiBJbk1lbW9yeUNhY2hlO1xuXG4gIHB1YmxpYyByZWFkb25seSByb290SWRzQnlUeXBlbmFtZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9XG4gICAgT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IHJvb3RUeXBlbmFtZXNCeUlkOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID1cbiAgICBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSB1c2luZ1Bvc3NpYmxlVHlwZXMgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvbmZpZzoge1xuICAgICAgY2FjaGU6IEluTWVtb3J5Q2FjaGU7XG4gICAgICBkYXRhSWRGcm9tT2JqZWN0PzogS2V5RmllbGRzRnVuY3Rpb247XG4gICAgICBwb3NzaWJsZVR5cGVzPzogUG9zc2libGVUeXBlc01hcDtcbiAgICAgIHR5cGVQb2xpY2llcz86IFR5cGVQb2xpY2llcztcbiAgICB9XG4gICkge1xuICAgIHRoaXMuY29uZmlnID0ge1xuICAgICAgZGF0YUlkRnJvbU9iamVjdDogZGVmYXVsdERhdGFJZEZyb21PYmplY3QsXG4gICAgICAuLi5jb25maWcsXG4gICAgfTtcblxuICAgIHRoaXMuY2FjaGUgPSB0aGlzLmNvbmZpZy5jYWNoZTtcblxuICAgIHRoaXMuc2V0Um9vdFR5cGVuYW1lKFwiUXVlcnlcIik7XG4gICAgdGhpcy5zZXRSb290VHlwZW5hbWUoXCJNdXRhdGlvblwiKTtcbiAgICB0aGlzLnNldFJvb3RUeXBlbmFtZShcIlN1YnNjcmlwdGlvblwiKTtcblxuICAgIGlmIChjb25maWcucG9zc2libGVUeXBlcykge1xuICAgICAgdGhpcy5hZGRQb3NzaWJsZVR5cGVzKGNvbmZpZy5wb3NzaWJsZVR5cGVzKTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnR5cGVQb2xpY2llcykge1xuICAgICAgdGhpcy5hZGRUeXBlUG9saWNpZXMoY29uZmlnLnR5cGVQb2xpY2llcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGlkZW50aWZ5KFxuICAgIG9iamVjdDogU3RvcmVPYmplY3QsXG4gICAgcGFydGlhbENvbnRleHQ/OiBQYXJ0aWFsPEtleUZpZWxkc0NvbnRleHQ+XG4gICk6IFtzdHJpbmc/LCBTdG9yZU9iamVjdD9dIHtcbiAgICBjb25zdCBwb2xpY2llcyA9IHRoaXM7XG5cbiAgICBjb25zdCB0eXBlbmFtZSA9XG4gICAgICAocGFydGlhbENvbnRleHQgJiZcbiAgICAgICAgKHBhcnRpYWxDb250ZXh0LnR5cGVuYW1lIHx8IHBhcnRpYWxDb250ZXh0LnN0b3JlT2JqZWN0Py5fX3R5cGVuYW1lKSkgfHxcbiAgICAgIG9iamVjdC5fX3R5cGVuYW1lO1xuXG4gICAgLy8gSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHdyaXRlIHJvb3QgUXVlcnkgZmllbGRzIHdpdGggd3JpdGVGcmFnbWVudCxcbiAgICAvLyB1c2luZyB7IF9fdHlwZW5hbWU6IFwiUXVlcnlcIiwgLi4uIH0gYXMgdGhlIGRhdGEsIGJ1dCBpdCBkb2VzIG5vdCBtYWtlXG4gICAgLy8gc2Vuc2UgdG8gYWxsb3cgdGhlIHNhbWUgaWRlbnRpZmljYXRpb24gYmVoYXZpb3IgZm9yIHRoZSBNdXRhdGlvbiBhbmRcbiAgICAvLyBTdWJzY3JpcHRpb24gdHlwZXMsIHNpbmNlIGFwcGxpY2F0aW9uIGNvZGUgc2hvdWxkIG5ldmVyIGJlIHdyaXRpbmdcbiAgICAvLyBkaXJlY3RseSB0byAob3IgcmVhZGluZyBkaXJlY3RseSBmcm9tKSB0aG9zZSByb290IG9iamVjdHMuXG4gICAgaWYgKHR5cGVuYW1lID09PSB0aGlzLnJvb3RUeXBlbmFtZXNCeUlkLlJPT1RfUVVFUlkpIHtcbiAgICAgIHJldHVybiBbXCJST09UX1FVRVJZXCJdO1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29udGV4dC5zdG9yZU9iamVjdCB0byBvYmplY3QgaWYgbm90IG90aGVyd2lzZSBwcm92aWRlZC5cbiAgICBjb25zdCBzdG9yZU9iamVjdCA9XG4gICAgICAocGFydGlhbENvbnRleHQgJiYgcGFydGlhbENvbnRleHQuc3RvcmVPYmplY3QpIHx8IG9iamVjdDtcblxuICAgIGNvbnN0IGNvbnRleHQ6IEtleUZpZWxkc0NvbnRleHQgPSB7XG4gICAgICAuLi5wYXJ0aWFsQ29udGV4dCxcbiAgICAgIHR5cGVuYW1lLFxuICAgICAgc3RvcmVPYmplY3QsXG4gICAgICByZWFkRmllbGQ6XG4gICAgICAgIChwYXJ0aWFsQ29udGV4dCAmJiBwYXJ0aWFsQ29udGV4dC5yZWFkRmllbGQpIHx8XG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gbm9ybWFsaXplUmVhZEZpZWxkT3B0aW9ucyhhcmd1bWVudHMsIHN0b3JlT2JqZWN0KTtcbiAgICAgICAgICByZXR1cm4gcG9saWNpZXMucmVhZEZpZWxkKG9wdGlvbnMsIHtcbiAgICAgICAgICAgIHN0b3JlOiBwb2xpY2llcy5jYWNoZVtcImRhdGFcIl0sXG4gICAgICAgICAgICB2YXJpYWJsZXM6IG9wdGlvbnMudmFyaWFibGVzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgIH07XG5cbiAgICBsZXQgaWQ6IEtleUZpZWxkc1Jlc3VsdDtcblxuICAgIGNvbnN0IHBvbGljeSA9IHR5cGVuYW1lICYmIHRoaXMuZ2V0VHlwZVBvbGljeSh0eXBlbmFtZSk7XG4gICAgbGV0IGtleUZuID0gKHBvbGljeSAmJiBwb2xpY3kua2V5Rm4pIHx8IHRoaXMuY29uZmlnLmRhdGFJZEZyb21PYmplY3Q7XG5cbiAgICBkaXNhYmxlV2FybmluZ3NTbG90LndpdGhWYWx1ZSh0cnVlLCAoKSA9PiB7XG4gICAgICB3aGlsZSAoa2V5Rm4pIHtcbiAgICAgICAgY29uc3Qgc3BlY2lmaWVyT3JJZCA9IGtleUZuKHsgLi4ub2JqZWN0LCAuLi5zdG9yZU9iamVjdCB9LCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGlzQXJyYXkoc3BlY2lmaWVyT3JJZCkpIHtcbiAgICAgICAgICBrZXlGbiA9IGtleUZpZWxkc0ZuRnJvbVNwZWNpZmllcihzcGVjaWZpZXJPcklkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZCA9IHNwZWNpZmllck9ySWQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlkID0gaWQgPyBTdHJpbmcoaWQpIDogdm9pZCAwO1xuICAgIHJldHVybiBjb250ZXh0LmtleU9iamVjdCA/IFtpZCwgY29udGV4dC5rZXlPYmplY3RdIDogW2lkXTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRUeXBlUG9saWNpZXModHlwZVBvbGljaWVzOiBUeXBlUG9saWNpZXMpIHtcbiAgICBPYmplY3Qua2V5cyh0eXBlUG9saWNpZXMpLmZvckVhY2goKHR5cGVuYW1lKSA9PiB7XG4gICAgICBjb25zdCB7IHF1ZXJ5VHlwZSwgbXV0YXRpb25UeXBlLCBzdWJzY3JpcHRpb25UeXBlLCAuLi5pbmNvbWluZyB9ID1cbiAgICAgICAgdHlwZVBvbGljaWVzW3R5cGVuYW1lXTtcblxuICAgICAgLy8gVGhvdWdoIHtxdWVyeSxtdXRhdGlvbixzdWJzY3JpcHRpb259VHlwZSBjb25maWd1cmF0aW9ucyBhcmUgcmFyZSxcbiAgICAgIC8vIGl0J3MgaW1wb3J0YW50IHRvIGNhbGwgc2V0Um9vdFR5cGVuYW1lIGFzIGVhcmx5IGFzIHBvc3NpYmxlLFxuICAgICAgLy8gc2luY2UgdGhlc2UgY29uZmlndXJhdGlvbnMgc2hvdWxkIGFwcGx5IGNvbnNpc3RlbnRseSBmb3IgdGhlXG4gICAgICAvLyBlbnRpcmUgbGlmZXRpbWUgb2YgdGhlIGNhY2hlLiBBbHNvLCBzaW5jZSBvbmx5IG9uZSBfX3R5cGVuYW1lIGNhblxuICAgICAgLy8gcXVhbGlmeSBhcyBvbmUgb2YgdGhlc2Ugcm9vdCB0eXBlcywgdGhlc2UgdGhyZWUgcHJvcGVydGllcyBjYW5ub3RcbiAgICAgIC8vIGJlIGluaGVyaXRlZCwgdW5saWtlIHRoZSByZXN0IG9mIHRoZSBpbmNvbWluZyBwcm9wZXJ0aWVzLiBUaGF0XG4gICAgICAvLyByZXN0cmljdGlvbiBpcyBjb252ZW5pZW50LCBiZWNhdXNlIHRoZSBwdXJwb3NlIG9mIHRoaXMudG9CZUFkZGVkXG4gICAgICAvLyBpcyB0byBkZWxheSB0aGUgcHJvY2Vzc2luZyBvZiB0eXBlL2ZpZWxkIHBvbGljaWVzIHVudGlsIHRoZSBmaXJzdFxuICAgICAgLy8gdGltZSB0aGV5J3JlIHVzZWQsIGFsbG93aW5nIHBvbGljaWVzIHRvIGJlIGFkZGVkIGluIGFueSBvcmRlciBhc1xuICAgICAgLy8gbG9uZyBhcyBhbGwgcmVsZXZhbnQgcG9saWNpZXMgKGluY2x1ZGluZyBwb2xpY2llcyBmb3Igc3VwZXJ0eXBlcylcbiAgICAgIC8vIGhhdmUgYmVlbiBhZGRlZCBieSB0aGUgdGltZSBhIGdpdmVuIHBvbGljeSBpcyB1c2VkIGZvciB0aGUgZmlyc3RcbiAgICAgIC8vIHRpbWUuIEluIG90aGVyIHdvcmRzLCBzaW5jZSBpbmhlcml0YW5jZSBkb2Vzbid0IG1hdHRlciBmb3IgdGhlc2VcbiAgICAgIC8vIHByb3BlcnRpZXMsIHRoZXJlJ3MgYWxzbyBubyBuZWVkIHRvIGRlbGF5IHRoZWlyIHByb2Nlc3NpbmcgdXNpbmdcbiAgICAgIC8vIHRoZSB0aGlzLnRvQmVBZGRlZCBxdWV1ZS5cbiAgICAgIGlmIChxdWVyeVR5cGUpIHRoaXMuc2V0Um9vdFR5cGVuYW1lKFwiUXVlcnlcIiwgdHlwZW5hbWUpO1xuICAgICAgaWYgKG11dGF0aW9uVHlwZSkgdGhpcy5zZXRSb290VHlwZW5hbWUoXCJNdXRhdGlvblwiLCB0eXBlbmFtZSk7XG4gICAgICBpZiAoc3Vic2NyaXB0aW9uVHlwZSkgdGhpcy5zZXRSb290VHlwZW5hbWUoXCJTdWJzY3JpcHRpb25cIiwgdHlwZW5hbWUpO1xuXG4gICAgICBpZiAoaGFzT3duLmNhbGwodGhpcy50b0JlQWRkZWQsIHR5cGVuYW1lKSkge1xuICAgICAgICB0aGlzLnRvQmVBZGRlZFt0eXBlbmFtZV0ucHVzaChpbmNvbWluZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRvQmVBZGRlZFt0eXBlbmFtZV0gPSBbaW5jb21pbmddO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUeXBlUG9saWN5KHR5cGVuYW1lOiBzdHJpbmcsIGluY29taW5nOiBUeXBlUG9saWN5KSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldFR5cGVQb2xpY3kodHlwZW5hbWUpO1xuICAgIGNvbnN0IHsga2V5RmllbGRzLCBmaWVsZHMgfSA9IGluY29taW5nO1xuXG4gICAgZnVuY3Rpb24gc2V0TWVyZ2UoXG4gICAgICBleGlzdGluZzogeyBtZXJnZT86IEZpZWxkTWVyZ2VGdW5jdGlvbiB8IGJvb2xlYW4gfSxcbiAgICAgIG1lcmdlPzogRmllbGRNZXJnZUZ1bmN0aW9uIHwgYm9vbGVhblxuICAgICkge1xuICAgICAgZXhpc3RpbmcubWVyZ2UgPVxuICAgICAgICB0eXBlb2YgbWVyZ2UgPT09IFwiZnVuY3Rpb25cIiA/IG1lcmdlXG4gICAgICAgICAgLy8gUGFzcyBtZXJnZTp0cnVlIGFzIGEgc2hvcnRoYW5kIGZvciBhIG1lcmdlIGltcGxlbWVudGF0aW9uXG4gICAgICAgICAgLy8gdGhhdCByZXR1cm5zIG9wdGlvbnMubWVyZ2VPYmplY3RzKGV4aXN0aW5nLCBpbmNvbWluZykuXG4gICAgICAgIDogbWVyZ2UgPT09IHRydWUgPyBtZXJnZVRydWVGblxuICAgICAgICAgIC8vIFBhc3MgbWVyZ2U6ZmFsc2UgdG8gbWFrZSBpbmNvbWluZyBhbHdheXMgcmVwbGFjZSBleGlzdGluZ1xuICAgICAgICAgIC8vIHdpdGhvdXQgYW55IHdhcm5pbmdzIGFib3V0IGRhdGEgY2xvYmJlcmluZy5cbiAgICAgICAgOiBtZXJnZSA9PT0gZmFsc2UgPyBtZXJnZUZhbHNlRm5cbiAgICAgICAgOiBleGlzdGluZy5tZXJnZTtcbiAgICB9XG5cbiAgICAvLyBUeXBlIHBvbGljaWVzIGNhbiBkZWZpbmUgbWVyZ2UgZnVuY3Rpb25zLCBhcyBhbiBhbHRlcm5hdGl2ZSB0b1xuICAgIC8vIHVzaW5nIGZpZWxkIHBvbGljaWVzIHRvIG1lcmdlIGNoaWxkIG9iamVjdHMuXG4gICAgc2V0TWVyZ2UoZXhpc3RpbmcsIGluY29taW5nLm1lcmdlKTtcblxuICAgIGV4aXN0aW5nLmtleUZuID1cbiAgICAgIC8vIFBhc3MgZmFsc2UgdG8gZGlzYWJsZSBub3JtYWxpemF0aW9uIGZvciB0aGlzIHR5cGVuYW1lLlxuICAgICAga2V5RmllbGRzID09PSBmYWxzZSA/IG51bGxLZXlGaWVsZHNGblxuICAgICAgICAvLyBQYXNzIGFuIGFycmF5IG9mIHN0cmluZ3MgdG8gdXNlIHRob3NlIGZpZWxkcyB0byBjb21wdXRlIGFcbiAgICAgICAgLy8gY29tcG9zaXRlIElEIGZvciBvYmplY3RzIG9mIHRoaXMgdHlwZW5hbWUuXG4gICAgICA6IGlzQXJyYXkoa2V5RmllbGRzKSA/IGtleUZpZWxkc0ZuRnJvbVNwZWNpZmllcihrZXlGaWVsZHMpXG4gICAgICAgIC8vIFBhc3MgYSBmdW5jdGlvbiB0byB0YWtlIGZ1bGwgY29udHJvbCBvdmVyIGlkZW50aWZpY2F0aW9uLlxuICAgICAgOiB0eXBlb2Yga2V5RmllbGRzID09PSBcImZ1bmN0aW9uXCIgPyBrZXlGaWVsZHNcbiAgICAgICAgLy8gTGVhdmUgZXhpc3Rpbmcua2V5Rm4gdW5jaGFuZ2VkIGlmIGFib3ZlIGNhc2VzIGZhaWwuXG4gICAgICA6IGV4aXN0aW5nLmtleUZuO1xuXG4gICAgaWYgKGZpZWxkcykge1xuICAgICAgT2JqZWN0LmtleXMoZmllbGRzKS5mb3JFYWNoKChmaWVsZE5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldEZpZWxkUG9saWN5KHR5cGVuYW1lLCBmaWVsZE5hbWUsIHRydWUpITtcbiAgICAgICAgY29uc3QgaW5jb21pbmcgPSBmaWVsZHNbZmllbGROYW1lXTtcblxuICAgICAgICBpZiAodHlwZW9mIGluY29taW5nID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBleGlzdGluZy5yZWFkID0gaW5jb21pbmc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgeyBrZXlBcmdzLCByZWFkLCBtZXJnZSB9ID0gaW5jb21pbmc7XG5cbiAgICAgICAgICBleGlzdGluZy5rZXlGbiA9XG4gICAgICAgICAgICAvLyBQYXNzIGZhbHNlIHRvIGRpc2FibGUgYXJndW1lbnQtYmFzZWQgZGlmZmVyZW50aWF0aW9uIG9mXG4gICAgICAgICAgICAvLyBmaWVsZCBpZGVudGl0aWVzLlxuICAgICAgICAgICAga2V5QXJncyA9PT0gZmFsc2UgPyBzaW1wbGVLZXlBcmdzRm5cbiAgICAgICAgICAgICAgLy8gUGFzcyBhbiBhcnJheSBvZiBzdHJpbmdzIHRvIHVzZSBuYW1lZCBhcmd1bWVudHMgdG9cbiAgICAgICAgICAgICAgLy8gY29tcHV0ZSBhIGNvbXBvc2l0ZSBpZGVudGl0eSBmb3IgdGhlIGZpZWxkLlxuICAgICAgICAgICAgOiBpc0FycmF5KGtleUFyZ3MpID8ga2V5QXJnc0ZuRnJvbVNwZWNpZmllcihrZXlBcmdzKVxuICAgICAgICAgICAgICAvLyBQYXNzIGEgZnVuY3Rpb24gdG8gdGFrZSBmdWxsIGNvbnRyb2wgb3ZlciBmaWVsZCBpZGVudGl0eS5cbiAgICAgICAgICAgIDogdHlwZW9mIGtleUFyZ3MgPT09IFwiZnVuY3Rpb25cIiA/IGtleUFyZ3NcbiAgICAgICAgICAgICAgLy8gTGVhdmUgZXhpc3Rpbmcua2V5Rm4gdW5jaGFuZ2VkIGlmIGFib3ZlIGNhc2VzIGZhaWwuXG4gICAgICAgICAgICA6IGV4aXN0aW5nLmtleUZuO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiByZWFkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGV4aXN0aW5nLnJlYWQgPSByZWFkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNldE1lcmdlKGV4aXN0aW5nLCBtZXJnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXhpc3RpbmcucmVhZCAmJiBleGlzdGluZy5tZXJnZSkge1xuICAgICAgICAgIC8vIElmIHdlIGhhdmUgYm90aCBhIHJlYWQgYW5kIGEgbWVyZ2UgZnVuY3Rpb24sIGFzc3VtZVxuICAgICAgICAgIC8vIGtleUFyZ3M6ZmFsc2UsIGJlY2F1c2UgcmVhZCBhbmQgbWVyZ2UgdG9nZXRoZXIgY2FuIHRha2VcbiAgICAgICAgICAvLyByZXNwb25zaWJpbGl0eSBmb3IgaW50ZXJwcmV0aW5nIGFyZ3VtZW50cyBpbiBhbmQgb3V0LiBUaGlzXG4gICAgICAgICAgLy8gZGVmYXVsdCBhc3N1bXB0aW9uIGNhbiBhbHdheXMgYmUgb3ZlcnJpZGRlbiBieSBzcGVjaWZ5aW5nXG4gICAgICAgICAgLy8ga2V5QXJncyBleHBsaWNpdGx5IGluIHRoZSBGaWVsZFBvbGljeS5cbiAgICAgICAgICBleGlzdGluZy5rZXlGbiA9IGV4aXN0aW5nLmtleUZuIHx8IHNpbXBsZUtleUFyZ3NGbjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRSb290VHlwZW5hbWUoXG4gICAgd2hpY2g6IFwiUXVlcnlcIiB8IFwiTXV0YXRpb25cIiB8IFwiU3Vic2NyaXB0aW9uXCIsXG4gICAgdHlwZW5hbWU6IHN0cmluZyA9IHdoaWNoXG4gICkge1xuICAgIGNvbnN0IHJvb3RJZCA9IFwiUk9PVF9cIiArIHdoaWNoLnRvVXBwZXJDYXNlKCk7XG4gICAgY29uc3Qgb2xkID0gdGhpcy5yb290VHlwZW5hbWVzQnlJZFtyb290SWRdO1xuICAgIGlmICh0eXBlbmFtZSAhPT0gb2xkKSB7XG4gICAgICBpbnZhcmlhbnQoXG4gICAgICAgICFvbGQgfHwgb2xkID09PSB3aGljaCxcbiAgICAgICAgYENhbm5vdCBjaGFuZ2Ugcm9vdCAlcyBfX3R5cGVuYW1lIG1vcmUgdGhhbiBvbmNlYCxcbiAgICAgICAgd2hpY2hcbiAgICAgICk7XG4gICAgICAvLyBGaXJzdCwgZGVsZXRlIGFueSBvbGQgX190eXBlbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb290SWQgZnJvbVxuICAgICAgLy8gcm9vdElkc0J5VHlwZW5hbWUuXG4gICAgICBpZiAob2xkKSBkZWxldGUgdGhpcy5yb290SWRzQnlUeXBlbmFtZVtvbGRdO1xuICAgICAgLy8gTm93IG1ha2UgdGhpcyB0aGUgb25seSBfX3R5cGVuYW1lIHRoYXQgbWFwcyB0byB0aGlzIHJvb3RJZC5cbiAgICAgIHRoaXMucm9vdElkc0J5VHlwZW5hbWVbdHlwZW5hbWVdID0gcm9vdElkO1xuICAgICAgLy8gRmluYWxseSwgdXBkYXRlIHRoZSBfX3R5cGVuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvb3RJZC5cbiAgICAgIHRoaXMucm9vdFR5cGVuYW1lc0J5SWRbcm9vdElkXSA9IHR5cGVuYW1lO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhZGRQb3NzaWJsZVR5cGVzKHBvc3NpYmxlVHlwZXM6IFBvc3NpYmxlVHlwZXNNYXApIHtcbiAgICAodGhpcy51c2luZ1Bvc3NpYmxlVHlwZXMgYXMgYm9vbGVhbikgPSB0cnVlO1xuICAgIE9iamVjdC5rZXlzKHBvc3NpYmxlVHlwZXMpLmZvckVhY2goKHN1cGVydHlwZSkgPT4ge1xuICAgICAgLy8gTWFrZSBzdXJlIGFsbCB0eXBlcyBoYXZlIGFuIGVudHJ5IGluIHRoaXMuc3VwZXJ0eXBlTWFwLCBldmVuIGlmXG4gICAgICAvLyB0aGVpciBzdXBlcnR5cGUgc2V0IGlzIGVtcHR5LCBzbyB3ZSBjYW4gcmV0dXJuIGZhbHNlIGltbWVkaWF0ZWx5XG4gICAgICAvLyBmcm9tIHBvbGljaWVzLmZyYWdtZW50TWF0Y2hlcyBmb3IgdW5rbm93biBzdXBlcnR5cGVzLlxuICAgICAgdGhpcy5nZXRTdXBlcnR5cGVTZXQoc3VwZXJ0eXBlLCB0cnVlKTtcblxuICAgICAgcG9zc2libGVUeXBlc1tzdXBlcnR5cGVdLmZvckVhY2goKHN1YnR5cGUpID0+IHtcbiAgICAgICAgdGhpcy5nZXRTdXBlcnR5cGVTZXQoc3VidHlwZSwgdHJ1ZSkhLmFkZChzdXBlcnR5cGUpO1xuICAgICAgICBjb25zdCBtYXRjaCA9IHN1YnR5cGUubWF0Y2goVHlwZU9yRmllbGROYW1lUmVnRXhwKTtcbiAgICAgICAgaWYgKCFtYXRjaCB8fCBtYXRjaFswXSAhPT0gc3VidHlwZSkge1xuICAgICAgICAgIC8vIFRPRE8gRG9uJ3QgaW50ZXJwcmV0IGp1c3QgYW55IGludmFsaWQgdHlwZW5hbWUgYXMgYSBSZWdFeHAuXG4gICAgICAgICAgdGhpcy5mdXp6eVN1YnR5cGVzLnNldChzdWJ0eXBlLCBuZXcgUmVnRXhwKHN1YnR5cGUpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFR5cGVQb2xpY3kodHlwZW5hbWU6IHN0cmluZyk6IFBvbGljaWVzW1widHlwZVBvbGljaWVzXCJdW3N0cmluZ10ge1xuICAgIGlmICghaGFzT3duLmNhbGwodGhpcy50eXBlUG9saWNpZXMsIHR5cGVuYW1lKSkge1xuICAgICAgY29uc3QgcG9saWN5OiBQb2xpY2llc1tcInR5cGVQb2xpY2llc1wiXVtzdHJpbmddID0gKHRoaXMudHlwZVBvbGljaWVzW1xuICAgICAgICB0eXBlbmFtZVxuICAgICAgXSA9IE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICAgICAgcG9saWN5LmZpZWxkcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgIC8vIFdoZW4gdGhlIFR5cGVQb2xpY3kgZm9yIHR5cGVuYW1lIGlzIGZpcnN0IGFjY2Vzc2VkLCBpbnN0ZWFkIG9mXG4gICAgICAvLyBzdGFydGluZyB3aXRoIGFuIGVtcHR5IHBvbGljeSBvYmplY3QsIGluaGVyaXQgYW55IHByb3BlcnRpZXMgb3JcbiAgICAgIC8vIGZpZWxkcyBmcm9tIHRoZSB0eXBlIHBvbGljaWVzIG9mIHRoZSBzdXBlcnR5cGVzIG9mIHR5cGVuYW1lLlxuICAgICAgLy9cbiAgICAgIC8vIEFueSBwcm9wZXJ0aWVzIG9yIGZpZWxkcyBkZWZpbmVkIGV4cGxpY2l0bHkgd2l0aGluIHRoZSBUeXBlUG9saWN5XG4gICAgICAvLyBmb3IgdHlwZW5hbWUgd2lsbCB0YWtlIHByZWNlZGVuY2UsIGFuZCBpZiB0aGVyZSBhcmUgbXVsdGlwbGVcbiAgICAgIC8vIHN1cGVydHlwZXMsIHRoZSBwcm9wZXJ0aWVzIG9mIHBvbGljaWVzIHdob3NlIHR5cGVzIHdlcmUgYWRkZWRcbiAgICAgIC8vIGxhdGVyIHZpYSBhZGRQb3NzaWJsZVR5cGVzIHdpbGwgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhvc2Ugb2ZcbiAgICAgIC8vIGVhcmxpZXIgc3VwZXJ0eXBlcy4gVE9ETyBQZXJoYXBzIHdlIHNob3VsZCB3YXJuIGFib3V0IHRoZXNlXG4gICAgICAvLyBjb25mbGljdHMgaW4gZGV2ZWxvcG1lbnQsIGFuZCByZWNvbW1lbmQgZGVmaW5pbmcgdGhlIHByb3BlcnR5XG4gICAgICAvLyBleHBsaWNpdGx5IGluIHRoZSBzdWJ0eXBlIHBvbGljeT9cbiAgICAgIC8vXG4gICAgICAvLyBGaWVsZCBwb2xpY3kgaW5oZXJpdGFuY2UgaXMgYXRvbWljL3NoYWxsb3c6IHlvdSBjYW4ndCBpbmhlcml0IGFcbiAgICAgIC8vIGZpZWxkIHBvbGljeSBhbmQgdGhlbiBvdmVycmlkZSBqdXN0IGl0cyByZWFkIGZ1bmN0aW9uLCBzaW5jZSByZWFkXG4gICAgICAvLyBhbmQgbWVyZ2UgZnVuY3Rpb25zIG9mdGVuIG5lZWQgdG8gY29vcGVyYXRlLCBzbyBjaGFuZ2luZyBvbmx5IG9uZVxuICAgICAgLy8gb2YgdGhlbSB3b3VsZCBiZSBhIHJlY2lwZSBmb3IgaW5jb25zaXN0ZW5jeS5cbiAgICAgIC8vXG4gICAgICAvLyBPbmNlIHRoZSBUeXBlUG9saWN5IGZvciB0eXBlbmFtZSBoYXMgYmVlbiBhY2Nlc3NlZCwgaXRzIHByb3BlcnRpZXMgY2FuXG4gICAgICAvLyBzdGlsbCBiZSB1cGRhdGVkIGRpcmVjdGx5IHVzaW5nIGFkZFR5cGVQb2xpY2llcywgYnV0IGZ1dHVyZSBjaGFuZ2VzIHRvXG4gICAgICAvLyBpbmhlcml0ZWQgc3VwZXJ0eXBlIHBvbGljaWVzIHdpbGwgbm90IGJlIHJlZmxlY3RlZCBpbiB0aGlzIHN1YnR5cGVcbiAgICAgIC8vIHBvbGljeSwgYmVjYXVzZSB0aGlzIGNvZGUgcnVucyBhdCBtb3N0IG9uY2UgcGVyIHR5cGVuYW1lLlxuICAgICAgbGV0IHN1cGVydHlwZXMgPSB0aGlzLnN1cGVydHlwZU1hcC5nZXQodHlwZW5hbWUpO1xuICAgICAgaWYgKCFzdXBlcnR5cGVzICYmIHRoaXMuZnV6enlTdWJ0eXBlcy5zaXplKSB7XG4gICAgICAgIC8vIFRvIG1ha2UgdGhlIGluaGVyaXRhbmNlIGxvZ2ljIHdvcmsgZm9yIHVua25vd24gdHlwZW5hbWUgc3RyaW5ncyB0aGF0XG4gICAgICAgIC8vIG1heSBoYXZlIGZ1enp5IHN1cGVydHlwZXMsIHdlIGdpdmUgdGhpcyB0eXBlbmFtZSBhbiBlbXB0eSBzdXBlcnR5cGVcbiAgICAgICAgLy8gc2V0IGFuZCB0aGVuIHBvcHVsYXRlIGl0IHdpdGggYW55IGZ1enp5IHN1cGVydHlwZXMgdGhhdCBtYXRjaC5cbiAgICAgICAgc3VwZXJ0eXBlcyA9IHRoaXMuZ2V0U3VwZXJ0eXBlU2V0KHR5cGVuYW1lLCB0cnVlKSE7XG4gICAgICAgIC8vIFRoaXMgb25seSB3b3JrcyBmb3IgdHlwZW5hbWVzIHRoYXQgYXJlIGRpcmVjdGx5IG1hdGNoZWQgYnkgYSBmdXp6eVxuICAgICAgICAvLyBzdXBlcnR5cGUuIFdoYXQgaWYgdGhlcmUgaXMgYW4gaW50ZXJtZWRpYXRlIGNoYWluIG9mIHN1cGVydHlwZXM/XG4gICAgICAgIC8vIFdoaWxlIHBvc3NpYmxlLCB0aGF0IHNpdHVhdGlvbiBjYW4gb25seSBiZSBzb2x2ZWQgZWZmZWN0aXZlbHkgYnlcbiAgICAgICAgLy8gc3BlY2lmeWluZyB0aGUgaW50ZXJtZWRpYXRlIHJlbGF0aW9uc2hpcHMgdmlhIHBvc3NpYmxlVHlwZXMsIG1hbnVhbGx5XG4gICAgICAgIC8vIGFuZCBpbiBhIG5vbi1mdXp6eSB3YXkuXG4gICAgICAgIHRoaXMuZnV6enlTdWJ0eXBlcy5mb3JFYWNoKChyZWdFeHAsIGZ1enp5KSA9PiB7XG4gICAgICAgICAgaWYgKHJlZ0V4cC50ZXN0KHR5cGVuYW1lKSkge1xuICAgICAgICAgICAgLy8gVGhlIGZ1enp5IHBhcmFtZXRlciBpcyBqdXN0IHRoZSBvcmlnaW5hbCBzdHJpbmcgdmVyc2lvbiBvZiByZWdFeHBcbiAgICAgICAgICAgIC8vIChub3QgYSB2YWxpZCBfX3R5cGVuYW1lIHN0cmluZyksIGJ1dCB3ZSBjYW4gbG9vayB1cCB0aGVcbiAgICAgICAgICAgIC8vIGFzc29jaWF0ZWQgc3VwZXJ0eXBlKHMpIGluIHRoaXMuc3VwZXJ0eXBlTWFwLlxuICAgICAgICAgICAgY29uc3QgZnV6enlTdXBlcnR5cGVzID0gdGhpcy5zdXBlcnR5cGVNYXAuZ2V0KGZ1enp5KTtcbiAgICAgICAgICAgIGlmIChmdXp6eVN1cGVydHlwZXMpIHtcbiAgICAgICAgICAgICAgZnV6enlTdXBlcnR5cGVzLmZvckVhY2goKHN1cGVydHlwZSkgPT5cbiAgICAgICAgICAgICAgICBzdXBlcnR5cGVzIS5hZGQoc3VwZXJ0eXBlKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc3VwZXJ0eXBlcyAmJiBzdXBlcnR5cGVzLnNpemUpIHtcbiAgICAgICAgc3VwZXJ0eXBlcy5mb3JFYWNoKChzdXBlcnR5cGUpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGZpZWxkcywgLi4ucmVzdCB9ID0gdGhpcy5nZXRUeXBlUG9saWN5KHN1cGVydHlwZSk7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihwb2xpY3ksIHJlc3QpO1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24ocG9saWN5LmZpZWxkcywgZmllbGRzKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaW5ib3ggPSB0aGlzLnRvQmVBZGRlZFt0eXBlbmFtZV07XG4gICAgaWYgKGluYm94ICYmIGluYm94Lmxlbmd0aCkge1xuICAgICAgLy8gTWVyZ2UgdGhlIHBlbmRpbmcgcG9saWNpZXMgaW50byB0aGlzLnR5cGVQb2xpY2llcywgaW4gdGhlIG9yZGVyIHRoZXlcbiAgICAgIC8vIHdlcmUgb3JpZ2luYWxseSBwYXNzZWQgdG8gYWRkVHlwZVBvbGljeS5cbiAgICAgIGluYm94LnNwbGljZSgwKS5mb3JFYWNoKChwb2xpY3kpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVUeXBlUG9saWN5KHR5cGVuYW1lLCBwb2xpY3kpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudHlwZVBvbGljaWVzW3R5cGVuYW1lXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmllbGRQb2xpY3koXG4gICAgdHlwZW5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBjcmVhdGVJZk1pc3Npbmc6IGJvb2xlYW5cbiAgKTpcbiAgICB8IHtcbiAgICAgICAga2V5Rm4/OiBLZXlBcmdzRnVuY3Rpb247XG4gICAgICAgIHJlYWQ/OiBGaWVsZFJlYWRGdW5jdGlvbjxhbnk+O1xuICAgICAgICBtZXJnZT86IEZpZWxkTWVyZ2VGdW5jdGlvbjxhbnk+O1xuICAgICAgfVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW5hbWUpIHtcbiAgICAgIGNvbnN0IGZpZWxkUG9saWNpZXMgPSB0aGlzLmdldFR5cGVQb2xpY3kodHlwZW5hbWUpLmZpZWxkcztcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGZpZWxkUG9saWNpZXNbZmllbGROYW1lXSB8fFxuICAgICAgICAoY3JlYXRlSWZNaXNzaW5nICYmIChmaWVsZFBvbGljaWVzW2ZpZWxkTmFtZV0gPSBPYmplY3QuY3JlYXRlKG51bGwpKSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdXBlcnR5cGVTZXQoXG4gICAgc3VidHlwZTogc3RyaW5nLFxuICAgIGNyZWF0ZUlmTWlzc2luZzogYm9vbGVhblxuICApOiBTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHN1cGVydHlwZVNldCA9IHRoaXMuc3VwZXJ0eXBlTWFwLmdldChzdWJ0eXBlKTtcbiAgICBpZiAoIXN1cGVydHlwZVNldCAmJiBjcmVhdGVJZk1pc3NpbmcpIHtcbiAgICAgIHRoaXMuc3VwZXJ0eXBlTWFwLnNldChzdWJ0eXBlLCAoc3VwZXJ0eXBlU2V0ID0gbmV3IFNldDxzdHJpbmc+KCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVydHlwZVNldDtcbiAgfVxuXG4gIHB1YmxpYyBmcmFnbWVudE1hdGNoZXMoXG4gICAgZnJhZ21lbnQ6IElubGluZUZyYWdtZW50Tm9kZSB8IEZyYWdtZW50RGVmaW5pdGlvbk5vZGUsXG4gICAgdHlwZW5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICByZXN1bHQ/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHZhcmlhYmxlcz86IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCFmcmFnbWVudC50eXBlQ29uZGl0aW9uKSByZXR1cm4gdHJ1ZTtcblxuICAgIC8vIElmIHRoZSBmcmFnbWVudCBoYXMgYSB0eXBlIGNvbmRpdGlvbiBidXQgdGhlIG9iamVjdCB3ZSdyZSBtYXRjaGluZ1xuICAgIC8vIGFnYWluc3QgZG9lcyBub3QgaGF2ZSBhIF9fdHlwZW5hbWUsIHRoZSBmcmFnbWVudCBjYW5ub3QgbWF0Y2guXG4gICAgaWYgKCF0eXBlbmFtZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgc3VwZXJ0eXBlID0gZnJhZ21lbnQudHlwZUNvbmRpdGlvbi5uYW1lLnZhbHVlO1xuICAgIC8vIENvbW1vbiBjYXNlOiBmcmFnbWVudCB0eXBlIGNvbmRpdGlvbiBhbmQgX190eXBlbmFtZSBhcmUgdGhlIHNhbWUuXG4gICAgaWYgKHR5cGVuYW1lID09PSBzdXBlcnR5cGUpIHJldHVybiB0cnVlO1xuXG4gICAgaWYgKHRoaXMudXNpbmdQb3NzaWJsZVR5cGVzICYmIHRoaXMuc3VwZXJ0eXBlTWFwLmhhcyhzdXBlcnR5cGUpKSB7XG4gICAgICBjb25zdCB0eXBlbmFtZVN1cGVydHlwZVNldCA9IHRoaXMuZ2V0U3VwZXJ0eXBlU2V0KHR5cGVuYW1lLCB0cnVlKSE7XG4gICAgICBjb25zdCB3b3JrUXVldWUgPSBbdHlwZW5hbWVTdXBlcnR5cGVTZXRdO1xuICAgICAgY29uc3QgbWF5YmVFbnF1ZXVlID0gKHN1YnR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBzdXBlcnR5cGVTZXQgPSB0aGlzLmdldFN1cGVydHlwZVNldChzdWJ0eXBlLCBmYWxzZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzdXBlcnR5cGVTZXQgJiZcbiAgICAgICAgICBzdXBlcnR5cGVTZXQuc2l6ZSAmJlxuICAgICAgICAgIHdvcmtRdWV1ZS5pbmRleE9mKHN1cGVydHlwZVNldCkgPCAwXG4gICAgICAgICkge1xuICAgICAgICAgIHdvcmtRdWV1ZS5wdXNoKHN1cGVydHlwZVNldCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgZnV6enkgc3VidHlwZXMgb25seSBpZiB3ZSBlbmNvdW50ZXJlZCBmdXp6eVxuICAgICAgLy8gc3VidHlwZSBzdHJpbmdzIGluIGFkZFBvc3NpYmxlVHlwZXMsIGFuZCBvbmx5IHdoaWxlIHdyaXRpbmcgdG9cbiAgICAgIC8vIHRoZSBjYWNoZSwgc2luY2UgdGhhdCdzIHdoZW4gc2VsZWN0aW9uU2V0TWF0Y2hlc1Jlc3VsdCBnaXZlcyBhXG4gICAgICAvLyBzdHJvbmcgc2lnbmFsIG9mIGZyYWdtZW50IG1hdGNoaW5nLiBUaGUgU3RvcmVSZWFkZXIgY2xhc3MgY2FsbHNcbiAgICAgIC8vIHBvbGljaWVzLmZyYWdtZW50TWF0Y2hlcyB3aXRob3V0IHBhc3NpbmcgYSByZXN1bHQgb2JqZWN0LCBzb1xuICAgICAgLy8gbmVlZFRvQ2hlY2tGdXp6eVN1YnR5cGVzIGlzIGFsd2F5cyBmYWxzZSB3aGlsZSByZWFkaW5nLlxuICAgICAgbGV0IG5lZWRUb0NoZWNrRnV6enlTdWJ0eXBlcyA9ICEhKHJlc3VsdCAmJiB0aGlzLmZ1enp5U3VidHlwZXMuc2l6ZSk7XG4gICAgICBsZXQgY2hlY2tpbmdGdXp6eVN1YnR5cGVzID0gZmFsc2U7XG5cbiAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIGtlZXAgZXZhbHVhdGluZyB3b3JrUXVldWUubGVuZ3RoIGVhY2ggdGltZSB0aHJvdWdoXG4gICAgICAvLyB0aGUgbG9vcCwgYmVjYXVzZSB0aGUgcXVldWUgY2FuIGdyb3cgd2hpbGUgd2UncmUgaXRlcmF0aW5nIG92ZXIgaXQuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmtRdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBzdXBlcnR5cGVTZXQgPSB3b3JrUXVldWVbaV07XG5cbiAgICAgICAgaWYgKHN1cGVydHlwZVNldC5oYXMoc3VwZXJ0eXBlKSkge1xuICAgICAgICAgIGlmICghdHlwZW5hbWVTdXBlcnR5cGVTZXQuaGFzKHN1cGVydHlwZSkpIHtcbiAgICAgICAgICAgIGlmIChjaGVja2luZ0Z1enp5U3VidHlwZXMpIHtcbiAgICAgICAgICAgICAgaW52YXJpYW50Lndhcm4oXG4gICAgICAgICAgICAgICAgYEluZmVycmluZyBzdWJ0eXBlICVzIG9mIHN1cGVydHlwZSAlc2AsXG4gICAgICAgICAgICAgICAgdHlwZW5hbWUsXG4gICAgICAgICAgICAgICAgc3VwZXJ0eXBlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZWNvcmQgcG9zaXRpdmUgcmVzdWx0cyBmb3IgZmFzdGVyIGZ1dHVyZSBsb29rdXAuXG4gICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB3ZSBjYW5ub3Qgc2FmZWx5IGNhY2hlIG5lZ2F0aXZlIHJlc3VsdHMsXG4gICAgICAgICAgICAvLyBiZWNhdXNlIG5ldyBwb3NzaWJsZVR5cGVzIGRhdGEgY291bGQgYWx3YXlzIGJlIGFkZGVkIHRvIHRoZVxuICAgICAgICAgICAgLy8gUG9saWNpZXMgY2xhc3MuXG4gICAgICAgICAgICB0eXBlbmFtZVN1cGVydHlwZVNldC5hZGQoc3VwZXJ0eXBlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBzdXBlcnR5cGVTZXQuZm9yRWFjaChtYXliZUVucXVldWUpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBuZWVkVG9DaGVja0Z1enp5U3VidHlwZXMgJiZcbiAgICAgICAgICAvLyBTdGFydCBjaGVja2luZyBmdXp6eSBzdWJ0eXBlcyBvbmx5IGFmdGVyIGV4aGF1c3RpbmcgYWxsXG4gICAgICAgICAgLy8gbm9uLWZ1enp5IHN1YnR5cGVzIChhZnRlciB0aGUgZmluYWwgaXRlcmF0aW9uIG9mIHRoZSBsb29wKS5cbiAgICAgICAgICBpID09PSB3b3JrUXVldWUubGVuZ3RoIC0gMSAmJlxuICAgICAgICAgIC8vIFdlIGNvdWxkIHdhaXQgdG8gY29tcGFyZSBmcmFnbWVudC5zZWxlY3Rpb25TZXQgdG8gcmVzdWx0XG4gICAgICAgICAgLy8gYWZ0ZXIgd2UgdmVyaWZ5IHRoZSBzdXBlcnR5cGUsIGJ1dCB0aGlzIGNoZWNrIGlzIG9mdGVuIGxlc3NcbiAgICAgICAgICAvLyBleHBlbnNpdmUgdGhhbiB0aGF0IHNlYXJjaCwgYW5kIHdlIHdpbGwgaGF2ZSB0byBkbyB0aGVcbiAgICAgICAgICAvLyBjb21wYXJpc29uIGFueXdheSB3aGVuZXZlciB3ZSBmaW5kIGEgcG90ZW50aWFsIG1hdGNoLlxuICAgICAgICAgIHNlbGVjdGlvblNldE1hdGNoZXNSZXN1bHQoZnJhZ21lbnQuc2VsZWN0aW9uU2V0LCByZXN1bHQhLCB2YXJpYWJsZXMpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFdlIGRvbid0IGFsd2F5cyBuZWVkIHRvIGNoZWNrIGZ1enp5IHN1YnR5cGVzIChpZiBubyByZXN1bHRcbiAgICAgICAgICAvLyB3YXMgcHJvdmlkZWQsIG9yICF0aGlzLmZ1enp5U3VidHlwZXMuc2l6ZSksIGJ1dCwgd2hlbiB3ZSBkbyxcbiAgICAgICAgICAvLyB3ZSBvbmx5IHdhbnQgdG8gY2hlY2sgdGhlbSBvbmNlLlxuICAgICAgICAgIG5lZWRUb0NoZWNrRnV6enlTdWJ0eXBlcyA9IGZhbHNlO1xuICAgICAgICAgIGNoZWNraW5nRnV6enlTdWJ0eXBlcyA9IHRydWU7XG5cbiAgICAgICAgICAvLyBJZiB3ZSBmaW5kIGFueSBmdXp6eSBzdWJ0eXBlcyB0aGF0IG1hdGNoIHR5cGVuYW1lLCBleHRlbmQgdGhlXG4gICAgICAgICAgLy8gd29ya1F1ZXVlIHRvIHNlYXJjaCB0aHJvdWdoIHRoZSBzdXBlcnR5cGVzIG9mIHRob3NlIGZ1enp5XG4gICAgICAgICAgLy8gc3VidHlwZXMuIE90aGVyd2lzZSB0aGUgZm9yLWxvb3Agd2lsbCB0ZXJtaW5hdGUgYW5kIHdlJ2xsXG4gICAgICAgICAgLy8gcmV0dXJuIGZhbHNlIGJlbG93LlxuICAgICAgICAgIHRoaXMuZnV6enlTdWJ0eXBlcy5mb3JFYWNoKChyZWdFeHAsIGZ1enp5U3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IHR5cGVuYW1lLm1hdGNoKHJlZ0V4cCk7XG4gICAgICAgICAgICBpZiAobWF0Y2ggJiYgbWF0Y2hbMF0gPT09IHR5cGVuYW1lKSB7XG4gICAgICAgICAgICAgIG1heWJlRW5xdWV1ZShmdXp6eVN0cmluZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgaGFzS2V5QXJncyh0eXBlbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBmaWVsZE5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHBvbGljeSA9IHRoaXMuZ2V0RmllbGRQb2xpY3kodHlwZW5hbWUsIGZpZWxkTmFtZSwgZmFsc2UpO1xuICAgIHJldHVybiAhIShwb2xpY3kgJiYgcG9saWN5LmtleUZuKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdG9yZUZpZWxkTmFtZShmaWVsZFNwZWM6IEZpZWxkU3BlY2lmaWVyKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IHR5cGVuYW1lLCBmaWVsZE5hbWUgfSA9IGZpZWxkU3BlYztcbiAgICBjb25zdCBwb2xpY3kgPSB0aGlzLmdldEZpZWxkUG9saWN5KHR5cGVuYW1lLCBmaWVsZE5hbWUsIGZhbHNlKTtcbiAgICBsZXQgc3RvcmVGaWVsZE5hbWU6IEV4Y2x1ZGU8UmV0dXJuVHlwZTxLZXlBcmdzRnVuY3Rpb24+LCBLZXlTcGVjaWZpZXI+O1xuXG4gICAgbGV0IGtleUZuID0gcG9saWN5ICYmIHBvbGljeS5rZXlGbjtcbiAgICBpZiAoa2V5Rm4gJiYgdHlwZW5hbWUpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQ6IFBhcmFtZXRlcnM8S2V5QXJnc0Z1bmN0aW9uPlsxXSA9IHtcbiAgICAgICAgdHlwZW5hbWUsXG4gICAgICAgIGZpZWxkTmFtZSxcbiAgICAgICAgZmllbGQ6IGZpZWxkU3BlYy5maWVsZCB8fCBudWxsLFxuICAgICAgICB2YXJpYWJsZXM6IGZpZWxkU3BlYy52YXJpYWJsZXMsXG4gICAgICB9O1xuICAgICAgY29uc3QgYXJncyA9IGFyZ3NGcm9tRmllbGRTcGVjaWZpZXIoZmllbGRTcGVjKTtcbiAgICAgIHdoaWxlIChrZXlGbikge1xuICAgICAgICBjb25zdCBzcGVjaWZpZXJPclN0cmluZyA9IGtleUZuKGFyZ3MsIGNvbnRleHQpO1xuICAgICAgICBpZiAoaXNBcnJheShzcGVjaWZpZXJPclN0cmluZykpIHtcbiAgICAgICAgICBrZXlGbiA9IGtleUFyZ3NGbkZyb21TcGVjaWZpZXIoc3BlY2lmaWVyT3JTdHJpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIHRoZSBjdXN0b20ga2V5Rm4gcmV0dXJucyBhIGZhbHN5IHZhbHVlLCBmYWxsIGJhY2sgdG9cbiAgICAgICAgICAvLyBmaWVsZE5hbWUgaW5zdGVhZC5cbiAgICAgICAgICBzdG9yZUZpZWxkTmFtZSA9IHNwZWNpZmllck9yU3RyaW5nIHx8IGZpZWxkTmFtZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdG9yZUZpZWxkTmFtZSA9PT0gdm9pZCAwKSB7XG4gICAgICBzdG9yZUZpZWxkTmFtZSA9XG4gICAgICAgIGZpZWxkU3BlYy5maWVsZCA/XG4gICAgICAgICAgc3RvcmVLZXlOYW1lRnJvbUZpZWxkKGZpZWxkU3BlYy5maWVsZCwgZmllbGRTcGVjLnZhcmlhYmxlcylcbiAgICAgICAgOiBnZXRTdG9yZUtleU5hbWUoZmllbGROYW1lLCBhcmdzRnJvbUZpZWxkU3BlY2lmaWVyKGZpZWxkU3BlYykpO1xuICAgIH1cblxuICAgIC8vIFJldHVybmluZyBmYWxzZSBmcm9tIGEga2V5QXJncyBmdW5jdGlvbiBpcyBsaWtlIGNvbmZpZ3VyaW5nXG4gICAgLy8ga2V5QXJnczogZmFsc2UsIGJ1dCBtb3JlIGR5bmFtaWMuXG4gICAgaWYgKHN0b3JlRmllbGROYW1lID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZpZWxkTmFtZTtcbiAgICB9XG5cbiAgICAvLyBNYWtlIHN1cmUgY3VzdG9tIGZpZWxkIG5hbWVzIHN0YXJ0IHdpdGggdGhlIGFjdHVhbCBmaWVsZC5uYW1lLnZhbHVlXG4gICAgLy8gb2YgdGhlIGZpZWxkLCBzbyB3ZSBjYW4gYWx3YXlzIGZpZ3VyZSBvdXQgd2hpY2ggcHJvcGVydGllcyBvZiBhXG4gICAgLy8gU3RvcmVPYmplY3QgY29ycmVzcG9uZCB0byB3aGljaCBvcmlnaW5hbCBmaWVsZCBuYW1lcy5cbiAgICByZXR1cm4gZmllbGROYW1lID09PSBmaWVsZE5hbWVGcm9tU3RvcmVOYW1lKHN0b3JlRmllbGROYW1lKSA/IHN0b3JlRmllbGROYW1lXG4gICAgICA6IGZpZWxkTmFtZSArIFwiOlwiICsgc3RvcmVGaWVsZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgcmVhZEZpZWxkPFYgPSBTdG9yZVZhbHVlPihcbiAgICBvcHRpb25zOiBSZWFkRmllbGRPcHRpb25zLFxuICAgIGNvbnRleHQ6IFJlYWRNZXJnZU1vZGlmeUNvbnRleHRcbiAgKTogU2FmZVJlYWRvbmx5PFY+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBvYmplY3RPclJlZmVyZW5jZSA9IG9wdGlvbnMuZnJvbTtcbiAgICBpZiAoIW9iamVjdE9yUmVmZXJlbmNlKSByZXR1cm47XG5cbiAgICBjb25zdCBuYW1lT3JGaWVsZCA9IG9wdGlvbnMuZmllbGQgfHwgb3B0aW9ucy5maWVsZE5hbWU7XG4gICAgaWYgKCFuYW1lT3JGaWVsZCkgcmV0dXJuO1xuXG4gICAgaWYgKG9wdGlvbnMudHlwZW5hbWUgPT09IHZvaWQgMCkge1xuICAgICAgY29uc3QgdHlwZW5hbWUgPSBjb250ZXh0LnN0b3JlLmdldEZpZWxkVmFsdWU8c3RyaW5nPihcbiAgICAgICAgb2JqZWN0T3JSZWZlcmVuY2UsXG4gICAgICAgIFwiX190eXBlbmFtZVwiXG4gICAgICApO1xuICAgICAgaWYgKHR5cGVuYW1lKSBvcHRpb25zLnR5cGVuYW1lID0gdHlwZW5hbWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmVGaWVsZE5hbWUgPSB0aGlzLmdldFN0b3JlRmllbGROYW1lKG9wdGlvbnMpO1xuICAgIGNvbnN0IGZpZWxkTmFtZSA9IGZpZWxkTmFtZUZyb21TdG9yZU5hbWUoc3RvcmVGaWVsZE5hbWUpO1xuICAgIGNvbnN0IGV4aXN0aW5nID0gY29udGV4dC5zdG9yZS5nZXRGaWVsZFZhbHVlPFY+KFxuICAgICAgb2JqZWN0T3JSZWZlcmVuY2UsXG4gICAgICBzdG9yZUZpZWxkTmFtZVxuICAgICk7XG4gICAgY29uc3QgcG9saWN5ID0gdGhpcy5nZXRGaWVsZFBvbGljeShvcHRpb25zLnR5cGVuYW1lLCBmaWVsZE5hbWUsIGZhbHNlKTtcbiAgICBjb25zdCByZWFkID0gcG9saWN5ICYmIHBvbGljeS5yZWFkO1xuXG4gICAgaWYgKHJlYWQpIHtcbiAgICAgIGNvbnN0IHJlYWRPcHRpb25zID0gbWFrZUZpZWxkRnVuY3Rpb25PcHRpb25zKFxuICAgICAgICB0aGlzLFxuICAgICAgICBvYmplY3RPclJlZmVyZW5jZSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgY29udGV4dC5zdG9yZS5nZXRTdG9yYWdlKFxuICAgICAgICAgIGlzUmVmZXJlbmNlKG9iamVjdE9yUmVmZXJlbmNlKSA/XG4gICAgICAgICAgICBvYmplY3RPclJlZmVyZW5jZS5fX3JlZlxuICAgICAgICAgIDogb2JqZWN0T3JSZWZlcmVuY2UsXG4gICAgICAgICAgc3RvcmVGaWVsZE5hbWVcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgICAgLy8gQ2FsbCByZWFkKGV4aXN0aW5nLCByZWFkT3B0aW9ucykgd2l0aCBjYWNoZVNsb3QgaG9sZGluZyB0aGlzLmNhY2hlLlxuICAgICAgcmV0dXJuIGNhY2hlU2xvdC53aXRoVmFsdWUodGhpcy5jYWNoZSwgcmVhZCwgW1xuICAgICAgICBleGlzdGluZyxcbiAgICAgICAgcmVhZE9wdGlvbnMsXG4gICAgICBdKSBhcyBTYWZlUmVhZG9ubHk8Vj47XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4aXN0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldFJlYWRGdW5jdGlvbihcbiAgICB0eXBlbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nXG4gICk6IEZpZWxkUmVhZEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwb2xpY3kgPSB0aGlzLmdldEZpZWxkUG9saWN5KHR5cGVuYW1lLCBmaWVsZE5hbWUsIGZhbHNlKTtcbiAgICByZXR1cm4gcG9saWN5ICYmIHBvbGljeS5yZWFkO1xuICB9XG5cbiAgcHVibGljIGdldE1lcmdlRnVuY3Rpb24oXG4gICAgcGFyZW50VHlwZW5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBjaGlsZFR5cGVuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogRmllbGRNZXJnZUZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgcG9saWN5OlxuICAgICAgfCBQb2xpY2llc1tcInR5cGVQb2xpY2llc1wiXVtzdHJpbmddXG4gICAgICB8IFBvbGljaWVzW1widHlwZVBvbGljaWVzXCJdW3N0cmluZ11bXCJmaWVsZHNcIl1bc3RyaW5nXVxuICAgICAgfCB1bmRlZmluZWQgPSB0aGlzLmdldEZpZWxkUG9saWN5KHBhcmVudFR5cGVuYW1lLCBmaWVsZE5hbWUsIGZhbHNlKTtcbiAgICBsZXQgbWVyZ2UgPSBwb2xpY3kgJiYgcG9saWN5Lm1lcmdlO1xuICAgIGlmICghbWVyZ2UgJiYgY2hpbGRUeXBlbmFtZSkge1xuICAgICAgcG9saWN5ID0gdGhpcy5nZXRUeXBlUG9saWN5KGNoaWxkVHlwZW5hbWUpO1xuICAgICAgbWVyZ2UgPSBwb2xpY3kgJiYgcG9saWN5Lm1lcmdlO1xuICAgIH1cbiAgICByZXR1cm4gbWVyZ2U7XG4gIH1cblxuICBwdWJsaWMgcnVuTWVyZ2VGdW5jdGlvbihcbiAgICBleGlzdGluZzogU3RvcmVWYWx1ZSxcbiAgICBpbmNvbWluZzogU3RvcmVWYWx1ZSxcbiAgICB7IGZpZWxkLCB0eXBlbmFtZSwgbWVyZ2UgfTogTWVyZ2VJbmZvLFxuICAgIGNvbnRleHQ6IFdyaXRlQ29udGV4dCxcbiAgICBzdG9yYWdlPzogU3RvcmFnZVR5cGVcbiAgKSB7XG4gICAgaWYgKG1lcmdlID09PSBtZXJnZVRydWVGbikge1xuICAgICAgLy8gSW5zdGVhZCBvZiBnb2luZyB0byB0aGUgdHJvdWJsZSBvZiBjcmVhdGluZyBhIGZ1bGxcbiAgICAgIC8vIEZpZWxkRnVuY3Rpb25PcHRpb25zIG9iamVjdCBhbmQgY2FsbGluZyBtZXJnZVRydWVGbiwgd2UgY2FuXG4gICAgICAvLyBzaW1wbHkgY2FsbCBtZXJnZU9iamVjdHMsIGFzIG1lcmdlVHJ1ZUZuIHdvdWxkLlxuICAgICAgcmV0dXJuIG1ha2VNZXJnZU9iamVjdHNGdW5jdGlvbihjb250ZXh0LnN0b3JlKShcbiAgICAgICAgZXhpc3RpbmcgYXMgU3RvcmVPYmplY3QsXG4gICAgICAgIGluY29taW5nIGFzIFN0b3JlT2JqZWN0XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXJnZSA9PT0gbWVyZ2VGYWxzZUZuKSB7XG4gICAgICAvLyBMaWtld2lzZSBmb3IgbWVyZ2VGYWxzZUZuLCB3aG9zZSBpbXBsZW1lbnRhdGlvbiBpcyBldmVuIHNpbXBsZXIuXG4gICAgICByZXR1cm4gaW5jb21pbmc7XG4gICAgfVxuXG4gICAgLy8gSWYgY2FjaGUud3JpdGVRdWVyeSBvciBjYWNoZS53cml0ZUZyYWdtZW50IHdhcyBjYWxsZWQgd2l0aFxuICAgIC8vIG9wdGlvbnMub3ZlcndyaXRlIHNldCB0byB0cnVlLCB3ZSBzdGlsbCBjYWxsIG1lcmdlIGZ1bmN0aW9ucywgYnV0XG4gICAgLy8gdGhlIGV4aXN0aW5nIGRhdGEgaXMgYWx3YXlzIHVuZGVmaW5lZCwgc28gdGhlIG1lcmdlIGZ1bmN0aW9uIHdpbGxcbiAgICAvLyBub3QgYXR0ZW1wdCB0byBjb21iaW5lIHRoZSBpbmNvbWluZyBkYXRhIHdpdGggdGhlIGV4aXN0aW5nIGRhdGEuXG4gICAgaWYgKGNvbnRleHQub3ZlcndyaXRlKSB7XG4gICAgICBleGlzdGluZyA9IHZvaWQgMDtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2UoXG4gICAgICBleGlzdGluZyxcbiAgICAgIGluY29taW5nLFxuICAgICAgbWFrZUZpZWxkRnVuY3Rpb25PcHRpb25zKFxuICAgICAgICB0aGlzLFxuICAgICAgICAvLyBVbmxpa2Ugb3B0aW9ucy5yZWFkRmllbGQgZm9yIHJlYWQgZnVuY3Rpb25zLCB3ZSBkbyBub3QgZmFsbFxuICAgICAgICAvLyBiYWNrIHRvIHRoZSBjdXJyZW50IG9iamVjdCBpZiBubyBmb3JlaWduT2JqT3JSZWYgaXMgcHJvdmlkZWQsXG4gICAgICAgIC8vIGJlY2F1c2UgaXQncyBub3QgY2xlYXIgd2hhdCB0aGUgY3VycmVudCBvYmplY3Qgc2hvdWxkIGJlIGZvclxuICAgICAgICAvLyBtZXJnZSBmdW5jdGlvbnM6IHRoZSAocG9zc2libHkgdW5kZWZpbmVkKSBleGlzdGluZyBvYmplY3QsIG9yXG4gICAgICAgIC8vIHRoZSBpbmNvbWluZyBvYmplY3Q/IElmIHlvdSB0aGluayB5b3VyIG1lcmdlIGZ1bmN0aW9uIG5lZWRzXG4gICAgICAgIC8vIHRvIHJlYWQgc2libGluZyBmaWVsZHMgaW4gb3JkZXIgdG8gcHJvZHVjZSBhIG5ldyB2YWx1ZSBmb3JcbiAgICAgICAgLy8gdGhlIGN1cnJlbnQgZmllbGQsIHlvdSBtaWdodCB3YW50IHRvIHJldGhpbmsgeW91ciBzdHJhdGVneSxcbiAgICAgICAgLy8gYmVjYXVzZSB0aGF0J3MgYSByZWNpcGUgZm9yIG1ha2luZyBtZXJnZSBiZWhhdmlvciBzZW5zaXRpdmVcbiAgICAgICAgLy8gdG8gdGhlIG9yZGVyIGluIHdoaWNoIGZpZWxkcyBhcmUgd3JpdHRlbiBpbnRvIHRoZSBjYWNoZS5cbiAgICAgICAgLy8gSG93ZXZlciwgcmVhZEZpZWxkKG5hbWUsIHJlZikgaXMgdXNlZnVsIGZvciBtZXJnZSBmdW5jdGlvbnNcbiAgICAgICAgLy8gdGhhdCBuZWVkIHRvIGRlZHVwbGljYXRlIGNoaWxkIG9iamVjdHMgYW5kIHJlZmVyZW5jZXMuXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGVuYW1lLFxuICAgICAgICAgIGZpZWxkTmFtZTogZmllbGQubmFtZS52YWx1ZSxcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICB2YXJpYWJsZXM6IGNvbnRleHQudmFyaWFibGVzLFxuICAgICAgICB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgICBzdG9yYWdlIHx8IE9iamVjdC5jcmVhdGUobnVsbClcbiAgICAgIClcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1ha2VGaWVsZEZ1bmN0aW9uT3B0aW9ucyhcbiAgcG9saWNpZXM6IFBvbGljaWVzLFxuICBvYmplY3RPclJlZmVyZW5jZTogU3RvcmVPYmplY3QgfCBSZWZlcmVuY2UgfCB1bmRlZmluZWQsXG4gIGZpZWxkU3BlYzogRmllbGRTcGVjaWZpZXIsXG4gIGNvbnRleHQ6IFJlYWRNZXJnZU1vZGlmeUNvbnRleHQsXG4gIHN0b3JhZ2U6IFN0b3JhZ2VUeXBlXG4pOiBGaWVsZEZ1bmN0aW9uT3B0aW9ucyB7XG4gIGNvbnN0IHN0b3JlRmllbGROYW1lID0gcG9saWNpZXMuZ2V0U3RvcmVGaWVsZE5hbWUoZmllbGRTcGVjKTtcbiAgY29uc3QgZmllbGROYW1lID0gZmllbGROYW1lRnJvbVN0b3JlTmFtZShzdG9yZUZpZWxkTmFtZSk7XG4gIGNvbnN0IHZhcmlhYmxlcyA9IGZpZWxkU3BlYy52YXJpYWJsZXMgfHwgY29udGV4dC52YXJpYWJsZXM7XG4gIGNvbnN0IHsgdG9SZWZlcmVuY2UsIGNhblJlYWQgfSA9IGNvbnRleHQuc3RvcmU7XG5cbiAgcmV0dXJuIHtcbiAgICBhcmdzOiBhcmdzRnJvbUZpZWxkU3BlY2lmaWVyKGZpZWxkU3BlYyksXG4gICAgZmllbGQ6IGZpZWxkU3BlYy5maWVsZCB8fCBudWxsLFxuICAgIGZpZWxkTmFtZSxcbiAgICBzdG9yZUZpZWxkTmFtZSxcbiAgICB2YXJpYWJsZXMsXG4gICAgaXNSZWZlcmVuY2UsXG4gICAgdG9SZWZlcmVuY2UsXG4gICAgc3RvcmFnZSxcbiAgICBjYWNoZTogcG9saWNpZXMuY2FjaGUsXG4gICAgY2FuUmVhZCxcbiAgICByZWFkRmllbGQ8VD4oKSB7XG4gICAgICByZXR1cm4gcG9saWNpZXMucmVhZEZpZWxkPFQ+KFxuICAgICAgICBub3JtYWxpemVSZWFkRmllbGRPcHRpb25zKGFyZ3VtZW50cywgb2JqZWN0T3JSZWZlcmVuY2UsIHZhcmlhYmxlcyksXG4gICAgICAgIGNvbnRleHRcbiAgICAgICk7XG4gICAgfSxcbiAgICBtZXJnZU9iamVjdHM6IG1ha2VNZXJnZU9iamVjdHNGdW5jdGlvbihjb250ZXh0LnN0b3JlKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJlYWRGaWVsZE9wdGlvbnMoXG4gIHJlYWRGaWVsZEFyZ3M6IElBcmd1bWVudHMsXG4gIG9iamVjdE9yUmVmZXJlbmNlOiBTdG9yZU9iamVjdCB8IFJlZmVyZW5jZSB8IHVuZGVmaW5lZCxcbiAgdmFyaWFibGVzPzogUmVhZE1lcmdlTW9kaWZ5Q29udGV4dFtcInZhcmlhYmxlc1wiXVxuKTogUmVhZEZpZWxkT3B0aW9ucyB7XG4gIGNvbnN0IHsgMDogZmllbGROYW1lT3JPcHRpb25zLCAxOiBmcm9tLCBsZW5ndGg6IGFyZ2MgfSA9IHJlYWRGaWVsZEFyZ3M7XG5cbiAgbGV0IG9wdGlvbnM6IFJlYWRGaWVsZE9wdGlvbnM7XG5cbiAgaWYgKHR5cGVvZiBmaWVsZE5hbWVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgZmllbGROYW1lOiBmaWVsZE5hbWVPck9wdGlvbnMsXG4gICAgICAvLyBEZWZhdWx0IHRvIG9iamVjdE9yUmVmZXJlbmNlIG9ubHkgd2hlbiBubyBzZWNvbmQgYXJndW1lbnQgd2FzXG4gICAgICAvLyBwYXNzZWQgZm9yIHRoZSBmcm9tIHBhcmFtZXRlciwgbm90IHdoZW4gdW5kZWZpbmVkIGlzIGV4cGxpY2l0bHlcbiAgICAgIC8vIHBhc3NlZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LlxuICAgICAgZnJvbTogYXJnYyA+IDEgPyBmcm9tIDogb2JqZWN0T3JSZWZlcmVuY2UsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zID0geyAuLi5maWVsZE5hbWVPck9wdGlvbnMgfTtcbiAgICAvLyBEZWZhdWx0IHRvIG9iamVjdE9yUmVmZXJlbmNlIG9ubHkgd2hlbiBmaWVsZE5hbWVPck9wdGlvbnMuZnJvbSBpc1xuICAgIC8vIGFjdHVhbGx5IG9taXR0ZWQsIHJhdGhlciB0aGFuIGp1c3QgdW5kZWZpbmVkLlxuICAgIGlmICghaGFzT3duLmNhbGwob3B0aW9ucywgXCJmcm9tXCIpKSB7XG4gICAgICBvcHRpb25zLmZyb20gPSBvYmplY3RPclJlZmVyZW5jZTtcbiAgICB9XG4gIH1cblxuICBpZiAoX19ERVZfXyAmJiBvcHRpb25zLmZyb20gPT09IHZvaWQgMCkge1xuICAgIGludmFyaWFudC53YXJuKFxuICAgICAgYFVuZGVmaW5lZCAnZnJvbScgcGFzc2VkIHRvIHJlYWRGaWVsZCB3aXRoIGFyZ3VtZW50cyAlc2AsXG4gICAgICBzdHJpbmdpZnlGb3JEaXNwbGF5KEFycmF5LmZyb20ocmVhZEZpZWxkQXJncykpXG4gICAgKTtcbiAgfVxuXG4gIGlmICh2b2lkIDAgPT09IG9wdGlvbnMudmFyaWFibGVzKSB7XG4gICAgb3B0aW9ucy52YXJpYWJsZXMgPSB2YXJpYWJsZXM7XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuZnVuY3Rpb24gbWFrZU1lcmdlT2JqZWN0c0Z1bmN0aW9uKFxuICBzdG9yZTogTm9ybWFsaXplZENhY2hlXG4pOiBNZXJnZU9iamVjdHNGdW5jdGlvbiB7XG4gIHJldHVybiBmdW5jdGlvbiBtZXJnZU9iamVjdHMoZXhpc3RpbmcsIGluY29taW5nKSB7XG4gICAgaWYgKGlzQXJyYXkoZXhpc3RpbmcpIHx8IGlzQXJyYXkoaW5jb21pbmcpKSB7XG4gICAgICB0aHJvdyBuZXdJbnZhcmlhbnRFcnJvcihcIkNhbm5vdCBhdXRvbWF0aWNhbGx5IG1lcmdlIGFycmF5c1wiKTtcbiAgICB9XG5cbiAgICAvLyBUaGVzZSBkeW5hbWljIGNoZWNrcyBhcmUgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHBhcmFtZXRlcnMgb2YgYVxuICAgIC8vIGN1c3RvbSBtZXJnZSBmdW5jdGlvbiBjYW4gZWFzaWx5IGhhdmUgdGhlIGFueSB0eXBlLCBzbyB0aGUgdHlwZVxuICAgIC8vIHN5c3RlbSBjYW5ub3QgYWx3YXlzIGVuZm9yY2UgdGhlIFN0b3JlT2JqZWN0IHwgUmVmZXJlbmNlIHBhcmFtZXRlclxuICAgIC8vIHR5cGVzIG9mIG9wdGlvbnMubWVyZ2VPYmplY3RzLlxuICAgIGlmIChpc05vbk51bGxPYmplY3QoZXhpc3RpbmcpICYmIGlzTm9uTnVsbE9iamVjdChpbmNvbWluZykpIHtcbiAgICAgIGNvbnN0IGVUeXBlID0gc3RvcmUuZ2V0RmllbGRWYWx1ZShleGlzdGluZywgXCJfX3R5cGVuYW1lXCIpO1xuICAgICAgY29uc3QgaVR5cGUgPSBzdG9yZS5nZXRGaWVsZFZhbHVlKGluY29taW5nLCBcIl9fdHlwZW5hbWVcIik7XG4gICAgICBjb25zdCB0eXBlc0RpZmZlciA9IGVUeXBlICYmIGlUeXBlICYmIGVUeXBlICE9PSBpVHlwZTtcblxuICAgICAgaWYgKHR5cGVzRGlmZmVyKSB7XG4gICAgICAgIHJldHVybiBpbmNvbWluZztcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUmVmZXJlbmNlKGV4aXN0aW5nKSAmJiBzdG9yZVZhbHVlSXNTdG9yZU9iamVjdChpbmNvbWluZykpIHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBub3JtYWxpemVkIEVudGl0eVN0b3JlIGZvciB0aGUgZW50aXR5IGlkZW50aWZpZWQgYnlcbiAgICAgICAgLy8gZXhpc3RpbmcuX19yZWYsIHByZWZlcnJpbmcvb3ZlcndyaXRpbmcgYW55IGZpZWxkcyBjb250cmlidXRlZCBieSB0aGVcbiAgICAgICAgLy8gbmV3ZXIgaW5jb21pbmcgU3RvcmVPYmplY3QuXG4gICAgICAgIHN0b3JlLm1lcmdlKGV4aXN0aW5nLl9fcmVmLCBpbmNvbWluZyk7XG4gICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgIH1cblxuICAgICAgaWYgKHN0b3JlVmFsdWVJc1N0b3JlT2JqZWN0KGV4aXN0aW5nKSAmJiBpc1JlZmVyZW5jZShpbmNvbWluZykpIHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBub3JtYWxpemVkIEVudGl0eVN0b3JlIGZvciB0aGUgZW50aXR5IGlkZW50aWZpZWQgYnlcbiAgICAgICAgLy8gaW5jb21pbmcuX19yZWYsIHRha2luZyBmaWVsZHMgZnJvbSB0aGUgb2xkZXIgZXhpc3Rpbmcgb2JqZWN0IG9ubHkgaWZcbiAgICAgICAgLy8gdGhvc2UgZmllbGRzIGFyZSBub3QgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBuZXdlciBTdG9yZU9iamVjdFxuICAgICAgICAvLyBpZGVudGlmaWVkIGJ5IGluY29taW5nLl9fcmVmLlxuICAgICAgICBzdG9yZS5tZXJnZShleGlzdGluZywgaW5jb21pbmcuX19yZWYpO1xuICAgICAgICByZXR1cm4gaW5jb21pbmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgc3RvcmVWYWx1ZUlzU3RvcmVPYmplY3QoZXhpc3RpbmcpICYmXG4gICAgICAgIHN0b3JlVmFsdWVJc1N0b3JlT2JqZWN0KGluY29taW5nKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB7IC4uLmV4aXN0aW5nLCAuLi5pbmNvbWluZyB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbmNvbWluZztcbiAgfTtcbn1cbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMF19