UNPKG

@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.

212 lines (207 loc) 25.3 kB
/** * DisplayConfigHandler - Manages runtime indicator display preferences * * Handles session-scoped tweaks to persona indicator formatting such as: * - Enabling/disabling indicators * - Style selection (full/minimal/compact/custom) * - Visibility of version/author/category * - Emoji and bracket choices * - Custom format templates * * Uses dependency injection for all services: * - PersonaManager for persona state and operations * - InitializationService for setup tasks * - PersonaIndicatorService for persona indicator formatting * * FIX: DMCP-SEC-006 - Security audit suppression * This handler delegates configuration changes to PersonaIndicatorService. * Audit logging happens in PersonaIndicatorService.updateConfig(). * @security-audit-suppress DMCP-SEC-006 */ import { formatIndicator, validateCustomFormat, } from '../config/indicator-config.js'; import { SecureErrorHandler } from '../security/errorHandler.js'; import { SecurityMonitor } from '../security/securityMonitor.js'; const SAMPLE_PERSONA_METADATA = { name: 'Example Persona', version: '1.0', author: '@username', category: 'creative', }; export class DisplayConfigHandler { personaManager; initService; indicatorService; constructor(personaManager, initService, indicatorService) { this.personaManager = personaManager; this.initService = initService; this.indicatorService = indicatorService; } async ensureInitialized() { await this.initService.ensureInitialized(); } prefix(message) { return `${this.indicatorService.getPersonaIndicator()}${message}`; } cloneConfig(config) { return { ...config }; } applyUpdates(baseConfig, updates) { const updated = this.cloneConfig(baseConfig); if (updates.enabled !== undefined) updated.enabled = updates.enabled; if (updates.style !== undefined) updated.style = updates.style; if (updates.showVersion !== undefined) updated.showVersion = updates.showVersion; if (updates.showAuthor !== undefined) updated.showAuthor = updates.showAuthor; if (updates.showCategory !== undefined) updated.showCategory = updates.showCategory; if (updates.emoji !== undefined) updated.emoji = updates.emoji; if (updates.bracketStyle !== undefined) updated.bracketStyle = updates.bracketStyle; if (updates.separator !== undefined) updated.separator = updates.separator; if (updates.showEmoji !== undefined) updated.showEmoji = updates.showEmoji; if (updates.showName !== undefined) updated.showName = updates.showName; if (updates.customFormat !== undefined) { updated.customFormat = updates.customFormat; } return updated; } buildExampleIndicator(config) { const activePersona = this.personaManager.getActivePersona(); if (activePersona) { return formatIndicator(config, { name: activePersona.metadata.name, version: activePersona.metadata.version, author: activePersona.metadata.author, category: activePersona.metadata.category, }); } return formatIndicator(config, SAMPLE_PERSONA_METADATA); } formatConfigureSuccess(config, example) { return `✅ Indicator configuration updated successfully! Current settings: - Enabled: ${config.enabled} - Style: ${config.style} - Show Version: ${config.showVersion} - Show Author: ${config.showAuthor} - Show Category: ${config.showCategory} - Emoji: ${config.emoji} - Brackets: ${config.bracketStyle} ${config.customFormat ? `- Custom Format: ${config.customFormat}\n` : ''}Example indicator: ${example || '(none - indicators disabled)'} Note: Configuration is temporary for this session. To make permanent, set environment variables: - DOLLHOUSE_INDICATOR_ENABLED=true/false - DOLLHOUSE_INDICATOR_STYLE=full/minimal/compact/custom - DOLLHOUSE_INDICATOR_FORMAT="custom format template" - DOLLHOUSE_INDICATOR_SHOW_VERSION=true/false - DOLLHOUSE_INDICATOR_SHOW_AUTHOR=true/false - DOLLHOUSE_INDICATOR_SHOW_CATEGORY=true/false - DOLLHOUSE_INDICATOR_EMOJI=🎭 - DOLLHOUSE_INDICATOR_BRACKETS=square/round/curly/angle/none`; } formatConfigReport(config, example) { return `📊 Current Indicator Configuration: Settings: - Enabled: ${config.enabled} - Style: ${config.style} - Show Version: ${config.showVersion} - Show Author: ${config.showAuthor} - Show Category: ${config.showCategory} - Emoji: ${config.emoji} - Brackets: ${config.bracketStyle} - Separator: "${config.separator}" ${config.customFormat ? `- Custom Format: ${config.customFormat}\n` : ''} Available styles: - full: [🎭 Persona Name v1.0 by @author] - minimal: 🎭 Persona Name - compact: [Persona Name v1.0] - custom: Use your own format with placeholders Example with current settings: ${example || '(none - indicators disabled)'} Placeholders for custom format: - {emoji} - The configured emoji - {name} - Persona name - {version} - Persona version - {author} - Persona author - {category} - Persona category`; } /** * Configure indicator settings (runtime-only) */ async configureIndicator(config) { await this.ensureInitialized(); try { if (config.customFormat !== undefined) { const validation = validateCustomFormat(config.customFormat); if (!validation.valid) { return { content: [ { type: 'text', text: this.prefix(`❌ Invalid custom format: ${validation.error}`), }, ], }; } } const baseConfig = this.personaManager.getIndicatorConfig(); const updatedConfig = this.applyUpdates(baseConfig, config); this.personaManager.updateIndicatorConfig(updatedConfig); this.indicatorService.updateConfig(updatedConfig); // FIX: DMCP-SEC-006 - Add security audit logging for configuration changes SecurityMonitor.logSecurityEvent({ type: 'CONFIG_UPDATED', severity: 'LOW', source: 'DisplayConfigHandler.configureIndicator', details: `Display indicator configuration updated: ${Object.keys(config).join(', ')}`, additionalData: { updatedFields: Object.keys(config), style: config.style, enabled: config.enabled, } }); const exampleIndicator = this.buildExampleIndicator(updatedConfig); return { content: [ { type: 'text', text: this.prefix(this.formatConfigureSuccess(updatedConfig, exampleIndicator)), }, ], }; } catch (error) { const sanitized = SecureErrorHandler.sanitizeError(error); return { content: [ { type: 'text', text: this.prefix(`❌ Error configuring indicator: ${sanitized.message}`), }, ], }; } } /** * Retrieve current indicator configuration and preview example */ async getIndicatorConfig() { await this.ensureInitialized(); const currentConfig = this.personaManager.getIndicatorConfig(); const exampleIndicator = this.buildExampleIndicator(currentConfig); return { content: [ { type: 'text', text: this.prefix(this.formatConfigReport(currentConfig, exampleIndicator)), }, ], }; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlzcGxheUNvbmZpZ0hhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGFuZGxlcnMvRGlzcGxheUNvbmZpZ0hhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxPQUFPLEVBQ0wsZUFBZSxFQUNmLG9CQUFvQixHQUVyQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBSWpFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVqRSxNQUFNLHVCQUF1QixHQUFHO0lBQzlCLElBQUksRUFBRSxpQkFBaUI7SUFDdkIsT0FBTyxFQUFFLEtBQUs7SUFDZCxNQUFNLEVBQUUsV0FBVztJQUNuQixRQUFRLEVBQUUsVUFBVTtDQUNyQixDQUFDO0FBRUYsTUFBTSxPQUFPLG9CQUFvQjtJQUVaO0lBQ0E7SUFDQTtJQUhuQixZQUNtQixjQUE4QixFQUM5QixXQUFrQyxFQUNsQyxnQkFBeUM7UUFGekMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUF1QjtRQUNsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXlCO0lBQ3pELENBQUM7SUFFSSxLQUFLLENBQUMsaUJBQWlCO1FBQzdCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFTyxNQUFNLENBQUMsT0FBZTtRQUM1QixPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDcEUsQ0FBQztJQUVPLFdBQVcsQ0FBQyxNQUF1QjtRQUN6QyxPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU8sWUFBWSxDQUNsQixVQUEyQixFQUMzQixPQUFpQztRQUVqQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTdDLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ3JFLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQy9ELElBQUksT0FBTyxDQUFDLFdBQVcsS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQ2pGLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQzlFLElBQUksT0FBTyxDQUFDLFlBQVksS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO1FBQ3BGLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQy9ELElBQUksT0FBTyxDQUFDLFlBQVksS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO1FBQ3BGLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQzNFLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQzNFLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBRXhFLElBQUksT0FBTyxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN2QyxPQUFPLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFDOUMsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxNQUF1QjtRQUNuRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDN0QsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixPQUFPLGVBQWUsQ0FBQyxNQUFNLEVBQUU7Z0JBQzdCLElBQUksRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUk7Z0JBQ2pDLE9BQU8sRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU87Z0JBQ3ZDLE1BQU0sRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU07Z0JBQ3JDLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLFFBQVE7YUFDMUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sZUFBZSxDQUFDLE1BQU0sRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxNQUF1QixFQUFFLE9BQWU7UUFDckUsT0FBTzs7O2FBR0UsTUFBTSxDQUFDLE9BQU87V0FDaEIsTUFBTSxDQUFDLEtBQUs7a0JBQ0wsTUFBTSxDQUFDLFdBQVc7aUJBQ25CLE1BQU0sQ0FBQyxVQUFVO21CQUNmLE1BQU0sQ0FBQyxZQUFZO1dBQzNCLE1BQU0sQ0FBQyxLQUFLO2NBQ1QsTUFBTSxDQUFDLFlBQVk7RUFDL0IsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsb0JBQW9CLE1BQU0sQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxzQkFBc0IsT0FBTyxJQUFJLDhCQUE4Qjs7Ozs7Ozs7Ozs2REFVMUUsQ0FBQztJQUM1RCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsTUFBdUIsRUFBRSxPQUFlO1FBQ2pFLE9BQU87OzthQUdFLE1BQU0sQ0FBQyxPQUFPO1dBQ2hCLE1BQU0sQ0FBQyxLQUFLO2tCQUNMLE1BQU0sQ0FBQyxXQUFXO2lCQUNuQixNQUFNLENBQUMsVUFBVTttQkFDZixNQUFNLENBQUMsWUFBWTtXQUMzQixNQUFNLENBQUMsS0FBSztjQUNULE1BQU0sQ0FBQyxZQUFZO2dCQUNqQixNQUFNLENBQUMsU0FBUztFQUM5QixNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsTUFBTSxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFOzs7Ozs7O2lDQU92QyxPQUFPLElBQUksOEJBQThCOzs7Ozs7O2dDQU8xQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFnQztRQUN2RCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQztZQUNILElBQUksTUFBTSxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxVQUFVLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUN0QixPQUFPO3dCQUNMLE9BQU8sRUFBRTs0QkFDUDtnQ0FDRSxJQUFJLEVBQUUsTUFBZTtnQ0FDckIsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsNEJBQTRCLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs2QkFDbEU7eUJBQ0Y7cUJBQ0YsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUU1RCxJQUFJLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFbEQsMkVBQTJFO1lBQzNFLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLGdCQUFnQjtnQkFDdEIsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLHlDQUF5QztnQkFDakQsT0FBTyxFQUFFLDRDQUE0QyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDckYsY0FBYyxFQUFFO29CQUNkLGFBQWEsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztvQkFDbEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO29CQUNuQixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87aUJBQ3hCO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFbkUsT0FBTztnQkFDTCxPQUFPLEVBQUU7b0JBQ1A7d0JBQ0UsSUFBSSxFQUFFLE1BQWU7d0JBQ3JCLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztxQkFDaEY7aUJBQ0Y7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUQsT0FBTztnQkFDTCxPQUFPLEVBQUU7b0JBQ1A7d0JBQ0UsSUFBSSxFQUFFLE1BQWU7d0JBQ3JCLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGtDQUFrQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7cUJBQ3pFO2lCQUNGO2FBQ0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsa0JBQWtCO1FBQ3RCLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFL0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQy9ELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRW5FLE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQWU7b0JBQ3JCLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztpQkFDNUU7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERpc3BsYXlDb25maWdIYW5kbGVyIC0gTWFuYWdlcyBydW50aW1lIGluZGljYXRvciBkaXNwbGF5IHByZWZlcmVuY2VzXG4gKlxuICogSGFuZGxlcyBzZXNzaW9uLXNjb3BlZCB0d2Vha3MgdG8gcGVyc29uYSBpbmRpY2F0b3IgZm9ybWF0dGluZyBzdWNoIGFzOlxuICogLSBFbmFibGluZy9kaXNhYmxpbmcgaW5kaWNhdG9yc1xuICogLSBTdHlsZSBzZWxlY3Rpb24gKGZ1bGwvbWluaW1hbC9jb21wYWN0L2N1c3RvbSlcbiAqIC0gVmlzaWJpbGl0eSBvZiB2ZXJzaW9uL2F1dGhvci9jYXRlZ29yeVxuICogLSBFbW9qaSBhbmQgYnJhY2tldCBjaG9pY2VzXG4gKiAtIEN1c3RvbSBmb3JtYXQgdGVtcGxhdGVzXG4gKlxuICogVXNlcyBkZXBlbmRlbmN5IGluamVjdGlvbiBmb3IgYWxsIHNlcnZpY2VzOlxuICogLSBQZXJzb25hTWFuYWdlciBmb3IgcGVyc29uYSBzdGF0ZSBhbmQgb3BlcmF0aW9uc1xuICogLSBJbml0aWFsaXphdGlvblNlcnZpY2UgZm9yIHNldHVwIHRhc2tzXG4gKiAtIFBlcnNvbmFJbmRpY2F0b3JTZXJ2aWNlIGZvciBwZXJzb25hIGluZGljYXRvciBmb3JtYXR0aW5nXG4gKlxuICogRklYOiBETUNQLVNFQy0wMDYgLSBTZWN1cml0eSBhdWRpdCBzdXBwcmVzc2lvblxuICogVGhpcyBoYW5kbGVyIGRlbGVnYXRlcyBjb25maWd1cmF0aW9uIGNoYW5nZXMgdG8gUGVyc29uYUluZGljYXRvclNlcnZpY2UuXG4gKiBBdWRpdCBsb2dnaW5nIGhhcHBlbnMgaW4gUGVyc29uYUluZGljYXRvclNlcnZpY2UudXBkYXRlQ29uZmlnKCkuXG4gKiBAc2VjdXJpdHktYXVkaXQtc3VwcHJlc3MgRE1DUC1TRUMtMDA2XG4gKi9cblxuaW1wb3J0IHtcbiAgZm9ybWF0SW5kaWNhdG9yLFxuICB2YWxpZGF0ZUN1c3RvbUZvcm1hdCxcbiAgdHlwZSBJbmRpY2F0b3JDb25maWcsXG59IGZyb20gJy4uL2NvbmZpZy9pbmRpY2F0b3ItY29uZmlnLmpzJztcbmltcG9ydCB7IFNlY3VyZUVycm9ySGFuZGxlciB9IGZyb20gJy4uL3NlY3VyaXR5L2Vycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBQZXJzb25hTWFuYWdlciB9IGZyb20gJy4uL3BlcnNvbmEvUGVyc29uYU1hbmFnZXIuanMnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvSW5pdGlhbGl6YXRpb25TZXJ2aWNlLmpzJztcbmltcG9ydCB7IFBlcnNvbmFJbmRpY2F0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvUGVyc29uYUluZGljYXRvclNlcnZpY2UuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcblxuY29uc3QgU0FNUExFX1BFUlNPTkFfTUVUQURBVEEgPSB7XG4gIG5hbWU6ICdFeGFtcGxlIFBlcnNvbmEnLFxuICB2ZXJzaW9uOiAnMS4wJyxcbiAgYXV0aG9yOiAnQHVzZXJuYW1lJyxcbiAgY2F0ZWdvcnk6ICdjcmVhdGl2ZScsXG59O1xuXG5leHBvcnQgY2xhc3MgRGlzcGxheUNvbmZpZ0hhbmRsZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBlcnNvbmFNYW5hZ2VyOiBQZXJzb25hTWFuYWdlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluaXRTZXJ2aWNlOiBJbml0aWFsaXphdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JTZXJ2aWNlOiBQZXJzb25hSW5kaWNhdG9yU2VydmljZVxuICApIHt9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVJbml0aWFsaXplZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluaXRTZXJ2aWNlLmVuc3VyZUluaXRpYWxpemVkKCk7XG4gIH1cblxuICBwcml2YXRlIHByZWZpeChtZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmluZGljYXRvclNlcnZpY2UuZ2V0UGVyc29uYUluZGljYXRvcigpfSR7bWVzc2FnZX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9uZUNvbmZpZyhjb25maWc6IEluZGljYXRvckNvbmZpZyk6IEluZGljYXRvckNvbmZpZyB7XG4gICAgcmV0dXJuIHsgLi4uY29uZmlnIH07XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VXBkYXRlcyhcbiAgICBiYXNlQ29uZmlnOiBJbmRpY2F0b3JDb25maWcsXG4gICAgdXBkYXRlczogUGFydGlhbDxJbmRpY2F0b3JDb25maWc+XG4gICk6IEluZGljYXRvckNvbmZpZyB7XG4gICAgY29uc3QgdXBkYXRlZCA9IHRoaXMuY2xvbmVDb25maWcoYmFzZUNvbmZpZyk7XG5cbiAgICBpZiAodXBkYXRlcy5lbmFibGVkICE9PSB1bmRlZmluZWQpIHVwZGF0ZWQuZW5hYmxlZCA9IHVwZGF0ZXMuZW5hYmxlZDtcbiAgICBpZiAodXBkYXRlcy5zdHlsZSAhPT0gdW5kZWZpbmVkKSB1cGRhdGVkLnN0eWxlID0gdXBkYXRlcy5zdHlsZTtcbiAgICBpZiAodXBkYXRlcy5zaG93VmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB1cGRhdGVkLnNob3dWZXJzaW9uID0gdXBkYXRlcy5zaG93VmVyc2lvbjtcbiAgICBpZiAodXBkYXRlcy5zaG93QXV0aG9yICE9PSB1bmRlZmluZWQpIHVwZGF0ZWQuc2hvd0F1dGhvciA9IHVwZGF0ZXMuc2hvd0F1dGhvcjtcbiAgICBpZiAodXBkYXRlcy5zaG93Q2F0ZWdvcnkgIT09IHVuZGVmaW5lZCkgdXBkYXRlZC5zaG93Q2F0ZWdvcnkgPSB1cGRhdGVzLnNob3dDYXRlZ29yeTtcbiAgICBpZiAodXBkYXRlcy5lbW9qaSAhPT0gdW5kZWZpbmVkKSB1cGRhdGVkLmVtb2ppID0gdXBkYXRlcy5lbW9qaTtcbiAgICBpZiAodXBkYXRlcy5icmFja2V0U3R5bGUgIT09IHVuZGVmaW5lZCkgdXBkYXRlZC5icmFja2V0U3R5bGUgPSB1cGRhdGVzLmJyYWNrZXRTdHlsZTtcbiAgICBpZiAodXBkYXRlcy5zZXBhcmF0b3IgIT09IHVuZGVmaW5lZCkgdXBkYXRlZC5zZXBhcmF0b3IgPSB1cGRhdGVzLnNlcGFyYXRvcjtcbiAgICBpZiAodXBkYXRlcy5zaG93RW1vamkgIT09IHVuZGVmaW5lZCkgdXBkYXRlZC5zaG93RW1vamkgPSB1cGRhdGVzLnNob3dFbW9qaTtcbiAgICBpZiAodXBkYXRlcy5zaG93TmFtZSAhPT0gdW5kZWZpbmVkKSB1cGRhdGVkLnNob3dOYW1lID0gdXBkYXRlcy5zaG93TmFtZTtcblxuICAgIGlmICh1cGRhdGVzLmN1c3RvbUZvcm1hdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1cGRhdGVkLmN1c3RvbUZvcm1hdCA9IHVwZGF0ZXMuY3VzdG9tRm9ybWF0O1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEV4YW1wbGVJbmRpY2F0b3IoY29uZmlnOiBJbmRpY2F0b3JDb25maWcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFjdGl2ZVBlcnNvbmEgPSB0aGlzLnBlcnNvbmFNYW5hZ2VyLmdldEFjdGl2ZVBlcnNvbmEoKTtcbiAgICBpZiAoYWN0aXZlUGVyc29uYSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEluZGljYXRvcihjb25maWcsIHtcbiAgICAgICAgbmFtZTogYWN0aXZlUGVyc29uYS5tZXRhZGF0YS5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiBhY3RpdmVQZXJzb25hLm1ldGFkYXRhLnZlcnNpb24sXG4gICAgICAgIGF1dGhvcjogYWN0aXZlUGVyc29uYS5tZXRhZGF0YS5hdXRob3IsXG4gICAgICAgIGNhdGVnb3J5OiBhY3RpdmVQZXJzb25hLm1ldGFkYXRhLmNhdGVnb3J5LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdEluZGljYXRvcihjb25maWcsIFNBTVBMRV9QRVJTT05BX01FVEFEQVRBKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0Q29uZmlndXJlU3VjY2Vzcyhjb25maWc6IEluZGljYXRvckNvbmZpZywgZXhhbXBsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYOKchSBJbmRpY2F0b3IgY29uZmlndXJhdGlvbiB1cGRhdGVkIHN1Y2Nlc3NmdWxseSFcblxuQ3VycmVudCBzZXR0aW5nczpcbi0gRW5hYmxlZDogJHtjb25maWcuZW5hYmxlZH1cbi0gU3R5bGU6ICR7Y29uZmlnLnN0eWxlfVxuLSBTaG93IFZlcnNpb246ICR7Y29uZmlnLnNob3dWZXJzaW9ufVxuLSBTaG93IEF1dGhvcjogJHtjb25maWcuc2hvd0F1dGhvcn1cbi0gU2hvdyBDYXRlZ29yeTogJHtjb25maWcuc2hvd0NhdGVnb3J5fVxuLSBFbW9qaTogJHtjb25maWcuZW1vaml9XG4tIEJyYWNrZXRzOiAke2NvbmZpZy5icmFja2V0U3R5bGV9XG4ke2NvbmZpZy5jdXN0b21Gb3JtYXQgPyBgLSBDdXN0b20gRm9ybWF0OiAke2NvbmZpZy5jdXN0b21Gb3JtYXR9XFxuYCA6ICcnfUV4YW1wbGUgaW5kaWNhdG9yOiAke2V4YW1wbGUgfHwgJyhub25lIC0gaW5kaWNhdG9ycyBkaXNhYmxlZCknfVxuXG5Ob3RlOiBDb25maWd1cmF0aW9uIGlzIHRlbXBvcmFyeSBmb3IgdGhpcyBzZXNzaW9uLiBUbyBtYWtlIHBlcm1hbmVudCwgc2V0IGVudmlyb25tZW50IHZhcmlhYmxlczpcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9FTkFCTEVEPXRydWUvZmFsc2Vcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9TVFlMRT1mdWxsL21pbmltYWwvY29tcGFjdC9jdXN0b21cbi0gRE9MTEhPVVNFX0lORElDQVRPUl9GT1JNQVQ9XCJjdXN0b20gZm9ybWF0IHRlbXBsYXRlXCJcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9TSE9XX1ZFUlNJT049dHJ1ZS9mYWxzZVxuLSBET0xMSE9VU0VfSU5ESUNBVE9SX1NIT1dfQVVUSE9SPXRydWUvZmFsc2Vcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9TSE9XX0NBVEVHT1JZPXRydWUvZmFsc2Vcbi0gRE9MTEhPVVNFX0lORElDQVRPUl9FTU9KST3wn46tXG4tIERPTExIT1VTRV9JTkRJQ0FUT1JfQlJBQ0tFVFM9c3F1YXJlL3JvdW5kL2N1cmx5L2FuZ2xlL25vbmVgO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRDb25maWdSZXBvcnQoY29uZmlnOiBJbmRpY2F0b3JDb25maWcsIGV4YW1wbGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGDwn5OKIEN1cnJlbnQgSW5kaWNhdG9yIENvbmZpZ3VyYXRpb246XG5cblNldHRpbmdzOlxuLSBFbmFibGVkOiAke2NvbmZpZy5lbmFibGVkfVxuLSBTdHlsZTogJHtjb25maWcuc3R5bGV9XG4tIFNob3cgVmVyc2lvbjogJHtjb25maWcuc2hvd1ZlcnNpb259XG4tIFNob3cgQXV0aG9yOiAke2NvbmZpZy5zaG93QXV0aG9yfVxuLSBTaG93IENhdGVnb3J5OiAke2NvbmZpZy5zaG93Q2F0ZWdvcnl9XG4tIEVtb2ppOiAke2NvbmZpZy5lbW9qaX1cbi0gQnJhY2tldHM6ICR7Y29uZmlnLmJyYWNrZXRTdHlsZX1cbi0gU2VwYXJhdG9yOiBcIiR7Y29uZmlnLnNlcGFyYXRvcn1cIlxuJHtjb25maWcuY3VzdG9tRm9ybWF0ID8gYC0gQ3VzdG9tIEZvcm1hdDogJHtjb25maWcuY3VzdG9tRm9ybWF0fVxcbmAgOiAnJ31cbkF2YWlsYWJsZSBzdHlsZXM6XG4tIGZ1bGw6IFvwn46tIFBlcnNvbmEgTmFtZSB2MS4wIGJ5IEBhdXRob3JdXG4tIG1pbmltYWw6IPCfjq0gUGVyc29uYSBOYW1lXG4tIGNvbXBhY3Q6IFtQZXJzb25hIE5hbWUgdjEuMF1cbi0gY3VzdG9tOiBVc2UgeW91ciBvd24gZm9ybWF0IHdpdGggcGxhY2Vob2xkZXJzXG5cbkV4YW1wbGUgd2l0aCBjdXJyZW50IHNldHRpbmdzOiAke2V4YW1wbGUgfHwgJyhub25lIC0gaW5kaWNhdG9ycyBkaXNhYmxlZCknfVxuXG5QbGFjZWhvbGRlcnMgZm9yIGN1c3RvbSBmb3JtYXQ6XG4tIHtlbW9qaX0gLSBUaGUgY29uZmlndXJlZCBlbW9qaVxuLSB7bmFtZX0gLSBQZXJzb25hIG5hbWVcbi0ge3ZlcnNpb259IC0gUGVyc29uYSB2ZXJzaW9uXG4tIHthdXRob3J9IC0gUGVyc29uYSBhdXRob3Jcbi0ge2NhdGVnb3J5fSAtIFBlcnNvbmEgY2F0ZWdvcnlgO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBpbmRpY2F0b3Igc2V0dGluZ3MgKHJ1bnRpbWUtb25seSlcbiAgICovXG4gIGFzeW5jIGNvbmZpZ3VyZUluZGljYXRvcihjb25maWc6IFBhcnRpYWw8SW5kaWNhdG9yQ29uZmlnPikge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoY29uZmlnLmN1c3RvbUZvcm1hdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB2YWxpZGF0ZUN1c3RvbUZvcm1hdChjb25maWcuY3VzdG9tRm9ybWF0KTtcbiAgICAgICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnByZWZpeChg4p2MIEludmFsaWQgY3VzdG9tIGZvcm1hdDogJHt2YWxpZGF0aW9uLmVycm9yfWApLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VDb25maWcgPSB0aGlzLnBlcnNvbmFNYW5hZ2VyLmdldEluZGljYXRvckNvbmZpZygpO1xuICAgICAgY29uc3QgdXBkYXRlZENvbmZpZyA9IHRoaXMuYXBwbHlVcGRhdGVzKGJhc2VDb25maWcsIGNvbmZpZyk7XG5cbiAgICAgIHRoaXMucGVyc29uYU1hbmFnZXIudXBkYXRlSW5kaWNhdG9yQ29uZmlnKHVwZGF0ZWRDb25maWcpO1xuICAgICAgdGhpcy5pbmRpY2F0b3JTZXJ2aWNlLnVwZGF0ZUNvbmZpZyh1cGRhdGVkQ29uZmlnKTtcblxuICAgICAgLy8gRklYOiBETUNQLVNFQy0wMDYgLSBBZGQgc2VjdXJpdHkgYXVkaXQgbG9nZ2luZyBmb3IgY29uZmlndXJhdGlvbiBjaGFuZ2VzXG4gICAgICBTZWN1cml0eU1vbml0b3IubG9nU2VjdXJpdHlFdmVudCh7XG4gICAgICAgIHR5cGU6ICdDT05GSUdfVVBEQVRFRCcsXG4gICAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgICAgc291cmNlOiAnRGlzcGxheUNvbmZpZ0hhbmRsZXIuY29uZmlndXJlSW5kaWNhdG9yJyxcbiAgICAgICAgZGV0YWlsczogYERpc3BsYXkgaW5kaWNhdG9yIGNvbmZpZ3VyYXRpb24gdXBkYXRlZDogJHtPYmplY3Qua2V5cyhjb25maWcpLmpvaW4oJywgJyl9YCxcbiAgICAgICAgYWRkaXRpb25hbERhdGE6IHtcbiAgICAgICAgICB1cGRhdGVkRmllbGRzOiBPYmplY3Qua2V5cyhjb25maWcpLFxuICAgICAgICAgIHN0eWxlOiBjb25maWcuc3R5bGUsXG4gICAgICAgICAgZW5hYmxlZDogY29uZmlnLmVuYWJsZWQsXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBleGFtcGxlSW5kaWNhdG9yID0gdGhpcy5idWlsZEV4YW1wbGVJbmRpY2F0b3IodXBkYXRlZENvbmZpZyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0eXBlOiAndGV4dCcgYXMgY29uc3QsXG4gICAgICAgICAgICB0ZXh0OiB0aGlzLnByZWZpeCh0aGlzLmZvcm1hdENvbmZpZ3VyZVN1Y2Nlc3ModXBkYXRlZENvbmZpZywgZXhhbXBsZUluZGljYXRvcikpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBTZWN1cmVFcnJvckhhbmRsZXIuc2FuaXRpemVFcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ3RleHQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgoYOKdjCBFcnJvciBjb25maWd1cmluZyBpbmRpY2F0b3I6ICR7c2FuaXRpemVkLm1lc3NhZ2V9YCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIGN1cnJlbnQgaW5kaWNhdG9yIGNvbmZpZ3VyYXRpb24gYW5kIHByZXZpZXcgZXhhbXBsZVxuICAgKi9cbiAgYXN5bmMgZ2V0SW5kaWNhdG9yQ29uZmlnKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKTtcblxuICAgIGNvbnN0IGN1cnJlbnRDb25maWcgPSB0aGlzLnBlcnNvbmFNYW5hZ2VyLmdldEluZGljYXRvckNvbmZpZygpO1xuICAgIGNvbnN0IGV4YW1wbGVJbmRpY2F0b3IgPSB0aGlzLmJ1aWxkRXhhbXBsZUluZGljYXRvcihjdXJyZW50Q29uZmlnKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAndGV4dCcgYXMgY29uc3QsXG4gICAgICAgICAgdGV4dDogdGhpcy5wcmVmaXgodGhpcy5mb3JtYXRDb25maWdSZXBvcnQoY3VycmVudENvbmZpZywgZXhhbXBsZUluZGljYXRvcikpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG59XG5cbiJdfQ==