UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

402 lines (401 loc) 76.5 kB
"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