jsii-docgen
Version:
generates api docs for jsii modules
428 lines • 64.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TranspileBase = exports.TranspiledTypeReference = exports.TranspiledType = exports.UnsupportedLanguageError = exports.Language = void 0;
exports.submoduleRelName = submoduleRelName;
const schema_1 = require("../schema");
/**
* Supported languages to generate documentation in.
*/
class Language {
/**
* Transform a literal string to the `Language` object.
*
* Throws an `UnsupportedLanguageError` if the language is not supported.
*/
static fromString(lang) {
switch (lang) {
case Language.TYPESCRIPT.name:
case Language.TYPESCRIPT.targetName:
return Language.TYPESCRIPT;
case Language.PYTHON.name:
case Language.PYTHON.targetName:
return Language.PYTHON;
case Language.JAVA.name:
case Language.JAVA.targetName:
return Language.JAVA;
case Language.CSHARP.name:
case Language.CSHARP.targetName:
return Language.CSHARP;
case Language.GO.name:
case Language.GO.targetName:
return Language.GO;
default:
throw new UnsupportedLanguageError(lang, Language.values());
}
}
static values() {
return [Language.TYPESCRIPT, Language.PYTHON, Language.JAVA, Language.CSHARP, Language.GO];
}
constructor({ name, targetName = name, validator }) {
this.name = name;
this.targetName = targetName;
this.validator = validator;
}
isValidConfiguration(config) {
// TypeScript does not need configuration, all other languages do
if (config == null) {
return this === Language.TYPESCRIPT;
}
return this.validator(config);
}
toString() {
return this.name;
}
}
exports.Language = Language;
/**
* TypeScript.
*/
Language.TYPESCRIPT = new Language({ name: 'typescript', validator: () => true });
/**
* Python.
*/
Language.PYTHON = new Language({ name: 'python', validator: validatePythonConfig });
/**
* Java.
*/
Language.JAVA = new Language({ name: 'java', validator: validateJavaConfig });
/**
* C#
*/
Language.CSHARP = new Language({ name: 'csharp', targetName: 'dotnet', validator: validateDotNetConfig });
/**
*
* Go
*/
Language.GO = new Language({ name: 'go', targetName: 'go', validator: validateGoConfig });
function validateDotNetConfig(config) {
// See: https://aws.github.io/jsii/user-guides/lib-author/configuration/targets/dotnet/
return typeof config.namespace === 'string' && typeof config.packageId === 'string';
}
function validateJavaConfig(config) {
var _a, _b;
// See: https://aws.github.io/jsii/user-guides/lib-author/configuration/targets/java/
return typeof config.package === 'string' && typeof ((_a = config.maven) === null || _a === void 0 ? void 0 : _a.groupId) === 'string' && typeof ((_b = config.maven) === null || _b === void 0 ? void 0 : _b.artifactId) === 'string';
}
function validatePythonConfig(config) {
// See: https://aws.github.io/jsii/user-guides/lib-author/configuration/targets/python/
return typeof config.module === 'string' && typeof config.distName === 'string';
}
function validateGoConfig(config) {
// See: https://aws.github.io/jsii/user-guides/lib-author/configuration/targets/go/
return typeof config.moduleName === 'string';
}
class UnsupportedLanguageError extends Error {
constructor(lang, supported) {
super(`Unsupported language: ${lang}. Supported languages are: [${supported}]`);
}
}
exports.UnsupportedLanguageError = UnsupportedLanguageError;
/**
* Outcome of transpiling a generic jsii type.
*/
class TranspiledType {
constructor(options) {
this.source = options.source;
this.language = options.language;
this.fqn = options.fqn;
this.name = options.name;
this.namespace = options.namespace;
this.module = options.module;
this.submodule = options.submodule;
this.submodulePath = options.submodulePath;
}
toJson() {
return (0, schema_1.filterUndefined)({
fqn: this.fqn,
displayName: this.name,
id: this.source.fqn,
packageName: this.source.assembly.name,
packageVersion: this.source.assembly.version,
submodule: this.submodulePath,
});
}
}
exports.TranspiledType = TranspiledType;
/**
* Outcome of transpiling a jsii type reference.
*/
class TranspiledTypeReference {
/**
* Create a type reference that represents a primitive.
*/
static primitive(transpile, ref, primitive) {
return new TranspiledTypeReference(transpile, ref, primitive);
}
/**
* Create a type reference that represents any type.
*/
static any(transpile, ref) {
return new TranspiledTypeReference(transpile, ref, undefined, true);
}
/**
* Create a type reference that represents the void (return) type.
*/
static void(transpile, ref) {
return new TranspiledTypeReference(transpile, ref, undefined, undefined, undefined, undefined, undefined, undefined, true);
}
/**
* Create a type reference that represents a concrete type.
*/
static type(transpile, ref, type) {
return new TranspiledTypeReference(transpile, ref, undefined, undefined, type);
}
/**
* Create a type reference that represents an array of a type reference.
*/
static arrayOfType(transpile, ref, tf) {
return new TranspiledTypeReference(transpile, ref, undefined, undefined, undefined, tf);
}
/**
* Create a type reference that represents a map of a type reference.
*/
static mapOfType(transpile, ref, tf) {
return new TranspiledTypeReference(transpile, ref, undefined, undefined, undefined, undefined, tf);
}
/**
* Create a type reference that represents a union of a type references.
*/
static unionOfTypes(transpile, ref, tfs) {
return new TranspiledTypeReference(transpile, ref, undefined, undefined, undefined, undefined, undefined, tfs);
}
/**
* Create a type reference that represents an intersection a type references.
*/
static intersectionOfTypes(transpile, _ref, tfs) {
return {
toString: (options) => {
const refs = tfs.map((t) => t.toString(options));
return transpile.intersectionOf(refs);
},
toJson: () => {
const types = tfs.map((t) => t.toJson());
return {
formattingPattern: transpile.intersectionOf(types.map((t) => t.formattingPattern)),
types,
};
},
};
}
constructor(
/**
* A transpiler
*/
transpile,
/**
* The original type reference.
*/
ref,
/**
* Primitive type ref.
*/
primitive,
/**
* 'Any' type ref
*/
isAny,
/**
* Concrete type.
*/
type,
/**
* Array of ref.
*/
arrayOfType,
/**
* Map of ref.
*/
mapOfType,
/**
* Union of ref.
*/
unionOfTypes,
/**
* 'Void' type ref.
*/
isVoid) {
this.transpile = transpile;
this.ref = ref;
this.primitive = primitive;
this.isAny = isAny;
this.type = type;
this.arrayOfType = arrayOfType;
this.mapOfType = mapOfType;
this.unionOfTypes = unionOfTypes;
this.isVoid = isVoid;
}
toString(options) {
var _a, _b;
const tFormatter = (_a = options === null || options === void 0 ? void 0 : options.typeFormatter) !== null && _a !== void 0 ? _a : ((t) => t.fqn);
const sFormatter = (_b = options === null || options === void 0 ? void 0 : options.stringFormatter) !== null && _b !== void 0 ? _b : ((s) => s);
if (this.primitive) {
return sFormatter(this.primitive);
}
if (this.type) {
return tFormatter(this.type);
}
if (this.isAny) {
return sFormatter(this.transpile.any());
}
if (this.arrayOfType) {
const ref = this.arrayOfType.toString(options);
return this.transpile.listOf(ref);
}
if (this.mapOfType) {
const ref = this.mapOfType.toString(options);
return this.transpile.mapOf(ref);
}
if (this.unionOfTypes) {
const refs = this.unionOfTypes.map((t) => t.toString(options));
return this.transpile.unionOf(refs);
}
if (this.isVoid) {
return sFormatter(this.transpile.void());
}
throw new Error(`Invalid type reference: ${this.ref.toString()}`);
}
toJson() {
if (this.primitive) {
return {
formattingPattern: this.primitive,
};
}
if (this.type) {
if (!this.ref.fqn) {
throw new Error(`Original type reference for ${this.type.fqn} does not have a fqn.`);
}
// If we are running in a test, report a fake stable version since types
// may belong to dependency packages, which could be specified with caret
// dependencies - this means the packageVersion of a type like
// `construct.Construct` will be set to whichever version is installed.
// This is okay in practice, but makes snapshot tests inconsistent.
const IS_TEST_RUN = process.env.NODE_ENV === 'test';
const packageVersion = IS_TEST_RUN ? '99.99.99' : this.type.source.assembly.version;
return {
formattingPattern: '%',
types: [
(0, schema_1.filterUndefined)({
id: this.ref.fqn,
displayName: this.type.name,
fqn: this.type.fqn,
packageName: this.type.source.assembly.name,
packageVersion,
submodule: this.type.submodulePath,
}),
],
};
}
if (this.isAny) {
return {
formattingPattern: this.transpile.any(),
};
}
if (this.arrayOfType) {
return {
formattingPattern: this.transpile.listOf('%'),
types: [this.arrayOfType.toJson()],
};
}
if (this.mapOfType) {
return {
formattingPattern: this.transpile.mapOf('%'),
types: [this.mapOfType.toJson()],
};
}
if (this.unionOfTypes) {
const inner = Array(this.unionOfTypes.length).fill('%');
return {
formattingPattern: this.transpile.unionOf(inner),
types: this.unionOfTypes.map((t) => t.toJson()),
};
}
throw new Error(`Invalid type reference: ${this.ref.toString()}`);
}
}
exports.TranspiledTypeReference = TranspiledTypeReference;
/**
* Common functionality between different transpilers.
*/
class TranspileBase {
constructor(language) {
this.language = language;
this.submodulesCache = new Map();
}
typeReference(ref) {
if (ref.type) {
const transpiled = this.type(ref.type);
return TranspiledTypeReference.type(this, ref, transpiled);
}
if (ref.unionOfTypes) {
const transpiled = ref.unionOfTypes.map((t) => this.typeReference(t));
return TranspiledTypeReference.unionOfTypes(this, ref, transpiled);
}
if (ref.intersectionOfTypes) {
const transpiled = ref.intersectionOfTypes.map((t) => this.typeReference(t));
return TranspiledTypeReference.intersectionOfTypes(this, ref, transpiled);
}
if (ref.arrayOfType) {
const transpiled = this.typeReference(ref.arrayOfType);
return TranspiledTypeReference.arrayOfType(this, ref, transpiled);
}
if (ref.mapOfType) {
const transpiled = this.typeReference(ref.mapOfType);
return TranspiledTypeReference.mapOfType(this, ref, transpiled);
}
if (ref.isAny) {
return TranspiledTypeReference.any(this, ref);
}
if (ref.primitive) {
let transpiled;
switch (ref.primitive) {
case 'string':
transpiled = this.str();
break;
case 'boolean':
transpiled = this.boolean();
break;
case 'number':
transpiled = this.number();
break;
case 'date':
transpiled = this.date();
break;
case 'json':
transpiled = this.json();
break;
default:
throw new Error(`Unsupported primitive type '${ref.primitive}'`);
}
return TranspiledTypeReference.primitive(this, ref, transpiled);
}
if (ref.void) {
return TranspiledTypeReference.void(this, ref);
}
throw new Error(`Unsupported type: ${ref.toString()}`);
}
findSubmodule(type) {
if (this.submodulesCache.has(type.fqn)) {
return this.submodulesCache.get(type.fqn);
}
let submodule = undefined;
if (type.namespace) {
// if the type is in a submodule, the submodule name is the first
// part of the namespace. we construct the full submodule fqn and search for it.
const submoduleFqn = `${type.assembly.name}.${type.namespace.split('.')[0]}`;
const submodules = type.assembly.allSubmodules.filter((s) => s.fqn === submoduleFqn);
if (submodules.length > 1) {
// can never happen, but the array data structure forces this handling.
throw new Error(`Found multiple submodules with fqn ${submoduleFqn}`);
}
if (submodules.length === 0) {
submodule = undefined;
}
// type is inside this submodule.
submodule = submodules[0];
}
this.submodulesCache.set(type.fqn, submodule);
return submodule;
}
optionalityCompare(p1, p2) {
if (!p1.optional && p2.optional) {
return -1;
}
if (!p2.optional && p1.optional) {
return 1;
}
return 0;
}
}
exports.TranspileBase = TranspileBase;
/**
* Return the root-relative name for a submodule
*
* Ex: for a submodule `asm.sub1.sub2`, return `sub1.sub2`.
*/
function submoduleRelName(submodule) {
return submodule.fqn.split('.').slice(1).join('.');
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwaWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RvY2dlbi90cmFuc3BpbGUvdHJhbnNwaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQW83QkEsNENBRUM7QUFyN0JELHNDQUFvRTtBQUVwRTs7R0FFRztBQUNILE1BQWEsUUFBUTtJQTJCbkI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBWTtRQUNuQyxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2IsS0FBSyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztZQUM5QixLQUFLLFFBQVEsQ0FBQyxVQUFVLENBQUMsVUFBVTtnQkFDakMsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDO1lBQzdCLEtBQUssUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDMUIsS0FBSyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVU7Z0JBQzdCLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUN6QixLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3hCLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVO2dCQUMzQixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDdkIsS0FBSyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUMxQixLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFDN0IsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ3pCLEtBQUssUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDdEIsS0FBSyxRQUFRLENBQUMsRUFBRSxDQUFDLFVBQVU7Z0JBQ3pCLE9BQU8sUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNyQjtnQkFDRSxNQUFNLElBQUksd0JBQXdCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7SUFDSCxDQUFDO0lB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LGtCQUFrQixDQUMxQixFQUFxQixFQUNyQixFQUFxQjtRQUVyQixJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNaLENBQUM7UUFDRCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEMsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDO1FBQ0QsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0NBQ0Y7QUEvR0Qsc0NBK0dDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLFNBQTRCO0lBQzNELE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0IHsgZmlsdGVyVW5kZWZpbmVkLCBKc2lpRW50aXR5LCBUeXBlU2NoZW1hIH0gZnJvbSAnLi4vc2NoZW1hJztcblxuLyoqXG4gKiBTdXBwb3J0ZWQgbGFuZ3VhZ2VzIHRvIGdlbmVyYXRlIGRvY3VtZW50YXRpb24gaW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBMYW5ndWFnZSB7XG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFU0NSSVBUID0gbmV3IExhbmd1YWdlKHsgbmFtZTogJ3R5cGVzY3JpcHQnLCB2YWxpZGF0b3I6ICgpID0+IHRydWUgfSk7XG5cbiAgLyoqXG4gICAqIFB5dGhvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFlUSE9OID0gbmV3IExhbmd1YWdlKHsgbmFtZTogJ3B5dGhvbicsIHZhbGlkYXRvcjogdmFsaWRhdGVQeXRob25Db25maWcgfSk7XG5cbiAgLyoqXG4gICAqIEphdmEuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEpBVkEgPSBuZXcgTGFuZ3VhZ2UoeyBuYW1lOiAnamF2YScsIHZhbGlkYXRvcjogdmFsaWRhdGVKYXZhQ29uZmlnIH0pO1xuXG4gIC8qKlxuICAgKiBDI1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBDU0hBUlAgPSBuZXcgTGFuZ3VhZ2UoeyBuYW1lOiAnY3NoYXJwJywgdGFyZ2V0TmFtZTogJ2RvdG5ldCcsIHZhbGlkYXRvcjogdmFsaWRhdGVEb3ROZXRDb25maWcgfSk7XG5cbiAgLyoqXG4gICAqXG4gICAqIEdvXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdPID0gbmV3IExhbmd1YWdlKHsgbmFtZTogJ2dvJywgdGFyZ2V0TmFtZTogJ2dvJywgdmFsaWRhdG9yOiB2YWxpZGF0ZUdvQ29uZmlnIH0pO1xuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gYSBsaXRlcmFsIHN0cmluZyB0byB0aGUgYExhbmd1YWdlYCBvYmplY3QuXG4gICAqXG4gICAqIFRocm93cyBhbiBgVW5zdXBwb3J0ZWRMYW5ndWFnZUVycm9yYCBpZiB0aGUgbGFuZ3VhZ2UgaXMgbm90IHN1cHBvcnRlZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyhsYW5nOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKGxhbmcpIHtcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuVFlQRVNDUklQVC5uYW1lOlxuICAgICAgY2FzZSBMYW5ndWFnZS5UWVBFU0NSSVBULnRhcmdldE5hbWU6XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5UWVBFU0NSSVBUO1xuICAgICAgY2FzZSBMYW5ndWFnZS5QWVRIT04ubmFtZTpcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuUFlUSE9OLnRhcmdldE5hbWU6XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5QWVRIT047XG4gICAgICBjYXNlIExhbmd1YWdlLkpBVkEubmFtZTpcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuSkFWQS50YXJnZXROYW1lOlxuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuSkFWQTtcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuQ1NIQVJQLm5hbWU6XG4gICAgICBjYXNlIExhbmd1YWdlLkNTSEFSUC50YXJnZXROYW1lOlxuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuQ1NIQVJQO1xuICAgICAgY2FzZSBMYW5ndWFnZS5HTy5uYW1lOlxuICAgICAgY2FzZSBMYW5ndWFnZS5HTy50YXJnZXROYW1lOlxuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuR087XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRMYW5ndWFnZUVycm9yKGxhbmcsIExhbmd1YWdlLnZhbHVlcygpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHZhbHVlcygpIHtcbiAgICByZXR1cm4gW0xhbmd1YWdlLlRZUEVTQ1JJUFQsIExhbmd1YWdlLlBZVEhPTiwgTGFuZ3VhZ2UuSkFWQSwgTGFuZ3VhZ2UuQ1NIQVJQLCBMYW5ndWFnZS5HT107XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgdGFyZ2V0TmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRvcjogKGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICB7IG5hbWUsIHRhcmdldE5hbWUgPSBuYW1lLCB2YWxpZGF0b3IgfToge1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdGFyZ2V0TmFtZT86IHN0cmluZztcbiAgICAgIHZhbGlkYXRvcjogKGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IGJvb2xlYW47XG4gICAgfSxcbiAgKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnRhcmdldE5hbWUgPSB0YXJnZXROYW1lO1xuICAgIHRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgcHVibGljIGlzVmFsaWRDb25maWd1cmF0aW9uKGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICAvLyBUeXBlU2NyaXB0IGRvZXMgbm90IG5lZWQgY29uZmlndXJhdGlvbiwgYWxsIG90aGVyIGxhbmd1YWdlcyBkb1xuICAgIGlmIChjb25maWcgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMgPT09IExhbmd1YWdlLlRZUEVTQ1JJUFQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdG9yKGNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuXG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRG90TmV0Q29uZmlnKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pik6IGJvb2xlYW4ge1xuICAvLyBTZWU6IGh0dHBzOi8vYXdzLmdpdGh1Yi5pby9qc2lpL3VzZXItZ3VpZGVzL2xpYi1hdXRob3IvY29uZmlndXJhdGlvbi90YXJnZXRzL2RvdG5ldC9cbiAgcmV0dXJuIHR5cGVvZiBjb25maWcubmFtZXNwYWNlID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgY29uZmlnLnBhY2thZ2VJZCA9PT0gJ3N0cmluZyc7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSmF2YUNvbmZpZyhjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBib29sZWFuIHtcbiAgLy8gU2VlOiBodHRwczovL2F3cy5naXRodWIuaW8vanNpaS91c2VyLWd1aWRlcy9saWItYXV0aG9yL2NvbmZpZ3VyYXRpb24vdGFyZ2V0cy9qYXZhL1xuICByZXR1cm4gdHlwZW9mIGNvbmZpZy5wYWNrYWdlID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgY29uZmlnLm1hdmVuPy5ncm91cElkID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgY29uZmlnLm1hdmVuPy5hcnRpZmFjdElkID09PSAnc3RyaW5nJztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQeXRob25Db25maWcoY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYm9vbGVhbiB7XG4gIC8vIFNlZTogaHR0cHM6Ly9hd3MuZ2l0aHViLmlvL2pzaWkvdXNlci1ndWlkZXMvbGliLWF1dGhvci9jb25maWd1cmF0aW9uL3RhcmdldHMvcHl0aG9uL1xuICByZXR1cm4gdHlwZW9mIGNvbmZpZy5tb2R1bGUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBjb25maWcuZGlzdE5hbWUgPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUdvQ29uZmlnKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pik6IGJvb2xlYW4ge1xuICAvLyBTZWU6IGh0dHBzOi8vYXdzLmdpdGh1Yi5pby9qc2lpL3VzZXItZ3VpZGVzL2xpYi1hdXRob3IvY29uZmlndXJhdGlvbi90YXJnZXRzL2dvL1xuICByZXR1cm4gdHlwZW9mIGNvbmZpZy5tb2R1bGVOYW1lID09PSAnc3RyaW5nJztcbn1cblxuZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkTGFuZ3VhZ2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobGFuZzogc3RyaW5nLCBzdXBwb3J0ZWQ6IExhbmd1YWdlW10pIHtcbiAgICBzdXBlcihgVW5zdXBwb3J0ZWQgbGFuZ3VhZ2U6ICR7bGFuZ30uIFN1cHBvcnRlZCBsYW5ndWFnZXMgYXJlOiBbJHtzdXBwb3J0ZWR9XWApO1xuICB9XG59XG5cbi8qKlxuICogT3V0Y29tZSBvZiB0cmFuc3BpbGluZyBhIGpzaWkgc3RydWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcGlsZWRTdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlICh0cmFuc3BpbGVkKSB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogVHJhbnNwaWxlZFR5cGU7XG4gIC8qKlxuICAgKiBUaGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbXBvcnQgc3RhdGVtZW50IG5lZWRlZCBpbiBvcmRlciB0byB1c2UgdGhpcyBzdHJ1Y3QuXG4gICAqL1xuICByZWFkb25seSBpbXBvcnQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEhvdyB0byBpbml0aWFsaXplIHRoaXMgc3RydWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5pdGlhbGl6YXRpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBPdXRjb21lIG9mIHRyYW5zcGlsaW5nIGEganNpaSBjbGFzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BpbGVkQ2xhc3Mge1xuICAvKipcbiAgICogVGhlICh0cmFuc3BpbGVkKSB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogVHJhbnNwaWxlZFR5cGU7XG4gIC8qKlxuICAgKiBUaGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPdXRjb21lIG9mIHRyYW5zcGlsaW5nIGEganNpaSBjYWxsYWJsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BpbGVkQ2FsbGFibGUge1xuICAvKipcbiAgICogVGhlICh0cmFuc3BpbGVkKSBwYXJlbnQgdHlwZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudFR5cGU6IFRyYW5zcGlsZWRUeXBlO1xuICAvKipcbiAgICogSG93IGEgc2lnbmF0dXJlIG9mIHRoZSBjYWxsYWJsZSBsb29rcyBsaWtlLiBJbiBzb21lIGxhbmd1YWdlc1xuICAgKiAobGlrZSBKYXZhKSwgYSBjYWxsYWJsZSBtYXkgYmUgdHJhbnNsaXRlcmF0ZWQgdG8gbXVsdGlwbGUgb3ZlcmxvYWRlZFxuICAgKiBtZXRob2RzLCBzbyB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgc2lnbmF0dXJlc1xuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmF0dXJlczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbXBvcnQgc3RhdGVtZW50IG5lZWRlZCBpbiBvcmRlciB0byB1c2UgdGhpcyBjYWxsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGltcG9ydDogc3RyaW5nO1xuICAvKipcbiAgICogSG93IGEgaW52b2NhdGlvbnMgb2YgdGhpcyBjYWxsYWJsZSBsb29rIGxpa2UuIEluIHNvbWUgbGFuZ3VhZ2VzXG4gICAqIChsaWtlIEphdmEpLCBhIGNhbGxhYmxlIG1heSBiZSB0cmFuc2xpdGVyYXRlZCB0byBtdWx0aXBsZSBvdmVybG9hZGVkXG4gICAqIG1ldGhvZHMsIHNvIHRoZXJlIG1heSBiZSBtdWx0aXBsZSBpbnZvY2F0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGludm9jYXRpb25zOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSBqc2lpIHBhcmFtZXRlcnMgdGhpcyBjYWxsYWJsZSBhY2NlcHRzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1ldGVyczogcmVmbGVjdC5QYXJhbWV0ZXJbXTtcbiAgLyoqXG4gICAqIFRoZSAodHJhbnNwaWxlZCkgcmV0dXJuIHR5cGUgLSB0aGlzIGlzIHVuZGVmaW5lZCBpZiB2b2lkIG9yIGluaXRpYWxpemVyLlxuICAgKi9cbiAgcmVhZG9ubHkgcmV0dXJuVHlwZT86IElUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZTtcbn1cblxuLyoqXG4gKiBPdXRjb21lIG9mIHRyYW5zcGlsaW5nIGEganNpaSBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNwaWxlZFBhcmFtZXRlciBleHRlbmRzIFRyYW5zcGlsZWRQcm9wZXJ0eSB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgcGFyYW1ldGVyIGlzIHZhcmlhZGljLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFyaWFkaWM6IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3V0Y29tZSBvZiB0cmFuc3BpbGluZyBhIGpzaWkgaW50ZXJmYWNlIChub3QgZGF0YSB0eXBlKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BpbGVkSW50ZXJmYWNlIHtcbiAgLyoqXG4gICAqIFRoZSAodHJhbnNwaWxlZCkgdHlwZS5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IFRyYW5zcGlsZWRUeXBlO1xuICAvKipcbiAgICogVGhlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3V0Y29tZSBvZiB0cmFuc3BpbGluZyBhIGdlbmVyaWMganNpaSB0eXBlLlxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNwaWxlZFR5cGUge1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHR5cGUgdGhpcyB3YXMgdHJhbnNsaXRlcmF0ZWQgZnJvbS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzb3VyY2U6IHJlZmxlY3QuVHlwZTtcblxuICAvKipcbiAgICogVGhlIHRyYW5zbGl0ZXJhdGlvbiBsYW5ndWFnZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBsYW5ndWFnZTogTGFuZ3VhZ2U7XG5cbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSBzcGVjaWZpYyBmcW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZnFuOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTaW1wbGUgbmFtZSBvZiB0aGUgdHlwZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOYW1lc3BhY2Ugb2YgdGhlIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGxhbmd1YWdlIHNwZWNpZmljIG1vZHVsZSBuYW1lIHRoZSB0eXBlIGJlbG9uZ3MgdG8uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbW9kdWxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgc3VibW9kdWxlIG5hbWUgdGhlIHR5cGUgYmVsb25ncyB0by5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdWJtb2R1bGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgbmFtZSBvZiB0aGUgc3VibW9kdWxlIHRoZSB0eXBlIGJlbG9uZ3MgdG8uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3VibW9kdWxlUGF0aD86IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczoge1xuICAgIHNvdXJjZTogcmVmbGVjdC5UeXBlO1xuICAgIGxhbmd1YWdlOiBMYW5ndWFnZTtcbiAgICBmcW46IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAgIG1vZHVsZTogc3RyaW5nO1xuICAgIHN1Ym1vZHVsZT86IHN0cmluZztcbiAgICBzdWJtb2R1bGVQYXRoPzogc3RyaW5nO1xuICB9KSB7XG4gICAgdGhpcy5zb3VyY2UgPSBvcHRpb25zLnNvdXJjZTtcbiAgICB0aGlzLmxhbmd1YWdlID0gb3B0aW9ucy5sYW5ndWFnZTtcbiAgICB0aGlzLmZxbiA9IG9wdGlvbnMuZnFuO1xuICAgIHRoaXMubmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgICB0aGlzLm5hbWVzcGFjZSA9IG9wdGlvbnMubmFtZXNwYWNlO1xuICAgIHRoaXMubW9kdWxlID0gb3B0aW9ucy5tb2R1bGU7XG4gICAgdGhpcy5zdWJtb2R1bGUgPSBvcHRpb25zLnN1Ym1vZHVsZTtcbiAgICB0aGlzLnN1Ym1vZHVsZVBhdGggPSBvcHRpb25zLnN1Ym1vZHVsZVBhdGg7XG4gIH1cblxuICB0b0pzb24oKTogSnNpaUVudGl0eSB7XG4gICAgcmV0dXJuIGZpbHRlclVuZGVmaW5lZCh7XG4gICAgICBmcW46IHRoaXMuZnFuLFxuICAgICAgZGlzcGxheU5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGlkOiB0aGlzLnNvdXJjZS5mcW4sXG4gICAgICBwYWNrYWdlTmFtZTogdGhpcy5zb3VyY2UuYXNzZW1ibHkubmFtZSxcbiAgICAgIHBhY2thZ2VWZXJzaW9uOiB0aGlzLnNvdXJjZS5hc3NlbWJseS52ZXJzaW9uLFxuICAgICAgc3VibW9kdWxlOiB0aGlzLnN1Ym1vZHVsZVBhdGgsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBob3cgdG8gcmVuZGVyIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdHlwZSByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2VUb1N0cmluZ09wdGlvbnMge1xuICAvKipcbiAgICogVHlwZSBmb3JtYXR0ZXIuXG4gICAqL1xuICB0eXBlRm9ybWF0dGVyPzogKHR5cGU6IFRyYW5zcGlsZWRUeXBlKSA9PiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTdHJpbmcgZm9ybWF0dGVyLlxuICAgKi9cbiAgc3RyaW5nRm9ybWF0dGVyPzogKHR5cGVOYW1lOiBzdHJpbmcpID0+IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgbWluaW1hbCBmdW5jdGlvbmFsIGludGVyZmFjZSBleHBvc2VkIGJ5IGBUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlIHtcbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIGdpdmVuIHR5cGUgcmVmZXJlbmNlIHRvIGEgc3RyaW5nXG4gICAqL1xuICB0b1N0cmluZyhvcHRpb25zPzogVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2VUb1N0cmluZ09wdGlvbnMpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIGdpdmVuIHR5cGUgcmVmZXJlbmNlIHRvIEpTT05cbiAgICpcbiAgICogVGhlIEpTT04gaXMgc3BlY2lhbGl6ZWQgZm9yIGEgZ2l2ZW4gbGFuZ3VhZ2UuXG4gICAqL1xuICB0b0pzb24oKTogVHlwZVNjaGVtYTtcbn1cblxuLyoqXG4gKiBPdXRjb21lIG9mIHRyYW5zcGlsaW5nIGEganNpaSB0eXBlIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHR5cGUgcmVmZXJlbmNlIHRoYXQgcmVwcmVzZW50cyBhIHByaW1pdGl2ZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcHJpbWl0aXZlKFxuICAgIHRyYW5zcGlsZTogVHJhbnNwaWxlLFxuICAgIHJlZjogcmVmbGVjdC5UeXBlUmVmZXJlbmNlLFxuICAgIHByaW1pdGl2ZTogc3RyaW5nLFxuICApOiBJVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UodHJhbnNwaWxlLCByZWYsIHByaW1pdGl2ZSk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHR5cGUgcmVmZXJlbmNlIHRoYXQgcmVwcmVzZW50cyBhbnkgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYW55KFxuICAgIHRyYW5zcGlsZTogVHJhbnNwaWxlLFxuICAgIHJlZjogcmVmbGVjdC5UeXBlUmVmZXJlbmNlLFxuICApOiBJVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UodHJhbnNwaWxlLCByZWYsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHR5cGUgcmVmZXJlbmNlIHRoYXQgcmVwcmVzZW50cyB0aGUgdm9pZCAocmV0dXJuKSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2b2lkKFxuICAgIHRyYW5zcGlsZTogVHJhbnNwaWxlLFxuICAgIHJlZjogcmVmbGVjdC5UeXBlUmVmZXJlbmNlLFxuICApOiBJVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UoXG4gICAgICB0cmFuc3BpbGUsXG4gICAgICByZWYsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0cnVlLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHR5cGUgcmVmZXJlbmNlIHRoYXQgcmVwcmVzZW50cyBhIGNvbmNyZXRlIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHR5cGUoXG4gICAgdHJhbnNwaWxlOiBUcmFuc3BpbGUsXG4gICAgcmVmOiByZWZsZWN0LlR5cGVSZWZlcmVuY2UsXG4gICAgdHlwZTogVHJhbnNwaWxlZFR5cGUsXG4gICk6IElUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZShcbiAgICAgIHRyYW5zcGlsZSxcbiAgICAgIHJlZixcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHR5cGUsXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgdHlwZSByZWZlcmVuY2UgdGhhdCByZXByZXNlbnRzIGFuIGFycmF5IG9mIGEgdHlwZSByZWZlcmVuY2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFycmF5T2ZUeXBlKFxuICAgIHRyYW5zcGlsZTogVHJhbnNwaWxlLFxuICAgIHJlZjogcmVmbGVjdC5UeXBlUmVmZXJlbmNlLFxuICAgIHRmOiBJVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UsXG4gICk6IElUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZShcbiAgICAgIHRyYW5zcGlsZSxcbiAgICAgIHJlZixcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRmLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHR5cGUgcmVmZXJlbmNlIHRoYXQgcmVwcmVzZW50cyBhIG1hcCBvZiBhIHR5cGUgcmVmZXJlbmNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBtYXBPZlR5cGUoXG4gICAgdHJhbnNwaWxlOiBUcmFuc3BpbGUsXG4gICAgcmVmOiByZWZsZWN0LlR5cGVSZWZlcmVuY2UsXG4gICAgdGY6IElUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZSxcbiAgKTogSVRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlKFxuICAgICAgdHJhbnNwaWxlLFxuICAgICAgcmVmLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGYsXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgdHlwZSByZWZlcmVuY2UgdGhhdCByZXByZXNlbnRzIGEgdW5pb24gb2YgYSB0eXBlIHJlZmVyZW5jZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVuaW9uT2ZUeXBlcyhcbiAgICB0cmFuc3BpbGU6IFRyYW5zcGlsZSxcbiAgICByZWY6IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSxcbiAgICB0ZnM6IElUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZVtdLFxuICApOiBJVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UoXG4gICAgICB0cmFuc3BpbGUsXG4gICAgICByZWYsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0ZnMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0eXBlIHJlZmVyZW5jZSB0aGF0IHJlcHJlc2VudHMgYW4gaW50ZXJzZWN0aW9uIGEgdHlwZSByZWZlcmVuY2VzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpbnRlcnNlY3Rpb25PZlR5cGVzKFxuICAgIHRyYW5zcGlsZTogVHJhbnNwaWxlLFxuICAgIF9yZWY6IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSxcbiAgICB0ZnM6IElUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZVtdLFxuICApOiBJVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2Uge1xuICAgIHJldHVybiB7XG4gICAgICB0b1N0cmluZzogKG9wdGlvbnM/OiBUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZVRvU3RyaW5nT3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCByZWZzID0gdGZzLm1hcCgodCkgPT4gdC50b1N0cmluZyhvcHRpb25zKSk7XG4gICAgICAgIHJldHVybiB0cmFuc3BpbGUuaW50ZXJzZWN0aW9uT2YocmVmcyk7XG4gICAgICB9LFxuICAgICAgdG9Kc29uOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR5cGVzID0gdGZzLm1hcCgodCkgPT4gdC50b0pzb24oKSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZm9ybWF0dGluZ1BhdHRlcm46IHRyYW5zcGlsZS5pbnRlcnNlY3Rpb25PZih0eXBlcy5tYXAoKHQpID0+IHQuZm9ybWF0dGluZ1BhdHRlcm4pKSxcbiAgICAgICAgICB0eXBlcyxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgLyoqXG4gICAgICogQSB0cmFuc3BpbGVyXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc3BpbGU6IFRyYW5zcGlsZSxcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgdHlwZSByZWZlcmVuY2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWY6IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSxcbiAgICAvKipcbiAgICAgKiBQcmltaXRpdmUgdHlwZSByZWYuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmltaXRpdmU/OiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICogJ0FueScgdHlwZSByZWZcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGlzQW55PzogYm9vbGVhbixcbiAgICAvKipcbiAgICAgKiBDb25jcmV0ZSB0eXBlLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHlwZT86IFRyYW5zcGlsZWRUeXBlLFxuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHJlZi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGFycmF5T2ZUeXBlPzogSVRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlLFxuICAgIC8qKlxuICAgICAqIE1hcCBvZiByZWYuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXBPZlR5cGU/OiBJVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UsXG4gICAgLyoqXG4gICAgICogVW5pb24gb2YgcmVmLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdW5pb25PZlR5cGVzPzogSVRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlW10sXG4gICAgLyoqXG4gICAgICogJ1ZvaWQnIHR5cGUgcmVmLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaXNWb2lkPzogYm9vbGVhbixcbiAgKSB7fVxuXG4gIHB1YmxpYyB0b1N0cmluZyhvcHRpb25zPzogVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2VUb1N0cmluZ09wdGlvbnMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRGb3JtYXR0ZXIgPSBvcHRpb25zPy50eXBlRm9ybWF0dGVyID8/ICgodCkgPT4gdC5mcW4pO1xuICAgIGNvbnN0IHNGb3JtYXR0ZXIgPSBvcHRpb25zPy5zdHJpbmdGb3JtYXR0ZXIgPz8gKChzKSA9PiBzKTtcbiAgICBpZiAodGhpcy5wcmltaXRpdmUpIHtcbiAgICAgIHJldHVybiBzRm9ybWF0dGVyKHRoaXMucHJpbWl0aXZlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudHlwZSkge1xuICAgICAgcmV0dXJuIHRGb3JtYXR0ZXIodGhpcy50eXBlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNBbnkpIHtcbiAgICAgIHJldHVybiBzRm9ybWF0dGVyKHRoaXMudHJhbnNwaWxlLmFueSgpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYXJyYXlPZlR5cGUpIHtcbiAgICAgIGNvbnN0IHJlZiA9IHRoaXMuYXJyYXlPZlR5cGUudG9TdHJpbmcob3B0aW9ucyk7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc3BpbGUubGlzdE9mKHJlZik7XG4gICAgfVxuICAgIGlmICh0aGlzLm1hcE9mVHlwZSkge1xuICAgICAgY29uc3QgcmVmID0gdGhpcy5tYXBPZlR5cGUudG9TdHJpbmcob3B0aW9ucyk7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc3BpbGUubWFwT2YocmVmKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudW5pb25PZlR5cGVzKSB7XG4gICAgICBjb25zdCByZWZzID0gdGhpcy51bmlvbk9mVHlwZXMubWFwKCh0KSA9PiB0LnRvU3RyaW5nKG9wdGlvbnMpKTtcbiAgICAgIHJldHVybiB0aGlzLnRyYW5zcGlsZS51bmlvbk9mKHJlZnMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1ZvaWQpIHtcbiAgICAgIHJldHVybiBzRm9ybWF0dGVyKHRoaXMudHJhbnNwaWxlLnZvaWQoKSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0eXBlIHJlZmVyZW5jZTogJHt0aGlzLnJlZi50b1N0cmluZygpfWApO1xuICB9XG5cbiAgcHVibGljIHRvSnNvbigpOiBUeXBlU2NoZW1hIHtcbiAgICBpZiAodGhpcy5wcmltaXRpdmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvcm1hdHRpbmdQYXR0ZXJuOiB0aGlzLnByaW1pdGl2ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHlwZSkge1xuICAgICAgaWYgKCF0aGlzLnJlZi5mcW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcmlnaW5hbCB0eXBlIHJlZmVyZW5jZSBmb3IgJHt0aGlzLnR