@dbx-tools/shared-model 0.6.73 → 0.6.75

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.
@@ -32,6 +32,9 @@
32
32
  * - {@link sanitizeOpenResponsesInput} rewrites `output_*` content part types
33
33
  * in `input` to `input_*`, and drops Claude thinking / reasoning blocks
34
34
  * that Open Responses rejects on replay (`redacted_thinking`, …).
35
+ * - {@link repairTrailingAssistantInput} drops a trailing assistant turn that
36
+ * Anthropic reads as a prefill request, the Responses-side counterpart to
37
+ * `@dbx-tools/appkit-mastra`'s `repairAssistantPrefill`.
35
38
  *
36
39
  * Only the surface real clients exercise is translated; unknown fields are
37
40
  * ignored rather than rejected, so a newer client degrades instead of breaking.
@@ -167,9 +170,41 @@ export declare const REASONING_TYPES: ReadonlySet<string>;
167
170
  * Returns a shallow copy when anything changes; otherwise the input body.
168
171
  */
169
172
  export declare function sanitizeOpenResponsesInput(body: Record<string, unknown>): Record<string, unknown>;
173
+ /**
174
+ * Drop trailing assistant turns so the transcript ends on something Anthropic
175
+ * will continue from.
176
+ *
177
+ * Databricks Open Responses rejects a body whose last item is an assistant
178
+ * message with `"This model does not support assistant message prefill. The
179
+ * conversation must end with a user message."` (the upstream Bedrock route
180
+ * disallows prefill). Two ways a real client hits it:
181
+ *
182
+ * 1. The client replays its own last answer. The Codex CLI does this when a turn
183
+ * ends without a tool call and the next request carries the full transcript.
184
+ * 2. {@link sanitizeOpenResponsesInput} CREATES the shape: a turn that ended in a
185
+ * `reasoning` item is stripped for replay compatibility, promoting the
186
+ * assistant message before it to last. Running this repair after that strip
187
+ * is what keeps one fix from causing the other failure.
188
+ *
189
+ * Dropping is correct rather than lossy: a trailing assistant turn carries text
190
+ * the model itself just produced, so it is context the provider does not need
191
+ * repeated in order to continue. Appending a synthetic `"Continue."` user turn
192
+ * also satisfies the provider, but it puts words in the user's mouth that show
193
+ * up in the model's context, so this takes the honest option.
194
+ *
195
+ * A trailing `function_call` is left ALONE. It is also an assistant-side item,
196
+ * but Anthropic rejects an unanswered `tool_use` on a different rule
197
+ * (`tool_use` ids without `tool_result`), and dropping it would silently discard
198
+ * a tool call the client is about to answer. That is the client's bug to fix,
199
+ * not something to paper over here.
200
+ *
201
+ * Returns a shallow copy when anything changes; otherwise the input body.
202
+ */
203
+ export declare function repairTrailingAssistantInput(body: Record<string, unknown>): Record<string, unknown>;
170
204
  /**
171
205
  * Full Open Responses request sanitizer: strip non-`function` tools, rewrite
172
- * `output_*` content parts, and drop thinking / reasoning blocks. Safe no-op
206
+ * `output_*` content parts, drop thinking / reasoning blocks, and drop a
207
+ * trailing assistant turn the provider would read as a prefill. Safe no-op
173
208
  * when nothing needs changing.
174
209
  */
175
210
  export declare function sanitizeOpenResponsesRequest(body: Record<string, unknown>): Record<string, unknown>;
@@ -32,6 +32,9 @@
32
32
  * - {@link sanitizeOpenResponsesInput} rewrites `output_*` content part types
33
33
  * in `input` to `input_*`, and drops Claude thinking / reasoning blocks
34
34
  * that Open Responses rejects on replay (`redacted_thinking`, …).
35
+ * - {@link repairTrailingAssistantInput} drops a trailing assistant turn that
36
+ * Anthropic reads as a prefill request, the Responses-side counterpart to
37
+ * `@dbx-tools/appkit-mastra`'s `repairAssistantPrefill`.
35
38
  *
36
39
  * Only the surface real clients exercise is translated; unknown fields are
37
40
  * ignored rather than rejected, so a newer client degrades instead of breaking.
@@ -675,12 +678,73 @@ export function sanitizeOpenResponsesInput(body) {
675
678
  }
676
679
  return changed ? { ...body, input } : body;
677
680
  }
681
+ /**
682
+ * Drop trailing assistant turns so the transcript ends on something Anthropic
683
+ * will continue from.
684
+ *
685
+ * Databricks Open Responses rejects a body whose last item is an assistant
686
+ * message with `"This model does not support assistant message prefill. The
687
+ * conversation must end with a user message."` (the upstream Bedrock route
688
+ * disallows prefill). Two ways a real client hits it:
689
+ *
690
+ * 1. The client replays its own last answer. The Codex CLI does this when a turn
691
+ * ends without a tool call and the next request carries the full transcript.
692
+ * 2. {@link sanitizeOpenResponsesInput} CREATES the shape: a turn that ended in a
693
+ * `reasoning` item is stripped for replay compatibility, promoting the
694
+ * assistant message before it to last. Running this repair after that strip
695
+ * is what keeps one fix from causing the other failure.
696
+ *
697
+ * Dropping is correct rather than lossy: a trailing assistant turn carries text
698
+ * the model itself just produced, so it is context the provider does not need
699
+ * repeated in order to continue. Appending a synthetic `"Continue."` user turn
700
+ * also satisfies the provider, but it puts words in the user's mouth that show
701
+ * up in the model's context, so this takes the honest option.
702
+ *
703
+ * A trailing `function_call` is left ALONE. It is also an assistant-side item,
704
+ * but Anthropic rejects an unanswered `tool_use` on a different rule
705
+ * (`tool_use` ids without `tool_result`), and dropping it would silently discard
706
+ * a tool call the client is about to answer. That is the client's bug to fix,
707
+ * not something to paper over here.
708
+ *
709
+ * Returns a shallow copy when anything changes; otherwise the input body.
710
+ */
711
+ export function repairTrailingAssistantInput(body) {
712
+ if (!Array.isArray(body.input) || body.input.length === 0)
713
+ return body;
714
+ const input = [...body.input];
715
+ let changed = false;
716
+ // A loop, not one check: stripping reasoning can leave several assistant
717
+ // turns in a row at the end.
718
+ while (input.length > 0 && isAssistantMessageItem(input[input.length - 1])) {
719
+ input.pop();
720
+ changed = true;
721
+ }
722
+ // Never send an empty `input`: an all-assistant transcript is not something
723
+ // this repair can rescue, so leave the body for the provider to reject with
724
+ // its own message rather than inventing a request.
725
+ if (!changed || input.length === 0)
726
+ return body;
727
+ return { ...body, input };
728
+ }
729
+ /**
730
+ * Whether an `input` item is an assistant MESSAGE (the prefill trigger), as
731
+ * opposed to a `function_call` or any other assistant-side item type.
732
+ */
733
+ function isAssistantMessageItem(value) {
734
+ if (!value || typeof value !== "object")
735
+ return false;
736
+ const item = value;
737
+ if (item.role !== "assistant")
738
+ return false;
739
+ return item.type === undefined || item.type === "message";
740
+ }
678
741
  /**
679
742
  * Full Open Responses request sanitizer: strip non-`function` tools, rewrite
680
- * `output_*` content parts, and drop thinking / reasoning blocks. Safe no-op
743
+ * `output_*` content parts, drop thinking / reasoning blocks, and drop a
744
+ * trailing assistant turn the provider would read as a prefill. Safe no-op
681
745
  * when nothing needs changing.
682
746
  */
683
747
  export function sanitizeOpenResponsesRequest(body) {
684
- return sanitizeOpenResponsesInput(sanitizeResponsesTools(body));
748
+ return repairTrailingAssistantInput(sanitizeOpenResponsesInput(sanitizeResponsesTools(body)));
685
749
  }
686
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLXJlc3BvbnNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYWktcmVzcG9uc2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQ0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFaEQsT0FBTyxFQUF1QyxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTFGOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQTZCO0lBSTNELE1BQU0sUUFBUSxHQUFrQixFQUFFLENBQUM7SUFFbkMscURBQXFEO0lBQ3JELElBQUksT0FBTyxJQUFJLENBQUMsWUFBWSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMxRSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELG1FQUFtRTtJQUNuRSw0REFBNEQ7SUFDNUQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMxRCxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtZQUFFLFNBQVM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsR0FBOEIsQ0FBQztRQUM1QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRXZCLElBQUksSUFBSSxLQUFLLGVBQWUsRUFBRSxDQUFDO1lBQzdC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QyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDeEUsU0FBUztZQUNYLENBQUM7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQixTQUFTO1FBQ1gsQ0FBQztRQUNELE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDZiw0RUFBNEU7UUFDNUUsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFdBQVc7WUFBRSxTQUFTO1FBQ2hFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQzdDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLDRCQUE0QixDQUMxQyxJQUE2QjtJQUU3QixPQUFPLDBCQUEwQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDbEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3BlbkFJIFJlc3BvbnNlcyBBUEkgPC0+IENoYXQgQ29tcGxldGlvbnMgdHJhbnNsYXRpb24uXG4gKlxuICogU29tZSBjbGllbnRzIHNwZWFrIG9ubHkgdGhlIFJlc3BvbnNlcyBBUEkgKGBQT1NUIC92MS9yZXNwb25zZXNgKSAtIHRoZSBDb2RleFxuICogQ0xJIGlzIHRoZSBtb3RpdmF0aW5nIG9uZS4gRGF0YWJyaWNrcyBub3cgYWxzbyBleHBvc2VzIG5hdGl2ZSBSZXNwb25zZXNcbiAqIHN1cmZhY2VzIChgL3NlcnZpbmctZW5kcG9pbnRzL3Jlc3BvbnNlc2AgYW5kIGAvc2VydmluZy1lbmRwb2ludHMvb3Blbi1yZXNwb25zZXNgKSxcbiAqIHdoaWxlIG1vc3QgZW5kcG9pbnRzIHN0aWxsIHNwZWFrIENoYXQgQ29tcGxldGlvbnMgYXQgYC9pbnZvY2F0aW9uc2AuIFRoaXNcbiAqIG1vZHVsZSBicmlkZ2VzIHRoZSB0d28sIGluIGJvdGggZGlyZWN0aW9uczpcbiAqXG4gKiAgIC0ge0BsaW5rIHJlc3BvbnNlc1RvQ2hhdH0gbG93ZXJzIGEgUmVzcG9uc2VzIHJlcXVlc3QgYm9keSB0byBhIGNoYXRcbiAqICAgICBjb21wbGV0aW9ucyBib2R5IChpbnN0cnVjdGlvbnMgLT4gc3lzdGVtIG1lc3NhZ2UsIHR5cGVkIGBpbnB1dGAgaXRlbXMgLT5cbiAqICAgICBgbWVzc2FnZXNgLCBgdG9vbHNgL2B0b29sX2Nob2ljZWAgY2FycmllZCB0aHJvdWdoLCBmdW5jdGlvbi1jYWxsIG91dHB1dHNcbiAqICAgICBmb2xkZWQgYmFjayBpbnRvIHRoZSB0cmFuc2NyaXB0KS5cbiAqICAgLSB7QGxpbmsgY2hhdFRvUmVzcG9uc2VzUmVxdWVzdH0gcmFpc2VzIGEgY2hhdC1jb21wbGV0aW9ucyByZXF1ZXN0IGludG8gYVxuICogICAgIFJlc3BvbnNlcyByZXF1ZXN0ICh0aGUgaW52ZXJzZSBvZiB7QGxpbmsgcmVzcG9uc2VzVG9DaGF0fSksIGZvciByb3V0aW5nIGFcbiAqICAgICBjaGF0IGNsaWVudCBhdCBhIFJlc3BvbnNlcy1vbmx5IG1vZGVsIGxpa2UgQ29kZXguXG4gKiAgIC0ge0BsaW5rIGNoYXRUb1Jlc3BvbnNlfSBsaWZ0cyBhIG5vbi1zdHJlYW1pbmcgY2hhdCBjb21wbGV0aW9uIGJhY2sgaW50byBhXG4gKiAgICAgUmVzcG9uc2VzIGByZXNwb25zZWAgb2JqZWN0LlxuICogICAtIHtAbGluayByZXNwb25zZVRvQ2hhdENvbXBsZXRpb259IGxpZnRzIGEgbmF0aXZlIFJlc3BvbnNlcyBgcmVzcG9uc2VgXG4gKiAgICAgYmFjayBpbnRvIGEgY2hhdC1jb21wbGV0aW9ucyBib2R5ICh0aGUgaW52ZXJzZSBvZiB7QGxpbmsgY2hhdFRvUmVzcG9uc2V9KS5cbiAqICAgLSB7QGxpbmsgY3JlYXRlUmVzcG9uc2VzU3RyZWFtVHJhbnNsYXRvcn0gbGlmdHMgYSBzdHJlYW1pbmcgY2hhdCBjb21wbGV0aW9uXG4gKiAgICAgKGFuIE9wZW5BSSBTU0UgYGNoYXQuY29tcGxldGlvbi5jaHVua2Agc3RyZWFtKSBpbnRvIHRoZSBSZXNwb25zZXMgU1NFXG4gKiAgICAgZXZlbnQgc3RyZWFtIHRob3NlIGNsaWVudHMgY29uc3VtZSAoYHJlc3BvbnNlLmNyZWF0ZWRgLFxuICogICAgIGByZXNwb25zZS5vdXRwdXRfdGV4dC5kZWx0YWAsIGZ1bmN0aW9uLWNhbGwgYXJndW1lbnQgZGVsdGFzLFxuICogICAgIGByZXNwb25zZS5jb21wbGV0ZWRgKS5cbiAqICAgLSB7QGxpbmsgcmVhZFJlc3BvbnNlc091dHB1dH0gcmVhZHMgdGhlIG90aGVyIGRpcmVjdGlvbjogcHVsbCB0aGUgYW5zd2VyXG4gKiAgICAgdGV4dCBhbmQgY2l0YXRpb25zIG91dCBvZiBhIGByZXNwb25zZWAgb2JqZWN0IHJldHVybmVkIGJ5IGFuIGVuZHBvaW50XG4gKiAgICAgdGhhdCBzcGVha3MgUmVzcG9uc2VzIG5hdGl2ZWx5ICh0aGUgRGF0YWJyaWNrcyBuYXRpdmUgd2ViLXNlYXJjaCB0b29sKS5cbiAqICAgLSB7QGxpbmsgc2FuaXRpemVSZXNwb25zZXNUb29sc30ga2VlcHMgb25seSBgZnVuY3Rpb25gIHRvb2xzIG9uIGEgUmVzcG9uc2VzXG4gKiAgICAgcmVxdWVzdCBib2R5IChmb3IgYC9vcGVuLXJlc3BvbnNlc2AgLyBBbnRocm9waWMsIHdoaWNoIHJlamVjdCBDb2RleFxuICogICAgIGJ1aWx0LWlucyBsaWtlIGB3ZWJfc2VhcmNoYCkuXG4gKiAgIC0ge0BsaW5rIHNhbml0aXplT3BlblJlc3BvbnNlc0lucHV0fSByZXdyaXRlcyBgb3V0cHV0XypgIGNvbnRlbnQgcGFydCB0eXBlc1xuICogICAgIGluIGBpbnB1dGAgdG8gYGlucHV0XypgLCBhbmQgZHJvcHMgQ2xhdWRlIHRoaW5raW5nIC8gcmVhc29uaW5nIGJsb2Nrc1xuICogICAgIHRoYXQgT3BlbiBSZXNwb25zZXMgcmVqZWN0cyBvbiByZXBsYXkgKGByZWRhY3RlZF90aGlua2luZ2AsIOKApikuXG4gKlxuICogT25seSB0aGUgc3VyZmFjZSByZWFsIGNsaWVudHMgZXhlcmNpc2UgaXMgdHJhbnNsYXRlZDsgdW5rbm93biBmaWVsZHMgYXJlXG4gKiBpZ25vcmVkIHJhdGhlciB0aGFuIHJlamVjdGVkLCBzbyBhIG5ld2VyIGNsaWVudCBkZWdyYWRlcyBpbnN0ZWFkIG9mIGJyZWFraW5nLlxuICpcbiAqIEJyb3dzZXItc2FmZTogcHVyZSBmdW5jdGlvbnMgb3ZlciBwbGFpbiBKU09OLCBubyB0cmFuc3BvcnQgYW5kIG5vIE5vZGVcbiAqIGJ1aWx0LWlucywgc28gdGhlIHNhbWUgdHJhbnNsYXRpb24gcnVucyBpbiBhIHByb3h5LCBhIHNlcnZlciByb3V0ZSwgb3IgYSB0ZXN0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG5pbXBvcnQgeyB0eXBlIENoYXRNZXNzYWdlLCB0eXBlIENoYXRUb29sQ2FsbCwgY2hhdENvbnRlbnRUb1RleHQgfSBmcm9tIFwiLi9vcGVuYWktY2hhdC50c1wiO1xuXG4vKipcbiAqIExvd2VyIGEgUmVzcG9uc2VzIHJlcXVlc3QgYm9keSB0byBhIGNoYXQtY29tcGxldGlvbnMgYm9keS4gUmV0dXJucyB0aGUgY2hhdFxuICogYm9keSBwbHVzIHdoZXRoZXIgdGhlIGNhbGxlciBhc2tlZCBmb3Igc3RyZWFtaW5nICh0aGUgc2VydmVyIG5lZWRzIGl0IHRvIHBpY2tcbiAqIHRoZSB1cHN0cmVhbSBgYWNjZXB0YCBoZWFkZXIgYW5kIHRoZSB0cmFuc2xhdGlvbiBwYXRoKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3BvbnNlc1RvQ2hhdChib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHtcbiAgY2hhdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHN0cmVhbTogYm9vbGVhbjtcbn0ge1xuICBjb25zdCBtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSA9IFtdO1xuXG4gIC8vIGBpbnN0cnVjdGlvbnNgIGJlY29tZXMgdGhlIGxlYWRpbmcgc3lzdGVtIG1lc3NhZ2UuXG4gIGlmICh0eXBlb2YgYm9keS5pbnN0cnVjdGlvbnMgPT09IFwic3RyaW5nXCIgJiYgYm9keS5pbnN0cnVjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgIG1lc3NhZ2VzLnB1c2goeyByb2xlOiBcInN5c3RlbVwiLCBjb250ZW50OiBib2R5Lmluc3RydWN0aW9ucyB9KTtcbiAgfVxuXG4gIC8vIGBpbnB1dGAgaXMgYW4gYXJyYXkgb2YgdHlwZWQgaXRlbXM6IG1lc3NhZ2VzLCBmdW5jdGlvbl9jYWxsLCBhbmRcbiAgLy8gZnVuY3Rpb25fY2FsbF9vdXRwdXQuIEZvbGQgZWFjaCBpbnRvIHRoZSBjaGF0IHRyYW5zY3JpcHQuXG4gIGNvbnN0IGlucHV0ID0gQXJyYXkuaXNBcnJheShib2R5LmlucHV0KSA/IGJvZHkuaW5wdXQgOiBbXTtcbiAgZm9yIChjb25zdCByYXcgb2YgaW5wdXQpIHtcbiAgICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcbiAgICBjb25zdCBpdGVtID0gcmF3IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHR5cGUgPSBpdGVtLnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsXCIpIHtcbiAgICAgIC8vIEEgcHJpb3IgdG9vbCBjYWxsIHRoZSBtb2RlbCBtYWRlOyByZS1hdHRhY2ggaXQgdG8gYW4gYXNzaXN0YW50IHR1cm4uXG4gICAgICBtZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgY29udGVudDogbnVsbCxcbiAgICAgICAgdG9vbF9jYWxsczogW3RvQ2hhdFRvb2xDYWxsKGl0ZW0pXSxcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbF9vdXRwdXRcIikge1xuICAgICAgLy8gVGhlIHRvb2wncyByZXN1bHQsIGtleWVkIGJhY2sgdG8gdGhlIGNhbGwgaXQgYW5zd2Vycy5cbiAgICAgIG1lc3NhZ2VzLnB1c2goe1xuICAgICAgICByb2xlOiBcInRvb2xcIixcbiAgICAgICAgdG9vbF9jYWxsX2lkOiBTdHJpbmcoaXRlbS5jYWxsX2lkID8/IGl0ZW0uaWQgPz8gXCJcIiksXG4gICAgICAgIGNvbnRlbnQ6IHR5cGVvZiBpdGVtLm91dHB1dCA9PT0gXCJzdHJpbmdcIiA/IGl0ZW0ub3V0cHV0IDogY2hhdENvbnRlbnRUb1RleHQoaXRlbS5vdXRwdXQpLFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0OiBhIG1lc3NhZ2UgaXRlbSB3aXRoIGEgcm9sZSBhbmQgdHlwZWQgY29udGVudC5cbiAgICBjb25zdCByb2xlID0gdHlwZW9mIGl0ZW0ucm9sZSA9PT0gXCJzdHJpbmdcIiA/IGl0ZW0ucm9sZSA6IFwidXNlclwiO1xuICAgIC8vIENoYXQgaGFzIG5vIFwiZGV2ZWxvcGVyXCIgcm9sZTsgdHJlYXQgaXQgYXMgc3lzdGVtIChpdHMgaW50ZW50IGhlcmUpLlxuICAgIGNvbnN0IGNoYXRSb2xlID0gcm9sZSA9PT0gXCJkZXZlbG9wZXJcIiA/IFwic3lzdGVtXCIgOiByb2xlO1xuICAgIG1lc3NhZ2VzLnB1c2goeyByb2xlOiBjaGF0Um9sZSwgY29udGVudDogY2hhdENvbnRlbnRUb1RleHQoaXRlbS5jb250ZW50KSB9KTtcbiAgfVxuXG4gIGNvbnN0IGNoYXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIG1vZGVsOiBib2R5Lm1vZGVsLFxuICAgIG1lc3NhZ2VzLFxuICAgIHN0cmVhbTogYm9keS5zdHJlYW0gPT09IHRydWUsXG4gIH07XG5cbiAgLy8gQ2FycnkgdGhyb3VnaCBmdW5jdGlvbi1jYWxsaW5nIGNvbmZpZyB3aGVuIHByZXNlbnQuIFJlc3BvbnNlcyBmdW5jdGlvblxuICAvLyB0b29scyBhcmUgRkxBVCAoYHt0eXBlOlwiZnVuY3Rpb25cIiwgbmFtZSwgZGVzY3JpcHRpb24sIHBhcmFtZXRlcnN9YCk7IGNoYXRcbiAgLy8gd2FudHMgdGhlbSBORVNURUQgKGB7dHlwZTpcImZ1bmN0aW9uXCIsIGZ1bmN0aW9uOntuYW1lLCDigKZ9fWApLiBDbGllbnRzIGFsc29cbiAgLy8gc2VuZCBidWlsdC1pbiB0b29sIHR5cGVzIChsb2NhbF9zaGVsbCwgd2ViX3NlYXJjaCwg4oCmKSB0aGF0IERhdGFicmlja3MgY2hhdFxuICAvLyByZWplY3RzIChcIk1pc3NpbmcgJ2Z1bmN0aW9uJyBpbiB0aGUgdG9vbCBzcGVjaWZpY2F0aW9uXCIpLCBzbyB3ZSB0cmFuc2xhdGVcbiAgLy8gb25seSBmdW5jdGlvbiB0b29scyBhbmQgZHJvcCB0aGUgcmVzdC5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYm9keS50b29scykgJiYgYm9keS50b29scy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgY2hhdFRvb2xzID0gYm9keS50b29sc1xuICAgICAgLm1hcCh0b0NoYXRUb29sKVxuICAgICAgLmZpbHRlcigodCk6IHQgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gdCAhPT0gdW5kZWZpbmVkKTtcbiAgICBpZiAoY2hhdFRvb2xzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNoYXQudG9vbHMgPSBjaGF0VG9vbHM7XG4gICAgICBpZiAoYm9keS50b29sX2Nob2ljZSAhPT0gdW5kZWZpbmVkKSBjaGF0LnRvb2xfY2hvaWNlID0gYm9keS50b29sX2Nob2ljZTtcbiAgICAgIC8vIE5PVEU6IGRvIE5PVCBmb3J3YXJkIGBwYXJhbGxlbF90b29sX2NhbGxzYC4gQ2xpZW50cyBzZW5kIGl0LCBidXRcbiAgICAgIC8vIERhdGFicmlja3MgTW9kZWwgU2VydmluZydzIGNoYXQgQVBJIHJlamVjdHMgdW5rbm93biBmaWVsZHNcbiAgICAgIC8vIChcInBhcmFsbGVsX3Rvb2xfY2FsbHM6IEV4dHJhIGlucHV0cyBhcmUgbm90IHBlcm1pdHRlZFwiKSwgd2hpY2ggd291bGRcbiAgICAgIC8vIGZhaWwgdGhlIHdob2xlIHR1cm4uIERyb3AgaXQuXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgY2hhdCwgc3RyZWFtOiBib2R5LnN0cmVhbSA9PT0gdHJ1ZSB9O1xufVxuXG4vKipcbiAqIFJhaXNlIGEgY2hhdC1jb21wbGV0aW9ucyByZXF1ZXN0IGludG8gYSBSZXNwb25zZXMgcmVxdWVzdCBib2R5LiBJbnZlcnNlIG9mXG4gKiB7QGxpbmsgcmVzcG9uc2VzVG9DaGF0fTogdXNlZCB3aGVuIGEgY2hhdCBjbGllbnQgaGl0cyBhIFJlc3BvbnNlcy1vbmx5XG4gKiBEYXRhYnJpY2tzIG1vZGVsIChlLmcuIENvZGV4KSBzbyB0aGUgcHJveHkgY2FuIFBPU1QgdG9cbiAqIGAvc2VydmluZy1lbmRwb2ludHMvcmVzcG9uc2VzYCB3aXRob3V0IHRoZSBjbGllbnQga25vd2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXRUb1Jlc3BvbnNlc1JlcXVlc3QoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB7XG4gIHJlc3BvbnNlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHN0cmVhbTogYm9vbGVhbjtcbn0ge1xuICBjb25zdCBtZXNzYWdlcyA9IEFycmF5LmlzQXJyYXkoYm9keS5tZXNzYWdlcykgPyBib2R5Lm1lc3NhZ2VzIDogW107XG4gIGNvbnN0IGlucHV0OiB1bmtub3duW10gPSBbXTtcbiAgbGV0IGluc3RydWN0aW9uczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgcmF3IG9mIG1lc3NhZ2VzKSB7XG4gICAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG4gICAgY29uc3QgbWVzc2FnZSA9IHJhdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCByb2xlID0gdHlwZW9mIG1lc3NhZ2Uucm9sZSA9PT0gXCJzdHJpbmdcIiA/IG1lc3NhZ2Uucm9sZSA6IFwidXNlclwiO1xuXG4gICAgLy8gTGVhZGluZyBzeXN0ZW0gLyBkZXZlbG9wZXIgbWVzc2FnZXMgYmVjb21lIHRvcC1sZXZlbCBgaW5zdHJ1Y3Rpb25zYC5cbiAgICBpZiAoXG4gICAgICAocm9sZSA9PT0gXCJzeXN0ZW1cIiB8fCByb2xlID09PSBcImRldmVsb3BlclwiKSAmJlxuICAgICAgaW5zdHJ1Y3Rpb25zID09PSB1bmRlZmluZWQgJiZcbiAgICAgIGlucHV0Lmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgY29uc3QgdGV4dCA9IGNoYXRDb250ZW50VG9UZXh0KG1lc3NhZ2UuY29udGVudCk7XG4gICAgICBpZiAodGV4dCkgaW5zdHJ1Y3Rpb25zID0gdGV4dDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChyb2xlID09PSBcInRvb2xcIikge1xuICAgICAgaW5wdXQucHVzaCh7XG4gICAgICAgIHR5cGU6IFwiZnVuY3Rpb25fY2FsbF9vdXRwdXRcIixcbiAgICAgICAgY2FsbF9pZDogU3RyaW5nKG1lc3NhZ2UudG9vbF9jYWxsX2lkID8/IFwiXCIpLFxuICAgICAgICBvdXRwdXQ6IGNoYXRDb250ZW50VG9UZXh0KG1lc3NhZ2UuY29udGVudCksXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHJvbGUgPT09IFwiYXNzaXN0YW50XCIgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkobWVzc2FnZS50b29sX2NhbGxzKSAmJlxuICAgICAgbWVzc2FnZS50b29sX2NhbGxzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGZvciAoY29uc3QgcmF3Q2FsbCBvZiBtZXNzYWdlLnRvb2xfY2FsbHMpIHtcbiAgICAgICAgaWYgKCFyYXdDYWxsIHx8IHR5cGVvZiByYXdDYWxsICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcbiAgICAgICAgaW5wdXQucHVzaCh0b0Z1bmN0aW9uQ2FsbEl0ZW0ocmF3Q2FsbCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpO1xuICAgICAgfVxuICAgICAgY29uc3QgdGV4dCA9IGNoYXRDb250ZW50VG9UZXh0KG1lc3NhZ2UuY29udGVudCk7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICBpbnB1dC5wdXNoKHsgdHlwZTogXCJtZXNzYWdlXCIsIHJvbGU6IFwiYXNzaXN0YW50XCIsIGNvbnRlbnQ6IHRleHQgfSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpbnB1dC5wdXNoKHtcbiAgICAgIHR5cGU6IFwibWVzc2FnZVwiLFxuICAgICAgcm9sZSxcbiAgICAgIGNvbnRlbnQ6IGNoYXRDb250ZW50VG9UZXh0KG1lc3NhZ2UuY29udGVudCksXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCByZXNwb25zZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIG1vZGVsOiBib2R5Lm1vZGVsLFxuICAgIGlucHV0LFxuICAgIHN0cmVhbTogYm9keS5zdHJlYW0gPT09IHRydWUsXG4gIH07XG4gIGlmIChpbnN0cnVjdGlvbnMpIHJlc3BvbnNlcy5pbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnM7XG5cbiAgLy8gQ2hhdCB0b29scyBhcmUgbmVzdGVkIChgZnVuY3Rpb246IHsgbmFtZSwg4oCmIH1gKTsgUmVzcG9uc2VzIHdhbnRzIHRoZW0gZmxhdC5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYm9keS50b29scykgJiYgYm9keS50b29scy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdG9vbHMgPSBib2R5LnRvb2xzXG4gICAgICAubWFwKHRvUmVzcG9uc2VzVG9vbClcbiAgICAgIC5maWx0ZXIoKHQpOiB0IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHQgIT09IHVuZGVmaW5lZCk7XG4gICAgaWYgKHRvb2xzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3BvbnNlcy50b29scyA9IHRvb2xzO1xuICAgICAgaWYgKGJvZHkudG9vbF9jaG9pY2UgIT09IHVuZGVmaW5lZCkgcmVzcG9uc2VzLnRvb2xfY2hvaWNlID0gYm9keS50b29sX2Nob2ljZTtcbiAgICB9XG4gIH1cblxuICAvLyBQcmVmZXIgUmVzcG9uc2VzJyBtYXhfb3V0cHV0X3Rva2VucyBuYW1pbmc7IGZhbGwgYmFjayBmcm9tIGNoYXQgbWF4X3Rva2Vucy5cbiAgaWYgKHR5cGVvZiBib2R5Lm1heF9vdXRwdXRfdG9rZW5zID09PSBcIm51bWJlclwiKSB7XG4gICAgcmVzcG9uc2VzLm1heF9vdXRwdXRfdG9rZW5zID0gYm9keS5tYXhfb3V0cHV0X3Rva2VucztcbiAgfSBlbHNlIGlmICh0eXBlb2YgYm9keS5tYXhfdG9rZW5zID09PSBcIm51bWJlclwiKSB7XG4gICAgcmVzcG9uc2VzLm1heF9vdXRwdXRfdG9rZW5zID0gYm9keS5tYXhfdG9rZW5zO1xuICB9XG5cbiAgcmV0dXJuIHsgcmVzcG9uc2VzLCBzdHJlYW06IGJvZHkuc3RyZWFtID09PSB0cnVlIH07XG59XG5cbi8qKiBMaWZ0IGEgbm9uLXN0cmVhbWluZyBjaGF0IGNvbXBsZXRpb24gSlNPTiBpbnRvIGEgUmVzcG9uc2VzIGByZXNwb25zZWAgb2JqZWN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXRUb1Jlc3BvbnNlKGNoYXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBtb2RlbDogc3RyaW5nKTogdW5rbm93biB7XG4gIGNvbnN0IGNob2ljZXMgPSBBcnJheS5pc0FycmF5KGNoYXQuY2hvaWNlcykgPyBjaGF0LmNob2ljZXMgOiBbXTtcbiAgY29uc3QgZmlyc3QgPSAoY2hvaWNlc1swXSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IG1lc3NhZ2UgPSAoZmlyc3QubWVzc2FnZSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IG91dHB1dDogdW5rbm93bltdID0gW107XG5cbiAgY29uc3QgdGV4dCA9IHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlLmNvbnRlbnQgOiBcIlwiO1xuICBpZiAodGV4dCkge1xuICAgIG91dHB1dC5wdXNoKHtcbiAgICAgIHR5cGU6IFwibWVzc2FnZVwiLFxuICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwib3V0cHV0X3RleHRcIiwgdGV4dCB9XSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFN1cmZhY2UgYW55IHRvb2wgY2FsbHMgYXMgUmVzcG9uc2VzIGBmdW5jdGlvbl9jYWxsYCBvdXRwdXQgaXRlbXMuXG4gIGNvbnN0IHRvb2xDYWxscyA9IEFycmF5LmlzQXJyYXkobWVzc2FnZS50b29sX2NhbGxzKSA/IG1lc3NhZ2UudG9vbF9jYWxscyA6IFtdO1xuICBmb3IgKGNvbnN0IHJhdyBvZiB0b29sQ2FsbHMpIHtcbiAgICBvdXRwdXQucHVzaCh0b0Z1bmN0aW9uQ2FsbEl0ZW0ocmF3IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSk7XG4gIH1cblxuICBjb25zdCB1c2FnZSA9IChjaGF0LnVzYWdlID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIHtcbiAgICBpZDogU3RyaW5nKGNoYXQuaWQgPz8gXCJyZXNwXCIpLFxuICAgIG9iamVjdDogXCJyZXNwb25zZVwiLFxuICAgIGNyZWF0ZWRfYXQ6IHR5cGVvZiBjaGF0LmNyZWF0ZWQgPT09IFwibnVtYmVyXCIgPyBjaGF0LmNyZWF0ZWQgOiAwLFxuICAgIG1vZGVsLFxuICAgIHN0YXR1czogXCJjb21wbGV0ZWRcIixcbiAgICBvdXRwdXQsXG4gICAgdXNhZ2U6IHtcbiAgICAgIGlucHV0X3Rva2VuczogTnVtYmVyKHVzYWdlLnByb21wdF90b2tlbnMgPz8gMCksXG4gICAgICBvdXRwdXRfdG9rZW5zOiBOdW1iZXIodXNhZ2UuY29tcGxldGlvbl90b2tlbnMgPz8gMCksXG4gICAgICB0b3RhbF90b2tlbnM6IE51bWJlcih1c2FnZS50b3RhbF90b2tlbnMgPz8gMCksXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBMaWZ0IGEgbmF0aXZlIFJlc3BvbnNlcyBgcmVzcG9uc2VgIG9iamVjdCBpbnRvIGEgY2hhdC1jb21wbGV0aW9ucyBib2R5LlxuICogSW52ZXJzZSBvZiB7QGxpbmsgY2hhdFRvUmVzcG9uc2V9OiB1c2VkIGFmdGVyIGEgUmVzcG9uc2VzLW9ubHkgdXBzdHJlYW0gY2FsbFxuICogd2hlbiB0aGUgY2xpZW50IHNwb2tlIENoYXQgQ29tcGxldGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNwb25zZVRvQ2hhdENvbXBsZXRpb24oXG4gIHJlc3BvbnNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgbW9kZWw6IHN0cmluZyxcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgeyB0ZXh0IH0gPSByZWFkUmVzcG9uc2VzT3V0cHV0KHJlc3BvbnNlKTtcbiAgY29uc3QgdG9vbENhbGxzOiB1bmtub3duW10gPSBbXTtcbiAgY29uc3Qgb3V0cHV0ID0gQXJyYXkuaXNBcnJheShyZXNwb25zZS5vdXRwdXQpID8gcmVzcG9uc2Uub3V0cHV0IDogW107XG4gIGZvciAoY29uc3QgcmF3IG9mIG91dHB1dCkge1xuICAgIGlmICghcmF3IHx8IHR5cGVvZiByYXcgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGl0ZW0gPSByYXcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGl0ZW0udHlwZSAhPT0gXCJmdW5jdGlvbl9jYWxsXCIpIGNvbnRpbnVlO1xuICAgIHRvb2xDYWxscy5wdXNoKHRvQ2hhdFRvb2xDYWxsKGl0ZW0pKTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHJvbGU6IFwiYXNzaXN0YW50XCIsXG4gICAgY29udGVudDogdGV4dCB8fCBudWxsLFxuICB9O1xuICBpZiAodG9vbENhbGxzLmxlbmd0aCA+IDApIG1lc3NhZ2UudG9vbF9jYWxscyA9IHRvb2xDYWxscztcblxuICBjb25zdCB1c2FnZSA9IChyZXNwb25zZS51c2FnZSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiB7XG4gICAgaWQ6IFN0cmluZyhyZXNwb25zZS5pZCA/PyBcImNoYXRjbXBsXCIpLFxuICAgIG9iamVjdDogXCJjaGF0LmNvbXBsZXRpb25cIixcbiAgICBjcmVhdGVkOiB0eXBlb2YgcmVzcG9uc2UuY3JlYXRlZF9hdCA9PT0gXCJudW1iZXJcIiA/IHJlc3BvbnNlLmNyZWF0ZWRfYXQgOiAwLFxuICAgIG1vZGVsLFxuICAgIGNob2ljZXM6IFtcbiAgICAgIHtcbiAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGZpbmlzaF9yZWFzb246IHRvb2xDYWxscy5sZW5ndGggPiAwID8gXCJ0b29sX2NhbGxzXCIgOiBcInN0b3BcIixcbiAgICAgIH0sXG4gICAgXSxcbiAgICB1c2FnZToge1xuICAgICAgcHJvbXB0X3Rva2VuczogTnVtYmVyKHVzYWdlLmlucHV0X3Rva2VucyA/PyAwKSxcbiAgICAgIGNvbXBsZXRpb25fdG9rZW5zOiBOdW1iZXIodXNhZ2Uub3V0cHV0X3Rva2VucyA/PyAwKSxcbiAgICAgIHRvdGFsX3Rva2VuczogTnVtYmVyKHVzYWdlLnRvdGFsX3Rva2VucyA/PyAwKSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEEgdG9vbCBjYWxsJ3MgYGFyZ3VtZW50c2AgSlNPTi4gQm90aCB3aXJlcyBjYXJyeSBpdCBhcyBhbiB1bnBhcnNlZCBzdHJpbmc7XG4gKiBhbnl0aGluZyBlbHNlIChhYnNlbnQsIGFuIGFscmVhZHktcGFyc2VkIG9iamVjdCkgYmVjb21lcyBhbiBlbXB0eSBsaXRlcmFsIHNvXG4gKiB0aGUgcmVjZWl2aW5nIHNpZGUgYWx3YXlzIGhhcyB2YWxpZCBKU09OIHRvIHBhcnNlLlxuICovXG5mdW5jdGlvbiBjYWxsQXJndW1lbnRzKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogXCJ7fVwiO1xufVxuXG4vKipcbiAqIFRoZSBSZXNwb25zZXMgYGZ1bmN0aW9uX2NhbGxgIGl0ZW0gZm9yIGEgdG9vbCBjYWxsIGluIGVpdGhlciBzcGVsbGluZzogYSBjaGF0XG4gKiBgdG9vbF9jYWxsc1tdYCBlbnRyeSAoYHtpZCwgZnVuY3Rpb246e25hbWUsIGFyZ3VtZW50c319YCkgb3IgYW4gaXRlbSB0aGF0IGlzXG4gKiBhbHJlYWR5IGZsYXQuXG4gKi9cbmZ1bmN0aW9uIHRvRnVuY3Rpb25DYWxsSXRlbShjYWxsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgZm4gPSAoY2FsbC5mdW5jdGlvbiA/PyBjYWxsKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcImZ1bmN0aW9uX2NhbGxcIixcbiAgICBjYWxsX2lkOiBTdHJpbmcoY2FsbC5jYWxsX2lkID8/IGNhbGwuaWQgPz8gXCJcIiksXG4gICAgbmFtZTogU3RyaW5nKGZuLm5hbWUgPz8gXCJcIiksXG4gICAgYXJndW1lbnRzOiBjYWxsQXJndW1lbnRzKGZuLmFyZ3VtZW50cyksXG4gIH07XG59XG5cbi8qKiBUaGUgY2hhdCBgdG9vbF9jYWxsc1tdYCBlbnRyeSBmb3IgYSBSZXNwb25zZXMgYGZ1bmN0aW9uX2NhbGxgIGl0ZW0uICovXG5mdW5jdGlvbiB0b0NoYXRUb29sQ2FsbChpdGVtOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IENoYXRUb29sQ2FsbCB7XG4gIHJldHVybiB7XG4gICAgaWQ6IFN0cmluZyhpdGVtLmNhbGxfaWQgPz8gaXRlbS5pZCA/PyBcIlwiKSxcbiAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgZnVuY3Rpb246IHtcbiAgICAgIG5hbWU6IFN0cmluZyhpdGVtLm5hbWUgPz8gXCJcIiksXG4gICAgICBhcmd1bWVudHM6IGNhbGxBcmd1bWVudHMoaXRlbS5hcmd1bWVudHMpLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogVGhlIGNoYXQtbmVzdGVkIHNwZWxsaW5nIChge3R5cGU6XCJmdW5jdGlvblwiLCBmdW5jdGlvbjp7bmFtZSwg4oCmfX1gKSBvZiBhIHRvb2xcbiAqIHNwZWMsIG9yIGB1bmRlZmluZWRgIGZvciBhIGJ1aWx0LWluIFJlc3BvbnNlcyB0b29sIChgd2ViX3NlYXJjaGAsXG4gKiBgbG9jYWxfc2hlbGxgLCDigKYpIHRoYXQgY2hhdCBjYW5ub3QgZXhwcmVzcyBhbmQgRGF0YWJyaWNrcyByZWplY3RzLlxuICovXG5mdW5jdGlvbiB0b0NoYXRUb29sKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdG9vbCA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAodG9vbC50eXBlICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0b29sLmZ1bmN0aW9uICYmIHR5cGVvZiB0b29sLmZ1bmN0aW9uID09PSBcIm9iamVjdFwiKSByZXR1cm4gdG9vbDsgLy8gYWxyZWFkeSBuZXN0ZWRcbiAgaWYgKHR5cGVvZiB0b29sLm5hbWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgIGZ1bmN0aW9uOiB7XG4gICAgICBuYW1lOiB0b29sLm5hbWUsXG4gICAgICAuLi4odG9vbC5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IHRvb2wuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgIC4uLih0b29sLnBhcmFtZXRlcnMgPyB7IHBhcmFtZXRlcnM6IHRvb2wucGFyYW1ldGVycyB9IDoge30pLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogVGhlIGZsYXQgUmVzcG9uc2VzIHNwZWxsaW5nIChge3R5cGU6XCJmdW5jdGlvblwiLCBuYW1lLCDigKZ9YCkgb2YgYSB0b29sIHNwZWMuXG4gKiBJbnZlcnNlIG9mIHtAbGluayB0b0NoYXRUb29sfTsgbm9uLWZ1bmN0aW9uIHRvb2xzIGFyZSBkcm9wcGVkIHRoZSBzYW1lIHdheS5cbiAqL1xuZnVuY3Rpb24gdG9SZXNwb25zZXNUb29sKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdG9vbCA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAodG9vbC50eXBlICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0b29sLmZ1bmN0aW9uICYmIHR5cGVvZiB0b29sLmZ1bmN0aW9uID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgZm4gPSB0b29sLmZ1bmN0aW9uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICBuYW1lOiBmbi5uYW1lLFxuICAgICAgLi4uKGZuLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogZm4uZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgIC4uLihmbi5wYXJhbWV0ZXJzID8geyBwYXJhbWV0ZXJzOiBmbi5wYXJhbWV0ZXJzIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4gdHlwZW9mIHRvb2wubmFtZSA9PT0gXCJzdHJpbmdcIiA/IHRvb2wgOiB1bmRlZmluZWQ7IC8vIGFscmVhZHkgZmxhdFxufVxuXG4vKiogT25lIFNlcnZlci1TZW50IEV2ZW50LCByZWFkeSB0byB3cml0ZSB0byB0aGUgY2xpZW50LiAqL1xuZnVuY3Rpb24gc3NlKGV2ZW50OiBzdHJpbmcsIGRhdGE6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gYGV2ZW50OiAke2V2ZW50fVxcbmRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9XFxuXFxuYDtcbn1cblxuLyoqXG4gKiBJbmNyZW1lbnRhbCBjaGF0LWNodW5rIC0+IFJlc3BvbnNlcy1TU0UgdHJhbnNsYXRvci4gYGZlZWRgIGFuZCBgZmluaXNoYCBib3RoXG4gKiByZXR1cm4gdGhlIFNTRSBieXRlcyB0byBmb3J3YXJkLCBvciBgXCJcImAgd2hlbiBhIGNodW5rIHByb2R1Y2VkIG5vIGV2ZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlc1N0cmVhbVRyYW5zbGF0b3Ige1xuICAvKiogVHJhbnNsYXRlIG9uZSB1cHN0cmVhbSBgY2hhdC5jb21wbGV0aW9uLmNodW5rYCBvYmplY3QuICovXG4gIGZlZWQoY2h1bms6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nO1xuICAvKiogQ2xvc2UgYW55IG9wZW4gaXRlbXMgYW5kIGVtaXQgYHJlc3BvbnNlLmNvbXBsZXRlZGAuIENhbGwgb25jZSwgYXQgZW5kIG9mIHN0cmVhbS4gKi9cbiAgZmluaXNoKCk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUcmFuc2xhdGUgYW4gdXBzdHJlYW0gY2hhdC1jb21wbGV0aW9ucyBTU0Ugc3RyZWFtIGludG8gdGhlIFJlc3BvbnNlcyBTU0VcbiAqIGV2ZW50IHN0cmVhbSBhIFJlc3BvbnNlcyBjbGllbnQgY29uc3VtZXMuXG4gKlxuICogVXBzdHJlYW0gY2h1bmtzIGFyZSBgY2hhdC5jb21wbGV0aW9uLmNodW5rYCBvYmplY3RzIHdob3NlIGBjaG9pY2VzWzBdLmRlbHRhYFxuICogY2FycmllcyBpbmNyZW1lbnRhbCBgY29udGVudGAgKGFzc2lzdGFudCB0ZXh0KSBhbmQvb3IgYHRvb2xfY2FsbHNgIChmdW5jdGlvblxuICogY2FsbHMsIHN0cmVhbWVkIGJ5IGBpbmRleGAgd2l0aCBwYXJ0aWFsIGBhcmd1bWVudHNgKS4gV2UgZW1pdCB0aGUgUmVzcG9uc2VzXG4gKiBsaWZlY3ljbGUgYXJvdW5kIHRoZW06XG4gKlxuICogICByZXNwb25zZS5jcmVhdGVkXG4gKiAgIC0+IHBlciB0ZXh0IHJ1bjogIG91dHB1dF9pdGVtLmFkZGVkIOKGkiBvdXRwdXRfdGV4dC5kZWx0YSog4oaSIG91dHB1dF9pdGVtLmRvbmVcbiAqICAgLT4gcGVyIHRvb2wgY2FsbDogb3V0cHV0X2l0ZW0uYWRkZWQg4oaSIGZ1bmN0aW9uX2NhbGxfYXJndW1lbnRzLmRlbHRhKlxuICogICAgICAgICAgICAgICAgICAgICAgIOKGkiBmdW5jdGlvbl9jYWxsX2FyZ3VtZW50cy5kb25lIOKGkiBvdXRwdXRfaXRlbS5kb25lXG4gKiAgIHJlc3BvbnNlLmNvbXBsZXRlZCAgICh3aXRoIHRoZSBhc3NlbWJsZWQgZmluYWwgYHJlc3BvbnNlYCBvYmplY3QpXG4gKlxuICogVGhlIHRyYW5zbGF0b3IgaXMgaW50ZW50aW9uYWxseSB0b2xlcmFudDogbWFsZm9ybWVkL2tlZXBhbGl2ZSBsaW5lcyB5aWVsZFxuICogbm90aGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlc1N0cmVhbVRyYW5zbGF0b3IoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIHJlc3BvbnNlSWQ6IHN0cmluZyxcbik6IFJlc3BvbnNlc1N0cmVhbVRyYW5zbGF0b3Ige1xuICBsZXQgc3RhcnRlZCA9IGZhbHNlO1xuICBsZXQgb3V0cHV0SW5kZXggPSAwO1xuXG4gIC8vIFRleHQgcnVuIHN0YXRlOiB3aGV0aGVyIGEgbWVzc2FnZSBpdGVtIGlzIGN1cnJlbnRseSBvcGVuLCBhbmQgaXRzIGJ1ZmZlci5cbiAgbGV0IHRleHRPcGVuID0gZmFsc2U7XG4gIGxldCB0ZXh0QnVmZmVyID0gXCJcIjtcbiAgbGV0IHRleHRJdGVtSWQgPSBcIlwiO1xuXG4gIC8vIFRvb2wtY2FsbCBzdGF0ZSwga2V5ZWQgYnkgdGhlIHVwc3RyZWFtIGB0b29sX2NhbGxzW10uaW5kZXhgLlxuICBpbnRlcmZhY2UgVG9vbFN0YXRlIHtcbiAgICBvdXRwdXRJbmRleDogbnVtYmVyO1xuICAgIGNhbGxJZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBhcmdzOiBzdHJpbmc7XG4gIH1cbiAgY29uc3QgdG9vbHMgPSBuZXcgTWFwPG51bWJlciwgVG9vbFN0YXRlPigpO1xuXG4gIGNvbnN0IGNyZWF0ZWQgPSAoKSA9PlxuICAgIHNzZShcInJlc3BvbnNlLmNyZWF0ZWRcIiwge1xuICAgICAgdHlwZTogXCJyZXNwb25zZS5jcmVhdGVkXCIsXG4gICAgICByZXNwb25zZTogeyBpZDogcmVzcG9uc2VJZCwgb2JqZWN0OiBcInJlc3BvbnNlXCIsIHN0YXR1czogXCJpbl9wcm9ncmVzc1wiLCBtb2RlbCwgb3V0cHV0OiBbXSB9LFxuICAgIH0pO1xuXG4gIGZ1bmN0aW9uIG9wZW5UZXh0KCk6IHN0cmluZyB7XG4gICAgdGV4dE9wZW4gPSB0cnVlO1xuICAgIHRleHRJdGVtSWQgPSBgJHtyZXNwb25zZUlkfS1tc2ctJHtvdXRwdXRJbmRleH1gO1xuICAgIGNvbnN0IGV2ID0gc3NlKFwicmVzcG9uc2Uub3V0cHV0X2l0ZW0uYWRkZWRcIiwge1xuICAgICAgdHlwZTogXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5hZGRlZFwiLFxuICAgICAgb3V0cHV0X2luZGV4OiBvdXRwdXRJbmRleCxcbiAgICAgIGl0ZW06IHsgaWQ6IHRleHRJdGVtSWQsIHR5cGU6IFwibWVzc2FnZVwiLCByb2xlOiBcImFzc2lzdGFudFwiLCBjb250ZW50OiBbXSB9LFxuICAgIH0pO1xuICAgIHJldHVybiBldjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlVGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dE9wZW4pIHJldHVybiBcIlwiO1xuICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICBpZDogdGV4dEl0ZW1JZCxcbiAgICAgIHR5cGU6IFwibWVzc2FnZVwiLFxuICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwib3V0cHV0X3RleHRcIiwgdGV4dDogdGV4dEJ1ZmZlciB9XSxcbiAgICB9O1xuICAgIGNvbnN0IGV2ID1cbiAgICAgIHNzZShcInJlc3BvbnNlLm91dHB1dF90ZXh0LmRvbmVcIiwge1xuICAgICAgICB0eXBlOiBcInJlc3BvbnNlLm91dHB1dF90ZXh0LmRvbmVcIixcbiAgICAgICAgaXRlbV9pZDogdGV4dEl0ZW1JZCxcbiAgICAgICAgb3V0cHV0X2luZGV4OiBvdXRwdXRJbmRleCxcbiAgICAgICAgY29udGVudF9pbmRleDogMCxcbiAgICAgICAgdGV4dDogdGV4dEJ1ZmZlcixcbiAgICAgIH0pICtcbiAgICAgIHNzZShcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIiwge1xuICAgICAgICB0eXBlOiBcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIixcbiAgICAgICAgb3V0cHV0X2luZGV4OiBvdXRwdXRJbmRleCxcbiAgICAgICAgaXRlbSxcbiAgICAgIH0pO1xuICAgIHRleHRPcGVuID0gZmFsc2U7XG4gICAgdGV4dEJ1ZmZlciA9IFwiXCI7XG4gICAgb3V0cHV0SW5kZXggKz0gMTtcbiAgICByZXR1cm4gZXY7XG4gIH1cblxuICBmdW5jdGlvbiBmZWVkKGNodW5rOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB7XG4gICAgbGV0IG91dCA9IFwiXCI7XG4gICAgaWYgKCFzdGFydGVkKSB7XG4gICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgIG91dCArPSBjcmVhdGVkKCk7XG4gICAgfVxuICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5pc0FycmF5KGNodW5rLmNob2ljZXMpID8gY2h1bmsuY2hvaWNlcyA6IFtdO1xuICAgIGNvbnN0IGNob2ljZSA9IChjaG9pY2VzWzBdID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBkZWx0YSA9IChjaG9pY2UuZGVsdGEgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgLy8gQXNzaXN0YW50IHRleHQgZGVsdGFzLlxuICAgIGlmICh0eXBlb2YgZGVsdGEuY29udGVudCA9PT0gXCJzdHJpbmdcIiAmJiBkZWx0YS5jb250ZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICghdGV4dE9wZW4pIG91dCArPSBvcGVuVGV4dCgpO1xuICAgICAgdGV4dEJ1ZmZlciArPSBkZWx0YS5jb250ZW50O1xuICAgICAgb3V0ICs9IHNzZShcInJlc3BvbnNlLm91dHB1dF90ZXh0LmRlbHRhXCIsIHtcbiAgICAgICAgdHlwZTogXCJyZXNwb25zZS5vdXRwdXRfdGV4dC5kZWx0YVwiLFxuICAgICAgICBpdGVtX2lkOiB0ZXh0SXRlbUlkLFxuICAgICAgICBvdXRwdXRfaW5kZXg6IG91dHB1dEluZGV4LFxuICAgICAgICBjb250ZW50X2luZGV4OiAwLFxuICAgICAgICBkZWx0YTogZGVsdGEuY29udGVudCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRvb2wtY2FsbCBkZWx0YXM6IGVhY2ggaXMga2V5ZWQgYnkgYGluZGV4YDsgYGFyZ3VtZW50c2AgYXJyaXZlcyBpbiBwaWVjZXMuXG4gICAgY29uc3QgdG9vbERlbHRhcyA9IEFycmF5LmlzQXJyYXkoZGVsdGEudG9vbF9jYWxscykgPyBkZWx0YS50b29sX2NhbGxzIDogW107XG4gICAgZm9yIChjb25zdCByYXdUYyBvZiB0b29sRGVsdGFzKSB7XG4gICAgICBjb25zdCB0YyA9IHJhd1RjIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29uc3QgaWR4ID0gTnVtYmVyKHRjLmluZGV4ID8/IDApO1xuICAgICAgY29uc3QgZm4gPSAodGMuZnVuY3Rpb24gPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgbGV0IHN0YXRlID0gdG9vbHMuZ2V0KGlkeCk7XG4gICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgIC8vIEZpcnN0IGZyYWdtZW50IGZvciB0aGlzIGNhbGw6IGEgdGV4dCBydW4gKGlmIG9wZW4pIG11c3QgY2xvc2UgZmlyc3Qgc29cbiAgICAgICAgLy8gb3V0cHV0IG9yZGVyaW5nIHN0YXlzIG1vbm90b25pYywgdGhlbiB3ZSBvcGVuIGEgZnVuY3Rpb25fY2FsbCBpdGVtLlxuICAgICAgICBvdXQgKz0gY2xvc2VUZXh0KCk7XG4gICAgICAgIHN0YXRlID0ge1xuICAgICAgICAgIG91dHB1dEluZGV4LFxuICAgICAgICAgIGNhbGxJZDogU3RyaW5nKHRjLmlkID8/IGAke3Jlc3BvbnNlSWR9LWNhbGwtJHtpZHh9YCksXG4gICAgICAgICAgbmFtZTogU3RyaW5nKGZuLm5hbWUgPz8gXCJcIiksXG4gICAgICAgICAgYXJnczogXCJcIixcbiAgICAgICAgfTtcbiAgICAgICAgdG9vbHMuc2V0KGlkeCwgc3RhdGUpO1xuICAgICAgICBvdXQgKz0gc3NlKFwicmVzcG9uc2Uub3V0cHV0X2l0ZW0uYWRkZWRcIiwge1xuICAgICAgICAgIHR5cGU6IFwicmVzcG9uc2Uub3V0cHV0X2l0ZW0uYWRkZWRcIixcbiAgICAgICAgICBvdXRwdXRfaW5kZXg6IHN0YXRlLm91dHB1dEluZGV4LFxuICAgICAgICAgIGl0ZW06IHtcbiAgICAgICAgICAgIGlkOiBzdGF0ZS5jYWxsSWQsXG4gICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uX2NhbGxcIixcbiAgICAgICAgICAgIGNhbGxfaWQ6IHN0YXRlLmNhbGxJZCxcbiAgICAgICAgICAgIG5hbWU6IHN0YXRlLm5hbWUsXG4gICAgICAgICAgICBhcmd1bWVudHM6IFwiXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIG91dHB1dEluZGV4ICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGZuLm5hbWUgPT09IFwic3RyaW5nXCIgJiYgZm4ubmFtZSAmJiAhc3RhdGUubmFtZSkgc3RhdGUubmFtZSA9IGZuLm5hbWU7XG4gICAgICBpZiAodHlwZW9mIGZuLmFyZ3VtZW50cyA9PT0gXCJzdHJpbmdcIiAmJiBmbi5hcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICBzdGF0ZS5hcmdzICs9IGZuLmFyZ3VtZW50cztcbiAgICAgICAgb3V0ICs9IHNzZShcInJlc3BvbnNlLmZ1bmN0aW9uX2NhbGxfYXJndW1lbnRzLmRlbHRhXCIsIHtcbiAgICAgICAgICB0eXBlOiBcInJlc3BvbnNlLmZ1bmN0aW9uX2NhbGxfYXJndW1lbnRzLmRlbHRhXCIsXG4gICAgICAgICAgaXRlbV9pZDogc3RhdGUuY2FsbElkLFxuICAgICAgICAgIG91dHB1dF9pbmRleDogc3RhdGUub3V0cHV0SW5kZXgsXG4gICAgICAgICAgZGVsdGE6IGZuLmFyZ3VtZW50cyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBmdW5jdGlvbiBmaW5pc2goKTogc3RyaW5nIHtcbiAgICBsZXQgb3V0ID0gY2xvc2VUZXh0KCk7XG4gICAgLy8gQ2xvc2UgYW55IG9wZW4gdG9vbCBjYWxscywgZW1pdHRpbmcgdGhlaXIgYXNzZW1ibGVkIGFyZ3VtZW50cy5cbiAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIHRvb2xzLnZhbHVlcygpKSB7XG4gICAgICBvdXQgKz0gc3NlKFwicmVzcG9uc2UuZnVuY3Rpb25fY2FsbF9hcmd1bWVudHMuZG9uZVwiLCB7XG4gICAgICAgIHR5cGU6IFwicmVzcG9uc2UuZnVuY3Rpb25fY2FsbF9hcmd1bWVudHMuZG9uZVwiLFxuICAgICAgICBpdGVtX2lkOiBzdGF0ZS5jYWxsSWQsXG4gICAgICAgIG91dHB1dF9pbmRleDogc3RhdGUub3V0cHV0SW5kZXgsXG4gICAgICAgIGFyZ3VtZW50czogc3RhdGUuYXJncyxcbiAgICAgIH0pO1xuICAgICAgb3V0ICs9IHNzZShcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIiwge1xuICAgICAgICB0eXBlOiBcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIixcbiAgICAgICAgb3V0cHV0X2luZGV4OiBzdGF0ZS5vdXRwdXRJbmRleCxcbiAgICAgICAgaXRlbToge1xuICAgICAgICAgIGlkOiBzdGF0ZS5jYWxsSWQsXG4gICAgICAgICAgdHlwZTogXCJmdW5jdGlvbl9jYWxsXCIsXG4gICAgICAgICAgY2FsbF9pZDogc3RhdGUuY2FsbElkLFxuICAgICAgICAgIG5hbWU6IHN0YXRlLm5hbWUsXG4gICAgICAgICAgYXJndW1lbnRzOiBzdGF0ZS5hcmdzLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIG91dCArPSBzc2UoXCJyZXNwb25zZS5jb21wbGV0ZWRcIiwge1xuICAgICAgdHlwZTogXCJyZXNwb25zZS5jb21wbGV0ZWRcIixcbiAgICAgIHJlc3BvbnNlOiB7IGlkOiByZXNwb25zZUlkLCBvYmplY3Q6IFwicmVzcG9uc2VcIiwgc3RhdHVzOiBcImNvbXBsZXRlZFwiLCBtb2RlbCB9LFxuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICByZXR1cm4geyBmZWVkLCBmaW5pc2ggfTtcbn1cblxuLyoqIEEgc291cmNlIHRoZSBtb2RlbCBjaXRlZCwgYXMgY2FycmllZCBieSBhIFJlc3BvbnNlcyBjb250ZW50LXBhcnQgYW5ub3RhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VzQ2l0YXRpb24ge1xuICB1cmw6IHN0cmluZztcbiAgdGl0bGU/OiBzdHJpbmc7XG59XG5cbi8qKiBXaGF0IHtAbGluayByZWFkUmVzcG9uc2VzT3V0cHV0fSBwdWxscyBvdXQgb2YgYSBgcmVzcG9uc2VgIG9iamVjdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VzT3V0cHV0IHtcbiAgLyoqIFRoZSBhc3Npc3RhbnQncyBhbnN3ZXIsIHdpdGggdGhlIG91dHB1dCBpdGVtcyBjb25jYXRlbmF0ZWQuICovXG4gIHRleHQ6IHN0cmluZztcbiAgLyoqIENpdGVkIHNvdXJjZXMgaW4gZmlyc3Qtc2VlbiBvcmRlciwgZGVkdXBsaWNhdGVkIGJ5IFVSTC4gKi9cbiAgY2l0YXRpb25zOiBSZXNwb25zZXNDaXRhdGlvbltdO1xufVxuXG4vKipcbiAqIFJlYWQgdGhlIGFuc3dlciB0ZXh0IGFuZCBjaXRlZCBzb3VyY2VzIG91dCBvZiBhIFJlc3BvbnNlcyBgcmVzcG9uc2VgIHBheWxvYWQuXG4gKlxuICogVGhpcyBpcyB0aGUgaW52ZXJzZSBvZiB7QGxpbmsgY2hhdFRvUmVzcG9uc2V9OiBpdCBjb25zdW1lcyB3aGF0IGFuIGVuZHBvaW50XG4gKiBzcGVha2luZyBSZXNwb25zZXMgbmF0aXZlbHkgcmV0dXJucywgcmF0aGVyIHRoYW4gcHJvZHVjaW5nIGl0LiBUaGUgRGF0YWJyaWNrc1xuICogbmF0aXZlIHdlYi1zZWFyY2ggdG9vbCBhbnN3ZXJzIHRoaXMgd2F5LCB3aXRoIGVhY2ggc291cmNlIGF0dGFjaGVkIGFzIGFcbiAqIGB1cmxfY2l0YXRpb25gIGFubm90YXRpb24gb24gdGhlIGNvbnRlbnQgcGFydCB0aGF0IHVzZWQgaXQuXG4gKlxuICogUHJlZmVycyB0aGUgZmxhdHRlbmVkIGBvdXRwdXRfdGV4dGAgd2hlbiB0aGUgcGF5bG9hZCBjYXJyaWVzIGl0LCBhbmQgZmFsbHNcbiAqIGJhY2sgdG8gd2Fsa2luZyBgb3V0cHV0W10uY29udGVudFtdLnRleHRgLiBFdmVyeSBmaWVsZCBpcyBvcHRpb25hbCB1cHN0cmVhbSxcbiAqIHNvIGEgcGF5bG9hZCBtaXNzaW5nIGFueSBvZiBpdCB5aWVsZHMgZW1wdHkgcmVzdWx0cyByYXRoZXIgdGhhbiB0aHJvd2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRSZXNwb25zZXNPdXRwdXQocGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZXNwb25zZXNPdXRwdXQge1xuICBjb25zdCBvdXRwdXQgPSBBcnJheS5pc0FycmF5KHBheWxvYWQub3V0cHV0KSA/IChwYXlsb2FkLm91dHB1dCBhcyB1bmtub3duW10pIDogW107XG4gIGNvbnN0IHRleHRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBjaXRhdGlvbnM6IFJlc3BvbnNlc0NpdGF0aW9uW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgcmF3SXRlbSBvZiBvdXRwdXQpIHtcbiAgICBpZiAoIXJhd0l0ZW0gfHwgdHlwZW9mIHJhd0l0ZW0gIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAocmF3SXRlbSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuY29udGVudDtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGVudCkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgcmF3UGFydCBvZiBjb250ZW50KSB7XG4gICAgICBpZiAoIXJhd1BhcnQgfHwgdHlwZW9mIHJhd1BhcnQgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcGFydCA9IHJhd1BhcnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCB0ZXh0ID0gc3RyaW5nLnRyaW1Ub0VtcHR5KHBhcnQudGV4dCk7XG4gICAgICBpZiAodGV4dCkgdGV4dHMucHVzaCh0ZXh0KTtcbiAgICAgIGNvbnN0IGFubm90YXRpb25zID0gQXJyYXkuaXNBcnJheShwYXJ0LmFubm90YXRpb25zKSA/IHBhcnQuYW5ub3RhdGlvbnMgOiBbXTtcbiAgICAgIGZvciAoY29uc3QgcmF3QW5uIG9mIGFubm90YXRpb25zKSB7XG4gICAgICAgIGlmICghcmF3QW5uIHx8IHR5cGVvZiByYXdBbm4gIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBhbm4gPSByYXdBbm4gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGNvbnN0IHVybCA9IHN0cmluZy50cmltVG9FbXB0eShhbm4udXJsKTtcbiAgICAgICAgaWYgKCF1cmwgfHwgc2Vlbi5oYXModXJsKSkgY29udGludWU7XG4gICAgICAgIHNlZW4uYWRkKHVybCk7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gc3RyaW5nLnRyaW1Ub0VtcHR5KGFubi50aXRsZSk7XG4gICAgICAgIGNpdGF0aW9ucy5wdXNoKHsgdXJsLCAuLi4odGl0bGUgPyB7IHRpdGxlIH0gOiB7fSkgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgdGV4dDogc3RyaW5nLnRyaW1Ub0VtcHR5KHBheWxvYWQub3V0cHV0X3RleHQpIHx8IHRleHRzLmpvaW4oXCJcXG5cIikudHJpbSgpLCBjaXRhdGlvbnMgfTtcbn1cblxuLyoqXG4gKiBTdHJpcCB0b29sIHR5cGVzIHRoZSB1cHN0cmVhbSBtb2RlbCBkb2Vzbid0IHN1cHBvcnQgZnJvbSBhIFJlc3BvbnNlcyByZXF1ZXN0XG4gKiBib2R5LCByZXR1cm5pbmcgYSBzaGFsbG93IGNvcHkgc2FmZSB0byBmb3J3YXJkICh0aGUgaW5wdXQgaXMgbm90IG11dGF0ZWQpLlxuICpcbiAqIENsaWVudHMgbGlrZSB0aGUgQ29kZXggQ0xJIGluY2x1ZGUgYnVpbHQtaW4gUmVzcG9uc2VzIHRvb2xzIChgd2ViX3NlYXJjaGAsXG4gKiBgbG9jYWxfc2hlbGxgLCBgY3VzdG9tYCwgLi4uKSBhbG9uZ3NpZGUgdGhlaXIgYGZ1bmN0aW9uYCB0b29scy4gRGF0YWJyaWNrcydcbiAqIE9wZW4gUmVzcG9uc2VzIHN1cmZhY2UgZm9yIEFudGhyb3BpYy9DbGF1ZGUgKGFuZCBvdGhlciBub24tT3BlbkFJIHByb3ZpZGVycylcbiAqIG9ubHkgYWNjZXB0cyBgZnVuY3Rpb25gIHRvb2xzIGFuZCBoYXJkLWVycm9ycyBvdGhlcndpc2U6XG4gKiAgIFwiQW50aHJvcGljIGRvZXMgbm90IHN1cHBvcnQgdG9vbCB0eXBlICd3ZWJfc2VhcmNoJy4gT25seSAnZnVuY3Rpb24nIGlzIHN1cHBvcnRlZC5cIlxuICogQ2FsbCB0aGlzIGJlZm9yZSBmb3J3YXJkaW5nIHRvIGAvc2VydmluZy1lbmRwb2ludHMvb3Blbi1yZXNwb25zZXNgLiBUaGUgT3BlbkFJXG4gKiBgL3NlcnZpbmctZW5kcG9pbnRzL3Jlc3BvbnNlc2AgcGF0aCBzaG91bGQga2VlcCBidWlsdC1pbnMgKEdQVCBzdXBwb3J0cyB0aGVtKS5cbiAqIElmIGZpbHRlcmluZyBlbXB0aWVzIHRoZSBsaXN0LCBgdG9vbHNgIC8gYHRvb2xfY2hvaWNlYCAvIGBwYXJhbGxlbF90b29sX2NhbGxzYFxuICogYXJlIGRyb3BwZWQgc28gd2UgbmV2ZXIgc2VuZCBhbiBlbXB0eSBgdG9vbHM6IFtdYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplUmVzcG9uc2VzVG9vbHMoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShib2R5LnRvb2xzKSB8fCBib2R5LnRvb2xzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGJvZHk7XG4gIGNvbnN0IGZuVG9vbHMgPSBib2R5LnRvb2xzLmZpbHRlcihcbiAgICAodCkgPT4gdCAmJiB0eXBlb2YgdCA9PT0gXCJvYmplY3RcIiAmJiAodCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikudHlwZSA9PT0gXCJmdW5jdGlvblwiLFxuICApO1xuICBpZiAoZm5Ub29scy5sZW5ndGggPT09IGJvZHkudG9vbHMubGVuZ3RoKSByZXR1cm4gYm9keTsgLy8gbm90aGluZyB0byBzdHJpcFxuICBjb25zdCBuZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4uYm9keSB9O1xuICBpZiAoZm5Ub29scy5sZW5ndGggPiAwKSB7XG4gICAgbmV4dC50b29scyA9IGZuVG9vbHM7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIG5leHQudG9vbHM7XG4gICAgZGVsZXRlIG5leHQudG9vbF9jaG9pY2U7XG4gICAgZGVsZXRlIG5leHQucGFyYWxsZWxfdG9vbF9jYWxscztcbiAgfVxuICByZXR1cm4gbmV4dDtcbn1cblxuLyoqXG4gKiBDb250ZW50LXBhcnQgLyBpbnB1dC1pdGVtIHR5cGVzIENsYXVkZSBleHRlbmRlZCB0aGlua2luZyB1c2VzIG9uIHRoZSB3aXJlLlxuICpcbiAqIFNoYXJlZCBzbyBib3RoIHdpcmUgc3VyZmFjZXMgc3RyaXAgdGhlIHNhbWUgc2V0OiB0aGUgUmVzcG9uc2VzIHBhdGggaGVyZVxuICogKHtAbGluayBzYW5pdGl6ZU9wZW5SZXNwb25zZXNJbnB1dH0pIGFuZCB0aGUgQ2hhdCBDb21wbGV0aW9ucyBwYXRoIGluXG4gKiBgQGRieC10b29scy9hcHBraXQtbWFzdHJhYCdzIHNlcnZpbmcgc2FuaXRpemUuIEFudGhyb3BpYyBzaWducyB0aGVzZSBibG9ja3MsXG4gKiBzbyBhIHJlcGxheSB0aGF0IG11dGF0ZXMgb25lIGlzIHJlamVjdGVkIG91dHJpZ2h0IC0gYm90aCBwYXRocyBtdXN0IGFncmVlIG9uXG4gKiB3aGF0IGNvdW50cyBhcyBhIHJlYXNvbmluZyBibG9jay5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFQVNPTklOR19UWVBFUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICBcInJlYXNvbmluZ1wiLFxuICBcInRoaW5raW5nXCIsXG4gIFwicmVkYWN0ZWRfdGhpbmtpbmdcIixcbl0pO1xuXG4vKipcbiAqIFJld3JpdGUgUmVzcG9uc2VzIGBpbnB1dGAgc28gT3BlbiBSZXNwb25zZXMgd2lsbCBhY2NlcHQgaXQuXG4gKlxuICogVHdvIE9wZW5BSSAvIENvZGV4IHNoYXBlcyB0aGF0IERhdGFicmlja3MgT3BlbiBSZXNwb25zZXMgKENsYXVkZSwgR2VtaW5pLCDigKYpXG4gKiByZWplY3Q6XG4gKlxuICogMS4gUHJpb3IgYXNzaXN0YW50IHR1cm5zIHdpdGggYG91dHB1dF90ZXh0YCAvIGBvdXRwdXRfKmAgY29udGVudCBwYXJ0cyDigJRcbiAqICAgIE9wZW4gUmVzcG9uc2VzIG9ubHkgYWxsb3dzIGBpbnB1dF90ZXh0YCwgYGlucHV0X2ltYWdlYCwgYGlucHV0X2ZpbGVgLFxuICogICAgYGlucHV0X2F1ZGlvYC4gTWFwIGV2ZXJ5IGBvdXRwdXRfPGtpbmQ+YCBwYXJ0IHRvIGBpbnB1dF88a2luZD5gLlxuICogMi4gUmVwbGF5ZWQgZXh0ZW5kZWQtdGhpbmtpbmcgYmxvY2tzIChgdGhpbmtpbmdgLCBgcmVkYWN0ZWRfdGhpbmtpbmdgLFxuICogICAgYHJlYXNvbmluZ2AgY29udGVudCBwYXJ0cywgYW5kIHRvcC1sZXZlbCBgcmVhc29uaW5nYCBpbnB1dCBpdGVtcykuIENsYXVkZVxuICogICAgc2lnbnMgdGhvc2U7IGFueSBjbGllbnQgcm91bmQtdHJpcCB0aGF0IG11dGF0ZXMgdGhlbSAob3IgYSBjcm9zcy1wcm92aWRlclxuICogICAgcmVwbGF5KSBmYWlscyB3aXRoIGUuZy5cbiAqICAgICAgXCJtZXNzYWdlcy5OLmNvbnRlbnQuTTogSW52YWxpZCBgZGF0YWAgaW4gYHJlZGFjdGVkX3RoaW5raW5nYCBibG9ja1wiXG4gKiAgICBTdHJpcCB0aGVtIOKAlCB0aGUgVUkvY2xpZW50IGFscmVhZHkgc2hvd2VkIHRoZSB0aGlua2luZzsgcmVwbGF5IGRvZXMgbm90XG4gKiAgICBuZWVkIHRoZSBzaWduZWQgYmxvYi4gU2FtZSBwb2xpY3kgYXMgYXBwa2l0LW1hc3RyYSdzIHNlcnZpbmcgc2FuaXRpemUuXG4gKlxuICogUmV0dXJucyBhIHNoYWxsb3cgY29weSB3aGVuIGFueXRoaW5nIGNoYW5nZXM7IG90aGVyd2lzZSB0aGUgaW5wdXQgYm9keS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplT3BlblJlc3BvbnNlc0lucHV0KGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYm9keS5pbnB1dCkgfHwgYm9keS5pbnB1dC5sZW5ndGggPT09IDApIHJldHVybiBib2R5O1xuXG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGNvbnN0IGlucHV0OiB1bmtub3duW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJhdyBvZiBib2R5LmlucHV0KSB7XG4gICAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgaW5wdXQucHVzaChyYXcpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGl0ZW0gPSByYXcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAvLyBUb3AtbGV2ZWwgUmVzcG9uc2VzIHJlYXNvbmluZyBpdGVtcyAobm90IG1lc3NhZ2UgY29udGVudCBwYXJ0cykuXG4gICAgaWYgKHR5cGVvZiBpdGVtLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgUkVBU09OSU5HX1RZUEVTLmhhcyhpdGVtLnR5cGUpKSB7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShpdGVtLmNvbnRlbnQpKSB7XG4gICAgICBpbnB1dC5wdXNoKHJhdyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBsZXQgcGFydENoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCBjb250ZW50OiB1bmtub3duW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgaXRlbS5jb250ZW50KSB7XG4gICAgICBpZiAoIXBhcnQgfHwgdHlwZW9mIHBhcnQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgY29udGVudC5wdXNoKHBhcnQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHAgPSBwYXJ0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgaWYgKHR5cGVvZiBwLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgUkVBU09OSU5HX1RZUEVTLmhhcyhwLnR5cGUpKSB7XG4gICAgICAgIHBhcnRDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHAudHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBwLnR5cGUuc3RhcnRzV2l0aChcIm91dHB1dF9cIikpIHtcbiAgICAgICAgcGFydENoYW5nZWQgPSB0cnVlO1xuICAgICAgICBjb250ZW50LnB1c2goeyAuLi5wLCB0eXBlOiBgaW5wdXRfJHtwLnR5cGUuc2xpY2UoXCJvdXRwdXRfXCIubGVuZ3RoKX1gIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQucHVzaChwYXJ0KTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcnRDaGFuZ2VkKSB7XG4gICAgICBpbnB1dC5wdXNoKHJhdyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY2hhbmdlZCA9IHRydWU7XG4gICAgLy8gRHJvcCBhc3Npc3RhbnQgdHVybnMgdGhhdCBvbmx5IGNhcnJpZWQgdGhpbmtpbmcgKG5vdGhpbmcgbGVmdCB0byByZXBsYXkpLlxuICAgIGlmIChjb250ZW50Lmxlbmd0aCA9PT0gMCAmJiBpdGVtLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIGNvbnRpbnVlO1xuICAgIGlucHV0LnB1c2goeyAuLi5pdGVtLCBjb250ZW50IH0pO1xuICB9XG5cbiAgcmV0dXJuIGNoYW5nZWQgPyB7IC4uLmJvZHksIGlucHV0IH0gOiBib2R5O1xufVxuXG4vKipcbiAqIEZ1bGwgT3BlbiBSZXNwb25zZXMgcmVxdWVzdCBzYW5pdGl6ZXI6IHN0cmlwIG5vbi1gZnVuY3Rpb25gIHRvb2xzLCByZXdyaXRlXG4gKiBgb3V0cHV0XypgIGNvbnRlbnQgcGFydHMsIGFuZCBkcm9wIHRoaW5raW5nIC8gcmVhc29uaW5nIGJsb2Nrcy4gU2FmZSBuby1vcFxuICogd2hlbiBub3RoaW5nIG5lZWRzIGNoYW5naW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVPcGVuUmVzcG9uc2VzUmVxdWVzdChcbiAgYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiBzYW5pdGl6ZU9wZW5SZXNwb25zZXNJbnB1dChzYW5pdGl6ZVJlc3BvbnNlc1Rvb2xzKGJvZHkpKTtcbn1cbiJdfQ==
750
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLXJlc3BvbnNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYWktcmVzcG9uc2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Q0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFaEQsT0FBTyxFQUF1QyxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTFGOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLElBQTZCO0lBSTNELE1BQU0sUUFBUSxHQUFrQixFQUFFLENBQUM7SUFFbkMscURBQXFEO0lBQ3JELElBQUksT0FBTyxJQUFJLENBQUMsWUFBWSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUMxRSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELG1FQUFtRTtJQUNuRSw0REFBNEQ7SUFDNUQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUMxRCxLQUFLLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtZQUFFLFNBQVM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsR0FBOEIsQ0FBQztRQUM1QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRXZCLElBQUksSUFBSSxLQUFLLGVBQWUsRUFBRSxDQUFDO1lB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RSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDWixPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLENBQUM7SUFDRCw0RUFBNEU7SUFDNUUsNEVBQTRFO0lBQzVFLG1EQUFtRDtJQUNuRCxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ2hELE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUM1QixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxzQkFBc0IsQ0FBQyxLQUFjO0lBQzVDLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3RELE1BQU0sSUFBSSxHQUFHLEtBQWdDLENBQUM7SUFDOUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFdBQVc7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM1QyxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO0FBQzVELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSw0QkFBNEIsQ0FDMUMsSUFBNkI7SUFFN0IsT0FBTyw0QkFBNEIsQ0FBQywwQkFBMEIsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3BlbkFJIFJlc3BvbnNlcyBBUEkgPC0+IENoYXQgQ29tcGxldGlvbnMgdHJhbnNsYXRpb24uXG4gKlxuICogU29tZSBjbGllbnRzIHNwZWFrIG9ubHkgdGhlIFJlc3BvbnNlcyBBUEkgKGBQT1NUIC92MS9yZXNwb25zZXNgKSAtIHRoZSBDb2RleFxuICogQ0xJIGlzIHRoZSBtb3RpdmF0aW5nIG9uZS4gRGF0YWJyaWNrcyBub3cgYWxzbyBleHBvc2VzIG5hdGl2ZSBSZXNwb25zZXNcbiAqIHN1cmZhY2VzIChgL3NlcnZpbmctZW5kcG9pbnRzL3Jlc3BvbnNlc2AgYW5kIGAvc2VydmluZy1lbmRwb2ludHMvb3Blbi1yZXNwb25zZXNgKSxcbiAqIHdoaWxlIG1vc3QgZW5kcG9pbnRzIHN0aWxsIHNwZWFrIENoYXQgQ29tcGxldGlvbnMgYXQgYC9pbnZvY2F0aW9uc2AuIFRoaXNcbiAqIG1vZHVsZSBicmlkZ2VzIHRoZSB0d28sIGluIGJvdGggZGlyZWN0aW9uczpcbiAqXG4gKiAgIC0ge0BsaW5rIHJlc3BvbnNlc1RvQ2hhdH0gbG93ZXJzIGEgUmVzcG9uc2VzIHJlcXVlc3QgYm9keSB0byBhIGNoYXRcbiAqICAgICBjb21wbGV0aW9ucyBib2R5IChpbnN0cnVjdGlvbnMgLT4gc3lzdGVtIG1lc3NhZ2UsIHR5cGVkIGBpbnB1dGAgaXRlbXMgLT5cbiAqICAgICBgbWVzc2FnZXNgLCBgdG9vbHNgL2B0b29sX2Nob2ljZWAgY2FycmllZCB0aHJvdWdoLCBmdW5jdGlvbi1jYWxsIG91dHB1dHNcbiAqICAgICBmb2xkZWQgYmFjayBpbnRvIHRoZSB0cmFuc2NyaXB0KS5cbiAqICAgLSB7QGxpbmsgY2hhdFRvUmVzcG9uc2VzUmVxdWVzdH0gcmFpc2VzIGEgY2hhdC1jb21wbGV0aW9ucyByZXF1ZXN0IGludG8gYVxuICogICAgIFJlc3BvbnNlcyByZXF1ZXN0ICh0aGUgaW52ZXJzZSBvZiB7QGxpbmsgcmVzcG9uc2VzVG9DaGF0fSksIGZvciByb3V0aW5nIGFcbiAqICAgICBjaGF0IGNsaWVudCBhdCBhIFJlc3BvbnNlcy1vbmx5IG1vZGVsIGxpa2UgQ29kZXguXG4gKiAgIC0ge0BsaW5rIGNoYXRUb1Jlc3BvbnNlfSBsaWZ0cyBhIG5vbi1zdHJlYW1pbmcgY2hhdCBjb21wbGV0aW9uIGJhY2sgaW50byBhXG4gKiAgICAgUmVzcG9uc2VzIGByZXNwb25zZWAgb2JqZWN0LlxuICogICAtIHtAbGluayByZXNwb25zZVRvQ2hhdENvbXBsZXRpb259IGxpZnRzIGEgbmF0aXZlIFJlc3BvbnNlcyBgcmVzcG9uc2VgXG4gKiAgICAgYmFjayBpbnRvIGEgY2hhdC1jb21wbGV0aW9ucyBib2R5ICh0aGUgaW52ZXJzZSBvZiB7QGxpbmsgY2hhdFRvUmVzcG9uc2V9KS5cbiAqICAgLSB7QGxpbmsgY3JlYXRlUmVzcG9uc2VzU3RyZWFtVHJhbnNsYXRvcn0gbGlmdHMgYSBzdHJlYW1pbmcgY2hhdCBjb21wbGV0aW9uXG4gKiAgICAgKGFuIE9wZW5BSSBTU0UgYGNoYXQuY29tcGxldGlvbi5jaHVua2Agc3RyZWFtKSBpbnRvIHRoZSBSZXNwb25zZXMgU1NFXG4gKiAgICAgZXZlbnQgc3RyZWFtIHRob3NlIGNsaWVudHMgY29uc3VtZSAoYHJlc3BvbnNlLmNyZWF0ZWRgLFxuICogICAgIGByZXNwb25zZS5vdXRwdXRfdGV4dC5kZWx0YWAsIGZ1bmN0aW9uLWNhbGwgYXJndW1lbnQgZGVsdGFzLFxuICogICAgIGByZXNwb25zZS5jb21wbGV0ZWRgKS5cbiAqICAgLSB7QGxpbmsgcmVhZFJlc3BvbnNlc091dHB1dH0gcmVhZHMgdGhlIG90aGVyIGRpcmVjdGlvbjogcHVsbCB0aGUgYW5zd2VyXG4gKiAgICAgdGV4dCBhbmQgY2l0YXRpb25zIG91dCBvZiBhIGByZXNwb25zZWAgb2JqZWN0IHJldHVybmVkIGJ5IGFuIGVuZHBvaW50XG4gKiAgICAgdGhhdCBzcGVha3MgUmVzcG9uc2VzIG5hdGl2ZWx5ICh0aGUgRGF0YWJyaWNrcyBuYXRpdmUgd2ViLXNlYXJjaCB0b29sKS5cbiAqICAgLSB7QGxpbmsgc2FuaXRpemVSZXNwb25zZXNUb29sc30ga2VlcHMgb25seSBgZnVuY3Rpb25gIHRvb2xzIG9uIGEgUmVzcG9uc2VzXG4gKiAgICAgcmVxdWVzdCBib2R5IChmb3IgYC9vcGVuLXJlc3BvbnNlc2AgLyBBbnRocm9waWMsIHdoaWNoIHJlamVjdCBDb2RleFxuICogICAgIGJ1aWx0LWlucyBsaWtlIGB3ZWJfc2VhcmNoYCkuXG4gKiAgIC0ge0BsaW5rIHNhbml0aXplT3BlblJlc3BvbnNlc0lucHV0fSByZXdyaXRlcyBgb3V0cHV0XypgIGNvbnRlbnQgcGFydCB0eXBlc1xuICogICAgIGluIGBpbnB1dGAgdG8gYGlucHV0XypgLCBhbmQgZHJvcHMgQ2xhdWRlIHRoaW5raW5nIC8gcmVhc29uaW5nIGJsb2Nrc1xuICogICAgIHRoYXQgT3BlbiBSZXNwb25zZXMgcmVqZWN0cyBvbiByZXBsYXkgKGByZWRhY3RlZF90aGlua2luZ2AsIOKApikuXG4gKiAgIC0ge0BsaW5rIHJlcGFpclRyYWlsaW5nQXNzaXN0YW50SW5wdXR9IGRyb3BzIGEgdHJhaWxpbmcgYXNzaXN0YW50IHR1cm4gdGhhdFxuICogICAgIEFudGhyb3BpYyByZWFkcyBhcyBhIHByZWZpbGwgcmVxdWVzdCwgdGhlIFJlc3BvbnNlcy1zaWRlIGNvdW50ZXJwYXJ0IHRvXG4gKiAgICAgYEBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYWAncyBgcmVwYWlyQXNzaXN0YW50UHJlZmlsbGAuXG4gKlxuICogT25seSB0aGUgc3VyZmFjZSByZWFsIGNsaWVudHMgZXhlcmNpc2UgaXMgdHJhbnNsYXRlZDsgdW5rbm93biBmaWVsZHMgYXJlXG4gKiBpZ25vcmVkIHJhdGhlciB0aGFuIHJlamVjdGVkLCBzbyBhIG5ld2VyIGNsaWVudCBkZWdyYWRlcyBpbnN0ZWFkIG9mIGJyZWFraW5nLlxuICpcbiAqIEJyb3dzZXItc2FmZTogcHVyZSBmdW5jdGlvbnMgb3ZlciBwbGFpbiBKU09OLCBubyB0cmFuc3BvcnQgYW5kIG5vIE5vZGVcbiAqIGJ1aWx0LWlucywgc28gdGhlIHNhbWUgdHJhbnNsYXRpb24gcnVucyBpbiBhIHByb3h5LCBhIHNlcnZlciByb3V0ZSwgb3IgYSB0ZXN0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG5pbXBvcnQgeyB0eXBlIENoYXRNZXNzYWdlLCB0eXBlIENoYXRUb29sQ2FsbCwgY2hhdENvbnRlbnRUb1RleHQgfSBmcm9tIFwiLi9vcGVuYWktY2hhdC50c1wiO1xuXG4vKipcbiAqIExvd2VyIGEgUmVzcG9uc2VzIHJlcXVlc3QgYm9keSB0byBhIGNoYXQtY29tcGxldGlvbnMgYm9keS4gUmV0dXJucyB0aGUgY2hhdFxuICogYm9keSBwbHVzIHdoZXRoZXIgdGhlIGNhbGxlciBhc2tlZCBmb3Igc3RyZWFtaW5nICh0aGUgc2VydmVyIG5lZWRzIGl0IHRvIHBpY2tcbiAqIHRoZSB1cHN0cmVhbSBgYWNjZXB0YCBoZWFkZXIgYW5kIHRoZSB0cmFuc2xhdGlvbiBwYXRoKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3BvbnNlc1RvQ2hhdChib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHtcbiAgY2hhdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHN0cmVhbTogYm9vbGVhbjtcbn0ge1xuICBjb25zdCBtZXNzYWdlczogQ2hhdE1lc3NhZ2VbXSA9IFtdO1xuXG4gIC8vIGBpbnN0cnVjdGlvbnNgIGJlY29tZXMgdGhlIGxlYWRpbmcgc3lzdGVtIG1lc3NhZ2UuXG4gIGlmICh0eXBlb2YgYm9keS5pbnN0cnVjdGlvbnMgPT09IFwic3RyaW5nXCIgJiYgYm9keS5pbnN0cnVjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgIG1lc3NhZ2VzLnB1c2goeyByb2xlOiBcInN5c3RlbVwiLCBjb250ZW50OiBib2R5Lmluc3RydWN0aW9ucyB9KTtcbiAgfVxuXG4gIC8vIGBpbnB1dGAgaXMgYW4gYXJyYXkgb2YgdHlwZWQgaXRlbXM6IG1lc3NhZ2VzLCBmdW5jdGlvbl9jYWxsLCBhbmRcbiAgLy8gZnVuY3Rpb25fY2FsbF9vdXRwdXQuIEZvbGQgZWFjaCBpbnRvIHRoZSBjaGF0IHRyYW5zY3JpcHQuXG4gIGNvbnN0IGlucHV0ID0gQXJyYXkuaXNBcnJheShib2R5LmlucHV0KSA/IGJvZHkuaW5wdXQgOiBbXTtcbiAgZm9yIChjb25zdCByYXcgb2YgaW5wdXQpIHtcbiAgICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcbiAgICBjb25zdCBpdGVtID0gcmF3IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHR5cGUgPSBpdGVtLnR5cGU7XG5cbiAgICBpZiAodHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsXCIpIHtcbiAgICAgIC8vIEEgcHJpb3IgdG9vbCBjYWxsIHRoZSBtb2RlbCBtYWRlOyByZS1hdHRhY2ggaXQgdG8gYW4gYXNzaXN0YW50IHR1cm4uXG4gICAgICBtZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgY29udGVudDogbnVsbCxcbiAgICAgICAgdG9vbF9jYWxsczogW3RvQ2hhdFRvb2xDYWxsKGl0ZW0pXSxcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbF9vdXRwdXRcIikge1xuICAgICAgLy8gVGhlIHRvb2wncyByZXN1bHQsIGtleWVkIGJhY2sgdG8gdGhlIGNhbGwgaXQgYW5zd2Vycy5cbiAgICAgIG1lc3NhZ2VzLnB1c2goe1xuICAgICAgICByb2xlOiBcInRvb2xcIixcbiAgICAgICAgdG9vbF9jYWxsX2lkOiBTdHJpbmcoaXRlbS5jYWxsX2lkID8/IGl0ZW0uaWQgPz8gXCJcIiksXG4gICAgICAgIGNvbnRlbnQ6IHR5cGVvZiBpdGVtLm91dHB1dCA9PT0gXCJzdHJpbmdcIiA/IGl0ZW0ub3V0cHV0IDogY2hhdENvbnRlbnRUb1RleHQoaXRlbS5vdXRwdXQpLFxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0OiBhIG1lc3NhZ2UgaXRlbSB3aXRoIGEgcm9sZSBhbmQgdHlwZWQgY29udGVudC5cbiAgICBjb25zdCByb2xlID0gdHlwZW9mIGl0ZW0ucm9sZSA9PT0gXCJzdHJpbmdcIiA/IGl0ZW0ucm9sZSA6IFwidXNlclwiO1xuICAgIC8vIENoYXQgaGFzIG5vIFwiZGV2ZWxvcGVyXCIgcm9sZTsgdHJlYXQgaXQgYXMgc3lzdGVtIChpdHMgaW50ZW50IGhlcmUpLlxuICAgIGNvbnN0IGNoYXRSb2xlID0gcm9sZSA9PT0gXCJkZXZlbG9wZXJcIiA/IFwic3lzdGVtXCIgOiByb2xlO1xuICAgIG1lc3NhZ2VzLnB1c2goeyByb2xlOiBjaGF0Um9sZSwgY29udGVudDogY2hhdENvbnRlbnRUb1RleHQoaXRlbS5jb250ZW50KSB9KTtcbiAgfVxuXG4gIGNvbnN0IGNoYXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIG1vZGVsOiBib2R5Lm1vZGVsLFxuICAgIG1lc3NhZ2VzLFxuICAgIHN0cmVhbTogYm9keS5zdHJlYW0gPT09IHRydWUsXG4gIH07XG5cbiAgLy8gQ2FycnkgdGhyb3VnaCBmdW5jdGlvbi1jYWxsaW5nIGNvbmZpZyB3aGVuIHByZXNlbnQuIFJlc3BvbnNlcyBmdW5jdGlvblxuICAvLyB0b29scyBhcmUgRkxBVCAoYHt0eXBlOlwiZnVuY3Rpb25cIiwgbmFtZSwgZGVzY3JpcHRpb24sIHBhcmFtZXRlcnN9YCk7IGNoYXRcbiAgLy8gd2FudHMgdGhlbSBORVNURUQgKGB7dHlwZTpcImZ1bmN0aW9uXCIsIGZ1bmN0aW9uOntuYW1lLCDigKZ9fWApLiBDbGllbnRzIGFsc29cbiAgLy8gc2VuZCBidWlsdC1pbiB0b29sIHR5cGVzIChsb2NhbF9zaGVsbCwgd2ViX3NlYXJjaCwg4oCmKSB0aGF0IERhdGFicmlja3MgY2hhdFxuICAvLyByZWplY3RzIChcIk1pc3NpbmcgJ2Z1bmN0aW9uJyBpbiB0aGUgdG9vbCBzcGVjaWZpY2F0aW9uXCIpLCBzbyB3ZSB0cmFuc2xhdGVcbiAgLy8gb25seSBmdW5jdGlvbiB0b29scyBhbmQgZHJvcCB0aGUgcmVzdC5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYm9keS50b29scykgJiYgYm9keS50b29scy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgY2hhdFRvb2xzID0gYm9keS50b29sc1xuICAgICAgLm1hcCh0b0NoYXRUb29sKVxuICAgICAgLmZpbHRlcigodCk6IHQgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4gdCAhPT0gdW5kZWZpbmVkKTtcbiAgICBpZiAoY2hhdFRvb2xzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNoYXQudG9vbHMgPSBjaGF0VG9vbHM7XG4gICAgICBpZiAoYm9keS50b29sX2Nob2ljZSAhPT0gdW5kZWZpbmVkKSBjaGF0LnRvb2xfY2hvaWNlID0gYm9keS50b29sX2Nob2ljZTtcbiAgICAgIC8vIE5PVEU6IGRvIE5PVCBmb3J3YXJkIGBwYXJhbGxlbF90b29sX2NhbGxzYC4gQ2xpZW50cyBzZW5kIGl0LCBidXRcbiAgICAgIC8vIERhdGFicmlja3MgTW9kZWwgU2VydmluZydzIGNoYXQgQVBJIHJlamVjdHMgdW5rbm93biBmaWVsZHNcbiAgICAgIC8vIChcInBhcmFsbGVsX3Rvb2xfY2FsbHM6IEV4dHJhIGlucHV0cyBhcmUgbm90IHBlcm1pdHRlZFwiKSwgd2hpY2ggd291bGRcbiAgICAgIC8vIGZhaWwgdGhlIHdob2xlIHR1cm4uIERyb3AgaXQuXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgY2hhdCwgc3RyZWFtOiBib2R5LnN0cmVhbSA9PT0gdHJ1ZSB9O1xufVxuXG4vKipcbiAqIFJhaXNlIGEgY2hhdC1jb21wbGV0aW9ucyByZXF1ZXN0IGludG8gYSBSZXNwb25zZXMgcmVxdWVzdCBib2R5LiBJbnZlcnNlIG9mXG4gKiB7QGxpbmsgcmVzcG9uc2VzVG9DaGF0fTogdXNlZCB3aGVuIGEgY2hhdCBjbGllbnQgaGl0cyBhIFJlc3BvbnNlcy1vbmx5XG4gKiBEYXRhYnJpY2tzIG1vZGVsIChlLmcuIENvZGV4KSBzbyB0aGUgcHJveHkgY2FuIFBPU1QgdG9cbiAqIGAvc2VydmluZy1lbmRwb2ludHMvcmVzcG9uc2VzYCB3aXRob3V0IHRoZSBjbGllbnQga25vd2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXRUb1Jlc3BvbnNlc1JlcXVlc3QoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB7XG4gIHJlc3BvbnNlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHN0cmVhbTogYm9vbGVhbjtcbn0ge1xuICBjb25zdCBtZXNzYWdlcyA9IEFycmF5LmlzQXJyYXkoYm9keS5tZXNzYWdlcykgPyBib2R5Lm1lc3NhZ2VzIDogW107XG4gIGNvbnN0IGlucHV0OiB1bmtub3duW10gPSBbXTtcbiAgbGV0IGluc3RydWN0aW9uczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgcmF3IG9mIG1lc3NhZ2VzKSB7XG4gICAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG4gICAgY29uc3QgbWVzc2FnZSA9IHJhdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCByb2xlID0gdHlwZW9mIG1lc3NhZ2Uucm9sZSA9PT0gXCJzdHJpbmdcIiA/IG1lc3NhZ2Uucm9sZSA6IFwidXNlclwiO1xuXG4gICAgLy8gTGVhZGluZyBzeXN0ZW0gLyBkZXZlbG9wZXIgbWVzc2FnZXMgYmVjb21lIHRvcC1sZXZlbCBgaW5zdHJ1Y3Rpb25zYC5cbiAgICBpZiAoXG4gICAgICAocm9sZSA9PT0gXCJzeXN0ZW1cIiB8fCByb2xlID09PSBcImRldmVsb3BlclwiKSAmJlxuICAgICAgaW5zdHJ1Y3Rpb25zID09PSB1bmRlZmluZWQgJiZcbiAgICAgIGlucHV0Lmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgY29uc3QgdGV4dCA9IGNoYXRDb250ZW50VG9UZXh0KG1lc3NhZ2UuY29udGVudCk7XG4gICAgICBpZiAodGV4dCkgaW5zdHJ1Y3Rpb25zID0gdGV4dDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChyb2xlID09PSBcInRvb2xcIikge1xuICAgICAgaW5wdXQucHVzaCh7XG4gICAgICAgIHR5cGU6IFwiZnVuY3Rpb25fY2FsbF9vdXRwdXRcIixcbiAgICAgICAgY2FsbF9pZDogU3RyaW5nKG1lc3NhZ2UudG9vbF9jYWxsX2lkID8/IFwiXCIpLFxuICAgICAgICBvdXRwdXQ6IGNoYXRDb250ZW50VG9UZXh0KG1lc3NhZ2UuY29udGVudCksXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHJvbGUgPT09IFwiYXNzaXN0YW50XCIgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkobWVzc2FnZS50b29sX2NhbGxzKSAmJlxuICAgICAgbWVzc2FnZS50b29sX2NhbGxzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGZvciAoY29uc3QgcmF3Q2FsbCBvZiBtZXNzYWdlLnRvb2xfY2FsbHMpIHtcbiAgICAgICAgaWYgKCFyYXdDYWxsIHx8IHR5cGVvZiByYXdDYWxsICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcbiAgICAgICAgaW5wdXQucHVzaCh0b0Z1bmN0aW9uQ2FsbEl0ZW0ocmF3Q2FsbCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpO1xuICAgICAgfVxuICAgICAgY29uc3QgdGV4dCA9IGNoYXRDb250ZW50VG9UZXh0KG1lc3NhZ2UuY29udGVudCk7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICBpbnB1dC5wdXNoKHsgdHlwZTogXCJtZXNzYWdlXCIsIHJvbGU6IFwiYXNzaXN0YW50XCIsIGNvbnRlbnQ6IHRleHQgfSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpbnB1dC5wdXNoKHtcbiAgICAgIHR5cGU6IFwibWVzc2FnZVwiLFxuICAgICAgcm9sZSxcbiAgICAgIGNvbnRlbnQ6IGNoYXRDb250ZW50VG9UZXh0KG1lc3NhZ2UuY29udGVudCksXG4gICAgfSk7XG4gIH1cblxuICBjb25zdCByZXNwb25zZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIG1vZGVsOiBib2R5Lm1vZGVsLFxuICAgIGlucHV0LFxuICAgIHN0cmVhbTogYm9keS5zdHJlYW0gPT09IHRydWUsXG4gIH07XG4gIGlmIChpbnN0cnVjdGlvbnMpIHJlc3BvbnNlcy5pbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnM7XG5cbiAgLy8gQ2hhdCB0b29scyBhcmUgbmVzdGVkIChgZnVuY3Rpb246IHsgbmFtZSwg4oCmIH1gKTsgUmVzcG9uc2VzIHdhbnRzIHRoZW0gZmxhdC5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYm9keS50b29scykgJiYgYm9keS50b29scy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdG9vbHMgPSBib2R5LnRvb2xzXG4gICAgICAubWFwKHRvUmVzcG9uc2VzVG9vbClcbiAgICAgIC5maWx0ZXIoKHQpOiB0IGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+IHQgIT09IHVuZGVmaW5lZCk7XG4gICAgaWYgKHRvb2xzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3BvbnNlcy50b29scyA9IHRvb2xzO1xuICAgICAgaWYgKGJvZHkudG9vbF9jaG9pY2UgIT09IHVuZGVmaW5lZCkgcmVzcG9uc2VzLnRvb2xfY2hvaWNlID0gYm9keS50b29sX2Nob2ljZTtcbiAgICB9XG4gIH1cblxuICAvLyBQcmVmZXIgUmVzcG9uc2VzJyBtYXhfb3V0cHV0X3Rva2VucyBuYW1pbmc7IGZhbGwgYmFjayBmcm9tIGNoYXQgbWF4X3Rva2Vucy5cbiAgaWYgKHR5cGVvZiBib2R5Lm1heF9vdXRwdXRfdG9rZW5zID09PSBcIm51bWJlclwiKSB7XG4gICAgcmVzcG9uc2VzLm1heF9vdXRwdXRfdG9rZW5zID0gYm9keS5tYXhfb3V0cHV0X3Rva2VucztcbiAgfSBlbHNlIGlmICh0eXBlb2YgYm9keS5tYXhfdG9rZW5zID09PSBcIm51bWJlclwiKSB7XG4gICAgcmVzcG9uc2VzLm1heF9vdXRwdXRfdG9rZW5zID0gYm9keS5tYXhfdG9rZW5zO1xuICB9XG5cbiAgcmV0dXJuIHsgcmVzcG9uc2VzLCBzdHJlYW06IGJvZHkuc3RyZWFtID09PSB0cnVlIH07XG59XG5cbi8qKiBMaWZ0IGEgbm9uLXN0cmVhbWluZyBjaGF0IGNvbXBsZXRpb24gSlNPTiBpbnRvIGEgUmVzcG9uc2VzIGByZXNwb25zZWAgb2JqZWN0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXRUb1Jlc3BvbnNlKGNoYXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBtb2RlbDogc3RyaW5nKTogdW5rbm93biB7XG4gIGNvbnN0IGNob2ljZXMgPSBBcnJheS5pc0FycmF5KGNoYXQuY2hvaWNlcykgPyBjaGF0LmNob2ljZXMgOiBbXTtcbiAgY29uc3QgZmlyc3QgPSAoY2hvaWNlc1swXSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IG1lc3NhZ2UgPSAoZmlyc3QubWVzc2FnZSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IG91dHB1dDogdW5rbm93bltdID0gW107XG5cbiAgY29uc3QgdGV4dCA9IHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlLmNvbnRlbnQgOiBcIlwiO1xuICBpZiAodGV4dCkge1xuICAgIG91dHB1dC5wdXNoKHtcbiAgICAgIHR5cGU6IFwibWVzc2FnZVwiLFxuICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwib3V0cHV0X3RleHRcIiwgdGV4dCB9XSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFN1cmZhY2UgYW55IHRvb2wgY2FsbHMgYXMgUmVzcG9uc2VzIGBmdW5jdGlvbl9jYWxsYCBvdXRwdXQgaXRlbXMuXG4gIGNvbnN0IHRvb2xDYWxscyA9IEFycmF5LmlzQXJyYXkobWVzc2FnZS50b29sX2NhbGxzKSA/IG1lc3NhZ2UudG9vbF9jYWxscyA6IFtdO1xuICBmb3IgKGNvbnN0IHJhdyBvZiB0b29sQ2FsbHMpIHtcbiAgICBvdXRwdXQucHVzaCh0b0Z1bmN0aW9uQ2FsbEl0ZW0ocmF3IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSk7XG4gIH1cblxuICBjb25zdCB1c2FnZSA9IChjaGF0LnVzYWdlID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIHtcbiAgICBpZDogU3RyaW5nKGNoYXQuaWQgPz8gXCJyZXNwXCIpLFxuICAgIG9iamVjdDogXCJyZXNwb25zZVwiLFxuICAgIGNyZWF0ZWRfYXQ6IHR5cGVvZiBjaGF0LmNyZWF0ZWQgPT09IFwibnVtYmVyXCIgPyBjaGF0LmNyZWF0ZWQgOiAwLFxuICAgIG1vZGVsLFxuICAgIHN0YXR1czogXCJjb21wbGV0ZWRcIixcbiAgICBvdXRwdXQsXG4gICAgdXNhZ2U6IHtcbiAgICAgIGlucHV0X3Rva2VuczogTnVtYmVyKHVzYWdlLnByb21wdF90b2tlbnMgPz8gMCksXG4gICAgICBvdXRwdXRfdG9rZW5zOiBOdW1iZXIodXNhZ2UuY29tcGxldGlvbl90b2tlbnMgPz8gMCksXG4gICAgICB0b3RhbF90b2tlbnM6IE51bWJlcih1c2FnZS50b3RhbF90b2tlbnMgPz8gMCksXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBMaWZ0IGEgbmF0aXZlIFJlc3BvbnNlcyBgcmVzcG9uc2VgIG9iamVjdCBpbnRvIGEgY2hhdC1jb21wbGV0aW9ucyBib2R5LlxuICogSW52ZXJzZSBvZiB7QGxpbmsgY2hhdFRvUmVzcG9uc2V9OiB1c2VkIGFmdGVyIGEgUmVzcG9uc2VzLW9ubHkgdXBzdHJlYW0gY2FsbFxuICogd2hlbiB0aGUgY2xpZW50IHNwb2tlIENoYXQgQ29tcGxldGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNwb25zZVRvQ2hhdENvbXBsZXRpb24oXG4gIHJlc3BvbnNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgbW9kZWw6IHN0cmluZyxcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgeyB0ZXh0IH0gPSByZWFkUmVzcG9uc2VzT3V0cHV0KHJlc3BvbnNlKTtcbiAgY29uc3QgdG9vbENhbGxzOiB1bmtub3duW10gPSBbXTtcbiAgY29uc3Qgb3V0cHV0ID0gQXJyYXkuaXNBcnJheShyZXNwb25zZS5vdXRwdXQpID8gcmVzcG9uc2Uub3V0cHV0IDogW107XG4gIGZvciAoY29uc3QgcmF3IG9mIG91dHB1dCkge1xuICAgIGlmICghcmF3IHx8IHR5cGVvZiByYXcgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGl0ZW0gPSByYXcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKGl0ZW0udHlwZSAhPT0gXCJmdW5jdGlvbl9jYWxsXCIpIGNvbnRpbnVlO1xuICAgIHRvb2xDYWxscy5wdXNoKHRvQ2hhdFRvb2xDYWxsKGl0ZW0pKTtcbiAgfVxuXG4gIGNvbnN0IG1lc3NhZ2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHJvbGU6IFwiYXNzaXN0YW50XCIsXG4gICAgY29udGVudDogdGV4dCB8fCBudWxsLFxuICB9O1xuICBpZiAodG9vbENhbGxzLmxlbmd0aCA+IDApIG1lc3NhZ2UudG9vbF9jYWxscyA9IHRvb2xDYWxscztcblxuICBjb25zdCB1c2FnZSA9IChyZXNwb25zZS51c2FnZSA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiB7XG4gICAgaWQ6IFN0cmluZyhyZXNwb25zZS5pZCA/PyBcImNoYXRjbXBsXCIpLFxuICAgIG9iamVjdDogXCJjaGF0LmNvbXBsZXRpb25cIixcbiAgICBjcmVhdGVkOiB0eXBlb2YgcmVzcG9uc2UuY3JlYXRlZF9hdCA9PT0gXCJudW1iZXJcIiA/IHJlc3BvbnNlLmNyZWF0ZWRfYXQgOiAwLFxuICAgIG1vZGVsLFxuICAgIGNob2ljZXM6IFtcbiAgICAgIHtcbiAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGZpbmlzaF9yZWFzb246IHRvb2xDYWxscy5sZW5ndGggPiAwID8gXCJ0b29sX2NhbGxzXCIgOiBcInN0b3BcIixcbiAgICAgIH0sXG4gICAgXSxcbiAgICB1c2FnZToge1xuICAgICAgcHJvbXB0X3Rva2VuczogTnVtYmVyKHVzYWdlLmlucHV0X3Rva2VucyA/PyAwKSxcbiAgICAgIGNvbXBsZXRpb25fdG9rZW5zOiBOdW1iZXIodXNhZ2Uub3V0cHV0X3Rva2VucyA/PyAwKSxcbiAgICAgIHRvdGFsX3Rva2VuczogTnVtYmVyKHVzYWdlLnRvdGFsX3Rva2VucyA/PyAwKSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEEgdG9vbCBjYWxsJ3MgYGFyZ3VtZW50c2AgSlNPTi4gQm90aCB3aXJlcyBjYXJyeSBpdCBhcyBhbiB1bnBhcnNlZCBzdHJpbmc7XG4gKiBhbnl0aGluZyBlbHNlIChhYnNlbnQsIGFuIGFscmVhZHktcGFyc2VkIG9iamVjdCkgYmVjb21lcyBhbiBlbXB0eSBsaXRlcmFsIHNvXG4gKiB0aGUgcmVjZWl2aW5nIHNpZGUgYWx3YXlzIGhhcyB2YWxpZCBKU09OIHRvIHBhcnNlLlxuICovXG5mdW5jdGlvbiBjYWxsQXJndW1lbnRzKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogXCJ7fVwiO1xufVxuXG4vKipcbiAqIFRoZSBSZXNwb25zZXMgYGZ1bmN0aW9uX2NhbGxgIGl0ZW0gZm9yIGEgdG9vbCBjYWxsIGluIGVpdGhlciBzcGVsbGluZzogYSBjaGF0XG4gKiBgdG9vbF9jYWxsc1tdYCBlbnRyeSAoYHtpZCwgZnVuY3Rpb246e25hbWUsIGFyZ3VtZW50c319YCkgb3IgYW4gaXRlbSB0aGF0IGlzXG4gKiBhbHJlYWR5IGZsYXQuXG4gKi9cbmZ1bmN0aW9uIHRvRnVuY3Rpb25DYWxsSXRlbShjYWxsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgZm4gPSAoY2FsbC5mdW5jdGlvbiA/PyBjYWxsKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBcImZ1bmN0aW9uX2NhbGxcIixcbiAgICBjYWxsX2lkOiBTdHJpbmcoY2FsbC5jYWxsX2lkID8/IGNhbGwuaWQgPz8gXCJcIiksXG4gICAgbmFtZTogU3RyaW5nKGZuLm5hbWUgPz8gXCJcIiksXG4gICAgYXJndW1lbnRzOiBjYWxsQXJndW1lbnRzKGZuLmFyZ3VtZW50cyksXG4gIH07XG59XG5cbi8qKiBUaGUgY2hhdCBgdG9vbF9jYWxsc1tdYCBlbnRyeSBmb3IgYSBSZXNwb25zZXMgYGZ1bmN0aW9uX2NhbGxgIGl0ZW0uICovXG5mdW5jdGlvbiB0b0NoYXRUb29sQ2FsbChpdGVtOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IENoYXRUb29sQ2FsbCB7XG4gIHJldHVybiB7XG4gICAgaWQ6IFN0cmluZyhpdGVtLmNhbGxfaWQgPz8gaXRlbS5pZCA/PyBcIlwiKSxcbiAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgZnVuY3Rpb246IHtcbiAgICAgIG5hbWU6IFN0cmluZyhpdGVtLm5hbWUgPz8gXCJcIiksXG4gICAgICBhcmd1bWVudHM6IGNhbGxBcmd1bWVudHMoaXRlbS5hcmd1bWVudHMpLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogVGhlIGNoYXQtbmVzdGVkIHNwZWxsaW5nIChge3R5cGU6XCJmdW5jdGlvblwiLCBmdW5jdGlvbjp7bmFtZSwg4oCmfX1gKSBvZiBhIHRvb2xcbiAqIHNwZWMsIG9yIGB1bmRlZmluZWRgIGZvciBhIGJ1aWx0LWluIFJlc3BvbnNlcyB0b29sIChgd2ViX3NlYXJjaGAsXG4gKiBgbG9jYWxfc2hlbGxgLCDigKYpIHRoYXQgY2hhdCBjYW5ub3QgZXhwcmVzcyBhbmQgRGF0YWJyaWNrcyByZWplY3RzLlxuICovXG5mdW5jdGlvbiB0b0NoYXRUb29sKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdG9vbCA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAodG9vbC50eXBlICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0b29sLmZ1bmN0aW9uICYmIHR5cGVvZiB0b29sLmZ1bmN0aW9uID09PSBcIm9iamVjdFwiKSByZXR1cm4gdG9vbDsgLy8gYWxyZWFkeSBuZXN0ZWRcbiAgaWYgKHR5cGVvZiB0b29sLm5hbWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgIGZ1bmN0aW9uOiB7XG4gICAgICBuYW1lOiB0b29sLm5hbWUsXG4gICAgICAuLi4odG9vbC5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IHRvb2wuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgIC4uLih0b29sLnBhcmFtZXRlcnMgPyB7IHBhcmFtZXRlcnM6IHRvb2wucGFyYW1ldGVycyB9IDoge30pLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogVGhlIGZsYXQgUmVzcG9uc2VzIHNwZWxsaW5nIChge3R5cGU6XCJmdW5jdGlvblwiLCBuYW1lLCDigKZ9YCkgb2YgYSB0b29sIHNwZWMuXG4gKiBJbnZlcnNlIG9mIHtAbGluayB0b0NoYXRUb29sfTsgbm9uLWZ1bmN0aW9uIHRvb2xzIGFyZSBkcm9wcGVkIHRoZSBzYW1lIHdheS5cbiAqL1xuZnVuY3Rpb24gdG9SZXNwb25zZXNUb29sKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdG9vbCA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAodG9vbC50eXBlICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0b29sLmZ1bmN0aW9uICYmIHR5cGVvZiB0b29sLmZ1bmN0aW9uID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgZm4gPSB0b29sLmZ1bmN0aW9uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICBuYW1lOiBmbi5uYW1lLFxuICAgICAgLi4uKGZuLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogZm4uZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgIC4uLihmbi5wYXJhbWV0ZXJzID8geyBwYXJhbWV0ZXJzOiBmbi5wYXJhbWV0ZXJzIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4gdHlwZW9mIHRvb2wubmFtZSA9PT0gXCJzdHJpbmdcIiA/IHRvb2wgOiB1bmRlZmluZWQ7IC8vIGFscmVhZHkgZmxhdFxufVxuXG4vKiogT25lIFNlcnZlci1TZW50IEV2ZW50LCByZWFkeSB0byB3cml0ZSB0byB0aGUgY2xpZW50LiAqL1xuZnVuY3Rpb24gc3NlKGV2ZW50OiBzdHJpbmcsIGRhdGE6IHVua25vd24pOiBzdHJpbmcge1xuICByZXR1cm4gYGV2ZW50OiAke2V2ZW50fVxcbmRhdGE6ICR7SlNPTi5zdHJpbmdpZnkoZGF0YSl9XFxuXFxuYDtcbn1cblxuLyoqXG4gKiBJbmNyZW1lbnRhbCBjaGF0LWNodW5rIC0+IFJlc3BvbnNlcy1TU0UgdHJhbnNsYXRvci4gYGZlZWRgIGFuZCBgZmluaXNoYCBib3RoXG4gKiByZXR1cm4gdGhlIFNTRSBieXRlcyB0byBmb3J3YXJkLCBvciBgXCJcImAgd2hlbiBhIGNodW5rIHByb2R1Y2VkIG5vIGV2ZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlc1N0cmVhbVRyYW5zbGF0b3Ige1xuICAvKiogVHJhbnNsYXRlIG9uZSB1cHN0cmVhbSBgY2hhdC5jb21wbGV0aW9uLmNodW5rYCBvYmplY3QuICovXG4gIGZlZWQoY2h1bms6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nO1xuICAvKiogQ2xvc2UgYW55IG9wZW4gaXRlbXMgYW5kIGVtaXQgYHJlc3BvbnNlLmNvbXBsZXRlZGAuIENhbGwgb25jZSwgYXQgZW5kIG9mIHN0cmVhbS4gKi9cbiAgZmluaXNoKCk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUcmFuc2xhdGUgYW4gdXBzdHJlYW0gY2hhdC1jb21wbGV0aW9ucyBTU0Ugc3RyZWFtIGludG8gdGhlIFJlc3BvbnNlcyBTU0VcbiAqIGV2ZW50IHN0cmVhbSBhIFJlc3BvbnNlcyBjbGllbnQgY29uc3VtZXMuXG4gKlxuICogVXBzdHJlYW0gY2h1bmtzIGFyZSBgY2hhdC5jb21wbGV0aW9uLmNodW5rYCBvYmplY3RzIHdob3NlIGBjaG9pY2VzWzBdLmRlbHRhYFxuICogY2FycmllcyBpbmNyZW1lbnRhbCBgY29udGVudGAgKGFzc2lzdGFudCB0ZXh0KSBhbmQvb3IgYHRvb2xfY2FsbHNgIChmdW5jdGlvblxuICogY2FsbHMsIHN0cmVhbWVkIGJ5IGBpbmRleGAgd2l0aCBwYXJ0aWFsIGBhcmd1bWVudHNgKS4gV2UgZW1pdCB0aGUgUmVzcG9uc2VzXG4gKiBsaWZlY3ljbGUgYXJvdW5kIHRoZW06XG4gKlxuICogICByZXNwb25zZS5jcmVhdGVkXG4gKiAgIC0+IHBlciB0ZXh0IHJ1bjogIG91dHB1dF9pdGVtLmFkZGVkIOKGkiBvdXRwdXRfdGV4dC5kZWx0YSog4oaSIG91dHB1dF9pdGVtLmRvbmVcbiAqICAgLT4gcGVyIHRvb2wgY2FsbDogb3V0cHV0X2l0ZW0uYWRkZWQg4oaSIGZ1bmN0aW9uX2NhbGxfYXJndW1lbnRzLmRlbHRhKlxuICogICAgICAgICAgICAgICAgICAgICAgIOKGkiBmdW5jdGlvbl9jYWxsX2FyZ3VtZW50cy5kb25lIOKGkiBvdXRwdXRfaXRlbS5kb25lXG4gKiAgIHJlc3BvbnNlLmNvbXBsZXRlZCAgICh3aXRoIHRoZSBhc3NlbWJsZWQgZmluYWwgYHJlc3BvbnNlYCBvYmplY3QpXG4gKlxuICogVGhlIHRyYW5zbGF0b3IgaXMgaW50ZW50aW9uYWxseSB0b2xlcmFudDogbWFsZm9ybWVkL2tlZXBhbGl2ZSBsaW5lcyB5aWVsZFxuICogbm90aGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlc1N0cmVhbVRyYW5zbGF0b3IoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIHJlc3BvbnNlSWQ6IHN0cmluZyxcbik6IFJlc3BvbnNlc1N0cmVhbVRyYW5zbGF0b3Ige1xuICBsZXQgc3RhcnRlZCA9IGZhbHNlO1xuICBsZXQgb3V0cHV0SW5kZXggPSAwO1xuXG4gIC8vIFRleHQgcnVuIHN0YXRlOiB3aGV0aGVyIGEgbWVzc2FnZSBpdGVtIGlzIGN1cnJlbnRseSBvcGVuLCBhbmQgaXRzIGJ1ZmZlci5cbiAgbGV0IHRleHRPcGVuID0gZmFsc2U7XG4gIGxldCB0ZXh0QnVmZmVyID0gXCJcIjtcbiAgbGV0IHRleHRJdGVtSWQgPSBcIlwiO1xuXG4gIC8vIFRvb2wtY2FsbCBzdGF0ZSwga2V5ZWQgYnkgdGhlIHVwc3RyZWFtIGB0b29sX2NhbGxzW10uaW5kZXhgLlxuICBpbnRlcmZhY2UgVG9vbFN0YXRlIHtcbiAgICBvdXRwdXRJbmRleDogbnVtYmVyO1xuICAgIGNhbGxJZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBhcmdzOiBzdHJpbmc7XG4gIH1cbiAgY29uc3QgdG9vbHMgPSBuZXcgTWFwPG51bWJlciwgVG9vbFN0YXRlPigpO1xuXG4gIGNvbnN0IGNyZWF0ZWQgPSAoKSA9PlxuICAgIHNzZShcInJlc3BvbnNlLmNyZWF0ZWRcIiwge1xuICAgICAgdHlwZTogXCJyZXNwb25zZS5jcmVhdGVkXCIsXG4gICAgICByZXNwb25zZTogeyBpZDogcmVzcG9uc2VJZCwgb2JqZWN0OiBcInJlc3BvbnNlXCIsIHN0YXR1czogXCJpbl9wcm9ncmVzc1wiLCBtb2RlbCwgb3V0cHV0OiBbXSB9LFxuICAgIH0pO1xuXG4gIGZ1bmN0aW9uIG9wZW5UZXh0KCk6IHN0cmluZyB7XG4gICAgdGV4dE9wZW4gPSB0cnVlO1xuICAgIHRleHRJdGVtSWQgPSBgJHtyZXNwb25zZUlkfS1tc2ctJHtvdXRwdXRJbmRleH1gO1xuICAgIGNvbnN0IGV2ID0gc3NlKFwicmVzcG9uc2Uub3V0cHV0X2l0ZW0uYWRkZWRcIiwge1xuICAgICAgdHlwZTogXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5hZGRlZFwiLFxuICAgICAgb3V0cHV0X2luZGV4OiBvdXRwdXRJbmRleCxcbiAgICAgIGl0ZW06IHsgaWQ6IHRleHRJdGVtSWQsIHR5cGU6IFwibWVzc2FnZVwiLCByb2xlOiBcImFzc2lzdGFudFwiLCBjb250ZW50OiBbXSB9LFxuICAgIH0pO1xuICAgIHJldHVybiBldjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsb3NlVGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICghdGV4dE9wZW4pIHJldHVybiBcIlwiO1xuICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICBpZDogdGV4dEl0ZW1JZCxcbiAgICAgIHR5cGU6IFwibWVzc2FnZVwiLFxuICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6IFwib3V0cHV0X3RleHRcIiwgdGV4dDogdGV4dEJ1ZmZlciB9XSxcbiAgICB9O1xuICAgIGNvbnN0IGV2ID1cbiAgICAgIHNzZShcInJlc3BvbnNlLm91dHB1dF90ZXh0LmRvbmVcIiwge1xuICAgICAgICB0eXBlOiBcInJlc3BvbnNlLm91dHB1dF90ZXh0LmRvbmVcIixcbiAgICAgICAgaXRlbV9pZDogdGV4dEl0ZW1JZCxcbiAgICAgICAgb3V0cHV0X2luZGV4OiBvdXRwdXRJbmRleCxcbiAgICAgICAgY29udGVudF9pbmRleDogMCxcbiAgICAgICAgdGV4dDogdGV4dEJ1ZmZlcixcbiAgICAgIH0pICtcbiAgICAgIHNzZShcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIiwge1xuICAgICAgICB0eXBlOiBcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIixcbiAgICAgICAgb3V0cHV0X2luZGV4OiBvdXRwdXRJbmRleCxcbiAgICAgICAgaXRlbSxcbiAgICAgIH0pO1xuICAgIHRleHRPcGVuID0gZmFsc2U7XG4gICAgdGV4dEJ1ZmZlciA9IFwiXCI7XG4gICAgb3V0cHV0SW5kZXggKz0gMTtcbiAgICByZXR1cm4gZXY7XG4gIH1cblxuICBmdW5jdGlvbiBmZWVkKGNodW5rOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB7XG4gICAgbGV0IG91dCA9IFwiXCI7XG4gICAgaWYgKCFzdGFydGVkKSB7XG4gICAgICBzdGFydGVkID0gdHJ1ZTtcbiAgICAgIG91dCArPSBjcmVhdGVkKCk7XG4gICAgfVxuICAgIGNvbnN0IGNob2ljZXMgPSBBcnJheS5pc0FycmF5KGNodW5rLmNob2ljZXMpID8gY2h1bmsuY2hvaWNlcyA6IFtdO1xuICAgIGNvbnN0IGNob2ljZSA9IChjaG9pY2VzWzBdID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCBkZWx0YSA9IChjaG9pY2UuZGVsdGEgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgLy8gQXNzaXN0YW50IHRleHQgZGVsdGFzLlxuICAgIGlmICh0eXBlb2YgZGVsdGEuY29udGVudCA9PT0gXCJzdHJpbmdcIiAmJiBkZWx0YS5jb250ZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICghdGV4dE9wZW4pIG91dCArPSBvcGVuVGV4dCgpO1xuICAgICAgdGV4dEJ1ZmZlciArPSBkZWx0YS5jb250ZW50O1xuICAgICAgb3V0ICs9IHNzZShcInJlc3BvbnNlLm91dHB1dF90ZXh0LmRlbHRhXCIsIHtcbiAgICAgICAgdHlwZTogXCJyZXNwb25zZS5vdXRwdXRfdGV4dC5kZWx0YVwiLFxuICAgICAgICBpdGVtX2lkOiB0ZXh0SXRlbUlkLFxuICAgICAgICBvdXRwdXRfaW5kZXg6IG91dHB1dEluZGV4LFxuICAgICAgICBjb250ZW50X2luZGV4OiAwLFxuICAgICAgICBkZWx0YTogZGVsdGEuY29udGVudCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRvb2wtY2FsbCBkZWx0YXM6IGVhY2ggaXMga2V5ZWQgYnkgYGluZGV4YDsgYGFyZ3VtZW50c2AgYXJyaXZlcyBpbiBwaWVjZXMuXG4gICAgY29uc3QgdG9vbERlbHRhcyA9IEFycmF5LmlzQXJyYXkoZGVsdGEudG9vbF9jYWxscykgPyBkZWx0YS50b29sX2NhbGxzIDogW107XG4gICAgZm9yIChjb25zdCByYXdUYyBvZiB0b29sRGVsdGFzKSB7XG4gICAgICBjb25zdCB0YyA9IHJhd1RjIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29uc3QgaWR4ID0gTnVtYmVyKHRjLmluZGV4ID8/IDApO1xuICAgICAgY29uc3QgZm4gPSAodGMuZnVuY3Rpb24gPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgbGV0IHN0YXRlID0gdG9vbHMuZ2V0KGlkeCk7XG4gICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgIC8vIEZpcnN0IGZyYWdtZW50IGZvciB0aGlzIGNhbGw6IGEgdGV4dCBydW4gKGlmIG9wZW4pIG11c3QgY2xvc2UgZmlyc3Qgc29cbiAgICAgICAgLy8gb3V0cHV0IG9yZGVyaW5nIHN0YXlzIG1vbm90b25pYywgdGhlbiB3ZSBvcGVuIGEgZnVuY3Rpb25fY2FsbCBpdGVtLlxuICAgICAgICBvdXQgKz0gY2xvc2VUZXh0KCk7XG4gICAgICAgIHN0YXRlID0ge1xuICAgICAgICAgIG91dHB1dEluZGV4LFxuICAgICAgICAgIGNhbGxJZDogU3RyaW5nKHRjLmlkID8/IGAke3Jlc3BvbnNlSWR9LWNhbGwtJHtpZHh9YCksXG4gICAgICAgICAgbmFtZTogU3RyaW5nKGZuLm5hbWUgPz8gXCJcIiksXG4gICAgICAgICAgYXJnczogXCJcIixcbiAgICAgICAgfTtcbiAgICAgICAgdG9vbHMuc2V0KGlkeCwgc3RhdGUpO1xuICAgICAgICBvdXQgKz0gc3NlKFwicmVzcG9uc2Uub3V0cHV0X2l0ZW0uYWRkZWRcIiwge1xuICAgICAgICAgIHR5cGU6IFwicmVzcG9uc2Uub3V0cHV0X2l0ZW0uYWRkZWRcIixcbiAgICAgICAgICBvdXRwdXRfaW5kZXg6IHN0YXRlLm91dHB1dEluZGV4LFxuICAgICAgICAgIGl0ZW06IHtcbiAgICAgICAgICAgIGlkOiBzdGF0ZS5jYWxsSWQsXG4gICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uX2NhbGxcIixcbiAgICAgICAgICAgIGNhbGxfaWQ6IHN0YXRlLmNhbGxJZCxcbiAgICAgICAgICAgIG5hbWU6IHN0YXRlLm5hbWUsXG4gICAgICAgICAgICBhcmd1bWVudHM6IFwiXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIG91dHB1dEluZGV4ICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGZuLm5hbWUgPT09IFwic3RyaW5nXCIgJiYgZm4ubmFtZSAmJiAhc3RhdGUubmFtZSkgc3RhdGUubmFtZSA9IGZuLm5hbWU7XG4gICAgICBpZiAodHlwZW9mIGZuLmFyZ3VtZW50cyA9PT0gXCJzdHJpbmdcIiAmJiBmbi5hcmd1bWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICBzdGF0ZS5hcmdzICs9IGZuLmFyZ3VtZW50cztcbiAgICAgICAgb3V0ICs9IHNzZShcInJlc3BvbnNlLmZ1bmN0aW9uX2NhbGxfYXJndW1lbnRzLmRlbHRhXCIsIHtcbiAgICAgICAgICB0eXBlOiBcInJlc3BvbnNlLmZ1bmN0aW9uX2NhbGxfYXJndW1lbnRzLmRlbHRhXCIsXG4gICAgICAgICAgaXRlbV9pZDogc3RhdGUuY2FsbElkLFxuICAgICAgICAgIG91dHB1dF9pbmRleDogc3RhdGUub3V0cHV0SW5kZXgsXG4gICAgICAgICAgZGVsdGE6IGZuLmFyZ3VtZW50cyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBmdW5jdGlvbiBmaW5pc2goKTogc3RyaW5nIHtcbiAgICBsZXQgb3V0ID0gY2xvc2VUZXh0KCk7XG4gICAgLy8gQ2xvc2UgYW55IG9wZW4gdG9vbCBjYWxscywgZW1pdHRpbmcgdGhlaXIgYXNzZW1ibGVkIGFyZ3VtZW50cy5cbiAgICBmb3IgKGNvbnN0IHN0YXRlIG9mIHRvb2xzLnZhbHVlcygpKSB7XG4gICAgICBvdXQgKz0gc3NlKFwicmVzcG9uc2UuZnVuY3Rpb25fY2FsbF9hcmd1bWVudHMuZG9uZVwiLCB7XG4gICAgICAgIHR5cGU6IFwicmVzcG9uc2UuZnVuY3Rpb25fY2FsbF9hcmd1bWVudHMuZG9uZVwiLFxuICAgICAgICBpdGVtX2lkOiBzdGF0ZS5jYWxsSWQsXG4gICAgICAgIG91dHB1dF9pbmRleDogc3RhdGUub3V0cHV0SW5kZXgsXG4gICAgICAgIGFyZ3VtZW50czogc3RhdGUuYXJncyxcbiAgICAgIH0pO1xuICAgICAgb3V0ICs9IHNzZShcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIiwge1xuICAgICAgICB0eXBlOiBcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIixcbiAgICAgICAgb3V0cHV0X2luZGV4OiBzdGF0ZS5vdXRwdXRJbmRleCxcbiAgICAgICAgaXRlbToge1xuICAgICAgICAgIGlkOiBzdGF0ZS5jYWxsSWQsXG4gICAgICAgICAgdHlwZTogXCJmdW5jdGlvbl9jYWxsXCIsXG4gICAgICAgICAgY2FsbF9pZDogc3RhdGUuY2FsbElkLFxuICAgICAgICAgIG5hbWU6IHN0YXRlLm5hbWUsXG4gICAgICAgICAgYXJndW1lbnRzOiBzdGF0ZS5hcmdzLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIG91dCArPSBzc2UoXCJyZXNwb25zZS5jb21wbGV0ZWRcIiwge1xuICAgICAgdHlwZTogXCJyZXNwb25zZS5jb21wbGV0ZWRcIixcbiAgICAgIHJlc3BvbnNlOiB7IGlkOiByZXNwb25zZUlkLCBvYmplY3Q6IFwicmVzcG9uc2VcIiwgc3RhdHVzOiBcImNvbXBsZXRlZFwiLCBtb2RlbCB9LFxuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICByZXR1cm4geyBmZWVkLCBmaW5pc2ggfTtcbn1cblxuLyoqIEEgc291cmNlIHRoZSBtb2RlbCBjaXRlZCwgYXMgY2FycmllZCBieSBhIFJlc3BvbnNlcyBjb250ZW50LXBhcnQgYW5ub3RhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VzQ2l0YXRpb24ge1xuICB1cmw6IHN0cmluZztcbiAgdGl0bGU/OiBzdHJpbmc7XG59XG5cbi8qKiBXaGF0IHtAbGluayByZWFkUmVzcG9uc2VzT3V0cHV0fSBwdWxscyBvdXQgb2YgYSBgcmVzcG9uc2VgIG9iamVjdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzcG9uc2VzT3V0cHV0IHtcbiAgLyoqIFRoZSBhc3Npc3RhbnQncyBhbnN3ZXIsIHdpdGggdGhlIG91dHB1dCBpdGVtcyBjb25jYXRlbmF0ZWQuICovXG4gIHRleHQ6IHN0cmluZztcbiAgLyoqIENpdGVkIHNvdXJjZXMgaW4gZmlyc3Qtc2VlbiBvcmRlciwgZGVkdXBsaWNhdGVkIGJ5IFVSTC4gKi9cbiAgY2l0YXRpb25zOiBSZXNwb25zZXNDaXRhdGlvbltdO1xufVxuXG4vKipcbiAqIFJlYWQgdGhlIGFuc3dlciB0ZXh0IGFuZCBjaXRlZCBzb3VyY2VzIG91dCBvZiBhIFJlc3BvbnNlcyBgcmVzcG9uc2VgIHBheWxvYWQuXG4gKlxuICogVGhpcyBpcyB0aGUgaW52ZXJzZSBvZiB7QGxpbmsgY2hhdFRvUmVzcG9uc2V9OiBpdCBjb25zdW1lcyB3aGF0IGFuIGVuZHBvaW50XG4gKiBzcGVha2luZyBSZXNwb25zZXMgbmF0aXZlbHkgcmV0dXJucywgcmF0aGVyIHRoYW4gcHJvZHVjaW5nIGl0LiBUaGUgRGF0YWJyaWNrc1xuICogbmF0aXZlIHdlYi1zZWFyY2ggdG9vbCBhbnN3ZXJzIHRoaXMgd2F5LCB3aXRoIGVhY2ggc291cmNlIGF0dGFjaGVkIGFzIGFcbiAqIGB1cmxfY2l0YXRpb25gIGFubm90YXRpb24gb24gdGhlIGNvbnRlbnQgcGFydCB0aGF0IHVzZWQgaXQuXG4gKlxuICogUHJlZmVycyB0aGUgZmxhdHRlbmVkIGBvdXRwdXRfdGV4dGAgd2hlbiB0aGUgcGF5bG9hZCBjYXJyaWVzIGl0LCBhbmQgZmFsbHNcbiAqIGJhY2sgdG8gd2Fsa2luZyBgb3V0cHV0W10uY29udGVudFtdLnRleHRgLiBFdmVyeSBmaWVsZCBpcyBvcHRpb25hbCB1cHN0cmVhbSxcbiAqIHNvIGEgcGF5bG9hZCBtaXNzaW5nIGFueSBvZiBpdCB5aWVsZHMgZW1wdHkgcmVzdWx0cyByYXRoZXIgdGhhbiB0aHJvd2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRSZXNwb25zZXNPdXRwdXQocGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZXNwb25zZXNPdXRwdXQge1xuICBjb25zdCBvdXRwdXQgPSBBcnJheS5pc0FycmF5KHBheWxvYWQub3V0cHV0KSA/IChwYXlsb2FkLm91dHB1dCBhcyB1bmtub3duW10pIDogW107XG4gIGNvbnN0IHRleHRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBjaXRhdGlvbnM6IFJlc3BvbnNlc0NpdGF0aW9uW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgcmF3SXRlbSBvZiBvdXRwdXQpIHtcbiAgICBpZiAoIXJhd0l0ZW0gfHwgdHlwZW9mIHJhd0l0ZW0gIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGNvbnRlbnQgPSAocmF3SXRlbSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuY29udGVudDtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGVudCkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgcmF3UGFydCBvZiBjb250ZW50KSB7XG4gICAgICBpZiAoIXJhd1BhcnQgfHwgdHlwZW9mIHJhd1BhcnQgIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcGFydCA9IHJhd1BhcnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCB0ZXh0ID0gc3RyaW5nLnRyaW1Ub0VtcHR5KHBhcnQudGV4dCk7XG4gICAgICBpZiAodGV4dCkgdGV4dHMucHVzaCh0ZXh0KTtcbiAgICAgIGNvbnN0IGFubm90YXRpb25zID0gQXJyYXkuaXNBcnJheShwYXJ0LmFubm90YXRpb25zKSA/IHBhcnQuYW5ub3RhdGlvbnMgOiBbXTtcbiAgICAgIGZvciAoY29uc3QgcmF3QW5uIG9mIGFubm90YXRpb25zKSB7XG4gICAgICAgIGlmICghcmF3QW5uIHx8IHR5cGVvZiByYXdBbm4gIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBhbm4gPSByYXdBbm4gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGNvbnN0IHVybCA9IHN0cmluZy50cmltVG9FbXB0eShhbm4udXJsKTtcbiAgICAgICAgaWYgKCF1cmwgfHwgc2Vlbi5oYXModXJsKSkgY29udGludWU7XG4gICAgICAgIHNlZW4uYWRkKHVybCk7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gc3RyaW5nLnRyaW1Ub0VtcHR5KGFubi50aXRsZSk7XG4gICAgICAgIGNpdGF0aW9ucy5wdXNoKHsgdXJsLCAuLi4odGl0bGUgPyB7IHRpdGxlIH0gOiB7fSkgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgdGV4dDogc3RyaW5nLnRyaW1Ub0VtcHR5KHBheWxvYWQub3V0cHV0X3RleHQpIHx8IHRleHRzLmpvaW4oXCJcXG5cIikudHJpbSgpLCBjaXRhdGlvbnMgfTtcbn1cblxuLyoqXG4gKiBTdHJpcCB0b29sIHR5cGVzIHRoZSB1cHN0cmVhbSBtb2RlbCBkb2Vzbid0IHN1cHBvcnQgZnJvbSBhIFJlc3BvbnNlcyByZXF1ZXN0XG4gKiBib2R5LCByZXR1cm5pbmcgYSBzaGFsbG93IGNvcHkgc2FmZSB0byBmb3J3YXJkICh0aGUgaW5wdXQgaXMgbm90IG11dGF0ZWQpLlxuICpcbiAqIENsaWVudHMgbGlrZSB0aGUgQ29kZXggQ0xJIGluY2x1ZGUgYnVpbHQtaW4gUmVzcG9uc2VzIHRvb2xzIChgd2ViX3NlYXJjaGAsXG4gKiBgbG9jYWxfc2hlbGxgLCBgY3VzdG9tYCwgLi4uKSBhbG9uZ3NpZGUgdGhlaXIgYGZ1bmN0aW9uYCB0b29scy4gRGF0YWJyaWNrcydcbiAqIE9wZW4gUmVzcG9uc2VzIHN1cmZhY2UgZm9yIEFudGhyb3BpYy9DbGF1ZGUgKGFuZCBvdGhlciBub24tT3BlbkFJIHByb3ZpZGVycylcbiAqIG9ubHkgYWNjZXB0cyBgZnVuY3Rpb25gIHRvb2xzIGFuZCBoYXJkLWVycm9ycyBvdGhlcndpc2U6XG4gKiAgIFwiQW50aHJvcGljIGRvZXMgbm90IHN1cHBvcnQgdG9vbCB0eXBlICd3ZWJfc2VhcmNoJy4gT25seSAnZnVuY3Rpb24nIGlzIHN1cHBvcnRlZC5cIlxuICogQ2FsbCB0aGlzIGJlZm9yZSBmb3J3YXJkaW5nIHRvIGAvc2VydmluZy1lbmRwb2ludHMvb3Blbi1yZXNwb25zZXNgLiBUaGUgT3BlbkFJXG4gKiBgL3NlcnZpbmctZW5kcG9pbnRzL3Jlc3BvbnNlc2AgcGF0aCBzaG91bGQga2VlcCBidWlsdC1pbnMgKEdQVCBzdXBwb3J0cyB0aGVtKS5cbiAqIElmIGZpbHRlcmluZyBlbXB0aWVzIHRoZSBsaXN0LCBgdG9vbHNgIC8gYHRvb2xfY2hvaWNlYCAvIGBwYXJhbGxlbF90b29sX2NhbGxzYFxuICogYXJlIGRyb3BwZWQgc28gd2UgbmV2ZXIgc2VuZCBhbiBlbXB0eSBgdG9vbHM6IFtdYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplUmVzcG9uc2VzVG9vbHMoYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShib2R5LnRvb2xzKSB8fCBib2R5LnRvb2xzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGJvZHk7XG4gIGNvbnN0IGZuVG9vbHMgPSBib2R5LnRvb2xzLmZpbHRlcihcbiAgICAodCkgPT4gdCAmJiB0eXBlb2YgdCA9PT0gXCJvYmplY3RcIiAmJiAodCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikudHlwZSA9PT0gXCJmdW5jdGlvblwiLFxuICApO1xuICBpZiAoZm5Ub29scy5sZW5ndGggPT09IGJvZHkudG9vbHMubGVuZ3RoKSByZXR1cm4gYm9keTsgLy8gbm90aGluZyB0byBzdHJpcFxuICBjb25zdCBuZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgLi4uYm9keSB9O1xuICBpZiAoZm5Ub29scy5sZW5ndGggPiAwKSB7XG4gICAgbmV4dC50b29scyA9IGZuVG9vbHM7XG4gIH0gZWxzZSB7XG4gICAgZGVsZXRlIG5leHQudG9vbHM7XG4gICAgZGVsZXRlIG5leHQudG9vbF9jaG9pY2U7XG4gICAgZGVsZXRlIG5leHQucGFyYWxsZWxfdG9vbF9jYWxscztcbiAgfVxuICByZXR1cm4gbmV4dDtcbn1cblxuLyoqXG4gKiBDb250ZW50LXBhcnQgLyBpbnB1dC1pdGVtIHR5cGVzIENsYXVkZSBleHRlbmRlZCB0aGlua2luZyB1c2VzIG9uIHRoZSB3aXJlLlxuICpcbiAqIFNoYXJlZCBzbyBib3RoIHdpcmUgc3VyZmFjZXMgc3RyaXAgdGhlIHNhbWUgc2V0OiB0aGUgUmVzcG9uc2VzIHBhdGggaGVyZVxuICogKHtAbGluayBzYW5pdGl6ZU9wZW5SZXNwb25zZXNJbnB1dH0pIGFuZCB0aGUgQ2hhdCBDb21wbGV0aW9ucyBwYXRoIGluXG4gKiBgQGRieC10b29scy9hcHBraXQtbWFzdHJhYCdzIHNlcnZpbmcgc2FuaXRpemUuIEFudGhyb3BpYyBzaWducyB0aGVzZSBibG9ja3MsXG4gKiBzbyBhIHJlcGxheSB0aGF0IG11dGF0ZXMgb25lIGlzIHJlamVjdGVkIG91dHJpZ2h0IC0gYm90aCBwYXRocyBtdXN0IGFncmVlIG9uXG4gKiB3aGF0IGNvdW50cyBhcyBhIHJlYXNvbmluZyBibG9jay5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFQVNPTklOR19UWVBFUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICBcInJlYXNvbmluZ1wiLFxuICBcInRoaW5raW5nXCIsXG4gIFwicmVkYWN0ZWRfdGhpbmtpbmdcIixcbl0pO1xuXG4vKipcbiAqIFJld3JpdGUgUmVzcG9uc2VzIGBpbnB1dGAgc28gT3BlbiBSZXNwb25zZXMgd2lsbCBhY2NlcHQgaXQuXG4gKlxuICogVHdvIE9wZW5BSSAvIENvZGV4IHNoYXBlcyB0aGF0IERhdGFicmlja3MgT3BlbiBSZXNwb25zZXMgKENsYXVkZSwgR2VtaW5pLCDigKYpXG4gKiByZWplY3Q6XG4gKlxuICogMS4gUHJpb3IgYXNzaXN0YW50IHR1cm5zIHdpdGggYG91dHB1dF90ZXh0YCAvIGBvdXRwdXRfKmAgY29udGVudCBwYXJ0cyDigJRcbiAqICAgIE9wZW4gUmVzcG9uc2VzIG9ubHkgYWxsb3dzIGBpbnB1dF90ZXh0YCwgYGlucHV0X2ltYWdlYCwgYGlucHV0X2ZpbGVgLFxuICogICAgYGlucHV0X2F1ZGlvYC4gTWFwIGV2ZXJ5IGBvdXRwdXRfPGtpbmQ+YCBwYXJ0IHRvIGBpbnB1dF88a2luZD5gLlxuICogMi4gUmVwbGF5ZWQgZXh0ZW5kZWQtdGhpbmtpbmcgYmxvY2tzIChgdGhpbmtpbmdgLCBgcmVkYWN0ZWRfdGhpbmtpbmdgLFxuICogICAgYHJlYXNvbmluZ2AgY29udGVudCBwYXJ0cywgYW5kIHRvcC1sZXZlbCBgcmVhc29uaW5nYCBpbnB1dCBpdGVtcykuIENsYXVkZVxuICogICAgc2lnbnMgdGhvc2U7IGFueSBjbGllbnQgcm91bmQtdHJpcCB0aGF0IG11dGF0ZXMgdGhlbSAob3IgYSBjcm9zcy1wcm92aWRlclxuICogICAgcmVwbGF5KSBmYWlscyB3aXRoIGUuZy5cbiAqICAgICAgXCJtZXNzYWdlcy5OLmNvbnRlbnQuTTogSW52YWxpZCBgZGF0YWAgaW4gYHJlZGFjdGVkX3RoaW5raW5nYCBibG9ja1wiXG4gKiAgICBTdHJpcCB0aGVtIOKAlCB0aGUgVUkvY2xpZW50IGFscmVhZHkgc2hvd2VkIHRoZSB0aGlua2luZzsgcmVwbGF5IGRvZXMgbm90XG4gKiAgICBuZWVkIHRoZSBzaWduZWQgYmxvYi4gU2FtZSBwb2xpY3kgYXMgYXBwa2l0LW1hc3RyYSdzIHNlcnZpbmcgc2FuaXRpemUuXG4gKlxuICogUmV0dXJucyBhIHNoYWxsb3cgY29weSB3aGVuIGFueXRoaW5nIGNoYW5nZXM7IG90aGVyd2lzZSB0aGUgaW5wdXQgYm9keS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplT3BlblJlc3BvbnNlc0lucHV0KGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoYm9keS5pbnB1dCkgfHwgYm9keS5pbnB1dC5sZW5ndGggPT09IDApIHJldHVybiBib2R5O1xuXG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGNvbnN0IGlucHV0OiB1bmtub3duW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJhdyBvZiBib2R5LmlucHV0KSB7XG4gICAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gXCJvYmplY3RcIikge1xuICAgICAgaW5wdXQucHVzaChyYXcpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGl0ZW0gPSByYXcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAvLyBUb3AtbGV2ZWwgUmVzcG9uc2VzIHJlYXNvbmluZyBpdGVtcyAobm90IG1lc3NhZ2UgY29udGVudCBwYXJ0cykuXG4gICAgaWYgKHR5cGVvZiBpdGVtLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgUkVBU09OSU5HX1RZUEVTLmhhcyhpdGVtLnR5cGUpKSB7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghQXJyYXkuaXNBcnJheShpdGVtLmNvbnRlbnQpKSB7XG4gICAgICBpbnB1dC5wdXNoKHJhdyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBsZXQgcGFydENoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCBjb250ZW50OiB1bmtub3duW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgaXRlbS5jb250ZW50KSB7XG4gICAgICBpZiAoIXBhcnQgfHwgdHlwZW9mIHBhcnQgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgY29udGVudC5wdXNoKHBhcnQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHAgPSBwYXJ0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgaWYgKHR5cGVvZiBwLnR5cGUgPT09IFwic3RyaW5nXCIgJiYgUkVBU09OSU5HX1RZUEVTLmhhcyhwLnR5cGUpKSB7XG4gICAgICAgIHBhcnRDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHAudHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBwLnR5cGUuc3RhcnRzV2l0aChcIm91dHB1dF9cIikpIHtcbiAgICAgICAgcGFydENoYW5nZWQgPSB0cnVlO1xuICAgICAgICBjb250ZW50LnB1c2goeyAuLi5wLCB0eXBlOiBgaW5wdXRfJHtwLnR5cGUuc2xpY2UoXCJvdXRwdXRfXCIubGVuZ3RoKX1gIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQucHVzaChwYXJ0KTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcnRDaGFuZ2VkKSB7XG4gICAgICBpbnB1dC5wdXNoKHJhdyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY2hhbmdlZCA9IHRydWU7XG4gICAgLy8gRHJvcCBhc3Npc3RhbnQgdHVybnMgdGhhdCBvbmx5IGNhcnJpZWQgdGhpbmtpbmcgKG5vdGhpbmcgbGVmdCB0byByZXBsYXkpLlxuICAgIGlmIChjb250ZW50Lmxlbmd0aCA9PT0gMCAmJiBpdGVtLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIGNvbnRpbnVlO1xuICAgIGlucHV0LnB1c2goeyAuLi5pdGVtLCBjb250ZW50IH0pO1xuICB9XG5cbiAgcmV0dXJuIGNoYW5nZWQgPyB7IC4uLmJvZHksIGlucHV0IH0gOiBib2R5O1xufVxuXG4vKipcbiAqIERyb3AgdHJhaWxpbmcgYXNzaXN0YW50IHR1cm5zIHNvIHRoZSB0cmFuc2NyaXB0IGVuZHMgb24gc29tZXRoaW5nIEFudGhyb3BpY1xuICogd2lsbCBjb250aW51ZSBmcm9tLlxuICpcbiAqIERhdGFicmlja3MgT3BlbiBSZXNwb25zZXMgcmVqZWN0cyBhIGJvZHkgd2hvc2UgbGFzdCBpdGVtIGlzIGFuIGFzc2lzdGFudFxuICogbWVzc2FnZSB3aXRoIGBcIlRoaXMgbW9kZWwgZG9lcyBub3Qgc3VwcG9ydCBhc3Npc3RhbnQgbWVzc2FnZSBwcmVmaWxsLiBUaGVcbiAqIGNvbnZlcnNhdGlvbiBtdXN0IGVuZCB3aXRoIGEgdXNlciBtZXNzYWdlLlwiYCAodGhlIHVwc3RyZWFtIEJlZHJvY2sgcm91dGVcbiAqIGRpc2FsbG93cyBwcmVmaWxsKS4gVHdvIHdheXMgYSByZWFsIGNsaWVudCBoaXRzIGl0OlxuICpcbiAqIDEuIFRoZSBjbGllbnQgcmVwbGF5cyBpdHMgb3duIGxhc3QgYW5zd2VyLiBUaGUgQ29kZXggQ0xJIGRvZXMgdGhpcyB3aGVuIGEgdHVyblxuICogICAgZW5kcyB3aXRob3V0IGEgdG9vbCBjYWxsIGFuZCB0aGUgbmV4dCByZXF1ZXN0IGNhcnJpZXMgdGhlIGZ1bGwgdHJhbnNjcmlwdC5cbiAqIDIuIHtAbGluayBzYW5pdGl6ZU9wZW5SZXNwb25zZXNJbnB1dH0gQ1JFQVRFUyB0aGUgc2hhcGU6IGEgdHVybiB0aGF0IGVuZGVkIGluIGFcbiAqICAgIGByZWFzb25pbmdgIGl0ZW0gaXMgc3RyaXBwZWQgZm9yIHJlcGxheSBjb21wYXRpYmlsaXR5LCBwcm9tb3RpbmcgdGhlXG4gKiAgICBhc3Npc3RhbnQgbWVzc2FnZSBiZWZvcmUgaXQgdG8gbGFzdC4gUnVubmluZyB0aGlzIHJlcGFpciBhZnRlciB0aGF0IHN0cmlwXG4gKiAgICBpcyB3aGF0IGtlZXBzIG9uZSBmaXggZnJvbSBjYXVzaW5nIHRoZSBvdGhlciBmYWlsdXJlLlxuICpcbiAqIERyb3BwaW5nIGlzIGNvcnJlY3QgcmF0aGVyIHRoYW4gbG9zc3k6IGEgdHJhaWxpbmcgYXNzaXN0YW50IHR1cm4gY2FycmllcyB0ZXh0XG4gKiB0aGUgbW9kZWwgaXRzZWxmIGp1c3QgcHJvZHVjZWQsIHNvIGl0IGlzIGNvbnRleHQgdGhlIHByb3ZpZGVyIGRvZXMgbm90IG5lZWRcbiAqIHJlcGVhdGVkIGluIG9yZGVyIHRvIGNvbnRpbnVlLiBBcHBlbmRpbmcgYSBzeW50aGV0aWMgYFwiQ29udGludWUuXCJgIHVzZXIgdHVyblxuICogYWxzbyBzYXRpc2ZpZXMgdGhlIHByb3ZpZGVyLCBidXQgaXQgcHV0cyB3b3JkcyBpbiB0aGUgdXNlcidzIG1vdXRoIHRoYXQgc2hvd1xuICogdXAgaW4gdGhlIG1vZGVsJ3MgY29udGV4dCwgc28gdGhpcyB0YWtlcyB0aGUgaG9uZXN0IG9wdGlvbi5cbiAqXG4gKiBBIHRyYWlsaW5nIGBmdW5jdGlvbl9jYWxsYCBpcyBsZWZ0IEFMT05FLiBJdCBpcyBhbHNvIGFuIGFzc2lzdGFudC1zaWRlIGl0ZW0sXG4gKiBidXQgQW50aHJvcGljIHJlamVjdHMgYW4gdW5hbnN3ZXJlZCBgdG9vbF91c2VgIG9uIGEgZGlmZmVyZW50IHJ1bGVcbiAqIChgdG9vbF91c2VgIGlkcyB3aXRob3V0IGB0b29sX3Jlc3VsdGApLCBhbmQgZHJvcHBpbmcgaXQgd291bGQgc2lsZW50bHkgZGlzY2FyZFxuICogYSB0b29sIGNhbGwgdGhlIGNsaWVudCBpcyBhYm91dCB0byBhbnN3ZXIuIFRoYXQgaXMgdGhlIGNsaWVudCdzIGJ1ZyB0byBmaXgsXG4gKiBub3Qgc29tZXRoaW5nIHRvIHBhcGVyIG92ZXIgaGVyZS5cbiAqXG4gKiBSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IHdoZW4gYW55dGhpbmcgY2hhbmdlczsgb3RoZXJ3aXNlIHRoZSBpbnB1dCBib2R5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwYWlyVHJhaWxpbmdBc3Npc3RhbnRJbnB1dChcbiAgYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICghQXJyYXkuaXNBcnJheShib2R5LmlucHV0KSB8fCBib2R5LmlucHV0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGJvZHk7XG5cbiAgY29uc3QgaW5wdXQgPSBbLi4uYm9keS5pbnB1dF07XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIC8vIEEgbG9vcCwgbm90IG9uZSBjaGVjazogc3RyaXBwaW5nIHJlYXNvbmluZyBjYW4gbGVhdmUgc2V2ZXJhbCBhc3Npc3RhbnRcbiAgLy8gdHVybnMgaW4gYSByb3cgYXQgdGhlIGVuZC5cbiAgd2hpbGUgKGlucHV0Lmxlbmd0aCA+IDAgJiYgaXNBc3Npc3RhbnRNZXNzYWdlSXRlbShpbnB1dFtpbnB1dC5sZW5ndGggLSAxXSkpIHtcbiAgICBpbnB1dC5wb3AoKTtcbiAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgfVxuICAvLyBOZXZlciBzZW5kIGFuIGVtcHR5IGBpbnB1dGA6IGFuIGFsbC1hc3Npc3RhbnQgdHJhbnNjcmlwdCBpcyBub3Qgc29tZXRoaW5nXG4gIC8vIHRoaXMgcmVwYWlyIGNhbiByZXNjdWUsIHNvIGxlYXZlIHRoZSBib2R5IGZvciB0aGUgcHJvdmlkZXIgdG8gcmVqZWN0IHdpdGhcbiAgLy8gaXRzIG93biBtZXNzYWdlIHJhdGhlciB0aGFuIGludmVudGluZyBhIHJlcXVlc3QuXG4gIGlmICghY2hhbmdlZCB8fCBpbnB1dC5sZW5ndGggPT09IDApIHJldHVybiBib2R5O1xuICByZXR1cm4geyAuLi5ib2R5LCBpbnB1dCB9O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYW4gYGlucHV0YCBpdGVtIGlzIGFuIGFzc2lzdGFudCBNRVNTQUdFICh0aGUgcHJlZmlsbCB0cmlnZ2VyKSwgYXNcbiAqIG9wcG9zZWQgdG8gYSBgZnVuY3Rpb25fY2FsbGAgb3IgYW55IG90aGVyIGFzc2lzdGFudC1zaWRlIGl0ZW0gdHlwZS5cbiAqL1xuZnVuY3Rpb24gaXNBc3Npc3RhbnRNZXNzYWdlSXRlbSh2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBpdGVtID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmIChpdGVtLnJvbGUgIT09IFwiYXNzaXN0YW50XCIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGl0ZW0udHlwZSA9PT0gdW5kZWZpbmVkIHx8IGl0ZW0udHlwZSA9PT0gXCJtZXNzYWdlXCI7XG59XG5cbi8qKlxuICogRnVsbCBPcGVuIFJlc3BvbnNlcyByZXF1ZXN0IHNhbml0aXplcjogc3RyaXAgbm9uLWBmdW5jdGlvbmAgdG9vbHMsIHJld3JpdGVcbiAqIGBvdXRwdXRfKmAgY29udGVudCBwYXJ0cywgZHJvcCB0aGlua2luZyAvIHJlYXNvbmluZyBibG9ja3MsIGFuZCBkcm9wIGFcbiAqIHRyYWlsaW5nIGFzc2lzdGFudCB0dXJuIHRoZSBwcm92aWRlciB3b3VsZCByZWFkIGFzIGEgcHJlZmlsbC4gU2FmZSBuby1vcFxuICogd2hlbiBub3RoaW5nIG5lZWRzIGNoYW5naW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVPcGVuUmVzcG9uc2VzUmVxdWVzdChcbiAgYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiByZXBhaXJUcmFpbGluZ0Fzc2lzdGFudElucHV0KHNhbml0aXplT3BlblJlc3BvbnNlc0lucHV0KHNhbml0aXplUmVzcG9uc2VzVG9vbHMoYm9keSkpKTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "repository": {
4
4
  "type": "git",
5
5
  "url": "git+https://github.com/reggie-db/dbx-tools.git",
6
- "directory": "packages/shared/model"
6
+ "directory": "packages/js/shared/model"
7
7
  },
8
8
  "scripts": {
9
9
  "build": "projen build",
@@ -23,7 +23,7 @@
23
23
  "typescript": "^5.9.3"
24
24
  },
25
25
  "dependencies": {
26
- "@dbx-tools/shared-core": "0.6.73",
26
+ "@dbx-tools/shared-core": "0.6.75",
27
27
  "zod": "4.3.6"
28
28
  },
29
29
  "main": "./lib/index.js",
@@ -40,7 +40,7 @@
40
40
  "./package.json": "./package.json"
41
41
  }
42
42
  },
43
- "version": "0.6.73",
43
+ "version": "0.6.75",
44
44
  "types": "./lib/index.d.ts",
45
45
  "type": "module",
46
46
  "exports": {
@@ -32,6 +32,9 @@
32
32
  * - {@link sanitizeOpenResponsesInput} rewrites `output_*` content part types
33
33
  * in `input` to `input_*`, and drops Claude thinking / reasoning blocks
34
34
  * that Open Responses rejects on replay (`redacted_thinking`, …).
35
+ * - {@link repairTrailingAssistantInput} drops a trailing assistant turn that
36
+ * Anthropic reads as a prefill request, the Responses-side counterpart to
37
+ * `@dbx-tools/appkit-mastra`'s `repairAssistantPrefill`.
35
38
  *
36
39
  * Only the surface real clients exercise is translated; unknown fields are
37
40
  * ignored rather than rejected, so a newer client degrades instead of breaking.
@@ -755,13 +758,75 @@ export function sanitizeOpenResponsesInput(body: Record<string, unknown>): Recor
755
758
  return changed ? { ...body, input } : body;
756
759
  }
757
760
 
761
+ /**
762
+ * Drop trailing assistant turns so the transcript ends on something Anthropic
763
+ * will continue from.
764
+ *
765
+ * Databricks Open Responses rejects a body whose last item is an assistant
766
+ * message with `"This model does not support assistant message prefill. The
767
+ * conversation must end with a user message."` (the upstream Bedrock route
768
+ * disallows prefill). Two ways a real client hits it:
769
+ *
770
+ * 1. The client replays its own last answer. The Codex CLI does this when a turn
771
+ * ends without a tool call and the next request carries the full transcript.
772
+ * 2. {@link sanitizeOpenResponsesInput} CREATES the shape: a turn that ended in a
773
+ * `reasoning` item is stripped for replay compatibility, promoting the
774
+ * assistant message before it to last. Running this repair after that strip
775
+ * is what keeps one fix from causing the other failure.
776
+ *
777
+ * Dropping is correct rather than lossy: a trailing assistant turn carries text
778
+ * the model itself just produced, so it is context the provider does not need
779
+ * repeated in order to continue. Appending a synthetic `"Continue."` user turn
780
+ * also satisfies the provider, but it puts words in the user's mouth that show
781
+ * up in the model's context, so this takes the honest option.
782
+ *
783
+ * A trailing `function_call` is left ALONE. It is also an assistant-side item,
784
+ * but Anthropic rejects an unanswered `tool_use` on a different rule
785
+ * (`tool_use` ids without `tool_result`), and dropping it would silently discard
786
+ * a tool call the client is about to answer. That is the client's bug to fix,
787
+ * not something to paper over here.
788
+ *
789
+ * Returns a shallow copy when anything changes; otherwise the input body.
790
+ */
791
+ export function repairTrailingAssistantInput(
792
+ body: Record<string, unknown>,
793
+ ): Record<string, unknown> {
794
+ if (!Array.isArray(body.input) || body.input.length === 0) return body;
795
+
796
+ const input = [...body.input];
797
+ let changed = false;
798
+ // A loop, not one check: stripping reasoning can leave several assistant
799
+ // turns in a row at the end.
800
+ while (input.length > 0 && isAssistantMessageItem(input[input.length - 1])) {
801
+ input.pop();
802
+ changed = true;
803
+ }
804
+ // Never send an empty `input`: an all-assistant transcript is not something
805
+ // this repair can rescue, so leave the body for the provider to reject with
806
+ // its own message rather than inventing a request.
807
+ if (!changed || input.length === 0) return body;
808
+ return { ...body, input };
809
+ }
810
+
811
+ /**
812
+ * Whether an `input` item is an assistant MESSAGE (the prefill trigger), as
813
+ * opposed to a `function_call` or any other assistant-side item type.
814
+ */
815
+ function isAssistantMessageItem(value: unknown): boolean {
816
+ if (!value || typeof value !== "object") return false;
817
+ const item = value as Record<string, unknown>;
818
+ if (item.role !== "assistant") return false;
819
+ return item.type === undefined || item.type === "message";
820
+ }
821
+
758
822
  /**
759
823
  * Full Open Responses request sanitizer: strip non-`function` tools, rewrite
760
- * `output_*` content parts, and drop thinking / reasoning blocks. Safe no-op
824
+ * `output_*` content parts, drop thinking / reasoning blocks, and drop a
825
+ * trailing assistant turn the provider would read as a prefill. Safe no-op
761
826
  * when nothing needs changing.
762
827
  */
763
828
  export function sanitizeOpenResponsesRequest(
764
829
  body: Record<string, unknown>,
765
830
  ): Record<string, unknown> {
766
- return sanitizeOpenResponsesInput(sanitizeResponsesTools(body));
831
+ return repairTrailingAssistantInput(sanitizeOpenResponsesInput(sanitizeResponsesTools(body)));
767
832
  }