{
  "version": 3,
  "sources": ["/cdn/shop/t/8/assets/constructor-listing.js?view=collection"],
  "sourcesContent": ["/**\n * Constructor Listing \u2014 Merged Module\n * Combines: constructor-collections.js, constructor-search-results.js, constructor-facet-availability.js\n *\n * Features: Facets + Pagination + Filter State + URL Sync\n *\n * Classes:\n * - ConstructorListingBase: Base class with shared functionality\n * - ConstructorCollectionBrowser: Collection browser (extends base)\n * - ConstructorSearchResults: Search results page (extends base)\n * - YourStoreFacetCio: Store availability facet (standalone)\n *\n * Shared Configuration:\n * - ENABLED_FACETS: List of facets to display\n * - FACET_DISPLAY_NAMES: Human-readable facet names\n */\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   SHARED CONFIGURATION\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\nconst CONSTRUCTOR_CONFIG = {\n    API_KEY: window.CONSTRUCTOR_API_KEY,\n    DEFAULT_RESULTS: 48,\n\n    // Facets to display (by facet.name) - leave empty to show all facets\n    ENABLED_FACETS: [\n        'pickup_in_store',\n        'shippable_quantity_boolean',\n        'view_in_store',\n        'apparel_accessory_types',\n        'apparel_features',\n        'apparel_season',\n        'apparel_temp_range',\n        'assist_type',\n        'best_use',\n        'bike_capacity',\n        'bike_lock_types',\n        'bike_rack_types',\n        'bmx_type',\n        'bottle_cage_material',\n        'bottle_type',\n        'bottom_bracket_types',\n        'brake_rotor_size',\n        'brake_system_components',\n        'brake_system_types',\n        'brake_type',\n        'build_type',\n        'cable_types',\n        'car_rack_type',\n        'casual_apparel_types',\n        'chain_ring_teeth_range',\n        'cleaner_types',\n        'crank_arm_length',\n        'cycling_bag_types',\n        'cycling_glove_types',\n        'cycling_layering_types',\n        'cycling_protective_gear_types',\n        'cycling_shoe_types',\n        'cycling_tool_types',\n        'derailleur_type',\n        'drivetrain_component_types',\n        'drivetrain_speeds',\n        'e_bike_class',\n        'electric_status',\n        'electronics_features',\n        'electronics_types',\n        'energy_product_types',\n        'eyewear_types',\n        'fender_bike_compatibility',\n        'fender_types',\n        'fork_types',\n        'frame_material',\n        'frame_style',\n        'front_suspension_travel',\n        'handlebar_rise',\n        'handlebar_types',\n        'headlight_lumens',\n        'headwear_types',\n        'helmet_features',\n        'hydration_pack_types',\n        'jersey_types',\n        'kickstand_type',\n        'light_types',\n        'lubricant_types',\n        'merch_category',\n        'merch_sub_category',\n        'mountain_bike_riding_style',\n        'pedal_cleat_compatibility',\n        'pedal_types',\n        'price',\n        'productdata_gender',\n        'pump_type',\n        'rack_bike_compatibility',\n        'rack_mounting_type',\n        'rear_suspension_travel',\n        'rear_suspension_types',\n        'receiver_size',\n        'recumbent_type',\n        'saddle_type',\n        'saddle_width',\n        'safety_accessory_types',\n        'seatpost_diameter',\n        'seatpost_types',\n        'short_features',\n        'short_types',\n        'size',\n        'skin_care_types',\n        'stem_angle',\n        'stem_length',\n        'stem_types',\n        'storage_types',\n        'surface_type',\n        'taillight_lumens',\n        'tire_features',\n        'tire_tube_diameter',\n        'tire_tube_width_range',\n        'top_tube_length',\n        'trailer_capacity',\n        'trailer_features',\n        'trailer_types',\n        'trainer_accessories',\n        'trainer_features',\n        'trainer_types',\n        'training_wheel_size',\n        'tube_features',\n        'tube_valve_type',\n        'tubeless_accessory_type',\n        'vendor',\n        'wheel_axle_type',\n        'wheel_brake_type',\n        'wheel_component_type',\n        'wheel_diameter',\n        'wheel_feature',\n        'wheel_size',\n        'wheel_type'\n    ],\n\n    FACET_DISPLAY_NAMES: {\n        color: 'Color',\n        cycling_bag_types: 'Cycling Bag Types',\n        merch_category: 'Category',\n        merch_sub_category: 'Sub Category',\n        pickup_in_store: 'Pickup In Store',\n        shippable_quantity_boolean: 'Shippable Quantity Boolean',\n        view_in_store: 'View In Store',\n        size: 'Size',\n        build_type: 'Build Type',\n        e_bike_class: 'E Bike Class',\n        electric_status: 'Electric Status',\n        frame_material: 'Frame Material',\n        surface_type: 'Surface Type',\n        wheel_size: 'Wheel Size',\n        brake_type: 'Brake Type',\n        best_use: 'Best Use',\n        tire_features: 'Tire Features',\n        tire_tube_diameter: 'Tire Tube Diameter',\n        tire_tube_width_range: 'Tire Tube Width Range',\n        front_suspension_travel: 'Front Suspension Travel',\n        tube_features: 'Tube Features',\n        tube_valve_type: 'Tube Valve Type',\n        saddle_type: 'Saddle Type',\n        saddle_width: 'Saddle Width',\n        assist_type: 'Assist Type',\n        cycling_shoe_types: 'Cycling Shoe Types',\n        pedal_cleat_compatibility: 'Pedal Cleat Compatibility',\n        bmx_type: 'Bmx Type',\n        top_tube_length: 'Top Tube Length',\n        mountain_bike_riding_style: 'Mountain Bike Riding Style',\n        bottle_cage_material: 'Bottle Cage Material',\n        wheel_axle_type: 'Wheel Axle Type',\n        wheel_brake_type: 'Wheel Brake Type',\n        wheel_diameter: 'Wheel Diameter',\n        wheel_feature: 'Wheel Feature',\n        wheel_type: 'Wheel Type',\n        bike_capacity: 'Bike Capacity',\n        pump_type: 'Pump Type',\n        pedal_types: 'Pedal Types',\n        trainer_features: 'Trainer Features',\n        trainer_types: 'Trainer Types',\n        apparel_temp_range: 'Apparel Temp Range',\n        apparel_features: 'Apparel Features',\n        short_types: 'Short Types',\n        cycling_glove_types: 'Cycling Glove Types',\n        frame_style: 'Frame Style',\n        helmet_features: 'Helmet Features',\n        receiver_size: 'Receiver Size',\n        recumbent_type: 'Recumbent Type',\n        derailleur_type: 'Derailleur Type',\n        drivetrain_component_types: 'Drivetrain Component Types',\n        drivetrain_speeds: 'Drivetrain Speeds',\n        trailer_capacity: 'Trailer Capacity',\n        trailer_types: 'Trailer Types',\n        apparel_accessory_types: 'Apparel Accessory Types',\n        apparel_season: 'Apparel Season',\n        cycling_protective_gear_types: 'Cycling Protective Gear Types',\n        handlebar_rise: 'Handlebar Rise',\n        handlebar_types: 'Handlebar Types',\n        crank_arm_length: 'Crank Arm Length',\n        chain_ring_teeth_range: 'Chain Ring Teeth Range',\n        bottom_bracket_types: 'Bottom Bracket Types',\n        storage_types: 'Storage Types',\n        jersey_types: 'Jersey Types',\n        bike_lock_types: 'Bike Lock Types',\n        cleaner_types: 'Cleaner Types',\n        short_features: 'Short Features',\n        electronics_features: 'Electronics Features',\n        electronics_types: 'Electronics Types',\n        lubricant_types: 'Lubricant Types',\n        headwear_types: 'Headwear Types',\n        stem_length: 'Stem Length',\n        cycling_layering_types: 'Cycling Layering Types',\n        safety_accessory_types: 'Safety Accessory Types',\n        eyewear_types: 'Eyewear Types',\n        stem_types: 'Stem Types',\n        kickstand_type: 'Kickstand Type',\n        bike_rack_types: 'Bike Rack Types',\n        wheel_component_type: 'Wheel Component Type',\n        rack_bike_compatibility: 'Rack Bike Compatibility',\n        rack_mounting_type: 'Rack Mounting Type',\n        car_rack_type: 'Car Rack Type',\n        seatpost_types: 'Seatpost Types',\n        training_wheel_size: 'Training Wheel Size',\n        stem_angle: 'Stem Angle',\n        light_types: 'Light Types',\n        tubeless_accessory_type: 'Tubeless Accessory Type',\n        fender_bike_compatibility: 'Fender Bike Compatibility',\n        fender_types: 'Fender Types',\n        taillight_lumens: 'Taillight Lumens',\n        bottle_type: 'Bottle Type',\n        headlight_lumens: 'Headlight Lumens',\n        brake_system_components: 'Brake System Components',\n        brake_system_types: 'Brake System Types',\n        fork_types: 'Fork Types',\n        cycling_tool_types: 'Cycling Tool Types',\n        seatpost_diameter: 'Seatpost Diameter',\n        hydration_pack_types: 'Hydration Pack Types',\n        cable_types: 'Cable Types',\n        brake_rotor_size: 'Brake Rotor Size',\n        trailer_features: 'Trailer Features',\n        rear_suspension_types: 'Rear Suspension Types',\n        rear_suspension_travel: 'Rear Suspension Travel',\n        energy_product_types: 'Energy Product Types',\n        skin_care_types: 'Skin Care Types',\n        casual_apparel_types: 'Casual Apparel Types',\n        trainer_accessories: 'Trainer Accessories',\n        price: 'Price',\n        productdata_gender: 'Gender',\n        vendor: 'Brand'\n    }\n};\n\nwindow.p80 = window.p80 || {};\np80.facetAvailabilityCounts = null;\nwindow.icons = window.icons || {};\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   HELPER FUNCTIONS (Shared)\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\nfunction escapeHtml(str) {\n    return String(str).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '\"');\n}\n\nfunction escapeAttr(str) {\n    return String(str).replace(/\"/g, '\"');\n}\n\nfunction formatPrice(price) {\n    if (price == null) return '';\n    return (\n        '$' +\n        Number(price).toLocaleString('en-US', {\n            minimumFractionDigits: 2,\n            maximumFractionDigits: 2\n        })\n    );\n}\n\nfunction getPageRange(current, total) {\n    const pages = new Set([1, total]);\n    for (let i = Math.max(1, current - 2); i <= Math.min(total, current + 2); i++) pages.add(i);\n    const sorted = [...pages].sort((a, b) => a - b);\n    const result = [];\n    sorted.forEach((p, i) => {\n        if (i > 0 && p - sorted[i - 1] > 1) result.push('\\u2026');\n        result.push(p);\n    });\n    return result;\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   BASE CLASS \u2014 ConstructorListingBase\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\nclass ConstructorListingBase extends HTMLElement {\n    constructor() {\n        super();\n        this.state = {\n            page: 1,\n            sortBy: '',\n            sortOrder: 'ascending',\n            filters: {},\n            resultId: '',\n            totalNumResults: 0,\n            sortOptions: []\n        };\n        this.cardTemplate = null;\n        this.pendingRequest = null;\n        this.debounceTimer = null;\n        this.sidebar = null;\n        this.yourStoreModalEl = document.querySelector('your-store-modal');\n    }\n\n    // ------ IDENTITY & SESSION HELPERS ------\n    // All identity values come from window.ConstructorIdentity\n    // (assets/constructor-identity.js), which keeps the `i` client ID and\n    // `s` session params in sync with Constructor's official JS client\n    // (the tracking beacon) so Constructor can link search/browse requests\n    // to the actions that get tracked.\n\n    /**\n     * Append identity params (i, s, ui, _dt) to a URLSearchParams instance.\n     * Returns the same params object for chaining.\n     */\n    _addIdentityParams(params) {\n        return window.ConstructorIdentity\n            ? window.ConstructorIdentity.appendIdentityParams(params)\n            : params;\n    }\n\n    async fetchData(page = 1, filters = {}) {\n        throw new Error('fetchData() must be implemented by subclass');\n    }\n\n    initStateFromUrl() {\n        throw new Error('initStateFromUrl() must be implemented by subclass');\n    }\n\n    buildApiUrl(params) {\n        throw new Error('buildApiUrl() must be implemented by subclass');\n    }\n\n    validateApiResponse(data) {\n        if (!data?.response?.results) {\n            throw new Error('Missing response.results in Constructor API response');\n        }\n        console.info(\n            '[ConstructorListingBase] Received ' + data.response.results.length + ' products'\n        );\n        return true;\n    }\n\n    getFacetDisplayName(facetName, apiDisplayName) {\n        return (\n            CONSTRUCTOR_CONFIG.FACET_DISPLAY_NAMES[facetName] ||\n            apiDisplayName ||\n            facetName.replace(/_/g, ' ').replace(/\\b\\w/g, (l) => l.toUpperCase())\n        );\n    }\n\n    extractDefaultQueryFacets(response) {\n        const total_num_results = response?.total_num_results || 0;\n        const facets = response?.facets || [];\n\n        const facetShopAll = total_num_results;\n        let facetShipToYou = 0;\n        const shippableFacet = facets.find((f) => f.name === 'shippable_quantity_boolean');\n        if (shippableFacet?.options) {\n            const trueOption = shippableFacet.options.find((opt) => opt.value === 'True');\n            if (trueOption) facetShipToYou = trueOption.count || 0;\n        }\n\n        const facetPickup = {};\n        const pickupFacet = facets.find((f) => f.name === 'pickup_in_store');\n        if (pickupFacet?.options) {\n            pickupFacet.options.forEach((opt) => {\n                facetPickup[opt.display_name || opt.value] = opt.count || 0;\n            });\n        }\n\n        const facetView = {};\n        const viewFacet = facets.find((f) => f.name === 'view_in_store');\n        if (viewFacet?.options) {\n            viewFacet.options.forEach((opt) => {\n                facetView[opt.display_name || opt.value] = opt.count || 0;\n            });\n        }\n\n        return {\n            'facet-shop-all': facetShopAll,\n            'facet-ship-to-you': facetShipToYou,\n            'facet-pickup': facetPickup,\n            'facet-view': facetView\n        };\n    }\n\n    async initialize() {\n        try {\n            const unfilteredData = await this.fetchUnfilteredCounts();\n            if (unfilteredData?.response) {\n                p80.facetAvailabilityCounts = this.extractDefaultQueryFacets(\n                    unfilteredData.response\n                );\n            }\n\n            const data = await this.fetchData(this.state.page, this.state.filters);\n            this.validateApiResponse(data);\n\n            this.state.resultId = data.result_id || '';\n            this.state.totalNumResults = data.response?.total_num_results || 0;\n            this.state.sortOptions = data.response?.sort_options || [];\n\n            this.renderSortOptions(this.state.sortOptions);\n            this.renderFacets(data.response.facets || []);\n            this.renderProducts(data.response.results);\n            this.renderPagination(data.response.total_num_results || 0);\n            this.updateProductCount(data.response.total_num_results || 0);\n            this.hideLoading();\n            this.syncUrl();\n\n            this.refreshFacetAvailabilityCounts();\n            if (this.reInitAlertBar) this.reInitAlertBar();\n\n            console.info('[ConstructorListingBase] Initialize complete');\n        } catch (err) {\n            console.error('[ConstructorListingBase] Error:', err);\n            this.showFallback('Failed to load products. Please try again later.');\n        }\n        this.setupRemoveAllButton();\n    }\n\n    async fetchUnfilteredCounts() {\n        const params = new URLSearchParams({\n            key: CONSTRUCTOR_CONFIG.API_KEY,\n            section: 'Products',\n            num_results_per_page: 1,\n            page: 1,\n            c: 'cio-shopify-theme-1.0'\n        });\n        this._addIdentityParams(params);\n\n        const url = this.buildApiUrl(params);\n        const res = await fetch(url, { headers: { Accept: 'application/json' } });\n\n        if (!res.ok) throw new Error('Constructor API error: ' + res.status);\n        return await res.json();\n    }\n\n    renderFacets(facets) {\n        this.renderDesktopFacets(facets);\n        this.renderMobileFacets(facets);\n        this.renderActiveFacets();\n        if (window?.initializeFacets) setTimeout(window.initializeFacets, 50);\n    }\n\n    renderDesktopFacets(facets) {\n        const insertPoint = this.querySelector('.product-availability-wrapper');\n        if (!insertPoint) return;\n        this.querySelectorAll('.constructor-injected-facet').forEach((el) => el.remove());\n        this.renderFacetsToContainer(facets, insertPoint, 'desktop');\n    }\n\n    renderMobileFacets(facets) {\n        const mobileContainer = this.querySelector('#FacetsWrapperMobile');\n        if (!mobileContainer) return;\n        mobileContainer\n            .querySelectorAll('.constructor-injected-facet-mobile')\n            .forEach((el) => el.remove());\n        this.renderFacetsToContainer(facets, mobileContainer, 'mobile');\n        if (this.reInitMobileYourStoreFacet) this.reInitMobileYourStoreFacet();\n    }\n\n    renderFacetsToContainer(facets, insertPoint, type) {\n        let filteredFacets = facets;\n        if (CONSTRUCTOR_CONFIG.ENABLED_FACETS.length > 0) {\n            filteredFacets = facets.filter((facet) =>\n                CONSTRUCTOR_CONFIG.ENABLED_FACETS.includes(facet.name)\n            );\n        }\n\n        const MAX_VISIBLE = 5;\n        const visible = filteredFacets.slice(0, MAX_VISIBLE);\n        const deferred = filteredFacets.slice(MAX_VISIBLE);\n\n        let last = insertPoint;\n        visible.forEach((facet, index) => {\n            const facetEl =\n                facet.type === 'range'\n                    ? this.renderRangeFacet(facet, index, type)\n                    : this.renderCheckboxFacet(facet, index, type);\n            if (facetEl) {\n                facetEl.classList.add(\n                    type === 'desktop'\n                        ? 'constructor-injected-facet'\n                        : 'constructor-injected-facet-mobile'\n                );\n                if (type === 'desktop') {\n                    last.after(facetEl);\n                    last = facetEl;\n                } else {\n                    insertPoint.appendChild(facetEl);\n                }\n            }\n        });\n\n        if (deferred.length > 0) {\n            requestAnimationFrame(() => {\n                let last = insertPoint;\n                deferred.forEach((facet, index) => {\n                    const facetEl =\n                        facet.type === 'range'\n                            ? this.renderRangeFacet(facet, index + MAX_VISIBLE, type)\n                            : this.renderCheckboxFacet(facet, index + MAX_VISIBLE, type);\n                    if (facetEl) {\n                        facetEl.classList.add(\n                            type === 'desktop'\n                                ? 'constructor-injected-facet'\n                                : 'constructor-injected-facet-mobile'\n                        );\n                        if (type === 'desktop') {\n                            last.after(facetEl);\n                            last = facetEl;\n                        } else {\n                            insertPoint.appendChild(facetEl);\n                        }\n                    }\n                });\n            });\n        }\n\n        if (type === 'mobile' && this.updateMobileProductCount) this.updateMobileProductCount();\n    }\n\n    renderActiveFacets() {\n        this.renderActiveFacetsForContainer(\n            '.active-facets-desktop',\n            '.active-facets-vertical-filter'\n        );\n        this.renderActiveFacetsForContainer(\n            '.active-facets-mobile',\n            '.active-facets__button-wrapper'\n        );\n    }\n\n    renderActiveFacetsForContainer(containerSelector, insertBeforeSelector) {\n        // Always query from 'this' (the custom element root) since active-facets\n        // containers may be outside the sidebar (e.g., active-facets-mobile is inside menu-drawer)\n        const container = this.querySelector(containerSelector);\n        if (!container) return;\n        container.querySelectorAll('.constructor-active-pill').forEach((el) => el.remove());\n\n        const activeEntries = Object.entries(this.state.filters).flatMap(([facet, values]) =>\n            [...values].map((val) => ({ facet, val }))\n        );\n        if (activeEntries.length === 0) return;\n\n        const insertBefore = container.querySelector(insertBeforeSelector);\n        if (!insertBefore) return;\n\n        const fragment = document.createDocumentFragment();\n        const FACETS_TO_SKIP = ['shippable_quantity_boolean', 'view_in_store', 'pickup_in_store'];\n\n        activeEntries.forEach(({ facet, val }) => {\n            if (FACETS_TO_SKIP.includes(facet)) return;\n\n            const pill = document.createElement('facet-remove');\n            pill.className = 'constructor-active-pill';\n            pill.dataset.paramName = 'filter.p.' + facet;\n\n            const link = document.createElement('a');\n            link.href = this.buildRemoveFilterUrl(facet, val);\n            link.className = 'active-facets__button active-facets__button--light';\n            link.setAttribute('role', 'button');\n            link.addEventListener('click', (e) => {\n                e.preventDefault();\n                this.removeFilter(facet, val);\n            });\n\n            const buttonInner = document.createElement('span');\n            buttonInner.className = 'active-facets__button-inner button button--tertiary';\n            buttonInner.innerHTML =\n                escapeHtml(val) +\n                (window.icons?.close || '<svg class=\"icon-close\">[X]</svg>') +\n                '<span class=\"visually-hidden\">Remove filter</span>';\n\n            link.appendChild(buttonInner);\n            pill.appendChild(link);\n            fragment.appendChild(pill);\n        });\n\n        insertBefore.before(fragment);\n    }\n\n    renderCheckboxFacet(facet, index, type = 'desktop') {\n        if (!facet.options?.length) return null;\n\n        const facetName = facet.name;\n        const displayName = this.getFacetDisplayName(facetName, facet.display_name);\n        const selectedCount = this.state.filters[facetName]?.size || 0;\n        const isExpanded = selectedCount > 0;\n        const MAX_VISIBLE = 10;\n\n        if (type === 'mobile') {\n            return this.renderMobileCheckboxFacet(\n                facet,\n                index,\n                facetName,\n                displayName,\n                selectedCount,\n                isExpanded\n            );\n        }\n\n        const details = document.createElement('details');\n        details.className = 'facets__disclosure-vertical js-filter';\n        details.dataset.index = index;\n        details.style.setProperty('--order', index);\n        details.dataset.name = facetName;\n        if (isExpanded) details.setAttribute('open', '');\n\n        const summary = document.createElement('summary');\n        summary.className = 'facets__summary focus-offset';\n        summary.setAttribute('aria-label', displayName + ' (' + selectedCount + ' selected)');\n        summary.setAttribute('role', 'button');\n        summary.setAttribute('aria-expanded', isExpanded.toString());\n        summary.setAttribute('aria-controls', 'Facet-' + facetName);\n\n        const summaryContent = document.createElement('div');\n        const labelSpan = document.createElement('span');\n        labelSpan.className = 'facets__summary-label';\n        labelSpan.textContent = displayName;\n\n        const countSpan = document.createElement('span');\n        countSpan.className = 'facets__selected no-js-hidden';\n        countSpan.textContent = selectedCount > 0 ? '(' + selectedCount + ')' : '';\n        if (selectedCount === 0) countSpan.classList.add('hidden');\n\n        labelSpan.appendChild(countSpan);\n        summaryContent.appendChild(labelSpan);\n        summaryContent.innerHTML += window.icons?.caret || '{% render \"icon-caret\" %}';\n        summary.appendChild(summaryContent);\n        details.appendChild(summary);\n\n        const display = document.createElement('div');\n        display.className = 'parent-display facets__display-vertical';\n        display.id = 'Facet-' + facetName;\n\n        const fieldset = document.createElement('fieldset');\n        fieldset.className = 'facets-wrap parent-wrap facets-wrap-vertical';\n\n        const legend = document.createElement('legend');\n        legend.className = 'visually-hidden';\n        legend.textContent = displayName;\n        fieldset.appendChild(legend);\n\n        const list = document.createElement('ul');\n        list.className = 'facets-layout-list facets__list--vertical list-unstyled no-js-hidden';\n        list.setAttribute('role', 'list');\n\n        facet.options.forEach((opt, optIndex) => {\n            const isChecked =\n                this.state.filters[facetName]?.has(opt.value) || opt.status === 'selected';\n            const isVisible = optIndex < MAX_VISIBLE;\n\n            const li = document.createElement('li');\n            li.className =\n                'list-menu__item facets__item' + (isVisible ? '' : ' show-more-item hidden');\n\n            const label = document.createElement('label');\n            label.className = 'facets__label facet-checkbox';\n            label.htmlFor = 'Filter-' + facetName + '-' + optIndex;\n\n            const checkbox = document.createElement('input');\n            checkbox.type = 'checkbox';\n            checkbox.name = 'filter.p.' + facetName;\n            checkbox.value = opt.value;\n            checkbox.id = 'Filter-' + facetName + '-' + optIndex;\n            if (isChecked) checkbox.checked = true;\n            checkbox.addEventListener('change', (e) => {\n                this.toggleFilter(facetName, opt.value, e.target.checked);\n            });\n\n            const svgContainer = document.createElement('div');\n            svgContainer.innerHTML =\n                (window.icons?.facetCheckbox || '[CHECKBOX]') +\n                (window.icons?.facetCheck || '[CHECK]');\n\n            const textSpan = document.createElement('span');\n            textSpan.className = 'facet-checkbox__text';\n            textSpan.textContent = (opt.display_name || opt.value) + ' (' + (opt.count || 0) + ')';\n\n            const srSpan = document.createElement('span');\n            srSpan.className = 'visually-hidden';\n            srSpan.textContent =\n                (opt.display_name || opt.value) + ' (' + (opt.count || 0) + ' products)';\n\n            label.appendChild(checkbox);\n            label.appendChild(svgContainer);\n            label.appendChild(textSpan);\n            label.appendChild(srSpan);\n            li.appendChild(label);\n            list.appendChild(li);\n        });\n\n        fieldset.appendChild(list);\n\n        if (facet.options.length > MAX_VISIBLE) {\n            const showMore = document.createElement('button');\n            showMore.className = 'button-show-more link no-js-hidden facets__show-more';\n            showMore.type = 'button';\n            showMore.textContent = 'View All';\n            showMore.addEventListener('click', () => {\n                list.querySelectorAll('.show-more-item').forEach((el) =>\n                    el.classList.toggle('hidden')\n                );\n                showMore.classList.add('hidden');\n            });\n            fieldset.appendChild(showMore);\n        }\n\n        display.appendChild(fieldset);\n        details.appendChild(display);\n        return details;\n    }\n\n    renderMobileCheckboxFacet(facet, index, facetName, displayName, selectedCount, isExpanded) {\n        const MAX_VISIBLE = 10;\n        const sectionId = this.dataset.sectionId || 'product-grid';\n        const mobileId = 'Details-Mobile-' + facetName + '-' + sectionId;\n        const facetMobileId = 'FacetMobile-' + index + '-' + sectionId;\n\n        const details = document.createElement('details');\n        details.id = mobileId;\n        details.className = 'mobile-facets__details js-filter';\n        details.dataset.index = 'mobile-' + index;\n        details.dataset.name = facetName;\n\n        details.addEventListener('toggle', () => {\n            details.hasAttribute('open')\n                ? details.classList.add('menu-opening')\n                : details.classList.remove('menu-opening');\n        });\n\n        const summary = document.createElement('summary');\n        summary.className = 'mobile-facets__summary focus-inset';\n        summary.setAttribute('role', 'button');\n        summary.setAttribute('aria-expanded', 'false');\n        summary.setAttribute('aria-controls', facetMobileId);\n        summary.setAttribute('aria-label', displayName);\n\n        const summaryContent = document.createElement('div');\n        summaryContent.appendChild(document.createTextNode(displayName));\n        summaryContent.innerHTML +=\n            '<span class=\"mobile-facets__arrow no-js-hidden\">' +\n            (window.icons?.caret || '{% render \"icon-caret\" %}') +\n            '</span>';\n        summary.appendChild(summaryContent);\n        details.appendChild(summary);\n\n        const display = document.createElement('div');\n        display.id = facetMobileId;\n        display.className = 'mobile-facets__submenu gradient';\n\n        const backButton = document.createElement('button');\n        backButton.className = 'mobile-facets__close-button link link--text focus-inset';\n        backButton.setAttribute('aria-expanded', 'true');\n        backButton.setAttribute('type', 'button');\n        backButton.setAttribute('aria-label', 'Close this option');\n        backButton.innerHTML =\n            (window.icons?.arrow || '{% render \"icon-arrow\" %}') +\n            '<span>' +\n            displayName +\n            '</span>';\n        backButton.addEventListener('click', () => details.removeAttribute('open'));\n        display.appendChild(backButton);\n\n        const list = document.createElement('ul');\n        list.className = 'facets-layout-list mobile-facets__list list-unstyled';\n        list.setAttribute('role', 'list');\n\n        facet.options.forEach((opt, optIndex) => {\n            const isChecked =\n                this.state.filters[facetName]?.has(opt.value) || opt.status === 'selected';\n            const isVisible = optIndex < MAX_VISIBLE;\n\n            const li = document.createElement('li');\n            li.className =\n                'mobile-facets__item list-menu__item' + (isVisible ? '' : ' show-more-item hidden');\n\n            const label = document.createElement('label');\n            label.className = 'facets__label mobile-facets__label';\n            if (opt.count === 0) label.classList.add('mobile-facets__label--disabled', 'disabled');\n\n            const checkbox = document.createElement('input');\n            checkbox.className = 'mobile-facets__checkbox';\n            checkbox.type = 'checkbox';\n            checkbox.name = 'filter.p.' + facetName;\n            checkbox.value = opt.value;\n            checkbox.id = 'Filter-' + facetName + '-mobile-' + (optIndex + 1);\n            if (opt.count === 0) checkbox.disabled = true;\n            if (isChecked) checkbox.checked = true;\n            checkbox.addEventListener('change', (e) => {\n                this.toggleFilter(facetName, opt.value, e.target.checked);\n            });\n\n            const svgUncheck = document.createElement('span');\n            svgUncheck.innerHTML = window.icons?.facetCheckbox || '[CHECKBOX]';\n            const svgCheck = document.createElement('span');\n            svgCheck.innerHTML = window.icons?.facetCheck || '[CHECK]';\n\n            const textSpan = document.createElement('span');\n            textSpan.className = 'facet-checkbox__text';\n            textSpan.setAttribute('aria-hidden', 'true');\n            textSpan.textContent = (opt.display_name || opt.value) + ' (' + (opt.count || 0) + ')';\n\n            const srSpan = document.createElement('span');\n            srSpan.className = 'visually-hidden';\n            srSpan.textContent =\n                (opt.display_name || opt.value) + ' (' + (opt.count || 0) + ' products)';\n\n            label.appendChild(checkbox);\n            label.appendChild(svgUncheck);\n            label.appendChild(svgCheck);\n            label.appendChild(textSpan);\n            label.appendChild(srSpan);\n            li.appendChild(label);\n            list.appendChild(li);\n        });\n\n        display.appendChild(list);\n\n        if (facet.options.length > MAX_VISIBLE) {\n            const showMore = document.createElement('button');\n            showMore.className = 'button-show-more link no-js-hidden facets__show-more';\n            showMore.setAttribute('type', 'button');\n            showMore.textContent = 'View All';\n            showMore.addEventListener('click', () => {\n                list.querySelectorAll('.show-more-item').forEach((el) =>\n                    el.classList.toggle('hidden')\n                );\n                showMore.classList.add('hidden');\n            });\n            display.appendChild(showMore);\n        }\n\n        const footer = document.createElement('div');\n        footer.className = 'no-js-hidden mobile-facets__footer gradient';\n\n        const clearWrapper = document.createElement('facet-remove');\n        clearWrapper.className = 'mobile-facets__clear-wrapper';\n        const clearLink = document.createElement('a');\n        clearLink.href = this.buildRemoveAllFiltersUrl();\n        clearLink.className = 'mobile-facets__clear underlined-link';\n        clearLink.setAttribute('role', 'button');\n        clearLink.textContent = 'Clear';\n        clearLink.addEventListener('click', (e) => {\n            e.preventDefault();\n            this.clearAllFilters();\n            details.removeAttribute('open');\n        });\n        clearWrapper.appendChild(clearLink);\n        footer.appendChild(clearWrapper);\n\n        const applyButton = document.createElement('button');\n        applyButton.setAttribute('type', 'button');\n        applyButton.className = 'no-js-hidden button button--primary';\n        applyButton.textContent = 'Apply';\n        applyButton.addEventListener('click', () => details.removeAttribute('open'));\n        footer.appendChild(applyButton);\n\n        display.appendChild(footer);\n        details.appendChild(display);\n        return details;\n    }\n\n    renderRangeFacet(facet, index, type = 'desktop') {\n        if (type === 'mobile') return this.renderMobileRangeFacet(facet, index);\n\n        const facetName = facet.name;\n        const displayName = this.getFacetDisplayName(facetName, facet.display_name);\n        const max = facet.max || 1000;\n        const maxFormatted = max.toFixed(2);\n\n        const details = document.createElement('details');\n        details.className = 'facets__disclosure-vertical js-filter';\n        details.dataset.name = facetName;\n        details.style.setProperty('--order', index);\n\n        const summary = document.createElement('summary');\n        summary.className = 'facets__summary focus-offset';\n        summary.innerHTML =\n            '<div><span class=\"facets__summary-label\">' +\n            displayName +\n            '</span>' +\n            (window.icons?.caret || '{% render \"icon-caret\" %}') +\n            '</div>';\n        details.appendChild(summary);\n\n        const display = document.createElement('div');\n        display.className = 'facets__display-vertical facets__price';\n        display.innerHTML =\n            '<div class=\"facets__header-vertical\"><span class=\"facets__selected\">The highest price is $' +\n            maxFormatted +\n            '</span></div>' +\n            '<price-range class=\"facets__price\">' +\n            '<span class=\"field-currency\">$</span>' +\n            '<div class=\"field\"><input type=\"number\" name=\"filter.v.' +\n            facetName +\n            '.gte\" class=\"field__input\" placeholder=\"0\" min=\"0\" max=\"' +\n            maxFormatted +\n            '\" value=\"0\" data-range-min aria-label=\"From\"><label class=\"field__label visually-hidden\" for=\"Filter-' +\n            displayName +\n            '-GTE\">From</label></div>' +\n            '<span class=\"field-currency\">$</span>' +\n            '<div class=\"field\"><input type=\"number\" name=\"filter.v.' +\n            facetName +\n            '.lte\" class=\"field__input\" placeholder=\"' +\n            maxFormatted +\n            '\" min=\"0\" max=\"' +\n            maxFormatted +\n            '\" value=\"' +\n            maxFormatted +\n            '\" data-range-max aria-label=\"To\"><label class=\"field__label visually-hidden\" for=\"Filter-' +\n            displayName +\n            '-LTE\">To</label></div>' +\n            '</price-range>' +\n            '<div class=\"facets__price-slider-wrapper\">' +\n            '<input type=\"range\" class=\"facets__price-slider facets__price-slider--min\" min=\"0\" max=\"' +\n            maxFormatted +\n            '\" value=\"0\" step=\"1\" data-range-min-slider aria-label=\"Minimum price slider\">' +\n            '<input type=\"range\" class=\"facets__price-slider facets__price-slider--max\" min=\"0\" max=\"' +\n            maxFormatted +\n            '\" value=\"' +\n            maxFormatted +\n            '\" step=\"1\" data-range-max-slider aria-label=\"Maximum price slider\">' +\n            '<button type=\"button\" class=\"facets__price-apply button button--small\">Apply</button>' +\n            '</div>';\n\n        const fromInput = display.querySelector('[data-range-min]');\n        const toInput = display.querySelector('[data-range-max]');\n        const rangeMinSlider = display.querySelector('[data-range-min-slider]');\n        const rangeMaxSlider = display.querySelector('[data-range-max-slider]');\n        const applyButton = display.querySelector('.facets__price-apply');\n\n        const syncInputToMinSlider = () => {\n            let val = parseFloat(fromInput.value) || 0;\n            if (val > parseFloat(rangeMaxSlider.value)) {\n                rangeMaxSlider.value = val;\n                toInput.value = val;\n            }\n            rangeMinSlider.value = val;\n        };\n\n        const syncInputToMaxSlider = () => {\n            let val = parseFloat(toInput.value) || parseFloat(rangeMaxSlider.max);\n            if (val < parseFloat(rangeMinSlider.value)) {\n                rangeMinSlider.value = val;\n                fromInput.value = val;\n            }\n            rangeMaxSlider.value = val;\n        };\n\n        rangeMinSlider.addEventListener('input', () => {\n            let minVal = parseFloat(rangeMinSlider.value);\n            const maxVal = parseFloat(rangeMaxSlider.value);\n            if (minVal > maxVal) {\n                rangeMinSlider.value = maxVal;\n                minVal = maxVal;\n            }\n            fromInput.value = minVal;\n        });\n\n        rangeMaxSlider.addEventListener('input', () => {\n            let maxVal = parseFloat(rangeMaxSlider.value);\n            const minVal = parseFloat(rangeMinSlider.value);\n            if (maxVal < minVal) {\n                rangeMaxSlider.value = minVal;\n                maxVal = minVal;\n            }\n            toInput.value = maxVal;\n        });\n\n        fromInput.addEventListener('input', syncInputToMinSlider);\n        toInput.addEventListener('input', syncInputToMaxSlider);\n\n        applyButton.addEventListener('click', () => {\n            const minVal = fromInput.value || '0';\n            const maxVal = toInput.value || String(facet.max);\n            this.state.filters[facetName] = new Set([minVal + '-' + maxVal]);\n            this.state.page = 1;\n            this.fetchAndRender();\n        });\n\n        // Populate inputs/sliders from active filter value on re-render\n        const existingFilter = this.state.filters[facetName];\n        if (existingFilter && existingFilter.size > 0) {\n            const existingValue = [...existingFilter][0];\n            const [existingMin, existingMax] = existingValue.split('-');\n            if (existingMin !== undefined && existingMax !== undefined) {\n                fromInput.value = existingMin;\n                toInput.value = existingMax;\n                rangeMinSlider.value = existingMin;\n                rangeMaxSlider.value = existingMax;\n            }\n        }\n\n        details.appendChild(display);\n        return details;\n    }\n\n    renderMobileRangeFacet(facet, index) {\n        const facetName = facet.name;\n        const displayName = this.getFacetDisplayName(facetName, facet.display_name);\n        const max = facet.max || 1000;\n        const maxFormatted = max.toFixed(2);\n        const sectionId = this.dataset.sectionId || 'search-results';\n        const mobileId = 'Details-Mobile-' + facetName + '-' + sectionId;\n        const facetMobileId = 'FacetMobile-' + index + '-' + sectionId;\n\n        const details = document.createElement('details');\n        details.id = mobileId;\n        details.className = 'mobile-facets__details js-filter';\n        details.dataset.index = 'mobile-' + index;\n        details.dataset.name = facetName;\n\n        details.addEventListener('toggle', () => {\n            details.hasAttribute('open')\n                ? details.classList.add('menu-opening')\n                : details.classList.remove('menu-opening');\n        });\n\n        const summary = document.createElement('summary');\n        summary.className = 'mobile-facets__summary focus-inset';\n        summary.setAttribute('role', 'button');\n        summary.setAttribute('aria-expanded', 'false');\n        summary.setAttribute('aria-controls', facetMobileId);\n        summary.setAttribute('aria-label', displayName);\n\n        const summaryContent = document.createElement('div');\n        summaryContent.textContent = displayName;\n        summaryContent.innerHTML +=\n            '<span class=\"mobile-facets__arrow no-js-hidden\">' +\n            (window.icons?.caret || '{% render \"icon-caret\" %}') +\n            '</span>';\n        summary.appendChild(summaryContent);\n        details.appendChild(summary);\n\n        const display = document.createElement('div');\n        display.id = facetMobileId;\n        display.className = 'mobile-facets__submenu gradient';\n\n        const backButton = document.createElement('button');\n        backButton.className = 'mobile-facets__close-button link link--text focus-inset';\n        backButton.setAttribute('aria-expanded', 'true');\n        backButton.setAttribute('type', 'button');\n        backButton.setAttribute('aria-label', 'Close this option');\n        backButton.innerHTML =\n            (window.icons?.arrow || '{% render \"icon-arrow\" %}') +\n            '<span>' +\n            displayName +\n            '</span>';\n        backButton.addEventListener('click', () => details.removeAttribute('open'));\n        display.appendChild(backButton);\n\n        const infoPara = document.createElement('p');\n        infoPara.className = 'mobile-facets__info';\n        infoPara.textContent = 'The highest price is $' + maxFormatted;\n        display.appendChild(infoPara);\n\n        const priceRange = document.createElement('price-range');\n        priceRange.className = 'facets__price';\n        priceRange.innerHTML =\n            '<span class=\"field-currency\">$</span>' +\n            '<div class=\"field\"><input type=\"number\" name=\"filter.v.' +\n            facetName +\n            '.gte\" class=\"field__input\" id=\"Mobile-Filter-' +\n            displayName +\n            '-GTE\" value=\"0\" placeholder=\"0\" min=\"0\" inputmode=\"decimal\" max=\"' +\n            maxFormatted +\n            '\" data-range-min aria-label=\"From\"><label class=\"field__label visually-hidden\" for=\"Mobile-Filter-' +\n            displayName +\n            '-GTE\">From</label></div>' +\n            '<span class=\"field-currency\">$</span>' +\n            '<div class=\"field\"><input type=\"number\" name=\"filter.v.' +\n            facetName +\n            '.lte\" class=\"field__input\" id=\"Mobile-Filter-' +\n            displayName +\n            '-LTE\" min=\"0\" inputmode=\"decimal\" value=\"' +\n            maxFormatted +\n            '\" placeholder=\"' +\n            maxFormatted +\n            '\" max=\"' +\n            maxFormatted +\n            '\" data-range-max aria-label=\"To\"><label class=\"field__label visually-hidden\" for=\"Mobile-Filter-' +\n            displayName +\n            '-LTE\">To</label></div>';\n        display.appendChild(priceRange);\n\n        // Dual range slider\n        const sliderWrapper = document.createElement('div');\n        sliderWrapper.className = 'facets__price-slider-wrapper';\n\n        const rangeMinSlider = document.createElement('input');\n        rangeMinSlider.type = 'range';\n        rangeMinSlider.className = 'facets__price-slider facets__price-slider--min';\n        rangeMinSlider.min = 0;\n        rangeMinSlider.max = max;\n        rangeMinSlider.value = 0;\n        rangeMinSlider.step = 1;\n        rangeMinSlider.dataset.rangeMinSlider = '';\n        rangeMinSlider.setAttribute('aria-label', 'Min price');\n\n        const rangeMaxSlider = document.createElement('input');\n        rangeMaxSlider.type = 'range';\n        rangeMaxSlider.className = 'facets__price-slider facets__price-slider--max';\n        rangeMaxSlider.min = 0;\n        rangeMaxSlider.max = max;\n        rangeMaxSlider.value = max;\n        rangeMaxSlider.step = 1;\n        rangeMaxSlider.dataset.rangeMaxSlider = '';\n        rangeMaxSlider.setAttribute('aria-label', 'Max price');\n\n        sliderWrapper.appendChild(rangeMinSlider);\n        sliderWrapper.appendChild(rangeMaxSlider);\n\n        const applyButton = document.createElement('button');\n        applyButton.setAttribute('type', 'button');\n        applyButton.className = 'no-js-hidden facets__price-apply button button--small';\n        applyButton.textContent = 'Apply';\n        sliderWrapper.appendChild(applyButton);\n\n        display.appendChild(sliderWrapper);\n\n        // Sync inputs and sliders\n        const fromInput = display.querySelector('[data-range-min]');\n        const toInput = display.querySelector('[data-range-max]');\n\n        fromInput.addEventListener('input', () => {\n            const minVal = parseFloat(fromInput.value) || 0;\n            const maxVal = parseFloat(toInput.value) || max;\n            if (minVal > maxVal) fromInput.value = maxVal;\n            rangeMinSlider.value = fromInput.value;\n        });\n\n        toInput.addEventListener('input', () => {\n            const minVal = parseInt(fromInput.value, 10) || 0;\n            const maxVal = parseInt(toInput.value, 10) || max;\n            if (maxVal < minVal) toInput.value = minVal;\n            rangeMaxSlider.value = toInput.value;\n        });\n\n        rangeMinSlider.addEventListener('input', () => {\n            const minVal = parseInt(rangeMinSlider.value, 10);\n            const maxVal = parseInt(rangeMaxSlider.value, 10) || max;\n            if (minVal > maxVal) rangeMinSlider.value = maxVal;\n            fromInput.value = rangeMinSlider.value;\n        });\n\n        rangeMaxSlider.addEventListener('input', () => {\n            const minVal = parseInt(rangeMinSlider.value, 10) || 0;\n            const maxVal = parseInt(rangeMaxSlider.value, 10);\n            if (maxVal < minVal) rangeMaxSlider.value = minVal;\n            toInput.value = rangeMaxSlider.value;\n        });\n\n        applyButton.addEventListener('click', () => {\n            const minVal = fromInput.value || '0';\n            const maxVal = toInput.value || String(facet.max);\n            this.state.filters[facetName] = new Set([minVal + '-' + maxVal]);\n            this.state.page = 1;\n            this.fetchAndRender();\n            details.removeAttribute('open');\n        });\n\n        // Populate inputs/sliders from active filter value on re-render\n        const existingFilter = this.state.filters[facetName];\n        if (existingFilter && existingFilter.size > 0) {\n            const existingValue = [...existingFilter][0];\n            const [existingMin, existingMax] = existingValue.split('-');\n            if (existingMin !== undefined && existingMax !== undefined) {\n                fromInput.value = existingMin;\n                toInput.value = existingMax;\n                rangeMinSlider.value = existingMin;\n                rangeMaxSlider.value = existingMax;\n            }\n        }\n\n        const footer = document.createElement('div');\n        footer.className = 'no-js-hidden mobile-facets__footer gradient';\n\n        const clearWrapper = document.createElement('facet-remove');\n        clearWrapper.className = 'mobile-facets__clear-wrapper';\n        const clearLink = document.createElement('a');\n        clearLink.href = this.buildRemoveAllFiltersUrl();\n        clearLink.className = 'mobile-facets__clear underlined-link';\n        clearLink.setAttribute('role', 'button');\n        clearLink.textContent = 'Clear';\n        clearLink.addEventListener('click', (e) => {\n            e.preventDefault();\n            this.state.filters[facetName] = new Set();\n            this.state.page = 1;\n            this.fetchAndRender();\n            details.removeAttribute('open');\n        });\n        clearWrapper.appendChild(clearLink);\n        footer.appendChild(clearWrapper);\n\n        display.appendChild(footer);\n        details.appendChild(display);\n        return details;\n    }\n\n    getPageType() {\n        return 'unknown';\n    }\n\n    renderProducts(products) {\n        const grid = this.querySelector('[data-products-grid]');\n        if (!grid) return;\n\n        const desktopCols = this.dataset.columnsDesktop || 3;\n        const mobileCols = this.dataset.columnsMobile || 2;\n        grid.className =\n            'grid product-grid grid--' +\n            mobileCols +\n            '-col-tablet-down grid--' +\n            desktopCols +\n            '-col-desktop';\n        grid.innerHTML = '';\n        grid.dataset.cnstrcSection = '';\n\n        const pageType = this.getPageType();\n\n        if (pageType === 'collection') {\n            grid.dataset.cnstrcBrowse = '';\n        } else if (pageType === 'search') {\n            grid.dataset.cnstrcSearch = '';\n            if (this.state.query) {\n                grid.dataset.cnstrcSearchTerm = String(this.state.query);\n            }\n        }\n\n        if (this.state.resultId) grid.dataset.cnstrcResultId = this.state.resultId;\n        else delete grid.dataset.cnstrcResultId;\n        grid.dataset.cnstrcNumResults = String(this.state.totalNumResults);\n        grid.dataset.cnstrcResultPage = String(this.state.page);\n\n        const filterEntries = Object.entries(this.state.filters);\n        // ! P80: Enable this if we want facet filters in the tracking\n        // if (filterEntries.length > 0) {\n        //     const [filterName, filterValues] = filterEntries[0];\n        //     grid.dataset.cnstrcFilterName = filterName;\n        //     grid.dataset.cnstrcFilterValue = [...filterValues].join(',');\n        // } else {\n        //     grid.dataset.cnstrcFilterName = 'group_id';\n        //     grid.dataset.cnstrcFilterValue = this.dataset.collectionHandle || '';\n        // }\n\n        grid.dataset.cnstrcFilterName = 'group_id';\n        grid.dataset.cnstrcFilterValue = this.dataset.collectionHandle || '';\n\n        if (!products.length) {\n            grid.innerHTML =\n                '<li class=\"grid__item\"><p class=\"text-center\">No products match your filters.</p></li>';\n            grid.dataset.cnstrcZeroResult = '';\n            return;\n        } else {\n            delete grid.dataset.cnstrcZeroResult;\n        }\n\n        products.forEach((item, index) => {\n            const li = document.createElement('li');\n            li.className = 'grid__item';\n            if (this.dataset.animationsOnScroll === 'true') {\n                li.classList.add('scroll-trigger', 'animate--slide-in');\n                li.style.setProperty('--animation-order', index + 1);\n            }\n            li.appendChild(this.renderCard(item));\n            grid.appendChild(li);\n        });\n\n        if (this.dataset.animationsOnScroll === 'true' && window?.animateScrollTrigger) {\n            setTimeout(window.animateScrollTrigger, 50);\n        }\n\n        // Reinitialize compare bar after rendering product cards\n        const compareBar = document.querySelector('compare-bar');\n        if (compareBar && typeof compareBar.reinitialize === 'function') {\n            compareBar.reinitialize();\n        }\n    }\n\n    renderCard(item) {\n        const data = item.data || {};\n        const price = Number(data.price);\n        const compareAtPrice = Number(data.compareAtPrice);\n        const hasPrice = Number.isFinite(price) && price > 0;\n        const hasCompareAtPrice = Number.isFinite(compareAtPrice) && compareAtPrice > 0;\n        const isOnSale = hasPrice && hasCompareAtPrice && compareAtPrice > price;\n        const savingsPercent = isOnSale ? ((compareAtPrice - price) / compareAtPrice) * 100 : 0;\n\n        const replacements = {\n            '#HANDLE#': escapeAttr(data.handle || ''),\n            '#URL#': escapeAttr(data.url || '#'),\n            '#PRODUCT_NAME#': escapeHtml(data.name || item.value || ''),\n            '#IMAGE_URL#': escapeAttr(\n                data.image_url ? data.image_url + '&width=800&height=800' : ''\n            ),\n            '#IMAGE_ALT#': escapeAttr(data.name || item.value || ''),\n            '#PRICE#': escapeHtml(formatPrice(price)),\n            '#COMPARE_AT_PRICE#': escapeHtml(hasCompareAtPrice ? formatPrice(compareAtPrice) : ''),\n            '#PRICE_RAW#': hasPrice ? price.toFixed(2) : '',\n            '#VARIATION_ID#': escapeAttr(data.variation_id || ''),\n            '#STRATEGY_ID#': escapeAttr(item.strategy?.id || ''),\n            '#YEAR_CYCLING#': escapeAttr(data.year_cycling || '')\n        };\n\n        let html =\n            this.cardTemplate ||\n            '<a href=\"#URL#\"><img src=\"#IMAGE_URL#\" alt=\"#IMAGE_ALT#\"><div>#PRODUCT_NAME#</div><div>#PRICE#</div></a>';\n        Object.entries(replacements).forEach(([token, value]) => {\n            html = html.replaceAll(token, value);\n        });\n\n        const wrapper = document.createElement('div');\n        wrapper.innerHTML = html.trim();\n        const card = wrapper.firstElementChild;\n\n        if (isOnSale && card) {\n            card.querySelector('.card-information > .price')?.classList.add('price--on-sale');\n            const savingsBadge = card.querySelector('[data-savings]');\n            if (savingsBadge && savingsPercent > 5) {\n                savingsBadge.classList.remove('hidden');\n                savingsBadge.textContent = Math.round(savingsPercent) + '% OFF';\n            }\n        }\n\n        this.renderCardVariants(card, item);\n\n        if (card) {\n            card.dataset.cnstrcItem = 'collection-product';\n            card.dataset.cnstrcSection = 'Products';\n            card.dataset.cnstrcItemId = data.id || '';\n            card.dataset.cnstrcItemName = data.name || item.value || '';\n            if (data.variation_id) card.dataset.cnstrcItemVariationId = data.variation_id;\n            if (data.price != null) card.dataset.cnstrcItemPrice = Number(data.price).toFixed(2);\n        }\n\n        return card;\n    }\n\n    renderCardVariants(card, item) {\n        const thumbnailsEl = card?.querySelector('.card__variant-thumbnails');\n        const variations = item.variations || [];\n        if (!thumbnailsEl || !variations.length) return;\n\n        thumbnailsEl.innerHTML = '';\n        const seen = new Set();\n        const unique = variations.filter((v) => {\n            const imgUrl = v.data?.image_url || '';\n            if (!imgUrl || seen.has(imgUrl)) return false;\n            seen.add(imgUrl);\n            return true;\n        });\n\n        const MAX = 3;\n        const visible = unique.slice(0, MAX);\n        const remainder = unique.length - visible.length;\n\n        visible.forEach((v) => {\n            const vData = v.data || {};\n            const vImageUrl = vData.image_url || '';\n            const vName = v.value || vData.name || '';\n\n            const span = document.createElement('span');\n            span.title = escapeHtml(vName);\n\n            const img = document.createElement('img');\n            img.src = escapeAttr(vImageUrl + '&width=46');\n            img.alt = escapeAttr(vName);\n            img.loading = 'lazy';\n            img.width = 48;\n            img.height = 48;\n\n            span.appendChild(img);\n            thumbnailsEl.appendChild(span);\n        });\n\n        if (remainder > 0) {\n            const more = document.createElement('span');\n            more.textContent = '+' + remainder;\n            thumbnailsEl.appendChild(more);\n        }\n    }\n\n    renderSortOptions(sortOptions = []) {\n        // 1. Grab all matching select elements instead of just the first one\n        const selects = this.querySelectorAll('select.facet-filters__sort');\n        if (selects.length === 0) return;\n\n        const visibleSortOptions = Array.isArray(sortOptions)\n            ? sortOptions.filter((option) => !option.hidden)\n            : [];\n        const selectedOption = this.getSelectedSortOption(visibleSortOptions);\n\n        if (selectedOption) {\n            this.state.sortBy = selectedOption.sort_by || '';\n            this.state.sortOrder = selectedOption.sort_order || 'ascending';\n        }\n\n        // 2. Populate and set the values for *all* found select elements\n        if (visibleSortOptions.length > 0) {\n            selects.forEach((select) => {\n                select.innerHTML = '';\n\n                visibleSortOptions.forEach((option) => {\n                    const selectOption = document.createElement('option');\n                    selectOption.value = (option.sort_by || '') + '|||' + (option.sort_order || '');\n                    selectOption.textContent = option.display_name || option.sort_by || '';\n                    selectOption.dataset.sortBy = option.sort_by || '';\n                    selectOption.dataset.sortOrder = option.sort_order || 'ascending';\n                    selectOption.selected =\n                        option.sort_by === this.state.sortBy &&\n                        option.sort_order === this.state.sortOrder;\n                    select.appendChild(selectOption);\n                });\n\n                if (selectedOption) {\n                    select.value =\n                        (selectedOption.sort_by || '') + '|||' + (selectedOption.sort_order || '');\n                }\n            });\n        }\n\n        // 3. Bind the change event listener to each select individually\n        selects.forEach((select) => {\n            if (!select.dataset.sortBound) {\n                select.addEventListener('change', (event) => {\n                    const currentSelect = event.currentTarget;\n                    const selected = currentSelect.selectedOptions?.[0];\n                    if (!selected) return;\n\n                    // Parse the value format: \"sort_by|||sort_order\"\n                    const valueParts = currentSelect.value.split('|||');\n                    const sortByFromValue = valueParts[0] || '';\n                    const sortOrderFromValue = valueParts[1] || 'ascending';\n\n                    // Update component state\n                    this.state.sortBy = selected.dataset.sortBy || sortByFromValue || '';\n                    this.state.sortOrder =\n                        selected.dataset.sortOrder || sortOrderFromValue || 'ascending';\n                    this.state.page = 1;\n\n                    // Optional: Instantly synchronize the other dropdowns UI before fetching\n                    selects.forEach((s) => {\n                        if (s !== currentSelect) {\n                            s.value = currentSelect.value;\n                        }\n                    });\n\n                    this.fetchAndRender();\n                });\n                select.dataset.sortBound = 'true';\n            }\n        });\n    }\n\n    getSortOptionValue(sortOption) {\n        return (sortOption?.sort_by || '') + '|||' + (sortOption?.sort_order || '');\n    }\n\n    getSelectedSortOption(sortOptions = []) {\n        if (!Array.isArray(sortOptions) || sortOptions.length === 0) return null;\n\n        const currentMatch = sortOptions.find(\n            (option) =>\n                option.sort_by === this.state.sortBy &&\n                option.sort_order === this.state.sortOrder &&\n                !option.hidden\n        );\n        if (currentMatch) return currentMatch;\n\n        const selectedOption = sortOptions.find((option) => option.status === 'selected');\n        if (selectedOption && !selectedOption.hidden) return selectedOption;\n\n        return sortOptions.find((option) => !option.hidden) || sortOptions[0] || null;\n    }\n\n    renderPagination(totalResults) {\n        const container = this.querySelector('[data-pagination]');\n        if (!container) return;\n\n        const perPage = parseInt(this.dataset.resultsPerPage) || CONSTRUCTOR_CONFIG.DEFAULT_RESULTS;\n        const totalPages = Math.ceil(totalResults / perPage);\n        const currentPage = this.state.page;\n        const arrowSvg = window.icons?.arrow || '{% render \"icon-arrow\" %}';\n\n        container.innerHTML = '';\n        if (totalPages <= 1) {\n            container.hidden = true;\n            return;\n        }\n        container.hidden = false;\n\n        const nav = document.createElement('nav');\n        nav.className = 'pagination';\n        nav.setAttribute('role', 'navigation');\n        nav.setAttribute('aria-label', 'Pagination');\n\n        const ul = document.createElement('ul');\n        ul.className = 'pagination__list list-unstyled';\n        ul.setAttribute('role', 'list');\n\n        const prevLi = document.createElement('li');\n        prevLi.className = 'pagination__item--next-li';\n        if (currentPage > 1) {\n            const a = document.createElement('a');\n            a.href = '?page=' + (currentPage - 1) + this.getFilterQueryString();\n            a.className =\n                'pagination__item pagination__item--next pagination__item-arrow link motion-reduce';\n            a.setAttribute('aria-label', 'Previous page');\n            a.innerHTML = arrowSvg;\n            a.addEventListener('click', (e) => {\n                e.preventDefault();\n                this.goToPage(currentPage - 1);\n            });\n            prevLi.appendChild(a);\n        }\n        ul.appendChild(prevLi);\n\n        const pages = getPageRange(currentPage, totalPages);\n        pages.forEach((p) => {\n            const li = document.createElement('li');\n            if (p === '\\u2026') {\n                const span = document.createElement('span');\n                span.className = 'pagination__item';\n                span.textContent = '\\u2026';\n                li.appendChild(span);\n            } else if (p === currentPage) {\n                const a = document.createElement('a');\n                a.className = 'pagination__item pagination__item--current light';\n                a.setAttribute('role', 'link');\n                a.setAttribute('aria-disabled', 'true');\n                a.setAttribute('aria-current', 'page');\n                a.setAttribute('aria-label', 'Page ' + p);\n                a.setAttribute('tabindex', '0');\n                a.textContent = p;\n                li.appendChild(a);\n            } else {\n                const a = document.createElement('a');\n                a.href = '?page=' + p + this.getFilterQueryString();\n                a.className = 'pagination__item link';\n                a.setAttribute('aria-label', 'Page ' + p);\n                a.textContent = p;\n                a.addEventListener('click', (e) => {\n                    e.preventDefault();\n                    this.goToPage(p);\n                });\n                li.appendChild(a);\n            }\n            ul.appendChild(li);\n        });\n\n        const nextLi = document.createElement('li');\n        nextLi.className = 'pagination__item--prev-li';\n        if (currentPage < totalPages) {\n            const a = document.createElement('a');\n            a.href = '?page=' + (currentPage + 1) + this.getFilterQueryString();\n            a.className =\n                'pagination__item pagination__item--prev pagination__item-arrow link motion-reduce';\n            a.setAttribute('aria-label', 'Next page');\n            a.innerHTML = arrowSvg;\n            a.addEventListener('click', (e) => {\n                e.preventDefault();\n                this.goToPage(currentPage + 1);\n            });\n            nextLi.appendChild(a);\n        }\n        ul.appendChild(nextLi);\n\n        nav.appendChild(ul);\n        container.appendChild(nav);\n\n        if (currentPage > 1) window.scrollTo({ top: 0, behavior: 'smooth' });\n    }\n\n    getFilterQueryString() {\n        const params = new URLSearchParams();\n        Object.entries(this.state.filters).forEach(([facet, values]) => {\n            values.forEach((val) => params.append('filters[' + facet + ']', val));\n        });\n        if (this.state.sortBy) params.set('sort_by', this.state.sortBy);\n        if (this.state.sortOrder) params.set('sort_order', this.state.sortOrder);\n        const qs = params.toString();\n        return qs ? '&' + qs : '';\n    }\n\n    toggleFilter(facet, value, active) {\n        if (active) {\n            if (!this.state.filters[facet]) this.state.filters[facet] = new Set();\n            this.state.filters[facet].add(value);\n        } else {\n            this.state.filters[facet]?.delete(value);\n            if (!this.state.filters[facet]?.size) delete this.state.filters[facet];\n        }\n        this.state.page = 1;\n        this.debouncedFetchAndRender();\n    }\n\n    removeFilter(facet, value) {\n        this.state.filters[facet]?.delete(value);\n        if (!this.state.filters[facet]?.size) delete this.state.filters[facet];\n        this.state.page = 1;\n        this.debouncedFetchAndRender();\n    }\n\n    clearAllFilters() {\n        this.state.filters = {};\n        this.state.page = 1;\n        this.fetchAndRender();\n    }\n\n    goToPage(page) {\n        this.state.page = page;\n        this.fetchAndRender();\n    }\n\n    debouncedFetchAndRender() {\n        if (this.debounceTimer) clearTimeout(this.debounceTimer);\n        this.debounceTimer = setTimeout(() => {\n            this.fetchAndRender();\n        }, 300);\n    }\n\n    async fetchAndRender() {\n        const requestId = Date.now() + Math.random();\n        this.pendingRequest = requestId;\n        this.showLoadingSpinner();\n\n        try {\n            const data = await this.fetchData(this.state.page, this.state.filters);\n\n            if (this.pendingRequest !== requestId) {\n                console.log('[ConstructorListingBase] Discarding stale response');\n                return;\n            }\n\n            this.state.resultId = data.result_id || '';\n            this.state.totalNumResults = data.response?.total_num_results || 0;\n            this.state.sortOptions = data.response?.sort_options || [];\n\n            this.renderSortOptions(this.state.sortOptions);\n            this.renderFacets(data.response.facets || []);\n            this.renderProducts(data.response.results);\n            this.renderPagination(data.response.total_num_results || 0);\n            this.updateProductCount(data.response.total_num_results || 0);\n            this.syncUrl();\n\n            this.refreshFacetAvailabilityCounts();\n            if (this.reInitAlertBar) this.reInitAlertBar();\n        } catch (err) {\n            console.error('[ConstructorListingBase] Fetch error:', err);\n        } finally {\n            this.hideLoadingSpinner();\n        }\n    }\n\n    syncUrl() {\n        const params = new URLSearchParams();\n        if (this.state.page > 1) params.set('page', this.state.page);\n        if (this.state.sortBy) params.set('sort_by', this.state.sortBy);\n        if (this.state.sortOrder) params.set('sort_order', this.state.sortOrder);\n\n        Object.entries(this.state.filters).forEach(([facet, values]) => {\n            values.forEach((val) => params.append('filters[' + facet + ']', val));\n        });\n\n        const qs = params.toString();\n        const newUrl = window.location.pathname + (qs ? '?' + qs : '');\n\n        if (window.location.search !== (qs ? '?' + qs : '')) {\n            window.history.replaceState(null, '', newUrl);\n        }\n    }\n\n    updateProductCount(count) {\n        const counter = this.querySelector('#ProductCountDesktop');\n        if (counter) {\n            counter.textContent = count + ' product' + (count !== 1 ? 's' : '');\n        }\n    }\n\n    refreshFacetAvailabilityCounts() {\n        requestAnimationFrame(() => {\n            const allFacets = this.querySelectorAll('your-store-facet-cio');\n            allFacets.forEach((facet) => {\n                if (facet.setLocalData) facet.setLocalData();\n                facet?.syncAvailability?.();\n            });\n        });\n    }\n\n    hideAllFacetLoaders() {\n        const allFacets = this.querySelectorAll('your-store-facet-cio');\n        allFacets.forEach((facet) => {\n            const loader = facet.querySelector('.facet-store-selector__loader');\n            if (loader) loader.classList.remove('visible');\n        });\n    }\n\n    hideLoading() {\n        this.querySelector('.loading-overlay')?.classList.add('hidden');\n        this.querySelector('.constructor-collection-browser__loading')?.classList.add('hidden');\n        this.querySelector('.facets__loading')?.classList.add('hidden');\n    }\n\n    showLoadingSpinner() {\n        const productCountContainer = this.querySelector('.product-count-vertical');\n        if (productCountContainer) {\n            const spinner = productCountContainer.querySelector('.loading__spinner');\n            if (spinner) spinner.classList.remove('hidden');\n        }\n    }\n\n    hideLoadingSpinner() {\n        const productCountContainer = this.querySelector('.product-count-vertical');\n        if (productCountContainer) {\n            const spinner = productCountContainer.querySelector('.loading__spinner');\n            if (spinner) spinner.classList.add('hidden');\n        }\n    }\n\n    showFallback(message) {\n        const grid = this.querySelector('[data-products-grid]');\n        this.querySelector('.loading-overlay')?.classList.add('hidden');\n\n        if (grid) {\n            grid.innerHTML =\n                '<div class=\"collection collection--empty page-width\"><div class=\"title-wrapper center\"><h2 class=\"title title--primary\">' +\n                escapeHtml(message) +\n                '<br><a href=\"?view=collection\" class=\"underlined-link link\">Load native view</a></h2></div></div>';\n        }\n    }\n\n    buildRemoveFilterUrl(facetToRemove, valueToRemove) {\n        const params = new URLSearchParams(window.location.search);\n        const allFilters = params.getAll('filters[' + facetToRemove + ']');\n        const remaining = allFilters.filter((val) => val !== valueToRemove);\n\n        params.delete('filters[' + facetToRemove + ']');\n        remaining.forEach((val) => params.append('filters[' + facetToRemove + ']', val));\n\n        return window.location.pathname + '?' + params.toString();\n    }\n\n    buildRemoveAllFiltersUrl() {\n        return window.location.pathname + '?type=product';\n    }\n\n    setupRemoveAllButton() {\n        const removeAllDesktop = this.querySelector('[data-filter-remove-all]');\n        if (removeAllDesktop) {\n            removeAllDesktop.addEventListener('click', (e) => {\n                e.preventDefault();\n                this.clearAllFilters();\n            });\n        }\n\n        const removeAllMobile = this.querySelector('[data-filter-remove-all-mobile]');\n        if (removeAllMobile) {\n            removeAllMobile.addEventListener('click', (e) => {\n                e.preventDefault();\n                this.clearAllFilters();\n                const mobileWrapper = this.querySelector('.mobile-facets__wrapper');\n                if (mobileWrapper) {\n                    const summary = mobileWrapper.querySelector('summary');\n                    if (summary && summary.hasAttribute('aria-expanded')) summary.click();\n                }\n            });\n        }\n    }\n}\n\n/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n   REGISTER CUSTOM ELEMENTS\n   \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */\nif (!customElements.get('constructor-listing-base')) {\n    customElements.define('constructor-listing-base', ConstructorListingBase);\n}\n\n/* \u2500\u2500 Auto-init config injection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\ndocument.addEventListener('DOMContentLoaded', () => {\n    document.querySelectorAll('constructor-collection-browser').forEach((el) => {\n        if (!el.dataset.indexKey && window.CONSTRUCTOR_API_KEY) {\n            el.dataset.indexKey = window.CONSTRUCTOR_API_KEY;\n        }\n    });\n});\n"],
  "mappings": "AAoBA,MAAM,mBAAqB,CACvB,QAAS,OAAO,oBAChB,gBAAiB,GAGjB,eAAgB,CACZ,kBACA,6BACA,gBACA,0BACA,mBACA,iBACA,qBACA,cACA,WACA,gBACA,kBACA,kBACA,WACA,uBACA,cACA,uBACA,mBACA,0BACA,qBACA,aACA,aACA,cACA,gBACA,uBACA,yBACA,gBACA,mBACA,oBACA,sBACA,yBACA,gCACA,qBACA,qBACA,kBACA,6BACA,oBACA,eACA,kBACA,uBACA,oBACA,uBACA,gBACA,4BACA,eACA,aACA,iBACA,cACA,0BACA,iBACA,kBACA,mBACA,iBACA,kBACA,uBACA,eACA,iBACA,cACA,kBACA,iBACA,qBACA,6BACA,4BACA,cACA,QACA,qBACA,YACA,0BACA,qBACA,yBACA,wBACA,gBACA,iBACA,cACA,eACA,yBACA,oBACA,iBACA,iBACA,cACA,OACA,kBACA,aACA,cACA,aACA,gBACA,eACA,mBACA,gBACA,qBACA,wBACA,kBACA,mBACA,mBACA,gBACA,sBACA,mBACA,gBACA,sBACA,gBACA,kBACA,0BACA,SACA,kBACA,mBACA,uBACA,iBACA,gBACA,aACA,YACJ,EAEA,oBAAqB,CACjB,MAAO,QACP,kBAAmB,oBACnB,eAAgB,WAChB,mBAAoB,eACpB,gBAAiB,kBACjB,2BAA4B,6BAC5B,cAAe,gBACf,KAAM,OACN,WAAY,aACZ,aAAc,eACd,gBAAiB,kBACjB,eAAgB,iBAChB,aAAc,eACd,WAAY,aACZ,WAAY,aACZ,SAAU,WACV,cAAe,gBACf,mBAAoB,qBACpB,sBAAuB,wBACvB,wBAAyB,0BACzB,cAAe,gBACf,gBAAiB,kBACjB,YAAa,cACb,aAAc,eACd,YAAa,cACb,mBAAoB,qBACpB,0BAA2B,4BAC3B,SAAU,WACV,gBAAiB,kBACjB,2BAA4B,6BAC5B,qBAAsB,uBACtB,gBAAiB,kBACjB,iBAAkB,mBAClB,eAAgB,iBAChB,cAAe,gBACf,WAAY,aACZ,cAAe,gBACf,UAAW,YACX,YAAa,cACb,iBAAkB,mBAClB,cAAe,gBACf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",
  "names": ["last"]
}
