{"version":3,"file":"Refinements.js","names":["Refinements","a","setters","Component","default","Event","on","off","mediaQuery","deepMerge","mix","LoaderMixin","Accessibility","execute","with","constructor","element","options","arguments","length","templateName","url","resetUrl","appliedFiltersQty","appliedRefinementUrl","dataModelId","trackFocusedElements","events","toggle","select","updated","apply","removeLoader","urlParams","components","isSlidingPanel","retainPanelOnReset","initCache","selectors","backButton","querySelectorAll","resetButton","applyButton","filterOptions","initState","state","loading","currentRefinementUrl","resetRefinementsUrl","bindEvents","onBackClick","bind","onApplyClick","onResetClick","onKeyboardControl","onPriceRangeSliderInitialized","onRefinementSelected","onRefinementsUpdated","onSearchRemoveLoader","afterInit","restoreLastFocusState","closePanel","is","updateRefinements","window","location","href","updateResults","emit","close","addLoader","overlay","refine","e","lastSelectedRefinement","refinementId","refinements","dontUpdateURL","Object","assign","data","isInsertMode","saveLastFocusState","categoryname","refinebycategory","componentOptions","render","onTabKey","event","focusTrap","key","destroy","removeListener"],"sources":["components/search/Refinements.js"],"sourcesContent":["import Component from 'core/Component';\nimport { Event } from 'services/EventEmitter';\nimport { on, off } from 'toolbox/event';\nimport { mediaQuery } from 'toolbox/mediaQuery';\nimport { deepMerge } from 'toolbox/deepMerge';\nimport { mix } from 'core/mixwith';\nimport LoaderMixin from 'mixins/Loader';\nimport Accessibility from 'mixins/Accessibility';\n\n/**\n * This is a description of the Refinements constructor function.\n * @class\n * @classdesc This is a description of the Refinements class.\n * @extends Component\n */\nexport default class Refinements extends mix(Component).with(LoaderMixin, Accessibility) {\n    /**\n     * Constructor of the class that mainly merge the options of the components\n     *\n     * @param {HTMLElement} element HTMLElement of the component\n     * @param {Object} options That belongs to the component\n     */\n    constructor(element, options = {}) {\n        super(element, deepMerge({\n            templateName: 'search/refinements',\n            url: '',\n            resetUrl: '',\n            appliedFiltersQty: 0,\n            appliedRefinementUrl: null,\n            dataModelId: 'refinements',\n            trackFocusedElements: true, // enable focused element tracking\n            events: {\n                toggle: 'search.refinementsPanel.toggle',\n                select: 'search.refinement.selected',\n                updated: 'search.updated',\n                apply: 'search.refinements.apply',\n                removeLoader: 'search.removeLoader',\n            },\n            urlParams: {\n                components: 'search_refinements',\n            },\n            isSlidingPanel: false,\n            retainPanelOnReset: false, // retain panel open on reset\n        }, options));\n    }\n\n    /**\n     * All selectors must be cached. Never cache elements that are out of the component scope\n     */\n    initCache() {\n        this.selectors.backButton = this.element.querySelectorAll('[data-js-refinements-back]');\n        this.selectors.resetButton = this.element.querySelectorAll('[data-js-refinements-reset]');\n        this.selectors.applyButton = this.element.querySelectorAll('[data-js-refinements-apply]');\n        this.filterOptions = {};\n    }\n\n    /**\n     * Init the different state of the component\n     * It helps to avoid heavy DOM manipulation\n     */\n    initState() {\n        this.state.loading = false;\n        this.currentRefinementUrl = this.options.url;\n        this.resetRefinementsUrl = this.options.resetUrl;\n        this.appliedFiltersQty = this.options.appliedFiltersQty;\n        this.appliedRefinementUrl = this.options.appliedRefinementUrl;\n    }\n\n    /**\n     * Should contain only event listeners and nothing else\n     * All the event handlers should be into a separated function. No usage of anonymous function\n     */\n    bindEvents() {\n        super.bindEvents();\n\n        on('click', this.selectors.backButton, this.onBackClick.bind(this));\n        on('click', this.selectors.applyButton, this.onApplyClick.bind(this));\n        on('click', this.selectors.resetButton, this.onResetClick.bind(this));\n        on('keydown', this.element, this.onKeyboardControl.bind(this));\n        on('pricerangeslider.initialized', this.element, this.onPriceRangeSliderInitialized.bind(this));\n\n        Event.on(this.options.events.select, this.onRefinementSelected, this);\n        Event.on(this.options.events.updated, this.onRefinementsUpdated, this);\n        Event.on(this.options.events.removeLoader, this.onSearchRemoveLoader, this);\n    }\n\n    /**\n     * After init\n     * Run any script after the component is fully initialized\n     */\n    afterInit() {\n        this.restoreLastFocusState();\n    }\n\n    /**\n     * Restores last focus state\n     * @listens pricerangeslider.initialized\n     */\n    onPriceRangeSliderInitialized() {\n        this.restoreLastFocusState();\n    }\n\n    /**\n     * Event handler for back button\n     * emit an event to close the search panel\n     */\n    onBackClick() {\n        this.closePanel();\n        if (mediaQuery.is('medium down')) {\n            this.appliedFiltersQty = 0;\n            // reset refinements panel to initial state\n            this.updateRefinements(this.appliedRefinementUrl || window.location.href);\n        }\n    }\n\n    /**\n     * Event handler for Apply button click\n    */\n    onApplyClick() {\n        this.closePanel();\n        this.updateResults();\n    }\n\n    /**\n     * Close refinements panel\n     */\n    closePanel() {\n        Event.emit(this.options.events.toggle);\n        if (this.options.isSlidingPanel) {\n            Event.emit('slidingPanel.close');\n        }\n    }\n\n    /**\n     * Close refinements panel\n     */\n    close() {\n        this.onBackClick();\n    }\n\n    /**\n     * Event handler for Reset button\n     * clear refinements\n     */\n    onResetClick() {\n        if (this.appliedFiltersQty === 0 || this.currentRefinementUrl === this.resetRefinementsUrl) {\n            return;\n        }\n\n        this.currentRefinementUrl = this.resetRefinementsUrl;\n        this.appliedRefinementUrl = this.currentRefinementUrl;\n\n        if (mediaQuery.is('medium down') && this.options.retainPanelOnReset) {\n            this.addLoader(this.element, { overlay: true });\n        }\n\n        this.refine({\n            url: this.resetRefinementsUrl,\n            appliedFiltersQty: '',\n        });\n\n        if (!this.options.retainPanelOnReset) {\n            this.closePanel();\n        }\n    }\n\n    /**\n     * Event handler for refinement selection\n     *\n     * @param {Event} e - refinement selection event\n     */\n    onRefinementSelected(e) {\n        this.currentRefinementUrl = e.url;\n        this.lastSelectedRefinement = e.refinementId;\n        this.state.loading = true;\n        if (mediaQuery.is('large')) {\n            this.updateResults();\n        } else {\n            this.updateRefinements(this.currentRefinementUrl);\n        }\n    }\n\n    /**\n     * Emits partial search update to update refinements\n     *\n     * @param {String} url - url string to get new refinements data from\n     */\n    updateRefinements(url) {\n        this.addLoader(this.element, { overlay: true });\n\n        this.refine({\n            url,\n            appliedFiltersQty: this.appliedFiltersQty === 0 ? '' : this.appliedFiltersQty,\n            urlParams: this.options.urlParams || {},\n            refinementId: this.lastSelectedRefinement,\n            refinements: true,\n            dontUpdateURL: true,\n        });\n    }\n\n    /**\n     * Apply selected refinements\n     */\n    updateResults() {\n        this.appliedRefinementUrl = this.currentRefinementUrl;\n        this.refine({\n            url: this.currentRefinementUrl,\n            appliedFiltersQty: this.appliedFiltersQty === 0 ? '' : this.appliedFiltersQty,\n            refinementId: this.lastSelectedRefinement,\n        });\n    }\n\n    /**\n     * Send an event with data to refine products\n     *\n     * @param {Object} filterOptions Object with filter options\n     */\n    refine(filterOptions) {\n        Event.emit(this.options.events.apply, Object.assign({}, filterOptions));\n    }\n\n    /**\n     * Callback on result updated from ajax request.\n     * If callback is due to a insertion, there is no refinement to be changed.\n     * @param {Object} data Data due to refinement to be changed\n     * @param {Boolean} isInsertMode Flag due to a insertion\n     */\n    onRefinementsUpdated(data, isInsertMode) {\n        if (data[this.options.dataModelId] && !isInsertMode) {\n            this.saveLastFocusState();\n            data[this.options.dataModelId].currentRefinementUrl = this.currentRefinementUrl;\n            data[this.options.dataModelId].categoryname = data.categoryname;\n            data[this.options.dataModelId].refinebycategory = data.refinebycategory;\n            data[this.options.dataModelId].componentOptions = data[this.options.dataModelId].componentOptions || {};\n            data[this.options.dataModelId].componentOptions.appliedRefinementUrl = this.appliedRefinementUrl;\n            this.removeLoader(this.element);\n            this.render(data[this.options.dataModelId]);\n        }\n    }\n\n    /**\n     * Tab key event\n     *\n     * @param {Object} event Event object\n    */\n    onTabKey(event) {\n        if (mediaQuery.is('medium down')) {\n            super.focusTrap(this.element, event);\n        }\n    }\n\n    /**\n     * Keydown event handler\n     *\n     * @param {Object} event Event object\n     */\n    onKeyboardControl(event) {\n        switch (event.key) {\n        case 'Tab': // 'Tab' key\n            this.onTabKey(event);\n            break;\n        case 'Escape': // 'Escape' key\n            this.close();\n            break;\n        default:\n            break;\n        }\n    }\n\n    /**\n     * Event handler for remove loader\n     */\n    onSearchRemoveLoader() {\n        this.removeLoader(this.element);\n    }\n\n    /**\n     * Destroy is called automatically after the component is being removed from the DOM\n     * You must always destroy the listeners attached to an element to avoid any memory leaks\n     */\n    destroy() {\n        super.destroy();\n\n        off('click', this.selectors.backButton);\n        off('click', this.selectors.resetButton);\n        off('click', this.selectors.applyButton);\n        off('keydown', this.element);\n        Event.removeListener(this.options.events.select, this.onRefinementSelected, this);\n        Event.removeListener(this.options.events.updated, this.onRefinementsUpdated, this);\n        Event.removeListener(this.options.events.removeLoader, this.onSearchRemoveLoader, this);\n    }\n}\n"],"mappings":"sOAeqBA,CAAW,QAAAC,CAAA,oBAAAC,OAAA,WAAAD,CAAA,EAfzBE,CAAS,CAAAF,CAAA,CAAAG,OAAA,WAAAH,CAAA,EACPI,CAAK,CAAAJ,CAAA,CAALI,KAAK,WAAAJ,CAAA,EACLK,CAAE,CAAAL,CAAA,CAAFK,EAAE,CAAEC,CAAG,CAAAN,CAAA,CAAHM,GAAG,WAAAN,CAAA,EACPO,CAAU,CAAAP,CAAA,CAAVO,UAAU,WAAAP,CAAA,EACVQ,CAAS,CAAAR,CAAA,CAATQ,SAAS,WAAAR,CAAA,EACTS,CAAG,CAAAT,CAAA,CAAHS,GAAG,WAAAT,CAAA,EACLU,CAAW,CAAAV,CAAA,CAAAG,OAAA,WAAAH,CAAA,EACXW,CAAa,CAAAX,CAAA,CAAAG,OAAA,GAAAS,OAAA,SAAAA,CAAA,EAAAZ,CAAA,WAQCD,CAAW,CAAjB,aAA0B,CAAAU,CAAG,CAACP,CAAS,CAAC,CAACW,IAAI,CAACH,CAAW,CAAEC,CAAa,CAAE,CAOrFG,WAAWA,CAACC,CAAO,CAAgB,IAAd,CAAAC,CAAO,GAAAC,SAAA,CAAAC,MAAA,WAAAD,SAAA,IAAAA,SAAA,IAAG,CAAC,CAAC,CAC7B,KAAK,CAACF,CAAO,CAAEP,CAAS,CAAC,CACrBW,YAAY,CAAE,oBAAoB,CAClCC,GAAG,CAAE,EAAE,CACPC,QAAQ,CAAE,EAAE,CACZC,iBAAiB,CAAE,CAAC,CACpBC,oBAAoB,CAAE,IAAI,CAC1BC,WAAW,CAAE,aAAa,CAC1BC,oBAAoB,GAAM,CAC1BC,MAAM,CAAE,CACJC,MAAM,CAAE,gCAAgC,CACxCC,MAAM,CAAE,4BAA4B,CACpCC,OAAO,CAAE,gBAAgB,CACzBC,KAAK,CAAE,0BAA0B,CACjCC,YAAY,CAAE,qBAClB,CAAC,CACDC,SAAS,CAAE,CACPC,UAAU,CAAE,oBAChB,CAAC,CACDC,cAAc,GAAO,CACrBC,kBAAkB,GACtB,CAAC,CAAEnB,CAAO,CAAC,CACf,CAKAoB,SAASA,CAAA,CAAG,CACR,IAAI,CAACC,SAAS,CAACC,UAAU,CAAG,IAAI,CAACvB,OAAO,CAACwB,gBAAgB,CAAC,4BAA4B,CAAC,CACvF,IAAI,CAACF,SAAS,CAACG,WAAW,CAAG,IAAI,CAACzB,OAAO,CAACwB,gBAAgB,CAAC,6BAA6B,CAAC,CACzF,IAAI,CAACF,SAAS,CAACI,WAAW,CAAG,IAAI,CAAC1B,OAAO,CAACwB,gBAAgB,CAAC,6BAA6B,CAAC,CACzF,IAAI,CAACG,aAAa,CAAG,CAAC,CAC1B,CAMAC,SAASA,CAAA,CAAG,CACR,IAAI,CAACC,KAAK,CAACC,OAAO,GAAQ,CAC1B,IAAI,CAACC,oBAAoB,CAAG,IAAI,CAAC9B,OAAO,CAACI,GAAG,CAC5C,IAAI,CAAC2B,mBAAmB,CAAG,IAAI,CAAC/B,OAAO,CAACK,QAAQ,CAChD,IAAI,CAACC,iBAAiB,CAAG,IAAI,CAACN,OAAO,CAACM,iBAAiB,CACvD,IAAI,CAACC,oBAAoB,CAAG,IAAI,CAACP,OAAO,CAACO,oBAC7C,CAMAyB,UAAUA,CAAA,CAAG,CACT,KAAK,CAACA,UAAU,CAAC,CAAC,CAElB3C,CAAE,CAAC,OAAO,CAAE,IAAI,CAACgC,SAAS,CAACC,UAAU,CAAE,IAAI,CAACW,WAAW,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC,CACnE7C,CAAE,CAAC,OAAO,CAAE,IAAI,CAACgC,SAAS,CAACI,WAAW,CAAE,IAAI,CAACU,YAAY,CAACD,IAAI,CAAC,IAAI,CAAC,CAAC,CACrE7C,CAAE,CAAC,OAAO,CAAE,IAAI,CAACgC,SAAS,CAACG,WAAW,CAAE,IAAI,CAACY,YAAY,CAACF,IAAI,CAAC,IAAI,CAAC,CAAC,CACrE7C,CAAE,CAAC,SAAS,CAAE,IAAI,CAACU,OAAO,CAAE,IAAI,CAACsC,iBAAiB,CAACH,IAAI,CAAC,IAAI,CAAC,CAAC,CAC9D7C,CAAE,CAAC,8BAA8B,CAAE,IAAI,CAACU,OAAO,CAAE,IAAI,CAACuC,6BAA6B,CAACJ,IAAI,CAAC,IAAI,CAAC,CAAC,CAE/F9C,CAAK,CAACC,EAAE,CAAC,IAAI,CAACW,OAAO,CAACU,MAAM,CAACE,MAAM,CAAE,IAAI,CAAC2B,oBAAoB,CAAE,IAAI,CAAC,CACrEnD,CAAK,CAACC,EAAE,CAAC,IAAI,CAACW,OAAO,CAACU,MAAM,CAACG,OAAO,CAAE,IAAI,CAAC2B,oBAAoB,CAAE,IAAI,CAAC,CACtEpD,CAAK,CAACC,EAAE,CAAC,IAAI,CAACW,OAAO,CAACU,MAAM,CAACK,YAAY,CAAE,IAAI,CAAC0B,oBAAoB,CAAE,IAAI,CAC9E,CAMAC,SAASA,CAAA,CAAG,CACR,IAAI,CAACC,qBAAqB,CAAC,CAC/B,CAMAL,6BAA6BA,CAAA,CAAG,CAC5B,IAAI,CAACK,qBAAqB,CAAC,CAC/B,CAMAV,WAAWA,CAAA,CAAG,CACV,IAAI,CAACW,UAAU,CAAC,CAAC,CACbrD,CAAU,CAACsD,EAAE,CAAC,aAAa,CAAC,GAC5B,IAAI,CAACvC,iBAAiB,CAAG,CAAC,CAE1B,IAAI,CAACwC,iBAAiB,CAAC,IAAI,CAACvC,oBAAoB,EAAIwC,MAAM,CAACC,QAAQ,CAACC,IAAI,CAAC,CAEjF,CAKAd,YAAYA,CAAA,CAAG,CACX,IAAI,CAACS,UAAU,CAAC,CAAC,CACjB,IAAI,CAACM,aAAa,CAAC,CACvB,CAKAN,UAAUA,CAAA,CAAG,CACTxD,CAAK,CAAC+D,IAAI,CAAC,IAAI,CAACnD,OAAO,CAACU,MAAM,CAACC,MAAM,CAAC,CAClC,IAAI,CAACX,OAAO,CAACkB,cAAc,EAC3B9B,CAAK,CAAC+D,IAAI,CAAC,oBAAoB,CAEvC,CAKAC,KAAKA,CAAA,CAAG,CACJ,IAAI,CAACnB,WAAW,CAAC,CACrB,CAMAG,YAAYA,CAAA,CAAG,CACoB,CAAC,GAA5B,IAAI,CAAC9B,iBAAuB,EAAI,IAAI,CAACwB,oBAAoB,GAAK,IAAI,CAACC,mBAAmB,GAI1F,IAAI,CAACD,oBAAoB,CAAG,IAAI,CAACC,mBAAmB,CACpD,IAAI,CAACxB,oBAAoB,CAAG,IAAI,CAACuB,oBAAoB,CAEjDvC,CAAU,CAACsD,EAAE,CAAC,aAAa,CAAC,EAAI,IAAI,CAAC7C,OAAO,CAACmB,kBAAkB,EAC/D,IAAI,CAACkC,SAAS,CAAC,IAAI,CAACtD,OAAO,CAAE,CAAEuD,OAAO,GAAO,CAAC,CAAC,CAGnD,IAAI,CAACC,MAAM,CAAC,CACRnD,GAAG,CAAE,IAAI,CAAC2B,mBAAmB,CAC7BzB,iBAAiB,CAAE,EACvB,CAAC,CAAC,CAEE,CAAC,IAAI,CAACN,OAAO,CAACmB,kBAAkB,EAChC,IAAI,CAACyB,UAAU,CAAC,CAAC,CAEzB,CAOAL,oBAAoBA,CAACiB,CAAC,CAAE,CACpB,IAAI,CAAC1B,oBAAoB,CAAG0B,CAAC,CAACpD,GAAG,CACjC,IAAI,CAACqD,sBAAsB,CAAGD,CAAC,CAACE,YAAY,CAC5C,IAAI,CAAC9B,KAAK,CAACC,OAAO,GAAO,CACrBtC,CAAU,CAACsD,EAAE,CAAC,OAAO,CAAC,CACtB,IAAI,CAACK,aAAa,CAAC,CAAC,CAEpB,IAAI,CAACJ,iBAAiB,CAAC,IAAI,CAAChB,oBAAoB,CAExD,CAOAgB,iBAAiBA,CAAC1C,CAAG,CAAE,CACnB,IAAI,CAACiD,SAAS,CAAC,IAAI,CAACtD,OAAO,CAAE,CAAEuD,OAAO,GAAO,CAAC,CAAC,CAE/C,IAAI,CAACC,MAAM,CAAC,CACRnD,GAAG,CAAHA,CAAG,CACHE,iBAAiB,CAA6B,CAAC,GAA5B,IAAI,CAACA,iBAAuB,CAAG,EAAE,CAAG,IAAI,CAACA,iBAAiB,CAC7EU,SAAS,CAAE,IAAI,CAAChB,OAAO,CAACgB,SAAS,EAAI,CAAC,CAAC,CACvC0C,YAAY,CAAE,IAAI,CAACD,sBAAsB,CACzCE,WAAW,GAAM,CACjBC,aAAa,GACjB,CAAC,CACL,CAKAV,aAAaA,CAAA,CAAG,CACZ,IAAI,CAAC3C,oBAAoB,CAAG,IAAI,CAACuB,oBAAoB,CACrD,IAAI,CAACyB,MAAM,CAAC,CACRnD,GAAG,CAAE,IAAI,CAAC0B,oBAAoB,CAC9BxB,iBAAiB,CAA6B,CAAC,GAA5B,IAAI,CAACA,iBAAuB,CAAG,EAAE,CAAG,IAAI,CAACA,iBAAiB,CAC7EoD,YAAY,CAAE,IAAI,CAACD,sBACvB,CAAC,CACL,CAOAF,MAAMA,CAAC7B,CAAa,CAAE,CAClBtC,CAAK,CAAC+D,IAAI,CAAC,IAAI,CAACnD,OAAO,CAACU,MAAM,CAACI,KAAK,CAAE+C,MAAM,CAACC,MAAM,CAAC,CAAC,CAAC,CAAEpC,CAAa,CAAC,CAC1E,CAQAc,oBAAoBA,CAACuB,CAAI,CAAEC,CAAY,CAAE,CACjCD,CAAI,CAAC,IAAI,CAAC/D,OAAO,CAACQ,WAAW,CAAC,EAAI,CAACwD,CAAY,GAC/C,IAAI,CAACC,kBAAkB,CAAC,CAAC,CACzBF,CAAI,CAAC,IAAI,CAAC/D,OAAO,CAACQ,WAAW,CAAC,CAACsB,oBAAoB,CAAG,IAAI,CAACA,oBAAoB,CAC/EiC,CAAI,CAAC,IAAI,CAAC/D,OAAO,CAACQ,WAAW,CAAC,CAAC0D,YAAY,CAAGH,CAAI,CAACG,YAAY,CAC/DH,CAAI,CAAC,IAAI,CAAC/D,OAAO,CAACQ,WAAW,CAAC,CAAC2D,gBAAgB,CAAGJ,CAAI,CAACI,gBAAgB,CACvEJ,CAAI,CAAC,IAAI,CAAC/D,OAAO,CAACQ,WAAW,CAAC,CAAC4D,gBAAgB,CAAGL,CAAI,CAAC,IAAI,CAAC/D,OAAO,CAACQ,WAAW,CAAC,CAAC4D,gBAAgB,EAAI,CAAC,CAAC,CACvGL,CAAI,CAAC,IAAI,CAAC/D,OAAO,CAACQ,WAAW,CAAC,CAAC4D,gBAAgB,CAAC7D,oBAAoB,CAAG,IAAI,CAACA,oBAAoB,CAChG,IAAI,CAACQ,YAAY,CAAC,IAAI,CAAChB,OAAO,CAAC,CAC/B,IAAI,CAACsE,MAAM,CAACN,CAAI,CAAC,IAAI,CAAC/D,OAAO,CAACQ,WAAW,CAAC,CAAC,CAEnD,CAOA8D,QAAQA,CAACC,CAAK,CAAE,CACRhF,CAAU,CAACsD,EAAE,CAAC,aAAa,CAAC,EAC5B,KAAK,CAAC2B,SAAS,CAAC,IAAI,CAACzE,OAAO,CAAEwE,CAAK,CAE3C,CAOAlC,iBAAiBA,CAACkC,CAAK,CAAE,CACrB,OAAQA,CAAK,CAACE,GAAG,EACjB,IAAK,KAAK,CACN,IAAI,CAACH,QAAQ,CAACC,CAAK,CAAC,CACpB,MACJ,IAAK,QAAQ,CACT,IAAI,CAACnB,KAAK,CAAC,CAAC,CACZ,MACJ,QAEA,CACJ,CAKAX,oBAAoBA,CAAA,CAAG,CACnB,IAAI,CAAC1B,YAAY,CAAC,IAAI,CAAChB,OAAO,CAClC,CAMA2E,OAAOA,CAAA,CAAG,CACN,KAAK,CAACA,OAAO,CAAC,CAAC,CAEfpF,CAAG,CAAC,OAAO,CAAE,IAAI,CAAC+B,SAAS,CAACC,UAAU,CAAC,CACvChC,CAAG,CAAC,OAAO,CAAE,IAAI,CAAC+B,SAAS,CAACG,WAAW,CAAC,CACxClC,CAAG,CAAC,OAAO,CAAE,IAAI,CAAC+B,SAAS,CAACI,WAAW,CAAC,CACxCnC,CAAG,CAAC,SAAS,CAAE,IAAI,CAACS,OAAO,CAAC,CAC5BX,CAAK,CAACuF,cAAc,CAAC,IAAI,CAAC3E,OAAO,CAACU,MAAM,CAACE,MAAM,CAAE,IAAI,CAAC2B,oBAAoB,CAAE,IAAI,CAAC,CACjFnD,CAAK,CAACuF,cAAc,CAAC,IAAI,CAAC3E,OAAO,CAACU,MAAM,CAACG,OAAO,CAAE,IAAI,CAAC2B,oBAAoB,CAAE,IAAI,CAAC,CAClFpD,CAAK,CAACuF,cAAc,CAAC,IAAI,CAAC3E,OAAO,CAACU,MAAM,CAACK,YAAY,CAAE,IAAI,CAAC0B,oBAAoB,CAAE,IAAI,CAC1F,CACJ,CAAC","ignoreList":[]}