@archont561/qgis-sdk 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { WireTransport2, BridgeClientOptions2, BridgeClient2 } from "./shared/chunk-wtv4vt4q.js";
2
- import "./shared/chunk-khemhx86.js";
3
- import { OperationMap2, StreamMap2 } from "./shared/chunk-jjx14tgd.js";
4
- import { QgisSdkCore2, QgisSdk2 } from "./shared/chunk-tmca1ynt.js";
1
+ import { WireTransport2, BridgeClientOptions2, BridgeClient2 } from "./shared/chunk-8c12nwme.js";
2
+ import "./shared/chunk-7tgzmz0m.js";
3
+ import { OperationMap2, StreamMap2, QgisSdkCore2, QgisSdk2 } from "./shared/chunk-nwz8n14x.js";
4
+ import { Store2, OperationState2, Operation2, FormState2, FormOptions2, FormStore2, HostQueryState2, HostQueryStore2, StreamTerminalLike2, StreamHandleLike2, StreamHandlersLike2, Stream2, StreamState2 } from "./shared/chunk-b11znjn6.js";
5
5
  import { QgisSdkError2 } from "./shared/chunk-pdj2fxjb.js";
6
6
  import { ReactElement, ReactNode } from "react";
7
7
  /** A hook or provider was used outside the shape it needs. */
@@ -51,18 +51,6 @@ declare function useQgisSdk<
51
51
  * Build a generated operation map once per client: `useOperations(createOperations)`.
52
52
  */
53
53
  declare function useOperations<T>(create: (client: BridgeClient2) => T): T;
54
- /** Where one invocation stands. */
55
- type OperationState<R> = {
56
- readonly status: "idle";
57
- } | {
58
- readonly status: "pending";
59
- } | {
60
- readonly status: "ok";
61
- readonly value: R;
62
- } | {
63
- readonly status: "error";
64
- readonly error: Error;
65
- };
66
54
  /** Controls beyond running: abort what is in flight, or forget the outcome. */
67
55
  interface OperationControls {
68
56
  /** Abort the in-flight call locally; the host may still run it. */
@@ -70,13 +58,8 @@ interface OperationControls {
70
58
  /** Back to `idle`, aborting anything in flight. */
71
59
  reset(): void;
72
60
  }
73
- /** An operation member of a generated map: input, optional signal, promise. */
74
- type Operation<
75
- I,
76
- R
77
- > = (input: I, options?: {
78
- readonly signal?: AbortSignal;
79
- }) => Promise<R>;
61
+ /** Read any store from a component; the snapshot is the render's value. */
62
+ declare function useStore<T>(store: Store2<T>): T;
80
63
  /**
81
64
  * Run a generated operation from a component.
82
65
  *
@@ -88,39 +71,7 @@ type Operation<
88
71
  declare function useOperation<
89
72
  I,
90
73
  R
91
- >(operation: Operation<I, R>): readonly [OperationState<R>, (input: I) => Promise<R | undefined>, OperationControls];
92
- /** How a stream ended, as the generated module reports it. */
93
- interface StreamTerminalLike {
94
- readonly kind: string;
95
- readonly message?: string;
96
- readonly dropped?: number;
97
- }
98
- /** The handle a generated stream member resolves with. */
99
- interface StreamHandleLike {
100
- readonly id: string;
101
- readonly closed: boolean;
102
- close(): void;
103
- }
104
- /** Handlers for a stream, as a generated module types them. */
105
- interface StreamHandlersLike<E> {
106
- readonly onEvent?: (event: E) => void;
107
- readonly onTerminal?: (terminal: StreamTerminalLike) => void;
108
- }
109
- /** A stream member of a generated map. */
110
- type Stream<
111
- I,
112
- E
113
- > = (input: I, handlers: StreamHandlersLike<E>, options?: {
114
- readonly signal?: AbortSignal;
115
- }) => Promise<StreamHandleLike>;
116
- /** Where one subscription stands. */
117
- interface StreamState<E> {
118
- /** `idle` with a null input, `failed` when the host refused to open it. */
119
- readonly status: "idle" | "opening" | "open" | "ended" | "failed";
120
- readonly lastEvent: E | null;
121
- readonly terminal: StreamTerminalLike | null;
122
- readonly error: Error | null;
123
- }
74
+ >(operation: Operation2<I, R>): readonly [OperationState2<R>, (input: I) => Promise<R | undefined>, OperationControls];
124
75
  /**
125
76
  * Hold a generated stream open while a component is mounted.
126
77
  *
@@ -133,5 +84,34 @@ interface StreamState<E> {
133
84
  declare function useStream<
134
85
  I,
135
86
  E
136
- >(open: Stream<I, E>, input: I | null, handlers?: StreamHandlersLike<E>): StreamState<E>;
137
- export { BridgeProvider, BridgeProviderProps, Operation, OperationControls, OperationState, QgisSdkBridgeReactError, Stream, StreamHandleLike, StreamHandlersLike, StreamState, StreamTerminalLike, useBridgeClient, useOperation, useOperations, useQgisSdk, useStream };
87
+ >(open: Stream2<I, E>, input: I | null, handlers?: StreamHandlersLike2<E>): StreamState2<E>;
88
+ /**
89
+ * The form of one declared action: `qgis.<id>` with its fields, values,
90
+ * issues and submission. The store is built once per `qgis` and `id` - the
91
+ * options are read on the first render only, like `useState`'s initial value
92
+ * - and unmounting aborts a submission in flight.
93
+ */
94
+ declare function useForm<
95
+ O,
96
+ K extends keyof O & string
97
+ >(qgis: QgisSdkCore2<O, unknown>, id: K, options?: FormOptions2): readonly [FormState2<ResultOf<O, K>>, FormStore2<RequestOf<O, K> & object, ResultOf<O, K>>];
98
+ /**
99
+ * Read a host query store: `useHostQuery(layersQuery(qgis))` for a layer
100
+ * picker. `refresh` runs once on mount when `auto` is not `false`.
101
+ */
102
+ declare function useHostQuery<T>(store: HostQueryStore2<T>, options?: {
103
+ readonly auto?: boolean;
104
+ }): readonly [HostQueryState2<T>, HostQueryStore2<T>];
105
+ type RequestOf<
106
+ O,
107
+ K extends keyof O
108
+ > = O[K] extends {
109
+ readonly request: infer Req;
110
+ } ? Req : never;
111
+ type ResultOf<
112
+ O,
113
+ K extends keyof O
114
+ > = O[K] extends {
115
+ readonly result: infer Res;
116
+ } ? Res : never;
117
+ export { BridgeProvider, BridgeProviderProps, Operation2 as Operation, OperationControls, OperationState2 as OperationState, QgisSdkBridgeReactError, Stream2 as Stream, StreamHandleLike2 as StreamHandleLike, StreamHandlersLike2 as StreamHandlersLike, StreamState2 as StreamState, StreamTerminalLike2 as StreamTerminalLike, useBridgeClient, useForm, useHostQuery, useOperation, useOperations, useQgisSdk, useStore, useStream };
package/dist/react.js CHANGED
@@ -1,8 +1,11 @@
1
1
  import {
2
- isPlainRecord,
3
- QgisSdkBridgeAbortedError2,
4
2
  BridgeClient2
5
- } from "./shared/chunk-8gawbn19.js";
3
+ } from "./shared/chunk-xg5ntw1c.js";
4
+ import {
5
+ OperationStore2,
6
+ FormStore2,
7
+ StreamStore2
8
+ } from "./shared/chunk-72sjmz60.js";
6
9
  import {
7
10
  QgisSdkError2
8
11
  } from "./shared/chunk-2hwva3a3.js";
@@ -11,12 +14,11 @@ import {
11
14
  import {
12
15
  createContext,
13
16
  createElement,
14
- useCallback,
15
17
  useContext,
16
18
  useEffect,
17
19
  useMemo,
18
- useRef,
19
- useState
20
+ useState,
21
+ useSyncExternalStore
20
22
  } from "react";
21
23
  class QgisSdkBridgeReactError extends QgisSdkError2 {
22
24
  constructor(message) {
@@ -73,142 +75,53 @@ function useOperations(create) {
73
75
  const client = useBridgeClient();
74
76
  return useMemo(() => create(client), [create, client]);
75
77
  }
76
- var IDLE = Object.freeze({ status: "idle" });
77
- var PENDING = Object.freeze({ status: "pending" });
78
+ function useStore(store) {
79
+ return useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
80
+ }
78
81
  function useOperation(operation) {
79
- const [state, setState] = useState(IDLE);
80
- const generation = useRef(0);
81
- const controller = useRef(null);
82
- const mounted = useRef(true);
83
- const abort = useCallback(() => {
84
- generation.current += 1;
85
- controller.current?.abort();
86
- controller.current = null;
87
- }, []);
82
+ const store = useMemo(() => new OperationStore2(operation), [operation]);
83
+ useEffect(() => () => store.abort(), [store]);
84
+ const state = useStore(store);
85
+ const controls = useMemo(() => ({ abort: store.abort, reset: store.reset }), [store]);
86
+ return [state, store.run, controls];
87
+ }
88
+ function useStream(open, input, handlers = {}) {
89
+ const store = useMemo(() => new StreamStore2(open), [open]);
90
+ store.setHandlers(handlers);
88
91
  useEffect(() => {
89
- mounted.current = true;
90
- return () => {
91
- mounted.current = false;
92
- abort();
93
- };
94
- }, [abort]);
95
- const run = useCallback(async (input) => {
96
- abort();
97
- const mine = generation.current;
98
- const signal = new AbortController;
99
- controller.current = signal;
100
- setState(PENDING);
101
- try {
102
- const value = await operation(input, { signal: signal.signal });
103
- if (generation.current !== mine || !mounted.current) {
104
- return;
105
- }
106
- setState({ status: "ok", value });
107
- return value;
108
- } catch (error) {
109
- if (generation.current !== mine || !mounted.current) {
110
- return;
111
- }
112
- if (error instanceof QgisSdkBridgeAbortedError2) {
113
- return;
114
- }
115
- setState({
116
- status: "error",
117
- error: error instanceof Error ? error : new Error(String(error))
118
- });
119
- return;
120
- } finally {
121
- if (controller.current === signal) {
122
- controller.current = null;
123
- }
124
- }
125
- }, [operation, abort]);
126
- const reset = useCallback(() => {
127
- abort();
128
- setState(IDLE);
129
- }, [abort]);
130
- const controls = useMemo(() => ({ abort, reset }), [abort, reset]);
131
- return [state, run, controls];
92
+ store.setInput(input);
93
+ });
94
+ useEffect(() => () => store.close(), [store]);
95
+ return useStore(store);
132
96
  }
133
- var IDLE_STREAM = Object.freeze({
134
- status: "idle",
135
- lastEvent: null,
136
- terminal: null,
137
- error: null
138
- });
139
- function stableKey(value) {
140
- return JSON.stringify(value, (_key, item) => isPlainRecord(item) ? Object.fromEntries(Object.entries(item).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)) : item);
97
+ function useForm(qgis, id, options) {
98
+ const [first] = useState(() => options ?? {});
99
+ const store = useMemo(() => new FormStore2(qgis, id, first), [qgis, id, first]);
100
+ useEffect(() => () => store.abort(), [store]);
101
+ return [useStore(store), store];
141
102
  }
142
- function useStream(open, input, handlers = {}) {
143
- const [state, setState] = useState(IDLE_STREAM);
144
- const latest = useRef(handlers);
145
- latest.current = handlers;
146
- const key = input === null ? null : stableKey(input);
147
- const inputRef = useRef(input);
148
- inputRef.current = input;
103
+ function useHostQuery(store, options = {}) {
104
+ const auto = options.auto !== false;
149
105
  useEffect(() => {
150
- if (key === null) {
151
- setState(IDLE_STREAM);
152
- return;
106
+ if (auto) {
107
+ store.refresh();
153
108
  }
154
- const current = inputRef.current;
155
- let cancelled = false;
156
- let handle = null;
157
- setState({
158
- status: "opening",
159
- lastEvent: null,
160
- terminal: null,
161
- error: null
162
- });
163
- open(current, {
164
- onEvent: (event) => {
165
- if (cancelled) {
166
- return;
167
- }
168
- latest.current.onEvent?.(event);
169
- setState((previous) => ({ ...previous, lastEvent: event }));
170
- },
171
- onTerminal: (terminal) => {
172
- if (cancelled) {
173
- return;
174
- }
175
- latest.current.onTerminal?.(terminal);
176
- setState((previous) => ({ ...previous, status: "ended", terminal }));
177
- }
178
- }).then((opened) => {
179
- if (cancelled) {
180
- opened.close();
181
- return;
182
- }
183
- handle = opened;
184
- setState((previous) => previous.status === "ended" ? previous : { ...previous, status: "open" });
185
- }, (error) => {
186
- if (cancelled) {
187
- return;
188
- }
189
- setState({
190
- status: "failed",
191
- lastEvent: null,
192
- terminal: null,
193
- error: error instanceof Error ? error : new Error(String(error))
194
- });
195
- });
196
- return () => {
197
- cancelled = true;
198
- handle?.close();
199
- };
200
- }, [open, key]);
201
- return state;
109
+ return () => store.abort();
110
+ }, [store, auto]);
111
+ return [useStore(store), store];
202
112
  }
203
113
  export {
204
114
  BridgeProvider,
205
115
  QgisSdkBridgeReactError,
206
116
  useBridgeClient,
117
+ useForm,
118
+ useHostQuery,
207
119
  useOperation,
208
120
  useOperations,
209
121
  useQgisSdk,
122
+ useStore,
210
123
  useStream
211
124
  };
212
125
 
213
- //# debugId=0FA8371D474034FF64756E2164756E21
214
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3JlYWN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8qKlxuICogVGhpbiBSZWFjdCBiaW5kaW5ncyBvdmVyIHRoZSBicmlkZ2UgY2xpZW50IChUQVNLLTE4LCBkZWNpc2lvbi0xOCkuXG4gKlxuICogVGhpcyBlbnRyeSBwb2ludCBpcyBvcHRpb25hbCBhbmQgaXMgdGhlIG9ubHkgb25lIHRoYXQgaW1wb3J0cyBSZWFjdC4gSXQgYWRkc1xuICogbm8gc2Vjb25kIGNsaWVudDogYSBjb21wb25lbnQgcmVhY2hlcyB0aGUgc2FtZSBgUWdpc1Nka2Agb3IgYEJyaWRnZUNsaWVudGAgYVxuICogdmFuaWxsYSBwYWdlIHdvdWxkIGJ1aWxkLCB0aHJvdWdoIGEgcHJvdmlkZXIgdGhhdCBpcyBoYW5kZWQgYSBgUWdpc1Nka2BcbiAqIChhbmQgbGVhdmVzIGl0IGFsb25lKSwgaXMgaGFuZGVkIGEgY2xpZW50IChzYW1lKSwgb3Igb3ducyBhIGNsaWVudCBidWlsdCBvblxuICogYSB0cmFuc3BvcnQgKGFuZCBjbG9zZXMgaXQgb24gdW5tb3VudCkuIFRoZSBob29rcyB0YWtlIHRoZSBtZXRob2RzIGFcbiAqIGBRZ2lzU2RrYCBhbHJlYWR5IGhhcyAtIGBxZ2lzLnNpdGVzLnN1bW1hcnlgLCBgcWdpcy5zaXRlcy53YXRjaGAgLSBzb1xuICogdGhlIHR5cGVkIGNvbnRyYWN0IGlzIHRoZSBnZW5lcmF0ZWQgb25lLCBub3QgYSBSZWFjdCBjb3B5IG9mIGl0LlxuICpcbiAqIFdoYXQgdGhlIGhvb2tzIGFkZCBpcyBsaWZldGltZTogYSBjYWxsIGFib3J0ZWQgd2hlbiBpdHMgY29tcG9uZW50IHVubW91bnRzLFxuICogYSBzdGFsZSByZXBseSBpZ25vcmVkLCBhIHN0cmVhbSBjbG9zZWQgb24gdW5tb3VudCBvciB3aGVuIGl0cyBpbnB1dCBjaGFuZ2VzLFxuICogYW5kIGEgc2ltdWxhdGVkIFN0cmljdE1vZGUgcmVtb3VudCB0aGF0IGxlYXZlcyBleGFjdGx5IG9uZSBvZiBlYWNoLlxuICovXG5cbmltcG9ydCB7XG5cdGNyZWF0ZUNvbnRleHQsXG5cdGNyZWF0ZUVsZW1lbnQsXG5cdHR5cGUgUmVhY3RFbGVtZW50LFxuXHR0eXBlIFJlYWN0Tm9kZSxcblx0dXNlQ2FsbGJhY2ssXG5cdHVzZUNvbnRleHQsXG5cdHVzZUVmZmVjdCxcblx0dXNlTWVtbyxcblx0dXNlUmVmLFxuXHR1c2VTdGF0ZSxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQge1xuXHRCcmlkZ2VDbGllbnQsXG5cdHR5cGUgQnJpZGdlQ2xpZW50T3B0aW9ucyxcblx0UWdpc1Nka0JyaWRnZUFib3J0ZWRFcnJvcixcblx0dHlwZSBXaXJlVHJhbnNwb3J0LFxufSBmcm9tIFwiLi9icmlkZ2VcIjtcbmltcG9ydCB7IFFnaXNTZGtFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgaXNQbGFpblJlY29yZCB9IGZyb20gXCIuL2ludGVybmFsXCI7XG5pbXBvcnQgdHlwZSB7IFFnaXNTZGssIFFnaXNTZGtDb3JlIH0gZnJvbSBcIi4vcWdpcy1zZGtcIjtcbmltcG9ydCB0eXBlIHsgT3BlcmF0aW9uTWFwLCBTdHJlYW1NYXAgfSBmcm9tIFwiLi9zY2hlbWFcIjtcblxuLyoqIEEgaG9vayBvciBwcm92aWRlciB3YXMgdXNlZCBvdXRzaWRlIHRoZSBzaGFwZSBpdCBuZWVkcy4gKi9cbmV4cG9ydCBjbGFzcyBRZ2lzU2RrQnJpZGdlUmVhY3RFcnJvciBleHRlbmRzIFFnaXNTZGtFcnJvciB7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcblx0XHRzdXBlcihtZXNzYWdlLCBcInJlYWN0X2JpbmRpbmdcIik7XG5cdH1cbn1cblxuaW50ZXJmYWNlIFNoYXJlZCB7XG5cdHJlYWRvbmx5IGNsaWVudDogQnJpZGdlQ2xpZW50O1xuXHRyZWFkb25seSBxZ2lzOiBRZ2lzU2RrQ29yZTx1bmtub3duLCB1bmtub3duPiB8IG51bGw7XG59XG5cbmNvbnN0IENsaWVudENvbnRleHQgPSBjcmVhdGVDb250ZXh0PFNoYXJlZCB8IG51bGw+KG51bGwpO1xuXG4vKiogUHJvcHMgZm9yIHtAbGluayBCcmlkZ2VQcm92aWRlcn06IGV4YWN0bHkgb25lIG9mIGBxZ2lzYCwgYGNsaWVudGAgb3IgYHRyYW5zcG9ydGAuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyaWRnZVByb3ZpZGVyUHJvcHMge1xuXHQvKipcblx0ICogQSBgUWdpc1Nka2AgdGhlIHBhZ2UgYnVpbHQsIHdoYXRldmVyIGl0cyBzY2hlbWE7IHRoZSBwcm92aWRlciBzaGFyZXMgaXRcblx0ICogYW5kIG5ldmVyIGNsb3NlcyBpdC4gYHVzZVFnaXNTZGtgIGhhbmRzIGl0IGJhY2sgdW5kZXIgdGhlIHBhZ2UncyB0eXBlcy5cblx0ICovXG5cdHJlYWRvbmx5IHFnaXM/OiBRZ2lzU2RrQ29yZTx1bmtub3duLCB1bmtub3duPjtcblx0LyoqIEEgY2xpZW50IHRoZSBjYWxsZXIgb3duczsgdGhlIHByb3ZpZGVyIG5ldmVyIGNsb3NlcyBpdC4gKi9cblx0cmVhZG9ubHkgY2xpZW50PzogQnJpZGdlQ2xpZW50O1xuXHQvKiogQSB0cmFuc3BvcnQgdGhlIHByb3ZpZGVyIGJ1aWxkcyBhbmQgb3ducyBhIGNsaWVudCBmb3IuICovXG5cdHJlYWRvbmx5IHRyYW5zcG9ydD86IFdpcmVUcmFuc3BvcnQ7XG5cdC8qKiBPcHRpb25zIGZvciB0aGUgb3duZWQgY2xpZW50OyBpZ25vcmVkIHdoZW4gYGNsaWVudGAgaXMgZ2l2ZW4uICovXG5cdHJlYWRvbmx5IG9wdGlvbnM/OiBCcmlkZ2VDbGllbnRPcHRpb25zO1xuXHRyZWFkb25seSBjaGlsZHJlbj86IFJlYWN0Tm9kZTtcbn1cblxuLyoqXG4gKiBTaGFyZSBvbmUgY2xpZW50IHdpdGggYSBzdWJ0cmVlLlxuICpcbiAqIEFuIG93bmVkIGNsaWVudCBpcyBjcmVhdGVkIGluIGFuIGVmZmVjdCwgbmV2ZXIgZHVyaW5nIHJlbmRlciwgYmVjYXVzZVxuICogU3RyaWN0TW9kZSByZW5kZXJzIHR3aWNlIGFuZCBhIGNsaWVudCBtYWRlIGluIHJlbmRlciB3b3VsZCBsZWF2ZSBhIHNlY29uZFxuICogbGlzdGVuZXIgb24gdGhlIHRyYW5zcG9ydC4gVW50aWwgdGhhdCBlZmZlY3QgaGFzIHJ1biB0aGUgc3VidHJlZSBpcyBub3RcbiAqIHJlbmRlcmVkLCB3aGljaCBpcyBvbmUgdGljay4gU3RyaWN0TW9kZSdzIHNpbXVsYXRlZCB1bm1vdW50IGNsb3NlcyB0aGVcbiAqIG93bmVkIGNsaWVudCBhbmQgdGhlIGVmZmVjdCB0aGF0IGZvbGxvd3MgbWFrZXMgYSBuZXcgb25lLCBzbyB0aGUgc3VidHJlZVxuICogbmV2ZXIgaG9sZHMgYSBkZWFkIGNsaWVudC4gVGhlIHRyYW5zcG9ydCBtdXN0IGJlIHN0YWJsZSBhY3Jvc3MgcmVuZGVyczsgdG9cbiAqIHN3YXAgaXQsIGNoYW5nZSB0aGUgcHJvdmlkZXIncyBga2V5YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJyaWRnZVByb3ZpZGVyKHByb3BzOiBCcmlkZ2VQcm92aWRlclByb3BzKTogUmVhY3RFbGVtZW50IHtcblx0Y29uc3QgeyBxZ2lzLCBjbGllbnQsIHRyYW5zcG9ydCwgb3B0aW9ucywgY2hpbGRyZW4gfSA9IHByb3BzO1xuXHRjb25zdCBnaXZlbiA9IFtxZ2lzLCBjbGllbnQsIHRyYW5zcG9ydF0uZmlsdGVyKFxuXHRcdChzb3VyY2UpID0+IHNvdXJjZSAhPT0gdW5kZWZpbmVkLFxuXHQpLmxlbmd0aDtcblx0aWYgKGdpdmVuICE9PSAxKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VSZWFjdEVycm9yKFxuXHRcdFx0XCJCcmlkZ2VQcm92aWRlciBuZWVkcyBleGFjdGx5IG9uZSBvZiBxZ2lzLCBjbGllbnQgb3IgdHJhbnNwb3J0XCIsXG5cdFx0KTtcblx0fVxuXHRjb25zdCB0aW1lb3V0TXMgPSBvcHRpb25zPy50aW1lb3V0TXM7XG5cdGNvbnN0IFtvd25lZCwgc2V0T3duZWRdID0gdXNlU3RhdGU8QnJpZGdlQ2xpZW50IHwgbnVsbD4obnVsbCk7XG5cdHVzZUVmZmVjdCgoKSA9PiB7XG5cdFx0aWYgKHRyYW5zcG9ydCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRjb25zdCBsaXZlID0gbmV3IEJyaWRnZUNsaWVudChcblx0XHRcdHRyYW5zcG9ydCxcblx0XHRcdHRpbWVvdXRNcyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IHRpbWVvdXRNcyB9LFxuXHRcdCk7XG5cdFx0c2V0T3duZWQobGl2ZSk7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGxpdmUuY2xvc2UoKTtcblx0XHRcdHNldE93bmVkKChjdXJyZW50KSA9PiAoY3VycmVudCA9PT0gbGl2ZSA/IG51bGwgOiBjdXJyZW50KSk7XG5cdFx0fTtcblx0fSwgW3RyYW5zcG9ydCwgdGltZW91dE1zXSk7XG5cdGNvbnN0IHZhbHVlID0gdXNlTWVtbygoKTogU2hhcmVkIHwgbnVsbCA9PiB7XG5cdFx0aWYgKHFnaXMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHsgY2xpZW50OiBxZ2lzLmNsaWVudCwgcWdpcyB9O1xuXHRcdH1cblx0XHRjb25zdCBsaXZlID0gY2xpZW50ID8/IG93bmVkO1xuXHRcdHJldHVybiBsaXZlID09PSBudWxsID8gbnVsbCA6IHsgY2xpZW50OiBsaXZlLCBxZ2lzOiBudWxsIH07XG5cdH0sIFtxZ2lzLCBjbGllbnQsIG93bmVkXSk7XG5cdHJldHVybiBjcmVhdGVFbGVtZW50KFxuXHRcdENsaWVudENvbnRleHQuUHJvdmlkZXIsXG5cdFx0eyB2YWx1ZSB9LFxuXHRcdHZhbHVlID09PSBudWxsID8gbnVsbCA6IGNoaWxkcmVuLFxuXHQpO1xufVxuXG5mdW5jdGlvbiB1c2VTaGFyZWQoaG9vazogc3RyaW5nKTogU2hhcmVkIHtcblx0Y29uc3Qgc2hhcmVkID0gdXNlQ29udGV4dChDbGllbnRDb250ZXh0KTtcblx0aWYgKHNoYXJlZCA9PT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlUmVhY3RFcnJvcihcblx0XHRcdGAke2hvb2t9IG5lZWRzIGEgQnJpZGdlUHJvdmlkZXIgYWJvdmUgaXRgLFxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHNoYXJlZDtcbn1cblxuLyoqIFRoZSBjbGllbnQgb2YgdGhlIG5lYXJlc3Qge0BsaW5rIEJyaWRnZVByb3ZpZGVyfS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VCcmlkZ2VDbGllbnQoKTogQnJpZGdlQ2xpZW50IHtcblx0cmV0dXJuIHVzZVNoYXJlZChcInVzZUJyaWRnZUNsaWVudFwiKS5jbGllbnQ7XG59XG5cbi8qKlxuICogVGhlIGBRZ2lzU2RrYCBvZiB0aGUgbmVhcmVzdCB7QGxpbmsgQnJpZGdlUHJvdmlkZXJ9LlxuICpcbiAqIFRoZSB0eXBlIHBhcmFtZXRlcnMgbmFtZSB0aGUgZ2VuZXJhdGVkIGBPcGVyYXRpb25zYCBhbmQgYFN0cmVhbXNgOyB0aGV5IGFyZVxuICogdGhlIGNhbGxlcidzIGNsYWltLCB0aGUgc2FtZSB3YXkgdGhlIHByb3ZpZGVyJ3MgYHFnaXNgIHByb3Agd2FzIHRoZSBwYWdlJ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VRZ2lzU2RrPE8gPSBPcGVyYXRpb25NYXAsIFMgPSBTdHJlYW1NYXA+KCk6IFFnaXNTZGs8TywgUz4ge1xuXHRjb25zdCBzaGFyZWQgPSB1c2VTaGFyZWQoXCJ1c2VRZ2lzU2RrXCIpO1xuXHRpZiAoc2hhcmVkLnFnaXMgPT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZVJlYWN0RXJyb3IoXG5cdFx0XHRcInVzZVFnaXNTZGsgbmVlZHMgYSBCcmlkZ2VQcm92aWRlciBnaXZlbiBhIHFnaXMgaW5zdGFuY2VcIixcblx0XHQpO1xuXHR9XG5cdHJldHVybiBzaGFyZWQucWdpcyBhcyB1bmtub3duIGFzIFFnaXNTZGs8TywgUz47XG59XG5cbi8qKlxuICogQnVpbGQgYSBnZW5lcmF0ZWQgb3BlcmF0aW9uIG1hcCBvbmNlIHBlciBjbGllbnQ6IGB1c2VPcGVyYXRpb25zKGNyZWF0ZU9wZXJhdGlvbnMpYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU9wZXJhdGlvbnM8VD4oY3JlYXRlOiAoY2xpZW50OiBCcmlkZ2VDbGllbnQpID0+IFQpOiBUIHtcblx0Y29uc3QgY2xpZW50ID0gdXNlQnJpZGdlQ2xpZW50KCk7XG5cdHJldHVybiB1c2VNZW1vKCgpID0+IGNyZWF0ZShjbGllbnQpLCBbY3JlYXRlLCBjbGllbnRdKTtcbn1cblxuLyoqIFdoZXJlIG9uZSBpbnZvY2F0aW9uIHN0YW5kcy4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvblN0YXRlPFI+ID1cblx0fCB7IHJlYWRvbmx5IHN0YXR1czogXCJpZGxlXCIgfVxuXHR8IHsgcmVhZG9ubHkgc3RhdHVzOiBcInBlbmRpbmdcIiB9XG5cdHwgeyByZWFkb25seSBzdGF0dXM6IFwib2tcIjsgcmVhZG9ubHkgdmFsdWU6IFIgfVxuXHR8IHsgcmVhZG9ubHkgc3RhdHVzOiBcImVycm9yXCI7IHJlYWRvbmx5IGVycm9yOiBFcnJvciB9O1xuXG4vKiogQ29udHJvbHMgYmV5b25kIHJ1bm5pbmc6IGFib3J0IHdoYXQgaXMgaW4gZmxpZ2h0LCBvciBmb3JnZXQgdGhlIG91dGNvbWUuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbkNvbnRyb2xzIHtcblx0LyoqIEFib3J0IHRoZSBpbi1mbGlnaHQgY2FsbCBsb2NhbGx5OyB0aGUgaG9zdCBtYXkgc3RpbGwgcnVuIGl0LiAqL1xuXHRhYm9ydCgpOiB2b2lkO1xuXHQvKiogQmFjayB0byBgaWRsZWAsIGFib3J0aW5nIGFueXRoaW5nIGluIGZsaWdodC4gKi9cblx0cmVzZXQoKTogdm9pZDtcbn1cblxuLyoqIEFuIG9wZXJhdGlvbiBtZW1iZXIgb2YgYSBnZW5lcmF0ZWQgbWFwOiBpbnB1dCwgb3B0aW9uYWwgc2lnbmFsLCBwcm9taXNlLiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uPEksIFI+ID0gKFxuXHRpbnB1dDogSSxcblx0b3B0aW9ucz86IHsgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWwgfSxcbikgPT4gUHJvbWlzZTxSPjtcblxuY29uc3QgSURMRTogT3BlcmF0aW9uU3RhdGU8bmV2ZXI+ID0gT2JqZWN0LmZyZWV6ZSh7IHN0YXR1czogXCJpZGxlXCIgfSk7XG5jb25zdCBQRU5ESU5HOiBPcGVyYXRpb25TdGF0ZTxuZXZlcj4gPSBPYmplY3QuZnJlZXplKHsgc3RhdHVzOiBcInBlbmRpbmdcIiB9KTtcblxuLyoqXG4gKiBSdW4gYSBnZW5lcmF0ZWQgb3BlcmF0aW9uIGZyb20gYSBjb21wb25lbnQuXG4gKlxuICogYHJ1bmAgcmVzb2x2ZXMgd2l0aCB0aGUgdmFsdWUsIG9yIHdpdGggYHVuZGVmaW5lZGAgd2hlbiB0aGUgY2FsbCBmYWlsZWQsIHdhc1xuICogYWJvcnRlZCBvciB3YXMgc3VwZXJzZWRlZCBieSBhIGxhdGVyIHJ1biAtIHRoZSBzdGF0ZSBjYXJyaWVzIHRoZSBlcnJvciwgc29cbiAqIHRoZSBwcm9taXNlIG5ldmVyIHJlamVjdHMgaW50byBhbiBldmVudCBoYW5kbGVyLiBPbmx5IHRoZSBsYXRlc3QgcnVuIGNhblxuICogY2hhbmdlIHRoZSBzdGF0ZTsgdW5tb3VudGluZyBhYm9ydHMgd2hhdGV2ZXIgaXMgaW4gZmxpZ2h0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlT3BlcmF0aW9uPEksIFI+KFxuXHRvcGVyYXRpb246IE9wZXJhdGlvbjxJLCBSPixcbik6IHJlYWRvbmx5IFtcblx0T3BlcmF0aW9uU3RhdGU8Uj4sXG5cdChpbnB1dDogSSkgPT4gUHJvbWlzZTxSIHwgdW5kZWZpbmVkPixcblx0T3BlcmF0aW9uQ29udHJvbHMsXG5dIHtcblx0Y29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSB1c2VTdGF0ZTxPcGVyYXRpb25TdGF0ZTxSPj4oSURMRSk7XG5cdGNvbnN0IGdlbmVyYXRpb24gPSB1c2VSZWYoMCk7XG5cdGNvbnN0IGNvbnRyb2xsZXIgPSB1c2VSZWY8QWJvcnRDb250cm9sbGVyIHwgbnVsbD4obnVsbCk7XG5cdGNvbnN0IG1vdW50ZWQgPSB1c2VSZWYodHJ1ZSk7XG5cblx0Y29uc3QgYWJvcnQgPSB1c2VDYWxsYmFjaygoKTogdm9pZCA9PiB7XG5cdFx0Z2VuZXJhdGlvbi5jdXJyZW50ICs9IDE7XG5cdFx0Y29udHJvbGxlci5jdXJyZW50Py5hYm9ydCgpO1xuXHRcdGNvbnRyb2xsZXIuY3VycmVudCA9IG51bGw7XG5cdH0sIFtdKTtcblxuXHR1c2VFZmZlY3QoKCkgPT4ge1xuXHRcdG1vdW50ZWQuY3VycmVudCA9IHRydWU7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdG1vdW50ZWQuY3VycmVudCA9IGZhbHNlO1xuXHRcdFx0YWJvcnQoKTtcblx0XHR9O1xuXHR9LCBbYWJvcnRdKTtcblxuXHRjb25zdCBydW4gPSB1c2VDYWxsYmFjayhcblx0XHRhc3luYyAoaW5wdXQ6IEkpOiBQcm9taXNlPFIgfCB1bmRlZmluZWQ+ID0+IHtcblx0XHRcdGFib3J0KCk7XG5cdFx0XHRjb25zdCBtaW5lID0gZ2VuZXJhdGlvbi5jdXJyZW50O1xuXHRcdFx0Y29uc3Qgc2lnbmFsID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXHRcdFx0Y29udHJvbGxlci5jdXJyZW50ID0gc2lnbmFsO1xuXHRcdFx0c2V0U3RhdGUoUEVORElORyk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IGF3YWl0IG9wZXJhdGlvbihpbnB1dCwgeyBzaWduYWw6IHNpZ25hbC5zaWduYWwgfSk7XG5cdFx0XHRcdGlmIChnZW5lcmF0aW9uLmN1cnJlbnQgIT09IG1pbmUgfHwgIW1vdW50ZWQuY3VycmVudCkge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2V0U3RhdGUoeyBzdGF0dXM6IFwib2tcIiwgdmFsdWUgfSk7XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdGlmIChnZW5lcmF0aW9uLmN1cnJlbnQgIT09IG1pbmUgfHwgIW1vdW50ZWQuY3VycmVudCkge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGVycm9yIGluc3RhbmNlb2YgUWdpc1Nka0JyaWRnZUFib3J0ZWRFcnJvcikge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2V0U3RhdGUoe1xuXHRcdFx0XHRcdHN0YXR1czogXCJlcnJvclwiLFxuXHRcdFx0XHRcdGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0aWYgKGNvbnRyb2xsZXIuY3VycmVudCA9PT0gc2lnbmFsKSB7XG5cdFx0XHRcdFx0Y29udHJvbGxlci5jdXJyZW50ID0gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0W29wZXJhdGlvbiwgYWJvcnRdLFxuXHQpO1xuXG5cdGNvbnN0IHJlc2V0ID0gdXNlQ2FsbGJhY2soKCk6IHZvaWQgPT4ge1xuXHRcdGFib3J0KCk7XG5cdFx0c2V0U3RhdGUoSURMRSk7XG5cdH0sIFthYm9ydF0pO1xuXG5cdGNvbnN0IGNvbnRyb2xzID0gdXNlTWVtbygoKSA9PiAoeyBhYm9ydCwgcmVzZXQgfSksIFthYm9ydCwgcmVzZXRdKTtcblx0cmV0dXJuIFtzdGF0ZSwgcnVuLCBjb250cm9sc107XG59XG5cbi8qKiBIb3cgYSBzdHJlYW0gZW5kZWQsIGFzIHRoZSBnZW5lcmF0ZWQgbW9kdWxlIHJlcG9ydHMgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbVRlcm1pbmFsTGlrZSB7XG5cdHJlYWRvbmx5IGtpbmQ6IHN0cmluZztcblx0cmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcblx0cmVhZG9ubHkgZHJvcHBlZD86IG51bWJlcjtcbn1cblxuLyoqIFRoZSBoYW5kbGUgYSBnZW5lcmF0ZWQgc3RyZWFtIG1lbWJlciByZXNvbHZlcyB3aXRoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1IYW5kbGVMaWtlIHtcblx0cmVhZG9ubHkgaWQ6IHN0cmluZztcblx0cmVhZG9ubHkgY2xvc2VkOiBib29sZWFuO1xuXHRjbG9zZSgpOiB2b2lkO1xufVxuXG4vKiogSGFuZGxlcnMgZm9yIGEgc3RyZWFtLCBhcyBhIGdlbmVyYXRlZCBtb2R1bGUgdHlwZXMgdGhlbS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtSGFuZGxlcnNMaWtlPEU+IHtcblx0cmVhZG9ubHkgb25FdmVudD86IChldmVudDogRSkgPT4gdm9pZDtcblx0cmVhZG9ubHkgb25UZXJtaW5hbD86ICh0ZXJtaW5hbDogU3RyZWFtVGVybWluYWxMaWtlKSA9PiB2b2lkO1xufVxuXG4vKiogQSBzdHJlYW0gbWVtYmVyIG9mIGEgZ2VuZXJhdGVkIG1hcC4gKi9cbmV4cG9ydCB0eXBlIFN0cmVhbTxJLCBFPiA9IChcblx0aW5wdXQ6IEksXG5cdGhhbmRsZXJzOiBTdHJlYW1IYW5kbGVyc0xpa2U8RT4sXG5cdG9wdGlvbnM/OiB7IHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsIH0sXG4pID0+IFByb21pc2U8U3RyZWFtSGFuZGxlTGlrZT47XG5cbi8qKiBXaGVyZSBvbmUgc3Vic2NyaXB0aW9uIHN0YW5kcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtU3RhdGU8RT4ge1xuXHQvKiogYGlkbGVgIHdpdGggYSBudWxsIGlucHV0LCBgZmFpbGVkYCB3aGVuIHRoZSBob3N0IHJlZnVzZWQgdG8gb3BlbiBpdC4gKi9cblx0cmVhZG9ubHkgc3RhdHVzOiBcImlkbGVcIiB8IFwib3BlbmluZ1wiIHwgXCJvcGVuXCIgfCBcImVuZGVkXCIgfCBcImZhaWxlZFwiO1xuXHRyZWFkb25seSBsYXN0RXZlbnQ6IEUgfCBudWxsO1xuXHRyZWFkb25seSB0ZXJtaW5hbDogU3RyZWFtVGVybWluYWxMaWtlIHwgbnVsbDtcblx0cmVhZG9ubHkgZXJyb3I6IEVycm9yIHwgbnVsbDtcbn1cblxuY29uc3QgSURMRV9TVFJFQU06IFN0cmVhbVN0YXRlPG5ldmVyPiA9IE9iamVjdC5mcmVlemUoe1xuXHRzdGF0dXM6IFwiaWRsZVwiLFxuXHRsYXN0RXZlbnQ6IG51bGwsXG5cdHRlcm1pbmFsOiBudWxsLFxuXHRlcnJvcjogbnVsbCxcbn0pO1xuXG5mdW5jdGlvbiBzdGFibGVLZXkodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuXHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUsIChfa2V5LCBpdGVtOiB1bmtub3duKSA9PlxuXHRcdGlzUGxhaW5SZWNvcmQoaXRlbSlcblx0XHRcdD8gT2JqZWN0LmZyb21FbnRyaWVzKFxuXHRcdFx0XHRcdE9iamVjdC5lbnRyaWVzKGl0ZW0pLnNvcnQoKFthXSwgW2JdKSA9PiAoYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDApKSxcblx0XHRcdFx0KVxuXHRcdFx0OiBpdGVtLFxuXHQpO1xufVxuXG4vKipcbiAqIEhvbGQgYSBnZW5lcmF0ZWQgc3RyZWFtIG9wZW4gd2hpbGUgYSBjb21wb25lbnQgaXMgbW91bnRlZC5cbiAqXG4gKiBUaGUgc3Vic2NyaXB0aW9uIGZvbGxvd3MgYG9wZW5gIGFuZCB0aGUgKmNvbnRlbnQqIG9mIGBpbnB1dGA6IGEgbmV3IG9iamVjdFxuICogd2l0aCB0aGUgc2FtZSBmaWVsZHMgZG9lcyBub3QgcmVvcGVuIGl0LCBhIGRpZmZlcmVudCBvbmUgY2xvc2VzIHRoZSBvbGRcbiAqIHN0cmVhbSBhbmQgb3BlbnMgYSBuZXcgb25lLCBhbmQgYG51bGxgIGNsb3NlcyBpdC4gSGFuZGxlcnMgYXJlIHJlYWQgZnJlc2hcbiAqIG9uIGV2ZXJ5IGZyYW1lLCBzbyBhIG5ldyBjbG9zdXJlIGRvZXMgbm90IHJlb3BlbiBhbnl0aGluZyBlaXRoZXIuIFVubW91bnRcbiAqIGNsb3NlcyB0aGUgc3RyZWFtLCBldmVuIGlmIHRoZSBob3N0IGhhcyBub3QgeWV0IGFja25vd2xlZGdlZCBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVN0cmVhbTxJLCBFPihcblx0b3BlbjogU3RyZWFtPEksIEU+LFxuXHRpbnB1dDogSSB8IG51bGwsXG5cdGhhbmRsZXJzOiBTdHJlYW1IYW5kbGVyc0xpa2U8RT4gPSB7fSxcbik6IFN0cmVhbVN0YXRlPEU+IHtcblx0Y29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSB1c2VTdGF0ZTxTdHJlYW1TdGF0ZTxFPj4oSURMRV9TVFJFQU0pO1xuXHRjb25zdCBsYXRlc3QgPSB1c2VSZWYoaGFuZGxlcnMpO1xuXHRsYXRlc3QuY3VycmVudCA9IGhhbmRsZXJzO1xuXHRjb25zdCBrZXkgPSBpbnB1dCA9PT0gbnVsbCA/IG51bGwgOiBzdGFibGVLZXkoaW5wdXQpO1xuXHQvLyBgaW5wdXRgIGlzIGRlbGliZXJhdGVseSByZWFkIHRocm91Z2ggYGtleWA6IHR3byBvYmplY3RzIHdpdGggdGhlIHNhbWVcblx0Ly8gZmllbGRzIGFyZSB0aGUgc2FtZSBzdWJzY3JpcHRpb24uXG5cdGNvbnN0IGlucHV0UmVmID0gdXNlUmVmKGlucHV0KTtcblx0aW5wdXRSZWYuY3VycmVudCA9IGlucHV0O1xuXG5cdHVzZUVmZmVjdCgoKSA9PiB7XG5cdFx0aWYgKGtleSA9PT0gbnVsbCkge1xuXHRcdFx0c2V0U3RhdGUoSURMRV9TVFJFQU0pO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgY3VycmVudCA9IGlucHV0UmVmLmN1cnJlbnQgYXMgSTtcblx0XHRsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG5cdFx0bGV0IGhhbmRsZTogU3RyZWFtSGFuZGxlTGlrZSB8IG51bGwgPSBudWxsO1xuXHRcdHNldFN0YXRlKHtcblx0XHRcdHN0YXR1czogXCJvcGVuaW5nXCIsXG5cdFx0XHRsYXN0RXZlbnQ6IG51bGwsXG5cdFx0XHR0ZXJtaW5hbDogbnVsbCxcblx0XHRcdGVycm9yOiBudWxsLFxuXHRcdH0pO1xuXHRcdG9wZW4oY3VycmVudCwge1xuXHRcdFx0b25FdmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGlmIChjYW5jZWxsZWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0bGF0ZXN0LmN1cnJlbnQub25FdmVudD8uKGV2ZW50KTtcblx0XHRcdFx0c2V0U3RhdGUoKHByZXZpb3VzKSA9PiAoeyAuLi5wcmV2aW91cywgbGFzdEV2ZW50OiBldmVudCB9KSk7XG5cdFx0XHR9LFxuXHRcdFx0b25UZXJtaW5hbDogKHRlcm1pbmFsKSA9PiB7XG5cdFx0XHRcdGlmIChjYW5jZWxsZWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0bGF0ZXN0LmN1cnJlbnQub25UZXJtaW5hbD8uKHRlcm1pbmFsKTtcblx0XHRcdFx0c2V0U3RhdGUoKHByZXZpb3VzKSA9PiAoeyAuLi5wcmV2aW91cywgc3RhdHVzOiBcImVuZGVkXCIsIHRlcm1pbmFsIH0pKTtcblx0XHRcdH0sXG5cdFx0fSkudGhlbihcblx0XHRcdChvcGVuZWQpID0+IHtcblx0XHRcdFx0aWYgKGNhbmNlbGxlZCkge1xuXHRcdFx0XHRcdG9wZW5lZC5jbG9zZSgpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRoYW5kbGUgPSBvcGVuZWQ7XG5cdFx0XHRcdHNldFN0YXRlKChwcmV2aW91cykgPT5cblx0XHRcdFx0XHRwcmV2aW91cy5zdGF0dXMgPT09IFwiZW5kZWRcIlxuXHRcdFx0XHRcdFx0PyBwcmV2aW91c1xuXHRcdFx0XHRcdFx0OiB7IC4uLnByZXZpb3VzLCBzdGF0dXM6IFwib3BlblwiIH0sXG5cdFx0XHRcdCk7XG5cdFx0XHR9LFxuXHRcdFx0KGVycm9yOiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdGlmIChjYW5jZWxsZWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0c2V0U3RhdGUoe1xuXHRcdFx0XHRcdHN0YXR1czogXCJmYWlsZWRcIixcblx0XHRcdFx0XHRsYXN0RXZlbnQ6IG51bGwsXG5cdFx0XHRcdFx0dGVybWluYWw6IG51bGwsXG5cdFx0XHRcdFx0ZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSxcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGNhbmNlbGxlZCA9IHRydWU7XG5cdFx0XHRoYW5kbGU/LmNsb3NlKCk7XG5cdFx0fTtcblx0fSwgW29wZW4sIGtleV0pO1xuXG5cdHJldHVybiBzdGF0ZTtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7QUFnQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF3Qk8sTUFBTSxnQ0FBZ0MsY0FBYTtBQUFBLEVBQ2xELFdBQVcsQ0FBQyxTQUFpQjtBQUFBLElBQ25DLE1BQU0sU0FBUyxlQUFlO0FBQUE7QUFFaEM7QUFPQSxJQUFNLGdCQUFnQixjQUE2QixJQUFJO0FBNkJoRCxTQUFTLGNBQWMsQ0FBQyxPQUEwQztBQUFBLEVBQ3hFLFFBQVEsTUFBTSxRQUFRLFdBQVcsU0FBUyxhQUFhO0FBQUEsRUFDdkQsTUFBTSxRQUFRLENBQUMsTUFBTSxRQUFRLFNBQVMsRUFBRSxPQUN2QyxDQUFDLFdBQVcsV0FBVyxTQUN4QixFQUFFO0FBQUEsRUFDRixJQUFJLFVBQVUsR0FBRztBQUFBLElBQ2hCLE1BQU0sSUFBSSx3QkFDVCwrREFDRDtBQUFBLEVBQ0Q7QUFBQSxFQUNBLE1BQU0sWUFBWSxTQUFTO0FBQUEsRUFDM0IsT0FBTyxPQUFPLFlBQVksU0FBOEIsSUFBSTtBQUFBLEVBQzVELFVBQVUsTUFBTTtBQUFBLElBQ2YsSUFBSSxjQUFjLFdBQVc7QUFBQSxNQUM1QjtBQUFBLElBQ0Q7QUFBQSxJQUNBLE1BQU0sT0FBTyxJQUFJLGNBQ2hCLFdBQ0EsY0FBYyxZQUFZLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FDNUM7QUFBQSxJQUNBLFNBQVMsSUFBSTtB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U0FBUyxPQUFPLFFBQVE7QUFBQSxFQUM5QixPQUFPLFVBQVU7QUFBQSxFQUNqQixNQUFNLE1BQU0sVUFBVSxPQUFPLE9BQU8sVUFBVSxLQUFLO0FBQUEsRUFHbkQsTUFBTSxXQUFXLE9BQU8sS0FBSztBQUFBLEVBQzdCLFNBQVMsVUFBVTtBQUFBLEVBRW5CLFVBQVUsTUFBTTtBQUFBLElBQ2YsSUFBSSxRQUFRLE1BQU07QUFBQSxNQUNqQixTQUFTLFdBQVc7QUFBQSxNQUNwQjtBQUFBLElBQ0Q7QUFBQSxJQUNBLE1BQU0sVUFBVSxTQUFTO0FBQUEsSUFDekIsSUFBSSxZQUFZO0FBQUEsSUFDaEIsSUFBSSxTQUFrQztBQUFBLElBQ3RDLFNBQVM7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFdBQVc7QUFBQSxNQUNYLFVBQVU7QUFBQSxNQUNWLE9BQU87QUFBQSxJQUNSLENBQUM7QUFBQSxJQUNELEtBQUssU0FBUztBQUFBLE1BQ2IsU0FBUyxDQUFDLFVBQVU7QUFBQSxRQUNuQixJQUFJLFdBQVc7QUFBQSxVQUNkO0FBQUEsUUFDRDtBQUFBLFFBQ0EsT0FBTyxRQUFRLFVBQVUsS0FBSztBQUFBLFFBQzlCLFNBQVMsQ0FBQyxjQUFjLEtBQUssVUFBVSxXQUFXLE1BQU0sRUFBRTtBQUFBO0FBQUEsTUFFM0QsWUFBWSxDQUFDLGFBQWE7QUFBQSxRQUN6QixJQUFJLFdBQVc7QUFBQSxVQUNkO0FBQUEsUUFDRDtBQUFBLFFBQ0EsT0FBTyxRQUFRLGFBQWEsUUFBUTtBQUFBLFFBQ3BDLFNBQVMsQ0FBQyxjQUFjLEtBQUssVUFBVSxRQUFRLFNBQVMsU0FBUyxFQUFFO0FBQUE7QUFBQSxJQUVyRSxDQUFDLEVBQUUsS0FDRixDQUFDLFdBQVc7QUFBQSxNQUNYLElBQUksV0FBVztBQUFBLFFBQ2QsT0FBTyxNQUFNO0FBQUEsUUFDYjtBQUFBLE1BQ0Q7QUFBQSxNQUNBLFNBQVM7QUFBQSxNQUNULFNBQVMsQ0FBQyxhQUNULFNBQVMsV0FBVyxVQUNqQixXQUNBLEtBQUssVUFBVSxRQUFRLE9BQU8sQ0FDbEM7QUFBQSxPQUVELENBQUMsVUFBbUI7QUFBQSxNQUNuQixJQUFJLFdBQVc7QUFBQSxRQUNkO0FBQUEsTUFDRDtBQUFBLE1BQ0EsU0FBUztBQUFBLFFBQ1IsUUFBUTtBQUFBLFFBQ1IsV0FBVztBQUFBLFFBQ1gsVUFBVTtBQUFBLFFBQ1YsT0FBTyxpQkFBaUIsUUFBUSxRQUFRLElBQUksTUFBTSxPQUFPLEtBQUssQ0FBQztBQUFBLE1BQ2hFLENBQUM7QUFBQSxLQUVIO0FBQUEsSUFDQSxPQUFPLE1BQU07QUFBQSxNQUNaLFlBQVk7QUFBQSxNQUNaLFFBQVEsTUFBTTtBQUFBO0FBQUEsS0FFYixDQUFDLE1BQU0sR0FBRyxDQUFDO0FBQUEsRUFFZCxPQUFPO0FBQUE7IiwKICAiZGVidWdJZCI6ICIwRkE4MzcxRDQ3NDAzNEZGNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
126
+ //# debugId=D0E9055FFB20961164756E2164756E21
127
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3JlYWN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8qKlxuICogVGhpbiBSZWFjdCBiaW5kaW5ncyBvdmVyIHRoZSBzdG9yZSBjb3JlIChkZWNpc2lvbi0xOCwgZGVjaXNpb24tNDcpLlxuICpcbiAqIFRoaXMgZW50cnkgcG9pbnQgaXMgb3B0aW9uYWwgYW5kIGlzIHRoZSBvbmx5IG9uZSB0aGF0IGltcG9ydHMgUmVhY3QuIEl0IGFkZHNcbiAqIG5vIHNlY29uZCBjbGllbnQ6IGEgY29tcG9uZW50IHJlYWNoZXMgdGhlIHNhbWUgYFFnaXNTZGtgIG9yIGBCcmlkZ2VDbGllbnRgIGFcbiAqIHZhbmlsbGEgcGFnZSB3b3VsZCBidWlsZCwgdGhyb3VnaCBhIHByb3ZpZGVyIHRoYXQgaXMgaGFuZGVkIGEgYFFnaXNTZGtgXG4gKiAoYW5kIGxlYXZlcyBpdCBhbG9uZSksIGlzIGhhbmRlZCBhIGNsaWVudCAoc2FtZSksIG9yIG93bnMgYSBjbGllbnQgYnVpbHQgb25cbiAqIGEgdHJhbnNwb3J0IChhbmQgY2xvc2VzIGl0IG9uIHVubW91bnQpLiBUaGUgaG9va3MgdGFrZSB0aGUgbWV0aG9kcyBhXG4gKiBgUWdpc1Nka2AgYWxyZWFkeSBoYXMgLSBgcWdpcy5zaXRlcy5zdW1tYXJ5YCwgYHFnaXMuc2l0ZXMud2F0Y2hgIC0gc29cbiAqIHRoZSB0eXBlZCBjb250cmFjdCBpcyB0aGUgZ2VuZXJhdGVkIG9uZSwgbm90IGEgUmVhY3QgY29weSBvZiBpdC5cbiAqXG4gKiBUaGUgYmVoYXZpb3VyIGxpdmVzIGluIGAuL3N0b3Jlc2A6IGB1c2VPcGVyYXRpb25gIGlzIGFuIGBPcGVyYXRpb25TdG9yZWBcbiAqIHJlYWQgdGhyb3VnaCBgdXNlU3luY0V4dGVybmFsU3RvcmVgLCBgdXNlU3RyZWFtYCBhIGBTdHJlYW1TdG9yZWAsIGB1c2VGb3JtYFxuICogYSBgRm9ybVN0b3JlYCBhbmQgYHVzZUhvc3RRdWVyeWAgYSBgSG9zdFF1ZXJ5U3RvcmVgLiBXaGF0IHRoZSBob29rcyBhZGQgaXNcbiAqIGxpZmV0aW1lOiBhIGNhbGwgYWJvcnRlZCB3aGVuIGl0cyBjb21wb25lbnQgdW5tb3VudHMsIGEgc3RyZWFtIGNsb3NlZCBvblxuICogdW5tb3VudCBvciB3aGVuIGl0cyBpbnB1dCBjaGFuZ2VzLCBhbmQgYSBzaW11bGF0ZWQgU3RyaWN0TW9kZSByZW1vdW50IHRoYXRcbiAqIGxlYXZlcyBleGFjdGx5IG9uZSBvZiBlYWNoLlxuICovXG5cbmltcG9ydCB7XG5cdGNyZWF0ZUNvbnRleHQsXG5cdGNyZWF0ZUVsZW1lbnQsXG5cdHR5cGUgUmVhY3RFbGVtZW50LFxuXHR0eXBlIFJlYWN0Tm9kZSxcblx0dXNlQ29udGV4dCxcblx0dXNlRWZmZWN0LFxuXHR1c2VNZW1vLFxuXHR1c2VTdGF0ZSxcblx0dXNlU3luY0V4dGVybmFsU3RvcmUsXG59IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHtcblx0QnJpZGdlQ2xpZW50LFxuXHR0eXBlIEJyaWRnZUNsaWVudE9wdGlvbnMsXG5cdHR5cGUgV2lyZVRyYW5zcG9ydCxcbn0gZnJvbSBcIi4vYnJpZGdlXCI7XG5pbXBvcnQgeyBRZ2lzU2RrRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgUWdpc1NkaywgUWdpc1Nka0NvcmUgfSBmcm9tIFwiLi9xZ2lzLXNka1wiO1xuaW1wb3J0IHR5cGUgeyBPcGVyYXRpb25NYXAsIFN0cmVhbU1hcCB9IGZyb20gXCIuL3NjaGVtYVwiO1xuaW1wb3J0IHtcblx0dHlwZSBGb3JtT3B0aW9ucyxcblx0dHlwZSBGb3JtU3RhdGUsXG5cdEZvcm1TdG9yZSxcblx0dHlwZSBIb3N0UXVlcnlTdGF0ZSxcblx0dHlwZSBIb3N0UXVlcnlTdG9yZSxcblx0dHlwZSBPcGVyYXRpb24sXG5cdHR5cGUgT3BlcmF0aW9uU3RhdGUsXG5cdE9wZXJhdGlvblN0b3JlLFxuXHR0eXBlIFN0b3JlLFxuXHR0eXBlIFN0cmVhbSxcblx0dHlwZSBTdHJlYW1IYW5kbGVyc0xpa2UsXG5cdHR5cGUgU3RyZWFtU3RhdGUsXG5cdFN0cmVhbVN0b3JlLFxufSBmcm9tIFwiLi9zdG9yZXNcIjtcblxuZXhwb3J0IHR5cGUge1xuXHRPcGVyYXRpb24sXG5cdE9wZXJhdGlvblN0YXRlLFxuXHRTdHJlYW0sXG5cdFN0cmVhbUhhbmRsZUxpa2UsXG5cdFN0cmVhbUhhbmRsZXJzTGlrZSxcblx0U3RyZWFtU3RhdGUsXG5cdFN0cmVhbVRlcm1pbmFsTGlrZSxcbn0gZnJvbSBcIi4vc3RvcmVzXCI7XG5cbi8qKiBBIGhvb2sgb3IgcHJvdmlkZXIgd2FzIHVzZWQgb3V0c2lkZSB0aGUgc2hhcGUgaXQgbmVlZHMuICovXG5leHBvcnQgY2xhc3MgUWdpc1Nka0JyaWRnZVJlYWN0RXJyb3IgZXh0ZW5kcyBRZ2lzU2RrRXJyb3Ige1xuXHRwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIobWVzc2FnZSwgXCJyZWFjdF9iaW5kaW5nXCIpO1xuXHR9XG59XG5cbmludGVyZmFjZSBTaGFyZWQge1xuXHRyZWFkb25seSBjbGllbnQ6IEJyaWRnZUNsaWVudDtcblx0cmVhZG9ubHkgcWdpczogUWdpc1Nka0NvcmU8dW5rbm93biwgdW5rbm93bj4gfCBudWxsO1xufVxuXG5jb25zdCBDbGllbnRDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxTaGFyZWQgfCBudWxsPihudWxsKTtcblxuLyoqIFByb3BzIGZvciB7QGxpbmsgQnJpZGdlUHJvdmlkZXJ9OiBleGFjdGx5IG9uZSBvZiBgcWdpc2AsIGBjbGllbnRgIG9yIGB0cmFuc3BvcnRgLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmlkZ2VQcm92aWRlclByb3BzIHtcblx0LyoqXG5cdCAqIEEgYFFnaXNTZGtgIHRoZSBwYWdlIGJ1aWx0LCB3aGF0ZXZlciBpdHMgc2NoZW1hOyB0aGUgcHJvdmlkZXIgc2hhcmVzIGl0XG5cdCAqIGFuZCBuZXZlciBjbG9zZXMgaXQuIGB1c2VRZ2lzU2RrYCBoYW5kcyBpdCBiYWNrIHVuZGVyIHRoZSBwYWdlJ3MgdHlwZXMuXG5cdCAqL1xuXHRyZWFkb25seSBxZ2lzPzogUWdpc1Nka0NvcmU8dW5rbm93biwgdW5rbm93bj47XG5cdC8qKiBBIGNsaWVudCB0aGUgY2FsbGVyIG93bnM7IHRoZSBwcm92aWRlciBuZXZlciBjbG9zZXMgaXQuICovXG5cdHJlYWRvbmx5IGNsaWVudD86IEJyaWRnZUNsaWVudDtcblx0LyoqIEEgdHJhbnNwb3J0IHRoZSBwcm92aWRlciBidWlsZHMgYW5kIG93bnMgYSBjbGllbnQgZm9yLiAqL1xuXHRyZWFkb25seSB0cmFuc3BvcnQ/OiBXaXJlVHJhbnNwb3J0O1xuXHQvKiogT3B0aW9ucyBmb3IgdGhlIG93bmVkIGNsaWVudDsgaWdub3JlZCB3aGVuIGBjbGllbnRgIGlzIGdpdmVuLiAqL1xuXHRyZWFkb25seSBvcHRpb25zPzogQnJpZGdlQ2xpZW50T3B0aW9ucztcblx0cmVhZG9ubHkgY2hpbGRyZW4/OiBSZWFjdE5vZGU7XG59XG5cbi8qKlxuICogU2hhcmUgb25lIGNsaWVudCB3aXRoIGEgc3VidHJlZS5cbiAqXG4gKiBBbiBvd25lZCBjbGllbnQgaXMgY3JlYXRlZCBpbiBhbiBlZmZlY3QsIG5ldmVyIGR1cmluZyByZW5kZXIsIGJlY2F1c2VcbiAqIFN0cmljdE1vZGUgcmVuZGVycyB0d2ljZSBhbmQgYSBjbGllbnQgbWFkZSBpbiByZW5kZXIgd291bGQgbGVhdmUgYSBzZWNvbmRcbiAqIGxpc3RlbmVyIG9uIHRoZSB0cmFuc3BvcnQuIFVudGlsIHRoYXQgZWZmZWN0IGhhcyBydW4gdGhlIHN1YnRyZWUgaXMgbm90XG4gKiByZW5kZXJlZCwgd2hpY2ggaXMgb25lIHRpY2suIFN0cmljdE1vZGUncyBzaW11bGF0ZWQgdW5tb3VudCBjbG9zZXMgdGhlXG4gKiBvd25lZCBjbGllbnQgYW5kIHRoZSBlZmZlY3QgdGhhdCBmb2xsb3dzIG1ha2VzIGEgbmV3IG9uZSwgc28gdGhlIHN1YnRyZWVcbiAqIG5ldmVyIGhvbGRzIGEgZGVhZCBjbGllbnQuIFRoZSB0cmFuc3BvcnQgbXVzdCBiZSBzdGFibGUgYWNyb3NzIHJlbmRlcnM7IHRvXG4gKiBzd2FwIGl0LCBjaGFuZ2UgdGhlIHByb3ZpZGVyJ3MgYGtleWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBCcmlkZ2VQcm92aWRlcihwcm9wczogQnJpZGdlUHJvdmlkZXJQcm9wcyk6IFJlYWN0RWxlbWVudCB7XG5cdGNvbnN0IHsgcWdpcywgY2xpZW50LCB0cmFuc3BvcnQsIG9wdGlvbnMsIGNoaWxkcmVuIH0gPSBwcm9wcztcblx0Y29uc3QgZ2l2ZW4gPSBbcWdpcywgY2xpZW50LCB0cmFuc3BvcnRdLmZpbHRlcihcblx0XHQoc291cmNlKSA9PiBzb3VyY2UgIT09IHVuZGVmaW5lZCxcblx0KS5sZW5ndGg7XG5cdGlmIChnaXZlbiAhPT0gMSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlUmVhY3RFcnJvcihcblx0XHRcdFwiQnJpZGdlUHJvdmlkZXIgbmVlZHMgZXhhY3RseSBvbmUgb2YgcWdpcywgY2xpZW50IG9yIHRyYW5zcG9ydFwiLFxuXHRcdCk7XG5cdH1cblx0Y29uc3QgdGltZW91dE1zID0gb3B0aW9ucz8udGltZW91dE1zO1xuXHRjb25zdCBbb3duZWQsIHNldE93bmVkXSA9IHVzZVN0YXRlPEJyaWRnZUNsaWVudCB8IG51bGw+KG51bGwpO1xuXHR1c2VFZmZlY3QoKCkgPT4ge1xuXHRcdGlmICh0cmFuc3BvcnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgbGl2ZSA9IG5ldyBCcmlkZ2VDbGllbnQoXG5cdFx0XHR0cmFuc3BvcnQsXG5cdFx0XHR0aW1lb3V0TXMgPT09IHVuZGVmaW5lZCA/IHt9IDogeyB0aW1lb3V0TXMgfSxcblx0XHQpO1xuXHRcdHNldE93bmVkKGxpdmUpO1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRsaXZlLmNsb3NlKCk7XG5cdFx0XHRzZXRPd25lZCgoY3VycmVudCkgPT4gKGN1cnJlbnQgPT09IGxpdmUgPyBudWxsIDogY3VycmVudCkpO1xuXHRcdH07XG5cdH0sIFt0cmFuc3BvcnQsIHRpbWVvdXRNc10pO1xuXHRjb25zdCB2YWx1ZSA9IHVzZU1lbW8oKCk6IFNoYXJlZCB8IG51bGwgPT4ge1xuXHRcdGlmIChxZ2lzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB7IGNsaWVudDogcWdpcy5jbGllbnQsIHFnaXMgfTtcblx0XHR9XG5cdFx0Y29uc3QgbGl2ZSA9IGNsaWVudCA/PyBvd25lZDtcblx0XHRyZXR1cm4gbGl2ZSA9PT0gbnVsbCA/IG51bGwgOiB7IGNsaWVudDogbGl2ZSwgcWdpczogbnVsbCB9O1xuXHR9LCBbcWdpcywgY2xpZW50LCBvd25lZF0pO1xuXHRyZXR1cm4gY3JlYXRlRWxlbWVudChcblx0XHRDbGllbnRDb250ZXh0LlByb3ZpZGVyLFxuXHRcdHsgdmFsdWUgfSxcblx0XHR2YWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBjaGlsZHJlbixcblx0KTtcbn1cblxuZnVuY3Rpb24gdXNlU2hhcmVkKGhvb2s6IHN0cmluZyk6IFNoYXJlZCB7XG5cdGNvbnN0IHNoYXJlZCA9IHVzZUNvbnRleHQoQ2xpZW50Q29udGV4dCk7XG5cdGlmIChzaGFyZWQgPT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZVJlYWN0RXJyb3IoXG5cdFx0XHRgJHtob29rfSBuZWVkcyBhIEJyaWRnZVByb3ZpZGVyIGFib3ZlIGl0YCxcblx0XHQpO1xuXHR9XG5cdHJldHVybiBzaGFyZWQ7XG59XG5cbi8qKiBUaGUgY2xpZW50IG9mIHRoZSBuZWFyZXN0IHtAbGluayBCcmlkZ2VQcm92aWRlcn0uICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQnJpZGdlQ2xpZW50KCk6IEJyaWRnZUNsaWVudCB7XG5cdHJldHVybiB1c2VTaGFyZWQoXCJ1c2VCcmlkZ2VDbGllbnRcIikuY2xpZW50O1xufVxuXG4vKipcbiAqIFRoZSBgUWdpc1Nka2Agb2YgdGhlIG5lYXJlc3Qge0BsaW5rIEJyaWRnZVByb3ZpZGVyfS5cbiAqXG4gKiBUaGUgdHlwZSBwYXJhbWV0ZXJzIG5hbWUgdGhlIGdlbmVyYXRlZCBgT3BlcmF0aW9uc2AgYW5kIGBTdHJlYW1zYDsgdGhleSBhcmVcbiAqIHRoZSBjYWxsZXIncyBjbGFpbSwgdGhlIHNhbWUgd2F5IHRoZSBwcm92aWRlcidzIGBxZ2lzYCBwcm9wIHdhcyB0aGUgcGFnZSdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUWdpc1NkazxPID0gT3BlcmF0aW9uTWFwLCBTID0gU3RyZWFtTWFwPigpOiBRZ2lzU2RrPE8sIFM+IHtcblx0Y29uc3Qgc2hhcmVkID0gdXNlU2hhcmVkKFwidXNlUWdpc1Nka1wiKTtcblx0aWYgKHNoYXJlZC5xZ2lzID09PSBudWxsKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VSZWFjdEVycm9yKFxuXHRcdFx0XCJ1c2VRZ2lzU2RrIG5lZWRzIGEgQnJpZGdlUHJvdmlkZXIgZ2l2ZW4gYSBxZ2lzIGluc3RhbmNlXCIsXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gc2hhcmVkLnFnaXMgYXMgdW5rbm93biBhcyBRZ2lzU2RrPE8sIFM+O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgZ2VuZXJhdGVkIG9wZXJhdGlvbiBtYXAgb25jZSBwZXIgY2xpZW50OiBgdXNlT3BlcmF0aW9ucyhjcmVhdGVPcGVyYXRpb25zKWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VPcGVyYXRpb25zPFQ+KGNyZWF0ZTogKGNsaWVudDogQnJpZGdlQ2xpZW50KSA9PiBUKTogVCB7XG5cdGNvbnN0IGNsaWVudCA9IHVzZUJyaWRnZUNsaWVudCgpO1xuXHRyZXR1cm4gdXNlTWVtbygoKSA9PiBjcmVhdGUoY2xpZW50KSwgW2NyZWF0ZSwgY2xpZW50XSk7XG59XG5cbi8qKiBDb250cm9scyBiZXlvbmQgcnVubmluZzogYWJvcnQgd2hhdCBpcyBpbiBmbGlnaHQsIG9yIGZvcmdldCB0aGUgb3V0Y29tZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlcmF0aW9uQ29udHJvbHMge1xuXHQvKiogQWJvcnQgdGhlIGluLWZsaWdodCBjYWxsIGxvY2FsbHk7IHRoZSBob3N0IG1heSBzdGlsbCBydW4gaXQuICovXG5cdGFib3J0KCk6IHZvaWQ7XG5cdC8qKiBCYWNrIHRvIGBpZGxlYCwgYWJvcnRpbmcgYW55dGhpbmcgaW4gZmxpZ2h0LiAqL1xuXHRyZXNldCgpOiB2b2lkO1xufVxuXG4vKiogUmVhZCBhbnkgc3RvcmUgZnJvbSBhIGNvbXBvbmVudDsgdGhlIHNuYXBzaG90IGlzIHRoZSByZW5kZXIncyB2YWx1ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdG9yZTxUPihzdG9yZTogU3RvcmU8VD4pOiBUIHtcblx0cmV0dXJuIHVzZVN5bmNFeHRlcm5hbFN0b3JlKFxuXHRcdHN0b3JlLnN1YnNjcmliZSxcblx0XHRzdG9yZS5nZXRTbmFwc2hvdCxcblx0XHRzdG9yZS5nZXRTbmFwc2hvdCxcblx0KTtcbn1cblxuLyoqXG4gKiBSdW4gYSBnZW5lcmF0ZWQgb3BlcmF0aW9uIGZyb20gYSBjb21wb25lbnQuXG4gKlxuICogYHJ1bmAgcmVzb2x2ZXMgd2l0aCB0aGUgdmFsdWUsIG9yIHdpdGggYHVuZGVmaW5lZGAgd2hlbiB0aGUgY2FsbCBmYWlsZWQsIHdhc1xuICogYWJvcnRlZCBvciB3YXMgc3VwZXJzZWRlZCBieSBhIGxhdGVyIHJ1biAtIHRoZSBzdGF0ZSBjYXJyaWVzIHRoZSBlcnJvciwgc29cbiAqIHRoZSBwcm9taXNlIG5ldmVyIHJlamVjdHMgaW50byBhbiBldmVudCBoYW5kbGVyLiBPbmx5IHRoZSBsYXRlc3QgcnVuIGNhblxuICogY2hhbmdlIHRoZSBzdGF0ZTsgdW5tb3VudGluZyBhYm9ydHMgd2hhdGV2ZXIgaXMgaW4gZmxpZ2h0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlT3BlcmF0aW9uPEksIFI+KFxuXHRvcGVyYXRpb246IE9wZXJhdGlvbjxJLCBSPixcbik6IHJlYWRvbmx5IFtcblx0T3BlcmF0aW9uU3RhdGU8Uj4sXG5cdChpbnB1dDogSSkgPT4gUHJvbWlzZTxSIHwgdW5kZWZpbmVkPixcblx0T3BlcmF0aW9uQ29udHJvbHMsXG5dIHtcblx0Y29uc3Qgc3RvcmUgPSB1c2VNZW1vKCgpID0+IG5ldyBPcGVyYXRpb25TdG9yZShvcGVyYXRpb24pLCBbb3BlcmF0aW9uXSk7XG5cdHVzZUVmZmVjdCgoKSA9PiAoKSA9PiBzdG9yZS5hYm9ydCgpLCBbc3RvcmVdKTtcblx0Y29uc3Qgc3RhdGUgPSB1c2VTdG9yZShzdG9yZSk7XG5cdGNvbnN0IGNvbnRyb2xzID0gdXNlTWVtbyhcblx0XHQoKSA9PiAoeyBhYm9ydDogc3RvcmUuYWJvcnQsIHJlc2V0OiBzdG9yZS5yZXNldCB9KSxcblx0XHRbc3RvcmVdLFxuXHQpO1xuXHRyZXR1cm4gW3N0YXRlLCBzdG9yZS5ydW4sIGNvbnRyb2xzXTtcbn1cblxuLyoqXG4gKiBIb2xkIGEgZ2VuZXJhdGVkIHN0cmVhbSBvcGVuIHdoaWxlIGEgY29tcG9uZW50IGlzIG1vdW50ZWQuXG4gKlxuICogVGhlIHN1YnNjcmlwdGlvbiBmb2xsb3dzIGBvcGVuYCBhbmQgdGhlICpjb250ZW50KiBvZiBgaW5wdXRgOiBhIG5ldyBvYmplY3RcbiAqIHdpdGggdGhlIHNhbWUgZmllbGRzIGRvZXMgbm90IHJlb3BlbiBpdCwgYSBkaWZmZXJlbnQgb25lIGNsb3NlcyB0aGUgb2xkXG4gKiBzdHJlYW0gYW5kIG9wZW5zIGEgbmV3IG9uZSwgYW5kIGBudWxsYCBjbG9zZXMgaXQuIEhhbmRsZXJzIGFyZSByZWFkIGZyZXNoXG4gKiBvbiBldmVyeSBmcmFtZSwgc28gYSBuZXcgY2xvc3VyZSBkb2VzIG5vdCByZW9wZW4gYW55dGhpbmcgZWl0aGVyLiBVbm1vdW50XG4gKiBjbG9zZXMgdGhlIHN0cmVhbSwgZXZlbiBpZiB0aGUgaG9zdCBoYXMgbm90IHlldCBhY2tub3dsZWRnZWQgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VTdHJlYW08SSwgRT4oXG5cdG9wZW46IFN0cmVhbTxJLCBFPixcblx0aW5wdXQ6IEkgfCBudWxsLFxuXHRoYW5kbGVyczogU3RyZWFtSGFuZGxlcnNMaWtlPEU+ID0ge30sXG4pOiBTdHJlYW1TdGF0ZTxFPiB7XG5cdGNvbnN0IHN0b3JlID0gdXNlTWVtbygoKSA9PiBuZXcgU3RyZWFtU3RvcmUob3BlbiksIFtvcGVuXSk7XG5cdHN0b3JlLnNldEhhbmRsZXJzKGhhbmRsZXJzKTtcblx0Ly8gVGhlIHN0b3JlIGtleXMgdGhlIGlucHV0IGJ5IGNvbnRlbnQsIHNvIGFuIGVmZmVjdCBwZXIgcmVuZGVyIGlzIGNoZWFwXG5cdC8vIGFuZCBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBmaWVsZHMgcmVvcGVucyBub3RoaW5nLlxuXHR1c2VFZmZlY3QoKCkgPT4ge1xuXHRcdHN0b3JlLnNldElucHV0KGlucHV0KTtcblx0fSk7XG5cdHVzZUVmZmVjdCgoKSA9PiAoKSA9PiBzdG9yZS5jbG9zZSgpLCBbc3RvcmVdKTtcblx0cmV0dXJuIHVzZVN0b3JlKHN0b3JlKTtcbn1cblxuLyoqXG4gKiBUaGUgZm9ybSBvZiBvbmUgZGVjbGFyZWQgYWN0aW9uOiBgcWdpcy48aWQ+YCB3aXRoIGl0cyBmaWVsZHMsIHZhbHVlcyxcbiAqIGlzc3VlcyBhbmQgc3VibWlzc2lvbi4gVGhlIHN0b3JlIGlzIGJ1aWx0IG9uY2UgcGVyIGBxZ2lzYCBhbmQgYGlkYCAtIHRoZVxuICogb3B0aW9ucyBhcmUgcmVhZCBvbiB0aGUgZmlyc3QgcmVuZGVyIG9ubHksIGxpa2UgYHVzZVN0YXRlYCdzIGluaXRpYWwgdmFsdWVcbiAqIC0gYW5kIHVubW91bnRpbmcgYWJvcnRzIGEgc3VibWlzc2lvbiBpbiBmbGlnaHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VGb3JtPE8sIEsgZXh0ZW5kcyBrZXlvZiBPICYgc3RyaW5nPihcblx0cWdpczogUWdpc1Nka0NvcmU8TywgdW5rbm93bj4sXG5cdGlkOiBLLFxuXHRvcHRpb25zPzogRm9ybU9wdGlvbnMsXG4pOiByZWFkb25seSBbXG5cdEZvcm1TdGF0ZTxSZXN1bHRPZjxPLCBLPj4sXG5cdEZvcm1TdG9yZTxSZXF1ZXN0T2Y8TywgSz4gJiBvYmplY3QsIFJlc3VsdE9mPE8sIEs+Pixcbl0ge1xuXHRjb25zdCBbZmlyc3RdID0gdXNlU3RhdGUoKCkgPT4gb3B0aW9ucyA/PyB7fSk7XG5cdGNvbnN0IHN0b3JlID0gdXNlTWVtbyhcblx0XHQoKSA9PlxuXHRcdFx0bmV3IEZvcm1TdG9yZTxSZXF1ZXN0T2Y8TywgSz4gJiBvYmplY3QsIFJlc3VsdE9mPE8sIEs+Pihcblx0XHRcdFx0cWdpcyBhcyBRZ2lzU2RrQ29yZTx1bmtub3duLCB1bmtub3duPixcblx0XHRcdFx0aWQsXG5cdFx0XHRcdGZpcnN0LFxuXHRcdFx0KSxcblx0XHRbcWdpcywgaWQsIGZpcnN0XSxcblx0KTtcblx0Ly8gQWJvcnQsIG5vdCBkaXNwb3NlOiBTdHJpY3RNb2RlJ3Mgc2ltdWxhdGVkIHVubW91bnQga2VlcHMgdGhlIHN0b3JlLlxuXHR1c2VFZmZlY3QoKCkgPT4gKCkgPT4gc3RvcmUuYWJvcnQoKSwgW3N0b3JlXSk7XG5cdHJldHVybiBbdXNlU3RvcmUoc3RvcmUpLCBzdG9yZV07XG59XG5cbi8qKlxuICogUmVhZCBhIGhvc3QgcXVlcnkgc3RvcmU6IGB1c2VIb3N0UXVlcnkobGF5ZXJzUXVlcnkocWdpcykpYCBmb3IgYSBsYXllclxuICogcGlja2VyLiBgcmVmcmVzaGAgcnVucyBvbmNlIG9uIG1vdW50IHdoZW4gYGF1dG9gIGlzIG5vdCBgZmFsc2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSG9zdFF1ZXJ5PFQ+KFxuXHRzdG9yZTogSG9zdFF1ZXJ5U3RvcmU8VD4sXG5cdG9wdGlvbnM6IHsgcmVhZG9ubHkgYXV0bz86IGJvb2xlYW4gfSA9IHt9LFxuKTogcmVhZG9ubHkgW0hvc3RRdWVyeVN0YXRlPFQ+LCBIb3N0UXVlcnlTdG9yZTxUPl0ge1xuXHRjb25zdCBhdXRvID0gb3B0aW9ucy5hdXRvICE9PSBmYWxzZTtcblx0dXNlRWZmZWN0KCgpID0+IHtcblx0XHRpZiAoYXV0bykge1xuXHRcdFx0dm9pZCBzdG9yZS5yZWZyZXNoKCk7XG5cdFx0fVxuXHRcdHJldHVybiAoKSA9PiBzdG9yZS5hYm9ydCgpO1xuXHR9LCBbc3RvcmUsIGF1dG9dKTtcblx0cmV0dXJuIFt1c2VTdG9yZShzdG9yZSksIHN0b3JlXTtcbn1cblxudHlwZSBSZXF1ZXN0T2Y8TywgSyBleHRlbmRzIGtleW9mIE8+ID0gT1tLXSBleHRlbmRzIHtcblx0cmVhZG9ubHkgcmVxdWVzdDogaW5mZXIgUmVxO1xufVxuXHQ/IFJlcVxuXHQ6IG5ldmVyO1xudHlwZSBSZXN1bHRPZjxPLCBLIGV4dGVuZHMga2V5b2YgTz4gPSBPW0tdIGV4dGVuZHMge1xuXHRyZWFkb25seSByZXN1bHQ6IGluZmVyIFJlcztcbn1cblx0PyBSZXNcblx0OiBuZXZlcjtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7QUFtQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBOENPLE1BQU0sZ0NBQWdDLGNBQWE7QUFBQSxFQUNsRCxXQUFXLENBQUMsU0FBaUI7QUFBQSxJQUNuQyxNQUFNLFNBQVMsZUFBZTtBQUFBO0FBRWhDO0FBT0EsSUFBTSxnQkFBZ0IsY0FBNkIsSUFBSTtBQTZCaEQsU0FBUyxjQUFjLENBQUMsT0FBMEM7QUFBQSxFQUN4RSxRQUFRLE1BQU0sUUFBUSxXQUFXLFNBQVMsYUFBYTtBQUFBLEVBQ3ZELE1BQU0sUUFBUSxDQUFDLE1BQU0sUUFBUSxTQUFTLEVBQUUsT0FDdkMsQ0FBQyxXQUFXLFdBQVcsU0FDeEIsRUFBRTtBQUFBLEVBQ0YsSUFBSSxVQUFVLEdBQUc7QUFBQSxJQUNoQixNQUFNLElBQUksd0JBQ1QsK0RBQ0Q7QUFBQSxFQUNEO0FBQUEsRUFDQSxNQUFNLFlBQVksU0FBUztBQUFBLEVBQzNCLE9BQU8sT0FBTyxZQUFZLFNBQThCLElBQUk7QUFBQSxFQUM1RCxVQUFVLE1BQU07QUFBQSxJQUNmLElBQUksY0FBYyxXQUFXO0FBQUEsTUFDNUI7QUFBQSxJQUNEO0FBQUEsSUFDQSxNQUFNLE9BQU8sSUFBSSxjQUNoQixXQUNBLGNBQWMsWUFBWSxDQUFDLElBQUksRUFBRSxVQUFVLENBQzVDO0FBQUEsSUFDQSxTQUFTLElBQUk7QUFBQSxJQUNiLE9BQU8sTUFBTTtBQUFBLE1BQ1osS0FBSyxNQUFNO0FBQUEsTUFDWCxTQUFTLENBQUMsWUFBYSxZQUFZLE9BQU8sT0FBTyxPQUFRO0FBQUE7QUFBQSxLQUV4RCxDQUFDLFdBQVcsU0FBUyxDQUFDO0FBQUEsRUFDekIsTUFBTSxRQUFRLFFBQVEsTUFBcUI7QUFBQSxJQUMxQyxJQUFJLFNBQVMsV0FBVztBQUFBLE1BQ3ZCLE9BQU8sRUFBRSxRQUFRLEtBQUssUUFBUSxLQUFLO0FBQUEsSUFDcEM7QUFBQSxJQUNBLE1BQU0sT0FBTyxVQUFVO0FBQUEsSUFDdkIsT0FBTyxTQUFTLE9BQU8sT0FBTyxFQUFFLFFBQVEsTUFBTSxNQUFNLEtBQUs7QUFBQSxLQUN2RCxDQUFDLE1BQU0sUUFBUSxLQUFLLENBQUM7QUFBQSxFQUN4QixPQUFPLGNBQ04sY0FBYyxVQUNkLEVBQUUsTUFBTSxHQUNSLFVBQVUsT0FBTyxPQUFPLFFBQ3pCO0FBQUE7QUFHRCxTQUFTLFNBQVMsQ0FBQyxNQUFzQjtBQUFBLEVBQ3hDLE1BQU0sU0FBUyxXQUFXLGFBQWE7QUFBQSxFQUN2QyxJQUFJLFdBQVcsTUFBTTtBQUFBLElBQ3BCLE1BQU0sSUFBSSx3QkFDVCxHQUFHLHNDQUNKO0FBQUEsRUFDRDtBQUFBLEVBQ0EsT0FBTztBQUFBO0FBSUQsU0FBUyxlQUFlLEdBQWlCO0FBQUEsRUFDL0MsT0FBTyxVQUFVLGlCQUFpQixFQUFFO0FBQUE7QUFTOUIsU0FBUyxVQUEyQyxHQUFrQjtBQUFBLEVBQzVFLE1BQU0sU0FBUyxVQUFVLFlBQVk7QUFBQSxFQUNyQyxJQUFJLE9BQU8sU0FBUyxNQUFNO0FBQUEsSUFDekIsTUFBTSxJQUFJLHdCQUNULHlEQUNEO0FBQUEsRUFDRDtBQUFBLEVBQ0EsT0FBTyxPQUFPO0FBQUE7QUFNUixTQUFTLGFBQWdCLENBQUMsUUFBd0M7QUFBQSxFQUN4RSxNQUFNLFNBQVMsZ0JBQWdCO0FBQUEsRUFDL0IsT0FBTyxRQUFRLE1BQU0sT0FBTyxNQUFNLEdBQUcsQ0FBQyxRQUFRLE1BQU0sQ0FBQztBQUFBO0FBWS9DLFNBQVMsUUFBVyxDQUFDLE9BQW9CO0FBQUEsRUFDL0MsT0FBTyxxQkFDTixNQUFNLFdBQ04sTUFBTSxhQUNOLE1BQU0sV0FDUDtBQUFBO0FBV00sU0FBUyxZQUFrQixDQUNqQyxXQUtDO0FBQUEsRUFDRCxNQUFNLFFBQVEsUUFBUSxNQUFNLElBQUksZ0JBQWUsU0FBUyxHQUFHLENBQUMsU0FBUyxDQUFDO0FBQUEsRUFDdEUsVUFBVSxNQUFNLE1BQU0sTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFBQSxFQUM1QyxNQUFNLFFBQVEsU0FBUyxLQUFLO0FBQUEsRUFDNUIsTUFBTSxXQUFXLFFBQ2hCLE9BQU8sRUFBRSxPQUFPLE1BQU0sT0FBTyxPQUFPLE1BQU0sTUFBTSxJQUNoRCxDQUFDLEtBQUssQ0FDUDtBQUFBLEVBQ0EsT0FBTyxDQUFDLE9BQU8sTUFBTSxLQUFLLFFBQVE7QUFBQTtBQVk1QixTQUFTLFNBQWUsQ0FDOUIsTUFDQSxPQUNBLFdBQWtDLENBQUMsR0FDbEI7QUFBQSxFQUNqQixNQUFNLFFBQVEsUUFBUSxNQUFNLElBQUksYUFBWSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFBQSxFQUN6RCxNQUFNLFlBQVksUUFBUTtBQUFBLEVBRzFCLFVBQVUsTUFBTTtBQUFBLElBQ2YsTUFBTSxTQUFTLEtBQUs7QUFBQSxHQUNwQjtBQUFBLEVBQ0QsVUFBVSxNQUFNLE1BQU0sTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFBQSxFQUM1QyxPQUFPLFNBQVMsS0FBSztBQUFBO0FBU2YsU0FBUyxPQUFzQyxDQUNyRCxNQUNBLElBQ0EsU0FJQztBQUFBLEVBQ0QsT0FBTyxTQUFTLFNBQVMsTUFBTSxXQUFXLENBQUMsQ0FBQztBQUFBLEVBQzVDLE1BQU0sUUFBUSxRQUNiLE1BQ0MsSUFBSSxXQUNILE1BQ0EsSUFDQSxLQUNELEdBQ0QsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUNqQjtBQUFBLEVBRUEsVUFBVSxNQUFNLE1BQU0sTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFBQSxFQUM1QyxPQUFPLENBQUMsU0FBUyxLQUFLLEdBQUcsS0FBSztBQUFBO0FBT3hCLFNBQVMsWUFBZSxDQUM5QixPQUNBLFVBQXVDLENBQUMsR0FDVTtBQUFBLEVBQ2xELE1BQU0sT0FBTyxRQUFRLFNBQVM7QUFBQSxFQUM5QixVQUFVLE1BQU07QUFBQSxJQUNmLElBQUksTUFBTTtBQUFBLE1BQ0osTUFBTSxRQUFRO0FBQUEsSUFDcEI7QUFBQSxJQUNBLE9BQU8sTUFBTSxNQUFNLE1BQU07QUFBQSxLQUN2QixDQUFDLE9BQU8sSUFBSSxDQUFDO0FBQUEsRUFDaEIsT0FBTyxDQUFDLFNBQVMsS0FBSyxHQUFHLEtBQUs7QUFBQTsiLAogICJkZWJ1Z0lkIjogIkQwRTkwNTVGRkIyMDk2MTE2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9