@archont561/qgis-sdk 0.4.0 → 0.5.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/README.md +35 -32
- package/dist/host.d.ts +2 -2
- package/dist/host.js +27 -3
- package/dist/index.d.ts +42 -36
- package/dist/index.js +111 -425
- package/dist/react.d.ts +37 -57
- package/dist/react.js +40 -127
- package/dist/shared/chunk-3zscfm3y.d.ts +342 -0
- package/dist/shared/{chunk-khemhx86.d.ts → chunk-7tgzmz0m.d.ts} +98 -4
- package/dist/shared/chunk-8gawbn19.js +1 -1
- package/dist/shared/{chunk-tmca1ynt.d.ts → chunk-a33y575v.d.ts} +72 -4
- package/dist/shared/chunk-stre69mw.js +777 -0
- package/dist/shared/chunk-t1vpt5yq.js +895 -0
- package/dist/svelte.d.ts +75 -0
- package/dist/svelte.js +70 -0
- package/dist/testing.d.ts +9 -3
- package/dist/testing.js +7 -4
- package/dist/vue.d.ts +106 -0
- package/dist/vue.js +91 -0
- package/package.json +21 -3
- package/dist/shared/chunk-jjx14tgd.d.ts +0 -55
- package/dist/shared/chunk-vqyymknv.js +0 -414
package/dist/react.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { WireTransport2, BridgeClientOptions2, BridgeClient2 } from "./shared/chunk-wtv4vt4q.js";
|
|
2
|
-
import "./shared/chunk-
|
|
3
|
-
import { OperationMap2, StreamMap2 } from "./shared/chunk-
|
|
4
|
-
import {
|
|
2
|
+
import "./shared/chunk-7tgzmz0m.js";
|
|
3
|
+
import { OperationMap2, StreamMap2, QgisSdkCore2, QgisSdk2 } from "./shared/chunk-a33y575v.js";
|
|
4
|
+
import { Store2, OperationState2, Operation2, StreamTerminalLike2, StreamHandleLike2, StreamHandlersLike2, Stream2, StreamState2, FormState2, FormOptions2, FormStore2, HostQueryState2, HostQueryStore2 } from "./shared/chunk-3zscfm3y.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
|
-
/**
|
|
74
|
-
|
|
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:
|
|
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:
|
|
137
|
-
|
|
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
3
|
} from "./shared/chunk-8gawbn19.js";
|
|
4
|
+
import {
|
|
5
|
+
OperationStore2,
|
|
6
|
+
StreamStore2,
|
|
7
|
+
FormStore2
|
|
8
|
+
} from "./shared/chunk-t1vpt5yq.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
|
-
|
|
19
|
-
|
|
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
|
-
|
|
77
|
-
|
|
78
|
+
function useStore(store) {
|
|
79
|
+
return useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
|
|
80
|
+
}
|
|
78
81
|
function useOperation(operation) {
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
const
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
|
143
|
-
const
|
|
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 (
|
|
151
|
-
|
|
152
|
-
return;
|
|
106
|
+
if (auto) {
|
|
107
|
+
store.refresh();
|
|
153
108
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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=
|
|
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=AF402B9327384C7B64756E2164756E21
|
|
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/IFJlcVxuXHQ6IG5ldmVyO1xudHlwZSBSZXN1bHRPZjxPLCBLIGV4dGVuZHMga2V5b2YgTz4gPSBPW0tdIGV4dGVuZHMge1xuXHRyZWFkb25seSByZXN1bHQ6IGluZmVyIFJlcztcbn1cblx0PyBSZXNcblx0OiBuZXZlcjtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7QUFtQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBOENPLE1BQU0sZ0NBQWdDLGNBQWE7QUFBQSxFQUNsRCxXQUFXLENBQUMsU0FBaUI7QUFBQSxJQUNuQyxNQUFNLFNBQVMsZUFBZTtBQUFBO0FBRWhDO0FBT0EsSUFBTSxnQkFBZ0IsY0FBNkIsSUFBSTtBQTZCaEQsU0FBUyxjQUFjLENBQUMsT0FBMEM7QUFBQSxFQUN4RSxRQUFRLE1BQU0sUUFBUSxXQUFXLFNBQVMsYUFBYTtBQUFBLEVBQ3ZELE1BQU0sUUFBUSxDQUFDLE1BQU0sUUFBUSxTQUFTLEVBQUUsT0FDdkMsQ0FBQyxXQUFXLFdBQVcsU0FDeEIsRUFBRTtBQUFBLEVBQ0YsSUFBSSxVQUFVLEdBQUc7QUFBQSxJQUNoQixNQUFNLElBQUksd0JBQ1QsK0RBQ0Q7QUFBQSxFQUNEO0FBQUEsRUFDQSxNQUFNLFlBQVksU0FBUztBQUFBLEVBQzNCLE9BQU8sT0FBTyxZQUFZLFNBQThCLElBQUk7QUFBQSxFQUM1RCxVQUFVLE1BQU07QUFBQSxJQUNmLElBQUksY0FBYyxXQUFXO0FBQUEsTUFDNUI7QUFBQSxJQUNEO0FBQUEsSUFDQSxNQUFNLE9BQU8sSUFBSSxjQUNoQixXQUNBLGNBQWMsWUFBWSxDQUFDLElBQUksRUFBRSxVQUFVLENBQzVDO0FBQUEsSUFDQSxTQUFTLElBQUk7QUFBQSxJQUNiLE9BQU8sTUFBTTtBQUFBLE1BQ1osS0FBSyxNQUFNO0FBQUEsTUFDWCxTQUFTLENBQUMsWUFBYSxZQUFZLE9BQU8sT0FBTyxPQUFRO0FBQUE7QUFBQSxLQUV4RCxDQUFDLFdBQVcsU0FBUyxDQUFDO0FBQUEsRUFDekIsTUFBTSxRQUFRLFFBQVEsTUFBcUI7QUFBQSxJQUMxQyxJQUFJLFNBQVMsV0FBVztBQUFBLE1BQ3ZCLE9BQU8sRUFBRSxRQUFRLEtBQUssUUFBUSxLQUFLO0FBQUEsSUFDcEM7QUFBQSxJQUNBLE1BQU0sT0FBTyxVQUFVO0FBQUEsSUFDdkIsT0FBTyxTQUFTLE9BQU8sT0FBTyxFQUFFLFFBQVEsTUFBTSxNQUFNLEtBQUs7QUFBQSxLQUN2RCxDQUFDLE1BQU0sUUFBUSxLQUFLLENBQUM7QUFBQSxFQUN4QixPQUFPLGNBQ04sY0FBYyxVQUNkLEVBQUUsTUFBTSxHQUNSLFVBQVUsT0FBTyxPQUFPLFFBQ3pCO0FBQUE7QUFHRCxTQUFTLFNBQVMsQ0FBQyxNQUFzQjtBQUFBLEVBQ3hDLE1BQU0sU0FBUyxXQUFXLGFBQWE7QUFBQSxFQUN2QyxJQUFJLFdBQVcsTUFBTTtBQUFBLElBQ3BCLE1BQU0sSUFBSSx3QkFDVCxHQUFHLHNDQUNKO0FBQUEsRUFDRDtBQUFBLEVBQ0EsT0FBTztBQUFBO0FBSUQsU0FBUyxlQUFlLEdBQWlCO0FBQUEsRUFDL0MsT0FBTyxVQUFVLGlCQUFpQixFQUFFO0FBQUE7QUFTOUIsU0FBUyxVQUEyQyxHQUFrQjtBQUFBLEVBQzVFLE1BQU0sU0FBUyxVQUFVLFlBQVk7QUFBQSxFQUNyQyxJQUFJLE9BQU8sU0FBUyxNQUFNO0FBQUEsSUFDekIsTUFBTSxJQUFJLHdCQUNULHlEQUNEO0FBQUEsRUFDRDtBQUFBLEVBQ0EsT0FBTyxPQUFPO0FBQUE7QUFNUixTQUFTLGFBQWdCLENBQUMsUUFBd0M7QUFBQSxFQUN4RSxNQUFNLFNBQVMsZ0JBQWdCO0FBQUEsRUFDL0IsT0FBTyxRQUFRLE1BQU0sT0FBTyxNQUFNLEdBQUcsQ0FBQyxRQUFRLE1BQU0sQ0FBQztBQUFBO0FBWS9DLFNBQVMsUUFBVyxDQUFDLE9BQW9CO0FBQUEsRUFDL0MsT0FBTyxxQkFDTixNQUFNLFdBQ04sTUFBTSxhQUNOLE1BQU0sV0FDUDtBQUFBO0FBV00sU0FBUyxZQUFrQixDQUNqQyxXQUtDO0FBQUEsRUFDRCxNQUFNLFFBQVEsUUFBUSxNQUFNLElBQUksZ0JBQWUsU0FBUyxHQUFHLENBQUMsU0FBUyxDQUFDO0FBQUEsRUFDdEUsVUFBVSxNQUFNLE1BQU0sTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFBQSxFQUM1QyxNQUFNLFFBQVEsU0FBUyxLQUFLO0FBQUEsRUFDNUIsTUFBTSxXQUFXLFFBQ2hCLE9BQU8sRUFBRSxPQUFPLE1BQU0sT0FBTyxPQUFPLE1BQU0sTUFBTSxJQUNoRCxDQUFDLEtBQUssQ0FDUDtBQUFBLEVBQ0EsT0FBTyxDQUFDLE9BQU8sTUFBTSxLQUFLLFFBQVE7QUFBQTtBQVk1QixTQUFTLFNBQWUsQ0FDOUIsTUFDQSxPQUNBLFdBQWtDLENBQUMsR0FDbEI7QUFBQSxFQUNqQixNQUFNLFFBQVEsUUFBUSxNQUFNLElBQUksYUFBWSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFBQSxFQUN6RCxNQUFNLFlBQVksUUFBUTtBQUFBLEVBRzFCLFVBQVUsTUFBTTtBQUFBLElBQ2YsTUFBTSxTQUFTLEtBQUs7QUFBQSxHQUNwQjtBQUFBLEVBQ0QsVUFBVSxNQUFNLE1BQU0sTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFBQSxFQUM1QyxPQUFPLFNBQVMsS0FBSztBQUFBO0FBU2YsU0FBUyxPQUFzQyxDQUNyRCxNQUNBLElBQ0EsU0FJQztBQUFBLEVBQ0QsT0FBTyxTQUFTLFNBQVMsTUFBTSxXQUFXLENBQUMsQ0FBQztBQUFBLEVBQzVDLE1BQU0sUUFBUSxRQUNiLE1BQ0MsSUFBSSxXQUNILE1BQ0EsSUFDQSxLQUNELEdBQ0QsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUNqQjtBQUFBLEVBRUEsVUFBVSxNQUFNLE1BQU0sTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFBQSxFQUM1QyxPQUFPLENBQUMsU0FBUyxLQUFLLEdBQUcsS0FBSztBQUFBO0FBT3hCLFNBQVMsWUFBZSxDQUM5QixPQUNBLFVBQXVDLENBQUMsR0FDVTtBQUFBLEVBQ2xELE1BQU0sT0FBTyxRQUFRLFNBQVM7QUFBQSxFQUM5QixVQUFVLE1BQU07QUFBQSxJQUNmLElBQUksTUFBTTtBQUFBLE1BQ0osTUFBTSxRQUFRO0FBQUEsSUFDcEI7QUFBQSxJQUNBLE9BQU8sTUFBTSxNQUFNLE1BQU07QUFBQSxLQUN2QixDQUFDLE9BQU8sSUFBSSxDQUFDO0FBQUEsRUFDaEIsT0FBTyxDQUFDLFNBQVMsS0FBSyxHQUFHLEtBQUs7QUFBQTsiLAogICJkZWJ1Z0lkIjogIkFGNDAyQjkzMjczODRDN0I2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|