@contextvm/sdk 0.1.44 → 0.1.46
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,8 +1,7 @@
|
|
|
1
1
|
import type { NostrEvent, Filter } from 'nostr-tools';
|
|
2
2
|
import { RelayHandler } from '../core/interfaces.js';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
* relay connections, subscriptions, and publishing.
|
|
4
|
+
* RelayHandler implementation backed by applesauce-relay.
|
|
6
5
|
*/
|
|
7
6
|
export declare class ApplesauceRelayPool implements RelayHandler {
|
|
8
7
|
private readonly relayUrls;
|
|
@@ -11,6 +10,9 @@ export declare class ApplesauceRelayPool implements RelayHandler {
|
|
|
11
10
|
private static readonly PUBLISH_ATTEMPT_TIMEOUT_MS;
|
|
12
11
|
private static readonly PUBLISH_RETRY_INTERVAL_MS;
|
|
13
12
|
private static readonly PUBLISH_ERROR_LOG_INTERVAL_MS;
|
|
13
|
+
private static readonly RECONNECT_BASE_DELAY_MS;
|
|
14
|
+
private static readonly RECONNECT_MAX_DELAY_MS;
|
|
15
|
+
private createRelay;
|
|
14
16
|
/**
|
|
15
17
|
* Creates a new ApplesauceRelayPool instance.
|
|
16
18
|
* @param relayUrls - An array of relay URLs to connect to.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applesauce-relay-pool.d.ts","sourceRoot":"","sources":["../../../src/relay/applesauce-relay-pool.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"applesauce-relay-pool.d.ts","sourceRoot":"","sources":["../../../src/relay/applesauce-relay-pool.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAOrD;;GAEG;AACH,qBAAa,mBAAoB,YAAW,YAAY;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,aAAa,CAAyB;IAG9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAAU;IAC5D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAAO;IACxD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,CAAU;IAG/D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAS;IACxD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAU;IAExD,OAAO,CAAC,WAAW;IAmCnB;;;OAGG;gBACS,SAAS,EAAE,MAAM,EAAE;IAQ/B;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAe9B;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAuD/C;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAkC1B;;;;;OAKG;IACG,SAAS,CACb,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EACpC,MAAM,CAAC,EAAE,MAAM,IAAI,GAClB,OAAO,CAAC,IAAI,CAAC;IAIhB;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKjC;;OAEG;IACH,WAAW,IAAI,IAAI;IAWnB;;;OAGG;IACH,YAAY,IAAI,MAAM,EAAE;CAGzB"}
|
|
@@ -4,10 +4,34 @@ import { sleep } from '../core/utils/utils.js';
|
|
|
4
4
|
import { timer } from 'rxjs';
|
|
5
5
|
const logger = createLogger('applesauce-relay');
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
* relay connections, subscriptions, and publishing.
|
|
7
|
+
* RelayHandler implementation backed by applesauce-relay.
|
|
9
8
|
*/
|
|
10
9
|
export class ApplesauceRelayPool {
|
|
10
|
+
createRelay(url) {
|
|
11
|
+
const relay = new Relay(url);
|
|
12
|
+
// Ensure reconnect attempts continue at a bounded cadence even after many
|
|
13
|
+
// failures, so a relay coming back online is picked up quickly.
|
|
14
|
+
relay.reconnectTimer = (_error, tries = 0) => {
|
|
15
|
+
const delay = Math.min(Math.pow(1.5, tries) * ApplesauceRelayPool.RECONNECT_BASE_DELAY_MS, ApplesauceRelayPool.RECONNECT_MAX_DELAY_MS);
|
|
16
|
+
return timer(delay);
|
|
17
|
+
};
|
|
18
|
+
// Observability for connection state monitoring
|
|
19
|
+
relay.connected$.subscribe((connected) => {
|
|
20
|
+
logger.debug('Connection status changed', {
|
|
21
|
+
relayUrl: relay.url,
|
|
22
|
+
connected,
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
relay.error$.subscribe((error) => {
|
|
26
|
+
if (!error)
|
|
27
|
+
return;
|
|
28
|
+
logger.error('Relay connection error', {
|
|
29
|
+
relayUrl: relay.url,
|
|
30
|
+
error: error instanceof Error ? error.message : String(error),
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
return relay;
|
|
34
|
+
}
|
|
11
35
|
/**
|
|
12
36
|
* Creates a new ApplesauceRelayPool instance.
|
|
13
37
|
* @param relayUrls - An array of relay URLs to connect to.
|
|
@@ -15,35 +39,7 @@ export class ApplesauceRelayPool {
|
|
|
15
39
|
constructor(relayUrls) {
|
|
16
40
|
this.subscriptions = [];
|
|
17
41
|
this.relayUrls = relayUrls;
|
|
18
|
-
|
|
19
|
-
publishTimeout: ApplesauceRelayPool.PUBLISH_ATTEMPT_TIMEOUT_MS,
|
|
20
|
-
}));
|
|
21
|
-
// Ensure reconnect attempts continue at a bounded cadence even after many
|
|
22
|
-
// failures, so a relay coming back online is picked up quickly.
|
|
23
|
-
for (const relay of relays) {
|
|
24
|
-
relay.reconnectTimer = (_error, tries = 0) => {
|
|
25
|
-
const delay = Math.min(Math.pow(1.5, tries) * 3000);
|
|
26
|
-
return timer(delay);
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
// Set up observability for connection state monitoring
|
|
30
|
-
relays.forEach((relay) => {
|
|
31
|
-
relay.connected$.subscribe((isConnected) => {
|
|
32
|
-
logger.debug(`Connection status changed`, {
|
|
33
|
-
relayUrl: relay.url,
|
|
34
|
-
connected: isConnected,
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
relay.error$.subscribe((error) => {
|
|
38
|
-
if (error) {
|
|
39
|
-
logger.error(`Relay connection error`, {
|
|
40
|
-
relayUrl: relay.url,
|
|
41
|
-
error: error instanceof Error ? error.message : String(error),
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
this.relayGroup = new RelayGroup(relays);
|
|
42
|
+
this.relayGroup = new RelayGroup(relayUrls.map((url) => this.createRelay(url)));
|
|
47
43
|
}
|
|
48
44
|
/**
|
|
49
45
|
* Connects to the configured relays.
|
|
@@ -70,28 +66,29 @@ export class ApplesauceRelayPool {
|
|
|
70
66
|
logger.debug('Publishing event', { eventId: event.id, kind: event.kind });
|
|
71
67
|
// NOTE: Publishing is intentionally retried indefinitely.
|
|
72
68
|
// MCP JSON-RPC round-trips cannot complete without delivering responses.
|
|
73
|
-
let lastError;
|
|
74
69
|
let lastLogAt = 0;
|
|
75
70
|
let attempt = 0;
|
|
76
|
-
// eslint-disable-next-line no-constant-condition
|
|
77
71
|
while (true) {
|
|
78
72
|
attempt += 1;
|
|
79
73
|
try {
|
|
80
74
|
const responses = await this.relayGroup.publish(event, {
|
|
81
75
|
timeout: ApplesauceRelayPool.PUBLISH_ATTEMPT_TIMEOUT_MS,
|
|
82
|
-
// Keep retries at 0/1 per attempt; we manage retrying via the outer loop.
|
|
83
76
|
retries: 0,
|
|
84
77
|
});
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
78
|
+
let successCount = 0;
|
|
79
|
+
let failedCount = 0;
|
|
80
|
+
for (const response of responses) {
|
|
81
|
+
if (response.ok)
|
|
82
|
+
successCount += 1;
|
|
83
|
+
else
|
|
84
|
+
failedCount += 1;
|
|
90
85
|
}
|
|
91
|
-
if (
|
|
86
|
+
if (successCount === 0)
|
|
87
|
+
throw new Error('Failed to publish event');
|
|
88
|
+
if (failedCount > 0) {
|
|
92
89
|
logger.warn('Failed to publish event to some relays', {
|
|
93
90
|
eventId: event.id,
|
|
94
|
-
failedCount
|
|
91
|
+
failedCount,
|
|
95
92
|
successCount,
|
|
96
93
|
});
|
|
97
94
|
}
|
|
@@ -101,8 +98,6 @@ export class ApplesauceRelayPool {
|
|
|
101
98
|
return;
|
|
102
99
|
}
|
|
103
100
|
catch (error) {
|
|
104
|
-
lastError = error;
|
|
105
|
-
// Avoid log spam during extended outages.
|
|
106
101
|
const now = Date.now();
|
|
107
102
|
if (now - lastLogAt >=
|
|
108
103
|
ApplesauceRelayPool.PUBLISH_ERROR_LOG_INTERVAL_MS) {
|
|
@@ -126,10 +121,7 @@ export class ApplesauceRelayPool {
|
|
|
126
121
|
* @returns Object with unsubscribe method.
|
|
127
122
|
*/
|
|
128
123
|
createSubscription(filters, onEvent, onEose) {
|
|
129
|
-
logger.debug('Creating subscription
|
|
130
|
-
filters,
|
|
131
|
-
relayUrls: this.relayUrls,
|
|
132
|
-
});
|
|
124
|
+
logger.debug('Creating subscription', { filters });
|
|
133
125
|
const subscription = this.relayGroup.subscription(filters, {
|
|
134
126
|
reconnect: Infinity,
|
|
135
127
|
resubscribe: Infinity,
|
|
@@ -137,14 +129,9 @@ export class ApplesauceRelayPool {
|
|
|
137
129
|
const sub = subscription.subscribe({
|
|
138
130
|
next: (response) => {
|
|
139
131
|
if (response === 'EOSE') {
|
|
140
|
-
logger.debug('Received EOSE signal');
|
|
141
132
|
onEose === null || onEose === void 0 ? void 0 : onEose();
|
|
142
133
|
}
|
|
143
134
|
else {
|
|
144
|
-
logger.debug('Received event', {
|
|
145
|
-
eventId: response.id,
|
|
146
|
-
kind: response.kind,
|
|
147
|
-
});
|
|
148
135
|
onEvent(response);
|
|
149
136
|
}
|
|
150
137
|
},
|
|
@@ -158,12 +145,7 @@ export class ApplesauceRelayPool {
|
|
|
158
145
|
});
|
|
159
146
|
},
|
|
160
147
|
});
|
|
161
|
-
return
|
|
162
|
-
unsubscribe: () => {
|
|
163
|
-
logger.debug('Unsubscribing from subscription');
|
|
164
|
-
sub.unsubscribe();
|
|
165
|
-
},
|
|
166
|
-
};
|
|
148
|
+
return () => sub.unsubscribe();
|
|
167
149
|
}
|
|
168
150
|
/**
|
|
169
151
|
* Subscribes to events from the relay group.
|
|
@@ -172,20 +154,7 @@ export class ApplesauceRelayPool {
|
|
|
172
154
|
* @param onEose - Optional callback function for end-of-stream events.
|
|
173
155
|
*/
|
|
174
156
|
async subscribe(filters, onEvent, onEose) {
|
|
175
|
-
|
|
176
|
-
try {
|
|
177
|
-
const closer = this.createSubscription(filters, onEvent, onEose);
|
|
178
|
-
this.subscriptions.push({
|
|
179
|
-
filters,
|
|
180
|
-
onEvent,
|
|
181
|
-
onEose,
|
|
182
|
-
closer,
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
catch (error) {
|
|
186
|
-
logger.error('Failed to create subscription', { filters, error });
|
|
187
|
-
throw error;
|
|
188
|
-
}
|
|
157
|
+
this.subscriptions.push(this.createSubscription(filters, onEvent, onEose));
|
|
189
158
|
}
|
|
190
159
|
/**
|
|
191
160
|
* Disconnects from all relays and cleans up resources.
|
|
@@ -200,9 +169,8 @@ export class ApplesauceRelayPool {
|
|
|
200
169
|
unsubscribe() {
|
|
201
170
|
logger.debug('Unsubscribing from all subscriptions');
|
|
202
171
|
try {
|
|
203
|
-
for (const
|
|
204
|
-
|
|
205
|
-
}
|
|
172
|
+
for (const unsubscribe of this.subscriptions)
|
|
173
|
+
unsubscribe();
|
|
206
174
|
this.subscriptions = [];
|
|
207
175
|
}
|
|
208
176
|
catch (error) {
|
|
@@ -218,7 +186,10 @@ export class ApplesauceRelayPool {
|
|
|
218
186
|
}
|
|
219
187
|
}
|
|
220
188
|
// Outbound publish policy
|
|
221
|
-
ApplesauceRelayPool.PUBLISH_ATTEMPT_TIMEOUT_MS =
|
|
189
|
+
ApplesauceRelayPool.PUBLISH_ATTEMPT_TIMEOUT_MS = 10000;
|
|
222
190
|
ApplesauceRelayPool.PUBLISH_RETRY_INTERVAL_MS = 500;
|
|
223
191
|
ApplesauceRelayPool.PUBLISH_ERROR_LOG_INTERVAL_MS = 10000;
|
|
192
|
+
// Reconnect backoff policy
|
|
193
|
+
ApplesauceRelayPool.RECONNECT_BASE_DELAY_MS = 3000;
|
|
194
|
+
ApplesauceRelayPool.RECONNECT_MAX_DELAY_MS = 30000;
|
|
224
195
|
//# sourceMappingURL=applesauce-relay-pool.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applesauce-relay-pool.js","sourceRoot":"","sources":["../../../src/relay/applesauce-relay-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAmB,MAAM,MAAM,CAAC;AAE9C,MAAM,MAAM,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"applesauce-relay-pool.js","sourceRoot":"","sources":["../../../src/relay/applesauce-relay-pool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAmB,MAAM,MAAM,CAAC;AAE9C,MAAM,MAAM,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;AAEhD;;GAEG;AACH,MAAM,OAAO,mBAAmB;IActB,WAAW,CAAC,GAAW;QAC7B,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;QAE7B,0EAA0E;QAC1E,gEAAgE;QAChE,KAAK,CAAC,cAAc,GAAG,CACrB,MAA0B,EAC1B,KAAK,GAAG,CAAC,EACW,EAAE;YACtB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,mBAAmB,CAAC,uBAAuB,EAClE,mBAAmB,CAAC,sBAAsB,CAC3C,CAAC;YACF,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC;QAEF,gDAAgD;QAChD,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE;YACvC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE;gBACxC,QAAQ,EAAE,KAAK,CAAC,GAAG;gBACnB,SAAS;aACV,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;YAC/B,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;gBACrC,QAAQ,EAAE,KAAK,CAAC,GAAG;gBACnB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,YAAY,SAAmB;QAlDvB,kBAAa,GAAsB,EAAE,CAAC;QAmD5C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAC9B,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAC9C,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAEpE,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YACf,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;gBAClD,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACzE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,KAAiB;QAC7B,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAE1E,0DAA0D;QAC1D,yEAAyE;QACzE,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,OAAO,IAAI,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,CAAC;YACb,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE;oBACrD,OAAO,EAAE,mBAAmB,CAAC,0BAA0B;oBACvD,OAAO,EAAE,CAAC;iBACX,CAAC,CAAC;gBAEH,IAAI,YAAY,GAAG,CAAC,CAAC;gBACrB,IAAI,WAAW,GAAG,CAAC,CAAC;gBACpB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,IAAI,QAAQ,CAAC,EAAE;wBAAE,YAAY,IAAI,CAAC,CAAC;;wBAC9B,WAAW,IAAI,CAAC,CAAC;gBACxB,CAAC;gBAED,IAAI,YAAY,KAAK,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBAEnE,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;oBACpB,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;wBACpD,OAAO,EAAE,KAAK,CAAC,EAAE;wBACjB,WAAW;wBACX,YAAY;qBACb,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBACtE,CAAC;gBACD,OAAO;YACT,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,IACE,GAAG,GAAG,SAAS;oBACf,mBAAmB,CAAC,6BAA6B,EACjD,CAAC;oBACD,SAAS,GAAG,GAAG,CAAC;oBAChB,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE;wBACzC,OAAO,EAAE,KAAK,CAAC,EAAE;wBACjB,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,OAAO;wBACP,KAAK;qBACN,CAAC,CAAC;gBACL,CAAC;gBAED,MAAM,KAAK,CAAC,mBAAmB,CAAC,yBAAyB,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,kBAAkB,CACxB,OAAiB,EACjB,OAAoC,EACpC,MAAmB;QAEnB,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAEnD,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE;YACzD,SAAS,EAAE,QAAQ;YACnB,WAAW,EAAE,QAAQ;SACtB,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC;YACjC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE;gBACjB,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;oBACxB,MAAM,aAAN,MAAM,uBAAN,MAAM,EAAI,CAAC;gBACb,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;YACD,QAAQ,EAAE,GAAG,EAAE;gBACb,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACxC,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;gBACf,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE;oBACjC,KAAK;oBACL,SAAS,EAAE,IAAI,CAAC,SAAS;iBAC1B,CAAC,CAAC;YACL,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,SAAS,CACb,OAAiB,EACjB,OAAoC,EACpC,MAAmB;QAEnB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,WAAW;QACT,MAAM,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAErD,IAAI,CAAC;YACH,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,aAAa;gBAAE,WAAW,EAAE,CAAC;YAC5D,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,8CAA8C,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,YAAY;QACV,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;;AAzND,0BAA0B;AACF,8CAA0B,GAAG,KAAM,AAAT,CAAU;AACpC,6CAAyB,GAAG,GAAG,AAAN,CAAO;AAChC,iDAA6B,GAAG,KAAM,AAAT,CAAU;AAE/D,2BAA2B;AACH,2CAAuB,GAAG,IAAK,AAAR,CAAS;AAChC,0CAAsB,GAAG,KAAM,AAAT,CAAU"}
|