@nahisaho/katashiro-analyzer 2.0.13 → 2.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/LICENSE +21 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/research/agent/ActionRouter.d.ts +101 -0
- package/dist/research/agent/ActionRouter.d.ts.map +1 -0
- package/dist/research/agent/ActionRouter.js +284 -0
- package/dist/research/agent/ActionRouter.js.map +1 -0
- package/dist/research/agent/ActionTracker.d.ts +105 -0
- package/dist/research/agent/ActionTracker.d.ts.map +1 -0
- package/dist/research/agent/ActionTracker.js +219 -0
- package/dist/research/agent/ActionTracker.js.map +1 -0
- package/dist/research/agent/AnswerEvaluator.d.ts +156 -0
- package/dist/research/agent/AnswerEvaluator.d.ts.map +1 -0
- package/dist/research/agent/AnswerEvaluator.js +626 -0
- package/dist/research/agent/AnswerEvaluator.js.map +1 -0
- package/dist/research/agent/DeepResearchAgent.d.ts +136 -0
- package/dist/research/agent/DeepResearchAgent.d.ts.map +1 -0
- package/dist/research/agent/DeepResearchAgent.js +381 -0
- package/dist/research/agent/DeepResearchAgent.js.map +1 -0
- package/dist/research/agent/KnowledgeStore.d.ts +95 -0
- package/dist/research/agent/KnowledgeStore.d.ts.map +1 -0
- package/dist/research/agent/KnowledgeStore.js +189 -0
- package/dist/research/agent/KnowledgeStore.js.map +1 -0
- package/dist/research/agent/QueryRewriter.d.ts +111 -0
- package/dist/research/agent/QueryRewriter.d.ts.map +1 -0
- package/dist/research/agent/QueryRewriter.js +350 -0
- package/dist/research/agent/QueryRewriter.js.map +1 -0
- package/dist/research/agent/TokenTracker.d.ts +100 -0
- package/dist/research/agent/TokenTracker.d.ts.map +1 -0
- package/dist/research/agent/TokenTracker.js +150 -0
- package/dist/research/agent/TokenTracker.js.map +1 -0
- package/dist/research/agent/actions/AnswerActionHandler.d.ts +44 -0
- package/dist/research/agent/actions/AnswerActionHandler.d.ts.map +1 -0
- package/dist/research/agent/actions/AnswerActionHandler.js +158 -0
- package/dist/research/agent/actions/AnswerActionHandler.js.map +1 -0
- package/dist/research/agent/actions/BaseActionHandler.d.ts +87 -0
- package/dist/research/agent/actions/BaseActionHandler.d.ts.map +1 -0
- package/dist/research/agent/actions/BaseActionHandler.js +67 -0
- package/dist/research/agent/actions/BaseActionHandler.js.map +1 -0
- package/dist/research/agent/actions/CodingActionHandler.d.ts +66 -0
- package/dist/research/agent/actions/CodingActionHandler.d.ts.map +1 -0
- package/dist/research/agent/actions/CodingActionHandler.js +233 -0
- package/dist/research/agent/actions/CodingActionHandler.js.map +1 -0
- package/dist/research/agent/actions/ReflectActionHandler.d.ts +32 -0
- package/dist/research/agent/actions/ReflectActionHandler.d.ts.map +1 -0
- package/dist/research/agent/actions/ReflectActionHandler.js +107 -0
- package/dist/research/agent/actions/ReflectActionHandler.js.map +1 -0
- package/dist/research/agent/actions/SearchActionHandler.d.ts +30 -0
- package/dist/research/agent/actions/SearchActionHandler.d.ts.map +1 -0
- package/dist/research/agent/actions/SearchActionHandler.js +73 -0
- package/dist/research/agent/actions/SearchActionHandler.js.map +1 -0
- package/dist/research/agent/actions/VisitActionHandler.d.ts +33 -0
- package/dist/research/agent/actions/VisitActionHandler.d.ts.map +1 -0
- package/dist/research/agent/actions/VisitActionHandler.js +83 -0
- package/dist/research/agent/actions/VisitActionHandler.js.map +1 -0
- package/dist/research/agent/actions/index.d.ts +10 -0
- package/dist/research/agent/actions/index.d.ts.map +1 -0
- package/dist/research/agent/actions/index.js +10 -0
- package/dist/research/agent/actions/index.js.map +1 -0
- package/dist/research/agent/index.d.ts +62 -0
- package/dist/research/agent/index.d.ts.map +1 -0
- package/dist/research/agent/index.js +57 -0
- package/dist/research/agent/index.js.map +1 -0
- package/dist/research/agent/types.d.ts +421 -0
- package/dist/research/agent/types.d.ts.map +1 -0
- package/dist/research/agent/types.js +45 -0
- package/dist/research/agent/types.js.map +1 -0
- package/dist/research/index.d.ts +1 -0
- package/dist/research/index.d.ts.map +1 -1
- package/dist/research/index.js +2 -0
- package/dist/research/index.js.map +1 -1
- package/package.json +9 -8
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ActionTracker - アクション履歴追跡
|
|
3
|
+
*
|
|
4
|
+
* @requirement REQ-DR-005
|
|
5
|
+
* @design DES-v2.1.0-DeepResearchAgent
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* 実行されたアクションの履歴を追跡するクラス
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const tracker = new ActionTracker();
|
|
13
|
+
*
|
|
14
|
+
* tracker.trackAction({
|
|
15
|
+
* stepNumber: 1,
|
|
16
|
+
* action: 'search',
|
|
17
|
+
* think: 'Looking for information about...',
|
|
18
|
+
* params: { searchQueries: ['AI ethics'] },
|
|
19
|
+
* timestamp: new Date().toISOString(),
|
|
20
|
+
* success: true,
|
|
21
|
+
* });
|
|
22
|
+
*
|
|
23
|
+
* const diary = tracker.getDiaryContext();
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export class ActionTracker {
|
|
27
|
+
steps;
|
|
28
|
+
diaryEntries;
|
|
29
|
+
thoughts;
|
|
30
|
+
constructor() {
|
|
31
|
+
this.steps = [];
|
|
32
|
+
this.diaryEntries = [];
|
|
33
|
+
this.thoughts = [];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* アクションを記録
|
|
37
|
+
*/
|
|
38
|
+
trackAction(step) {
|
|
39
|
+
this.steps.push(step);
|
|
40
|
+
// ダイアリーエントリを生成
|
|
41
|
+
const entry = this.createDiaryEntry(step);
|
|
42
|
+
this.diaryEntries.push(entry);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 思考を記録
|
|
46
|
+
*/
|
|
47
|
+
trackThink(think, _languageCode, params) {
|
|
48
|
+
let formattedThink = think;
|
|
49
|
+
if (params) {
|
|
50
|
+
for (const [key, value] of Object.entries(params)) {
|
|
51
|
+
formattedThink = formattedThink.replace(`{${key}}`, value);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
this.thoughts.push(formattedThink);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 全ステップを取得
|
|
58
|
+
*/
|
|
59
|
+
getSteps() {
|
|
60
|
+
return [...this.steps];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 最新のステップを取得
|
|
64
|
+
*/
|
|
65
|
+
getLastStep() {
|
|
66
|
+
return this.steps[this.steps.length - 1];
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 特定タイプのステップを取得
|
|
70
|
+
*/
|
|
71
|
+
getStepsByAction(action) {
|
|
72
|
+
return this.steps.filter((s) => s.action === action);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* ダイアリーコンテキストを取得(人間が読める形式)
|
|
76
|
+
*/
|
|
77
|
+
getDiaryContext() {
|
|
78
|
+
return this.diaryEntries.map((entry) => this.formatDiaryEntry(entry));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* ステップ数を取得
|
|
82
|
+
*/
|
|
83
|
+
getStepCount() {
|
|
84
|
+
return this.steps.length;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 成功したステップ数を取得
|
|
88
|
+
*/
|
|
89
|
+
getSuccessCount() {
|
|
90
|
+
return this.steps.filter((s) => s.success).length;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 失敗したステップ数を取得
|
|
94
|
+
*/
|
|
95
|
+
getFailureCount() {
|
|
96
|
+
return this.steps.filter((s) => !s.success).length;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* アクションタイプ別の統計を取得
|
|
100
|
+
*/
|
|
101
|
+
getActionStats() {
|
|
102
|
+
const stats = {
|
|
103
|
+
search: { total: 0, success: 0, failure: 0 },
|
|
104
|
+
visit: { total: 0, success: 0, failure: 0 },
|
|
105
|
+
reflect: { total: 0, success: 0, failure: 0 },
|
|
106
|
+
answer: { total: 0, success: 0, failure: 0 },
|
|
107
|
+
coding: { total: 0, success: 0, failure: 0 },
|
|
108
|
+
};
|
|
109
|
+
for (const step of this.steps) {
|
|
110
|
+
stats[step.action].total++;
|
|
111
|
+
if (step.success) {
|
|
112
|
+
stats[step.action].success++;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
stats[step.action].failure++;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return stats;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* リセット
|
|
122
|
+
*/
|
|
123
|
+
reset() {
|
|
124
|
+
this.steps = [];
|
|
125
|
+
this.diaryEntries = [];
|
|
126
|
+
this.thoughts = [];
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* ダイアリーエントリを生成
|
|
130
|
+
*/
|
|
131
|
+
createDiaryEntry(step) {
|
|
132
|
+
let details = '';
|
|
133
|
+
let result = step.success ? 'success' : 'failure';
|
|
134
|
+
switch (step.action) {
|
|
135
|
+
case 'search': {
|
|
136
|
+
const params = step.params;
|
|
137
|
+
details = `Searched for: "${params.searchQueries.join('", "')}"`;
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
case 'visit': {
|
|
141
|
+
const params = step.params;
|
|
142
|
+
details = `Visited ${params.urlTargets.length} URL(s)`;
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
case 'reflect': {
|
|
146
|
+
const params = step.params;
|
|
147
|
+
details = `Reflected on ${params.questions.length} sub-question(s)`;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
case 'answer': {
|
|
151
|
+
const params = step.params;
|
|
152
|
+
details = params.isFinal
|
|
153
|
+
? 'Provided final answer'
|
|
154
|
+
: `Attempted answer (${params.answer.length} chars)`;
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
case 'coding': {
|
|
158
|
+
const params = step.params;
|
|
159
|
+
details = `Coding task: ${params.codingIssue.slice(0, 50)}...`;
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
step: step.stepNumber,
|
|
165
|
+
action: step.action,
|
|
166
|
+
question: step.think,
|
|
167
|
+
details,
|
|
168
|
+
result,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* ダイアリーエントリをフォーマット
|
|
173
|
+
*/
|
|
174
|
+
formatDiaryEntry(entry) {
|
|
175
|
+
const resultEmoji = entry.result === 'success' ? '✓' : entry.result === 'partial' ? '~' : '✗';
|
|
176
|
+
let text = `${resultEmoji} At step ${entry.step}, you took the **${entry.action}** action.\n`;
|
|
177
|
+
text += `${entry.details}\n`;
|
|
178
|
+
if (entry.notes) {
|
|
179
|
+
text += `Notes: ${entry.notes}\n`;
|
|
180
|
+
}
|
|
181
|
+
return text;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* 特定のパターンを検出(同じ検索を繰り返しているなど)
|
|
185
|
+
*/
|
|
186
|
+
detectPattern() {
|
|
187
|
+
const searchSteps = this.getStepsByAction('search');
|
|
188
|
+
const allQueries = [];
|
|
189
|
+
for (const step of searchSteps) {
|
|
190
|
+
const params = step.params;
|
|
191
|
+
allQueries.push(...params.searchQueries);
|
|
192
|
+
}
|
|
193
|
+
// 重複検索を検出
|
|
194
|
+
const uniqueQueries = new Set(allQueries.map((q) => q.toLowerCase().trim()));
|
|
195
|
+
const repeatedSearches = uniqueQueries.size < allQueries.length * 0.7;
|
|
196
|
+
// ループ検出(直近5ステップで同じアクションパターン)
|
|
197
|
+
const recentActions = this.steps.slice(-5).map((s) => s.action);
|
|
198
|
+
const stuckInLoop = recentActions.length === 5 && new Set(recentActions).size === 1 && recentActions[0] !== 'answer';
|
|
199
|
+
// 進捗なし(直近5ステップすべて失敗)
|
|
200
|
+
const recentSteps = this.steps.slice(-5);
|
|
201
|
+
const noProgress = recentSteps.length === 5 && recentSteps.every((s) => !s.success);
|
|
202
|
+
return {
|
|
203
|
+
repeatedSearches,
|
|
204
|
+
stuckInLoop,
|
|
205
|
+
noProgress,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* JSONにシリアライズ
|
|
210
|
+
*/
|
|
211
|
+
toJSON() {
|
|
212
|
+
return {
|
|
213
|
+
steps: this.steps,
|
|
214
|
+
diaryEntries: this.diaryEntries,
|
|
215
|
+
thoughts: this.thoughts,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=ActionTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActionTracker.js","sourceRoot":"","sources":["../../../src/research/agent/ActionTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AnswerEvaluator - 回答品質評価
|
|
3
|
+
*
|
|
4
|
+
* @requirement REQ-DR-004
|
|
5
|
+
* @design DES-v2.1.0-DeepResearchAgent
|
|
6
|
+
*/
|
|
7
|
+
import type { EvaluationResponse as EvaluationResponseType, EvaluationType, KnowledgeItem, QuestionType } from './types.js';
|
|
8
|
+
import type { TokenTracker } from './TokenTracker.js';
|
|
9
|
+
/**
|
|
10
|
+
* EvaluationResponseをエクスポート
|
|
11
|
+
*/
|
|
12
|
+
export type EvaluationResponse = EvaluationResponseType;
|
|
13
|
+
/**
|
|
14
|
+
* 参照情報
|
|
15
|
+
*/
|
|
16
|
+
export interface Reference {
|
|
17
|
+
url: string;
|
|
18
|
+
title: string;
|
|
19
|
+
dateTime?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* AnswerEvaluatorオプション
|
|
23
|
+
*/
|
|
24
|
+
export interface AnswerEvaluatorOptions {
|
|
25
|
+
/** LLMクライアント */
|
|
26
|
+
llmClient: {
|
|
27
|
+
chat: (options: {
|
|
28
|
+
messages: Array<{
|
|
29
|
+
role: string;
|
|
30
|
+
content: string;
|
|
31
|
+
}>;
|
|
32
|
+
temperature?: number;
|
|
33
|
+
maxTokens?: number;
|
|
34
|
+
}) => Promise<{
|
|
35
|
+
content: string;
|
|
36
|
+
usage?: {
|
|
37
|
+
promptTokens?: number;
|
|
38
|
+
completionTokens?: number;
|
|
39
|
+
};
|
|
40
|
+
}>;
|
|
41
|
+
};
|
|
42
|
+
/** トークントラッカー */
|
|
43
|
+
tokenTracker: TokenTracker;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* 質問分析結果
|
|
47
|
+
*/
|
|
48
|
+
export interface QuestionAnalysis {
|
|
49
|
+
questionType: QuestionType;
|
|
50
|
+
requiredEvaluations: EvaluationType[];
|
|
51
|
+
freshnessRequired: boolean;
|
|
52
|
+
pluralityRequired: boolean;
|
|
53
|
+
minimumCount?: number;
|
|
54
|
+
expectedAspects?: string[];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 回答の品質を評価するクラス
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* const evaluator = new AnswerEvaluator({
|
|
62
|
+
* llmClient,
|
|
63
|
+
* tokenTracker,
|
|
64
|
+
* });
|
|
65
|
+
*
|
|
66
|
+
* const result = await evaluator.evaluate(
|
|
67
|
+
* 'What is the population of Tokyo?',
|
|
68
|
+
* 'The population of Tokyo is approximately 14 million.',
|
|
69
|
+
* knowledge
|
|
70
|
+
* );
|
|
71
|
+
*
|
|
72
|
+
* if (result.pass) {
|
|
73
|
+
* console.log('Answer is acceptable');
|
|
74
|
+
* } else {
|
|
75
|
+
* console.log(`Improvement needed: ${result.improvementPlan}`);
|
|
76
|
+
* }
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export declare class AnswerEvaluator {
|
|
80
|
+
private _llmClient;
|
|
81
|
+
private _tokenTracker;
|
|
82
|
+
constructor(options: AnswerEvaluatorOptions);
|
|
83
|
+
/**
|
|
84
|
+
* LLMクライアントを取得(将来の拡張用)
|
|
85
|
+
*/
|
|
86
|
+
get llmClient(): AnswerEvaluatorOptions['llmClient'];
|
|
87
|
+
/**
|
|
88
|
+
* トークントラッカーを取得(将来の拡張用)
|
|
89
|
+
*/
|
|
90
|
+
get tokenTracker(): TokenTracker;
|
|
91
|
+
/**
|
|
92
|
+
* 回答を評価
|
|
93
|
+
*/
|
|
94
|
+
evaluate(question: string, answer: string, knowledge: KnowledgeItem[]): Promise<EvaluationResponse>;
|
|
95
|
+
/**
|
|
96
|
+
* KnowledgeItemをReferenceに変換
|
|
97
|
+
*/
|
|
98
|
+
private toReferences;
|
|
99
|
+
/**
|
|
100
|
+
* 質問タイプを分析(同期版)
|
|
101
|
+
*/
|
|
102
|
+
analyzeQuestionSync(question: string): EvaluationType[];
|
|
103
|
+
/**
|
|
104
|
+
* 質問タイプを分析(非同期版 - 将来的にLLM使用)
|
|
105
|
+
*/
|
|
106
|
+
analyzeQuestion(question: string): Promise<QuestionAnalysis>;
|
|
107
|
+
/**
|
|
108
|
+
* 質問タイプを推定
|
|
109
|
+
*/
|
|
110
|
+
private inferQuestionType;
|
|
111
|
+
/**
|
|
112
|
+
* 期待されるアスペクトを抽出
|
|
113
|
+
*/
|
|
114
|
+
private extractExpectedAspects;
|
|
115
|
+
/**
|
|
116
|
+
* 基本的な回答品質チェック
|
|
117
|
+
*/
|
|
118
|
+
private evaluateBasic;
|
|
119
|
+
/**
|
|
120
|
+
* 参照チェック
|
|
121
|
+
*/
|
|
122
|
+
private evaluateAttribution;
|
|
123
|
+
/**
|
|
124
|
+
* 鮮度チェック
|
|
125
|
+
*/
|
|
126
|
+
private evaluateFreshness;
|
|
127
|
+
/**
|
|
128
|
+
* 鮮度の最大許容日数を推定
|
|
129
|
+
*/
|
|
130
|
+
private estimateMaxAge;
|
|
131
|
+
/**
|
|
132
|
+
* 複数例チェック
|
|
133
|
+
*/
|
|
134
|
+
private evaluatePlurality;
|
|
135
|
+
/**
|
|
136
|
+
* 要求される数を推定
|
|
137
|
+
*/
|
|
138
|
+
private estimateRequiredCount;
|
|
139
|
+
/**
|
|
140
|
+
* 回答内のアイテム数をカウント
|
|
141
|
+
*/
|
|
142
|
+
private countItems;
|
|
143
|
+
/**
|
|
144
|
+
* 網羅性チェック
|
|
145
|
+
*/
|
|
146
|
+
private evaluateCompleteness;
|
|
147
|
+
/**
|
|
148
|
+
* 回答から提供されたアスペクトを抽出
|
|
149
|
+
*/
|
|
150
|
+
private extractProvidedAspects;
|
|
151
|
+
/**
|
|
152
|
+
* アスペクトがマッチするかチェック
|
|
153
|
+
*/
|
|
154
|
+
private aspectMatches;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=AnswerEvaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnswerEvaluator.d.ts","sourceRoot":"","sources":["../../../src/research/agent/AnswerEvaluator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,kBAAkB,IAAI,sBAAsB,EAC5C,cAAc,EACd,aAAa,EACb,YAAY,EACb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,sBAAsB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,gBAAgB;IAChB,SAAS,EAAE;QACT,IAAI,EAAE,CAAC,OAAO,EAAE;YACd,QAAQ,EAAE,KAAK,CAAC;gBAAE,IAAI,EAAE,MAAM,CAAC;gBAAC,OAAO,EAAE,MAAM,CAAA;aAAE,CAAC,CAAC;YACnD,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,KAAK,OAAO,CAAC;YACZ,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,CAAC,EAAE;gBACN,YAAY,CAAC,EAAE,MAAM,CAAC;gBACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;aAC3B,CAAC;SACH,CAAC,CAAC;KACJ,CAAC;IACF,gBAAgB;IAChB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,mBAAmB,EAAE,cAAc,EAAE,CAAC;IACtC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,eAAe;IAE1B,OAAO,CAAC,UAAU,CAAsC;IACxD,OAAO,CAAC,aAAa,CAAe;gBAExB,OAAO,EAAE,sBAAsB;IAK3C;;OAEG;IACH,IAAI,SAAS,IAAI,sBAAsB,CAAC,WAAW,CAAC,CAEnD;IAED;;OAEG;IACH,IAAI,YAAY,IAAI,YAAY,CAE/B;IAED;;OAEG;IACG,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,aAAa,EAAE,GACzB,OAAO,CAAC,kBAAkB,CAAC;IA6D9B;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE;IAkFvD;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAelE;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoE9B;;OAEG;IACH,OAAO,CAAC,aAAa;IA0CrB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA+B3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAuDzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAuBtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA+BzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0B7B;;OAEG;IACH,OAAO,CAAC,UAAU;IAsBlB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA4C5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAkH9B;;OAEG;IACH,OAAO,CAAC,aAAa;CAGtB"}
|