@effect-app/vue 4.0.0-beta.271 → 4.0.0-beta.273

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/query.js CHANGED
@@ -3,147 +3,258 @@
3
3
  /* eslint-disable @typescript-eslint/no-unsafe-return */
4
4
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
5
5
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
6
- import { experimental_streamedQuery as streamedQuery, useQuery as useTanstackQuery, useQueryClient } from "@tanstack/vue-query";
6
+ import { injectRegistry, useAtomValue } from "@effect/atom-vue";
7
7
  import * as Array from "effect-app/Array";
8
8
  import { makeQueryKey } from "effect-app/client";
9
- import { CauseException, ServiceUnavailableError } from "effect-app/client/errors";
10
9
  import * as Effect from "effect-app/Effect";
11
10
  import * as Option from "effect-app/Option";
12
- import * as S from "effect-app/Schema";
13
- import * as Cause from "effect/Cause";
14
- import * as Channel from "effect/Channel";
15
11
  import * as Exit from "effect/Exit";
16
- import * as Pull from "effect/Pull";
17
- import * as Scope from "effect/Scope";
18
- import { isHttpClientError } from "effect/unstable/http/HttpClientError";
12
+ import * as Stream from "effect/Stream";
19
13
  import * as AsyncResult from "effect/unstable/reactivity/AsyncResult";
20
- import { computed, ref, shallowRef, watch } from "vue";
21
- import { reportRuntimeError } from "./lib.js";
22
- import { makeRunPromise } from "./runtime.js";
23
- function swrToQuery(r) {
24
- if (r.error !== undefined) {
25
- return AsyncResult.failureWithPrevious(r.error.originalCause, {
26
- previous: r.data === undefined ? Option.none() : Option.some(AsyncResult.success(r.data)),
27
- waiting: r.isValidating
28
- });
14
+ import * as Atom from "effect/unstable/reactivity/Atom";
15
+ import { computed, onBeforeUnmount, onMounted, ref, toValue } from "vue";
16
+ import { awaitAtomResult, buildQueryFamily, buildStreamQueryFamily, disabledQueryAtom, isStaleResult, staleTimeMsOf, withQueryOptions } from "./atomQuery.js";
17
+ const queryFamilyCacheKey = (q) => `${makeQueryKey(q).join("/")}:${q.queryKeyProjectionHash ?? ""}`;
18
+ // One atom family per request shape, keyed by the stable query key + projection hash (not the
19
+ // handler object — `clientFor` returns a fresh proxy per call, so the object isn't shareable).
20
+ // Module-level + key-indexed => the family is process-global, so the same request+input read
21
+ // the same atom across components/pages => cross-page caching via the global registry.
22
+ const queryFamilyByKey = new Map();
23
+ const getQueryFamily = (rt, q) => {
24
+ const key = queryFamilyCacheKey(q);
25
+ let f = queryFamilyByKey.get(key);
26
+ if (!f) {
27
+ f = buildQueryFamily(rt, q);
28
+ queryFamilyByKey.set(key, f);
29
29
  }
30
- if (r.data !== undefined) {
31
- return AsyncResult.success(r.data, { waiting: r.isValidating });
30
+ return f;
31
+ };
32
+ const streamQueryFamilyByKey = new Map();
33
+ const getStreamQueryFamily = (rt, q) => {
34
+ const key = queryFamilyCacheKey(q);
35
+ let f = streamQueryFamilyByKey.get(key);
36
+ if (!f) {
37
+ f = buildStreamQueryFamily(rt, q);
38
+ streamQueryFamilyByKey.set(key, f);
32
39
  }
33
- return AsyncResult.initial(r.isValidating);
34
- }
35
- function streamToAsyncIterableWithCauseException(self, context, id) {
40
+ return f;
41
+ };
42
+ const normalizeQueryOptions = (options) => {
43
+ const out = {};
44
+ if (options?.staleTime !== undefined)
45
+ out.staleTime = options.staleTime;
46
+ const gcTime = options?.idleTTL ?? options?.gcTime;
47
+ if (gcTime !== undefined)
48
+ out.gcTime = gcTime;
49
+ const revalidateOnFocus = options?.revalidateOnFocus ?? options?.refetchOnWindowFocus;
50
+ if (revalidateOnFocus !== undefined)
51
+ out.revalidateOnFocus = revalidateOnFocus;
52
+ if (options?.structuralSharing !== undefined)
53
+ out.structuralSharing = options.structuralSharing;
54
+ const refetchInterval = options?.refreshEvery ?? options?.refetchInterval;
55
+ if (refetchInterval !== undefined)
56
+ out.refetchInterval = refetchInterval;
57
+ return out;
58
+ };
59
+ export const useAtomQuery = (atom) => {
60
+ const registry = injectRegistry();
61
+ const atomRef = computed(atom);
62
+ const atomResult = useAtomValue(() => atomRef.value);
63
+ const result = computed(() => atomResult.value);
64
+ const refresh = () => registry.refresh(atomRef.value);
65
+ const awaitResult = () => awaitAtomResult(registry, atomRef.value);
66
+ const refetch = () => Effect.gen(function* () {
67
+ refresh();
68
+ return yield* awaitResult();
69
+ });
70
+ const data = computed(() => Option.getOrUndefined(AsyncResult.value(result.value)));
36
71
  return {
37
- [Symbol.asyncIterator]() {
38
- const runPromise = Effect.runPromiseWith(context);
39
- const runPromiseExit = Effect.runPromiseExitWith(context);
40
- const scope = Scope.makeUnsafe();
41
- let pull;
42
- let currentIter;
43
- return {
44
- async next() {
45
- if (currentIter) {
46
- const next = currentIter.next();
47
- if (!next.done)
48
- return next;
49
- currentIter = undefined;
50
- }
51
- pull ??= await runPromise(Channel.toPullScoped(self.channel, scope));
52
- const exit = await runPromiseExit(pull);
53
- if (Exit.isSuccess(exit)) {
54
- currentIter = exit.value[Symbol.iterator]();
55
- return currentIter.next();
56
- }
57
- else if (Pull.isDoneCause(exit.cause)) {
58
- return { done: true, value: undefined };
59
- }
60
- throw new CauseException(exit.cause, id);
61
- },
62
- return(_) {
63
- return runPromise(Effect.as(Scope.close(scope, Exit.void), { done: true, value: undefined }));
64
- }
65
- };
66
- }
72
+ result,
73
+ data,
74
+ awaitResult,
75
+ refetch,
76
+ refresh,
77
+ registry,
78
+ atom: atomRef
67
79
  };
68
- }
69
- export const makeQuery = (getRuntime) => {
70
- const useQuery_ = (q) => (arg,
71
- // todo QueryKey type would be [string, ...string[]], but with I it would be [string, ...string[], I]
72
- options
73
- // TODO
74
- ) => {
75
- // we wrap into CauseException because we want to keep the full cause of the failure.
76
- const runPromise = makeRunPromise(getRuntime());
77
- const arr = arg;
78
- let req;
79
- let callerOptions = options;
80
- if (options?.mode === "optional") {
81
- const getOption = typeof arr === "function"
82
- ? arr
83
- : () => arr.value;
84
- req = {
85
- get value() {
86
- // getOrUndefined returns undefined when None, but queryFn is only called when enabled (Some)
87
- return Option.getOrUndefined(getOption());
88
- }
89
- };
90
- const { mode: _mode, enabled: _enabled, ...rest } = options ?? {};
91
- callerOptions = { ...rest, enabled: computed(() => Option.isSome(getOption())) };
80
+ };
81
+ export const useAtomSuspense = (atom) => {
82
+ const view = useAtomQuery(atom);
83
+ const data = computed(() => {
84
+ const latest = view.data.value;
85
+ if (latest === undefined) {
86
+ throw new Error("Internal Error: atom suspense resolved without a latest value");
92
87
  }
93
- else {
94
- req = !arg
95
- ? undefined
96
- : typeof arr === "function"
97
- ? ({
98
- get value() {
99
- return arr();
100
- }
101
- })
102
- : ref(arg);
88
+ return latest;
89
+ });
90
+ const isMounted = ref(true);
91
+ onBeforeUnmount(() => {
92
+ isMounted.value = false;
93
+ });
94
+ const eff = Effect.gen(function* () {
95
+ const exit = yield* view.awaitResult().pipe(Effect.exit);
96
+ if (!isMounted.value) {
97
+ return yield* Effect.interrupt;
103
98
  }
104
- const queryKey = makeQueryKey(q);
105
- const projectionHash = q.queryKeyProjectionHash;
106
- const defaultOptions = {
107
- // we do not want to throw errors, because we turn the success and error responses into a Result type
108
- // why don't we turn the error/success response into a Result type before returning to tanstack query? because we want to leverage tanstack query's retry and caching mechanism, which relies on throwing errors to trigger retries, and we don't want to interfere with that by catching the errors too early.
109
- // but if we allow tanstack query to throw, it will trigger the error boundary in Vue - via a "watcher callback" error - which we currently report and log, which is not what we want.
110
- // TODO: we might want to rethink the strategy of how to handle errors that happen after the initial load.
111
- // For suspense, the initial load is captured by the suspense boundary.
112
- // For subsequent loads (or non suspense use) we currently are required to use the QueryResult component to conditionally render error/loading/etc.
113
- throwOnError: false
99
+ if (Exit.isFailure(exit)) {
100
+ return yield* Exit.failCause(exit.cause);
101
+ }
102
+ const fetch = (_options) => view.refetch();
103
+ const handle = {
104
+ awaitResult: view.awaitResult,
105
+ refetch: view.refetch,
106
+ refresh: view.refresh,
107
+ registry: view.registry,
108
+ atom: view.atom
114
109
  };
115
- const r = useTanstackQuery({
116
- ...defaultOptions,
117
- ...callerOptions,
118
- retry: (retryCount, error) => {
119
- if (error instanceof CauseException) {
120
- if (!isHttpClientError(error.cause) && !S.is(ServiceUnavailableError)(error.cause)) {
121
- return false;
122
- }
110
+ return Object.assign([
111
+ view.result,
112
+ data,
113
+ fetch,
114
+ handle
115
+ ], {
116
+ ...view,
117
+ data
118
+ });
119
+ });
120
+ return Effect.runPromise(eff);
121
+ };
122
+ export const useAtomStreamQuery = (atom) => {
123
+ const registry = injectRegistry();
124
+ const atomRef = computed(atom);
125
+ const atomResult = useAtomValue(() => atomRef.value);
126
+ const result = computed(() => atomResult.value);
127
+ const pull = () => registry.set(atomRef.value, void 0);
128
+ const refresh = () => registry.refresh(atomRef.value);
129
+ const awaitResult = () => awaitAtomResult(registry, atomRef.value);
130
+ const pullAndAwait = () => Effect.gen(function* () {
131
+ pull();
132
+ return yield* awaitResult();
133
+ });
134
+ const items = computed(() => Option.getOrElse(Option.map(AsyncResult.value(result.value), (_) => _.items), () => []));
135
+ const latest = computed(() => items.value.at(-1));
136
+ const done = computed(() => Option.getOrElse(Option.map(AsyncResult.value(result.value), (_) => _.done), () => false));
137
+ return {
138
+ result,
139
+ items,
140
+ latest,
141
+ done,
142
+ awaitResult,
143
+ pull,
144
+ pullAndAwait,
145
+ refresh,
146
+ registry,
147
+ atom: atomRef
148
+ };
149
+ };
150
+ const optionValue = (arr, options) => {
151
+ if (options?.mode === "optional") {
152
+ const getOption = typeof arr === "function"
153
+ ? arr
154
+ : () => arr.value;
155
+ return [
156
+ {
157
+ get value() {
158
+ return Option.getOrUndefined(getOption());
123
159
  }
124
- return retryCount < 5;
125
160
  },
126
- queryKey: projectionHash === undefined ? [...queryKey, req] : [...queryKey, req, projectionHash],
127
- queryFn: ({ meta, signal }) => runPromise(q
128
- .handler(req?.value)
129
- .pipe(Effect.tapCauseIf(Cause.hasDies, (cause) => reportRuntimeError(cause)), Effect.withSpan(`query ${q.id}`, {}, { captureStackTrace: false }), meta?.["span"] ? Effect.withParentSpan(meta["span"]) : (_) => _), { signal })
130
- });
131
- const latestSuccess = shallowRef();
132
- const result = computed(() => swrToQuery({
133
- error: r.error.value ?? undefined,
134
- data: r.data.value === undefined ? latestSuccess.value : r.data.value, // we fall back to existing data, as tanstack query might loose it when the key changes
135
- isValidating: r.isFetching.value
136
- }));
137
- // not using `computed` here as we have a circular dependency
138
- watch(result, (value) => latestSuccess.value = Option.getOrUndefined(AsyncResult.value(value)), { immediate: true });
161
+ computed(() => Option.isSome(getOption()))
162
+ ];
163
+ }
164
+ const req = !arr
165
+ ? ({ value: undefined })
166
+ : typeof arr === "function"
167
+ ? ({
168
+ get value() {
169
+ return arr();
170
+ }
171
+ })
172
+ : ref(arr);
173
+ const enabled = options?.enabled;
174
+ return [req, computed(() => enabled === undefined ? true : !!toValue(enabled))];
175
+ };
176
+ const observedAtom = (atom, options) => withQueryOptions(atom, normalizeQueryOptions(options));
177
+ const observedStreamAtom = (atom, options) => {
178
+ let next = atom;
179
+ const refetchInterval = options?.refreshEvery ?? options?.refetchInterval;
180
+ if (refetchInterval !== undefined)
181
+ next = Atom.withRefresh(refetchInterval)(next);
182
+ const gcTime = options?.idleTTL ?? options?.gcTime;
183
+ if (gcTime === "infinity")
184
+ return Atom.keepAlive(next);
185
+ if (gcTime !== undefined)
186
+ return Atom.setIdleTTL(next, gcTime);
187
+ return next;
188
+ };
189
+ const queryAtomFor = (rt, q, arg, options) => {
190
+ const family = getQueryFamily(rt, q);
191
+ return observedAtom(family(arg), options);
192
+ };
193
+ const makeQueryView = (getAtomRt, q, arg, options) => {
194
+ const atomRt = getAtomRt();
195
+ const registry = injectRegistry();
196
+ const [req, enabledRef] = optionValue(arg, options);
197
+ const family = getQueryFamily(atomRt, q);
198
+ const atomRef = computed(() => enabledRef.value ? observedAtom(family(req.value), options) : disabledQueryAtom);
199
+ const rawResult = useAtomValue(() => atomRef.value);
200
+ const select = options?.select;
201
+ const result = (select
202
+ ? computed(() => AsyncResult.map(rawResult.value, select))
203
+ : rawResult);
204
+ const refresh = () => registry.refresh(atomRef.value);
205
+ const awaitResult = () => select
206
+ ? awaitAtomResult(registry, atomRef.value).pipe(Effect.map(select))
207
+ : awaitAtomResult(registry, atomRef.value);
208
+ const refetch = () => Effect.gen(function* () {
209
+ refresh();
210
+ return yield* awaitResult();
211
+ });
212
+ const staleMs = staleTimeMsOf(normalizeQueryOptions(options));
213
+ onMounted(() => {
214
+ if (!enabledRef.value)
215
+ return;
216
+ if (isStaleResult(registry.get(atomRef.value), staleMs))
217
+ refresh();
218
+ });
219
+ const data = computed(() => Option.getOrUndefined(AsyncResult.value(result.value)));
220
+ return {
221
+ result,
222
+ data,
223
+ awaitResult,
224
+ refetch,
225
+ refresh,
226
+ registry,
227
+ atom: atomRef
228
+ };
229
+ };
230
+ export const makeQueryFamily = (_getRuntime, getAtomRt) => {
231
+ const useQueryFamily = (q) => getQueryFamily(getAtomRt(), q);
232
+ return useQueryFamily;
233
+ };
234
+ export const makeQueryAtom = (_getRuntime, getAtomRt) => {
235
+ const useQueryAtom = (q) => (arg, options) => queryAtomFor(getAtomRt(), q, arg, options);
236
+ return useQueryAtom;
237
+ };
238
+ export const makeQueryNew = (_getRuntime, getAtomRt) => {
239
+ const useQueryNew = (q) => (arg, options) => makeQueryView(getAtomRt, q, arg, options);
240
+ return useQueryNew;
241
+ };
242
+ export const makeQuery = (_getRuntime, getAtomRt) => {
243
+ const useQuery_ = (q) => (arg, options) => {
244
+ const view = makeQueryView(getAtomRt, q, arg, options);
245
+ // 4th element is internal-only; the public `.suspense()` Promise boundary lives in makeClient.
246
+ const handle = {
247
+ awaitResult: view.awaitResult,
248
+ refetch: view.refetch,
249
+ refresh: view.refresh,
250
+ registry: view.registry,
251
+ atom: view.atom
252
+ };
139
253
  return [
140
- result,
141
- computed(() => latestSuccess.value),
142
- // one thing to keep in mind is that span will be disconnected as Context does not pass from outside.
143
- // TODO: consider how we should handle the Result here which is `QueryObserverResult<A, E>`
144
- // and always ends up in the success channel, even when error..
145
- (options) => Effect.currentSpan.pipe(Effect.orElseSucceed(() => null), Effect.flatMap((span) => Effect.promise(() => r.refetch({ ...options, updateMeta: { span } })))),
146
- r
254
+ view.result,
255
+ view.data,
256
+ (_options) => view.refetch(),
257
+ handle
147
258
  ];
148
259
  };
149
260
  const useQuery = ((self) => {
@@ -152,51 +263,35 @@ export const makeQuery = (getRuntime) => {
152
263
  });
153
264
  return useQuery;
154
265
  };
155
- export const makeStreamQuery = (getRuntime) => {
156
- const streamQuery_ = (q) => (arg) => {
157
- const context = getRuntime();
158
- const arr = arg;
159
- const req = !arg
160
- ? undefined
161
- : typeof arr === "function"
162
- ? ({
163
- get value() {
164
- return arr();
165
- }
166
- })
167
- : ref(arg);
168
- const queryKey = makeQueryKey(q);
169
- const r = useTanstackQuery({
170
- throwOnError: false,
171
- retry: (retryCount, error) => {
172
- if (error instanceof CauseException) {
173
- if (!isHttpClientError(error.cause) && !S.is(ServiceUnavailableError)(error.cause)) {
174
- return false;
175
- }
176
- }
177
- return retryCount < 5;
178
- },
179
- queryKey: [...queryKey, req],
180
- queryFn: streamedQuery({
181
- streamFn: () => {
182
- const stream = q.handler(req?.value);
183
- return streamToAsyncIterableWithCauseException(stream, context, q.id);
184
- }
185
- })
266
+ const streamQueryAtomFor = (rt, q, arg, options) => {
267
+ const family = getStreamQueryFamily(rt, q);
268
+ return observedStreamAtom(family(arg), options);
269
+ };
270
+ export const makeStreamQueryFamily = (_getRuntime, getAtomRt) => {
271
+ const useStreamQueryFamily = (q) => getStreamQueryFamily(getAtomRt(), q);
272
+ return useStreamQueryFamily;
273
+ };
274
+ export const makeStreamQueryAtom = (_getRuntime, getAtomRt) => {
275
+ const useStreamQueryAtom = (q) => (arg, options) => streamQueryAtomFor(getAtomRt(), q, arg, options);
276
+ return useStreamQueryAtom;
277
+ };
278
+ export const makeStreamQueryNew = (_getRuntime, getAtomRt) => {
279
+ const useStreamQueryNew = (q) => (arg, options) => useAtomStreamQuery(() => streamQueryAtomFor(getAtomRt(), q, toValue(arg), options));
280
+ return useStreamQueryNew;
281
+ };
282
+ export const makeStreamQuery = (getRuntime, getAtomRt) => {
283
+ const query = makeQuery(getRuntime, getAtomRt);
284
+ // A stream query is an ordinary atom query over an effect that collects the whole stream
285
+ // into an array (`Stream.runCollect`). It reuses all the atom machinery (family cache, swr,
286
+ // invalidation, structural sharing). Note: unlike the old tanstack `streamedQuery`, the result
287
+ // appears once the stream completes, not incrementally (stream queries are not used today).
288
+ const streamQuery_ = (q) => {
289
+ const hook = query({
290
+ id: q.id,
291
+ options: q.options,
292
+ handler: (i) => Stream.runCollect(q.handler(i)).pipe(Effect.map((chunk) => [...chunk]))
186
293
  });
187
- const latestSuccess = shallowRef();
188
- const result = computed(() => swrToQuery({
189
- error: r.error.value ?? undefined,
190
- data: r.data.value === undefined ? latestSuccess.value : r.data.value,
191
- isValidating: r.isFetching.value
192
- }));
193
- watch(result, (value) => latestSuccess.value = Option.getOrUndefined(AsyncResult.value(value)), { immediate: true });
194
- return [
195
- result,
196
- computed(() => latestSuccess.value),
197
- (options) => Effect.currentSpan.pipe(Effect.orElseSucceed(() => null), Effect.flatMap((span) => Effect.promise(() => r.refetch({ ...options, updateMeta: { span } })))),
198
- r
199
- ];
294
+ return (arg) => hook(arg);
200
295
  };
201
296
  return streamQuery_;
202
297
  };
@@ -229,17 +324,18 @@ export function composeQueries(results, renderPreviousOnFailure) {
229
324
  return AsyncResult.success(r, { waiting: isRefreshing });
230
325
  }
231
326
  export const useUpdateQuery = () => {
232
- const queryClient = useQueryClient();
233
- const f = (query, input, updater) => {
234
- const key = [...makeQueryKey(query), input];
235
- const data = queryClient.getQueryData(key);
236
- if (data) {
237
- queryClient.setQueryData(key, updater);
238
- }
239
- else {
240
- console.warn(`Query data for key ${key} not found`, key);
327
+ const registry = injectRegistry();
328
+ // NOTE: query atoms are derived (read-only) here, so unlike tanstack's `setQueryData` we can't
329
+ // optimistically patch the cache in place — this refetches the query (the `updater` is ignored).
330
+ // A first-class optimistic-update layer is planned for the atom-native redesign.
331
+ const f = (query, input, _updater) => {
332
+ const family = queryFamilyByKey.get(queryFamilyCacheKey(query));
333
+ if (!family) {
334
+ console.warn(`Query ${query.id} has not been used yet; nothing to update`);
335
+ return;
241
336
  }
337
+ registry.refresh(family(input));
242
338
  };
243
339
  return f;
244
340
  };
245
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELHNEQUFzRDtBQUN0RCx3REFBd0Q7QUFDeEQsNERBQTREO0FBQzVELCtEQUErRDtBQUMvRCxPQUFPLEVBQW1DLDBCQUEwQixJQUFJLGFBQWEsRUFBMkssUUFBUSxJQUFJLGdCQUFnQixFQUFFLGNBQWMsRUFBMkQsTUFBTSxxQkFBcUIsQ0FBQTtBQUNsWSxPQUFPLEtBQUssS0FBSyxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQVksTUFBTSxtQkFBbUIsQ0FBQTtBQUUxRCxPQUFPLEVBQUUsY0FBYyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFFbEYsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLEtBQUssTUFBTSxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sS0FBSyxDQUFDLE1BQU0sbUJBQW1CLENBQUE7QUFDdEMsT0FBTyxLQUFLLEtBQUssTUFBTSxjQUFjLENBQUE7QUFDckMsT0FBTyxLQUFLLE9BQU8sTUFBTSxnQkFBZ0IsQ0FBQTtBQUN6QyxPQUFPLEtBQUssSUFBSSxNQUFNLGFBQWEsQ0FBQTtBQUNuQyxPQUFPLEtBQUssSUFBSSxNQUFNLGFBQWEsQ0FBQTtBQUNuQyxPQUFPLEtBQUssS0FBSyxNQUFNLGNBQWMsQ0FBQTtBQUdyQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUN4RSxPQUFPLEtBQUssV0FBVyxNQUFNLHdDQUF3QyxDQUFBO0FBQ3JFLE9BQU8sRUFBRSxRQUFRLEVBQTJDLEdBQUcsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFvQixNQUFNLEtBQUssQ0FBQTtBQUNqSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDN0MsT0FBTyxFQUFF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
341
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELHNEQUFzRDtBQUN0RCx3REFBd0Q7QUFDeEQsNERBQTREO0FBQzVELCtEQUErRDtBQUMvRCxPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQy9ELE9BQU8sS0FBSyxLQUFLLE1BQU0sa0JBQWtCLENBQUE7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLG1CQUFtQixDQUFBO0FBSTFELE9BQU8sS0FBSyxNQUFNLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQTtBQUUzQyxPQUFPLEtBQUssSUFBSSxNQUFNLGFBQWEsQ0FBQTtBQUNuQyxPQUFPLEtBQUssTUFBTSxNQUFNLGVBQWUsQ0FBQTtBQUN2QyxPQUFPLEtBQUssV0FBVyxNQUFNLHdDQUF3QyxDQUFBO0FBQ3JFLE9BQU8sS0FBSyxJQUFJLE1BQU0saUNBQWlDLENBQUE7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBMkMsZUFBZSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFvQixNQUFNLEtBQUssQ0FBQTtBQUNuSSxPQUFPLEVBQWlELGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxzQkFBc0IsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUEwRDVNLE1BQU0sbUJBQW1CLEdBQUcsQ0FDMUIsQ0FBeUcsRUFDekcsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsc0JBQXNCLElBQUksRUFBRSxFQUFFLENBQUE7QUFFckUsOEZBQThGO0FBQzlGLCtGQUErRjtBQUMvRiw2RkFBNkY7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QUFPLENBQUMsQ0FBQTtJQUMxQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNoRCxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUNyRyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDaEMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFBO0lBQ3RCLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUN0SCxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDaEMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFBO0lBQ3RCLENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUE7SUFFbEQsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtRQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUE7UUFDMUMsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDLEVBQUUsRUFBUyxDQUFDLENBQUE7SUFDYixPQUFPLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUE7QUFDMUQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxHQUFHLEVBQUU7SUFDakMsTUFBTSxRQUFRLEdBQUcsY0FBYyxFQUFFLENBQUE7SUFFakMsK0ZBQStGO0lBQy9GLGlHQUFpRztJQUNqRyxpRkFBaUY7SUFDakYsTUFBTSxDQUFDLEdBTUgsQ0FBQyxLQUFVLEVBQUUsS0FBVSxFQUFFLFFBQWEsRUFBRSxFQUFFO1FBQzVDLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQy9ELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxLQUFLLENBQUMsRUFBRSwyQ0FBMkMsQ0FBQyxDQUFBO1lBQzFFLE9BQU07UUFDUixDQUFDO1FBQ0QsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUNqQyxDQUFDLENBQUE7SUFDRCxPQUFPLENBQUMsQ0FBQTtBQUNWLENBQUMsQ0FBQSJ9