@dollhousemcp/mcp-server
Version:
DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.
174 lines • 20.7 kB
JavaScript
/**
* Console Reporter - Outputs security audit results to console
* Provides colorized, human-readable output for CLI usage
*/
import chalk from 'chalk';
export class ConsoleReporter {
result;
constructor(result) {
this.result = result;
}
/**
* Generate console output
*/
generate() {
const output = [];
// Header
output.push('');
output.push(chalk.bold.blue('🔒 Security Audit Report'));
output.push(chalk.gray('━'.repeat(60)));
output.push('');
// Summary
output.push(this.getSummary());
output.push('');
// Findings by severity
if (this.result.findings.length > 0) {
output.push(chalk.bold('📋 Findings:'));
output.push('');
const findingsBySeverity = this.groupFindingsBySeverity();
for (const [severity, findings] of Object.entries(findingsBySeverity)) {
if (findings.length > 0) {
output.push(this.formatSeveritySection(severity, findings));
}
}
}
else {
output.push(chalk.green('✅ No security issues found!'));
output.push('');
}
// Errors
if (this.result.errors && this.result.errors.length > 0) {
output.push(chalk.bold.red('❌ Errors:'));
for (const error of this.result.errors) {
output.push(` • ${error}`);
}
output.push('');
}
// Footer
output.push(chalk.gray('━'.repeat(60)));
output.push(chalk.gray(`Scan completed in ${this.result.duration}ms`));
output.push('');
return output.join('\n');
}
/**
* Get summary section
*/
getSummary() {
const summary = this.result.summary;
const output = [];
output.push(chalk.bold('📊 Summary:'));
output.push(` Total findings: ${this.formatCount(summary.total)}`);
output.push(` Files scanned: ${this.result.scannedFiles}`);
output.push('');
output.push(' By severity:');
output.push(` ${this.formatSeverity('critical')}: ${summary.bySeverity.critical}`);
output.push(` ${this.formatSeverity('high')}: ${summary.bySeverity.high}`);
output.push(` ${this.formatSeverity('medium')}: ${summary.bySeverity.medium}`);
output.push(` ${this.formatSeverity('low')}: ${summary.bySeverity.low}`);
output.push(` ${this.formatSeverity('info')}: ${summary.bySeverity.info}`);
return output.join('\n');
}
/**
* Get findings array
*/
getFindings() {
return this.result.findings;
}
/**
* Group findings by severity
*/
groupFindingsBySeverity() {
const grouped = {
critical: [],
high: [],
medium: [],
low: [],
info: []
};
for (const finding of this.result.findings) {
grouped[finding.severity].push(finding);
}
return grouped;
}
/**
* Format a severity section
*/
formatSeveritySection(severity, findings) {
const output = [];
const severityLabel = this.formatSeverity(severity);
output.push(`${severityLabel} (${findings.length})`);
output.push('');
for (const finding of findings) {
output.push(this.formatFinding(finding));
output.push('');
}
return output.join('\n');
}
/**
* Format individual finding
*/
formatFinding(finding) {
const output = [];
const icon = this.getSeverityIcon(finding.severity);
output.push(` ${icon} ${chalk.bold(finding.message)}`);
if (finding.file) {
const location = finding.line ? `${finding.file}:${finding.line}` : finding.file;
output.push(` 📁 ${chalk.cyan(location)}`);
}
if (finding.code) {
output.push(` 📝 ${chalk.gray(finding.code)}`);
}
output.push(` 💡 ${chalk.yellow(finding.remediation)}`);
output.push(` 🏷️ ${chalk.gray(finding.ruleId)} (${finding.confidence} confidence)`);
return output.join('\n');
}
/**
* Format severity label with color
*/
formatSeverity(severity) {
switch (severity) {
case 'critical':
return chalk.bgRed.white(' CRITICAL ');
case 'high':
return chalk.red('HIGH');
case 'medium':
return chalk.yellow('MEDIUM');
case 'low':
return chalk.blue('LOW');
case 'info':
return chalk.gray('INFO');
}
}
/**
* Get icon for severity
*/
getSeverityIcon(severity) {
switch (severity) {
case 'critical':
return '🔴';
case 'high':
return '🟠';
case 'medium':
return '🟡';
case 'low':
return '🔵';
case 'info':
return '⚪';
}
}
/**
* Format count with color
*/
formatCount(count) {
if (count === 0) {
return chalk.green(count.toString());
}
else if (count < 10) {
return chalk.yellow(count.toString());
}
else {
return chalk.red(count.toString());
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uc29sZVJlcG9ydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3NlY3VyaXR5L2F1ZGl0L3JlcG9ydGVycy9Db25zb2xlUmVwb3J0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBR0gsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE1BQU0sT0FBTyxlQUFlO0lBQ2xCLE1BQU0sQ0FBYTtJQUUzQixZQUFZLE1BQWtCO1FBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVE7UUFDTixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFFNUIsU0FBUztRQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUM7UUFDekQsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFaEIsVUFBVTtRQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVoQix1QkFBdUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FB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QUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN2QyxDQUFDO2FBQU0sSUFBSSxLQUFLLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDdEIsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnNvbGUgUmVwb3J0ZXIgLSBPdXRwdXRzIHNlY3VyaXR5IGF1ZGl0IHJlc3VsdHMgdG8gY29uc29sZVxuICogUHJvdmlkZXMgY29sb3JpemVkLCBodW1hbi1yZWFkYWJsZSBvdXRwdXQgZm9yIENMSSB1c2FnZVxuICovXG5cbmltcG9ydCB0eXBlIHsgU2VjdXJpdHlSZXBvcnQsIFNjYW5SZXN1bHQsIFNlY3VyaXR5RmluZGluZywgU2V2ZXJpdHlMZXZlbCB9IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5cbmV4cG9ydCBjbGFzcyBDb25zb2xlUmVwb3J0ZXIgaW1wbGVtZW50cyBTZWN1cml0eVJlcG9ydCB7XG4gIHByaXZhdGUgcmVzdWx0OiBTY2FuUmVzdWx0O1xuXG4gIGNvbnN0cnVjdG9yKHJlc3VsdDogU2NhblJlc3VsdCkge1xuICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGNvbnNvbGUgb3V0cHV0XG4gICAqL1xuICBnZW5lcmF0ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG91dHB1dDogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICAvLyBIZWFkZXJcbiAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgb3V0cHV0LnB1c2goY2hhbGsuYm9sZC5ibHVlKCfwn5SSIFNlY3VyaXR5IEF1ZGl0IFJlcG9ydCcpKTtcbiAgICBvdXRwdXQucHVzaChjaGFsay5ncmF5KCfilIEnLnJlcGVhdCg2MCkpKTtcbiAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgXG4gICAgLy8gU3VtbWFyeVxuICAgIG91dHB1dC5wdXNoKHRoaXMuZ2V0U3VtbWFyeSgpKTtcbiAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgXG4gICAgLy8gRmluZGluZ3MgYnkgc2V2ZXJpdHlcbiAgICBpZiAodGhpcy5yZXN1bHQuZmluZGluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgb3V0cHV0LnB1c2goY2hhbGsuYm9sZCgn8J+TiyBGaW5kaW5nczonKSk7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgICBcbiAgICAgIGNvbnN0IGZpbmRpbmdzQnlTZXZlcml0eSA9IHRoaXMuZ3JvdXBGaW5kaW5nc0J5U2V2ZXJpdHkoKTtcbiAgICAgIFxuICAgICAgZm9yIChjb25zdCBbc2V2ZXJpdHksIGZpbmRpbmdzXSBvZiBPYmplY3QuZW50cmllcyhmaW5kaW5nc0J5U2V2ZXJpdHkpKSB7XG4gICAgICAgIGlmIChmaW5kaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgb3V0cHV0LnB1c2godGhpcy5mb3JtYXRTZXZlcml0eVNlY3Rpb24oc2V2ZXJpdHkgYXMgU2V2ZXJpdHlMZXZlbCwgZmluZGluZ3MpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaChjaGFsay5ncmVlbign4pyFIE5vIHNlY3VyaXR5IGlzc3VlcyBmb3VuZCEnKSk7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIEVycm9yc1xuICAgIGlmICh0aGlzLnJlc3VsdC5lcnJvcnMgJiYgdGhpcy5yZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIG91dHB1dC5wdXNoKGNoYWxrLmJvbGQucmVkKCfinYwgRXJyb3JzOicpKTtcbiAgICAgIGZvciAoY29uc3QgZXJyb3Igb2YgdGhpcy5yZXN1bHQuZXJyb3JzKSB7XG4gICAgICAgIG91dHB1dC5wdXNoKGAgIOKAoiAke2Vycm9yfWApO1xuICAgICAgfVxuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgICBcbiAgICAvLyBGb290ZXJcbiAgICBvdXRwdXQucHVzaChjaGFsay5ncmF5KCfilIEnLnJlcGVhdCg2MCkpKTtcbiAgICBvdXRwdXQucHVzaChjaGFsay5ncmF5KGBTY2FuIGNvbXBsZXRlZCBpbiAke3RoaXMucmVzdWx0LmR1cmF0aW9ufW1zYCkpO1xuICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICBcbiAgICByZXR1cm4gb3V0cHV0LmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdW1tYXJ5IHNlY3Rpb25cbiAgICovXG4gIGdldFN1bW1hcnkoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gdGhpcy5yZXN1bHQuc3VtbWFyeTtcbiAgICBjb25zdCBvdXRwdXQ6IHN0cmluZ1tdID0gW107XG4gICAgXG4gICAgb3V0cHV0LnB1c2goY2hhbGsuYm9sZCgn8J+TiiBTdW1tYXJ5OicpKTtcbiAgICBvdXRwdXQucHVzaChgICBUb3RhbCBmaW5kaW5nczogJHt0aGlzLmZvcm1hdENvdW50KHN1bW1hcnkudG90YWwpfWApO1xuICAgIG91dHB1dC5wdXNoKGAgIEZpbGVzIHNjYW5uZWQ6ICR7dGhpcy5yZXN1bHQuc2Nhbm5lZEZpbGVzfWApO1xuICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICBvdXRwdXQucHVzaCgnICBCeSBzZXZlcml0eTonKTtcbiAgICBvdXRwdXQucHVzaChgICAgICR7dGhpcy5mb3JtYXRTZXZlcml0eSgnY3JpdGljYWwnKX06ICR7c3VtbWFyeS5ieVNldmVyaXR5LmNyaXRpY2FsfWApO1xuICAgIG91dHB1dC5wdXNoKGAgICAgJHt0aGlzLmZvcm1hdFNldmVyaXR5KCdoaWdoJyl9OiAke3N1bW1hcnkuYnlTZXZlcml0eS5oaWdofWApO1xuICAgIG91dHB1dC5wdXNoKGAgICAgJHt0aGlzLmZvcm1hdFNldmVyaXR5KCdtZWRpdW0nKX06ICR7c3VtbWFyeS5ieVNldmVyaXR5Lm1lZGl1bX1gKTtcbiAgICBvdXRwdXQucHVzaChgICAgICR7dGhpcy5mb3JtYXRTZXZlcml0eSgnbG93Jyl9OiAke3N1bW1hcnkuYnlTZXZlcml0eS5sb3d9YCk7XG4gICAgb3V0cHV0LnB1c2goYCAgICAke3RoaXMuZm9ybWF0U2V2ZXJpdHkoJ2luZm8nKX06ICR7c3VtbWFyeS5ieVNldmVyaXR5LmluZm99YCk7XG4gICAgXG4gICAgcmV0dXJuIG91dHB1dC5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZmluZGluZ3MgYXJyYXlcbiAgICovXG4gIGdldEZpbmRpbmdzKCk6IFNlY3VyaXR5RmluZGluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5yZXN1bHQuZmluZGluZ3M7XG4gIH1cblxuICAvKipcbiAgICogR3JvdXAgZmluZGluZ3MgYnkgc2V2ZXJpdHlcbiAgICovXG4gIHByaXZhdGUgZ3JvdXBGaW5kaW5nc0J5U2V2ZXJpdHkoKTogUmVjb3JkPFNldmVyaXR5TGV2ZWwsIFNlY3VyaXR5RmluZGluZ1tdPiB7XG4gICAgY29uc3QgZ3JvdXBlZDogUmVjb3JkPFNldmVyaXR5TGV2ZWwsIFNlY3VyaXR5RmluZGluZ1tdPiA9IHtcbiAgICAgIGNyaXRpY2FsOiBbXSxcbiAgICAgIGhpZ2g6IFtdLFxuICAgICAgbWVkaXVtOiBbXSxcbiAgICAgIGxvdzogW10sXG4gICAgICBpbmZvOiBbXVxuICAgIH07XG4gICAgXG4gICAgZm9yIChjb25zdCBmaW5kaW5nIG9mIHRoaXMucmVzdWx0LmZpbmRpbmdzKSB7XG4gICAgICBncm91cGVkW2ZpbmRpbmcuc2V2ZXJpdHldLnB1c2goZmluZGluZyk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBncm91cGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBhIHNldmVyaXR5IHNlY3Rpb25cbiAgICovXG4gIHByaXZhdGUgZm9ybWF0U2V2ZXJpdHlTZWN0aW9uKHNldmVyaXR5OiBTZXZlcml0eUxldmVsLCBmaW5kaW5nczogU2VjdXJpdHlGaW5kaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IG91dHB1dDogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBzZXZlcml0eUxhYmVsID0gdGhpcy5mb3JtYXRTZXZlcml0eShzZXZlcml0eSk7XG4gICAgXG4gICAgb3V0cHV0LnB1c2goYCR7c2V2ZXJpdHlMYWJlbH0gKCR7ZmluZGluZ3MubGVuZ3RofSlgKTtcbiAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgXG4gICAgZm9yIChjb25zdCBmaW5kaW5nIG9mIGZpbmRpbmdzKSB7XG4gICAgICBvdXRwdXQucHVzaCh0aGlzLmZvcm1hdEZpbmRpbmcoZmluZGluZykpO1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gb3V0cHV0LmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBpbmRpdmlkdWFsIGZpbmRpbmdcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0RmluZGluZyhmaW5kaW5nOiBTZWN1cml0eUZpbmRpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG91dHB1dDogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBpY29uID0gdGhpcy5nZXRTZXZlcml0eUljb24oZmluZGluZy5zZXZlcml0eSk7XG4gICAgXG4gICAgb3V0cHV0LnB1c2goYCAgJHtpY29ufSAke2NoYWxrLmJvbGQoZmluZGluZy5tZXNzYWdlKX1gKTtcbiAgICBcbiAgICBpZiAoZmluZGluZy5maWxlKSB7XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IGZpbmRpbmcubGluZSA/IGAke2ZpbmRpbmcuZmlsZX06JHtmaW5kaW5nLmxpbmV9YCA6IGZpbmRpbmcuZmlsZTtcbiAgICAgIG91dHB1dC5wdXNoKGAgICAgIPCfk4EgJHtjaGFsay5jeWFuKGxvY2F0aW9uKX1gKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGZpbmRpbmcuY29kZSkge1xuICAgICAgb3V0cHV0LnB1c2goYCAgICAg8J+TnSAke2NoYWxrLmdyYXkoZmluZGluZy5jb2RlKX1gKTtcbiAgICB9XG4gICAgXG4gICAgb3V0cHV0LnB1c2goYCAgICAg8J+SoSAke2NoYWxrLnllbGxvdyhmaW5kaW5nLnJlbWVkaWF0aW9uKX1gKTtcbiAgICBvdXRwdXQucHVzaChgICAgICDwn4+377iPICAke2NoYWxrLmdyYXkoZmluZGluZy5ydWxlSWQpfSAoJHtmaW5kaW5nLmNvbmZpZGVuY2V9IGNvbmZpZGVuY2UpYCk7XG4gICAgXG4gICAgcmV0dXJuIG91dHB1dC5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgc2V2ZXJpdHkgbGFiZWwgd2l0aCBjb2xvclxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRTZXZlcml0eShzZXZlcml0eTogU2V2ZXJpdHlMZXZlbCk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChzZXZlcml0eSkge1xuICAgICAgY2FzZSAnY3JpdGljYWwnOlxuICAgICAgICByZXR1cm4gY2hhbGsuYmdSZWQud2hpdGUoJyBDUklUSUNBTCAnKTtcbiAgICAgIGNhc2UgJ2hpZ2gnOlxuICAgICAgICByZXR1cm4gY2hhbGsucmVkKCdISUdIJyk7XG4gICAgICBjYXNlICdtZWRpdW0nOlxuICAgICAgICByZXR1cm4gY2hhbGsueWVsbG93KCdNRURJVU0nKTtcbiAgICAgIGNhc2UgJ2xvdyc6XG4gICAgICAgIHJldHVybiBjaGFsay5ibHVlKCdMT1cnKTtcbiAgICAgIGNhc2UgJ2luZm8nOlxuICAgICAgICByZXR1cm4gY2hhbGsuZ3JheSgnSU5GTycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaWNvbiBmb3Igc2V2ZXJpdHlcbiAgICovXG4gIHByaXZhdGUgZ2V0U2V2ZXJpdHlJY29uKHNldmVyaXR5OiBTZXZlcml0eUxldmVsKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHNldmVyaXR5KSB7XG4gICAgICBjYXNlICdjcml0aWNhbCc6XG4gICAgICAgIHJldHVybiAn8J+UtCc7XG4gICAgICBjYXNlICdoaWdoJzpcbiAgICAgICAgcmV0dXJuICfwn5+gJztcbiAgICAgIGNhc2UgJ21lZGl1bSc6XG4gICAgICAgIHJldHVybiAn8J+foSc7XG4gICAgICBjYXNlICdsb3cnOlxuICAgICAgICByZXR1cm4gJ/CflLUnO1xuICAgICAgY2FzZSAnaW5mbyc6XG4gICAgICAgIHJldHVybiAn4pqqJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGNvdW50IHdpdGggY29sb3JcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0Q291bnQoY291bnQ6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gY2hhbGsuZ3JlZW4oY291bnQudG9TdHJpbmcoKSk7XG4gICAgfSBlbHNlIGlmIChjb3VudCA8IDEwKSB7XG4gICAgICByZXR1cm4gY2hhbGsueWVsbG93KGNvdW50LnRvU3RyaW5nKCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY2hhbGsucmVkKGNvdW50LnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgfVxufSJdfQ==