@dbos-inc/dbos-sdk 3.0.20-preview → 3.0.27-preview
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/dist/src/authdecorators.d.ts +0 -7
- package/dist/src/authdecorators.d.ts.map +1 -1
- package/dist/src/authdecorators.js +1 -29
- package/dist/src/authdecorators.js.map +1 -1
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/client.js.map +1 -1
- package/dist/src/conductor/conductor.d.ts.map +1 -1
- package/dist/src/conductor/conductor.js +3 -0
- package/dist/src/conductor/conductor.js.map +1 -1
- package/dist/src/conductor/protocol.d.ts +3 -0
- package/dist/src/conductor/protocol.d.ts.map +1 -1
- package/dist/src/conductor/protocol.js.map +1 -1
- package/dist/src/context.d.ts +10 -44
- package/dist/src/context.d.ts.map +1 -1
- package/dist/src/context.js +34 -114
- package/dist/src/context.js.map +1 -1
- package/dist/src/datasource.d.ts.map +1 -1
- package/dist/src/datasource.js +37 -17
- package/dist/src/datasource.js.map +1 -1
- package/dist/src/dbos-executor.d.ts +32 -37
- package/dist/src/dbos-executor.d.ts.map +1 -1
- package/dist/src/dbos-executor.js +263 -267
- package/dist/src/dbos-executor.js.map +1 -1
- package/dist/src/dbos-runtime/cli.d.ts.map +1 -1
- package/dist/src/dbos-runtime/cli.js +1 -3
- package/dist/src/dbos-runtime/cli.js.map +1 -1
- package/dist/src/dbos-runtime/debug.d.ts +1 -1
- package/dist/src/dbos-runtime/debug.d.ts.map +1 -1
- package/dist/src/dbos-runtime/debug.js +2 -3
- package/dist/src/dbos-runtime/debug.js.map +1 -1
- package/dist/src/dbos.d.ts +6 -21
- package/dist/src/dbos.d.ts.map +1 -1
- package/dist/src/dbos.js +98 -268
- package/dist/src/dbos.js.map +1 -1
- package/dist/src/decorators.d.ts +7 -7
- package/dist/src/decorators.d.ts.map +1 -1
- package/dist/src/decorators.js +6 -30
- package/dist/src/decorators.js.map +1 -1
- package/dist/src/eventreceiver.d.ts +7 -10
- package/dist/src/eventreceiver.d.ts.map +1 -1
- package/dist/src/httpServer/handler.d.ts +1 -9
- package/dist/src/httpServer/handler.d.ts.map +1 -1
- package/dist/src/httpServer/handler.js.map +1 -1
- package/dist/src/httpServer/middleware.d.ts +2 -2
- package/dist/src/httpServer/middleware.d.ts.map +1 -1
- package/dist/src/httpServer/server.d.ts +3 -3
- package/dist/src/httpServer/server.d.ts.map +1 -1
- package/dist/src/httpServer/server.js +22 -21
- package/dist/src/httpServer/server.js.map +1 -1
- package/dist/src/index.d.ts +3 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +7 -13
- package/dist/src/index.js.map +1 -1
- package/dist/src/paramdecorators.d.ts.map +1 -1
- package/dist/src/paramdecorators.js +0 -6
- package/dist/src/paramdecorators.js.map +1 -1
- package/dist/src/procedure.d.ts +0 -22
- package/dist/src/procedure.d.ts.map +1 -1
- package/dist/src/procedure.js +0 -16
- package/dist/src/procedure.js.map +1 -1
- package/dist/src/scheduler/scheduler.d.ts.map +1 -1
- package/dist/src/scheduler/scheduler.js.map +1 -1
- package/dist/src/step.d.ts +0 -25
- package/dist/src/step.d.ts.map +1 -1
- package/dist/src/step.js +0 -20
- package/dist/src/step.js.map +1 -1
- package/dist/src/system_database.d.ts +5 -5
- package/dist/src/system_database.d.ts.map +1 -1
- package/dist/src/system_database.js +56 -3
- package/dist/src/system_database.js.map +1 -1
- package/dist/src/telemetry/logs.d.ts +4 -8
- package/dist/src/telemetry/logs.d.ts.map +1 -1
- package/dist/src/telemetry/logs.js +25 -13
- package/dist/src/telemetry/logs.js.map +1 -1
- package/dist/src/transaction.d.ts +0 -25
- package/dist/src/transaction.d.ts.map +1 -1
- package/dist/src/transaction.js +1 -15
- package/dist/src/transaction.js.map +1 -1
- package/dist/src/user_database.d.ts +2 -2
- package/dist/src/user_database.d.ts.map +1 -1
- package/dist/src/user_database.js.map +1 -1
- package/dist/src/workflow.d.ts +7 -148
- package/dist/src/workflow.d.ts.map +1 -1
- package/dist/src/workflow.js +7 -226
- package/dist/src/workflow.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
package/dist/src/workflow.js
CHANGED
@@ -1,10 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.RetrievedHandle = exports.InvokedHandle = exports.
|
4
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
5
|
-
const dbos_executor_1 = require("./dbos-executor");
|
6
|
-
const context_1 = require("./context");
|
7
|
-
const decorators_1 = require("./decorators");
|
3
|
+
exports.RetrievedHandle = exports.InvokedHandle = exports.StatusString = void 0;
|
8
4
|
const utils_1 = require("./utils");
|
9
5
|
const dbos_1 = require("./dbos");
|
10
6
|
/** Enumeration of values for workflow status */
|
@@ -22,221 +18,6 @@ exports.StatusString = {
|
|
22
18
|
/** Workflow is on a `WorkflowQueue` and has not yet started */
|
23
19
|
ENQUEUED: 'ENQUEUED',
|
24
20
|
};
|
25
|
-
class WorkflowContextImpl extends context_1.DBOSContextImpl {
|
26
|
-
workflowConfig;
|
27
|
-
presetUUID;
|
28
|
-
timeoutMS;
|
29
|
-
deadlineEpochMS;
|
30
|
-
tempWfOperationType;
|
31
|
-
tempWfOperationName;
|
32
|
-
functionID = 0;
|
33
|
-
#dbosExec;
|
34
|
-
isTempWorkflow;
|
35
|
-
maxRecoveryAttempts;
|
36
|
-
constructor(dbosExec, parentCtx, workflowUUID, workflowConfig, workflowName, presetUUID, timeoutMS, deadlineEpochMS, tempWfOperationType = '', // "transaction", "procedure", "external", or "send"
|
37
|
-
tempWfOperationName = '') {
|
38
|
-
const span = dbosExec.tracer.startSpan(workflowName, {
|
39
|
-
status: exports.StatusString.PENDING,
|
40
|
-
operationUUID: workflowUUID,
|
41
|
-
operationType: dbos_executor_1.OperationType.WORKFLOW,
|
42
|
-
authenticatedUser: parentCtx?.authenticatedUser ?? '',
|
43
|
-
authenticatedRoles: parentCtx?.authenticatedRoles ?? [],
|
44
|
-
assumedRole: parentCtx?.assumedRole ?? '',
|
45
|
-
}, parentCtx?.span);
|
46
|
-
super(workflowName, span, dbosExec.logger, parentCtx);
|
47
|
-
this.workflowConfig = workflowConfig;
|
48
|
-
this.presetUUID = presetUUID;
|
49
|
-
this.timeoutMS = timeoutMS;
|
50
|
-
this.deadlineEpochMS = deadlineEpochMS;
|
51
|
-
this.tempWfOperationType = tempWfOperationType;
|
52
|
-
this.tempWfOperationName = tempWfOperationName;
|
53
|
-
this.workflowUUID = workflowUUID;
|
54
|
-
this.#dbosExec = dbosExec;
|
55
|
-
this.isTempWorkflow = dbos_executor_1.DBOSExecutor.tempWorkflowName === workflowName;
|
56
|
-
this.applicationConfig = dbosExec.config.application;
|
57
|
-
this.maxRecoveryAttempts = workflowConfig.maxRecoveryAttempts ? workflowConfig.maxRecoveryAttempts : 50;
|
58
|
-
}
|
59
|
-
functionIDGetIncrement() {
|
60
|
-
return this.functionID++;
|
61
|
-
}
|
62
|
-
/**
|
63
|
-
* Invoke another workflow as its child workflow and return a workflow handle.
|
64
|
-
* The child workflow is guaranteed to be executed exactly once, even if the workflow is retried with the same UUID.
|
65
|
-
* We pass in itself as a parent context and assign the child workflow with a deterministic UUID "this.workflowUUID-functionID".
|
66
|
-
* We also pass in its own workflowUUID and function ID so the invoked handle is deterministic.
|
67
|
-
*/
|
68
|
-
async startChildWorkflow(wf, ...args) {
|
69
|
-
// Note: cannot use invoke for childWorkflow because of potential recursive types on the workflow itself.
|
70
|
-
const funcId = this.functionIDGetIncrement();
|
71
|
-
const childUUID = this.workflowUUID + '-' + funcId;
|
72
|
-
return this.#dbosExec.internalWorkflow(wf, {
|
73
|
-
parentCtx: this,
|
74
|
-
workflowUUID: childUUID,
|
75
|
-
}, this.workflowUUID, funcId, ...args);
|
76
|
-
}
|
77
|
-
async invokeChildWorkflow(wf, ...args) {
|
78
|
-
return this.startChildWorkflow(wf, ...args).then((handle) => handle.getResult());
|
79
|
-
}
|
80
|
-
/**
|
81
|
-
* Generate a proxy object for the provided class that wraps direct calls (i.e. OpClass.someMethod(param))
|
82
|
-
* to use WorkflowContext.Transaction(OpClass.someMethod, param);
|
83
|
-
*/
|
84
|
-
proxyInvokeWF(object, workflowUUID, asyncWf, configuredInstance, queue) {
|
85
|
-
const ops = (0, decorators_1.getRegisteredOperations)(object);
|
86
|
-
const proxy = {};
|
87
|
-
const funcId = this.functionIDGetIncrement();
|
88
|
-
const childUUID = workflowUUID || this.workflowUUID + '-' + funcId;
|
89
|
-
const params = { workflowUUID: childUUID, parentCtx: this, configuredInstance, queueName: queue?.name };
|
90
|
-
for (const op of ops) {
|
91
|
-
if (asyncWf) {
|
92
|
-
proxy[op.name] = op.workflowConfig
|
93
|
-
? (...args) => this.#dbosExec.internalWorkflow(op.registeredFunction, params, this.workflowUUID, funcId, ...args)
|
94
|
-
: undefined;
|
95
|
-
}
|
96
|
-
else {
|
97
|
-
proxy[op.name] = op.workflowConfig
|
98
|
-
? (...args) => this.#dbosExec
|
99
|
-
.internalWorkflow(op.registeredFunction, params, this.workflowUUID, funcId, ...args)
|
100
|
-
.then((handle) => handle.getResult())
|
101
|
-
: undefined;
|
102
|
-
}
|
103
|
-
}
|
104
|
-
return proxy;
|
105
|
-
}
|
106
|
-
startWorkflow(target, workflowUUID, queue) {
|
107
|
-
if (typeof target === 'function') {
|
108
|
-
return this.proxyInvokeWF(target, workflowUUID, true, null, queue);
|
109
|
-
}
|
110
|
-
else {
|
111
|
-
return this.proxyInvokeWF(target, workflowUUID, true, target, queue);
|
112
|
-
}
|
113
|
-
}
|
114
|
-
invokeWorkflow(target, workflowUUID) {
|
115
|
-
if (typeof target === 'function') {
|
116
|
-
return this.proxyInvokeWF(target, workflowUUID, false, null);
|
117
|
-
}
|
118
|
-
else {
|
119
|
-
return this.proxyInvokeWF(target, workflowUUID, false, target);
|
120
|
-
}
|
121
|
-
}
|
122
|
-
async childWorkflow(wf, ...args) {
|
123
|
-
return this.startChildWorkflow(wf, ...args);
|
124
|
-
}
|
125
|
-
// TODO: ConfiguredInstance support
|
126
|
-
async procedure(proc, ...args) {
|
127
|
-
return this.#dbosExec.callProcedureFunction(proc, this, ...args);
|
128
|
-
}
|
129
|
-
/**
|
130
|
-
* Execute a transactional function.
|
131
|
-
* The transaction is guaranteed to execute exactly once, even if the workflow is retried with the same UUID.
|
132
|
-
* If the transaction encounters a Postgres serialization error, retry it.
|
133
|
-
* If it encounters any other error, throw it.
|
134
|
-
*/
|
135
|
-
async transaction(txn, clsinst, ...args) {
|
136
|
-
return this.#dbosExec.callTransactionFunction(txn, clsinst, this, ...args);
|
137
|
-
}
|
138
|
-
/**
|
139
|
-
* Execute a step function.
|
140
|
-
* If it encounters any error, retry according to its configured retry policy until the maximum number of attempts is reached, then throw an DBOSError.
|
141
|
-
* The step may execute many times, but once it is complete, it will not re-execute.
|
142
|
-
*/
|
143
|
-
async external(stepFn, clsInst, ...args) {
|
144
|
-
return this.#dbosExec.callStepFunction(stepFn, undefined, undefined, clsInst, this, ...args);
|
145
|
-
}
|
146
|
-
/**
|
147
|
-
* Send a message to a workflow identified by a UUID.
|
148
|
-
* The message can optionally be tagged with a topic.
|
149
|
-
*/
|
150
|
-
async send(destinationUUID, message, topic) {
|
151
|
-
const functionID = this.functionIDGetIncrement();
|
152
|
-
await this.#dbosExec.systemDatabase.send(this.workflowUUID, functionID, destinationUUID, utils_1.DBOSJSON.stringify(message), topic);
|
153
|
-
}
|
154
|
-
/**
|
155
|
-
* Consume and return the oldest unconsumed message sent to your UUID.
|
156
|
-
* If a topic is specified, retrieve the oldest message tagged with that topic.
|
157
|
-
* Otherwise, retrieve the oldest message with no topic.
|
158
|
-
*/
|
159
|
-
async recv(topic, timeoutSeconds = dbos_executor_1.DBOSExecutor.defaultNotificationTimeoutSec) {
|
160
|
-
const functionID = this.functionIDGetIncrement();
|
161
|
-
const timeoutFunctionID = this.functionIDGetIncrement();
|
162
|
-
return utils_1.DBOSJSON.parse(await this.#dbosExec.systemDatabase.recv(this.workflowUUID, functionID, timeoutFunctionID, topic, timeoutSeconds));
|
163
|
-
}
|
164
|
-
/**
|
165
|
-
* Emit a workflow event, represented as a key-value pair.
|
166
|
-
* Events are immutable once set.
|
167
|
-
*/
|
168
|
-
async setEvent(key, value) {
|
169
|
-
const functionID = this.functionIDGetIncrement();
|
170
|
-
await this.#dbosExec.systemDatabase.setEvent(this.workflowUUID, functionID, key, utils_1.DBOSJSON.stringify(value));
|
171
|
-
}
|
172
|
-
/**
|
173
|
-
* Generate a proxy object for the provided class that wraps direct calls (i.e. OpClass.someMethod(param))
|
174
|
-
* to use WorkflowContext.Transaction(OpClass.someMethod, param);
|
175
|
-
*/
|
176
|
-
invoke(object) {
|
177
|
-
if (typeof object === 'function') {
|
178
|
-
const ops = (0, decorators_1.getRegisteredOperations)(object);
|
179
|
-
const proxy = {};
|
180
|
-
for (const op of ops) {
|
181
|
-
proxy[op.name] = op.txnConfig
|
182
|
-
? (...args) => this.transaction(op.registeredFunction, null, ...args)
|
183
|
-
: op.stepConfig
|
184
|
-
? (...args) => this.external(op.registeredFunction, null, ...args)
|
185
|
-
: op.procConfig
|
186
|
-
? (...args) => this.procedure(op.registeredFunction, ...args)
|
187
|
-
: undefined;
|
188
|
-
}
|
189
|
-
return proxy;
|
190
|
-
}
|
191
|
-
else {
|
192
|
-
const targetInst = object;
|
193
|
-
const ops = (0, decorators_1.getRegisteredOperations)(targetInst);
|
194
|
-
const proxy = {};
|
195
|
-
for (const op of ops) {
|
196
|
-
proxy[op.name] = op.txnConfig
|
197
|
-
? (...args) => this.transaction(op.registeredFunction, targetInst, ...args)
|
198
|
-
: op.stepConfig
|
199
|
-
? (...args) => this.external(op.registeredFunction, targetInst, ...args)
|
200
|
-
: undefined;
|
201
|
-
}
|
202
|
-
return proxy;
|
203
|
-
}
|
204
|
-
}
|
205
|
-
/**
|
206
|
-
* Wait for a workflow to emit an event, then return its value.
|
207
|
-
*/
|
208
|
-
async getEvent(targetUUID, key, timeoutSeconds = dbos_executor_1.DBOSExecutor.defaultNotificationTimeoutSec) {
|
209
|
-
const functionID = this.functionIDGetIncrement();
|
210
|
-
const timeoutFunctionID = this.functionIDGetIncrement();
|
211
|
-
const params = {
|
212
|
-
workflowID: this.workflowUUID,
|
213
|
-
functionID,
|
214
|
-
timeoutFunctionID,
|
215
|
-
};
|
216
|
-
return utils_1.DBOSJSON.parse(await this.#dbosExec.systemDatabase.getEvent(targetUUID, key, timeoutSeconds, params));
|
217
|
-
}
|
218
|
-
/**
|
219
|
-
* Retrieve a handle for a workflow UUID.
|
220
|
-
*/
|
221
|
-
retrieveWorkflow(targetID) {
|
222
|
-
const functionID = this.functionIDGetIncrement();
|
223
|
-
return new RetrievedHandle(this.#dbosExec.systemDatabase, targetID, this.workflowUUID, functionID);
|
224
|
-
}
|
225
|
-
/**
|
226
|
-
* Sleep for the duration.
|
227
|
-
*/
|
228
|
-
async sleepms(durationMS) {
|
229
|
-
if (durationMS <= 0) {
|
230
|
-
return;
|
231
|
-
}
|
232
|
-
const functionID = this.functionIDGetIncrement();
|
233
|
-
await this.#dbosExec.systemDatabase.durableSleepms(this.workflowUUID, functionID, durationMS);
|
234
|
-
}
|
235
|
-
async sleep(durationSec) {
|
236
|
-
return this.sleepms(durationSec * 1000);
|
237
|
-
}
|
238
|
-
}
|
239
|
-
exports.WorkflowContextImpl = WorkflowContextImpl;
|
240
21
|
/**
|
241
22
|
* The handle returned when invoking a workflow with DBOSExecutor.workflow
|
242
23
|
*/
|
@@ -245,15 +26,15 @@ class InvokedHandle {
|
|
245
26
|
workflowPromise;
|
246
27
|
workflowUUID;
|
247
28
|
workflowName;
|
248
|
-
|
29
|
+
callerWFID;
|
249
30
|
callerFunctionID;
|
250
|
-
constructor(systemDatabase, workflowPromise, workflowUUID, workflowName,
|
31
|
+
constructor(systemDatabase, workflowPromise, workflowUUID, workflowName, callerWFID, // This is the call that started the WF
|
251
32
|
callerFunctionID) {
|
252
33
|
this.systemDatabase = systemDatabase;
|
253
34
|
this.workflowPromise = workflowPromise;
|
254
35
|
this.workflowUUID = workflowUUID;
|
255
36
|
this.workflowName = workflowName;
|
256
|
-
this.
|
37
|
+
this.callerWFID = callerWFID;
|
257
38
|
this.callerFunctionID = callerFunctionID;
|
258
39
|
}
|
259
40
|
getWorkflowUUID() {
|
@@ -282,12 +63,12 @@ exports.InvokedHandle = InvokedHandle;
|
|
282
63
|
class RetrievedHandle {
|
283
64
|
systemDatabase;
|
284
65
|
workflowUUID;
|
285
|
-
|
66
|
+
callerWFID;
|
286
67
|
callerFunctionID;
|
287
|
-
constructor(systemDatabase, workflowUUID,
|
68
|
+
constructor(systemDatabase, workflowUUID, callerWFID, callerFunctionID) {
|
288
69
|
this.systemDatabase = systemDatabase;
|
289
70
|
this.workflowUUID = workflowUUID;
|
290
|
-
this.
|
71
|
+
this.callerWFID = callerWFID;
|
291
72
|
this.callerFunctionID = callerFunctionID;
|
292
73
|
}
|
293
74
|
getWorkflowUUID() {
|
package/dist/src/workflow.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/workflow.ts"],"names":[],"mappings":";;;
|
1
|
+
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/workflow.ts"],"names":[],"mappings":";;;AAGA,mCAAmC;AACnC,iCAA+C;AAmG/C,gDAAgD;AACnC,QAAA,YAAY,GAAG;IAC1B,kCAAkC;IAClC,OAAO,EAAE,SAAS;IAClB,0CAA0C;IAC1C,OAAO,EAAE,SAAS;IAClB,0CAA0C;IAC1C,KAAK,EAAE,OAAO;IACd,gGAAgG;IAChG,gBAAgB,EAAE,kBAAkB;IACpC,gDAAgD;IAChD,SAAS,EAAE,WAAW;IACtB,+DAA+D;IAC/D,QAAQ,EAAE,UAAU;CACZ,CAAC;AA+BX;;GAEG;AACH,MAAa,aAAa;IAEb;IACA;IACA;IACA;IACA;IACA;IANX,YACW,cAA8B,EAC9B,eAA2B,EAC3B,YAAoB,EACpB,YAAoB,EACpB,UAAmB,EAAE,uCAAuC;IAC5D,gBAAyB;QALzB,mBAAc,GAAd,cAAc,CAAgB;QAC9B,oBAAe,GAAf,eAAe,CAAY;QAC3B,iBAAY,GAAZ,YAAY,CAAQ;QACpB,iBAAY,GAAZ,YAAY,CAAQ;QACpB,eAAU,GAAV,UAAU,CAAS;QACnB,qBAAgB,GAAhB,gBAAgB,CAAS;IACjC,CAAC;IAEJ,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,MAAM,WAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,MAAM,IAAA,sBAAe,EAC1B,KAAK,IAAI,EAAE;YACT,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC;QACpC,CAAC,EACD,gBAAgB,EAChB,IAAI,CAAC,YAAY,CAClB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAA2B,CAAC;QAC1G,OAAO,gBAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAM,CAAC;IAC3C,CAAC;CACF;AApCD,sCAoCC;AAED;;GAEG;AACH,MAAa,eAAe;IAEf;IACA;IACA;IACA;IAJX,YACW,cAA8B,EAC9B,YAAoB,EACpB,UAAmB,EACnB,gBAAyB;QAHzB,mBAAc,GAAd,cAAc,CAAgB;QAC9B,iBAAY,GAAZ,YAAY,CAAQ;QACpB,eAAU,GAAV,UAAU,CAAS;QACnB,qBAAgB,GAAhB,gBAAgB,CAAS;IACjC,CAAC;IAEJ,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,MAAM,WAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,CAAC,MAAM,WAAI,CAAC,SAAS,CAAI,IAAI,CAAC,YAAY,CAAC,CAAe,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAA2B,CAAC;QAC1G,OAAO,gBAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAM,CAAC;IAC3C,CAAC;CACF;AA5BD,0CA4BC"}
|