@ic-reactor/react 3.6.0 → 3.8.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.
Files changed (131) hide show
  1. package/README.md +117 -13
  2. package/dist/auth/authentication-manager.d.ts +98 -0
  3. package/dist/auth/authentication-manager.d.ts.map +1 -0
  4. package/dist/auth/authentication-manager.js +532 -0
  5. package/dist/auth/authentication-manager.js.map +1 -0
  6. package/dist/auth/constants.d.ts +18 -0
  7. package/dist/auth/constants.d.ts.map +1 -0
  8. package/dist/auth/constants.js +18 -0
  9. package/dist/auth/constants.js.map +1 -0
  10. package/dist/auth/createIdentityAttributeHooks.d.ts +14 -0
  11. package/dist/auth/createIdentityAttributeHooks.d.ts.map +1 -0
  12. package/dist/auth/createIdentityAttributeHooks.js +54 -0
  13. package/dist/auth/createIdentityAttributeHooks.js.map +1 -0
  14. package/dist/auth/identity-attributes-manager.d.ts +26 -0
  15. package/dist/auth/identity-attributes-manager.d.ts.map +1 -0
  16. package/dist/auth/identity-attributes-manager.js +108 -0
  17. package/dist/auth/identity-attributes-manager.js.map +1 -0
  18. package/dist/auth/identity-attributes.d.ts +19 -0
  19. package/dist/auth/identity-attributes.d.ts.map +1 -0
  20. package/dist/auth/identity-attributes.js +170 -0
  21. package/dist/auth/identity-attributes.js.map +1 -0
  22. package/dist/auth/index.d.ts +8 -0
  23. package/dist/auth/index.d.ts.map +1 -0
  24. package/dist/auth/index.js +8 -0
  25. package/dist/auth/index.js.map +1 -0
  26. package/dist/auth/types.d.ts +182 -0
  27. package/dist/auth/types.d.ts.map +1 -0
  28. package/dist/auth/types.js +2 -0
  29. package/dist/auth/types.js.map +1 -0
  30. package/dist/createActorHooks.d.ts +16 -16
  31. package/dist/createActorHooks.d.ts.map +1 -1
  32. package/dist/createActorHooks.js +6 -6
  33. package/dist/createActorHooks.js.map +1 -1
  34. package/dist/createInfiniteQuery.d.ts +33 -33
  35. package/dist/createInfiniteQuery.d.ts.map +1 -1
  36. package/dist/createInfiniteQuery.js +6 -6
  37. package/dist/createInfiniteQuery.js.map +1 -1
  38. package/dist/createMutation.d.ts +13 -2
  39. package/dist/createMutation.d.ts.map +1 -1
  40. package/dist/createMutation.js +11 -0
  41. package/dist/createMutation.js.map +1 -1
  42. package/dist/createQuery.d.ts +13 -3
  43. package/dist/createQuery.d.ts.map +1 -1
  44. package/dist/createQuery.js +16 -6
  45. package/dist/createQuery.js.map +1 -1
  46. package/dist/createSuspenseInfiniteQuery.d.ts +32 -32
  47. package/dist/createSuspenseInfiniteQuery.d.ts.map +1 -1
  48. package/dist/createSuspenseInfiniteQuery.js +6 -6
  49. package/dist/createSuspenseInfiniteQuery.js.map +1 -1
  50. package/dist/createSuspenseQuery.d.ts +3 -3
  51. package/dist/createSuspenseQuery.d.ts.map +1 -1
  52. package/dist/createSuspenseQuery.js +1 -1
  53. package/dist/createSuspenseQuery.js.map +1 -1
  54. package/dist/defineReactor.d.ts +124 -0
  55. package/dist/defineReactor.d.ts.map +1 -0
  56. package/dist/defineReactor.js +145 -0
  57. package/dist/defineReactor.js.map +1 -0
  58. package/dist/{createAuthHooks.d.ts → hooks/createAuthHooks.d.ts} +6 -13
  59. package/dist/hooks/createAuthHooks.d.ts.map +1 -0
  60. package/dist/{createAuthHooks.js → hooks/createAuthHooks.js} +18 -58
  61. package/dist/hooks/createAuthHooks.js.map +1 -0
  62. package/dist/hooks/index.d.ts +2 -0
  63. package/dist/hooks/index.d.ts.map +1 -1
  64. package/dist/hooks/index.js +2 -0
  65. package/dist/hooks/index.js.map +1 -1
  66. package/dist/hooks/useActorInfiniteQuery.d.ts +9 -9
  67. package/dist/hooks/useActorInfiniteQuery.d.ts.map +1 -1
  68. package/dist/hooks/useActorInfiniteQuery.js +3 -1
  69. package/dist/hooks/useActorInfiniteQuery.js.map +1 -1
  70. package/dist/hooks/useActorMethod.d.ts +17 -17
  71. package/dist/hooks/useActorMethod.d.ts.map +1 -1
  72. package/dist/hooks/useActorMethod.js.map +1 -1
  73. package/dist/hooks/useActorMutation.d.ts +18 -7
  74. package/dist/hooks/useActorMutation.d.ts.map +1 -1
  75. package/dist/hooks/useActorMutation.js +11 -0
  76. package/dist/hooks/useActorMutation.js.map +1 -1
  77. package/dist/hooks/useActorQuery.d.ts +8 -8
  78. package/dist/hooks/useActorQuery.d.ts.map +1 -1
  79. package/dist/hooks/useActorQuery.js.map +1 -1
  80. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts +9 -9
  81. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts.map +1 -1
  82. package/dist/hooks/useActorSuspenseInfiniteQuery.js +3 -1
  83. package/dist/hooks/useActorSuspenseInfiniteQuery.js.map +1 -1
  84. package/dist/hooks/useActorSuspenseQuery.d.ts +8 -8
  85. package/dist/hooks/useActorSuspenseQuery.d.ts.map +1 -1
  86. package/dist/hooks/useActorSuspenseQuery.js.map +1 -1
  87. package/dist/index.d.ts +11 -10
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +11 -10
  90. package/dist/index.js.map +1 -1
  91. package/dist/types.d.ts +24 -24
  92. package/dist/types.d.ts.map +1 -1
  93. package/dist/utils.d.ts +3 -0
  94. package/dist/utils.d.ts.map +1 -1
  95. package/dist/utils.js +10 -2
  96. package/dist/utils.js.map +1 -1
  97. package/llms.txt +48 -0
  98. package/package.json +34 -23
  99. package/src/auth/authentication-manager.ts +591 -0
  100. package/src/auth/constants.ts +25 -0
  101. package/src/auth/createIdentityAttributeHooks.ts +83 -0
  102. package/src/auth/identity-attributes-manager.ts +136 -0
  103. package/src/auth/identity-attributes.ts +270 -0
  104. package/src/auth/index.ts +7 -0
  105. package/src/auth/types.ts +204 -0
  106. package/src/createActorHooks.ts +90 -58
  107. package/src/createInfiniteQuery.ts +154 -98
  108. package/src/createMutation.ts +35 -19
  109. package/src/createQuery.ts +94 -50
  110. package/src/createSuspenseInfiniteQuery.ts +166 -115
  111. package/src/createSuspenseQuery.ts +69 -43
  112. package/src/defineReactor.ts +272 -0
  113. package/src/{createAuthHooks.ts → hooks/createAuthHooks.ts} +23 -99
  114. package/src/hooks/index.ts +4 -0
  115. package/src/hooks/useActorInfiniteQuery.ts +44 -30
  116. package/src/hooks/useActorMethod.ts +62 -53
  117. package/src/hooks/useActorMutation.ts +47 -30
  118. package/src/hooks/useActorQuery.ts +36 -32
  119. package/src/hooks/useActorSuspenseInfiniteQuery.ts +56 -30
  120. package/src/hooks/useActorSuspenseQuery.ts +42 -32
  121. package/src/index.ts +12 -10
  122. package/src/types.ts +76 -71
  123. package/src/utils.ts +15 -2
  124. package/dist/createAuthHooks.d.ts.map +0 -1
  125. package/dist/createAuthHooks.js.map +0 -1
  126. package/src/hooks/useActorInfiniteQuery.test.tsx +0 -457
  127. package/src/hooks/useActorMethod.test.tsx +0 -798
  128. package/src/hooks/useActorMutation.test.tsx +0 -220
  129. package/src/hooks/useActorQuery.test.tsx +0 -287
  130. package/src/hooks/useActorSuspenseInfiniteQuery.test.tsx +0 -472
  131. package/src/hooks/useActorSuspenseQuery.test.tsx +0 -254
package/README.md CHANGED
@@ -13,6 +13,11 @@ pnpm add @ic-reactor/react @icp-sdk/core @tanstack/react-query
13
13
  pnpm add @icp-sdk/auth
14
14
  ```
15
15
 
16
+ `@icp-sdk/auth` is an optional peer. `AuthenticationManager` reaches it through a
17
+ literal `import("@icp-sdk/auth/client")`, so Vite, Rollup and webpack resolve it
18
+ at build time and code-split it into its own chunk — and tree-shake it away
19
+ entirely in apps that never reference the class.
20
+
16
21
  ## Quick Start
17
22
 
18
23
  ```tsx
@@ -25,7 +30,6 @@ export const queryClient = new QueryClient()
25
30
 
26
31
  export const clientManager = new ClientManager({
27
32
  queryClient,
28
- withCanisterEnv: true,
29
33
  })
30
34
 
31
35
  export const backend = new Reactor<_SERVICE>({
@@ -81,8 +85,10 @@ export function App() {
81
85
 
82
86
  - `createActorHooks(reactor)` for per-canister hooks like `useActorQuery` and
83
87
  `useActorMutation`
84
- - `createAuthHooks(clientManager)` for `useAuth`, `useAgentState`,
85
- `useUserPrincipal`, and identity attribute hooks
88
+ - `createAuthHooks(authentication)` for `useAuth`, `useAgentState`, and
89
+ `useUserPrincipal`
90
+ - `createIdentityAttributeHooks(identityAttributes)` for signed identity
91
+ attribute requests
86
92
  - direct reactor hooks like `useReactorQuery` when you want to pass the reactor
87
93
  instance at call time
88
94
  - factory helpers like `createQuery`, `createSuspenseQuery`,
@@ -134,18 +140,118 @@ const mutation = updateProfile.useMutation({
134
140
  })
135
141
  ```
136
142
 
137
- ## Identity Attributes / OpenID email and profile values
143
+ ## Internet Identity
144
+
145
+ `defineReactor` wires up Internet Identity for you — `useAuth`,
146
+ `useUserPrincipal`, `useAgentState` and `useIdentityAttributes` come back
147
+ alongside the actor hooks:
148
+
149
+ ```tsx
150
+ // src/reactor.ts
151
+ export const { useActorQuery, useAuth, useIdentityAttributes, authentication } =
152
+ defineReactor<_SERVICE>({
153
+ name: "backend",
154
+ idlFactory,
155
+ auth: {
156
+ // Required when the app is served from more than one origin, so every
157
+ // origin resolves to the same principal.
158
+ derivationOrigin: "https://app.example.com",
159
+ // The default signs the user out and reloads after 10 minutes idle.
160
+ idleOptions: { disableIdle: true },
161
+ },
162
+ })
163
+ ```
164
+
165
+ Auth options are forwarded to the underlying `@icp-sdk/auth` client:
166
+ `identityProvider`, `derivationOrigin`, `windowOpenerFeatures`,
167
+ `openIdProvider`, `storage`, `keyType`, `idleOptions`, `identity`, and
168
+ `transport`. Only the `"google" | "apple" | "microsoft"` aliases are accepted
169
+ for `openIdProvider`; any other value is dropped, since raw issuer URLs are
170
+ only meaningful on `requestOpenIdAttributes`, where they scope the keys.
171
+
172
+ Pass `authentication` from one reactor into another to share a single session
173
+ across canisters. That reactor adopts the manager's `ClientManager` so sign-in
174
+ updates the agent it calls through, so pass either `authentication` or `auth` —
175
+ not both.
138
176
 
139
- `createAuthHooks(clientManager)` exposes `useIdentityAttributes()` for signed
140
- identity attributes from `@icp-sdk/auth` v7. Existing `useAuth()`, `login()`,
141
- `logout()`, and `useUserPrincipal()` consumers keep the same IC Reactor API, but
142
- the configured auth client must support the v7 constructor/sign-in/sign-out API.
177
+ Set up manually when you need more control:
143
178
 
144
179
  ```tsx
145
- import { createAuthHooks } from "@ic-reactor/react"
180
+ // src/auth.ts
181
+ import {
182
+ AuthenticationManager,
183
+ IdentityAttributesManager,
184
+ createAuthHooks,
185
+ createIdentityAttributeHooks,
186
+ } from "@ic-reactor/react"
146
187
  import { clientManager } from "./reactor"
147
188
 
148
- const { useIdentityAttributes } = createAuthHooks(clientManager)
189
+ const authentication = new AuthenticationManager({ clientManager })
190
+ export const { useAuth, useAgentState, useUserPrincipal } =
191
+ createAuthHooks(authentication)
192
+
193
+ const identityAttributes = new IdentityAttributesManager(authentication)
194
+ export const { useIdentityAttributes } =
195
+ createIdentityAttributeHooks(identityAttributes)
196
+ ```
197
+
198
+ `useAuth()` calls `authentication.prepareClient()` on mount. Outside React, do
199
+ it yourself during startup — it preloads the auth module so `login()` can open
200
+ the identity provider window synchronously inside a click handler, which is
201
+ what browser popup blockers require:
202
+
203
+ ```ts
204
+ // once, at startup — awaits the dynamic import and builds the AuthClient
205
+ await authentication.prepareClient()
206
+
207
+ // later, inside the click handler — no await before signIn(), so the popup
208
+ // still counts as user-initiated
209
+ button.onclick = () => authentication.login()
210
+ ```
211
+
212
+ `authentication.getPreparedClient()` returns the already-built client
213
+ synchronously, or `undefined` when the module has not loaded yet.
214
+
215
+ If your bundler cannot resolve the optional peer at all, construct the client
216
+ yourself and inject it — IC Reactor then never imports `@icp-sdk/auth`:
217
+
218
+ ```ts
219
+ import { AuthClient } from "@icp-sdk/auth/client"
220
+
221
+ const authentication = new AuthenticationManager({
222
+ clientManager,
223
+ authClient: new AuthClient(),
224
+ })
225
+ ```
226
+
227
+ ## Identity Attributes / OpenID email and profile values
228
+
229
+ Identity attributes use a dedicated `IdentityAttributesManager`, with React
230
+ bindings created by `createIdentityAttributeHooks`. Works with `@icp-sdk/auth`
231
+ v7 and v8; the two versions disagree on the nonce contract and IC Reactor
232
+ normalizes whichever form you pass.
233
+
234
+ **Pass the nonce as a callback.** Awaiting your backend before calling
235
+ `requestOpenIdAttributes` ends the user gesture, and the browser then blocks
236
+ the Internet Identity window:
237
+
238
+ ```tsx
239
+ // ✅ window opens immediately, nonce resolves while the user is in II
240
+ await requestOpenIdAttributes({
241
+ nonce: () => backend.registerBegin(),
242
+ openIdProvider: "google",
243
+ keys: ["email", "name"],
244
+ })
245
+
246
+ // ❌ gesture is gone by the time the window would open
247
+ const nonce = await backend.registerBegin()
248
+ await requestOpenIdAttributes({ nonce, openIdProvider: "google", keys })
249
+ ```
250
+
251
+ ```tsx
252
+ // src/RegisterWithOpenIdProvider.tsx
253
+ import { useIdentityAttributes } from "./auth"
254
+ import { backend } from "./reactor"
149
255
 
150
256
  function RegisterWithOpenIdProvider() {
151
257
  const {
@@ -156,10 +262,8 @@ function RegisterWithOpenIdProvider() {
156
262
  } = useIdentityAttributes()
157
263
 
158
264
  async function handleProviderLogin() {
159
- const nonce = await backend.registerBegin()
160
-
161
265
  const result = await requestOpenIdAttributes({
162
- nonce,
266
+ nonce: () => backend.registerBegin(),
163
267
  openIdProvider: "microsoft",
164
268
  keys: ["email", "name"],
165
269
  windowOpenerFeatures: popupCenter(),
@@ -0,0 +1,98 @@
1
+ import type { Identity } from "@icp-sdk/core/agent";
2
+ import type { AuthClientLike, AuthClientSignInOptions, AuthState, AuthenticationClientOptions, AuthenticationSignInOptions } from "./types.js";
3
+ import { ClientManager } from "@ic-reactor/core";
4
+ export interface AuthenticationManagerParameters extends AuthenticationClientOptions {
5
+ clientManager: ClientManager;
6
+ /**
7
+ * Bring your own client instance. When provided, IC Reactor never constructs
8
+ * one and never applies the options below to it.
9
+ */
10
+ authClient?: AuthClientLike;
11
+ /** Canister ID of a locally deployed Internet Identity. */
12
+ internetIdentityId?: string;
13
+ }
14
+ /**
15
+ * Manages Internet Identity sign-in, session restoration, and authentication
16
+ * state for a {@link ClientManager}.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * const authentication = new AuthenticationManager({ clientManager })
21
+ * const identity = await authentication.authenticate()
22
+ * ```
23
+ */
24
+ export declare class AuthenticationManager {
25
+ private authClient?;
26
+ private authPromise?;
27
+ private authClientWasProvided;
28
+ private authStateRevision;
29
+ private authStateSubscribers;
30
+ private authClientConstructor?;
31
+ private authClientConstructorPromise?;
32
+ private authModuleMissing;
33
+ private authClientOptions?;
34
+ private authStateValue;
35
+ private readonly identityProvider?;
36
+ private readonly internetIdentityId?;
37
+ private readonly defaultClientOptions;
38
+ readonly clientManager: ClientManager;
39
+ /** The current authentication state. */
40
+ get authState(): AuthState;
41
+ constructor({ clientManager, authClient, identityProvider, internetIdentityId, ...clientOptions }: AuthenticationManagerParameters);
42
+ /** @internal Used by IdentityAttributesManager. */
43
+ get client(): AuthClientLike | undefined;
44
+ subscribeAuthState(callback: (state: AuthState) => void): () => void;
45
+ /**
46
+ * Preloads the auth module and creates an AuthClient ahead of time.
47
+ *
48
+ * Call (and await) this before wiring up a login button: it makes
49
+ * {@link login} and {@link IdentityAttributesManager.request} able to open
50
+ * the identity provider synchronously inside the click handler, which is
51
+ * what browser popup blockers and the ICRC-29 transport require.
52
+ */
53
+ prepareClient(options?: AuthenticationClientOptions): Promise<AuthClientLike | undefined>;
54
+ /**
55
+ * Returns an AuthClient without awaiting, or `undefined` when the auth
56
+ * module has not been loaded yet.
57
+ *
58
+ * Callers that must stay inside a user gesture use this instead of
59
+ * {@link ensureClient}; awaiting anything before opening the identity
60
+ * provider window loses the gesture.
61
+ */
62
+ getPreparedClient(options?: AuthenticationClientOptions): AuthClientLike | undefined;
63
+ authenticate: () => Promise<Identity | undefined>;
64
+ login: (loginOptions?: AuthenticationSignInOptions) => Promise<void>;
65
+ logout: (options?: {
66
+ returnTo?: string;
67
+ }) => Promise<void>;
68
+ private initializeClient;
69
+ /** @internal Used by IdentityAttributesManager. */
70
+ signInOrRecoverIdentity(options?: AuthClientSignInOptions): Promise<Identity>;
71
+ private ensurePreparedClient;
72
+ /**
73
+ * Only rebuild the client when the effective options actually changed.
74
+ *
75
+ * Recreating on every call would discard the client warmed up by
76
+ * `prepareClient()` and register a duplicate sign-out callback on the
77
+ * shared IdleManager singleton each time.
78
+ */
79
+ private shouldRecreateClient;
80
+ /**
81
+ * Merges constructor-level defaults with per-call overrides and fills in the
82
+ * network-appropriate identity provider.
83
+ */
84
+ private resolveClientOptions;
85
+ private syncStateFromClient;
86
+ /** @internal Used by IdentityAttributesManager. */
87
+ ensureClient(options?: AuthenticationClientOptions): Promise<AuthClientLike | undefined>;
88
+ /** @internal Used by IdentityAttributesManager. */
89
+ commitIdentity(identity: Identity, isAuthenticated: boolean): Promise<void>;
90
+ /** @internal Used by IdentityAttributesManager. */
91
+ setAuthenticating(): void;
92
+ /** @internal Used by IdentityAttributesManager. */
93
+ setAuthenticationError(error: Error): void;
94
+ private getDefaultIdentityProvider;
95
+ private updateState;
96
+ private loadAuthClientConstructor;
97
+ }
98
+ //# sourceMappingURL=authentication-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authentication-manager.d.ts","sourceRoot":"","sources":["../../src/auth/authentication-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,KAAK,EACV,cAAc,EACd,uBAAuB,EACvB,SAAS,EACT,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,aAAa,EAAS,MAAM,kBAAkB,CAAA;AASvD,MAAM,WAAW,+BAAgC,SAAQ,2BAA2B;IAClF,aAAa,EAAE,aAAa,CAAA;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,cAAc,CAAA;IAC3B,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAMD;;;;;;;;;GASG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,UAAU,CAAC,CAAgB;IACnC,OAAO,CAAC,WAAW,CAAC,CAA+B;IACnD,OAAO,CAAC,qBAAqB,CAAQ;IACrC,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,oBAAoB,CAAwC;IACpE,OAAO,CAAC,qBAAqB,CAAC,CAAuB;IACrD,OAAO,CAAC,4BAA4B,CAAC,CAEpC;IACD,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,iBAAiB,CAAC,CAA6B;IACvD,OAAO,CAAC,cAAc,CAKrB;IACD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAc;IAChD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAQ;IAC5C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA6B;IAClE,SAAgB,aAAa,EAAE,aAAa,CAAA;IAE5C,wCAAwC;IACxC,IAAW,SAAS,IAAI,SAAS,CAEhC;gBAEW,EACV,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,GAAG,aAAa,EACjB,EAAE,+BAA+B;IA4BlC,mDAAmD;IACnD,IAAW,MAAM,+BAEhB;IAEM,kBAAkB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI;IAS9D;;;;;;;OAOG;IACU,aAAa,CAAC,OAAO,CAAC,EAAE,2BAA2B;IAUhE;;;;;;;OAOG;IACI,iBAAiB,CACtB,OAAO,CAAC,EAAE,2BAA2B,GACpC,cAAc,GAAG,SAAS;IAItB,YAAY,QAAa,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CA0D5D;IAEM,KAAK,GAAU,eAAe,2BAA2B,mBAwD/D;IAEM,MAAM,GAAU,UAAU;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,mBAerD;YAEa,gBAAgB;IAc9B,mDAAmD;IACtC,uBAAuB,CAClC,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,QAAQ,CAAC;IAyBpB,OAAO,CAAC,oBAAoB;IAiB5B;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;YAed,mBAAmB;IAmBjC,mDAAmD;IACtC,YAAY,CAAC,OAAO,CAAC,EAAE,2BAA2B;IAQ/D,mDAAmD;IACtC,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO;IAQxE,mDAAmD;IAC5C,iBAAiB;IAIxB,mDAAmD;IAC5C,sBAAsB,CAAC,KAAK,EAAE,KAAK;IAI1C,OAAO,CAAC,0BAA0B;IAYlC,OAAO,CAAC,WAAW;YASL,yBAAyB;CAuCxC"}