@sendfn/admin 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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,yBAAyB,EAC/B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EACV,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,yBAAyB,EACzB,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,EAC3B,2BAA2B,EAC3B,wBAAwB,EACxB,yBAAyB,EACzB,2BAA2B,EAC3B,4BAA4B,EAC5B,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,uFAAuF;AACvF,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAIzC,yBAAyB;qBAC7B,sBAAsB,YAAY,yBAAyB;0BACtD,2BAA2B,YAAY,yBAAyB;;;uBAGpE,yBAAyB,YAAiB,yBAAyB;;;2BAG9D,oBAAoB,YAAY,yBAAyB;+BACrD,wBAAwB,YAAY,yBAAyB;yBACnE,kBAAkB,YAAY,yBAAyB;8BAClD,uBAAuB,YAAY,yBAAyB;0BAChE,mBAAmB,YAAY,yBAAyB;8BACpD,uBAAuB,YAAY,yBAAyB;;;uBAGpE,2BAA2B,YAAiB,yBAAyB;qBACtE,yBAAyB,YAAY,yBAAyB;qBAC9D,yBAAyB,YAAY,yBAAyB;wBAC3D,4BAA4B,YAAY,yBAAyB;;;sBAGnE,2BAA2B,YAAY,yBAAyB;0BAC5D,yBAAyB,YAAY,yBAAyB;4BAC5D,2BAA2B,YAAY,yBAAyB;yBACnE,wBAAwB,YAAY,yBAAyB;yBAC7D,yBAAyB,YAAY,yBAAyB;;EAGpF"}
package/dist/client.js ADDED
@@ -0,0 +1,38 @@
1
+ import { createCapabilityAdminClient, } from "@superfunctions/admin";
2
+ import { sendFnAdminCapability } from "./capability.js";
3
+ /** Function-scoped TypeScript client with named methods for every SendFn operation. */
4
+ export function createSendFnAdminClient(adminClient) {
5
+ const client = createCapabilityAdminClient(sendFnAdminCapability, adminClient);
6
+ return Object.assign(client, {
7
+ templates: {
8
+ list: (options) => client.invoke("sendfn.templates.list", {}, options),
9
+ get: (input, options) => client.invoke("sendfn.templates.get", input, options),
10
+ register: (input, options) => client.invoke("sendfn.templates.register", input, options),
11
+ },
12
+ deliveries: {
13
+ list: (input = {}, options) => client.invoke("sendfn.deliveries.list", input, options),
14
+ },
15
+ messages: {
16
+ sendEmail: (input, options) => client.invoke("sendfn.messages.send-email", input, options),
17
+ sendBulkEmail: (input, options) => client.invoke("sendfn.messages.send-email-bulk", input, options),
18
+ sendSms: (input, options) => client.invoke("sendfn.messages.send-sms", input, options),
19
+ sendWhatsApp: (input, options) => client.invoke("sendfn.messages.send-whatsapp", input, options),
20
+ sendPush: (input, options) => client.invoke("sendfn.messages.send-push", input, options),
21
+ sendBulkPush: (input, options) => client.invoke("sendfn.messages.send-push-bulk", input, options),
22
+ },
23
+ suppressions: {
24
+ list: (input = {}, options) => client.invoke("sendfn.suppressions.list", input, options),
25
+ get: (input, options) => client.invoke("sendfn.suppressions.get", input, options),
26
+ add: (input, options) => client.invoke("sendfn.suppressions.add", input, options),
27
+ remove: (input, options) => client.invoke("sendfn.suppressions.remove", input, options),
28
+ },
29
+ deviceTokens: {
30
+ list: (input, options) => client.invoke("sendfn.device-tokens.list", input, options),
31
+ register: (input, options) => client.invoke("sendfn.device-tokens.register", input, options),
32
+ deactivate: (input, options) => client.invoke("sendfn.device-tokens.deactivate", input, options),
33
+ refresh: (input, options) => client.invoke("sendfn.device-tokens.refresh", input, options),
34
+ cleanup: (input, options) => client.invoke("sendfn.device-tokens.cleanup", input, options),
35
+ },
36
+ });
37
+ }
38
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { SendFnAdminService, SendFnDomainAdminServiceOptions } from "./types.js";
2
+ /**
3
+ * Binds a project-owned public SendFn client to the shared administration
4
+ * contract. No database or provider is accessed directly, so SendFn's
5
+ * validation, suppression, provider, event, and storage invariants remain the
6
+ * authoritative domain boundary.
7
+ */
8
+ export declare function createSendFnDomainAdminService(options: SendFnDomainAdminServiceOptions): SendFnAdminService;
9
+ //# sourceMappingURL=domain-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-service.d.ts","sourceRoot":"","sources":["../src/domain-service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,kBAAkB,EAClB,+BAA+B,EAChC,MAAM,YAAY,CAAC;AAoGpB;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,+BAA+B,GACvC,kBAAkB,CA8JpB"}
@@ -0,0 +1,231 @@
1
+ import { SendfnError } from "sendfn";
2
+ import { AdminError } from "@superfunctions/admin";
3
+ function toAdminJson(value) {
4
+ const visit = (current) => {
5
+ if (current instanceof Date)
6
+ return current.toISOString();
7
+ if (Array.isArray(current))
8
+ return current.map(visit);
9
+ if (!current || typeof current !== "object")
10
+ return current;
11
+ return Object.fromEntries(Object.entries(current)
12
+ .filter(([, item]) => item !== undefined)
13
+ .map(([key, item]) => [key, visit(item)]));
14
+ };
15
+ return visit(value);
16
+ }
17
+ function safeDeviceToken(value) {
18
+ return { ...toAdminJson(value), token: "[REDACTED]" };
19
+ }
20
+ function redactNestedTokens(value) {
21
+ if (Array.isArray(value))
22
+ return value.map(redactNestedTokens);
23
+ if (!value || typeof value !== "object")
24
+ return value;
25
+ return Object.fromEntries(Object.entries(value)
26
+ .map(([key, item]) => [key, key === "token" ? "[REDACTED]" : redactNestedTokens(item)]));
27
+ }
28
+ function safePushNotification(value) {
29
+ const safeValue = toAdminJson(value);
30
+ return {
31
+ ...safeValue,
32
+ deviceTokens: value.deviceTokens.map(() => "[REDACTED]"),
33
+ metadata: redactNestedTokens(safeValue.metadata),
34
+ };
35
+ }
36
+ function parseDate(value, label) {
37
+ const parsed = new Date(value);
38
+ if (!Number.isFinite(parsed.getTime())) {
39
+ throw new AdminError("invalid_argument", `${label} must be a valid date-time.`);
40
+ }
41
+ return parsed;
42
+ }
43
+ function requiredIdempotencyKey(context) {
44
+ if (!context.idempotencyKey) {
45
+ throw new AdminError("precondition_failed", "This SendFn operation requires an idempotency key.");
46
+ }
47
+ return context.idempotencyKey;
48
+ }
49
+ function translateSendFnError(error) {
50
+ if (error instanceof AdminError)
51
+ throw error;
52
+ if (!(error instanceof SendfnError)) {
53
+ throw new AdminError("internal", "SendFn could not complete the administration operation.", { cause: error });
54
+ }
55
+ if (error.code === "SENDFN_VALIDATION_ERROR" ||
56
+ error.code === "SENDFN_TEMPLATE_ERROR" ||
57
+ error.code === "SENDFN_TEMPLATE_NOT_FOUND" ||
58
+ error.code === "SENDFN_TEMPLATE_RENDER_ERROR") {
59
+ throw new AdminError("invalid_argument", error.message, {
60
+ details: error.details,
61
+ retryable: error.retryable,
62
+ cause: error,
63
+ });
64
+ }
65
+ if (error.code === "SENDFN_SUPPRESSION_ERROR") {
66
+ throw new AdminError("conflict", error.message, {
67
+ details: error.details,
68
+ retryable: error.retryable,
69
+ cause: error,
70
+ });
71
+ }
72
+ if (error.code.endsWith("_PROVIDER_ERROR") || error.code === "SENDFN_DATABASE_ERROR") {
73
+ throw new AdminError("dependency_unavailable", error.message, {
74
+ details: error.details,
75
+ retryable: error.retryable,
76
+ cause: error,
77
+ });
78
+ }
79
+ throw new AdminError("internal", "SendFn could not complete the administration operation.", {
80
+ details: { domainCode: error.code },
81
+ retryable: error.retryable,
82
+ cause: error,
83
+ });
84
+ }
85
+ async function domain(operation) {
86
+ try {
87
+ return await operation();
88
+ }
89
+ catch (error) {
90
+ return translateSendFnError(error);
91
+ }
92
+ }
93
+ /**
94
+ * Binds a project-owned public SendFn client to the shared administration
95
+ * contract. No database or provider is accessed directly, so SendFn's
96
+ * validation, suppression, provider, event, and storage invariants remain the
97
+ * authoritative domain boundary.
98
+ */
99
+ export function createSendFnDomainAdminService(options) {
100
+ if (!options.projectId.trim()) {
101
+ throw new AdminError("invalid_argument", "SendFn admin binding requires a projectId.");
102
+ }
103
+ const { sendfn, projectId } = options;
104
+ const assertProject = (context) => {
105
+ if (!context.scope.projectId || context.scope.projectId !== projectId) {
106
+ throw new AdminError("forbidden", "The active project cannot access this SendFn client.");
107
+ }
108
+ };
109
+ return {
110
+ async listTemplates(_input, context) {
111
+ assertProject(context);
112
+ const templates = await domain(() => sendfn.listTemplates());
113
+ return { items: toAdminJson(templates), nextCursor: null };
114
+ },
115
+ async getTemplate(input, context) {
116
+ assertProject(context);
117
+ const template = await domain(() => sendfn.getTemplate(input.id));
118
+ if (!template) {
119
+ throw new AdminError("not_found", "The SendFn template was not found in the active project.");
120
+ }
121
+ return { item: toAdminJson(template) };
122
+ },
123
+ async registerTemplate(input, context) {
124
+ assertProject(context);
125
+ await domain(() => sendfn.registerTemplate(input.template));
126
+ return { accepted: true };
127
+ },
128
+ async listDeliveries(input, context) {
129
+ assertProject(context);
130
+ const { startAt, endAt, ...query } = input;
131
+ const events = await domain(() => sendfn.queryEvents({
132
+ ...query,
133
+ ...(startAt ? { startAt: parseDate(startAt, "startAt") } : {}),
134
+ ...(endAt ? { endAt: parseDate(endAt, "endAt") } : {}),
135
+ }));
136
+ return { items: toAdminJson(events), nextCursor: null };
137
+ },
138
+ async sendEmail(input, context) {
139
+ assertProject(context);
140
+ const transaction = await domain(() => sendfn.email({
141
+ ...input,
142
+ idempotencyKey: requiredIdempotencyKey(context),
143
+ }));
144
+ return { item: toAdminJson(transaction) };
145
+ },
146
+ async sendBulkEmail(input, context) {
147
+ assertProject(context);
148
+ const rootKey = requiredIdempotencyKey(context);
149
+ const transactions = await domain(() => sendfn.bulkEmail(input.messages.map((message, index) => ({
150
+ ...message,
151
+ idempotencyKey: `${rootKey}:${index}`,
152
+ }))));
153
+ return { items: toAdminJson(transactions) };
154
+ },
155
+ async sendSms(input, context) {
156
+ assertProject(context);
157
+ return { item: toAdminJson(await domain(() => sendfn.sms(input))) };
158
+ },
159
+ async sendWhatsApp(input, context) {
160
+ assertProject(context);
161
+ return { item: toAdminJson(await domain(() => sendfn.whatsapp(input))) };
162
+ },
163
+ async sendPush(input, context) {
164
+ assertProject(context);
165
+ return { item: safePushNotification(await domain(() => sendfn.push(input))) };
166
+ },
167
+ async sendBulkPush(input, context) {
168
+ assertProject(context);
169
+ const notifications = await domain(() => sendfn.bulkPush(input.messages));
170
+ return { items: notifications.map(safePushNotification) };
171
+ },
172
+ async listSuppressions(input, context) {
173
+ assertProject(context);
174
+ const items = await domain(() => sendfn.exportSuppressionList(input.limit, input.offset));
175
+ return { items: toAdminJson(items), nextCursor: null };
176
+ },
177
+ async getSuppression(input, context) {
178
+ assertProject(context);
179
+ const result = await domain(() => sendfn.checkSuppressionList(input.email));
180
+ return {
181
+ suppressed: result.suppressed,
182
+ item: result.entry ? toAdminJson(result.entry) : null,
183
+ };
184
+ },
185
+ async addSuppression(input, context) {
186
+ assertProject(context);
187
+ const item = await domain(() => sendfn.addToSuppressionList({
188
+ email: input.email,
189
+ reason: input.reason,
190
+ source: input.source,
191
+ bounceType: input.bounceType ?? null,
192
+ metadata: input.metadata ?? {},
193
+ suppressedAt: input.suppressedAt
194
+ ? parseDate(input.suppressedAt, "suppressedAt")
195
+ : context.now ?? new Date(),
196
+ }));
197
+ return { accepted: true, item: toAdminJson(item), email: item.email };
198
+ },
199
+ async removeSuppression(input, context) {
200
+ assertProject(context);
201
+ await domain(() => sendfn.removeFromSuppressionList(input.email));
202
+ return { accepted: true, email: input.email };
203
+ },
204
+ async listDeviceTokens(input, context) {
205
+ assertProject(context);
206
+ const devices = await domain(() => sendfn.getDevices(input.userId, input.platform));
207
+ return { items: devices.map(safeDeviceToken), nextCursor: null };
208
+ },
209
+ async registerDevice(input, context) {
210
+ assertProject(context);
211
+ return { item: safeDeviceToken(await domain(() => sendfn.registerDevice(input))) };
212
+ },
213
+ async deactivateDevice(input, context) {
214
+ assertProject(context);
215
+ await domain(() => sendfn.deactivateDevice(input.token));
216
+ return { accepted: true, deactivatedToken: "[REDACTED]" };
217
+ },
218
+ async refreshDevice(input, context) {
219
+ assertProject(context);
220
+ const device = await domain(() => sendfn.refreshDeviceToken(input.oldToken, input.newToken, input.userId, input.platform));
221
+ return { item: safeDeviceToken(device) };
222
+ },
223
+ async cleanupDevices(input, context) {
224
+ assertProject(context);
225
+ const olderThan = parseDate(input.olderThan, "olderThan");
226
+ const removed = await domain(() => sendfn.cleanupInactiveDevices(olderThan));
227
+ return { accepted: true, removed, olderThan: olderThan.toISOString() };
228
+ },
229
+ };
230
+ }
231
+ //# sourceMappingURL=domain-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-service.js","sourceRoot":"","sources":["../src/domain-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,UAAU,EAA8B,MAAM,uBAAuB,CAAC;AAO/E,SAAS,WAAW,CAAI,KAAQ;IAC9B,MAAM,KAAK,GAAG,CAAC,OAAgB,EAAW,EAAE;QAC1C,IAAI,OAAO,YAAY,IAAI;YAAE,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC;QAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO,OAAO,CAAC;QAC5D,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,OAAkC,CAAC;aAC/C,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC;aACxC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAC5C,CAAC;IACJ,CAAC,CAAC;IACF,OAAO,KAAK,CAAC,KAAK,CAAuB,CAAC;AAC5C,CAAC;AAED,SAAS,eAAe,CAA8B,KAAQ;IAC5D,OAAO,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,YAAY,EAAwB,CAAC;AAC9E,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC/D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;SAC7C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAC1F,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAuC,KAAQ;IAC1E,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAA4B,CAAC;IAChE,OAAO;QACL,GAAG,SAAS;QACZ,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC;QACxD,QAAQ,EAAE,kBAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC;KAChB,CAAC;AACrC,CAAC;AAED,SAAS,SAAS,CAAC,KAAa,EAAE,KAAa;IAC7C,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,GAAG,KAAK,6BAA6B,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,sBAAsB,CAAC,OAA8B;IAC5D,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAAC,qBAAqB,EAAE,oDAAoD,CAAC,CAAC;IACpG,CAAC;IACD,OAAO,OAAO,CAAC,cAAc,CAAC;AAChC,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,KAAK,YAAY,UAAU;QAAE,MAAM,KAAK,CAAC;IAC7C,IAAI,CAAC,CAAC,KAAK,YAAY,WAAW,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,UAAU,CAAC,UAAU,EAAE,yDAAyD,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAChH,CAAC;IAED,IACE,KAAK,CAAC,IAAI,KAAK,yBAAyB;QACxC,KAAK,CAAC,IAAI,KAAK,uBAAuB;QACtC,KAAK,CAAC,IAAI,KAAK,2BAA2B;QAC1C,KAAK,CAAC,IAAI,KAAK,8BAA8B,EAC7C,CAAC;QACD,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,KAAK,CAAC,OAAO,EAAE;YACtD,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;QAC9C,MAAM,IAAI,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE;YAC9C,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;QACrF,MAAM,IAAI,UAAU,CAAC,wBAAwB,EAAE,KAAK,CAAC,OAAO,EAAE;YAC5D,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,UAAU,CAAC,UAAU,EAAE,yDAAyD,EAAE;QAC1F,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE;QACnC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,MAAM,CAAI,SAA2B;IAClD,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,8BAA8B,CAC5C,OAAwC;IAExC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9B,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,4CAA4C,CAAC,CAAC;IACzF,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAEtC,MAAM,aAAa,GAAG,CAAC,OAA8B,EAAQ,EAAE;QAC7D,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACtE,MAAM,IAAI,UAAU,CAAC,WAAW,EAAE,sDAAsD,CAAC,CAAC;QAC5F,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO;YACjC,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;YAC7D,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC7D,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO;YAC9B,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAClE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,UAAU,CAAC,WAAW,EAAE,0DAA0D,CAAC,CAAC;YAChG,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,CAAC;QAED,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO;YACnC,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC5D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC5B,CAAC;QAED,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO;YACjC,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC;YAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC;gBACnD,GAAG,KAAK;gBACR,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9D,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvD,CAAC,CAAC,CAAC;YACJ,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC1D,CAAC;QAED,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO;YAC5B,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;gBAClD,GAAG,KAAK;gBACR,cAAc,EAAE,sBAAsB,CAAC,OAAO,CAAC;aAChD,CAAC,CAAC,CAAC;YACJ,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5C,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO;YAChC,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;YAChD,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CACtD,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;gBACtC,GAAG,OAAO;gBACV,cAAc,EAAE,GAAG,OAAO,IAAI,KAAK,EAAE;aACtC,CAAC,CAAC,CACJ,CAAC,CAAC;YACH,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9C,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO;YAC1B,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO;YAC/B,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,CAAC;QAED,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO;YAC3B,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,oBAAoB,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO;YAC/B,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC1E,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC5D,CAAC;QAED,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO;YACnC,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAC1F,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACzD,CAAC;QAED,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO;YACjC,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5E,OAAO;gBACL,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;aACtD,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO;YACjC,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC;gBAC1D,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI;gBACpC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;gBAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;oBAC9B,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,cAAc,CAAC;oBAC/C,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE;aAC9B,CAAC,CAAC,CAAC;YACJ,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QACxE,CAAC;QAED,KAAK,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO;YACpC,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAClE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QAChD,CAAC;QAED,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO;YACnC,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpF,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACnE,CAAC;QAED,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO;YACjC,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,CAAC;QAED,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO;YACnC,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACzD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,CAAC;QAC5D,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO;YAChC,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,kBAAkB,CACzD,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,QAAQ,CACf,CAAC,CAAC;YACH,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3C,CAAC;QAED,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO;YACjC,aAAa,CAAC,OAAO,CAAC,CAAC;YACvB,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YAC1D,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7E,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,WAAW,EAAE,EAAE,CAAC;QACzE,CAAC;KACF,CAAC;AACJ,CAAC"}