@shipfox/api-workflows-dto 2.0.0 → 6.0.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.
@@ -1,2 +1,2 @@
1
1
  $ shipfox-swc
2
- Successfully compiled: 13 files with swc (44.11ms)
2
+ Successfully compiled: 14 files with swc (475.24ms)
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @shipfox/api-workflows-dto
2
2
 
3
+ ## 6.0.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 23563de: Moves Triggers to the injected Workflows inter-module contract with stable run idempotency and listener delivery commands.
8
+ - 23a4dc2: Moves Logs and Integrations to injected Workflows inter-module clients with minimal log and leased agent-tool queries.
9
+
10
+ ### Patch Changes
11
+
12
+ - Updated dependencies [0bb82a4]
13
+ - Updated dependencies [81f9544]
14
+ - @shipfox/api-agent-dto@6.0.0
15
+ - @shipfox/inter-module@0.2.0
16
+
17
+ ## 5.0.0
18
+
19
+ ### Patch Changes
20
+
21
+ - bb037af: Resolves workspace packages from source during development while published consumers continue to use compiled output.
22
+
3
23
  ## 2.0.0
4
24
 
5
25
  ### Minor Changes
@@ -0,0 +1,154 @@
1
+ import { type InterModuleClient } from '@shipfox/inter-module';
2
+ import { z } from 'zod';
3
+ /**
4
+ * Producer-owned Workflows commands used by synchronous callers. Commands carry
5
+ * stable identities whenever a retry could create a duplicate run.
6
+ */
7
+ export declare const workflowsInterModuleContract: import("@shipfox/inter-module").InterModuleContract<{
8
+ readonly module: "workflows";
9
+ readonly methods: {
10
+ readonly startRunFromTrigger: {
11
+ readonly input: z.ZodObject<{
12
+ workspaceId: z.ZodString;
13
+ projectId: z.ZodString;
14
+ definitionId: z.ZodString;
15
+ triggerPayload: z.ZodUnion<readonly [z.ZodObject<{
16
+ provider: z.ZodOptional<z.ZodLiteral<"manual">>;
17
+ source: z.ZodLiteral<"manual">;
18
+ event: z.ZodLiteral<"fire">;
19
+ subscriptionId: z.ZodString;
20
+ userId: z.ZodString;
21
+ }, z.core.$strip>, z.ZodObject<{
22
+ provider: z.ZodOptional<z.ZodLiteral<"cron">>;
23
+ source: z.ZodLiteral<"cron">;
24
+ event: z.ZodLiteral<"tick">;
25
+ scheduleId: z.ZodString;
26
+ }, z.core.$strip>, z.ZodObject<{
27
+ provider: z.ZodString;
28
+ source: z.ZodString;
29
+ event: z.ZodString;
30
+ deliveryId: z.ZodString;
31
+ data: z.ZodUnknown;
32
+ }, z.core.$strip>]>;
33
+ inputs: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
34
+ idempotencyKey: z.ZodString;
35
+ }, z.core.$strip>;
36
+ readonly output: z.ZodObject<{
37
+ id: z.ZodString;
38
+ name: z.ZodString;
39
+ }, z.core.$strip>;
40
+ readonly errors: {
41
+ readonly 'definition-not-found': z.ZodObject<{
42
+ definitionId: z.ZodString;
43
+ }, z.core.$strip>;
44
+ readonly 'project-mismatch': z.ZodObject<{}, z.core.$strip>;
45
+ readonly 'agent-config-unresolvable': z.ZodObject<{
46
+ definitionId: z.ZodString;
47
+ }, z.core.$strip>;
48
+ readonly 'agent-integration-materialization-failed': z.ZodObject<{}, z.core.$strip>;
49
+ readonly 'interpolation-unresolvable': z.ZodObject<{
50
+ definitionId: z.ZodString;
51
+ field: z.ZodEnum<{
52
+ run: "run";
53
+ env: "env";
54
+ "agent.prompt": "agent.prompt";
55
+ "agent.model": "agent.model";
56
+ "agent.provider": "agent.provider";
57
+ "job.runner": "job.runner";
58
+ "job.outputs": "job.outputs";
59
+ "job.name": "job.name";
60
+ "step.name": "step.name";
61
+ "step.feedback": "step.feedback";
62
+ }>;
63
+ source: z.ZodString;
64
+ envKey: z.ZodOptional<z.ZodString>;
65
+ }, z.core.$strip>;
66
+ readonly 'invalid-job-runner-labels': z.ZodObject<{
67
+ labels: z.ZodArray<z.ZodString>;
68
+ }, z.core.$strip>;
69
+ };
70
+ };
71
+ readonly deliverEventToJobListener: {
72
+ readonly input: z.ZodObject<{
73
+ jobId: z.ZodString;
74
+ disposition: z.ZodEnum<{
75
+ fire: "fire";
76
+ resolve: "resolve";
77
+ }>;
78
+ eventRef: z.ZodString;
79
+ deliveryId: z.ZodString;
80
+ source: z.ZodString;
81
+ event: z.ZodString;
82
+ provider: z.ZodString;
83
+ payload: z.ZodUnknown;
84
+ receivedAt: z.ZodString;
85
+ }, z.core.$strip>;
86
+ readonly output: z.ZodObject<{
87
+ buffered: z.ZodBoolean;
88
+ skipped: z.ZodBoolean;
89
+ }, z.core.$strip>;
90
+ };
91
+ readonly getStepLogContext: {
92
+ readonly input: z.ZodObject<{
93
+ stepId: z.ZodString;
94
+ }, z.core.$strip>;
95
+ readonly output: z.ZodObject<{
96
+ harness: z.ZodEnum<{
97
+ pi: "pi";
98
+ claude: "claude";
99
+ }>;
100
+ }, z.core.$strip>;
101
+ };
102
+ readonly getLeasedAgentToolContext: {
103
+ readonly input: z.ZodObject<{
104
+ jobId: z.ZodString;
105
+ jobExecutionId: z.ZodString;
106
+ runnerSessionId: z.ZodString;
107
+ stepId: z.ZodString;
108
+ attempt: z.ZodNumber;
109
+ }, z.core.$strip>;
110
+ readonly output: z.ZodObject<{
111
+ workspaceId: z.ZodString;
112
+ integrations: z.ZodArray<z.ZodObject<{
113
+ connectionId: z.ZodString;
114
+ connectionSlug: z.ZodString;
115
+ provider: z.ZodString;
116
+ requiredScope: z.ZodArray<z.ZodUnknown>;
117
+ tools: z.ZodArray<z.ZodObject<{
118
+ id: z.ZodString;
119
+ sensitivity: z.ZodEnum<{
120
+ read: "read";
121
+ write: "write";
122
+ }>;
123
+ sensitive: z.ZodBoolean;
124
+ requiredScope: z.ZodArray<z.ZodUnknown>;
125
+ inputSchema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
126
+ outputSchema: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
127
+ methods: z.ZodOptional<z.ZodArray<z.ZodObject<{
128
+ id: z.ZodString;
129
+ token: z.ZodString;
130
+ description: z.ZodOptional<z.ZodString>;
131
+ sensitivity: z.ZodEnum<{
132
+ read: "read";
133
+ write: "write";
134
+ }>;
135
+ sensitive: z.ZodBoolean;
136
+ requiredScope: z.ZodArray<z.ZodUnknown>;
137
+ }, z.core.$strict>>>;
138
+ }, z.core.$strict>>;
139
+ }, z.core.$strict>>;
140
+ }, z.core.$strip>;
141
+ readonly errors: {
142
+ readonly 'lease-not-active': z.ZodObject<{}, z.core.$strip>;
143
+ readonly 'step-not-found': z.ZodObject<{}, z.core.$strip>;
144
+ readonly 'job-not-found': z.ZodObject<{}, z.core.$strip>;
145
+ readonly 'step-attempt-mismatch': z.ZodObject<{}, z.core.$strip>;
146
+ readonly 'step-not-running': z.ZodObject<{}, z.core.$strip>;
147
+ readonly 'leased-step-not-agent': z.ZodObject<{}, z.core.$strip>;
148
+ readonly 'agent-step-config-invalid': z.ZodObject<{}, z.core.$strip>;
149
+ };
150
+ };
151
+ };
152
+ }>;
153
+ export type WorkflowsModuleClient = InterModuleClient<typeof workflowsInterModuleContract>;
154
+ //# sourceMappingURL=inter-module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inter-module.d.ts","sourceRoot":"","sources":["../src/inter-module.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,KAAK,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAuCtB;;;GAGG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoEvC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,OAAO,4BAA4B,CAAC,CAAC"}
@@ -0,0 +1,131 @@
1
+ import { harnessSchema, materializedAgentIntegrationSchema } from '@shipfox/api-agent-dto';
2
+ import { defineInterModuleContract } from '@shipfox/inter-module';
3
+ import { z } from 'zod';
4
+ const idSchema = z.string().uuid();
5
+ const triggerPayloadSchema = z.union([
6
+ z.object({
7
+ provider: z.literal('manual').optional(),
8
+ source: z.literal('manual'),
9
+ event: z.literal('fire'),
10
+ subscriptionId: idSchema,
11
+ userId: idSchema
12
+ }),
13
+ z.object({
14
+ provider: z.literal('cron').optional(),
15
+ source: z.literal('cron'),
16
+ event: z.literal('tick'),
17
+ scheduleId: idSchema
18
+ }),
19
+ z.object({
20
+ provider: z.string(),
21
+ source: z.string(),
22
+ event: z.string(),
23
+ deliveryId: z.string(),
24
+ data: z.unknown()
25
+ })
26
+ ]);
27
+ const interpolationFieldSchema = z.enum([
28
+ 'run',
29
+ 'env',
30
+ 'agent.prompt',
31
+ 'agent.model',
32
+ 'agent.provider',
33
+ 'job.runner',
34
+ 'job.outputs',
35
+ 'job.name',
36
+ 'step.name',
37
+ 'step.feedback'
38
+ ]);
39
+ /**
40
+ * Producer-owned Workflows commands used by synchronous callers. Commands carry
41
+ * stable identities whenever a retry could create a duplicate run.
42
+ */ export const workflowsInterModuleContract = defineInterModuleContract({
43
+ module: 'workflows',
44
+ methods: {
45
+ startRunFromTrigger: {
46
+ input: z.object({
47
+ workspaceId: idSchema,
48
+ projectId: idSchema,
49
+ definitionId: idSchema,
50
+ triggerPayload: triggerPayloadSchema,
51
+ inputs: z.record(z.string(), z.unknown()).optional(),
52
+ idempotencyKey: z.string().min(1)
53
+ }),
54
+ output: z.object({
55
+ id: idSchema,
56
+ name: z.string()
57
+ }),
58
+ errors: {
59
+ 'definition-not-found': z.object({
60
+ definitionId: idSchema
61
+ }),
62
+ 'project-mismatch': z.object({}),
63
+ 'agent-config-unresolvable': z.object({
64
+ definitionId: idSchema
65
+ }),
66
+ 'agent-integration-materialization-failed': z.object({}),
67
+ 'interpolation-unresolvable': z.object({
68
+ definitionId: idSchema,
69
+ field: interpolationFieldSchema,
70
+ source: z.string(),
71
+ envKey: z.string().optional()
72
+ }),
73
+ 'invalid-job-runner-labels': z.object({
74
+ labels: z.array(z.string())
75
+ })
76
+ }
77
+ },
78
+ deliverEventToJobListener: {
79
+ input: z.object({
80
+ jobId: idSchema,
81
+ disposition: z.enum([
82
+ 'fire',
83
+ 'resolve'
84
+ ]),
85
+ eventRef: z.string().min(1),
86
+ deliveryId: z.string().min(1),
87
+ source: z.string().min(1),
88
+ event: z.string().min(1),
89
+ provider: z.string().min(1),
90
+ payload: z.unknown(),
91
+ receivedAt: z.string().datetime()
92
+ }),
93
+ output: z.object({
94
+ buffered: z.boolean(),
95
+ skipped: z.boolean()
96
+ })
97
+ },
98
+ getStepLogContext: {
99
+ input: z.object({
100
+ stepId: idSchema
101
+ }),
102
+ output: z.object({
103
+ harness: harnessSchema
104
+ })
105
+ },
106
+ getLeasedAgentToolContext: {
107
+ input: z.object({
108
+ jobId: idSchema,
109
+ jobExecutionId: idSchema,
110
+ runnerSessionId: idSchema,
111
+ stepId: idSchema,
112
+ attempt: z.number().int().positive()
113
+ }),
114
+ output: z.object({
115
+ workspaceId: idSchema,
116
+ integrations: z.array(materializedAgentIntegrationSchema)
117
+ }),
118
+ errors: {
119
+ 'lease-not-active': z.object({}),
120
+ 'step-not-found': z.object({}),
121
+ 'job-not-found': z.object({}),
122
+ 'step-attempt-mismatch': z.object({}),
123
+ 'step-not-running': z.object({}),
124
+ 'leased-step-not-agent': z.object({}),
125
+ 'agent-step-config-invalid': z.object({})
126
+ }
127
+ }
128
+ }
129
+ });
130
+
131
+ //# sourceMappingURL=inter-module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/inter-module.ts"],"sourcesContent":["import {harnessSchema, materializedAgentIntegrationSchema} from '@shipfox/api-agent-dto';\nimport {defineInterModuleContract, type InterModuleClient} from '@shipfox/inter-module';\nimport {z} from 'zod';\n\nconst idSchema = z.string().uuid();\nconst triggerPayloadSchema = z.union([\n z.object({\n provider: z.literal('manual').optional(),\n source: z.literal('manual'),\n event: z.literal('fire'),\n subscriptionId: idSchema,\n userId: idSchema,\n }),\n z.object({\n provider: z.literal('cron').optional(),\n source: z.literal('cron'),\n event: z.literal('tick'),\n scheduleId: idSchema,\n }),\n z.object({\n provider: z.string(),\n source: z.string(),\n event: z.string(),\n deliveryId: z.string(),\n data: z.unknown(),\n }),\n]);\n\nconst interpolationFieldSchema = z.enum([\n 'run',\n 'env',\n 'agent.prompt',\n 'agent.model',\n 'agent.provider',\n 'job.runner',\n 'job.outputs',\n 'job.name',\n 'step.name',\n 'step.feedback',\n]);\n\n/**\n * Producer-owned Workflows commands used by synchronous callers. Commands carry\n * stable identities whenever a retry could create a duplicate run.\n */\nexport const workflowsInterModuleContract = defineInterModuleContract({\n module: 'workflows',\n methods: {\n startRunFromTrigger: {\n input: z.object({\n workspaceId: idSchema,\n projectId: idSchema,\n definitionId: idSchema,\n triggerPayload: triggerPayloadSchema,\n inputs: z.record(z.string(), z.unknown()).optional(),\n idempotencyKey: z.string().min(1),\n }),\n output: z.object({id: idSchema, name: z.string()}),\n errors: {\n 'definition-not-found': z.object({definitionId: idSchema}),\n 'project-mismatch': z.object({}),\n 'agent-config-unresolvable': z.object({definitionId: idSchema}),\n 'agent-integration-materialization-failed': z.object({}),\n 'interpolation-unresolvable': z.object({\n definitionId: idSchema,\n field: interpolationFieldSchema,\n source: z.string(),\n envKey: z.string().optional(),\n }),\n 'invalid-job-runner-labels': z.object({labels: z.array(z.string())}),\n },\n },\n deliverEventToJobListener: {\n input: z.object({\n jobId: idSchema,\n disposition: z.enum(['fire', 'resolve']),\n eventRef: z.string().min(1),\n deliveryId: z.string().min(1),\n source: z.string().min(1),\n event: z.string().min(1),\n provider: z.string().min(1),\n payload: z.unknown(),\n receivedAt: z.string().datetime(),\n }),\n output: z.object({buffered: z.boolean(), skipped: z.boolean()}),\n },\n getStepLogContext: {\n input: z.object({stepId: idSchema}),\n output: z.object({harness: harnessSchema}),\n },\n getLeasedAgentToolContext: {\n input: z.object({\n jobId: idSchema,\n jobExecutionId: idSchema,\n runnerSessionId: idSchema,\n stepId: idSchema,\n attempt: z.number().int().positive(),\n }),\n output: z.object({\n workspaceId: idSchema,\n integrations: z.array(materializedAgentIntegrationSchema),\n }),\n errors: {\n 'lease-not-active': z.object({}),\n 'step-not-found': z.object({}),\n 'job-not-found': z.object({}),\n 'step-attempt-mismatch': z.object({}),\n 'step-not-running': z.object({}),\n 'leased-step-not-agent': z.object({}),\n 'agent-step-config-invalid': z.object({}),\n },\n },\n },\n});\n\nexport type WorkflowsModuleClient = InterModuleClient<typeof workflowsInterModuleContract>;\n"],"names":["harnessSchema","materializedAgentIntegrationSchema","defineInterModuleContract","z","idSchema","string","uuid","triggerPayloadSchema","union","object","provider","literal","optional","source","event","subscriptionId","userId","scheduleId","deliveryId","data","unknown","interpolationFieldSchema","enum","workflowsInterModuleContract","module","methods","startRunFromTrigger","input","workspaceId","projectId","definitionId","triggerPayload","inputs","record","idempotencyKey","min","output","id","name","errors","field","envKey","labels","array","deliverEventToJobListener","jobId","disposition","eventRef","payload","receivedAt","datetime","buffered","boolean","skipped","getStepLogContext","stepId","harness","getLeasedAgentToolContext","jobExecutionId","runnerSessionId","attempt","number","int","positive","integrations"],"mappings":"AAAA,SAAQA,aAAa,EAAEC,kCAAkC,QAAO,yBAAyB;AACzF,SAAQC,yBAAyB,QAA+B,wBAAwB;AACxF,SAAQC,CAAC,QAAO,MAAM;AAEtB,MAAMC,WAAWD,EAAEE,MAAM,GAAGC,IAAI;AAChC,MAAMC,uBAAuBJ,EAAEK,KAAK,CAAC;IACnCL,EAAEM,MAAM,CAAC;QACPC,UAAUP,EAAEQ,OAAO,CAAC,UAAUC,QAAQ;QACtCC,QAAQV,EAAEQ,OAAO,CAAC;QAClBG,OAAOX,EAAEQ,OAAO,CAAC;QACjBI,gBAAgBX;QAChBY,QAAQZ;IACV;IACAD,EAAEM,MAAM,CAAC;QACPC,UAAUP,EAAEQ,OAAO,CAAC,QAAQC,QAAQ;QACpCC,QAAQV,EAAEQ,OAAO,CAAC;QAClBG,OAAOX,EAAEQ,OAAO,CAAC;QACjBM,YAAYb;IACd;IACAD,EAAEM,MAAM,CAAC;QACPC,UAAUP,EAAEE,MAAM;QAClBQ,QAAQV,EAAEE,MAAM;QAChBS,OAAOX,EAAEE,MAAM;QACfa,YAAYf,EAAEE,MAAM;QACpBc,MAAMhB,EAAEiB,OAAO;IACjB;CACD;AAED,MAAMC,2BAA2BlB,EAAEmB,IAAI,CAAC;IACtC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAED;;;CAGC,GACD,OAAO,MAAMC,+BAA+BrB,0BAA0B;IACpEsB,QAAQ;IACRC,SAAS;QACPC,qBAAqB;YACnBC,OAAOxB,EAAEM,MAAM,CAAC;gBACdmB,aAAaxB;gBACbyB,WAAWzB;gBACX0B,cAAc1B;gBACd2B,gBAAgBxB;gBAChByB,QAAQ7B,EAAE8B,MAAM,CAAC9B,EAAEE,MAAM,IAAIF,EAAEiB,OAAO,IAAIR,QAAQ;gBAClDsB,gBAAgB/B,EAAEE,MAAM,GAAG8B,GAAG,CAAC;YACjC;YACAC,QAAQjC,EAAEM,MAAM,CAAC;gBAAC4B,IAAIjC;gBAAUkC,MAAMnC,EAAEE,MAAM;YAAE;YAChDkC,QAAQ;gBACN,wBAAwBpC,EAAEM,MAAM,CAAC;oBAACqB,cAAc1B;gBAAQ;gBACxD,oBAAoBD,EAAEM,MAAM,CAAC,CAAC;gBAC9B,6BAA6BN,EAAEM,MAAM,CAAC;oBAACqB,cAAc1B;gBAAQ;gBAC7D,4CAA4CD,EAAEM,MAAM,CAAC,CAAC;gBACtD,8BAA8BN,EAAEM,MAAM,CAAC;oBACrCqB,cAAc1B;oBACdoC,OAAOnB;oBACPR,QAAQV,EAAEE,MAAM;oBAChBoC,QAAQtC,EAAEE,MAAM,GAAGO,QAAQ;gBAC7B;gBACA,6BAA6BT,EAAEM,MAAM,CAAC;oBAACiC,QAAQvC,EAAEwC,KAAK,CAACxC,EAAEE,MAAM;gBAAG;YACpE;QACF;QACAuC,2BAA2B;YACzBjB,OAAOxB,EAAEM,MAAM,CAAC;gBACdoC,OAAOzC;gBACP0C,aAAa3C,EAAEmB,IAAI,CAAC;oBAAC;oBAAQ;iBAAU;gBACvCyB,UAAU5C,EAAEE,MAAM,GAAG8B,GAAG,CAAC;gBACzBjB,YAAYf,EAAEE,MAAM,GAAG8B,GAAG,CAAC;gBAC3BtB,QAAQV,EAAEE,MAAM,GAAG8B,GAAG,CAAC;gBACvBrB,OAAOX,EAAEE,MAAM,GAAG8B,GAAG,CAAC;gBACtBzB,UAAUP,EAAEE,MAAM,GAAG8B,GAAG,CAAC;gBACzBa,SAAS7C,EAAEiB,OAAO;gBAClB6B,YAAY9C,EAAEE,MAAM,GAAG6C,QAAQ;YACjC;YACAd,QAAQjC,EAAEM,MAAM,CAAC;gBAAC0C,UAAUhD,EAAEiD,OAAO;gBAAIC,SAASlD,EAAEiD,OAAO;YAAE;QAC/D;QACAE,mBAAmB;YACjB3B,OAAOxB,EAAEM,MAAM,CAAC;gBAAC8C,QAAQnD;YAAQ;YACjCgC,QAAQjC,EAAEM,MAAM,CAAC;gBAAC+C,SAASxD;YAAa;QAC1C;QACAyD,2BAA2B;YACzB9B,OAAOxB,EAAEM,MAAM,CAAC;gBACdoC,OAAOzC;gBACPsD,gBAAgBtD;gBAChBuD,iBAAiBvD;gBACjBmD,QAAQnD;gBACRwD,SAASzD,EAAE0D,MAAM,GAAGC,GAAG,GAAGC,QAAQ;YACpC;YACA3B,QAAQjC,EAAEM,MAAM,CAAC;gBACfmB,aAAaxB;gBACb4D,cAAc7D,EAAEwC,KAAK,CAAC1C;YACxB;YACAsC,QAAQ;gBACN,oBAAoBpC,EAAEM,MAAM,CAAC,CAAC;gBAC9B,kBAAkBN,EAAEM,MAAM,CAAC,CAAC;gBAC5B,iBAAiBN,EAAEM,MAAM,CAAC,CAAC;gBAC3B,yBAAyBN,EAAEM,MAAM,CAAC,CAAC;gBACnC,oBAAoBN,EAAEM,MAAM,CAAC,CAAC;gBAC9B,yBAAyBN,EAAEM,MAAM,CAAC,CAAC;gBACnC,6BAA6BN,EAAEM,MAAM,CAAC,CAAC;YACzC;QACF;IACF;AACF,GAAG"}