jsii-docgen
Version:
generates api docs for jsii modules
390 lines • 47.3 kB
JavaScript
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.JavaTranspile = void 0;
const Case = __importStar(require("case"));
const reflect = __importStar(require("jsii-reflect"));
const transpile = __importStar(require("./transpile"));
const schema_1 = require("../schema");
// Helper methods
const toCamelCase = (text) => {
return Case.camel(text !== null && text !== void 0 ? text : '');
};
const toUpperCamelCase = (test) => {
const camelCase = toCamelCase(test);
return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);
};
// [1, 2, 3] -> [[], [1], [1, 2], [1, 2, 3]]
const prefixArrays = (arr) => {
const out = [[]];
const prefix = [];
for (const elem of arr) {
prefix.push(elem);
out.push([...prefix]);
}
return out;
};
/**
* Hack to convert a jsii property to a parameter for
* parameter expansion.
*/
const propertyToParameter = (callable, property) => {
return {
docs: property.docs,
method: callable,
name: property.name,
optional: property.optional,
parentType: callable.parentType,
spec: property.spec,
system: property.system,
type: property.type,
variadic: false,
};
};
class JavaTranspile extends transpile.TranspileBase {
constructor() {
super(transpile.Language.JAVA);
}
moduleLike(moduleLike) {
var _a, _b, _c, _d;
const javaPackage = (_b = (_a = moduleLike.targets) === null || _a === void 0 ? void 0 : _a.java) === null || _b === void 0 ? void 0 : _b.package;
// if this is a submodule, we need to break the package name down into the
// parent name and the submodule. we also allow submodules not to have
// explicit target names, in which case we need to append the snake-cased
// submodule name to the parent package name.
if (moduleLike instanceof reflect.Submodule) {
const parent = this.getParentModule(moduleLike);
const parentFqn = (_d = (_c = parent.targets) === null || _c === void 0 ? void 0 : _c.java) === null || _d === void 0 ? void 0 : _d.package;
// if the submodule does not explicitly define a java package name, we need to deduce it from the parent
// based on jsii-pacmak package naming conventions.
// see https://github.com/aws/jsii/blob/b329670bf9ec222fad5fc0d614dcddd5daca7af5/packages/jsii-pacmak/lib/targets/java.ts#L3150
const submoduleJavaPackage = javaPackage !== null && javaPackage !== void 0 ? javaPackage : `${parentFqn}.${Case.snake(moduleLike.name)}`;
// for some modules, the parent module's Java package is a prefix of
// the submodule's Java package, e.g.
// { name: "software.amazon.awscdk", submodule: "software.amazon.awscdk.services.ecr" }
//
// but it's possible the names differ, for example in aws-cdk-lib:
// { name: "software.amazon.awscdk.core", submodule: "software.amazon.awscdk.services.ecr" }
return { name: parentFqn, submodule: submoduleJavaPackage };
}
return { name: javaPackage };
}
type(type) {
const submodule = this.findSubmodule(type);
const moduleLike = this.moduleLike(submodule ? submodule : type.assembly);
const fqn = [];
let namespace = type.namespace;
if (namespace) {
if (submodule && moduleLike.submodule) {
// if the type is in a submodule, submodule.name is a substring of the namespace
// so we update that part with the language-specific submodule string
fqn.push(namespace.replace(submodule.name, moduleLike.submodule));
}
else {
fqn.push(moduleLike.name);
fqn.push(namespace);
}
}
else {
fqn.push(moduleLike.name);
}
fqn.push(type.name);
return new transpile.TranspiledType({
fqn: fqn.join('.'),
name: type.name,
namespace: namespace,
module: moduleLike.name,
submodule: moduleLike.submodule,
submodulePath: (0, schema_1.submodulePath)(submodule),
source: type,
language: this.language,
});
}
callable(callable) {
const type = this.type(callable.parentType);
const parameters = callable.parameters.sort(this.optionalityCompare);
const requiredParams = parameters.filter((p) => !p.optional);
const optionalParams = parameters.filter((p) => p.optional);
const name = callable.name;
// simulate Java method overloading
const inputLists = prefixArrays(optionalParams).map((optionals) => {
return [...requiredParams, ...optionals].map((p) => this.formatParameter(this.parameter(p)));
});
let returnType;
if (reflect.Initializer.isInitializer(callable)) {
returnType = this.typeReference(callable.parentType.reference);
}
else if (reflect.Method.isMethod(callable)) {
returnType = this.typeReference(callable.returns.type);
}
const returns = returnType === null || returnType === void 0 ? void 0 : returnType.toString({
typeFormatter: (t) => t.name,
});
const signatures = inputLists.map((inputs) => {
return this.formatSignature(name, inputs, returns);
});
let invocations;
if (this.isClassBuilderGenerated(callable)) {
const struct = this.extractFirstStruct(parameters);
// render using Java builder syntax (show no overloads)
invocations = [this.formatClassBuilder(type, parameters, struct)];
// flatten out the parameters so the user doesn't have to jump between
// docs of Foo and FooProps
for (const property of struct.allProperties) {
const parameter = propertyToParameter(callable, property);
parameters.push(parameter);
}
}
else {
invocations = reflect.Initializer.isInitializer(callable)
// render with `new Class` syntax (showing all constructor overloads)
? inputLists.map((inputs) => this.formatClassInitialization(type, inputs))
// render invocation as method calls (showing all method overloads)
: inputLists.map((inputs) => this.formatInvocation(type, inputs, name));
}
return {
name,
parentType: type,
import: this.formatImport(type),
parameters,
signatures,
invocations,
};
}
class(klass) {
return {
name: klass.name,
type: this.type(klass),
};
}
struct(struct) {
const type = this.type(struct);
const indent = ' '.repeat(4);
const inputs = struct.allProperties.map((p) => this.formatBuilderMethod(this.property(p), indent)).flat();
return {
type: type,
name: struct.name,
import: this.formatImport(type),
initialization: this.formatStructBuilder(type, inputs),
};
}
interface(iface) {
return {
name: iface.name,
type: this.type(iface),
};
}
parameter(parameter) {
const typeRef = this.typeReference(parameter.type);
return {
name: parameter.name,
parentType: this.type(parameter.parentType),
typeReference: typeRef,
optional: parameter.optional,
variadic: parameter.variadic,
declaration: this.formatProperty(parameter.name, typeRef),
};
}
property(property) {
const typeRef = this.typeReference(property.type);
return {
name: property.name,
parentType: this.type(property.parentType),
typeReference: typeRef,
optional: property.optional,
declaration: this.formatProperty(property.name, typeRef),
};
}
enum(enu) {
return {
fqn: this.type(enu).fqn,
name: enu.name,
};
}
enumMember(em) {
return {
fqn: `${this.enum(em.enumType).fqn}.${em.name}`,
name: em.name,
};
}
unionOf(types) {
return types.join(' OR ');
}
listOf(type) {
return `java.util.List<${type}>`;
}
variadicOf(type) {
return `${type}...`;
}
mapOf(type) {
return `java.util.Map<java.lang.String, ${type}>`;
}
any() {
return 'java.lang.Object';
}
void() {
return 'void';
}
str() {
return 'java.lang.String';
}
number() {
return 'java.lang.Number';
}
boolean() {
return 'java.lang.Boolean';
}
json() {
return 'com.fasterxml.jackson.databind.node.ObjectNode';
}
date() {
return 'java.time.Instant';
}
readme(readme) {
return readme;
}
formatImport(type) {
return `import ${type.fqn};`;
}
;
formatParameter(transpiled) {
const tf = transpiled.typeReference.toString({
typeFormatter: (t) => t.name,
});
if (transpiled.variadic) {
return `${this.variadicOf(tf)} ${transpiled.name}`;
}
return `${tf} ${transpiled.name}`;
}
formatInputs(inputs) {
return inputs.join(', ');
}
;
formatStructBuilder(type, methods) {
const builder = `${type.name}.builder()`;
return [
builder,
...methods,
' .build();',
].join('\n');
}
;
formatClassInitialization(type, inputs) {
return `new ${type.name}(${this.formatInputs(inputs)});`;
}
;
formatClassBuilder(type, parameters, struct) {
const createArgs = this.formatInputs(parameters.map((p) => this.formatParameter(this.parameter(p))));
const indent = ' '.repeat(4);
const methods = struct.allProperties.map((p) => this.formatBuilderMethod(this.property(p), indent)).flat();
return [
`${type.name}.Builder.create(${createArgs})`,
...methods,
`${indent}.build();`,
].join('\n');
}
;
formatSignature(name, inputs, returns) {
return `public ${returns ? returns + ' ' : ''}${name}(${this.formatInputs(inputs)})`;
}
;
formatBuilderMethod(transpiled, indent) {
if (transpiled.optional)
indent = '//' + indent.slice(2);
const lowerCamel = toCamelCase(transpiled.name);
const base = `${indent}.${lowerCamel}`;
const tf = transpiled.typeReference.toString({
typeFormatter: (t) => t.name,
});
// allow rendering union types as multiple overrided builder methods
if (tf.includes(' OR ')) {
const choices = tf.split(' OR ');
return choices.map((typ) => `${base}(${typ})`);
}
else {
return [`${base}(${tf})`];
}
}
formatInvocation(type, inputs, method) {
let target = type.name;
if (method) {
target = `${target}.${method}`;
}
return `${target}(${this.formatInputs(inputs)})`;
}
;
isStruct(p) {
return p.type.fqn ? p.system.findFqn(p.type.fqn).isDataType() : false;
}
isClassBuilderGenerated(callable) {
if (callable.kind !== reflect.MemberKind.Initializer) {
return false;
}
const parameters = callable.parameters.sort(this.optionalityCompare);
const firstStruct = parameters.find((param) => this.isStruct(param));
// no builder is generated if there is no struct parameter
if (!firstStruct) {
return false;
}
return true;
}
;
/**
* Extracts the first struct out of a list of parameters (and throws
* if there is none), removing it from the array.
*/
extractFirstStruct(parameters) {
const firstStruct = parameters.find((param) => this.isStruct(param));
if (!firstStruct) {
throw new Error('No struct found in parameter list.');
}
const struct = firstStruct.parentType.system.findInterface(firstStruct.type.fqn);
parameters.splice(parameters.indexOf(firstStruct), 1);
return struct;
}
formatProperty(name, typeReference) {
const tf = typeReference.toString({
typeFormatter: (t) => t.name,
});
if (tf.includes(' OR ')) {
return `public java.lang.Object get${toUpperCamelCase(name)}();`;
}
else {
return `public ${tf} get${toUpperCamelCase(name)}();`;
}
}
}
exports.JavaTranspile = JavaTranspile;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kb2NnZW4vdHJhbnNwaWxlL2phdmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQTZCO0FBQzdCLHNEQUF3QztBQUN4Qyx1REFBeUM7QUFDekMsc0NBQTBDO0FBRTFDLGlCQUFpQjtBQUNqQixNQUFNLFdBQVcsR0FBRyxDQUFDLElBQWEsRUFBRSxFQUFFO0lBQ3BDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLGFBQUosSUFBSSxjQUFKLElBQUksR0FBSSxFQUFFLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHLENBQUMsSUFBYSxFQUFFLEVBQUU7SUFDekMsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLENBQUMsQ0FBQztBQUVGLDRDQUE0QztBQUM1QyxNQUFNLFlBQVksR0FBRyxDQUFJLEdBQVEsRUFBUyxFQUFFO0lBQzFDLE1BQU0sR0FBRyxHQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEIsTUFBTSxNQUFNLEdBQVEsRUFBRSxDQUFDO0lBQ3ZCLEtBQUssTUFBTSxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsQ0FDMUIsUUFBMEIsRUFDMUIsUUFBMEIsRUFDUCxFQUFFO0lBQ3JCLE9BQU87UUFDTCxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7UUFDbkIsTUFBTSxFQUFFLFFBQVE7UUFDaEIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1FBQ25CLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtRQUMzQixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7UUFDL0IsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1FBQ25CLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtRQUN2QixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7UUFDbkIsUUFBUSxFQUFFLEtBQUs7S0FDaEIsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQWEsYUFBYyxTQUFRLFNBQVMsQ0FBQyxhQUFhO0lBQ3hEO1FBQ0UsS0FBSyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVNLFVBQVUsQ0FDZixVQUE4Qjs7UUFFOUIsTUFBTSxXQUFXLEdBQVcsTUFBQSxNQUFBLFVBQVUsQ0FBQyxPQUFPLDBDQUFFLElBQUksMENBQUUsT0FBTyxDQUFDO1FBRTlELDBFQUEwRTtRQUMxRSxzRUFBc0U7UUFDdEUseUVBQXlFO1FBQ3pFLDZDQUE2QztRQUM3QyxJQUFJLFVBQVUsWUFBWSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNoRCxNQUFNLFNBQVMsR0FBRyxNQUFBLE1BQUEsTUFBTSxDQUFDLE9BQU8sMENBQUUsSUFBSSwwQ0FBRSxPQUFPLENBQUM7WUFFaEQsd0dBQXdHO1lBQ3hHLG1EQUFtRDtZQUNuRCwrSEFBK0g7WUFDL0gsTUFBTSxvQkFBb0IsR0FBRyxXQUFXLGFBQVgsV0FBVyxjQUFYLFdBQVcsR0FBSSxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBRTFGLG9FQUFvRTtZQUNwRSxxQ0FBcUM7WUFDckMsdUZBQXVGO1lBQ3ZGLEVBQUU7WUFDRixrRUFBa0U7WUFDbEUsNEZBQTRGO1lBQzVGLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxDQUFDO1FBQzlELENBQUM7UUFFRCxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFTSxJQUFJLENBQUMsSUFBa0I7UUFDNUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFMUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBRWYsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMvQixJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxTQUFTLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUN0QyxnRkFBZ0Y7Z0JBQ2hGLHFFQUFxRTtnQkFDckUsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDcEUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxQixHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7UUFDRCxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVwQixPQUFPLElBQUksU0FBUyxDQUFDLGNBQWMsQ0FBQztZQUNsQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDbEIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsU0FBUyxFQUFFLFNBQVM7WUFDcEIsTUFBTSxFQUFFLFVBQVUsQ0FBQyxJQUFJO1lBQ3ZCLFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUztZQUMvQixhQUFhLEVBQUUsSUFBQSxzQkFBYSxFQUFDLFNBQVMsQ0FBQztZQUN2QyxNQUFNLEVBQUUsSUFBSTtZQUNaLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtTQUN4QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sUUFBUSxDQUFDLFFBQTBCO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTVDLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRXJFLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU1RCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBRTNCLG1DQUFtQztRQUNuQyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDaEUsT0FBTyxDQUFDLEdBQUcsY0FBYyxFQUFFLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxVQUF5RCxDQUFDO1FBQzlELElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7YUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDN0MsVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsVUFBVSxhQUFWLFVBQVUsdUJBQVYsVUFBVSxDQUFFLFFBQVEsQ0FBQztZQUNuQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO1NBQzdCLENBQUMsQ0FBQztRQUVILE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUMzQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksV0FBVyxDQUFDO1FBRWhCLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRW5ELHVEQUF1RDtZQUN2RCxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBRWxFLHNFQUFzRTtZQUN0RSwyQkFBMkI7WUFDM0IsS0FBSyxNQUFNLFFBQVEsSUFBSSxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzVDLE1BQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDMUQsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3QixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO2dCQUN2RCxxRUFBcUU7Z0JBQ3JFLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUMxRSxtRUFBbUU7Z0JBQ25FLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFFRCxPQUFPO1lBQ0wsSUFBSTtZQUNKLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztZQUMvQixVQUFVO1lBQ1YsVUFBVTtZQUNWLFdBQVc7U0FDWixDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUF3QjtRQUNuQyxPQUFPO1lBQ0wsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQ2hCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztTQUN2QixDQUFDO0lBQ0osQ0FBQztJQUVNLE1BQU0sQ0FBQyxNQUE2QjtRQUN6QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9CLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUM1QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FDbkQsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNULE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSTtZQUNWLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7WUFDL0IsY0FBYyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO1NBQ3ZELENBQUM7SUFDSixDQUFDO0lBRU0sU0FBUyxDQUNkLEtBQTRCO1FBRTVCLE9BQU87WUFDTCxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDaEIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1NBQ3ZCLENBQUM7SUFDSixDQUFDO0lBRU0sU0FBUyxDQUNkLFNBQTRCO1FBRTVCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25ELE9BQU87WUFDTCxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7WUFDcEIsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztZQUMzQyxhQUFhLEVBQUUsT0FBTztZQUN0QixRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVE7WUFDNUIsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRO1lBQzVCLFdBQVcsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO1NBQzFELENBQUM7SUFDSixDQUFDO0lBRU0sUUFBUSxDQUFDLFFBQTBCO1FBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xELE9BQU87WUFDTCxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUMxQyxhQUFhLEVBQUUsT0FBTztZQUN0QixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7WUFDM0IsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7U0FDekQsQ0FBQztJQUNKLENBQUM7SUFFTSxJQUFJLENBQUMsR0FBcUI7UUFDL0IsT0FBTztZQUNMLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUc7WUFDdkIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1NBQ2YsQ0FBQztJQUNKLENBQUM7SUFFTSxVQUFVLENBQUMsRUFBc0I7UUFDdEMsT0FBTztZQUNMLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFO1lBQy9DLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSTtTQUNkLENBQUM7SUFDSixDQUFDO0lBRU0sT0FBTyxDQUFDLEtBQWU7UUFDNUIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFTSxNQUFNLENBQUMsSUFBWTtRQUN4QixPQUFPLGtCQUFrQixJQUFJLEdBQUcsQ0FBQztJQUNuQyxDQUFDO0lBRU0sVUFBVSxDQUFDLElBQVk7UUFDNUIsT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBWTtRQUN2QixPQUFPLG1DQUFtQyxJQUFJLEdBQUcsQ0FBQztJQUNwRCxDQUFDO0lBRU0sR0FBRztRQUNSLE9BQU8sa0JBQWtCLENBQUM7SUFDNUIsQ0FBQztJQUVNLElBQUk7UUFDVCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU0sR0FBRztRQUNSLE9BQU8sa0JBQWtCLENBQUM7SUFDNUIsQ0FBQztJQUVNLE1BQU07UUFDWCxPQUFPLGtCQUFrQixDQUFDO0lBQzVCLENBQUM7SUFFTSxPQUFPO1FBQ1osT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBRU0sSUFBSTtRQUNULE9BQU8sZ0RBQWdELENBQUM7SUFDMUQsQ0FBQztJQUVNLElBQUk7UUFDVCxPQUFPLG1CQUFtQixDQUFDO0lBQzdCLENBQUM7SUFFTSxNQUFNLENBQUMsTUFBYztRQUMxQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sWUFBWSxDQUFDLElBQThCO1FBQ2pELE9BQU8sVUFBVSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUM7SUFDL0IsQ0FBQztJQUFBLENBQUM7SUFFTSxlQUFlLENBQ3JCLFVBQXlDO1FBRXpDLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO1lBQzNDLGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDN0IsQ0FBQyxDQUFDO1FBRUgsSUFBSSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDeEIsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JELENBQUM7UUFFRCxPQUFPLEdBQUcsRUFBRSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU8sWUFBWSxDQUFDLE1BQWdCO1FBQ25DLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBQUEsQ0FBQztJQUVNLG1CQUFtQixDQUFDLElBQThCLEVBQUUsT0FBaUI7UUFDM0UsTUFBTSxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUM7UUFDekMsT0FBTztZQUNMLE9BQU87WUFDUCxHQUFHLE9BQU87WUFDVixlQUFlO1NBQ2hCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUFBLENBQUM7SUFFTSx5QkFBeUIsQ0FDL0IsSUFBOEIsRUFDOUIsTUFBZ0I7UUFFaEIsT0FBTyxPQUFPLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQzNELENBQUM7SUFBQSxDQUFDO0lBRU0sa0JBQWtCLENBQ3hCLElBQThCLEVBQzlCLFVBQStCLEVBQy9CLE1BQTZCO1FBRTdCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JHLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxPQUFPLEdBQWEsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUN2RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FDbkQsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNULE9BQU87WUFDTCxHQUFHLElBQUksQ0FBQyxJQUFJLG1CQUFtQixVQUFVLEdBQUc7WUFDNUMsR0FBRyxPQUFPO1lBQ1YsR0FBRyxNQUFNLFdBQVc7U0FDckIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDZixDQUFDO0lBQUEsQ0FBQztJQUdNLGVBQWUsQ0FBQyxJQUFZLEVBQUUsTUFBZ0IsRUFBRSxPQUFnQjtRQUN0RSxPQUFPLFVBQVUsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUN2RixDQUFDO0lBQUEsQ0FBQztJQUVNLG1CQUFtQixDQUN6QixVQUF3QyxFQUN4QyxNQUFjO1FBRWQsSUFBSSxVQUFVLENBQUMsUUFBUTtZQUFFLE1BQU0sR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELE1BQU0sSUFBSSxHQUFHLEdBQUcsTUFBTSxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO1lBQzNDLGFBQWEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDN0IsQ0FBQyxDQUFDO1FBQ0gsb0VBQW9FO1FBQ3BFLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUIsQ0FBQztJQUNILENBQUM7SUFFTyxnQkFBZ0IsQ0FDdEIsSUFBOEIsRUFDOUIsTUFBZ0IsRUFDaEIsTUFBYztRQUVkLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdkIsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsT0FBTyxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7SUFDbkQsQ0FBQztJQUFBLENBQUM7SUFFTSxRQUFRLENBQUMsQ0FBb0I7UUFDbkMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3hFLENBQUM7SUFFTyx1QkFBdUIsQ0FDN0IsUUFBMEI7UUFFMUIsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQXdCLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzFGLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVyRSwwREFBMEQ7UUFDMUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFBLENBQUM7SUFFRjs7O09BR0c7SUFDSyxrQkFBa0IsQ0FDeEIsVUFBK0I7UUFFL0IsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUksQ0FBQyxDQUFDO1FBQ2xGLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0RCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sY0FBYyxDQUNwQixJQUFZLEVBQ1osYUFBZ0Q7UUFFaEQsTUFBTSxFQUFFLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQztZQUNoQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO1NBQzdCLENBQUMsQ0FBQztRQUNILElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sOEJBQThCLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDbkUsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLFVBQVUsRUFBRSxPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDeEQsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXBZRCxzQ0FvWUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBDYXNlIGZyb20gJ2Nhc2UnO1xuaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0ICogYXMgdHJhbnNwaWxlIGZyb20gJy4vdHJhbnNwaWxlJztcbmltcG9ydCB7IHN1Ym1vZHVsZVBhdGggfSBmcm9tICcuLi9zY2hlbWEnO1xuXG4vLyBIZWxwZXIgbWV0aG9kc1xuY29uc3QgdG9DYW1lbENhc2UgPSAodGV4dD86IHN0cmluZykgPT4ge1xuICByZXR1cm4gQ2FzZS5jYW1lbCh0ZXh0ID8/ICcnKTtcbn07XG5cbmNvbnN0IHRvVXBwZXJDYW1lbENhc2UgPSAodGVzdD86IHN0cmluZykgPT4ge1xuICBjb25zdCBjYW1lbENhc2UgPSB0b0NhbWVsQ2FzZSh0ZXN0KTtcbiAgcmV0dXJuIGNhbWVsQ2FzZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGNhbWVsQ2FzZS5zbGljZSgxKTtcbn07XG5cbi8vIFsxLCAyLCAzXSAtPiBbW10sIFsxXSwgWzEsIDJdLCBbMSwgMiwgM11dXG5jb25zdCBwcmVmaXhBcnJheXMgPSA8VD4oYXJyOiBUW10pOiBUW11bXSA9PiB7XG4gIGNvbnN0IG91dDogVFtdW10gPSBbW11dO1xuICBjb25zdCBwcmVmaXg6IFRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGVsZW0gb2YgYXJyKSB7XG4gICAgcHJlZml4LnB1c2goZWxlbSk7XG4gICAgb3V0LnB1c2goWy4uLnByZWZpeF0pO1xuICB9XG4gIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEhhY2sgdG8gY29udmVydCBhIGpzaWkgcHJvcGVydHkgdG8gYSBwYXJhbWV0ZXIgZm9yXG4gKiBwYXJhbWV0ZXIgZXhwYW5zaW9uLlxuICovXG5jb25zdCBwcm9wZXJ0eVRvUGFyYW1ldGVyID0gKFxuICBjYWxsYWJsZTogcmVmbGVjdC5DYWxsYWJsZSxcbiAgcHJvcGVydHk6IHJlZmxlY3QuUHJvcGVydHksXG4pOiByZWZsZWN0LlBhcmFtZXRlciA9PiB7XG4gIHJldHVybiB7XG4gICAgZG9jczogcHJvcGVydHkuZG9jcyxcbiAgICBtZXRob2Q6IGNhbGxhYmxlLFxuICAgIG5hbWU6IHByb3BlcnR5Lm5hbWUsXG4gICAgb3B0aW9uYWw6IHByb3BlcnR5Lm9wdGlvbmFsLFxuICAgIHBhcmVudFR5cGU6IGNhbGxhYmxlLnBhcmVudFR5cGUsXG4gICAgc3BlYzogcHJvcGVydHkuc3BlYyxcbiAgICBzeXN0ZW06IHByb3BlcnR5LnN5c3RlbSxcbiAgICB0eXBlOiBwcm9wZXJ0eS50eXBlLFxuICAgIHZhcmlhZGljOiBmYWxzZSxcbiAgfTtcbn07XG5cbmV4cG9ydCBjbGFzcyBKYXZhVHJhbnNwaWxlIGV4dGVuZHMgdHJhbnNwaWxlLlRyYW5zcGlsZUJhc2Uge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih0cmFuc3BpbGUuTGFuZ3VhZ2UuSkFWQSk7XG4gIH1cblxuICBwdWJsaWMgbW9kdWxlTGlrZShcbiAgICBtb2R1bGVMaWtlOiByZWZsZWN0Lk1vZHVsZUxpa2UsXG4gICk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkTW9kdWxlTGlrZSB7XG4gICAgY29uc3QgamF2YVBhY2thZ2U6IHN0cmluZyA9IG1vZHVsZUxpa2UudGFyZ2V0cz8uamF2YT8ucGFja2FnZTtcblxuICAgIC8vIGlmIHRoaXMgaXMgYSBzdWJtb2R1bGUsIHdlIG5lZWQgdG8gYnJlYWsgdGhlIHBhY2thZ2UgbmFtZSBkb3duIGludG8gdGhlXG4gICAgLy8gcGFyZW50IG5hbWUgYW5kIHRoZSBzdWJtb2R1bGUuIHdlIGFsc28gYWxsb3cgc3VibW9kdWxlcyBub3QgdG8gaGF2ZVxuICAgIC8vIGV4cGxpY2l0IHRhcmdldCBuYW1lcywgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIGFwcGVuZCB0aGUgc25ha2UtY2FzZWRcbiAgICAvLyBzdWJtb2R1bGUgbmFtZSB0byB0aGUgcGFyZW50IHBhY2thZ2UgbmFtZS5cbiAgICBpZiAobW9kdWxlTGlrZSBpbnN0YW5jZW9mIHJlZmxlY3QuU3VibW9kdWxlKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmdldFBhcmVudE1vZHVsZShtb2R1bGVMaWtlKTtcbiAgICAgIGNvbnN0IHBhcmVudEZxbiA9IHBhcmVudC50YXJnZXRzPy5qYXZhPy5wYWNrYWdlO1xuXG4gICAgICAvLyBpZiB0aGUgc3VibW9kdWxlIGRvZXMgbm90IGV4cGxpY2l0bHkgZGVmaW5lIGEgamF2YSBwYWNrYWdlIG5hbWUsIHdlIG5lZWQgdG8gZGVkdWNlIGl0IGZyb20gdGhlIHBhcmVudFxuICAgICAgLy8gYmFzZWQgb24ganNpaS1wYWNtYWsgcGFja2FnZSBuYW1pbmcgY29udmVudGlvbnMuXG4gICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9qc2lpL2Jsb2IvYjMyOTY3MGJmOWVjMjIyZmFkNWZjMGQ2MTRkY2RkZDVkYWNhN2FmNS9wYWNrYWdlcy9qc2lpLXBhY21hay9saWIvdGFyZ2V0cy9qYXZhLnRzI0wzMTUwXG4gICAgICBjb25zdCBzdWJtb2R1bGVKYXZhUGFja2FnZSA9IGphdmFQYWNrYWdlID8/IGAke3BhcmVudEZxbn0uJHtDYXNlLnNuYWtlKG1vZHVsZUxpa2UubmFtZSl9YDtcblxuICAgICAgLy8gZm9yIHNvbWUgbW9kdWxlcywgdGhlIHBhcmVudCBtb2R1bGUncyBKYXZhIHBhY2thZ2UgaXMgYSBwcmVmaXggb2ZcbiAgICAgIC8vIHRoZSBzdWJtb2R1bGUncyBKYXZhIHBhY2thZ2UsIGUuZy5cbiAgICAgIC8vIHsgbmFtZTogXCJzb2Z0d2FyZS5hbWF6b24uYXdzY2RrXCIsIHN1Ym1vZHVsZTogXCJzb2Z0d2FyZS5hbWF6b24uYXdzY2RrLnNlcnZpY2VzLmVjclwiIH1cbiAgICAgIC8vXG4gICAgICAvLyBidXQgaXQncyBwb3NzaWJsZSB0aGUgbmFtZXMgZGlmZmVyLCBmb3IgZXhhbXBsZSBpbiBhd3MtY2RrLWxpYjpcbiAgICAgIC8vIHsgbmFtZTogXCJzb2Z0d2FyZS5hbWF6b24uYXdzY2RrLmNvcmVcIiwgc3VibW9kdWxlOiBcInNvZnR3YXJlLmFtYXpvbi5hd3NjZGsuc2VydmljZXMuZWNyXCIgfVxuICAgICAgcmV0dXJuIHsgbmFtZTogcGFyZW50RnFuLCBzdWJtb2R1bGU6IHN1Ym1vZHVsZUphdmFQYWNrYWdlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbmFtZTogamF2YVBhY2thZ2UgfTtcbiAgfVxuXG4gIHB1YmxpYyB0eXBlKHR5cGU6IHJlZmxlY3QuVHlwZSk6IHRyYW5zcGlsZS5UcmFuc3BpbGVkVHlwZSB7XG4gICAgY29uc3Qgc3VibW9kdWxlID0gdGhpcy5maW5kU3VibW9kdWxlKHR5cGUpO1xuICAgIGNvbnN0IG1vZHVsZUxpa2UgPSB0aGlzLm1vZHVsZUxpa2Uoc3VibW9kdWxlID8gc3VibW9kdWxlIDogdHlwZS5hc3NlbWJseSk7XG5cbiAgICBjb25zdCBmcW4gPSBbXTtcblxuICAgIGxldCBuYW1lc3BhY2UgPSB0eXBlLm5hbWVzcGFjZTtcbiAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICBpZiAoc3VibW9kdWxlICYmIG1vZHVsZUxpa2Uuc3VibW9kdWxlKSB7XG4gICAgICAgIC8vIGlmIHRoZSB0eXBlIGlzIGluIGEgc3VibW9kdWxlLCBzdWJtb2R1bGUubmFtZSBpcyBhIHN1YnN0cmluZyBvZiB0aGUgbmFtZXNwYWNlXG4gICAgICAgIC8vIHNvIHdlIHVwZGF0ZSB0aGF0IHBhcnQgd2l0aCB0aGUgbGFuZ3VhZ2Utc3BlY2lmaWMgc3VibW9kdWxlIHN0cmluZ1xuICAgICAgICBmcW4ucHVzaChuYW1lc3BhY2UucmVwbGFjZShzdWJtb2R1bGUubmFtZSwgbW9kdWxlTGlrZS5zdWJtb2R1bGUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZxbi5wdXNoKG1vZHVsZUxpa2UubmFtZSk7XG4gICAgICAgIGZxbi5wdXNoKG5hbWVzcGFjZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZxbi5wdXNoKG1vZHVsZUxpa2UubmFtZSk7XG4gICAgfVxuICAgIGZxbi5wdXNoKHR5cGUubmFtZSk7XG5cbiAgICByZXR1cm4gbmV3IHRyYW5zcGlsZS5UcmFuc3BpbGVkVHlwZSh7XG4gICAgICBmcW46IGZxbi5qb2luKCcuJyksXG4gICAgICBuYW1lOiB0eXBlLm5hbWUsXG4gICAgICBuYW1lc3BhY2U6IG5hbWVzcGFjZSxcbiAgICAgIG1vZHVsZTogbW9kdWxlTGlrZS5uYW1lLFxuICAgICAgc3VibW9kdWxlOiBtb2R1bGVMaWtlLnN1Ym1vZHVsZSxcbiAgICAgIHN1Ym1vZHVsZVBhdGg6IHN1Ym1vZHVsZVBhdGgoc3VibW9kdWxlKSxcbiAgICAgIHNvdXJjZTogdHlwZSxcbiAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmd1YWdlLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNhbGxhYmxlKGNhbGxhYmxlOiByZWZsZWN0LkNhbGxhYmxlKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRDYWxsYWJsZSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZShjYWxsYWJsZS5wYXJlbnRUeXBlKTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBjYWxsYWJsZS5wYXJhbWV0ZXJzLnNvcnQodGhpcy5vcHRpb25hbGl0eUNvbXBhcmUpO1xuXG4gICAgY29uc3QgcmVxdWlyZWRQYXJhbXMgPSBwYXJhbWV0ZXJzLmZpbHRlcigocCkgPT4gIXAub3B0aW9uYWwpO1xuICAgIGNvbnN0IG9wdGlvbmFsUGFyYW1zID0gcGFyYW1ldGVycy5maWx0ZXIoKHApID0+IHAub3B0aW9uYWwpO1xuXG4gICAgY29uc3QgbmFtZSA9IGNhbGxhYmxlLm5hbWU7XG5cbiAgICAvLyBzaW11bGF0ZSBKYXZhIG1ldGhvZCBvdmVybG9hZGluZ1xuICAgIGNvbnN0IGlucHV0TGlzdHMgPSBwcmVmaXhBcnJheXMob3B0aW9uYWxQYXJhbXMpLm1hcCgob3B0aW9uYWxzKSA9PiB7XG4gICAgICByZXR1cm4gWy4uLnJlcXVpcmVkUGFyYW1zLCAuLi5vcHRpb25hbHNdLm1hcCgocCkgPT4gdGhpcy5mb3JtYXRQYXJhbWV0ZXIodGhpcy5wYXJhbWV0ZXIocCkpKTtcbiAgICB9KTtcblxuICAgIGxldCByZXR1cm5UeXBlOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlZmxlY3QuSW5pdGlhbGl6ZXIuaXNJbml0aWFsaXplcihjYWxsYWJsZSkpIHtcbiAgICAgIHJldHVyblR5cGUgPSB0aGlzLnR5cGVSZWZlcmVuY2UoY2FsbGFibGUucGFyZW50VHlwZS5yZWZlcmVuY2UpO1xuICAgIH0gZWxzZSBpZiAocmVmbGVjdC5NZXRob2QuaXNNZXRob2QoY2FsbGFibGUpKSB7XG4gICAgICByZXR1cm5UeXBlID0gdGhpcy50eXBlUmVmZXJlbmNlKGNhbGxhYmxlLnJldHVybnMudHlwZSk7XG4gICAgfVxuICAgIGNvbnN0IHJldHVybnMgPSByZXR1cm5UeXBlPy50b1N0cmluZyh7XG4gICAgICB0eXBlRm9ybWF0dGVyOiAodCkgPT4gdC5uYW1lLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc2lnbmF0dXJlcyA9IGlucHV0TGlzdHMubWFwKChpbnB1dHMpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdFNpZ25hdHVyZShuYW1lLCBpbnB1dHMsIHJldHVybnMpO1xuICAgIH0pO1xuXG4gICAgbGV0IGludm9jYXRpb25zO1xuXG4gICAgaWYgKHRoaXMuaXNDbGFzc0J1aWxkZXJHZW5lcmF0ZWQoY2FsbGFibGUpKSB7XG4gICAgICBjb25zdCBzdHJ1Y3QgPSB0aGlzLmV4dHJhY3RGaXJzdFN0cnVjdChwYXJhbWV0ZXJzKTtcblxuICAgICAgLy8gcmVuZGVyIHVzaW5nIEphdmEgYnVpbGRlciBzeW50YXggKHNob3cgbm8gb3ZlcmxvYWRzKVxuICAgICAgaW52b2NhdGlvbnMgPSBbdGhpcy5mb3JtYXRDbGFzc0J1aWxkZXIodHlwZSwgcGFyYW1ldGVycywgc3RydWN0KV07XG5cbiAgICAgIC8vIGZsYXR0ZW4gb3V0IHRoZSBwYXJhbWV0ZXJzIHNvIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSB0byBqdW1wIGJldHdlZW5cbiAgICAgIC8vIGRvY3Mgb2YgRm9vIGFuZCBGb29Qcm9wc1xuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBzdHJ1Y3QuYWxsUHJvcGVydGllcykge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXIgPSBwcm9wZXJ0eVRvUGFyYW1ldGVyKGNhbGxhYmxlLCBwcm9wZXJ0eSk7XG4gICAgICAgIHBhcmFtZXRlcnMucHVzaChwYXJhbWV0ZXIpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbnZvY2F0aW9ucyA9IHJlZmxlY3QuSW5pdGlhbGl6ZXIuaXNJbml0aWFsaXplcihjYWxsYWJsZSlcbiAgICAgICAgLy8gcmVuZGVyIHdpdGggYG5ldyBDbGFzc2Agc3ludGF4IChzaG93aW5nIGFsbCBjb25zdHJ1Y3RvciBvdmVybG9hZHMpXG4gICAgICAgID8gaW5wdXRMaXN0cy5tYXAoKGlucHV0cykgPT4gdGhpcy5mb3JtYXRDbGFzc0luaXRpYWxpemF0aW9uKHR5cGUsIGlucHV0cykpXG4gICAgICAgIC8vIHJlbmRlciBpbnZvY2F0aW9uIGFzIG1ldGhvZCBjYWxscyAoc2hvd2luZyBhbGwgbWV0aG9kIG92ZXJsb2FkcylcbiAgICAgICAgOiBpbnB1dExpc3RzLm1hcCgoaW5wdXRzKSA9PiB0aGlzLmZvcm1hdEludm9jYXRpb24odHlwZSwgaW5wdXRzLCBuYW1lKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWUsXG4gICAgICBwYXJlbnRUeXBlOiB0eXBlLFxuICAgICAgaW1wb3J0OiB0aGlzLmZvcm1hdEltcG9ydCh0eXBlKSxcbiAgICAgIHBhcmFtZXRlcnMsXG4gICAgICBzaWduYXR1cmVzLFxuICAgICAgaW52b2NhdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBjbGFzcyhrbGFzczogcmVmbGVjdC5DbGFzc1R5cGUpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZENsYXNzIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZToga2xhc3MubmFtZSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZShrbGFzcyksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdHJ1Y3Qoc3RydWN0OiByZWZsZWN0LkludGVyZmFjZVR5cGUpOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFN0cnVjdCB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZShzdHJ1Y3QpO1xuICAgIGNvbnN0IGluZGVudCA9ICcgJy5yZXBlYXQoNCk7XG4gICAgY29uc3QgaW5wdXRzID0gc3RydWN0LmFsbFByb3BlcnRpZXMubWFwKChwKSA9PlxuICAgICAgdGhpcy5mb3JtYXRCdWlsZGVyTWV0aG9kKHRoaXMucHJvcGVydHkocCksIGluZGVudCksXG4gICAgKS5mbGF0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBuYW1lOiBzdHJ1Y3QubmFtZSxcbiAgICAgIGltcG9ydDogdGhpcy5mb3JtYXRJbXBvcnQodHlwZSksXG4gICAgICBpbml0aWFsaXphdGlvbjogdGhpcy5mb3JtYXRTdHJ1Y3RCdWlsZGVyKHR5cGUsIGlucHV0cyksXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBpbnRlcmZhY2UoXG4gICAgaWZhY2U6IHJlZmxlY3QuSW50ZXJmYWNlVHlwZSxcbiAgKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRJbnRlcmZhY2Uge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBpZmFjZS5uYW1lLFxuICAgICAgdHlwZTogdGhpcy50eXBlKGlmYWNlKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHBhcmFtZXRlcihcbiAgICBwYXJhbWV0ZXI6IHJlZmxlY3QuUGFyYW1ldGVyLFxuICApOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFBhcmFtZXRlciB7XG4gICAgY29uc3QgdHlwZVJlZiA9IHRoaXMudHlwZVJlZmVyZW5jZShwYXJhbWV0ZXIudHlwZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHBhcmFtZXRlci5uYW1lLFxuICAgICAgcGFyZW50VHlwZTogdGhpcy50eXBlKHBhcmFtZXRlci5wYXJlbnRUeXBlKSxcbiAgICAgIHR5cGVSZWZlcmVuY2U6IHR5cGVSZWYsXG4gICAgICBvcHRpb25hbDogcGFyYW1ldGVyLm9wdGlvbmFsLFxuICAgICAgdmFyaWFkaWM6IHBhcmFtZXRlci52YXJpYWRpYyxcbiAgICAgIGRlY2xhcmF0aW9uOiB0aGlzLmZvcm1hdFByb3BlcnR5KHBhcmFtZXRlci5uYW1lLCB0eXBlUmVmKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHByb3BlcnR5KHByb3BlcnR5OiByZWZsZWN0LlByb3BlcnR5KTogdHJhbnNwaWxlLlRyYW5zcGlsZWRQcm9wZXJ0eSB7XG4gICAgY29uc3QgdHlwZVJlZiA9IHRoaXMudHlwZVJlZmVyZW5jZShwcm9wZXJ0eS50eXBlKTtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogcHJvcGVydHkubmFtZSxcbiAgICAgIHBhcmVudFR5cGU6IHRoaXMudHlwZShwcm9wZXJ0eS5wYXJlbnRUeXBlKSxcbiAgICAgIHR5cGVSZWZlcmVuY2U6IHR5cGVSZWYsXG4gICAgICBvcHRpb25hbDogcHJvcGVydHkub3B0aW9uYWwsXG4gICAgICBkZWNsYXJhdGlvbjogdGhpcy5mb3JtYXRQcm9wZXJ0eShwcm9wZXJ0eS5uYW1lLCB0eXBlUmVmKSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGVudW0oZW51OiByZWZsZWN0LkVudW1UeXBlKTogdHJhbnNwaWxlLlRyYW5zcGlsZWRFbnVtIHtcbiAgICByZXR1cm4ge1xuICAgICAgZnFuOiB0aGlzLnR5cGUoZW51KS5mcW4sXG4gICAgICBuYW1lOiBlbnUubmFtZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGVudW1NZW1iZXIoZW06IHJlZmxlY3QuRW51bU1lbWJlcik6IHRyYW5zcGlsZS5UcmFuc3BpbGVkRW51bU1lbWJlciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZxbjogYCR7dGhpcy5lbnVtKGVtLmVudW1UeXBlKS5mcW59LiR7ZW0ubmFtZX1gLFxuICAgICAgbmFtZTogZW0ubmFtZSxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHVuaW9uT2YodHlwZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZXMuam9pbignIE9SICcpO1xuICB9XG5cbiAgcHVibGljIGxpc3RPZih0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgamF2YS51dGlsLkxpc3Q8JHt0eXBlfT5gO1xuICB9XG5cbiAgcHVibGljIHZhcmlhZGljT2YodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dHlwZX0uLi5gO1xuICB9XG5cbiAgcHVibGljIG1hcE9mKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBqYXZhLnV0aWwuTWFwPGphdmEubGFuZy5TdHJpbmcsICR7dHlwZX0+YDtcbiAgfVxuXG4gIHB1YmxpYyBhbnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ2phdmEubGFuZy5PYmplY3QnO1xuICB9XG5cbiAgcHVibGljIHZvaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ3ZvaWQnO1xuICB9XG5cbiAgcHVibGljIHN0cigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnamF2YS5sYW5nLlN0cmluZyc7XG4gIH1cblxuICBwdWJsaWMgbnVtYmVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdqYXZhLmxhbmcuTnVtYmVyJztcbiAgfVxuXG4gIHB1YmxpYyBib29sZWFuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdqYXZhLmxhbmcuQm9vbGVhbic7XG4gIH1cblxuICBwdWJsaWMganNvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiAnY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuT2JqZWN0Tm9kZSc7XG4gIH1cblxuICBwdWJsaWMgZGF0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnamF2YS50aW1lLkluc3RhbnQnO1xuICB9XG5cbiAgcHVibGljIHJlYWRtZShyZWFkbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlYWRtZTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0SW1wb3J0KHR5cGU6IHRyYW5zcGlsZS5UcmFuc3BpbGVkVHlwZSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBpbXBvcnQgJHt0eXBlLmZxbn07YDtcbiAgfTtcblxuICBwcml2YXRlIGZvcm1hdFBhcmFtZXRlcihcbiAgICB0cmFuc3BpbGVkOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFBhcmFtZXRlcixcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCB0ZiA9IHRyYW5zcGlsZWQudHlwZVJlZmVyZW5jZS50b1N0cmluZyh7XG4gICAgICB0eXBlRm9ybWF0dGVyOiAodCkgPT4gdC5uYW1lLFxuICAgIH0pO1xuXG4gICAgaWYgKHRyYW5zcGlsZWQudmFyaWFkaWMpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLnZhcmlhZGljT2YodGYpfSAke3RyYW5zcGlsZWQubmFtZX1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0Zn0gJHt0cmFuc3BpbGVkLm5hbWV9YDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0SW5wdXRzKGlucHV0czogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBpbnB1dHMuam9pbignLCAnKTtcbiAgfTtcblxuICBwcml2YXRlIGZvcm1hdFN0cnVjdEJ1aWxkZXIodHlwZTogdHJhbnNwaWxlLlRyYW5zcGlsZWRUeXBlLCBtZXRob2RzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgYnVpbGRlciA9IGAke3R5cGUubmFtZX0uYnVpbGRlcigpYDtcbiAgICByZXR1cm4gW1xuICAgICAgYnVpbGRlcixcbiAgICAgIC4uLm1ldGhvZHMsXG4gICAgICAnICAgIC5idWlsZCgpOycsXG4gICAgXS5qb2luKCdcXG4nKTtcbiAgfTtcblxuICBwcml2YXRlIGZvcm1hdENsYXNzSW5pdGlhbGl6YXRpb24oXG4gICAgdHlwZTogdHJhbnNwaWxlLlRyYW5zcGlsZWRUeXBlLFxuICAgIGlucHV0czogc3RyaW5nW10sXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBuZXcgJHt0eXBlLm5hbWV9KCR7dGhpcy5mb3JtYXRJbnB1dHMoaW5wdXRzKX0pO2A7XG4gIH07XG5cbiAgcHJpdmF0ZSBmb3JtYXRDbGFzc0J1aWxkZXIoXG4gICAgdHlwZTogdHJhbnNwaWxlLlRyYW5zcGlsZWRUeXBlLFxuICAgIHBhcmFtZXRlcnM6IHJlZmxlY3QuUGFyYW1ldGVyW10sXG4gICAgc3RydWN0OiByZWZsZWN0LkludGVyZmFjZVR5cGUsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgY3JlYXRlQXJncyA9IHRoaXMuZm9ybWF0SW5wdXRzKHBhcmFtZXRlcnMubWFwKChwKSA9PiB0aGlzLmZvcm1hdFBhcmFtZXRlcih0aGlzLnBhcmFtZXRlcihwKSkpKTtcbiAgICBjb25zdCBpbmRlbnQgPSAnICcucmVwZWF0KDQpO1xuICAgIGNvbnN0IG1ldGhvZHM6IHN0cmluZ1tdID0gc3RydWN0LmFsbFByb3BlcnRpZXMubWFwKChwKSA9PlxuICAgICAgdGhpcy5mb3JtYXRCdWlsZGVyTWV0aG9kKHRoaXMucHJvcGVydHkocCksIGluZGVudCksXG4gICAgKS5mbGF0KCk7XG4gICAgcmV0dXJuIFtcbiAgICAgIGAke3R5cGUubmFtZX0uQnVpbGRlci5jcmVhdGUoJHtjcmVhdGVBcmdzfSlgLFxuICAgICAgLi4ubWV0aG9kcyxcbiAgICAgIGAke2luZGVudH0uYnVpbGQoKTtgLFxuICAgIF0uam9pbignXFxuJyk7XG4gIH07XG5cblxuICBwcml2YXRlIGZvcm1hdFNpZ25hdHVyZShuYW1lOiBzdHJpbmcsIGlucHV0czogc3RyaW5nW10sIHJldHVybnM/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYHB1YmxpYyAke3JldHVybnMgPyByZXR1cm5zICsgJyAnIDogJyd9JHtuYW1lfSgke3RoaXMuZm9ybWF0SW5wdXRzKGlucHV0cyl9KWA7XG4gIH07XG5cbiAgcHJpdmF0ZSBmb3JtYXRCdWlsZGVyTWV0aG9kKFxuICAgIHRyYW5zcGlsZWQ6IHRyYW5zcGlsZS5UcmFuc3BpbGVkUHJvcGVydHksXG4gICAgaW5kZW50OiBzdHJpbmcsXG4gICk6IHN0cmluZ1tdIHtcbiAgICBpZiAodHJhbnNwaWxlZC5vcHRpb25hbCkgaW5kZW50ID0gJy8vJyArIGluZGVudC5zbGljZSgyKTtcbiAgICBjb25zdCBsb3dlckNhbWVsID0gdG9DYW1lbENhc2UodHJhbnNwaWxlZC5uYW1lKTtcbiAgICBjb25zdCBiYXNlID0gYCR7aW5kZW50fS4ke2xvd2VyQ2FtZWx9YDtcbiAgICBjb25zdCB0ZiA9IHRyYW5zcGlsZWQudHlwZVJlZmVyZW5jZS50b1N0cmluZyh7XG4gICAgICB0eXBlRm9ybWF0dGVyOiAodCkgPT4gdC5uYW1lLFxuICAgIH0pO1xuICAgIC8vIGFsbG93IHJlbmRlcmluZyB1bmlvbiB0eXBlcyBhcyBtdWx0aXBsZSBvdmVycmlkZWQgYnVpbGRlciBtZXRob2RzXG4gICAgaWYgKHRmLmluY2x1ZGVzKCcgT1IgJykpIHtcbiAgICAgIGNvbnN0IGNob2ljZXMgPSB0Zi5zcGxpdCgnIE9SICcpO1xuICAgICAgcmV0dXJuIGNob2ljZXMubWFwKCh0eXApID0+IGAke2Jhc2V9KCR7dHlwfSlgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtgJHtiYXNlfSgke3RmfSlgXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEludm9jYXRpb24oXG4gICAgdHlwZTogdHJhbnNwaWxlLlRyYW5zcGlsZWRUeXBlLFxuICAgIGlucHV0czogc3RyaW5nW10sXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICk6IHN0cmluZyB7XG4gICAgbGV0IHRhcmdldCA9IHR5cGUubmFtZTtcbiAgICBpZiAobWV0aG9kKSB7XG4gICAgICB0YXJnZXQgPSBgJHt0YXJnZXR9LiR7bWV0aG9kfWA7XG4gICAgfVxuICAgIHJldHVybiBgJHt0YXJnZXR9KCR7dGhpcy5mb3JtYXRJbnB1dHMoaW5wdXRzKX0pYDtcbiAgfTtcblxuICBwcml2YXRlIGlzU3RydWN0KHA6IHJlZmxlY3QuUGFyYW1ldGVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHAudHlwZS5mcW4gPyBwLnN5c3RlbS5maW5kRnFuKHAudHlwZS5mcW4pLmlzRGF0YVR5cGUoKSA6IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0NsYXNzQnVpbGRlckdlbmVyYXRlZChcbiAgICBjYWxsYWJsZTogcmVmbGVjdC5DYWxsYWJsZSxcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKGNhbGxhYmxlLmtpbmQgIT09IHJlZmxlY3QuTWVtYmVyS2luZC5Jbml0aWFsaXplcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IHJlZmxlY3QuUGFyYW1ldGVyW10gPSBjYWxsYWJsZS5wYXJhbWV0ZXJzLnNvcnQodGhpcy5vcHRpb25hbGl0eUNvbXBhcmUpO1xuICAgIGNvbnN0IGZpcnN0U3RydWN0ID0gcGFyYW1ldGVycy5maW5kKChwYXJhbSkgPT4gdGhpcy5pc1N0cnVjdChwYXJhbSkpO1xuXG4gICAgLy8gbm8gYnVpbGRlciBpcyBnZW5lcmF0ZWQgaWYgdGhlcmUgaXMgbm8gc3RydWN0IHBhcmFtZXRlclxuICAgIGlmICghZmlyc3RTdHJ1Y3QpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIGZpcnN0IHN0cnVjdCBvdXQgb2YgYSBsaXN0IG9mIHBhcmFtZXRlcnMgKGFuZCB0aHJvd3NcbiAgICogaWYgdGhlcmUgaXMgbm9uZSksIHJlbW92aW5nIGl0IGZyb20gdGhlIGFycmF5LlxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0Rmlyc3RTdHJ1Y3QoXG4gICAgcGFyYW1ldGVyczogcmVmbGVjdC5QYXJhbWV0ZXJbXSxcbiAgKTogcmVmbGVjdC5JbnRlcmZhY2VUeXBlIHtcbiAgICBjb25zdCBmaXJzdFN0cnVjdCA9IHBhcmFtZXRlcnMuZmluZCgocGFyYW0pID0+IHRoaXMuaXNTdHJ1Y3QocGFyYW0pKTtcbiAgICBpZiAoIWZpcnN0U3RydWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHN0cnVjdCBmb3VuZCBpbiBwYXJhbWV0ZXIgbGlzdC4nKTtcbiAgICB9XG4gICAgY29uc3Qgc3RydWN0ID0gZmlyc3RTdHJ1Y3QucGFyZW50VHlwZS5zeXN0ZW0uZmluZEludGVyZmFjZShmaXJzdFN0cnVjdC50eXBlLmZxbiEpO1xuICAgIHBhcmFtZXRlcnMuc3BsaWNlKHBhcmFtZXRlcnMuaW5kZXhPZihmaXJzdFN0cnVjdCksIDEpO1xuICAgIHJldHVybiBzdHJ1Y3Q7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFByb3BlcnR5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0eXBlUmVmZXJlbmNlOiB0cmFuc3BpbGUuVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgdGYgPSB0eXBlUmVmZXJlbmNlLnRvU3RyaW5nKHtcbiAgICAgIHR5cGVGb3JtYXR0ZXI6ICh0KSA9PiB0Lm5hbWUsXG4gICAgfSk7XG4gICAgaWYgKHRmLmluY2x1ZGVzKCcgT1IgJykpIHtcbiAgICAgIHJldHVybiBgcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0JHt0b1VwcGVyQ2FtZWxDYXNlKG5hbWUpfSgpO2A7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgcHVibGljICR7dGZ9IGdldCR7dG9VcHBlckNhbWVsQ2FzZShuYW1lKX0oKTtgO1xuICAgIH1cbiAgfVxufVxuIl19
;