@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.
166 lines • 22 kB
JavaScript
/**
* ValidationRegistry - Central registry for element validators
*
* Consolidates all validation services into a single injection point,
* reducing constructor bloat in element managers while maintaining
* type-specific validation capabilities.
*
* @example
* ```typescript
* // In Container.ts
* const validationRegistry = new ValidationRegistry(
* validationService,
* triggerValidationService,
* metadataService
* );
*
* // In element managers
* constructor(validationRegistry: ValidationRegistry) {
* this.validator = validationRegistry.getValidator(this.elementType);
* }
* ```
*/
import { ElementType } from '../../portfolio/types.js';
import { logger } from '../../utils/logger.js';
import { GenericElementValidator } from './GenericElementValidator.js';
import { PersonaElementValidator } from './PersonaElementValidator.js';
import { TemplateElementValidator } from './TemplateElementValidator.js';
import { MemoryElementValidator } from './MemoryElementValidator.js';
import { EnsembleElementValidator } from './EnsembleElementValidator.js';
import { AgentElementValidator } from './AgentElementValidator.js';
import { SkillElementValidator } from './SkillElementValidator.js';
/**
* Central registry for element validators
*/
export class ValidationRegistry {
validationService;
triggerValidationService;
metadataService;
validators = new Map();
genericValidators = new Map();
/**
* Create a new ValidationRegistry
*
* @param validationService - Core validation service for input sanitization
* @param triggerValidationService - Service for validating trigger keywords
* @param metadataService - Service for metadata operations
*/
constructor(validationService, triggerValidationService, metadataService) {
this.validationService = validationService;
this.triggerValidationService = triggerValidationService;
this.metadataService = metadataService;
this.registerDefaultValidators();
logger.debug('ValidationRegistry initialized with default validators');
}
/**
* Get a validator for the specified element type
*
* Returns a specialized validator if registered, otherwise returns
* a generic validator for that element type.
*
* @param type - The element type to get a validator for
* @returns ElementValidator for the specified type
*/
getValidator(type) {
// First check for specialized validators
const specialized = this.validators.get(type);
if (specialized) {
return specialized;
}
// Fall back to generic validator
return this.getGenericValidator(type);
}
/**
* Register a custom validator for an element type
*
* @param type - The element type to register for
* @param validator - The validator implementation
*/
registerValidator(type, validator) {
this.validators.set(type, validator);
logger.debug(`Registered custom validator for ${type}`);
}
/**
* Check if a specialized validator is registered for an element type
*
* @param type - The element type to check
* @returns true if a specialized validator is registered
*/
hasSpecializedValidator(type) {
return this.validators.has(type);
}
/**
* Get all registered element types
*
* @returns Array of element types with registered validators
*/
getRegisteredTypes() {
return Array.from(this.validators.keys());
}
/**
* Get the underlying validation service
*
* Used by element managers that need direct access to validation
* utilities beyond what the ElementValidator interface provides.
*
* @returns ValidationService instance
*/
getValidationService() {
return this.validationService;
}
/**
* Get the underlying trigger validation service
*
* @returns TriggerValidationService instance
*/
getTriggerValidationService() {
return this.triggerValidationService;
}
/**
* Get the underlying metadata service
*
* @returns MetadataService instance
*/
getMetadataService() {
return this.metadataService;
}
/**
* Register default validators for all element types
*/
registerDefaultValidators() {
// Register PersonaElementValidator for personas
this.validators.set(ElementType.PERSONA, new PersonaElementValidator(this.validationService, this.triggerValidationService, this.metadataService));
// Register TemplateElementValidator for templates
this.validators.set(ElementType.TEMPLATE, new TemplateElementValidator(this.validationService, this.triggerValidationService, this.metadataService));
// Register MemoryElementValidator for memories
this.validators.set(ElementType.MEMORY, new MemoryElementValidator(this.validationService, this.triggerValidationService, this.metadataService));
// Register EnsembleElementValidator for ensembles
this.validators.set(ElementType.ENSEMBLE, new EnsembleElementValidator(this.validationService, this.triggerValidationService, this.metadataService));
// Register AgentElementValidator for agents
this.validators.set(ElementType.AGENT, new AgentElementValidator(this.validationService, this.triggerValidationService, this.metadataService));
// Register SkillElementValidator for skills
this.validators.set(ElementType.SKILL, new SkillElementValidator(this.validationService, this.triggerValidationService, this.metadataService));
}
/**
* Get or create a generic validator for an element type
*/
getGenericValidator(type) {
let validator = this.genericValidators.get(type);
if (!validator) {
validator = new GenericElementValidator(type, this.validationService, this.triggerValidationService, this.metadataService);
this.genericValidators.set(type, validator);
}
return validator;
}
}
export { ValidatorHelpers } from './ElementValidator.js';
export { GenericElementValidator } from './GenericElementValidator.js';
export { PersonaElementValidator } from './PersonaElementValidator.js';
export { TemplateElementValidator } from './TemplateElementValidator.js';
export { MemoryElementValidator } from './MemoryElementValidator.js';
export { EnsembleElementValidator } from './EnsembleElementValidator.js';
export { AgentElementValidator } from './AgentElementValidator.js';
export { SkillElementValidator } from './SkillElementValidator.js';
export { ValidationService } from './ValidationService.js';
export { TriggerValidationService } from './TriggerValidationService.js';
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVmFsaWRhdGlvblJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZpY2VzL3ZhbGlkYXRpb24vVmFsaWRhdGlvblJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFJdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRS9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRW5FOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGtCQUFrQjtJQVluQjtJQUNBO0lBQ0E7SUFiRixVQUFVLEdBQXVDLElBQUksR0FBRyxFQUFFLENBQUM7SUFDM0QsaUJBQWlCLEdBQThDLElBQUksR0FBRyxFQUFFLENBQUM7SUFFakY7Ozs7OztPQU1HO0lBQ0gsWUFDVSxpQkFBb0MsRUFDcEMsd0JBQWtELEVBQ2xELGVBQWdDO1FBRmhDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFFeEMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDakMsTUFB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LCtCQUErQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBWYWxpZGF0aW9uUmVnaXN0cnkgLSBDZW50cmFsIHJlZ2lzdHJ5IGZvciBlbGVtZW50IHZhbGlkYXRvcnNcbiAqXG4gKiBDb25zb2xpZGF0ZXMgYWxsIHZhbGlkYXRpb24gc2VydmljZXMgaW50byBhIHNpbmdsZSBpbmplY3Rpb24gcG9pbnQsXG4gKiByZWR1Y2luZyBjb25zdHJ1Y3RvciBibG9hdCBpbiBlbGVtZW50IG1hbmFnZXJzIHdoaWxlIG1haW50YWluaW5nXG4gKiB0eXBlLXNwZWNpZmljIHZhbGlkYXRpb24gY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbiBDb250YWluZXIudHNcbiAqIGNvbnN0IHZhbGlkYXRpb25SZWdpc3RyeSA9IG5ldyBWYWxpZGF0aW9uUmVnaXN0cnkoXG4gKiAgIHZhbGlkYXRpb25TZXJ2aWNlLFxuICogICB0cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UsXG4gKiAgIG1ldGFkYXRhU2VydmljZVxuICogKTtcbiAqXG4gKiAvLyBJbiBlbGVtZW50IG1hbmFnZXJzXG4gKiBjb25zdHJ1Y3Rvcih2YWxpZGF0aW9uUmVnaXN0cnk6IFZhbGlkYXRpb25SZWdpc3RyeSkge1xuICogICB0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRpb25SZWdpc3RyeS5nZXRWYWxpZGF0b3IodGhpcy5lbGVtZW50VHlwZSk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uLy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4vVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9UcmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vTWV0YWRhdGFTZXJ2aWNlLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VmFsaWRhdG9yIH0gZnJvbSAnLi9FbGVtZW50VmFsaWRhdG9yLmpzJztcbmltcG9ydCB7IEdlbmVyaWNFbGVtZW50VmFsaWRhdG9yIH0gZnJvbSAnLi9HZW5lcmljRWxlbWVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBQZXJzb25hRWxlbWVudFZhbGlkYXRvciB9IGZyb20gJy4vUGVyc29uYUVsZW1lbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgVGVtcGxhdGVFbGVtZW50VmFsaWRhdG9yIH0gZnJvbSAnLi9UZW1wbGF0ZUVsZW1lbnRWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgTWVtb3J5RWxlbWVudFZhbGlkYXRvciB9IGZyb20gJy4vTWVtb3J5RWxlbWVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBFbnNlbWJsZUVsZW1lbnRWYWxpZGF0b3IgfSBmcm9tICcuL0Vuc2VtYmxlRWxlbWVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBBZ2VudEVsZW1lbnRWYWxpZGF0b3IgfSBmcm9tICcuL0FnZW50RWxlbWVudFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTa2lsbEVsZW1lbnRWYWxpZGF0b3IgfSBmcm9tICcuL1NraWxsRWxlbWVudFZhbGlkYXRvci5qcyc7XG5cbi8qKlxuICogQ2VudHJhbCByZWdpc3RyeSBmb3IgZWxlbWVudCB2YWxpZGF0b3JzXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uUmVnaXN0cnkge1xuICBwcml2YXRlIHZhbGlkYXRvcnM6IE1hcDxFbGVtZW50VHlwZSwgRWxlbWVudFZhbGlkYXRvcj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgZ2VuZXJpY1ZhbGlkYXRvcnM6IE1hcDxFbGVtZW50VHlwZSwgR2VuZXJpY0VsZW1lbnRWYWxpZGF0b3I+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgVmFsaWRhdGlvblJlZ2lzdHJ5XG4gICAqXG4gICAqIEBwYXJhbSB2YWxpZGF0aW9uU2VydmljZSAtIENvcmUgdmFsaWRhdGlvbiBzZXJ2aWNlIGZvciBpbnB1dCBzYW5pdGl6YXRpb25cbiAgICogQHBhcmFtIHRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSAtIFNlcnZpY2UgZm9yIHZhbGlkYXRpbmcgdHJpZ2dlciBrZXl3b3Jkc1xuICAgKiBAcGFyYW0gbWV0YWRhdGFTZXJ2aWNlIC0gU2VydmljZSBmb3IgbWV0YWRhdGEgb3BlcmF0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB2YWxpZGF0aW9uU2VydmljZTogVmFsaWRhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2U6IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIG1ldGFkYXRhU2VydmljZTogTWV0YWRhdGFTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMucmVnaXN0ZXJEZWZhdWx0VmFsaWRhdG9ycygpO1xuICAgIGxvZ2dlci5kZWJ1ZygnVmFsaWRhdGlvblJlZ2lzdHJ5IGluaXRpYWxpemVkIHdpdGggZGVmYXVsdCB2YWxpZGF0b3JzJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgdmFsaWRhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdHlwZVxuICAgKlxuICAgKiBSZXR1cm5zIGEgc3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGlmIHJlZ2lzdGVyZWQsIG90aGVyd2lzZSByZXR1cm5zXG4gICAqIGEgZ2VuZXJpYyB2YWxpZGF0b3IgZm9yIHRoYXQgZWxlbWVudCB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZSAtIFRoZSBlbGVtZW50IHR5cGUgdG8gZ2V0IGEgdmFsaWRhdG9yIGZvclxuICAgKiBAcmV0dXJucyBFbGVtZW50VmFsaWRhdG9yIGZvciB0aGUgc3BlY2lmaWVkIHR5cGVcbiAgICovXG4gIGdldFZhbGlkYXRvcih0eXBlOiBFbGVtZW50VHlwZSk6IEVsZW1lbnRWYWxpZGF0b3Ige1xuICAgIC8vIEZpcnN0IGNoZWNrIGZvciBzcGVjaWFsaXplZCB2YWxpZGF0b3JzXG4gICAgY29uc3Qgc3BlY2lhbGl6ZWQgPSB0aGlzLnZhbGlkYXRvcnMuZ2V0KHR5cGUpO1xuICAgIGlmIChzcGVjaWFsaXplZCkge1xuICAgICAgcmV0dXJuIHNwZWNpYWxpemVkO1xuICAgIH1cblxuICAgIC8vIEZhbGwgYmFjayB0byBnZW5lcmljIHZhbGlkYXRvclxuICAgIHJldHVybiB0aGlzLmdldEdlbmVyaWNWYWxpZGF0b3IodHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjdXN0b20gdmFsaWRhdG9yIGZvciBhbiBlbGVtZW50IHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHR5cGUgLSBUaGUgZWxlbWVudCB0eXBlIHRvIHJlZ2lzdGVyIGZvclxuICAgKiBAcGFyYW0gdmFsaWRhdG9yIC0gVGhlIHZhbGlkYXRvciBpbXBsZW1lbnRhdGlvblxuICAgKi9cbiAgcmVnaXN0ZXJWYWxpZGF0b3IodHlwZTogRWxlbWVudFR5cGUsIHZhbGlkYXRvcjogRWxlbWVudFZhbGlkYXRvcik6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdG9ycy5zZXQodHlwZSwgdmFsaWRhdG9yKTtcbiAgICBsb2dnZXIuZGVidWcoYFJlZ2lzdGVyZWQgY3VzdG9tIHZhbGlkYXRvciBmb3IgJHt0eXBlfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgc3BlY2lhbGl6ZWQgdmFsaWRhdG9yIGlzIHJlZ2lzdGVyZWQgZm9yIGFuIGVsZW1lbnQgdHlwZVxuICAgKlxuICAgKiBAcGFyYW0gdHlwZSAtIFRoZSBlbGVtZW50IHR5cGUgdG8gY2hlY2tcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBhIHNwZWNpYWxpemVkIHZhbGlkYXRvciBpcyByZWdpc3RlcmVkXG4gICAqL1xuICBoYXNTcGVjaWFsaXplZFZhbGlkYXRvcih0eXBlOiBFbGVtZW50VHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRvcnMuaGFzKHR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcmVnaXN0ZXJlZCBlbGVtZW50IHR5cGVzXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGVsZW1lbnQgdHlwZXMgd2l0aCByZWdpc3RlcmVkIHZhbGlkYXRvcnNcbiAgICovXG4gIGdldFJlZ2lzdGVyZWRUeXBlcygpOiBFbGVtZW50VHlwZVtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnZhbGlkYXRvcnMua2V5cygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgdmFsaWRhdGlvbiBzZXJ2aWNlXG4gICAqXG4gICAqIFVzZWQgYnkgZWxlbWVudCBtYW5hZ2VycyB0aGF0IG5lZWQgZGlyZWN0IGFjY2VzcyB0byB2YWxpZGF0aW9uXG4gICAqIHV0aWxpdGllcyBiZXlvbmQgd2hhdCB0aGUgRWxlbWVudFZhbGlkYXRvciBpbnRlcmZhY2UgcHJvdmlkZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb25TZXJ2aWNlIGluc3RhbmNlXG4gICAqL1xuICBnZXRWYWxpZGF0aW9uU2VydmljZSgpOiBWYWxpZGF0aW9uU2VydmljZSB7XG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdGlvblNlcnZpY2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1bmRlcmx5aW5nIHRyaWdnZXIgdmFsaWRhdGlvbiBzZXJ2aWNlXG4gICAqXG4gICAqIEByZXR1cm5zIFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSBpbnN0YW5jZVxuICAgKi9cbiAgZ2V0VHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlKCk6IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSB7XG4gICAgcmV0dXJuIHRoaXMudHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdW5kZXJseWluZyBtZXRhZGF0YSBzZXJ2aWNlXG4gICAqXG4gICAqIEByZXR1cm5zIE1ldGFkYXRhU2VydmljZSBpbnN0YW5jZVxuICAgKi9cbiAgZ2V0TWV0YWRhdGFTZXJ2aWNlKCk6IE1ldGFkYXRhU2VydmljZSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YWRhdGFTZXJ2aWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGRlZmF1bHQgdmFsaWRhdG9ycyBmb3IgYWxsIGVsZW1lbnQgdHlwZXNcbiAgICovXG4gIHByaXZhdGUgcmVnaXN0ZXJEZWZhdWx0VmFsaWRhdG9ycygpOiB2b2lkIHtcbiAgICAvLyBSZWdpc3RlciBQZXJzb25hRWxlbWVudFZhbGlkYXRvciBmb3IgcGVyc29uYXNcbiAgICB0aGlzLnZhbGlkYXRvcnMuc2V0KFxuICAgICAgRWxlbWVudFR5cGUuUEVSU09OQSxcbiAgICAgIG5ldyBQZXJzb25hRWxlbWVudFZhbGlkYXRvcihcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uU2VydmljZSxcbiAgICAgICAgdGhpcy50cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UsXG4gICAgICAgIHRoaXMubWV0YWRhdGFTZXJ2aWNlXG4gICAgICApXG4gICAgKTtcblxuICAgIC8vIFJlZ2lzdGVyIFRlbXBsYXRlRWxlbWVudFZhbGlkYXRvciBmb3IgdGVtcGxhdGVzXG4gICAgdGhpcy52YWxpZGF0b3JzLnNldChcbiAgICAgIEVsZW1lbnRUeXBlLlRFTVBMQVRFLFxuICAgICAgbmV3IFRlbXBsYXRlRWxlbWVudFZhbGlkYXRvcihcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uU2VydmljZSxcbiAgICAgICAgdGhpcy50cmlnZ2VyVmFsaWRhdGlvblNlcnZpY2UsXG4gICAgICAgIHRoaXMubWV0YWRhdGFTZXJ2aWNlXG4gICAgICApXG4gICAgKTtcblxuICAgIC8vIFJlZ2lzdGVyIE1lbW9yeUVsZW1lbnRWYWxpZGF0b3IgZm9yIG1lbW9yaWVzXG4gICAgdGhpcy52YWxpZGF0b3JzLnNldChcbiAgICAgIEVsZW1lbnRUeXBlLk1FTU9SWSxcbiAgICAgIG5ldyBNZW1vcnlFbGVtZW50VmFsaWRhdG9yKFxuICAgICAgICB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLFxuICAgICAgICB0aGlzLnRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSxcbiAgICAgICAgdGhpcy5tZXRhZGF0YVNlcnZpY2VcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gUmVnaXN0ZXIgRW5zZW1ibGVFbGVtZW50VmFsaWRhdG9yIGZvciBlbnNlbWJsZXNcbiAgICB0aGlzLnZhbGlkYXRvcnMuc2V0KFxuICAgICAgRWxlbWVudFR5cGUuRU5TRU1CTEUsXG4gICAgICBuZXcgRW5zZW1ibGVFbGVtZW50VmFsaWRhdG9yKFxuICAgICAgICB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLFxuICAgICAgICB0aGlzLnRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSxcbiAgICAgICAgdGhpcy5tZXRhZGF0YVNlcnZpY2VcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gUmVnaXN0ZXIgQWdlbnRFbGVtZW50VmFsaWRhdG9yIGZvciBhZ2VudHNcbiAgICB0aGlzLnZhbGlkYXRvcnMuc2V0KFxuICAgICAgRWxlbWVudFR5cGUuQUdFTlQsXG4gICAgICBuZXcgQWdlbnRFbGVtZW50VmFsaWRhdG9yKFxuICAgICAgICB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLFxuICAgICAgICB0aGlzLnRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSxcbiAgICAgICAgdGhpcy5tZXRhZGF0YVNlcnZpY2VcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gUmVnaXN0ZXIgU2tpbGxFbGVtZW50VmFsaWRhdG9yIGZvciBza2lsbHNcbiAgICB0aGlzLnZhbGlkYXRvcnMuc2V0KFxuICAgICAgRWxlbWVudFR5cGUuU0tJTEwsXG4gICAgICBuZXcgU2tpbGxFbGVtZW50VmFsaWRhdG9yKFxuICAgICAgICB0aGlzLnZhbGlkYXRpb25TZXJ2aWNlLFxuICAgICAgICB0aGlzLnRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSxcbiAgICAgICAgdGhpcy5tZXRhZGF0YVNlcnZpY2VcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvciBjcmVhdGUgYSBnZW5lcmljIHZhbGlkYXRvciBmb3IgYW4gZWxlbWVudCB0eXBlXG4gICAqL1xuICBwcml2YXRlIGdldEdlbmVyaWNWYWxpZGF0b3IodHlwZTogRWxlbWVudFR5cGUpOiBHZW5lcmljRWxlbWVudFZhbGlkYXRvciB7XG4gICAgbGV0IHZhbGlkYXRvciA9IHRoaXMuZ2VuZXJpY1ZhbGlkYXRvcnMuZ2V0KHR5cGUpO1xuICAgIGlmICghdmFsaWRhdG9yKSB7XG4gICAgICB2YWxpZGF0b3IgPSBuZXcgR2VuZXJpY0VsZW1lbnRWYWxpZGF0b3IoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHRoaXMudmFsaWRhdGlvblNlcnZpY2UsXG4gICAgICAgIHRoaXMudHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLFxuICAgICAgICB0aGlzLm1ldGFkYXRhU2VydmljZVxuICAgICAgKTtcbiAgICAgIHRoaXMuZ2VuZXJpY1ZhbGlkYXRvcnMuc2V0KHR5cGUsIHZhbGlkYXRvcik7XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0b3I7XG4gIH1cbn1cblxuLy8gRXhwb3J0IGFsbCB2YWxpZGF0aW9uLXJlbGF0ZWQgdHlwZXMgYW5kIGNsYXNzZXNcbmV4cG9ydCB0eXBlIHtcbiAgRWxlbWVudFZhbGlkYXRvcixcbiAgVmFsaWRhdGlvblJlc3VsdCxcbiAgVmFsaWRhdGlvblJlcG9ydCxcbiAgRWxlbWVudFZhbGlkYXRpb25PcHRpb25zLFxuICBNZXRhZGF0YVZhbGlkYXRpb25PcHRpb25zXG59IGZyb20gJy4vRWxlbWVudFZhbGlkYXRvci5qcyc7XG5cbmV4cG9ydCB7IFZhbGlkYXRvckhlbHBlcnMgfSBmcm9tICcuL0VsZW1lbnRWYWxpZGF0b3IuanMnO1xuXG5leHBvcnQgeyBHZW5lcmljRWxlbWVudFZhbGlkYXRvciB9IGZyb20gJy4vR2VuZXJpY0VsZW1lbnRWYWxpZGF0b3IuanMnO1xuZXhwb3J0IHsgUGVyc29uYUVsZW1lbnRWYWxpZGF0b3IgfSBmcm9tICcuL1BlcnNvbmFFbGVtZW50VmFsaWRhdG9yLmpzJztcbmV4cG9ydCB7IFRlbXBsYXRlRWxlbWVudFZhbGlkYXRvciB9IGZyb20gJy4vVGVtcGxhdGVFbGVtZW50VmFsaWRhdG9yLmpzJztcbmV4cG9ydCB7IE1lbW9yeUVsZW1lbnRWYWxpZGF0b3IgfSBmcm9tICcuL01lbW9yeUVsZW1lbnRWYWxpZGF0b3IuanMnO1xuZXhwb3J0IHsgRW5zZW1ibGVFbGVtZW50VmFsaWRhdG9yIH0gZnJvbSAnLi9FbnNlbWJsZUVsZW1lbnRWYWxpZGF0b3IuanMnO1xuZXhwb3J0IHsgQWdlbnRFbGVtZW50VmFsaWRhdG9yIH0gZnJvbSAnLi9BZ2VudEVsZW1lbnRWYWxpZGF0b3IuanMnO1xuZXhwb3J0IHsgU2tpbGxFbGVtZW50VmFsaWRhdG9yIH0gZnJvbSAnLi9Ta2lsbEVsZW1lbnRWYWxpZGF0b3IuanMnO1xuZXhwb3J0IHsgVmFsaWRhdGlvblNlcnZpY2UgfSBmcm9tICcuL1ZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbmV4cG9ydCB7IFRyaWdnZXJWYWxpZGF0aW9uU2VydmljZSB9IGZyb20gJy4vVHJpZ2dlclZhbGlkYXRpb25TZXJ2aWNlLmpzJztcbiJdfQ==