@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
300 lines (299 loc) • 50.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const ts_utils_1 = require("@neo-one/ts-utils");
const utils_1 = require("@neo-one/utils");
const lodash_1 = tslib_1.__importDefault(require("lodash"));
const typescript_1 = tslib_1.__importDefault(require("typescript"));
const analysis_1 = require("../analysis");
const DiagnosticCode_1 = require("../DiagnosticCode");
const DiagnosticMessage_1 = require("../DiagnosticMessage");
const utils_2 = require("../utils");
const BOOLEAN_RETURN = { type: 'Boolean' };
const VOID_RETURN = { type: 'Void' };
class ABISmartContractProcessor {
constructor(context, contractInfo) {
this.context = context;
this.contractInfo = contractInfo;
}
process() {
return {
functions: this.processFunctions(),
events: this.processEvents(),
};
}
processFunctions() {
const deployInfo = this.findDeployInfo();
const propInfos = this.contractInfo.propInfos
.filter((propInfo) => propInfo.isPublic && propInfo.type !== 'deploy')
.concat([deployInfo].filter(utils_1.utils.notNull));
return lodash_1.default.flatten(propInfos.map((propInfo) => {
switch (propInfo.type) {
case 'deploy':
return [
{
name: propInfo.name,
parameters: propInfo.isMixinDeploy
? []
: this.getParameters({ callSignature: propInfo.callSignature }),
returnType: BOOLEAN_RETURN,
},
];
case 'refundAssets':
return [
{
name: propInfo.name,
sendUnsafe: true,
parameters: [],
returnType: VOID_RETURN,
},
];
case 'completeSend':
return [
{
name: propInfo.name,
completeSend: true,
parameters: [],
returnType: VOID_RETURN,
},
];
case 'upgrade':
return [
{
name: propInfo.name,
parameters: [
{ name: 'script', type: 'Buffer' },
{ name: 'parameterList', type: 'Buffer' },
{ name: 'returnType', type: 'Integer', decimals: 0 },
{ name: 'properties', type: 'Integer', decimals: 0 },
{ name: 'contractName', type: 'String' },
{ name: 'codeVersion', type: 'String' },
{ name: 'author', type: 'String' },
{ name: 'email', type: 'String' },
{ name: 'description', type: 'String' },
],
returnType: VOID_RETURN,
},
];
case 'function':
return [
{
name: propInfo.name,
parameters: this.getParameters({
callSignature: propInfo.callSignature,
send: propInfo.send,
claim: propInfo.claim,
}),
returnType: this.toABIReturn(propInfo.decl, propInfo.returnType),
constant: propInfo.constant,
send: propInfo.send,
sendUnsafe: propInfo.sendUnsafe,
receive: propInfo.receive,
claim: propInfo.claim,
},
];
case 'property':
return [
{
name: propInfo.name,
parameters: [],
returnType: this.toABIReturn(propInfo.decl, propInfo.propertyType),
constant: true,
},
propInfo.isReadonly
? undefined
: {
name: utils_2.getSetterName(propInfo.name),
parameters: [
this.toABIParameter(propInfo.name, propInfo.decl, propInfo.propertyType, false, {
error: false,
}),
].filter(utils_1.utils.notNull),
returnType: VOID_RETURN,
},
].filter(utils_1.utils.notNull);
case 'accessor':
return [
propInfo.getter === undefined
? undefined
: {
name: propInfo.getter.name,
parameters: [],
constant: propInfo.getter.constant,
returnType: this.toABIReturn(propInfo.getter.decl, propInfo.propertyType),
},
propInfo.setter === undefined
? undefined
: {
name: propInfo.setter.name,
parameters: [
this.toABIParameter(propInfo.name, propInfo.getter === undefined ? propInfo.setter.decl : propInfo.getter.decl, propInfo.propertyType, false, propInfo.getter === undefined ? { error: true } : undefined),
].filter(utils_1.utils.notNull),
returnType: VOID_RETURN,
},
].filter(utils_1.utils.notNull);
default:
utils_1.utils.assertNever(propInfo);
throw new Error('For TS');
}
}));
}
findDeployInfo(contractInfo = this.contractInfo) {
const deployInfo = contractInfo.propInfos.find((propInfo) => propInfo.type === 'deploy');
const superSmartContract = contractInfo.superSmartContract;
if (deployInfo !== undefined) {
if (deployInfo.decl === undefined && superSmartContract !== undefined) {
const superDeployInfo = this.findDeployInfo(superSmartContract);
return superDeployInfo === undefined ? deployInfo : superDeployInfo;
}
return deployInfo;
}
return superSmartContract === undefined ? undefined : this.findDeployInfo(superSmartContract);
}
getParameters({ callSignature, claim = false, send = false, }) {
if (callSignature === undefined) {
return [];
}
let parameters = callSignature.getParameters();
if (claim && this.checkLastParam(parameters, 'ClaimTransaction')) {
parameters = parameters.slice(0, -1);
}
if (send && this.checkLastParam(parameters, 'Transfer')) {
parameters = parameters.slice(0, -1);
}
return parameters.map((parameter) => this.paramToABIParameter(parameter)).filter(utils_1.utils.notNull);
}
processEvents() {
const createEventNotifierDecl = ts_utils_1.tsUtils.symbol.getDeclarations(this.context.builtins.getValueSymbol('createEventNotifier'))[0];
const declareEventDecl = ts_utils_1.tsUtils.symbol.getDeclarations(this.context.builtins.getValueSymbol('declareEvent'))[0];
const calls = this.context.analysis
.findReferencesAsNodes(createEventNotifierDecl)
.concat(this.context.analysis.findReferencesAsNodes(declareEventDecl))
.map((node) => {
if (typescript_1.default.isIdentifier(node)) {
const parent = ts_utils_1.tsUtils.node.getParent(node);
if (typescript_1.default.isCallExpression(parent)) {
return parent;
}
}
return undefined;
})
.filter(utils_1.utils.notNull);
return calls.reduce((events, call) => {
const event = this.toABIEvent(call, events);
return event === undefined ? events : [...events, event];
}, []);
}
toABIEvent(call, events) {
const callArguments = ts_utils_1.tsUtils.argumented.getArguments(call);
const parent = ts_utils_1.tsUtils.node.getParent(call);
let typeArguments = ts_utils_1.tsUtils.argumented
.getTypeArgumentsArray(call)
.map((typeNode) => this.context.analysis.getType(typeNode));
if (typescript_1.default.isPropertyDeclaration(parent)) {
const propertyName = ts_utils_1.tsUtils.node.getName(parent);
const smartContractType = this.context.analysis.getType(this.contractInfo.smartContract);
if (smartContractType !== undefined) {
const member = ts_utils_1.tsUtils.type_.getProperty(smartContractType, propertyName);
if (member !== undefined) {
const type = this.context.analysis.getTypeOfSymbol(member, this.contractInfo.smartContract);
const signatureTypes = this.context.analysis.extractSignatureForType(call, type);
if (signatureTypes !== undefined) {
typeArguments = signatureTypes.paramDecls.map((paramDecl) => signatureTypes.paramTypes.get(paramDecl));
}
}
}
}
const nameArg = callArguments[0];
if (nameArg === undefined) {
return undefined;
}
if (!typescript_1.default.isStringLiteral(nameArg)) {
this.context.reportError(nameArg, DiagnosticCode_1.DiagnosticCode.InvalidContractEvent, DiagnosticMessage_1.DiagnosticMessage.InvalidContractEventNameStringLiteral);
return undefined;
}
const name = ts_utils_1.tsUtils.literal.getLiteralValue(nameArg);
const parameters = lodash_1.default.zip(callArguments.slice(1), typeArguments)
.map(([paramNameArg, paramType]) => {
if (paramNameArg === undefined || paramType === undefined) {
return undefined;
}
if (!typescript_1.default.isStringLiteral(paramNameArg)) {
this.context.reportError(paramNameArg, DiagnosticCode_1.DiagnosticCode.InvalidContractEvent, DiagnosticMessage_1.DiagnosticMessage.InvalidContractEventArgStringLiteral);
return undefined;
}
const paramName = ts_utils_1.tsUtils.literal.getLiteralValue(paramNameArg);
const param = this.toABIParameter(paramName, paramNameArg, paramType);
if (param !== undefined && param.type === 'ForwardValue') {
this.context.reportError(paramNameArg, DiagnosticCode_1.DiagnosticCode.InvalidContractType, DiagnosticMessage_1.DiagnosticMessage.InvalidContractType);
return undefined;
}
return param;
})
.filter(utils_1.utils.notNull);
const event = { name, parameters };
const dupeEvent = events.find((otherEvent) => otherEvent.name === event.name && !lodash_1.default.isEqual(event, otherEvent));
if (dupeEvent === undefined) {
return event;
}
this.context.reportError(nameArg, DiagnosticCode_1.DiagnosticCode.InvalidContractEvent, DiagnosticMessage_1.DiagnosticMessage.InvalidContractEventDuplicate);
return undefined;
}
paramToABIParameter(param) {
const decls = ts_utils_1.tsUtils.symbol.getDeclarations(param);
const decl = utils_1.utils.nullthrows(decls[0]);
const initializer = ts_utils_1.tsUtils.initializer.getInitializer(decl);
const parameter = this.toABIParameter(ts_utils_1.tsUtils.symbol.getName(param), decl, this.getParamSymbolType(param), initializer !== undefined);
if (parameter === undefined ||
initializer === undefined ||
(!typescript_1.default.isPropertyAccessExpression(initializer) && !typescript_1.default.isCallExpression(initializer))) {
return parameter;
}
if (typescript_1.default.isPropertyAccessExpression(initializer)) {
const symbol = this.context.analysis.getSymbol(initializer);
const senderAddress = this.context.builtins.getOnlyMemberSymbol('DeployConstructor', 'senderAddress');
if (symbol === senderAddress) {
const sender = { type: 'sender' };
return Object.assign({}, parameter, { default: sender });
}
}
return parameter;
}
checkLastParam(parameters, value) {
return this.checkLastParamBase(parameters, (decl, type) => this.context.builtins.isInterface(decl, type, value));
}
checkLastParamBase(parameters, checkParamType) {
if (parameters.length === 0) {
return false;
}
const lastParam = parameters[parameters.length - 1];
const lastParamType = this.getParamSymbolType(lastParam);
return lastParamType !== undefined && checkParamType(ts_utils_1.tsUtils.symbol.getDeclarations(lastParam)[0], lastParamType);
}
getParamSymbolType(param) {
const decls = ts_utils_1.tsUtils.symbol.getDeclarations(param);
const decl = utils_1.utils.nullthrows(decls[0]);
return this.context.analysis.getTypeOfSymbol(param, decl);
}
toABIParameter(nameIn, node, resolvedTypeIn, optional = false, options = analysis_1.DEFAULT_DIAGNOSTIC_OPTIONS) {
const name = nameIn.startsWith('_') ? nameIn.slice(1) : nameIn;
let resolvedType = resolvedTypeIn;
if (typescript_1.default.isParameter(node) && ts_utils_1.tsUtils.parameter.isRestParameter(node) && resolvedType !== undefined) {
resolvedType = ts_utils_1.tsUtils.type_.getTypeArgumentsArray(resolvedType)[0];
}
const type = utils_2.toABIReturn(this.context, node, resolvedType, optional, options);
if (type === undefined) {
return undefined;
}
if (typescript_1.default.isParameter(node) && ts_utils_1.tsUtils.parameter.isRestParameter(node)) {
return Object.assign({}, type, { name, rest: true });
}
return Object.assign({}, type, { name });
}
toABIReturn(node, resolvedType, optional = false, options = analysis_1.DEFAULT_DIAGNOSTIC_OPTIONS) {
const type = utils_2.toABIReturn(this.context, node, resolvedType, optional, options);
return type === undefined ? VOID_RETURN : type;
}
}
exports.ABISmartContractProcessor = ABISmartContractProcessor;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkFCSVNtYXJ0Q29udHJhY3RQcm9jZXNzb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsZ0RBQTRDO0FBQzVDLDBDQUF1QztBQUN2Qyw0REFBdUI7QUFDdkIsb0VBQTRCO0FBQzVCLDBDQUE0RTtBQUU1RSxzREFBbUQ7QUFDbkQsNERBQXlEO0FBQ3pELG9DQUFzRDtBQUd0RCxNQUFNLGNBQWMsR0FBYyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUN0RCxNQUFNLFdBQVcsR0FBYyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUVoRCxNQUFhLHlCQUF5QjtJQUNwQyxZQUFvQyxPQUFnQixFQUFtQixZQUEwQjtRQUE3RCxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQW1CLGlCQUFZLEdBQVosWUFBWSxDQUFjO0lBQUcsQ0FBQztJQUU5RixPQUFPO1FBQ1osT0FBTztZQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDbEMsTUFBTSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7U0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUzthQUMxQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7YUFDckUsTUFBTSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRTlDLE9BQU8sZ0JBQUMsQ0FBQyxPQUFPLENBQ2QsU0FBUyxDQUFDLEdBQUcsQ0FDWCxDQUFDLFFBQVEsRUFBOEIsRUFBRTtZQUN2QyxRQUFRLFFBQVEsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3JCLEtBQUss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LFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxrQkFBTyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtZQUNqRyxZQUFZLEdBQUcsa0JBQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckU7UUFFRCxNQUFNLElBQUksR0FBRyxtQkFBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUUsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3RCLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBRUQsSUFBSSxvQkFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxrQkFBTyxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDbkUseUJBQVksSUFBSSxJQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFHO1NBQ3RDO1FBRUQseUJBQVksSUFBSSxJQUFFLElBQUksSUFBRztJQUMzQixDQUFDO0lBRU8sV0FBVyxDQUNqQixJQUFhLEVBQ2IsWUFBaUMsRUFDakMsUUFBUSxHQUFHLEtBQUssRUFDaEIsVUFBNkIscUNBQTBCO1FBRXZELE1BQU0sSUFBSSxHQUFHLG1CQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUU5RSxPQUFPLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2pELENBQUM7Q0FDRjtBQXZZRCw4REF1WUMiLCJmaWxlIjoibmVvLW9uZS1zbWFydC1jb250cmFjdC1jb21waWxlci9zcmMvY29udHJhY3QvQUJJU21hcnRDb250cmFjdFByb2Nlc3Nvci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFCSSwgQUJJRXZlbnQsIEFCSUZ1bmN0aW9uLCBBQklQYXJhbWV0ZXIsIEFCSVJldHVybiwgU2VuZGVyQWRkcmVzc0FCSURlZmF1bHQgfSBmcm9tICdAbmVvLW9uZS9jbGllbnQtY29tbW9uJztcbmltcG9ydCB7IHRzVXRpbHMgfSBmcm9tICdAbmVvLW9uZS90cy11dGlscyc7XG5pbXBvcnQgeyB1dGlscyB9IGZyb20gJ0BuZW8tb25lL3V0aWxzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgeyBERUZBVUxUX0RJQUdOT1NUSUNfT1BUSU9OUywgRGlhZ25vc3RpY09wdGlvbnMgfSBmcm9tICcuLi9hbmFseXNpcyc7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSAnLi4vQ29udGV4dCc7XG5pbXBvcnQgeyBEaWFnbm9zdGljQ29kZSB9IGZyb20gJy4uL0RpYWdub3N0aWNDb2RlJztcbmltcG9ydCB7IERpYWdub3N0aWNNZXNzYWdlIH0gZnJvbSAnLi4vRGlhZ25vc3RpY01lc3NhZ2UnO1xuaW1wb3J0IHsgZ2V0U2V0dGVyTmFtZSwgdG9BQklSZXR1cm4gfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBDb250cmFjdEluZm8sIERlcGxveVByb3BJbmZvIH0gZnJvbSAnLi9Db250cmFjdEluZm9Qcm9jZXNzb3InO1xuXG5jb25zdCBCT09MRUFOX1JFVFVSTjogQUJJUmV0dXJuID0geyB0eXBlOiAnQm9vbGVhbicgfTtcbmNvbnN0IFZPSURfUkVUVVJOOiBBQklSZXR1cm4gPSB7IHR5cGU6ICdWb2lkJyB9O1xuXG5leHBvcnQgY2xhc3MgQUJJU21hcnRDb250cmFjdFByb2Nlc3NvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNvbnRleHQ6IENvbnRleHQsIHByaXZhdGUgcmVhZG9ubHkgY29udHJhY3RJbmZvOiBDb250cmFjdEluZm8pIHt9XG5cbiAgcHVibGljIHByb2Nlc3MoKTogQUJJIHtcbiAgICByZXR1cm4ge1xuICAgICAgZnVuY3Rpb25zOiB0aGlzLnByb2Nlc3NGdW5jdGlvbnMoKSxcbiAgICAgIGV2ZW50czogdGhpcy5wcm9jZXNzRXZlbnRzKCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc0Z1bmN0aW9ucygpOiBSZWFkb25seUFycmF5PEFCSUZ1bmN0aW9uPiB7XG4gICAgY29uc3QgZGVwbG95SW5mbyA9IHRoaXMuZmluZERlcGxveUluZm8oKTtcbiAgICBjb25zdCBwcm9wSW5mb3MgPSB0aGlzLmNvbnRyYWN0SW5mby5wcm9wSW5mb3NcbiAgICAgIC5maWx0ZXIoKHByb3BJbmZvKSA9PiBwcm9wSW5mby5pc1B1YmxpYyAmJiBwcm9wSW5mby50eXBlICE9PSAnZGVwbG95JylcbiAgICAgIC5jb25jYXQoW2RlcGxveUluZm9dLmZpbHRlcih1dGlscy5ub3ROdWxsKSk7XG5cbiAgICByZXR1cm4gXy5mbGF0dGVuPEFCSUZ1bmN0aW9uPihcbiAgICAgIHByb3BJbmZvcy5tYXAoXG4gICAgICAgIChwcm9wSW5mbyk6IFJlYWRvbmx5QXJyYXk8QUJJRnVuY3Rpb24+ID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHByb3BJbmZvLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RlcGxveSc6XG4gICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbmFtZTogcHJvcEluZm8ubmFtZSxcbiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHByb3BJbmZvLmlzTWl4aW5EZXBsb3lcbiAgICAgICAgICAgICAgICAgICAgPyBbXVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZ2V0UGFyYW1ldGVycyh7IGNhbGxTaWduYXR1cmU6IHByb3BJbmZvLmNhbGxTaWduYXR1cmUgfSksXG4gICAgICAgICAgICAgICAgICByZXR1cm5UeXBlOiBCT09MRUFOX1JFVFVSTixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgY2FzZSAncmVmdW5kQXNzZXRzJzpcbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBwcm9wSW5mby5uYW1lLFxuICAgICAgICAgICAgICAgICAgc2VuZFVuc2FmZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtdLFxuICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZTogVk9JRF9SRVRVUk4sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBsZXRlU2VuZCc6XG4gICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbmFtZTogcHJvcEluZm8ubmFtZSxcbiAgICAgICAgICAgICAgICAgIGNvbXBsZXRlU2VuZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtdLFxuICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZTogVk9JRF9SRVRVUk4sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGNhc2UgJ3VwZ3JhZGUnOlxuICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHByb3BJbmZvLm5hbWUsXG4gICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ3NjcmlwdCcsIHR5cGU6ICdCdWZmZXInIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ3BhcmFtZXRlckxpc3QnLCB0eXBlOiAnQnVmZmVyJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICdyZXR1cm5UeXBlJywgdHlwZTogJ0ludGVnZXInLCBkZWNpbWFsczogMCB9LFxuICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICdwcm9wZXJ0aWVzJywgdHlwZTogJ0ludGVnZXInLCBkZWNpbWFsczogMCB9LFxuICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICdjb250cmFjdE5hbWUnLCB0eXBlOiAnU3RyaW5nJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICdjb2RlVmVyc2lvbicsIHR5cGU6ICdTdHJpbmcnIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ2F1dGhvcicsIHR5cGU6ICdTdHJpbmcnIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ2VtYWlsJywgdHlwZTogJ1N0cmluZycgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiAnZGVzY3JpcHRpb24nLCB0eXBlOiAnU3RyaW5nJyB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIHJldHVyblR5cGU6IFZPSURfUkVUVVJOLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF07XG4gICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgbmFtZTogcHJvcEluZm8ubmFtZSxcbiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IHRoaXMuZ2V0UGFyYW1ldGVycyh7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxTaWduYXR1cmU6IHByb3BJbmZvLmNhbGxTaWduYXR1cmUsXG4gICAgICAgICAgICAgICAgICAgIHNlbmQ6IHByb3BJbmZvLnNlbmQsXG4gICAgICAgICAgICAgICAgICAgIGNsYWltOiBwcm9wSW5mby5jbGFpbSxcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZTogdGhpcy50b0FCSVJldHVybihwcm9wSW5mby5kZWNsLCBwcm9wSW5mby5yZXR1cm5UeXBlKSxcbiAgICAgICAgICAgICAgICAgIGNvbnN0YW50OiBwcm9wSW5mby5jb25zdGFudCxcbiAgICAgICAgICAgICAgICAgIHNlbmQ6IHByb3BJbmZvLnNlbmQsXG4gICAgICAgICAgICAgICAgICBzZW5kVW5zYWZlOiBwcm9wSW5mby5zZW5kVW5zYWZlLFxuICAgICAgICAgICAgICAgICAgcmVjZWl2ZTogcHJvcEluZm8ucmVjZWl2ZSxcbiAgICAgICAgICAgICAgICAgIGNsYWltOiBwcm9wSW5mby5jbGFpbSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHByb3BJbmZvLm5hbWUsXG4gICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgICAgICAgICAgIHJldHVyblR5cGU6IHRoaXMudG9BQklSZXR1cm4ocHJvcEluZm8uZGVjbCwgcHJvcEluZm8ucHJvcGVydHlUeXBlKSxcbiAgICAgICAgICAgICAgICAgIGNvbnN0YW50OiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHJvcEluZm8uaXNSZWFkb25seVxuICAgICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGdldFNldHRlck5hbWUocHJvcEluZm8ubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b0FCSVBhcmFtZXRlcihwcm9wSW5mby5uYW1lLCBwcm9wSW5mby5kZWNsLCBwcm9wSW5mby5wcm9wZXJ0eVR5cGUsIGZhbHNlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgIF0uZmlsdGVyKHV0aWxzLm5vdE51bGwpLFxuICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGU6IFZPSURfUkVUVVJOLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLmZpbHRlcih1dGlscy5ub3ROdWxsKTtcbiAgICAgICAgICAgIGNhc2UgJ2FjY2Vzc29yJzpcbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBwcm9wSW5mby5nZXR0ZXIgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHByb3BJbmZvLmdldHRlci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50OiBwcm9wSW5mby5nZXR0ZXIuY29uc3RhbnQsXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZTogdGhpcy50b0FCSVJldHVybihwcm9wSW5mby5nZXR0ZXIuZGVjbCwgcHJvcEluZm8ucHJvcGVydHlUeXBlKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwcm9wSW5mby5zZXR0ZXIgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHByb3BJbmZvLnNldHRlci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9BQklQYXJhbWV0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BJbmZvLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BJbmZvLmdldHRlciA9PT0gdW5kZWZpbmVkID8gcHJvcEluZm8uc2V0dGVyLmRlY2wgOiBwcm9wSW5mby5nZXR0ZXIuZGVjbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcEluZm8ucHJvcGVydHlUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcEluZm8uZ2V0dGVyID09PSB1bmRlZmluZWQgPyB7IGVycm9yOiB0cnVlIH0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgIF0uZmlsdGVyKHV0aWxzLm5vdE51bGwpLFxuICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGU6IFZPSURfUkVUVVJOLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLmZpbHRlcih1dGlscy5ub3ROdWxsKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHV0aWxzLmFzc2VydE5ldmVyKHByb3BJbmZvKTtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3IgVFMnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZpbmREZXBsb3lJbmZvKGNvbnRyYWN0SW5mbzogQ29udHJhY3RJbmZvID0gdGhpcy5jb250cmFjdEluZm8pOiBEZXBsb3lQcm9wSW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGVwbG95SW5mbyA9IGNvbnRyYWN0SW5mby5wcm9wSW5mb3MuZmluZChcbiAgICAgIChwcm9wSW5mbyk6IHByb3BJbmZvIGlzIERlcGxveVByb3BJbmZvID0+IHByb3BJbmZvLnR5cGUgPT09ICdkZXBsb3knLFxuICAgICk7XG4gICAgY29uc3Qgc3VwZXJTbWFydENvbnRyYWN0ID0gY29udHJhY3RJbmZvLnN1cGVyU21hcnRDb250cmFjdDtcbiAgICBpZiAoZGVwbG95SW5mbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoZGVwbG95SW5mby5kZWNsID09PSB1bmRlZmluZWQgJiYgc3VwZXJTbWFydENvbnRyYWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc3VwZXJEZXBsb3lJbmZvID0gdGhpcy5maW5kRGVwbG95SW5mbyhzdXBlclNtYXJ0Q29udHJhY3QpO1xuXG4gICAgICAgIHJldHVybiBzdXBlckRlcGxveUluZm8gPT09IHVuZGVmaW5lZCA/IGRlcGxveUluZm8gOiBzdXBlckRlcGxveUluZm87XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZXBsb3lJbmZvO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlclNtYXJ0Q29udHJhY3QgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMuZmluZERlcGxveUluZm8oc3VwZXJTbWFydENvbnRyYWN0KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyYW1ldGVycyh7XG4gICAgY2FsbFNpZ25hdHVyZSxcbiAgICBjbGFpbSA9IGZhbHNlLFxuICAgIHNlbmQgPSBmYWxzZSxcbiAgfToge1xuICAgIHJlYWRvbmx5IGNhbGxTaWduYXR1cmU6IHRzLlNpZ25hdHVyZSB8IHVuZGVmaW5lZDtcbiAgICByZWFkb25seSBjbGFpbT86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgc2VuZD86IGJvb2xlYW47XG4gIH0pOiBSZWFkb25seUFycmF5PEFCSVBhcmFtZXRlcj4ge1xuICAgIGlmIChjYWxsU2lnbmF0dXJlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBsZXQgcGFyYW1ldGVycyA9IGNhbGxTaWduYXR1cmUuZ2V0UGFyYW1ldGVycygpO1xuICAgIGlmIChjbGFpbSAmJiB0aGlzLmNoZWNrTGFzdFBhcmFtKHBhcmFtZXRlcnMsICdDbGFpbVRyYW5zYWN0aW9uJykpIHtcbiAgICAgIHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzLnNsaWNlKDAsIC0xKTtcbiAgICB9XG5cbiAgICBpZiAoc2VuZCAmJiB0aGlzLmNoZWNrTGFzdFBhcmFtKHBhcmFtZXRlcnMsICdUcmFuc2ZlcicpKSB7XG4gICAgICBwYXJhbWV0ZXJzID0gcGFyYW1ldGVycy5zbGljZSgwLCAtMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+IHRoaXMucGFyYW1Ub0FCSVBhcmFtZXRlcihwYXJhbWV0ZXIpKS5maWx0ZXIodXRpbHMubm90TnVsbCk7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NFdmVudHMoKTogUmVhZG9ubHlBcnJheTxBQklFdmVudD4ge1xuICAgIGNvbnN0IGNyZWF0ZUV2ZW50Tm90aWZpZXJEZWNsID0gdHNVdGlscy5zeW1ib2wuZ2V0RGVjbGFyYXRpb25zKFxuICAgICAgdGhpcy5jb250ZXh0LmJ1aWx0aW5zLmdldFZhbHVlU3ltYm9sKCdjcmVhdGVFdmVudE5vdGlmaWVyJyksXG4gICAgKVswXTtcbiAgICBjb25zdCBkZWNsYXJlRXZlbnREZWNsID0gdHNVdGlscy5zeW1ib2wuZ2V0RGVjbGFyYXRpb25zKHRoaXMuY29udGV4dC5idWlsdGlucy5nZXRWYWx1ZVN5bWJvbCgnZGVjbGFyZUV2ZW50JykpWzBdO1xuXG4gICAgY29uc3QgY2FsbHMgPSB0aGlzLmNvbnRleHQuYW5hbHlzaXNcbiAgICAgIC5maW5kUmVmZXJlbmNlc0FzTm9kZXMoY3JlYXRlRXZlbnROb3RpZmllckRlY2wpXG4gICAgICAuY29uY2F0KHRoaXMuY29udGV4dC5hbmFseXNpcy5maW5kUmVmZXJlbmNlc0FzTm9kZXMoZGVjbGFyZUV2ZW50RGVjbCkpXG4gICAgICAubWFwKChub2RlKSA9PiB7XG4gICAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIobm9kZSkpIHtcbiAgICAgICAgICBjb25zdCBwYXJlbnQgPSB0c1V0aWxzLm5vZGUuZ2V0UGFyZW50KG5vZGUpO1xuICAgICAgICAgIGlmICh0cy5pc0NhbGxFeHByZXNzaW9uKHBhcmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKHV0aWxzLm5vdE51bGwpO1xuXG4gICAgcmV0dXJuIGNhbGxzLnJlZHVjZTxSZWFkb25seUFycmF5PEFCSUV2ZW50Pj4oKGV2ZW50cywgY2FsbCkgPT4ge1xuICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLnRvQUJJRXZlbnQoY2FsbCwgZXZlbnRzKTtcblxuICAgICAgcmV0dXJuIGV2ZW50ID09PSB1bmRlZmluZWQgPyBldmVudHMgOiBbLi4uZXZlbnRzLCBldmVudF07XG4gICAgfSwgW10pO1xuICB9XG5cbiAgcHJpdmF0ZSB0b0FCSUV2ZW50KGNhbGw6IHRzLkNhbGxFeHByZXNzaW9uLCBldmVudHM6IFJlYWRvbmx5QXJyYXk8QUJJRXZlbnQ+KTogQUJJRXZlbnQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNhbGxBcmd1bWVudHMgPSB0c1V0aWxzLmFyZ3VtZW50ZWQuZ2V0QXJndW1lbnRzKGNhbGwpO1xuICAgIGNvbnN0IHBhcmVudCA9IHRzVXRpbHMubm9kZS5nZXRQYXJlbnQoY2FsbCk7XG5cbiAgICBsZXQgdHlwZUFyZ3VtZW50cyA9IHRzVXRpbHMuYXJndW1lbnRlZFxuICAgICAgLmdldFR5cGVBcmd1bWVudHNBcnJheShjYWxsKVxuICAgICAgLm1hcCgodHlwZU5vZGUpID0+IHRoaXMuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlKHR5cGVOb2RlKSk7XG4gICAgaWYgKHRzLmlzUHJvcGVydHlEZWNsYXJhdGlvbihwYXJlbnQpKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0eU5hbWUgPSB0c1V0aWxzLm5vZGUuZ2V0TmFtZShwYXJlbnQpO1xuICAgICAgY29uc3Qgc21hcnRDb250cmFjdFR5cGUgPSB0aGlzLmNvbnRleHQuYW5hbHlzaXMuZ2V0VHlwZSh0aGlzLmNvbnRyYWN0SW5mby5zbWFydENvbnRyYWN0KTtcbiAgICAgIGlmIChzbWFydENvbnRyYWN0VHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG1lbWJlciA9IHRzVXRpbHMudHlwZV8uZ2V0UHJvcGVydHkoc21hcnRDb250cmFjdFR5cGUsIHByb3BlcnR5TmFtZSk7XG4gICAgICAgIGlmIChtZW1iZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmNvbnRleHQuYW5hbHlzaXMuZ2V0VHlwZU9mU3ltYm9sKG1lbWJlciwgdGhpcy5jb250cmFjdEluZm8uc21hcnRDb250cmFjdCk7XG4gICAgICAgICAgY29uc3Qgc2lnbmF0dXJlVHlwZXMgPSB0aGlzLmNvbnRleHQuYW5hbHlzaXMuZXh0cmFjdFNpZ25hdHVyZUZvclR5cGUoY2FsbCwgdHlwZSk7XG4gICAgICAgICAgaWYgKHNpZ25hdHVyZVR5cGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHR5cGVBcmd1bWVudHMgPSBzaWduYXR1cmVUeXBlcy5wYXJhbURlY2xzLm1hcCgocGFyYW1EZWNsKSA9PiBzaWduYXR1cmVUeXBlcy5wYXJhbVR5cGVzLmdldChwYXJhbURlY2wpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBuYW1lQXJnID0gY2FsbEFyZ3VtZW50c1swXSBhcyB0cy5Ob2RlIHwgdW5kZWZpbmVkO1xuICAgIGlmIChuYW1lQXJnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCF0cy5pc1N0cmluZ0xpdGVyYWwobmFtZUFyZykpIHtcbiAgICAgIHRoaXMuY29udGV4dC5yZXBvcnRFcnJvcihcbiAgICAgICAgbmFtZUFyZyxcbiAgICAgICAgRGlhZ25vc3RpY0NvZGUuSW52YWxpZENvbnRyYWN0RXZlbnQsXG4gICAgICAgIERpYWdub3N0aWNNZXNzYWdlLkludmFsaWRDb250cmFjdEV2ZW50TmFtZVN0cmluZ0xpdGVyYWwsXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gdHNVdGlscy5saXRlcmFsLmdldExpdGVyYWxWYWx1ZShuYW1lQXJnKTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBfLnppcChjYWxsQXJndW1lbnRzLnNsaWNlKDEpLCB0eXBlQXJndW1lbnRzKVxuICAgICAgLm1hcCgoW3BhcmFtTmFtZUFyZywgcGFyYW1UeXBlXSkgPT4ge1xuICAgICAgICBpZiAocGFyYW1OYW1lQXJnID09PSB1bmRlZmluZWQgfHwgcGFyYW1UeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0cy5pc1N0cmluZ0xpdGVyYWwocGFyYW1OYW1lQXJnKSkge1xuICAgICAgICAgIHRoaXMuY29udGV4dC5yZXBvcnRFcnJvcihcbiAgICAgICAgICAgIHBhcmFtTmFtZUFyZyxcbiAgICAgICAgICAgIERpYWdub3N0aWNDb2RlLkludmFsaWRDb250cmFjdEV2ZW50LFxuICAgICAgICAgICAgRGlhZ25vc3RpY01lc3NhZ2UuSW52YWxpZENvbnRyYWN0RXZlbnRBcmdTdHJpbmdMaXRlcmFsLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyYW1OYW1lID0gdHNVdGlscy5saXRlcmFsLmdldExpdGVyYWxWYWx1ZShwYXJhbU5hbWVBcmcpO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtID0gdGhpcy50b0FCSVBhcmFtZXRlcihwYXJhbU5hbWUsIHBhcmFtTmFtZUFyZywgcGFyYW1UeXBlKTtcblxuICAgICAgICBpZiAocGFyYW0gIT09IHVuZGVmaW5lZCAmJiBwYXJhbS50eXBlID09PSAnRm9yd2FyZFZhbHVlJykge1xuICAgICAgICAgIHRoaXMuY29udGV4dC5yZXBvcnRFcnJvcihcbiAgICAgICAgICAgIHBhcmFtTmFtZUFyZyxcbiAgICAgICAgICAgIERpYWdub3N0aWNDb2RlLkludmFsaWRDb250cmFjdFR5cGUsXG4gICAgICAgICAgICBEaWFnbm9zdGljTWVzc2FnZS5JbnZhbGlkQ29udHJhY3RUeXBlLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhcmFtO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIodXRpbHMubm90TnVsbCk7XG5cbiAgICBjb25zdCBldmVudCA9IHsgbmFtZSwgcGFyYW1ldGVycyB9O1xuXG4gICAgY29uc3QgZHVwZUV2ZW50ID0gZXZlbnRzLmZpbmQoKG90aGVyRXZlbnQpID0+IG90aGVyRXZlbnQubmFtZSA9PT0gZXZlbnQubmFtZSAmJiAhXy5pc0VxdWFsKGV2ZW50LCBvdGhlckV2ZW50KSk7XG4gICAgaWYgKGR1cGVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfVxuXG4gICAgdGhpcy5jb250ZXh0LnJlcG9ydEVycm9yKFxuICAgICAgbmFtZUFyZyxcbiAgICAgIERpYWdub3N0aWNDb2RlLkludmFsaWRDb250cmFjdEV2ZW50LFxuICAgICAgRGlhZ25vc3RpY01lc3NhZ2UuSW52YWxpZENvbnRyYWN0RXZlbnREdXBsaWNhdGUsXG4gICAgKTtcblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHBhcmFtVG9BQklQYXJhbWV0ZXIocGFyYW06IHRzLlN5bWJvbCk6IEFCSVBhcmFtZXRlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGVjbHMgPSB0c1V0aWxzLnN5bWJvbC5nZXREZWNsYXJhdGlvbnMocGFyYW0pO1xuICAgIGNvbnN0IGRlY2wgPSB1dGlscy5udWxsdGhyb3dzKGRlY2xzWzBdKTtcblxuICAgIGNvbnN0IGluaXRpYWxpemVyID0gdHNVdGlscy5pbml0aWFsaXplci5nZXRJbml0aWFsaXplcihkZWNsKTtcbiAgICBjb25zdCBwYXJhbWV0ZXIgPSB0aGlzLnRvQUJJUGFyYW1ldGVyKFxuICAgICAgdHNVdGlscy5zeW1ib2wuZ2V0TmFtZShwYXJhbSksXG4gICAgICBkZWNsLFxuICAgICAgdGhpcy5nZXRQYXJhbVN5bWJvbFR5cGUocGFyYW0pLFxuICAgICAgaW5pdGlhbGl6ZXIgIT09IHVuZGVmaW5lZCxcbiAgICApO1xuXG4gICAgaWYgKFxuICAgICAgcGFyYW1ldGVyID09PSB1bmRlZmluZWQgfHxcbiAgICAgIGluaXRpYWxpemVyID09PSB1bmRlZmluZWQgfHxcbiAgICAgICghdHMuaXNQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24oaW5pdGlhbGl6ZXIpICYmICF0cy5pc0NhbGxFeHByZXNzaW9uKGluaXRpYWxpemVyKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBwYXJhbWV0ZXI7XG4gICAgfVxuXG4gICAgaWYgKHRzLmlzUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKGluaXRpYWxpemVyKSkge1xuICAgICAgY29uc3Qgc3ltYm9sID0gdGhpcy5jb250ZXh0LmFuYWx5c2lzLmdldFN5bWJvbChpbml0aWFsaXplcik7XG4gICAgICBjb25zdCBzZW5kZXJBZGRyZXNzID0gdGhpcy5jb250ZXh0LmJ1aWx0aW5zLmdldE9ubHlNZW1iZXJTeW1ib2woJ0RlcGxveUNvbnN0cnVjdG9yJywgJ3NlbmRlckFkZHJlc3MnKTtcblxuICAgICAgaWYgKHN5bWJvbCA9PT0gc2VuZGVyQWRkcmVzcykge1xuICAgICAgICBjb25zdCBzZW5kZXI6IFNlbmRlckFkZHJlc3NBQklEZWZhdWx0ID0geyB0eXBlOiAnc2VuZGVyJyB9O1xuXG4gICAgICAgIHJldHVybiB7IC4uLnBhcmFtZXRlciwgZGVmYXVsdDogc2VuZGVyIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtZXRlcjtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tMYXN0UGFyYW0ocGFyYW1ldGVyczogUmVhZG9ubHlBcnJheTx0cy5TeW1ib2w+LCB2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tMYXN0UGFyYW1CYXNlKHBhcmFtZXRlcnMsIChkZWNsLCB0eXBlKSA9PiB0aGlzLmNvbnRleHQuYnVpbHRpbnMuaXNJbnRlcmZhY2UoZGVjbCwgdHlwZSwgdmFsdWUpKTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tMYXN0UGFyYW1CYXNlKFxuICAgIHBhcmFtZXRlcnM6IFJlYWRvbmx5QXJyYXk8dHMuU3ltYm9sPixcbiAgICBjaGVja1BhcmFtVHlwZTogKGRlY2w6IHRzLk5vZGUsIHR5cGU6IHRzLlR5cGUpID0+IGJvb2xlYW4sXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGxhc3RQYXJhbSA9IHBhcmFtZXRlcnNbcGFyYW1ldGVycy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBsYXN0UGFyYW1UeXBlID0gdGhpcy5nZXRQYXJhbVN5bWJvbFR5cGUobGFzdFBhcmFtKTtcblxuICAgIHJldHVybiBsYXN0UGFyYW1UeXBlICE9PSB1bmRlZmluZWQgJiYgY2hlY2tQYXJhbVR5cGUodHNVdGlscy5zeW1ib2wuZ2V0RGVjbGFyYXRpb25zKGxhc3RQYXJhbSlbMF0sIGxhc3RQYXJhbVR5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYXJhbVN5bWJvbFR5cGUocGFyYW06IHRzLlN5bWJvbCk6IHRzLlR5cGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGRlY2xzID0gdHNVdGlscy5zeW1ib2wuZ2V0RGVjbGFyYXRpb25zKHBhcmFtKTtcbiAgICBjb25zdCBkZWNsID0gdXRpbHMubnVsbHRocm93cyhkZWNsc1swXSk7XG5cbiAgICByZXR1cm4gdGhpcy5jb250ZXh0LmFuYWx5c2lzLmdldFR5cGVPZlN5bWJvbChwYXJhbSwgZGVjbCk7XG4gIH1cblxuICBwcml2YXRlIHRvQUJJUGFyYW1ldGVyKFxuICAgIG5hbWVJbjogc3RyaW5nLFxuICAgIG5vZGU6IHRzLk5vZGUsXG4gICAgcmVzb2x2ZWRUeXBlSW46IHRzLlR5cGUgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uYWwgPSBmYWxzZSxcbiAgICBvcHRpb25zOiBEaWFnbm9zdGljT3B0aW9ucyA9IERFRkFVTFRfRElBR05PU1RJQ19PUFRJT05TLFxuICApOiBBQklQYXJhbWV0ZXIgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lSW4uc3RhcnRzV2l0aCgnXycpID8gbmFtZUluLnNsaWNlKDEpIDogbmFtZUluO1xuICAgIGxldCByZXNvbHZlZFR5cGUgPSByZXNvbHZlZFR5cGVJbjtcbiAgICBpZiAodHMuaXNQYXJhbWV0ZXIobm9kZSkgJiYgdHNVdGlscy5wYXJhbWV0ZXIuaXNSZXN0UGFyYW1ldGVyKG5vZGUpICYmIHJlc29sdmVkVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXNvbHZlZFR5cGUgPSB0c1V0aWxzLnR5cGVfLmdldFR5cGVBcmd1bWVudHNBcnJheShyZXNvbHZlZFR5cGUpWzBdO1xuICAgIH1cblxuICAgIGNvbnN0IHR5cGUgPSB0b0FCSVJldHVybih0aGlzLmNvbnRleHQsIG5vZGUsIHJlc29sdmVkVHlwZSwgb3B0aW9uYWwsIG9wdGlvbnMpO1xuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKHRzLmlzUGFyYW1ldGVyKG5vZGUpICYmIHRzVXRpbHMucGFyYW1ldGVyLmlzUmVzdFBhcmFtZXRlcihub2RlKSkge1xuICAgICAgcmV0dXJuIHsgLi4udHlwZSwgbmFtZSwgcmVzdDo