@capxul/cli 4.20.0-beta.3 → 4.20.0-beta.30
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/README.md +1156 -21
- package/dist/browser/GeistVF.woff +0 -0
- package/dist/browser/signer.js +85954 -0
- package/dist/browser/signer.js.map +1 -0
- package/dist/entry-Cp3LiVYn.mjs +46472 -0
- package/dist/entry-Cp3LiVYn.mjs.map +1 -0
- package/dist/fast-Dvf2EM7j.mjs +57 -0
- package/dist/fast-Dvf2EM7j.mjs.map +1 -0
- package/dist/{lib-BOge5QZP.mjs → lib-5nM6ORJd.mjs} +5 -4
- package/dist/{lib-BOge5QZP.mjs.map → lib-5nM6ORJd.mjs.map} +1 -1
- package/dist/{lib-DH_xJGSE.mjs → lib-BJgR4mWJ.mjs} +6 -5
- package/dist/{lib-DH_xJGSE.mjs.map → lib-BJgR4mWJ.mjs.map} +1 -1
- package/dist/lib-BlUleR2B.mjs +3 -0
- package/dist/{lib-C8ENT9j6.mjs → lib-BspI667y.mjs} +7 -6
- package/dist/{lib-C8ENT9j6.mjs.map → lib-BspI667y.mjs.map} +1 -1
- package/dist/{lib-C4fpnzyy.mjs → lib-Buegx0dz.mjs} +6 -5
- package/dist/{lib-C4fpnzyy.mjs.map → lib-Buegx0dz.mjs.map} +1 -1
- package/dist/{lib-DVGoRCJN.mjs → lib-CJw8te9L.mjs} +38 -38
- package/dist/{lib-DVGoRCJN.mjs.map → lib-CJw8te9L.mjs.map} +1 -1
- package/dist/lib-C_-etuHZ.mjs +3 -0
- package/dist/lib-CoGPQsbr.mjs +655 -0
- package/dist/lib-CoGPQsbr.mjs.map +1 -0
- package/dist/lib-Dd_fsz7h.mjs +3 -0
- package/dist/lib-DnmstTkB.mjs +578 -0
- package/dist/lib-DnmstTkB.mjs.map +1 -0
- package/dist/lib-IlYdzOHo.mjs +3 -0
- package/dist/main.mjs +22 -51062
- package/dist/main.mjs.map +1 -1
- package/dist/organizations-Dkb73lVO.mjs +37607 -0
- package/dist/organizations-Dkb73lVO.mjs.map +1 -0
- package/dist/permission-approvals-C3cUSQeT.mjs +139 -0
- package/dist/permission-approvals-C3cUSQeT.mjs.map +1 -0
- package/dist/record-U7Yu4KQP.mjs +1295 -0
- package/dist/record-U7Yu4KQP.mjs.map +1 -0
- package/dist/{secp256k1-Cc9JhcTQ.mjs → secp256k1-D8L212-Z.mjs} +5 -298
- package/dist/secp256k1-D8L212-Z.mjs.map +1 -0
- package/dist/sha2-CR2DnMEk.mjs +298 -0
- package/dist/sha2-CR2DnMEk.mjs.map +1 -0
- package/dist/utils-DmKXBQjM.mjs +130 -0
- package/dist/utils-DmKXBQjM.mjs.map +1 -0
- package/dist/where-view-DuGbrSLp.mjs +1420 -0
- package/dist/where-view-DuGbrSLp.mjs.map +1 -0
- package/package.json +18 -10
- package/dist/secp256k1-Cc9JhcTQ.mjs.map +0 -1
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { W as abandonPrepared, a as verifiedConfiguration, cr as CapxulError, d as verifiedPreparation, et as asCapxulError, f as buildCommand, gn as CAPXUL_OPERATIONS, i as prepareConfiguration, l as preparePermission, m as validateReplacementInput, or as Errors, r as authorInvitation, sr as absurd, u as preparedIdentity } from "./organizations-Dkb73lVO.mjs";
|
|
2
|
+
//#region ../../packages/sdk/src/accounts/permission-approvals.ts
|
|
3
|
+
/** Prepare a Permission write or an invitation's configuration for `signerAddress`, checked. */
|
|
4
|
+
function prepareVerifiedPermissionChange(deps, input, signerAddress, signal) {
|
|
5
|
+
return "permission" in input ? prepareVerifiedPermissionWrite(deps, input, signerAddress, signal) : prepareVerifiedInvitation(deps, input, signerAddress, signal);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Hand the verified identity to the caller before the approval opens. A
|
|
9
|
+
* caller that refuses it has not authorized the command: close the prepared
|
|
10
|
+
* command, so its nonce lane is free again.
|
|
11
|
+
*/
|
|
12
|
+
async function delivered(deps, executionId, deliver) {
|
|
13
|
+
let refused;
|
|
14
|
+
try {
|
|
15
|
+
const result = await deliver();
|
|
16
|
+
if (result !== void 0 && !result.ok) refused = result;
|
|
17
|
+
} catch (cause) {
|
|
18
|
+
refused = {
|
|
19
|
+
ok: false,
|
|
20
|
+
error: asCapxulError(cause)
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return refused === void 0 ? {
|
|
24
|
+
ok: true,
|
|
25
|
+
value: { executionId }
|
|
26
|
+
} : abandonPrepared(deps, executionId, "prepared_mismatch", refused);
|
|
27
|
+
}
|
|
28
|
+
/** The command a write sends, decoded exactly as its `org(id).permissions` method decodes it. */
|
|
29
|
+
function command(write) {
|
|
30
|
+
try {
|
|
31
|
+
switch (write.operation) {
|
|
32
|
+
case "create": return {
|
|
33
|
+
ok: true,
|
|
34
|
+
value: buildCommand.create(write)
|
|
35
|
+
};
|
|
36
|
+
case "change": return {
|
|
37
|
+
ok: true,
|
|
38
|
+
value: buildCommand.change(write)
|
|
39
|
+
};
|
|
40
|
+
case "assign": return {
|
|
41
|
+
ok: true,
|
|
42
|
+
value: buildCommand.assign(write)
|
|
43
|
+
};
|
|
44
|
+
case "revoke": return {
|
|
45
|
+
ok: true,
|
|
46
|
+
value: buildCommand.revoke(write)
|
|
47
|
+
};
|
|
48
|
+
case "replace": return {
|
|
49
|
+
ok: true,
|
|
50
|
+
value: {
|
|
51
|
+
operation: "replace",
|
|
52
|
+
requestKey: write.requestKey
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
default: return absurd(write);
|
|
56
|
+
}
|
|
57
|
+
} catch (cause) {
|
|
58
|
+
return {
|
|
59
|
+
ok: false,
|
|
60
|
+
error: asCapxulError(cause)
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function prepareVerifiedPermissionWrite(deps, input, signerAddress, signal) {
|
|
65
|
+
const session = deps.actor?.authSession() ?? null;
|
|
66
|
+
if (session === null || deps.chainId === void 0) return {
|
|
67
|
+
ok: false,
|
|
68
|
+
error: Errors.notAuthenticated()
|
|
69
|
+
};
|
|
70
|
+
const built = command(input.permission);
|
|
71
|
+
if (!built.ok) return built;
|
|
72
|
+
const orgId = input.organizationId;
|
|
73
|
+
const expectedSnapshotHash = input.permission.operation === "replace" ? input.permission.expectedSnapshotHash : void 0;
|
|
74
|
+
const admitted = validateReplacementInput(orgId, built.value, expectedSnapshotHash);
|
|
75
|
+
if (!admitted.ok) return admitted;
|
|
76
|
+
const preparation = {
|
|
77
|
+
orgId,
|
|
78
|
+
command: built.value,
|
|
79
|
+
signerAddress,
|
|
80
|
+
email: session.email,
|
|
81
|
+
chainId: deps.chainId,
|
|
82
|
+
expectedSnapshotHash
|
|
83
|
+
};
|
|
84
|
+
const prepared = await preparePermission(deps, preparation, signal, void 0);
|
|
85
|
+
if (!prepared.ok) return prepared;
|
|
86
|
+
const executionId = prepared.value.executionId;
|
|
87
|
+
const verified = verifiedPreparation(prepared.value, preparation);
|
|
88
|
+
if (!verified.ok) return abandonPrepared(deps, executionId, "prepared_mismatch", verified);
|
|
89
|
+
const { onPrepared } = input;
|
|
90
|
+
return onPrepared === void 0 ? {
|
|
91
|
+
ok: true,
|
|
92
|
+
value: { executionId }
|
|
93
|
+
} : delivered(deps, executionId, () => onPrepared(preparedIdentity(verified.value)));
|
|
94
|
+
}
|
|
95
|
+
async function prepareVerifiedInvitation(deps, input, signerAddress, signal) {
|
|
96
|
+
const session = deps.actor?.authSession() ?? null;
|
|
97
|
+
if (session === null || deps.chainId === void 0) return {
|
|
98
|
+
ok: false,
|
|
99
|
+
error: Errors.notAuthenticated()
|
|
100
|
+
};
|
|
101
|
+
const orgId = input.organizationId;
|
|
102
|
+
const authored = await authorInvitation(deps, orgId, input.invite, signal, void 0);
|
|
103
|
+
if (!authored.ok) return authored;
|
|
104
|
+
const view = authored.value;
|
|
105
|
+
if (view.phase !== "authorizing" || view.commandId === null) return {
|
|
106
|
+
ok: false,
|
|
107
|
+
error: new CapxulError("WRONG_STATE", "The invitation's rights are already set up, or it ended: nothing is left to sign.", { details: {
|
|
108
|
+
method: CAPXUL_OPERATIONS.approvals.prepare,
|
|
109
|
+
currentState: view.phase,
|
|
110
|
+
validStates: ["authorizing"],
|
|
111
|
+
invitationId: view.id
|
|
112
|
+
} })
|
|
113
|
+
};
|
|
114
|
+
const preparation = {
|
|
115
|
+
orgId,
|
|
116
|
+
view,
|
|
117
|
+
commandId: view.commandId,
|
|
118
|
+
signerAddress,
|
|
119
|
+
email: session.email,
|
|
120
|
+
chainId: deps.chainId
|
|
121
|
+
};
|
|
122
|
+
const built = await prepareConfiguration(deps, preparation, signal, void 0);
|
|
123
|
+
if (!built.ok) return built;
|
|
124
|
+
const { executionId, invitationId, commandId } = built.value;
|
|
125
|
+
const verified = verifiedConfiguration(built.value, preparation);
|
|
126
|
+
if (!verified.ok) return abandonPrepared(deps, executionId, "prepared_mismatch", verified);
|
|
127
|
+
const { onPrepared } = input;
|
|
128
|
+
return onPrepared === void 0 ? {
|
|
129
|
+
ok: true,
|
|
130
|
+
value: { executionId }
|
|
131
|
+
} : delivered(deps, executionId, () => onPrepared({
|
|
132
|
+
invitationId,
|
|
133
|
+
commandId
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
//#endregion
|
|
137
|
+
export { prepareVerifiedPermissionChange };
|
|
138
|
+
|
|
139
|
+
//# sourceMappingURL=permission-approvals-C3cUSQeT.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permission-approvals-C3cUSQeT.mjs","names":[],"sources":["../../../packages/sdk/src/accounts/permission-approvals.ts"],"sourcesContent":["// Approvals that change an Organization's Permissions and move no money: a\n// Permission command (create, change, assign, revoke or replace, Budgets\n// included) and the configuration an invitation's offered rights need. Each is\n// prepared for the signer the backend recorded when the Safe was claimed and\n// checked exactly as the signed path checks it, before any approval is opened.\n// The person's own key signs later, on the approval page.\n\nimport { Errors } from \"@capxul/protocol/errors/factories\";\nimport { CapxulError } from \"@capxul/protocol/errors/model\";\nimport { absurd } from \"@capxul/protocol/primitives/absurd\";\nimport { CAPXUL_OPERATIONS } from \"@capxul/observability\";\nimport type { InviteInput } from \"@capxul/protocol/organizations/invitation-schema\";\nimport type { PermissionCommand } from \"@capxul/protocol/permissions/command-schema\";\n\nimport {\n authorInvitation,\n prepareConfiguration,\n verifiedConfiguration,\n type InvitePrepared,\n} from \"#organizations\";\nimport { abandonPrepared } from \"#payments\";\nimport {\n buildCommand,\n preparePermission,\n preparedIdentity,\n validateReplacementInput,\n verifiedPreparation,\n type PermissionAssignInput,\n type PermissionChangeInput,\n type PermissionCreateInput,\n type PermissionPrepared,\n type PermissionReplaceInput,\n type PermissionRevokeInput,\n} from \"#permissions\";\nimport type { FinancialOpsDeps } from \"#platform/client/financial-ops\";\nimport { asCapxulError, type CapxulResult } from \"#platform/results\";\n\n/** One Permission write, as the matching `org(id).permissions` method takes it. */\nexport type PermissionWrite =\n | ({ readonly operation: \"create\" } & PermissionCreateInput)\n | ({ readonly operation: \"change\" } & PermissionChangeInput)\n | ({ readonly operation: \"assign\" } & PermissionAssignInput)\n | ({ readonly operation: \"revoke\" } & PermissionRevokeInput)\n | ({ readonly operation: \"replace\" } & PermissionReplaceInput);\n\n/** Create, change, assign, revoke or replace an Organization's Permissions. */\nexport interface PermissionApprovalInput {\n readonly organizationId: string;\n readonly permission: PermissionWrite;\n /**\n * Receives the verified prepared command before its approval opens. A throw\n * or a failed result opens no approval, and the prepared command is closed.\n */\n readonly onPrepared?: (\n value: PermissionPrepared,\n ) => void | CapxulResult<void> | Promise<void | CapxulResult<void>>;\n}\n\n/** Set up the rights an invitation offers, so its invitee can accept them. */\nexport interface InvitationApprovalInput {\n readonly organizationId: string;\n readonly invite: InviteInput;\n /** Receives `{invitationId, commandId}` before the approval opens; a throw opens none. */\n readonly onPrepared?: (value: InvitePrepared) => void | Promise<void>;\n}\n\nexport type PermissionChangeApprovalInput = PermissionApprovalInput | InvitationApprovalInput;\n\ntype Deps = Pick<FinancialOpsDeps, \"actor\" | \"chainId\" | \"convexCall\" | \"runPromise\">;\ntype Prepared = CapxulResult<{ readonly executionId: string }>;\n\n/** Prepare a Permission write or an invitation's configuration for `signerAddress`, checked. */\nexport function prepareVerifiedPermissionChange(\n deps: Deps,\n input: PermissionChangeApprovalInput,\n signerAddress: string,\n signal: AbortSignal | undefined,\n): Promise<Prepared> {\n return \"permission\" in input\n ? prepareVerifiedPermissionWrite(deps, input, signerAddress, signal)\n : prepareVerifiedInvitation(deps, input, signerAddress, signal);\n}\n\n/**\n * Hand the verified identity to the caller before the approval opens. A\n * caller that refuses it has not authorized the command: close the prepared\n * command, so its nonce lane is free again.\n */\nasync function delivered(\n deps: Deps,\n executionId: string,\n deliver: () => void | CapxulResult<void> | Promise<void | CapxulResult<void>>,\n): Promise<Prepared> {\n let refused: CapxulResult<never> | undefined;\n try {\n const result = await deliver();\n if (result !== undefined && !result.ok) refused = result;\n } catch (cause) {\n refused = { ok: false, error: asCapxulError(cause) };\n }\n return refused === undefined\n ? { ok: true, value: { executionId } }\n : abandonPrepared(deps, executionId, \"prepared_mismatch\", refused);\n}\n\n/** The command a write sends, decoded exactly as its `org(id).permissions` method decodes it. */\nfunction command(write: PermissionWrite): CapxulResult<PermissionCommand> {\n try {\n switch (write.operation) {\n case \"create\":\n return { ok: true, value: buildCommand.create(write) };\n case \"change\":\n return { ok: true, value: buildCommand.change(write) };\n case \"assign\":\n return { ok: true, value: buildCommand.assign(write) };\n case \"revoke\":\n return { ok: true, value: buildCommand.revoke(write) };\n case \"replace\":\n return { ok: true, value: { operation: \"replace\", requestKey: write.requestKey } };\n default:\n return absurd(write);\n }\n } catch (cause) {\n return { ok: false, error: asCapxulError(cause) };\n }\n}\n\nasync function prepareVerifiedPermissionWrite(\n deps: Deps,\n input: PermissionApprovalInput,\n signerAddress: string,\n signal: AbortSignal | undefined,\n): Promise<Prepared> {\n const session = deps.actor?.authSession() ?? null;\n if (session === null || deps.chainId === undefined)\n return { ok: false, error: Errors.notAuthenticated() };\n const built = command(input.permission);\n if (!built.ok) return built;\n const orgId = input.organizationId;\n const expectedSnapshotHash =\n input.permission.operation === \"replace\" ? input.permission.expectedSnapshotHash : undefined;\n const admitted = validateReplacementInput(orgId, built.value, expectedSnapshotHash);\n if (!admitted.ok) return admitted;\n const preparation = {\n orgId,\n command: built.value,\n signerAddress,\n email: session.email,\n chainId: deps.chainId,\n expectedSnapshotHash,\n };\n const prepared = await preparePermission(deps, preparation, signal, undefined);\n if (!prepared.ok) return prepared;\n const executionId = prepared.value.executionId;\n // A command built for another authority is closed unsent, as no approval names it.\n const verified = verifiedPreparation(prepared.value, preparation);\n if (!verified.ok) return abandonPrepared(deps, executionId, \"prepared_mismatch\", verified);\n const { onPrepared } = input;\n return onPrepared === undefined\n ? { ok: true, value: { executionId } }\n : delivered(deps, executionId, () => onPrepared(preparedIdentity(verified.value)));\n}\n\nasync function prepareVerifiedInvitation(\n deps: Deps,\n input: InvitationApprovalInput,\n signerAddress: string,\n signal: AbortSignal | undefined,\n): Promise<Prepared> {\n const session = deps.actor?.authSession() ?? null;\n if (session === null || deps.chainId === undefined)\n return { ok: false, error: Errors.notAuthenticated() };\n const orgId = input.organizationId;\n const authored = await authorInvitation(deps, orgId, input.invite, signal, undefined);\n if (!authored.ok) return authored;\n const view = authored.value;\n // The same request key returned an invitation whose rights are already set\n // up, or that ended: there is nothing left to sign.\n if (view.phase !== \"authorizing\" || view.commandId === null)\n return {\n ok: false,\n error: new CapxulError(\n \"WRONG_STATE\",\n \"The invitation's rights are already set up, or it ended: nothing is left to sign.\",\n {\n details: {\n method: CAPXUL_OPERATIONS.approvals.prepare,\n currentState: view.phase,\n validStates: [\"authorizing\"],\n invitationId: view.id,\n },\n },\n ),\n };\n const preparation = {\n orgId,\n view,\n commandId: view.commandId,\n signerAddress,\n email: session.email,\n chainId: deps.chainId,\n };\n const built = await prepareConfiguration(deps, preparation, signal, undefined);\n if (!built.ok) return built;\n const { executionId, invitationId, commandId } = built.value;\n // A configuration built for another authority is closed unsent, as no approval names it.\n const verified = verifiedConfiguration(built.value, preparation);\n if (!verified.ok) return abandonPrepared(deps, executionId, \"prepared_mismatch\", verified);\n const { onPrepared } = input;\n return onPrepared === undefined\n ? { ok: true, value: { executionId } }\n : delivered(deps, executionId, () => onPrepared({ invitationId, commandId }));\n}\n"],"mappings":";;;AAwEA,SAAgB,gCACd,MACA,OACA,eACA,QACmB;CACnB,OAAO,gBAAgB,QACnB,+BAA+B,MAAM,OAAO,eAAe,MAAM,IACjE,0BAA0B,MAAM,OAAO,eAAe,MAAM;AAClE;;;;;;AAOA,eAAe,UACb,MACA,aACA,SACmB;CACnB,IAAI;CACJ,IAAI;EACF,MAAM,SAAS,MAAM,QAAQ;EAC7B,IAAI,WAAW,KAAA,KAAa,CAAC,OAAO,IAAI,UAAU;CACpD,SAAS,OAAO;EACd,UAAU;GAAE,IAAI;GAAO,OAAO,cAAc,KAAK;EAAE;CACrD;CACA,OAAO,YAAY,KAAA,IACf;EAAE,IAAI;EAAM,OAAO,EAAE,YAAY;CAAE,IACnC,gBAAgB,MAAM,aAAa,qBAAqB,OAAO;AACrE;;AAGA,SAAS,QAAQ,OAAyD;CACxE,IAAI;EACF,QAAQ,MAAM,WAAd;GACE,KAAK,UACH,OAAO;IAAE,IAAI;IAAM,OAAO,aAAa,OAAO,KAAK;GAAE;GACvD,KAAK,UACH,OAAO;IAAE,IAAI;IAAM,OAAO,aAAa,OAAO,KAAK;GAAE;GACvD,KAAK,UACH,OAAO;IAAE,IAAI;IAAM,OAAO,aAAa,OAAO,KAAK;GAAE;GACvD,KAAK,UACH,OAAO;IAAE,IAAI;IAAM,OAAO,aAAa,OAAO,KAAK;GAAE;GACvD,KAAK,WACH,OAAO;IAAE,IAAI;IAAM,OAAO;KAAE,WAAW;KAAW,YAAY,MAAM;IAAW;GAAE;GACnF,SACE,OAAO,OAAO,KAAK;EACvB;CACF,SAAS,OAAO;EACd,OAAO;GAAE,IAAI;GAAO,OAAO,cAAc,KAAK;EAAE;CAClD;AACF;AAEA,eAAe,+BACb,MACA,OACA,eACA,QACmB;CACnB,MAAM,UAAU,KAAK,OAAO,YAAY,KAAK;CAC7C,IAAI,YAAY,QAAQ,KAAK,YAAY,KAAA,GACvC,OAAO;EAAE,IAAI;EAAO,OAAO,OAAO,iBAAiB;CAAE;CACvD,MAAM,QAAQ,QAAQ,MAAM,UAAU;CACtC,IAAI,CAAC,MAAM,IAAI,OAAO;CACtB,MAAM,QAAQ,MAAM;CACpB,MAAM,uBACJ,MAAM,WAAW,cAAc,YAAY,MAAM,WAAW,uBAAuB,KAAA;CACrF,MAAM,WAAW,yBAAyB,OAAO,MAAM,OAAO,oBAAoB;CAClF,IAAI,CAAC,SAAS,IAAI,OAAO;CACzB,MAAM,cAAc;EAClB;EACA,SAAS,MAAM;EACf;EACA,OAAO,QAAQ;EACf,SAAS,KAAK;EACd;CACF;CACA,MAAM,WAAW,MAAM,kBAAkB,MAAM,aAAa,QAAQ,KAAA,CAAS;CAC7E,IAAI,CAAC,SAAS,IAAI,OAAO;CACzB,MAAM,cAAc,SAAS,MAAM;CAEnC,MAAM,WAAW,oBAAoB,SAAS,OAAO,WAAW;CAChE,IAAI,CAAC,SAAS,IAAI,OAAO,gBAAgB,MAAM,aAAa,qBAAqB,QAAQ;CACzF,MAAM,EAAE,eAAe;CACvB,OAAO,eAAe,KAAA,IAClB;EAAE,IAAI;EAAM,OAAO,EAAE,YAAY;CAAE,IACnC,UAAU,MAAM,mBAAmB,WAAW,iBAAiB,SAAS,KAAK,CAAC,CAAC;AACrF;AAEA,eAAe,0BACb,MACA,OACA,eACA,QACmB;CACnB,MAAM,UAAU,KAAK,OAAO,YAAY,KAAK;CAC7C,IAAI,YAAY,QAAQ,KAAK,YAAY,KAAA,GACvC,OAAO;EAAE,IAAI;EAAO,OAAO,OAAO,iBAAiB;CAAE;CACvD,MAAM,QAAQ,MAAM;CACpB,MAAM,WAAW,MAAM,iBAAiB,MAAM,OAAO,MAAM,QAAQ,QAAQ,KAAA,CAAS;CACpF,IAAI,CAAC,SAAS,IAAI,OAAO;CACzB,MAAM,OAAO,SAAS;CAGtB,IAAI,KAAK,UAAU,iBAAiB,KAAK,cAAc,MACrD,OAAO;EACL,IAAI;EACJ,OAAO,IAAI,YACT,eACA,qFACA,EACE,SAAS;GACP,QAAQ,kBAAkB,UAAU;GACpC,cAAc,KAAK;GACnB,aAAa,CAAC,aAAa;GAC3B,cAAc,KAAK;EACrB,EACF,CACF;CACF;CACF,MAAM,cAAc;EAClB;EACA;EACA,WAAW,KAAK;EAChB;EACA,OAAO,QAAQ;EACf,SAAS,KAAK;CAChB;CACA,MAAM,QAAQ,MAAM,qBAAqB,MAAM,aAAa,QAAQ,KAAA,CAAS;CAC7E,IAAI,CAAC,MAAM,IAAI,OAAO;CACtB,MAAM,EAAE,aAAa,cAAc,cAAc,MAAM;CAEvD,MAAM,WAAW,sBAAsB,MAAM,OAAO,WAAW;CAC/D,IAAI,CAAC,SAAS,IAAI,OAAO,gBAAgB,MAAM,aAAa,qBAAqB,QAAQ;CACzF,MAAM,EAAE,eAAe;CACvB,OAAO,eAAe,KAAA,IAClB;EAAE,IAAI;EAAM,OAAO,EAAE,YAAY;CAAE,IACnC,UAAU,MAAM,mBAAmB,WAAW;EAAE;EAAc;CAAU,CAAC,CAAC;AAChF"}
|