@anker-in/shopify-react 0.1.1-beta.6 → 0.1.1-beta.8

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/provider/context.ts","../../src/provider/use-shopify.ts","../../src/hooks/cart/types/auto-free-gift.ts","../../src/hooks/cart/const.ts","../../src/hooks/cart/utils/normalize-add-to-cart-lines.ts","../../src/hooks/cart/utils/index.ts","../../src/hooks/cart/utils/auto-free-gift.ts","../../src/hooks/cart/feature/use-calc-auto-free-gift.ts","../../src/hooks/cart/feature/use-script-auto-free-gift.ts","../../src/provider/cart-context.tsx","../../src/hooks/cart/use-create-cart.ts","../../src/hooks/cart/use-add-cart-lines.ts","../../src/tracking/ga.ts","../../src/tracking/fbq.ts","../../src/hooks/cart/use-apply-cart-codes.ts","../../src/hooks/cart/use-remove-cart-codes.ts","../../src/hooks/cart/use-add-to-cart.ts","../../src/hooks/cart/use-update-cart-lines.ts","../../src/hooks/cart/use-remove-cart-lines.ts","../../src/hooks/cart/use-update-cart-attributes.ts","../../src/hooks/cart/use-buy-now.ts","../../src/hooks/cart/feature/use-calc-gifts-from-lines.ts","../../src/hooks/cart/types/order-discount.ts","../../src/hooks/cart/feature/use-calc-order-discount.ts","../../src/hooks/member/plus/use-has-plus-member-in-cart.ts","../../src/hooks/cart/feature/use-cart-attributes.ts","../../src/hooks/cart/feature/use-cart-item-quantity-limit.ts","../../src/hooks/cart/feature/use-update-line-code-amount-attributes.ts","../../src/hooks/cart/types/price-discount.ts","../../src/hooks/product/use-product.ts","../../src/hooks/product/use-all-products.ts","../../src/hooks/product/use-products-by-handles.ts","../../src/hooks/product/use-variant.ts","../../src/hooks/product/use-price.ts","../../src/hooks/product/use-selected-options.ts","../../src/hooks/product/use-product-url.ts","../../src/hooks/product/use-update-variant-query.ts","../../src/hooks/product/use-variant-media.ts","../../src/hooks/collection/use-collection.ts","../../src/hooks/collection/use-all-collections.ts","../../src/hooks/collection/use-collections.ts","../../src/hooks/blog/use-blog.ts","../../src/hooks/blog/use-all-blogs.ts","../../src/hooks/blog/use-article.ts","../../src/hooks/blog/use-articles.ts","../../src/hooks/blog/use-articles-in-blog.ts","../../src/hooks/search/use-search.ts","../../src/hooks/site/use-site.ts","../../src/hooks/member/plus/types.ts","../../src/hooks/member/plus/context.tsx","../../src/hooks/member/plus/use-plus-member-context.ts","../../src/hooks/member/plus/use-plus-monthly-product-variant.ts","../../src/hooks/member/plus/use-plus-annual-product-variant.ts","../../src/hooks/member/plus/use-shipping-methods.ts","../../src/hooks/member/plus/use-shipping-method-available-check.ts","../../src/hooks/member/plus/use-replace-cart-plus-member.ts","../../src/hooks/member/plus/use-plus-member-delivery-codes.ts","../../src/hooks/member/plus/use-plus-member-item-custom-attributes.ts","../../src/hooks/member/plus/use-plus-member-checkout-custom-attributes.ts","../../src/hooks/member/plus/use-auto-remove-plus-member-in-cart.ts","../../src/hooks/member/plus/use-add-plus-member-products-to-cart.ts","../../src/hooks/member/plus/provider.tsx","../../src/hooks/dom/use-intersection.ts","../../src/hooks/dom/use-exposure.ts","../../src/hooks/geo/use-geo-location.ts"],"names":["RuleType","BuyRuleType","SpendMoneyType","attr","newAttr","product","Cookies","Decimal","useMemo","useRef","upgrade_multiple","upgrade_value","useSWR","getProductsByHandles","createContext","useContext","useCallback","updateCartCodes","useSWRMutation","variant","addCartLines","createCart","OrderDiscountType","OrderBasePriceType","useState","useEffect","useRequest","updateCartLines","PriceDiscountType","PriceBasePriceType","decodeShopifyId","PLUS_MEMBER_TYPE","PlusMemberMode","DeliveryPlusType","ShippingMethodMode","removeCartLines","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["import { createContext } from 'react'\nimport type { ShopifyClient, ShopifyConfig } from '@anker-in/shopify-sdk'\nimport type {\n CookieAdapter,\n RouterAdapter,\n UserContextAdapter,\n CartCookieAdapter,\n} from '../adapters'\n\nexport interface ShopifyContextValue {\n client: ShopifyClient\n config: ShopifyConfig\n locale: string\n locales?: string[]\n cookieAdapter: CookieAdapter\n cartCookieAdapter: CartCookieAdapter\n routerAdapter?: RouterAdapter\n userAdapter?: UserContextAdapter\n}\n\nexport const ShopifyContext = createContext<ShopifyContextValue | null>(null)\n","import { useContext } from 'react'\nimport { ShopifyContext } from './context'\n\n/**\n * Hook to access Shopify context\n * @throws Error if used outside ShopifyProvider\n */\nexport function useShopify() {\n const context = useContext(ShopifyContext)\n\n if (!context) {\n throw new Error('useShopify must be used within a ShopifyProvider')\n }\n\n return context\n}\n","import type {\n NormalizedLineItem,\n NormalizedProduct,\n NormalizedProductVariant,\n} from '@anker-in/shopify-sdk'\n\nexport type AutoFreeGift = {\n currentTier: {\n amount: number\n gift?: NormalizedProductVariant\n }\n nextTierGoal: {\n amount: number\n gift?: NormalizedProductVariant\n }\n}\n\nexport type DiscountLabel = {\n cart_checkout_label: string\n product_label: string\n sold_out_label: string\n}\n\nexport type AutoFreeGiftMainProduct = {\n spend_money_type: number\n variant_id_list: string[]\n all_store_variant: boolean\n}\n\nexport type GiftProduct = {\n spend_sum_money: number\n gift_type: number\n reward_list: {\n get_unit: number\n variant_id: string\n bak_variant_id_list: null\n }[]\n}\n\nexport type AutoFreeGiftConfig = Config[]\n\n// 定义规则条件类型\nexport type RuleCondition = {\n with_special_url_params: string[] // 包含特殊URL参数\n without_special_url_params: string[] // 不包含特殊URL参数\n with_user_tags: string[] // 包含用户标签\n without_user_tags: string[] // 不包含用户标签\n}\n\n// main_product\nexport type MainProductInfo = {\n spend_money_type: SpendMoneyType\n variant_list: VariantItem[]\n all_store_variant: boolean\n}\n\n// 定义配置类型 - 根据JSON结构更新\nexport type Config = {\n // 规则ID\n rule_id: number\n // 规则类型\n rule_type: RuleType\n // 折扣标签\n discount_label: {\n cart_checkout_label: string\n product_label: string\n sold_out_label: string\n }\n // 前端标签\n frontend_labels: { key: string; label: string; desc: string }[]\n // 应用单位\n apply_unit: number\n // 规则结果\n rule_result: {\n // 购买规则类型\n buy_rule_type: BuyRuleType\n // 花费获取奖励\n spend_get_reward: {\n // 主产品\n main_product: MainProductInfo\n // 礼品产品\n gift_product: GiftProductItem[]\n }\n // 买赠奖励\n buy_get_reward: {\n // 主产品\n main_product: MainProductInfo\n // 礼品产品\n gift_product: GiftProductItem[] | null\n }\n }\n // 规则条件\n rule_conditions?: RuleCondition[]\n}\n\nexport interface GiftTier {\n spend_sum_money: number // 消费门槛金额\n gift_type: number // 礼品类型\n reward_list: RewardItem[] // 满足此门槛后可获得的奖励列表\n}\n\nexport interface RewardItem {\n get_unit: number // 获得单位\n variant_list: VariantItem[] // 变体列表\n}\n\nexport interface VariantItem {\n variant_id: string // 变体ID\n sku: string // 库存单位\n handle: string // 处理标识\n discount_value: number // 折扣值\n}\n\nexport interface GiftProductItem {\n spend_sum_money: number // 消费总金额\n gift_type: number // 礼品类型\n reward_list: RewardItem[] // 奖励列表\n}\n\nexport enum RuleType {\n AUTO_FREE_GIFT = 1, // 自动赠品\n BUNDLE = 2, // 组合\n VOLUME_DISCOUNT = 3, // 量价折扣\n ORDER_DISCOUNT = 4, // 订单折扣\n PRICE_DISCOUNT = 5, // 价格折扣\n}\n\nexport enum BuyRuleType {\n BUY_GET_GIFT = 1, // 买赠\n SPEND_GET_GIFT = 2, // 满赠\n}\n\nexport enum SpendMoneyType {\n ORIGIN_PRICE = 1, // 原价\n DISCOUNT_PRICE = 2, // 折扣价\n}\n\n// calcAutoFreeGift\n// 计算型 Hook 的返回类型\nexport interface FunctionGiftResult {\n qualifyingGift: FormattedGift | null // 当前应得的赠品\n nextTierGoal: GiftTier | null // 下一个目标阶梯\n activeCampaign: Config | null // 当前生效的活动配置\n isLoading: boolean // 依赖数据是否加载中\n giftProductsResult?: NormalizedProduct[] | []\n}\n\n// 格式化后的赠品信息,用于添加购物车\nexport interface FormattedGift {\n tier: GiftTier // 原始阶梯信息\n itemsToAdd: CartLineInput[] // 准备好添加购物车的商品列表\n}\n\n// 购物车行项目输入类型 (Shopify API)\nexport interface CartLineInput {\n variant: {\n id: string\n handle: string\n sku: string\n }\n quantity: number\n attributes: { key: string; value: string }[]\n}\n\n// cart context AutoFreeGift\nexport type AutoFreeGiftItem = {\n line: NormalizedLineItem\n isSoldOut: boolean\n}\n\nexport type AutoFreeGiftList = AutoFreeGiftItem[] | []\n","import { SWRMutationConfiguration } from 'swr/mutation'\n\nexport const currencyCodeMapping = {\n us: 'USD',\n ca: 'CAD',\n gb: 'GBP',\n eu: 'EUR',\n au: 'AUD',\n nz: 'NZD',\n de: 'EUR',\n fr: 'EUR',\n es: 'EUR',\n it: 'EUR',\n nl: 'EUR',\n pl: 'EUR',\n ro: 'EUR',\n} as Record<string, string>\n\nexport const defaultSWRMutationConfiguration: SWRMutationConfiguration<any, any, any, any, any> & {\n throwOnError?: boolean\n} = {\n throwOnError: false,\n}\n\n// Shopify 常量定义\nexport const CUSTOMER_ATTRIBUTE_KEY = '_discounts_function_env'\nexport const CUSTOMER_SCRIPT_GIFT_KEY = '_giveaway_gradient_gifts'\n\nexport const CODE_AMOUNT_KEY = '_sku_code_money'\nexport const SCRIPT_CODE_AMOUNT_KEY = '_code_money'\n\n// 主产品公开 code\nexport const MAIN_PRODUCT_CODE = ['WS24', 'WSTD', 'WS7D', 'WSCP', 'WSPE', 'WSPD']\n","import type { NormalizedLineItem } from '@anker-in/shopify-sdk'\nimport type { AddToCartLineItem } from '../use-add-to-cart'\n\n/**\n * Normalize AddToCartLineItem[] to NormalizedLineItem[] format\n * This is used to calculate gifts from lines before they are added to cart\n */\nexport function normalizeAddToCartLines(lines: AddToCartLineItem[]): NormalizedLineItem[] {\n return lines\n .filter((line) => line.variant?.id)\n .map((line, index) => {\n const variant = line.variant!\n const product = variant.product\n const quantity = line.quantity || 1\n\n // Calculate prices\n const price = variant.finalPrice?.amount\n ? Number(variant.finalPrice.amount)\n : variant.compareAtPrice?.amount\n ? Number(variant.compareAtPrice.amount)\n : variant.price?.amount\n ? Number(variant.price.amount)\n : 0\n\n const subtotalAmount = price * quantity\n const totalAmount = subtotalAmount // No discounts before adding to cart\n\n return {\n id: `temp-line-${index}-${variant.id}`, // Temporary ID for pre-cart lines\n name: product?.title || variant.title || '',\n quantity,\n variantId: variant.id,\n productId: product?.id || variant.id.split('/').slice(0, -2).join('/'),\n totalAmount,\n subtotalAmount,\n discountAllocations: [],\n customAttributes: line.attributes || [],\n variant: {\n id: variant.id,\n price,\n listPrice: variant.compareAtPrice?.amount ? Number(variant.compareAtPrice.amount) : 0,\n sku: variant.sku || '',\n name: variant.title || '',\n image: variant.image\n ? {\n url: variant.image.url,\n altText: variant.image.altText || undefined,\n }\n : undefined,\n requiresShipping: false, // Default value, not available in NormalizedProductVariant\n availableForSale: variant.availableForSale ?? true,\n quantityAvailable: variant.quantityAvailable ?? 0,\n currentlyNotInStock: false, // Default value, will be updated when added to cart\n weight: variant.weight,\n metafields: variant.metafields,\n },\n product: product,\n path: product?.handle ? `/products/${product.handle}` : '',\n discounts: [],\n options: variant.selectedOptions?.map((opt: any) => ({\n name: opt.name,\n value: opt.value,\n })),\n }\n })\n}\n\n/**\n * Create a mock cart structure from AddToCartLineItem[]\n * This is useful for calculating gifts before actual cart operations\n */\nexport function createMockCartFromLines(lines: AddToCartLineItem[], existingCart?: any): any {\n const normalizedLines = normalizeAddToCartLines(lines)\n\n const subtotalPrice = normalizedLines.reduce((sum, line) => sum + line.subtotalAmount, 0)\n\n const totalPrice = normalizedLines.reduce((sum, line) => sum + line.totalAmount, 0)\n\n return {\n id: existingCart?.id || 'temp-cart-id',\n customerId: existingCart?.customerId,\n email: existingCart?.email,\n createdAt: existingCart?.createdAt || new Date().toISOString(),\n currency: existingCart?.currency || { code: 'USD' },\n taxesIncluded: existingCart?.taxesIncluded,\n lineItems: normalizedLines,\n totallineItemsDiscount: 0,\n orderDiscounts: 0,\n lineItemsSubtotalPrice: subtotalPrice,\n subtotalPrice,\n totalPrice,\n totalTaxAmount: 0,\n discountCodes: existingCart?.discountCodes || [],\n discountAllocations: [],\n url: existingCart?.url || '',\n ready: true,\n customAttributes: existingCart?.customAttributes,\n }\n}\n","export const getQuery = (): Record<string, string> => {\n const url = typeof window !== 'undefined' ? window.location.search : ''\n const theRequest: Record<string, string> = {}\n if (url.indexOf('?') != -1) {\n const str = url.substr(1),\n strs = str.split('&')\n for (let i = 0; i < strs.length; i++) {\n const parts = strs[i]?.split('=')\n const key = parts?.[0]\n const value = parts?.[1]\n if (key && value) {\n theRequest[key] = decodeURIComponent(value)\n }\n }\n }\n return theRequest\n}\n\nexport function atobID(id: string) {\n if (id && typeof id === 'string' && id.includes('/')) {\n return id.split('/').pop()?.split('?')?.shift()\n } else {\n return id\n }\n}\n\nexport function btoaID(id: string, type: 'ProductVariant' | 'Product' = 'ProductVariant') {\n return `gid://shopify/${type}/${id}`\n}\n\n// Export normalize utilities\nexport * from './normalize-add-to-cart-lines'\n","import {\n AutoFreeGiftMainProduct,\n SpendMoneyType,\n RuleCondition,\n FormattedGift,\n} from '../types/auto-free-gift'\nimport { CUSTOMER_ATTRIBUTE_KEY } from '../const'\nimport { atobID } from './index'\nimport type { UseScriptAutoFreeGiftResult } from '../feature/use-script-auto-free-gift'\nimport Cookies from 'js-cookie'\nimport Decimal from 'decimal.js'\nimport { getQuery } from './index'\nimport { Attribute, NormalizedProduct } from '@anker-in/shopify-sdk'\n\nexport const getMatchedMainProductSubTotal = (\n cartData: any,\n variant_list: AutoFreeGiftMainProduct['variant_id_list'],\n main_product: AutoFreeGiftMainProduct\n) => {\n const isAllStoreVariant = main_product?.all_store_variant ?? false\n const matchedList = cartData?.lineItems?.filter((line: any) => {\n // 包含在主商品列表中\n const { is_gift } = getDiscountEnvAttributeValue(line.customAttributes) // 获取折扣环境属性值\n return isAllStoreVariant\n ? !is_gift\n : variant_list?.find((item: any) => {\n return !is_gift && atobID(line.variantId) === item\n })\n })\n return (\n matchedList?.reduce((acc: number, line: any) => {\n return (\n acc +\n (main_product?.spend_money_type === SpendMoneyType.ORIGIN_PRICE\n ? Number(line.subtotalAmount) || 0\n : Number(line.totalAmount) || 0)\n )\n }, 0) || 0 // 计算总金额\n )\n}\n\nexport const safeParse = (str: string) => {\n try {\n return JSON.parse(str)\n } catch (err) {\n return {}\n }\n}\n\nexport const getDiscountEnvAttributeValue = (\n // 函数接受一个名为 attributes 的参数,其类型为包含 key 和 value 字符串属性的对象数组,默认值为空数组\n attributes: { key: string; value: string }[] = []\n) => {\n // 在 attributes 数组中查找 key 值等于 CUSTOMER_ATTRIBUTE_KEY 的对象,并将其赋值给 attr 变量\n const attr = attributes.find((attr) => attr.key === CUSTOMER_ATTRIBUTE_KEY)\n // 尝试解析 attr 对象的 value 属性为 JSON,如果解析失败或 attr 不存在,则返回一个空对象\n return safeParse(attr?.value ?? '') ?? {}\n}\n\nexport const checkAttributesUpdateNeeded = (\n oldAttributes: Attribute[],\n newAttributes: Attribute[],\n customAttributesNeedRemove: { key: string }[]\n) => {\n // 判断是否需要更新 attributes,需要更新的场景有:\n // 1. 有新的 attribute\n // 2. 有旧的 attribute 的 value 发生变化\n // 3. 有需要删除的 attribute, 且旧 attributes 中存在该 key\n return (\n oldAttributes.some((attr) => {\n const newAttr = newAttributes.find((newAttr) => newAttr.key === attr.key)\n return newAttr ? newAttr.value !== attr.value : true\n }) ||\n newAttributes.some((attr) => !oldAttributes.some((oldAttr) => oldAttr.key === attr.key)) ||\n customAttributesNeedRemove.some((removeAttr) =>\n oldAttributes.some((oldAttr) => oldAttr.key === removeAttr.key)\n )\n )\n}\n\n/**\n * 检查 source 数组是否包含 requiredItems 数组中的所有元素。\n * @param source - 源数据数组,例如用户的标签列表。\n * @param requiredItems - 必须包含的项的数组。\n * @returns boolean\n */\nconst containsAll = (source: string[], requiredItems: string[] = []): boolean => {\n // 如果没有必须包含的项,则条件默认满足。\n if (!requiredItems?.length) return true\n\n const sourceSet = new Set(source)\n // 检查每一个 requiredItem 是否都存在于 sourceSet 中。\n return requiredItems.every((item) => sourceSet.has(item))\n}\n\n/**\n * 检查 source 数组是否不包含 forbiddenItems 数组中的任何元素。\n * @param source - 源数据数组。\n * @param forbiddenItems - 禁止包含的项的数组。\n * @returns boolean\n */\nconst containsNone = (source: string[], forbiddenItems: string[] = []): boolean => {\n // 如果没有禁止的项,则条件默认满足。\n if (!forbiddenItems?.length) return true\n\n const sourceSet = new Set(source)\n // 只要在 sourceSet 中找到任何一个 forbiddenItem,条件就不满足。\n return !forbiddenItems.some((item) => sourceSet.has(item))\n}\n\nexport function preCheck(\n rule_conditions: RuleCondition[],\n userTags: string[],\n currentDealsTypes: string[]\n): boolean {\n // 1. 处理边界情况 (Guard Clauses),保持不变\n if (!Array.isArray(rule_conditions)) return false\n if (rule_conditions.length === 0) return true\n\n // 2. 使用 .some() 替代 for...of 循环和 break\n // .some() 会在找到第一个满足条件的元素后立即返回 true,并停止遍历,\n // 这完美地复刻了 for + break 的行为。\n return rule_conditions.some((rule) => {\n // 检查标签条件是否满足\n const tagsAreValid =\n containsAll(userTags, rule.with_user_tags) && containsNone(userTags, rule.without_user_tags)\n\n // 检查URL参数条件是否满足\n const paramsAreValid =\n containsAll(currentDealsTypes, rule.with_special_url_params) &&\n containsNone(currentDealsTypes, rule.without_special_url_params)\n\n // 只有当两个条件都满足时,此规则才算匹配\n return tagsAreValid && paramsAreValid\n })\n}\n\n// 缓存上一次的结果,避免重复计算\nlet formatScriptAutoFreeGiftCache: {\n key: string\n result: any[]\n} | null = null\n\nexport const formatScriptAutoFreeGift = ({\n scriptAutoFreeGiftResult,\n gradient_gifts,\n locale,\n}: {\n scriptAutoFreeGiftResult: UseScriptAutoFreeGiftResult\n gradient_gifts: any\n locale: string\n}) => {\n // 生成缓存键,用于判断输入是否发生变化\n const cacheKey = JSON.stringify({\n freeGiftLevel: scriptAutoFreeGiftResult?.freeGiftLevel\n ? {\n items:\n scriptAutoFreeGiftResult.freeGiftLevel.giveawayProducts?.map((item) => ({\n handle: item.handle,\n sku: item.sku,\n quantity: 1,\n })) || [],\n }\n : null,\n giftProductsLength: scriptAutoFreeGiftResult?.giftProductsResult?.length || 0,\n giftProductsIds: scriptAutoFreeGiftResult?.giftProductsResult?.map((p) => p.id).sort() || [],\n gradientGiftsId: gradient_gifts?.id || gradient_gifts?.name || '',\n locale,\n })\n\n // 如果缓存存在且键相同,直接返回缓存结果\n if (formatScriptAutoFreeGiftCache && formatScriptAutoFreeGiftCache.key === cacheKey) {\n return formatScriptAutoFreeGiftCache.result\n }\n\n // 计算新结果\n const result =\n scriptAutoFreeGiftResult?.freeGiftLevel?.giveawayProducts\n ?.filter((item) =>\n scriptAutoFreeGiftResult?.giftProductsResult?.some(\n (product) => product.handle === item.handle\n )\n )\n .map((item, index) => {\n const product = scriptAutoFreeGiftResult?.giftProductsResult?.find(\n (product) => product.handle === item.handle\n )\n const variants = product?.variants\n const variant = Array.isArray(variants)\n ? variants.find((v: any) => v.sku === item.sku)\n : undefined\n\n const query = getQuery()\n const utmCampaign = Cookies.get('utm_campaign') || (query as any)?.utm_campaign\n const addUTMFreeItem =\n gradient_gifts.activityAvailableQuery &&\n utmCampaign?.includes(gradient_gifts.activityAvailableQuery)\n\n let points_subscribe = false\n if (locale === 'au') {\n const isPointsSubscribe = Cookies.get('points_subscribe')\n points_subscribe = !!isPointsSubscribe\n }\n\n const customAttributes: { key: string; value: string }[] = [\n {\n key: '_giveaway_gradient_gifts',\n value: '_giveaway_gradient_gifts',\n },\n ...(points_subscribe\n ? [\n { key: '_amount_upgrade_multiple', value: '1.2' },\n { key: '_amount_upgrade_value', value: '40' },\n ]\n : []),\n ...(addUTMFreeItem && gradient_gifts?.activityQroperty\n ? [\n {\n key: gradient_gifts.activityQroperty,\n value: gradient_gifts.activityQroperty,\n },\n ]\n : []),\n ]\n\n const line = {\n id: product?.id + '_' + index,\n variantId: String(variant?.id),\n productId: String(product?.id),\n name: (product as any)?.name || (product as any)?.title || '',\n quantity: 1,\n discounts: [],\n path: product?.handle || '',\n variant: variant,\n totalAmount: 0,\n subtotalAmount: new Decimal(\n typeof variant?.price === 'object' ? variant?.price?.amount || 0 : variant?.price || 0\n ).toNumber(),\n options: [],\n discountAllocations: [],\n product: product,\n customAttributes,\n freeGiftVariant: undefined,\n relatedVariant: undefined,\n } as any\n\n return {\n line,\n isSoldOut: !variant?.availableForSale,\n }\n }) || []\n\n // 缓存结果\n formatScriptAutoFreeGiftCache = {\n key: cacheKey,\n result: result,\n }\n\n return result\n}\n\n// 缓存上一次的结果,避免重复计算\nlet formatFunctionAutoFreeGiftCache: {\n key: string\n result: any[]\n} | null = null\n\nexport const formatFunctionAutoFreeGift = ({\n qualifyingGift,\n giftProductsResult,\n locale,\n}: {\n locale: string\n qualifyingGift?: FormattedGift | null\n giftProductsResult?: NormalizedProduct[] | []\n}) => {\n // 生成缓存键,用于判断输入是否发生变化\n const cacheKey = JSON.stringify({\n qualifyingGift: qualifyingGift\n ? {\n spend: qualifyingGift.tier?.spend_sum_money,\n items:\n qualifyingGift.itemsToAdd?.map((item) => ({\n variantId: item.variant.id,\n handle: item.variant.handle,\n sku: item.variant.sku,\n quantity: item.quantity ?? 1,\n attributes: item.attributes,\n })) || [],\n }\n : null,\n giftProductsLength: giftProductsResult?.length || 0,\n giftProductsIds: giftProductsResult?.map((p) => p.id).sort() || [],\n locale,\n })\n\n // 如果缓存存在且键相同,直接返回缓存结果\n if (formatFunctionAutoFreeGiftCache && formatFunctionAutoFreeGiftCache.key === cacheKey) {\n return formatFunctionAutoFreeGiftCache.result\n }\n\n // 计算新结果\n const result =\n qualifyingGift?.itemsToAdd?.map((item, index) => {\n const product = giftProductsResult?.find((product) => product.handle === item.variant.handle)\n const variants = product?.variants\n const variant = Array.isArray(variants)\n ? variants.find((v: any) => v.sku === item.variant.sku)\n : undefined\n console.log('qualifyingGift variant', product, variant)\n\n const line = {\n id: product?.id + '_' + index,\n variantId: String(variant?.id),\n productId: String(product?.id),\n name: (product as any)?.name || (product as any)?.title || '',\n quantity: 1,\n discounts: [],\n path: product?.handle || '',\n variant: variant,\n totalAmount: 0,\n subtotalAmount: new Decimal(\n typeof variant?.price === 'object' ? variant?.price?.amount || 0 : variant?.price || 0\n ).toNumber(),\n options: [],\n discountAllocations: [],\n product: product,\n customAttributes: item.attributes,\n freeGiftVariant: undefined,\n relatedVariant: undefined,\n } as any\n return {\n line,\n isSoldOut: !variant?.availableForSale,\n }\n }) || []\n\n // 缓存结果\n formatFunctionAutoFreeGiftCache = {\n key: cacheKey,\n result: result,\n }\n\n return result\n}\n","import { useMemo, useRef } from 'react'\nimport {\n FunctionGiftResult,\n FormattedGift,\n CartLineInput,\n AutoFreeGiftConfig,\n} from '../types/auto-free-gift'\nimport { preCheck, getMatchedMainProductSubTotal } from '../utils/auto-free-gift'\nimport { CUSTOMER_ATTRIBUTE_KEY } from '../const'\nimport { btoaID } from '../utils'\nimport { getProductsByHandles } from '@anker-in/shopify-sdk'\nimport useSWR from 'swr'\nimport { useShopify } from '../../../provider'\nimport type { AddToCartLineItem } from '../use-add-to-cart'\nimport { createMockCartFromLines } from '../utils/normalize-add-to-cart-lines'\n\n/**\n * [计算型 Hook]\n * 根据购物车、活动配置和用户信息,计算出应得的赠品和下一个目标。\n * 此 Hook 不产生任何副作用。\n * 使用示例:\n * const { qualifyingGift, nextTierGoal, activeCampaign, isLoading } = useCalcAutoFreeGift(cart, autoFreeGiftConfig);\n *\n * 也可以传入 lines 参数来计算加购前的赠品:\n * const { qualifyingGift, nextTierGoal, activeCampaign, isLoading } = useCalcAutoFreeGift(cart, autoFreeGiftConfig, customer, lines);\n */\nexport const useCalcAutoFreeGift = (\n cart: any,\n autoFreeGiftConfig: AutoFreeGiftConfig,\n customer: any,\n lines?: AddToCartLineItem[]\n): FunctionGiftResult => {\n const tags = useMemo(() => customer?.tags || [], [customer?.tags])\n const isCustomerLoading = useMemo(() => (!customer ? true : false), [customer])\n const dealsType: string = '' // 可从URL或Context获取\n const { client, locale } = useShopify()\n\n // 使用 useRef 缓存 giftProductsResult,确保只执行一次\n const giftProductsCache = useRef<{\n data: any[] | null\n giftHandles: string[]\n } | null>(null)\n\n // 如果传入了 lines,则创建临时 cart 用于计算\n const effectiveCart = useMemo(() => {\n if (lines && lines.length > 0) {\n return createMockCartFromLines(lines, cart)\n }\n return cart\n }, [lines, cart])\n\n // 1. 找到当前生效的活动和用于计算的子总价\n const { activeCampaign, subtotal } = useMemo(() => {\n // 遍历所有活动配置\n for (const campaign of autoFreeGiftConfig) {\n const { rule_conditions = [], rule_result } = campaign\n const { spend_get_reward } = rule_result || {}\n\n // 前置检查,判断用户和环境是否满足活动条件\n const isPreCheckPassed = preCheck(rule_conditions, tags, dealsType ? [dealsType] : [])\n\n if (isPreCheckPassed && spend_get_reward) {\n // 计算参与活动的主商品的总价\n const matchedSubtotal = getMatchedMainProductSubTotal(\n effectiveCart,\n spend_get_reward.main_product?.variant_list?.map((v: any) => v.variant_id) || [],\n {\n spend_money_type: spend_get_reward.main_product?.spend_money_type || 1,\n variant_id_list:\n spend_get_reward.main_product?.variant_list?.map((v: any) => v.variant_id) || [],\n all_store_variant: spend_get_reward.main_product?.all_store_variant || false,\n }\n )\n\n // 如果有主商品在购物车中,则此活动为当前生效的活动\n if (matchedSubtotal > 0) {\n return { activeCampaign: campaign, subtotal: matchedSubtotal }\n }\n }\n }\n // 没有找到生效的活动\n return { activeCampaign: null, subtotal: 0 }\n }, [autoFreeGiftConfig, effectiveCart, tags, dealsType])\n\n // 2. 根据子总价,计算应得赠品和下一个目标\n const { qualifyingGift, nextTierGoal } = useMemo(() => {\n if (!activeCampaign || !activeCampaign.rule_result?.spend_get_reward?.gift_product) {\n return { qualifyingGift: null, nextTierGoal: null }\n }\n\n const giftTiers = activeCampaign.rule_result.spend_get_reward.gift_product\n\n // a. 找到当前满足条件的最高阶梯(按金额从高到低排序后查找)\n const qualifyingTier = [...giftTiers]\n .sort((a: any, b: any) => Number(b.spend_sum_money) - Number(a.spend_sum_money))\n .find((tier: any) => subtotal >= Number(tier.spend_sum_money))\n\n // b. 找到下一个目标阶梯 (第一个门槛比当前subtotal高的)\n const nextGoal = giftTiers.find((tier) => subtotal < Number(tier.spend_sum_money))\n\n if (!qualifyingTier) {\n return { qualifyingGift: null, nextTierGoal: nextGoal || null }\n }\n\n // c. 将应得的赠品阶梯格式化为待添加购物车的结构\n const formattedGift: FormattedGift = {\n tier: qualifyingTier,\n itemsToAdd: qualifyingTier.reward_list\n ?.map((reward: any) => {\n const giftProduct = reward?.variant_list?.[0]\n if (!giftProduct) return null\n return {\n variant: {\n id: btoaID(giftProduct.variant_id),\n handle: giftProduct.handle,\n sku: giftProduct.sku,\n },\n quantity: reward?.get_unit || 1,\n attributes: [\n {\n key: CUSTOMER_ATTRIBUTE_KEY,\n value: JSON.stringify({\n is_gift: true,\n rule_id: activeCampaign.rule_id,\n spend_sum_money: qualifyingTier.spend_sum_money,\n }),\n },\n ],\n }\n })\n .filter((item: any): item is CartLineInput => item !== null),\n }\n\n return { qualifyingGift: formattedGift, nextTierGoal: nextGoal || null }\n }, [activeCampaign, subtotal])\n\n const giftHandles = useMemo(() => {\n const giftVariant = autoFreeGiftConfig\n .map((item) =>\n item.rule_result?.spend_get_reward?.gift_product\n ?.map((v) =>\n v.reward_list.map((reward) => reward.variant_list.map((variant) => variant.handle))\n )\n .flat()\n )\n .flat()\n return giftVariant.flat(2).filter(Boolean)\n }, [autoFreeGiftConfig])\n\n // 检查是否需要重新获取数据\n const shouldFetch = useMemo(() => {\n if (!giftHandles.length) return false\n\n // 如果缓存存在且 handles 相同,直接使用缓存\n if (\n giftProductsCache.current &&\n JSON.stringify(giftProductsCache.current.giftHandles) === JSON.stringify(giftHandles)\n ) {\n return false\n }\n\n return true\n }, [giftHandles])\n\n const { data: giftProductsResult } = useSWR(shouldFetch ? giftHandles : null, async () => {\n const res = await getProductsByHandles(client, {\n handles: giftHandles,\n locale,\n })\n const result = Array.isArray(res) ? res : []\n\n // 缓存结果\n giftProductsCache.current = {\n data: result,\n giftHandles: [...giftHandles],\n }\n\n return result\n })\n\n\n // 使用缓存的数据或新获取的数据 \n const finalGiftProductsResult = useMemo(() => {\n if (giftProductsCache.current && !shouldFetch) {\n return giftProductsCache.current.data || undefined\n }\n return giftProductsResult\n }, [giftProductsResult, shouldFetch])\n \n return {\n qualifyingGift,\n nextTierGoal,\n activeCampaign,\n isLoading: isCustomerLoading,\n giftProductsResult: finalGiftProductsResult,\n }\n}\n","import { useEffect, useMemo, useCallback, useState, useRef } from 'react'\nimport Decimal from 'decimal.js'\nimport Cookies from 'js-cookie'\nimport {\n NormalizedCart,\n NormalizedLineItem,\n NormalizedProduct,\n getProductsByHandles,\n} from '@anker-in/shopify-sdk'\nimport useSWR from 'swr'\nimport { getQuery } from '../utils'\nimport { useShopify } from '../../../provider'\nimport type { AddToCartLineItem } from '../use-add-to-cart'\nimport { createMockCartFromLines } from '../utils/normalize-add-to-cart-lines'\n\n// 兼容老script满赠 ----- 待拆解优化\ninterface GiveawayProduct {\n handle: string\n sku: string\n}\n\ninterface Breakpoint {\n breakpoint: string\n giveawayProducts: GiveawayProduct[]\n}\n\ninterface Campaign {\n activityAvailableQuery?: string\n activityQroperty?: string\n breakpoints?: Array<{\n breakpoint: string\n giveawayProducts: GiveawayProduct[]\n }>\n includeTags?: string[]\n useTotalAmount?: boolean\n}\n\nexport interface UseScriptAutoFreeGiftResult {\n involvedLines: NormalizedLineItem[]\n reorder: (a: NormalizedLineItem, b: NormalizedLineItem) => number\n disableCodeRemove: boolean\n nextFreeGiftLevel: Breakpoint | null\n freeGiftLevel: Breakpoint | null\n involvedSubTotal: Decimal\n giftProductsResult?: NormalizedProduct[]\n}\n\n// --- 3. 优化后的 Hook 主体 ---\nexport const useScriptAutoFreeGift = ({\n campaign,\n _giveaway,\n cart,\n locale: providedLocale,\n lines,\n}: {\n campaign: Campaign | null\n _giveaway: string\n cart: NormalizedCart | undefined\n locale?: string\n lines?: AddToCartLineItem[]\n}): UseScriptAutoFreeGiftResult => {\n const { client, locale: contextLocale } = useShopify()\n const locale = providedLocale || contextLocale\n\n // --- 状态管理 ---\n const [points_subscribe, set_points_subscribe] = useState<boolean>(false)\n\n // 使用 useRef 缓存 giftProductsResult,确保只执行一次\n const giftProductsCache = useRef<{\n data: any[] | null\n giftHandles: string[]\n } | null>(null)\n\n // 如果传入了 lines,则创建临时 cart 用于计算\n const effectiveCart = useMemo(() => {\n if (lines && lines.length > 0) {\n return createMockCartFromLines(lines, cart)\n }\n return cart\n }, [lines, cart])\n\n useEffect(() => {\n if (locale === 'au') {\n const isPointsSubscribe = Cookies.get('points_subscribe')\n set_points_subscribe(!!isPointsSubscribe)\n }\n }, [locale])\n\n // 检查活动是否可用:\n // 1. campaign 不存在\n // 2. 配置了 activityAvailableQuery 但utmCampaign不包含activityAvailableQuery\n const isActivityAvailable = useMemo(() => {\n if (!campaign) return false\n const query = getQuery()\n const utmCampaign = Cookies.get('utm_campaign') || (query as any)?.utm_campaign\n if (campaign.activityAvailableQuery && !utmCampaign?.includes(campaign.activityAvailableQuery))\n return false\n return true\n }, [campaign])\n\n // --- 计算层 ---\n // 使用 useMemo 进行性能优化,处理所有纯计算逻辑。\n\n const [upgrade_multiple, upgrade_value] = useMemo((): [number, number] => {\n let upgrade_multiple = 1\n let upgrade_value = 0\n if (points_subscribe) {\n upgrade_multiple = 1.2\n upgrade_value = 40\n }\n effectiveCart?.lineItems?.forEach(({ customAttributes}: { customAttributes: { key: string; value: string }[] }) => {\n customAttributes?.forEach(({ key, value }: { key: string; value: string }) => {\n if (key === '_amount_upgrade_multiple') upgrade_multiple = Number(value) || 1\n if (key === '_amount_upgrade_value') upgrade_value = Number(value) || 0\n })\n })\n return [upgrade_multiple, upgrade_value]\n }, [effectiveCart?.lineItems, points_subscribe])\n\n const breakpoints = useMemo((): Breakpoint[] => {\n if (!isActivityAvailable) return []\n return (campaign?.breakpoints || []).map((item) => ({\n breakpoint: new Decimal(item.breakpoint)\n .minus(new Decimal(upgrade_value))\n .dividedBy(new Decimal(upgrade_multiple))\n .toFixed(2, Decimal.ROUND_DOWN),\n giveawayProducts: item.giveawayProducts || [],\n }))\n }, [campaign, upgrade_multiple, upgrade_value])\n\n const giftHandles = useMemo(\n (): string[] =>\n // 使用 Set 去重,然后拼接字符串\n [\n ...new Set(\n breakpoints.flatMap((b) => b.giveawayProducts.map((p) => p.handle)).filter(Boolean)\n ),\n ],\n [breakpoints]\n )\n\n // 检查是否需要重新获取数据\n const shouldFetch = useMemo(() => {\n if (!giftHandles.length) return false\n\n // 如果缓存存在且 handles 相同,直接使用缓存\n if (\n giftProductsCache.current &&\n JSON.stringify(giftProductsCache.current.giftHandles) === JSON.stringify(giftHandles)\n ) {\n return false\n }\n\n return true\n }, [giftHandles])\n\n const involvedLines = useMemo((): NormalizedLineItem[] => {\n if (!isActivityAvailable) return []\n return (effectiveCart?.lineItems || []).filter((line: NormalizedLineItem) => {\n const isNotGift =\n line?.totalAmount &&\n Number(line.totalAmount) > 0 &&\n line.customAttributes?.every(\n (item: { key: string; value: string }) => item.key !== _giveaway\n )\n const hasCampaignTag = line.product?.tags?.some(\n (tag: string) =>\n campaign?.includeTags?.includes(tag.trim()) && line.variant?.availableForSale\n )\n return isNotGift && hasCampaignTag\n })\n }, [effectiveCart?.lineItems, isActivityAvailable, _giveaway])\n\n const involvedSubTotal = useMemo((): Decimal => {\n if (!isActivityAvailable) return new Decimal(0)\n return involvedLines.reduce((prev, item) => {\n const amount = campaign?.useTotalAmount ? item.totalAmount : item.subtotalAmount\n return new Decimal(prev).plus(new Decimal(amount || 0))\n }, new Decimal(0))\n }, [involvedLines, isActivityAvailable])\n\n const [freeGiftLevel, nextFreeGiftLevel] = useMemo((): [Breakpoint | null, Breakpoint | null] => {\n if (!isActivityAvailable) return [null, null]\n const sortedLevels = [...breakpoints].sort(\n (a, b) => Number(b.breakpoint) - Number(a.breakpoint)\n )\n const levelIndex = sortedLevels.findIndex(\n (level) => involvedSubTotal.gte(new Decimal(level.breakpoint)) && involvedLines.length > 0\n )\n\n if (levelIndex === -1) {\n return [\n null,\n sortedLevels.length > 0 ? (sortedLevels[sortedLevels.length - 1] ?? null) : null,\n ]\n }\n\n const currentLevel = sortedLevels[levelIndex] ?? null\n const nextLevel = levelIndex > 0 ? (sortedLevels[levelIndex - 1] ?? null) : null\n return [currentLevel, nextLevel]\n }, [breakpoints, involvedSubTotal, involvedLines.length])\n\n // --- 数据获取层 ---\n const { data: giftProductsResult } = useSWR(shouldFetch ? giftHandles : null, async () => {\n const res = await getProductsByHandles(client, {\n handles: giftHandles,\n locale,\n })\n const result = Array.isArray(res) ? res : []\n\n // 缓存结果\n giftProductsCache.current = {\n data: result,\n giftHandles: [...giftHandles],\n }\n\n return result\n })\n\n // 使用缓存的数据或新获取的数据\n const finalGiftProductsResult = useMemo(() => {\n if (giftProductsCache.current && !shouldFetch) {\n return giftProductsCache.current.data || undefined\n }\n return giftProductsResult\n }, [giftProductsResult, shouldFetch])\n\n // 使用 useCallback 创建一个稳定的排序函数,用于优化渲染。\n // 它会根据商品类型(赠品、活动商品、普通商品)进行排序。\n const reorder = useCallback(\n (a: NormalizedLineItem, b: NormalizedLineItem): number => {\n const getPriority = (item: NormalizedLineItem): number => {\n // 优先级 0: 赠品 (排在最后)\n if (\n item.customAttributes?.some(\n (attribute: { key: string; value: string }) => attribute.key === _giveaway\n )\n )\n return 0\n // 优先级 1: 参与活动的商品 (BUG修复:应检查 product.tags)\n if (item.product?.tags?.some((tag: string) => campaign?.includeTags?.includes(tag)))\n return 1\n // 优先级 2: 其他普通商品 (排在最前)\n return 2\n }\n // b 的优先级减 a 的优先级,实现降序排列\n return getPriority(b) - getPriority(a)\n },\n [campaign?.includeTags, _giveaway]\n )\n\n return {\n involvedLines,\n reorder,\n disableCodeRemove: involvedLines.length > 0,\n nextFreeGiftLevel,\n freeGiftLevel,\n involvedSubTotal,\n giftProductsResult: finalGiftProductsResult,\n }\n}\n","/**\n * Cart Context\n * Provides cart state and mutation methods with business logic\n */\n\nimport React, { createContext, useContext, useCallback, useMemo, useState, useEffect } from 'react'\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getCart, type NormalizedCart } from '@anker-in/shopify-sdk'\nimport { useShopify } from './use-shopify'\nimport { useCalcAutoFreeGift } from '../hooks/cart/feature/use-calc-auto-free-gift'\nimport { CUSTOMER_SCRIPT_GIFT_KEY, CUSTOMER_ATTRIBUTE_KEY } from '../hooks/cart/const'\nimport { useScriptAutoFreeGift } from '../hooks/cart/feature/use-script-auto-free-gift'\nimport {\n getDiscountEnvAttributeValue,\n formatScriptAutoFreeGift,\n formatFunctionAutoFreeGift,\n checkAttributesUpdateNeeded,\n} from '../hooks/cart/utils/auto-free-gift'\nimport {\n PlusMemberSettingsMetafields,\n useCartAttributes,\n useUpdateCartAttributes,\n useUpdateLineCodeAmountAttributes,\n} from '../hooks'\nimport { useRequest } from 'ahooks'\nimport type { HasMetafieldsIdentifier } from '@anker-in/shopify-sdk'\n\n// Simple types defined locally to avoid import issues\nexport type AttributeInput = {\n key: string\n value: string\n}\n\nexport type LoadingState = {\n editLineQuantityLoading: boolean\n editLineCodeAmountLoading: boolean\n listingAutoCodeApplying: boolean\n userCodeApplying: boolean\n}\n\nexport interface CartContextValue {\n /** Current cart data */\n cart: NormalizedCart | undefined\n /** Whether cart is loading */\n isCartLoading: boolean\n /** Manually trigger cart fetch */\n triggerFetch: () => void\n /** Mutate cart data */\n mutateCart: (cart: NormalizedCart | undefined) => void\n /** Add custom attributes */\n addCustomAttributes: (attributes: AttributeInput[]) => void\n /** Remove custom attributes */\n removeCustomAttributes: (attributes: { key: string }[]) => void\n /** Set custom attributes */\n setCustomAttributes: (attributes: AttributeInput[]) => void\n /** Current locale */\n locale: string\n /** Whether discount code is changing */\n isCodeChanging: boolean\n /** Set discount code changing state */\n setIsCodeChanging: (isCodeChanging: boolean) => void\n /** Set loading state */\n setLoadingState: React.Dispatch<React.SetStateAction<LoadingState>>\n /** Loading state */\n loadingState: LoadingState\n /** Script auto free gift items */\n scriptAutoFreeGift?: any[]\n /** Function auto free gift items */\n functionAutoFreeGift?: any[]\n /** Set function auto free gift */\n setFunctionAutoFreeGift: (functionAutoFreeGift: any[]) => void\n /** Set script auto free gift */\n setScriptAutoFreeGift: (scriptAutoFreeGift: any[]) => void\n /** Script auto free gift result */\n scriptAutoFreeGiftResult?: any\n /** Function auto free gift result */\n functionAutoFreeGiftResult?: any\n /** Calculated auto free gift result */\n calculatedAutoFreeGift?: any\n /** Gifts that need to be added to cart */\n giftNeedAddToCartLines: any[]\n /** Auto free gift config */\n autoFreeGiftConfig?: any\n /** Gradient gifts config */\n gradientGiftsConfig?: any\n /** Metafield identifiers */\n metafieldIdentifiers?: {\n variant: HasMetafieldsIdentifier[]\n product: HasMetafieldsIdentifier[]\n }\n}\n\nconst CartContext = createContext<CartContextValue | null>(null)\n\nexport interface CartProviderProps {\n children: React.ReactNode\n /** SWR configuration options */\n swrOptions?: SWRConfiguration<NormalizedCart | undefined, Error>\n /** Auto free gift configuration */\n autoFreeGiftConfig?: any\n /** Gradient gifts configuration (for script gifts) */\n gradientGiftsConfig?: any\n /** Function gift configuration */\n fnGiftConf?: any\n /** User profile */\n profile?: any\n /** Customer data */\n customer?: any\n /** Current locale */\n locale: string\n /** Metafield identifiers */\n metafieldIdentifiers?: {\n variant: HasMetafieldsIdentifier[]\n product: HasMetafieldsIdentifier[]\n }\n /** Plus member settings */\n memberSetting?: PlusMemberSettingsMetafields\n}\n\n/**\n * Cart Provider Component\n *\n * Provides cart state management with business logic\n *\n * @example\n * ```tsx\n * <ShopifyProvider {...config}>\n * <CartProvider\n * locale=\"us\"\n * autoFreeGiftConfig={config}\n * profile={profile}\n * customer={customer}\n * >\n * <App />\n * </CartProvider>\n * </ShopifyProvider>\n * ```\n */\nexport function CartProvider({\n children,\n // swrOptions,\n autoFreeGiftConfig,\n gradientGiftsConfig,\n profile,\n customer,\n locale,\n metafieldIdentifiers,\n memberSetting,\n}: CartProviderProps) {\n const { client, cartCookieAdapter } = useShopify()\n\n // Local state\n const [customAttributes, setCustomAttributes] = useState<AttributeInput[]>([])\n const [customAttributesNeedDelete, setCustomAttributesNeedDelete] = useState<{ key: string }[]>(\n []\n )\n const [isCodeChanging, setIsCodeChanging] = useState(false)\n const [loadingState, setLoadingState] = useState<LoadingState>({\n editLineQuantityLoading: false,\n editLineCodeAmountLoading: false,\n listingAutoCodeApplying: false,\n userCodeApplying: false,\n })\n const [scriptAutoFreeGift, setScriptAutoFreeGift] = useState<any[]>([])\n const [functionAutoFreeGift, setFunctionAutoFreeGift] = useState<any[]>([])\n\n const {\n run: fetchCart,\n data: cart,\n loading: isCartLoading,\n mutate: mutateCart,\n } = useRequest<NormalizedCart | undefined, any>(\n async () => {\n return getCart(client, {\n cookieAdapter: cartCookieAdapter,\n metafieldIdentifiers,\n })\n },\n {\n refreshDeps: [locale],\n }\n )\n\n // 更新 attributes\n const { trigger: updateAttributes } = useUpdateCartAttributes(mutateCart, metafieldIdentifiers)\n // 公共 attributes\n const { attributes } = useCartAttributes({ profile, customer, cart, memberSetting })\n\n useRequest(\n () => {\n // 去重逻辑\n const newAttributes = [...attributes, ...customAttributes]\n\n const needUpdate =\n cart &&\n !checkAttributesUpdateNeeded(\n cart.customAttributes,\n newAttributes,\n customAttributesNeedDelete\n )\n\n // 如果 attributes 没有变化,不更新\n if (needUpdate) {\n return updateAttributes({ attributes: newAttributes })\n } else {\n return Promise.resolve(cart)\n }\n },\n {\n throttleWait: 1000, // 1 秒内只触发最后一次更新\n throttleTrailing: true,\n throttleLeading: false,\n refreshDeps: [attributes, customAttributes],\n }\n )\n\n // 更新 code 时,同步更新 line item 中的 code amount attribute\n useUpdateLineCodeAmountAttributes({\n cart,\n mutateCart,\n isCartLoading: isCartLoading || isCodeChanging,\n setLoadingState,\n })\n\n // Custom attribute management\n const removeCustomAttributes = useCallback(\n (attributes: { key: string }[]) => {\n setCustomAttributesNeedDelete(attributes)\n },\n [setCustomAttributesNeedDelete]\n )\n\n const addCustomAttributes = useCallback(\n (attributes: AttributeInput[]) => {\n const sameAttributes = attributes.filter((attr) =>\n customAttributes.some((a) => a.key === attr.key)\n )\n\n if (sameAttributes.length) {\n setCustomAttributes((prev) => {\n const removedAttributes = prev.filter(\n (attr) => !sameAttributes.some((a) => a.key === attr.key)\n )\n return [...removedAttributes, ...attributes]\n })\n } else {\n setCustomAttributes((prev) => [...prev, ...attributes])\n }\n },\n [customAttributes]\n )\n\n const functionAutoFreeGiftResult = useCalcAutoFreeGift(cart, autoFreeGiftConfig || [], customer)\n const scriptAutoFreeGiftResult = useScriptAutoFreeGift({\n campaign: gradientGiftsConfig || null,\n _giveaway: CUSTOMER_SCRIPT_GIFT_KEY,\n cart,\n })\n\n const formattedScriptGifts = useMemo(() => {\n return formatScriptAutoFreeGift({\n scriptAutoFreeGiftResult,\n gradient_gifts: gradientGiftsConfig,\n locale,\n })\n }, [scriptAutoFreeGiftResult, gradientGiftsConfig, locale])\n\n const formattedFunctionGifts = useMemo(() => {\n return formatFunctionAutoFreeGift({\n qualifyingGift: functionAutoFreeGiftResult?.qualifyingGift || null,\n giftProductsResult: (functionAutoFreeGiftResult?.giftProductsResult as any[]) || [],\n locale,\n })\n }, [functionAutoFreeGiftResult, locale])\n\n // 当格式化结果变化时更新状态\n useEffect(() => {\n if (\n loadingState.userCodeApplying ||\n loadingState.editLineQuantityLoading ||\n loadingState.editLineCodeAmountLoading ||\n loadingState.listingAutoCodeApplying\n ) {\n return\n }\n\n setScriptAutoFreeGift(formattedScriptGifts)\n setFunctionAutoFreeGift(formattedFunctionGifts)\n }, [\n formattedScriptGifts,\n formattedFunctionGifts,\n loadingState.userCodeApplying,\n loadingState.editLineQuantityLoading,\n loadingState.editLineCodeAmountLoading,\n loadingState.listingAutoCodeApplying,\n ])\n\n const giftNeedAddToCartLines = useMemo(() => {\n const cartGiftLineItems = cart?.lineItems.filter((line) =>\n line.customAttributes?.some((attr: any) =>\n [CUSTOMER_ATTRIBUTE_KEY, CUSTOMER_SCRIPT_GIFT_KEY].includes(attr.key)\n )\n )\n const result = [...scriptAutoFreeGift, ...functionAutoFreeGift].filter(\n (item) =>\n // 如果购物车中已经存在对应赠品,且标记了 function 满赠的属性,则不添加\n !cartGiftLineItems?.find((line) => {\n return (\n line.variantId === item.line.variantId &&\n line.customAttributes?.some((attr: any) => {\n if (attr.key === '_discounts_function_env') {\n return getDiscountEnvAttributeValue(line.customAttributes).is_gift\n }\n\n return false\n })\n )\n })\n )\n return result\n }, [cart?.lineItems, scriptAutoFreeGift, functionAutoFreeGift])\n\n const value = useMemo(\n () => ({\n cart,\n isCartLoading,\n triggerFetch: fetchCart,\n mutateCart,\n addCustomAttributes,\n removeCustomAttributes,\n setCustomAttributes,\n locale,\n isCodeChanging,\n setIsCodeChanging,\n autoFreeGiftConfig,\n gradientGiftsConfig,\n setLoadingState,\n loadingState,\n // function满赠\n functionAutoFreeGift,\n functionAutoFreeGiftResult,\n setFunctionAutoFreeGift,\n // script满赠\n scriptAutoFreeGift,\n scriptAutoFreeGiftResult,\n setScriptAutoFreeGift,\n giftNeedAddToCartLines,\n metafieldIdentifiers,\n }),\n [\n cart,\n isCartLoading,\n fetchCart,\n mutateCart,\n addCustomAttributes,\n removeCustomAttributes,\n locale,\n isCodeChanging,\n autoFreeGiftConfig,\n gradientGiftsConfig,\n loadingState,\n // function满赠\n functionAutoFreeGift,\n functionAutoFreeGiftResult,\n setFunctionAutoFreeGift,\n // script满赠\n scriptAutoFreeGift,\n scriptAutoFreeGiftResult,\n setScriptAutoFreeGift,\n giftNeedAddToCartLines,\n metafieldIdentifiers,\n ]\n )\n\n return <CartContext.Provider value={value}>{children}</CartContext.Provider>\n}\n\n/**\n * Hook to access cart context\n *\n * @throws Error if used outside CartProvider\n * @returns Cart context value\n *\n * @example\n * ```tsx\n * const { cart, mutateCart, isCartLoading, loadingState } = useCartContext()\n * ```\n */\nexport function useCartContext(): CartContextValue {\n const context = useContext(CartContext)\n\n if (!context) {\n throw new Error('useCartContext must be used within a CartProvider')\n }\n\n return context\n}\n","/**\n * useCreateCart Hook\n * Creates a new cart\n */\n\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport {\n createCart,\n updateCartCodes,\n type NormalizedCart,\n type CartLineInput,\n} from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\nimport { useCartContext } from '../../provider'\n\nexport interface CreateCartInput {\n /** Lines to add to the cart */\n lines?: CartLineInput[]\n /** Buyer identity for cart creation */\n buyerIdentity?: {\n email?: string\n countryCode?: string\n }\n /** Discount codes */\n discountCodes?: string[]\n /** Custom attributes */\n customAttributes?: Array<{ key: string; value: string }>\n}\n\n/**\n * Hook for creating a new cart\n *\n * Automatically removes invalid discount codes after creating cart\n *\n * @param options - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating } = useCreateCart()\n *\n * // Create empty cart\n * await trigger({})\n *\n * // Create cart with items\n * await trigger({\n * lines: [{\n * merchandiseId: 'gid://shopify/ProductVariant/123',\n * quantity: 1\n * }],\n * buyerIdentity: {\n * email: 'customer@example.com',\n * countryCode: 'US'\n * },\n * discountCodes: ['SUMMER2024']\n * })\n * ```\n */\nexport function useCreateCart(\n options?: SWRMutationConfiguration<\n NormalizedCart | undefined,\n Error,\n 'create-cart',\n CreateCartInput\n >\n) {\n const { client, locale, cartCookieAdapter } = useShopify()\n const { mutateCart, metafieldIdentifiers } = useCartContext()\n\n const createNewCart = useCallback(\n async (_key: string, { arg }: { arg: CreateCartInput }) => {\n let newCart = await createCart(client, {\n ...arg,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n\n if (newCart) {\n // Remove unapplicable discount codes\n const unApplicableCodes = newCart.discountCodes\n .filter((item) => !item.applicable)\n .map((item) => item.code)\n\n if (unApplicableCodes.length > 0) {\n newCart = await updateCartCodes(client, {\n cartId: newCart.id,\n discountCodes: newCart.discountCodes\n .filter((item) => item.applicable)\n .map((item) => item.code),\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n }\n }\n\n if (newCart) {\n mutateCart(newCart)\n }\n return newCart\n },\n [client, locale, cartCookieAdapter, mutateCart, metafieldIdentifiers]\n )\n\n return useSWRMutation('create-cart', createNewCart, options)\n}\n","import { useShopify } from '../../provider'\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport {\n addCartLines,\n updateCartCodes,\n type NormalizedCart,\n type CartLineInput,\n} from '@anker-in/shopify-sdk'\nimport { useCartContext } from '../../provider'\n\nexport interface AddCartLinesInput {\n /** Cart ID (optional, will use cookie or create new cart) */\n cartId?: string\n /** Lines to add */\n lines: CartLineInput[]\n /** Buyer identity for new cart */\n buyerIdentity?: {\n email?: string\n countryCode?: string\n }\n}\n\n/**\n * Hook for adding lines to cart\n *\n * Automatically removes invalid discount codes after adding items\n *\n * @param options - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating } = useAddCartLines()\n *\n * await trigger({\n * lines: [{\n * merchandiseId: 'gid://shopify/ProductVariant/123',\n * quantity: 1\n * }]\n * })\n * ```\n */\nexport function useAddCartLines(\n options?: SWRMutationConfiguration<\n NormalizedCart | undefined,\n Error,\n 'add-cart-lines',\n AddCartLinesInput\n >\n) {\n const { client, locale, cartCookieAdapter } = useShopify()\n const { mutateCart, metafieldIdentifiers } = useCartContext()\n\n const addLines = useCallback(\n async (_key: string, { arg }: { arg: AddCartLinesInput }) => {\n let updatedCart = await addCartLines(client, {\n ...arg,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n\n if (updatedCart) {\n // Remove unapplicable discount codes\n const unApplicableCodes = updatedCart.discountCodes\n .filter((item) => !item.applicable)\n .map((item) => item.code)\n\n if (unApplicableCodes.length > 0) {\n updatedCart = await updateCartCodes(client, {\n cartId: updatedCart.id,\n discountCodes: updatedCart.discountCodes\n .filter((item) => item.applicable)\n .map((item) => item.code),\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n }\n }\n\n if (updatedCart) {\n mutateCart(updatedCart)\n }\n return updatedCart\n },\n [client, locale, cartCookieAdapter, mutateCart, metafieldIdentifiers]\n )\n\n return useSWRMutation('add-cart-lines', addLines, options)\n}\n","/**\n * Google Analytics Tracking\n * GA4 event tracking utilities\n */\n\nimport Decimal from 'decimal.js'\nimport { AddToCartLineItem } from '../hooks'\nimport type { GtmParams } from './types'\n\ndeclare global {\n interface Window {\n dataLayer?: any[]\n gtag?: (...args: any) => void\n }\n}\n\n/**\n * Push event to GA4 dataLayer\n */\nexport const gaTrack = (data: any) => {\n if (typeof window === 'undefined') {\n return\n }\n\n window.dataLayer = window?.dataLayer || []\n if (!Array.isArray(window.dataLayer)) {\n return\n }\n\n try {\n window?.dataLayer?.push({ event_parameters: null })\n window?.dataLayer?.push(data || {})\n } catch (error) {\n console.error('GA tracking error:', error)\n }\n}\n\n/**\n * Track add to cart event in GA4\n */\nexport const trackAddToCartGA = ({\n lineItems = [],\n gtmParams = {},\n}: {\n lineItems: AddToCartLineItem[]\n gtmParams?: GtmParams\n}) => {\n if (!lineItems.length || !lineItems[0]?.variant) {\n return\n }\n\n const { variant } = lineItems[0]\n const currencyCode = variant.product?.price?.currencyCode\n\n const totalPrice = lineItems\n ?.reduce(\n (prev, { variant }) =>\n prev.plus(\n variant?.finalPrice?.amount ??\n variant?.compareAtPrice?.amount ??\n variant?.price?.amount ??\n 0\n ),\n new Decimal(0)\n )\n .toNumber()\n gaTrack({\n event: 'ga4Event',\n event_name: 'add_to_cart',\n event_parameters: {\n page_group: gtmParams?.pageGroup,\n currency: currencyCode,\n value: totalPrice,\n position: gtmParams?.position || '',\n items: lineItems.map(({ variant, quantity }) => ({\n item_id: variant?.sku,\n item_name: variant?.product?.title || variant?.product?.title,\n item_brand: gtmParams?.brand || '',\n item_category: variant?.product?.productType || '',\n item_variant: variant?.title || variant?.title,\n price: variant?.compareAtPrice?.amount ?? variant?.price?.amount,\n quantity: quantity || 1,\n })),\n ...gtmParams?.ga4Params,\n },\n })\n}\n\n/**\n * Track begin checkout event in GA4\n */\nexport const trackBeginCheckoutGA = ({\n lineItems = [],\n currencyCode,\n gtmParams = {},\n}: {\n lineItems: AddToCartLineItem[]\n currencyCode?: string\n gtmParams?: GtmParams\n}) => {\n if (!lineItems.length) {\n return\n }\n\n const totalPrice = lineItems\n ?.reduce(\n (prev, { variant }) =>\n prev.plus(\n variant?.finalPrice?.amount ??\n variant?.compareAtPrice?.amount ??\n variant?.price?.amount ??\n 0\n ),\n new Decimal(0)\n )\n .toNumber()\n\n gaTrack({\n event: 'ga4Event',\n event_name: 'begin_checkout',\n event_parameters: {\n page_group: gtmParams?.pageGroup,\n position: gtmParams?.position,\n currency: currencyCode,\n value: totalPrice,\n items: lineItems.map((item) => ({\n item_id: item.variant?.sku,\n item_name: item.variant?.product?.title,\n item_brand: gtmParams?.brand || '',\n item_category: item.variant?.product?.productType,\n item_variant: item.variant?.title,\n price: item.variant?.compareAtPrice?.amount ?? item.variant?.price?.amount,\n quantity: item.quantity || 1,\n })),\n ...gtmParams?.ga4Params,\n },\n })\n}\n\n/**\n * Track buy now event in GA4\n * This triggers begin_checkout event for buy now actions\n */\nexport const trackBuyNowGA = ({\n lineItems = [],\n gtmParams = {},\n}: {\n lineItems: AddToCartLineItem[]\n gtmParams?: GtmParams\n}) => {\n if (!lineItems.length || !lineItems[0]?.variant) {\n return\n }\n\n const { variant } = lineItems[0]\n const currencyCode = variant.price?.currencyCode\n const totalPrice = lineItems\n ?.reduce(\n (prev, { variant }) =>\n prev.plus(\n variant?.finalPrice?.amount ??\n variant?.compareAtPrice?.amount ??\n (variant?.price?.amount || 0)\n ),\n new Decimal(0)\n )\n .toNumber()\n\n gaTrack({\n event: 'ga4Event',\n event_name: 'begin_checkout',\n event_parameters: {\n page_group: gtmParams?.pageGroup,\n position: gtmParams?.position,\n currency: currencyCode,\n value: totalPrice,\n items: lineItems.map((item) => ({\n item_id: item.variant?.sku,\n item_name: item.variant?.product?.title || item.variant?.title,\n item_brand: gtmParams?.brand || '',\n item_category: item.variant?.product?.productType || '',\n item_variant: item.variant?.title,\n price: item.variant?.compareAtPrice?.amount ?? item.variant?.price?.amount,\n quantity: item.quantity || 1,\n })),\n ...gtmParams?.ga4Params,\n },\n })\n}\n","/**\n * Facebook Pixel Tracking\n * FBQ event tracking utilities\n */\n\nimport { AddToCartLineItem } from '../hooks'\n\ndeclare global {\n interface Window {\n fbq?: (...args: any[]) => void\n gtag?: (...args: any[]) => void\n }\n}\n\n/**\n * Track add to cart event in Facebook Pixel\n */\nexport const trackAddToCartFBQ = ({ lineItems = [] }: { lineItems: AddToCartLineItem[] }) => {\n if (typeof window === 'undefined' || !window.fbq) {\n return\n }\n\n if (lineItems.length && lineItems[0]?.variant) {\n const { variant, quantity } = lineItems[0]\n\n try {\n window.fbq('track', 'AddToCart', {\n value: variant?.compareAtPrice?.amount ?? (variant?.price?.amount || variant?.price || 0),\n num_items: quantity,\n currency: variant?.price?.currencyCode,\n content_name: variant?.product?.title,\n content_type: 'product_group',\n content_ids: String(variant?.id),\n content_category: variant?.product?.metafields?.global?.trafficType || 'public',\n })\n } catch (error) {\n console.error('FBQ tracking error:', error)\n }\n }\n}\n\n/**\n * Configuration for Buy Now tracking events\n */\nexport interface BuyNowTrackConfig {\n /** Google Tag ID */\n gtagId?: string\n /** Facebook Pixel custom event name */\n fbqBuyNowEvent?: string\n /** Google Tag conversion label */\n gtagBuyNowLabel?: string\n /** Google Tag conversion action (default: 'conversion') */\n gtagBuyNowConversion?: string\n}\n\n/**\n * Track buy now event in Facebook Pixel and Google Tag\n */\nexport const trackBuyNowFBQ = ({ trackConfig }: { trackConfig?: BuyNowTrackConfig }) => {\n if (typeof window === 'undefined') {\n return\n }\n\n try {\n // Facebook Pixel custom event\n if (trackConfig?.fbqBuyNowEvent && window.fbq) {\n window.fbq('trackCustom', trackConfig.fbqBuyNowEvent)\n }\n\n // Google Tag conversion\n if (trackConfig?.gtagBuyNowLabel && trackConfig?.gtagId && window.gtag) {\n window.gtag('event', trackConfig.gtagBuyNowConversion || 'conversion', {\n send_to: `${trackConfig.gtagId}/${trackConfig.gtagBuyNowLabel}`,\n })\n }\n } catch (error) {\n console.error('Buy Now tracking error:', error)\n }\n}\n","import { useShopify } from '../../provider'\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport { updateCartCodes, type NormalizedCart } from '@anker-in/shopify-sdk'\nimport { useCartContext } from '../../provider'\n\nexport interface ApplyCartCodesInput {\n /** Cart ID (required) */\n cartId?: string\n /** Discount codes to apply (added to existing applicable codes) */\n discountCodes: string[]\n /** Replace existing applicable codes */\n replaceExistingCodes?: boolean\n}\n\n/**\n * Hook for applying discount codes to cart\n *\n * Merges new codes with existing applicable codes and validates them\n *\n * @param options - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating, error } = useApplyCartCodes()\n *\n * try {\n * await trigger({\n * cartId: 'gid://shopify/Cart/123',\n * discountCodes: ['SUMMER2024']\n * })\n * } catch (error) {\n * // Handle unapplicable codes\n * }\n * ```\n */\nexport function useApplyCartCodes(\n options?: SWRMutationConfiguration<\n NormalizedCart | undefined,\n Error,\n 'apply-codes',\n ApplyCartCodesInput\n >\n) {\n const { client, locale, cartCookieAdapter } = useShopify()\n const { mutateCart, cart, metafieldIdentifiers } = useCartContext()\n\n const applyCodes = useCallback(\n async (_key: string, { arg }: { arg: ApplyCartCodesInput }) => {\n const { cartId: providedCartId, discountCodes, replaceExistingCodes } = arg\n\n if (!discountCodes?.length) {\n throw new Error('Invalid input used for this operation: Miss discountCode')\n }\n\n const cartId = providedCartId ? undefined : providedCartId || cart?.id\n\n if (!cartId) {\n return undefined\n }\n\n const updatedCart = await updateCartCodes(client, {\n cartId,\n discountCodes: replaceExistingCodes\n ? discountCodes\n : [\n ...discountCodes,\n ...(cart?.discountCodes?.filter((item) => item.applicable).map((item) => item.code) ||\n []),\n ],\n cookieAdapter: cartCookieAdapter,\n metafieldIdentifiers,\n })\n\n if (updatedCart) {\n mutateCart(updatedCart)\n }\n return updatedCart\n },\n [client, locale, cartCookieAdapter, mutateCart, cart]\n )\n\n return useSWRMutation('apply-codes', applyCodes, options)\n}\n","import { useShopify } from '../../provider'\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport { CartCookieAdapter, updateCartCodes, type NormalizedCart } from '@anker-in/shopify-sdk'\nimport { useCartContext } from '../../provider'\n\nexport interface RemoveCartCodesInput {\n /** Cart ID (required) */\n cartId?: string\n /** Discount codes to remove */\n discountCodes: string[]\n}\n\n/**\n * Hook for removing discount codes from cart\n *\n * @param options - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating } = useRemoveCartCodes()\n *\n * await trigger({\n * cartId: 'gid://shopify/Cart/123',\n * discountCodes: ['EXPIRED_CODE']\n * })\n * ```\n */\nexport function useRemoveCartCodes(\n options?: SWRMutationConfiguration<\n NormalizedCart | undefined,\n Error,\n 'remove-codes',\n RemoveCartCodesInput\n >\n) {\n const { client, locale, cartCookieAdapter } = useShopify()\n const { mutateCart, cart, metafieldIdentifiers } = useCartContext()\n\n const removeCodes = useCallback(\n async (_key: string, { arg }: { arg: RemoveCartCodesInput }) => {\n const { cartId: providedCartId, discountCodes } = arg\n\n const cartId = providedCartId ? undefined : providedCartId || cart?.id\n\n const codes = cart?.discountCodes?.filter((code) => !!code.applicable) || []\n\n // Filter out codes to remove, keeping only applicable ones\n const leftCodes = codes\n .filter((code) => (discountCodes?.length ? !discountCodes.includes(code.code) : code.code))\n .map((code) => code.code)\n\n const updatedCart = await updateCartCodes(client, {\n cartId,\n discountCodes: leftCodes,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n\n if (updatedCart) {\n mutateCart(updatedCart)\n }\n return updatedCart\n },\n [client, locale, cartCookieAdapter, mutateCart, cart]\n )\n\n return useSWRMutation('remove-codes', removeCodes, options)\n}\n","/**\n * useAddToCart Hook\n * 性能优化全链路加购方法,功能列表\n * 1. 应用 code\n * 2. 删除不可用 code\n * 3. 埋点\n */\n\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport {\n type NormalizedCart,\n type CartLineInput,\n type NormalizedProductVariant,\n type MoneyV2,\n NormalizedProduct,\n} from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\nimport { useCartContext } from '../../provider'\nimport { trackAddToCartGA, trackAddToCartFBQ, type GtmParams } from '../../tracking'\nimport { useApplyCartCodes } from './use-apply-cart-codes'\nimport { useRemoveCartCodes } from './use-remove-cart-codes'\nimport { useAddCartLines } from './use-add-cart-lines'\n\nexport type AddToCartLineItem = {\n variant?: NormalizedProductVariant & {\n product?: NormalizedProduct\n finalPrice?: MoneyV2\n }\n sellingPlanId?: string\n quantity?: number\n attributes?: Array<{ key: string; value: string }>\n}\n\nexport interface AddToCartInput {\n /** Lines to add */\n lineItems: Array<AddToCartLineItem>\n /** Cart ID (optional) */\n cartId?: string\n /** Discount codes to apply */\n discountCodes?: string[]\n /** Custom attributes for the cart */\n customAttributes?: Array<{ key: string; value: string }>\n /** 全量更新 codes,默认是追加 */\n replaceExistingCodes?: boolean\n /** Buyer identity for cart creation */\n buyerIdentity?: {\n email?: string\n countryCode?: string\n }\n /** GTM tracking parameters */\n gtmParams?: Omit<GtmParams, 'brand'>\n /** Force create new cart */\n needCreateCart?: boolean\n /** Callback when discount codes are invalid */\n onCodesInvalid?: (\n updatedCart: NormalizedCart,\n invalidCodes: string[]\n ) => Promise<NormalizedCart | undefined>\n}\n\nexport interface UseAddToCartOptions {\n /** Enable tracking (GA and FBQ) */\n withTrack?: boolean\n}\n\n/**\n * Hook for adding items to cart with tracking support\n *\n * This is the enhanced version that includes:\n * - Automatic cart creation if needed\n * - Discount code validation\n * - Google Analytics tracking\n * - Facebook Pixel tracking\n * - Invalid code handling\n *\n * @param options - Hook configuration\n * @param swrOptions - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating } = useAddToCart({ withTrack: true})\n *\n * await trigger({\n * lineItems: [{\n * variantId: 'gid://shopify/ProductVariant/123',\n * quantity: 2\n * }],\n * gtmParams: {\n * pageGroup: 'PDP',\n * position: 'Add to Cart Button'\n * }\n * })\n * ```\n */\nexport function useAddToCart(\n { withTrack = true }: UseAddToCartOptions = {},\n swrOptions?: SWRMutationConfiguration<NormalizedCart | undefined, Error, string, AddToCartInput>\n) {\n const { client, config, locale, cartCookieAdapter, userAdapter } = useShopify()\n const { cart } = useCartContext()\n const { trigger: applyCartCodes } = useApplyCartCodes()\n const { trigger: removeInvalidCodes } = useRemoveCartCodes()\n const { trigger: addCartLines } = useAddCartLines()\n\n const addToCart = useCallback(\n async (_key: string, { arg }: { arg: AddToCartInput }) => {\n const {\n lineItems,\n cartId: providedCartId,\n discountCodes,\n gtmParams = {},\n buyerIdentity,\n needCreateCart = false,\n onCodesInvalid,\n replaceExistingCodes,\n } = arg\n\n if (!lineItems || lineItems.length === 0) {\n return\n }\n\n // Transform line items to CartLineInput format\n const lines: CartLineInput[] = lineItems\n .map((item) => ({\n merchandiseId: item.variant?.id || '',\n quantity: item.quantity || 1,\n attributes: item.attributes,\n sellingPlanId: item.sellingPlanId,\n }))\n .filter((item) => item.merchandiseId && item.quantity)\n\n if (lines.length === 0) {\n return\n }\n\n // Determine cart ID\n const cartId = needCreateCart ? undefined : providedCartId || cart?.id\n\n // Add lines to cart\n let resultCart = await addCartLines({\n cartId,\n lines,\n buyerIdentity,\n })\n\n if (!resultCart) {\n return undefined\n }\n\n console.log('npm addCartLines resultCart', resultCart)\n\n // 删除不可用 code\n if (resultCart.discountCodes && resultCart.discountCodes.length > 0) {\n const unapplicableCodes = resultCart.discountCodes\n .filter((item) => !item.applicable)\n .map((item) => item.code)\n\n if (unapplicableCodes.length > 0) {\n // Call custom handler if provided\n if (onCodesInvalid) {\n const handledCart = await onCodesInvalid(resultCart, unapplicableCodes)\n if (handledCart) {\n resultCart = handledCart\n }\n } else {\n await removeInvalidCodes({\n discountCodes: unapplicableCodes,\n })\n }\n }\n }\n\n // 应用 code\n if (discountCodes && discountCodes.length > 0) {\n applyCartCodes({\n replaceExistingCodes,\n discountCodes,\n })\n }\n\n // Tracking\n if (withTrack) {\n // GA tracking\n trackAddToCartGA({\n lineItems,\n gtmParams: { ...gtmParams, brand: config.getBrand() },\n })\n\n // FBQ tracking\n trackAddToCartFBQ({ lineItems })\n }\n\n return resultCart\n },\n [client, locale, cartCookieAdapter, userAdapter, cart, withTrack]\n )\n\n return useSWRMutation('add-to-cart', addToCart, swrOptions)\n}\n","import { useShopify } from '../../provider'\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport { updateCartLines, UpdateCartLinesOptions, type NormalizedCart } from '@anker-in/shopify-sdk'\nimport { useCartContext } from '../../provider'\n\n/**\n * Hook for updating cart line quantities\n *\n * @param options - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating } = useUpdateCartLines()\n *\n * await trigger({\n * lines: [{\n * id: 'gid://shopify/CartLine/123',\n * quantity: 2\n * }]\n * })\n * ```\n */\nexport function useUpdateCartLines(\n options?: SWRMutationConfiguration<\n NormalizedCart | undefined,\n Error,\n 'update-cart-lines',\n UpdateCartLinesOptions\n >\n) {\n const { client, locale, cartCookieAdapter } = useShopify()\n const { mutateCart, metafieldIdentifiers } = useCartContext()\n\n const updateLines = useCallback(\n async (_key: string, { arg }: { arg: UpdateCartLinesOptions }) => {\n const updatedCart = await updateCartLines(client, {\n ...arg,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n\n if (updatedCart) {\n mutateCart(updatedCart)\n }\n return updatedCart\n },\n [client, locale, cartCookieAdapter, mutateCart]\n )\n\n return useSWRMutation('update-cart-lines', updateLines, options)\n}\n","import { useShopify } from '../../provider'\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport { removeCartLines, updateCartCodes, type NormalizedCart } from '@anker-in/shopify-sdk'\nimport { useCartContext } from '../../provider'\n\nexport interface RemoveCartLinesInput {\n /** Cart ID (optional, will use cookie) */\n cartId?: string\n /** Line IDs to remove */\n lineIds: string[]\n /** Whether to automatically remove invalid discount codes (default: true) */\n autoRemoveInvalidCodes?: boolean\n /** Callback when discount codes are removed */\n onCodesRemoved?: (\n updatedCart: NormalizedCart,\n removedCodes: string[]\n ) => Promise<NormalizedCart | undefined>\n}\n\n/**\n * Hook for removing lines from cart\n *\n * Automatically removes invalid discount codes after removing items\n *\n * @param options - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating } = useRemoveCartLines()\n *\n * await trigger({\n * lineIds: ['gid://shopify/CartLine/123']\n * })\n * ```\n */\nexport function useRemoveCartLines(\n options?: SWRMutationConfiguration<\n NormalizedCart | undefined,\n Error,\n 'remove-cart-lines',\n RemoveCartLinesInput\n >\n) {\n const { client, locale, cartCookieAdapter } = useShopify()\n const { mutateCart, metafieldIdentifiers } = useCartContext()\n\n const removeLines = useCallback(\n async (_key: string, { arg }: { arg: RemoveCartLinesInput }) => {\n const { autoRemoveInvalidCodes = true, onCodesRemoved, cartId, lineIds } = arg\n\n let updatedCart = await removeCartLines(client, {\n cartId,\n lineIds,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n\n if (updatedCart && autoRemoveInvalidCodes) {\n // Get unapplicable discount codes\n const unApplicableCodes = updatedCart.discountCodes\n .filter((item) => !item.applicable)\n .map((item) => item.code)\n\n if (unApplicableCodes.length > 0) {\n // Call custom handler if provided\n if (onCodesRemoved) {\n const handledCart = await onCodesRemoved(updatedCart, unApplicableCodes)\n if (handledCart) {\n updatedCart = handledCart\n }\n } else {\n // Default behavior: remove invalid codes\n updatedCart =\n (await updateCartCodes(client, {\n cartId: updatedCart.id,\n discountCodes: updatedCart.discountCodes\n .filter((item) => item.applicable)\n .map((item) => item.code),\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })) || updatedCart\n }\n }\n }\n\n if (updatedCart) {\n mutateCart(updatedCart)\n }\n return updatedCart\n },\n [client, locale, cartCookieAdapter, mutateCart]\n )\n\n return useSWRMutation('remove-cart-lines', removeLines, options)\n}\n","import { useShopify } from '../../provider'\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport {\n updateCartAttributes,\n type NormalizedCart,\n type HasMetafieldsIdentifier,\n} from '@anker-in/shopify-sdk'\n\nexport interface UpdateCartAttributesInput {\n /** Cart ID (optional, will use cookie) */\n cartId?: string\n /** Custom attributes to set on cart */\n attributes: Array<{ key: string; value: string }>\n}\n\n/**\n * Hook for updating cart attributes (custom key-value pairs)\n *\n * @param options - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating } = useUpdateCartAttributes()\n *\n * await trigger({\n * attributes: [\n * { key: 'gift_message', value: 'Happy Birthday!' },\n * { key: 'gift_wrap', value: 'true' }\n * ]\n * })\n * ```\n */\nexport function useUpdateCartAttributes(\n mutate: (cart: NormalizedCart | undefined) => void,\n metafieldIdentifiers?: {\n variant: HasMetafieldsIdentifier[]\n product: HasMetafieldsIdentifier[]\n },\n options?: SWRMutationConfiguration<\n NormalizedCart | undefined,\n Error,\n 'update-cart-attributes',\n UpdateCartAttributesInput\n >\n) {\n const { client, locale, cartCookieAdapter } = useShopify()\n\n const updateAttributes = useCallback(\n async (_key: string, { arg }: { arg: UpdateCartAttributesInput }) => {\n const updatedCart = await updateCartAttributes(client, {\n ...arg,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n\n console.log('useUpdateCartAttributes updatedCart', updatedCart)\n if (updatedCart) {\n mutate(updatedCart)\n }\n return updatedCart\n },\n [client, locale, cartCookieAdapter, mutate]\n )\n\n return useSWRMutation('update-cart-attributes', updateAttributes, options)\n}\n","/**\n * useBuyNow Hook\n * Creates a new cart and redirects to checkout immediately\n * Includes GA4 and Facebook Pixel tracking\n */\n\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport {\n type NormalizedCart,\n type CartLineInput,\n HasMetafieldsIdentifier,\n createCart,\n} from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\nimport {\n trackBuyNowGA,\n trackBuyNowFBQ,\n type GtmParams,\n type BuyNowTrackConfig,\n} from '../../tracking'\nimport { AddToCartLineItem } from './use-add-to-cart'\n\nexport interface BuyNowInput {\n /** Metafield identifiers */\n metafieldIdentifiers?: {\n variant: HasMetafieldsIdentifier[]\n product: HasMetafieldsIdentifier[]\n }\n /** Line items to add to the new cart */\n lineItems: Array<AddToCartLineItem>\n /** Discount codes to apply */\n discountCodes?: string[]\n /** Custom attributes for the cart */\n customAttributes?: Array<{ key: string; value: string }>\n /** Buyer identity */\n buyerIdentity?: {\n email?: string\n countryCode?: string\n }\n /** GTM tracking parameters */\n gtmParams?: Omit<GtmParams, 'brand'>\n /** Facebook Pixel tracking configuration */\n fbqTrackConfig?: BuyNowTrackConfig\n /** Whether to redirect to checkout page (default: true) */\n redirectToCheckout?: boolean\n}\n\nexport interface UseBuyNowOptions {\n /** Enable tracking (GA and FBQ) */\n withTrack?: boolean\n}\n\n/**\n * Hook for buy now functionality\n *\n * Creates a new cart with the specified items and redirects to checkout.\n * Includes automatic tracking for GA4 and Facebook Pixel.\n *\n * @param options - Hook configuration\n * @param swrOptions - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating } = useBuyNow({\n * withTrack: true,\n * redirectToCheckout: true,\n * })\n *\n * await trigger({\n * lineItems: [{\n * variantId: 'gid://shopify/ProductVariant/123',\n * quantity: 1\n * }],\n * gtmParams: {\n * pageGroup: 'PDP',\n * position: 'Buy Now Button'\n * }\n * })\n * ```\n */\nexport function useBuyNow(\n { withTrack = true }: UseBuyNowOptions = {},\n swrOptions?: SWRMutationConfiguration<NormalizedCart | undefined, Error, string, BuyNowInput>\n) {\n const { client, config, locale, cartCookieAdapter, userAdapter } = useShopify()\n\n const isLoggedIn = userAdapter?.isLoggedIn || false\n\n const buyNow = useCallback(\n async (_key: string, { arg }: { arg: BuyNowInput }) => {\n const {\n lineItems,\n discountCodes,\n gtmParams = {},\n buyerIdentity,\n fbqTrackConfig,\n customAttributes,\n metafieldIdentifiers,\n redirectToCheckout,\n } = arg\n\n if (!lineItems || lineItems.length === 0) {\n return\n }\n\n // Transform line items to CartLineInput format\n const lines: CartLineInput[] = lineItems\n .map((item) => ({\n merchandiseId: item.variant?.id || '',\n quantity: item.quantity || 1,\n attributes: item.attributes,\n sellingPlanId: item.sellingPlanId,\n }))\n .filter((item) => item.merchandiseId && item.quantity)\n\n if (lines.length === 0) {\n return\n }\n\n // Create new cart (cartId is undefined, so it will create a new one)\n const resultCart = await createCart(client, {\n lines,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n buyerIdentity,\n discountCodes,\n customAttributes,\n })\n\n if (!resultCart) {\n throw new Error('Failed to create cart for buy now')\n }\n\n // Tracking\n if (withTrack && resultCart.lineItems) {\n // GA tracking\n trackBuyNowGA({\n lineItems,\n gtmParams: { ...gtmParams, brand: config.getBrand() },\n })\n\n // FBQ tracking\n if (fbqTrackConfig) {\n trackBuyNowFBQ({ trackConfig: fbqTrackConfig })\n }\n }\n\n // Redirect to checkout\n if (redirectToCheckout) {\n if (resultCart.url) {\n if (typeof window !== 'undefined') {\n window.location.href = resultCart.url\n }\n } else {\n throw new Error('Failed to get checkout URL')\n }\n }\n\n return resultCart\n },\n [client, locale, isLoggedIn, cartCookieAdapter, withTrack]\n )\n\n return useSWRMutation('buy-now', buyNow, swrOptions)\n}\n","import { useMemo } from 'react'\nimport { useCalcAutoFreeGift } from './use-calc-auto-free-gift'\nimport {\n useScriptAutoFreeGift,\n type UseScriptAutoFreeGiftResult,\n} from './use-script-auto-free-gift'\nimport type { AddToCartLineItem } from '../use-add-to-cart'\nimport type { AutoFreeGiftConfig, FunctionGiftResult, CartLineInput } from '../types/auto-free-gift'\nimport { useShopify, useCartContext } from '../../../provider'\nimport { CUSTOMER_SCRIPT_GIFT_KEY } from '../const'\n\nexport interface UseCalcGiftsFromLinesOptions {\n /** Lines to calculate gifts from (AddToCartLineItem format) */\n lines: AddToCartLineItem[]\n /** Auto free gift configuration (Function gift) */\n autoFreeGiftConfig?: AutoFreeGiftConfig\n /** Customer information (required for function gift) */\n customer?: any\n /** Script gift campaign configuration */\n scriptCampaign?: any\n /** Script giveaway attribute key */\n scriptGiveawayKey?: string\n /** Locale for product fetching (optional, will use from ShopifyProvider if not provided) */\n locale?: string\n}\n\nexport interface UseCalcGiftsFromLinesResult {\n /** Function gift calculation result */\n functionGift: FunctionGiftResult\n /** Script gift calculation result */\n scriptGift: UseScriptAutoFreeGiftResult\n /** All gift lines that need to be added to cart (combined from both) */\n allGiftLines: CartLineInput[]\n /** Whether any gifts are available */\n hasGifts: boolean\n}\n\n/**\n * Calculate gifts from AddToCartLineItem[] before adding to cart\n * Supports both function-based gifts (useCalcAutoFreeGift) and script-based gifts (useScriptAutoFreeGift)\n *\n * Automatically uses locale from ShopifyProvider and cart from CartContext if not provided.\n *\n * @example\n * ```tsx\n * // Basic usage (locale from context, customer required for function gift)\n * const { allGiftLines, hasGifts } = useCalcGiftsFromLines({\n * lines: [{ variant: myVariant, quantity: 2 }],\n * customer: currentCustomer,\n * autoFreeGiftConfig: functionGiftConfig,\n * scriptCampaign: scriptGiftConfig,\n * })\n *\n * // Script gift only (no customer needed)\n * const { allGiftLines, hasGifts } = useCalcGiftsFromLines({\n * lines: [{ variant: myVariant, quantity: 2 }],\n * scriptCampaign: scriptGiftConfig,\n * })\n *\n * // With custom locale\n * const { allGiftLines, hasGifts } = useCalcGiftsFromLines({\n * lines: [{ variant: myVariant, quantity: 2 }],\n * customer: currentCustomer,\n * locale: 'fr',\n * autoFreeGiftConfig: functionGiftConfig,\n * })\n *\n * // Then add both products and gifts to cart\n * await addToCart({\n * lineItems: [...lines, ...allGiftLines]\n * })\n * ```\n */\nexport function useCalcGiftsFromLines({\n lines,\n customer,\n scriptGiveawayKey = CUSTOMER_SCRIPT_GIFT_KEY,\n}: UseCalcGiftsFromLinesOptions): UseCalcGiftsFromLinesResult {\n const { locale } = useShopify()\n const { cart, autoFreeGiftConfig, gradientGiftsConfig } = useCartContext()\n\n // Calculate function-based gifts (满赠)\n const functionGift = useCalcAutoFreeGift(cart, autoFreeGiftConfig || [], customer, lines)\n\n // Calculate script-based gifts (老script满赠)\n const scriptGift = useScriptAutoFreeGift({\n campaign: gradientGiftsConfig || null,\n _giveaway: scriptGiveawayKey,\n cart: cart,\n locale,\n lines,\n })\n\n // Combine all gift lines from both sources\n const allGiftLines = useMemo((): CartLineInput[] => {\n const functionGiftLines = functionGift.qualifyingGift?.itemsToAdd || []\n\n // Convert script gift format to CartLineInput format\n const scriptGiftLines: CartLineInput[] = scriptGift.freeGiftLevel\n ? scriptGift.freeGiftLevel.giveawayProducts\n .map((product) => {\n const giftProduct = scriptGift.giftProductsResult?.find(\n (p) => p.handle === product.handle\n )\n const variant = giftProduct?.variants?.[0]\n\n return {\n variant: {\n id: variant?.id || '',\n handle: product.handle,\n sku: product.sku,\n },\n quantity: 1,\n attributes: [\n {\n key: scriptGiveawayKey,\n value: 'true',\n },\n ],\n }\n })\n .filter((item) => item.variant.id) // Only include items with valid variant IDs\n : []\n\n return [...functionGiftLines, ...scriptGiftLines]\n }, [\n functionGift.qualifyingGift,\n scriptGift.freeGiftLevel,\n scriptGift.giftProductsResult,\n scriptGiveawayKey,\n ])\n\n // Check if any gifts are available\n const hasGifts = useMemo(() => {\n return allGiftLines.length > 0\n }, [allGiftLines])\n\n return {\n functionGift,\n scriptGift,\n allGiftLines,\n hasGifts,\n }\n}\n","import { RuleCondition } from './auto-free-gift'\n\nexport enum OrderDiscountType {\n PERCENTAGE = 1, // 百分比折扣\n FIXED_AMOUNT = 2, // 固定金额折扣\n REDUCE_PRICE = 3, // 降低指定价格\n}\n\nexport enum OrderBasePriceType {\n ORIGIN_PRICE = 1, // 原价\n MIN_DISCOUNTED_PRICE = 2, // 最低折扣价\n}\n\nexport type TieredDiscount = {\n amount: number // 消费门槛金额\n discount: number // 折扣金额\n discount_type: OrderDiscountType // 折扣类型\n}\n\nexport type OrderDiscountConfig = {\n rule_id: number\n rule_type: number\n rule_conditions?: RuleCondition[]\n result_detail: {\n main_product: {\n variant_list: Array<{\n variant_id: string\n sku: string\n handle: string\n }>\n all_store_variant: boolean\n }\n order_discount_conf: {\n base_price: OrderBasePriceType\n tiered_discounts: TieredDiscount[]\n }\n }\n}\n","import { useMemo } from 'react'\nimport { preCheck, getMatchedMainProductSubTotal } from '../utils/auto-free-gift'\nimport {\n OrderDiscountConfig,\n OrderDiscountType,\n OrderBasePriceType,\n TieredDiscount,\n} from '../types/order-discount'\n\n// 返回结果类型\nexport interface OrderDiscountResult {\n qualifyingDiscount: TieredDiscount | null // 当前应得的折扣\n nextTierGoal: TieredDiscount | null // 下一个目标阶梯\n activeCampaign: OrderDiscountConfig | null // 当前生效的活动配置\n discountAmount: number // 折扣金额\n cartTotalForDiscount: number // 用于计算折扣的购物车总额\n isLoading: boolean // 依赖数据是否加载中\n}\n\n/**\n * [计算型 Hook]\n * 根据购物车、活动配置和用户信息,计算出应得的订单折扣和下一个目标。\n * 此 Hook 不产生任何副作用。\n * 使用示例:\n * const { qualifyingDiscount, nextTierGoal, activeCampaign, discountAmount, isLoading } = useCalcOrderDiscount(cart, orderDiscountConfig);\n * @param cart - 购物车\n * @param orderDiscountConfig - 订单折扣配置\n * @returns { OrderDiscountResult }\n */\nexport const useCalcOrderDiscount = (\n cart: any,\n orderDiscountConfig: OrderDiscountConfig[],\n customer: any\n): OrderDiscountResult => {\n const tags = useMemo(() => customer?.tags || [], [customer?.tags])\n const isCustomerLoading = useMemo(() => (!customer ? true : false), [customer])\n const dealsType: string = '' // 可从URL或Context获取\n\n // 1. 找到当前生效的活动和用于计算的子总价\n const { activeCampaign, subtotal } = useMemo(() => {\n // 遍历所有活动配置\n for (const campaign of orderDiscountConfig) {\n const { rule_conditions = [], result_detail } = campaign\n const { main_product, order_discount_conf } = result_detail || {}\n\n // 前置检查,判断用户和环境是否满足活动条件\n const isPreCheckPassed = preCheck(rule_conditions, tags, dealsType ? [dealsType] : [])\n\n if (isPreCheckPassed && main_product && order_discount_conf) {\n // 计算参与活动的主商品的总价\n const matchedSubtotal = getMatchedMainProductSubTotal(\n cart,\n main_product?.variant_list?.map((v) => v.variant_id) || [],\n {\n spend_money_type:\n order_discount_conf.base_price === OrderBasePriceType.MIN_DISCOUNTED_PRICE ? 2 : 1, // 根据基础价格类型设置\n variant_id_list: main_product?.variant_list?.map((v) => v.variant_id) || [],\n all_store_variant: main_product?.all_store_variant || false,\n }\n )\n\n // 如果有主商品在购物车中,则此活动为当前生效的活动\n if (matchedSubtotal > 0) {\n return { activeCampaign: campaign, subtotal: matchedSubtotal }\n }\n }\n }\n // 没有找到生效的活动\n return { activeCampaign: null, subtotal: 0 }\n }, [orderDiscountConfig, cart, tags, dealsType])\n\n // 2. 根据子总价,计算应得折扣和下一个目标\n const { qualifyingDiscount, nextTierGoal, discountAmount } = useMemo(() => {\n if (!activeCampaign || !activeCampaign.result_detail?.order_discount_conf?.tiered_discounts) {\n return {\n qualifyingDiscount: null,\n nextTierGoal: null,\n discountAmount: 0,\n }\n }\n\n const tieredDiscounts = activeCampaign.result_detail.order_discount_conf.tiered_discounts\n\n // a. 找到当前满足条件的最高阶梯 (findLast)\n const qualifyingTier = [...tieredDiscounts].reverse().find((tier) => subtotal >= Number(tier.amount))\n\n // b. 找到下一个目标阶梯 (第一个门槛比当前subtotal高的)\n const nextGoal = tieredDiscounts.find((tier) => subtotal < Number(tier.amount))\n\n if (!qualifyingTier) {\n return {\n qualifyingDiscount: null,\n nextTierGoal: nextGoal || null,\n discountAmount: 0,\n }\n }\n\n // c. 计算折扣金额\n let calculatedDiscount = 0\n switch (qualifyingTier.discount_type) {\n case OrderDiscountType.PERCENTAGE:\n // 百分比折扣\n calculatedDiscount = (subtotal * qualifyingTier.discount) / 100\n break\n case OrderDiscountType.FIXED_AMOUNT:\n // 固定金额折扣\n calculatedDiscount = qualifyingTier.discount\n break\n case OrderDiscountType.REDUCE_PRICE:\n // 降低指定价格\n calculatedDiscount = Math.min(subtotal, qualifyingTier.discount)\n break\n default:\n calculatedDiscount = 0\n }\n\n return {\n qualifyingDiscount: qualifyingTier,\n nextTierGoal: nextGoal || null,\n discountAmount: calculatedDiscount,\n }\n }, [activeCampaign, subtotal])\n\n return {\n qualifyingDiscount,\n nextTierGoal,\n activeCampaign,\n discountAmount,\n cartTotalForDiscount: subtotal,\n isLoading: isCustomerLoading,\n }\n}\n","/**\n * useHasPlusMemberInCart Hook\n * 判断购物车中是否包含年费会员或月费会员产品\n */\n\nimport { useMemo } from 'react'\nimport type { PlusMemberSettingsMetafields } from './types'\nimport { NormalizedCart } from '@anker-in/shopify-sdk'\n\nexport interface UseHasPlusMemberInCartProps {\n /** Plus Member 配置 */\n memberSetting?: PlusMemberSettingsMetafields\n /** 购物车数据 */\n cart?: NormalizedCart\n}\n\nexport interface HasPlusMemberInCartResult {\n /** 购物车中是否有任何会员产品 */\n hasPlusMember: boolean\n /** 购物车中是否有月费会员产品 */\n hasMonthlyPlus: boolean\n /** 购物车中是否有年费会员产品 */\n hasAnnualPlus: boolean\n /** 月费会员产品的 line item */\n monthlyPlusItem?: {\n id: string\n quantity: number\n handle?: string\n sku?: string\n }\n /** 年费会员产品的 line item */\n annualPlusItem?: {\n id: string\n quantity: number\n handle?: string\n sku?: string\n }\n}\n\n/**\n * 判断购物车中是否包含年费会员或月费会员产品\n *\n * @param props - Hook 参数\n * @param props.metafields - Plus Member 配置\n * @returns 会员产品信息\n *\n * @example\n * ```tsx\n * const {\n * hasPlusMember,\n * hasMonthlyPlus,\n * hasAnnualPlus,\n * monthlyPlusItem,\n * annualPlusItem,\n * } = useHasPlusMemberInCart({\n * memberSetting: plusMemberSettings,\n * })\n *\n * if (hasPlusMember) {\n * console.log('购物车中有会员产品')\n * }\n * ```\n */\nexport function useHasPlusMemberInCart({\n memberSetting,\n cart,\n}: UseHasPlusMemberInCartProps): HasPlusMemberInCartResult {\n const { plus_monthly_product, plus_annual_product } = memberSetting || {}\n\n return useMemo(() => {\n if (!cart?.lineItems) {\n return {\n hasPlusMember: false,\n hasMonthlyPlus: false,\n hasAnnualPlus: false,\n }\n }\n\n // 查找月费会员产品\n const monthlyPlusItem = cart.lineItems.find(\n (item) =>\n item.product?.handle === plus_monthly_product?.handle &&\n item.variant?.sku === plus_monthly_product?.sku\n )\n\n // 查找年费会员产品\n const annualPlusItem = cart.lineItems.find(\n (item) =>\n item.product?.handle === plus_annual_product?.handle &&\n item.variant?.sku === plus_annual_product?.sku\n )\n\n const hasMonthlyPlus = !!monthlyPlusItem\n const hasAnnualPlus = !!annualPlusItem\n const hasPlusMember = hasMonthlyPlus || hasAnnualPlus\n\n return {\n hasPlusMember,\n hasMonthlyPlus,\n hasAnnualPlus,\n monthlyPlusItem: monthlyPlusItem,\n annualPlusItem: annualPlusItem,\n }\n }, [cart?.lineItems, plus_monthly_product, plus_annual_product])\n}\n","import Cookies from 'js-cookie'\nimport { useEffect, useMemo, useState } from 'react'\nimport { NormalizedCart } from '@anker-in/shopify-sdk'\nimport Decimal from 'decimal.js'\nimport { PlusMemberSettingsMetafields } from '../../member'\nimport { useHasPlusMemberInCart } from '../../member/plus/use-has-plus-member-in-cart'\n\nexport const getReferralAttributes = () => {\n const inviteCode = Cookies.get('invite_code')\n const playModeId = Cookies.get('playModeId')\n const popup = Cookies.get('_popup')\n if (inviteCode && playModeId) {\n return popup\n ? [\n { key: '_invite_code', value: inviteCode ? inviteCode : '' },\n { key: '_play_mode_id', value: playModeId ? playModeId : '' },\n { key: '_popup', value: popup },\n ]\n : [\n { key: '_invite_code', value: inviteCode ? inviteCode : '' },\n { key: '_play_mode_id', value: playModeId ? playModeId : '' },\n ]\n }\n return []\n}\n\nexport const useCartAttributes = ({\n profile,\n customer,\n cart,\n memberSetting,\n}: {\n profile: any\n customer: any\n cart?: NormalizedCart\n memberSetting?: PlusMemberSettingsMetafields\n}): { attributes: Array<{ key: string; value: any }> } => {\n const [currentUrl, setCurrentUrl] = useState('')\n const { hasPlusMember } = useHasPlusMemberInCart({\n memberSetting,\n cart,\n })\n\n useEffect(() => {\n setCurrentUrl(window.location.href)\n }, [])\n\n const userType = useMemo(() => {\n let userInfo: any = Cookies.get('userInfo')\n if (userInfo) {\n userInfo = JSON.parse(userInfo)\n let arr = typeof userInfo?.id == 'string' && userInfo?.id.split('/')\n userInfo.setId = arr[arr.length - 1]\n }\n const customerInfo = userInfo || customer\n if (!customerInfo) {\n return 'new_user_unlogin'\n }\n if (customer) {\n const { orders = {} } = customer\n if (orders?.edges?.length === 1) {\n return 'old_user_orders_once'\n } else if (orders?.edges?.length > 1) {\n return 'old_user_orders_twice'\n }\n }\n return 'new_user_login'\n }, [customer])\n\n // 用户相关\n const memberAttributes = useMemo(() => {\n return [\n {\n key: '_token',\n value: profile?.token, //是否登录\n },\n {\n key: '_member_type',\n value: hasPlusMember ? '2' : profile?.memberType, //:0(游客),1(普通会员),2(付费会员)\n },\n {\n key: '_user_type',\n value: userType, // n\n },\n {\n key: '_is_login',\n value: profile?.token ? 'true' : 'false',\n },\n ]\n }, [profile?.memberType, profile?.token, userType, hasPlusMember])\n\n const functionAttributes = useMemo(() => {\n return [\n cart?.discountCodes && {\n key: '_discounts_function_env',\n value: JSON.stringify({\n discount_code: cart?.discountCodes.map((item) => item.code),\n user_tags: customer?.tags || [],\n }),\n },\n ]\n }, [cart])\n\n const presellAttributes = useMemo(() => {\n return [\n {\n key: '_presale',\n value: cart?.lineItems.some((item) => item?.variant?.metafields?.presell === 'presell'),\n },\n ]\n }, [cart])\n\n const weightAttributes = useMemo(() => {\n return [\n {\n key: '_weight',\n value: cart?.lineItems\n .reduce<number>((acc, item) => {\n return new Decimal(acc).plus(item.variant.weight ?? 0).toNumber()\n }, 0)\n .toString(),\n },\n {\n key: '_app_source_name',\n value: 'dtc',\n },\n ]\n }, [cart])\n\n const trackingAttributes = useMemo(() => {\n return [\n {\n key: 'utm_params',\n value: currentUrl,\n },\n ]\n }, [currentUrl])\n\n return useMemo(\n () => ({\n attributes: [\n ...memberAttributes,\n ...functionAttributes,\n ...presellAttributes,\n ...weightAttributes,\n ...trackingAttributes,\n ...getReferralAttributes(),\n ].filter((item) => item?.value) as Array<{ key: string; value: any }>,\n }),\n [memberAttributes, functionAttributes, presellAttributes, weightAttributes, trackingAttributes]\n )\n}\n","import { useMemo } from 'react'\nimport { type NormalizedCart, type NormalizedLineItem } from '@anker-in/shopify-sdk'\n\nconst DEFAULT_MIN = 1\nconst DEFAULT_MAX = 999\n\nexport const useCartItemQuantityLimit = ({\n cart,\n cartItem,\n config,\n}: {\n cart?: NormalizedCart\n cartItem: NormalizedLineItem\n config: {\n handle: Record<string, { min: number; max: number }>\n sku: Record<string, { min: number; max: number }>\n }\n}) => {\n const quantityLimit = useMemo(() => {\n if (config?.handle) {\n // 按handle维度限制\n const cartItemQuantityLimit = config?.handle?.[cartItem?.product?.handle || '']\n\n const sameHandleTotalQuantity =\n cart?.lineItems.reduce((acc, item) => {\n if (\n item.product?.handle === cartItem?.product?.handle &&\n item.variant.sku !== cartItem.variant.sku\n ) {\n acc += item.quantity\n }\n return acc\n }, 0) || 0\n\n return {\n min: cartItemQuantityLimit?.min || DEFAULT_MIN,\n max: cartItemQuantityLimit?.max\n ? cartItemQuantityLimit?.max - sameHandleTotalQuantity\n : DEFAULT_MAX,\n }\n } else if (config?.sku) {\n const cartItemQuantityLimit = config?.sku?.[cartItem?.variant?.sku]\n\n return {\n min: cartItemQuantityLimit?.min || DEFAULT_MIN,\n max: cartItemQuantityLimit?.max || DEFAULT_MAX,\n }\n }\n\n return {\n min: DEFAULT_MIN,\n max: DEFAULT_MAX,\n }\n }, [cartItem, cart])\n\n return quantityLimit\n}\n","import { useEffect, useMemo } from 'react'\nimport {\n CODE_AMOUNT_KEY,\n CUSTOMER_ATTRIBUTE_KEY,\n MAIN_PRODUCT_CODE,\n SCRIPT_CODE_AMOUNT_KEY,\n} from '../const'\nimport { updateCartLines } from '@anker-in/shopify-sdk'\nimport type { NormalizedCart, HasMetafieldsIdentifier } from '@anker-in/shopify-sdk'\nimport { useRequest } from 'ahooks'\nimport { getDiscountEnvAttributeValue } from '../utils/auto-free-gift'\nimport { useShopify } from '../../../provider'\n\nexport const useUpdateLineCodeAmountAttributes = ({\n cart,\n mutateCart,\n isCartLoading,\n setLoadingState,\n metafieldIdentifiers,\n}: {\n cart?: NormalizedCart\n mutateCart: (cart: NormalizedCart | undefined) => void\n isCartLoading: boolean\n setLoadingState: React.Dispatch<React.SetStateAction<any>>\n metafieldIdentifiers?: {\n variant: HasMetafieldsIdentifier[]\n product: HasMetafieldsIdentifier[]\n }\n}) => {\n const { client, cartCookieAdapter } = useShopify()\n\n const mainProductDiscountCodes = useMemo(\n () =>\n cart?.discountCodes\n .filter(\n ({ code, applicable }) =>\n applicable && MAIN_PRODUCT_CODE.some((codePrefix) => code.startsWith(codePrefix))\n )\n .map(({ code }) => code),\n [cart]\n )\n\n const linesNeedUpdate = useMemo(\n () =>\n cart?.lineItems\n .map((line) => {\n const attrNeedUpdate: Array<{ key: string; value: string }> = []\n const attrNeedDelete = []\n\n const codeDiscount = line.discountAllocations?.find((allocation) =>\n mainProductDiscountCodes?.includes(allocation.code)\n )\n\n // 是否有 _discounts_function_env 属性\n const hasFunctionEnvAttribute = line.customAttributes?.find(\n (attr: { key: string; value: string }) => attr.key === CUSTOMER_ATTRIBUTE_KEY\n )\n const functionEnvValue = getDiscountEnvAttributeValue(line.customAttributes)\n // lineItem 折后总价与attr中的不一致的情况\n const hasSameFunctionEnvAttribute =\n Number(functionEnvValue.discounted_amount) === Number(line.totalAmount)\n\n if (!hasSameFunctionEnvAttribute && hasFunctionEnvAttribute) {\n attrNeedUpdate.push({\n key: CUSTOMER_ATTRIBUTE_KEY,\n value: JSON.stringify({\n ...functionEnvValue,\n discounted_amount: Number(line.totalAmount),\n }),\n })\n }\n\n const codeDiscountAmount = codeDiscount?.amount || 0\n // 是否有 code_money 属性\n const hasCodeAmountAttribute = line.customAttributes?.find(\n (attr: { key: string; value: string }) =>\n attr.key === CODE_AMOUNT_KEY || attr.key === SCRIPT_CODE_AMOUNT_KEY\n )\n // 两个属性都存在且值相同,则不更新\n const hasSameCodeAmountAttribute =\n line.customAttributes?.find(\n (attr: { key: string; value: string }) =>\n attr.key === CODE_AMOUNT_KEY && attr.value === String(codeDiscountAmount)\n ) &&\n line.customAttributes?.find(\n (attr: { key: string; value: string }) =>\n attr.key === SCRIPT_CODE_AMOUNT_KEY && attr.value === String(codeDiscountAmount)\n )\n\n if (codeDiscount && !hasSameCodeAmountAttribute) {\n attrNeedUpdate.push({\n key: CODE_AMOUNT_KEY,\n value: String(codeDiscountAmount),\n })\n attrNeedUpdate.push({\n key: SCRIPT_CODE_AMOUNT_KEY,\n value: String(codeDiscountAmount),\n })\n } else if (!codeDiscount && hasCodeAmountAttribute) {\n // 没有 code 需要删除的情况\n attrNeedDelete.push(CODE_AMOUNT_KEY)\n attrNeedDelete.push(SCRIPT_CODE_AMOUNT_KEY)\n }\n\n return {\n line,\n attrNeedUpdate,\n attrNeedDelete,\n }\n })\n .filter(\n ({ attrNeedUpdate, attrNeedDelete }) => attrNeedUpdate.length || attrNeedDelete.length\n )\n .map(({ line, attrNeedUpdate, attrNeedDelete }) => {\n if (attrNeedUpdate.length) {\n return {\n id: line.id,\n attributes: [\n ...(line.customAttributes?.filter(\n (attr: { key: string; value: string }) =>\n !attrNeedUpdate.some((updateAttr) => updateAttr.key === attr.key)\n ) || []),\n ...attrNeedUpdate,\n ],\n }\n } else if (attrNeedDelete.length) {\n return {\n id: line.id,\n attributes:\n line.customAttributes?.filter(\n (attr: { key: string; value: string }) => !attrNeedDelete.includes(attr.key)\n ) || [],\n }\n } else {\n return {\n id: line.id,\n attributes: line.customAttributes || [],\n }\n }\n }),\n [cart?.lineItems, mainProductDiscountCodes]\n )\n\n const { loading } = useRequest(\n async () => {\n if (linesNeedUpdate?.length && !isCartLoading) {\n const result = await updateCartLines(client, {\n cartId: cart?.id || '',\n lines: linesNeedUpdate,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n if (result) {\n mutateCart(result)\n }\n }\n },\n {\n throttleWait: 3000, // 3 秒内只触发最后一次更新\n throttleTrailing: true,\n refreshDeps: [linesNeedUpdate, isCartLoading],\n }\n )\n\n useEffect(() => {\n setLoadingState((prev: any) => {\n return {\n ...prev,\n editLineCodeAmountLoading: loading,\n }\n })\n }, [loading, setLoadingState])\n}\n","export enum PriceDiscountType {\n PERCENTAGE = 1, // 百分比折扣\n FIXED_AMOUNT = 2, // 固定金额折扣\n}\n\nexport enum PriceBasePriceType {\n MIN_DISCOUNTED_PRICE = 1, // 最低折扣价\n MIN_TOTAL_PRICE = 2, // 最低总价\n}\n\nexport type PriceDiscountConfig = {\n rule_id: number\n rule_type: number\n discount_type: PriceDiscountType\n discount_value: number\n base_price_type: PriceBasePriceType\n applicable_products: Array<{\n product_id: string\n variant_id?: string\n }>\n}\n","/**\n * useProduct Hook\n *\n * Fetches a single product by handle with SWR caching\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getProduct, type NormalizedProduct } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseProductOptions extends SWRConfiguration<NormalizedProduct | undefined> {\n handle?: string\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\n/**\n * Hook to fetch a single product by handle\n *\n * @param options - Hook options including handle and SWR configuration\n * @returns SWR response with product data\n *\n * @example\n * ```typescript\n * function ProductPage() {\n * const { data: product, error, isLoading } = useProduct({\n * handle: 'my-product'\n * })\n *\n * if (isLoading) return <div>Loading...</div>\n * if (error) return <div>Error loading product</div>\n * if (!product) return <div>Product not found</div>\n *\n * return (\n * <div>\n * <h1>{product.title}</h1>\n * <p>{product.description}</p>\n * <p>${product.price.amount}</p>\n * </div>\n * )\n * }\n * ```\n */\nexport function useProduct(options: UseProductOptions = {}) {\n const { client, locale } = useShopify()\n const { handle, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<NormalizedProduct | undefined>(\n handle ? ['product', locale, handle, metafieldIdentifiers] : null,\n () =>\n getProduct(client, {\n handle: handle!,\n locale,\n metafieldIdentifiers,\n }),\n swrOptions\n )\n}\n","/**\n * useAllProducts Hook\n *\n * Fetches all products with SWR caching\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getAllProducts, type NormalizedProduct } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseAllProductsOptions extends SWRConfiguration<NormalizedProduct[]> {\n first?: number\n query?: string\n sortKey?:\n | 'TITLE'\n | 'PRODUCT_TYPE'\n | 'VENDOR'\n | 'UPDATED_AT'\n | 'CREATED_AT'\n | 'BEST_SELLING'\n | 'PRICE'\n | 'RELEVANCE'\n reverse?: boolean\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\n/**\n * Hook to fetch all products\n *\n * This hook automatically handles pagination and fetches all products.\n * Use with caution on stores with many products.\n *\n * @param options - Hook options including query parameters and SWR configuration\n * @returns SWR response with products array\n *\n * @example\n * ```typescript\n * function ProductList() {\n * const { data: products, error, isLoading } = useAllProducts({\n * sortKey: 'TITLE',\n * reverse: false\n * })\n *\n * if (isLoading) return <div>Loading...</div>\n * if (error) return <div>Error loading products</div>\n *\n * return (\n * <div>\n * {products?.map(product => (\n * <div key={product.id}>\n * <h2>{product.title}</h2>\n * <p>${product.price.amount}</p>\n * </div>\n * ))}\n * </div>\n * )\n * }\n * ```\n */\nexport function useAllProducts(options: UseAllProductsOptions = {}) {\n const { client, locale } = useShopify()\n const { first, query, sortKey, reverse, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<NormalizedProduct[]>(\n ['all-products', locale, first, query, sortKey, reverse, metafieldIdentifiers],\n () =>\n getAllProducts(client, {\n locale,\n first,\n query,\n sortKey,\n reverse,\n metafieldIdentifiers,\n }),\n swrOptions\n )\n}\n","/**\n * useProductsByHandles Hook\n *\n * Fetches multiple products by their handles with SWR caching\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport {\n getProductsByHandles,\n HasMetafieldsIdentifier,\n type NormalizedProduct,\n} from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseProductsByHandlesOptions extends SWRConfiguration<NormalizedProduct[]> {\n handles?: string[]\n metafieldIdentifiers?: {\n product: HasMetafieldsIdentifier[]\n variant: HasMetafieldsIdentifier[]\n }\n}\n\n/**\n * Hook to fetch multiple products by their handles\n *\n * @param options - Hook options including handles array and SWR configuration\n * @returns SWR response with products array\n *\n * @example\n * ```typescript\n * function FeaturedProducts() {\n * const { data: products, error, isLoading } = useProductsByHandles({\n * handles: ['product-1', 'product-2', 'product-3']\n * })\n *\n * if (isLoading) return <div>Loading...</div>\n * if (error) return <div>Error loading products</div>\n *\n * return (\n * <div>\n * {products?.map(product => (\n * <div key={product.id}>\n * <h2>{product.title}</h2>\n * <p>${product.price.amount}</p>\n * </div>\n * ))}\n * </div>\n * )\n * }\n * ```\n */\nexport function useProductsByHandles(options: UseProductsByHandlesOptions = {}) {\n const { client, locale } = useShopify()\n const { handles: originHandles, metafieldIdentifiers, ...swrOptions } = options\n const handles = new Set(originHandles || [])\n\n // Create a stable key for SWR\n // Sort handles to ensure consistent cache key\n const sortedHandles = handles ? [...handles].sort() : undefined\n\n return useSWR<NormalizedProduct[]>(\n sortedHandles && sortedHandles.length > 0\n ? ['products-by-handles', locale, sortedHandles.join(','), metafieldIdentifiers]\n : null,\n () => {\n const handlesArray = [...handles]\n if (handlesArray?.length === 0) {\n throw new Error('Handles are required')\n }\n return getProductsByHandles(client, {\n handles: [...handles],\n locale,\n metafieldIdentifiers,\n })\n },\n swrOptions || {\n revalidateOnFocus: false,\n }\n )\n}\n","/**\n * useVariant Hook\n *\n * Client-side hook to get the selected variant based on selected options\n */\n\nimport { useEffect, useState } from 'react'\nimport type { NormalizedProduct, NormalizedProductVariant } from '@anker-in/shopify-sdk'\n\nexport type Options = Record<string, string>\n\n/**\n * Get the first available variant from a product\n */\nfunction getFirstAvailableVariant(product: NormalizedProduct): NormalizedProductVariant | undefined {\n const availableVariant = product.variants.find((v) => v.availableForSale)\n return availableVariant || product.variants[0]\n}\n\n/**\n * Get variant from selected options\n */\nfunction getVariantFromSelectedOptions(\n product: NormalizedProduct,\n selectedOptions: Options\n): NormalizedProductVariant | undefined {\n return product.variants.find((variant) => {\n return variant.selectedOptions.every((option) => {\n return selectedOptions[option.name] === option.value\n })\n })\n}\n\n/**\n * Hook to manage variant selection based on selected options\n *\n * @param product - The product object\n * @param selectedOptions - Currently selected options { Color: 'Red', Size: 'M' }\n * @returns The matching variant\n *\n * @example\n * ```typescript\n * function ProductDetail() {\n * const { data: product } = useProduct({ handle: 'my-product' })\n * const [selectedOptions, setSelectedOptions] = useState({ Color: 'Red', Size: 'M' })\n * const variant = useVariant({ product, selectedOptions })\n *\n * return (\n * <div>\n * <h1>{product.title}</h1>\n * <p>Selected: {variant.title}</p>\n * <p>Price: ${variant.price.amount}</p>\n * <p>Available: {variant.availableForSale ? 'Yes' : 'No'}</p>\n * </div>\n * )\n * }\n * ```\n */\nexport function useVariant({\n product,\n selectedOptions,\n}: {\n product?: NormalizedProduct\n selectedOptions: Options\n}): NormalizedProductVariant | undefined {\n const [variant, setVariant] = useState<NormalizedProductVariant | undefined>(\n product ? getFirstAvailableVariant(product) : undefined\n )\n\n useEffect(() => {\n if (!product) {\n setVariant(undefined)\n return\n }\n\n const newVariant = getVariantFromSelectedOptions(product, selectedOptions)\n if (newVariant && newVariant.id !== variant?.id) {\n setVariant(newVariant)\n } else if (!newVariant) {\n // If no matching variant, use first available\n setVariant(getFirstAvailableVariant(product))\n }\n }, [selectedOptions, product, variant?.id])\n\n return variant\n}\n","/**\n * usePrice Hook\n *\n * Client-side hook to format price for display\n */\n\nimport { useMemo } from 'react'\nimport { useShopify } from '../../provider'\n\nconst FAKE_PRICE = 9999999.99\n\n/**\n * Format price using Intl.NumberFormat\n */\nfunction formatPrice({\n amount,\n currencyCode,\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n removeTrailingZeros,\n}: {\n amount: number\n currencyCode: string\n locale: string\n maximumFractionDigits?: number\n minimumFractionDigits?: number\n removeTrailingZeros?: boolean\n}): string {\n const formatter = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n maximumFractionDigits: maximumFractionDigits ?? 2,\n minimumFractionDigits: minimumFractionDigits ?? 2,\n })\n\n let formatted = formatter.format(amount)\n\n if (removeTrailingZeros) {\n formatted = formatted.replace(/\\.00$/, '')\n }\n\n return formatted\n}\n\n/**\n * Format variant price with compare at price\n */\nfunction formatVariantPrice({\n amount,\n baseAmount,\n currencyCode,\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n removeTrailingZeros,\n}: {\n amount: number\n baseAmount: number\n currencyCode: string\n locale: string\n maximumFractionDigits?: number\n minimumFractionDigits?: number\n removeTrailingZeros?: boolean\n}): { price: string; basePrice: string } {\n return {\n price: formatPrice({\n amount,\n currencyCode,\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n removeTrailingZeros,\n }),\n basePrice: formatPrice({\n amount: baseAmount,\n currencyCode,\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n removeTrailingZeros,\n }),\n }\n}\n\nexport interface UsePriceOptions {\n amount: number\n baseAmount?: number\n currencyCode: string\n soldOutDescription?: string\n maximumFractionDigits?: number\n minimumFractionDigits?: number\n removeTrailingZeros?: boolean\n}\n\nexport interface UsePriceResult {\n price: string\n basePrice?: string\n free: boolean\n}\n\n/**\n * Hook to format price for display\n *\n * @param options - Price formatting options\n * @returns Formatted price object\n *\n * @example\n * ```typescript\n * function ProductPrice({ variant }) {\n * const { price, basePrice, free } = usePrice({\n * amount: variant.price.amount,\n * baseAmount: variant.compareAtPrice?.amount,\n * currencyCode: variant.price.currencyCode\n * })\n *\n * return (\n * <div>\n * {free ? (\n * <span>Free</span>\n * ) : (\n * <>\n * <span className=\"price\">{price}</span>\n * {basePrice && <span className=\"original\">{basePrice}</span>}\n * </>\n * )}\n * </div>\n * )\n * }\n * ```\n */\nexport function usePrice({\n amount,\n baseAmount,\n currencyCode,\n soldOutDescription = '',\n maximumFractionDigits,\n minimumFractionDigits,\n removeTrailingZeros,\n}: UsePriceOptions): UsePriceResult {\n const { locale } = useShopify()\n\n const value = useMemo(() => {\n if (typeof amount !== 'number' || !currencyCode) {\n return ''\n }\n\n // Handle sold out with fake price\n if (soldOutDescription && amount >= FAKE_PRICE) {\n return soldOutDescription\n }\n\n return baseAmount\n ? formatVariantPrice({\n amount,\n baseAmount,\n currencyCode,\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n removeTrailingZeros,\n })\n : formatPrice({\n amount,\n currencyCode,\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n removeTrailingZeros,\n })\n }, [\n amount,\n baseAmount,\n currencyCode,\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n soldOutDescription,\n removeTrailingZeros,\n ])\n\n const result = useMemo<UsePriceResult>(() => {\n const free = Boolean(amount && amount <= 0)\n return typeof value === 'string' ? { price: value, basePrice: value, free } : { ...value, free }\n }, [value, amount])\n\n return result\n}\n","/**\n * useSelectedOptions Hook\n *\n * Client-side hook to manage selected product options\n */\n\nimport { useEffect, useState, type Dispatch, type SetStateAction } from 'react'\nimport type { NormalizedProduct, NormalizedProductVariant } from '@anker-in/shopify-sdk'\nimport type { Options } from './use-variant'\n\nexport type SelectedOptionsResult = [Options, Dispatch<SetStateAction<Options>>]\n\n/**\n * Construct options object from variant's selectedOptions array\n */\nfunction optionsConstructor(selectedOptions: Array<{ name: string; value: string }>): Options {\n return selectedOptions.reduce((acc, option) => {\n acc[option.name] = option.value\n return acc\n }, {} as Options)\n}\n\n/**\n * Decode base64 ID to get the numeric ID\n */\nfunction decodeShopifyId(gid: string): string {\n try {\n const base64 = gid.split('/').pop() || ''\n return atob(base64)\n } catch {\n return gid\n }\n}\n\n/**\n * Hook to manage selected product options based on URL query or SKU\n *\n * @param product - The product object\n * @param sku - Optional SKU to match variant\n * @returns Tuple of [options, setOptions]\n *\n * @example\n * ```typescript\n * function ProductDetail() {\n * const { data: product } = useProduct({ handle: 'my-product' })\n * const [selectedOptions, setSelectedOptions] = useSelectedOptions(product)\n * const variant = useVariant({ product, selectedOptions })\n *\n * const handleOptionChange = (name: string, value: string) => {\n * setSelectedOptions(prev => ({ ...prev, [name]: value }))\n * }\n *\n * return (\n * <div>\n * {product?.options.map(option => (\n * <select\n * key={option.id}\n * value={selectedOptions[option.name] || ''}\n * onChange={(e) => handleOptionChange(option.name, e.target.value)}\n * >\n * {option.values.map(value => (\n * <option key={value.label} value={value.label}>\n * {value.label}\n * </option>\n * ))}\n * </select>\n * ))}\n * <p>Selected: {variant?.title}</p>\n * </div>\n * )\n * }\n * ```\n */\nexport function useSelectedOptions(\n product?: NormalizedProduct,\n sku?: string\n): SelectedOptionsResult {\n const [options, setOptions] = useState<Options>({})\n\n useEffect(() => {\n if (!product || !product.variants.length) {\n setOptions({})\n return\n }\n\n // Try to get variant from URL query string\n let variant: NormalizedProductVariant | undefined = product.variants[0]\n\n if (typeof window !== 'undefined') {\n const searchParams = new URLSearchParams(window.location.search)\n const variantIdParam = searchParams.get('variant')\n\n if (variantIdParam) {\n // Try to find variant by ID (supports both numeric and GID formats)\n const foundVariant = product.variants.find((v) => {\n if (sku) return v.sku === sku\n // Support both formats: \"123456\" and \"gid://shopify/ProductVariant/123456\"\n return (\n v.id === variantIdParam ||\n v.id.includes(variantIdParam) ||\n decodeShopifyId(v.id) === variantIdParam\n )\n })\n\n if (foundVariant) {\n variant = foundVariant\n }\n }\n }\n\n // Update selected options based on the variant\n if (variant) {\n const newOptions = optionsConstructor(variant.selectedOptions)\n setOptions(newOptions)\n }\n }, [product, sku])\n\n return [options, setOptions]\n}\n","/**\n * useProductUrl Hook\n *\n * Hook to generate product URLs with variant query params\n * Requires routerAdapter to be configured in ShopifyProvider\n */\n\nimport { useCallback } from 'react'\nimport type { NormalizedProduct, NormalizedProductVariant } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\n/**\n * Decode Shopify GID to get numeric ID\n */\nfunction decodeShopifyId(gid: string): string | undefined {\n try {\n // GID format: gid://shopify/ProductVariant/123456\n const parts = gid.split('/')\n return parts[parts.length - 1] || gid\n } catch {\n return gid\n }\n}\n\n/**\n * Hook to generate product URLs\n *\n * @param otherQuery - Additional query parameters to include\n * @returns Function to generate product URL\n *\n * @example\n * ```typescript\n * function ProductCard({ product, variant }) {\n * const getProductUrl = useProductUrl()\n *\n * const url = getProductUrl({ product, variant })\n *\n * return (\n * <a href={url}>\n * <h2>{product.title}</h2>\n * <p>{variant.title}</p>\n * </a>\n * )\n * }\n * ```\n *\n * @example With additional query params\n * ```typescript\n * function ProductCard({ product, variant }) {\n * const getProductUrl = useProductUrl({ utm_source: 'email' })\n *\n * const url = getProductUrl({ product, variant })\n * // URL will include: ?variant=123&utm_source=email\n *\n * return <a href={url}>{product.title}</a>\n * }\n * ```\n */\nexport function useProductUrl(otherQuery?: Record<string, string>) {\n const { routerAdapter } = useShopify()\n\n return useCallback(\n ({ product, variant }: { product?: NormalizedProduct; variant?: NormalizedProductVariant }): string => {\n if (!product) return ''\n\n const queryParams = new URLSearchParams()\n\n // Add variant ID if provided\n if (variant?.id) {\n const variantId = decodeShopifyId(variant.id)\n if (variantId) {\n queryParams.set('variant', variantId)\n }\n }\n\n // Add other query params\n if (otherQuery) {\n Object.entries(otherQuery).forEach(([key, value]) => {\n queryParams.set(key, value)\n })\n }\n\n const queryString = queryParams.toString()\n const path = `/products/${product.handle}${queryString ? `?${queryString}` : ''}`\n\n // Use routerAdapter if available, otherwise return plain path\n if (routerAdapter?.getLocalizedPath) {\n return routerAdapter.getLocalizedPath(path)\n }\n\n return path\n },\n [routerAdapter, otherQuery]\n )\n}\n","/**\n * useUpdateVariantQuery Hook\n *\n * Hook to automatically update URL query string when variant changes\n */\n\nimport { useEffect } from 'react'\nimport type { NormalizedProductVariant } from '@anker-in/shopify-sdk'\n\n/**\n * Decode Shopify GID to get numeric ID\n */\nfunction decodeShopifyId(gid: string): string | undefined {\n try {\n // GID format: gid://shopify/ProductVariant/123456\n const parts = gid.split('/')\n return parts[parts.length - 1] || gid\n } catch {\n return gid\n }\n}\n\n/**\n * Hook to update URL query string when variant changes\n *\n * This hook automatically updates the browser URL with the selected variant ID\n * without causing a page reload. Useful for shareable URLs and browser history.\n *\n * @param variant - The selected variant\n *\n * @example\n * ```typescript\n * function ProductDetail() {\n * const { data: product } = useProduct({ handle: 'my-product' })\n * const [selectedOptions, setSelectedOptions] = useSelectedOptions(product)\n * const variant = useVariant({ product, selectedOptions })\n *\n * // Automatically updates URL when variant changes\n * useUpdateVariantQuery(variant)\n *\n * return (\n * <div>\n * <h1>{product?.title}</h1>\n * <p>Current variant: {variant?.title}</p>\n * {/* URL will be: /products/my-product?variant=123456 *\\/}\n * </div>\n * )\n * }\n * ```\n */\nexport function useUpdateVariantQuery(variant?: NormalizedProductVariant): void {\n useEffect(() => {\n if (!variant || typeof window === 'undefined') {\n return\n }\n\n const searchParams = new URLSearchParams(window.location.search)\n const currentVariantId = searchParams.get('variant')\n const newVariantId = decodeShopifyId(variant.id)\n\n // Only update if variant ID has changed\n if (newVariantId && currentVariantId !== newVariantId) {\n searchParams.set('variant', newVariantId)\n\n const newUrl = `${window.location.pathname}?${searchParams.toString()}${window.location.hash}`\n\n // Update URL without reload\n window.history.replaceState({}, '', newUrl)\n }\n }, [variant])\n}\n","/**\n * useVariantMedia Hook\n *\n * Hook to get media (images and videos) for the selected variant\n */\n\nimport { useEffect, useState } from 'react'\nimport type { NormalizedProduct, NormalizedProductVariant, Media } from '@anker-in/shopify-sdk'\n\nexport type ImageMedia = Media & { mediaContentType: 'IMAGE' }\nexport type VideoMedia = Media & { mediaContentType: 'VIDEO' | 'EXTERNAL_VIDEO' }\n\nexport interface VariantMedia {\n productList: ImageMedia[]\n sceneList: ImageMedia[]\n videoList: VideoMedia[]\n}\n\n/**\n * Get media list for a specific variant\n * Returns variant-specific media if available, otherwise returns product media\n */\nfunction getVariantMediaList({\n product,\n variant,\n}: {\n product: NormalizedProduct\n variant: NormalizedProductVariant\n}): Media[] {\n // If variant has an image, try to find matching media in product\n if (variant.image?.url) {\n const variantMediaId = variant.image.url\n\n // Find all media that matches the variant's image\n const variantMedia = product.media.filter((media) => {\n if (media.mediaContentType === 'IMAGE' && media.previewImage) {\n return media.previewImage?.url === variantMediaId\n }\n return false\n })\n\n // If we found variant-specific media, return it along with other media\n if (variantMedia.length > 0) {\n // Get remaining media that's not variant-specific\n const otherMedia = product.media.filter((media) => {\n if (media.mediaContentType === 'IMAGE' && media.previewImage) {\n return media.previewImage.url !== variantMediaId\n }\n return true\n })\n\n return [...variantMedia, ...otherMedia]\n }\n }\n\n // Default to all product media\n return product.media\n}\n\n/**\n * Hook to get media for the selected variant\n *\n * @param product - The product object\n * @param variant - The selected variant\n * @returns Object with productList (first image), sceneList (other images), videoList\n *\n * @example\n * ```typescript\n * function ProductGallery() {\n * const { data: product } = useProduct({ handle: 'my-product' })\n * const [selectedOptions, setSelectedOptions] = useSelectedOptions(product)\n * const variant = useVariant({ product, selectedOptions })\n * const { productList, sceneList, videoList } = useVariantMedia({ product, variant })\n *\n * return (\n * <div>\n * {/* Main product image *\\/}\n * {productList.map(media => (\n * <img key={media.id} src={media.image?.url} alt={media.alt} />\n * ))}\n *\n * {/* Scene/detail images *\\/}\n * {sceneList.map(media => (\n * <img key={media.id} src={media.image?.url} alt={media.alt} />\n * ))}\n *\n * {/* Videos *\\/}\n * {videoList.map(media => (\n * <video key={media.id} src={media.sources?.[0]?.url} controls />\n * ))}\n * </div>\n * )\n * }\n * ```\n */\nexport function useVariantMedia({\n product,\n variant,\n}: {\n product?: NormalizedProduct\n variant?: NormalizedProductVariant\n}): VariantMedia {\n const [imageList, setImageList] = useState<ImageMedia[]>([])\n const [sceneList, setSceneList] = useState<ImageMedia[]>([])\n const [videoList, setVideoList] = useState<VideoMedia[]>([])\n\n useEffect(() => {\n if (!product || !variant) {\n setImageList([])\n setSceneList([])\n setVideoList([])\n return\n }\n\n const mediaList = getVariantMediaList({ product, variant })\n\n // Separate images and videos\n const images = mediaList.filter((media) => media.mediaContentType === 'IMAGE') as ImageMedia[]\n const videos = mediaList.filter(\n (media) => media.mediaContentType === 'VIDEO' || media.mediaContentType === 'EXTERNAL_VIDEO'\n ) as VideoMedia[]\n\n // First image is the product image, rest are scene images\n setImageList(images.length > 0 && images[0] ? [images[0]] : [])\n setSceneList(images.length > 1 ? images.slice(1) : [])\n setVideoList(videos)\n }, [product, variant])\n\n return {\n productList: imageList,\n sceneList,\n videoList,\n }\n}\n","/**\n * useCollection Hook\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getCollection, type NormalizedCollection } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseCollectionOptions extends SWRConfiguration<NormalizedCollection | undefined> {\n handle?: string\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\nexport function useCollection(options: UseCollectionOptions = {}) {\n const { client, locale } = useShopify()\n const { handle, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<NormalizedCollection | undefined>(\n handle ? ['collection', locale, handle, metafieldIdentifiers] : null,\n () =>\n getCollection(client, {\n handle: handle!,\n locale,\n metafieldIdentifiers,\n }),\n swrOptions\n )\n}\n","/**\n * useAllCollections Hook\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getAllCollections, type NormalizedCollection } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseAllCollectionsOptions extends SWRConfiguration<NormalizedCollection[]> {\n first?: number\n query?: string\n sortKey?: 'TITLE' | 'UPDATED_AT' | 'ID' | 'RELEVANCE'\n reverse?: boolean\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\nexport function useAllCollections(options: UseAllCollectionsOptions = {}) {\n const { client, locale } = useShopify()\n const { first, query, sortKey, reverse, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<NormalizedCollection[]>(\n ['all-collections', locale, first, query, sortKey, reverse, metafieldIdentifiers],\n () =>\n getAllCollections(client, {\n locale,\n first,\n query,\n sortKey,\n reverse,\n metafieldIdentifiers,\n }),\n swrOptions\n )\n}\n","/**\n * useCollections Hook (with pagination info)\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getCollections, type CollectionsConnection } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseCollectionsOptions extends SWRConfiguration<CollectionsConnection> {\n first?: number\n after?: string\n query?: string\n sortKey?: 'TITLE' | 'UPDATED_AT' | 'ID' | 'RELEVANCE'\n reverse?: boolean\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\nexport function useCollections(options: UseCollectionsOptions = {}) {\n const { client, locale } = useShopify()\n const { first, after, query, sortKey, reverse, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<CollectionsConnection>(\n ['collections', locale, first, after, query, sortKey, reverse, metafieldIdentifiers],\n () =>\n getCollections(client, {\n locale,\n first,\n after,\n query,\n sortKey,\n reverse,\n metafieldIdentifiers,\n }),\n swrOptions\n )\n}\n","/**\n * useBlog Hook\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getBlog, type NormalizedBlog } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseBlogOptions extends SWRConfiguration<NormalizedBlog | undefined> {\n handle?: string\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\nexport function useBlog(options: UseBlogOptions = {}) {\n const { client, locale } = useShopify()\n const { handle, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<NormalizedBlog | undefined>(\n handle ? ['blog', locale, handle, metafieldIdentifiers] : null,\n () => getBlog(client, { handle: handle!, locale, metafieldIdentifiers }),\n swrOptions\n )\n}\n","/**\n * useAllBlogs Hook\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getAllBlogs, type NormalizedBlog } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseAllBlogsOptions extends SWRConfiguration<NormalizedBlog[]> {\n first?: number\n query?: string\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\nexport function useAllBlogs(options: UseAllBlogsOptions = {}) {\n const { client, locale } = useShopify()\n const { first, query, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<NormalizedBlog[]>(\n ['all-blogs', locale, first, query, metafieldIdentifiers],\n () =>\n getAllBlogs(client, {\n locale,\n first,\n query,\n metafieldIdentifiers,\n }),\n swrOptions\n )\n}\n","/**\n * useArticle Hook\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getArticle, type NormalizedArticle } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseArticleOptions extends SWRConfiguration<NormalizedArticle | undefined> {\n blogHandle?: string\n articleHandle?: string\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\nexport function useArticle(options: UseArticleOptions = {}) {\n const { client, locale } = useShopify()\n const { blogHandle, articleHandle, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<NormalizedArticle | undefined>(\n blogHandle && articleHandle\n ? ['article', locale, blogHandle, articleHandle, metafieldIdentifiers]\n : null,\n () =>\n getArticle(client, {\n blogHandle: blogHandle!,\n articleHandle: articleHandle!,\n locale,\n metafieldIdentifiers,\n }),\n swrOptions\n )\n}\n","/**\n * useArticles Hook (all articles across all blogs)\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getArticles, type NormalizedArticle } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseArticlesOptions extends SWRConfiguration<NormalizedArticle[]> {\n first?: number\n query?: string\n sortKey?: 'PUBLISHED_AT' | 'UPDATED_AT' | 'TITLE' | 'ID' | 'RELEVANCE'\n reverse?: boolean\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\nexport function useArticles(options: UseArticlesOptions = {}) {\n const { client, locale } = useShopify()\n const { first, query, sortKey, reverse, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<NormalizedArticle[]>(\n ['articles', locale, first, query, sortKey, reverse, metafieldIdentifiers],\n () =>\n getArticles(client, {\n locale,\n first,\n query,\n sortKey,\n reverse,\n metafieldIdentifiers,\n }),\n swrOptions\n )\n}\n","/**\n * useArticlesInBlog Hook (articles from a specific blog)\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getArticlesInBlog, type NormalizedArticle } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseArticlesInBlogOptions extends SWRConfiguration<NormalizedArticle[]> {\n blogHandle?: string\n first?: number\n sortKey?: 'PUBLISHED_AT' | 'UPDATED_AT' | 'TITLE' | 'ID' | 'RELEVANCE'\n reverse?: boolean\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\nexport function useArticlesInBlog(options: UseArticlesInBlogOptions = {}) {\n const { client, locale } = useShopify()\n const { blogHandle, first, sortKey, reverse, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<NormalizedArticle[]>(\n blogHandle\n ? ['articles-in-blog', locale, blogHandle, first, sortKey, reverse, metafieldIdentifiers]\n : null,\n () =>\n getArticlesInBlog(client, {\n blogHandle: blogHandle!,\n locale,\n first,\n sortKey,\n reverse,\n metafieldIdentifiers,\n }),\n swrOptions\n )\n}\n","/**\n * useSearch Hook\n *\n * Simple hook to search products, articles, pages\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { useShopify } from '../../provider'\nimport type { ShopifyClient } from '@anker-in/shopify-sdk'\n\nexport type SearchResultType = 'ARTICLE' | 'PAGE' | 'PRODUCT'\n\nexport interface SearchResultItem {\n type: SearchResultType\n id?: string\n handle?: string\n title?: string\n description?: string\n url?: string\n image?: {\n url: string\n altText?: string\n }\n}\n\nexport interface SearchResult {\n items: SearchResultItem[]\n totalCount: number\n pageInfo?: {\n hasNextPage: boolean\n endCursor?: string\n }\n}\n\nexport interface UseSearchOptions extends SWRConfiguration<SearchResult | undefined> {\n query?: string\n first?: number\n types?: SearchResultType[]\n productFilters?: any[]\n}\n\nasync function performSearch(\n client: ShopifyClient,\n locale: string,\n searchQuery?: string,\n first: number = 20,\n types: SearchResultType[] = ['PRODUCT', 'ARTICLE', 'PAGE']\n): Promise<SearchResult | undefined> {\n if (!searchQuery) {\n return undefined\n }\n\n const query = /* GraphQL */ `\n query search($query: String!, $first: Int!, $types: [SearchType!])\n @inContext(language: $language) {\n search(query: $query, first: $first, types: $types, unavailableProducts: HIDE) {\n totalCount\n edges {\n node {\n ... on Article {\n __typename\n id\n handle\n title\n excerpt\n image {\n url\n altText\n }\n }\n ... on Page {\n __typename\n id\n handle\n title\n }\n ... on Product {\n __typename\n id\n handle\n title\n description\n featuredImage {\n url\n altText\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n `\n\n const data = await client.query<{ search: any }>(query, {\n query: searchQuery,\n first,\n types,\n })\n\n if (!data || !data.search) {\n return undefined\n }\n\n const items: SearchResultItem[] =\n data.search.edges?.map((edge: any) => {\n const node = edge.node\n const item: SearchResultItem = {\n type: node.__typename.toUpperCase() as SearchResultType,\n id: node.id,\n handle: node.handle,\n title: node.title,\n }\n\n if (node.__typename === 'Product') {\n item.description = node.description\n item.image = node.featuredImage\n ? {\n url: node.featuredImage.url,\n altText: node.featuredImage.altText,\n }\n : undefined\n } else if (node.__typename === 'Article') {\n item.description = node.excerpt\n item.image = node.image\n ? {\n url: node.image.url,\n altText: node.image.altText,\n }\n : undefined\n }\n\n return item\n }) || []\n\n return {\n items,\n totalCount: data.search.totalCount || 0,\n pageInfo: data.search.pageInfo,\n }\n}\n\nexport function useSearch(options: UseSearchOptions = {}) {\n const { client, locale } = useShopify()\n const { query, first = 20, types = ['PRODUCT', 'ARTICLE', 'PAGE'], ...swrOptions } = options\n\n return useSWR<SearchResult | undefined>(\n query ? ['search', locale, query, first, types] : null,\n () => performSearch(client, locale, query, first, types),\n swrOptions\n )\n}\n","/**\n * useSite Hook\n *\n * Simple hook to fetch basic shop/site information\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { useShopify } from '../../provider'\nimport type { ShopifyClient } from '@anker-in/shopify-sdk'\n\nexport interface SiteInfo {\n name: string\n description?: string\n primaryDomain: {\n url: string\n host: string\n }\n brand?: {\n logo?: {\n image?: {\n url: string\n }\n }\n colors?: {\n primary?: string\n secondary?: string\n }\n }\n metafields?: Record<string, any>\n}\n\nexport interface UseSiteOptions extends SWRConfiguration<SiteInfo | undefined> {\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\nasync function getSiteInfo(\n client: ShopifyClient,\n locale: string,\n metafieldIdentifiers?: any[]\n): Promise<SiteInfo | undefined> {\n const hasMetafields = metafieldIdentifiers && metafieldIdentifiers.length > 0\n\n const query = /* GraphQL */ `\n query getSiteInfo(\n ${hasMetafields ? '$shopMetafieldIdentifiers: [HasMetafieldsIdentifier!]!' : ''}\n ) @inContext(language: $language) {\n shop {\n name\n description\n primaryDomain {\n url\n host\n }\n brand {\n logo {\n image {\n url\n }\n }\n colors {\n primary {\n background\n }\n secondary {\n background\n }\n }\n }\n ${hasMetafields ? 'metafields(identifiers: $shopMetafieldIdentifiers) { key value }' : ''}\n }\n }\n `\n\n const variables: any = {}\n if (hasMetafields) {\n variables.shopMetafieldIdentifiers = metafieldIdentifiers\n }\n\n const data = await client.query<{ shop: any }>(query, variables)\n\n if (!data || !data.shop) {\n return undefined\n }\n\n const shop = data.shop\n const metafields = shop.metafields?.reduce((acc: Record<string, any>, mf: any) => {\n if (mf && mf.key) {\n acc[mf.key] = mf.value\n }\n return acc\n }, {})\n\n return {\n name: shop.name,\n description: shop.description,\n primaryDomain: shop.primaryDomain,\n brand: shop.brand\n ? {\n logo: shop.brand.logo,\n colors: shop.brand.colors\n ? {\n primary: shop.brand.colors.primary?.background,\n secondary: shop.brand.colors.secondary?.background,\n }\n : undefined,\n }\n : undefined,\n metafields,\n }\n}\n\nexport function useSite(options: UseSiteOptions = {}) {\n const { client, locale } = useShopify()\n const { metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<SiteInfo | undefined>(\n ['site', locale, metafieldIdentifiers],\n () => getSiteInfo(client, locale, metafieldIdentifiers),\n swrOptions\n )\n}\n","/**\n * Plus Member Types\n * Type definitions for Plus Member functionality\n */\n\nimport { NormalizedProduct, NormalizedProductVariant } from '@anker-in/shopify-sdk'\n\nexport enum PLUS_MEMBER_TYPE {\n FREE = 0, // 免费会员\n MONTHLY = 1, // 月费会员\n ANNUAL = 2, // 年费会员\n}\n\nexport enum PlusMemberMode {\n MONTHLY = 'monthly',\n ANNUAL = 'annual',\n}\n\nexport enum DeliveryPlusType {\n FREE = 'free',\n MONTHLY = 'monthly',\n ANNUAL = 'annual',\n}\n\nexport enum ShippingMethodMode {\n FREE = 'free',\n TDD = 'tdd',\n NDD = 'ndd',\n}\n\nexport type PlusMemberShippingMethodMetafields = {\n __mode: ShippingMethodMode\n __code: string\n title: string\n subtitle: string\n price: number\n weight_low?: number | null\n weight_high?: number | null\n __plus?: boolean\n}\n\nexport type PlusMemberShippingMethodConfig = PlusMemberShippingMethodMetafields & {\n id: string\n disabled?: boolean\n useCoupon?: boolean\n coupon?: string\n}\n\nexport type PlusMemberSettingsMetafields = {\n join_member: string\n join_plus_member: string\n member_extra: string\n member_price: string\n plus_member_price: string\n will_save: string\n total_save: string\n with_member: string\n with_plus_member: string\n save_with_plus: string\n discount_box: {\n plus_member: string\n money: string\n month: string\n saving: string\n worth: string\n other: string\n }\n plus_monthly_product: {\n handle: string\n sku: string\n }\n plus_annual_product: {\n handle: string\n sku: string\n }\n thank: {\n success: {\n title: string\n line1: string\n line2: string\n button: string\n link_text: string\n link: string\n }\n warn: {\n title: string\n }\n error: {\n title: string\n button: string\n }\n }\n agreeBox: {\n text: string\n error_text: string\n }\n shippingMethod: {\n cancelCodeTip: string\n addCodeTip: string\n overWeight_ndd: number\n overWeight_tdd: number\n overWeight_ndd_tip: string\n specialTip: string\n learnMore: string\n specialModal: Array<{\n title_del: string\n content: string\n }>\n }\n cart: {\n tip: string\n credits_times: number\n title: string\n subtitle: string\n }\n plus_member: {\n title: string\n box: {\n title: string\n description: string\n learn_more: string\n trade_desc?: string\n }\n type: Array<{\n title: string\n subtitle: string\n __mode: DeliveryPlusType\n save?: string\n price?: string\n compare_price?: string\n tagImg?: string\n }>\n }\n member_benefits: {\n title: string\n subtitle: string\n list: Array<{\n icon: string\n title: string\n subtitle: string\n }>\n annually: {\n title: string\n list: Array<{\n icon: string\n title: string\n subtitle: string\n }>\n }\n ankerCredits: {\n text: string\n url: string\n }\n }\n shipping_policy: {\n title: string\n shipping_coupon: {\n title: string\n list: string[]\n }\n shipping_service: {\n title: string\n list: Array<{\n title: string\n list: string[]\n }>\n }\n terms: {\n text: string\n url: string\n }\n }\n shipping_check: {\n title: string\n label: string\n placeholder: string\n cancel: string\n available: string\n here: {\n text: string\n url: string\n }\n save: string\n apply: string\n }\n plus_shipping: {\n title: string\n policy: string\n more_option: string\n view_less: string\n buy_directly: string\n used_up_all: string\n used_up_ndd: string\n delivers_to: string\n edit: string\n out_ndd_shipping: string\n out_tdd_shipping: string\n plus: string\n directly: string\n shipping_methods: PlusMemberShippingMethodMetafields[]\n }\n shipping: {\n shipping_benefits: string\n shipping_address: string\n seeAvailableShippingAreas: string\n modify: string\n enter: string\n click: string\n fill: string\n plus: string\n use_coupon: string\n no_coupon: string\n get_address: string\n confirm: string\n shipping_not_support: string\n faq_link: string\n fields: Array<{\n __key: string\n required: boolean\n title: string\n placeholder: string\n }>\n shipping_methods: Array<{\n __mode: string\n __code: string\n title: string\n subtitle: string\n tip?: string\n outRange?: string\n rule?: {\n '<22': number\n '>=22': number\n }\n __weight?: string\n }>\n join_member: {\n join: string\n text: string\n tip: string\n }\n discount_not_support_address: string\n }\n listingEntryCard: {\n showEntry: boolean\n EntryCardBgi: string\n EntryCardMobBgi: string\n EntryCardPadBgi: string\n EntryCardSmBgi: string\n EntryCardicon: string\n EntryCardtitle: string\n EntryCardcontent: string\n EntryCardbuttonText: string\n }\n noLogin: {\n recommend: string\n content: Array<{\n title: string\n list: Array<{\n icon: string\n recommend: boolean\n title: string\n description: string\n subTitle?: string\n }>\n note?: string\n }>\n head: {\n img: string\n padImg: string\n mobImg: string\n title: string\n mobTitle: string\n pay: string\n subTitle: string\n icon: string\n }\n headAnnual: {\n img: string\n padImg: string\n mobImg: string\n title: string\n pay: string\n subTitle: string\n icon: string\n }\n main: {\n title: string\n }\n }\n loginedExpiredMember: {\n content: Array<{\n img: string\n mobImg: string\n text: string\n }>\n head: {\n img: string\n mobImg: string\n title: string\n subTitle: string\n }\n main: {\n text: string\n title: string\n }\n }\n loginedFreeMember: {\n table: Array<{\n plus: string\n normal: string\n plusColor: string\n normalColor: string\n }>\n tableTab: {\n tab1: string\n tab2: string\n tab3: string\n }\n head: {\n img: string\n mobImg: string\n padImg: string\n icon: string\n title: string\n mobTitle: string\n pay: string\n subTitle: string\n }\n headAnnual: {\n img: string\n mobImg: string\n padImg: string\n icon: string\n title: string\n pay: string\n subTitle: string\n }\n midTitle: string\n }\n memberCard: {\n header: {\n text: string\n }\n footer: {\n buttonText: string[]\n moreInformation: string\n moreInformationUrl: string\n }\n }\n memberRegisterCard: {\n title: string\n bannerBgPc: string\n bannerBgMob: string\n backgroundColor: string\n }\n memberSuperposed: {\n title: string\n content: string\n cancelBtn: string\n confirmBtn: string\n monthly: string\n annual: string\n }\n memberCannotSuperposed: {\n title: string\n content: string\n confirmBtn: string\n }\n}\n\nexport type SelectedPlusMemberProduct = {\n product: NormalizedProduct\n variant: NormalizedProductVariant\n} | null\n\nexport type DeliveryOption = string\n\nexport type DeliveryCustomData = {\n discount_code?: string[]\n allow_nextday_delivery?: boolean\n allow_thirdday_delivery?: boolean\n selected_delivery_option?: DeliveryOption\n is_presale?: boolean\n plus_type?: DeliveryPlusType\n}\n\nexport type MailingAddress = {\n address1?: string | null\n address2?: string | null\n city?: string | null\n company?: string | null\n country?: string | null\n countryCode?: string | null\n firstName?: string | null\n lastName?: string | null\n phone?: string | null\n province?: string | null\n provinceCode?: string | null\n zip?: string | null\n}\n\nexport type DeliveryData = {\n deliveryAddress: MailingAddress\n deliveryCustomData: DeliveryCustomData\n}\n","/**\n * Plus Member Context\n * Provides Plus Member state management\n */\n\nimport { createContext } from 'react'\nimport type {\n PlusMemberSettingsMetafields,\n PlusMemberShippingMethodConfig,\n SelectedPlusMemberProduct,\n DeliveryPlusType,\n} from './types'\nimport { NormalizedProduct } from '@anker-in/shopify-sdk'\n\nexport interface ShippingMethodsContext {\n freeShippingMethods: PlusMemberShippingMethodConfig[]\n paymentShippingMethods: PlusMemberShippingMethodConfig[]\n nddOverweight: boolean\n tddOverweight: boolean\n}\n\nexport interface PlusMemberContextValue<TProduct = any, TVariant = any, TProfile = any> {\n // Metafields configuration\n plusMemberMetafields: PlusMemberSettingsMetafields\n shopCommon?: Record<string, any>\n\n // Zip code state\n zipCode: string\n setZipCode: (value: string) => void\n\n // Delivery availability\n allowNextDayDelivery: boolean\n setAllowNextDayDelivery: (value: boolean) => void\n allowThirdDayDelivery: boolean\n setAllowThirdDayDelivery: (value: boolean) => void\n\n // Plus member mode selection\n selectedPlusMemberMode: DeliveryPlusType\n setSelectedPlusMemberMode: (value: DeliveryPlusType) => void\n\n // Area check modal\n showAreaCheckModal: boolean\n setShowAreaCheckModal: (value: boolean) => void\n\n // Shipping method selection\n selectedShippingMethod?: PlusMemberShippingMethodConfig\n setSelectedShippingMethod: (value: PlusMemberShippingMethodConfig) => void\n\n // Tip display\n showTip: boolean\n setShowTip: (value: boolean) => void\n\n // More shipping methods display\n showMoreShippingMethod: boolean\n setShowMoreShippingMethod: (value: boolean) => void\n\n // Product and variant (generic types)\n variant: TVariant\n product: TProduct\n\n // Shipping methods context\n shippingMethodsContext: ShippingMethodsContext\n\n // Selected plus member product\n selectedPlusMemberProduct: SelectedPlusMemberProduct\n\n // Plus member products list\n plusMemberProducts: NormalizedProduct[]\n\n // Plus member benefit modal\n showPlusMemberBenefit: boolean\n setShowPlusMemberBenefit: (value: boolean) => void\n\n // Margin bottom control\n deleteMarginBottom: boolean\n setDeleteMarginBottom: (value: boolean) => void\n\n // Profile (user profile information)\n profile?: TProfile\n\n // Locale (language/region code)\n locale?: string\n}\n\nconst createInitialValue = <\n TProduct = any,\n TVariant = any,\n TProfile = any,\n>(): PlusMemberContextValue<TProduct, TVariant, TProfile> => ({\n zipCode: '',\n plusMemberMetafields: {} as PlusMemberSettingsMetafields,\n setZipCode: () => {},\n allowNextDayDelivery: false,\n setAllowNextDayDelivery: () => {},\n allowThirdDayDelivery: false,\n setAllowThirdDayDelivery: () => {},\n selectedPlusMemberMode: 'free' as DeliveryPlusType,\n setSelectedPlusMemberMode: () => {},\n showAreaCheckModal: false,\n setShowAreaCheckModal: () => {},\n selectedShippingMethod: undefined,\n setSelectedShippingMethod: () => {},\n showTip: false,\n setShowTip: () => {},\n showMoreShippingMethod: false,\n setShowMoreShippingMethod: () => {},\n variant: {} as TVariant,\n product: {} as TProduct,\n shippingMethodsContext: {\n freeShippingMethods: [],\n paymentShippingMethods: [],\n nddOverweight: false,\n tddOverweight: false,\n },\n selectedPlusMemberProduct: null,\n plusMemberProducts: [],\n showPlusMemberBenefit: false,\n setShowPlusMemberBenefit: () => {},\n deleteMarginBottom: false,\n setDeleteMarginBottom: () => {},\n profile: undefined,\n locale: undefined,\n})\n\nexport const PlusMemberContext = createContext<PlusMemberContextValue>(createInitialValue())\n","/**\n * Hook to access Plus Member Context\n */\n\nimport { useContext } from 'react'\nimport { PlusMemberContext } from './context'\n\nexport function usePlusMemberContext<TProduct = any, TVariant = any>() {\n return useContext(PlusMemberContext)\n}\n","/**\n * Hook to get Plus Monthly Product Variant\n */\n\nimport { useMemo } from 'react'\nimport { usePlusMemberContext } from './use-plus-member-context'\n\nexport function usePlusMonthlyProductVariant<TVariant = any>(): TVariant | undefined {\n const { plusMemberProducts, plusMemberMetafields } = usePlusMemberContext()\n const plusMonthly = plusMemberMetafields?.plus_monthly_product\n\n const plusMonthlyProductVariant = useMemo(() => {\n const product = plusMemberProducts?.find(\n (item: any) => item?.handle === plusMonthly?.handle\n )\n const productVariant = product?.variants?.find(\n (item: any) => item.sku === plusMonthly?.sku\n )\n\n return productVariant\n }, [plusMemberProducts, plusMonthly])\n\n return plusMonthlyProductVariant as TVariant | undefined\n}\n","/**\n * Hook to get Plus Annual Product Variant\n */\n\nimport { useMemo } from 'react'\nimport { usePlusMemberContext } from './use-plus-member-context'\n\nexport function usePlusAnnualProductVariant<TVariant = any>(): TVariant | undefined {\n const { plusMemberProducts, plusMemberMetafields } = usePlusMemberContext()\n const plusAnnual = plusMemberMetafields?.plus_annual_product\n\n const plusAnnualProductVariant = useMemo(() => {\n const product = plusMemberProducts?.find(\n (item: any) => item?.handle === plusAnnual?.handle\n )\n const productVariant = product?.variants?.find(\n (item: any) => item.sku === plusAnnual?.sku\n )\n return productVariant\n }, [plusMemberProducts, plusAnnual])\n\n return plusAnnualProductVariant as TVariant | undefined\n}\n","/**\n * Hook to calculate available shipping methods based on product weight and member status\n */\n\nimport { useMemo } from 'react'\nimport type {\n PlusMemberSettingsMetafields,\n PlusMemberShippingMethodConfig,\n DeliveryPlusType,\n} from './types'\nimport { ShippingMethodMode } from './types'\n\nexport interface UseShippingMethodsOptions<TVariant = any> {\n /** Product variant with weight information */\n variant: TVariant\n /** Zip code for delivery */\n zipCode: string\n /** Whether next day delivery is allowed */\n allowNextDayDelivery: boolean\n /** Whether third day delivery is allowed */\n allowThirdDayDelivery: boolean\n /** Plus member metafields configuration */\n plusMemberMetafields: PlusMemberSettingsMetafields\n /** Selected plus member mode */\n selectedPlusMemberMode: DeliveryPlusType\n /** Whether user is a plus member */\n isPlus?: boolean\n /** Available NDD coupon code */\n nddCoupon?: string\n /** Available TDD coupon code */\n tddCoupon?: string\n}\n\nexport interface UseShippingMethodsResult {\n freeShippingMethods: PlusMemberShippingMethodConfig[]\n paymentShippingMethods: PlusMemberShippingMethodConfig[]\n nddOverweight: boolean\n tddOverweight: boolean\n}\n\n/**\n * Calculate available shipping methods based on product weight, member status, and available coupons\n *\n * @param options - Configuration options\n * @returns Shipping methods categorized by free/payment and overweight status\n *\n * @example\n * ```tsx\n * const { freeShippingMethods, paymentShippingMethods, nddOverweight, tddOverweight } = useShippingMethods({\n * variant,\n * zipCode,\n * allowNextDayDelivery,\n * allowThirdDayDelivery,\n * plusMemberMetafields,\n * selectedPlusMemberMode,\n * isPlus: profile?.isPlus,\n * nddCoupon,\n * tddCoupon,\n * })\n * ```\n */\nexport function useShippingMethods<TVariant extends { weight?: number } = any>(\n options: UseShippingMethodsOptions<TVariant>\n): UseShippingMethodsResult {\n const {\n variant,\n plusMemberMetafields,\n selectedPlusMemberMode,\n isPlus = false,\n nddCoupon,\n tddCoupon,\n } = options\n\n const { plus_shipping, shippingMethod } = plusMemberMetafields || {}\n\n const nddOverweight = useMemo(() => {\n return (variant?.weight || 0) > (shippingMethod?.overWeight_ndd || Infinity)\n }, [shippingMethod?.overWeight_ndd, variant?.weight])\n\n const tddOverweight = useMemo(() => {\n return (variant?.weight || 0) > (shippingMethod?.overWeight_tdd || Infinity)\n }, [shippingMethod?.overWeight_tdd, variant?.weight])\n\n // 付费会员物流方式\n const paymentShippingMethods: PlusMemberShippingMethodConfig[] = useMemo(() => {\n const weight = variant?.weight || 0\n const methods =\n plus_shipping?.shipping_methods?.filter(\n ({ weight_low, weight_high, __mode, __plus }) => {\n const fitWeight =\n (!weight_low || weight >= weight_low) &&\n (!weight_high || weight <= weight_high)\n return __mode !== ShippingMethodMode.FREE && !__plus && fitWeight\n }\n ) || []\n\n return methods.map((method) => {\n let disabled = false\n const selectedFreeMember = selectedPlusMemberMode === 'free'\n if (method.__mode === ShippingMethodMode.NDD) {\n disabled = selectedFreeMember || nddOverweight\n } else if (method.__mode === ShippingMethodMode.TDD) {\n disabled = selectedFreeMember || tddOverweight\n }\n\n return {\n ...method,\n id: method.__mode + method.__code,\n useCoupon: false,\n subtitle: plus_shipping?.directly || '',\n disabled,\n }\n })\n }, [\n nddOverweight,\n plus_shipping?.directly,\n plus_shipping?.shipping_methods,\n selectedPlusMemberMode,\n tddOverweight,\n variant?.weight,\n ])\n\n const nddPrice = useMemo(() => {\n const weight = variant?.weight || 0\n const nddMethod = paymentShippingMethods.find(\n ({ __mode, weight_high, weight_low }) => {\n const fitWeight =\n (!weight_low || weight >= weight_low) &&\n (!weight_high || weight <= weight_high)\n return __mode === 'ndd' && fitWeight\n }\n )\n return nddMethod?.price || 0\n }, [variant?.weight, paymentShippingMethods])\n\n const tddPrice = useMemo(() => {\n const weight = variant?.weight || 0\n const tddMethod = paymentShippingMethods.find(\n ({ __mode, weight_high, weight_low }) => {\n const fitWeight =\n (!weight_low || weight >= weight_low) &&\n (!weight_high || weight <= weight_high)\n return __mode === 'tdd' && fitWeight\n }\n )\n return tddMethod?.price || 0\n }, [variant?.weight, paymentShippingMethods])\n\n // 免费/使用优惠券的物流方式\n const freeShippingMethods: PlusMemberShippingMethodConfig[] = useMemo(() => {\n const weight = variant?.weight || 0\n let methods =\n plus_shipping?.shipping_methods?.filter(\n ({ __mode, __plus, weight_low, weight_high }) => {\n if (__mode === ShippingMethodMode.FREE) {\n return true\n }\n\n if (isPlus) {\n const hasCoupon =\n (isPlus && __mode === ShippingMethodMode.NDD && nddCoupon) ||\n (isPlus && __mode === ShippingMethodMode.TDD && (tddCoupon || nddCoupon))\n\n const fitWeight =\n (!weight_low || weight >= weight_low) &&\n (!weight_high || weight <= weight_high)\n\n return hasCoupon && fitWeight && !__plus\n } else {\n return __plus\n }\n }\n ) || []\n if (isPlus) {\n methods = methods.sort((a, b) => {\n if (b.__mode === ShippingMethodMode.FREE) return -1\n return 0\n })\n }\n\n return methods.map((method) => {\n let price = 0\n let coupon\n let disabled\n\n if (method.__mode !== ShippingMethodMode.FREE) {\n switch (method.__mode) {\n case 'tdd':\n price = tddPrice\n coupon = tddCoupon || nddCoupon\n break\n case 'ndd':\n price = nddPrice\n coupon = nddCoupon\n break\n }\n\n disabled = selectedPlusMemberMode === 'free'\n\n if (method.__mode === ShippingMethodMode.NDD) {\n disabled = disabled || nddOverweight\n } else if (method.__mode === ShippingMethodMode.TDD) {\n disabled = disabled || tddOverweight\n }\n }\n\n return {\n ...method,\n id: method.__mode + method.__code,\n useCoupon: true,\n disabled,\n coupon,\n price,\n }\n })\n }, [\n variant?.weight,\n plus_shipping?.shipping_methods,\n isPlus,\n nddCoupon,\n tddCoupon,\n selectedPlusMemberMode,\n tddPrice,\n nddPrice,\n nddOverweight,\n tddOverweight,\n ])\n\n return {\n freeShippingMethods,\n paymentShippingMethods,\n nddOverweight,\n tddOverweight,\n }\n}\n","/**\n * Hook to check shipping method availability and automatically adjust selection\n */\n\nimport { useEffect } from 'react'\nimport { ShippingMethodMode } from './types'\nimport { usePlusMemberContext } from './use-plus-member-context'\n\nexport function useShippingMethodAvailableCheck() {\n const {\n zipCode,\n allowNextDayDelivery,\n allowThirdDayDelivery,\n selectedShippingMethod,\n setSelectedShippingMethod,\n setShowTip,\n shippingMethodsContext,\n } = usePlusMemberContext()\n\n useEffect(() => {\n const freeShippingMethod = shippingMethodsContext.freeShippingMethods[0]\n\n const standardShippingMethod =\n shippingMethodsContext.freeShippingMethods?.find(\n (item) => item.__mode === ShippingMethodMode.FREE\n )\n\n const freeTDD = shippingMethodsContext.freeShippingMethods.find(\n (item) => item.__mode === ShippingMethodMode.TDD\n )\n const paymentTDD = shippingMethodsContext.paymentShippingMethods.find(\n (item) => item.__mode === ShippingMethodMode.TDD\n )\n\n if (zipCode) {\n console.log(\n 'allowNextDayDelivery, allowThirdDayDelivery:',\n allowNextDayDelivery,\n allowThirdDayDelivery\n )\n // 两个都不能用\n if (!allowNextDayDelivery && !allowThirdDayDelivery) {\n setShowTip(true)\n setSelectedShippingMethod(standardShippingMethod!)\n } else {\n // NDD 无法使用\n if (\n selectedShippingMethod?.__mode === ShippingMethodMode.NDD &&\n !allowNextDayDelivery\n ) {\n setShowTip(true)\n\n if (allowThirdDayDelivery) {\n if (selectedShippingMethod.useCoupon) {\n const method = freeTDD || freeShippingMethod\n if (method) setSelectedShippingMethod(method)\n } else {\n const method = paymentTDD || freeShippingMethod\n if (method) setSelectedShippingMethod(method)\n }\n } else {\n // 使用免费\n if (freeShippingMethod) setSelectedShippingMethod(freeShippingMethod)\n }\n } else if (\n // TDD 无法使用\n selectedShippingMethod?.__mode === ShippingMethodMode.TDD &&\n !allowThirdDayDelivery\n ) {\n setShowTip(true)\n if (freeShippingMethod) setSelectedShippingMethod(freeShippingMethod)\n }\n }\n }\n }, [\n allowNextDayDelivery,\n allowThirdDayDelivery,\n zipCode,\n shippingMethodsContext,\n selectedShippingMethod,\n setSelectedShippingMethod,\n setShowTip,\n ])\n}\n","import { useCallback } from 'react'\nimport { usePlusMemberContext } from './use-plus-member-context'\nimport { useCartContext } from '../../../provider'\nimport { useRemoveCartLines } from '../../cart'\nimport { DeliveryPlusType } from './types'\n\n/**\n * Hook to replace cart plus member product\n *\n * When adding a monthly membership while an annual membership exists in cart,\n * the annual membership will be replaced and vice versa.\n *\n * @returns Handler function to replace conflicting membership products\n *\n * @example\n * ```tsx\n * const replaceCartPlusMember = useReplaceCartPlusMember()\n *\n * // Call before adding new membership product\n * await replaceCartPlusMember()\n * ```\n */\nexport const useReplaceCartPlusMember = () => {\n const { plusMemberMetafields, selectedPlusMemberMode } = usePlusMemberContext()\n const { trigger: removeCartLines } = useRemoveCartLines()\n const { cart } = useCartContext()\n\n const plusMonthly = plusMemberMetafields?.plus_monthly_product\n const plusAnnual = plusMemberMetafields?.plus_annual_product\n\n const handler = useCallback(async () => {\n const plusMonthlyInCart = cart?.lineItems.find(\n (item) => item.variant?.sku === plusMonthly?.sku\n )\n const plusAnnualInCart = cart?.lineItems.find(\n (item) => item.variant?.sku === plusAnnual?.sku\n )\n\n if (\n selectedPlusMemberMode === DeliveryPlusType.ANNUAL &&\n plusMonthlyInCart\n ) {\n await removeCartLines({\n lineIds: [plusMonthlyInCart.id],\n })\n } else if (\n selectedPlusMemberMode === DeliveryPlusType.MONTHLY &&\n plusAnnualInCart\n ) {\n await removeCartLines({\n lineIds: [plusAnnualInCart.id],\n })\n }\n }, [\n cart?.lineItems,\n selectedPlusMemberMode,\n plusMonthly?.sku,\n plusAnnual?.sku,\n removeCartLines,\n ])\n\n return handler\n}\n","import { useMemo } from 'react'\nimport type { DeliveryData } from './types'\n\n/**\n * Hook to get delivery discount codes from delivery data\n *\n * Extracts and returns the discount codes from the delivery custom data.\n *\n * @param deliveryData - Delivery data containing custom attributes\n * @returns Array of discount codes or undefined\n *\n * @example\n * ```tsx\n * const deliveryCodes = usePlusMemberDeliveryCodes({ deliveryData })\n * ```\n */\nexport const usePlusMemberDeliveryCodes = ({\n deliveryData,\n}: {\n deliveryData?: DeliveryData\n}) => {\n return useMemo(\n () => deliveryData?.deliveryCustomData?.discount_code as string[] | undefined,\n [deliveryData]\n )\n}\n","import { useMemo } from 'react'\nimport type { DeliveryData } from './types'\nimport type { Attribute } from '../../../types'\n\n/**\n * Hook to generate custom attributes for cart line items\n *\n * Creates custom attributes based on delivery data to be attached to line items.\n *\n * @param deliveryData - Delivery data containing custom attributes\n * @returns Array of custom attributes for line items\n *\n * @example\n * ```tsx\n * const itemAttributes = usePlusMemberItemCustomAttributes({ deliveryData })\n *\n * // Use in addToCart\n * await addToCart({\n * lineItems: lineItems.map(item => ({\n * ...item,\n * customAttributes: [...(item.customAttributes || []), ...itemAttributes]\n * }))\n * })\n * ```\n */\nexport const usePlusMemberItemCustomAttributes = ({\n deliveryData,\n}: {\n deliveryData?: DeliveryData\n}) => {\n const { deliveryCustomData } = deliveryData || {}\n\n return useMemo(() => {\n const itemCustomAttributes: Attribute[] = []\n\n if (deliveryCustomData?.is_presale) {\n itemCustomAttributes.push({\n key: '_is_presale',\n value: 'true',\n })\n }\n\n return itemCustomAttributes\n }, [deliveryCustomData])\n}\n","import { useMemo } from 'react'\nimport type { DeliveryData } from './types'\nimport type { Attribute } from '../../../types'\nimport { usePlusMemberContext } from './use-plus-member-context'\n\nexport interface CustomerOrder {\n edges?: Array<any>\n}\n\nexport interface Customer {\n orders?: CustomerOrder\n}\n\n/**\n * Hook to generate custom attributes for checkout\n *\n * Creates custom attributes based on delivery data, profile, and customer information\n * to be attached to the checkout.\n *\n * Requires profile to be provided via PlusMemberContext.\n *\n * @param deliveryData - Delivery data containing custom attributes\n * @param product - Product information (optional, for hiding shipping benefits check)\n * @param variant - Variant information (optional, for presale and hiding shipping benefits check)\n * @param customer - Customer information (optional, for user type determination)\n * @param isShowShippingBenefits - Function to check if shipping benefits should be shown (optional)\n * @returns Array of custom attributes for checkout\n *\n * @example\n * ```tsx\n * const checkoutAttributes = usePlusMemberCheckoutCustomAttributes({\n * deliveryData,\n * product,\n * variant,\n * customer,\n * isShowShippingBenefits\n * })\n *\n * // Use in checkout\n * await createCheckout({\n * lineItems,\n * customAttributes: checkoutAttributes\n * })\n * ```\n */\nexport const usePlusMemberCheckoutCustomAttributes = <\n TProduct = any,\n TVariant = any\n>({\n deliveryData,\n product,\n variant,\n customer,\n isShowShippingBenefits,\n}: {\n deliveryData?: DeliveryData\n product?: TProduct\n variant?: TVariant\n customer?: Customer\n isShowShippingBenefits?: (args: {\n variant?: TVariant\n product?: TProduct\n setting: any\n }) => boolean\n}) => {\n const { deliveryCustomData } = deliveryData || {}\n const { profile } = usePlusMemberContext()\n\n const userType = useMemo(() => {\n const customerInfo = customer\n if (!customerInfo) {\n return 'new_user_unlogin'\n }\n if (customer) {\n const { orders = {} } = customer\n const edgesLength = orders?.edges?.length\n if (edgesLength === 1) {\n return 'old_user_orders_once'\n } else if (edgesLength && edgesLength > 1) {\n return 'old_user_orders_twice'\n }\n }\n return 'new_user_login'\n }, [customer])\n\n return useMemo<Attribute[]>(() => {\n const checkoutCustomAttributes: Attribute[] = [\n {\n key: '_token',\n value: (profile as any)?.token || '',\n },\n {\n key: '_last_url',\n value:\n typeof window !== 'undefined'\n ? window.location.origin + window.location.pathname\n : '',\n },\n {\n key: '_user_type',\n value: userType,\n },\n ]\n\n if (profile) {\n checkoutCustomAttributes.push({\n key: '_login_user',\n value: '1',\n })\n }\n\n if (deliveryCustomData) {\n checkoutCustomAttributes.push({\n key: '_checkout_delivery_custom',\n value: JSON.stringify({\n ...deliveryCustomData,\n is_prime: (profile as any)?.isPlus,\n }),\n })\n }\n\n if ((variant as any)?.metafields?.presell) {\n checkoutCustomAttributes.push({\n key: '_presale',\n value: 'true',\n })\n }\n\n if (\n isShowShippingBenefits &&\n !isShowShippingBenefits({ variant, product, setting: {} })\n ) {\n checkoutCustomAttributes.push({\n key: '_hide_shipping',\n value: 'true',\n })\n }\n\n return checkoutCustomAttributes\n }, [deliveryCustomData, product, profile, userType, variant, isShowShippingBenefits])\n}\n","/**\n * useAutoRemovePlusMemberInCart Hook\n * 付费会员身份自动移除购物车中的会员产品\n * 年费会员删除月费会员产品,月费会员删除年费会员产品\n */\n\nimport { useEffect } from 'react'\nimport { useRemoveCartLines } from '../../../hooks/cart/use-remove-cart-lines'\nimport { NormalizedCart } from '@anker-in/shopify-sdk'\nimport { PlusMemberSettingsMetafields } from '../../..'\n\nexport interface UseAutoRemovePlusMemberInCartProps {\n profile: any\n cart?: NormalizedCart\n memberSetting: PlusMemberSettingsMetafields\n}\n\n/**\n * 自动移除购物车中的会员产品\n *\n * @param props - Hook 参数\n * @param props.memberSetting - Plus Member 配置\n * @param props.isMonthlyPlus - 用户是否是月费会员\n * @param props.isAnnualPlus - 用户是否是年费会员\n *\n * @example\n * ```tsx\n * const { profile } = useProfile()\n *\n * useAutoRemovePlusMemberInCart({\n * cart,\n * profile,\n * })\n * ```\n */\nexport function useAutoRemovePlusMemberInCart({\n cart,\n profile,\n memberSetting,\n}: UseAutoRemovePlusMemberInCartProps) {\n const { plus_monthly_product, plus_annual_product } = memberSetting || {}\n const { trigger: removeCartLines } = useRemoveCartLines()\n\n useEffect(() => {\n if (!cart || !plus_monthly_product || !plus_annual_product) return\n\n const removePlusProduct = async (productType?: { handle: string; sku: string }) => {\n if (!productType) return\n\n const product = cart.lineItems?.find(\n (item) =>\n item.product?.handle === productType?.handle && item.variant?.sku === productType?.sku\n )\n\n if (product) {\n await removeCartLines({\n lineIds: [product.id],\n })\n }\n }\n\n // 月费会员自动移除购物车中的月费会员产品\n if (profile?.isMonthlyPlus) {\n removePlusProduct(plus_monthly_product)\n }\n\n // 年费会员自动移除购物车中的年费会员产品\n if (profile?.isAnnualPlus) {\n removePlusProduct(plus_annual_product)\n }\n }, [cart, plus_annual_product, plus_monthly_product, profile, removeCartLines])\n}\n","/**\n * useAddPlusMemberProductsToCart Hook\n * 返回需要添加到购物车的 Plus Member 产品\n */\n\nimport { useMemo } from 'react'\nimport { useHasPlusMemberInCart } from './use-has-plus-member-in-cart'\nimport { DeliveryPlusType } from './types'\nimport type { NormalizedCart } from '@anker-in/shopify-sdk'\nimport { usePlusMemberContext } from './use-plus-member-context'\n\n/**\n * 返回需要添加到购物车的 Plus Member 产品\n *\n * 该 hook 会根据用户选择的会员模式和购物车现有状态,\n * 返回需要添加的会员产品。如果不需要添加会员产品,则返回 undefined。\n *\n * @param props - Hook 参数\n * @param props.cart - 购物车数据\n * @returns Plus Member 产品对象或 undefined\n *\n * @example\n * ```tsx\n * const plusMemberProduct = useAddPlusMemberProductsToCart({\n * cart,\n * })\n *\n * // plusMemberProduct 格式:\n * // {\n * // product: NormalizedProduct,\n * // variant: NormalizedProductVariant\n * // }\n * // 或 undefined (当不需要添加会员产品时)\n * ```\n */\nexport function useAddPlusMemberProductsToCart({\n cart,\n profile,\n}: {\n cart: NormalizedCart\n profile?: any\n}) {\n const { selectedPlusMemberMode, selectedPlusMemberProduct, plusMemberMetafields } =\n usePlusMemberContext()\n const { hasMonthlyPlus, hasAnnualPlus } = useHasPlusMemberInCart({\n memberSetting: plusMemberMetafields,\n cart,\n })\n\n const plusMemberProduct = useMemo(() => {\n // 如果选择的是免费会员,不添加会员产品\n if (!selectedPlusMemberProduct || selectedPlusMemberMode === DeliveryPlusType.FREE) {\n return undefined\n }\n\n // 如果选择月费会员且购物车中已有月费会员,不重复添加\n if (selectedPlusMemberMode === DeliveryPlusType.MONTHLY && hasMonthlyPlus) {\n return undefined\n }\n\n // 如果选择年费会员且购物车中已有年费会员,不重复添加\n if (selectedPlusMemberMode === DeliveryPlusType.ANNUAL && hasAnnualPlus) {\n return undefined\n }\n\n // 如果用户是月费会员,且选择的是月费会员,不添加会员产品\n if (profile?.isMonthlyPlus && selectedPlusMemberMode === DeliveryPlusType.MONTHLY) {\n return undefined\n }\n\n // 如果用户是年费会员,且选择的是年费会员,不添加会员产品\n if (!profile?.isAnnualPlus && selectedPlusMemberMode === DeliveryPlusType.ANNUAL) {\n return undefined\n }\n\n return selectedPlusMemberProduct\n }, [\n selectedPlusMemberMode,\n selectedPlusMemberProduct?.variant,\n selectedPlusMemberProduct?.product,\n hasMonthlyPlus,\n hasAnnualPlus,\n ])\n\n return plusMemberProduct\n}\n","/**\n * Plus Member Provider\n * Provides Plus Member context to child components\n */\n\nimport { PropsWithChildren, useMemo, useState } from 'react'\nimport { PlusMemberContext } from './context'\nimport { useShippingMethods } from './use-shipping-methods'\nimport { useProductsByHandles } from '../../product/use-products-by-handles'\nimport {\n PlusMemberSettingsMetafields,\n PlusMemberShippingMethodConfig,\n DeliveryPlusType,\n} from './types'\n\nexport interface PlusMemberProviderProps<TProduct = any, TVariant = any, TProfile = any> {\n // Product Variant object\n variant: TVariant\n // Product object\n product: TProduct\n // Metafields configuration: Shop -> member -> settings\n memberSetting: PlusMemberSettingsMetafields\n // Initial selected plus member mode\n initialSelectedPlusMemberMode?: DeliveryPlusType\n // Profile (user information)\n profile?: TProfile\n // Locale (language/region code)\n locale?: string\n}\n\n/**\n * Plus Member Provider Component\n *\n * Provides Plus Member context and state management to child components.\n *\n * @param variant - Product variant\n * @param product - Product\n * @param metafields - Plus member settings from metafields\n * @param initialSelectedPlusMemberMode - Initial selected mode (default: 'free')\n * @param profile - User profile\n * @param locale - Locale code\n * @param children - Child components\n *\n * @example\n * ```tsx\n * <PlusMemberProvider\n * variant={variant}\n * product={product}\n * memberSetting={memberSetting}\n * profile={profile}\n * locale={locale}\n * >\n * <YourComponent />\n * </PlusMemberProvider>\n * ```\n */\nexport const PlusMemberProvider = <TProduct = any, TVariant = any, TProfile = any>({\n variant,\n product,\n memberSetting,\n initialSelectedPlusMemberMode = 'free' as DeliveryPlusType,\n profile,\n locale,\n children,\n}: PropsWithChildren<PlusMemberProviderProps<TProduct, TVariant, TProfile>>) => {\n const [zipCode, setZipCode] = useState('')\n const [showTip, setShowTip] = useState(false)\n const [selectedPlusMemberMode, setSelectedPlusMemberMode] = useState<DeliveryPlusType>(\n initialSelectedPlusMemberMode\n )\n const [selectedShippingMethod, setSelectedShippingMethod] =\n useState<PlusMemberShippingMethodConfig>()\n const [allowNextDayDelivery, setAllowNextDayDelivery] = useState(false)\n const [allowThirdDayDelivery, setAllowThirdDayDelivery] = useState(false)\n const [showAreaCheckModal, setShowAreaCheckModal] = useState(false)\n const [showMoreShippingMethod, setShowMoreShippingMethod] = useState(false)\n const [showPlusMemberBenefit, setShowPlusMemberBenefit] = useState(false)\n const [deleteMarginBottom, setDeleteMarginBottom] = useState(false)\n\n const shippingMethodsContext = useShippingMethods({\n variant: variant as any,\n plusMemberMetafields: memberSetting,\n allowNextDayDelivery,\n allowThirdDayDelivery,\n selectedPlusMemberMode,\n zipCode,\n })\n\n // Fetch plus member products\n const plusMemberHandles = useMemo(() => {\n return [\n memberSetting?.plus_monthly_product?.handle,\n memberSetting?.plus_annual_product?.handle,\n ].filter(Boolean) as string[]\n }, [memberSetting])\n\n const { data: plusMemberProducts = [] } = useProductsByHandles({\n handles: plusMemberHandles,\n })\n\n const selectedPlusMemberProduct = useMemo(() => {\n if (selectedPlusMemberMode === DeliveryPlusType.FREE) {\n return null\n }\n const handle =\n selectedPlusMemberMode === DeliveryPlusType.MONTHLY\n ? memberSetting?.plus_monthly_product?.handle\n : memberSetting?.plus_annual_product?.handle\n const sku =\n selectedPlusMemberMode === DeliveryPlusType.MONTHLY\n ? memberSetting?.plus_monthly_product?.sku\n : memberSetting?.plus_annual_product?.sku\n const product = plusMemberProducts?.find((p: any) => p.handle === handle)\n const variant = product?.variants?.find((v: any) => v.sku === sku)\n return product && variant ? { product, variant } : null\n }, [plusMemberProducts, memberSetting, selectedPlusMemberMode])\n\n return (\n <PlusMemberContext.Provider\n value={{\n variant,\n zipCode,\n setZipCode,\n allowNextDayDelivery,\n setAllowNextDayDelivery,\n allowThirdDayDelivery,\n setAllowThirdDayDelivery,\n plusMemberMetafields: memberSetting,\n selectedPlusMemberMode,\n setSelectedPlusMemberMode,\n showAreaCheckModal,\n setShowAreaCheckModal,\n selectedShippingMethod,\n setSelectedShippingMethod,\n shippingMethodsContext,\n showTip,\n setShowTip,\n showMoreShippingMethod,\n setShowMoreShippingMethod,\n selectedPlusMemberProduct,\n plusMemberProducts,\n product,\n showPlusMemberBenefit,\n setShowPlusMemberBenefit,\n deleteMarginBottom,\n setDeleteMarginBottom,\n profile,\n locale,\n }}\n >\n {children}\n </PlusMemberContext.Provider>\n )\n}\n","/**\n * useIntersection Hook\n *\n * Observes element visibility using IntersectionObserver API\n */\n\nimport { RefObject, useEffect } from 'react'\n\nexport interface UseIntersectionOptions {\n /** Callback function when element becomes visible */\n callback: () => void\n /** Only trigger callback once (default: false) */\n once?: boolean\n /** Root element for intersection (default: viewport) */\n root?: Element | null\n /** Margin around root (default: '0px') */\n rootMargin?: string\n /** Visibility threshold 0-1 (default: 0.8) */\n threshold?: number\n}\n\n/**\n * Hook to observe element visibility with IntersectionObserver\n *\n * Triggers a callback when the target element becomes visible in the viewport\n *\n * @param targetRef - React ref to the target element\n * @param options - Intersection observer options\n *\n * @example\n * ```typescript\n * function LazyImage() {\n * const imageRef = useRef<HTMLImageElement>(null)\n * const [loaded, setLoaded] = useState(false)\n *\n * useIntersection(imageRef, {\n * callback: () => setLoaded(true),\n * once: true,\n * threshold: 0.5\n * })\n *\n * return (\n * <img\n * ref={imageRef}\n * src={loaded ? actualSrc : placeholderSrc}\n * alt=\"Lazy loaded\"\n * />\n * )\n * }\n * ```\n */\nexport function useIntersection(\n targetRef: RefObject<Element> | undefined,\n options: UseIntersectionOptions\n): void {\n const {\n callback,\n once = false,\n root = null,\n rootMargin = '0px',\n threshold = 0.8,\n } = options\n\n useEffect(() => {\n if (!targetRef?.current) {\n return\n }\n\n // Check if IntersectionObserver is supported\n if (typeof IntersectionObserver === 'undefined') {\n console.warn('[useIntersection] IntersectionObserver is not supported')\n return\n }\n\n const current = targetRef.current\n\n const observerOptions = {\n root,\n rootMargin,\n threshold,\n }\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n callback()\n if (once) {\n observer.disconnect()\n }\n }\n })\n }, observerOptions)\n\n observer.observe(current)\n\n return () => {\n observer.disconnect()\n }\n }, [targetRef, callback, once, root, rootMargin, threshold])\n}\n","/**\n * useExposure Hook\n *\n * Tracks element exposure (visibility + duration) for analytics/tracking\n */\n\nimport { RefObject, useEffect, useRef, useState } from 'react'\n\nexport interface UseExposureOptions {\n /** Visibility threshold 0-1 (default: 0.5, meaning 50% visible) */\n threshold?: number\n /** Duration in milliseconds element must be visible (default: 2000ms) */\n duration?: number\n /** Only trigger callback once (default: true) */\n once?: boolean\n /** Callback when element has been exposed for the required duration */\n onExposure: () => void\n}\n\n/**\n * Hook to track element exposure (visibility + duration threshold)\n *\n * Useful for tracking ad impressions, product views, or any analytics\n * that require an element to be visible for a certain duration\n *\n * @param targetRef - React ref to the target element\n * @param options - Exposure tracking options\n * @returns Current visibility state\n *\n * @example\n * ```typescript\n * function ProductCard({ product }) {\n * const cardRef = useRef<HTMLDivElement>(null)\n *\n * const isVisible = useExposure(cardRef, {\n * threshold: 0.5, // 50% visible\n * duration: 2000, // 2 seconds\n * once: true, // Only track once\n * onExposure: () => {\n * // Track product impression\n * analytics.track('Product Viewed', {\n * productId: product.id,\n * productName: product.title\n * })\n * }\n * })\n *\n * return (\n * <div ref={cardRef}>\n * {product.title}\n * {isVisible && <div className=\"viewing-indicator\" />}\n * </div>\n * )\n * }\n * ```\n */\nexport function useExposure(\n targetRef: RefObject<Element>,\n options: UseExposureOptions\n): boolean {\n const { threshold = 0.5, duration = 2000, once = true, onExposure } = options\n\n const [isVisible, setIsVisible] = useState(false)\n const timeoutRef = useRef<NodeJS.Timeout | undefined>(undefined)\n const hasTriggeredRef = useRef(false)\n\n useEffect(() => {\n if (!targetRef?.current || typeof IntersectionObserver === 'undefined') {\n return\n }\n\n // If once is true and already triggered, don't observe\n if (once && hasTriggeredRef.current) {\n return\n }\n\n const current = targetRef.current\n\n // Clear any existing timeout\n const clearTimer = () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = undefined\n }\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n // Update visibility state\n setIsVisible(entry.isIntersecting)\n\n if (entry.isIntersecting) {\n // Element is visible - start duration timer\n timeoutRef.current = setTimeout(() => {\n // Check if already triggered (in case of race conditions)\n if (once && hasTriggeredRef.current) {\n return\n }\n\n onExposure()\n hasTriggeredRef.current = true\n\n if (once) {\n observer.disconnect()\n }\n }, duration)\n } else {\n // Element is no longer visible - clear timer\n clearTimer()\n }\n })\n },\n {\n root: null,\n rootMargin: '0px',\n threshold,\n }\n )\n\n observer.observe(current)\n\n return () => {\n clearTimer()\n observer.disconnect()\n }\n }, [targetRef, threshold, duration, once, onExposure])\n\n return isVisible\n}\n","/**\n * useGeoLocation Hook\n *\n * Fetches and caches user's geographic location\n */\n\nimport useSWR, { SWRConfiguration } from 'swr'\nimport {\n getLocalStorage,\n setLocalStorage,\n} from '@anker-in/shopify-sdk'\n\nexport interface GeoLocationData {\n /** Geographic information */\n geo: {\n /** Country information */\n country?: {\n /** Country code (e.g., 'US', 'GB') */\n code?: string\n /** Country name */\n name?: string\n }\n /** Region/state information */\n region?: {\n code?: string\n name?: string\n }\n /** City name */\n city?: string\n /** Coordinates */\n latitude?: number\n longitude?: number\n /** Timezone */\n timezone?: string\n }\n /** Suggested locale based on location */\n suggestLocale?: string\n}\n\nexport interface LocaleMapping {\n /** Countries that should map to EU locale */\n euCountries?: string[]\n /** Countries that should map to DE locale */\n deCountries?: string[]\n /** Countries that should map to AU locale */\n auCountries?: string[]\n /** Countries that should map to AE-EN locale */\n aeEnCountries?: string[]\n /** Custom country to locale mapping */\n customMapping?: Record<string, string>\n}\n\nexport interface UseGeoLocationOptions extends SWRConfiguration<GeoLocationData | undefined> {\n /** API endpoint for fetching geo data (default: '/geolocation') */\n endpoint?: string\n /** Cache key for localStorage (default: 'geoLocation') */\n cacheKey?: string\n /** Cache duration in milliseconds (default: 24 hours) */\n cacheDuration?: number\n /** Locale mapping configuration */\n localeMapping?: LocaleMapping\n /** Enable automatic caching (default: true) */\n enableCache?: boolean\n}\n\n/**\n * Determine suggested locale based on country code and mapping\n */\nfunction determineSuggestedLocale(\n countryCode: string,\n mapping?: LocaleMapping\n): string {\n if (!countryCode) {\n return 'us'\n }\n\n const upperCode = countryCode.toUpperCase()\n\n // Check custom mapping first\n if (mapping?.customMapping?.[upperCode]) {\n return mapping.customMapping[upperCode]\n }\n\n // Check EU countries\n if (mapping?.euCountries?.includes(upperCode)) {\n if (upperCode === 'PL') {\n return 'pl'\n }\n return 'eu'\n }\n\n // Check AU countries\n if (mapping?.auCountries?.includes(upperCode)) {\n return 'au'\n }\n\n // Check DE countries\n if (mapping?.deCountries?.includes(upperCode)) {\n return 'de'\n }\n\n // Check AE-EN countries\n if (mapping?.aeEnCountries?.includes(upperCode)) {\n return 'ae-en'\n }\n\n // Special cases\n if (upperCode === 'GB') {\n return 'uk'\n }\n\n // Default to lowercase country code\n return countryCode.toLowerCase()\n}\n\n/**\n * Hook to fetch and cache user's geographic location\n *\n * Fetches geo data from an API endpoint and caches it in localStorage\n * Automatically determines suggested locale based on country\n *\n * @param options - Geo location options\n * @returns SWR response with geo location data\n *\n * @example\n * ```typescript\n * function LocaleSwitcher() {\n * const { data: geoData, error, isLoading } = useGeoLocation({\n * endpoint: '/api/geolocation',\n * localeMapping: {\n * euCountries: ['FR', 'DE', 'IT', 'ES'],\n * auCountries: ['AU', 'NZ']\n * }\n * })\n *\n * if (isLoading) return <div>Loading...</div>\n * if (error) return <div>Error loading location</div>\n *\n * return (\n * <div>\n * <p>Country: {geoData?.geo.country?.code}</p>\n * <p>Suggested Locale: {geoData?.suggestLocale}</p>\n * </div>\n * )\n * }\n * ```\n *\n * @example\n * ```typescript\n * // With custom locale mapping\n * const { data } = useGeoLocation({\n * localeMapping: {\n * customMapping: {\n * 'JP': 'ja',\n * 'CN': 'zh-cn',\n * 'TW': 'zh-tw'\n * }\n * }\n * })\n * ```\n */\nexport function useGeoLocation(\n options: UseGeoLocationOptions = {}\n): ReturnType<typeof useSWR<GeoLocationData | undefined>> {\n const {\n endpoint = '/geolocation',\n cacheKey = 'geoLocation',\n cacheDuration = 1000 * 60 * 60 * 24, // 24 hours\n localeMapping,\n enableCache = true,\n ...swrOptions\n } = options\n\n const fetcher = async (): Promise<GeoLocationData | undefined> => {\n // Try to get from cache first\n if (enableCache) {\n const cached = getLocalStorage<GeoLocationData>(cacheKey)\n if (cached) {\n return cached\n }\n }\n\n try {\n // Fetch from API\n const response = await fetch(endpoint)\n\n if (!response.ok) {\n throw new Error(`Failed to fetch geo location: ${response.status}`)\n }\n\n const result = await response.json()\n\n // Extract country code\n const countryCode = result?.geo?.country?.code\n\n if (!countryCode) {\n console.warn('[useGeoLocation] No country code in response')\n return undefined\n }\n\n // Determine suggested locale\n const suggestLocale = determineSuggestedLocale(\n countryCode,\n localeMapping\n )\n\n const geoData: GeoLocationData = {\n geo: result.geo,\n suggestLocale,\n }\n\n // Cache the result\n if (enableCache) {\n const expires = new Date(Date.now() + cacheDuration)\n setLocalStorage(cacheKey, geoData, { expires })\n }\n\n return geoData\n } catch (error) {\n console.error('[useGeoLocation] Error fetching geo data:', error)\n return undefined\n }\n }\n\n return useSWR<GeoLocationData | undefined>(\n cacheKey,\n fetcher,\n swrOptions\n )\n}\n\n/**\n * Get cached geo location data without fetching\n *\n * @param cacheKey - Cache key (default: 'geoLocation')\n * @returns Cached geo data or undefined\n *\n * @example\n * ```typescript\n * const cachedGeo = getCachedGeoLocation()\n * if (cachedGeo) {\n * console.log('Country:', cachedGeo.geo.country?.code)\n * }\n * ```\n */\nexport function getCachedGeoLocation(\n cacheKey = 'geoLocation'\n): GeoLocationData | undefined {\n return getLocalStorage<GeoLocationData>(cacheKey) ?? undefined\n}\n\n/**\n * Clear cached geo location data\n *\n * @param cacheKey - Cache key (default: 'geoLocation')\n *\n * @example\n * ```typescript\n * clearGeoLocationCache()\n * ```\n */\nexport function clearGeoLocationCache(cacheKey = 'geoLocation'): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(cacheKey)\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/provider/context.ts","../../src/provider/use-shopify.ts","../../src/hooks/cart/types/auto-free-gift.ts","../../src/hooks/cart/const.ts","../../src/hooks/cart/utils/normalize-add-to-cart-lines.ts","../../src/hooks/cart/utils/index.ts","../../src/hooks/cart/utils/auto-free-gift.ts","../../src/hooks/cart/feature/use-calc-auto-free-gift.ts","../../src/hooks/cart/feature/use-script-auto-free-gift.ts","../../src/provider/cart-context.tsx","../../src/hooks/cart/use-create-cart.ts","../../src/hooks/cart/use-add-cart-lines.ts","../../src/tracking/ga.ts","../../src/tracking/fbq.ts","../../src/hooks/cart/use-apply-cart-codes.ts","../../src/hooks/cart/use-remove-cart-codes.ts","../../src/hooks/cart/use-add-to-cart.ts","../../src/hooks/cart/use-update-cart-lines.ts","../../src/hooks/cart/use-remove-cart-lines.ts","../../src/hooks/cart/use-update-cart-attributes.ts","../../src/hooks/cart/use-buy-now.ts","../../src/hooks/cart/feature/use-calc-gifts-from-lines.ts","../../src/hooks/cart/types/order-discount.ts","../../src/hooks/cart/feature/use-calc-order-discount.ts","../../src/hooks/member/plus/use-has-plus-member-in-cart.ts","../../src/hooks/cart/feature/use-cart-attributes.ts","../../src/hooks/cart/feature/use-cart-item-quantity-limit.ts","../../src/hooks/cart/feature/use-update-line-code-amount-attributes.ts","../../src/hooks/cart/types/price-discount.ts","../../src/hooks/product/use-product.ts","../../src/hooks/product/use-all-products.ts","../../src/hooks/product/use-products-by-handles.ts","../../src/hooks/product/use-variant.ts","../../src/hooks/product/use-price.ts","../../src/hooks/product/use-selected-options.ts","../../src/hooks/product/use-product-url.ts","../../src/hooks/product/use-update-variant-query.ts","../../src/hooks/product/use-variant-media.ts","../../src/hooks/collection/use-collection.ts","../../src/hooks/collection/use-all-collections.ts","../../src/hooks/collection/use-collections.ts","../../src/hooks/blog/use-blog.ts","../../src/hooks/blog/use-all-blogs.ts","../../src/hooks/blog/use-article.ts","../../src/hooks/blog/use-articles.ts","../../src/hooks/blog/use-articles-in-blog.ts","../../src/hooks/search/use-search.ts","../../src/hooks/site/use-site.ts","../../src/hooks/member/plus/types.ts","../../src/hooks/member/plus/context.tsx","../../src/hooks/member/plus/use-plus-member-context.ts","../../src/hooks/member/plus/use-plus-monthly-product-variant.ts","../../src/hooks/member/plus/use-plus-annual-product-variant.ts","../../src/hooks/member/plus/use-shipping-methods.ts","../../src/hooks/member/plus/use-shipping-method-available-check.ts","../../src/hooks/member/plus/use-replace-cart-plus-member.ts","../../src/hooks/member/plus/use-plus-member-delivery-codes.ts","../../src/hooks/member/plus/use-plus-member-item-custom-attributes.ts","../../src/hooks/member/plus/use-plus-member-checkout-custom-attributes.ts","../../src/hooks/member/plus/use-auto-remove-plus-member-in-cart.ts","../../src/hooks/member/plus/use-add-plus-member-products-to-cart.ts","../../src/hooks/member/plus/provider.tsx","../../src/hooks/dom/use-intersection.ts","../../src/hooks/dom/use-exposure.ts","../../src/hooks/geo/use-geo-location.ts"],"names":["RuleType","BuyRuleType","SpendMoneyType","attr","newAttr","product","Cookies","Decimal","useMemo","useRef","upgrade_multiple","upgrade_value","useSWR","getProductsByHandles","createContext","useContext","useCallback","updateCartCodes","useSWRMutation","variant","addCartLines","createCart","OrderDiscountType","OrderBasePriceType","useState","useEffect","useRequest","updateCartLines","PriceDiscountType","PriceBasePriceType","decodeShopifyId","PLUS_MEMBER_TYPE","PlusMemberMode","DeliveryPlusType","ShippingMethodMode","removeCartLines","jsx"],"mappings":";;;;;;;;;;AAoBO,IAAM,cAAA,GAAiB,cAA0C,IAAI,CAAA;ACbrE,SAAS,UAAA,GAAa;AAC3B,EAAA,MAAM,OAAA,GAAU,WAAW,cAAc,CAAA;AAEzC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AAEA,EAAA,OAAO,OAAA;AACT;;;ACwGO,IAAK,QAAA,qBAAAA,SAAAA,KAAL;AACL,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,oBAAiB,CAAA,CAAA,GAAjB,gBAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,YAAS,CAAA,CAAA,GAAT,QAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,qBAAkB,CAAA,CAAA,GAAlB,iBAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,oBAAiB,CAAA,CAAA,GAAjB,gBAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,oBAAiB,CAAA,CAAA,GAAjB,gBAAA;AALU,EAAA,OAAAA,SAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA;AAQL,IAAK,WAAA,qBAAAC,YAAAA,KAAL;AACL,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,kBAAe,CAAA,CAAA,GAAf,cAAA;AACA,EAAAA,YAAAA,CAAAA,YAAAA,CAAA,oBAAiB,CAAA,CAAA,GAAjB,gBAAA;AAFU,EAAA,OAAAA,YAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA;AAKL,IAAK,cAAA,qBAAAC,eAAAA,KAAL;AACL,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,kBAAe,CAAA,CAAA,GAAf,cAAA;AACA,EAAAA,eAAAA,CAAAA,eAAAA,CAAA,oBAAiB,CAAA,CAAA,GAAjB,gBAAA;AAFU,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;;;AClIL,IAAM,mBAAA,GAAsB;AAAA,EACjC,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI,KAAA;AAAA,EACJ,EAAA,EAAI;AACN;AAEO,IAAM,+BAAA,GAET;AAAA,EACF,YAAA,EAAc;AAChB;AAGO,IAAM,sBAAA,GAAyB;AAC/B,IAAM,wBAAA,GAA2B;AAEjC,IAAM,eAAA,GAAkB;AACxB,IAAM,sBAAA,GAAyB;AAG/B,IAAM,oBAAoB,CAAC,MAAA,EAAQ,QAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,MAAM;;;ACzBzE,SAAS,wBAAwB,KAAA,EAAkD;AACxF,EAAA,OAAO,KAAA,CACJ,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,OAAA,EAAS,EAAE,CAAA,CACjC,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU;AACpB,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,IAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,CAAA;AAGlC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,UAAA,EAAY,MAAA,GAC9B,MAAA,CAAO,QAAQ,UAAA,CAAW,MAAM,CAAA,GAChC,OAAA,CAAQ,cAAA,EAAgB,MAAA,GACtB,OAAO,OAAA,CAAQ,cAAA,CAAe,MAAM,CAAA,GACpC,OAAA,CAAQ,KAAA,EAAO,SACb,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA,GAC3B,CAAA;AAER,IAAA,MAAM,iBAAiB,KAAA,GAAQ,QAAA;AAC/B,IAAA,MAAM,WAAA,GAAc,cAAA;AAEpB,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,CAAA,UAAA,EAAa,KAAK,CAAA,CAAA,EAAI,QAAQ,EAAE,CAAA,CAAA;AAAA;AAAA,MACpC,IAAA,EAAM,OAAA,EAAS,KAAA,IAAS,OAAA,CAAQ,KAAA,IAAS,EAAA;AAAA,MACzC,QAAA;AAAA,MACA,WAAW,OAAA,CAAQ,EAAA;AAAA,MACnB,SAAA,EAAW,OAAA,EAAS,EAAA,IAAM,OAAA,CAAQ,EAAA,CAAG,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,MACrE,WAAA;AAAA,MACA,cAAA;AAAA,MACA,qBAAqB,EAAC;AAAA,MACtB,gBAAA,EAAkB,IAAA,CAAK,UAAA,IAAc,EAAC;AAAA,MACtC,OAAA,EAAS;AAAA,QACP,IAAI,OAAA,CAAQ,EAAA;AAAA,QACZ,KAAA;AAAA,QACA,SAAA,EAAW,QAAQ,cAAA,EAAgB,MAAA,GAAS,OAAO,OAAA,CAAQ,cAAA,CAAe,MAAM,CAAA,GAAI,CAAA;AAAA,QACpF,GAAA,EAAK,QAAQ,GAAA,IAAO,EAAA;AAAA,QACpB,IAAA,EAAM,QAAQ,KAAA,IAAS,EAAA;AAAA,QACvB,KAAA,EAAO,QAAQ,KAAA,GACX;AAAA,UACE,GAAA,EAAK,QAAQ,KAAA,CAAM,GAAA;AAAA,UACnB,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,OAAA,IAAW;AAAA,SACpC,GACA,MAAA;AAAA,QACJ,gBAAA,EAAkB,KAAA;AAAA;AAAA,QAClB,gBAAA,EAAkB,QAAQ,gBAAA,IAAoB,IAAA;AAAA,QAC9C,iBAAA,EAAmB,QAAQ,iBAAA,IAAqB,CAAA;AAAA,QAChD,mBAAA,EAAqB,KAAA;AAAA;AAAA,QACrB,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,YAAY,OAAA,CAAQ;AAAA,OACtB;AAAA,MACA,OAAA;AAAA,MACA,MAAM,OAAA,EAAS,MAAA,GAAS,CAAA,UAAA,EAAa,OAAA,CAAQ,MAAM,CAAA,CAAA,GAAK,EAAA;AAAA,MACxD,WAAW,EAAC;AAAA,MACZ,OAAA,EAAS,OAAA,CAAQ,eAAA,EAAiB,GAAA,CAAI,CAAC,GAAA,MAAc;AAAA,QACnD,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,OAAO,GAAA,CAAI;AAAA,OACb,CAAE;AAAA,KACJ;AAAA,EACF,CAAC,CAAA;AACL;AAMO,SAAS,uBAAA,CAAwB,OAA4B,YAAA,EAAyB;AAC3F,EAAA,MAAM,eAAA,GAAkB,wBAAwB,KAAK,CAAA;AAErD,EAAA,MAAM,aAAA,GAAgB,gBAAgB,MAAA,CAAO,CAAC,KAAK,IAAA,KAAS,GAAA,GAAM,IAAA,CAAK,cAAA,EAAgB,CAAC,CAAA;AAExF,EAAA,MAAM,UAAA,GAAa,gBAAgB,MAAA,CAAO,CAAC,KAAK,IAAA,KAAS,GAAA,GAAM,IAAA,CAAK,WAAA,EAAa,CAAC,CAAA;AAElF,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,cAAc,EAAA,IAAM,cAAA;AAAA,IACxB,YAAY,YAAA,EAAc,UAAA;AAAA,IAC1B,OAAO,YAAA,EAAc,KAAA;AAAA,IACrB,WAAW,YAAA,EAAc,SAAA,IAAA,iBAAa,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,IAC7D,QAAA,EAAU,YAAA,EAAc,QAAA,IAAY,EAAE,MAAM,KAAA,EAAM;AAAA,IAClD,eAAe,YAAA,EAAc,aAAA;AAAA,IAC7B,SAAA,EAAW,eAAA;AAAA,IACX,sBAAA,EAAwB,CAAA;AAAA,IACxB,cAAA,EAAgB,CAAA;AAAA,IAChB,sBAAA,EAAwB,aAAA;AAAA,IACxB,aAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA,EAAgB,CAAA;AAAA,IAChB,aAAA,EAAe,YAAA,EAAc,aAAA,IAAiB,EAAC;AAAA,IAC/C,qBAAqB,EAAC;AAAA,IACtB,GAAA,EAAK,cAAc,GAAA,IAAO,EAAA;AAAA,IAC1B,KAAA,EAAO,IAAA;AAAA,IACP,kBAAkB,YAAA,EAAc;AAAA,GAClC;AACF;;;AClGO,IAAM,WAAW,MAA8B;AACpD,EAAA,MAAM,MAAM,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,MAAA,GAAS,EAAA;AACrE,EAAA,MAAM,aAAqC,EAAC;AAC5C,EAAA,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA,IAAK,EAAA,EAAI;AAC1B,IAAA,MAAM,GAAA,GAAM,IAAI,MAAA,CAAO,CAAC,GACtB,IAAA,GAAO,GAAA,CAAI,MAAM,GAAG,CAAA;AACtB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,GAAG,CAAA;AAChC,MAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,MAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,UAAA,CAAW,GAAG,CAAA,GAAI,kBAAA,CAAmB,KAAK,CAAA;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,UAAA;AACT;AAEO,SAAS,OAAO,EAAA,EAAY;AACjC,EAAA,IAAI,MAAM,OAAO,EAAA,KAAO,YAAY,EAAA,CAAG,QAAA,CAAS,GAAG,CAAA,EAAG;AACpD,IAAA,OAAO,EAAA,CAAG,MAAM,GAAG,CAAA,CAAE,KAAI,EAAG,KAAA,CAAM,GAAG,CAAA,EAAG,KAAA,EAAM;AAAA,EAChD,CAAA,MAAO;AACL,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAEO,SAAS,MAAA,CAAO,EAAA,EAAY,IAAA,GAAqC,gBAAA,EAAkB;AACxF,EAAA,OAAO,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AACpC;ACdO,IAAM,6BAAA,GAAgC,CAC3C,QAAA,EACA,YAAA,EACA,YAAA,KACG;AACH,EAAA,MAAM,iBAAA,GAAoB,cAAc,iBAAA,IAAqB,KAAA;AAC7D,EAAA,MAAM,WAAA,GAAc,QAAA,EAAU,SAAA,EAAW,MAAA,CAAO,CAAC,IAAA,KAAc;AAE7D,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,4BAAA,CAA6B,KAAK,gBAAgB,CAAA;AACtE,IAAA,OAAO,oBACH,CAAC,OAAA,GACD,YAAA,EAAc,IAAA,CAAK,CAAC,IAAA,KAAc;AAChC,MAAA,OAAO,CAAC,OAAA,IAAW,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,KAAM,IAAA;AAAA,IAChD,CAAC,CAAA;AAAA,EACP,CAAC,CAAA;AACD,EAAA,OACE,WAAA,EAAa,MAAA,CAAO,CAAC,GAAA,EAAa,IAAA,KAAc;AAC9C,IAAA,OACE,GAAA,IACC,YAAA,EAAc,gBAAA,KAAA,CAAA,sBACX,MAAA,CAAO,IAAA,CAAK,cAAc,CAAA,IAAK,CAAA,GAC/B,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,IAAK,CAAA,CAAA;AAAA,EAEpC,CAAA,EAAG,CAAC,CAAA,IAAK,CAAA;AAEb;AAEO,IAAM,SAAA,GAAY,CAAC,GAAA,KAAgB;AACxC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACvB,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEO,IAAM,4BAAA,GAA+B,CAE1C,UAAA,GAA+C,EAAC,KAC7C;AAEH,EAAA,MAAM,OAAO,UAAA,CAAW,IAAA,CAAK,CAACC,KAAAA,KAASA,KAAAA,CAAK,QAAQ,sBAAsB,CAAA;AAE1E,EAAA,OAAO,SAAA,CAAU,IAAA,EAAM,KAAA,IAAS,EAAE,KAAK,EAAC;AAC1C;AAEO,IAAM,2BAAA,GAA8B,CACzC,aAAA,EACA,aAAA,EACA,0BAAA,KACG;AAKH,EAAA,OACE,aAAA,CAAc,IAAA,CAAK,CAAC,IAAA,KAAS;AAC3B,IAAA,MAAM,OAAA,GAAU,cAAc,IAAA,CAAK,CAACC,aAAYA,QAAAA,CAAQ,GAAA,KAAQ,KAAK,GAAG,CAAA;AACxE,IAAA,OAAO,OAAA,GAAU,OAAA,CAAQ,KAAA,KAAU,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EAClD,CAAC,CAAA,IACD,aAAA,CAAc,IAAA,CAAK,CAAC,SAAS,CAAC,aAAA,CAAc,IAAA,CAAK,CAAC,YAAY,OAAA,CAAQ,GAAA,KAAQ,KAAK,GAAG,CAAC,KACvF,0BAAA,CAA2B,IAAA;AAAA,IAAK,CAAC,eAC/B,aAAA,CAAc,IAAA,CAAK,CAAC,OAAA,KAAY,OAAA,CAAQ,GAAA,KAAQ,UAAA,CAAW,GAAG;AAAA,GAChE;AAEJ;AAQA,IAAM,WAAA,GAAc,CAAC,MAAA,EAAkB,aAAA,GAA0B,EAAC,KAAe;AAE/E,EAAA,IAAI,CAAC,aAAA,EAAe,MAAA,EAAQ,OAAO,IAAA;AAEnC,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,MAAM,CAAA;AAEhC,EAAA,OAAO,cAAc,KAAA,CAAM,CAAC,SAAS,SAAA,CAAU,GAAA,CAAI,IAAI,CAAC,CAAA;AAC1D,CAAA;AAQA,IAAM,YAAA,GAAe,CAAC,MAAA,EAAkB,cAAA,GAA2B,EAAC,KAAe;AAEjF,EAAA,IAAI,CAAC,cAAA,EAAgB,MAAA,EAAQ,OAAO,IAAA;AAEpC,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,MAAM,CAAA;AAEhC,EAAA,OAAO,CAAC,eAAe,IAAA,CAAK,CAAC,SAAS,SAAA,CAAU,GAAA,CAAI,IAAI,CAAC,CAAA;AAC3D,CAAA;AAEO,SAAS,QAAA,CACd,eAAA,EACA,QAAA,EACA,iBAAA,EACS;AAET,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,eAAe,GAAG,OAAO,KAAA;AAC5C,EAAA,IAAI,eAAA,CAAgB,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAKzC,EAAA,OAAO,eAAA,CAAgB,IAAA,CAAK,CAAC,IAAA,KAAS;AAEpC,IAAA,MAAM,YAAA,GACJ,YAAY,QAAA,EAAU,IAAA,CAAK,cAAc,CAAA,IAAK,YAAA,CAAa,QAAA,EAAU,IAAA,CAAK,iBAAiB,CAAA;AAG7F,IAAA,MAAM,cAAA,GACJ,YAAY,iBAAA,EAAmB,IAAA,CAAK,uBAAuB,CAAA,IAC3D,YAAA,CAAa,iBAAA,EAAmB,IAAA,CAAK,0BAA0B,CAAA;AAGjE,IAAA,OAAO,YAAA,IAAgB,cAAA;AAAA,EACzB,CAAC,CAAA;AACH;AAGA,IAAI,6BAAA,GAGO,IAAA;AAEJ,IAAM,2BAA2B,CAAC;AAAA,EACvC,wBAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,KAIM;AAEJ,EAAA,MAAM,QAAA,GAAW,KAAK,SAAA,CAAU;AAAA,IAC9B,aAAA,EAAe,0BAA0B,aAAA,GACrC;AAAA,MACE,OACE,wBAAA,CAAyB,aAAA,CAAc,gBAAA,EAAkB,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QACtE,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,QAAA,EAAU;AAAA,OACZ,CAAE,KAAK;AAAC,KACZ,GACA,IAAA;AAAA,IACJ,kBAAA,EAAoB,wBAAA,EAA0B,kBAAA,EAAoB,MAAA,IAAU,CAAA;AAAA,IAC5E,eAAA,EAAiB,wBAAA,EAA0B,kBAAA,EAAoB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,EAAK,IAAK,EAAC;AAAA,IAC3F,eAAA,EAAiB,cAAA,EAAgB,EAAA,IAAM,cAAA,EAAgB,IAAA,IAAQ,EAAA;AAAA,IAC/D;AAAA,GACD,CAAA;AAGD,EAAA,IAAI,6BAAA,IAAiC,6BAAA,CAA8B,GAAA,KAAQ,QAAA,EAAU;AACnF,IAAA,OAAO,6BAAA,CAA8B,MAAA;AAAA,EACvC;AAGA,EAAA,MAAM,MAAA,GACJ,wBAAA,EAA0B,aAAA,EAAe,gBAAA,EACrC,MAAA;AAAA,IAAO,CAAC,IAAA,KACR,wBAAA,EAA0B,kBAAA,EAAoB,IAAA;AAAA,MAC5C,CAAC,OAAA,KAAY,OAAA,CAAQ,MAAA,KAAW,IAAA,CAAK;AAAA;AACvC,GACF,CACC,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU;AACpB,IAAA,MAAM,OAAA,GAAU,0BAA0B,kBAAA,EAAoB,IAAA;AAAA,MAC5D,CAACC,QAAAA,KAAYA,QAAAA,CAAQ,MAAA,KAAW,IAAA,CAAK;AAAA,KACvC;AACA,IAAA,MAAM,WAAW,OAAA,EAAS,QAAA;AAC1B,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAClC,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAW,CAAA,CAAE,GAAA,KAAQ,IAAA,CAAK,GAAG,CAAA,GAC5C,MAAA;AAEJ,IAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,IAAA,MAAM,WAAA,GAAcC,QAAAA,CAAQ,GAAA,CAAI,cAAc,KAAM,KAAA,EAAe,YAAA;AACnE,IAAA,MAAM,iBACJ,cAAA,CAAe,sBAAA,IACf,WAAA,EAAa,QAAA,CAAS,eAAe,sBAAsB,CAAA;AAE7D,IAAA,IAAI,gBAAA,GAAmB,KAAA;AACvB,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,MAAM,iBAAA,GAAoBA,QAAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA;AACxD,MAAA,gBAAA,GAAmB,CAAC,CAAC,iBAAA;AAAA,IACvB;AAEA,IAAA,MAAM,gBAAA,GAAqD;AAAA,MACzD;AAAA,QACE,GAAA,EAAK,0BAAA;AAAA,QACL,KAAA,EAAO;AAAA,OACT;AAAA,MACA,GAAI,gBAAA,GACA;AAAA,QACE,EAAE,GAAA,EAAK,0BAAA,EAA4B,KAAA,EAAO,KAAA,EAAM;AAAA,QAChD,EAAE,GAAA,EAAK,uBAAA,EAAyB,KAAA,EAAO,IAAA;AAAK,UAE9C,EAAC;AAAA,MACL,GAAI,cAAA,IAAkB,cAAA,EAAgB,gBAAA,GAClC;AAAA,QACE;AAAA,UACE,KAAK,cAAA,CAAe,gBAAA;AAAA,UACpB,OAAO,cAAA,CAAe;AAAA;AACxB,UAEF;AAAC,KACP;AAEA,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,EAAA,EAAI,OAAA,EAAS,EAAA,GAAK,GAAA,GAAM,KAAA;AAAA,MACxB,SAAA,EAAW,MAAA,CAAO,OAAA,EAAS,EAAE,CAAA;AAAA,MAC7B,SAAA,EAAW,MAAA,CAAO,OAAA,EAAS,EAAE,CAAA;AAAA,MAC7B,IAAA,EAAO,OAAA,EAAiB,IAAA,IAAS,OAAA,EAAiB,KAAA,IAAS,EAAA;AAAA,MAC3D,QAAA,EAAU,CAAA;AAAA,MACV,WAAW,EAAC;AAAA,MACZ,IAAA,EAAM,SAAS,MAAA,IAAU,EAAA;AAAA,MACzB,OAAA;AAAA,MACA,WAAA,EAAa,CAAA;AAAA,MACb,gBAAgB,IAAIC,QAAA;AAAA,QAClB,OAAO,SAAS,KAAA,KAAU,QAAA,GAAW,SAAS,KAAA,EAAO,MAAA,IAAU,CAAA,GAAI,OAAA,EAAS,KAAA,IAAS;AAAA,QACrF,QAAA,EAAS;AAAA,MACX,SAAS,EAAC;AAAA,MACV,qBAAqB,EAAC;AAAA,MACtB,OAAA;AAAA,MACA,gBAAA;AAAA,MACA,eAAA,EAAiB,MAAA;AAAA,MACjB,cAAA,EAAgB;AAAA,KAClB;AAEA,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,SAAA,EAAW,CAAC,OAAA,EAAS;AAAA,KACvB;AAAA,EACF,CAAC,KAAK,EAAC;AAGX,EAAA,6BAAA,GAAgC;AAAA,IAC9B,GAAA,EAAK,QAAA;AAAA,IACL;AAAA,GACF;AAEA,EAAA,OAAO,MAAA;AACT;AAGA,IAAI,+BAAA,GAGO,IAAA;AAEJ,IAAM,6BAA6B,CAAC;AAAA,EACzC,cAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAA,KAIM;AAEJ,EAAA,MAAM,QAAA,GAAW,KAAK,SAAA,CAAU;AAAA,IAC9B,gBAAgB,cAAA,GACZ;AAAA,MACE,KAAA,EAAO,eAAe,IAAA,EAAM,eAAA;AAAA,MAC5B,KAAA,EACE,cAAA,CAAe,UAAA,EAAY,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QACxC,SAAA,EAAW,KAAK,OAAA,CAAQ,EAAA;AAAA,QACxB,MAAA,EAAQ,KAAK,OAAA,CAAQ,MAAA;AAAA,QACrB,GAAA,EAAK,KAAK,OAAA,CAAQ,GAAA;AAAA,QAClB,QAAA,EAAU,KAAK,QAAA,IAAY,CAAA;AAAA,QAC3B,YAAY,IAAA,CAAK;AAAA,OACnB,CAAE,KAAK;AAAC,KACZ,GACA,IAAA;AAAA,IACJ,kBAAA,EAAoB,oBAAoB,MAAA,IAAU,CAAA;AAAA,IAClD,eAAA,EAAiB,kBAAA,EAAoB,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA,CAAE,IAAA,EAAK,IAAK,EAAC;AAAA,IACjE;AAAA,GACD,CAAA;AAGD,EAAA,IAAI,+BAAA,IAAmC,+BAAA,CAAgC,GAAA,KAAQ,QAAA,EAAU;AACvF,IAAA,OAAO,+BAAA,CAAgC,MAAA;AAAA,EACzC;AAGA,EAAA,MAAM,SACJ,cAAA,EAAgB,UAAA,EAAY,GAAA,CAAI,CAAC,MAAM,KAAA,KAAU;AAC/C,IAAA,MAAM,OAAA,GAAU,oBAAoB,IAAA,CAAK,CAACF,aAAYA,QAAAA,CAAQ,MAAA,KAAW,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAC5F,IAAA,MAAM,WAAW,OAAA,EAAS,QAAA;AAC1B,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,IAClC,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAW,CAAA,CAAE,GAAA,KAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,GACpD,MAAA;AACJ,IAAA,OAAA,CAAQ,GAAA,CAAI,wBAAA,EAA0B,OAAA,EAAS,OAAO,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,EAAA,EAAI,OAAA,EAAS,EAAA,GAAK,GAAA,GAAM,KAAA;AAAA,MACxB,SAAA,EAAW,MAAA,CAAO,OAAA,EAAS,EAAE,CAAA;AAAA,MAC7B,SAAA,EAAW,MAAA,CAAO,OAAA,EAAS,EAAE,CAAA;AAAA,MAC7B,IAAA,EAAO,OAAA,EAAiB,IAAA,IAAS,OAAA,EAAiB,KAAA,IAAS,EAAA;AAAA,MAC3D,QAAA,EAAU,CAAA;AAAA,MACV,WAAW,EAAC;AAAA,MACZ,IAAA,EAAM,SAAS,MAAA,IAAU,EAAA;AAAA,MACzB,OAAA;AAAA,MACA,WAAA,EAAa,CAAA;AAAA,MACb,gBAAgB,IAAIE,QAAA;AAAA,QAClB,OAAO,SAAS,KAAA,KAAU,QAAA,GAAW,SAAS,KAAA,EAAO,MAAA,IAAU,CAAA,GAAI,OAAA,EAAS,KAAA,IAAS;AAAA,QACrF,QAAA,EAAS;AAAA,MACX,SAAS,EAAC;AAAA,MACV,qBAAqB,EAAC;AAAA,MACtB,OAAA;AAAA,MACA,kBAAkB,IAAA,CAAK,UAAA;AAAA,MACvB,eAAA,EAAiB,MAAA;AAAA,MACjB,cAAA,EAAgB;AAAA,KAClB;AACA,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,SAAA,EAAW,CAAC,OAAA,EAAS;AAAA,KACvB;AAAA,EACF,CAAC,KAAK,EAAC;AAGT,EAAA,+BAAA,GAAkC;AAAA,IAChC,GAAA,EAAK,QAAA;AAAA,IACL;AAAA,GACF;AAEA,EAAA,OAAO,MAAA;AACT;AC9TO,IAAM,mBAAA,GAAsB,CACjC,IAAA,EACA,kBAAA,EACA,UACA,KAAA,KACuB;AACvB,EAAA,MAAM,IAAA,GAAOC,OAAAA,CAAQ,MAAM,QAAA,EAAU,IAAA,IAAQ,EAAC,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AACjE,EAAA,MAAM,iBAAA,GAAoBA,QAAQ,MAAO,CAAC,WAAW,IAAA,GAAO,KAAA,EAAQ,CAAC,QAAQ,CAAC,CAAA;AAC9E,EAAA,MAAM,SAAA,GAAoB,EAAA;AAC1B,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,UAAA,EAAW;AAGtC,EAAA,MAAM,iBAAA,GAAoB,OAGhB,IAAI,CAAA;AAGd,EAAA,MAAM,aAAA,GAAgBA,QAAQ,MAAM;AAClC,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC7B,MAAA,OAAO,uBAAA,CAAwB,OAAO,IAAI,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAA,EAAO,IAAI,CAAC,CAAA;AAGhB,EAAA,MAAM,EAAE,cAAA,EAAgB,QAAA,EAAS,GAAIA,QAAQ,MAAM;AAEjD,IAAA,KAAA,MAAW,YAAY,kBAAA,EAAoB;AACzC,MAAA,MAAM,EAAE,eAAA,GAAkB,EAAC,EAAG,aAAY,GAAI,QAAA;AAC9C,MAAA,MAAM,EAAE,gBAAA,EAAiB,GAAI,WAAA,IAAe,EAAC;AAG7C,MAAA,MAAM,gBAAA,GAAmB,SAAS,eAAA,EAAiB,IAAA,EAAgC,EAAE,CAAA;AAErF,MAAA,IAAI,oBAAoB,gBAAA,EAAkB;AAExC,QAAA,MAAM,eAAA,GAAkB,6BAAA;AAAA,UACtB,aAAA;AAAA,UACA,gBAAA,CAAiB,cAAc,YAAA,EAAc,GAAA,CAAI,CAAC,CAAA,KAAW,CAAA,CAAE,UAAU,CAAA,IAAK,EAAC;AAAA,UAC/E;AAAA,YACE,gBAAA,EAAkB,gBAAA,CAAiB,YAAA,EAAc,gBAAA,IAAoB,CAAA;AAAA,YACrE,eAAA,EACE,gBAAA,CAAiB,YAAA,EAAc,YAAA,EAAc,GAAA,CAAI,CAAC,CAAA,KAAW,CAAA,CAAE,UAAU,CAAA,IAAK,EAAC;AAAA,YACjF,iBAAA,EAAmB,gBAAA,CAAiB,YAAA,EAAc,iBAAA,IAAqB;AAAA;AACzE,SACF;AAGA,QAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,UAAA,OAAO,EAAE,cAAA,EAAgB,QAAA,EAAU,QAAA,EAAU,eAAA,EAAgB;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,cAAA,EAAgB,IAAA,EAAM,QAAA,EAAU,CAAA,EAAE;AAAA,EAC7C,GAAG,CAAC,kBAAA,EAAoB,aAAA,EAAe,IAAA,EAAM,SAAS,CAAC,CAAA;AAGvD,EAAA,MAAM,EAAE,cAAA,EAAgB,YAAA,EAAa,GAAIA,QAAQ,MAAM;AACrD,IAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,cAAA,CAAe,WAAA,EAAa,kBAAkB,YAAA,EAAc;AAClF,MAAA,OAAO,EAAE,cAAA,EAAgB,IAAA,EAAM,YAAA,EAAc,IAAA,EAAK;AAAA,IACpD;AAEA,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,WAAA,CAAY,gBAAA,CAAiB,YAAA;AAG9D,IAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,SAAS,CAAA,CACjC,KAAK,CAAC,CAAA,EAAQ,CAAA,KAAW,MAAA,CAAO,CAAA,CAAE,eAAe,IAAI,MAAA,CAAO,CAAA,CAAE,eAAe,CAAC,CAAA,CAC9E,IAAA,CAAK,CAAC,IAAA,KAAc,QAAA,IAAY,MAAA,CAAO,IAAA,CAAK,eAAe,CAAC,CAAA;AAG/D,IAAA,MAAM,QAAA,GAAW,UAAU,IAAA,CAAK,CAAC,SAAS,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,eAAe,CAAC,CAAA;AAEjF,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,OAAO,EAAE,cAAA,EAAgB,IAAA,EAAM,YAAA,EAAc,YAAY,IAAA,EAAK;AAAA,IAChE;AAGA,IAAA,MAAM,aAAA,GAA+B;AAAA,MACnC,IAAA,EAAM,cAAA;AAAA,MACN,UAAA,EAAY,cAAA,CAAe,WAAA,EACvB,GAAA,CAAI,CAAC,MAAA,KAAgB;AACrB,QAAA,MAAM,WAAA,GAAc,MAAA,EAAQ,YAAA,GAAe,CAAC,CAAA;AAC5C,QAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AACzB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS;AAAA,YACP,EAAA,EAAI,MAAA,CAAO,WAAA,CAAY,UAAU,CAAA;AAAA,YACjC,QAAQ,WAAA,CAAY,MAAA;AAAA,YACpB,KAAK,WAAA,CAAY;AAAA,WACnB;AAAA,UACA,QAAA,EAAU,QAAQ,QAAA,IAAY,CAAA;AAAA,UAC9B,UAAA,EAAY;AAAA,YACV;AAAA,cACE,GAAA,EAAK,sBAAA;AAAA,cACL,KAAA,EAAO,KAAK,SAAA,CAAU;AAAA,gBACpB,OAAA,EAAS,IAAA;AAAA,gBACT,SAAS,cAAA,CAAe,OAAA;AAAA,gBACxB,iBAAiB,cAAA,CAAe;AAAA,eACjC;AAAA;AACH;AACF,SACF;AAAA,MACF,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,IAAA,KAAqC,SAAS,IAAI;AAAA,KAC/D;AAEA,IAAA,OAAO,EAAE,cAAA,EAAgB,aAAA,EAAe,YAAA,EAAc,YAAY,IAAA,EAAK;AAAA,EACzE,CAAA,EAAG,CAAC,cAAA,EAAgB,QAAQ,CAAC,CAAA;AAE7B,EAAA,MAAM,WAAA,GAAcA,QAAQ,MAAM;AAChC,IAAA,MAAM,cAAc,kBAAA,CACjB,GAAA;AAAA,MAAI,CAAC,IAAA,KACJ,IAAA,CAAK,WAAA,EAAa,kBAAkB,YAAA,EAChC,GAAA;AAAA,QAAI,CAAC,CAAA,KACL,CAAA,CAAE,WAAA,CAAY,IAAI,CAAC,MAAA,KAAW,MAAA,CAAO,YAAA,CAAa,GAAA,CAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,MAAM,CAAC;AAAA,QAEnF,IAAA;AAAK,MAET,IAAA,EAAK;AACR,IAAA,OAAO,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,kBAAkB,CAAC,CAAA;AAGvB,EAAA,MAAM,WAAA,GAAcA,QAAQ,MAAM;AAChC,IAAA,IAAI,CAAC,WAAA,CAAY,MAAA,EAAQ,OAAO,KAAA;AAGhC,IAAA,IACE,iBAAA,CAAkB,OAAA,IAClB,IAAA,CAAK,SAAA,CAAU,iBAAA,CAAkB,OAAA,CAAQ,WAAW,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA,EACpF;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,EAAE,MAAM,kBAAA,EAAmB,GAAI,OAAO,WAAA,GAAc,WAAA,GAAc,MAAM,YAAY;AACxF,IAAA,MAAM,GAAA,GAAM,MAAM,oBAAA,CAAqB,MAAA,EAAQ;AAAA,MAC7C,OAAA,EAAS,WAAA;AAAA,MACT;AAAA,KACD,CAAA;AACD,IAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAM,EAAC;AAG3C,IAAA,iBAAA,CAAkB,OAAA,GAAU;AAAA,MAC1B,IAAA,EAAM,MAAA;AAAA,MACN,WAAA,EAAa,CAAC,GAAG,WAAW;AAAA,KAC9B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,CAAA;AAID,EAAA,MAAM,uBAAA,GAA0BA,QAAQ,MAAM;AAC5C,IAAA,IAAI,iBAAA,CAAkB,OAAA,IAAW,CAAC,WAAA,EAAa;AAC7C,MAAA,OAAO,iBAAA,CAAkB,QAAQ,IAAA,IAAQ,MAAA;AAAA,IAC3C;AACA,IAAA,OAAO,kBAAA;AAAA,EACT,CAAA,EAAG,CAAC,kBAAA,EAAoB,WAAW,CAAC,CAAA;AAEpC,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA,EAAW,iBAAA;AAAA,IACX,kBAAA,EAAoB;AAAA,GACtB;AACF;ACpJO,IAAM,wBAAwB,CAAC;AAAA,EACpC,QAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,MAAA,EAAQ,cAAA;AAAA,EACR;AACF,CAAA,KAMmC;AACjC,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,aAAA,KAAkB,UAAA,EAAW;AACrD,EAAA,MAAM,SAAS,cAAA,IAAkB,aAAA;AAGjC,EAAA,MAAM,CAAC,gBAAA,EAAkB,oBAAoB,CAAA,GAAI,SAAkB,KAAK,CAAA;AAGxE,EAAA,MAAM,iBAAA,GAAoBC,OAGhB,IAAI,CAAA;AAGd,EAAA,MAAM,aAAA,GAAgBD,QAAQ,MAAM;AAClC,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC7B,MAAA,OAAO,uBAAA,CAAwB,OAAO,IAAI,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAA,EAAO,IAAI,CAAC,CAAA;AAEhB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,WAAW,IAAA,EAAM;AACnB,MAAA,MAAM,iBAAA,GAAoBF,QAAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA;AACxD,MAAA,oBAAA,CAAqB,CAAC,CAAC,iBAAiB,CAAA;AAAA,IAC1C;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAKX,EAAA,MAAM,mBAAA,GAAsBE,QAAQ,MAAM;AACxC,IAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AACtB,IAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,IAAA,MAAM,WAAA,GAAcF,QAAAA,CAAQ,GAAA,CAAI,cAAc,KAAM,KAAA,EAAe,YAAA;AACnE,IAAA,IAAI,SAAS,sBAAA,IAA0B,CAAC,WAAA,EAAa,QAAA,CAAS,SAAS,sBAAsB,CAAA;AAC3F,MAAA,OAAO,KAAA;AACT,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAKb,EAAA,MAAM,CAAC,gBAAA,EAAkB,aAAa,CAAA,GAAIE,QAAQ,MAAwB;AACxE,IAAA,IAAIE,iBAAAA,GAAmB,CAAA;AACvB,IAAA,IAAIC,cAAAA,GAAgB,CAAA;AACpB,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAAD,iBAAAA,GAAmB,GAAA;AACnB,MAAAC,cAAAA,GAAgB,EAAA;AAAA,IAClB;AACA,IAAA,aAAA,EAAe,SAAA,EAAW,OAAA,CAAQ,CAAC,EAAE,kBAAgB,KAA8D;AACjH,MAAA,gBAAA,EAAkB,OAAA,CAAQ,CAAC,EAAE,GAAA,EAAK,OAAM,KAAsC;AAC5E,QAAA,IAAI,QAAQ,0BAAA,EAA4BD,iBAAAA,GAAmB,MAAA,CAAO,KAAK,CAAA,IAAK,CAAA;AAC5E,QAAA,IAAI,QAAQ,uBAAA,EAAyBC,cAAAA,GAAgB,MAAA,CAAO,KAAK,CAAA,IAAK,CAAA;AAAA,MACxE,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,OAAO,CAACD,mBAAkBC,cAAa,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,aAAA,EAAe,SAAA,EAAW,gBAAgB,CAAC,CAAA;AAE/C,EAAA,MAAM,WAAA,GAAcH,QAAQ,MAAoB;AAC9C,IAAA,IAAI,CAAC,mBAAA,EAAqB,OAAO,EAAC;AAClC,IAAA,OAAA,CAAQ,UAAU,WAAA,IAAe,EAAC,EAAG,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MAClD,UAAA,EAAY,IAAID,QAAAA,CAAQ,IAAA,CAAK,UAAU,CAAA,CACpC,KAAA,CAAM,IAAIA,QAAAA,CAAQ,aAAa,CAAC,CAAA,CAChC,SAAA,CAAU,IAAIA,QAAAA,CAAQ,gBAAgB,CAAC,CAAA,CACvC,OAAA,CAAQ,CAAA,EAAGA,QAAAA,CAAQ,UAAU,CAAA;AAAA,MAChC,gBAAA,EAAkB,IAAA,CAAK,gBAAA,IAAoB;AAAC,KAC9C,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,QAAA,EAAU,gBAAA,EAAkB,aAAa,CAAC,CAAA;AAE9C,EAAA,MAAM,WAAA,GAAcC,OAAAA;AAAA,IAClB;AAAA;AAAA,MAEE;AAAA,QACE,GAAG,IAAI,GAAA;AAAA,UACL,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,KAAM,EAAE,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,OAAO,OAAO;AAAA;AACpF;AACF,KAAA;AAAA,IACF,CAAC,WAAW;AAAA,GACd;AAGA,EAAA,MAAM,WAAA,GAAcA,QAAQ,MAAM;AAChC,IAAA,IAAI,CAAC,WAAA,CAAY,MAAA,EAAQ,OAAO,KAAA;AAGhC,IAAA,IACE,iBAAA,CAAkB,OAAA,IAClB,IAAA,CAAK,SAAA,CAAU,iBAAA,CAAkB,OAAA,CAAQ,WAAW,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA,EACpF;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,aAAA,GAAgBA,QAAQ,MAA4B;AACxD,IAAA,IAAI,CAAC,mBAAA,EAAqB,OAAO,EAAC;AAClC,IAAA,OAAA,CAAQ,eAAe,SAAA,IAAa,EAAC,EAAG,MAAA,CAAO,CAAC,IAAA,KAA6B;AAC3E,MAAA,MAAM,SAAA,GACJ,MAAM,WAAA,IACN,MAAA,CAAO,KAAK,WAAW,CAAA,GAAI,CAAA,IAC3B,IAAA,CAAK,gBAAA,EAAkB,KAAA;AAAA,QACrB,CAAC,IAAA,KAAyC,IAAA,CAAK,GAAA,KAAQ;AAAA,OACzD;AACF,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,IAAA;AAAA,QACzC,CAAC,GAAA,KACC,QAAA,EAAU,WAAA,EAAa,QAAA,CAAS,IAAI,IAAA,EAAM,CAAA,IAAK,IAAA,CAAK,OAAA,EAAS;AAAA,OACjE;AACA,MAAA,OAAO,SAAA,IAAa,cAAA;AAAA,IACtB,CAAC,CAAA;AAAA,EACH,GAAG,CAAC,aAAA,EAAe,SAAA,EAAW,mBAAA,EAAqB,SAAS,CAAC,CAAA;AAE7D,EAAA,MAAM,gBAAA,GAAmBA,QAAQ,MAAe;AAC9C,IAAA,IAAI,CAAC,mBAAA,EAAqB,OAAO,IAAID,SAAQ,CAAC,CAAA;AAC9C,IAAA,OAAO,aAAA,CAAc,MAAA,CAAO,CAAC,IAAA,EAAM,IAAA,KAAS;AAC1C,MAAA,MAAM,MAAA,GAAS,QAAA,EAAU,cAAA,GAAiB,IAAA,CAAK,cAAc,IAAA,CAAK,cAAA;AAClE,MAAA,OAAO,IAAIA,SAAQ,IAAI,CAAA,CAAE,KAAK,IAAIA,QAAAA,CAAQ,MAAA,IAAU,CAAC,CAAC,CAAA;AAAA,IACxD,CAAA,EAAG,IAAIA,QAAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,aAAA,EAAe,mBAAmB,CAAC,CAAA;AAEvC,EAAA,MAAM,CAAC,aAAA,EAAe,iBAAiB,CAAA,GAAIC,QAAQ,MAA8C;AAC/F,IAAA,IAAI,CAAC,mBAAA,EAAqB,OAAO,CAAC,MAAM,IAAI,CAAA;AAC5C,IAAA,MAAM,YAAA,GAAe,CAAC,GAAG,WAAW,CAAA,CAAE,IAAA;AAAA,MACpC,CAAC,GAAG,CAAA,KAAM,MAAA,CAAO,EAAE,UAAU,CAAA,GAAI,MAAA,CAAO,CAAA,CAAE,UAAU;AAAA,KACtD;AACA,IAAA,MAAM,aAAa,YAAA,CAAa,SAAA;AAAA,MAC9B,CAAC,KAAA,KAAU,gBAAA,CAAiB,GAAA,CAAI,IAAID,QAAAA,CAAQ,KAAA,CAAM,UAAU,CAAC,CAAA,IAAK,aAAA,CAAc,MAAA,GAAS;AAAA,KAC3F;AAEA,IAAA,IAAI,eAAe,EAAA,EAAI;AACrB,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,YAAA,CAAa,SAAS,CAAA,GAAK,YAAA,CAAa,aAAa,MAAA,GAAS,CAAC,KAAK,IAAA,GAAQ;AAAA,OAC9E;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,YAAA,CAAa,UAAU,CAAA,IAAK,IAAA;AACjD,IAAA,MAAM,YAAY,UAAA,GAAa,CAAA,GAAK,aAAa,UAAA,GAAa,CAAC,KAAK,IAAA,GAAQ,IAAA;AAC5E,IAAA,OAAO,CAAC,cAAc,SAAS,CAAA;AAAA,EACjC,GAAG,CAAC,WAAA,EAAa,gBAAA,EAAkB,aAAA,CAAc,MAAM,CAAC,CAAA;AAGxD,EAAA,MAAM,EAAE,MAAM,kBAAA,EAAmB,GAAIK,OAAO,WAAA,GAAc,WAAA,GAAc,MAAM,YAAY;AACxF,IAAA,MAAM,GAAA,GAAM,MAAMC,oBAAAA,CAAqB,MAAA,EAAQ;AAAA,MAC7C,OAAA,EAAS,WAAA;AAAA,MACT;AAAA,KACD,CAAA;AACD,IAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAM,EAAC;AAG3C,IAAA,iBAAA,CAAkB,OAAA,GAAU;AAAA,MAC1B,IAAA,EAAM,MAAA;AAAA,MACN,WAAA,EAAa,CAAC,GAAG,WAAW;AAAA,KAC9B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,CAAA;AAGD,EAAA,MAAM,uBAAA,GAA0BL,QAAQ,MAAM;AAC5C,IAAA,IAAI,iBAAA,CAAkB,OAAA,IAAW,CAAC,WAAA,EAAa;AAC7C,MAAA,OAAO,iBAAA,CAAkB,QAAQ,IAAA,IAAQ,MAAA;AAAA,IAC3C;AACA,IAAA,OAAO,kBAAA;AAAA,EACT,CAAA,EAAG,CAAC,kBAAA,EAAoB,WAAW,CAAC,CAAA;AAIpC,EAAA,MAAM,OAAA,GAAU,WAAA;AAAA,IACd,CAAC,GAAuB,CAAA,KAAkC;AACxD,MAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAqC;AAExD,QAAA,IACE,KAAK,gBAAA,EAAkB,IAAA;AAAA,UACrB,CAAC,SAAA,KAA8C,SAAA,CAAU,GAAA,KAAQ;AAAA,SACnE;AAEA,UAAA,OAAO,CAAA;AAET,QAAA,IAAI,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,CAAC,QAAgB,QAAA,EAAU,WAAA,EAAa,QAAA,CAAS,GAAG,CAAC,CAAA;AAChF,UAAA,OAAO,CAAA;AAET,QAAA,OAAO,CAAA;AAAA,MACT,CAAA;AAEA,MAAA,OAAO,WAAA,CAAY,CAAC,CAAA,GAAI,WAAA,CAAY,CAAC,CAAA;AAAA,IACvC,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,WAAA,EAAa,SAAS;AAAA,GACnC;AAEA,EAAA,OAAO;AAAA,IACL,aAAA;AAAA,IACA,OAAA;AAAA,IACA,iBAAA,EAAmB,cAAc,MAAA,GAAS,CAAA;AAAA,IAC1C,iBAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,kBAAA,EAAoB;AAAA,GACtB;AACF;ACxKA,IAAM,WAAA,GAAcM,cAAuC,IAAI,CAAA;AAwSxD,SAAS,cAAA,GAAmC;AACjD,EAAA,MAAM,OAAA,GAAUC,WAAW,WAAW,CAAA;AAEtC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AAEA,EAAA,OAAO,OAAA;AACT;;;ACjVO,SAAS,cACd,OAAA,EAMA;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,iBAAA,KAAsB,UAAA,EAAW;AACzD,EAAA,MAAM,EAAE,UAAA,EAAY,oBAAA,EAAqB,GAAI,cAAA,EAAe;AAE5D,EAAA,MAAM,aAAA,GAAgBC,WAAAA;AAAA,IACpB,OAAO,IAAA,EAAc,EAAE,GAAA,EAAI,KAAgC;AACzD,MAAA,IAAI,OAAA,GAAU,MAAM,UAAA,CAAW,MAAA,EAAQ;AAAA,QACrC,GAAG,GAAA;AAAA,QACH,oBAAA;AAAA,QACA,aAAA,EAAe;AAAA,OAChB,CAAA;AAED,MAAA,IAAI,OAAA,EAAS;AAEX,QAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,aAAA,CAC/B,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,IAAA,CAAK,UAAU,CAAA,CACjC,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,IAAI,CAAA;AAE1B,QAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAChC,UAAA,OAAA,GAAU,MAAM,gBAAgB,MAAA,EAAQ;AAAA,YACtC,QAAQ,OAAA,CAAQ,EAAA;AAAA,YAChB,aAAA,EAAe,OAAA,CAAQ,aAAA,CACpB,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,UAAU,CAAA,CAChC,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,IAAI,CAAA;AAAA,YAC1B,oBAAA;AAAA,YACA,aAAA,EAAe;AAAA,WAChB,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,UAAA,CAAW,OAAO,CAAA;AAAA,MACpB;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,MAAA,EAAQ,iBAAA,EAAmB,YAAY,oBAAoB;AAAA,GACtE;AAEA,EAAA,OAAO,cAAA,CAAe,aAAA,EAAe,aAAA,EAAe,OAAO,CAAA;AAC7D;AC9DO,SAAS,gBACd,OAAA,EAMA;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,iBAAA,KAAsB,UAAA,EAAW;AACzD,EAAA,MAAM,EAAE,UAAA,EAAY,oBAAA,EAAqB,GAAI,cAAA,EAAe;AAE5D,EAAA,MAAM,QAAA,GAAWA,WAAAA;AAAA,IACf,OAAO,IAAA,EAAc,EAAE,GAAA,EAAI,KAAkC;AAC3D,MAAA,IAAI,WAAA,GAAc,MAAM,YAAA,CAAa,MAAA,EAAQ;AAAA,QAC3C,GAAG,GAAA;AAAA,QACH,oBAAA;AAAA,QACA,aAAA,EAAe;AAAA,OAChB,CAAA;AAED,MAAA,IAAI,WAAA,EAAa;AAEf,QAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,aAAA,CACnC,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,IAAA,CAAK,UAAU,CAAA,CACjC,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,IAAI,CAAA;AAE1B,QAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAChC,UAAA,WAAA,GAAc,MAAMC,gBAAgB,MAAA,EAAQ;AAAA,YAC1C,QAAQ,WAAA,CAAY,EAAA;AAAA,YACpB,aAAA,EAAe,WAAA,CAAY,aAAA,CACxB,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,UAAU,CAAA,CAChC,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,IAAI,CAAA;AAAA,YAC1B,oBAAA;AAAA,YACA,aAAA,EAAe;AAAA,WAChB,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,UAAA,CAAW,WAAW,CAAA;AAAA,MACxB;AACA,MAAA,OAAO,WAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,MAAA,EAAQ,iBAAA,EAAmB,YAAY,oBAAoB;AAAA,GACtE;AAEA,EAAA,OAAOC,cAAAA,CAAe,gBAAA,EAAkB,QAAA,EAAU,OAAO,CAAA;AAC3D;ACtEO,IAAM,OAAA,GAAU,CAAC,IAAA,KAAc;AACpC,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,SAAA,GAAY,MAAA,EAAQ,SAAA,IAAa,EAAC;AACzC,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AACpC,IAAA;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,EAAE,gBAAA,EAAkB,MAAM,CAAA;AAClD,IAAA,MAAA,EAAQ,SAAA,EAAW,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAA;AAAA,EACpC,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,sBAAsB,KAAK,CAAA;AAAA,EAC3C;AACF,CAAA;AAKO,IAAM,mBAAmB,CAAC;AAAA,EAC/B,YAAY,EAAC;AAAA,EACb,YAAY;AACd,CAAA,KAGM;AACJ,EAAA,IAAI,CAAC,SAAA,CAAU,MAAA,IAAU,CAAC,SAAA,CAAU,CAAC,GAAG,OAAA,EAAS;AAC/C,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,SAAA,CAAU,CAAC,CAAA;AAC/B,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAO,YAAA;AAE7C,EAAA,MAAM,aAAa,SAAA,EACf,MAAA;AAAA,IACA,CAAC,IAAA,EAAM,EAAE,OAAA,EAAAC,QAAAA,OACP,IAAA,CAAK,IAAA;AAAA,MACHA,QAAAA,EAAS,YAAY,MAAA,IACnBA,QAAAA,EAAS,gBAAgB,MAAA,IACzBA,QAAAA,EAAS,OAAO,MAAA,IAChB;AAAA,KACJ;AAAA,IACF,IAAIZ,SAAQ,CAAC;AAAA,IAEd,QAAA,EAAS;AACZ,EAAA,OAAA,CAAQ;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,UAAA,EAAY,aAAA;AAAA,IACZ,gBAAA,EAAkB;AAAA,MAChB,YAAY,SAAA,EAAW,SAAA;AAAA,MACvB,QAAA,EAAU,YAAA;AAAA,MACV,KAAA,EAAO,UAAA;AAAA,MACP,QAAA,EAAU,WAAW,QAAA,IAAY,EAAA;AAAA,MACjC,KAAA,EAAO,UAAU,GAAA,CAAI,CAAC,EAAE,OAAA,EAAAY,QAAAA,EAAS,UAAS,MAAO;AAAA,QAC/C,SAASA,QAAAA,EAAS,GAAA;AAAA,QAClB,SAAA,EAAWA,QAAAA,EAAS,OAAA,EAAS,KAAA,IAASA,UAAS,OAAA,EAAS,KAAA;AAAA,QACxD,UAAA,EAAY,WAAW,KAAA,IAAS,EAAA;AAAA,QAChC,aAAA,EAAeA,QAAAA,EAAS,OAAA,EAAS,WAAA,IAAe,EAAA;AAAA,QAChD,YAAA,EAAcA,QAAAA,EAAS,KAAA,IAASA,QAAAA,EAAS,KAAA;AAAA,QACzC,KAAA,EAAOA,QAAAA,EAAS,cAAA,EAAgB,MAAA,IAAUA,UAAS,KAAA,EAAO,MAAA;AAAA,QAC1D,UAAU,QAAA,IAAY;AAAA,OACxB,CAAE,CAAA;AAAA,MACF,GAAG,SAAA,EAAW;AAAA;AAChB,GACD,CAAA;AACH,CAAA;AAyDO,IAAM,gBAAgB,CAAC;AAAA,EAC5B,YAAY,EAAC;AAAA,EACb,YAAY;AACd,CAAA,KAGM;AACJ,EAAA,IAAI,CAAC,SAAA,CAAU,MAAA,IAAU,CAAC,SAAA,CAAU,CAAC,GAAG,OAAA,EAAS;AAC/C,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,SAAA,CAAU,CAAC,CAAA;AAC/B,EAAA,MAAM,YAAA,GAAe,QAAQ,KAAA,EAAO,YAAA;AACpC,EAAA,MAAM,aAAa,SAAA,EACf,MAAA;AAAA,IACA,CAAC,IAAA,EAAM,EAAE,OAAA,EAAAA,QAAAA,OACP,IAAA,CAAK,IAAA;AAAA,MACHA,QAAAA,EAAS,YAAY,MAAA,IACnBA,QAAAA,EAAS,gBAAgB,MAAA,KACxBA,QAAAA,EAAS,OAAO,MAAA,IAAU,CAAA;AAAA,KAC/B;AAAA,IACF,IAAIZ,SAAQ,CAAC;AAAA,IAEd,QAAA,EAAS;AAEZ,EAAA,OAAA,CAAQ;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,UAAA,EAAY,gBAAA;AAAA,IACZ,gBAAA,EAAkB;AAAA,MAChB,YAAY,SAAA,EAAW,SAAA;AAAA,MACvB,UAAU,SAAA,EAAW,QAAA;AAAA,MACrB,QAAA,EAAU,YAAA;AAAA,MACV,KAAA,EAAO,UAAA;AAAA,MACP,KAAA,EAAO,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QAC9B,OAAA,EAAS,KAAK,OAAA,EAAS,GAAA;AAAA,QACvB,WAAW,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,KAAA,IAAS,KAAK,OAAA,EAAS,KAAA;AAAA,QACzD,UAAA,EAAY,WAAW,KAAA,IAAS,EAAA;AAAA,QAChC,aAAA,EAAe,IAAA,CAAK,OAAA,EAAS,OAAA,EAAS,WAAA,IAAe,EAAA;AAAA,QACrD,YAAA,EAAc,KAAK,OAAA,EAAS,KAAA;AAAA,QAC5B,OAAO,IAAA,CAAK,OAAA,EAAS,gBAAgB,MAAA,IAAU,IAAA,CAAK,SAAS,KAAA,EAAO,MAAA;AAAA,QACpE,QAAA,EAAU,KAAK,QAAA,IAAY;AAAA,OAC7B,CAAE,CAAA;AAAA,MACF,GAAG,SAAA,EAAW;AAAA;AAChB,GACD,CAAA;AACH,CAAA;;;AC3KO,IAAM,oBAAoB,CAAC,EAAE,SAAA,GAAY,IAAG,KAA0C;AAC3F,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,GAAA,EAAK;AAChD,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,CAAU,MAAA,IAAU,SAAA,CAAU,CAAC,GAAG,OAAA,EAAS;AAC7C,IAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAS,GAAI,UAAU,CAAC,CAAA;AAEzC,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,GAAA,CAAI,SAAS,WAAA,EAAa;AAAA,QAC/B,KAAA,EAAO,SAAS,cAAA,EAAgB,MAAA,KAAW,SAAS,KAAA,EAAO,MAAA,IAAU,SAAS,KAAA,IAAS,CAAA,CAAA;AAAA,QACvF,SAAA,EAAW,QAAA;AAAA,QACX,QAAA,EAAU,SAAS,KAAA,EAAO,YAAA;AAAA,QAC1B,YAAA,EAAc,SAAS,OAAA,EAAS,KAAA;AAAA,QAChC,YAAA,EAAc,eAAA;AAAA,QACd,WAAA,EAAa,MAAA,CAAO,OAAA,EAAS,EAAE,CAAA;AAAA,QAC/B,gBAAA,EAAkB,OAAA,EAAS,OAAA,EAAS,UAAA,EAAY,QAAQ,WAAA,IAAe;AAAA,OACxE,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,KAAK,CAAA;AAAA,IAC5C;AAAA,EACF;AACF,CAAA;AAmBO,IAAM,cAAA,GAAiB,CAAC,EAAE,WAAA,EAAY,KAA2C;AACtF,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA;AAAA,EACF;AAEA,EAAA,IAAI;AAEF,IAAA,IAAI,WAAA,EAAa,cAAA,IAAkB,MAAA,CAAO,GAAA,EAAK;AAC7C,MAAA,MAAA,CAAO,GAAA,CAAI,aAAA,EAAe,WAAA,CAAY,cAAc,CAAA;AAAA,IACtD;AAGA,IAAA,IAAI,WAAA,EAAa,eAAA,IAAmB,WAAA,EAAa,MAAA,IAAU,OAAO,IAAA,EAAM;AACtE,MAAA,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,WAAA,CAAY,oBAAA,IAAwB,YAAA,EAAc;AAAA,QACrE,SAAS,CAAA,EAAG,WAAA,CAAY,MAAM,CAAA,CAAA,EAAI,YAAY,eAAe,CAAA;AAAA,OAC9D,CAAA;AAAA,IACH;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAAA,EAChD;AACF,CAAA;ACzCO,SAAS,kBACd,OAAA,EAMA;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,iBAAA,KAAsB,UAAA,EAAW;AACzD,EAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAM,oBAAA,KAAyB,cAAA,EAAe;AAElE,EAAA,MAAM,UAAA,GAAaS,WAAAA;AAAA,IACjB,OAAO,IAAA,EAAc,EAAE,GAAA,EAAI,KAAoC;AAC7D,MAAA,MAAM,EAAE,MAAA,EAAQ,cAAA,EAAgB,aAAA,EAAe,sBAAqB,GAAI,GAAA;AAExE,MAAA,IAAI,CAAC,eAAe,MAAA,EAAQ;AAC1B,QAAA,MAAM,IAAI,MAAM,0DAA0D,CAAA;AAAA,MAC5E;AAEA,MAAA,MAAM,MAAA,GAAS,cAAA,GAAiB,MAAA,GAAY,cAAA,IAAkB,IAAA,EAAM,EAAA;AAEpE,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,MAAM,WAAA,GAAc,MAAMC,eAAAA,CAAgB,MAAA,EAAQ;AAAA,QAChD,MAAA;AAAA,QACA,aAAA,EAAe,uBACX,aAAA,GACA;AAAA,UACE,GAAG,aAAA;AAAA,UACH,GAAI,IAAA,EAAM,aAAA,EAAe,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,UAAU,CAAA,CAAE,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,KAChF;AAAC,SACL;AAAA,QACJ,aAAA,EAAe,iBAAA;AAAA,QACf;AAAA,OACD,CAAA;AAED,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,UAAA,CAAW,WAAW,CAAA;AAAA,MACxB;AACA,MAAA,OAAO,WAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,MAAA,EAAQ,iBAAA,EAAmB,YAAY,IAAI;AAAA,GACtD;AAEA,EAAA,OAAOC,cAAAA,CAAe,aAAA,EAAe,UAAA,EAAY,OAAO,CAAA;AAC1D;ACvDO,SAAS,mBACd,OAAA,EAMA;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,iBAAA,KAAsB,UAAA,EAAW;AACzD,EAAA,MAAM,EAAE,UAAA,EAAY,IAAA,EAAM,oBAAA,KAAyB,cAAA,EAAe;AAElE,EAAA,MAAM,WAAA,GAAcF,WAAAA;AAAA,IAClB,OAAO,IAAA,EAAc,EAAE,GAAA,EAAI,KAAqC;AAC9D,MAAA,MAAM,EAAE,MAAA,EAAQ,cAAA,EAAgB,aAAA,EAAc,GAAI,GAAA;AAElD,MAAA,MAAM,MAAA,GAAS,cAAA,GAAiB,MAAA,GAAY,cAAA,IAAkB,IAAA,EAAM,EAAA;AAEpE,MAAA,MAAM,KAAA,GAAQ,IAAA,EAAM,aAAA,EAAe,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,CAAC,IAAA,CAAK,UAAU,CAAA,IAAK,EAAC;AAG3E,MAAA,MAAM,SAAA,GAAY,MACf,MAAA,CAAO,CAAC,SAAU,aAAA,EAAe,MAAA,GAAS,CAAC,aAAA,CAAc,QAAA,CAAS,KAAK,IAAI,CAAA,GAAI,KAAK,IAAK,CAAA,CACzF,IAAI,CAAC,IAAA,KAAS,KAAK,IAAI,CAAA;AAE1B,MAAA,MAAM,WAAA,GAAc,MAAMC,eAAAA,CAAgB,MAAA,EAAQ;AAAA,QAChD,MAAA;AAAA,QACA,aAAA,EAAe,SAAA;AAAA,QACf,oBAAA;AAAA,QACA,aAAA,EAAe;AAAA,OAChB,CAAA;AAED,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,UAAA,CAAW,WAAW,CAAA;AAAA,MACxB;AACA,MAAA,OAAO,WAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,MAAA,EAAQ,iBAAA,EAAmB,YAAY,IAAI;AAAA,GACtD;AAEA,EAAA,OAAOC,cAAAA,CAAe,cAAA,EAAgB,WAAA,EAAa,OAAO,CAAA;AAC5D;;;AC2BO,SAAS,aACd,EAAE,SAAA,GAAY,MAAK,GAAyB,IAC5C,UAAA,EACA;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAQ,iBAAA,EAAmB,WAAA,KAAgB,UAAA,EAAW;AAC9E,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,cAAA,EAAe;AAChC,EAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,iBAAA,EAAkB;AACtD,EAAA,MAAM,EAAE,OAAA,EAAS,kBAAA,EAAmB,GAAI,kBAAA,EAAmB;AAC3D,EAAA,MAAM,EAAE,OAAA,EAASE,aAAAA,EAAa,GAAI,eAAA,EAAgB;AAElD,EAAA,MAAM,SAAA,GAAYJ,WAAAA;AAAA,IAChB,OAAO,IAAA,EAAc,EAAE,GAAA,EAAI,KAA+B;AACxD,MAAA,MAAM;AAAA,QACJ,SAAA;AAAA,QACA,MAAA,EAAQ,cAAA;AAAA,QACR,aAAA;AAAA,QACA,YAAY,EAAC;AAAA,QACb,aAAA;AAAA,QACA,cAAA,GAAiB,KAAA;AAAA,QACjB,cAAA;AAAA,QACA;AAAA,OACF,GAAI,GAAA;AAEJ,MAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACxC,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,KAAA,GAAyB,SAAA,CAC5B,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QACd,aAAA,EAAe,IAAA,CAAK,OAAA,EAAS,EAAA,IAAM,EAAA;AAAA,QACnC,QAAA,EAAU,KAAK,QAAA,IAAY,CAAA;AAAA,QAC3B,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,eAAe,IAAA,CAAK;AAAA,OACtB,CAAE,EACD,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,aAAA,IAAiB,KAAK,QAAQ,CAAA;AAEvD,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,MAAA,GAAS,cAAA,GAAiB,MAAA,GAAY,cAAA,IAAkB,IAAA,EAAM,EAAA;AAGpE,MAAA,IAAI,UAAA,GAAa,MAAMI,aAAAA,CAAa;AAAA,QAClC,MAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,+BAA+B,UAAU,CAAA;AAGrD,MAAA,IAAI,UAAA,CAAW,aAAA,IAAiB,UAAA,CAAW,aAAA,CAAc,SAAS,CAAA,EAAG;AACnE,QAAA,MAAM,iBAAA,GAAoB,UAAA,CAAW,aAAA,CAClC,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,IAAA,CAAK,UAAU,CAAA,CACjC,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,IAAI,CAAA;AAE1B,QAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAEhC,UAAA,IAAI,cAAA,EAAgB;AAClB,YAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,UAAA,EAAY,iBAAiB,CAAA;AACtE,YAAA,IAAI,WAAA,EAAa;AACf,cAAA,UAAA,GAAa,WAAA;AAAA,YACf;AAAA,UACF,CAAA,MAAO;AACL,YAAA,MAAM,kBAAA,CAAmB;AAAA,cACvB,aAAA,EAAe;AAAA,aAChB,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,aAAA,IAAiB,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AAC7C,QAAA,cAAA,CAAe;AAAA,UACb,oBAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,SAAA,EAAW;AAEb,QAAA,gBAAA,CAAiB;AAAA,UACf,SAAA;AAAA,UACA,WAAW,EAAE,GAAG,WAAW,KAAA,EAAO,MAAA,CAAO,UAAS;AAAE,SACrD,CAAA;AAGD,QAAA,iBAAA,CAAkB,EAAE,WAAW,CAAA;AAAA,MACjC;AAEA,MAAA,OAAO,UAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,MAAA,EAAQ,iBAAA,EAAmB,WAAA,EAAa,MAAM,SAAS;AAAA,GAClE;AAEA,EAAA,OAAOF,cAAAA,CAAe,aAAA,EAAe,SAAA,EAAW,UAAU,CAAA;AAC5D;AChLO,SAAS,mBACd,OAAA,EAMA;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,iBAAA,KAAsB,UAAA,EAAW;AACzD,EAAA,MAAM,EAAE,UAAA,EAAY,oBAAA,EAAqB,GAAI,cAAA,EAAe;AAE5D,EAAA,MAAM,WAAA,GAAcF,WAAAA;AAAA,IAClB,OAAO,IAAA,EAAc,EAAE,GAAA,EAAI,KAAuC;AAChE,MAAA,MAAM,WAAA,GAAc,MAAM,eAAA,CAAgB,MAAA,EAAQ;AAAA,QAChD,GAAG,GAAA;AAAA,QACH,oBAAA;AAAA,QACA,aAAA,EAAe;AAAA,OAChB,CAAA;AAED,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,UAAA,CAAW,WAAW,CAAA;AAAA,MACxB;AACA,MAAA,OAAO,WAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,MAAA,EAAQ,iBAAA,EAAmB,UAAU;AAAA,GAChD;AAEA,EAAA,OAAOE,cAAAA,CAAe,mBAAA,EAAqB,WAAA,EAAa,OAAO,CAAA;AACjE;ACfO,SAAS,mBACd,OAAA,EAMA;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,iBAAA,KAAsB,UAAA,EAAW;AACzD,EAAA,MAAM,EAAE,UAAA,EAAY,oBAAA,EAAqB,GAAI,cAAA,EAAe;AAE5D,EAAA,MAAM,WAAA,GAAcF,WAAAA;AAAA,IAClB,OAAO,IAAA,EAAc,EAAE,GAAA,EAAI,KAAqC;AAC9D,MAAA,MAAM,EAAE,sBAAA,GAAyB,IAAA,EAAM,cAAA,EAAgB,MAAA,EAAQ,SAAQ,GAAI,GAAA;AAE3E,MAAA,IAAI,WAAA,GAAc,MAAM,eAAA,CAAgB,MAAA,EAAQ;AAAA,QAC9C,MAAA;AAAA,QACA,OAAA;AAAA,QACA,oBAAA;AAAA,QACA,aAAA,EAAe;AAAA,OAChB,CAAA;AAED,MAAA,IAAI,eAAe,sBAAA,EAAwB;AAEzC,QAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,aAAA,CACnC,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,IAAA,CAAK,UAAU,CAAA,CACjC,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,IAAI,CAAA;AAE1B,QAAA,IAAI,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAEhC,UAAA,IAAI,cAAA,EAAgB;AAClB,YAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,WAAA,EAAa,iBAAiB,CAAA;AACvE,YAAA,IAAI,WAAA,EAAa;AACf,cAAA,WAAA,GAAc,WAAA;AAAA,YAChB;AAAA,UACF,CAAA,MAAO;AAEL,YAAA,WAAA,GACG,MAAMC,gBAAgB,MAAA,EAAQ;AAAA,cAC7B,QAAQ,WAAA,CAAY,EAAA;AAAA,cACpB,aAAA,EAAe,WAAA,CAAY,aAAA,CACxB,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,UAAU,CAAA,CAChC,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,IAAI,CAAA;AAAA,cAC1B,oBAAA;AAAA,cACA,aAAA,EAAe;AAAA,aAChB,CAAA,IAAM,WAAA;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,UAAA,CAAW,WAAW,CAAA;AAAA,MACxB;AACA,MAAA,OAAO,WAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,MAAA,EAAQ,iBAAA,EAAmB,UAAU;AAAA,GAChD;AAEA,EAAA,OAAOC,cAAAA,CAAe,mBAAA,EAAqB,WAAA,EAAa,OAAO,CAAA;AACjE;AC9DO,SAAS,uBAAA,CACd,MAAA,EACA,oBAAA,EAIA,OAAA,EAMA;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,iBAAA,KAAsB,UAAA,EAAW;AAEzD,EAAA,MAAM,gBAAA,GAAmBF,WAAAA;AAAA,IACvB,OAAO,IAAA,EAAc,EAAE,GAAA,EAAI,KAA0C;AACnE,MAAA,MAAM,WAAA,GAAc,MAAM,oBAAA,CAAqB,MAAA,EAAQ;AAAA,QACrD,GAAG,GAAA;AAAA,QACH,oBAAA;AAAA,QACA,aAAA,EAAe;AAAA,OAChB,CAAA;AAED,MAAA,OAAA,CAAQ,GAAA,CAAI,uCAAuC,WAAW,CAAA;AAC9D,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAA,CAAO,WAAW,CAAA;AAAA,MACpB;AACA,MAAA,OAAO,WAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,MAAA,EAAQ,iBAAA,EAAmB,MAAM;AAAA,GAC5C;AAEA,EAAA,OAAOE,cAAAA,CAAe,wBAAA,EAA0B,gBAAA,EAAkB,OAAO,CAAA;AAC3E;ACeO,SAAS,UACd,EAAE,SAAA,GAAY,MAAK,GAAsB,IACzC,UAAA,EACA;AACA,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAQ,iBAAA,EAAmB,WAAA,KAAgB,UAAA,EAAW;AAE9E,EAAA,MAAM,UAAA,GAAa,aAAa,UAAA,IAAc,KAAA;AAE9C,EAAA,MAAM,MAAA,GAASF,WAAAA;AAAA,IACb,OAAO,IAAA,EAAc,EAAE,GAAA,EAAI,KAA4B;AACrD,MAAA,MAAM;AAAA,QACJ,SAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAY,EAAC;AAAA,QACb,aAAA;AAAA,QACA,cAAA;AAAA,QACA,gBAAA;AAAA,QACA,oBAAA;AAAA,QACA;AAAA,OACF,GAAI,GAAA;AAEJ,MAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACxC,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,KAAA,GAAyB,SAAA,CAC5B,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QACd,aAAA,EAAe,IAAA,CAAK,OAAA,EAAS,EAAA,IAAM,EAAA;AAAA,QACnC,QAAA,EAAU,KAAK,QAAA,IAAY,CAAA;AAAA,QAC3B,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,eAAe,IAAA,CAAK;AAAA,OACtB,CAAE,EACD,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,aAAA,IAAiB,KAAK,QAAQ,CAAA;AAEvD,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,UAAA,GAAa,MAAMK,UAAAA,CAAW,MAAA,EAAQ;AAAA,QAC1C,KAAA;AAAA,QACA,oBAAA;AAAA,QACA,aAAA,EAAe,iBAAA;AAAA,QACf,aAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,MACrD;AAGA,MAAA,IAAI,SAAA,IAAa,WAAW,SAAA,EAAW;AAErC,QAAA,aAAA,CAAc;AAAA,UACZ,SAAA;AAAA,UACA,WAAW,EAAE,GAAG,WAAW,KAAA,EAAO,MAAA,CAAO,UAAS;AAAE,SACrD,CAAA;AAGD,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,cAAA,CAAe,EAAE,WAAA,EAAa,cAAA,EAAgB,CAAA;AAAA,QAChD;AAAA,MACF;AAGA,MAAA,IAAI,kBAAA,EAAoB;AACtB,QAAA,IAAI,WAAW,GAAA,EAAK;AAClB,UAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,YAAA,MAAA,CAAO,QAAA,CAAS,OAAO,UAAA,CAAW,GAAA;AAAA,UACpC;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,QAC9C;AAAA,MACF;AAEA,MAAA,OAAO,UAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,MAAA,EAAQ,UAAA,EAAY,mBAAmB,SAAS;AAAA,GAC3D;AAEA,EAAA,OAAOH,cAAAA,CAAe,SAAA,EAAW,MAAA,EAAQ,UAAU,CAAA;AACrD;AC7FO,SAAS,qBAAA,CAAsB;AAAA,EACpC,KAAA;AAAA,EACA,QAAA;AAAA,EACA,iBAAA,GAAoB;AACtB,CAAA,EAA8D;AAC5D,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,UAAA,EAAW;AAC9B,EAAA,MAAM,EAAE,IAAA,EAAM,kBAAA,EAAoB,mBAAA,KAAwB,cAAA,EAAe;AAGzE,EAAA,MAAM,eAAe,mBAAA,CAAoB,IAAA,EAAM,sBAAsB,EAAC,EAAG,UAAU,KAAK,CAAA;AAGxF,EAAA,MAAM,aAAa,qBAAA,CAAsB;AAAA,IACvC,UAAU,mBAAA,IAAuB,IAAA;AAAA,IACjC,SAAA,EAAW,iBAAA;AAAA,IACX,IAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,YAAA,GAAeV,QAAQ,MAAuB;AAClD,IAAA,MAAM,iBAAA,GAAoB,YAAA,CAAa,cAAA,EAAgB,UAAA,IAAc,EAAC;AAGtE,IAAA,MAAM,eAAA,GAAmC,WAAW,aAAA,GAChD,UAAA,CAAW,cAAc,gBAAA,CACtB,GAAA,CAAI,CAAC,OAAA,KAAY;AAChB,MAAA,MAAM,WAAA,GAAc,WAAW,kBAAA,EAAoB,IAAA;AAAA,QACjD,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,OAAA,CAAQ;AAAA,OAC9B;AACA,MAAA,MAAM,OAAA,GAAU,WAAA,EAAa,QAAA,GAAW,CAAC,CAAA;AAEzC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP,EAAA,EAAI,SAAS,EAAA,IAAM,EAAA;AAAA,UACnB,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,KAAK,OAAA,CAAQ;AAAA,SACf;AAAA,QACA,QAAA,EAAU,CAAA;AAAA,QACV,UAAA,EAAY;AAAA,UACV;AAAA,YACE,GAAA,EAAK,iBAAA;AAAA,YACL,KAAA,EAAO;AAAA;AACT;AACF,OACF;AAAA,IACF,CAAC,EACA,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAA,GACnC,EAAC;AAEL,IAAA,OAAO,CAAC,GAAG,iBAAA,EAAmB,GAAG,eAAe,CAAA;AAAA,EAClD,CAAA,EAAG;AAAA,IACD,YAAA,CAAa,cAAA;AAAA,IACb,UAAA,CAAW,aAAA;AAAA,IACX,UAAA,CAAW,kBAAA;AAAA,IACX;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,QAAA,GAAWA,QAAQ,MAAM;AAC7B,IAAA,OAAO,aAAa,MAAA,GAAS,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC7IO,IAAK,iBAAA,qBAAAc,kBAAAA,KAAL;AACL,EAAAA,kBAAAA,CAAAA,kBAAAA,CAAA,gBAAa,CAAA,CAAA,GAAb,YAAA;AACA,EAAAA,kBAAAA,CAAAA,kBAAAA,CAAA,kBAAe,CAAA,CAAA,GAAf,cAAA;AACA,EAAAA,kBAAAA,CAAAA,kBAAAA,CAAA,kBAAe,CAAA,CAAA,GAAf,cAAA;AAHU,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;AAML,IAAK,kBAAA,qBAAAC,mBAAAA,KAAL;AACL,EAAAA,mBAAAA,CAAAA,mBAAAA,CAAA,kBAAe,CAAA,CAAA,GAAf,cAAA;AACA,EAAAA,mBAAAA,CAAAA,mBAAAA,CAAA,0BAAuB,CAAA,CAAA,GAAvB,sBAAA;AAFU,EAAA,OAAAA,mBAAAA;AAAA,CAAA,EAAA,kBAAA,IAAA,EAAA;;;ACqBL,IAAM,oBAAA,GAAuB,CAClC,IAAA,EACA,mBAAA,EACA,QAAA,KACwB;AACxB,EAAA,MAAM,IAAA,GAAOf,OAAAA,CAAQ,MAAM,QAAA,EAAU,IAAA,IAAQ,EAAC,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AACjE,EAAA,MAAM,iBAAA,GAAoBA,QAAQ,MAAO,CAAC,WAAW,IAAA,GAAO,KAAA,EAAQ,CAAC,QAAQ,CAAC,CAAA;AAC9E,EAAA,MAAM,SAAA,GAAoB,EAAA;AAG1B,EAAA,MAAM,EAAE,cAAA,EAAgB,QAAA,EAAS,GAAIA,QAAQ,MAAM;AAEjD,IAAA,KAAA,MAAW,YAAY,mBAAA,EAAqB;AAC1C,MAAA,MAAM,EAAE,eAAA,GAAkB,EAAC,EAAG,eAAc,GAAI,QAAA;AAChD,MAAA,MAAM,EAAE,YAAA,EAAc,mBAAA,EAAoB,GAAI,iBAAiB,EAAC;AAGhE,MAAA,MAAM,gBAAA,GAAmB,SAAS,eAAA,EAAiB,IAAA,EAAgC,EAAE,CAAA;AAErF,MAAA,IAAI,gBAAA,IAAoB,gBAAgB,mBAAA,EAAqB;AAE3D,QAAA,MAAM,eAAA,GAAkB,6BAAA;AAAA,UACtB,IAAA;AAAA,UACA,YAAA,EAAc,cAAc,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,UAAU,KAAK,EAAC;AAAA,UACzD;AAAA,YACE,gBAAA,EACE,mBAAA,CAAoB,UAAA,KAAA,CAAA,8BAAyD,CAAA,GAAI,CAAA;AAAA;AAAA,YACnF,eAAA,EAAiB,cAAc,YAAA,EAAc,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAA,IAAK,EAAC;AAAA,YAC1E,iBAAA,EAAmB,cAAc,iBAAA,IAAqB;AAAA;AACxD,SACF;AAGA,QAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,UAAA,OAAO,EAAE,cAAA,EAAgB,QAAA,EAAU,QAAA,EAAU,eAAA,EAAgB;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,cAAA,EAAgB,IAAA,EAAM,QAAA,EAAU,CAAA,EAAE;AAAA,EAC7C,GAAG,CAAC,mBAAA,EAAqB,IAAA,EAAM,IAAA,EAAM,SAAS,CAAC,CAAA;AAG/C,EAAA,MAAM,EAAE,kBAAA,EAAoB,YAAA,EAAc,cAAA,EAAe,GAAIA,QAAQ,MAAM;AACzE,IAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,cAAA,CAAe,aAAA,EAAe,qBAAqB,gBAAA,EAAkB;AAC3F,MAAA,OAAO;AAAA,QACL,kBAAA,EAAoB,IAAA;AAAA,QACpB,YAAA,EAAc,IAAA;AAAA,QACd,cAAA,EAAgB;AAAA,OAClB;AAAA,IACF;AAEA,IAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,aAAA,CAAc,mBAAA,CAAoB,gBAAA;AAGzE,IAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,eAAe,EAAE,OAAA,EAAQ,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAGpG,IAAA,MAAM,QAAA,GAAW,gBAAgB,IAAA,CAAK,CAAC,SAAS,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAE9E,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,OAAO;AAAA,QACL,kBAAA,EAAoB,IAAA;AAAA,QACpB,cAAc,QAAA,IAAY,IAAA;AAAA,QAC1B,cAAA,EAAgB;AAAA,OAClB;AAAA,IACF;AAGA,IAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,IAAA,QAAQ,eAAe,aAAA;AAAe,MACpC,KAAA,CAAA;AAEE,QAAA,kBAAA,GAAsB,QAAA,GAAW,eAAe,QAAA,GAAY,GAAA;AAC5D,QAAA;AAAA,MACF,KAAA,CAAA;AAEE,QAAA,kBAAA,GAAqB,cAAA,CAAe,QAAA;AACpC,QAAA;AAAA,MACF,KAAA,CAAA;AAEE,QAAA,kBAAA,GAAqB,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,cAAA,CAAe,QAAQ,CAAA;AAC/D,QAAA;AAAA,MACF;AACE,QAAA,kBAAA,GAAqB,CAAA;AAAA;AAGzB,IAAA,OAAO;AAAA,MACL,kBAAA,EAAoB,cAAA;AAAA,MACpB,cAAc,QAAA,IAAY,IAAA;AAAA,MAC1B,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF,CAAA,EAAG,CAAC,cAAA,EAAgB,QAAQ,CAAC,CAAA;AAE7B,EAAA,OAAO;AAAA,IACL,kBAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,oBAAA,EAAsB,QAAA;AAAA,IACtB,SAAA,EAAW;AAAA,GACb;AACF;ACpEO,SAAS,sBAAA,CAAuB;AAAA,EACrC,aAAA;AAAA,EACA;AACF,CAAA,EAA2D;AACzD,EAAA,MAAM,EAAE,oBAAA,EAAsB,mBAAA,EAAoB,GAAI,iBAAiB,EAAC;AAExE,EAAA,OAAOA,QAAQ,MAAM;AACnB,IAAA,IAAI,CAAC,MAAM,SAAA,EAAW;AACpB,MAAA,OAAO;AAAA,QACL,aAAA,EAAe,KAAA;AAAA,QACf,cAAA,EAAgB,KAAA;AAAA,QAChB,aAAA,EAAe;AAAA,OACjB;AAAA,IACF;AAGA,IAAA,MAAM,eAAA,GAAkB,KAAK,SAAA,CAAU,IAAA;AAAA,MACrC,CAAC,IAAA,KACC,IAAA,CAAK,OAAA,EAAS,MAAA,KAAW,sBAAsB,MAAA,IAC/C,IAAA,CAAK,OAAA,EAAS,GAAA,KAAQ,oBAAA,EAAsB;AAAA,KAChD;AAGA,IAAA,MAAM,cAAA,GAAiB,KAAK,SAAA,CAAU,IAAA;AAAA,MACpC,CAAC,IAAA,KACC,IAAA,CAAK,OAAA,EAAS,MAAA,KAAW,qBAAqB,MAAA,IAC9C,IAAA,CAAK,OAAA,EAAS,GAAA,KAAQ,mBAAA,EAAqB;AAAA,KAC/C;AAEA,IAAA,MAAM,cAAA,GAAiB,CAAC,CAAC,eAAA;AACzB,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAC,cAAA;AACxB,IAAA,MAAM,gBAAgB,cAAA,IAAkB,aAAA;AAExC,IAAA,OAAO;AAAA,MACL,aAAA;AAAA,MACA,cAAA;AAAA,MACA,aAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,SAAA,EAAW,oBAAA,EAAsB,mBAAmB,CAAC,CAAA;AACjE;;;AChGO,IAAM,wBAAwB,MAAM;AACzC,EAAA,MAAM,UAAA,GAAaF,QAAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAaA,QAAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQA,QAAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AAClC,EAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,IAAA,OAAO,KAAA,GACH;AAAA,MACE,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,UAAA,GAAa,aAAa,EAAA,EAAG;AAAA,MAC3D,EAAE,GAAA,EAAK,eAAA,EAAiB,KAAA,EAAO,UAAA,GAAa,aAAa,EAAA,EAAG;AAAA,MAC5D,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,KAAA;AAAM,KAChC,GACA;AAAA,MACE,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,UAAA,GAAa,aAAa,EAAA,EAAG;AAAA,MAC3D,EAAE,GAAA,EAAK,eAAA,EAAiB,KAAA,EAAO,UAAA,GAAa,aAAa,EAAA;AAAG,KAC9D;AAAA,EACN;AACA,EAAA,OAAO,EAAC;AACV;AAEO,IAAM,oBAAoB,CAAC;AAAA,EAChC,OAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAA,KAK0D;AACxD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIkB,SAAS,EAAE,CAAA;AAC/C,EAAA,MAAM,EAAE,aAAA,EAAc,GAAI,sBAAA,CAAuB;AAAA,IAC/C,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAAC,UAAU,MAAM;AACd,IAAA,aAAA,CAAc,MAAA,CAAO,SAAS,IAAI,CAAA;AAAA,EACpC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAWjB,QAAQ,MAAM;AAC7B,IAAA,IAAI,QAAA,GAAgBF,QAAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAC1C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,GAAW,IAAA,CAAK,MAAM,QAAQ,CAAA;AAC9B,MAAA,IAAI,GAAA,GAAM,OAAO,QAAA,EAAU,EAAA,IAAM,YAAY,QAAA,EAAU,EAAA,CAAG,MAAM,GAAG,CAAA;AACnE,MAAA,QAAA,CAAS,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAAA,IACrC;AACA,IAAA,MAAM,eAAe,QAAA,IAAY,QAAA;AACjC,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,kBAAA;AAAA,IACT;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,EAAE,MAAA,GAAS,EAAC,EAAE,GAAI,QAAA;AACxB,MAAA,IAAI,MAAA,EAAQ,KAAA,EAAO,MAAA,KAAW,CAAA,EAAG;AAC/B,QAAA,OAAO,sBAAA;AAAA,MACT,CAAA,MAAA,IAAW,MAAA,EAAQ,KAAA,EAAO,MAAA,GAAS,CAAA,EAAG;AACpC,QAAA,OAAO,uBAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,gBAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,MAAM,gBAAA,GAAmBE,QAAQ,MAAM;AACrC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAA,EAAK,QAAA;AAAA,QACL,OAAO,OAAA,EAAS;AAAA;AAAA,OAClB;AAAA,MACA;AAAA,QACE,GAAA,EAAK,cAAA;AAAA,QACL,KAAA,EAAO,aAAA,GAAgB,GAAA,GAAM,OAAA,EAAS;AAAA;AAAA,OACxC;AAAA,MACA;AAAA,QACE,GAAA,EAAK,YAAA;AAAA,QACL,KAAA,EAAO;AAAA;AAAA,OACT;AAAA,MACA;AAAA,QACE,GAAA,EAAK,WAAA;AAAA,QACL,KAAA,EAAO,OAAA,EAAS,KAAA,GAAQ,MAAA,GAAS;AAAA;AACnC,KACF;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAA,EAAY,SAAS,KAAA,EAAO,QAAA,EAAU,aAAa,CAAC,CAAA;AAEjE,EAAA,MAAM,kBAAA,GAAqBA,QAAQ,MAAM;AACvC,IAAA,MAAM,uBAAA,GAA0B,MAAM,SAAA,CAAU,IAAA;AAAA,MAAK,CAAC,SACpD,IAAA,CAAK,gBAAA,EAAkB,KAAK,CAAC,IAAA,KAAc,IAAA,CAAK,GAAA,KAAQ,sBAAsB;AAAA,KAChF;AACA,IAAA,MAAM,aAAA,GAAgB,IAAA,EAAM,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAI,KAAK,EAAC;AAC9F,IAAA,OAAO,uBAAA,GACH;AAAA,MACE;AAAA,QACE,GAAA,EAAK,yBAAA;AAAA,QACL,KAAA,EAAO,KAAK,SAAA,CAAU;AAAA,UACpB,aAAA,EAAe,aAAA;AAAA,UACf,SAAA,EAAW,QAAA,EAAU,IAAA,IAAQ;AAAC,SAC/B;AAAA;AACH,QAEF,EAAC;AAAA,EACP,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAIT,EAAA,MAAM,iBAAA,GAAoBA,QAAQ,MAAM;AACtC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAA,EAAK,UAAA;AAAA,QACL,KAAA,EAAO,IAAA,EAAM,SAAA,CAAU,IAAA,CAAK,CAAC,SAAS,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,OAAA,KAAY,SAAS;AAAA;AACxF,KACF;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,gBAAA,GAAmBA,QAAQ,MAAM;AACrC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAA,EAAK,SAAA;AAAA,QACL,OAAO,IAAA,EAAM,SAAA,CACV,MAAA,CAAe,CAAC,KAAK,IAAA,KAAS;AAC7B,UAAA,OAAO,IAAID,QAAAA,CAAQ,GAAG,CAAA,CAAE,IAAA,CAAK,KAAK,OAAA,CAAQ,MAAA,IAAU,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,QAClE,CAAA,EAAG,CAAC,CAAA,CACH,QAAA;AAAS,OACd;AAAA,MACA;AAAA,QACE,GAAA,EAAK,kBAAA;AAAA,QACL,KAAA,EAAO;AAAA;AACT,KACF;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,kBAAA,GAAqBC,QAAQ,MAAM;AACvC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,GAAA,EAAK,YAAA;AAAA,QACL,KAAA,EAAO;AAAA;AACT,KACF;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,OAAOA,OAAAA;AAAA,IACL,OAAO;AAAA,MACL,UAAA,EAAY;AAAA,QACV,GAAG,gBAAA;AAAA,QACH,GAAG,kBAAA;AAAA,QACH,GAAG,iBAAA;AAAA,QACH,GAAG,gBAAA;AAAA,QACH,GAAG,kBAAA;AAAA,QACH,GAAG,qBAAA;AAAsB,OAC3B,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,MAAM,KAAK;AAAA,KAChC,CAAA;AAAA,IACA,CAAC,gBAAA,EAAkB,kBAAA,EAAoB,iBAAA,EAAmB,kBAAkB,kBAAkB;AAAA,GAChG;AACF;AC7JA,IAAM,WAAA,GAAc,CAAA;AACpB,IAAM,WAAA,GAAc,GAAA;AAEb,IAAM,2BAA2B,CAAC;AAAA,EACvC,IAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAOM;AACJ,EAAA,MAAM,aAAA,GAAgBA,QAAQ,MAAM;AAClC,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAElB,MAAA,MAAM,wBAAwB,MAAA,EAAQ,MAAA,GAAS,QAAA,EAAU,OAAA,EAAS,UAAU,EAAE,CAAA;AAE9E,MAAA,MAAM,0BACJ,IAAA,EAAM,SAAA,CAAU,MAAA,CAAO,CAAC,KAAK,IAAA,KAAS;AACpC,QAAA,IACE,IAAA,CAAK,OAAA,EAAS,MAAA,KAAW,QAAA,EAAU,OAAA,EAAS,MAAA,IAC5C,IAAA,CAAK,OAAA,CAAQ,GAAA,KAAQ,QAAA,CAAS,OAAA,CAAQ,GAAA,EACtC;AACA,UAAA,GAAA,IAAO,IAAA,CAAK,QAAA;AAAA,QACd;AACA,QAAA,OAAO,GAAA;AAAA,MACT,CAAA,EAAG,CAAC,CAAA,IAAK,CAAA;AAEX,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,uBAAuB,GAAA,IAAO,WAAA;AAAA,QACnC,GAAA,EAAK,qBAAA,EAAuB,GAAA,GACxB,qBAAA,EAAuB,MAAM,uBAAA,GAC7B;AAAA,OACN;AAAA,IACF,CAAA,MAAA,IAAW,QAAQ,GAAA,EAAK;AACtB,MAAA,MAAM,qBAAA,GAAwB,MAAA,EAAQ,GAAA,GAAM,QAAA,EAAU,SAAS,GAAG,CAAA;AAElE,MAAA,OAAO;AAAA,QACL,GAAA,EAAK,uBAAuB,GAAA,IAAO,WAAA;AAAA,QACnC,GAAA,EAAK,uBAAuB,GAAA,IAAO;AAAA,OACrC;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,WAAA;AAAA,MACL,GAAA,EAAK;AAAA,KACP;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AAEnB,EAAA,OAAO,aAAA;AACT;AC3CO,IAAM,oCAAoC,CAAC;AAAA,EAChD,IAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,KASM;AACJ,EAAA,MAAM,EAAE,MAAA,EAAQ,iBAAA,EAAkB,GAAI,UAAA,EAAW;AAEjD,EAAA,MAAM,wBAAA,GAA2BA,OAAAA;AAAA,IAC/B,MACE,MAAM,aAAA,CACH,MAAA;AAAA,MACC,CAAC,EAAE,IAAA,EAAM,UAAA,EAAW,KAClB,UAAA,IAAc,iBAAA,CAAkB,IAAA,CAAK,CAAC,UAAA,KAAe,IAAA,CAAK,UAAA,CAAW,UAAU,CAAC;AAAA,MAEnF,GAAA,CAAI,CAAC,EAAE,IAAA,OAAW,IAAI,CAAA;AAAA,IAC3B,CAAC,IAAI;AAAA,GACP;AAEA,EAAA,MAAM,eAAA,GAAkBA,OAAAA;AAAA,IACtB,MACE,IAAA,EAAM,SAAA,CACH,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,MAAA,MAAM,iBAAwD,EAAC;AAC/D,MAAA,MAAM,iBAAiB,EAAC;AAExB,MAAA,MAAM,YAAA,GAAe,KAAK,mBAAA,EAAqB,IAAA;AAAA,QAAK,CAAC,UAAA,KACnD,wBAAA,EAA0B,QAAA,CAAS,WAAW,IAAI;AAAA,OACpD;AAGA,MAAA,MAAM,uBAAA,GAA0B,KAAK,gBAAA,EAAkB,IAAA;AAAA,QACrD,CAAC,IAAA,KAAyC,IAAA,CAAK,GAAA,KAAQ;AAAA,OACzD;AACA,MAAA,MAAM,gBAAA,GAAmB,4BAAA,CAA6B,IAAA,CAAK,gBAAgB,CAAA;AAE3E,MAAA,MAAM,8BACJ,MAAA,CAAO,gBAAA,CAAiB,iBAAiB,CAAA,KAAM,MAAA,CAAO,KAAK,WAAW,CAAA;AAExE,MAAA,IAAI,CAAC,+BAA+B,uBAAA,EAAyB;AAC3D,QAAA,cAAA,CAAe,IAAA,CAAK;AAAA,UAClB,GAAA,EAAK,sBAAA;AAAA,UACL,KAAA,EAAO,KAAK,SAAA,CAAU;AAAA,YACpB,GAAG,gBAAA;AAAA,YACH,iBAAA,EAAmB,MAAA,CAAO,IAAA,CAAK,WAAW;AAAA,WAC3C;AAAA,SACF,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,kBAAA,GAAqB,cAAc,MAAA,IAAU,CAAA;AAEnD,MAAA,MAAM,sBAAA,GAAyB,KAAK,gBAAA,EAAkB,IAAA;AAAA,QACpD,CAAC,IAAA,KACC,IAAA,CAAK,GAAA,KAAQ,eAAA,IAAmB,KAAK,GAAA,KAAQ;AAAA,OACjD;AAEA,MAAA,MAAM,0BAAA,GACJ,KAAK,gBAAA,EAAkB,IAAA;AAAA,QACrB,CAAC,SACC,IAAA,CAAK,GAAA,KAAQ,mBAAmB,IAAA,CAAK,KAAA,KAAU,OAAO,kBAAkB;AAAA,OAC5E,IACA,KAAK,gBAAA,EAAkB,IAAA;AAAA,QACrB,CAAC,SACC,IAAA,CAAK,GAAA,KAAQ,0BAA0B,IAAA,CAAK,KAAA,KAAU,OAAO,kBAAkB;AAAA,OACnF;AAEF,MAAA,IAAI,YAAA,IAAgB,CAAC,0BAAA,EAA4B;AAC/C,QAAA,cAAA,CAAe,IAAA,CAAK;AAAA,UAClB,GAAA,EAAK,eAAA;AAAA,UACL,KAAA,EAAO,OAAO,kBAAkB;AAAA,SACjC,CAAA;AACD,QAAA,cAAA,CAAe,IAAA,CAAK;AAAA,UAClB,GAAA,EAAK,sBAAA;AAAA,UACL,KAAA,EAAO,OAAO,kBAAkB;AAAA,SACjC,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,CAAC,YAAA,IAAgB,sBAAA,EAAwB;AAElD,QAAA,cAAA,CAAe,KAAK,eAAe,CAAA;AACnC,QAAA,cAAA,CAAe,KAAK,sBAAsB,CAAA;AAAA,MAC5C;AAEA,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAC,CAAA,CACA,MAAA;AAAA,MACC,CAAC,EAAE,cAAA,EAAgB,gBAAe,KAAM,cAAA,CAAe,UAAU,cAAA,CAAe;AAAA,MAEjF,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,cAAA,EAAgB,gBAAe,KAAM;AACjD,MAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,QAAA,OAAO;AAAA,UACL,IAAI,IAAA,CAAK,EAAA;AAAA,UACT,UAAA,EAAY;AAAA,YACV,GAAI,KAAK,gBAAA,EAAkB,MAAA;AAAA,cACzB,CAAC,IAAA,KACC,CAAC,cAAA,CAAe,IAAA,CAAK,CAAC,UAAA,KAAe,UAAA,CAAW,GAAA,KAAQ,IAAA,CAAK,GAAG;AAAA,iBAC/D,EAAC;AAAA,YACN,GAAG;AAAA;AACL,SACF;AAAA,MACF,CAAA,MAAA,IAAW,eAAe,MAAA,EAAQ;AAChC,QAAA,OAAO;AAAA,UACL,IAAI,IAAA,CAAK,EAAA;AAAA,UACT,UAAA,EACE,KAAK,gBAAA,EAAkB,MAAA;AAAA,YACrB,CAAC,IAAA,KAAyC,CAAC,cAAA,CAAe,QAAA,CAAS,KAAK,GAAG;AAAA,eACxE;AAAC,SACV;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAO;AAAA,UACL,IAAI,IAAA,CAAK,EAAA;AAAA,UACT,UAAA,EAAY,IAAA,CAAK,gBAAA,IAAoB;AAAC,SACxC;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,IACL,CAAC,IAAA,EAAM,SAAA,EAAW,wBAAwB;AAAA,GAC5C;AAEA,EAAA,MAAM,EAAE,SAAQ,GAAIkB,UAAAA;AAAA,IAClB,YAAY;AACV,MAAA,IAAI,eAAA,EAAiB,MAAA,IAAU,CAAC,aAAA,EAAe;AAC7C,QAAA,MAAM,MAAA,GAAS,MAAMC,eAAAA,CAAgB,MAAA,EAAQ;AAAA,UAC3C,MAAA,EAAQ,MAAM,EAAA,IAAM,EAAA;AAAA,UACpB,KAAA,EAAO,eAAA;AAAA,UACP,oBAAA;AAAA,UACA,aAAA,EAAe;AAAA,SAChB,CAAA;AACD,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,UAAA,CAAW,MAAM,CAAA;AAAA,QACnB;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,YAAA,EAAc,GAAA;AAAA;AAAA,MACd,gBAAA,EAAkB,IAAA;AAAA,MAClB,WAAA,EAAa,CAAC,eAAA,EAAiB,aAAa;AAAA;AAC9C,GACF;AAEA,EAAAF,UAAU,MAAM;AACd,IAAA,eAAA,CAAgB,CAAC,IAAA,KAAc;AAC7B,MAAA,OAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH,yBAAA,EAA2B;AAAA,OAC7B;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,OAAA,EAAS,eAAe,CAAC,CAAA;AAC/B;;;AC5KO,IAAK,iBAAA,qBAAAG,kBAAAA,KAAL;AACL,EAAAA,kBAAAA,CAAAA,kBAAAA,CAAA,gBAAa,CAAA,CAAA,GAAb,YAAA;AACA,EAAAA,kBAAAA,CAAAA,kBAAAA,CAAA,kBAAe,CAAA,CAAA,GAAf,cAAA;AAFU,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;AAKL,IAAK,kBAAA,qBAAAC,mBAAAA,KAAL;AACL,EAAAA,mBAAAA,CAAAA,mBAAAA,CAAA,0BAAuB,CAAA,CAAA,GAAvB,sBAAA;AACA,EAAAA,mBAAAA,CAAAA,mBAAAA,CAAA,qBAAkB,CAAA,CAAA,GAAlB,iBAAA;AAFU,EAAA,OAAAA,mBAAAA;AAAA,CAAA,EAAA,kBAAA,IAAA,EAAA;ACwCL,SAAS,UAAA,CAAW,OAAA,GAA6B,EAAC,EAAG;AAC1D,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,UAAA,EAAW;AACtC,EAAA,MAAM,EAAE,MAAA,EAAQ,oBAAA,EAAsB,GAAG,YAAW,GAAI,OAAA;AAExD,EAAA,OAAOjB,MAAAA;AAAA,IACL,SAAS,CAAC,SAAA,EAAW,MAAA,EAAQ,MAAA,EAAQ,oBAAoB,CAAA,GAAI,IAAA;AAAA,IAC7D,MACE,WAAW,MAAA,EAAQ;AAAA,MACjB,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH;AAAA,GACF;AACF;ACGO,SAAS,cAAA,CAAe,OAAA,GAAiC,EAAC,EAAG;AAClE,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,UAAA,EAAW;AACtC,EAAA,MAAM,EAAE,OAAO,KAAA,EAAO,OAAA,EAAS,SAAS,oBAAA,EAAsB,GAAG,YAAW,GAAI,OAAA;AAEhF,EAAA,OAAOA,MAAAA;AAAA,IACL,CAAC,cAAA,EAAgB,MAAA,EAAQ,OAAO,KAAA,EAAO,OAAA,EAAS,SAAS,oBAAoB,CAAA;AAAA,IAC7E,MACE,eAAe,MAAA,EAAQ;AAAA,MACrB,MAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH;AAAA,GACF;AACF;AC5BO,SAAS,oBAAA,CAAqB,OAAA,GAAuC,EAAC,EAAG;AAC9E,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,UAAA,EAAW;AACtC,EAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAe,oBAAA,EAAsB,GAAG,YAAW,GAAI,OAAA;AACxE,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,aAAA,IAAiB,EAAE,CAAA;AAI3C,EAAA,MAAM,gBAAgB,OAAA,GAAU,CAAC,GAAG,OAAO,CAAA,CAAE,MAAK,GAAI,MAAA;AAEtD,EAAA,OAAOA,MAAAA;AAAA,IACL,aAAA,IAAiB,aAAA,CAAc,MAAA,GAAS,CAAA,GACpC,CAAC,qBAAA,EAAuB,MAAA,EAAQ,aAAA,CAAc,IAAA,CAAK,GAAG,CAAA,EAAG,oBAAoB,CAAA,GAC7E,IAAA;AAAA,IACJ,MAAM;AACJ,MAAA,MAAM,YAAA,GAAe,CAAC,GAAG,OAAO,CAAA;AAChC,MAAA,IAAI,YAAA,EAAc,WAAW,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,MACxC;AACA,MAAA,OAAOC,qBAAqB,MAAA,EAAQ;AAAA,QAClC,OAAA,EAAS,CAAC,GAAG,OAAO,CAAA;AAAA,QACpB,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,UAAA,IAAc;AAAA,MACZ,iBAAA,EAAmB;AAAA;AACrB,GACF;AACF;ACjEA,SAAS,yBAAyB,OAAA,EAAkE;AAClG,EAAA,MAAM,mBAAmB,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAC,CAAA,KAAM,EAAE,gBAAgB,CAAA;AACxE,EAAA,OAAO,gBAAA,IAAoB,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA;AAC/C;AAKA,SAAS,6BAAA,CACP,SACA,eAAA,EACsC;AACtC,EAAA,OAAO,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAC,OAAA,KAAY;AACxC,IAAA,OAAO,OAAA,CAAQ,eAAA,CAAgB,KAAA,CAAM,CAAC,MAAA,KAAW;AAC/C,MAAA,OAAO,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAA,KAAM,MAAA,CAAO,KAAA;AAAA,IACjD,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AA2BO,SAAS,UAAA,CAAW;AAAA,EACzB,OAAA;AAAA,EACA;AACF,CAAA,EAGyC;AACvC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIW,QAAAA;AAAA,IAC5B,OAAA,GAAU,wBAAA,CAAyB,OAAO,CAAA,GAAI;AAAA,GAChD;AAEA,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,UAAA,CAAW,MAAS,CAAA;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,6BAAA,CAA8B,OAAA,EAAS,eAAe,CAAA;AACzE,IAAA,IAAI,UAAA,IAAc,UAAA,CAAW,EAAA,KAAO,OAAA,EAAS,EAAA,EAAI;AAC/C,MAAA,UAAA,CAAW,UAAU,CAAA;AAAA,IACvB,CAAA,MAAA,IAAW,CAAC,UAAA,EAAY;AAEtB,MAAA,UAAA,CAAW,wBAAA,CAAyB,OAAO,CAAC,CAAA;AAAA,IAC9C;AAAA,EACF,GAAG,CAAC,eAAA,EAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,CAAC,CAAA;AAE1C,EAAA,OAAO,OAAA;AACT;AC5EA,IAAM,UAAA,GAAa,YAAA;AAKnB,SAAS,WAAA,CAAY;AAAA,EACnB,MAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA,EAOW;AACT,EAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ;AAAA,IAC9C,KAAA,EAAO,UAAA;AAAA,IACP,QAAA,EAAU,YAAA;AAAA,IACV,uBAAuB,qBAAA,IAAyB,CAAA;AAAA,IAChD,uBAAuB,qBAAA,IAAyB;AAAA,GACjD,CAAA;AAED,EAAA,IAAI,SAAA,GAAY,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA;AAEvC,EAAA,IAAI,mBAAA,EAAqB;AACvB,IAAA,SAAA,GAAY,SAAA,CAAU,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AAAA,EAC3C;AAEA,EAAA,OAAO,SAAA;AACT;AAKA,SAAS,kBAAA,CAAmB;AAAA,EAC1B,MAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA,EAQyC;AACvC,EAAA,OAAO;AAAA,IACL,OAAO,WAAA,CAAY;AAAA,MACjB,MAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,qBAAA;AAAA,MACA,qBAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACD,WAAW,WAAA,CAAY;AAAA,MACrB,MAAA,EAAQ,UAAA;AAAA,MACR,YAAA;AAAA,MACA,MAAA;AAAA,MACA,qBAAA;AAAA,MACA,qBAAA;AAAA,MACA;AAAA,KACD;AAAA,GACH;AACF;AAgDO,SAAS,QAAA,CAAS;AAAA,EACvB,MAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA,GAAqB,EAAA;AAAA,EACrB,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA;AACF,CAAA,EAAoC;AAClC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,UAAA,EAAW;AAE9B,EAAA,MAAM,KAAA,GAAQjB,QAAQ,MAAM;AAC1B,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,YAAA,EAAc;AAC/C,MAAA,OAAO,EAAA;AAAA,IACT;AAGA,IAAA,IAAI,kBAAA,IAAsB,UAAU,UAAA,EAAY;AAC9C,MAAA,OAAO,kBAAA;AAAA,IACT;AAEA,IAAA,OAAO,aACH,kBAAA,CAAmB;AAAA,MACjB,MAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,qBAAA;AAAA,MACA,qBAAA;AAAA,MACA;AAAA,KACD,IACD,WAAA,CAAY;AAAA,MACV,MAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,qBAAA;AAAA,MACA,qBAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACP,CAAA,EAAG;AAAA,IACD,MAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA;AAAA,IACA,qBAAA;AAAA,IACA,qBAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,MAAA,GAASA,QAAwB,MAAM;AAC3C,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,IAAU,MAAA,IAAU,CAAC,CAAA;AAC1C,IAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,EAAE,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,IAAA,EAAK,GAAI,EAAE,GAAG,OAAO,IAAA,EAAK;AAAA,EACjG,CAAA,EAAG,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAElB,EAAA,OAAO,MAAA;AACT;AC5KA,SAAS,mBAAmB,eAAA,EAAkE;AAC5F,EAAA,OAAO,eAAA,CAAgB,MAAA,CAAO,CAAC,GAAA,EAAK,MAAA,KAAW;AAC7C,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA,CAAO,KAAA;AAC1B,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,EAAa,CAAA;AAClB;AAKA,SAAS,gBAAgB,GAAA,EAAqB;AAC5C,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,EAAA;AACvC,IAAA,OAAO,KAAK,MAAM,CAAA;AAAA,EACpB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAyCO,SAAS,kBAAA,CACd,SACA,GAAA,EACuB;AACvB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIgB,QAAAA,CAAkB,EAAE,CAAA;AAElD,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,SAAS,MAAA,EAAQ;AACxC,MAAA,UAAA,CAAW,EAAE,CAAA;AACb,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,GAAgD,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA;AAEtE,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,MAAM,YAAA,GAAe,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AAC/D,MAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,GAAA,CAAI,SAAS,CAAA;AAEjD,MAAA,IAAI,cAAA,EAAgB;AAElB,QAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM;AAChD,UAAA,IAAI,GAAA,EAAK,OAAO,CAAA,CAAE,GAAA,KAAQ,GAAA;AAE1B,UAAA,OACE,CAAA,CAAE,EAAA,KAAO,cAAA,IACT,CAAA,CAAE,EAAA,CAAG,QAAA,CAAS,cAAc,CAAA,IAC5B,eAAA,CAAgB,CAAA,CAAE,EAAE,CAAA,KAAM,cAAA;AAAA,QAE9B,CAAC,CAAA;AAED,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,OAAA,GAAU,YAAA;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,OAAA,CAAQ,eAAe,CAAA;AAC7D,MAAA,UAAA,CAAW,UAAU,CAAA;AAAA,IACvB;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,GAAG,CAAC,CAAA;AAEjB,EAAA,OAAO,CAAC,SAAS,UAAU,CAAA;AAC7B;ACxGA,SAASK,iBAAgB,GAAA,EAAiC;AACxD,EAAA,IAAI;AAEF,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC3B,IAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,GAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAoCO,SAAS,cAAc,UAAA,EAAqC;AACjE,EAAA,MAAM,EAAE,aAAA,EAAc,GAAI,UAAA,EAAW;AAErC,EAAA,OAAOd,WAAAA;AAAA,IACL,CAAC,EAAE,OAAA,EAAS,OAAA,EAAQ,KAAmF;AACrG,MAAA,IAAI,CAAC,SAAS,OAAO,EAAA;AAErB,MAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AAGxC,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,MAAM,SAAA,GAAYc,gBAAAA,CAAgB,OAAA,CAAQ,EAAE,CAAA;AAC5C,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,WAAA,CAAY,GAAA,CAAI,WAAW,SAAS,CAAA;AAAA,QACtC;AAAA,MACF;AAGA,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACnD,UAAA,WAAA,CAAY,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,QAC5B,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,WAAA,GAAc,YAAY,QAAA,EAAS;AACzC,MAAA,MAAM,IAAA,GAAO,aAAa,OAAA,CAAQ,MAAM,GAAG,WAAA,GAAc,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAG/E,MAAA,IAAI,eAAe,gBAAA,EAAkB;AACnC,QAAA,OAAO,aAAA,CAAc,iBAAiB,IAAI,CAAA;AAAA,MAC5C;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,eAAe,UAAU;AAAA,GAC5B;AACF;AClFA,SAASA,iBAAgB,GAAA,EAAiC;AACxD,EAAA,IAAI;AAEF,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAC3B,IAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,GAAA;AAAA,EACpC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AA8BO,SAAS,sBAAsB,OAAA,EAA0C;AAC9E,EAAAL,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,MAAA,KAAW,WAAA,EAAa;AAC7C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,CAAgB,MAAA,CAAO,SAAS,MAAM,CAAA;AAC/D,IAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,GAAA,CAAI,SAAS,CAAA;AACnD,IAAA,MAAM,YAAA,GAAeK,gBAAAA,CAAgB,OAAA,CAAQ,EAAE,CAAA;AAG/C,IAAA,IAAI,YAAA,IAAgB,qBAAqB,YAAA,EAAc;AACrD,MAAA,YAAA,CAAa,GAAA,CAAI,WAAW,YAAY,CAAA;AAExC,MAAA,MAAM,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,CAAA,EAAI,YAAA,CAAa,QAAA,EAAU,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,CAAA;AAG5F,MAAA,MAAA,CAAO,OAAA,CAAQ,YAAA,CAAa,EAAC,EAAG,IAAI,MAAM,CAAA;AAAA,IAC5C;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AACd;AChDA,SAAS,mBAAA,CAAoB;AAAA,EAC3B,OAAA;AAAA,EACA;AACF,CAAA,EAGY;AAEV,EAAA,IAAI,OAAA,CAAQ,OAAO,GAAA,EAAK;AACtB,IAAA,MAAM,cAAA,GAAiB,QAAQ,KAAA,CAAM,GAAA;AAGrC,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,KAAA,KAAU;AACnD,MAAA,IAAI,KAAA,CAAM,gBAAA,KAAqB,OAAA,IAAW,KAAA,CAAM,YAAA,EAAc;AAC5D,QAAA,OAAO,KAAA,CAAM,cAAc,GAAA,KAAQ,cAAA;AAAA,MACrC;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAGD,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAE3B,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,KAAA,KAAU;AACjD,QAAA,IAAI,KAAA,CAAM,gBAAA,KAAqB,OAAA,IAAW,KAAA,CAAM,YAAA,EAAc;AAC5D,UAAA,OAAO,KAAA,CAAM,aAAa,GAAA,KAAQ,cAAA;AAAA,QACpC;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,OAAO,CAAC,GAAG,YAAA,EAAc,GAAG,UAAU,CAAA;AAAA,IACxC;AAAA,EACF;AAGA,EAAA,OAAO,OAAA,CAAQ,KAAA;AACjB;AAsCO,SAAS,eAAA,CAAgB;AAAA,EAC9B,OAAA;AAAA,EACA;AACF,CAAA,EAGiB;AACf,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIN,QAAAA,CAAuB,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,QAAAA,CAAuB,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,QAAAA,CAAuB,EAAE,CAAA;AAE3D,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,EAAS;AACxB,MAAA,YAAA,CAAa,EAAE,CAAA;AACf,MAAA,YAAA,CAAa,EAAE,CAAA;AACf,MAAA,YAAA,CAAa,EAAE,CAAA;AACf,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,EAAE,OAAA,EAAS,SAAS,CAAA;AAG1D,IAAA,MAAM,SAAS,SAAA,CAAU,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,qBAAqB,OAAO,CAAA;AAC7E,IAAA,MAAM,SAAS,SAAA,CAAU,MAAA;AAAA,MACvB,CAAC,KAAA,KAAU,KAAA,CAAM,gBAAA,KAAqB,OAAA,IAAW,MAAM,gBAAA,KAAqB;AAAA,KAC9E;AAGA,IAAA,YAAA,CAAa,MAAA,CAAO,MAAA,GAAS,CAAA,IAAK,MAAA,CAAO,CAAC,CAAA,GAAI,CAAC,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI,EAAE,CAAA;AAC9D,IAAA,YAAA,CAAa,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA,CAAO,MAAM,CAAC,CAAA,GAAI,EAAE,CAAA;AACrD,IAAA,YAAA,CAAa,MAAM,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,OAAA,EAAS,OAAO,CAAC,CAAA;AAErB,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,SAAA;AAAA,IACb,SAAA;AAAA,IACA;AAAA,GACF;AACF;ACrHO,SAAS,aAAA,CAAc,OAAA,GAAgC,EAAC,EAAG;AAChE,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,UAAA,EAAW;AACtC,EAAA,MAAM,EAAE,MAAA,EAAQ,oBAAA,EAAsB,GAAG,YAAW,GAAI,OAAA;AAExD,EAAA,OAAOb,MAAAA;AAAA,IACL,SAAS,CAAC,YAAA,EAAc,MAAA,EAAQ,MAAA,EAAQ,oBAAoB,CAAA,GAAI,IAAA;AAAA,IAChE,MACE,cAAc,MAAA,EAAQ;AAAA,MACpB,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH;AAAA,GACF;AACF;ACXO,SAAS,iBAAA,CAAkB,OAAA,GAAoC,EAAC,EAAG;AACxE,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,UAAA,EAAW;AACtC,EAAA,MAAM,EAAE,OAAO,KAAA,EAAO,OAAA,EAAS,SAAS,oBAAA,EAAsB,GAAG,YAAW,GAAI,OAAA;AAEhF,EAAA,OAAOA,MAAAA;AAAA,IACL,CAAC,iBAAA,EAAmB,MAAA,EAAQ,OAAO,KAAA,EAAO,OAAA,EAAS,SAAS,oBAAoB,CAAA;AAAA,IAChF,MACE,kBAAkB,MAAA,EAAQ;AAAA,MACxB,MAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH;AAAA,GACF;AACF;AChBO,SAAS,cAAA,CAAe,OAAA,GAAiC,EAAC,EAAG;AAClE,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,UAAA,EAAW;AACtC,EAAA,MAAM,EAAE,OAAO,KAAA,EAAO,KAAA,EAAO,SAAS,OAAA,EAAS,oBAAA,EAAsB,GAAG,UAAA,EAAW,GAAI,OAAA;AAEvF,EAAA,OAAOA,MAAAA;AAAA,IACL,CAAC,eAAe,MAAA,EAAQ,KAAA,EAAO,OAAO,KAAA,EAAO,OAAA,EAAS,SAAS,oBAAoB,CAAA;AAAA,IACnF,MACE,eAAe,MAAA,EAAQ;AAAA,MACrB,MAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH;AAAA,GACF;AACF;ACtBO,SAAS,OAAA,CAAQ,OAAA,GAA0B,EAAC,EAAG;AACpD,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,UAAA,EAAW;AACtC,EAAA,MAAM,EAAE,MAAA,EAAQ,oBAAA,EAAsB,GAAG,YAAW,GAAI,OAAA;AAExD,EAAA,OAAOA,MAAAA;AAAA,IACL,SAAS,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,oBAAoB,CAAA,GAAI,IAAA;AAAA,IAC1D,MAAM,OAAA,CAAQ,MAAA,EAAQ,EAAE,MAAA,EAAiB,MAAA,EAAQ,sBAAsB,CAAA;AAAA,IACvE;AAAA,GACF;AACF;ACRO,SAAS,WAAA,CAAY,OAAA,GAA8B,EAAC,EAAG;AAC5D,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,UAAA,EAAW;AACtC,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAO,oBAAA,EAAsB,GAAG,YAAW,GAAI,OAAA;AAE9D,EAAA,OAAOA,MAAAA;AAAA,IACL,CAAC,WAAA,EAAa,MAAA,EAAQ,KAAA,EAAO,OAAO,oBAAoB,CAAA;AAAA,IACxD,MACE,YAAY,MAAA,EAAQ;AAAA,MAClB,MAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH;AAAA,GACF;AACF;ACfO,SAAS,UAAA,CAAW,OAAA,GAA6B,EAAC,EAAG;AAC1D,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,UAAA,EAAW;AACtC,EAAA,MAAM,EAAE,UAAA,EAAY,aAAA,EAAe,oBAAA,EAAsB,GAAG,YAAW,GAAI,OAAA;AAE3E,EAAA,OAAOA,MAAAA;AAAA,IACL,UAAA,IAAc,gBACV,CAAC,SAAA,EAAW,QAAQ,UAAA,EAAY,aAAA,EAAe,oBAAoB,CAAA,GACnE,IAAA;AAAA,IACJ,MACE,WAAW,MAAA,EAAQ;AAAA,MACjB,UAAA;AAAA,MACA,aAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH;AAAA,GACF;AACF;ACfO,SAAS,WAAA,CAAY,OAAA,GAA8B,EAAC,EAAG;AAC5D,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,UAAA,EAAW;AACtC,EAAA,MAAM,EAAE,OAAO,KAAA,EAAO,OAAA,EAAS,SAAS,oBAAA,EAAsB,GAAG,YAAW,GAAI,OAAA;AAEhF,EAAA,OAAOA,MAAAA;AAAA,IACL,CAAC,UAAA,EAAY,MAAA,EAAQ,OAAO,KAAA,EAAO,OAAA,EAAS,SAAS,oBAAoB,CAAA;AAAA,IACzE,MACE,YAAY,MAAA,EAAQ;AAAA,MAClB,MAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH;AAAA,GACF;AACF;ACjBO,SAAS,iBAAA,CAAkB,OAAA,GAAoC,EAAC,EAAG;AACxE,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,UAAA,EAAW;AACtC,EAAA,MAAM,EAAE,YAAY,KAAA,EAAO,OAAA,EAAS,SAAS,oBAAA,EAAsB,GAAG,YAAW,GAAI,OAAA;AAErF,EAAA,OAAOA,MAAAA;AAAA,IACL,UAAA,GACI,CAAC,kBAAA,EAAoB,MAAA,EAAQ,YAAY,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,oBAAoB,CAAA,GACtF,IAAA;AAAA,IACJ,MACE,kBAAkB,MAAA,EAAQ;AAAA,MACxB,UAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH;AAAA,GACF;AACF;ACGA,eAAe,aAAA,CACb,MAAA,EACA,MAAA,EACA,WAAA,EACA,KAAA,GAAgB,EAAA,EAChB,KAAA,GAA4B,CAAC,SAAA,EAAW,SAAA,EAAW,MAAM,CAAA,EACtB;AACnC,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA;AAAA;AAAA,IAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA;AAAA,GAAA;AA6C5B,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,KAAA,CAAuB,KAAA,EAAO;AAAA,IACtD,KAAA,EAAO,WAAA;AAAA,IACP,KAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,MAAA,EAAQ;AACzB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,QACJ,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,GAAA,CAAI,CAAC,IAAA,KAAc;AACpC,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,MAAM,IAAA,GAAyB;AAAA,MAC7B,IAAA,EAAM,IAAA,CAAK,UAAA,CAAW,WAAA,EAAY;AAAA,MAClC,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAO,IAAA,CAAK;AAAA,KACd;AAEA,IAAA,IAAI,IAAA,CAAK,eAAe,SAAA,EAAW;AACjC,MAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AACxB,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,aAAA,GACd;AAAA,QACE,GAAA,EAAK,KAAK,aAAA,CAAc,GAAA;AAAA,QACxB,OAAA,EAAS,KAAK,aAAA,CAAc;AAAA,OAC9B,GACA,MAAA;AAAA,IACN,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,KAAe,SAAA,EAAW;AACxC,MAAA,IAAA,CAAK,cAAc,IAAA,CAAK,OAAA;AACxB,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,KAAA,GACd;AAAA,QACE,GAAA,EAAK,KAAK,KAAA,CAAM,GAAA;AAAA,QAChB,OAAA,EAAS,KAAK,KAAA,CAAM;AAAA,OACtB,GACA,MAAA;AAAA,IACN;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,KAAK,EAAC;AAET,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,UAAA,IAAc,CAAA;AAAA,IACtC,QAAA,EAAU,KAAK,MAAA,CAAO;AAAA,GACxB;AACF;AAEO,SAAS,SAAA,CAAU,OAAA,GAA4B,EAAC,EAAG;AACxD,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,UAAA,EAAW;AACtC,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,GAAQ,EAAA,EAAI,KAAA,GAAQ,CAAC,SAAA,EAAW,SAAA,EAAW,MAAM,CAAA,EAAG,GAAG,UAAA,EAAW,GAAI,OAAA;AAErF,EAAA,OAAOA,MAAAA;AAAA,IACL,QAAQ,CAAC,QAAA,EAAU,QAAQ,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA,GAAI,IAAA;AAAA,IAClD,MAAM,aAAA,CAAc,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,OAAO,KAAK,CAAA;AAAA,IACvD;AAAA,GACF;AACF;ACpHA,eAAe,WAAA,CACb,MAAA,EACA,MAAA,EACA,oBAAA,EAC+B;AAC/B,EAAA,MAAM,aAAA,GAAgB,oBAAA,IAAwB,oBAAA,CAAqB,MAAA,GAAS,CAAA;AAE5E,EAAA,MAAM,KAAA;AAAA;AAAA,IAAsB;AAAA;AAAA,MAAA,EAEtB,aAAA,GAAgB,2DAA2D,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,EAwB3E,aAAA,GAAgB,qEAAqE,EAAE;AAAA;AAAA;AAAA,EAAA;AAAA,GAAA;AAK/F,EAAA,MAAM,YAAiB,EAAC;AACxB,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,SAAA,CAAU,wBAAA,GAA2B,oBAAA;AAAA,EACvC;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,KAAA,CAAqB,OAAO,SAAS,CAAA;AAE/D,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,IAAA,EAAM;AACvB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,aAAa,IAAA,CAAK,UAAA,EAAY,MAAA,CAAO,CAAC,KAA0B,EAAA,KAAY;AAChF,IAAA,IAAI,EAAA,IAAM,GAAG,GAAA,EAAK;AAChB,MAAA,GAAA,CAAI,EAAA,CAAG,GAAG,CAAA,GAAI,EAAA,CAAG,KAAA;AAAA,IACnB;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,KAAA,EAAO,KAAK,KAAA,GACR;AAAA,MACE,IAAA,EAAM,KAAK,KAAA,CAAM,IAAA;AAAA,MACjB,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,GACf;AAAA,QACE,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS,UAAA;AAAA,QACpC,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,SAAA,EAAW;AAAA,OAC1C,GACA;AAAA,KACN,GACA,MAAA;AAAA,IACJ;AAAA,GACF;AACF;AAEO,SAAS,OAAA,CAAQ,OAAA,GAA0B,EAAC,EAAG;AACpD,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,UAAA,EAAW;AACtC,EAAA,MAAM,EAAE,oBAAA,EAAsB,GAAG,UAAA,EAAW,GAAI,OAAA;AAEhD,EAAA,OAAOA,MAAAA;AAAA,IACL,CAAC,MAAA,EAAQ,MAAA,EAAQ,oBAAoB,CAAA;AAAA,IACrC,MAAM,WAAA,CAAY,MAAA,EAAQ,MAAA,EAAQ,oBAAoB,CAAA;AAAA,IACtD;AAAA,GACF;AACF;;;ACpHO,IAAK,gBAAA,qBAAAmB,iBAAAA,KAAL;AACL,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AACA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,aAAU,CAAA,CAAA,GAAV,SAAA;AACA,EAAAA,iBAAAA,CAAAA,iBAAAA,CAAA,YAAS,CAAA,CAAA,GAAT,QAAA;AAHU,EAAA,OAAAA,iBAAAA;AAAA,CAAA,EAAA,gBAAA,IAAA,EAAA;AAML,IAAK,cAAA,qBAAAC,eAAAA,KAAL;AACL,EAAAA,gBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,gBAAA,QAAA,CAAA,GAAS,QAAA;AAFC,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;AAKL,IAAK,gBAAA,qBAAAC,iBAAAA,KAAL;AACL,EAAAA,kBAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,kBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,kBAAA,QAAA,CAAA,GAAS,QAAA;AAHC,EAAA,OAAAA,iBAAAA;AAAA,CAAA,EAAA,gBAAA,IAAA,EAAA;AAML,IAAK,kBAAA,qBAAAC,mBAAAA,KAAL;AACL,EAAAA,oBAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,oBAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,oBAAA,KAAA,CAAA,GAAM,KAAA;AAHI,EAAA,OAAAA,mBAAAA;AAAA,CAAA,EAAA,kBAAA,IAAA,EAAA;AC4DZ,IAAM,qBAAqB,OAImC;AAAA,EAC5D,OAAA,EAAS,EAAA;AAAA,EACT,sBAAsB,EAAC;AAAA,EACvB,YAAY,MAAM;AAAA,EAAC,CAAA;AAAA,EACnB,oBAAA,EAAsB,KAAA;AAAA,EACtB,yBAAyB,MAAM;AAAA,EAAC,CAAA;AAAA,EAChC,qBAAA,EAAuB,KAAA;AAAA,EACvB,0BAA0B,MAAM;AAAA,EAAC,CAAA;AAAA,EACjC,sBAAA,EAAwB,MAAA;AAAA,EACxB,2BAA2B,MAAM;AAAA,EAAC,CAAA;AAAA,EAClC,kBAAA,EAAoB,KAAA;AAAA,EACpB,uBAAuB,MAAM;AAAA,EAAC,CAAA;AAAA,EAC9B,sBAAA,EAAwB,MAAA;AAAA,EACxB,2BAA2B,MAAM;AAAA,EAAC,CAAA;AAAA,EAClC,OAAA,EAAS,KAAA;AAAA,EACT,YAAY,MAAM;AAAA,EAAC,CAAA;AAAA,EACnB,sBAAA,EAAwB,KAAA;AAAA,EACxB,2BAA2B,MAAM;AAAA,EAAC,CAAA;AAAA,EAClC,SAAS,EAAC;AAAA,EACV,SAAS,EAAC;AAAA,EACV,sBAAA,EAAwB;AAAA,IACtB,qBAAqB,EAAC;AAAA,IACtB,wBAAwB,EAAC;AAAA,IACzB,aAAA,EAAe,KAAA;AAAA,IACf,aAAA,EAAe;AAAA,GACjB;AAAA,EACA,yBAAA,EAA2B,IAAA;AAAA,EAC3B,oBAAoB,EAAC;AAAA,EACrB,qBAAA,EAAuB,KAAA;AAAA,EACvB,0BAA0B,MAAM;AAAA,EAAC,CAAA;AAAA,EACjC,kBAAA,EAAoB,KAAA;AAAA,EACpB,uBAAuB,MAAM;AAAA,EAAC,CAAA;AAAA,EAC9B,OAAA,EAAS,MAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA,CAAA;AAEO,IAAM,iBAAA,GAAoBpB,aAAAA,CAAsC,kBAAA,EAAoB;ACrHpF,SAAS,oBAAA,GAAuD;AACrE,EAAA,OAAOC,WAAW,iBAAiB,CAAA;AACrC;ACFO,SAAS,4BAAA,GAAqE;AACnF,EAAA,MAAM,EAAE,kBAAA,EAAoB,oBAAA,EAAqB,GAAI,oBAAA,EAAqB;AAC1E,EAAA,MAAM,cAAc,oBAAA,EAAsB,oBAAA;AAE1C,EAAA,MAAM,yBAAA,GAA4BP,QAAQ,MAAM;AAC9C,IAAA,MAAM,UAAU,kBAAA,EAAoB,IAAA;AAAA,MAClC,CAAC,IAAA,KAAc,IAAA,EAAM,MAAA,KAAW,WAAA,EAAa;AAAA,KAC/C;AACA,IAAA,MAAM,cAAA,GAAiB,SAAS,QAAA,EAAU,IAAA;AAAA,MACxC,CAAC,IAAA,KAAc,IAAA,CAAK,GAAA,KAAQ,WAAA,EAAa;AAAA,KAC3C;AAEA,IAAA,OAAO,cAAA;AAAA,EACT,CAAA,EAAG,CAAC,kBAAA,EAAoB,WAAW,CAAC,CAAA;AAEpC,EAAA,OAAO,yBAAA;AACT;AChBO,SAAS,2BAAA,GAAoE;AAClF,EAAA,MAAM,EAAE,kBAAA,EAAoB,oBAAA,EAAqB,GAAI,oBAAA,EAAqB;AAC1E,EAAA,MAAM,aAAa,oBAAA,EAAsB,mBAAA;AAEzC,EAAA,MAAM,wBAAA,GAA2BA,QAAQ,MAAM;AAC7C,IAAA,MAAM,UAAU,kBAAA,EAAoB,IAAA;AAAA,MAClC,CAAC,IAAA,KAAc,IAAA,EAAM,MAAA,KAAW,UAAA,EAAY;AAAA,KAC9C;AACA,IAAA,MAAM,cAAA,GAAiB,SAAS,QAAA,EAAU,IAAA;AAAA,MACxC,CAAC,IAAA,KAAc,IAAA,CAAK,GAAA,KAAQ,UAAA,EAAY;AAAA,KAC1C;AACA,IAAA,OAAO,cAAA;AAAA,EACT,CAAA,EAAG,CAAC,kBAAA,EAAoB,UAAU,CAAC,CAAA;AAEnC,EAAA,OAAO,wBAAA;AACT;ACuCO,SAAS,mBACd,OAAA,EAC0B;AAC1B,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,oBAAA;AAAA,IACA,sBAAA;AAAA,IACA,MAAA,GAAS,KAAA;AAAA,IACT,SAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,EAAE,aAAA,EAAe,cAAA,EAAe,GAAI,wBAAwB,EAAC;AAEnE,EAAA,MAAM,aAAA,GAAgBA,QAAQ,MAAM;AAClC,IAAA,OAAA,CAAQ,OAAA,EAAS,MAAA,IAAU,CAAA,KAAM,cAAA,EAAgB,cAAA,IAAkB,QAAA,CAAA;AAAA,EACrE,GAAG,CAAC,cAAA,EAAgB,cAAA,EAAgB,OAAA,EAAS,MAAM,CAAC,CAAA;AAEpD,EAAA,MAAM,aAAA,GAAgBA,QAAQ,MAAM;AAClC,IAAA,OAAA,CAAQ,OAAA,EAAS,MAAA,IAAU,CAAA,KAAM,cAAA,EAAgB,cAAA,IAAkB,QAAA,CAAA;AAAA,EACrE,GAAG,CAAC,cAAA,EAAgB,cAAA,EAAgB,OAAA,EAAS,MAAM,CAAC,CAAA;AAGpD,EAAA,MAAM,sBAAA,GAA2DA,QAAQ,MAAM;AAC7E,IAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,CAAA;AAClC,IAAA,MAAM,OAAA,GACJ,eAAe,gBAAA,EAAkB,MAAA;AAAA,MAC/B,CAAC,EAAE,UAAA,EAAY,WAAA,EAAa,MAAA,EAAQ,QAAO,KAAM;AAC/C,QAAA,MAAM,aACH,CAAC,UAAA,IAAc,UAAU,UAAA,MACzB,CAAC,eAAe,MAAA,IAAU,WAAA,CAAA;AAC7B,QAAA,OAAO,MAAA,KAAA,MAAA,eAAsC,CAAC,MAAA,IAAU,SAAA;AAAA,MAC1D;AAAA,SACG,EAAC;AAER,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAC7B,MAAA,IAAI,QAAA,GAAW,KAAA;AACf,MAAA,MAAM,qBAAqB,sBAAA,KAA2B,MAAA;AACtD,MAAA,IAAI,OAAO,MAAA,KAAA,KAAA,YAAmC;AAC5C,QAAA,QAAA,GAAW,kBAAA,IAAsB,aAAA;AAAA,MACnC,CAAA,MAAA,IAAW,OAAO,MAAA,KAAA,KAAA,YAAmC;AACnD,QAAA,QAAA,GAAW,kBAAA,IAAsB,aAAA;AAAA,MACnC;AAEA,MAAA,OAAO;AAAA,QACL,GAAG,MAAA;AAAA,QACH,EAAA,EAAI,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,MAAA;AAAA,QAC3B,SAAA,EAAW,KAAA;AAAA,QACX,QAAA,EAAU,eAAe,QAAA,IAAY,EAAA;AAAA,QACrC;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG;AAAA,IACD,aAAA;AAAA,IACA,aAAA,EAAe,QAAA;AAAA,IACf,aAAA,EAAe,gBAAA;AAAA,IACf,sBAAA;AAAA,IACA,aAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,MAAM,QAAA,GAAWA,QAAQ,MAAM;AAC7B,IAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,CAAA;AAClC,IAAA,MAAM,YAAY,sBAAA,CAAuB,IAAA;AAAA,MACvC,CAAC,EAAE,MAAA,EAAQ,WAAA,EAAa,YAAW,KAAM;AACvC,QAAA,MAAM,aACH,CAAC,UAAA,IAAc,UAAU,UAAA,MACzB,CAAC,eAAe,MAAA,IAAU,WAAA,CAAA;AAC7B,QAAA,OAAO,WAAW,KAAA,IAAS,SAAA;AAAA,MAC7B;AAAA,KACF;AACA,IAAA,OAAO,WAAW,KAAA,IAAS,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,OAAA,EAAS,MAAA,EAAQ,sBAAsB,CAAC,CAAA;AAE5C,EAAA,MAAM,QAAA,GAAWA,QAAQ,MAAM;AAC7B,IAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,CAAA;AAClC,IAAA,MAAM,YAAY,sBAAA,CAAuB,IAAA;AAAA,MACvC,CAAC,EAAE,MAAA,EAAQ,WAAA,EAAa,YAAW,KAAM;AACvC,QAAA,MAAM,aACH,CAAC,UAAA,IAAc,UAAU,UAAA,MACzB,CAAC,eAAe,MAAA,IAAU,WAAA,CAAA;AAC7B,QAAA,OAAO,WAAW,KAAA,IAAS,SAAA;AAAA,MAC7B;AAAA,KACF;AACA,IAAA,OAAO,WAAW,KAAA,IAAS,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,OAAA,EAAS,MAAA,EAAQ,sBAAsB,CAAC,CAAA;AAG5C,EAAA,MAAM,mBAAA,GAAwDA,QAAQ,MAAM;AAC1E,IAAA,MAAM,MAAA,GAAS,SAAS,MAAA,IAAU,CAAA;AAClC,IAAA,IAAI,OAAA,GACF,eAAe,gBAAA,EAAkB,MAAA;AAAA,MAC/B,CAAC,EAAE,MAAA,EAAQ,MAAA,EAAQ,UAAA,EAAY,aAAY,KAAM;AAC/C,QAAA,IAAI,MAAA,KAAA,MAAA,aAAoC;AACtC,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAM,YACH,MAAA,IAAU,MAAA,KAAA,KAAA,cAAqC,SAAA,IAC/C,MAAA,IAAU,+BAAsC,SAAA,IAAa,SAAA,CAAA;AAEhE,UAAA,MAAM,aACH,CAAC,UAAA,IAAc,UAAU,UAAA,MACzB,CAAC,eAAe,MAAA,IAAU,WAAA,CAAA;AAE7B,UAAA,OAAO,SAAA,IAAa,aAAa,CAAC,MAAA;AAAA,QACpC,CAAA,MAAO;AACL,UAAA,OAAO,MAAA;AAAA,QACT;AAAA,MACF;AAAA,SACG,EAAC;AACR,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAC/B,QAAA,IAAI,CAAA,CAAE,8BAAoC,OAAO,EAAA;AACjD,QAAA,OAAO,CAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAC7B,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,QAAA;AAEJ,MAAA,IAAI,OAAO,MAAA,KAAA,MAAA,aAAoC;AAC7C,QAAA,QAAQ,OAAO,MAAA;AAAQ,UACrB,KAAK,KAAA;AACH,YAAA,KAAA,GAAQ,QAAA;AACR,YAAA,MAAA,GAAS,SAAA,IAAa,SAAA;AACtB,YAAA;AAAA,UACF,KAAK,KAAA;AACH,YAAA,KAAA,GAAQ,QAAA;AACR,YAAA,MAAA,GAAS,SAAA;AACT,YAAA;AAAA;AAGJ,QAAA,QAAA,GAAW,sBAAA,KAA2B,MAAA;AAEtC,QAAA,IAAI,OAAO,MAAA,KAAA,KAAA,YAAmC;AAC5C,UAAA,QAAA,GAAW,QAAA,IAAY,aAAA;AAAA,QACzB,CAAA,MAAA,IAAW,OAAO,MAAA,KAAA,KAAA,YAAmC;AACnD,UAAA,QAAA,GAAW,QAAA,IAAY,aAAA;AAAA,QACzB;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,GAAG,MAAA;AAAA,QACH,EAAA,EAAI,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,MAAA;AAAA,QAC3B,SAAA,EAAW,IAAA;AAAA,QACX,QAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG;AAAA,IACD,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,gBAAA;AAAA,IACf,MAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,sBAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,mBAAA;AAAA,IACA,sBAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;AClOO,SAAS,+BAAA,GAAkC;AAChD,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,oBAAA;AAAA,IACA,qBAAA;AAAA,IACA,sBAAA;AAAA,IACA,yBAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,MACE,oBAAA,EAAqB;AAEzB,EAAAiB,UAAU,MAAM;AACd,IAAA,MAAM,kBAAA,GAAqB,sBAAA,CAAuB,mBAAA,CAAoB,CAAC,CAAA;AAEvE,IAAA,MAAM,sBAAA,GACJ,uBAAuB,mBAAA,EAAqB,IAAA;AAAA,MAC1C,CAAC,SAAS,IAAA,CAAK,MAAA,KAAA,MAAA;AAAA,KACjB;AAEF,IAAA,MAAM,OAAA,GAAU,uBAAuB,mBAAA,CAAoB,IAAA;AAAA,MACzD,CAAC,SAAS,IAAA,CAAK,MAAA,KAAA,KAAA;AAAA,KACjB;AACA,IAAA,MAAM,UAAA,GAAa,uBAAuB,sBAAA,CAAuB,IAAA;AAAA,MAC/D,CAAC,SAAS,IAAA,CAAK,MAAA,KAAA,KAAA;AAAA,KACjB;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,8CAAA;AAAA,QACA,oBAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,CAAC,oBAAA,IAAwB,CAAC,qBAAA,EAAuB;AACnD,QAAA,UAAA,CAAW,IAAI,CAAA;AACf,QAAA,yBAAA,CAA0B,sBAAuB,CAAA;AAAA,MACnD,CAAA,MAAO;AAEL,QAAA,IACE,sBAAA,EAAwB,MAAA,KAAA,KAAA,cACxB,CAAC,oBAAA,EACD;AACA,UAAA,UAAA,CAAW,IAAI,CAAA;AAEf,UAAA,IAAI,qBAAA,EAAuB;AACzB,YAAA,IAAI,uBAAuB,SAAA,EAAW;AACpC,cAAA,MAAM,SAAS,OAAA,IAAW,kBAAA;AAC1B,cAAA,IAAI,MAAA,4BAAkC,MAAM,CAAA;AAAA,YAC9C,CAAA,MAAO;AACL,cAAA,MAAM,SAAS,UAAA,IAAc,kBAAA;AAC7B,cAAA,IAAI,MAAA,4BAAkC,MAAM,CAAA;AAAA,YAC9C;AAAA,UACF,CAAA,MAAO;AAEL,YAAA,IAAI,kBAAA,4BAA8C,kBAAkB,CAAA;AAAA,UACtE;AAAA,QACF,CAAA,MAAA;AAAA;AAAA,UAEE,sBAAA,EAAwB,8BACxB,CAAC;AAAA,UACD;AACA,UAAA,UAAA,CAAW,IAAI,CAAA;AACf,UAAA,IAAI,kBAAA,4BAA8C,kBAAkB,CAAA;AAAA,QACtE;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,EAAG;AAAA,IACD,oBAAA;AAAA,IACA,qBAAA;AAAA,IACA,OAAA;AAAA,IACA,sBAAA;AAAA,IACA,sBAAA;AAAA,IACA,yBAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AC7DO,IAAM,2BAA2B,MAAM;AAC5C,EAAA,MAAM,EAAE,oBAAA,EAAsB,sBAAA,EAAuB,GAAI,oBAAA,EAAqB;AAC9E,EAAA,MAAM,EAAE,OAAA,EAASU,gBAAAA,EAAgB,GAAI,kBAAA,EAAmB;AACxD,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,cAAA,EAAe;AAEhC,EAAA,MAAM,cAAc,oBAAA,EAAsB,oBAAA;AAC1C,EAAA,MAAM,aAAa,oBAAA,EAAsB,mBAAA;AAEzC,EAAA,MAAM,OAAA,GAAUnB,YAAY,YAAY;AACtC,IAAA,MAAM,iBAAA,GAAoB,MAAM,SAAA,CAAU,IAAA;AAAA,MACxC,CAAC,IAAA,KAAS,IAAA,CAAK,OAAA,EAAS,QAAQ,WAAA,EAAa;AAAA,KAC/C;AACA,IAAA,MAAM,gBAAA,GAAmB,MAAM,SAAA,CAAU,IAAA;AAAA,MACvC,CAAC,IAAA,KAAS,IAAA,CAAK,OAAA,EAAS,QAAQ,UAAA,EAAY;AAAA,KAC9C;AAEA,IAAA,IACE,oDACA,iBAAA,EACA;AACA,MAAA,MAAMmB,gBAAAA,CAAgB;AAAA,QACpB,OAAA,EAAS,CAAC,iBAAA,CAAkB,EAAE;AAAA,OAC/B,CAAA;AAAA,IACH,CAAA,MAAA,IACE,sDACA,gBAAA,EACA;AACA,MAAA,MAAMA,gBAAAA,CAAgB;AAAA,QACpB,OAAA,EAAS,CAAC,gBAAA,CAAiB,EAAE;AAAA,OAC9B,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG;AAAA,IACD,IAAA,EAAM,SAAA;AAAA,IACN,sBAAA;AAAA,IACA,WAAA,EAAa,GAAA;AAAA,IACb,UAAA,EAAY,GAAA;AAAA,IACZA;AAAA,GACD,CAAA;AAED,EAAA,OAAO,OAAA;AACT;AC9CO,IAAM,6BAA6B,CAAC;AAAA,EACzC;AACF,CAAA,KAEM;AACJ,EAAA,OAAO3B,OAAAA;AAAA,IACL,MAAM,cAAc,kBAAA,EAAoB,aAAA;AAAA,IACxC,CAAC,YAAY;AAAA,GACf;AACF;ACAO,IAAM,oCAAoC,CAAC;AAAA,EAChD;AACF,CAAA,KAEM;AACJ,EAAA,MAAM,EAAE,kBAAA,EAAmB,GAAI,YAAA,IAAgB,EAAC;AAEhD,EAAA,OAAOA,QAAQ,MAAM;AACnB,IAAA,MAAM,uBAAoC,EAAC;AAE3C,IAAA,IAAI,oBAAoB,UAAA,EAAY;AAClC,MAAA,oBAAA,CAAqB,IAAA,CAAK;AAAA,QACxB,GAAA,EAAK,aAAA;AAAA,QACL,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,oBAAA;AAAA,EACT,CAAA,EAAG,CAAC,kBAAkB,CAAC,CAAA;AACzB;ACCO,IAAM,wCAAwC,CAGnD;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAUM;AACJ,EAAA,MAAM,EAAE,kBAAA,EAAmB,GAAI,YAAA,IAAgB,EAAC;AAChD,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,oBAAA,EAAqB;AAEzC,EAAA,MAAM,QAAA,GAAWA,QAAQ,MAAM;AAC7B,IAAA,MAAM,YAAA,GAAe,QAAA;AACrB,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,kBAAA;AAAA,IACT;AACA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,EAAE,MAAA,GAAS,EAAC,EAAE,GAAI,QAAA;AACxB,MAAA,MAAM,WAAA,GAAc,QAAQ,KAAA,EAAO,MAAA;AACnC,MAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,QAAA,OAAO,sBAAA;AAAA,MACT,CAAA,MAAA,IAAW,WAAA,IAAe,WAAA,GAAc,CAAA,EAAG;AACzC,QAAA,OAAO,uBAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,gBAAA;AAAA,EACT,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,OAAOA,QAAqB,MAAM;AAChC,IAAA,MAAM,wBAAA,GAAwC;AAAA,MAC5C;AAAA,QACE,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAQ,SAAiB,KAAA,IAAS;AAAA,OACpC;AAAA,MACA;AAAA,QACE,GAAA,EAAK,WAAA;AAAA,QACL,KAAA,EACE,OAAO,MAAA,KAAW,WAAA,GACd,OAAO,QAAA,CAAS,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,QAAA,GACzC;AAAA,OACR;AAAA,MACA;AAAA,QACE,GAAA,EAAK,YAAA;AAAA,QACL,KAAA,EAAO;AAAA;AACT,KACF;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,wBAAA,CAAyB,IAAA,CAAK;AAAA,QAC5B,GAAA,EAAK,aAAA;AAAA,QACL,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,wBAAA,CAAyB,IAAA,CAAK;AAAA,QAC5B,GAAA,EAAK,2BAAA;AAAA,QACL,KAAA,EAAO,KAAK,SAAA,CAAU;AAAA,UACpB,GAAG,kBAAA;AAAA,UACH,UAAW,OAAA,EAAiB;AAAA,SAC7B;AAAA,OACF,CAAA;AAAA,IACH;AAEA,IAAA,IAAK,OAAA,EAAiB,YAAY,OAAA,EAAS;AACzC,MAAA,wBAAA,CAAyB,IAAA,CAAK;AAAA,QAC5B,GAAA,EAAK,UAAA;AAAA,QACL,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAEA,IAAA,IACE,sBAAA,IACA,CAAC,sBAAA,CAAuB,EAAE,OAAA,EAAS,SAAS,OAAA,EAAS,EAAC,EAAG,CAAA,EACzD;AACA,MAAA,wBAAA,CAAyB,IAAA,CAAK;AAAA,QAC5B,GAAA,EAAK,gBAAA;AAAA,QACL,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,wBAAA;AAAA,EACT,CAAA,EAAG,CAAC,kBAAA,EAAoB,OAAA,EAAS,SAAS,QAAA,EAAU,OAAA,EAAS,sBAAsB,CAAC,CAAA;AACtF;ACzGO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,IAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAuC;AACrC,EAAA,MAAM,EAAE,oBAAA,EAAsB,mBAAA,EAAoB,GAAI,iBAAiB,EAAC;AACxE,EAAA,MAAM,EAAE,OAAA,EAAS2B,gBAAAA,EAAgB,GAAI,kBAAA,EAAmB;AAExD,EAAAV,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,oBAAA,IAAwB,CAAC,mBAAA,EAAqB;AAE5D,IAAA,MAAM,iBAAA,GAAoB,OAAO,WAAA,KAAkD;AACjF,MAAA,IAAI,CAAC,WAAA,EAAa;AAElB,MAAA,MAAM,OAAA,GAAU,KAAK,SAAA,EAAW,IAAA;AAAA,QAC9B,CAAC,IAAA,KACC,IAAA,CAAK,OAAA,EAAS,MAAA,KAAW,aAAa,MAAA,IAAU,IAAA,CAAK,OAAA,EAAS,GAAA,KAAQ,WAAA,EAAa;AAAA,OACvF;AAEA,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAMU,gBAAAA,CAAgB;AAAA,UACpB,OAAA,EAAS,CAAC,OAAA,CAAQ,EAAE;AAAA,SACrB,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAGA,IAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,MAAA,iBAAA,CAAkB,oBAAoB,CAAA;AAAA,IACxC;AAGA,IAAA,IAAI,SAAS,YAAA,EAAc;AACzB,MAAA,iBAAA,CAAkB,mBAAmB,CAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,qBAAqB,oBAAA,EAAsB,OAAA,EAASA,gBAAe,CAAC,CAAA;AAChF;ACpCO,SAAS,8BAAA,CAA+B;AAAA,EAC7C,IAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,EAAE,sBAAA,EAAwB,yBAAA,EAA2B,oBAAA,KACzD,oBAAA,EAAqB;AACvB,EAAA,MAAM,EAAE,cAAA,EAAgB,aAAA,EAAc,GAAI,sBAAA,CAAuB;AAAA,IAC/D,aAAA,EAAe,oBAAA;AAAA,IACf;AAAA,GACD,CAAA;AAED,EAAA,MAAM,iBAAA,GAAoB3B,QAAQ,MAAM;AAEtC,IAAA,IAAI,CAAC,6BAA6B,sBAAA,KAAA,MAAA,aAAkD;AAClF,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,sDAAuD,cAAA,EAAgB;AACzE,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,oDAAsD,aAAA,EAAe;AACvE,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,OAAA,EAAS,iBAAiB,sBAAA,KAAA,SAAA,gBAAqD;AACjF,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,CAAC,OAAA,EAAS,YAAA,IAAgB,sBAAA,KAAA,QAAA,eAAoD;AAChF,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,yBAAA;AAAA,EACT,CAAA,EAAG;AAAA,IACD,sBAAA;AAAA,IACA,yBAAA,EAA2B,OAAA;AAAA,IAC3B,yBAAA,EAA2B,OAAA;AAAA,IAC3B,cAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,OAAO,iBAAA;AACT;AC7BO,IAAM,qBAAqB,CAAiD;AAAA,EACjF,OAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,6BAAA,GAAgC,MAAA;AAAA,EAChC,OAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,KAAgF;AAC9E,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIgB,SAAS,EAAE,CAAA;AACzC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,sBAAA,EAAwB,yBAAyB,CAAA,GAAIA,QAAAA;AAAA,IAC1D;AAAA,GACF;AACA,EAAA,MAAM,CAAC,sBAAA,EAAwB,yBAAyB,CAAA,GACtDA,QAAAA,EAAyC;AAC3C,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,SAAS,KAAK,CAAA;AACtE,EAAA,MAAM,CAAC,qBAAA,EAAuB,wBAAwB,CAAA,GAAIA,SAAS,KAAK,CAAA;AACxE,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClE,EAAA,MAAM,CAAC,sBAAA,EAAwB,yBAAyB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1E,EAAA,MAAM,CAAC,qBAAA,EAAuB,wBAAwB,CAAA,GAAIA,SAAS,KAAK,CAAA;AACxE,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAElE,EAAA,MAAM,yBAAyB,kBAAA,CAAmB;AAAA,IAChD,OAAA;AAAA,IACA,oBAAA,EAAsB,aAAA;AAAA,IAGtB,sBAEF,CAAC,CAAA;AAGD,EAAA,MAAM,iBAAA,GAAoBhB,QAAQ,MAAM;AACtC,IAAA,OAAO;AAAA,MACL,eAAe,oBAAA,EAAsB,MAAA;AAAA,MACrC,eAAe,mBAAA,EAAqB;AAAA,KACtC,CAAE,OAAO,OAAO,CAAA;AAAA,EAClB,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,MAAM,EAAE,IAAA,EAAM,kBAAA,GAAqB,EAAC,KAAM,oBAAA,CAAqB;AAAA,IAC7D,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,MAAM,yBAAA,GAA4BA,QAAQ,MAAM;AAC9C,IAAA,IAAI,sBAAA,KAAA,MAAA,aAAkD;AACpD,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,SACJ,sBAAA,KAAA,SAAA,iBACI,aAAA,EAAe,oBAAA,EAAsB,MAAA,GACrC,eAAe,mBAAA,EAAqB,MAAA;AAC1C,IAAA,MAAM,MACJ,sBAAA,KAAA,SAAA,iBACI,aAAA,EAAe,oBAAA,EAAsB,GAAA,GACrC,eAAe,mBAAA,EAAqB,GAAA;AAC1C,IAAA,MAAMH,WAAU,kBAAA,EAAoB,IAAA,CAAK,CAAC,CAAA,KAAW,CAAA,CAAE,WAAW,MAAM,CAAA;AACxE,IAAA,MAAMc,QAAAA,GAAUd,UAAS,QAAA,EAAU,IAAA,CAAK,CAAC,CAAA,KAAW,CAAA,CAAE,QAAQ,GAAG,CAAA;AACjE,IAAA,OAAOA,YAAWc,QAAAA,GAAU,EAAE,SAAAd,QAAAA,EAAS,OAAA,EAAAc,UAAQ,GAAI,IAAA;AAAA,EACrD,CAAA,EAAG,CAAC,kBAAA,EAAoB,aAAA,EAAe,sBAAsB,CAAC,CAAA;AAE9D,EAAA,uBACEiB,GAAAA;AAAA,IAAC,iBAAA,CAAkB,QAAA;AAAA,IAAlB;AAAA,MACC,KAAA,EAAO;AAAA,QACL,OAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAA;AAAA,QACA,oBAAA;AAAA,QACA,uBAAA;AAAA,QACA,qBAAA;AAAA,QACA,wBAAA;AAAA,QACA,oBAAA,EAAsB,aAAA;AAAA,QACtB,sBAAA;AAAA,QACA,yBAAA;AAAA,QACA,kBAAA;AAAA,QACA,qBAAA;AAAA,QACA,sBAAA;AAAA,QACA,yBAAA;AAAA,QACA,sBAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAA;AAAA,QACA,sBAAA;AAAA,QACA,yBAAA;AAAA,QACA,yBAAA;AAAA,QACA,kBAAA;AAAA,QACA,OAAA;AAAA,QACA,qBAAA;AAAA,QACA,wBAAA;AAAA,QACA,kBAAA;AAAA,QACA,qBAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;ACtGO,SAAS,eAAA,CACd,WACA,OAAA,EACM;AACN,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,IAAA,GAAO,KAAA;AAAA,IACP,IAAA,GAAO,IAAA;AAAA,IACP,UAAA,GAAa,KAAA;AAAA,IACb,SAAA,GAAY;AAAA,GACd,GAAI,OAAA;AAEJ,EAAAX,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,yBAAyB,WAAA,EAAa;AAC/C,MAAA,OAAA,CAAQ,KAAK,yDAAyD,CAAA;AACtE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,SAAA,CAAU,OAAA;AAE1B,IAAA,MAAM,eAAA,GAAkB;AAAA,MACtB,IAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAI,oBAAA,CAAqB,CAAC,OAAA,KAAY;AACrD,MAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,KAAU;AACzB,QAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,UAAA,QAAA,EAAS;AACT,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,QAAA,CAAS,UAAA,EAAW;AAAA,UACtB;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH,GAAG,eAAe,CAAA;AAElB,IAAA,QAAA,CAAS,QAAQ,OAAO,CAAA;AAExB,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,UAAA,EAAW;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,QAAA,EAAU,MAAM,IAAA,EAAM,UAAA,EAAY,SAAS,CAAC,CAAA;AAC7D;AC3CO,SAAS,WAAA,CACd,WACA,OAAA,EACS;AACT,EAAA,MAAM,EAAE,YAAY,GAAA,EAAK,QAAA,GAAW,KAAM,IAAA,GAAO,IAAA,EAAM,YAAW,GAAI,OAAA;AAEtE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAID,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,UAAA,GAAaf,OAAmC,MAAS,CAAA;AAC/D,EAAA,MAAM,eAAA,GAAkBA,OAAO,KAAK,CAAA;AAEpC,EAAAgB,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW,OAAA,IAAW,OAAO,yBAAyB,WAAA,EAAa;AACtE,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,IAAQ,gBAAgB,OAAA,EAAS;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,SAAA,CAAU,OAAA;AAG1B,IAAA,MAAM,aAAa,MAAM;AACvB,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,YAAA,CAAa,WAAW,OAAO,CAAA;AAC/B,QAAA,UAAA,CAAW,OAAA,GAAU,MAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,WAAW,IAAI,oBAAA;AAAA,MACnB,CAAC,OAAA,KAAY;AACX,QAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,KAAA,KAAU;AAEzB,UAAA,YAAA,CAAa,MAAM,cAAc,CAAA;AAEjC,UAAA,IAAI,MAAM,cAAA,EAAgB;AAExB,YAAA,UAAA,CAAW,OAAA,GAAU,WAAW,MAAM;AAEpC,cAAA,IAAI,IAAA,IAAQ,gBAAgB,OAAA,EAAS;AACnC,gBAAA;AAAA,cACF;AAEA,cAAA,UAAA,EAAW;AACX,cAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAE1B,cAAA,IAAI,IAAA,EAAM;AACR,gBAAA,QAAA,CAAS,UAAA,EAAW;AAAA,cACtB;AAAA,YACF,GAAG,QAAQ,CAAA;AAAA,UACb,CAAA,MAAO;AAEL,YAAA,UAAA,EAAW;AAAA,UACb;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,IAAA;AAAA,QACN,UAAA,EAAY,KAAA;AAAA,QACZ;AAAA;AACF,KACF;AAEA,IAAA,QAAA,CAAS,QAAQ,OAAO,CAAA;AAExB,IAAA,OAAO,MAAM;AACX,MAAA,UAAA,EAAW;AACX,MAAA,QAAA,CAAS,UAAA,EAAW;AAAA,IACtB,CAAA;AAAA,EACF,GAAG,CAAC,SAAA,EAAW,WAAW,QAAA,EAAU,IAAA,EAAM,UAAU,CAAC,CAAA;AAErD,EAAA,OAAO,SAAA;AACT;AC7DA,SAAS,wBAAA,CACP,aACA,OAAA,EACQ;AACR,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,YAAY,WAAA,EAAY;AAG1C,EAAA,IAAI,OAAA,EAAS,aAAA,GAAgB,SAAS,CAAA,EAAG;AACvC,IAAA,OAAO,OAAA,CAAQ,cAAc,SAAS,CAAA;AAAA,EACxC;AAGA,EAAA,IAAI,OAAA,EAAS,WAAA,EAAa,QAAA,CAAS,SAAS,CAAA,EAAG;AAC7C,IAAA,IAAI,cAAc,IAAA,EAAM;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAA,EAAS,WAAA,EAAa,QAAA,CAAS,SAAS,CAAA,EAAG;AAC7C,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAA,EAAS,WAAA,EAAa,QAAA,CAAS,SAAS,CAAA,EAAG;AAC7C,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAA,EAAS,aAAA,EAAe,QAAA,CAAS,SAAS,CAAA,EAAG;AAC/C,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,IAAI,cAAc,IAAA,EAAM;AACtB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,OAAO,YAAY,WAAA,EAAY;AACjC;AAgDO,SAAS,cAAA,CACd,OAAA,GAAiC,EAAC,EACsB;AACxD,EAAA,MAAM;AAAA,IACJ,QAAA,GAAW,cAAA;AAAA,IACX,QAAA,GAAW,aAAA;AAAA,IACX,aAAA,GAAgB,GAAA,GAAO,EAAA,GAAK,EAAA,GAAK,EAAA;AAAA;AAAA,IACjC,aAAA;AAAA,IACA,WAAA,GAAc,IAAA;AAAA,IACd,GAAG;AAAA,GACL,GAAI,OAAA;AAEJ,EAAA,MAAM,UAAU,YAAkD;AAEhE,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,MAAA,GAAS,gBAAiC,QAAQ,CAAA;AACxD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,QAAQ,CAAA;AAErC,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MACpE;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AAGnC,MAAA,MAAM,WAAA,GAAc,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAS,IAAA;AAE1C,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAA,CAAQ,KAAK,8CAA8C,CAAA;AAC3D,QAAA,OAAO,KAAA,CAAA;AAAA,MACT;AAGA,MAAA,MAAM,aAAA,GAAgB,wBAAA;AAAA,QACpB,WAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,OAAA,GAA2B;AAAA,QAC/B,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ;AAAA,OACF;AAGA,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,UAAU,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,KAAQ,aAAa,CAAA;AACnD,QAAA,eAAA,CAAgB,QAAA,EAAU,OAAA,EAAS,EAAE,OAAA,EAAS,CAAA;AAAA,MAChD;AAEA,MAAA,OAAO,OAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6CAA6C,KAAK,CAAA;AAChE,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,CAAA;AAEA,EAAA,OAAOb,MAAAA;AAAA,IACL,QAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAgBO,SAAS,oBAAA,CACd,WAAW,aAAA,EACkB;AAC7B,EAAA,OAAO,eAAA,CAAiC,QAAQ,CAAA,IAAK,MAAA;AACvD;AAYO,SAAS,qBAAA,CAAsB,WAAW,aAAA,EAAqB;AACpE,EAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACvC,IAAA,YAAA,CAAa,WAAW,QAAQ,CAAA;AAAA,EAClC;AACF","file":"index.mjs","sourcesContent":["import { createContext } from 'react'\nimport type { ShopifyClient, ShopifyConfig } from '@anker-in/shopify-sdk'\nimport type {\n CookieAdapter,\n RouterAdapter,\n UserContextAdapter,\n CartCookieAdapter,\n} from '../adapters'\n\nexport interface ShopifyContextValue {\n client: ShopifyClient\n config: ShopifyConfig\n locale: string\n locales?: string[]\n cookieAdapter: CookieAdapter\n cartCookieAdapter: CartCookieAdapter\n routerAdapter?: RouterAdapter\n userAdapter?: UserContextAdapter\n}\n\nexport const ShopifyContext = createContext<ShopifyContextValue | null>(null)\n","import { useContext } from 'react'\nimport { ShopifyContext } from './context'\n\n/**\n * Hook to access Shopify context\n * @throws Error if used outside ShopifyProvider\n */\nexport function useShopify() {\n const context = useContext(ShopifyContext)\n\n if (!context) {\n throw new Error('useShopify must be used within a ShopifyProvider')\n }\n\n return context\n}\n","import type {\n NormalizedLineItem,\n NormalizedProduct,\n NormalizedProductVariant,\n} from '@anker-in/shopify-sdk'\n\nexport type AutoFreeGift = {\n currentTier: {\n amount: number\n gift?: NormalizedProductVariant\n }\n nextTierGoal: {\n amount: number\n gift?: NormalizedProductVariant\n }\n}\n\nexport type DiscountLabel = {\n cart_checkout_label: string\n product_label: string\n sold_out_label: string\n}\n\nexport type AutoFreeGiftMainProduct = {\n spend_money_type: number\n variant_id_list: string[]\n all_store_variant: boolean\n}\n\nexport type GiftProduct = {\n spend_sum_money: number\n gift_type: number\n reward_list: {\n get_unit: number\n variant_id: string\n bak_variant_id_list: null\n }[]\n}\n\nexport type AutoFreeGiftConfig = Config[]\n\n// 定义规则条件类型\nexport type RuleCondition = {\n with_special_url_params: string[] // 包含特殊URL参数\n without_special_url_params: string[] // 不包含特殊URL参数\n with_user_tags: string[] // 包含用户标签\n without_user_tags: string[] // 不包含用户标签\n}\n\n// main_product\nexport type MainProductInfo = {\n spend_money_type: SpendMoneyType\n variant_list: VariantItem[]\n all_store_variant: boolean\n}\n\n// 定义配置类型 - 根据JSON结构更新\nexport type Config = {\n // 规则ID\n rule_id: number\n // 规则类型\n rule_type: RuleType\n // 折扣标签\n discount_label: {\n cart_checkout_label: string\n product_label: string\n sold_out_label: string\n }\n // 前端标签\n frontend_labels: { key: string; label: string; desc: string }[]\n // 应用单位\n apply_unit: number\n // 规则结果\n rule_result: {\n // 购买规则类型\n buy_rule_type: BuyRuleType\n // 花费获取奖励\n spend_get_reward: {\n // 主产品\n main_product: MainProductInfo\n // 礼品产品\n gift_product: GiftProductItem[]\n }\n // 买赠奖励\n buy_get_reward: {\n // 主产品\n main_product: MainProductInfo\n // 礼品产品\n gift_product: GiftProductItem[] | null\n }\n }\n // 规则条件\n rule_conditions?: RuleCondition[]\n}\n\nexport interface GiftTier {\n spend_sum_money: number // 消费门槛金额\n gift_type: number // 礼品类型\n reward_list: RewardItem[] // 满足此门槛后可获得的奖励列表\n}\n\nexport interface RewardItem {\n get_unit: number // 获得单位\n variant_list: VariantItem[] // 变体列表\n}\n\nexport interface VariantItem {\n variant_id: string // 变体ID\n sku: string // 库存单位\n handle: string // 处理标识\n discount_value: number // 折扣值\n}\n\nexport interface GiftProductItem {\n spend_sum_money: number // 消费总金额\n gift_type: number // 礼品类型\n reward_list: RewardItem[] // 奖励列表\n}\n\nexport enum RuleType {\n AUTO_FREE_GIFT = 1, // 自动赠品\n BUNDLE = 2, // 组合\n VOLUME_DISCOUNT = 3, // 量价折扣\n ORDER_DISCOUNT = 4, // 订单折扣\n PRICE_DISCOUNT = 5, // 价格折扣\n}\n\nexport enum BuyRuleType {\n BUY_GET_GIFT = 1, // 买赠\n SPEND_GET_GIFT = 2, // 满赠\n}\n\nexport enum SpendMoneyType {\n ORIGIN_PRICE = 1, // 原价\n DISCOUNT_PRICE = 2, // 折扣价\n}\n\n// calcAutoFreeGift\n// 计算型 Hook 的返回类型\nexport interface FunctionGiftResult {\n qualifyingGift: FormattedGift | null // 当前应得的赠品\n nextTierGoal: GiftTier | null // 下一个目标阶梯\n activeCampaign: Config | null // 当前生效的活动配置\n isLoading: boolean // 依赖数据是否加载中\n giftProductsResult?: NormalizedProduct[] | []\n}\n\n// 格式化后的赠品信息,用于添加购物车\nexport interface FormattedGift {\n tier: GiftTier // 原始阶梯信息\n itemsToAdd: CartLineInput[] // 准备好添加购物车的商品列表\n}\n\n// 购物车行项目输入类型 (Shopify API)\nexport interface CartLineInput {\n variant: {\n id: string\n handle: string\n sku: string\n }\n quantity: number\n attributes: { key: string; value: string }[]\n}\n\n// cart context AutoFreeGift\nexport type AutoFreeGiftItem = {\n line: NormalizedLineItem\n isSoldOut: boolean\n}\n\nexport type AutoFreeGiftList = AutoFreeGiftItem[] | []\n","import { SWRMutationConfiguration } from 'swr/mutation'\n\nexport const currencyCodeMapping = {\n us: 'USD',\n ca: 'CAD',\n gb: 'GBP',\n eu: 'EUR',\n au: 'AUD',\n nz: 'NZD',\n de: 'EUR',\n fr: 'EUR',\n es: 'EUR',\n it: 'EUR',\n nl: 'EUR',\n pl: 'EUR',\n ro: 'EUR',\n} as Record<string, string>\n\nexport const defaultSWRMutationConfiguration: SWRMutationConfiguration<any, any, any, any, any> & {\n throwOnError?: boolean\n} = {\n throwOnError: false,\n}\n\n// Shopify 常量定义\nexport const CUSTOMER_ATTRIBUTE_KEY = '_discounts_function_env'\nexport const CUSTOMER_SCRIPT_GIFT_KEY = '_giveaway_gradient_gifts'\n\nexport const CODE_AMOUNT_KEY = '_sku_code_money'\nexport const SCRIPT_CODE_AMOUNT_KEY = '_code_money'\n\n// 主产品公开 code\nexport const MAIN_PRODUCT_CODE = ['WS24', 'WSTD', 'WS7D', 'WSCP', 'WSPE', 'WSPD']\n","import type { NormalizedLineItem } from '@anker-in/shopify-sdk'\nimport type { AddToCartLineItem } from '../use-add-to-cart'\n\n/**\n * Normalize AddToCartLineItem[] to NormalizedLineItem[] format\n * This is used to calculate gifts from lines before they are added to cart\n */\nexport function normalizeAddToCartLines(lines: AddToCartLineItem[]): NormalizedLineItem[] {\n return lines\n .filter((line) => line.variant?.id)\n .map((line, index) => {\n const variant = line.variant!\n const product = variant.product\n const quantity = line.quantity || 1\n\n // Calculate prices\n const price = variant.finalPrice?.amount\n ? Number(variant.finalPrice.amount)\n : variant.compareAtPrice?.amount\n ? Number(variant.compareAtPrice.amount)\n : variant.price?.amount\n ? Number(variant.price.amount)\n : 0\n\n const subtotalAmount = price * quantity\n const totalAmount = subtotalAmount // No discounts before adding to cart\n\n return {\n id: `temp-line-${index}-${variant.id}`, // Temporary ID for pre-cart lines\n name: product?.title || variant.title || '',\n quantity,\n variantId: variant.id,\n productId: product?.id || variant.id.split('/').slice(0, -2).join('/'),\n totalAmount,\n subtotalAmount,\n discountAllocations: [],\n customAttributes: line.attributes || [],\n variant: {\n id: variant.id,\n price,\n listPrice: variant.compareAtPrice?.amount ? Number(variant.compareAtPrice.amount) : 0,\n sku: variant.sku || '',\n name: variant.title || '',\n image: variant.image\n ? {\n url: variant.image.url,\n altText: variant.image.altText || undefined,\n }\n : undefined,\n requiresShipping: false, // Default value, not available in NormalizedProductVariant\n availableForSale: variant.availableForSale ?? true,\n quantityAvailable: variant.quantityAvailable ?? 0,\n currentlyNotInStock: false, // Default value, will be updated when added to cart\n weight: variant.weight,\n metafields: variant.metafields,\n },\n product: product,\n path: product?.handle ? `/products/${product.handle}` : '',\n discounts: [],\n options: variant.selectedOptions?.map((opt: any) => ({\n name: opt.name,\n value: opt.value,\n })),\n }\n })\n}\n\n/**\n * Create a mock cart structure from AddToCartLineItem[]\n * This is useful for calculating gifts before actual cart operations\n */\nexport function createMockCartFromLines(lines: AddToCartLineItem[], existingCart?: any): any {\n const normalizedLines = normalizeAddToCartLines(lines)\n\n const subtotalPrice = normalizedLines.reduce((sum, line) => sum + line.subtotalAmount, 0)\n\n const totalPrice = normalizedLines.reduce((sum, line) => sum + line.totalAmount, 0)\n\n return {\n id: existingCart?.id || 'temp-cart-id',\n customerId: existingCart?.customerId,\n email: existingCart?.email,\n createdAt: existingCart?.createdAt || new Date().toISOString(),\n currency: existingCart?.currency || { code: 'USD' },\n taxesIncluded: existingCart?.taxesIncluded,\n lineItems: normalizedLines,\n totallineItemsDiscount: 0,\n orderDiscounts: 0,\n lineItemsSubtotalPrice: subtotalPrice,\n subtotalPrice,\n totalPrice,\n totalTaxAmount: 0,\n discountCodes: existingCart?.discountCodes || [],\n discountAllocations: [],\n url: existingCart?.url || '',\n ready: true,\n customAttributes: existingCart?.customAttributes,\n }\n}\n","export const getQuery = (): Record<string, string> => {\n const url = typeof window !== 'undefined' ? window.location.search : ''\n const theRequest: Record<string, string> = {}\n if (url.indexOf('?') != -1) {\n const str = url.substr(1),\n strs = str.split('&')\n for (let i = 0; i < strs.length; i++) {\n const parts = strs[i]?.split('=')\n const key = parts?.[0]\n const value = parts?.[1]\n if (key && value) {\n theRequest[key] = decodeURIComponent(value)\n }\n }\n }\n return theRequest\n}\n\nexport function atobID(id: string) {\n if (id && typeof id === 'string' && id.includes('/')) {\n return id.split('/').pop()?.split('?')?.shift()\n } else {\n return id\n }\n}\n\nexport function btoaID(id: string, type: 'ProductVariant' | 'Product' = 'ProductVariant') {\n return `gid://shopify/${type}/${id}`\n}\n\n// Export normalize utilities\nexport * from './normalize-add-to-cart-lines'\n","import {\n AutoFreeGiftMainProduct,\n SpendMoneyType,\n RuleCondition,\n FormattedGift,\n} from '../types/auto-free-gift'\nimport { CUSTOMER_ATTRIBUTE_KEY } from '../const'\nimport { atobID } from './index'\nimport type { UseScriptAutoFreeGiftResult } from '../feature/use-script-auto-free-gift'\nimport Cookies from 'js-cookie'\nimport Decimal from 'decimal.js'\nimport { getQuery } from './index'\nimport { Attribute, NormalizedProduct } from '@anker-in/shopify-sdk'\n\nexport const getMatchedMainProductSubTotal = (\n cartData: any,\n variant_list: AutoFreeGiftMainProduct['variant_id_list'],\n main_product: AutoFreeGiftMainProduct\n) => {\n const isAllStoreVariant = main_product?.all_store_variant ?? false\n const matchedList = cartData?.lineItems?.filter((line: any) => {\n // 包含在主商品列表中\n const { is_gift } = getDiscountEnvAttributeValue(line.customAttributes) // 获取折扣环境属性值\n return isAllStoreVariant\n ? !is_gift\n : variant_list?.find((item: any) => {\n return !is_gift && atobID(line.variantId) === item\n })\n })\n return (\n matchedList?.reduce((acc: number, line: any) => {\n return (\n acc +\n (main_product?.spend_money_type === SpendMoneyType.ORIGIN_PRICE\n ? Number(line.subtotalAmount) || 0\n : Number(line.totalAmount) || 0)\n )\n }, 0) || 0 // 计算总金额\n )\n}\n\nexport const safeParse = (str: string) => {\n try {\n return JSON.parse(str)\n } catch (err) {\n return {}\n }\n}\n\nexport const getDiscountEnvAttributeValue = (\n // 函数接受一个名为 attributes 的参数,其类型为包含 key 和 value 字符串属性的对象数组,默认值为空数组\n attributes: { key: string; value: string }[] = []\n) => {\n // 在 attributes 数组中查找 key 值等于 CUSTOMER_ATTRIBUTE_KEY 的对象,并将其赋值给 attr 变量\n const attr = attributes.find((attr) => attr.key === CUSTOMER_ATTRIBUTE_KEY)\n // 尝试解析 attr 对象的 value 属性为 JSON,如果解析失败或 attr 不存在,则返回一个空对象\n return safeParse(attr?.value ?? '') ?? {}\n}\n\nexport const checkAttributesUpdateNeeded = (\n oldAttributes: Attribute[],\n newAttributes: Attribute[],\n customAttributesNeedRemove: { key: string }[]\n) => {\n // 判断是否需要更新 attributes,需要更新的场景有:\n // 1. 有新的 attribute\n // 2. 有旧的 attribute 的 value 发生变化\n // 3. 有需要删除的 attribute, 且旧 attributes 中存在该 key\n return (\n oldAttributes.some((attr) => {\n const newAttr = newAttributes.find((newAttr) => newAttr.key === attr.key)\n return newAttr ? newAttr.value !== attr.value : true\n }) ||\n newAttributes.some((attr) => !oldAttributes.some((oldAttr) => oldAttr.key === attr.key)) ||\n customAttributesNeedRemove.some((removeAttr) =>\n oldAttributes.some((oldAttr) => oldAttr.key === removeAttr.key)\n )\n )\n}\n\n/**\n * 检查 source 数组是否包含 requiredItems 数组中的所有元素。\n * @param source - 源数据数组,例如用户的标签列表。\n * @param requiredItems - 必须包含的项的数组。\n * @returns boolean\n */\nconst containsAll = (source: string[], requiredItems: string[] = []): boolean => {\n // 如果没有必须包含的项,则条件默认满足。\n if (!requiredItems?.length) return true\n\n const sourceSet = new Set(source)\n // 检查每一个 requiredItem 是否都存在于 sourceSet 中。\n return requiredItems.every((item) => sourceSet.has(item))\n}\n\n/**\n * 检查 source 数组是否不包含 forbiddenItems 数组中的任何元素。\n * @param source - 源数据数组。\n * @param forbiddenItems - 禁止包含的项的数组。\n * @returns boolean\n */\nconst containsNone = (source: string[], forbiddenItems: string[] = []): boolean => {\n // 如果没有禁止的项,则条件默认满足。\n if (!forbiddenItems?.length) return true\n\n const sourceSet = new Set(source)\n // 只要在 sourceSet 中找到任何一个 forbiddenItem,条件就不满足。\n return !forbiddenItems.some((item) => sourceSet.has(item))\n}\n\nexport function preCheck(\n rule_conditions: RuleCondition[],\n userTags: string[],\n currentDealsTypes: string[]\n): boolean {\n // 1. 处理边界情况 (Guard Clauses),保持不变\n if (!Array.isArray(rule_conditions)) return false\n if (rule_conditions.length === 0) return true\n\n // 2. 使用 .some() 替代 for...of 循环和 break\n // .some() 会在找到第一个满足条件的元素后立即返回 true,并停止遍历,\n // 这完美地复刻了 for + break 的行为。\n return rule_conditions.some((rule) => {\n // 检查标签条件是否满足\n const tagsAreValid =\n containsAll(userTags, rule.with_user_tags) && containsNone(userTags, rule.without_user_tags)\n\n // 检查URL参数条件是否满足\n const paramsAreValid =\n containsAll(currentDealsTypes, rule.with_special_url_params) &&\n containsNone(currentDealsTypes, rule.without_special_url_params)\n\n // 只有当两个条件都满足时,此规则才算匹配\n return tagsAreValid && paramsAreValid\n })\n}\n\n// 缓存上一次的结果,避免重复计算\nlet formatScriptAutoFreeGiftCache: {\n key: string\n result: any[]\n} | null = null\n\nexport const formatScriptAutoFreeGift = ({\n scriptAutoFreeGiftResult,\n gradient_gifts,\n locale,\n}: {\n scriptAutoFreeGiftResult: UseScriptAutoFreeGiftResult\n gradient_gifts: any\n locale: string\n}) => {\n // 生成缓存键,用于判断输入是否发生变化\n const cacheKey = JSON.stringify({\n freeGiftLevel: scriptAutoFreeGiftResult?.freeGiftLevel\n ? {\n items:\n scriptAutoFreeGiftResult.freeGiftLevel.giveawayProducts?.map((item) => ({\n handle: item.handle,\n sku: item.sku,\n quantity: 1,\n })) || [],\n }\n : null,\n giftProductsLength: scriptAutoFreeGiftResult?.giftProductsResult?.length || 0,\n giftProductsIds: scriptAutoFreeGiftResult?.giftProductsResult?.map((p) => p.id).sort() || [],\n gradientGiftsId: gradient_gifts?.id || gradient_gifts?.name || '',\n locale,\n })\n\n // 如果缓存存在且键相同,直接返回缓存结果\n if (formatScriptAutoFreeGiftCache && formatScriptAutoFreeGiftCache.key === cacheKey) {\n return formatScriptAutoFreeGiftCache.result\n }\n\n // 计算新结果\n const result =\n scriptAutoFreeGiftResult?.freeGiftLevel?.giveawayProducts\n ?.filter((item) =>\n scriptAutoFreeGiftResult?.giftProductsResult?.some(\n (product) => product.handle === item.handle\n )\n )\n .map((item, index) => {\n const product = scriptAutoFreeGiftResult?.giftProductsResult?.find(\n (product) => product.handle === item.handle\n )\n const variants = product?.variants\n const variant = Array.isArray(variants)\n ? variants.find((v: any) => v.sku === item.sku)\n : undefined\n\n const query = getQuery()\n const utmCampaign = Cookies.get('utm_campaign') || (query as any)?.utm_campaign\n const addUTMFreeItem =\n gradient_gifts.activityAvailableQuery &&\n utmCampaign?.includes(gradient_gifts.activityAvailableQuery)\n\n let points_subscribe = false\n if (locale === 'au') {\n const isPointsSubscribe = Cookies.get('points_subscribe')\n points_subscribe = !!isPointsSubscribe\n }\n\n const customAttributes: { key: string; value: string }[] = [\n {\n key: '_giveaway_gradient_gifts',\n value: '_giveaway_gradient_gifts',\n },\n ...(points_subscribe\n ? [\n { key: '_amount_upgrade_multiple', value: '1.2' },\n { key: '_amount_upgrade_value', value: '40' },\n ]\n : []),\n ...(addUTMFreeItem && gradient_gifts?.activityQroperty\n ? [\n {\n key: gradient_gifts.activityQroperty,\n value: gradient_gifts.activityQroperty,\n },\n ]\n : []),\n ]\n\n const line = {\n id: product?.id + '_' + index,\n variantId: String(variant?.id),\n productId: String(product?.id),\n name: (product as any)?.name || (product as any)?.title || '',\n quantity: 1,\n discounts: [],\n path: product?.handle || '',\n variant: variant,\n totalAmount: 0,\n subtotalAmount: new Decimal(\n typeof variant?.price === 'object' ? variant?.price?.amount || 0 : variant?.price || 0\n ).toNumber(),\n options: [],\n discountAllocations: [],\n product: product,\n customAttributes,\n freeGiftVariant: undefined,\n relatedVariant: undefined,\n } as any\n\n return {\n line,\n isSoldOut: !variant?.availableForSale,\n }\n }) || []\n\n // 缓存结果\n formatScriptAutoFreeGiftCache = {\n key: cacheKey,\n result: result,\n }\n\n return result\n}\n\n// 缓存上一次的结果,避免重复计算\nlet formatFunctionAutoFreeGiftCache: {\n key: string\n result: any[]\n} | null = null\n\nexport const formatFunctionAutoFreeGift = ({\n qualifyingGift,\n giftProductsResult,\n locale,\n}: {\n locale: string\n qualifyingGift?: FormattedGift | null\n giftProductsResult?: NormalizedProduct[] | []\n}) => {\n // 生成缓存键,用于判断输入是否发生变化\n const cacheKey = JSON.stringify({\n qualifyingGift: qualifyingGift\n ? {\n spend: qualifyingGift.tier?.spend_sum_money,\n items:\n qualifyingGift.itemsToAdd?.map((item) => ({\n variantId: item.variant.id,\n handle: item.variant.handle,\n sku: item.variant.sku,\n quantity: item.quantity ?? 1,\n attributes: item.attributes,\n })) || [],\n }\n : null,\n giftProductsLength: giftProductsResult?.length || 0,\n giftProductsIds: giftProductsResult?.map((p) => p.id).sort() || [],\n locale,\n })\n\n // 如果缓存存在且键相同,直接返回缓存结果\n if (formatFunctionAutoFreeGiftCache && formatFunctionAutoFreeGiftCache.key === cacheKey) {\n return formatFunctionAutoFreeGiftCache.result\n }\n\n // 计算新结果\n const result =\n qualifyingGift?.itemsToAdd?.map((item, index) => {\n const product = giftProductsResult?.find((product) => product.handle === item.variant.handle)\n const variants = product?.variants\n const variant = Array.isArray(variants)\n ? variants.find((v: any) => v.sku === item.variant.sku)\n : undefined\n console.log('qualifyingGift variant', product, variant)\n\n const line = {\n id: product?.id + '_' + index,\n variantId: String(variant?.id),\n productId: String(product?.id),\n name: (product as any)?.name || (product as any)?.title || '',\n quantity: 1,\n discounts: [],\n path: product?.handle || '',\n variant: variant,\n totalAmount: 0,\n subtotalAmount: new Decimal(\n typeof variant?.price === 'object' ? variant?.price?.amount || 0 : variant?.price || 0\n ).toNumber(),\n options: [],\n discountAllocations: [],\n product: product,\n customAttributes: item.attributes,\n freeGiftVariant: undefined,\n relatedVariant: undefined,\n } as any\n return {\n line,\n isSoldOut: !variant?.availableForSale,\n }\n }) || []\n\n // 缓存结果\n formatFunctionAutoFreeGiftCache = {\n key: cacheKey,\n result: result,\n }\n\n return result\n}\n","import { useMemo, useRef } from 'react'\nimport {\n FunctionGiftResult,\n FormattedGift,\n CartLineInput,\n AutoFreeGiftConfig,\n} from '../types/auto-free-gift'\nimport { preCheck, getMatchedMainProductSubTotal } from '../utils/auto-free-gift'\nimport { CUSTOMER_ATTRIBUTE_KEY } from '../const'\nimport { btoaID } from '../utils'\nimport { getProductsByHandles } from '@anker-in/shopify-sdk'\nimport useSWR from 'swr'\nimport { useShopify } from '../../../provider'\nimport type { AddToCartLineItem } from '../use-add-to-cart'\nimport { createMockCartFromLines } from '../utils/normalize-add-to-cart-lines'\n\n/**\n * [计算型 Hook]\n * 根据购物车、活动配置和用户信息,计算出应得的赠品和下一个目标。\n * 此 Hook 不产生任何副作用。\n * 使用示例:\n * const { qualifyingGift, nextTierGoal, activeCampaign, isLoading } = useCalcAutoFreeGift(cart, autoFreeGiftConfig);\n *\n * 也可以传入 lines 参数来计算加购前的赠品:\n * const { qualifyingGift, nextTierGoal, activeCampaign, isLoading } = useCalcAutoFreeGift(cart, autoFreeGiftConfig, customer, lines);\n */\nexport const useCalcAutoFreeGift = (\n cart: any,\n autoFreeGiftConfig: AutoFreeGiftConfig,\n customer: any,\n lines?: AddToCartLineItem[]\n): FunctionGiftResult => {\n const tags = useMemo(() => customer?.tags || [], [customer?.tags])\n const isCustomerLoading = useMemo(() => (!customer ? true : false), [customer])\n const dealsType: string = '' // 可从URL或Context获取\n const { client, locale } = useShopify()\n\n // 使用 useRef 缓存 giftProductsResult,确保只执行一次\n const giftProductsCache = useRef<{\n data: any[] | null\n giftHandles: string[]\n } | null>(null)\n\n // 如果传入了 lines,则创建临时 cart 用于计算\n const effectiveCart = useMemo(() => {\n if (lines && lines.length > 0) {\n return createMockCartFromLines(lines, cart)\n }\n return cart\n }, [lines, cart])\n\n // 1. 找到当前生效的活动和用于计算的子总价\n const { activeCampaign, subtotal } = useMemo(() => {\n // 遍历所有活动配置\n for (const campaign of autoFreeGiftConfig) {\n const { rule_conditions = [], rule_result } = campaign\n const { spend_get_reward } = rule_result || {}\n\n // 前置检查,判断用户和环境是否满足活动条件\n const isPreCheckPassed = preCheck(rule_conditions, tags, dealsType ? [dealsType] : [])\n\n if (isPreCheckPassed && spend_get_reward) {\n // 计算参与活动的主商品的总价\n const matchedSubtotal = getMatchedMainProductSubTotal(\n effectiveCart,\n spend_get_reward.main_product?.variant_list?.map((v: any) => v.variant_id) || [],\n {\n spend_money_type: spend_get_reward.main_product?.spend_money_type || 1,\n variant_id_list:\n spend_get_reward.main_product?.variant_list?.map((v: any) => v.variant_id) || [],\n all_store_variant: spend_get_reward.main_product?.all_store_variant || false,\n }\n )\n\n // 如果有主商品在购物车中,则此活动为当前生效的活动\n if (matchedSubtotal > 0) {\n return { activeCampaign: campaign, subtotal: matchedSubtotal }\n }\n }\n }\n // 没有找到生效的活动\n return { activeCampaign: null, subtotal: 0 }\n }, [autoFreeGiftConfig, effectiveCart, tags, dealsType])\n\n // 2. 根据子总价,计算应得赠品和下一个目标\n const { qualifyingGift, nextTierGoal } = useMemo(() => {\n if (!activeCampaign || !activeCampaign.rule_result?.spend_get_reward?.gift_product) {\n return { qualifyingGift: null, nextTierGoal: null }\n }\n\n const giftTiers = activeCampaign.rule_result.spend_get_reward.gift_product\n\n // a. 找到当前满足条件的最高阶梯(按金额从高到低排序后查找)\n const qualifyingTier = [...giftTiers]\n .sort((a: any, b: any) => Number(b.spend_sum_money) - Number(a.spend_sum_money))\n .find((tier: any) => subtotal >= Number(tier.spend_sum_money))\n\n // b. 找到下一个目标阶梯 (第一个门槛比当前subtotal高的)\n const nextGoal = giftTiers.find((tier) => subtotal < Number(tier.spend_sum_money))\n\n if (!qualifyingTier) {\n return { qualifyingGift: null, nextTierGoal: nextGoal || null }\n }\n\n // c. 将应得的赠品阶梯格式化为待添加购物车的结构\n const formattedGift: FormattedGift = {\n tier: qualifyingTier,\n itemsToAdd: qualifyingTier.reward_list\n ?.map((reward: any) => {\n const giftProduct = reward?.variant_list?.[0]\n if (!giftProduct) return null\n return {\n variant: {\n id: btoaID(giftProduct.variant_id),\n handle: giftProduct.handle,\n sku: giftProduct.sku,\n },\n quantity: reward?.get_unit || 1,\n attributes: [\n {\n key: CUSTOMER_ATTRIBUTE_KEY,\n value: JSON.stringify({\n is_gift: true,\n rule_id: activeCampaign.rule_id,\n spend_sum_money: qualifyingTier.spend_sum_money,\n }),\n },\n ],\n }\n })\n .filter((item: any): item is CartLineInput => item !== null),\n }\n\n return { qualifyingGift: formattedGift, nextTierGoal: nextGoal || null }\n }, [activeCampaign, subtotal])\n\n const giftHandles = useMemo(() => {\n const giftVariant = autoFreeGiftConfig\n .map((item) =>\n item.rule_result?.spend_get_reward?.gift_product\n ?.map((v) =>\n v.reward_list.map((reward) => reward.variant_list.map((variant) => variant.handle))\n )\n .flat()\n )\n .flat()\n return giftVariant.flat(2).filter(Boolean)\n }, [autoFreeGiftConfig])\n\n // 检查是否需要重新获取数据\n const shouldFetch = useMemo(() => {\n if (!giftHandles.length) return false\n\n // 如果缓存存在且 handles 相同,直接使用缓存\n if (\n giftProductsCache.current &&\n JSON.stringify(giftProductsCache.current.giftHandles) === JSON.stringify(giftHandles)\n ) {\n return false\n }\n\n return true\n }, [giftHandles])\n\n const { data: giftProductsResult } = useSWR(shouldFetch ? giftHandles : null, async () => {\n const res = await getProductsByHandles(client, {\n handles: giftHandles,\n locale,\n })\n const result = Array.isArray(res) ? res : []\n\n // 缓存结果\n giftProductsCache.current = {\n data: result,\n giftHandles: [...giftHandles],\n }\n\n return result\n })\n\n\n // 使用缓存的数据或新获取的数据 \n const finalGiftProductsResult = useMemo(() => {\n if (giftProductsCache.current && !shouldFetch) {\n return giftProductsCache.current.data || undefined\n }\n return giftProductsResult\n }, [giftProductsResult, shouldFetch])\n \n return {\n qualifyingGift,\n nextTierGoal,\n activeCampaign,\n isLoading: isCustomerLoading,\n giftProductsResult: finalGiftProductsResult,\n }\n}\n","import { useEffect, useMemo, useCallback, useState, useRef } from 'react'\nimport Decimal from 'decimal.js'\nimport Cookies from 'js-cookie'\nimport {\n NormalizedCart,\n NormalizedLineItem,\n NormalizedProduct,\n getProductsByHandles,\n} from '@anker-in/shopify-sdk'\nimport useSWR from 'swr'\nimport { getQuery } from '../utils'\nimport { useShopify } from '../../../provider'\nimport type { AddToCartLineItem } from '../use-add-to-cart'\nimport { createMockCartFromLines } from '../utils/normalize-add-to-cart-lines'\n\n// 兼容老script满赠 ----- 待拆解优化\ninterface GiveawayProduct {\n handle: string\n sku: string\n}\n\ninterface Breakpoint {\n breakpoint: string\n giveawayProducts: GiveawayProduct[]\n}\n\ninterface Campaign {\n activityAvailableQuery?: string\n activityQroperty?: string\n breakpoints?: Array<{\n breakpoint: string\n giveawayProducts: GiveawayProduct[]\n }>\n includeTags?: string[]\n useTotalAmount?: boolean\n}\n\nexport interface UseScriptAutoFreeGiftResult {\n involvedLines: NormalizedLineItem[]\n reorder: (a: NormalizedLineItem, b: NormalizedLineItem) => number\n disableCodeRemove: boolean\n nextFreeGiftLevel: Breakpoint | null\n freeGiftLevel: Breakpoint | null\n involvedSubTotal: Decimal\n giftProductsResult?: NormalizedProduct[]\n}\n\n// --- 3. 优化后的 Hook 主体 ---\nexport const useScriptAutoFreeGift = ({\n campaign,\n _giveaway,\n cart,\n locale: providedLocale,\n lines,\n}: {\n campaign: Campaign | null\n _giveaway: string\n cart: NormalizedCart | undefined\n locale?: string\n lines?: AddToCartLineItem[]\n}): UseScriptAutoFreeGiftResult => {\n const { client, locale: contextLocale } = useShopify()\n const locale = providedLocale || contextLocale\n\n // --- 状态管理 ---\n const [points_subscribe, set_points_subscribe] = useState<boolean>(false)\n\n // 使用 useRef 缓存 giftProductsResult,确保只执行一次\n const giftProductsCache = useRef<{\n data: any[] | null\n giftHandles: string[]\n } | null>(null)\n\n // 如果传入了 lines,则创建临时 cart 用于计算\n const effectiveCart = useMemo(() => {\n if (lines && lines.length > 0) {\n return createMockCartFromLines(lines, cart)\n }\n return cart\n }, [lines, cart])\n\n useEffect(() => {\n if (locale === 'au') {\n const isPointsSubscribe = Cookies.get('points_subscribe')\n set_points_subscribe(!!isPointsSubscribe)\n }\n }, [locale])\n\n // 检查活动是否可用:\n // 1. campaign 不存在\n // 2. 配置了 activityAvailableQuery 但utmCampaign不包含activityAvailableQuery\n const isActivityAvailable = useMemo(() => {\n if (!campaign) return false\n const query = getQuery()\n const utmCampaign = Cookies.get('utm_campaign') || (query as any)?.utm_campaign\n if (campaign.activityAvailableQuery && !utmCampaign?.includes(campaign.activityAvailableQuery))\n return false\n return true\n }, [campaign])\n\n // --- 计算层 ---\n // 使用 useMemo 进行性能优化,处理所有纯计算逻辑。\n\n const [upgrade_multiple, upgrade_value] = useMemo((): [number, number] => {\n let upgrade_multiple = 1\n let upgrade_value = 0\n if (points_subscribe) {\n upgrade_multiple = 1.2\n upgrade_value = 40\n }\n effectiveCart?.lineItems?.forEach(({ customAttributes}: { customAttributes: { key: string; value: string }[] }) => {\n customAttributes?.forEach(({ key, value }: { key: string; value: string }) => {\n if (key === '_amount_upgrade_multiple') upgrade_multiple = Number(value) || 1\n if (key === '_amount_upgrade_value') upgrade_value = Number(value) || 0\n })\n })\n return [upgrade_multiple, upgrade_value]\n }, [effectiveCart?.lineItems, points_subscribe])\n\n const breakpoints = useMemo((): Breakpoint[] => {\n if (!isActivityAvailable) return []\n return (campaign?.breakpoints || []).map((item) => ({\n breakpoint: new Decimal(item.breakpoint)\n .minus(new Decimal(upgrade_value))\n .dividedBy(new Decimal(upgrade_multiple))\n .toFixed(2, Decimal.ROUND_DOWN),\n giveawayProducts: item.giveawayProducts || [],\n }))\n }, [campaign, upgrade_multiple, upgrade_value])\n\n const giftHandles = useMemo(\n (): string[] =>\n // 使用 Set 去重,然后拼接字符串\n [\n ...new Set(\n breakpoints.flatMap((b) => b.giveawayProducts.map((p) => p.handle)).filter(Boolean)\n ),\n ],\n [breakpoints]\n )\n\n // 检查是否需要重新获取数据\n const shouldFetch = useMemo(() => {\n if (!giftHandles.length) return false\n\n // 如果缓存存在且 handles 相同,直接使用缓存\n if (\n giftProductsCache.current &&\n JSON.stringify(giftProductsCache.current.giftHandles) === JSON.stringify(giftHandles)\n ) {\n return false\n }\n\n return true\n }, [giftHandles])\n\n const involvedLines = useMemo((): NormalizedLineItem[] => {\n if (!isActivityAvailable) return []\n return (effectiveCart?.lineItems || []).filter((line: NormalizedLineItem) => {\n const isNotGift =\n line?.totalAmount &&\n Number(line.totalAmount) > 0 &&\n line.customAttributes?.every(\n (item: { key: string; value: string }) => item.key !== _giveaway\n )\n const hasCampaignTag = line.product?.tags?.some(\n (tag: string) =>\n campaign?.includeTags?.includes(tag.trim()) && line.variant?.availableForSale\n )\n return isNotGift && hasCampaignTag\n })\n }, [effectiveCart?.lineItems, isActivityAvailable, _giveaway])\n\n const involvedSubTotal = useMemo((): Decimal => {\n if (!isActivityAvailable) return new Decimal(0)\n return involvedLines.reduce((prev, item) => {\n const amount = campaign?.useTotalAmount ? item.totalAmount : item.subtotalAmount\n return new Decimal(prev).plus(new Decimal(amount || 0))\n }, new Decimal(0))\n }, [involvedLines, isActivityAvailable])\n\n const [freeGiftLevel, nextFreeGiftLevel] = useMemo((): [Breakpoint | null, Breakpoint | null] => {\n if (!isActivityAvailable) return [null, null]\n const sortedLevels = [...breakpoints].sort(\n (a, b) => Number(b.breakpoint) - Number(a.breakpoint)\n )\n const levelIndex = sortedLevels.findIndex(\n (level) => involvedSubTotal.gte(new Decimal(level.breakpoint)) && involvedLines.length > 0\n )\n\n if (levelIndex === -1) {\n return [\n null,\n sortedLevels.length > 0 ? (sortedLevels[sortedLevels.length - 1] ?? null) : null,\n ]\n }\n\n const currentLevel = sortedLevels[levelIndex] ?? null\n const nextLevel = levelIndex > 0 ? (sortedLevels[levelIndex - 1] ?? null) : null\n return [currentLevel, nextLevel]\n }, [breakpoints, involvedSubTotal, involvedLines.length])\n\n // --- 数据获取层 ---\n const { data: giftProductsResult } = useSWR(shouldFetch ? giftHandles : null, async () => {\n const res = await getProductsByHandles(client, {\n handles: giftHandles,\n locale,\n })\n const result = Array.isArray(res) ? res : []\n\n // 缓存结果\n giftProductsCache.current = {\n data: result,\n giftHandles: [...giftHandles],\n }\n\n return result\n })\n\n // 使用缓存的数据或新获取的数据\n const finalGiftProductsResult = useMemo(() => {\n if (giftProductsCache.current && !shouldFetch) {\n return giftProductsCache.current.data || undefined\n }\n return giftProductsResult\n }, [giftProductsResult, shouldFetch])\n\n // 使用 useCallback 创建一个稳定的排序函数,用于优化渲染。\n // 它会根据商品类型(赠品、活动商品、普通商品)进行排序。\n const reorder = useCallback(\n (a: NormalizedLineItem, b: NormalizedLineItem): number => {\n const getPriority = (item: NormalizedLineItem): number => {\n // 优先级 0: 赠品 (排在最后)\n if (\n item.customAttributes?.some(\n (attribute: { key: string; value: string }) => attribute.key === _giveaway\n )\n )\n return 0\n // 优先级 1: 参与活动的商品 (BUG修复:应检查 product.tags)\n if (item.product?.tags?.some((tag: string) => campaign?.includeTags?.includes(tag)))\n return 1\n // 优先级 2: 其他普通商品 (排在最前)\n return 2\n }\n // b 的优先级减 a 的优先级,实现降序排列\n return getPriority(b) - getPriority(a)\n },\n [campaign?.includeTags, _giveaway]\n )\n\n return {\n involvedLines,\n reorder,\n disableCodeRemove: involvedLines.length > 0,\n nextFreeGiftLevel,\n freeGiftLevel,\n involvedSubTotal,\n giftProductsResult: finalGiftProductsResult,\n }\n}\n","/**\n * Cart Context\n * Provides cart state and mutation methods with business logic\n */\n\nimport React, { createContext, useContext, useCallback, useMemo, useState, useEffect } from 'react'\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getCart, type NormalizedCart } from '@anker-in/shopify-sdk'\nimport { useShopify } from './use-shopify'\nimport { useCalcAutoFreeGift } from '../hooks/cart/feature/use-calc-auto-free-gift'\nimport { CUSTOMER_SCRIPT_GIFT_KEY, CUSTOMER_ATTRIBUTE_KEY } from '../hooks/cart/const'\nimport { useScriptAutoFreeGift } from '../hooks/cart/feature/use-script-auto-free-gift'\nimport {\n getDiscountEnvAttributeValue,\n formatScriptAutoFreeGift,\n formatFunctionAutoFreeGift,\n checkAttributesUpdateNeeded,\n} from '../hooks/cart/utils/auto-free-gift'\nimport {\n PlusMemberSettingsMetafields,\n useCartAttributes,\n useUpdateCartAttributes,\n useUpdateLineCodeAmountAttributes,\n} from '../hooks'\nimport { useRequest } from 'ahooks'\nimport type { HasMetafieldsIdentifier } from '@anker-in/shopify-sdk'\n\n// Simple types defined locally to avoid import issues\nexport type AttributeInput = {\n key: string\n value: string\n}\n\nexport type LoadingState = {\n editLineQuantityLoading: boolean\n editLineCodeAmountLoading: boolean\n listingAutoCodeApplying: boolean\n userCodeApplying: boolean\n}\n\nexport interface CartContextValue {\n /** Current cart data */\n cart: NormalizedCart | undefined\n /** Whether cart is loading */\n isCartLoading: boolean\n /** Manually trigger cart fetch */\n triggerFetch: () => void\n /** Mutate cart data */\n mutateCart: (cart: NormalizedCart | undefined) => void\n /** Add custom attributes */\n addCustomAttributes: (attributes: AttributeInput[]) => void\n /** Remove custom attributes */\n removeCustomAttributes: (attributes: { key: string }[]) => void\n /** Set custom attributes */\n setCustomAttributes: (attributes: AttributeInput[]) => void\n /** Current locale */\n locale: string\n /** Whether discount code is changing */\n isCodeChanging: boolean\n /** Set discount code changing state */\n setIsCodeChanging: (isCodeChanging: boolean) => void\n /** Set loading state */\n setLoadingState: React.Dispatch<React.SetStateAction<LoadingState>>\n /** Loading state */\n loadingState: LoadingState\n /** Script auto free gift items */\n scriptAutoFreeGift?: any[]\n /** Function auto free gift items */\n functionAutoFreeGift?: any[]\n /** Set function auto free gift */\n setFunctionAutoFreeGift: (functionAutoFreeGift: any[]) => void\n /** Set script auto free gift */\n setScriptAutoFreeGift: (scriptAutoFreeGift: any[]) => void\n /** Script auto free gift result */\n scriptAutoFreeGiftResult?: any\n /** Function auto free gift result */\n functionAutoFreeGiftResult?: any\n /** Calculated auto free gift result */\n calculatedAutoFreeGift?: any\n /** Gifts that need to be added to cart */\n giftNeedAddToCartLines: any[]\n /** Auto free gift config */\n autoFreeGiftConfig?: any\n /** Gradient gifts config */\n gradientGiftsConfig?: any\n /** Metafield identifiers */\n metafieldIdentifiers?: {\n variant: HasMetafieldsIdentifier[]\n product: HasMetafieldsIdentifier[]\n }\n}\n\nconst CartContext = createContext<CartContextValue | null>(null)\n\nexport interface CartProviderProps {\n children: React.ReactNode\n /** SWR configuration options */\n swrOptions?: SWRConfiguration<NormalizedCart | undefined, Error>\n /** Auto free gift configuration */\n autoFreeGiftConfig?: any\n /** Gradient gifts configuration (for script gifts) */\n gradientGiftsConfig?: any\n /** Function gift configuration */\n fnGiftConf?: any\n /** User profile */\n profile?: any\n /** Customer data */\n customer?: any\n /** Current locale */\n locale: string\n /** Metafield identifiers */\n metafieldIdentifiers?: {\n variant: HasMetafieldsIdentifier[]\n product: HasMetafieldsIdentifier[]\n }\n /** Plus member settings */\n memberSetting?: PlusMemberSettingsMetafields\n}\n\n/**\n * Cart Provider Component\n *\n * Provides cart state management with business logic\n *\n * @example\n * ```tsx\n * <ShopifyProvider {...config}>\n * <CartProvider\n * locale=\"us\"\n * autoFreeGiftConfig={config}\n * profile={profile}\n * customer={customer}\n * >\n * <App />\n * </CartProvider>\n * </ShopifyProvider>\n * ```\n */\nexport function CartProvider({\n children,\n // swrOptions,\n autoFreeGiftConfig,\n gradientGiftsConfig,\n profile,\n customer,\n locale,\n metafieldIdentifiers,\n memberSetting,\n}: CartProviderProps) {\n const { client, cartCookieAdapter } = useShopify()\n\n // Local state\n const [customAttributes, setCustomAttributes] = useState<AttributeInput[]>([])\n const [customAttributesNeedDelete, setCustomAttributesNeedDelete] = useState<{ key: string }[]>(\n []\n )\n const [isCodeChanging, setIsCodeChanging] = useState(false)\n const [loadingState, setLoadingState] = useState<LoadingState>({\n editLineQuantityLoading: false,\n editLineCodeAmountLoading: false,\n listingAutoCodeApplying: false,\n userCodeApplying: false,\n })\n const [scriptAutoFreeGift, setScriptAutoFreeGift] = useState<any[]>([])\n const [functionAutoFreeGift, setFunctionAutoFreeGift] = useState<any[]>([])\n\n const {\n run: fetchCart,\n data: cart,\n loading: isCartLoading,\n mutate: mutateCart,\n } = useRequest<NormalizedCart | undefined, any>(\n async () => {\n return getCart(client, {\n cookieAdapter: cartCookieAdapter,\n metafieldIdentifiers,\n })\n },\n {\n refreshDeps: [locale],\n }\n )\n\n // 更新 attributes\n const { trigger: updateAttributes } = useUpdateCartAttributes(mutateCart, metafieldIdentifiers)\n // 公共 attributes\n const { attributes } = useCartAttributes({ profile, customer, cart, memberSetting })\n\n useRequest(\n () => {\n // 去重逻辑\n const newAttributes = [...attributes, ...customAttributes]\n\n const needUpdate =\n cart &&\n !checkAttributesUpdateNeeded(\n cart.customAttributes,\n newAttributes,\n customAttributesNeedDelete\n )\n\n // 如果 attributes 没有变化,不更新\n if (needUpdate) {\n return updateAttributes({ attributes: newAttributes })\n } else {\n return Promise.resolve(cart)\n }\n },\n {\n throttleWait: 1000, // 1 秒内只触发最后一次更新\n throttleTrailing: true,\n throttleLeading: false,\n refreshDeps: [attributes, customAttributes],\n }\n )\n\n // 更新 code 时,同步更新 line item 中的 code amount attribute\n useUpdateLineCodeAmountAttributes({\n cart,\n mutateCart,\n isCartLoading: isCartLoading || isCodeChanging,\n setLoadingState,\n })\n\n // Custom attribute management\n const removeCustomAttributes = useCallback(\n (attributes: { key: string }[]) => {\n setCustomAttributesNeedDelete(attributes)\n },\n [setCustomAttributesNeedDelete]\n )\n\n const addCustomAttributes = useCallback(\n (attributes: AttributeInput[]) => {\n const sameAttributes = attributes.filter((attr) =>\n customAttributes.some((a) => a.key === attr.key)\n )\n\n if (sameAttributes.length) {\n setCustomAttributes((prev) => {\n const removedAttributes = prev.filter(\n (attr) => !sameAttributes.some((a) => a.key === attr.key)\n )\n return [...removedAttributes, ...attributes]\n })\n } else {\n setCustomAttributes((prev) => [...prev, ...attributes])\n }\n },\n [customAttributes]\n )\n\n const functionAutoFreeGiftResult = useCalcAutoFreeGift(cart, autoFreeGiftConfig || [], customer)\n const scriptAutoFreeGiftResult = useScriptAutoFreeGift({\n campaign: gradientGiftsConfig || null,\n _giveaway: CUSTOMER_SCRIPT_GIFT_KEY,\n cart,\n })\n\n const formattedScriptGifts = useMemo(() => {\n return formatScriptAutoFreeGift({\n scriptAutoFreeGiftResult,\n gradient_gifts: gradientGiftsConfig,\n locale,\n })\n }, [scriptAutoFreeGiftResult, gradientGiftsConfig, locale])\n\n const formattedFunctionGifts = useMemo(() => {\n return formatFunctionAutoFreeGift({\n qualifyingGift: functionAutoFreeGiftResult?.qualifyingGift || null,\n giftProductsResult: (functionAutoFreeGiftResult?.giftProductsResult as any[]) || [],\n locale,\n })\n }, [functionAutoFreeGiftResult, locale])\n\n // 当格式化结果变化时更新状态\n useEffect(() => {\n if (\n loadingState.userCodeApplying ||\n loadingState.editLineQuantityLoading ||\n loadingState.editLineCodeAmountLoading ||\n loadingState.listingAutoCodeApplying\n ) {\n return\n }\n\n setScriptAutoFreeGift(formattedScriptGifts)\n setFunctionAutoFreeGift(formattedFunctionGifts)\n }, [\n formattedScriptGifts,\n formattedFunctionGifts,\n loadingState.userCodeApplying,\n loadingState.editLineQuantityLoading,\n loadingState.editLineCodeAmountLoading,\n loadingState.listingAutoCodeApplying,\n ])\n\n const giftNeedAddToCartLines = useMemo(() => {\n const cartGiftLineItems = cart?.lineItems.filter((line) =>\n line.customAttributes?.some((attr: any) =>\n [CUSTOMER_ATTRIBUTE_KEY, CUSTOMER_SCRIPT_GIFT_KEY].includes(attr.key)\n )\n )\n const result = [...scriptAutoFreeGift, ...functionAutoFreeGift].filter(\n (item) =>\n // 如果购物车中已经存在对应赠品,且标记了 function 满赠的属性,则不添加\n !cartGiftLineItems?.find((line) => {\n return (\n line.variantId === item.line.variantId &&\n line.customAttributes?.some((attr: any) => {\n if (attr.key === '_discounts_function_env') {\n return getDiscountEnvAttributeValue(line.customAttributes).is_gift\n }\n\n return false\n })\n )\n })\n )\n return result\n }, [cart?.lineItems, scriptAutoFreeGift, functionAutoFreeGift])\n\n const value = useMemo(\n () => ({\n cart,\n isCartLoading,\n triggerFetch: fetchCart,\n mutateCart,\n addCustomAttributes,\n removeCustomAttributes,\n setCustomAttributes,\n locale,\n isCodeChanging,\n setIsCodeChanging,\n autoFreeGiftConfig,\n gradientGiftsConfig,\n setLoadingState,\n loadingState,\n // function满赠\n functionAutoFreeGift,\n functionAutoFreeGiftResult,\n setFunctionAutoFreeGift,\n // script满赠\n scriptAutoFreeGift,\n scriptAutoFreeGiftResult,\n setScriptAutoFreeGift,\n giftNeedAddToCartLines,\n metafieldIdentifiers,\n }),\n [\n cart,\n isCartLoading,\n fetchCart,\n mutateCart,\n addCustomAttributes,\n removeCustomAttributes,\n locale,\n isCodeChanging,\n autoFreeGiftConfig,\n gradientGiftsConfig,\n loadingState,\n // function满赠\n functionAutoFreeGift,\n functionAutoFreeGiftResult,\n setFunctionAutoFreeGift,\n // script满赠\n scriptAutoFreeGift,\n scriptAutoFreeGiftResult,\n setScriptAutoFreeGift,\n giftNeedAddToCartLines,\n metafieldIdentifiers,\n ]\n )\n\n return <CartContext.Provider value={value}>{children}</CartContext.Provider>\n}\n\n/**\n * Hook to access cart context\n *\n * @throws Error if used outside CartProvider\n * @returns Cart context value\n *\n * @example\n * ```tsx\n * const { cart, mutateCart, isCartLoading, loadingState } = useCartContext()\n * ```\n */\nexport function useCartContext(): CartContextValue {\n const context = useContext(CartContext)\n\n if (!context) {\n throw new Error('useCartContext must be used within a CartProvider')\n }\n\n return context\n}\n","/**\n * useCreateCart Hook\n * Creates a new cart\n */\n\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport {\n createCart,\n updateCartCodes,\n type NormalizedCart,\n type CartLineInput,\n} from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\nimport { useCartContext } from '../../provider'\n\nexport interface CreateCartInput {\n /** Lines to add to the cart */\n lines?: CartLineInput[]\n /** Buyer identity for cart creation */\n buyerIdentity?: {\n email?: string\n countryCode?: string\n }\n /** Discount codes */\n discountCodes?: string[]\n /** Custom attributes */\n customAttributes?: Array<{ key: string; value: string }>\n}\n\n/**\n * Hook for creating a new cart\n *\n * Automatically removes invalid discount codes after creating cart\n *\n * @param options - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating } = useCreateCart()\n *\n * // Create empty cart\n * await trigger({})\n *\n * // Create cart with items\n * await trigger({\n * lines: [{\n * merchandiseId: 'gid://shopify/ProductVariant/123',\n * quantity: 1\n * }],\n * buyerIdentity: {\n * email: 'customer@example.com',\n * countryCode: 'US'\n * },\n * discountCodes: ['SUMMER2024']\n * })\n * ```\n */\nexport function useCreateCart(\n options?: SWRMutationConfiguration<\n NormalizedCart | undefined,\n Error,\n 'create-cart',\n CreateCartInput\n >\n) {\n const { client, locale, cartCookieAdapter } = useShopify()\n const { mutateCart, metafieldIdentifiers } = useCartContext()\n\n const createNewCart = useCallback(\n async (_key: string, { arg }: { arg: CreateCartInput }) => {\n let newCart = await createCart(client, {\n ...arg,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n\n if (newCart) {\n // Remove unapplicable discount codes\n const unApplicableCodes = newCart.discountCodes\n .filter((item) => !item.applicable)\n .map((item) => item.code)\n\n if (unApplicableCodes.length > 0) {\n newCart = await updateCartCodes(client, {\n cartId: newCart.id,\n discountCodes: newCart.discountCodes\n .filter((item) => item.applicable)\n .map((item) => item.code),\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n }\n }\n\n if (newCart) {\n mutateCart(newCart)\n }\n return newCart\n },\n [client, locale, cartCookieAdapter, mutateCart, metafieldIdentifiers]\n )\n\n return useSWRMutation('create-cart', createNewCart, options)\n}\n","import { useShopify } from '../../provider'\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport {\n addCartLines,\n updateCartCodes,\n type NormalizedCart,\n type CartLineInput,\n} from '@anker-in/shopify-sdk'\nimport { useCartContext } from '../../provider'\n\nexport interface AddCartLinesInput {\n /** Cart ID (optional, will use cookie or create new cart) */\n cartId?: string\n /** Lines to add */\n lines: CartLineInput[]\n /** Buyer identity for new cart */\n buyerIdentity?: {\n email?: string\n countryCode?: string\n }\n}\n\n/**\n * Hook for adding lines to cart\n *\n * Automatically removes invalid discount codes after adding items\n *\n * @param options - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating } = useAddCartLines()\n *\n * await trigger({\n * lines: [{\n * merchandiseId: 'gid://shopify/ProductVariant/123',\n * quantity: 1\n * }]\n * })\n * ```\n */\nexport function useAddCartLines(\n options?: SWRMutationConfiguration<\n NormalizedCart | undefined,\n Error,\n 'add-cart-lines',\n AddCartLinesInput\n >\n) {\n const { client, locale, cartCookieAdapter } = useShopify()\n const { mutateCart, metafieldIdentifiers } = useCartContext()\n\n const addLines = useCallback(\n async (_key: string, { arg }: { arg: AddCartLinesInput }) => {\n let updatedCart = await addCartLines(client, {\n ...arg,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n\n if (updatedCart) {\n // Remove unapplicable discount codes\n const unApplicableCodes = updatedCart.discountCodes\n .filter((item) => !item.applicable)\n .map((item) => item.code)\n\n if (unApplicableCodes.length > 0) {\n updatedCart = await updateCartCodes(client, {\n cartId: updatedCart.id,\n discountCodes: updatedCart.discountCodes\n .filter((item) => item.applicable)\n .map((item) => item.code),\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n }\n }\n\n if (updatedCart) {\n mutateCart(updatedCart)\n }\n return updatedCart\n },\n [client, locale, cartCookieAdapter, mutateCart, metafieldIdentifiers]\n )\n\n return useSWRMutation('add-cart-lines', addLines, options)\n}\n","/**\n * Google Analytics Tracking\n * GA4 event tracking utilities\n */\n\nimport Decimal from 'decimal.js'\nimport { AddToCartLineItem } from '../hooks'\nimport type { GtmParams } from './types'\n\ndeclare global {\n interface Window {\n dataLayer?: any[]\n gtag?: (...args: any) => void\n }\n}\n\n/**\n * Push event to GA4 dataLayer\n */\nexport const gaTrack = (data: any) => {\n if (typeof window === 'undefined') {\n return\n }\n\n window.dataLayer = window?.dataLayer || []\n if (!Array.isArray(window.dataLayer)) {\n return\n }\n\n try {\n window?.dataLayer?.push({ event_parameters: null })\n window?.dataLayer?.push(data || {})\n } catch (error) {\n console.error('GA tracking error:', error)\n }\n}\n\n/**\n * Track add to cart event in GA4\n */\nexport const trackAddToCartGA = ({\n lineItems = [],\n gtmParams = {},\n}: {\n lineItems: AddToCartLineItem[]\n gtmParams?: GtmParams\n}) => {\n if (!lineItems.length || !lineItems[0]?.variant) {\n return\n }\n\n const { variant } = lineItems[0]\n const currencyCode = variant.product?.price?.currencyCode\n\n const totalPrice = lineItems\n ?.reduce(\n (prev, { variant }) =>\n prev.plus(\n variant?.finalPrice?.amount ??\n variant?.compareAtPrice?.amount ??\n variant?.price?.amount ??\n 0\n ),\n new Decimal(0)\n )\n .toNumber()\n gaTrack({\n event: 'ga4Event',\n event_name: 'add_to_cart',\n event_parameters: {\n page_group: gtmParams?.pageGroup,\n currency: currencyCode,\n value: totalPrice,\n position: gtmParams?.position || '',\n items: lineItems.map(({ variant, quantity }) => ({\n item_id: variant?.sku,\n item_name: variant?.product?.title || variant?.product?.title,\n item_brand: gtmParams?.brand || '',\n item_category: variant?.product?.productType || '',\n item_variant: variant?.title || variant?.title,\n price: variant?.compareAtPrice?.amount ?? variant?.price?.amount,\n quantity: quantity || 1,\n })),\n ...gtmParams?.ga4Params,\n },\n })\n}\n\n/**\n * Track begin checkout event in GA4\n */\nexport const trackBeginCheckoutGA = ({\n lineItems = [],\n currencyCode,\n gtmParams = {},\n}: {\n lineItems: AddToCartLineItem[]\n currencyCode?: string\n gtmParams?: GtmParams\n}) => {\n if (!lineItems.length) {\n return\n }\n\n const totalPrice = lineItems\n ?.reduce(\n (prev, { variant }) =>\n prev.plus(\n variant?.finalPrice?.amount ??\n variant?.compareAtPrice?.amount ??\n variant?.price?.amount ??\n 0\n ),\n new Decimal(0)\n )\n .toNumber()\n\n gaTrack({\n event: 'ga4Event',\n event_name: 'begin_checkout',\n event_parameters: {\n page_group: gtmParams?.pageGroup,\n position: gtmParams?.position,\n currency: currencyCode,\n value: totalPrice,\n items: lineItems.map((item) => ({\n item_id: item.variant?.sku,\n item_name: item.variant?.product?.title,\n item_brand: gtmParams?.brand || '',\n item_category: item.variant?.product?.productType,\n item_variant: item.variant?.title,\n price: item.variant?.compareAtPrice?.amount ?? item.variant?.price?.amount,\n quantity: item.quantity || 1,\n })),\n ...gtmParams?.ga4Params,\n },\n })\n}\n\n/**\n * Track buy now event in GA4\n * This triggers begin_checkout event for buy now actions\n */\nexport const trackBuyNowGA = ({\n lineItems = [],\n gtmParams = {},\n}: {\n lineItems: AddToCartLineItem[]\n gtmParams?: GtmParams\n}) => {\n if (!lineItems.length || !lineItems[0]?.variant) {\n return\n }\n\n const { variant } = lineItems[0]\n const currencyCode = variant.price?.currencyCode\n const totalPrice = lineItems\n ?.reduce(\n (prev, { variant }) =>\n prev.plus(\n variant?.finalPrice?.amount ??\n variant?.compareAtPrice?.amount ??\n (variant?.price?.amount || 0)\n ),\n new Decimal(0)\n )\n .toNumber()\n\n gaTrack({\n event: 'ga4Event',\n event_name: 'begin_checkout',\n event_parameters: {\n page_group: gtmParams?.pageGroup,\n position: gtmParams?.position,\n currency: currencyCode,\n value: totalPrice,\n items: lineItems.map((item) => ({\n item_id: item.variant?.sku,\n item_name: item.variant?.product?.title || item.variant?.title,\n item_brand: gtmParams?.brand || '',\n item_category: item.variant?.product?.productType || '',\n item_variant: item.variant?.title,\n price: item.variant?.compareAtPrice?.amount ?? item.variant?.price?.amount,\n quantity: item.quantity || 1,\n })),\n ...gtmParams?.ga4Params,\n },\n })\n}\n","/**\n * Facebook Pixel Tracking\n * FBQ event tracking utilities\n */\n\nimport { AddToCartLineItem } from '../hooks'\n\ndeclare global {\n interface Window {\n fbq?: (...args: any[]) => void\n gtag?: (...args: any[]) => void\n }\n}\n\n/**\n * Track add to cart event in Facebook Pixel\n */\nexport const trackAddToCartFBQ = ({ lineItems = [] }: { lineItems: AddToCartLineItem[] }) => {\n if (typeof window === 'undefined' || !window.fbq) {\n return\n }\n\n if (lineItems.length && lineItems[0]?.variant) {\n const { variant, quantity } = lineItems[0]\n\n try {\n window.fbq('track', 'AddToCart', {\n value: variant?.compareAtPrice?.amount ?? (variant?.price?.amount || variant?.price || 0),\n num_items: quantity,\n currency: variant?.price?.currencyCode,\n content_name: variant?.product?.title,\n content_type: 'product_group',\n content_ids: String(variant?.id),\n content_category: variant?.product?.metafields?.global?.trafficType || 'public',\n })\n } catch (error) {\n console.error('FBQ tracking error:', error)\n }\n }\n}\n\n/**\n * Configuration for Buy Now tracking events\n */\nexport interface BuyNowTrackConfig {\n /** Google Tag ID */\n gtagId?: string\n /** Facebook Pixel custom event name */\n fbqBuyNowEvent?: string\n /** Google Tag conversion label */\n gtagBuyNowLabel?: string\n /** Google Tag conversion action (default: 'conversion') */\n gtagBuyNowConversion?: string\n}\n\n/**\n * Track buy now event in Facebook Pixel and Google Tag\n */\nexport const trackBuyNowFBQ = ({ trackConfig }: { trackConfig?: BuyNowTrackConfig }) => {\n if (typeof window === 'undefined') {\n return\n }\n\n try {\n // Facebook Pixel custom event\n if (trackConfig?.fbqBuyNowEvent && window.fbq) {\n window.fbq('trackCustom', trackConfig.fbqBuyNowEvent)\n }\n\n // Google Tag conversion\n if (trackConfig?.gtagBuyNowLabel && trackConfig?.gtagId && window.gtag) {\n window.gtag('event', trackConfig.gtagBuyNowConversion || 'conversion', {\n send_to: `${trackConfig.gtagId}/${trackConfig.gtagBuyNowLabel}`,\n })\n }\n } catch (error) {\n console.error('Buy Now tracking error:', error)\n }\n}\n","import { useShopify } from '../../provider'\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport { updateCartCodes, type NormalizedCart } from '@anker-in/shopify-sdk'\nimport { useCartContext } from '../../provider'\n\nexport interface ApplyCartCodesInput {\n /** Cart ID (required) */\n cartId?: string\n /** Discount codes to apply (added to existing applicable codes) */\n discountCodes: string[]\n /** Replace existing applicable codes */\n replaceExistingCodes?: boolean\n}\n\n/**\n * Hook for applying discount codes to cart\n *\n * Merges new codes with existing applicable codes and validates them\n *\n * @param options - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating, error } = useApplyCartCodes()\n *\n * try {\n * await trigger({\n * cartId: 'gid://shopify/Cart/123',\n * discountCodes: ['SUMMER2024']\n * })\n * } catch (error) {\n * // Handle unapplicable codes\n * }\n * ```\n */\nexport function useApplyCartCodes(\n options?: SWRMutationConfiguration<\n NormalizedCart | undefined,\n Error,\n 'apply-codes',\n ApplyCartCodesInput\n >\n) {\n const { client, locale, cartCookieAdapter } = useShopify()\n const { mutateCart, cart, metafieldIdentifiers } = useCartContext()\n\n const applyCodes = useCallback(\n async (_key: string, { arg }: { arg: ApplyCartCodesInput }) => {\n const { cartId: providedCartId, discountCodes, replaceExistingCodes } = arg\n\n if (!discountCodes?.length) {\n throw new Error('Invalid input used for this operation: Miss discountCode')\n }\n\n const cartId = providedCartId ? undefined : providedCartId || cart?.id\n\n if (!cartId) {\n return undefined\n }\n\n const updatedCart = await updateCartCodes(client, {\n cartId,\n discountCodes: replaceExistingCodes\n ? discountCodes\n : [\n ...discountCodes,\n ...(cart?.discountCodes?.filter((item) => item.applicable).map((item) => item.code) ||\n []),\n ],\n cookieAdapter: cartCookieAdapter,\n metafieldIdentifiers,\n })\n\n if (updatedCart) {\n mutateCart(updatedCart)\n }\n return updatedCart\n },\n [client, locale, cartCookieAdapter, mutateCart, cart]\n )\n\n return useSWRMutation('apply-codes', applyCodes, options)\n}\n","import { useShopify } from '../../provider'\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport { CartCookieAdapter, updateCartCodes, type NormalizedCart } from '@anker-in/shopify-sdk'\nimport { useCartContext } from '../../provider'\n\nexport interface RemoveCartCodesInput {\n /** Cart ID (required) */\n cartId?: string\n /** Discount codes to remove */\n discountCodes: string[]\n}\n\n/**\n * Hook for removing discount codes from cart\n *\n * @param options - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating } = useRemoveCartCodes()\n *\n * await trigger({\n * cartId: 'gid://shopify/Cart/123',\n * discountCodes: ['EXPIRED_CODE']\n * })\n * ```\n */\nexport function useRemoveCartCodes(\n options?: SWRMutationConfiguration<\n NormalizedCart | undefined,\n Error,\n 'remove-codes',\n RemoveCartCodesInput\n >\n) {\n const { client, locale, cartCookieAdapter } = useShopify()\n const { mutateCart, cart, metafieldIdentifiers } = useCartContext()\n\n const removeCodes = useCallback(\n async (_key: string, { arg }: { arg: RemoveCartCodesInput }) => {\n const { cartId: providedCartId, discountCodes } = arg\n\n const cartId = providedCartId ? undefined : providedCartId || cart?.id\n\n const codes = cart?.discountCodes?.filter((code) => !!code.applicable) || []\n\n // Filter out codes to remove, keeping only applicable ones\n const leftCodes = codes\n .filter((code) => (discountCodes?.length ? !discountCodes.includes(code.code) : code.code))\n .map((code) => code.code)\n\n const updatedCart = await updateCartCodes(client, {\n cartId,\n discountCodes: leftCodes,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n\n if (updatedCart) {\n mutateCart(updatedCart)\n }\n return updatedCart\n },\n [client, locale, cartCookieAdapter, mutateCart, cart]\n )\n\n return useSWRMutation('remove-codes', removeCodes, options)\n}\n","/**\n * useAddToCart Hook\n * 性能优化全链路加购方法,功能列表\n * 1. 应用 code\n * 2. 删除不可用 code\n * 3. 埋点\n */\n\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport {\n type NormalizedCart,\n type CartLineInput,\n type NormalizedProductVariant,\n type MoneyV2,\n NormalizedProduct,\n} from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\nimport { useCartContext } from '../../provider'\nimport { trackAddToCartGA, trackAddToCartFBQ, type GtmParams } from '../../tracking'\nimport { useApplyCartCodes } from './use-apply-cart-codes'\nimport { useRemoveCartCodes } from './use-remove-cart-codes'\nimport { useAddCartLines } from './use-add-cart-lines'\n\nexport type AddToCartLineItem = {\n variant?: NormalizedProductVariant & {\n product?: NormalizedProduct\n finalPrice?: MoneyV2\n }\n sellingPlanId?: string\n quantity?: number\n attributes?: Array<{ key: string; value: string }>\n}\n\nexport interface AddToCartInput {\n /** Lines to add */\n lineItems: Array<AddToCartLineItem>\n /** Cart ID (optional) */\n cartId?: string\n /** Discount codes to apply */\n discountCodes?: string[]\n /** Custom attributes for the cart */\n customAttributes?: Array<{ key: string; value: string }>\n /** 全量更新 codes,默认是追加 */\n replaceExistingCodes?: boolean\n /** Buyer identity for cart creation */\n buyerIdentity?: {\n email?: string\n countryCode?: string\n }\n /** GTM tracking parameters */\n gtmParams?: Omit<GtmParams, 'brand'>\n /** Force create new cart */\n needCreateCart?: boolean\n /** Callback when discount codes are invalid */\n onCodesInvalid?: (\n updatedCart: NormalizedCart,\n invalidCodes: string[]\n ) => Promise<NormalizedCart | undefined>\n}\n\nexport interface UseAddToCartOptions {\n /** Enable tracking (GA and FBQ) */\n withTrack?: boolean\n}\n\n/**\n * Hook for adding items to cart with tracking support\n *\n * This is the enhanced version that includes:\n * - Automatic cart creation if needed\n * - Discount code validation\n * - Google Analytics tracking\n * - Facebook Pixel tracking\n * - Invalid code handling\n *\n * @param options - Hook configuration\n * @param swrOptions - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating } = useAddToCart({ withTrack: true})\n *\n * await trigger({\n * lineItems: [{\n * variantId: 'gid://shopify/ProductVariant/123',\n * quantity: 2\n * }],\n * gtmParams: {\n * pageGroup: 'PDP',\n * position: 'Add to Cart Button'\n * }\n * })\n * ```\n */\nexport function useAddToCart(\n { withTrack = true }: UseAddToCartOptions = {},\n swrOptions?: SWRMutationConfiguration<NormalizedCart | undefined, Error, string, AddToCartInput>\n) {\n const { client, config, locale, cartCookieAdapter, userAdapter } = useShopify()\n const { cart } = useCartContext()\n const { trigger: applyCartCodes } = useApplyCartCodes()\n const { trigger: removeInvalidCodes } = useRemoveCartCodes()\n const { trigger: addCartLines } = useAddCartLines()\n\n const addToCart = useCallback(\n async (_key: string, { arg }: { arg: AddToCartInput }) => {\n const {\n lineItems,\n cartId: providedCartId,\n discountCodes,\n gtmParams = {},\n buyerIdentity,\n needCreateCart = false,\n onCodesInvalid,\n replaceExistingCodes,\n } = arg\n\n if (!lineItems || lineItems.length === 0) {\n return\n }\n\n // Transform line items to CartLineInput format\n const lines: CartLineInput[] = lineItems\n .map((item) => ({\n merchandiseId: item.variant?.id || '',\n quantity: item.quantity || 1,\n attributes: item.attributes,\n sellingPlanId: item.sellingPlanId,\n }))\n .filter((item) => item.merchandiseId && item.quantity)\n\n if (lines.length === 0) {\n return\n }\n\n // Determine cart ID\n const cartId = needCreateCart ? undefined : providedCartId || cart?.id\n\n // Add lines to cart\n let resultCart = await addCartLines({\n cartId,\n lines,\n buyerIdentity,\n })\n\n if (!resultCart) {\n return undefined\n }\n\n console.log('npm addCartLines resultCart', resultCart)\n\n // 删除不可用 code\n if (resultCart.discountCodes && resultCart.discountCodes.length > 0) {\n const unapplicableCodes = resultCart.discountCodes\n .filter((item) => !item.applicable)\n .map((item) => item.code)\n\n if (unapplicableCodes.length > 0) {\n // Call custom handler if provided\n if (onCodesInvalid) {\n const handledCart = await onCodesInvalid(resultCart, unapplicableCodes)\n if (handledCart) {\n resultCart = handledCart\n }\n } else {\n await removeInvalidCodes({\n discountCodes: unapplicableCodes,\n })\n }\n }\n }\n\n // 应用 code\n if (discountCodes && discountCodes.length > 0) {\n applyCartCodes({\n replaceExistingCodes,\n discountCodes,\n })\n }\n\n // Tracking\n if (withTrack) {\n // GA tracking\n trackAddToCartGA({\n lineItems,\n gtmParams: { ...gtmParams, brand: config.getBrand() },\n })\n\n // FBQ tracking\n trackAddToCartFBQ({ lineItems })\n }\n\n return resultCart\n },\n [client, locale, cartCookieAdapter, userAdapter, cart, withTrack]\n )\n\n return useSWRMutation('add-to-cart', addToCart, swrOptions)\n}\n","import { useShopify } from '../../provider'\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport { updateCartLines, UpdateCartLinesOptions, type NormalizedCart } from '@anker-in/shopify-sdk'\nimport { useCartContext } from '../../provider'\n\n/**\n * Hook for updating cart line quantities\n *\n * @param options - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating } = useUpdateCartLines()\n *\n * await trigger({\n * lines: [{\n * id: 'gid://shopify/CartLine/123',\n * quantity: 2\n * }]\n * })\n * ```\n */\nexport function useUpdateCartLines(\n options?: SWRMutationConfiguration<\n NormalizedCart | undefined,\n Error,\n 'update-cart-lines',\n UpdateCartLinesOptions\n >\n) {\n const { client, locale, cartCookieAdapter } = useShopify()\n const { mutateCart, metafieldIdentifiers } = useCartContext()\n\n const updateLines = useCallback(\n async (_key: string, { arg }: { arg: UpdateCartLinesOptions }) => {\n const updatedCart = await updateCartLines(client, {\n ...arg,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n\n if (updatedCart) {\n mutateCart(updatedCart)\n }\n return updatedCart\n },\n [client, locale, cartCookieAdapter, mutateCart]\n )\n\n return useSWRMutation('update-cart-lines', updateLines, options)\n}\n","import { useShopify } from '../../provider'\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport { removeCartLines, updateCartCodes, type NormalizedCart } from '@anker-in/shopify-sdk'\nimport { useCartContext } from '../../provider'\n\nexport interface RemoveCartLinesInput {\n /** Cart ID (optional, will use cookie) */\n cartId?: string\n /** Line IDs to remove */\n lineIds: string[]\n /** Whether to automatically remove invalid discount codes (default: true) */\n autoRemoveInvalidCodes?: boolean\n /** Callback when discount codes are removed */\n onCodesRemoved?: (\n updatedCart: NormalizedCart,\n removedCodes: string[]\n ) => Promise<NormalizedCart | undefined>\n}\n\n/**\n * Hook for removing lines from cart\n *\n * Automatically removes invalid discount codes after removing items\n *\n * @param options - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating } = useRemoveCartLines()\n *\n * await trigger({\n * lineIds: ['gid://shopify/CartLine/123']\n * })\n * ```\n */\nexport function useRemoveCartLines(\n options?: SWRMutationConfiguration<\n NormalizedCart | undefined,\n Error,\n 'remove-cart-lines',\n RemoveCartLinesInput\n >\n) {\n const { client, locale, cartCookieAdapter } = useShopify()\n const { mutateCart, metafieldIdentifiers } = useCartContext()\n\n const removeLines = useCallback(\n async (_key: string, { arg }: { arg: RemoveCartLinesInput }) => {\n const { autoRemoveInvalidCodes = true, onCodesRemoved, cartId, lineIds } = arg\n\n let updatedCart = await removeCartLines(client, {\n cartId,\n lineIds,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n\n if (updatedCart && autoRemoveInvalidCodes) {\n // Get unapplicable discount codes\n const unApplicableCodes = updatedCart.discountCodes\n .filter((item) => !item.applicable)\n .map((item) => item.code)\n\n if (unApplicableCodes.length > 0) {\n // Call custom handler if provided\n if (onCodesRemoved) {\n const handledCart = await onCodesRemoved(updatedCart, unApplicableCodes)\n if (handledCart) {\n updatedCart = handledCart\n }\n } else {\n // Default behavior: remove invalid codes\n updatedCart =\n (await updateCartCodes(client, {\n cartId: updatedCart.id,\n discountCodes: updatedCart.discountCodes\n .filter((item) => item.applicable)\n .map((item) => item.code),\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })) || updatedCart\n }\n }\n }\n\n if (updatedCart) {\n mutateCart(updatedCart)\n }\n return updatedCart\n },\n [client, locale, cartCookieAdapter, mutateCart]\n )\n\n return useSWRMutation('remove-cart-lines', removeLines, options)\n}\n","import { useShopify } from '../../provider'\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport {\n updateCartAttributes,\n type NormalizedCart,\n type HasMetafieldsIdentifier,\n} from '@anker-in/shopify-sdk'\n\nexport interface UpdateCartAttributesInput {\n /** Cart ID (optional, will use cookie) */\n cartId?: string\n /** Custom attributes to set on cart */\n attributes: Array<{ key: string; value: string }>\n}\n\n/**\n * Hook for updating cart attributes (custom key-value pairs)\n *\n * @param options - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating } = useUpdateCartAttributes()\n *\n * await trigger({\n * attributes: [\n * { key: 'gift_message', value: 'Happy Birthday!' },\n * { key: 'gift_wrap', value: 'true' }\n * ]\n * })\n * ```\n */\nexport function useUpdateCartAttributes(\n mutate: (cart: NormalizedCart | undefined) => void,\n metafieldIdentifiers?: {\n variant: HasMetafieldsIdentifier[]\n product: HasMetafieldsIdentifier[]\n },\n options?: SWRMutationConfiguration<\n NormalizedCart | undefined,\n Error,\n 'update-cart-attributes',\n UpdateCartAttributesInput\n >\n) {\n const { client, locale, cartCookieAdapter } = useShopify()\n\n const updateAttributes = useCallback(\n async (_key: string, { arg }: { arg: UpdateCartAttributesInput }) => {\n const updatedCart = await updateCartAttributes(client, {\n ...arg,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n\n console.log('useUpdateCartAttributes updatedCart', updatedCart)\n if (updatedCart) {\n mutate(updatedCart)\n }\n return updatedCart\n },\n [client, locale, cartCookieAdapter, mutate]\n )\n\n return useSWRMutation('update-cart-attributes', updateAttributes, options)\n}\n","/**\n * useBuyNow Hook\n * Creates a new cart and redirects to checkout immediately\n * Includes GA4 and Facebook Pixel tracking\n */\n\nimport { useCallback } from 'react'\nimport useSWRMutation, { type SWRMutationConfiguration } from 'swr/mutation'\nimport {\n type NormalizedCart,\n type CartLineInput,\n HasMetafieldsIdentifier,\n createCart,\n} from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\nimport {\n trackBuyNowGA,\n trackBuyNowFBQ,\n type GtmParams,\n type BuyNowTrackConfig,\n} from '../../tracking'\nimport { AddToCartLineItem } from './use-add-to-cart'\n\nexport interface BuyNowInput {\n /** Metafield identifiers */\n metafieldIdentifiers?: {\n variant: HasMetafieldsIdentifier[]\n product: HasMetafieldsIdentifier[]\n }\n /** Line items to add to the new cart */\n lineItems: Array<AddToCartLineItem>\n /** Discount codes to apply */\n discountCodes?: string[]\n /** Custom attributes for the cart */\n customAttributes?: Array<{ key: string; value: string }>\n /** Buyer identity */\n buyerIdentity?: {\n email?: string\n countryCode?: string\n }\n /** GTM tracking parameters */\n gtmParams?: Omit<GtmParams, 'brand'>\n /** Facebook Pixel tracking configuration */\n fbqTrackConfig?: BuyNowTrackConfig\n /** Whether to redirect to checkout page (default: true) */\n redirectToCheckout?: boolean\n}\n\nexport interface UseBuyNowOptions {\n /** Enable tracking (GA and FBQ) */\n withTrack?: boolean\n}\n\n/**\n * Hook for buy now functionality\n *\n * Creates a new cart with the specified items and redirects to checkout.\n * Includes automatic tracking for GA4 and Facebook Pixel.\n *\n * @param options - Hook configuration\n * @param swrOptions - SWR mutation configuration\n * @returns SWR mutation with trigger function\n *\n * @example\n * ```tsx\n * const { trigger, isMutating } = useBuyNow({\n * withTrack: true,\n * redirectToCheckout: true,\n * })\n *\n * await trigger({\n * lineItems: [{\n * variantId: 'gid://shopify/ProductVariant/123',\n * quantity: 1\n * }],\n * gtmParams: {\n * pageGroup: 'PDP',\n * position: 'Buy Now Button'\n * }\n * })\n * ```\n */\nexport function useBuyNow(\n { withTrack = true }: UseBuyNowOptions = {},\n swrOptions?: SWRMutationConfiguration<NormalizedCart | undefined, Error, string, BuyNowInput>\n) {\n const { client, config, locale, cartCookieAdapter, userAdapter } = useShopify()\n\n const isLoggedIn = userAdapter?.isLoggedIn || false\n\n const buyNow = useCallback(\n async (_key: string, { arg }: { arg: BuyNowInput }) => {\n const {\n lineItems,\n discountCodes,\n gtmParams = {},\n buyerIdentity,\n fbqTrackConfig,\n customAttributes,\n metafieldIdentifiers,\n redirectToCheckout,\n } = arg\n\n if (!lineItems || lineItems.length === 0) {\n return\n }\n\n // Transform line items to CartLineInput format\n const lines: CartLineInput[] = lineItems\n .map((item) => ({\n merchandiseId: item.variant?.id || '',\n quantity: item.quantity || 1,\n attributes: item.attributes,\n sellingPlanId: item.sellingPlanId,\n }))\n .filter((item) => item.merchandiseId && item.quantity)\n\n if (lines.length === 0) {\n return\n }\n\n // Create new cart (cartId is undefined, so it will create a new one)\n const resultCart = await createCart(client, {\n lines,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n buyerIdentity,\n discountCodes,\n customAttributes,\n })\n\n if (!resultCart) {\n throw new Error('Failed to create cart for buy now')\n }\n\n // Tracking\n if (withTrack && resultCart.lineItems) {\n // GA tracking\n trackBuyNowGA({\n lineItems,\n gtmParams: { ...gtmParams, brand: config.getBrand() },\n })\n\n // FBQ tracking\n if (fbqTrackConfig) {\n trackBuyNowFBQ({ trackConfig: fbqTrackConfig })\n }\n }\n\n // Redirect to checkout\n if (redirectToCheckout) {\n if (resultCart.url) {\n if (typeof window !== 'undefined') {\n window.location.href = resultCart.url\n }\n } else {\n throw new Error('Failed to get checkout URL')\n }\n }\n\n return resultCart\n },\n [client, locale, isLoggedIn, cartCookieAdapter, withTrack]\n )\n\n return useSWRMutation('buy-now', buyNow, swrOptions)\n}\n","import { useMemo } from 'react'\nimport { useCalcAutoFreeGift } from './use-calc-auto-free-gift'\nimport {\n useScriptAutoFreeGift,\n type UseScriptAutoFreeGiftResult,\n} from './use-script-auto-free-gift'\nimport type { AddToCartLineItem } from '../use-add-to-cart'\nimport type { AutoFreeGiftConfig, FunctionGiftResult, CartLineInput } from '../types/auto-free-gift'\nimport { useShopify, useCartContext } from '../../../provider'\nimport { CUSTOMER_SCRIPT_GIFT_KEY } from '../const'\n\nexport interface UseCalcGiftsFromLinesOptions {\n /** Lines to calculate gifts from (AddToCartLineItem format) */\n lines: AddToCartLineItem[]\n /** Auto free gift configuration (Function gift) */\n autoFreeGiftConfig?: AutoFreeGiftConfig\n /** Customer information (required for function gift) */\n customer?: any\n /** Script gift campaign configuration */\n scriptCampaign?: any\n /** Script giveaway attribute key */\n scriptGiveawayKey?: string\n /** Locale for product fetching (optional, will use from ShopifyProvider if not provided) */\n locale?: string\n}\n\nexport interface UseCalcGiftsFromLinesResult {\n /** Function gift calculation result */\n functionGift: FunctionGiftResult\n /** Script gift calculation result */\n scriptGift: UseScriptAutoFreeGiftResult\n /** All gift lines that need to be added to cart (combined from both) */\n allGiftLines: CartLineInput[]\n /** Whether any gifts are available */\n hasGifts: boolean\n}\n\n/**\n * Calculate gifts from AddToCartLineItem[] before adding to cart\n * Supports both function-based gifts (useCalcAutoFreeGift) and script-based gifts (useScriptAutoFreeGift)\n *\n * Automatically uses locale from ShopifyProvider and cart from CartContext if not provided.\n *\n * @example\n * ```tsx\n * // Basic usage (locale from context, customer required for function gift)\n * const { allGiftLines, hasGifts } = useCalcGiftsFromLines({\n * lines: [{ variant: myVariant, quantity: 2 }],\n * customer: currentCustomer,\n * autoFreeGiftConfig: functionGiftConfig,\n * scriptCampaign: scriptGiftConfig,\n * })\n *\n * // Script gift only (no customer needed)\n * const { allGiftLines, hasGifts } = useCalcGiftsFromLines({\n * lines: [{ variant: myVariant, quantity: 2 }],\n * scriptCampaign: scriptGiftConfig,\n * })\n *\n * // With custom locale\n * const { allGiftLines, hasGifts } = useCalcGiftsFromLines({\n * lines: [{ variant: myVariant, quantity: 2 }],\n * customer: currentCustomer,\n * locale: 'fr',\n * autoFreeGiftConfig: functionGiftConfig,\n * })\n *\n * // Then add both products and gifts to cart\n * await addToCart({\n * lineItems: [...lines, ...allGiftLines]\n * })\n * ```\n */\nexport function useCalcGiftsFromLines({\n lines,\n customer,\n scriptGiveawayKey = CUSTOMER_SCRIPT_GIFT_KEY,\n}: UseCalcGiftsFromLinesOptions): UseCalcGiftsFromLinesResult {\n const { locale } = useShopify()\n const { cart, autoFreeGiftConfig, gradientGiftsConfig } = useCartContext()\n\n // Calculate function-based gifts (满赠)\n const functionGift = useCalcAutoFreeGift(cart, autoFreeGiftConfig || [], customer, lines)\n\n // Calculate script-based gifts (老script满赠)\n const scriptGift = useScriptAutoFreeGift({\n campaign: gradientGiftsConfig || null,\n _giveaway: scriptGiveawayKey,\n cart: cart,\n locale,\n lines,\n })\n\n // Combine all gift lines from both sources\n const allGiftLines = useMemo((): CartLineInput[] => {\n const functionGiftLines = functionGift.qualifyingGift?.itemsToAdd || []\n\n // Convert script gift format to CartLineInput format\n const scriptGiftLines: CartLineInput[] = scriptGift.freeGiftLevel\n ? scriptGift.freeGiftLevel.giveawayProducts\n .map((product) => {\n const giftProduct = scriptGift.giftProductsResult?.find(\n (p) => p.handle === product.handle\n )\n const variant = giftProduct?.variants?.[0]\n\n return {\n variant: {\n id: variant?.id || '',\n handle: product.handle,\n sku: product.sku,\n },\n quantity: 1,\n attributes: [\n {\n key: scriptGiveawayKey,\n value: 'true',\n },\n ],\n }\n })\n .filter((item) => item.variant.id) // Only include items with valid variant IDs\n : []\n\n return [...functionGiftLines, ...scriptGiftLines]\n }, [\n functionGift.qualifyingGift,\n scriptGift.freeGiftLevel,\n scriptGift.giftProductsResult,\n scriptGiveawayKey,\n ])\n\n // Check if any gifts are available\n const hasGifts = useMemo(() => {\n return allGiftLines.length > 0\n }, [allGiftLines])\n\n return {\n functionGift,\n scriptGift,\n allGiftLines,\n hasGifts,\n }\n}\n","import { RuleCondition } from './auto-free-gift'\n\nexport enum OrderDiscountType {\n PERCENTAGE = 1, // 百分比折扣\n FIXED_AMOUNT = 2, // 固定金额折扣\n REDUCE_PRICE = 3, // 降低指定价格\n}\n\nexport enum OrderBasePriceType {\n ORIGIN_PRICE = 1, // 原价\n MIN_DISCOUNTED_PRICE = 2, // 最低折扣价\n}\n\nexport type TieredDiscount = {\n amount: number // 消费门槛金额\n discount: number // 折扣金额\n discount_type: OrderDiscountType // 折扣类型\n}\n\nexport type OrderDiscountConfig = {\n rule_id: number\n rule_type: number\n rule_conditions?: RuleCondition[]\n result_detail: {\n main_product: {\n variant_list: Array<{\n variant_id: string\n sku: string\n handle: string\n }>\n all_store_variant: boolean\n }\n order_discount_conf: {\n base_price: OrderBasePriceType\n tiered_discounts: TieredDiscount[]\n }\n }\n}\n","import { useMemo } from 'react'\nimport { preCheck, getMatchedMainProductSubTotal } from '../utils/auto-free-gift'\nimport {\n OrderDiscountConfig,\n OrderDiscountType,\n OrderBasePriceType,\n TieredDiscount,\n} from '../types/order-discount'\n\n// 返回结果类型\nexport interface OrderDiscountResult {\n qualifyingDiscount: TieredDiscount | null // 当前应得的折扣\n nextTierGoal: TieredDiscount | null // 下一个目标阶梯\n activeCampaign: OrderDiscountConfig | null // 当前生效的活动配置\n discountAmount: number // 折扣金额\n cartTotalForDiscount: number // 用于计算折扣的购物车总额\n isLoading: boolean // 依赖数据是否加载中\n}\n\n/**\n * [计算型 Hook]\n * 根据购物车、活动配置和用户信息,计算出应得的订单折扣和下一个目标。\n * 此 Hook 不产生任何副作用。\n * 使用示例:\n * const { qualifyingDiscount, nextTierGoal, activeCampaign, discountAmount, isLoading } = useCalcOrderDiscount(cart, orderDiscountConfig);\n * @param cart - 购物车\n * @param orderDiscountConfig - 订单折扣配置\n * @returns { OrderDiscountResult }\n */\nexport const useCalcOrderDiscount = (\n cart: any,\n orderDiscountConfig: OrderDiscountConfig[],\n customer: any\n): OrderDiscountResult => {\n const tags = useMemo(() => customer?.tags || [], [customer?.tags])\n const isCustomerLoading = useMemo(() => (!customer ? true : false), [customer])\n const dealsType: string = '' // 可从URL或Context获取\n\n // 1. 找到当前生效的活动和用于计算的子总价\n const { activeCampaign, subtotal } = useMemo(() => {\n // 遍历所有活动配置\n for (const campaign of orderDiscountConfig) {\n const { rule_conditions = [], result_detail } = campaign\n const { main_product, order_discount_conf } = result_detail || {}\n\n // 前置检查,判断用户和环境是否满足活动条件\n const isPreCheckPassed = preCheck(rule_conditions, tags, dealsType ? [dealsType] : [])\n\n if (isPreCheckPassed && main_product && order_discount_conf) {\n // 计算参与活动的主商品的总价\n const matchedSubtotal = getMatchedMainProductSubTotal(\n cart,\n main_product?.variant_list?.map((v) => v.variant_id) || [],\n {\n spend_money_type:\n order_discount_conf.base_price === OrderBasePriceType.MIN_DISCOUNTED_PRICE ? 2 : 1, // 根据基础价格类型设置\n variant_id_list: main_product?.variant_list?.map((v) => v.variant_id) || [],\n all_store_variant: main_product?.all_store_variant || false,\n }\n )\n\n // 如果有主商品在购物车中,则此活动为当前生效的活动\n if (matchedSubtotal > 0) {\n return { activeCampaign: campaign, subtotal: matchedSubtotal }\n }\n }\n }\n // 没有找到生效的活动\n return { activeCampaign: null, subtotal: 0 }\n }, [orderDiscountConfig, cart, tags, dealsType])\n\n // 2. 根据子总价,计算应得折扣和下一个目标\n const { qualifyingDiscount, nextTierGoal, discountAmount } = useMemo(() => {\n if (!activeCampaign || !activeCampaign.result_detail?.order_discount_conf?.tiered_discounts) {\n return {\n qualifyingDiscount: null,\n nextTierGoal: null,\n discountAmount: 0,\n }\n }\n\n const tieredDiscounts = activeCampaign.result_detail.order_discount_conf.tiered_discounts\n\n // a. 找到当前满足条件的最高阶梯 (findLast)\n const qualifyingTier = [...tieredDiscounts].reverse().find((tier) => subtotal >= Number(tier.amount))\n\n // b. 找到下一个目标阶梯 (第一个门槛比当前subtotal高的)\n const nextGoal = tieredDiscounts.find((tier) => subtotal < Number(tier.amount))\n\n if (!qualifyingTier) {\n return {\n qualifyingDiscount: null,\n nextTierGoal: nextGoal || null,\n discountAmount: 0,\n }\n }\n\n // c. 计算折扣金额\n let calculatedDiscount = 0\n switch (qualifyingTier.discount_type) {\n case OrderDiscountType.PERCENTAGE:\n // 百分比折扣\n calculatedDiscount = (subtotal * qualifyingTier.discount) / 100\n break\n case OrderDiscountType.FIXED_AMOUNT:\n // 固定金额折扣\n calculatedDiscount = qualifyingTier.discount\n break\n case OrderDiscountType.REDUCE_PRICE:\n // 降低指定价格\n calculatedDiscount = Math.min(subtotal, qualifyingTier.discount)\n break\n default:\n calculatedDiscount = 0\n }\n\n return {\n qualifyingDiscount: qualifyingTier,\n nextTierGoal: nextGoal || null,\n discountAmount: calculatedDiscount,\n }\n }, [activeCampaign, subtotal])\n\n return {\n qualifyingDiscount,\n nextTierGoal,\n activeCampaign,\n discountAmount,\n cartTotalForDiscount: subtotal,\n isLoading: isCustomerLoading,\n }\n}\n","/**\n * useHasPlusMemberInCart Hook\n * 判断购物车中是否包含年费会员或月费会员产品\n */\n\nimport { useMemo } from 'react'\nimport type { PlusMemberSettingsMetafields } from './types'\nimport { NormalizedCart } from '@anker-in/shopify-sdk'\n\nexport interface UseHasPlusMemberInCartProps {\n /** Plus Member 配置 */\n memberSetting?: PlusMemberSettingsMetafields\n /** 购物车数据 */\n cart?: NormalizedCart\n}\n\nexport interface HasPlusMemberInCartResult {\n /** 购物车中是否有任何会员产品 */\n hasPlusMember: boolean\n /** 购物车中是否有月费会员产品 */\n hasMonthlyPlus: boolean\n /** 购物车中是否有年费会员产品 */\n hasAnnualPlus: boolean\n /** 月费会员产品的 line item */\n monthlyPlusItem?: {\n id: string\n quantity: number\n handle?: string\n sku?: string\n }\n /** 年费会员产品的 line item */\n annualPlusItem?: {\n id: string\n quantity: number\n handle?: string\n sku?: string\n }\n}\n\n/**\n * 判断购物车中是否包含年费会员或月费会员产品\n *\n * @param props - Hook 参数\n * @param props.metafields - Plus Member 配置\n * @returns 会员产品信息\n *\n * @example\n * ```tsx\n * const {\n * hasPlusMember,\n * hasMonthlyPlus,\n * hasAnnualPlus,\n * monthlyPlusItem,\n * annualPlusItem,\n * } = useHasPlusMemberInCart({\n * memberSetting: plusMemberSettings,\n * })\n *\n * if (hasPlusMember) {\n * console.log('购物车中有会员产品')\n * }\n * ```\n */\nexport function useHasPlusMemberInCart({\n memberSetting,\n cart,\n}: UseHasPlusMemberInCartProps): HasPlusMemberInCartResult {\n const { plus_monthly_product, plus_annual_product } = memberSetting || {}\n\n return useMemo(() => {\n if (!cart?.lineItems) {\n return {\n hasPlusMember: false,\n hasMonthlyPlus: false,\n hasAnnualPlus: false,\n }\n }\n\n // 查找月费会员产品\n const monthlyPlusItem = cart.lineItems.find(\n (item) =>\n item.product?.handle === plus_monthly_product?.handle &&\n item.variant?.sku === plus_monthly_product?.sku\n )\n\n // 查找年费会员产品\n const annualPlusItem = cart.lineItems.find(\n (item) =>\n item.product?.handle === plus_annual_product?.handle &&\n item.variant?.sku === plus_annual_product?.sku\n )\n\n const hasMonthlyPlus = !!monthlyPlusItem\n const hasAnnualPlus = !!annualPlusItem\n const hasPlusMember = hasMonthlyPlus || hasAnnualPlus\n\n return {\n hasPlusMember,\n hasMonthlyPlus,\n hasAnnualPlus,\n monthlyPlusItem: monthlyPlusItem,\n annualPlusItem: annualPlusItem,\n }\n }, [cart?.lineItems, plus_monthly_product, plus_annual_product])\n}\n","import Cookies from 'js-cookie'\nimport { useEffect, useMemo, useState } from 'react'\nimport { NormalizedCart } from '@anker-in/shopify-sdk'\nimport Decimal from 'decimal.js'\nimport { PlusMemberSettingsMetafields } from '../../member'\nimport { useHasPlusMemberInCart } from '../../member/plus/use-has-plus-member-in-cart'\nimport { CUSTOMER_ATTRIBUTE_KEY } from '../const'\n\nexport const getReferralAttributes = () => {\n const inviteCode = Cookies.get('invite_code')\n const playModeId = Cookies.get('playModeId')\n const popup = Cookies.get('_popup')\n if (inviteCode && playModeId) {\n return popup\n ? [\n { key: '_invite_code', value: inviteCode ? inviteCode : '' },\n { key: '_play_mode_id', value: playModeId ? playModeId : '' },\n { key: '_popup', value: popup },\n ]\n : [\n { key: '_invite_code', value: inviteCode ? inviteCode : '' },\n { key: '_play_mode_id', value: playModeId ? playModeId : '' },\n ]\n }\n return []\n}\n\nexport const useCartAttributes = ({\n profile,\n customer,\n cart,\n memberSetting,\n}: {\n profile: any\n customer: any\n cart?: NormalizedCart\n memberSetting?: PlusMemberSettingsMetafields\n}): { attributes: Array<{ key: string; value: any }> } => {\n const [currentUrl, setCurrentUrl] = useState('')\n const { hasPlusMember } = useHasPlusMemberInCart({\n memberSetting,\n cart,\n })\n\n useEffect(() => {\n setCurrentUrl(window.location.href)\n }, [])\n\n const userType = useMemo(() => {\n let userInfo: any = Cookies.get('userInfo')\n if (userInfo) {\n userInfo = JSON.parse(userInfo)\n let arr = typeof userInfo?.id == 'string' && userInfo?.id.split('/')\n userInfo.setId = arr[arr.length - 1]\n }\n const customerInfo = userInfo || customer\n if (!customerInfo) {\n return 'new_user_unlogin'\n }\n if (customer) {\n const { orders = {} } = customer\n if (orders?.edges?.length === 1) {\n return 'old_user_orders_once'\n } else if (orders?.edges?.length > 1) {\n return 'old_user_orders_twice'\n }\n }\n return 'new_user_login'\n }, [customer])\n\n // 用户相关\n const memberAttributes = useMemo(() => {\n return [\n {\n key: '_token',\n value: profile?.token, //是否登录\n },\n {\n key: '_member_type',\n value: hasPlusMember ? '2' : profile?.memberType, //:0(游客),1(普通会员),2(付费会员)\n },\n {\n key: '_user_type',\n value: userType, // n\n },\n {\n key: '_is_login',\n value: profile?.token ? 'true' : 'false',\n },\n ]\n }, [profile?.memberType, profile?.token, userType, hasPlusMember])\n\n const functionAttributes = useMemo(() => {\n const hasFunctionEnvAttribute = cart?.lineItems.some((item) =>\n item.customAttributes?.some((attr: any) => attr.key === CUSTOMER_ATTRIBUTE_KEY)\n )\n const discountCodes = cart?.discountCodes.map((item) => item.code).filter((code) => code) || []\n return hasFunctionEnvAttribute\n ? [\n {\n key: '_discounts_function_env',\n value: JSON.stringify({\n discount_code: discountCodes,\n user_tags: customer?.tags || [],\n }),\n },\n ]\n : []\n }, [cart])\n\n // console.log('functionAttributes', cart, functionAttributes)\n\n const presellAttributes = useMemo(() => {\n return [\n {\n key: '_presale',\n value: cart?.lineItems.some((item) => item?.variant?.metafields?.presell === 'presell'),\n },\n ]\n }, [cart])\n\n const weightAttributes = useMemo(() => {\n return [\n {\n key: '_weight',\n value: cart?.lineItems\n .reduce<number>((acc, item) => {\n return new Decimal(acc).plus(item.variant.weight ?? 0).toNumber()\n }, 0)\n .toString(),\n },\n {\n key: '_app_source_name',\n value: 'dtc',\n },\n ]\n }, [cart])\n\n const trackingAttributes = useMemo(() => {\n return [\n {\n key: 'utm_params',\n value: currentUrl,\n },\n ]\n }, [currentUrl])\n\n return useMemo(\n () => ({\n attributes: [\n ...memberAttributes,\n ...functionAttributes,\n ...presellAttributes,\n ...weightAttributes,\n ...trackingAttributes,\n ...getReferralAttributes(),\n ].filter((item) => item?.value) as Array<{ key: string; value: any }>,\n }),\n [memberAttributes, functionAttributes, presellAttributes, weightAttributes, trackingAttributes]\n )\n}\n","import { useMemo } from 'react'\nimport { type NormalizedCart, type NormalizedLineItem } from '@anker-in/shopify-sdk'\n\nconst DEFAULT_MIN = 1\nconst DEFAULT_MAX = 999\n\nexport const useCartItemQuantityLimit = ({\n cart,\n cartItem,\n config,\n}: {\n cart?: NormalizedCart\n cartItem: NormalizedLineItem\n config: {\n handle: Record<string, { min: number; max: number }>\n sku: Record<string, { min: number; max: number }>\n }\n}) => {\n const quantityLimit = useMemo(() => {\n if (config?.handle) {\n // 按handle维度限制\n const cartItemQuantityLimit = config?.handle?.[cartItem?.product?.handle || '']\n\n const sameHandleTotalQuantity =\n cart?.lineItems.reduce((acc, item) => {\n if (\n item.product?.handle === cartItem?.product?.handle &&\n item.variant.sku !== cartItem.variant.sku\n ) {\n acc += item.quantity\n }\n return acc\n }, 0) || 0\n\n return {\n min: cartItemQuantityLimit?.min || DEFAULT_MIN,\n max: cartItemQuantityLimit?.max\n ? cartItemQuantityLimit?.max - sameHandleTotalQuantity\n : DEFAULT_MAX,\n }\n } else if (config?.sku) {\n const cartItemQuantityLimit = config?.sku?.[cartItem?.variant?.sku]\n\n return {\n min: cartItemQuantityLimit?.min || DEFAULT_MIN,\n max: cartItemQuantityLimit?.max || DEFAULT_MAX,\n }\n }\n\n return {\n min: DEFAULT_MIN,\n max: DEFAULT_MAX,\n }\n }, [cartItem, cart])\n\n return quantityLimit\n}\n","import { useEffect, useMemo } from 'react'\nimport {\n CODE_AMOUNT_KEY,\n CUSTOMER_ATTRIBUTE_KEY,\n MAIN_PRODUCT_CODE,\n SCRIPT_CODE_AMOUNT_KEY,\n} from '../const'\nimport { updateCartLines } from '@anker-in/shopify-sdk'\nimport type { NormalizedCart, HasMetafieldsIdentifier } from '@anker-in/shopify-sdk'\nimport { useRequest } from 'ahooks'\nimport { getDiscountEnvAttributeValue } from '../utils/auto-free-gift'\nimport { useShopify } from '../../../provider'\n\nexport const useUpdateLineCodeAmountAttributes = ({\n cart,\n mutateCart,\n isCartLoading,\n setLoadingState,\n metafieldIdentifiers,\n}: {\n cart?: NormalizedCart\n mutateCart: (cart: NormalizedCart | undefined) => void\n isCartLoading: boolean\n setLoadingState: React.Dispatch<React.SetStateAction<any>>\n metafieldIdentifiers?: {\n variant: HasMetafieldsIdentifier[]\n product: HasMetafieldsIdentifier[]\n }\n}) => {\n const { client, cartCookieAdapter } = useShopify()\n\n const mainProductDiscountCodes = useMemo(\n () =>\n cart?.discountCodes\n .filter(\n ({ code, applicable }) =>\n applicable && MAIN_PRODUCT_CODE.some((codePrefix) => code.startsWith(codePrefix))\n )\n .map(({ code }) => code),\n [cart]\n )\n\n const linesNeedUpdate = useMemo(\n () =>\n cart?.lineItems\n .map((line) => {\n const attrNeedUpdate: Array<{ key: string; value: string }> = []\n const attrNeedDelete = []\n\n const codeDiscount = line.discountAllocations?.find((allocation) =>\n mainProductDiscountCodes?.includes(allocation.code)\n )\n\n // 是否有 _discounts_function_env 属性\n const hasFunctionEnvAttribute = line.customAttributes?.find(\n (attr: { key: string; value: string }) => attr.key === CUSTOMER_ATTRIBUTE_KEY\n )\n const functionEnvValue = getDiscountEnvAttributeValue(line.customAttributes)\n // lineItem 折后总价与attr中的不一致的情况\n const hasSameFunctionEnvAttribute =\n Number(functionEnvValue.discounted_amount) === Number(line.totalAmount)\n\n if (!hasSameFunctionEnvAttribute && hasFunctionEnvAttribute) {\n attrNeedUpdate.push({\n key: CUSTOMER_ATTRIBUTE_KEY,\n value: JSON.stringify({\n ...functionEnvValue,\n discounted_amount: Number(line.totalAmount),\n }),\n })\n }\n\n const codeDiscountAmount = codeDiscount?.amount || 0\n // 是否有 code_money 属性\n const hasCodeAmountAttribute = line.customAttributes?.find(\n (attr: { key: string; value: string }) =>\n attr.key === CODE_AMOUNT_KEY || attr.key === SCRIPT_CODE_AMOUNT_KEY\n )\n // 两个属性都存在且值相同,则不更新\n const hasSameCodeAmountAttribute =\n line.customAttributes?.find(\n (attr: { key: string; value: string }) =>\n attr.key === CODE_AMOUNT_KEY && attr.value === String(codeDiscountAmount)\n ) &&\n line.customAttributes?.find(\n (attr: { key: string; value: string }) =>\n attr.key === SCRIPT_CODE_AMOUNT_KEY && attr.value === String(codeDiscountAmount)\n )\n\n if (codeDiscount && !hasSameCodeAmountAttribute) {\n attrNeedUpdate.push({\n key: CODE_AMOUNT_KEY,\n value: String(codeDiscountAmount),\n })\n attrNeedUpdate.push({\n key: SCRIPT_CODE_AMOUNT_KEY,\n value: String(codeDiscountAmount),\n })\n } else if (!codeDiscount && hasCodeAmountAttribute) {\n // 没有 code 需要删除的情况\n attrNeedDelete.push(CODE_AMOUNT_KEY)\n attrNeedDelete.push(SCRIPT_CODE_AMOUNT_KEY)\n }\n\n return {\n line,\n attrNeedUpdate,\n attrNeedDelete,\n }\n })\n .filter(\n ({ attrNeedUpdate, attrNeedDelete }) => attrNeedUpdate.length || attrNeedDelete.length\n )\n .map(({ line, attrNeedUpdate, attrNeedDelete }) => {\n if (attrNeedUpdate.length) {\n return {\n id: line.id,\n attributes: [\n ...(line.customAttributes?.filter(\n (attr: { key: string; value: string }) =>\n !attrNeedUpdate.some((updateAttr) => updateAttr.key === attr.key)\n ) || []),\n ...attrNeedUpdate,\n ],\n }\n } else if (attrNeedDelete.length) {\n return {\n id: line.id,\n attributes:\n line.customAttributes?.filter(\n (attr: { key: string; value: string }) => !attrNeedDelete.includes(attr.key)\n ) || [],\n }\n } else {\n return {\n id: line.id,\n attributes: line.customAttributes || [],\n }\n }\n }),\n [cart?.lineItems, mainProductDiscountCodes]\n )\n\n const { loading } = useRequest(\n async () => {\n if (linesNeedUpdate?.length && !isCartLoading) {\n const result = await updateCartLines(client, {\n cartId: cart?.id || '',\n lines: linesNeedUpdate,\n metafieldIdentifiers,\n cookieAdapter: cartCookieAdapter,\n })\n if (result) {\n mutateCart(result)\n }\n }\n },\n {\n throttleWait: 3000, // 3 秒内只触发最后一次更新\n throttleTrailing: true,\n refreshDeps: [linesNeedUpdate, isCartLoading],\n }\n )\n\n useEffect(() => {\n setLoadingState((prev: any) => {\n return {\n ...prev,\n editLineCodeAmountLoading: loading,\n }\n })\n }, [loading, setLoadingState])\n}\n","export enum PriceDiscountType {\n PERCENTAGE = 1, // 百分比折扣\n FIXED_AMOUNT = 2, // 固定金额折扣\n}\n\nexport enum PriceBasePriceType {\n MIN_DISCOUNTED_PRICE = 1, // 最低折扣价\n MIN_TOTAL_PRICE = 2, // 最低总价\n}\n\nexport type PriceDiscountConfig = {\n rule_id: number\n rule_type: number\n discount_type: PriceDiscountType\n discount_value: number\n base_price_type: PriceBasePriceType\n applicable_products: Array<{\n product_id: string\n variant_id?: string\n }>\n}\n","/**\n * useProduct Hook\n *\n * Fetches a single product by handle with SWR caching\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getProduct, type NormalizedProduct } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseProductOptions extends SWRConfiguration<NormalizedProduct | undefined> {\n handle?: string\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\n/**\n * Hook to fetch a single product by handle\n *\n * @param options - Hook options including handle and SWR configuration\n * @returns SWR response with product data\n *\n * @example\n * ```typescript\n * function ProductPage() {\n * const { data: product, error, isLoading } = useProduct({\n * handle: 'my-product'\n * })\n *\n * if (isLoading) return <div>Loading...</div>\n * if (error) return <div>Error loading product</div>\n * if (!product) return <div>Product not found</div>\n *\n * return (\n * <div>\n * <h1>{product.title}</h1>\n * <p>{product.description}</p>\n * <p>${product.price.amount}</p>\n * </div>\n * )\n * }\n * ```\n */\nexport function useProduct(options: UseProductOptions = {}) {\n const { client, locale } = useShopify()\n const { handle, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<NormalizedProduct | undefined>(\n handle ? ['product', locale, handle, metafieldIdentifiers] : null,\n () =>\n getProduct(client, {\n handle: handle!,\n locale,\n metafieldIdentifiers,\n }),\n swrOptions\n )\n}\n","/**\n * useAllProducts Hook\n *\n * Fetches all products with SWR caching\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getAllProducts, type NormalizedProduct } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseAllProductsOptions extends SWRConfiguration<NormalizedProduct[]> {\n first?: number\n query?: string\n sortKey?:\n | 'TITLE'\n | 'PRODUCT_TYPE'\n | 'VENDOR'\n | 'UPDATED_AT'\n | 'CREATED_AT'\n | 'BEST_SELLING'\n | 'PRICE'\n | 'RELEVANCE'\n reverse?: boolean\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\n/**\n * Hook to fetch all products\n *\n * This hook automatically handles pagination and fetches all products.\n * Use with caution on stores with many products.\n *\n * @param options - Hook options including query parameters and SWR configuration\n * @returns SWR response with products array\n *\n * @example\n * ```typescript\n * function ProductList() {\n * const { data: products, error, isLoading } = useAllProducts({\n * sortKey: 'TITLE',\n * reverse: false\n * })\n *\n * if (isLoading) return <div>Loading...</div>\n * if (error) return <div>Error loading products</div>\n *\n * return (\n * <div>\n * {products?.map(product => (\n * <div key={product.id}>\n * <h2>{product.title}</h2>\n * <p>${product.price.amount}</p>\n * </div>\n * ))}\n * </div>\n * )\n * }\n * ```\n */\nexport function useAllProducts(options: UseAllProductsOptions = {}) {\n const { client, locale } = useShopify()\n const { first, query, sortKey, reverse, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<NormalizedProduct[]>(\n ['all-products', locale, first, query, sortKey, reverse, metafieldIdentifiers],\n () =>\n getAllProducts(client, {\n locale,\n first,\n query,\n sortKey,\n reverse,\n metafieldIdentifiers,\n }),\n swrOptions\n )\n}\n","/**\n * useProductsByHandles Hook\n *\n * Fetches multiple products by their handles with SWR caching\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport {\n getProductsByHandles,\n HasMetafieldsIdentifier,\n type NormalizedProduct,\n} from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseProductsByHandlesOptions extends SWRConfiguration<NormalizedProduct[]> {\n handles?: string[]\n metafieldIdentifiers?: {\n product: HasMetafieldsIdentifier[]\n variant: HasMetafieldsIdentifier[]\n }\n}\n\n/**\n * Hook to fetch multiple products by their handles\n *\n * @param options - Hook options including handles array and SWR configuration\n * @returns SWR response with products array\n *\n * @example\n * ```typescript\n * function FeaturedProducts() {\n * const { data: products, error, isLoading } = useProductsByHandles({\n * handles: ['product-1', 'product-2', 'product-3']\n * })\n *\n * if (isLoading) return <div>Loading...</div>\n * if (error) return <div>Error loading products</div>\n *\n * return (\n * <div>\n * {products?.map(product => (\n * <div key={product.id}>\n * <h2>{product.title}</h2>\n * <p>${product.price.amount}</p>\n * </div>\n * ))}\n * </div>\n * )\n * }\n * ```\n */\nexport function useProductsByHandles(options: UseProductsByHandlesOptions = {}) {\n const { client, locale } = useShopify()\n const { handles: originHandles, metafieldIdentifiers, ...swrOptions } = options\n const handles = new Set(originHandles || [])\n\n // Create a stable key for SWR\n // Sort handles to ensure consistent cache key\n const sortedHandles = handles ? [...handles].sort() : undefined\n\n return useSWR<NormalizedProduct[]>(\n sortedHandles && sortedHandles.length > 0\n ? ['products-by-handles', locale, sortedHandles.join(','), metafieldIdentifiers]\n : null,\n () => {\n const handlesArray = [...handles]\n if (handlesArray?.length === 0) {\n throw new Error('Handles are required')\n }\n return getProductsByHandles(client, {\n handles: [...handles],\n locale,\n metafieldIdentifiers,\n })\n },\n swrOptions || {\n revalidateOnFocus: false,\n }\n )\n}\n","/**\n * useVariant Hook\n *\n * Client-side hook to get the selected variant based on selected options\n */\n\nimport { useEffect, useState } from 'react'\nimport type { NormalizedProduct, NormalizedProductVariant } from '@anker-in/shopify-sdk'\n\nexport type Options = Record<string, string>\n\n/**\n * Get the first available variant from a product\n */\nfunction getFirstAvailableVariant(product: NormalizedProduct): NormalizedProductVariant | undefined {\n const availableVariant = product.variants.find((v) => v.availableForSale)\n return availableVariant || product.variants[0]\n}\n\n/**\n * Get variant from selected options\n */\nfunction getVariantFromSelectedOptions(\n product: NormalizedProduct,\n selectedOptions: Options\n): NormalizedProductVariant | undefined {\n return product.variants.find((variant) => {\n return variant.selectedOptions.every((option) => {\n return selectedOptions[option.name] === option.value\n })\n })\n}\n\n/**\n * Hook to manage variant selection based on selected options\n *\n * @param product - The product object\n * @param selectedOptions - Currently selected options { Color: 'Red', Size: 'M' }\n * @returns The matching variant\n *\n * @example\n * ```typescript\n * function ProductDetail() {\n * const { data: product } = useProduct({ handle: 'my-product' })\n * const [selectedOptions, setSelectedOptions] = useState({ Color: 'Red', Size: 'M' })\n * const variant = useVariant({ product, selectedOptions })\n *\n * return (\n * <div>\n * <h1>{product.title}</h1>\n * <p>Selected: {variant.title}</p>\n * <p>Price: ${variant.price.amount}</p>\n * <p>Available: {variant.availableForSale ? 'Yes' : 'No'}</p>\n * </div>\n * )\n * }\n * ```\n */\nexport function useVariant({\n product,\n selectedOptions,\n}: {\n product?: NormalizedProduct\n selectedOptions: Options\n}): NormalizedProductVariant | undefined {\n const [variant, setVariant] = useState<NormalizedProductVariant | undefined>(\n product ? getFirstAvailableVariant(product) : undefined\n )\n\n useEffect(() => {\n if (!product) {\n setVariant(undefined)\n return\n }\n\n const newVariant = getVariantFromSelectedOptions(product, selectedOptions)\n if (newVariant && newVariant.id !== variant?.id) {\n setVariant(newVariant)\n } else if (!newVariant) {\n // If no matching variant, use first available\n setVariant(getFirstAvailableVariant(product))\n }\n }, [selectedOptions, product, variant?.id])\n\n return variant\n}\n","/**\n * usePrice Hook\n *\n * Client-side hook to format price for display\n */\n\nimport { useMemo } from 'react'\nimport { useShopify } from '../../provider'\n\nconst FAKE_PRICE = 9999999.99\n\n/**\n * Format price using Intl.NumberFormat\n */\nfunction formatPrice({\n amount,\n currencyCode,\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n removeTrailingZeros,\n}: {\n amount: number\n currencyCode: string\n locale: string\n maximumFractionDigits?: number\n minimumFractionDigits?: number\n removeTrailingZeros?: boolean\n}): string {\n const formatter = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode,\n maximumFractionDigits: maximumFractionDigits ?? 2,\n minimumFractionDigits: minimumFractionDigits ?? 2,\n })\n\n let formatted = formatter.format(amount)\n\n if (removeTrailingZeros) {\n formatted = formatted.replace(/\\.00$/, '')\n }\n\n return formatted\n}\n\n/**\n * Format variant price with compare at price\n */\nfunction formatVariantPrice({\n amount,\n baseAmount,\n currencyCode,\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n removeTrailingZeros,\n}: {\n amount: number\n baseAmount: number\n currencyCode: string\n locale: string\n maximumFractionDigits?: number\n minimumFractionDigits?: number\n removeTrailingZeros?: boolean\n}): { price: string; basePrice: string } {\n return {\n price: formatPrice({\n amount,\n currencyCode,\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n removeTrailingZeros,\n }),\n basePrice: formatPrice({\n amount: baseAmount,\n currencyCode,\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n removeTrailingZeros,\n }),\n }\n}\n\nexport interface UsePriceOptions {\n amount: number\n baseAmount?: number\n currencyCode: string\n soldOutDescription?: string\n maximumFractionDigits?: number\n minimumFractionDigits?: number\n removeTrailingZeros?: boolean\n}\n\nexport interface UsePriceResult {\n price: string\n basePrice?: string\n free: boolean\n}\n\n/**\n * Hook to format price for display\n *\n * @param options - Price formatting options\n * @returns Formatted price object\n *\n * @example\n * ```typescript\n * function ProductPrice({ variant }) {\n * const { price, basePrice, free } = usePrice({\n * amount: variant.price.amount,\n * baseAmount: variant.compareAtPrice?.amount,\n * currencyCode: variant.price.currencyCode\n * })\n *\n * return (\n * <div>\n * {free ? (\n * <span>Free</span>\n * ) : (\n * <>\n * <span className=\"price\">{price}</span>\n * {basePrice && <span className=\"original\">{basePrice}</span>}\n * </>\n * )}\n * </div>\n * )\n * }\n * ```\n */\nexport function usePrice({\n amount,\n baseAmount,\n currencyCode,\n soldOutDescription = '',\n maximumFractionDigits,\n minimumFractionDigits,\n removeTrailingZeros,\n}: UsePriceOptions): UsePriceResult {\n const { locale } = useShopify()\n\n const value = useMemo(() => {\n if (typeof amount !== 'number' || !currencyCode) {\n return ''\n }\n\n // Handle sold out with fake price\n if (soldOutDescription && amount >= FAKE_PRICE) {\n return soldOutDescription\n }\n\n return baseAmount\n ? formatVariantPrice({\n amount,\n baseAmount,\n currencyCode,\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n removeTrailingZeros,\n })\n : formatPrice({\n amount,\n currencyCode,\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n removeTrailingZeros,\n })\n }, [\n amount,\n baseAmount,\n currencyCode,\n locale,\n maximumFractionDigits,\n minimumFractionDigits,\n soldOutDescription,\n removeTrailingZeros,\n ])\n\n const result = useMemo<UsePriceResult>(() => {\n const free = Boolean(amount && amount <= 0)\n return typeof value === 'string' ? { price: value, basePrice: value, free } : { ...value, free }\n }, [value, amount])\n\n return result\n}\n","/**\n * useSelectedOptions Hook\n *\n * Client-side hook to manage selected product options\n */\n\nimport { useEffect, useState, type Dispatch, type SetStateAction } from 'react'\nimport type { NormalizedProduct, NormalizedProductVariant } from '@anker-in/shopify-sdk'\nimport type { Options } from './use-variant'\n\nexport type SelectedOptionsResult = [Options, Dispatch<SetStateAction<Options>>]\n\n/**\n * Construct options object from variant's selectedOptions array\n */\nfunction optionsConstructor(selectedOptions: Array<{ name: string; value: string }>): Options {\n return selectedOptions.reduce((acc, option) => {\n acc[option.name] = option.value\n return acc\n }, {} as Options)\n}\n\n/**\n * Decode base64 ID to get the numeric ID\n */\nfunction decodeShopifyId(gid: string): string {\n try {\n const base64 = gid.split('/').pop() || ''\n return atob(base64)\n } catch {\n return gid\n }\n}\n\n/**\n * Hook to manage selected product options based on URL query or SKU\n *\n * @param product - The product object\n * @param sku - Optional SKU to match variant\n * @returns Tuple of [options, setOptions]\n *\n * @example\n * ```typescript\n * function ProductDetail() {\n * const { data: product } = useProduct({ handle: 'my-product' })\n * const [selectedOptions, setSelectedOptions] = useSelectedOptions(product)\n * const variant = useVariant({ product, selectedOptions })\n *\n * const handleOptionChange = (name: string, value: string) => {\n * setSelectedOptions(prev => ({ ...prev, [name]: value }))\n * }\n *\n * return (\n * <div>\n * {product?.options.map(option => (\n * <select\n * key={option.id}\n * value={selectedOptions[option.name] || ''}\n * onChange={(e) => handleOptionChange(option.name, e.target.value)}\n * >\n * {option.values.map(value => (\n * <option key={value.label} value={value.label}>\n * {value.label}\n * </option>\n * ))}\n * </select>\n * ))}\n * <p>Selected: {variant?.title}</p>\n * </div>\n * )\n * }\n * ```\n */\nexport function useSelectedOptions(\n product?: NormalizedProduct,\n sku?: string\n): SelectedOptionsResult {\n const [options, setOptions] = useState<Options>({})\n\n useEffect(() => {\n if (!product || !product.variants.length) {\n setOptions({})\n return\n }\n\n // Try to get variant from URL query string\n let variant: NormalizedProductVariant | undefined = product.variants[0]\n\n if (typeof window !== 'undefined') {\n const searchParams = new URLSearchParams(window.location.search)\n const variantIdParam = searchParams.get('variant')\n\n if (variantIdParam) {\n // Try to find variant by ID (supports both numeric and GID formats)\n const foundVariant = product.variants.find((v) => {\n if (sku) return v.sku === sku\n // Support both formats: \"123456\" and \"gid://shopify/ProductVariant/123456\"\n return (\n v.id === variantIdParam ||\n v.id.includes(variantIdParam) ||\n decodeShopifyId(v.id) === variantIdParam\n )\n })\n\n if (foundVariant) {\n variant = foundVariant\n }\n }\n }\n\n // Update selected options based on the variant\n if (variant) {\n const newOptions = optionsConstructor(variant.selectedOptions)\n setOptions(newOptions)\n }\n }, [product, sku])\n\n return [options, setOptions]\n}\n","/**\n * useProductUrl Hook\n *\n * Hook to generate product URLs with variant query params\n * Requires routerAdapter to be configured in ShopifyProvider\n */\n\nimport { useCallback } from 'react'\nimport type { NormalizedProduct, NormalizedProductVariant } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\n/**\n * Decode Shopify GID to get numeric ID\n */\nfunction decodeShopifyId(gid: string): string | undefined {\n try {\n // GID format: gid://shopify/ProductVariant/123456\n const parts = gid.split('/')\n return parts[parts.length - 1] || gid\n } catch {\n return gid\n }\n}\n\n/**\n * Hook to generate product URLs\n *\n * @param otherQuery - Additional query parameters to include\n * @returns Function to generate product URL\n *\n * @example\n * ```typescript\n * function ProductCard({ product, variant }) {\n * const getProductUrl = useProductUrl()\n *\n * const url = getProductUrl({ product, variant })\n *\n * return (\n * <a href={url}>\n * <h2>{product.title}</h2>\n * <p>{variant.title}</p>\n * </a>\n * )\n * }\n * ```\n *\n * @example With additional query params\n * ```typescript\n * function ProductCard({ product, variant }) {\n * const getProductUrl = useProductUrl({ utm_source: 'email' })\n *\n * const url = getProductUrl({ product, variant })\n * // URL will include: ?variant=123&utm_source=email\n *\n * return <a href={url}>{product.title}</a>\n * }\n * ```\n */\nexport function useProductUrl(otherQuery?: Record<string, string>) {\n const { routerAdapter } = useShopify()\n\n return useCallback(\n ({ product, variant }: { product?: NormalizedProduct; variant?: NormalizedProductVariant }): string => {\n if (!product) return ''\n\n const queryParams = new URLSearchParams()\n\n // Add variant ID if provided\n if (variant?.id) {\n const variantId = decodeShopifyId(variant.id)\n if (variantId) {\n queryParams.set('variant', variantId)\n }\n }\n\n // Add other query params\n if (otherQuery) {\n Object.entries(otherQuery).forEach(([key, value]) => {\n queryParams.set(key, value)\n })\n }\n\n const queryString = queryParams.toString()\n const path = `/products/${product.handle}${queryString ? `?${queryString}` : ''}`\n\n // Use routerAdapter if available, otherwise return plain path\n if (routerAdapter?.getLocalizedPath) {\n return routerAdapter.getLocalizedPath(path)\n }\n\n return path\n },\n [routerAdapter, otherQuery]\n )\n}\n","/**\n * useUpdateVariantQuery Hook\n *\n * Hook to automatically update URL query string when variant changes\n */\n\nimport { useEffect } from 'react'\nimport type { NormalizedProductVariant } from '@anker-in/shopify-sdk'\n\n/**\n * Decode Shopify GID to get numeric ID\n */\nfunction decodeShopifyId(gid: string): string | undefined {\n try {\n // GID format: gid://shopify/ProductVariant/123456\n const parts = gid.split('/')\n return parts[parts.length - 1] || gid\n } catch {\n return gid\n }\n}\n\n/**\n * Hook to update URL query string when variant changes\n *\n * This hook automatically updates the browser URL with the selected variant ID\n * without causing a page reload. Useful for shareable URLs and browser history.\n *\n * @param variant - The selected variant\n *\n * @example\n * ```typescript\n * function ProductDetail() {\n * const { data: product } = useProduct({ handle: 'my-product' })\n * const [selectedOptions, setSelectedOptions] = useSelectedOptions(product)\n * const variant = useVariant({ product, selectedOptions })\n *\n * // Automatically updates URL when variant changes\n * useUpdateVariantQuery(variant)\n *\n * return (\n * <div>\n * <h1>{product?.title}</h1>\n * <p>Current variant: {variant?.title}</p>\n * {/* URL will be: /products/my-product?variant=123456 *\\/}\n * </div>\n * )\n * }\n * ```\n */\nexport function useUpdateVariantQuery(variant?: NormalizedProductVariant): void {\n useEffect(() => {\n if (!variant || typeof window === 'undefined') {\n return\n }\n\n const searchParams = new URLSearchParams(window.location.search)\n const currentVariantId = searchParams.get('variant')\n const newVariantId = decodeShopifyId(variant.id)\n\n // Only update if variant ID has changed\n if (newVariantId && currentVariantId !== newVariantId) {\n searchParams.set('variant', newVariantId)\n\n const newUrl = `${window.location.pathname}?${searchParams.toString()}${window.location.hash}`\n\n // Update URL without reload\n window.history.replaceState({}, '', newUrl)\n }\n }, [variant])\n}\n","/**\n * useVariantMedia Hook\n *\n * Hook to get media (images and videos) for the selected variant\n */\n\nimport { useEffect, useState } from 'react'\nimport type { NormalizedProduct, NormalizedProductVariant, Media } from '@anker-in/shopify-sdk'\n\nexport type ImageMedia = Media & { mediaContentType: 'IMAGE' }\nexport type VideoMedia = Media & { mediaContentType: 'VIDEO' | 'EXTERNAL_VIDEO' }\n\nexport interface VariantMedia {\n productList: ImageMedia[]\n sceneList: ImageMedia[]\n videoList: VideoMedia[]\n}\n\n/**\n * Get media list for a specific variant\n * Returns variant-specific media if available, otherwise returns product media\n */\nfunction getVariantMediaList({\n product,\n variant,\n}: {\n product: NormalizedProduct\n variant: NormalizedProductVariant\n}): Media[] {\n // If variant has an image, try to find matching media in product\n if (variant.image?.url) {\n const variantMediaId = variant.image.url\n\n // Find all media that matches the variant's image\n const variantMedia = product.media.filter((media) => {\n if (media.mediaContentType === 'IMAGE' && media.previewImage) {\n return media.previewImage?.url === variantMediaId\n }\n return false\n })\n\n // If we found variant-specific media, return it along with other media\n if (variantMedia.length > 0) {\n // Get remaining media that's not variant-specific\n const otherMedia = product.media.filter((media) => {\n if (media.mediaContentType === 'IMAGE' && media.previewImage) {\n return media.previewImage.url !== variantMediaId\n }\n return true\n })\n\n return [...variantMedia, ...otherMedia]\n }\n }\n\n // Default to all product media\n return product.media\n}\n\n/**\n * Hook to get media for the selected variant\n *\n * @param product - The product object\n * @param variant - The selected variant\n * @returns Object with productList (first image), sceneList (other images), videoList\n *\n * @example\n * ```typescript\n * function ProductGallery() {\n * const { data: product } = useProduct({ handle: 'my-product' })\n * const [selectedOptions, setSelectedOptions] = useSelectedOptions(product)\n * const variant = useVariant({ product, selectedOptions })\n * const { productList, sceneList, videoList } = useVariantMedia({ product, variant })\n *\n * return (\n * <div>\n * {/* Main product image *\\/}\n * {productList.map(media => (\n * <img key={media.id} src={media.image?.url} alt={media.alt} />\n * ))}\n *\n * {/* Scene/detail images *\\/}\n * {sceneList.map(media => (\n * <img key={media.id} src={media.image?.url} alt={media.alt} />\n * ))}\n *\n * {/* Videos *\\/}\n * {videoList.map(media => (\n * <video key={media.id} src={media.sources?.[0]?.url} controls />\n * ))}\n * </div>\n * )\n * }\n * ```\n */\nexport function useVariantMedia({\n product,\n variant,\n}: {\n product?: NormalizedProduct\n variant?: NormalizedProductVariant\n}): VariantMedia {\n const [imageList, setImageList] = useState<ImageMedia[]>([])\n const [sceneList, setSceneList] = useState<ImageMedia[]>([])\n const [videoList, setVideoList] = useState<VideoMedia[]>([])\n\n useEffect(() => {\n if (!product || !variant) {\n setImageList([])\n setSceneList([])\n setVideoList([])\n return\n }\n\n const mediaList = getVariantMediaList({ product, variant })\n\n // Separate images and videos\n const images = mediaList.filter((media) => media.mediaContentType === 'IMAGE') as ImageMedia[]\n const videos = mediaList.filter(\n (media) => media.mediaContentType === 'VIDEO' || media.mediaContentType === 'EXTERNAL_VIDEO'\n ) as VideoMedia[]\n\n // First image is the product image, rest are scene images\n setImageList(images.length > 0 && images[0] ? [images[0]] : [])\n setSceneList(images.length > 1 ? images.slice(1) : [])\n setVideoList(videos)\n }, [product, variant])\n\n return {\n productList: imageList,\n sceneList,\n videoList,\n }\n}\n","/**\n * useCollection Hook\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getCollection, type NormalizedCollection } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseCollectionOptions extends SWRConfiguration<NormalizedCollection | undefined> {\n handle?: string\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\nexport function useCollection(options: UseCollectionOptions = {}) {\n const { client, locale } = useShopify()\n const { handle, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<NormalizedCollection | undefined>(\n handle ? ['collection', locale, handle, metafieldIdentifiers] : null,\n () =>\n getCollection(client, {\n handle: handle!,\n locale,\n metafieldIdentifiers,\n }),\n swrOptions\n )\n}\n","/**\n * useAllCollections Hook\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getAllCollections, type NormalizedCollection } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseAllCollectionsOptions extends SWRConfiguration<NormalizedCollection[]> {\n first?: number\n query?: string\n sortKey?: 'TITLE' | 'UPDATED_AT' | 'ID' | 'RELEVANCE'\n reverse?: boolean\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\nexport function useAllCollections(options: UseAllCollectionsOptions = {}) {\n const { client, locale } = useShopify()\n const { first, query, sortKey, reverse, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<NormalizedCollection[]>(\n ['all-collections', locale, first, query, sortKey, reverse, metafieldIdentifiers],\n () =>\n getAllCollections(client, {\n locale,\n first,\n query,\n sortKey,\n reverse,\n metafieldIdentifiers,\n }),\n swrOptions\n )\n}\n","/**\n * useCollections Hook (with pagination info)\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getCollections, type CollectionsConnection } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseCollectionsOptions extends SWRConfiguration<CollectionsConnection> {\n first?: number\n after?: string\n query?: string\n sortKey?: 'TITLE' | 'UPDATED_AT' | 'ID' | 'RELEVANCE'\n reverse?: boolean\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\nexport function useCollections(options: UseCollectionsOptions = {}) {\n const { client, locale } = useShopify()\n const { first, after, query, sortKey, reverse, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<CollectionsConnection>(\n ['collections', locale, first, after, query, sortKey, reverse, metafieldIdentifiers],\n () =>\n getCollections(client, {\n locale,\n first,\n after,\n query,\n sortKey,\n reverse,\n metafieldIdentifiers,\n }),\n swrOptions\n )\n}\n","/**\n * useBlog Hook\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getBlog, type NormalizedBlog } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseBlogOptions extends SWRConfiguration<NormalizedBlog | undefined> {\n handle?: string\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\nexport function useBlog(options: UseBlogOptions = {}) {\n const { client, locale } = useShopify()\n const { handle, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<NormalizedBlog | undefined>(\n handle ? ['blog', locale, handle, metafieldIdentifiers] : null,\n () => getBlog(client, { handle: handle!, locale, metafieldIdentifiers }),\n swrOptions\n )\n}\n","/**\n * useAllBlogs Hook\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getAllBlogs, type NormalizedBlog } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseAllBlogsOptions extends SWRConfiguration<NormalizedBlog[]> {\n first?: number\n query?: string\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\nexport function useAllBlogs(options: UseAllBlogsOptions = {}) {\n const { client, locale } = useShopify()\n const { first, query, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<NormalizedBlog[]>(\n ['all-blogs', locale, first, query, metafieldIdentifiers],\n () =>\n getAllBlogs(client, {\n locale,\n first,\n query,\n metafieldIdentifiers,\n }),\n swrOptions\n )\n}\n","/**\n * useArticle Hook\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getArticle, type NormalizedArticle } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseArticleOptions extends SWRConfiguration<NormalizedArticle | undefined> {\n blogHandle?: string\n articleHandle?: string\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\nexport function useArticle(options: UseArticleOptions = {}) {\n const { client, locale } = useShopify()\n const { blogHandle, articleHandle, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<NormalizedArticle | undefined>(\n blogHandle && articleHandle\n ? ['article', locale, blogHandle, articleHandle, metafieldIdentifiers]\n : null,\n () =>\n getArticle(client, {\n blogHandle: blogHandle!,\n articleHandle: articleHandle!,\n locale,\n metafieldIdentifiers,\n }),\n swrOptions\n )\n}\n","/**\n * useArticles Hook (all articles across all blogs)\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getArticles, type NormalizedArticle } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseArticlesOptions extends SWRConfiguration<NormalizedArticle[]> {\n first?: number\n query?: string\n sortKey?: 'PUBLISHED_AT' | 'UPDATED_AT' | 'TITLE' | 'ID' | 'RELEVANCE'\n reverse?: boolean\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\nexport function useArticles(options: UseArticlesOptions = {}) {\n const { client, locale } = useShopify()\n const { first, query, sortKey, reverse, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<NormalizedArticle[]>(\n ['articles', locale, first, query, sortKey, reverse, metafieldIdentifiers],\n () =>\n getArticles(client, {\n locale,\n first,\n query,\n sortKey,\n reverse,\n metafieldIdentifiers,\n }),\n swrOptions\n )\n}\n","/**\n * useArticlesInBlog Hook (articles from a specific blog)\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { getArticlesInBlog, type NormalizedArticle } from '@anker-in/shopify-sdk'\nimport { useShopify } from '../../provider'\n\nexport interface UseArticlesInBlogOptions extends SWRConfiguration<NormalizedArticle[]> {\n blogHandle?: string\n first?: number\n sortKey?: 'PUBLISHED_AT' | 'UPDATED_AT' | 'TITLE' | 'ID' | 'RELEVANCE'\n reverse?: boolean\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\nexport function useArticlesInBlog(options: UseArticlesInBlogOptions = {}) {\n const { client, locale } = useShopify()\n const { blogHandle, first, sortKey, reverse, metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<NormalizedArticle[]>(\n blogHandle\n ? ['articles-in-blog', locale, blogHandle, first, sortKey, reverse, metafieldIdentifiers]\n : null,\n () =>\n getArticlesInBlog(client, {\n blogHandle: blogHandle!,\n locale,\n first,\n sortKey,\n reverse,\n metafieldIdentifiers,\n }),\n swrOptions\n )\n}\n","/**\n * useSearch Hook\n *\n * Simple hook to search products, articles, pages\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { useShopify } from '../../provider'\nimport type { ShopifyClient } from '@anker-in/shopify-sdk'\n\nexport type SearchResultType = 'ARTICLE' | 'PAGE' | 'PRODUCT'\n\nexport interface SearchResultItem {\n type: SearchResultType\n id?: string\n handle?: string\n title?: string\n description?: string\n url?: string\n image?: {\n url: string\n altText?: string\n }\n}\n\nexport interface SearchResult {\n items: SearchResultItem[]\n totalCount: number\n pageInfo?: {\n hasNextPage: boolean\n endCursor?: string\n }\n}\n\nexport interface UseSearchOptions extends SWRConfiguration<SearchResult | undefined> {\n query?: string\n first?: number\n types?: SearchResultType[]\n productFilters?: any[]\n}\n\nasync function performSearch(\n client: ShopifyClient,\n locale: string,\n searchQuery?: string,\n first: number = 20,\n types: SearchResultType[] = ['PRODUCT', 'ARTICLE', 'PAGE']\n): Promise<SearchResult | undefined> {\n if (!searchQuery) {\n return undefined\n }\n\n const query = /* GraphQL */ `\n query search($query: String!, $first: Int!, $types: [SearchType!])\n @inContext(language: $language) {\n search(query: $query, first: $first, types: $types, unavailableProducts: HIDE) {\n totalCount\n edges {\n node {\n ... on Article {\n __typename\n id\n handle\n title\n excerpt\n image {\n url\n altText\n }\n }\n ... on Page {\n __typename\n id\n handle\n title\n }\n ... on Product {\n __typename\n id\n handle\n title\n description\n featuredImage {\n url\n altText\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n `\n\n const data = await client.query<{ search: any }>(query, {\n query: searchQuery,\n first,\n types,\n })\n\n if (!data || !data.search) {\n return undefined\n }\n\n const items: SearchResultItem[] =\n data.search.edges?.map((edge: any) => {\n const node = edge.node\n const item: SearchResultItem = {\n type: node.__typename.toUpperCase() as SearchResultType,\n id: node.id,\n handle: node.handle,\n title: node.title,\n }\n\n if (node.__typename === 'Product') {\n item.description = node.description\n item.image = node.featuredImage\n ? {\n url: node.featuredImage.url,\n altText: node.featuredImage.altText,\n }\n : undefined\n } else if (node.__typename === 'Article') {\n item.description = node.excerpt\n item.image = node.image\n ? {\n url: node.image.url,\n altText: node.image.altText,\n }\n : undefined\n }\n\n return item\n }) || []\n\n return {\n items,\n totalCount: data.search.totalCount || 0,\n pageInfo: data.search.pageInfo,\n }\n}\n\nexport function useSearch(options: UseSearchOptions = {}) {\n const { client, locale } = useShopify()\n const { query, first = 20, types = ['PRODUCT', 'ARTICLE', 'PAGE'], ...swrOptions } = options\n\n return useSWR<SearchResult | undefined>(\n query ? ['search', locale, query, first, types] : null,\n () => performSearch(client, locale, query, first, types),\n swrOptions\n )\n}\n","/**\n * useSite Hook\n *\n * Simple hook to fetch basic shop/site information\n */\n\nimport useSWR, { type SWRConfiguration } from 'swr'\nimport { useShopify } from '../../provider'\nimport type { ShopifyClient } from '@anker-in/shopify-sdk'\n\nexport interface SiteInfo {\n name: string\n description?: string\n primaryDomain: {\n url: string\n host: string\n }\n brand?: {\n logo?: {\n image?: {\n url: string\n }\n }\n colors?: {\n primary?: string\n secondary?: string\n }\n }\n metafields?: Record<string, any>\n}\n\nexport interface UseSiteOptions extends SWRConfiguration<SiteInfo | undefined> {\n metafieldIdentifiers?: Array<{\n namespace: string\n key: string\n }>\n}\n\nasync function getSiteInfo(\n client: ShopifyClient,\n locale: string,\n metafieldIdentifiers?: any[]\n): Promise<SiteInfo | undefined> {\n const hasMetafields = metafieldIdentifiers && metafieldIdentifiers.length > 0\n\n const query = /* GraphQL */ `\n query getSiteInfo(\n ${hasMetafields ? '$shopMetafieldIdentifiers: [HasMetafieldsIdentifier!]!' : ''}\n ) @inContext(language: $language) {\n shop {\n name\n description\n primaryDomain {\n url\n host\n }\n brand {\n logo {\n image {\n url\n }\n }\n colors {\n primary {\n background\n }\n secondary {\n background\n }\n }\n }\n ${hasMetafields ? 'metafields(identifiers: $shopMetafieldIdentifiers) { key value }' : ''}\n }\n }\n `\n\n const variables: any = {}\n if (hasMetafields) {\n variables.shopMetafieldIdentifiers = metafieldIdentifiers\n }\n\n const data = await client.query<{ shop: any }>(query, variables)\n\n if (!data || !data.shop) {\n return undefined\n }\n\n const shop = data.shop\n const metafields = shop.metafields?.reduce((acc: Record<string, any>, mf: any) => {\n if (mf && mf.key) {\n acc[mf.key] = mf.value\n }\n return acc\n }, {})\n\n return {\n name: shop.name,\n description: shop.description,\n primaryDomain: shop.primaryDomain,\n brand: shop.brand\n ? {\n logo: shop.brand.logo,\n colors: shop.brand.colors\n ? {\n primary: shop.brand.colors.primary?.background,\n secondary: shop.brand.colors.secondary?.background,\n }\n : undefined,\n }\n : undefined,\n metafields,\n }\n}\n\nexport function useSite(options: UseSiteOptions = {}) {\n const { client, locale } = useShopify()\n const { metafieldIdentifiers, ...swrOptions } = options\n\n return useSWR<SiteInfo | undefined>(\n ['site', locale, metafieldIdentifiers],\n () => getSiteInfo(client, locale, metafieldIdentifiers),\n swrOptions\n )\n}\n","/**\n * Plus Member Types\n * Type definitions for Plus Member functionality\n */\n\nimport { NormalizedProduct, NormalizedProductVariant } from '@anker-in/shopify-sdk'\n\nexport enum PLUS_MEMBER_TYPE {\n FREE = 0, // 免费会员\n MONTHLY = 1, // 月费会员\n ANNUAL = 2, // 年费会员\n}\n\nexport enum PlusMemberMode {\n MONTHLY = 'monthly',\n ANNUAL = 'annual',\n}\n\nexport enum DeliveryPlusType {\n FREE = 'free',\n MONTHLY = 'monthly',\n ANNUAL = 'annual',\n}\n\nexport enum ShippingMethodMode {\n FREE = 'free',\n TDD = 'tdd',\n NDD = 'ndd',\n}\n\nexport type PlusMemberShippingMethodMetafields = {\n __mode: ShippingMethodMode\n __code: string\n title: string\n subtitle: string\n price: number\n weight_low?: number | null\n weight_high?: number | null\n __plus?: boolean\n}\n\nexport type PlusMemberShippingMethodConfig = PlusMemberShippingMethodMetafields & {\n id: string\n disabled?: boolean\n useCoupon?: boolean\n coupon?: string\n}\n\nexport type PlusMemberSettingsMetafields = {\n join_member: string\n join_plus_member: string\n member_extra: string\n member_price: string\n plus_member_price: string\n will_save: string\n total_save: string\n with_member: string\n with_plus_member: string\n save_with_plus: string\n discount_box: {\n plus_member: string\n money: string\n month: string\n saving: string\n worth: string\n other: string\n }\n plus_monthly_product: {\n handle: string\n sku: string\n }\n plus_annual_product: {\n handle: string\n sku: string\n }\n thank: {\n success: {\n title: string\n line1: string\n line2: string\n button: string\n link_text: string\n link: string\n }\n warn: {\n title: string\n }\n error: {\n title: string\n button: string\n }\n }\n agreeBox: {\n text: string\n error_text: string\n }\n shippingMethod: {\n cancelCodeTip: string\n addCodeTip: string\n overWeight_ndd: number\n overWeight_tdd: number\n overWeight_ndd_tip: string\n specialTip: string\n learnMore: string\n specialModal: Array<{\n title_del: string\n content: string\n }>\n }\n cart: {\n tip: string\n credits_times: number\n title: string\n subtitle: string\n }\n plus_member: {\n title: string\n box: {\n title: string\n description: string\n learn_more: string\n trade_desc?: string\n }\n type: Array<{\n title: string\n subtitle: string\n __mode: DeliveryPlusType\n save?: string\n price?: string\n compare_price?: string\n tagImg?: string\n }>\n }\n member_benefits: {\n title: string\n subtitle: string\n list: Array<{\n icon: string\n title: string\n subtitle: string\n }>\n annually: {\n title: string\n list: Array<{\n icon: string\n title: string\n subtitle: string\n }>\n }\n ankerCredits: {\n text: string\n url: string\n }\n }\n shipping_policy: {\n title: string\n shipping_coupon: {\n title: string\n list: string[]\n }\n shipping_service: {\n title: string\n list: Array<{\n title: string\n list: string[]\n }>\n }\n terms: {\n text: string\n url: string\n }\n }\n shipping_check: {\n title: string\n label: string\n placeholder: string\n cancel: string\n available: string\n here: {\n text: string\n url: string\n }\n save: string\n apply: string\n }\n plus_shipping: {\n title: string\n policy: string\n more_option: string\n view_less: string\n buy_directly: string\n used_up_all: string\n used_up_ndd: string\n delivers_to: string\n edit: string\n out_ndd_shipping: string\n out_tdd_shipping: string\n plus: string\n directly: string\n shipping_methods: PlusMemberShippingMethodMetafields[]\n }\n shipping: {\n shipping_benefits: string\n shipping_address: string\n seeAvailableShippingAreas: string\n modify: string\n enter: string\n click: string\n fill: string\n plus: string\n use_coupon: string\n no_coupon: string\n get_address: string\n confirm: string\n shipping_not_support: string\n faq_link: string\n fields: Array<{\n __key: string\n required: boolean\n title: string\n placeholder: string\n }>\n shipping_methods: Array<{\n __mode: string\n __code: string\n title: string\n subtitle: string\n tip?: string\n outRange?: string\n rule?: {\n '<22': number\n '>=22': number\n }\n __weight?: string\n }>\n join_member: {\n join: string\n text: string\n tip: string\n }\n discount_not_support_address: string\n }\n listingEntryCard: {\n showEntry: boolean\n EntryCardBgi: string\n EntryCardMobBgi: string\n EntryCardPadBgi: string\n EntryCardSmBgi: string\n EntryCardicon: string\n EntryCardtitle: string\n EntryCardcontent: string\n EntryCardbuttonText: string\n }\n noLogin: {\n recommend: string\n content: Array<{\n title: string\n list: Array<{\n icon: string\n recommend: boolean\n title: string\n description: string\n subTitle?: string\n }>\n note?: string\n }>\n head: {\n img: string\n padImg: string\n mobImg: string\n title: string\n mobTitle: string\n pay: string\n subTitle: string\n icon: string\n }\n headAnnual: {\n img: string\n padImg: string\n mobImg: string\n title: string\n pay: string\n subTitle: string\n icon: string\n }\n main: {\n title: string\n }\n }\n loginedExpiredMember: {\n content: Array<{\n img: string\n mobImg: string\n text: string\n }>\n head: {\n img: string\n mobImg: string\n title: string\n subTitle: string\n }\n main: {\n text: string\n title: string\n }\n }\n loginedFreeMember: {\n table: Array<{\n plus: string\n normal: string\n plusColor: string\n normalColor: string\n }>\n tableTab: {\n tab1: string\n tab2: string\n tab3: string\n }\n head: {\n img: string\n mobImg: string\n padImg: string\n icon: string\n title: string\n mobTitle: string\n pay: string\n subTitle: string\n }\n headAnnual: {\n img: string\n mobImg: string\n padImg: string\n icon: string\n title: string\n pay: string\n subTitle: string\n }\n midTitle: string\n }\n memberCard: {\n header: {\n text: string\n }\n footer: {\n buttonText: string[]\n moreInformation: string\n moreInformationUrl: string\n }\n }\n memberRegisterCard: {\n title: string\n bannerBgPc: string\n bannerBgMob: string\n backgroundColor: string\n }\n memberSuperposed: {\n title: string\n content: string\n cancelBtn: string\n confirmBtn: string\n monthly: string\n annual: string\n }\n memberCannotSuperposed: {\n title: string\n content: string\n confirmBtn: string\n }\n}\n\nexport type SelectedPlusMemberProduct = {\n product: NormalizedProduct\n variant: NormalizedProductVariant\n} | null\n\nexport type DeliveryOption = string\n\nexport type DeliveryCustomData = {\n discount_code?: string[]\n allow_nextday_delivery?: boolean\n allow_thirdday_delivery?: boolean\n selected_delivery_option?: DeliveryOption\n is_presale?: boolean\n plus_type?: DeliveryPlusType\n}\n\nexport type MailingAddress = {\n address1?: string | null\n address2?: string | null\n city?: string | null\n company?: string | null\n country?: string | null\n countryCode?: string | null\n firstName?: string | null\n lastName?: string | null\n phone?: string | null\n province?: string | null\n provinceCode?: string | null\n zip?: string | null\n}\n\nexport type DeliveryData = {\n deliveryAddress: MailingAddress\n deliveryCustomData: DeliveryCustomData\n}\n","/**\n * Plus Member Context\n * Provides Plus Member state management\n */\n\nimport { createContext } from 'react'\nimport type {\n PlusMemberSettingsMetafields,\n PlusMemberShippingMethodConfig,\n SelectedPlusMemberProduct,\n DeliveryPlusType,\n} from './types'\nimport { NormalizedProduct } from '@anker-in/shopify-sdk'\n\nexport interface ShippingMethodsContext {\n freeShippingMethods: PlusMemberShippingMethodConfig[]\n paymentShippingMethods: PlusMemberShippingMethodConfig[]\n nddOverweight: boolean\n tddOverweight: boolean\n}\n\nexport interface PlusMemberContextValue<TProduct = any, TVariant = any, TProfile = any> {\n // Metafields configuration\n plusMemberMetafields: PlusMemberSettingsMetafields\n shopCommon?: Record<string, any>\n\n // Zip code state\n zipCode: string\n setZipCode: (value: string) => void\n\n // Delivery availability\n allowNextDayDelivery: boolean\n setAllowNextDayDelivery: (value: boolean) => void\n allowThirdDayDelivery: boolean\n setAllowThirdDayDelivery: (value: boolean) => void\n\n // Plus member mode selection\n selectedPlusMemberMode: DeliveryPlusType\n setSelectedPlusMemberMode: (value: DeliveryPlusType) => void\n\n // Area check modal\n showAreaCheckModal: boolean\n setShowAreaCheckModal: (value: boolean) => void\n\n // Shipping method selection\n selectedShippingMethod?: PlusMemberShippingMethodConfig\n setSelectedShippingMethod: (value: PlusMemberShippingMethodConfig) => void\n\n // Tip display\n showTip: boolean\n setShowTip: (value: boolean) => void\n\n // More shipping methods display\n showMoreShippingMethod: boolean\n setShowMoreShippingMethod: (value: boolean) => void\n\n // Product and variant (generic types)\n variant: TVariant\n product: TProduct\n\n // Shipping methods context\n shippingMethodsContext: ShippingMethodsContext\n\n // Selected plus member product\n selectedPlusMemberProduct: SelectedPlusMemberProduct\n\n // Plus member products list\n plusMemberProducts: NormalizedProduct[]\n\n // Plus member benefit modal\n showPlusMemberBenefit: boolean\n setShowPlusMemberBenefit: (value: boolean) => void\n\n // Margin bottom control\n deleteMarginBottom: boolean\n setDeleteMarginBottom: (value: boolean) => void\n\n // Profile (user profile information)\n profile?: TProfile\n\n // Locale (language/region code)\n locale?: string\n}\n\nconst createInitialValue = <\n TProduct = any,\n TVariant = any,\n TProfile = any,\n>(): PlusMemberContextValue<TProduct, TVariant, TProfile> => ({\n zipCode: '',\n plusMemberMetafields: {} as PlusMemberSettingsMetafields,\n setZipCode: () => {},\n allowNextDayDelivery: false,\n setAllowNextDayDelivery: () => {},\n allowThirdDayDelivery: false,\n setAllowThirdDayDelivery: () => {},\n selectedPlusMemberMode: 'free' as DeliveryPlusType,\n setSelectedPlusMemberMode: () => {},\n showAreaCheckModal: false,\n setShowAreaCheckModal: () => {},\n selectedShippingMethod: undefined,\n setSelectedShippingMethod: () => {},\n showTip: false,\n setShowTip: () => {},\n showMoreShippingMethod: false,\n setShowMoreShippingMethod: () => {},\n variant: {} as TVariant,\n product: {} as TProduct,\n shippingMethodsContext: {\n freeShippingMethods: [],\n paymentShippingMethods: [],\n nddOverweight: false,\n tddOverweight: false,\n },\n selectedPlusMemberProduct: null,\n plusMemberProducts: [],\n showPlusMemberBenefit: false,\n setShowPlusMemberBenefit: () => {},\n deleteMarginBottom: false,\n setDeleteMarginBottom: () => {},\n profile: undefined,\n locale: undefined,\n})\n\nexport const PlusMemberContext = createContext<PlusMemberContextValue>(createInitialValue())\n","/**\n * Hook to access Plus Member Context\n */\n\nimport { useContext } from 'react'\nimport { PlusMemberContext } from './context'\n\nexport function usePlusMemberContext<TProduct = any, TVariant = any>() {\n return useContext(PlusMemberContext)\n}\n","/**\n * Hook to get Plus Monthly Product Variant\n */\n\nimport { useMemo } from 'react'\nimport { usePlusMemberContext } from './use-plus-member-context'\n\nexport function usePlusMonthlyProductVariant<TVariant = any>(): TVariant | undefined {\n const { plusMemberProducts, plusMemberMetafields } = usePlusMemberContext()\n const plusMonthly = plusMemberMetafields?.plus_monthly_product\n\n const plusMonthlyProductVariant = useMemo(() => {\n const product = plusMemberProducts?.find(\n (item: any) => item?.handle === plusMonthly?.handle\n )\n const productVariant = product?.variants?.find(\n (item: any) => item.sku === plusMonthly?.sku\n )\n\n return productVariant\n }, [plusMemberProducts, plusMonthly])\n\n return plusMonthlyProductVariant as TVariant | undefined\n}\n","/**\n * Hook to get Plus Annual Product Variant\n */\n\nimport { useMemo } from 'react'\nimport { usePlusMemberContext } from './use-plus-member-context'\n\nexport function usePlusAnnualProductVariant<TVariant = any>(): TVariant | undefined {\n const { plusMemberProducts, plusMemberMetafields } = usePlusMemberContext()\n const plusAnnual = plusMemberMetafields?.plus_annual_product\n\n const plusAnnualProductVariant = useMemo(() => {\n const product = plusMemberProducts?.find(\n (item: any) => item?.handle === plusAnnual?.handle\n )\n const productVariant = product?.variants?.find(\n (item: any) => item.sku === plusAnnual?.sku\n )\n return productVariant\n }, [plusMemberProducts, plusAnnual])\n\n return plusAnnualProductVariant as TVariant | undefined\n}\n","/**\n * Hook to calculate available shipping methods based on product weight and member status\n */\n\nimport { useMemo } from 'react'\nimport type {\n PlusMemberSettingsMetafields,\n PlusMemberShippingMethodConfig,\n DeliveryPlusType,\n} from './types'\nimport { ShippingMethodMode } from './types'\n\nexport interface UseShippingMethodsOptions<TVariant = any> {\n /** Product variant with weight information */\n variant: TVariant\n /** Zip code for delivery */\n zipCode: string\n /** Whether next day delivery is allowed */\n allowNextDayDelivery: boolean\n /** Whether third day delivery is allowed */\n allowThirdDayDelivery: boolean\n /** Plus member metafields configuration */\n plusMemberMetafields: PlusMemberSettingsMetafields\n /** Selected plus member mode */\n selectedPlusMemberMode: DeliveryPlusType\n /** Whether user is a plus member */\n isPlus?: boolean\n /** Available NDD coupon code */\n nddCoupon?: string\n /** Available TDD coupon code */\n tddCoupon?: string\n}\n\nexport interface UseShippingMethodsResult {\n freeShippingMethods: PlusMemberShippingMethodConfig[]\n paymentShippingMethods: PlusMemberShippingMethodConfig[]\n nddOverweight: boolean\n tddOverweight: boolean\n}\n\n/**\n * Calculate available shipping methods based on product weight, member status, and available coupons\n *\n * @param options - Configuration options\n * @returns Shipping methods categorized by free/payment and overweight status\n *\n * @example\n * ```tsx\n * const { freeShippingMethods, paymentShippingMethods, nddOverweight, tddOverweight } = useShippingMethods({\n * variant,\n * zipCode,\n * allowNextDayDelivery,\n * allowThirdDayDelivery,\n * plusMemberMetafields,\n * selectedPlusMemberMode,\n * isPlus: profile?.isPlus,\n * nddCoupon,\n * tddCoupon,\n * })\n * ```\n */\nexport function useShippingMethods<TVariant extends { weight?: number } = any>(\n options: UseShippingMethodsOptions<TVariant>\n): UseShippingMethodsResult {\n const {\n variant,\n plusMemberMetafields,\n selectedPlusMemberMode,\n isPlus = false,\n nddCoupon,\n tddCoupon,\n } = options\n\n const { plus_shipping, shippingMethod } = plusMemberMetafields || {}\n\n const nddOverweight = useMemo(() => {\n return (variant?.weight || 0) > (shippingMethod?.overWeight_ndd || Infinity)\n }, [shippingMethod?.overWeight_ndd, variant?.weight])\n\n const tddOverweight = useMemo(() => {\n return (variant?.weight || 0) > (shippingMethod?.overWeight_tdd || Infinity)\n }, [shippingMethod?.overWeight_tdd, variant?.weight])\n\n // 付费会员物流方式\n const paymentShippingMethods: PlusMemberShippingMethodConfig[] = useMemo(() => {\n const weight = variant?.weight || 0\n const methods =\n plus_shipping?.shipping_methods?.filter(\n ({ weight_low, weight_high, __mode, __plus }) => {\n const fitWeight =\n (!weight_low || weight >= weight_low) &&\n (!weight_high || weight <= weight_high)\n return __mode !== ShippingMethodMode.FREE && !__plus && fitWeight\n }\n ) || []\n\n return methods.map((method) => {\n let disabled = false\n const selectedFreeMember = selectedPlusMemberMode === 'free'\n if (method.__mode === ShippingMethodMode.NDD) {\n disabled = selectedFreeMember || nddOverweight\n } else if (method.__mode === ShippingMethodMode.TDD) {\n disabled = selectedFreeMember || tddOverweight\n }\n\n return {\n ...method,\n id: method.__mode + method.__code,\n useCoupon: false,\n subtitle: plus_shipping?.directly || '',\n disabled,\n }\n })\n }, [\n nddOverweight,\n plus_shipping?.directly,\n plus_shipping?.shipping_methods,\n selectedPlusMemberMode,\n tddOverweight,\n variant?.weight,\n ])\n\n const nddPrice = useMemo(() => {\n const weight = variant?.weight || 0\n const nddMethod = paymentShippingMethods.find(\n ({ __mode, weight_high, weight_low }) => {\n const fitWeight =\n (!weight_low || weight >= weight_low) &&\n (!weight_high || weight <= weight_high)\n return __mode === 'ndd' && fitWeight\n }\n )\n return nddMethod?.price || 0\n }, [variant?.weight, paymentShippingMethods])\n\n const tddPrice = useMemo(() => {\n const weight = variant?.weight || 0\n const tddMethod = paymentShippingMethods.find(\n ({ __mode, weight_high, weight_low }) => {\n const fitWeight =\n (!weight_low || weight >= weight_low) &&\n (!weight_high || weight <= weight_high)\n return __mode === 'tdd' && fitWeight\n }\n )\n return tddMethod?.price || 0\n }, [variant?.weight, paymentShippingMethods])\n\n // 免费/使用优惠券的物流方式\n const freeShippingMethods: PlusMemberShippingMethodConfig[] = useMemo(() => {\n const weight = variant?.weight || 0\n let methods =\n plus_shipping?.shipping_methods?.filter(\n ({ __mode, __plus, weight_low, weight_high }) => {\n if (__mode === ShippingMethodMode.FREE) {\n return true\n }\n\n if (isPlus) {\n const hasCoupon =\n (isPlus && __mode === ShippingMethodMode.NDD && nddCoupon) ||\n (isPlus && __mode === ShippingMethodMode.TDD && (tddCoupon || nddCoupon))\n\n const fitWeight =\n (!weight_low || weight >= weight_low) &&\n (!weight_high || weight <= weight_high)\n\n return hasCoupon && fitWeight && !__plus\n } else {\n return __plus\n }\n }\n ) || []\n if (isPlus) {\n methods = methods.sort((a, b) => {\n if (b.__mode === ShippingMethodMode.FREE) return -1\n return 0\n })\n }\n\n return methods.map((method) => {\n let price = 0\n let coupon\n let disabled\n\n if (method.__mode !== ShippingMethodMode.FREE) {\n switch (method.__mode) {\n case 'tdd':\n price = tddPrice\n coupon = tddCoupon || nddCoupon\n break\n case 'ndd':\n price = nddPrice\n coupon = nddCoupon\n break\n }\n\n disabled = selectedPlusMemberMode === 'free'\n\n if (method.__mode === ShippingMethodMode.NDD) {\n disabled = disabled || nddOverweight\n } else if (method.__mode === ShippingMethodMode.TDD) {\n disabled = disabled || tddOverweight\n }\n }\n\n return {\n ...method,\n id: method.__mode + method.__code,\n useCoupon: true,\n disabled,\n coupon,\n price,\n }\n })\n }, [\n variant?.weight,\n plus_shipping?.shipping_methods,\n isPlus,\n nddCoupon,\n tddCoupon,\n selectedPlusMemberMode,\n tddPrice,\n nddPrice,\n nddOverweight,\n tddOverweight,\n ])\n\n return {\n freeShippingMethods,\n paymentShippingMethods,\n nddOverweight,\n tddOverweight,\n }\n}\n","/**\n * Hook to check shipping method availability and automatically adjust selection\n */\n\nimport { useEffect } from 'react'\nimport { ShippingMethodMode } from './types'\nimport { usePlusMemberContext } from './use-plus-member-context'\n\nexport function useShippingMethodAvailableCheck() {\n const {\n zipCode,\n allowNextDayDelivery,\n allowThirdDayDelivery,\n selectedShippingMethod,\n setSelectedShippingMethod,\n setShowTip,\n shippingMethodsContext,\n } = usePlusMemberContext()\n\n useEffect(() => {\n const freeShippingMethod = shippingMethodsContext.freeShippingMethods[0]\n\n const standardShippingMethod =\n shippingMethodsContext.freeShippingMethods?.find(\n (item) => item.__mode === ShippingMethodMode.FREE\n )\n\n const freeTDD = shippingMethodsContext.freeShippingMethods.find(\n (item) => item.__mode === ShippingMethodMode.TDD\n )\n const paymentTDD = shippingMethodsContext.paymentShippingMethods.find(\n (item) => item.__mode === ShippingMethodMode.TDD\n )\n\n if (zipCode) {\n console.log(\n 'allowNextDayDelivery, allowThirdDayDelivery:',\n allowNextDayDelivery,\n allowThirdDayDelivery\n )\n // 两个都不能用\n if (!allowNextDayDelivery && !allowThirdDayDelivery) {\n setShowTip(true)\n setSelectedShippingMethod(standardShippingMethod!)\n } else {\n // NDD 无法使用\n if (\n selectedShippingMethod?.__mode === ShippingMethodMode.NDD &&\n !allowNextDayDelivery\n ) {\n setShowTip(true)\n\n if (allowThirdDayDelivery) {\n if (selectedShippingMethod.useCoupon) {\n const method = freeTDD || freeShippingMethod\n if (method) setSelectedShippingMethod(method)\n } else {\n const method = paymentTDD || freeShippingMethod\n if (method) setSelectedShippingMethod(method)\n }\n } else {\n // 使用免费\n if (freeShippingMethod) setSelectedShippingMethod(freeShippingMethod)\n }\n } else if (\n // TDD 无法使用\n selectedShippingMethod?.__mode === ShippingMethodMode.TDD &&\n !allowThirdDayDelivery\n ) {\n setShowTip(true)\n if (freeShippingMethod) setSelectedShippingMethod(freeShippingMethod)\n }\n }\n }\n }, [\n allowNextDayDelivery,\n allowThirdDayDelivery,\n zipCode,\n shippingMethodsContext,\n selectedShippingMethod,\n setSelectedShippingMethod,\n setShowTip,\n ])\n}\n","import { useCallback } from 'react'\nimport { usePlusMemberContext } from './use-plus-member-context'\nimport { useCartContext } from '../../../provider'\nimport { useRemoveCartLines } from '../../cart'\nimport { DeliveryPlusType } from './types'\n\n/**\n * Hook to replace cart plus member product\n *\n * When adding a monthly membership while an annual membership exists in cart,\n * the annual membership will be replaced and vice versa.\n *\n * @returns Handler function to replace conflicting membership products\n *\n * @example\n * ```tsx\n * const replaceCartPlusMember = useReplaceCartPlusMember()\n *\n * // Call before adding new membership product\n * await replaceCartPlusMember()\n * ```\n */\nexport const useReplaceCartPlusMember = () => {\n const { plusMemberMetafields, selectedPlusMemberMode } = usePlusMemberContext()\n const { trigger: removeCartLines } = useRemoveCartLines()\n const { cart } = useCartContext()\n\n const plusMonthly = plusMemberMetafields?.plus_monthly_product\n const plusAnnual = plusMemberMetafields?.plus_annual_product\n\n const handler = useCallback(async () => {\n const plusMonthlyInCart = cart?.lineItems.find(\n (item) => item.variant?.sku === plusMonthly?.sku\n )\n const plusAnnualInCart = cart?.lineItems.find(\n (item) => item.variant?.sku === plusAnnual?.sku\n )\n\n if (\n selectedPlusMemberMode === DeliveryPlusType.ANNUAL &&\n plusMonthlyInCart\n ) {\n await removeCartLines({\n lineIds: [plusMonthlyInCart.id],\n })\n } else if (\n selectedPlusMemberMode === DeliveryPlusType.MONTHLY &&\n plusAnnualInCart\n ) {\n await removeCartLines({\n lineIds: [plusAnnualInCart.id],\n })\n }\n }, [\n cart?.lineItems,\n selectedPlusMemberMode,\n plusMonthly?.sku,\n plusAnnual?.sku,\n removeCartLines,\n ])\n\n return handler\n}\n","import { useMemo } from 'react'\nimport type { DeliveryData } from './types'\n\n/**\n * Hook to get delivery discount codes from delivery data\n *\n * Extracts and returns the discount codes from the delivery custom data.\n *\n * @param deliveryData - Delivery data containing custom attributes\n * @returns Array of discount codes or undefined\n *\n * @example\n * ```tsx\n * const deliveryCodes = usePlusMemberDeliveryCodes({ deliveryData })\n * ```\n */\nexport const usePlusMemberDeliveryCodes = ({\n deliveryData,\n}: {\n deliveryData?: DeliveryData\n}) => {\n return useMemo(\n () => deliveryData?.deliveryCustomData?.discount_code as string[] | undefined,\n [deliveryData]\n )\n}\n","import { useMemo } from 'react'\nimport type { DeliveryData } from './types'\nimport type { Attribute } from '../../../types'\n\n/**\n * Hook to generate custom attributes for cart line items\n *\n * Creates custom attributes based on delivery data to be attached to line items.\n *\n * @param deliveryData - Delivery data containing custom attributes\n * @returns Array of custom attributes for line items\n *\n * @example\n * ```tsx\n * const itemAttributes = usePlusMemberItemCustomAttributes({ deliveryData })\n *\n * // Use in addToCart\n * await addToCart({\n * lineItems: lineItems.map(item => ({\n * ...item,\n * customAttributes: [...(item.customAttributes || []), ...itemAttributes]\n * }))\n * })\n * ```\n */\nexport const usePlusMemberItemCustomAttributes = ({\n deliveryData,\n}: {\n deliveryData?: DeliveryData\n}) => {\n const { deliveryCustomData } = deliveryData || {}\n\n return useMemo(() => {\n const itemCustomAttributes: Attribute[] = []\n\n if (deliveryCustomData?.is_presale) {\n itemCustomAttributes.push({\n key: '_is_presale',\n value: 'true',\n })\n }\n\n return itemCustomAttributes\n }, [deliveryCustomData])\n}\n","import { useMemo } from 'react'\nimport type { DeliveryData } from './types'\nimport type { Attribute } from '../../../types'\nimport { usePlusMemberContext } from './use-plus-member-context'\n\nexport interface CustomerOrder {\n edges?: Array<any>\n}\n\nexport interface Customer {\n orders?: CustomerOrder\n}\n\n/**\n * Hook to generate custom attributes for checkout\n *\n * Creates custom attributes based on delivery data, profile, and customer information\n * to be attached to the checkout.\n *\n * Requires profile to be provided via PlusMemberContext.\n *\n * @param deliveryData - Delivery data containing custom attributes\n * @param product - Product information (optional, for hiding shipping benefits check)\n * @param variant - Variant information (optional, for presale and hiding shipping benefits check)\n * @param customer - Customer information (optional, for user type determination)\n * @param isShowShippingBenefits - Function to check if shipping benefits should be shown (optional)\n * @returns Array of custom attributes for checkout\n *\n * @example\n * ```tsx\n * const checkoutAttributes = usePlusMemberCheckoutCustomAttributes({\n * deliveryData,\n * product,\n * variant,\n * customer,\n * isShowShippingBenefits\n * })\n *\n * // Use in checkout\n * await createCheckout({\n * lineItems,\n * customAttributes: checkoutAttributes\n * })\n * ```\n */\nexport const usePlusMemberCheckoutCustomAttributes = <\n TProduct = any,\n TVariant = any\n>({\n deliveryData,\n product,\n variant,\n customer,\n isShowShippingBenefits,\n}: {\n deliveryData?: DeliveryData\n product?: TProduct\n variant?: TVariant\n customer?: Customer\n isShowShippingBenefits?: (args: {\n variant?: TVariant\n product?: TProduct\n setting: any\n }) => boolean\n}) => {\n const { deliveryCustomData } = deliveryData || {}\n const { profile } = usePlusMemberContext()\n\n const userType = useMemo(() => {\n const customerInfo = customer\n if (!customerInfo) {\n return 'new_user_unlogin'\n }\n if (customer) {\n const { orders = {} } = customer\n const edgesLength = orders?.edges?.length\n if (edgesLength === 1) {\n return 'old_user_orders_once'\n } else if (edgesLength && edgesLength > 1) {\n return 'old_user_orders_twice'\n }\n }\n return 'new_user_login'\n }, [customer])\n\n return useMemo<Attribute[]>(() => {\n const checkoutCustomAttributes: Attribute[] = [\n {\n key: '_token',\n value: (profile as any)?.token || '',\n },\n {\n key: '_last_url',\n value:\n typeof window !== 'undefined'\n ? window.location.origin + window.location.pathname\n : '',\n },\n {\n key: '_user_type',\n value: userType,\n },\n ]\n\n if (profile) {\n checkoutCustomAttributes.push({\n key: '_login_user',\n value: '1',\n })\n }\n\n if (deliveryCustomData) {\n checkoutCustomAttributes.push({\n key: '_checkout_delivery_custom',\n value: JSON.stringify({\n ...deliveryCustomData,\n is_prime: (profile as any)?.isPlus,\n }),\n })\n }\n\n if ((variant as any)?.metafields?.presell) {\n checkoutCustomAttributes.push({\n key: '_presale',\n value: 'true',\n })\n }\n\n if (\n isShowShippingBenefits &&\n !isShowShippingBenefits({ variant, product, setting: {} })\n ) {\n checkoutCustomAttributes.push({\n key: '_hide_shipping',\n value: 'true',\n })\n }\n\n return checkoutCustomAttributes\n }, [deliveryCustomData, product, profile, userType, variant, isShowShippingBenefits])\n}\n","/**\n * useAutoRemovePlusMemberInCart Hook\n * 付费会员身份自动移除购物车中的会员产品\n * 年费会员删除月费会员产品,月费会员删除年费会员产品\n */\n\nimport { useEffect } from 'react'\nimport { useRemoveCartLines } from '../../../hooks/cart/use-remove-cart-lines'\nimport { NormalizedCart } from '@anker-in/shopify-sdk'\nimport { PlusMemberSettingsMetafields } from '../../..'\n\nexport interface UseAutoRemovePlusMemberInCartProps {\n profile: any\n cart?: NormalizedCart\n memberSetting: PlusMemberSettingsMetafields\n}\n\n/**\n * 自动移除购物车中的会员产品\n *\n * @param props - Hook 参数\n * @param props.memberSetting - Plus Member 配置\n * @param props.isMonthlyPlus - 用户是否是月费会员\n * @param props.isAnnualPlus - 用户是否是年费会员\n *\n * @example\n * ```tsx\n * const { profile } = useProfile()\n *\n * useAutoRemovePlusMemberInCart({\n * cart,\n * profile,\n * })\n * ```\n */\nexport function useAutoRemovePlusMemberInCart({\n cart,\n profile,\n memberSetting,\n}: UseAutoRemovePlusMemberInCartProps) {\n const { plus_monthly_product, plus_annual_product } = memberSetting || {}\n const { trigger: removeCartLines } = useRemoveCartLines()\n\n useEffect(() => {\n if (!cart || !plus_monthly_product || !plus_annual_product) return\n\n const removePlusProduct = async (productType?: { handle: string; sku: string }) => {\n if (!productType) return\n\n const product = cart.lineItems?.find(\n (item) =>\n item.product?.handle === productType?.handle && item.variant?.sku === productType?.sku\n )\n\n if (product) {\n await removeCartLines({\n lineIds: [product.id],\n })\n }\n }\n\n // 月费会员自动移除购物车中的月费会员产品\n if (profile?.isMonthlyPlus) {\n removePlusProduct(plus_monthly_product)\n }\n\n // 年费会员自动移除购物车中的年费会员产品\n if (profile?.isAnnualPlus) {\n removePlusProduct(plus_annual_product)\n }\n }, [cart, plus_annual_product, plus_monthly_product, profile, removeCartLines])\n}\n","/**\n * useAddPlusMemberProductsToCart Hook\n * 返回需要添加到购物车的 Plus Member 产品\n */\n\nimport { useMemo } from 'react'\nimport { useHasPlusMemberInCart } from './use-has-plus-member-in-cart'\nimport { DeliveryPlusType } from './types'\nimport type { NormalizedCart } from '@anker-in/shopify-sdk'\nimport { usePlusMemberContext } from './use-plus-member-context'\n\n/**\n * 返回需要添加到购物车的 Plus Member 产品\n *\n * 该 hook 会根据用户选择的会员模式和购物车现有状态,\n * 返回需要添加的会员产品。如果不需要添加会员产品,则返回 undefined。\n *\n * @param props - Hook 参数\n * @param props.cart - 购物车数据\n * @returns Plus Member 产品对象或 undefined\n *\n * @example\n * ```tsx\n * const plusMemberProduct = useAddPlusMemberProductsToCart({\n * cart,\n * })\n *\n * // plusMemberProduct 格式:\n * // {\n * // product: NormalizedProduct,\n * // variant: NormalizedProductVariant\n * // }\n * // 或 undefined (当不需要添加会员产品时)\n * ```\n */\nexport function useAddPlusMemberProductsToCart({\n cart,\n profile,\n}: {\n cart: NormalizedCart\n profile?: any\n}) {\n const { selectedPlusMemberMode, selectedPlusMemberProduct, plusMemberMetafields } =\n usePlusMemberContext()\n const { hasMonthlyPlus, hasAnnualPlus } = useHasPlusMemberInCart({\n memberSetting: plusMemberMetafields,\n cart,\n })\n\n const plusMemberProduct = useMemo(() => {\n // 如果选择的是免费会员,不添加会员产品\n if (!selectedPlusMemberProduct || selectedPlusMemberMode === DeliveryPlusType.FREE) {\n return undefined\n }\n\n // 如果选择月费会员且购物车中已有月费会员,不重复添加\n if (selectedPlusMemberMode === DeliveryPlusType.MONTHLY && hasMonthlyPlus) {\n return undefined\n }\n\n // 如果选择年费会员且购物车中已有年费会员,不重复添加\n if (selectedPlusMemberMode === DeliveryPlusType.ANNUAL && hasAnnualPlus) {\n return undefined\n }\n\n // 如果用户是月费会员,且选择的是月费会员,不添加会员产品\n if (profile?.isMonthlyPlus && selectedPlusMemberMode === DeliveryPlusType.MONTHLY) {\n return undefined\n }\n\n // 如果用户是年费会员,且选择的是年费会员,不添加会员产品\n if (!profile?.isAnnualPlus && selectedPlusMemberMode === DeliveryPlusType.ANNUAL) {\n return undefined\n }\n\n return selectedPlusMemberProduct\n }, [\n selectedPlusMemberMode,\n selectedPlusMemberProduct?.variant,\n selectedPlusMemberProduct?.product,\n hasMonthlyPlus,\n hasAnnualPlus,\n ])\n\n return plusMemberProduct\n}\n","/**\n * Plus Member Provider\n * Provides Plus Member context to child components\n */\n\nimport { PropsWithChildren, useMemo, useState } from 'react'\nimport { PlusMemberContext } from './context'\nimport { useShippingMethods } from './use-shipping-methods'\nimport { useProductsByHandles } from '../../product/use-products-by-handles'\nimport {\n PlusMemberSettingsMetafields,\n PlusMemberShippingMethodConfig,\n DeliveryPlusType,\n} from './types'\n\nexport interface PlusMemberProviderProps<TProduct = any, TVariant = any, TProfile = any> {\n // Product Variant object\n variant: TVariant\n // Product object\n product: TProduct\n // Metafields configuration: Shop -> member -> settings\n memberSetting: PlusMemberSettingsMetafields\n // Initial selected plus member mode\n initialSelectedPlusMemberMode?: DeliveryPlusType\n // Profile (user information)\n profile?: TProfile\n // Locale (language/region code)\n locale?: string\n}\n\n/**\n * Plus Member Provider Component\n *\n * Provides Plus Member context and state management to child components.\n *\n * @param variant - Product variant\n * @param product - Product\n * @param metafields - Plus member settings from metafields\n * @param initialSelectedPlusMemberMode - Initial selected mode (default: 'free')\n * @param profile - User profile\n * @param locale - Locale code\n * @param children - Child components\n *\n * @example\n * ```tsx\n * <PlusMemberProvider\n * variant={variant}\n * product={product}\n * memberSetting={memberSetting}\n * profile={profile}\n * locale={locale}\n * >\n * <YourComponent />\n * </PlusMemberProvider>\n * ```\n */\nexport const PlusMemberProvider = <TProduct = any, TVariant = any, TProfile = any>({\n variant,\n product,\n memberSetting,\n initialSelectedPlusMemberMode = 'free' as DeliveryPlusType,\n profile,\n locale,\n children,\n}: PropsWithChildren<PlusMemberProviderProps<TProduct, TVariant, TProfile>>) => {\n const [zipCode, setZipCode] = useState('')\n const [showTip, setShowTip] = useState(false)\n const [selectedPlusMemberMode, setSelectedPlusMemberMode] = useState<DeliveryPlusType>(\n initialSelectedPlusMemberMode\n )\n const [selectedShippingMethod, setSelectedShippingMethod] =\n useState<PlusMemberShippingMethodConfig>()\n const [allowNextDayDelivery, setAllowNextDayDelivery] = useState(false)\n const [allowThirdDayDelivery, setAllowThirdDayDelivery] = useState(false)\n const [showAreaCheckModal, setShowAreaCheckModal] = useState(false)\n const [showMoreShippingMethod, setShowMoreShippingMethod] = useState(false)\n const [showPlusMemberBenefit, setShowPlusMemberBenefit] = useState(false)\n const [deleteMarginBottom, setDeleteMarginBottom] = useState(false)\n\n const shippingMethodsContext = useShippingMethods({\n variant: variant as any,\n plusMemberMetafields: memberSetting,\n allowNextDayDelivery,\n allowThirdDayDelivery,\n selectedPlusMemberMode,\n zipCode,\n })\n\n // Fetch plus member products\n const plusMemberHandles = useMemo(() => {\n return [\n memberSetting?.plus_monthly_product?.handle,\n memberSetting?.plus_annual_product?.handle,\n ].filter(Boolean) as string[]\n }, [memberSetting])\n\n const { data: plusMemberProducts = [] } = useProductsByHandles({\n handles: plusMemberHandles,\n })\n\n const selectedPlusMemberProduct = useMemo(() => {\n if (selectedPlusMemberMode === DeliveryPlusType.FREE) {\n return null\n }\n const handle =\n selectedPlusMemberMode === DeliveryPlusType.MONTHLY\n ? memberSetting?.plus_monthly_product?.handle\n : memberSetting?.plus_annual_product?.handle\n const sku =\n selectedPlusMemberMode === DeliveryPlusType.MONTHLY\n ? memberSetting?.plus_monthly_product?.sku\n : memberSetting?.plus_annual_product?.sku\n const product = plusMemberProducts?.find((p: any) => p.handle === handle)\n const variant = product?.variants?.find((v: any) => v.sku === sku)\n return product && variant ? { product, variant } : null\n }, [plusMemberProducts, memberSetting, selectedPlusMemberMode])\n\n return (\n <PlusMemberContext.Provider\n value={{\n variant,\n zipCode,\n setZipCode,\n allowNextDayDelivery,\n setAllowNextDayDelivery,\n allowThirdDayDelivery,\n setAllowThirdDayDelivery,\n plusMemberMetafields: memberSetting,\n selectedPlusMemberMode,\n setSelectedPlusMemberMode,\n showAreaCheckModal,\n setShowAreaCheckModal,\n selectedShippingMethod,\n setSelectedShippingMethod,\n shippingMethodsContext,\n showTip,\n setShowTip,\n showMoreShippingMethod,\n setShowMoreShippingMethod,\n selectedPlusMemberProduct,\n plusMemberProducts,\n product,\n showPlusMemberBenefit,\n setShowPlusMemberBenefit,\n deleteMarginBottom,\n setDeleteMarginBottom,\n profile,\n locale,\n }}\n >\n {children}\n </PlusMemberContext.Provider>\n )\n}\n","/**\n * useIntersection Hook\n *\n * Observes element visibility using IntersectionObserver API\n */\n\nimport { RefObject, useEffect } from 'react'\n\nexport interface UseIntersectionOptions {\n /** Callback function when element becomes visible */\n callback: () => void\n /** Only trigger callback once (default: false) */\n once?: boolean\n /** Root element for intersection (default: viewport) */\n root?: Element | null\n /** Margin around root (default: '0px') */\n rootMargin?: string\n /** Visibility threshold 0-1 (default: 0.8) */\n threshold?: number\n}\n\n/**\n * Hook to observe element visibility with IntersectionObserver\n *\n * Triggers a callback when the target element becomes visible in the viewport\n *\n * @param targetRef - React ref to the target element\n * @param options - Intersection observer options\n *\n * @example\n * ```typescript\n * function LazyImage() {\n * const imageRef = useRef<HTMLImageElement>(null)\n * const [loaded, setLoaded] = useState(false)\n *\n * useIntersection(imageRef, {\n * callback: () => setLoaded(true),\n * once: true,\n * threshold: 0.5\n * })\n *\n * return (\n * <img\n * ref={imageRef}\n * src={loaded ? actualSrc : placeholderSrc}\n * alt=\"Lazy loaded\"\n * />\n * )\n * }\n * ```\n */\nexport function useIntersection(\n targetRef: RefObject<Element> | undefined,\n options: UseIntersectionOptions\n): void {\n const {\n callback,\n once = false,\n root = null,\n rootMargin = '0px',\n threshold = 0.8,\n } = options\n\n useEffect(() => {\n if (!targetRef?.current) {\n return\n }\n\n // Check if IntersectionObserver is supported\n if (typeof IntersectionObserver === 'undefined') {\n console.warn('[useIntersection] IntersectionObserver is not supported')\n return\n }\n\n const current = targetRef.current\n\n const observerOptions = {\n root,\n rootMargin,\n threshold,\n }\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n callback()\n if (once) {\n observer.disconnect()\n }\n }\n })\n }, observerOptions)\n\n observer.observe(current)\n\n return () => {\n observer.disconnect()\n }\n }, [targetRef, callback, once, root, rootMargin, threshold])\n}\n","/**\n * useExposure Hook\n *\n * Tracks element exposure (visibility + duration) for analytics/tracking\n */\n\nimport { RefObject, useEffect, useRef, useState } from 'react'\n\nexport interface UseExposureOptions {\n /** Visibility threshold 0-1 (default: 0.5, meaning 50% visible) */\n threshold?: number\n /** Duration in milliseconds element must be visible (default: 2000ms) */\n duration?: number\n /** Only trigger callback once (default: true) */\n once?: boolean\n /** Callback when element has been exposed for the required duration */\n onExposure: () => void\n}\n\n/**\n * Hook to track element exposure (visibility + duration threshold)\n *\n * Useful for tracking ad impressions, product views, or any analytics\n * that require an element to be visible for a certain duration\n *\n * @param targetRef - React ref to the target element\n * @param options - Exposure tracking options\n * @returns Current visibility state\n *\n * @example\n * ```typescript\n * function ProductCard({ product }) {\n * const cardRef = useRef<HTMLDivElement>(null)\n *\n * const isVisible = useExposure(cardRef, {\n * threshold: 0.5, // 50% visible\n * duration: 2000, // 2 seconds\n * once: true, // Only track once\n * onExposure: () => {\n * // Track product impression\n * analytics.track('Product Viewed', {\n * productId: product.id,\n * productName: product.title\n * })\n * }\n * })\n *\n * return (\n * <div ref={cardRef}>\n * {product.title}\n * {isVisible && <div className=\"viewing-indicator\" />}\n * </div>\n * )\n * }\n * ```\n */\nexport function useExposure(\n targetRef: RefObject<Element>,\n options: UseExposureOptions\n): boolean {\n const { threshold = 0.5, duration = 2000, once = true, onExposure } = options\n\n const [isVisible, setIsVisible] = useState(false)\n const timeoutRef = useRef<NodeJS.Timeout | undefined>(undefined)\n const hasTriggeredRef = useRef(false)\n\n useEffect(() => {\n if (!targetRef?.current || typeof IntersectionObserver === 'undefined') {\n return\n }\n\n // If once is true and already triggered, don't observe\n if (once && hasTriggeredRef.current) {\n return\n }\n\n const current = targetRef.current\n\n // Clear any existing timeout\n const clearTimer = () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = undefined\n }\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n // Update visibility state\n setIsVisible(entry.isIntersecting)\n\n if (entry.isIntersecting) {\n // Element is visible - start duration timer\n timeoutRef.current = setTimeout(() => {\n // Check if already triggered (in case of race conditions)\n if (once && hasTriggeredRef.current) {\n return\n }\n\n onExposure()\n hasTriggeredRef.current = true\n\n if (once) {\n observer.disconnect()\n }\n }, duration)\n } else {\n // Element is no longer visible - clear timer\n clearTimer()\n }\n })\n },\n {\n root: null,\n rootMargin: '0px',\n threshold,\n }\n )\n\n observer.observe(current)\n\n return () => {\n clearTimer()\n observer.disconnect()\n }\n }, [targetRef, threshold, duration, once, onExposure])\n\n return isVisible\n}\n","/**\n * useGeoLocation Hook\n *\n * Fetches and caches user's geographic location\n */\n\nimport useSWR, { SWRConfiguration } from 'swr'\nimport {\n getLocalStorage,\n setLocalStorage,\n} from '@anker-in/shopify-sdk'\n\nexport interface GeoLocationData {\n /** Geographic information */\n geo: {\n /** Country information */\n country?: {\n /** Country code (e.g., 'US', 'GB') */\n code?: string\n /** Country name */\n name?: string\n }\n /** Region/state information */\n region?: {\n code?: string\n name?: string\n }\n /** City name */\n city?: string\n /** Coordinates */\n latitude?: number\n longitude?: number\n /** Timezone */\n timezone?: string\n }\n /** Suggested locale based on location */\n suggestLocale?: string\n}\n\nexport interface LocaleMapping {\n /** Countries that should map to EU locale */\n euCountries?: string[]\n /** Countries that should map to DE locale */\n deCountries?: string[]\n /** Countries that should map to AU locale */\n auCountries?: string[]\n /** Countries that should map to AE-EN locale */\n aeEnCountries?: string[]\n /** Custom country to locale mapping */\n customMapping?: Record<string, string>\n}\n\nexport interface UseGeoLocationOptions extends SWRConfiguration<GeoLocationData | undefined> {\n /** API endpoint for fetching geo data (default: '/geolocation') */\n endpoint?: string\n /** Cache key for localStorage (default: 'geoLocation') */\n cacheKey?: string\n /** Cache duration in milliseconds (default: 24 hours) */\n cacheDuration?: number\n /** Locale mapping configuration */\n localeMapping?: LocaleMapping\n /** Enable automatic caching (default: true) */\n enableCache?: boolean\n}\n\n/**\n * Determine suggested locale based on country code and mapping\n */\nfunction determineSuggestedLocale(\n countryCode: string,\n mapping?: LocaleMapping\n): string {\n if (!countryCode) {\n return 'us'\n }\n\n const upperCode = countryCode.toUpperCase()\n\n // Check custom mapping first\n if (mapping?.customMapping?.[upperCode]) {\n return mapping.customMapping[upperCode]\n }\n\n // Check EU countries\n if (mapping?.euCountries?.includes(upperCode)) {\n if (upperCode === 'PL') {\n return 'pl'\n }\n return 'eu'\n }\n\n // Check AU countries\n if (mapping?.auCountries?.includes(upperCode)) {\n return 'au'\n }\n\n // Check DE countries\n if (mapping?.deCountries?.includes(upperCode)) {\n return 'de'\n }\n\n // Check AE-EN countries\n if (mapping?.aeEnCountries?.includes(upperCode)) {\n return 'ae-en'\n }\n\n // Special cases\n if (upperCode === 'GB') {\n return 'uk'\n }\n\n // Default to lowercase country code\n return countryCode.toLowerCase()\n}\n\n/**\n * Hook to fetch and cache user's geographic location\n *\n * Fetches geo data from an API endpoint and caches it in localStorage\n * Automatically determines suggested locale based on country\n *\n * @param options - Geo location options\n * @returns SWR response with geo location data\n *\n * @example\n * ```typescript\n * function LocaleSwitcher() {\n * const { data: geoData, error, isLoading } = useGeoLocation({\n * endpoint: '/api/geolocation',\n * localeMapping: {\n * euCountries: ['FR', 'DE', 'IT', 'ES'],\n * auCountries: ['AU', 'NZ']\n * }\n * })\n *\n * if (isLoading) return <div>Loading...</div>\n * if (error) return <div>Error loading location</div>\n *\n * return (\n * <div>\n * <p>Country: {geoData?.geo.country?.code}</p>\n * <p>Suggested Locale: {geoData?.suggestLocale}</p>\n * </div>\n * )\n * }\n * ```\n *\n * @example\n * ```typescript\n * // With custom locale mapping\n * const { data } = useGeoLocation({\n * localeMapping: {\n * customMapping: {\n * 'JP': 'ja',\n * 'CN': 'zh-cn',\n * 'TW': 'zh-tw'\n * }\n * }\n * })\n * ```\n */\nexport function useGeoLocation(\n options: UseGeoLocationOptions = {}\n): ReturnType<typeof useSWR<GeoLocationData | undefined>> {\n const {\n endpoint = '/geolocation',\n cacheKey = 'geoLocation',\n cacheDuration = 1000 * 60 * 60 * 24, // 24 hours\n localeMapping,\n enableCache = true,\n ...swrOptions\n } = options\n\n const fetcher = async (): Promise<GeoLocationData | undefined> => {\n // Try to get from cache first\n if (enableCache) {\n const cached = getLocalStorage<GeoLocationData>(cacheKey)\n if (cached) {\n return cached\n }\n }\n\n try {\n // Fetch from API\n const response = await fetch(endpoint)\n\n if (!response.ok) {\n throw new Error(`Failed to fetch geo location: ${response.status}`)\n }\n\n const result = await response.json()\n\n // Extract country code\n const countryCode = result?.geo?.country?.code\n\n if (!countryCode) {\n console.warn('[useGeoLocation] No country code in response')\n return undefined\n }\n\n // Determine suggested locale\n const suggestLocale = determineSuggestedLocale(\n countryCode,\n localeMapping\n )\n\n const geoData: GeoLocationData = {\n geo: result.geo,\n suggestLocale,\n }\n\n // Cache the result\n if (enableCache) {\n const expires = new Date(Date.now() + cacheDuration)\n setLocalStorage(cacheKey, geoData, { expires })\n }\n\n return geoData\n } catch (error) {\n console.error('[useGeoLocation] Error fetching geo data:', error)\n return undefined\n }\n }\n\n return useSWR<GeoLocationData | undefined>(\n cacheKey,\n fetcher,\n swrOptions\n )\n}\n\n/**\n * Get cached geo location data without fetching\n *\n * @param cacheKey - Cache key (default: 'geoLocation')\n * @returns Cached geo data or undefined\n *\n * @example\n * ```typescript\n * const cachedGeo = getCachedGeoLocation()\n * if (cachedGeo) {\n * console.log('Country:', cachedGeo.geo.country?.code)\n * }\n * ```\n */\nexport function getCachedGeoLocation(\n cacheKey = 'geoLocation'\n): GeoLocationData | undefined {\n return getLocalStorage<GeoLocationData>(cacheKey) ?? undefined\n}\n\n/**\n * Clear cached geo location data\n *\n * @param cacheKey - Cache key (default: 'geoLocation')\n *\n * @example\n * ```typescript\n * clearGeoLocationCache()\n * ```\n */\nexport function clearGeoLocationCache(cacheKey = 'geoLocation'): void {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(cacheKey)\n }\n}\n"]}