{"version":3,"file":"testing.mjs","names":[],"sources":["../../src/testing/test-messages.ts","../../src/testing/utils.ts","../../src/testing/test-peer.ts","../../src/testing/test-builder.ts","../../src/testing/test-edge-mesh.ts"],"sourcesContent":["//\n// Copyright 2022 DXOS.org\n//\n\nimport { type TaggedType } from '@dxos/codec-protobuf';\nimport { type TYPES } from '@dxos/protocols/proto';\n\nexport const PAYLOAD_1: TaggedType<TYPES, 'google.protobuf.Any'> = {\n  '@type': 'google.protobuf.Any',\n  'type_url': 'dxos.Example1',\n  'value': Buffer.from('1'),\n};\n\nexport const PAYLOAD_2: TaggedType<TYPES, 'google.protobuf.Any'> = {\n  '@type': 'google.protobuf.Any',\n  'type_url': 'dxos.Example2',\n  'value': Buffer.from('2'),\n};\n\nexport const PAYLOAD_3: TaggedType<TYPES, 'google.protobuf.Any'> = {\n  '@type': 'google.protobuf.Any',\n  'type_url': 'dxos.Example3',\n  'value': Buffer.from('3'),\n};\n","//\n// Copyright 2022 DXOS.org\n//\n\nimport { type Event, asyncTimeout } from '@dxos/async';\nimport { type Any } from '@dxos/codec-protobuf';\nimport { PublicKey } from '@dxos/keys';\n\nimport { type Message, type PeerInfo, type SignalMethods } from '../signal-methods';\nimport { PAYLOAD_1 } from './test-messages';\n\nexport const expectPeerAvailable = (client: SignalMethods, expectedTopic: PublicKey, peer: PeerInfo) =>\n  asyncTimeout(\n    client.swarmEvent.waitFor(\n      ({ peerAvailable, topic }) =>\n        !!peerAvailable && peer.peerKey === peerAvailable.peer.peerKey && expectedTopic.equals(topic),\n    ),\n    6000,\n  );\n\nexport const expectPeerLeft = (client: SignalMethods, expectedTopic: PublicKey, peer: PeerInfo) =>\n  asyncTimeout(\n    client.swarmEvent.waitFor(\n      ({ peerLeft, topic }) => !!peerLeft && peer.peerKey === peerLeft.peer.peerKey && expectedTopic.equals(topic),\n    ),\n    6000,\n  );\n\nexport const expectReceivedMessage = (event: Event<Message>, expectedMessage: Message) => {\n  return asyncTimeout(\n    event.waitFor(\n      (msg) =>\n        msg.author.peerKey === expectedMessage.author.peerKey &&\n        msg.recipient?.peerKey === expectedMessage.recipient?.peerKey &&\n        PublicKey.from(msg.payload.value).equals(expectedMessage.payload.value),\n    ),\n    5000,\n  );\n};\n\nexport const createMessage = (author: PeerInfo, recipient: PeerInfo, payload: Any = PAYLOAD_1): Message => ({\n  author,\n  recipient,\n  payload,\n});\n\nexport const messageEqual = (msg1: Message, msg2: Message) =>\n  msg1.author.peerKey === msg2.author.peerKey &&\n  msg1.recipient?.peerKey === msg2.recipient?.peerKey &&\n  PublicKey.from(msg1.payload.value).equals(msg2.payload.value);\n","//\n// Copyright 2022 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { Resource } from '@dxos/context';\nimport { createDidFromIdentityKey } from '@dxos/credentials';\nimport { PeerSchema } from '@dxos/edge-client';\nimport { invariant } from '@dxos/invariant';\nimport { type IdentityDid, PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { buf } from '@dxos/protocols/buf';\n\nimport { Messenger } from '../messenger';\nimport { type SignalManager } from '../signal-manager';\nimport { type Message, type PeerInfo } from '../signal-methods';\nimport { type TestBuilder } from './test-builder';\nimport { expectPeerAvailable, expectPeerLeft, expectReceivedMessage } from './utils';\n\nexport class TestPeer extends Resource {\n  /**\n   * Undefined until `_open()`: a `createSignalManager` factory (e.g. edge's) may install its own\n   * signer-backed key, otherwise a random one is generated. Read via {@link peerInfo} after opening.\n   */\n  public peerId?: PublicKey;\n  public signalManager!: SignalManager;\n  public messenger!: Messenger;\n  public defaultReceived = new Event<Message>();\n\n  /** DID derived from {@link peerId} in `_open()`, mirroring `createDeviceEdgeIdentity`. */\n  private _identityDid?: IdentityDid;\n\n  constructor(private readonly testBuilder: TestBuilder) {\n    super();\n  }\n\n  get peerInfo(): PeerInfo {\n    invariant(this.peerId && this._identityDid, 'TestPeer not open');\n    return buf.create(PeerSchema, { peerKey: this.peerId.toHex(), identityDid: this._identityDid });\n  }\n\n  async waitTillReceive(message: Message): Promise<Message> {\n    return expectReceivedMessage(this.defaultReceived, message);\n  }\n\n  async waitForPeerAvailable(topic: PublicKey, peer: PeerInfo) {\n    return expectPeerAvailable(this.signalManager, topic, peer);\n  }\n\n  async waitForPeerLeft(topic: PublicKey, peer: PeerInfo) {\n    return expectPeerLeft(this.signalManager, topic, peer);\n  }\n\n  protected override async _open(): Promise<void> {\n    // `createSignalManager` (e.g. edge's factory) may populate `peerId` with its own signer-backed\n    // key; otherwise fall back to a random one. Derive the DID only after `peerId` is settled.\n    this.signalManager = await this.testBuilder.createSignalManager(this);\n    this.peerId ??= PublicKey.random();\n    this._identityDid = await createDidFromIdentityKey(this.peerId);\n    this.messenger = new Messenger({ signalManager: this.signalManager, retryDelay: 300 });\n\n    await this.signalManager.open();\n    this.messenger.open();\n    await this.messenger\n      .listen({\n        peer: this.peerInfo,\n        onMessage: async (msg) => {\n          this.defaultReceived.emit(msg);\n        },\n      })\n      .catch((err) => log.catch(err));\n  }\n\n  protected override async _close(): Promise<void> {\n    await this.messenger.close();\n    await this.signalManager.close();\n  }\n}\n","//\n// Copyright 2022 DXOS.org\n//\n\nimport { type Context } from '@dxos/context';\n\nimport { MemorySignalManager, MemorySignalManagerContext, type SignalManager } from '../signal-manager';\nimport { type Message } from '../signal-methods';\nimport { TestPeer } from './test-peer';\n\nexport type TestBuilderOptions = {\n  signalManagerFactory?: (peer: TestPeer) => Promise<SignalManager>;\n  messageDisruption?: (msg: Message) => Message[];\n};\n\nexport class TestBuilder {\n  private _signalContext = new MemorySignalManagerContext();\n  private readonly _peers: TestPeer[] = [];\n\n  constructor(public options: TestBuilderOptions) {}\n\n  async createSignalManager(peer: TestPeer): Promise<SignalManager> {\n    const signalManager =\n      (await this.options.signalManagerFactory?.(peer)) ?? new MemorySignalManager(this._signalContext);\n\n    if (this.options.messageDisruption) {\n      // Imitates signal network disruptions (e. g. message doubling, ).\n      const trueSend = signalManager.sendMessage.bind(signalManager);\n      signalManager.sendMessage = async (ctx: Context, message: Message) => {\n        for (const msg of this.options.messageDisruption!(message)) {\n          await trueSend(ctx, msg);\n        }\n      };\n    }\n\n    return signalManager;\n  }\n\n  async createPeer(): Promise<TestPeer> {\n    const peer = new TestPeer(this);\n    await peer.open();\n    this._peers.push(peer);\n    return peer;\n  }\n\n  async createPeers(count: number): Promise<TestPeer[]> {\n    return Promise.all(Array.from({ length: count }, () => this.createPeer()));\n  }\n\n  async close(): Promise<void> {\n    await Promise.all(this._peers.map((peer) => peer.close()));\n  }\n}\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { type Context } from '@dxos/context';\nimport { type EdgeConnection, protocol } from '@dxos/edge-client';\nimport { EdgeService } from '@dxos/protocols';\nimport {\n  type Message,\n  SwarmRequest_Action as SwarmRequestAction,\n  SwarmRequestSchema,\n} from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\n/**\n * In-memory stand-in for the EDGE router + swarm, feature-complete for the messaging paths\n * {@link EdgeSignalManager} exercises: swarm membership (JOIN/LEAVE), tag subscriptions (SUBSCRIBE),\n * point-to-point relay, and tag broadcast fan-out (DX-1125). Multiple {@link TestEdgeConnection}s\n * attach to one mesh, so a broadcast from one client is delivered to the matching subscribers of\n * another — mirroring the real edge without a WebSocket or Durable Object.\n */\nexport class TestEdgeMesh {\n  /** peerKey -> connection. */\n  private readonly _connections = new Map<string, TestEdgeConnection>();\n  /** swarmKey -> (peerKey -> subscription tags). */\n  private readonly _subscriptions = new Map<string, Map<string, string[]>>();\n  /** swarmKey -> set of member peerKeys. */\n  private readonly _members = new Map<string, Set<string>>();\n\n  createConnection({ peerKey, identityDid }: { peerKey: string; identityDid: string }): TestEdgeConnection {\n    const connection = new TestEdgeConnection({ peerKey, identityDid, mesh: this });\n    this._connections.set(peerKey, connection);\n    return connection;\n  }\n\n  removeConnection(peerKey: string): void {\n    this._connections.delete(peerKey);\n    for (const members of this._members.values()) {\n      members.delete(peerKey);\n    }\n    for (const subs of this._subscriptions.values()) {\n      subs.delete(peerKey);\n    }\n  }\n\n  /** Handle a message sent by a client connection. */\n  receive(fromPeerKey: string, message: Message): void {\n    switch (message.serviceId) {\n      case EdgeService.SWARM:\n        this._handleSwarmRequest(fromPeerKey, message);\n        break;\n      case EdgeService.SIGNAL:\n        this._handleSignal(fromPeerKey, message);\n        break;\n    }\n  }\n\n  private _handleSwarmRequest(fromPeerKey: string, message: Message): void {\n    const request = protocol.getPayload(message, SwarmRequestSchema);\n    const swarmKeys = request.swarmKeys ?? [];\n    switch (request.action) {\n      case SwarmRequestAction.JOIN:\n        for (const swarmKey of swarmKeys) {\n          this._memberSet(swarmKey).add(fromPeerKey);\n        }\n        break;\n      case SwarmRequestAction.LEAVE:\n        for (const swarmKey of swarmKeys) {\n          this._memberSet(swarmKey).delete(fromPeerKey);\n          this._subscriptionMap(swarmKey).delete(fromPeerKey);\n        }\n        break;\n      case SwarmRequestAction.SUBSCRIBE:\n        // Set/replace this peer's broadcast subscription on each named swarm (DX-1125).\n        for (const swarmKey of swarmKeys) {\n          this._subscriptionMap(swarmKey).set(fromPeerKey, request.subscribeTags ?? []);\n        }\n        break;\n    }\n  }\n\n  private _handleSignal(fromPeerKey: string, message: Message): void {\n    const tags = message.tags ?? [];\n    const targets = message.target ?? [];\n\n    // Broadcast (DX-1125): tags present, no target -> fan out to matching subscribers on the swarm.\n    if (tags.length > 0 && targets.length === 0) {\n      const swarmKey = message.source?.swarmKey;\n      if (!swarmKey) {\n        return;\n      }\n      for (const [peerKey, subscriptionTags] of this._subscriptionMap(swarmKey)) {\n        if (peerKey === fromPeerKey) {\n          continue; // No self-delivery.\n        }\n        if (subscriptionTags.some((tag) => tags.includes(tag))) {\n          this._connections.get(peerKey)?.deliver(message);\n        }\n      }\n      return;\n    }\n\n    // Point-to-point relay.\n    for (const target of targets) {\n      if (target.peerKey) {\n        this._connections.get(target.peerKey)?.deliver(message);\n      }\n    }\n  }\n\n  private _memberSet(swarmKey: string): Set<string> {\n    let set = this._members.get(swarmKey);\n    if (!set) {\n      set = new Set();\n      this._members.set(swarmKey, set);\n    }\n    return set;\n  }\n\n  private _subscriptionMap(swarmKey: string): Map<string, string[]> {\n    let map = this._subscriptions.get(swarmKey);\n    if (!map) {\n      map = new Map();\n      this._subscriptions.set(swarmKey, map);\n    }\n    return map;\n  }\n}\n\n/**\n * In-memory {@link EdgeConnection} bound to a {@link TestEdgeMesh}. Only the members\n * {@link EdgeSignalManager} uses are functional; the rest are inert stubs.\n */\nexport class TestEdgeConnection implements EdgeConnection {\n  public readonly statusChanged: EdgeConnection['statusChanged'] = new Event<any>();\n  private readonly _messageListeners = new Set<(message: Message) => void>();\n  private readonly _peerKey: string;\n  private readonly _identityDid: string;\n  private readonly _mesh: TestEdgeMesh;\n\n  constructor({ peerKey, identityDid, mesh }: { peerKey: string; identityDid: string; mesh: TestEdgeMesh }) {\n    this._peerKey = peerKey;\n    this._identityDid = identityDid;\n    this._mesh = mesh;\n  }\n\n  get info(): any {\n    return { peerKey: this._peerKey, identityDid: this._identityDid };\n  }\n\n  get identityDid(): string {\n    return this._identityDid;\n  }\n\n  get peerKey(): string {\n    return this._peerKey;\n  }\n\n  get isOpen(): boolean {\n    return true;\n  }\n\n  get status(): EdgeConnection['status'] {\n    return {} as EdgeConnection['status'];\n  }\n\n  setIdentity(): void {}\n\n  async send(_ctx: Context, message: Message): Promise<void> {\n    this._mesh.receive(this._peerKey, message);\n  }\n\n  onMessage(listener: (message: Message) => void): () => void {\n    this._messageListeners.add(listener);\n    return () => this._messageListeners.delete(listener);\n  }\n\n  onReconnected(listener: () => void, opts?: { emitCurrentState?: boolean }): () => void {\n    if (opts?.emitCurrentState !== false) {\n      listener();\n    }\n    return () => {};\n  }\n\n  /** Deliver a message from the mesh to this connection's listeners. */\n  deliver(message: Message): void {\n    for (const listener of this._messageListeners) {\n      listener(message);\n    }\n  }\n\n  async open(): Promise<void> {}\n  async close(): Promise<void> {\n    this._mesh.removeConnection(this._peerKey);\n  }\n}\n"],"mappings":";;;;;;;;;;;;AAOA,IAAa,YAAsD;CACjE,SAAS;CACT,YAAY;CACZ,SAAS,OAAO,KAAK,GAAG;AAC1B;AAEA,IAAa,YAAsD;CACjE,SAAS;CACT,YAAY;CACZ,SAAS,OAAO,KAAK,GAAG;AAC1B;AAEA,IAAa,YAAsD;CACjE,SAAS;CACT,YAAY;CACZ,SAAS,OAAO,KAAK,GAAG;AAC1B;;;ACZA,IAAa,uBAAuB,QAAuB,eAA0B,SACnF,aACE,OAAO,WAAW,SACf,EAAE,eAAe,YAChB,CAAC,CAAC,iBAAiB,KAAK,YAAY,cAAc,KAAK,WAAW,cAAc,OAAO,KAAK,CAChG,GACA,GACF;AAEF,IAAa,kBAAkB,QAAuB,eAA0B,SAC9E,aACE,OAAO,WAAW,SACf,EAAE,UAAU,YAAY,CAAC,CAAC,YAAY,KAAK,YAAY,SAAS,KAAK,WAAW,cAAc,OAAO,KAAK,CAC7G,GACA,GACF;AAEF,IAAa,yBAAyB,OAAuB,oBAA6B;CACxF,OAAO,aACL,MAAM,SACH,QACC,IAAI,OAAO,YAAY,gBAAgB,OAAO,WAC9C,IAAI,WAAW,YAAY,gBAAgB,WAAW,WACtD,UAAU,KAAK,IAAI,QAAQ,KAAK,CAAC,CAAC,OAAO,gBAAgB,QAAQ,KAAK,CAC1E,GACA,GACF;AACF;AAEA,IAAa,iBAAiB,QAAkB,WAAqB,UAAe,eAAwB;CAC1G;CACA;CACA;AACF;AAEA,IAAa,gBAAgB,MAAe,SAC1C,KAAK,OAAO,YAAY,KAAK,OAAO,WACpC,KAAK,WAAW,YAAY,KAAK,WAAW,WAC5C,UAAU,KAAK,KAAK,QAAQ,KAAK,CAAC,CAAC,OAAO,KAAK,QAAQ,KAAK;;;;AC9B9D,IAAa,WAAb,cAA8B,SAAS;CAaR;;;;;CAR7B;CACA;CACA;CACA,kBAAyB,IAAI,MAAe;;CAG5C;CAEA,YAAY,aAA2C;EACrD,MAAM;EADqB,KAAA,cAAA;CAE7B;CAEA,IAAI,WAAqB;EACvB,UAAU,KAAK,UAAU,KAAK,cAAc,qBAAkB;GAAA,YAAA;GAAA,GAAA;GAAA,GAAA;GAAA,GAAA;GAAA,GAAA,CAAA,oCAAA,qBAAA;EAAA,CAAC;EAC/D,OAAO,IAAI,OAAO,YAAY;GAAE,SAAS,KAAK,OAAO,MAAM;GAAG,aAAa,KAAK;EAAa,CAAC;CAChG;CAEA,MAAM,gBAAgB,SAAoC;EACxD,OAAO,sBAAsB,KAAK,iBAAiB,OAAO;CAC5D;CAEA,MAAM,qBAAqB,OAAkB,MAAgB;EAC3D,OAAO,oBAAoB,KAAK,eAAe,OAAO,IAAI;CAC5D;CAEA,MAAM,gBAAgB,OAAkB,MAAgB;EACtD,OAAO,eAAe,KAAK,eAAe,OAAO,IAAI;CACvD;CAEA,MAAyB,QAAuB;EAG9C,KAAK,gBAAgB,MAAM,KAAK,YAAY,oBAAoB,IAAI;EACpE,KAAK,WAAW,UAAU,OAAO;EACjC,KAAK,eAAe,MAAM,yBAAyB,KAAK,MAAM;EAC9D,KAAK,YAAY,IAAI,UAAU;GAAE,eAAe,KAAK;GAAe,YAAY;EAAI,CAAC;EAErF,MAAM,KAAK,cAAc,KAAK;EAC9B,KAAK,UAAU,KAAK;EACpB,MAAM,KAAK,UACR,OAAO;GACN,MAAM,KAAK;GACX,WAAW,OAAO,QAAQ;IACxB,KAAK,gBAAgB,KAAK,GAAG;GAC/B;EACF,CAAC,CAAA,CACA,OAAO,QAAQ,IAAI,MAAM,KAAE,KAAA,GAAA;GAAA,YAAA;GAAA,GAAA;GAAA,GAAA;GAAA,GAAA;EAAA,CAAC,CAAC;CAClC;CAEA,MAAyB,SAAwB;EAC/C,MAAM,KAAK,UAAU,MAAM;EAC3B,MAAM,KAAK,cAAc,MAAM;CACjC;AACF;;;AC9DA,IAAa,cAAb,MAAyB;CAIJ;CAHnB,iBAAyB,IAAI,2BAA2B;CACxD,SAAsC,CAAC;CAEvC,YAAY,SAAoC;EAA7B,KAAA,UAAA;CAA8B;CAEjD,MAAM,oBAAoB,MAAwC;EAChE,MAAM,gBACH,MAAM,KAAK,QAAQ,uBAAuB,IAAI,KAAM,IAAI,oBAAoB,KAAK,cAAc;EAElG,IAAI,KAAK,QAAQ,mBAAmB;GAElC,MAAM,WAAW,cAAc,YAAY,KAAK,aAAa;GAC7D,cAAc,cAAc,OAAO,KAAc,YAAqB;IACpE,KAAK,MAAM,OAAO,KAAK,QAAQ,kBAAmB,OAAO,GACvD,MAAM,SAAS,KAAK,GAAG;GAE3B;EACF;EAEA,OAAO;CACT;CAEA,MAAM,aAAgC;EACpC,MAAM,OAAO,IAAI,SAAS,IAAI;EAC9B,MAAM,KAAK,KAAK;EAChB,KAAK,OAAO,KAAK,IAAI;EACrB,OAAO;CACT;CAEA,MAAM,YAAY,OAAoC;EACpD,OAAO,QAAQ,IAAI,MAAM,KAAK,EAAE,QAAQ,MAAM,SAAS,KAAK,WAAW,CAAC,CAAC;CAC3E;CAEA,MAAM,QAAuB;EAC3B,MAAM,QAAQ,IAAI,KAAK,OAAO,KAAK,SAAS,KAAK,MAAM,CAAC,CAAC;CAC3D;AACF;;;;;;;;;;AC/BA,IAAa,eAAb,MAA0B;;CAExB,+BAAgC,IAAI,IAAgC;;CAEpE,iCAAkC,IAAI,IAAmC;;CAEzE,2BAA4B,IAAI,IAAyB;CAEzD,iBAAiB,EAAE,SAAS,eAA6E;EACvG,MAAM,aAAa,IAAI,mBAAmB;GAAE;GAAS;GAAa,MAAM;EAAK,CAAC;EAC9E,KAAK,aAAa,IAAI,SAAS,UAAU;EACzC,OAAO;CACT;CAEA,iBAAiB,SAAuB;EACtC,KAAK,aAAa,OAAO,OAAO;EAChC,KAAK,MAAM,WAAW,KAAK,SAAS,OAAO,GACzC,QAAQ,OAAO,OAAO;EAExB,KAAK,MAAM,QAAQ,KAAK,eAAe,OAAO,GAC5C,KAAK,OAAO,OAAO;CAEvB;;CAGA,QAAQ,aAAqB,SAAwB;EACnD,QAAQ,QAAQ,WAAhB;GACE,KAAK,YAAY;IACf,KAAK,oBAAoB,aAAa,OAAO;IAC7C;GACF,KAAK,YAAY;IACf,KAAK,cAAc,aAAa,OAAO;IACvC;EACJ;CACF;CAEA,oBAA4B,aAAqB,SAAwB;EACvE,MAAM,UAAU,SAAS,WAAW,SAAS,kBAAkB;EAC/D,MAAM,YAAY,QAAQ,aAAa,CAAC;EACxC,QAAQ,QAAQ,QAAhB;GACE,KAAK,oBAAmB;IACtB,KAAK,MAAM,YAAY,WACrB,KAAK,WAAW,QAAQ,CAAC,CAAC,IAAI,WAAW;IAE3C;GACF,KAAK,oBAAmB;IACtB,KAAK,MAAM,YAAY,WAAW;KAChC,KAAK,WAAW,QAAQ,CAAC,CAAC,OAAO,WAAW;KAC5C,KAAK,iBAAiB,QAAQ,CAAC,CAAC,OAAO,WAAW;IACpD;IACA;GACF,KAAK,oBAAmB;IAEtB,KAAK,MAAM,YAAY,WACrB,KAAK,iBAAiB,QAAQ,CAAC,CAAC,IAAI,aAAa,QAAQ,iBAAiB,CAAC,CAAC;IAE9E;EACJ;CACF;CAEA,cAAsB,aAAqB,SAAwB;EACjE,MAAM,OAAO,QAAQ,QAAQ,CAAC;EAC9B,MAAM,UAAU,QAAQ,UAAU,CAAC;EAGnC,IAAI,KAAK,SAAS,KAAK,QAAQ,WAAW,GAAG;GAC3C,MAAM,WAAW,QAAQ,QAAQ;GACjC,IAAI,CAAC,UACH;GAEF,KAAK,MAAM,CAAC,SAAS,qBAAqB,KAAK,iBAAiB,QAAQ,GAAG;IACzE,IAAI,YAAY,aACd;IAEF,IAAI,iBAAiB,MAAM,QAAQ,KAAK,SAAS,GAAG,CAAC,GACnD,KAAK,aAAa,IAAI,OAAO,CAAC,EAAE,QAAQ,OAAO;GAEnD;GACA;EACF;EAGA,KAAK,MAAM,UAAU,SACnB,IAAI,OAAO,SACT,KAAK,aAAa,IAAI,OAAO,OAAO,CAAC,EAAE,QAAQ,OAAO;CAG5D;CAEA,WAAmB,UAA+B;EAChD,IAAI,MAAM,KAAK,SAAS,IAAI,QAAQ;EACpC,IAAI,CAAC,KAAK;GACR,sBAAM,IAAI,IAAI;GACd,KAAK,SAAS,IAAI,UAAU,GAAG;EACjC;EACA,OAAO;CACT;CAEA,iBAAyB,UAAyC;EAChE,IAAI,MAAM,KAAK,eAAe,IAAI,QAAQ;EAC1C,IAAI,CAAC,KAAK;GACR,sBAAM,IAAI,IAAI;GACd,KAAK,eAAe,IAAI,UAAU,GAAG;EACvC;EACA,OAAO;CACT;AACF;;;;;AAMA,IAAa,qBAAb,MAA0D;CACxD,gBAAiE,IAAI,MAAW;CAChF,oCAAqC,IAAI,IAAgC;CACzE;CACA;CACA;CAEA,YAAY,EAAE,SAAS,aAAa,QAAsE;EACxG,KAAK,WAAW;EAChB,KAAK,eAAe;EACpB,KAAK,QAAQ;CACf;CAEA,IAAI,OAAY;EACd,OAAO;GAAE,SAAS,KAAK;GAAU,aAAa,KAAK;EAAa;CAClE;CAEA,IAAI,cAAsB;EACxB,OAAO,KAAK;CACd;CAEA,IAAI,UAAkB;EACpB,OAAO,KAAK;CACd;CAEA,IAAI,SAAkB;EACpB,OAAO;CACT;CAEA,IAAI,SAAmC;EACrC,OAAO,CAAC;CACV;CAEA,cAAoB,CAAC;CAErB,MAAM,KAAK,MAAe,SAAiC;EACzD,KAAK,MAAM,QAAQ,KAAK,UAAU,OAAO;CAC3C;CAEA,UAAU,UAAkD;EAC1D,KAAK,kBAAkB,IAAI,QAAQ;EACnC,aAAa,KAAK,kBAAkB,OAAO,QAAQ;CACrD;CAEA,cAAc,UAAsB,MAAmD;EACrF,IAAI,MAAM,qBAAqB,OAC7B,SAAS;EAEX,aAAa,CAAC;CAChB;;CAGA,QAAQ,SAAwB;EAC9B,KAAK,MAAM,YAAY,KAAK,mBAC1B,SAAS,OAAO;CAEpB;CAEA,MAAM,OAAsB,CAAC;CAC7B,MAAM,QAAuB;EAC3B,KAAK,MAAM,iBAAiB,KAAK,QAAQ;CAC3C;AACF"}