@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
402 lines (401 loc) • 76.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 constants_1 = require("../compile/constants");
const types_1 = require("../compile/helper/types");
const constants_2 = require("../constants");
const DiagnosticCode_1 = require("../DiagnosticCode");
const DiagnosticMessage_1 = require("../DiagnosticMessage");
const utils_2 = require("../utils");
class ContractInfoProcessor {
constructor(context, smartContract) {
this.context = context;
this.smartContract = smartContract;
}
process() {
if (ts_utils_1.tsUtils.modifier.isAbstract(this.smartContract)) {
this.context.reportError(this.smartContract, DiagnosticCode_1.DiagnosticCode.InvalidContract, DiagnosticMessage_1.DiagnosticMessage.InvalidContractAbstract);
}
const result = this.processClass(this.smartContract, this.context.analysis.getType(this.smartContract));
const hasReceive = result.propInfos.some((propInfo) => propInfo.type === 'function' && propInfo.receive);
const refundAssets = hasReceive
? {
type: 'refundAssets',
name: constants_2.ContractPropertyName.refundAssets,
classDecl: this.smartContract,
isPublic: true,
}
: undefined;
const hasSend = result.propInfos.some((propInfo) => propInfo.type === 'function' && propInfo.send);
const completeSend = hasSend
? {
type: 'completeSend',
name: constants_2.ContractPropertyName.completeSend,
classDecl: this.smartContract,
isPublic: true,
}
: undefined;
const approveUpgrade = this.getApproveUpgradeDecl(result);
const upgrade = approveUpgrade !== undefined
? {
type: 'upgrade',
name: constants_2.ContractPropertyName.upgrade,
classDecl: this.smartContract,
isPublic: true,
approveUpgrade,
}
: undefined;
const finalPropInfos = result.propInfos.concat([refundAssets, completeSend, upgrade].filter(utils_1.utils.notNull));
if (this.hasDeployInfo(result)) {
return Object.assign({}, result, { propInfos: finalPropInfos });
}
return Object.assign({}, result, { propInfos: finalPropInfos.concat([
{
type: 'deploy',
name: constants_2.ContractPropertyName.deploy,
classDecl: this.smartContract,
isPublic: true,
isMixinDeploy: false,
},
]) });
}
processClass(classDecl, classType, baseTypes = []) {
if (classType === undefined) {
return { smartContract: classDecl, propInfos: [] };
}
ts_utils_1.tsUtils.class_
.getStaticMembers(classDecl)
.map((member) => ts_utils_1.tsUtils.modifier.getStaticKeyword(member))
.filter(utils_1.utils.notNull)
.forEach((keyword) => {
this.context.reportError(keyword, DiagnosticCode_1.DiagnosticCode.InvalidContractMethod, DiagnosticMessage_1.DiagnosticMessage.InvalidContractPropertyOrMethodStatic);
});
lodash_1.default.flatten(ts_utils_1.tsUtils.class_.getMembers(classDecl).map((member) => ts_utils_1.tsUtils.decoratable.getDecoratorsArray(member)))
.filter((decorator) => !this.isValidDecorator(decorator))
.forEach((decorator) => {
this.context.reportError(decorator, DiagnosticCode_1.DiagnosticCode.UnsupportedSyntax, DiagnosticMessage_1.DiagnosticMessage.UnsupportedDecorator);
});
lodash_1.default.flatten(ts_utils_1.tsUtils.class_
.getMethods(classDecl)
.map((method) => lodash_1.default.flatten(ts_utils_1.tsUtils.parametered.getParameters(method).map((param) => ts_utils_1.tsUtils.decoratable.getDecoratorsArray(param)))))
.filter((decorator) => !this.isValidDecorator(decorator))
.forEach((decorator) => {
this.context.reportError(decorator, DiagnosticCode_1.DiagnosticCode.UnsupportedSyntax, DiagnosticMessage_1.DiagnosticMessage.UnsupportedDecorator);
});
lodash_1.default.flatten(ts_utils_1.tsUtils.class_
.getSetAccessors(classDecl)
.map((method) => lodash_1.default.flatten(ts_utils_1.tsUtils.parametered.getParameters(method).map((param) => ts_utils_1.tsUtils.decoratable.getDecoratorsArray(param)))))
.filter((decorator) => !this.isValidDecorator(decorator))
.forEach((decorator) => {
this.context.reportError(decorator, DiagnosticCode_1.DiagnosticCode.UnsupportedSyntax, DiagnosticMessage_1.DiagnosticMessage.UnsupportedDecorator);
});
let propInfos = ts_utils_1.tsUtils.type_
.getProperties(classType)
.map((symbol) => this.processProperty(symbol))
.filter(utils_1.utils.notNull);
const ctor = ts_utils_1.tsUtils.class_.getConcreteConstructor(classDecl);
const ctorType = ctor === undefined
? undefined
: this.context.analysis.getTypeOfSymbol(this.context.analysis.getSymbol(ctor.parent), ctor.parent);
if (ctor !== undefined && ctorType !== undefined) {
const callSignatures = ctorType.getConstructSignatures();
if (callSignatures.length !== 1) {
this.context.reportError(ctor, DiagnosticCode_1.DiagnosticCode.InvalidContractMethod, DiagnosticMessage_1.DiagnosticMessage.InvalidContractMethodMultipleSignatures);
}
const callSignature = callSignatures[0];
const maybeFunc = ts_utils_1.tsUtils.node.getFirstAncestorByTest(ctor, (value) => typescript_1.default.isFunctionDeclaration(value) || typescript_1.default.isFunctionExpression(value));
propInfos = propInfos.concat([
{
type: 'deploy',
name: constants_2.ContractPropertyName.deploy,
classDecl,
decl: ctor,
isPublic: true,
callSignature,
isMixinDeploy: maybeFunc !== undefined && this.context.analysis.isSmartContractMixinFunction(maybeFunc),
},
]);
}
const extend = ts_utils_1.tsUtils.class_.getExtends(classDecl);
let superSmartContract;
if (extend !== undefined) {
let baseType = baseTypes[0];
let nextBaseTypes = baseTypes.slice(1);
if (baseTypes.length === 0) {
const currentBaseTypes = ts_utils_1.tsUtils.class_.getBaseTypesFlattened(this.context.typeChecker, classDecl);
baseType = currentBaseTypes[0];
nextBaseTypes = currentBaseTypes.slice(1);
}
if (baseType !== undefined) {
const baseSymbol = this.context.analysis.getSymbolForType(classDecl, baseType);
if (baseSymbol !== undefined) {
const decls = ts_utils_1.tsUtils.symbol.getDeclarations(baseSymbol);
const decl = decls[0];
if (decls.length === 1 &&
(typescript_1.default.isClassDeclaration(decl) || typescript_1.default.isClassExpression(decl)) &&
!this.context.builtins.isValue(decl, 'SmartContract')) {
superSmartContract = this.processClass(decl, baseType, nextBaseTypes);
}
}
}
}
const contractInfo = { smartContract: classDecl, propInfos, superSmartContract };
if (contractInfo.propInfos.every((propInfo) => propInfo.type !== 'deploy') &&
contractInfo.propInfos.some((propInfo) => propInfo.type === 'property' && ts_utils_1.tsUtils.initializer.getInitializer(propInfo.decl) !== undefined)) {
return Object.assign({}, contractInfo, { propInfos: contractInfo.propInfos.concat([
{
type: 'deploy',
name: constants_2.ContractPropertyName.deploy,
classDecl: this.smartContract,
isPublic: true,
isMixinDeploy: false,
},
]) });
}
return contractInfo;
}
processProperty(symbol) {
const decls = ts_utils_1.tsUtils.symbol.getDeclarations(symbol);
const implDecls = decls.filter((symbolDecl) => (!(typescript_1.default.isMethodDeclaration(symbolDecl) || typescript_1.default.isConstructorDeclaration(symbolDecl)) ||
ts_utils_1.tsUtils.overload.isImplementation(symbolDecl)) &&
(!typescript_1.default.isPropertyDeclaration(symbolDecl) || !ts_utils_1.tsUtils.modifier.isAbstract(symbolDecl)));
const decl = implDecls.length > 0 ? implDecls[0] : decls[0];
if (decl === undefined ||
!(typescript_1.default.isMethodDeclaration(decl) ||
typescript_1.default.isPropertyDeclaration(decl) ||
typescript_1.default.isGetAccessorDeclaration(decl) ||
typescript_1.default.isSetAccessorDeclaration(decl) ||
typescript_1.default.isParameterPropertyDeclaration(decl))) {
return undefined;
}
const nameNode = ts_utils_1.tsUtils.node.getNameNode(decl);
if (!typescript_1.default.isIdentifier(nameNode)) {
this.context.reportError(nameNode, DiagnosticCode_1.DiagnosticCode.InvalidContractProperty, DiagnosticMessage_1.DiagnosticMessage.InvalidContractPropertyIdentifier);
return undefined;
}
const name = ts_utils_1.tsUtils.symbol.getName(symbol);
if (constants_2.IGNORED_PROPERTIES.has(name)) {
return undefined;
}
if (constants_2.BUILTIN_PROPERTIES.has(name)) {
const memberSymbol = this.context.builtins.getOnlyMemberSymbol('SmartContract', name);
if (symbol !== memberSymbol) {
this.context.reportError(nameNode, DiagnosticCode_1.DiagnosticCode.InvalidContractProperty, DiagnosticMessage_1.DiagnosticMessage.InvalidContractPropertyReserved, name);
}
return undefined;
}
if (constants_2.RESERVED_PROPERTIES.has(name)) {
const valueSymbol = this.context.builtins.getValueSymbol('SmartContract');
const memberSymbol = ts_utils_1.tsUtils.symbol.getMemberOrThrow(valueSymbol, name);
if (ts_utils_1.tsUtils.symbol.getTarget(symbol) !== memberSymbol) {
this.context.reportError(nameNode, DiagnosticCode_1.DiagnosticCode.InvalidContractProperty, DiagnosticMessage_1.DiagnosticMessage.InvalidContractPropertyReserved, name);
}
return undefined;
}
if (constants_2.VIRTUAL_PROPERTIES.has(name)) {
this.context.reportError(nameNode, DiagnosticCode_1.DiagnosticCode.InvalidContractMethod, DiagnosticMessage_1.DiagnosticMessage.InvalidContractMethodReserved, name);
return undefined;
}
const type = this.context.analysis.getTypeOfSymbol(symbol, decl);
if (type === undefined) {
return undefined;
}
const maybeClassDecl = ts_utils_1.tsUtils.node.getFirstAncestorByTest(decl, typescript_1.default.isClassDeclaration);
const maybeClassExpr = ts_utils_1.tsUtils.node.getFirstAncestorByTest(decl, typescript_1.default.isClassExpression);
const classDecl = maybeClassDecl === undefined ? maybeClassExpr : maybeClassDecl;
if (classDecl === undefined) {
this.context.reportUnsupported(decl);
return undefined;
}
const isPublic = ts_utils_1.tsUtils.modifier.isPublic(decl);
if (typescript_1.default.isGetAccessorDeclaration(decl) || typescript_1.default.isSetAccessorDeclaration(decl)) {
const getDecl = typescript_1.default.isGetAccessorDeclaration(decl) ? decl : ts_utils_1.tsUtils.accessor.getGetAccessor(decl);
const setDecl = typescript_1.default.isSetAccessorDeclaration(decl) ? decl : ts_utils_1.tsUtils.accessor.getSetAccessor(decl);
return {
type: 'accessor',
symbol: ts_utils_1.tsUtils.symbol.getTarget(symbol),
name: ts_utils_1.tsUtils.node.getName(decl),
classDecl,
getter: getDecl === undefined
? undefined
: {
name: ts_utils_1.tsUtils.node.getName(getDecl),
decl: getDecl,
constant: this.hasConstant(getDecl),
},
setter: setDecl === undefined
? undefined
: {
name: utils_2.getSetterName(ts_utils_1.tsUtils.node.getName(setDecl)),
decl: setDecl,
},
isPublic,
propertyType: type,
};
}
let callSignatures = type.getCallSignatures();
if (typescript_1.default.isMethodDeclaration(decl) || (typescript_1.default.isPropertyDeclaration(decl) && callSignatures.length > 0)) {
if (callSignatures.length > 1) {
callSignatures = callSignatures.filter((signature) => !ts_utils_1.tsUtils.modifier.isAbstract(signature.getDeclaration()));
}
if (callSignatures.length > 1) {
this.context.reportError(decl, DiagnosticCode_1.DiagnosticCode.InvalidContractMethod, DiagnosticMessage_1.DiagnosticMessage.InvalidContractMethodMultipleSignatures);
}
if (callSignatures.length === 0) {
return undefined;
}
if (typescript_1.default.isPropertyDeclaration(decl)) {
const initializerProp = ts_utils_1.tsUtils.initializer.getInitializer(decl);
const isReadonlyProp = ts_utils_1.tsUtils.modifier.isReadonly(decl);
if (initializerProp === undefined || ts_utils_1.tsUtils.type_.getCallSignatures(type).length === 0 || !isReadonlyProp) {
this.context.reportError(decl, DiagnosticCode_1.DiagnosticCode.InvalidContractStorageType, DiagnosticMessage_1.DiagnosticMessage.InvalidContractStorageType);
return undefined;
}
}
const callSignature = callSignatures[0];
const send = this.hasSend(decl);
const sendUnsafe = this.hasSendUnsafe(decl);
const receive = this.hasReceive(decl);
const claim = this.hasClaim(decl);
const constant = this.hasConstant(decl);
const isUTXO = send || sendUnsafe || receive || claim;
if (isUTXO && constant) {
const decorator = ts_utils_1.tsUtils.decoratable
.getDecoratorsArray(decl)
.find((dec) => this.isDecorator(dec, constants_2.Decorator.constant));
this.context.reportError(decorator === undefined ? decl : decorator, DiagnosticCode_1.DiagnosticCode.InvalidContractMethod, DiagnosticMessage_1.DiagnosticMessage.InvalidContractMethodConstantNative);
return undefined;
}
const returnType = callSignatures.length >= 1 ? ts_utils_1.tsUtils.signature.getReturnType(callSignature) : undefined;
if (claim && returnType !== undefined && !ts_utils_1.tsUtils.type_.isVoid(returnType)) {
const decorator = ts_utils_1.tsUtils.decoratable
.getDecoratorsArray(decl)
.find((dec) => this.isDecorator(dec, constants_2.Decorator.claim));
this.context.reportError(decorator === undefined ? decl : decorator, DiagnosticCode_1.DiagnosticCode.InvalidContractMethod, DiagnosticMessage_1.DiagnosticMessage.InvalidContractMethodNativeReturn);
return undefined;
}
if (isUTXO && callSignatures.length >= 1) {
const signatureTypes = this.context.analysis.extractSignatureTypes(decl, callSignatures[0]);
if (signatureTypes !== undefined) {
const invalidParams = signatureTypes.paramDecls.filter((param) => {
const paramType = signatureTypes.paramTypes.get(param);
return (paramType !== undefined &&
(types_1.hasForwardValue(this.context, param, paramType) ||
ts_utils_1.tsUtils.type_.hasType(paramType, (tpe) => this.context.builtins.isType(param, tpe, 'ForwardedValue'))));
});
invalidParams.forEach((param) => {
this.context.reportError(param, DiagnosticCode_1.DiagnosticCode.InvalidContractType, DiagnosticMessage_1.DiagnosticMessage.InvalidContractTypeForwardNative);
});
if (invalidParams.length > 0) {
return undefined;
}
}
}
return {
type: 'function',
name: ts_utils_1.tsUtils.node.getName(decl),
classDecl,
symbol: ts_utils_1.tsUtils.symbol.getTarget(symbol),
decl,
send,
sendUnsafe,
receive,
claim,
acceptsClaim: callSignatures.length >= 1 && this.isLastParamClaim(decl, callSignatures[0]),
isPublic,
callSignature,
returnType,
constant,
isAbstract: !ts_utils_1.tsUtils.overload.isImplementation(decl),
};
}
const structuredStorageType = constants_1.STRUCTURED_STORAGE_TYPES.find((testType) => this.context.builtins.isInterface(decl, type, testType));
const isReadonly = ts_utils_1.tsUtils.modifier.isReadonly(decl);
const isAbstract = ts_utils_1.tsUtils.modifier.isAbstract(decl);
const initializer = ts_utils_1.tsUtils.initializer.getInitializer(decl);
if (structuredStorageType !== undefined && (isPublic || isAbstract || !isReadonly || initializer === undefined)) {
this.context.reportError(decl, DiagnosticCode_1.DiagnosticCode.InvalidStructuredStorageFor, DiagnosticMessage_1.DiagnosticMessage.InvalidStructuredStorageForProperty);
return undefined;
}
if (structuredStorageType === undefined && !this.context.analysis.isValidStorageType(decl, type)) {
this.context.reportError(decl, DiagnosticCode_1.DiagnosticCode.InvalidContractStorageType, DiagnosticMessage_1.DiagnosticMessage.InvalidContractStorageType);
return undefined;
}
return {
type: 'property',
symbol: ts_utils_1.tsUtils.symbol.getTarget(symbol),
name: ts_utils_1.tsUtils.node.getName(decl),
classDecl,
decl,
isPublic,
propertyType: type,
isReadonly,
isAbstract,
structuredStorageType,
};
}
hasConstant(decl) {
return this.hasDecorator(decl, constants_2.Decorator.constant);
}
hasSend(decl) {
return this.hasDecorator(decl, constants_2.Decorator.send);
}
hasSendUnsafe(decl) {
return this.hasDecorator(decl, constants_2.Decorator.sendUnsafe);
}
hasReceive(decl) {
return this.hasDecorator(decl, constants_2.Decorator.receive);
}
hasClaim(decl) {
return this.hasDecorator(decl, constants_2.Decorator.claim);
}
hasDecorator(decl, name) {
const decorators = ts_utils_1.tsUtils.decoratable.getDecorators(decl);
return decorators === undefined ? false : decorators.some((decorator) => this.isDecorator(decorator, name));
}
isValidDecorator(decorator) {
return constants_2.DECORATORS_ARRAY.some((valid) => this.isDecorator(decorator, valid));
}
isDecorator(decorator, name) {
return this.context.builtins.isValue(ts_utils_1.tsUtils.expression.getExpression(decorator), name);
}
isLastParamClaim(node, callSignature) {
const signatureTypes = this.context.analysis.extractSignatureTypes(node, callSignature);
if (signatureTypes === undefined) {
return false;
}
if (signatureTypes.paramDecls.length === 0) {
return false;
}
const param = signatureTypes.paramDecls[signatureTypes.paramDecls.length - 1];
const paramType = signatureTypes.paramTypes.get(signatureTypes.paramDecls[signatureTypes.paramDecls.length - 1]);
return paramType !== undefined && this.context.builtins.isInterface(param, paramType, 'ClaimTransaction');
}
hasDeployInfo(contractInfo) {
if (contractInfo.propInfos.some((propInfo) => propInfo.type === 'deploy')) {
return true;
}
const superSmartContract = contractInfo.superSmartContract;
if (superSmartContract === undefined) {
return false;
}
return this.hasDeployInfo(superSmartContract);
}
getApproveUpgradeDecl(contractInfo) {
const propInfo = contractInfo.propInfos.find((info) => info.name === constants_2.ContractPropertyName.approveUpgrade);
if (propInfo !== undefined && propInfo.type === 'function' && ts_utils_1.tsUtils.overload.isImplementation(propInfo.decl)) {
return propInfo.decl;
}
const superSmartContract = contractInfo.superSmartContract;
if (superSmartContract === undefined) {
return undefined;
}
return this.getApproveUpgradeDecl(superSmartContract);
}
}
exports.ContractInfoProcessor = ContractInfoProcessor;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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USxLQUFLLFNBQVMsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLFVBQVUsSUFBSSxrQkFBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDOUcsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1NBQ3RCO1FBRUQsTUFBTSxrQkFBa0IsR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUM7UUFDM0QsSUFBSSxrQkFBa0IsS0FBSyxTQUFTLEVBQUU7WUFDcEMsT0FBTyxTQUFTLENBQUM7U0FDbEI7UUFFRCxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3hELENBQUM7Q0FDRjtBQWhqQkQsc0RBZ2pCQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9jb250cmFjdC9Db250cmFjdEluZm9Qcm9jZXNzb3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDbGFzc0luc3RhbmNlTWVtYmVyVHlwZSwgdHNVdGlscyB9IGZyb20gJ0BuZW8tb25lL3RzLXV0aWxzJztcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSAnQG5lby1vbmUvdXRpbHMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB7IFNUUlVDVFVSRURfU1RPUkFHRV9UWVBFUywgU3RydWN0dXJlZFN0b3JhZ2VUeXBlIH0gZnJvbSAnLi4vY29tcGlsZS9jb25zdGFudHMnO1xuaW1wb3J0IHsgaGFzRm9yd2FyZFZhbHVlIH0gZnJvbSAnLi4vY29tcGlsZS9oZWxwZXIvdHlwZXMnO1xuaW1wb3J0IHtcbiAgQlVJTFRJTl9QUk9QRVJUSUVTLFxuICBDb250cmFjdFByb3BlcnR5TmFtZSxcbiAgRGVjb3JhdG9yLFxuICBERUNPUkFUT1JTX0FSUkFZLFxuICBJR05PUkVEX1BST1BFUlRJRVMsXG4gIFJFU0VSVkVEX1BST1BFUlRJRVMsXG4gIFZJUlRVQUxfUFJPUEVSVElFUyxcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IENvbnRleHQgfSBmcm9tICcuLi9Db250ZXh0JztcbmltcG9ydCB7IERpYWdub3N0aWNDb2RlIH0gZnJvbSAnLi4vRGlhZ25vc3RpY0NvZGUnO1xuaW1wb3J0IHsgRGlhZ25vc3RpY01lc3NhZ2UgfSBmcm9tICcuLi9EaWFnbm9zdGljTWVzc2FnZSc7XG5pbXBvcnQgeyBnZXRTZXR0ZXJOYW1lIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb3BJbmZvQmFzZSB7XG4gIHJlYWRvbmx5IGNsYXNzRGVjbDogdHMuQ2xhc3NEZWNsYXJhdGlvbiB8IHRzLkNsYXNzRXhwcmVzc2lvbjtcbiAgcmVhZG9ubHkgaXNQdWJsaWM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVwbG95UHJvcEluZm8gZXh0ZW5kcyBQcm9wSW5mb0Jhc2Uge1xuICByZWFkb25seSB0eXBlOiAnZGVwbG95JztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBpc01peGluRGVwbG95OiBib29sZWFuO1xuICByZWFkb25seSBkZWNsPzogdHMuQ29uc3RydWN0b3JEZWNsYXJhdGlvbjtcbiAgcmVhZG9ubHkgY2FsbFNpZ25hdHVyZT86IHRzLlNpZ25hdHVyZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWZ1bmRBc3NldHNQcm9wSW5mbyBleHRlbmRzIFByb3BJbmZvQmFzZSB7XG4gIHJlYWRvbmx5IHR5cGU6ICdyZWZ1bmRBc3NldHMnO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGxldGVTZW5kUHJvcEluZm8gZXh0ZW5kcyBQcm9wSW5mb0Jhc2Uge1xuICByZWFkb25seSB0eXBlOiAnY29tcGxldGVTZW5kJztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZ3JhZGVQcm9wSW5mbyBleHRlbmRzIFByb3BJbmZvQmFzZSB7XG4gIHJlYWRvbmx5IHR5cGU6ICd1cGdyYWRlJztcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhcHByb3ZlVXBncmFkZTogdHMuUHJvcGVydHlEZWNsYXJhdGlvbiB8IHRzLk1ldGhvZERlY2xhcmF0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uUHJvcEluZm8gZXh0ZW5kcyBQcm9wSW5mb0Jhc2Uge1xuICByZWFkb25seSB0eXBlOiAnZnVuY3Rpb24nO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN5bWJvbDogdHMuU3ltYm9sO1xuICByZWFkb25seSBkZWNsOiB0cy5Qcm9wZXJ0eURlY2xhcmF0aW9uIHwgdHMuTWV0aG9kRGVjbGFyYXRpb247XG4gIHJlYWRvbmx5IGNhbGxTaWduYXR1cmU6IHRzLlNpZ25hdHVyZSB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgc2VuZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2VuZFVuc2FmZTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmVjZWl2ZTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY2xhaW06IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNvbnN0YW50OiBib29sZWFuO1xuICByZWFkb25seSBhY2NlcHRzQ2xhaW06IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJldHVyblR5cGU6IHRzLlR5cGUgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGlzQWJzdHJhY3Q6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvcGVydHlQcm9wSW5mbyBleHRlbmRzIFByb3BJbmZvQmFzZSB7XG4gIHJlYWRvbmx5IHR5cGU6ICdwcm9wZXJ0eSc7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgc3ltYm9sOiB0cy5TeW1ib2w7XG4gIHJlYWRvbmx5IGRlY2w6IHRzLlByb3BlcnR5RGVjbGFyYXRpb24gfCB0cy5QYXJhbWV0ZXJQcm9wZXJ0eURlY2xhcmF0aW9uO1xuICByZWFkb25seSBwcm9wZXJ0eVR5cGU6IHRzLlR5cGUgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IGlzUmVhZG9ubHk6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzQWJzdHJhY3Q6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHN0cnVjdHVyZWRTdG9yYWdlVHlwZTogU3RydWN0dXJlZFN0b3JhZ2VUeXBlIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjY2Vzc29yUHJvcEluZm8gZXh0ZW5kcyBQcm9wSW5mb0Jhc2Uge1xuICByZWFkb25seSB0eXBlOiAnYWNjZXNzb3InO1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN5bWJvbDogdHMuU3ltYm9sO1xuICByZWFkb25seSBnZXR0ZXI/OiB7XG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGRlY2w6IHRzLkdldEFjY2Vzc29yRGVjbGFyYXRpb247XG4gICAgcmVhZG9ubHkgY29uc3RhbnQ6IGJvb2xlYW47XG4gIH07XG4gIHJlYWRvbmx5IHNldHRlcj86IHtcbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZGVjbDogdHMuU2V0QWNjZXNzb3JEZWNsYXJhdGlvbjtcbiAgfTtcbiAgcmVhZG9ubHkgcHJvcGVydHlUeXBlOiB0cy5UeXBlIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgdHlwZSBQcm9wSW5mbyA9XG4gIHwgUHJvcGVydHlQcm9wSW5mb1xuICB8IEFjY2Vzc29yUHJvcEluZm9cbiAgfCBGdW5jdGlvblByb3BJbmZvXG4gIHwgRGVwbG95UHJvcEluZm9cbiAgfCBSZWZ1bmRBc3NldHNQcm9wSW5mb1xuICB8IFVwZ3JhZGVQcm9wSW5mb1xuICB8IENvbXBsZXRlU2VuZFByb3BJbmZvO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRyYWN0SW5mbyB7XG4gIHJlYWRvbmx5IHNtYXJ0Q29udHJhY3Q6IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB0cy5DbGFzc0V4cHJlc3Npb247XG4gIHJlYWRvbmx5IHByb3BJbmZvczogUmVhZG9ubHlBcnJheTxQcm9wSW5mbz47XG4gIHJlYWRvbmx5IHN1cGVyU21hcnRDb250cmFjdD86IENvbnRyYWN0SW5mbztcbn1cblxuZXhwb3J0IGNsYXNzIENvbn