@asteby/storefront-react 0.17.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/checkout/address-fields.tsx","../src/checkout/order-summary.tsx","../src/checkout/recommend.ts","../src/checkout/delivery.ts","../src/checkout/delivery-options.tsx"],"names":["fill","ES","EN","jsxs","jsx","costOf","daysOf","norm","formatMoney","Fragment"],"mappings":"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","file":"checkout.js","sourcesContent":["/**\n * Contact and shipping address fields of a checkout, in the order and with the autofill tokens buyers expect:\n * contact (e-mail, phone, given and family name) and address (postal code first, so it can fill state and city, then\n * state, city, colonia, street, interior and delivery references). One column on phones; the shop lays out the grid\n * with `classNames`.\n *\n * Nothing here knows a country: the postal-code format, the list of states and the postal-code lookup come from the\n * shop (region config, a same-origin route). Without them the fields are plain text and nothing is invented.\n */\nimport { useEffect, useId, useRef, useState, type ReactNode } from 'react'\nimport type { Address } from '@asteby/storefront'\nimport { CheckoutField, type CheckoutFieldClassNames, type FieldErrors, type FieldMessages } from './fields.js'\n\nexport type AddressFieldKey = 'zip' | 'province' | 'city' | 'neighborhood' | 'address1' | 'address2' | 'reference'\nexport type ContactFieldKey = 'email' | 'phone' | 'first_name' | 'last_name'\n\nexport type AddressFieldsMessages = Record<AddressFieldKey | ContactFieldKey, string> & {\n provincePlaceholder: string\n address1Hint: string\n referenceHint: string\n emailHint: string\n phoneHint: string\n lookupFilled: string\n}\n\nconst ES: AddressFieldsMessages = {\n email: 'Correo',\n phone: 'Teléfono',\n first_name: 'Nombre',\n last_name: 'Apellidos',\n zip: 'Código postal',\n province: 'Estado',\n city: 'Ciudad o municipio',\n neighborhood: 'Colonia',\n address1: 'Calle y número',\n address2: 'Número interior o departamento',\n reference: 'Referencias para la entrega',\n provincePlaceholder: 'Elige tu estado',\n address1Hint: 'Por ejemplo: Av. Insurgentes Sur 1234',\n referenceHint: 'Entre qué calles, color de la fachada…',\n emailHint: 'Te enviamos aquí la confirmación y el seguimiento.',\n phoneHint: 'Solo para la paquetería, por si necesita contactarte.',\n lookupFilled: 'Completamos estado y ciudad con tu código postal.',\n}\n\nconst EN: AddressFieldsMessages = {\n email: 'Email',\n phone: 'Phone',\n first_name: 'First name',\n last_name: 'Last name',\n zip: 'Postal code',\n province: 'State',\n city: 'City',\n neighborhood: 'Neighborhood',\n address1: 'Street and number',\n address2: 'Apartment, suite',\n reference: 'Delivery notes',\n provincePlaceholder: 'Choose your state',\n address1Hint: 'For example: 1234 Main St',\n referenceHint: 'Cross streets, building color…',\n emailHint: 'We send the confirmation and tracking here.',\n phoneHint: 'Only for the carrier, in case they need to reach you.',\n lookupFilled: 'We filled in state and city from your postal code.',\n}\n\nexport function addressFieldsMessages(locale?: string | null, overrides?: Partial<AddressFieldsMessages> | null): AddressFieldsMessages {\n const base = (locale ?? 'es-MX').toLowerCase().startsWith('en') ? EN : ES\n return overrides ? { ...base, ...overrides } : base\n}\n\nexport type FieldLayoutClassNames = CheckoutFieldClassNames & {\n /** Extra class of a field that should span the whole row in a two-column grid. */\n wide?: string\n /** Extra class of a field that fits half a row. */\n half?: string\n}\n\ntype Common = {\n /** Inline errors by field name (`useFieldErrors().errors`). */\n errors?: FieldErrors\n locale?: string\n messages?: Partial<AddressFieldsMessages>\n fieldMessages?: Partial<FieldMessages>\n classNames?: FieldLayoutClassNames\n}\n\nconst join = (...c: Array<string | undefined>) => c.filter(Boolean).join(' ') || undefined\nconst field = (cx: FieldLayoutClassNames, span: 'wide' | 'half'): CheckoutFieldClassNames => ({ ...cx, root: join(cx.root, cx[span]) })\n\nexport type ContactFieldsProps = Common & {\n defaults?: Partial<Record<ContactFieldKey, string | null>>\n /** Form names. Default: the keys. */\n names?: Partial<Record<ContactFieldKey, string>>\n /** Phone format from the shop or region (e.g. `{ pattern: '[0-9 +()-]{10,}', title: '10 dígitos' }`). */\n phone?: { pattern?: string; title?: string; minLength?: number }\n /** Explain why e-mail and phone are needed (default true). */\n hints?: boolean\n}\n\n/** E-mail, phone, given and family name with their autofill tokens and the right mobile keyboards. */\nexport function ContactFields({ defaults = {}, names = {}, errors = {}, phone, hints = true, locale, messages, fieldMessages: fm, classNames: cx = {} }: ContactFieldsProps) {\n const m = addressFieldsMessages(locale, messages)\n const n = (k: ContactFieldKey) => names[k] ?? k\n const common = { ...(locale ? { locale } : {}), ...(fm ? { messages: fm } : {}) }\n return (\n <>\n <CheckoutField {...common} name={n('email')} label={m.email} type=\"email\" autoComplete=\"email\" inputMode=\"email\" autoCapitalize=\"none\" spellCheck={false} defaultValue={defaults.email ?? ''} error={errors[n('email')] ?? null} hint={hints ? m.emailHint : undefined} classNames={field(cx, 'wide')} />\n <CheckoutField {...common} name={n('phone')} label={m.phone} type=\"tel\" autoComplete=\"tel\" inputMode=\"tel\" defaultValue={defaults.phone ?? ''} error={errors[n('phone')] ?? null} hint={hints ? m.phoneHint : undefined} classNames={field(cx, 'wide')} {...(phone?.pattern ? { pattern: phone.pattern } : {})} {...(phone?.title ? { title: phone.title } : {})} {...(phone?.minLength ? { minLength: phone.minLength } : {})} />\n <CheckoutField {...common} name={n('first_name')} label={m.first_name} autoComplete=\"given-name\" defaultValue={defaults.first_name ?? ''} error={errors[n('first_name')] ?? null} classNames={field(cx, 'half')} />\n <CheckoutField {...common} name={n('last_name')} label={m.last_name} autoComplete=\"family-name\" defaultValue={defaults.last_name ?? ''} error={errors[n('last_name')] ?? null} classNames={field(cx, 'half')} />\n </>\n )\n}\n\n/** What a postal-code lookup answers. Every field optional: only what the source knows. */\nexport type PostalCodeInfo = { province?: string | null; city?: string | null; neighborhoods?: readonly string[] | null }\n\nexport type AddressFieldsProps = Common & {\n defaults?: Partial<Pick<Address, 'zip' | 'province' | 'city' | 'neighborhood' | 'address1' | 'address2' | 'reference'>> | null\n /** Form names. Default: the keys (the `AddressInput` fields of the Storefront API). */\n names?: Partial<Record<AddressFieldKey, string>>\n /** ISO country of the address (hidden field `country_code`). */\n countryCode: string\n /** States of the country (from the region config). With them, \"State\" is a `<select>`; the value sent is `name`. */\n provinces?: ReadonlyArray<{ code?: string | null; name: string }> | null\n /** Postal-code format of the country (from the region config), e.g. `{ pattern: '[0-9]{5}', maxLength: 5, inputMode: 'numeric', title: '5 dígitos' }`. */\n postalCode?: { pattern?: string; maxLength?: number; inputMode?: 'numeric' | 'text'; title?: string }\n /**\n * Fills state and city (and suggests colonias) from the postal code, when the shop has a source (a same-origin\n * route over a postal-code catalog). Called once the code matches `postalCode.pattern` (or on leaving the field).\n * Never overwrites what the buyer typed.\n */\n lookupPostalCode?: (zip: string) => Promise<PostalCodeInfo | null>\n /** Show the colonia field: `true` (default, optional), `'required'`, or `false`. */\n neighborhood?: boolean | 'required'\n /** Show the delivery references field (default true, optional). */\n reference?: boolean\n /**\n * Once `lookupPostalCode` fills the state field (never over what the buyer already typed), lock it: a plain\n * `<input>` turns read-only; a `<select>` (from `provinces`) turns disabled with a hidden field that keeps\n * submitting its value. The buyer corrects the state by correcting the postal code. Default false: the filled\n * state stays as editable as any other field. Marked with `data-sf-locked=\"1\"` for the shop's own styling.\n */\n lockProvinceOnFill?: boolean\n /** Rendered after the fields (e.g. \"save this address\"). */\n children?: ReactNode\n}\n\n/**\n * Shipping address in the order buyers fill it: postal code, state, city, colonia, street and number, interior and\n * references. Autofill tokens: `postal-code`, `address-level1/2/3`, `address-line1/2`. The postal code uses the\n * numeric keyboard when the country format is numeric.\n */\n/** Locks a field the lookup just filled: read-only for an `<input>`, disabled + a hidden mirror for a `<select>`. */\nfunction lockField(el: HTMLInputElement | HTMLSelectElement) {\n if (el.dataset.sfLocked === '1') return\n el.dataset.sfLocked = '1'\n el.setAttribute('aria-readonly', 'true')\n if (el instanceof HTMLSelectElement) {\n // A disabled `<select>` would stop submitting its value: a hidden sibling keeps it in the form.\n const name = el.getAttribute('name')\n if (name) {\n const hidden = document.createElement('input')\n hidden.type = 'hidden'\n hidden.name = name\n hidden.value = el.value\n el.insertAdjacentElement('afterend', hidden)\n el.removeAttribute('name')\n }\n el.disabled = true\n } else {\n el.readOnly = true\n }\n}\n\n/** Name of the property set to `true` on every event the lookup dispatches when it fills a field. */\nexport const ADDRESS_FILL_EVENT_FLAG = 'sfSynthetic'\n\n/**\n * Was this `input` event dispatched by `AddressFields` itself (a postal-code fill) and not typed by the buyer? The shop's\n * own listeners (validation, autosave, delivery re-quote...) can ignore these. Real typing has `isTrusted: true`.\n */\nexport function isAddressFillEvent(event: Event): boolean {\n return (event as unknown as Record<string, unknown>)[ADDRESS_FILL_EVENT_FLAG] === true\n}\n\nexport function AddressFields(props: AddressFieldsProps) {\n const { defaults, names = {}, errors = {}, countryCode, provinces, postalCode, lookupPostalCode, lockProvinceOnFill, locale, messages, fieldMessages: fm, classNames: cx = {}, children } = props\n const showNeighborhood = props.neighborhood ?? true\n const showReference = props.reference ?? true\n const m = addressFieldsMessages(locale, messages)\n const n = (k: AddressFieldKey) => names[k] ?? k\n const common = { ...(locale ? { locale } : {}), ...(fm ? { messages: fm } : {}) }\n const listId = useId()\n const [colonias, setColonias] = useState<readonly string[]>([])\n const [filled, setFilled] = useState(false)\n const lastZip = useRef<string | null>(null)\n const zipRef = useRef<HTMLDivElement>(null)\n const lookupRef = useRef(lookupPostalCode)\n lookupRef.current = lookupPostalCode\n // ONE writer: lookup results are applied one after another, never interleaved (two lookups answering close together\n // would otherwise write the same fields and fire their events at the same time).\n const writer = useRef<Promise<void>>(Promise.resolve())\n const enqueue = (task: () => void) => {\n writer.current = writer.current.then(task).catch(() => {})\n }\n\n // A field the buyer edited is theirs: only REAL input (`isTrusted`) marks it, not the events this component dispatches.\n useEffect(() => {\n const form = zipRef.current?.closest('form')\n if (!form) return\n const mark = (e: Event) => {\n if (!e.isTrusted) return\n const el = e.target as HTMLElement | null\n if (el instanceof HTMLInputElement || el instanceof HTMLSelectElement) {\n el.dataset.sfUserEdited = '1'\n delete el.dataset.sfAutofilled\n }\n }\n form.addEventListener('input', mark, true)\n form.addEventListener('change', mark, true)\n return () => {\n form.removeEventListener('input', mark, true)\n form.removeEventListener('change', mark, true)\n }\n }, [])\n\n const runLookup = (zip: string) => {\n const lookup = lookupRef.current\n if (!lookup || !zip || zip === lastZip.current) return\n if (postalCode?.pattern && !new RegExp(`^(?:${postalCode.pattern})$`).test(zip)) return\n lastZip.current = zip\n const form = zipRef.current?.closest('form')\n void lookup(zip).then(\n (info) => {\n if (!info) return\n enqueue(() => {\n if (lastZip.current !== zip) return\n const fill = (name: string, value: string | null | undefined, lock?: boolean) => {\n const el = form?.elements.namedItem(name) as HTMLInputElement | HTMLSelectElement | null\n if (!el || !value || ('length' in el && !(el instanceof HTMLSelectElement))) return false\n // Already locked from a previous lookup: leave it (the buyer corrects the postal code instead).\n if (el.dataset.sfLocked === '1') return false\n // Never over what they edited, nor over text in the field they are typing in. A focused field that is still\n // empty (Tab from the postal code lands on the next one) is filled: nothing of theirs is overwritten.\n if (el.dataset.sfUserEdited === '1' || (el.ownerDocument.activeElement === el && el.value)) return false\n // Only an empty field, or one this lookup filled before: never what the buyer typed.\n if (el.value && el.dataset.sfAutofilled !== '1') return false\n if (el instanceof HTMLSelectElement && ![...el.options].some((o) => o.value === value)) return false\n el.value = value\n el.dataset.sfAutofilled = '1'\n const event = new Event('input', { bubbles: true })\n Object.defineProperty(event, ADDRESS_FILL_EVENT_FLAG, { value: true })\n el.dispatchEvent(event)\n if (lock) lockField(el)\n return true\n }\n const a = fill(n('province'), info.province, lockProvinceOnFill)\n const b = fill(n('city'), info.city)\n // Colonia only when the code has exactly ONE: with several the buyer chooses (the list is offered, not applied).\n const only = info.neighborhoods?.length === 1 ? info.neighborhoods[0] : null\n const c = showNeighborhood ? fill(n('neighborhood'), only) : false\n setColonias(info.neighborhoods ?? [])\n setFilled(a || b || c)\n })\n },\n () => {\n /* no lookup: the buyer types state and city */\n },\n )\n }\n\n useEffect(() => {\n const zip = defaults?.zip\n if (zip) runLookup(zip)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const numericZip = postalCode?.inputMode === 'numeric'\n return (\n <>\n <div ref={zipRef} className={join(cx.half)} data-sf-zip>\n <CheckoutField\n {...common}\n name={n('zip')}\n label={m.zip}\n autoComplete=\"postal-code\"\n inputMode={postalCode?.inputMode ?? 'text'}\n {...(postalCode?.pattern ? { pattern: postalCode.pattern } : {})}\n {...(postalCode?.maxLength ? { maxLength: postalCode.maxLength } : {})}\n {...(postalCode?.title ? { title: postalCode.title } : {})}\n {...(numericZip ? { autoCapitalize: 'none' } : {})}\n defaultValue={defaults?.zip ?? ''}\n error={errors[n('zip')] ?? null}\n classNames={{ ...cx, root: cx.root }}\n onInput={(e) => {\n const v = e.currentTarget.value.trim()\n if (postalCode?.maxLength && v.length === postalCode.maxLength) runLookup(v)\n }}\n onBlur={(e) => runLookup(e.currentTarget.value.trim())}\n />\n </div>\n {provinces && provinces.length ? (\n <CheckoutField {...common} as=\"select\" name={n('province')} label={m.province} autoComplete=\"address-level1\" defaultValue={defaults?.province ?? ''} error={errors[n('province')] ?? null} classNames={field(cx, 'half')}>\n <option value=\"\" disabled>\n {m.provincePlaceholder}\n </option>\n {provinces.map((p) => (\n <option key={p.code ?? p.name} value={p.name}>\n {p.name}\n </option>\n ))}\n </CheckoutField>\n ) : (\n <CheckoutField {...common} name={n('province')} label={m.province} autoComplete=\"address-level1\" defaultValue={defaults?.province ?? ''} error={errors[n('province')] ?? null} classNames={field(cx, 'half')} />\n )}\n <CheckoutField {...common} name={n('city')} label={m.city} autoComplete=\"address-level2\" defaultValue={defaults?.city ?? ''} error={errors[n('city')] ?? null} classNames={field(cx, 'half')} />\n {showNeighborhood ? (\n <CheckoutField\n {...common}\n name={n('neighborhood')}\n label={m.neighborhood}\n autoComplete=\"address-level3\"\n optional={showNeighborhood !== 'required'}\n defaultValue={defaults?.neighborhood ?? ''}\n error={errors[n('neighborhood')] ?? null}\n classNames={field(cx, 'half')}\n {...(colonias.length ? { list: listId } : {})}\n />\n ) : null}\n {colonias.length ? (\n <datalist id={listId}>\n {colonias.map((c) => (\n <option key={c} value={c} />\n ))}\n </datalist>\n ) : null}\n {/* The lookup result, announced once (not on every keystroke). */}\n <p role=\"status\" aria-live=\"polite\" data-sf-zip-status style={filled ? undefined : { position: 'absolute', width: 1, height: 1, overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap' }} className={filled ? join(cx.hint, cx.wide) : undefined}>\n {filled ? m.lookupFilled : ''}\n </p>\n <CheckoutField {...common} name={n('address1')} label={m.address1} autoComplete=\"address-line1\" defaultValue={defaults?.address1 ?? ''} error={errors[n('address1')] ?? null} hint={m.address1Hint} classNames={field(cx, 'wide')} />\n <CheckoutField {...common} name={n('address2')} label={m.address2} autoComplete=\"address-line2\" optional defaultValue={defaults?.address2 ?? ''} error={errors[n('address2')] ?? null} classNames={field(cx, 'half')} />\n {showReference ? (\n <CheckoutField {...common} name={n('reference')} label={m.reference} optional defaultValue={defaults?.reference ?? ''} error={errors[n('reference')] ?? null} hint={m.referenceHint} classNames={field(cx, 'wide')} maxLength={200} />\n ) : null}\n <input type=\"hidden\" name=\"country_code\" value={countryCode} />\n {children}\n </>\n )\n}\n","/**\n * Order summary of a checkout: lines and the server totals (subtotal, discounts, shipping, taxes, total) exactly as\n * `cart.cost` sends them; nothing is added or recalculated. `OrderSummaryDisclosure` wraps it for phones: a collapsed\n * bar with the total at the top of the page (native `<details>`, no JavaScript, no layout shift on hydration).\n */\nimport type { ReactNode } from 'react'\nimport { formatMoney, type CartCost, type CartLine, type Money } from '@asteby/storefront'\nimport { useResolvedLocale } from '../locale.js'\n\nexport type OrderSummaryMessages = {\n title: string\n subtotal: string\n discount: string\n shipping: string\n /** Shipping not chosen yet. */\n shippingPending: string\n /** Shipping being saved / re-read. */\n updating: string\n free: string\n taxes: string\n /** Taxes already inside the prices, `{amount}`. */\n taxesIncluded: string\n total: string\n /** `{n}` = quantity. */\n quantity: string\n show: string\n hide: string\n}\n\nconst ES: OrderSummaryMessages = {\n title: 'Tu pedido',\n subtotal: 'Subtotal',\n discount: 'Descuento',\n shipping: 'Envío',\n shippingPending: 'Al elegir la entrega',\n updating: 'Actualizando…',\n free: 'Gratis',\n taxes: 'Impuestos',\n taxesIncluded: 'Incluye {amount} de impuestos',\n total: 'Total',\n quantity: 'Cantidad: {n}',\n show: 'Ver resumen del pedido',\n hide: 'Ocultar resumen del pedido',\n}\n\nconst EN: OrderSummaryMessages = {\n title: 'Your order',\n subtotal: 'Subtotal',\n discount: 'Discount',\n shipping: 'Shipping',\n shippingPending: 'Calculated at delivery',\n updating: 'Updating…',\n free: 'Free',\n taxes: 'Taxes',\n taxesIncluded: 'Includes {amount} in taxes',\n total: 'Total',\n quantity: 'Quantity: {n}',\n show: 'Show order summary',\n hide: 'Hide order summary',\n}\n\nexport function orderSummaryMessages(locale?: string | null, overrides?: Partial<OrderSummaryMessages> | null): OrderSummaryMessages {\n const base = (locale ?? 'es-MX').toLowerCase().startsWith('en') ? EN : ES\n return overrides ? { ...base, ...overrides } : base\n}\n\nexport type OrderSummaryClassNames = Partial<\n Record<'root' | 'title' | 'lines' | 'line' | 'media' | 'qty' | 'lineTitle' | 'variant' | 'linePrice' | 'totals' | 'row' | 'discount' | 'muted' | 'free' | 'total' | 'note', string>\n>\n\nexport type OrderSummaryProps = {\n lines: readonly CartLine[]\n /** `cart.cost` as the server sends it. */\n cost: CartCost\n /** The delivery is being saved and the cart re-read: shipping and total say so (`aria-busy`). */\n updating?: boolean\n /** Picture of a line (e.g. `<ProductImage>`), 48-64 px. The quantity badge sits on it. */\n renderLineMedia?: (line: CartLine) => ReactNode\n renderAmount?: (amount: Money) => ReactNode\n /** Heading. `false` hides it (the disclosure already names the block). */\n title?: ReactNode | false\n /** Heading level. Default 2. */\n headingLevel?: 2 | 3\n locale?: string\n messages?: Partial<OrderSummaryMessages>\n classNames?: OrderSummaryClassNames\n /** Rendered between the lines and the totals (e.g. a discount code form). */\n children?: ReactNode\n}\n\nconst isZero = (m: Money | null | undefined) => !!m && Number(m.amount) === 0\nconst positive = (m: Money | null | undefined): m is Money => !!m && Number(m.amount) > 0\n\n/** Lines and totals of the order. The total row is `aria-live`, so a new total after choosing delivery is announced. */\nexport function OrderSummary(props: OrderSummaryProps) {\n const { lines, cost, updating = false, renderLineMedia, renderAmount, title, headingLevel = 2, classNames: cx = {}, children } = props\n const locale = useResolvedLocale(props.locale)\n const m = orderSummaryMessages(locale, props.messages)\n const money = (v: Money) => (renderAmount ? renderAmount(v) : formatMoney(v, locale))\n const H = headingLevel === 3 ? 'h3' : 'h2'\n const discounts = cost.discounts?.filter((d) => positive(d.amount)) ?? []\n return (\n <div className={cx.root} data-sf-summary>\n {title === false ? null : (\n <H className={cx.title} data-sf-summary-title>\n {title ?? m.title}\n </H>\n )}\n <ul className={cx.lines} data-sf-summary-lines>\n {lines.map((l) => {\n const variant = l.merchandise.title && !/^default( title)?$/i.test(l.merchandise.title) ? l.merchandise.title : null\n return (\n <li key={l.id} className={cx.line} data-sf-summary-line>\n {renderLineMedia ? (\n <span className={cx.media} data-sf-summary-media>\n {renderLineMedia(l)}\n {l.quantity > 1 ? (\n <span className={cx.qty} data-sf-summary-qty aria-hidden=\"true\">\n {l.quantity}\n </span>\n ) : null}\n </span>\n ) : null}\n <span data-sf-summary-line-body>\n <span className={cx.lineTitle} data-sf-summary-line-title>\n {!renderLineMedia && l.quantity > 1 ? `${l.quantity} × ` : null}\n {l.merchandise.product.title}\n </span>\n {variant ? (\n <span className={cx.variant} data-sf-summary-variant>\n {variant}\n </span>\n ) : null}\n {renderLineMedia || l.quantity > 1 ? (\n <span style={{ position: 'absolute', width: 1, height: 1, overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap' }}>{m.quantity.replace('{n}', String(l.quantity))}</span>\n ) : null}\n </span>\n <span className={cx.linePrice} data-sf-summary-line-price>\n {money(l.cost.total)}\n </span>\n </li>\n )\n })}\n </ul>\n {children}\n <dl className={cx.totals} data-sf-summary-totals aria-busy={updating || undefined}>\n <div className={cx.row} data-sf-summary-row=\"subtotal\">\n <dt>{m.subtotal}</dt>\n <dd>{money(cost.subtotal)}</dd>\n </div>\n {discounts.length\n ? discounts.map((d) => (\n <div key={d.id} className={cx.row ? `${cx.row} ${cx.discount ?? ''}`.trim() : cx.discount} data-sf-summary-row=\"discount\">\n <dt>{d.code ? `${m.discount} (${d.code})` : d.title || m.discount}</dt>\n <dd>−{money(d.amount)}</dd>\n </div>\n ))\n : positive(cost.discount) ? (\n <div className={cx.row ? `${cx.row} ${cx.discount ?? ''}`.trim() : cx.discount} data-sf-summary-row=\"discount\">\n <dt>{m.discount}</dt>\n <dd>−{money(cost.discount)}</dd>\n </div>\n ) : null}\n <div className={cx.row} data-sf-summary-row=\"shipping\">\n <dt>{m.shipping}</dt>\n <dd className={updating || !cost.shipping ? cx.muted : undefined}>\n {updating ? m.updating : !cost.shipping ? m.shippingPending : isZero(cost.shipping) ? <span className={cx.free}>{m.free}</span> : money(cost.shipping)}\n </dd>\n </div>\n {positive(cost.tax) && !cost.tax_included ? (\n <div className={cx.row} data-sf-summary-row=\"tax\">\n <dt>{m.taxes}</dt>\n <dd>{money(cost.tax)}</dd>\n </div>\n ) : null}\n <div className={cx.total} data-sf-summary-row=\"total\">\n <dt>{m.total}</dt>\n <dd aria-live=\"polite\" data-updating={updating || undefined}>\n {money(cost.total)}\n </dd>\n </div>\n </dl>\n {positive(cost.tax) && cost.tax_included ? (\n <p className={cx.note} data-sf-summary-tax-note>\n {m.taxesIncluded.split('{amount}').flatMap((part, i) => (i === 0 ? [part] : [<span key={i}>{money(cost.tax!)}</span>, part]))}\n </p>\n ) : null}\n </div>\n )\n}\n\nexport type OrderSummaryDisclosureProps = {\n /** Total shown on the collapsed bar (`cart.cost.total`). */\n total: Money\n updating?: boolean\n renderAmount?: (amount: Money) => ReactNode\n locale?: string\n messages?: Partial<OrderSummaryMessages>\n /** Start open (default closed). */\n defaultOpen?: boolean\n className?: string\n classNames?: Partial<Record<'summary' | 'label' | 'total' | 'panel', string>>\n /** Usually an `<OrderSummary title={false} … />`. */\n children: ReactNode\n}\n\n/**\n * Phones: the order summary as a collapsed bar at the top (\"Show order summary · $1,234.00\"). Native `<details>`:\n * works without JavaScript, the server HTML is already the final layout (no shift on hydration). Show it only on\n * narrow screens and the full summary on wide ones (the shop's CSS).\n */\nexport function OrderSummaryDisclosure({ total, updating, renderAmount, locale: loc, messages, defaultOpen = false, className, classNames: cx = {}, children }: OrderSummaryDisclosureProps) {\n const locale = useResolvedLocale(loc)\n const m = orderSummaryMessages(locale, messages)\n return (\n <details className={className} data-sf-summary-disclosure {...(defaultOpen ? { open: true } : {})}>\n <summary className={cx.summary} data-sf-summary-toggle>\n <span className={cx.label} data-sf-summary-toggle-label>\n <span data-sf-summary-show>{m.show}</span>\n <span data-sf-summary-hide>{m.hide}</span>\n </span>\n <span className={cx.total} data-sf-summary-toggle-total data-updating={updating || undefined}>\n {renderAmount ? renderAmount(total) : formatMoney(total, locale)}\n </span>\n </summary>\n <div className={cx.panel} data-sf-summary-panel>\n {children}\n </div>\n </details>\n )\n}\n","/**\n * Which carrier rates to show first. Pure: no DOM, no amounts computed (costs are only compared, as the server sends\n * them). A long quote (10+ services, several per carrier) becomes up to three recommended rows (the cheapest, the\n * fastest and the best balance of both) plus the rest grouped by carrier, so the buyer compares three things instead of\n * scanning a flat list.\n */\nimport type { ShippingRate } from '@asteby/storefront'\nimport { brandKey } from './brands.js'\n\n/** Why a rate is recommended. `best_value` balances price and arrival time. */\nexport type RateTag = 'cheapest' | 'fastest' | 'best_value'\n\nexport type RecommendedRate<R extends ShippingRate = ShippingRate> = { rate: R; tags: RateTag[] }\n\nexport type RateGroup<R extends ShippingRate = ShippingRate> = {\n /** Brand key of the carrier (`fedex`), or `''` for rates without one. */\n key: string\n /** Carrier as the server sends it (first rate of the group), for `BrandMark` and the group name. */\n carrier: string | null\n rates: R[]\n}\n\nexport type RecommendRatesOptions = {\n /** How many rates to recommend. Default 3. */\n count?: number\n /**\n * With this many rates or fewer every rate is recommended (no \"more options\"): hiding one or two rates behind a\n * toggle costs more than it saves. Default `count + 1`.\n */\n collapseAfter?: number\n /** Drop repeated services (same carrier and service, e.g. quoted by two providers), keeping the cheapest. Default true. */\n dedupe?: boolean\n}\n\nexport type RecommendedRates<R extends ShippingRate = ShippingRate> = {\n recommended: RecommendedRate<R>[]\n /** Everything else, grouped by carrier; groups ordered by their cheapest rate, rates by cost. */\n more: RateGroup<R>[]\n /** Number of rates in `more`. */\n moreCount: number\n}\n\nconst costOf = (r: ShippingRate) => {\n const n = Number(r.cost.amount)\n return Number.isFinite(n) ? n : null\n}\nconst daysOf = (r: ShippingRate) => r.eta_days_max ?? r.eta_days_min ?? null\nconst norm = (s: string | null | undefined) => (s ?? '').trim().toLowerCase()\nconst carrierKey = (r: ShippingRate) => (r.carrier ? brandKey(r.carrier) : r.provider ? brandKey(r.provider) : '')\n\n/** Repeated services (same carrier, same service code or title, same arrival): only the cheapest stays. Order kept. */\nexport function dedupeRates<R extends ShippingRate>(rates: readonly R[]): R[] {\n const best = new Map<string, R>()\n const keyOf = (r: R) => `${carrierKey(r)}|${norm(r.service_code) || norm(r.title)}|${daysOf(r) ?? ''}|${r.cost.currency_code}`\n for (const r of rates) {\n const k = keyOf(r)\n const prev = best.get(k)\n const c = costOf(r)\n if (!prev || (c !== null && (costOf(prev) === null || c < costOf(prev)!))) best.set(k, r)\n }\n const keep = new Set(best.values())\n return rates.filter((r) => keep.has(r))\n}\n\n/**\n * Up to `count` recommended rates and the rest by carrier.\n * - **cheapest**: lowest cost (only when every rate shares the currency); a tie goes to the faster one.\n * - **fastest**: fewest business days; a tie goes to the cheaper one. Only when some rate is strictly faster than the\n * cheapest, so the tag always tells the buyer something.\n * - **best_value**: the remaining rate with the best combined position in price and in time (sum of ranks), a tie goes\n * to the cheaper one. Fills the remaining slots.\n * Recommended rows come back cheapest first. Pickup is not a rate and is never hidden (the component shows it apart).\n */\nexport function recommendRates<R extends ShippingRate>(input: readonly R[], options: RecommendRatesOptions = {}): RecommendedRates<R> {\n const count = Math.max(1, options.count ?? 3)\n const rates = options.dedupe === false ? [...input] : dedupeRates(input)\n const collapseAfter = options.collapseAfter ?? count + 1\n const sameCurrency = new Set(rates.map((r) => r.cost.currency_code)).size <= 1\n const byCost = (a: R, b: R) => (costOf(a) ?? Infinity) - (costOf(b) ?? Infinity)\n const byDays = (a: R, b: R) => (daysOf(a) ?? Infinity) - (daysOf(b) ?? Infinity)\n const tags = new Map<R, RateTag[]>()\n const tag = (r: R, t: RateTag) => tags.set(r, [...(tags.get(r) ?? []), t])\n\n const cheapest = sameCurrency && rates.length > 1 ? [...rates].sort((a, b) => byCost(a, b) || byDays(a, b))[0] : undefined\n if (cheapest && costOf(cheapest) !== null) tag(cheapest, 'cheapest')\n const fastest = rates.length > 1 ? [...rates].sort((a, b) => byDays(a, b) || byCost(a, b))[0] : undefined\n if (fastest && daysOf(fastest) !== null && (!cheapest || fastest === cheapest || (daysOf(cheapest) ?? Infinity) > daysOf(fastest)!)) tag(fastest, 'fastest')\n\n const chosen: R[] = []\n for (const r of [cheapest, fastest]) if (r && tags.has(r) && !chosen.includes(r)) chosen.push(r)\n\n if (rates.length > collapseAfter) {\n // Rank in price and in time (ties share a rank); the best sum fills the remaining slots.\n const rank = (sorted: R[], val: (r: R) => number | null) => {\n const out = new Map<R, number>()\n let pos = 0\n let last: number | null | undefined\n sorted.forEach((r, i) => {\n const v = val(r)\n if (v !== last) pos = i\n last = v\n out.set(r, v === null ? sorted.length : pos)\n })\n return out\n }\n const priceRank = rank([...rates].sort(byCost), costOf)\n const timeRank = rank([...rates].sort(byDays), daysOf)\n const rest = rates\n .filter((r) => !chosen.includes(r))\n .sort((a, b) => priceRank.get(a)! + timeRank.get(a)! - (priceRank.get(b)! + timeRank.get(b)!) || byCost(a, b))\n let first = true\n for (const r of rest) {\n if (chosen.length >= count) break\n chosen.push(r)\n if (first) tag(r, 'best_value')\n first = false\n }\n } else {\n for (const r of rates) if (!chosen.includes(r)) chosen.push(r)\n }\n\n const recommended = chosen.sort(byCost).map((rate) => ({ rate, tags: tags.get(rate) ?? [] }))\n const groups = new Map<string, RateGroup<R>>()\n for (const r of [...rates].sort(byCost)) {\n if (chosen.includes(r)) continue\n const key = carrierKey(r)\n const g = groups.get(key) ?? { key, carrier: r.carrier ?? r.provider ?? null, rates: [] }\n g.rates.push(r)\n groups.set(key, g)\n }\n const more = [...groups.values()]\n return { recommended, more, moreCount: more.reduce((n, g) => n + g.rates.length, 0) }\n}\n\nexport type FlatRatesOptions = {\n /** Count used to decide the `best_value` tag, as in `recommendRates` (default 3: only with more than 4 services). */\n count?: number\n /** Drop repeated services keeping the cheapest. Default true. */\n dedupe?: boolean\n /** Id of the chosen rate: it stays in the list even if it is a repeated service. */\n keepId?: string | null\n}\n\n/**\n * ONE flat list for `layout=\"flat\"`: every service (repeated ones dropped, the cheapest stays), ordered from the\n * lowest to the highest price, with the same tags `recommendRates` assigns (cheapest, fastest and, on long quotes,\n * best_value) on the rows that earn them. Nothing is hidden or grouped.\n */\nexport function flatRates<R extends ShippingRate>(input: readonly R[], options: FlatRatesOptions = {}): RecommendedRate<R>[] {\n const count = options.count ?? 3\n const rates = options.dedupe === false ? [...input] : dedupeRates(input)\n const tags = new Map<R, RateTag[]>()\n for (const { rate, tags: t } of recommendRates(rates, { count, dedupe: false }).recommended) tags.set(rate, t)\n const list = [...rates]\n const kept = options.keepId ? input.find((r) => r.id === options.keepId) : undefined\n if (kept && !list.includes(kept)) list.push(kept)\n const byCost = (a: R, b: R) => (costOf(a) ?? Infinity) - (costOf(b) ?? Infinity)\n // Array.prototype.sort is stable: equal prices keep the server order.\n return list.sort(byCost).map((rate) => ({ rate, tags: tags.get(rate) ?? [] }))\n}\n","/**\n * Pure helpers for the \"Delivery\" step: how to name a carrier rate, its arrival time, which rate is the cheapest or the\n * fastest, and one human note for the quote deadline. No amounts are computed: `cost` is shown as the server sends it;\n * comparing two costs to flag the cheapest is the only arithmetic.\n */\nimport type { ShippingRate } from '@asteby/storefront'\nimport { brandName } from './brands.js'\n\nexport type DeliveryMessages = {\n /** `{n}` = business days. */\n etaOne: string\n etaMany: string\n /** `{min}` / `{max}` = business days. */\n etaRange: string\n etaUpTo: string\n etaFrom: string\n cheapest: string\n fastest: string\n free: string\n pickupTitle: string\n /** Quote deadline, `{time}` = local time. */\n quoteToday: string\n quoteTomorrow: string\n /** `{date}` = short date + time. */\n quoteLater: string\n quoteSoon: string\n partial: string\n loading: string\n /** The quote expired or changed and the rates were reloaded. */\n requoted: string\n /** Tag of the recommended rate that balances price and arrival time (`layout=\"recommended\"`). */\n bestValue: string\n /** Toggle of the other rates, `{n}` = how many. */\n moreOptions: string\n /** Title of the group of rates without a carrier. */\n otherCarriers: string\n /** The rates could not be quoted (`error`). */\n error: string\n retry: string\n}\n\nconst ES: DeliveryMessages = {\n etaOne: 'Llega en 1 día hábil',\n etaMany: 'Llega en {n} días hábiles',\n etaRange: 'Llega en {min} a {max} días hábiles',\n etaUpTo: 'Llega en máximo {max} días hábiles',\n etaFrom: 'Llega en {min} días hábiles o más',\n cheapest: 'Más económico',\n fastest: 'Más rápido',\n free: 'Gratis',\n pickupTitle: 'Recoger en {name}',\n quoteToday: 'Precios de envío vigentes hasta las {time}.',\n quoteTomorrow: 'Precios de envío vigentes hasta mañana a las {time}.',\n quoteLater: 'Precios de envío vigentes hasta el {date}.',\n quoteSoon: 'Los precios de envío vencen pronto ({time}).',\n partial: 'Algunas paqueterías no respondieron a tiempo; estas son las opciones disponibles.',\n loading: 'Buscando opciones de envío…',\n requoted: 'Las tarifas de envío cambiaron y ya están actualizadas. Revisa tu envío antes de pagar.',\n bestValue: 'Recomendado',\n moreOptions: 'Ver más opciones ({n})',\n otherCarriers: 'Otras opciones',\n error: 'No pudimos consultar las opciones de envío en este momento.',\n retry: 'Intentar de nuevo',\n}\n\nconst EN: DeliveryMessages = {\n etaOne: 'Arrives in 1 business day',\n etaMany: 'Arrives in {n} business days',\n etaRange: 'Arrives in {min} to {max} business days',\n etaUpTo: 'Arrives in up to {max} business days',\n etaFrom: 'Arrives in {min}+ business days',\n cheapest: 'Cheapest',\n fastest: 'Fastest',\n free: 'Free',\n pickupTitle: 'Pick up at {name}',\n quoteToday: 'Shipping prices valid until {time}.',\n quoteTomorrow: 'Shipping prices valid until tomorrow at {time}.',\n quoteLater: 'Shipping prices valid until {date}.',\n quoteSoon: 'Shipping prices expire soon ({time}).',\n partial: \"We couldn't reach every carrier. These are the options available now.\",\n loading: 'Looking for delivery options…',\n requoted: 'Shipping rates changed and are now up to date. Check your delivery before paying.',\n bestValue: 'Recommended',\n moreOptions: 'Show more options ({n})',\n otherCarriers: 'Other options',\n error: \"We couldn't get delivery options right now.\",\n retry: 'Try again',\n}\n\n/** Messages for a locale (`es*` default, `en*`), with optional overrides. */\nexport function deliveryMessages(locale?: string | null, overrides?: Partial<DeliveryMessages> | null): DeliveryMessages {\n const base = (locale ?? 'es-MX').toLowerCase().startsWith('en') ? EN : ES\n return overrides ? { ...base, ...overrides } : base\n}\n\n// A value that already ends in a period (\"9:39 p.m.\") does not get a second one from the template.\nconst fill = (tpl: string, vars: Record<string, string | number>) => tpl.replace(/\\{(\\w+)\\}/g, (_, k: string) => String(vars[k] ?? '')).replace(/\\.\\.$/, '.')\n\n/** Commercial carrier name of a rate (`fedex` → \"FedEx\"); `null` without carrier. */\nexport function rateCarrier(rate: Pick<ShippingRate, 'carrier'>): string | null {\n return brandName(rate.carrier)\n}\n\n/**\n * Service name without the carrier repeated: \"FedEx Express Saver\" with carrier `fedex` → \"Express Saver\". Falls back\n * to the title when stripping would leave nothing.\n */\nexport function rateService(rate: Pick<ShippingRate, 'title' | 'carrier'>): string {\n const title = rate.title.trim()\n const carrier = rateCarrier(rate)\n if (!carrier) return title\n for (const prefix of [carrier, rate.carrier ?? '']) {\n if (!prefix) continue\n if (title.toLowerCase().startsWith(prefix.toLowerCase())) {\n const rest = title.slice(prefix.length).replace(/^[\\s·:|-]+/, '')\n if (rest) return rest\n }\n }\n return title\n}\n\n/** Arrival time of a rate: business days from the provider, else the server `eta` text as is. */\nexport function rateEta(\n rate: Pick<ShippingRate, 'eta' | 'eta_days_min' | 'eta_days_max'>,\n messages: DeliveryMessages = ES,\n): string | null {\n const { eta_days_min: min, eta_days_max: max } = rate\n if (typeof min === 'number' && typeof max === 'number') {\n if (min === max) return min === 1 ? messages.etaOne : fill(messages.etaMany, { n: min })\n return fill(messages.etaRange, { min, max })\n }\n if (typeof max === 'number') return max === 1 ? messages.etaOne : fill(messages.etaUpTo, { max })\n if (typeof min === 'number') return min === 1 ? messages.etaOne : fill(messages.etaFrom, { min })\n return rate.eta ?? null\n}\n\nexport type RateBadge = 'cheapest' | 'fastest'\n\nconst costOf = (r: ShippingRate) => {\n const n = Number(r.cost.amount)\n return Number.isFinite(n) ? n : null\n}\nconst daysOf = (r: ShippingRate) => r.eta_days_max ?? r.eta_days_min ?? null\n\n/**\n * Badges per rate id. Only with two or more rates, only when one rate is strictly the cheapest (same currency) or\n * strictly the fastest: a tie gets no badge, so the badge always tells the buyer something.\n */\nexport function rateBadges(rates: readonly ShippingRate[]): Map<string, RateBadge[]> {\n const out = new Map<string, RateBadge[]>()\n if (rates.length < 2) return out\n const add = (id: string, b: RateBadge) => out.set(id, [...(out.get(id) ?? []), b])\n const unique = (values: Array<[string, number | null]>) => {\n const known = values.filter((v): v is [string, number] => v[1] !== null)\n if (known.length < 2) return null\n const min = Math.min(...known.map((v) => v[1]))\n const winners = known.filter((v) => v[1] === min)\n return winners.length === 1 ? winners[0]![0] : null\n }\n const currencies = new Set(rates.map((r) => r.cost.currency_code))\n if (currencies.size === 1) {\n const id = unique(rates.map((r) => [r.id, costOf(r)]))\n if (id) add(id, 'cheapest')\n }\n const fast = unique(rates.map((r) => [r.id, daysOf(r)]))\n if (fast) add(fast, 'fastest')\n return out\n}\n\n/** Earliest `expires_at` of the rates (the deadline of the whole list), or `null`. */\nexport function quoteDeadline(rates: readonly Pick<ShippingRate, 'expires_at'>[]): Date | null {\n let best: Date | null = null\n for (const r of rates) {\n if (!r.expires_at) continue\n const d = new Date(r.expires_at)\n if (Number.isNaN(d.getTime())) continue\n if (!best || d < best) best = d\n }\n return best\n}\n\nexport type QuoteNote = { text: string; soon: boolean }\n\n/**\n * One human note for the quote deadline, in the buyer's time zone (or `timeZone`): \"valid until 9:39 p.m.\", \"until\n * tomorrow at…\", \"until Oct 24, …\", or \"expire soon\" within `soonMinutes` (default 15). `null` when already past.\n */\nexport function quoteNote(\n deadline: Date | null,\n opts: { locale?: string; now?: Date; timeZone?: string; soonMinutes?: number; messages?: DeliveryMessages } = {},\n): QuoteNote | null {\n if (!deadline) return null\n const now = opts.now ?? new Date()\n const left = deadline.getTime() - now.getTime()\n if (left <= 0) return null\n const m = opts.messages ?? ES\n const locale = opts.locale ?? 'es-MX'\n const tz = opts.timeZone ? { timeZone: opts.timeZone } : {}\n const time = new Intl.DateTimeFormat(locale, { hour: 'numeric', minute: '2-digit', ...tz }).format(deadline)\n if (left <= (opts.soonMinutes ?? 15) * 60_000) return { text: fill(m.quoteSoon, { time }), soon: true }\n const day = (d: Date) => new Intl.DateTimeFormat('en-CA', { year: 'numeric', month: '2-digit', day: '2-digit', ...tz }).format(d)\n if (day(deadline) === day(now)) return { text: fill(m.quoteToday, { time }), soon: false }\n if (day(deadline) === day(new Date(now.getTime() + 86_400_000))) return { text: fill(m.quoteTomorrow, { time }), soon: false }\n const date = new Intl.DateTimeFormat(locale, { day: 'numeric', month: 'short', hour: 'numeric', minute: '2-digit', ...tz }).format(deadline)\n return { text: fill(m.quoteLater, { date }), soon: false }\n}\n\n/** Error codes a server uses (or will use) when the chosen rate is no longer quotable. */\nconst QUOTE_CODES = new Set(['quote_expired', 'rate_expired', 'rate_changed', 'rate_unavailable', 'rate_not_found', 'stale_rate', 'invalid_rate'])\n\n/**\n * `true` when saving a shipping rate failed because the quote expired or the rates changed, so the shop should reload\n * the rates (and keep the address) instead of showing a generic failure. Recognizes the explicit codes\n * (`quote_expired`, `rate_expired`…, any status), a `409`, and the generic `422` on the rate field that older servers\n * answer when the provider re-quoted with new ids. 5xx and other 4xx stay real failures.\n */\nexport function isQuoteChange(err: { status?: number; code?: string | null; field?: string | null } | null | undefined): boolean {\n if (!err) return false\n if (err.code && QUOTE_CODES.has(err.code)) return true\n if (err.status === 409) return true\n return err.status === 422 && (err.field === 'rate_id' || err.field === 'delivery' || err.field === 'delivery.rate_id' || !err.field)\n}\n\n/**\n * The rate of a fresh quote that matches the one the buyer had chosen (same carrier and service), so a re-quote keeps\n * the choice even though the provider issued new ids. `null` when that service is no longer offered.\n */\nexport function matchRate<R extends Pick<ShippingRate, 'id' | 'carrier' | 'service_code' | 'title'>>(previous: Pick<ShippingRate, 'carrier' | 'service_code' | 'title'> | null | undefined, rates: readonly R[]): R | null {\n if (!previous) return null\n const norm = (s: string | null | undefined) => (s ?? '').trim().toLowerCase()\n const sameCarrier = (r: R) => norm(r.carrier) === norm(previous.carrier)\n if (previous.service_code) {\n const hit = rates.find((r) => sameCarrier(r) && norm(r.service_code) === norm(previous.service_code))\n if (hit) return hit\n }\n return rates.find((r) => sameCarrier(r) && norm(r.title) === norm(previous.title)) ?? null\n}\n","import { useMemo, useSyncExternalStore, type CSSProperties, type ReactNode } from 'react'\nimport { formatMoney, type Money, type PickupOption, type ShippingRate } from '@asteby/storefront'\nimport { useResolvedLocale } from '../locale.js'\nimport { BrandMark } from './brand-mark.js'\nimport { flatRates, recommendRates, type RateTag } from './recommend.js'\nimport {\n deliveryMessages,\n quoteDeadline,\n quoteNote,\n rateBadges,\n rateCarrier,\n rateEta,\n rateService,\n type DeliveryMessages,\n type RateBadge,\n} from './delivery.js'\n\nexport type DeliveryOptionsClassNames = Partial<\n Record<\n | 'root'\n | 'option'\n | 'radio'\n | 'mark'\n | 'body'\n | 'title'\n | 'carrier'\n | 'service'\n | 'eta'\n | 'badges'\n | 'badge'\n | 'price'\n | 'free'\n | 'note'\n | 'partial'\n | 'skeleton'\n | 'more'\n | 'moreSummary'\n | 'group'\n | 'groupTitle'\n | 'error'\n | 'retry',\n string\n >\n>\n\nexport type DeliveryOptionsProps = {\n rates: readonly ShippingRate[]\n pickup?: readonly PickupOption[]\n /** Radio group name. Default `delivery_choice`. */\n name?: string\n /** Form value of a rate. Default `rate:<id>`. */\n rateValue?: (rate: ShippingRate) => string\n /** Form value of a pickup branch. Default `pickup:<branch_id>`. */\n pickupValue?: (branch: PickupOption) => string\n /** Uncontrolled preselection. Default: the first rate. `null`: nothing preselected. */\n defaultValue?: string | null\n /** Controlled value (use with `onValueChange`). */\n value?: string\n onValueChange?: (value: string) => void\n /** Some provider did not answer (`DeliveryOptions.partial`): one neutral note above the list. */\n partial?: boolean\n /** The previous quote expired or changed and these rates are fresh: one status note above the list. */\n requoted?: boolean\n /** Rates are being quoted again: skeleton rows (no rates yet) or the current rows dimmed, `aria-busy`. */\n loading?: boolean\n /** Quote deadline note: `always` (default), only when it is `soon`, or `never`. */\n quoteNote?: 'always' | 'soon' | 'never'\n /** Time zone of the note. Default: the buyer's browser. */\n timeZone?: string\n /** Show the carrier marks. Default true. */\n marks?: boolean\n /** Cheapest / fastest badges. Default true. */\n badges?: boolean\n required?: boolean\n locale?: string\n messages?: Partial<DeliveryMessages>\n renderAmount?: (amount: Money) => ReactNode\n classNames?: DeliveryOptionsClassNames\n /**\n * `list` (default): every rate, as the server orders them. `recommended`: up to `recommendedCount` rates (cheapest,\n * fastest and the best balance, tagged) and the rest under \"Show more options (N)\", grouped by carrier so the carrier\n * name is not repeated on every row. Repeated services are dropped (the cheapest stays). Works without JavaScript\n * (`<details>`); it opens by itself when the chosen rate is inside. `flat`: ONE plain list like most online shops:\n * every service ordered from the lowest to the highest price, repeated services dropped (the cheapest stays), the\n * cheapest / fastest / recommended tags on the rows that earn them, no `<details>` and no groups. The chosen rate is\n * always listed, and with no explicit default the preselected row is the first one (the cheapest).\n */\n layout?: 'list' | 'recommended' | 'flat'\n /** Rates recommended in `layout=\"recommended\"`. Default 3. */\n recommendedCount?: number\n /**\n * The rates could not be quoted (provider down, timeout): one friendly alert instead of the list, with a retry button\n * when `onRetry` is set. `true` uses the default text; a string replaces it.\n */\n error?: boolean | string\n onRetry?: () => void\n /** `data-testid` of every radio. */\n testId?: string\n /** Rows the shop renders before the rates (e.g. \"home delivery, rates after the address\"). */\n children?: ReactNode\n}\n\nconst SR_ONLY: CSSProperties = { position: 'absolute', width: 1, height: 1, overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap' }\n\nconst useHydrated = () =>\n useSyncExternalStore(\n () => () => {},\n () => true,\n () => false,\n )\n\nfunction PickupGlyph({ size = 24 }: { size?: number }) {\n return (\n <svg viewBox=\"0 0 48 32\" width={Math.round(size * 1.5)} height={size} aria-hidden=\"true\" focusable=\"false\" style={{ flex: 'none' }} data-sf-brand-mark=\"pickup\">\n <rect x=\"0.5\" y=\"0.5\" width=\"47\" height=\"31\" rx=\"5\" fill=\"var(--sf-brand-mark-bg, #E7E9EE)\" stroke=\"var(--sf-brand-mark-ring, rgb(127 127 127 / 0.35))\" />\n <path d=\"M15 13.5 17 9h14l2 4.5M15 13.5h18M15 13.5V23h18v-9.5M21 23v-5h6v5\" fill=\"none\" stroke=\"var(--sf-brand-mark-fg, #2B2F38)\" strokeWidth=\"1.8\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\n/**\n * The rates and pickup branches of \"Delivery\" as native radios: carrier mark and commercial name, readable service,\n * arrival time, cheapest / fastest badges, price as the server sends it, and ONE note for the quote deadline in the\n * buyer's time zone. Works without JavaScript (plain radios in the page form); the note appears after hydration in a\n * reserved line, so it never shifts the layout.\n *\n * Wrap it in the shop's own `<fieldset><legend>`. Style it with `classNames` and/or the default sheet\n * `@asteby/storefront-react/checkout.css`.\n */\nexport function DeliveryOptions(props: DeliveryOptionsProps) {\n const {\n rates,\n pickup = [],\n name = 'delivery_choice',\n rateValue = (r) => `rate:${r.id}`,\n pickupValue = (b) => `pickup:${b.branch_id}`,\n value,\n onValueChange,\n partial = false,\n requoted = false,\n loading = false,\n timeZone,\n marks = true,\n badges: showBadges = true,\n required = true,\n renderAmount,\n classNames: cx = {},\n testId,\n children,\n layout = 'list',\n error,\n onRetry,\n } = props\n const locale = useResolvedLocale(props.locale)\n const m = useMemo(() => deliveryMessages(locale, props.messages), [locale, props.messages])\n const hydrated = useHydrated()\n const badges = useMemo(() => (showBadges ? rateBadges(rates) : new Map<string, RateBadge[]>()), [rates, showBadges])\n const flat = useMemo(\n () => (layout === 'flat' ? flatRates(rates, { count: props.recommendedCount ?? 3, keepId: value ? rates.find((r) => rateValue(r) === value)?.id ?? null : null }) : null),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [layout, rates, props.recommendedCount, value],\n )\n const firstRate = flat ? flat[0]?.rate : rates[0]\n const firstValue = firstRate ? rateValue(firstRate) : null\n const defaultValue = props.defaultValue === undefined ? firstValue : props.defaultValue\n const amount = (money: Money) => (Number(money.amount) === 0 ? <span className={cx.free} data-sf-delivery-free>{m.free}</span> : renderAmount ? renderAmount(money) : formatMoney(money, locale))\n const mode = props.quoteNote ?? 'always'\n const deadline = mode === 'never' ? null : quoteDeadline(rates)\n const note = hydrated && deadline ? quoteNote(deadline, { locale, messages: m, ...(timeZone ? { timeZone } : {}) }) : null\n const shownNote = note && (mode === 'always' || note.soon) ? note : null\n\n const current = value ?? defaultValue ?? null\n const plan = useMemo(\n () => (layout === 'recommended' ? recommendRates(rates, { count: props.recommendedCount ?? 3 }) : null),\n [layout, rates, props.recommendedCount],\n )\n const inMore = plan ? plan.more.some((g) => g.rates.some((r) => rateValue(r) === current)) : false\n\n const radio = (v: string, describedBy?: string) => (\n <input\n type=\"radio\"\n name={name}\n value={v}\n required={required}\n className={cx.radio}\n {...(describedBy ? { 'aria-describedby': describedBy } : {})}\n {...(value !== undefined ? { checked: value === v, onChange: () => onValueChange?.(v) } : { defaultChecked: v === defaultValue, ...(onValueChange ? { onChange: () => onValueChange(v) } : {}) })}\n {...(testId ? { 'data-testid': testId } : {})}\n />\n )\n\n const tagText = (t: RateTag | RateBadge) => (t === 'cheapest' ? m.cheapest : t === 'fastest' ? m.fastest : m.bestValue)\n\n /** One row: [radio] [mark] carrier + service / arrival / tags ........ price. In a carrier group the mark and the carrier name live in the group title. */\n const rateRow = (rate: ShippingRate, opts: { tags: readonly (RateTag | RateBadge)[]; grouped?: boolean }) => {\n const carrier = rateCarrier(rate)\n const service = rateService(rate)\n const eta = rateEta(rate, m)\n return (\n <label key={rate.id} className={cx.option} data-sf-delivery-option data-loading={loading || undefined} data-grouped={opts.grouped || undefined}>\n {radio(rateValue(rate))}\n {marks && !opts.grouped ? (\n // Fixed slot: logos of different widths do not push the text column out of line.\n <span data-sf-delivery-mark aria-hidden=\"true\">\n <BrandMark brand={rate.carrier ?? rate.provider ?? rate.title} size={28} {...(cx.mark ? { className: cx.mark } : {})} />\n </span>\n ) : null}\n <span className={cx.body} data-sf-delivery-body>\n <span className={cx.title} data-sf-delivery-title>\n {carrier ? (\n opts.grouped ? (\n <>\n {/* The group title already shows the carrier: only screen readers hear it again (each radio keeps a full name). */}\n <span style={SR_ONLY}>{carrier} </span>\n <span className={cx.carrier} data-sf-delivery-carrier data-sf-delivery-service-only>\n {service}\n </span>\n </>\n ) : (\n <>\n <span className={cx.carrier} data-sf-delivery-carrier>\n {carrier}\n </span>{' '}\n <span className={cx.service} data-sf-delivery-service>\n {service}\n </span>\n </>\n )\n ) : (\n <span className={cx.carrier} data-sf-delivery-carrier>\n {service}\n </span>\n )}\n </span>\n {eta ? (\n <span className={cx.eta} data-sf-delivery-eta>\n {eta}\n </span>\n ) : null}\n {opts.tags.length ? (\n <span className={cx.badges} data-sf-delivery-badges>\n {opts.tags.map((b) => (\n <span key={b} className={cx.badge} data-sf-delivery-badge={b}>\n {tagText(b)}\n </span>\n ))}\n </span>\n ) : null}\n </span>\n <span className={cx.price} data-sf-delivery-price>\n {amount(rate.cost)}\n </span>\n </label>\n )\n }\n\n const errorText = error ? (typeof error === 'string' ? error : m.error) : null\n\n return (\n <div className={cx.root} data-sf-delivery data-layout={layout} aria-busy={loading || undefined}>\n {partial && !errorText ? (\n <p role=\"status\" className={cx.partial} data-sf-delivery-partial>\n {m.partial}\n </p>\n ) : null}\n {requoted ? (\n <p role=\"status\" className={cx.partial} data-sf-delivery-requoted>\n {m.requoted}\n </p>\n ) : null}\n {loading ? (\n <span style={SR_ONLY} role=\"status\" data-sf-delivery-loading>\n {m.loading}\n </span>\n ) : null}\n {errorText && rates.length === 0 && !loading ? (\n <div role=\"alert\" className={cx.error} data-sf-delivery-error>\n <p>{errorText}</p>\n {onRetry ? (\n <button type=\"button\" className={cx.retry} onClick={onRetry} data-sf-delivery-retry>\n {m.retry}\n </button>\n ) : null}\n </div>\n ) : null}\n {children}\n {loading && rates.length === 0\n ? [0, 1, 2].map((i) => <div key={i} className={cx.skeleton} data-sf-delivery-skeleton aria-hidden=\"true\" />)\n : null}\n {flat\n ? flat.map(({ rate, tags }) => rateRow(rate, { tags: showBadges ? tags : [] }))\n : plan\n ? plan.recommended.map(({ rate, tags }) => rateRow(rate, { tags: showBadges ? tags : [] }))\n : rates.map((rate) => rateRow(rate, { tags: badges.get(rate.id) ?? [] }))}\n {plan && plan.moreCount > 0 ? (\n <details className={cx.more} data-sf-delivery-more {...(inMore ? { open: true } : {})}>\n <summary className={cx.moreSummary} data-sf-delivery-more-summary>\n {m.moreOptions.replace('{n}', String(plan.moreCount))}\n </summary>\n <div data-sf-delivery-groups>\n {plan.more.map((g) => {\n const carrierName = g.carrier ? rateCarrier({ carrier: g.carrier }) : null\n const id = `${name}-group-${g.key || 'other'}`\n return (\n <div key={g.key || 'other'} role=\"group\" aria-labelledby={id} className={cx.group} data-sf-delivery-group={g.key || 'other'}>\n <p id={id} className={cx.groupTitle} data-sf-delivery-group-title>\n {marks && g.carrier ? <BrandMark brand={g.carrier} size={22} /> : null}\n <span>{carrierName ?? m.otherCarriers}</span>\n </p>\n {g.rates.map((rate) => rateRow(rate, { tags: [], grouped: Boolean(carrierName) }))}\n </div>\n )\n })}\n </div>\n </details>\n ) : null}\n {pickup.map((b) => (\n <label key={b.branch_id} className={cx.option} data-sf-delivery-option data-sf-delivery-pickup>\n {radio(pickupValue(b))}\n {marks ? <PickupGlyph size={28} /> : null}\n <span className={cx.body} data-sf-delivery-body>\n <span className={cx.title} data-sf-delivery-title>\n <span className={cx.carrier} data-sf-delivery-carrier>\n {m.pickupTitle.replace('{name}', b.name)}\n </span>\n </span>\n {b.address || b.city ? (\n <span className={cx.eta} data-sf-delivery-eta>\n {[b.address, b.city].filter(Boolean).join(', ')}\n </span>\n ) : null}\n </span>\n <span className={cx.price} data-sf-delivery-price>\n <span className={cx.free} data-sf-delivery-free>\n {m.free}\n </span>\n </span>\n </label>\n ))}\n {deadline ? (\n <p className={cx.note} data-sf-delivery-note data-soon={shownNote?.soon || undefined} aria-live=\"polite\">\n {shownNote?.text ?? ''}\n </p>\n ) : null}\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/checkout/address-fields.tsx","../src/checkout/order-summary.tsx","../src/checkout/recommend.ts","../src/checkout/delivery.ts","../src/checkout/delivery-options.tsx"],"names":["fill","el","ES","EN","jsxs","jsx","costOf","daysOf","norm","formatMoney","Fragment"],"mappings":";;;;;;;;;;AA0BA,IAAM,EAAA,GAA4B;AAAA,EAChC,KAAA,EAAO,QAAA;AAAA,EACP,KAAA,EAAO,aAAA;AAAA,EACP,UAAA,EAAY,QAAA;AAAA,EACZ,SAAA,EAAW,WAAA;AAAA,EACX,GAAA,EAAK,kBAAA;AAAA,EACL,QAAA,EAAU,QAAA;AAAA,EACV,IAAA,EAAM,oBAAA;AAAA,EACN,YAAA,EAAc,SAAA;AAAA,EACd,QAAA,EAAU,mBAAA;AAAA,EACV,QAAA,EAAU,mCAAA;AAAA,EACV,SAAA,EAAW,6BAAA;AAAA,EACX,mBAAA,EAAqB,iBAAA;AAAA,EACrB,uBAAA,EAAyB,kBAAA;AAAA,EACzB,YAAA,EAAc,uCAAA;AAAA,EACd,aAAA,EAAe,gDAAA;AAAA,EACf,SAAA,EAAW,0DAAA;AAAA,EACX,SAAA,EAAW,0DAAA;AAAA,EACX,YAAA,EAAc;AAChB,CAAA;AAEA,IAAM,EAAA,GAA4B;AAAA,EAChC,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,UAAA,EAAY,YAAA;AAAA,EACZ,SAAA,EAAW,WAAA;AAAA,EACX,GAAA,EAAK,aAAA;AAAA,EACL,QAAA,EAAU,OAAA;AAAA,EACV,IAAA,EAAM,MAAA;AAAA,EACN,YAAA,EAAc,cAAA;AAAA,EACd,QAAA,EAAU,mBAAA;AAAA,EACV,QAAA,EAAU,kBAAA;AAAA,EACV,SAAA,EAAW,gBAAA;AAAA,EACX,mBAAA,EAAqB,mBAAA;AAAA,EACrB,uBAAA,EAAyB,0BAAA;AAAA,EACzB,YAAA,EAAc,2BAAA;AAAA,EACd,aAAA,EAAe,qCAAA;AAAA,EACf,SAAA,EAAW,6CAAA;AAAA,EACX,SAAA,EAAW,uDAAA;AAAA,EACX,YAAA,EAAc;AAChB,CAAA;AAEO,SAAS,qBAAA,CAAsB,QAAwB,SAAA,EAA0E;AACtI,EAAA,MAAM,IAAA,GAAA,CAAQ,UAAU,OAAA,EAAS,WAAA,GAAc,UAAA,CAAW,IAAI,IAAI,EAAA,GAAK,EAAA;AACvE,EAAA,OAAO,YAAY,EAAE,GAAG,IAAA,EAAM,GAAG,WAAU,GAAI,IAAA;AACjD;AAkBA,IAAM,IAAA,GAAO,IAAI,CAAA,KAAiC,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,MAAA;AACjF,IAAM,KAAA,GAAQ,CAAC,EAAA,EAA2B,IAAA,MAAoD,EAAE,GAAG,EAAA,EAAI,IAAA,EAAM,IAAA,CAAK,EAAA,CAAG,IAAA,EAAM,EAAA,CAAG,IAAI,CAAC,CAAA,EAAE,CAAA;AAa9H,SAAS,aAAA,CAAc,EAAE,QAAA,GAAW,IAAI,KAAA,GAAQ,EAAC,EAAG,MAAA,GAAS,EAAC,EAAG,OAAO,KAAA,GAAQ,IAAA,EAAM,QAAQ,QAAA,EAAU,aAAA,EAAe,IAAI,UAAA,EAAY,EAAA,GAAK,EAAC,EAAE,EAAuB;AAC3K,EAAA,MAAM,CAAA,GAAI,qBAAA,CAAsB,MAAA,EAAQ,QAAQ,CAAA;AAChD,EAAA,MAAM,CAAA,GAAI,CAAC,CAAA,KAAuB,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAC9C,EAAA,MAAM,SAAS,EAAE,GAAI,MAAA,GAAS,EAAE,QAAO,GAAI,EAAC,EAAI,GAAI,KAAK,EAAE,QAAA,EAAU,EAAA,EAAG,GAAI,EAAC,EAAG;AAChF,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,iBAAe,GAAG,MAAA,EAAQ,MAAM,CAAA,CAAE,OAAO,GAAG,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,IAAA,EAAK,SAAQ,YAAA,EAAa,OAAA,EAAQ,WAAU,OAAA,EAAQ,cAAA,EAAe,QAAO,UAAA,EAAY,KAAA,EAAO,YAAA,EAAc,QAAA,CAAS,SAAS,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA,CAAE,OAAO,CAAC,CAAA,IAAK,IAAA,EAAM,IAAA,EAAM,KAAA,GAAQ,EAAE,SAAA,GAAY,MAAA,EAAW,YAAY,KAAA,CAAM,EAAA,EAAI,MAAM,CAAA,EAAG,CAAA;AAAA,oBACvS,GAAA,CAAC,aAAA,EAAA,EAAe,GAAG,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,OAAO,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,IAAA,EAAK,OAAM,YAAA,EAAa,KAAA,EAAM,SAAA,EAAU,KAAA,EAAM,YAAA,EAAc,QAAA,CAAS,KAAA,IAAS,EAAA,EAAI,OAAO,MAAA,CAAO,CAAA,CAAE,OAAO,CAAC,CAAA,IAAK,IAAA,EAAM,IAAA,EAAM,KAAA,GAAQ,EAAE,SAAA,GAAY,MAAA,EAAW,UAAA,EAAY,KAAA,CAAM,EAAA,EAAI,MAAM,CAAA,EAAI,GAAI,OAAO,OAAA,GAAU,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAQ,GAAI,EAAC,EAAK,GAAI,KAAA,EAAO,KAAA,GAAQ,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI,IAAM,GAAI,KAAA,EAAO,SAAA,GAAY,EAAE,SAAA,EAAW,KAAA,CAAM,SAAA,EAAU,GAAI,EAAC,EAAI,CAAA;AAAA,oBACha,GAAA,CAAC,aAAA,EAAA,EAAe,GAAG,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,YAAY,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,UAAA,EAAY,YAAA,EAAa,YAAA,EAAa,YAAA,EAAc,QAAA,CAAS,UAAA,IAAc,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,YAAY,CAAC,CAAA,IAAK,IAAA,EAAM,UAAA,EAAY,KAAA,CAAM,EAAA,EAAI,MAAM,CAAA,EAAG,CAAA;AAAA,oBACjN,GAAA,CAAC,aAAA,EAAA,EAAe,GAAG,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,WAAW,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,SAAA,EAAW,YAAA,EAAa,aAAA,EAAc,YAAA,EAAc,QAAA,CAAS,SAAA,IAAa,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,WAAW,CAAC,CAAA,IAAK,IAAA,EAAM,UAAA,EAAY,KAAA,CAAM,EAAA,EAAI,MAAM,CAAA,EAAG;AAAA,GAAA,EAChN,CAAA;AAEJ;AAgDA,SAAS,UAAU,EAAA,EAA0C;AAC3D,EAAA,IAAI,EAAA,CAAG,OAAA,CAAQ,QAAA,KAAa,GAAA,EAAK;AACjC,EAAA,EAAA,CAAG,QAAQ,QAAA,GAAW,GAAA;AACtB,EAAA,EAAA,CAAG,YAAA,CAAa,iBAAiB,MAAM,CAAA;AACvC,EAAA,IAAI,cAAc,iBAAA,EAAmB;AAEnC,IAAA,MAAM,IAAA,GAAO,EAAA,CAAG,YAAA,CAAa,MAAM,CAAA;AACnC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC7C,MAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,MAAA,MAAA,CAAO,IAAA,GAAO,IAAA;AACd,MAAA,MAAA,CAAO,QAAQ,EAAA,CAAG,KAAA;AAClB,MAAA,EAAA,CAAG,qBAAA,CAAsB,YAAY,MAAM,CAAA;AAC3C,MAAA,EAAA,CAAG,gBAAgB,MAAM,CAAA;AAAA,IAC3B;AACA,IAAA,EAAA,CAAG,QAAA,GAAW,IAAA;AAAA,EAChB,CAAA,MAAO;AACL,IAAA,EAAA,CAAG,QAAA,GAAW,IAAA;AAAA,EAChB;AACF;AAGO,IAAM,uBAAA,GAA0B;AAMhC,SAAS,mBAAmB,KAAA,EAAuB;AACxD,EAAA,OAAQ,KAAA,CAA6C,uBAAuB,CAAA,KAAM,IAAA;AACpF;AAEO,SAAS,cAAc,KAAA,EAA2B;AACvD,EAAA,MAAM,EAAE,UAAU,KAAA,GAAQ,IAAI,MAAA,GAAS,EAAC,EAAG,WAAA,EAAa,SAAA,EAAW,UAAA,EAAY,kBAAkB,kBAAA,EAAoB,MAAA,EAAQ,UAAU,aAAA,EAAe,EAAA,EAAI,YAAY,EAAA,GAAK,EAAC,EAAG,QAAA,EAAS,GAAI,KAAA;AAC5L,EAAA,MAAM,gBAAA,GAAmB,MAAM,YAAA,IAAgB,IAAA;AAC/C,EAAA,MAAM,aAAA,GAAgB,MAAM,SAAA,IAAa,IAAA;AACzC,EAAA,MAAM,CAAA,GAAI,qBAAA,CAAsB,MAAA,EAAQ,QAAQ,CAAA;AAChD,EAAA,MAAM,CAAA,GAAI,CAAC,CAAA,KAAuB,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA;AAC9C,EAAA,MAAM,SAAS,EAAE,GAAI,MAAA,GAAS,EAAE,QAAO,GAAI,EAAC,EAAI,GAAI,KAAK,EAAE,QAAA,EAAU,EAAA,EAAG,GAAI,EAAC,EAAG;AAChF,EAAA,MAAM,SAAS,KAAA,EAAM;AACrB,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,CAA4B,EAAE,CAAA;AAC9D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,EAAA,MAAM,gBAAA,GAAmB,OAAO,KAAK,CAAA;AAErC,EAAA,MAAM,YAAA,GAAe,OAA2E,IAAI,CAAA;AACpG,EAAA,MAAM,OAAA,GAAU,OAAsB,IAAI,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,OAAuB,IAAI,CAAA;AAC1C,EAAA,MAAM,SAAA,GAAY,OAAO,gBAAgB,CAAA;AACzC,EAAA,SAAA,CAAU,OAAA,GAAU,gBAAA;AAGpB,EAAA,MAAM,MAAA,GAAS,MAAA,CAAsB,OAAA,CAAQ,OAAA,EAAS,CAAA;AACtD,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAqB;AACpC,IAAA,MAAA,CAAO,UAAU,MAAA,CAAO,OAAA,CAAQ,KAAK,IAAI,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAC3D,CAAA;AAGA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,EAAS,OAAA,CAAQ,MAAM,CAAA;AAC3C,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAa;AACzB,MAAA,IAAI,CAAC,EAAE,SAAA,EAAW;AAClB,MAAA,MAAM,KAAK,CAAA,CAAE,MAAA;AACb,MAAA,IAAI,EAAA,YAAc,gBAAA,IAAoB,EAAA,YAAc,iBAAA,EAAmB;AACrE,QAAA,EAAA,CAAG,QAAQ,YAAA,GAAe,GAAA;AAC1B,QAAA,OAAO,GAAG,OAAA,CAAQ,YAAA;AAAA,MACpB;AAAA,IACF,CAAA;AACA,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,IAAA,EAAM,IAAI,CAAA;AACzC,IAAA,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,IAAA,EAAM,IAAI,CAAA;AAC1C,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,OAAA,EAAS,IAAA,EAAM,IAAI,CAAA;AAC5C,MAAA,IAAA,CAAK,mBAAA,CAAoB,QAAA,EAAU,IAAA,EAAM,IAAI,CAAA;AAAA,IAC/C,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAY,CAAC,GAAA,KAAgB;AACjC,IAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,GAAA,IAAO,GAAA,KAAQ,QAAQ,OAAA,EAAS;AAChD,IAAA,IAAI,UAAA,EAAY,OAAA,IAAW,CAAC,IAAI,MAAA,CAAO,CAAA,IAAA,EAAO,UAAA,CAAW,OAAO,CAAA,EAAA,CAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EAAG;AACjF,IAAA,OAAA,CAAQ,OAAA,GAAU,GAAA;AAClB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,EAAS,OAAA,CAAQ,MAAM,CAAA;AAC3C,IAAA,KAAK,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA;AAAA,MACf,CAAC,IAAA,KAAS;AACR,QAAA,IAAI,CAAC,IAAA,EAAM;AACX,QAAA,OAAA,CAAQ,MAAM;AACZ,UAAA,IAAI,OAAA,CAAQ,YAAY,GAAA,EAAK;AAC7B,UAAA,MAAMA,KAAAA,GAAO,CAAC,IAAA,EAAc,KAAA,EAAkC,IAAA,KAAmB;AAC/E,YAAA,MAAMC,GAAAA,GAAK,IAAA,EAAM,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AACxC,YAAA,IAAI,CAACA,OAAM,CAAC,KAAA,IAAU,YAAYA,GAAAA,IAAM,EAAEA,GAAAA,YAAc,iBAAA,CAAA,EAAqB,OAAO,KAAA;AAEpF,YAAA,IAAIA,GAAAA,CAAG,OAAA,CAAQ,QAAA,KAAa,GAAA,EAAK,OAAO,KAAA;AAGxC,YAAA,IAAIA,GAAAA,CAAG,OAAA,CAAQ,YAAA,KAAiB,GAAA,IAAQA,GAAAA,CAAG,cAAc,aAAA,KAAkBA,GAAAA,IAAMA,GAAAA,CAAG,KAAA,EAAQ,OAAO,KAAA;AAEnG,YAAA,IAAIA,IAAG,KAAA,IAASA,GAAAA,CAAG,OAAA,CAAQ,YAAA,KAAiB,KAAK,OAAO,KAAA;AACxD,YAAA,IAAIA,GAAAA,YAAc,iBAAA,IAAqB,CAAC,CAAC,GAAGA,GAAAA,CAAG,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,KAAK,GAAG,OAAO,KAAA;AAC/F,YAAAA,IAAG,KAAA,GAAQ,KAAA;AACX,YAAAA,GAAAA,CAAG,QAAQ,YAAA,GAAe,GAAA;AAC1B,YAAA,MAAM,QAAQ,IAAI,KAAA,CAAM,SAAS,EAAE,OAAA,EAAS,MAAM,CAAA;AAClD,YAAA,MAAA,CAAO,eAAe,KAAA,EAAO,uBAAA,EAAyB,EAAE,KAAA,EAAO,MAAM,CAAA;AACrE,YAAAA,GAAAA,CAAG,cAAc,KAAK,CAAA;AACtB,YAAA,IAAI,IAAA,YAAgBA,GAAE,CAAA;AACtB,YAAA,OAAO,IAAA;AAAA,UACT,CAAA;AACA,UAAA,MAAM,IAAID,KAAAA,CAAK,CAAA,CAAE,UAAU,CAAA,EAAG,IAAA,CAAK,UAAU,kBAAkB,CAAA;AAC/D,UAAA,MAAM,IAAIA,KAAAA,CAAK,CAAA,CAAE,MAAM,CAAA,EAAG,KAAK,IAAI,CAAA;AAEnC,UAAA,MAAM,IAAA,GAAO,KAAK,aAAA,EAAe,MAAA,KAAW,IAAI,IAAA,CAAK,aAAA,CAAc,CAAC,CAAA,GAAI,IAAA;AACxE,UAAA,MAAM,IAAI,gBAAA,GAAmBA,KAAAA,CAAK,EAAE,cAAc,CAAA,EAAG,IAAI,CAAA,GAAI,KAAA;AAC7D,UAAA,WAAA,CAAY,IAAA,CAAK,aAAA,IAAiB,EAAE,CAAA;AACpC,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,IAAiB,EAAC;AACpC,UAAA,MAAM,SAAS,IAAA,EAAM,QAAA,CAAS,SAAA,CAAU,CAAA,CAAE,cAAc,CAAC,CAAA;AACzD,UAAA,MAAM,EAAA,GAAK,UAAU,EAAE,QAAA,IAAY,UAAU,EAAE,MAAA,YAAkB,sBAAsB,MAAA,GAAS,IAAA;AAChG,UAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,CAAG,KAAA,GAAQ,EAAA;AAC9B,UAAA,MAAM,UAAA,GAAa,KAAA,CAAM,gBAAA,KAAqB,QAAA,IAAY,gBAAA,KAAqB,KAAA,IAAS,IAAA,CAAK,MAAA,GAAS,CAAA,KAAM,CAAC,KAAA,IAAS,IAAA,CAAK,SAAS,KAAK,CAAA,CAAA;AACzI,UAAA,IAAI,OAAA,GAAU,KAAA;AACd,UAAA,IAAI,gBAAA,IAAoB,UAAA,KAAe,gBAAA,CAAiB,OAAA,EAAS;AAC/D,YAAA,MAAM,UAAA,GAAa,EAAA,EAAI,OAAA,CAAQ,YAAA,KAAiB,GAAA;AAEhD,YAAA,MAAM,KAAA,GAAQ,IAAA,IAAQ,CAAC,UAAA,GAAa,IAAA,GAAO,UAAA,GAAc,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,GAAQ,EAAA,GAAM,KAAA;AAC9F,YAAA,YAAA,CAAa,OAAA,GAAU,EAAE,KAAA,EAAO,UAAA,EAAY,CAAC,UAAA,KAAe,CAAC,CAAC,IAAA,IAAQ,EAAA,EAAI,OAAA,CAAQ,YAAA,KAAiB,MAAM,UAAA,EAAW;AACpH,YAAA,OAAA,GAAU,CAAC,CAAC,IAAA,IAAQ,CAAC,UAAA;AAAA,UACvB;AACA,UAAA,gBAAA,CAAiB,OAAA,GAAU,UAAA;AAC3B,UAAA,gBAAA,CAAiB,UAAU,CAAA;AAC3B,UAAA,SAAA,CAAU,CAAA,IAAK,CAAA,IAAK,CAAA,IAAK,OAAO,CAAA;AAAA,QAClC,CAAC,CAAA;AAAA,MACH,CAAA;AAAA,MACA,MAAM;AAAA,MAEN;AAAA,KACF;AAAA,EACF,CAAA;AAGA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,QAAQ,YAAA,CAAa,OAAA;AAC3B,IAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,KAAA,EAAO;AAC5B,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,EAAS,OAAA,CAAQ,MAAM,CAAA;AAC3C,IAAA,MAAM,KAAK,IAAA,EAAM,QAAA,CAAS,SAAA,CAAU,CAAA,CAAE,cAAc,CAAC,CAAA;AACrD,IAAA,IAAI,CAAC,EAAA,IAAO,QAAA,IAAY,EAAA,IAAM,EAAE,cAAc,iBAAA,CAAA,EAAqB;AACnE,IAAA,IAAI,EAAA,YAAc,iBAAA,IAAqB,CAAC,CAAC,GAAG,EAAA,CAAG,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,KAAA,CAAM,KAAK,CAAA,EAAG;AAC9F,IAAA,EAAA,CAAG,QAAQ,KAAA,CAAM,KAAA;AACjB,IAAA,IAAI,KAAA,CAAM,UAAA,EAAY,EAAA,CAAG,OAAA,CAAQ,YAAA,GAAe,GAAA;AAAA,SAAA,IACvC,KAAA,CAAM,UAAA,EAAY,EAAA,CAAG,OAAA,CAAQ,YAAA,GAAe,GAAA;AACrD,IAAA,MAAM,QAAQ,IAAI,KAAA,CAAM,SAAS,EAAE,OAAA,EAAS,MAAM,CAAA;AAClD,IAAA,MAAA,CAAO,eAAe,KAAA,EAAO,uBAAA,EAAyB,EAAE,KAAA,EAAO,MAAM,CAAA;AACrE,IAAA,EAAA,CAAG,cAAc,KAAK,CAAA;AAAA,EAExB,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,MAAM,QAAA,EAAU,GAAA;AACtB,IAAA,IAAI,GAAA,YAAe,GAAG,CAAA;AAAA,EAExB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAa,YAAY,SAAA,KAAc,SAAA;AAC7C,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAK,MAAA,EAAQ,SAAA,EAAW,KAAK,EAAA,CAAG,IAAI,CAAA,EAAG,aAAA,EAAW,IAAA,EACrD,QAAA,kBAAA,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACE,GAAG,MAAA;AAAA,QACJ,IAAA,EAAM,EAAE,KAAK,CAAA;AAAA,QACb,OAAO,CAAA,CAAE,GAAA;AAAA,QACT,YAAA,EAAa,aAAA;AAAA,QACb,SAAA,EAAW,YAAY,SAAA,IAAa,MAAA;AAAA,QACnC,GAAI,YAAY,OAAA,GAAU,EAAE,SAAS,UAAA,CAAW,OAAA,KAAY,EAAC;AAAA,QAC7D,GAAI,YAAY,SAAA,GAAY,EAAE,WAAW,UAAA,CAAW,SAAA,KAAc,EAAC;AAAA,QACnE,GAAI,YAAY,KAAA,GAAQ,EAAE,OAAO,UAAA,CAAW,KAAA,KAAU,EAAC;AAAA,QACvD,GAAI,UAAA,GAAa,EAAE,cAAA,EAAgB,MAAA,KAAW,EAAC;AAAA,QAChD,YAAA,EAAc,UAAU,GAAA,IAAO,EAAA;AAAA,QAC/B,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,KAAK,CAAC,CAAA,IAAK,IAAA;AAAA,QAC3B,YAAY,EAAE,GAAG,EAAA,EAAI,IAAA,EAAM,GAAG,IAAA,EAAK;AAAA,QACnC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAA,MAAM,CAAA,GAAI,CAAA,CAAE,aAAA,CAAc,KAAA,CAAM,IAAA,EAAK;AACrC,UAAA,IAAI,YAAY,SAAA,IAAa,CAAA,CAAE,WAAW,UAAA,CAAW,SAAA,YAAqB,CAAC,CAAA;AAAA,QAC7E,CAAA;AAAA,QACA,MAAA,EAAQ,CAAC,CAAA,KAAM,SAAA,CAAU,EAAE,aAAA,CAAc,KAAA,CAAM,MAAM;AAAA;AAAA,KACvD,EACF,CAAA;AAAA,IACC,SAAA,IAAa,SAAA,CAAU,MAAA,mBACtB,IAAA,CAAC,iBAAe,GAAG,MAAA,EAAQ,EAAA,EAAG,QAAA,EAAS,IAAA,EAAM,CAAA,CAAE,UAAU,CAAA,EAAG,OAAO,CAAA,CAAE,QAAA,EAAU,YAAA,EAAa,gBAAA,EAAiB,YAAA,EAAc,QAAA,EAAU,QAAA,IAAY,EAAA,EAAI,OAAO,MAAA,CAAO,CAAA,CAAE,UAAU,CAAC,KAAK,IAAA,EAAM,UAAA,EAAY,KAAA,CAAM,EAAA,EAAI,MAAM,CAAA,EACrN,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,YAAO,KAAA,EAAM,EAAA,EAAG,QAAA,EAAQ,IAAA,EACtB,YAAE,mBAAA,EACL,CAAA;AAAA,MACC,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,yBACb,QAAA,EAAA,EAA8B,KAAA,EAAO,CAAA,CAAE,IAAA,EACrC,YAAE,IAAA,EAAA,EADQ,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,IAEzB,CACD;AAAA,KAAA,EACH,CAAA,mBAEA,GAAA,CAAC,aAAA,EAAA,EAAe,GAAG,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,UAAU,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,QAAA,EAAU,YAAA,EAAa,gBAAA,EAAiB,YAAA,EAAc,QAAA,EAAU,QAAA,IAAY,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,UAAU,CAAC,CAAA,IAAK,IAAA,EAAM,UAAA,EAAY,KAAA,CAAM,EAAA,EAAI,MAAM,CAAA,EAAG,CAAA;AAAA,oBAEhN,GAAA,CAAC,aAAA,EAAA,EAAe,GAAG,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,MAAM,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,IAAA,EAAM,YAAA,EAAa,gBAAA,EAAiB,YAAA,EAAc,QAAA,EAAU,IAAA,IAAQ,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,MAAM,CAAC,CAAA,IAAK,IAAA,EAAM,UAAA,EAAY,KAAA,CAAM,EAAA,EAAI,MAAM,CAAA,EAAG,CAAA;AAAA,IAC7L,oBAAoB,aAAA,mBACnB,IAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACE,GAAG,MAAA;AAAA,QACJ,EAAA,EAAG,QAAA;AAAA,QACH,IAAA,EAAM,EAAE,cAAc,CAAA;AAAA,QACtB,OAAO,CAAA,CAAE,YAAA;AAAA,QACT,YAAA,EAAa,gBAAA;AAAA,QACb,UAAU,gBAAA,KAAqB,UAAA;AAAA,QAC/B,YAAA,EAAc,SAAS,QAAA,CAAS,QAAA,EAAU,gBAAgB,EAAE,CAAA,GAAK,QAAA,EAAU,YAAA,IAAgB,EAAA,GAAM,EAAA;AAAA,QACjG,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,cAAc,CAAC,CAAA,IAAK,IAAA;AAAA,QACpC,UAAA,EAAY,KAAA,CAAM,EAAA,EAAI,MAAM,CAAA;AAAA,QAE5B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAO,KAAA,EAAM,EAAA,EAAG,UAAU,gBAAA,KAAqB,UAAA,EAC7C,YAAE,uBAAA,EACL,CAAA;AAAA,UACC,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,qBACb,GAAA,CAAC,YAAe,KAAA,EAAO,CAAA,EACpB,QAAA,EAAA,CAAA,EAAA,EADU,CAEb,CACD;AAAA;AAAA;AAAA,QAED,gBAAA,mBACF,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACE,GAAG,MAAA;AAAA,QACJ,IAAA,EAAM,EAAE,cAAc,CAAA;AAAA,QACtB,OAAO,CAAA,CAAE,YAAA;AAAA,QACT,YAAA,EAAa,gBAAA;AAAA,QACb,UAAU,gBAAA,KAAqB,UAAA;AAAA,QAC/B,YAAA,EAAc,UAAU,YAAA,IAAgB,EAAA;AAAA,QACxC,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,cAAc,CAAC,CAAA,IAAK,IAAA;AAAA,QACpC,UAAA,EAAY,KAAA,CAAM,EAAA,EAAI,MAAM,CAAA;AAAA,QAC3B,GAAI,SAAS,MAAA,IAAU,CAAC,gBAAgB,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI;AAAC;AAAA,KAC/D,GACE,IAAA;AAAA,IACH,SAAS,MAAA,IAAU,CAAC,gCACnB,GAAA,CAAC,UAAA,EAAA,EAAS,IAAI,MAAA,EACX,QAAA,EAAA,QAAA,CAAS,IAAI,CAAC,CAAA,yBACZ,QAAA,EAAA,EAAe,KAAA,EAAO,KAAV,CAAa,CAC3B,GACH,CAAA,GACE,IAAA;AAAA,wBAEH,GAAA,EAAA,EAAE,IAAA,EAAK,QAAA,EAAS,WAAA,EAAU,UAAS,oBAAA,EAAkB,IAAA,EAAC,KAAA,EAAO,MAAA,GAAS,SAAY,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,GAAG,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,QAAA,EAAU,MAAM,eAAA,EAAiB,UAAA,EAAY,QAAA,EAAS,EAAG,WAAW,MAAA,GAAS,IAAA,CAAK,EAAA,CAAG,IAAA,EAAM,GAAG,IAAI,CAAA,GAAI,QAC7O,QAAA,EAAA,MAAA,GAAS,CAAA,CAAE,eAAe,EAAA,EAC7B,CAAA;AAAA,oBACA,GAAA,CAAC,aAAA,EAAA,EAAe,GAAG,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,UAAU,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,QAAA,EAAU,YAAA,EAAa,iBAAgB,YAAA,EAAc,QAAA,EAAU,QAAA,IAAY,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,UAAU,CAAC,CAAA,IAAK,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,YAAA,EAAc,UAAA,EAAY,KAAA,CAAM,EAAA,EAAI,MAAM,CAAA,EAAG,CAAA;AAAA,oBACnO,GAAA,CAAC,aAAA,EAAA,EAAe,GAAG,MAAA,EAAQ,IAAA,EAAM,CAAA,CAAE,UAAU,CAAA,EAAG,KAAA,EAAO,CAAA,CAAE,QAAA,EAAU,YAAA,EAAa,iBAAgB,QAAA,EAAQ,IAAA,EAAC,YAAA,EAAc,QAAA,EAAU,QAAA,IAAY,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,UAAU,CAAC,CAAA,IAAK,IAAA,EAAM,UAAA,EAAY,KAAA,CAAM,EAAA,EAAI,MAAM,CAAA,EAAG,CAAA;AAAA,IACrN,aAAA,mBACC,GAAA,CAAC,aAAA,EAAA,EAAe,GAAG,QAAQ,IAAA,EAAM,CAAA,CAAE,WAAW,CAAA,EAAG,OAAO,CAAA,CAAE,SAAA,EAAW,QAAA,EAAQ,IAAA,EAAC,cAAc,QAAA,EAAU,SAAA,IAAa,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA,CAAE,WAAW,CAAC,CAAA,IAAK,MAAM,IAAA,EAAM,CAAA,CAAE,aAAA,EAAe,UAAA,EAAY,MAAM,EAAA,EAAI,MAAM,CAAA,EAAG,SAAA,EAAW,KAAK,CAAA,GAClO,IAAA;AAAA,wBACH,OAAA,EAAA,EAAM,IAAA,EAAK,UAAS,IAAA,EAAK,cAAA,EAAe,OAAO,WAAA,EAAa,CAAA;AAAA,IAC5D;AAAA,GAAA,EACH,CAAA;AAEJ;ACpYA,IAAME,GAAAA,GAA2B;AAAA,EAC/B,KAAA,EAAO,WAAA;AAAA,EACP,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU,WAAA;AAAA,EACV,QAAA,EAAU,UAAA;AAAA,EACV,eAAA,EAAiB,sBAAA;AAAA,EACjB,QAAA,EAAU,oBAAA;AAAA,EACV,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,WAAA;AAAA,EACP,aAAA,EAAe,+BAAA;AAAA,EACf,KAAA,EAAO,OAAA;AAAA,EACP,QAAA,EAAU,eAAA;AAAA,EACV,IAAA,EAAM,wBAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEA,IAAMC,GAAAA,GAA2B;AAAA,EAC/B,KAAA,EAAO,YAAA;AAAA,EACP,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU,UAAA;AAAA,EACV,eAAA,EAAiB,wBAAA;AAAA,EACjB,QAAA,EAAU,gBAAA;AAAA,EACV,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,aAAA,EAAe,4BAAA;AAAA,EACf,KAAA,EAAO,OAAA;AAAA,EACP,QAAA,EAAU,eAAA;AAAA,EACV,IAAA,EAAM,oBAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEO,SAAS,oBAAA,CAAqB,QAAwB,SAAA,EAAwE;AACnI,EAAA,MAAM,IAAA,GAAA,CAAQ,UAAU,OAAA,EAAS,WAAA,GAAc,UAAA,CAAW,IAAI,IAAIA,GAAAA,GAAKD,GAAAA;AACvE,EAAA,OAAO,YAAY,EAAE,GAAG,IAAA,EAAM,GAAG,WAAU,GAAI,IAAA;AACjD;AA0BA,IAAM,MAAA,GAAS,CAAC,CAAA,KAAgC,CAAC,CAAC,CAAA,IAAK,MAAA,CAAO,CAAA,CAAE,MAAM,CAAA,KAAM,CAAA;AAC5E,IAAM,QAAA,GAAW,CAAC,CAAA,KAA4C,CAAC,CAAC,CAAA,IAAK,MAAA,CAAO,CAAA,CAAE,MAAM,CAAA,GAAI,CAAA;AAGjF,SAAS,aAAa,KAAA,EAA0B;AACrD,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,QAAA,GAAW,OAAO,eAAA,EAAiB,YAAA,EAAc,KAAA,EAAO,YAAA,GAAe,GAAG,UAAA,EAAY,EAAA,GAAK,EAAC,EAAG,UAAS,GAAI,KAAA;AACjI,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,KAAA,CAAM,MAAM,CAAA;AAC7C,EAAA,MAAM,CAAA,GAAI,oBAAA,CAAqB,MAAA,EAAQ,KAAA,CAAM,QAAQ,CAAA;AACrD,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAc,YAAA,GAAe,aAAa,CAAC,CAAA,GAAI,WAAA,CAAY,CAAA,EAAG,MAAM,CAAA;AACnF,EAAA,MAAM,CAAA,GAAI,YAAA,KAAiB,CAAA,GAAI,IAAA,GAAO,IAAA;AACtC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,EAAW,MAAA,CAAO,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,MAAM,CAAC,CAAA,IAAK,EAAC;AACxE,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,IAAA,EAAM,mBAAe,IAAA,EACrC,QAAA,EAAA;AAAA,IAAA,KAAA,KAAU,KAAA,GAAQ,IAAA,mBACjBC,GAAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAW,EAAA,CAAG,KAAA,EAAO,uBAAA,EAAqB,IAAA,EAC1C,QAAA,EAAA,KAAA,IAAS,CAAA,CAAE,KAAA,EACd,CAAA;AAAA,oBAEFA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,EAAA,CAAG,KAAA,EAAO,uBAAA,EAAqB,IAAA,EAC3C,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AAChB,MAAA,MAAM,OAAA,GAAU,CAAA,CAAE,WAAA,CAAY,KAAA,IAAS,CAAC,qBAAA,CAAsB,IAAA,CAAK,CAAA,CAAE,WAAA,CAAY,KAAK,CAAA,GAAI,CAAA,CAAE,YAAY,KAAA,GAAQ,IAAA;AAChH,MAAA,uBACED,IAAAA,CAAC,IAAA,EAAA,EAAc,WAAW,EAAA,CAAG,IAAA,EAAM,wBAAoB,IAAA,EACpD,QAAA,EAAA;AAAA,QAAA,eAAA,mBACCA,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,EAAA,CAAG,KAAA,EAAO,yBAAqB,IAAA,EAC7C,QAAA,EAAA;AAAA,UAAA,eAAA,CAAgB,CAAC,CAAA;AAAA,UACjB,CAAA,CAAE,QAAA,GAAW,CAAA,mBACZC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,GAAA,EAAK,uBAAmB,IAAA,EAAC,aAAA,EAAY,MAAA,EACtD,QAAA,EAAA,CAAA,CAAE,UACL,CAAA,GACE;AAAA,SAAA,EACN,CAAA,GACE,IAAA;AAAA,wBACJD,IAAAA,CAAC,MAAA,EAAA,EAAK,2BAAA,EAAyB,IAAA,EAC7B,QAAA,EAAA;AAAA,0BAAAA,KAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,SAAA,EAAW,8BAA0B,IAAA,EACtD,QAAA,EAAA;AAAA,YAAA,CAAC,mBAAmB,CAAA,CAAE,QAAA,GAAW,IAAI,CAAA,EAAG,CAAA,CAAE,QAAQ,CAAA,MAAA,CAAA,GAAQ,IAAA;AAAA,YAC1D,CAAA,CAAE,YAAY,OAAA,CAAQ;AAAA,WAAA,EACzB,CAAA;AAAA,UACC,OAAA,mBACCC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,GAAG,OAAA,EAAS,yBAAA,EAAuB,IAAA,EACjD,QAAA,EAAA,OAAA,EACH,CAAA,GACE,IAAA;AAAA,UACH,eAAA,IAAmB,CAAA,CAAE,QAAA,GAAW,CAAA,mBAC/BA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,GAAG,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM,eAAA,EAAiB,UAAA,EAAY,QAAA,IAAa,QAAA,EAAA,CAAA,CAAE,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAC,GAAE,CAAA,GAC1K;AAAA,SAAA,EACN,CAAA;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,SAAA,EAAW,4BAAA,EAA0B,IAAA,EACtD,QAAA,EAAA,KAAA,CAAM,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA,EACrB;AAAA,OAAA,EAAA,EA3BO,EAAE,EA4BX,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,IACC,QAAA;AAAA,oBACDD,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,EAAA,CAAG,QAAQ,wBAAA,EAAsB,IAAA,EAAC,WAAA,EAAW,QAAA,IAAY,MAAA,EACtE,QAAA,EAAA;AAAA,sBAAAA,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,GAAA,EAAK,uBAAoB,UAAA,EAC1C,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,CAAA,CAAE,QAAA,EAAS,CAAA;AAAA,wBAChBA,GAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,EAAE;AAAA,OAAA,EAC5B,CAAA;AAAA,MACC,SAAA,CAAU,MAAA,GACP,SAAA,CAAU,GAAA,CAAI,CAAC,sBACbD,IAAAA,CAAC,KAAA,EAAA,EAAe,SAAA,EAAW,EAAA,CAAG,GAAA,GAAM,GAAG,EAAA,CAAG,GAAG,CAAA,CAAA,EAAI,EAAA,CAAG,QAAA,IAAY,EAAE,CAAA,CAAA,CAAG,IAAA,EAAK,GAAI,EAAA,CAAG,QAAA,EAAU,qBAAA,EAAoB,UAAA,EAC7G,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,CAAA,CAAE,IAAA,GAAO,GAAG,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,CAAA,CAAA,GAAM,CAAA,CAAE,KAAA,IAAS,EAAE,QAAA,EAAS,CAAA;AAAA,wBAClED,KAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,UAAE,KAAA,CAAM,EAAE,MAAM;AAAA,SAAA,EAAE;AAAA,OAAA,EAAA,EAFd,CAAA,CAAE,EAGZ,CACD,CAAA,GACD,QAAA,CAAS,IAAA,CAAK,QAAQ,CAAA,mBACpBA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,GAAA,GAAM,CAAA,EAAG,EAAA,CAAG,GAAG,CAAA,CAAA,EAAI,EAAA,CAAG,QAAA,IAAY,EAAE,CAAA,CAAA,CAAG,IAAA,EAAK,GAAI,EAAA,CAAG,QAAA,EAAU,qBAAA,EAAoB,UAAA,EAClG,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,CAAA,CAAE,QAAA,EAAS,CAAA;AAAA,wBAChBD,KAAC,IAAA,EAAA,EAAG,QAAA,EAAA;AAAA,UAAA,QAAA;AAAA,UAAE,KAAA,CAAM,KAAK,QAAQ;AAAA,SAAA,EAAE;AAAA,OAAA,EAC7B,CAAA,GACE,IAAA;AAAA,sBACRA,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,GAAA,EAAK,uBAAoB,UAAA,EAC1C,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,CAAA,CAAE,QAAA,EAAS,CAAA;AAAA,wBAChBA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,YAAY,CAAC,IAAA,CAAK,QAAA,GAAW,EAAA,CAAG,QAAQ,MAAA,EACpD,QAAA,EAAA,QAAA,GAAW,CAAA,CAAE,QAAA,GAAW,CAAC,IAAA,CAAK,QAAA,GAAW,CAAA,CAAE,eAAA,GAAkB,OAAO,IAAA,CAAK,QAAQ,CAAA,mBAAIA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,IAAA,EAAO,YAAE,IAAA,EAAK,CAAA,GAAU,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,EACvJ;AAAA,OAAA,EACF,CAAA;AAAA,MACC,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,IAAK,CAAC,IAAA,CAAK,YAAA,mBAC3BD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,GAAA,EAAK,uBAAoB,KAAA,EAC1C,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,CAAA,CAAE,KAAA,EAAM,CAAA;AAAA,wBACbA,GAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,EAAE;AAAA,OAAA,EACvB,CAAA,GACE,IAAA;AAAA,sBACJD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,EAAA,CAAG,KAAA,EAAO,uBAAoB,OAAA,EAC5C,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,CAAA,CAAE,KAAA,EAAM,CAAA;AAAA,wBACbA,GAAAA,CAAC,IAAA,EAAA,EAAG,WAAA,EAAU,QAAA,EAAS,eAAA,EAAe,QAAA,IAAY,MAAA,EAC/C,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,EACnB;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IACC,SAAS,IAAA,CAAK,GAAG,KAAK,IAAA,CAAK,YAAA,mBAC1BA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,EAAA,CAAG,MAAM,0BAAA,EAAwB,IAAA,EAC5C,YAAE,aAAA,CAAc,KAAA,CAAM,UAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,IAAA,EAAM,MAAO,CAAA,KAAM,CAAA,GAAI,CAAC,IAAI,CAAA,GAAI,iBAACA,GAAAA,CAAC,UAAc,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,GAAI,CAAA,EAAA,EAAnB,CAAqB,GAAS,IAAI,CAAE,GAC9H,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAsBO,SAAS,uBAAuB,EAAE,KAAA,EAAO,QAAA,EAAU,YAAA,EAAc,QAAQ,GAAA,EAAK,QAAA,EAAU,WAAA,GAAc,KAAA,EAAO,WAAW,UAAA,EAAY,EAAA,GAAK,EAAC,EAAG,UAAS,EAAgC;AAC3L,EAAA,MAAM,MAAA,GAAS,kBAAkB,GAAG,CAAA;AACpC,EAAA,MAAM,CAAA,GAAI,oBAAA,CAAqB,MAAA,EAAQ,QAAQ,CAAA;AAC/C,EAAA,uBACED,IAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAsB,4BAAA,EAA0B,IAAA,EAAE,GAAI,WAAA,GAAc,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,EAAC,EAC7F,QAAA,EAAA;AAAA,oBAAAA,KAAC,SAAA,EAAA,EAAQ,SAAA,EAAW,EAAA,CAAG,OAAA,EAAS,0BAAsB,IAAA,EACpD,QAAA,EAAA;AAAA,sBAAAA,KAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,KAAA,EAAO,gCAA4B,IAAA,EACrD,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,sBAAA,EAAoB,IAAA,EAAE,YAAE,IAAA,EAAK,CAAA;AAAA,wBACnCA,GAAAA,CAAC,MAAA,EAAA,EAAK,sBAAA,EAAoB,IAAA,EAAE,YAAE,IAAA,EAAK;AAAA,OAAA,EACrC,CAAA;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,EAAA,CAAG,KAAA,EAAO,gCAA4B,IAAA,EAAC,eAAA,EAAe,QAAA,IAAY,MAAA,EAChF,yBAAe,YAAA,CAAa,KAAK,IAAI,WAAA,CAAY,KAAA,EAAO,MAAM,CAAA,EACjE;AAAA,KAAA,EACF,CAAA;AAAA,oBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAW,GAAG,KAAA,EAAO,uBAAA,EAAqB,MAC5C,QAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;;;AC5LA,IAAM,MAAA,GAAS,CAAC,CAAA,KAAoB;AAClC,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAC9B,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,IAAA;AAClC,CAAA;AACA,IAAM,SAAS,CAAC,CAAA,KAAoB,CAAA,CAAE,YAAA,IAAgB,EAAE,YAAA,IAAgB,IAAA;AACxE,IAAM,OAAO,CAAC,CAAA,KAAA,CAAkC,KAAK,EAAA,EAAI,IAAA,GAAO,WAAA,EAAY;AAC5E,IAAM,UAAA,GAAa,CAAC,CAAA,KAAqB,CAAA,CAAE,UAAU,QAAA,CAAS,CAAA,CAAE,OAAO,CAAA,GAAI,CAAA,CAAE,QAAA,GAAW,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA,GAAI,EAAA;AAGxG,SAAS,YAAoC,KAAA,EAA0B;AAC5E,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAe;AAChC,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAS,CAAA,EAAG,UAAA,CAAW,CAAC,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,CAAA,CAAE,YAAY,CAAA,IAAK,KAAK,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,CAAC,KAAK,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,IAAA,CAAK,aAAa,CAAA,CAAA;AAC5H,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AACvB,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,IAAI,CAAC,IAAA,IAAS,CAAA,KAAM,IAAA,KAAS,OAAO,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,GAAI,OAAO,IAAI,CAAA,CAAA,EAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EAC1F;AACA,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA;AAClC,EAAA,OAAO,MAAM,MAAA,CAAO,CAAC,MAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AACxC;AAWO,SAAS,cAAA,CAAuC,KAAA,EAAqB,OAAA,GAAiC,EAAC,EAAwB;AACpI,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,SAAS,CAAC,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAAA,KAAW,KAAA,GAAQ,CAAC,GAAG,KAAK,CAAA,GAAI,WAAA,CAAY,KAAK,CAAA;AACvE,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,aAAA,IAAiB,KAAA,GAAQ,CAAA;AACvD,EAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,aAAa,CAAC,CAAA,CAAE,IAAA,IAAQ,CAAA;AAC7E,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,EAAM,CAAA,KAAA,CAAU,MAAA,CAAO,CAAC,CAAA,IAAK,QAAA,KAAa,MAAA,CAAO,CAAC,CAAA,IAAK,QAAA,CAAA;AACvE,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,EAAM,CAAA,KAAA,CAAU,MAAA,CAAO,CAAC,CAAA,IAAK,QAAA,KAAa,MAAA,CAAO,CAAC,CAAA,IAAK,QAAA,CAAA;AACvE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAkB;AACnC,EAAA,MAAM,MAAM,CAAC,CAAA,EAAM,CAAA,KAAe,IAAA,CAAK,IAAI,CAAA,EAAG,CAAC,GAAI,IAAA,CAAK,IAAI,CAAC,CAAA,IAAK,EAAC,EAAI,CAAC,CAAC,CAAA;AAEzE,EAAA,MAAM,QAAA,GAAW,gBAAgB,KAAA,CAAM,MAAA,GAAS,IAAI,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,MAAA;AACjH,EAAA,IAAI,YAAY,MAAA,CAAO,QAAQ,MAAM,IAAA,EAAM,GAAA,CAAI,UAAU,UAAU,CAAA;AACnE,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,GAAS,CAAA,GAAI,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,MAAA,CAAO,GAAG,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,MAAA;AAChG,EAAA,IAAI,WAAW,MAAA,CAAO,OAAO,MAAM,IAAA,KAAS,CAAC,YAAY,OAAA,KAAY,QAAA,IAAA,CAAa,MAAA,CAAO,QAAQ,KAAK,QAAA,IAAY,MAAA,CAAO,OAAO,CAAA,CAAA,EAAK,GAAA,CAAI,SAAS,SAAS,CAAA;AAE3J,EAAA,MAAM,SAAc,EAAC;AACrB,EAAA,KAAA,MAAW,KAAK,CAAC,QAAA,EAAU,OAAO,CAAA,EAAG,IAAI,KAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG,MAAA,CAAO,KAAK,CAAC,CAAA;AAE/F,EAAA,IAAI,KAAA,CAAM,SAAS,aAAA,EAAe;AAEhC,IAAA,MAAM,IAAA,GAAO,CAAC,MAAA,EAAa,GAAA,KAAiC;AAC1D,MAAA,MAAM,GAAA,uBAAU,GAAA,EAAe;AAC/B,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,IAAI,IAAA;AACJ,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACvB,QAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,QAAA,IAAI,CAAA,KAAM,MAAM,GAAA,GAAM,CAAA;AACtB,QAAA,IAAA,GAAO,CAAA;AACP,QAAA,GAAA,CAAI,IAAI,CAAA,EAAG,CAAA,KAAM,IAAA,GAAO,MAAA,CAAO,SAAS,GAAG,CAAA;AAAA,MAC7C,CAAC,CAAA;AACD,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AACA,IAAA,MAAM,SAAA,GAAY,KAAK,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,EAAG,MAAM,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,KAAK,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,EAAG,MAAM,CAAA;AACrD,IAAA,MAAM,IAAA,GAAO,KAAA,CACV,MAAA,CAAO,CAAC,MAAM,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAC,CAAA,CACjC,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,GAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,IAAM,UAAU,GAAA,CAAI,CAAC,CAAA,GAAK,QAAA,CAAS,IAAI,CAAC,CAAA,CAAA,IAAO,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA;AAC/G,IAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,IAAI,MAAA,CAAO,UAAU,KAAA,EAAO;AAC5B,MAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AACb,MAAA,IAAI,KAAA,EAAO,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA;AAC9B,MAAA,KAAA,GAAQ,KAAA;AAAA,IACV;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,MAAW,CAAA,IAAK,KAAA,EAAO,IAAI,CAAC,MAAA,CAAO,SAAS,CAAC,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAAA,EAC/D;AAEA,EAAA,MAAM,cAAc,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,IAAI,CAAC,IAAA,MAAU,EAAE,IAAA,EAAM,MAAM,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,IAAK,IAAG,CAAE,CAAA;AAC5F,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA0B;AAC7C,EAAA,KAAA,MAAW,KAAK,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,EAAG;AACvC,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG;AACxB,IAAA,MAAM,GAAA,GAAM,WAAW,CAAC,CAAA;AACxB,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,GAAG,KAAK,EAAE,GAAA,EAAK,OAAA,EAAS,CAAA,CAAE,WAAW,CAAA,CAAE,QAAA,IAAY,IAAA,EAAM,KAAA,EAAO,EAAC,EAAE;AACxF,IAAA,CAAA,CAAE,KAAA,CAAM,KAAK,CAAC,CAAA;AACd,IAAA,MAAA,CAAO,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EACnB;AACA,EAAA,MAAM,IAAA,GAAO,CAAC,GAAG,MAAA,CAAO,QAAQ,CAAA;AAChC,EAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,KAAK,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA,EAAE;AACtF;AAgBO,SAAS,SAAA,CAAkC,KAAA,EAAqB,OAAA,GAA4B,EAAC,EAAyB;AAC3H,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,CAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAAA,KAAW,KAAA,GAAQ,CAAC,GAAG,KAAK,CAAA,GAAI,WAAA,CAAY,KAAK,CAAA;AACvE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAkB;AACnC,EAAA,KAAA,MAAW,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA,EAAE,IAAK,eAAe,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA,CAAE,aAAa,IAAA,CAAK,GAAA,CAAI,MAAM,CAAC,CAAA;AAC7G,EAAA,MAAM,IAAA,GAAO,CAAC,GAAG,KAAK,CAAA;AACtB,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,OAAA,CAAQ,MAAM,CAAA,GAAI,MAAA;AAC3E,EAAA,IAAI,IAAA,IAAQ,CAAC,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG,IAAA,CAAK,KAAK,IAAI,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,EAAM,CAAA,KAAA,CAAU,MAAA,CAAO,CAAC,CAAA,IAAK,QAAA,KAAa,MAAA,CAAO,CAAC,CAAA,IAAK,QAAA,CAAA;AAEvE,EAAA,OAAO,KAAK,IAAA,CAAK,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,IAAA,EAAM,IAAA,EAAM,KAAK,GAAA,CAAI,IAAI,CAAA,IAAK,IAAG,CAAE,CAAA;AAC/E;;;ACtHA,IAAMH,GAAAA,GAAuB;AAAA,EAC3B,MAAA,EAAQ,4BAAA;AAAA,EACR,OAAA,EAAS,iCAAA;AAAA,EACT,QAAA,EAAU,2CAAA;AAAA,EACV,OAAA,EAAS,6CAAA;AAAA,EACT,OAAA,EAAS,4CAAA;AAAA,EACT,QAAA,EAAU,qBAAA;AAAA,EACV,OAAA,EAAS,kBAAA;AAAA,EACT,IAAA,EAAM,QAAA;AAAA,EACN,WAAA,EAAa,mBAAA;AAAA,EACb,UAAA,EAAY,gDAAA;AAAA,EACZ,aAAA,EAAe,4DAAA;AAAA,EACf,UAAA,EAAY,+CAAA;AAAA,EACZ,SAAA,EAAW,iDAAA;AAAA,EACX,OAAA,EAAS,sFAAA;AAAA,EACT,OAAA,EAAS,qCAAA;AAAA,EACT,QAAA,EAAU,kGAAA;AAAA,EACV,SAAA,EAAW,aAAA;AAAA,EACX,WAAA,EAAa,2BAAA;AAAA,EACb,aAAA,EAAe,gBAAA;AAAA,EACf,KAAA,EAAO,gEAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAEA,IAAMC,GAAAA,GAAuB;AAAA,EAC3B,MAAA,EAAQ,2BAAA;AAAA,EACR,OAAA,EAAS,8BAAA;AAAA,EACT,QAAA,EAAU,yCAAA;AAAA,EACV,OAAA,EAAS,sCAAA;AAAA,EACT,OAAA,EAAS,iCAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,WAAA,EAAa,mBAAA;AAAA,EACb,UAAA,EAAY,qCAAA;AAAA,EACZ,aAAA,EAAe,iDAAA;AAAA,EACf,UAAA,EAAY,qCAAA;AAAA,EACZ,SAAA,EAAW,uCAAA;AAAA,EACX,OAAA,EAAS,uEAAA;AAAA,EACT,OAAA,EAAS,oCAAA;AAAA,EACT,QAAA,EAAU,mFAAA;AAAA,EACV,SAAA,EAAW,aAAA;AAAA,EACX,WAAA,EAAa,yBAAA;AAAA,EACb,aAAA,EAAe,eAAA;AAAA,EACf,KAAA,EAAO,6CAAA;AAAA,EACP,KAAA,EAAO;AACT,CAAA;AAGO,SAAS,gBAAA,CAAiB,QAAwB,SAAA,EAAgE;AACvH,EAAA,MAAM,IAAA,GAAA,CAAQ,UAAU,OAAA,EAAS,WAAA,GAAc,UAAA,CAAW,IAAI,IAAIA,GAAAA,GAAKD,GAAAA;AACvE,EAAA,OAAO,YAAY,EAAE,GAAG,IAAA,EAAM,GAAG,WAAU,GAAI,IAAA;AACjD;AAGA,IAAM,OAAO,CAAC,GAAA,EAAa,SAA0C,GAAA,CAAI,OAAA,CAAQ,cAAc,CAAC,CAAA,EAAG,MAAc,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA,CAAE,OAAA,CAAQ,SAAS,GAAG,CAAA;AAGrJ,SAAS,YAAY,IAAA,EAAoD;AAC9E,EAAA,OAAO,SAAA,CAAU,KAAK,OAAO,CAAA;AAC/B;AAMO,SAAS,YAAY,IAAA,EAAuD;AACjF,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK;AAC9B,EAAA,MAAM,OAAA,GAAU,YAAY,IAAI,CAAA;AAChC,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,EAAA,KAAA,MAAW,UAAU,CAAC,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA,EAAG;AAClD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,IAAI,MAAM,WAAA,EAAY,CAAE,WAAW,MAAA,CAAO,WAAA,EAAa,CAAA,EAAG;AACxD,MAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,CAAE,OAAA,CAAQ,cAAc,EAAE,CAAA;AAChE,MAAA,IAAI,MAAM,OAAO,IAAA;AAAA,IACnB;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,OAAA,CACd,IAAA,EACA,QAAA,GAA6BA,GAAAA,EACd;AACf,EAAA,MAAM,EAAE,YAAA,EAAc,GAAA,EAAK,YAAA,EAAc,KAAI,GAAI,IAAA;AACjD,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,OAAO,QAAQ,QAAA,EAAU;AACtD,IAAA,IAAI,GAAA,KAAQ,GAAA,EAAK,OAAO,GAAA,KAAQ,CAAA,GAAI,QAAA,CAAS,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,EAAE,CAAA,EAAG,KAAK,CAAA;AACvF,IAAA,OAAO,KAAK,QAAA,CAAS,QAAA,EAAU,EAAE,GAAA,EAAK,KAAK,CAAA;AAAA,EAC7C;AACA,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,GAAA,KAAQ,CAAA,GAAI,QAAA,CAAS,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,EAAE,KAAK,CAAA;AAChG,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,GAAA,KAAQ,CAAA,GAAI,QAAA,CAAS,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,EAAE,KAAK,CAAA;AAChG,EAAA,OAAO,KAAK,GAAA,IAAO,IAAA;AACrB;AAIA,IAAMI,OAAAA,GAAS,CAAC,CAAA,KAAoB;AAClC,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAC9B,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,IAAA;AAClC,CAAA;AACA,IAAMC,UAAS,CAAC,CAAA,KAAoB,CAAA,CAAE,YAAA,IAAgB,EAAE,YAAA,IAAgB,IAAA;AAMjE,SAAS,WAAW,KAAA,EAA0D;AACnF,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAyB;AACzC,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,GAAA;AAC7B,EAAA,MAAM,MAAM,CAAC,EAAA,EAAY,CAAA,KAAiB,GAAA,CAAI,IAAI,EAAA,EAAI,CAAC,GAAI,GAAA,CAAI,IAAI,EAAE,CAAA,IAAK,EAAC,EAAI,CAAC,CAAC,CAAA;AACjF,EAAA,MAAM,MAAA,GAAS,CAAC,MAAA,KAA2C;AACzD,IAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,CAAO,CAAC,MAA6B,CAAA,CAAE,CAAC,MAAM,IAAI,CAAA;AACvE,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,CAAC,MAAM,GAAG,CAAA;AAChD,IAAA,OAAO,QAAQ,MAAA,KAAW,CAAA,GAAI,QAAQ,CAAC,CAAA,CAAG,CAAC,CAAA,GAAI,IAAA;AAAA,EACjD,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,aAAa,CAAC,CAAA;AACjE,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAID,OAAAA,CAAO,CAAC,CAAC,CAAC,CAAC,CAAA;AACrD,IAAA,IAAI,EAAA,EAAI,GAAA,CAAI,EAAA,EAAI,UAAU,CAAA;AAAA,EAC5B;AACA,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAIC,OAAAA,CAAO,CAAC,CAAC,CAAC,CAAC,CAAA;AACvD,EAAA,IAAI,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,SAAS,CAAA;AAC7B,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,cAAc,KAAA,EAAiE;AAC7F,EAAA,IAAI,IAAA,GAAoB,IAAA;AACxB,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAC,EAAE,UAAA,EAAY;AACnB,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,CAAA,CAAE,UAAU,CAAA;AAC/B,IAAA,IAAI,MAAA,CAAO,KAAA,CAAM,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG;AAC/B,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,SAAA,CACd,QAAA,EACA,IAAA,GAA8G,EAAC,EAC7F;AAClB,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,oBAAO,IAAI,IAAA,EAAK;AACjC,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,EAAQ,GAAI,IAAI,OAAA,EAAQ;AAC9C,EAAA,IAAI,IAAA,IAAQ,GAAG,OAAO,IAAA;AACtB,EAAA,MAAM,CAAA,GAAI,KAAK,QAAA,IAAYL,GAAAA;AAC3B,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,OAAA;AAC9B,EAAA,MAAM,EAAA,GAAK,KAAK,QAAA,GAAW,EAAE,UAAU,IAAA,CAAK,QAAA,KAAa,EAAC;AAC1D,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,cAAA,CAAe,QAAQ,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,WAAW,GAAG,EAAA,EAAI,CAAA,CAAE,OAAO,QAAQ,CAAA;AAC3G,EAAA,IAAI,SAAS,IAAA,CAAK,WAAA,IAAe,EAAA,IAAM,GAAA,SAAe,EAAE,IAAA,EAAM,IAAA,CAAK,CAAA,CAAE,WAAW,EAAE,IAAA,EAAM,CAAA,EAAG,MAAM,IAAA,EAAK;AACtG,EAAA,MAAM,MAAM,CAAC,CAAA,KAAY,IAAI,IAAA,CAAK,cAAA,CAAe,SAAS,EAAE,IAAA,EAAM,WAAW,KAAA,EAAO,SAAA,EAAW,KAAK,SAAA,EAAW,GAAG,IAAI,CAAA,CAAE,OAAO,CAAC,CAAA;AAChI,EAAA,IAAI,IAAI,QAAQ,CAAA,KAAM,GAAA,CAAI,GAAG,GAAG,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,EAAE,UAAA,EAAY,EAAE,MAAM,CAAA,EAAG,MAAM,KAAA,EAAM;AACzF,EAAA,IAAI,GAAA,CAAI,QAAQ,CAAA,KAAM,GAAA,CAAI,IAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAQ,GAAI,KAAU,CAAC,GAAG,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,CAAA,CAAE,aAAA,EAAe,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAC7H,EAAA,MAAM,OAAO,IAAI,IAAA,CAAK,eAAe,MAAA,EAAQ,EAAE,KAAK,SAAA,EAAW,KAAA,EAAO,SAAS,IAAA,EAAM,SAAA,EAAW,QAAQ,SAAA,EAAW,GAAG,IAAI,CAAA,CAAE,OAAO,QAAQ,CAAA;AAC3I,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,CAAA,CAAE,UAAA,EAAY,EAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAM;AAC3D;AAGA,IAAM,WAAA,mBAAc,IAAI,GAAA,CAAI,CAAC,eAAA,EAAiB,cAAA,EAAgB,cAAA,EAAgB,kBAAA,EAAoB,gBAAA,EAAkB,YAAA,EAAc,cAAc,CAAC,CAAA;AAQ1I,SAAS,cAAc,GAAA,EAAmG;AAC/H,EAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,EAAA,IAAI,IAAI,IAAA,IAAQ,WAAA,CAAY,IAAI,GAAA,CAAI,IAAI,GAAG,OAAO,IAAA;AAClD,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK,OAAO,IAAA;AAC/B,EAAA,OAAO,GAAA,CAAI,MAAA,KAAW,GAAA,KAAQ,GAAA,CAAI,KAAA,KAAU,SAAA,IAAa,GAAA,CAAI,KAAA,KAAU,UAAA,IAAc,GAAA,CAAI,KAAA,KAAU,kBAAA,IAAsB,CAAC,GAAA,CAAI,KAAA,CAAA;AAChI;AAMO,SAAS,SAAA,CAAqF,UAAuF,KAAA,EAA+B;AACzN,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,MAAMM,QAAO,CAAC,CAAA,KAAA,CAAkC,KAAK,EAAA,EAAI,IAAA,GAAO,WAAA,EAAY;AAC5E,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAASA,KAAAA,CAAK,EAAE,OAAO,CAAA,KAAMA,KAAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AACvE,EAAA,IAAI,SAAS,YAAA,EAAc;AACzB,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,CAAC,MAAM,WAAA,CAAY,CAAC,CAAA,IAAKA,KAAAA,CAAK,EAAE,YAAY,CAAA,KAAMA,KAAAA,CAAK,QAAA,CAAS,YAAY,CAAC,CAAA;AACpG,IAAA,IAAI,KAAK,OAAO,GAAA;AAAA,EAClB;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,YAAY,CAAC,CAAA,IAAKA,KAAAA,CAAK,CAAA,CAAE,KAAK,CAAA,KAAMA,KAAAA,CAAK,QAAA,CAAS,KAAK,CAAC,CAAA,IAAK,IAAA;AACxF;ACtIA,IAAM,OAAA,GAAyB,EAAE,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,QAAA,EAAU,QAAA,EAAU,IAAA,EAAM,eAAA,EAAiB,YAAY,QAAA,EAAS;AAE5I,IAAM,cAAc,MAClB,oBAAA;AAAA,EACE,MAAM,MAAM;AAAA,EAAC,CAAA;AAAA,EACb,MAAM,IAAA;AAAA,EACN,MAAM;AACR,CAAA;AAEF,SAAS,WAAA,CAAY,EAAE,IAAA,GAAO,EAAA,EAAG,EAAsB;AACrD,EAAA,uBACEJ,KAAC,KAAA,EAAA,EAAI,OAAA,EAAQ,aAAY,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,GAAG,CAAA,EAAG,QAAQ,IAAA,EAAM,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,OAAA,EAAQ,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAO,EAAG,oBAAA,EAAmB,QAAA,EACrJ,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,KAAA,EAAM,GAAE,KAAA,EAAM,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,EAAA,EAAG,GAAA,EAAI,IAAA,EAAK,kCAAA,EAAmC,QAAO,oDAAA,EAAqD,CAAA;AAAA,oBACxJA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mEAAA,EAAoE,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,kCAAA,EAAmC,WAAA,EAAY,KAAA,EAAM,cAAA,EAAe,OAAA,EAAQ;AAAA,GAAA,EAC7K,CAAA;AAEJ;AAWO,SAAS,gBAAgB,KAAA,EAA6B;AAC3D,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,SAAS,EAAC;AAAA,IACV,IAAA,GAAO,iBAAA;AAAA,IACP,SAAA,GAAY,CAAC,CAAA,KAAM,CAAA,KAAA,EAAQ,EAAE,EAAE,CAAA,CAAA;AAAA,IAC/B,WAAA,GAAc,CAAC,CAAA,KAAM,CAAA,OAAA,EAAU,EAAE,SAAS,CAAA,CAAA;AAAA,IAC1C,KAAA;AAAA,IACA,aAAA;AAAA,IACA,OAAA,GAAU,KAAA;AAAA,IACV,QAAA,GAAW,KAAA;AAAA,IACX,OAAA,GAAU,KAAA;AAAA,IACV,QAAA;AAAA,IACA,KAAA,GAAQ,IAAA;AAAA,IACR,QAAQ,UAAA,GAAa,IAAA;AAAA,IACrB,QAAA,GAAW,IAAA;AAAA,IACX,YAAA;AAAA,IACA,UAAA,EAAY,KAAK,EAAC;AAAA,IAClB,MAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA,GAAS,MAAA;AAAA,IACT,KAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AACJ,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,KAAA,CAAM,MAAM,CAAA;AAC7C,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,MAAM,gBAAA,CAAiB,MAAA,EAAQ,KAAA,CAAM,QAAQ,CAAA,EAAG,CAAC,MAAA,EAAQ,KAAA,CAAM,QAAQ,CAAC,CAAA;AAC1F,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAO,UAAA,GAAa,UAAA,CAAW,KAAK,CAAA,mBAAI,IAAI,GAAA,EAAyB,EAAI,CAAC,KAAA,EAAO,UAAU,CAAC,CAAA;AACnH,EAAA,MAAM,IAAA,GAAO,OAAA;AAAA,IACX,MAAO,MAAA,KAAW,MAAA,GAAS,SAAA,CAAU,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,gBAAA,IAAoB,CAAA,EAAG,MAAA,EAAQ,KAAA,GAAQ,MAAM,IAAA,CAAK,CAAC,CAAA,KAAM,SAAA,CAAU,CAAC,CAAA,KAAM,KAAK,CAAA,EAAG,EAAA,IAAM,IAAA,GAAO,IAAA,EAAM,CAAA,GAAI,IAAA;AAAA;AAAA,IAEpK,CAAC,MAAA,EAAQ,KAAA,EAAO,KAAA,CAAM,kBAAkB,KAAK;AAAA,GAC/C;AACA,EAAA,MAAM,YAAY,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,GAAO,MAAM,CAAC,CAAA;AAChD,EAAA,MAAM,UAAA,GAAa,SAAA,GAAY,SAAA,CAAU,SAAS,CAAA,GAAI,IAAA;AACtD,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,YAAA,KAAiB,MAAA,GAAY,aAAa,KAAA,CAAM,YAAA;AAC3E,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAAkB,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,KAAM,CAAA,mBAAIA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,GAAG,IAAA,EAAM,uBAAA,EAAqB,IAAA,EAAE,QAAA,EAAA,CAAA,CAAE,IAAA,EAAK,CAAA,GAAU,YAAA,GAAe,YAAA,CAAa,KAAK,CAAA,GAAII,WAAAA,CAAY,KAAA,EAAO,MAAM,CAAA;AAC/L,EAAA,MAAM,IAAA,GAAO,MAAM,SAAA,IAAa,QAAA;AAChC,EAAA,MAAM,QAAA,GAAW,IAAA,KAAS,OAAA,GAAU,IAAA,GAAO,cAAc,KAAK,CAAA;AAC9D,EAAA,MAAM,OAAO,QAAA,IAAY,QAAA,GAAW,SAAA,CAAU,QAAA,EAAU,EAAE,MAAA,EAAQ,QAAA,EAAU,CAAA,EAAG,GAAI,WAAW,EAAE,QAAA,KAAa,EAAC,EAAI,CAAA,GAAI,IAAA;AACtH,EAAA,MAAM,YAAY,IAAA,KAAS,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,QAAQ,IAAA,GAAO,IAAA;AAEpE,EAAA,MAAM,OAAA,GAAU,SAAS,YAAA,IAAgB,IAAA;AACzC,EAAA,MAAM,IAAA,GAAO,OAAA;AAAA,IACX,MAAO,MAAA,KAAW,aAAA,GAAgB,cAAA,CAAe,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,gBAAA,IAAoB,CAAA,EAAG,CAAA,GAAI,IAAA;AAAA,IAClG,CAAC,MAAA,EAAQ,KAAA,EAAO,KAAA,CAAM,gBAAgB;AAAA,GACxC;AACA,EAAA,MAAM,SAAS,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,SAAA,CAAU,CAAC,CAAA,KAAM,OAAO,CAAC,CAAA,GAAI,KAAA;AAE7F,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,WAAA,qBACxBJ,GAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACL,IAAA;AAAA,MACA,KAAA,EAAO,CAAA;AAAA,MACP,QAAA;AAAA,MACA,WAAW,EAAA,CAAG,KAAA;AAAA,MACb,GAAwD,EAAC;AAAA,MACzD,GAAI,KAAA,KAAU,MAAA,GAAY,EAAE,OAAA,EAAS,KAAA,KAAU,CAAA,EAAG,QAAA,EAAU,MAAM,aAAA,GAAgB,CAAC,CAAA,EAAE,GAAI,EAAE,cAAA,EAAgB,CAAA,KAAM,YAAA,EAAc,GAAI,aAAA,GAAgB,EAAE,QAAA,EAAU,MAAM,aAAA,CAAc,CAAC,CAAA,EAAE,GAAI,EAAC,EAAG;AAAA,MAC9L,GAAI,MAAA,GAAS,EAAE,aAAA,EAAe,MAAA,KAAW;AAAC;AAAA,GAC7C;AAGF,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAA4B,CAAA,KAAM,UAAA,GAAa,CAAA,CAAE,QAAA,GAAW,CAAA,KAAM,SAAA,GAAY,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,SAAA;AAG7G,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAoB,IAAA,KAAwE;AAC3G,IAAA,MAAM,OAAA,GAAU,YAAY,IAAI,CAAA;AAChC,IAAA,MAAM,OAAA,GAAU,YAAY,IAAI,CAAA;AAChC,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAA;AAC3B,IAAA,uBACED,IAAAA,CAAC,OAAA,EAAA,EAAoB,SAAA,EAAW,GAAG,MAAA,EAAQ,yBAAA,EAAuB,IAAA,EAAC,cAAA,EAAc,OAAA,IAAW,MAAA,EAAW,cAAA,EAAc,IAAA,CAAK,WAAW,MAAA,EAClI,QAAA,EAAA;AAAA,MAAA,KAAA,CAAM,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,MACrB,KAAA,IAAS,CAAC,IAAA,CAAK,OAAA;AAAA;AAAA,wBAEdC,GAAAA,CAAC,MAAA,EAAA,EAAK,uBAAA,EAAqB,IAAA,EAAC,aAAA,EAAY,MAAA,EACtC,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,KAAA,EAAO,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,KAAA,EAAO,IAAA,EAAM,EAAA,EAAK,GAAI,EAAA,CAAG,IAAA,GAAO,EAAE,SAAA,EAAW,EAAA,CAAG,IAAA,EAAK,GAAI,IAAK,CAAA,EACxH;AAAA,UACE,IAAA;AAAA,sBACJD,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,EAAA,CAAG,IAAA,EAAM,yBAAqB,IAAA,EAC7C,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,KAAA,EAAO,wBAAA,EAAsB,IAAA,EAC9C,QAAA,EAAA,OAAA,GACC,IAAA,CAAK,OAAA,mBACHD,IAAAA,CAAAM,UAAA,EAEE,QAAA,EAAA;AAAA,0BAAAN,IAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,OAAA,EAAU,QAAA,EAAA;AAAA,YAAA,OAAA;AAAA,YAAQ;AAAA,WAAA,EAAC,CAAA;AAAA,0BAChCC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,SAAS,0BAAA,EAAwB,IAAA,EAAC,+BAAA,EAA6B,IAAA,EAChF,QAAA,EAAA,OAAA,EACH;AAAA,SAAA,EACF,CAAA,mBAEAD,IAAAA,CAAAM,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAL,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,GAAG,OAAA,EAAS,0BAAA,EAAwB,MAClD,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,UAAQ,GAAA;AAAA,0BACRA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,GAAG,OAAA,EAAS,0BAAA,EAAwB,MAClD,QAAA,EAAA,OAAA,EACH;AAAA,SAAA,EACF,CAAA,mBAGFA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,GAAG,OAAA,EAAS,0BAAA,EAAwB,IAAA,EAClD,QAAA,EAAA,OAAA,EACH,CAAA,EAEJ,CAAA;AAAA,QACC,GAAA,mBACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,GAAG,GAAA,EAAK,sBAAA,EAAoB,IAAA,EAC1C,QAAA,EAAA,GAAA,EACH,CAAA,GACE,IAAA;AAAA,QACH,IAAA,CAAK,IAAA,CAAK,MAAA,mBACTA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,MAAA,EAAQ,yBAAA,EAAuB,IAAA,EAChD,QAAA,EAAA,IAAA,CAAK,KAAK,GAAA,CAAI,CAAC,CAAA,qBACdA,GAAAA,CAAC,MAAA,EAAA,EAAa,SAAA,EAAW,EAAA,CAAG,KAAA,EAAO,wBAAA,EAAwB,CAAA,EACxD,QAAA,EAAA,OAAA,CAAQ,CAAC,CAAA,EAAA,EADD,CAEX,CACD,GACH,CAAA,GACE;AAAA,OAAA,EACN,CAAA;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,KAAA,EAAO,wBAAA,EAAsB,IAAA,EAC9C,QAAA,EAAA,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EACnB;AAAA,KAAA,EAAA,EApDU,KAAK,EAqDjB,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,MAAM,YAAY,KAAA,GAAS,OAAO,UAAU,QAAA,GAAW,KAAA,GAAQ,EAAE,KAAA,GAAS,IAAA;AAE1E,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,IAAA,EAAM,kBAAA,EAAgB,IAAA,EAAC,aAAA,EAAa,MAAA,EAAQ,WAAA,EAAW,OAAA,IAAW,MAAA,EAClF,QAAA,EAAA;AAAA,IAAA,OAAA,IAAW,CAAC,SAAA,mBACXC,GAAAA,CAAC,OAAE,IAAA,EAAK,QAAA,EAAS,SAAA,EAAW,EAAA,CAAG,OAAA,EAAS,0BAAA,EAAwB,IAAA,EAC7D,QAAA,EAAA,CAAA,CAAE,SACL,CAAA,GACE,IAAA;AAAA,IACH,QAAA,mBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAK,QAAA,EAAS,SAAA,EAAW,EAAA,CAAG,OAAA,EAAS,2BAAA,EAAyB,IAAA,EAC9D,QAAA,EAAA,CAAA,CAAE,UACL,CAAA,GACE,IAAA;AAAA,IACH,OAAA,mBACCA,GAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,OAAA,EAAS,IAAA,EAAK,QAAA,EAAS,0BAAA,EAAwB,IAAA,EACzD,QAAA,EAAA,CAAA,CAAE,OAAA,EACL,CAAA,GACE,IAAA;AAAA,IACH,SAAA,IAAa,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,CAAC,OAAA,mBACnCD,IAAAA,CAAC,KAAA,EAAA,EAAI,MAAK,OAAA,EAAQ,SAAA,EAAW,EAAA,CAAG,KAAA,EAAO,0BAAsB,IAAA,EAC3D,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,OAAG,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,MACb,OAAA,mBACCA,GAAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAW,EAAA,CAAG,KAAA,EAAO,SAAS,OAAA,EAAS,wBAAA,EAAsB,IAAA,EAChF,QAAA,EAAA,CAAA,CAAE,OACL,CAAA,GACE;AAAA,KAAA,EACN,CAAA,GACE,IAAA;AAAA,IACH,QAAA;AAAA,IACA,OAAA,IAAW,KAAA,CAAM,MAAA,KAAW,CAAA,GACzB,CAAC,GAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,qBAAMA,GAAAA,CAAC,KAAA,EAAA,EAAY,SAAA,EAAW,EAAA,CAAG,QAAA,EAAU,2BAAA,EAAyB,MAAC,aAAA,EAAY,MAAA,EAAA,EAAjE,CAAwE,CAAE,CAAA,GACzG,IAAA;AAAA,IACH,IAAA,GACG,IAAA,CAAK,GAAA,CAAI,CAAC,EAAE,MAAM,IAAA,EAAK,KAAM,OAAA,CAAQ,IAAA,EAAM,EAAE,IAAA,EAAM,aAAa,IAAA,GAAO,EAAC,EAAG,CAAC,CAAA,GAC5E,IAAA,GACA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,IAAA,OAAW,OAAA,CAAQ,IAAA,EAAM,EAAE,IAAA,EAAM,UAAA,GAAa,IAAA,GAAO,EAAC,EAAG,CAAC,CAAA,GACxF,KAAA,CAAM,GAAA,CAAI,CAAC,SAAS,OAAA,CAAQ,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,IAAK,EAAC,EAAG,CAAC,CAAA;AAAA,IACzE,QAAQ,IAAA,CAAK,SAAA,GAAY,oBACxBD,IAAAA,CAAC,aAAQ,SAAA,EAAW,EAAA,CAAG,MAAM,uBAAA,EAAqB,IAAA,EAAE,GAAI,MAAA,GAAS,EAAE,MAAM,IAAA,EAAK,GAAI,EAAC,EACjF,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAW,EAAA,CAAG,aAAa,+BAAA,EAA6B,IAAA,EAC9D,QAAA,EAAA,CAAA,CAAE,WAAA,CAAY,QAAQ,KAAA,EAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAC,CAAA,EACtD,CAAA;AAAA,sBACAA,IAAC,KAAA,EAAA,EAAI,yBAAA,EAAuB,MACzB,QAAA,EAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AACpB,QAAA,MAAM,WAAA,GAAc,EAAE,OAAA,GAAU,WAAA,CAAY,EAAE,OAAA,EAAS,CAAA,CAAE,OAAA,EAAS,CAAA,GAAI,IAAA;AACtE,QAAA,MAAM,KAAK,CAAA,EAAG,IAAI,CAAA,OAAA,EAAU,CAAA,CAAE,OAAO,OAAO,CAAA,CAAA;AAC5C,QAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAA2B,IAAA,EAAK,OAAA,EAAQ,iBAAA,EAAiB,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,KAAA,EAAO,wBAAA,EAAwB,CAAA,CAAE,OAAO,OAAA,EAClH,QAAA,EAAA;AAAA,0BAAAA,KAAC,GAAA,EAAA,EAAE,EAAA,EAAQ,WAAW,EAAA,CAAG,UAAA,EAAY,gCAA4B,IAAA,EAC9D,QAAA,EAAA;AAAA,YAAA,KAAA,IAAS,CAAA,CAAE,OAAA,mBAAUC,GAAAA,CAAC,SAAA,EAAA,EAAU,OAAO,CAAA,CAAE,OAAA,EAAS,IAAA,EAAM,EAAA,EAAI,CAAA,GAAK,IAAA;AAAA,4BAClEA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,WAAA,IAAe,EAAE,aAAA,EAAc;AAAA,WAAA,EACxC,CAAA;AAAA,UACC,EAAE,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,QAAQ,IAAA,EAAM,EAAE,IAAA,EAAM,IAAI,OAAA,EAAS,OAAA,CAAQ,WAAW,CAAA,EAAG,CAAC;AAAA,SAAA,EAAA,EALzE,CAAA,CAAE,OAAO,OAMnB,CAAA;AAAA,MAEJ,CAAC,CAAA,EACH;AAAA,KAAA,EACF,CAAA,GACE,IAAA;AAAA,IACH,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,qBACXD,IAAAA,CAAC,OAAA,EAAA,EAAwB,SAAA,EAAW,EAAA,CAAG,MAAA,EAAQ,yBAAA,EAAuB,IAAA,EAAC,2BAAuB,IAAA,EAC3F,QAAA,EAAA;AAAA,MAAA,KAAA,CAAM,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,MACpB,wBAAQC,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,IAAI,CAAA,GAAK,IAAA;AAAA,sBACrCD,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,EAAA,CAAG,IAAA,EAAM,yBAAqB,IAAA,EAC7C,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,UAAK,SAAA,EAAW,EAAA,CAAG,OAAO,wBAAA,EAAsB,IAAA,EAC/C,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,GAAG,OAAA,EAAS,0BAAA,EAAwB,MAClD,QAAA,EAAA,CAAA,CAAE,WAAA,CAAY,QAAQ,QAAA,EAAU,CAAA,CAAE,IAAI,CAAA,EACzC,CAAA,EACF,CAAA;AAAA,QACC,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,IAAA,mBACdA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,GAAA,EAAK,sBAAA,EAAoB,IAAA,EAC1C,WAAC,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,EAChD,CAAA,GACE;AAAA,OAAA,EACN,CAAA;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,EAAA,CAAG,KAAA,EAAO,0BAAsB,IAAA,EAC/C,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,EAAA,CAAG,IAAA,EAAM,yBAAqB,IAAA,EAC5C,QAAA,EAAA,CAAA,CAAE,MACL,CAAA,EACF;AAAA,KAAA,EAAA,EAnBU,CAAA,CAAE,SAoBd,CACD,CAAA;AAAA,IACA,2BACCA,GAAAA,CAAC,OAAE,SAAA,EAAW,EAAA,CAAG,MAAM,uBAAA,EAAqB,IAAA,EAAC,WAAA,EAAW,SAAA,EAAW,QAAQ,MAAA,EAAW,WAAA,EAAU,UAC7F,QAAA,EAAA,SAAA,EAAW,IAAA,IAAQ,IACtB,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ","file":"checkout.js","sourcesContent":["/**\n * Contact and shipping address fields of a checkout, in the order and with the autofill tokens buyers expect:\n * contact (e-mail, phone, given and family name) and address (postal code first, so it can fill state and city, then\n * state, city, colonia, street, interior and delivery references). One column on phones; the shop lays out the grid\n * with `classNames`.\n *\n * Nothing here knows a country: the postal-code format, the list of states and the postal-code lookup come from the\n * shop (region config, a same-origin route). Without them the fields are plain text and nothing is invented.\n */\nimport { useEffect, useId, useRef, useState, type ReactNode } from 'react'\nimport type { Address } from '@asteby/storefront'\nimport { CheckoutField, type CheckoutFieldClassNames, type FieldErrors, type FieldMessages } from './fields.js'\n\nexport type AddressFieldKey = 'zip' | 'province' | 'city' | 'neighborhood' | 'address1' | 'address2' | 'reference'\nexport type ContactFieldKey = 'email' | 'phone' | 'first_name' | 'last_name'\n\nexport type AddressFieldsMessages = Record<AddressFieldKey | ContactFieldKey, string> & {\n provincePlaceholder: string\n neighborhoodPlaceholder: string\n address1Hint: string\n referenceHint: string\n emailHint: string\n phoneHint: string\n lookupFilled: string\n}\n\nconst ES: AddressFieldsMessages = {\n email: 'Correo',\n phone: 'Teléfono',\n first_name: 'Nombre',\n last_name: 'Apellidos',\n zip: 'Código postal',\n province: 'Estado',\n city: 'Ciudad o municipio',\n neighborhood: 'Colonia',\n address1: 'Calle y número',\n address2: 'Número interior o departamento',\n reference: 'Referencias para la entrega',\n provincePlaceholder: 'Elige tu estado',\n neighborhoodPlaceholder: 'Elige tu colonia',\n address1Hint: 'Por ejemplo: Av. Insurgentes Sur 1234',\n referenceHint: 'Entre qué calles, color de la fachada…',\n emailHint: 'Te enviamos aquí la confirmación y el seguimiento.',\n phoneHint: 'Solo para la paquetería, por si necesita contactarte.',\n lookupFilled: 'Completamos estado y ciudad con tu código postal.',\n}\n\nconst EN: AddressFieldsMessages = {\n email: 'Email',\n phone: 'Phone',\n first_name: 'First name',\n last_name: 'Last name',\n zip: 'Postal code',\n province: 'State',\n city: 'City',\n neighborhood: 'Neighborhood',\n address1: 'Street and number',\n address2: 'Apartment, suite',\n reference: 'Delivery notes',\n provincePlaceholder: 'Choose your state',\n neighborhoodPlaceholder: 'Choose your neighborhood',\n address1Hint: 'For example: 1234 Main St',\n referenceHint: 'Cross streets, building color…',\n emailHint: 'We send the confirmation and tracking here.',\n phoneHint: 'Only for the carrier, in case they need to reach you.',\n lookupFilled: 'We filled in state and city from your postal code.',\n}\n\nexport function addressFieldsMessages(locale?: string | null, overrides?: Partial<AddressFieldsMessages> | null): AddressFieldsMessages {\n const base = (locale ?? 'es-MX').toLowerCase().startsWith('en') ? EN : ES\n return overrides ? { ...base, ...overrides } : base\n}\n\nexport type FieldLayoutClassNames = CheckoutFieldClassNames & {\n /** Extra class of a field that should span the whole row in a two-column grid. */\n wide?: string\n /** Extra class of a field that fits half a row. */\n half?: string\n}\n\ntype Common = {\n /** Inline errors by field name (`useFieldErrors().errors`). */\n errors?: FieldErrors\n locale?: string\n messages?: Partial<AddressFieldsMessages>\n fieldMessages?: Partial<FieldMessages>\n classNames?: FieldLayoutClassNames\n}\n\nconst join = (...c: Array<string | undefined>) => c.filter(Boolean).join(' ') || undefined\nconst field = (cx: FieldLayoutClassNames, span: 'wide' | 'half'): CheckoutFieldClassNames => ({ ...cx, root: join(cx.root, cx[span]) })\n\nexport type ContactFieldsProps = Common & {\n defaults?: Partial<Record<ContactFieldKey, string | null>>\n /** Form names. Default: the keys. */\n names?: Partial<Record<ContactFieldKey, string>>\n /** Phone format from the shop or region (e.g. `{ pattern: '[0-9 +()-]{10,}', title: '10 dígitos' }`). */\n phone?: { pattern?: string; title?: string; minLength?: number }\n /** Explain why e-mail and phone are needed (default true). */\n hints?: boolean\n}\n\n/** E-mail, phone, given and family name with their autofill tokens and the right mobile keyboards. */\nexport function ContactFields({ defaults = {}, names = {}, errors = {}, phone, hints = true, locale, messages, fieldMessages: fm, classNames: cx = {} }: ContactFieldsProps) {\n const m = addressFieldsMessages(locale, messages)\n const n = (k: ContactFieldKey) => names[k] ?? k\n const common = { ...(locale ? { locale } : {}), ...(fm ? { messages: fm } : {}) }\n return (\n <>\n <CheckoutField {...common} name={n('email')} label={m.email} type=\"email\" autoComplete=\"email\" inputMode=\"email\" autoCapitalize=\"none\" spellCheck={false} defaultValue={defaults.email ?? ''} error={errors[n('email')] ?? null} hint={hints ? m.emailHint : undefined} classNames={field(cx, 'wide')} />\n <CheckoutField {...common} name={n('phone')} label={m.phone} type=\"tel\" autoComplete=\"tel\" inputMode=\"tel\" defaultValue={defaults.phone ?? ''} error={errors[n('phone')] ?? null} hint={hints ? m.phoneHint : undefined} classNames={field(cx, 'wide')} {...(phone?.pattern ? { pattern: phone.pattern } : {})} {...(phone?.title ? { title: phone.title } : {})} {...(phone?.minLength ? { minLength: phone.minLength } : {})} />\n <CheckoutField {...common} name={n('first_name')} label={m.first_name} autoComplete=\"given-name\" defaultValue={defaults.first_name ?? ''} error={errors[n('first_name')] ?? null} classNames={field(cx, 'half')} />\n <CheckoutField {...common} name={n('last_name')} label={m.last_name} autoComplete=\"family-name\" defaultValue={defaults.last_name ?? ''} error={errors[n('last_name')] ?? null} classNames={field(cx, 'half')} />\n </>\n )\n}\n\n/** What a postal-code lookup answers. Every field optional: only what the source knows. */\nexport type PostalCodeInfo = { province?: string | null; city?: string | null; neighborhoods?: readonly string[] | null }\n\nexport type AddressFieldsProps = Common & {\n defaults?: Partial<Pick<Address, 'zip' | 'province' | 'city' | 'neighborhood' | 'address1' | 'address2' | 'reference'>> | null\n /** Form names. Default: the keys (the `AddressInput` fields of the Storefront API). */\n names?: Partial<Record<AddressFieldKey, string>>\n /** ISO country of the address (hidden field `country_code`). */\n countryCode: string\n /** States of the country (from the region config). With them, \"State\" is a `<select>`; the value sent is `name`. */\n provinces?: ReadonlyArray<{ code?: string | null; name: string }> | null\n /** Postal-code format of the country (from the region config), e.g. `{ pattern: '[0-9]{5}', maxLength: 5, inputMode: 'numeric', title: '5 dígitos' }`. */\n postalCode?: { pattern?: string; maxLength?: number; inputMode?: 'numeric' | 'text'; title?: string }\n /**\n * Fills state and city (and suggests colonias) from the postal code, when the shop has a source (a same-origin\n * route over a postal-code catalog). Called once the code matches `postalCode.pattern` (or on leaving the field).\n * Never overwrites what the buyer typed.\n */\n lookupPostalCode?: (zip: string) => Promise<PostalCodeInfo | null>\n /**\n * How to offer the colonias when the postal code has SEVERAL: `'datalist'` (default, suggestions on a text field) or\n * `'select'` (a real list; the field becomes a `<select>` of those colonias, unless the buyer already typed one that\n * is not in the list, which is kept as text). With exactly one colonia it is filled in either mode.\n */\n neighborhoodList?: 'datalist' | 'select'\n /** Show the colonia field: `true` (default, optional), `'required'`, or `false`. */\n neighborhood?: boolean | 'required'\n /** Show the delivery references field (default true, optional). */\n reference?: boolean\n /**\n * Once `lookupPostalCode` fills the state field (never over what the buyer already typed), lock it: a plain\n * `<input>` turns read-only; a `<select>` (from `provinces`) turns disabled with a hidden field that keeps\n * submitting its value. The buyer corrects the state by correcting the postal code. Default false: the filled\n * state stays as editable as any other field. Marked with `data-sf-locked=\"1\"` for the shop's own styling.\n */\n lockProvinceOnFill?: boolean\n /** Rendered after the fields (e.g. \"save this address\"). */\n children?: ReactNode\n}\n\n/**\n * Shipping address in the order buyers fill it: postal code, state, city, colonia, street and number, interior and\n * references. Autofill tokens: `postal-code`, `address-level1/2/3`, `address-line1/2`. The postal code uses the\n * numeric keyboard when the country format is numeric.\n */\n/** Locks a field the lookup just filled: read-only for an `<input>`, disabled + a hidden mirror for a `<select>`. */\nfunction lockField(el: HTMLInputElement | HTMLSelectElement) {\n if (el.dataset.sfLocked === '1') return\n el.dataset.sfLocked = '1'\n el.setAttribute('aria-readonly', 'true')\n if (el instanceof HTMLSelectElement) {\n // A disabled `<select>` would stop submitting its value: a hidden sibling keeps it in the form.\n const name = el.getAttribute('name')\n if (name) {\n const hidden = document.createElement('input')\n hidden.type = 'hidden'\n hidden.name = name\n hidden.value = el.value\n el.insertAdjacentElement('afterend', hidden)\n el.removeAttribute('name')\n }\n el.disabled = true\n } else {\n el.readOnly = true\n }\n}\n\n/** Name of the property set to `true` on every event the lookup dispatches when it fills a field. */\nexport const ADDRESS_FILL_EVENT_FLAG = 'sfSynthetic'\n\n/**\n * Was this `input` event dispatched by `AddressFields` itself (a postal-code fill) and not typed by the buyer? The shop's\n * own listeners (validation, autosave, delivery re-quote...) can ignore these. Real typing has `isTrusted: true`.\n */\nexport function isAddressFillEvent(event: Event): boolean {\n return (event as unknown as Record<string, unknown>)[ADDRESS_FILL_EVENT_FLAG] === true\n}\n\nexport function AddressFields(props: AddressFieldsProps) {\n const { defaults, names = {}, errors = {}, countryCode, provinces, postalCode, lookupPostalCode, lockProvinceOnFill, locale, messages, fieldMessages: fm, classNames: cx = {}, children } = props\n const showNeighborhood = props.neighborhood ?? true\n const showReference = props.reference ?? true\n const m = addressFieldsMessages(locale, messages)\n const n = (k: AddressFieldKey) => names[k] ?? k\n const common = { ...(locale ? { locale } : {}), ...(fm ? { messages: fm } : {}) }\n const listId = useId()\n const [colonias, setColonias] = useState<readonly string[]>([])\n const [filled, setFilled] = useState(false)\n const [coloniaSelect, setColoniaSelect] = useState(false)\n const coloniaSelectRef = useRef(false)\n // Switching the colonia between text and list remounts the field: what it should hold is carried to the new element.\n const coloniaCarry = useRef<{ value: string; autofilled: boolean; userEdited: boolean } | null>(null)\n const lastZip = useRef<string | null>(null)\n const zipRef = useRef<HTMLDivElement>(null)\n const lookupRef = useRef(lookupPostalCode)\n lookupRef.current = lookupPostalCode\n // ONE writer: lookup results are applied one after another, never interleaved (two lookups answering close together\n // would otherwise write the same fields and fire their events at the same time).\n const writer = useRef<Promise<void>>(Promise.resolve())\n const enqueue = (task: () => void) => {\n writer.current = writer.current.then(task).catch(() => {})\n }\n\n // A field the buyer edited is theirs: only REAL input (`isTrusted`) marks it, not the events this component dispatches.\n useEffect(() => {\n const form = zipRef.current?.closest('form')\n if (!form) return\n const mark = (e: Event) => {\n if (!e.isTrusted) return\n const el = e.target as HTMLElement | null\n if (el instanceof HTMLInputElement || el instanceof HTMLSelectElement) {\n el.dataset.sfUserEdited = '1'\n delete el.dataset.sfAutofilled\n }\n }\n form.addEventListener('input', mark, true)\n form.addEventListener('change', mark, true)\n return () => {\n form.removeEventListener('input', mark, true)\n form.removeEventListener('change', mark, true)\n }\n }, [])\n\n const runLookup = (zip: string) => {\n const lookup = lookupRef.current\n if (!lookup || !zip || zip === lastZip.current) return\n if (postalCode?.pattern && !new RegExp(`^(?:${postalCode.pattern})$`).test(zip)) return\n lastZip.current = zip\n const form = zipRef.current?.closest('form')\n void lookup(zip).then(\n (info) => {\n if (!info) return\n enqueue(() => {\n if (lastZip.current !== zip) return\n const fill = (name: string, value: string | null | undefined, lock?: boolean) => {\n const el = form?.elements.namedItem(name) as HTMLInputElement | HTMLSelectElement | null\n if (!el || !value || ('length' in el && !(el instanceof HTMLSelectElement))) return false\n // Already locked from a previous lookup: leave it (the buyer corrects the postal code instead).\n if (el.dataset.sfLocked === '1') return false\n // Never over what they edited, nor over text in the field they are typing in. A focused field that is still\n // empty (Tab from the postal code lands on the next one) is filled: nothing of theirs is overwritten.\n if (el.dataset.sfUserEdited === '1' || (el.ownerDocument.activeElement === el && el.value)) return false\n // Only an empty field, or one this lookup filled before: never what the buyer typed.\n if (el.value && el.dataset.sfAutofilled !== '1') return false\n if (el instanceof HTMLSelectElement && ![...el.options].some((o) => o.value === value)) return false\n el.value = value\n el.dataset.sfAutofilled = '1'\n const event = new Event('input', { bubbles: true })\n Object.defineProperty(event, ADDRESS_FILL_EVENT_FLAG, { value: true })\n el.dispatchEvent(event)\n if (lock) lockField(el)\n return true\n }\n const a = fill(n('province'), info.province, lockProvinceOnFill)\n const b = fill(n('city'), info.city)\n // Colonia only when the code has exactly ONE: with several the buyer chooses (the list is offered, not applied).\n const only = info.neighborhoods?.length === 1 ? info.neighborhoods[0] : null\n const c = showNeighborhood ? fill(n('neighborhood'), only) : false\n setColonias(info.neighborhoods ?? [])\n const list = info.neighborhoods ?? []\n const nameEl = form?.elements.namedItem(n('neighborhood')) as HTMLInputElement | HTMLSelectElement | null\n const el = nameEl && !('length' in nameEl && !(nameEl instanceof HTMLSelectElement)) ? nameEl : null\n const typed = el ? el.value : ''\n const wantSelect = props.neighborhoodList === 'select' && showNeighborhood !== false && list.length > 1 && (!typed || list.includes(typed))\n let carried = false\n if (showNeighborhood && wantSelect !== coloniaSelectRef.current) {\n const userEdited = el?.dataset.sfUserEdited === '1'\n // The single colonia of the new code wins over a previous autofill, never over what the buyer chose.\n const value = only && !userEdited ? only : wantSelect ? (list.includes(typed) ? typed : '') : typed\n coloniaCarry.current = { value, autofilled: !userEdited && (!!only || el?.dataset.sfAutofilled === '1'), userEdited }\n carried = !!only && !userEdited\n }\n coloniaSelectRef.current = wantSelect\n setColoniaSelect(wantSelect)\n setFilled(a || b || c || carried)\n })\n },\n () => {\n /* no lookup: the buyer types state and city */\n },\n )\n }\n\n // Applies the carried colonia to the field that replaced the old one (text <-> list), like any fill.\n useEffect(() => {\n const carry = coloniaCarry.current\n coloniaCarry.current = null\n if (!carry || !carry.value) return\n const form = zipRef.current?.closest('form')\n const el = form?.elements.namedItem(n('neighborhood')) as HTMLInputElement | HTMLSelectElement | null\n if (!el || ('length' in el && !(el instanceof HTMLSelectElement))) return\n if (el instanceof HTMLSelectElement && ![...el.options].some((o) => o.value === carry.value)) return\n el.value = carry.value\n if (carry.userEdited) el.dataset.sfUserEdited = '1'\n else if (carry.autofilled) el.dataset.sfAutofilled = '1'\n const event = new Event('input', { bubbles: true })\n Object.defineProperty(event, ADDRESS_FILL_EVENT_FLAG, { value: true })\n el.dispatchEvent(event)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [coloniaSelect])\n\n useEffect(() => {\n const zip = defaults?.zip\n if (zip) runLookup(zip)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const numericZip = postalCode?.inputMode === 'numeric'\n return (\n <>\n <div ref={zipRef} className={join(cx.half)} data-sf-zip>\n <CheckoutField\n {...common}\n name={n('zip')}\n label={m.zip}\n autoComplete=\"postal-code\"\n inputMode={postalCode?.inputMode ?? 'text'}\n {...(postalCode?.pattern ? { pattern: postalCode.pattern } : {})}\n {...(postalCode?.maxLength ? { maxLength: postalCode.maxLength } : {})}\n {...(postalCode?.title ? { title: postalCode.title } : {})}\n {...(numericZip ? { autoCapitalize: 'none' } : {})}\n defaultValue={defaults?.zip ?? ''}\n error={errors[n('zip')] ?? null}\n classNames={{ ...cx, root: cx.root }}\n onInput={(e) => {\n const v = e.currentTarget.value.trim()\n if (postalCode?.maxLength && v.length === postalCode.maxLength) runLookup(v)\n }}\n onBlur={(e) => runLookup(e.currentTarget.value.trim())}\n />\n </div>\n {provinces && provinces.length ? (\n <CheckoutField {...common} as=\"select\" name={n('province')} label={m.province} autoComplete=\"address-level1\" defaultValue={defaults?.province ?? ''} error={errors[n('province')] ?? null} classNames={field(cx, 'half')}>\n <option value=\"\" disabled>\n {m.provincePlaceholder}\n </option>\n {provinces.map((p) => (\n <option key={p.code ?? p.name} value={p.name}>\n {p.name}\n </option>\n ))}\n </CheckoutField>\n ) : (\n <CheckoutField {...common} name={n('province')} label={m.province} autoComplete=\"address-level1\" defaultValue={defaults?.province ?? ''} error={errors[n('province')] ?? null} classNames={field(cx, 'half')} />\n )}\n <CheckoutField {...common} name={n('city')} label={m.city} autoComplete=\"address-level2\" defaultValue={defaults?.city ?? ''} error={errors[n('city')] ?? null} classNames={field(cx, 'half')} />\n {showNeighborhood && coloniaSelect ? (\n <CheckoutField\n {...common}\n as=\"select\"\n name={n('neighborhood')}\n label={m.neighborhood}\n autoComplete=\"address-level3\"\n optional={showNeighborhood !== 'required'}\n defaultValue={colonias.includes(defaults?.neighborhood ?? '') ? (defaults?.neighborhood ?? '') : ''}\n error={errors[n('neighborhood')] ?? null}\n classNames={field(cx, 'half')}\n >\n <option value=\"\" disabled={showNeighborhood === 'required'}>\n {m.neighborhoodPlaceholder}\n </option>\n {colonias.map((c) => (\n <option key={c} value={c}>\n {c}\n </option>\n ))}\n </CheckoutField>\n ) : showNeighborhood ? (\n <CheckoutField\n {...common}\n name={n('neighborhood')}\n label={m.neighborhood}\n autoComplete=\"address-level3\"\n optional={showNeighborhood !== 'required'}\n defaultValue={defaults?.neighborhood ?? ''}\n error={errors[n('neighborhood')] ?? null}\n classNames={field(cx, 'half')}\n {...(colonias.length && !coloniaSelect ? { list: listId } : {})}\n />\n ) : null}\n {colonias.length && !coloniaSelect ? (\n <datalist id={listId}>\n {colonias.map((c) => (\n <option key={c} value={c} />\n ))}\n </datalist>\n ) : null}\n {/* The lookup result, announced once (not on every keystroke). */}\n <p role=\"status\" aria-live=\"polite\" data-sf-zip-status style={filled ? undefined : { position: 'absolute', width: 1, height: 1, overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap' }} className={filled ? join(cx.hint, cx.wide) : undefined}>\n {filled ? m.lookupFilled : ''}\n </p>\n <CheckoutField {...common} name={n('address1')} label={m.address1} autoComplete=\"address-line1\" defaultValue={defaults?.address1 ?? ''} error={errors[n('address1')] ?? null} hint={m.address1Hint} classNames={field(cx, 'wide')} />\n <CheckoutField {...common} name={n('address2')} label={m.address2} autoComplete=\"address-line2\" optional defaultValue={defaults?.address2 ?? ''} error={errors[n('address2')] ?? null} classNames={field(cx, 'half')} />\n {showReference ? (\n <CheckoutField {...common} name={n('reference')} label={m.reference} optional defaultValue={defaults?.reference ?? ''} error={errors[n('reference')] ?? null} hint={m.referenceHint} classNames={field(cx, 'wide')} maxLength={200} />\n ) : null}\n <input type=\"hidden\" name=\"country_code\" value={countryCode} />\n {children}\n </>\n )\n}\n","/**\n * Order summary of a checkout: lines and the server totals (subtotal, discounts, shipping, taxes, total) exactly as\n * `cart.cost` sends them; nothing is added or recalculated. `OrderSummaryDisclosure` wraps it for phones: a collapsed\n * bar with the total at the top of the page (native `<details>`, no JavaScript, no layout shift on hydration).\n */\nimport type { ReactNode } from 'react'\nimport { formatMoney, type CartCost, type CartLine, type Money } from '@asteby/storefront'\nimport { useResolvedLocale } from '../locale.js'\n\nexport type OrderSummaryMessages = {\n title: string\n subtotal: string\n discount: string\n shipping: string\n /** Shipping not chosen yet. */\n shippingPending: string\n /** Shipping being saved / re-read. */\n updating: string\n free: string\n taxes: string\n /** Taxes already inside the prices, `{amount}`. */\n taxesIncluded: string\n total: string\n /** `{n}` = quantity. */\n quantity: string\n show: string\n hide: string\n}\n\nconst ES: OrderSummaryMessages = {\n title: 'Tu pedido',\n subtotal: 'Subtotal',\n discount: 'Descuento',\n shipping: 'Envío',\n shippingPending: 'Al elegir la entrega',\n updating: 'Actualizando…',\n free: 'Gratis',\n taxes: 'Impuestos',\n taxesIncluded: 'Incluye {amount} de impuestos',\n total: 'Total',\n quantity: 'Cantidad: {n}',\n show: 'Ver resumen del pedido',\n hide: 'Ocultar resumen del pedido',\n}\n\nconst EN: OrderSummaryMessages = {\n title: 'Your order',\n subtotal: 'Subtotal',\n discount: 'Discount',\n shipping: 'Shipping',\n shippingPending: 'Calculated at delivery',\n updating: 'Updating…',\n free: 'Free',\n taxes: 'Taxes',\n taxesIncluded: 'Includes {amount} in taxes',\n total: 'Total',\n quantity: 'Quantity: {n}',\n show: 'Show order summary',\n hide: 'Hide order summary',\n}\n\nexport function orderSummaryMessages(locale?: string | null, overrides?: Partial<OrderSummaryMessages> | null): OrderSummaryMessages {\n const base = (locale ?? 'es-MX').toLowerCase().startsWith('en') ? EN : ES\n return overrides ? { ...base, ...overrides } : base\n}\n\nexport type OrderSummaryClassNames = Partial<\n Record<'root' | 'title' | 'lines' | 'line' | 'media' | 'qty' | 'lineTitle' | 'variant' | 'linePrice' | 'totals' | 'row' | 'discount' | 'muted' | 'free' | 'total' | 'note', string>\n>\n\nexport type OrderSummaryProps = {\n lines: readonly CartLine[]\n /** `cart.cost` as the server sends it. */\n cost: CartCost\n /** The delivery is being saved and the cart re-read: shipping and total say so (`aria-busy`). */\n updating?: boolean\n /** Picture of a line (e.g. `<ProductImage>`), 48-64 px. The quantity badge sits on it. */\n renderLineMedia?: (line: CartLine) => ReactNode\n renderAmount?: (amount: Money) => ReactNode\n /** Heading. `false` hides it (the disclosure already names the block). */\n title?: ReactNode | false\n /** Heading level. Default 2. */\n headingLevel?: 2 | 3\n locale?: string\n messages?: Partial<OrderSummaryMessages>\n classNames?: OrderSummaryClassNames\n /** Rendered between the lines and the totals (e.g. a discount code form). */\n children?: ReactNode\n}\n\nconst isZero = (m: Money | null | undefined) => !!m && Number(m.amount) === 0\nconst positive = (m: Money | null | undefined): m is Money => !!m && Number(m.amount) > 0\n\n/** Lines and totals of the order. The total row is `aria-live`, so a new total after choosing delivery is announced. */\nexport function OrderSummary(props: OrderSummaryProps) {\n const { lines, cost, updating = false, renderLineMedia, renderAmount, title, headingLevel = 2, classNames: cx = {}, children } = props\n const locale = useResolvedLocale(props.locale)\n const m = orderSummaryMessages(locale, props.messages)\n const money = (v: Money) => (renderAmount ? renderAmount(v) : formatMoney(v, locale))\n const H = headingLevel === 3 ? 'h3' : 'h2'\n const discounts = cost.discounts?.filter((d) => positive(d.amount)) ?? []\n return (\n <div className={cx.root} data-sf-summary>\n {title === false ? null : (\n <H className={cx.title} data-sf-summary-title>\n {title ?? m.title}\n </H>\n )}\n <ul className={cx.lines} data-sf-summary-lines>\n {lines.map((l) => {\n const variant = l.merchandise.title && !/^default( title)?$/i.test(l.merchandise.title) ? l.merchandise.title : null\n return (\n <li key={l.id} className={cx.line} data-sf-summary-line>\n {renderLineMedia ? (\n <span className={cx.media} data-sf-summary-media>\n {renderLineMedia(l)}\n {l.quantity > 1 ? (\n <span className={cx.qty} data-sf-summary-qty aria-hidden=\"true\">\n {l.quantity}\n </span>\n ) : null}\n </span>\n ) : null}\n <span data-sf-summary-line-body>\n <span className={cx.lineTitle} data-sf-summary-line-title>\n {!renderLineMedia && l.quantity > 1 ? `${l.quantity} × ` : null}\n {l.merchandise.product.title}\n </span>\n {variant ? (\n <span className={cx.variant} data-sf-summary-variant>\n {variant}\n </span>\n ) : null}\n {renderLineMedia || l.quantity > 1 ? (\n <span style={{ position: 'absolute', width: 1, height: 1, overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap' }}>{m.quantity.replace('{n}', String(l.quantity))}</span>\n ) : null}\n </span>\n <span className={cx.linePrice} data-sf-summary-line-price>\n {money(l.cost.total)}\n </span>\n </li>\n )\n })}\n </ul>\n {children}\n <dl className={cx.totals} data-sf-summary-totals aria-busy={updating || undefined}>\n <div className={cx.row} data-sf-summary-row=\"subtotal\">\n <dt>{m.subtotal}</dt>\n <dd>{money(cost.subtotal)}</dd>\n </div>\n {discounts.length\n ? discounts.map((d) => (\n <div key={d.id} className={cx.row ? `${cx.row} ${cx.discount ?? ''}`.trim() : cx.discount} data-sf-summary-row=\"discount\">\n <dt>{d.code ? `${m.discount} (${d.code})` : d.title || m.discount}</dt>\n <dd>−{money(d.amount)}</dd>\n </div>\n ))\n : positive(cost.discount) ? (\n <div className={cx.row ? `${cx.row} ${cx.discount ?? ''}`.trim() : cx.discount} data-sf-summary-row=\"discount\">\n <dt>{m.discount}</dt>\n <dd>−{money(cost.discount)}</dd>\n </div>\n ) : null}\n <div className={cx.row} data-sf-summary-row=\"shipping\">\n <dt>{m.shipping}</dt>\n <dd className={updating || !cost.shipping ? cx.muted : undefined}>\n {updating ? m.updating : !cost.shipping ? m.shippingPending : isZero(cost.shipping) ? <span className={cx.free}>{m.free}</span> : money(cost.shipping)}\n </dd>\n </div>\n {positive(cost.tax) && !cost.tax_included ? (\n <div className={cx.row} data-sf-summary-row=\"tax\">\n <dt>{m.taxes}</dt>\n <dd>{money(cost.tax)}</dd>\n </div>\n ) : null}\n <div className={cx.total} data-sf-summary-row=\"total\">\n <dt>{m.total}</dt>\n <dd aria-live=\"polite\" data-updating={updating || undefined}>\n {money(cost.total)}\n </dd>\n </div>\n </dl>\n {positive(cost.tax) && cost.tax_included ? (\n <p className={cx.note} data-sf-summary-tax-note>\n {m.taxesIncluded.split('{amount}').flatMap((part, i) => (i === 0 ? [part] : [<span key={i}>{money(cost.tax!)}</span>, part]))}\n </p>\n ) : null}\n </div>\n )\n}\n\nexport type OrderSummaryDisclosureProps = {\n /** Total shown on the collapsed bar (`cart.cost.total`). */\n total: Money\n updating?: boolean\n renderAmount?: (amount: Money) => ReactNode\n locale?: string\n messages?: Partial<OrderSummaryMessages>\n /** Start open (default closed). */\n defaultOpen?: boolean\n className?: string\n classNames?: Partial<Record<'summary' | 'label' | 'total' | 'panel', string>>\n /** Usually an `<OrderSummary title={false} … />`. */\n children: ReactNode\n}\n\n/**\n * Phones: the order summary as a collapsed bar at the top (\"Show order summary · $1,234.00\"). Native `<details>`:\n * works without JavaScript, the server HTML is already the final layout (no shift on hydration). Show it only on\n * narrow screens and the full summary on wide ones (the shop's CSS).\n */\nexport function OrderSummaryDisclosure({ total, updating, renderAmount, locale: loc, messages, defaultOpen = false, className, classNames: cx = {}, children }: OrderSummaryDisclosureProps) {\n const locale = useResolvedLocale(loc)\n const m = orderSummaryMessages(locale, messages)\n return (\n <details className={className} data-sf-summary-disclosure {...(defaultOpen ? { open: true } : {})}>\n <summary className={cx.summary} data-sf-summary-toggle>\n <span className={cx.label} data-sf-summary-toggle-label>\n <span data-sf-summary-show>{m.show}</span>\n <span data-sf-summary-hide>{m.hide}</span>\n </span>\n <span className={cx.total} data-sf-summary-toggle-total data-updating={updating || undefined}>\n {renderAmount ? renderAmount(total) : formatMoney(total, locale)}\n </span>\n </summary>\n <div className={cx.panel} data-sf-summary-panel>\n {children}\n </div>\n </details>\n )\n}\n","/**\n * Which carrier rates to show first. Pure: no DOM, no amounts computed (costs are only compared, as the server sends\n * them). A long quote (10+ services, several per carrier) becomes up to three recommended rows (the cheapest, the\n * fastest and the best balance of both) plus the rest grouped by carrier, so the buyer compares three things instead of\n * scanning a flat list.\n */\nimport type { ShippingRate } from '@asteby/storefront'\nimport { brandKey } from './brands.js'\n\n/** Why a rate is recommended. `best_value` balances price and arrival time. */\nexport type RateTag = 'cheapest' | 'fastest' | 'best_value'\n\nexport type RecommendedRate<R extends ShippingRate = ShippingRate> = { rate: R; tags: RateTag[] }\n\nexport type RateGroup<R extends ShippingRate = ShippingRate> = {\n /** Brand key of the carrier (`fedex`), or `''` for rates without one. */\n key: string\n /** Carrier as the server sends it (first rate of the group), for `BrandMark` and the group name. */\n carrier: string | null\n rates: R[]\n}\n\nexport type RecommendRatesOptions = {\n /** How many rates to recommend. Default 3. */\n count?: number\n /**\n * With this many rates or fewer every rate is recommended (no \"more options\"): hiding one or two rates behind a\n * toggle costs more than it saves. Default `count + 1`.\n */\n collapseAfter?: number\n /** Drop repeated services (same carrier and service, e.g. quoted by two providers), keeping the cheapest. Default true. */\n dedupe?: boolean\n}\n\nexport type RecommendedRates<R extends ShippingRate = ShippingRate> = {\n recommended: RecommendedRate<R>[]\n /** Everything else, grouped by carrier; groups ordered by their cheapest rate, rates by cost. */\n more: RateGroup<R>[]\n /** Number of rates in `more`. */\n moreCount: number\n}\n\nconst costOf = (r: ShippingRate) => {\n const n = Number(r.cost.amount)\n return Number.isFinite(n) ? n : null\n}\nconst daysOf = (r: ShippingRate) => r.eta_days_max ?? r.eta_days_min ?? null\nconst norm = (s: string | null | undefined) => (s ?? '').trim().toLowerCase()\nconst carrierKey = (r: ShippingRate) => (r.carrier ? brandKey(r.carrier) : r.provider ? brandKey(r.provider) : '')\n\n/** Repeated services (same carrier, same service code or title, same arrival): only the cheapest stays. Order kept. */\nexport function dedupeRates<R extends ShippingRate>(rates: readonly R[]): R[] {\n const best = new Map<string, R>()\n const keyOf = (r: R) => `${carrierKey(r)}|${norm(r.service_code) || norm(r.title)}|${daysOf(r) ?? ''}|${r.cost.currency_code}`\n for (const r of rates) {\n const k = keyOf(r)\n const prev = best.get(k)\n const c = costOf(r)\n if (!prev || (c !== null && (costOf(prev) === null || c < costOf(prev)!))) best.set(k, r)\n }\n const keep = new Set(best.values())\n return rates.filter((r) => keep.has(r))\n}\n\n/**\n * Up to `count` recommended rates and the rest by carrier.\n * - **cheapest**: lowest cost (only when every rate shares the currency); a tie goes to the faster one.\n * - **fastest**: fewest business days; a tie goes to the cheaper one. Only when some rate is strictly faster than the\n * cheapest, so the tag always tells the buyer something.\n * - **best_value**: the remaining rate with the best combined position in price and in time (sum of ranks), a tie goes\n * to the cheaper one. Fills the remaining slots.\n * Recommended rows come back cheapest first. Pickup is not a rate and is never hidden (the component shows it apart).\n */\nexport function recommendRates<R extends ShippingRate>(input: readonly R[], options: RecommendRatesOptions = {}): RecommendedRates<R> {\n const count = Math.max(1, options.count ?? 3)\n const rates = options.dedupe === false ? [...input] : dedupeRates(input)\n const collapseAfter = options.collapseAfter ?? count + 1\n const sameCurrency = new Set(rates.map((r) => r.cost.currency_code)).size <= 1\n const byCost = (a: R, b: R) => (costOf(a) ?? Infinity) - (costOf(b) ?? Infinity)\n const byDays = (a: R, b: R) => (daysOf(a) ?? Infinity) - (daysOf(b) ?? Infinity)\n const tags = new Map<R, RateTag[]>()\n const tag = (r: R, t: RateTag) => tags.set(r, [...(tags.get(r) ?? []), t])\n\n const cheapest = sameCurrency && rates.length > 1 ? [...rates].sort((a, b) => byCost(a, b) || byDays(a, b))[0] : undefined\n if (cheapest && costOf(cheapest) !== null) tag(cheapest, 'cheapest')\n const fastest = rates.length > 1 ? [...rates].sort((a, b) => byDays(a, b) || byCost(a, b))[0] : undefined\n if (fastest && daysOf(fastest) !== null && (!cheapest || fastest === cheapest || (daysOf(cheapest) ?? Infinity) > daysOf(fastest)!)) tag(fastest, 'fastest')\n\n const chosen: R[] = []\n for (const r of [cheapest, fastest]) if (r && tags.has(r) && !chosen.includes(r)) chosen.push(r)\n\n if (rates.length > collapseAfter) {\n // Rank in price and in time (ties share a rank); the best sum fills the remaining slots.\n const rank = (sorted: R[], val: (r: R) => number | null) => {\n const out = new Map<R, number>()\n let pos = 0\n let last: number | null | undefined\n sorted.forEach((r, i) => {\n const v = val(r)\n if (v !== last) pos = i\n last = v\n out.set(r, v === null ? sorted.length : pos)\n })\n return out\n }\n const priceRank = rank([...rates].sort(byCost), costOf)\n const timeRank = rank([...rates].sort(byDays), daysOf)\n const rest = rates\n .filter((r) => !chosen.includes(r))\n .sort((a, b) => priceRank.get(a)! + timeRank.get(a)! - (priceRank.get(b)! + timeRank.get(b)!) || byCost(a, b))\n let first = true\n for (const r of rest) {\n if (chosen.length >= count) break\n chosen.push(r)\n if (first) tag(r, 'best_value')\n first = false\n }\n } else {\n for (const r of rates) if (!chosen.includes(r)) chosen.push(r)\n }\n\n const recommended = chosen.sort(byCost).map((rate) => ({ rate, tags: tags.get(rate) ?? [] }))\n const groups = new Map<string, RateGroup<R>>()\n for (const r of [...rates].sort(byCost)) {\n if (chosen.includes(r)) continue\n const key = carrierKey(r)\n const g = groups.get(key) ?? { key, carrier: r.carrier ?? r.provider ?? null, rates: [] }\n g.rates.push(r)\n groups.set(key, g)\n }\n const more = [...groups.values()]\n return { recommended, more, moreCount: more.reduce((n, g) => n + g.rates.length, 0) }\n}\n\nexport type FlatRatesOptions = {\n /** Count used to decide the `best_value` tag, as in `recommendRates` (default 3: only with more than 4 services). */\n count?: number\n /** Drop repeated services keeping the cheapest. Default true. */\n dedupe?: boolean\n /** Id of the chosen rate: it stays in the list even if it is a repeated service. */\n keepId?: string | null\n}\n\n/**\n * ONE flat list for `layout=\"flat\"`: every service (repeated ones dropped, the cheapest stays), ordered from the\n * lowest to the highest price, with the same tags `recommendRates` assigns (cheapest, fastest and, on long quotes,\n * best_value) on the rows that earn them. Nothing is hidden or grouped.\n */\nexport function flatRates<R extends ShippingRate>(input: readonly R[], options: FlatRatesOptions = {}): RecommendedRate<R>[] {\n const count = options.count ?? 3\n const rates = options.dedupe === false ? [...input] : dedupeRates(input)\n const tags = new Map<R, RateTag[]>()\n for (const { rate, tags: t } of recommendRates(rates, { count, dedupe: false }).recommended) tags.set(rate, t)\n const list = [...rates]\n const kept = options.keepId ? input.find((r) => r.id === options.keepId) : undefined\n if (kept && !list.includes(kept)) list.push(kept)\n const byCost = (a: R, b: R) => (costOf(a) ?? Infinity) - (costOf(b) ?? Infinity)\n // Array.prototype.sort is stable: equal prices keep the server order.\n return list.sort(byCost).map((rate) => ({ rate, tags: tags.get(rate) ?? [] }))\n}\n","/**\n * Pure helpers for the \"Delivery\" step: how to name a carrier rate, its arrival time, which rate is the cheapest or the\n * fastest, and one human note for the quote deadline. No amounts are computed: `cost` is shown as the server sends it;\n * comparing two costs to flag the cheapest is the only arithmetic.\n */\nimport type { ShippingRate } from '@asteby/storefront'\nimport { brandName } from './brands.js'\n\nexport type DeliveryMessages = {\n /** `{n}` = business days. */\n etaOne: string\n etaMany: string\n /** `{min}` / `{max}` = business days. */\n etaRange: string\n etaUpTo: string\n etaFrom: string\n cheapest: string\n fastest: string\n free: string\n pickupTitle: string\n /** Quote deadline, `{time}` = local time. */\n quoteToday: string\n quoteTomorrow: string\n /** `{date}` = short date + time. */\n quoteLater: string\n quoteSoon: string\n partial: string\n loading: string\n /** The quote expired or changed and the rates were reloaded. */\n requoted: string\n /** Tag of the recommended rate that balances price and arrival time (`layout=\"recommended\"`). */\n bestValue: string\n /** Toggle of the other rates, `{n}` = how many. */\n moreOptions: string\n /** Title of the group of rates without a carrier. */\n otherCarriers: string\n /** The rates could not be quoted (`error`). */\n error: string\n retry: string\n}\n\nconst ES: DeliveryMessages = {\n etaOne: 'Llega en 1 día hábil',\n etaMany: 'Llega en {n} días hábiles',\n etaRange: 'Llega en {min} a {max} días hábiles',\n etaUpTo: 'Llega en máximo {max} días hábiles',\n etaFrom: 'Llega en {min} días hábiles o más',\n cheapest: 'Más económico',\n fastest: 'Más rápido',\n free: 'Gratis',\n pickupTitle: 'Recoger en {name}',\n quoteToday: 'Precios de envío vigentes hasta las {time}.',\n quoteTomorrow: 'Precios de envío vigentes hasta mañana a las {time}.',\n quoteLater: 'Precios de envío vigentes hasta el {date}.',\n quoteSoon: 'Los precios de envío vencen pronto ({time}).',\n partial: 'Algunas paqueterías no respondieron a tiempo; estas son las opciones disponibles.',\n loading: 'Buscando opciones de envío…',\n requoted: 'Las tarifas de envío cambiaron y ya están actualizadas. Revisa tu envío antes de pagar.',\n bestValue: 'Recomendado',\n moreOptions: 'Ver más opciones ({n})',\n otherCarriers: 'Otras opciones',\n error: 'No pudimos consultar las opciones de envío en este momento.',\n retry: 'Intentar de nuevo',\n}\n\nconst EN: DeliveryMessages = {\n etaOne: 'Arrives in 1 business day',\n etaMany: 'Arrives in {n} business days',\n etaRange: 'Arrives in {min} to {max} business days',\n etaUpTo: 'Arrives in up to {max} business days',\n etaFrom: 'Arrives in {min}+ business days',\n cheapest: 'Cheapest',\n fastest: 'Fastest',\n free: 'Free',\n pickupTitle: 'Pick up at {name}',\n quoteToday: 'Shipping prices valid until {time}.',\n quoteTomorrow: 'Shipping prices valid until tomorrow at {time}.',\n quoteLater: 'Shipping prices valid until {date}.',\n quoteSoon: 'Shipping prices expire soon ({time}).',\n partial: \"We couldn't reach every carrier. These are the options available now.\",\n loading: 'Looking for delivery options…',\n requoted: 'Shipping rates changed and are now up to date. Check your delivery before paying.',\n bestValue: 'Recommended',\n moreOptions: 'Show more options ({n})',\n otherCarriers: 'Other options',\n error: \"We couldn't get delivery options right now.\",\n retry: 'Try again',\n}\n\n/** Messages for a locale (`es*` default, `en*`), with optional overrides. */\nexport function deliveryMessages(locale?: string | null, overrides?: Partial<DeliveryMessages> | null): DeliveryMessages {\n const base = (locale ?? 'es-MX').toLowerCase().startsWith('en') ? EN : ES\n return overrides ? { ...base, ...overrides } : base\n}\n\n// A value that already ends in a period (\"9:39 p.m.\") does not get a second one from the template.\nconst fill = (tpl: string, vars: Record<string, string | number>) => tpl.replace(/\\{(\\w+)\\}/g, (_, k: string) => String(vars[k] ?? '')).replace(/\\.\\.$/, '.')\n\n/** Commercial carrier name of a rate (`fedex` → \"FedEx\"); `null` without carrier. */\nexport function rateCarrier(rate: Pick<ShippingRate, 'carrier'>): string | null {\n return brandName(rate.carrier)\n}\n\n/**\n * Service name without the carrier repeated: \"FedEx Express Saver\" with carrier `fedex` → \"Express Saver\". Falls back\n * to the title when stripping would leave nothing.\n */\nexport function rateService(rate: Pick<ShippingRate, 'title' | 'carrier'>): string {\n const title = rate.title.trim()\n const carrier = rateCarrier(rate)\n if (!carrier) return title\n for (const prefix of [carrier, rate.carrier ?? '']) {\n if (!prefix) continue\n if (title.toLowerCase().startsWith(prefix.toLowerCase())) {\n const rest = title.slice(prefix.length).replace(/^[\\s·:|-]+/, '')\n if (rest) return rest\n }\n }\n return title\n}\n\n/** Arrival time of a rate: business days from the provider, else the server `eta` text as is. */\nexport function rateEta(\n rate: Pick<ShippingRate, 'eta' | 'eta_days_min' | 'eta_days_max'>,\n messages: DeliveryMessages = ES,\n): string | null {\n const { eta_days_min: min, eta_days_max: max } = rate\n if (typeof min === 'number' && typeof max === 'number') {\n if (min === max) return min === 1 ? messages.etaOne : fill(messages.etaMany, { n: min })\n return fill(messages.etaRange, { min, max })\n }\n if (typeof max === 'number') return max === 1 ? messages.etaOne : fill(messages.etaUpTo, { max })\n if (typeof min === 'number') return min === 1 ? messages.etaOne : fill(messages.etaFrom, { min })\n return rate.eta ?? null\n}\n\nexport type RateBadge = 'cheapest' | 'fastest'\n\nconst costOf = (r: ShippingRate) => {\n const n = Number(r.cost.amount)\n return Number.isFinite(n) ? n : null\n}\nconst daysOf = (r: ShippingRate) => r.eta_days_max ?? r.eta_days_min ?? null\n\n/**\n * Badges per rate id. Only with two or more rates, only when one rate is strictly the cheapest (same currency) or\n * strictly the fastest: a tie gets no badge, so the badge always tells the buyer something.\n */\nexport function rateBadges(rates: readonly ShippingRate[]): Map<string, RateBadge[]> {\n const out = new Map<string, RateBadge[]>()\n if (rates.length < 2) return out\n const add = (id: string, b: RateBadge) => out.set(id, [...(out.get(id) ?? []), b])\n const unique = (values: Array<[string, number | null]>) => {\n const known = values.filter((v): v is [string, number] => v[1] !== null)\n if (known.length < 2) return null\n const min = Math.min(...known.map((v) => v[1]))\n const winners = known.filter((v) => v[1] === min)\n return winners.length === 1 ? winners[0]![0] : null\n }\n const currencies = new Set(rates.map((r) => r.cost.currency_code))\n if (currencies.size === 1) {\n const id = unique(rates.map((r) => [r.id, costOf(r)]))\n if (id) add(id, 'cheapest')\n }\n const fast = unique(rates.map((r) => [r.id, daysOf(r)]))\n if (fast) add(fast, 'fastest')\n return out\n}\n\n/** Earliest `expires_at` of the rates (the deadline of the whole list), or `null`. */\nexport function quoteDeadline(rates: readonly Pick<ShippingRate, 'expires_at'>[]): Date | null {\n let best: Date | null = null\n for (const r of rates) {\n if (!r.expires_at) continue\n const d = new Date(r.expires_at)\n if (Number.isNaN(d.getTime())) continue\n if (!best || d < best) best = d\n }\n return best\n}\n\nexport type QuoteNote = { text: string; soon: boolean }\n\n/**\n * One human note for the quote deadline, in the buyer's time zone (or `timeZone`): \"valid until 9:39 p.m.\", \"until\n * tomorrow at…\", \"until Oct 24, …\", or \"expire soon\" within `soonMinutes` (default 15). `null` when already past.\n */\nexport function quoteNote(\n deadline: Date | null,\n opts: { locale?: string; now?: Date; timeZone?: string; soonMinutes?: number; messages?: DeliveryMessages } = {},\n): QuoteNote | null {\n if (!deadline) return null\n const now = opts.now ?? new Date()\n const left = deadline.getTime() - now.getTime()\n if (left <= 0) return null\n const m = opts.messages ?? ES\n const locale = opts.locale ?? 'es-MX'\n const tz = opts.timeZone ? { timeZone: opts.timeZone } : {}\n const time = new Intl.DateTimeFormat(locale, { hour: 'numeric', minute: '2-digit', ...tz }).format(deadline)\n if (left <= (opts.soonMinutes ?? 15) * 60_000) return { text: fill(m.quoteSoon, { time }), soon: true }\n const day = (d: Date) => new Intl.DateTimeFormat('en-CA', { year: 'numeric', month: '2-digit', day: '2-digit', ...tz }).format(d)\n if (day(deadline) === day(now)) return { text: fill(m.quoteToday, { time }), soon: false }\n if (day(deadline) === day(new Date(now.getTime() + 86_400_000))) return { text: fill(m.quoteTomorrow, { time }), soon: false }\n const date = new Intl.DateTimeFormat(locale, { day: 'numeric', month: 'short', hour: 'numeric', minute: '2-digit', ...tz }).format(deadline)\n return { text: fill(m.quoteLater, { date }), soon: false }\n}\n\n/** Error codes a server uses (or will use) when the chosen rate is no longer quotable. */\nconst QUOTE_CODES = new Set(['quote_expired', 'rate_expired', 'rate_changed', 'rate_unavailable', 'rate_not_found', 'stale_rate', 'invalid_rate'])\n\n/**\n * `true` when saving a shipping rate failed because the quote expired or the rates changed, so the shop should reload\n * the rates (and keep the address) instead of showing a generic failure. Recognizes the explicit codes\n * (`quote_expired`, `rate_expired`…, any status), a `409`, and the generic `422` on the rate field that older servers\n * answer when the provider re-quoted with new ids. 5xx and other 4xx stay real failures.\n */\nexport function isQuoteChange(err: { status?: number; code?: string | null; field?: string | null } | null | undefined): boolean {\n if (!err) return false\n if (err.code && QUOTE_CODES.has(err.code)) return true\n if (err.status === 409) return true\n return err.status === 422 && (err.field === 'rate_id' || err.field === 'delivery' || err.field === 'delivery.rate_id' || !err.field)\n}\n\n/**\n * The rate of a fresh quote that matches the one the buyer had chosen (same carrier and service), so a re-quote keeps\n * the choice even though the provider issued new ids. `null` when that service is no longer offered.\n */\nexport function matchRate<R extends Pick<ShippingRate, 'id' | 'carrier' | 'service_code' | 'title'>>(previous: Pick<ShippingRate, 'carrier' | 'service_code' | 'title'> | null | undefined, rates: readonly R[]): R | null {\n if (!previous) return null\n const norm = (s: string | null | undefined) => (s ?? '').trim().toLowerCase()\n const sameCarrier = (r: R) => norm(r.carrier) === norm(previous.carrier)\n if (previous.service_code) {\n const hit = rates.find((r) => sameCarrier(r) && norm(r.service_code) === norm(previous.service_code))\n if (hit) return hit\n }\n return rates.find((r) => sameCarrier(r) && norm(r.title) === norm(previous.title)) ?? null\n}\n","import { useMemo, useSyncExternalStore, type CSSProperties, type ReactNode } from 'react'\nimport { formatMoney, type Money, type PickupOption, type ShippingRate } from '@asteby/storefront'\nimport { useResolvedLocale } from '../locale.js'\nimport { BrandMark } from './brand-mark.js'\nimport { flatRates, recommendRates, type RateTag } from './recommend.js'\nimport {\n deliveryMessages,\n quoteDeadline,\n quoteNote,\n rateBadges,\n rateCarrier,\n rateEta,\n rateService,\n type DeliveryMessages,\n type RateBadge,\n} from './delivery.js'\n\nexport type DeliveryOptionsClassNames = Partial<\n Record<\n | 'root'\n | 'option'\n | 'radio'\n | 'mark'\n | 'body'\n | 'title'\n | 'carrier'\n | 'service'\n | 'eta'\n | 'badges'\n | 'badge'\n | 'price'\n | 'free'\n | 'note'\n | 'partial'\n | 'skeleton'\n | 'more'\n | 'moreSummary'\n | 'group'\n | 'groupTitle'\n | 'error'\n | 'retry',\n string\n >\n>\n\nexport type DeliveryOptionsProps = {\n rates: readonly ShippingRate[]\n pickup?: readonly PickupOption[]\n /** Radio group name. Default `delivery_choice`. */\n name?: string\n /** Form value of a rate. Default `rate:<id>`. */\n rateValue?: (rate: ShippingRate) => string\n /** Form value of a pickup branch. Default `pickup:<branch_id>`. */\n pickupValue?: (branch: PickupOption) => string\n /** Uncontrolled preselection. Default: the first rate. `null`: nothing preselected. */\n defaultValue?: string | null\n /** Controlled value (use with `onValueChange`). */\n value?: string\n onValueChange?: (value: string) => void\n /** Some provider did not answer (`DeliveryOptions.partial`): one neutral note above the list. */\n partial?: boolean\n /** The previous quote expired or changed and these rates are fresh: one status note above the list. */\n requoted?: boolean\n /** Rates are being quoted again: skeleton rows (no rates yet) or the current rows dimmed, `aria-busy`. */\n loading?: boolean\n /** Quote deadline note: `always` (default), only when it is `soon`, or `never`. */\n quoteNote?: 'always' | 'soon' | 'never'\n /** Time zone of the note. Default: the buyer's browser. */\n timeZone?: string\n /** Show the carrier marks. Default true. */\n marks?: boolean\n /** Cheapest / fastest badges. Default true. */\n badges?: boolean\n required?: boolean\n locale?: string\n messages?: Partial<DeliveryMessages>\n renderAmount?: (amount: Money) => ReactNode\n classNames?: DeliveryOptionsClassNames\n /**\n * `list` (default): every rate, as the server orders them. `recommended`: up to `recommendedCount` rates (cheapest,\n * fastest and the best balance, tagged) and the rest under \"Show more options (N)\", grouped by carrier so the carrier\n * name is not repeated on every row. Repeated services are dropped (the cheapest stays). Works without JavaScript\n * (`<details>`); it opens by itself when the chosen rate is inside. `flat`: ONE plain list like most online shops:\n * every service ordered from the lowest to the highest price, repeated services dropped (the cheapest stays), the\n * cheapest / fastest / recommended tags on the rows that earn them, no `<details>` and no groups. The chosen rate is\n * always listed, and with no explicit default the preselected row is the first one (the cheapest).\n */\n layout?: 'list' | 'recommended' | 'flat'\n /** Rates recommended in `layout=\"recommended\"`. Default 3. */\n recommendedCount?: number\n /**\n * The rates could not be quoted (provider down, timeout): one friendly alert instead of the list, with a retry button\n * when `onRetry` is set. `true` uses the default text; a string replaces it.\n */\n error?: boolean | string\n onRetry?: () => void\n /** `data-testid` of every radio. */\n testId?: string\n /** Rows the shop renders before the rates (e.g. \"home delivery, rates after the address\"). */\n children?: ReactNode\n}\n\nconst SR_ONLY: CSSProperties = { position: 'absolute', width: 1, height: 1, overflow: 'hidden', clip: 'rect(0 0 0 0)', whiteSpace: 'nowrap' }\n\nconst useHydrated = () =>\n useSyncExternalStore(\n () => () => {},\n () => true,\n () => false,\n )\n\nfunction PickupGlyph({ size = 24 }: { size?: number }) {\n return (\n <svg viewBox=\"0 0 48 32\" width={Math.round(size * 1.5)} height={size} aria-hidden=\"true\" focusable=\"false\" style={{ flex: 'none' }} data-sf-brand-mark=\"pickup\">\n <rect x=\"0.5\" y=\"0.5\" width=\"47\" height=\"31\" rx=\"5\" fill=\"var(--sf-brand-mark-bg, #E7E9EE)\" stroke=\"var(--sf-brand-mark-ring, rgb(127 127 127 / 0.35))\" />\n <path d=\"M15 13.5 17 9h14l2 4.5M15 13.5h18M15 13.5V23h18v-9.5M21 23v-5h6v5\" fill=\"none\" stroke=\"var(--sf-brand-mark-fg, #2B2F38)\" strokeWidth=\"1.8\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\n/**\n * The rates and pickup branches of \"Delivery\" as native radios: carrier mark and commercial name, readable service,\n * arrival time, cheapest / fastest badges, price as the server sends it, and ONE note for the quote deadline in the\n * buyer's time zone. Works without JavaScript (plain radios in the page form); the note appears after hydration in a\n * reserved line, so it never shifts the layout.\n *\n * Wrap it in the shop's own `<fieldset><legend>`. Style it with `classNames` and/or the default sheet\n * `@asteby/storefront-react/checkout.css`.\n */\nexport function DeliveryOptions(props: DeliveryOptionsProps) {\n const {\n rates,\n pickup = [],\n name = 'delivery_choice',\n rateValue = (r) => `rate:${r.id}`,\n pickupValue = (b) => `pickup:${b.branch_id}`,\n value,\n onValueChange,\n partial = false,\n requoted = false,\n loading = false,\n timeZone,\n marks = true,\n badges: showBadges = true,\n required = true,\n renderAmount,\n classNames: cx = {},\n testId,\n children,\n layout = 'list',\n error,\n onRetry,\n } = props\n const locale = useResolvedLocale(props.locale)\n const m = useMemo(() => deliveryMessages(locale, props.messages), [locale, props.messages])\n const hydrated = useHydrated()\n const badges = useMemo(() => (showBadges ? rateBadges(rates) : new Map<string, RateBadge[]>()), [rates, showBadges])\n const flat = useMemo(\n () => (layout === 'flat' ? flatRates(rates, { count: props.recommendedCount ?? 3, keepId: value ? rates.find((r) => rateValue(r) === value)?.id ?? null : null }) : null),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [layout, rates, props.recommendedCount, value],\n )\n const firstRate = flat ? flat[0]?.rate : rates[0]\n const firstValue = firstRate ? rateValue(firstRate) : null\n const defaultValue = props.defaultValue === undefined ? firstValue : props.defaultValue\n const amount = (money: Money) => (Number(money.amount) === 0 ? <span className={cx.free} data-sf-delivery-free>{m.free}</span> : renderAmount ? renderAmount(money) : formatMoney(money, locale))\n const mode = props.quoteNote ?? 'always'\n const deadline = mode === 'never' ? null : quoteDeadline(rates)\n const note = hydrated && deadline ? quoteNote(deadline, { locale, messages: m, ...(timeZone ? { timeZone } : {}) }) : null\n const shownNote = note && (mode === 'always' || note.soon) ? note : null\n\n const current = value ?? defaultValue ?? null\n const plan = useMemo(\n () => (layout === 'recommended' ? recommendRates(rates, { count: props.recommendedCount ?? 3 }) : null),\n [layout, rates, props.recommendedCount],\n )\n const inMore = plan ? plan.more.some((g) => g.rates.some((r) => rateValue(r) === current)) : false\n\n const radio = (v: string, describedBy?: string) => (\n <input\n type=\"radio\"\n name={name}\n value={v}\n required={required}\n className={cx.radio}\n {...(describedBy ? { 'aria-describedby': describedBy } : {})}\n {...(value !== undefined ? { checked: value === v, onChange: () => onValueChange?.(v) } : { defaultChecked: v === defaultValue, ...(onValueChange ? { onChange: () => onValueChange(v) } : {}) })}\n {...(testId ? { 'data-testid': testId } : {})}\n />\n )\n\n const tagText = (t: RateTag | RateBadge) => (t === 'cheapest' ? m.cheapest : t === 'fastest' ? m.fastest : m.bestValue)\n\n /** One row: [radio] [mark] carrier + service / arrival / tags ........ price. In a carrier group the mark and the carrier name live in the group title. */\n const rateRow = (rate: ShippingRate, opts: { tags: readonly (RateTag | RateBadge)[]; grouped?: boolean }) => {\n const carrier = rateCarrier(rate)\n const service = rateService(rate)\n const eta = rateEta(rate, m)\n return (\n <label key={rate.id} className={cx.option} data-sf-delivery-option data-loading={loading || undefined} data-grouped={opts.grouped || undefined}>\n {radio(rateValue(rate))}\n {marks && !opts.grouped ? (\n // Fixed slot: logos of different widths do not push the text column out of line.\n <span data-sf-delivery-mark aria-hidden=\"true\">\n <BrandMark brand={rate.carrier ?? rate.provider ?? rate.title} size={28} {...(cx.mark ? { className: cx.mark } : {})} />\n </span>\n ) : null}\n <span className={cx.body} data-sf-delivery-body>\n <span className={cx.title} data-sf-delivery-title>\n {carrier ? (\n opts.grouped ? (\n <>\n {/* The group title already shows the carrier: only screen readers hear it again (each radio keeps a full name). */}\n <span style={SR_ONLY}>{carrier} </span>\n <span className={cx.carrier} data-sf-delivery-carrier data-sf-delivery-service-only>\n {service}\n </span>\n </>\n ) : (\n <>\n <span className={cx.carrier} data-sf-delivery-carrier>\n {carrier}\n </span>{' '}\n <span className={cx.service} data-sf-delivery-service>\n {service}\n </span>\n </>\n )\n ) : (\n <span className={cx.carrier} data-sf-delivery-carrier>\n {service}\n </span>\n )}\n </span>\n {eta ? (\n <span className={cx.eta} data-sf-delivery-eta>\n {eta}\n </span>\n ) : null}\n {opts.tags.length ? (\n <span className={cx.badges} data-sf-delivery-badges>\n {opts.tags.map((b) => (\n <span key={b} className={cx.badge} data-sf-delivery-badge={b}>\n {tagText(b)}\n </span>\n ))}\n </span>\n ) : null}\n </span>\n <span className={cx.price} data-sf-delivery-price>\n {amount(rate.cost)}\n </span>\n </label>\n )\n }\n\n const errorText = error ? (typeof error === 'string' ? error : m.error) : null\n\n return (\n <div className={cx.root} data-sf-delivery data-layout={layout} aria-busy={loading || undefined}>\n {partial && !errorText ? (\n <p role=\"status\" className={cx.partial} data-sf-delivery-partial>\n {m.partial}\n </p>\n ) : null}\n {requoted ? (\n <p role=\"status\" className={cx.partial} data-sf-delivery-requoted>\n {m.requoted}\n </p>\n ) : null}\n {loading ? (\n <span style={SR_ONLY} role=\"status\" data-sf-delivery-loading>\n {m.loading}\n </span>\n ) : null}\n {errorText && rates.length === 0 && !loading ? (\n <div role=\"alert\" className={cx.error} data-sf-delivery-error>\n <p>{errorText}</p>\n {onRetry ? (\n <button type=\"button\" className={cx.retry} onClick={onRetry} data-sf-delivery-retry>\n {m.retry}\n </button>\n ) : null}\n </div>\n ) : null}\n {children}\n {loading && rates.length === 0\n ? [0, 1, 2].map((i) => <div key={i} className={cx.skeleton} data-sf-delivery-skeleton aria-hidden=\"true\" />)\n : null}\n {flat\n ? flat.map(({ rate, tags }) => rateRow(rate, { tags: showBadges ? tags : [] }))\n : plan\n ? plan.recommended.map(({ rate, tags }) => rateRow(rate, { tags: showBadges ? tags : [] }))\n : rates.map((rate) => rateRow(rate, { tags: badges.get(rate.id) ?? [] }))}\n {plan && plan.moreCount > 0 ? (\n <details className={cx.more} data-sf-delivery-more {...(inMore ? { open: true } : {})}>\n <summary className={cx.moreSummary} data-sf-delivery-more-summary>\n {m.moreOptions.replace('{n}', String(plan.moreCount))}\n </summary>\n <div data-sf-delivery-groups>\n {plan.more.map((g) => {\n const carrierName = g.carrier ? rateCarrier({ carrier: g.carrier }) : null\n const id = `${name}-group-${g.key || 'other'}`\n return (\n <div key={g.key || 'other'} role=\"group\" aria-labelledby={id} className={cx.group} data-sf-delivery-group={g.key || 'other'}>\n <p id={id} className={cx.groupTitle} data-sf-delivery-group-title>\n {marks && g.carrier ? <BrandMark brand={g.carrier} size={22} /> : null}\n <span>{carrierName ?? m.otherCarriers}</span>\n </p>\n {g.rates.map((rate) => rateRow(rate, { tags: [], grouped: Boolean(carrierName) }))}\n </div>\n )\n })}\n </div>\n </details>\n ) : null}\n {pickup.map((b) => (\n <label key={b.branch_id} className={cx.option} data-sf-delivery-option data-sf-delivery-pickup>\n {radio(pickupValue(b))}\n {marks ? <PickupGlyph size={28} /> : null}\n <span className={cx.body} data-sf-delivery-body>\n <span className={cx.title} data-sf-delivery-title>\n <span className={cx.carrier} data-sf-delivery-carrier>\n {m.pickupTitle.replace('{name}', b.name)}\n </span>\n </span>\n {b.address || b.city ? (\n <span className={cx.eta} data-sf-delivery-eta>\n {[b.address, b.city].filter(Boolean).join(', ')}\n </span>\n ) : null}\n </span>\n <span className={cx.price} data-sf-delivery-price>\n <span className={cx.free} data-sf-delivery-free>\n {m.free}\n </span>\n </span>\n </label>\n ))}\n {deadline ? (\n <p className={cx.note} data-sf-delivery-note data-soon={shownNote?.soon || undefined} aria-live=\"polite\">\n {shownNote?.text ?? ''}\n </p>\n ) : null}\n </div>\n )\n}\n"]}