jazz-tools 0.9.0 → 0.9.1
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/.turbo/turbo-build.log +6 -6
- package/CHANGELOG.md +6 -0
- package/dist/{chunk-EK2I4C5W.js → chunk-7LENDMTN.js} +1 -1
- package/dist/chunk-7LENDMTN.js.map +1 -0
- package/dist/index.native.js +1 -1
- package/dist/index.web.js +1 -1
- package/dist/testing.js +1 -1
- package/package.json +1 -1
- package/src/coValues/account.ts +1 -1
- package/src/implementation/createContext.ts +1 -1
- package/dist/chunk-EK2I4C5W.js.map +0 -1
package/.turbo/turbo-build.log
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
> jazz-tools@0.9.
|
2
|
+
> jazz-tools@0.9.1 build /home/runner/work/jazz/jazz/packages/jazz-tools
|
3
3
|
> tsup
|
4
4
|
|
5
5
|
[34mCLI[39m Building entry: {"index.web":"src/index.web.ts","index.native":"src/index.native.ts","testing":"src/testing.ts"}
|
@@ -10,11 +10,11 @@
|
|
10
10
|
[34mCLI[39m Cleaning output folder
|
11
11
|
[34mESM[39m Build start
|
12
12
|
[32mESM[39m [1mdist/index.web.js [22m[32m1.08 KB[39m
|
13
|
-
[32mESM[39m [1mdist/testing.js [22m[32m2.10 KB[39m
|
14
13
|
[32mESM[39m [1mdist/index.native.js [22m[32m1.07 KB[39m
|
15
|
-
[32mESM[39m [1mdist/
|
14
|
+
[32mESM[39m [1mdist/testing.js [22m[32m2.10 KB[39m
|
15
|
+
[32mESM[39m [1mdist/chunk-7LENDMTN.js [22m[32m82.83 KB[39m
|
16
16
|
[32mESM[39m [1mdist/index.web.js.map [22m[32m270.00 B[39m
|
17
|
-
[32mESM[39m [1mdist/testing.js.map [22m[32m4.48 KB[39m
|
18
|
-
[32mESM[39m [1mdist/chunk-EK2I4C5W.js.map [22m[32m190.92 KB[39m
|
19
17
|
[32mESM[39m [1mdist/index.native.js.map [22m[32m280.00 B[39m
|
20
|
-
[32mESM[39m
|
18
|
+
[32mESM[39m [1mdist/testing.js.map [22m[32m4.48 KB[39m
|
19
|
+
[32mESM[39m [1mdist/chunk-7LENDMTN.js.map [22m[32m190.96 KB[39m
|
20
|
+
[32mESM[39m ⚡️ Build success in 112ms
|
package/CHANGELOG.md
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../src/implementation/anonymousJazzAgent.ts","../src/coValues/interfaces.ts","../src/implementation/symbols.ts","../src/implementation/inspect.ts","../src/lib/cache.ts","../src/implementation/refs.ts","../src/implementation/schema.ts","../src/implementation/subscriptionScope.ts","../src/coValues/deepLoading.ts","../src/implementation/createContext.ts","../src/coValues/registeredSchemas.ts","../src/implementation/devtoolsFormatters.ts","../src/coValues/inbox.ts","../src/coValues/coMap.ts","../src/coValues/profile.ts","../src/coValues/account.ts","../src/coValues/group.ts","../src/coValues/coFeed.ts","../src/coValues/coList.ts","../src/coValues/extensions/imageDef.ts","../src/coValues/schemaUnion.ts"],"sourcesContent":["import { LocalNode } from \"cojson\";\n\nexport class AnonymousJazzAgent {\n _type = \"Anonymous\" as const;\n constructor(public node: LocalNode) {}\n}\n","import type {\n CoValueUniqueness,\n CojsonInternalTypes,\n RawCoValue,\n} from \"cojson\";\nimport { RawAccount } from \"cojson\";\nimport { AnonymousJazzAgent } from \"../implementation/anonymousJazzAgent.js\";\nimport type { DeeplyLoaded, DepthsIn } from \"../internal.js\";\nimport {\n Ref,\n SubscriptionScope,\n inspect,\n subscriptionsScopes,\n} from \"../internal.js\";\nimport { coValuesCache } from \"../lib/cache.js\";\nimport { type Account } from \"./account.js\";\nimport { fulfillsDepth } from \"./deepLoading.js\";\nimport { type Group } from \"./group.js\";\nimport { RegisteredSchemas } from \"./registeredSchemas.js\";\n\n/** @category Abstract interfaces */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface CoValueClass<Value extends CoValue = CoValue> {\n /** @ignore */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): Value;\n}\n\nexport interface CoValueFromRaw<V extends CoValue> {\n fromRaw(raw: V[\"_raw\"]): V;\n}\n\n/** @category Abstract interfaces */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface CoValue {\n /** @category Content */\n readonly id: ID<this>;\n /** @category Type Helpers */\n _type: string;\n /** @category Collaboration */\n _owner: Account | Group;\n /** @category Internals */\n _raw: RawCoValue;\n /** @internal */\n readonly _loadedAs: Account | AnonymousJazzAgent;\n /** @category Stringifying & Inspection */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toJSON(key?: string, seenAbove?: ID<CoValue>[]): any[] | object | string;\n /** @category Stringifying & Inspection */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [inspect](): any;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isCoValue(value: any): value is CoValue {\n return value && value._type !== undefined;\n}\n\nexport function isCoValueClass<V extends CoValue>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any,\n): value is CoValueClass<V> & CoValueFromRaw<V> {\n return typeof value === \"function\" && value.fromRaw !== undefined;\n}\n\n/**\n * IDs are unique identifiers for `CoValue`s.\n * Can be used with a type argument to refer to a specific `CoValue` type.\n *\n * @example\n *\n * ```ts\n * type AccountID = ID<Account>;\n * ```\n *\n * @category CoValues\n */\nexport type ID<T> = CojsonInternalTypes.RawCoID & IDMarker<T>;\n\ntype IDMarker<out T> = { __type(_: never): T };\n\n/** @internal */\nexport class CoValueBase implements CoValue {\n declare id: ID<this>;\n declare _type: string;\n declare _raw: RawCoValue;\n /** @category Internals */\n declare _instanceID: string;\n\n get _owner(): Account | Group {\n const owner =\n this._raw.group instanceof RawAccount\n ? RegisteredSchemas[\"Account\"].fromRaw(this._raw.group)\n : RegisteredSchemas[\"Group\"].fromRaw(this._raw.group);\n\n const subScope = subscriptionsScopes.get(this);\n if (subScope) {\n subScope.onRefAccessedOrSet(this.id, owner.id);\n subscriptionsScopes.set(owner, subScope);\n }\n\n return owner;\n }\n\n /** @private */\n get _loadedAs() {\n const rawAccount = this._raw.core.node.account;\n\n if (rawAccount instanceof RawAccount) {\n return coValuesCache.get(rawAccount, () =>\n RegisteredSchemas[\"Account\"].fromRaw(rawAccount),\n );\n }\n\n return new AnonymousJazzAgent(this._raw.core.node);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(..._args: any) {\n Object.defineProperty(this, \"_instanceID\", {\n value: `instance-${Math.random().toString(36).slice(2)}`,\n enumerable: false,\n });\n }\n\n /** @category Internals */\n static fromRaw<V extends CoValue>(this: CoValueClass<V>, raw: RawCoValue): V {\n return new this({ fromRaw: raw });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toJSON(): object | any[] | string {\n return {\n id: this.id,\n type: this._type,\n error: \"unknown CoValue class\",\n };\n }\n\n [inspect]() {\n return this.toJSON();\n }\n\n /** @category Type Helpers */\n castAs<Cl extends CoValueClass & CoValueFromRaw<CoValue>>(\n cl: Cl,\n ): InstanceType<Cl> {\n const casted = cl.fromRaw(this._raw) as InstanceType<Cl>;\n const subscriptionScope = subscriptionsScopes.get(this);\n if (subscriptionScope) {\n subscriptionsScopes.set(casted, subscriptionScope);\n }\n return casted;\n }\n}\n\nexport function loadCoValue<V extends CoValue, Depth>(\n cls: CoValueClass<V>,\n id: ID<V>,\n as: Account | AnonymousJazzAgent,\n depth: Depth & DepthsIn<V>,\n): Promise<DeeplyLoaded<V, Depth> | undefined> {\n return new Promise((resolve) => {\n subscribeToCoValue(\n cls,\n id,\n as,\n depth,\n (value, unsubscribe) => {\n resolve(value);\n unsubscribe();\n },\n () => {\n resolve(undefined);\n },\n );\n });\n}\n\nexport function ensureCoValueLoaded<V extends CoValue, Depth>(\n existing: V,\n depth: Depth & DepthsIn<V>,\n): Promise<DeeplyLoaded<V, Depth> | undefined> {\n return loadCoValue(\n existing.constructor as CoValueClass<V>,\n existing.id,\n existing._loadedAs,\n depth,\n );\n}\n\nexport function subscribeToCoValue<V extends CoValue, Depth>(\n cls: CoValueClass<V>,\n id: ID<V>,\n as: Account | AnonymousJazzAgent,\n depth: Depth & DepthsIn<V>,\n listener: (value: DeeplyLoaded<V, Depth>, unsubscribe: () => void) => void,\n onUnavailable?: () => void,\n syncResolution?: boolean,\n): () => void {\n const ref = new Ref(id, as, { ref: cls, optional: false });\n\n let unsubscribed = false;\n let unsubscribe: (() => void) | undefined;\n\n function subscribe(value: V | undefined) {\n if (!value) {\n onUnavailable && onUnavailable();\n return;\n }\n if (unsubscribed) return;\n const subscription = new SubscriptionScope(\n value,\n cls as CoValueClass<V> & CoValueFromRaw<V>,\n (update, subscription) => {\n if (fulfillsDepth(depth, update)) {\n listener(\n update as DeeplyLoaded<V, Depth>,\n subscription.unsubscribeAll,\n );\n }\n },\n );\n\n unsubscribe = subscription.unsubscribeAll;\n }\n\n const sync = syncResolution ? ref.syncLoad() : undefined;\n\n if (sync) {\n subscribe(sync);\n } else {\n ref\n .load()\n .then((value) => subscribe(value))\n .catch((e) => {\n console.error(\"Failed to load / subscribe to CoValue\", e);\n });\n }\n\n return function unsubscribeAtAnyPoint() {\n unsubscribed = true;\n unsubscribe && unsubscribe();\n };\n}\n\nexport function createCoValueObservable<V extends CoValue, Depth>(options?: {\n syncResolution?: boolean;\n}) {\n let currentValue: DeeplyLoaded<V, Depth> | undefined = undefined;\n let subscriberCount = 0;\n\n function subscribe(\n cls: CoValueClass<V>,\n id: ID<V>,\n as: Account | AnonymousJazzAgent,\n depth: Depth & DepthsIn<V>,\n listener: () => void,\n onUnavailable?: () => void,\n ) {\n subscriberCount++;\n\n const unsubscribe = subscribeToCoValue(\n cls,\n id,\n as,\n depth,\n (value) => {\n currentValue = value;\n listener();\n },\n onUnavailable,\n options?.syncResolution,\n );\n\n return () => {\n unsubscribe();\n subscriberCount--;\n if (subscriberCount === 0) {\n currentValue = undefined;\n }\n };\n }\n\n const observable = {\n getCurrentValue: () => currentValue,\n subscribe,\n };\n\n return observable;\n}\n\nexport function subscribeToExistingCoValue<V extends CoValue, Depth>(\n existing: V,\n depth: Depth & DepthsIn<V>,\n listener: (value: DeeplyLoaded<V, Depth>) => void,\n): () => void {\n return subscribeToCoValue(\n existing.constructor as CoValueClass<V>,\n existing.id,\n existing._loadedAs,\n depth,\n listener,\n );\n}\n\nexport function parseCoValueCreateOptions(\n options:\n | {\n owner: Account | Group;\n unique?: CoValueUniqueness[\"uniqueness\"];\n }\n | Account\n | Group,\n) {\n return \"_type\" in options &&\n (options._type === \"Account\" || options._type === \"Group\")\n ? { owner: options, uniqueness: undefined }\n : {\n owner: options.owner,\n uniqueness: options.unique ? { uniqueness: options.unique } : undefined,\n };\n}\n","export const SchemaInit = Symbol.for(\"SchemaInit\");\nexport type SchemaInit = typeof SchemaInit;\n\nexport const ItemsSym = Symbol.for(\"items\");\nexport type ItemsSym = typeof ItemsSym;\n\nexport const MembersSym = Symbol.for(\"members\");\nexport type MembersSym = typeof MembersSym;\n","export const inspect = Symbol.for(\"nodejs.util.inspect.custom\");\nexport type inspect = typeof inspect;\n","import { RawCoValue } from \"cojson\";\nimport { CoValue } from \"../internal.js\";\n\nconst weakMap = new WeakMap<RawCoValue, CoValue>();\n\nexport const coValuesCache = {\n get: <V extends CoValue>(raw: RawCoValue, compute: () => V) => {\n const cached = weakMap.get(raw);\n if (cached) {\n return cached as V;\n }\n const computed = compute();\n weakMap.set(raw, computed);\n return computed;\n },\n};\n","import type { CoID, RawCoValue } from \"cojson\";\nimport { type Account } from \"../coValues/account.js\";\nimport type {\n AnonymousJazzAgent,\n CoValue,\n ID,\n RefEncoded,\n UnCo,\n} from \"../internal.js\";\nimport {\n instantiateRefEncoded,\n isRefEncoded,\n subscriptionsScopes,\n} from \"../internal.js\";\nimport { coValuesCache } from \"../lib/cache.js\";\n\nconst TRACE_ACCESSES = false;\n\nexport class Ref<out V extends CoValue> {\n constructor(\n readonly id: ID<V>,\n readonly controlledAccount: Account | AnonymousJazzAgent,\n readonly schema: RefEncoded<V>,\n ) {\n if (!isRefEncoded(schema)) {\n throw new Error(\"Ref must be constructed with a ref schema\");\n }\n }\n\n get value() {\n const node =\n \"node\" in this.controlledAccount\n ? this.controlledAccount.node\n : this.controlledAccount._raw.core.node;\n const raw = node.getLoaded(this.id as unknown as CoID<RawCoValue>);\n if (raw) {\n return coValuesCache.get(raw, () =>\n instantiateRefEncoded(this.schema, raw),\n );\n } else {\n return null;\n }\n }\n\n private async loadHelper(): Promise<V | \"unavailable\"> {\n const node =\n \"node\" in this.controlledAccount\n ? this.controlledAccount.node\n : this.controlledAccount._raw.core.node;\n const raw = await node.load(this.id as unknown as CoID<RawCoValue>);\n if (raw === \"unavailable\") {\n return \"unavailable\";\n } else {\n return new Ref(this.id, this.controlledAccount, this.schema).value!;\n }\n }\n\n syncLoad(): V | undefined {\n const node =\n \"node\" in this.controlledAccount\n ? this.controlledAccount.node\n : this.controlledAccount._raw.core.node;\n\n const entry = node.coValuesStore.get(\n this.id as unknown as CoID<RawCoValue>,\n );\n\n if (entry.state.type === \"available\") {\n return new Ref(this.id, this.controlledAccount, this.schema).value!;\n }\n\n return undefined;\n }\n\n async load(): Promise<V | undefined> {\n const result = await this.loadHelper();\n if (result === \"unavailable\") {\n return undefined;\n } else {\n return result;\n }\n }\n\n accessFrom(fromScopeValue: CoValue, key: string | number | symbol): V | null {\n const subScope = subscriptionsScopes.get(fromScopeValue);\n\n subScope?.onRefAccessedOrSet(fromScopeValue.id, this.id);\n TRACE_ACCESSES &&\n console.log(subScope?.scopeID, \"accessing\", fromScopeValue, key, this.id);\n\n if (this.value && subScope) {\n subscriptionsScopes.set(this.value, subScope);\n }\n\n if (subScope) {\n const cached = subScope.cachedValues[this.id];\n if (cached) {\n TRACE_ACCESSES && console.log(\"cached\", cached);\n return cached as V;\n } else if (this.value !== null) {\n const freshValueInstance = instantiateRefEncoded(\n this.schema,\n this.value?._raw,\n );\n TRACE_ACCESSES && console.log(\"freshValueInstance\", freshValueInstance);\n subScope.cachedValues[this.id] = freshValueInstance;\n subscriptionsScopes.set(freshValueInstance, subScope);\n return freshValueInstance as V;\n } else {\n return null;\n }\n } else {\n return this.value;\n }\n }\n}\n\nexport function makeRefs<Keys extends string | number>(\n getIdForKey: (key: Keys) => ID<CoValue> | undefined,\n getKeysWithIds: () => Keys[],\n controlledAccount: Account | AnonymousJazzAgent,\n refSchemaForKey: (key: Keys) => RefEncoded<CoValue>,\n): { [K in Keys]: Ref<CoValue> } & {\n [Symbol.iterator]: () => IterableIterator<Ref<CoValue>>;\n length: number;\n} {\n const refs = {} as { [K in Keys]: Ref<CoValue> } & {\n [Symbol.iterator]: () => IterableIterator<Ref<CoValue>>;\n length: number;\n };\n return new Proxy(refs, {\n get(_target, key) {\n if (key === Symbol.iterator) {\n return function* () {\n for (const key of getKeysWithIds()) {\n yield new Ref(\n getIdForKey(key)!,\n controlledAccount,\n refSchemaForKey(key),\n );\n }\n };\n }\n if (typeof key === \"symbol\") return undefined;\n if (key === \"length\") {\n return getKeysWithIds().length;\n }\n const id = getIdForKey(key as Keys);\n if (!id) return undefined;\n return new Ref(\n id as ID<CoValue>,\n controlledAccount,\n refSchemaForKey(key as Keys),\n );\n },\n ownKeys() {\n return getKeysWithIds().map((key) => key.toString());\n },\n getOwnPropertyDescriptor(target, key) {\n const id = getIdForKey(key as Keys);\n if (id) {\n return {\n enumerable: true,\n configurable: true,\n writable: true,\n };\n } else {\n return Reflect.getOwnPropertyDescriptor(target, key);\n }\n },\n });\n}\n\nexport type RefIfCoValue<V> = NonNullable<V> extends CoValue\n ? Ref<UnCo<NonNullable<V>>>\n : never;\n","import type { JsonValue, RawCoValue } from \"cojson\";\nimport { CoJsonValue } from \"cojson/src/jsonValue.js\";\nimport {\n type CoValue,\n type CoValueClass,\n CoValueFromRaw,\n ItemsSym,\n MembersSym,\n SchemaInit,\n isCoValueClass,\n} from \"../internal.js\";\n\n/** @category Schema definition */\nexport const Encoders = {\n Date: {\n encode: (value: Date) => value.toISOString(),\n decode: (value: JsonValue) => new Date(value as string),\n },\n};\n\nexport type CoMarker = { readonly __co: unique symbol };\n/** @category Schema definition */\nexport type co<T> = T | (T & CoMarker);\nexport type IfCo<C, R> = C extends infer _A | infer B\n ? B extends CoMarker\n ? R\n : never\n : never;\nexport type UnCo<T> = T extends co<infer A> ? A : T;\n\nconst optional = {\n ref: optionalRef,\n json<T extends CoJsonValue<T>>(): co<T | undefined> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { [SchemaInit]: \"json\" satisfies Schema } as any;\n },\n encoded<T>(arg: OptionalEncoder<T>): co<T | undefined> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { [SchemaInit]: { encoded: arg } satisfies Schema } as any;\n },\n string: {\n [SchemaInit]: \"json\" satisfies Schema,\n } as unknown as co<string | undefined>,\n number: {\n [SchemaInit]: \"json\" satisfies Schema,\n } as unknown as co<number | undefined>,\n boolean: {\n [SchemaInit]: \"json\" satisfies Schema,\n } as unknown as co<boolean | undefined>,\n null: {\n [SchemaInit]: \"json\" satisfies Schema,\n } as unknown as co<null | undefined>,\n Date: {\n [SchemaInit]: { encoded: Encoders.Date } satisfies Schema,\n } as unknown as co<Date | undefined>,\n literal<T extends (string | number | boolean)[]>(\n ..._lit: T\n ): co<T[number] | undefined> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { [SchemaInit]: \"json\" satisfies Schema } as any;\n },\n};\n\n/** @category Schema definition */\nexport const co = {\n string: {\n [SchemaInit]: \"json\" satisfies Schema,\n } as unknown as co<string>,\n number: {\n [SchemaInit]: \"json\" satisfies Schema,\n } as unknown as co<number>,\n boolean: {\n [SchemaInit]: \"json\" satisfies Schema,\n } as unknown as co<boolean>,\n null: {\n [SchemaInit]: \"json\" satisfies Schema,\n } as unknown as co<null>,\n Date: {\n [SchemaInit]: { encoded: Encoders.Date } satisfies Schema,\n } as unknown as co<Date>,\n literal<T extends (string | number | boolean)[]>(..._lit: T): co<T[number]> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { [SchemaInit]: \"json\" satisfies Schema } as any;\n },\n json<T extends CoJsonValue<T>>(): co<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { [SchemaInit]: \"json\" satisfies Schema } as any;\n },\n encoded<T>(arg: Encoder<T>): co<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { [SchemaInit]: { encoded: arg } satisfies Schema } as any;\n },\n ref,\n items: ItemsSym as ItemsSym,\n members: MembersSym as MembersSym,\n optional,\n};\n\nfunction optionalRef<C extends CoValueClass>(\n arg: C | ((_raw: InstanceType<C>[\"_raw\"]) => C),\n): co<InstanceType<C> | null | undefined> {\n return ref(arg, { optional: true });\n}\n\nfunction ref<C extends CoValueClass>(\n arg: C | ((_raw: InstanceType<C>[\"_raw\"]) => C),\n options?: never,\n): co<InstanceType<C> | null>;\nfunction ref<C extends CoValueClass>(\n arg: C | ((_raw: InstanceType<C>[\"_raw\"]) => C),\n options: { optional: true },\n): co<InstanceType<C> | null | undefined>;\nfunction ref<\n C extends CoValueClass,\n Options extends { optional?: boolean } | undefined,\n>(\n arg: C | ((_raw: InstanceType<C>[\"_raw\"]) => C),\n options?: Options,\n): Options extends { optional: true }\n ? co<InstanceType<C> | null | undefined>\n : co<InstanceType<C> | null> {\n return {\n [SchemaInit]: {\n ref: arg,\n optional: options?.optional || false,\n } satisfies Schema,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any;\n}\n\nexport type JsonEncoded = \"json\";\nexport type EncodedAs<V> = { encoded: Encoder<V> | OptionalEncoder<V> };\nexport type RefEncoded<V extends CoValue> = {\n ref: CoValueClass<V> | ((raw: RawCoValue) => CoValueClass<V>);\n optional: boolean;\n};\n\nexport function isRefEncoded<V extends CoValue>(\n schema: Schema,\n): schema is RefEncoded<V> {\n return (\n typeof schema === \"object\" &&\n \"ref\" in schema &&\n \"optional\" in schema &&\n typeof schema.ref === \"function\"\n );\n}\n\nexport function instantiateRefEncoded<V extends CoValue>(\n schema: RefEncoded<V>,\n raw: RawCoValue,\n): V {\n return isCoValueClass<V>(schema.ref)\n ? schema.ref.fromRaw(raw)\n : (schema.ref as (raw: RawCoValue) => CoValueClass<V> & CoValueFromRaw<V>)(\n raw,\n ).fromRaw(raw);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Schema = JsonEncoded | RefEncoded<CoValue> | EncodedAs<any>;\n\nexport type SchemaFor<Field> = NonNullable<Field> extends CoValue\n ? RefEncoded<NonNullable<Field>>\n : NonNullable<Field> extends JsonValue\n ? JsonEncoded\n : EncodedAs<NonNullable<Field>>;\n\nexport type Encoder<V> = {\n encode: (value: V) => JsonValue;\n decode: (value: JsonValue) => V;\n};\nexport type OptionalEncoder<V> =\n | Encoder<V>\n | {\n encode: (value: V | undefined) => JsonValue;\n decode: (value: JsonValue) => V | undefined;\n };\n","import type { RawCoValue } from \"cojson\";\nimport { type Account } from \"../coValues/account.js\";\nimport type {\n AnonymousJazzAgent,\n CoValue,\n CoValueClass,\n CoValueFromRaw,\n ID,\n} from \"../internal.js\";\n\nexport const subscriptionsScopes = new WeakMap<\n CoValue,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n SubscriptionScope<any>\n>();\n\nconst TRACE_INVALIDATIONS = false;\n\nexport class SubscriptionScope<Root extends CoValue> {\n scopeID: string = `scope-${Math.random().toString(36).slice(2)}`;\n subscriber: Account | AnonymousJazzAgent;\n entries = new Map<\n ID<CoValue>,\n | { state: \"loading\"; immediatelyUnsub?: boolean }\n | { state: \"loaded\"; rawUnsub: () => void }\n >();\n rootEntry: {\n state: \"loaded\";\n value: RawCoValue;\n rawUnsub: () => void;\n };\n scheduleUpdate: () => void;\n scheduledUpdate: boolean = false;\n cachedValues: { [id: ID<CoValue>]: CoValue } = {};\n parents: { [id: ID<CoValue>]: Set<ID<CoValue>> } = {};\n\n constructor(\n root: Root,\n rootSchema: CoValueClass<Root> & CoValueFromRaw<Root>,\n onUpdate: (newRoot: Root, scope: SubscriptionScope<Root>) => void,\n ) {\n this.rootEntry = {\n state: \"loaded\" as const,\n value: root._raw,\n rawUnsub: () => {}, // placeholder\n };\n this.entries.set(root.id, this.rootEntry);\n\n subscriptionsScopes.set(root, this);\n\n this.subscriber = root._loadedAs;\n this.scheduleUpdate = () => {\n const value = rootSchema.fromRaw(this.rootEntry.value) as Root;\n subscriptionsScopes.set(value, this);\n onUpdate(value, this);\n };\n\n this.rootEntry.rawUnsub = root._raw.core.subscribe(\n (rawUpdate: RawCoValue | undefined) => {\n if (!rawUpdate) return;\n this.rootEntry.value = rawUpdate;\n this.scheduleUpdate();\n },\n );\n }\n\n onRefAccessedOrSet(\n fromId: ID<CoValue>,\n accessedOrSetId: ID<CoValue> | undefined,\n ) {\n // console.log(\"onRefAccessedOrSet\", this.scopeID, accessedOrSetId);\n if (!accessedOrSetId) {\n return;\n }\n\n this.parents[accessedOrSetId] = this.parents[accessedOrSetId] || new Set();\n this.parents[accessedOrSetId]!.add(fromId);\n\n if (!this.entries.has(accessedOrSetId)) {\n const loadingEntry = {\n state: \"loading\",\n immediatelyUnsub: false,\n } as const;\n this.entries.set(accessedOrSetId, loadingEntry);\n const node =\n this.subscriber._type === \"Account\"\n ? this.subscriber._raw.core.node\n : this.subscriber.node;\n void node.loadCoValueCore(accessedOrSetId).then((core) => {\n if (loadingEntry.state === \"loading\" && loadingEntry.immediatelyUnsub) {\n return;\n }\n if (core !== \"unavailable\") {\n const entry = {\n state: \"loaded\" as const,\n rawUnsub: () => {}, // placeholder\n };\n this.entries.set(accessedOrSetId, entry);\n\n const rawUnsub = core.subscribe((rawUpdate) => {\n // console.log(\"ref update\", this.scopeID, accessedOrSetId, JSON.stringify(rawUpdate))\n if (!rawUpdate) return;\n this.invalidate(accessedOrSetId);\n this.scheduleUpdate();\n });\n\n entry.rawUnsub = rawUnsub;\n }\n });\n }\n }\n\n invalidate(\n id: ID<CoValue>,\n fromChild?: ID<CoValue>,\n seen: Set<ID<CoValue>> = new Set(),\n ) {\n if (seen.has(id)) return;\n TRACE_INVALIDATIONS &&\n console.log(\"invalidating\", fromChild, \"->\", id, this.cachedValues[id]);\n delete this.cachedValues[id];\n seen.add(id);\n for (const parent of this.parents[id] || []) {\n this.invalidate(parent, id, seen);\n }\n }\n\n unsubscribeAll = () => {\n for (const entry of this.entries.values()) {\n if (entry.state === \"loaded\") {\n entry.rawUnsub();\n } else {\n entry.immediatelyUnsub = true;\n }\n }\n this.entries.clear();\n };\n}\n","import { SessionID } from \"cojson\";\nimport { ItemsSym, type Ref, RefEncoded, UnCo } from \"../internal.js\";\nimport { type Account } from \"./account.js\";\nimport { type CoFeed, CoFeedEntry } from \"./coFeed.js\";\nimport { type CoList } from \"./coList.js\";\nimport { type CoKeys, type CoMap } from \"./coMap.js\";\nimport { type CoValue, type ID } from \"./interfaces.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function fulfillsDepth(depth: any, value: CoValue): boolean {\n if (\n value._type === \"CoMap\" ||\n value._type === \"Group\" ||\n value._type === \"Account\"\n ) {\n if (Array.isArray(depth) && depth.length === 1) {\n return Object.entries(value).every(([key, item]) => {\n return (\n value as unknown as {\n _refs: { [key: string]: Ref<CoValue> | undefined };\n }\n )._refs[key]\n ? item && fulfillsDepth(depth[0], item)\n : ((value as CoMap)._schema[ItemsSym] as RefEncoded<CoValue>)!\n .optional;\n });\n } else {\n for (const key of Object.keys(depth)) {\n const map = value as unknown as {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n _refs: { [key: string]: Ref<CoValue> | undefined };\n };\n if (!map._refs[key] && map._schema[key].optional) {\n continue;\n }\n if (!map[key]) {\n return false;\n }\n if (!fulfillsDepth(depth[key], map[key])) {\n return false;\n }\n }\n return true;\n }\n } else if (value._type === \"CoList\") {\n if (depth.length === 0) {\n return true;\n } else {\n const itemDepth = depth[0];\n return (value as CoList).every((item, i) =>\n (value as CoList)._refs[i]\n ? item && fulfillsDepth(itemDepth, item)\n : ((value as CoList)._schema[ItemsSym] as RefEncoded<CoValue>)\n .optional,\n );\n }\n } else if (value._type === \"CoStream\") {\n if (depth.length === 0) {\n return true;\n } else {\n const itemDepth = depth[0];\n return Object.values((value as CoFeed).perSession).every((entry) =>\n entry.ref\n ? entry.value && fulfillsDepth(itemDepth, entry.value)\n : ((value as CoFeed)._schema[ItemsSym] as RefEncoded<CoValue>)\n .optional,\n );\n }\n } else if (value._type === \"BinaryCoStream\") {\n return true;\n } else {\n console.error(value);\n throw new Error(\"Unexpected value type: \" + value._type);\n }\n}\n\ntype UnCoNotNull<T> = UnCo<Exclude<T, null>>;\ntype Clean<T> = UnCo<NonNullable<T>>;\n\nexport type DepthsIn<\n V,\n DepthLimit extends number = 5,\n CurrentDepth extends number[] = [],\n> =\n | (DepthLimit extends CurrentDepth[\"length\"]\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n : // Basically V extends CoList - but if we used that we'd introduce circularity into the definition of CoList itself\n V extends Array<infer Item>\n ?\n | [DepthsIn<UnCoNotNull<Item>, DepthLimit, [0, ...CurrentDepth]>]\n | never[]\n : // Basically V extends CoMap | Group | Account - but if we used that we'd introduce circularity into the definition of CoMap itself\n V extends { _type: \"CoMap\" | \"Group\" | \"Account\" }\n ?\n | {\n [Key in CoKeys<V> as Clean<V[Key]> extends CoValue\n ? Key\n : never]?: DepthsIn<\n Clean<V[Key]>,\n DepthLimit,\n [0, ...CurrentDepth]\n >;\n }\n | (ItemsSym extends keyof V\n ? [\n DepthsIn<\n Clean<V[ItemsSym]>,\n DepthLimit,\n [0, ...CurrentDepth]\n >,\n ]\n : never)\n | never[]\n : V extends {\n _type: \"CoStream\";\n byMe: CoFeedEntry<infer Item> | undefined;\n }\n ?\n | [\n DepthsIn<\n UnCoNotNull<Item>,\n DepthLimit,\n [0, ...CurrentDepth]\n >,\n ]\n | never[]\n : never[])\n | never[];\n\nexport type DeeplyLoaded<\n V,\n Depth,\n DepthLimit extends number = 5,\n CurrentDepth extends number[] = [],\n> = DepthLimit extends CurrentDepth[\"length\"]\n ? V\n : // Basically V extends CoList - but if we used that we'd introduce circularity into the definition of CoList itself\n [V] extends [Array<infer Item>]\n ? Depth extends never[] // []\n ? V\n : UnCoNotNull<Item> extends CoValue\n ? Depth extends Array<infer ItemDepth> // [item-depth]\n ? (UnCoNotNull<Item> &\n DeeplyLoaded<\n UnCoNotNull<Item>,\n ItemDepth,\n DepthLimit,\n [0, ...CurrentDepth]\n >)[] &\n V\n : never\n : V\n : // Basically V extends CoMap | Group | Account - but if we used that we'd introduce circularity into the definition of CoMap itself\n [V] extends [{ _type: \"CoMap\" | \"Group\" | \"Account\" }]\n ? Depth extends never[]\n ? V\n : Depth extends Array<infer ItemDepth>\n ? ItemsSym extends keyof V\n ? V & {\n [key: string]: DeeplyLoaded<\n Clean<V[ItemsSym]>,\n ItemDepth,\n DepthLimit,\n [0, ...CurrentDepth]\n >;\n }\n : never\n : keyof Depth extends never\n ? V\n : {\n [Key in keyof Depth]-?: Key extends CoKeys<V>\n ? Clean<V[Key]> extends CoValue\n ?\n | DeeplyLoaded<\n Clean<V[Key]>,\n Depth[Key],\n DepthLimit,\n [0, ...CurrentDepth]\n >\n | (undefined extends V[Key] ? undefined : never)\n : never\n : never;\n } & V\n : [V] extends [\n {\n _type: \"CoStream\";\n byMe: CoFeedEntry<infer Item> | undefined;\n },\n ]\n ? Depth extends never[]\n ? V\n : V & {\n byMe?: { value: UnCoNotNull<Item> };\n inCurrentSession?: { value: UnCoNotNull<Item> };\n perSession: {\n [key: SessionID]: { value: UnCoNotNull<Item> };\n };\n } & { [key: ID<Account>]: { value: UnCoNotNull<Item> } }\n : [V] extends [\n {\n _type: \"BinaryCoStream\";\n },\n ]\n ? V\n : never;\n","import {\n AgentSecret,\n CoID,\n ControlledAgent,\n CryptoProvider,\n LocalNode,\n Peer,\n RawAccount,\n RawAccountID,\n SessionID,\n} from \"cojson\";\nimport { type Account, type AccountClass } from \"../coValues/account.js\";\nimport { RegisteredSchemas } from \"../coValues/registeredSchemas.js\";\nimport type { ID } from \"../internal.js\";\nimport { AnonymousJazzAgent } from \"./anonymousJazzAgent.js\";\n\nexport type Credentials = {\n accountID: ID<Account>;\n secret: AgentSecret;\n};\n\nexport type AuthResult =\n | {\n type: \"existing\";\n credentials: Credentials;\n saveCredentials?: (credentials: Credentials) => Promise<void>;\n onSuccess: () => void;\n onError: (error: string | Error) => void;\n logOut: () => void;\n }\n | {\n type: \"new\";\n creationProps: { name: string; anonymous?: boolean };\n initialSecret?: AgentSecret;\n saveCredentials: (credentials: Credentials) => Promise<void>;\n onSuccess: () => void;\n onError: (error: string | Error) => void;\n logOut: () => void;\n };\n\nexport interface AuthMethod {\n start(crypto: CryptoProvider): Promise<AuthResult>;\n}\n\nexport const fixedCredentialsAuth = (credentials: {\n accountID: ID<Account>;\n secret: AgentSecret;\n}): AuthMethod => {\n return {\n start: async () => ({\n type: \"existing\",\n credentials,\n saveCredentials: async () => {},\n onSuccess: () => {},\n onError: () => {},\n logOut: () => {},\n }),\n };\n};\n\nexport const ephemeralCredentialsAuth = (): AuthMethod => {\n return {\n start: async () => ({\n type: \"new\",\n creationProps: { name: \"Ephemeral\" },\n saveCredentials: async () => {},\n onSuccess: () => {},\n onError: () => {},\n logOut: () => {},\n }),\n };\n};\n\nexport async function randomSessionProvider(\n accountID: ID<Account>,\n crypto: CryptoProvider,\n) {\n return {\n sessionID: crypto.newRandomSessionID(accountID as unknown as RawAccountID),\n sessionDone: () => {},\n };\n}\n\ntype ContextParamsWithAuth<Acc extends Account> = {\n AccountSchema?: AccountClass<Acc>;\n auth: AuthMethod;\n sessionProvider: (\n accountID: ID<Account>,\n crypto: CryptoProvider,\n ) => Promise<{ sessionID: SessionID; sessionDone: () => void }>;\n} & BaseContextParams;\n\ntype BaseContextParams = {\n peersToLoadFrom: Peer[];\n crypto: CryptoProvider;\n};\n\nexport type JazzContextWithAccount<Acc extends Account> = {\n account: Acc;\n done: () => void;\n logOut: () => void;\n};\n\nexport type JazzContextWithAgent = {\n agent: AnonymousJazzAgent;\n done: () => void;\n logOut: () => void;\n};\n\nexport type JazzContext<Acc extends Account> =\n | JazzContextWithAccount<Acc>\n | JazzContextWithAgent;\n\nexport async function createJazzContext<Acc extends Account>({\n AccountSchema,\n auth,\n sessionProvider,\n peersToLoadFrom,\n crypto,\n}: ContextParamsWithAuth<Acc>): Promise<JazzContextWithAccount<Acc>>;\nexport async function createJazzContext({\n peersToLoadFrom,\n crypto,\n}: BaseContextParams): Promise<JazzContextWithAgent>;\nexport async function createJazzContext<Acc extends Account>(\n options: ContextParamsWithAuth<Acc> | BaseContextParams,\n): Promise<JazzContext<Acc>>;\nexport async function createJazzContext<Acc extends Account>(\n options: ContextParamsWithAuth<Acc> | BaseContextParams,\n): Promise<JazzContext<Acc>> {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (!(\"auth\" in options)) {\n return createAnonymousJazzContext({\n peersToLoadFrom: options.peersToLoadFrom,\n crypto: options.crypto,\n });\n }\n\n const { auth, sessionProvider, peersToLoadFrom, crypto } = options;\n const AccountSchema =\n options.AccountSchema ??\n (RegisteredSchemas[\"Account\"] as unknown as AccountClass<Acc>);\n let authResult: AuthResult;\n try {\n authResult = await auth.start(crypto);\n } catch (e) {\n console.error(\"error\", e);\n throw e;\n }\n\n if (authResult.type === \"existing\") {\n try {\n const { sessionID, sessionDone } = await sessionProvider(\n authResult.credentials.accountID,\n crypto,\n );\n\n try {\n const node = await LocalNode.withLoadedAccount({\n accountID: authResult.credentials\n .accountID as unknown as CoID<RawAccount>,\n accountSecret: authResult.credentials.secret,\n sessionID: sessionID,\n peersToLoadFrom: peersToLoadFrom,\n crypto: crypto,\n migration: async (rawAccount, _node, creationProps) => {\n const account = new AccountSchema({\n fromRaw: rawAccount,\n }) as Acc;\n\n await account.applyMigration(creationProps);\n },\n });\n\n const account = AccountSchema.fromNode(node);\n\n if (authResult.saveCredentials) {\n await authResult.saveCredentials({\n accountID: node.account.id as unknown as ID<Account>,\n secret: node.account.agentSecret,\n });\n }\n\n authResult.onSuccess();\n\n return {\n account,\n done: () => {\n node.gracefulShutdown();\n sessionDone();\n },\n logOut: () => {\n node.gracefulShutdown();\n sessionDone();\n authResult.logOut();\n },\n };\n } catch (e) {\n authResult.onError(new Error(\"Error loading account\", { cause: e }));\n sessionDone();\n }\n } catch (e) {\n authResult.onError(\n new Error(\"Error acquiring sessionID\", { cause: e }),\n );\n }\n } else if (authResult.type === \"new\") {\n try {\n // TODO: figure out a way to not \"waste\" the first SessionID\n const { node } = await LocalNode.withNewlyCreatedAccount({\n creationProps: authResult.creationProps,\n peersToLoadFrom: peersToLoadFrom,\n crypto: crypto,\n initialAgentSecret: authResult.initialSecret,\n migration: async (rawAccount, _node, creationProps) => {\n const account = new AccountSchema({\n fromRaw: rawAccount,\n }) as Acc;\n\n await account.applyMigration(creationProps);\n },\n });\n\n const account = AccountSchema.fromNode(node);\n\n await authResult.saveCredentials({\n accountID: node.account.id as unknown as ID<Account>,\n secret: node.account.agentSecret,\n });\n\n authResult.onSuccess();\n return {\n account,\n done: () => {\n node.gracefulShutdown();\n },\n logOut: () => {\n node.gracefulShutdown();\n authResult.logOut();\n },\n };\n } catch (e) {\n authResult.onError(new Error(\"Error creating account\", { cause: e }));\n }\n }\n }\n}\n\nexport async function createAnonymousJazzContext({\n peersToLoadFrom,\n crypto,\n}: {\n peersToLoadFrom: Peer[];\n crypto: CryptoProvider;\n}): Promise<JazzContextWithAgent> {\n const agentSecret = crypto.newRandomAgentSecret();\n const rawAgent = new ControlledAgent(agentSecret, crypto);\n\n const node = new LocalNode(\n rawAgent,\n crypto.newRandomSessionID(rawAgent.id),\n crypto,\n );\n\n for (const peer of peersToLoadFrom) {\n node.syncManager.addPeer(peer);\n }\n\n return {\n agent: new AnonymousJazzAgent(node),\n done: () => {},\n logOut: () => {},\n };\n}\n","import type { Account } from \"./account.js\";\nimport type { CoMap } from \"./coMap.js\";\nimport type { Group } from \"./group.js\";\n\n/**\n * Regisering schemas into this Record to avoid circular dependencies.\n */\nexport const RegisteredSchemas = {} as {\n Account: typeof Account;\n Group: typeof Group;\n CoMap: typeof CoMap;\n};\n","/* istanbul ignore file -- @preserve */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ItemsSym } from \"./symbols.js\";\n\n(globalThis as any).devtoolsFormatters = [\n {\n header: (object: any) => {\n if (object._type === \"CoMap\") {\n return [\"div\", {}, [\"span\", {}, object.constructor.name]];\n } else if (object._type === \"CoList\") {\n return [\n \"div\",\n {},\n [\"span\", {}, object.constructor.name + \"(\" + object.length + \") \"],\n ];\n } else if (object._type === \"Account\") {\n return [\n \"div\",\n {},\n [\n \"span\",\n {},\n object.constructor.name +\n \"(\" +\n object._refs.profile.value?.name +\n (object.isMe ? \" ME\" : \"\") +\n \")\",\n ],\n ];\n } else {\n return null;\n }\n },\n hasBody: function () {\n return true;\n },\n body: function (object: any) {\n if (object._type === \"CoMap\" || object._type === \"Account\") {\n return [\n \"div\",\n { style: \"margin-left: 15px\" },\n [\"div\", \"id: \", [\"object\", { object: object.id }]],\n ...Object.entries(object).map(([k, v]) => [\n \"div\",\n { style: \"white-space: nowrap;\" },\n [\"span\", { style: \"font-weight: bold; opacity: 0.6\" }, k, \": \"],\n [\"object\", { object: v }],\n ...(typeof object._schema[k] === \"function\"\n ? v === null\n ? [\n [\n \"span\",\n { style: \"opacity: 0.5\" },\n ` (pending ${object._schema[k].name} `,\n [\"object\", { object: object._refs[k] }],\n \")\",\n ],\n ]\n : []\n : []),\n ]),\n ];\n } else if (object._type === \"CoList\") {\n return [\n \"div\",\n { style: \"margin-left: 15px\" },\n [\"div\", \"id: \", [\"object\", { object: object.id }]],\n ...(object as any[]).map((v, i) => [\n \"div\",\n { style: \"white-space: nowrap;\" },\n [\"span\", { style: \"font-weight: bold; opacity: 0.6\" }, i, \": \"],\n [\"object\", { object: v }],\n ...(typeof object._schema[ItemsSym] === \"function\"\n ? v === null\n ? [\n [\n \"span\",\n { style: \"opacity: 0.5\" },\n ` (pending ${object._schema[ItemsSym].name} `,\n [\"object\", { object: object._refs[i] }],\n \")\",\n ],\n ]\n : []\n : []),\n ]),\n ];\n }\n },\n },\n];\n","import {\n CoID,\n InviteSecret,\n RawAccount,\n RawCoMap,\n RawControlledAccount,\n SessionID,\n} from \"cojson\";\nimport { CoStreamItem, RawCoStream } from \"cojson\";\nimport { type Account } from \"./account.js\";\nimport { CoValue, CoValueClass, ID, loadCoValue } from \"./interfaces.js\";\n\nexport type InboxInvite = `${CoID<MessagesStream>}/${InviteSecret}`;\ntype TxKey = `${SessionID}/${number}`;\n\ntype MessagesStream = RawCoStream<CoID<InboxMessage<CoValue, any>>>;\ntype FailedMessagesStream = RawCoStream<{\n errors: string[];\n value: CoID<InboxMessage<CoValue, any>>;\n}>;\ntype TxKeyStream = RawCoStream<TxKey>;\nexport type InboxRoot = RawCoMap<{\n messages: CoID<MessagesStream>;\n processed: CoID<TxKeyStream>;\n failed: CoID<FailedMessagesStream>;\n inviteLink: InboxInvite;\n}>;\n\nexport function createInboxRoot(account: Account) {\n if (!account.isMe) {\n throw new Error(\"Account is not controlled\");\n }\n\n const rawAccount = account._raw as RawControlledAccount;\n\n const group = rawAccount.createGroup();\n const messagesFeed = group.createStream<MessagesStream>();\n\n const inboxRoot = rawAccount.createMap<InboxRoot>();\n const processedFeed = rawAccount.createStream<TxKeyStream>();\n const failedFeed = rawAccount.createStream<FailedMessagesStream>();\n\n const inviteLink =\n `${messagesFeed.id}/${group.createInvite(\"writeOnly\")}` as const;\n\n inboxRoot.set(\"messages\", messagesFeed.id);\n inboxRoot.set(\"processed\", processedFeed.id);\n inboxRoot.set(\"failed\", failedFeed.id);\n\n return {\n id: inboxRoot.id,\n inviteLink,\n };\n}\n\ntype InboxMessage<I extends CoValue, O extends CoValue | undefined> = RawCoMap<{\n payload: ID<I>;\n result: ID<O> | undefined;\n processed: boolean;\n error: string | undefined;\n}>;\n\nfunction createInboxMessage<I extends CoValue, O extends CoValue | undefined>(\n payload: I,\n inboxOwner: RawAccount,\n) {\n const group = payload._raw.group;\n\n if (group instanceof RawAccount) {\n throw new Error(\"Inbox messages should be owned by a group\");\n }\n\n group.addMember(inboxOwner, \"writer\");\n\n const message = group.createMap<InboxMessage<I, O>>({\n payload: payload.id,\n result: undefined,\n processed: false,\n error: undefined,\n });\n\n return message;\n}\n\nexport class Inbox {\n account: Account;\n messages: MessagesStream;\n processed: TxKeyStream;\n failed: FailedMessagesStream;\n root: InboxRoot;\n processing = new Set<`${SessionID}/${number}`>();\n\n private constructor(\n account: Account,\n root: InboxRoot,\n messages: MessagesStream,\n processed: TxKeyStream,\n failed: FailedMessagesStream,\n ) {\n this.account = account;\n this.root = root;\n this.messages = messages;\n this.processed = processed;\n this.failed = failed;\n }\n\n subscribe<I extends CoValue, O extends CoValue | undefined>(\n Schema: CoValueClass<I>,\n callback: (\n message: I,\n senderAccountID: ID<Account>,\n ) => Promise<O | undefined | void>,\n options: { retries?: number } = {},\n ) {\n const processed = new Set<`${SessionID}/${number}`>();\n const failed = new Map<`${SessionID}/${number}`, string[]>();\n const node = this.account._raw.core.node;\n\n this.processed.subscribe((stream) => {\n for (const items of Object.values(stream.items)) {\n for (const item of items) {\n processed.add(item.value as TxKey);\n }\n }\n });\n\n const { account } = this;\n const { retries = 3 } = options;\n\n let failTimer: ReturnType<typeof setTimeout> | number | undefined =\n undefined;\n\n const clearFailTimer = () => {\n clearTimeout(failTimer);\n failTimer = undefined;\n };\n\n const handleNewMessages = (stream: MessagesStream) => {\n clearFailTimer(); // Stop the failure timers, we're going to process the failed entries anyway\n\n for (const [sessionID, items] of Object.entries(stream.items) as [\n SessionID,\n CoStreamItem<CoID<InboxMessage<I, O>>>[],\n ][]) {\n const accountID = getAccountIDfromSessionID(sessionID);\n\n if (!accountID) {\n console.warn(\"Received message from unknown account\", sessionID);\n continue;\n }\n\n for (const item of items) {\n const txKey = `${sessionID}/${item.tx.txIndex}` as const;\n\n if (!processed.has(txKey) && !this.processing.has(txKey)) {\n this.processing.add(txKey);\n\n const id = item.value;\n\n node\n .load(id)\n .then((message) => {\n if (message === \"unavailable\") {\n return Promise.reject(\n new Error(\"Unable to load inbox message \" + id),\n );\n }\n\n return loadCoValue(\n Schema,\n message.get(\"payload\") as ID<I>,\n account,\n [],\n );\n })\n .then((value) => {\n if (!value) {\n return Promise.reject(\n new Error(\"Unable to load inbox message \" + id),\n );\n }\n\n return callback(value, accountID);\n })\n .then((result) => {\n const inboxMessage = node\n .expectCoValueLoaded(item.value)\n .getCurrentContent() as RawCoMap;\n\n if (result) {\n inboxMessage.set(\"result\", result.id);\n }\n\n inboxMessage.set(\"processed\", true);\n\n this.processed.push(txKey);\n this.processing.delete(txKey);\n })\n .catch((error) => {\n console.error(\"Error processing inbox message\", error);\n this.processing.delete(txKey);\n const errors = failed.get(txKey) ?? [];\n\n const stringifiedError = String(error);\n errors.push(stringifiedError);\n\n const inboxMessage = node\n .expectCoValueLoaded(item.value)\n .getCurrentContent() as RawCoMap;\n\n inboxMessage.set(\"error\", stringifiedError);\n\n if (errors.length > retries) {\n inboxMessage.set(\"processed\", true);\n this.processed.push(txKey);\n this.failed.push({ errors, value: item.value });\n } else {\n failed.set(txKey, errors);\n if (!failTimer) {\n failTimer = setTimeout(\n () => handleNewMessages(stream),\n 100,\n );\n }\n }\n });\n }\n }\n }\n };\n\n return this.messages.subscribe(handleNewMessages);\n }\n\n static async load(account: Account) {\n const profile = account.profile;\n\n if (!profile) {\n throw new Error(\"Account profile should already be loaded\");\n }\n\n if (!profile.inbox) {\n throw new Error(\"The account has not set up their inbox\");\n }\n\n const node = account._raw.core.node;\n\n const root = await node.load(profile.inbox as CoID<InboxRoot>);\n\n if (root === \"unavailable\") {\n throw new Error(\"Inbox not found\");\n }\n\n const [messages, processed, failed] = await Promise.all([\n node.load(root.get(\"messages\")!),\n node.load(root.get(\"processed\")!),\n node.load(root.get(\"failed\")!),\n ]);\n\n if (\n messages === \"unavailable\" ||\n processed === \"unavailable\" ||\n failed === \"unavailable\"\n ) {\n throw new Error(\"Inbox not found\");\n }\n\n return new Inbox(account, root, messages, processed, failed);\n }\n}\n\nexport class InboxSender<I extends CoValue, O extends CoValue | undefined> {\n currentAccount: Account;\n owner: RawAccount;\n messages: MessagesStream;\n\n private constructor(\n currentAccount: Account,\n owner: RawAccount,\n messages: MessagesStream,\n ) {\n this.currentAccount = currentAccount;\n this.owner = owner;\n this.messages = messages;\n }\n\n getOwnerAccount() {\n return this.owner;\n }\n\n sendMessage(message: I): Promise<O extends CoValue ? ID<O> : undefined> {\n const inboxMessage = createInboxMessage<I, O>(message, this.owner);\n\n this.messages.push(inboxMessage.id);\n\n return new Promise((resolve, reject) => {\n inboxMessage.subscribe((message) => {\n if (message.get(\"processed\")) {\n const error = message.get(\"error\");\n if (error) {\n reject(new Error(error));\n } else {\n resolve(\n message.get(\"result\") as O extends CoValue ? ID<O> : undefined,\n );\n }\n }\n });\n });\n }\n\n static async load<\n I extends CoValue,\n O extends CoValue | undefined = undefined,\n >(inboxOwnerID: ID<Account>, currentAccount: Account) {\n const node = currentAccount._raw.core.node;\n\n const inboxOwnerRaw = await node.load(\n inboxOwnerID as unknown as CoID<RawAccount>,\n );\n\n if (inboxOwnerRaw === \"unavailable\") {\n throw new Error(\"Failed to load the inbox owner\");\n }\n\n const inboxOwnerProfileRaw = await node.load(inboxOwnerRaw.get(\"profile\")!);\n\n if (inboxOwnerProfileRaw === \"unavailable\") {\n throw new Error(\"Failed to load the inbox owner profile\");\n }\n\n const inboxInvite = inboxOwnerProfileRaw.get(\"inboxInvite\");\n\n if (!inboxInvite) {\n throw new Error(\"The user has not set up their inbox\");\n }\n\n const id = await acceptInvite(inboxInvite as InboxInvite, currentAccount);\n\n const messages = await node.load(id);\n\n if (messages === \"unavailable\") {\n throw new Error(\"Inbox not found\");\n }\n\n return new InboxSender<I, O>(currentAccount, inboxOwnerRaw, messages);\n }\n}\n\nasync function acceptInvite(invite: string, account: Account) {\n const id = invite.slice(0, invite.indexOf(\"/\")) as CoID<MessagesStream>;\n\n const inviteSecret = invite.slice(invite.indexOf(\"/\") + 1) as InviteSecret;\n\n if (!id?.startsWith(\"co_z\") || !inviteSecret.startsWith(\"inviteSecret_\")) {\n throw new Error(\"Invalid inbox ticket\");\n }\n\n if (!account.isMe) {\n throw new Error(\"Account is not controlled\");\n }\n\n await (account._raw as RawControlledAccount).acceptInvite(id, inviteSecret);\n\n return id;\n}\n\nfunction getAccountIDfromSessionID(sessionID: SessionID) {\n const until = sessionID.indexOf(\"_session\");\n const accountID = sessionID.slice(0, until);\n\n if (accountID.startsWith(\"co_z\")) {\n return accountID as ID<Account>;\n }\n\n return;\n}\n","import {\n AgentID,\n type CoValueUniqueness,\n CojsonInternalTypes,\n type JsonValue,\n RawAccountID,\n type RawCoMap,\n cojsonInternals,\n} from \"cojson\";\nimport type {\n AnonymousJazzAgent,\n CoValue,\n CoValueClass,\n DeeplyLoaded,\n DepthsIn,\n ID,\n IfCo,\n RefEncoded,\n RefIfCoValue,\n Schema,\n co,\n} from \"../internal.js\";\nimport {\n CoValueBase,\n ItemsSym,\n Ref,\n SchemaInit,\n ensureCoValueLoaded,\n inspect,\n isRefEncoded,\n loadCoValue,\n makeRefs,\n parseCoValueCreateOptions,\n subscribeToCoValue,\n subscribeToExistingCoValue,\n subscriptionsScopes,\n} from \"../internal.js\";\nimport { type Account } from \"./account.js\";\nimport { type Group } from \"./group.js\";\nimport { RegisteredSchemas } from \"./registeredSchemas.js\";\n\ntype CoMapEdit<V> = {\n value?: V;\n ref?: RefIfCoValue<V>;\n by?: Account;\n madeAt: Date;\n key?: string;\n};\n\ntype LastAndAllCoMapEdits<V> = CoMapEdit<V> & { all: CoMapEdit<V>[] };\n\nexport type Simplify<A> = {\n [K in keyof A]: A[K];\n} extends infer B\n ? B\n : never;\n\n/**\n * CoMaps are collaborative versions of plain objects, mapping string-like keys to values.\n *\n * @categoryDescription Declaration\n * Declare your own CoMap schemas by subclassing `CoMap` and assigning field schemas with `co`.\n *\n * Optional `co.ref(...)` fields must be marked with `{ optional: true }`.\n *\n * ```ts\n * import { co, CoMap } from \"jazz-tools\";\n *\n * class Person extends CoMap {\n * name = co.string;\n * age = co.number;\n * pet = co.ref(Animal);\n * car = co.ref(Car, { optional: true });\n * }\n * ```\n *\n * @categoryDescription Content\n * You can access properties you declare on a `CoMap` (using `co`) as if they were normal properties on a plain object, using dot notation, `Object.keys()`, etc.\n *\n * ```ts\n * person.name;\n * person[\"age\"];\n * person.age = 42;\n * person.pet?.name;\n * Object.keys(person);\n * // => [\"name\", \"age\", \"pet\"]\n * ```\n *\n * @category CoValues\n * */\nexport class CoMap extends CoValueBase implements CoValue {\n /**\n * The ID of this `CoMap`\n * @category Content */\n declare id: ID<this>;\n /** @category Type Helpers */\n declare _type: \"CoMap\";\n static {\n this.prototype._type = \"CoMap\";\n }\n /** @category Internals */\n declare _raw: RawCoMap;\n\n /** @internal */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static _schema: any;\n /** @internal */\n get _schema() {\n return (this.constructor as typeof CoMap)._schema as {\n [key: string]: Schema;\n } & { [ItemsSym]?: Schema };\n }\n\n /**\n * If property `prop` is a `co.ref(...)`, you can use `coMaps._refs.prop` to access\n * the `Ref` instead of the potentially loaded/null value.\n *\n * This allows you to always get the ID or load the value manually.\n *\n * @example\n * ```ts\n * person._refs.pet.id; // => ID<Animal>\n * person._refs.pet.value;\n * // => Animal | null\n * const pet = await person._refs.pet.load();\n * ```\n *\n * @category Content\n **/\n get _refs(): {\n [Key in CoKeys<this>]: IfCo<this[Key], RefIfCoValue<this[Key]>>;\n } {\n return makeRefs<CoKeys<this>>(\n (key) => this._raw.get(key as string) as unknown as ID<CoValue>,\n () => {\n const keys = this._raw.keys().filter((key) => {\n const schema =\n this._schema[key as keyof typeof this._schema] ||\n (this._schema[ItemsSym] as Schema | undefined);\n return schema && schema !== \"json\" && isRefEncoded(schema);\n }) as CoKeys<this>[];\n\n return keys;\n },\n this._loadedAs,\n (key) =>\n (this._schema[key] || this._schema[ItemsSym]) as RefEncoded<CoValue>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as any;\n }\n\n /** @internal */\n private getEditFromRaw(\n target: CoMap,\n rawEdit: {\n by: RawAccountID | AgentID;\n tx: CojsonInternalTypes.TransactionID;\n at: Date;\n value?: JsonValue | undefined;\n },\n descriptor: Schema,\n key: string,\n ) {\n return {\n value:\n descriptor === \"json\"\n ? rawEdit.value\n : \"encoded\" in descriptor\n ? rawEdit.value === null || rawEdit.value === undefined\n ? rawEdit.value\n : descriptor.encoded.decode(rawEdit.value)\n : new Ref(\n rawEdit.value as ID<CoValue>,\n target._loadedAs,\n descriptor,\n ).accessFrom(target, \"_edits.\" + key + \".value\"),\n ref:\n descriptor !== \"json\" && isRefEncoded(descriptor)\n ? new Ref(rawEdit.value as ID<CoValue>, target._loadedAs, descriptor)\n : undefined,\n by:\n rawEdit.by &&\n new Ref<Account>(rawEdit.by as ID<Account>, target._loadedAs, {\n ref: RegisteredSchemas[\"Account\"],\n optional: false,\n }).accessFrom(target, \"_edits.\" + key + \".by\"),\n madeAt: rawEdit.at,\n key,\n };\n }\n\n /** @category Collaboration */\n get _edits() {\n const map = this;\n return new Proxy(\n {},\n {\n get(_target, key) {\n const rawEdit = map._raw.lastEditAt(key as string);\n if (!rawEdit) return undefined;\n\n const descriptor = map._schema[\n key as keyof typeof map._schema\n ] as Schema;\n\n return {\n ...map.getEditFromRaw(map, rawEdit, descriptor, key as string),\n get all() {\n return [...map._raw.editsAt(key as string)].map((rawEdit) =>\n map.getEditFromRaw(map, rawEdit, descriptor, key as string),\n );\n },\n };\n },\n ownKeys(_target) {\n return map._raw.keys();\n },\n getOwnPropertyDescriptor(target, key) {\n return {\n value: Reflect.get(target, key),\n writable: false,\n enumerable: true,\n configurable: true,\n };\n },\n },\n ) as {\n [Key in CoKeys<this>]: IfCo<this[Key], LastAndAllCoMapEdits<this[Key]>>;\n };\n }\n\n /** @internal */\n constructor(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: { fromRaw: RawCoMap } | undefined,\n ) {\n super();\n\n if (options) {\n if (\"fromRaw\" in options) {\n Object.defineProperties(this, {\n id: {\n value: options.fromRaw.id as unknown as ID<this>,\n enumerable: false,\n },\n _raw: { value: options.fromRaw, enumerable: false },\n });\n } else {\n throw new Error(\"Invalid CoMap constructor arguments\");\n }\n }\n\n return new Proxy(this, CoMapProxyHandler as ProxyHandler<this>);\n }\n\n /**\n * Create a new CoMap with the given initial values and owner.\n *\n * The owner (a Group or Account) determines access rights to the CoMap.\n *\n * The CoMap will immediately be persisted and synced to connected peers.\n *\n * @example\n * ```ts\n * const person = Person.create({\n * name: \"Alice\",\n * age: 42,\n * pet: cat,\n * }, { owner: friendGroup });\n * ```\n *\n * @category Creation\n **/\n static create<M extends CoMap>(\n this: CoValueClass<M>,\n init: Simplify<CoMapInit<M>>,\n options:\n | {\n owner: Account | Group;\n unique?: CoValueUniqueness[\"uniqueness\"];\n }\n | Account\n | Group,\n ) {\n const instance = new this();\n\n const { owner, uniqueness } = parseCoValueCreateOptions(options);\n const raw = instance.rawFromInit(init, owner, uniqueness);\n\n Object.defineProperties(instance, {\n id: {\n value: raw.id,\n enumerable: false,\n },\n _raw: { value: raw, enumerable: false },\n });\n return instance;\n }\n\n /**\n * Return a JSON representation of the `CoMap`\n * @category Content\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toJSON(_key?: string, seenAbove?: ID<CoValue>[]): any[] {\n const jsonedFields = this._raw.keys().map((key) => {\n const tKey = key as CoKeys<this>;\n const descriptor = (this._schema[tKey] ||\n this._schema[ItemsSym]) as Schema;\n\n if (descriptor == \"json\" || \"encode\" in descriptor) {\n return [key, this._raw.get(key)];\n } else if (isRefEncoded(descriptor)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (seenAbove?.includes((this as any)[tKey]?.id)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return [key, { _circular: (this as any)[tKey]?.id }];\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const jsonedRef = (this as any)[tKey]?.toJSON(tKey, [\n ...(seenAbove || []),\n this.id,\n ]);\n return [key, jsonedRef];\n } else {\n return [key, undefined];\n }\n });\n\n return {\n id: this.id,\n _type: this._type,\n ...Object.fromEntries(jsonedFields),\n };\n }\n\n [inspect]() {\n return this.toJSON();\n }\n\n /**\n * Create a new `RawCoMap` from an initialization object\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rawFromInit<Fields extends object = Record<string, any>>(\n init: Simplify<CoMapInit<Fields>> | undefined,\n owner: Account | Group,\n uniqueness?: CoValueUniqueness,\n ) {\n const rawOwner = owner._raw;\n\n const rawInit = {} as {\n [key in keyof Fields]: JsonValue | undefined;\n };\n\n if (init)\n for (const key of Object.keys(init) as (keyof Fields)[]) {\n const initValue = init[key as keyof typeof init];\n\n const descriptor = (this._schema[key as keyof typeof this._schema] ||\n this._schema[ItemsSym]) as Schema;\n\n if (!descriptor) {\n continue;\n }\n\n if (descriptor === \"json\") {\n rawInit[key] = initValue as JsonValue;\n } else if (isRefEncoded(descriptor)) {\n if (initValue) {\n rawInit[key] = (initValue as unknown as CoValue).id;\n }\n } else if (\"encoded\" in descriptor) {\n rawInit[key] = descriptor.encoded.encode(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n initValue as any,\n );\n }\n }\n\n return rawOwner.createMap(rawInit, null, \"private\", uniqueness);\n }\n\n /**\n * Declare a Record-like CoMap schema, by extending `CoMap.Record(...)` and passing the value schema using `co`. Keys are always `string`.\n *\n * @example\n * ```ts\n * import { co, CoMap } from \"jazz-tools\";\n *\n * class ColorToFruitMap extends CoMap.Record(\n * co.ref(Fruit)\n * ) {}\n *\n * // assume we have map: ColorToFruitMap\n * // and strawberry: Fruit\n * map[\"red\"] = strawberry;\n * ```\n *\n * @category Declaration\n */\n static Record<Value>(value: IfCo<Value, Value>) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\n class RecordLikeCoMap extends CoMap {\n [ItemsSym] = value;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\n interface RecordLikeCoMap extends Record<string, Value> {}\n\n return RecordLikeCoMap;\n }\n\n /**\n * Load a `CoMap` with a given ID, as a given account.\n *\n * `depth` specifies which (if any) fields that reference other CoValues to load as well before resolving.\n * The `DeeplyLoaded` return type guarantees that corresponding referenced CoValues are loaded to the specified depth.\n *\n * You can pass `[]` or `{}` for shallowly loading only this CoMap, or `{ fieldA: depthA, fieldB: depthB }` for recursively loading referenced CoValues.\n *\n * Check out the `load` methods on `CoMap`/`CoList`/`CoFeed`/`Group`/`Account` to see which depth structures are valid to nest.\n *\n * @example\n * ```ts\n * const person = await Person.load(\n * \"co_zdsMhHtfG6VNKt7RqPUPvUtN2Ax\",\n * me,\n * { pet: {} }\n * );\n * ```\n *\n * @category Subscription & Loading\n */\n static load<M extends CoMap, Depth>(\n this: CoValueClass<M>,\n id: ID<M>,\n as: Account,\n depth: Depth & DepthsIn<M>,\n ): Promise<DeeplyLoaded<M, Depth> | undefined> {\n return loadCoValue(this, id, as, depth);\n }\n\n /**\n * Load and subscribe to a `CoMap` with a given ID, as a given account.\n *\n * Automatically also subscribes to updates to all referenced/nested CoValues as soon as they are accessed in the listener.\n *\n * `depth` specifies which (if any) fields that reference other CoValues to load as well before calling `listener` for the first time.\n * The `DeeplyLoaded` return type guarantees that corresponding referenced CoValues are loaded to the specified depth.\n *\n * You can pass `[]` or `{}` for shallowly loading only this CoMap, or `{ fieldA: depthA, fieldB: depthB }` for recursively loading referenced CoValues.\n *\n * Check out the `load` methods on `CoMap`/`CoList`/`CoFeed`/`Group`/`Account` to see which depth structures are valid to nest.\n *\n * Returns an unsubscribe function that you should call when you no longer need updates.\n *\n * Also see the `useCoState` hook to reactively subscribe to a CoValue in a React component.\n *\n * @example\n * ```ts\n * const unsub = Person.subscribe(\n * \"co_zdsMhHtfG6VNKt7RqPUPvUtN2Ax\",\n * me,\n * { pet: {} },\n * (person) => console.log(person)\n * );\n * ```\n *\n * @category Subscription & Loading\n */\n static subscribe<M extends CoMap, Depth>(\n this: CoValueClass<M>,\n id: ID<M>,\n as: Account,\n depth: Depth & DepthsIn<M>,\n listener: (value: DeeplyLoaded<M, Depth>) => void,\n ): () => void {\n return subscribeToCoValue<M, Depth>(this, id, as, depth, listener);\n }\n\n static findUnique<M extends CoMap>(\n this: CoValueClass<M>,\n unique: CoValueUniqueness[\"uniqueness\"],\n ownerID: ID<Account> | ID<Group>,\n as: Account | Group | AnonymousJazzAgent,\n ) {\n const header = {\n type: \"comap\" as const,\n ruleset: {\n type: \"ownedByGroup\" as const,\n group: ownerID,\n },\n meta: null,\n uniqueness: unique,\n };\n const crypto =\n as._type === \"Anonymous\" ? as.node.crypto : as._raw.core.crypto;\n return cojsonInternals.idforHeader(header, crypto) as ID<M>;\n }\n\n /**\n * Given an already loaded `CoMap`, ensure that the specified fields are loaded to the specified depth.\n *\n * Works like `CoMap.load()`, but you don't need to pass the ID or the account to load as again.\n *\n * @category Subscription & Loading\n */\n ensureLoaded<M extends CoMap, Depth>(\n this: M,\n depth: Depth & DepthsIn<M>,\n ): Promise<DeeplyLoaded<M, Depth> | undefined> {\n return ensureCoValueLoaded(this, depth);\n }\n\n /**\n * Given an already loaded `CoMap`, subscribe to updates to the `CoMap` and ensure that the specified fields are loaded to the specified depth.\n *\n * Works like `CoMap.subscribe()`, but you don't need to pass the ID or the account to load as again.\n *\n * Returns an unsubscribe function that you should call when you no longer need updates.\n *\n * @category Subscription & Loading\n **/\n subscribe<M extends CoMap, Depth>(\n this: M,\n depth: Depth & DepthsIn<M>,\n listener: (value: DeeplyLoaded<M, Depth>) => void,\n ): () => void {\n return subscribeToExistingCoValue(this, depth, listener);\n }\n\n applyDiff<N extends Partial<CoMapInit<this>>>(newValues: N) {\n for (const key in newValues) {\n if (Object.prototype.hasOwnProperty.call(newValues, key)) {\n const tKey = key as keyof typeof newValues & keyof this;\n const descriptor = (this._schema[tKey as string] ||\n this._schema[ItemsSym]) as Schema;\n\n if (tKey in this._schema) {\n const newValue = newValues[tKey];\n const currentValue = (this as unknown as N)[tKey];\n\n if (descriptor === \"json\" || \"encoded\" in descriptor) {\n if (currentValue !== newValue) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any)[tKey] = newValue;\n }\n } else if (isRefEncoded(descriptor)) {\n const currentId = (currentValue as CoValue | undefined)?.id;\n const newId = (newValue as CoValue | undefined)?.id;\n if (currentId !== newId) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any)[tKey] = newValue;\n }\n }\n }\n }\n }\n return this;\n }\n\n /**\n * Wait for the `CoMap` to be uploaded to the other peers.\n *\n * @category Subscription & Loading\n */\n waitForSync(options?: { timeout?: number }) {\n return this._raw.core.waitForSync(options);\n }\n}\n\nexport type CoKeys<Map extends object> = Exclude<\n keyof Map & string,\n keyof CoMap\n>;\n\n/**\n * Force required ref fields to be non nullable\n *\n * Considering that:\n * - Optional refs are typed as co<InstanceType<CoValueClass> | null | undefined>\n * - Required refs are typed as co<InstanceType<CoValueClass> | null>\n *\n * This type works in two steps:\n * - Remove the null from both types\n * - Then we check if the input type accepts undefined, if positive we put the null union back\n *\n * So the optional refs stays unchanged while we safely remove the null union\n * from required refs\n *\n * This way required refs can be marked as required in the CoMapInit while\n * staying a nullable property for value access.\n *\n * Example:\n *\n * const map = MyCoMap.create({\n * requiredRef: NestedMap.create({}) // null is not valid here\n * })\n *\n * map.requiredRef // this value is still nullable\n */\ntype ForceRequiredRef<V> = V extends co<InstanceType<CoValueClass> | null>\n ? NonNullable<V>\n : V extends co<InstanceType<CoValueClass> | undefined>\n ? V | null\n : V;\n\nexport type CoMapInit<Map extends object> = {\n [Key in CoKeys<Map> as undefined extends Map[Key]\n ? never\n : IfCo<Map[Key], Key>]: ForceRequiredRef<Map[Key]>;\n} & {\n [Key in CoKeys<Map> as IfCo<Map[Key], Key>]?: ForceRequiredRef<Map[Key]>;\n};\n\n// TODO: cache handlers per descriptor for performance?\nconst CoMapProxyHandler: ProxyHandler<CoMap> = {\n get(target, key, receiver) {\n if (key === \"_schema\") {\n return Reflect.get(target, key);\n } else if (key in target) {\n return Reflect.get(target, key, receiver);\n } else {\n const schema = target._schema;\n\n if (!schema) {\n return undefined;\n }\n\n const descriptor = (schema[key as keyof CoMap[\"_schema\"]] ||\n schema[ItemsSym]) as Schema;\n if (descriptor && typeof key === \"string\") {\n const raw = target._raw.get(key);\n\n if (descriptor === \"json\") {\n return raw;\n } else if (\"encoded\" in descriptor) {\n return raw === undefined ? undefined : descriptor.encoded.decode(raw);\n } else if (isRefEncoded(descriptor)) {\n return raw === undefined\n ? undefined\n : new Ref(\n raw as unknown as ID<CoValue>,\n target._loadedAs,\n descriptor,\n ).accessFrom(receiver, key);\n }\n } else {\n return undefined;\n }\n }\n },\n set(target, key, value, receiver) {\n if (\n (typeof key === \"string\" || ItemsSym) &&\n typeof value === \"object\" &&\n value !== null &&\n SchemaInit in value\n ) {\n (target.constructor as typeof CoMap)._schema ||= {};\n (target.constructor as typeof CoMap)._schema[key] = value[SchemaInit];\n return true;\n }\n\n const descriptor = (target._schema[key as keyof CoMap[\"_schema\"]] ||\n target._schema[ItemsSym]) as Schema;\n if (descriptor && typeof key === \"string\") {\n if (descriptor === \"json\") {\n target._raw.set(key, value);\n } else if (\"encoded\" in descriptor) {\n target._raw.set(key, descriptor.encoded.encode(value));\n } else if (isRefEncoded(descriptor)) {\n if (value === null) {\n if (descriptor.optional) {\n target._raw.set(key, null);\n } else {\n throw new Error(`Cannot set required reference ${key} to null`);\n }\n } else {\n target._raw.set(key, value.id);\n subscriptionsScopes\n .get(target)\n ?.onRefAccessedOrSet(target.id, value.id);\n }\n }\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n },\n defineProperty(target, key, attributes) {\n if (\n \"value\" in attributes &&\n typeof attributes.value === \"object\" &&\n SchemaInit in attributes.value\n ) {\n (target.constructor as typeof CoMap)._schema ||= {};\n (target.constructor as typeof CoMap)._schema[key as string] =\n attributes.value[SchemaInit];\n return true;\n } else {\n return Reflect.defineProperty(target, key, attributes);\n }\n },\n ownKeys(target) {\n const keys = Reflect.ownKeys(target).filter((k) => k !== ItemsSym);\n // for (const key of Reflect.ownKeys(target._schema)) {\n // if (key !== ItemsSym && !keys.includes(key)) {\n // keys.push(key);\n // }\n // }\n for (const key of target._raw.keys()) {\n if (!keys.includes(key)) {\n keys.push(key);\n }\n }\n\n return keys;\n },\n getOwnPropertyDescriptor(target, key) {\n if (key in target) {\n return Reflect.getOwnPropertyDescriptor(target, key);\n } else {\n const descriptor = (target._schema[key as keyof CoMap[\"_schema\"]] ||\n target._schema[ItemsSym]) as Schema;\n if (descriptor || key in target._raw.latest) {\n return {\n enumerable: true,\n configurable: true,\n writable: true,\n };\n }\n }\n },\n has(target, key) {\n const descriptor = (target._schema?.[key as keyof CoMap[\"_schema\"]] ||\n target._schema?.[ItemsSym]) as Schema;\n\n if (target._raw && typeof key === \"string\" && descriptor) {\n return target._raw.get(key) !== undefined;\n } else {\n return Reflect.has(target, key);\n }\n },\n deleteProperty(target, key) {\n const descriptor = (target._schema[key as keyof CoMap[\"_schema\"]] ||\n target._schema[ItemsSym]) as Schema;\n if (typeof key === \"string\" && descriptor) {\n target._raw.delete(key);\n return true;\n } else {\n return Reflect.deleteProperty(target, key);\n }\n },\n};\n\nRegisteredSchemas[\"CoMap\"] = CoMap;\n","import { CoID } from \"cojson\";\nimport { co } from \"../internal.js\";\nimport { CoMap } from \"./coMap.js\";\nimport { InboxInvite, InboxRoot } from \"./inbox.js\";\n\n/** @category Identity & Permissions */\nexport class Profile extends CoMap {\n name = co.string;\n inbox = co.optional.json<CoID<InboxRoot>>();\n inboxInvite = co.optional.json<InboxInvite>();\n}\n","import {\n AgentSecret,\n CoID,\n CryptoProvider,\n InviteSecret,\n LocalNode,\n Peer,\n RawAccount,\n RawCoMap,\n RawCoValue,\n RawControlledAccount,\n SessionID,\n cojsonInternals,\n} from \"cojson\";\nimport {\n AnonymousJazzAgent,\n type CoValue,\n CoValueBase,\n CoValueClass,\n DeeplyLoaded,\n DepthsIn,\n ID,\n MembersSym,\n Ref,\n type RefEncoded,\n RefIfCoValue,\n type Schema,\n SchemaInit,\n ensureCoValueLoaded,\n inspect,\n loadCoValue,\n subscribeToCoValue,\n subscribeToExistingCoValue,\n subscriptionsScopes,\n} from \"../internal.js\";\nimport { coValuesCache } from \"../lib/cache.js\";\nimport { type CoMap } from \"./coMap.js\";\nimport { type Group } from \"./group.js\";\nimport { createInboxRoot } from \"./inbox.js\";\nimport { Profile } from \"./profile.js\";\nimport { RegisteredSchemas } from \"./registeredSchemas.js\";\n\n/** @category Identity & Permissions */\nexport class Account extends CoValueBase implements CoValue {\n declare id: ID<this>;\n declare _type: \"Account\";\n declare _raw: RawAccount | RawControlledAccount;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static _schema: any;\n get _schema(): {\n profile: Schema;\n root: Schema;\n } {\n return (this.constructor as typeof Account)._schema;\n }\n static {\n this._schema = {\n profile: {\n ref: () => Profile,\n optional: false,\n } satisfies RefEncoded<Profile>,\n root: {\n ref: () => RegisteredSchemas[\"CoMap\"],\n optional: true,\n } satisfies RefEncoded<CoMap>,\n };\n }\n\n get _owner(): Account {\n return this as Account;\n }\n get _loadedAs(): Account | AnonymousJazzAgent {\n if (this.isMe) return this;\n\n const rawAccount = this._raw.core.node.account;\n\n if (rawAccount instanceof RawAccount) {\n return coValuesCache.get(rawAccount, () => Account.fromRaw(rawAccount));\n }\n\n return new AnonymousJazzAgent(this._raw.core.node);\n }\n\n declare profile: Profile | null;\n declare root: CoMap | null;\n\n get _refs(): {\n profile: RefIfCoValue<Profile> | undefined;\n root: RefIfCoValue<CoMap> | undefined;\n } {\n const profileID = this._raw.get(\"profile\") as unknown as\n | ID<NonNullable<this[\"profile\"]>>\n | undefined;\n const rootID = this._raw.get(\"root\") as unknown as\n | ID<NonNullable<this[\"root\"]>>\n | undefined;\n\n return {\n profile:\n profileID &&\n (new Ref(\n profileID,\n this._loadedAs,\n this._schema.profile as RefEncoded<\n NonNullable<this[\"profile\"]> & CoValue\n >,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as any as RefIfCoValue<this[\"profile\"]>),\n root:\n rootID &&\n (new Ref(\n rootID,\n this._loadedAs,\n this._schema.root as RefEncoded<NonNullable<this[\"root\"]> & CoValue>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as any as RefIfCoValue<this[\"root\"]>),\n };\n }\n\n isMe: boolean;\n sessionID: SessionID | undefined;\n\n constructor(options: { fromRaw: RawAccount | RawControlledAccount }) {\n super();\n if (!(\"fromRaw\" in options)) {\n throw new Error(\"Can only construct account from raw or with .create()\");\n }\n this.isMe = options.fromRaw.id == options.fromRaw.core.node.account.id;\n\n Object.defineProperties(this, {\n id: {\n value: options.fromRaw.id,\n enumerable: false,\n },\n _raw: { value: options.fromRaw, enumerable: false },\n _type: { value: \"Account\", enumerable: false },\n });\n\n if (this.isMe) {\n this.sessionID = options.fromRaw.core.node.currentSessionID;\n }\n\n return new Proxy(this, AccountAndGroupProxyHandler as ProxyHandler<this>);\n }\n\n myRole(): \"admin\" | undefined {\n if (this.isMe) {\n return \"admin\";\n }\n }\n\n async acceptInvite<V extends CoValue>(\n valueID: ID<V>,\n inviteSecret: InviteSecret,\n coValueClass: CoValueClass<V>,\n ) {\n if (!this.isMe) {\n throw new Error(\"Only a controlled account can accept invites\");\n }\n\n await (this._raw as RawControlledAccount).acceptInvite(\n valueID as unknown as CoID<RawCoValue>,\n inviteSecret,\n );\n\n return loadCoValue(coValueClass, valueID, this as Account, []);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }\n\n /** @private */\n static async create<A extends Account>(\n this: CoValueClass<A> & typeof Account,\n options: {\n creationProps: { name: string };\n initialAgentSecret?: AgentSecret;\n peersToLoadFrom?: Peer[];\n crypto: CryptoProvider;\n },\n ): Promise<A> {\n const { node } = await LocalNode.withNewlyCreatedAccount({\n ...options,\n migration: async (rawAccount, _node, creationProps) => {\n const account = new this({\n fromRaw: rawAccount,\n }) as A;\n\n await account.applyMigration?.(creationProps);\n },\n });\n\n return this.fromNode(node) as A;\n }\n\n static async createAs<A extends Account>(\n this: CoValueClass<A> & typeof Account,\n as: Account,\n options: {\n creationProps: { name: string };\n },\n ) {\n // TODO: is there a cleaner way to do this?\n const connectedPeers = cojsonInternals.connectedPeers(\n \"creatingAccount\",\n \"createdAccount\",\n { peer1role: \"server\", peer2role: \"client\" },\n );\n\n as._raw.core.node.syncManager.addPeer(connectedPeers[1]);\n\n return this.create<A>({\n creationProps: options.creationProps,\n crypto: as._raw.core.node.crypto,\n peersToLoadFrom: [connectedPeers[0]],\n });\n }\n\n static fromNode<A extends Account>(\n this: CoValueClass<A>,\n node: LocalNode,\n ): A {\n return new this({\n fromRaw: node.account as RawControlledAccount,\n }) as A;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toJSON(): object | any[] {\n return {\n id: this.id,\n _type: this._type,\n };\n }\n\n [inspect]() {\n return this.toJSON();\n }\n\n async applyMigration(creationProps?: { name: string; onboarding?: boolean }) {\n if (creationProps) {\n const profileGroup = RegisteredSchemas[\"Group\"].create({ owner: this });\n profileGroup.addMember(\"everyone\", \"reader\");\n this.profile = Profile.create(\n { name: creationProps.name },\n { owner: profileGroup },\n );\n }\n\n const node = this._raw.core.node;\n const profile = node\n .expectCoValueLoaded(this._raw.get(\"profile\")!)\n .getCurrentContent() as RawCoMap;\n\n if (!profile.get(\"inbox\")) {\n const inboxRoot = createInboxRoot(this);\n profile.set(\"inbox\", inboxRoot.id);\n profile.set(\"inboxInvite\", inboxRoot.inviteLink);\n }\n\n await this.migrate(creationProps);\n }\n\n // Placeholder method for subclasses to override\n migrate(creationProps?: { name: string }) {\n creationProps; // To avoid unused parameter warning\n }\n\n /** @category Subscription & Loading */\n static load<A extends Account, Depth>(\n this: CoValueClass<A>,\n id: ID<A>,\n as: Account,\n depth: Depth & DepthsIn<A>,\n ): Promise<DeeplyLoaded<A, Depth> | undefined> {\n return loadCoValue(this, id, as, depth);\n }\n\n /** @category Subscription & Loading */\n static subscribe<A extends Account, Depth>(\n this: CoValueClass<A>,\n id: ID<A>,\n as: Account,\n depth: Depth & DepthsIn<A>,\n listener: (value: DeeplyLoaded<A, Depth>) => void,\n ): () => void {\n return subscribeToCoValue<A, Depth>(this, id, as, depth, listener);\n }\n\n /** @category Subscription & Loading */\n ensureLoaded<A extends Account, Depth>(\n this: A,\n depth: Depth & DepthsIn<A>,\n ): Promise<DeeplyLoaded<A, Depth> | undefined> {\n return ensureCoValueLoaded(this, depth);\n }\n\n /** @category Subscription & Loading */\n subscribe<A extends Account, Depth>(\n this: A,\n depth: Depth & DepthsIn<A>,\n listener: (value: DeeplyLoaded<A, Depth>) => void,\n ): () => void {\n return subscribeToExistingCoValue(this, depth, listener);\n }\n\n /**\n * Wait for the `Account` to be uploaded to the other peers.\n *\n * @category Subscription & Loading\n */\n waitForSync(options?: {\n timeout?: number;\n }) {\n return this._raw.core.waitForSync(options);\n }\n\n /**\n * Wait for all the available `CoValues` to be uploaded to the other peers.\n *\n * @category Subscription & Loading\n */\n waitForAllCoValuesSync(options?: {\n timeout?: number;\n }) {\n return this._raw.core.node.syncManager.waitForAllCoValuesSync(\n options?.timeout,\n );\n }\n}\n\nexport const AccountAndGroupProxyHandler: ProxyHandler<Account | Group> = {\n get(target, key, receiver) {\n if (key === \"profile\") {\n const ref = target._refs.profile;\n return ref\n ? ref.accessFrom(receiver, \"profile\")\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (undefined as any);\n } else if (key === \"root\") {\n const ref = target._refs.root;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return ref ? ref.accessFrom(receiver, \"root\") : (undefined as any);\n } else {\n return Reflect.get(target, key, receiver);\n }\n },\n set(target, key, value, receiver) {\n if (\n (key === \"profile\" || key === \"root\" || key === MembersSym) &&\n typeof value === \"object\" &&\n SchemaInit in value\n ) {\n (target.constructor as typeof CoMap)._schema ||= {};\n (target.constructor as typeof CoMap)._schema[key] = value[SchemaInit];\n return true;\n } else if (key === \"profile\") {\n if (value) {\n target._raw.set(\n \"profile\",\n value.id as unknown as CoID<RawCoMap>,\n \"trusting\",\n );\n }\n subscriptionsScopes\n .get(receiver)\n ?.onRefAccessedOrSet(target.id, value.id);\n return true;\n } else if (key === \"root\") {\n if (value) {\n target._raw.set(\"root\", value.id as unknown as CoID<RawCoMap>);\n }\n subscriptionsScopes\n .get(receiver)\n ?.onRefAccessedOrSet(target.id, value.id);\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n },\n defineProperty(target, key, descriptor) {\n if (\n (key === \"profile\" || key === \"root\" || key === MembersSym) &&\n typeof descriptor.value === \"object\" &&\n SchemaInit in descriptor.value\n ) {\n (target.constructor as typeof CoMap)._schema ||= {};\n (target.constructor as typeof CoMap)._schema[key] =\n descriptor.value[SchemaInit];\n return true;\n } else {\n return Reflect.defineProperty(target, key, descriptor);\n }\n },\n};\n\n/** @category Identity & Permissions */\nexport function isControlledAccount(account: Account): account is Account & {\n isMe: true;\n sessionID: SessionID;\n _raw: RawControlledAccount;\n} {\n return account.isMe;\n}\n\nexport type AccountClass<Acc extends Account> = CoValueClass<Acc> & {\n fromNode: (typeof Account)[\"fromNode\"];\n};\n\nRegisteredSchemas[\"Account\"] = Account;\n","import type { Everyone, RawAccountID, RawGroup, Role } from \"cojson\";\nimport type {\n CoValue,\n CoValueClass,\n DeeplyLoaded,\n DepthsIn,\n ID,\n RefEncoded,\n Schema,\n} from \"../internal.js\";\nimport {\n CoValueBase,\n MembersSym,\n Ref,\n ensureCoValueLoaded,\n loadCoValue,\n parseCoValueCreateOptions,\n subscribeToCoValue,\n subscribeToExistingCoValue,\n} from \"../internal.js\";\nimport { AccountAndGroupProxyHandler, isControlledAccount } from \"./account.js\";\nimport { type Account } from \"./account.js\";\nimport { type CoMap } from \"./coMap.js\";\nimport { type Profile } from \"./profile.js\";\nimport { RegisteredSchemas } from \"./registeredSchemas.js\";\n\n/** @category Identity & Permissions */\nexport class Group extends CoValueBase implements CoValue {\n declare id: ID<this>;\n declare _type: \"Group\";\n static {\n this.prototype._type = \"Group\";\n }\n declare _raw: RawGroup;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static _schema: any;\n get _schema(): {\n profile: Schema;\n root: Schema;\n [MembersSym]: RefEncoded<Account>;\n } {\n return (this.constructor as typeof Group)._schema;\n }\n static {\n this._schema = {\n profile: \"json\" satisfies Schema,\n root: \"json\" satisfies Schema,\n [MembersSym]: {\n ref: () => RegisteredSchemas[\"Account\"],\n optional: false,\n } satisfies RefEncoded<Account>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any;\n Object.defineProperty(this.prototype, \"_schema\", {\n get: () => this._schema,\n });\n }\n\n declare profile: Profile | null;\n declare root: CoMap | null;\n declare [MembersSym]: Account | null;\n\n get _refs(): {\n profile: Ref<Profile> | undefined;\n root: Ref<CoMap> | undefined;\n } {\n const profileID = this._raw.get(\"profile\") as unknown as\n | ID<NonNullable<this[\"profile\"]>>\n | undefined;\n const rootID = this._raw.get(\"root\") as unknown as\n | ID<NonNullable<this[\"root\"]>>\n | undefined;\n return {\n profile:\n profileID &&\n (new Ref(\n profileID,\n this._loadedAs,\n this._schema.profile as RefEncoded<NonNullable<this[\"profile\"]>>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as any as this[\"profile\"] extends Profile\n ? Ref<this[\"profile\"]>\n : never),\n root:\n rootID &&\n (new Ref(\n rootID,\n this._loadedAs,\n this._schema.root as RefEncoded<NonNullable<this[\"root\"]>>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as any as this[\"root\"] extends CoMap ? Ref<this[\"root\"]> : never),\n };\n }\n\n /** @deprecated Don't use constructor directly, use .create */\n constructor(options: { fromRaw: RawGroup } | { owner: Account | Group }) {\n super();\n let raw: RawGroup;\n\n if (options && \"fromRaw\" in options) {\n raw = options.fromRaw;\n } else {\n const initOwner = options.owner;\n if (!initOwner) throw new Error(\"No owner provided\");\n if (initOwner._type === \"Account\" && isControlledAccount(initOwner)) {\n const rawOwner = initOwner._raw;\n raw = rawOwner.createGroup();\n } else {\n throw new Error(\"Can only construct group as a controlled account\");\n }\n }\n\n Object.defineProperties(this, {\n id: {\n value: raw.id,\n enumerable: false,\n },\n _raw: { value: raw, enumerable: false },\n });\n\n return new Proxy(this, AccountAndGroupProxyHandler as ProxyHandler<this>);\n }\n\n static create<G extends Group>(\n this: CoValueClass<G>,\n options: { owner: Account } | Account,\n ) {\n return new this(parseCoValueCreateOptions(options));\n }\n\n myRole(): Role | undefined {\n return this._raw.myRole();\n }\n\n addMember(member: Everyone | Account, role: Role) {\n this._raw.addMember(member === \"everyone\" ? member : member._raw, role);\n return this;\n }\n\n removeMember(member: Everyone | Account) {\n this._raw.removeMember(member === \"everyone\" ? member : member._raw);\n return this;\n }\n\n get members() {\n return this._raw\n .keys()\n .filter((key) => {\n return key === \"everyone\" || key.startsWith(\"co_\");\n })\n .map((id) => {\n const role = this._raw.get(id as Everyone | RawAccountID);\n const accountID =\n id === \"everyone\" ? undefined : (id as unknown as ID<Account>);\n const ref =\n accountID &&\n new Ref<NonNullable<this[MembersSym]>>(\n accountID,\n this._loadedAs,\n this._schema[MembersSym],\n );\n const accessRef = () => ref?.accessFrom(this, \"members.\" + id);\n\n return {\n id: id as unknown as Everyone | ID<this[MembersSym]>,\n role,\n ref,\n get account() {\n return accessRef();\n },\n };\n });\n }\n\n extend(parent: Group) {\n this._raw.extend(parent._raw);\n return this;\n }\n\n /** @category Subscription & Loading */\n static load<G extends Group, Depth>(\n this: CoValueClass<G>,\n id: ID<G>,\n as: Account,\n depth: Depth & DepthsIn<G>,\n ): Promise<DeeplyLoaded<G, Depth> | undefined> {\n return loadCoValue(this, id, as, depth);\n }\n\n /** @category Subscription & Loading */\n static subscribe<G extends Group, Depth>(\n this: CoValueClass<G>,\n id: ID<G>,\n as: Account,\n depth: Depth & DepthsIn<G>,\n listener: (value: DeeplyLoaded<G, Depth>) => void,\n ): () => void {\n return subscribeToCoValue<G, Depth>(this, id, as, depth, listener);\n }\n\n /** @category Subscription & Loading */\n ensureLoaded<G extends Group, Depth>(\n this: G,\n depth: Depth & DepthsIn<G>,\n ): Promise<DeeplyLoaded<G, Depth> | undefined> {\n return ensureCoValueLoaded(this, depth);\n }\n\n /** @category Subscription & Loading */\n subscribe<G extends Group, Depth>(\n this: G,\n depth: Depth & DepthsIn<G>,\n listener: (value: DeeplyLoaded<G, Depth>) => void,\n ): () => void {\n return subscribeToExistingCoValue(this, depth, listener);\n }\n\n /**\n * Wait for the `Group` to be uploaded to the other peers.\n *\n * @category Subscription & Loading\n */\n waitForSync(options?: { timeout?: number }) {\n return this._raw.core.waitForSync(options);\n }\n}\n\nRegisteredSchemas[\"Group\"] = Group;\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport type {\n AgentID,\n BinaryStreamInfo,\n CojsonInternalTypes,\n JsonValue,\n RawAccountID,\n RawBinaryCoStream,\n RawCoStream,\n SessionID,\n} from \"cojson\";\nimport { MAX_RECOMMENDED_TX_SIZE, cojsonInternals } from \"cojson\";\nimport type {\n AnonymousJazzAgent,\n CoValue,\n CoValueClass,\n DeeplyLoaded,\n DepthsIn,\n ID,\n IfCo,\n Schema,\n SchemaFor,\n UnCo,\n} from \"../internal.js\";\nimport {\n CoValueBase,\n ItemsSym,\n Ref,\n SchemaInit,\n co,\n ensureCoValueLoaded,\n inspect,\n isRefEncoded,\n loadCoValue,\n parseCoValueCreateOptions,\n subscribeToCoValue,\n subscribeToExistingCoValue,\n} from \"../internal.js\";\nimport { type Account } from \"./account.js\";\nimport { type Group } from \"./group.js\";\nimport { RegisteredSchemas } from \"./registeredSchemas.js\";\n\n/** @deprecated Use CoFeedEntry instead */\nexport type CoStreamEntry<Item> = CoFeedEntry<Item>;\n\nexport type CoFeedEntry<Item> = SingleCoFeedEntry<Item> & {\n all: IterableIterator<SingleCoFeedEntry<Item>>;\n};\n\n/** @deprecated Use SingleCoFeedEntry instead */\nexport type SingleCoStreamEntry<Item> = SingleCoFeedEntry<Item>;\n\nexport type SingleCoFeedEntry<Item> = {\n value: NonNullable<Item> extends CoValue ? NonNullable<Item> | null : Item;\n ref: NonNullable<Item> extends CoValue ? Ref<NonNullable<Item>> : never;\n by?: Account | null;\n madeAt: Date;\n tx: CojsonInternalTypes.TransactionID;\n};\n\n/** @deprecated Use CoFeed instead */\nexport { CoFeed as CoStream };\n\n/**\n * CoFeeds are collaborative logs of data.\n *\n * @categoryDescription Content\n * They are similar to `CoList`s, but with a few key differences:\n * - They are append-only\n * - They consist of several internal append-only logs, one per account session (tab, device, app instance, etc.)\n * - They expose those as a per-account aggregated view (default) or a precise per-session view\n *\n * ```ts\n * favDog.push(\"Poodle\");\n * favDog.push(\"Schnowzer\");\n * ```\n *\n * @category CoValues\n */\nexport class CoFeed<Item = any> extends CoValueBase implements CoValue {\n /**\n * Declare a `CoFeed` by subclassing `CoFeed.Of(...)` and passing the item schema using a `co` primitive or a `co.ref`.\n *\n * @example\n * ```ts\n * class ColorFeed extends CoFeed.Of(co.string) {}\n * class AnimalFeed extends CoFeed.Of(co.ref(Animal)) {}\n * ```\n *\n * @category Declaration\n */\n static Of<Item>(item: IfCo<Item, Item>): typeof CoFeed<Item> {\n return class CoFeedOf extends CoFeed<Item> {\n [co.items] = item;\n };\n }\n\n /**\n * The ID of this `CoFeed`\n * @category Content */\n declare id: ID<this>;\n /** @category Type Helpers */\n declare _type: \"CoStream\";\n static {\n this.prototype._type = \"CoStream\";\n }\n /** @category Internals */\n declare _raw: RawCoStream;\n\n /** @internal This is only a marker type and doesn't exist at runtime */\n [ItemsSym]!: Item;\n /** @internal */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static _schema: any;\n /** @internal */\n get _schema(): {\n [ItemsSym]: SchemaFor<Item>;\n } {\n return (this.constructor as typeof CoFeed)._schema;\n }\n\n /**\n * The per-account view of this `CoFeed`\n *\n * @example\n * ```ts\n * // Access entries directly by account ID\n * const aliceEntries = feed[aliceAccount.id];\n * console.log(aliceEntries.value); // Latest value from Alice\n *\n * // Iterate through all accounts' entries\n * for (const [accountId, entries] of Object.entries(feed)) {\n * console.log(`Latest entry from ${accountId}:`, entries.value);\n *\n * // Access all entries from this account\n * for (const entry of entries.all) {\n * console.log(`Entry made at ${entry.madeAt}:`, entry.value);\n * }\n * }\n * ```\n *\n * @category Content\n */\n [key: ID<Account>]: CoFeedEntry<Item>;\n\n /**\n * The current account's view of this `CoFeed`\n * @category Content\n */\n get byMe(): CoFeedEntry<Item> | undefined {\n if (this._loadedAs._type === \"Account\") {\n return this[this._loadedAs.id];\n } else {\n return undefined;\n }\n }\n\n /**\n * The per-session view of this `CoFeed`\n * @category Content\n */\n perSession!: {\n [key: SessionID]: CoFeedEntry<Item>;\n };\n\n /**\n * The current session's view of this `CoFeed`\n *\n * This is a shortcut for `this.perSession` where the session ID is the current session ID.\n *\n * @category Content\n */\n get inCurrentSession(): CoFeedEntry<Item> | undefined {\n if (this._loadedAs._type === \"Account\") {\n return this.perSession[this._loadedAs.sessionID!];\n } else {\n return undefined;\n }\n }\n\n constructor(\n options:\n | { init: Item[]; owner: Account | Group }\n | { fromRaw: RawCoStream },\n ) {\n super();\n\n if (options && \"fromRaw\" in options) {\n Object.defineProperties(this, {\n id: {\n value: options.fromRaw.id,\n enumerable: false,\n },\n _raw: { value: options.fromRaw, enumerable: false },\n });\n }\n\n return new Proxy(this, CoStreamProxyHandler as ProxyHandler<this>);\n }\n\n /**\n * Create a new `CoFeed`\n * @category Creation\n */\n static create<S extends CoFeed>(\n this: CoValueClass<S>,\n init: S extends CoFeed<infer Item> ? UnCo<Item>[] : never,\n options: { owner: Account | Group } | Account | Group,\n ) {\n const { owner } = parseCoValueCreateOptions(options);\n const instance = new this({ init, owner });\n const raw = owner._raw.createStream();\n\n Object.defineProperties(instance, {\n id: {\n value: raw.id,\n enumerable: false,\n },\n _raw: { value: raw, enumerable: false },\n });\n\n if (init) {\n instance.push(...init);\n }\n return instance;\n }\n\n /**\n * Push items to this `CoFeed`\n *\n * Items are appended to the current session's log. Each session (tab, device, app instance)\n * maintains its own append-only log, which is then aggregated into the per-account view.\n *\n * @example\n * ```ts\n * // Adds items to current session's log\n * feed.push(\"item1\", \"item2\");\n *\n * // View items from current session\n * console.log(feed.inCurrentSession);\n *\n * // View aggregated items from all sessions for current account\n * console.log(feed.byMe);\n * ```\n *\n * @category Content\n */\n push(...items: Item[]) {\n for (const item of items) {\n this.pushItem(item);\n }\n }\n\n private pushItem(item: Item) {\n const itemDescriptor = this._schema[ItemsSym] as Schema;\n\n if (itemDescriptor === \"json\") {\n this._raw.push(item as JsonValue);\n } else if (\"encoded\" in itemDescriptor) {\n this._raw.push(itemDescriptor.encoded.encode(item));\n } else if (isRefEncoded(itemDescriptor)) {\n this._raw.push((item as unknown as CoValue).id);\n }\n }\n\n /**\n * Get a JSON representation of the `CoFeed`\n * @category\n */\n toJSON(): {\n id: string;\n _type: \"CoStream\";\n [key: string]: unknown;\n in: { [key: string]: unknown };\n } {\n const itemDescriptor = this._schema[ItemsSym] as Schema;\n const mapper =\n itemDescriptor === \"json\"\n ? (v: unknown) => v\n : \"encoded\" in itemDescriptor\n ? itemDescriptor.encoded.encode\n : (v: unknown) => v && (v as CoValue).id;\n\n return {\n id: this.id,\n _type: this._type,\n ...Object.fromEntries(\n Object.entries(this).map(([account, entry]) => [\n account,\n mapper(entry.value),\n ]),\n ),\n in: Object.fromEntries(\n Object.entries(this.perSession).map(([session, entry]) => [\n session,\n mapper(entry.value),\n ]),\n ),\n };\n }\n\n /** @internal */\n [inspect](): {\n id: string;\n _type: \"CoStream\";\n [key: string]: unknown;\n in: { [key: string]: unknown };\n } {\n return this.toJSON();\n }\n\n /** @internal */\n static schema<V extends CoFeed>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this: { new (...args: any): V } & typeof CoFeed,\n def: { [ItemsSym]: V[\"_schema\"][ItemsSym] },\n ) {\n this._schema ||= {};\n Object.assign(this._schema, def);\n }\n\n /**\n * Load a `CoFeed`\n * @category Subscription & Loading\n */\n static load<S extends CoFeed, Depth>(\n this: CoValueClass<S>,\n id: ID<S>,\n as: Account,\n depth: Depth & DepthsIn<S>,\n ): Promise<DeeplyLoaded<S, Depth> | undefined> {\n return loadCoValue(this, id, as, depth);\n }\n\n /**\n * Subscribe to a `CoFeed`, when you have an ID but don't have a `CoFeed` instance yet\n * @category Subscription & Loading\n */\n static subscribe<S extends CoFeed, Depth>(\n this: CoValueClass<S>,\n id: ID<S>,\n as: Account,\n depth: Depth & DepthsIn<S>,\n listener: (value: DeeplyLoaded<S, Depth>) => void,\n ): () => void {\n return subscribeToCoValue<S, Depth>(this, id, as, depth, listener);\n }\n\n /**\n * Ensure a `CoFeed` is loaded to the specified depth\n *\n * @returns A new instance of the same CoFeed that's loaded to the specified depth,\n * or undefined if it cannot be loaded that deeply\n * @category Subscription & Loading\n */\n ensureLoaded<S extends CoFeed, Depth>(\n this: S,\n depth: Depth & DepthsIn<S>,\n ): Promise<DeeplyLoaded<S, Depth> | undefined> {\n return ensureCoValueLoaded(this, depth);\n }\n\n /**\n * An instance method to subscribe to an existing `CoFeed`\n *\n * No need to provide an ID or Account since they're already part of the instance.\n * @category Subscription & Loading\n */\n subscribe<S extends CoFeed, Depth>(\n this: S,\n depth: Depth & DepthsIn<S>,\n listener: (value: DeeplyLoaded<S, Depth>) => void,\n ): () => void {\n return subscribeToExistingCoValue(this, depth, listener);\n }\n\n /**\n * Wait for the `CoFeed` to be uploaded to the other peers.\n *\n * @category Subscription & Loading\n */\n waitForSync(options?: {\n timeout?: number;\n }) {\n return this._raw.core.waitForSync(options);\n }\n}\n\n/**\n * Converts a raw stream entry into a formatted CoFeed entry with proper typing and accessors.\n * @internal\n */\nfunction entryFromRawEntry<Item>(\n accessFrom: CoValue,\n rawEntry: {\n by: RawAccountID | AgentID;\n tx: CojsonInternalTypes.TransactionID;\n at: Date;\n value: JsonValue;\n },\n loadedAs: Account | AnonymousJazzAgent,\n accountID: ID<Account> | undefined,\n itemField: Schema,\n): Omit<CoFeedEntry<Item>, \"all\"> {\n return {\n get value(): NonNullable<Item> extends CoValue\n ? (CoValue & Item) | null\n : Item {\n if (itemField === \"json\") {\n return rawEntry.value as NonNullable<Item> extends CoValue\n ? (CoValue & Item) | null\n : Item;\n } else if (\"encoded\" in itemField) {\n return itemField.encoded.decode(rawEntry.value);\n } else if (isRefEncoded(itemField)) {\n return this.ref?.accessFrom(\n accessFrom,\n rawEntry.by + rawEntry.tx.sessionID + rawEntry.tx.txIndex + \".value\",\n ) as NonNullable<Item> extends CoValue ? (CoValue & Item) | null : Item;\n } else {\n throw new Error(\"Invalid item field schema\");\n }\n },\n get ref(): NonNullable<Item> extends CoValue\n ? Ref<NonNullable<Item>>\n : never {\n if (itemField !== \"json\" && isRefEncoded(itemField)) {\n const rawId = rawEntry.value;\n return new Ref(\n rawId as unknown as ID<CoValue>,\n loadedAs,\n itemField,\n ) as NonNullable<Item> extends CoValue ? Ref<NonNullable<Item>> : never;\n } else {\n return undefined as never;\n }\n },\n get by() {\n return (\n accountID &&\n new Ref<Account>(accountID as unknown as ID<Account>, loadedAs, {\n ref: RegisteredSchemas[\"Account\"],\n optional: false,\n })?.accessFrom(\n accessFrom,\n rawEntry.by + rawEntry.tx.sessionID + rawEntry.tx.txIndex + \".by\",\n )\n );\n },\n madeAt: rawEntry.at,\n tx: rawEntry.tx,\n };\n}\n\n/**\n * The proxy handler for `CoFeed` instances\n * @internal\n */\nexport const CoStreamProxyHandler: ProxyHandler<CoFeed> = {\n get(target, key, receiver) {\n if (typeof key === \"string\" && key.startsWith(\"co_\")) {\n const rawEntry = target._raw.lastItemBy(key as RawAccountID);\n\n if (!rawEntry) return;\n const entry = entryFromRawEntry(\n receiver,\n rawEntry,\n target._loadedAs,\n key as unknown as ID<Account>,\n target._schema[ItemsSym],\n );\n\n Object.defineProperty(entry, \"all\", {\n get: () => {\n const allRawEntries = target._raw.itemsBy(key as RawAccountID);\n return (function* () {\n while (true) {\n const rawEntry = allRawEntries.next();\n if (rawEntry.done) return;\n yield entryFromRawEntry(\n receiver,\n rawEntry.value,\n target._loadedAs,\n key as unknown as ID<Account>,\n target._schema[ItemsSym],\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n })() satisfies IterableIterator<SingleCoFeedEntry<any>>;\n },\n });\n\n return entry;\n } else if (key === \"perSession\") {\n return new Proxy({}, CoStreamPerSessionProxyHandler(target, receiver));\n } else {\n return Reflect.get(target, key, receiver);\n }\n },\n set(target, key, value, receiver) {\n if (key === ItemsSym && typeof value === \"object\" && SchemaInit in value) {\n (target.constructor as typeof CoFeed)._schema ||= {};\n (target.constructor as typeof CoFeed)._schema[ItemsSym] =\n value[SchemaInit];\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n },\n defineProperty(target, key, descriptor) {\n if (\n descriptor.value &&\n key === ItemsSym &&\n typeof descriptor.value === \"object\" &&\n SchemaInit in descriptor.value\n ) {\n (target.constructor as typeof CoFeed)._schema ||= {};\n (target.constructor as typeof CoFeed)._schema[ItemsSym] =\n descriptor.value[SchemaInit];\n return true;\n } else {\n return Reflect.defineProperty(target, key, descriptor);\n }\n },\n ownKeys(target) {\n const keys = Reflect.ownKeys(target);\n\n for (const accountID of target._raw.accounts()) {\n keys.push(accountID);\n }\n\n return keys;\n },\n getOwnPropertyDescriptor(target, key) {\n if (typeof key === \"string\" && key.startsWith(\"co_\")) {\n return {\n configurable: true,\n enumerable: true,\n writable: false,\n };\n } else {\n return Reflect.getOwnPropertyDescriptor(target, key);\n }\n },\n};\n\n/**\n * The proxy handler for the per-session view of a `CoFeed`\n * @internal\n */\nconst CoStreamPerSessionProxyHandler = (\n innerTarget: CoFeed,\n accessFrom: CoFeed,\n): ProxyHandler<Record<string, never>> => ({\n get(_target, key, receiver) {\n if (typeof key === \"string\" && key.includes(\"session\")) {\n const sessionID = key as SessionID;\n const rawEntry = innerTarget._raw.lastItemIn(sessionID);\n\n if (!rawEntry) return;\n const by = cojsonInternals.accountOrAgentIDfromSessionID(sessionID);\n\n const entry = entryFromRawEntry(\n accessFrom,\n rawEntry,\n innerTarget._loadedAs,\n cojsonInternals.isAccountID(by)\n ? (by as unknown as ID<Account>)\n : undefined,\n innerTarget._schema[ItemsSym],\n );\n\n Object.defineProperty(entry, \"all\", {\n get: () => {\n const allRawEntries = innerTarget._raw.itemsIn(sessionID);\n return (function* () {\n while (true) {\n const rawEntry = allRawEntries.next();\n if (rawEntry.done) return;\n yield entryFromRawEntry(\n accessFrom,\n rawEntry.value,\n innerTarget._loadedAs,\n cojsonInternals.isAccountID(by)\n ? (by as unknown as ID<Account>)\n : undefined,\n innerTarget._schema[ItemsSym],\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n })() satisfies IterableIterator<SingleCoFeedEntry<any>>;\n },\n });\n\n return entry;\n } else {\n return Reflect.get(innerTarget, key, receiver);\n }\n },\n ownKeys() {\n return innerTarget._raw.sessions();\n },\n getOwnPropertyDescriptor(target, key) {\n if (typeof key === \"string\" && key.startsWith(\"co_\")) {\n return {\n configurable: true,\n enumerable: true,\n writable: false,\n };\n } else {\n return Reflect.getOwnPropertyDescriptor(target, key);\n }\n },\n});\n\n/** @deprecated Use FileStream instead */\nexport { FileStream as BinaryCoStream };\n\n/**\n * FileStreams are `CoFeed`s that contain binary data, collaborative versions of `Blob`s.\n *\n * @categoryDescription Declaration\n * `FileStream` can be referenced in schemas.\n *\n * ```ts\n * import { co, FileStream } from \"jazz-tools\";\n *\n * class MyCoMap extends CoMap {\n * file = co.ref(FileStream);\n * }\n * ```\n *\n * @category CoValues\n */\nexport class FileStream extends CoValueBase implements CoValue {\n /**\n * The ID of this `FileStream`\n * @category Content\n */\n declare id: ID<this>;\n /** @category Type Helpers */\n declare _type: \"BinaryCoStream\";\n /** @internal */\n declare _raw: RawBinaryCoStream;\n\n constructor(\n options:\n | {\n owner: Account | Group;\n }\n | {\n fromRaw: RawBinaryCoStream;\n },\n ) {\n super();\n\n let raw: RawBinaryCoStream;\n\n if (\"fromRaw\" in options) {\n raw = options.fromRaw;\n } else {\n const rawOwner = options.owner._raw;\n raw = rawOwner.createBinaryStream();\n }\n\n Object.defineProperties(this, {\n id: {\n value: raw.id,\n enumerable: false,\n },\n _type: { value: \"BinaryCoStream\", enumerable: false },\n _raw: { value: raw, enumerable: false },\n });\n }\n\n static create<S extends FileStream>(\n this: CoValueClass<S>,\n options: { owner: Account | Group } | Account | Group,\n ) {\n return new this(parseCoValueCreateOptions(options));\n }\n\n getChunks(options?: {\n allowUnfinished?: boolean;\n }):\n | (BinaryStreamInfo & { chunks: Uint8Array[]; finished: boolean })\n | undefined {\n return this._raw.getBinaryChunks(options?.allowUnfinished);\n }\n\n isBinaryStreamEnded(): boolean {\n return this._raw.isBinaryStreamEnded();\n }\n\n start(options: BinaryStreamInfo): void {\n this._raw.startBinaryStream(options);\n }\n\n push(data: Uint8Array): void {\n this._raw.pushBinaryStreamChunk(data);\n }\n\n end(): void {\n this._raw.endBinaryStream();\n }\n\n toBlob(options?: { allowUnfinished?: boolean }): Blob | undefined {\n const chunks = this.getChunks({\n allowUnfinished: options?.allowUnfinished,\n });\n\n if (!chunks) {\n return undefined;\n }\n\n // @ts-ignore\n return new Blob(chunks.chunks, { type: chunks.mimeType });\n }\n\n /**\n * Load a `FileStream` as a `Blob`\n *\n * @category Content\n */\n static async loadAsBlob(\n id: ID<FileStream>,\n as: Account,\n options?: {\n allowUnfinished?: boolean;\n },\n ): Promise<Blob | undefined> {\n let stream = await this.load(id, as, []);\n\n /**\n * If the user hasn't requested an incomplete blob and the\n * stream isn't complete wait for the stream download before progressing\n */\n if (!options?.allowUnfinished && !stream?.isBinaryStreamEnded()) {\n stream = await new Promise<FileStream>((resolve) => {\n subscribeToCoValue(this, id, as, [], (value, unsubscribe) => {\n if (value.isBinaryStreamEnded()) {\n unsubscribe();\n resolve(value);\n }\n });\n });\n }\n\n return stream?.toBlob({\n allowUnfinished: options?.allowUnfinished,\n });\n }\n\n /**\n * Create a `FileStream` from a `Blob` or `File`\n *\n * @example\n * ```ts\n * import { co, FileStream } from \"jazz-tools\";\n *\n * const fileStream = await FileStream.createFromBlob(file, {owner: group})\n * ```\n * @category Content\n */\n static async createFromBlob(\n blob: Blob | File,\n options:\n | {\n owner: Group | Account;\n onProgress?: (progress: number) => void;\n }\n | Account\n | Group,\n ): Promise<FileStream> {\n const stream = this.create(options);\n const onProgress = \"onProgress\" in options ? options.onProgress : undefined;\n\n const start = Date.now();\n\n const data = new Uint8Array(await blob.arrayBuffer());\n stream.start({\n mimeType: blob.type,\n totalSizeBytes: blob.size,\n fileName: blob instanceof File ? blob.name : undefined,\n });\n const chunkSize = MAX_RECOMMENDED_TX_SIZE;\n\n let lastProgressUpdate = Date.now();\n\n for (let idx = 0; idx < data.length; idx += chunkSize) {\n stream.push(data.slice(idx, idx + chunkSize));\n\n if (Date.now() - lastProgressUpdate > 100) {\n onProgress?.(idx / data.length);\n lastProgressUpdate = Date.now();\n }\n\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n stream.end();\n const end = Date.now();\n\n console.debug(\n \"Finished creating binary stream in\",\n (end - start) / 1000,\n \"s - Throughput in MB/s\",\n (1000 * (blob.size / (end - start))) / (1024 * 1024),\n );\n onProgress?.(1);\n\n return stream;\n }\n\n /**\n * Get a JSON representation of the `FileStream`\n * @category Content\n */\n toJSON(): {\n id: string;\n _type: \"BinaryCoStream\";\n mimeType?: string;\n totalSizeBytes?: number;\n fileName?: string;\n chunks?: Uint8Array[];\n finished?: boolean;\n } {\n return {\n id: this.id,\n _type: this._type,\n ...this.getChunks(),\n };\n }\n\n /** @internal */\n [inspect]() {\n return this.toJSON();\n }\n\n /**\n * Load a `FileStream`\n * @category Subscription & Loading\n */\n static load<B extends FileStream, Depth>(\n this: CoValueClass<B>,\n id: ID<B>,\n as: Account,\n depth: Depth & DepthsIn<B>,\n ): Promise<DeeplyLoaded<B, Depth> | undefined> {\n return loadCoValue(this, id, as, depth);\n }\n\n /**\n * Subscribe to a `FileStream`, when you have an ID but don't have a `FileStream` instance yet\n * @category Subscription & Loading\n */\n static subscribe<B extends FileStream, Depth>(\n this: CoValueClass<B>,\n id: ID<B>,\n as: Account,\n depth: Depth & DepthsIn<B>,\n listener: (value: DeeplyLoaded<B, Depth>) => void,\n ): () => void {\n return subscribeToCoValue<B, Depth>(this, id, as, depth, listener);\n }\n\n ensureLoaded<B extends FileStream, Depth>(\n this: B,\n depth: Depth & DepthsIn<B>,\n ): Promise<DeeplyLoaded<B, Depth> | undefined> {\n return ensureCoValueLoaded(this, depth);\n }\n\n /**\n * An instance method to subscribe to an existing `FileStream`\n * @category Subscription & Loading\n */\n subscribe<B extends FileStream, Depth>(\n this: B,\n depth: Depth & DepthsIn<B>,\n listener: (value: DeeplyLoaded<B, Depth>) => void,\n ): () => void {\n return subscribeToExistingCoValue(this, depth, listener);\n }\n\n /**\n * Wait for the `FileStream` to be uploaded to the other peers.\n *\n * @category Subscription & Loading\n */\n waitForSync(options?: { timeout?: number }) {\n return this._raw.core.waitForSync(options);\n }\n}\n","import type { JsonValue, RawCoList } from \"cojson\";\nimport { RawAccount } from \"cojson\";\nimport type {\n CoValue,\n CoValueClass,\n CoValueFromRaw,\n DeeplyLoaded,\n DepthsIn,\n ID,\n RefEncoded,\n Schema,\n SchemaFor,\n UnCo,\n} from \"../internal.js\";\nimport {\n AnonymousJazzAgent,\n ItemsSym,\n Ref,\n SchemaInit,\n co,\n ensureCoValueLoaded,\n inspect,\n isRefEncoded,\n loadCoValue,\n makeRefs,\n parseCoValueCreateOptions,\n subscribeToCoValue,\n subscribeToExistingCoValue,\n subscriptionsScopes,\n} from \"../internal.js\";\nimport { coValuesCache } from \"../lib/cache.js\";\nimport { type Account } from \"./account.js\";\nimport { type Group } from \"./group.js\";\nimport { RegisteredSchemas } from \"./registeredSchemas.js\";\n\n/**\n * CoLists are collaborative versions of plain arrays.\n *\n * @categoryDescription Content\n * You can access items on a `CoList` as if they were normal items on a plain array, using `[]` notation, etc.\n *\n * Since `CoList` is a subclass of `Array`, you can use all the normal array methods like `push`, `pop`, `splice`, etc.\n *\n * ```ts\n * colorList[0];\n * colorList[3] = \"yellow\";\n * colorList.push(\"Kawazaki Green\");\n * colorList.splice(1, 1);\n * ```\n *\n * @category CoValues\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class CoList<Item = any> extends Array<Item> implements CoValue {\n /**\n * Declare a `CoList` by subclassing `CoList.Of(...)` and passing the item schema using `co`.\n *\n * @example\n * ```ts\n * class ColorList extends CoList.Of(\n * co.string\n * ) {}\n * class AnimalList extends CoList.Of(\n * co.ref(Animal)\n * ) {}\n * ```\n *\n * @category Declaration\n */\n static Of<Item>(item: Item): typeof CoList<Item> {\n // TODO: cache superclass for item class\n return class CoListOf extends CoList<Item> {\n [co.items] = item;\n };\n }\n\n /**\n * @ignore\n * @deprecated Use UPPERCASE `CoList.Of` instead! */\n static of(..._args: never): never {\n throw new Error(\"Can't use Array.of with CoLists\");\n }\n\n /**\n * The ID of this `CoList`\n * @category Content */\n declare id: ID<this>;\n /** @category Type Helpers */\n declare _type: \"CoList\";\n static {\n this.prototype._type = \"CoList\";\n }\n /** @category Internals */\n declare _raw: RawCoList;\n /** @category Internals */\n declare _instanceID: string;\n\n /** @internal This is only a marker type and doesn't exist at runtime */\n [ItemsSym]!: Item;\n /** @internal */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static _schema: any;\n /** @internal */\n get _schema(): {\n [ItemsSym]: SchemaFor<Item>;\n } {\n return (this.constructor as typeof CoList)._schema;\n }\n\n /** @category Collaboration */\n get _owner(): Account | Group {\n return this._raw.group instanceof RawAccount\n ? RegisteredSchemas[\"Account\"].fromRaw(this._raw.group)\n : RegisteredSchemas[\"Group\"].fromRaw(this._raw.group);\n }\n\n /**\n * If a `CoList`'s items are a `co.ref(...)`, you can use `coList._refs[i]` to access\n * the `Ref` instead of the potentially loaded/null value.\n *\n * This allows you to always get the ID or load the value manually.\n *\n * @example\n * ```ts\n * animals._refs[0].id; // => ID<Animal>\n * animals._refs[0].value;\n * // => Animal | null\n * const animal = await animals._refs[0].load();\n * ```\n *\n * @category Content\n **/\n get _refs(): {\n [idx: number]: Exclude<Item, null> extends CoValue\n ? Ref<UnCo<Exclude<Item, null>>>\n : never;\n } & {\n length: number;\n [Symbol.iterator](): IterableIterator<\n Exclude<Item, null> extends CoValue ? Ref<Exclude<Item, null>> : never\n >;\n } {\n return makeRefs<number>(\n (idx) => this._raw.get(idx) as unknown as ID<CoValue>,\n () => Array.from({ length: this._raw.entries().length }, (_, idx) => idx),\n this._loadedAs,\n (_idx) => this._schema[ItemsSym] as RefEncoded<CoValue>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as any;\n }\n\n get _edits(): {\n [idx: number]: {\n value?: Item;\n ref?: Item extends CoValue ? Ref<Item> : never;\n by?: Account;\n madeAt: Date;\n };\n } {\n throw new Error(\"Not implemented\");\n }\n\n get _loadedAs() {\n const rawAccount = this._raw.core.node.account;\n\n if (rawAccount instanceof RawAccount) {\n return coValuesCache.get(rawAccount, () =>\n RegisteredSchemas[\"Account\"].fromRaw(rawAccount),\n );\n }\n\n return new AnonymousJazzAgent(this._raw.core.node);\n }\n\n static get [Symbol.species]() {\n return Array;\n }\n\n constructor(options: { fromRaw: RawCoList } | undefined) {\n super();\n\n Object.defineProperty(this, \"_instanceID\", {\n value: `instance-${Math.random().toString(36).slice(2)}`,\n enumerable: false,\n });\n\n if (options && \"fromRaw\" in options) {\n Object.defineProperties(this, {\n id: {\n value: options.fromRaw.id,\n enumerable: false,\n },\n _raw: { value: options.fromRaw, enumerable: false },\n });\n }\n\n return new Proxy(this, CoListProxyHandler as ProxyHandler<this>);\n }\n\n /**\n * Create a new CoList with the given initial values and owner.\n *\n * The owner (a Group or Account) determines access rights to the CoMap.\n *\n * The CoList will immediately be persisted and synced to connected peers.\n *\n * @example\n * ```ts\n * const colours = ColorList.create(\n * [\"red\", \"green\", \"blue\"],\n * { owner: me }\n * );\n * const animals = AnimalList.create(\n * [cat, dog, fish],\n * { owner: me }\n * );\n * ```\n *\n * @category Creation\n **/\n static create<L extends CoList>(\n this: CoValueClass<L>,\n items: UnCo<L[number]>[],\n options: { owner: Account | Group } | Account | Group,\n ) {\n const { owner } = parseCoValueCreateOptions(options);\n const instance = new this({ init: items, owner });\n const raw = owner._raw.createList(\n toRawItems(items, instance._schema[ItemsSym]),\n );\n\n Object.defineProperties(instance, {\n id: {\n value: raw.id,\n enumerable: false,\n },\n _raw: { value: raw, enumerable: false },\n });\n\n return instance;\n }\n\n push(...items: Item[]): number {\n this._raw.appendItems(\n toRawItems(items, this._schema[ItemsSym]),\n undefined,\n \"private\",\n );\n\n return this._raw.entries().length;\n }\n\n unshift(...items: Item[]): number {\n for (const item of toRawItems(items as Item[], this._schema[ItemsSym])) {\n this._raw.prepend(item);\n }\n\n return this._raw.entries().length;\n }\n\n pop(): Item | undefined {\n const last = this[this.length - 1];\n\n this._raw.delete(this.length - 1);\n\n return last;\n }\n\n shift(): Item | undefined {\n const first = this[0];\n\n this._raw.delete(0);\n\n return first;\n }\n\n splice(start: number, deleteCount: number, ...items: Item[]): Item[] {\n const deleted = this.slice(start, start + deleteCount);\n\n for (\n let idxToDelete = start + deleteCount - 1;\n idxToDelete >= start;\n idxToDelete--\n ) {\n this._raw.delete(idxToDelete);\n }\n\n let appendAfter = Math.max(start - 1, 0);\n for (const item of toRawItems(items as Item[], this._schema[ItemsSym])) {\n console.log(this._raw.asArray(), appendAfter);\n this._raw.append(item, appendAfter);\n appendAfter++;\n }\n\n return deleted;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toJSON(_key?: string, seenAbove?: ID<CoValue>[]): any[] {\n const itemDescriptor = this._schema[ItemsSym] as Schema;\n if (itemDescriptor === \"json\") {\n return this._raw.asArray();\n } else if (\"encoded\" in itemDescriptor) {\n return this._raw.asArray().map((e) => itemDescriptor.encoded.encode(e));\n } else if (isRefEncoded(itemDescriptor)) {\n return this.map((item, idx) =>\n seenAbove?.includes((item as CoValue)?.id)\n ? { _circular: (item as CoValue).id }\n : (item as unknown as CoValue)?.toJSON(idx + \"\", [\n ...(seenAbove || []),\n this.id,\n ]),\n );\n } else {\n return [];\n }\n }\n\n [inspect]() {\n return this.toJSON();\n }\n\n /** @category Internals */\n static fromRaw<V extends CoList>(\n this: CoValueClass<V> & typeof CoList,\n raw: RawCoList,\n ) {\n return new this({ fromRaw: raw });\n }\n\n /** @internal */\n static schema<V extends CoList>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this: { new (...args: any): V } & typeof CoList,\n def: { [ItemsSym]: V[\"_schema\"][ItemsSym] },\n ) {\n this._schema ||= {};\n Object.assign(this._schema, def);\n }\n\n /**\n * Load a `CoList` with a given ID, as a given account.\n *\n * `depth` specifies if item CoValue references should be loaded as well before resolving.\n * The `DeeplyLoaded` return type guarantees that corresponding referenced CoValues are loaded to the specified depth.\n *\n * You can pass `[]` or for shallowly loading only this CoList, or `[itemDepth]` for recursively loading referenced CoValues.\n *\n * Check out the `load` methods on `CoMap`/`CoList`/`CoFeed`/`Group`/`Account` to see which depth structures are valid to nest.\n *\n * @example\n * ```ts\n * const animalsWithVets =\n * await ListOfAnimals.load(\n * \"co_zdsMhHtfG6VNKt7RqPUPvUtN2Ax\",\n * me,\n * [{ vet: {} }]\n * );\n * ```\n *\n * @category Subscription & Loading\n */\n static load<L extends CoList, Depth>(\n this: CoValueClass<L>,\n id: ID<L>,\n as: Account,\n depth: Depth & DepthsIn<L>,\n ): Promise<DeeplyLoaded<L, Depth> | undefined> {\n return loadCoValue(this, id, as, depth);\n }\n\n /**\n * Load and subscribe to a `CoList` with a given ID, as a given account.\n *\n * Automatically also subscribes to updates to all referenced/nested CoValues as soon as they are accessed in the listener.\n *\n * `depth` specifies if item CoValue references should be loaded as well before calling `listener` for the first time.\n * The `DeeplyLoaded` return type guarantees that corresponding referenced CoValues are loaded to the specified depth.\n *\n * You can pass `[]` or for shallowly loading only this CoList, or `[itemDepth]` for recursively loading referenced CoValues.\n *\n * Check out the `load` methods on `CoMap`/`CoList`/`CoFeed`/`Group`/`Account` to see which depth structures are valid to nest.\n *\n * Returns an unsubscribe function that you should call when you no longer need updates.\n *\n * Also see the `useCoState` hook to reactively subscribe to a CoValue in a React component.\n *\n * @example\n * ```ts\n * const unsub = ListOfAnimals.subscribe(\n * \"co_zdsMhHtfG6VNKt7RqPUPvUtN2Ax\",\n * me,\n * { vet: {} },\n * (animalsWithVets) => console.log(animalsWithVets)\n * );\n * ```\n *\n * @category Subscription & Loading\n */\n static subscribe<L extends CoList, Depth>(\n this: CoValueClass<L>,\n id: ID<L>,\n as: Account,\n depth: Depth & DepthsIn<L>,\n listener: (value: DeeplyLoaded<L, Depth>) => void,\n ): () => void {\n return subscribeToCoValue<L, Depth>(this, id, as, depth, listener);\n }\n\n /**\n * Given an already loaded `CoList`, ensure that items are loaded to the specified depth.\n *\n * Works like `CoList.load()`, but you don't need to pass the ID or the account to load as again.\n *\n * @category Subscription & Loading\n */\n ensureLoaded<L extends CoList, Depth>(\n this: L,\n depth: Depth & DepthsIn<L>,\n ): Promise<DeeplyLoaded<L, Depth> | undefined> {\n return ensureCoValueLoaded(this, depth);\n }\n\n /**\n * Given an already loaded `CoList`, subscribe to updates to the `CoList` and ensure that items are loaded to the specified depth.\n *\n * Works like `CoList.subscribe()`, but you don't need to pass the ID or the account to load as again.\n *\n * Returns an unsubscribe function that you should call when you no longer need updates.\n *\n * @category Subscription & Loading\n **/\n subscribe<L extends CoList, Depth>(\n this: L,\n depth: Depth & DepthsIn<L>,\n listener: (value: DeeplyLoaded<L, Depth>) => void,\n ): () => void {\n return subscribeToExistingCoValue(this, depth, listener);\n }\n\n /** @category Type Helpers */\n castAs<Cl extends CoValueClass & CoValueFromRaw<CoValue>>(\n cl: Cl,\n ): InstanceType<Cl> {\n const casted = cl.fromRaw(this._raw) as InstanceType<Cl>;\n const subscriptionScope = subscriptionsScopes.get(this);\n if (subscriptionScope) {\n subscriptionsScopes.set(casted, subscriptionScope);\n }\n return casted;\n }\n\n /**\n * Wait for the `CoList` to be uploaded to the other peers.\n *\n * @category Subscription & Loading\n */\n waitForSync(options?: { timeout?: number }) {\n return this._raw.core.waitForSync(options);\n }\n}\n\nfunction toRawItems<Item>(items: Item[], itemDescriptor: Schema) {\n const rawItems =\n itemDescriptor === \"json\"\n ? (items as JsonValue[])\n : \"encoded\" in itemDescriptor\n ? items?.map((e) => itemDescriptor.encoded.encode(e))\n : isRefEncoded(itemDescriptor)\n ? items?.map((v) => (v as unknown as CoValue).id)\n : (() => {\n throw new Error(\"Invalid element descriptor\");\n })();\n return rawItems;\n}\n\nconst CoListProxyHandler: ProxyHandler<CoList> = {\n get(target, key, receiver) {\n if (typeof key === \"string\" && !isNaN(+key)) {\n const itemDescriptor = target._schema[ItemsSym] as Schema;\n const rawValue = target._raw.get(Number(key));\n if (itemDescriptor === \"json\") {\n return rawValue;\n } else if (\"encoded\" in itemDescriptor) {\n return rawValue === undefined\n ? undefined\n : itemDescriptor.encoded.decode(rawValue);\n } else if (isRefEncoded(itemDescriptor)) {\n return rawValue === undefined\n ? undefined\n : new Ref(\n rawValue as unknown as ID<CoValue>,\n target._loadedAs,\n itemDescriptor,\n ).accessFrom(receiver, Number(key));\n }\n } else if (key === \"length\") {\n return target._raw.entries().length;\n } else {\n return Reflect.get(target, key, receiver);\n }\n },\n set(target, key, value, receiver) {\n if (key === ItemsSym && typeof value === \"object\" && SchemaInit in value) {\n (target.constructor as typeof CoList)._schema ||= {};\n (target.constructor as typeof CoList)._schema[ItemsSym] =\n value[SchemaInit];\n return true;\n }\n if (typeof key === \"string\" && !isNaN(+key)) {\n const itemDescriptor = target._schema[ItemsSym] as Schema;\n let rawValue;\n if (itemDescriptor === \"json\") {\n rawValue = value;\n } else if (\"encoded\" in itemDescriptor) {\n rawValue = itemDescriptor.encoded.encode(value);\n } else if (isRefEncoded(itemDescriptor)) {\n rawValue = value.id;\n }\n target._raw.replace(Number(key), rawValue);\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n },\n defineProperty(target, key, descriptor) {\n if (\n descriptor.value &&\n key === ItemsSym &&\n typeof descriptor.value === \"object\" &&\n SchemaInit in descriptor.value\n ) {\n (target.constructor as typeof CoList)._schema ||= {};\n (target.constructor as typeof CoList)._schema[ItemsSym] =\n descriptor.value[SchemaInit];\n return true;\n } else {\n return Reflect.defineProperty(target, key, descriptor);\n }\n },\n has(target, key) {\n if (typeof key === \"string\" && !isNaN(+key)) {\n return Number(key) < target._raw.entries().length;\n } else {\n return Reflect.has(target, key);\n }\n },\n};\n","import { co, subscriptionsScopes } from \"../../internal.js\";\nimport { FileStream } from \"../coFeed.js\";\nimport { CoMap } from \"../coMap.js\";\n\n/** @category Media */\nexport class ImageDefinition extends CoMap {\n originalSize = co.json<[number, number]>();\n placeholderDataURL? = co.string;\n\n [co.items] = co.ref(FileStream);\n [res: `${number}x${number}`]: co<FileStream | null>;\n\n highestResAvailable(options?: {\n maxWidth?: number;\n }): { res: `${number}x${number}`; stream: FileStream } | undefined {\n if (!subscriptionsScopes.get(this)) {\n console.warn(\n \"highestResAvailable() only makes sense when used within a subscription.\",\n );\n }\n\n const resolutions = Object.keys(this).filter(\n (key) =>\n key.match(/^\\d+x\\d+$/) &&\n (options?.maxWidth === undefined ||\n Number(key.split(\"x\")[0]) <= options.maxWidth),\n ) as `${number}x${number}`[];\n\n resolutions.sort((a, b) => {\n const aWidth = Number(a.split(\"x\")[0]);\n const bWidth = Number(b.split(\"x\")[0]);\n return aWidth - bWidth;\n });\n\n let highestAvailableResolution: `${number}x${number}` | undefined;\n\n for (const resolution of resolutions) {\n if (this[resolution] && this[resolution]?.getChunks()) {\n highestAvailableResolution = resolution;\n } else {\n return (\n highestAvailableResolution && {\n res: highestAvailableResolution,\n stream: this[highestAvailableResolution]!,\n }\n );\n }\n }\n return (\n highestAvailableResolution && {\n res: highestAvailableResolution,\n stream: this[highestAvailableResolution]!,\n }\n );\n }\n}\n","import {\n CoValue,\n CoValueBase,\n CoValueClass,\n CoValueFromRaw,\n} from \"../internal.js\";\n\n/**\n * SchemaUnion allows you to create union types of CoValues that can be discriminated at runtime.\n *\n * @categoryDescription Declaration\n * Declare your union types by extending `SchemaUnion.Of(...)` and passing a discriminator function that determines which concrete type to use based on the raw data.\n *\n * ```ts\n * import { SchemaUnion, CoMap } from \"jazz-tools\";\n *\n * class BaseWidget extends CoMap {\n * type = co.string;\n * }\n *\n * class ButtonWidget extends BaseWidget {\n * type = co.literal(\"button\");\n * label = co.string;\n * }\n *\n * class SliderWidget extends BaseWidget {\n * type = co.literal(\"slider\");\n * min = co.number;\n * max = co.number;\n * }\n *\n * const WidgetUnion = SchemaUnion.Of<BaseWidget>((raw) => {\n * switch (raw.get(\"type\")) {\n * case \"button\": return ButtonWidget;\n * case \"slider\": return SliderWidget;\n * default: throw new Error(\"Unknown widget type\");\n * }\n * });\n * ```\n *\n * @category CoValues\n */\nexport abstract class SchemaUnion extends CoValueBase implements CoValue {\n /**\n * Create a new union type from a discriminator function.\n *\n * The discriminator function receives the raw data and should return the appropriate concrete class to use for that data.\n *\n * When loading a SchemaUnion, the correct subclass will be instantiated based on the discriminator.\n *\n * @param discriminator - Function that determines which concrete type to use\n * @returns A new class that can create/load instances of the union type\n *\n * @example\n * ```ts\n * const WidgetUnion = SchemaUnion.Of<BaseWidget>((raw) => {\n * switch (raw.get(\"type\")) {\n * case \"button\": return ButtonWidget;\n * case \"slider\": return SliderWidget;\n * default: throw new Error(\"Unknown widget type\");\n * }\n * });\n *\n * const widget = await loadCoValue(WidgetUnion, id, me, {});\n *\n * // You can narrow the returned instance to a subclass by using `instanceof`\n * if (widget instanceof ButtonWidget) {\n * console.log(widget.label);\n * } else if (widget instanceof SliderWidget) {\n * console.log(widget.min, widget.max);\n * }\n * ```\n *\n * @category Declaration\n **/\n static Of<V extends CoValue>(\n discriminator: (raw: V[\"_raw\"]) => CoValueClass<V> & CoValueFromRaw<V>,\n ): CoValueClass<V> & typeof SchemaUnion {\n return class SchemaUnionClass extends SchemaUnion {\n static override fromRaw<T extends CoValue>(\n this: CoValueClass<T> & CoValueFromRaw<T>,\n raw: T[\"_raw\"],\n ): T {\n const ResolvedClass = discriminator(\n raw as V[\"_raw\"],\n ) as unknown as CoValueClass<T> & CoValueFromRaw<T>;\n return ResolvedClass.fromRaw(raw);\n }\n } as unknown as CoValueClass<V> & typeof SchemaUnion;\n }\n\n /**\n * Create an instance from raw data. This is called internally and should not be used directly.\n * Use {@link SchemaUnion.Of} to create a union type instead.\n *\n * @internal\n */\n // @ts-ignore\n static fromRaw<V extends CoValue>(this: CoValueClass<V>, raw: V[\"_raw\"]): V {\n throw new Error(\"Not implemented\");\n }\n}\n"],"mappings":";AAEO,IAAM,qBAAN,MAAyB;AAAA,EAE9B,YAAmB,MAAiB;AAAjB;AADnB,iBAAQ;AAAA,EAC6B;AACvC;;;ACAA,SAAS,cAAAA,mBAAkB;;;ACLpB,IAAM,aAAa,OAAO,IAAI,YAAY;AAG1C,IAAM,WAAW,OAAO,IAAI,OAAO;AAGnC,IAAM,aAAa,OAAO,IAAI,SAAS;;;ACNvC,IAAM,UAAU,OAAO,IAAI,4BAA4B;;;ACG9D,IAAM,UAAU,oBAAI,QAA6B;AAE1C,IAAM,gBAAgB;AAAA,EAC3B,KAAK,CAAoB,KAAiB,YAAqB;AAC7D,UAAM,SAAS,QAAQ,IAAI,GAAG;AAC9B,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AACA,UAAM,WAAW,QAAQ;AACzB,YAAQ,IAAI,KAAK,QAAQ;AACzB,WAAO;AAAA,EACT;AACF;;;ACCA,IAAM,iBAAiB;AAEhB,IAAM,MAAN,MAAM,KAA2B;AAAA,EACtC,YACW,IACA,mBACA,QACT;AAHS;AACA;AACA;AAET,QAAI,CAAC,aAAa,MAAM,GAAG;AACzB,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA,IAAI,QAAQ;AACV,UAAM,OACJ,UAAU,KAAK,oBACX,KAAK,kBAAkB,OACvB,KAAK,kBAAkB,KAAK,KAAK;AACvC,UAAM,MAAM,KAAK,UAAU,KAAK,EAAiC;AACjE,QAAI,KAAK;AACP,aAAO,cAAc;AAAA,QAAI;AAAA,QAAK,MAC5B,sBAAsB,KAAK,QAAQ,GAAG;AAAA,MACxC;AAAA,IACF,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,aAAyC;AACrD,UAAM,OACJ,UAAU,KAAK,oBACX,KAAK,kBAAkB,OACvB,KAAK,kBAAkB,KAAK,KAAK;AACvC,UAAM,MAAM,MAAM,KAAK,KAAK,KAAK,EAAiC;AAClE,QAAI,QAAQ,eAAe;AACzB,aAAO;AAAA,IACT,OAAO;AACL,aAAO,IAAI,KAAI,KAAK,IAAI,KAAK,mBAAmB,KAAK,MAAM,EAAE;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,WAA0B;AACxB,UAAM,OACJ,UAAU,KAAK,oBACX,KAAK,kBAAkB,OACvB,KAAK,kBAAkB,KAAK,KAAK;AAEvC,UAAM,QAAQ,KAAK,cAAc;AAAA,MAC/B,KAAK;AAAA,IACP;AAEA,QAAI,MAAM,MAAM,SAAS,aAAa;AACpC,aAAO,IAAI,KAAI,KAAK,IAAI,KAAK,mBAAmB,KAAK,MAAM,EAAE;AAAA,IAC/D;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAA+B;AACnC,UAAM,SAAS,MAAM,KAAK,WAAW;AACrC,QAAI,WAAW,eAAe;AAC5B,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,WAAW,gBAAyB,KAAyC;AAC3E,UAAM,WAAW,oBAAoB,IAAI,cAAc;AAEvD,cAAU,mBAAmB,eAAe,IAAI,KAAK,EAAE;AACvD,sBACE,QAAQ,IAAI,UAAU,SAAS,aAAa,gBAAgB,KAAK,KAAK,EAAE;AAE1E,QAAI,KAAK,SAAS,UAAU;AAC1B,0BAAoB,IAAI,KAAK,OAAO,QAAQ;AAAA,IAC9C;AAEA,QAAI,UAAU;AACZ,YAAM,SAAS,SAAS,aAAa,KAAK,EAAE;AAC5C,UAAI,QAAQ;AACV,0BAAkB,QAAQ,IAAI,UAAU,MAAM;AAC9C,eAAO;AAAA,MACT,WAAW,KAAK,UAAU,MAAM;AAC9B,cAAM,qBAAqB;AAAA,UACzB,KAAK;AAAA,UACL,KAAK,OAAO;AAAA,QACd;AACA,0BAAkB,QAAQ,IAAI,sBAAsB,kBAAkB;AACtE,iBAAS,aAAa,KAAK,EAAE,IAAI;AACjC,4BAAoB,IAAI,oBAAoB,QAAQ;AACpD,eAAO;AAAA,MACT,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF,OAAO;AACL,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AACF;AAEO,SAAS,SACd,aACA,gBACA,mBACA,iBAIA;AACA,QAAM,OAAO,CAAC;AAId,SAAO,IAAI,MAAM,MAAM;AAAA,IACrB,IAAI,SAAS,KAAK;AAChB,UAAI,QAAQ,OAAO,UAAU;AAC3B,eAAO,aAAa;AAClB,qBAAWC,QAAO,eAAe,GAAG;AAClC,kBAAM,IAAI;AAAA,cACR,YAAYA,IAAG;AAAA,cACf;AAAA,cACA,gBAAgBA,IAAG;AAAA,YACrB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,UAAI,QAAQ,UAAU;AACpB,eAAO,eAAe,EAAE;AAAA,MAC1B;AACA,YAAM,KAAK,YAAY,GAAW;AAClC,UAAI,CAAC,GAAI,QAAO;AAChB,aAAO,IAAI;AAAA,QACT;AAAA,QACA;AAAA,QACA,gBAAgB,GAAW;AAAA,MAC7B;AAAA,IACF;AAAA,IACA,UAAU;AACR,aAAO,eAAe,EAAE,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC;AAAA,IACrD;AAAA,IACA,yBAAyB,QAAQ,KAAK;AACpC,YAAM,KAAK,YAAY,GAAW;AAClC,UAAI,IAAI;AACN,eAAO;AAAA,UACL,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,UAAU;AAAA,QACZ;AAAA,MACF,OAAO;AACL,eAAO,QAAQ,yBAAyB,QAAQ,GAAG;AAAA,MACrD;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;AC9JO,IAAM,WAAW;AAAA,EACtB,MAAM;AAAA,IACJ,QAAQ,CAAC,UAAgB,MAAM,YAAY;AAAA,IAC3C,QAAQ,CAAC,UAAqB,IAAI,KAAK,KAAe;AAAA,EACxD;AACF;AAYA,IAAM,WAAW;AAAA,EACf,KAAK;AAAA,EACL,OAAoD;AAElD,WAAO,EAAE,CAAC,UAAU,GAAG,OAAwB;AAAA,EACjD;AAAA,EACA,QAAW,KAA4C;AAErD,WAAO,EAAE,CAAC,UAAU,GAAG,EAAE,SAAS,IAAI,EAAmB;AAAA,EAC3D;AAAA,EACA,QAAQ;AAAA,IACN,CAAC,UAAU,GAAG;AAAA,EAChB;AAAA,EACA,QAAQ;AAAA,IACN,CAAC,UAAU,GAAG;AAAA,EAChB;AAAA,EACA,SAAS;AAAA,IACP,CAAC,UAAU,GAAG;AAAA,EAChB;AAAA,EACA,MAAM;AAAA,IACJ,CAAC,UAAU,GAAG;AAAA,EAChB;AAAA,EACA,MAAM;AAAA,IACJ,CAAC,UAAU,GAAG,EAAE,SAAS,SAAS,KAAK;AAAA,EACzC;AAAA,EACA,WACK,MACwB;AAE3B,WAAO,EAAE,CAAC,UAAU,GAAG,OAAwB;AAAA,EACjD;AACF;AAGO,IAAM,KAAK;AAAA,EAChB,QAAQ;AAAA,IACN,CAAC,UAAU,GAAG;AAAA,EAChB;AAAA,EACA,QAAQ;AAAA,IACN,CAAC,UAAU,GAAG;AAAA,EAChB;AAAA,EACA,SAAS;AAAA,IACP,CAAC,UAAU,GAAG;AAAA,EAChB;AAAA,EACA,MAAM;AAAA,IACJ,CAAC,UAAU,GAAG;AAAA,EAChB;AAAA,EACA,MAAM;AAAA,IACJ,CAAC,UAAU,GAAG,EAAE,SAAS,SAAS,KAAK;AAAA,EACzC;AAAA,EACA,WAAoD,MAAwB;AAE1E,WAAO,EAAE,CAAC,UAAU,GAAG,OAAwB;AAAA,EACjD;AAAA,EACA,OAAwC;AAEtC,WAAO,EAAE,CAAC,UAAU,GAAG,OAAwB;AAAA,EACjD;AAAA,EACA,QAAW,KAAwB;AAEjC,WAAO,EAAE,CAAC,UAAU,GAAG,EAAE,SAAS,IAAI,EAAmB;AAAA,EAC3D;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,SAAS;AAAA,EACT;AACF;AAEA,SAAS,YACP,KACwC;AACxC,SAAO,IAAI,KAAK,EAAE,UAAU,KAAK,CAAC;AACpC;AAUA,SAAS,IAIP,KACA,SAG6B;AAC7B,SAAO;AAAA,IACL,CAAC,UAAU,GAAG;AAAA,MACZ,KAAK;AAAA,MACL,UAAU,SAAS,YAAY;AAAA,IACjC;AAAA;AAAA,EAEF;AACF;AASO,SAAS,aACd,QACyB;AACzB,SACE,OAAO,WAAW,YAClB,SAAS,UACT,cAAc,UACd,OAAO,OAAO,QAAQ;AAE1B;AAEO,SAAS,sBACd,QACA,KACG;AACH,SAAO,eAAkB,OAAO,GAAG,IAC/B,OAAO,IAAI,QAAQ,GAAG,IACrB,OAAO;AAAA,IACN;AAAA,EACF,EAAE,QAAQ,GAAG;AACnB;;;ACnJO,IAAM,sBAAsB,oBAAI,QAIrC;AAEF,IAAM,sBAAsB;AAErB,IAAM,oBAAN,MAA8C;AAAA,EAkBnD,YACE,MACA,YACA,UACA;AArBF,mBAAkB,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAE9D,mBAAU,oBAAI,IAIZ;AAOF,2BAA2B;AAC3B,wBAA+C,CAAC;AAChD,mBAAmD,CAAC;AA6FpD,0BAAiB,MAAM;AACrB,iBAAW,SAAS,KAAK,QAAQ,OAAO,GAAG;AACzC,YAAI,MAAM,UAAU,UAAU;AAC5B,gBAAM,SAAS;AAAA,QACjB,OAAO;AACL,gBAAM,mBAAmB;AAAA,QAC3B;AAAA,MACF;AACA,WAAK,QAAQ,MAAM;AAAA,IACrB;AA/FE,SAAK,YAAY;AAAA,MACf,OAAO;AAAA,MACP,OAAO,KAAK;AAAA,MACZ,UAAU,MAAM;AAAA,MAAC;AAAA;AAAA,IACnB;AACA,SAAK,QAAQ,IAAI,KAAK,IAAI,KAAK,SAAS;AAExC,wBAAoB,IAAI,MAAM,IAAI;AAElC,SAAK,aAAa,KAAK;AACvB,SAAK,iBAAiB,MAAM;AAC1B,YAAM,QAAQ,WAAW,QAAQ,KAAK,UAAU,KAAK;AACrD,0BAAoB,IAAI,OAAO,IAAI;AACnC,eAAS,OAAO,IAAI;AAAA,IACtB;AAEA,SAAK,UAAU,WAAW,KAAK,KAAK,KAAK;AAAA,MACvC,CAAC,cAAsC;AACrC,YAAI,CAAC,UAAW;AAChB,aAAK,UAAU,QAAQ;AACvB,aAAK,eAAe;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBACE,QACA,iBACA;AAEA,QAAI,CAAC,iBAAiB;AACpB;AAAA,IACF;AAEA,SAAK,QAAQ,eAAe,IAAI,KAAK,QAAQ,eAAe,KAAK,oBAAI,IAAI;AACzE,SAAK,QAAQ,eAAe,EAAG,IAAI,MAAM;AAEzC,QAAI,CAAC,KAAK,QAAQ,IAAI,eAAe,GAAG;AACtC,YAAM,eAAe;AAAA,QACnB,OAAO;AAAA,QACP,kBAAkB;AAAA,MACpB;AACA,WAAK,QAAQ,IAAI,iBAAiB,YAAY;AAC9C,YAAM,OACJ,KAAK,WAAW,UAAU,YACtB,KAAK,WAAW,KAAK,KAAK,OAC1B,KAAK,WAAW;AACtB,WAAK,KAAK,gBAAgB,eAAe,EAAE,KAAK,CAAC,SAAS;AACxD,YAAI,aAAa,UAAU,aAAa,aAAa,kBAAkB;AACrE;AAAA,QACF;AACA,YAAI,SAAS,eAAe;AAC1B,gBAAM,QAAQ;AAAA,YACZ,OAAO;AAAA,YACP,UAAU,MAAM;AAAA,YAAC;AAAA;AAAA,UACnB;AACA,eAAK,QAAQ,IAAI,iBAAiB,KAAK;AAEvC,gBAAM,WAAW,KAAK,UAAU,CAAC,cAAc;AAE7C,gBAAI,CAAC,UAAW;AAChB,iBAAK,WAAW,eAAe;AAC/B,iBAAK,eAAe;AAAA,UACtB,CAAC;AAED,gBAAM,WAAW;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,WACE,IACA,WACA,OAAyB,oBAAI,IAAI,GACjC;AACA,QAAI,KAAK,IAAI,EAAE,EAAG;AAClB,2BACE,QAAQ,IAAI,gBAAgB,WAAW,MAAM,IAAI,KAAK,aAAa,EAAE,CAAC;AACxE,WAAO,KAAK,aAAa,EAAE;AAC3B,SAAK,IAAI,EAAE;AACX,eAAW,UAAU,KAAK,QAAQ,EAAE,KAAK,CAAC,GAAG;AAC3C,WAAK,WAAW,QAAQ,IAAI,IAAI;AAAA,IAClC;AAAA,EACF;AAYF;;;AChIO,SAAS,cAAc,OAAY,OAAyB;AACjE,MACE,MAAM,UAAU,WAChB,MAAM,UAAU,WAChB,MAAM,UAAU,WAChB;AACA,QAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AAC9C,aAAO,OAAO,QAAQ,KAAK,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,MAAM;AAClD,eACE,MAGA,MAAM,GAAG,IACP,QAAQ,cAAc,MAAM,CAAC,GAAG,IAAI,IAClC,MAAgB,QAAQ,QAAQ,EAC/B;AAAA,MACT,CAAC;AAAA,IACH,OAAO;AACL,iBAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,cAAM,MAAM;AAKZ,YAAI,CAAC,IAAI,MAAM,GAAG,KAAK,IAAI,QAAQ,GAAG,EAAE,UAAU;AAChD;AAAA,QACF;AACA,YAAI,CAAC,IAAI,GAAG,GAAG;AACb,iBAAO;AAAA,QACT;AACA,YAAI,CAAC,cAAc,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG;AACxC,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF,WAAW,MAAM,UAAU,UAAU;AACnC,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,IACT,OAAO;AACL,YAAM,YAAY,MAAM,CAAC;AACzB,aAAQ,MAAiB;AAAA,QAAM,CAAC,MAAM,MACnC,MAAiB,MAAM,CAAC,IACrB,QAAQ,cAAc,WAAW,IAAI,IACnC,MAAiB,QAAQ,QAAQ,EAChC;AAAA,MACT;AAAA,IACF;AAAA,EACF,WAAW,MAAM,UAAU,YAAY;AACrC,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,IACT,OAAO;AACL,YAAM,YAAY,MAAM,CAAC;AACzB,aAAO,OAAO,OAAQ,MAAiB,UAAU,EAAE;AAAA,QAAM,CAAC,UACxD,MAAM,MACF,MAAM,SAAS,cAAc,WAAW,MAAM,KAAK,IACjD,MAAiB,QAAQ,QAAQ,EAChC;AAAA,MACT;AAAA,IACF;AAAA,EACF,WAAW,MAAM,UAAU,kBAAkB;AAC3C,WAAO;AAAA,EACT,OAAO;AACL,YAAQ,MAAM,KAAK;AACnB,UAAM,IAAI,MAAM,4BAA4B,MAAM,KAAK;AAAA,EACzD;AACF;;;AC3EA;AAAA,EAGE;AAAA,EAEA;AAAA,OAKK;;;ACHA,IAAM,oBAAoB,CAAC;;;ADqC3B,IAAM,uBAAuB,CAAC,gBAGnB;AAChB,SAAO;AAAA,IACL,OAAO,aAAa;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,MACA,iBAAiB,YAAY;AAAA,MAAC;AAAA,MAC9B,WAAW,MAAM;AAAA,MAAC;AAAA,MAClB,SAAS,MAAM;AAAA,MAAC;AAAA,MAChB,QAAQ,MAAM;AAAA,MAAC;AAAA,IACjB;AAAA,EACF;AACF;AAEO,IAAM,2BAA2B,MAAkB;AACxD,SAAO;AAAA,IACL,OAAO,aAAa;AAAA,MAClB,MAAM;AAAA,MACN,eAAe,EAAE,MAAM,YAAY;AAAA,MACnC,iBAAiB,YAAY;AAAA,MAAC;AAAA,MAC9B,WAAW,MAAM;AAAA,MAAC;AAAA,MAClB,SAAS,MAAM;AAAA,MAAC;AAAA,MAChB,QAAQ,MAAM;AAAA,MAAC;AAAA,IACjB;AAAA,EACF;AACF;AAEA,eAAsB,sBACpB,WACA,QACA;AACA,SAAO;AAAA,IACL,WAAW,OAAO,mBAAmB,SAAoC;AAAA,IACzE,aAAa,MAAM;AAAA,IAAC;AAAA,EACtB;AACF;AA8CA,eAAsB,kBACpB,SAC2B;AAE3B,SAAO,MAAM;AACX,QAAI,EAAE,UAAU,UAAU;AACxB,aAAO,2BAA2B;AAAA,QAChC,iBAAiB,QAAQ;AAAA,QACzB,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAAA,IACH;AAEA,UAAM,EAAE,MAAM,iBAAiB,iBAAiB,OAAO,IAAI;AAC3D,UAAM,gBACJ,QAAQ,iBACP,kBAAkB,SAAS;AAC9B,QAAI;AACJ,QAAI;AACF,mBAAa,MAAM,KAAK,MAAM,MAAM;AAAA,IACtC,SAAS,GAAG;AACV,cAAQ,MAAM,SAAS,CAAC;AACxB,YAAM;AAAA,IACR;AAEA,QAAI,WAAW,SAAS,YAAY;AAClC,UAAI;AACF,cAAM,EAAE,WAAW,YAAY,IAAI,MAAM;AAAA,UACvC,WAAW,YAAY;AAAA,UACvB;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,OAAO,MAAM,UAAU,kBAAkB;AAAA,YAC7C,WAAW,WAAW,YACnB;AAAA,YACH,eAAe,WAAW,YAAY;AAAA,YACtC;AAAA,YACA;AAAA,YACA;AAAA,YACA,WAAW,OAAO,YAAY,OAAO,kBAAkB;AACrD,oBAAMC,WAAU,IAAI,cAAc;AAAA,gBAChC,SAAS;AAAA,cACX,CAAC;AAED,oBAAMA,SAAQ,eAAe,aAAa;AAAA,YAC5C;AAAA,UACF,CAAC;AAED,gBAAM,UAAU,cAAc,SAAS,IAAI;AAE3C,cAAI,WAAW,iBAAiB;AAC9B,kBAAM,WAAW,gBAAgB;AAAA,cAC/B,WAAW,KAAK,QAAQ;AAAA,cACxB,QAAQ,KAAK,QAAQ;AAAA,YACvB,CAAC;AAAA,UACH;AAEA,qBAAW,UAAU;AAErB,iBAAO;AAAA,YACL;AAAA,YACA,MAAM,MAAM;AACV,mBAAK,iBAAiB;AACtB,0BAAY;AAAA,YACd;AAAA,YACA,QAAQ,MAAM;AACZ,mBAAK,iBAAiB;AACtB,0BAAY;AACZ,yBAAW,OAAO;AAAA,YACpB;AAAA,UACF;AAAA,QACF,SAAS,GAAG;AACV,qBAAW,QAAQ,IAAI,MAAM,yBAAyB,EAAE,OAAO,EAAE,CAAC,CAAC;AACnE,sBAAY;AAAA,QACd;AAAA,MACF,SAAS,GAAG;AACV,mBAAW;AAAA,UACT,IAAI,MAAM,6BAA6B,EAAE,OAAO,EAAE,CAAC;AAAA,QACrD;AAAA,MACF;AAAA,IACF,WAAW,WAAW,SAAS,OAAO;AACpC,UAAI;AAEF,cAAM,EAAE,KAAK,IAAI,MAAM,UAAU,wBAAwB;AAAA,UACvD,eAAe,WAAW;AAAA,UAC1B;AAAA,UACA;AAAA,UACA,oBAAoB,WAAW;AAAA,UAC/B,WAAW,OAAO,YAAY,OAAO,kBAAkB;AACrD,kBAAMA,WAAU,IAAI,cAAc;AAAA,cAChC,SAAS;AAAA,YACX,CAAC;AAED,kBAAMA,SAAQ,eAAe,aAAa;AAAA,UAC5C;AAAA,QACF,CAAC;AAED,cAAM,UAAU,cAAc,SAAS,IAAI;AAE3C,cAAM,WAAW,gBAAgB;AAAA,UAC/B,WAAW,KAAK,QAAQ;AAAA,UACxB,QAAQ,KAAK,QAAQ;AAAA,QACvB,CAAC;AAED,mBAAW,UAAU;AACrB,eAAO;AAAA,UACL;AAAA,UACA,MAAM,MAAM;AACV,iBAAK,iBAAiB;AAAA,UACxB;AAAA,UACA,QAAQ,MAAM;AACZ,iBAAK,iBAAiB;AACtB,uBAAW,OAAO;AAAA,UACpB;AAAA,QACF;AAAA,MACF,SAAS,GAAG;AACV,mBAAW,QAAQ,IAAI,MAAM,0BAA0B,EAAE,OAAO,EAAE,CAAC,CAAC;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,2BAA2B;AAAA,EAC/C;AAAA,EACA;AACF,GAGkC;AAChC,QAAM,cAAc,OAAO,qBAAqB;AAChD,QAAM,WAAW,IAAI,gBAAgB,aAAa,MAAM;AAExD,QAAM,OAAO,IAAI;AAAA,IACf;AAAA,IACA,OAAO,mBAAmB,SAAS,EAAE;AAAA,IACrC;AAAA,EACF;AAEA,aAAW,QAAQ,iBAAiB;AAClC,SAAK,YAAY,QAAQ,IAAI;AAAA,EAC/B;AAEA,SAAO;AAAA,IACL,OAAO,IAAI,mBAAmB,IAAI;AAAA,IAClC,MAAM,MAAM;AAAA,IAAC;AAAA,IACb,QAAQ,MAAM;AAAA,IAAC;AAAA,EACjB;AACF;;;AE9QC,WAAmB,qBAAqB;AAAA,EACvC;AAAA,IACE,QAAQ,CAAC,WAAgB;AACvB,UAAI,OAAO,UAAU,SAAS;AAC5B,eAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,OAAO,YAAY,IAAI,CAAC;AAAA,MAC1D,WAAW,OAAO,UAAU,UAAU;AACpC,eAAO;AAAA,UACL;AAAA,UACA,CAAC;AAAA,UACD,CAAC,QAAQ,CAAC,GAAG,OAAO,YAAY,OAAO,MAAM,OAAO,SAAS,IAAI;AAAA,QACnE;AAAA,MACF,WAAW,OAAO,UAAU,WAAW;AACrC,eAAO;AAAA,UACL;AAAA,UACA,CAAC;AAAA,UACD;AAAA,YACE;AAAA,YACA,CAAC;AAAA,YACD,OAAO,YAAY,OACjB,MACA,OAAO,MAAM,QAAQ,OAAO,QAC3B,OAAO,OAAO,QAAQ,MACvB;AAAA,UACJ;AAAA,QACF;AAAA,MACF,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS,WAAY;AACnB,aAAO;AAAA,IACT;AAAA,IACA,MAAM,SAAU,QAAa;AAC3B,UAAI,OAAO,UAAU,WAAW,OAAO,UAAU,WAAW;AAC1D,eAAO;AAAA,UACL;AAAA,UACA,EAAE,OAAO,oBAAoB;AAAA,UAC7B,CAAC,OAAO,QAAQ,CAAC,UAAU,EAAE,QAAQ,OAAO,GAAG,CAAC,CAAC;AAAA,UACjD,GAAG,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM;AAAA,YACxC;AAAA,YACA,EAAE,OAAO,uBAAuB;AAAA,YAChC,CAAC,QAAQ,EAAE,OAAO,kCAAkC,GAAG,GAAG,IAAI;AAAA,YAC9D,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC;AAAA,YACxB,GAAI,OAAO,OAAO,QAAQ,CAAC,MAAM,aAC7B,MAAM,OACJ;AAAA,cACE;AAAA,gBACE;AAAA,gBACA,EAAE,OAAO,eAAe;AAAA,gBACxB,aAAa,OAAO,QAAQ,CAAC,EAAE,IAAI;AAAA,gBACnC,CAAC,UAAU,EAAE,QAAQ,OAAO,MAAM,CAAC,EAAE,CAAC;AAAA,gBACtC;AAAA,cACF;AAAA,YACF,IACA,CAAC,IACH,CAAC;AAAA,UACP,CAAC;AAAA,QACH;AAAA,MACF,WAAW,OAAO,UAAU,UAAU;AACpC,eAAO;AAAA,UACL;AAAA,UACA,EAAE,OAAO,oBAAoB;AAAA,UAC7B,CAAC,OAAO,QAAQ,CAAC,UAAU,EAAE,QAAQ,OAAO,GAAG,CAAC,CAAC;AAAA,UACjD,GAAI,OAAiB,IAAI,CAAC,GAAG,MAAM;AAAA,YACjC;AAAA,YACA,EAAE,OAAO,uBAAuB;AAAA,YAChC,CAAC,QAAQ,EAAE,OAAO,kCAAkC,GAAG,GAAG,IAAI;AAAA,YAC9D,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC;AAAA,YACxB,GAAI,OAAO,OAAO,QAAQ,QAAQ,MAAM,aACpC,MAAM,OACJ;AAAA,cACE;AAAA,gBACE;AAAA,gBACA,EAAE,OAAO,eAAe;AAAA,gBACxB,aAAa,OAAO,QAAQ,QAAQ,EAAE,IAAI;AAAA,gBAC1C,CAAC,UAAU,EAAE,QAAQ,OAAO,MAAM,CAAC,EAAE,CAAC;AAAA,gBACtC;AAAA,cACF;AAAA,YACF,IACA,CAAC,IACH,CAAC;AAAA,UACP,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AVhCO,SAAS,eAEd,OAC8C;AAC9C,SAAO,OAAO,UAAU,cAAc,MAAM,YAAY;AAC1D;AAmBO,IAAM,cAAN,MAAqC;AAAA,EAO1C,IAAI,SAA0B;AAC5B,UAAM,QACJ,KAAK,KAAK,iBAAiBC,cACvB,kBAAkB,SAAS,EAAE,QAAQ,KAAK,KAAK,KAAK,IACpD,kBAAkB,OAAO,EAAE,QAAQ,KAAK,KAAK,KAAK;AAExD,UAAM,WAAW,oBAAoB,IAAI,IAAI;AAC7C,QAAI,UAAU;AACZ,eAAS,mBAAmB,KAAK,IAAI,MAAM,EAAE;AAC7C,0BAAoB,IAAI,OAAO,QAAQ;AAAA,IACzC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,YAAY;AACd,UAAM,aAAa,KAAK,KAAK,KAAK,KAAK;AAEvC,QAAI,sBAAsBA,aAAY;AACpC,aAAO,cAAc;AAAA,QAAI;AAAA,QAAY,MACnC,kBAAkB,SAAS,EAAE,QAAQ,UAAU;AAAA,MACjD;AAAA,IACF;AAEA,WAAO,IAAI,mBAAmB,KAAK,KAAK,KAAK,IAAI;AAAA,EACnD;AAAA;AAAA,EAGA,eAAe,OAAY;AACzB,WAAO,eAAe,MAAM,eAAe;AAAA,MACzC,OAAO,YAAY,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAAA,MACtD,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,QAAkD,KAAoB;AAC3E,WAAO,IAAI,KAAK,EAAE,SAAS,IAAI,CAAC;AAAA,EAClC;AAAA;AAAA,EAGA,SAAkC;AAChC,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,MACX,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,CAAC,OAAO,IAAI;AACV,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA,EAGA,OACE,IACkB;AAClB,UAAM,SAAS,GAAG,QAAQ,KAAK,IAAI;AACnC,UAAM,oBAAoB,oBAAoB,IAAI,IAAI;AACtD,QAAI,mBAAmB;AACrB,0BAAoB,IAAI,QAAQ,iBAAiB;AAAA,IACnD;AACA,WAAO;AAAA,EACT;AACF;AAEO,SAAS,YACd,KACA,IACA,IACA,OAC6C;AAC7C,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,OAAO,gBAAgB;AACtB,gBAAQ,KAAK;AACb,oBAAY;AAAA,MACd;AAAA,MACA,MAAM;AACJ,gBAAQ,MAAS;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,SAAS,oBACd,UACA,OAC6C;AAC7C,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,mBACd,KACA,IACA,IACA,OACA,UACA,eACA,gBACY;AACZ,QAAMC,OAAM,IAAI,IAAI,IAAI,IAAI,EAAE,KAAK,KAAK,UAAU,MAAM,CAAC;AAEzD,MAAI,eAAe;AACnB,MAAI;AAEJ,WAAS,UAAU,OAAsB;AACvC,QAAI,CAAC,OAAO;AACV,uBAAiB,cAAc;AAC/B;AAAA,IACF;AACA,QAAI,aAAc;AAClB,UAAM,eAAe,IAAI;AAAA,MACvB;AAAA,MACA;AAAA,MACA,CAAC,QAAQC,kBAAiB;AACxB,YAAI,cAAc,OAAO,MAAM,GAAG;AAChC;AAAA,YACE;AAAA,YACAA,cAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,kBAAc,aAAa;AAAA,EAC7B;AAEA,QAAM,OAAO,iBAAiBD,KAAI,SAAS,IAAI;AAE/C,MAAI,MAAM;AACR,cAAU,IAAI;AAAA,EAChB,OAAO;AACL,IAAAA,KACG,KAAK,EACL,KAAK,CAAC,UAAU,UAAU,KAAK,CAAC,EAChC,MAAM,CAAC,MAAM;AACZ,cAAQ,MAAM,yCAAyC,CAAC;AAAA,IAC1D,CAAC;AAAA,EACL;AAEA,SAAO,SAAS,wBAAwB;AACtC,mBAAe;AACf,mBAAe,YAAY;AAAA,EAC7B;AACF;AAEO,SAAS,wBAAkD,SAE/D;AACD,MAAI,eAAmD;AACvD,MAAI,kBAAkB;AAEtB,WAAS,UACP,KACA,IACA,IACA,OACA,UACA,eACA;AACA;AAEA,UAAM,cAAc;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,UAAU;AACT,uBAAe;AACf,iBAAS;AAAA,MACX;AAAA,MACA;AAAA,MACA,SAAS;AAAA,IACX;AAEA,WAAO,MAAM;AACX,kBAAY;AACZ;AACA,UAAI,oBAAoB,GAAG;AACzB,uBAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa;AAAA,IACjB,iBAAiB,MAAM;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,2BACd,UACA,OACA,UACY;AACZ,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,0BACd,SAOA;AACA,SAAO,WAAW,YACf,QAAQ,UAAU,aAAa,QAAQ,UAAU,WAChD,EAAE,OAAO,SAAS,YAAY,OAAU,IACxC;AAAA,IACE,OAAO,QAAQ;AAAA,IACf,YAAY,QAAQ,SAAS,EAAE,YAAY,QAAQ,OAAO,IAAI;AAAA,EAChE;AACN;;;AWlUA;AAAA,EAGE,cAAAE;AAAA,OAIK;AAqBA,SAAS,gBAAgB,SAAkB;AAChD,MAAI,CAAC,QAAQ,MAAM;AACjB,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AAEA,QAAM,aAAa,QAAQ;AAE3B,QAAM,QAAQ,WAAW,YAAY;AACrC,QAAM,eAAe,MAAM,aAA6B;AAExD,QAAM,YAAY,WAAW,UAAqB;AAClD,QAAM,gBAAgB,WAAW,aAA0B;AAC3D,QAAM,aAAa,WAAW,aAAmC;AAEjE,QAAM,aACJ,GAAG,aAAa,EAAE,IAAI,MAAM,aAAa,WAAW,CAAC;AAEvD,YAAU,IAAI,YAAY,aAAa,EAAE;AACzC,YAAU,IAAI,aAAa,cAAc,EAAE;AAC3C,YAAU,IAAI,UAAU,WAAW,EAAE;AAErC,SAAO;AAAA,IACL,IAAI,UAAU;AAAA,IACd;AAAA,EACF;AACF;AASA,SAAS,mBACP,SACA,YACA;AACA,QAAM,QAAQ,QAAQ,KAAK;AAE3B,MAAI,iBAAiBC,aAAY;AAC/B,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AAEA,QAAM,UAAU,YAAY,QAAQ;AAEpC,QAAM,UAAU,MAAM,UAA8B;AAAA,IAClD,SAAS,QAAQ;AAAA,IACjB,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,OAAO;AAAA,EACT,CAAC;AAED,SAAO;AACT;AAEO,IAAM,QAAN,MAAM,OAAM;AAAA,EAQT,YACN,SACA,MACA,UACA,WACA,QACA;AARF,sBAAa,oBAAI,IAA8B;AAS7C,SAAK,UAAU;AACf,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,YAAY;AACjB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,UACE,QACA,UAIA,UAAgC,CAAC,GACjC;AACA,UAAM,YAAY,oBAAI,IAA8B;AACpD,UAAM,SAAS,oBAAI,IAAwC;AAC3D,UAAM,OAAO,KAAK,QAAQ,KAAK,KAAK;AAEpC,SAAK,UAAU,UAAU,CAAC,WAAW;AACnC,iBAAW,SAAS,OAAO,OAAO,OAAO,KAAK,GAAG;AAC/C,mBAAW,QAAQ,OAAO;AACxB,oBAAU,IAAI,KAAK,KAAc;AAAA,QACnC;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,EAAE,QAAQ,IAAI;AACpB,UAAM,EAAE,UAAU,EAAE,IAAI;AAExB,QAAI,YACF;AAEF,UAAM,iBAAiB,MAAM;AAC3B,mBAAa,SAAS;AACtB,kBAAY;AAAA,IACd;AAEA,UAAM,oBAAoB,CAAC,WAA2B;AACpD,qBAAe;AAEf,iBAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,OAAO,KAAK,GAGvD;AACH,cAAM,YAAY,0BAA0B,SAAS;AAErD,YAAI,CAAC,WAAW;AACd,kBAAQ,KAAK,yCAAyC,SAAS;AAC/D;AAAA,QACF;AAEA,mBAAW,QAAQ,OAAO;AACxB,gBAAM,QAAQ,GAAG,SAAS,IAAI,KAAK,GAAG,OAAO;AAE7C,cAAI,CAAC,UAAU,IAAI,KAAK,KAAK,CAAC,KAAK,WAAW,IAAI,KAAK,GAAG;AACxD,iBAAK,WAAW,IAAI,KAAK;AAEzB,kBAAM,KAAK,KAAK;AAEhB,iBACG,KAAK,EAAE,EACP,KAAK,CAAC,YAAY;AACjB,kBAAI,YAAY,eAAe;AAC7B,uBAAO,QAAQ;AAAA,kBACb,IAAI,MAAM,kCAAkC,EAAE;AAAA,gBAChD;AAAA,cACF;AAEA,qBAAO;AAAA,gBACL;AAAA,gBACA,QAAQ,IAAI,SAAS;AAAA,gBACrB;AAAA,gBACA,CAAC;AAAA,cACH;AAAA,YACF,CAAC,EACA,KAAK,CAAC,UAAU;AACf,kBAAI,CAAC,OAAO;AACV,uBAAO,QAAQ;AAAA,kBACb,IAAI,MAAM,kCAAkC,EAAE;AAAA,gBAChD;AAAA,cACF;AAEA,qBAAO,SAAS,OAAO,SAAS;AAAA,YAClC,CAAC,EACA,KAAK,CAAC,WAAW;AAChB,oBAAM,eAAe,KAClB,oBAAoB,KAAK,KAAK,EAC9B,kBAAkB;AAErB,kBAAI,QAAQ;AACV,6BAAa,IAAI,UAAU,OAAO,EAAE;AAAA,cACtC;AAEA,2BAAa,IAAI,aAAa,IAAI;AAElC,mBAAK,UAAU,KAAK,KAAK;AACzB,mBAAK,WAAW,OAAO,KAAK;AAAA,YAC9B,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,sBAAQ,MAAM,kCAAkC,KAAK;AACrD,mBAAK,WAAW,OAAO,KAAK;AAC5B,oBAAM,SAAS,OAAO,IAAI,KAAK,KAAK,CAAC;AAErC,oBAAM,mBAAmB,OAAO,KAAK;AACrC,qBAAO,KAAK,gBAAgB;AAE5B,oBAAM,eAAe,KAClB,oBAAoB,KAAK,KAAK,EAC9B,kBAAkB;AAErB,2BAAa,IAAI,SAAS,gBAAgB;AAE1C,kBAAI,OAAO,SAAS,SAAS;AAC3B,6BAAa,IAAI,aAAa,IAAI;AAClC,qBAAK,UAAU,KAAK,KAAK;AACzB,qBAAK,OAAO,KAAK,EAAE,QAAQ,OAAO,KAAK,MAAM,CAAC;AAAA,cAChD,OAAO;AACL,uBAAO,IAAI,OAAO,MAAM;AACxB,oBAAI,CAAC,WAAW;AACd,8BAAY;AAAA,oBACV,MAAM,kBAAkB,MAAM;AAAA,oBAC9B;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACL;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,KAAK,SAAS,UAAU,iBAAiB;AAAA,EAClD;AAAA,EAEA,aAAa,KAAK,SAAkB;AAClC,UAAM,UAAU,QAAQ;AAExB,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AAEA,QAAI,CAAC,QAAQ,OAAO;AAClB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AAEA,UAAM,OAAO,QAAQ,KAAK,KAAK;AAE/B,UAAM,OAAO,MAAM,KAAK,KAAK,QAAQ,KAAwB;AAE7D,QAAI,SAAS,eAAe;AAC1B,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACnC;AAEA,UAAM,CAAC,UAAU,WAAW,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,MACtD,KAAK,KAAK,KAAK,IAAI,UAAU,CAAE;AAAA,MAC/B,KAAK,KAAK,KAAK,IAAI,WAAW,CAAE;AAAA,MAChC,KAAK,KAAK,KAAK,IAAI,QAAQ,CAAE;AAAA,IAC/B,CAAC;AAED,QACE,aAAa,iBACb,cAAc,iBACd,WAAW,eACX;AACA,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACnC;AAEA,WAAO,IAAI,OAAM,SAAS,MAAM,UAAU,WAAW,MAAM;AAAA,EAC7D;AACF;AAEO,IAAM,cAAN,MAAM,aAA8D;AAAA,EAKjE,YACN,gBACA,OACA,UACA;AACA,SAAK,iBAAiB;AACtB,SAAK,QAAQ;AACb,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,kBAAkB;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAY,SAA4D;AACtE,UAAM,eAAe,mBAAyB,SAAS,KAAK,KAAK;AAEjE,SAAK,SAAS,KAAK,aAAa,EAAE;AAElC,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,mBAAa,UAAU,CAACC,aAAY;AAClC,YAAIA,SAAQ,IAAI,WAAW,GAAG;AAC5B,gBAAM,QAAQA,SAAQ,IAAI,OAAO;AACjC,cAAI,OAAO;AACT,mBAAO,IAAI,MAAM,KAAK,CAAC;AAAA,UACzB,OAAO;AACL;AAAA,cACEA,SAAQ,IAAI,QAAQ;AAAA,YACtB;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,KAGX,cAA2B,gBAAyB;AACpD,UAAM,OAAO,eAAe,KAAK,KAAK;AAEtC,UAAM,gBAAgB,MAAM,KAAK;AAAA,MAC/B;AAAA,IACF;AAEA,QAAI,kBAAkB,eAAe;AACnC,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,UAAM,uBAAuB,MAAM,KAAK,KAAK,cAAc,IAAI,SAAS,CAAE;AAE1E,QAAI,yBAAyB,eAAe;AAC1C,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC1D;AAEA,UAAM,cAAc,qBAAqB,IAAI,aAAa;AAE1D,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AAEA,UAAM,KAAK,MAAM,aAAa,aAA4B,cAAc;AAExE,UAAM,WAAW,MAAM,KAAK,KAAK,EAAE;AAEnC,QAAI,aAAa,eAAe;AAC9B,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACnC;AAEA,WAAO,IAAI,aAAkB,gBAAgB,eAAe,QAAQ;AAAA,EACtE;AACF;AAEA,eAAe,aAAa,QAAgB,SAAkB;AAC5D,QAAM,KAAK,OAAO,MAAM,GAAG,OAAO,QAAQ,GAAG,CAAC;AAE9C,QAAM,eAAe,OAAO,MAAM,OAAO,QAAQ,GAAG,IAAI,CAAC;AAEzD,MAAI,CAAC,IAAI,WAAW,MAAM,KAAK,CAAC,aAAa,WAAW,eAAe,GAAG;AACxE,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AAEA,MAAI,CAAC,QAAQ,MAAM;AACjB,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AAEA,QAAO,QAAQ,KAA8B,aAAa,IAAI,YAAY;AAE1E,SAAO;AACT;AAEA,SAAS,0BAA0B,WAAsB;AACvD,QAAM,QAAQ,UAAU,QAAQ,UAAU;AAC1C,QAAM,YAAY,UAAU,MAAM,GAAG,KAAK;AAE1C,MAAI,UAAU,WAAW,MAAM,GAAG;AAChC,WAAO;AAAA,EACT;AAEA;AACF;;;ACxXA;AAAA,EAOE;AAAA,OACK;AAkFA,IAAM,SAAN,MAAM,eAAc,YAA+B;AAAA;AAAA,EAiBxD,IAAI,UAAU;AACZ,WAAQ,KAAK,YAA6B;AAAA,EAG5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,IAAI,QAEF;AACA,WAAO;AAAA,MACL,CAAC,QAAQ,KAAK,KAAK,IAAI,GAAa;AAAA,MACpC,MAAM;AACJ,cAAM,OAAO,KAAK,KAAK,KAAK,EAAE,OAAO,CAAC,QAAQ;AAC5C,gBAAM,SACJ,KAAK,QAAQ,GAAgC,KAC5C,KAAK,QAAQ,QAAQ;AACxB,iBAAO,UAAU,WAAW,UAAU,aAAa,MAAM;AAAA,QAC3D,CAAC;AAED,eAAO;AAAA,MACT;AAAA,MACA,KAAK;AAAA,MACL,CAAC,QACE,KAAK,QAAQ,GAAG,KAAK,KAAK,QAAQ,QAAQ;AAAA;AAAA,IAE/C;AAAA,EACF;AAAA;AAAA,EAGQ,eACN,QACA,SAMA,YACA,KACA;AACA,WAAO;AAAA,MACL,OACE,eAAe,SACX,QAAQ,QACR,aAAa,aACX,QAAQ,UAAU,QAAQ,QAAQ,UAAU,SAC1C,QAAQ,QACR,WAAW,QAAQ,OAAO,QAAQ,KAAK,IACzC,IAAI;AAAA,QACF,QAAQ;AAAA,QACR,OAAO;AAAA,QACP;AAAA,MACF,EAAE,WAAW,QAAQ,YAAY,MAAM,QAAQ;AAAA,MACvD,KACE,eAAe,UAAU,aAAa,UAAU,IAC5C,IAAI,IAAI,QAAQ,OAAsB,OAAO,WAAW,UAAU,IAClE;AAAA,MACN,IACE,QAAQ,MACR,IAAI,IAAa,QAAQ,IAAmB,OAAO,WAAW;AAAA,QAC5D,KAAK,kBAAkB,SAAS;AAAA,QAChC,UAAU;AAAA,MACZ,CAAC,EAAE,WAAW,QAAQ,YAAY,MAAM,KAAK;AAAA,MAC/C,QAAQ,QAAQ;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,SAAS;AACX,UAAM,MAAM;AACZ,WAAO,IAAI;AAAA,MACT,CAAC;AAAA,MACD;AAAA,QACE,IAAI,SAAS,KAAK;AAChB,gBAAM,UAAU,IAAI,KAAK,WAAW,GAAa;AACjD,cAAI,CAAC,QAAS,QAAO;AAErB,gBAAM,aAAa,IAAI,QACrB,GACF;AAEA,iBAAO;AAAA,YACL,GAAG,IAAI,eAAe,KAAK,SAAS,YAAY,GAAa;AAAA,YAC7D,IAAI,MAAM;AACR,qBAAO,CAAC,GAAG,IAAI,KAAK,QAAQ,GAAa,CAAC,EAAE;AAAA,gBAAI,CAACC,aAC/C,IAAI,eAAe,KAAKA,UAAS,YAAY,GAAa;AAAA,cAC5D;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,QAAQ,SAAS;AACf,iBAAO,IAAI,KAAK,KAAK;AAAA,QACvB;AAAA,QACA,yBAAyB,QAAQ,KAAK;AACpC,iBAAO;AAAA,YACL,OAAO,QAAQ,IAAI,QAAQ,GAAG;AAAA,YAC9B,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,cAAc;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EAGF;AAAA;AAAA,EAGA,YAEE,SACA;AACA,UAAM;AAEN,QAAI,SAAS;AACX,UAAI,aAAa,SAAS;AACxB,eAAO,iBAAiB,MAAM;AAAA,UAC5B,IAAI;AAAA,YACF,OAAO,QAAQ,QAAQ;AAAA,YACvB,YAAY;AAAA,UACd;AAAA,UACA,MAAM,EAAE,OAAO,QAAQ,SAAS,YAAY,MAAM;AAAA,QACpD,CAAC;AAAA,MACH,OAAO;AACL,cAAM,IAAI,MAAM,qCAAqC;AAAA,MACvD;AAAA,IACF;AAEA,WAAO,IAAI,MAAM,MAAM,iBAAuC;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,OAAO,OAEL,MACA,SAOA;AACA,UAAM,WAAW,IAAI,KAAK;AAE1B,UAAM,EAAE,OAAO,WAAW,IAAI,0BAA0B,OAAO;AAC/D,UAAM,MAAM,SAAS,YAAY,MAAM,OAAO,UAAU;AAExD,WAAO,iBAAiB,UAAU;AAAA,MAChC,IAAI;AAAA,QACF,OAAO,IAAI;AAAA,QACX,YAAY;AAAA,MACd;AAAA,MACA,MAAM,EAAE,OAAO,KAAK,YAAY,MAAM;AAAA,IACxC,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,MAAe,WAAkC;AACtD,UAAM,eAAe,KAAK,KAAK,KAAK,EAAE,IAAI,CAAC,QAAQ;AACjD,YAAM,OAAO;AACb,YAAM,aAAc,KAAK,QAAQ,IAAI,KACnC,KAAK,QAAQ,QAAQ;AAEvB,UAAI,cAAc,UAAU,YAAY,YAAY;AAClD,eAAO,CAAC,KAAK,KAAK,KAAK,IAAI,GAAG,CAAC;AAAA,MACjC,WAAW,aAAa,UAAU,GAAG;AAEnC,YAAI,WAAW,SAAU,KAAa,IAAI,GAAG,EAAE,GAAG;AAEhD,iBAAO,CAAC,KAAK,EAAE,WAAY,KAAa,IAAI,GAAG,GAAG,CAAC;AAAA,QACrD;AAEA,cAAM,YAAa,KAAa,IAAI,GAAG,OAAO,MAAM;AAAA,UAClD,GAAI,aAAa,CAAC;AAAA,UAClB,KAAK;AAAA,QACP,CAAC;AACD,eAAO,CAAC,KAAK,SAAS;AAAA,MACxB,OAAO;AACL,eAAO,CAAC,KAAK,MAAS;AAAA,MACxB;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,OAAO,KAAK;AAAA,MACZ,GAAG,OAAO,YAAY,YAAY;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,CAAC,OAAO,IAAI;AACV,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YACE,MACA,OACA,YACA;AACA,UAAM,WAAW,MAAM;AAEvB,UAAM,UAAU,CAAC;AAIjB,QAAI;AACF,iBAAW,OAAO,OAAO,KAAK,IAAI,GAAuB;AACvD,cAAM,YAAY,KAAK,GAAwB;AAE/C,cAAM,aAAc,KAAK,QAAQ,GAAgC,KAC/D,KAAK,QAAQ,QAAQ;AAEvB,YAAI,CAAC,YAAY;AACf;AAAA,QACF;AAEA,YAAI,eAAe,QAAQ;AACzB,kBAAQ,GAAG,IAAI;AAAA,QACjB,WAAW,aAAa,UAAU,GAAG;AACnC,cAAI,WAAW;AACb,oBAAQ,GAAG,IAAK,UAAiC;AAAA,UACnD;AAAA,QACF,WAAW,aAAa,YAAY;AAClC,kBAAQ,GAAG,IAAI,WAAW,QAAQ;AAAA;AAAA,YAEhC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEF,WAAO,SAAS,UAAU,SAAS,MAAM,WAAW,UAAU;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,OAAO,OAAc,OAA2B;AAlZlD,QAAAC,KAAAC;AAAA,IAoZI,MAAM,yBAAwBA,MAAA,QAC3BD,MAAA,UAD2BC,KAAM;AAAA,MAApC;AAAA;AACE,aAACD,OAAY;AAAA;AAAA,IACf;AAIA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,OAAO,KAEL,IACA,IACA,OAC6C;AAC7C,WAAO,YAAY,MAAM,IAAI,IAAI,KAAK;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BA,OAAO,UAEL,IACA,IACA,OACA,UACY;AACZ,WAAO,mBAA6B,MAAM,IAAI,IAAI,OAAO,QAAQ;AAAA,EACnE;AAAA,EAEA,OAAO,WAEL,QACA,SACA,IACA;AACA,UAAM,SAAS;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA,MAAM;AAAA,MACN,YAAY;AAAA,IACd;AACA,UAAM,SACJ,GAAG,UAAU,cAAc,GAAG,KAAK,SAAS,GAAG,KAAK,KAAK;AAC3D,WAAO,gBAAgB,YAAY,QAAQ,MAAM;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAEE,OAC6C;AAC7C,WAAO,oBAAoB,MAAM,KAAK;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,UAEE,OACA,UACY;AACZ,WAAO,2BAA2B,MAAM,OAAO,QAAQ;AAAA,EACzD;AAAA,EAEA,UAA8C,WAAc;AAC1D,eAAW,OAAO,WAAW;AAC3B,UAAI,OAAO,UAAU,eAAe,KAAK,WAAW,GAAG,GAAG;AACxD,cAAM,OAAO;AACb,cAAM,aAAc,KAAK,QAAQ,IAAc,KAC7C,KAAK,QAAQ,QAAQ;AAEvB,YAAI,QAAQ,KAAK,SAAS;AACxB,gBAAM,WAAW,UAAU,IAAI;AAC/B,gBAAM,eAAgB,KAAsB,IAAI;AAEhD,cAAI,eAAe,UAAU,aAAa,YAAY;AACpD,gBAAI,iBAAiB,UAAU;AAE7B,cAAC,KAAa,IAAI,IAAI;AAAA,YACxB;AAAA,UACF,WAAW,aAAa,UAAU,GAAG;AACnC,kBAAM,YAAa,cAAsC;AACzD,kBAAM,QAAS,UAAkC;AACjD,gBAAI,cAAc,OAAO;AAEvB,cAAC,KAAa,IAAI,IAAI;AAAA,YACxB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,SAAgC;AAC1C,WAAO,KAAK,KAAK,KAAK,YAAY,OAAO;AAAA,EAC3C;AACF;AAxdI,OAAK,UAAU,QAAQ;AARpB,IAAM,QAAN;AA+gBP,IAAM,oBAAyC;AAAA,EAC7C,IAAI,QAAQ,KAAK,UAAU;AACzB,QAAI,QAAQ,WAAW;AACrB,aAAO,QAAQ,IAAI,QAAQ,GAAG;AAAA,IAChC,WAAW,OAAO,QAAQ;AACxB,aAAO,QAAQ,IAAI,QAAQ,KAAK,QAAQ;AAAA,IAC1C,OAAO;AACL,YAAM,SAAS,OAAO;AAEtB,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA,MACT;AAEA,YAAM,aAAc,OAAO,GAA6B,KACtD,OAAO,QAAQ;AACjB,UAAI,cAAc,OAAO,QAAQ,UAAU;AACzC,cAAM,MAAM,OAAO,KAAK,IAAI,GAAG;AAE/B,YAAI,eAAe,QAAQ;AACzB,iBAAO;AAAA,QACT,WAAW,aAAa,YAAY;AAClC,iBAAO,QAAQ,SAAY,SAAY,WAAW,QAAQ,OAAO,GAAG;AAAA,QACtE,WAAW,aAAa,UAAU,GAAG;AACnC,iBAAO,QAAQ,SACX,SACA,IAAI;AAAA,YACF;AAAA,YACA,OAAO;AAAA,YACP;AAAA,UACF,EAAE,WAAW,UAAU,GAAG;AAAA,QAChC;AAAA,MACF,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EACA,IAAI,QAAQ,KAAK,OAAO,UAAU;AAChC,SACG,OAAO,QAAQ,YAAY,aAC5B,OAAO,UAAU,YACjB,UAAU,QACV,cAAc,OACd;AACA,MAAC,OAAO,YAA6B,YAAY,CAAC;AAClD,MAAC,OAAO,YAA6B,QAAQ,GAAG,IAAI,MAAM,UAAU;AACpE,aAAO;AAAA,IACT;AAEA,UAAM,aAAc,OAAO,QAAQ,GAA6B,KAC9D,OAAO,QAAQ,QAAQ;AACzB,QAAI,cAAc,OAAO,QAAQ,UAAU;AACzC,UAAI,eAAe,QAAQ;AACzB,eAAO,KAAK,IAAI,KAAK,KAAK;AAAA,MAC5B,WAAW,aAAa,YAAY;AAClC,eAAO,KAAK,IAAI,KAAK,WAAW,QAAQ,OAAO,KAAK,CAAC;AAAA,MACvD,WAAW,aAAa,UAAU,GAAG;AACnC,YAAI,UAAU,MAAM;AAClB,cAAI,WAAW,UAAU;AACvB,mBAAO,KAAK,IAAI,KAAK,IAAI;AAAA,UAC3B,OAAO;AACL,kBAAM,IAAI,MAAM,iCAAiC,GAAG,UAAU;AAAA,UAChE;AAAA,QACF,OAAO;AACL,iBAAO,KAAK,IAAI,KAAK,MAAM,EAAE;AAC7B,8BACG,IAAI,MAAM,GACT,mBAAmB,OAAO,IAAI,MAAM,EAAE;AAAA,QAC5C;AAAA,MACF;AACA,aAAO;AAAA,IACT,OAAO;AACL,aAAO,QAAQ,IAAI,QAAQ,KAAK,OAAO,QAAQ;AAAA,IACjD;AAAA,EACF;AAAA,EACA,eAAe,QAAQ,KAAK,YAAY;AACtC,QACE,WAAW,cACX,OAAO,WAAW,UAAU,YAC5B,cAAc,WAAW,OACzB;AACA,MAAC,OAAO,YAA6B,YAAY,CAAC;AAClD,MAAC,OAAO,YAA6B,QAAQ,GAAa,IACxD,WAAW,MAAM,UAAU;AAC7B,aAAO;AAAA,IACT,OAAO;AACL,aAAO,QAAQ,eAAe,QAAQ,KAAK,UAAU;AAAA,IACvD;AAAA,EACF;AAAA,EACA,QAAQ,QAAQ;AACd,UAAM,OAAO,QAAQ,QAAQ,MAAM,EAAE,OAAO,CAAC,MAAM,MAAM,QAAQ;AAMjE,eAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,UAAI,CAAC,KAAK,SAAS,GAAG,GAAG;AACvB,aAAK,KAAK,GAAG;AAAA,MACf;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EACA,yBAAyB,QAAQ,KAAK;AACpC,QAAI,OAAO,QAAQ;AACjB,aAAO,QAAQ,yBAAyB,QAAQ,GAAG;AAAA,IACrD,OAAO;AACL,YAAM,aAAc,OAAO,QAAQ,GAA6B,KAC9D,OAAO,QAAQ,QAAQ;AACzB,UAAI,cAAc,OAAO,OAAO,KAAK,QAAQ;AAC3C,eAAO;AAAA,UACL,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,IAAI,QAAQ,KAAK;AACf,UAAM,aAAc,OAAO,UAAU,GAA6B,KAChE,OAAO,UAAU,QAAQ;AAE3B,QAAI,OAAO,QAAQ,OAAO,QAAQ,YAAY,YAAY;AACxD,aAAO,OAAO,KAAK,IAAI,GAAG,MAAM;AAAA,IAClC,OAAO;AACL,aAAO,QAAQ,IAAI,QAAQ,GAAG;AAAA,IAChC;AAAA,EACF;AAAA,EACA,eAAe,QAAQ,KAAK;AAC1B,UAAM,aAAc,OAAO,QAAQ,GAA6B,KAC9D,OAAO,QAAQ,QAAQ;AACzB,QAAI,OAAO,QAAQ,YAAY,YAAY;AACzC,aAAO,KAAK,OAAO,GAAG;AACtB,aAAO;AAAA,IACT,OAAO;AACL,aAAO,QAAQ,eAAe,QAAQ,GAAG;AAAA,IAC3C;AAAA,EACF;AACF;AAEA,kBAAkB,OAAO,IAAI;;;AC/uBtB,IAAM,UAAN,cAAsB,MAAM;AAAA,EAA5B;AAAA;AACL,gBAAO,GAAG;AACV,iBAAQ,GAAG,SAAS,KAAsB;AAC1C,uBAAc,GAAG,SAAS,KAAkB;AAAA;AAC9C;;;ACVA;AAAA,EAKE,aAAAE;AAAA,EAEA,cAAAC;AAAA,EAKA,mBAAAC;AAAA,OACK;AA8BA,IAAM,WAAN,MAAM,iBAAgB,YAA+B;AAAA,EAO1D,IAAI,UAGF;AACA,WAAQ,KAAK,YAA+B;AAAA,EAC9C;AAAA,EAcA,IAAI,SAAkB;AACpB,WAAO;AAAA,EACT;AAAA,EACA,IAAI,YAA0C;AAC5C,QAAI,KAAK,KAAM,QAAO;AAEtB,UAAM,aAAa,KAAK,KAAK,KAAK,KAAK;AAEvC,QAAI,sBAAsBC,aAAY;AACpC,aAAO,cAAc,IAAI,YAAY,MAAM,SAAQ,QAAQ,UAAU,CAAC;AAAA,IACxE;AAEA,WAAO,IAAI,mBAAmB,KAAK,KAAK,KAAK,IAAI;AAAA,EACnD;AAAA,EAKA,IAAI,QAGF;AACA,UAAM,YAAY,KAAK,KAAK,IAAI,SAAS;AAGzC,UAAM,SAAS,KAAK,KAAK,IAAI,MAAM;AAInC,WAAO;AAAA,MACL,SACE,aACC,IAAI;AAAA,QACH;AAAA,QACA,KAAK;AAAA,QACL,KAAK,QAAQ;AAAA;AAAA,MAIf;AAAA,MACF,MACE,UACC,IAAI;AAAA,QACH;AAAA,QACA,KAAK;AAAA,QACL,KAAK,QAAQ;AAAA;AAAA,MAEf;AAAA,IACJ;AAAA,EACF;AAAA,EAKA,YAAY,SAAyD;AACnE,UAAM;AACN,QAAI,EAAE,aAAa,UAAU;AAC3B,YAAM,IAAI,MAAM,uDAAuD;AAAA,IACzE;AACA,SAAK,OAAO,QAAQ,QAAQ,MAAM,QAAQ,QAAQ,KAAK,KAAK,QAAQ;AAEpE,WAAO,iBAAiB,MAAM;AAAA,MAC5B,IAAI;AAAA,QACF,OAAO,QAAQ,QAAQ;AAAA,QACvB,YAAY;AAAA,MACd;AAAA,MACA,MAAM,EAAE,OAAO,QAAQ,SAAS,YAAY,MAAM;AAAA,MAClD,OAAO,EAAE,OAAO,WAAW,YAAY,MAAM;AAAA,IAC/C,CAAC;AAED,QAAI,KAAK,MAAM;AACb,WAAK,YAAY,QAAQ,QAAQ,KAAK,KAAK;AAAA,IAC7C;AAEA,WAAO,IAAI,MAAM,MAAM,2BAAiD;AAAA,EAC1E;AAAA,EAEA,SAA8B;AAC5B,QAAI,KAAK,MAAM;AACb,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,SACA,cACA,cACA;AACA,QAAI,CAAC,KAAK,MAAM;AACd,YAAM,IAAI,MAAM,8CAA8C;AAAA,IAChE;AAEA,UAAO,KAAK,KAA8B;AAAA,MACxC;AAAA,MACA;AAAA,IACF;AAEA,WAAO,YAAY,cAAc,SAAS,MAAiB,CAAC,CAAC;AAAA,EAE/D;AAAA;AAAA,EAGA,aAAa,OAEX,SAMY;AACZ,UAAM,EAAE,KAAK,IAAI,MAAMC,WAAU,wBAAwB;AAAA,MACvD,GAAG;AAAA,MACH,WAAW,OAAO,YAAY,OAAO,kBAAkB;AACrD,cAAM,UAAU,IAAI,KAAK;AAAA,UACvB,SAAS;AAAA,QACX,CAAC;AAED,cAAM,QAAQ,iBAAiB,aAAa;AAAA,MAC9C;AAAA,IACF,CAAC;AAED,WAAO,KAAK,SAAS,IAAI;AAAA,EAC3B;AAAA,EAEA,aAAa,SAEX,IACA,SAGA;AAEA,UAAM,iBAAiBC,iBAAgB;AAAA,MACrC;AAAA,MACA;AAAA,MACA,EAAE,WAAW,UAAU,WAAW,SAAS;AAAA,IAC7C;AAEA,OAAG,KAAK,KAAK,KAAK,YAAY,QAAQ,eAAe,CAAC,CAAC;AAEvD,WAAO,KAAK,OAAU;AAAA,MACpB,eAAe,QAAQ;AAAA,MACvB,QAAQ,GAAG,KAAK,KAAK,KAAK;AAAA,MAC1B,iBAAiB,CAAC,eAAe,CAAC,CAAC;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,SAEL,MACG;AACH,WAAO,IAAI,KAAK;AAAA,MACd,SAAS,KAAK;AAAA,IAChB,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,SAAyB;AACvB,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EAEA,CAAC,OAAO,IAAI;AACV,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EAEA,MAAM,eAAe,eAAwD;AAC3E,QAAI,eAAe;AACjB,YAAM,eAAe,kBAAkB,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,CAAC;AACtE,mBAAa,UAAU,YAAY,QAAQ;AAC3C,WAAK,UAAU,QAAQ;AAAA,QACrB,EAAE,MAAM,cAAc,KAAK;AAAA,QAC3B,EAAE,OAAO,aAAa;AAAA,MACxB;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,KAAK,KAAK;AAC5B,UAAM,UAAU,KACb,oBAAoB,KAAK,KAAK,IAAI,SAAS,CAAE,EAC7C,kBAAkB;AAErB,QAAI,CAAC,QAAQ,IAAI,OAAO,GAAG;AACzB,YAAM,YAAY,gBAAgB,IAAI;AACtC,cAAQ,IAAI,SAAS,UAAU,EAAE;AACjC,cAAQ,IAAI,eAAe,UAAU,UAAU;AAAA,IACjD;AAEA,UAAM,KAAK,QAAQ,aAAa;AAAA,EAClC;AAAA;AAAA,EAGA,QAAQ,eAAkC;AACxC;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,KAEL,IACA,IACA,OAC6C;AAC7C,WAAO,YAAY,MAAM,IAAI,IAAI,KAAK;AAAA,EACxC;AAAA;AAAA,EAGA,OAAO,UAEL,IACA,IACA,OACA,UACY;AACZ,WAAO,mBAA6B,MAAM,IAAI,IAAI,OAAO,QAAQ;AAAA,EACnE;AAAA;AAAA,EAGA,aAEE,OAC6C;AAC7C,WAAO,oBAAoB,MAAM,KAAK;AAAA,EACxC;AAAA;AAAA,EAGA,UAEE,OACA,UACY;AACZ,WAAO,2BAA2B,MAAM,OAAO,QAAQ;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,SAET;AACD,WAAO,KAAK,KAAK,KAAK,YAAY,OAAO;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,uBAAuB,SAEpB;AACD,WAAO,KAAK,KAAK,KAAK,KAAK,YAAY;AAAA,MACrC,SAAS;AAAA,IACX;AAAA,EACF;AACF;AA/QI,SAAK,UAAU;AAAA,EACb,SAAS;AAAA,IACP,KAAK,MAAM;AAAA,IACX,UAAU;AAAA,EACZ;AAAA,EACA,MAAM;AAAA,IACJ,KAAK,MAAM,kBAAkB,OAAO;AAAA,IACpC,UAAU;AAAA,EACZ;AACF;AAvBG,IAAM,UAAN;AA+RA,IAAM,8BAA6D;AAAA,EACxE,IAAI,QAAQ,KAAK,UAAU;AACzB,QAAI,QAAQ,WAAW;AACrB,YAAMC,OAAM,OAAO,MAAM;AACzB,aAAOA,OACHA,KAAI,WAAW,UAAU,SAAS;AAAA;AAAA,QAEjC;AAAA;AAAA,IACP,WAAW,QAAQ,QAAQ;AACzB,YAAMA,OAAM,OAAO,MAAM;AAEzB,aAAOA,OAAMA,KAAI,WAAW,UAAU,MAAM,IAAK;AAAA,IACnD,OAAO;AACL,aAAO,QAAQ,IAAI,QAAQ,KAAK,QAAQ;AAAA,IAC1C;AAAA,EACF;AAAA,EACA,IAAI,QAAQ,KAAK,OAAO,UAAU;AAChC,SACG,QAAQ,aAAa,QAAQ,UAAU,QAAQ,eAChD,OAAO,UAAU,YACjB,cAAc,OACd;AACA,MAAC,OAAO,YAA6B,YAAY,CAAC;AAClD,MAAC,OAAO,YAA6B,QAAQ,GAAG,IAAI,MAAM,UAAU;AACpE,aAAO;AAAA,IACT,WAAW,QAAQ,WAAW;AAC5B,UAAI,OAAO;AACT,eAAO,KAAK;AAAA,UACV;AAAA,UACA,MAAM;AAAA,UACN;AAAA,QACF;AAAA,MACF;AACA,0BACG,IAAI,QAAQ,GACX,mBAAmB,OAAO,IAAI,MAAM,EAAE;AAC1C,aAAO;AAAA,IACT,WAAW,QAAQ,QAAQ;AACzB,UAAI,OAAO;AACT,eAAO,KAAK,IAAI,QAAQ,MAAM,EAA+B;AAAA,MAC/D;AACA,0BACG,IAAI,QAAQ,GACX,mBAAmB,OAAO,IAAI,MAAM,EAAE;AAC1C,aAAO;AAAA,IACT,OAAO;AACL,aAAO,QAAQ,IAAI,QAAQ,KAAK,OAAO,QAAQ;AAAA,IACjD;AAAA,EACF;AAAA,EACA,eAAe,QAAQ,KAAK,YAAY;AACtC,SACG,QAAQ,aAAa,QAAQ,UAAU,QAAQ,eAChD,OAAO,WAAW,UAAU,YAC5B,cAAc,WAAW,OACzB;AACA,MAAC,OAAO,YAA6B,YAAY,CAAC;AAClD,MAAC,OAAO,YAA6B,QAAQ,GAAG,IAC9C,WAAW,MAAM,UAAU;AAC7B,aAAO;AAAA,IACT,OAAO;AACL,aAAO,QAAQ,eAAe,QAAQ,KAAK,UAAU;AAAA,IACvD;AAAA,EACF;AACF;AAGO,SAAS,oBAAoB,SAIlC;AACA,SAAO,QAAQ;AACjB;AAMA,kBAAkB,SAAS,IAAI;;;AC7XxB,IAAM,SAAN,MAAM,eAAc,YAA+B;AAAA,EAUxD,IAAI,UAIF;AACA,WAAQ,KAAK,YAA6B;AAAA,EAC5C;AAAA,EAoBA,IAAI,QAGF;AACA,UAAM,YAAY,KAAK,KAAK,IAAI,SAAS;AAGzC,UAAM,SAAS,KAAK,KAAK,IAAI,MAAM;AAGnC,WAAO;AAAA,MACL,SACE,aACC,IAAI;AAAA,QACH;AAAA,QACA,KAAK;AAAA,QACL,KAAK,QAAQ;AAAA;AAAA,MAEf;AAAA,MAGF,MACE,UACC,IAAI;AAAA,QACH;AAAA,QACA,KAAK;AAAA,QACL,KAAK,QAAQ;AAAA;AAAA,MAEf;AAAA,IACJ;AAAA,EACF;AAAA;AAAA,EAGA,YAAY,SAA6D;AACvE,UAAM;AACN,QAAI;AAEJ,QAAI,WAAW,aAAa,SAAS;AACnC,YAAM,QAAQ;AAAA,IAChB,OAAO;AACL,YAAM,YAAY,QAAQ;AAC1B,UAAI,CAAC,UAAW,OAAM,IAAI,MAAM,mBAAmB;AACnD,UAAI,UAAU,UAAU,aAAa,oBAAoB,SAAS,GAAG;AACnE,cAAM,WAAW,UAAU;AAC3B,cAAM,SAAS,YAAY;AAAA,MAC7B,OAAO;AACL,cAAM,IAAI,MAAM,kDAAkD;AAAA,MACpE;AAAA,IACF;AAEA,WAAO,iBAAiB,MAAM;AAAA,MAC5B,IAAI;AAAA,QACF,OAAO,IAAI;AAAA,QACX,YAAY;AAAA,MACd;AAAA,MACA,MAAM,EAAE,OAAO,KAAK,YAAY,MAAM;AAAA,IACxC,CAAC;AAED,WAAO,IAAI,MAAM,MAAM,2BAAiD;AAAA,EAC1E;AAAA,EAEA,OAAO,OAEL,SACA;AACA,WAAO,IAAI,KAAK,0BAA0B,OAAO,CAAC;AAAA,EACpD;AAAA,EAEA,SAA2B;AACzB,WAAO,KAAK,KAAK,OAAO;AAAA,EAC1B;AAAA,EAEA,UAAU,QAA4B,MAAY;AAChD,SAAK,KAAK,UAAU,WAAW,aAAa,SAAS,OAAO,MAAM,IAAI;AACtE,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,QAA4B;AACvC,SAAK,KAAK,aAAa,WAAW,aAAa,SAAS,OAAO,IAAI;AACnE,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,KACT,KAAK,EACL,OAAO,CAAC,QAAQ;AACf,aAAO,QAAQ,cAAc,IAAI,WAAW,KAAK;AAAA,IACnD,CAAC,EACA,IAAI,CAAC,OAAO;AACX,YAAM,OAAO,KAAK,KAAK,IAAI,EAA6B;AACxD,YAAM,YACJ,OAAO,aAAa,SAAa;AACnC,YAAMC,OACJ,aACA,IAAI;AAAA,QACF;AAAA,QACA,KAAK;AAAA,QACL,KAAK,QAAQ,UAAU;AAAA,MACzB;AACF,YAAM,YAAY,MAAMA,MAAK,WAAW,MAAM,aAAa,EAAE;AAE7D,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,KAAAA;AAAA,QACA,IAAI,UAAU;AACZ,iBAAO,UAAU;AAAA,QACnB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACL;AAAA,EAEA,OAAO,QAAe;AACpB,SAAK,KAAK,OAAO,OAAO,IAAI;AAC5B,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,OAAO,KAEL,IACA,IACA,OAC6C;AAC7C,WAAO,YAAY,MAAM,IAAI,IAAI,KAAK;AAAA,EACxC;AAAA;AAAA,EAGA,OAAO,UAEL,IACA,IACA,OACA,UACY;AACZ,WAAO,mBAA6B,MAAM,IAAI,IAAI,OAAO,QAAQ;AAAA,EACnE;AAAA;AAAA,EAGA,aAEE,OAC6C;AAC7C,WAAO,oBAAoB,MAAM,KAAK;AAAA,EACxC;AAAA;AAAA,EAGA,UAEE,OACA,UACY;AACZ,WAAO,2BAA2B,MAAM,OAAO,QAAQ;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,SAAgC;AAC1C,WAAO,KAAK,KAAK,KAAK,YAAY,OAAO;AAAA,EAC3C;AACF;AAnMI,OAAK,UAAU,QAAQ;AAcvB,OAAK,UAAU;AAAA,EACb,SAAS;AAAA,EACT,MAAM;AAAA,EACN,CAAC,UAAU,GAAG;AAAA,IACZ,KAAK,MAAM,kBAAkB,SAAS;AAAA,IACtC,UAAU;AAAA,EACZ;AAAA;AAEF;AACA,OAAO,eAAe,OAAK,WAAW,WAAW;AAAA,EAC/C,KAAK,MAAM,OAAK;AAClB,CAAC;AA7BE,IAAM,QAAN;AAyMP,kBAAkB,OAAO,IAAI;;;ACzN7B,SAAS,yBAAyB,mBAAAC,wBAAuB;AAoElD,IAAM,UAAN,MAAM,gBAA2B,YAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYrE,OAAO,GAAS,MAA6C;AA3F/D,QAAAC,KAAAC;AA4FI,WAAO,MAAM,kBAAiBA,MAAA,SAC3BD,MAAA,GAAG,OADwBC,KAAa;AAAA,MAApC;AAAA;AACL,aAACD,OAAY;AAAA;AAAA,IACf;AAAA,EACF;AAAA;AAAA,EAoBA,IAAI,UAEF;AACA,WAAQ,KAAK,YAA8B;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BA,IAAI,OAAsC;AACxC,QAAI,KAAK,UAAU,UAAU,WAAW;AACtC,aAAO,KAAK,KAAK,UAAU,EAAE;AAAA,IAC/B,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,IAAI,mBAAkD;AACpD,QAAI,KAAK,UAAU,UAAU,WAAW;AACtC,aAAO,KAAK,WAAW,KAAK,UAAU,SAAU;AAAA,IAClD,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,YACE,SAGA;AACA,UAAM;AAEN,QAAI,WAAW,aAAa,SAAS;AACnC,aAAO,iBAAiB,MAAM;AAAA,QAC5B,IAAI;AAAA,UACF,OAAO,QAAQ,QAAQ;AAAA,UACvB,YAAY;AAAA,QACd;AAAA,QACA,MAAM,EAAE,OAAO,QAAQ,SAAS,YAAY,MAAM;AAAA,MACpD,CAAC;AAAA,IACH;AAEA,WAAO,IAAI,MAAM,MAAM,oBAA0C;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,OAEL,MACA,SACA;AACA,UAAM,EAAE,MAAM,IAAI,0BAA0B,OAAO;AACnD,UAAM,WAAW,IAAI,KAAK,EAAE,MAAM,MAAM,CAAC;AACzC,UAAM,MAAM,MAAM,KAAK,aAAa;AAEpC,WAAO,iBAAiB,UAAU;AAAA,MAChC,IAAI;AAAA,QACF,OAAO,IAAI;AAAA,QACX,YAAY;AAAA,MACd;AAAA,MACA,MAAM,EAAE,OAAO,KAAK,YAAY,MAAM;AAAA,IACxC,CAAC;AAED,QAAI,MAAM;AACR,eAAS,KAAK,GAAG,IAAI;AAAA,IACvB;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,QAAQ,OAAe;AACrB,eAAW,QAAQ,OAAO;AACxB,WAAK,SAAS,IAAI;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,SAAS,MAAY;AAC3B,UAAM,iBAAiB,KAAK,QAAQ,QAAQ;AAE5C,QAAI,mBAAmB,QAAQ;AAC7B,WAAK,KAAK,KAAK,IAAiB;AAAA,IAClC,WAAW,aAAa,gBAAgB;AACtC,WAAK,KAAK,KAAK,eAAe,QAAQ,OAAO,IAAI,CAAC;AAAA,IACpD,WAAW,aAAa,cAAc,GAAG;AACvC,WAAK,KAAK,KAAM,KAA4B,EAAE;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAKE;AACA,UAAM,iBAAiB,KAAK,QAAQ,QAAQ;AAC5C,UAAM,SACJ,mBAAmB,SACf,CAAC,MAAe,IAChB,aAAa,iBACX,eAAe,QAAQ,SACvB,CAAC,MAAe,KAAM,EAAc;AAE5C,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,OAAO,KAAK;AAAA,MACZ,GAAG,OAAO;AAAA,QACR,OAAO,QAAQ,IAAI,EAAE,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM;AAAA,UAC7C;AAAA,UACA,OAAO,MAAM,KAAK;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,MACA,IAAI,OAAO;AAAA,QACT,OAAO,QAAQ,KAAK,UAAU,EAAE,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM;AAAA,UACxD;AAAA,UACA,OAAO,MAAM,KAAK;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,EAhMC,UAgMA,QAAO,IAKN;AACA,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA,EAGA,OAAO,OAGL,KACA;AACA,SAAK,YAAY,CAAC;AAClB,WAAO,OAAO,KAAK,SAAS,GAAG;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,KAEL,IACA,IACA,OAC6C;AAC7C,WAAO,YAAY,MAAM,IAAI,IAAI,KAAK;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,UAEL,IACA,IACA,OACA,UACY;AACZ,WAAO,mBAA6B,MAAM,IAAI,IAAI,OAAO,QAAQ;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAEE,OAC6C;AAC7C,WAAO,oBAAoB,MAAM,KAAK;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAEE,OACA,UACY;AACZ,WAAO,2BAA2B,MAAM,OAAO,QAAQ;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,SAET;AACD,WAAO,KAAK,KAAK,KAAK,YAAY,OAAO;AAAA,EAC3C;AACF;AA1RI,QAAK,UAAU,QAAQ;AAzBpB,IAAM,SAAN;AAyTP,SAAS,kBACP,YACA,UAMA,UACA,WACA,WACgC;AAChC,SAAO;AAAA,IACL,IAAI,QAEK;AACP,UAAI,cAAc,QAAQ;AACxB,eAAO,SAAS;AAAA,MAGlB,WAAW,aAAa,WAAW;AACjC,eAAO,UAAU,QAAQ,OAAO,SAAS,KAAK;AAAA,MAChD,WAAW,aAAa,SAAS,GAAG;AAClC,eAAO,KAAK,KAAK;AAAA,UACf;AAAA,UACA,SAAS,KAAK,SAAS,GAAG,YAAY,SAAS,GAAG,UAAU;AAAA,QAC9D;AAAA,MACF,OAAO;AACL,cAAM,IAAI,MAAM,2BAA2B;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,IAAI,MAEM;AACR,UAAI,cAAc,UAAU,aAAa,SAAS,GAAG;AACnD,cAAM,QAAQ,SAAS;AACvB,eAAO,IAAI;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,IAAI,KAAK;AACP,aACE,aACA,IAAI,IAAa,WAAqC,UAAU;AAAA,QAC9D,KAAK,kBAAkB,SAAS;AAAA,QAChC,UAAU;AAAA,MACZ,CAAC,GAAG;AAAA,QACF;AAAA,QACA,SAAS,KAAK,SAAS,GAAG,YAAY,SAAS,GAAG,UAAU;AAAA,MAC9D;AAAA,IAEJ;AAAA,IACA,QAAQ,SAAS;AAAA,IACjB,IAAI,SAAS;AAAA,EACf;AACF;AAMO,IAAM,uBAA6C;AAAA,EACxD,IAAI,QAAQ,KAAK,UAAU;AACzB,QAAI,OAAO,QAAQ,YAAY,IAAI,WAAW,KAAK,GAAG;AACpD,YAAM,WAAW,OAAO,KAAK,WAAW,GAAmB;AAE3D,UAAI,CAAC,SAAU;AACf,YAAM,QAAQ;AAAA,QACZ;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,OAAO,QAAQ,QAAQ;AAAA,MACzB;AAEA,aAAO,eAAe,OAAO,OAAO;AAAA,QAClC,KAAK,MAAM;AACT,gBAAM,gBAAgB,OAAO,KAAK,QAAQ,GAAmB;AAC7D,iBAAQ,aAAa;AACnB,mBAAO,MAAM;AACX,oBAAME,YAAW,cAAc,KAAK;AACpC,kBAAIA,UAAS,KAAM;AACnB,oBAAM;AAAA,gBACJ;AAAA,gBACAA,UAAS;AAAA,gBACT,OAAO;AAAA,gBACP;AAAA,gBACA,OAAO,QAAQ,QAAQ;AAAA,cACzB;AAAA,YACF;AAAA,UAEF,EAAG;AAAA,QACL;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT,WAAW,QAAQ,cAAc;AAC/B,aAAO,IAAI,MAAM,CAAC,GAAG,+BAA+B,QAAQ,QAAQ,CAAC;AAAA,IACvE,OAAO;AACL,aAAO,QAAQ,IAAI,QAAQ,KAAK,QAAQ;AAAA,IAC1C;AAAA,EACF;AAAA,EACA,IAAI,QAAQ,KAAK,OAAO,UAAU;AAChC,QAAI,QAAQ,YAAY,OAAO,UAAU,YAAY,cAAc,OAAO;AACxE,MAAC,OAAO,YAA8B,YAAY,CAAC;AACnD,MAAC,OAAO,YAA8B,QAAQ,QAAQ,IACpD,MAAM,UAAU;AAClB,aAAO;AAAA,IACT,OAAO;AACL,aAAO,QAAQ,IAAI,QAAQ,KAAK,OAAO,QAAQ;AAAA,IACjD;AAAA,EACF;AAAA,EACA,eAAe,QAAQ,KAAK,YAAY;AACtC,QACE,WAAW,SACX,QAAQ,YACR,OAAO,WAAW,UAAU,YAC5B,cAAc,WAAW,OACzB;AACA,MAAC,OAAO,YAA8B,YAAY,CAAC;AACnD,MAAC,OAAO,YAA8B,QAAQ,QAAQ,IACpD,WAAW,MAAM,UAAU;AAC7B,aAAO;AAAA,IACT,OAAO;AACL,aAAO,QAAQ,eAAe,QAAQ,KAAK,UAAU;AAAA,IACvD;AAAA,EACF;AAAA,EACA,QAAQ,QAAQ;AACd,UAAM,OAAO,QAAQ,QAAQ,MAAM;AAEnC,eAAW,aAAa,OAAO,KAAK,SAAS,GAAG;AAC9C,WAAK,KAAK,SAAS;AAAA,IACrB;AAEA,WAAO;AAAA,EACT;AAAA,EACA,yBAAyB,QAAQ,KAAK;AACpC,QAAI,OAAO,QAAQ,YAAY,IAAI,WAAW,KAAK,GAAG;AACpD,aAAO;AAAA,QACL,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,MACZ;AAAA,IACF,OAAO;AACL,aAAO,QAAQ,yBAAyB,QAAQ,GAAG;AAAA,IACrD;AAAA,EACF;AACF;AAMA,IAAM,iCAAiC,CACrC,aACA,gBACyC;AAAA,EACzC,IAAI,SAAS,KAAK,UAAU;AAC1B,QAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,SAAS,GAAG;AACtD,YAAM,YAAY;AAClB,YAAM,WAAW,YAAY,KAAK,WAAW,SAAS;AAEtD,UAAI,CAAC,SAAU;AACf,YAAM,KAAKC,iBAAgB,8BAA8B,SAAS;AAElE,YAAM,QAAQ;AAAA,QACZ;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZA,iBAAgB,YAAY,EAAE,IACzB,KACD;AAAA,QACJ,YAAY,QAAQ,QAAQ;AAAA,MAC9B;AAEA,aAAO,eAAe,OAAO,OAAO;AAAA,QAClC,KAAK,MAAM;AACT,gBAAM,gBAAgB,YAAY,KAAK,QAAQ,SAAS;AACxD,iBAAQ,aAAa;AACnB,mBAAO,MAAM;AACX,oBAAMD,YAAW,cAAc,KAAK;AACpC,kBAAIA,UAAS,KAAM;AACnB,oBAAM;AAAA,gBACJ;AAAA,gBACAA,UAAS;AAAA,gBACT,YAAY;AAAA,gBACZC,iBAAgB,YAAY,EAAE,IACzB,KACD;AAAA,gBACJ,YAAY,QAAQ,QAAQ;AAAA,cAC9B;AAAA,YACF;AAAA,UAEF,EAAG;AAAA,QACL;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT,OAAO;AACL,aAAO,QAAQ,IAAI,aAAa,KAAK,QAAQ;AAAA,IAC/C;AAAA,EACF;AAAA,EACA,UAAU;AACR,WAAO,YAAY,KAAK,SAAS;AAAA,EACnC;AAAA,EACA,yBAAyB,QAAQ,KAAK;AACpC,QAAI,OAAO,QAAQ,YAAY,IAAI,WAAW,KAAK,GAAG;AACpD,aAAO;AAAA,QACL,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,UAAU;AAAA,MACZ;AAAA,IACF,OAAO;AACL,aAAO,QAAQ,yBAAyB,QAAQ,GAAG;AAAA,IACrD;AAAA,EACF;AACF;AAqBO,IAAM,aAAN,cAAyB,YAA+B;AAAA,EAW7D,YACE,SAOA;AACA,UAAM;AAEN,QAAI;AAEJ,QAAI,aAAa,SAAS;AACxB,YAAM,QAAQ;AAAA,IAChB,OAAO;AACL,YAAM,WAAW,QAAQ,MAAM;AAC/B,YAAM,SAAS,mBAAmB;AAAA,IACpC;AAEA,WAAO,iBAAiB,MAAM;AAAA,MAC5B,IAAI;AAAA,QACF,OAAO,IAAI;AAAA,QACX,YAAY;AAAA,MACd;AAAA,MACA,OAAO,EAAE,OAAO,kBAAkB,YAAY,MAAM;AAAA,MACpD,MAAM,EAAE,OAAO,KAAK,YAAY,MAAM;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,OAEL,SACA;AACA,WAAO,IAAI,KAAK,0BAA0B,OAAO,CAAC;AAAA,EACpD;AAAA,EAEA,UAAU,SAII;AACZ,WAAO,KAAK,KAAK,gBAAgB,SAAS,eAAe;AAAA,EAC3D;AAAA,EAEA,sBAA+B;AAC7B,WAAO,KAAK,KAAK,oBAAoB;AAAA,EACvC;AAAA,EAEA,MAAM,SAAiC;AACrC,SAAK,KAAK,kBAAkB,OAAO;AAAA,EACrC;AAAA,EAEA,KAAK,MAAwB;AAC3B,SAAK,KAAK,sBAAsB,IAAI;AAAA,EACtC;AAAA,EAEA,MAAY;AACV,SAAK,KAAK,gBAAgB;AAAA,EAC5B;AAAA,EAEA,OAAO,SAA2D;AAChE,UAAM,SAAS,KAAK,UAAU;AAAA,MAC5B,iBAAiB,SAAS;AAAA,IAC5B,CAAC;AAED,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAGA,WAAO,IAAI,KAAK,OAAO,QAAQ,EAAE,MAAM,OAAO,SAAS,CAAC;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,WACX,IACA,IACA,SAG2B;AAC3B,QAAI,SAAS,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC;AAMvC,QAAI,CAAC,SAAS,mBAAmB,CAAC,QAAQ,oBAAoB,GAAG;AAC/D,eAAS,MAAM,IAAI,QAAoB,CAAC,YAAY;AAClD,2BAAmB,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,gBAAgB;AAC3D,cAAI,MAAM,oBAAoB,GAAG;AAC/B,wBAAY;AACZ,oBAAQ,KAAK;AAAA,UACf;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,WAAO,QAAQ,OAAO;AAAA,MACpB,iBAAiB,SAAS;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,aAAa,eACX,MACA,SAOqB;AACrB,UAAM,SAAS,KAAK,OAAO,OAAO;AAClC,UAAM,aAAa,gBAAgB,UAAU,QAAQ,aAAa;AAElE,UAAM,QAAQ,KAAK,IAAI;AAEvB,UAAM,OAAO,IAAI,WAAW,MAAM,KAAK,YAAY,CAAC;AACpD,WAAO,MAAM;AAAA,MACX,UAAU,KAAK;AAAA,MACf,gBAAgB,KAAK;AAAA,MACrB,UAAU,gBAAgB,OAAO,KAAK,OAAO;AAAA,IAC/C,CAAC;AACD,UAAM,YAAY;AAElB,QAAI,qBAAqB,KAAK,IAAI;AAElC,aAAS,MAAM,GAAG,MAAM,KAAK,QAAQ,OAAO,WAAW;AACrD,aAAO,KAAK,KAAK,MAAM,KAAK,MAAM,SAAS,CAAC;AAE5C,UAAI,KAAK,IAAI,IAAI,qBAAqB,KAAK;AACzC,qBAAa,MAAM,KAAK,MAAM;AAC9B,6BAAqB,KAAK,IAAI;AAAA,MAChC;AAEA,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,CAAC,CAAC;AAAA,IACvD;AACA,WAAO,IAAI;AACX,UAAM,MAAM,KAAK,IAAI;AAErB,YAAQ;AAAA,MACN;AAAA,OACC,MAAM,SAAS;AAAA,MAChB;AAAA,MACC,OAAQ,KAAK,QAAQ,MAAM,WAAY,OAAO;AAAA,IACjD;AACA,iBAAa,CAAC;AAEd,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAQE;AACA,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,OAAO,KAAK;AAAA,MACZ,GAAG,KAAK,UAAU;AAAA,IACpB;AAAA,EACF;AAAA;AAAA,EAGA,CAAC,OAAO,IAAI;AACV,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,KAEL,IACA,IACA,OAC6C;AAC7C,WAAO,YAAY,MAAM,IAAI,IAAI,KAAK;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,UAEL,IACA,IACA,OACA,UACY;AACZ,WAAO,mBAA6B,MAAM,IAAI,IAAI,OAAO,QAAQ;AAAA,EACnE;AAAA,EAEA,aAEE,OAC6C;AAC7C,WAAO,oBAAoB,MAAM,KAAK;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAEE,OACA,UACY;AACZ,WAAO,2BAA2B,MAAM,OAAO,QAAQ;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,SAAgC;AAC1C,WAAO,KAAK,KAAK,KAAK,YAAY,OAAO;AAAA,EAC3C;AACF;;;AC33BA,SAAS,cAAAC,mBAAkB;AAoDpB,IAAM,UAAN,MAAM,gBAA2B,MAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBrE,OAAO,GAAS,MAAiC;AArEnD,QAAAC,KAAAC;AAuEI,WAAO,MAAM,kBAAiBA,MAAA,SAC3BD,MAAA,GAAG,OADwBC,KAAa;AAAA,MAApC;AAAA;AACL,aAACD,OAAY;AAAA;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,MAAM,OAAqB;AAChC,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AAAA;AAAA,EAsBA,IAAI,UAEF;AACA,WAAQ,KAAK,YAA8B;AAAA,EAC7C;AAAA;AAAA,EAGA,IAAI,SAA0B;AAC5B,WAAO,KAAK,KAAK,iBAAiBE,cAC9B,kBAAkB,SAAS,EAAE,QAAQ,KAAK,KAAK,KAAK,IACpD,kBAAkB,OAAO,EAAE,QAAQ,KAAK,KAAK,KAAK;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,IAAI,QASF;AACA,WAAO;AAAA,MACL,CAAC,QAAQ,KAAK,KAAK,IAAI,GAAG;AAAA,MAC1B,MAAM,MAAM,KAAK,EAAE,QAAQ,KAAK,KAAK,QAAQ,EAAE,OAAO,GAAG,CAAC,GAAG,QAAQ,GAAG;AAAA,MACxE,KAAK;AAAA,MACL,CAAC,SAAS,KAAK,QAAQ,QAAQ;AAAA;AAAA,IAEjC;AAAA,EACF;AAAA,EAEA,IAAI,SAOF;AACA,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AAAA,EAEA,IAAI,YAAY;AACd,UAAM,aAAa,KAAK,KAAK,KAAK,KAAK;AAEvC,QAAI,sBAAsBA,aAAY;AACpC,aAAO,cAAc;AAAA,QAAI;AAAA,QAAY,MACnC,kBAAkB,SAAS,EAAE,QAAQ,UAAU;AAAA,MACjD;AAAA,IACF;AAEA,WAAO,IAAI,mBAAmB,KAAK,KAAK,KAAK,IAAI;AAAA,EACnD;AAAA,EAEA,aA5EC,UA4EW,OAAO,QAAO,IAAI;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,SAA6C;AACvD,UAAM;AAEN,WAAO,eAAe,MAAM,eAAe;AAAA,MACzC,OAAO,YAAY,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAAA,MACtD,YAAY;AAAA,IACd,CAAC;AAED,QAAI,WAAW,aAAa,SAAS;AACnC,aAAO,iBAAiB,MAAM;AAAA,QAC5B,IAAI;AAAA,UACF,OAAO,QAAQ,QAAQ;AAAA,UACvB,YAAY;AAAA,QACd;AAAA,QACA,MAAM,EAAE,OAAO,QAAQ,SAAS,YAAY,MAAM;AAAA,MACpD,CAAC;AAAA,IACH;AAEA,WAAO,IAAI,MAAM,MAAM,kBAAwC;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,OAAO,OAEL,OACA,SACA;AACA,UAAM,EAAE,MAAM,IAAI,0BAA0B,OAAO;AACnD,UAAM,WAAW,IAAI,KAAK,EAAE,MAAM,OAAO,MAAM,CAAC;AAChD,UAAM,MAAM,MAAM,KAAK;AAAA,MACrB,WAAW,OAAO,SAAS,QAAQ,QAAQ,CAAC;AAAA,IAC9C;AAEA,WAAO,iBAAiB,UAAU;AAAA,MAChC,IAAI;AAAA,QACF,OAAO,IAAI;AAAA,QACX,YAAY;AAAA,MACd;AAAA,MACA,MAAM,EAAE,OAAO,KAAK,YAAY,MAAM;AAAA,IACxC,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,OAAuB;AAC7B,SAAK,KAAK;AAAA,MACR,WAAW,OAAO,KAAK,QAAQ,QAAQ,CAAC;AAAA,MACxC;AAAA,MACA;AAAA,IACF;AAEA,WAAO,KAAK,KAAK,QAAQ,EAAE;AAAA,EAC7B;AAAA,EAEA,WAAW,OAAuB;AAChC,eAAW,QAAQ,WAAW,OAAiB,KAAK,QAAQ,QAAQ,CAAC,GAAG;AACtE,WAAK,KAAK,QAAQ,IAAI;AAAA,IACxB;AAEA,WAAO,KAAK,KAAK,QAAQ,EAAE;AAAA,EAC7B;AAAA,EAEA,MAAwB;AACtB,UAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AAEjC,SAAK,KAAK,OAAO,KAAK,SAAS,CAAC;AAEhC,WAAO;AAAA,EACT;AAAA,EAEA,QAA0B;AACxB,UAAM,QAAQ,KAAK,CAAC;AAEpB,SAAK,KAAK,OAAO,CAAC;AAElB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,OAAe,gBAAwB,OAAuB;AACnE,UAAM,UAAU,KAAK,MAAM,OAAO,QAAQ,WAAW;AAErD,aACM,cAAc,QAAQ,cAAc,GACxC,eAAe,OACf,eACA;AACA,WAAK,KAAK,OAAO,WAAW;AAAA,IAC9B;AAEA,QAAI,cAAc,KAAK,IAAI,QAAQ,GAAG,CAAC;AACvC,eAAW,QAAQ,WAAW,OAAiB,KAAK,QAAQ,QAAQ,CAAC,GAAG;AACtE,cAAQ,IAAI,KAAK,KAAK,QAAQ,GAAG,WAAW;AAC5C,WAAK,KAAK,OAAO,MAAM,WAAW;AAClC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,OAAO,MAAe,WAAkC;AACtD,UAAM,iBAAiB,KAAK,QAAQ,QAAQ;AAC5C,QAAI,mBAAmB,QAAQ;AAC7B,aAAO,KAAK,KAAK,QAAQ;AAAA,IAC3B,WAAW,aAAa,gBAAgB;AACtC,aAAO,KAAK,KAAK,QAAQ,EAAE,IAAI,CAAC,MAAM,eAAe,QAAQ,OAAO,CAAC,CAAC;AAAA,IACxE,WAAW,aAAa,cAAc,GAAG;AACvC,aAAO,KAAK;AAAA,QAAI,CAAC,MAAM,QACrB,WAAW,SAAU,MAAkB,EAAE,IACrC,EAAE,WAAY,KAAiB,GAAG,IACjC,MAA6B,OAAO,MAAM,IAAI;AAAA,UAC7C,GAAI,aAAa,CAAC;AAAA,UAClB,KAAK;AAAA,QACP,CAAC;AAAA,MACP;AAAA,IACF,OAAO;AACL,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,CAAC,OAAO,IAAI;AACV,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA;AAAA,EAGA,OAAO,QAEL,KACA;AACA,WAAO,IAAI,KAAK,EAAE,SAAS,IAAI,CAAC;AAAA,EAClC;AAAA;AAAA,EAGA,OAAO,OAGL,KACA;AACA,SAAK,YAAY,CAAC;AAClB,WAAO,OAAO,KAAK,SAAS,GAAG;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBA,OAAO,KAEL,IACA,IACA,OAC6C;AAC7C,WAAO,YAAY,MAAM,IAAI,IAAI,KAAK;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BA,OAAO,UAEL,IACA,IACA,OACA,UACY;AACZ,WAAO,mBAA6B,MAAM,IAAI,IAAI,OAAO,QAAQ;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAEE,OAC6C;AAC7C,WAAO,oBAAoB,MAAM,KAAK;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,UAEE,OACA,UACY;AACZ,WAAO,2BAA2B,MAAM,OAAO,QAAQ;AAAA,EACzD;AAAA;AAAA,EAGA,OACE,IACkB;AAClB,UAAM,SAAS,GAAG,QAAQ,KAAK,IAAI;AACnC,UAAM,oBAAoB,oBAAoB,IAAI,IAAI;AACtD,QAAI,mBAAmB;AACrB,0BAAoB,IAAI,QAAQ,iBAAiB;AAAA,IACnD;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,SAAgC;AAC1C,WAAO,KAAK,KAAK,KAAK,YAAY,OAAO;AAAA,EAC3C;AACF;AAlXI,QAAK,UAAU,QAAQ;AArCpB,IAAM,SAAN;AAyZP,SAAS,WAAiB,OAAe,gBAAwB;AAC/D,QAAM,WACJ,mBAAmB,SACd,QACD,aAAa,iBACX,OAAO,IAAI,CAAC,MAAM,eAAe,QAAQ,OAAO,CAAC,CAAC,IAClD,aAAa,cAAc,IACzB,OAAO,IAAI,CAAC,MAAO,EAAyB,EAAE,KAC7C,MAAM;AACL,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C,GAAG;AACb,SAAO;AACT;AAEA,IAAM,qBAA2C;AAAA,EAC/C,IAAI,QAAQ,KAAK,UAAU;AACzB,QAAI,OAAO,QAAQ,YAAY,CAAC,MAAM,CAAC,GAAG,GAAG;AAC3C,YAAM,iBAAiB,OAAO,QAAQ,QAAQ;AAC9C,YAAM,WAAW,OAAO,KAAK,IAAI,OAAO,GAAG,CAAC;AAC5C,UAAI,mBAAmB,QAAQ;AAC7B,eAAO;AAAA,MACT,WAAW,aAAa,gBAAgB;AACtC,eAAO,aAAa,SAChB,SACA,eAAe,QAAQ,OAAO,QAAQ;AAAA,MAC5C,WAAW,aAAa,cAAc,GAAG;AACvC,eAAO,aAAa,SAChB,SACA,IAAI;AAAA,UACF;AAAA,UACA,OAAO;AAAA,UACP;AAAA,QACF,EAAE,WAAW,UAAU,OAAO,GAAG,CAAC;AAAA,MACxC;AAAA,IACF,WAAW,QAAQ,UAAU;AAC3B,aAAO,OAAO,KAAK,QAAQ,EAAE;AAAA,IAC/B,OAAO;AACL,aAAO,QAAQ,IAAI,QAAQ,KAAK,QAAQ;AAAA,IAC1C;AAAA,EACF;AAAA,EACA,IAAI,QAAQ,KAAK,OAAO,UAAU;AAChC,QAAI,QAAQ,YAAY,OAAO,UAAU,YAAY,cAAc,OAAO;AACxE,MAAC,OAAO,YAA8B,YAAY,CAAC;AACnD,MAAC,OAAO,YAA8B,QAAQ,QAAQ,IACpD,MAAM,UAAU;AAClB,aAAO;AAAA,IACT;AACA,QAAI,OAAO,QAAQ,YAAY,CAAC,MAAM,CAAC,GAAG,GAAG;AAC3C,YAAM,iBAAiB,OAAO,QAAQ,QAAQ;AAC9C,UAAI;AACJ,UAAI,mBAAmB,QAAQ;AAC7B,mBAAW;AAAA,MACb,WAAW,aAAa,gBAAgB;AACtC,mBAAW,eAAe,QAAQ,OAAO,KAAK;AAAA,MAChD,WAAW,aAAa,cAAc,GAAG;AACvC,mBAAW,MAAM;AAAA,MACnB;AACA,aAAO,KAAK,QAAQ,OAAO,GAAG,GAAG,QAAQ;AACzC,aAAO;AAAA,IACT,OAAO;AACL,aAAO,QAAQ,IAAI,QAAQ,KAAK,OAAO,QAAQ;AAAA,IACjD;AAAA,EACF;AAAA,EACA,eAAe,QAAQ,KAAK,YAAY;AACtC,QACE,WAAW,SACX,QAAQ,YACR,OAAO,WAAW,UAAU,YAC5B,cAAc,WAAW,OACzB;AACA,MAAC,OAAO,YAA8B,YAAY,CAAC;AACnD,MAAC,OAAO,YAA8B,QAAQ,QAAQ,IACpD,WAAW,MAAM,UAAU;AAC7B,aAAO;AAAA,IACT,OAAO;AACL,aAAO,QAAQ,eAAe,QAAQ,KAAK,UAAU;AAAA,IACvD;AAAA,EACF;AAAA,EACA,IAAI,QAAQ,KAAK;AACf,QAAI,OAAO,QAAQ,YAAY,CAAC,MAAM,CAAC,GAAG,GAAG;AAC3C,aAAO,OAAO,GAAG,IAAI,OAAO,KAAK,QAAQ,EAAE;AAAA,IAC7C,OAAO;AACL,aAAO,QAAQ,IAAI,QAAQ,GAAG;AAAA,IAChC;AAAA,EACF;AACF;;;ACniBA;AAKO,IAAM,kBAAN,eAA8B,YAIlC,QAAG,OAJ+B,IAAM;AAAA,EAApC;AAAA;AACL,wBAAe,GAAG,KAAuB;AACzC,8BAAsB,GAAG;AAEzB,SAAC,MAAY,GAAG,IAAI,UAAU;AAAA;AAAA,EAG9B,oBAAoB,SAE+C;AACjE,QAAI,CAAC,oBAAoB,IAAI,IAAI,GAAG;AAClC,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc,OAAO,KAAK,IAAI,EAAE;AAAA,MACpC,CAAC,QACC,IAAI,MAAM,WAAW,MACpB,SAAS,aAAa,UACrB,OAAO,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,QAAQ;AAAA,IAC3C;AAEA,gBAAY,KAAK,CAAC,GAAG,MAAM;AACzB,YAAM,SAAS,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AACrC,YAAM,SAAS,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AACrC,aAAO,SAAS;AAAA,IAClB,CAAC;AAED,QAAI;AAEJ,eAAW,cAAc,aAAa;AACpC,UAAI,KAAK,UAAU,KAAK,KAAK,UAAU,GAAG,UAAU,GAAG;AACrD,qCAA6B;AAAA,MAC/B,OAAO;AACL,eACE,8BAA8B;AAAA,UAC5B,KAAK;AAAA,UACL,QAAQ,KAAK,0BAA0B;AAAA,QACzC;AAAA,MAEJ;AAAA,IACF;AACA,WACE,8BAA8B;AAAA,MAC5B,KAAK;AAAA,MACL,QAAQ,KAAK,0BAA0B;AAAA,IACzC;AAAA,EAEJ;AACF;;;ACbO,IAAe,cAAf,MAAe,qBAAoB,YAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCvE,OAAO,GACL,eACsC;AACtC,WAAO,MAAM,yBAAyB,aAAY;AAAA,MAChD,OAAgB,QAEd,KACG;AACH,cAAM,gBAAgB;AAAA,UACpB;AAAA,QACF;AACA,eAAO,cAAc,QAAQ,GAAG;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,QAAkD,KAAmB;AAC1E,UAAM,IAAI,MAAM,iBAAiB;AAAA,EACnC;AACF;","names":["RawAccount","key","account","RawAccount","ref","subscription","RawAccount","RawAccount","message","rawEdit","_a","_b","LocalNode","RawAccount","cojsonInternals","RawAccount","LocalNode","cojsonInternals","ref","ref","cojsonInternals","_a","_b","rawEntry","cojsonInternals","RawAccount","_a","_b","RawAccount"]}
|
package/dist/index.native.js
CHANGED
package/dist/index.web.js
CHANGED
package/dist/testing.js
CHANGED
package/package.json
CHANGED
package/src/coValues/account.ts
CHANGED
@@ -236,7 +236,7 @@ export class Account extends CoValueBase implements CoValue {
|
|
236
236
|
return this.toJSON();
|
237
237
|
}
|
238
238
|
|
239
|
-
async applyMigration(creationProps?: { name: string }) {
|
239
|
+
async applyMigration(creationProps?: { name: string; onboarding?: boolean }) {
|
240
240
|
if (creationProps) {
|
241
241
|
const profileGroup = RegisteredSchemas["Group"].create({ owner: this });
|
242
242
|
profileGroup.addMember("everyone", "reader");
|
@@ -30,7 +30,7 @@ export type AuthResult =
|
|
30
30
|
}
|
31
31
|
| {
|
32
32
|
type: "new";
|
33
|
-
creationProps: { name: string };
|
33
|
+
creationProps: { name: string; anonymous?: boolean };
|
34
34
|
initialSecret?: AgentSecret;
|
35
35
|
saveCredentials: (credentials: Credentials) => Promise<void>;
|
36
36
|
onSuccess: () => void;
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"sources":["../src/implementation/anonymousJazzAgent.ts","../src/coValues/interfaces.ts","../src/implementation/symbols.ts","../src/implementation/inspect.ts","../src/lib/cache.ts","../src/implementation/refs.ts","../src/implementation/schema.ts","../src/implementation/subscriptionScope.ts","../src/coValues/deepLoading.ts","../src/implementation/createContext.ts","../src/coValues/registeredSchemas.ts","../src/implementation/devtoolsFormatters.ts","../src/coValues/inbox.ts","../src/coValues/coMap.ts","../src/coValues/profile.ts","../src/coValues/account.ts","../src/coValues/group.ts","../src/coValues/coFeed.ts","../src/coValues/coList.ts","../src/coValues/extensions/imageDef.ts","../src/coValues/schemaUnion.ts"],"sourcesContent":["import { LocalNode } from \"cojson\";\n\nexport class AnonymousJazzAgent {\n _type = \"Anonymous\" as const;\n constructor(public node: LocalNode) {}\n}\n","import type {\n CoValueUniqueness,\n CojsonInternalTypes,\n RawCoValue,\n} from \"cojson\";\nimport { RawAccount } from \"cojson\";\nimport { AnonymousJazzAgent } from \"../implementation/anonymousJazzAgent.js\";\nimport type { DeeplyLoaded, DepthsIn } from \"../internal.js\";\nimport {\n Ref,\n SubscriptionScope,\n inspect,\n subscriptionsScopes,\n} from \"../internal.js\";\nimport { coValuesCache } from \"../lib/cache.js\";\nimport { type Account } from \"./account.js\";\nimport { fulfillsDepth } from \"./deepLoading.js\";\nimport { type Group } from \"./group.js\";\nimport { RegisteredSchemas } from \"./registeredSchemas.js\";\n\n/** @category Abstract interfaces */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface CoValueClass<Value extends CoValue = CoValue> {\n /** @ignore */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new (...args: any[]): Value;\n}\n\nexport interface CoValueFromRaw<V extends CoValue> {\n fromRaw(raw: V[\"_raw\"]): V;\n}\n\n/** @category Abstract interfaces */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface CoValue {\n /** @category Content */\n readonly id: ID<this>;\n /** @category Type Helpers */\n _type: string;\n /** @category Collaboration */\n _owner: Account | Group;\n /** @category Internals */\n _raw: RawCoValue;\n /** @internal */\n readonly _loadedAs: Account | AnonymousJazzAgent;\n /** @category Stringifying & Inspection */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toJSON(key?: string, seenAbove?: ID<CoValue>[]): any[] | object | string;\n /** @category Stringifying & Inspection */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [inspect](): any;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function isCoValue(value: any): value is CoValue {\n return value && value._type !== undefined;\n}\n\nexport function isCoValueClass<V extends CoValue>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any,\n): value is CoValueClass<V> & CoValueFromRaw<V> {\n return typeof value === \"function\" && value.fromRaw !== undefined;\n}\n\n/**\n * IDs are unique identifiers for `CoValue`s.\n * Can be used with a type argument to refer to a specific `CoValue` type.\n *\n * @example\n *\n * ```ts\n * type AccountID = ID<Account>;\n * ```\n *\n * @category CoValues\n */\nexport type ID<T> = CojsonInternalTypes.RawCoID & IDMarker<T>;\n\ntype IDMarker<out T> = { __type(_: never): T };\n\n/** @internal */\nexport class CoValueBase implements CoValue {\n declare id: ID<this>;\n declare _type: string;\n declare _raw: RawCoValue;\n /** @category Internals */\n declare _instanceID: string;\n\n get _owner(): Account | Group {\n const owner =\n this._raw.group instanceof RawAccount\n ? RegisteredSchemas[\"Account\"].fromRaw(this._raw.group)\n : RegisteredSchemas[\"Group\"].fromRaw(this._raw.group);\n\n const subScope = subscriptionsScopes.get(this);\n if (subScope) {\n subScope.onRefAccessedOrSet(this.id, owner.id);\n subscriptionsScopes.set(owner, subScope);\n }\n\n return owner;\n }\n\n /** @private */\n get _loadedAs() {\n const rawAccount = this._raw.core.node.account;\n\n if (rawAccount instanceof RawAccount) {\n return coValuesCache.get(rawAccount, () =>\n RegisteredSchemas[\"Account\"].fromRaw(rawAccount),\n );\n }\n\n return new AnonymousJazzAgent(this._raw.core.node);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor(..._args: any) {\n Object.defineProperty(this, \"_instanceID\", {\n value: `instance-${Math.random().toString(36).slice(2)}`,\n enumerable: false,\n });\n }\n\n /** @category Internals */\n static fromRaw<V extends CoValue>(this: CoValueClass<V>, raw: RawCoValue): V {\n return new this({ fromRaw: raw });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toJSON(): object | any[] | string {\n return {\n id: this.id,\n type: this._type,\n error: \"unknown CoValue class\",\n };\n }\n\n [inspect]() {\n return this.toJSON();\n }\n\n /** @category Type Helpers */\n castAs<Cl extends CoValueClass & CoValueFromRaw<CoValue>>(\n cl: Cl,\n ): InstanceType<Cl> {\n const casted = cl.fromRaw(this._raw) as InstanceType<Cl>;\n const subscriptionScope = subscriptionsScopes.get(this);\n if (subscriptionScope) {\n subscriptionsScopes.set(casted, subscriptionScope);\n }\n return casted;\n }\n}\n\nexport function loadCoValue<V extends CoValue, Depth>(\n cls: CoValueClass<V>,\n id: ID<V>,\n as: Account | AnonymousJazzAgent,\n depth: Depth & DepthsIn<V>,\n): Promise<DeeplyLoaded<V, Depth> | undefined> {\n return new Promise((resolve) => {\n subscribeToCoValue(\n cls,\n id,\n as,\n depth,\n (value, unsubscribe) => {\n resolve(value);\n unsubscribe();\n },\n () => {\n resolve(undefined);\n },\n );\n });\n}\n\nexport function ensureCoValueLoaded<V extends CoValue, Depth>(\n existing: V,\n depth: Depth & DepthsIn<V>,\n): Promise<DeeplyLoaded<V, Depth> | undefined> {\n return loadCoValue(\n existing.constructor as CoValueClass<V>,\n existing.id,\n existing._loadedAs,\n depth,\n );\n}\n\nexport function subscribeToCoValue<V extends CoValue, Depth>(\n cls: CoValueClass<V>,\n id: ID<V>,\n as: Account | AnonymousJazzAgent,\n depth: Depth & DepthsIn<V>,\n listener: (value: DeeplyLoaded<V, Depth>, unsubscribe: () => void) => void,\n onUnavailable?: () => void,\n syncResolution?: boolean,\n): () => void {\n const ref = new Ref(id, as, { ref: cls, optional: false });\n\n let unsubscribed = false;\n let unsubscribe: (() => void) | undefined;\n\n function subscribe(value: V | undefined) {\n if (!value) {\n onUnavailable && onUnavailable();\n return;\n }\n if (unsubscribed) return;\n const subscription = new SubscriptionScope(\n value,\n cls as CoValueClass<V> & CoValueFromRaw<V>,\n (update, subscription) => {\n if (fulfillsDepth(depth, update)) {\n listener(\n update as DeeplyLoaded<V, Depth>,\n subscription.unsubscribeAll,\n );\n }\n },\n );\n\n unsubscribe = subscription.unsubscribeAll;\n }\n\n const sync = syncResolution ? ref.syncLoad() : undefined;\n\n if (sync) {\n subscribe(sync);\n } else {\n ref\n .load()\n .then((value) => subscribe(value))\n .catch((e) => {\n console.error(\"Failed to load / subscribe to CoValue\", e);\n });\n }\n\n return function unsubscribeAtAnyPoint() {\n unsubscribed = true;\n unsubscribe && unsubscribe();\n };\n}\n\nexport function createCoValueObservable<V extends CoValue, Depth>(options?: {\n syncResolution?: boolean;\n}) {\n let currentValue: DeeplyLoaded<V, Depth> | undefined = undefined;\n let subscriberCount = 0;\n\n function subscribe(\n cls: CoValueClass<V>,\n id: ID<V>,\n as: Account | AnonymousJazzAgent,\n depth: Depth & DepthsIn<V>,\n listener: () => void,\n onUnavailable?: () => void,\n ) {\n subscriberCount++;\n\n const unsubscribe = subscribeToCoValue(\n cls,\n id,\n as,\n depth,\n (value) => {\n currentValue = value;\n listener();\n },\n onUnavailable,\n options?.syncResolution,\n );\n\n return () => {\n unsubscribe();\n subscriberCount--;\n if (subscriberCount === 0) {\n currentValue = undefined;\n }\n };\n }\n\n const observable = {\n getCurrentValue: () => currentValue,\n subscribe,\n };\n\n return observable;\n}\n\nexport function subscribeToExistingCoValue<V extends CoValue, Depth>(\n existing: V,\n depth: Depth & DepthsIn<V>,\n listener: (value: DeeplyLoaded<V, Depth>) => void,\n): () => void {\n return subscribeToCoValue(\n existing.constructor as CoValueClass<V>,\n existing.id,\n existing._loadedAs,\n depth,\n listener,\n );\n}\n\nexport function parseCoValueCreateOptions(\n options:\n | {\n owner: Account | Group;\n unique?: CoValueUniqueness[\"uniqueness\"];\n }\n | Account\n | Group,\n) {\n return \"_type\" in options &&\n (options._type === \"Account\" || options._type === \"Group\")\n ? { owner: options, uniqueness: undefined }\n : {\n owner: options.owner,\n uniqueness: options.unique ? { uniqueness: options.unique } : undefined,\n };\n}\n","export const SchemaInit = Symbol.for(\"SchemaInit\");\nexport type SchemaInit = typeof SchemaInit;\n\nexport const ItemsSym = Symbol.for(\"items\");\nexport type ItemsSym = typeof ItemsSym;\n\nexport const MembersSym = Symbol.for(\"members\");\nexport type MembersSym = typeof MembersSym;\n","export const inspect = Symbol.for(\"nodejs.util.inspect.custom\");\nexport type inspect = typeof inspect;\n","import { RawCoValue } from \"cojson\";\nimport { CoValue } from \"../internal.js\";\n\nconst weakMap = new WeakMap<RawCoValue, CoValue>();\n\nexport const coValuesCache = {\n get: <V extends CoValue>(raw: RawCoValue, compute: () => V) => {\n const cached = weakMap.get(raw);\n if (cached) {\n return cached as V;\n }\n const computed = compute();\n weakMap.set(raw, computed);\n return computed;\n },\n};\n","import type { CoID, RawCoValue } from \"cojson\";\nimport { type Account } from \"../coValues/account.js\";\nimport type {\n AnonymousJazzAgent,\n CoValue,\n ID,\n RefEncoded,\n UnCo,\n} from \"../internal.js\";\nimport {\n instantiateRefEncoded,\n isRefEncoded,\n subscriptionsScopes,\n} from \"../internal.js\";\nimport { coValuesCache } from \"../lib/cache.js\";\n\nconst TRACE_ACCESSES = false;\n\nexport class Ref<out V extends CoValue> {\n constructor(\n readonly id: ID<V>,\n readonly controlledAccount: Account | AnonymousJazzAgent,\n readonly schema: RefEncoded<V>,\n ) {\n if (!isRefEncoded(schema)) {\n throw new Error(\"Ref must be constructed with a ref schema\");\n }\n }\n\n get value() {\n const node =\n \"node\" in this.controlledAccount\n ? this.controlledAccount.node\n : this.controlledAccount._raw.core.node;\n const raw = node.getLoaded(this.id as unknown as CoID<RawCoValue>);\n if (raw) {\n return coValuesCache.get(raw, () =>\n instantiateRefEncoded(this.schema, raw),\n );\n } else {\n return null;\n }\n }\n\n private async loadHelper(): Promise<V | \"unavailable\"> {\n const node =\n \"node\" in this.controlledAccount\n ? this.controlledAccount.node\n : this.controlledAccount._raw.core.node;\n const raw = await node.load(this.id as unknown as CoID<RawCoValue>);\n if (raw === \"unavailable\") {\n return \"unavailable\";\n } else {\n return new Ref(this.id, this.controlledAccount, this.schema).value!;\n }\n }\n\n syncLoad(): V | undefined {\n const node =\n \"node\" in this.controlledAccount\n ? this.controlledAccount.node\n : this.controlledAccount._raw.core.node;\n\n const entry = node.coValuesStore.get(\n this.id as unknown as CoID<RawCoValue>,\n );\n\n if (entry.state.type === \"available\") {\n return new Ref(this.id, this.controlledAccount, this.schema).value!;\n }\n\n return undefined;\n }\n\n async load(): Promise<V | undefined> {\n const result = await this.loadHelper();\n if (result === \"unavailable\") {\n return undefined;\n } else {\n return result;\n }\n }\n\n accessFrom(fromScopeValue: CoValue, key: string | number | symbol): V | null {\n const subScope = subscriptionsScopes.get(fromScopeValue);\n\n subScope?.onRefAccessedOrSet(fromScopeValue.id, this.id);\n TRACE_ACCESSES &&\n console.log(subScope?.scopeID, \"accessing\", fromScopeValue, key, this.id);\n\n if (this.value && subScope) {\n subscriptionsScopes.set(this.value, subScope);\n }\n\n if (subScope) {\n const cached = subScope.cachedValues[this.id];\n if (cached) {\n TRACE_ACCESSES && console.log(\"cached\", cached);\n return cached as V;\n } else if (this.value !== null) {\n const freshValueInstance = instantiateRefEncoded(\n this.schema,\n this.value?._raw,\n );\n TRACE_ACCESSES && console.log(\"freshValueInstance\", freshValueInstance);\n subScope.cachedValues[this.id] = freshValueInstance;\n subscriptionsScopes.set(freshValueInstance, subScope);\n return freshValueInstance as V;\n } else {\n return null;\n }\n } else {\n return this.value;\n }\n }\n}\n\nexport function makeRefs<Keys extends string | number>(\n getIdForKey: (key: Keys) => ID<CoValue> | undefined,\n getKeysWithIds: () => Keys[],\n controlledAccount: Account | AnonymousJazzAgent,\n refSchemaForKey: (key: Keys) => RefEncoded<CoValue>,\n): { [K in Keys]: Ref<CoValue> } & {\n [Symbol.iterator]: () => IterableIterator<Ref<CoValue>>;\n length: number;\n} {\n const refs = {} as { [K in Keys]: Ref<CoValue> } & {\n [Symbol.iterator]: () => IterableIterator<Ref<CoValue>>;\n length: number;\n };\n return new Proxy(refs, {\n get(_target, key) {\n if (key === Symbol.iterator) {\n return function* () {\n for (const key of getKeysWithIds()) {\n yield new Ref(\n getIdForKey(key)!,\n controlledAccount,\n refSchemaForKey(key),\n );\n }\n };\n }\n if (typeof key === \"symbol\") return undefined;\n if (key === \"length\") {\n return getKeysWithIds().length;\n }\n const id = getIdForKey(key as Keys);\n if (!id) return undefined;\n return new Ref(\n id as ID<CoValue>,\n controlledAccount,\n refSchemaForKey(key as Keys),\n );\n },\n ownKeys() {\n return getKeysWithIds().map((key) => key.toString());\n },\n getOwnPropertyDescriptor(target, key) {\n const id = getIdForKey(key as Keys);\n if (id) {\n return {\n enumerable: true,\n configurable: true,\n writable: true,\n };\n } else {\n return Reflect.getOwnPropertyDescriptor(target, key);\n }\n },\n });\n}\n\nexport type RefIfCoValue<V> = NonNullable<V> extends CoValue\n ? Ref<UnCo<NonNullable<V>>>\n : never;\n","import type { JsonValue, RawCoValue } from \"cojson\";\nimport { CoJsonValue } from \"cojson/src/jsonValue.js\";\nimport {\n type CoValue,\n type CoValueClass,\n CoValueFromRaw,\n ItemsSym,\n MembersSym,\n SchemaInit,\n isCoValueClass,\n} from \"../internal.js\";\n\n/** @category Schema definition */\nexport const Encoders = {\n Date: {\n encode: (value: Date) => value.toISOString(),\n decode: (value: JsonValue) => new Date(value as string),\n },\n};\n\nexport type CoMarker = { readonly __co: unique symbol };\n/** @category Schema definition */\nexport type co<T> = T | (T & CoMarker);\nexport type IfCo<C, R> = C extends infer _A | infer B\n ? B extends CoMarker\n ? R\n : never\n : never;\nexport type UnCo<T> = T extends co<infer A> ? A : T;\n\nconst optional = {\n ref: optionalRef,\n json<T extends CoJsonValue<T>>(): co<T | undefined> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { [SchemaInit]: \"json\" satisfies Schema } as any;\n },\n encoded<T>(arg: OptionalEncoder<T>): co<T | undefined> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { [SchemaInit]: { encoded: arg } satisfies Schema } as any;\n },\n string: {\n [SchemaInit]: \"json\" satisfies Schema,\n } as unknown as co<string | undefined>,\n number: {\n [SchemaInit]: \"json\" satisfies Schema,\n } as unknown as co<number | undefined>,\n boolean: {\n [SchemaInit]: \"json\" satisfies Schema,\n } as unknown as co<boolean | undefined>,\n null: {\n [SchemaInit]: \"json\" satisfies Schema,\n } as unknown as co<null | undefined>,\n Date: {\n [SchemaInit]: { encoded: Encoders.Date } satisfies Schema,\n } as unknown as co<Date | undefined>,\n literal<T extends (string | number | boolean)[]>(\n ..._lit: T\n ): co<T[number] | undefined> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { [SchemaInit]: \"json\" satisfies Schema } as any;\n },\n};\n\n/** @category Schema definition */\nexport const co = {\n string: {\n [SchemaInit]: \"json\" satisfies Schema,\n } as unknown as co<string>,\n number: {\n [SchemaInit]: \"json\" satisfies Schema,\n } as unknown as co<number>,\n boolean: {\n [SchemaInit]: \"json\" satisfies Schema,\n } as unknown as co<boolean>,\n null: {\n [SchemaInit]: \"json\" satisfies Schema,\n } as unknown as co<null>,\n Date: {\n [SchemaInit]: { encoded: Encoders.Date } satisfies Schema,\n } as unknown as co<Date>,\n literal<T extends (string | number | boolean)[]>(..._lit: T): co<T[number]> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { [SchemaInit]: \"json\" satisfies Schema } as any;\n },\n json<T extends CoJsonValue<T>>(): co<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { [SchemaInit]: \"json\" satisfies Schema } as any;\n },\n encoded<T>(arg: Encoder<T>): co<T> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return { [SchemaInit]: { encoded: arg } satisfies Schema } as any;\n },\n ref,\n items: ItemsSym as ItemsSym,\n members: MembersSym as MembersSym,\n optional,\n};\n\nfunction optionalRef<C extends CoValueClass>(\n arg: C | ((_raw: InstanceType<C>[\"_raw\"]) => C),\n): co<InstanceType<C> | null | undefined> {\n return ref(arg, { optional: true });\n}\n\nfunction ref<C extends CoValueClass>(\n arg: C | ((_raw: InstanceType<C>[\"_raw\"]) => C),\n options?: never,\n): co<InstanceType<C> | null>;\nfunction ref<C extends CoValueClass>(\n arg: C | ((_raw: InstanceType<C>[\"_raw\"]) => C),\n options: { optional: true },\n): co<InstanceType<C> | null | undefined>;\nfunction ref<\n C extends CoValueClass,\n Options extends { optional?: boolean } | undefined,\n>(\n arg: C | ((_raw: InstanceType<C>[\"_raw\"]) => C),\n options?: Options,\n): Options extends { optional: true }\n ? co<InstanceType<C> | null | undefined>\n : co<InstanceType<C> | null> {\n return {\n [SchemaInit]: {\n ref: arg,\n optional: options?.optional || false,\n } satisfies Schema,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any;\n}\n\nexport type JsonEncoded = \"json\";\nexport type EncodedAs<V> = { encoded: Encoder<V> | OptionalEncoder<V> };\nexport type RefEncoded<V extends CoValue> = {\n ref: CoValueClass<V> | ((raw: RawCoValue) => CoValueClass<V>);\n optional: boolean;\n};\n\nexport function isRefEncoded<V extends CoValue>(\n schema: Schema,\n): schema is RefEncoded<V> {\n return (\n typeof schema === \"object\" &&\n \"ref\" in schema &&\n \"optional\" in schema &&\n typeof schema.ref === \"function\"\n );\n}\n\nexport function instantiateRefEncoded<V extends CoValue>(\n schema: RefEncoded<V>,\n raw: RawCoValue,\n): V {\n return isCoValueClass<V>(schema.ref)\n ? schema.ref.fromRaw(raw)\n : (schema.ref as (raw: RawCoValue) => CoValueClass<V> & CoValueFromRaw<V>)(\n raw,\n ).fromRaw(raw);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type Schema = JsonEncoded | RefEncoded<CoValue> | EncodedAs<any>;\n\nexport type SchemaFor<Field> = NonNullable<Field> extends CoValue\n ? RefEncoded<NonNullable<Field>>\n : NonNullable<Field> extends JsonValue\n ? JsonEncoded\n : EncodedAs<NonNullable<Field>>;\n\nexport type Encoder<V> = {\n encode: (value: V) => JsonValue;\n decode: (value: JsonValue) => V;\n};\nexport type OptionalEncoder<V> =\n | Encoder<V>\n | {\n encode: (value: V | undefined) => JsonValue;\n decode: (value: JsonValue) => V | undefined;\n };\n","import type { RawCoValue } from \"cojson\";\nimport { type Account } from \"../coValues/account.js\";\nimport type {\n AnonymousJazzAgent,\n CoValue,\n CoValueClass,\n CoValueFromRaw,\n ID,\n} from \"../internal.js\";\n\nexport const subscriptionsScopes = new WeakMap<\n CoValue,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n SubscriptionScope<any>\n>();\n\nconst TRACE_INVALIDATIONS = false;\n\nexport class SubscriptionScope<Root extends CoValue> {\n scopeID: string = `scope-${Math.random().toString(36).slice(2)}`;\n subscriber: Account | AnonymousJazzAgent;\n entries = new Map<\n ID<CoValue>,\n | { state: \"loading\"; immediatelyUnsub?: boolean }\n | { state: \"loaded\"; rawUnsub: () => void }\n >();\n rootEntry: {\n state: \"loaded\";\n value: RawCoValue;\n rawUnsub: () => void;\n };\n scheduleUpdate: () => void;\n scheduledUpdate: boolean = false;\n cachedValues: { [id: ID<CoValue>]: CoValue } = {};\n parents: { [id: ID<CoValue>]: Set<ID<CoValue>> } = {};\n\n constructor(\n root: Root,\n rootSchema: CoValueClass<Root> & CoValueFromRaw<Root>,\n onUpdate: (newRoot: Root, scope: SubscriptionScope<Root>) => void,\n ) {\n this.rootEntry = {\n state: \"loaded\" as const,\n value: root._raw,\n rawUnsub: () => {}, // placeholder\n };\n this.entries.set(root.id, this.rootEntry);\n\n subscriptionsScopes.set(root, this);\n\n this.subscriber = root._loadedAs;\n this.scheduleUpdate = () => {\n const value = rootSchema.fromRaw(this.rootEntry.value) as Root;\n subscriptionsScopes.set(value, this);\n onUpdate(value, this);\n };\n\n this.rootEntry.rawUnsub = root._raw.core.subscribe(\n (rawUpdate: RawCoValue | undefined) => {\n if (!rawUpdate) return;\n this.rootEntry.value = rawUpdate;\n this.scheduleUpdate();\n },\n );\n }\n\n onRefAccessedOrSet(\n fromId: ID<CoValue>,\n accessedOrSetId: ID<CoValue> | undefined,\n ) {\n // console.log(\"onRefAccessedOrSet\", this.scopeID, accessedOrSetId);\n if (!accessedOrSetId) {\n return;\n }\n\n this.parents[accessedOrSetId] = this.parents[accessedOrSetId] || new Set();\n this.parents[accessedOrSetId]!.add(fromId);\n\n if (!this.entries.has(accessedOrSetId)) {\n const loadingEntry = {\n state: \"loading\",\n immediatelyUnsub: false,\n } as const;\n this.entries.set(accessedOrSetId, loadingEntry);\n const node =\n this.subscriber._type === \"Account\"\n ? this.subscriber._raw.core.node\n : this.subscriber.node;\n void node.loadCoValueCore(accessedOrSetId).then((core) => {\n if (loadingEntry.state === \"loading\" && loadingEntry.immediatelyUnsub) {\n return;\n }\n if (core !== \"unavailable\") {\n const entry = {\n state: \"loaded\" as const,\n rawUnsub: () => {}, // placeholder\n };\n this.entries.set(accessedOrSetId, entry);\n\n const rawUnsub = core.subscribe((rawUpdate) => {\n // console.log(\"ref update\", this.scopeID, accessedOrSetId, JSON.stringify(rawUpdate))\n if (!rawUpdate) return;\n this.invalidate(accessedOrSetId);\n this.scheduleUpdate();\n });\n\n entry.rawUnsub = rawUnsub;\n }\n });\n }\n }\n\n invalidate(\n id: ID<CoValue>,\n fromChild?: ID<CoValue>,\n seen: Set<ID<CoValue>> = new Set(),\n ) {\n if (seen.has(id)) return;\n TRACE_INVALIDATIONS &&\n console.log(\"invalidating\", fromChild, \"->\", id, this.cachedValues[id]);\n delete this.cachedValues[id];\n seen.add(id);\n for (const parent of this.parents[id] || []) {\n this.invalidate(parent, id, seen);\n }\n }\n\n unsubscribeAll = () => {\n for (const entry of this.entries.values()) {\n if (entry.state === \"loaded\") {\n entry.rawUnsub();\n } else {\n entry.immediatelyUnsub = true;\n }\n }\n this.entries.clear();\n };\n}\n","import { SessionID } from \"cojson\";\nimport { ItemsSym, type Ref, RefEncoded, UnCo } from \"../internal.js\";\nimport { type Account } from \"./account.js\";\nimport { type CoFeed, CoFeedEntry } from \"./coFeed.js\";\nimport { type CoList } from \"./coList.js\";\nimport { type CoKeys, type CoMap } from \"./coMap.js\";\nimport { type CoValue, type ID } from \"./interfaces.js\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function fulfillsDepth(depth: any, value: CoValue): boolean {\n if (\n value._type === \"CoMap\" ||\n value._type === \"Group\" ||\n value._type === \"Account\"\n ) {\n if (Array.isArray(depth) && depth.length === 1) {\n return Object.entries(value).every(([key, item]) => {\n return (\n value as unknown as {\n _refs: { [key: string]: Ref<CoValue> | undefined };\n }\n )._refs[key]\n ? item && fulfillsDepth(depth[0], item)\n : ((value as CoMap)._schema[ItemsSym] as RefEncoded<CoValue>)!\n .optional;\n });\n } else {\n for (const key of Object.keys(depth)) {\n const map = value as unknown as {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n _refs: { [key: string]: Ref<CoValue> | undefined };\n };\n if (!map._refs[key] && map._schema[key].optional) {\n continue;\n }\n if (!map[key]) {\n return false;\n }\n if (!fulfillsDepth(depth[key], map[key])) {\n return false;\n }\n }\n return true;\n }\n } else if (value._type === \"CoList\") {\n if (depth.length === 0) {\n return true;\n } else {\n const itemDepth = depth[0];\n return (value as CoList).every((item, i) =>\n (value as CoList)._refs[i]\n ? item && fulfillsDepth(itemDepth, item)\n : ((value as CoList)._schema[ItemsSym] as RefEncoded<CoValue>)\n .optional,\n );\n }\n } else if (value._type === \"CoStream\") {\n if (depth.length === 0) {\n return true;\n } else {\n const itemDepth = depth[0];\n return Object.values((value as CoFeed).perSession).every((entry) =>\n entry.ref\n ? entry.value && fulfillsDepth(itemDepth, entry.value)\n : ((value as CoFeed)._schema[ItemsSym] as RefEncoded<CoValue>)\n .optional,\n );\n }\n } else if (value._type === \"BinaryCoStream\") {\n return true;\n } else {\n console.error(value);\n throw new Error(\"Unexpected value type: \" + value._type);\n }\n}\n\ntype UnCoNotNull<T> = UnCo<Exclude<T, null>>;\ntype Clean<T> = UnCo<NonNullable<T>>;\n\nexport type DepthsIn<\n V,\n DepthLimit extends number = 5,\n CurrentDepth extends number[] = [],\n> =\n | (DepthLimit extends CurrentDepth[\"length\"]\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any\n any\n : // Basically V extends CoList - but if we used that we'd introduce circularity into the definition of CoList itself\n V extends Array<infer Item>\n ?\n | [DepthsIn<UnCoNotNull<Item>, DepthLimit, [0, ...CurrentDepth]>]\n | never[]\n : // Basically V extends CoMap | Group | Account - but if we used that we'd introduce circularity into the definition of CoMap itself\n V extends { _type: \"CoMap\" | \"Group\" | \"Account\" }\n ?\n | {\n [Key in CoKeys<V> as Clean<V[Key]> extends CoValue\n ? Key\n : never]?: DepthsIn<\n Clean<V[Key]>,\n DepthLimit,\n [0, ...CurrentDepth]\n >;\n }\n | (ItemsSym extends keyof V\n ? [\n DepthsIn<\n Clean<V[ItemsSym]>,\n DepthLimit,\n [0, ...CurrentDepth]\n >,\n ]\n : never)\n | never[]\n : V extends {\n _type: \"CoStream\";\n byMe: CoFeedEntry<infer Item> | undefined;\n }\n ?\n | [\n DepthsIn<\n UnCoNotNull<Item>,\n DepthLimit,\n [0, ...CurrentDepth]\n >,\n ]\n | never[]\n : never[])\n | never[];\n\nexport type DeeplyLoaded<\n V,\n Depth,\n DepthLimit extends number = 5,\n CurrentDepth extends number[] = [],\n> = DepthLimit extends CurrentDepth[\"length\"]\n ? V\n : // Basically V extends CoList - but if we used that we'd introduce circularity into the definition of CoList itself\n [V] extends [Array<infer Item>]\n ? Depth extends never[] // []\n ? V\n : UnCoNotNull<Item> extends CoValue\n ? Depth extends Array<infer ItemDepth> // [item-depth]\n ? (UnCoNotNull<Item> &\n DeeplyLoaded<\n UnCoNotNull<Item>,\n ItemDepth,\n DepthLimit,\n [0, ...CurrentDepth]\n >)[] &\n V\n : never\n : V\n : // Basically V extends CoMap | Group | Account - but if we used that we'd introduce circularity into the definition of CoMap itself\n [V] extends [{ _type: \"CoMap\" | \"Group\" | \"Account\" }]\n ? Depth extends never[]\n ? V\n : Depth extends Array<infer ItemDepth>\n ? ItemsSym extends keyof V\n ? V & {\n [key: string]: DeeplyLoaded<\n Clean<V[ItemsSym]>,\n ItemDepth,\n DepthLimit,\n [0, ...CurrentDepth]\n >;\n }\n : never\n : keyof Depth extends never\n ? V\n : {\n [Key in keyof Depth]-?: Key extends CoKeys<V>\n ? Clean<V[Key]> extends CoValue\n ?\n | DeeplyLoaded<\n Clean<V[Key]>,\n Depth[Key],\n DepthLimit,\n [0, ...CurrentDepth]\n >\n | (undefined extends V[Key] ? undefined : never)\n : never\n : never;\n } & V\n : [V] extends [\n {\n _type: \"CoStream\";\n byMe: CoFeedEntry<infer Item> | undefined;\n },\n ]\n ? Depth extends never[]\n ? V\n : V & {\n byMe?: { value: UnCoNotNull<Item> };\n inCurrentSession?: { value: UnCoNotNull<Item> };\n perSession: {\n [key: SessionID]: { value: UnCoNotNull<Item> };\n };\n } & { [key: ID<Account>]: { value: UnCoNotNull<Item> } }\n : [V] extends [\n {\n _type: \"BinaryCoStream\";\n },\n ]\n ? V\n : never;\n","import {\n AgentSecret,\n CoID,\n ControlledAgent,\n CryptoProvider,\n LocalNode,\n Peer,\n RawAccount,\n RawAccountID,\n SessionID,\n} from \"cojson\";\nimport { type Account, type AccountClass } from \"../coValues/account.js\";\nimport { RegisteredSchemas } from \"../coValues/registeredSchemas.js\";\nimport type { ID } from \"../internal.js\";\nimport { AnonymousJazzAgent } from \"./anonymousJazzAgent.js\";\n\nexport type Credentials = {\n accountID: ID<Account>;\n secret: AgentSecret;\n};\n\nexport type AuthResult =\n | {\n type: \"existing\";\n credentials: Credentials;\n saveCredentials?: (credentials: Credentials) => Promise<void>;\n onSuccess: () => void;\n onError: (error: string | Error) => void;\n logOut: () => void;\n }\n | {\n type: \"new\";\n creationProps: { name: string };\n initialSecret?: AgentSecret;\n saveCredentials: (credentials: Credentials) => Promise<void>;\n onSuccess: () => void;\n onError: (error: string | Error) => void;\n logOut: () => void;\n };\n\nexport interface AuthMethod {\n start(crypto: CryptoProvider): Promise<AuthResult>;\n}\n\nexport const fixedCredentialsAuth = (credentials: {\n accountID: ID<Account>;\n secret: AgentSecret;\n}): AuthMethod => {\n return {\n start: async () => ({\n type: \"existing\",\n credentials,\n saveCredentials: async () => {},\n onSuccess: () => {},\n onError: () => {},\n logOut: () => {},\n }),\n };\n};\n\nexport const ephemeralCredentialsAuth = (): AuthMethod => {\n return {\n start: async () => ({\n type: \"new\",\n creationProps: { name: \"Ephemeral\" },\n saveCredentials: async () => {},\n onSuccess: () => {},\n onError: () => {},\n logOut: () => {},\n }),\n };\n};\n\nexport async function randomSessionProvider(\n accountID: ID<Account>,\n crypto: CryptoProvider,\n) {\n return {\n sessionID: crypto.newRandomSessionID(accountID as unknown as RawAccountID),\n sessionDone: () => {},\n };\n}\n\ntype ContextParamsWithAuth<Acc extends Account> = {\n AccountSchema?: AccountClass<Acc>;\n auth: AuthMethod;\n sessionProvider: (\n accountID: ID<Account>,\n crypto: CryptoProvider,\n ) => Promise<{ sessionID: SessionID; sessionDone: () => void }>;\n} & BaseContextParams;\n\ntype BaseContextParams = {\n peersToLoadFrom: Peer[];\n crypto: CryptoProvider;\n};\n\nexport type JazzContextWithAccount<Acc extends Account> = {\n account: Acc;\n done: () => void;\n logOut: () => void;\n};\n\nexport type JazzContextWithAgent = {\n agent: AnonymousJazzAgent;\n done: () => void;\n logOut: () => void;\n};\n\nexport type JazzContext<Acc extends Account> =\n | JazzContextWithAccount<Acc>\n | JazzContextWithAgent;\n\nexport async function createJazzContext<Acc extends Account>({\n AccountSchema,\n auth,\n sessionProvider,\n peersToLoadFrom,\n crypto,\n}: ContextParamsWithAuth<Acc>): Promise<JazzContextWithAccount<Acc>>;\nexport async function createJazzContext({\n peersToLoadFrom,\n crypto,\n}: BaseContextParams): Promise<JazzContextWithAgent>;\nexport async function createJazzContext<Acc extends Account>(\n options: ContextParamsWithAuth<Acc> | BaseContextParams,\n): Promise<JazzContext<Acc>>;\nexport async function createJazzContext<Acc extends Account>(\n options: ContextParamsWithAuth<Acc> | BaseContextParams,\n): Promise<JazzContext<Acc>> {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (!(\"auth\" in options)) {\n return createAnonymousJazzContext({\n peersToLoadFrom: options.peersToLoadFrom,\n crypto: options.crypto,\n });\n }\n\n const { auth, sessionProvider, peersToLoadFrom, crypto } = options;\n const AccountSchema =\n options.AccountSchema ??\n (RegisteredSchemas[\"Account\"] as unknown as AccountClass<Acc>);\n let authResult: AuthResult;\n try {\n authResult = await auth.start(crypto);\n } catch (e) {\n console.error(\"error\", e);\n throw e;\n }\n\n if (authResult.type === \"existing\") {\n try {\n const { sessionID, sessionDone } = await sessionProvider(\n authResult.credentials.accountID,\n crypto,\n );\n\n try {\n const node = await LocalNode.withLoadedAccount({\n accountID: authResult.credentials\n .accountID as unknown as CoID<RawAccount>,\n accountSecret: authResult.credentials.secret,\n sessionID: sessionID,\n peersToLoadFrom: peersToLoadFrom,\n crypto: crypto,\n migration: async (rawAccount, _node, creationProps) => {\n const account = new AccountSchema({\n fromRaw: rawAccount,\n }) as Acc;\n\n await account.applyMigration(creationProps);\n },\n });\n\n const account = AccountSchema.fromNode(node);\n\n if (authResult.saveCredentials) {\n await authResult.saveCredentials({\n accountID: node.account.id as unknown as ID<Account>,\n secret: node.account.agentSecret,\n });\n }\n\n authResult.onSuccess();\n\n return {\n account,\n done: () => {\n node.gracefulShutdown();\n sessionDone();\n },\n logOut: () => {\n node.gracefulShutdown();\n sessionDone();\n authResult.logOut();\n },\n };\n } catch (e) {\n authResult.onError(new Error(\"Error loading account\", { cause: e }));\n sessionDone();\n }\n } catch (e) {\n authResult.onError(\n new Error(\"Error acquiring sessionID\", { cause: e }),\n );\n }\n } else if (authResult.type === \"new\") {\n try {\n // TODO: figure out a way to not \"waste\" the first SessionID\n const { node } = await LocalNode.withNewlyCreatedAccount({\n creationProps: authResult.creationProps,\n peersToLoadFrom: peersToLoadFrom,\n crypto: crypto,\n initialAgentSecret: authResult.initialSecret,\n migration: async (rawAccount, _node, creationProps) => {\n const account = new AccountSchema({\n fromRaw: rawAccount,\n }) as Acc;\n\n await account.applyMigration(creationProps);\n },\n });\n\n const account = AccountSchema.fromNode(node);\n\n await authResult.saveCredentials({\n accountID: node.account.id as unknown as ID<Account>,\n secret: node.account.agentSecret,\n });\n\n authResult.onSuccess();\n return {\n account,\n done: () => {\n node.gracefulShutdown();\n },\n logOut: () => {\n node.gracefulShutdown();\n authResult.logOut();\n },\n };\n } catch (e) {\n authResult.onError(new Error(\"Error creating account\", { cause: e }));\n }\n }\n }\n}\n\nexport async function createAnonymousJazzContext({\n peersToLoadFrom,\n crypto,\n}: {\n peersToLoadFrom: Peer[];\n crypto: CryptoProvider;\n}): Promise<JazzContextWithAgent> {\n const agentSecret = crypto.newRandomAgentSecret();\n const rawAgent = new ControlledAgent(agentSecret, crypto);\n\n const node = new LocalNode(\n rawAgent,\n crypto.newRandomSessionID(rawAgent.id),\n crypto,\n );\n\n for (const peer of peersToLoadFrom) {\n node.syncManager.addPeer(peer);\n }\n\n return {\n agent: new AnonymousJazzAgent(node),\n done: () => {},\n logOut: () => {},\n };\n}\n","import type { Account } from \"./account.js\";\nimport type { CoMap } from \"./coMap.js\";\nimport type { Group } from \"./group.js\";\n\n/**\n * Regisering schemas into this Record to avoid circular dependencies.\n */\nexport const RegisteredSchemas = {} as {\n Account: typeof Account;\n Group: typeof Group;\n CoMap: typeof CoMap;\n};\n","/* istanbul ignore file -- @preserve */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ItemsSym } from \"./symbols.js\";\n\n(globalThis as any).devtoolsFormatters = [\n {\n header: (object: any) => {\n if (object._type === \"CoMap\") {\n return [\"div\", {}, [\"span\", {}, object.constructor.name]];\n } else if (object._type === \"CoList\") {\n return [\n \"div\",\n {},\n [\"span\", {}, object.constructor.name + \"(\" + object.length + \") \"],\n ];\n } else if (object._type === \"Account\") {\n return [\n \"div\",\n {},\n [\n \"span\",\n {},\n object.constructor.name +\n \"(\" +\n object._refs.profile.value?.name +\n (object.isMe ? \" ME\" : \"\") +\n \")\",\n ],\n ];\n } else {\n return null;\n }\n },\n hasBody: function () {\n return true;\n },\n body: function (object: any) {\n if (object._type === \"CoMap\" || object._type === \"Account\") {\n return [\n \"div\",\n { style: \"margin-left: 15px\" },\n [\"div\", \"id: \", [\"object\", { object: object.id }]],\n ...Object.entries(object).map(([k, v]) => [\n \"div\",\n { style: \"white-space: nowrap;\" },\n [\"span\", { style: \"font-weight: bold; opacity: 0.6\" }, k, \": \"],\n [\"object\", { object: v }],\n ...(typeof object._schema[k] === \"function\"\n ? v === null\n ? [\n [\n \"span\",\n { style: \"opacity: 0.5\" },\n ` (pending ${object._schema[k].name} `,\n [\"object\", { object: object._refs[k] }],\n \")\",\n ],\n ]\n : []\n : []),\n ]),\n ];\n } else if (object._type === \"CoList\") {\n return [\n \"div\",\n { style: \"margin-left: 15px\" },\n [\"div\", \"id: \", [\"object\", { object: object.id }]],\n ...(object as any[]).map((v, i) => [\n \"div\",\n { style: \"white-space: nowrap;\" },\n [\"span\", { style: \"font-weight: bold; opacity: 0.6\" }, i, \": \"],\n [\"object\", { object: v }],\n ...(typeof object._schema[ItemsSym] === \"function\"\n ? v === null\n ? [\n [\n \"span\",\n { style: \"opacity: 0.5\" },\n ` (pending ${object._schema[ItemsSym].name} `,\n [\"object\", { object: object._refs[i] }],\n \")\",\n ],\n ]\n : []\n : []),\n ]),\n ];\n }\n },\n },\n];\n","import {\n CoID,\n InviteSecret,\n RawAccount,\n RawCoMap,\n RawControlledAccount,\n SessionID,\n} from \"cojson\";\nimport { CoStreamItem, RawCoStream } from \"cojson\";\nimport { type Account } from \"./account.js\";\nimport { CoValue, CoValueClass, ID, loadCoValue } from \"./interfaces.js\";\n\nexport type InboxInvite = `${CoID<MessagesStream>}/${InviteSecret}`;\ntype TxKey = `${SessionID}/${number}`;\n\ntype MessagesStream = RawCoStream<CoID<InboxMessage<CoValue, any>>>;\ntype FailedMessagesStream = RawCoStream<{\n errors: string[];\n value: CoID<InboxMessage<CoValue, any>>;\n}>;\ntype TxKeyStream = RawCoStream<TxKey>;\nexport type InboxRoot = RawCoMap<{\n messages: CoID<MessagesStream>;\n processed: CoID<TxKeyStream>;\n failed: CoID<FailedMessagesStream>;\n inviteLink: InboxInvite;\n}>;\n\nexport function createInboxRoot(account: Account) {\n if (!account.isMe) {\n throw new Error(\"Account is not controlled\");\n }\n\n const rawAccount = account._raw as RawControlledAccount;\n\n const group = rawAccount.createGroup();\n const messagesFeed = group.createStream<MessagesStream>();\n\n const inboxRoot = rawAccount.createMap<InboxRoot>();\n const processedFeed = rawAccount.createStream<TxKeyStream>();\n const failedFeed = rawAccount.createStream<FailedMessagesStream>();\n\n const inviteLink =\n `${messagesFeed.id}/${group.createInvite(\"writeOnly\")}` as const;\n\n inboxRoot.set(\"messages\", messagesFeed.id);\n inboxRoot.set(\"processed\", processedFeed.id);\n inboxRoot.set(\"failed\", failedFeed.id);\n\n return {\n id: inboxRoot.id,\n inviteLink,\n };\n}\n\ntype InboxMessage<I extends CoValue, O extends CoValue | undefined> = RawCoMap<{\n payload: ID<I>;\n result: ID<O> | undefined;\n processed: boolean;\n error: string | undefined;\n}>;\n\nfunction createInboxMessage<I extends CoValue, O extends CoValue | undefined>(\n payload: I,\n inboxOwner: RawAccount,\n) {\n const group = payload._raw.group;\n\n if (group instanceof RawAccount) {\n throw new Error(\"Inbox messages should be owned by a group\");\n }\n\n group.addMember(inboxOwner, \"writer\");\n\n const message = group.createMap<InboxMessage<I, O>>({\n payload: payload.id,\n result: undefined,\n processed: false,\n error: undefined,\n });\n\n return message;\n}\n\nexport class Inbox {\n account: Account;\n messages: MessagesStream;\n processed: TxKeyStream;\n failed: FailedMessagesStream;\n root: InboxRoot;\n processing = new Set<`${SessionID}/${number}`>();\n\n private constructor(\n account: Account,\n root: InboxRoot,\n messages: MessagesStream,\n processed: TxKeyStream,\n failed: FailedMessagesStream,\n ) {\n this.account = account;\n this.root = root;\n this.messages = messages;\n this.processed = processed;\n this.failed = failed;\n }\n\n subscribe<I extends CoValue, O extends CoValue | undefined>(\n Schema: CoValueClass<I>,\n callback: (\n message: I,\n senderAccountID: ID<Account>,\n ) => Promise<O | undefined | void>,\n options: { retries?: number } = {},\n ) {\n const processed = new Set<`${SessionID}/${number}`>();\n const failed = new Map<`${SessionID}/${number}`, string[]>();\n const node = this.account._raw.core.node;\n\n this.processed.subscribe((stream) => {\n for (const items of Object.values(stream.items)) {\n for (const item of items) {\n processed.add(item.value as TxKey);\n }\n }\n });\n\n const { account } = this;\n const { retries = 3 } = options;\n\n let failTimer: ReturnType<typeof setTimeout> | number | undefined =\n undefined;\n\n const clearFailTimer = () => {\n clearTimeout(failTimer);\n failTimer = undefined;\n };\n\n const handleNewMessages = (stream: MessagesStream) => {\n clearFailTimer(); // Stop the failure timers, we're going to process the failed entries anyway\n\n for (const [sessionID, items] of Object.entries(stream.items) as [\n SessionID,\n CoStreamItem<CoID<InboxMessage<I, O>>>[],\n ][]) {\n const accountID = getAccountIDfromSessionID(sessionID);\n\n if (!accountID) {\n console.warn(\"Received message from unknown account\", sessionID);\n continue;\n }\n\n for (const item of items) {\n const txKey = `${sessionID}/${item.tx.txIndex}` as const;\n\n if (!processed.has(txKey) && !this.processing.has(txKey)) {\n this.processing.add(txKey);\n\n const id = item.value;\n\n node\n .load(id)\n .then((message) => {\n if (message === \"unavailable\") {\n return Promise.reject(\n new Error(\"Unable to load inbox message \" + id),\n );\n }\n\n return loadCoValue(\n Schema,\n message.get(\"payload\") as ID<I>,\n account,\n [],\n );\n })\n .then((value) => {\n if (!value) {\n return Promise.reject(\n new Error(\"Unable to load inbox message \" + id),\n );\n }\n\n return callback(value, accountID);\n })\n .then((result) => {\n const inboxMessage = node\n .expectCoValueLoaded(item.value)\n .getCurrentContent() as RawCoMap;\n\n if (result) {\n inboxMessage.set(\"result\", result.id);\n }\n\n inboxMessage.set(\"processed\", true);\n\n this.processed.push(txKey);\n this.processing.delete(txKey);\n })\n .catch((error) => {\n console.error(\"Error processing inbox message\", error);\n this.processing.delete(txKey);\n const errors = failed.get(txKey) ?? [];\n\n const stringifiedError = String(error);\n errors.push(stringifiedError);\n\n const inboxMessage = node\n .expectCoValueLoaded(item.value)\n .getCurrentContent() as RawCoMap;\n\n inboxMessage.set(\"error\", stringifiedError);\n\n if (errors.length > retries) {\n inboxMessage.set(\"processed\", true);\n this.processed.push(txKey);\n this.failed.push({ errors, value: item.value });\n } else {\n failed.set(txKey, errors);\n if (!failTimer) {\n failTimer = setTimeout(\n () => handleNewMessages(stream),\n 100,\n );\n }\n }\n });\n }\n }\n }\n };\n\n return this.messages.subscribe(handleNewMessages);\n }\n\n static async load(account: Account) {\n const profile = account.profile;\n\n if (!profile) {\n throw new Error(\"Account profile should already be loaded\");\n }\n\n if (!profile.inbox) {\n throw new Error(\"The account has not set up their inbox\");\n }\n\n const node = account._raw.core.node;\n\n const root = await node.load(profile.inbox as CoID<InboxRoot>);\n\n if (root === \"unavailable\") {\n throw new Error(\"Inbox not found\");\n }\n\n const [messages, processed, failed] = await Promise.all([\n node.load(root.get(\"messages\")!),\n node.load(root.get(\"processed\")!),\n node.load(root.get(\"failed\")!),\n ]);\n\n if (\n messages === \"unavailable\" ||\n processed === \"unavailable\" ||\n failed === \"unavailable\"\n ) {\n throw new Error(\"Inbox not found\");\n }\n\n return new Inbox(account, root, messages, processed, failed);\n }\n}\n\nexport class InboxSender<I extends CoValue, O extends CoValue | undefined> {\n currentAccount: Account;\n owner: RawAccount;\n messages: MessagesStream;\n\n private constructor(\n currentAccount: Account,\n owner: RawAccount,\n messages: MessagesStream,\n ) {\n this.currentAccount = currentAccount;\n this.owner = owner;\n this.messages = messages;\n }\n\n getOwnerAccount() {\n return this.owner;\n }\n\n sendMessage(message: I): Promise<O extends CoValue ? ID<O> : undefined> {\n const inboxMessage = createInboxMessage<I, O>(message, this.owner);\n\n this.messages.push(inboxMessage.id);\n\n return new Promise((resolve, reject) => {\n inboxMessage.subscribe((message) => {\n if (message.get(\"processed\")) {\n const error = message.get(\"error\");\n if (error) {\n reject(new Error(error));\n } else {\n resolve(\n message.get(\"result\") as O extends CoValue ? ID<O> : undefined,\n );\n }\n }\n });\n });\n }\n\n static async load<\n I extends CoValue,\n O extends CoValue | undefined = undefined,\n >(inboxOwnerID: ID<Account>, currentAccount: Account) {\n const node = currentAccount._raw.core.node;\n\n const inboxOwnerRaw = await node.load(\n inboxOwnerID as unknown as CoID<RawAccount>,\n );\n\n if (inboxOwnerRaw === \"unavailable\") {\n throw new Error(\"Failed to load the inbox owner\");\n }\n\n const inboxOwnerProfileRaw = await node.load(inboxOwnerRaw.get(\"profile\")!);\n\n if (inboxOwnerProfileRaw === \"unavailable\") {\n throw new Error(\"Failed to load the inbox owner profile\");\n }\n\n const inboxInvite = inboxOwnerProfileRaw.get(\"inboxInvite\");\n\n if (!inboxInvite) {\n throw new Error(\"The user has not set up their inbox\");\n }\n\n const id = await acceptInvite(inboxInvite as InboxInvite, currentAccount);\n\n const messages = await node.load(id);\n\n if (messages === \"unavailable\") {\n throw new Error(\"Inbox not found\");\n }\n\n return new InboxSender<I, O>(currentAccount, inboxOwnerRaw, messages);\n }\n}\n\nasync function acceptInvite(invite: string, account: Account) {\n const id = invite.slice(0, invite.indexOf(\"/\")) as CoID<MessagesStream>;\n\n const inviteSecret = invite.slice(invite.indexOf(\"/\") + 1) as InviteSecret;\n\n if (!id?.startsWith(\"co_z\") || !inviteSecret.startsWith(\"inviteSecret_\")) {\n throw new Error(\"Invalid inbox ticket\");\n }\n\n if (!account.isMe) {\n throw new Error(\"Account is not controlled\");\n }\n\n await (account._raw as RawControlledAccount).acceptInvite(id, inviteSecret);\n\n return id;\n}\n\nfunction getAccountIDfromSessionID(sessionID: SessionID) {\n const until = sessionID.indexOf(\"_session\");\n const accountID = sessionID.slice(0, until);\n\n if (accountID.startsWith(\"co_z\")) {\n return accountID as ID<Account>;\n }\n\n return;\n}\n","import {\n AgentID,\n type CoValueUniqueness,\n CojsonInternalTypes,\n type JsonValue,\n RawAccountID,\n type RawCoMap,\n cojsonInternals,\n} from \"cojson\";\nimport type {\n AnonymousJazzAgent,\n CoValue,\n CoValueClass,\n DeeplyLoaded,\n DepthsIn,\n ID,\n IfCo,\n RefEncoded,\n RefIfCoValue,\n Schema,\n co,\n} from \"../internal.js\";\nimport {\n CoValueBase,\n ItemsSym,\n Ref,\n SchemaInit,\n ensureCoValueLoaded,\n inspect,\n isRefEncoded,\n loadCoValue,\n makeRefs,\n parseCoValueCreateOptions,\n subscribeToCoValue,\n subscribeToExistingCoValue,\n subscriptionsScopes,\n} from \"../internal.js\";\nimport { type Account } from \"./account.js\";\nimport { type Group } from \"./group.js\";\nimport { RegisteredSchemas } from \"./registeredSchemas.js\";\n\ntype CoMapEdit<V> = {\n value?: V;\n ref?: RefIfCoValue<V>;\n by?: Account;\n madeAt: Date;\n key?: string;\n};\n\ntype LastAndAllCoMapEdits<V> = CoMapEdit<V> & { all: CoMapEdit<V>[] };\n\nexport type Simplify<A> = {\n [K in keyof A]: A[K];\n} extends infer B\n ? B\n : never;\n\n/**\n * CoMaps are collaborative versions of plain objects, mapping string-like keys to values.\n *\n * @categoryDescription Declaration\n * Declare your own CoMap schemas by subclassing `CoMap` and assigning field schemas with `co`.\n *\n * Optional `co.ref(...)` fields must be marked with `{ optional: true }`.\n *\n * ```ts\n * import { co, CoMap } from \"jazz-tools\";\n *\n * class Person extends CoMap {\n * name = co.string;\n * age = co.number;\n * pet = co.ref(Animal);\n * car = co.ref(Car, { optional: true });\n * }\n * ```\n *\n * @categoryDescription Content\n * You can access properties you declare on a `CoMap` (using `co`) as if they were normal properties on a plain object, using dot notation, `Object.keys()`, etc.\n *\n * ```ts\n * person.name;\n * person[\"age\"];\n * person.age = 42;\n * person.pet?.name;\n * Object.keys(person);\n * // => [\"name\", \"age\", \"pet\"]\n * ```\n *\n * @category CoValues\n * */\nexport class CoMap extends CoValueBase implements CoValue {\n /**\n * The ID of this `CoMap`\n * @category Content */\n declare id: ID<this>;\n /** @category Type Helpers */\n declare _type: \"CoMap\";\n static {\n this.prototype._type = \"CoMap\";\n }\n /** @category Internals */\n declare _raw: RawCoMap;\n\n /** @internal */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static _schema: any;\n /** @internal */\n get _schema() {\n return (this.constructor as typeof CoMap)._schema as {\n [key: string]: Schema;\n } & { [ItemsSym]?: Schema };\n }\n\n /**\n * If property `prop` is a `co.ref(...)`, you can use `coMaps._refs.prop` to access\n * the `Ref` instead of the potentially loaded/null value.\n *\n * This allows you to always get the ID or load the value manually.\n *\n * @example\n * ```ts\n * person._refs.pet.id; // => ID<Animal>\n * person._refs.pet.value;\n * // => Animal | null\n * const pet = await person._refs.pet.load();\n * ```\n *\n * @category Content\n **/\n get _refs(): {\n [Key in CoKeys<this>]: IfCo<this[Key], RefIfCoValue<this[Key]>>;\n } {\n return makeRefs<CoKeys<this>>(\n (key) => this._raw.get(key as string) as unknown as ID<CoValue>,\n () => {\n const keys = this._raw.keys().filter((key) => {\n const schema =\n this._schema[key as keyof typeof this._schema] ||\n (this._schema[ItemsSym] as Schema | undefined);\n return schema && schema !== \"json\" && isRefEncoded(schema);\n }) as CoKeys<this>[];\n\n return keys;\n },\n this._loadedAs,\n (key) =>\n (this._schema[key] || this._schema[ItemsSym]) as RefEncoded<CoValue>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as any;\n }\n\n /** @internal */\n private getEditFromRaw(\n target: CoMap,\n rawEdit: {\n by: RawAccountID | AgentID;\n tx: CojsonInternalTypes.TransactionID;\n at: Date;\n value?: JsonValue | undefined;\n },\n descriptor: Schema,\n key: string,\n ) {\n return {\n value:\n descriptor === \"json\"\n ? rawEdit.value\n : \"encoded\" in descriptor\n ? rawEdit.value === null || rawEdit.value === undefined\n ? rawEdit.value\n : descriptor.encoded.decode(rawEdit.value)\n : new Ref(\n rawEdit.value as ID<CoValue>,\n target._loadedAs,\n descriptor,\n ).accessFrom(target, \"_edits.\" + key + \".value\"),\n ref:\n descriptor !== \"json\" && isRefEncoded(descriptor)\n ? new Ref(rawEdit.value as ID<CoValue>, target._loadedAs, descriptor)\n : undefined,\n by:\n rawEdit.by &&\n new Ref<Account>(rawEdit.by as ID<Account>, target._loadedAs, {\n ref: RegisteredSchemas[\"Account\"],\n optional: false,\n }).accessFrom(target, \"_edits.\" + key + \".by\"),\n madeAt: rawEdit.at,\n key,\n };\n }\n\n /** @category Collaboration */\n get _edits() {\n const map = this;\n return new Proxy(\n {},\n {\n get(_target, key) {\n const rawEdit = map._raw.lastEditAt(key as string);\n if (!rawEdit) return undefined;\n\n const descriptor = map._schema[\n key as keyof typeof map._schema\n ] as Schema;\n\n return {\n ...map.getEditFromRaw(map, rawEdit, descriptor, key as string),\n get all() {\n return [...map._raw.editsAt(key as string)].map((rawEdit) =>\n map.getEditFromRaw(map, rawEdit, descriptor, key as string),\n );\n },\n };\n },\n ownKeys(_target) {\n return map._raw.keys();\n },\n getOwnPropertyDescriptor(target, key) {\n return {\n value: Reflect.get(target, key),\n writable: false,\n enumerable: true,\n configurable: true,\n };\n },\n },\n ) as {\n [Key in CoKeys<this>]: IfCo<this[Key], LastAndAllCoMapEdits<this[Key]>>;\n };\n }\n\n /** @internal */\n constructor(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: { fromRaw: RawCoMap } | undefined,\n ) {\n super();\n\n if (options) {\n if (\"fromRaw\" in options) {\n Object.defineProperties(this, {\n id: {\n value: options.fromRaw.id as unknown as ID<this>,\n enumerable: false,\n },\n _raw: { value: options.fromRaw, enumerable: false },\n });\n } else {\n throw new Error(\"Invalid CoMap constructor arguments\");\n }\n }\n\n return new Proxy(this, CoMapProxyHandler as ProxyHandler<this>);\n }\n\n /**\n * Create a new CoMap with the given initial values and owner.\n *\n * The owner (a Group or Account) determines access rights to the CoMap.\n *\n * The CoMap will immediately be persisted and synced to connected peers.\n *\n * @example\n * ```ts\n * const person = Person.create({\n * name: \"Alice\",\n * age: 42,\n * pet: cat,\n * }, { owner: friendGroup });\n * ```\n *\n * @category Creation\n **/\n static create<M extends CoMap>(\n this: CoValueClass<M>,\n init: Simplify<CoMapInit<M>>,\n options:\n | {\n owner: Account | Group;\n unique?: CoValueUniqueness[\"uniqueness\"];\n }\n | Account\n | Group,\n ) {\n const instance = new this();\n\n const { owner, uniqueness } = parseCoValueCreateOptions(options);\n const raw = instance.rawFromInit(init, owner, uniqueness);\n\n Object.defineProperties(instance, {\n id: {\n value: raw.id,\n enumerable: false,\n },\n _raw: { value: raw, enumerable: false },\n });\n return instance;\n }\n\n /**\n * Return a JSON representation of the `CoMap`\n * @category Content\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toJSON(_key?: string, seenAbove?: ID<CoValue>[]): any[] {\n const jsonedFields = this._raw.keys().map((key) => {\n const tKey = key as CoKeys<this>;\n const descriptor = (this._schema[tKey] ||\n this._schema[ItemsSym]) as Schema;\n\n if (descriptor == \"json\" || \"encode\" in descriptor) {\n return [key, this._raw.get(key)];\n } else if (isRefEncoded(descriptor)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (seenAbove?.includes((this as any)[tKey]?.id)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return [key, { _circular: (this as any)[tKey]?.id }];\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const jsonedRef = (this as any)[tKey]?.toJSON(tKey, [\n ...(seenAbove || []),\n this.id,\n ]);\n return [key, jsonedRef];\n } else {\n return [key, undefined];\n }\n });\n\n return {\n id: this.id,\n _type: this._type,\n ...Object.fromEntries(jsonedFields),\n };\n }\n\n [inspect]() {\n return this.toJSON();\n }\n\n /**\n * Create a new `RawCoMap` from an initialization object\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n rawFromInit<Fields extends object = Record<string, any>>(\n init: Simplify<CoMapInit<Fields>> | undefined,\n owner: Account | Group,\n uniqueness?: CoValueUniqueness,\n ) {\n const rawOwner = owner._raw;\n\n const rawInit = {} as {\n [key in keyof Fields]: JsonValue | undefined;\n };\n\n if (init)\n for (const key of Object.keys(init) as (keyof Fields)[]) {\n const initValue = init[key as keyof typeof init];\n\n const descriptor = (this._schema[key as keyof typeof this._schema] ||\n this._schema[ItemsSym]) as Schema;\n\n if (!descriptor) {\n continue;\n }\n\n if (descriptor === \"json\") {\n rawInit[key] = initValue as JsonValue;\n } else if (isRefEncoded(descriptor)) {\n if (initValue) {\n rawInit[key] = (initValue as unknown as CoValue).id;\n }\n } else if (\"encoded\" in descriptor) {\n rawInit[key] = descriptor.encoded.encode(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n initValue as any,\n );\n }\n }\n\n return rawOwner.createMap(rawInit, null, \"private\", uniqueness);\n }\n\n /**\n * Declare a Record-like CoMap schema, by extending `CoMap.Record(...)` and passing the value schema using `co`. Keys are always `string`.\n *\n * @example\n * ```ts\n * import { co, CoMap } from \"jazz-tools\";\n *\n * class ColorToFruitMap extends CoMap.Record(\n * co.ref(Fruit)\n * ) {}\n *\n * // assume we have map: ColorToFruitMap\n * // and strawberry: Fruit\n * map[\"red\"] = strawberry;\n * ```\n *\n * @category Declaration\n */\n static Record<Value>(value: IfCo<Value, Value>) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\n class RecordLikeCoMap extends CoMap {\n [ItemsSym] = value;\n }\n // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\n interface RecordLikeCoMap extends Record<string, Value> {}\n\n return RecordLikeCoMap;\n }\n\n /**\n * Load a `CoMap` with a given ID, as a given account.\n *\n * `depth` specifies which (if any) fields that reference other CoValues to load as well before resolving.\n * The `DeeplyLoaded` return type guarantees that corresponding referenced CoValues are loaded to the specified depth.\n *\n * You can pass `[]` or `{}` for shallowly loading only this CoMap, or `{ fieldA: depthA, fieldB: depthB }` for recursively loading referenced CoValues.\n *\n * Check out the `load` methods on `CoMap`/`CoList`/`CoFeed`/`Group`/`Account` to see which depth structures are valid to nest.\n *\n * @example\n * ```ts\n * const person = await Person.load(\n * \"co_zdsMhHtfG6VNKt7RqPUPvUtN2Ax\",\n * me,\n * { pet: {} }\n * );\n * ```\n *\n * @category Subscription & Loading\n */\n static load<M extends CoMap, Depth>(\n this: CoValueClass<M>,\n id: ID<M>,\n as: Account,\n depth: Depth & DepthsIn<M>,\n ): Promise<DeeplyLoaded<M, Depth> | undefined> {\n return loadCoValue(this, id, as, depth);\n }\n\n /**\n * Load and subscribe to a `CoMap` with a given ID, as a given account.\n *\n * Automatically also subscribes to updates to all referenced/nested CoValues as soon as they are accessed in the listener.\n *\n * `depth` specifies which (if any) fields that reference other CoValues to load as well before calling `listener` for the first time.\n * The `DeeplyLoaded` return type guarantees that corresponding referenced CoValues are loaded to the specified depth.\n *\n * You can pass `[]` or `{}` for shallowly loading only this CoMap, or `{ fieldA: depthA, fieldB: depthB }` for recursively loading referenced CoValues.\n *\n * Check out the `load` methods on `CoMap`/`CoList`/`CoFeed`/`Group`/`Account` to see which depth structures are valid to nest.\n *\n * Returns an unsubscribe function that you should call when you no longer need updates.\n *\n * Also see the `useCoState` hook to reactively subscribe to a CoValue in a React component.\n *\n * @example\n * ```ts\n * const unsub = Person.subscribe(\n * \"co_zdsMhHtfG6VNKt7RqPUPvUtN2Ax\",\n * me,\n * { pet: {} },\n * (person) => console.log(person)\n * );\n * ```\n *\n * @category Subscription & Loading\n */\n static subscribe<M extends CoMap, Depth>(\n this: CoValueClass<M>,\n id: ID<M>,\n as: Account,\n depth: Depth & DepthsIn<M>,\n listener: (value: DeeplyLoaded<M, Depth>) => void,\n ): () => void {\n return subscribeToCoValue<M, Depth>(this, id, as, depth, listener);\n }\n\n static findUnique<M extends CoMap>(\n this: CoValueClass<M>,\n unique: CoValueUniqueness[\"uniqueness\"],\n ownerID: ID<Account> | ID<Group>,\n as: Account | Group | AnonymousJazzAgent,\n ) {\n const header = {\n type: \"comap\" as const,\n ruleset: {\n type: \"ownedByGroup\" as const,\n group: ownerID,\n },\n meta: null,\n uniqueness: unique,\n };\n const crypto =\n as._type === \"Anonymous\" ? as.node.crypto : as._raw.core.crypto;\n return cojsonInternals.idforHeader(header, crypto) as ID<M>;\n }\n\n /**\n * Given an already loaded `CoMap`, ensure that the specified fields are loaded to the specified depth.\n *\n * Works like `CoMap.load()`, but you don't need to pass the ID or the account to load as again.\n *\n * @category Subscription & Loading\n */\n ensureLoaded<M extends CoMap, Depth>(\n this: M,\n depth: Depth & DepthsIn<M>,\n ): Promise<DeeplyLoaded<M, Depth> | undefined> {\n return ensureCoValueLoaded(this, depth);\n }\n\n /**\n * Given an already loaded `CoMap`, subscribe to updates to the `CoMap` and ensure that the specified fields are loaded to the specified depth.\n *\n * Works like `CoMap.subscribe()`, but you don't need to pass the ID or the account to load as again.\n *\n * Returns an unsubscribe function that you should call when you no longer need updates.\n *\n * @category Subscription & Loading\n **/\n subscribe<M extends CoMap, Depth>(\n this: M,\n depth: Depth & DepthsIn<M>,\n listener: (value: DeeplyLoaded<M, Depth>) => void,\n ): () => void {\n return subscribeToExistingCoValue(this, depth, listener);\n }\n\n applyDiff<N extends Partial<CoMapInit<this>>>(newValues: N) {\n for (const key in newValues) {\n if (Object.prototype.hasOwnProperty.call(newValues, key)) {\n const tKey = key as keyof typeof newValues & keyof this;\n const descriptor = (this._schema[tKey as string] ||\n this._schema[ItemsSym]) as Schema;\n\n if (tKey in this._schema) {\n const newValue = newValues[tKey];\n const currentValue = (this as unknown as N)[tKey];\n\n if (descriptor === \"json\" || \"encoded\" in descriptor) {\n if (currentValue !== newValue) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any)[tKey] = newValue;\n }\n } else if (isRefEncoded(descriptor)) {\n const currentId = (currentValue as CoValue | undefined)?.id;\n const newId = (newValue as CoValue | undefined)?.id;\n if (currentId !== newId) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any)[tKey] = newValue;\n }\n }\n }\n }\n }\n return this;\n }\n\n /**\n * Wait for the `CoMap` to be uploaded to the other peers.\n *\n * @category Subscription & Loading\n */\n waitForSync(options?: { timeout?: number }) {\n return this._raw.core.waitForSync(options);\n }\n}\n\nexport type CoKeys<Map extends object> = Exclude<\n keyof Map & string,\n keyof CoMap\n>;\n\n/**\n * Force required ref fields to be non nullable\n *\n * Considering that:\n * - Optional refs are typed as co<InstanceType<CoValueClass> | null | undefined>\n * - Required refs are typed as co<InstanceType<CoValueClass> | null>\n *\n * This type works in two steps:\n * - Remove the null from both types\n * - Then we check if the input type accepts undefined, if positive we put the null union back\n *\n * So the optional refs stays unchanged while we safely remove the null union\n * from required refs\n *\n * This way required refs can be marked as required in the CoMapInit while\n * staying a nullable property for value access.\n *\n * Example:\n *\n * const map = MyCoMap.create({\n * requiredRef: NestedMap.create({}) // null is not valid here\n * })\n *\n * map.requiredRef // this value is still nullable\n */\ntype ForceRequiredRef<V> = V extends co<InstanceType<CoValueClass> | null>\n ? NonNullable<V>\n : V extends co<InstanceType<CoValueClass> | undefined>\n ? V | null\n : V;\n\nexport type CoMapInit<Map extends object> = {\n [Key in CoKeys<Map> as undefined extends Map[Key]\n ? never\n : IfCo<Map[Key], Key>]: ForceRequiredRef<Map[Key]>;\n} & {\n [Key in CoKeys<Map> as IfCo<Map[Key], Key>]?: ForceRequiredRef<Map[Key]>;\n};\n\n// TODO: cache handlers per descriptor for performance?\nconst CoMapProxyHandler: ProxyHandler<CoMap> = {\n get(target, key, receiver) {\n if (key === \"_schema\") {\n return Reflect.get(target, key);\n } else if (key in target) {\n return Reflect.get(target, key, receiver);\n } else {\n const schema = target._schema;\n\n if (!schema) {\n return undefined;\n }\n\n const descriptor = (schema[key as keyof CoMap[\"_schema\"]] ||\n schema[ItemsSym]) as Schema;\n if (descriptor && typeof key === \"string\") {\n const raw = target._raw.get(key);\n\n if (descriptor === \"json\") {\n return raw;\n } else if (\"encoded\" in descriptor) {\n return raw === undefined ? undefined : descriptor.encoded.decode(raw);\n } else if (isRefEncoded(descriptor)) {\n return raw === undefined\n ? undefined\n : new Ref(\n raw as unknown as ID<CoValue>,\n target._loadedAs,\n descriptor,\n ).accessFrom(receiver, key);\n }\n } else {\n return undefined;\n }\n }\n },\n set(target, key, value, receiver) {\n if (\n (typeof key === \"string\" || ItemsSym) &&\n typeof value === \"object\" &&\n value !== null &&\n SchemaInit in value\n ) {\n (target.constructor as typeof CoMap)._schema ||= {};\n (target.constructor as typeof CoMap)._schema[key] = value[SchemaInit];\n return true;\n }\n\n const descriptor = (target._schema[key as keyof CoMap[\"_schema\"]] ||\n target._schema[ItemsSym]) as Schema;\n if (descriptor && typeof key === \"string\") {\n if (descriptor === \"json\") {\n target._raw.set(key, value);\n } else if (\"encoded\" in descriptor) {\n target._raw.set(key, descriptor.encoded.encode(value));\n } else if (isRefEncoded(descriptor)) {\n if (value === null) {\n if (descriptor.optional) {\n target._raw.set(key, null);\n } else {\n throw new Error(`Cannot set required reference ${key} to null`);\n }\n } else {\n target._raw.set(key, value.id);\n subscriptionsScopes\n .get(target)\n ?.onRefAccessedOrSet(target.id, value.id);\n }\n }\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n },\n defineProperty(target, key, attributes) {\n if (\n \"value\" in attributes &&\n typeof attributes.value === \"object\" &&\n SchemaInit in attributes.value\n ) {\n (target.constructor as typeof CoMap)._schema ||= {};\n (target.constructor as typeof CoMap)._schema[key as string] =\n attributes.value[SchemaInit];\n return true;\n } else {\n return Reflect.defineProperty(target, key, attributes);\n }\n },\n ownKeys(target) {\n const keys = Reflect.ownKeys(target).filter((k) => k !== ItemsSym);\n // for (const key of Reflect.ownKeys(target._schema)) {\n // if (key !== ItemsSym && !keys.includes(key)) {\n // keys.push(key);\n // }\n // }\n for (const key of target._raw.keys()) {\n if (!keys.includes(key)) {\n keys.push(key);\n }\n }\n\n return keys;\n },\n getOwnPropertyDescriptor(target, key) {\n if (key in target) {\n return Reflect.getOwnPropertyDescriptor(target, key);\n } else {\n const descriptor = (target._schema[key as keyof CoMap[\"_schema\"]] ||\n target._schema[ItemsSym]) as Schema;\n if (descriptor || key in target._raw.latest) {\n return {\n enumerable: true,\n configurable: true,\n writable: true,\n };\n }\n }\n },\n has(target, key) {\n const descriptor = (target._schema?.[key as keyof CoMap[\"_schema\"]] ||\n target._schema?.[ItemsSym]) as Schema;\n\n if (target._raw && typeof key === \"string\" && descriptor) {\n return target._raw.get(key) !== undefined;\n } else {\n return Reflect.has(target, key);\n }\n },\n deleteProperty(target, key) {\n const descriptor = (target._schema[key as keyof CoMap[\"_schema\"]] ||\n target._schema[ItemsSym]) as Schema;\n if (typeof key === \"string\" && descriptor) {\n target._raw.delete(key);\n return true;\n } else {\n return Reflect.deleteProperty(target, key);\n }\n },\n};\n\nRegisteredSchemas[\"CoMap\"] = CoMap;\n","import { CoID } from \"cojson\";\nimport { co } from \"../internal.js\";\nimport { CoMap } from \"./coMap.js\";\nimport { InboxInvite, InboxRoot } from \"./inbox.js\";\n\n/** @category Identity & Permissions */\nexport class Profile extends CoMap {\n name = co.string;\n inbox = co.optional.json<CoID<InboxRoot>>();\n inboxInvite = co.optional.json<InboxInvite>();\n}\n","import {\n AgentSecret,\n CoID,\n CryptoProvider,\n InviteSecret,\n LocalNode,\n Peer,\n RawAccount,\n RawCoMap,\n RawCoValue,\n RawControlledAccount,\n SessionID,\n cojsonInternals,\n} from \"cojson\";\nimport {\n AnonymousJazzAgent,\n type CoValue,\n CoValueBase,\n CoValueClass,\n DeeplyLoaded,\n DepthsIn,\n ID,\n MembersSym,\n Ref,\n type RefEncoded,\n RefIfCoValue,\n type Schema,\n SchemaInit,\n ensureCoValueLoaded,\n inspect,\n loadCoValue,\n subscribeToCoValue,\n subscribeToExistingCoValue,\n subscriptionsScopes,\n} from \"../internal.js\";\nimport { coValuesCache } from \"../lib/cache.js\";\nimport { type CoMap } from \"./coMap.js\";\nimport { type Group } from \"./group.js\";\nimport { createInboxRoot } from \"./inbox.js\";\nimport { Profile } from \"./profile.js\";\nimport { RegisteredSchemas } from \"./registeredSchemas.js\";\n\n/** @category Identity & Permissions */\nexport class Account extends CoValueBase implements CoValue {\n declare id: ID<this>;\n declare _type: \"Account\";\n declare _raw: RawAccount | RawControlledAccount;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static _schema: any;\n get _schema(): {\n profile: Schema;\n root: Schema;\n } {\n return (this.constructor as typeof Account)._schema;\n }\n static {\n this._schema = {\n profile: {\n ref: () => Profile,\n optional: false,\n } satisfies RefEncoded<Profile>,\n root: {\n ref: () => RegisteredSchemas[\"CoMap\"],\n optional: true,\n } satisfies RefEncoded<CoMap>,\n };\n }\n\n get _owner(): Account {\n return this as Account;\n }\n get _loadedAs(): Account | AnonymousJazzAgent {\n if (this.isMe) return this;\n\n const rawAccount = this._raw.core.node.account;\n\n if (rawAccount instanceof RawAccount) {\n return coValuesCache.get(rawAccount, () => Account.fromRaw(rawAccount));\n }\n\n return new AnonymousJazzAgent(this._raw.core.node);\n }\n\n declare profile: Profile | null;\n declare root: CoMap | null;\n\n get _refs(): {\n profile: RefIfCoValue<Profile> | undefined;\n root: RefIfCoValue<CoMap> | undefined;\n } {\n const profileID = this._raw.get(\"profile\") as unknown as\n | ID<NonNullable<this[\"profile\"]>>\n | undefined;\n const rootID = this._raw.get(\"root\") as unknown as\n | ID<NonNullable<this[\"root\"]>>\n | undefined;\n\n return {\n profile:\n profileID &&\n (new Ref(\n profileID,\n this._loadedAs,\n this._schema.profile as RefEncoded<\n NonNullable<this[\"profile\"]> & CoValue\n >,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as any as RefIfCoValue<this[\"profile\"]>),\n root:\n rootID &&\n (new Ref(\n rootID,\n this._loadedAs,\n this._schema.root as RefEncoded<NonNullable<this[\"root\"]> & CoValue>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as any as RefIfCoValue<this[\"root\"]>),\n };\n }\n\n isMe: boolean;\n sessionID: SessionID | undefined;\n\n constructor(options: { fromRaw: RawAccount | RawControlledAccount }) {\n super();\n if (!(\"fromRaw\" in options)) {\n throw new Error(\"Can only construct account from raw or with .create()\");\n }\n this.isMe = options.fromRaw.id == options.fromRaw.core.node.account.id;\n\n Object.defineProperties(this, {\n id: {\n value: options.fromRaw.id,\n enumerable: false,\n },\n _raw: { value: options.fromRaw, enumerable: false },\n _type: { value: \"Account\", enumerable: false },\n });\n\n if (this.isMe) {\n this.sessionID = options.fromRaw.core.node.currentSessionID;\n }\n\n return new Proxy(this, AccountAndGroupProxyHandler as ProxyHandler<this>);\n }\n\n myRole(): \"admin\" | undefined {\n if (this.isMe) {\n return \"admin\";\n }\n }\n\n async acceptInvite<V extends CoValue>(\n valueID: ID<V>,\n inviteSecret: InviteSecret,\n coValueClass: CoValueClass<V>,\n ) {\n if (!this.isMe) {\n throw new Error(\"Only a controlled account can accept invites\");\n }\n\n await (this._raw as RawControlledAccount).acceptInvite(\n valueID as unknown as CoID<RawCoValue>,\n inviteSecret,\n );\n\n return loadCoValue(coValueClass, valueID, this as Account, []);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }\n\n /** @private */\n static async create<A extends Account>(\n this: CoValueClass<A> & typeof Account,\n options: {\n creationProps: { name: string };\n initialAgentSecret?: AgentSecret;\n peersToLoadFrom?: Peer[];\n crypto: CryptoProvider;\n },\n ): Promise<A> {\n const { node } = await LocalNode.withNewlyCreatedAccount({\n ...options,\n migration: async (rawAccount, _node, creationProps) => {\n const account = new this({\n fromRaw: rawAccount,\n }) as A;\n\n await account.applyMigration?.(creationProps);\n },\n });\n\n return this.fromNode(node) as A;\n }\n\n static async createAs<A extends Account>(\n this: CoValueClass<A> & typeof Account,\n as: Account,\n options: {\n creationProps: { name: string };\n },\n ) {\n // TODO: is there a cleaner way to do this?\n const connectedPeers = cojsonInternals.connectedPeers(\n \"creatingAccount\",\n \"createdAccount\",\n { peer1role: \"server\", peer2role: \"client\" },\n );\n\n as._raw.core.node.syncManager.addPeer(connectedPeers[1]);\n\n return this.create<A>({\n creationProps: options.creationProps,\n crypto: as._raw.core.node.crypto,\n peersToLoadFrom: [connectedPeers[0]],\n });\n }\n\n static fromNode<A extends Account>(\n this: CoValueClass<A>,\n node: LocalNode,\n ): A {\n return new this({\n fromRaw: node.account as RawControlledAccount,\n }) as A;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toJSON(): object | any[] {\n return {\n id: this.id,\n _type: this._type,\n };\n }\n\n [inspect]() {\n return this.toJSON();\n }\n\n async applyMigration(creationProps?: { name: string }) {\n if (creationProps) {\n const profileGroup = RegisteredSchemas[\"Group\"].create({ owner: this });\n profileGroup.addMember(\"everyone\", \"reader\");\n this.profile = Profile.create(\n { name: creationProps.name },\n { owner: profileGroup },\n );\n }\n\n const node = this._raw.core.node;\n const profile = node\n .expectCoValueLoaded(this._raw.get(\"profile\")!)\n .getCurrentContent() as RawCoMap;\n\n if (!profile.get(\"inbox\")) {\n const inboxRoot = createInboxRoot(this);\n profile.set(\"inbox\", inboxRoot.id);\n profile.set(\"inboxInvite\", inboxRoot.inviteLink);\n }\n\n await this.migrate(creationProps);\n }\n\n // Placeholder method for subclasses to override\n migrate(creationProps?: { name: string }) {\n creationProps; // To avoid unused parameter warning\n }\n\n /** @category Subscription & Loading */\n static load<A extends Account, Depth>(\n this: CoValueClass<A>,\n id: ID<A>,\n as: Account,\n depth: Depth & DepthsIn<A>,\n ): Promise<DeeplyLoaded<A, Depth> | undefined> {\n return loadCoValue(this, id, as, depth);\n }\n\n /** @category Subscription & Loading */\n static subscribe<A extends Account, Depth>(\n this: CoValueClass<A>,\n id: ID<A>,\n as: Account,\n depth: Depth & DepthsIn<A>,\n listener: (value: DeeplyLoaded<A, Depth>) => void,\n ): () => void {\n return subscribeToCoValue<A, Depth>(this, id, as, depth, listener);\n }\n\n /** @category Subscription & Loading */\n ensureLoaded<A extends Account, Depth>(\n this: A,\n depth: Depth & DepthsIn<A>,\n ): Promise<DeeplyLoaded<A, Depth> | undefined> {\n return ensureCoValueLoaded(this, depth);\n }\n\n /** @category Subscription & Loading */\n subscribe<A extends Account, Depth>(\n this: A,\n depth: Depth & DepthsIn<A>,\n listener: (value: DeeplyLoaded<A, Depth>) => void,\n ): () => void {\n return subscribeToExistingCoValue(this, depth, listener);\n }\n\n /**\n * Wait for the `Account` to be uploaded to the other peers.\n *\n * @category Subscription & Loading\n */\n waitForSync(options?: {\n timeout?: number;\n }) {\n return this._raw.core.waitForSync(options);\n }\n\n /**\n * Wait for all the available `CoValues` to be uploaded to the other peers.\n *\n * @category Subscription & Loading\n */\n waitForAllCoValuesSync(options?: {\n timeout?: number;\n }) {\n return this._raw.core.node.syncManager.waitForAllCoValuesSync(\n options?.timeout,\n );\n }\n}\n\nexport const AccountAndGroupProxyHandler: ProxyHandler<Account | Group> = {\n get(target, key, receiver) {\n if (key === \"profile\") {\n const ref = target._refs.profile;\n return ref\n ? ref.accessFrom(receiver, \"profile\")\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (undefined as any);\n } else if (key === \"root\") {\n const ref = target._refs.root;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return ref ? ref.accessFrom(receiver, \"root\") : (undefined as any);\n } else {\n return Reflect.get(target, key, receiver);\n }\n },\n set(target, key, value, receiver) {\n if (\n (key === \"profile\" || key === \"root\" || key === MembersSym) &&\n typeof value === \"object\" &&\n SchemaInit in value\n ) {\n (target.constructor as typeof CoMap)._schema ||= {};\n (target.constructor as typeof CoMap)._schema[key] = value[SchemaInit];\n return true;\n } else if (key === \"profile\") {\n if (value) {\n target._raw.set(\n \"profile\",\n value.id as unknown as CoID<RawCoMap>,\n \"trusting\",\n );\n }\n subscriptionsScopes\n .get(receiver)\n ?.onRefAccessedOrSet(target.id, value.id);\n return true;\n } else if (key === \"root\") {\n if (value) {\n target._raw.set(\"root\", value.id as unknown as CoID<RawCoMap>);\n }\n subscriptionsScopes\n .get(receiver)\n ?.onRefAccessedOrSet(target.id, value.id);\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n },\n defineProperty(target, key, descriptor) {\n if (\n (key === \"profile\" || key === \"root\" || key === MembersSym) &&\n typeof descriptor.value === \"object\" &&\n SchemaInit in descriptor.value\n ) {\n (target.constructor as typeof CoMap)._schema ||= {};\n (target.constructor as typeof CoMap)._schema[key] =\n descriptor.value[SchemaInit];\n return true;\n } else {\n return Reflect.defineProperty(target, key, descriptor);\n }\n },\n};\n\n/** @category Identity & Permissions */\nexport function isControlledAccount(account: Account): account is Account & {\n isMe: true;\n sessionID: SessionID;\n _raw: RawControlledAccount;\n} {\n return account.isMe;\n}\n\nexport type AccountClass<Acc extends Account> = CoValueClass<Acc> & {\n fromNode: (typeof Account)[\"fromNode\"];\n};\n\nRegisteredSchemas[\"Account\"] = Account;\n","import type { Everyone, RawAccountID, RawGroup, Role } from \"cojson\";\nimport type {\n CoValue,\n CoValueClass,\n DeeplyLoaded,\n DepthsIn,\n ID,\n RefEncoded,\n Schema,\n} from \"../internal.js\";\nimport {\n CoValueBase,\n MembersSym,\n Ref,\n ensureCoValueLoaded,\n loadCoValue,\n parseCoValueCreateOptions,\n subscribeToCoValue,\n subscribeToExistingCoValue,\n} from \"../internal.js\";\nimport { AccountAndGroupProxyHandler, isControlledAccount } from \"./account.js\";\nimport { type Account } from \"./account.js\";\nimport { type CoMap } from \"./coMap.js\";\nimport { type Profile } from \"./profile.js\";\nimport { RegisteredSchemas } from \"./registeredSchemas.js\";\n\n/** @category Identity & Permissions */\nexport class Group extends CoValueBase implements CoValue {\n declare id: ID<this>;\n declare _type: \"Group\";\n static {\n this.prototype._type = \"Group\";\n }\n declare _raw: RawGroup;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static _schema: any;\n get _schema(): {\n profile: Schema;\n root: Schema;\n [MembersSym]: RefEncoded<Account>;\n } {\n return (this.constructor as typeof Group)._schema;\n }\n static {\n this._schema = {\n profile: \"json\" satisfies Schema,\n root: \"json\" satisfies Schema,\n [MembersSym]: {\n ref: () => RegisteredSchemas[\"Account\"],\n optional: false,\n } satisfies RefEncoded<Account>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any;\n Object.defineProperty(this.prototype, \"_schema\", {\n get: () => this._schema,\n });\n }\n\n declare profile: Profile | null;\n declare root: CoMap | null;\n declare [MembersSym]: Account | null;\n\n get _refs(): {\n profile: Ref<Profile> | undefined;\n root: Ref<CoMap> | undefined;\n } {\n const profileID = this._raw.get(\"profile\") as unknown as\n | ID<NonNullable<this[\"profile\"]>>\n | undefined;\n const rootID = this._raw.get(\"root\") as unknown as\n | ID<NonNullable<this[\"root\"]>>\n | undefined;\n return {\n profile:\n profileID &&\n (new Ref(\n profileID,\n this._loadedAs,\n this._schema.profile as RefEncoded<NonNullable<this[\"profile\"]>>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as any as this[\"profile\"] extends Profile\n ? Ref<this[\"profile\"]>\n : never),\n root:\n rootID &&\n (new Ref(\n rootID,\n this._loadedAs,\n this._schema.root as RefEncoded<NonNullable<this[\"root\"]>>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as any as this[\"root\"] extends CoMap ? Ref<this[\"root\"]> : never),\n };\n }\n\n /** @deprecated Don't use constructor directly, use .create */\n constructor(options: { fromRaw: RawGroup } | { owner: Account | Group }) {\n super();\n let raw: RawGroup;\n\n if (options && \"fromRaw\" in options) {\n raw = options.fromRaw;\n } else {\n const initOwner = options.owner;\n if (!initOwner) throw new Error(\"No owner provided\");\n if (initOwner._type === \"Account\" && isControlledAccount(initOwner)) {\n const rawOwner = initOwner._raw;\n raw = rawOwner.createGroup();\n } else {\n throw new Error(\"Can only construct group as a controlled account\");\n }\n }\n\n Object.defineProperties(this, {\n id: {\n value: raw.id,\n enumerable: false,\n },\n _raw: { value: raw, enumerable: false },\n });\n\n return new Proxy(this, AccountAndGroupProxyHandler as ProxyHandler<this>);\n }\n\n static create<G extends Group>(\n this: CoValueClass<G>,\n options: { owner: Account } | Account,\n ) {\n return new this(parseCoValueCreateOptions(options));\n }\n\n myRole(): Role | undefined {\n return this._raw.myRole();\n }\n\n addMember(member: Everyone | Account, role: Role) {\n this._raw.addMember(member === \"everyone\" ? member : member._raw, role);\n return this;\n }\n\n removeMember(member: Everyone | Account) {\n this._raw.removeMember(member === \"everyone\" ? member : member._raw);\n return this;\n }\n\n get members() {\n return this._raw\n .keys()\n .filter((key) => {\n return key === \"everyone\" || key.startsWith(\"co_\");\n })\n .map((id) => {\n const role = this._raw.get(id as Everyone | RawAccountID);\n const accountID =\n id === \"everyone\" ? undefined : (id as unknown as ID<Account>);\n const ref =\n accountID &&\n new Ref<NonNullable<this[MembersSym]>>(\n accountID,\n this._loadedAs,\n this._schema[MembersSym],\n );\n const accessRef = () => ref?.accessFrom(this, \"members.\" + id);\n\n return {\n id: id as unknown as Everyone | ID<this[MembersSym]>,\n role,\n ref,\n get account() {\n return accessRef();\n },\n };\n });\n }\n\n extend(parent: Group) {\n this._raw.extend(parent._raw);\n return this;\n }\n\n /** @category Subscription & Loading */\n static load<G extends Group, Depth>(\n this: CoValueClass<G>,\n id: ID<G>,\n as: Account,\n depth: Depth & DepthsIn<G>,\n ): Promise<DeeplyLoaded<G, Depth> | undefined> {\n return loadCoValue(this, id, as, depth);\n }\n\n /** @category Subscription & Loading */\n static subscribe<G extends Group, Depth>(\n this: CoValueClass<G>,\n id: ID<G>,\n as: Account,\n depth: Depth & DepthsIn<G>,\n listener: (value: DeeplyLoaded<G, Depth>) => void,\n ): () => void {\n return subscribeToCoValue<G, Depth>(this, id, as, depth, listener);\n }\n\n /** @category Subscription & Loading */\n ensureLoaded<G extends Group, Depth>(\n this: G,\n depth: Depth & DepthsIn<G>,\n ): Promise<DeeplyLoaded<G, Depth> | undefined> {\n return ensureCoValueLoaded(this, depth);\n }\n\n /** @category Subscription & Loading */\n subscribe<G extends Group, Depth>(\n this: G,\n depth: Depth & DepthsIn<G>,\n listener: (value: DeeplyLoaded<G, Depth>) => void,\n ): () => void {\n return subscribeToExistingCoValue(this, depth, listener);\n }\n\n /**\n * Wait for the `Group` to be uploaded to the other peers.\n *\n * @category Subscription & Loading\n */\n waitForSync(options?: { timeout?: number }) {\n return this._raw.core.waitForSync(options);\n }\n}\n\nRegisteredSchemas[\"Group\"] = Group;\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport type {\n AgentID,\n BinaryStreamInfo,\n CojsonInternalTypes,\n JsonValue,\n RawAccountID,\n RawBinaryCoStream,\n RawCoStream,\n SessionID,\n} from \"cojson\";\nimport { MAX_RECOMMENDED_TX_SIZE, cojsonInternals } from \"cojson\";\nimport type {\n AnonymousJazzAgent,\n CoValue,\n CoValueClass,\n DeeplyLoaded,\n DepthsIn,\n ID,\n IfCo,\n Schema,\n SchemaFor,\n UnCo,\n} from \"../internal.js\";\nimport {\n CoValueBase,\n ItemsSym,\n Ref,\n SchemaInit,\n co,\n ensureCoValueLoaded,\n inspect,\n isRefEncoded,\n loadCoValue,\n parseCoValueCreateOptions,\n subscribeToCoValue,\n subscribeToExistingCoValue,\n} from \"../internal.js\";\nimport { type Account } from \"./account.js\";\nimport { type Group } from \"./group.js\";\nimport { RegisteredSchemas } from \"./registeredSchemas.js\";\n\n/** @deprecated Use CoFeedEntry instead */\nexport type CoStreamEntry<Item> = CoFeedEntry<Item>;\n\nexport type CoFeedEntry<Item> = SingleCoFeedEntry<Item> & {\n all: IterableIterator<SingleCoFeedEntry<Item>>;\n};\n\n/** @deprecated Use SingleCoFeedEntry instead */\nexport type SingleCoStreamEntry<Item> = SingleCoFeedEntry<Item>;\n\nexport type SingleCoFeedEntry<Item> = {\n value: NonNullable<Item> extends CoValue ? NonNullable<Item> | null : Item;\n ref: NonNullable<Item> extends CoValue ? Ref<NonNullable<Item>> : never;\n by?: Account | null;\n madeAt: Date;\n tx: CojsonInternalTypes.TransactionID;\n};\n\n/** @deprecated Use CoFeed instead */\nexport { CoFeed as CoStream };\n\n/**\n * CoFeeds are collaborative logs of data.\n *\n * @categoryDescription Content\n * They are similar to `CoList`s, but with a few key differences:\n * - They are append-only\n * - They consist of several internal append-only logs, one per account session (tab, device, app instance, etc.)\n * - They expose those as a per-account aggregated view (default) or a precise per-session view\n *\n * ```ts\n * favDog.push(\"Poodle\");\n * favDog.push(\"Schnowzer\");\n * ```\n *\n * @category CoValues\n */\nexport class CoFeed<Item = any> extends CoValueBase implements CoValue {\n /**\n * Declare a `CoFeed` by subclassing `CoFeed.Of(...)` and passing the item schema using a `co` primitive or a `co.ref`.\n *\n * @example\n * ```ts\n * class ColorFeed extends CoFeed.Of(co.string) {}\n * class AnimalFeed extends CoFeed.Of(co.ref(Animal)) {}\n * ```\n *\n * @category Declaration\n */\n static Of<Item>(item: IfCo<Item, Item>): typeof CoFeed<Item> {\n return class CoFeedOf extends CoFeed<Item> {\n [co.items] = item;\n };\n }\n\n /**\n * The ID of this `CoFeed`\n * @category Content */\n declare id: ID<this>;\n /** @category Type Helpers */\n declare _type: \"CoStream\";\n static {\n this.prototype._type = \"CoStream\";\n }\n /** @category Internals */\n declare _raw: RawCoStream;\n\n /** @internal This is only a marker type and doesn't exist at runtime */\n [ItemsSym]!: Item;\n /** @internal */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static _schema: any;\n /** @internal */\n get _schema(): {\n [ItemsSym]: SchemaFor<Item>;\n } {\n return (this.constructor as typeof CoFeed)._schema;\n }\n\n /**\n * The per-account view of this `CoFeed`\n *\n * @example\n * ```ts\n * // Access entries directly by account ID\n * const aliceEntries = feed[aliceAccount.id];\n * console.log(aliceEntries.value); // Latest value from Alice\n *\n * // Iterate through all accounts' entries\n * for (const [accountId, entries] of Object.entries(feed)) {\n * console.log(`Latest entry from ${accountId}:`, entries.value);\n *\n * // Access all entries from this account\n * for (const entry of entries.all) {\n * console.log(`Entry made at ${entry.madeAt}:`, entry.value);\n * }\n * }\n * ```\n *\n * @category Content\n */\n [key: ID<Account>]: CoFeedEntry<Item>;\n\n /**\n * The current account's view of this `CoFeed`\n * @category Content\n */\n get byMe(): CoFeedEntry<Item> | undefined {\n if (this._loadedAs._type === \"Account\") {\n return this[this._loadedAs.id];\n } else {\n return undefined;\n }\n }\n\n /**\n * The per-session view of this `CoFeed`\n * @category Content\n */\n perSession!: {\n [key: SessionID]: CoFeedEntry<Item>;\n };\n\n /**\n * The current session's view of this `CoFeed`\n *\n * This is a shortcut for `this.perSession` where the session ID is the current session ID.\n *\n * @category Content\n */\n get inCurrentSession(): CoFeedEntry<Item> | undefined {\n if (this._loadedAs._type === \"Account\") {\n return this.perSession[this._loadedAs.sessionID!];\n } else {\n return undefined;\n }\n }\n\n constructor(\n options:\n | { init: Item[]; owner: Account | Group }\n | { fromRaw: RawCoStream },\n ) {\n super();\n\n if (options && \"fromRaw\" in options) {\n Object.defineProperties(this, {\n id: {\n value: options.fromRaw.id,\n enumerable: false,\n },\n _raw: { value: options.fromRaw, enumerable: false },\n });\n }\n\n return new Proxy(this, CoStreamProxyHandler as ProxyHandler<this>);\n }\n\n /**\n * Create a new `CoFeed`\n * @category Creation\n */\n static create<S extends CoFeed>(\n this: CoValueClass<S>,\n init: S extends CoFeed<infer Item> ? UnCo<Item>[] : never,\n options: { owner: Account | Group } | Account | Group,\n ) {\n const { owner } = parseCoValueCreateOptions(options);\n const instance = new this({ init, owner });\n const raw = owner._raw.createStream();\n\n Object.defineProperties(instance, {\n id: {\n value: raw.id,\n enumerable: false,\n },\n _raw: { value: raw, enumerable: false },\n });\n\n if (init) {\n instance.push(...init);\n }\n return instance;\n }\n\n /**\n * Push items to this `CoFeed`\n *\n * Items are appended to the current session's log. Each session (tab, device, app instance)\n * maintains its own append-only log, which is then aggregated into the per-account view.\n *\n * @example\n * ```ts\n * // Adds items to current session's log\n * feed.push(\"item1\", \"item2\");\n *\n * // View items from current session\n * console.log(feed.inCurrentSession);\n *\n * // View aggregated items from all sessions for current account\n * console.log(feed.byMe);\n * ```\n *\n * @category Content\n */\n push(...items: Item[]) {\n for (const item of items) {\n this.pushItem(item);\n }\n }\n\n private pushItem(item: Item) {\n const itemDescriptor = this._schema[ItemsSym] as Schema;\n\n if (itemDescriptor === \"json\") {\n this._raw.push(item as JsonValue);\n } else if (\"encoded\" in itemDescriptor) {\n this._raw.push(itemDescriptor.encoded.encode(item));\n } else if (isRefEncoded(itemDescriptor)) {\n this._raw.push((item as unknown as CoValue).id);\n }\n }\n\n /**\n * Get a JSON representation of the `CoFeed`\n * @category\n */\n toJSON(): {\n id: string;\n _type: \"CoStream\";\n [key: string]: unknown;\n in: { [key: string]: unknown };\n } {\n const itemDescriptor = this._schema[ItemsSym] as Schema;\n const mapper =\n itemDescriptor === \"json\"\n ? (v: unknown) => v\n : \"encoded\" in itemDescriptor\n ? itemDescriptor.encoded.encode\n : (v: unknown) => v && (v as CoValue).id;\n\n return {\n id: this.id,\n _type: this._type,\n ...Object.fromEntries(\n Object.entries(this).map(([account, entry]) => [\n account,\n mapper(entry.value),\n ]),\n ),\n in: Object.fromEntries(\n Object.entries(this.perSession).map(([session, entry]) => [\n session,\n mapper(entry.value),\n ]),\n ),\n };\n }\n\n /** @internal */\n [inspect](): {\n id: string;\n _type: \"CoStream\";\n [key: string]: unknown;\n in: { [key: string]: unknown };\n } {\n return this.toJSON();\n }\n\n /** @internal */\n static schema<V extends CoFeed>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this: { new (...args: any): V } & typeof CoFeed,\n def: { [ItemsSym]: V[\"_schema\"][ItemsSym] },\n ) {\n this._schema ||= {};\n Object.assign(this._schema, def);\n }\n\n /**\n * Load a `CoFeed`\n * @category Subscription & Loading\n */\n static load<S extends CoFeed, Depth>(\n this: CoValueClass<S>,\n id: ID<S>,\n as: Account,\n depth: Depth & DepthsIn<S>,\n ): Promise<DeeplyLoaded<S, Depth> | undefined> {\n return loadCoValue(this, id, as, depth);\n }\n\n /**\n * Subscribe to a `CoFeed`, when you have an ID but don't have a `CoFeed` instance yet\n * @category Subscription & Loading\n */\n static subscribe<S extends CoFeed, Depth>(\n this: CoValueClass<S>,\n id: ID<S>,\n as: Account,\n depth: Depth & DepthsIn<S>,\n listener: (value: DeeplyLoaded<S, Depth>) => void,\n ): () => void {\n return subscribeToCoValue<S, Depth>(this, id, as, depth, listener);\n }\n\n /**\n * Ensure a `CoFeed` is loaded to the specified depth\n *\n * @returns A new instance of the same CoFeed that's loaded to the specified depth,\n * or undefined if it cannot be loaded that deeply\n * @category Subscription & Loading\n */\n ensureLoaded<S extends CoFeed, Depth>(\n this: S,\n depth: Depth & DepthsIn<S>,\n ): Promise<DeeplyLoaded<S, Depth> | undefined> {\n return ensureCoValueLoaded(this, depth);\n }\n\n /**\n * An instance method to subscribe to an existing `CoFeed`\n *\n * No need to provide an ID or Account since they're already part of the instance.\n * @category Subscription & Loading\n */\n subscribe<S extends CoFeed, Depth>(\n this: S,\n depth: Depth & DepthsIn<S>,\n listener: (value: DeeplyLoaded<S, Depth>) => void,\n ): () => void {\n return subscribeToExistingCoValue(this, depth, listener);\n }\n\n /**\n * Wait for the `CoFeed` to be uploaded to the other peers.\n *\n * @category Subscription & Loading\n */\n waitForSync(options?: {\n timeout?: number;\n }) {\n return this._raw.core.waitForSync(options);\n }\n}\n\n/**\n * Converts a raw stream entry into a formatted CoFeed entry with proper typing and accessors.\n * @internal\n */\nfunction entryFromRawEntry<Item>(\n accessFrom: CoValue,\n rawEntry: {\n by: RawAccountID | AgentID;\n tx: CojsonInternalTypes.TransactionID;\n at: Date;\n value: JsonValue;\n },\n loadedAs: Account | AnonymousJazzAgent,\n accountID: ID<Account> | undefined,\n itemField: Schema,\n): Omit<CoFeedEntry<Item>, \"all\"> {\n return {\n get value(): NonNullable<Item> extends CoValue\n ? (CoValue & Item) | null\n : Item {\n if (itemField === \"json\") {\n return rawEntry.value as NonNullable<Item> extends CoValue\n ? (CoValue & Item) | null\n : Item;\n } else if (\"encoded\" in itemField) {\n return itemField.encoded.decode(rawEntry.value);\n } else if (isRefEncoded(itemField)) {\n return this.ref?.accessFrom(\n accessFrom,\n rawEntry.by + rawEntry.tx.sessionID + rawEntry.tx.txIndex + \".value\",\n ) as NonNullable<Item> extends CoValue ? (CoValue & Item) | null : Item;\n } else {\n throw new Error(\"Invalid item field schema\");\n }\n },\n get ref(): NonNullable<Item> extends CoValue\n ? Ref<NonNullable<Item>>\n : never {\n if (itemField !== \"json\" && isRefEncoded(itemField)) {\n const rawId = rawEntry.value;\n return new Ref(\n rawId as unknown as ID<CoValue>,\n loadedAs,\n itemField,\n ) as NonNullable<Item> extends CoValue ? Ref<NonNullable<Item>> : never;\n } else {\n return undefined as never;\n }\n },\n get by() {\n return (\n accountID &&\n new Ref<Account>(accountID as unknown as ID<Account>, loadedAs, {\n ref: RegisteredSchemas[\"Account\"],\n optional: false,\n })?.accessFrom(\n accessFrom,\n rawEntry.by + rawEntry.tx.sessionID + rawEntry.tx.txIndex + \".by\",\n )\n );\n },\n madeAt: rawEntry.at,\n tx: rawEntry.tx,\n };\n}\n\n/**\n * The proxy handler for `CoFeed` instances\n * @internal\n */\nexport const CoStreamProxyHandler: ProxyHandler<CoFeed> = {\n get(target, key, receiver) {\n if (typeof key === \"string\" && key.startsWith(\"co_\")) {\n const rawEntry = target._raw.lastItemBy(key as RawAccountID);\n\n if (!rawEntry) return;\n const entry = entryFromRawEntry(\n receiver,\n rawEntry,\n target._loadedAs,\n key as unknown as ID<Account>,\n target._schema[ItemsSym],\n );\n\n Object.defineProperty(entry, \"all\", {\n get: () => {\n const allRawEntries = target._raw.itemsBy(key as RawAccountID);\n return (function* () {\n while (true) {\n const rawEntry = allRawEntries.next();\n if (rawEntry.done) return;\n yield entryFromRawEntry(\n receiver,\n rawEntry.value,\n target._loadedAs,\n key as unknown as ID<Account>,\n target._schema[ItemsSym],\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n })() satisfies IterableIterator<SingleCoFeedEntry<any>>;\n },\n });\n\n return entry;\n } else if (key === \"perSession\") {\n return new Proxy({}, CoStreamPerSessionProxyHandler(target, receiver));\n } else {\n return Reflect.get(target, key, receiver);\n }\n },\n set(target, key, value, receiver) {\n if (key === ItemsSym && typeof value === \"object\" && SchemaInit in value) {\n (target.constructor as typeof CoFeed)._schema ||= {};\n (target.constructor as typeof CoFeed)._schema[ItemsSym] =\n value[SchemaInit];\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n },\n defineProperty(target, key, descriptor) {\n if (\n descriptor.value &&\n key === ItemsSym &&\n typeof descriptor.value === \"object\" &&\n SchemaInit in descriptor.value\n ) {\n (target.constructor as typeof CoFeed)._schema ||= {};\n (target.constructor as typeof CoFeed)._schema[ItemsSym] =\n descriptor.value[SchemaInit];\n return true;\n } else {\n return Reflect.defineProperty(target, key, descriptor);\n }\n },\n ownKeys(target) {\n const keys = Reflect.ownKeys(target);\n\n for (const accountID of target._raw.accounts()) {\n keys.push(accountID);\n }\n\n return keys;\n },\n getOwnPropertyDescriptor(target, key) {\n if (typeof key === \"string\" && key.startsWith(\"co_\")) {\n return {\n configurable: true,\n enumerable: true,\n writable: false,\n };\n } else {\n return Reflect.getOwnPropertyDescriptor(target, key);\n }\n },\n};\n\n/**\n * The proxy handler for the per-session view of a `CoFeed`\n * @internal\n */\nconst CoStreamPerSessionProxyHandler = (\n innerTarget: CoFeed,\n accessFrom: CoFeed,\n): ProxyHandler<Record<string, never>> => ({\n get(_target, key, receiver) {\n if (typeof key === \"string\" && key.includes(\"session\")) {\n const sessionID = key as SessionID;\n const rawEntry = innerTarget._raw.lastItemIn(sessionID);\n\n if (!rawEntry) return;\n const by = cojsonInternals.accountOrAgentIDfromSessionID(sessionID);\n\n const entry = entryFromRawEntry(\n accessFrom,\n rawEntry,\n innerTarget._loadedAs,\n cojsonInternals.isAccountID(by)\n ? (by as unknown as ID<Account>)\n : undefined,\n innerTarget._schema[ItemsSym],\n );\n\n Object.defineProperty(entry, \"all\", {\n get: () => {\n const allRawEntries = innerTarget._raw.itemsIn(sessionID);\n return (function* () {\n while (true) {\n const rawEntry = allRawEntries.next();\n if (rawEntry.done) return;\n yield entryFromRawEntry(\n accessFrom,\n rawEntry.value,\n innerTarget._loadedAs,\n cojsonInternals.isAccountID(by)\n ? (by as unknown as ID<Account>)\n : undefined,\n innerTarget._schema[ItemsSym],\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n })() satisfies IterableIterator<SingleCoFeedEntry<any>>;\n },\n });\n\n return entry;\n } else {\n return Reflect.get(innerTarget, key, receiver);\n }\n },\n ownKeys() {\n return innerTarget._raw.sessions();\n },\n getOwnPropertyDescriptor(target, key) {\n if (typeof key === \"string\" && key.startsWith(\"co_\")) {\n return {\n configurable: true,\n enumerable: true,\n writable: false,\n };\n } else {\n return Reflect.getOwnPropertyDescriptor(target, key);\n }\n },\n});\n\n/** @deprecated Use FileStream instead */\nexport { FileStream as BinaryCoStream };\n\n/**\n * FileStreams are `CoFeed`s that contain binary data, collaborative versions of `Blob`s.\n *\n * @categoryDescription Declaration\n * `FileStream` can be referenced in schemas.\n *\n * ```ts\n * import { co, FileStream } from \"jazz-tools\";\n *\n * class MyCoMap extends CoMap {\n * file = co.ref(FileStream);\n * }\n * ```\n *\n * @category CoValues\n */\nexport class FileStream extends CoValueBase implements CoValue {\n /**\n * The ID of this `FileStream`\n * @category Content\n */\n declare id: ID<this>;\n /** @category Type Helpers */\n declare _type: \"BinaryCoStream\";\n /** @internal */\n declare _raw: RawBinaryCoStream;\n\n constructor(\n options:\n | {\n owner: Account | Group;\n }\n | {\n fromRaw: RawBinaryCoStream;\n },\n ) {\n super();\n\n let raw: RawBinaryCoStream;\n\n if (\"fromRaw\" in options) {\n raw = options.fromRaw;\n } else {\n const rawOwner = options.owner._raw;\n raw = rawOwner.createBinaryStream();\n }\n\n Object.defineProperties(this, {\n id: {\n value: raw.id,\n enumerable: false,\n },\n _type: { value: \"BinaryCoStream\", enumerable: false },\n _raw: { value: raw, enumerable: false },\n });\n }\n\n static create<S extends FileStream>(\n this: CoValueClass<S>,\n options: { owner: Account | Group } | Account | Group,\n ) {\n return new this(parseCoValueCreateOptions(options));\n }\n\n getChunks(options?: {\n allowUnfinished?: boolean;\n }):\n | (BinaryStreamInfo & { chunks: Uint8Array[]; finished: boolean })\n | undefined {\n return this._raw.getBinaryChunks(options?.allowUnfinished);\n }\n\n isBinaryStreamEnded(): boolean {\n return this._raw.isBinaryStreamEnded();\n }\n\n start(options: BinaryStreamInfo): void {\n this._raw.startBinaryStream(options);\n }\n\n push(data: Uint8Array): void {\n this._raw.pushBinaryStreamChunk(data);\n }\n\n end(): void {\n this._raw.endBinaryStream();\n }\n\n toBlob(options?: { allowUnfinished?: boolean }): Blob | undefined {\n const chunks = this.getChunks({\n allowUnfinished: options?.allowUnfinished,\n });\n\n if (!chunks) {\n return undefined;\n }\n\n // @ts-ignore\n return new Blob(chunks.chunks, { type: chunks.mimeType });\n }\n\n /**\n * Load a `FileStream` as a `Blob`\n *\n * @category Content\n */\n static async loadAsBlob(\n id: ID<FileStream>,\n as: Account,\n options?: {\n allowUnfinished?: boolean;\n },\n ): Promise<Blob | undefined> {\n let stream = await this.load(id, as, []);\n\n /**\n * If the user hasn't requested an incomplete blob and the\n * stream isn't complete wait for the stream download before progressing\n */\n if (!options?.allowUnfinished && !stream?.isBinaryStreamEnded()) {\n stream = await new Promise<FileStream>((resolve) => {\n subscribeToCoValue(this, id, as, [], (value, unsubscribe) => {\n if (value.isBinaryStreamEnded()) {\n unsubscribe();\n resolve(value);\n }\n });\n });\n }\n\n return stream?.toBlob({\n allowUnfinished: options?.allowUnfinished,\n });\n }\n\n /**\n * Create a `FileStream` from a `Blob` or `File`\n *\n * @example\n * ```ts\n * import { co, FileStream } from \"jazz-tools\";\n *\n * const fileStream = await FileStream.createFromBlob(file, {owner: group})\n * ```\n * @category Content\n */\n static async createFromBlob(\n blob: Blob | File,\n options:\n | {\n owner: Group | Account;\n onProgress?: (progress: number) => void;\n }\n | Account\n | Group,\n ): Promise<FileStream> {\n const stream = this.create(options);\n const onProgress = \"onProgress\" in options ? options.onProgress : undefined;\n\n const start = Date.now();\n\n const data = new Uint8Array(await blob.arrayBuffer());\n stream.start({\n mimeType: blob.type,\n totalSizeBytes: blob.size,\n fileName: blob instanceof File ? blob.name : undefined,\n });\n const chunkSize = MAX_RECOMMENDED_TX_SIZE;\n\n let lastProgressUpdate = Date.now();\n\n for (let idx = 0; idx < data.length; idx += chunkSize) {\n stream.push(data.slice(idx, idx + chunkSize));\n\n if (Date.now() - lastProgressUpdate > 100) {\n onProgress?.(idx / data.length);\n lastProgressUpdate = Date.now();\n }\n\n await new Promise((resolve) => setTimeout(resolve, 0));\n }\n stream.end();\n const end = Date.now();\n\n console.debug(\n \"Finished creating binary stream in\",\n (end - start) / 1000,\n \"s - Throughput in MB/s\",\n (1000 * (blob.size / (end - start))) / (1024 * 1024),\n );\n onProgress?.(1);\n\n return stream;\n }\n\n /**\n * Get a JSON representation of the `FileStream`\n * @category Content\n */\n toJSON(): {\n id: string;\n _type: \"BinaryCoStream\";\n mimeType?: string;\n totalSizeBytes?: number;\n fileName?: string;\n chunks?: Uint8Array[];\n finished?: boolean;\n } {\n return {\n id: this.id,\n _type: this._type,\n ...this.getChunks(),\n };\n }\n\n /** @internal */\n [inspect]() {\n return this.toJSON();\n }\n\n /**\n * Load a `FileStream`\n * @category Subscription & Loading\n */\n static load<B extends FileStream, Depth>(\n this: CoValueClass<B>,\n id: ID<B>,\n as: Account,\n depth: Depth & DepthsIn<B>,\n ): Promise<DeeplyLoaded<B, Depth> | undefined> {\n return loadCoValue(this, id, as, depth);\n }\n\n /**\n * Subscribe to a `FileStream`, when you have an ID but don't have a `FileStream` instance yet\n * @category Subscription & Loading\n */\n static subscribe<B extends FileStream, Depth>(\n this: CoValueClass<B>,\n id: ID<B>,\n as: Account,\n depth: Depth & DepthsIn<B>,\n listener: (value: DeeplyLoaded<B, Depth>) => void,\n ): () => void {\n return subscribeToCoValue<B, Depth>(this, id, as, depth, listener);\n }\n\n ensureLoaded<B extends FileStream, Depth>(\n this: B,\n depth: Depth & DepthsIn<B>,\n ): Promise<DeeplyLoaded<B, Depth> | undefined> {\n return ensureCoValueLoaded(this, depth);\n }\n\n /**\n * An instance method to subscribe to an existing `FileStream`\n * @category Subscription & Loading\n */\n subscribe<B extends FileStream, Depth>(\n this: B,\n depth: Depth & DepthsIn<B>,\n listener: (value: DeeplyLoaded<B, Depth>) => void,\n ): () => void {\n return subscribeToExistingCoValue(this, depth, listener);\n }\n\n /**\n * Wait for the `FileStream` to be uploaded to the other peers.\n *\n * @category Subscription & Loading\n */\n waitForSync(options?: { timeout?: number }) {\n return this._raw.core.waitForSync(options);\n }\n}\n","import type { JsonValue, RawCoList } from \"cojson\";\nimport { RawAccount } from \"cojson\";\nimport type {\n CoValue,\n CoValueClass,\n CoValueFromRaw,\n DeeplyLoaded,\n DepthsIn,\n ID,\n RefEncoded,\n Schema,\n SchemaFor,\n UnCo,\n} from \"../internal.js\";\nimport {\n AnonymousJazzAgent,\n ItemsSym,\n Ref,\n SchemaInit,\n co,\n ensureCoValueLoaded,\n inspect,\n isRefEncoded,\n loadCoValue,\n makeRefs,\n parseCoValueCreateOptions,\n subscribeToCoValue,\n subscribeToExistingCoValue,\n subscriptionsScopes,\n} from \"../internal.js\";\nimport { coValuesCache } from \"../lib/cache.js\";\nimport { type Account } from \"./account.js\";\nimport { type Group } from \"./group.js\";\nimport { RegisteredSchemas } from \"./registeredSchemas.js\";\n\n/**\n * CoLists are collaborative versions of plain arrays.\n *\n * @categoryDescription Content\n * You can access items on a `CoList` as if they were normal items on a plain array, using `[]` notation, etc.\n *\n * Since `CoList` is a subclass of `Array`, you can use all the normal array methods like `push`, `pop`, `splice`, etc.\n *\n * ```ts\n * colorList[0];\n * colorList[3] = \"yellow\";\n * colorList.push(\"Kawazaki Green\");\n * colorList.splice(1, 1);\n * ```\n *\n * @category CoValues\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class CoList<Item = any> extends Array<Item> implements CoValue {\n /**\n * Declare a `CoList` by subclassing `CoList.Of(...)` and passing the item schema using `co`.\n *\n * @example\n * ```ts\n * class ColorList extends CoList.Of(\n * co.string\n * ) {}\n * class AnimalList extends CoList.Of(\n * co.ref(Animal)\n * ) {}\n * ```\n *\n * @category Declaration\n */\n static Of<Item>(item: Item): typeof CoList<Item> {\n // TODO: cache superclass for item class\n return class CoListOf extends CoList<Item> {\n [co.items] = item;\n };\n }\n\n /**\n * @ignore\n * @deprecated Use UPPERCASE `CoList.Of` instead! */\n static of(..._args: never): never {\n throw new Error(\"Can't use Array.of with CoLists\");\n }\n\n /**\n * The ID of this `CoList`\n * @category Content */\n declare id: ID<this>;\n /** @category Type Helpers */\n declare _type: \"CoList\";\n static {\n this.prototype._type = \"CoList\";\n }\n /** @category Internals */\n declare _raw: RawCoList;\n /** @category Internals */\n declare _instanceID: string;\n\n /** @internal This is only a marker type and doesn't exist at runtime */\n [ItemsSym]!: Item;\n /** @internal */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static _schema: any;\n /** @internal */\n get _schema(): {\n [ItemsSym]: SchemaFor<Item>;\n } {\n return (this.constructor as typeof CoList)._schema;\n }\n\n /** @category Collaboration */\n get _owner(): Account | Group {\n return this._raw.group instanceof RawAccount\n ? RegisteredSchemas[\"Account\"].fromRaw(this._raw.group)\n : RegisteredSchemas[\"Group\"].fromRaw(this._raw.group);\n }\n\n /**\n * If a `CoList`'s items are a `co.ref(...)`, you can use `coList._refs[i]` to access\n * the `Ref` instead of the potentially loaded/null value.\n *\n * This allows you to always get the ID or load the value manually.\n *\n * @example\n * ```ts\n * animals._refs[0].id; // => ID<Animal>\n * animals._refs[0].value;\n * // => Animal | null\n * const animal = await animals._refs[0].load();\n * ```\n *\n * @category Content\n **/\n get _refs(): {\n [idx: number]: Exclude<Item, null> extends CoValue\n ? Ref<UnCo<Exclude<Item, null>>>\n : never;\n } & {\n length: number;\n [Symbol.iterator](): IterableIterator<\n Exclude<Item, null> extends CoValue ? Ref<Exclude<Item, null>> : never\n >;\n } {\n return makeRefs<number>(\n (idx) => this._raw.get(idx) as unknown as ID<CoValue>,\n () => Array.from({ length: this._raw.entries().length }, (_, idx) => idx),\n this._loadedAs,\n (_idx) => this._schema[ItemsSym] as RefEncoded<CoValue>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ) as any;\n }\n\n get _edits(): {\n [idx: number]: {\n value?: Item;\n ref?: Item extends CoValue ? Ref<Item> : never;\n by?: Account;\n madeAt: Date;\n };\n } {\n throw new Error(\"Not implemented\");\n }\n\n get _loadedAs() {\n const rawAccount = this._raw.core.node.account;\n\n if (rawAccount instanceof RawAccount) {\n return coValuesCache.get(rawAccount, () =>\n RegisteredSchemas[\"Account\"].fromRaw(rawAccount),\n );\n }\n\n return new AnonymousJazzAgent(this._raw.core.node);\n }\n\n static get [Symbol.species]() {\n return Array;\n }\n\n constructor(options: { fromRaw: RawCoList } | undefined) {\n super();\n\n Object.defineProperty(this, \"_instanceID\", {\n value: `instance-${Math.random().toString(36).slice(2)}`,\n enumerable: false,\n });\n\n if (options && \"fromRaw\" in options) {\n Object.defineProperties(this, {\n id: {\n value: options.fromRaw.id,\n enumerable: false,\n },\n _raw: { value: options.fromRaw, enumerable: false },\n });\n }\n\n return new Proxy(this, CoListProxyHandler as ProxyHandler<this>);\n }\n\n /**\n * Create a new CoList with the given initial values and owner.\n *\n * The owner (a Group or Account) determines access rights to the CoMap.\n *\n * The CoList will immediately be persisted and synced to connected peers.\n *\n * @example\n * ```ts\n * const colours = ColorList.create(\n * [\"red\", \"green\", \"blue\"],\n * { owner: me }\n * );\n * const animals = AnimalList.create(\n * [cat, dog, fish],\n * { owner: me }\n * );\n * ```\n *\n * @category Creation\n **/\n static create<L extends CoList>(\n this: CoValueClass<L>,\n items: UnCo<L[number]>[],\n options: { owner: Account | Group } | Account | Group,\n ) {\n const { owner } = parseCoValueCreateOptions(options);\n const instance = new this({ init: items, owner });\n const raw = owner._raw.createList(\n toRawItems(items, instance._schema[ItemsSym]),\n );\n\n Object.defineProperties(instance, {\n id: {\n value: raw.id,\n enumerable: false,\n },\n _raw: { value: raw, enumerable: false },\n });\n\n return instance;\n }\n\n push(...items: Item[]): number {\n this._raw.appendItems(\n toRawItems(items, this._schema[ItemsSym]),\n undefined,\n \"private\",\n );\n\n return this._raw.entries().length;\n }\n\n unshift(...items: Item[]): number {\n for (const item of toRawItems(items as Item[], this._schema[ItemsSym])) {\n this._raw.prepend(item);\n }\n\n return this._raw.entries().length;\n }\n\n pop(): Item | undefined {\n const last = this[this.length - 1];\n\n this._raw.delete(this.length - 1);\n\n return last;\n }\n\n shift(): Item | undefined {\n const first = this[0];\n\n this._raw.delete(0);\n\n return first;\n }\n\n splice(start: number, deleteCount: number, ...items: Item[]): Item[] {\n const deleted = this.slice(start, start + deleteCount);\n\n for (\n let idxToDelete = start + deleteCount - 1;\n idxToDelete >= start;\n idxToDelete--\n ) {\n this._raw.delete(idxToDelete);\n }\n\n let appendAfter = Math.max(start - 1, 0);\n for (const item of toRawItems(items as Item[], this._schema[ItemsSym])) {\n console.log(this._raw.asArray(), appendAfter);\n this._raw.append(item, appendAfter);\n appendAfter++;\n }\n\n return deleted;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n toJSON(_key?: string, seenAbove?: ID<CoValue>[]): any[] {\n const itemDescriptor = this._schema[ItemsSym] as Schema;\n if (itemDescriptor === \"json\") {\n return this._raw.asArray();\n } else if (\"encoded\" in itemDescriptor) {\n return this._raw.asArray().map((e) => itemDescriptor.encoded.encode(e));\n } else if (isRefEncoded(itemDescriptor)) {\n return this.map((item, idx) =>\n seenAbove?.includes((item as CoValue)?.id)\n ? { _circular: (item as CoValue).id }\n : (item as unknown as CoValue)?.toJSON(idx + \"\", [\n ...(seenAbove || []),\n this.id,\n ]),\n );\n } else {\n return [];\n }\n }\n\n [inspect]() {\n return this.toJSON();\n }\n\n /** @category Internals */\n static fromRaw<V extends CoList>(\n this: CoValueClass<V> & typeof CoList,\n raw: RawCoList,\n ) {\n return new this({ fromRaw: raw });\n }\n\n /** @internal */\n static schema<V extends CoList>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this: { new (...args: any): V } & typeof CoList,\n def: { [ItemsSym]: V[\"_schema\"][ItemsSym] },\n ) {\n this._schema ||= {};\n Object.assign(this._schema, def);\n }\n\n /**\n * Load a `CoList` with a given ID, as a given account.\n *\n * `depth` specifies if item CoValue references should be loaded as well before resolving.\n * The `DeeplyLoaded` return type guarantees that corresponding referenced CoValues are loaded to the specified depth.\n *\n * You can pass `[]` or for shallowly loading only this CoList, or `[itemDepth]` for recursively loading referenced CoValues.\n *\n * Check out the `load` methods on `CoMap`/`CoList`/`CoFeed`/`Group`/`Account` to see which depth structures are valid to nest.\n *\n * @example\n * ```ts\n * const animalsWithVets =\n * await ListOfAnimals.load(\n * \"co_zdsMhHtfG6VNKt7RqPUPvUtN2Ax\",\n * me,\n * [{ vet: {} }]\n * );\n * ```\n *\n * @category Subscription & Loading\n */\n static load<L extends CoList, Depth>(\n this: CoValueClass<L>,\n id: ID<L>,\n as: Account,\n depth: Depth & DepthsIn<L>,\n ): Promise<DeeplyLoaded<L, Depth> | undefined> {\n return loadCoValue(this, id, as, depth);\n }\n\n /**\n * Load and subscribe to a `CoList` with a given ID, as a given account.\n *\n * Automatically also subscribes to updates to all referenced/nested CoValues as soon as they are accessed in the listener.\n *\n * `depth` specifies if item CoValue references should be loaded as well before calling `listener` for the first time.\n * The `DeeplyLoaded` return type guarantees that corresponding referenced CoValues are loaded to the specified depth.\n *\n * You can pass `[]` or for shallowly loading only this CoList, or `[itemDepth]` for recursively loading referenced CoValues.\n *\n * Check out the `load` methods on `CoMap`/`CoList`/`CoFeed`/`Group`/`Account` to see which depth structures are valid to nest.\n *\n * Returns an unsubscribe function that you should call when you no longer need updates.\n *\n * Also see the `useCoState` hook to reactively subscribe to a CoValue in a React component.\n *\n * @example\n * ```ts\n * const unsub = ListOfAnimals.subscribe(\n * \"co_zdsMhHtfG6VNKt7RqPUPvUtN2Ax\",\n * me,\n * { vet: {} },\n * (animalsWithVets) => console.log(animalsWithVets)\n * );\n * ```\n *\n * @category Subscription & Loading\n */\n static subscribe<L extends CoList, Depth>(\n this: CoValueClass<L>,\n id: ID<L>,\n as: Account,\n depth: Depth & DepthsIn<L>,\n listener: (value: DeeplyLoaded<L, Depth>) => void,\n ): () => void {\n return subscribeToCoValue<L, Depth>(this, id, as, depth, listener);\n }\n\n /**\n * Given an already loaded `CoList`, ensure that items are loaded to the specified depth.\n *\n * Works like `CoList.load()`, but you don't need to pass the ID or the account to load as again.\n *\n * @category Subscription & Loading\n */\n ensureLoaded<L extends CoList, Depth>(\n this: L,\n depth: Depth & DepthsIn<L>,\n ): Promise<DeeplyLoaded<L, Depth> | undefined> {\n return ensureCoValueLoaded(this, depth);\n }\n\n /**\n * Given an already loaded `CoList`, subscribe to updates to the `CoList` and ensure that items are loaded to the specified depth.\n *\n * Works like `CoList.subscribe()`, but you don't need to pass the ID or the account to load as again.\n *\n * Returns an unsubscribe function that you should call when you no longer need updates.\n *\n * @category Subscription & Loading\n **/\n subscribe<L extends CoList, Depth>(\n this: L,\n depth: Depth & DepthsIn<L>,\n listener: (value: DeeplyLoaded<L, Depth>) => void,\n ): () => void {\n return subscribeToExistingCoValue(this, depth, listener);\n }\n\n /** @category Type Helpers */\n castAs<Cl extends CoValueClass & CoValueFromRaw<CoValue>>(\n cl: Cl,\n ): InstanceType<Cl> {\n const casted = cl.fromRaw(this._raw) as InstanceType<Cl>;\n const subscriptionScope = subscriptionsScopes.get(this);\n if (subscriptionScope) {\n subscriptionsScopes.set(casted, subscriptionScope);\n }\n return casted;\n }\n\n /**\n * Wait for the `CoList` to be uploaded to the other peers.\n *\n * @category Subscription & Loading\n */\n waitForSync(options?: { timeout?: number }) {\n return this._raw.core.waitForSync(options);\n }\n}\n\nfunction toRawItems<Item>(items: Item[], itemDescriptor: Schema) {\n const rawItems =\n itemDescriptor === \"json\"\n ? (items as JsonValue[])\n : \"encoded\" in itemDescriptor\n ? items?.map((e) => itemDescriptor.encoded.encode(e))\n : isRefEncoded(itemDescriptor)\n ? items?.map((v) => (v as unknown as CoValue).id)\n : (() => {\n throw new Error(\"Invalid element descriptor\");\n })();\n return rawItems;\n}\n\nconst CoListProxyHandler: ProxyHandler<CoList> = {\n get(target, key, receiver) {\n if (typeof key === \"string\" && !isNaN(+key)) {\n const itemDescriptor = target._schema[ItemsSym] as Schema;\n const rawValue = target._raw.get(Number(key));\n if (itemDescriptor === \"json\") {\n return rawValue;\n } else if (\"encoded\" in itemDescriptor) {\n return rawValue === undefined\n ? undefined\n : itemDescriptor.encoded.decode(rawValue);\n } else if (isRefEncoded(itemDescriptor)) {\n return rawValue === undefined\n ? undefined\n : new Ref(\n rawValue as unknown as ID<CoValue>,\n target._loadedAs,\n itemDescriptor,\n ).accessFrom(receiver, Number(key));\n }\n } else if (key === \"length\") {\n return target._raw.entries().length;\n } else {\n return Reflect.get(target, key, receiver);\n }\n },\n set(target, key, value, receiver) {\n if (key === ItemsSym && typeof value === \"object\" && SchemaInit in value) {\n (target.constructor as typeof CoList)._schema ||= {};\n (target.constructor as typeof CoList)._schema[ItemsSym] =\n value[SchemaInit];\n return true;\n }\n if (typeof key === \"string\" && !isNaN(+key)) {\n const itemDescriptor = target._schema[ItemsSym] as Schema;\n let rawValue;\n if (itemDescriptor === \"json\") {\n rawValue = value;\n } else if (\"encoded\" in itemDescriptor) {\n rawValue = itemDescriptor.encoded.encode(value);\n } else if (isRefEncoded(itemDescriptor)) {\n rawValue = value.id;\n }\n target._raw.replace(Number(key), rawValue);\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n },\n defineProperty(target, key, descriptor) {\n if (\n descriptor.value &&\n key === ItemsSym &&\n typeof descriptor.value === \"object\" &&\n SchemaInit in descriptor.value\n ) {\n (target.constructor as typeof CoList)._schema ||= {};\n (target.constructor as typeof CoList)._schema[ItemsSym] =\n descriptor.value[SchemaInit];\n return true;\n } else {\n return Reflect.defineProperty(target, key, descriptor);\n }\n },\n has(target, key) {\n if (typeof key === \"string\" && !isNaN(+key)) {\n return Number(key) < target._raw.entries().length;\n } else {\n return Reflect.has(target, key);\n }\n },\n};\n","import { co, subscriptionsScopes } from \"../../internal.js\";\nimport { FileStream } from \"../coFeed.js\";\nimport { CoMap } from \"../coMap.js\";\n\n/** @category Media */\nexport class ImageDefinition extends CoMap {\n originalSize = co.json<[number, number]>();\n placeholderDataURL? = co.string;\n\n [co.items] = co.ref(FileStream);\n [res: `${number}x${number}`]: co<FileStream | null>;\n\n highestResAvailable(options?: {\n maxWidth?: number;\n }): { res: `${number}x${number}`; stream: FileStream } | undefined {\n if (!subscriptionsScopes.get(this)) {\n console.warn(\n \"highestResAvailable() only makes sense when used within a subscription.\",\n );\n }\n\n const resolutions = Object.keys(this).filter(\n (key) =>\n key.match(/^\\d+x\\d+$/) &&\n (options?.maxWidth === undefined ||\n Number(key.split(\"x\")[0]) <= options.maxWidth),\n ) as `${number}x${number}`[];\n\n resolutions.sort((a, b) => {\n const aWidth = Number(a.split(\"x\")[0]);\n const bWidth = Number(b.split(\"x\")[0]);\n return aWidth - bWidth;\n });\n\n let highestAvailableResolution: `${number}x${number}` | undefined;\n\n for (const resolution of resolutions) {\n if (this[resolution] && this[resolution]?.getChunks()) {\n highestAvailableResolution = resolution;\n } else {\n return (\n highestAvailableResolution && {\n res: highestAvailableResolution,\n stream: this[highestAvailableResolution]!,\n }\n );\n }\n }\n return (\n highestAvailableResolution && {\n res: highestAvailableResolution,\n stream: this[highestAvailableResolution]!,\n }\n );\n }\n}\n","import {\n CoValue,\n CoValueBase,\n CoValueClass,\n CoValueFromRaw,\n} from \"../internal.js\";\n\n/**\n * SchemaUnion allows you to create union types of CoValues that can be discriminated at runtime.\n *\n * @categoryDescription Declaration\n * Declare your union types by extending `SchemaUnion.Of(...)` and passing a discriminator function that determines which concrete type to use based on the raw data.\n *\n * ```ts\n * import { SchemaUnion, CoMap } from \"jazz-tools\";\n *\n * class BaseWidget extends CoMap {\n * type = co.string;\n * }\n *\n * class ButtonWidget extends BaseWidget {\n * type = co.literal(\"button\");\n * label = co.string;\n * }\n *\n * class SliderWidget extends BaseWidget {\n * type = co.literal(\"slider\");\n * min = co.number;\n * max = co.number;\n * }\n *\n * const WidgetUnion = SchemaUnion.Of<BaseWidget>((raw) => {\n * switch (raw.get(\"type\")) {\n * case \"button\": return ButtonWidget;\n * case \"slider\": return SliderWidget;\n * default: throw new Error(\"Unknown widget type\");\n * }\n * });\n * ```\n *\n * @category CoValues\n */\nexport abstract class SchemaUnion extends CoValueBase implements CoValue {\n /**\n * Create a new union type from a discriminator function.\n *\n * The discriminator function receives the raw data and should return the appropriate concrete class to use for that data.\n *\n * When loading a SchemaUnion, the correct subclass will be instantiated based on the discriminator.\n *\n * @param discriminator - Function that determines which concrete type to use\n * @returns A new class that can create/load instances of the union type\n *\n * @example\n * ```ts\n * const WidgetUnion = SchemaUnion.Of<BaseWidget>((raw) => {\n * switch (raw.get(\"type\")) {\n * case \"button\": return ButtonWidget;\n * case \"slider\": return SliderWidget;\n * default: throw new Error(\"Unknown widget type\");\n * }\n * });\n *\n * const widget = await loadCoValue(WidgetUnion, id, me, {});\n *\n * // You can narrow the returned instance to a subclass by using `instanceof`\n * if (widget instanceof ButtonWidget) {\n * console.log(widget.label);\n * } else if (widget instanceof SliderWidget) {\n * console.log(widget.min, widget.max);\n * }\n * ```\n *\n * @category Declaration\n **/\n static Of<V extends CoValue>(\n discriminator: (raw: V[\"_raw\"]) => CoValueClass<V> & CoValueFromRaw<V>,\n ): CoValueClass<V> & typeof SchemaUnion {\n return class SchemaUnionClass extends SchemaUnion {\n static override fromRaw<T extends CoValue>(\n this: CoValueClass<T> & CoValueFromRaw<T>,\n raw: T[\"_raw\"],\n ): T {\n const ResolvedClass = discriminator(\n raw as V[\"_raw\"],\n ) as unknown as CoValueClass<T> & CoValueFromRaw<T>;\n return ResolvedClass.fromRaw(raw);\n }\n } as unknown as CoValueClass<V> & typeof SchemaUnion;\n }\n\n /**\n * Create an instance from raw data. This is called internally and should not be used directly.\n * Use {@link SchemaUnion.Of} to create a union type instead.\n *\n * @internal\n */\n // @ts-ignore\n static fromRaw<V extends CoValue>(this: CoValueClass<V>, raw: V[\"_raw\"]): V {\n throw new Error(\"Not implemented\");\n }\n}\n"],"mappings":"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","names":["RawAccount","key","account","RawAccount","ref","subscription","RawAccount","RawAccount","message","rawEdit","_a","_b","LocalNode","RawAccount","cojsonInternals","RawAccount","LocalNode","cojsonInternals","ref","ref","cojsonInternals","_a","_b","rawEntry","cojsonInternals","RawAccount","_a","_b","RawAccount"]}
|