{"version":3,"file":"index.mjs","sources":["../src/types/types.ts","../src/util/const.ts","../src/util/logger.ts","../src/version.ts","../src/api/alchemy-provider.ts","../src/api/util.ts","../src/internal/websocket-backfiller.ts","../src/internal/internal-types.ts","../src/api/alchemy-websocket-provider.ts","../src/api/alchemy.ts","../src/util/sendRest.ts","../src/internal/backoff.ts","../src/internal/dispatch.ts","../src/util/util.ts","../src/api/enhanced.ts","../src/api/nft-api.ts"],"sourcesContent":["import {\n  EventType,\n  TransactionReceipt\n} from '@ethersproject/abstract-provider';\nimport { BaseNft, Nft } from '../api/nft';\n\n// TODO: separate this file into other files.\n\n/**\n * Options object used to configure the Alchemy SDK.\n *\n * @public\n */\nexport interface AlchemyConfig {\n  /** The Alchemy API key that can be found in the Alchemy dashboard. */\n  apiKey?: string;\n\n  /** The name of the network. */\n  network?: Network;\n\n  /** The maximum number of retries to attempt if a request fails. Defaults to 5. */\n  maxRetries?: number;\n}\n\n/**\n * The supported networks by Alchemy. Note that some functions are not available\n * on all networks. Please refer to the Alchemy documentation for more details.\n *\n * @public\n */\nexport enum Network {\n  ETH_MAINNET = 'eth-mainnet',\n  ETH_ROPSTEN = 'eth-ropsten',\n  ETH_GOERLI = 'eth-goerli',\n  ETH_KOVAN = 'eth-kovan',\n  ETH_RINKEBY = 'eth-rinkeby',\n  OPT_MAINNET = 'opt-mainnet',\n  OPT_KOVAN = 'opt-kovan',\n  ARB_MAINNET = 'arb-mainnet',\n  ARB_RINKEBY = 'arb-rinkeby',\n  MATIC_MAINNET = 'polygon-mainnet',\n  MATIC_MUMBAI = 'polygon-mumbai'\n}\n\n/** @public */\nexport interface TokenBalancesResponse {\n  address: string;\n  tokenBalances: TokenBalance[];\n}\n\n/** @public */\nexport type TokenBalance = TokenBalanceSuccess | TokenBalanceFailure;\n\n/** @public */\nexport interface TokenBalanceSuccess {\n  contractAddress: string;\n  tokenBalance: string;\n  error: null;\n}\n\n/** @public */\nexport interface TokenBalanceFailure {\n  contractAddress: string;\n  tokenBalance: null;\n  error: string;\n}\n\n/** @public */\nexport interface TokenMetadataResponse {\n  decimals: number | null;\n  logo: string | null;\n  name: string | null;\n  symbol: string | null;\n}\n\n/** @public */\nexport interface AssetTransfersParams {\n  fromBlock?: string;\n  toBlock?: string;\n  order?: AssetTransfersOrder;\n  fromAddress?: string;\n  toAddress?: string;\n  contractAddresses?: string[];\n  excludeZeroValue?: boolean;\n  maxCount?: number;\n  category: AssetTransfersCategory[];\n  pageKey?: string;\n}\n\n/** @public */\nexport enum AssetTransfersCategory {\n  EXTERNAL = 'external',\n  INTERNAL = 'internal',\n  TOKEN = 'token',\n  ERC20 = 'erc20',\n  ERC721 = 'erc721',\n  ERC1155 = 'erc1155',\n\n  /**\n   * Special contracts that don't follow ERC 721/1155, (ex: CryptoKitties).\n   *\n   * @beta\n   */\n  SPECIALNFT = 'specialnft'\n}\n\n/** @public */\nexport enum AssetTransfersOrder {\n  ASCENDING = 'asc',\n  DESCENDING = 'desc'\n}\n\n/** @public */\nexport enum NftTokenType {\n  ERC721 = 'ERC721',\n  ERC1155 = 'ERC1155',\n  UNKNOWN = 'UNKNOWN'\n}\n\n/** @public */\nexport interface AssetTransfersResponse {\n  transfers: AssetTransfersResult[];\n  pageKey?: string;\n}\n\n/** @public */\nexport interface AssetTransfersResult {\n  category: AssetTransfersCategory;\n  blockNum: string;\n  from: string;\n  to: string | null;\n  value: number | null;\n  erc721TokenId: string | null;\n  erc1155Metadata: ERC1155Metadata[] | null;\n  tokenId: string | null;\n  asset: string | null;\n  hash: string;\n  rawContract: RawContract;\n}\n\n/**\n * Represents NFT metadata that holds fields. Note that since there is no\n * standard metadata format, the fields are not guaranteed to be present.\n *\n * @public\n */\nexport interface NftMetadata extends Record<string, any> {\n  /** Name of the NFT asset. */\n  name?: string;\n\n  /** A human-readable description of the NFT asset. */\n  description?: string;\n\n  /** URL to the NFT asset image. */\n  image?: string;\n\n  /**\n   * The image URL that appears along the top of the NFT asset page. This tends\n   * to be the highest resolution image.\n   */\n  external_url?: string;\n\n  /** Background color of the NFT item. Usually defined as a 6 character hex string. */\n  background_color?: string;\n\n  /** The traits, attributes, and characteristics for the NFT asset. */\n  attributes?: Array<Record<string, any>>;\n}\n\n/** @public */\nexport interface TokenUri {\n  /** URI for the location of the NFT's original metadata blob. */\n  raw: string;\n  /** Public gateway URI for the raw URI. Generally offers better performance. */\n  gateway: string;\n}\n\n/**\n * Optional parameters object for the {@link getNftsForOwner} and\n * {@link getNftsForOwnerIterator} functions.\n *\n * This interface is used to fetch NFTs with their associated metadata. To get\n * Nfts without their associated metadata, use {@link GetBaseNftsForOwnerOptions}.\n *\n * @public\n */\nexport interface GetNftsForOwnerOptions {\n  /**\n   * Optional page key from an existing {@link OwnedBaseNftsResponse} or\n   * {@link OwnedNftsResponse}to use for pagination.\n   */\n  pageKey?: string;\n\n  /** Optional list of contract addresses to filter the results by. Limit is 20. */\n  contractAddresses?: string[];\n\n  /**\n   * Optional list of filters applied to the query. NFTs that match one or more\n   * of these filters are excluded from the response.\n   */\n  excludeFilters?: NftExcludeFilters[];\n\n  /** Optional boolean flag to omit NFT metadata. Defaults to `false`. */\n  omitMetadata?: boolean;\n}\n\n/**\n * Optional parameters object for the {@link getNftsForOwner} and\n * {@link getNftsForOwnerIterator} functions.\n *\n * This interface is used to fetch NFTs without their associated metadata. To\n * get Nfts with their associated metadata, use {@link GetNftsForOwnerOptions}.\n *\n * @public\n */\nexport interface GetBaseNftsForOwnerOptions {\n  /**\n   * Optional page key from an existing {@link OwnedBaseNftsResponse} or\n   * {@link OwnedNftsResponse}to use for pagination.\n   */\n  pageKey?: string;\n\n  /** Optional list of contract addresses to filter the results by. Limit is 20. */\n  contractAddresses?: string[];\n\n  /**\n   * Optional list of filters applied to the query. NFTs that match one or more\n   * of these filters are excluded from the response.\n   */\n  excludeFilters?: NftExcludeFilters[];\n\n  /** Optional boolean flag to include NFT metadata. Defaults to `false`. */\n  omitMetadata: true;\n}\n\n/**\n * Enum of NFT filters that can be applied to a {@link getNftsForOwner} request.\n * NFTs that match one or more of these filters are excluded from the response.\n *\n * @beta\n */\nexport enum NftExcludeFilters {\n  /** Exclude NFTs that have been classified as spam. */\n  SPAM = 'SPAM'\n}\n\n/**\n * The response object for the {@link getNftsForOwner} and\n * {@link getNftsForOwnerIterator} functions. The object contains the NFTs with\n * metadata owned by the provided address, along with pagination information and\n * the total count.\n *\n * @public\n */\nexport interface OwnedNftsResponse {\n  /** The NFTs owned by the provided address. */\n  readonly ownedNfts: OwnedNft[];\n\n  /**\n   * Pagination token that can be passed into another request to fetch the next\n   * NFTs. If there is no page key, then there are no more NFTs to fetch.\n   */\n  readonly pageKey?: string;\n\n  /** The total count of NFTs owned by the provided address. */\n  readonly totalCount: number;\n}\n\n/**\n * The response object for the {@link getNftsForOwner} and\n * {@link getNftsForOwnerIterator)} functions. The object contains the NFTs\n * without metadata owned by the provided address, along with pagination\n * information and the total count.\n *\n * @public\n */\nexport interface OwnedBaseNftsResponse {\n  /** The NFTs owned by the provided address. */\n  readonly ownedNfts: OwnedBaseNft[];\n\n  /**\n   * Pagination token that can be passed into another request to fetch the next\n   * NFTs. If there is no page key, then there are no more NFTs to fetch.\n   */\n  readonly pageKey?: string;\n\n  /** The total count of NFTs owned by the provided address. */\n  readonly totalCount: number;\n}\n\n/**\n * Represents an NFT with metadata owned by an address.\n *\n * @public\n */\nexport interface OwnedNft extends Nft {\n  /** The token balance of the NFT. */\n  readonly balance: number;\n}\n\n/**\n * Represents an NFT without metadata owned by an address.\n *\n * @public\n */\nexport interface OwnedBaseNft extends BaseNft {\n  /** The token balance of the NFT. */\n  readonly balance: number;\n}\n\n/**\n * The response object for the {@link getOwnersForNft}.\n *\n * @public\n */\nexport interface GetOwnersForNftResponse {\n  /** An array of owner addresses for the provided token. */\n  readonly owners: string[];\n}\n\n/**\n * The response object for the {@link getOwnersForCollection}.\n *\n * @public\n */\nexport interface GetOwnersForCollectionResponse {\n  /** An array of owner addresses for the provided contract address */\n  readonly owners: string[];\n}\n\n/**\n * The successful object returned by the {@link getNftFloorPrice} call for each\n * marketplace (e.g. looksRare).\n *\n * @public\n */\nexport interface FloorPriceMarketplace {\n  /** The floor price of the collection on the given marketplace */\n  readonly floorPrice: number;\n  /** The currency in which the floor price is denominated */\n  readonly priceCurrency: string;\n  /** The link to the collection on the given marketplace */\n  readonly collectionUrl: string;\n  /** UTC timestamp of when the floor price was retrieved from the marketplace */\n  readonly retrievedAt: string;\n}\n\n/**\n * The failing object returned by the {@link getNftFloorPrice} call for each\n * marketplace (e.g. looksRare).\n *\n * @public\n */\nexport interface FloorPriceError {\n  /** Error fetching floor prices from the given marketplace */\n  readonly error: string;\n}\n\n/**\n * The response object for the {@link getNftFloorPrice} method.\n *\n * @public\n */\nexport interface GetNftFloorPriceResponse {\n  /**\n   * Name of the NFT marketplace where the collection is listed. Current\n   * marketplaces supported: OpenSea, LooksRare\n   */\n  readonly openSea: FloorPriceMarketplace | FloorPriceError;\n  readonly looksRare: FloorPriceMarketplace | FloorPriceError;\n}\n\n/** @public */\nexport interface TransactionReceiptsBlockNumber {\n  blockNumber: string;\n}\n\n/** @public */\nexport interface TransactionReceiptsBlockHash {\n  blockHash: string;\n}\n\n/** @public */\nexport type TransactionReceiptsParams =\n  | TransactionReceiptsBlockNumber\n  | TransactionReceiptsBlockHash;\n\n/** @public */\nexport interface TransactionReceiptsResponse {\n  receipts: TransactionReceipt[] | null;\n}\n\n/** @public */\nexport interface ERC1155Metadata {\n  tokenId: string;\n  value: string;\n}\n\n/** @public */\nexport interface RawContract {\n  value: string | null;\n  address: string | null;\n  decimal: string | null;\n}\n\n/**\n * Optional parameters object for the {@link getNftsForCollection} and\n * {@link getNftsForCollectionIterator} functions.\n *\n * This interface is used to fetch NFTs with their associated metadata. To get\n * Nfts without their associated metadata, use {@link GetBaseNftsForCollectionOptions}.\n *\n * @public\n */\nexport interface GetNftsForCollectionOptions {\n  /**\n   * Optional page key from an existing {@link CollectionBaseNftsResponse} or\n   * {@link CollectionNftsResponse}to use for pagination.\n   */\n  pageKey?: string;\n\n  /** Optional boolean flag to omit NFT metadata. Defaults to `false`. */\n  omitMetadata?: boolean;\n}\n\n/**\n * Optional parameters object for the {@link getNftsForCollection} and\n * {@link getNftsForCollectionIterator} functions.\n *\n * This interface is used to fetch NFTs without their associated metadata. To\n * get Nfts with their associated metadata, use {@link GetNftsForCollectionOptions}.\n *\n * @public\n */\nexport interface GetBaseNftsForCollectionOptions {\n  /**\n   * Optional page key from an existing {@link CollectionBaseNftsResponse} or\n   * {@link CollectionNftsResponse}to use for pagination.\n   */\n  pageKey?: string;\n\n  /** Optional boolean flag to omit NFT metadata. Defaults to `false`. */\n  omitMetadata: false;\n}\n\n/**\n * The response object for the {@link getNftsForCollection} function. The object\n * contains the NFTs without metadata inside the collection.\n *\n * @public\n */\nexport interface CollectionBaseNftsResponse {\n  /** An array of NFTs without metadata. */\n  nfts: BaseNft[];\n\n  /**\n   * Pagination token that can be passed into another request to fetch the next\n   * NFTs. If there is no page key, then there are no more NFTs to fetch.\n   */\n  pageKey?: string;\n}\n\n/**\n * The response object for the {@link getNftsForCollection} function. The object\n * contains the NFTs with metadata inside the collection.\n *\n * @public\n */\nexport interface CollectionNftsResponse {\n  /** An array of NFTs with metadata. */\n  nfts: Nft[];\n\n  /**\n   * Pagination token that can be passed into another request to fetch the next\n   * NFTs. If there is no page key, then there are no more NFTs to fetch.\n   */\n  pageKey?: string;\n}\n\n/**\n * The response object for the {@link findContractDeployer} function.\n *\n * @public\n */\nexport interface DeployResult {\n  /** The address of the contract deployer, if it is available. */\n  readonly deployerAddress?: string;\n\n  /** The block number the contract was deployed in. */\n  readonly blockNumber: number;\n}\n\n/**\n * Event filters for the {@link AlchemyWebSocketProvider.on} method to use\n * Alchemy's custom Subscription API endpoints.\n *\n * @public\n */\nexport type AlchemyEventFilter =\n  | {\n      method: 'alchemy_newFullPendingTransactions';\n    }\n  | {\n      method: 'alchemy_filteredNewFullPendingTransactions';\n      address: string;\n    };\n\n/**\n * Alchemy's event filter that extends the default {@link EventType} interface to\n * also include Alchemy's Subscription API.\n *\n * @public\n */\nexport type AlchemyEventType = EventType | AlchemyEventFilter;\n","import { Network } from '../types/types';\n\nexport const DEFAULT_CONTRACT_ADDRESSES = 'DEFAULT_TOKENS';\nexport const DEFAULT_ALCHEMY_API_KEY = 'demo';\nexport const DEFAULT_NETWORK = Network.ETH_MAINNET;\nexport const DEFAULT_MAX_RETRIES = 5;\n\n/**\n * Returns the base URL for making Alchemy API requests. The `alchemy.com`\n * endpoints only work with non eth json-rpc requests.\n *\n * @internal\n */\nexport function getAlchemyHttpUrl(network: Network, apiKey: string): string {\n  return `https://${network}.g.alchemy.com/v2/${apiKey}`;\n}\n\nexport function getAlchemyNftHttpUrl(network: Network, apiKey: string): string {\n  return `https://${network}.g.alchemy.com/nft/v2/${apiKey}`;\n}\n\nexport function getAlchemyWsUrl(network: Network, apiKey: string): string {\n  return `wss://${network}.g.alchemy.com/v2/${apiKey}`;\n}\n\nexport enum AlchemyApiType {\n  BASE,\n  NFT\n}\n\n/**\n * Mapping of network names to their corresponding Network strings used to\n * create an Ethers.js Provider instance.\n */\nexport const EthersNetwork = {\n  [Network.ETH_MAINNET]: 'mainnet',\n  [Network.ETH_ROPSTEN]: 'ropsten',\n  [Network.ETH_GOERLI]: 'goerli',\n  [Network.ETH_KOVAN]: 'kovan',\n  [Network.ETH_RINKEBY]: 'rinkeby',\n  [Network.OPT_MAINNET]: 'optimism',\n  [Network.OPT_KOVAN]: 'optimism-kovan',\n  [Network.ARB_MAINNET]: 'arbitrum',\n  [Network.ARB_RINKEBY]: 'arbitrum-rinkeby',\n  [Network.MATIC_MAINNET]: 'matic',\n  [Network.MATIC_MUMBAI]: 'maticmum'\n};\n\nexport function noop(): void {\n  // It's a no-op\n}\n","/**\n * The SDK has 4 log levels and a 5th option for disabling all logging. By\n * default, the log level is set to INFO.\n *\n * The order is a follows: DEBUG < INFO < WARN < ERROR\n *\n * All log types above the current log level will be outputted.\n */\nexport enum LogLevel {\n  DEBUG,\n  INFO,\n  WARN,\n  ERROR,\n  SILENT\n}\n\n/**\n * The level of verbosity for the logger.\n *\n * @public\n */\nexport type LogLevelString = 'debug' | 'info' | 'warn' | 'error' | 'silent';\n\nconst logLevelStringToEnum: { [key in LogLevelString]: LogLevel } = {\n  debug: LogLevel.DEBUG,\n  info: LogLevel.INFO,\n  warn: LogLevel.WARN,\n  error: LogLevel.ERROR,\n  silent: LogLevel.SILENT\n};\n\n// HACKY: Use the console method as a string rather than the function itself\n// in order to allow for mocking in tests.\nconst logLevelToConsoleFn = {\n  [LogLevel.DEBUG]: 'log',\n  [LogLevel.INFO]: 'info',\n  [LogLevel.WARN]: 'warn',\n  [LogLevel.ERROR]: 'error'\n};\n\nconst DEFAULT_LOG_LEVEL = LogLevel.INFO;\n\n/**\n * Configures the verbosity of logging. The default log level is `info`.\n *\n * @param logLevel - The verbosity of logging. Can be any of the following values:\n *\n *   - `debug`: The most verbose logging level.\n *   - `info`: The default logging level.\n *   - `warn`: A logging level for non-critical issues.\n *   - `error`: A logging level for critical issues.\n *   - `silent`: Turn off all logging.\n *\n * @public\n */\nexport function setLogLevel(logLevel: LogLevelString): void {\n  loggerClient.logLevel = logLevelStringToEnum[logLevel];\n}\n\nexport function logDebug(message: string, ...args: unknown[]): void {\n  loggerClient.debug(message, args);\n}\n\nexport function logInfo(message: string, ...args: unknown[]): void {\n  loggerClient.info(message, args);\n}\n\nexport function logWarn(message: string, ...args: unknown[]): void {\n  loggerClient.warn(message, args);\n}\n\nexport function logError(message: string, ...args: unknown[]): void {\n  loggerClient.error(message, args);\n}\n\nexport class Logger {\n  /** The log level of the given Logger instance. */\n  private _logLevel = DEFAULT_LOG_LEVEL;\n\n  constructor() {}\n\n  get logLevel(): LogLevel {\n    return this._logLevel;\n  }\n\n  set logLevel(val: LogLevel) {\n    if (!(val in LogLevel)) {\n      throw new TypeError(`Invalid value \"${val}\" assigned to \\`logLevel\\``);\n    }\n    this._logLevel = val;\n  }\n\n  debug(...args: unknown[]): void {\n    this._log(LogLevel.DEBUG, ...args);\n  }\n\n  info(...args: unknown[]): void {\n    this._log(LogLevel.INFO, ...args);\n  }\n\n  warn(...args: unknown[]): void {\n    this._log(LogLevel.WARN, ...args);\n  }\n\n  error(...args: unknown[]): void {\n    this._log(LogLevel.ERROR, ...args);\n  }\n\n  /**\n   * Forwards log messages to their corresponding console counterparts if the\n   * log level allows it.\n   */\n  private _log(logLevel: LogLevel, ...args: unknown[]): void {\n    if (logLevel < this._logLevel) {\n      return;\n    }\n    const now = new Date().toISOString();\n    const method =\n      logLevelToConsoleFn[logLevel as keyof typeof logLevelToConsoleFn];\n    if (method) {\n      console[method as 'log' | 'info' | 'warn' | 'error'](\n        `[${now}] Alchemy:`,\n        ...args.map(stringify)\n      );\n    } else {\n      throw new Error(\n        `Logger received an invalid logLevel (value: ${logLevel})`\n      );\n    }\n  }\n}\n\nfunction stringify(obj: unknown): string | unknown {\n  if (typeof obj === 'string') {\n    return obj;\n  } else {\n    try {\n      return JSON.stringify(obj);\n    } catch (e) {\n      // Failed to convert to JSON, log the object directly.\n      return obj;\n    }\n  }\n}\n\n// Instantiate default logger for the SDK.\nconst loggerClient: Logger = new Logger();\n","// This file is autogenerated by injectVersion.js. Any changes will be\n// overwritten on commit!\nexport const VERSION = '1.1.1';\n","import {\n  JsonRpcProvider,\n  CommunityResourcable\n} from '@ethersproject/providers';\nimport {\n  Network as NetworkFromEthers,\n  Networkish\n} from '@ethersproject/networks';\nimport { ConnectionInfo } from '@ethersproject/web';\nimport {\n  DEFAULT_ALCHEMY_API_KEY,\n  DEFAULT_NETWORK,\n  EthersNetwork,\n  getAlchemyHttpUrl,\n  getAlchemyWsUrl\n} from '../util/const';\nimport { Network } from '../types/types';\nimport { logWarn } from '../util/logger';\nimport { VERSION } from '../version';\n\n/**\n * SDK's custom implementation of ethers.js's 'AlchemyProvider'.\n *\n * @public\n */\nexport class AlchemyProvider\n  extends JsonRpcProvider\n  implements CommunityResourcable\n{\n  readonly apiKey: string;\n  readonly maxRetries: number;\n\n  constructor(network: Networkish, apiKey: string, maxRetries: number) {\n    // Normalize the API Key to a string.\n    apiKey = AlchemyProvider.getApiKey(apiKey);\n\n    // Generate our own connection info with the correct endpoint URLs.\n    const alchemyNetwork = AlchemyProvider.getAlchemyNetwork(network);\n    const connection = AlchemyProvider.getAlchemyConnectionInfo(\n      alchemyNetwork,\n      apiKey,\n      'http'\n    );\n\n    // Normalize the Alchemy named network input to the network names used by\n    // ethers. This allows the parent super constructor in JsonRpcProvider to\n    // correctly set the network.\n    const ethersNetwork = EthersNetwork[alchemyNetwork];\n    super(connection, ethersNetwork);\n    this.apiKey = apiKey;\n    this.maxRetries = maxRetries;\n  }\n\n  /**\n   * Overrides the `UrlJsonRpcProvider.getApiKey` method as implemented by\n   * ethers.js. Returns the API key for an Alchemy provider.\n   *\n   * @internal\n   * @override\n   */\n  static getApiKey(apiKey: any): string {\n    if (apiKey == null) {\n      return DEFAULT_ALCHEMY_API_KEY;\n    }\n    if (apiKey && typeof apiKey !== 'string') {\n      throw new Error(\n        `Invalid apiKey '${apiKey}' provided. apiKey must be a string.`\n      );\n    }\n    return apiKey;\n  }\n\n  /**\n   * Converts the `Networkish` input to the network enum used by Alchemy.\n   *\n   * @internal\n   */\n  static getAlchemyNetwork(network?: Networkish): Network {\n    if (network === undefined) {\n      return DEFAULT_NETWORK;\n    }\n\n    if (typeof network === 'number') {\n      throw new Error(\n        `Invalid network '${network}' provided. Network must be a string.`\n      );\n    }\n\n    // Guaranteed that `typeof network === 'string`.\n    const isValidNetwork = Object.values(Network).includes(network as Network);\n    if (!isValidNetwork) {\n      throw new Error(\n        `Invalid network '${network}' provided. Network must be one of: ` +\n          `${Object.values(Network).join(', ')}.`\n      );\n    }\n    return network as Network;\n  }\n\n  /**\n   * Returns a {@link ConnectionInfo} object compatible with ethers that contains\n   * the correct URLs for Alchemy.\n   *\n   * @internal\n   */\n  static getAlchemyConnectionInfo(\n    network: Network,\n    apiKey: string,\n    type: 'wss' | 'http'\n  ): ConnectionInfo {\n    const url =\n      type === 'http'\n        ? getAlchemyHttpUrl(network, apiKey)\n        : getAlchemyWsUrl(network, apiKey);\n    return {\n      headers: {\n        'Alchemy-Ethers-Sdk-Version': VERSION,\n        'Accept-Encoding': 'gzip'\n      },\n      allowGzip: true,\n      url\n    };\n  }\n\n  /**\n   * Overrides the method in ethers.js's `StaticJsonRpcProvider` class. This\n   * method is called when calling methods on the parent class `BaseProvider`.\n   *\n   * @override\n   */\n  async detectNetwork(): Promise<NetworkFromEthers> {\n    let network = this.network;\n    if (network == null) {\n      network = await super.detectNetwork();\n\n      if (!network) {\n        throw new Error('No network detected');\n      }\n    }\n    return network;\n  }\n\n  _startPending(): void {\n    logWarn('WARNING: Alchemy Provider does not support pending filters');\n  }\n\n  /**\n   * Overrides the ether's `isCommunityResource()` method. Returns true if the\n   * current api key is the default key.\n   *\n   * @override\n   */\n  isCommunityResource(): boolean {\n    return this.apiKey === DEFAULT_ALCHEMY_API_KEY;\n  }\n\n  /**\n   * Overrides the base {@link JsonRpcProvider.send} method to implement custom\n   * logic for sending requests to Alchemy.\n   *\n   * @param method The method name to use for the request.\n   * @param params The parameters to use for the request.\n   * @override\n   * @public\n   */\n  // TODO: Implement sender logic to override retries and backoff.\n  send(method: string, params: Array<any>): Promise<any> {\n    return super.send(method, params);\n  }\n}\n","import { BigNumber } from '@ethersproject/bignumber';\n\n/**\n * Converts a hex string to a decimal number.\n *\n * @param hexString - The hex string to convert.\n * @public\n */\nexport function fromHex(hexString: string): number {\n  return BigNumber.from(hexString).toNumber();\n}\n\n/**\n * Converts a number to a hex string.\n *\n * @param num - The number to convert to hex.\n * @public\n */\nexport function toHex(num: number): string {\n  return BigNumber.from(num).toHexString();\n}\n\n/**\n * Checks if a value is a hex string.\n *\n * @param possibleHexString - The value to check.\n * @public\n */\nexport function isHex(possibleHexString: string): boolean {\n  return /^0x[0-9a-fA-F]+$/.test(possibleHexString);\n}\n","import { fromHex, toHex } from '../api/util';\nimport { AlchemyWebSocketProvider } from '../api/alchemy-websocket-provider';\n\nexport interface BatchPart {\n  method: string;\n  params?: any;\n}\n\nexport interface NewHeadsEvent {\n  author: string;\n  difficulty: string;\n  extraData: string;\n  gasLimit: string;\n  gasUsed: string;\n  hash: string;\n  logsBloom: string;\n  miner: string;\n  mixHash: string;\n  nonce: string;\n  number: string;\n  parentHash: string;\n  receiptsRoot: string;\n  sealFields: string[];\n  sha3Uncles: string;\n  size: string;\n  stateRoot: string;\n  timestamp: string;\n  transactionsRoot: string;\n}\n\n/** The return type of eth_getBlocksByHash. */\nexport interface BlockHead extends NewHeadsEvent {\n  totalDifficulty: string;\n  transactions: any[];\n  uncles: string[];\n}\n\nexport interface LogsEvent {\n  address: string;\n  blockHash: string;\n  blockNumber: string;\n  data: string;\n  logIndex: string;\n  topics: string[];\n  transactionHash: string;\n  transactionIndex: string;\n  removed?: boolean;\n}\n\nexport interface LogsSubscriptionFilter {\n  address?: string | string[];\n  topics?: Array<string | string[] | null>;\n}\n\nexport interface GetLogsOptions extends LogsSubscriptionFilter {\n  fromBlock?: string;\n  toBlock?: string;\n}\n\ninterface CommonAncestor {\n  blockNumber: number;\n  logIndex: number;\n}\n\n/**\n * The maximum number of blocks to backfill. If more than this many blocks have\n * been missed, then we'll sadly miss data, but we want to make sure we don't\n * end up requesting thousands of blocks if somebody left their laptop closed for a week.\n */\nconst MAX_BACKFILL_BLOCKS = 120;\n\n/**\n * The WebsocketBackfiller fetches events that were sent since a provided block\n * number. This is used in the {@link AlchemyWebSocketProvider} to backfill\n * events that were transmitted while the websocket connection was down.\n *\n * The backfiller backfills two main eth_subscribe events: `logs` and `newHeads`.\n *\n * @internal\n */\nexport class WebsocketBackfiller {\n  // TODO: Use HTTP provider to do backfill.\n  private maxBackfillBlocks = MAX_BACKFILL_BLOCKS;\n  constructor(private readonly provider: AlchemyWebSocketProvider) {}\n\n  /**\n   * Runs backfill for `newHeads` events.\n   *\n   * @param isCancelled Whether the backfill request is cancelled.\n   * @param previousHeads Previous head requests that were sent.\n   * @param fromBlockNumber The block number to start backfilling from.\n   * @returns A list of `newHeads` events that were sent since the last backfill.\n   */\n  async getNewHeadsBackfill(\n    isCancelled: () => boolean,\n    previousHeads: NewHeadsEvent[],\n    fromBlockNumber: number\n  ): Promise<NewHeadsEvent[]> {\n    throwIfCancelled(isCancelled);\n    const toBlockNumber = await this.getBlockNumber();\n    throwIfCancelled(isCancelled);\n\n    // If there are no previous heads to fetch, return new heads since\n    // `fromBlockNumber`, or up to maxBackfillBlocks from the current head.\n    if (previousHeads.length === 0) {\n      return this.getHeadEventsInRange(\n        Math.max(fromBlockNumber, toBlockNumber - this.maxBackfillBlocks) + 1,\n        toBlockNumber + 1\n      );\n    }\n\n    // If the last emitted event is too far back in the past, there's no need\n    // to backfill for reorgs. Just fetch the last `maxBackfillBlocks` worth of\n    // new heads.\n    const lastSeenBlockNumber = fromHex(\n      previousHeads[previousHeads.length - 1].number\n    );\n    const minBlockNumber = toBlockNumber - this.maxBackfillBlocks + 1;\n    if (lastSeenBlockNumber <= minBlockNumber) {\n      return this.getHeadEventsInRange(minBlockNumber, toBlockNumber + 1);\n    }\n\n    // To capture all `newHeads` events, return all head events from the last\n    // seen block number to current + any of the previous heads that were re-orged.\n    const reorgHeads: NewHeadsEvent[] = await this.getReorgHeads(\n      isCancelled,\n      previousHeads\n    );\n    throwIfCancelled(isCancelled);\n    const intermediateHeads: NewHeadsEvent[] = await this.getHeadEventsInRange(\n      lastSeenBlockNumber + 1,\n      toBlockNumber + 1\n    );\n    throwIfCancelled(isCancelled);\n    return [...reorgHeads, ...intermediateHeads];\n  }\n\n  /**\n   * Runs backfill for `logs` events.\n   *\n   * @param isCancelled Whether the backfill request is cancelled.\n   * @param filter The filter object that accompanies a logs subscription.\n   * @param previousLogs Previous log requests that were sent.\n   * @param fromBlockNumber The block number to start backfilling from.\n   */\n  async getLogsBackfill(\n    isCancelled: () => boolean,\n    filter: LogsSubscriptionFilter,\n    previousLogs: LogsEvent[],\n    fromBlockNumber: number\n  ): Promise<LogsEvent[]> {\n    throwIfCancelled(isCancelled);\n    const toBlockNumber = await this.getBlockNumber();\n    throwIfCancelled(isCancelled);\n\n    // If there are no previous logs to fetch, return new logs since\n    // `fromBlockNumber`, or up to `maxBackfillBlocks` from the current head.\n    if (previousLogs.length === 0) {\n      return this.getLogsInRange(\n        filter,\n        Math.max(fromBlockNumber, toBlockNumber - this.maxBackfillBlocks) + 1,\n        toBlockNumber + 1\n      );\n    }\n\n    // If the last emitted log is too far back in the past, there's no need\n    // to backfill for removed logs. Just fetch the last `maxBackfillBlocks`\n    // worth of logs.\n    const lastSeenBlockNumber = fromHex(\n      previousLogs[previousLogs.length - 1].blockNumber\n    );\n    const minBlockNumber = toBlockNumber - this.maxBackfillBlocks + 1;\n    if (lastSeenBlockNumber < minBlockNumber) {\n      return this.getLogsInRange(filter, minBlockNumber, toBlockNumber + 1);\n    }\n\n    // Return all log events that have happened along with log events that have\n    // been removed due to a chain reorg.\n    const commonAncestor = await this.getCommonAncestor(\n      isCancelled,\n      previousLogs\n    );\n    throwIfCancelled(isCancelled);\n\n    // All previous logs with a block number greater than the common ancestor\n    // were part of a re-org, so mark them as such.\n    const removedLogs = previousLogs\n      .filter(log => fromHex(log.blockNumber) > commonAncestor.blockNumber)\n      .map(log => ({ ...log, removed: true }));\n\n    // If no common ancestor was found, start backfill from the oldest log's\n    // block number.\n    const fromBlockInclusive =\n      commonAncestor.blockNumber === Number.NEGATIVE_INFINITY\n        ? fromHex(previousLogs[0].blockNumber)\n        : commonAncestor.blockNumber;\n    let addedLogs = await this.getLogsInRange(\n      filter,\n      fromBlockInclusive,\n      toBlockNumber + 1\n    );\n\n    // De-dupe any logs that were already emitted.\n    addedLogs = addedLogs.filter(\n      log =>\n        log &&\n        (fromHex(log.blockNumber) > commonAncestor.blockNumber ||\n          fromHex(log.logIndex) > commonAncestor.logIndex)\n    );\n\n    throwIfCancelled(isCancelled);\n    return [...removedLogs, ...addedLogs];\n  }\n\n  /**\n   * Sets a new max backfill blocks. VISIBLE ONLY FOR TESTING.\n   *\n   * @internal\n   */\n  setMaxBackfillBlock(newMax: number): void {\n    this.maxBackfillBlocks = newMax;\n  }\n\n  /**\n   * Gets the current block number as a number.\n   *\n   * @private\n   */\n  private async getBlockNumber(): Promise<number> {\n    const blockNumberHex: string = await this.provider.send('eth_blockNumber');\n    return fromHex(blockNumberHex);\n  }\n\n  /**\n   * Gets all `newHead` events in the provided range. Note that the returned\n   * heads do not include re-orged heads. Use {@link getReorgHeads} to find heads\n   * that were part of a re-org.\n   *\n   * @private\n   */\n  private async getHeadEventsInRange(\n    fromBlockInclusive: number,\n    toBlockExclusive: number\n  ): Promise<NewHeadsEvent[]> {\n    if (fromBlockInclusive >= toBlockExclusive) {\n      return [];\n    }\n    const batchParts: BatchPart[] = [];\n    for (let i = fromBlockInclusive; i < toBlockExclusive; i++) {\n      batchParts.push({\n        method: 'eth_getBlockByNumber',\n        params: [toHex(i), false]\n      });\n    }\n\n    // TODO: just fire off each send() separately since we're no longer batching:\n    // TODO: handle errors\n    const batchedBlockHeads = await this.provider.sendBatch(batchParts);\n    const blockHeads = batchedBlockHeads.reduce(\n      (acc, batch) => acc.concat(batch),\n      []\n    );\n    return blockHeads.map(toNewHeadsEvent);\n  }\n\n  /**\n   * Returns all heads that were part of a reorg event.\n   *\n   * @private\n   */\n  private async getReorgHeads(\n    isCancelled: () => boolean,\n    previousHeads: NewHeadsEvent[]\n  ): Promise<NewHeadsEvent[]> {\n    const result: NewHeadsEvent[] = [];\n    // Iterate from the most recent head backwards in order to find the first\n    // block that was part of a re-org.\n    for (let i = previousHeads.length - 1; i >= 0; i--) {\n      const oldEvent = previousHeads[i];\n      const blockHead = await this.getBlockByNumber(fromHex(oldEvent.number));\n      throwIfCancelled(isCancelled);\n\n      // If the hashes match, then current head in the iteration was not re-orged.\n      if (oldEvent.hash === blockHead.hash) {\n        break;\n      }\n\n      result.push(toNewHeadsEvent(blockHead));\n    }\n    return result.reverse();\n  }\n\n  /**\n   * Simple wrapper around `eth_getBlockByNumber` that returns the complete\n   * block information for the provided block number.\n   *\n   * @private\n   */\n  private async getBlockByNumber(blockNumber: number): Promise<BlockHead> {\n    return this.provider.send('eth_getBlockByNumber', [\n      toHex(blockNumber),\n      false\n    ]);\n  }\n\n  /**\n   * Given a list of previous log events, finds the common block number from the\n   * logs that matches the block head.\n   *\n   * This can be used to identify which logs are part of a re-org.\n   *\n   * Returns 1 less than the oldest log's block number if no common ancestor was found.\n   *\n   * @private\n   */\n  private async getCommonAncestor(\n    isCancelled: () => boolean,\n    previousLogs: LogsEvent[]\n  ): Promise<CommonAncestor> {\n    // Iterate from the most recent head backwards in order to find the first\n    // block that was part of a re-org.\n    let blockHead = await this.getBlockByNumber(\n      fromHex(previousLogs[previousLogs.length - 1].blockNumber)\n    );\n    throwIfCancelled(isCancelled);\n    for (let i = previousLogs.length - 1; i >= 0; i--) {\n      const oldLog = previousLogs[i];\n\n      // Ensure that updated blocks are fetched every time the log's block number\n      // changes.\n      if (oldLog.blockNumber !== blockHead.number) {\n        blockHead = await this.getBlockByNumber(fromHex(oldLog.blockNumber));\n      }\n\n      // Since logs are ordered in ascending order, the first log that matches\n      // the hash should be the largest logIndex.\n      if (oldLog.blockHash === blockHead.hash) {\n        return {\n          blockNumber: fromHex(oldLog.blockNumber),\n          logIndex: fromHex(oldLog.logIndex)\n        };\n      }\n    }\n    return {\n      blockNumber: Number.NEGATIVE_INFINITY,\n      logIndex: Number.NEGATIVE_INFINITY\n    };\n  }\n\n  /**\n   * Gets all `logs` events in the provided range. Note that the returned logs\n   * do not include removed logs.\n   *\n   * @private\n   */ private async getLogsInRange(\n    filter: LogsSubscriptionFilter,\n    fromBlockInclusive: number,\n    toBlockExclusive: number\n  ): Promise<LogsEvent[]> {\n    if (fromBlockInclusive >= toBlockExclusive) {\n      return [];\n    }\n    const rangeFilter: GetLogsOptions = {\n      ...filter,\n      fromBlock: toHex(fromBlockInclusive),\n      toBlock: toHex(toBlockExclusive - 1)\n    };\n    return this.provider.send('eth_getLogs', [rangeFilter]);\n  }\n}\n\nfunction toNewHeadsEvent(head: BlockHead): NewHeadsEvent {\n  const result: NewHeadsEvent & Partial<BlockHead> = { ...head };\n  delete result.totalDifficulty;\n  delete result.transactions;\n  delete result.uncles;\n  return result;\n}\n\nexport function dedupeNewHeads(events: NewHeadsEvent[]): NewHeadsEvent[] {\n  return dedupe(events, event => event.hash);\n}\n\nexport function dedupeLogs(events: LogsEvent[]): LogsEvent[] {\n  return dedupe(events, event => `${event.blockHash}/${event.logIndex}`);\n}\n\nfunction dedupe<T>(items: T[], getKey: (item: T) => any): T[] {\n  const keysSeen: Set<any> = new Set();\n  const result: T[] = [];\n  items.forEach(item => {\n    const key = getKey(item);\n    if (!keysSeen.has(key)) {\n      keysSeen.add(key);\n      result.push(item);\n    }\n  });\n  return result;\n}\n\nconst CANCELLED = new Error('Cancelled');\nexport function throwIfCancelled(isCancelled: () => boolean): void {\n  if (isCancelled()) {\n    throw CANCELLED;\n  }\n}\n","import {\n  LogsEvent,\n  LogsSubscriptionFilter,\n  NewHeadsEvent\n} from './websocket-backfiller';\nimport { EventType, Filter, Listener } from '@ethersproject/abstract-provider';\n\ntype JsonRpcId = string | number | null;\n\nexport interface JsonRpcRequest {\n  jsonrpc: '2.0';\n  method: string;\n  params?: any[];\n  id?: JsonRpcId;\n}\n\nexport interface VirtualSubscription {\n  event: EthersEvent;\n  virtualId: string;\n  physicalId: string;\n  method: string;\n  params: any[];\n  isBackfilling: boolean;\n  startingBlockNumber: number;\n  sentEvents: any[];\n  backfillBuffer: any[];\n}\n\nexport interface JsonRpcResponse<T = any> {\n  jsonrpc: '2.0';\n  result?: T;\n  error?: JsonRpcError;\n  id: JsonRpcId;\n}\n\ninterface JsonRpcError<T = any> {\n  code: number;\n  message: string;\n  data?: T;\n}\n\nexport interface NewHeadsSubscription extends VirtualSubscription {\n  method: 'eth_subscribe';\n  params: ['newHeads'];\n  isBackfilling: boolean;\n  sentEvents: NewHeadsEvent[];\n  backfillBuffer: NewHeadsEvent[];\n}\n\nexport interface LogsSubscription extends VirtualSubscription {\n  method: 'eth_subscribe';\n  params: ['logs', LogsSubscriptionFilter?];\n  isBackfilling: boolean;\n  sentEvents: LogsEvent[];\n  backfillBuffer: LogsEvent[];\n}\n\nexport type WebSocketMessage = SingleOrBatchResponse | SubscriptionEvent;\nexport type SingleOrBatchResponse = JsonRpcResponse | JsonRpcResponse[];\n\n/**\n * DO NOT MODIFY.\n *\n * Event class copied directly over from ethers.js's `BaseProvider` class.\n *\n * This class is used to represent events and their corresponding listeners. The\n * SDK needs to extend this class in order to support Alchemy's custom\n * Subscription API types. The original class is not exported by ethers. Minimal\n * changes have been made in order to get TS to compile.\n */\nexport class Event {\n  readonly listener: Listener;\n  readonly once: boolean;\n  readonly tag: string;\n\n  _lastBlockNumber: number;\n  _inflight: boolean;\n\n  constructor(tag: string, listener: Listener, once: boolean) {\n    this.listener = listener;\n    this.tag = tag;\n    this.once = once;\n    this._lastBlockNumber = -2;\n    this._inflight = false;\n  }\n\n  get event(): EventType {\n    switch (this.type) {\n      case 'tx':\n        return this.hash!;\n      case 'filter':\n        return this.filter!;\n      default:\n        return this.tag;\n    }\n  }\n\n  get type(): string {\n    return this.tag.split(':')[0];\n  }\n\n  get hash(): string {\n    const comps = this.tag.split(':');\n    if (comps[0] !== 'tx') {\n      throw new Error('Not a transaction event');\n    }\n    return comps[1];\n  }\n\n  get filter(): Filter {\n    const comps = this.tag.split(':');\n    if (comps[0] !== 'filter') {\n      throw new Error('Not a transaction event');\n    }\n    const address = comps[1];\n\n    const topics = deserializeTopics(comps[2]);\n    const filter: Filter = {};\n\n    if (topics.length > 0) {\n      filter.topics = topics;\n    }\n    if (address && address !== '*') {\n      filter.address = address;\n    }\n\n    return filter;\n  }\n\n  pollable(): boolean {\n    const PollableEvents = ['block', 'network', 'pending', 'poll'];\n    return this.tag.indexOf(':') >= 0 || PollableEvents.indexOf(this.tag) >= 0;\n  }\n}\n\n/**\n * Wrapper class around the ethers `Event` class in order to add support for\n * Alchemy's custom subscriptions types.\n */\nexport class EthersEvent extends Event {\n  get address(): string | null {\n    const comps = this.tag.split(':');\n    if (comps[0] !== 'alchemy') {\n      return null;\n    }\n    if (comps[1] && comps[1] !== '*') {\n      return comps[1];\n    } else {\n      return null;\n    }\n  }\n}\n\nexport interface SubscriptionEvent<T = any> {\n  jsonrpc: '2.0';\n  method: 'eth_subscription';\n  params: {\n    subscription: string;\n    result: T;\n  };\n}\n\nfunction deserializeTopics(data: string): any {\n  if (data === '') {\n    return [];\n  }\n\n  return data.split(/&/g).map(topic => {\n    if (topic === '') {\n      return [];\n    }\n\n    const comps = topic.split('|').map(topic => {\n      return topic === 'null' ? null : topic;\n    });\n\n    return comps.length === 1 ? comps[0] : comps;\n  });\n}\n","import { BigNumber } from '@ethersproject/bignumber';\nimport { Networkish } from '@ethersproject/networks';\nimport { DEFAULT_ALCHEMY_API_KEY, EthersNetwork, noop } from '../util/const';\nimport { AlchemyProvider } from './alchemy-provider';\nimport { Listener } from '@ethersproject/abstract-provider';\nimport { AlchemyEventType } from '../types/types';\nimport {\n  BatchPart,\n  dedupeLogs,\n  dedupeNewHeads,\n  LogsEvent,\n  LogsSubscriptionFilter,\n  NewHeadsEvent,\n  throwIfCancelled,\n  WebsocketBackfiller\n} from '../internal/websocket-backfiller';\nimport { fromHex } from './util';\nimport SturdyWebSocket from 'sturdy-websocket';\nimport { VERSION } from '../version';\nimport {\n  EthersEvent,\n  JsonRpcRequest,\n  JsonRpcResponse,\n  LogsSubscription,\n  NewHeadsSubscription,\n  SingleOrBatchResponse,\n  SubscriptionEvent,\n  VirtualSubscription,\n  WebSocketMessage\n} from '../internal/internal-types';\nimport {\n  CommunityResourcable,\n  WebSocketProvider\n} from '@ethersproject/providers';\n\nconst HEARTBEAT_INTERVAL = 30000;\nconst HEARTBEAT_WAIT_TIME = 10000;\nconst BACKFILL_TIMEOUT = 60000;\nconst BACKFILL_RETRIES = 5;\n/**\n * Subscriptions have a memory of recent events they have sent so that in the\n * event that they disconnect and need to backfill, they can detect re-orgs.\n * Keep a buffer that goes back at least these many blocks, the maximum amount\n * at which we might conceivably see a re-org.\n *\n * Note that while our buffer goes back this many blocks, it may contain more\n * than this many elements, since in the case of logs subscriptions more than\n * one event may be emitted for a block.\n */\nconst RETAINED_EVENT_BLOCK_COUNT = 10;\n\nexport class AlchemyWebSocketProvider\n  extends WebSocketProvider\n  implements CommunityResourcable\n{\n  _events: Array<EthersEvent> = [];\n  readonly apiKey: string;\n\n  // In the case of a WebSocket reconnection, all subscriptions are lost and we\n  // create new ones to replace them, but we want to create the illusion that\n  // the original subscriptions persist. Thus, maintain a mapping from the\n  // \"virtual\" subscription ids which are visible to the consumer to the\n  // \"physical\" subscription ids of the actual connections. This terminology is\n  // borrowed from virtual and physical memory, which has a similar mapping.\n  /** @internal */\n  private readonly virtualSubscriptionsById: Map<string, VirtualSubscription> =\n    new Map();\n  /** @internal */\n  private readonly virtualIdsByPhysicalId: Map<string, string> = new Map();\n  /** @internal */\n  private readonly backfiller: WebsocketBackfiller;\n  /** @internal */\n  private heartbeatIntervalId?: NodeJS.Timeout;\n  /** @internal */\n  private cancelBackfill: () => void;\n\n  /**\n   * DO NOT CALL THIS CONSTRUCTOR DIRECTLY. Instead, use `Alchemy.getWebsocketProvider()`.\n   *\n   * @param network Requires one of the Alchemy `Network` enums\n   * @param apiKey The api key, or defaults to `demo`.\n   * @param wsConstructor Optional WebSocket constructor. Currently, used only\n   *   for testing purposes.\n   * @internal\n   */\n  constructor(network?: Networkish, apiKey?: any, wsConstructor?: any) {\n    // Normalize the API Key to a string.\n    apiKey = AlchemyProvider.getApiKey(apiKey);\n\n    // Generate our own connection info with the correct endpoint URLs.\n    const alchemyNetwork = AlchemyProvider.getAlchemyNetwork(network);\n    const connection = AlchemyProvider.getAlchemyConnectionInfo(\n      alchemyNetwork,\n      apiKey,\n      'wss'\n    );\n\n    const protocol = `alchemy-sdk-${VERSION}`;\n    const ws = new SturdyWebSocket(connection.url, protocol, {\n      wsConstructor: wsConstructor ?? getWebsocketConstructor()\n    });\n\n    // Normalize the Alchemy named network input to the network names used by\n    // ethers. This allows the parent super constructor in JsonRpcProvider to\n    // correctly set the network.\n    const ethersNetwork = EthersNetwork[alchemyNetwork];\n    super(ws as any, ethersNetwork);\n    this.apiKey = apiKey;\n\n    // Start heartbeat and backfiller for the websocket connection.\n    this.backfiller = new WebsocketBackfiller(this);\n    this.addSocketListeners();\n    this.startHeartbeat();\n    this.cancelBackfill = noop;\n  }\n\n  /**\n   * Overridden implementation of ethers' that includes Alchemy based subscriptions.\n   *\n   * @param eventName Event to subscribe to\n   * @param listener The listener function to call when the event is triggered.\n   * @override\n   * @public\n   */\n  // TODO: Override `Listener` type to get type autocompletions.\n  on(eventName: AlchemyEventType, listener: Listener): this {\n    return this._addEventListener(eventName, listener, false);\n  }\n\n  /**\n   * Overrides the method in `BaseProvider` in order to properly format the\n   * Alchemy subscription events.\n   *\n   * @internal\n   * @override\n   */\n  _addEventListener(\n    eventName: AlchemyEventType,\n    listener: Listener,\n    once: boolean\n  ): this {\n    if (isAlchemyEvent(eventName)) {\n      const event = new EthersEvent(\n        getAlchemyEventTag(eventName),\n        listener,\n        once\n      );\n      this._events.push(event);\n      this._startEvent(event);\n      return this;\n    } else {\n      return super._addEventListener(eventName, listener, once);\n    }\n  }\n\n  /**\n   * Overrides the `_startEvent()` method in ethers.js's\n   * {@link WebSocketProvider} to include additional alchemy methods.\n   *\n   * @param event\n   * @override\n   * @internal\n   */\n  _startEvent(event: EthersEvent): void {\n    // Check if the event type is a custom Alchemy subscription.\n    const customLogicTypes = ['alchemy', 'block', 'filter'];\n    if (customLogicTypes.includes(event.type)) {\n      this.customStartEvent(event);\n    } else {\n      super._startEvent(event);\n    }\n  }\n\n  /**\n   * Overridden from ethers.js's {@link WebSocketProvider}\n   *\n   * Modified in order to add mappings for backfilling.\n   *\n   * @internal\n   * @override\n   */\n  async _subscribe(\n    tag: string,\n    param: Array<any>,\n    processFunc: (result: any) => void,\n    event?: EthersEvent\n  ): Promise<void> {\n    let subIdPromise = this._subIds[tag];\n\n    // BEGIN MODIFIED CODE\n    const startingBlockNumber = await this.getBlockNumber();\n    // END MODIFIED CODE\n\n    if (subIdPromise == null) {\n      subIdPromise = Promise.all(param).then(param => {\n        return this.send('eth_subscribe', param);\n      });\n      this._subIds[tag] = subIdPromise;\n    }\n    const subId = await subIdPromise;\n\n    // BEGIN MODIFIED CODE\n    const resolvedParams = await Promise.all(param);\n    this.virtualSubscriptionsById.set(subId, {\n      event: event!,\n      method: 'eth_subscribe',\n      params: resolvedParams,\n      startingBlockNumber,\n      virtualId: subId,\n      physicalId: subId,\n      sentEvents: [],\n      isBackfilling: false,\n      backfillBuffer: []\n    });\n    this.virtualIdsByPhysicalId.set(subId, subId);\n\n    // END MODIFIED CODE\n\n    this._subs[subId] = { tag, processFunc };\n  }\n\n  /**\n   * DO NOT MODIFY.\n   *\n   * Original code copied over from ether.js's `BaseProvider`.\n   *\n   * This method is copied over directly in order to implement Alchemy's unique\n   * subscription types. The only difference is that this method calls\n   * {@link getAlchemyEventTag} instead of the original `getEventTag()` method in\n   * order to parse the Alchemy subscription event.\n   *\n   * @internal\n   * @override\n   */\n  emit(eventName: AlchemyEventType, ...args: Array<any>): boolean {\n    if (isAlchemyEvent(eventName)) {\n      let result = false;\n\n      const stopped: Array<EthersEvent> = [];\n\n      // This line is the only modified line from the original method.\n      const eventTag = getAlchemyEventTag(eventName);\n\n      this._events = this._events.filter(event => {\n        if (event.tag !== eventTag) {\n          return true;\n        }\n\n        setTimeout(() => {\n          event.listener.apply(this, args);\n        }, 0);\n\n        result = true;\n\n        if (event.once) {\n          stopped.push(event);\n          return false;\n        }\n\n        return true;\n      });\n\n      stopped.forEach(event => {\n        this._stopEvent(event);\n      });\n\n      return result;\n    } else {\n      return super.emit(eventName, ...args);\n    }\n  }\n\n  /** @internal */\n  async sendBatch(parts: BatchPart[]): Promise<any[]> {\n    let nextId = 0;\n    const payload: JsonRpcRequest[] = parts.map(({ method, params }) => {\n      return {\n        method,\n        params,\n        jsonrpc: '2.0',\n        id: `alchemy-sdk:${nextId++}`\n      };\n    });\n\n    const response = await this.sendBatchConcurrently(payload);\n    const errorResponse = response.find(r => !!r.error);\n    if (errorResponse) {\n      throw new Error(errorResponse.error!.message);\n    }\n    // The ids are ascending numbers because that's what Payload Factories do.\n    return response\n      .sort((r1, r2) => (r1.id as number) - (r2.id as number))\n      .map(r => r.result);\n  }\n\n  /** @override */\n  destroy(): Promise<void> {\n    this.removeSocketListeners();\n    this.stopHeartbeatAndBackfill();\n    return super.destroy();\n  }\n\n  /**\n   * Overrides the ether's `isCommunityResource()` method. Returns true if the\n   * current api key is the default key.\n   *\n   * @override\n   */\n  isCommunityResource(): boolean {\n    return this.apiKey === DEFAULT_ALCHEMY_API_KEY;\n  }\n\n  /** @internal */\n  private addSocketListeners(): void {\n    this._websocket.addEventListener('message', this.handleMessage);\n    this._websocket.addEventListener('reopen', this.handleReopen);\n    this._websocket.addEventListener('down', this.stopHeartbeatAndBackfill);\n  }\n\n  /** @internal */\n  private removeSocketListeners(): void {\n    this._websocket.removeEventListener('message', this.handleMessage);\n    this._websocket.removeEventListener('reopen', this.handleReopen);\n    this._websocket.removeEventListener('down', this.stopHeartbeatAndBackfill);\n  }\n\n  /**\n   * The underlying ethers {@link WebSocketProvider} already handles and emits\n   * messages. To allow backfilling, track all messages that are emitted.\n   *\n   * This is a field arrow function in order to preserve `this` context when\n   * passing the method as an event listener.\n   *\n   * @internal\n   */\n  private handleMessage = (event: MessageEvent): void => {\n    const message: WebSocketMessage = JSON.parse(event.data);\n    if (!isSubscriptionEvent(message)) {\n      return;\n    }\n    const physicalId = message.params.subscription;\n    const virtualId = this.virtualIdsByPhysicalId.get(physicalId);\n    if (!virtualId) {\n      return;\n    }\n    const subscription = this.virtualSubscriptionsById.get(virtualId)!;\n    if (subscription.method !== 'eth_subscribe') {\n      return;\n    }\n\n    switch (subscription.params[0]) {\n      case 'newHeads': {\n        const newHeadsSubscription = subscription as NewHeadsSubscription;\n        const newHeadsMessage = message as SubscriptionEvent<NewHeadsEvent>;\n        const { isBackfilling, backfillBuffer } = newHeadsSubscription;\n        const { result } = newHeadsMessage.params;\n        if (isBackfilling) {\n          addToNewHeadsEventsBuffer(backfillBuffer, result);\n        } else if (physicalId !== virtualId) {\n          // In the case of a re-opened subscription, ethers will not emit the\n          // event, so the SDK has to.\n          this.emitAndRememberEvent(virtualId, result, getNewHeadsBlockNumber);\n        } else {\n          // Ethers subscription mapping will emit the event, just store it.\n          this.rememberEvent(virtualId, result, getNewHeadsBlockNumber);\n        }\n        break;\n      }\n      case 'logs': {\n        const logsSubscription = subscription as LogsSubscription;\n        const logsMessage = message as SubscriptionEvent<LogsEvent>;\n        const { isBackfilling, backfillBuffer } = logsSubscription;\n        const { result } = logsMessage.params;\n        if (isBackfilling) {\n          addToLogsEventsBuffer(backfillBuffer, result);\n        } else if (virtualId !== physicalId) {\n          this.emitAndRememberEvent(virtualId, result, getLogsBlockNumber);\n        } else {\n          this.rememberEvent(virtualId, result, getLogsBlockNumber);\n        }\n        break;\n      }\n      default:\n        break;\n    }\n  };\n\n  /**\n   * When the websocket connection reopens:\n   *\n   * 1. Resubscribe to all existing subscriptions and start backfilling\n   * 2. Restart heart beat.\n   *\n   * This is a field arrow function in order to preserve `this` context when\n   * passing the method as an event listener.\n   *\n   * @internal\n   */\n  private handleReopen = () => {\n    this.virtualIdsByPhysicalId.clear();\n    const { cancel, isCancelled } = makeCancelToken();\n    this.cancelBackfill = cancel;\n    for (const subscription of this.virtualSubscriptionsById.values()) {\n      void (async () => {\n        try {\n          await this.resubscribeAndBackfill(isCancelled, subscription);\n        } catch (error) {\n          if (!isCancelled()) {\n            console.error(\n              `Error while backfilling \"${subscription.params[0]}\" subscription. Some events may be missing.`,\n              error\n            );\n          }\n        }\n      })();\n    }\n    this.startHeartbeat();\n  };\n\n  /**\n   * Reopens the backfill based on\n   *\n   * @param isCancelled\n   * @param subscription\n   * @internal\n   */\n  private async resubscribeAndBackfill(\n    isCancelled: () => boolean,\n    subscription: VirtualSubscription\n  ): Promise<void> {\n    const {\n      virtualId,\n      method,\n      params,\n      sentEvents,\n      backfillBuffer,\n      startingBlockNumber\n    } = subscription;\n    subscription.isBackfilling = true;\n    backfillBuffer.length = 0;\n    try {\n      const physicalId = await this.send(method, params);\n      throwIfCancelled(isCancelled);\n      subscription.physicalId = physicalId;\n      this.virtualIdsByPhysicalId.set(physicalId, virtualId);\n      switch (params[0]) {\n        case 'newHeads': {\n          const backfillEvents = await withBackoffRetries(\n            () =>\n              withTimeout(\n                this.backfiller.getNewHeadsBackfill(\n                  isCancelled,\n                  sentEvents,\n                  startingBlockNumber\n                ),\n                BACKFILL_TIMEOUT\n              ),\n            BACKFILL_RETRIES,\n            () => !isCancelled()\n          );\n          throwIfCancelled(isCancelled);\n          const events = dedupeNewHeads([...backfillEvents, ...backfillBuffer]);\n          events.forEach(event => this.emitNewHeadsEvent(virtualId, event));\n          break;\n        }\n        case 'logs': {\n          const filter: LogsSubscriptionFilter = params[1] || {};\n          const backfillEvents = await withBackoffRetries(\n            () =>\n              withTimeout(\n                this.backfiller.getLogsBackfill(\n                  isCancelled,\n                  filter,\n                  sentEvents,\n                  startingBlockNumber\n                ),\n                BACKFILL_TIMEOUT\n              ),\n            BACKFILL_RETRIES,\n            () => !isCancelled()\n          );\n          throwIfCancelled(isCancelled);\n          const events = dedupeLogs([...backfillEvents, ...backfillBuffer]);\n          events.forEach(event => this.emitLogsEvent(virtualId, event));\n          break;\n        }\n        default:\n          break;\n      }\n    } finally {\n      subscription.isBackfilling = false;\n      backfillBuffer.length = 0;\n    }\n  }\n  /**\n   * Cancels the heartbeat and any pending backfills being performed. This is\n   * called when the websocket connection goes down or is disconnected.\n   *\n   * This is a field arrow function in order to preserve `this` context when\n   * passing the method as an event listener.\n   *\n   * @internal\n   */\n  private stopHeartbeatAndBackfill = () => {\n    if (this.heartbeatIntervalId != null) {\n      clearInterval(this.heartbeatIntervalId);\n      this.heartbeatIntervalId = undefined;\n    }\n    this.cancelBackfill();\n  };\n\n  /** @internal */\n  private emitNewHeadsEvent(virtualId: string, result: NewHeadsEvent): void {\n    this.emitAndRememberEvent(virtualId, result, getNewHeadsBlockNumber);\n  }\n\n  /** @internal */\n  private emitLogsEvent(virtualId: string, result: LogsEvent): void {\n    this.emitAndRememberEvent(virtualId, result, getLogsBlockNumber);\n  }\n\n  /**\n   * Emits an event to consumers, but also remembers it in its subscriptions's\n   * `sentEvents` buffer so that we can detect re-orgs if the connection drops\n   * and needs to be reconnected.\n   *\n   * @internal\n   */\n  private emitAndRememberEvent<T>(\n    virtualId: string,\n    result: T,\n    getBlockNumber: (result: T) => number\n  ): void {\n    this.rememberEvent(virtualId, result, getBlockNumber);\n\n    const subscription = this.virtualSubscriptionsById.get(virtualId);\n    if (!subscription) {\n      return;\n    }\n    this.emitGenericEvent(subscription, result);\n  }\n\n  /** @internal */\n  private rememberEvent<T>(\n    virtualId: string,\n    result: T,\n    getBlockNumber: (result: T) => number\n  ): void {\n    const subscription = this.virtualSubscriptionsById.get(virtualId);\n    if (!subscription) {\n      return;\n    }\n    // Web3 modifies these event objects once we pass them on (changing hex\n    // numbers to numbers). We want the original event, so make a defensive\n    // copy.\n    addToPastEventsBuffer(\n      subscription.sentEvents,\n      { ...result },\n      getBlockNumber\n    );\n  }\n\n  /** @internal */\n  private emitGenericEvent(\n    subscription: VirtualSubscription,\n    result: any\n  ): void {\n    const emitFunction = this.emitProcessFn(subscription.event);\n    emitFunction(result);\n  }\n\n  /**\n   * Starts a heartbeat that pings the websocket server periodically to ensure\n   * that the connection stays open.\n   *\n   * @internal\n   */\n  private startHeartbeat(): void {\n    if (this.heartbeatIntervalId != null) {\n      return;\n    }\n    this.heartbeatIntervalId = setInterval(async () => {\n      try {\n        await withTimeout(this.send('net_version'), HEARTBEAT_WAIT_TIME);\n      } catch {\n        this._websocket.reconnect();\n      }\n    }, HEARTBEAT_INTERVAL);\n  }\n\n  /**\n   * This method sends the batch concurrently as individual requests rather than\n   * as a batch, which was the original implementation. The original batch logic\n   * is preserved in this implementation in order for faster porting.\n   *\n   * @param payload\n   * @internal\n   */\n  // TODO(cleanup): Refactor and remove usages of `sendBatch()`.\n  // TODO(errors): Use allSettled() once we have more error handling.\n  private async sendBatchConcurrently(\n    payload: JsonRpcRequest[]\n  ): Promise<JsonRpcResponse[]> {\n    return Promise.all(payload.map(req => this.send(req.method, req.params)));\n  }\n\n  /** @internal */\n  private customStartEvent(event: EthersEvent): void {\n    if (event.type === 'alchemy') {\n      const { address } = event;\n      if (!!address) {\n        void this._subscribe(\n          event.tag,\n          ['alchemy_filteredNewFullPendingTransactions', { address }],\n          this.emitProcessFn(event),\n          event\n        );\n      } else {\n        void this._subscribe(\n          event.tag,\n          ['alchemy_newFullPendingTransactions'],\n          this.emitProcessFn(event),\n          event\n        );\n      }\n    } else if (event.type === 'block') {\n      void this._subscribe(\n        'block',\n        ['newHeads'],\n        this.emitProcessFn(event),\n        event\n      );\n    } else if (event.type === 'filter') {\n      void this._subscribe(\n        event.tag,\n        ['logs', this._getFilter(event.filter)],\n        this.emitProcessFn(event),\n        event\n      );\n    }\n  }\n\n  /** @internal */\n  private emitProcessFn(event: EthersEvent): (result: any) => void {\n    switch (event.type) {\n      case 'alchemy':\n        const { address } = event;\n        if (!!address) {\n          return result =>\n            this.emit(\n              {\n                method: 'alchemy_filteredNewFullPendingTransactions',\n                address: event.address!\n              },\n              result\n            );\n        } else {\n          return result =>\n            this.emit({ method: 'alchemy_newFullPendingTransactions' }, result);\n        }\n      case 'block':\n        return result => {\n          const blockNumber = BigNumber.from(result.number).toNumber();\n          this._emitted.block = blockNumber;\n          this.emit('block', blockNumber);\n        };\n      case 'filter':\n        return result => {\n          if (result.removed == null) {\n            result.removed = false;\n          }\n          this.emit(event.filter, this.formatter.filterLog(result));\n        };\n      default:\n        throw new Error('Invalid event type to `emitProcessFn()`');\n    }\n  }\n}\n\nfunction getWebsocketConstructor(): any {\n  return isNodeEnvironment() ? require('websocket').w3cwebsocket : WebSocket;\n}\n\nfunction isNodeEnvironment(): boolean {\n  return (\n    typeof process !== 'undefined' &&\n    process != null &&\n    process.versions != null &&\n    process.versions.node != null\n  );\n}\n\n/** @internal */\ninterface CancelToken {\n  cancel(): void;\n  isCancelled(): boolean;\n}\n\n// TODO(cleanup): Use class variable rather than passing `isCancelled` everywhere.\nfunction makeCancelToken(): CancelToken {\n  let cancelled = false;\n  return { cancel: () => (cancelled = true), isCancelled: () => cancelled };\n}\n\n// TODO(cleanup): replace with SDK's backoff implementation\nconst MIN_RETRY_DELAY = 1000;\nconst RETRY_BACKOFF_FACTOR = 2;\nconst MAX_RETRY_DELAY = 30000;\nasync function withBackoffRetries<T>(\n  f: () => Promise<T>,\n  retryCount: number,\n  shouldRetry: (error: unknown) => boolean = () => true\n): Promise<T> {\n  let nextWaitTime = 0;\n  let i = 0;\n  while (true) {\n    try {\n      return await f();\n    } catch (error) {\n      i++;\n      if (i >= retryCount || !shouldRetry(error)) {\n        throw error;\n      }\n      await delay(nextWaitTime);\n      if (!shouldRetry(error)) {\n        throw error;\n      }\n      nextWaitTime =\n        nextWaitTime === 0\n          ? MIN_RETRY_DELAY\n          : Math.min(MAX_RETRY_DELAY, RETRY_BACKOFF_FACTOR * nextWaitTime);\n    }\n  }\n}\n\nfunction delay(ms: number): Promise<void> {\n  return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nfunction withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {\n  return Promise.race([\n    promise,\n    new Promise<T>((_, reject) =>\n      setTimeout(() => reject(new Error('Timeout')), ms)\n    )\n  ]);\n}\n\nfunction getNewHeadsBlockNumber(event: NewHeadsEvent): number {\n  return fromHex(event.number);\n}\n\nfunction getLogsBlockNumber(event: LogsEvent): number {\n  return fromHex(event.blockNumber);\n}\n\nfunction isResponse(\n  message: WebSocketMessage\n): message is SingleOrBatchResponse {\n  return (\n    Array.isArray(message) ||\n    (message.jsonrpc === '2.0' && (message as JsonRpcResponse).id !== undefined)\n  );\n}\n\nfunction isSubscriptionEvent(\n  message: WebSocketMessage\n): message is SubscriptionEvent {\n  return !isResponse(message);\n}\n\nfunction addToNewHeadsEventsBuffer(\n  pastEvents: NewHeadsEvent[],\n  event: NewHeadsEvent\n): void {\n  addToPastEventsBuffer(pastEvents, event, getNewHeadsBlockNumber);\n}\n\nfunction addToLogsEventsBuffer(\n  pastEvents: LogsEvent[],\n  event: LogsEvent\n): void {\n  addToPastEventsBuffer(pastEvents, event, getLogsBlockNumber);\n}\n\n/**\n * Adds a new event to an array of events, evicting any events which are so old\n * that they will no longer feasibly be part of a reorg.\n */\nfunction addToPastEventsBuffer<T>(\n  pastEvents: T[],\n  event: T,\n  getBlockNumber: (event: T) => number\n): void {\n  const currentBlockNumber = getBlockNumber(event);\n  // Find first index of an event recent enough to retain, then drop everything\n  // at a lower index.\n  const firstGoodIndex = pastEvents.findIndex(\n    e => getBlockNumber(e) > currentBlockNumber - RETAINED_EVENT_BLOCK_COUNT\n  );\n  if (firstGoodIndex === -1) {\n    pastEvents.length = 0;\n  } else {\n    pastEvents.splice(0, firstGoodIndex);\n  }\n  pastEvents.push(event);\n}\n\nfunction isAlchemyEvent(event: AlchemyEventType): event is object {\n  return typeof event === 'object' && 'method' in event;\n}\n\nfunction getAlchemyEventTag(event: AlchemyEventType): string {\n  if (!isAlchemyEvent(event)) {\n    throw new Error('Event tag requires AlchemyEventType');\n  }\n  return 'alchemy:' + (('address' in event && event.address) || '*');\n}\n","import { AlchemyConfig, Network } from '../types/types';\nimport {\n  DEFAULT_ALCHEMY_API_KEY,\n  DEFAULT_MAX_RETRIES,\n  DEFAULT_NETWORK,\n  getAlchemyHttpUrl,\n  getAlchemyNftHttpUrl\n} from '../util/const';\nimport { AlchemyProvider } from './alchemy-provider';\nimport { AlchemyWebSocketProvider } from './alchemy-websocket-provider';\n\n/**\n * Entry point into the Alchemy SDK.\n *\n * @param config - Configuration object for the Alchemy SDK\n * @public\n */\nexport function initializeAlchemy(config?: AlchemyConfig): Alchemy {\n  return new Alchemy(config);\n}\n\n/**\n * The Alchemy SDK client. This class holds config information and must be\n * passed into SDK methods.\n *\n * Do not call this constructor directly. Instead, use {@link initializeAlchemy}\n * to get an instance of the SDK.\n *\n * @public\n */\nexport class Alchemy {\n  readonly apiKey: string;\n  network: Network;\n  readonly maxRetries: number;\n\n  /** @internal */\n  private _baseAlchemyProvider: AlchemyProvider | undefined;\n\n  /** @internal */\n  private _baseAlchemyWssProvider: AlchemyWebSocketProvider | undefined;\n\n  /**\n   * @hideconstructor\n   * @internal\n   */\n  constructor(config?: AlchemyConfig) {\n    this.apiKey = config?.apiKey || DEFAULT_ALCHEMY_API_KEY;\n    this.network = config?.network || DEFAULT_NETWORK;\n    this.maxRetries = config?.maxRetries || DEFAULT_MAX_RETRIES;\n  }\n\n  /** @internal */\n  getBaseUrl(): string {\n    return getAlchemyHttpUrl(this.network, this.apiKey);\n  }\n\n  /** @internal */\n  getNftUrl(): string {\n    return getAlchemyNftHttpUrl(this.network, this.apiKey);\n  }\n\n  /**\n   * Changes the network that the SDK requests data from.\n   *\n   * @param network - The network to change to.\n   * @public\n   */\n  setNetwork(network: Network) {\n    // TODO(ethers): Add support for changing the network in the returned provider.\n    this.network = network;\n  }\n\n  /**\n   * Creates an AlchemyProvider instance. Only one provider is created per\n   * Alchemy instance.\n   *\n   * @public\n   */\n  getProvider(): AlchemyProvider {\n    if (!this._baseAlchemyProvider) {\n      this._baseAlchemyProvider = new AlchemyProvider(\n        this.network,\n        this.apiKey,\n        this.maxRetries\n      );\n    }\n    return this._baseAlchemyProvider;\n  }\n\n  /**\n   * Creates an AlchemyWebsocketProvider instance. Only one provider is created\n   * per Alchemy instance.\n   *\n   * @public\n   */\n  getWebsocketProvider(): AlchemyWebSocketProvider {\n    if (!this._baseAlchemyWssProvider) {\n      this._baseAlchemyWssProvider = new AlchemyWebSocketProvider(\n        this.network,\n        this.apiKey\n      );\n    }\n    return this._baseAlchemyWssProvider;\n  }\n}\n","/**\n * Given a REST endpoint, method, and params, sends the request with axios and\n * returns the response.\n */\nimport axios, { AxiosRequestConfig, AxiosResponse } from 'axios';\nimport { VERSION } from '../version';\n\nconst IS_BROWSER = typeof window !== 'undefined' && window !== null;\n\n/**\n * Helper function to send http requests using Axis.\n *\n * @private\n */\n// TODO: Support other methods besides GET + other http options.\nexport function sendAxiosRequest<Req, Res>(\n  baseUrl: string,\n  methodName: string,\n  params: Req\n): Promise<AxiosResponse<Res>> {\n  const methodUrl = baseUrl + '/' + methodName;\n  const config: AxiosRequestConfig = {\n    headers: IS_BROWSER\n      ? {\n          'Alchemy-Ethers-Sdk-Version': VERSION\n        }\n      : {\n          'Alchemy-Ethers-Sdk-Version': VERSION,\n          'Accept-Encoding': 'gzip'\n        },\n    method: 'get',\n    url: methodUrl,\n    params\n  };\n  return axios(config);\n}\n","import { logDebug } from '../util/logger';\n\nexport const DEFAULT_BACKOFF_INITIAL_DELAY_MS = 1000;\nexport const DEFAULT_BACKOFF_MULTIPLIER = 1.5;\nexport const DEFAULT_BACKOFF_MAX_DELAY_MS = 30 * 1000;\nexport const DEFAULT_BACKOFF_MAX_ATTEMPTS = 5;\n\n/**\n * Helper class for implementing exponential backoff and max retry attempts.\n *\n * @private\n * @internal\n */\nexport class ExponentialBackoff {\n  private readonly initialDelayMs = DEFAULT_BACKOFF_INITIAL_DELAY_MS;\n  private readonly backoffMultiplier = DEFAULT_BACKOFF_MULTIPLIER;\n  private readonly maxDelayMs = DEFAULT_BACKOFF_MAX_DELAY_MS;\n\n  private numAttempts = 0;\n  private currentDelayMs = 0;\n  private isInBackoff = false;\n\n  constructor(private readonly maxAttempts = DEFAULT_BACKOFF_MAX_ATTEMPTS) {}\n\n  /**\n   * Returns a promise that resolves after the the backoff delay. The delay is\n   * increased for each attempt. The promise is rejected if the maximum number\n   * of attempts is exceeded.\n   */\n  // TODO: beautify this into an async iterator.\n  backoff(): Promise<void> {\n    if (this.numAttempts >= this.maxAttempts) {\n      return Promise.reject(\n        new Error(`Exceeded maximum number of attempts: ${this.maxAttempts}`)\n      );\n    }\n    if (this.isInBackoff) {\n      return Promise.reject(\n        new Error('A backoff operation is already in progress')\n      );\n    }\n\n    const backoffDelayWithJitterMs = this.withJitterMs(this.currentDelayMs);\n    if (backoffDelayWithJitterMs > 0) {\n      logDebug(\n        'ExponentialBackoff.backoff',\n        `Backing off for ${backoffDelayWithJitterMs}ms`\n      );\n    }\n\n    // Calculate the next delay.\n    this.currentDelayMs *= this.backoffMultiplier;\n    this.currentDelayMs = Math.max(this.currentDelayMs, this.initialDelayMs);\n    this.currentDelayMs = Math.min(this.currentDelayMs, this.maxDelayMs);\n    this.numAttempts += 1;\n\n    return new Promise(resolve => {\n      this.isInBackoff = true;\n      setTimeout(() => {\n        this.isInBackoff = false;\n        resolve();\n      }, backoffDelayWithJitterMs);\n    });\n  }\n\n  /**\n   * Applies +/- 50% jitter to the backoff delay, up to the max delay cap.\n   *\n   * @private\n   * @param delayMs\n   */\n  private withJitterMs(delayMs: number): number {\n    return Math.min(delayMs + (Math.random() - 0.5) * delayMs, this.maxDelayMs);\n  }\n}\n","import { Alchemy } from '../api/alchemy';\nimport { sendAxiosRequest } from '../util/sendRest';\nimport { ExponentialBackoff } from './backoff';\nimport axios, { AxiosError } from 'axios';\nimport { logDebug, logInfo } from '../util/logger';\nimport { AlchemyApiType } from '../util/const';\n\n/**\n * A wrapper function to make http requests and retry if the request fails.\n *\n * @param alchemy\n * @param method\n * @param params\n * @internal\n */\n// TODO: Wrap Axios error in AlchemyError.\nexport async function requestHttpWithBackoff<Req, Res>(\n  alchemy: Alchemy,\n  apiType: AlchemyApiType,\n  method: string,\n  params: Req\n): Promise<Res> {\n  let lastError: Error | undefined = undefined;\n  const backoff = new ExponentialBackoff(alchemy.maxRetries);\n  for (let attempt = 0; attempt < alchemy.maxRetries + 1; attempt++) {\n    try {\n      if (lastError !== undefined) {\n        logInfo('requestHttp', `Retrying after error: ${lastError.message}`);\n      }\n\n      try {\n        await backoff.backoff();\n      } catch (err) {\n        // Backoff errors when the maximum number of attempts is reached. Break\n        // out of the loop to preserve the last error.\n        break;\n      }\n\n      let response;\n      switch (apiType) {\n        case AlchemyApiType.NFT:\n          response = await sendAxiosRequest<Req, Res>(\n            alchemy.getNftUrl(),\n            method,\n            params\n          );\n          break;\n        default:\n        case AlchemyApiType.BASE:\n          response = await sendAxiosRequest<Req, Res>(\n            alchemy.getBaseUrl(),\n            method,\n            params\n          );\n          break;\n      }\n\n      if (response.status === 200) {\n        logDebug(method, `Successful request: ${method}`);\n        return response.data;\n      } else {\n        logInfo(\n          method,\n          `Request failed: ${method}, ${response.status}, ${response.data}`\n        );\n        lastError = new Error(response.status + ': ' + response.data);\n      }\n    } catch (err) {\n      if (!axios.isAxiosError(err) || err.response === undefined) {\n        throw err;\n      }\n      // TODO: Standardize all errors into AlchemyError\n      lastError = new Error(err.response.status + ': ' + err.response.data);\n      if (!isRetryableHttpError(err)) {\n        break;\n      }\n    }\n  }\n  return Promise.reject(lastError);\n}\n\nfunction isRetryableHttpError(err: AxiosError): boolean {\n  const retryableCodes = [429];\n  return (\n    err.response !== undefined && retryableCodes.includes(err.response.status)\n  );\n}\n\n/**\n * Fetches all pages in a paginated endpoint, given a `pageKey` field that\n * represents the property name containing the next page token.\n *\n * @internal\n */\nexport async function* paginateEndpoint<\n  ReqPageKey extends string,\n  ResPageKey extends string,\n  Req extends Partial<Record<string, any> & Record<ReqPageKey, string>>,\n  Res extends Partial<Record<string, any> & Record<ResPageKey, string>>\n>(\n  alchemy: Alchemy,\n  apiType: AlchemyApiType,\n  methodName: string,\n  reqPageKey: ReqPageKey,\n  resPageKey: ResPageKey,\n  params: Req\n): AsyncIterable<Res> {\n  let hasNext = true;\n  const requestParams = { ...params };\n  while (hasNext) {\n    const response = await requestHttpWithBackoff<Req, Res>(\n      alchemy,\n      apiType,\n      methodName,\n      requestParams\n    );\n    yield response;\n    if (response[resPageKey] !== undefined) {\n      requestParams[reqPageKey] = response[resPageKey] as any;\n    } else {\n      hasNext = false;\n    }\n  }\n}\n","import { BigNumber } from '@ethersproject/bignumber';\nimport { BaseNft, BaseNftContract, Nft, NftContract } from '../api/nft';\nimport { toHex } from '../api/util';\nimport {\n  RawBaseNft,\n  RawBaseNftContract,\n  RawNft,\n  RawNftContract\n} from '../internal/raw-interfaces';\nimport { NftTokenType, TokenUri } from '../types/types';\n\nexport function formatBlock(block: string | number): string {\n  if (typeof block === 'string') {\n    return block;\n  } else if (Number.isInteger(block)) {\n    return toHex(block);\n  }\n  return block.toString();\n}\n\nexport function getBaseNftContractFromRaw(\n  rawBaseNftContract: RawBaseNftContract\n): BaseNftContract {\n  return { address: rawBaseNftContract.address };\n}\n\nexport function getNftContractFromRaw(\n  rawNftContract: RawNftContract\n): NftContract {\n  return {\n    address: rawNftContract.address,\n    name: rawNftContract.contractMetadata.name,\n    symbol: rawNftContract.contractMetadata.symbol,\n    totalSupply: rawNftContract.contractMetadata.totalSupply,\n    tokenType: parseNftTokenType(rawNftContract.contractMetadata.tokenType)\n  };\n}\n\nexport function getBaseNftFromRaw(\n  rawBaseNft: RawBaseNft,\n  contractAddress: string\n): BaseNft {\n  return {\n    contract: { address: contractAddress },\n    tokenId: BigNumber.from(rawBaseNft.id.tokenId).toString(),\n    tokenType: parseNftTokenType(rawBaseNft.id.tokenMetadata?.tokenType)\n  };\n}\n\nexport function getNftFromRaw(rawNft: RawNft, contractAddress: string): Nft {\n  return {\n    contract: { address: contractAddress },\n    tokenId: parseNftTokenId(rawNft.id.tokenId),\n    tokenType: parseNftTokenType(rawNft.id.tokenMetadata?.tokenType),\n    title: rawNft.title,\n    description: parseNftDescription(rawNft.description),\n    timeLastUpdated: rawNft.timeLastUpdated,\n    metadataError: rawNft.error,\n    rawMetadata: rawNft.metadata,\n    tokenUri: parseNftTokenUri(rawNft.tokenUri),\n    media: parseNftTokenUriArray(rawNft.media)\n  };\n}\n\nfunction parseNftTokenId(tokenId: string): string {\n  // We have to normalize the token id here since the backend sometimes\n  // returns the token ID as a hex string and sometimes as an integer.\n  return BigNumber.from(tokenId).toString();\n}\n\nfunction parseNftTokenType(tokenType: string | undefined): NftTokenType {\n  switch (tokenType) {\n    case 'erc721':\n    case 'ERC721':\n      return NftTokenType.ERC721;\n    case 'erc1155':\n    case 'ERC1155':\n      return NftTokenType.ERC1155;\n    default:\n      return NftTokenType.UNKNOWN;\n  }\n}\n\nfunction parseNftDescription(description?: string | string[]): string {\n  if (description === undefined) {\n    return '';\n  }\n  return typeof description === 'string' ? description : description.join(' ');\n}\n\nfunction parseNftTokenUri(uri: TokenUri | undefined): TokenUri | undefined {\n  if (uri && uri.raw.length === 0 && uri.gateway.length == 0) {\n    return undefined;\n  }\n  return uri;\n}\n\nfunction parseNftTokenUriArray(arr: TokenUri[] | undefined): TokenUri[] {\n  if (arr === undefined) {\n    return [];\n  }\n  return arr.filter(uri => parseNftTokenUri(uri) !== undefined);\n}\n","import {\n  AssetTransfersParams,\n  AssetTransfersResponse,\n  TokenBalancesResponse,\n  TokenMetadataResponse,\n  TransactionReceiptsParams,\n  TransactionReceiptsResponse\n} from '../types/types';\nimport { formatBlock } from '../util/util';\nimport { Alchemy } from './alchemy';\nimport { DEFAULT_CONTRACT_ADDRESSES } from '../util/const';\nimport { toHex } from './util';\n\n/** @public */\nexport function getTokenBalances(\n  alchemy: Alchemy,\n  address: string,\n  contractAddresses?: string[]\n): Promise<TokenBalancesResponse> {\n  if (contractAddresses && contractAddresses.length > 1500) {\n    throw new Error(\n      'You cannot pass in more than 1500 contract addresses to getTokenBalances()'\n    );\n  }\n  return alchemy\n    .getProvider()\n    .send('alchemy_getTokenBalances', [\n      address,\n      contractAddresses || DEFAULT_CONTRACT_ADDRESSES\n    ]);\n}\n\n/** @public */\nexport function getTokenMetadata(\n  alchemy: Alchemy,\n  address: string\n): Promise<TokenMetadataResponse> {\n  return alchemy.getProvider().send('alchemy_getTokenMetadata', [address]);\n}\n\n/** @public */\nexport function getAssetTransfers(\n  alchemy: Alchemy,\n  params: AssetTransfersParams\n): Promise<AssetTransfersResponse> {\n  return alchemy.getProvider().send('alchemy_getAssetTransfers', [\n    {\n      ...params,\n      fromBlock:\n        params.fromBlock != null ? formatBlock(params.fromBlock) : undefined,\n      toBlock: params.toBlock != null ? formatBlock(params.toBlock) : undefined,\n      maxCount: params.maxCount != null ? toHex(params.maxCount) : undefined\n    }\n  ]);\n}\n\n/** @public */\nexport function getTransactionReceipts(\n  alchemy: Alchemy,\n  params: TransactionReceiptsParams\n): Promise<TransactionReceiptsResponse> {\n  return alchemy.getProvider().send('alchemy_getTransactionReceipts', [params]);\n}\n","import {\n  CollectionBaseNftsResponse,\n  CollectionNftsResponse,\n  DeployResult,\n  GetBaseNftsForCollectionOptions,\n  GetBaseNftsForOwnerOptions,\n  GetNftFloorPriceResponse,\n  GetNftsForCollectionOptions,\n  GetNftsForOwnerOptions,\n  GetOwnersForCollectionResponse,\n  GetOwnersForNftResponse,\n  NftTokenType,\n  OwnedBaseNft,\n  OwnedBaseNftsResponse,\n  OwnedNft,\n  OwnedNftsResponse\n} from '../types/types';\nimport { Alchemy } from './alchemy';\nimport { paginateEndpoint, requestHttpWithBackoff } from '../internal/dispatch';\nimport { BaseNft, BaseNftContract, Nft, NftContract } from './nft';\nimport {\n  RawBaseNft,\n  RawCollectionBaseNft,\n  RawCollectionNft,\n  RawGetBaseNftsForCollectionResponse,\n  RawGetBaseNftsResponse,\n  RawGetNftsForCollectionResponse,\n  RawGetNftsResponse,\n  RawGetOwnersForCollectionResponse,\n  RawNft,\n  RawNftContract,\n  RawOwnedBaseNft,\n  RawOwnedNft\n} from '../internal/raw-interfaces';\nimport { toHex } from './util';\nimport { getTransactionReceipts } from './enhanced';\nimport { AlchemyApiType } from '../util/const';\nimport {\n  getNftContractFromRaw,\n  getNftFromRaw,\n  getBaseNftFromRaw\n} from '../util/util';\nimport { BigNumber, BigNumberish } from '@ethersproject/bignumber';\n\nconst ETH_NULL_VALUE = '0x';\n\n/**\n * Get the NFT metadata associated with the provided parameters.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param contractAddress - The contract address of the NFT.\n * @param tokenId - Token id of the NFT.\n * @param tokenType - Optionally specify the type of token to speed up the query.\n * @public\n */\nexport function getNftMetadata(\n  alchemy: Alchemy,\n  contractAddress: string,\n  tokenId: BigNumberish,\n  tokenType?: NftTokenType\n): Promise<Nft>;\n\n/**\n * Get the NFT metadata associated with the provided Base NFT.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param baseNft - The base NFT object to be used for the request.\n * @public\n */\nexport function getNftMetadata(\n  alchemy: Alchemy,\n  baseNft: BaseNft\n): Promise<Nft>;\nexport async function getNftMetadata(\n  alchemy: Alchemy,\n  contractAddressOrBaseNft: string | BaseNft,\n  tokenId?: BigNumberish,\n  tokenType?: NftTokenType\n): Promise<Nft> {\n  let response;\n  let contractAddress: string;\n  if (typeof contractAddressOrBaseNft === 'string') {\n    contractAddress = contractAddressOrBaseNft;\n    response = await requestHttpWithBackoff<GetNftMetadataParams, RawNft>(\n      alchemy,\n      AlchemyApiType.NFT,\n      'getNFTMetadata',\n      {\n        contractAddress: contractAddressOrBaseNft,\n        tokenId: BigNumber.from(tokenId!).toString(),\n        tokenType: tokenType !== NftTokenType.UNKNOWN ? tokenType : undefined\n      }\n    );\n  } else {\n    contractAddress = contractAddressOrBaseNft.contract.address;\n    response = await requestHttpWithBackoff<GetNftMetadataParams, RawNft>(\n      alchemy,\n      AlchemyApiType.NFT,\n      'getNFTMetadata',\n      {\n        contractAddress: contractAddressOrBaseNft.contract.address,\n        tokenId: BigNumber.from(contractAddressOrBaseNft.tokenId).toString(),\n        tokenType:\n          contractAddressOrBaseNft.tokenType !== NftTokenType.UNKNOWN\n            ? contractAddressOrBaseNft.tokenType\n            : undefined\n      }\n    );\n  }\n  return getNftFromRaw(response, contractAddress);\n}\n\n/**\n * Get the NFT collection metadata associated with the provided parameters.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param contractAddress - The contract address of the NFT.\n * @public\n */\nexport function getNftContractMetadata(\n  alchemy: Alchemy,\n  contractAddress: string\n): Promise<NftContract>;\n\n/**\n * Get the NFT metadata associated with the provided Base NFT.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param baseNftContract - The base NFT contract object to be used for the request.\n * @public\n */\nexport function getNftContractMetadata(\n  alchemy: Alchemy,\n  baseNftContract: BaseNftContract\n): Promise<NftContract>;\nexport async function getNftContractMetadata(\n  alchemy: Alchemy,\n  contractAddressOrBaseNftContract: string | BaseNftContract\n): Promise<NftContract> {\n  let response;\n  if (typeof contractAddressOrBaseNftContract === 'string') {\n    response = await requestHttpWithBackoff<\n      GetNftContractMetadataParams,\n      RawNftContract\n    >(alchemy, AlchemyApiType.NFT, 'getContractMetadata', {\n      contractAddress: contractAddressOrBaseNftContract\n    });\n  } else {\n    response = await requestHttpWithBackoff<\n      GetNftContractMetadataParams,\n      RawNftContract\n    >(alchemy, AlchemyApiType.NFT, 'getContractMetadata', {\n      contractAddress: contractAddressOrBaseNftContract.address\n    });\n  }\n  return getNftContractFromRaw(response);\n}\n\n/**\n * Fetches all NFTs for a given owner and yields them in an async iterable.\n *\n * This method returns the full NFT for the owner and pages through all page\n * keys until all NFTs have been fetched.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param owner - The address of the owner.\n * @param options - The optional parameters to use for the request.\n * @public\n */\nexport function getNftsForOwnerIterator(\n  alchemy: Alchemy,\n  owner: string,\n  options?: GetNftsForOwnerOptions\n): AsyncIterable<OwnedNft>;\n\n/**\n * Fetches all NFTs for a given owner and yields them in an async iterable.\n *\n * This method returns the base NFTs that omit the associated metadata and pages\n * through all page keys until all NFTs have been fetched.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param owner - The address of the owner.\n * @param options - The optional parameters to use for the request.\n * @public\n */\nexport function getNftsForOwnerIterator(\n  alchemy: Alchemy,\n  owner: string,\n  options?: GetBaseNftsForOwnerOptions\n): AsyncIterable<OwnedBaseNft>;\n\nexport async function* getNftsForOwnerIterator(\n  alchemy: Alchemy,\n  owner: string,\n  options?: GetNftsForOwnerOptions | GetBaseNftsForOwnerOptions\n): AsyncIterable<OwnedBaseNft | OwnedNft> {\n  const withMetadata = omitMetadataToWithMetadata(options?.omitMetadata);\n  for await (const response of paginateEndpoint(\n    alchemy,\n    AlchemyApiType.NFT,\n    'getNFTs',\n    'pageKey',\n    'pageKey',\n    {\n      contractAddresses: options?.contractAddresses,\n      pageKey: options?.pageKey,\n      filters: options?.excludeFilters,\n      owner,\n      withMetadata\n    }\n  )) {\n    for (const ownedNft of response.ownedNfts as\n      | RawOwnedNft[]\n      | RawOwnedBaseNft[]) {\n      yield {\n        ...nftFromGetNftResponse(ownedNft),\n        balance: parseInt(ownedNft.balance)\n      };\n    }\n  }\n}\n\n/**\n * Get all NFTs for an owner.\n *\n * This method returns the full NFTs in the contract. To get all NFTs without\n * their associated metadata, use {@link GetBaseNftsForOwnerOptions}.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param owner - The address of the owner.\n * @param options - The optional parameters to use for the request.\n * @public\n */\nexport async function getNftsForOwner(\n  alchemy: Alchemy,\n  owner: string,\n  options?: GetNftsForOwnerOptions\n): Promise<OwnedNftsResponse>;\n\n/**\n * Get all base NFTs for an owner.\n *\n * This method returns the base NFTs that omit the associated metadata. To get\n * all NFTs with their associated metadata, use {@link GetNftsForOwnerOptions}.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param owner - The address of the owner.\n * @param options - The optional parameters to use for the request.\n * @public\n */\nexport async function getNftsForOwner(\n  alchemy: Alchemy,\n  owner: string,\n  options?: GetBaseNftsForOwnerOptions\n): Promise<OwnedBaseNftsResponse>;\n\nexport async function getNftsForOwner(\n  alchemy: Alchemy,\n  owner: string,\n  options?: GetNftsForOwnerOptions | GetBaseNftsForOwnerOptions\n): Promise<OwnedNftsResponse | OwnedBaseNftsResponse> {\n  const withMetadata = omitMetadataToWithMetadata(options?.omitMetadata);\n  const response = await requestHttpWithBackoff<\n    GetNftsAlchemyParams,\n    RawGetBaseNftsResponse | RawGetNftsResponse\n  >(alchemy, AlchemyApiType.NFT, 'getNFTs', {\n    contractAddresses: options?.contractAddresses,\n    pageKey: options?.pageKey,\n    filters: options?.excludeFilters,\n    owner,\n    withMetadata\n  });\n  return {\n    ownedNfts: response.ownedNfts.map(res => ({\n      ...nftFromGetNftResponse(res),\n      balance: parseInt(res.balance)\n    })),\n    pageKey: response.pageKey,\n    totalCount: response.totalCount\n  };\n}\n\n/**\n * Get all NFTs for a given contract address.\n *\n * This method returns the full NFTs in the contract. To get all NFTs without\n * their associated metadata, use {@link GetBaseNftsForCollectionOptions}.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param contractAddress - The contract address of the collection.\n * @param options - The parameters to use for the request. or\n *   {@link CollectionNftsResponse} response.\n * @beta\n */\nexport async function getNftsForCollection(\n  alchemy: Alchemy,\n  contractAddress: string,\n  options?: GetNftsForCollectionOptions\n): Promise<CollectionNftsResponse>;\n\n/**\n * Get all base NFTs for a given contract address.\n *\n * This method returns the base NFTs that omit the associated metadata. To get\n * all NFTs with their associated metadata, use {@link GetNftsForCollectionOptions}.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param contractAddress - The contract address of the collection.\n * @param options - The optional parameters to use for the request.\n * @beta\n */\nexport async function getNftsForCollection(\n  alchemy: Alchemy,\n  contractAddress: string,\n  options?: GetBaseNftsForCollectionOptions\n): Promise<CollectionBaseNftsResponse>;\n\nexport async function getNftsForCollection(\n  alchemy: Alchemy,\n  contractAddress: string,\n  options?: GetBaseNftsForCollectionOptions | GetNftsForCollectionOptions\n): Promise<CollectionNftsResponse | CollectionBaseNftsResponse> {\n  const withMetadata = omitMetadataToWithMetadata(options?.omitMetadata);\n  const response = await requestHttpWithBackoff<\n    GetNftsForCollectionAlchemyParams,\n    RawGetBaseNftsForCollectionResponse | RawGetNftsForCollectionResponse\n  >(alchemy, AlchemyApiType.NFT, 'getNFTsForCollection', {\n    contractAddress,\n    startToken: options?.pageKey,\n    withMetadata\n  });\n\n  return {\n    nfts: response.nfts.map(res =>\n      nftFromGetNftCollectionResponse(res, contractAddress)\n    ),\n    pageKey: response.nextToken\n  };\n}\n\n/**\n * Gets all the owners for a given NFT contract address and token ID.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param contractAddress - The NFT contract address.\n * @param tokenId - Token id of the NFT.\n * @beta\n */\nexport function getOwnersForNft(\n  alchemy: Alchemy,\n  contractAddress: string,\n  tokenId: BigNumberish\n): Promise<GetOwnersForNftResponse>;\n\n/**\n * Gets all the owners for a given NFT.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param nft - The NFT object to get the owners for.\n * @beta\n */\nexport function getOwnersForNft(\n  alchemy: Alchemy,\n  nft: BaseNft\n): Promise<GetOwnersForNftResponse>;\nexport function getOwnersForNft(\n  alchemy: Alchemy,\n  contractAddressOrNft: string | BaseNft,\n  tokenId?: BigNumberish\n): Promise<GetOwnersForNftResponse> {\n  if (typeof contractAddressOrNft === 'string') {\n    return requestHttpWithBackoff(\n      alchemy,\n      AlchemyApiType.NFT,\n      'getOwnersForToken',\n      {\n        contractAddress: contractAddressOrNft,\n        tokenId: BigNumber.from(tokenId!).toString()\n      }\n    );\n  } else {\n    return requestHttpWithBackoff(\n      alchemy,\n      AlchemyApiType.NFT,\n      'getOwnersForToken',\n      {\n        contractAddress: contractAddressOrNft.contract.address,\n        tokenId: BigNumber.from(contractAddressOrNft.tokenId).toString()\n      }\n    );\n  }\n}\n\n/**\n * Gets all the owners for a given NFT collection.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param contractAddress - The NFT collection to get the owners for.\n * @beta\n */\nexport function getOwnersForCollection(\n  alchemy: Alchemy,\n  contractAddress: string\n): Promise<GetOwnersForCollectionResponse>;\n\n/**\n * Gets all the owners for a given NFT collection.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param nft - The NFT to get the owners of the collection for.\n * @beta\n */\nexport function getOwnersForCollection(\n  alchemy: Alchemy,\n  nft: BaseNft\n): Promise<GetOwnersForCollectionResponse>;\nexport async function getOwnersForCollection(\n  alchemy: Alchemy,\n  contractAddressOrNft: string | BaseNft\n): Promise<GetOwnersForCollectionResponse> {\n  let response;\n  if (typeof contractAddressOrNft === 'string') {\n    response = await requestHttpWithBackoff<\n      GetOwnersForCollectionAlchemyParams,\n      RawGetOwnersForCollectionResponse\n    >(alchemy, AlchemyApiType.NFT, 'getOwnersForCollection', {\n      contractAddress: contractAddressOrNft\n    });\n  } else {\n    response = await requestHttpWithBackoff<\n      GetOwnersForCollectionAlchemyParams,\n      RawGetOwnersForCollectionResponse\n    >(alchemy, AlchemyApiType.NFT, 'getOwnersForCollection', {\n      contractAddress: contractAddressOrNft.contract.address\n    });\n  }\n\n  return {\n    owners: response.ownerAddresses\n  };\n}\n\n/**\n * Fetches all NFTs for a given contract address and yields them in an async iterable.\n *\n * This method returns the full NFTs in the contract and pages through all page\n * keys until all NFTs have been fetched. To get all NFTs without their\n * associated metadata, use {@link GetBaseNftsForCollectionOptions}.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param contractAddress - The contract address of the collection.\n * @param options - The optional parameters to use for the request.\n * @beta\n */\nexport function getNftsForCollectionIterator(\n  alchemy: Alchemy,\n  contractAddress: string,\n  options?: GetNftsForCollectionOptions\n): AsyncIterable<Nft>;\n\n/**\n * Fetches all base NFTs for a given contract address and yields them in an\n * async iterable.\n *\n * This method returns the base NFTs that omit the associated metadata and pages\n * through all page keys until all NFTs have been fetched. To get all NFTs with\n * their associated metadata, use {@link GetNftsForCollectionOptions}.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param contractAddress - The contract address of the collection.\n * @param options - The optional parameters to use for the request.\n * @beta\n */\nexport function getNftsForCollectionIterator(\n  alchemy: Alchemy,\n  contractAddress: string,\n  options?: GetBaseNftsForCollectionOptions\n): AsyncIterable<BaseNft>;\n\nexport async function* getNftsForCollectionIterator(\n  alchemy: Alchemy,\n  contractAddress: string,\n  options?: GetBaseNftsForCollectionOptions | GetNftsForCollectionOptions\n): AsyncIterable<BaseNft | Nft> {\n  const withMetadata = omitMetadataToWithMetadata(options?.omitMetadata);\n  for await (const response of paginateEndpoint(\n    alchemy,\n    AlchemyApiType.NFT,\n    'getNFTsForCollection',\n    'startToken',\n    'nextToken',\n    {\n      contractAddress,\n      startToken: options?.pageKey,\n      withMetadata\n    }\n  )) {\n    for (const nft of response.nfts as\n      | RawCollectionBaseNft[]\n      | RawCollectionNft[]) {\n      yield nftFromGetNftCollectionResponse(nft, contractAddress);\n    }\n  }\n}\n\n/**\n * Checks that the provided owner address owns one of more of the provided NFTs.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param owner - The owner address to check.\n * @param contractAddresses - An array of NFT contract addresses to check ownership for.\n * @beta\n */\nexport async function checkNftOwnership(\n  alchemy: Alchemy,\n  owner: string,\n  contractAddresses: string[]\n): Promise<boolean> {\n  if (contractAddresses.length === 0) {\n    throw new Error('Must provide at least one contract address');\n  }\n  const response = await getNftsForOwner(alchemy, owner, {\n    contractAddresses,\n    omitMetadata: true\n  });\n  return response.ownedNfts.length > 0;\n}\n\n/**\n * Returns whether a contract is marked as spam or not by Alchemy. For more\n * information on how we classify spam, go to our NFT API FAQ at\n * https://docs.alchemy.com/alchemy/enhanced-apis/nft-api/nft-api-faq#nft-spam-classification.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param contractAddress - The contract address to check.\n * @beta\n */\nexport async function isSpamNftContract(\n  alchemy: Alchemy,\n  contractAddress: string\n): Promise<boolean> {\n  return requestHttpWithBackoff<IsSpamContractParams, boolean>(\n    alchemy,\n    AlchemyApiType.NFT,\n    'isSpamContract',\n    {\n      contractAddress\n    }\n  );\n}\n\n/**\n * Returns a list of all spam contracts marked by Alchemy. For details on how\n * Alchemy marks spam contracts, go to\n * https://docs.alchemy.com/alchemy/enhanced-apis/nft-api/nft-api-faq#nft-spam-classification.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @beta\n */\nexport async function getSpamNftContracts(alchemy: Alchemy): Promise<string[]> {\n  return requestHttpWithBackoff<undefined, string[]>(\n    alchemy,\n    AlchemyApiType.NFT,\n    'getSpamContracts',\n    undefined\n  );\n}\n\n/**\n * Returns the floor prices of a NFT contract by marketplace.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param contractAddress - The contract address for the NFT collection.\n * @beta\n */\nexport async function getNftFloorPrice(\n  alchemy: Alchemy,\n  contractAddress: string\n): Promise<GetNftFloorPriceResponse> {\n  return requestHttpWithBackoff<GetFloorPriceParams, GetNftFloorPriceResponse>(\n    alchemy,\n    AlchemyApiType.NFT,\n    'getFloorPrice',\n    {\n      contractAddress\n    }\n  );\n}\n\n/**\n * Finds the address that deployed the provided contract and block number it was\n * deployed in.\n *\n * NOTE: This method performs a binary search across all blocks since genesis\n * and can take a long time to complete. This method is a convenience method\n * that will eventually be replaced by a single call to an Alchemy endpoint with\n * this information cached.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param contractAddress - The contract address to find the deployer for.\n * @beta\n */\nexport async function findContractDeployer(\n  alchemy: Alchemy,\n  contractAddress: string\n): Promise<DeployResult> {\n  const provider = alchemy.getProvider();\n  const currentBlockNum = await provider.getBlockNumber();\n  if (\n    (await provider.getCode(contractAddress, currentBlockNum)) ===\n    ETH_NULL_VALUE\n  ) {\n    throw new Error(`Contract '${contractAddress}' does not exist`);\n  }\n\n  // Binary search for the block number that the contract was deployed in.\n  const firstBlock = await binarySearchFirstBlock(\n    0,\n    currentBlockNum + 1,\n    contractAddress,\n    alchemy\n  );\n\n  // Find the first transaction in the block that matches the provided address.\n  const txReceipts = await getTransactionReceipts(alchemy, {\n    blockNumber: toHex(firstBlock)\n  });\n  const matchingReceipt = txReceipts.receipts?.find(\n    receipt => receipt.contractAddress === contractAddress.toLowerCase()\n  );\n  return {\n    deployerAddress: matchingReceipt?.from,\n    blockNumber: firstBlock\n  };\n}\n\n/**\n * Refreshes the cached metadata for a provided NFT contract address and token\n * id. Returns a boolean value indicating whether the metadata was refreshed.\n *\n * This method is useful when you want to refresh the metadata for a NFT that\n * has been updated since the last time it was fetched. Note that the backend\n * only allows one refresh per token every 15 minutes, globally for all users.\n * The last refresh time for an NFT can be accessed on the\n * {@link Nft.timeLastUpdated} field.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param contractAddress - The contract address of the NFT.\n * @param tokenId - The token id of the NFT.\n */\nexport async function refreshNftMetadata(\n  alchemy: Alchemy,\n  contractAddress: string,\n  tokenId: BigNumberish\n): Promise<boolean>;\n\n/**\n * Refreshes the cached metadata for a provided NFT contract address and token\n * id. Returns a boolean value indicating whether the metadata was refreshed.\n *\n * This method is useful when you want to refresh the metadata for a NFT that\n * has been updated since the last time it was fetched. Note that the backend\n * only allows one refresh per token every 15 minutes, globally for all users.\n *\n * @param alchemy - The Alchemy SDK instance.\n * @param nft - The NFT to refresh the metadata for.\n */\nexport async function refreshNftMetadata(\n  alchemy: Alchemy,\n  nft: BaseNft\n): Promise<boolean>;\n\nexport async function refreshNftMetadata(\n  alchemy: Alchemy,\n  contractAddressOrBaseNft: string | BaseNft,\n  tokenId?: BigNumberish\n): Promise<boolean> {\n  let contractAddress: string;\n  let tokenIdString: string;\n  if (typeof contractAddressOrBaseNft === 'string') {\n    contractAddress = contractAddressOrBaseNft;\n    tokenIdString = BigNumber.from(tokenId!).toString();\n  } else {\n    contractAddress = contractAddressOrBaseNft.contract.address;\n    tokenIdString = contractAddressOrBaseNft.tokenId;\n  }\n  const first = await getNftMetadata(alchemy, contractAddress, tokenIdString);\n  const second = await refresh(alchemy, contractAddress, tokenIdString);\n  return first.timeLastUpdated !== second.timeLastUpdated;\n}\n\nasync function refresh(\n  alchemy: Alchemy,\n  contractAddress: string,\n  tokenId: BigNumberish\n): Promise<Nft> {\n  const response = await requestHttpWithBackoff<GetNftMetadataParams, RawNft>(\n    alchemy,\n    AlchemyApiType.NFT,\n    'getNFTMetadata',\n    {\n      contractAddress,\n      tokenId: BigNumber.from(tokenId!).toString(),\n      refreshCache: true\n    }\n  );\n  return getNftFromRaw(response, contractAddress);\n}\n\n/**\n * Perform a binary search between an integer range of block numbers to find the\n * block number where the contract was deployed.\n *\n * @internal\n */\nasync function binarySearchFirstBlock(\n  start: number,\n  end: number,\n  address: string,\n  alchemy: Alchemy\n): Promise<number> {\n  if (start >= end) {\n    return end;\n  }\n\n  const mid = Math.floor((start + end) / 2);\n  const code = await alchemy.getProvider().getCode(address, mid);\n  if (code === ETH_NULL_VALUE) {\n    return binarySearchFirstBlock(mid + 1, end, address, alchemy);\n  }\n  return binarySearchFirstBlock(start, mid, address, alchemy);\n}\n\n/**\n * Helper method to convert a NFT response received from Alchemy backend to an\n * SDK NFT type.\n *\n * @internal\n */\nfunction nftFromGetNftResponse(\n  ownedNft: RawOwnedBaseNft | RawOwnedNft\n): Nft | BaseNft {\n  if (isNftWithMetadata(ownedNft)) {\n    return getNftFromRaw(ownedNft, ownedNft.contract.address);\n  } else {\n    return getBaseNftFromRaw(ownedNft, ownedNft.contract.address);\n  }\n}\n\n/**\n * Helper method to convert a NFT response received from Alchemy backend to an\n * SDK NFT type.\n *\n * @internal\n */\nfunction nftFromGetNftCollectionResponse(\n  ownedNft: RawCollectionBaseNft | RawCollectionNft,\n  contractAddress: string\n): Nft | BaseNft {\n  if (isNftWithMetadata(ownedNft)) {\n    return getNftFromRaw(ownedNft, contractAddress);\n  } else {\n    return getBaseNftFromRaw(ownedNft, contractAddress);\n  }\n}\n\n/** @internal */\n// TODO: more comprehensive type check\nfunction isNftWithMetadata(response: RawBaseNft | RawNft): response is RawNft {\n  return (response as RawNft).title !== undefined;\n}\n\n/**\n * Flips the `omitMetadata` SDK parameter type to the `withMetadata` parameter\n * required by the Alchemy API. If `omitMetadata` is undefined, the SDK defaults\n * to including metadata.\n *\n * @internal\n */\nfunction omitMetadataToWithMetadata(\n  omitMetadata: boolean | undefined\n): boolean {\n  return omitMetadata === undefined ? true : !omitMetadata;\n}\n\n/**\n * Interface for the `getNftsForCollection` endpoint. The main difference is\n * that the endpoint has a `startToken` parameter, but the SDK standardizes all\n * pagination parameters to `pageKey`.\n *\n * @internal\n */\ninterface GetNftsForCollectionAlchemyParams {\n  contractAddress: string;\n  startToken?: string;\n  withMetadata: boolean;\n}\n\n/**\n * Interface for the `getNfts` endpoint. The main difference is that the\n * endpoint has a `withMetadata` parameter, but the SDK exposes the parameter as\n * `omitMetadata`.\n *\n * @internal\n */\ninterface GetNftsAlchemyParams {\n  owner: string;\n  pageKey?: string;\n  contractAddresses?: string[];\n  filters?: string[];\n  withMetadata: boolean;\n}\n\n/**\n * Interface for the `getNftMetadata` endpoint.\n *\n * @internal\n */\ninterface GetNftMetadataParams {\n  contractAddress: string;\n  tokenId: string;\n  tokenType?: NftTokenType;\n  refreshCache?: boolean;\n}\n\n/**\n * Interface for the `isSpamContract` endpoint.\n *\n * @internal\n */\ninterface IsSpamContractParams {\n  contractAddress: string;\n}\n\n/**\n * Interface for the `getNftContractMetadata` endpoint.\n *\n * @internal\n */\ninterface GetNftContractMetadataParams {\n  contractAddress: string;\n}\n\n/**\n * Interface for the `getOwnersForCollection` endpoint.\n *\n * @internal\n */\ninterface GetOwnersForCollectionAlchemyParams {\n  contractAddress: string;\n}\n\n/**\n * Interface for the `getFloorPrice` endpoint.\n *\n * @internal\n */\ninterface GetFloorPriceParams {\n  contractAddress: string;\n}\n"],"names":[],"mappings":";;;;;AAwBA;;;;;AAKG;IACS,QAYX;AAZD,CAAA,UAAY,OAAO,EAAA;AACjB,IAAA,OAAA,CAAA,aAAA,CAAA,GAAA,aAA2B,CAAA;AAC3B,IAAA,OAAA,CAAA,aAAA,CAAA,GAAA,aAA2B,CAAA;AAC3B,IAAA,OAAA,CAAA,YAAA,CAAA,GAAA,YAAyB,CAAA;AACzB,IAAA,OAAA,CAAA,WAAA,CAAA,GAAA,WAAuB,CAAA;AACvB,IAAA,OAAA,CAAA,aAAA,CAAA,GAAA,aAA2B,CAAA;AAC3B,IAAA,OAAA,CAAA,aAAA,CAAA,GAAA,aAA2B,CAAA;AAC3B,IAAA,OAAA,CAAA,WAAA,CAAA,GAAA,WAAuB,CAAA;AACvB,IAAA,OAAA,CAAA,aAAA,CAAA,GAAA,aAA2B,CAAA;AAC3B,IAAA,OAAA,CAAA,aAAA,CAAA,GAAA,aAA2B,CAAA;AAC3B,IAAA,OAAA,CAAA,eAAA,CAAA,GAAA,iBAAiC,CAAA;AACjC,IAAA,OAAA,CAAA,cAAA,CAAA,GAAA,gBAA+B,CAAA;AACjC,CAAC,EAZW,OAAO,KAAP,OAAO,GAYlB,EAAA,CAAA,CAAA,CAAA;AA+CD;IACY,uBAcX;AAdD,CAAA,UAAY,sBAAsB,EAAA;AAChC,IAAA,sBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB,CAAA;AACrB,IAAA,sBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB,CAAA;AACrB,IAAA,sBAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACf,IAAA,sBAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACf,IAAA,sBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,sBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AAEnB;;;;AAIG;AACH,IAAA,sBAAA,CAAA,YAAA,CAAA,GAAA,YAAyB,CAAA;AAC3B,CAAC,EAdW,sBAAsB,KAAtB,sBAAsB,GAcjC,EAAA,CAAA,CAAA,CAAA;AAED;IACY,oBAGX;AAHD,CAAA,UAAY,mBAAmB,EAAA;AAC7B,IAAA,mBAAA,CAAA,WAAA,CAAA,GAAA,KAAiB,CAAA;AACjB,IAAA,mBAAA,CAAA,YAAA,CAAA,GAAA,MAAmB,CAAA;AACrB,CAAC,EAHW,mBAAmB,KAAnB,mBAAmB,GAG9B,EAAA,CAAA,CAAA,CAAA;AAED;IACY,aAIX;AAJD,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,YAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACnB,IAAA,YAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACrB,CAAC,EAJW,YAAY,KAAZ,YAAY,GAIvB,EAAA,CAAA,CAAA,CAAA;AAsHD;;;;;AAKG;IACS,kBAGX;AAHD,CAAA,UAAY,iBAAiB,EAAA;;AAE3B,IAAA,iBAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACf,CAAC,EAHW,iBAAiB,KAAjB,iBAAiB,GAG5B,EAAA,CAAA,CAAA;;AClPM,MAAM,0BAA0B,GAAG,gBAAgB,CAAC;AACpD,MAAM,uBAAuB,GAAG,MAAM,CAAC;AACvC,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW,CAAC;AAC5C,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC;;;;;AAKG;AACa,SAAA,iBAAiB,CAAC,OAAgB,EAAE,MAAc,EAAA;AAChE,IAAA,OAAO,CAAW,QAAA,EAAA,OAAO,CAAqB,kBAAA,EAAA,MAAM,EAAE,CAAC;AACzD,CAAC;AAEe,SAAA,oBAAoB,CAAC,OAAgB,EAAE,MAAc,EAAA;AACnE,IAAA,OAAO,CAAW,QAAA,EAAA,OAAO,CAAyB,sBAAA,EAAA,MAAM,EAAE,CAAC;AAC7D,CAAC;AAEe,SAAA,eAAe,CAAC,OAAgB,EAAE,MAAc,EAAA;AAC9D,IAAA,OAAO,CAAS,MAAA,EAAA,OAAO,CAAqB,kBAAA,EAAA,MAAM,EAAE,CAAC;AACvD,CAAC;AAED,IAAY,cAGX,CAAA;AAHD,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,cAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAI,CAAA;AACJ,IAAA,cAAA,CAAA,cAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAG,CAAA;AACL,CAAC,EAHW,cAAc,KAAd,cAAc,GAGzB,EAAA,CAAA,CAAA,CAAA;AAED;;;AAGG;AACI,MAAM,aAAa,GAAG;AAC3B,IAAA,CAAC,OAAO,CAAC,WAAW,GAAG,SAAS;AAChC,IAAA,CAAC,OAAO,CAAC,WAAW,GAAG,SAAS;AAChC,IAAA,CAAC,OAAO,CAAC,UAAU,GAAG,QAAQ;AAC9B,IAAA,CAAC,OAAO,CAAC,SAAS,GAAG,OAAO;AAC5B,IAAA,CAAC,OAAO,CAAC,WAAW,GAAG,SAAS;AAChC,IAAA,CAAC,OAAO,CAAC,WAAW,GAAG,UAAU;AACjC,IAAA,CAAC,OAAO,CAAC,SAAS,GAAG,gBAAgB;AACrC,IAAA,CAAC,OAAO,CAAC,WAAW,GAAG,UAAU;AACjC,IAAA,CAAC,OAAO,CAAC,WAAW,GAAG,kBAAkB;AACzC,IAAA,CAAC,OAAO,CAAC,aAAa,GAAG,OAAO;AAChC,IAAA,CAAC,OAAO,CAAC,YAAY,GAAG,UAAU;CACnC,CAAC;SAEc,IAAI,GAAA;;AAEpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClDA;;;;;;;AAOG;AACH,IAAY,QAMX,CAAA;AAND,CAAA,UAAY,QAAQ,EAAA;AAClB,IAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAK,CAAA;AACL,IAAA,QAAA,CAAA,QAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAI,CAAA;AACJ,IAAA,QAAA,CAAA,QAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAI,CAAA;AACJ,IAAA,QAAA,CAAA,QAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAK,CAAA;AACL,IAAA,QAAA,CAAA,QAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAM,CAAA;AACR,CAAC,EANW,QAAQ,KAAR,QAAQ,GAMnB,EAAA,CAAA,CAAA,CAAA;AASD,MAAM,oBAAoB,GAA0C;IAClE,KAAK,EAAE,QAAQ,CAAC,KAAK;IACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;IACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;IACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;IACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;CACxB,CAAC;AAEF;AACA;AACA,MAAM,mBAAmB,GAAG;AAC1B,IAAA,CAAC,QAAQ,CAAC,KAAK,GAAG,KAAK;AACvB,IAAA,CAAC,QAAQ,CAAC,IAAI,GAAG,MAAM;AACvB,IAAA,CAAC,QAAQ,CAAC,IAAI,GAAG,MAAM;AACvB,IAAA,CAAC,QAAQ,CAAC,KAAK,GAAG,OAAO;CAC1B,CAAC;AAEF,MAAM,iBAAiB,GAAG,QAAQ,CAAC,IAAI,CAAC;AAExC;;;;;;;;;;;;AAYG;AACG,SAAU,WAAW,CAAC,QAAwB,EAAA;AAClD,IAAA,YAAY,CAAC,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;AACzD,CAAC;SAEe,QAAQ,CAAC,OAAe,EAAE,GAAG,IAAe,EAAA;AAC1D,IAAA,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACpC,CAAC;SAEe,OAAO,CAAC,OAAe,EAAE,GAAG,IAAe,EAAA;AACzD,IAAA,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACnC,CAAC;SAEe,OAAO,CAAC,OAAe,EAAE,GAAG,IAAe,EAAA;AACzD,IAAA,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACnC,CAAC;MAMY,MAAM,CAAA;AAIjB,IAAA,WAAA,GAAA;;QAFQ,IAAS,CAAA,SAAA,GAAG,iBAAiB,CAAC;KAEtB;AAEhB,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;KACvB;IAED,IAAI,QAAQ,CAAC,GAAa,EAAA;AACxB,QAAA,IAAI,EAAE,GAAG,IAAI,QAAQ,CAAC,EAAE;AACtB,YAAA,MAAM,IAAI,SAAS,CAAC,kBAAkB,GAAG,CAAA,0BAAA,CAA4B,CAAC,CAAC;AACxE,SAAA;AACD,QAAA,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;KACtB;IAED,KAAK,CAAC,GAAG,IAAe,EAAA;QACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;KACpC;IAED,IAAI,CAAC,GAAG,IAAe,EAAA;QACrB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;KACnC;IAED,IAAI,CAAC,GAAG,IAAe,EAAA;QACrB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;KACnC;IAED,KAAK,CAAC,GAAG,IAAe,EAAA;QACtB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;KACpC;AAED;;;AAGG;AACK,IAAA,IAAI,CAAC,QAAkB,EAAE,GAAG,IAAe,EAAA;AACjD,QAAA,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE;YAC7B,OAAO;AACR,SAAA;QACD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACrC,QAAA,MAAM,MAAM,GACV,mBAAmB,CAAC,QAA4C,CAAC,CAAC;AACpE,QAAA,IAAI,MAAM,EAAE;AACV,YAAA,OAAO,CAAC,MAA2C,CAAC,CAClD,CAAA,CAAA,EAAI,GAAG,CAAY,UAAA,CAAA,EACnB,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CACvB,CAAC;AACH,SAAA;AAAM,aAAA;AACL,YAAA,MAAM,IAAI,KAAK,CACb,+CAA+C,QAAQ,CAAA,CAAA,CAAG,CAC3D,CAAC;AACH,SAAA;KACF;AACF,CAAA;AAED,SAAS,SAAS,CAAC,GAAY,EAAA;AAC7B,IAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;AAC3B,QAAA,OAAO,GAAG,CAAC;AACZ,KAAA;AAAM,SAAA;QACL,IAAI;AACF,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC5B,SAAA;AAAC,QAAA,OAAO,CAAC,EAAE;;AAEV,YAAA,OAAO,GAAG,CAAC;AACZ,SAAA;AACF,KAAA;AACH,CAAC;AAED;AACA,MAAM,YAAY,GAAW,IAAI,MAAM,EAAE;;AClJzC;AACA;AACO,MAAM,OAAO,GAAG,OAAO;;ACkB9B;;;;AAIG;AACG,MAAO,eACX,SAAQ,eAAe,CAAA;AAMvB,IAAA,WAAA,CAAY,OAAmB,EAAE,MAAc,EAAE,UAAkB,EAAA;;AAEjE,QAAA,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;;QAG3C,MAAM,cAAc,GAAG,eAAe,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAClE,QAAA,MAAM,UAAU,GAAG,eAAe,CAAC,wBAAwB,CACzD,cAAc,EACd,MAAM,EACN,MAAM,CACP,CAAC;;;;AAKF,QAAA,MAAM,aAAa,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;AACpD,QAAA,KAAK,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AACjC,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACrB,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;KAC9B;AAED;;;;;;AAMG;IACH,OAAO,SAAS,CAAC,MAAW,EAAA;QAC1B,IAAI,MAAM,IAAI,IAAI,EAAE;AAClB,YAAA,OAAO,uBAAuB,CAAC;AAChC,SAAA;AACD,QAAA,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AACxC,YAAA,MAAM,IAAI,KAAK,CACb,mBAAmB,MAAM,CAAA,oCAAA,CAAsC,CAChE,CAAC;AACH,SAAA;AACD,QAAA,OAAO,MAAM,CAAC;KACf;AAED;;;;AAIG;IACH,OAAO,iBAAiB,CAAC,OAAoB,EAAA;QAC3C,IAAI,OAAO,KAAK,SAAS,EAAE;AACzB,YAAA,OAAO,eAAe,CAAC;AACxB,SAAA;AAED,QAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC/B,YAAA,MAAM,IAAI,KAAK,CACb,oBAAoB,OAAO,CAAA,qCAAA,CAAuC,CACnE,CAAC;AACH,SAAA;;AAGD,QAAA,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAkB,CAAC,CAAC;QAC3E,IAAI,CAAC,cAAc,EAAE;AACnB,YAAA,MAAM,IAAI,KAAK,CACb,CAAA,iBAAA,EAAoB,OAAO,CAAsC,oCAAA,CAAA;AAC/D,gBAAA,CAAA,EAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG,CAC1C,CAAC;AACH,SAAA;AACD,QAAA,OAAO,OAAkB,CAAC;KAC3B;AAED;;;;;AAKG;AACH,IAAA,OAAO,wBAAwB,CAC7B,OAAgB,EAChB,MAAc,EACd,IAAoB,EAAA;AAEpB,QAAA,MAAM,GAAG,GACP,IAAI,KAAK,MAAM;AACb,cAAE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC;AACpC,cAAE,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACvC,OAAO;AACL,YAAA,OAAO,EAAE;AACP,gBAAA,4BAA4B,EAAE,OAAO;AACrC,gBAAA,iBAAiB,EAAE,MAAM;AAC1B,aAAA;AACD,YAAA,SAAS,EAAE,IAAI;YACf,GAAG;SACJ,CAAC;KACH;AAED;;;;;AAKG;IACG,aAAa,GAAA;;;;;AACjB,YAAA,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC3B,IAAI,OAAO,IAAI,IAAI,EAAE;AACnB,gBAAA,OAAO,GAAG,MAAM,MAAM,CAAA,aAAa,WAAE,CAAC;gBAEtC,IAAI,CAAC,OAAO,EAAE;AACZ,oBAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;AACxC,iBAAA;AACF,aAAA;AACD,YAAA,OAAO,OAAO,CAAC;SAChB,CAAA,CAAA;AAAA,KAAA;IAED,aAAa,GAAA;QACX,OAAO,CAAC,4DAA4D,CAAC,CAAC;KACvE;AAED;;;;;AAKG;IACH,mBAAmB,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,MAAM,KAAK,uBAAuB,CAAC;KAChD;AAED;;;;;;;;AAQG;;IAEH,IAAI,CAAC,MAAc,EAAE,MAAkB,EAAA;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACnC;AACF;;ACvKD;;;;;AAKG;AACG,SAAU,OAAO,CAAC,SAAiB,EAAA;IACvC,OAAO,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC9C,CAAC;AAED;;;;;AAKG;AACG,SAAU,KAAK,CAAC,GAAW,EAAA;IAC/B,OAAO,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AAC3C,CAAC;AAED;;;;;AAKG;AACG,SAAU,KAAK,CAAC,iBAAyB,EAAA;AAC7C,IAAA,OAAO,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACpD;;ACkCA;;;;AAIG;AACH,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC;;;;;;;;AAQG;MACU,mBAAmB,CAAA;AAG9B,IAAA,WAAA,CAA6B,QAAkC,EAAA;QAAlC,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAA0B;;QADvD,IAAiB,CAAA,iBAAA,GAAG,mBAAmB,CAAC;KACmB;AAEnE;;;;;;;AAOG;AACG,IAAA,mBAAmB,CACvB,WAA0B,EAC1B,aAA8B,EAC9B,eAAuB,EAAA;;YAEvB,gBAAgB,CAAC,WAAW,CAAC,CAAC;AAC9B,YAAA,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAClD,gBAAgB,CAAC,WAAW,CAAC,CAAC;;;AAI9B,YAAA,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC9B,OAAO,IAAI,CAAC,oBAAoB,CAC9B,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EACrE,aAAa,GAAG,CAAC,CAClB,CAAC;AACH,aAAA;;;;AAKD,YAAA,MAAM,mBAAmB,GAAG,OAAO,CACjC,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAC/C,CAAC;YACF,MAAM,cAAc,GAAG,aAAa,GAAG,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;YAClE,IAAI,mBAAmB,IAAI,cAAc,EAAE;gBACzC,OAAO,IAAI,CAAC,oBAAoB,CAAC,cAAc,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;AACrE,aAAA;;;YAID,MAAM,UAAU,GAAoB,MAAM,IAAI,CAAC,aAAa,CAC1D,WAAW,EACX,aAAa,CACd,CAAC;YACF,gBAAgB,CAAC,WAAW,CAAC,CAAC;AAC9B,YAAA,MAAM,iBAAiB,GAAoB,MAAM,IAAI,CAAC,oBAAoB,CACxE,mBAAmB,GAAG,CAAC,EACvB,aAAa,GAAG,CAAC,CAClB,CAAC;YACF,gBAAgB,CAAC,WAAW,CAAC,CAAC;AAC9B,YAAA,OAAO,CAAC,GAAG,UAAU,EAAE,GAAG,iBAAiB,CAAC,CAAC;SAC9C,CAAA,CAAA;AAAA,KAAA;AAED;;;;;;;AAOG;AACG,IAAA,eAAe,CACnB,WAA0B,EAC1B,MAA8B,EAC9B,YAAyB,EACzB,eAAuB,EAAA;;YAEvB,gBAAgB,CAAC,WAAW,CAAC,CAAC;AAC9B,YAAA,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAClD,gBAAgB,CAAC,WAAW,CAAC,CAAC;;;AAI9B,YAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC7B,OAAO,IAAI,CAAC,cAAc,CACxB,MAAM,EACN,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EACrE,aAAa,GAAG,CAAC,CAClB,CAAC;AACH,aAAA;;;;AAKD,YAAA,MAAM,mBAAmB,GAAG,OAAO,CACjC,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,WAAW,CAClD,CAAC;YACF,MAAM,cAAc,GAAG,aAAa,GAAG,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;YAClE,IAAI,mBAAmB,GAAG,cAAc,EAAE;AACxC,gBAAA,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC;AACvE,aAAA;;;YAID,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,iBAAiB,CACjD,WAAW,EACX,YAAY,CACb,CAAC;YACF,gBAAgB,CAAC,WAAW,CAAC,CAAC;;;YAI9B,MAAM,WAAW,GAAG,YAAY;AAC7B,iBAAA,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,cAAc,CAAC,WAAW,CAAC;AACpE,iBAAA,GAAG,CAAC,GAAG,KAAI,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAM,GAAG,CAAA,EAAA,EAAE,OAAO,EAAE,IAAI,EAAA,CAAA,CAAG,CAAC,CAAC;;;YAI3C,MAAM,kBAAkB,GACtB,cAAc,CAAC,WAAW,KAAK,MAAM,CAAC,iBAAiB;kBACnD,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;AACtC,kBAAE,cAAc,CAAC,WAAW,CAAC;AACjC,YAAA,IAAI,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CACvC,MAAM,EACN,kBAAkB,EAClB,aAAa,GAAG,CAAC,CAClB,CAAC;;YAGF,SAAS,GAAG,SAAS,CAAC,MAAM,CAC1B,GAAG,IACD,GAAG;iBACF,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,cAAc,CAAC,WAAW;oBACpD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,CACrD,CAAC;YAEF,gBAAgB,CAAC,WAAW,CAAC,CAAC;AAC9B,YAAA,OAAO,CAAC,GAAG,WAAW,EAAE,GAAG,SAAS,CAAC,CAAC;SACvC,CAAA,CAAA;AAAA,KAAA;AAED;;;;AAIG;AACH,IAAA,mBAAmB,CAAC,MAAc,EAAA;AAChC,QAAA,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC;KACjC;AAED;;;;AAIG;IACW,cAAc,GAAA;;YAC1B,MAAM,cAAc,GAAW,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC3E,YAAA,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC;SAChC,CAAA,CAAA;AAAA,KAAA;AAED;;;;;;AAMG;IACW,oBAAoB,CAChC,kBAA0B,EAC1B,gBAAwB,EAAA;;YAExB,IAAI,kBAAkB,IAAI,gBAAgB,EAAE;AAC1C,gBAAA,OAAO,EAAE,CAAC;AACX,aAAA;YACD,MAAM,UAAU,GAAgB,EAAE,CAAC;YACnC,KAAK,IAAI,CAAC,GAAG,kBAAkB,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,EAAE,EAAE;gBAC1D,UAAU,CAAC,IAAI,CAAC;AACd,oBAAA,MAAM,EAAE,sBAAsB;oBAC9B,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;AAC1B,iBAAA,CAAC,CAAC;AACJ,aAAA;;;YAID,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACpE,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CACzC,CAAC,GAAG,EAAE,KAAK,KAAK,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EACjC,EAAE,CACH,CAAC;AACF,YAAA,OAAO,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;SACxC,CAAA,CAAA;AAAA,KAAA;AAED;;;;AAIG;IACW,aAAa,CACzB,WAA0B,EAC1B,aAA8B,EAAA;;YAE9B,MAAM,MAAM,GAAoB,EAAE,CAAC;;;AAGnC,YAAA,KAAK,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAClD,gBAAA,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AAClC,gBAAA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;gBACxE,gBAAgB,CAAC,WAAW,CAAC,CAAC;;AAG9B,gBAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,EAAE;oBACpC,MAAM;AACP,iBAAA;gBAED,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;AACzC,aAAA;AACD,YAAA,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;SACzB,CAAA,CAAA;AAAA,KAAA;AAED;;;;;AAKG;AACW,IAAA,gBAAgB,CAAC,WAAmB,EAAA;;AAChD,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,sBAAsB,EAAE;gBAChD,KAAK,CAAC,WAAW,CAAC;gBAClB,KAAK;AACN,aAAA,CAAC,CAAC;SACJ,CAAA,CAAA;AAAA,KAAA;AAED;;;;;;;;;AASG;IACW,iBAAiB,CAC7B,WAA0B,EAC1B,YAAyB,EAAA;;;;YAIzB,IAAI,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CACzC,OAAO,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAC3D,CAAC;YACF,gBAAgB,CAAC,WAAW,CAAC,CAAC;AAC9B,YAAA,KAAK,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACjD,gBAAA,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;;;AAI/B,gBAAA,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,MAAM,EAAE;AAC3C,oBAAA,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;AACtE,iBAAA;;;AAID,gBAAA,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,EAAE;oBACvC,OAAO;AACL,wBAAA,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;AACxC,wBAAA,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;qBACnC,CAAC;AACH,iBAAA;AACF,aAAA;YACD,OAAO;gBACL,WAAW,EAAE,MAAM,CAAC,iBAAiB;gBACrC,QAAQ,EAAE,MAAM,CAAC,iBAAiB;aACnC,CAAC;SACH,CAAA,CAAA;AAAA,KAAA;AAED;;;;;AAKG,QAAe,cAAc,CAC9B,MAA8B,EAC9B,kBAA0B,EAC1B,gBAAwB,EAAA;;YAExB,IAAI,kBAAkB,IAAI,gBAAgB,EAAE;AAC1C,gBAAA,OAAO,EAAE,CAAC;AACX,aAAA;YACD,MAAM,WAAW,mCACZ,MAAM,CAAA,EAAA,EACT,SAAS,EAAE,KAAK,CAAC,kBAAkB,CAAC,EACpC,OAAO,EAAE,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC,GACrC,CAAC;AACF,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;SACzD,CAAA,CAAA;AAAA,KAAA;AACF,CAAA;AAED,SAAS,eAAe,CAAC,IAAe,EAAA;AACtC,IAAA,MAAM,MAAM,GAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAA4C,IAAI,CAAE,CAAC;IAC/D,OAAO,MAAM,CAAC,eAAe,CAAC;IAC9B,OAAO,MAAM,CAAC,YAAY,CAAC;IAC3B,OAAO,MAAM,CAAC,MAAM,CAAC;AACrB,IAAA,OAAO,MAAM,CAAC;AAChB,CAAC;AAEK,SAAU,cAAc,CAAC,MAAuB,EAAA;AACpD,IAAA,OAAO,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC;AAEK,SAAU,UAAU,CAAC,MAAmB,EAAA;AAC5C,IAAA,OAAO,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAA,EAAG,KAAK,CAAC,SAAS,CAAI,CAAA,EAAA,KAAK,CAAC,QAAQ,CAAA,CAAE,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,MAAM,CAAI,KAAU,EAAE,MAAwB,EAAA;AACrD,IAAA,MAAM,QAAQ,GAAa,IAAI,GAAG,EAAE,CAAC;IACrC,MAAM,MAAM,GAAQ,EAAE,CAAC;AACvB,IAAA,KAAK,CAAC,OAAO,CAAC,IAAI,IAAG;AACnB,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACtB,YAAA,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAClB,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnB,SAAA;AACH,KAAC,CAAC,CAAC;AACH,IAAA,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;AACnC,SAAU,gBAAgB,CAAC,WAA0B,EAAA;IACzD,IAAI,WAAW,EAAE,EAAE;AACjB,QAAA,MAAM,SAAS,CAAC;AACjB,KAAA;AACH;;ACzVA;;;;;;;;;AASG;MACU,KAAK,CAAA;AAQhB,IAAA,WAAA,CAAY,GAAW,EAAE,QAAkB,EAAE,IAAa,EAAA;AACxD,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;AACzB,QAAA,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;AACf,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACjB,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;AAC3B,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;KACxB;AAED,IAAA,IAAI,KAAK,GAAA;QACP,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,IAAI;gBACP,OAAO,IAAI,CAAC,IAAK,CAAC;AACpB,YAAA,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,MAAO,CAAC;AACtB,YAAA;gBACE,OAAO,IAAI,CAAC,GAAG,CAAC;AACnB,SAAA;KACF;AAED,IAAA,IAAI,IAAI,GAAA;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KAC/B;AAED,IAAA,IAAI,IAAI,GAAA;QACN,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAClC,QAAA,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;AACrB,YAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;AAC5C,SAAA;AACD,QAAA,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;KACjB;AAED,IAAA,IAAI,MAAM,GAAA;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAClC,QAAA,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;AACzB,YAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;AAC5C,SAAA;AACD,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEzB,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAW,EAAE,CAAC;AAE1B,QAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AACrB,YAAA,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;AACxB,SAAA;AACD,QAAA,IAAI,OAAO,IAAI,OAAO,KAAK,GAAG,EAAE;AAC9B,YAAA,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;AAC1B,SAAA;AAED,QAAA,OAAO,MAAM,CAAC;KACf;IAED,QAAQ,GAAA;QACN,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KAC5E;AACF,CAAA;AAED;;;AAGG;AACG,MAAO,WAAY,SAAQ,KAAK,CAAA;AACpC,IAAA,IAAI,OAAO,GAAA;QACT,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAClC,QAAA,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;AAC1B,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;QACD,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;AAChC,YAAA,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AACjB,SAAA;AAAM,aAAA;AACL,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;KACF;AACF,CAAA;AAWD,SAAS,iBAAiB,CAAC,IAAY,EAAA;IACrC,IAAI,IAAI,KAAK,EAAE,EAAE;AACf,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,IAAG;QAClC,IAAI,KAAK,KAAK,EAAE,EAAE;AAChB,YAAA,OAAO,EAAE,CAAC;AACX,SAAA;AAED,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,IAAG;YACzC,OAAO,KAAK,KAAK,MAAM,GAAG,IAAI,GAAG,KAAK,CAAC;AACzC,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AAC/C,KAAC,CAAC,CAAC;AACL;;AC/IA,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACjC,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAClC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B;;;;;;;;;AASG;AACH,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAEhC,MAAO,wBACX,SAAQ,iBAAiB,CAAA;AAwBzB;;;;;;;;AAQG;AACH,IAAA,WAAA,CAAY,OAAoB,EAAE,MAAY,EAAE,aAAmB,EAAA;;AAEjE,QAAA,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;;QAG3C,MAAM,cAAc,GAAG,eAAe,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAClE,QAAA,MAAM,UAAU,GAAG,eAAe,CAAC,wBAAwB,CACzD,cAAc,EACd,MAAM,EACN,KAAK,CACN,CAAC;AAEF,QAAA,MAAM,QAAQ,GAAG,CAAe,YAAA,EAAA,OAAO,EAAE,CAAC;QAC1C,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE;YACvD,aAAa,EAAE,aAAa,KAAb,IAAA,IAAA,aAAa,cAAb,aAAa,GAAI,uBAAuB,EAAE;AAC1D,SAAA,CAAC,CAAC;;;;AAKH,QAAA,MAAM,aAAa,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;AACpD,QAAA,KAAK,CAAC,EAAS,EAAE,aAAa,CAAC,CAAC;QAnDlC,IAAO,CAAA,OAAA,GAAuB,EAAE,CAAC;;;;;;;;AAUhB,QAAA,IAAA,CAAA,wBAAwB,GACvC,IAAI,GAAG,EAAE,CAAC;;AAEK,QAAA,IAAA,CAAA,sBAAsB,GAAwB,IAAI,GAAG,EAAE,CAAC;AAkQzE;;;;;;;;AAQG;AACK,QAAA,IAAA,CAAA,aAAa,GAAG,CAAC,KAAmB,KAAU;YACpD,MAAM,OAAO,GAAqB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACzD,YAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE;gBACjC,OAAO;AACR,aAAA;AACD,YAAA,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC9D,IAAI,CAAC,SAAS,EAAE;gBACd,OAAO;AACR,aAAA;YACD,MAAM,YAAY,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;AACnE,YAAA,IAAI,YAAY,CAAC,MAAM,KAAK,eAAe,EAAE;gBAC3C,OAAO;AACR,aAAA;AAED,YAAA,QAAQ,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC5B,KAAK,UAAU,EAAE;oBACf,MAAM,oBAAoB,GAAG,YAAoC,CAAC;oBAClE,MAAM,eAAe,GAAG,OAA2C,CAAC;AACpE,oBAAA,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,oBAAoB,CAAC;AAC/D,oBAAA,MAAM,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC;AAC1C,oBAAA,IAAI,aAAa,EAAE;AACjB,wBAAA,yBAAyB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AACnD,qBAAA;yBAAM,IAAI,UAAU,KAAK,SAAS,EAAE;;;wBAGnC,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,sBAAsB,CAAC,CAAC;AACtE,qBAAA;AAAM,yBAAA;;wBAEL,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,sBAAsB,CAAC,CAAC;AAC/D,qBAAA;oBACD,MAAM;AACP,iBAAA;gBACD,KAAK,MAAM,EAAE;oBACX,MAAM,gBAAgB,GAAG,YAAgC,CAAC;oBAC1D,MAAM,WAAW,GAAG,OAAuC,CAAC;AAC5D,oBAAA,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,gBAAgB,CAAC;AAC3D,oBAAA,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC;AACtC,oBAAA,IAAI,aAAa,EAAE;AACjB,wBAAA,qBAAqB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AAC/C,qBAAA;yBAAM,IAAI,SAAS,KAAK,UAAU,EAAE;wBACnC,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAClE,qBAAA;AAAM,yBAAA;wBACL,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAC3D,qBAAA;oBACD,MAAM;AACP,iBAAA;AAGF,aAAA;AACH,SAAC,CAAC;AAEF;;;;;;;;;;AAUG;QACK,IAAY,CAAA,YAAA,GAAG,MAAK;AAC1B,YAAA,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;YACpC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,eAAe,EAAE,CAAC;AAClD,YAAA,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;YAC7B,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,EAAE;gBACjE,KAAK,CAAC,MAAW,SAAA,CAAA,IAAA,EAAA,KAAA,CAAA,EAAA,KAAA,CAAA,EAAA,aAAA;oBACf,IAAI;wBACF,MAAM,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;AAC9D,qBAAA;AAAC,oBAAA,OAAO,KAAK,EAAE;wBACd,IAAI,CAAC,WAAW,EAAE,EAAE;AAClB,4BAAA,OAAO,CAAC,KAAK,CACX,CAAA,yBAAA,EAA4B,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA,2CAAA,CAA6C,EAC/F,KAAK,CACN,CAAC;AACH,yBAAA;AACF,qBAAA;iBACF,CAAA,GAAG,CAAC;AACN,aAAA;YACD,IAAI,CAAC,cAAc,EAAE,CAAC;AACxB,SAAC,CAAC;AA6EF;;;;;;;;AAQG;QACK,IAAwB,CAAA,wBAAA,GAAG,MAAK;AACtC,YAAA,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,EAAE;AACpC,gBAAA,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;AACxC,gBAAA,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;AACtC,aAAA;YACD,IAAI,CAAC,cAAc,EAAE,CAAC;AACxB,SAAC,CAAC;AAlZA,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;;QAGrB,IAAI,CAAC,UAAU,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,cAAc,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;KAC5B;AAED;;;;;;;AAOG;;IAEH,EAAE,CAAC,SAA2B,EAAE,QAAkB,EAAA;QAChD,OAAO,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;KAC3D;AAED;;;;;;AAMG;AACH,IAAA,iBAAiB,CACf,SAA2B,EAC3B,QAAkB,EAClB,IAAa,EAAA;AAEb,QAAA,IAAI,cAAc,CAAC,SAAS,CAAC,EAAE;AAC7B,YAAA,MAAM,KAAK,GAAG,IAAI,WAAW,CAC3B,kBAAkB,CAAC,SAAS,CAAC,EAC7B,QAAQ,EACR,IAAI,CACL,CAAC;AACF,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzB,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACxB,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;AAAM,aAAA;YACL,OAAO,KAAK,CAAC,iBAAiB,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC3D,SAAA;KACF;AAED;;;;;;;AAOG;AACH,IAAA,WAAW,CAAC,KAAkB,EAAA;;QAE5B,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACxD,IAAI,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;AACzC,YAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAC9B,SAAA;AAAM,aAAA;AACL,YAAA,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAC1B,SAAA;KACF;AAED;;;;;;;AAOG;AACG,IAAA,UAAU,CACd,GAAW,EACX,KAAiB,EACjB,WAAkC,EAClC,KAAmB,EAAA;;YAEnB,IAAI,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;;AAGrC,YAAA,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;;YAGxD,IAAI,YAAY,IAAI,IAAI,EAAE;AACxB,gBAAA,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,IAAG;oBAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;AAC3C,iBAAC,CAAC,CAAC;AACH,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;AAClC,aAAA;AACD,YAAA,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC;;YAGjC,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAChD,YAAA,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,EAAE;AACvC,gBAAA,KAAK,EAAE,KAAM;AACb,gBAAA,MAAM,EAAE,eAAe;AACvB,gBAAA,MAAM,EAAE,cAAc;gBACtB,mBAAmB;AACnB,gBAAA,SAAS,EAAE,KAAK;AAChB,gBAAA,UAAU,EAAE,KAAK;AACjB,gBAAA,UAAU,EAAE,EAAE;AACd,gBAAA,aAAa,EAAE,KAAK;AACpB,gBAAA,cAAc,EAAE,EAAE;AACnB,aAAA,CAAC,CAAC;YACH,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;;YAI9C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;SAC1C,CAAA,CAAA;AAAA,KAAA;AAED;;;;;;;;;;;;AAYG;AACH,IAAA,IAAI,CAAC,SAA2B,EAAE,GAAG,IAAgB,EAAA;AACnD,QAAA,IAAI,cAAc,CAAC,SAAS,CAAC,EAAE;YAC7B,IAAI,MAAM,GAAG,KAAK,CAAC;YAEnB,MAAM,OAAO,GAAuB,EAAE,CAAC;;AAGvC,YAAA,MAAM,QAAQ,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;YAE/C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAG;AACzC,gBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;AAC1B,oBAAA,OAAO,IAAI,CAAC;AACb,iBAAA;gBAED,UAAU,CAAC,MAAK;oBACd,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;iBAClC,EAAE,CAAC,CAAC,CAAC;gBAEN,MAAM,GAAG,IAAI,CAAC;gBAEd,IAAI,KAAK,CAAC,IAAI,EAAE;AACd,oBAAA,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACpB,oBAAA,OAAO,KAAK,CAAC;AACd,iBAAA;AAED,gBAAA,OAAO,IAAI,CAAC;AACd,aAAC,CAAC,CAAC;AAEH,YAAA,OAAO,CAAC,OAAO,CAAC,KAAK,IAAG;AACtB,gBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACzB,aAAC,CAAC,CAAC;AAEH,YAAA,OAAO,MAAM,CAAC;AACf,SAAA;AAAM,aAAA;YACL,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;AACvC,SAAA;KACF;;AAGK,IAAA,SAAS,CAAC,KAAkB,EAAA;;YAChC,IAAI,MAAM,GAAG,CAAC,CAAC;AACf,YAAA,MAAM,OAAO,GAAqB,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAI;gBACjE,OAAO;oBACL,MAAM;oBACN,MAAM;AACN,oBAAA,OAAO,EAAE,KAAK;AACd,oBAAA,EAAE,EAAE,CAAA,YAAA,EAAe,MAAM,EAAE,CAAE,CAAA;iBAC9B,CAAC;AACJ,aAAC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC3D,YAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACpD,YAAA,IAAI,aAAa,EAAE;gBACjB,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,KAAM,CAAC,OAAO,CAAC,CAAC;AAC/C,aAAA;;AAED,YAAA,OAAO,QAAQ;AACZ,iBAAA,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,KAAM,EAAE,CAAC,EAAa,GAAI,EAAE,CAAC,EAAa,CAAC;iBACvD,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;SACvB,CAAA,CAAA;AAAA,KAAA;;IAGD,OAAO,GAAA;QACL,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,IAAI,CAAC,wBAAwB,EAAE,CAAC;AAChC,QAAA,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;KACxB;AAED;;;;;AAKG;IACH,mBAAmB,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,MAAM,KAAK,uBAAuB,CAAC;KAChD;;IAGO,kBAAkB,GAAA;QACxB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAChE,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9D,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;KACzE;;IAGO,qBAAqB,GAAA;QAC3B,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACnE,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACjE,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;KAC5E;AA+FD;;;;;;AAMG;IACW,sBAAsB,CAClC,WAA0B,EAC1B,YAAiC,EAAA;;AAEjC,YAAA,MAAM,EACJ,SAAS,EACT,MAAM,EACN,MAAM,EACN,UAAU,EACV,cAAc,EACd,mBAAmB,EACpB,GAAG,YAAY,CAAC;AACjB,YAAA,YAAY,CAAC,aAAa,GAAG,IAAI,CAAC;AAClC,YAAA,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;YAC1B,IAAI;gBACF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACnD,gBAAgB,CAAC,WAAW,CAAC,CAAC;AAC9B,gBAAA,YAAY,CAAC,UAAU,GAAG,UAAU,CAAC;gBACrC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AACvD,gBAAA,QAAQ,MAAM,CAAC,CAAC,CAAC;oBACf,KAAK,UAAU,EAAE;AACf,wBAAA,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAC7C,MACE,WAAW,CACT,IAAI,CAAC,UAAU,CAAC,mBAAmB,CACjC,WAAW,EACX,UAAU,EACV,mBAAmB,CACpB,EACD,gBAAgB,CACjB,EACH,gBAAgB,EAChB,MAAM,CAAC,WAAW,EAAE,CACrB,CAAC;wBACF,gBAAgB,CAAC,WAAW,CAAC,CAAC;AAC9B,wBAAA,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,GAAG,cAAc,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;AACtE,wBAAA,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;wBAClE,MAAM;AACP,qBAAA;oBACD,KAAK,MAAM,EAAE;wBACX,MAAM,MAAM,GAA2B,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACvD,wBAAA,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAC7C,MACE,WAAW,CACT,IAAI,CAAC,UAAU,CAAC,eAAe,CAC7B,WAAW,EACX,MAAM,EACN,UAAU,EACV,mBAAmB,CACpB,EACD,gBAAgB,CACjB,EACH,gBAAgB,EAChB,MAAM,CAAC,WAAW,EAAE,CACrB,CAAC;wBACF,gBAAgB,CAAC,WAAW,CAAC,CAAC;AAC9B,wBAAA,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,GAAG,cAAc,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC;AAClE,wBAAA,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;wBAC9D,MAAM;AACP,qBAAA;AACD,oBAAA;wBACE,MAAM;AACT,iBAAA;AACF,aAAA;AAAS,oBAAA;AACR,gBAAA,YAAY,CAAC,aAAa,GAAG,KAAK,CAAC;AACnC,gBAAA,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3B,aAAA;SACF,CAAA,CAAA;AAAA,KAAA;;IAmBO,iBAAiB,CAAC,SAAiB,EAAE,MAAqB,EAAA;QAChE,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,sBAAsB,CAAC,CAAC;KACtE;;IAGO,aAAa,CAAC,SAAiB,EAAE,MAAiB,EAAA;QACxD,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC;KAClE;AAED;;;;;;AAMG;AACK,IAAA,oBAAoB,CAC1B,SAAiB,EACjB,MAAS,EACT,cAAqC,EAAA;QAErC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;QAEtD,MAAM,YAAY,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClE,IAAI,CAAC,YAAY,EAAE;YACjB,OAAO;AACR,SAAA;AACD,QAAA,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;KAC7C;;AAGO,IAAA,aAAa,CACnB,SAAiB,EACjB,MAAS,EACT,cAAqC,EAAA;QAErC,MAAM,YAAY,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClE,IAAI,CAAC,YAAY,EAAE;YACjB,OAAO;AACR,SAAA;;;;QAID,qBAAqB,CACnB,YAAY,CAAC,UAAU,oBAClB,MAAM,CAAA,EACX,cAAc,CACf,CAAC;KACH;;IAGO,gBAAgB,CACtB,YAAiC,EACjC,MAAW,EAAA;QAEX,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC5D,YAAY,CAAC,MAAM,CAAC,CAAC;KACtB;AAED;;;;;AAKG;IACK,cAAc,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,EAAE;YACpC,OAAO;AACR,SAAA;AACD,QAAA,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,MAAW,SAAA,CAAA,IAAA,EAAA,KAAA,CAAA,EAAA,KAAA,CAAA,EAAA,aAAA;YAChD,IAAI;gBACF,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,mBAAmB,CAAC,CAAC;AAClE,aAAA;YAAC,OAAM,EAAA,EAAA;AACN,gBAAA,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;AAC7B,aAAA;AACH,SAAC,CAAA,EAAE,kBAAkB,CAAC,CAAC;KACxB;AAED;;;;;;;AAOG;;;AAGW,IAAA,qBAAqB,CACjC,OAAyB,EAAA;;YAEzB,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SAC3E,CAAA,CAAA;AAAA,KAAA;;AAGO,IAAA,gBAAgB,CAAC,KAAkB,EAAA;AACzC,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE;AAC5B,YAAA,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,CAAC,OAAO,EAAE;gBACb,KAAK,IAAI,CAAC,UAAU,CAClB,KAAK,CAAC,GAAG,EACT,CAAC,4CAA4C,EAAE,EAAE,OAAO,EAAE,CAAC,EAC3D,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EACzB,KAAK,CACN,CAAC;AACH,aAAA;AAAM,iBAAA;gBACL,KAAK,IAAI,CAAC,UAAU,CAClB,KAAK,CAAC,GAAG,EACT,CAAC,oCAAoC,CAAC,EACtC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EACzB,KAAK,CACN,CAAC;AACH,aAAA;AACF,SAAA;AAAM,aAAA,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;AACjC,YAAA,KAAK,IAAI,CAAC,UAAU,CAClB,OAAO,EACP,CAAC,UAAU,CAAC,EACZ,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EACzB,KAAK,CACN,CAAC;AACH,SAAA;AAAM,aAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;AAClC,YAAA,KAAK,IAAI,CAAC,UAAU,CAClB,KAAK,CAAC,GAAG,EACT,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EACvC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EACzB,KAAK,CACN,CAAC;AACH,SAAA;KACF;;AAGO,IAAA,aAAa,CAAC,KAAkB,EAAA;QACtC,QAAQ,KAAK,CAAC,IAAI;AAChB,YAAA,KAAK,SAAS;AACZ,gBAAA,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;gBAC1B,IAAI,CAAC,CAAC,OAAO,EAAE;AACb,oBAAA,OAAO,MAAM,IACX,IAAI,CAAC,IAAI,CACP;AACE,wBAAA,MAAM,EAAE,4CAA4C;wBACpD,OAAO,EAAE,KAAK,CAAC,OAAQ;qBACxB,EACD,MAAM,CACP,CAAC;AACL,iBAAA;AAAM,qBAAA;AACL,oBAAA,OAAO,MAAM,IACX,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,oCAAoC,EAAE,EAAE,MAAM,CAAC,CAAC;AACvE,iBAAA;AACH,YAAA,KAAK,OAAO;gBACV,OAAO,MAAM,IAAG;AACd,oBAAA,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC7D,oBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,WAAW,CAAC;AAClC,oBAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AAClC,iBAAC,CAAC;AACJ,YAAA,KAAK,QAAQ;gBACX,OAAO,MAAM,IAAG;AACd,oBAAA,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,EAAE;AAC1B,wBAAA,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;AACxB,qBAAA;AACD,oBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAC5D,iBAAC,CAAC;AACJ,YAAA;AACE,gBAAA,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;AAC9D,SAAA;KACF;AACF,CAAA;AAED,SAAS,uBAAuB,GAAA;AAC9B,IAAA,OAAO,iBAAiB,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,YAAY,GAAG,SAAS,CAAC;AAC7E,CAAC;AAED,SAAS,iBAAiB,GAAA;AACxB,IAAA,QACE,OAAO,OAAO,KAAK,WAAW;AAC9B,QAAA,OAAO,IAAI,IAAI;QACf,OAAO,CAAC,QAAQ,IAAI,IAAI;AACxB,QAAA,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,EAC7B;AACJ,CAAC;AAQD;AACA,SAAS,eAAe,GAAA;IACtB,IAAI,SAAS,GAAG,KAAK,CAAC;AACtB,IAAA,OAAO,EAAE,MAAM,EAAE,OAAO,SAAS,GAAG,IAAI,CAAC,EAAE,WAAW,EAAE,MAAM,SAAS,EAAE,CAAC;AAC5E,CAAC;AAED;AACA,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,SAAe,kBAAkB,CAC/B,CAAmB,EACnB,UAAkB,EAClB,WAA2C,GAAA,MAAM,IAAI,EAAA;;QAErD,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,CAAC;AACV,QAAA,OAAO,IAAI,EAAE;YACX,IAAI;gBACF,OAAO,MAAM,CAAC,EAAE,CAAC;AAClB,aAAA;AAAC,YAAA,OAAO,KAAK,EAAE;AACd,gBAAA,CAAC,EAAE,CAAC;gBACJ,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;AAC1C,oBAAA,MAAM,KAAK,CAAC;AACb,iBAAA;AACD,gBAAA,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;AAC1B,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;AACvB,oBAAA,MAAM,KAAK,CAAC;AACb,iBAAA;gBACD,YAAY;AACV,oBAAA,YAAY,KAAK,CAAC;AAChB,0BAAE,eAAe;0BACf,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,oBAAoB,GAAG,YAAY,CAAC,CAAC;AACtE,aAAA;AACF,SAAA;KACF,CAAA,CAAA;AAAA,CAAA;AAED,SAAS,KAAK,CAAC,EAAU,EAAA;AACvB,IAAA,OAAO,IAAI,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,WAAW,CAAI,OAAmB,EAAE,EAAU,EAAA;IACrD,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,OAAO;QACP,IAAI,OAAO,CAAI,CAAC,CAAC,EAAE,MAAM,KACvB,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CACnD;AACF,KAAA,CAAC,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAoB,EAAA;AAClD,IAAA,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAgB,EAAA;AAC1C,IAAA,OAAO,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,UAAU,CACjB,OAAyB,EAAA;AAEzB,IAAA,QACE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;AACtB,SAAC,OAAO,CAAC,OAAO,KAAK,KAAK,IAAK,OAA2B,CAAC,EAAE,KAAK,SAAS,CAAC,EAC5E;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,OAAyB,EAAA;AAEzB,IAAA,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,yBAAyB,CAChC,UAA2B,EAC3B,KAAoB,EAAA;AAEpB,IAAA,qBAAqB,CAAC,UAAU,EAAE,KAAK,EAAE,sBAAsB,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,qBAAqB,CAC5B,UAAuB,EACvB,KAAgB,EAAA;AAEhB,IAAA,qBAAqB,CAAC,UAAU,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC;AAC/D,CAAC;AAED;;;AAGG;AACH,SAAS,qBAAqB,CAC5B,UAAe,EACf,KAAQ,EACR,cAAoC,EAAA;AAEpC,IAAA,MAAM,kBAAkB,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;;;AAGjD,IAAA,MAAM,cAAc,GAAG,UAAU,CAAC,SAAS,CACzC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,GAAG,kBAAkB,GAAG,0BAA0B,CACzE,CAAC;AACF,IAAA,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE;AACzB,QAAA,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;AACvB,KAAA;AAAM,SAAA;AACL,QAAA,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;AACtC,KAAA;AACD,IAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,cAAc,CAAC,KAAuB,EAAA;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,IAAI,KAAK,CAAC;AACxD,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAuB,EAAA;AACjD,IAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE;AAC1B,QAAA,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;AACxD,KAAA;AACD,IAAA,OAAO,UAAU,IAAI,CAAC,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC;AACrE;;ACtyBA;;;;;AAKG;AACG,SAAU,iBAAiB,CAAC,MAAsB,EAAA;AACtD,IAAA,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;;;AAQG;MACU,OAAO,CAAA;AAWlB;;;AAGG;AACH,IAAA,WAAA,CAAY,MAAsB,EAAA;AAChC,QAAA,IAAI,CAAC,MAAM,GAAG,CAAA,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAN,MAAM,CAAE,MAAM,KAAI,uBAAuB,CAAC;AACxD,QAAA,IAAI,CAAC,OAAO,GAAG,CAAA,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAN,MAAM,CAAE,OAAO,KAAI,eAAe,CAAC;AAClD,QAAA,IAAI,CAAC,UAAU,GAAG,CAAA,MAAM,KAAA,IAAA,IAAN,MAAM,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAN,MAAM,CAAE,UAAU,KAAI,mBAAmB,CAAC;KAC7D;;IAGD,UAAU,GAAA;QACR,OAAO,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;KACrD;;IAGD,SAAS,GAAA;QACP,OAAO,oBAAoB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;KACxD;AAED;;;;;AAKG;AACH,IAAA,UAAU,CAAC,OAAgB,EAAA;;AAEzB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;KACxB;AAED;;;;;AAKG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;AAC9B,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,eAAe,CAC7C,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,UAAU,CAChB,CAAC;AACH,SAAA;QACD,OAAO,IAAI,CAAC,oBAAoB,CAAC;KAClC;AAED;;;;;AAKG;IACH,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE;AACjC,YAAA,IAAI,CAAC,uBAAuB,GAAG,IAAI,wBAAwB,CACzD,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,MAAM,CACZ,CAAC;AACH,SAAA;QACD,OAAO,IAAI,CAAC,uBAAuB,CAAC;KACrC;AACF;;ACxGD;;;AAGG;AAIH,MAAM,UAAU,GAAG,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,IAAI,CAAC;AAEpE;;;;AAIG;AACH;SACgB,gBAAgB,CAC9B,OAAe,EACf,UAAkB,EAClB,MAAW,EAAA;AAEX,IAAA,MAAM,SAAS,GAAG,OAAO,GAAG,GAAG,GAAG,UAAU,CAAC;AAC7C,IAAA,MAAM,MAAM,GAAuB;AACjC,QAAA,OAAO,EAAE,UAAU;AACjB,cAAE;AACE,gBAAA,4BAA4B,EAAE,OAAO;AACtC,aAAA;AACH,cAAE;AACE,gBAAA,4BAA4B,EAAE,OAAO;AACrC,gBAAA,iBAAiB,EAAE,MAAM;AAC1B,aAAA;AACL,QAAA,MAAM,EAAE,KAAK;AACb,QAAA,GAAG,EAAE,SAAS;QACd,MAAM;KACP,CAAC;AACF,IAAA,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC;AACvB;;ACjCO,MAAM,gCAAgC,GAAG,IAAI,CAAC;AAC9C,MAAM,0BAA0B,GAAG,GAAG,CAAC;AACvC,MAAM,4BAA4B,GAAG,EAAE,GAAG,IAAI,CAAC;AAC/C,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAE9C;;;;;AAKG;MACU,kBAAkB,CAAA;AAS7B,IAAA,WAAA,CAA6B,cAAc,4BAA4B,EAAA;QAA1C,IAAW,CAAA,WAAA,GAAX,WAAW,CAA+B;QARtD,IAAc,CAAA,cAAA,GAAG,gCAAgC,CAAC;QAClD,IAAiB,CAAA,iBAAA,GAAG,0BAA0B,CAAC;QAC/C,IAAU,CAAA,UAAA,GAAG,4BAA4B,CAAC;QAEnD,IAAW,CAAA,WAAA,GAAG,CAAC,CAAC;QAChB,IAAc,CAAA,cAAA,GAAG,CAAC,CAAC;QACnB,IAAW,CAAA,WAAA,GAAG,KAAK,CAAC;KAE+C;AAE3E;;;;AAIG;;IAEH,OAAO,GAAA;AACL,QAAA,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,EAAE;AACxC,YAAA,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,KAAK,CAAC,CAAwC,qCAAA,EAAA,IAAI,CAAC,WAAW,CAAE,CAAA,CAAC,CACtE,CAAC;AACH,SAAA;QACD,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,KAAK,CAAC,4CAA4C,CAAC,CACxD,CAAC;AACH,SAAA;QAED,MAAM,wBAAwB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACxE,IAAI,wBAAwB,GAAG,CAAC,EAAE;AAChC,YAAA,QAAQ,CACN,4BAA4B,EAC5B,mBAAmB,wBAAwB,CAAA,EAAA,CAAI,CAChD,CAAC;AACH,SAAA;;AAGD,QAAA,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,iBAAiB,CAAC;AAC9C,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;AACzE,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AACrE,QAAA,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;AAEtB,QAAA,OAAO,IAAI,OAAO,CAAC,OAAO,IAAG;AAC3B,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;AACzB,gBAAA,OAAO,EAAE,CAAC;aACX,EAAE,wBAAwB,CAAC,CAAC;AAC/B,SAAC,CAAC,CAAC;KACJ;AAED;;;;;AAKG;AACK,IAAA,YAAY,CAAC,OAAe,EAAA;QAClC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;KAC7E;AACF;;ACnED;;;;;;;AAOG;AACH;AACM,SAAgB,sBAAsB,CAC1C,OAAgB,EAChB,OAAuB,EACvB,MAAc,EACd,MAAW,EAAA;;QAEX,IAAI,SAAS,GAAsB,SAAS,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC3D,QAAA,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE;YACjE,IAAI;gBACF,IAAI,SAAS,KAAK,SAAS,EAAE;oBAC3B,OAAO,CAAC,aAAa,EAAE,CAAA,sBAAA,EAAyB,SAAS,CAAC,OAAO,CAAE,CAAA,CAAC,CAAC;AACtE,iBAAA;gBAED,IAAI;AACF,oBAAA,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;AACzB,iBAAA;AAAC,gBAAA,OAAO,GAAG,EAAE;;;oBAGZ,MAAM;AACP,iBAAA;AAED,gBAAA,IAAI,QAAQ,CAAC;AACb,gBAAA,QAAQ,OAAO;oBACb,KAAK,cAAc,CAAC,GAAG;AACrB,wBAAA,QAAQ,GAAG,MAAM,gBAAgB,CAC/B,OAAO,CAAC,SAAS,EAAE,EACnB,MAAM,EACN,MAAM,CACP,CAAC;wBACF,MAAM;oBACR,QAAQ;oBACR,KAAK,cAAc,CAAC,IAAI;AACtB,wBAAA,QAAQ,GAAG,MAAM,gBAAgB,CAC/B,OAAO,CAAC,UAAU,EAAE,EACpB,MAAM,EACN,MAAM,CACP,CAAC;wBACF,MAAM;AACT,iBAAA;AAED,gBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE;AAC3B,oBAAA,QAAQ,CAAC,MAAM,EAAE,uBAAuB,MAAM,CAAA,CAAE,CAAC,CAAC;oBAClD,OAAO,QAAQ,CAAC,IAAI,CAAC;AACtB,iBAAA;AAAM,qBAAA;AACL,oBAAA,OAAO,CACL,MAAM,EACN,CAAA,gBAAA,EAAmB,MAAM,CAAK,EAAA,EAAA,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,IAAI,CAAA,CAAE,CAClE,CAAC;AACF,oBAAA,SAAS,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC/D,iBAAA;AACF,aAAA;AAAC,YAAA,OAAO,GAAG,EAAE;AACZ,gBAAA,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE;AAC1D,oBAAA,MAAM,GAAG,CAAC;AACX,iBAAA;;AAED,gBAAA,SAAS,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACtE,gBAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE;oBAC9B,MAAM;AACP,iBAAA;AACF,aAAA;AACF,SAAA;AACD,QAAA,OAAO,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;KAClC,CAAA,CAAA;AAAA,CAAA;AAED,SAAS,oBAAoB,CAAC,GAAe,EAAA;AAC3C,IAAA,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,CAAC;AAC7B,IAAA,QACE,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAC1E;AACJ,CAAC;AAED;;;;;AAKG;AACoB,SAAA,gBAAgB,CAMrC,OAAgB,EAChB,OAAuB,EACvB,UAAkB,EAClB,UAAsB,EACtB,UAAsB,EACtB,MAAW,EAAA;;QAEX,IAAI,OAAO,GAAG,IAAI,CAAC;AACnB,QAAA,MAAM,aAAa,GAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAQ,MAAM,CAAE,CAAC;AACpC,QAAA,OAAO,OAAO,EAAE;AACd,YAAA,MAAM,QAAQ,GAAG,MAAM,OAAA,CAAA,sBAAsB,CAC3C,OAAO,EACP,OAAO,EACP,UAAU,EACV,aAAa,CACd,CAAA,CAAC;YACF,MAAM,MAAA,OAAA,CAAA,QAAQ,CAAA,CAAC;AACf,YAAA,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE;gBACtC,aAAa,CAAC,UAAU,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAQ,CAAC;AACzD,aAAA;AAAM,iBAAA;gBACL,OAAO,GAAG,KAAK,CAAC;AACjB,aAAA;AACF,SAAA;KACF,CAAA,CAAA;AAAA;;AChHK,SAAU,WAAW,CAAC,KAAsB,EAAA;AAChD,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,KAAK,CAAC;AACd,KAAA;AAAM,SAAA,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;AAClC,QAAA,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;AACrB,KAAA;AACD,IAAA,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;AAC1B,CAAC;AAQK,SAAU,qBAAqB,CACnC,cAA8B,EAAA;IAE9B,OAAO;QACL,OAAO,EAAE,cAAc,CAAC,OAAO;AAC/B,QAAA,IAAI,EAAE,cAAc,CAAC,gBAAgB,CAAC,IAAI;AAC1C,QAAA,MAAM,EAAE,cAAc,CAAC,gBAAgB,CAAC,MAAM;AAC9C,QAAA,WAAW,EAAE,cAAc,CAAC,gBAAgB,CAAC,WAAW;QACxD,SAAS,EAAE,iBAAiB,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAC;KACxE,CAAC;AACJ,CAAC;AAEe,SAAA,iBAAiB,CAC/B,UAAsB,EACtB,eAAuB,EAAA;;IAEvB,OAAO;AACL,QAAA,QAAQ,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE;AACtC,QAAA,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE;QACzD,SAAS,EAAE,iBAAiB,CAAC,CAAA,EAAA,GAAA,UAAU,CAAC,EAAE,CAAC,aAAa,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,SAAS,CAAC;KACrE,CAAC;AACJ,CAAC;AAEe,SAAA,aAAa,CAAC,MAAc,EAAE,eAAuB,EAAA;;IACnE,OAAO;AACL,QAAA,QAAQ,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE;QACtC,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC;QAC3C,SAAS,EAAE,iBAAiB,CAAC,CAAA,EAAA,GAAA,MAAM,CAAC,EAAE,CAAC,aAAa,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,SAAS,CAAC;QAChE,KAAK,EAAE,MAAM,CAAC,KAAK;AACnB,QAAA,WAAW,EAAE,mBAAmB,CAAC,MAAM,CAAC,WAAW,CAAC;QACpD,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,aAAa,EAAE,MAAM,CAAC,KAAK;QAC3B,WAAW,EAAE,MAAM,CAAC,QAAQ;AAC5B,QAAA,QAAQ,EAAE,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC3C,QAAA,KAAK,EAAE,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAA;;;IAGtC,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,iBAAiB,CAAC,SAA6B,EAAA;AACtD,IAAA,QAAQ,SAAS;AACf,QAAA,KAAK,QAAQ,CAAC;AACd,QAAA,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC,MAAM,CAAC;AAC7B,QAAA,KAAK,SAAS,CAAC;AACf,QAAA,KAAK,SAAS;YACZ,OAAO,YAAY,CAAC,OAAO,CAAC;AAC9B,QAAA;YACE,OAAO,YAAY,CAAC,OAAO,CAAC;AAC/B,KAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,WAA+B,EAAA;IAC1D,IAAI,WAAW,KAAK,SAAS,EAAE;AAC7B,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;AACD,IAAA,OAAO,OAAO,WAAW,KAAK,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAyB,EAAA;AACjD,IAAA,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE;AAC1D,QAAA,OAAO,SAAS,CAAC;AAClB,KAAA;AACD,IAAA,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,qBAAqB,CAAC,GAA2B,EAAA;IACxD,IAAI,GAAG,KAAK,SAAS,EAAE;AACrB,QAAA,OAAO,EAAE,CAAC;AACX,KAAA;AACD,IAAA,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC;AAChE;;ACzFA;SACgB,gBAAgB,CAC9B,OAAgB,EAChB,OAAe,EACf,iBAA4B,EAAA;AAE5B,IAAA,IAAI,iBAAiB,IAAI,iBAAiB,CAAC,MAAM,GAAG,IAAI,EAAE;AACxD,QAAA,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAC;AACH,KAAA;AACD,IAAA,OAAO,OAAO;AACX,SAAA,WAAW,EAAE;SACb,IAAI,CAAC,0BAA0B,EAAE;QAChC,OAAO;AACP,QAAA,iBAAiB,IAAI,0BAA0B;AAChD,KAAA,CAAC,CAAC;AACP,CAAC;AAED;AACgB,SAAA,gBAAgB,CAC9B,OAAgB,EAChB,OAAe,EAAA;AAEf,IAAA,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED;AACgB,SAAA,iBAAiB,CAC/B,OAAgB,EAChB,MAA4B,EAAA;IAE5B,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE;AAExD,QAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,MAAM,CACT,EAAA,EAAA,SAAS,EACP,MAAM,CAAC,SAAS,IAAI,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS,EACtE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS,EACzE,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS,EAAA,CAAA;AAEzE,KAAA,CAAC,CAAC;AACL,CAAC;AAED;AACgB,SAAA,sBAAsB,CACpC,OAAgB,EAChB,MAAiC,EAAA;AAEjC,IAAA,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,gCAAgC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AAChF;;AClBA,MAAM,cAAc,GAAG,IAAI,CAAC;AA6BtB,SAAgB,cAAc,CAClC,OAAgB,EAChB,wBAA0C,EAC1C,OAAsB,EACtB,SAAwB,EAAA;;AAExB,QAAA,IAAI,QAAQ,CAAC;AACb,QAAA,IAAI,eAAuB,CAAC;AAC5B,QAAA,IAAI,OAAO,wBAAwB,KAAK,QAAQ,EAAE;YAChD,eAAe,GAAG,wBAAwB,CAAC;YAC3C,QAAQ,GAAG,MAAM,sBAAsB,CACrC,OAAO,EACP,cAAc,CAAC,GAAG,EAClB,gBAAgB,EAChB;AACE,gBAAA,eAAe,EAAE,wBAAwB;gBACzC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,OAAQ,CAAC,CAAC,QAAQ,EAAE;AAC5C,gBAAA,SAAS,EAAE,SAAS,KAAK,YAAY,CAAC,OAAO,GAAG,SAAS,GAAG,SAAS;AACtE,aAAA,CACF,CAAC;AACH,SAAA;AAAM,aAAA;AACL,YAAA,eAAe,GAAG,wBAAwB,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC5D,QAAQ,GAAG,MAAM,sBAAsB,CACrC,OAAO,EACP,cAAc,CAAC,GAAG,EAClB,gBAAgB,EAChB;AACE,gBAAA,eAAe,EAAE,wBAAwB,CAAC,QAAQ,CAAC,OAAO;gBAC1D,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE;AACpE,gBAAA,SAAS,EACP,wBAAwB,CAAC,SAAS,KAAK,YAAY,CAAC,OAAO;sBACvD,wBAAwB,CAAC,SAAS;AACpC,sBAAE,SAAS;AAChB,aAAA,CACF,CAAC;AACH,SAAA;AACD,QAAA,OAAO,aAAa,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;KACjD,CAAA,CAAA;AAAA,CAAA;AAyBqB,SAAA,sBAAsB,CAC1C,OAAgB,EAChB,gCAA0D,EAAA;;AAE1D,QAAA,IAAI,QAAQ,CAAC;AACb,QAAA,IAAI,OAAO,gCAAgC,KAAK,QAAQ,EAAE;YACxD,QAAQ,GAAG,MAAM,sBAAsB,CAGrC,OAAO,EAAE,cAAc,CAAC,GAAG,EAAE,qBAAqB,EAAE;AACpD,gBAAA,eAAe,EAAE,gCAAgC;AAClD,aAAA,CAAC,CAAC;AACJ,SAAA;AAAM,aAAA;YACL,QAAQ,GAAG,MAAM,sBAAsB,CAGrC,OAAO,EAAE,cAAc,CAAC,GAAG,EAAE,qBAAqB,EAAE;gBACpD,eAAe,EAAE,gCAAgC,CAAC,OAAO;AAC1D,aAAA,CAAC,CAAC;AACJ,SAAA;AACD,QAAA,OAAO,qBAAqB,CAAC,QAAQ,CAAC,CAAC;KACxC,CAAA,CAAA;AAAA,CAAA;SAoCsB,uBAAuB,CAC5C,OAAgB,EAChB,KAAa,EACb,OAA6D,EAAA;;;AAE7D,QAAA,MAAM,YAAY,GAAG,0BAA0B,CAAC,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAP,OAAO,CAAE,YAAY,CAAC,CAAC;;AACvE,YAAA,KAA6B,IAAA,EAAA,GAAA,aAAA,CAAA,gBAAgB,CAC3C,OAAO,EACP,cAAc,CAAC,GAAG,EAClB,SAAS,EACT,SAAS,EACT,SAAS,EACT;AACE,gBAAA,iBAAiB,EAAE,OAAO,KAAA,IAAA,IAAP,OAAO,KAAP,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,OAAO,CAAE,iBAAiB;AAC7C,gBAAA,OAAO,EAAE,OAAO,KAAA,IAAA,IAAP,OAAO,KAAP,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,OAAO,CAAE,OAAO;AACzB,gBAAA,OAAO,EAAE,OAAO,KAAA,IAAA,IAAP,OAAO,KAAP,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,OAAO,CAAE,cAAc;gBAChC,KAAK;gBACL,YAAY;AACb,aAAA,CACF,CAAA,EAAA,EAAA,EAAA,EAAA,GAAA,MAAA,OAAA,CAAA,EAAA,CAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,CAAA,IAAA,GAAA;gBAbU,MAAM,QAAQ,WAAA,CAAA;AAcvB,gBAAA,KAAK,MAAM,QAAQ,IAAI,QAAQ,CAAC,SAEX,EAAE;AACrB,oBAAA,MAAA,MAAA,OAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACK,qBAAqB,CAAC,QAAQ,CAAC,KAClC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IACpC,CAAC;AACH,iBAAA;AACF,aAAA;;;;;;;;;KACF,CAAA,CAAA;AAAA,CAAA;SAoCqB,eAAe,CACnC,OAAgB,EAChB,KAAa,EACb,OAA6D,EAAA;;AAE7D,QAAA,MAAM,YAAY,GAAG,0BAA0B,CAAC,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAP,OAAO,CAAE,YAAY,CAAC,CAAC;AACvE,QAAA,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAG3C,OAAO,EAAE,cAAc,CAAC,GAAG,EAAE,SAAS,EAAE;AACxC,YAAA,iBAAiB,EAAE,OAAO,KAAA,IAAA,IAAP,OAAO,KAAP,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,OAAO,CAAE,iBAAiB;AAC7C,YAAA,OAAO,EAAE,OAAO,KAAA,IAAA,IAAP,OAAO,KAAP,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,OAAO,CAAE,OAAO;AACzB,YAAA,OAAO,EAAE,OAAO,KAAA,IAAA,IAAP,OAAO,KAAP,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,OAAO,CAAE,cAAc;YAChC,KAAK;YACL,YAAY;AACb,SAAA,CAAC,CAAC;QACH,OAAO;YACL,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,KAChC,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EAAA,qBAAqB,CAAC,GAAG,CAAC,CAC7B,EAAA,EAAA,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAA,CAAA,CAC9B,CAAC;YACH,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,UAAU,EAAE,QAAQ,CAAC,UAAU;SAChC,CAAC;KACH,CAAA,CAAA;AAAA,CAAA;SAqCqB,oBAAoB,CACxC,OAAgB,EAChB,eAAuB,EACvB,OAAuE,EAAA;;AAEvE,QAAA,MAAM,YAAY,GAAG,0BAA0B,CAAC,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAP,OAAO,CAAE,YAAY,CAAC,CAAC;AACvE,QAAA,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAG3C,OAAO,EAAE,cAAc,CAAC,GAAG,EAAE,sBAAsB,EAAE;YACrD,eAAe;AACf,YAAA,UAAU,EAAE,OAAO,KAAA,IAAA,IAAP,OAAO,KAAP,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,OAAO,CAAE,OAAO;YAC5B,YAAY;AACb,SAAA,CAAC,CAAC;QAEH,OAAO;AACL,YAAA,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IACzB,+BAA+B,CAAC,GAAG,EAAE,eAAe,CAAC,CACtD;YACD,OAAO,EAAE,QAAQ,CAAC,SAAS;SAC5B,CAAC;KACH,CAAA,CAAA;AAAA,CAAA;SA2Be,eAAe,CAC7B,OAAgB,EAChB,oBAAsC,EACtC,OAAsB,EAAA;AAEtB,IAAA,IAAI,OAAO,oBAAoB,KAAK,QAAQ,EAAE;QAC5C,OAAO,sBAAsB,CAC3B,OAAO,EACP,cAAc,CAAC,GAAG,EAClB,mBAAmB,EACnB;AACE,YAAA,eAAe,EAAE,oBAAoB;YACrC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,OAAQ,CAAC,CAAC,QAAQ,EAAE;AAC7C,SAAA,CACF,CAAC;AACH,KAAA;AAAM,SAAA;QACL,OAAO,sBAAsB,CAC3B,OAAO,EACP,cAAc,CAAC,GAAG,EAClB,mBAAmB,EACnB;AACE,YAAA,eAAe,EAAE,oBAAoB,CAAC,QAAQ,CAAC,OAAO;YACtD,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE;AACjE,SAAA,CACF,CAAC;AACH,KAAA;AACH,CAAC;AAyBqB,SAAA,sBAAsB,CAC1C,OAAgB,EAChB,oBAAsC,EAAA;;AAEtC,QAAA,IAAI,QAAQ,CAAC;AACb,QAAA,IAAI,OAAO,oBAAoB,KAAK,QAAQ,EAAE;YAC5C,QAAQ,GAAG,MAAM,sBAAsB,CAGrC,OAAO,EAAE,cAAc,CAAC,GAAG,EAAE,wBAAwB,EAAE;AACvD,gBAAA,eAAe,EAAE,oBAAoB;AACtC,aAAA,CAAC,CAAC;AACJ,SAAA;AAAM,aAAA;YACL,QAAQ,GAAG,MAAM,sBAAsB,CAGrC,OAAO,EAAE,cAAc,CAAC,GAAG,EAAE,wBAAwB,EAAE;AACvD,gBAAA,eAAe,EAAE,oBAAoB,CAAC,QAAQ,CAAC,OAAO;AACvD,aAAA,CAAC,CAAC;AACJ,SAAA;QAED,OAAO;YACL,MAAM,EAAE,QAAQ,CAAC,cAAc;SAChC,CAAC;KACH,CAAA,CAAA;AAAA,CAAA;SAuCsB,4BAA4B,CACjD,OAAgB,EAChB,eAAuB,EACvB,OAAuE,EAAA;;;AAEvE,QAAA,MAAM,YAAY,GAAG,0BAA0B,CAAC,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAP,OAAO,CAAE,YAAY,CAAC,CAAC;;AACvE,YAAA,KAA6B,IAAA,EAAA,GAAA,aAAA,CAAA,gBAAgB,CAC3C,OAAO,EACP,cAAc,CAAC,GAAG,EAClB,sBAAsB,EACtB,YAAY,EACZ,WAAW,EACX;gBACE,eAAe;AACf,gBAAA,UAAU,EAAE,OAAO,KAAA,IAAA,IAAP,OAAO,KAAP,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,OAAO,CAAE,OAAO;gBAC5B,YAAY;AACb,aAAA,CACF,CAAA,EAAA,EAAA,EAAA,EAAA,GAAA,MAAA,OAAA,CAAA,EAAA,CAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,CAAA,IAAA,GAAA;gBAXU,MAAM,QAAQ,WAAA,CAAA;AAYvB,gBAAA,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,IAEL,EAAE;AACtB,oBAAA,MAAA,MAAA,OAAA,CAAM,+BAA+B,CAAC,GAAG,EAAE,eAAe,CAAC,CAAA,CAAC;AAC7D,iBAAA;AACF,aAAA;;;;;;;;;KACF,CAAA,CAAA;AAAA,CAAA;AAED;;;;;;;AAOG;SACmB,iBAAiB,CACrC,OAAgB,EAChB,KAAa,EACb,iBAA2B,EAAA;;AAE3B,QAAA,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE;AAClC,YAAA,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;AAC/D,SAAA;QACD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE;YACrD,iBAAiB;AACjB,YAAA,YAAY,EAAE,IAAI;AACnB,SAAA,CAAC,CAAC;AACH,QAAA,OAAO,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;KACtC,CAAA,CAAA;AAAA,CAAA;AAED;;;;;;;;AAQG;AACmB,SAAA,iBAAiB,CACrC,OAAgB,EAChB,eAAuB,EAAA;;QAEvB,OAAO,sBAAsB,CAC3B,OAAO,EACP,cAAc,CAAC,GAAG,EAClB,gBAAgB,EAChB;YACE,eAAe;AAChB,SAAA,CACF,CAAC;KACH,CAAA,CAAA;AAAA,CAAA;AAED;;;;;;;AAOG;AACG,SAAgB,mBAAmB,CAAC,OAAgB,EAAA;;AACxD,QAAA,OAAO,sBAAsB,CAC3B,OAAO,EACP,cAAc,CAAC,GAAG,EAClB,kBAAkB,EAClB,SAAS,CACV,CAAC;KACH,CAAA,CAAA;AAAA,CAAA;AAED;;;;;;AAMG;AACmB,SAAA,gBAAgB,CACpC,OAAgB,EAChB,eAAuB,EAAA;;QAEvB,OAAO,sBAAsB,CAC3B,OAAO,EACP,cAAc,CAAC,GAAG,EAClB,eAAe,EACf;YACE,eAAe;AAChB,SAAA,CACF,CAAC;KACH,CAAA,CAAA;AAAA,CAAA;AAED;;;;;;;;;;;;AAYG;AACmB,SAAA,oBAAoB,CACxC,OAAgB,EAChB,eAAuB,EAAA;;;AAEvB,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;AACvC,QAAA,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,CAAC;QACxD,IACE,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,eAAe,CAAC;AACzD,YAAA,cAAc,EACd;AACA,YAAA,MAAM,IAAI,KAAK,CAAC,aAAa,eAAe,CAAA,gBAAA,CAAkB,CAAC,CAAC;AACjE,SAAA;;AAGD,QAAA,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAC7C,CAAC,EACD,eAAe,GAAG,CAAC,EACnB,eAAe,EACf,OAAO,CACR,CAAC;;AAGF,QAAA,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,OAAO,EAAE;AACvD,YAAA,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC;AAC/B,SAAA,CAAC,CAAC;QACH,MAAM,eAAe,GAAG,CAAA,EAAA,GAAA,UAAU,CAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,IAAI,CAC/C,OAAO,IAAI,OAAO,CAAC,eAAe,KAAK,eAAe,CAAC,WAAW,EAAE,CACrE,CAAC;QACF,OAAO;AACL,YAAA,eAAe,EAAE,eAAe,KAAA,IAAA,IAAf,eAAe,KAAf,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,eAAe,CAAE,IAAI;AACtC,YAAA,WAAW,EAAE,UAAU;SACxB,CAAC;;AACH,CAAA;SAsCqB,kBAAkB,CACtC,OAAgB,EAChB,wBAA0C,EAC1C,OAAsB,EAAA;;AAEtB,QAAA,IAAI,eAAuB,CAAC;AAC5B,QAAA,IAAI,aAAqB,CAAC;AAC1B,QAAA,IAAI,OAAO,wBAAwB,KAAK,QAAQ,EAAE;YAChD,eAAe,GAAG,wBAAwB,CAAC;YAC3C,aAAa,GAAG,SAAS,CAAC,IAAI,CAAC,OAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC;AACrD,SAAA;AAAM,aAAA;AACL,YAAA,eAAe,GAAG,wBAAwB,CAAC,QAAQ,CAAC,OAAO,CAAC;AAC5D,YAAA,aAAa,GAAG,wBAAwB,CAAC,OAAO,CAAC;AAClD,SAAA;QACD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;AACtE,QAAA,OAAO,KAAK,CAAC,eAAe,KAAK,MAAM,CAAC,eAAe,CAAC;KACzD,CAAA,CAAA;AAAA,CAAA;AAED,SAAe,OAAO,CACpB,OAAgB,EAChB,eAAuB,EACvB,OAAqB,EAAA;;AAErB,QAAA,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAC3C,OAAO,EACP,cAAc,CAAC,GAAG,EAClB,gBAAgB,EAChB;YACE,eAAe;YACf,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,OAAQ,CAAC,CAAC,QAAQ,EAAE;AAC5C,YAAA,YAAY,EAAE,IAAI;AACnB,SAAA,CACF,CAAC;AACF,QAAA,OAAO,aAAa,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;KACjD,CAAA,CAAA;AAAA,CAAA;AAED;;;;;AAKG;AACH,SAAe,sBAAsB,CACnC,KAAa,EACb,GAAW,EACX,OAAe,EACf,OAAgB,EAAA;;QAEhB,IAAI,KAAK,IAAI,GAAG,EAAE;AAChB,YAAA,OAAO,GAAG,CAAC;AACZ,SAAA;AAED,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC;AAC1C,QAAA,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC/D,IAAI,IAAI,KAAK,cAAc,EAAE;AAC3B,YAAA,OAAO,sBAAsB,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/D,SAAA;QACD,OAAO,sBAAsB,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;KAC7D,CAAA,CAAA;AAAA,CAAA;AAED;;;;;AAKG;AACH,SAAS,qBAAqB,CAC5B,QAAuC,EAAA;AAEvC,IAAA,IAAI,iBAAiB,CAAC,QAAQ,CAAC,EAAE;QAC/B,OAAO,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC3D,KAAA;AAAM,SAAA;QACL,OAAO,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC/D,KAAA;AACH,CAAC;AAED;;;;;AAKG;AACH,SAAS,+BAA+B,CACtC,QAAiD,EACjD,eAAuB,EAAA;AAEvB,IAAA,IAAI,iBAAiB,CAAC,QAAQ,CAAC,EAAE;AAC/B,QAAA,OAAO,aAAa,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;AACjD,KAAA;AAAM,SAAA;AACL,QAAA,OAAO,iBAAiB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;AACrD,KAAA;AACH,CAAC;AAED;AACA;AACA,SAAS,iBAAiB,CAAC,QAA6B,EAAA;AACtD,IAAA,OAAQ,QAAmB,CAAC,KAAK,KAAK,SAAS,CAAC;AAClD,CAAC;AAED;;;;;;AAMG;AACH,SAAS,0BAA0B,CACjC,YAAiC,EAAA;AAEjC,IAAA,OAAO,YAAY,KAAK,SAAS,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC;AAC3D;;;;"}