@narrative-os/engine 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/canonValidator.d.ts +9 -0
- package/dist/agents/canonValidator.js +51 -0
- package/dist/agents/chapterPlanner.d.ts +50 -0
- package/dist/agents/chapterPlanner.js +250 -0
- package/dist/agents/completeness.d.ts +7 -0
- package/dist/agents/completeness.js +51 -0
- package/dist/agents/memoryExtractor.d.ts +12 -0
- package/dist/agents/memoryExtractor.js +82 -0
- package/dist/agents/stateUpdater.d.ts +30 -0
- package/dist/agents/stateUpdater.js +150 -0
- package/dist/agents/storyDirector.d.ts +40 -0
- package/dist/agents/storyDirector.js +213 -0
- package/dist/agents/summarizer.d.ts +8 -0
- package/dist/agents/summarizer.js +56 -0
- package/dist/agents/tensionController.d.ts +68 -0
- package/dist/agents/tensionController.js +197 -0
- package/dist/agents/writer.d.ts +12 -0
- package/dist/agents/writer.js +148 -0
- package/dist/constraints/constraintGraph.d.ts +117 -0
- package/dist/constraints/constraintGraph.js +381 -0
- package/dist/constraints/validator.d.ts +58 -0
- package/dist/constraints/validator.js +236 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +115 -0
- package/dist/llm/client.d.ts +14 -0
- package/dist/llm/client.js +108 -0
- package/dist/memory/canonStore.d.ts +20 -0
- package/dist/memory/canonStore.js +110 -0
- package/dist/memory/memoryRetriever.d.ts +28 -0
- package/dist/memory/memoryRetriever.js +126 -0
- package/dist/memory/stateUpdater.d.ts +49 -0
- package/dist/memory/stateUpdater.js +315 -0
- package/dist/memory/vectorStore.d.ts +41 -0
- package/dist/memory/vectorStore.js +166 -0
- package/dist/pipeline/generateChapter.d.ts +17 -0
- package/dist/pipeline/generateChapter.js +75 -0
- package/dist/story/bible.d.ts +4 -0
- package/dist/story/bible.js +53 -0
- package/dist/story/state.d.ts +3 -0
- package/dist/story/state.js +27 -0
- package/dist/story/structuredState.d.ts +39 -0
- package/dist/story/structuredState.js +159 -0
- package/dist/test/canon.test.d.ts +1 -0
- package/dist/test/canon.test.js +104 -0
- package/dist/test/chapter-planner.test.d.ts +1 -0
- package/dist/test/chapter-planner.test.js +171 -0
- package/dist/test/constraints.test.d.ts +1 -0
- package/dist/test/constraints.test.js +210 -0
- package/dist/test/simple.test.d.ts +1 -0
- package/dist/test/simple.test.js +51 -0
- package/dist/test/state-updater.test.d.ts +1 -0
- package/dist/test/state-updater.test.js +200 -0
- package/dist/test/story-director.test.d.ts +1 -0
- package/dist/test/story-director.test.js +142 -0
- package/dist/test/structured-state.test.d.ts +1 -0
- package/dist/test/structured-state.test.js +144 -0
- package/dist/test/tension-controller.test.d.ts +1 -0
- package/dist/test/tension-controller.test.js +116 -0
- package/dist/test/vector-memory.test.d.ts +1 -0
- package/dist/test/vector-memory.test.js +153 -0
- package/dist/test/world-simulation.test.d.ts +1 -0
- package/dist/test/world-simulation.test.js +152 -0
- package/dist/types/index.d.ts +79 -0
- package/dist/types/index.js +3 -0
- package/dist/world/characterAgent.d.ts +73 -0
- package/dist/world/characterAgent.js +232 -0
- package/dist/world/eventResolver.d.ts +52 -0
- package/dist/world/eventResolver.js +205 -0
- package/dist/world/worldState.d.ts +93 -0
- package/dist/world/worldState.js +258 -0
- package/package.json +43 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { CharacterState } from '../story/structuredState.js';
|
|
2
|
+
export interface CharacterAgent {
|
|
3
|
+
name: string;
|
|
4
|
+
goals: string[];
|
|
5
|
+
currentGoal: string;
|
|
6
|
+
location: string;
|
|
7
|
+
knowledge: string[];
|
|
8
|
+
relationships: Record<string, string>;
|
|
9
|
+
personality: string[];
|
|
10
|
+
emotionalState: string;
|
|
11
|
+
inventory: string[];
|
|
12
|
+
agenda: AgendaItem[];
|
|
13
|
+
}
|
|
14
|
+
export interface AgendaItem {
|
|
15
|
+
id: string;
|
|
16
|
+
action: string;
|
|
17
|
+
priority: number;
|
|
18
|
+
deadline?: number;
|
|
19
|
+
completed: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface CharacterDecision {
|
|
22
|
+
character: string;
|
|
23
|
+
action: string;
|
|
24
|
+
target?: string;
|
|
25
|
+
reasoning: string;
|
|
26
|
+
consequences: string[];
|
|
27
|
+
}
|
|
28
|
+
export interface CharacterAgentContext {
|
|
29
|
+
character: CharacterAgent;
|
|
30
|
+
otherCharacters: CharacterAgent[];
|
|
31
|
+
worldEvents: string[];
|
|
32
|
+
currentChapter: number;
|
|
33
|
+
storyContext: string;
|
|
34
|
+
}
|
|
35
|
+
export declare class CharacterAgentSystem {
|
|
36
|
+
/**
|
|
37
|
+
* Create a character agent from structured state
|
|
38
|
+
*/
|
|
39
|
+
createAgent(characterState: CharacterState, personality: string[]): CharacterAgent;
|
|
40
|
+
/**
|
|
41
|
+
* Add an agenda item for a character
|
|
42
|
+
*/
|
|
43
|
+
addAgendaItem(agent: CharacterAgent, action: string, priority?: number, deadline?: number): CharacterAgent;
|
|
44
|
+
/**
|
|
45
|
+
* Complete an agenda item
|
|
46
|
+
*/
|
|
47
|
+
completeAgendaItem(agent: CharacterAgent, agendaId: string): CharacterAgent;
|
|
48
|
+
/**
|
|
49
|
+
* Update character knowledge
|
|
50
|
+
*/
|
|
51
|
+
addKnowledge(agent: CharacterAgent, fact: string): CharacterAgent;
|
|
52
|
+
/**
|
|
53
|
+
* Update relationship
|
|
54
|
+
*/
|
|
55
|
+
updateRelationship(agent: CharacterAgent, otherCharacter: string, relationship: string): CharacterAgent;
|
|
56
|
+
/**
|
|
57
|
+
* Move character to new location
|
|
58
|
+
*/
|
|
59
|
+
moveTo(agent: CharacterAgent, location: string): CharacterAgent;
|
|
60
|
+
/**
|
|
61
|
+
* Get character decision using LLM
|
|
62
|
+
*/
|
|
63
|
+
getDecision(context: CharacterAgentContext): Promise<CharacterDecision>;
|
|
64
|
+
/**
|
|
65
|
+
* Get simple decision without LLM (for testing/fallback)
|
|
66
|
+
*/
|
|
67
|
+
getSimpleDecision(context: CharacterAgentContext): CharacterDecision;
|
|
68
|
+
/**
|
|
69
|
+
* Simulate multiple characters making decisions
|
|
70
|
+
*/
|
|
71
|
+
simulateTurn(agents: CharacterAgent[], worldEvents: string[], currentChapter: number, storyContext: string, useLLM?: boolean): Promise<CharacterDecision[]>;
|
|
72
|
+
}
|
|
73
|
+
export declare const characterAgentSystem: CharacterAgentSystem;
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.characterAgentSystem = exports.CharacterAgentSystem = void 0;
|
|
4
|
+
const client_js_1 = require("../llm/client.js");
|
|
5
|
+
const CHARACTER_DECISION_PROMPT = `You are simulating a character in a narrative. Decide what this character would do next based on their personality, goals, and current situation.
|
|
6
|
+
|
|
7
|
+
## Character
|
|
8
|
+
|
|
9
|
+
**Name:** {{name}}
|
|
10
|
+
**Personality:** {{personality}}
|
|
11
|
+
**Current Emotional State:** {{emotionalState}}
|
|
12
|
+
**Location:** {{location}}
|
|
13
|
+
|
|
14
|
+
### Goals
|
|
15
|
+
{{goals}}
|
|
16
|
+
|
|
17
|
+
### Current Agenda
|
|
18
|
+
{{agenda}}
|
|
19
|
+
|
|
20
|
+
### Knowledge
|
|
21
|
+
{{knowledge}}
|
|
22
|
+
|
|
23
|
+
### Relationships
|
|
24
|
+
{{relationships}}
|
|
25
|
+
|
|
26
|
+
## Current Situation
|
|
27
|
+
|
|
28
|
+
**Chapter:** {{chapter}}
|
|
29
|
+
**Story Context:** {{storyContext}}
|
|
30
|
+
|
|
31
|
+
### Other Characters Present
|
|
32
|
+
{{otherCharacters}}
|
|
33
|
+
|
|
34
|
+
### Recent World Events
|
|
35
|
+
{{worldEvents}}
|
|
36
|
+
|
|
37
|
+
## Your Task
|
|
38
|
+
|
|
39
|
+
Decide what {{name}} would do next. Consider:
|
|
40
|
+
1. Their personality and emotional state
|
|
41
|
+
2. Their current goals and agenda
|
|
42
|
+
3. Their relationships with others
|
|
43
|
+
4. Recent events that might affect their decision
|
|
44
|
+
5. What would create interesting dramatic possibilities
|
|
45
|
+
|
|
46
|
+
Output JSON:
|
|
47
|
+
{
|
|
48
|
+
"character": "{{name}}",
|
|
49
|
+
"action": "What they decide to do (be specific and actionable)",
|
|
50
|
+
"target": "Who or what they act toward (if anyone)",
|
|
51
|
+
"reasoning": "Why they make this decision based on their character",
|
|
52
|
+
"consequences": ["Possible outcomes or reactions from this action"]
|
|
53
|
+
}`;
|
|
54
|
+
class CharacterAgentSystem {
|
|
55
|
+
/**
|
|
56
|
+
* Create a character agent from structured state
|
|
57
|
+
*/
|
|
58
|
+
createAgent(characterState, personality) {
|
|
59
|
+
return {
|
|
60
|
+
name: characterState.name,
|
|
61
|
+
goals: [...characterState.goals],
|
|
62
|
+
currentGoal: characterState.goals[0] || 'unknown',
|
|
63
|
+
location: characterState.location,
|
|
64
|
+
knowledge: [...characterState.knowledge],
|
|
65
|
+
relationships: { ...characterState.relationships },
|
|
66
|
+
personality: [...personality],
|
|
67
|
+
emotionalState: characterState.emotionalState,
|
|
68
|
+
inventory: [],
|
|
69
|
+
agenda: [],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Add an agenda item for a character
|
|
74
|
+
*/
|
|
75
|
+
addAgendaItem(agent, action, priority = 5, deadline) {
|
|
76
|
+
return {
|
|
77
|
+
...agent,
|
|
78
|
+
agenda: [
|
|
79
|
+
...agent.agenda,
|
|
80
|
+
{
|
|
81
|
+
id: `agenda-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,
|
|
82
|
+
action,
|
|
83
|
+
priority,
|
|
84
|
+
deadline,
|
|
85
|
+
completed: false,
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Complete an agenda item
|
|
92
|
+
*/
|
|
93
|
+
completeAgendaItem(agent, agendaId) {
|
|
94
|
+
return {
|
|
95
|
+
...agent,
|
|
96
|
+
agenda: agent.agenda.map(item => item.id === agendaId ? { ...item, completed: true } : item),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Update character knowledge
|
|
101
|
+
*/
|
|
102
|
+
addKnowledge(agent, fact) {
|
|
103
|
+
if (agent.knowledge.includes(fact))
|
|
104
|
+
return agent;
|
|
105
|
+
return {
|
|
106
|
+
...agent,
|
|
107
|
+
knowledge: [...agent.knowledge, fact],
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Update relationship
|
|
112
|
+
*/
|
|
113
|
+
updateRelationship(agent, otherCharacter, relationship) {
|
|
114
|
+
return {
|
|
115
|
+
...agent,
|
|
116
|
+
relationships: {
|
|
117
|
+
...agent.relationships,
|
|
118
|
+
[otherCharacter]: relationship,
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Move character to new location
|
|
124
|
+
*/
|
|
125
|
+
moveTo(agent, location) {
|
|
126
|
+
return {
|
|
127
|
+
...agent,
|
|
128
|
+
location,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get character decision using LLM
|
|
133
|
+
*/
|
|
134
|
+
async getDecision(context) {
|
|
135
|
+
const { character, otherCharacters, worldEvents, currentChapter, storyContext } = context;
|
|
136
|
+
const prompt = CHARACTER_DECISION_PROMPT
|
|
137
|
+
.replace(/{{name}}/g, character.name)
|
|
138
|
+
.replace('{{personality}}', character.personality.join(', '))
|
|
139
|
+
.replace('{{emotionalState}}', character.emotionalState)
|
|
140
|
+
.replace('{{location}}', character.location)
|
|
141
|
+
.replace('{{goals}}', character.goals.map(g => `- ${g}`).join('\n'))
|
|
142
|
+
.replace('{{agenda}}', character.agenda.filter(a => !a.completed).map(a => `- ${a.action} (priority: ${a.priority})`).join('\n') || 'No active agenda')
|
|
143
|
+
.replace('{{knowledge}}', character.knowledge.map(k => `- ${k}`).join('\n') || 'No special knowledge')
|
|
144
|
+
.replace('{{relationships}}', Object.entries(character.relationships).map(([name, rel]) => `- ${name}: ${rel}`).join('\n') || 'No significant relationships')
|
|
145
|
+
.replace('{{chapter}}', currentChapter.toString())
|
|
146
|
+
.replace('{{storyContext}}', storyContext)
|
|
147
|
+
.replace('{{otherCharacters}}', otherCharacters.map(c => `- ${c.name} (${c.emotionalState}, at ${c.location})`).join('\n') || 'No other characters present')
|
|
148
|
+
.replace('{{worldEvents}}', worldEvents.map(e => `- ${e}`).join('\n') || 'No recent events');
|
|
149
|
+
const result = await (0, client_js_1.getLLM)().completeJSON(prompt, {
|
|
150
|
+
temperature: 0.5,
|
|
151
|
+
maxTokens: 1000,
|
|
152
|
+
});
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get simple decision without LLM (for testing/fallback)
|
|
157
|
+
*/
|
|
158
|
+
getSimpleDecision(context) {
|
|
159
|
+
const { character, otherCharacters } = context;
|
|
160
|
+
// Find incomplete agenda items
|
|
161
|
+
const activeAgenda = character.agenda.filter(a => !a.completed);
|
|
162
|
+
if (activeAgenda.length > 0) {
|
|
163
|
+
// Follow highest priority agenda item
|
|
164
|
+
const topPriority = activeAgenda.sort((a, b) => b.priority - a.priority)[0];
|
|
165
|
+
return {
|
|
166
|
+
character: character.name,
|
|
167
|
+
action: topPriority.action,
|
|
168
|
+
reasoning: `Following their agenda: ${topPriority.action}`,
|
|
169
|
+
consequences: ['Progress toward goal'],
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
// React to other characters if present
|
|
173
|
+
if (otherCharacters.length > 0) {
|
|
174
|
+
const other = otherCharacters[0];
|
|
175
|
+
const relationship = character.relationships[other.name] || 'neutral';
|
|
176
|
+
if (relationship.includes('friend') || relationship.includes('ally')) {
|
|
177
|
+
return {
|
|
178
|
+
character: character.name,
|
|
179
|
+
action: `Approach ${other.name} to talk`,
|
|
180
|
+
target: other.name,
|
|
181
|
+
reasoning: `They are ${relationship} and nearby`,
|
|
182
|
+
consequences: ['Social interaction', 'Information exchange'],
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
if (relationship.includes('enemy') || relationship.includes('hostile')) {
|
|
186
|
+
return {
|
|
187
|
+
character: character.name,
|
|
188
|
+
action: `Keep distance from ${other.name}`,
|
|
189
|
+
target: other.name,
|
|
190
|
+
reasoning: `They are ${relationship}`,
|
|
191
|
+
consequences: ['Avoiding conflict', 'Maintaining safety'],
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Default: pursue current goal
|
|
196
|
+
return {
|
|
197
|
+
character: character.name,
|
|
198
|
+
action: `Work toward goal: ${character.currentGoal}`,
|
|
199
|
+
reasoning: 'No immediate distractions, focusing on primary objective',
|
|
200
|
+
consequences: ['Progress toward goal', 'Possible new opportunities'],
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Simulate multiple characters making decisions
|
|
205
|
+
*/
|
|
206
|
+
async simulateTurn(agents, worldEvents, currentChapter, storyContext, useLLM = false) {
|
|
207
|
+
const decisions = [];
|
|
208
|
+
for (const agent of agents) {
|
|
209
|
+
const context = {
|
|
210
|
+
character: agent,
|
|
211
|
+
otherCharacters: agents.filter(a => a.name !== agent.name),
|
|
212
|
+
worldEvents,
|
|
213
|
+
currentChapter,
|
|
214
|
+
storyContext,
|
|
215
|
+
};
|
|
216
|
+
try {
|
|
217
|
+
const decision = useLLM
|
|
218
|
+
? await this.getDecision(context)
|
|
219
|
+
: this.getSimpleDecision(context);
|
|
220
|
+
decisions.push(decision);
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
// Fallback to simple decision on error
|
|
224
|
+
decisions.push(this.getSimpleDecision(context));
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return decisions;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
exports.CharacterAgentSystem = CharacterAgentSystem;
|
|
231
|
+
exports.characterAgentSystem = new CharacterAgentSystem();
|
|
232
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcmFjdGVyQWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ybGQvY2hhcmFjdGVyQWdlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZ0RBQTBDO0FBd0MxQyxNQUFNLHlCQUF5QixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFnRGhDLENBQUM7QUFFSCxNQUFhLG9CQUFvQjtJQUMvQjs7T0FFRztJQUNILFdBQVcsQ0FBQyxjQUE4QixFQUFFLFdBQXFCO1FBQy9ELE9BQU87WUFDTCxJQUFJLEVBQUUsY0FBYyxDQUFDLElBQUk7WUFDekIsS0FBSyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFdBQVcsRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLFNBQVM7WUFDakQsUUFBUSxFQUFFLGNBQWMsQ0FBQyxRQUFRO1lBQ2pDLFNBQVMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLFNBQVMsQ0FBQztZQUN4QyxhQUFhLEVBQUUsRUFBRSxHQUFHLGNBQWMsQ0FBQyxhQUFhLEVBQUU7WUFDbEQsV0FBVyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUM7WUFDN0IsY0FBYyxFQUFFLGNBQWMsQ0FBQyxjQUFjO1lBQzdDLFNBQVMsRUFBRSxFQUFFO1lBQ2IsTUFBTSxFQUFFLEVBQUU7U0FDWCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYSxDQUNYLEtBQXFCLEVBQ3JCLE1BQWMsRUFDZCxXQUFtQixDQUFDLEVBQ3BCLFFBQWlCO1FBRWpCLE9BQU87WUFDTCxHQUFHLEtBQUs7WUFDUixNQUFNLEVBQUU7Z0JBQ04sR0FBRyxLQUFLLENBQUMsTUFBTTtnQkFDZjtvQkFDRSxFQUFFLEVBQUUsVUFBVSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEs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LENBQUMsT0FBTyxDQUFDO29CQUNqQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNwQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzNCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLHVDQUF1QztnQkFDdkMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNsRCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQWxORCxvREFrTkM7QUFFWSxRQUFBLG9CQUFvQixHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldExMTSB9IGZyb20gJy4uL2xsbS9jbGllbnQuanMnO1xyXG5pbXBvcnQgdHlwZSB7IENoYXJhY3RlclN0YXRlIH0gZnJvbSAnLi4vc3Rvcnkvc3RydWN0dXJlZFN0YXRlLmpzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2hhcmFjdGVyQWdlbnQge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBnb2Fsczogc3RyaW5nW107XHJcbiAgY3VycmVudEdvYWw6IHN0cmluZztcclxuICBsb2NhdGlvbjogc3RyaW5nO1xyXG4gIGtub3dsZWRnZTogc3RyaW5nW107XHJcbiAgcmVsYXRpb25zaGlwczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcclxuICBwZXJzb25hbGl0eTogc3RyaW5nW107XHJcbiAgZW1vdGlvbmFsU3RhdGU6IHN0cmluZztcclxuICBpbnZlbnRvcnk6IHN0cmluZ1tdO1xyXG4gIGFnZW5kYTogQWdlbmRhSXRlbVtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFnZW5kYUl0ZW0ge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgYWN0aW9uOiBzdHJpbmc7XHJcbiAgcHJpb3JpdHk6IG51bWJlcjtcclxuICBkZWFkbGluZT86IG51bWJlcjsgLy8gY2hhcHRlciBudW1iZXJcclxuICBjb21wbGV0ZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2hhcmFjdGVyRGVjaXNpb24ge1xyXG4gIGNoYXJhY3Rlcjogc3RyaW5nO1xyXG4gIGFjdGlvbjogc3RyaW5nO1xyXG4gIHRhcmdldD86IHN0cmluZztcclxuICByZWFzb25pbmc6IHN0cmluZztcclxuICBjb25zZXF1ZW5jZXM6IHN0cmluZ1tdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENoYXJhY3RlckFnZW50Q29udGV4dCB7XHJcbiAgY2hhcmFjdGVyOiBDaGFyYWN0ZXJBZ2VudDtcclxuICBvdGhlckNoYXJhY3RlcnM6IENoYXJhY3RlckFnZW50W107XHJcbiAgd29ybGRFdmVudHM6IHN0cmluZ1tdO1xyXG4gIGN1cnJlbnRDaGFwdGVyOiBudW1iZXI7XHJcbiAgc3RvcnlDb250ZXh0OiBzdHJpbmc7XHJcbn1cclxuXHJcbmNvbnN0IENIQVJBQ1RFUl9ERUNJU0lPTl9QUk9NUFQgPSBgWW91IGFyZSBzaW11bGF0aW5nIGEgY2hhcmFjdGVyIGluIGEgbmFycmF0aXZlLiBEZWNpZGUgd2hhdCB0aGlzIGNoYXJhY3RlciB3b3VsZCBkbyBuZXh0IGJhc2VkIG9uIHRoZWlyIHBlcnNvbmFsaXR5LCBnb2FscywgYW5kIGN1cnJlbnQgc2l0dWF0aW9uLlxyXG5cclxuIyMgQ2hhcmFjdGVyXHJcblxyXG4qKk5hbWU6Kioge3tuYW1lfX1cclxuKipQZXJzb25hbGl0eToqKiB7e3BlcnNvbmFsaXR5fX1cclxuKipDdXJyZW50IEVtb3Rpb25hbCBTdGF0ZToqKiB7e2Vtb3Rpb25hbFN0YXRlfX1cclxuKipMb2NhdGlvbjoqKiB7e2xvY2F0aW9ufX1cclxuXHJcbiMjIyBHb2Fsc1xyXG57e2dvYWxzfX1cclxuXHJcbiMjIyBDdXJyZW50IEFnZW5kYVxyXG57e2FnZW5kYX19XHJcblxyXG4jIyMgS25vd2xlZGdlXHJcbnt7a25vd2xlZGdlfX1cclxuXHJcbiMjIyBSZWxhdGlvbnNoaXBzXHJcbnt7cmVsYXRpb25zaGlwc319XHJcblxyXG4jIyBDdXJyZW50IFNpdHVhdGlvblxyXG5cclxuKipDaGFwdGVyOioqIHt7Y2hhcHRlcn19XHJcbioqU3RvcnkgQ29udGV4dDoqKiB7e3N0b3J5Q29udGV4dH19XHJcblxyXG4jIyMgT3RoZXIgQ2hhcmFjdGVycyBQcmVzZW50XHJcbnt7b3RoZXJDaGFyYWN0ZXJzfX1cclxuXHJcbiMjIyBSZWNlbnQgV29ybGQgRXZlbnRzXHJcbnt7d29ybGRFdmVudHN9fVxyXG5cclxuIyMgWW91ciBUYXNrXHJcblxyXG5EZWNpZGUgd2hhdCB7e25hbWV9fSB3b3VsZCBkbyBuZXh0LiBDb25zaWRlcjpcclxuMS4gVGhlaXIgcGVyc29uYWxpdHkgYW5kIGVtb3Rpb25hbCBzdGF0ZVxyXG4yLiBUaGVpciBjdXJyZW50IGdvYWxzIGFuZCBhZ2VuZGFcclxuMy4gVGhlaXIgcmVsYXRpb25zaGlwcyB3aXRoIG90aGVyc1xyXG40LiBSZWNlbnQgZXZlbnRzIHRoYXQgbWlnaHQgYWZmZWN0IHRoZWlyIGRlY2lzaW9uXHJcbjUuIFdoYXQgd291bGQgY3JlYXRlIGludGVyZXN0aW5nIGRyYW1hdGljIHBvc3NpYmlsaXRpZXNcclxuXHJcbk91dHB1dCBKU09OOlxyXG57XHJcbiAgXCJjaGFyYWN0ZXJcIjogXCJ7e25hbWV9fVwiLFxyXG4gIFwiYWN0aW9uXCI6IFwiV2hhdCB0aGV5IGRlY2lkZSB0byBkbyAoYmUgc3BlY2lmaWMgYW5kIGFjdGlvbmFibGUpXCIsXHJcbiAgXCJ0YXJnZXRcIjogXCJXaG8gb3Igd2hhdCB0aGV5IGFjdCB0b3dhcmQgKGlmIGFueW9uZSlcIixcclxuICBcInJlYXNvbmluZ1wiOiBcIldoeSB0aGV5IG1ha2UgdGhpcyBkZWNpc2lvbiBiYXNlZCBvbiB0aGVpciBjaGFyYWN0ZXJcIixcclxuICBcImNvbnNlcXVlbmNlc1wiOiBbXCJQb3NzaWJsZSBvdXRjb21lcyBvciByZWFjdGlvbnMgZnJvbSB0aGlzIGFjdGlvblwiXVxyXG59YDtcclxuXHJcbmV4cG9ydCBjbGFzcyBDaGFyYWN0ZXJBZ2VudFN5c3RlbSB7XHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgY2hhcmFjdGVyIGFnZW50IGZyb20gc3RydWN0dXJlZCBzdGF0ZVxyXG4gICAqL1xyXG4gIGNyZWF0ZUFnZW50KGNoYXJhY3RlclN0YXRlOiBDaGFyYWN0ZXJTdGF0ZSwgcGVyc29uYWxpdHk6IHN0cmluZ1tdKTogQ2hhcmFjdGVyQWdlbnQge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbmFtZTogY2hhcmFjdGVyU3RhdGUubmFtZSxcclxuICAgICAgZ29hbHM6IFsuLi5jaGFyYWN0ZXJTdGF0ZS5nb2Fsc10sXHJcbiAgICAgIGN1cnJlbnRHb2FsOiBjaGFyYWN0ZXJTdGF0ZS5nb2Fsc1swXSB8fCAndW5rbm93bicsXHJcbiAgICAgIGxvY2F0aW9uOiBjaGFyYWN0ZXJTdGF0ZS5sb2NhdGlvbixcclxuICAgICAga25vd2xlZGdlOiBbLi4uY2hhcmFjdGVyU3RhdGUua25vd2xlZGdlXSxcclxuICAgICAgcmVsYXRpb25zaGlwczogeyAuLi5jaGFyYWN0ZXJTdGF0ZS5yZWxhdGlvbnNoaXBzIH0sXHJcbiAgICAgIHBlcnNvbmFsaXR5OiBbLi4ucGVyc29uYWxpdHldLFxyXG4gICAgICBlbW90aW9uYWxTdGF0ZTogY2hhcmFjdGVyU3RhdGUuZW1vdGlvbmFsU3RhdGUsXHJcbiAgICAgIGludmVudG9yeTogW10sXHJcbiAgICAgIGFnZW5kYTogW10sXHJcbiAgICB9O1xyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBBZGQgYW4gYWdlbmRhIGl0ZW0gZm9yIGEgY2hhcmFjdGVyXHJcbiAgICovXHJcbiAgYWRkQWdlbmRhSXRlbShcclxuICAgIGFnZW50OiBDaGFyYWN0ZXJBZ2VudCxcclxuICAgIGFjdGlvbjogc3RyaW5nLFxyXG4gICAgcHJpb3JpdHk6IG51bWJlciA9IDUsXHJcbiAgICBkZWFkbGluZT86IG51bWJlclxyXG4gICk6IENoYXJhY3RlckFnZW50IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLmFnZW50LFxyXG4gICAgICBhZ2VuZGE6IFtcclxuICAgICAgICAuLi5hZ2VudC5hZ2VuZGEsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaWQ6IGBhZ2VuZGEtJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gLFxyXG4gICAgICAgICAgYWN0aW9uLFxyXG4gICAgICAgICAgcHJpb3JpdHksXHJcbiAgICAgICAgICBkZWFkbGluZSxcclxuICAgICAgICAgIGNvbXBsZXRlZDogZmFsc2UsXHJcbiAgICAgICAgfSxcclxuICAgICAgXSxcclxuICAgIH07XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIENvbXBsZXRlIGFuIGFnZW5kYSBpdGVtXHJcbiAgICovXHJcbiAgY29tcGxldGVBZ2VuZGFJdGVtKGFnZW50OiBDaGFyYWN0ZXJBZ2VudCwgYWdlbmRhSWQ6IHN0cmluZyk6IENoYXJhY3RlckFnZW50IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC4uLmFnZW50LFxyXG4gICAgICBhZ2VuZGE6IGFnZW50LmFnZW5kYS5tYXAoaXRlbSA9PlxyXG4gICAgICAgIGl0ZW0uaWQgPT09IGFnZW5kYUlkID8geyAuLi5pdGVtLCBjb21wbGV0ZWQ6IHRydWUgfSA6IGl0ZW1cclxuICAgICAgKSxcclxuICAgIH07XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSBjaGFyYWN0ZXIga25vd2xlZGdlXHJcbiAgICovXHJcbiAgYWRkS25vd2xlZGdlKGFnZW50OiBDaGFyYWN0ZXJBZ2VudCwgZmFjdDogc3RyaW5nKTogQ2hhcmFjdGVyQWdlbnQge1xyXG4gICAgaWYgKGFnZW50Lmtub3dsZWRnZS5pbmNsdWRlcyhmYWN0KSkgcmV0dXJuIGFnZW50O1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4uYWdlbnQsXHJcbiAgICAgIGtub3dsZWRnZTogWy4uLmFnZW50Lmtub3dsZWRnZSwgZmFjdF0sXHJcbiAgICB9O1xyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBVcGRhdGUgcmVsYXRpb25zaGlwXHJcbiAgICovXHJcbiAgdXBkYXRlUmVsYXRpb25zaGlwKFxyXG4gICAgYWdlbnQ6IENoYXJhY3RlckFnZW50LFxyXG4gICAgb3RoZXJDaGFyYWN0ZXI6IHN0cmluZyxcclxuICAgIHJlbGF0aW9uc2hpcDogc3RyaW5nXHJcbiAgKTogQ2hhcmFjdGVyQWdlbnQge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4uYWdlbnQsXHJcbiAgICAgIHJlbGF0aW9uc2hpcHM6IHtcclxuICAgICAgICAuLi5hZ2VudC5yZWxhdGlvbnNoaXBzLFxyXG4gICAgICAgIFtvdGhlckNoYXJhY3Rlcl06IHJlbGF0aW9uc2hpcCxcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIE1vdmUgY2hhcmFjdGVyIHRvIG5ldyBsb2NhdGlvblxyXG4gICAqL1xyXG4gIG1vdmVUbyhhZ2VudDogQ2hhcmFjdGVyQWdlbnQsIGxvY2F0aW9uOiBzdHJpbmcpOiBDaGFyYWN0ZXJBZ2VudCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAuLi5hZ2VudCxcclxuICAgICAgbG9jYXRpb24sXHJcbiAgICB9O1xyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBHZXQgY2hhcmFjdGVyIGRlY2lzaW9uIHVzaW5nIExMTVxyXG4gICAqL1xyXG4gIGFzeW5jIGdldERlY2lzaW9uKGNvbnRleHQ6IENoYXJhY3RlckFnZW50Q29udGV4dCk6IFByb21pc2U8Q2hhcmFjdGVyRGVjaXNpb24+IHtcclxuICAgIGNvbnN0IHsgY2hhcmFjdGVyLCBvdGhlckNoYXJhY3RlcnMsIHdvcmxkRXZlbnRzLCBjdXJyZW50Q2hhcHRlciwgc3RvcnlDb250ZXh0IH0gPSBjb250ZXh0O1xyXG4gICAgXHJcbiAgICBjb25zdCBwcm9tcHQgPSBDSEFSQUNURVJfREVDSVNJT05fUFJPTVBUXHJcbiAgICAgIC5yZXBsYWNlKC97e25hbWV9fS9nLCBjaGFyYWN0ZXIubmFtZSlcclxuICAgICAgLnJlcGxhY2UoJ3t7cGVyc29uYWxpdHl9fScsIGNoYXJhY3Rlci5wZXJzb25hbGl0eS5qb2luKCcsICcpKVxyXG4gICAgICAucmVwbGFjZSgne3tlbW90aW9uYWxTdGF0ZX19JywgY2hhcmFjdGVyLmVtb3Rpb25hbFN0YXRlKVxyXG4gICAgICAucmVwbGFjZSgne3tsb2NhdGlvbn19JywgY2hhcmFjdGVyLmxvY2F0aW9uKVxyXG4gICAgICAucmVwbGFjZSgne3tnb2Fsc319JywgY2hhcmFjdGVyLmdvYWxzLm1hcChnID0+IGAtICR7Z31gKS5qb2luKCdcXG4nKSlcclxuICAgICAgLnJlcGxhY2UoJ3t7YWdlbmRhfX0nLCBjaGFyYWN0ZXIuYWdlbmRhLmZpbHRlcihhID0+ICFhLmNvbXBsZXRlZCkubWFwKGEgPT4gYC0gJHthLmFjdGlvbn0gKHByaW9yaXR5OiAke2EucHJpb3JpdHl9KWApLmpvaW4oJ1xcbicpIHx8ICdObyBhY3RpdmUgYWdlbmRhJylcclxuICAgICAgLnJlcGxhY2UoJ3t7a25vd2xlZGdlfX0nLCBjaGFyYWN0ZXIua25vd2xlZGdlLm1hcChrID0+IGAtICR7a31gKS5qb2luKCdcXG4nKSB8fCAnTm8gc3BlY2lhbCBrbm93bGVkZ2UnKVxyXG4gICAgICAucmVwbGFjZSgne3tyZWxhdGlvbnNoaXBzfX0nLCBPYmplY3QuZW50cmllcyhjaGFyYWN0ZXIucmVsYXRpb25zaGlwcykubWFwKChbbmFtZSwgcmVsXSkgPT4gYC0gJHtuYW1lfTogJHtyZWx9YCkuam9pbignXFxuJykgfHwgJ05vIHNpZ25pZmljYW50IHJlbGF0aW9uc2hpcHMnKVxyXG4gICAgICAucmVwbGFjZSgne3tjaGFwdGVyfX0nLCBjdXJyZW50Q2hhcHRlci50b1N0cmluZygpKVxyXG4gICAgICAucmVwbGFjZSgne3tzdG9yeUNvbnRleHR9fScsIHN0b3J5Q29udGV4dClcclxuICAgICAgLnJlcGxhY2UoJ3t7b3RoZXJDaGFyYWN0ZXJzfX0nLCBvdGhlckNoYXJhY3RlcnMubWFwKGMgPT4gYC0gJHtjLm5hbWV9ICgke2MuZW1vdGlvbmFsU3RhdGV9LCBhdCAke2MubG9jYXRpb259KWApLmpvaW4oJ1xcbicpIHx8ICdObyBvdGhlciBjaGFyYWN0ZXJzIHByZXNlbnQnKVxyXG4gICAgICAucmVwbGFjZSgne3t3b3JsZEV2ZW50c319Jywgd29ybGRFdmVudHMubWFwKGUgPT4gYC0gJHtlfWApLmpvaW4oJ1xcbicpIHx8ICdObyByZWNlbnQgZXZlbnRzJyk7XHJcbiAgICBcclxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldExMTSgpLmNvbXBsZXRlSlNPTjxDaGFyYWN0ZXJEZWNpc2lvbj4ocHJvbXB0LCB7XHJcbiAgICAgIHRlbXBlcmF0dXJlOiAwLjUsXHJcbiAgICAgIG1heFRva2VuczogMTAwMCxcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBHZXQgc2ltcGxlIGRlY2lzaW9uIHdpdGhvdXQgTExNIChmb3IgdGVzdGluZy9mYWxsYmFjaylcclxuICAgKi9cclxuICBnZXRTaW1wbGVEZWNpc2lvbihjb250ZXh0OiBDaGFyYWN0ZXJBZ2VudENvbnRleHQpOiBDaGFyYWN0ZXJEZWNpc2lvbiB7XHJcbiAgICBjb25zdCB7IGNoYXJhY3Rlciwgb3RoZXJDaGFyYWN0ZXJzIH0gPSBjb250ZXh0O1xyXG4gICAgXHJcbiAgICAvLyBGaW5kIGluY29tcGxldGUgYWdlbmRhIGl0ZW1zXHJcbiAgICBjb25zdCBhY3RpdmVBZ2VuZGEgPSBjaGFyYWN0ZXIuYWdlbmRhLmZpbHRlcihhID0+ICFhLmNvbXBsZXRlZCk7XHJcbiAgICBcclxuICAgIGlmIChhY3RpdmVBZ2VuZGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyBGb2xsb3cgaGlnaGVzdCBwcmlvcml0eSBhZ2VuZGEgaXRlbVxyXG4gICAgICBjb25zdCB0b3BQcmlvcml0eSA9IGFjdGl2ZUFnZW5kYS5zb3J0KChhLCBiKSA9PiBiLnByaW9yaXR5IC0gYS5wcmlvcml0eSlbMF07XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgY2hhcmFjdGVyOiBjaGFyYWN0ZXIubmFtZSxcclxuICAgICAgICBhY3Rpb246IHRvcFByaW9yaXR5LmFjdGlvbixcclxuICAgICAgICByZWFzb25pbmc6IGBGb2xsb3dpbmcgdGhlaXIgYWdlbmRhOiAke3RvcFByaW9yaXR5LmFjdGlvbn1gLFxyXG4gICAgICAgIGNvbnNlcXVlbmNlczogWydQcm9ncmVzcyB0b3dhcmQgZ29hbCddLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBSZWFjdCB0byBvdGhlciBjaGFyYWN0ZXJzIGlmIHByZXNlbnRcclxuICAgIGlmIChvdGhlckNoYXJhY3RlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBvdGhlciA9IG90aGVyQ2hhcmFjdGVyc1swXTtcclxuICAgICAgY29uc3QgcmVsYXRpb25zaGlwID0gY2hhcmFjdGVyLnJlbGF0aW9uc2hpcHNbb3RoZXIubmFtZV0gfHwgJ25ldXRyYWwnO1xyXG4gICAgICBcclxuICAgICAgaWYgKHJlbGF0aW9uc2hpcC5pbmNsdWRlcygnZnJpZW5kJykgfHwgcmVsYXRpb25zaGlwLmluY2x1ZGVzKCdhbGx5JykpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgY2hhcmFjdGVyOiBjaGFyYWN0ZXIubmFtZSxcclxuICAgICAgICAgIGFjdGlvbjogYEFwcHJvYWNoICR7b3RoZXIubmFtZX0gdG8gdGFsa2AsXHJcbiAgICAgICAgICB0YXJnZXQ6IG90aGVyLm5hbWUsXHJcbiAgICAgICAgICByZWFzb25pbmc6IGBUaGV5IGFyZSAke3JlbGF0aW9uc2hpcH0gYW5kIG5lYXJieWAsXHJcbiAgICAgICAgICBjb25zZXF1ZW5jZXM6IFsnU29jaWFsIGludGVyYWN0aW9uJywgJ0luZm9ybWF0aW9uIGV4Y2hhbmdlJ10sXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgaWYgKHJlbGF0aW9uc2hpcC5pbmNsdWRlcygnZW5lbXknKSB8fCByZWxhdGlvbnNoaXAuaW5jbHVkZXMoJ2hvc3RpbGUnKSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBjaGFyYWN0ZXI6IGNoYXJhY3Rlci5uYW1lLFxyXG4gICAgICAgICAgYWN0aW9uOiBgS2VlcCBkaXN0YW5jZSBmcm9tICR7b3RoZXIubmFtZX1gLFxyXG4gICAgICAgICAgdGFyZ2V0OiBvdGhlci5uYW1lLFxyXG4gICAgICAgICAgcmVhc29uaW5nOiBgVGhleSBhcmUgJHtyZWxhdGlvbnNoaXB9YCxcclxuICAgICAgICAgIGNvbnNlcXVlbmNlczogWydBdm9pZGluZyBjb25mbGljdCcsICdNYWludGFpbmluZyBzYWZldHknXSxcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIERlZmF1bHQ6IHB1cnN1ZSBjdXJyZW50IGdvYWxcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGNoYXJhY3RlcjogY2hhcmFjdGVyLm5hbWUsXHJcbiAgICAgIGFjdGlvbjogYFdvcmsgdG93YXJkIGdvYWw6ICR7Y2hhcmFjdGVyLmN1cnJlbnRHb2FsfWAsXHJcbiAgICAgIHJlYXNvbmluZzogJ05vIGltbWVkaWF0ZSBkaXN0cmFjdGlvbnMsIGZvY3VzaW5nIG9uIHByaW1hcnkgb2JqZWN0aXZlJyxcclxuICAgICAgY29uc2VxdWVuY2VzOiBbJ1Byb2dyZXNzIHRvd2FyZCBnb2FsJywgJ1Bvc3NpYmxlIG5ldyBvcHBvcnR1bml0aWVzJ10sXHJcbiAgICB9O1xyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBTaW11bGF0ZSBtdWx0aXBsZSBjaGFyYWN0ZXJzIG1ha2luZyBkZWNpc2lvbnNcclxuICAgKi9cclxuICBhc3luYyBzaW11bGF0ZVR1cm4oXHJcbiAgICBhZ2VudHM6IENoYXJhY3RlckFnZW50W10sXHJcbiAgICB3b3JsZEV2ZW50czogc3RyaW5nW10sXHJcbiAgICBjdXJyZW50Q2hhcHRlcjogbnVtYmVyLFxyXG4gICAgc3RvcnlDb250ZXh0OiBzdHJpbmcsXHJcbiAgICB1c2VMTE06IGJvb2xlYW4gPSBmYWxzZVxyXG4gICk6IFByb21pc2U8Q2hhcmFjdGVyRGVjaXNpb25bXT4ge1xyXG4gICAgY29uc3QgZGVjaXNpb25zOiBDaGFyYWN0ZXJEZWNpc2lvbltdID0gW107XHJcbiAgICBcclxuICAgIGZvciAoY29uc3QgYWdlbnQgb2YgYWdlbnRzKSB7XHJcbiAgICAgIGNvbnN0IGNvbnRleHQ6IENoYXJhY3RlckFnZW50Q29udGV4dCA9IHtcclxuICAgICAgICBjaGFyYWN0ZXI6IGFnZW50LFxyXG4gICAgICAgIG90aGVyQ2hhcmFjdGVyczogYWdlbnRzLmZpbHRlcihhID0+IGEubmFtZSAhPT0gYWdlbnQubmFtZSksXHJcbiAgICAgICAgd29ybGRFdmVudHMsXHJcbiAgICAgICAgY3VycmVudENoYXB0ZXIsXHJcbiAgICAgICAgc3RvcnlDb250ZXh0LFxyXG4gICAgICB9O1xyXG4gICAgICBcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBkZWNpc2lvbiA9IHVzZUxMTVxyXG4gICAgICAgICAgPyBhd2FpdCB0aGlzLmdldERlY2lzaW9uKGNvbnRleHQpXHJcbiAgICAgICAgICA6IHRoaXMuZ2V0U2ltcGxlRGVjaXNpb24oY29udGV4dCk7XHJcbiAgICAgICAgZGVjaXNpb25zLnB1c2goZGVjaXNpb24pO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIHNpbXBsZSBkZWNpc2lvbiBvbiBlcnJvclxyXG4gICAgICAgIGRlY2lzaW9ucy5wdXNoKHRoaXMuZ2V0U2ltcGxlRGVjaXNpb24oY29udGV4dCkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBkZWNpc2lvbnM7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgY2hhcmFjdGVyQWdlbnRTeXN0ZW0gPSBuZXcgQ2hhcmFjdGVyQWdlbnRTeXN0ZW0oKTtcclxuIl19
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { CharacterAgent } from './characterAgent.js';
|
|
2
|
+
import type { CharacterDecision } from './characterAgent.js';
|
|
3
|
+
export interface WorldEvent {
|
|
4
|
+
id: string;
|
|
5
|
+
type: 'interaction' | 'conflict' | 'discovery' | 'movement' | 'environmental';
|
|
6
|
+
description: string;
|
|
7
|
+
participants: string[];
|
|
8
|
+
location: string;
|
|
9
|
+
chapter: number;
|
|
10
|
+
resolved: boolean;
|
|
11
|
+
outcome?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface EventResolution {
|
|
14
|
+
event: WorldEvent;
|
|
15
|
+
outcome: string;
|
|
16
|
+
affectedCharacters: string[];
|
|
17
|
+
consequences: string[];
|
|
18
|
+
newEvents?: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface ConflictResolution {
|
|
21
|
+
winner?: string;
|
|
22
|
+
compromise: boolean;
|
|
23
|
+
outcome: string;
|
|
24
|
+
damage: string[];
|
|
25
|
+
}
|
|
26
|
+
export declare class EventResolver {
|
|
27
|
+
/**
|
|
28
|
+
* Resolve character decisions into world events
|
|
29
|
+
*/
|
|
30
|
+
resolveDecisions(decisions: CharacterDecision[], currentChapter: number): WorldEvent[];
|
|
31
|
+
/**
|
|
32
|
+
* Categorize an action into event type
|
|
33
|
+
*/
|
|
34
|
+
private categorizeAction;
|
|
35
|
+
/**
|
|
36
|
+
* Resolve a conflict between characters
|
|
37
|
+
*/
|
|
38
|
+
resolveConflict(event: WorldEvent, participants: CharacterAgent[]): ConflictResolution;
|
|
39
|
+
/**
|
|
40
|
+
* Resolve an event and determine consequences
|
|
41
|
+
*/
|
|
42
|
+
resolveEvent(event: WorldEvent, participants: CharacterAgent[]): EventResolution;
|
|
43
|
+
/**
|
|
44
|
+
* Process all pending events
|
|
45
|
+
*/
|
|
46
|
+
processEvents(events: WorldEvent[], agents: Map<string, CharacterAgent>): EventResolution[];
|
|
47
|
+
/**
|
|
48
|
+
* Generate narrative description of event resolution
|
|
49
|
+
*/
|
|
50
|
+
narrateResolution(resolution: EventResolution): string;
|
|
51
|
+
}
|
|
52
|
+
export declare const eventResolver: EventResolver;
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.eventResolver = exports.EventResolver = void 0;
|
|
4
|
+
class EventResolver {
|
|
5
|
+
/**
|
|
6
|
+
* Resolve character decisions into world events
|
|
7
|
+
*/
|
|
8
|
+
resolveDecisions(decisions, currentChapter) {
|
|
9
|
+
const events = [];
|
|
10
|
+
// Group decisions by location
|
|
11
|
+
const locationGroups = new Map();
|
|
12
|
+
for (const decision of decisions) {
|
|
13
|
+
// Note: location would need to be passed in or tracked
|
|
14
|
+
const location = 'current location'; // Simplified
|
|
15
|
+
const existing = locationGroups.get(location) || [];
|
|
16
|
+
existing.push(decision);
|
|
17
|
+
locationGroups.set(location, existing);
|
|
18
|
+
}
|
|
19
|
+
// Check for interactions between characters at same location
|
|
20
|
+
for (const [location, locationDecisions] of locationGroups) {
|
|
21
|
+
if (locationDecisions.length >= 2) {
|
|
22
|
+
// Check for mutual interactions
|
|
23
|
+
for (let i = 0; i < locationDecisions.length; i++) {
|
|
24
|
+
for (let j = i + 1; j < locationDecisions.length; j++) {
|
|
25
|
+
const d1 = locationDecisions[i];
|
|
26
|
+
const d2 = locationDecisions[j];
|
|
27
|
+
// Check if they're interacting with each other
|
|
28
|
+
if (d1.target === d2.character && d2.target === d1.character) {
|
|
29
|
+
events.push({
|
|
30
|
+
id: `event-${Date.now()}-${events.length}`,
|
|
31
|
+
type: 'interaction',
|
|
32
|
+
description: `${d1.character} and ${d2.character} interact`,
|
|
33
|
+
participants: [d1.character, d2.character],
|
|
34
|
+
location,
|
|
35
|
+
chapter: currentChapter,
|
|
36
|
+
resolved: false,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Add individual actions as events
|
|
43
|
+
for (const decision of locationDecisions) {
|
|
44
|
+
if (!events.some(e => e.participants.includes(decision.character))) {
|
|
45
|
+
events.push({
|
|
46
|
+
id: `event-${Date.now()}-${events.length}`,
|
|
47
|
+
type: this.categorizeAction(decision.action),
|
|
48
|
+
description: `${decision.character}: ${decision.action}`,
|
|
49
|
+
participants: [decision.character],
|
|
50
|
+
location,
|
|
51
|
+
chapter: currentChapter,
|
|
52
|
+
resolved: false,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return events;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Categorize an action into event type
|
|
61
|
+
*/
|
|
62
|
+
categorizeAction(action) {
|
|
63
|
+
const actionLower = action.toLowerCase();
|
|
64
|
+
if (actionLower.includes('fight') || actionLower.includes('attack') || actionLower.includes('confront')) {
|
|
65
|
+
return 'conflict';
|
|
66
|
+
}
|
|
67
|
+
if (actionLower.includes('find') || actionLower.includes('discover') || actionLower.includes('learn')) {
|
|
68
|
+
return 'discovery';
|
|
69
|
+
}
|
|
70
|
+
if (actionLower.includes('go') || actionLower.includes('move') || actionLower.includes('travel')) {
|
|
71
|
+
return 'movement';
|
|
72
|
+
}
|
|
73
|
+
if (actionLower.includes('weather') || actionLower.includes('storm') || actionLower.includes('dark')) {
|
|
74
|
+
return 'environmental';
|
|
75
|
+
}
|
|
76
|
+
return 'interaction';
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Resolve a conflict between characters
|
|
80
|
+
*/
|
|
81
|
+
resolveConflict(event, participants) {
|
|
82
|
+
// Simple resolution based on emotional state and personality
|
|
83
|
+
const scores = participants.map(p => {
|
|
84
|
+
let score = 5; // base
|
|
85
|
+
// Emotional state affects capability
|
|
86
|
+
if (p.emotionalState.includes('angry') || p.emotionalState.includes('furious')) {
|
|
87
|
+
score += 2;
|
|
88
|
+
}
|
|
89
|
+
if (p.emotionalState.includes('fear') || p.emotionalState.includes('terrified')) {
|
|
90
|
+
score -= 2;
|
|
91
|
+
}
|
|
92
|
+
if (p.emotionalState.includes('calm') || p.emotionalState.includes('focused')) {
|
|
93
|
+
score += 1;
|
|
94
|
+
}
|
|
95
|
+
// Personality traits
|
|
96
|
+
if (p.personality.some(t => t.includes('strong') || t.includes('brave'))) {
|
|
97
|
+
score += 1;
|
|
98
|
+
}
|
|
99
|
+
if (p.personality.some(t => t.includes('weak') || t.includes('timid'))) {
|
|
100
|
+
score -= 1;
|
|
101
|
+
}
|
|
102
|
+
return { name: p.name, score };
|
|
103
|
+
});
|
|
104
|
+
// Determine outcome
|
|
105
|
+
scores.sort((a, b) => b.score - a.score);
|
|
106
|
+
const winner = scores[0];
|
|
107
|
+
const loser = scores[scores.length - 1];
|
|
108
|
+
const scoreDiff = winner.score - loser.score;
|
|
109
|
+
if (scoreDiff < 2) {
|
|
110
|
+
// Close match - compromise
|
|
111
|
+
return {
|
|
112
|
+
compromise: true,
|
|
113
|
+
outcome: 'Both sides reach a compromise',
|
|
114
|
+
damage: ['Minor injuries', 'Tension remains'],
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
winner: winner.name,
|
|
119
|
+
compromise: false,
|
|
120
|
+
outcome: `${winner.name} prevails over ${loser.name}`,
|
|
121
|
+
damage: [`${loser.name} is defeated`, 'Physical or emotional consequences'],
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Resolve an event and determine consequences
|
|
126
|
+
*/
|
|
127
|
+
resolveEvent(event, participants) {
|
|
128
|
+
let outcome = '';
|
|
129
|
+
const consequences = [];
|
|
130
|
+
const newEvents = [];
|
|
131
|
+
switch (event.type) {
|
|
132
|
+
case 'conflict':
|
|
133
|
+
const conflictResult = this.resolveConflict(event, participants);
|
|
134
|
+
outcome = conflictResult.outcome;
|
|
135
|
+
consequences.push(...conflictResult.damage);
|
|
136
|
+
if (conflictResult.winner) {
|
|
137
|
+
consequences.push(`${conflictResult.winner} gains advantage`);
|
|
138
|
+
}
|
|
139
|
+
break;
|
|
140
|
+
case 'discovery':
|
|
141
|
+
outcome = `${participants[0]?.name} makes an important discovery`;
|
|
142
|
+
consequences.push('New knowledge gained', 'Future possibilities opened');
|
|
143
|
+
break;
|
|
144
|
+
case 'interaction':
|
|
145
|
+
if (participants.length >= 2) {
|
|
146
|
+
outcome = `${participants.map(p => p.name).join(' and ')} have a meaningful interaction`;
|
|
147
|
+
consequences.push('Relationship development', 'Information exchange');
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
outcome = `${participants[0]?.name} takes action`;
|
|
151
|
+
consequences.push('Progress toward goal');
|
|
152
|
+
}
|
|
153
|
+
break;
|
|
154
|
+
case 'movement':
|
|
155
|
+
outcome = `${participants[0]?.name} changes location`;
|
|
156
|
+
consequences.push('New environment', 'New opportunities or dangers');
|
|
157
|
+
break;
|
|
158
|
+
case 'environmental':
|
|
159
|
+
outcome = 'Environmental event affects the scene';
|
|
160
|
+
consequences.push('All participants must react', 'Situation becomes more complex');
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
event: { ...event, resolved: true, outcome },
|
|
165
|
+
outcome,
|
|
166
|
+
affectedCharacters: participants.map(p => p.name),
|
|
167
|
+
consequences,
|
|
168
|
+
newEvents,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Process all pending events
|
|
173
|
+
*/
|
|
174
|
+
processEvents(events, agents) {
|
|
175
|
+
const resolutions = [];
|
|
176
|
+
for (const event of events.filter(e => !e.resolved)) {
|
|
177
|
+
const participants = event.participants
|
|
178
|
+
.map(name => agents.get(name))
|
|
179
|
+
.filter((agent) => agent !== undefined);
|
|
180
|
+
if (participants.length > 0) {
|
|
181
|
+
const resolution = this.resolveEvent(event, participants);
|
|
182
|
+
resolutions.push(resolution);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return resolutions;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Generate narrative description of event resolution
|
|
189
|
+
*/
|
|
190
|
+
narrateResolution(resolution) {
|
|
191
|
+
const lines = [];
|
|
192
|
+
lines.push(`**${resolution.event.description}**`);
|
|
193
|
+
lines.push(`Outcome: ${resolution.outcome}`);
|
|
194
|
+
if (resolution.consequences.length > 0) {
|
|
195
|
+
lines.push('Consequences:');
|
|
196
|
+
for (const consequence of resolution.consequences) {
|
|
197
|
+
lines.push(` - ${consequence}`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return lines.join('\n');
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
exports.EventResolver = EventResolver;
|
|
204
|
+
exports.eventResolver = new EventResolver();
|
|
205
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRSZXNvbHZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JsZC9ldmVudFJlc29sdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTZCQSxNQUFhLGFBQWE7SUFDeEI7O09BRUc7SUFDSCxnQkFBZ0IsQ0FDZCxTQUE4QixFQUM5QixjQUFzQjtRQUV0QixNQUFNLE1BQU0sR0FBaUIsRUFBRSxDQUFDO1FBRWhDLDhCQUE4QjtRQUM5QixNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztRQUM5RCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLHVEQUF1RDtZQUN2RCxNQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLGFBQWE7WUFDbEQsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDcEQsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4QixjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsNkRBQTZEO1FBQzdELEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQzNELElBQUksaUJBQWlCLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxnQ0FBZ0M7Z0JBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDbEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzt3QkFDdEQsTUFBTSxFQUFFLEdBQUcsaUJBQWlCLENB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QUFFLENBQUM7Z0JBQzVCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUMxRCxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQy9CLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsaUJBQWlCLENBQUMsVUFBMkI7UUFDM0MsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBRTNCLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7UUFDbEQsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRTdDLElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM1QixLQUFLLE1BQU0sV0FBVyxJQUFJLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDbEQsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNGO0FBL09ELHNDQStPQztBQUVZLFFBQUEsYUFBYSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENoYXJhY3RlckFnZW50IH0gZnJvbSAnLi9jaGFyYWN0ZXJBZ2VudC5qcyc7XHJcbmltcG9ydCB0eXBlIHsgQ2hhcmFjdGVyRGVjaXNpb24gfSBmcm9tICcuL2NoYXJhY3RlckFnZW50LmpzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgV29ybGRFdmVudCB7XHJcbiAgaWQ6IHN0cmluZztcclxuICB0eXBlOiAnaW50ZXJhY3Rpb24nIHwgJ2NvbmZsaWN0JyB8ICdkaXNjb3ZlcnknIHwgJ21vdmVtZW50JyB8ICdlbnZpcm9ubWVudGFsJztcclxuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xyXG4gIHBhcnRpY2lwYW50czogc3RyaW5nW107XHJcbiAgbG9jYXRpb246IHN0cmluZztcclxuICBjaGFwdGVyOiBudW1iZXI7XHJcbiAgcmVzb2x2ZWQ6IGJvb2xlYW47XHJcbiAgb3V0Y29tZT86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFdmVudFJlc29sdXRpb24ge1xyXG4gIGV2ZW50OiBXb3JsZEV2ZW50O1xyXG4gIG91dGNvbWU6IHN0cmluZztcclxuICBhZmZlY3RlZENoYXJhY3RlcnM6IHN0cmluZ1tdO1xyXG4gIGNvbnNlcXVlbmNlczogc3RyaW5nW107XHJcbiAgbmV3RXZlbnRzPzogc3RyaW5nW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmxpY3RSZXNvbHV0aW9uIHtcclxuICB3aW5uZXI/OiBzdHJpbmc7XHJcbiAgY29tcHJvbWlzZTogYm9vbGVhbjtcclxuICBvdXRjb21lOiBzdHJpbmc7XHJcbiAgZGFtYWdlOiBzdHJpbmdbXTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEV2ZW50UmVzb2x2ZXIge1xyXG4gIC8qKlxyXG4gICAqIFJlc29sdmUgY2hhcmFjdGVyIGRlY2lzaW9ucyBpbnRvIHdvcmxkIGV2ZW50c1xyXG4gICAqL1xyXG4gIHJlc29sdmVEZWNpc2lvbnMoXHJcbiAgICBkZWNpc2lvbnM6IENoYXJhY3RlckRlY2lzaW9uW10sXHJcbiAgICBjdXJyZW50Q2hhcHRlcjogbnVtYmVyXHJcbiAgKTogV29ybGRFdmVudFtdIHtcclxuICAgIGNvbnN0IGV2ZW50czogV29ybGRFdmVudFtdID0gW107XHJcbiAgICBcclxuICAgIC8vIEdyb3VwIGRlY2lzaW9ucyBieSBsb2NhdGlvblxyXG4gICAgY29uc3QgbG9jYXRpb25Hcm91cHMgPSBuZXcgTWFwPHN0cmluZywgQ2hhcmFjdGVyRGVjaXNpb25bXT4oKTtcclxuICAgIGZvciAoY29uc3QgZGVjaXNpb24gb2YgZGVjaXNpb25zKSB7XHJcbiAgICAgIC8vIE5vdGU6IGxvY2F0aW9uIHdvdWxkIG5lZWQgdG8gYmUgcGFzc2VkIGluIG9yIHRyYWNrZWRcclxuICAgICAgY29uc3QgbG9jYXRpb24gPSAnY3VycmVudCBsb2NhdGlvbic7IC8vIFNpbXBsaWZpZWRcclxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBsb2NhdGlvbkdyb3Vwcy5nZXQobG9jYXRpb24pIHx8IFtdO1xyXG4gICAgICBleGlzdGluZy5wdXNoKGRlY2lzaW9uKTtcclxuICAgICAgbG9jYXRpb25Hcm91cHMuc2V0KGxvY2F0aW9uLCBleGlzdGluZyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIENoZWNrIGZvciBpbnRlcmFjdGlvbnMgYmV0d2VlbiBjaGFyYWN0ZXJzIGF0IHNhbWUgbG9jYXRpb25cclxuICAgIGZvciAoY29uc3QgW2xvY2F0aW9uLCBsb2NhdGlvbkRlY2lzaW9uc10gb2YgbG9jYXRpb25Hcm91cHMpIHtcclxuICAgICAgaWYgKGxvY2F0aW9uRGVjaXNpb25zLmxlbmd0aCA+PSAyKSB7XHJcbiAgICAgICAgLy8gQ2hlY2sgZm9yIG11dHVhbCBpbnRlcmFjdGlvbnNcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2F0aW9uRGVjaXNpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPCBsb2NhdGlvbkRlY2lzaW9ucy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBjb25zdCBkMSA9IGxvY2F0aW9uRGVjaXNpb25zW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBkMiA9IGxvY2F0aW9uRGVjaXNpb25zW2pdO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhleSdyZSBpbnRlcmFjdGluZyB3aXRoIGVhY2ggb3RoZXJcclxuICAgICAgICAgICAgaWYgKGQxLnRhcmdldCA9PT0gZDIuY2hhcmFjdGVyICYmIGQyLnRhcmdldCA9PT0gZDEuY2hhcmFjdGVyKSB7XHJcbiAgICAgICAgICAgICAgZXZlbnRzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgaWQ6IGBldmVudC0ke0RhdGUubm93KCl9LSR7ZXZlbnRzLmxlbmd0aH1gLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ludGVyYWN0aW9uJyxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHtkMS5jaGFyYWN0ZXJ9IGFuZCAke2QyLmNoYXJhY3Rlcn0gaW50ZXJhY3RgLFxyXG4gICAgICAgICAgICAgICAgcGFydGljaXBhbnRzOiBbZDEuY2hhcmFjdGVyLCBkMi5jaGFyYWN0ZXJdLFxyXG4gICAgICAgICAgICAgICAgbG9jYXRpb24sXHJcbiAgICAgICAgICAgICAgICBjaGFwdGVyOiBjdXJyZW50Q2hhcHRlcixcclxuICAgICAgICAgICAgICAgIHJlc29sdmVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gQWRkIGluZGl2aWR1YWwgYWN0aW9ucyBhcyBldmVudHNcclxuICAgICAgZm9yIChjb25zdCBkZWNpc2lvbiBvZiBsb2NhdGlvbkRlY2lzaW9ucykge1xyXG4gICAgICAgIGlmICghZXZlbnRzLnNvbWUoZSA9PiBlLnBhcnRpY2lwYW50cy5pbmNsdWRlcyhkZWNpc2lvbi5jaGFyYWN0ZXIpKSkge1xyXG4gICAgICAgICAgZXZlbnRzLnB1c2goe1xyXG4gICAgICAgICAgICBpZDogYGV2ZW50LSR7RGF0ZS5ub3coKX0tJHtldmVudHMubGVuZ3RofWAsXHJcbiAgICAgICAgICAgIHR5cGU6IHRoaXMuY2F0ZWdvcml6ZUFjdGlvbihkZWNpc2lvbi5hY3Rpb24pLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7ZGVjaXNpb24uY2hhcmFjdGVyfTogJHtkZWNpc2lvbi5hY3Rpb259YCxcclxuICAgICAgICAgICAgcGFydGljaXBhbnRzOiBbZGVjaXNpb24uY2hhcmFjdGVyXSxcclxuICAgICAgICAgICAgbG9jYXRpb24sXHJcbiAgICAgICAgICAgIGNoYXB0ZXI6IGN1cnJlbnRDaGFwdGVyLFxyXG4gICAgICAgICAgICByZXNvbHZlZDogZmFsc2UsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIGV2ZW50cztcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQ2F0ZWdvcml6ZSBhbiBhY3Rpb24gaW50byBldmVudCB0eXBlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjYXRlZ29yaXplQWN0aW9uKGFjdGlvbjogc3RyaW5nKTogV29ybGRFdmVudFsndHlwZSddIHtcclxuICAgIGNvbnN0IGFjdGlvbkxvd2VyID0gYWN0aW9uLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBcclxuICAgIGlmIChhY3Rpb25Mb3dlci5pbmNsdWRlcygnZmlnaHQnKSB8fCBhY3Rpb25Mb3dlci5pbmNsdWRlcygnYXR0YWNrJykgfHwgYWN0aW9uTG93ZXIuaW5jbHVkZXMoJ2NvbmZyb250JykpIHtcclxuICAgICAgcmV0dXJuICdjb25mbGljdCc7XHJcbiAgICB9XHJcbiAgICBpZiAoYWN0aW9uTG93ZXIuaW5jbHVkZXMoJ2ZpbmQnKSB8fCBhY3Rpb25Mb3dlci5pbmNsdWRlcygnZGlzY292ZXInKSB8fCBhY3Rpb25Mb3dlci5pbmNsdWRlcygnbGVhcm4nKSkge1xyXG4gICAgICByZXR1cm4gJ2Rpc2NvdmVyeSc7XHJcbiAgICB9XHJcbiAgICBpZiAoYWN0aW9uTG93ZXIuaW5jbHVkZXMoJ2dvJykgfHwgYWN0aW9uTG93ZXIuaW5jbHVkZXMoJ21vdmUnKSB8fCBhY3Rpb25Mb3dlci5pbmNsdWRlcygndHJhdmVsJykpIHtcclxuICAgICAgcmV0dXJuICdtb3ZlbWVudCc7XHJcbiAgICB9XHJcbiAgICBpZiAoYWN0aW9uTG93ZXIuaW5jbHVkZXMoJ3dlYXRoZXInKSB8fCBhY3Rpb25Mb3dlci5pbmNsdWRlcygnc3Rvcm0nKSB8fCBhY3Rpb25Mb3dlci5pbmNsdWRlcygnZGFyaycpKSB7XHJcbiAgICAgIHJldHVybiAnZW52aXJvbm1lbnRhbCc7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiAnaW50ZXJhY3Rpb24nO1xyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBSZXNvbHZlIGEgY29uZmxpY3QgYmV0d2VlbiBjaGFyYWN0ZXJzXHJcbiAgICovXHJcbiAgcmVzb2x2ZUNvbmZsaWN0KFxyXG4gICAgZXZlbnQ6IFdvcmxkRXZlbnQsXHJcbiAgICBwYXJ0aWNpcGFudHM6IENoYXJhY3RlckFnZW50W11cclxuICApOiBDb25mbGljdFJlc29sdXRpb24ge1xyXG4gICAgLy8gU2ltcGxlIHJlc29sdXRpb24gYmFzZWQgb24gZW1vdGlvbmFsIHN0YXRlIGFuZCBwZXJzb25hbGl0eVxyXG4gICAgY29uc3Qgc2NvcmVzID0gcGFydGljaXBhbnRzLm1hcChwID0+IHtcclxuICAgICAgbGV0IHNjb3JlID0gNTsgLy8gYmFzZVxyXG4gICAgICBcclxuICAgICAgLy8gRW1vdGlvbmFsIHN0YXRlIGFmZmVjdHMgY2FwYWJpbGl0eVxyXG4gICAgICBpZiAocC5lbW90aW9uYWxTdGF0ZS5pbmNsdWRlcygnYW5ncnknKSB8fCBwLmVtb3Rpb25hbFN0YXRlLmluY2x1ZGVzKCdmdXJpb3VzJykpIHtcclxuICAgICAgICBzY29yZSArPSAyO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChwLmVtb3Rpb25hbFN0YXRlLmluY2x1ZGVzKCdmZWFyJykgfHwgcC5lbW90aW9uYWxTdGF0ZS5pbmNsdWRlcygndGVycmlmaWVkJykpIHtcclxuICAgICAgICBzY29yZSAtPSAyO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChwLmVtb3Rpb25hbFN0YXRlLmluY2x1ZGVzKCdjYWxtJykgfHwgcC5lbW90aW9uYWxTdGF0ZS5pbmNsdWRlcygnZm9jdXNlZCcpKSB7XHJcbiAgICAgICAgc2NvcmUgKz0gMTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gUGVyc29uYWxpdHkgdHJhaXRzXHJcbiAgICAgIGlmIChwLnBlcnNvbmFsaXR5LnNvbWUodCA9PiB0LmluY2x1ZGVzKCdzdHJvbmcnKSB8fCB0LmluY2x1ZGVzKCdicmF2ZScpKSkge1xyXG4gICAgICAgIHNjb3JlICs9IDE7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHAucGVyc29uYWxpdHkuc29tZSh0ID0+IHQuaW5jbHVkZXMoJ3dlYWsnKSB8fCB0LmluY2x1ZGVzKCd0aW1pZCcpKSkge1xyXG4gICAgICAgIHNjb3JlIC09IDE7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHJldHVybiB7IG5hbWU6IHAubmFtZSwgc2NvcmUgfTtcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICAvLyBEZXRlcm1pbmUgb3V0Y29tZVxyXG4gICAgc2NvcmVzLnNvcnQoKGEsIGIpID0+IGIuc2NvcmUgLSBhLnNjb3JlKTtcclxuICAgIGNvbnN0IHdpbm5lciA9IHNjb3Jlc1swXTtcclxuICAgIGNvbnN0IGxvc2VyID0gc2NvcmVzW3Njb3Jlcy5sZW5ndGggLSAxXTtcclxuICAgIGNvbnN0IHNjb3JlRGlmZiA9IHdpbm5lci5zY29yZSAtIGxvc2VyLnNjb3JlO1xyXG4gICAgXHJcbiAgICBpZiAoc2NvcmVEaWZmIDwgMikge1xyXG4gICAgICAvLyBDbG9zZSBtYXRjaCAtIGNvbXByb21pc2VcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBjb21wcm9taXNlOiB0cnVlLFxyXG4gICAgICAgIG91dGNvbWU6ICdCb3RoIHNpZGVzIHJlYWNoIGEgY29tcHJvbWlzZScsXHJcbiAgICAgICAgZGFtYWdlOiBbJ01pbm9yIGluanVyaWVzJywgJ1RlbnNpb24gcmVtYWlucyddLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aW5uZXI6IHdpbm5lci5uYW1lLFxyXG4gICAgICBjb21wcm9taXNlOiBmYWxzZSxcclxuICAgICAgb3V0Y29tZTogYCR7d2lubmVyLm5hbWV9IHByZXZhaWxzIG92ZXIgJHtsb3Nlci5uYW1lfWAsXHJcbiAgICAgIGRhbWFnZTogW2Ake2xvc2VyLm5hbWV9IGlzIGRlZmVhdGVkYCwgJ1BoeXNpY2FsIG9yIGVtb3Rpb25hbCBjb25zZXF1ZW5jZXMnXSxcclxuICAgIH07XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIFJlc29sdmUgYW4gZXZlbnQgYW5kIGRldGVybWluZSBjb25zZXF1ZW5jZXNcclxuICAgKi9cclxuICByZXNvbHZlRXZlbnQoXHJcbiAgICBldmVudDogV29ybGRFdmVudCxcclxuICAgIHBhcnRpY2lwYW50czogQ2hhcmFjdGVyQWdlbnRbXVxyXG4gICk6IEV2ZW50UmVzb2x1dGlvbiB7XHJcbiAgICBsZXQgb3V0Y29tZSA9ICcnO1xyXG4gICAgY29uc3QgY29uc2VxdWVuY2VzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgY29uc3QgbmV3RXZlbnRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgXHJcbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcclxuICAgICAgY2FzZSAnY29uZmxpY3QnOlxyXG4gICAgICAgIGNvbnN0IGNvbmZsaWN0UmVzdWx0ID0gdGhpcy5yZXNvbHZlQ29uZmxpY3QoZXZlbnQsIHBhcnRpY2lwYW50cyk7XHJcbiAgICAgICAgb3V0Y29tZSA9IGNvbmZsaWN0UmVzdWx0Lm91dGNvbWU7XHJcbiAgICAgICAgY29uc2VxdWVuY2VzLnB1c2goLi4uY29uZmxpY3RSZXN1bHQuZGFtYWdlKTtcclxuICAgICAgICBpZiAoY29uZmxpY3RSZXN1bHQud2lubmVyKSB7XHJcbiAgICAgICAgICBjb25zZXF1ZW5jZXMucHVzaChgJHtjb25mbGljdFJlc3VsdC53aW5uZXJ9IGdhaW5zIGFkdmFudGFnZWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgICBcclxuICAgICAgY2FzZSAnZGlzY292ZXJ5JzpcclxuICAgICAgICBvdXRjb21lID0gYCR7cGFydGljaXBhbnRzWzBdPy5uYW1lfSBtYWtlcyBhbiBpbXBvcnRhbnQgZGlzY292ZXJ5YDtcclxuICAgICAgICBjb25zZXF1ZW5jZXMucHVzaCgnTmV3IGtub3dsZWRnZSBnYWluZWQnLCAnRnV0dXJlIHBvc3NpYmlsaXRpZXMgb3BlbmVkJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgXHJcbiAgICAgIGNhc2UgJ2ludGVyYWN0aW9uJzpcclxuICAgICAgICBpZiAocGFydGljaXBhbnRzLmxlbmd0aCA+PSAyKSB7XHJcbiAgICAgICAgICBvdXRjb21lID0gYCR7cGFydGljaXBhbnRzLm1hcChwID0+IHAubmFtZSkuam9pbignIGFuZCAnKX0gaGF2ZSBhIG1lYW5pbmdmdWwgaW50ZXJhY3Rpb25gO1xyXG4gICAgICAgICAgY29uc2VxdWVuY2VzLnB1c2goJ1JlbGF0aW9uc2hpcCBkZXZlbG9wbWVudCcsICdJbmZvcm1hdGlvbiBleGNoYW5nZScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBvdXRjb21lID0gYCR7cGFydGljaXBhbnRzWzBdPy5uYW1lfSB0YWtlcyBhY3Rpb25gO1xyXG4gICAgICAgICAgY29uc2VxdWVuY2VzLnB1c2goJ1Byb2dyZXNzIHRvd2FyZCBnb2FsJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICAgIFxyXG4gICAgICBjYXNlICdtb3ZlbWVudCc6XHJcbiAgICAgICAgb3V0Y29tZSA9IGAke3BhcnRpY2lwYW50c1swXT8ubmFtZX0gY2hhbmdlcyBsb2NhdGlvbmA7XHJcbiAgICAgICAgY29uc2VxdWVuY2VzLnB1c2goJ05ldyBlbnZpcm9ubWVudCcsICdOZXcgb3Bwb3J0dW5pdGllcyBvciBkYW5nZXJzJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgXHJcbiAgICAgIGNhc2UgJ2Vudmlyb25tZW50YWwnOlxyXG4gICAgICAgIG91dGNvbWUgPSAnRW52aXJvbm1lbnRhbCBldmVudCBhZmZlY3RzIHRoZSBzY2VuZSc7XHJcbiAgICAgICAgY29uc2VxdWVuY2VzLnB1c2goJ0FsbCBwYXJ0aWNpcGFudHMgbXVzdCByZWFjdCcsICdTaXR1YXRpb24gYmVjb21lcyBtb3JlIGNvbXBsZXgnKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZXZlbnQ6IHsgLi4uZXZlbnQsIHJlc29sdmVkOiB0cnVlLCBvdXRjb21lIH0sXHJcbiAgICAgIG91dGNvbWUsXHJcbiAgICAgIGFmZmVjdGVkQ2hhcmFjdGVyczogcGFydGljaXBhbnRzLm1hcChwID0+IHAubmFtZSksXHJcbiAgICAgIGNvbnNlcXVlbmNlcyxcclxuICAgICAgbmV3RXZlbnRzLFxyXG4gICAgfTtcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogUHJvY2VzcyBhbGwgcGVuZGluZyBldmVudHNcclxuICAgKi9cclxuICBwcm9jZXNzRXZlbnRzKFxyXG4gICAgZXZlbnRzOiBXb3JsZEV2ZW50W10sXHJcbiAgICBhZ2VudHM6IE1hcDxzdHJpbmcsIENoYXJhY3RlckFnZW50PlxyXG4gICk6IEV2ZW50UmVzb2x1dGlvbltdIHtcclxuICAgIGNvbnN0IHJlc29sdXRpb25zOiBFdmVudFJlc29sdXRpb25bXSA9IFtdO1xyXG4gICAgXHJcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cy5maWx0ZXIoZSA9PiAhZS5yZXNvbHZlZCkpIHtcclxuICAgICAgY29uc3QgcGFydGljaXBhbnRzID0gZXZlbnQucGFydGljaXBhbnRzXHJcbiAgICAgICAgLm1hcChuYW1lID0+IGFnZW50cy5nZXQobmFtZSkpXHJcbiAgICAgICAgLmZpbHRlcigoYWdlbnQpOiBhZ2VudCBpcyBDaGFyYWN0ZXJBZ2VudCA9PiBhZ2VudCAhPT0gdW5kZWZpbmVkKTtcclxuICAgICAgXHJcbiAgICAgIGlmIChwYXJ0aWNpcGFudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdXRpb24gPSB0aGlzLnJlc29sdmVFdmVudChldmVudCwgcGFydGljaXBhbnRzKTtcclxuICAgICAgICByZXNvbHV0aW9ucy5wdXNoKHJlc29sdXRpb24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiByZXNvbHV0aW9ucztcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgbmFycmF0aXZlIGRlc2NyaXB0aW9uIG9mIGV2ZW50IHJlc29sdXRpb25cclxuICAgKi9cclxuICBuYXJyYXRlUmVzb2x1dGlvbihyZXNvbHV0aW9uOiBFdmVudFJlc29sdXRpb24pOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBcclxuICAgIGxpbmVzLnB1c2goYCoqJHtyZXNvbHV0aW9uLmV2ZW50LmRlc2NyaXB0aW9ufSoqYCk7XHJcbiAgICBsaW5lcy5wdXNoKGBPdXRjb21lOiAke3Jlc29sdXRpb24ub3V0Y29tZX1gKTtcclxuICAgIFxyXG4gICAgaWYgKHJlc29sdXRpb24uY29uc2VxdWVuY2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGluZXMucHVzaCgnQ29uc2VxdWVuY2VzOicpO1xyXG4gICAgICBmb3IgKGNvbnN0IGNvbnNlcXVlbmNlIG9mIHJlc29sdXRpb24uY29uc2VxdWVuY2VzKSB7XHJcbiAgICAgICAgbGluZXMucHVzaChgICAtICR7Y29uc2VxdWVuY2V9YCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGV2ZW50UmVzb2x2ZXIgPSBuZXcgRXZlbnRSZXNvbHZlcigpO1xyXG4iXX0=
|