@dbx-tools/shared-mastra 0.3.44 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.d.ts +15 -0
- package/lib/index.js +16 -0
- package/lib/src/feedback.d.ts +75 -0
- package/lib/src/feedback.js +77 -0
- package/lib/src/marker.d.ts +95 -0
- package/lib/src/marker.js +123 -0
- package/lib/src/override.d.ts +15 -0
- package/lib/src/override.js +16 -0
- package/lib/src/routes.d.ts +29 -0
- package/lib/src/routes.js +37 -0
- package/lib/src/thread.d.ts +19 -0
- package/lib/src/thread.js +20 -0
- package/lib/src/wire.d.ts +877 -0
- package/lib/src/wire.js +569 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/package.json +12 -8
package/lib/src/wire.js
ADDED
|
@@ -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"}
|