{"version":3,"sources":["../src/marketplace/filters.ts"],"sourcesContent":["import type { Token } from \"@dojoengine/torii-wasm/types\";\nimport { addAddressPadding } from \"starknet\";\nimport { fetchToriisSql } from \"../modules/torii-sql-fetcher\";\nimport { DEFAULT_PROJECT_ID, parseJsonSafe, resolveProjects } from \"./utils\";\n\nexport interface TraitSelection {\n  name: string;\n  value: string;\n}\n\nexport interface TraitMetadataRow {\n  traitName: string;\n  traitValue: string;\n  count: number;\n}\n\nexport type ActiveFilters = Record<string, Set<string>>;\n\nexport type AvailableFilters = Record<string, Record<string, number>>;\n\nexport interface PrecomputedFilterProperty {\n  property: string;\n  order: number;\n  count: number;\n}\n\nexport interface PrecomputedFilterData {\n  attributes: string[];\n  properties: Record<string, PrecomputedFilterProperty[]>;\n}\n\nexport interface CollectionTraitMetadataPage {\n  projectId: string;\n  traits: TraitMetadataRow[];\n}\n\nexport interface CollectionTraitMetadataError {\n  projectId?: string;\n  error: Error;\n}\n\nexport interface FetchCollectionTraitMetadataOptions {\n  address: string;\n  projects?: string[];\n  traits?: TraitSelection[];\n  defaultProjectId?: string;\n}\n\nexport interface FetchCollectionTraitMetadataResult {\n  pages: CollectionTraitMetadataPage[];\n  errors: CollectionTraitMetadataError[];\n}\n\nexport interface TraitNameSummary {\n  traitName: string;\n  valueCount: number;\n}\n\nexport interface TraitNameSummaryPage {\n  projectId: string;\n  traits: TraitNameSummary[];\n}\n\nexport interface FetchTraitNamesSummaryOptions {\n  address: string;\n  projects?: string[];\n  defaultProjectId?: string;\n}\n\nexport interface FetchTraitNamesSummaryResult {\n  pages: TraitNameSummaryPage[];\n  errors: CollectionTraitMetadataError[];\n}\n\nexport interface TraitValueRow {\n  traitValue: string;\n  count: number;\n}\n\nexport interface TraitValuePage {\n  projectId: string;\n  values: TraitValueRow[];\n}\n\nexport interface FetchTraitValuesOptions {\n  address: string;\n  traitName: string;\n  otherTraitFilters?: TraitSelection[];\n  projects?: string[];\n  defaultProjectId?: string;\n}\n\nexport interface FetchTraitValuesResult {\n  pages: TraitValuePage[];\n  errors: CollectionTraitMetadataError[];\n}\n\nexport interface FetchExpandedTraitsMetadataOptions {\n  address: string;\n  traitNames: string[];\n  otherTraitFilters?: TraitSelection[];\n  projects?: string[];\n  defaultProjectId?: string;\n}\n\nconst escapeSqlValue = (value: string): string => {\n  return value.replace(/'/g, \"''\");\n};\n\nconst buildTraitWhereClause = (traits: TraitSelection[]): string => {\n  if (!traits.length) {\n    return \"1 = 1\";\n  }\n\n  return traits\n    .map(({ name, value }) => {\n      const traitName = escapeSqlValue(name);\n      const traitValue = escapeSqlValue(value);\n      return `(trait_name LIKE '${traitName}' AND trait_value LIKE '${traitValue}')`;\n    })\n    .join(\" OR \");\n};\n\nconst buildTraitNamesSummaryQuery = (address: string): string => {\n  const paddedAddress = addAddressPadding(address);\n  return `SELECT \n\t\t\t\ttrait_name,\n\t\t\t\tCOUNT(DISTINCT trait_value) as value_count,\n\t\t\t\tSUM(cnt) as total_count\n\t\t\tFROM (\n\t\t\t\tSELECT trait_name, trait_value, COUNT(*) as cnt\n\t\t\t\tFROM token_attributes\n\t\t\t\tWHERE token_id IN (\n\t\t\t\t\tSELECT token_id\n\t\t\t\t\tFROM token_attributes\n\t\t\t\t\tWHERE token_id LIKE '${paddedAddress}:%'\n\t\t\t\t\tGROUP BY token_id\n\t\t\t\t)\n\t\t\t\tGROUP BY trait_name, trait_value\n\t\t\t)\n\t\t\tGROUP BY trait_name\n\t\t\tORDER BY trait_name;`;\n};\n\nconst buildTraitValuesQuery = ({\n  address,\n  traitName,\n  otherTraitFilters = [],\n}: {\n  address: string;\n  traitName: string;\n  otherTraitFilters?: TraitSelection[];\n}): string => {\n  const paddedAddress = addAddressPadding(address);\n  const escapedTraitName = escapeSqlValue(traitName);\n\n  if (otherTraitFilters.length === 0) {\n    return `SELECT trait_value, COUNT(*) as count\nFROM token_attributes\nWHERE token_id LIKE '${paddedAddress}:%'\n  AND trait_name = '${escapedTraitName}'\nGROUP BY trait_value\nORDER BY count DESC`;\n  }\n\n  const whereClause = buildTraitWhereClause(otherTraitFilters);\n  return `SELECT trait_value, COUNT(*) as count\nFROM token_attributes\nWHERE trait_name = '${escapedTraitName}'\n  AND token_id IN (\n    SELECT token_id\n    FROM token_attributes\n    WHERE ${whereClause}\n      AND token_id LIKE '${paddedAddress}:%'\n    GROUP BY token_id\n    HAVING COUNT(DISTINCT trait_name) = ${otherTraitFilters.length}\n  )\nGROUP BY trait_value\nORDER BY count DESC`;\n};\n\nconst buildExpandedTraitsMetadataQuery = ({\n  address,\n  traitNames,\n  otherTraitFilters = [],\n}: {\n  address: string;\n  traitNames: string[];\n  otherTraitFilters?: TraitSelection[];\n}): string => {\n  const paddedAddress = addAddressPadding(address);\n\n  if (traitNames.length === 0) {\n    return \"SELECT trait_name, trait_value, 0 as count WHERE 1 = 0\";\n  }\n\n  const traitNamesCondition = traitNames\n    .map((name) => `'${escapeSqlValue(name)}'`)\n    .join(\", \");\n\n  if (otherTraitFilters.length === 0) {\n    return `SELECT trait_name, trait_value, COUNT(*) as count\nFROM token_attributes\nWHERE token_id LIKE '${paddedAddress}:%'\n  AND trait_name IN (${traitNamesCondition})\nGROUP BY trait_name, trait_value\nORDER BY trait_name, count DESC`;\n  }\n\n  const whereClause = buildTraitWhereClause(otherTraitFilters);\n  return `SELECT trait_name, trait_value, COUNT(*) as count\nFROM token_attributes\nWHERE trait_name IN (${traitNamesCondition})\n  AND token_id IN (\n    SELECT token_id\n    FROM token_attributes\n    WHERE ${whereClause}\n      AND token_id LIKE '${paddedAddress}:%'\n    GROUP BY token_id\n    HAVING COUNT(DISTINCT trait_name) = ${otherTraitFilters.length}\n  )\nGROUP BY trait_name, trait_value\nORDER BY trait_name, count DESC`;\n};\n\nconst buildTraitMetadataQuery = ({\n  address,\n  traits,\n}: {\n  address: string;\n  traits: TraitSelection[];\n}): string => {\n  const paddedAddress = addAddressPadding(address);\n  const whereClause = buildTraitWhereClause(traits);\n  const havingClause = traits.length\n    ? `HAVING COUNT(DISTINCT trait_name) = ${traits.length}`\n    : \"\";\n\n  return `SELECT trait_name, trait_value, COUNT(*) AS count\nFROM token_attributes\nWHERE token_id IN (\n    SELECT token_id\n    FROM token_attributes\n    WHERE ${whereClause}\n      AND token_id LIKE '${paddedAddress}:%'\n    GROUP BY token_id\n    ${havingClause}\n)\nGROUP BY trait_name, trait_value\nORDER BY trait_name, count DESC`;\n};\n\nconst normalizeMetadataRow = (row: any): TraitMetadataRow | null => {\n  if (!row) return null;\n\n  const traitName =\n    typeof row.trait_name === \"string\"\n      ? row.trait_name\n      : typeof row.traitName === \"string\"\n        ? row.traitName\n        : null;\n\n  const traitValue =\n    typeof row.trait_value === \"string\"\n      ? row.trait_value\n      : typeof row.traitValue === \"string\"\n        ? row.traitValue\n        : null;\n\n  if (!traitName || !traitValue) {\n    return null;\n  }\n\n  const countRaw =\n    typeof row.count === \"number\"\n      ? row.count\n      : typeof row.count === \"string\"\n        ? Number.parseInt(row.count, 10)\n        : Number(row.count ?? 0);\n\n  const count = Number.isFinite(countRaw) ? Number(countRaw) : 0;\n\n  return { traitName, traitValue, count };\n};\n\nconst extractRows = (data: any): any[] => {\n  if (!data) return [];\n  if (Array.isArray(data)) return data;\n  if (Array.isArray(data.data)) return data.data;\n  if (Array.isArray(data.rows)) return data.rows;\n  if (Array.isArray(data.result)) return data.result;\n  return [];\n};\n\nconst normalizeTraitNameSummary = (row: any): TraitNameSummary | null => {\n  if (!row) return null;\n\n  const traitName =\n    typeof row.trait_name === \"string\"\n      ? row.trait_name\n      : typeof row.traitName === \"string\"\n        ? row.traitName\n        : null;\n\n  if (!traitName) return null;\n\n  const valueCountRaw =\n    typeof row.value_count === \"number\"\n      ? row.value_count\n      : typeof row.valueCount === \"number\"\n        ? row.valueCount\n        : typeof row.value_count === \"bigint\"\n          ? Number(row.value_count)\n          : typeof row.valueCount === \"bigint\"\n            ? Number(row.valueCount)\n            : typeof row.value_count === \"string\"\n              ? Number.parseInt(row.value_count, 10)\n              : typeof row.valueCount === \"string\"\n                ? Number.parseInt(row.valueCount, 10)\n                : 0;\n\n  const valueCount = Number.isFinite(valueCountRaw) ? valueCountRaw : 0;\n\n  return { traitName, valueCount };\n};\n\nconst normalizeTraitValueRow = (row: any): TraitValueRow | null => {\n  if (!row) return null;\n\n  const traitValue =\n    typeof row.trait_value === \"string\"\n      ? row.trait_value\n      : typeof row.traitValue === \"string\"\n        ? row.traitValue\n        : null;\n\n  if (!traitValue) return null;\n\n  const countRaw =\n    typeof row.count === \"number\"\n      ? row.count\n      : typeof row.count === \"bigint\"\n        ? Number(row.count)\n        : typeof row.count === \"string\"\n          ? Number.parseInt(row.count, 10)\n          : 0;\n\n  const count = Number.isFinite(countRaw) ? countRaw : 0;\n\n  return { traitValue, count };\n};\n\nexport async function fetchTraitNamesSummary(\n  options: FetchTraitNamesSummaryOptions,\n): Promise<FetchTraitNamesSummaryResult> {\n  const { address, projects, defaultProjectId = DEFAULT_PROJECT_ID } = options;\n\n  const projectIds = resolveProjects(projects, defaultProjectId);\n  if (projectIds.length === 0) {\n    return { pages: [], errors: [] };\n  }\n\n  const query = buildTraitNamesSummaryQuery(address);\n\n  const response = await fetchToriisSql(projectIds, query);\n\n  const pages: TraitNameSummaryPage[] = [];\n  const unmatchedProjects = new Set(projectIds);\n\n  for (const entry of response.data ?? []) {\n    if (!entry) continue;\n    const projectId =\n      typeof entry.endpoint === \"string\"\n        ? entry.endpoint\n        : projectIds.length === 1\n          ? projectIds[0]\n          : undefined;\n\n    if (!projectId) continue;\n\n    unmatchedProjects.delete(projectId);\n\n    const rows = extractRows(entry);\n    const traits: TraitNameSummary[] = [];\n\n    for (const row of rows) {\n      const normalized = normalizeTraitNameSummary(row);\n      if (normalized) traits.push(normalized);\n    }\n\n    pages.push({ projectId, traits });\n  }\n\n  const errors: CollectionTraitMetadataError[] = [];\n  const rawErrors = response.errors ?? [];\n  const remainingProjects = Array.from(unmatchedProjects);\n\n  rawErrors.forEach((error, index) => {\n    const projectId = remainingProjects[index];\n    errors.push({\n      projectId,\n      error: error instanceof Error ? error : new Error(String(error)),\n    });\n  });\n\n  return { pages, errors };\n}\n\nexport function aggregateTraitNamesSummary(\n  pages: TraitNameSummaryPage[],\n): TraitNameSummary[] {\n  const aggregate = new Map<string, TraitNameSummary>();\n\n  for (const page of pages) {\n    for (const trait of page.traits) {\n      const existing = aggregate.get(trait.traitName);\n      if (existing) {\n        existing.valueCount = Math.max(existing.valueCount, trait.valueCount);\n      } else {\n        aggregate.set(trait.traitName, { ...trait });\n      }\n    }\n  }\n\n  return Array.from(aggregate.values()).sort((a, b) =>\n    a.traitName.localeCompare(b.traitName),\n  );\n}\n\nexport async function fetchTraitValues(\n  options: FetchTraitValuesOptions,\n): Promise<FetchTraitValuesResult> {\n  const {\n    address,\n    traitName,\n    otherTraitFilters = [],\n    projects,\n    defaultProjectId = DEFAULT_PROJECT_ID,\n  } = options;\n\n  const projectIds = resolveProjects(projects, defaultProjectId);\n  if (projectIds.length === 0) {\n    return { pages: [], errors: [] };\n  }\n\n  const query = buildTraitValuesQuery({\n    address,\n    traitName,\n    otherTraitFilters,\n  });\n\n  const response = await fetchToriisSql(projectIds, query);\n\n  const pages: TraitValuePage[] = [];\n  const unmatchedProjects = new Set(projectIds);\n\n  for (const entry of response.data ?? []) {\n    if (!entry) continue;\n    const projectId =\n      typeof entry.endpoint === \"string\"\n        ? entry.endpoint\n        : projectIds.length === 1\n          ? projectIds[0]\n          : undefined;\n\n    if (!projectId) continue;\n\n    unmatchedProjects.delete(projectId);\n\n    const rows = extractRows(entry);\n    const values: TraitValueRow[] = [];\n\n    for (const row of rows) {\n      const normalized = normalizeTraitValueRow(row);\n      if (normalized) values.push(normalized);\n    }\n\n    pages.push({ projectId, values });\n  }\n\n  const errors: CollectionTraitMetadataError[] = [];\n  const rawErrors = response.errors ?? [];\n  const remainingProjects = Array.from(unmatchedProjects);\n\n  rawErrors.forEach((error, index) => {\n    const projectId = remainingProjects[index];\n    errors.push({\n      projectId,\n      error: error instanceof Error ? error : new Error(String(error)),\n    });\n  });\n\n  return { pages, errors };\n}\n\nexport function aggregateTraitValues(pages: TraitValuePage[]): TraitValueRow[] {\n  const aggregate = new Map<string, TraitValueRow>();\n\n  for (const page of pages) {\n    for (const value of page.values) {\n      const existing = aggregate.get(value.traitValue);\n      if (existing) {\n        existing.count += value.count;\n      } else {\n        aggregate.set(value.traitValue, { ...value });\n      }\n    }\n  }\n\n  return Array.from(aggregate.values()).sort((a, b) => b.count - a.count);\n}\n\nexport async function fetchExpandedTraitsMetadata(\n  options: FetchExpandedTraitsMetadataOptions,\n): Promise<FetchCollectionTraitMetadataResult> {\n  const {\n    address,\n    traitNames,\n    otherTraitFilters,\n    projects,\n    defaultProjectId = DEFAULT_PROJECT_ID,\n  } = options;\n\n  if (traitNames.length === 0) {\n    return { pages: [], errors: [] };\n  }\n\n  const projectIds = resolveProjects(projects, defaultProjectId);\n  if (projectIds.length === 0) {\n    return { pages: [], errors: [] };\n  }\n\n  const query = buildExpandedTraitsMetadataQuery({\n    address,\n    traitNames,\n    otherTraitFilters,\n  });\n\n  const response = await fetchToriisSql(projectIds, query);\n\n  const pages: CollectionTraitMetadataPage[] = [];\n  const unmatchedProjects = new Set(projectIds);\n\n  for (const entry of response.data ?? []) {\n    if (!entry) continue;\n    const projectId =\n      typeof entry.endpoint === \"string\"\n        ? entry.endpoint\n        : projectIds.length === 1\n          ? projectIds[0]\n          : undefined;\n\n    if (!projectId) continue;\n\n    unmatchedProjects.delete(projectId);\n\n    const rows = extractRows(entry);\n    const traitsForProject: TraitMetadataRow[] = [];\n\n    for (const row of rows) {\n      const normalized = normalizeMetadataRow(row);\n      if (normalized) traitsForProject.push(normalized);\n    }\n\n    pages.push({ projectId, traits: traitsForProject });\n  }\n\n  const errors: CollectionTraitMetadataError[] = [];\n  const rawErrors = response.errors ?? [];\n  const remainingProjects = Array.from(unmatchedProjects);\n\n  rawErrors.forEach((error, index) => {\n    const projectId = remainingProjects[index];\n    errors.push({\n      projectId,\n      error: error instanceof Error ? error : new Error(String(error)),\n    });\n  });\n\n  return { pages, errors };\n}\n\nexport function flattenActiveFilters(\n  activeFilters: ActiveFilters,\n): TraitSelection[] {\n  return Object.entries(activeFilters).flatMap(([name, values]) =>\n    Array.from(values).map((value) => ({ name, value })),\n  );\n}\n\nexport async function fetchCollectionTraitMetadata(\n  options: FetchCollectionTraitMetadataOptions,\n): Promise<FetchCollectionTraitMetadataResult> {\n  const {\n    address,\n    projects,\n    traits = [],\n    defaultProjectId = DEFAULT_PROJECT_ID,\n  } = options;\n\n  const projectIds = resolveProjects(projects, defaultProjectId);\n  if (projectIds.length === 0) {\n    return { pages: [], errors: [] };\n  }\n\n  const query = buildTraitMetadataQuery({ address, traits });\n\n  const response = await fetchToriisSql(projectIds, query);\n\n  const pages: CollectionTraitMetadataPage[] = [];\n  const unmatchedProjects = new Set(projectIds);\n\n  for (const entry of response.data ?? []) {\n    if (!entry) continue;\n    const projectId =\n      typeof entry.endpoint === \"string\"\n        ? entry.endpoint\n        : projectIds.length === 1\n          ? projectIds[0]\n          : undefined;\n\n    if (!projectId) continue;\n\n    unmatchedProjects.delete(projectId);\n\n    const rows = extractRows(entry);\n    const traitsForProject: TraitMetadataRow[] = [];\n\n    for (const row of rows) {\n      const normalized = normalizeMetadataRow(row);\n      if (!normalized) continue;\n      traitsForProject.push(normalized);\n    }\n\n    pages.push({\n      projectId,\n      traits: traitsForProject,\n    });\n  }\n\n  const errors: CollectionTraitMetadataError[] = [];\n  const rawErrors = response.errors ?? [];\n  const remainingProjects = Array.from(unmatchedProjects);\n\n  rawErrors.forEach((error, index) => {\n    const projectId = remainingProjects[index];\n    errors.push({\n      projectId,\n      error: error instanceof Error ? error : new Error(String(error)),\n    });\n  });\n\n  return { pages, errors };\n}\n\nexport function aggregateTraitMetadata(\n  pages: CollectionTraitMetadataPage[],\n): TraitMetadataRow[] {\n  const aggregate = new Map<string, TraitMetadataRow>();\n\n  for (const page of pages) {\n    for (const trait of page.traits) {\n      const key = `${trait.traitName}::${trait.traitValue}`;\n      const existing = aggregate.get(key);\n\n      if (existing) {\n        existing.count += trait.count;\n      } else {\n        aggregate.set(key, { ...trait });\n      }\n    }\n  }\n\n  return Array.from(aggregate.values());\n}\n\nexport function buildAvailableFilters(\n  metadata: TraitMetadataRow[],\n  activeFilters: ActiveFilters,\n): AvailableFilters {\n  const result: AvailableFilters = {};\n\n  for (const entry of metadata) {\n    if (!entry.traitName || entry.traitValue == null) continue;\n    if (!result[entry.traitName]) {\n      result[entry.traitName] = {};\n    }\n    result[entry.traitName][entry.traitValue] =\n      (result[entry.traitName][entry.traitValue] ?? 0) + entry.count;\n  }\n\n  for (const [trait, values] of Object.entries(activeFilters)) {\n    if (!result[trait]) {\n      result[trait] = {};\n    }\n\n    for (const value of values) {\n      if (result[trait][value] === undefined) {\n        result[trait][value] = 0;\n      }\n    }\n  }\n\n  return result;\n}\n\nexport function buildPrecomputedFilters(\n  availableFilters: AvailableFilters,\n): PrecomputedFilterData {\n  const attributes = Object.keys(availableFilters).sort((a, b) =>\n    a.localeCompare(b),\n  );\n\n  const properties = attributes.reduce<PrecomputedFilterData[\"properties\"]>(\n    (acc, attribute) => {\n      const entries = Object.entries(availableFilters[attribute] ?? {}).map(\n        ([property, count]) => ({\n          property,\n          order: count,\n          count,\n        }),\n      );\n\n      entries.sort((a, b) => {\n        if (b.order !== a.order) {\n          return b.order - a.order;\n        }\n        return a.property.localeCompare(b.property);\n      });\n\n      acc[attribute] = entries;\n      return acc;\n    },\n    {},\n  );\n\n  return {\n    attributes,\n    properties,\n  };\n}\n\nexport function tokenMatchesFilters(\n  token: Pick<Token, \"metadata\"> | { metadata?: any },\n  activeFilters: ActiveFilters,\n): boolean {\n  const entries = Object.entries(activeFilters);\n  if (entries.length === 0) {\n    return true;\n  }\n\n  const metadata = parseJsonSafe(token.metadata, token.metadata);\n\n  const attributes = Array.isArray((metadata as any)?.attributes)\n    ? (metadata as any).attributes\n    : [];\n\n  if (!attributes.length) {\n    return false;\n  }\n\n  const traitMap = new Map<string, Set<string>>();\n\n  for (const attribute of attributes) {\n    if (\n      !attribute ||\n      !attribute.trait_type ||\n      attribute.value === undefined ||\n      attribute.value === null\n    ) {\n      continue;\n    }\n\n    const trait = String(attribute.trait_type);\n    const value = String(attribute.value);\n\n    if (!traitMap.has(trait)) {\n      traitMap.set(trait, new Set());\n    }\n\n    traitMap.get(trait)?.add(value);\n  }\n\n  for (const [trait, values] of entries) {\n    const availableValues = traitMap.get(trait);\n    if (!availableValues) {\n      return false;\n    }\n\n    let matches = false;\n    for (const value of values) {\n      if (availableValues.has(value)) {\n        matches = true;\n        break;\n      }\n    }\n\n    if (!matches) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nexport function filterTokensByMetadata<T extends { metadata?: any }>(\n  tokens: T[],\n  activeFilters: ActiveFilters,\n): T[] {\n  if (!tokens || tokens.length === 0) {\n    return tokens;\n  }\n\n  if (Object.keys(activeFilters).length === 0) {\n    return tokens;\n  }\n\n  return tokens.filter((token) => tokenMatchesFilters(token, activeFilters));\n}\n"],"mappings":";;;;;;;;;;AACA,SAAS,yBAAyB;AAwGlC,IAAM,iBAAiB,CAAC,UAA0B;AAChD,SAAO,MAAM,QAAQ,MAAM,IAAI;AACjC;AAEA,IAAM,wBAAwB,CAAC,WAAqC;AAClE,MAAI,CAAC,OAAO,QAAQ;AAClB,WAAO;AAAA,EACT;AAEA,SAAO,OACJ,IAAI,CAAC,EAAE,MAAM,MAAM,MAAM;AACxB,UAAM,YAAY,eAAe,IAAI;AACrC,UAAM,aAAa,eAAe,KAAK;AACvC,WAAO,qBAAqB,SAAS,2BAA2B,UAAU;AAAA,EAC5E,CAAC,EACA,KAAK,MAAM;AAChB;AAEA,IAAM,8BAA8B,CAAC,YAA4B;AAC/D,QAAM,gBAAgB,kBAAkB,OAAO;AAC/C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4BAUmB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOzC;AAEA,IAAM,wBAAwB,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,oBAAoB,CAAC;AACvB,MAIc;AACZ,QAAM,gBAAgB,kBAAkB,OAAO;AAC/C,QAAM,mBAAmB,eAAe,SAAS;AAEjD,MAAI,kBAAkB,WAAW,GAAG;AAClC,WAAO;AAAA;AAAA,uBAEY,aAAa;AAAA,sBACd,gBAAgB;AAAA;AAAA;AAAA,EAGpC;AAEA,QAAM,cAAc,sBAAsB,iBAAiB;AAC3D,SAAO;AAAA;AAAA,sBAEa,gBAAgB;AAAA;AAAA;AAAA;AAAA,YAI1B,WAAW;AAAA,2BACI,aAAa;AAAA;AAAA,0CAEE,kBAAkB,MAAM;AAAA;AAAA;AAAA;AAIlE;AAEA,IAAM,mCAAmC,CAAC;AAAA,EACxC;AAAA,EACA;AAAA,EACA,oBAAoB,CAAC;AACvB,MAIc;AACZ,QAAM,gBAAgB,kBAAkB,OAAO;AAE/C,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,sBAAsB,WACzB,IAAI,CAAC,SAAS,IAAI,eAAe,IAAI,CAAC,GAAG,EACzC,KAAK,IAAI;AAEZ,MAAI,kBAAkB,WAAW,GAAG;AAClC,WAAO;AAAA;AAAA,uBAEY,aAAa;AAAA,uBACb,mBAAmB;AAAA;AAAA;AAAA,EAGxC;AAEA,QAAM,cAAc,sBAAsB,iBAAiB;AAC3D,SAAO;AAAA;AAAA,uBAEc,mBAAmB;AAAA;AAAA;AAAA;AAAA,YAI9B,WAAW;AAAA,2BACI,aAAa;AAAA;AAAA,0CAEE,kBAAkB,MAAM;AAAA;AAAA;AAAA;AAIlE;AAEA,IAAM,0BAA0B,CAAC;AAAA,EAC/B;AAAA,EACA;AACF,MAGc;AACZ,QAAM,gBAAgB,kBAAkB,OAAO;AAC/C,QAAM,cAAc,sBAAsB,MAAM;AAChD,QAAM,eAAe,OAAO,SACxB,uCAAuC,OAAO,MAAM,KACpD;AAEJ,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,YAKG,WAAW;AAAA,2BACI,aAAa;AAAA;AAAA,MAElC,YAAY;AAAA;AAAA;AAAA;AAIlB;AAEA,IAAM,uBAAuB,CAAC,QAAsC;AAClE,MAAI,CAAC,IAAK,QAAO;AAEjB,QAAM,YACJ,OAAO,IAAI,eAAe,WACtB,IAAI,aACJ,OAAO,IAAI,cAAc,WACvB,IAAI,YACJ;AAER,QAAM,aACJ,OAAO,IAAI,gBAAgB,WACvB,IAAI,cACJ,OAAO,IAAI,eAAe,WACxB,IAAI,aACJ;AAER,MAAI,CAAC,aAAa,CAAC,YAAY;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,WACJ,OAAO,IAAI,UAAU,WACjB,IAAI,QACJ,OAAO,IAAI,UAAU,WACnB,OAAO,SAAS,IAAI,OAAO,EAAE,IAC7B,OAAO,IAAI,SAAS,CAAC;AAE7B,QAAM,QAAQ,OAAO,SAAS,QAAQ,IAAI,OAAO,QAAQ,IAAI;AAE7D,SAAO,EAAE,WAAW,YAAY,MAAM;AACxC;AAEA,IAAM,cAAc,CAAC,SAAqB;AACxC,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,MAAI,MAAM,QAAQ,IAAI,EAAG,QAAO;AAChC,MAAI,MAAM,QAAQ,KAAK,IAAI,EAAG,QAAO,KAAK;AAC1C,MAAI,MAAM,QAAQ,KAAK,IAAI,EAAG,QAAO,KAAK;AAC1C,MAAI,MAAM,QAAQ,KAAK,MAAM,EAAG,QAAO,KAAK;AAC5C,SAAO,CAAC;AACV;AAEA,IAAM,4BAA4B,CAAC,QAAsC;AACvE,MAAI,CAAC,IAAK,QAAO;AAEjB,QAAM,YACJ,OAAO,IAAI,eAAe,WACtB,IAAI,aACJ,OAAO,IAAI,cAAc,WACvB,IAAI,YACJ;AAER,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,gBACJ,OAAO,IAAI,gBAAgB,WACvB,IAAI,cACJ,OAAO,IAAI,eAAe,WACxB,IAAI,aACJ,OAAO,IAAI,gBAAgB,WACzB,OAAO,IAAI,WAAW,IACtB,OAAO,IAAI,eAAe,WACxB,OAAO,IAAI,UAAU,IACrB,OAAO,IAAI,gBAAgB,WACzB,OAAO,SAAS,IAAI,aAAa,EAAE,IACnC,OAAO,IAAI,eAAe,WACxB,OAAO,SAAS,IAAI,YAAY,EAAE,IAClC;AAEhB,QAAM,aAAa,OAAO,SAAS,aAAa,IAAI,gBAAgB;AAEpE,SAAO,EAAE,WAAW,WAAW;AACjC;AAEA,IAAM,yBAAyB,CAAC,QAAmC;AACjE,MAAI,CAAC,IAAK,QAAO;AAEjB,QAAM,aACJ,OAAO,IAAI,gBAAgB,WACvB,IAAI,cACJ,OAAO,IAAI,eAAe,WACxB,IAAI,aACJ;AAER,MAAI,CAAC,WAAY,QAAO;AAExB,QAAM,WACJ,OAAO,IAAI,UAAU,WACjB,IAAI,QACJ,OAAO,IAAI,UAAU,WACnB,OAAO,IAAI,KAAK,IAChB,OAAO,IAAI,UAAU,WACnB,OAAO,SAAS,IAAI,OAAO,EAAE,IAC7B;AAEV,QAAM,QAAQ,OAAO,SAAS,QAAQ,IAAI,WAAW;AAErD,SAAO,EAAE,YAAY,MAAM;AAC7B;AAEA,eAAsB,uBACpB,SACuC;AACvC,QAAM,EAAE,SAAS,UAAU,mBAAmB,mBAAmB,IAAI;AAErE,QAAM,aAAa,gBAAgB,UAAU,gBAAgB;AAC7D,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EACjC;AAEA,QAAM,QAAQ,4BAA4B,OAAO;AAEjD,QAAM,WAAW,MAAM,eAAe,YAAY,KAAK;AAEvD,QAAM,QAAgC,CAAC;AACvC,QAAM,oBAAoB,IAAI,IAAI,UAAU;AAE5C,aAAW,SAAS,SAAS,QAAQ,CAAC,GAAG;AACvC,QAAI,CAAC,MAAO;AACZ,UAAM,YACJ,OAAO,MAAM,aAAa,WACtB,MAAM,WACN,WAAW,WAAW,IACpB,WAAW,CAAC,IACZ;AAER,QAAI,CAAC,UAAW;AAEhB,sBAAkB,OAAO,SAAS;AAElC,UAAM,OAAO,YAAY,KAAK;AAC9B,UAAM,SAA6B,CAAC;AAEpC,eAAW,OAAO,MAAM;AACtB,YAAM,aAAa,0BAA0B,GAAG;AAChD,UAAI,WAAY,QAAO,KAAK,UAAU;AAAA,IACxC;AAEA,UAAM,KAAK,EAAE,WAAW,OAAO,CAAC;AAAA,EAClC;AAEA,QAAM,SAAyC,CAAC;AAChD,QAAM,YAAY,SAAS,UAAU,CAAC;AACtC,QAAM,oBAAoB,MAAM,KAAK,iBAAiB;AAEtD,YAAU,QAAQ,CAAC,OAAO,UAAU;AAClC,UAAM,YAAY,kBAAkB,KAAK;AACzC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,IACjE,CAAC;AAAA,EACH,CAAC;AAED,SAAO,EAAE,OAAO,OAAO;AACzB;AAEO,SAAS,2BACd,OACoB;AACpB,QAAM,YAAY,oBAAI,IAA8B;AAEpD,aAAW,QAAQ,OAAO;AACxB,eAAW,SAAS,KAAK,QAAQ;AAC/B,YAAM,WAAW,UAAU,IAAI,MAAM,SAAS;AAC9C,UAAI,UAAU;AACZ,iBAAS,aAAa,KAAK,IAAI,SAAS,YAAY,MAAM,UAAU;AAAA,MACtE,OAAO;AACL,kBAAU,IAAI,MAAM,WAAW,EAAE,GAAG,MAAM,CAAC;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,UAAU,OAAO,CAAC,EAAE;AAAA,IAAK,CAAC,GAAG,MAC7C,EAAE,UAAU,cAAc,EAAE,SAAS;AAAA,EACvC;AACF;AAEA,eAAsB,iBACpB,SACiC;AACjC,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,oBAAoB,CAAC;AAAA,IACrB;AAAA,IACA,mBAAmB;AAAA,EACrB,IAAI;AAEJ,QAAM,aAAa,gBAAgB,UAAU,gBAAgB;AAC7D,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EACjC;AAEA,QAAM,QAAQ,sBAAsB;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,WAAW,MAAM,eAAe,YAAY,KAAK;AAEvD,QAAM,QAA0B,CAAC;AACjC,QAAM,oBAAoB,IAAI,IAAI,UAAU;AAE5C,aAAW,SAAS,SAAS,QAAQ,CAAC,GAAG;AACvC,QAAI,CAAC,MAAO;AACZ,UAAM,YACJ,OAAO,MAAM,aAAa,WACtB,MAAM,WACN,WAAW,WAAW,IACpB,WAAW,CAAC,IACZ;AAER,QAAI,CAAC,UAAW;AAEhB,sBAAkB,OAAO,SAAS;AAElC,UAAM,OAAO,YAAY,KAAK;AAC9B,UAAM,SAA0B,CAAC;AAEjC,eAAW,OAAO,MAAM;AACtB,YAAM,aAAa,uBAAuB,GAAG;AAC7C,UAAI,WAAY,QAAO,KAAK,UAAU;AAAA,IACxC;AAEA,UAAM,KAAK,EAAE,WAAW,OAAO,CAAC;AAAA,EAClC;AAEA,QAAM,SAAyC,CAAC;AAChD,QAAM,YAAY,SAAS,UAAU,CAAC;AACtC,QAAM,oBAAoB,MAAM,KAAK,iBAAiB;AAEtD,YAAU,QAAQ,CAAC,OAAO,UAAU;AAClC,UAAM,YAAY,kBAAkB,KAAK;AACzC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,IACjE,CAAC;AAAA,EACH,CAAC;AAED,SAAO,EAAE,OAAO,OAAO;AACzB;AAEO,SAAS,qBAAqB,OAA0C;AAC7E,QAAM,YAAY,oBAAI,IAA2B;AAEjD,aAAW,QAAQ,OAAO;AACxB,eAAW,SAAS,KAAK,QAAQ;AAC/B,YAAM,WAAW,UAAU,IAAI,MAAM,UAAU;AAC/C,UAAI,UAAU;AACZ,iBAAS,SAAS,MAAM;AAAA,MAC1B,OAAO;AACL,kBAAU,IAAI,MAAM,YAAY,EAAE,GAAG,MAAM,CAAC;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACxE;AAEA,eAAsB,4BACpB,SAC6C;AAC7C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB;AAAA,EACrB,IAAI;AAEJ,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EACjC;AAEA,QAAM,aAAa,gBAAgB,UAAU,gBAAgB;AAC7D,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EACjC;AAEA,QAAM,QAAQ,iCAAiC;AAAA,IAC7C;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,WAAW,MAAM,eAAe,YAAY,KAAK;AAEvD,QAAM,QAAuC,CAAC;AAC9C,QAAM,oBAAoB,IAAI,IAAI,UAAU;AAE5C,aAAW,SAAS,SAAS,QAAQ,CAAC,GAAG;AACvC,QAAI,CAAC,MAAO;AACZ,UAAM,YACJ,OAAO,MAAM,aAAa,WACtB,MAAM,WACN,WAAW,WAAW,IACpB,WAAW,CAAC,IACZ;AAER,QAAI,CAAC,UAAW;AAEhB,sBAAkB,OAAO,SAAS;AAElC,UAAM,OAAO,YAAY,KAAK;AAC9B,UAAM,mBAAuC,CAAC;AAE9C,eAAW,OAAO,MAAM;AACtB,YAAM,aAAa,qBAAqB,GAAG;AAC3C,UAAI,WAAY,kBAAiB,KAAK,UAAU;AAAA,IAClD;AAEA,UAAM,KAAK,EAAE,WAAW,QAAQ,iBAAiB,CAAC;AAAA,EACpD;AAEA,QAAM,SAAyC,CAAC;AAChD,QAAM,YAAY,SAAS,UAAU,CAAC;AACtC,QAAM,oBAAoB,MAAM,KAAK,iBAAiB;AAEtD,YAAU,QAAQ,CAAC,OAAO,UAAU;AAClC,UAAM,YAAY,kBAAkB,KAAK;AACzC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,IACjE,CAAC;AAAA,EACH,CAAC;AAED,SAAO,EAAE,OAAO,OAAO;AACzB;AAEO,SAAS,qBACd,eACkB;AAClB,SAAO,OAAO,QAAQ,aAAa,EAAE;AAAA,IAAQ,CAAC,CAAC,MAAM,MAAM,MACzD,MAAM,KAAK,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,MAAM,EAAE;AAAA,EACrD;AACF;AAEA,eAAsB,6BACpB,SAC6C;AAC7C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA,SAAS,CAAC;AAAA,IACV,mBAAmB;AAAA,EACrB,IAAI;AAEJ,QAAM,aAAa,gBAAgB,UAAU,gBAAgB;AAC7D,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EACjC;AAEA,QAAM,QAAQ,wBAAwB,EAAE,SAAS,OAAO,CAAC;AAEzD,QAAM,WAAW,MAAM,eAAe,YAAY,KAAK;AAEvD,QAAM,QAAuC,CAAC;AAC9C,QAAM,oBAAoB,IAAI,IAAI,UAAU;AAE5C,aAAW,SAAS,SAAS,QAAQ,CAAC,GAAG;AACvC,QAAI,CAAC,MAAO;AACZ,UAAM,YACJ,OAAO,MAAM,aAAa,WACtB,MAAM,WACN,WAAW,WAAW,IACpB,WAAW,CAAC,IACZ;AAER,QAAI,CAAC,UAAW;AAEhB,sBAAkB,OAAO,SAAS;AAElC,UAAM,OAAO,YAAY,KAAK;AAC9B,UAAM,mBAAuC,CAAC;AAE9C,eAAW,OAAO,MAAM;AACtB,YAAM,aAAa,qBAAqB,GAAG;AAC3C,UAAI,CAAC,WAAY;AACjB,uBAAiB,KAAK,UAAU;AAAA,IAClC;AAEA,UAAM,KAAK;AAAA,MACT;AAAA,MACA,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,QAAM,SAAyC,CAAC;AAChD,QAAM,YAAY,SAAS,UAAU,CAAC;AACtC,QAAM,oBAAoB,MAAM,KAAK,iBAAiB;AAEtD,YAAU,QAAQ,CAAC,OAAO,UAAU;AAClC,UAAM,YAAY,kBAAkB,KAAK;AACzC,WAAO,KAAK;AAAA,MACV;AAAA,MACA,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,IACjE,CAAC;AAAA,EACH,CAAC;AAED,SAAO,EAAE,OAAO,OAAO;AACzB;AAEO,SAAS,uBACd,OACoB;AACpB,QAAM,YAAY,oBAAI,IAA8B;AAEpD,aAAW,QAAQ,OAAO;AACxB,eAAW,SAAS,KAAK,QAAQ;AAC/B,YAAM,MAAM,GAAG,MAAM,SAAS,KAAK,MAAM,UAAU;AACnD,YAAM,WAAW,UAAU,IAAI,GAAG;AAElC,UAAI,UAAU;AACZ,iBAAS,SAAS,MAAM;AAAA,MAC1B,OAAO;AACL,kBAAU,IAAI,KAAK,EAAE,GAAG,MAAM,CAAC;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,UAAU,OAAO,CAAC;AACtC;AAEO,SAAS,sBACd,UACA,eACkB;AAClB,QAAM,SAA2B,CAAC;AAElC,aAAW,SAAS,UAAU;AAC5B,QAAI,CAAC,MAAM,aAAa,MAAM,cAAc,KAAM;AAClD,QAAI,CAAC,OAAO,MAAM,SAAS,GAAG;AAC5B,aAAO,MAAM,SAAS,IAAI,CAAC;AAAA,IAC7B;AACA,WAAO,MAAM,SAAS,EAAE,MAAM,UAAU,KACrC,OAAO,MAAM,SAAS,EAAE,MAAM,UAAU,KAAK,KAAK,MAAM;AAAA,EAC7D;AAEA,aAAW,CAAC,OAAO,MAAM,KAAK,OAAO,QAAQ,aAAa,GAAG;AAC3D,QAAI,CAAC,OAAO,KAAK,GAAG;AAClB,aAAO,KAAK,IAAI,CAAC;AAAA,IACnB;AAEA,eAAW,SAAS,QAAQ;AAC1B,UAAI,OAAO,KAAK,EAAE,KAAK,MAAM,QAAW;AACtC,eAAO,KAAK,EAAE,KAAK,IAAI;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,wBACd,kBACuB;AACvB,QAAM,aAAa,OAAO,KAAK,gBAAgB,EAAE;AAAA,IAAK,CAAC,GAAG,MACxD,EAAE,cAAc,CAAC;AAAA,EACnB;AAEA,QAAM,aAAa,WAAW;AAAA,IAC5B,CAAC,KAAK,cAAc;AAClB,YAAM,UAAU,OAAO,QAAQ,iBAAiB,SAAS,KAAK,CAAC,CAAC,EAAE;AAAA,QAChE,CAAC,CAAC,UAAU,KAAK,OAAO;AAAA,UACtB;AAAA,UACA,OAAO;AAAA,UACP;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,KAAK,CAAC,GAAG,MAAM;AACrB,YAAI,EAAE,UAAU,EAAE,OAAO;AACvB,iBAAO,EAAE,QAAQ,EAAE;AAAA,QACrB;AACA,eAAO,EAAE,SAAS,cAAc,EAAE,QAAQ;AAAA,MAC5C,CAAC;AAED,UAAI,SAAS,IAAI;AACjB,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,oBACd,OACA,eACS;AACT,QAAM,UAAU,OAAO,QAAQ,aAAa;AAC5C,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,cAAc,MAAM,UAAU,MAAM,QAAQ;AAE7D,QAAM,aAAa,MAAM,QAAS,UAAkB,UAAU,IACzD,SAAiB,aAClB,CAAC;AAEL,MAAI,CAAC,WAAW,QAAQ;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,oBAAI,IAAyB;AAE9C,aAAW,aAAa,YAAY;AAClC,QACE,CAAC,aACD,CAAC,UAAU,cACX,UAAU,UAAU,UACpB,UAAU,UAAU,MACpB;AACA;AAAA,IACF;AAEA,UAAM,QAAQ,OAAO,UAAU,UAAU;AACzC,UAAM,QAAQ,OAAO,UAAU,KAAK;AAEpC,QAAI,CAAC,SAAS,IAAI,KAAK,GAAG;AACxB,eAAS,IAAI,OAAO,oBAAI,IAAI,CAAC;AAAA,IAC/B;AAEA,aAAS,IAAI,KAAK,GAAG,IAAI,KAAK;AAAA,EAChC;AAEA,aAAW,CAAC,OAAO,MAAM,KAAK,SAAS;AACrC,UAAM,kBAAkB,SAAS,IAAI,KAAK;AAC1C,QAAI,CAAC,iBAAiB;AACpB,aAAO;AAAA,IACT;AAEA,QAAI,UAAU;AACd,eAAW,SAAS,QAAQ;AAC1B,UAAI,gBAAgB,IAAI,KAAK,GAAG;AAC9B,kBAAU;AACV;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,uBACd,QACA,eACK;AACL,MAAI,CAAC,UAAU,OAAO,WAAW,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,KAAK,aAAa,EAAE,WAAW,GAAG;AAC3C,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,OAAO,CAAC,UAAU,oBAAoB,OAAO,aAAa,CAAC;AAC3E;","names":[]}