@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.
152 lines • 21.3 kB
JavaScript
/**
* Collection-related tool definitions and handlers
*/
export function getCollectionTools(server) {
const tools = [
{
tool: {
name: "browse_collection",
description: "Browse content from the DollhouseMCP collection by section and content type. Content types include personas (AI behavioral profiles), skills, agents, and templates. When users ask for 'personas', they're referring to content in the personas type.",
inputSchema: {
type: "object",
properties: {
section: {
type: "string",
description: "Collection section to browse (library, showcase, catalog). Leave empty to see all sections.",
},
type: {
type: "string",
description: "Content type within the library section: personas, skills, agents, or templates. Only used when section is 'library'.",
},
},
},
},
handler: (args) => server.browseCollection(args?.section, args?.type)
},
{
tool: {
name: "search_collection",
description: "Search for content in the collection by keywords. This searches all content types including personas (AI behavioral profiles that users activate to change AI behavior), skills, agents, prompts, etc. When a user asks to 'find a persona', search in the collection.",
inputSchema: {
type: "object",
properties: {
query: {
type: "string",
description: "Search query for finding content. Examples: 'creative writer', 'explain like I'm five', 'coding assistant'. Users typically search for personas by their behavioral traits or names.",
},
},
required: ["query"],
},
},
handler: (args) => server.searchCollection(args.query)
},
{
tool: {
name: "get_collection_content",
description: "Get detailed information about content from the collection. Use this when users ask to 'see details about a persona' or 'show me the creative writer persona'. Personas are a type of content that defines AI behavioral profiles.",
inputSchema: {
type: "object",
properties: {
path: {
type: "string",
description: "The collection path to the AI customization element. Format: 'library/[type]/[element].md' where type is personas, skills, templates, or agents. Example: 'library/skills/code-review.md'.",
},
},
required: ["path"],
},
},
handler: (args) => server.getCollectionContent(args.path)
},
{
tool: {
name: "install_content",
description: "Install AI customization elements from the collection to your local portfolio. Use this when users ask to download/install any element type (personas, skills, templates, or agents). Examples: 'install the creative writer persona', 'get the code review skill', 'download the meeting notes template'.",
inputSchema: {
type: "object",
properties: {
path: {
type: "string",
description: "The collection path to the AI customization element. Format: 'library/[type]/[element].md' where type is personas, skills, templates, or agents. Example: 'library/skills/code-review.md'.",
},
},
required: ["path"],
},
},
handler: (args) => server.installContent(args.path)
},
{
tool: {
name: "submit_content",
description: "Submit local content to the collection for community review. Use this when users want to 'share their persona' or 'submit a persona to the collection'. This handles all content types including personas (AI behavioral profiles).",
inputSchema: {
type: "object",
properties: {
content: {
type: "string",
description: "The content name or filename to submit. For personas, use the persona's name (e.g., 'Creative Writer') or filename. The system will recognize it as a persona based on its metadata.",
},
},
required: ["content"],
},
},
handler: (args) => server.submitContent(args.content)
},
{
tool: {
name: "get_collection_cache_health",
description: "Get health status and statistics for the collection cache system. This helps monitor cache performance and identify any issues with offline browsing capability.",
inputSchema: {
type: "object",
properties: {}
}
},
handler: () => server.getCollectionCacheHealth()
}
];
// Backward compatibility aliases (deprecated)
// Will be removed in version 2.0.0 (estimated Q1 2026)
const deprecatedAliases = [
{
tool: {
name: "browse_marketplace",
description: "[DEPRECATED - Use browse_collection] " + tools[0].tool.description + " | Will be removed in v2.0.0",
inputSchema: { ...tools[0].tool.inputSchema }
},
handler: tools[0].handler
},
{
tool: {
name: "search_marketplace",
description: "[DEPRECATED - Use search_collection] " + tools[1].tool.description + " | Will be removed in v2.0.0",
inputSchema: { ...tools[1].tool.inputSchema }
},
handler: tools[1].handler
},
{
tool: {
name: "get_marketplace_persona",
description: "[DEPRECATED - Use get_collection_content] " + tools[2].tool.description + " | Will be removed in v2.0.0",
inputSchema: { ...tools[2].tool.inputSchema }
},
handler: tools[2].handler
},
{
tool: {
name: "install_persona",
description: "[DEPRECATED - Use install_content] " + tools[3].tool.description + " | Will be removed in v2.0.0",
inputSchema: { ...tools[3].tool.inputSchema }
},
handler: tools[3].handler
},
{
tool: {
name: "submit_persona",
description: "[DEPRECATED - Use submit_content] " + tools[4].tool.description + " | Will be removed in v2.0.0",
inputSchema: { ...tools[4].tool.inputSchema }
},
handler: tools[4].handler
}
];
return [...tools, ...deprecatedAliases];
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sbGVjdGlvblRvb2xzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcnZlci90b29scy9Db2xsZWN0aW9uVG9vbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFLSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBb0I7SUFDckQsTUFBTSxLQUFLLEdBQWtEO1FBQzNEO1lBQ0UsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxtQkFBbUI7Z0JBQ3pCLFdBQVcsRUFBRSx3UEFBd1A7Z0JBQ3JRLFdBQVcsRUFBRTtvQkFDWCxJQUFJLEVBQUUsUUFBUTtvQkFDZCxVQUFVLEVBQUU7d0JBQ1YsT0FBTyxFQUFFOzRCQUNQLElBQUksRUFBRSxRQUFROzRCQUNkLFdBQVcsRUFBRSw2RkFBNkY7eUJBQzNHO3dCQUNELElBQUksRUFBRTs0QkFDSixJQUFJLEVBQUUsUUFBUTs0QkFDZCxXQUFXLEVBQUUsdUhBQXVIO3lCQUNySTtxQkFDRjtpQkFDRjthQUNGO1lBQ0QsT0FBTyxFQUFFLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO1NBQzNFO1FBQ0Q7WUFDRSxJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLG1CQUFtQjtnQkFDekIsV0FBVyxFQUFFLHdRQUF3UTtnQkFDclIsV0FBVyxFQUFFO29CQUNYLElBQUksRUFBRSxRQUFRO29CQUNkLFVBQVUsRUFBRTt3QkFDVixLQUFLLEVBQUU7NEJBQ0wsSUFBSSxFQUFFLFFBQVE7NEJBQ2QsV0FBVyxFQUFFLHNMQUFzTDt5QkFDcE07cUJBQ0Y7b0JBQ0QsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDO2lCQUNwQjthQUNGO1lBQ0QsT0FBTyxFQUFFLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUss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QUUsNENBQTRDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsOEJBQThCO2dCQUN0SCxXQUFXLEVBQUUsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO2FBQzlDO1lBQ0QsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO1NBQzFCO1FBQ0Q7WUFDRSxJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsV0FBVyxFQUFFLHFDQUFxQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLDhCQUE4QjtnQkFDL0csV0FBVyxFQUFFLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTthQUM5QztZQUNELE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTztTQUMxQjtRQUNEO1lBQ0UsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxnQkFBZ0I7Z0JBQ3RCLFdBQVcsRUFBRSxvQ0FBb0MsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyw4QkFBOEI7Z0JBQzlHLFdBQVcsRUFBRSxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7YUFDOUM7WUFDRCxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU87U0FDMUI7S0FDRixDQUFDO0lBRUYsT0FBTyxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsaUJBQWlCLENBQUMsQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb2xsZWN0aW9uLXJlbGF0ZWQgdG9vbCBkZWZpbml0aW9ucyBhbmQgaGFuZGxlcnNcbiAqL1xuXG5pbXBvcnQgeyBUb29sRGVmaW5pdGlvbiB9IGZyb20gJy4vVG9vbFJlZ2lzdHJ5LmpzJztcbmltcG9ydCB7IElUb29sSGFuZGxlciB9IGZyb20gJy4uL3R5cGVzLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbGxlY3Rpb25Ub29scyhzZXJ2ZXI6IElUb29sSGFuZGxlcik6IEFycmF5PHsgdG9vbDogVG9vbERlZmluaXRpb247IGhhbmRsZXI6IGFueSB9PiB7XG4gIGNvbnN0IHRvb2xzOiBBcnJheTx7IHRvb2w6IFRvb2xEZWZpbml0aW9uOyBoYW5kbGVyOiBhbnkgfT4gPSBbXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcImJyb3dzZV9jb2xsZWN0aW9uXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkJyb3dzZSBjb250ZW50IGZyb20gdGhlIERvbGxob3VzZU1DUCBjb2xsZWN0aW9uIGJ5IHNlY3Rpb24gYW5kIGNvbnRlbnQgdHlwZS4gQ29udGVudCB0eXBlcyBpbmNsdWRlIHBlcnNvbmFzIChBSSBiZWhhdmlvcmFsIHByb2ZpbGVzKSwgc2tpbGxzLCBhZ2VudHMsIGFuZCB0ZW1wbGF0ZXMuIFdoZW4gdXNlcnMgYXNrIGZvciAncGVyc29uYXMnLCB0aGV5J3JlIHJlZmVycmluZyB0byBjb250ZW50IGluIHRoZSBwZXJzb25hcyB0eXBlLlwiLFxuICAgICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgc2VjdGlvbjoge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJDb2xsZWN0aW9uIHNlY3Rpb24gdG8gYnJvd3NlIChsaWJyYXJ5LCBzaG93Y2FzZSwgY2F0YWxvZykuIExlYXZlIGVtcHR5IHRvIHNlZSBhbGwgc2VjdGlvbnMuXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHlwZToge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJDb250ZW50IHR5cGUgd2l0aGluIHRoZSBsaWJyYXJ5IHNlY3Rpb246IHBlcnNvbmFzLCBza2lsbHMsIGFnZW50cywgb3IgdGVtcGxhdGVzLiBPbmx5IHVzZWQgd2hlbiBzZWN0aW9uIGlzICdsaWJyYXJ5Jy5cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiAoYXJnczogYW55KSA9PiBzZXJ2ZXIuYnJvd3NlQ29sbGVjdGlvbihhcmdzPy5zZWN0aW9uLCBhcmdzPy50eXBlKVxuICAgIH0sXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcInNlYXJjaF9jb2xsZWN0aW9uXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlNlYXJjaCBmb3IgY29udGVudCBpbiB0aGUgY29sbGVjdGlvbiBieSBrZXl3b3Jkcy4gVGhpcyBzZWFyY2hlcyBhbGwgY29udGVudCB0eXBlcyBpbmNsdWRpbmcgcGVyc29uYXMgKEFJIGJlaGF2aW9yYWwgcHJvZmlsZXMgdGhhdCB1c2VycyBhY3RpdmF0ZSB0byBjaGFuZ2UgQUkgYmVoYXZpb3IpLCBza2lsbHMsIGFnZW50cywgcHJvbXB0cywgZXRjLiBXaGVuIGEgdXNlciBhc2tzIHRvICdmaW5kIGEgcGVyc29uYScsIHNlYXJjaCBpbiB0aGUgY29sbGVjdGlvbi5cIixcbiAgICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlNlYXJjaCBxdWVyeSBmb3IgZmluZGluZyBjb250ZW50LiBFeGFtcGxlczogJ2NyZWF0aXZlIHdyaXRlcicsICdleHBsYWluIGxpa2UgSSdtIGZpdmUnLCAnY29kaW5nIGFzc2lzdGFudCcuIFVzZXJzIHR5cGljYWxseSBzZWFyY2ggZm9yIHBlcnNvbmFzIGJ5IHRoZWlyIGJlaGF2aW9yYWwgdHJhaXRzIG9yIG5hbWVzLlwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbXCJxdWVyeVwiXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiAoYXJnczogYW55KSA9PiBzZXJ2ZXIuc2VhcmNoQ29sbGVjdGlvbihhcmdzLnF1ZXJ5KVxuICAgIH0sXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcImdldF9jb2xsZWN0aW9uX2NvbnRlbnRcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiR2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGNvbnRlbnQgZnJvbSB0aGUgY29sbGVjdGlvbi4gVXNlIHRoaXMgd2hlbiB1c2VycyBhc2sgdG8gJ3NlZSBkZXRhaWxzIGFib3V0IGEgcGVyc29uYScgb3IgJ3Nob3cgbWUgdGhlIGNyZWF0aXZlIHdyaXRlciBwZXJzb25hJy4gUGVyc29uYXMgYXJlIGEgdHlwZSBvZiBjb250ZW50IHRoYXQgZGVmaW5lcyBBSSBiZWhhdmlvcmFsIHByb2ZpbGVzLlwiLFxuICAgICAgICBpbnB1dFNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgcGF0aDoge1xuICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJUaGUgY29sbGVjdGlvbiBwYXRoIHRvIHRoZSBBSSBjdXN0b21pemF0aW9uIGVsZW1lbnQuIEZvcm1hdDogJ2xpYnJhcnkvW3R5cGVdL1tlbGVtZW50XS5tZCcgd2hlcmUgdHlwZSBpcyBwZXJzb25hcywgc2tpbGxzLCB0ZW1wbGF0ZXMsIG9yIGFnZW50cy4gRXhhbXBsZTogJ2xpYnJhcnkvc2tpbGxzL2NvZGUtcmV2aWV3Lm1kJy5cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1aXJlZDogW1wicGF0aFwiXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiAoYXJnczogYW55KSA9PiBzZXJ2ZXIuZ2V0Q29sbGVjdGlvbkNvbnRlbnQoYXJncy5wYXRoKVxuICAgIH0sXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcImluc3RhbGxfY29udGVudFwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJJbnN0YWxsIEFJIGN1c3RvbWl6YXRpb24gZWxlbWVudHMgZnJvbSB0aGUgY29sbGVjdGlvbiB0byB5b3VyIGxvY2FsIHBvcnRmb2xpby4gVXNlIHRoaXMgd2hlbiB1c2VycyBhc2sgdG8gZG93bmxvYWQvaW5zdGFsbCBhbnkgZWxlbWVudCB0eXBlIChwZXJzb25hcywgc2tpbGxzLCB0ZW1wbGF0ZXMsIG9yIGFnZW50cykuIEV4YW1wbGVzOiAnaW5zdGFsbCB0aGUgY3JlYXRpdmUgd3JpdGVyIHBlcnNvbmEnLCAnZ2V0IHRoZSBjb2RlIHJldmlldyBza2lsbCcsICdkb3dubG9hZCB0aGUgbWVldGluZyBub3RlcyB0ZW1wbGF0ZScuXCIsXG4gICAgICAgIGlucHV0U2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBwYXRoOiB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBjb2xsZWN0aW9uIHBhdGggdG8gdGhlIEFJIGN1c3RvbWl6YXRpb24gZWxlbWVudC4gRm9ybWF0OiAnbGlicmFyeS9bdHlwZV0vW2VsZW1lbnRdLm1kJyB3aGVyZSB0eXBlIGlzIHBlcnNvbmFzLCBza2lsbHMsIHRlbXBsYXRlcywgb3IgYWdlbnRzLiBFeGFtcGxlOiAnbGlicmFyeS9za2lsbHMvY29kZS1yZXZpZXcubWQnLlwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlcXVpcmVkOiBbXCJwYXRoXCJdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IChhcmdzOiBhbnkpID0+IHNlcnZlci5pbnN0YWxsQ29udGVudChhcmdzLnBhdGgpXG4gICAgfSxcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwic3VibWl0X2NvbnRlbnRcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiU3VibWl0IGxvY2FsIGNvbnRlbnQgdG8gdGhlIGNvbGxlY3Rpb24gZm9yIGNvbW11bml0eSByZXZpZXcuIFVzZSB0aGlzIHdoZW4gdXNlcnMgd2FudCB0byAnc2hhcmUgdGhlaXIgcGVyc29uYScgb3IgJ3N1Ym1pdCBhIHBlcnNvbmEgdG8gdGhlIGNvbGxlY3Rpb24nLiBUaGlzIGhhbmRsZXMgYWxsIGNvbnRlbnQgdHlwZXMgaW5jbHVkaW5nIHBlcnNvbmFzIChBSSBiZWhhdmlvcmFsIHByb2ZpbGVzKS5cIixcbiAgICAgICAgaW5wdXRTY2hlbWE6IHtcbiAgICAgICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVGhlIGNvbnRlbnQgbmFtZSBvciBmaWxlbmFtZSB0byBzdWJtaXQuIEZvciBwZXJzb25hcywgdXNlIHRoZSBwZXJzb25hJ3MgbmFtZSAoZS5nLiwgJ0NyZWF0aXZlIFdyaXRlcicpIG9yIGZpbGVuYW1lLiBUaGUgc3lzdGVtIHdpbGwgcmVjb2duaXplIGl0IGFzIGEgcGVyc29uYSBiYXNlZCBvbiBpdHMgbWV0YWRhdGEuXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWlyZWQ6IFtcImNvbnRlbnRcIl0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogKGFyZ3M6IGFueSkgPT4gc2VydmVyLnN1Ym1pdENvbnRlbnQoYXJncy5jb250ZW50KVxuICAgIH0sXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcImdldF9jb2xsZWN0aW9uX2NhY2hlX2hlYWx0aFwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJHZXQgaGVhbHRoIHN0YXR1cyBhbmQgc3RhdGlzdGljcyBmb3IgdGhlIGNvbGxlY3Rpb24gY2FjaGUgc3lzdGVtLiBUaGlzIGhlbHBzIG1vbml0b3IgY2FjaGUgcGVyZm9ybWFuY2UgYW5kIGlkZW50aWZ5IGFueSBpc3N1ZXMgd2l0aCBvZmZsaW5lIGJyb3dzaW5nIGNhcGFiaWxpdHkuXCIsXG4gICAgICAgIGlucHV0U2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7fVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogKCkgPT4gc2VydmVyLmdldENvbGxlY3Rpb25DYWNoZUhlYWx0aCgpXG4gICAgfVxuICBdO1xuXG4gIC8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYWxpYXNlcyAoZGVwcmVjYXRlZClcbiAgLy8gV2lsbCBiZSByZW1vdmVkIGluIHZlcnNpb24gMi4wLjAgKGVzdGltYXRlZCBRMSAyMDI2KVxuICBjb25zdCBkZXByZWNhdGVkQWxpYXNlczogQXJyYXk8eyB0b29sOiBUb29sRGVmaW5pdGlvbjsgaGFuZGxlcjogYW55IH0+ID0gW1xuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJicm93c2VfbWFya2V0cGxhY2VcIixcbiAgICAgICAgZGVzY3JpcHRpb246IFwiW0RFUFJFQ0FURUQgLSBVc2UgYnJvd3NlX2NvbGxlY3Rpb25dIFwiICsgdG9vbHNbMF0udG9vbC5kZXNjcmlwdGlvbiArIFwiIHwgV2lsbCBiZSByZW1vdmVkIGluIHYyLjAuMFwiLFxuICAgICAgICBpbnB1dFNjaGVtYTogeyAuLi50b29sc1swXS50b29sLmlucHV0U2NoZW1hIH1cbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiB0b29sc1swXS5oYW5kbGVyXG4gICAgfSxcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwic2VhcmNoX21hcmtldHBsYWNlXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIltERVBSRUNBVEVEIC0gVXNlIHNlYXJjaF9jb2xsZWN0aW9uXSBcIiArIHRvb2xzWzFdLnRvb2wuZGVzY3JpcHRpb24gKyBcIiB8IFdpbGwgYmUgcmVtb3ZlZCBpbiB2Mi4wLjBcIixcbiAgICAgICAgaW5wdXRTY2hlbWE6IHsgLi4udG9vbHNbMV0udG9vbC5pbnB1dFNjaGVtYSB9XG4gICAgICB9LFxuICAgICAgaGFuZGxlcjogdG9vbHNbMV0uaGFuZGxlclxuICAgIH0sXG4gICAge1xuICAgICAgdG9vbDoge1xuICAgICAgICBuYW1lOiBcImdldF9tYXJrZXRwbGFjZV9wZXJzb25hXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIltERVBSRUNBVEVEIC0gVXNlIGdldF9jb2xsZWN0aW9uX2NvbnRlbnRdIFwiICsgdG9vbHNbMl0udG9vbC5kZXNjcmlwdGlvbiArIFwiIHwgV2lsbCBiZSByZW1vdmVkIGluIHYyLjAuMFwiLFxuICAgICAgICBpbnB1dFNjaGVtYTogeyAuLi50b29sc1syXS50b29sLmlucHV0U2NoZW1hIH1cbiAgICAgIH0sXG4gICAgICBoYW5kbGVyOiB0b29sc1syXS5oYW5kbGVyXG4gICAgfSxcbiAgICB7XG4gICAgICB0b29sOiB7XG4gICAgICAgIG5hbWU6IFwiaW5zdGFsbF9wZXJzb25hXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIltERVBSRUNBVEVEIC0gVXNlIGluc3RhbGxfY29udGVudF0gXCIgKyB0b29sc1szXS50b29sLmRlc2NyaXB0aW9uICsgXCIgfCBXaWxsIGJlIHJlbW92ZWQgaW4gdjIuMC4wXCIsXG4gICAgICAgIGlucHV0U2NoZW1hOiB7IC4uLnRvb2xzWzNdLnRvb2wuaW5wdXRTY2hlbWEgfVxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IHRvb2xzWzNdLmhhbmRsZXJcbiAgICB9LFxuICAgIHtcbiAgICAgIHRvb2w6IHtcbiAgICAgICAgbmFtZTogXCJzdWJtaXRfcGVyc29uYVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJbREVQUkVDQVRFRCAtIFVzZSBzdWJtaXRfY29udGVudF0gXCIgKyB0b29sc1s0XS50b29sLmRlc2NyaXB0aW9uICsgXCIgfCBXaWxsIGJlIHJlbW92ZWQgaW4gdjIuMC4wXCIsXG4gICAgICAgIGlucHV0U2NoZW1hOiB7IC4uLnRvb2xzWzRdLnRvb2wuaW5wdXRTY2hlbWEgfVxuICAgICAgfSxcbiAgICAgIGhhbmRsZXI6IHRvb2xzWzRdLmhhbmRsZXJcbiAgICB9XG4gIF07XG5cbiAgcmV0dXJuIFsuLi50b29scywgLi4uZGVwcmVjYXRlZEFsaWFzZXNdO1xufSJdfQ==