UNPKG

@decaf-ts/fabric-weaver

Version:
216 lines 27.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FabricPeerLifecycleChaincodeCommandBuilder = void 0; const logging_1 = require("@decaf-ts/logging"); const fabric_binaries_1 = require("../constants/fabric-binaries.cjs"); const fabric_peer_1 = require("../constants/fabric-peer.cjs"); const child_process_1 = require("../../utils/child-process.cjs"); class FabricPeerLifecycleChaincodeCommandBuilder { constructor(logger) { this.binName = fabric_binaries_1.FabricBinaries.PEER; this.baseCommand = fabric_peer_1.PeerCommands.LIFECYCLE_CHAINCODE; this.command = fabric_peer_1.PeerLifecycleChaincodeCommands.PACKAGE; this.peerDetails = {}; this.args = []; if (!logger) this.log = logging_1.Logging.for(FabricPeerLifecycleChaincodeCommandBuilder); else this.log = logger.for(FabricPeerLifecycleChaincodeCommandBuilder.name); } setCommand(command) { if (command !== undefined) { this.log.debug(`Setting command to ${command}`); this.command = command; } return this; } setDestination(destination) { if (destination !== undefined) { this.log.debug(`Setting contract destination to ${destination}`); this.destination = destination; } return this; } setContractPath(contractPath) { if (contractPath !== undefined) { this.log.debug(`Setting contract path to ${contractPath}`); this.args.push(`--path ${contractPath}`); } return this; } setLang(lang) { if (lang !== undefined) { this.log.debug(`Setting contract language to ${lang}`); this.args.push(`--lang ${lang}`); } return this; } setLabel(label) { if (label !== undefined) { this.log.debug(`Setting contract label to ${label}`); this.args.push(`--label ${label}`); } return this; } setOrdererAddress(ordererAddress) { if (ordererAddress !== undefined) { this.log.debug(`Setting orderer address to ${ordererAddress}`); this.args.push(`--orderer ${ordererAddress}`); } return this; } setChannelID(channelID) { if (channelID !== undefined) { this.log.debug(`Setting channel ID to ${channelID}`); this.args.push(`--channelID ${channelID}`); } return this; } setContractName(contractName) { if (contractName !== undefined) { this.log.debug(`Setting contract name to ${contractName}`); this.args.push(`--name ${contractName}`); } return this; } setVersion(version) { if (version !== undefined) { this.log.debug(`Setting contract version to ${version}`); this.args.push(`--version ${version}`); } return this; } setPackageID(packageID) { if (packageID !== undefined) { this.log.debug(`Setting contract package ID to ${packageID}`); this.args.push(`--package-id ${packageID}`); } return this; } setSequence(sequence) { if (sequence !== undefined) { this.log.debug(`Setting contract sequence to ${sequence}`); this.args.push(`--sequence ${sequence}`); } return this; } enableTLS(enable) { if (enable !== undefined && enable === true) { this.log.debug(`Setting TLS enabled: ${enable}`); this.args.push("--tls"); } return this; } setTLSCAFile(caFile) { if (caFile !== undefined) { this.log.debug(`Setting TLS CA file: ${caFile}`); this.args.push(`--cafile ${caFile}`); } return this; } setOrdererTLSHostnameOverride(ordererTLSHostnameOverride) { if (ordererTLSHostnameOverride !== undefined) { this.log.debug(`Setting orderer TLS hostname override to ${ordererTLSHostnameOverride}`); this.args.push(`--ordererTLSHostnameOverride ${ordererTLSHostnameOverride}`); } return this; } setCollectionsConfigPath(collectionsConfigPath) { if (collectionsConfigPath !== undefined) { this.log.debug(`Setting collection configuration path to ${collectionsConfigPath}`); this.args.push(`--collections-config ${collectionsConfigPath}`); } return this; } setPeerAddresses(peerAddresses) { if (peerAddresses !== undefined && Array.isArray(peerAddresses) && peerAddresses.length > 0) { this.log.debug(`Setting peer addresses: ${peerAddresses.join(", ")}`); this.peerDetails.peerAddresses = peerAddresses; } return this; } setPeerTLSRoots(peerTLSRoots) { if (peerTLSRoots !== undefined && Array.isArray(peerTLSRoots) && peerTLSRoots.length > 0) { this.log.debug(`Setting peer TLS roots: ${peerTLSRoots.join(", ")}`); this.peerDetails.peerTLSRoots = peerTLSRoots; } return this; } setOutput(output) { if (output !== undefined) { this.log.debug(`Setting output to ${output}`); this.args.push(`--output ${output}`); } return this; } build() { const command = [ this.getBinary(), this.getBaseCommand(), this.getCommand(), this.destination, ...[...new Set(this.args)], ...(this.generatePeerDetails() || []), ] .filter((item) => item !== undefined && item !== null && item !== "") .join(" "); this.log.debug(`Built command: ${command}`); return command; } getBaseCommand() { return this.baseCommand; } getCommand() { return this.command; } getBinary() { return this.binName; } getArgs() { return [...new Set(this.args)]; } generatePeerDetails() { const peerAddresses = this.peerDetails.peerAddresses || undefined; const peerTLSRoots = this.peerDetails.peerTLSRoots || undefined; this.log.info(`Generating peer details: ${peerAddresses}, ${peerTLSRoots}...`); if (peerAddresses !== undefined && Array.isArray(peerAddresses) && peerAddresses.length > 0) { const peerCommands = peerAddresses.map((address, i) => { let str = `--peerAddresses ${address}`; if (peerTLSRoots !== undefined && Array.isArray(peerTLSRoots)) { str += ` --tlsRootCertFiles ${peerTLSRoots[i]}`; } return str; }); this.log.info(`Generated peer details: ${peerCommands}`); return peerCommands; } return undefined; } async execute(options) { const bin = this.getBinary(); const argz = [ this.getBaseCommand(), this.getCommand(), this.destination, ...this.getArgs(), ...(this.generatePeerDetails() || []), ].filter((item) => item !== undefined && item !== null && item !== ""); try { // const regex = /\[\s*INFO\s*\] Listening on http/; // can be used as a promise but to lock the logs running as execsync return (await (0, child_process_1.runCommand)(bin, argz, options)); } catch (error) { this.log.error(`Error: Failed to execute the command: ${error}`); process.exit(1); } } } exports.FabricPeerLifecycleChaincodeCommandBuilder = FabricPeerLifecycleChaincodeCommandBuilder; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFicmljLXBlZXItbGlmZWN5Y2xlLWNoYWluY29kZS1jb21tYW5kLWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmFicmljL3BlZXIvZmFicmljLXBlZXItbGlmZWN5Y2xlLWNoYWluY29kZS1jb21tYW5kLWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0NBQW9EO0FBQ3BELGtFQUE4RDtBQUM5RCwwREFHa0M7QUFDbEMsNkRBQXVEO0FBRXZELE1BQWEsMENBQTBDO0lBZXJELFlBQVksTUFBZTtRQVpuQixZQUFPLEdBQW1CLGdDQUFjLENBQUMsSUFBSSxDQUFDO1FBQzlDLGdCQUFXLEdBQUcsMEJBQVksQ0FBQyxtQkFBbUIsQ0FBQztRQUUvQyxZQUFPLEdBQUcsNENBQThCLENBQUMsT0FBTyxDQUFDO1FBSWpELGdCQUFXLEdBQ2pCLEVBQUUsQ0FBQztRQUVHLFNBQUksR0FBYSxFQUFFLENBQUM7UUFHMUIsSUFBSSxDQUFDLE1BQU07WUFDVCxJQUFJLENBQUMsR0FBRyxHQUFHLGlCQUFPLENBQUMsR0FBRyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7O1lBQ2hFLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQywwQ0FBMEMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQsVUFBVSxDQUFDLE9BQXdDO1FBQ2pELElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHNCQUFzQixPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3pCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxjQUFjLENBQUMsV0FBb0I7UUFDakMsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLEdB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RztZQUNYLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDckIsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNqQixJQUFJLENBQUMsV0FBVztZQUNoQixHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDakIsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUN0QyxDQUFDLE1BQU0sQ0FDTixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLENBQ2pELENBQUM7UUFFZCxJQUFJLENBQUM7WUFDSCxvREFBb0Q7WUFDcEQsb0VBQW9FO1lBQ3BFLE9BQU8sQ0FBQyxNQUFNLElBQUEsMEJBQVUsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUE2QixDQUFDO1FBQzVFLENBQUM7UUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLHlDQUF5QyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXRRRCxnR0FzUUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2dnZXIsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEZhYnJpY0JpbmFyaWVzIH0gZnJvbSBcIi4uL2NvbnN0YW50cy9mYWJyaWMtYmluYXJpZXNcIjtcbmltcG9ydCB7XG4gIFBlZXJDb21tYW5kcyxcbiAgUGVlckxpZmVjeWNsZUNoYWluY29kZUNvbW1hbmRzLFxufSBmcm9tIFwiLi4vY29uc3RhbnRzL2ZhYnJpYy1wZWVyXCI7XG5pbXBvcnQgeyBydW5Db21tYW5kIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2NoaWxkLXByb2Nlc3NcIjtcblxuZXhwb3J0IGNsYXNzIEZhYnJpY1BlZXJMaWZlY3ljbGVDaGFpbmNvZGVDb21tYW5kQnVpbGRlciB7XG4gIHByaXZhdGUgbG9nOiBMb2dnZXI7XG5cbiAgcHJpdmF0ZSBiaW5OYW1lOiBGYWJyaWNCaW5hcmllcyA9IEZhYnJpY0JpbmFyaWVzLlBFRVI7XG4gIHByaXZhdGUgYmFzZUNvbW1hbmQgPSBQZWVyQ29tbWFuZHMuTElGRUNZQ0xFX0NIQUlOQ09ERTtcblxuICBwcml2YXRlIGNvbW1hbmQgPSBQZWVyTGlmZWN5Y2xlQ2hhaW5jb2RlQ29tbWFuZHMuUEFDS0FHRTtcblxuICBwcml2YXRlIGRlc3RpbmF0aW9uPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgcGVlckRldGFpbHM6IHsgcGVlckFkZHJlc3Nlcz86IHN0cmluZ1tdOyBwZWVyVExTUm9vdHM/OiBzdHJpbmdbXSB9ID1cbiAgICB7fTtcblxuICBwcml2YXRlIGFyZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3RydWN0b3IobG9nZ2VyPzogTG9nZ2VyKSB7XG4gICAgaWYgKCFsb2dnZXIpXG4gICAgICB0aGlzLmxvZyA9IExvZ2dpbmcuZm9yKEZhYnJpY1BlZXJMaWZlY3ljbGVDaGFpbmNvZGVDb21tYW5kQnVpbGRlcik7XG4gICAgZWxzZSB0aGlzLmxvZyA9IGxvZ2dlci5mb3IoRmFicmljUGVlckxpZmVjeWNsZUNoYWluY29kZUNvbW1hbmRCdWlsZGVyLm5hbWUpO1xuICB9XG5cbiAgc2V0Q29tbWFuZChjb21tYW5kPzogUGVlckxpZmVjeWNsZUNoYWluY29kZUNvbW1hbmRzKTogdGhpcyB7XG4gICAgaWYgKGNvbW1hbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY29tbWFuZCB0byAke2NvbW1hbmR9YCk7XG4gICAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldERlc3RpbmF0aW9uKGRlc3RpbmF0aW9uPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGRlc3RpbmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNvbnRyYWN0IGRlc3RpbmF0aW9uIHRvICR7ZGVzdGluYXRpb259YCk7XG4gICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q29udHJhY3RQYXRoKGNvbnRyYWN0UGF0aD86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChjb250cmFjdFBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY29udHJhY3QgcGF0aCB0byAke2NvbnRyYWN0UGF0aH1gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLXBhdGggJHtjb250cmFjdFBhdGh9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TGFuZyhsYW5nPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGxhbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY29udHJhY3QgbGFuZ3VhZ2UgdG8gJHtsYW5nfWApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goYC0tbGFuZyAke2xhbmd9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0TGFiZWwobGFiZWw/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAobGFiZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY29udHJhY3QgbGFiZWwgdG8gJHtsYWJlbH1gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLWxhYmVsICR7bGFiZWx9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0T3JkZXJlckFkZHJlc3Mob3JkZXJlckFkZHJlc3M/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAob3JkZXJlckFkZHJlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgb3JkZXJlciBhZGRyZXNzIHRvICR7b3JkZXJlckFkZHJlc3N9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1vcmRlcmVyICR7b3JkZXJlckFkZHJlc3N9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q2hhbm5lbElEKGNoYW5uZWxJRD86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChjaGFubmVsSUQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgY2hhbm5lbCBJRCB0byAke2NoYW5uZWxJRH1gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLWNoYW5uZWxJRCAke2NoYW5uZWxJRH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRDb250cmFjdE5hbWUoY29udHJhY3ROYW1lPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGNvbnRyYWN0TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjb250cmFjdCBuYW1lIHRvICR7Y29udHJhY3ROYW1lfWApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goYC0tbmFtZSAke2NvbnRyYWN0TmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRWZXJzaW9uKHZlcnNpb24/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAodmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBjb250cmFjdCB2ZXJzaW9uIHRvICR7dmVyc2lvbn1gKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKGAtLXZlcnNpb24gJHt2ZXJzaW9ufWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFBhY2thZ2VJRChwYWNrYWdlSUQ/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAocGFja2FnZUlEICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNvbnRyYWN0IHBhY2thZ2UgSUQgdG8gJHtwYWNrYWdlSUR9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1wYWNrYWdlLWlkICR7cGFja2FnZUlEfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFNlcXVlbmNlKHNlcXVlbmNlPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKHNlcXVlbmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZXR0aW5nIGNvbnRyYWN0IHNlcXVlbmNlIHRvICR7c2VxdWVuY2V9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1zZXF1ZW5jZSAke3NlcXVlbmNlfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGVuYWJsZVRMUyhlbmFibGU/OiBib29sZWFuKTogdGhpcyB7XG4gICAgaWYgKGVuYWJsZSAhPT0gdW5kZWZpbmVkICYmIGVuYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgVExTIGVuYWJsZWQ6ICR7ZW5hYmxlfWApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goXCItLXRsc1wiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRUTFNDQUZpbGUoY2FGaWxlPzogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKGNhRmlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBUTFMgQ0EgZmlsZTogJHtjYUZpbGV9YCk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1jYWZpbGUgJHtjYUZpbGV9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0T3JkZXJlclRMU0hvc3RuYW1lT3ZlcnJpZGUob3JkZXJlclRMU0hvc3RuYW1lT3ZlcnJpZGU/OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAob3JkZXJlclRMU0hvc3RuYW1lT3ZlcnJpZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIG9yZGVyZXIgVExTIGhvc3RuYW1lIG92ZXJyaWRlIHRvICR7b3JkZXJlclRMU0hvc3RuYW1lT3ZlcnJpZGV9YFxuICAgICAgKTtcbiAgICAgIHRoaXMuYXJncy5wdXNoKFxuICAgICAgICBgLS1vcmRlcmVyVExTSG9zdG5hbWVPdmVycmlkZSAke29yZGVyZXJUTFNIb3N0bmFtZU92ZXJyaWRlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q29sbGVjdGlvbnNDb25maWdQYXRoKGNvbGxlY3Rpb25zQ29uZmlnUGF0aD86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChjb2xsZWN0aW9uc0NvbmZpZ1BhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoXG4gICAgICAgIGBTZXR0aW5nIGNvbGxlY3Rpb24gY29uZmlndXJhdGlvbiBwYXRoIHRvICR7Y29sbGVjdGlvbnNDb25maWdQYXRofWBcbiAgICAgICk7XG4gICAgICB0aGlzLmFyZ3MucHVzaChgLS1jb2xsZWN0aW9ucy1jb25maWcgJHtjb2xsZWN0aW9uc0NvbmZpZ1BhdGh9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0UGVlckFkZHJlc3NlcyhwZWVyQWRkcmVzc2VzPzogc3RyaW5nW10pOiB0aGlzIHtcbiAgICBpZiAoXG4gICAgICBwZWVyQWRkcmVzc2VzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkocGVlckFkZHJlc3NlcykgJiZcbiAgICAgIHBlZXJBZGRyZXNzZXMubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgcGVlciBhZGRyZXNzZXM6ICR7cGVlckFkZHJlc3Nlcy5qb2luKFwiLCBcIil9YCk7XG4gICAgICB0aGlzLnBlZXJEZXRhaWxzLnBlZXJBZGRyZXNzZXMgPSBwZWVyQWRkcmVzc2VzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldFBlZXJUTFNSb290cyhwZWVyVExTUm9vdHM/OiBzdHJpbmdbXSk6IHRoaXMge1xuICAgIGlmIChcbiAgICAgIHBlZXJUTFNSb290cyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBBcnJheS5pc0FycmF5KHBlZXJUTFNSb290cykgJiZcbiAgICAgIHBlZXJUTFNSb290cy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2V0dGluZyBwZWVyIFRMUyByb290czogJHtwZWVyVExTUm9vdHMuam9pbihcIiwgXCIpfWApO1xuICAgICAgdGhpcy5wZWVyRGV0YWlscy5wZWVyVExTUm9vdHMgPSBwZWVyVExTUm9vdHM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0T3V0cHV0KG91dHB1dD86IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChvdXRwdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNldHRpbmcgb3V0cHV0IHRvICR7b3V0cHV0fWApO1xuICAgICAgdGhpcy5hcmdzLnB1c2goYC0tb3V0cHV0ICR7b3V0cHV0fWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGJ1aWxkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgY29tbWFuZDogc3RyaW5nID0gW1xuICAgICAgdGhpcy5nZXRCaW5hcnkoKSxcbiAgICAgIHRoaXMuZ2V0QmFzZUNvbW1hbmQoKSxcbiAgICAgIHRoaXMuZ2V0Q29tbWFuZCgpLFxuICAgICAgdGhpcy5kZXN0aW5hdGlvbixcbiAgICAgIC4uLlsuLi5uZXcgU2V0KHRoaXMuYXJncyldLFxuICAgICAgLi4uKHRoaXMuZ2VuZXJhdGVQZWVyRGV0YWlscygpIHx8IFtdKSxcbiAgICBdXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQgJiYgaXRlbSAhPT0gbnVsbCAmJiBpdGVtICE9PSBcIlwiKVxuICAgICAgLmpvaW4oXCIgXCIpO1xuXG4gICAgdGhpcy5sb2cuZGVidWcoYEJ1aWx0IGNvbW1hbmQ6ICR7Y29tbWFuZH1gKTtcbiAgICByZXR1cm4gY29tbWFuZDtcbiAgfVxuXG4gIGdldEJhc2VDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUNvbW1hbmQ7XG4gIH1cblxuICBnZXRDb21tYW5kKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29tbWFuZDtcbiAgfVxuXG4gIGdldEJpbmFyeSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJpbk5hbWU7XG4gIH1cblxuICBnZXRBcmdzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQodGhpcy5hcmdzKV07XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlUGVlckRldGFpbHMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBlZXJBZGRyZXNzZXMgPSB0aGlzLnBlZXJEZXRhaWxzLnBlZXJBZGRyZXNzZXMgfHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBlZXJUTFNSb290cyA9IHRoaXMucGVlckRldGFpbHMucGVlclRMU1Jvb3RzIHx8IHVuZGVmaW5lZDtcblxuICAgIHRoaXMubG9nLmluZm8oXG4gICAgICBgR2VuZXJhdGluZyBwZWVyIGRldGFpbHM6ICR7cGVlckFkZHJlc3Nlc30sICR7cGVlclRMU1Jvb3RzfS4uLmBcbiAgICApO1xuICAgIGlmIChcbiAgICAgIHBlZXJBZGRyZXNzZXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgQXJyYXkuaXNBcnJheShwZWVyQWRkcmVzc2VzKSAmJlxuICAgICAgcGVlckFkZHJlc3Nlcy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBjb25zdCBwZWVyQ29tbWFuZHMgPSBwZWVyQWRkcmVzc2VzLm1hcCgoYWRkcmVzcywgaSkgPT4ge1xuICAgICAgICBsZXQgc3RyID0gYC0tcGVlckFkZHJlc3NlcyAke2FkZHJlc3N9YDtcblxuICAgICAgICBpZiAocGVlclRMU1Jvb3RzICE9PSB1bmRlZmluZWQgJiYgQXJyYXkuaXNBcnJheShwZWVyVExTUm9vdHMpKSB7XG4gICAgICAgICAgc3RyICs9IGAgLS10bHNSb290Q2VydEZpbGVzICR7cGVlclRMU1Jvb3RzW2ldfWA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RyO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMubG9nLmluZm8oYEdlbmVyYXRlZCBwZWVyIGRldGFpbHM6ICR7cGVlckNvbW1hbmRzfWApO1xuXG4gICAgICByZXR1cm4gcGVlckNvbW1hbmRzO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBhc3luYyBleGVjdXRlKG9wdGlvbnM/OiB7IFtpbmRleGVyOiBzdHJpbmddOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJpbiA9IHRoaXMuZ2V0QmluYXJ5KCk7XG4gICAgY29uc3QgYXJneiA9IFtcbiAgICAgIHRoaXMuZ2V0QmFzZUNvbW1hbmQoKSxcbiAgICAgIHRoaXMuZ2V0Q29tbWFuZCgpLFxuICAgICAgdGhpcy5kZXN0aW5hdGlvbixcbiAgICAgIC4uLnRoaXMuZ2V0QXJncygpLFxuICAgICAgLi4uKHRoaXMuZ2VuZXJhdGVQZWVyRGV0YWlscygpIHx8IFtdKSxcbiAgICBdLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQgJiYgaXRlbSAhPT0gbnVsbCAmJiBpdGVtICE9PSBcIlwiXG4gICAgKSBhcyBzdHJpbmdbXTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBjb25zdCByZWdleCA9IC9cXFtcXHMqSU5GT1xccypcXF0gTGlzdGVuaW5nIG9uIGh0dHAvO1xuICAgICAgLy8gY2FuIGJlIHVzZWQgYXMgYSBwcm9taXNlIGJ1dCB0byBsb2NrIHRoZSBsb2dzIHJ1bm5pbmcgYXMgZXhlY3N5bmNcbiAgICAgIHJldHVybiAoYXdhaXQgcnVuQ29tbWFuZChiaW4sIGFyZ3osIG9wdGlvbnMpKSBhcyB1bmtub3duIGFzIFByb21pc2U8dm9pZD47XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKGBFcnJvcjogRmFpbGVkIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQ6ICR7ZXJyb3J9YCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59XG4iXX0=