@mj-biz-apps/marketing-server 0.0.0 → 0.2.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.
Files changed (87) hide show
  1. package/LICENSE +183 -0
  2. package/dist/agents/BaseMarketingAgent.d.ts +120 -0
  3. package/dist/agents/BaseMarketingAgent.d.ts.map +1 -0
  4. package/dist/agents/BaseMarketingAgent.js +323 -0
  5. package/dist/agents/BaseMarketingAgent.js.map +1 -0
  6. package/dist/agents/MarketingExperimentationAgent.d.ts +123 -0
  7. package/dist/agents/MarketingExperimentationAgent.d.ts.map +1 -0
  8. package/dist/agents/MarketingExperimentationAgent.js +371 -0
  9. package/dist/agents/MarketingExperimentationAgent.js.map +1 -0
  10. package/dist/agents/MarketingOperationsAgent.d.ts +24 -0
  11. package/dist/agents/MarketingOperationsAgent.d.ts.map +1 -0
  12. package/dist/agents/MarketingOperationsAgent.js +36 -0
  13. package/dist/agents/MarketingOperationsAgent.js.map +1 -0
  14. package/dist/agents/MarketingPodcastIngestionAgent.d.ts +21 -0
  15. package/dist/agents/MarketingPodcastIngestionAgent.d.ts.map +1 -0
  16. package/dist/agents/MarketingPodcastIngestionAgent.js +33 -0
  17. package/dist/agents/MarketingPodcastIngestionAgent.js.map +1 -0
  18. package/dist/agents/MarketingStrategyOnboardingAgent.d.ts +206 -0
  19. package/dist/agents/MarketingStrategyOnboardingAgent.d.ts.map +1 -0
  20. package/dist/agents/MarketingStrategyOnboardingAgent.js +1264 -0
  21. package/dist/agents/MarketingStrategyOnboardingAgent.js.map +1 -0
  22. package/dist/agents/index.d.ts +14 -0
  23. package/dist/agents/index.d.ts.map +1 -0
  24. package/dist/agents/index.js +25 -0
  25. package/dist/agents/index.js.map +1 -0
  26. package/dist/config.d.ts +6 -0
  27. package/dist/config.d.ts.map +1 -0
  28. package/dist/config.js +6 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/generated/class-registrations-manifest.d.ts +7 -0
  31. package/dist/generated/class-registrations-manifest.d.ts.map +1 -0
  32. package/dist/generated/class-registrations-manifest.js +7 -0
  33. package/dist/generated/class-registrations-manifest.js.map +1 -0
  34. package/dist/generated/generated.d.ts +7 -0
  35. package/dist/generated/generated.d.ts.map +1 -0
  36. package/dist/generated/generated.js +7 -0
  37. package/dist/generated/generated.js.map +1 -0
  38. package/dist/generated/graphql-schemas/__mj_BizAppsMarketing.d.ts +3522 -0
  39. package/dist/generated/graphql-schemas/__mj_BizAppsMarketing.d.ts.map +1 -0
  40. package/dist/generated/graphql-schemas/__mj_BizAppsMarketing.js +18854 -0
  41. package/dist/generated/graphql-schemas/__mj_BizAppsMarketing.js.map +1 -0
  42. package/dist/index.d.ts +33 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +107 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/programs/ContentPostProgramDriver.d.ts +44 -0
  47. package/dist/programs/ContentPostProgramDriver.d.ts.map +1 -0
  48. package/dist/programs/ContentPostProgramDriver.js +185 -0
  49. package/dist/programs/ContentPostProgramDriver.js.map +1 -0
  50. package/dist/programs/EmailProgramDriver.d.ts +56 -0
  51. package/dist/programs/EmailProgramDriver.d.ts.map +1 -0
  52. package/dist/programs/EmailProgramDriver.js +224 -0
  53. package/dist/programs/EmailProgramDriver.js.map +1 -0
  54. package/dist/programs/google/GoogleAdsClient.d.ts +93 -0
  55. package/dist/programs/google/GoogleAdsClient.d.ts.map +1 -0
  56. package/dist/programs/google/GoogleAdsClient.js +279 -0
  57. package/dist/programs/google/GoogleAdsClient.js.map +1 -0
  58. package/dist/programs/google/GoogleAdsProgramDriver.d.ts +56 -0
  59. package/dist/programs/google/GoogleAdsProgramDriver.d.ts.map +1 -0
  60. package/dist/programs/google/GoogleAdsProgramDriver.js +357 -0
  61. package/dist/programs/google/GoogleAdsProgramDriver.js.map +1 -0
  62. package/dist/programs/google/googleAdsExecutionContext.d.ts +47 -0
  63. package/dist/programs/google/googleAdsExecutionContext.d.ts.map +1 -0
  64. package/dist/programs/google/googleAdsExecutionContext.js +128 -0
  65. package/dist/programs/google/googleAdsExecutionContext.js.map +1 -0
  66. package/dist/programs/google/googleBrandAssets.d.ts +27 -0
  67. package/dist/programs/google/googleBrandAssets.d.ts.map +1 -0
  68. package/dist/programs/google/googleBrandAssets.js +81 -0
  69. package/dist/programs/google/googleBrandAssets.js.map +1 -0
  70. package/dist/programs/index.d.ts +18 -0
  71. package/dist/programs/index.d.ts.map +1 -0
  72. package/dist/programs/index.js +27 -0
  73. package/dist/programs/index.js.map +1 -0
  74. package/dist/programs/linkedin/LinkedInAdsClient.d.ts +145 -0
  75. package/dist/programs/linkedin/LinkedInAdsClient.d.ts.map +1 -0
  76. package/dist/programs/linkedin/LinkedInAdsClient.js +408 -0
  77. package/dist/programs/linkedin/LinkedInAdsClient.js.map +1 -0
  78. package/dist/programs/linkedin/LinkedInAdsProgramDriver.d.ts +94 -0
  79. package/dist/programs/linkedin/LinkedInAdsProgramDriver.d.ts.map +1 -0
  80. package/dist/programs/linkedin/LinkedInAdsProgramDriver.js +449 -0
  81. package/dist/programs/linkedin/LinkedInAdsProgramDriver.js.map +1 -0
  82. package/dist/programs/linkedin/linkedInExecutionContext.d.ts +42 -0
  83. package/dist/programs/linkedin/linkedInExecutionContext.d.ts.map +1 -0
  84. package/dist/programs/linkedin/linkedInExecutionContext.js +97 -0
  85. package/dist/programs/linkedin/linkedInExecutionContext.js.map +1 -0
  86. package/package.json +46 -7
  87. package/index.js +0 -1
@@ -0,0 +1,33 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { RegisterClass } from '@memberjunction/global';
8
+ import { BaseAgent } from '@memberjunction/ai-agents';
9
+ import { BaseMarketingAgent } from './BaseMarketingAgent.js';
10
+ /**
11
+ * Marketing Podcast Ingestion Agent — driver class (Content Engine PRD, Phase A row A2).
12
+ *
13
+ * The `MJ: AI Agents` row named this class but nothing defined it, so MJ's ClassFactory fell
14
+ * back to plain `BaseAgent` — the same silent fault that bit the Onboarding, Experimentation and
15
+ * Operations agents in turn: no brand self-resolution from the caller's grants or the app
16
+ * context, no payload bootstrap (`brandName` / `companyId`), no authorized-brand disambiguation.
17
+ * With Content's "Ingest now" and the per-brand Ingest-sources job about to run this agent, the
18
+ * brand must come from the run's context, never from a question.
19
+ *
20
+ * Deliberately THIN, like the Operations agent. The ingestion work is tool calls (Fetch Podcast
21
+ * From RSS, Intake Podcast From Box, Diarize Podcast Episode, Transcribe Audio …) and every one
22
+ * of them enforces its own brand gate server-side; the doctrine this class needs is exactly what
23
+ * {@link BaseMarketingAgent} centralizes. Idempotency lives in the actions and, for generation,
24
+ * in the pipeline's final-save check (CE-7) — not in the narration here.
25
+ */
26
+ let MarketingPodcastIngestionAgent = class MarketingPodcastIngestionAgent extends BaseMarketingAgent {
27
+ };
28
+ MarketingPodcastIngestionAgent = __decorate([
29
+ RegisterClass(BaseAgent, 'MarketingPodcastIngestionAgent')
30
+ ], MarketingPodcastIngestionAgent);
31
+ export { MarketingPodcastIngestionAgent };
32
+ export function LoadMarketingPodcastIngestionAgent() { }
33
+ //# sourceMappingURL=MarketingPodcastIngestionAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarketingPodcastIngestionAgent.js","sourceRoot":"","sources":["../../src/agents/MarketingPodcastIngestionAgent.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D;;;;;;;;;;;;;;;GAeG;AAEI,IAAM,8BAA8B,GAApC,MAAM,8BAA+B,SAAQ,kBAAkB;CACrE,CAAA;AADY,8BAA8B;IAD1C,aAAa,CAAC,SAAS,EAAE,gCAAgC,CAAC;GAC9C,8BAA8B,CAC1C;;AAED,MAAM,UAAU,kCAAkC,KAAI,CAAC"}
@@ -0,0 +1,206 @@
1
+ import { AIPromptParams, AgentConfiguration, ExecuteAgentParams, BaseAgentNextStep, MJAIAgentRunEntityExtended, MJAIAgentRunStepEntityExtended } from "@memberjunction/ai-core-plus";
2
+ import { BaseMarketingAgent } from './BaseMarketingAgent.js';
3
+ export declare class MarketingStrategyOnboardingAgent extends BaseMarketingAgent {
4
+ protected initializeStartingPayload<P = unknown>(params: ExecuteAgentParams<unknown, P>): Promise<void>;
5
+ protected preparePromptParams<P>(config: AgentConfiguration, payload: P, params: ExecuteAgentParams): Promise<AIPromptParams>;
6
+ /**
7
+ * Deterministic brand resolution for multi-brand users. The base ladder
8
+ * sets `authorizedBrands` (instead of `brandId`) when the user is
9
+ * authorized for several brands, and the prompt can't be trusted to write
10
+ * `brandId` back — so when the founder has NAMED one of those brands
11
+ * anywhere in the conversation, the shell resolves it itself.
12
+ * Longest-name match wins ("Acme Health" beats "Acme").
13
+ *
14
+ * Brand names are only unique WITHIN a company, so a tie between two
15
+ * equally-long matched names is broken by the parent company name also
16
+ * appearing in the conversation. Still ambiguous ⇒ resolve nothing and
17
+ * let the agent ask; guessing here would write a strategy onto the wrong
18
+ * tenant's brand.
19
+ */
20
+ /** Is this brand one the caller actually holds a grant for? */
21
+ private isAuthorizedBrand;
22
+ private resolveBrandFromConversation;
23
+ /**
24
+ * The founder's own words ARE the interview evidence. Reading them here
25
+ * (rather than asking the model to copy them into the payload and yield)
26
+ * removes the round-trip that made the loop possible: by the time the
27
+ * prompt runs, synthesis has already happened and the model's only job is
28
+ * to talk to the founder.
29
+ *
30
+ * Turns already folded into the running objective are skipped, so a
31
+ * re-render of the same turn can't double-count them.
32
+ */
33
+ private deriveInterviewEvidence;
34
+ /**
35
+ * Enforce the interview contract in CODE, not in the prompt.
36
+ *
37
+ * Skip's drivers validate the model's proposed next step and correct it
38
+ * (SkipRequirementsExpertAgent.validateChatNextStep demotes Chat->Success in
39
+ * update mode). A prompt rule is advice the model may ignore; this is the
40
+ * layer where an invariant actually holds.
41
+ *
42
+ * Two invariants:
43
+ * - In Grill, a reply MUST carry the batched questions. Observed live: the
44
+ * model narrated the synthesis and said "I'll start with Customer
45
+ * Journey" with no form attached, burning the founder's turn.
46
+ * - In AwaitingBrand, a reply MUST offer the brand choices, or the founder
47
+ * is asked a question with no way to answer it that the shell can read.
48
+ *
49
+ * A corrective Retry carries an errorMessage, so it counts against the
50
+ * framework's consecutive-unproductive-retry cap (10) and cannot loop.
51
+ */
52
+ /**
53
+ * P2 — terminate on Complete.
54
+ *
55
+ * `Chat` always terminates the TURN, but the run only *succeeds* on a
56
+ * Success step, and `FinalPayloadValidation` is evaluated nowhere else. An
57
+ * interview that can never emit Success can never be validated and never
58
+ * signals completion to a caller.
59
+ */
60
+ protected validateChatNextStep<P>(params: ExecuteAgentParams, nextStep: BaseAgentNextStep<P>, currentPayload: P, agentRun: MJAIAgentRunEntityExtended, currentStep: MJAIAgentRunStepEntityExtended): Promise<BaseAgentNextStep<P>>;
61
+ /** Grill/AwaitingBrand replies must carry the form that makes them answerable. */
62
+ private enforceInterviewContract;
63
+ /**
64
+ * P3 — ban the bare model Retry in CODE, not in prose.
65
+ *
66
+ * The framework's unproductive-retry cap only counts retries that carry an
67
+ * errorMessage (base-agent: `step==='Retry' && !terminate && !!errorMessage`).
68
+ * A model that emits a naked Retry is therefore exempt — that exemption is
69
+ * what let the 2026-08-05/06 loops run until the heap died. The prompt now
70
+ * forbids Retry, but a prompt is advice; this is the enforcement.
71
+ *
72
+ * Framework-generated retries are legitimate and must pass through: action
73
+ * results, artifact tools, context recovery and FinalPayloadValidation all
74
+ * carry retryInstructions or an errorMessage.
75
+ */
76
+ protected validateRetryNextStep<P>(params: ExecuteAgentParams, nextStep: BaseAgentNextStep<P>, currentPayload: P, agentRun: MJAIAgentRunEntityExtended, currentStep: MJAIAgentRunStepEntityExtended): Promise<BaseAgentNextStep<P>>;
77
+ /**
78
+ * P1 — read the founder's ACTUAL answer to the approval form.
79
+ *
80
+ * A depth-0 Chat step with a responseForm creates an `MJ: AI Agent Requests`
81
+ * row carrying the form schema; the founder's reply lands in `Response`.
82
+ * Reading it is the deterministic equivalent of Skip's
83
+ * IntentDetector.checkFormResponseForApproval, which parses the form token
84
+ * and lets an explicit choice BLOCK any LLM re-interpretation. Until now
85
+ * nothing in this app read that answer at all — the approve/revise buttons
86
+ * were decoration.
87
+ */
88
+ private readPriorFormAnswer;
89
+ /**
90
+ * Read the founder's form answer from where Explorer ACTUALLY delivers it.
91
+ *
92
+ * A responseForm click does not fill `MJ: AI Agent Requests`.`Response`
93
+ * (verified live: every row stays `Requested`/NULL). It arrives as a USER
94
+ * conversation message whose body is `@`-prefixed JSON:
95
+ *
96
+ * @{"_mode":"form","action":"formSubmit","fields":[
97
+ * {"name":"action","value":"approved",...},
98
+ * {"name":"feedback","value":null,...}]}
99
+ *
100
+ * Note the outer `action` is the transport verb ("formSubmit") — the
101
+ * founder's answer lives in `fields[]`. This flattens those into the
102
+ * {action, feedback, ...} record the approval flow reads. The most recent
103
+ * form answer wins; founder chit-chat after it does not cancel it (the
104
+ * materialized-once guard makes a re-applied approve a no-op).
105
+ */
106
+ private readFormAnswerFromConversation;
107
+ /** Fallback only: scan the in-memory transcript (known to be display-text in Explorer). */
108
+ private readFormAnswerFromTranscript;
109
+ /** Parse one message as an Explorer formSubmit; null if it isn't one. */
110
+ private parseFormSubmitMessage;
111
+ /**
112
+ * P1 — finalize intent, derived fresh EVERY turn and never latched.
113
+ *
114
+ * The previous one-way flag meant a single false positive disabled grilling
115
+ * and the messaging gate permanently. Skip's rules, ported: a long message
116
+ * is almost always a change request, and "approval + but…" is a change
117
+ * request, so negations and hedges near the trigger disqualify it.
118
+ */
119
+ private founderAskedToFinalize;
120
+ /**
121
+ * P15 — keep the giant blobs out of the step log.
122
+ *
123
+ * MJ serializes the payload into PayloadAtStart/PayloadAtEnd on EVERY step.
124
+ * Ours carries whole scraped pages in `rawSources[].text`, the accumulated
125
+ * founder transcript, and the fully rendered strategy markdown — so a long
126
+ * interview writes megabytes of duplicated text per turn. Skip does the
127
+ * same projection on its two heaviest agents (base-skip-agent
128
+ * shouldSummarizePayload / summarizePayload).
129
+ *
130
+ * This affects LOGGING ONLY. The live payload is untouched.
131
+ */
132
+ protected serializePayloadAtStart(payload: unknown): string | null;
133
+ protected serializePayloadAtEnd(payload: unknown): string | null;
134
+ private summarizeForLog;
135
+ /** Mark derived turns consumed — only after a synthesis has ingested them. */
136
+ private commitConsumedTurns;
137
+ /**
138
+ * Deterministic finalize-intent detection on the LATEST founder message
139
+ * only (not history — an early "we'll finalize later" must not trigger).
140
+ * The LLM-set payload flag is the primary channel; this catches the
141
+ * explicit phrasings even when the LLM fails to set it.
142
+ */
143
+ private latestUserMessageRequestsFinalize;
144
+ /** The deterministic onboarding shell. Fail-open: an error here logs and lets the turn proceed undirected. */
145
+ private runOnboardingShell;
146
+ /**
147
+ * Button-group labels for the AwaitingBrand phase. Two brands of DIFFERENT
148
+ * companies can share a name, so a repeated name is qualified with its
149
+ * company — otherwise the founder is asked to choose between two identical
150
+ * buttons.
151
+ */
152
+ private brandChoiceLabels;
153
+ /**
154
+ * Publish the turn's STATE — never a command.
155
+ *
156
+ * Skip's agents don't take injected imperatives: their prompts branch on
157
+ * payload the model can see and verify (`{% if _CURRENT_PAYLOAD.changeRequest %}`),
158
+ * and `preparePromptParams` only ever adds evidence. A directive is a
159
+ * second control channel with no defined behavior when it's absent — which
160
+ * is exactly how a turn with no directive fell through to "gather and
161
+ * Retry" and looped. State always has a branch.
162
+ */
163
+ /**
164
+ * M2.3 — turn the founder's approval into published state.
165
+ *
166
+ * Runs in the shell, never as an LLM tool choice: approval is a boundary
167
+ * the model may narrate but must not decide. This calls the
168
+ * materialization SERVICE directly rather than the `Materialize Strategy
169
+ * Version` action — an action invoking another action is the documented
170
+ * anti-pattern, and that action is only the founder/UI/tasks-flow entry
171
+ * point onto this same call.
172
+ *
173
+ * Every outcome lands on the payload so the prompt can branch on what
174
+ * actually happened rather than on what it hoped happened.
175
+ */
176
+ private materializeApprovedStrategy;
177
+ /**
178
+ * Complete the founder's approval Task after a successful publish.
179
+ *
180
+ * Best-effort by design: the strategy IS Active by the time this runs, so
181
+ * a stuck task must never turn a successful publish into a reported
182
+ * failure. It surfaces on its own payload key instead.
183
+ */
184
+ private closeApprovalTask;
185
+ /**
186
+ * Resolve the newest artifact version emitted in this conversation — the
187
+ * snapshot the founder actually approved, and the row whose id gets
188
+ * stamped as ApprovedArtifactVersionID.
189
+ *
190
+ * Two hops, because the framework links artifacts through
191
+ * ConversationDetailArtifact and neither that entity nor
192
+ * `MJ: Artifact Versions` denormalizes ConversationID.
193
+ */
194
+ private resolveApprovedArtifactVersionId;
195
+ private publishState;
196
+ /**
197
+ * Maintain payload.spec — the MarketingStrategySpec working draft that
198
+ * artifact versions serialize (Rev 5 §2.7.1). Slots merge from synthesis
199
+ * results (fields + narrative + derived confidence); sources accumulate
200
+ * from consumed evidence; displayMarkdown re-renders via the one shared
201
+ * renderer so the artifact viewer's extract rule never re-derives it.
202
+ */
203
+ private mergeSpec;
204
+ }
205
+ export declare function LoadMarketingStrategyOnboardingAgent(): void;
206
+ //# sourceMappingURL=MarketingStrategyOnboardingAgent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarketingStrategyOnboardingAgent.d.ts","sourceRoot":"","sources":["../../src/agents/MarketingStrategyOnboardingAgent.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAErL,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAsF7D,qBACa,gCAAiC,SAAQ,kBAAkB;cAC3C,yBAAyB,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;cAc7F,mBAAmB,CAAC,CAAC,EAC1C,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,CAAC,EACV,MAAM,EAAE,kBAAkB,GAC3B,OAAO,CAAC,cAAc,CAAC;IAO1B;;;;;;;;;;;;;OAaG;IACH,+DAA+D;IAC/D,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,4BAA4B;IAiDpC;;;;;;;;;OASG;IACH,OAAO,CAAC,uBAAuB;IAwB/B;;;;;;;;;;;;;;;;;OAiBG;IAEH;;;;;;;OAOG;cACsB,oBAAoB,CAAC,CAAC,EAC3C,MAAM,EAAE,kBAAkB,EAC1B,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC9B,cAAc,EAAE,CAAC,EACjB,QAAQ,EAAE,0BAA0B,EACpC,WAAW,EAAE,8BAA8B,GAC5C,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAYhC,kFAAkF;YACpE,wBAAwB;IAoDtC;;;;;;;;;;;;OAYG;cACsB,qBAAqB,CAAC,CAAC,EAC5C,MAAM,EAAE,kBAAkB,EAC1B,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC9B,cAAc,EAAE,CAAC,EACjB,QAAQ,EAAE,0BAA0B,EACpC,WAAW,EAAE,8BAA8B,GAC5C,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAiBhC;;;;;;;;;;OAUG;YACW,mBAAmB;IAqBjC;;;;;;;;;;;;;;;;OAgBG;YACW,8BAA8B;IAuC5C,2FAA2F;IAC3F,OAAO,CAAC,4BAA4B;IAapC,yEAAyE;IACzE,OAAO,CAAC,sBAAsB;IAsB9B;;;;;;;OAOG;IACH,OAAO,CAAC,sBAAsB;IAkB9B;;;;;;;;;;;OAWG;cACgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;cAIxD,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI;IAIzE,OAAO,CAAC,eAAe;IA0BvB,8EAA8E;IAC9E,OAAO,CAAC,mBAAmB;IAQ3B;;;;;OAKG;IACH,OAAO,CAAC,iCAAiC;IASzC,8GAA8G;YAChG,kBAAkB;IAmYhC;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;;;;;;;;OASG;IACH;;;;;;;;;;;;OAYG;YACW,2BAA2B;IAmFzC;;;;;;OAMG;YACW,iBAAiB;IAuB/B;;;;;;;;OAQG;YACW,gCAAgC;IA2C9C,OAAO,CAAC,YAAY;IAmDpB;;;;;;OAMG;IACH,OAAO,CAAC,SAAS;CA0DpB;AAsCD,wBAAgB,oCAAoC,SAAK"}