@dbx-tools/shared-genie 0.9.40 → 0.9.43

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.
@@ -70,13 +70,14 @@ export declare const MessageStatusSchema: z.ZodUnion<readonly [z.ZodLiteral<"ASK
70
70
  * thought type doesn't break compilation; the four known types
71
71
  * still narrow correctly under `switch`.
72
72
  */
73
- export type GenieThoughtType = "THOUGHT_TYPE_DESCRIPTION" | "THOUGHT_TYPE_DATA_SOURCING" | "THOUGHT_TYPE_STEPS" | "THOUGHT_TYPE_UNDERSTANDING" | (string & {});
73
+ export declare const GenieThoughtTypeSchema: z.ZodString;
74
+ export type GenieThoughtType = z.infer<typeof GenieThoughtTypeSchema>;
74
75
  /**
75
76
  * One reasoning step on a query attachment. See
76
77
  * {@link GenieThoughtType} for the known `thought_type` values.
77
78
  */
78
79
  export declare const GenieThoughtSchema: z.ZodObject<{
79
- thought_type: z.ZodCustom<GenieThoughtType, GenieThoughtType>;
80
+ thought_type: z.ZodString;
80
81
  content: z.ZodString;
81
82
  }, z.core.$strip>;
82
83
  /** One typed reasoning entry attached to a Genie query. */
@@ -97,10 +98,14 @@ export type GenieThought = z.infer<typeof GenieThoughtSchema>;
97
98
  * the event-union discriminator key.
98
99
  */
99
100
  export declare const ATTACHMENT_TYPES: readonly ["query", "text", "suggested_questions"];
100
- /** Attachment discriminator values understood by this package version. */
101
- export type KnownAttachmentType = (typeof ATTACHMENT_TYPES)[number];
102
- /** Forward-compatible attachment discriminator, including future Genie values. */
103
- export type AttachmentType = KnownAttachmentType | (string & {});
101
+ export declare const KnownAttachmentTypeSchema: z.ZodEnum<{
102
+ query: "query";
103
+ suggested_questions: "suggested_questions";
104
+ text: "text";
105
+ }>;
106
+ export type KnownAttachmentType = z.infer<typeof KnownAttachmentTypeSchema>;
107
+ export declare const AttachmentTypeSchema: z.ZodString;
108
+ export type AttachmentType = z.infer<typeof AttachmentTypeSchema>;
104
109
  /**
105
110
  * `GenieQueryAttachment` widened with the `thoughts[]` field the
106
111
  * Genie wire exposes but the SDK doesn't currently type. Every
@@ -126,7 +131,7 @@ export declare const GenieQueryAttachmentSchema: z.ZodObject<{
126
131
  statement_id: z.ZodOptional<z.ZodString>;
127
132
  title: z.ZodOptional<z.ZodString>;
128
133
  thoughts: z.ZodOptional<z.ZodArray<z.ZodObject<{
129
- thought_type: z.ZodCustom<GenieThoughtType, GenieThoughtType>;
134
+ thought_type: z.ZodString;
130
135
  content: z.ZodString;
131
136
  }, z.core.$strip>>>;
132
137
  }, z.core.$strip>;
@@ -141,7 +146,8 @@ export type GenieQueryAttachment = z.infer<typeof GenieQueryAttachmentSchema>;
141
146
  * known values discoverable and accept future string values so an additive
142
147
  * server-side enum change cannot invalidate an otherwise complete message.
143
148
  */
144
- export type GenieTextAttachmentPurpose = "FOLLOW_UP_QUESTION" | "TEXT_ATTACHMENT_PURPOSE_ANSWER" | (string & {});
149
+ export declare const GenieTextAttachmentPurposeSchema: z.ZodString;
150
+ export type GenieTextAttachmentPurpose = z.infer<typeof GenieTextAttachmentPurposeSchema>;
145
151
  /**
146
152
  * Text attachment widened for forward-compatible purpose values and optional
147
153
  * Agent Mode table metadata.
@@ -149,7 +155,7 @@ export type GenieTextAttachmentPurpose = "FOLLOW_UP_QUESTION" | "TEXT_ATTACHMENT
149
155
  export declare const GenieTextAttachmentSchema: z.ZodObject<{
150
156
  content: z.ZodOptional<z.ZodString>;
151
157
  id: z.ZodOptional<z.ZodString>;
152
- purpose: z.ZodOptional<z.ZodCustom<GenieTextAttachmentPurpose, GenieTextAttachmentPurpose>>;
158
+ purpose: z.ZodOptional<z.ZodString>;
153
159
  metadata: z.ZodOptional<z.ZodUnknown>;
154
160
  }, z.core.$strip>;
155
161
  /** Narrative text attachment, including its optional semantic purpose. */
@@ -196,17 +202,17 @@ export declare const GenieAttachmentSchema: z.ZodObject<{
196
202
  statement_id: z.ZodOptional<z.ZodString>;
197
203
  title: z.ZodOptional<z.ZodString>;
198
204
  thoughts: z.ZodOptional<z.ZodArray<z.ZodObject<{
199
- thought_type: z.ZodCustom<GenieThoughtType, GenieThoughtType>;
205
+ thought_type: z.ZodString;
200
206
  content: z.ZodString;
201
207
  }, z.core.$strip>>>;
202
208
  }, z.core.$strip>>;
203
209
  text: z.ZodOptional<z.ZodObject<{
204
210
  content: z.ZodOptional<z.ZodString>;
205
211
  id: z.ZodOptional<z.ZodString>;
206
- purpose: z.ZodOptional<z.ZodCustom<GenieTextAttachmentPurpose, GenieTextAttachmentPurpose>>;
212
+ purpose: z.ZodOptional<z.ZodString>;
207
213
  metadata: z.ZodOptional<z.ZodUnknown>;
208
214
  }, z.core.$strip>>;
209
- attachment_type: z.ZodOptional<z.ZodCustom<AttachmentType, AttachmentType>>;
215
+ attachment_type: z.ZodOptional<z.ZodString>;
210
216
  }, z.core.$strip>;
211
217
  /** Genie message attachment with an optional computed discriminator. */
212
218
  export type GenieAttachment = z.infer<typeof GenieAttachmentSchema>;
@@ -271,17 +277,17 @@ export declare const GenieMessageSchema: z.ZodObject<{
271
277
  statement_id: z.ZodOptional<z.ZodString>;
272
278
  title: z.ZodOptional<z.ZodString>;
273
279
  thoughts: z.ZodOptional<z.ZodArray<z.ZodObject<{
274
- thought_type: z.ZodCustom<GenieThoughtType, GenieThoughtType>;
280
+ thought_type: z.ZodString;
275
281
  content: z.ZodString;
276
282
  }, z.core.$strip>>>;
277
283
  }, z.core.$strip>>;
278
284
  text: z.ZodOptional<z.ZodObject<{
279
285
  content: z.ZodOptional<z.ZodString>;
280
286
  id: z.ZodOptional<z.ZodString>;
281
- purpose: z.ZodOptional<z.ZodCustom<GenieTextAttachmentPurpose, GenieTextAttachmentPurpose>>;
287
+ purpose: z.ZodOptional<z.ZodString>;
282
288
  metadata: z.ZodOptional<z.ZodUnknown>;
283
289
  }, z.core.$strip>>;
284
- attachment_type: z.ZodOptional<z.ZodCustom<AttachmentType, AttachmentType>>;
290
+ attachment_type: z.ZodOptional<z.ZodString>;
285
291
  }, z.core.$strip>>>;
286
292
  auto_regenerate_count: z.ZodOptional<z.ZodNumber>;
287
293
  }, z.core.$strip>;
@@ -343,17 +349,17 @@ export declare const GenieResponseSchema: z.ZodPipe<z.ZodObject<{
343
349
  statement_id: z.ZodOptional<z.ZodString>;
344
350
  title: z.ZodOptional<z.ZodString>;
345
351
  thoughts: z.ZodOptional<z.ZodArray<z.ZodObject<{
346
- thought_type: z.ZodCustom<GenieThoughtType, GenieThoughtType>;
352
+ thought_type: z.ZodString;
347
353
  content: z.ZodString;
348
354
  }, z.core.$strip>>>;
349
355
  }, z.core.$strip>>;
350
356
  text: z.ZodOptional<z.ZodObject<{
351
357
  content: z.ZodOptional<z.ZodString>;
352
358
  id: z.ZodOptional<z.ZodString>;
353
- purpose: z.ZodOptional<z.ZodCustom<GenieTextAttachmentPurpose, GenieTextAttachmentPurpose>>;
359
+ purpose: z.ZodOptional<z.ZodString>;
354
360
  metadata: z.ZodOptional<z.ZodUnknown>;
355
361
  }, z.core.$strip>>;
356
- attachment_type: z.ZodOptional<z.ZodCustom<AttachmentType, AttachmentType>>;
362
+ attachment_type: z.ZodOptional<z.ZodString>;
357
363
  }, z.core.$strip>>>;
358
364
  auto_regenerate_count: z.ZodOptional<z.ZodNumber>;
359
365
  }, z.core.$strip>, z.ZodTransform<{
@@ -378,17 +384,17 @@ export declare const GenieResponseSchema: z.ZodPipe<z.ZodObject<{
378
384
  statement_id?: string | undefined;
379
385
  title?: string | undefined;
380
386
  thoughts?: {
381
- thought_type: GenieThoughtType;
387
+ thought_type: string;
382
388
  content: string;
383
389
  }[] | undefined;
384
390
  } | undefined;
385
391
  text?: {
386
392
  content?: string | undefined;
387
393
  id?: string | undefined;
388
- purpose?: GenieTextAttachmentPurpose | undefined;
394
+ purpose?: string | undefined;
389
395
  metadata?: unknown;
390
396
  } | undefined;
391
- attachment_type?: AttachmentType | undefined;
397
+ attachment_type?: string | undefined;
392
398
  }[], {
393
399
  content: string;
394
400
  conversation_id: string;
@@ -434,17 +440,17 @@ export declare const GenieResponseSchema: z.ZodPipe<z.ZodObject<{
434
440
  statement_id?: string | undefined;
435
441
  title?: string | undefined;
436
442
  thoughts?: {
437
- thought_type: GenieThoughtType;
443
+ thought_type: string;
438
444
  content: string;
439
445
  }[] | undefined;
440
446
  } | undefined;
441
447
  text?: {
442
448
  content?: string | undefined;
443
449
  id?: string | undefined;
444
- purpose?: GenieTextAttachmentPurpose | undefined;
450
+ purpose?: string | undefined;
445
451
  metadata?: unknown;
446
452
  } | undefined;
447
- attachment_type?: AttachmentType | undefined;
453
+ attachment_type?: string | undefined;
448
454
  }[] | undefined;
449
455
  auto_regenerate_count?: number | undefined;
450
456
  }>>;
@@ -477,8 +483,12 @@ export type GenieSpace = z.infer<typeof GenieSpaceSchema>;
477
483
  * statuses.
478
484
  */
479
485
  export declare const TERMINAL_STATUSES: readonly ["COMPLETED", "FAILED", "CANCELLED"];
480
- /** Message status that ends a Genie turn and produces a final result event. */
481
- export type TerminalStatus = (typeof TERMINAL_STATUSES)[number];
486
+ export declare const TerminalStatusSchema: z.ZodEnum<{
487
+ CANCELLED: "CANCELLED";
488
+ COMPLETED: "COMPLETED";
489
+ FAILED: "FAILED";
490
+ }>;
491
+ export type TerminalStatus = z.infer<typeof TerminalStatusSchema>;
482
492
  /** Narrow `MessageStatus | undefined` to a {@link TerminalStatus}. */
483
493
  export declare function isTerminalStatus(s: MessageStatus | undefined): s is TerminalStatus;
484
494
  /**
@@ -611,17 +621,17 @@ export declare const MessageEventSchema: z.ZodObject<{
611
621
  statement_id: z.ZodOptional<z.ZodString>;
612
622
  title: z.ZodOptional<z.ZodString>;
613
623
  thoughts: z.ZodOptional<z.ZodArray<z.ZodObject<{
614
- thought_type: z.ZodCustom<GenieThoughtType, GenieThoughtType>;
624
+ thought_type: z.ZodString;
615
625
  content: z.ZodString;
616
626
  }, z.core.$strip>>>;
617
627
  }, z.core.$strip>>;
618
628
  text: z.ZodOptional<z.ZodObject<{
619
629
  content: z.ZodOptional<z.ZodString>;
620
630
  id: z.ZodOptional<z.ZodString>;
621
- purpose: z.ZodOptional<z.ZodCustom<GenieTextAttachmentPurpose, GenieTextAttachmentPurpose>>;
631
+ purpose: z.ZodOptional<z.ZodString>;
622
632
  metadata: z.ZodOptional<z.ZodUnknown>;
623
633
  }, z.core.$strip>>;
624
- attachment_type: z.ZodOptional<z.ZodCustom<AttachmentType, AttachmentType>>;
634
+ attachment_type: z.ZodOptional<z.ZodString>;
625
635
  }, z.core.$strip>>>;
626
636
  auto_regenerate_count: z.ZodOptional<z.ZodNumber>;
627
637
  }, z.core.$strip>;
@@ -658,7 +668,7 @@ export declare const AttachmentEventSchema: z.ZodObject<{
658
668
  attachment_id: z.ZodOptional<z.ZodString>;
659
669
  type: z.ZodLiteral<"attachment">;
660
670
  index: z.ZodNumber;
661
- attachment_type: z.ZodCustom<AttachmentType, AttachmentType>;
671
+ attachment_type: z.ZodString;
662
672
  }, z.core.$strip>;
663
673
  /** Event emitted when a new typed attachment appears on the message. */
664
674
  export type AttachmentEvent = z.infer<typeof AttachmentEventSchema>;
@@ -677,7 +687,7 @@ export declare const ThinkingEventSchema: z.ZodObject<{
677
687
  attachment_id: z.ZodOptional<z.ZodString>;
678
688
  type: z.ZodLiteral<"thinking">;
679
689
  text: z.ZodString;
680
- thought_type: z.ZodCustom<GenieThoughtType, GenieThoughtType>;
690
+ thought_type: z.ZodString;
681
691
  }, z.core.$strip>;
682
692
  /** Incremental Genie reasoning event derived from query thoughts. */
683
693
  export type ThinkingEvent = z.infer<typeof ThinkingEventSchema>;
@@ -827,17 +837,17 @@ export declare const ResultEventSchema: z.ZodObject<{
827
837
  statement_id: z.ZodOptional<z.ZodString>;
828
838
  title: z.ZodOptional<z.ZodString>;
829
839
  thoughts: z.ZodOptional<z.ZodArray<z.ZodObject<{
830
- thought_type: z.ZodCustom<GenieThoughtType, GenieThoughtType>;
840
+ thought_type: z.ZodString;
831
841
  content: z.ZodString;
832
842
  }, z.core.$strip>>>;
833
843
  }, z.core.$strip>>;
834
844
  text: z.ZodOptional<z.ZodObject<{
835
845
  content: z.ZodOptional<z.ZodString>;
836
846
  id: z.ZodOptional<z.ZodString>;
837
- purpose: z.ZodOptional<z.ZodCustom<GenieTextAttachmentPurpose, GenieTextAttachmentPurpose>>;
847
+ purpose: z.ZodOptional<z.ZodString>;
838
848
  metadata: z.ZodOptional<z.ZodUnknown>;
839
849
  }, z.core.$strip>>;
840
- attachment_type: z.ZodOptional<z.ZodCustom<AttachmentType, AttachmentType>>;
850
+ attachment_type: z.ZodOptional<z.ZodString>;
841
851
  }, z.core.$strip>>>;
842
852
  auto_regenerate_count: z.ZodOptional<z.ZodNumber>;
843
853
  }, z.core.$strip>;
@@ -934,17 +944,17 @@ export declare const GenieChatEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<
934
944
  statement_id: z.ZodOptional<z.ZodString>;
935
945
  title: z.ZodOptional<z.ZodString>;
936
946
  thoughts: z.ZodOptional<z.ZodArray<z.ZodObject<{
937
- thought_type: z.ZodCustom<GenieThoughtType, GenieThoughtType>;
947
+ thought_type: z.ZodString;
938
948
  content: z.ZodString;
939
949
  }, z.core.$strip>>>;
940
950
  }, z.core.$strip>>;
941
951
  text: z.ZodOptional<z.ZodObject<{
942
952
  content: z.ZodOptional<z.ZodString>;
943
953
  id: z.ZodOptional<z.ZodString>;
944
- purpose: z.ZodOptional<z.ZodCustom<GenieTextAttachmentPurpose, GenieTextAttachmentPurpose>>;
954
+ purpose: z.ZodOptional<z.ZodString>;
945
955
  metadata: z.ZodOptional<z.ZodUnknown>;
946
956
  }, z.core.$strip>>;
947
- attachment_type: z.ZodOptional<z.ZodCustom<AttachmentType, AttachmentType>>;
957
+ attachment_type: z.ZodOptional<z.ZodString>;
948
958
  }, z.core.$strip>>>;
949
959
  auto_regenerate_count: z.ZodOptional<z.ZodNumber>;
950
960
  }, z.core.$strip>;
@@ -962,7 +972,7 @@ export declare const GenieChatEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<
962
972
  attachment_id: z.ZodOptional<z.ZodString>;
963
973
  type: z.ZodLiteral<"attachment">;
964
974
  index: z.ZodNumber;
965
- attachment_type: z.ZodCustom<AttachmentType, AttachmentType>;
975
+ attachment_type: z.ZodString;
966
976
  }, z.core.$strip>, z.ZodObject<{
967
977
  space_id: z.ZodString;
968
978
  conversation_id: z.ZodOptional<z.ZodString>;
@@ -970,7 +980,7 @@ export declare const GenieChatEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<
970
980
  attachment_id: z.ZodOptional<z.ZodString>;
971
981
  type: z.ZodLiteral<"thinking">;
972
982
  text: z.ZodString;
973
- thought_type: z.ZodCustom<GenieThoughtType, GenieThoughtType>;
983
+ thought_type: z.ZodString;
974
984
  }, z.core.$strip>, z.ZodObject<{
975
985
  space_id: z.ZodString;
976
986
  conversation_id: z.ZodOptional<z.ZodString>;
@@ -1065,17 +1075,17 @@ export declare const GenieChatEventSchema: z.ZodDiscriminatedUnion<[z.ZodObject<
1065
1075
  statement_id: z.ZodOptional<z.ZodString>;
1066
1076
  title: z.ZodOptional<z.ZodString>;
1067
1077
  thoughts: z.ZodOptional<z.ZodArray<z.ZodObject<{
1068
- thought_type: z.ZodCustom<GenieThoughtType, GenieThoughtType>;
1078
+ thought_type: z.ZodString;
1069
1079
  content: z.ZodString;
1070
1080
  }, z.core.$strip>>>;
1071
1081
  }, z.core.$strip>>;
1072
1082
  text: z.ZodOptional<z.ZodObject<{
1073
1083
  content: z.ZodOptional<z.ZodString>;
1074
1084
  id: z.ZodOptional<z.ZodString>;
1075
- purpose: z.ZodOptional<z.ZodCustom<GenieTextAttachmentPurpose, GenieTextAttachmentPurpose>>;
1085
+ purpose: z.ZodOptional<z.ZodString>;
1076
1086
  metadata: z.ZodOptional<z.ZodUnknown>;
1077
1087
  }, z.core.$strip>>;
1078
- attachment_type: z.ZodOptional<z.ZodCustom<AttachmentType, AttachmentType>>;
1088
+ attachment_type: z.ZodOptional<z.ZodString>;
1079
1089
  }, z.core.$strip>>>;
1080
1090
  auto_regenerate_count: z.ZodOptional<z.ZodNumber>;
1081
1091
  }, z.core.$strip>;
@@ -46,13 +46,39 @@ import * as dashboards from "./dashboards.js";
46
46
  const { genieAttachmentSchema: SDKGenieAttachmentSchema, genieMessageSchema: SDKGenieMessageSchema, genieQueryAttachmentSchema: SDKGenieQueryAttachmentSchema, genieSpaceSchema: SDKGenieSpaceSchema, } = dashboards;
47
47
  /** Runtime validator for a raw Genie message status from the generated SDK contract. */
48
48
  export const MessageStatusSchema = dashboards.messageStatusSchema;
49
+ /* ----------------------------- thoughts ---------------------------- */
50
+ /**
51
+ * Genie's per-query "thoughts" surface. These appear on the
52
+ * `/messages/{id}` wire under `attachments[i].query.thoughts[]` but
53
+ * are not typed on the SDK's `GenieQueryAttachment` at v0.17.
54
+ *
55
+ * Known thought types observed in production polls:
56
+ *
57
+ * - `THOUGHT_TYPE_DESCRIPTION`: a one-paragraph restatement of
58
+ * what the user asked. The final `query.description` field on
59
+ * the attachment carries the same text.
60
+ * - `THOUGHT_TYPE_DATA_SOURCING`: markdown bullets of the
61
+ * fully-qualified `catalog.schema.table` sources Genie chose.
62
+ * - `THOUGHT_TYPE_STEPS`: the high-level plan Genie wrote before
63
+ * running SQL (one bullet per step).
64
+ * - `THOUGHT_TYPE_UNDERSTANDING`: ambiguity / interpretation
65
+ * notes (e.g. "'revenue' could be interpreted as gross,
66
+ * net, or recognized revenue...").
67
+ *
68
+ * Open at the type level (`| (string & {})`) so a new server-side
69
+ * thought type doesn't break compilation; the four known types
70
+ * still narrow correctly under `switch`.
71
+ */
72
+ export const GenieThoughtTypeSchema = z
73
+ .string()
74
+ .describe("Forward-compatible Genie reasoning thought type.");
49
75
  /**
50
76
  * One reasoning step on a query attachment. See
51
77
  * {@link GenieThoughtType} for the known `thought_type` values.
52
78
  */
53
79
  export const GenieThoughtSchema = z.object({
54
- thought_type: z.custom((v) => typeof v === "string"),
55
- content: z.string(),
80
+ thought_type: GenieThoughtTypeSchema.describe("Kind of reasoning represented by this entry."),
81
+ content: z.string().describe("Reasoning text emitted for this thought."),
56
82
  });
57
83
  /* ----------------------- attachment discriminator ---------------------- */
58
84
  /**
@@ -75,6 +101,12 @@ export const ATTACHMENT_TYPES = [
75
101
  "text",
76
102
  "suggested_questions",
77
103
  ];
104
+ export const KnownAttachmentTypeSchema = z
105
+ .enum(ATTACHMENT_TYPES)
106
+ .describe("Attachment discriminator values understood by this package version.");
107
+ export const AttachmentTypeSchema = z
108
+ .string()
109
+ .describe("Forward-compatible Genie attachment discriminator.");
78
110
  /* ------------------- widened wire schemas + types ------------------ */
79
111
  /**
80
112
  * `GenieQueryAttachment` widened with the `thoughts[]` field the
@@ -87,13 +119,25 @@ export const ATTACHMENT_TYPES = [
87
119
  export const GenieQueryAttachmentSchema = SDKGenieQueryAttachmentSchema.extend({
88
120
  thoughts: z.array(GenieThoughtSchema).optional(),
89
121
  });
122
+ /**
123
+ * Purpose attached to a Genie text response.
124
+ *
125
+ * The generated Databricks SDK schema currently knows only
126
+ * `FOLLOW_UP_QUESTION`, while the live Genie API also emits
127
+ * `TEXT_ATTACHMENT_PURPOSE_ANSWER` for the primary answer text. Keep the
128
+ * known values discoverable and accept future string values so an additive
129
+ * server-side enum change cannot invalidate an otherwise complete message.
130
+ */
131
+ export const GenieTextAttachmentPurposeSchema = z
132
+ .string()
133
+ .describe("Forward-compatible semantic purpose for a Genie text attachment.");
90
134
  /**
91
135
  * Text attachment widened for forward-compatible purpose values and optional
92
136
  * Agent Mode table metadata.
93
137
  */
94
138
  export const GenieTextAttachmentSchema = dashboards.textAttachmentSchema.extend({
95
- purpose: z.custom((value) => typeof value === "string").optional(),
96
- metadata: z.unknown().optional(),
139
+ purpose: GenieTextAttachmentPurposeSchema.optional(),
140
+ metadata: z.unknown().optional().describe("Agent Mode metadata attached to this text response."),
97
141
  });
98
142
  /**
99
143
  * `GenieAttachment` with:
@@ -118,7 +162,7 @@ export const GenieTextAttachmentSchema = dashboards.textAttachmentSchema.extend(
118
162
  export const GenieAttachmentSchema = SDKGenieAttachmentSchema.extend({
119
163
  query: GenieQueryAttachmentSchema.optional(),
120
164
  text: GenieTextAttachmentSchema.optional(),
121
- attachment_type: z.custom((v) => typeof v === "string").optional(),
165
+ attachment_type: AttachmentTypeSchema.optional(),
122
166
  });
123
167
  /**
124
168
  * `GenieMessage` widened with:
@@ -177,6 +221,9 @@ export const GenieSpaceSchema = SDKGenieSpaceSchema.extend({
177
221
  * statuses.
178
222
  */
179
223
  export const TERMINAL_STATUSES = ["COMPLETED", "FAILED", "CANCELLED"];
224
+ export const TerminalStatusSchema = z
225
+ .enum(TERMINAL_STATUSES)
226
+ .describe("Message status that ends a Genie turn and produces a final result event.");
180
227
  /** Narrow `MessageStatus | undefined` to a {@link TerminalStatus}. */
181
228
  export function isTerminalStatus(s) {
182
229
  return s !== undefined && TERMINAL_STATUSES.includes(s);
@@ -324,7 +371,7 @@ export const StatusEventSchema = GenieChatLocationSchema.omit({
324
371
  export const AttachmentEventSchema = GenieChatLocationSchema.extend({
325
372
  type: z.literal("attachment"),
326
373
  index: z.number(),
327
- attachment_type: z.custom((v) => typeof v === "string"),
374
+ attachment_type: AttachmentTypeSchema,
328
375
  });
329
376
  /**
330
377
  * A new reasoning step appeared on a query attachment
@@ -337,7 +384,7 @@ export const AttachmentEventSchema = GenieChatLocationSchema.extend({
337
384
  export const ThinkingEventSchema = GenieChatLocationSchema.extend({
338
385
  type: z.literal("thinking"),
339
386
  text: z.string(),
340
- thought_type: z.custom((v) => typeof v === "string"),
387
+ thought_type: GenieThoughtTypeSchema,
341
388
  });
342
389
  /**
343
390
  * A text-attachment `content` field appeared or changed
@@ -404,7 +451,7 @@ export const ResultEventSchema = GenieChatLocationSchema.omit({
404
451
  attachment_id: true,
405
452
  }).extend({
406
453
  type: z.literal("result"),
407
- status: z.enum(TERMINAL_STATUSES),
454
+ status: TerminalStatusSchema,
408
455
  message: GenieMessageSchema,
409
456
  });
410
457
  /**
@@ -454,4 +501,4 @@ export const GenieChatEventSchema = z.discriminatedUnion("type", [
454
501
  SuggestedQuestionsEventSchema,
455
502
  ResultEventSchema,
456
503
  ]);
457
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuaWUtbW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuaWUtbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0NHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxLQUFLLFVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5QyxrRkFBa0Y7QUFDbEYsaUZBQWlGO0FBQ2pGLDZEQUE2RDtBQUM3RCxNQUFNLEVBQ0oscUJBQXFCLEVBQUUsd0JBQXdCLEVBQy9DLGtCQUFrQixFQUFFLHFCQUFxQixFQUN6QywwQkFBMEIsRUFBRSw2QkFBNkIsRUFDekQsZ0JBQWdCLEVBQUUsbUJBQW1CLEdBQ3RDLEdBQUcsVUFBVSxDQUFDO0FBVWYsd0ZBQXdGO0FBQ3hGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQztBQWlDbEU7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN6QyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBbUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQztJQUN0RSxPQUFPLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtDQUNwQixDQUFDLENBQUM7QUFJSCw2RUFBNkU7QUFFN0U7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QixPQUFPO0lBQ1AsTUFBTTtJQUNOLHFCQUFxQjtDQUNlLENBQUM7QUFNdkMseUVBQXlFO0FBRXpFOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyw2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KipcbiAqIFdpcmUtZm9ybWF0IHpvZCBzY2hlbWFzICsgdHlwZXMgYW5kIGhpZ2gtbGV2ZWwgZXZlbnQgdm9jYWJ1bGFyeVxuICogZm9yIHRoZSBHZW5pZSBjaGF0IGRyaXZlci5cbiAqXG4gKiBUd28gcmVsYXRlZCBsYXllcnMgbGl2ZSBoZXJlOlxuICpcbiAqICAgMS4gR2VuaWUgd2lyZSBzaGFwZXMgZGVyaXZlZCBmcm9tIHRoaXMgcGFja2FnZSdzIG93biBnZW5lcmF0ZWRcbiAqICAgICAgYGRhc2hib2FyZHNgIHNjaGVtYXMgKHJlZ2VuZXJhdGVkIGZyb20gdGhlIHVwc3RyZWFtXG4gKiAgICAgIGBAZGF0YWJyaWNrcy9zZGstZXhwZXJpbWVudGFsYCBgYXBpcy9kYXNoYm9hcmRzL21vZGVsLmQudHNgXG4gKiAgICAgIGJ5IHRoZSBlbmdpbmUncyBjb2RlZ2VuIG9uIHN5bnRoKS4gV2UgZXh0ZW5kIHRoZSBTREsgc2NoZW1hcyB3aGVyZSBHZW5pZVxuICogICAgICBzaGlwcyBmaWVsZHMgb24gdGhlIHdpcmUgdGhhdCB0aGUgU0RLIGRvZXNuJ3QgY3VycmVudGx5IHR5cGU6XG4gKlxuICogICAgICAgIC0gYEdlbmllTWVzc2FnZS5hdXRvX3JlZ2VuZXJhdGVfY291bnQ6IG51bWJlcmAgKHN0YW1wZWRcbiAqICAgICAgICAgIG9uIGV2ZXJ5IHdpcmUgbWVzc2FnZSwgb21pdHRlZCBmcm9tIHRoZSBTREsgc2hhcGUpLlxuICogICAgICAgIC0gYEdlbmllUXVlcnlBdHRhY2htZW50LnRob3VnaHRzOiBHZW5pZVRob3VnaHRbXWAgKHRoZVxuICogICAgICAgICAgc3RyZWFtZWQgcmVhc29uaW5nIHBheWxvYWQgd2l0aCBgREVTQ1JJUFRJT05gLFxuICogICAgICAgICAgYERBVEFfU09VUkNJTkdgLCBgU1RFUFNgLCBhbmQgYFVOREVSU1RBTkRJTkdgIHRob3VnaHRcbiAqICAgICAgICAgIGtpbmRzKS5cbiAqICAgICAgICAtIGBHZW5pZUF0dGFjaG1lbnQuYXR0YWNobWVudF90eXBlOiBBdHRhY2htZW50VHlwZWBcbiAqICAgICAgICAgIChhbiBvcHRpb25hbCBkaXNjcmltaW5hdG9yIGxpdGVyYWwgc28gY2FsbGVycyBjYW5cbiAqICAgICAgICAgIGBzd2l0Y2ggKGF0dC5hdHRhY2htZW50X3R5cGUpYCBpbnN0ZWFkIG9mIHByb2JpbmdcbiAqICAgICAgICAgIHdoaWNoIHN1Yi1rZXkgaXMgcG9wdWxhdGVkOyBjb21wdXRlIGl0IHdpdGhcbiAqICAgICAgICAgIHtAbGluayBkZXRlY3RBdHRhY2htZW50VHlwZX0pLlxuICpcbiAqICAgMi4gRXZlbnQgdm9jYWJ1bGFyeSBmb3IgdGhlIGhpZ2gtbGV2ZWwgYGdlbmllRXZlbnRDaGF0YFxuICogICAgICBkcml2ZXIuIEVhY2ggZXZlbnQgaXMgYSBmbGF0IGB6Lm9iamVjdGAgd2l0aCBhIGB0eXBlYFxuICogICAgICBsaXRlcmFsIGRpc2NyaW1pbmF0b3IgYW5kIHNuYWtlX2Nhc2UgcGF5bG9hZCBmaWVsZHMgaG9pc3RlZFxuICogICAgICB0byB0aGUgdG9wIGxldmVsIChubyBgcGF5bG9hZGAgd3JhcHBlcikuIEV2ZW50cyB0aGF0IHNoYXJlXG4gKiAgICAgIHRoZSBhdHRhY2htZW50LXNjb3BlZCBsb2NhdGlvbiB1c2VcbiAqICAgICAge0BsaW5rIEdlbmllQ2hhdExvY2F0aW9uU2NoZW1hfSBhcyBhIGJhc2U7IGV2ZW50cyB0aGF0XG4gKiAgICAgIGRvbid0IGNhcnJ5IGFuIGBhdHRhY2htZW50X2lkYCAoc3RhdHVzLCByZXN1bHQpIG9taXQgaXQuXG4gKiAgICAgIHtAbGluayBHZW5pZUNoYXRFdmVudFNjaGVtYX0gYnVuZGxlcyB0aGUgdmFyaWFudHMgaW50byBvbmVcbiAqICAgICAgZGlzY3JpbWluYXRlZCB1bmlvbi5cbiAqXG4gKiBQdXJlIHR5cGVzOiBubyBydW50aW1lIGltcG9ydHMgYmV5b25kIHpvZCArIHRoZSBnZW5lcmF0ZWRcbiAqIGBkYXNoYm9hcmRzYCBzY2hlbWFzLCBubyBOb2RlLW9ubHkgY29kZSwgc2FmZSBmb3IgYnJvd3NlciBidW5kbGVzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0ICogYXMgZGFzaGJvYXJkcyBmcm9tIFwiLi9kYXNoYm9hcmRzLnRzXCI7XG5cbi8vIFRoZSBnZW5lcmF0ZWQgU0RLIHNjaGVtYXMgbGl2ZSBpbiB0aGUgc2libGluZyBgLi9kYXNoYm9hcmRzLnRzYCwgd3JpdHRlbiBieSB0aGVcbi8vIGVuZ2luZSdzIGNvZGVnZW4gZnJvbSB0aGUgdXBzdHJlYW0gYC5kLnRzYC4gQWxpYXMgdGhlIGhhbmRmdWwgR2VuaWUgZXh0ZW5kcyBzb1xuLy8gdGhlIHdpZGVuZWQgc2NoZW1hcyBiZWxvdyByZWFkIGFnYWluc3Qgc2hvcnQsIGxvY2FsIG5hbWVzLlxuY29uc3Qge1xuICBnZW5pZUF0dGFjaG1lbnRTY2hlbWE6IFNES0dlbmllQXR0YWNobWVudFNjaGVtYSxcbiAgZ2VuaWVNZXNzYWdlU2NoZW1hOiBTREtHZW5pZU1lc3NhZ2VTY2hlbWEsXG4gIGdlbmllUXVlcnlBdHRhY2htZW50U2NoZW1hOiBTREtHZW5pZVF1ZXJ5QXR0YWNobWVudFNjaGVtYSxcbiAgZ2VuaWVTcGFjZVNjaGVtYTogU0RLR2VuaWVTcGFjZVNjaGVtYSxcbn0gPSBkYXNoYm9hcmRzO1xuXG4vKipcbiAqIFRoZSBTREsncyBgTWVzc2FnZVN0YXR1c2AgdHlwZSwgcmUtZXhwb3J0ZWQgc28gY29uc3VtZXJzIG9mIHRoZVxuICogR2VuaWUgY29udHJhY3QgZ2V0IHRoZSBmdWxsIHdpcmUgdm9jYWJ1bGFyeSBmcm9tIGEgc2luZ2xlIGltcG9ydFxuICogcGF0aCAtIG1pcnJvcnMgdGhlIHJlLWV4cG9ydHMgb2YgdGhlIG90aGVyIFNESy1kZXJpdmVkIHNjaGVtYXNcbiAqIGJlbG93LlxuICovXG5leHBvcnQgdHlwZSBNZXNzYWdlU3RhdHVzID0gZGFzaGJvYXJkcy5NZXNzYWdlU3RhdHVzO1xuXG4vKiogUnVudGltZSB2YWxpZGF0b3IgZm9yIGEgcmF3IEdlbmllIG1lc3NhZ2Ugc3RhdHVzIGZyb20gdGhlIGdlbmVyYXRlZCBTREsgY29udHJhY3QuICovXG5leHBvcnQgY29uc3QgTWVzc2FnZVN0YXR1c1NjaGVtYSA9IGRhc2hib2FyZHMubWVzc2FnZVN0YXR1c1NjaGVtYTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdGhvdWdodHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEdlbmllJ3MgcGVyLXF1ZXJ5IFwidGhvdWdodHNcIiBzdXJmYWNlLiBUaGVzZSBhcHBlYXIgb24gdGhlXG4gKiBgL21lc3NhZ2VzL3tpZH1gIHdpcmUgdW5kZXIgYGF0dGFjaG1lbnRzW2ldLnF1ZXJ5LnRob3VnaHRzW11gIGJ1dFxuICogYXJlIG5vdCB0eXBlZCBvbiB0aGUgU0RLJ3MgYEdlbmllUXVlcnlBdHRhY2htZW50YCBhdCB2MC4xNy5cbiAqXG4gKiBLbm93biB0aG91Z2h0IHR5cGVzIG9ic2VydmVkIGluIHByb2R1Y3Rpb24gcG9sbHM6XG4gKlxuICogICAtIGBUSE9VR0hUX1RZUEVfREVTQ1JJUFRJT05gOiBhIG9uZS1wYXJhZ3JhcGggcmVzdGF0ZW1lbnQgb2ZcbiAqICAgICB3aGF0IHRoZSB1c2VyIGFza2VkLiBUaGUgZmluYWwgYHF1ZXJ5LmRlc2NyaXB0aW9uYCBmaWVsZCBvblxuICogICAgIHRoZSBhdHRhY2htZW50IGNhcnJpZXMgdGhlIHNhbWUgdGV4dC5cbiAqICAgLSBgVEhPVUdIVF9UWVBFX0RBVEFfU09VUkNJTkdgOiBtYXJrZG93biBidWxsZXRzIG9mIHRoZVxuICogICAgIGZ1bGx5LXF1YWxpZmllZCBgY2F0YWxvZy5zY2hlbWEudGFibGVgIHNvdXJjZXMgR2VuaWUgY2hvc2UuXG4gKiAgIC0gYFRIT1VHSFRfVFlQRV9TVEVQU2A6IHRoZSBoaWdoLWxldmVsIHBsYW4gR2VuaWUgd3JvdGUgYmVmb3JlXG4gKiAgICAgcnVubmluZyBTUUwgKG9uZSBidWxsZXQgcGVyIHN0ZXApLlxuICogICAtIGBUSE9VR0hUX1RZUEVfVU5ERVJTVEFORElOR2A6IGFtYmlndWl0eSAvIGludGVycHJldGF0aW9uXG4gKiAgICAgbm90ZXMgKGUuZy4gXCIncmV2ZW51ZScgY291bGQgYmUgaW50ZXJwcmV0ZWQgYXMgZ3Jvc3MsXG4gKiAgICAgbmV0LCBvciByZWNvZ25pemVkIHJldmVudWUuLi5cIikuXG4gKlxuICogT3BlbiBhdCB0aGUgdHlwZSBsZXZlbCAoYHwgKHN0cmluZyAmIHt9KWApIHNvIGEgbmV3IHNlcnZlci1zaWRlXG4gKiB0aG91Z2h0IHR5cGUgZG9lc24ndCBicmVhayBjb21waWxhdGlvbjsgdGhlIGZvdXIga25vd24gdHlwZXNcbiAqIHN0aWxsIG5hcnJvdyBjb3JyZWN0bHkgdW5kZXIgYHN3aXRjaGAuXG4gKi9cbmV4cG9ydCB0eXBlIEdlbmllVGhvdWdodFR5cGUgPVxuICB8IFwiVEhPVUdIVF9UWVBFX0RFU0NSSVBUSU9OXCJcbiAgfCBcIlRIT1VHSFRfVFlQRV9EQVRBX1NPVVJDSU5HXCJcbiAgfCBcIlRIT1VHSFRfVFlQRV9TVEVQU1wiXG4gIHwgXCJUSE9VR0hUX1RZUEVfVU5ERVJTVEFORElOR1wiXG4gIHwgKHN0cmluZyAmIHt9KTtcblxuLyoqXG4gKiBPbmUgcmVhc29uaW5nIHN0ZXAgb24gYSBxdWVyeSBhdHRhY2htZW50LiBTZWVcbiAqIHtAbGluayBHZW5pZVRob3VnaHRUeXBlfSBmb3IgdGhlIGtub3duIGB0aG91Z2h0X3R5cGVgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEdlbmllVGhvdWdodFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdGhvdWdodF90eXBlOiB6LmN1c3RvbTxHZW5pZVRob3VnaHRUeXBlPigodikgPT4gdHlwZW9mIHYgPT09IFwic3RyaW5nXCIpLFxuICBjb250ZW50OiB6LnN0cmluZygpLFxufSk7XG4vKiogT25lIHR5cGVkIHJlYXNvbmluZyBlbnRyeSBhdHRhY2hlZCB0byBhIEdlbmllIHF1ZXJ5LiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVUaG91Z2h0ID0gei5pbmZlcjx0eXBlb2YgR2VuaWVUaG91Z2h0U2NoZW1hPjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYXR0YWNobWVudCBkaXNjcmltaW5hdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBEaXNjcmltaW5hdG9yIGZvciB3aGF0J3MgaW5zaWRlIGEgYEdlbmllQXR0YWNobWVudGAuIEdlbmllIG9ubHlcbiAqIGV2ZXIgcG9wdWxhdGVzIG9uZSBvZiBgcXVlcnlgIC8gYHRleHRgIC8gYHN1Z2dlc3RlZF9xdWVzdGlvbnNgXG4gKiBwZXIgYXR0YWNobWVudC4gT3BlbiB2aWEgYChzdHJpbmcgJiB7fSlgIHNvIGEgbmV3IHNlcnZlci1zaWRlXG4gKiB0eXBlIGRvZXNuJ3QgYnJlYWsgY29tcGlsYXRpb247IHRoZSB0aHJlZSBrbm93biB0eXBlcyBzdGlsbFxuICogbmFycm93IGNvcnJlY3RseSB1bmRlciBgc3dpdGNoYC5cbiAqXG4gKiBMaWZ0ZWQgaW50byB0aGUgc2NoZW1hIGFzIHRoZSBvcHRpb25hbFxuICoge0BsaW5rIEdlbmllQXR0YWNobWVudFNjaGVtYX0uYGF0dGFjaG1lbnRfdHlwZWAgZmllbGQgKGNvbXB1dGVcbiAqIGl0IHdpdGgge0BsaW5rIGRldGVjdEF0dGFjaG1lbnRUeXBlfSkgc28gY29uc3VtZXJzIGNhbiBicmFuY2hcbiAqIG9uIGEgbGl0ZXJhbCBpbnN0ZWFkIG9mIHByb2Jpbmcgd2hpY2ggc3ViLW9iamVjdCBrZXkgaXNcbiAqIHByZXNlbnQuIEFsc28gc3VyZmFjZWQgb24ge0BsaW5rIEF0dGFjaG1lbnRFdmVudH0ncyBwYXlsb2FkIGFzXG4gKiBgYXR0YWNobWVudF90eXBlYCAodnMgYSBiYXJlIGB0eXBlYCkgdG8ga2VlcCB0aGUgZmllbGQgY2xlYXIgb2ZcbiAqIHRoZSBldmVudC11bmlvbiBkaXNjcmltaW5hdG9yIGtleS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFUVEFDSE1FTlRfVFlQRVMgPSBbXG4gIFwicXVlcnlcIixcbiAgXCJ0ZXh0XCIsXG4gIFwic3VnZ2VzdGVkX3F1ZXN0aW9uc1wiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgc3RyaW5nW107XG4vKiogQXR0YWNobWVudCBkaXNjcmltaW5hdG9yIHZhbHVlcyB1bmRlcnN0b29kIGJ5IHRoaXMgcGFja2FnZSB2ZXJzaW9uLiAqL1xuZXhwb3J0IHR5cGUgS25vd25BdHRhY2htZW50VHlwZSA9ICh0eXBlb2YgQVRUQUNITUVOVF9UWVBFUylbbnVtYmVyXTtcbi8qKiBGb3J3YXJkLWNvbXBhdGlibGUgYXR0YWNobWVudCBkaXNjcmltaW5hdG9yLCBpbmNsdWRpbmcgZnV0dXJlIEdlbmllIHZhbHVlcy4gKi9cbmV4cG9ydCB0eXBlIEF0dGFjaG1lbnRUeXBlID0gS25vd25BdHRhY2htZW50VHlwZSB8IChzdHJpbmcgJiB7fSk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gd2lkZW5lZCB3aXJlIHNjaGVtYXMgKyB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBgR2VuaWVRdWVyeUF0dGFjaG1lbnRgIHdpZGVuZWQgd2l0aCB0aGUgYHRob3VnaHRzW11gIGZpZWxkIHRoZVxuICogR2VuaWUgd2lyZSBleHBvc2VzIGJ1dCB0aGUgU0RLIGRvZXNuJ3QgY3VycmVudGx5IHR5cGUuIEV2ZXJ5XG4gKiBvdGhlciBmaWVsZCAoYGRlc2NyaXB0aW9uYCwgYHF1ZXJ5YCwgYHN0YXRlbWVudF9pZGAsXG4gKiBgcXVlcnlfcmVzdWx0X21ldGFkYXRhYCwgYHRpdGxlYCwgYHBhcmFtZXRlcnNgLFxuICogYGxhc3RfdXBkYXRlZF90aW1lc3RhbXBgLCBgaWRgKSBmbG93cyB0aHJvdWdoIHZlcmJhdGltIGZyb21cbiAqIHRoZSBTREsgc2NoZW1hLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVRdWVyeUF0dGFjaG1lbnRTY2hlbWEgPSBTREtHZW5pZVF1ZXJ5QXR0YWNobWVudFNjaGVtYS5leHRlbmQoe1xuICB0aG91Z2h0czogei5hcnJheShHZW5pZVRob3VnaHRTY2hlbWEpLm9wdGlvbmFsKCksXG59KTtcbi8qKiBRdWVyeSBhdHRhY2htZW50IHdpZGVuZWQgd2l0aCBHZW5pZSdzIHN0cmVhbWVkIHJlYXNvbmluZyB0aG91Z2h0cy4gKi9cbmV4cG9ydCB0eXBlIEdlbmllUXVlcnlBdHRhY2htZW50ID0gei5pbmZlcjx0eXBlb2YgR2VuaWVRdWVyeUF0dGFjaG1lbnRTY2hlbWE+O1xuXG4vKipcbiAqIFB1cnBvc2UgYXR0YWNoZWQgdG8gYSBHZW5pZSB0ZXh0IHJlc3BvbnNlLlxuICpcbiAqIFRoZSBnZW5lcmF0ZWQgRGF0YWJyaWNrcyBTREsgc2NoZW1hIGN1cnJlbnRseSBrbm93cyBvbmx5XG4gKiBgRk9MTE9XX1VQX1FVRVNUSU9OYCwgd2hpbGUgdGhlIGxpdmUgR2VuaWUgQVBJIGFsc28gZW1pdHNcbiAqIGBURVhUX0FUVEFDSE1FTlRfUFVSUE9TRV9BTlNXRVJgIGZvciB0aGUgcHJpbWFyeSBhbnN3ZXIgdGV4dC4gS2VlcCB0aGVcbiAqIGtub3duIHZhbHVlcyBkaXNjb3ZlcmFibGUgYW5kIGFjY2VwdCBmdXR1cmUgc3RyaW5nIHZhbHVlcyBzbyBhbiBhZGRpdGl2ZVxuICogc2VydmVyLXNpZGUgZW51bSBjaGFuZ2UgY2Fubm90IGludmFsaWRhdGUgYW4gb3RoZXJ3aXNlIGNvbXBsZXRlIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCB0eXBlIEdlbmllVGV4dEF0dGFjaG1lbnRQdXJwb3NlID1cbiAgXCJGT0xMT1dfVVBfUVVFU1RJT05cIiB8IFwiVEVYVF9BVFRBQ0hNRU5UX1BVUlBPU0VfQU5TV0VSXCIgfCAoc3RyaW5nICYge30pO1xuXG4vKipcbiAqIFRleHQgYXR0YWNobWVudCB3aWRlbmVkIGZvciBmb3J3YXJkLWNvbXBhdGlibGUgcHVycG9zZSB2YWx1ZXMgYW5kIG9wdGlvbmFsXG4gKiBBZ2VudCBNb2RlIHRhYmxlIG1ldGFkYXRhLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVUZXh0QXR0YWNobWVudFNjaGVtYSA9IGRhc2hib2FyZHMudGV4dEF0dGFjaG1lbnRTY2hlbWEuZXh0ZW5kKHtcbiAgcHVycG9zZTogei5jdXN0b208R2VuaWVUZXh0QXR0YWNobWVudFB1cnBvc2U+KCh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKS5vcHRpb25hbCgpLFxuICBtZXRhZGF0YTogei51bmtub3duKCkub3B0aW9uYWwoKSxcbn0pO1xuLyoqIE5hcnJhdGl2ZSB0ZXh0IGF0dGFjaG1lbnQsIGluY2x1ZGluZyBpdHMgb3B0aW9uYWwgc2VtYW50aWMgcHVycG9zZS4gKi9cbmV4cG9ydCB0eXBlIEdlbmllVGV4dEF0dGFjaG1lbnQgPSB6LmluZmVyPHR5cGVvZiBHZW5pZVRleHRBdHRhY2htZW50U2NoZW1hPjtcblxuLyoqXG4gKiBgR2VuaWVBdHRhY2htZW50YCB3aXRoOlxuICpcbiAqICAgLSBgcXVlcnlgIHJlLXR5cGVkIHRvIHRoZSB0aG91Z2h0cy1hd2FyZVxuICogICAgIHtAbGluayBHZW5pZVF1ZXJ5QXR0YWNobWVudFNjaGVtYX0uXG4gKiAgIC0gYGF0dGFjaG1lbnRfdHlwZWAgZGlzY3JpbWluYXRvciBsaXRlcmFsXG4gKiAgICAgKHtAbGluayBBdHRhY2htZW50VHlwZX0pIHNvIGNvbnN1bWVycyBjYW4gYHN3aXRjaFxuICogICAgIChhdHQuYXR0YWNobWVudF90eXBlKWAgdG8gbmFycm93IHdoaWNoIHN1Yi1vYmplY3QgaXNcbiAqICAgICBwb3B1bGF0ZWQuIE9wdGlvbmFsIG9uIHRoZSB3aXJlIChHZW5pZSBkb2Vzbid0IHNlbmQgaXQpO1xuICogICAgIGNhbGxlcnMgY29tcHV0ZSBpdCB3aXRoIHtAbGluayBkZXRlY3RBdHRhY2htZW50VHlwZX0gd2hlblxuICogICAgIHRoZXkgd2FudCB0aGUgbGl0ZXJhbCB1cC1mcm9udC5cbiAqXG4gKiBgdGV4dGAgaXMgcmUtdHlwZWQgdG8gdGhlIGZvcndhcmQtY29tcGF0aWJsZVxuICoge0BsaW5rIEdlbmllVGV4dEF0dGFjaG1lbnRTY2hlbWF9LiBgYXR0YWNobWVudF9pZGAgYW5kXG4gKiBgc3VnZ2VzdGVkX3F1ZXN0aW9uc2AgcGFzcyB0aHJvdWdoIHVuY2hhbmdlZC4gYGF0dGFjaG1lbnRfaWRgIGlzIGdlbnVpbmVseVxuICogb3B0aW9uYWwgb24gdGhlIHdpcmU6XG4gKiB0aGUgZmlyc3QgdGV4dCBhdHRhY2htZW50IEdlbmllIGVtaXRzIHBlciB0dXJuICh0aGUgXCJtYWluXG4gKiBhbnN3ZXIgdGV4dFwiKSBhcnJpdmVzIHdpdGggbm8gaWQsIG9ubHkgdGhlIGZvbGxvdy11cCB0ZXh0XG4gKiBhdHRhY2htZW50IGdldHMgb25lLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVBdHRhY2htZW50U2NoZW1hID0gU0RLR2VuaWVBdHRhY2htZW50U2NoZW1hLmV4dGVuZCh7XG4gIHF1ZXJ5OiBHZW5pZVF1ZXJ5QXR0YWNobWVudFNjaGVtYS5vcHRpb25hbCgpLFxuICB0ZXh0OiBHZW5pZVRleHRBdHRhY2htZW50U2NoZW1hLm9wdGlvbmFsKCksXG4gIGF0dGFjaG1lbnRfdHlwZTogei5jdXN0b208QXR0YWNobWVudFR5cGU+KCh2KSA9PiB0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikub3B0aW9uYWwoKSxcbn0pO1xuLyoqIEdlbmllIG1lc3NhZ2UgYXR0YWNobWVudCB3aXRoIGFuIG9wdGlvbmFsIGNvbXB1dGVkIGRpc2NyaW1pbmF0b3IuICovXG5leHBvcnQgdHlwZSBHZW5pZUF0dGFjaG1lbnQgPSB6LmluZmVyPHR5cGVvZiBHZW5pZUF0dGFjaG1lbnRTY2hlbWE+O1xuXG4vKipcbiAqIGBHZW5pZU1lc3NhZ2VgIHdpZGVuZWQgd2l0aDpcbiAqXG4gKiAgIC0gYGF1dG9fcmVnZW5lcmF0ZV9jb3VudGA6IG51bWJlciBzdGFtcGVkIG9uIGV2ZXJ5IHdpcmVcbiAqICAgICBtZXNzYWdlIHRoYXQgdGhlIFNESyB0eXBlIG9taXRzIGF0IHYwLjE3LlxuICogICAtIGBhdHRhY2htZW50c2A6IHJlLXR5cGVkIHRvIHRoZSBsb2NhbFxuICogICAgIHtAbGluayBHZW5pZUF0dGFjaG1lbnRTY2hlbWF9IHNvXG4gKiAgICAgYGF0dGFjaG1lbnQucXVlcnk/LnRob3VnaHRzYCAoYW5kIHRoZVxuICogICAgIGBhdHRhY2htZW50X3R5cGVgIGRpc2NyaW1pbmF0b3IpIGlzIHJlYWNoYWJsZSB3aXRob3V0IGFcbiAqICAgICBjYXN0LlxuICpcbiAqIEV2ZXJ5IG90aGVyIGZpZWxkIChgaWRgLCBgc3BhY2VfaWRgLCBgY29udmVyc2F0aW9uX2lkYCxcbiAqIGB1c2VyX2lkYCwgYGNyZWF0ZWRfdGltZXN0YW1wYCwgYGxhc3RfdXBkYXRlZF90aW1lc3RhbXBgLFxuICogYHN0YXR1c2AsIGBjb250ZW50YCwgYG1lc3NhZ2VfaWRgLCBgcXVlcnlfcmVzdWx0YCwgYGVycm9yYCxcbiAqIGBmZWVkYmFja2ApIHBhc3NlcyB0aHJvdWdoIGZyb20gdGhlIFNESyBzY2hlbWEuXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZU1lc3NhZ2VTY2hlbWEgPSBTREtHZW5pZU1lc3NhZ2VTY2hlbWEuZXh0ZW5kKHtcbiAgYXR0YWNobWVudHM6IHouYXJyYXkoR2VuaWVBdHRhY2htZW50U2NoZW1hKS5vcHRpb25hbCgpLFxuICBhdXRvX3JlZ2VuZXJhdGVfY291bnQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbn0pO1xuLyoqIEdlbmllIG1lc3NhZ2Ugc25hcHNob3Qgd2lkZW5lZCB3aXRoIHR5cGVkIGF0dGFjaG1lbnRzIGFuZCByZWdlbmVyYXRpb24gY291bnQuICovXG5leHBvcnQgdHlwZSBHZW5pZU1lc3NhZ2UgPSB6LmluZmVyPHR5cGVvZiBHZW5pZU1lc3NhZ2VTY2hlbWE+O1xuXG4vKipcbiAqIERvbWFpbiBwcm9qZWN0aW9uIG9mIHtAbGluayBHZW5pZU1lc3NhZ2VTY2hlbWF9IHRoYXQgZHJvcHMgZXZlcnlcbiAqIHR1cm4tbGV2ZWwgZmllbGQgKGBpZGAsIGBzdGF0dXNgLCBgY3JlYXRlZF90aW1lc3RhbXBgLFxuICogYHF1ZXJ5X3Jlc3VsdGAsIC4uLikgYW5kIHlpZWxkcyBqdXN0IHRoZSByZXNwb25zZSBwYXlsb2FkIGFzIGFcbiAqIGZsYXQgYEdlbmllQXR0YWNobWVudFtdYC4gUGFyc2VzIHRoZSBzYW1lIHdpcmUgc2hhcGUgYXNcbiAqIHtAbGluayBHZW5pZU1lc3NhZ2VTY2hlbWF9OyBtaXNzaW5nIGBhdHRhY2htZW50c2AgZGVmYXVsdHMgdG9cbiAqIGBbXWAgc28gdGhlIG91dHB1dCBpcyBhbHdheXMgYW4gYXJyYXkuXG4gKlxuICogVXNlIHdoZW4gY29uc3VtZXJzIG9ubHkgY2FyZSBhYm91dCB0aGUgbW9kZWwncyByZXNwb25zZVxuICogYXR0YWNobWVudHMgYW5kIG5vdCB0aGUgc3Vycm91bmRpbmcgbWVzc2FnZSBlbnZlbG9wZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEdlbmllUmVzcG9uc2VTY2hlbWEgPSBHZW5pZU1lc3NhZ2VTY2hlbWEudHJhbnNmb3JtKChtKSA9PiBtLmF0dGFjaG1lbnRzID8/IFtdKTtcbi8qKiBOb3JtYWxpemVkIGF0dGFjaG1lbnQgYXJyYXkgZXh0cmFjdGVkIGZyb20gYSBHZW5pZSBtZXNzYWdlIHJlc3BvbnNlLiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVSZXNwb25zZSA9IHouaW5mZXI8dHlwZW9mIEdlbmllUmVzcG9uc2VTY2hlbWE+O1xuXG4vKipcbiAqIGBHZW5pZVNwYWNlYCB3aWRlbmVkIHdpdGggYW4gb3B0aW9uYWwgYHNlcmlhbGl6ZWRfc3BhY2VgIGZpZWxkXG4gKiBjYXJyeWluZyBhIEpTT04tc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGFjZSdzIGZ1bGxcbiAqIGRlZmluaXRpb24gKGNhdGFsb2dzLCBzY2hlbWFzLCB0YWJsZXMsIHNhbXBsZSBxdWVzdGlvbnMsIHByb21wdHMsXG4gKiBldGMuKSBhcyBleHBvcnRlZCBieSB0aGUgd29ya3NwYWNlIGV4cG9ydCBlbmRwb2ludC5cbiAqXG4gKiBUaGUgYmFzZSBTREsgc2hhcGUgKGBkZXNjcmlwdGlvbmAsIGBzcGFjZV9pZGAsIGB0aXRsZWAsXG4gKiBgd2FyZWhvdXNlX2lkYCkgY292ZXJzIHRoZSBkaXJlY3RvcnktbGlzdGluZyBzdXJmYWNlIC0gZW5vdWdoIHRvXG4gKiByb3V0ZSBhIGNoYXQuIGBzZXJpYWxpemVkX3NwYWNlYCBpcyBvcHQtaW4gc28gY2FsbGVycyB0aGF0IG5lZWRcbiAqIHRoZSBmdWxsIHNwYWNlIHNjaGVtYSAoZS5nLiB0byBzZWVkIGEgc3lzdGVtIHByb21wdCBvciB0byBzaGlwXG4gKiB0aGUgZGVmaW5pdGlvbiB0byBhbiBhZ2VudCkgY2FuIGF0dGFjaCBpdCB3aXRob3V0IGEgc2Vjb25kIHR5cGUuXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZVNwYWNlU2NoZW1hID0gU0RLR2VuaWVTcGFjZVNjaGVtYS5leHRlbmQoe1xuICBzZXJpYWxpemVkX3NwYWNlOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBcIlRoZSBjb250ZW50cyBvZiB0aGUgR2VuaWUgU3BhY2UgaW4gc2VyaWFsaXplZCBzdHJpbmcgZm9ybS4gVGhpcyBmaWVsZCBpcyBleGNsdWRlZCBpbiBMaXN0IEdlbmllIHNwYWNlcyByZXNwb25zZXMuIFRoaXMgZmllbGQgcHJvdmlkZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgSlNPTiBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBzcGFjZSdzIGxheW91dCBhbmQgY29tcG9uZW50cy5cIixcbiAgICApLFxufSk7XG4vKiogR2VuaWUgc3BhY2UgbWV0YWRhdGEgd2l0aCB0aGUgaWRlbnRpZmllcnMgcmVxdWlyZWQgYnkgY2hhdCBjb25zdW1lcnMuICovXG5leHBvcnQgdHlwZSBHZW5pZVNwYWNlID0gei5pbmZlcjx0eXBlb2YgR2VuaWVTcGFjZVNjaGVtYT47XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0ZXJtaW5hbCBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUZXJtaW5hbCBHZW5pZSBtZXNzYWdlIHN0YXR1c2VzLiBUaGUgcG9sbGluZyBsb29wIGluIHRoZSBjaGF0XG4gKiBkcml2ZXIgc3RvcHMgYXMgc29vbiBhcyB0aGUgbGF0ZXN0IG1lc3NhZ2UgaGFzIG9uZSBvZiB0aGVzZVxuICogc3RhdHVzZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBURVJNSU5BTF9TVEFUVVNFUyA9IFtcIkNPTVBMRVRFRFwiLCBcIkZBSUxFRFwiLCBcIkNBTkNFTExFRFwiXSBhcyBjb25zdDtcbi8qKiBNZXNzYWdlIHN0YXR1cyB0aGF0IGVuZHMgYSBHZW5pZSB0dXJuIGFuZCBwcm9kdWNlcyBhIGZpbmFsIHJlc3VsdCBldmVudC4gKi9cbmV4cG9ydCB0eXBlIFRlcm1pbmFsU3RhdHVzID0gKHR5cGVvZiBURVJNSU5BTF9TVEFUVVNFUylbbnVtYmVyXTtcblxuLyoqIE5hcnJvdyBgTWVzc2FnZVN0YXR1cyB8IHVuZGVmaW5lZGAgdG8gYSB7QGxpbmsgVGVybWluYWxTdGF0dXN9LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGVybWluYWxTdGF0dXMoczogTWVzc2FnZVN0YXR1cyB8IHVuZGVmaW5lZCk6IHMgaXMgVGVybWluYWxTdGF0dXMge1xuICByZXR1cm4gcyAhPT0gdW5kZWZpbmVkICYmIChURVJNSU5BTF9TVEFUVVNFUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMocyk7XG59XG5cbi8qKlxuICogQ29udmVydCBhIHJhdyBHZW5pZSB3aXJlIHN0YXR1cyAoYEZFVENISU5HX01FVEFEQVRBYCxcbiAqIGBBU0tJTkdfQUlgLCBgRVhFQ1VUSU5HX1FVRVJZYCwgLi4uKSBpbnRvIGEgc2hvcnQsIHNlbnRlbmNlLWNhc2VkXG4gKiBsYWJlbCBzYWZlIHRvIGRyb3AgaW50byBhIFVJIHBpbGwuIEtub3duIHN0YXRlcyBnZXQgYSBjdXJhdGVkXG4gKiBsYWJlbDsgdW5rbm93biBzdGF0ZXMgZmFsbCBiYWNrIHRvIGBzdHJpbmdVdGlscy50b2tlbml6ZVdpdGhPcHRpb25zYFxuICogc28gbmV3IHN0YXRlcyBzdGlsbCByZW5kZXIgY2xlYW5seSB3aXRob3V0IGNvZGUgY2hhbmdlcy5cbiAqXG4gKiBQdXJlIChubyBOb2RlLW9ubHkgZGVwcyksIHNhZmUgZm9yIGJyb3dzZXIgYnVuZGxlcy4gQm90aCB0aGVcbiAqIEdlbmllIGFnZW50IChzZXJ2ZXIpIGFuZCBhbnkgVUkgdGhhdCBzdWJzY3JpYmVzIHRvIHN0YXR1cyBldmVudHNcbiAqIGNhbGwgdGhpcyBzbyBsYWJlbHMgc3RheSBpbiBsb2NrLXN0ZXAgYWNyb3NzIHRoZSB3aXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaHVtYW5pemVTdGF0dXMoc3RhdHVzOiBNZXNzYWdlU3RhdHVzKTogc3RyaW5nIHtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlIFwiRkVUQ0hJTkdfTUVUQURBVEFcIjpcbiAgICAgIHJldHVybiBcIkZldGNoaW5nIG1ldGFkYXRhXCI7XG4gICAgY2FzZSBcIkFTS0lOR19BSVwiOlxuICAgICAgcmV0dXJuIFwiQXNraW5nIEdlbmllXCI7XG4gICAgY2FzZSBcIkVYRUNVVElOR19RVUVSWVwiOlxuICAgICAgcmV0dXJuIFwiUnVubmluZyBTUUwgcXVlcnlcIjtcbiAgICBjYXNlIFwiRklMVEVSSU5HX0NPTlRFWFRcIjpcbiAgICAgIHJldHVybiBcIkZpbHRlcmluZyBjb250ZXh0XCI7XG4gICAgY2FzZSBcIlBFTkRJTkdfV0FSRUhPVVNFXCI6XG4gICAgICByZXR1cm4gXCJXYWl0aW5nIGZvciB3YXJlaG91c2VcIjtcbiAgICBjYXNlIFwiQ09NUExFVEVEXCI6XG4gICAgICByZXR1cm4gXCJDb21wbGV0ZWRcIjtcbiAgICBjYXNlIFwiRkFJTEVEXCI6XG4gICAgICByZXR1cm4gXCJGYWlsZWRcIjtcbiAgICBjYXNlIFwiQ0FOQ0VMTEVEXCI6XG4gICAgICByZXR1cm4gXCJDYW5jZWxsZWRcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4uc3RyaW5nVXRpbHMudG9rZW5pemVXaXRoT3B0aW9ucyh7IGNhcGl0YWxpemU6IHRydWUsIGxvd2VyQ2FzZTogdHJ1ZSB9LCBzdGF0dXMpLFxuICAgICAgXS5qb2luKFwiIFwiKTtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhdHRhY2htZW50IHR5cGUgaGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBJbnNwZWN0IGEge0BsaW5rIEdlbmllQXR0YWNobWVudH0gYW5kIHJldHVybiB0aGVcbiAqIHtAbGluayBBdHRhY2htZW50VHlwZX0gb2YgcGF5bG9hZCBpdCBjYXJyaWVzLiBSZXR1cm5zIHRoZSBmaXJzdFxuICoga25vd24gc3ViLW9iamVjdCB0aGF0J3MgcHJlc2VudDsgaWYgbm9uZSBvZiB0aGUga25vd24gb25lcyBhcmVcbiAqIHBvcHVsYXRlZCwgZmFsbHMgYmFjayB0byB0aGUgZmlyc3Qgbm9uLWJvb2trZWVwaW5nIGtleVxuICogKGZvcndhcmQtY29tcGF0IGZvciB0eXBlcyB3ZSBkb24ndCBtb2RlbCB5ZXQpLCBlbHNlIGBcInVua25vd25cImAuXG4gKlxuICogSG9ub3JzIGEgcHJlLXNldCBgYXR0YWNobWVudF90eXBlYCBpZiBvbmUgaXMgYWxyZWFkeSBvbiB0aGVcbiAqIHZhbHVlLCBzbyB0aGlzIGlzIGlkZW1wb3RlbnQgYWNyb3NzIHJlLWRldGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RBdHRhY2htZW50VHlwZShhdHQ6IEdlbmllQXR0YWNobWVudCk6IEF0dGFjaG1lbnRUeXBlIHtcbiAgaWYgKGF0dC5hdHRhY2htZW50X3R5cGUpIHJldHVybiBhdHQuYXR0YWNobWVudF90eXBlO1xuICBpZiAoYXR0LnF1ZXJ5KSByZXR1cm4gXCJxdWVyeVwiO1xuICBpZiAoYXR0LnRleHQpIHJldHVybiBcInRleHRcIjtcbiAgaWYgKGF0dC5zdWdnZXN0ZWRfcXVlc3Rpb25zKSByZXR1cm4gXCJzdWdnZXN0ZWRfcXVlc3Rpb25zXCI7XG4gIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhhdHQpKSB7XG4gICAgaWYgKGsgIT09IFwiYXR0YWNobWVudF9pZFwiICYmIGsgIT09IFwiYXR0YWNobWVudF90eXBlXCIpIHJldHVybiBrO1xuICB9XG4gIHJldHVybiBcInVua25vd25cIjtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHZW5pZUNoYXQgZXZlbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFdoZXJlIG9uIHRoZSB3aXJlIGFuIGV2ZW50IHdhcyBvYnNlcnZlZC4gU3ByZWFkIGludG8gZXZlcnlcbiAqIGF0dGFjaG1lbnQtc2NvcGVkIGV2ZW50IHBheWxvYWQgc28gc3Vic2NyaWJlcnMgY2FuIHJvdXRlLCBsb2csXG4gKiBvciBjb3JyZWxhdGUgd2l0aG91dCByZS13YWxraW5nIHRoZSBtZXNzYWdlLlxuICpcbiAqIEZpZWxkczpcbiAqICAgLSBgc3BhY2VfaWRgOiB0aGUgR2VuaWUgc3BhY2UgdGhlIGNvbnZlcnNhdGlvbiBsaXZlcyBpbi5cbiAqICAgLSBgY29udmVyc2F0aW9uX2lkYDogY29udmVyc2F0aW9uIGlkIG9uY2UgR2VuaWUgaGFzIGFzc2lnbmVkIG9uZS5cbiAqICAgLSBgbWVzc2FnZV9pZGA6IEdlbmllIG1lc3NhZ2UgaWQgZm9yIHRoZSBhY3RpdmUgdHVybi5cbiAqICAgLSBgYXR0YWNobWVudF9pZGA6IGF0dGFjaG1lbnQgdGhlIGV2ZW50IGNhbWUgZnJvbS4gT3B0aW9uYWxcbiAqICAgICBiZWNhdXNlIEdlbmllIHNvbWV0aW1lcyBlbWl0cyBhbiBhbm9ueW1vdXMgbWFpbi1hbnN3ZXJcbiAqICAgICBhdHRhY2htZW50IHdpdGhvdXQgYW4gaWQ7IHRob3NlIHN0aWxsIGdldCBldmVudHMsIGp1c3Qgd2l0aFxuICogICAgIGBhdHRhY2htZW50X2lkYCB1bmRlZmluZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3BhY2VfaWQ6IHouc3RyaW5nKCksXG4gIGNvbnZlcnNhdGlvbl9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBtZXNzYWdlX2lkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGF0dGFjaG1lbnRfaWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuLyoqIENvbnZlcnNhdGlvbiwgbWVzc2FnZSwgYW5kIGF0dGFjaG1lbnQgY29vcmRpbmF0ZXMgc2hhcmVkIGJ5IGF0dGFjaG1lbnQgZXZlbnRzLiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVDaGF0TG9jYXRpb24gPSB6LmluZmVyPHR5cGVvZiBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYT47XG5cbi8qKlxuICogTGlmZWN5Y2xlIGV2ZW50OiB0aGUgcXVlc3Rpb24gdGhpcyB0dXJuIGlzIGFza2luZyBHZW5pZS4gRmlyZXNcbiAqIG9uY2UgcGVyIGBnZW5pZUV2ZW50Q2hhdGAgY2FsbCwgdGhlIGZpcnN0IHRpbWUgdGhlIHVuZGVybHlpbmdcbiAqIGBnZW5pZUNoYXRgIGxvb3AgeWllbGRzIGEgYEdlbmllTWVzc2FnZWAuIENhcnJpZXMgdGhlIHByb21wdFxuICogdGV4dCBHZW5pZSBlY2hvZWQgYmFjayBvbiBgbWVzc2FnZS5jb250ZW50YCBhbmQgdGhlIGFzc2lnbmVkXG4gKiBgbWVzc2FnZV9pZGAgc28gc3Vic2NyaWJlcnMgY2FuIGdyb3VwIGV2ZXJ5IHN1YnNlcXVlbnQgZXZlbnRcbiAqIGZvciB0aGlzIHR1cm4gdW5kZXIgb25lIHN0YWJsZSBrZXkuIGBjb252ZXJzYXRpb25faWRgIGlzXG4gKiBwb3B1bGF0ZWQgZm9yIGJvdGggb3BlbmluZyBhbmQgZm9sbG93LXVwIHR1cm5zIChHZW5pZSBhc3NpZ25zXG4gKiBpdCBvbiBgc3RhcnRDb252ZXJzYXRpb25gKS5cbiAqXG4gKiBEZWZlcnJlZCAoaW5zdGVhZCBvZiBmaXJlZCBzeW5jaHJvbm91c2x5IG9uIGVudHJ5KSBzbyB0aGVcbiAqIGBtZXNzYWdlX2lkYCBpcyBhdmFpbGFibGUgd2hlbiB0aGUgZXZlbnQgbGFuZHMgLSB0aGF0IG9uZSByb3VuZFxuICogdHJpcCBjb3N0cyB+MjAwbXMgYnV0IGxldHMgVUlzIHJlbmRlciBxdWVzdGlvbiAvIHRoaW5raW5nIC9cbiAqIHF1ZXJ5IC8gdGV4dCBhcyBhIHNpbmdsZSBncm91cGVkIGJsb2NrIHBlciBHZW5pZSBjYWxsIGluc3RlYWRcbiAqIG9mIGEgZmxhdCBzdHJlYW0uXG4gKlxuICogYGF0dGFjaG1lbnRfaWRgIGlzIGludGVudGlvbmFsbHkgYWJzZW50IC0gcXVlc3Rpb25zIGFyZSB0dXJuXG4gKiBzY29wZWQsIG5vdCBhdHRhY2htZW50IHNjb3BlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXN0aW9uRXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5vbWl0KHtcbiAgYXR0YWNobWVudF9pZDogdHJ1ZSxcbn0pLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInF1ZXN0aW9uXCIpLFxuICBjb250ZW50OiB6LnN0cmluZygpLFxufSk7XG4vKiogSW5pdGlhbCBldmVudCBjYXJyeWluZyB0aGUgdXNlcidzIHF1ZXN0aW9uIGFmdGVyIEdlbmllIGFzc2lnbnMgYSBtZXNzYWdlIGlkLiAqL1xuZXhwb3J0IHR5cGUgUXVlc3Rpb25FdmVudCA9IHouaW5mZXI8dHlwZW9mIFF1ZXN0aW9uRXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIExpZmVjeWNsZSBldmVudDogcmF3IGBHZW5pZU1lc3NhZ2VgIHNuYXBzaG90IGZvciB0aGUgYWN0aXZlXG4gKiB0dXJuLiBGaXJlcyBvbmNlIHBlciBwb2xsIHlpZWxkLiBUaGUgZnVsbCBtZXNzYWdlIHNoYXBlXG4gKiAoaW5jbHVkaW5nIHRoZSB3aWRlbmVkIHRob3VnaHQgLyByZWdlbiAvIGF0dGFjaG1lbnQtdHlwZVxuICogZmllbGRzKSBpcyBleHBvc2VkIGlubGluZSBhcyBgbWVzc2FnZWA7IGNvbnN1bWVycyBuYXJyb3cgb25cbiAqIGBldmVudC50eXBlID09PSBcIm1lc3NhZ2VcImAgYW5kIHJlYWNoIGZvciBgZXZlbnQubWVzc2FnZWAuXG4gKi9cbmV4cG9ydCBjb25zdCBNZXNzYWdlRXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5vbWl0KHtcbiAgYXR0YWNobWVudF9pZDogdHJ1ZSxcbn0pLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcIm1lc3NhZ2VcIiksXG4gIG1lc3NhZ2U6IEdlbmllTWVzc2FnZVNjaGVtYSxcbn0pO1xuLyoqIFJhdyBHZW5pZSBtZXNzYWdlIHNuYXBzaG90IGVtaXR0ZWQgb24gZXZlcnkgcG9sbCBpdGVyYXRpb24uICovXG5leHBvcnQgdHlwZSBNZXNzYWdlRXZlbnQgPSB6LmluZmVyPHR5cGVvZiBNZXNzYWdlRXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIFRvcC1sZXZlbCBgbWVzc2FnZS5zdGF0dXNgIHRyYW5zaXRpb25lZC4gRmlyZXMgZm9yIGV2ZXJ5XG4gKiBkaXN0aW5jdCBzdGF0dXMgc2VlbiBvbiB0aGUgd2lyZSAoZS5nLiBgU1VCTUlUVEVEYCAtPlxuICogYEZJTFRFUklOR19DT05URVhUYCAtPiBgQVNLSU5HX0FJYCAtPiBgUEVORElOR19XQVJFSE9VU0VgIC0+XG4gKiBgQVNLSU5HX0FJYCAtPiBgQ09NUExFVEVEYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBTdGF0dXNFdmVudFNjaGVtYSA9IEdlbmllQ2hhdExvY2F0aW9uU2NoZW1hLm9taXQoe1xuICBhdHRhY2htZW50X2lkOiB0cnVlLFxufSkuZXh0ZW5kKHtcbiAgdHlwZTogei5saXRlcmFsKFwic3RhdHVzXCIpLFxuICBzdGF0dXM6IE1lc3NhZ2VTdGF0dXNTY2hlbWEsXG4gIHByZXZpb3VzX3N0YXR1czogTWVzc2FnZVN0YXR1c1NjaGVtYS5vcHRpb25hbCgpLFxufSk7XG4vKiogTWVzc2FnZS1zdGF0dXMgdHJhbnNpdGlvbiwgaW5jbHVkaW5nIHRoZSBwcmV2aW91cyBzdGF0dXMgd2hlbiBhdmFpbGFibGUuICovXG5leHBvcnQgdHlwZSBTdGF0dXNFdmVudCA9IHouaW5mZXI8dHlwZW9mIFN0YXR1c0V2ZW50U2NoZW1hPjtcblxuLyoqXG4gKiBBIG5ldyBhdHRhY2htZW50IHNsb3QgYXBwZWFyZWQgaW4gYG1lc3NhZ2UuYXR0YWNobWVudHNbXWAuXG4gKiBGaXJlcyBleGFjdGx5IG9uY2UgcGVyIGF0dGFjaG1lbnQgKG1hdGNoZWQgYnkgYGF0dGFjaG1lbnRfaWRgLFxuICogcG9zaXRpb25hbGx5IGZvciBhbm9ueW1vdXMgYXR0YWNobWVudHMpIHRoZSBmaXJzdCB0aW1lIHdlIHNlZVxuICogaXQuIFRoZSBzbG90J3MgcGF5bG9hZCBraW5kIGxhbmRzIGluIGBhdHRhY2htZW50X3R5cGVgIHNvIHRoZVxuICogb3V0ZXIgYHR5cGVgIGRpc2NyaW1pbmF0b3Igc3RheXMgdW5hbWJpZ3VvdXMuXG4gKi9cbmV4cG9ydCBjb25zdCBBdHRhY2htZW50RXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJhdHRhY2htZW50XCIpLFxuICBpbmRleDogei5udW1iZXIoKSxcbiAgYXR0YWNobWVudF90eXBlOiB6LmN1c3RvbTxBdHRhY2htZW50VHlwZT4oKHYpID0+IHR5cGVvZiB2ID09PSBcInN0cmluZ1wiKSxcbn0pO1xuLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiBhIG5ldyB0eXBlZCBhdHRhY2htZW50IGFwcGVhcnMgb24gdGhlIG1lc3NhZ2UuICovXG5leHBvcnQgdHlwZSBBdHRhY2htZW50RXZlbnQgPSB6LmluZmVyPHR5cGVvZiBBdHRhY2htZW50RXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIEEgbmV3IHJlYXNvbmluZyBzdGVwIGFwcGVhcmVkIG9uIGEgcXVlcnkgYXR0YWNobWVudFxuICogKGBhdHRhY2htZW50c1tpXS5xdWVyeS50aG91Z2h0c1tpXWApLiBEZWR1cGxpY2F0ZWQgcGVyXG4gKiBgKHRob3VnaHRfdHlwZSwgY29udGVudClgIHR1cGxlIHdpdGhpbiBhbiBhdHRhY2htZW50IHNvXG4gKiBzdWJzY3JpYmVycyBkb24ndCBzZWUgdGhlIHNhbWUgdGhvdWdodCBtdWx0aXBsZSB0aW1lcyAtIEdlbmllXG4gKiBzb21ldGltZXMgbXV0YXRlcyBleGlzdGluZyB0aG91Z2h0IHNsb3RzIGluIHBsYWNlLCBzbyB0aGUgZGlmZlxuICogaXMgdmFsdWUtYmFzZWQgcmF0aGVyIHRoYW4gcG9zaXRpb25hbC5cbiAqL1xuZXhwb3J0IGNvbnN0IFRoaW5raW5nRXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJ0aGlua2luZ1wiKSxcbiAgdGV4dDogei5zdHJpbmcoKSxcbiAgdGhvdWdodF90eXBlOiB6LmN1c3RvbTxHZW5pZVRob3VnaHRUeXBlPigodikgPT4gdHlwZW9mIHYgPT09IFwic3RyaW5nXCIpLFxufSk7XG4vKiogSW5jcmVtZW50YWwgR2VuaWUgcmVhc29uaW5nIGV2ZW50IGRlcml2ZWQgZnJvbSBxdWVyeSB0aG91Z2h0cy4gKi9cbmV4cG9ydCB0eXBlIFRoaW5raW5nRXZlbnQgPSB6LmluZmVyPHR5cGVvZiBUaGlua2luZ0V2ZW50U2NoZW1hPjtcblxuLyoqXG4gKiBBIHRleHQtYXR0YWNobWVudCBgY29udGVudGAgZmllbGQgYXBwZWFyZWQgb3IgY2hhbmdlZFxuICogKGBhdHRhY2htZW50c1tpXS50ZXh0LmNvbnRlbnRgKS4gRmlyZXMgd2hlbmV2ZXIgdGhlIHNuYXBzaG90XG4gKiB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHByZXZpb3VzIG9uZSBmb3IgdGhlIHNhbWUgYXR0YWNobWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IFRleHRFdmVudFNjaGVtYSA9IEdlbmllQ2hhdExvY2F0aW9uU2NoZW1hLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInRleHRcIiksXG4gIHRleHQ6IHouc3RyaW5nKCksXG59KTtcbi8qKiBOYXJyYXRpdmUgYW5zd2VyIGZyYWdtZW50IGVtaXR0ZWQgZnJvbSBhIEdlbmllIHRleHQgYXR0YWNobWVudC4gKi9cbmV4cG9ydCB0eXBlIFRleHRFdmVudCA9IHouaW5mZXI8dHlwZW9mIFRleHRFdmVudFNjaGVtYT47XG5cbi8qKlxuICogU1FMIHdhcyBmaW5hbGl6ZWQgb24gYSBxdWVyeSBhdHRhY2htZW50XG4gKiAoYGF0dGFjaG1lbnRzW2ldLnF1ZXJ5LnF1ZXJ5YCkuIEZpcmVzIG9uY2Ugd2hlbiB0aGUgU1FMIHN0cmluZ1xuICogdHJhbnNpdGlvbnMgZnJvbSB1bmRlZmluZWQgdG8gZGVmaW5lZCwgYW5kIGFnYWluIGlmIEdlbmllIGV2ZXJcbiAqIHJld3JpdGVzIGl0LiBgdGl0bGVgIGFuZCBgZGVzY3JpcHRpb25gIGFyZSBkZW5vcm1hbGlzZWQgb2ZmIHRoZVxuICogYXR0YWNobWVudCdzIGBxdWVyeS50aXRsZWAgLyBgcXVlcnkuZGVzY3JpcHRpb25gIHNvIGNvbnN1bWVyc1xuICogY2FuIGxhYmVsIHRoZSBTUUwgcGlsbCB3aXRob3V0IHJlLXdhbGtpbmcgdGhlIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBjb25zdCBRdWVyeUV2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEuZXh0ZW5kKHtcbiAgdHlwZTogei5saXRlcmFsKFwicXVlcnlcIiksXG4gIHNxbDogei5zdHJpbmcoKSxcbiAgdGl0bGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZGVzY3JpcHRpb246IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuLyoqIEZpbmFsaXplZCBvciByZXdyaXR0ZW4gU1FMIGVtaXR0ZWQgZm9yIGEgR2VuaWUgcXVlcnkgYXR0YWNobWVudC4gKi9cbmV4cG9ydCB0eXBlIFF1ZXJ5RXZlbnQgPSB6LmluZmVyPHR5cGVvZiBRdWVyeUV2ZW50U2NoZW1hPjtcblxuLyoqXG4gKiBTUUwgd2FzIHN1Ym1pdHRlZCB0byBhIFNRTCB3YXJlaG91c2UgYW5kIGEgc3RhdGVtZW50IGlkIHdhc1xuICogYXNzaWduZWQgKGBhdHRhY2htZW50c1tpXS5xdWVyeS5zdGF0ZW1lbnRfaWRgKS4gRmlyZXMgd2hlbiB0aGVcbiAqIHN0YXRlbWVudCBpZCB0cmFuc2l0aW9ucyBmcm9tIHVuZGVmaW5lZCB0byBkZWZpbmVkIC0gdGhpcyBpcyB0aGVcbiAqIHBvaW50IGF0IHdoaWNoIGBjbGllbnQuc3RhdGVtZW50RXhlY3V0aW9uLmdldFN0YXRlbWVudCh7IHN0YXRlbWVudF9pZCB9KWBcbiAqIGJlY29tZXMgYSB2YWxpZCBjYWxsLlxuICovXG5leHBvcnQgY29uc3QgU3RhdGVtZW50RXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJzdGF0ZW1lbnRcIiksXG4gIHN0YXRlbWVudF9pZDogei5zdHJpbmcoKSxcbn0pO1xuLyoqIEV2ZW50IGluZGljYXRpbmcgdGhhdCBhIHF1ZXJ5IHJlY2VpdmVkIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50IGlkLiAqL1xuZXhwb3J0IHR5cGUgU3RhdGVtZW50RXZlbnQgPSB6LmluZmVyPHR5cGVvZiBTdGF0ZW1lbnRFdmVudFNjaGVtYT47XG5cbi8qKlxuICogUm93IGNvdW50IGZvciBhIHF1ZXJ5IGF0dGFjaG1lbnQncyByZXN1bHQgY2hhbmdlZFxuICogKGBhdHRhY2htZW50c1tpXS5xdWVyeS5xdWVyeV9yZXN1bHRfbWV0YWRhdGEucm93X2NvdW50YCkuIEZpcmVzXG4gKiBvbiBldmVyeSBjaGFuZ2UsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBgdW5kZWZpbmVkIC0+IDBgIGFuZCB0aGVcbiAqIGxhdGVyIGAwIC0+IE5gIG9uY2UgdGhlIHdhcmVob3VzZSBmaW5pc2hlcyBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBSb3dzRXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJyb3dzXCIpLFxuICByb3dfY291bnQ6IHoubnVtYmVyKCksXG4gIHByZXZpb3VzX3Jvd19jb3VudDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBzdGF0ZW1lbnRfaWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuLyoqIFJvdy1jb3VudCB0cmFuc2l0aW9uIGZvciBhIEdlbmllIHF1ZXJ5IHJlc3VsdC4gKi9cbmV4cG9ydCB0eXBlIFJvd3NFdmVudCA9IHouaW5mZXI8dHlwZW9mIFJvd3NFdmVudFNjaGVtYT47XG5cbi8qKlxuICogR2VuaWUgcHJvZHVjZWQgYSBmb2xsb3ctdXAgc3VnZ2VzdGVkLXF1ZXN0aW9ucyBsaXN0XG4gKiAoYGF0dGFjaG1lbnRzW2ldLnN1Z2dlc3RlZF9xdWVzdGlvbnMucXVlc3Rpb25zW11gKS4gRmlyZXMgb25jZVxuICogd2hlbiB0aGUgbGlzdCBhcHBlYXJzLCBhbmQgYWdhaW4gaWYgR2VuaWUgcmV3cml0ZXMgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBTdWdnZXN0ZWRRdWVzdGlvbnNFdmVudFNjaGVtYSA9IEdlbmllQ2hhdExvY2F0aW9uU2NoZW1hLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInN1Z2dlc3RlZF9xdWVzdGlvbnNcIiksXG4gIHF1ZXN0aW9uczogei5hcnJheSh6LnN0cmluZygpKSxcbn0pO1xuLyoqIEZvbGxvdy11cCBxdWVzdGlvbiBsaXN0IGVtaXR0ZWQgd2hlbiBHZW5pZSBhZGRzIG9yIHJld3JpdGVzIHN1Z2dlc3Rpb25zLiAqL1xuZXhwb3J0IHR5cGUgU3VnZ2VzdGVkUXVlc3Rpb25zRXZlbnQgPSB6LmluZmVyPHR5cGVvZiBTdWdnZXN0ZWRRdWVzdGlvbnNFdmVudFNjaGVtYT47XG5cbi8qKlxuICogVGhlIGFjdGl2ZSB0dXJuIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0dXMuIEFsd2F5cyBmaXJlcyBvbmNlXG4gKiBwZXIgdHVybiAoaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRlcm1pbmFsIGBtZXNzYWdlYCBldmVudCkuXG4gKiBDYXJyaWVzIHRoZSBmaW5hbCBgR2VuaWVNZXNzYWdlYCBzbmFwc2hvdCBpbmxpbmUgc28gc3Vic2NyaWJlcnNcbiAqIGRvbid0IG5lZWQgdG8ga2VlcCB0aGVpciBvd24gY29weSBvZiB0aGUgbGFzdCBtZXNzYWdlLlxuICovXG5leHBvcnQgY29uc3QgUmVzdWx0RXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5vbWl0KHtcbiAgYXR0YWNobWVudF9pZDogdHJ1ZSxcbn0pLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInJlc3VsdFwiKSxcbiAgc3RhdHVzOiB6LmVudW0oVEVSTUlOQUxfU1RBVFVTRVMpLFxuICBtZXNzYWdlOiBHZW5pZU1lc3NhZ2VTY2hlbWEsXG59KTtcbi8qKiBGaW5hbCBldmVudCBmb3IgYSBHZW5pZSB0dXJuLCBjYXJyeWluZyBpdHMgdGVybWluYWwgc3RhdHVzIGFuZCBtZXNzYWdlIHNuYXBzaG90LiAqL1xuZXhwb3J0IHR5cGUgUmVzdWx0RXZlbnQgPSB6LmluZmVyPHR5cGVvZiBSZXN1bHRFdmVudFNjaGVtYT47XG5cbi8qKlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiB5aWVsZGVkIGJ5IGBnZW5pZUV2ZW50Q2hhdGAuIEVhY2ggdmFyaWFudFxuICogaXMgYSBzaW5nbGUgZmxhdCBvYmplY3Qgd2l0aCBgdHlwZWAgYXMgdGhlIGRpc2NyaW1pbmF0b3IgYW5kXG4gKiB0aGUgcGF5bG9hZCBmaWVsZHMgaG9pc3RlZCBkaXJlY3RseSB0byB0aGUgdG9wIGxldmVsIC0gbm9cbiAqIGBwYXlsb2FkYCB3cmFwcGVyLiBDb25zdW1lcnMgbmFycm93IG9uIGB0eXBlYCBhbmQgcmVhZCBmaWVsZHNcbiAqIGlubGluZTpcbiAqXG4gKiBAZXhhbXBsZVxuICogZm9yIGF3YWl0IChjb25zdCBldmVudCBvZiBnZW5pZUV2ZW50Q2hhdChzcGFjZUlkLCBcIlRvcCBzdG9yZXM/XCIpKSB7XG4gKiAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICogICAgIGNhc2UgXCJ0aGlua2luZ1wiOlxuICogICAgICAgY29uc29sZS5sb2coZXZlbnQudGhvdWdodF90eXBlLCBldmVudC50ZXh0KTtcbiAqICAgICAgIGJyZWFrO1xuICogICAgIGNhc2UgXCJyZXN1bHRcIjpcbiAqICAgICAgIGNvbnNvbGUubG9nKFwiZG9uZTpcIiwgZXZlbnQuc3RhdHVzKTtcbiAqICAgICAgIGJyZWFrO1xuICogICB9XG4gKiB9XG4gKlxuICogU3RyZWFtIG9yZGVyIHBlciB0dXJuOlxuICpcbiAqICAgMS4gYHF1ZXN0aW9uYCwgZW1pdHRlZCB3aXRoIHRoZSBmaXJzdCBgbWVzc2FnZWAgeWllbGQgKGRlZmVycmVkIHNvXG4gKiAgICAgIHRoZSBhc3NpZ25lZCBgbWVzc2FnZV9pZGAgaXMgYXZhaWxhYmxlKSwgY2FycnlpbmcgdGhlIHByb21wdFxuICogICAgICB0aGlzIHR1cm4gc2VudCB0byBHZW5pZS5cbiAqICAgMi4gYG1lc3NhZ2VgIGZvciBldmVyeSBwb2xsIHlpZWxkIChyYXcgYEdlbmllTWVzc2FnZWAgb25cbiAqICAgICAgYGV2ZW50Lm1lc3NhZ2VgKS5cbiAqICAgMy4gQW55IGRlcml2ZWQgZXZlbnRzIHRoZSBzbmFwc2hvdCBkaWZmIHByb2R1Y2VkIChgc3RhdHVzYCxcbiAqICAgICAgYGF0dGFjaG1lbnRgLCBgdGhpbmtpbmdgLCBgdGV4dGAsIGBxdWVyeWAsIGBzdGF0ZW1lbnRgLFxuICogICAgICBgcm93c2AsIGBzdWdnZXN0ZWRfcXVlc3Rpb25zYCkgaW4gdGhhdCBmaXhlZCBvcmRlci5cbiAqICAgNC4gT24gdGhlIHRlcm1pbmFsIHNuYXBzaG90LCBhIGZpbmFsIGByZXN1bHRgIGV2ZW50LlxuICpcbiAqIEVycm9ycyBwcm9wYWdhdGUgdmlhIHRoZSBnZW5lcmF0b3IgdGhyb3dpbmcgKGB0cnlgL2BjYXRjaGAgdGhlXG4gKiBgZm9yIGF3YWl0YCksIG5vdCB2aWEgYW4gYGVycm9yYCB2YXJpYW50IG9uIHRoaXMgdW5pb24uXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZUNoYXRFdmVudFNjaGVtYSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwidHlwZVwiLCBbXG4gIFF1ZXN0aW9uRXZlbnRTY2hlbWEsXG4gIE1lc3NhZ2VFdmVudFNjaGVtYSxcbiAgU3RhdHVzRXZlbnRTY2hlbWEsXG4gIEF0dGFjaG1lbnRFdmVudFNjaGVtYSxcbiAgVGhpbmtpbmdFdmVudFNjaGVtYSxcbiAgVGV4dEV2ZW50U2NoZW1hLFxuICBRdWVyeUV2ZW50U2NoZW1hLFxuICBTdGF0ZW1lbnRFdmVudFNjaGVtYSxcbiAgUm93c0V2ZW50U2NoZW1hLFxuICBTdWdnZXN0ZWRRdWVzdGlvbnNFdmVudFNjaGVtYSxcbiAgUmVzdWx0RXZlbnRTY2hlbWEsXG5dKTtcbi8qKiBPcmRlcmVkIGV2ZW50IHVuaW9uIHlpZWxkZWQgYnkgYGdlbmllRXZlbnRDaGF0YDsgZmFpbHVyZXMgYXJlIHRocm93biwgbm90IGVtaXR0ZWQuICovXG5leHBvcnQgdHlwZSBHZW5pZUNoYXRFdmVudCA9IHouaW5mZXI8dHlwZW9mIEdlbmllQ2hhdEV2ZW50U2NoZW1hPjtcblxuLyoqIERpc2NyaW1pbmF0b3IgdHlwZSBmb3Ige0BsaW5rIEdlbmllQ2hhdEV2ZW50fS4gKi9cbmV4cG9ydCB0eXBlIEdlbmllQ2hhdEV2ZW50VHlwZSA9IEdlbmllQ2hhdEV2ZW50W1widHlwZVwiXTtcblxuLyoqXG4gKiBGaWVsZCBzZXQgZm9yIGEgZ2l2ZW4ge0BsaW5rIEdlbmllQ2hhdEV2ZW50VHlwZX0gLSB0aGUgdmFyaWFudFxuICogd2l0aCB0aGUgYHR5cGVgIGRpc2NyaW1pbmF0b3Igc3RyaXBwZWQuIFVzZWQgYnkgZGV0ZWN0b3JzIGluXG4gKiBgZXZlbnQudHNgIHNvIGVhY2ggZGV0ZWN0b3IgcmV0dXJucyBqdXN0IHRoZSBwYXlsb2FkIGZpZWxkcyBhbmRcbiAqIHRoZSBvcmNoZXN0cmF0b3Igc3RhbXBzIGB0eXBlYCBhdCB5aWVsZCB0aW1lLlxuICovXG5leHBvcnQgdHlwZSBHZW5pZUNoYXRFdmVudEZpZWxkczxUIGV4dGVuZHMgR2VuaWVDaGF0RXZlbnRUeXBlPiA9IE9taXQ8XG4gIEV4dHJhY3Q8R2VuaWVDaGF0RXZlbnQsIHsgdHlwZTogVCB9PixcbiAgXCJ0eXBlXCJcbj47XG4iXX0=
504
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuaWUtbW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuaWUtbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0NHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxLQUFLLFVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5QyxrRkFBa0Y7QUFDbEYsaUZBQWlGO0FBQ2pGLDZEQUE2RDtBQUM3RCxNQUFNLEVBQ0oscUJBQXFCLEVBQUUsd0JBQXdCLEVBQy9DLGtCQUFrQixFQUFFLHFCQUFxQixFQUN6QywwQkFBMEIsRUFBRSw2QkFBNkIsRUFDekQsZ0JBQWdCLEVBQUUsbUJBQW1CLEdBQ3RDLEdBQUcsVUFBVSxDQUFDO0FBVWYsd0ZBQXdGO0FBQ3hGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQztBQUVsRSx5RUFBeUU7QUFFekU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUM7S0FDcEMsTUFBTSxFQUFFO0tBQ1IsUUFBUSxDQUFDLGtEQUFrRCxDQUFDLENBQUM7QUFJaEU7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN6QyxZQUFZLEVBQUUsc0JBQXNCLENBQUMsUUFBUSxDQUFDLDhDQUE4QyxDQUFDO0lBQzdGLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLDBDQUEwQyxDQUFDO0NBQ3pFLENBQUMsQ0FBQztBQUlILDZFQUE2RTtBQUU3RTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sQ0FBQyxNQUFN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Ozs7Ozs7O0dBaUNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRTtJQUMvRCxtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLGlCQUFpQjtJQUNqQixxQkFBcUI7SUFDckIsbUJBQW1CO0lBQ25CLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsb0JBQW9CO0lBQ3BCLGVBQWU7SUFDZiw2QkFBNkI7SUFDN0IsaUJBQWlCO0NBQ2xCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2lyZS1mb3JtYXQgem9kIHNjaGVtYXMgKyB0eXBlcyBhbmQgaGlnaC1sZXZlbCBldmVudCB2b2NhYnVsYXJ5XG4gKiBmb3IgdGhlIEdlbmllIGNoYXQgZHJpdmVyLlxuICpcbiAqIFR3byByZWxhdGVkIGxheWVycyBsaXZlIGhlcmU6XG4gKlxuICogICAxLiBHZW5pZSB3aXJlIHNoYXBlcyBkZXJpdmVkIGZyb20gdGhpcyBwYWNrYWdlJ3Mgb3duIGdlbmVyYXRlZFxuICogICAgICBgZGFzaGJvYXJkc2Agc2NoZW1hcyAocmVnZW5lcmF0ZWQgZnJvbSB0aGUgdXBzdHJlYW1cbiAqICAgICAgYEBkYXRhYnJpY2tzL3Nkay1leHBlcmltZW50YWxgIGBhcGlzL2Rhc2hib2FyZHMvbW9kZWwuZC50c2BcbiAqICAgICAgYnkgdGhlIGVuZ2luZSdzIGNvZGVnZW4gb24gc3ludGgpLiBXZSBleHRlbmQgdGhlIFNESyBzY2hlbWFzIHdoZXJlIEdlbmllXG4gKiAgICAgIHNoaXBzIGZpZWxkcyBvbiB0aGUgd2lyZSB0aGF0IHRoZSBTREsgZG9lc24ndCBjdXJyZW50bHkgdHlwZTpcbiAqXG4gKiAgICAgICAgLSBgR2VuaWVNZXNzYWdlLmF1dG9fcmVnZW5lcmF0ZV9jb3VudDogbnVtYmVyYCAoc3RhbXBlZFxuICogICAgICAgICAgb24gZXZlcnkgd2lyZSBtZXNzYWdlLCBvbWl0dGVkIGZyb20gdGhlIFNESyBzaGFwZSkuXG4gKiAgICAgICAgLSBgR2VuaWVRdWVyeUF0dGFjaG1lbnQudGhvdWdodHM6IEdlbmllVGhvdWdodFtdYCAodGhlXG4gKiAgICAgICAgICBzdHJlYW1lZCByZWFzb25pbmcgcGF5bG9hZCB3aXRoIGBERVNDUklQVElPTmAsXG4gKiAgICAgICAgICBgREFUQV9TT1VSQ0lOR2AsIGBTVEVQU2AsIGFuZCBgVU5ERVJTVEFORElOR2AgdGhvdWdodFxuICogICAgICAgICAga2luZHMpLlxuICogICAgICAgIC0gYEdlbmllQXR0YWNobWVudC5hdHRhY2htZW50X3R5cGU6IEF0dGFjaG1lbnRUeXBlYFxuICogICAgICAgICAgKGFuIG9wdGlvbmFsIGRpc2NyaW1pbmF0b3IgbGl0ZXJhbCBzbyBjYWxsZXJzIGNhblxuICogICAgICAgICAgYHN3aXRjaCAoYXR0LmF0dGFjaG1lbnRfdHlwZSlgIGluc3RlYWQgb2YgcHJvYmluZ1xuICogICAgICAgICAgd2hpY2ggc3ViLWtleSBpcyBwb3B1bGF0ZWQ7IGNvbXB1dGUgaXQgd2l0aFxuICogICAgICAgICAge0BsaW5rIGRldGVjdEF0dGFjaG1lbnRUeXBlfSkuXG4gKlxuICogICAyLiBFdmVudCB2b2NhYnVsYXJ5IGZvciB0aGUgaGlnaC1sZXZlbCBgZ2VuaWVFdmVudENoYXRgXG4gKiAgICAgIGRyaXZlci4gRWFjaCBldmVudCBpcyBhIGZsYXQgYHoub2JqZWN0YCB3aXRoIGEgYHR5cGVgXG4gKiAgICAgIGxpdGVyYWwgZGlzY3JpbWluYXRvciBhbmQgc25ha2VfY2FzZSBwYXlsb2FkIGZpZWxkcyBob2lzdGVkXG4gKiAgICAgIHRvIHRoZSB0b3AgbGV2ZWwgKG5vIGBwYXlsb2FkYCB3cmFwcGVyKS4gRXZlbnRzIHRoYXQgc2hhcmVcbiAqICAgICAgdGhlIGF0dGFjaG1lbnQtc2NvcGVkIGxvY2F0aW9uIHVzZVxuICogICAgICB7QGxpbmsgR2VuaWVDaGF0TG9jYXRpb25TY2hlbWF9IGFzIGEgYmFzZTsgZXZlbnRzIHRoYXRcbiAqICAgICAgZG9uJ3QgY2FycnkgYW4gYGF0dGFjaG1lbnRfaWRgIChzdGF0dXMsIHJlc3VsdCkgb21pdCBpdC5cbiAqICAgICAge0BsaW5rIEdlbmllQ2hhdEV2ZW50U2NoZW1hfSBidW5kbGVzIHRoZSB2YXJpYW50cyBpbnRvIG9uZVxuICogICAgICBkaXNjcmltaW5hdGVkIHVuaW9uLlxuICpcbiAqIFB1cmUgdHlwZXM6IG5vIHJ1bnRpbWUgaW1wb3J0cyBiZXlvbmQgem9kICsgdGhlIGdlbmVyYXRlZFxuICogYGRhc2hib2FyZHNgIHNjaGVtYXMsIG5vIE5vZGUtb25seSBjb2RlLCBzYWZlIGZvciBicm93c2VyIGJ1bmRsZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgKiBhcyBkYXNoYm9hcmRzIGZyb20gXCIuL2Rhc2hib2FyZHMudHNcIjtcblxuLy8gVGhlIGdlbmVyYXRlZCBTREsgc2NoZW1hcyBsaXZlIGluIHRoZSBzaWJsaW5nIGAuL2Rhc2hib2FyZHMudHNgLCB3cml0dGVuIGJ5IHRoZVxuLy8gZW5naW5lJ3MgY29kZWdlbiBmcm9tIHRoZSB1cHN0cmVhbSBgLmQudHNgLiBBbGlhcyB0aGUgaGFuZGZ1bCBHZW5pZSBleHRlbmRzIHNvXG4vLyB0aGUgd2lkZW5lZCBzY2hlbWFzIGJlbG93IHJlYWQgYWdhaW5zdCBzaG9ydCwgbG9jYWwgbmFtZXMuXG5jb25zdCB7XG4gIGdlbmllQXR0YWNobWVudFNjaGVtYTogU0RLR2VuaWVBdHRhY2htZW50U2NoZW1hLFxuICBnZW5pZU1lc3NhZ2VTY2hlbWE6IFNES0dlbmllTWVzc2FnZVNjaGVtYSxcbiAgZ2VuaWVRdWVyeUF0dGFjaG1lbnRTY2hlbWE6IFNES0dlbmllUXVlcnlBdHRhY2htZW50U2NoZW1hLFxuICBnZW5pZVNwYWNlU2NoZW1hOiBTREtHZW5pZVNwYWNlU2NoZW1hLFxufSA9IGRhc2hib2FyZHM7XG5cbi8qKlxuICogVGhlIFNESydzIGBNZXNzYWdlU3RhdHVzYCB0eXBlLCByZS1leHBvcnRlZCBzbyBjb25zdW1lcnMgb2YgdGhlXG4gKiBHZW5pZSBjb250cmFjdCBnZXQgdGhlIGZ1bGwgd2lyZSB2b2NhYnVsYXJ5IGZyb20gYSBzaW5nbGUgaW1wb3J0XG4gKiBwYXRoIC0gbWlycm9ycyB0aGUgcmUtZXhwb3J0cyBvZiB0aGUgb3RoZXIgU0RLLWRlcml2ZWQgc2NoZW1hc1xuICogYmVsb3cuXG4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VTdGF0dXMgPSBkYXNoYm9hcmRzLk1lc3NhZ2VTdGF0dXM7XG5cbi8qKiBSdW50aW1lIHZhbGlkYXRvciBmb3IgYSByYXcgR2VuaWUgbWVzc2FnZSBzdGF0dXMgZnJvbSB0aGUgZ2VuZXJhdGVkIFNESyBjb250cmFjdC4gKi9cbmV4cG9ydCBjb25zdCBNZXNzYWdlU3RhdHVzU2NoZW1hID0gZGFzaGJvYXJkcy5tZXNzYWdlU3RhdHVzU2NoZW1hO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0aG91Z2h0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogR2VuaWUncyBwZXItcXVlcnkgXCJ0aG91Z2h0c1wiIHN1cmZhY2UuIFRoZXNlIGFwcGVhciBvbiB0aGVcbiAqIGAvbWVzc2FnZXMve2lkfWAgd2lyZSB1bmRlciBgYXR0YWNobWVudHNbaV0ucXVlcnkudGhvdWdodHNbXWAgYnV0XG4gKiBhcmUgbm90IHR5cGVkIG9uIHRoZSBTREsncyBgR2VuaWVRdWVyeUF0dGFjaG1lbnRgIGF0IHYwLjE3LlxuICpcbiAqIEtub3duIHRob3VnaHQgdHlwZXMgb2JzZXJ2ZWQgaW4gcHJvZHVjdGlvbiBwb2xsczpcbiAqXG4gKiAgIC0gYFRIT1VHSFRfVFlQRV9ERVNDUklQVElPTmA6IGEgb25lLXBhcmFncmFwaCByZXN0YXRlbWVudCBvZlxuICogICAgIHdoYXQgdGhlIHVzZXIgYXNrZWQuIFRoZSBmaW5hbCBgcXVlcnkuZGVzY3JpcHRpb25gIGZpZWxkIG9uXG4gKiAgICAgdGhlIGF0dGFjaG1lbnQgY2FycmllcyB0aGUgc2FtZSB0ZXh0LlxuICogICAtIGBUSE9VR0hUX1RZUEVfREFUQV9TT1VSQ0lOR2A6IG1hcmtkb3duIGJ1bGxldHMgb2YgdGhlXG4gKiAgICAgZnVsbHktcXVhbGlmaWVkIGBjYXRhbG9nLnNjaGVtYS50YWJsZWAgc291cmNlcyBHZW5pZSBjaG9zZS5cbiAqICAgLSBgVEhPVUdIVF9UWVBFX1NURVBTYDogdGhlIGhpZ2gtbGV2ZWwgcGxhbiBHZW5pZSB3cm90ZSBiZWZvcmVcbiAqICAgICBydW5uaW5nIFNRTCAob25lIGJ1bGxldCBwZXIgc3RlcCkuXG4gKiAgIC0gYFRIT1VHSFRfVFlQRV9VTkRFUlNUQU5ESU5HYDogYW1iaWd1aXR5IC8gaW50ZXJwcmV0YXRpb25cbiAqICAgICBub3RlcyAoZS5nLiBcIidyZXZlbnVlJyBjb3VsZCBiZSBpbnRlcnByZXRlZCBhcyBncm9zcyxcbiAqICAgICBuZXQsIG9yIHJlY29nbml6ZWQgcmV2ZW51ZS4uLlwiKS5cbiAqXG4gKiBPcGVuIGF0IHRoZSB0eXBlIGxldmVsIChgfCAoc3RyaW5nICYge30pYCkgc28gYSBuZXcgc2VydmVyLXNpZGVcbiAqIHRob3VnaHQgdHlwZSBkb2Vzbid0IGJyZWFrIGNvbXBpbGF0aW9uOyB0aGUgZm91ciBrbm93biB0eXBlc1xuICogc3RpbGwgbmFycm93IGNvcnJlY3RseSB1bmRlciBgc3dpdGNoYC5cbiAqL1xuZXhwb3J0IGNvbnN0IEdlbmllVGhvdWdodFR5cGVTY2hlbWEgPSB6XG4gIC5zdHJpbmcoKVxuICAuZGVzY3JpYmUoXCJGb3J3YXJkLWNvbXBhdGlibGUgR2VuaWUgcmVhc29uaW5nIHRob3VnaHQgdHlwZS5cIik7XG5cbmV4cG9ydCB0eXBlIEdlbmllVGhvdWdodFR5cGUgPSB6LmluZmVyPHR5cGVvZiBHZW5pZVRob3VnaHRUeXBlU2NoZW1hPjtcblxuLyoqXG4gKiBPbmUgcmVhc29uaW5nIHN0ZXAgb24gYSBxdWVyeSBhdHRhY2htZW50LiBTZWVcbiAqIHtAbGluayBHZW5pZVRob3VnaHRUeXBlfSBmb3IgdGhlIGtub3duIGB0aG91Z2h0X3R5cGVgIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEdlbmllVGhvdWdodFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgdGhvdWdodF90eXBlOiBHZW5pZVRob3VnaHRUeXBlU2NoZW1hLmRlc2NyaWJlKFwiS2luZCBvZiByZWFzb25pbmcgcmVwcmVzZW50ZWQgYnkgdGhpcyBlbnRyeS5cIiksXG4gIGNvbnRlbnQ6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJSZWFzb25pbmcgdGV4dCBlbWl0dGVkIGZvciB0aGlzIHRob3VnaHQuXCIpLFxufSk7XG4vKiogT25lIHR5cGVkIHJlYXNvbmluZyBlbnRyeSBhdHRhY2hlZCB0byBhIEdlbmllIHF1ZXJ5LiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVUaG91Z2h0ID0gei5pbmZlcjx0eXBlb2YgR2VuaWVUaG91Z2h0U2NoZW1hPjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYXR0YWNobWVudCBkaXNjcmltaW5hdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBEaXNjcmltaW5hdG9yIGZvciB3aGF0J3MgaW5zaWRlIGEgYEdlbmllQXR0YWNobWVudGAuIEdlbmllIG9ubHlcbiAqIGV2ZXIgcG9wdWxhdGVzIG9uZSBvZiBgcXVlcnlgIC8gYHRleHRgIC8gYHN1Z2dlc3RlZF9xdWVzdGlvbnNgXG4gKiBwZXIgYXR0YWNobWVudC4gT3BlbiB2aWEgYChzdHJpbmcgJiB7fSlgIHNvIGEgbmV3IHNlcnZlci1zaWRlXG4gKiB0eXBlIGRvZXNuJ3QgYnJlYWsgY29tcGlsYXRpb247IHRoZSB0aHJlZSBrbm93biB0eXBlcyBzdGlsbFxuICogbmFycm93IGNvcnJlY3RseSB1bmRlciBgc3dpdGNoYC5cbiAqXG4gKiBMaWZ0ZWQgaW50byB0aGUgc2NoZW1hIGFzIHRoZSBvcHRpb25hbFxuICoge0BsaW5rIEdlbmllQXR0YWNobWVudFNjaGVtYX0uYGF0dGFjaG1lbnRfdHlwZWAgZmllbGQgKGNvbXB1dGVcbiAqIGl0IHdpdGgge0BsaW5rIGRldGVjdEF0dGFjaG1lbnRUeXBlfSkgc28gY29uc3VtZXJzIGNhbiBicmFuY2hcbiAqIG9uIGEgbGl0ZXJhbCBpbnN0ZWFkIG9mIHByb2Jpbmcgd2hpY2ggc3ViLW9iamVjdCBrZXkgaXNcbiAqIHByZXNlbnQuIEFsc28gc3VyZmFjZWQgb24ge0BsaW5rIEF0dGFjaG1lbnRFdmVudH0ncyBwYXlsb2FkIGFzXG4gKiBgYXR0YWNobWVudF90eXBlYCAodnMgYSBiYXJlIGB0eXBlYCkgdG8ga2VlcCB0aGUgZmllbGQgY2xlYXIgb2ZcbiAqIHRoZSBldmVudC11bmlvbiBkaXNjcmltaW5hdG9yIGtleS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFUVEFDSE1FTlRfVFlQRVMgPSBbXG4gIFwicXVlcnlcIixcbiAgXCJ0ZXh0XCIsXG4gIFwic3VnZ2VzdGVkX3F1ZXN0aW9uc1wiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgc3RyaW5nW107XG5cbmV4cG9ydCBjb25zdCBLbm93bkF0dGFjaG1lbnRUeXBlU2NoZW1hID0gelxuICAuZW51bShBVFRBQ0hNRU5UX1RZUEVTKVxuICAuZGVzY3JpYmUoXCJBdHRhY2htZW50IGRpc2NyaW1pbmF0b3IgdmFsdWVzIHVuZGVyc3Rvb2QgYnkgdGhpcyBwYWNrYWdlIHZlcnNpb24uXCIpO1xuXG5leHBvcnQgdHlwZSBLbm93bkF0dGFjaG1lbnRUeXBlID0gei5pbmZlcjx0eXBlb2YgS25vd25BdHRhY2htZW50VHlwZVNjaGVtYT47XG5cbmV4cG9ydCBjb25zdCBBdHRhY2htZW50VHlwZVNjaGVtYSA9IHpcbiAgLnN0cmluZygpXG4gIC5kZXNjcmliZShcIkZvcndhcmQtY29tcGF0aWJsZSBHZW5pZSBhdHRhY2htZW50IGRpc2NyaW1pbmF0b3IuXCIpO1xuXG5leHBvcnQgdHlwZSBBdHRhY2htZW50VHlwZSA9IHouaW5mZXI8dHlwZW9mIEF0dGFjaG1lbnRUeXBlU2NoZW1hPjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLSB3aWRlbmVkIHdpcmUgc2NoZW1hcyArIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIGBHZW5pZVF1ZXJ5QXR0YWNobWVudGAgd2lkZW5lZCB3aXRoIHRoZSBgdGhvdWdodHNbXWAgZmllbGQgdGhlXG4gKiBHZW5pZSB3aXJlIGV4cG9zZXMgYnV0IHRoZSBTREsgZG9lc24ndCBjdXJyZW50bHkgdHlwZS4gRXZlcnlcbiAqIG90aGVyIGZpZWxkIChgZGVzY3JpcHRpb25gLCBgcXVlcnlgLCBgc3RhdGVtZW50X2lkYCxcbiAqIGBxdWVyeV9yZXN1bHRfbWV0YWRhdGFgLCBgdGl0bGVgLCBgcGFyYW1ldGVyc2AsXG4gKiBgbGFzdF91cGRhdGVkX3RpbWVzdGFtcGAsIGBpZGApIGZsb3dzIHRocm91Z2ggdmVyYmF0aW0gZnJvbVxuICogdGhlIFNESyBzY2hlbWEuXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZVF1ZXJ5QXR0YWNobWVudFNjaGVtYSA9IFNES0dlbmllUXVlcnlBdHRhY2htZW50U2NoZW1hLmV4dGVuZCh7XG4gIHRob3VnaHRzOiB6LmFycmF5KEdlbmllVGhvdWdodFNjaGVtYSkub3B0aW9uYWwoKSxcbn0pO1xuLyoqIFF1ZXJ5IGF0dGFjaG1lbnQgd2lkZW5lZCB3aXRoIEdlbmllJ3Mgc3RyZWFtZWQgcmVhc29uaW5nIHRob3VnaHRzLiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVRdWVyeUF0dGFjaG1lbnQgPSB6LmluZmVyPHR5cGVvZiBHZW5pZVF1ZXJ5QXR0YWNobWVudFNjaGVtYT47XG5cbi8qKlxuICogUHVycG9zZSBhdHRhY2hlZCB0byBhIEdlbmllIHRleHQgcmVzcG9uc2UuXG4gKlxuICogVGhlIGdlbmVyYXRlZCBEYXRhYnJpY2tzIFNESyBzY2hlbWEgY3VycmVudGx5IGtub3dzIG9ubHlcbiAqIGBGT0xMT1dfVVBfUVVFU1RJT05gLCB3aGlsZSB0aGUgbGl2ZSBHZW5pZSBBUEkgYWxzbyBlbWl0c1xuICogYFRFWFRfQVRUQUNITUVOVF9QVVJQT1NFX0FOU1dFUmAgZm9yIHRoZSBwcmltYXJ5IGFuc3dlciB0ZXh0LiBLZWVwIHRoZVxuICoga25vd24gdmFsdWVzIGRpc2NvdmVyYWJsZSBhbmQgYWNjZXB0IGZ1dHVyZSBzdHJpbmcgdmFsdWVzIHNvIGFuIGFkZGl0aXZlXG4gKiBzZXJ2ZXItc2lkZSBlbnVtIGNoYW5nZSBjYW5ub3QgaW52YWxpZGF0ZSBhbiBvdGhlcndpc2UgY29tcGxldGUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEdlbmllVGV4dEF0dGFjaG1lbnRQdXJwb3NlU2NoZW1hID0gelxuICAuc3RyaW5nKClcbiAgLmRlc2NyaWJlKFwiRm9yd2FyZC1jb21wYXRpYmxlIHNlbWFudGljIHB1cnBvc2UgZm9yIGEgR2VuaWUgdGV4dCBhdHRhY2htZW50LlwiKTtcblxuZXhwb3J0IHR5cGUgR2VuaWVUZXh0QXR0YWNobWVudFB1cnBvc2UgPSB6LmluZmVyPHR5cGVvZiBHZW5pZVRleHRBdHRhY2htZW50UHVycG9zZVNjaGVtYT47XG5cbi8qKlxuICogVGV4dCBhdHRhY2htZW50IHdpZGVuZWQgZm9yIGZvcndhcmQtY29tcGF0aWJsZSBwdXJwb3NlIHZhbHVlcyBhbmQgb3B0aW9uYWxcbiAqIEFnZW50IE1vZGUgdGFibGUgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZVRleHRBdHRhY2htZW50U2NoZW1hID0gZGFzaGJvYXJkcy50ZXh0QXR0YWNobWVudFNjaGVtYS5leHRlbmQoe1xuICBwdXJwb3NlOiBHZW5pZVRleHRBdHRhY2htZW50UHVycG9zZVNjaGVtYS5vcHRpb25hbCgpLFxuICBtZXRhZGF0YTogei51bmtub3duKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkFnZW50IE1vZGUgbWV0YWRhdGEgYXR0YWNoZWQgdG8gdGhpcyB0ZXh0IHJlc3BvbnNlLlwiKSxcbn0pO1xuLyoqIE5hcnJhdGl2ZSB0ZXh0IGF0dGFjaG1lbnQsIGluY2x1ZGluZyBpdHMgb3B0aW9uYWwgc2VtYW50aWMgcHVycG9zZS4gKi9cbmV4cG9ydCB0eXBlIEdlbmllVGV4dEF0dGFjaG1lbnQgPSB6LmluZmVyPHR5cGVvZiBHZW5pZVRleHRBdHRhY2htZW50U2NoZW1hPjtcblxuLyoqXG4gKiBgR2VuaWVBdHRhY2htZW50YCB3aXRoOlxuICpcbiAqICAgLSBgcXVlcnlgIHJlLXR5cGVkIHRvIHRoZSB0aG91Z2h0cy1hd2FyZVxuICogICAgIHtAbGluayBHZW5pZVF1ZXJ5QXR0YWNobWVudFNjaGVtYX0uXG4gKiAgIC0gYGF0dGFjaG1lbnRfdHlwZWAgZGlzY3JpbWluYXRvciBsaXRlcmFsXG4gKiAgICAgKHtAbGluayBBdHRhY2htZW50VHlwZX0pIHNvIGNvbnN1bWVycyBjYW4gYHN3aXRjaFxuICogICAgIChhdHQuYXR0YWNobWVudF90eXBlKWAgdG8gbmFycm93IHdoaWNoIHN1Yi1vYmplY3QgaXNcbiAqICAgICBwb3B1bGF0ZWQuIE9wdGlvbmFsIG9uIHRoZSB3aXJlIChHZW5pZSBkb2Vzbid0IHNlbmQgaXQpO1xuICogICAgIGNhbGxlcnMgY29tcHV0ZSBpdCB3aXRoIHtAbGluayBkZXRlY3RBdHRhY2htZW50VHlwZX0gd2hlblxuICogICAgIHRoZXkgd2FudCB0aGUgbGl0ZXJhbCB1cC1mcm9udC5cbiAqXG4gKiBgdGV4dGAgaXMgcmUtdHlwZWQgdG8gdGhlIGZvcndhcmQtY29tcGF0aWJsZVxuICoge0BsaW5rIEdlbmllVGV4dEF0dGFjaG1lbnRTY2hlbWF9LiBgYXR0YWNobWVudF9pZGAgYW5kXG4gKiBgc3VnZ2VzdGVkX3F1ZXN0aW9uc2AgcGFzcyB0aHJvdWdoIHVuY2hhbmdlZC4gYGF0dGFjaG1lbnRfaWRgIGlzIGdlbnVpbmVseVxuICogb3B0aW9uYWwgb24gdGhlIHdpcmU6XG4gKiB0aGUgZmlyc3QgdGV4dCBhdHRhY2htZW50IEdlbmllIGVtaXRzIHBlciB0dXJuICh0aGUgXCJtYWluXG4gKiBhbnN3ZXIgdGV4dFwiKSBhcnJpdmVzIHdpdGggbm8gaWQsIG9ubHkgdGhlIGZvbGxvdy11cCB0ZXh0XG4gKiBhdHRhY2htZW50IGdldHMgb25lLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVBdHRhY2htZW50U2NoZW1hID0gU0RLR2VuaWVBdHRhY2htZW50U2NoZW1hLmV4dGVuZCh7XG4gIHF1ZXJ5OiBHZW5pZVF1ZXJ5QXR0YWNobWVudFNjaGVtYS5vcHRpb25hbCgpLFxuICB0ZXh0OiBHZW5pZVRleHRBdHRhY2htZW50U2NoZW1hLm9wdGlvbmFsKCksXG4gIGF0dGFjaG1lbnRfdHlwZTogQXR0YWNobWVudFR5cGVTY2hlbWEub3B0aW9uYWwoKSxcbn0pO1xuLyoqIEdlbmllIG1lc3NhZ2UgYXR0YWNobWVudCB3aXRoIGFuIG9wdGlvbmFsIGNvbXB1dGVkIGRpc2NyaW1pbmF0b3IuICovXG5leHBvcnQgdHlwZSBHZW5pZUF0dGFjaG1lbnQgPSB6LmluZmVyPHR5cGVvZiBHZW5pZUF0dGFjaG1lbnRTY2hlbWE+O1xuXG4vKipcbiAqIGBHZW5pZU1lc3NhZ2VgIHdpZGVuZWQgd2l0aDpcbiAqXG4gKiAgIC0gYGF1dG9fcmVnZW5lcmF0ZV9jb3VudGA6IG51bWJlciBzdGFtcGVkIG9uIGV2ZXJ5IHdpcmVcbiAqICAgICBtZXNzYWdlIHRoYXQgdGhlIFNESyB0eXBlIG9taXRzIGF0IHYwLjE3LlxuICogICAtIGBhdHRhY2htZW50c2A6IHJlLXR5cGVkIHRvIHRoZSBsb2NhbFxuICogICAgIHtAbGluayBHZW5pZUF0dGFjaG1lbnRTY2hlbWF9IHNvXG4gKiAgICAgYGF0dGFjaG1lbnQucXVlcnk/LnRob3VnaHRzYCAoYW5kIHRoZVxuICogICAgIGBhdHRhY2htZW50X3R5cGVgIGRpc2NyaW1pbmF0b3IpIGlzIHJlYWNoYWJsZSB3aXRob3V0IGFcbiAqICAgICBjYXN0LlxuICpcbiAqIEV2ZXJ5IG90aGVyIGZpZWxkIChgaWRgLCBgc3BhY2VfaWRgLCBgY29udmVyc2F0aW9uX2lkYCxcbiAqIGB1c2VyX2lkYCwgYGNyZWF0ZWRfdGltZXN0YW1wYCwgYGxhc3RfdXBkYXRlZF90aW1lc3RhbXBgLFxuICogYHN0YXR1c2AsIGBjb250ZW50YCwgYG1lc3NhZ2VfaWRgLCBgcXVlcnlfcmVzdWx0YCwgYGVycm9yYCxcbiAqIGBmZWVkYmFja2ApIHBhc3NlcyB0aHJvdWdoIGZyb20gdGhlIFNESyBzY2hlbWEuXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZU1lc3NhZ2VTY2hlbWEgPSBTREtHZW5pZU1lc3NhZ2VTY2hlbWEuZXh0ZW5kKHtcbiAgYXR0YWNobWVudHM6IHouYXJyYXkoR2VuaWVBdHRhY2htZW50U2NoZW1hKS5vcHRpb25hbCgpLFxuICBhdXRvX3JlZ2VuZXJhdGVfY291bnQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbn0pO1xuLyoqIEdlbmllIG1lc3NhZ2Ugc25hcHNob3Qgd2lkZW5lZCB3aXRoIHR5cGVkIGF0dGFjaG1lbnRzIGFuZCByZWdlbmVyYXRpb24gY291bnQuICovXG5leHBvcnQgdHlwZSBHZW5pZU1lc3NhZ2UgPSB6LmluZmVyPHR5cGVvZiBHZW5pZU1lc3NhZ2VTY2hlbWE+O1xuXG4vKipcbiAqIERvbWFpbiBwcm9qZWN0aW9uIG9mIHtAbGluayBHZW5pZU1lc3NhZ2VTY2hlbWF9IHRoYXQgZHJvcHMgZXZlcnlcbiAqIHR1cm4tbGV2ZWwgZmllbGQgKGBpZGAsIGBzdGF0dXNgLCBgY3JlYXRlZF90aW1lc3RhbXBgLFxuICogYHF1ZXJ5X3Jlc3VsdGAsIC4uLikgYW5kIHlpZWxkcyBqdXN0IHRoZSByZXNwb25zZSBwYXlsb2FkIGFzIGFcbiAqIGZsYXQgYEdlbmllQXR0YWNobWVudFtdYC4gUGFyc2VzIHRoZSBzYW1lIHdpcmUgc2hhcGUgYXNcbiAqIHtAbGluayBHZW5pZU1lc3NhZ2VTY2hlbWF9OyBtaXNzaW5nIGBhdHRhY2htZW50c2AgZGVmYXVsdHMgdG9cbiAqIGBbXWAgc28gdGhlIG91dHB1dCBpcyBhbHdheXMgYW4gYXJyYXkuXG4gKlxuICogVXNlIHdoZW4gY29uc3VtZXJzIG9ubHkgY2FyZSBhYm91dCB0aGUgbW9kZWwncyByZXNwb25zZVxuICogYXR0YWNobWVudHMgYW5kIG5vdCB0aGUgc3Vycm91bmRpbmcgbWVzc2FnZSBlbnZlbG9wZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEdlbmllUmVzcG9uc2VTY2hlbWEgPSBHZW5pZU1lc3NhZ2VTY2hlbWEudHJhbnNmb3JtKChtKSA9PiBtLmF0dGFjaG1lbnRzID8/IFtdKTtcbi8qKiBOb3JtYWxpemVkIGF0dGFjaG1lbnQgYXJyYXkgZXh0cmFjdGVkIGZyb20gYSBHZW5pZSBtZXNzYWdlIHJlc3BvbnNlLiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVSZXNwb25zZSA9IHouaW5mZXI8dHlwZW9mIEdlbmllUmVzcG9uc2VTY2hlbWE+O1xuXG4vKipcbiAqIGBHZW5pZVNwYWNlYCB3aWRlbmVkIHdpdGggYW4gb3B0aW9uYWwgYHNlcmlhbGl6ZWRfc3BhY2VgIGZpZWxkXG4gKiBjYXJyeWluZyBhIEpTT04tc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGFjZSdzIGZ1bGxcbiAqIGRlZmluaXRpb24gKGNhdGFsb2dzLCBzY2hlbWFzLCB0YWJsZXMsIHNhbXBsZSBxdWVzdGlvbnMsIHByb21wdHMsXG4gKiBldGMuKSBhcyBleHBvcnRlZCBieSB0aGUgd29ya3NwYWNlIGV4cG9ydCBlbmRwb2ludC5cbiAqXG4gKiBUaGUgYmFzZSBTREsgc2hhcGUgKGBkZXNjcmlwdGlvbmAsIGBzcGFjZV9pZGAsIGB0aXRsZWAsXG4gKiBgd2FyZWhvdXNlX2lkYCkgY292ZXJzIHRoZSBkaXJlY3RvcnktbGlzdGluZyBzdXJmYWNlIC0gZW5vdWdoIHRvXG4gKiByb3V0ZSBhIGNoYXQuIGBzZXJpYWxpemVkX3NwYWNlYCBpcyBvcHQtaW4gc28gY2FsbGVycyB0aGF0IG5lZWRcbiAqIHRoZSBmdWxsIHNwYWNlIHNjaGVtYSAoZS5nLiB0byBzZWVkIGEgc3lzdGVtIHByb21wdCBvciB0byBzaGlwXG4gKiB0aGUgZGVmaW5pdGlvbiB0byBhbiBhZ2VudCkgY2FuIGF0dGFjaCBpdCB3aXRob3V0IGEgc2Vjb25kIHR5cGUuXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZVNwYWNlU2NoZW1hID0gU0RLR2VuaWVTcGFjZVNjaGVtYS5leHRlbmQoe1xuICBzZXJpYWxpemVkX3NwYWNlOiB6XG4gICAgLnN0cmluZygpXG4gICAgLm9wdGlvbmFsKClcbiAgICAuZGVzY3JpYmUoXG4gICAgICBcIlRoZSBjb250ZW50cyBvZiB0aGUgR2VuaWUgU3BhY2UgaW4gc2VyaWFsaXplZCBzdHJpbmcgZm9ybS4gVGhpcyBmaWVsZCBpcyBleGNsdWRlZCBpbiBMaXN0IEdlbmllIHNwYWNlcyByZXNwb25zZXMuIFRoaXMgZmllbGQgcHJvdmlkZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgSlNPTiBzdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSBzcGFjZSdzIGxheW91dCBhbmQgY29tcG9uZW50cy5cIixcbiAgICApLFxufSk7XG4vKiogR2VuaWUgc3BhY2UgbWV0YWRhdGEgd2l0aCB0aGUgaWRlbnRpZmllcnMgcmVxdWlyZWQgYnkgY2hhdCBjb25zdW1lcnMuICovXG5leHBvcnQgdHlwZSBHZW5pZVNwYWNlID0gei5pbmZlcjx0eXBlb2YgR2VuaWVTcGFjZVNjaGVtYT47XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0ZXJtaW5hbCBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUZXJtaW5hbCBHZW5pZSBtZXNzYWdlIHN0YXR1c2VzLiBUaGUgcG9sbGluZyBsb29wIGluIHRoZSBjaGF0XG4gKiBkcml2ZXIgc3RvcHMgYXMgc29vbiBhcyB0aGUgbGF0ZXN0IG1lc3NhZ2UgaGFzIG9uZSBvZiB0aGVzZVxuICogc3RhdHVzZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBURVJNSU5BTF9TVEFUVVNFUyA9IFtcIkNPTVBMRVRFRFwiLCBcIkZBSUxFRFwiLCBcIkNBTkNFTExFRFwiXSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFRlcm1pbmFsU3RhdHVzU2NoZW1hID0gelxuICAuZW51bShURVJNSU5BTF9TVEFUVVNFUylcbiAgLmRlc2NyaWJlKFwiTWVzc2FnZSBzdGF0dXMgdGhhdCBlbmRzIGEgR2VuaWUgdHVybiBhbmQgcHJvZHVjZXMgYSBmaW5hbCByZXN1bHQgZXZlbnQuXCIpO1xuXG5leHBvcnQgdHlwZSBUZXJtaW5hbFN0YXR1cyA9IHouaW5mZXI8dHlwZW9mIFRlcm1pbmFsU3RhdHVzU2NoZW1hPjtcblxuLyoqIE5hcnJvdyBgTWVzc2FnZVN0YXR1cyB8IHVuZGVmaW5lZGAgdG8gYSB7QGxpbmsgVGVybWluYWxTdGF0dXN9LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGVybWluYWxTdGF0dXMoczogTWVzc2FnZVN0YXR1cyB8IHVuZGVmaW5lZCk6IHMgaXMgVGVybWluYWxTdGF0dXMge1xuICByZXR1cm4gcyAhPT0gdW5kZWZpbmVkICYmIChURVJNSU5BTF9TVEFUVVNFUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMocyk7XG59XG5cbi8qKlxuICogQ29udmVydCBhIHJhdyBHZW5pZSB3aXJlIHN0YXR1cyAoYEZFVENISU5HX01FVEFEQVRBYCxcbiAqIGBBU0tJTkdfQUlgLCBgRVhFQ1VUSU5HX1FVRVJZYCwgLi4uKSBpbnRvIGEgc2hvcnQsIHNlbnRlbmNlLWNhc2VkXG4gKiBsYWJlbCBzYWZlIHRvIGRyb3AgaW50byBhIFVJIHBpbGwuIEtub3duIHN0YXRlcyBnZXQgYSBjdXJhdGVkXG4gKiBsYWJlbDsgdW5rbm93biBzdGF0ZXMgZmFsbCBiYWNrIHRvIGBzdHJpbmdVdGlscy50b2tlbml6ZVdpdGhPcHRpb25zYFxuICogc28gbmV3IHN0YXRlcyBzdGlsbCByZW5kZXIgY2xlYW5seSB3aXRob3V0IGNvZGUgY2hhbmdlcy5cbiAqXG4gKiBQdXJlIChubyBOb2RlLW9ubHkgZGVwcyksIHNhZmUgZm9yIGJyb3dzZXIgYnVuZGxlcy4gQm90aCB0aGVcbiAqIEdlbmllIGFnZW50IChzZXJ2ZXIpIGFuZCBhbnkgVUkgdGhhdCBzdWJzY3JpYmVzIHRvIHN0YXR1cyBldmVudHNcbiAqIGNhbGwgdGhpcyBzbyBsYWJlbHMgc3RheSBpbiBsb2NrLXN0ZXAgYWNyb3NzIHRoZSB3aXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaHVtYW5pemVTdGF0dXMoc3RhdHVzOiBNZXNzYWdlU3RhdHVzKTogc3RyaW5nIHtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlIFwiRkVUQ0hJTkdfTUVUQURBVEFcIjpcbiAgICAgIHJldHVybiBcIkZldGNoaW5nIG1ldGFkYXRhXCI7XG4gICAgY2FzZSBcIkFTS0lOR19BSVwiOlxuICAgICAgcmV0dXJuIFwiQXNraW5nIEdlbmllXCI7XG4gICAgY2FzZSBcIkVYRUNVVElOR19RVUVSWVwiOlxuICAgICAgcmV0dXJuIFwiUnVubmluZyBTUUwgcXVlcnlcIjtcbiAgICBjYXNlIFwiRklMVEVSSU5HX0NPTlRFWFRcIjpcbiAgICAgIHJldHVybiBcIkZpbHRlcmluZyBjb250ZXh0XCI7XG4gICAgY2FzZSBcIlBFTkRJTkdfV0FSRUhPVVNFXCI6XG4gICAgICByZXR1cm4gXCJXYWl0aW5nIGZvciB3YXJlaG91c2VcIjtcbiAgICBjYXNlIFwiQ09NUExFVEVEXCI6XG4gICAgICByZXR1cm4gXCJDb21wbGV0ZWRcIjtcbiAgICBjYXNlIFwiRkFJTEVEXCI6XG4gICAgICByZXR1cm4gXCJGYWlsZWRcIjtcbiAgICBjYXNlIFwiQ0FOQ0VMTEVEXCI6XG4gICAgICByZXR1cm4gXCJDYW5jZWxsZWRcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgLi4uc3RyaW5nVXRpbHMudG9rZW5pemVXaXRoT3B0aW9ucyh7IGNhcGl0YWxpemU6IHRydWUsIGxvd2VyQ2FzZTogdHJ1ZSB9LCBzdGF0dXMpLFxuICAgICAgXS5qb2luKFwiIFwiKTtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhdHRhY2htZW50IHR5cGUgaGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBJbnNwZWN0IGEge0BsaW5rIEdlbmllQXR0YWNobWVudH0gYW5kIHJldHVybiB0aGVcbiAqIHtAbGluayBBdHRhY2htZW50VHlwZX0gb2YgcGF5bG9hZCBpdCBjYXJyaWVzLiBSZXR1cm5zIHRoZSBmaXJzdFxuICoga25vd24gc3ViLW9iamVjdCB0aGF0J3MgcHJlc2VudDsgaWYgbm9uZSBvZiB0aGUga25vd24gb25lcyBhcmVcbiAqIHBvcHVsYXRlZCwgZmFsbHMgYmFjayB0byB0aGUgZmlyc3Qgbm9uLWJvb2trZWVwaW5nIGtleVxuICogKGZvcndhcmQtY29tcGF0IGZvciB0eXBlcyB3ZSBkb24ndCBtb2RlbCB5ZXQpLCBlbHNlIGBcInVua25vd25cImAuXG4gKlxuICogSG9ub3JzIGEgcHJlLXNldCBgYXR0YWNobWVudF90eXBlYCBpZiBvbmUgaXMgYWxyZWFkeSBvbiB0aGVcbiAqIHZhbHVlLCBzbyB0aGlzIGlzIGlkZW1wb3RlbnQgYWNyb3NzIHJlLWRldGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RBdHRhY2htZW50VHlwZShhdHQ6IEdlbmllQXR0YWNobWVudCk6IEF0dGFjaG1lbnRUeXBlIHtcbiAgaWYgKGF0dC5hdHRhY2htZW50X3R5cGUpIHJldHVybiBhdHQuYXR0YWNobWVudF90eXBlO1xuICBpZiAoYXR0LnF1ZXJ5KSByZXR1cm4gXCJxdWVyeVwiO1xuICBpZiAoYXR0LnRleHQpIHJldHVybiBcInRleHRcIjtcbiAgaWYgKGF0dC5zdWdnZXN0ZWRfcXVlc3Rpb25zKSByZXR1cm4gXCJzdWdnZXN0ZWRfcXVlc3Rpb25zXCI7XG4gIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyhhdHQpKSB7XG4gICAgaWYgKGsgIT09IFwiYXR0YWNobWVudF9pZFwiICYmIGsgIT09IFwiYXR0YWNobWVudF90eXBlXCIpIHJldHVybiBrO1xuICB9XG4gIHJldHVybiBcInVua25vd25cIjtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHZW5pZUNoYXQgZXZlbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFdoZXJlIG9uIHRoZSB3aXJlIGFuIGV2ZW50IHdhcyBvYnNlcnZlZC4gU3ByZWFkIGludG8gZXZlcnlcbiAqIGF0dGFjaG1lbnQtc2NvcGVkIGV2ZW50IHBheWxvYWQgc28gc3Vic2NyaWJlcnMgY2FuIHJvdXRlLCBsb2csXG4gKiBvciBjb3JyZWxhdGUgd2l0aG91dCByZS13YWxraW5nIHRoZSBtZXNzYWdlLlxuICpcbiAqIEZpZWxkczpcbiAqICAgLSBgc3BhY2VfaWRgOiB0aGUgR2VuaWUgc3BhY2UgdGhlIGNvbnZlcnNhdGlvbiBsaXZlcyBpbi5cbiAqICAgLSBgY29udmVyc2F0aW9uX2lkYDogY29udmVyc2F0aW9uIGlkIG9uY2UgR2VuaWUgaGFzIGFzc2lnbmVkIG9uZS5cbiAqICAgLSBgbWVzc2FnZV9pZGA6IEdlbmllIG1lc3NhZ2UgaWQgZm9yIHRoZSBhY3RpdmUgdHVybi5cbiAqICAgLSBgYXR0YWNobWVudF9pZGA6IGF0dGFjaG1lbnQgdGhlIGV2ZW50IGNhbWUgZnJvbS4gT3B0aW9uYWxcbiAqICAgICBiZWNhdXNlIEdlbmllIHNvbWV0aW1lcyBlbWl0cyBhbiBhbm9ueW1vdXMgbWFpbi1hbnN3ZXJcbiAqICAgICBhdHRhY2htZW50IHdpdGhvdXQgYW4gaWQ7IHRob3NlIHN0aWxsIGdldCBldmVudHMsIGp1c3Qgd2l0aFxuICogICAgIGBhdHRhY2htZW50X2lkYCB1bmRlZmluZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgc3BhY2VfaWQ6IHouc3RyaW5nKCksXG4gIGNvbnZlcnNhdGlvbl9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBtZXNzYWdlX2lkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGF0dGFjaG1lbnRfaWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuLyoqIENvbnZlcnNhdGlvbiwgbWVzc2FnZSwgYW5kIGF0dGFjaG1lbnQgY29vcmRpbmF0ZXMgc2hhcmVkIGJ5IGF0dGFjaG1lbnQgZXZlbnRzLiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVDaGF0TG9jYXRpb24gPSB6LmluZmVyPHR5cGVvZiBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYT47XG5cbi8qKlxuICogTGlmZWN5Y2xlIGV2ZW50OiB0aGUgcXVlc3Rpb24gdGhpcyB0dXJuIGlzIGFza2luZyBHZW5pZS4gRmlyZXNcbiAqIG9uY2UgcGVyIGBnZW5pZUV2ZW50Q2hhdGAgY2FsbCwgdGhlIGZpcnN0IHRpbWUgdGhlIHVuZGVybHlpbmdcbiAqIGBnZW5pZUNoYXRgIGxvb3AgeWllbGRzIGEgYEdlbmllTWVzc2FnZWAuIENhcnJpZXMgdGhlIHByb21wdFxuICogdGV4dCBHZW5pZSBlY2hvZWQgYmFjayBvbiBgbWVzc2FnZS5jb250ZW50YCBhbmQgdGhlIGFzc2lnbmVkXG4gKiBgbWVzc2FnZV9pZGAgc28gc3Vic2NyaWJlcnMgY2FuIGdyb3VwIGV2ZXJ5IHN1YnNlcXVlbnQgZXZlbnRcbiAqIGZvciB0aGlzIHR1cm4gdW5kZXIgb25lIHN0YWJsZSBrZXkuIGBjb252ZXJzYXRpb25faWRgIGlzXG4gKiBwb3B1bGF0ZWQgZm9yIGJvdGggb3BlbmluZyBhbmQgZm9sbG93LXVwIHR1cm5zIChHZW5pZSBhc3NpZ25zXG4gKiBpdCBvbiBgc3RhcnRDb252ZXJzYXRpb25gKS5cbiAqXG4gKiBEZWZlcnJlZCAoaW5zdGVhZCBvZiBmaXJlZCBzeW5jaHJvbm91c2x5IG9uIGVudHJ5KSBzbyB0aGVcbiAqIGBtZXNzYWdlX2lkYCBpcyBhdmFpbGFibGUgd2hlbiB0aGUgZXZlbnQgbGFuZHMgLSB0aGF0IG9uZSByb3VuZFxuICogdHJpcCBjb3N0cyB+MjAwbXMgYnV0IGxldHMgVUlzIHJlbmRlciBxdWVzdGlvbiAvIHRoaW5raW5nIC9cbiAqIHF1ZXJ5IC8gdGV4dCBhcyBhIHNpbmdsZSBncm91cGVkIGJsb2NrIHBlciBHZW5pZSBjYWxsIGluc3RlYWRcbiAqIG9mIGEgZmxhdCBzdHJlYW0uXG4gKlxuICogYGF0dGFjaG1lbnRfaWRgIGlzIGludGVudGlvbmFsbHkgYWJzZW50IC0gcXVlc3Rpb25zIGFyZSB0dXJuXG4gKiBzY29wZWQsIG5vdCBhdHRhY2htZW50IHNjb3BlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFF1ZXN0aW9uRXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5vbWl0KHtcbiAgYXR0YWNobWVudF9pZDogdHJ1ZSxcbn0pLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInF1ZXN0aW9uXCIpLFxuICBjb250ZW50OiB6LnN0cmluZygpLFxufSk7XG4vKiogSW5pdGlhbCBldmVudCBjYXJyeWluZyB0aGUgdXNlcidzIHF1ZXN0aW9uIGFmdGVyIEdlbmllIGFzc2lnbnMgYSBtZXNzYWdlIGlkLiAqL1xuZXhwb3J0IHR5cGUgUXVlc3Rpb25FdmVudCA9IHouaW5mZXI8dHlwZW9mIFF1ZXN0aW9uRXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIExpZmVjeWNsZSBldmVudDogcmF3IGBHZW5pZU1lc3NhZ2VgIHNuYXBzaG90IGZvciB0aGUgYWN0aXZlXG4gKiB0dXJuLiBGaXJlcyBvbmNlIHBlciBwb2xsIHlpZWxkLiBUaGUgZnVsbCBtZXNzYWdlIHNoYXBlXG4gKiAoaW5jbHVkaW5nIHRoZSB3aWRlbmVkIHRob3VnaHQgLyByZWdlbiAvIGF0dGFjaG1lbnQtdHlwZVxuICogZmllbGRzKSBpcyBleHBvc2VkIGlubGluZSBhcyBgbWVzc2FnZWA7IGNvbnN1bWVycyBuYXJyb3cgb25cbiAqIGBldmVudC50eXBlID09PSBcIm1lc3NhZ2VcImAgYW5kIHJlYWNoIGZvciBgZXZlbnQubWVzc2FnZWAuXG4gKi9cbmV4cG9ydCBjb25zdCBNZXNzYWdlRXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5vbWl0KHtcbiAgYXR0YWNobWVudF9pZDogdHJ1ZSxcbn0pLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcIm1lc3NhZ2VcIiksXG4gIG1lc3NhZ2U6IEdlbmllTWVzc2FnZVNjaGVtYSxcbn0pO1xuLyoqIFJhdyBHZW5pZSBtZXNzYWdlIHNuYXBzaG90IGVtaXR0ZWQgb24gZXZlcnkgcG9sbCBpdGVyYXRpb24uICovXG5leHBvcnQgdHlwZSBNZXNzYWdlRXZlbnQgPSB6LmluZmVyPHR5cGVvZiBNZXNzYWdlRXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIFRvcC1sZXZlbCBgbWVzc2FnZS5zdGF0dXNgIHRyYW5zaXRpb25lZC4gRmlyZXMgZm9yIGV2ZXJ5XG4gKiBkaXN0aW5jdCBzdGF0dXMgc2VlbiBvbiB0aGUgd2lyZSAoZS5nLiBgU1VCTUlUVEVEYCAtPlxuICogYEZJTFRFUklOR19DT05URVhUYCAtPiBgQVNLSU5HX0FJYCAtPiBgUEVORElOR19XQVJFSE9VU0VgIC0+XG4gKiBgQVNLSU5HX0FJYCAtPiBgQ09NUExFVEVEYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBTdGF0dXNFdmVudFNjaGVtYSA9IEdlbmllQ2hhdExvY2F0aW9uU2NoZW1hLm9taXQoe1xuICBhdHRhY2htZW50X2lkOiB0cnVlLFxufSkuZXh0ZW5kKHtcbiAgdHlwZTogei5saXRlcmFsKFwic3RhdHVzXCIpLFxuICBzdGF0dXM6IE1lc3NhZ2VTdGF0dXNTY2hlbWEsXG4gIHByZXZpb3VzX3N0YXR1czogTWVzc2FnZVN0YXR1c1NjaGVtYS5vcHRpb25hbCgpLFxufSk7XG4vKiogTWVzc2FnZS1zdGF0dXMgdHJhbnNpdGlvbiwgaW5jbHVkaW5nIHRoZSBwcmV2aW91cyBzdGF0dXMgd2hlbiBhdmFpbGFibGUuICovXG5leHBvcnQgdHlwZSBTdGF0dXNFdmVudCA9IHouaW5mZXI8dHlwZW9mIFN0YXR1c0V2ZW50U2NoZW1hPjtcblxuLyoqXG4gKiBBIG5ldyBhdHRhY2htZW50IHNsb3QgYXBwZWFyZWQgaW4gYG1lc3NhZ2UuYXR0YWNobWVudHNbXWAuXG4gKiBGaXJlcyBleGFjdGx5IG9uY2UgcGVyIGF0dGFjaG1lbnQgKG1hdGNoZWQgYnkgYGF0dGFjaG1lbnRfaWRgLFxuICogcG9zaXRpb25hbGx5IGZvciBhbm9ueW1vdXMgYXR0YWNobWVudHMpIHRoZSBmaXJzdCB0aW1lIHdlIHNlZVxuICogaXQuIFRoZSBzbG90J3MgcGF5bG9hZCBraW5kIGxhbmRzIGluIGBhdHRhY2htZW50X3R5cGVgIHNvIHRoZVxuICogb3V0ZXIgYHR5cGVgIGRpc2NyaW1pbmF0b3Igc3RheXMgdW5hbWJpZ3VvdXMuXG4gKi9cbmV4cG9ydCBjb25zdCBBdHRhY2htZW50RXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJhdHRhY2htZW50XCIpLFxuICBpbmRleDogei5udW1iZXIoKSxcbiAgYXR0YWNobWVudF90eXBlOiBBdHRhY2htZW50VHlwZVNjaGVtYSxcbn0pO1xuLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiBhIG5ldyB0eXBlZCBhdHRhY2htZW50IGFwcGVhcnMgb24gdGhlIG1lc3NhZ2UuICovXG5leHBvcnQgdHlwZSBBdHRhY2htZW50RXZlbnQgPSB6LmluZmVyPHR5cGVvZiBBdHRhY2htZW50RXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIEEgbmV3IHJlYXNvbmluZyBzdGVwIGFwcGVhcmVkIG9uIGEgcXVlcnkgYXR0YWNobWVudFxuICogKGBhdHRhY2htZW50c1tpXS5xdWVyeS50aG91Z2h0c1tpXWApLiBEZWR1cGxpY2F0ZWQgcGVyXG4gKiBgKHRob3VnaHRfdHlwZSwgY29udGVudClgIHR1cGxlIHdpdGhpbiBhbiBhdHRhY2htZW50IHNvXG4gKiBzdWJzY3JpYmVycyBkb24ndCBzZWUgdGhlIHNhbWUgdGhvdWdodCBtdWx0aXBsZSB0aW1lcyAtIEdlbmllXG4gKiBzb21ldGltZXMgbXV0YXRlcyBleGlzdGluZyB0aG91Z2h0IHNsb3RzIGluIHBsYWNlLCBzbyB0aGUgZGlmZlxuICogaXMgdmFsdWUtYmFzZWQgcmF0aGVyIHRoYW4gcG9zaXRpb25hbC5cbiAqL1xuZXhwb3J0IGNvbnN0IFRoaW5raW5nRXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJ0aGlua2luZ1wiKSxcbiAgdGV4dDogei5zdHJpbmcoKSxcbiAgdGhvdWdodF90eXBlOiBHZW5pZVRob3VnaHRUeXBlU2NoZW1hLFxufSk7XG4vKiogSW5jcmVtZW50YWwgR2VuaWUgcmVhc29uaW5nIGV2ZW50IGRlcml2ZWQgZnJvbSBxdWVyeSB0aG91Z2h0cy4gKi9cbmV4cG9ydCB0eXBlIFRoaW5raW5nRXZlbnQgPSB6LmluZmVyPHR5cGVvZiBUaGlua2luZ0V2ZW50U2NoZW1hPjtcblxuLyoqXG4gKiBBIHRleHQtYXR0YWNobWVudCBgY29udGVudGAgZmllbGQgYXBwZWFyZWQgb3IgY2hhbmdlZFxuICogKGBhdHRhY2htZW50c1tpXS50ZXh0LmNvbnRlbnRgKS4gRmlyZXMgd2hlbmV2ZXIgdGhlIHNuYXBzaG90XG4gKiB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHByZXZpb3VzIG9uZSBmb3IgdGhlIHNhbWUgYXR0YWNobWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IFRleHRFdmVudFNjaGVtYSA9IEdlbmllQ2hhdExvY2F0aW9uU2NoZW1hLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInRleHRcIiksXG4gIHRleHQ6IHouc3RyaW5nKCksXG59KTtcbi8qKiBOYXJyYXRpdmUgYW5zd2VyIGZyYWdtZW50IGVtaXR0ZWQgZnJvbSBhIEdlbmllIHRleHQgYXR0YWNobWVudC4gKi9cbmV4cG9ydCB0eXBlIFRleHRFdmVudCA9IHouaW5mZXI8dHlwZW9mIFRleHRFdmVudFNjaGVtYT47XG5cbi8qKlxuICogU1FMIHdhcyBmaW5hbGl6ZWQgb24gYSBxdWVyeSBhdHRhY2htZW50XG4gKiAoYGF0dGFjaG1lbnRzW2ldLnF1ZXJ5LnF1ZXJ5YCkuIEZpcmVzIG9uY2Ugd2hlbiB0aGUgU1FMIHN0cmluZ1xuICogdHJhbnNpdGlvbnMgZnJvbSB1bmRlZmluZWQgdG8gZGVmaW5lZCwgYW5kIGFnYWluIGlmIEdlbmllIGV2ZXJcbiAqIHJld3JpdGVzIGl0LiBgdGl0bGVgIGFuZCBgZGVzY3JpcHRpb25gIGFyZSBkZW5vcm1hbGlzZWQgb2ZmIHRoZVxuICogYXR0YWNobWVudCdzIGBxdWVyeS50aXRsZWAgLyBgcXVlcnkuZGVzY3JpcHRpb25gIHNvIGNvbnN1bWVyc1xuICogY2FuIGxhYmVsIHRoZSBTUUwgcGlsbCB3aXRob3V0IHJlLXdhbGtpbmcgdGhlIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBjb25zdCBRdWVyeUV2ZW50U2NoZW1hID0gR2VuaWVDaGF0TG9jYXRpb25TY2hlbWEuZXh0ZW5kKHtcbiAgdHlwZTogei5saXRlcmFsKFwicXVlcnlcIiksXG4gIHNxbDogei5zdHJpbmcoKSxcbiAgdGl0bGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZGVzY3JpcHRpb246IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuLyoqIEZpbmFsaXplZCBvciByZXdyaXR0ZW4gU1FMIGVtaXR0ZWQgZm9yIGEgR2VuaWUgcXVlcnkgYXR0YWNobWVudC4gKi9cbmV4cG9ydCB0eXBlIFF1ZXJ5RXZlbnQgPSB6LmluZmVyPHR5cGVvZiBRdWVyeUV2ZW50U2NoZW1hPjtcblxuLyoqXG4gKiBTUUwgd2FzIHN1Ym1pdHRlZCB0byBhIFNRTCB3YXJlaG91c2UgYW5kIGEgc3RhdGVtZW50IGlkIHdhc1xuICogYXNzaWduZWQgKGBhdHRhY2htZW50c1tpXS5xdWVyeS5zdGF0ZW1lbnRfaWRgKS4gRmlyZXMgd2hlbiB0aGVcbiAqIHN0YXRlbWVudCBpZCB0cmFuc2l0aW9ucyBmcm9tIHVuZGVmaW5lZCB0byBkZWZpbmVkIC0gdGhpcyBpcyB0aGVcbiAqIHBvaW50IGF0IHdoaWNoIGBjbGllbnQuc3RhdGVtZW50RXhlY3V0aW9uLmdldFN0YXRlbWVudCh7IHN0YXRlbWVudF9pZCB9KWBcbiAqIGJlY29tZXMgYSB2YWxpZCBjYWxsLlxuICovXG5leHBvcnQgY29uc3QgU3RhdGVtZW50RXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJzdGF0ZW1lbnRcIiksXG4gIHN0YXRlbWVudF9pZDogei5zdHJpbmcoKSxcbn0pO1xuLyoqIEV2ZW50IGluZGljYXRpbmcgdGhhdCBhIHF1ZXJ5IHJlY2VpdmVkIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50IGlkLiAqL1xuZXhwb3J0IHR5cGUgU3RhdGVtZW50RXZlbnQgPSB6LmluZmVyPHR5cGVvZiBTdGF0ZW1lbnRFdmVudFNjaGVtYT47XG5cbi8qKlxuICogUm93IGNvdW50IGZvciBhIHF1ZXJ5IGF0dGFjaG1lbnQncyByZXN1bHQgY2hhbmdlZFxuICogKGBhdHRhY2htZW50c1tpXS5xdWVyeS5xdWVyeV9yZXN1bHRfbWV0YWRhdGEucm93X2NvdW50YCkuIEZpcmVzXG4gKiBvbiBldmVyeSBjaGFuZ2UsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBgdW5kZWZpbmVkIC0+IDBgIGFuZCB0aGVcbiAqIGxhdGVyIGAwIC0+IE5gIG9uY2UgdGhlIHdhcmVob3VzZSBmaW5pc2hlcyBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBSb3dzRXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5leHRlbmQoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJyb3dzXCIpLFxuICByb3dfY291bnQ6IHoubnVtYmVyKCksXG4gIHByZXZpb3VzX3Jvd19jb3VudDogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICBzdGF0ZW1lbnRfaWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbn0pO1xuLyoqIFJvdy1jb3VudCB0cmFuc2l0aW9uIGZvciBhIEdlbmllIHF1ZXJ5IHJlc3VsdC4gKi9cbmV4cG9ydCB0eXBlIFJvd3NFdmVudCA9IHouaW5mZXI8dHlwZW9mIFJvd3NFdmVudFNjaGVtYT47XG5cbi8qKlxuICogR2VuaWUgcHJvZHVjZWQgYSBmb2xsb3ctdXAgc3VnZ2VzdGVkLXF1ZXN0aW9ucyBsaXN0XG4gKiAoYGF0dGFjaG1lbnRzW2ldLnN1Z2dlc3RlZF9xdWVzdGlvbnMucXVlc3Rpb25zW11gKS4gRmlyZXMgb25jZVxuICogd2hlbiB0aGUgbGlzdCBhcHBlYXJzLCBhbmQgYWdhaW4gaWYgR2VuaWUgcmV3cml0ZXMgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBTdWdnZXN0ZWRRdWVzdGlvbnNFdmVudFNjaGVtYSA9IEdlbmllQ2hhdExvY2F0aW9uU2NoZW1hLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInN1Z2dlc3RlZF9xdWVzdGlvbnNcIiksXG4gIHF1ZXN0aW9uczogei5hcnJheSh6LnN0cmluZygpKSxcbn0pO1xuLyoqIEZvbGxvdy11cCBxdWVzdGlvbiBsaXN0IGVtaXR0ZWQgd2hlbiBHZW5pZSBhZGRzIG9yIHJld3JpdGVzIHN1Z2dlc3Rpb25zLiAqL1xuZXhwb3J0IHR5cGUgU3VnZ2VzdGVkUXVlc3Rpb25zRXZlbnQgPSB6LmluZmVyPHR5cGVvZiBTdWdnZXN0ZWRRdWVzdGlvbnNFdmVudFNjaGVtYT47XG5cbi8qKlxuICogVGhlIGFjdGl2ZSB0dXJuIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0dXMuIEFsd2F5cyBmaXJlcyBvbmNlXG4gKiBwZXIgdHVybiAoaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRlcm1pbmFsIGBtZXNzYWdlYCBldmVudCkuXG4gKiBDYXJyaWVzIHRoZSBmaW5hbCBgR2VuaWVNZXNzYWdlYCBzbmFwc2hvdCBpbmxpbmUgc28gc3Vic2NyaWJlcnNcbiAqIGRvbid0IG5lZWQgdG8ga2VlcCB0aGVpciBvd24gY29weSBvZiB0aGUgbGFzdCBtZXNzYWdlLlxuICovXG5leHBvcnQgY29uc3QgUmVzdWx0RXZlbnRTY2hlbWEgPSBHZW5pZUNoYXRMb2NhdGlvblNjaGVtYS5vbWl0KHtcbiAgYXR0YWNobWVudF9pZDogdHJ1ZSxcbn0pLmV4dGVuZCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInJlc3VsdFwiKSxcbiAgc3RhdHVzOiBUZXJtaW5hbFN0YXR1c1NjaGVtYSxcbiAgbWVzc2FnZTogR2VuaWVNZXNzYWdlU2NoZW1hLFxufSk7XG4vKiogRmluYWwgZXZlbnQgZm9yIGEgR2VuaWUgdHVybiwgY2FycnlpbmcgaXRzIHRlcm1pbmFsIHN0YXR1cyBhbmQgbWVzc2FnZSBzbmFwc2hvdC4gKi9cbmV4cG9ydCB0eXBlIFJlc3VsdEV2ZW50ID0gei5pbmZlcjx0eXBlb2YgUmVzdWx0RXZlbnRTY2hlbWE+O1xuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgdW5pb24geWllbGRlZCBieSBgZ2VuaWVFdmVudENoYXRgLiBFYWNoIHZhcmlhbnRcbiAqIGlzIGEgc2luZ2xlIGZsYXQgb2JqZWN0IHdpdGggYHR5cGVgIGFzIHRoZSBkaXNjcmltaW5hdG9yIGFuZFxuICogdGhlIHBheWxvYWQgZmllbGRzIGhvaXN0ZWQgZGlyZWN0bHkgdG8gdGhlIHRvcCBsZXZlbCAtIG5vXG4gKiBgcGF5bG9hZGAgd3JhcHBlci4gQ29uc3VtZXJzIG5hcnJvdyBvbiBgdHlwZWAgYW5kIHJlYWQgZmllbGRzXG4gKiBpbmxpbmU6XG4gKlxuICogQGV4YW1wbGVcbiAqIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2YgZ2VuaWVFdmVudENoYXQoc3BhY2VJZCwgXCJUb3Agc3RvcmVzP1wiKSkge1xuICogICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAqICAgICBjYXNlIFwidGhpbmtpbmdcIjpcbiAqICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LnRob3VnaHRfdHlwZSwgZXZlbnQudGV4dCk7XG4gKiAgICAgICBicmVhaztcbiAqICAgICBjYXNlIFwicmVzdWx0XCI6XG4gKiAgICAgICBjb25zb2xlLmxvZyhcImRvbmU6XCIsIGV2ZW50LnN0YXR1cyk7XG4gKiAgICAgICBicmVhaztcbiAqICAgfVxuICogfVxuICpcbiAqIFN0cmVhbSBvcmRlciBwZXIgdHVybjpcbiAqXG4gKiAgIDEuIGBxdWVzdGlvbmAsIGVtaXR0ZWQgd2l0aCB0aGUgZmlyc3QgYG1lc3NhZ2VgIHlpZWxkIChkZWZlcnJlZCBzb1xuICogICAgICB0aGUgYXNzaWduZWQgYG1lc3NhZ2VfaWRgIGlzIGF2YWlsYWJsZSksIGNhcnJ5aW5nIHRoZSBwcm9tcHRcbiAqICAgICAgdGhpcyB0dXJuIHNlbnQgdG8gR2VuaWUuXG4gKiAgIDIuIGBtZXNzYWdlYCBmb3IgZXZlcnkgcG9sbCB5aWVsZCAocmF3IGBHZW5pZU1lc3NhZ2VgIG9uXG4gKiAgICAgIGBldmVudC5tZXNzYWdlYCkuXG4gKiAgIDMuIEFueSBkZXJpdmVkIGV2ZW50cyB0aGUgc25hcHNob3QgZGlmZiBwcm9kdWNlZCAoYHN0YXR1c2AsXG4gKiAgICAgIGBhdHRhY2htZW50YCwgYHRoaW5raW5nYCwgYHRleHRgLCBgcXVlcnlgLCBgc3RhdGVtZW50YCxcbiAqICAgICAgYHJvd3NgLCBgc3VnZ2VzdGVkX3F1ZXN0aW9uc2ApIGluIHRoYXQgZml4ZWQgb3JkZXIuXG4gKiAgIDQuIE9uIHRoZSB0ZXJtaW5hbCBzbmFwc2hvdCwgYSBmaW5hbCBgcmVzdWx0YCBldmVudC5cbiAqXG4gKiBFcnJvcnMgcHJvcGFnYXRlIHZpYSB0aGUgZ2VuZXJhdG9yIHRocm93aW5nIChgdHJ5YC9gY2F0Y2hgIHRoZVxuICogYGZvciBhd2FpdGApLCBub3QgdmlhIGFuIGBlcnJvcmAgdmFyaWFudCBvbiB0aGlzIHVuaW9uLlxuICovXG5leHBvcnQgY29uc3QgR2VuaWVDaGF0RXZlbnRTY2hlbWEgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICBRdWVzdGlvbkV2ZW50U2NoZW1hLFxuICBNZXNzYWdlRXZlbnRTY2hlbWEsXG4gIFN0YXR1c0V2ZW50U2NoZW1hLFxuICBBdHRhY2htZW50RXZlbnRTY2hlbWEsXG4gIFRoaW5raW5nRXZlbnRTY2hlbWEsXG4gIFRleHRFdmVudFNjaGVtYSxcbiAgUXVlcnlFdmVudFNjaGVtYSxcbiAgU3RhdGVtZW50RXZlbnRTY2hlbWEsXG4gIFJvd3NFdmVudFNjaGVtYSxcbiAgU3VnZ2VzdGVkUXVlc3Rpb25zRXZlbnRTY2hlbWEsXG4gIFJlc3VsdEV2ZW50U2NoZW1hLFxuXSk7XG4vKiogT3JkZXJlZCBldmVudCB1bmlvbiB5aWVsZGVkIGJ5IGBnZW5pZUV2ZW50Q2hhdGA7IGZhaWx1cmVzIGFyZSB0aHJvd24sIG5vdCBlbWl0dGVkLiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVDaGF0RXZlbnQgPSB6LmluZmVyPHR5cGVvZiBHZW5pZUNoYXRFdmVudFNjaGVtYT47XG5cbi8qKiBEaXNjcmltaW5hdG9yIHR5cGUgZm9yIHtAbGluayBHZW5pZUNoYXRFdmVudH0uICovXG5leHBvcnQgdHlwZSBHZW5pZUNoYXRFdmVudFR5cGUgPSBHZW5pZUNoYXRFdmVudFtcInR5cGVcIl07XG5cbi8qKlxuICogRmllbGQgc2V0IGZvciBhIGdpdmVuIHtAbGluayBHZW5pZUNoYXRFdmVudFR5cGV9IC0gdGhlIHZhcmlhbnRcbiAqIHdpdGggdGhlIGB0eXBlYCBkaXNjcmltaW5hdG9yIHN0cmlwcGVkLiBVc2VkIGJ5IGRldGVjdG9ycyBpblxuICogYGV2ZW50LnRzYCBzbyBlYWNoIGRldGVjdG9yIHJldHVybnMganVzdCB0aGUgcGF5bG9hZCBmaWVsZHMgYW5kXG4gKiB0aGUgb3JjaGVzdHJhdG9yIHN0YW1wcyBgdHlwZWAgYXQgeWllbGQgdGltZS5cbiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVDaGF0RXZlbnRGaWVsZHM8VCBleHRlbmRzIEdlbmllQ2hhdEV2ZW50VHlwZT4gPSBPbWl0PFxuICBFeHRyYWN0PEdlbmllQ2hhdEV2ZW50LCB7IHR5cGU6IFQgfT4sXG4gIFwidHlwZVwiXG4+O1xuIl19