atxp 1.24.0 → 1.24.1
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":"AAsLA,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe5E"}
|
|
@@ -5,8 +5,6 @@ import { execSync } from 'child_process';
|
|
|
5
5
|
const NOTIFICATIONS_BASE_URL = 'https://clowdbot-notifications.corp.circuitandchisel.com';
|
|
6
6
|
const OPENCLAW_CONFIG_PATH = '/data/.openclaw/openclaw.json';
|
|
7
7
|
const SESSIONS_PATH = '/data/.openclaw/agents/main/sessions/sessions.json';
|
|
8
|
-
const WORKSPACE_DIR = '/data/.openclaw/workspace';
|
|
9
|
-
const HEARTBEAT_SECTION_HEADER = '# ATXP Notification Relay';
|
|
10
8
|
// eslint-disable-next-line no-control-regex
|
|
11
9
|
const sanitizeSessionValue = (s) => s.replace(/[\x00-\x1f"`[\]]/g, '');
|
|
12
10
|
/**
|
|
@@ -45,128 +43,30 @@ async function discoverConnectedChannels() {
|
|
|
45
43
|
}
|
|
46
44
|
}
|
|
47
45
|
/**
|
|
48
|
-
*
|
|
49
|
-
* The default heartbeat prompt says "Read HEARTBEAT.md if it exists. Follow it strictly."
|
|
50
|
-
* so writing these instructions directly to the file ensures the LLM relays
|
|
51
|
-
* system events to all discovered channels.
|
|
52
|
-
*/
|
|
53
|
-
function buildHeartbeatMd(channels) {
|
|
54
|
-
const lines = [
|
|
55
|
-
HEARTBEAT_SECTION_HEADER,
|
|
56
|
-
'',
|
|
57
|
-
'When you see System: event lines about new emails or SMS messages,',
|
|
58
|
-
'you MUST immediately relay each one to the user.',
|
|
59
|
-
'Do NOT reply HEARTBEAT_OK when System events are present.',
|
|
60
|
-
'',
|
|
61
|
-
];
|
|
62
|
-
if (channels.length > 0) {
|
|
63
|
-
lines.push('Relay to ALL of these channels:');
|
|
64
|
-
for (const c of channels) {
|
|
65
|
-
lines.push(`- Use the message tool with channel=\`${c.channel}\` and target=\`${c.to}\``);
|
|
66
|
-
}
|
|
67
|
-
lines.push('');
|
|
68
|
-
}
|
|
69
|
-
return lines.join('\n');
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Configure hooks, heartbeat delivery target, and HEARTBEAT.md on the instance.
|
|
46
|
+
* Configure hooks token on the instance.
|
|
73
47
|
* Only runs when inside a Fly instance (FLY_MACHINE_ID is set).
|
|
74
|
-
*
|
|
75
|
-
* Discovers all connected messaging channels from the session store, writes
|
|
76
|
-
* HEARTBEAT.md with relay instructions for each channel, and sets the primary
|
|
77
|
-
* delivery target to the first discovered channel.
|
|
48
|
+
* Sets hooks.enabled and hooks.token in openclaw.json, restarts gateway if changed.
|
|
78
49
|
*/
|
|
79
50
|
async function configureHooksOnInstance(hooksToken) {
|
|
80
51
|
if (!process.env.FLY_MACHINE_ID)
|
|
81
52
|
return;
|
|
82
|
-
const configPath = OPENCLAW_CONFIG_PATH;
|
|
83
53
|
try {
|
|
84
|
-
const raw = await fs.readFile(
|
|
54
|
+
const raw = await fs.readFile(OPENCLAW_CONFIG_PATH, 'utf-8');
|
|
85
55
|
const config = JSON.parse(raw);
|
|
86
|
-
// Discover connected channels from session store
|
|
87
|
-
const channels = await discoverConnectedChannels();
|
|
88
|
-
let changed = false;
|
|
89
|
-
// Configure hooks
|
|
90
56
|
if (!config.hooks)
|
|
91
57
|
config.hooks = {};
|
|
92
|
-
if (config.hooks.token
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
// Set primary delivery target to first discovered channel
|
|
98
|
-
if (!config.agents)
|
|
99
|
-
config.agents = {};
|
|
100
|
-
if (!config.agents.defaults)
|
|
101
|
-
config.agents.defaults = {};
|
|
102
|
-
if (!config.agents.defaults.heartbeat)
|
|
103
|
-
config.agents.defaults.heartbeat = {};
|
|
104
|
-
const hb = config.agents.defaults.heartbeat;
|
|
105
|
-
if (channels.length > 0) {
|
|
106
|
-
const primary = channels[0];
|
|
107
|
-
if (hb.target !== primary.channel || hb.to !== primary.to) {
|
|
108
|
-
hb.target = primary.channel;
|
|
109
|
-
hb.to = primary.to;
|
|
110
|
-
changed = true;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
else if (hb.target !== 'last') {
|
|
114
|
-
// No channels discovered — fall back to 'last' and clear stale target
|
|
115
|
-
hb.target = 'last';
|
|
116
|
-
delete hb.to;
|
|
117
|
-
changed = true;
|
|
118
|
-
}
|
|
119
|
-
if (changed) {
|
|
120
|
-
await fs.writeFile(configPath, JSON.stringify(config, null, 2));
|
|
121
|
-
console.log(chalk.gray('Hooks and heartbeat configured in openclaw.json'));
|
|
122
|
-
}
|
|
123
|
-
// Append notification relay instructions to HEARTBEAT.md.
|
|
124
|
-
// The default heartbeat prompt reads this file and follows it strictly.
|
|
125
|
-
await fs.mkdir(WORKSPACE_DIR, { recursive: true });
|
|
126
|
-
const heartbeatPath = `${WORKSPACE_DIR}/HEARTBEAT.md`;
|
|
127
|
-
const section = buildHeartbeatMd(channels);
|
|
128
|
-
let existing = '';
|
|
58
|
+
if (config.hooks.token === hooksToken && config.hooks.enabled === true)
|
|
59
|
+
return;
|
|
60
|
+
config.hooks.enabled = true;
|
|
61
|
+
config.hooks.token = hooksToken;
|
|
62
|
+
await fs.writeFile(OPENCLAW_CONFIG_PATH, JSON.stringify(config, null, 2));
|
|
129
63
|
try {
|
|
130
|
-
|
|
131
|
-
}
|
|
132
|
-
catch { /* file may not exist */ }
|
|
133
|
-
// Replace existing notification section or append if not present.
|
|
134
|
-
// Uses split-on-header to avoid regex edge cases with anchors/newlines.
|
|
135
|
-
const idx = existing.indexOf(HEARTBEAT_SECTION_HEADER);
|
|
136
|
-
if (idx !== -1) {
|
|
137
|
-
let before = existing.slice(0, idx);
|
|
138
|
-
// Ensure a newline separates preceding content from our section
|
|
139
|
-
if (before.length > 0 && !before.endsWith('\n'))
|
|
140
|
-
before += '\n';
|
|
141
|
-
const afterHeader = existing.slice(idx + HEARTBEAT_SECTION_HEADER.length);
|
|
142
|
-
// Find next top-level heading. Assumes a preceding newline (standard markdown).
|
|
143
|
-
const nextHeading = afterHeader.search(/\n# /);
|
|
144
|
-
const after = nextHeading !== -1 ? afterHeader.slice(nextHeading) : '';
|
|
145
|
-
await fs.writeFile(heartbeatPath, before + section.trimEnd() + after);
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
const separator = existing.length > 0 && !existing.endsWith('\n') ? '\n\n' : existing.length > 0 ? '\n' : '';
|
|
149
|
-
await fs.writeFile(heartbeatPath, existing + separator + section);
|
|
150
|
-
}
|
|
151
|
-
console.log(chalk.gray('HEARTBEAT.md updated with notification relay instructions'));
|
|
152
|
-
if (channels.length > 0) {
|
|
153
|
-
console.log(chalk.gray(`Notification channels: ${channels.map(c => `${c.channel}:${c.to}`).join(', ')}`));
|
|
154
|
-
}
|
|
155
|
-
// Restart gateway to pick up new config (watchdog auto-restarts it)
|
|
156
|
-
if (changed) {
|
|
157
|
-
try {
|
|
158
|
-
execSync('pkill -f openclaw-gateway', { stdio: 'ignore' });
|
|
159
|
-
console.log(chalk.gray('Gateway restarting to apply config...'));
|
|
160
|
-
}
|
|
161
|
-
catch {
|
|
162
|
-
// Gateway may not be running yet — config will be picked up on next start
|
|
163
|
-
}
|
|
64
|
+
execSync('pkill -f openclaw-gateway', { stdio: 'ignore' });
|
|
164
65
|
}
|
|
66
|
+
catch { /* gateway may not be running */ }
|
|
165
67
|
}
|
|
166
68
|
catch (err) {
|
|
167
|
-
console.
|
|
168
|
-
console.log(chalk.gray(`${err instanceof Error ? err.message : err}`));
|
|
169
|
-
console.log(chalk.gray('Hooks will be configured on next instance reboot.'));
|
|
69
|
+
console.error(chalk.red(`Error configuring instance: ${err instanceof Error ? err.message : err}`));
|
|
170
70
|
}
|
|
171
71
|
}
|
|
172
72
|
function getMachineId() {
|
|
@@ -199,11 +99,15 @@ async function enableNotifications() {
|
|
|
199
99
|
process.exit(1);
|
|
200
100
|
}
|
|
201
101
|
console.log(chalk.gray('Enabling push notifications...'));
|
|
102
|
+
// Discover connected channels for delivery targeting
|
|
103
|
+
const channels = await discoverConnectedChannels();
|
|
202
104
|
// Resolve account ID for event matching
|
|
203
105
|
const accountId = await getAccountId();
|
|
204
106
|
const body = { machine_id: machineId };
|
|
205
107
|
if (accountId)
|
|
206
108
|
body.account_id = accountId;
|
|
109
|
+
if (channels.length > 0)
|
|
110
|
+
body.channels = channels;
|
|
207
111
|
let res;
|
|
208
112
|
try {
|
|
209
113
|
res = await fetch(`${NOTIFICATIONS_BASE_URL}/notifications/enable`, {
|
|
@@ -234,6 +138,9 @@ async function enableNotifications() {
|
|
|
234
138
|
console.log(' ' + chalk.bold('ID:') + ' ' + (webhook.id || ''));
|
|
235
139
|
console.log(' ' + chalk.bold('URL:') + ' ' + (webhook.url || ''));
|
|
236
140
|
console.log(' ' + chalk.bold('Events:') + ' ' + (webhook.eventTypes?.join(', ') || ''));
|
|
141
|
+
if (channels.length > 0) {
|
|
142
|
+
console.log(' ' + chalk.bold('Channels:') + ' ' + channels.map(c => `${c.channel}:${c.to}`).join(', '));
|
|
143
|
+
}
|
|
237
144
|
if (webhook.secret) {
|
|
238
145
|
console.log(' ' + chalk.bold('Secret:') + ' ' + chalk.yellow(webhook.secret));
|
|
239
146
|
console.log();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,sBAAsB,GAAG,0DAA0D,CAAC;AAC1F,MAAM,oBAAoB,GAAG,+BAA+B,CAAC;AAC7D,MAAM,aAAa,GAAG,oDAAoD,CAAC;
|
|
1
|
+
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,sBAAsB,GAAG,0DAA0D,CAAC;AAC1F,MAAM,oBAAoB,GAAG,+BAA+B,CAAC;AAC7D,MAAM,aAAa,GAAG,oDAAoD,CAAC;AAE3E,4CAA4C;AAC5C,MAAM,oBAAoB,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;AAa/E;;;;GAIG;AACH,KAAK,UAAU,yBAAyB;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAE/B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,8DAA8D;YAC9D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;YAC5D,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5D,MAAM,EAAE,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACxD,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE;gBAAE,SAAS;YAC9B,8DAA8D;YAC9D,IAAI,OAAO,KAAK,SAAS;gBAAE,SAAS;YACpC,MAAM,QAAQ,GAAG,GAAG,OAAO,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,SAAS;YACjC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC,CAAC,kCAAkC;IAC/C,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,wBAAwB,CAAC,UAAkB;IACxD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc;QAAE,OAAO;IAExC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAE/B,IAAI,CAAC,MAAM,CAAC,KAAK;YAAE,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;QACrC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI;YAAE,OAAO;QAE/E,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC;QAChC,MAAM,EAAE,CAAC,SAAS,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE1E,IAAI,CAAC;YACH,QAAQ,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC,CAAC,gCAAgC,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACtG,CAAC;AACH,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACzC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAExB,2EAA2E;IAC3E,yEAAyE;IACzE,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC/B,IAAI,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAElE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,YAAY;IACzB,IAAI,CAAC;QACH,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,OAAO,OAAO,EAAE,SAAS,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB;IAChC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IACjC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAE1D,qDAAqD;IACrD,MAAM,QAAQ,GAAG,MAAM,yBAAyB,EAAE,CAAC;IAEnD,wCAAwC;IACxC,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE,CAAC;IAEvC,MAAM,IAAI,GAA4B,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IAChE,IAAI,SAAS;QAAE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC3C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAElD,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,sBAAsB,uBAAuB,EAAE;YAClE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAmB,CAAC;IAClE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACnC,IAAI,CAAC,QAAQ,EAAE,UAAU,IAAI,CAAC,QAAQ,EAAE,UAAU,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/D,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,0BAA0B;IAC1B,MAAM,wBAAwB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAEpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,QAAQ,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1F,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3G,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB;IAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,GAAG,IAAI,GAAG,6CAA6C,CAAC,CAAC;IACvH,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,KAAK,GAAG,yCAAyC,CAAC,CAAC;IACtG,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,OAAO,GAAG,uCAAuC,CAAC,CAAC;IACpG,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,UAAkB;IAC3D,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAClF,qBAAqB,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,MAAM,mBAAmB,EAAE,CAAC;YAC5B,MAAM;QAER;YACE,qBAAqB,EAAE,CAAC;YACxB,MAAM;IACV,CAAC;AACH,CAAC"}
|