@dbx-tools/shared-mastra 0.3.43 → 0.4.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,569 @@
1
+ /**
2
+ * Wire-format contract for `@dbx-tools/appkit-mastra`: the
3
+ * dependency-free zod schemas + inferred types every consumer (the
4
+ * React client, browser bundles, the server plugin) shares.
5
+ *
6
+ * Kept free of `pg`, `fastembed`, and the Mastra runtime so the
7
+ * client can import these schemas without dragging in server-only
8
+ * dependencies. Three layers live here:
9
+ *
10
+ * 1. The descriptor published by `MastraPlugin.clientConfig()`
11
+ * plus the REST payloads its routes return (models, history,
12
+ * suggestions, chart embeds, statement data). The server
13
+ * derives every path from the plugin mount and publishes the
14
+ * resolved paths so the client composes URLs without
15
+ * hard-coding `/api/mastra` - rename the plugin and the client
16
+ * keeps working.
17
+ * 2. The `ctx.writer` event vocabulary: the wire-derived
18
+ * {@link GenieChatEvent}s from `@dbx-tools/genie-shared` plus
19
+ * the Mastra-only agent lifecycle events, unified as
20
+ * {@link GenieWriterEvent} so subscribers narrow both halves
21
+ * with a single `switch (event.type)`.
22
+ * 3. The Genie agent's workflow output shapes
23
+ * ({@link GenieAgentResult} and its summary / dataset items).
24
+ *
25
+ * The route segments live in the sibling `routes.ts`
26
+ * ({@link MASTRA_ROUTES}) and the embed-marker grammar in `marker.ts`,
27
+ * so this file stays purely declarative (schemas + inferred types).
28
+ * The browser client that drives these routes (`MastraPluginClient`)
29
+ * ships from `@dbx-tools/appkit-mastra-ui`.
30
+ *
31
+ * @module
32
+ */
33
+ import { genieModel } from "@dbx-tools/shared-genie";
34
+ import { model } from "@dbx-tools/shared-model";
35
+ import { z } from "zod";
36
+ /* ---------------------------- client config ---------------------------- */
37
+ /**
38
+ * JSON-safe descriptor published by the Mastra plugin's
39
+ * `clientConfig()`.
40
+ *
41
+ * Only the irreducible data lives here: `basePath` (the one path the
42
+ * client can't otherwise know, since it encodes the plugin's mount
43
+ * name) plus the runtime agent roster. Every concrete endpoint URL is
44
+ * derived from `basePath` by the browser client
45
+ * (`MastraPluginClient`) using the shared {@link MASTRA_ROUTES}
46
+ * segments, so there's nothing to publish per-route.
47
+ *
48
+ * Fields:
49
+ * - `basePath`: plugin mount path. Always `/api/<pluginName>`. Feed
50
+ * it to `new MastraPluginClient(config)` (from
51
+ * `@dbx-tools/appkit-mastra-ui`) to get a typed client over every
52
+ * route plus the standard agent stream.
53
+ * - `defaultAgent`: agent id the client converses with when it
54
+ * doesn't name one.
55
+ * - `agents`: every registered agent id in registration order.
56
+ * - `feedbackEnabled`: whether the server can log user feedback to
57
+ * MLflow (MLflow tracing is configured). Drives whether the chat UI
58
+ * surfaces thumbs / comment controls. Defaults to `false` so a
59
+ * config published by an older server (without the field) parses
60
+ * cleanly to "off".
61
+ */
62
+ export const MastraClientConfigSchema = z.object({
63
+ basePath: z.string(),
64
+ defaultAgent: z.string(),
65
+ agents: z.array(z.string()),
66
+ feedbackEnabled: z.boolean().default(false),
67
+ });
68
+ /**
69
+ * JSON payload returned by `GET ${basePath}/default-model[?agentId=]`. The
70
+ * static default model the agent resolves to when the client pins no model,
71
+ * as both the raw serving-endpoint `model` id and a `displayName` (the
72
+ * humanized label the picker shows). Both are `null` when the agent decides
73
+ * its model dynamically at call time (nothing static to advertise). Lets the
74
+ * picker label its default option WITHOUT waiting on the `/models` catalogue,
75
+ * so it never flashes a raw id on load. Kept off the static bootstrap
76
+ * `clientConfig` on purpose: it is per-agent and can be dynamic, so it is
77
+ * fetched like `/models`.
78
+ */
79
+ export const DefaultModelResponseSchema = z.object({
80
+ agentId: z.string(),
81
+ model: z.string().nullable(),
82
+ displayName: z.string().nullable(),
83
+ });
84
+ /* ---------------------------- model catalogue ---------------------------- */
85
+ /**
86
+ * JSON payload returned by `GET ${basePath}/models`. Wraps the shared
87
+ * {@link model.ServingEndpointSummarySchema} (re-exported from
88
+ * `@dbx-tools/shared-model`) so the catalogue
89
+ * descriptor has a single definition the client, server, and the
90
+ * standalone `@dbx-tools/model` toolkit all agree on.
91
+ */
92
+ export const ServingEndpointsResponseSchema = z.object({
93
+ endpoints: z.array(model.ServingEndpointSummarySchema),
94
+ });
95
+ /* ----------------------------- chat history ----------------------------- */
96
+ /**
97
+ * Structural shape for an AI SDK V5 `UIMessage`. Defined locally
98
+ * so the shared types package stays dependency-free (no `ai`
99
+ * import). The runtime values returned by the `/history` endpoint
100
+ * are produced by `toAISdkV5Messages` and are 1:1 compatible with
101
+ * `UIMessage` from the `ai` package; clients can safely cast when
102
+ * needed.
103
+ */
104
+ export const MastraHistoryUIMessageSchema = z.object({
105
+ id: z.string(),
106
+ role: z.enum(["system", "user", "assistant"]),
107
+ parts: z.array(z.unknown()).readonly(),
108
+ metadata: z.unknown().optional(),
109
+ });
110
+ /**
111
+ * JSON payload returned by `GET ${basePath}/history`.
112
+ *
113
+ * Fields:
114
+ * - `uiMessages`: page of UI-formatted messages, oldest -> newest.
115
+ * Always chronological regardless of the underlying pagination
116
+ * order so the client can prepend the array to the live
117
+ * transcript without sorting.
118
+ * - `page`: zero-indexed page that produced this response.
119
+ * - `perPage`: number of items requested per page.
120
+ * - `total`: total number of messages in the thread.
121
+ * - `hasMore`: true when at least one older page is still
122
+ * available.
123
+ */
124
+ export const MastraHistoryResponseSchema = z.object({
125
+ uiMessages: z.array(MastraHistoryUIMessageSchema),
126
+ page: z.number(),
127
+ perPage: z.number(),
128
+ total: z.number(),
129
+ hasMore: z.boolean(),
130
+ });
131
+ /**
132
+ * JSON payload returned by `DELETE ${basePath}/history`. Deletes
133
+ * every persisted message + workflow snapshot tied to the caller's
134
+ * thread, so the next chat turn starts from a clean slate. The
135
+ * session cookie that anchors the thread id is preserved so the
136
+ * caller doesn't lose its identity - only the contents go away.
137
+ *
138
+ * `ok` is always `true` on success; the response object is kept
139
+ * as a struct (vs a bare 204) so future fields (e.g. `deletedAt`,
140
+ * `messages`) can be added without bumping the contract.
141
+ *
142
+ * Fields:
143
+ * - `ok`: literal `true` on success.
144
+ * - `agentId`: agent whose history was cleared.
145
+ * - `threadId`: thread id that was wiped.
146
+ * - `cleared`: number of messages the thread held before
147
+ * deletion. Useful for client-side "cleared 12 messages"
148
+ * toasts; `0` is reported when the thread was already empty
149
+ * (call is idempotent).
150
+ */
151
+ export const MastraClearHistoryResponseSchema = z.object({
152
+ ok: z.literal(true),
153
+ agentId: z.string(),
154
+ threadId: z.string(),
155
+ cleared: z.number(),
156
+ });
157
+ /* -------------------------------- threads -------------------------------- */
158
+ /**
159
+ * A single conversation thread the resource (authenticated user) owns,
160
+ * as returned by `GET ${basePath}/threads`. Mirrors Mastra's
161
+ * `StorageThreadType` but with JSON-safe ISO-8601 timestamps (the wire
162
+ * can't carry `Date`).
163
+ *
164
+ * Fields:
165
+ * - `id`: thread id. Pass it back as the thread-selection header
166
+ * (`THREAD_ID_HEADER`) on a stream / history / delete call to act
167
+ * on this conversation.
168
+ * - `title`: human-readable title. Present once the agent's memory
169
+ * has auto-generated one (after the first turn); absent on a
170
+ * brand-new thread, so the UI falls back to a placeholder.
171
+ * - `resourceId`: owning resource (the user id). Always the caller's
172
+ * own resource - the list route filters by it server-side.
173
+ * - `createdAt` / `updatedAt`: ISO-8601 timestamps. `updatedAt` is
174
+ * the natural sort key for "most recent conversations first".
175
+ * - `metadata`: opaque thread metadata, passed through untouched.
176
+ */
177
+ export const MastraThreadSchema = z.object({
178
+ id: z.string(),
179
+ title: z.string().optional(),
180
+ resourceId: z.string(),
181
+ createdAt: z.string(),
182
+ updatedAt: z.string(),
183
+ metadata: z.unknown().optional(),
184
+ });
185
+ /**
186
+ * JSON payload returned by `GET ${basePath}/threads`. One page of the
187
+ * caller's conversation threads, newest (`updatedAt` DESC) first.
188
+ *
189
+ * Fields:
190
+ * - `threads`: page of threads for the caller's resource.
191
+ * - `page`: zero-indexed page that produced this response.
192
+ * - `perPage`: number of items requested per page.
193
+ * - `total`: total number of threads the resource owns.
194
+ * - `hasMore`: true when at least one more page is available.
195
+ */
196
+ export const MastraThreadsResponseSchema = z.object({
197
+ threads: z.array(MastraThreadSchema),
198
+ page: z.number(),
199
+ perPage: z.number(),
200
+ total: z.number(),
201
+ hasMore: z.boolean(),
202
+ });
203
+ /**
204
+ * JSON payload returned by `DELETE ${basePath}/threads` (thread id
205
+ * supplied via the thread-selection header / `threadId` query). Wipes
206
+ * the named thread and every message on it.
207
+ *
208
+ * Fields:
209
+ * - `ok`: literal `true` on success.
210
+ * - `agentId`: agent whose thread was deleted.
211
+ * - `threadId`: thread id that was removed.
212
+ * - `deleted`: `true` when a thread row existed and was removed,
213
+ * `false` when it was already gone (call is idempotent).
214
+ */
215
+ export const MastraDeleteThreadResponseSchema = z.object({
216
+ ok: z.literal(true),
217
+ agentId: z.string(),
218
+ threadId: z.string(),
219
+ deleted: z.boolean(),
220
+ });
221
+ /** Longest thread title the rename route accepts (trimmed server-side). */
222
+ export const MASTRA_THREAD_TITLE_MAX = 200;
223
+ /**
224
+ * JSON body for `PATCH ${basePath}/threads` (thread id supplied via the
225
+ * thread-selection header / `threadId` query). Renames a single
226
+ * conversation.
227
+ *
228
+ * Fields:
229
+ * - `title`: the new human-readable title. Trimmed and capped at
230
+ * {@link MASTRA_THREAD_TITLE_MAX} characters server-side; must be
231
+ * non-empty after trimming.
232
+ */
233
+ export const MastraUpdateThreadRequestSchema = z.object({
234
+ title: z.string().trim().min(1).max(MASTRA_THREAD_TITLE_MAX),
235
+ });
236
+ /**
237
+ * JSON payload returned by `PATCH ${basePath}/threads`. Echoes the
238
+ * renamed thread in its post-update wire shape so the client can reflect
239
+ * the new title without a re-fetch.
240
+ *
241
+ * Fields:
242
+ * - `ok`: literal `true` on success.
243
+ * - `agentId`: agent whose thread was renamed.
244
+ * - `thread`: the updated thread (carries the new `title`).
245
+ */
246
+ export const MastraUpdateThreadResponseSchema = z.object({
247
+ ok: z.literal(true),
248
+ agentId: z.string(),
249
+ thread: MastraThreadSchema,
250
+ });
251
+ /* ------------------------------ suggestions ------------------------------ */
252
+ /**
253
+ * JSON payload returned by `GET ${basePath}/suggestions`.
254
+ *
255
+ * Carries the curated starter questions for an agent's Genie space -
256
+ * the `sample_questions` an author configured on the space, surfaced
257
+ * as one-tap prompts on the chat's empty state. `questions` is empty
258
+ * when the agent has no Genie space (or the space defines none), so
259
+ * the client renders nothing in that case rather than falling back to
260
+ * built-in example prompts.
261
+ */
262
+ export const MastraSuggestionsResponseSchema = z.object({
263
+ questions: z.array(z.string()),
264
+ });
265
+ /* --------------------------------- charts --------------------------------- */
266
+ /**
267
+ * Allowed chart types the planner can pick. Defined as a
268
+ * discriminated literal union so each variant carries its own
269
+ * `.describe()` clause - the server-side planner's prompt
270
+ * formatter walks `.options` to inline the descriptions into the
271
+ * model instructions, keeping the prompt in lock-step with the
272
+ * schema by construction. The runtime type is the plain string
273
+ * union (`"bar" | "line" | ...`), so consumers that just need a
274
+ * discriminator value behave the same as if it were a
275
+ * `z.enum([...])`.
276
+ */
277
+ export const ChartTypeSchema = z
278
+ .union([
279
+ z
280
+ .literal("bar")
281
+ .describe("comparing a numeric value across a small/medium set of discrete categories (top-N, ranking, group-by)"),
282
+ z
283
+ .literal("line")
284
+ .describe("ordered-axis trend (time series, sequence, rank) where the x-axis has natural order"),
285
+ z.literal("area").describe("stacked-trend emphasis - cumulative or composition over time"),
286
+ z
287
+ .literal("scatter")
288
+ .describe("two-numeric-axis correlations between fields (e.g. price vs. quantity)"),
289
+ z.literal("pie").describe("parts-of-a-whole when 2-7 categories sum to a meaningful total"),
290
+ ])
291
+ .describe("The chart shape that best matches the data and intent.");
292
+ /**
293
+ * Resolved chart plan a settled chart entry carries on its
294
+ * `result` field. `option` is the full Echarts spec; pass
295
+ * straight into `<ReactECharts option={...}>`.
296
+ */
297
+ export const ChartResultSchema = z.object({
298
+ chartType: ChartTypeSchema,
299
+ option: z
300
+ .record(z.string(), z.unknown())
301
+ .describe("Fully-resolved Echarts `EChartsOption` JSON for this chart - drop directly into an Echarts instance (or `<ReactECharts option={...} />`) without further processing. Includes title / tooltip / legend / grid / axis / series defaults already merged in."),
302
+ });
303
+ /**
304
+ * Wire-format AND server-side cache shape for a chart entry.
305
+ * Three lifecycle states inferred from the two optional fields
306
+ * (no discriminator needed):
307
+ *
308
+ * - `result` set -> chart is ready to render
309
+ * - `error` set -> planner / data fetch failed
310
+ * - both `result` and `error` unset -> still processing
311
+ *
312
+ * `option` is typed as a generic record so this package stays
313
+ * dependency-free of `echarts`. The server (`chart.ts`) imports
314
+ * this schema directly; the demo client polls the
315
+ * `/embed/chart/:id` route and parses responses against it.
316
+ */
317
+ export const ChartSchema = z.object({
318
+ chartId: z
319
+ .string()
320
+ .describe("Opaque id minted by the chart subsystem. Embed verbatim as `[chart:<chartId>]` in agent prose; the host UI resolves it against this cache entry."),
321
+ error: z
322
+ .string()
323
+ .optional()
324
+ .describe("Error message when the chart failed (data fetch error, planner error, empty dataset). Mutually exclusive with `result`; absent on success and while processing."),
325
+ result: ChartResultSchema.optional().describe("Resolved chart plan. Absent while processing and when the run errored."),
326
+ });
327
+ /* ------------------------------- statements ------------------------------- */
328
+ /**
329
+ * Wire-format payload returned by `GET ${basePath}/embed/data/:id`.
330
+ *
331
+ * Mirrors the agent-side `get_statement` tool's output so the
332
+ * host UI and the LLM see the exact same shape for the same
333
+ * statement; the route is what resolves `[data:<statement_id>]`
334
+ * markers the agent embeds in prose.
335
+ *
336
+ * Fields:
337
+ * - `columns`: column names in declaration order.
338
+ * - `rows`: row records keyed by column name. Cell values are
339
+ * either coerced numbers or the original strings (Genie /
340
+ * Statement Execution returns every cell as `string | null`;
341
+ * numeric-looking cells are coerced server-side so the UI
342
+ * can format with `tabular-nums` without re-parsing).
343
+ * - `rowCount`: total row count upstream (independent of the
344
+ * `limit` cap). Compare against `rows.length` to detect
345
+ * truncation - `truncated` is the precomputed flag.
346
+ * - `truncated`: `true` when the server clipped rows to honor
347
+ * the route's row cap; the UI should surface a "showing N of
348
+ * M rows" affordance in that case.
349
+ */
350
+ export const StatementDataSchema = z.object({
351
+ columns: z.array(z.string()),
352
+ rows: z.array(z.record(z.string(), z.unknown())),
353
+ rowCount: z.number(),
354
+ truncated: z.boolean(),
355
+ });
356
+ /* ---------------- mastra-only genie-agent events ---------------- */
357
+ /**
358
+ * Mastra-only lifecycle event: the Genie tool invocation started.
359
+ * Emitted immediately when the calling agent invokes the Genie
360
+ * tool, before any inner agent / wire activity, so the UI can
361
+ * pop a "Thinking..." pill the instant the model decides to
362
+ * delegate. `conversationId` / `messageId` are absent on this
363
+ * first emit (no Genie round-trip yet). Field names are
364
+ * camelCase (vs the snake_case wire events) to mirror the
365
+ * Genie agent's own internal data plumbing.
366
+ */
367
+ export const StartedEventSchema = z.object({
368
+ type: z.literal("started"),
369
+ spaceId: z.string(),
370
+ /**
371
+ * Genie conversation id, populated only when this `started`
372
+ * event corresponds to a follow-up turn on an existing
373
+ * conversation. Absent on the first turn.
374
+ */
375
+ conversationId: z.string().optional(),
376
+ /**
377
+ * Genie message id, populated only after the first wire
378
+ * `message` event lands. Absent on the immediate-on-invoke
379
+ * emit.
380
+ */
381
+ messageId: z.string().optional(),
382
+ /** Question the Genie agent sent to Genie. */
383
+ content: z.string(),
384
+ });
385
+ /**
386
+ * Mastra-only lifecycle event: one `ask_genie` invocation
387
+ * finished. Carries the hydrated `statementIds` (rows are fetched
388
+ * via `getStatement` separately) and Genie's final prose answer
389
+ * so the UI can move from "thinking" to "answered" without
390
+ * waiting for the Genie agent's whole reasoning loop to end.
391
+ */
392
+ export const AskGenieDoneEventSchema = z.object({
393
+ type: z.literal("ask_genie_done"),
394
+ spaceId: z.string(),
395
+ conversationId: z.string().optional(),
396
+ messageId: z.string().optional(),
397
+ /** Genie's natural-language answer for the turn, if any. */
398
+ answer: z.string().optional(),
399
+ /** Statement ids for any non-empty result sets this turn produced. */
400
+ statementIds: z.array(z.string()),
401
+ /**
402
+ * Terminal wire status (`COMPLETED` / `FAILED` / `CANCELLED`).
403
+ * Mirrors the source `result` event's status so subscribers
404
+ * can react to ask-level completion without re-walking history.
405
+ * Treated as `z.custom<MessageStatus>` because the SDK is the
406
+ * source of truth for the enum values.
407
+ */
408
+ status: z.custom((v) => typeof v === "string"),
409
+ });
410
+ /**
411
+ * Mastra-only error event: terminal Genie agent / transport
412
+ * error. Genie's own `FAILED` / `CANCELLED` come through the
413
+ * wire's `result` event - this variant is for failures the wire
414
+ * can't represent (network, Genie agent crash, planner error,
415
+ * etc.) plus a UI-friendly mirror of `result` when the status is
416
+ * non-`COMPLETED`.
417
+ */
418
+ export const MastraGenieErrorEventSchema = z.object({
419
+ type: z.literal("error"),
420
+ spaceId: z.string().optional(),
421
+ conversationId: z.string().optional(),
422
+ messageId: z.string().optional(),
423
+ error: z.string(),
424
+ });
425
+ /**
426
+ * Mastra-only lifecycle event: the inner Genie agent's
427
+ * structured-output coercion has landed. Fires once per Genie
428
+ * tool invocation, AFTER `agent.generate(...)` completes (i.e.
429
+ * the inner loop + Mastra's structuring pass have both
430
+ * finished) and BEFORE the wrapper hydrates each `data` item
431
+ * with a chart. Signals to the host UI that the agent has
432
+ * stopped reasoning and is moving into chart generation.
433
+ *
434
+ * The structuring pass itself is opaque (it runs inside
435
+ * Mastra's `agent.generate(...)` together with the tool loop)
436
+ * so this is the earliest hook we can offer; we can't fire a
437
+ * "summary started" event the way we fire `started`.
438
+ */
439
+ export const SummaryEventSchema = z.object({
440
+ type: z.literal("summary"),
441
+ spaceId: z.string(),
442
+ /** Total number of items in the agent's structured summary. */
443
+ items: z.number().int().nonnegative(),
444
+ /** Count of `text` / prose items in the summary. */
445
+ textItems: z.number().int().nonnegative(),
446
+ /**
447
+ * Count of `data` items the wrapper will hydrate into charts.
448
+ * The host UI can use this to seed N chart skeletons before
449
+ * the per-chart events arrive.
450
+ */
451
+ dataItems: z.number().int().nonnegative(),
452
+ });
453
+ /**
454
+ * Mastra-only event union. Each variant uses the same flat
455
+ * `{type, ...fields}` shape as {@link GenieChatEvent} so
456
+ * subscribers union both with a single `switch (event.type)`.
457
+ */
458
+ export const GenieAgentEventSchema = z.discriminatedUnion("type", [
459
+ StartedEventSchema,
460
+ AskGenieDoneEventSchema,
461
+ MastraGenieErrorEventSchema,
462
+ SummaryEventSchema,
463
+ ]);
464
+ /**
465
+ * The unified writer-event vocabulary subscribers see on
466
+ * `ctx.writer`: the wire-derived {@link GenieChatEvent} union
467
+ * **plus** Mastra-only events from {@link GenieAgentEvent}. Each
468
+ * variant is a flat `{type, ...fields}` object; consumers narrow
469
+ * on `type` and read fields inline - there is no payload wrapper
470
+ * and no writer-boundary translator.
471
+ *
472
+ * Composed via `z.union` (not `z.discriminatedUnion`) because
473
+ * both halves are themselves discriminated unions on the same
474
+ * `type` key.
475
+ */
476
+ export const GenieWriterEventSchema = z.union([
477
+ genieModel.GenieChatEventSchema,
478
+ GenieAgentEventSchema,
479
+ ]);
480
+ /* ------------------------- summary + dataset ------------------------ */
481
+ /**
482
+ * Tabular payload embedded in every {@link GenieSummaryItem}
483
+ * `visualize` dataset. Always present: hydrated by the workflow's
484
+ * agent step before the finalize step runs, so consumers can render
485
+ * a table fallback regardless of chart-planner outcome.
486
+ *
487
+ * Fields:
488
+ * - `columns`: column names in display order.
489
+ * - `rows`: tabular rows keyed by column name.
490
+ * - `rowCount`: total row count Genie reported (may exceed
491
+ * `rows.length` when the statement was truncated).
492
+ */
493
+ export const GenieDatasetDataSchema = z.object({
494
+ columns: z.array(z.string()),
495
+ rows: z.array(z.record(z.string(), z.unknown())),
496
+ rowCount: z.number(),
497
+ });
498
+ /**
499
+ * Slim chart reference attached to a visualize dataset. Only
500
+ * present when planning succeeded.
501
+ *
502
+ * `option` is intentionally NOT included. The resolved Echarts
503
+ * spec lives off-band in the chart cache: the host UI fetches it
504
+ * by `chartId` from the plugin's embed route (derived from
505
+ * `basePath` + {@link MASTRA_ROUTES}.embed, i.e. `/embed/chart/:id`;
506
+ * see {@link Chart}). Embedding the full spec inline would
507
+ * inflate every dataset by several KB per chart and round-trip
508
+ * through the LLM context for zero benefit (the model only needs
509
+ * the `chartId` to place a `[chart:<chartId>]` marker in its
510
+ * reply).
511
+ */
512
+ export const GenieDatasetChartSchema = z.object({
513
+ chartId: z.string(),
514
+ chartType: ChartTypeSchema,
515
+ });
516
+ /**
517
+ * Dataset bundle attached to a {@link GenieSummaryItem} `visualize`
518
+ * item. `data` is always populated; `chart` is best-effort and
519
+ * absent when the workflow's chart-planner failed (timeout,
520
+ * malformed plan, abort) so the host UI can still render the
521
+ * underlying table.
522
+ */
523
+ export const GenieDatasetSchema = z.object({
524
+ data: GenieDatasetDataSchema,
525
+ chart: GenieDatasetChartSchema.optional(),
526
+ });
527
+ /**
528
+ * One item inside the Genie workflow's final summary. The
529
+ * workflow produces a mixed sequence of:
530
+ *
531
+ * - `string`: a markdown paragraph (interpretation, callouts,
532
+ * transitions between data blocks).
533
+ * - `visualize`: a request from the agent step to visualize a
534
+ * specific Genie statement at this position in the prose.
535
+ * The finalize step hydrates `dataset.data` (rows from the
536
+ * matching `statementId`) and attaches `dataset.chart` after
537
+ * running the chart-planner. The agent NEVER picks the chart
538
+ * type - it only marks where a visualization belongs.
539
+ *
540
+ * The host UI walks the array in display order to compose the
541
+ * final assistant message.
542
+ */
543
+ export const GenieSummaryItemSchema = z.discriminatedUnion("type", [
544
+ z.object({
545
+ type: z.literal("string"),
546
+ text: z.string(),
547
+ }),
548
+ z.object({
549
+ type: z.literal("visualize"),
550
+ statementId: z.string(),
551
+ title: z.string().optional(),
552
+ description: z.string().optional(),
553
+ dataset: GenieDatasetSchema,
554
+ }),
555
+ ]);
556
+ /**
557
+ * The Genie agent's final output shape - what the calling agent's
558
+ * Genie tool returns to the calling LLM. The `summary` array is
559
+ * the user-facing renderable; `conversationId` lets the calling
560
+ * agent (or the UI) follow up in the same Genie thread on the
561
+ * next turn.
562
+ */
563
+ export const GenieAgentResultSchema = z.object({
564
+ spaceId: z.string(),
565
+ conversationId: z.string().optional(),
566
+ summary: z.array(GenieSummaryItemSchema),
567
+ error: z.string().optional(),
568
+ });
569
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93aXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBMkMsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4Qiw2RUFBNkU7QUFFN0U7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDL0MsUUFBUSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUU7SUFDcEIsWUFBWSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUU7SUFDeEIsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzNCLGVBQWUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztDQUM1QyxDQUFDLENBQUM7QUFHSDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNqRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtJQUNuQixLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM1QixXQUFXLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUNuQyxDQUFDLENBQUM7QUFHSCwrRUFBK0U7QUFFL0U7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyRCxTQUFTLEVBQUUs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Q0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDekIsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUU7S0FDakIsQ0FBQztJQUNGLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDUCxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDNUIsV0FBVyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUU7UUFDdkIsS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7UUFDNUIsV0FBVyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7UUFDbEMsT0FBTyxFQUFFLGtCQUFrQjtLQUM1QixDQUFDO0NBQ0gsQ0FBQyxDQUFDO0FBTUg7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM3QyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtJQUNuQixjQUFjLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNyQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztJQUN4QyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUM3QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdpcmUtZm9ybWF0IGNvbnRyYWN0IGZvciBgQGRieC10b29scy9hcHBraXQtbWFzdHJhYDogdGhlXG4gKiBkZXBlbmRlbmN5LWZyZWUgem9kIHNjaGVtYXMgKyBpbmZlcnJlZCB0eXBlcyBldmVyeSBjb25zdW1lciAodGhlXG4gKiBSZWFjdCBjbGllbnQsIGJyb3dzZXIgYnVuZGxlcywgdGhlIHNlcnZlciBwbHVnaW4pIHNoYXJlcy5cbiAqXG4gKiBLZXB0IGZyZWUgb2YgYHBnYCwgYGZhc3RlbWJlZGAsIGFuZCB0aGUgTWFzdHJhIHJ1bnRpbWUgc28gdGhlXG4gKiBjbGllbnQgY2FuIGltcG9ydCB0aGVzZSBzY2hlbWFzIHdpdGhvdXQgZHJhZ2dpbmcgaW4gc2VydmVyLW9ubHlcbiAqIGRlcGVuZGVuY2llcy4gVGhyZWUgbGF5ZXJzIGxpdmUgaGVyZTpcbiAqXG4gKiAgIDEuIFRoZSBkZXNjcmlwdG9yIHB1Ymxpc2hlZCBieSBgTWFzdHJhUGx1Z2luLmNsaWVudENvbmZpZygpYFxuICogICAgICBwbHVzIHRoZSBSRVNUIHBheWxvYWRzIGl0cyByb3V0ZXMgcmV0dXJuIChtb2RlbHMsIGhpc3RvcnksXG4gKiAgICAgIHN1Z2dlc3Rpb25zLCBjaGFydCBlbWJlZHMsIHN0YXRlbWVudCBkYXRhKS4gVGhlIHNlcnZlclxuICogICAgICBkZXJpdmVzIGV2ZXJ5IHBhdGggZnJvbSB0aGUgcGx1Z2luIG1vdW50IGFuZCBwdWJsaXNoZXMgdGhlXG4gKiAgICAgIHJlc29sdmVkIHBhdGhzIHNvIHRoZSBjbGllbnQgY29tcG9zZXMgVVJMcyB3aXRob3V0XG4gKiAgICAgIGhhcmQtY29kaW5nIGAvYXBpL21hc3RyYWAgLSByZW5hbWUgdGhlIHBsdWdpbiBhbmQgdGhlIGNsaWVudFxuICogICAgICBrZWVwcyB3b3JraW5nLlxuICogICAyLiBUaGUgYGN0eC53cml0ZXJgIGV2ZW50IHZvY2FidWxhcnk6IHRoZSB3aXJlLWRlcml2ZWRcbiAqICAgICAge0BsaW5rIEdlbmllQ2hhdEV2ZW50fXMgZnJvbSBgQGRieC10b29scy9nZW5pZS1zaGFyZWRgIHBsdXNcbiAqICAgICAgdGhlIE1hc3RyYS1vbmx5IGFnZW50IGxpZmVjeWNsZSBldmVudHMsIHVuaWZpZWQgYXNcbiAqICAgICAge0BsaW5rIEdlbmllV3JpdGVyRXZlbnR9IHNvIHN1YnNjcmliZXJzIG5hcnJvdyBib3RoIGhhbHZlc1xuICogICAgICB3aXRoIGEgc2luZ2xlIGBzd2l0Y2ggKGV2ZW50LnR5cGUpYC5cbiAqICAgMy4gVGhlIEdlbmllIGFnZW50J3Mgd29ya2Zsb3cgb3V0cHV0IHNoYXBlc1xuICogICAgICAoe0BsaW5rIEdlbmllQWdlbnRSZXN1bHR9IGFuZCBpdHMgc3VtbWFyeSAvIGRhdGFzZXQgaXRlbXMpLlxuICpcbiAqIFRoZSByb3V0ZSBzZWdtZW50cyBsaXZlIGluIHRoZSBzaWJsaW5nIGByb3V0ZXMudHNgXG4gKiAoe0BsaW5rIE1BU1RSQV9ST1VURVN9KSBhbmQgdGhlIGVtYmVkLW1hcmtlciBncmFtbWFyIGluIGBtYXJrZXIudHNgLFxuICogc28gdGhpcyBmaWxlIHN0YXlzIHB1cmVseSBkZWNsYXJhdGl2ZSAoc2NoZW1hcyArIGluZmVycmVkIHR5cGVzKS5cbiAqIFRoZSBicm93c2VyIGNsaWVudCB0aGF0IGRyaXZlcyB0aGVzZSByb3V0ZXMgKGBNYXN0cmFQbHVnaW5DbGllbnRgKVxuICogc2hpcHMgZnJvbSBgQGRieC10b29scy9hcHBraXQtbWFzdHJhLXVpYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZ2VuaWVNb2RlbCwgdHlwZSBHZW5pZUNoYXRFdmVudCwgdHlwZSBNZXNzYWdlU3RhdHVzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWdlbmllXCI7XG5pbXBvcnQgeyBtb2RlbCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjbGllbnQgY29uZmlnIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBKU09OLXNhZmUgZGVzY3JpcHRvciBwdWJsaXNoZWQgYnkgdGhlIE1hc3RyYSBwbHVnaW4nc1xuICogYGNsaWVudENvbmZpZygpYC5cbiAqXG4gKiBPbmx5IHRoZSBpcnJlZHVjaWJsZSBkYXRhIGxpdmVzIGhlcmU6IGBiYXNlUGF0aGAgKHRoZSBvbmUgcGF0aCB0aGVcbiAqIGNsaWVudCBjYW4ndCBvdGhlcndpc2Uga25vdywgc2luY2UgaXQgZW5jb2RlcyB0aGUgcGx1Z2luJ3MgbW91bnRcbiAqIG5hbWUpIHBsdXMgdGhlIHJ1bnRpbWUgYWdlbnQgcm9zdGVyLiBFdmVyeSBjb25jcmV0ZSBlbmRwb2ludCBVUkwgaXNcbiAqIGRlcml2ZWQgZnJvbSBgYmFzZVBhdGhgIGJ5IHRoZSBicm93c2VyIGNsaWVudFxuICogKGBNYXN0cmFQbHVnaW5DbGllbnRgKSB1c2luZyB0aGUgc2hhcmVkIHtAbGluayBNQVNUUkFfUk9VVEVTfVxuICogc2VnbWVudHMsIHNvIHRoZXJlJ3Mgbm90aGluZyB0byBwdWJsaXNoIHBlci1yb3V0ZS5cbiAqXG4gKiBGaWVsZHM6XG4gKiAgIC0gYGJhc2VQYXRoYDogcGx1Z2luIG1vdW50IHBhdGguIEFsd2F5cyBgL2FwaS88cGx1Z2luTmFtZT5gLiBGZWVkXG4gKiAgICAgaXQgdG8gYG5ldyBNYXN0cmFQbHVnaW5DbGllbnQoY29uZmlnKWAgKGZyb21cbiAqICAgICBgQGRieC10b29scy9hcHBraXQtbWFzdHJhLXVpYCkgdG8gZ2V0IGEgdHlwZWQgY2xpZW50IG92ZXIgZXZlcnlcbiAqICAgICByb3V0ZSBwbHVzIHRoZSBzdGFuZGFyZCBhZ2VudCBzdHJlYW0uXG4gKiAgIC0gYGRlZmF1bHRBZ2VudGA6IGFnZW50IGlkIHRoZSBjbGllbnQgY29udmVyc2VzIHdpdGggd2hlbiBpdFxuICogICAgIGRvZXNuJ3QgbmFtZSBvbmUuXG4gKiAgIC0gYGFnZW50c2A6IGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnQgaWQgaW4gcmVnaXN0cmF0aW9uIG9yZGVyLlxuICogICAtIGBmZWVkYmFja0VuYWJsZWRgOiB3aGV0aGVyIHRoZSBzZXJ2ZXIgY2FuIGxvZyB1c2VyIGZlZWRiYWNrIHRvXG4gKiAgICAgTUxmbG93IChNTGZsb3cgdHJhY2luZyBpcyBjb25maWd1cmVkKS4gRHJpdmVzIHdoZXRoZXIgdGhlIGNoYXQgVUlcbiAqICAgICBzdXJmYWNlcyB0aHVtYnMgLyBjb21tZW50IGNvbnRyb2xzLiBEZWZhdWx0cyB0byBgZmFsc2VgIHNvIGFcbiAqICAgICBjb25maWcgcHVibGlzaGVkIGJ5IGFuIG9sZGVyIHNlcnZlciAod2l0aG91dCB0aGUgZmllbGQpIHBhcnNlc1xuICogICAgIGNsZWFubHkgdG8gXCJvZmZcIi5cbiAqL1xuZXhwb3J0IGNvbnN0IE1hc3RyYUNsaWVudENvbmZpZ1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgYmFzZVBhdGg6IHouc3RyaW5nKCksXG4gIGRlZmF1bHRBZ2VudDogei5zdHJpbmcoKSxcbiAgYWdlbnRzOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBmZWVkYmFja0VuYWJsZWQ6IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxufSk7XG5leHBvcnQgdHlwZSBNYXN0cmFDbGllbnRDb25maWcgPSB6LmluZmVyPHR5cGVvZiBNYXN0cmFDbGllbnRDb25maWdTY2hlbWE+O1xuXG4vKipcbiAqIEpTT04gcGF5bG9hZCByZXR1cm5lZCBieSBgR0VUICR7YmFzZVBhdGh9L2RlZmF1bHQtbW9kZWxbP2FnZW50SWQ9XWAuIFRoZVxuICogc3RhdGljIGRlZmF1bHQgbW9kZWwgdGhlIGFnZW50IHJlc29sdmVzIHRvIHdoZW4gdGhlIGNsaWVudCBwaW5zIG5vIG1vZGVsLFxuICogYXMgYm90aCB0aGUgcmF3IHNlcnZpbmctZW5kcG9pbnQgYG1vZGVsYCBpZCBhbmQgYSBgZGlzcGxheU5hbWVgICh0aGVcbiAqIGh1bWFuaXplZCBsYWJlbCB0aGUgcGlja2VyIHNob3dzKS4gQm90aCBhcmUgYG51bGxgIHdoZW4gdGhlIGFnZW50IGRlY2lkZXNcbiAqIGl0cyBtb2RlbCBkeW5hbWljYWxseSBhdCBjYWxsIHRpbWUgKG5vdGhpbmcgc3RhdGljIHRvIGFkdmVydGlzZSkuIExldHMgdGhlXG4gKiBwaWNrZXIgbGFiZWwgaXRzIGRlZmF1bHQgb3B0aW9uIFdJVEhPVVQgd2FpdGluZyBvbiB0aGUgYC9tb2RlbHNgIGNhdGFsb2d1ZSxcbiAqIHNvIGl0IG5ldmVyIGZsYXNoZXMgYSByYXcgaWQgb24gbG9hZC4gS2VwdCBvZmYgdGhlIHN0YXRpYyBib290c3RyYXBcbiAqIGBjbGllbnRDb25maWdgIG9uIHB1cnBvc2U6IGl0IGlzIHBlci1hZ2VudCBhbmQgY2FuIGJlIGR5bmFtaWMsIHNvIGl0IGlzXG4gKiBmZXRjaGVkIGxpa2UgYC9tb2RlbHNgLlxuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdE1vZGVsUmVzcG9uc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGFnZW50SWQ6IHouc3RyaW5nKCksXG4gIG1vZGVsOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG4gIGRpc3BsYXlOYW1lOiB6LnN0cmluZygpLm51bGxhYmxlKCksXG59KTtcbmV4cG9ydCB0eXBlIERlZmF1bHRNb2RlbFJlc3BvbnNlID0gei5pbmZlcjx0eXBlb2YgRGVmYXVsdE1vZGVsUmVzcG9uc2VTY2hlbWE+O1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1vZGVsIGNhdGFsb2d1ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogSlNPTiBwYXlsb2FkIHJldHVybmVkIGJ5IGBHRVQgJHtiYXNlUGF0aH0vbW9kZWxzYC4gV3JhcHMgdGhlIHNoYXJlZFxuICoge0BsaW5rIG1vZGVsLlNlcnZpbmdFbmRwb2ludFN1bW1hcnlTY2hlbWF9IChyZS1leHBvcnRlZCBmcm9tXG4gKiBgQGRieC10b29scy9zaGFyZWQtbW9kZWxgKSBzbyB0aGUgY2F0YWxvZ3VlXG4gKiBkZXNjcmlwdG9yIGhhcyBhIHNpbmdsZSBkZWZpbml0aW9uIHRoZSBjbGllbnQsIHNlcnZlciwgYW5kIHRoZVxuICogc3RhbmRhbG9uZSBgQGRieC10b29scy9tb2RlbGAgdG9vbGtpdCBhbGwgYWdyZWUgb24uXG4gKi9cbmV4cG9ydCBjb25zdCBTZXJ2aW5nRW5kcG9pbnRzUmVzcG9uc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGVuZHBvaW50czogei5hcnJheShtb2RlbC5TZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5U2NoZW1hKSxcbn0pO1xuZXhwb3J0IHR5cGUgU2VydmluZ0VuZHBvaW50c1Jlc3BvbnNlID0gei5pbmZlcjx0eXBlb2YgU2VydmluZ0VuZHBvaW50c1Jlc3BvbnNlU2NoZW1hPjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY2hhdCBoaXN0b3J5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogU3RydWN0dXJhbCBzaGFwZSBmb3IgYW4gQUkgU0RLIFY1IGBVSU1lc3NhZ2VgLiBEZWZpbmVkIGxvY2FsbHlcbiAqIHNvIHRoZSBzaGFyZWQgdHlwZXMgcGFja2FnZSBzdGF5cyBkZXBlbmRlbmN5LWZyZWUgKG5vIGBhaWBcbiAqIGltcG9ydCkuIFRoZSBydW50aW1lIHZhbHVlcyByZXR1cm5lZCBieSB0aGUgYC9oaXN0b3J5YCBlbmRwb2ludFxuICogYXJlIHByb2R1Y2VkIGJ5IGB0b0FJU2RrVjVNZXNzYWdlc2AgYW5kIGFyZSAxOjEgY29tcGF0aWJsZSB3aXRoXG4gKiBgVUlNZXNzYWdlYCBmcm9tIHRoZSBgYWlgIHBhY2thZ2U7IGNsaWVudHMgY2FuIHNhZmVseSBjYXN0IHdoZW5cbiAqIG5lZWRlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1hc3RyYUhpc3RvcnlVSU1lc3NhZ2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIGlkOiB6LnN0cmluZygpLFxuICByb2xlOiB6LmVudW0oW1wic3lzdGVtXCIsIFwidXNlclwiLCBcImFzc2lzdGFudFwiXSksXG4gIHBhcnRzOiB6LmFycmF5KHoudW5rbm93bigpKS5yZWFkb25seSgpLFxuICBtZXRhZGF0YTogei51bmtub3duKCkub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IHR5cGUgTWFzdHJhSGlzdG9yeVVJTWVzc2FnZSA9IHouaW5mZXI8dHlwZW9mIE1hc3RyYUhpc3RvcnlVSU1lc3NhZ2VTY2hlbWE+O1xuXG4vKipcbiAqIEpTT04gcGF5bG9hZCByZXR1cm5lZCBieSBgR0VUICR7YmFzZVBhdGh9L2hpc3RvcnlgLlxuICpcbiAqIEZpZWxkczpcbiAqICAgLSBgdWlNZXNzYWdlc2A6IHBhZ2Ugb2YgVUktZm9ybWF0dGVkIG1lc3NhZ2VzLCBvbGRlc3QgLT4gbmV3ZXN0LlxuICogICAgIEFsd2F5cyBjaHJvbm9sb2dpY2FsIHJlZ2FyZGxlc3Mgb2YgdGhlIHVuZGVybHlpbmcgcGFnaW5hdGlvblxuICogICAgIG9yZGVyIHNvIHRoZSBjbGllbnQgY2FuIHByZXBlbmQgdGhlIGFycmF5IHRvIHRoZSBsaXZlXG4gKiAgICAgdHJhbnNjcmlwdCB3aXRob3V0IHNvcnRpbmcuXG4gKiAgIC0gYHBhZ2VgOiB6ZXJvLWluZGV4ZWQgcGFnZSB0aGF0IHByb2R1Y2VkIHRoaXMgcmVzcG9uc2UuXG4gKiAgIC0gYHBlclBhZ2VgOiBudW1iZXIgb2YgaXRlbXMgcmVxdWVzdGVkIHBlciBwYWdlLlxuICogICAtIGB0b3RhbGA6IHRvdGFsIG51bWJlciBvZiBtZXNzYWdlcyBpbiB0aGUgdGhyZWFkLlxuICogICAtIGBoYXNNb3JlYDogdHJ1ZSB3aGVuIGF0IGxlYXN0IG9uZSBvbGRlciBwYWdlIGlzIHN0aWxsXG4gKiAgICAgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgY29uc3QgTWFzdHJhSGlzdG9yeVJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICB1aU1lc3NhZ2VzOiB6LmFycmF5KE1hc3RyYUhpc3RvcnlVSU1lc3NhZ2VTY2hlbWEpLFxuICBwYWdlOiB6Lm51bWJlcigpLFxuICBwZXJQYWdlOiB6Lm51bWJlcigpLFxuICB0b3RhbDogei5udW1iZXIoKSxcbiAgaGFzTW9yZTogei5ib29sZWFuKCksXG59KTtcbmV4cG9ydCB0eXBlIE1hc3RyYUhpc3RvcnlSZXNwb25zZSA9IHouaW5mZXI8dHlwZW9mIE1hc3RyYUhpc3RvcnlSZXNwb25zZVNjaGVtYT47XG5cbi8qKlxuICogSlNPTiBwYXlsb2FkIHJldHVybmVkIGJ5IGBERUxFVEUgJHtiYXNlUGF0aH0vaGlzdG9yeWAuIERlbGV0ZXNcbiAqIGV2ZXJ5IHBlcnNpc3RlZCBtZXNzYWdlICsgd29ya2Zsb3cgc25hcHNob3QgdGllZCB0byB0aGUgY2FsbGVyJ3NcbiAqIHRocmVhZCwgc28gdGhlIG5leHQgY2hhdCB0dXJuIHN0YXJ0cyBmcm9tIGEgY2xlYW4gc2xhdGUuIFRoZVxuICogc2Vzc2lvbiBjb29raWUgdGhhdCBhbmNob3JzIHRoZSB0aHJlYWQgaWQgaXMgcHJlc2VydmVkIHNvIHRoZVxuICogY2FsbGVyIGRvZXNuJ3QgbG9zZSBpdHMgaWRlbnRpdHkgLSBvbmx5IHRoZSBjb250ZW50cyBnbyBhd2F5LlxuICpcbiAqIGBva2AgaXMgYWx3YXlzIGB0cnVlYCBvbiBzdWNjZXNzOyB0aGUgcmVzcG9uc2Ugb2JqZWN0IGlzIGtlcHRcbiAqIGFzIGEgc3RydWN0ICh2cyBhIGJhcmUgMjA0KSBzbyBmdXR1cmUgZmllbGRzIChlLmcuIGBkZWxldGVkQXRgLFxuICogYG1lc3NhZ2VzYCkgY2FuIGJlIGFkZGVkIHdpdGhvdXQgYnVtcGluZyB0aGUgY29udHJhY3QuXG4gKlxuICogRmllbGRzOlxuICogICAtIGBva2A6IGxpdGVyYWwgYHRydWVgIG9uIHN1Y2Nlc3MuXG4gKiAgIC0gYGFnZW50SWRgOiBhZ2VudCB3aG9zZSBoaXN0b3J5IHdhcyBjbGVhcmVkLlxuICogICAtIGB0aHJlYWRJZGA6IHRocmVhZCBpZCB0aGF0IHdhcyB3aXBlZC5cbiAqICAgLSBgY2xlYXJlZGA6IG51bWJlciBvZiBtZXNzYWdlcyB0aGUgdGhyZWFkIGhlbGQgYmVmb3JlXG4gKiAgICAgZGVsZXRpb24uIFVzZWZ1bCBmb3IgY2xpZW50LXNpZGUgXCJjbGVhcmVkIDEyIG1lc3NhZ2VzXCJcbiAqICAgICB0b2FzdHM7IGAwYCBpcyByZXBvcnRlZCB3aGVuIHRoZSB0aHJlYWQgd2FzIGFscmVhZHkgZW1wdHlcbiAqICAgICAoY2FsbCBpcyBpZGVtcG90ZW50KS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1hc3RyYUNsZWFySGlzdG9yeVJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBvazogei5saXRlcmFsKHRydWUpLFxuICBhZ2VudElkOiB6LnN0cmluZygpLFxuICB0aHJlYWRJZDogei5zdHJpbmcoKSxcbiAgY2xlYXJlZDogei5udW1iZXIoKSxcbn0pO1xuZXhwb3J0IHR5cGUgTWFzdHJhQ2xlYXJIaXN0b3J5UmVzcG9uc2UgPSB6LmluZmVyPHR5cGVvZiBNYXN0cmFDbGVhckhpc3RvcnlSZXNwb25zZVNjaGVtYT47XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRocmVhZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBBIHNpbmdsZSBjb252ZXJzYXRpb24gdGhyZWFkIHRoZSByZXNvdXJjZSAoYXV0aGVudGljYXRlZCB1c2VyKSBvd25zLFxuICogYXMgcmV0dXJuZWQgYnkgYEdFVCAke2Jhc2VQYXRofS90aHJlYWRzYC4gTWlycm9ycyBNYXN0cmEnc1xuICogYFN0b3JhZ2VUaHJlYWRUeXBlYCBidXQgd2l0aCBKU09OLXNhZmUgSVNPLTg2MDEgdGltZXN0YW1wcyAodGhlIHdpcmVcbiAqIGNhbid0IGNhcnJ5IGBEYXRlYCkuXG4gKlxuICogRmllbGRzOlxuICogICAtIGBpZGA6IHRocmVhZCBpZC4gUGFzcyBpdCBiYWNrIGFzIHRoZSB0aHJlYWQtc2VsZWN0aW9uIGhlYWRlclxuICogICAgIChgVEhSRUFEX0lEX0hFQURFUmApIG9uIGEgc3RyZWFtIC8gaGlzdG9yeSAvIGRlbGV0ZSBjYWxsIHRvIGFjdFxuICogICAgIG9uIHRoaXMgY29udmVyc2F0aW9uLlxuICogICAtIGB0aXRsZWA6IGh1bWFuLXJlYWRhYmxlIHRpdGxlLiBQcmVzZW50IG9uY2UgdGhlIGFnZW50J3MgbWVtb3J5XG4gKiAgICAgaGFzIGF1dG8tZ2VuZXJhdGVkIG9uZSAoYWZ0ZXIgdGhlIGZpcnN0IHR1cm4pOyBhYnNlbnQgb24gYVxuICogICAgIGJyYW5kLW5ldyB0aHJlYWQsIHNvIHRoZSBVSSBmYWxscyBiYWNrIHRvIGEgcGxhY2Vob2xkZXIuXG4gKiAgIC0gYHJlc291cmNlSWRgOiBvd25pbmcgcmVzb3VyY2UgKHRoZSB1c2VyIGlkKS4gQWx3YXlzIHRoZSBjYWxsZXInc1xuICogICAgIG93biByZXNvdXJjZSAtIHRoZSBsaXN0IHJvdXRlIGZpbHRlcnMgYnkgaXQgc2VydmVyLXNpZGUuXG4gKiAgIC0gYGNyZWF0ZWRBdGAgLyBgdXBkYXRlZEF0YDogSVNPLTg2MDEgdGltZXN0YW1wcy4gYHVwZGF0ZWRBdGAgaXNcbiAqICAgICB0aGUgbmF0dXJhbCBzb3J0IGtleSBmb3IgXCJtb3N0IHJlY2VudCBjb252ZXJzYXRpb25zIGZpcnN0XCIuXG4gKiAgIC0gYG1ldGFkYXRhYDogb3BhcXVlIHRocmVhZCBtZXRhZGF0YSwgcGFzc2VkIHRocm91Z2ggdW50b3VjaGVkLlxuICovXG5leHBvcnQgY29uc3QgTWFzdHJhVGhyZWFkU2NoZW1hID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKSxcbiAgdGl0bGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgcmVzb3VyY2VJZDogei5zdHJpbmcoKSxcbiAgY3JlYXRlZEF0OiB6LnN0cmluZygpLFxuICB1cGRhdGVkQXQ6IHouc3RyaW5nKCksXG4gIG1ldGFkYXRhOiB6LnVua25vd24oKS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgdHlwZSBNYXN0cmFUaHJlYWQgPSB6LmluZmVyPHR5cGVvZiBNYXN0cmFUaHJlYWRTY2hlbWE+O1xuXG4vKipcbiAqIEpTT04gcGF5bG9hZCByZXR1cm5lZCBieSBgR0VUICR7YmFzZVBhdGh9L3RocmVhZHNgLiBPbmUgcGFnZSBvZiB0aGVcbiAqIGNhbGxlcidzIGNvbnZlcnNhdGlvbiB0aHJlYWRzLCBuZXdlc3QgKGB1cGRhdGVkQXRgIERFU0MpIGZpcnN0LlxuICpcbiAqIEZpZWxkczpcbiAqICAgLSBgdGhyZWFkc2A6IHBhZ2Ugb2YgdGhyZWFkcyBmb3IgdGhlIGNhbGxlcidzIHJlc291cmNlLlxuICogICAtIGBwYWdlYDogemVyby1pbmRleGVkIHBhZ2UgdGhhdCBwcm9kdWNlZCB0aGlzIHJlc3BvbnNlLlxuICogICAtIGBwZXJQYWdlYDogbnVtYmVyIG9mIGl0ZW1zIHJlcXVlc3RlZCBwZXIgcGFnZS5cbiAqICAgLSBgdG90YWxgOiB0b3RhbCBudW1iZXIgb2YgdGhyZWFkcyB0aGUgcmVzb3VyY2Ugb3ducy5cbiAqICAgLSBgaGFzTW9yZWA6IHRydWUgd2hlbiBhdCBsZWFzdCBvbmUgbW9yZSBwYWdlIGlzIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1hc3RyYVRocmVhZHNSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdGhyZWFkczogei5hcnJheShNYXN0cmFUaHJlYWRTY2hlbWEpLFxuICBwYWdlOiB6Lm51bWJlcigpLFxuICBwZXJQYWdlOiB6Lm51bWJlcigpLFxuICB0b3RhbDogei5udW1iZXIoKSxcbiAgaGFzTW9yZTogei5ib29sZWFuKCksXG59KTtcbmV4cG9ydCB0eXBlIE1hc3RyYVRocmVhZHNSZXNwb25zZSA9IHouaW5mZXI8dHlwZW9mIE1hc3RyYVRocmVhZHNSZXNwb25zZVNjaGVtYT47XG5cbi8qKlxuICogSlNPTiBwYXlsb2FkIHJldHVybmVkIGJ5IGBERUxFVEUgJHtiYXNlUGF0aH0vdGhyZWFkc2AgKHRocmVhZCBpZFxuICogc3VwcGxpZWQgdmlhIHRoZSB0aHJlYWQtc2VsZWN0aW9uIGhlYWRlciAvIGB0aHJlYWRJZGAgcXVlcnkpLiBXaXBlc1xuICogdGhlIG5hbWVkIHRocmVhZCBhbmQgZXZlcnkgbWVzc2FnZSBvbiBpdC5cbiAqXG4gKiBGaWVsZHM6XG4gKiAgIC0gYG9rYDogbGl0ZXJhbCBgdHJ1ZWAgb24gc3VjY2Vzcy5cbiAqICAgLSBgYWdlbnRJZGA6IGFnZW50IHdob3NlIHRocmVhZCB3YXMgZGVsZXRlZC5cbiAqICAgLSBgdGhyZWFkSWRgOiB0aHJlYWQgaWQgdGhhdCB3YXMgcmVtb3ZlZC5cbiAqICAgLSBgZGVsZXRlZGA6IGB0cnVlYCB3aGVuIGEgdGhyZWFkIHJvdyBleGlzdGVkIGFuZCB3YXMgcmVtb3ZlZCxcbiAqICAgICBgZmFsc2VgIHdoZW4gaXQgd2FzIGFscmVhZHkgZ29uZSAoY2FsbCBpcyBpZGVtcG90ZW50KS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1hc3RyYURlbGV0ZVRocmVhZFJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBvazogei5saXRlcmFsKHRydWUpLFxuICBhZ2VudElkOiB6LnN0cmluZygpLFxuICB0aHJlYWRJZDogei5zdHJpbmcoKSxcbiAgZGVsZXRlZDogei5ib29sZWFuKCksXG59KTtcbmV4cG9ydCB0eXBlIE1hc3RyYURlbGV0ZVRocmVhZFJlc3BvbnNlID0gei5pbmZlcjx0eXBlb2YgTWFzdHJhRGVsZXRlVGhyZWFkUmVzcG9uc2VTY2hlbWE+O1xuXG4vKiogTG9uZ2VzdCB0aHJlYWQgdGl0bGUgdGhlIHJlbmFtZSByb3V0ZSBhY2NlcHRzICh0cmltbWVkIHNlcnZlci1zaWRlKS4gKi9cbmV4cG9ydCBjb25zdCBNQVNUUkFfVEhSRUFEX1RJVExFX01BWCA9IDIwMDtcblxuLyoqXG4gKiBKU09OIGJvZHkgZm9yIGBQQVRDSCAke2Jhc2VQYXRofS90aHJlYWRzYCAodGhyZWFkIGlkIHN1cHBsaWVkIHZpYSB0aGVcbiAqIHRocmVhZC1zZWxlY3Rpb24gaGVhZGVyIC8gYHRocmVhZElkYCBxdWVyeSkuIFJlbmFtZXMgYSBzaW5nbGVcbiAqIGNvbnZlcnNhdGlvbi5cbiAqXG4gKiBGaWVsZHM6XG4gKiAgIC0gYHRpdGxlYDogdGhlIG5ldyBodW1hbi1yZWFkYWJsZSB0aXRsZS4gVHJpbW1lZCBhbmQgY2FwcGVkIGF0XG4gKiAgICAge0BsaW5rIE1BU1RSQV9USFJFQURfVElUTEVfTUFYfSBjaGFyYWN0ZXJzIHNlcnZlci1zaWRlOyBtdXN0IGJlXG4gKiAgICAgbm9uLWVtcHR5IGFmdGVyIHRyaW1taW5nLlxuICovXG5leHBvcnQgY29uc3QgTWFzdHJhVXBkYXRlVGhyZWFkUmVxdWVzdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdGl0bGU6IHouc3RyaW5nKCkudHJpbSgpLm1pbigxKS5tYXgoTUFTVFJBX1RIUkVBRF9USVRMRV9NQVgpLFxufSk7XG5leHBvcnQgdHlwZSBNYXN0cmFVcGRhdGVUaHJlYWRSZXF1ZXN0ID0gei5pbmZlcjx0eXBlb2YgTWFzdHJhVXBkYXRlVGhyZWFkUmVxdWVzdFNjaGVtYT47XG5cbi8qKlxuICogSlNPTiBwYXlsb2FkIHJldHVybmVkIGJ5IGBQQVRDSCAke2Jhc2VQYXRofS90aHJlYWRzYC4gRWNob2VzIHRoZVxuICogcmVuYW1lZCB0aHJlYWQgaW4gaXRzIHBvc3QtdXBkYXRlIHdpcmUgc2hhcGUgc28gdGhlIGNsaWVudCBjYW4gcmVmbGVjdFxuICogdGhlIG5ldyB0aXRsZSB3aXRob3V0IGEgcmUtZmV0Y2guXG4gKlxuICogRmllbGRzOlxuICogICAtIGBva2A6IGxpdGVyYWwgYHRydWVgIG9uIHN1Y2Nlc3MuXG4gKiAgIC0gYGFnZW50SWRgOiBhZ2VudCB3aG9zZSB0aHJlYWQgd2FzIHJlbmFtZWQuXG4gKiAgIC0gYHRocmVhZGA6IHRoZSB1cGRhdGVkIHRocmVhZCAoY2FycmllcyB0aGUgbmV3IGB0aXRsZWApLlxuICovXG5leHBvcnQgY29uc3QgTWFzdHJhVXBkYXRlVGhyZWFkUmVzcG9uc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG9rOiB6LmxpdGVyYWwodHJ1ZSksXG4gIGFnZW50SWQ6IHouc3RyaW5nKCksXG4gIHRocmVhZDogTWFzdHJhVGhyZWFkU2NoZW1hLFxufSk7XG5leHBvcnQgdHlwZSBNYXN0cmFVcGRhdGVUaHJlYWRSZXNwb25zZSA9IHouaW5mZXI8dHlwZW9mIE1hc3RyYVVwZGF0ZVRocmVhZFJlc3BvbnNlU2NoZW1hPjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN1Z2dlc3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEpTT04gcGF5bG9hZCByZXR1cm5lZCBieSBgR0VUICR7YmFzZVBhdGh9L3N1Z2dlc3Rpb25zYC5cbiAqXG4gKiBDYXJyaWVzIHRoZSBjdXJhdGVkIHN0YXJ0ZXIgcXVlc3Rpb25zIGZvciBhbiBhZ2VudCdzIEdlbmllIHNwYWNlIC1cbiAqIHRoZSBgc2FtcGxlX3F1ZXN0aW9uc2AgYW4gYXV0aG9yIGNvbmZpZ3VyZWQgb24gdGhlIHNwYWNlLCBzdXJmYWNlZFxuICogYXMgb25lLXRhcCBwcm9tcHRzIG9uIHRoZSBjaGF0J3MgZW1wdHkgc3RhdGUuIGBxdWVzdGlvbnNgIGlzIGVtcHR5XG4gKiB3aGVuIHRoZSBhZ2VudCBoYXMgbm8gR2VuaWUgc3BhY2UgKG9yIHRoZSBzcGFjZSBkZWZpbmVzIG5vbmUpLCBzb1xuICogdGhlIGNsaWVudCByZW5kZXJzIG5vdGhpbmcgaW4gdGhhdCBjYXNlIHJhdGhlciB0aGFuIGZhbGxpbmcgYmFjayB0b1xuICogYnVpbHQtaW4gZXhhbXBsZSBwcm9tcHRzLlxuICovXG5leHBvcnQgY29uc3QgTWFzdHJhU3VnZ2VzdGlvbnNSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgcXVlc3Rpb25zOiB6LmFycmF5KHouc3RyaW5nKCkpLFxufSk7XG5leHBvcnQgdHlwZSBNYXN0cmFTdWdnZXN0aW9uc1Jlc3BvbnNlID0gei5pbmZlcjx0eXBlb2YgTWFzdHJhU3VnZ2VzdGlvbnNSZXNwb25zZVNjaGVtYT47XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjaGFydHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogQWxsb3dlZCBjaGFydCB0eXBlcyB0aGUgcGxhbm5lciBjYW4gcGljay4gRGVmaW5lZCBhcyBhXG4gKiBkaXNjcmltaW5hdGVkIGxpdGVyYWwgdW5pb24gc28gZWFjaCB2YXJpYW50IGNhcnJpZXMgaXRzIG93blxuICogYC5kZXNjcmliZSgpYCBjbGF1c2UgLSB0aGUgc2VydmVyLXNpZGUgcGxhbm5lcidzIHByb21wdFxuICogZm9ybWF0dGVyIHdhbGtzIGAub3B0aW9uc2AgdG8gaW5saW5lIHRoZSBkZXNjcmlwdGlvbnMgaW50byB0aGVcbiAqIG1vZGVsIGluc3RydWN0aW9ucywga2VlcGluZyB0aGUgcHJvbXB0IGluIGxvY2stc3RlcCB3aXRoIHRoZVxuICogc2NoZW1hIGJ5IGNvbnN0cnVjdGlvbi4gVGhlIHJ1bnRpbWUgdHlwZSBpcyB0aGUgcGxhaW4gc3RyaW5nXG4gKiB1bmlvbiAoYFwiYmFyXCIgfCBcImxpbmVcIiB8IC4uLmApLCBzbyBjb25zdW1lcnMgdGhhdCBqdXN0IG5lZWQgYVxuICogZGlzY3JpbWluYXRvciB2YWx1ZSBiZWhhdmUgdGhlIHNhbWUgYXMgaWYgaXQgd2VyZSBhXG4gKiBgei5lbnVtKFsuLi5dKWAuXG4gKi9cbmV4cG9ydCBjb25zdCBDaGFydFR5cGVTY2hlbWEgPSB6XG4gIC51bmlvbihbXG4gICAgelxuICAgICAgLmxpdGVyYWwoXCJiYXJcIilcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgXCJjb21wYXJpbmcgYSBudW1lcmljIHZhbHVlIGFjcm9zcyBhIHNtYWxsL21lZGl1bSBzZXQgb2YgZGlzY3JldGUgY2F0ZWdvcmllcyAodG9wLU4sIHJhbmtpbmcsIGdyb3VwLWJ5KVwiLFxuICAgICAgKSxcbiAgICB6XG4gICAgICAubGl0ZXJhbChcImxpbmVcIilcbiAgICAgIC5kZXNjcmliZShcbiAgICAgICAgXCJvcmRlcmVkLWF4aXMgdHJlbmQgKHRpbWUgc2VyaWVzLCBzZXF1ZW5jZSwgcmFuaykgd2hlcmUgdGhlIHgtYXhpcyBoYXMgbmF0dXJhbCBvcmRlclwiLFxuICAgICAgKSxcbiAgICB6LmxpdGVyYWwoXCJhcmVhXCIpLmRlc2NyaWJlKFwic3RhY2tlZC10cmVuZCBlbXBoYXNpcyAtIGN1bXVsYXRpdmUgb3IgY29tcG9zaXRpb24gb3ZlciB0aW1lXCIpLFxuICAgIHpcbiAgICAgIC5saXRlcmFsKFwic2NhdHRlclwiKVxuICAgICAgLmRlc2NyaWJlKFwidHdvLW51bWVyaWMtYXhpcyBjb3JyZWxhdGlvbnMgYmV0d2VlbiBmaWVsZHMgKGUuZy4gcHJpY2UgdnMuIHF1YW50aXR5KVwiKSxcbiAgICB6LmxpdGVyYWwoXCJwaWVcIikuZGVzY3JpYmUoXCJwYXJ0cy1vZi1hLXdob2xlIHdoZW4gMi03IGNhdGVnb3JpZXMgc3VtIHRvIGEgbWVhbmluZ2Z1bCB0b3RhbFwiKSxcbiAgXSlcbiAgLmRlc2NyaWJlKFwiVGhlIGNoYXJ0IHNoYXBlIHRoYXQgYmVzdCBtYXRjaGVzIHRoZSBkYXRhIGFuZCBpbnRlbnQuXCIpO1xuZXhwb3J0IHR5cGUgQ2hhcnRUeXBlID0gei5pbmZlcjx0eXBlb2YgQ2hhcnRUeXBlU2NoZW1hPjtcblxuLyoqXG4gKiBSZXNvbHZlZCBjaGFydCBwbGFuIGEgc2V0dGxlZCBjaGFydCBlbnRyeSBjYXJyaWVzIG9uIGl0c1xuICogYHJlc3VsdGAgZmllbGQuIGBvcHRpb25gIGlzIHRoZSBmdWxsIEVjaGFydHMgc3BlYzsgcGFzc1xuICogc3RyYWlnaHQgaW50byBgPFJlYWN0RUNoYXJ0cyBvcHRpb249ey4uLn0+YC5cbiAqL1xuZXhwb3J0IGNvbnN0IENoYXJ0UmVzdWx0U2NoZW1hID0gei5vYmplY3Qoe1xuICBjaGFydFR5cGU6IENoYXJ0VHlwZVNjaGVtYSxcbiAgb3B0aW9uOiB6XG4gICAgLnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSlcbiAgICAuZGVzY3JpYmUoXG4gICAgICBcIkZ1bGx5LXJlc29sdmVkIEVjaGFydHMgYEVDaGFydHNPcHRpb25gIEpTT04gZm9yIHRoaXMgY2hhcnQgLSBkcm9wIGRpcmVjdGx5IGludG8gYW4gRWNoYXJ0cyBpbnN0YW5jZSAob3IgYDxSZWFjdEVDaGFydHMgb3B0aW9uPXsuLi59IC8+YCkgd2l0aG91dCBmdXJ0aGVyIHByb2Nlc3NpbmcuIEluY2x1ZGVzIHRpdGxlIC8gdG9vbHRpcCAvIGxlZ2VuZCAvIGdyaWQgLyBheGlzIC8gc2VyaWVzIGRlZmF1bHRzIGFscmVhZHkgbWVyZ2VkIGluLlwiLFxuICAgICksXG59KTtcbmV4cG9ydCB0eXBlIENoYXJ0UmVzdWx0ID0gei5pbmZlcjx0eXBlb2YgQ2hhcnRSZXN1bHRTY2hlbWE+O1xuXG4vKipcbiAqIFdpcmUtZm9ybWF0IEFORCBzZXJ2ZXItc2lkZSBjYWNoZSBzaGFwZSBmb3IgYSBjaGFydCBlbnRyeS5cbiAqIFRocmVlIGxpZmVjeWNsZSBzdGF0ZXMgaW5mZXJyZWQgZnJvbSB0aGUgdHdvIG9wdGlvbmFsIGZpZWxkc1xuICogKG5vIGRpc2NyaW1pbmF0b3IgbmVlZGVkKTpcbiAqXG4gKiAgIC0gYHJlc3VsdGAgc2V0ICAgICAgICAgICAgICAgICAgICAtPiBjaGFydCBpcyByZWFkeSB0byByZW5kZXJcbiAqICAgLSBgZXJyb3JgIHNldCAgICAgICAgICAgICAgICAgICAgIC0+IHBsYW5uZXIgLyBkYXRhIGZldGNoIGZhaWxlZFxuICogICAtIGJvdGggYHJlc3VsdGAgYW5kIGBlcnJvcmAgdW5zZXQgLT4gc3RpbGwgcHJvY2Vzc2luZ1xuICpcbiAqIGBvcHRpb25gIGlzIHR5cGVkIGFzIGEgZ2VuZXJpYyByZWNvcmQgc28gdGhpcyBwYWNrYWdlIHN0YXlzXG4gKiBkZXBlbmRlbmN5LWZyZWUgb2YgYGVjaGFydHNgLiBUaGUgc2VydmVyIChgY2hhcnQudHNgKSBpbXBvcnRzXG4gKiB0aGlzIHNjaGVtYSBkaXJlY3RseTsgdGhlIGRlbW8gY2xpZW50IHBvbGxzIHRoZVxuICogYC9lbWJlZC9jaGFydC86aWRgIHJvdXRlIGFuZCBwYXJzZXMgcmVzcG9uc2VzIGFnYWluc3QgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBDaGFydFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgY2hhcnRJZDogelxuICAgIC5zdHJpbmcoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiT3BhcXVlIGlkIG1pbnRlZCBieSB0aGUgY2hhcnQgc3Vic3lzdGVtLiBFbWJlZCB2ZXJiYXRpbSBhcyBgW2NoYXJ0OjxjaGFydElkPl1gIGluIGFnZW50IHByb3NlOyB0aGUgaG9zdCBVSSByZXNvbHZlcyBpdCBhZ2FpbnN0IHRoaXMgY2FjaGUgZW50cnkuXCIsXG4gICAgKSxcbiAgZXJyb3I6IHpcbiAgICAuc3RyaW5nKClcbiAgICAub3B0aW9uYWwoKVxuICAgIC5kZXNjcmliZShcbiAgICAgIFwiRXJyb3IgbWVzc2FnZSB3aGVuIHRoZSBjaGFydCBmYWlsZWQgKGRhdGEgZmV0Y2ggZXJyb3IsIHBsYW5uZXIgZXJyb3IsIGVtcHR5IGRhdGFzZXQpLiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgcmVzdWx0YDsgYWJzZW50IG9uIHN1Y2Nlc3MgYW5kIHdoaWxlIHByb2Nlc3NpbmcuXCIsXG4gICAgKSxcbiAgcmVzdWx0OiBDaGFydFJlc3VsdFNjaGVtYS5vcHRpb25hbCgpLmRlc2NyaWJlKFxuICAgIFwiUmVzb2x2ZWQgY2hhcnQgcGxhbi4gQWJzZW50IHdoaWxlIHByb2Nlc3NpbmcgYW5kIHdoZW4gdGhlIHJ1biBlcnJvcmVkLlwiLFxuICApLFxufSk7XG5leHBvcnQgdHlwZSBDaGFydCA9IHouaW5mZXI8dHlwZW9mIENoYXJ0U2NoZW1hPjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdGF0ZW1lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBXaXJlLWZvcm1hdCBwYXlsb2FkIHJldHVybmVkIGJ5IGBHRVQgJHtiYXNlUGF0aH0vZW1iZWQvZGF0YS86aWRgLlxuICpcbiAqIE1pcnJvcnMgdGhlIGFnZW50LXNpZGUgYGdldF9zdGF0ZW1lbnRgIHRvb2wncyBvdXRwdXQgc28gdGhlXG4gKiBob3N0IFVJIGFuZCB0aGUgTExNIHNlZSB0aGUgZXhhY3Qgc2FtZSBzaGFwZSBmb3IgdGhlIHNhbWVcbiAqIHN0YXRlbWVudDsgdGhlIHJvdXRlIGlzIHdoYXQgcmVzb2x2ZXMgYFtkYXRhOjxzdGF0ZW1lbnRfaWQ+XWBcbiAqIG1hcmtlcnMgdGhlIGFnZW50IGVtYmVkcyBpbiBwcm9zZS5cbiAqXG4gKiBGaWVsZHM6XG4gKiAgIC0gYGNvbHVtbnNgOiBjb2x1bW4gbmFtZXMgaW4gZGVjbGFyYXRpb24gb3JkZXIuXG4gKiAgIC0gYHJvd3NgOiByb3cgcmVjb3JkcyBrZXllZCBieSBjb2x1bW4gbmFtZS4gQ2VsbCB2YWx1ZXMgYXJlXG4gKiAgICAgZWl0aGVyIGNvZXJjZWQgbnVtYmVycyBvciB0aGUgb3JpZ2luYWwgc3RyaW5ncyAoR2VuaWUgL1xuICogICAgIFN0YXRlbWVudCBFeGVjdXRpb24gcmV0dXJucyBldmVyeSBjZWxsIGFzIGBzdHJpbmcgfCBudWxsYDtcbiAqICAgICBudW1lcmljLWxvb2tpbmcgY2VsbHMgYXJlIGNvZXJjZWQgc2VydmVyLXNpZGUgc28gdGhlIFVJXG4gKiAgICAgY2FuIGZvcm1hdCB3aXRoIGB0YWJ1bGFyLW51bXNgIHdpdGhvdXQgcmUtcGFyc2luZykuXG4gKiAgIC0gYHJvd0NvdW50YDogdG90YWwgcm93IGNvdW50IHVwc3RyZWFtIChpbmRlcGVuZGVudCBvZiB0aGVcbiAqICAgICBgbGltaXRgIGNhcCkuIENvbXBhcmUgYWdhaW5zdCBgcm93cy5sZW5ndGhgIHRvIGRldGVjdFxuICogICAgIHRydW5jYXRpb24gLSBgdHJ1bmNhdGVkYCBpcyB0aGUgcHJlY29tcHV0ZWQgZmxhZy5cbiAqICAgLSBgdHJ1bmNhdGVkYDogYHRydWVgIHdoZW4gdGhlIHNlcnZlciBjbGlwcGVkIHJvd3MgdG8gaG9ub3JcbiAqICAgICB0aGUgcm91dGUncyByb3cgY2FwOyB0aGUgVUkgc2hvdWxkIHN1cmZhY2UgYSBcInNob3dpbmcgTiBvZlxuICogICAgIE0gcm93c1wiIGFmZm9yZGFuY2UgaW4gdGhhdCBjYXNlLlxuICovXG5leHBvcnQgY29uc3QgU3RhdGVtZW50RGF0YVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgY29sdW1uczogei5hcnJheSh6LnN0cmluZygpKSxcbiAgcm93czogei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpLFxuICByb3dDb3VudDogei5udW1iZXIoKSxcbiAgdHJ1bmNhdGVkOiB6LmJvb2xlYW4oKSxcbn0pO1xuZXhwb3J0IHR5cGUgU3RhdGVtZW50RGF0YSA9IHouaW5mZXI8dHlwZW9mIFN0YXRlbWVudERhdGFTY2hlbWE+O1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB3cml0ZXIgc3VyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVGhlIGBUb29sU3RyZWFtYC1zaGFwZWQgd3JpdGVyIHRoZSBNYXN0cmEgR2VuaWUgYWdlbnQgYW5kIGNoYXJ0XG4gKiBoZWxwZXJzIHB1Ymxpc2ggZXZlbnRzIHRocm91Z2guIERlZmluZWQgaGVyZSAodnMgaW1wb3J0ZWQgZnJvbVxuICogYEBtYXN0cmEvY29yZWApIHNvIGhlbHBlcnMgaW4gYEBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYWAgY2FuXG4gKiBhY2NlcHQgYW55IG9iamVjdCB3aXRoIGEgYC53cml0ZWAgbWV0aG9kIHdpdGhvdXQgZHJhZ2dpbmdcbiAqIE1hc3RyYSdzIGZ1bGwgYFRvb2xTdHJlYW1gIChhbmQgaXRzIGFnZW50IC8gdG9vbCB0eXBpbmdzKSBpbnRvXG4gKiBjYWxsIHNpdGVzLiBUaGUgYWN0dWFsIE1hc3RyYSBgY3R4LndyaXRlcmAgaXMgYXNzaWduYWJsZSB0b1xuICogdGhpcyBzaGFwZSBzbyBjYWxsZXJzIHBhc3MgaXQgc3RyYWlnaHQgdGhyb3VnaC5cbiAqXG4gKiBLZXB0IGFzIGEgcGxhaW4gVHlwZVNjcmlwdCBpbnRlcmZhY2UgKHZzIGEgem9kIHNjaGVtYSkgYmVjYXVzZVxuICogdGhlIGNvbnRyYWN0IGlzIGEgbWV0aG9kIC0gem9kIGNhbiBvbmx5IHZhbGlkYXRlIHRoZSBzaGFwZSB2aWFcbiAqIGB6LmN1c3RvbWAsIHdoaWNoIGFkZHMgbm9pc2Ugd2l0aG91dCBidXlpbmcgYW55IHJ1bnRpbWUgY2hlY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhV3JpdGVyIHtcbiAgd3JpdGU6IChjaHVuazogdW5rbm93bikgPT4gdW5rbm93bjtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLSBtYXN0cmEtb25seSBnZW5pZS1hZ2VudCBldmVudHMgLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE1hc3RyYS1vbmx5IGxpZmVjeWNsZSBldmVudDogdGhlIEdlbmllIHRvb2wgaW52b2NhdGlvbiBzdGFydGVkLlxuICogRW1pdHRlZCBpbW1lZGlhdGVseSB3aGVuIHRoZSBjYWxsaW5nIGFnZW50IGludm9rZXMgdGhlIEdlbmllXG4gKiB0b29sLCBiZWZvcmUgYW55IGlubmVyIGFnZW50IC8gd2lyZSBhY3Rpdml0eSwgc28gdGhlIFVJIGNhblxuICogcG9wIGEgXCJUaGlua2luZy4uLlwiIHBpbGwgdGhlIGluc3RhbnQgdGhlIG1vZGVsIGRlY2lkZXMgdG9cbiAqIGRlbGVnYXRlLiBgY29udmVyc2F0aW9uSWRgIC8gYG1lc3NhZ2VJZGAgYXJlIGFic2VudCBvbiB0aGlzXG4gKiBmaXJzdCBlbWl0IChubyBHZW5pZSByb3VuZC10cmlwIHlldCkuIEZpZWxkIG5hbWVzIGFyZVxuICogY2FtZWxDYXNlICh2cyB0aGUgc25ha2VfY2FzZSB3aXJlIGV2ZW50cykgdG8gbWlycm9yIHRoZVxuICogR2VuaWUgYWdlbnQncyBvd24gaW50ZXJuYWwgZGF0YSBwbHVtYmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IFN0YXJ0ZWRFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5saXRlcmFsKFwic3RhcnRlZFwiKSxcbiAgc3BhY2VJZDogei5zdHJpbmcoKSxcbiAgLyoqXG4gICAqIEdlbmllIGNvbnZlcnNhdGlvbiBpZCwgcG9wdWxhdGVkIG9ubHkgd2hlbiB0aGlzIGBzdGFydGVkYFxuICAgKiBldmVudCBjb3JyZXNwb25kcyB0byBhIGZvbGxvdy11cCB0dXJuIG9uIGFuIGV4aXN0aW5nXG4gICAqIGNvbnZlcnNhdGlvbi4gQWJzZW50IG9uIHRoZSBmaXJzdCB0dXJuLlxuICAgKi9cbiAgY29udmVyc2F0aW9uSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgLyoqXG4gICAqIEdlbmllIG1lc3NhZ2UgaWQsIHBvcHVsYXRlZCBvbmx5IGFmdGVyIHRoZSBmaXJzdCB3aXJlXG4gICAqIGBtZXNzYWdlYCBldmVudCBsYW5kcy4gQWJzZW50IG9uIHRoZSBpbW1lZGlhdGUtb24taW52b2tlXG4gICAqIGVtaXQuXG4gICAqL1xuICBtZXNzYWdlSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgLyoqIFF1ZXN0aW9uIHRoZSBHZW5pZSBhZ2VudCBzZW50IHRvIEdlbmllLiAqL1xuICBjb250ZW50OiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgdHlwZSBTdGFydGVkRXZlbnQgPSB6LmluZmVyPHR5cGVvZiBTdGFydGVkRXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIE1hc3RyYS1vbmx5IGxpZmVjeWNsZSBldmVudDogb25lIGBhc2tfZ2VuaWVgIGludm9jYXRpb25cbiAqIGZpbmlzaGVkLiBDYXJyaWVzIHRoZSBoeWRyYXRlZCBgc3RhdGVtZW50SWRzYCAocm93cyBhcmUgZmV0Y2hlZFxuICogdmlhIGBnZXRTdGF0ZW1lbnRgIHNlcGFyYXRlbHkpIGFuZCBHZW5pZSdzIGZpbmFsIHByb3NlIGFuc3dlclxuICogc28gdGhlIFVJIGNhbiBtb3ZlIGZyb20gXCJ0aGlua2luZ1wiIHRvIFwiYW5zd2VyZWRcIiB3aXRob3V0XG4gKiB3YWl0aW5nIGZvciB0aGUgR2VuaWUgYWdlbnQncyB3aG9sZSByZWFzb25pbmcgbG9vcCB0byBlbmQuXG4gKi9cbmV4cG9ydCBjb25zdCBBc2tHZW5pZURvbmVFdmVudFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5saXRlcmFsKFwiYXNrX2dlbmllX2RvbmVcIiksXG4gIHNwYWNlSWQ6IHouc3RyaW5nKCksXG4gIGNvbnZlcnNhdGlvbklkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIG1lc3NhZ2VJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAvKiogR2VuaWUncyBuYXR1cmFsLWxhbmd1YWdlIGFuc3dlciBmb3IgdGhlIHR1cm4sIGlmIGFueS4gKi9cbiAgYW5zd2VyOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIC8qKiBTdGF0ZW1lbnQgaWRzIGZvciBhbnkgbm9uLWVtcHR5IHJlc3VsdCBzZXRzIHRoaXMgdHVybiBwcm9kdWNlZC4gKi9cbiAgc3RhdGVtZW50SWRzOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICAvKipcbiAgICogVGVybWluYWwgd2lyZSBzdGF0dXMgKGBDT01QTEVURURgIC8gYEZBSUxFRGAgLyBgQ0FOQ0VMTEVEYCkuXG4gICAqIE1pcnJvcnMgdGhlIHNvdXJjZSBgcmVzdWx0YCBldmVudCdzIHN0YXR1cyBzbyBzdWJzY3JpYmVyc1xuICAgKiBjYW4gcmVhY3QgdG8gYXNrLWxldmVsIGNvbXBsZXRpb24gd2l0aG91dCByZS13YWxraW5nIGhpc3RvcnkuXG4gICAqIFRyZWF0ZWQgYXMgYHouY3VzdG9tPE1lc3NhZ2VTdGF0dXM+YCBiZWNhdXNlIHRoZSBTREsgaXMgdGhlXG4gICAqIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGVudW0gdmFsdWVzLlxuICAgKi9cbiAgc3RhdHVzOiB6LmN1c3RvbTxNZXNzYWdlU3RhdHVzPigodikgPT4gdHlwZW9mIHYgPT09IFwic3RyaW5nXCIpLFxufSk7XG5leHBvcnQgdHlwZSBBc2tHZW5pZURvbmVFdmVudCA9IHouaW5mZXI8dHlwZW9mIEFza0dlbmllRG9uZUV2ZW50U2NoZW1hPjtcblxuLyoqXG4gKiBNYXN0cmEtb25seSBlcnJvciBldmVudDogdGVybWluYWwgR2VuaWUgYWdlbnQgLyB0cmFuc3BvcnRcbiAqIGVycm9yLiBHZW5pZSdzIG93biBgRkFJTEVEYCAvIGBDQU5DRUxMRURgIGNvbWUgdGhyb3VnaCB0aGVcbiAqIHdpcmUncyBgcmVzdWx0YCBldmVudCAtIHRoaXMgdmFyaWFudCBpcyBmb3IgZmFpbHVyZXMgdGhlIHdpcmVcbiAqIGNhbid0IHJlcHJlc2VudCAobmV0d29yaywgR2VuaWUgYWdlbnQgY3Jhc2gsIHBsYW5uZXIgZXJyb3IsXG4gKiBldGMuKSBwbHVzIGEgVUktZnJpZW5kbHkgbWlycm9yIG9mIGByZXN1bHRgIHdoZW4gdGhlIHN0YXR1cyBpc1xuICogbm9uLWBDT01QTEVURURgLlxuICovXG5leHBvcnQgY29uc3QgTWFzdHJhR2VuaWVFcnJvckV2ZW50U2NoZW1hID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJlcnJvclwiKSxcbiAgc3BhY2VJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBjb252ZXJzYXRpb25JZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBtZXNzYWdlSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZXJyb3I6IHouc3RyaW5nKCksXG59KTtcbmV4cG9ydCB0eXBlIE1hc3RyYUdlbmllRXJyb3JFdmVudCA9IHouaW5mZXI8dHlwZW9mIE1hc3RyYUdlbmllRXJyb3JFdmVudFNjaGVtYT47XG5cbi8qKlxuICogTWFzdHJhLW9ubHkgbGlmZWN5Y2xlIGV2ZW50OiB0aGUgaW5uZXIgR2VuaWUgYWdlbnQnc1xuICogc3RydWN0dXJlZC1vdXRwdXQgY29lcmNpb24gaGFzIGxhbmRlZC4gRmlyZXMgb25jZSBwZXIgR2VuaWVcbiAqIHRvb2wgaW52b2NhdGlvbiwgQUZURVIgYGFnZW50LmdlbmVyYXRlKC4uLilgIGNvbXBsZXRlcyAoaS5lLlxuICogdGhlIGlubmVyIGxvb3AgKyBNYXN0cmEncyBzdHJ1Y3R1cmluZyBwYXNzIGhhdmUgYm90aFxuICogZmluaXNoZWQpIGFuZCBCRUZPUkUgdGhlIHdyYXBwZXIgaHlkcmF0ZXMgZWFjaCBgZGF0YWAgaXRlbVxuICogd2l0aCBhIGNoYXJ0LiBTaWduYWxzIHRvIHRoZSBob3N0IFVJIHRoYXQgdGhlIGFnZW50IGhhc1xuICogc3RvcHBlZCByZWFzb25pbmcgYW5kIGlzIG1vdmluZyBpbnRvIGNoYXJ0IGdlbmVyYXRpb24uXG4gKlxuICogVGhlIHN0cnVjdHVyaW5nIHBhc3MgaXRzZWxmIGlzIG9wYXF1ZSAoaXQgcnVucyBpbnNpZGVcbiAqIE1hc3RyYSdzIGBhZ2VudC5nZW5lcmF0ZSguLi4pYCB0b2dldGhlciB3aXRoIHRoZSB0b29sIGxvb3ApXG4gKiBzbyB0aGlzIGlzIHRoZSBlYXJsaWVzdCBob29rIHdlIGNhbiBvZmZlcjsgd2UgY2FuJ3QgZmlyZSBhXG4gKiBcInN1bW1hcnkgc3RhcnRlZFwiIGV2ZW50IHRoZSB3YXkgd2UgZmlyZSBgc3RhcnRlZGAuXG4gKi9cbmV4cG9ydCBjb25zdCBTdW1tYXJ5RXZlbnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInN1bW1hcnlcIiksXG4gIHNwYWNlSWQ6IHouc3RyaW5nKCksXG4gIC8qKiBUb3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGFnZW50J3Mgc3RydWN0dXJlZCBzdW1tYXJ5LiAqL1xuICBpdGVtczogei5udW1iZXIoKS5pbnQoKS5ub25uZWdhdGl2ZSgpLFxuICAvKiogQ291bnQgb2YgYHRleHRgIC8gcHJvc2UgaXRlbXMgaW4gdGhlIHN1bW1hcnkuICovXG4gIHRleHRJdGVtczogei5udW1iZXIoKS5pbnQoKS5ub25uZWdhdGl2ZSgpLFxuICAvKipcbiAgICogQ291bnQgb2YgYGRhdGFgIGl0ZW1zIHRoZSB3cmFwcGVyIHdpbGwgaHlkcmF0ZSBpbnRvIGNoYXJ0cy5cbiAgICogVGhlIGhvc3QgVUkgY2FuIHVzZSB0aGlzIHRvIHNlZWQgTiBjaGFydCBza2VsZXRvbnMgYmVmb3JlXG4gICAqIHRoZSBwZXItY2hhcnQgZXZlbnRzIGFycml2ZS5cbiAgICovXG4gIGRhdGFJdGVtczogei5udW1iZXIoKS5pbnQoKS5ub25uZWdhdGl2ZSgpLFxufSk7XG5leHBvcnQgdHlwZSBTdW1tYXJ5RXZlbnQgPSB6LmluZmVyPHR5cGVvZiBTdW1tYXJ5RXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIE1hc3RyYS1vbmx5IGV2ZW50IHVuaW9uLiBFYWNoIHZhcmlhbnQgdXNlcyB0aGUgc2FtZSBmbGF0XG4gKiBge3R5cGUsIC4uLmZpZWxkc31gIHNoYXBlIGFzIHtAbGluayBHZW5pZUNoYXRFdmVudH0gc29cbiAqIHN1YnNjcmliZXJzIHVuaW9uIGJvdGggd2l0aCBhIHNpbmdsZSBgc3dpdGNoIChldmVudC50eXBlKWAuXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZUFnZW50RXZlbnRTY2hlbWEgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICBTdGFydGVkRXZlbnRTY2hlbWEsXG4gIEFza0dlbmllRG9uZUV2ZW50U2NoZW1hLFxuICBNYXN0cmFHZW5pZUVycm9yRXZlbnRTY2hlbWEsXG4gIFN1bW1hcnlFdmVudFNjaGVtYSxcbl0pO1xuZXhwb3J0IHR5cGUgR2VuaWVBZ2VudEV2ZW50ID0gei5pbmZlcjx0eXBlb2YgR2VuaWVBZ2VudEV2ZW50U2NoZW1hPjtcblxuLyoqXG4gKiBUaGUgdW5pZmllZCB3cml0ZXItZXZlbnQgdm9jYWJ1bGFyeSBzdWJzY3JpYmVycyBzZWUgb25cbiAqIGBjdHgud3JpdGVyYDogdGhlIHdpcmUtZGVyaXZlZCB7QGxpbmsgR2VuaWVDaGF0RXZlbnR9IHVuaW9uXG4gKiAqKnBsdXMqKiBNYXN0cmEtb25seSBldmVudHMgZnJvbSB7QGxpbmsgR2VuaWVBZ2VudEV2ZW50fS4gRWFjaFxuICogdmFyaWFudCBpcyBhIGZsYXQgYHt0eXBlLCAuLi5maWVsZHN9YCBvYmplY3Q7IGNvbnN1bWVycyBuYXJyb3dcbiAqIG9uIGB0eXBlYCBhbmQgcmVhZCBmaWVsZHMgaW5saW5lIC0gdGhlcmUgaXMgbm8gcGF5bG9hZCB3cmFwcGVyXG4gKiBhbmQgbm8gd3JpdGVyLWJvdW5kYXJ5IHRyYW5zbGF0b3IuXG4gKlxuICogQ29tcG9zZWQgdmlhIGB6LnVuaW9uYCAobm90IGB6LmRpc2NyaW1pbmF0ZWRVbmlvbmApIGJlY2F1c2VcbiAqIGJvdGggaGFsdmVzIGFyZSB0aGVtc2VsdmVzIGRpc2NyaW1pbmF0ZWQgdW5pb25zIG9uIHRoZSBzYW1lXG4gKiBgdHlwZWAga2V5LlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVXcml0ZXJFdmVudFNjaGVtYSA9IHoudW5pb24oW1xuICBnZW5pZU1vZGVsLkdlbmllQ2hhdEV2ZW50U2NoZW1hLFxuICBHZW5pZUFnZW50RXZlbnRTY2hlbWEsXG5dKTtcbmV4cG9ydCB0eXBlIEdlbmllV3JpdGVyRXZlbnQgPSB6LmluZmVyPHR5cGVvZiBHZW5pZVdyaXRlckV2ZW50U2NoZW1hPjtcblxuLyoqIERpc2NyaW1pbmF0b3IgdHlwZSBmb3Ige0BsaW5rIEdlbmllV3JpdGVyRXZlbnR9LiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVXcml0ZXJFdmVudFR5cGUgPSBHZW5pZVdyaXRlckV2ZW50W1widHlwZVwiXTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzdW1tYXJ5ICsgZGF0YXNldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUYWJ1bGFyIHBheWxvYWQgZW1iZWRkZWQgaW4gZXZlcnkge0BsaW5rIEdlbmllU3VtbWFyeUl0ZW19XG4gKiBgdmlzdWFsaXplYCBkYXRhc2V0LiBBbHdheXMgcHJlc2VudDogaHlkcmF0ZWQgYnkgdGhlIHdvcmtmbG93J3NcbiAqIGFnZW50IHN0ZXAgYmVmb3JlIHRoZSBmaW5hbGl6ZSBzdGVwIHJ1bnMsIHNvIGNvbnN1bWVycyBjYW4gcmVuZGVyXG4gKiBhIHRhYmxlIGZhbGxiYWNrIHJlZ2FyZGxlc3Mgb2YgY2hhcnQtcGxhbm5lciBvdXRjb21lLlxuICpcbiAqIEZpZWxkczpcbiAqICAgLSBgY29sdW1uc2A6IGNvbHVtbiBuYW1lcyBpbiBkaXNwbGF5IG9yZGVyLlxuICogICAtIGByb3dzYDogdGFidWxhciByb3dzIGtleWVkIGJ5IGNvbHVtbiBuYW1lLlxuICogICAtIGByb3dDb3VudGA6IHRvdGFsIHJvdyBjb3VudCBHZW5pZSByZXBvcnRlZCAobWF5IGV4Y2VlZFxuICogICAgIGByb3dzLmxlbmd0aGAgd2hlbiB0aGUgc3RhdGVtZW50IHdhcyB0cnVuY2F0ZWQpLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVEYXRhc2V0RGF0YVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgY29sdW1uczogei5hcnJheSh6LnN0cmluZygpKSxcbiAgcm93czogei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSkpLFxuICByb3dDb3VudDogei5udW1iZXIoKSxcbn0pO1xuZXhwb3J0IHR5cGUgR2VuaWVEYXRhc2V0RGF0YSA9IHouaW5mZXI8dHlwZW9mIEdlbmllRGF0YXNldERhdGFTY2hlbWE+O1xuXG4vKipcbiAqIFNsaW0gY2hhcnQgcmVmZXJlbmNlIGF0dGFjaGVkIHRvIGEgdmlzdWFsaXplIGRhdGFzZXQuIE9ubHlcbiAqIHByZXNlbnQgd2hlbiBwbGFubmluZyBzdWNjZWVkZWQuXG4gKlxuICogYG9wdGlvbmAgaXMgaW50ZW50aW9uYWxseSBOT1QgaW5jbHVkZWQuIFRoZSByZXNvbHZlZCBFY2hhcnRzXG4gKiBzcGVjIGxpdmVzIG9mZi1iYW5kIGluIHRoZSBjaGFydCBjYWNoZTogdGhlIGhvc3QgVUkgZmV0Y2hlcyBpdFxuICogYnkgYGNoYXJ0SWRgIGZyb20gdGhlIHBsdWdpbidzIGVtYmVkIHJvdXRlIChkZXJpdmVkIGZyb21cbiAqIGBiYXNlUGF0aGAgKyB7QGxpbmsgTUFTVFJBX1JPVVRFU30uZW1iZWQsIGkuZS4gYC9lbWJlZC9jaGFydC86aWRgO1xuICogc2VlIHtAbGluayBDaGFydH0pLiBFbWJlZGRpbmcgdGhlIGZ1bGwgc3BlYyBpbmxpbmUgd291bGRcbiAqIGluZmxhdGUgZXZlcnkgZGF0YXNldCBieSBzZXZlcmFsIEtCIHBlciBjaGFydCBhbmQgcm91bmQtdHJpcFxuICogdGhyb3VnaCB0aGUgTExNIGNvbnRleHQgZm9yIHplcm8gYmVuZWZpdCAodGhlIG1vZGVsIG9ubHkgbmVlZHNcbiAqIHRoZSBgY2hhcnRJZGAgdG8gcGxhY2UgYSBgW2NoYXJ0OjxjaGFydElkPl1gIG1hcmtlciBpbiBpdHNcbiAqIHJlcGx5KS5cbiAqL1xuZXhwb3J0IGNvbnN0IEdlbmllRGF0YXNldENoYXJ0U2NoZW1hID0gei5vYmplY3Qoe1xuICBjaGFydElkOiB6LnN0cmluZygpLFxuICBjaGFydFR5cGU6IENoYXJ0VHlwZVNjaGVtYSxcbn0pO1xuZXhwb3J0IHR5cGUgR2VuaWVEYXRhc2V0Q2hhcnQgPSB6LmluZmVyPHR5cGVvZiBHZW5pZURhdGFzZXRDaGFydFNjaGVtYT47XG5cbi8qKlxuICogRGF0YXNldCBidW5kbGUgYXR0YWNoZWQgdG8gYSB7QGxpbmsgR2VuaWVTdW1tYXJ5SXRlbX0gYHZpc3VhbGl6ZWBcbiAqIGl0ZW0uIGBkYXRhYCBpcyBhbHdheXMgcG9wdWxhdGVkOyBgY2hhcnRgIGlzIGJlc3QtZWZmb3J0IGFuZFxuICogYWJzZW50IHdoZW4gdGhlIHdvcmtmbG93J3MgY2hhcnQtcGxhbm5lciBmYWlsZWQgKHRpbWVvdXQsXG4gKiBtYWxmb3JtZWQgcGxhbiwgYWJvcnQpIHNvIHRoZSBob3N0IFVJIGNhbiBzdGlsbCByZW5kZXIgdGhlXG4gKiB1bmRlcmx5aW5nIHRhYmxlLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVEYXRhc2V0U2NoZW1hID0gei5vYmplY3Qoe1xuICBkYXRhOiBHZW5pZURhdGFzZXREYXRhU2NoZW1hLFxuICBjaGFydDogR2VuaWVEYXRhc2V0Q2hhcnRTY2hlbWEub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IHR5cGUgR2VuaWVEYXRhc2V0ID0gei5pbmZlcjx0eXBlb2YgR2VuaWVEYXRhc2V0U2NoZW1hPjtcblxuLyoqXG4gKiBPbmUgaXRlbSBpbnNpZGUgdGhlIEdlbmllIHdvcmtmbG93J3MgZmluYWwgc3VtbWFyeS4gVGhlXG4gKiB3b3JrZmxvdyBwcm9kdWNlcyBhIG1peGVkIHNlcXVlbmNlIG9mOlxuICpcbiAqICAgLSBgc3RyaW5nYDogYSBtYXJrZG93biBwYXJhZ3JhcGggKGludGVycHJldGF0aW9uLCBjYWxsb3V0cyxcbiAqICAgICB0cmFuc2l0aW9ucyBiZXR3ZWVuIGRhdGEgYmxvY2tzKS5cbiAqICAgLSBgdmlzdWFsaXplYDogYSByZXF1ZXN0IGZyb20gdGhlIGFnZW50IHN0ZXAgdG8gdmlzdWFsaXplIGFcbiAqICAgICBzcGVjaWZpYyBHZW5pZSBzdGF0ZW1lbnQgYXQgdGhpcyBwb3NpdGlvbiBpbiB0aGUgcHJvc2UuXG4gKiAgICAgVGhlIGZpbmFsaXplIHN0ZXAgaHlkcmF0ZXMgYGRhdGFzZXQuZGF0YWAgKHJvd3MgZnJvbSB0aGVcbiAqICAgICBtYXRjaGluZyBgc3RhdGVtZW50SWRgKSBhbmQgYXR0YWNoZXMgYGRhdGFzZXQuY2hhcnRgIGFmdGVyXG4gKiAgICAgcnVubmluZyB0aGUgY2hhcnQtcGxhbm5lci4gVGhlIGFnZW50IE5FVkVSIHBpY2tzIHRoZSBjaGFydFxuICogICAgIHR5cGUgLSBpdCBvbmx5IG1hcmtzIHdoZXJlIGEgdmlzdWFsaXphdGlvbiBiZWxvbmdzLlxuICpcbiAqIFRoZSBob3N0IFVJIHdhbGtzIHRoZSBhcnJheSBpbiBkaXNwbGF5IG9yZGVyIHRvIGNvbXBvc2UgdGhlXG4gKiBmaW5hbCBhc3Npc3RhbnQgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEdlbmllU3VtbWFyeUl0ZW1TY2hlbWEgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKFwic3RyaW5nXCIpLFxuICAgIHRleHQ6IHouc3RyaW5nKCksXG4gIH0pLFxuICB6Lm9iamVjdCh7XG4gICAgdHlwZTogei5saXRlcmFsKFwidmlzdWFsaXplXCIpLFxuICAgIHN0YXRlbWVudElkOiB6LnN0cmluZygpLFxuICAgIHRpdGxlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgZGVzY3JpcHRpb246IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBkYXRhc2V0OiBHZW5pZURhdGFzZXRTY2hlbWEsXG4gIH0pLFxuXSk7XG5leHBvcnQgdHlwZSBHZW5pZVN1bW1hcnlJdGVtID0gei5pbmZlcjx0eXBlb2YgR2VuaWVTdW1tYXJ5SXRlbVNjaGVtYT47XG5cbi8qKiBEaXNjcmltaW5hdG9yIHR5cGUgZm9yIHtAbGluayBHZW5pZVN1bW1hcnlJdGVtfS4gKi9cbmV4cG9ydCB0eXBlIEdlbmllU3VtbWFyeUl0ZW1UeXBlID0gR2VuaWVTdW1tYXJ5SXRlbVtcInR5cGVcIl07XG5cbi8qKlxuICogVGhlIEdlbmllIGFnZW50J3MgZmluYWwgb3V0cHV0IHNoYXBlIC0gd2hhdCB0aGUgY2FsbGluZyBhZ2VudCdzXG4gKiBHZW5pZSB0b29sIHJldHVybnMgdG8gdGhlIGNhbGxpbmcgTExNLiBUaGUgYHN1bW1hcnlgIGFycmF5IGlzXG4gKiB0aGUgdXNlci1mYWNpbmcgcmVuZGVyYWJsZTsgYGNvbnZlcnNhdGlvbklkYCBsZXRzIHRoZSBjYWxsaW5nXG4gKiBhZ2VudCAob3IgdGhlIFVJKSBmb2xsb3cgdXAgaW4gdGhlIHNhbWUgR2VuaWUgdGhyZWFkIG9uIHRoZVxuICogbmV4dCB0dXJuLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVBZ2VudFJlc3VsdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3BhY2VJZDogei5zdHJpbmcoKSxcbiAgY29udmVyc2F0aW9uSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgc3VtbWFyeTogei5hcnJheShHZW5pZVN1bW1hcnlJdGVtU2NoZW1hKSxcbiAgZXJyb3I6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuZXhwb3J0IHR5cGUgR2VuaWVBZ2VudFJlc3VsdCA9IHouaW5mZXI8dHlwZW9mIEdlbmllQWdlbnRSZXN1bHRTY2hlbWE+O1xuIl19
@@ -0,0 +1 @@
1
+ {"root":["../src/feedback.ts","../src/marker.ts","../src/override.ts","../src/routes.ts","../src/thread.ts","../src/wire.ts","../index.ts"],"version":"5.9.3"}