Plugin Directory

Changeset 3468312


Ignore:
Timestamp:
02/24/2026 07:13:55 AM (5 weeks ago)
Author:
alekv
Message:

releasing version 1.57.0

Location:
woocommerce-google-adwords-conversion-tracking-tag/trunk
Files:
16 added
8 deleted
28 edited

Legend:

Unmodified
Added
Removed
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/class-wgact.php

    r3447088 r3468312  
    1212defined( 'ABSPATH' ) || exit;
    1313// Exit if accessed directly
     14use SweetCode\Pixel_Manager\Abilities;
    1415use SweetCode\Pixel_Manager\Admin\Admin;
    1516use SweetCode\Pixel_Manager\Admin\Admin_REST;
     
    2021use SweetCode\Pixel_Manager\Admin\Notifications\Notifications;
    2122use SweetCode\Pixel_Manager\Admin\Order_Columns;
     23use SweetCode\Pixel_Manager\Admin\SSP_REST;
    2224use SweetCode\Pixel_Manager\Deprecated_Filters;
    2325use SweetCode\Pixel_Manager\Helpers;
     
    2628use SweetCode\Pixel_Manager\Pixels\Pixel_Manager;
    2729use SweetCode\Pixel_Manager\Product;
     30use SweetCode\Pixel_Manager\SSP_Purchase_Proxy;
     31use SweetCode\Pixel_Manager\SSP_Sync;
    2832use SweetCode\Pixel_Manager\Shop;
    2933use SweetCode\Pixel_Manager\Admin\Ask_For_Rating;
     
    6266            wp_unschedule_event( $timestamp, 'pmw_tracking_accuracy_analysis' );
    6367        } );
     68        register_deactivation_hook( __FILE__, function () {
     69            if ( class_exists( '\\SweetCode\\Pixel_Manager\\Pixels\\Google\\GTG_Proxy' ) ) {
     70                \SweetCode\Pixel_Manager\Pixels\Google\GTG_Proxy::unschedule_config_refresh();
     71            }
     72        } );
    6473        Deprecated_Filters::load_deprecated_filters();
    6574        if ( Environment::is_woocommerce_active() ) {
     
    297306        }
    298307        Deprecated_Filters::load_deprecated_filters();
     308        // Register abilities with the WordPress Abilities API (WP 6.9+)
     309        Abilities::init();
    299310        // inject pixels into front end
    300311        $this->inject_pixels();
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/css/admin.css

    r3447088 r3468312  
    320320}
    321321
     322/* Modern opportunity card styling (matching trial/rating notifications) */
     323.pmw .opportunity-card-modern {
     324    background-color: #ffffff;
     325    border-radius: 0;
     326    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
     327}
     328
     329.pmw .opportunity-card-modern.dismissed {
     330    opacity: 0.6;
     331}
     332
    322333.pmw .opportunity-card,
    323334.pmw .notification-card {
     
    395406.pmw .opportunity-card-top-impact-level.impact-high,
    396407.pmw .notification-card-top-impact-level.impact-high {
    397     background: #fde8e8;
    398     border-color: #f56565;
    399     color: #c53030;
     408    background: #f3e8ff;
     409    border-color: #8b5cf6;
     410    color: #5b21b6;
    400411}
    401412
    402413.pmw .opportunity-card-top-impact-level.impact-medium,
    403414.pmw .notification-card-top-impact-level.impact-medium {
    404     background: #fef3c7;
    405     border-color: #f6ad55;
    406     color: #c05621;
     415    background: #dbeafe;
     416    border-color: #3b82f6;
     417    color: #1e40af;
    407418}
    408419
    409420.pmw .opportunity-card-top-impact-level.impact-low,
    410421.pmw .notification-card-top-impact-level.impact-low {
    411     background: #e6fffa;
    412     border-color: #48bb78;
    413     color: #276749;
     422    background: #ccfbf1;
     423    border-color: #14b8a6;
     424    color: #0f766e;
    414425}
    415426
     
    533544
    534545.pmw .pmw-stat-card.impact-high {
    535     background: #fde8e8;
    536     border-color: #f56565;
     546    background: #f3e8ff;
     547    border-color: #8b5cf6;
    537548}
    538549
    539550.pmw .pmw-stat-card.impact-high .pmw-stat-card-count {
    540     color: #c53030;
     551    color: #5b21b6;
    541552}
    542553
    543554.pmw .pmw-stat-card.impact-high .pmw-stat-card-label {
    544     color: #c53030;
     555    color: #5b21b6;
    545556}
    546557
    547558.pmw .pmw-stat-card.impact-medium {
    548     background: #fef3c7;
    549     border-color: #f6ad55;
     559    background: #dbeafe;
     560    border-color: #3b82f6;
    550561}
    551562
    552563.pmw .pmw-stat-card.impact-medium .pmw-stat-card-count {
    553     color: #c05621;
     564    color: #1e40af;
    554565}
    555566
    556567.pmw .pmw-stat-card.impact-medium .pmw-stat-card-label {
    557     color: #c05621;
     568    color: #1e40af;
    558569}
    559570
    560571.pmw .pmw-stat-card.impact-low {
    561     background: #e6fffa;
    562     border-color: #48bb78;
     572    background: #ccfbf1;
     573    border-color: #14b8a6;
    563574}
    564575
    565576.pmw .pmw-stat-card.impact-low .pmw-stat-card-count {
    566     color: #276749;
     577    color: #0f766e;
    567578}
    568579
    569580.pmw .pmw-stat-card.impact-low .pmw-stat-card-label {
    570     color: #276749;
     581    color: #0f766e;
    571582}
    572583
     
    11881199    font-size: 13px;
    11891200}
     1201
     1202/* ─── SSE (Server-Side Events) Tab ──────────────────────── */
     1203
     1204.pmw-sse-card {
     1205    background: #fff;
     1206    border: 1px solid #e0e0e0;
     1207    border-radius: 8px;
     1208    padding: 20px 24px;
     1209    margin-bottom: 20px;
     1210    max-width: 800px;
     1211}
     1212
     1213.pmw-sse-card > h3 {
     1214    margin-top: 0;
     1215    margin-bottom: 4px;
     1216    font-size: 15px;
     1217}
     1218
     1219.pmw-sse-card-description {
     1220    color: #666;
     1221    font-size: 13px;
     1222    line-height: 1.5;
     1223    margin-top: 0;
     1224    margin-bottom: 12px;
     1225}
     1226
     1227.pmw-sse-card .form-table {
     1228    margin-top: 0;
     1229}
     1230
     1231/* ─── SSP (Server-Side Proxy) Section ─────────────────── */
     1232
     1233.pmw-ssp-container > .pmw-section-description {
     1234    color: #555;
     1235    font-size: 14px;
     1236    line-height: 1.6;
     1237    margin-bottom: 24px;
     1238}
     1239
     1240/* Setup wizard steps */
     1241.pmw-ssp-steps {
     1242    display: flex;
     1243    flex-direction: column;
     1244    gap: 0;
     1245    position: relative;
     1246    padding-left: 0;
     1247}
     1248
     1249.pmw-ssp-step {
     1250    display: flex;
     1251    align-items: flex-start;
     1252    gap: 14px;
     1253    padding: 12px 0;
     1254    position: relative;
     1255}
     1256
     1257.pmw-ssp-step:not(:last-child)::after {
     1258    content: '';
     1259    position: absolute;
     1260    left: 15px;
     1261    top: 40px;
     1262    bottom: -4px;
     1263    width: 2px;
     1264    background-color: #ddd;
     1265}
     1266
     1267.pmw-ssp-step.completed:not(:last-child)::after {
     1268    background-color: #2e7d32;
     1269}
     1270
     1271.pmw-ssp-step-indicator {
     1272    flex-shrink: 0;
     1273    width: 32px;
     1274    height: 32px;
     1275    border-radius: 50%;
     1276    display: flex;
     1277    align-items: center;
     1278    justify-content: center;
     1279    font-size: 14px;
     1280    font-weight: 600;
     1281    border: 2px solid #ddd;
     1282    color: #999;
     1283    background: #fff;
     1284    position: relative;
     1285    z-index: 1;
     1286}
     1287
     1288.pmw-ssp-step.completed .pmw-ssp-step-indicator {
     1289    background: #2e7d32;
     1290    border-color: #2e7d32;
     1291    color: #fff;
     1292}
     1293
     1294.pmw-ssp-step.current .pmw-ssp-step-indicator {
     1295    border-color: #0073aa;
     1296    color: #0073aa;
     1297    background: #f0f6fc;
     1298}
     1299
     1300.pmw-ssp-step-content {
     1301    flex: 1;
     1302    padding-top: 4px;
     1303}
     1304
     1305.pmw-ssp-step-content strong {
     1306    display: block;
     1307    font-size: 14px;
     1308    margin-bottom: 2px;
     1309}
     1310
     1311.pmw-ssp-step-content p {
     1312    margin: 0;
     1313    color: #666;
     1314    font-size: 13px;
     1315}
     1316
     1317.pmw-ssp-step.pending .pmw-ssp-step-content strong,
     1318.pmw-ssp-step.pending .pmw-ssp-step-content p {
     1319    color: #bbb;
     1320}
     1321
     1322/* Status badges */
     1323.pmw-ssp-badge {
     1324    display: inline-flex;
     1325    align-items: center;
     1326    padding: 3px 10px;
     1327    border-radius: 20px;
     1328    font-size: 12px;
     1329    font-weight: 600;
     1330    line-height: 1.4;
     1331}
     1332
     1333.pmw-ssp-badge--active,
     1334.pmw-ssp-badge--synced {
     1335    background-color: #e6fffa;
     1336    border: 1px solid #81c784;
     1337    color: #2e7d32;
     1338}
     1339
     1340.pmw-ssp-badge--pending_dns,
     1341.pmw-ssp-badge--waiting_config {
     1342    background-color: #fef3c7;
     1343    border: 1px solid #f59e0b;
     1344    color: #92400e;
     1345}
     1346
     1347.pmw-ssp-badge--disabled,
     1348.pmw-ssp-badge--deleted,
     1349.pmw-ssp-badge--sync_error,
     1350.pmw-ssp-badge--inactive {
     1351    background-color: #fde8e8;
     1352    border: 1px solid #f56565;
     1353    color: #c53030;
     1354}
     1355
     1356.pmw-ssp-badge--unknown {
     1357    background-color: #f8f8f8;
     1358    border: 1px solid #e0e0e0;
     1359    color: #626262;
     1360}
     1361
     1362/* Compact status table rows */
     1363.pmw-ssp-status-section .form-table th,
     1364.pmw-ssp-status-section .form-table td {
     1365    padding-top: 6px;
     1366    padding-bottom: 6px;
     1367    line-height: 1.6;
     1368    vertical-align: middle;
     1369}
     1370
     1371.pmw-ssp-error-text {
     1372    color: #c53030;
     1373    font-size: 13px;
     1374}
     1375
     1376/* SSP action buttons result messages */
     1377.pmw-ssp-msg-success {
     1378    color: #2e7d32;
     1379    font-weight: 500;
     1380}
     1381
     1382.pmw-ssp-msg-error {
     1383    color: #c53030;
     1384    font-weight: 500;
     1385}
     1386
     1387.pmw-ssp-msg-loading {
     1388    color: #666;
     1389    font-style: italic;
     1390}
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/freemius-loader.php

    r3447088 r3468312  
    7373        wpm_fs()->add_filter( 'after_connect_url', 'pmw_fs_settings_url' );
    7474        wpm_fs()->add_filter( 'after_pending_connect_url', 'pmw_fs_settings_url' );
     75        wpm_fs()->add_filter( 'show_deactivation_subscription_cancellation', '__return_false' );
    7576    }
    7677    // Run the PMW loader
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/class-admin-rest.php

    r3449154 r3468312  
    3535
    3636    public function register_routes() {
     37
     38        $this->register_settings_save_route();
    3739
    3840        register_rest_route(self::$rest_namespace, '/notifications/', [
     
    325327        ]);
    326328    }
     329
     330    /**
     331     * Register the REST route for saving all settings (PMW + add-ons) via AJAX.
     332     *
     333     * Replaces the WordPress Settings API form POST to options.php with a REST
     334     * endpoint so that both PMW core and add-on settings can be saved in a single
     335     * request, each to their own wp_options row.
     336     *
     337     * @since 1.57.0
     338     */
     339    private function register_settings_save_route() {
     340        register_rest_route(self::$rest_namespace, '/options/save', [
     341            'methods'             => 'POST',
     342            'callback'            => [ $this, 'handle_settings_save' ],
     343            'permission_callback' => [ $this, 'can_current_user_edit_options' ],
     344        ]);
     345    }
     346
     347    /**
     348     * Handle the settings save REST request.
     349     *
     350     * 1. Extracts PMW core options from POST data, runs them through the existing
     351     *    Validations::options_validate() pipeline (sanitize, validate, merge defaults,
     352     *    create backup), and saves to the PMW options record.
     353     * 2. Fires the 'pmw_addon_save_settings' filter so add-on plugins can extract
     354     *    their own prefixed data, validate, and save to their own wp_options rows.
     355     * 3. Returns a JSON response with success/error status and validation messages.
     356     *
     357     * @param \WP_REST_Request $request The REST request containing form-serialized POST data.
     358     *
     359     * @return \WP_REST_Response
     360     *
     361     * @since 1.57.0
     362     */
     363    public function handle_settings_save( $request ) {
     364
     365        // Ensure settings error functions are available (not loaded during REST requests)
     366        if (!function_exists('get_settings_errors')) {
     367            require_once ABSPATH . 'wp-admin/includes/template.php';
     368        }
     369
     370        $body = $request->get_body_params();
     371
     372        $pmw_errors   = [];
     373        $addon_errors = [];
     374
     375        // --- Save PMW core options ---
     376        if (isset($body['wgact_plugin_options']) && is_array($body['wgact_plugin_options'])) {
     377
     378            $input = $body['wgact_plugin_options'];
     379
     380            // Run through the existing validation pipeline.
     381            // This sanitizes, validates per-field, merges non_form_keys,
     382            // sets timestamp, fills defaults, and creates an automatic backup.
     383            $validated = Validations::options_validate($input);
     384
     385            // Collect any settings errors that the validation pipeline added
     386            // (they use add_settings_error() which stores to a global).
     387            $settings_errors = get_settings_errors('wgact_plugin_options');
     388
     389            if (!empty($settings_errors)) {
     390                foreach ($settings_errors as $error) {
     391                    $pmw_errors[] = $error['message'];
     392                }
     393            }
     394
     395            // Save the validated options
     396            update_option(PMW_DB_OPTIONS_NAME, $validated);
     397            Options::invalidate_cache();
     398        }
     399
     400        // --- Let add-ons save their settings ---
     401        /**
     402         * Filter for add-on plugins to process and save their own settings.
     403         *
     404         * Add-ons should:
     405         * 1. Extract their data from $body using their unique key (e.g. $body['pmw_addon_myaddon'])
     406         * 2. Validate and sanitize the data
     407         * 3. Call update_option() with their own option name
     408         * 4. Append any error messages to $addon_results
     409         *
     410         * @param array $addon_results Array of add-on save result arrays, each with 'slug', 'success', 'errors' keys.
     411         * @param array $body          The full POST body params.
     412         *
     413         * @return array Modified addon_results array.
     414         *
     415         * @since 1.57.0
     416         */
     417        $addon_results = apply_filters('pmw_addon_save_settings', [], $body);
     418
     419        // Collect add-on errors
     420        foreach ($addon_results as $result) {
     421            if (!empty($result['errors'])) {
     422                $addon_errors = array_merge($addon_errors, $result['errors']);
     423            }
     424        }
     425
     426        $all_errors = array_merge($pmw_errors, $addon_errors);
     427
     428        if (!empty($all_errors)) {
     429            return new \WP_REST_Response([
     430                'success'       => false,
     431                'message'       => esc_html__('Settings saved with errors.', 'woocommerce-google-adwords-conversion-tracking-tag'),
     432                'errors'        => $all_errors,
     433                'addon_results' => $addon_results,
     434            ], 200);
     435        }
     436
     437        return new \WP_REST_Response([
     438            'success'       => true,
     439            'message'       => esc_html__('Settings saved.', 'woocommerce-google-adwords-conversion-tracking-tag'),
     440            'errors'        => [],
     441            'addon_results' => $addon_results,
     442        ], 200);
     443    }
    327444}
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/class-admin.php

    r3451824 r3468312  
    304304            return;
    305305        }
    306         self::add_section_main();
    307         self::add_section_advanced();
     306        $tabs = self::get_admin_tabs();
     307        foreach ( $tabs as $tab ) {
     308            if ( isset( $tab['add_section_callback'] ) && is_callable( $tab['add_section_callback'] ) ) {
     309                call_user_func( $tab['add_section_callback'] );
     310            }
     311        }
     312    }
     313
     314    /**
     315     * Get the registered admin tabs, sorted by priority.
     316     *
     317     * Add-ons can use the 'pmw_admin_tabs' filter to register their own tabs.
     318     *
     319     * Each tab array should contain:
     320     * - 'slug'                (string) Unique tab identifier
     321     * - 'title'               (string) Display title
     322     * - 'priority'            (int)    Sort order (lower = earlier)
     323     * - 'show_save_button'    (bool)   Whether the save button is shown for this tab
     324     * - 'add_section_callback' (callable) Function that registers the tab's settings sections and fields
     325     * - 'option_name'         (string) Optional. The wp_options key this tab saves to (for add-on tabs)
     326     * - 'sanitize_callback'   (callable) Optional. Validation/sanitize function for add-on tab data
     327     *
     328     * @return array Sorted array of tab configurations.
     329     *
     330     * @since 1.57.0
     331     */
     332    public static function get_admin_tabs() {
     333        $tabs = [[
     334            'slug'                 => 'main',
     335            'priority'             => 10,
     336            'show_save_button'     => true,
     337            'add_section_callback' => [__CLASS__, 'add_section_main'],
     338        ], [
     339            'slug'                 => 'advanced',
     340            'priority'             => 20,
     341            'show_save_button'     => true,
     342            'add_section_callback' => [__CLASS__, 'add_section_advanced'],
     343        ]];
    308344        if ( Environment::is_woocommerce_active() ) {
    309             self::add_section_shop();
    310         }
    311         self::add_section_consent_management();
    312         self::add_section_opportunities();
     345            $tabs[] = [
     346                'slug'                 => 'shop',
     347                'priority'             => 30,
     348                'show_save_button'     => true,
     349                'add_section_callback' => [__CLASS__, 'add_section_shop'],
     350            ];
     351        }
     352        // SSE tab — requires active pro license
     353        if ( Helpers::is_pmw_pro_version_active() || Options::is_pro_version_demo_active() ) {
     354            $tabs[] = [
     355                'slug'                 => 'sse',
     356                'priority'             => 25,
     357                'show_save_button'     => true,
     358                'add_section_callback' => [__CLASS__, 'add_section_sse__premium_only'],
     359            ];
     360        }
     361        $tabs[] = [
     362            'slug'                 => 'consent-management',
     363            'priority'             => 40,
     364            'show_save_button'     => true,
     365            'add_section_callback' => [__CLASS__, 'add_section_consent_management'],
     366        ];
     367        $tabs[] = [
     368            'slug'                 => 'opportunities',
     369            'priority'             => 70,
     370            'show_save_button'     => false,
     371            'add_section_callback' => [__CLASS__, 'add_section_opportunities'],
     372        ];
    313373        if ( Environment::is_woocommerce_active() ) {
    314             self::add_section_diagnostics();
    315         }
    316         self::add_section_support();
    317         self::add_section_logs();
     374            $tabs[] = [
     375                'slug'                 => 'diagnostics',
     376                'priority'             => 80,
     377                'show_save_button'     => false,
     378                'add_section_callback' => [__CLASS__, 'add_section_diagnostics'],
     379            ];
     380        }
     381        $tabs[] = [
     382            'slug'                 => 'support',
     383            'priority'             => 90,
     384            'show_save_button'     => false,
     385            'add_section_callback' => [__CLASS__, 'add_section_support'],
     386        ];
     387        $tabs[] = [
     388            'slug'                 => 'logger',
     389            'priority'             => 100,
     390            'show_save_button'     => true,
     391            'add_section_callback' => [__CLASS__, 'add_section_logs'],
     392        ];
     393        /**
     394         * Filter the admin settings tabs.
     395         *
     396         * Add-ons can use this filter to register their own tabs with custom
     397         * priority, rendering, and save handling.
     398         *
     399         * @param array $tabs Array of tab configuration arrays.
     400         *
     401         * @since 1.57.0
     402         */
     403        $tabs = apply_filters( 'pmw_admin_tabs', $tabs );
     404        // Sort by priority
     405        usort( $tabs, function ( $a, $b ) {
     406            return (( isset( $a['priority'] ) ? $a['priority'] : 50 )) - (( isset( $b['priority'] ) ? $b['priority'] : 50 ));
     407        } );
     408        return $tabs;
    318409    }
    319410
     
    636727                $section_ids['settings_name']
    637728            );
    638             // Add option for tracking PageView events through s2s
    639             add_settings_field(
    640                 'pmw_setting_track_pageview_events_s2s',
    641                 esc_html__( 'Track PageView Events Server-to-Server', 'woocommerce-google-adwords-conversion-tracking-tag' ) . self::html_beta(),
    642                 [__CLASS__, 'html_track_pageview_events_s2s'],
    643                 'wpm_plugin_options_page',
    644                 $section_ids['settings_name']
    645             );
    646729        }
    647730        // add checkbox for maximum compatibility mode
     
    14341517    }
    14351518
     1519    /**
     1520     * Convert an SSP status slug to a human-readable label.
     1521     *
     1522     * @param string $status
     1523     *
     1524     * @return string
     1525     * @since 1.57.0
     1526     */
     1527    private static function ssp_status_label( $status ) {
     1528        $labels = [
     1529            'active'         => __( 'Active', 'woocommerce-google-adwords-conversion-tracking-tag' ),
     1530            'pending_dns'    => __( 'Pending DNS', 'woocommerce-google-adwords-conversion-tracking-tag' ),
     1531            'disabled'       => __( 'Disabled', 'woocommerce-google-adwords-conversion-tracking-tag' ),
     1532            'deleted'        => __( 'Deleted', 'woocommerce-google-adwords-conversion-tracking-tag' ),
     1533            'waiting_config' => __( 'Waiting for Config', 'woocommerce-google-adwords-conversion-tracking-tag' ),
     1534            'synced'         => __( 'Synced', 'woocommerce-google-adwords-conversion-tracking-tag' ),
     1535            'sync_error'     => __( 'Sync Error', 'woocommerce-google-adwords-conversion-tracking-tag' ),
     1536        ];
     1537        return ( isset( $labels[$status] ) ? $labels[$status] : __( 'Unknown', 'woocommerce-google-adwords-conversion-tracking-tag' ) );
     1538    }
     1539
    14361540    public static function add_section_support() {
    14371541        $section_ids = [
     
    14611565    }
    14621566
     1567    /**
     1568     * Render the section marker div with data attributes for JS tab rendering.
     1569     *
     1570     * The priority and show-save-button attributes are looked up from the
     1571     * registered tabs configuration. If no matching tab is found, defaults
     1572     * are used (priority=50, show-save-button=true).
     1573     *
     1574     * @param array $section_ids Section configuration array with 'title', 'slug', and optional 'badge_count'.
     1575     *
     1576     * @since 1.57.0
     1577     */
    14631578    public static function section_generic_opening_div_html( $section_ids ) {
    14641579        $badge_count = ( isset( $section_ids['badge_count'] ) ? $section_ids['badge_count'] : 0 );
    1465         echo '<div class="section" data-section-title="' . esc_js( $section_ids['title'] ) . '" data-section-slug="' . esc_js( $section_ids['slug'] ) . '" data-badge-count="' . esc_attr( $badge_count ) . '"></div>';
     1580        $priority = 50;
     1581        $show_save_button = true;
     1582        // Look up priority and show_save_button from the registered tabs
     1583        $tabs = self::get_admin_tabs();
     1584        foreach ( $tabs as $tab ) {
     1585            if ( $tab['slug'] === $section_ids['slug'] ) {
     1586                $priority = ( isset( $tab['priority'] ) ? $tab['priority'] : 50 );
     1587                $show_save_button = ( isset( $tab['show_save_button'] ) ? $tab['show_save_button'] : true );
     1588                break;
     1589            }
     1590        }
     1591        echo '<div class="section"' . ' data-section-title="' . esc_js( $section_ids['title'] ) . '"' . ' data-section-slug="' . esc_js( $section_ids['slug'] ) . '"' . ' data-badge-count="' . esc_attr( $badge_count ) . '"' . ' data-priority="' . esc_attr( $priority ) . '"' . ' data-show-save-button="' . esc_attr( ( $show_save_button ? '1' : '0' ) ) . '"' . '></div>';
    14661592    }
    14671593
     
    15661692            <h2 class="nav-tab-wrapper"></h2>
    15671693
    1568             <form id="pmw_settings_form" action="options.php" method="post">
    1569 
    1570                 <?php
    1571         settings_fields( 'wpm_plugin_options_group' );
     1694            <form id="pmw_settings_form" method="post">
     1695
     1696                <?php
     1697        // Keep nonce for REST save validation
     1698        wp_nonce_field( 'pmw_settings_save', 'pmw_settings_nonce' );
    15721699        do_settings_sections( 'wpm_plugin_options_page' );
     1700        /**
     1701         * Fires after PMW's own settings sections have been rendered,
     1702         * but before the submit button. Add-on plugins should use
     1703         * this hook to output their settings fields.
     1704         *
     1705         * @since 1.57.0
     1706         */
     1707        do_action( 'pmw_admin_settings_after_sections' );
    15731708        submit_button();
    15741709        self::inject_developer_banner();
     
    51675302
    51685303    /**
     5304     * HTML output for the skip empty S2S events toggle.
     5305     *
     5306     * When enabled, server-side events that contain no destination platform data
     5307     * (e.g., no Facebook, TikTok, Snapchat, etc.) will not be sent to the server.
     5308     *
     5309     * @since 1.57.0
     5310     */
     5311    public static function html_skip_empty_s2s_events() {
     5312        // adding the hidden input is a hack to make WordPress save the option with the value zero,
     5313        // instead of not saving it and remove that array key entirely
     5314        // https://stackoverflow.com/a/1992745/4688612
     5315        ?>
     5316        <label>
     5317            <input type="hidden" value="0" name="wgact_plugin_options[general][skip_empty_s2s_events]">
     5318            <input type="checkbox"
     5319                   id="pmw_setting_skip_empty_s2s_events"
     5320                   name="wgact_plugin_options[general][skip_empty_s2s_events]"
     5321                   value="1"
     5322                <?php
     5323        checked( Options::is_skip_empty_s2s_events_active() );
     5324        ?>
     5325                <?php
     5326        echo esc_html( self::disable_if_demo() );
     5327        ?>
     5328            />
     5329
     5330            <?php
     5331        esc_html_e( 'Skip server-side events with no destination platforms', 'woocommerce-google-adwords-conversion-tracking-tag' );
     5332        ?>
     5333        </label>
     5334        <?php
     5335        self::display_status_icon( Options::is_skip_empty_s2s_events_active(), true, true );
     5336        ?>
     5337        <?php
     5338        self::html_pro_feature();
     5339        ?>
     5340
     5341        <p style="margin-top: 10px">
     5342            <span class="dashicons dashicons-info"></span>
     5343            <?php
     5344        esc_html_e( 'When enabled, events that have no destination platform (e.g., Facebook, TikTok) in their payload will not be sent to the server. This reduces unnecessary load on your WooCommerce server and the Server-Side Proxy. Disable this if you want all events to be sent regardless of whether a platform processes them.', 'woocommerce-google-adwords-conversion-tracking-tag' );
     5345        ?>
     5346        </p>
     5347        <?php
     5348    }
     5349
     5350    /**
     5351     * HTML output for the always send S2S events toggle.
     5352     *
     5353     * When enabled, server-side events are sent to ad platforms even when
     5354     * browser-side pixels haven't loaded (e.g. due to a consent manager).
     5355     * Browser-side tracking remains unaffected.
     5356     *
     5357     * @since 1.57.0
     5358     */
     5359    public static function html_always_send_s2s() {
     5360        // adding the hidden input is a hack to make WordPress save the option with the value zero,
     5361        // instead of not saving it and remove that array key entirely
     5362        // https://stackoverflow.com/a/1992745/4688612
     5363        ?>
     5364        <label>
     5365            <input type="hidden" value="0" name="wgact_plugin_options[general][always_send_s2s]">
     5366            <input type="checkbox"
     5367                   id="pmw_setting_always_send_s2s"
     5368                   name="wgact_plugin_options[general][always_send_s2s]"
     5369                   value="1"
     5370                <?php
     5371        checked( Options::is_always_send_s2s_active() );
     5372        ?>
     5373                <?php
     5374        echo esc_html( self::disable_if_demo() );
     5375        ?>
     5376            />
     5377
     5378            <?php
     5379        esc_html_e( 'Always send server-side events, even when browser-side pixels have not loaded', 'woocommerce-google-adwords-conversion-tracking-tag' );
     5380        ?>
     5381        </label>
     5382        <?php
     5383        self::display_status_icon( Options::is_always_send_s2s_active(), Options::server_2_server_enabled(), true );
     5384        ?>
     5385        <?php
     5386        self::html_pro_feature();
     5387        ?>
     5388
     5389        <?php
     5390        if ( Options::is_always_send_s2s_active() && !Options::server_2_server_enabled() ) {
     5391            ?>
     5392            <p>
     5393                <span class="dashicons dashicons-info"></span>
     5394                <?php
     5395            esc_html_e( 'For this feature to be used, at least one server-to-server feature, like Facebook CAPI must be enabled.', 'woocommerce-google-adwords-conversion-tracking-tag' );
     5396            ?>
     5397            </p>
     5398        <?php
     5399        }
     5400        ?>
     5401        <p style="margin-top: 10px">
     5402            <span class="dashicons dashicons-info"></span>
     5403            <?php
     5404        esc_html_e( 'When enabled, server-side events are sent to ad platforms even when browser-side pixels have not loaded (e.g. due to a consent manager). Browser-side tracking remains unaffected — only server-side events are sent independently. Useful for platforms that support cookieless or limited-data server-side integrations.', 'woocommerce-google-adwords-conversion-tracking-tag' );
     5405        ?>
     5406        </p>
     5407        <?php
     5408    }
     5409
     5410    /**
    51695411     * HTML output for the deprecated functions module toggle.
    51705412     *
     
    58306072
    58316073    private static function html_experiment() {
    5832         return '<div class="pmw-status-icon beta">' . esc_html__( 'experiment', 'woocommerce-google-adwords-conversion-tracking-tag' ) . '</div>';
     6074        return '<div class="pmw-status-icon beta" style="vertical-align: middle; margin-top: -2px">' . esc_html__( 'beta', 'woocommerce-google-adwords-conversion-tracking-tag' ) . '</div>';
    58336075    }
    58346076
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/class-ask-for-rating.php

    r3447088 r3468312  
    9595    public function ask_for_rating_notice() {
    9696
    97         // Don't show if were not an admin
    98         if (!Environment::get_user_edit_capability()) {
     97        // Don't show if the user lacks the required capabilities.
     98        if (!Environment::can_current_user_edit_options()) {
    9999            return;
    100100        }
     
    133133
    134134        // For testing purposes
    135         if (defined('PMW_ALWAYS_AKS_FOR_RATING') && PMW_ALWAYS_AKS_FOR_RATING) {
     135        $force_rating_notice =
     136            ( defined('PMW_ALWAYS_ASK_FOR_RATING') && PMW_ALWAYS_ASK_FOR_RATING )
     137            || ( defined('PMW_ALWAYS_AKS_FOR_RATING') && PMW_ALWAYS_AKS_FOR_RATING );
     138
     139        if ($force_rating_notice) {
    136140            $this->ask_for_rating_notices($conversions_count);
    137141            return;
     
    157161    private function get_default_settings() {
    158162        return [
    159             'conversions_count' => 1,
     163            'conversions_count' => 0,
    160164            'rating_threshold'  => 10,
    161165            'rating_done'       => false,
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/class-environment.php

    r3451824 r3468312  
    647647    public static function is_cookieyes_active() {
    648648        return is_plugin_active('cookie-law-info/cookie-law-info.php');
     649    }
     650
     651    /**
     652     * Check if Google Automated Discounts for WooCommerce (GADWC) is active.
     653     *
     654     * Checks constant, class, and all known plugin basenames across distributions
     655     * (Freemius free, Freemius premium, WooCommerce Marketplace).
     656     *
     657     * @return bool
     658     * @since 1.57.0
     659     */
     660    public static function is_gadwc_active() {
     661        return defined('SGADWC_CURRENT_VERSION')
     662            || class_exists('SGADWC')
     663            || is_plugin_active('sgadwc/sgadwc.php')
     664            || is_plugin_active('sgadwc-premium/sgadwc.php')
     665            || is_plugin_active('google-automated-discounts-pro-for-woocommerce/google-automated-discounts-pro-for-woocommerce.php');
     666    }
     667
     668    /**
     669     * Check if Google Customer Reviews for WooCommerce (GCR) is active.
     670     *
     671     * Checks constant, class, and all known plugin basenames across distributions
     672     * (Freemius free, Freemius premium).
     673     *
     674     * @return bool
     675     * @since 1.57.0
     676     */
     677    public static function is_gcr_active() {
     678        return defined('GCR_CURRENT_VERSION')
     679            || class_exists('GCR')
     680            || is_plugin_active('google-customer-reviews-for-woocommerce/google-customer-reviews-for-woocommerce.php')
     681            || is_plugin_active('google-customer-reviews-for-woocommerce-premium/google-customer-reviews-for-woocommerce.php');
    649682    }
    650683
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/class-validations.php

    r3451824 r3468312  
    912912                ],
    913913            ],
     914            'ssp'        => isset(Options::get_options()['ssp']) ? Options::get_options()['ssp'] : [],
    914915        ];
    915916
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/notifications/class-notifications.php

    r3447088 r3468312  
    330330                    <!-- Settings Link end -->
    331331
     332                    <!-- Portal Link -->
     333                    <?php
     334        if ( isset( $notification_data['portal_link'] ) ) {
     335            ?>
     336                        <a class="notification-card-button-link"
     337                           href="<?php
     338            echo esc_html( $notification_data['portal_link'] );
     339            ?>"
     340                           target="_blank"
     341                        >
     342                            <div class="notification-card-bottom-button">
     343                                <?php
     344            esc_html_e( 'SSP Portal', 'woocommerce-google-adwords-conversion-tracking-tag' );
     345            ?>
     346                            </div>
     347                        </a>
     348                    <?php
     349        }
     350        ?>
     351                    <!-- Portal Link end -->
     352
    332353                </div>
    333354                <!-- bottom end -->
     
    379400        if ( $counts_by_impact['high'] > 0 ) {
    380401            ?>
    381                         <span class="pmw-opportunity-badge pmw-opportunity-badge-high" style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #fde8e8; border: 1px solid #f56565; color: #c53030;">
    382                             <span style="background: #fff; padding: 0 6px; border-radius: 3px; margin-right: 6px; font-size: 12px; font-family: 'Courier New', Courier, monospace; border: 1px solid #f56565; min-width: 12px; height: 18px; display: inline-flex; align-items: center; justify-content: center;"><?php
     402                        <span class="pmw-opportunity-badge pmw-opportunity-badge-high" style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #f3e8ff; border: 1px solid #8b5cf6; color: #5b21b6;">
     403                            <span style="background: #fff; padding: 0 6px; border-radius: 3px; margin-right: 6px; font-size: 12px; font-family: 'Courier New', Courier, monospace; border: 1px solid #8b5cf6; min-width: 12px; height: 18px; display: inline-flex; align-items: center; justify-content: center;"><?php
    383404            echo esc_html( $counts_by_impact['high'] );
    384405            ?></span>
     
    394415        if ( $counts_by_impact['medium'] > 0 ) {
    395416            ?>
    396                         <span class="pmw-opportunity-badge pmw-opportunity-badge-medium" style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #fef3c7; border: 1px solid #f6ad55; color: #c05621;">
    397                             <span style="background: #fff; padding: 0 6px; border-radius: 3px; margin-right: 6px; font-size: 12px; font-family: 'Courier New', Courier, monospace; border: 1px solid #f6ad55; min-width: 12px; height: 18px; display: inline-flex; align-items: center; justify-content: center;"><?php
     417                        <span class="pmw-opportunity-badge pmw-opportunity-badge-medium" style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #dbeafe; border: 1px solid #3b82f6; color: #1e40af;">
     418                            <span style="background: #fff; padding: 0 6px; border-radius: 3px; margin-right: 6px; font-size: 12px; font-family: 'Courier New', Courier, monospace; border: 1px solid #3b82f6; min-width: 12px; height: 18px; display: inline-flex; align-items: center; justify-content: center;"><?php
    398419            echo esc_html( $counts_by_impact['medium'] );
    399420            ?></span>
     
    409430        if ( $counts_by_impact['low'] > 0 ) {
    410431            ?>
    411                         <span class="pmw-opportunity-badge pmw-opportunity-badge-low" style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #e6fffa; border: 1px solid #48bb78; color: #276749;">
    412                             <span style="background: #fff; padding: 0 6px; border-radius: 3px; margin-right: 6px; font-size: 12px; font-family: 'Courier New', Courier, monospace; border: 1px solid #48bb78; min-width: 12px; height: 18px; display: inline-flex; align-items: center; justify-content: center;"><?php
     432                        <span class="pmw-opportunity-badge pmw-opportunity-badge-low" style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #ccfbf1; border: 1px solid #14b8a6; color: #0f766e;">
     433                            <span style="background: #fff; padding: 0 6px; border-radius: 3px; margin-right: 6px; font-size: 12px; font-family: 'Courier New', Courier, monospace; border: 1px solid #14b8a6; min-width: 12px; height: 18px; display: inline-flex; align-items: center; justify-content: center;"><?php
    413434            echo esc_html( $counts_by_impact['low'] );
    414435            ?></span>
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/notifications/class-trial-promotion-notification.php

    r3447088 r3468312  
    188188
    189189                <div style="display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px;">
    190                     <span style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #e6fffa; border: 1px solid #48bb78; color: #276749;">
     190                    <span style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #ccfbf1; border: 1px solid #14b8a6; color: #0f766e;">
    191191                        <span class="dashicons dashicons-yes-alt" style="font-size: 14px; width: 14px; height: 14px; margin-right: 4px;"></span>
    192192                        <?php esc_html_e('Server-side APIs (CAPI)', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
    193193                    </span>
    194                     <span style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #e6fffa; border: 1px solid #48bb78; color: #276749;">
     194                    <span style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #ccfbf1; border: 1px solid #14b8a6; color: #0f766e;">
    195195                        <span class="dashicons dashicons-yes-alt" style="font-size: 14px; width: 14px; height: 14px; margin-right: 4px;"></span>
    196196                        <?php esc_html_e('Enhanced Conversions', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
    197197                    </span>
    198                     <span style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #e6fffa; border: 1px solid #48bb78; color: #276749;">
     198                    <span style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #ccfbf1; border: 1px solid #14b8a6; color: #0f766e;">
    199199                        <span class="dashicons dashicons-yes-alt" style="font-size: 14px; width: 14px; height: 14px; margin-right: 4px;"></span>
    200200                        <?php esc_html_e('10+ Ad Platforms', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
    201201                    </span>
    202                     <span style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #e6fffa; border: 1px solid #48bb78; color: #276749;">
     202                    <span style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500; background: #ccfbf1; border: 1px solid #14b8a6; color: #0f766e;">
    203203                        <span class="dashicons dashicons-yes-alt" style="font-size: 14px; width: 14px; height: 14px; margin-right: 4px;"></span>
    204204                        <?php esc_html_e('Refund Tracking', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/admin/opportunities/class-opportunities.php

    r3447088 r3468312  
    148148    }
    149149
     150    /**
     151     * Get emoji based on impact level.
     152     *
     153     * @param string $impact The impact level (high, medium, low).
     154     * @return string The corresponding emoji.
     155     * @since 1.56.0
     156     */
     157    private static function get_impact_emoji( $impact ) {
     158        $impact_lower = strtolower($impact);
     159
     160        switch ($impact_lower) {
     161            case 'high':
     162                return '🚀';
     163            case 'medium':
     164                return '📈';
     165            case 'low':
     166                return '💡';
     167            default:
     168                return '💡';
     169        }
     170    }
     171
     172    /**
     173     * Get border color based on impact level.
     174     *
     175     * @param string $impact The impact level (high, medium, low).
     176     * @return string The corresponding hex color.
     177     * @since 1.56.0
     178     */
     179    private static function get_impact_border_color( $impact ) {
     180        $impact_lower = strtolower($impact);
     181
     182        switch ($impact_lower) {
     183            case 'high':
     184                return '#8b5cf6';
     185            case 'medium':
     186                return '#3b82f6';
     187            case 'low':
     188                return '#14b8a6';
     189            default:
     190                return '#2271b1';
     191        }
     192    }
     193
    150194    public static function card_html( $card_data, $custom_middle_html = null ) {
    151195
    152         $main_card_classes = [
    153             'opportunity-card',
    154         ];
    155 
    156         if ($card_data['dismissed']) {
    157             $main_card_classes[] = 'dismissed';
    158         }
     196        $is_dismissed      = !empty($card_data['dismissed']);
     197        $impact            = isset($card_data['impact']) ? $card_data['impact'] : 'low';
     198        $impact_lower      = strtolower($impact);
     199        $emoji             = self::get_impact_emoji($impact);
     200        $border_color      = self::get_impact_border_color($impact);
     201        $dismissed_opacity = $is_dismissed ? 'opacity: 0.7;' : '';
    159202
    160203        ?>
    161204        <div class="pmw">
    162             <div id="pmw-opportunity-<?php echo esc_html($card_data['id']); ?>"
    163                  class="<?php echo esc_html(implode(' ', $main_card_classes)); ?>"
    164             >
    165                 <!-- top -->
    166                 <div class="opportunity-card-top">
    167                     <div><b><?php echo esc_html($card_data['title']); ?></b></div>
    168                     <div class="opportunity-card-top-right">
    169                         <div class="opportunity-card-top-impact">
    170                             <?php esc_html_e('Impact', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>:
    171                         </div>
    172                         <div class="opportunity-card-top-impact-level impact-<?php echo esc_attr(strtolower($card_data['impact'])); ?>">
    173                             <?php echo esc_html($card_data['impact']); ?>
    174                         </div>
    175                     </div>
     205            <div id="pmw-opportunity-<?php echo esc_attr($card_data['id']); ?>"
     206                 class="notice notice-info inline opportunity-card-modern <?php echo $is_dismissed ? 'dismissed' : ''; ?>"
     207                 style="padding: 0; display: flex; flex-direction: column; border-left-color: <?php echo esc_attr($border_color); ?>; margin: 10px 0; border-radius: 5px; <?php echo esc_attr($dismissed_opacity); ?>">
     208
     209                <!-- Top: Title and Impact Badge -->
     210                <div style="display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 8px; padding: 12px 16px;">
     211                    <strong style="font-size: 14px; color: #1e1e1e;">
     212                        <?php echo esc_html($emoji); ?> <?php echo esc_html($card_data['title']); ?>
     213                    </strong>
     214                    <!-- Impact badge -->
     215                    <span class="opportunity-card-top-impact-level impact-<?php echo esc_attr($impact_lower); ?>"
     216                          style="display: inline-flex; align-items: center; padding: 4px 10px; border-radius: 3px; font-size: 12px; font-weight: 500;">
     217                        <?php
     218                        /* translators: %s: the impact level (High, Medium, Low) */
     219                        printf(esc_html__('Impact: %s', 'woocommerce-google-adwords-conversion-tracking-tag'), esc_html(ucfirst($impact)));
     220                        ?>
     221                    </span>
    176222                </div>
    177223
    178                 <hr class="opportunity-card-hr">
    179 
    180                 <!-- middle -->
    181                 <div class="opportunity-card-middle">
    182 
     224                <hr style="margin: 0; border: none; border-top: 1px solid #ddd;">
     225
     226                <!-- Middle: Description -->
     227                <div style="padding: 12px 16px; color: #444; line-height: 1.5;">
    183228                    <?php if (!empty($custom_middle_html)) : ?>
    184                         <?php echo esc_html($custom_middle_html); ?>
     229                        <?php echo wp_kses_post($custom_middle_html); ?>
    185230                    <?php else : ?>
    186                         <?php foreach ($card_data['description'] as $description) : ?>
    187                             <p class="opportunity-card-description">
    188                                 <?php echo wp_kses_post($description); ?>
    189                             </p>
     231                        <?php foreach ($card_data['description'] as $index => $description) : ?>
     232                            <span><?php echo wp_kses_post($description); ?></span>
     233                            <?php if ($index < count($card_data['description']) - 1) : ?>
     234                                <br><br>
     235                            <?php endif; ?>
    190236                        <?php endforeach; ?>
    191237                    <?php endif; ?>
    192 
    193238                </div>
    194239
    195                 <hr class="opportunity-card-hr">
    196 
    197                 <!-- bottom -->
    198                 <div class="opportunity-card-bottom">
    199 
     240                <hr style="margin: 0; border: none; border-top: 1px solid #ddd;">
     241
     242                <!-- Bottom: Action buttons (aligned right) -->
     243                <div style="display: flex; align-items: center; justify-content: flex-end; gap: 10px; flex-wrap: wrap; padding: 12px 16px;">
    200244                    <?php if (isset($card_data['setup_video'])) : ?>
    201                         <!-- Video Link-->
    202                         <div>
    203                             <script>
    204                                 var script   = document.createElement("script");
    205                                 script.async = true;
    206                                 script.src   = 'https://fast.wistia.com/embed/medias/<?php echo esc_html($card_data['setup_video']); ?>.jsonp';
    207                                 document.getElementsByTagName("head")[0].appendChild(script);
    208                             </script>
    209 
    210                             <div class="opportunities wistia_embed wistia_async_<?php echo esc_html($card_data['setup_video']); ?> popover=true popoverContent=link videoFoam=false"
    211                                  style="display:inline-block;height:123;position:relative;width:150;text-decoration: none; vertical-align: top;">
    212                                 <span class="dashicons dashicons-video-alt3" style="font-size: 36px"></span>
    213                             </div>
     245                        <!-- Video Link -->
     246                        <script>
     247                            var script   = document.createElement("script");
     248                            script.async = true;
     249                            script.src   = 'https://fast.wistia.com/embed/medias/<?php echo esc_attr($card_data['setup_video']); ?>.jsonp';
     250                            document.getElementsByTagName("head")[0].appendChild(script);
     251                        </script>
     252                        <div class="opportunities wistia_embed wistia_async_<?php echo esc_attr($card_data['setup_video']); ?> popover=true popoverContent=link videoFoam=false"
     253                             style="display: inline-flex; align-items: center; text-decoration: none; cursor: pointer;">
     254                            <span class="dashicons dashicons-video-alt3" style="font-size: 20px; width: 20px; height: 20px; margin-right: 4px;"></span>
     255                            <span style="color: #2271b1;"><?php esc_html_e('Watch Video', 'woocommerce-google-adwords-conversion-tracking-tag'); ?></span>
    214256                        </div>
    215257                    <?php endif; ?>
    216258
    217259                    <?php if (isset($card_data['setup_link'])) : ?>
    218                         <!-- Setup Link-->
    219                         <a class="opportunity-card-button-link"
    220                            href="<?php echo esc_html($card_data['setup_link']); ?>"
     260                        <!-- Setup Link -->
     261                        <a href="<?php echo esc_url($card_data['setup_link']); ?>"
    221262                           target="_blank"
    222                         >
    223                             <div class="opportunity-card-bottom-button">
    224                                 <?php esc_html_e('Setup', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
     263                           style="text-decoration: none; box-shadow: none;">
     264                            <div class="button button-primary" style="margin: 0;">
     265                                <?php esc_html_e('Setup', 'woocommerce-google-adwords-conversion-tracking-tag'); ?> ⚙️
    225266                            </div>
    226267                        </a>
     
    230271                        <?php foreach ($card_data['custom_buttons'] as $button) : ?>
    231272                            <!-- Custom Button -->
    232                             <a class="opportunity-card-button-link <?php echo isset($button['class']) ? esc_attr($button['class']) : ''; ?>"
     273                            <a class="<?php echo isset($button['class']) ? esc_attr($button['class']) : ''; ?>"
    233274                               href="<?php echo isset($button['url']) ? esc_url($button['url']) : '#'; ?>"
    234275                                <?php if (isset($button['target'])) : ?>
     
    240281                                    <?php endforeach; ?>
    241282                                <?php endif; ?>
    242                             >
    243                                 <div class="opportunity-card-bottom-button">
     283                               style="text-decoration: none; box-shadow: none;">
     284                                <div class="button" style="margin: 0;">
    244285                                    <?php echo esc_html($button['label']); ?>
    245286                                </div>
     
    248289                    <?php endif; ?>
    249290
    250 
    251291                    <?php if (isset($card_data['learn_more_link'])) : ?>
    252                         <!-- Learn More Link-->
    253                         <a class="opportunity-card-button-link"
    254                            href="<?php echo esc_html($card_data['learn_more_link']); ?>"
     292                        <!-- Learn More Link -->
     293                        <a href="<?php echo esc_url($card_data['learn_more_link']); ?>"
    255294                           target="_blank"
    256                         >
    257                             <div class="opportunity-card-bottom-button">
     295                           style="text-decoration: none; box-shadow: none;">
     296                            <div class="button" style="margin: 0;">
    258297                                <?php esc_html_e('Learn more', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
    259298                            </div>
     
    261300                    <?php endif; ?>
    262301
    263                     <?php if (empty($card_data['dismissed'])) : ?>
    264                         <!-- Dismiss Link-->
    265                         <a class="opportunity-card-button-link"
    266                            href="#"
    267                         >
    268                             <div class="opportunity-dismiss opportunity-card-bottom-button"
    269                                  data-opportunity-id="<?php echo esc_html($card_data['id']); ?>">
    270                                 <?php esc_html_e('Dismiss', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
    271                             </div>
    272                         </a>
     302                    <?php if (!$is_dismissed) : ?>
     303                        <!-- Dismiss Link -->
     304                        <div class="button opportunity-dismiss"
     305                             style="margin: 0;"
     306                             data-opportunity-id="<?php echo esc_attr($card_data['id']); ?>">
     307                            <?php esc_html_e('Dismiss', 'woocommerce-google-adwords-conversion-tracking-tag'); ?>
     308                        </div>
    273309                    <?php endif; ?>
    274310                </div>
    275311            </div>
    276312        </div>
    277 
    278313        <?php
    279314    }
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/class-options.php

    r3451824 r3468312  
    270270                ],
    271271                'pageview_events_s2s'        => false,
     272                'skip_empty_s2s_events'      => true,
     273                'always_send_s2s'            => false,
    272274                'modules'                    => [
    273275                    'load_deprecated_functions' => true,
    274276                ],
     277            ],
     278            'ssp'        => [
     279                'sync_token'              => '',
     280                'enabled'                 => false,
     281                'proxy_hostname'          => '',
     282                'domain_id'               => '',
     283                'routing_status'          => '',
     284                'config_status'           => '',
     285                'last_sync_at'            => 0,
     286                'last_sync_error'         => '',
     287                'resync_callback_token'   => '',
     288                'verification_key'        => '',
     289                'proxy_failure_behavior'  => 'fallback_to_wc', // 'fallback_to_wc' | 'drop_events'
     290                'plan_name'               => '',
     291                'subscription_status'     => '',
     292                'usage_percent'           => 0,
     293                'monthly_request_limit'   => 0,
     294                'billable_this_period'    => 0,
     295                'quota_exceeded'          => false,
    275296            ],
    276297            'db_version' => PMW_DB_VERSION,
     
    955976    public static function is_pageview_events_s2s_active() {
    956977        return (bool) self::get_options_obj()->general->pageview_events_s2s;
     978    }
     979
     980    /**
     981     * Check if empty S2S events should be skipped.
     982     *
     983     * When enabled, server-side events that have no destination platform data
     984     * (e.g., no Facebook, TikTok, etc.) will not be sent to the server,
     985     * reducing unnecessary load.
     986     *
     987     * @return bool
     988     * @since 1.57.0
     989     */
     990    public static function is_skip_empty_s2s_events_active() {
     991        return (bool) self::get_options_obj()->general->skip_empty_s2s_events;
     992    }
     993
     994    /**
     995     * Check if server-side events should always be sent, even when browser-side pixels haven't loaded.
     996     *
     997     * When enabled, S2S events are sent to ad platforms independently of browser pixel state.
     998     * Browser-side tracking remains unaffected — only server-side events are sent independently.
     999     *
     1000     * @return bool
     1001     * @since 1.57.0
     1002     */
     1003    public static function is_always_send_s2s_active() {
     1004        return (bool) self::get_options_obj()->general->always_send_s2s;
    9571005    }
    9581006
     
    13831431
    13841432    /**
     1433     * Check if purchase events should be routed through the SSP.
     1434     *
     1435     * Currently returns is_ssp_active() — when SSP is active, purchases go through it.
     1436     * Add a toggle here in the future if we want to let users control this separately.
     1437     *
     1438     * @return bool
     1439     * @since 1.57.0
     1440     */
     1441    public static function should_process_purchases_via_ssp() {
     1442        return self::is_ssp_active();
     1443    }
     1444
     1445    /**
     1446     * Get the SSP purchase events URL.
     1447     *
     1448     * Uses the SSP API base (supports PMW_SSP_API_BASE override for local dev)
     1449     * with the /v1/sync/purchase-events path.
     1450     *
     1451     * @return string Full URL for the SSP purchase events endpoint.
     1452     * @since 1.57.0
     1453     */
     1454    public static function get_ssp_purchase_events_url() {
     1455
     1456        $api_base = defined( 'PMW_SSP_API_BASE' ) ? PMW_SSP_API_BASE : 'https://ssp.sweetcode.cloud';
     1457
     1458        return $api_base . '/v1/sync/purchase-events';
     1459    }
     1460
     1461    /**
     1462     * Check if the SSP (Server Side Proxy) is fully active and operational.
     1463     *
     1464     * Returns true only when all conditions are met:
     1465     * - SSP is enabled
     1466     * - A sync token is set
     1467     * - The proxy domain routing is active
     1468     * - Config has been successfully synced
     1469     *
     1470     * @return bool
     1471     * @since 1.57.0
     1472     */
     1473    public static function is_ssp_active() {
     1474        $options = self::get_options();
     1475
     1476        return
     1477            !empty($options['ssp']['enabled'])
     1478            && !empty($options['ssp']['sync_token'])
     1479            && 'active' === ( isset($options['ssp']['routing_status']) ? $options['ssp']['routing_status'] : '' )
     1480            && 'synced' === ( isset($options['ssp']['config_status']) ? $options['ssp']['config_status'] : '' );
     1481    }
     1482
     1483    /**
     1484     * Get the SSP proxy hostname.
     1485     *
     1486     * @return string The proxy hostname (e.g. "ssp.myshop.com")
     1487     * @since 1.57.0
     1488     */
     1489    public static function get_ssp_proxy_hostname() {
     1490        $options = self::get_options();
     1491        return isset($options['ssp']['proxy_hostname']) ? $options['ssp']['proxy_hostname'] : '';
     1492    }
     1493
     1494    /**
     1495     * Get the SSP events URL for the proxy.
     1496     *
     1497     * @return string Full URL for the SSP events endpoint (e.g. "https://ssp.myshop.com/v1/pmw-events")
     1498     * @since 1.57.0
     1499     */
     1500    public static function get_ssp_events_url() {
     1501
     1502        // Allow overriding for local development:
     1503        // define( 'PMW_SSP_EVENTS_URL', 'http://localhost:8787/v1/pmw-events' );
     1504        if ( defined( 'PMW_SSP_EVENTS_URL' ) ) {
     1505            return PMW_SSP_EVENTS_URL;
     1506        }
     1507
     1508        $hostname = self::get_ssp_proxy_hostname();
     1509
     1510        if (empty($hostname)) {
     1511            return '';
     1512        }
     1513
     1514        return 'https://' . $hostname . '/v1/pmw-events';
     1515    }
     1516
     1517    /**
     1518     * Get the SSP sync token.
     1519     *
     1520     * @return string
     1521     * @since 1.57.0
     1522     */
     1523    public static function get_ssp_sync_token() {
     1524        $options = self::get_options();
     1525        return isset($options['ssp']['sync_token']) ? $options['ssp']['sync_token'] : '';
     1526    }
     1527
     1528    /**
     1529     * Get the SSP resync callback token.
     1530     *
     1531     * @return string
     1532     * @since 1.57.0
     1533     */
     1534    public static function get_ssp_resync_callback_token() {
     1535        $options = self::get_options();
     1536        return isset($options['ssp']['resync_callback_token']) ? $options['ssp']['resync_callback_token'] : '';
     1537    }
     1538
     1539    /**
     1540     * Get the SSP pixel verification key.
     1541     *
     1542     * This key is provisioned by the SSP during domain-config sync
     1543     * and used to authenticate proxy requests via X-SSP-Token header.
     1544     *
     1545     * @return string The 64-char hex verification key, or empty string.
     1546     * @since 1.57.0
     1547     */
     1548    public static function get_ssp_verification_key() {
     1549        $options = self::get_options();
     1550        return isset($options['ssp']['verification_key']) ? $options['ssp']['verification_key'] : '';
     1551    }
     1552
     1553    /**
     1554     * Get the SSP proxy failure behavior setting.
     1555     *
     1556     * Determines what happens when the SSP proxy is unreachable:
     1557     * - 'fallback_to_wc': Fall back to PMW's internal WooCommerce event router (default)
     1558     * - 'drop_events': Drop server-side events entirely
     1559     *
     1560     * @return string 'fallback_to_wc' or 'drop_events'
     1561     * @since 1.57.0
     1562     */
     1563    public static function get_ssp_proxy_failure_behavior() {
     1564        $options  = self::get_options();
     1565        $behavior = isset($options['ssp']['proxy_failure_behavior']) ? $options['ssp']['proxy_failure_behavior'] : 'fallback_to_wc';
     1566
     1567        // Validate against allowed values
     1568        if ( ! in_array( $behavior, [ 'fallback_to_wc', 'drop_events' ], true ) ) {
     1569            return 'fallback_to_wc';
     1570        }
     1571
     1572        return $behavior;
     1573    }
     1574
     1575    /**
     1576     * Check if the SSP monthly quota has been exceeded.
     1577     *
     1578     * When true, PMW should stop sending events to the SSP proxy
     1579     * and fall back to WC REST API or drop events per the
     1580     * proxy_failure_behavior setting.
     1581     *
     1582     * @return bool
     1583     * @since 1.57.0
     1584     */
     1585    public static function is_ssp_quota_exceeded() {
     1586        return ! empty( self::get_options()['ssp']['quota_exceeded'] );
     1587    }
     1588
     1589    /**
     1590     * Get or create the SSP session ID for the current visitor.
     1591     *
     1592     * Uses the WooCommerce session to persist a UUID across page loads.
     1593     * The session ID is used for Tier 2 cookie verification.
     1594     *
     1595     * @return string UUID session ID or empty string if no WC session.
     1596     * @since 1.57.0
     1597     */
     1598    public static function get_ssp_session_id() {
     1599
     1600        if ( ! function_exists( 'WC' ) || ! WC()->session ) {
     1601            return '';
     1602        }
     1603
     1604        $session_id = WC()->session->get( 'pmw_ssp_session_id' );
     1605
     1606        if ( empty( $session_id ) ) {
     1607            $session_id = wp_generate_uuid4();
     1608            WC()->session->set( 'pmw_ssp_session_id', $session_id );
     1609        }
     1610
     1611        return $session_id;
     1612    }
     1613
     1614    /**
    13851615     * Get backup retention policy settings.
    13861616     * This method can be overridden or filtered to customize retention behavior.
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/pixels/class-pixel-manager.php

    r3451824 r3468312  
    227227            add_action( 'woocommerce_mini_cart_contents', [$this, 'woocommerce_mini_cart_contents'] );
    228228            add_action( 'woocommerce_new_order', [$this, 'pmw_woocommerce_new_order'] );
     229            add_action(
     230                'woocommerce_order_status_processing',
     231                [$this, 'maybe_increase_conversion_count_for_ratings_on_status'],
     232                10,
     233                1
     234            );
     235            add_action(
     236                'woocommerce_order_status_completed',
     237                [$this, 'maybe_increase_conversion_count_for_ratings_on_status'],
     238                10,
     239                1
     240            );
    229241        }
    230242        /**
     
    320332    }
    321333
    322     // Extracted the code because the QIT semgrep rule was triggered
     334    /**
     335     * Permission callback for REST API routes that require the user to have the capability to edit options.
     336     *
     337     * This function checks if the current user has the 'edit_options' capability, which is typically required
     338     * for managing plugin settings. It is used as a permission callback for protected REST API routes.
     339     *
     340     * Extracted the code because the QIT semgrep rule was triggered
     341     *
     342     * @return bool Returns true if the current user can edit options, false otherwise.
     343     */
    323344    public function can_current_user_edit_options() {
    324345        return Environment::can_current_user_edit_options();
     
    928949        $data['tag_id_suppressed'] = Google_Helpers::get_google_tag_id_information()['suppressed'];
    929950        $data['tag_gateway']['measurement_path'] = Options::get_google_tag_gateway_measurement_path();
    930         // Always include proxy_url for JavaScript detection to use as fallback
    931         // Server-side detection cannot reliably detect Cloudflare because server-to-server
    932         // requests bypass CDN/proxy layers. Let JavaScript detect the handler instead,
    933         // since only the browser can correctly detect whether Cloudflare is intercepting.
     951        // Pass server-detected handler hint to JavaScript for standalone/wordpress cases.
     952        // Server-side detection cannot reliably detect Cloudflare (external) because
     953        // server-to-server requests bypass CDN/proxy layers. For external detection,
     954        // JavaScript must always check via browser request (Priority 1 in detectGtgHandler).
     955        // For standalone/wordpress, the server hint prevents JS from hitting the standalone
     956        // proxy health check — eliminating 503/4xx errors when the standalone proxy is
     957        // unavailable (e.g., on hosts like WP Engine that block direct PHP file access).
    934958        if ( Options::get_google_tag_gateway_measurement_path() ) {
    935             $isolated_url = GTG_Proxy::get_isolated_proxy_url();
    936             if ( $isolated_url ) {
    937                 $data['tag_gateway']['proxy_url'] = $isolated_url;
    938             }
    939             // Don't set handler - let JavaScript detect it via browser request
     959            $handler = GTG_Config::get_handler();
     960            // Only pass handler for standalone/wordpress — never for external
     961            if ( in_array( $handler, ['standalone', 'wordpress'], true ) ) {
     962                $data['tag_gateway']['handler'] = $handler;
     963            }
     964            // Only include proxy_url when the server detected standalone
     965            // When handler is 'wordpress', there's no point sending proxy_url
     966            // since JS would just get a 503/403 trying to use it
     967            if ( 'standalone' === $handler ) {
     968                $isolated_url = GTG_Proxy::get_isolated_proxy_url();
     969                if ( $isolated_url ) {
     970                    $data['tag_gateway']['proxy_url'] = $isolated_url;
     971                }
     972            }
    940973        }
    941974        $data['tcf_support'] = Options::is_google_tcf_support_active();
     
    13041337
    13051338    private function increase_conversion_count_for_ratings( $order ) {
    1306         if ( Shop::can_order_confirmation_be_processed( $order ) ) {
    1307             $ratings = get_option( PMW_DB_RATINGS );
    1308             if ( !isset( $ratings['conversions_count'] ) ) {
    1309                 $ratings['conversions_count'] = 0;
    1310             }
    1311             $ratings['conversions_count'] = $ratings['conversions_count'] + 1;
    1312             update_option( PMW_DB_RATINGS, $ratings );
    1313         } else {
    1314             Shop::conversion_pixels_already_fired_html();
    1315         }
     1339        $this->maybe_increase_conversion_count_for_ratings( $order, true );
     1340    }
     1341
     1342    public function maybe_increase_conversion_count_for_ratings_on_status( $order_id ) {
     1343        if ( !function_exists( 'wc_get_order' ) ) {
     1344            return;
     1345        }
     1346        $order = wc_get_order( $order_id );
     1347        $this->maybe_increase_conversion_count_for_ratings( $order, false );
     1348    }
     1349
     1350    private function maybe_increase_conversion_count_for_ratings( $order, $show_duplicate_notice ) {
     1351        if ( !$order ) {
     1352            return false;
     1353        }
     1354        if ( $this->rating_notice_already_counted( $order ) ) {
     1355            return false;
     1356        }
     1357        if ( !Shop::can_order_confirmation_be_processed( $order ) ) {
     1358            if ( $show_duplicate_notice ) {
     1359                Shop::conversion_pixels_already_fired_html();
     1360            }
     1361            return false;
     1362        }
     1363        $ratings = get_option( PMW_DB_RATINGS );
     1364        if ( !is_array( $ratings ) ) {
     1365            $ratings = [];
     1366        }
     1367        if ( !isset( $ratings['conversions_count'] ) ) {
     1368            $ratings['conversions_count'] = 0;
     1369        }
     1370        $ratings['conversions_count'] = $ratings['conversions_count'] + 1;
     1371        update_option( PMW_DB_RATINGS, $ratings );
     1372        $this->mark_rating_notice_counted( $order );
     1373        return true;
     1374    }
     1375
     1376    private function rating_notice_already_counted( $order ) {
     1377        return $order->meta_exists( '_pmw_rating_notice_counted' );
     1378    }
     1379
     1380    private function mark_rating_notice_counted( $order ) {
     1381        $order->update_meta_data( '_pmw_rating_notice_counted', true );
     1382        $order->save();
    13161383    }
    13171384
     
    15901657            'server_2_server'            => [
    15911658                'active'                      => Options::server_2_server_enabled(),
     1659                'skip_empty_events'           => Options::is_skip_empty_s2s_events_active(),
     1660                'always_send_s2s'             => Options::is_always_send_s2s_active(),
    15921661                'user_agent_exclude_patterns' => apply_filters( 'pmw_exclude_user_agents_from_server_2_server_events', [] ),
    15931662                'ip_exclude_list'             => apply_filters( 'pmw_exclude_ips_from_server_2_server_events', [] ),
     
    15961665                    'pixels'    => Options::pixels_that_require_s2s_pageview_events(),
    15971666                ],
     1667            ],
     1668            'ssp'                        => [
     1669                'active'         => Options::is_ssp_active(),
     1670                'events_url'     => Options::get_ssp_events_url(),
     1671                'fallback_to_wc' => Options::get_ssp_proxy_failure_behavior() === 'fallback_to_wc',
     1672                'token'          => Options::get_ssp_verification_key(),
     1673                'session_id'     => Options::get_ssp_session_id(),
     1674                'quota_exceeded' => Options::is_ssp_quota_exceeded(),
    15981675            ],
    15991676            'consent_management'         => [
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/pixels/google/class-gtg-config.php

    r3451824 r3468312  
    242242        // If config file already exists and is not too old, skip
    243243        if ( file_exists( $config_file ) ) {
    244             // Check if it's not expired (24 hours)
     244            // Check if it's not expired (7 days — matches standalone proxy TTL)
     245            // WP-Cron refreshes every 24h, this is a safety net
    245246            $file_age = time() - filemtime( $config_file );
    246             if ( $file_age < DAY_IN_SECONDS ) {
     247            if ( $file_age < 7 * DAY_IN_SECONDS ) {
    247248                return;
    248249            }
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/pixels/google/class-gtg-proxy.php

    r3451824 r3468312  
    105105
    106106    /**
     107     * WP-Cron hook name for periodic config refresh
     108     *
     109     * @since 1.57.0
     110     */
     111    const CRON_HOOK = 'pmw_gtg_config_refresh';
     112
     113    /**
    107114     * Initialize the proxy - called from Pixel_Manager
    108115     *
     
    122129        // Ensure isolated proxy file exists and is up to date
    123130        add_action('init', [ __CLASS__, 'ensure_isolated_proxy_file' ], 21);
     131
     132        // Schedule periodic config refresh via WP-Cron (every 24 hours)
     133        // This keeps the standalone proxy config fresh without relying on settings saves or plugin updates
     134        self::schedule_config_refresh();
     135
     136        // Register the cron callback
     137        add_action( self::CRON_HOOK, [ __CLASS__, 'update_proxy_config_cache' ] );
     138    }
     139
     140    /**
     141     * Schedule the periodic config refresh cron event
     142     *
     143     * Schedules a daily WP-Cron event to refresh the standalone proxy config.
     144     * The standalone proxy has a 7-day hard TTL as a safety net, but this cron
     145     * keeps the config fresh under normal conditions.
     146     *
     147     * @return void
     148     * @since 1.57.0
     149     */
     150    private static function schedule_config_refresh() {
     151        if ( ! wp_next_scheduled( self::CRON_HOOK ) ) {
     152            wp_schedule_event( time(), 'daily', self::CRON_HOOK );
     153        }
     154    }
     155
     156    /**
     157     * Unschedule the periodic config refresh cron event
     158     *
     159     * Called on plugin deactivation to clean up scheduled events.
     160     *
     161     * @return void
     162     * @since 1.57.0
     163     */
     164    public static function unschedule_config_refresh() {
     165        $timestamp = wp_next_scheduled( self::CRON_HOOK );
     166        if ( $timestamp ) {
     167            wp_unschedule_event( $timestamp, self::CRON_HOOK );
     168        }
    124169    }
    125170
     
    14121457     * Get the GTG config directory path in wp-content/uploads
    14131458     *
     1459     * Uses WP_CONTENT_DIR directly instead of wp_upload_dir() to ensure
     1460     * a consistent, network-wide path on multisite installations.
     1461     * wp_upload_dir() returns site-specific paths on multisite subsites
     1462     * (e.g., wp-content/uploads/sites/2/), but the standalone proxy
     1463     * only looks in wp-content/uploads/pmw-gtg/.
     1464     *
    14141465     * @return string|false Config directory path or false on failure.
    14151466     *
     
    14171468     */
    14181469    public static function get_config_directory() {
    1419         $upload_dir = wp_upload_dir();
    1420         if ( ! isset( $upload_dir['basedir'] ) ) {
    1421             return false;
    1422         }
    1423         return $upload_dir['basedir'] . '/pmw-gtg';
     1470        if ( ! defined( 'WP_CONTENT_DIR' ) ) {
     1471            return false;
     1472        }
     1473        return WP_CONTENT_DIR . '/uploads/pmw-gtg';
    14241474    }
    14251475
     
    15921642     */
    15931643    public static function update_proxy_config_cache() {
    1594         // Get upload directory for logging path reference
    1595         $upload_dir    = wp_upload_dir();
     1644        // Get log directory path using WP_CONTENT_DIR for multisite consistency
     1645        // wp_upload_dir() returns site-specific paths on multisite, but we need
     1646        // a predictable path that the standalone proxy can use
    15961647        $log_directory = '';
    1597         if ( isset( $upload_dir['basedir'] ) ) {
    1598             $log_directory = $upload_dir['basedir'] . '/pmw-logs';
     1648        if ( defined( 'WP_CONTENT_DIR' ) ) {
     1649            $log_directory = WP_CONTENT_DIR . '/uploads/pmw-logs';
    15991650        }
    16001651
     
    16161667            }
    16171668            self::update_site_map( $site_identifier, $config_filename, true );
     1669
     1670            // Also clean up fallback config in plugin directory
     1671            $fallback_config = __DIR__ . '/pmw-gtg-config/' . $config_filename;
     1672            if ( file_exists( $fallback_config ) ) {
     1673                @unlink( $fallback_config );
     1674            }
     1675
    16181676            return true;
    16191677        }
     
    16581716            'log_level'        => $log_level,
    16591717            'log_directory'    => $log_directory,
     1718            'wp_content_dir'   => defined( 'WP_CONTENT_DIR' ) ? WP_CONTENT_DIR : '',
    16601719            'updated'          => time(),
    16611720        ];
     
    17071766        if ( $result ) {
    17081767            self::update_site_map( $site_identifier, $config_filename );
     1768
     1769            // Also write a fallback copy to the plugin directory
     1770            // The standalone proxy can always find __DIR__ reliably, even on hosts
     1771            // with non-standard directory layouts (symlinks, WP Engine, etc.)
     1772            // This is a redundant fallback — the uploads directory is the primary location.
     1773            self::write_fallback_config( $new_config_json, $config_filename, $site_identifier );
    17091774        }
    17101775
    17111776        return $result;
    17121777    }
    1713    
     1778
     1779    /**
     1780     * Write a fallback copy of the config to the plugin directory
     1781     *
     1782     * The standalone proxy (pmw-gtg-proxy.php) lives in the same directory
     1783     * and can always locate __DIR__ reliably, unlike wp-content/uploads/
     1784     * which requires heuristic path discovery that can fail on non-standard hosts.
     1785     *
     1786     * This fallback config is deleted during plugin updates but gets recreated
     1787     * by update_proxy_config_cache() which runs on upgrader_process_complete.
     1788     *
     1789     * @param string $config_json     JSON-encoded config.
     1790     * @param string $config_filename Config filename (e.g., "config-1.json").
     1791     * @param string $site_identifier Site identifier for the site map.
     1792     * @return bool True on success, false on failure.
     1793     *
     1794     * @since 1.57.0
     1795     */
     1796    private static function write_fallback_config( $config_json, $config_filename, $site_identifier ) {
     1797        $fallback_dir = __DIR__ . '/pmw-gtg-config';
     1798
     1799        // Create fallback directory if it doesn't exist
     1800        if ( ! file_exists( $fallback_dir ) ) {
     1801            if ( ! wp_mkdir_p( $fallback_dir ) ) {
     1802                return false;
     1803            }
     1804
     1805            // Security files to prevent direct access to config
     1806            $htaccess_file = $fallback_dir . '/.htaccess';
     1807            if ( ! file_exists( $htaccess_file ) ) {
     1808                file_put_contents( $htaccess_file, "deny from all\n", LOCK_EX );
     1809            }
     1810
     1811            $index_file = $fallback_dir . '/index.php';
     1812            if ( ! file_exists( $index_file ) ) {
     1813                file_put_contents( $index_file, "<?php\n// Silence is golden.\n", LOCK_EX );
     1814            }
     1815        }
     1816
     1817        // Write config file
     1818        $fallback_config_file = $fallback_dir . '/' . $config_filename;
     1819        $temp_file            = $fallback_config_file . '.tmp.' . uniqid();
     1820        $result               = false;
     1821
     1822        if ( false !== file_put_contents( $temp_file, $config_json, LOCK_EX ) ) {
     1823            clearstatcache( true, $temp_file );
     1824            if ( file_exists( $temp_file ) ) {
     1825                // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged -- Silencing rename errors to prevent warnings in edge cases
     1826                $result = @rename( $temp_file, $fallback_config_file );
     1827            }
     1828            clearstatcache( true, $temp_file );
     1829            if ( ! $result && file_exists( $temp_file ) ) {
     1830                @unlink( $temp_file );
     1831            }
     1832        }
     1833
     1834        // Write fallback site map
     1835        if ( $result ) {
     1836            $site_map_file = $fallback_dir . '/site-map.json';
     1837            $site_map      = [];
     1838
     1839            if ( file_exists( $site_map_file ) ) {
     1840                $content = file_get_contents( $site_map_file );
     1841                if ( false !== $content ) {
     1842                    $decoded = json_decode( $content, true );
     1843                    if ( is_array( $decoded ) ) {
     1844                        $site_map = $decoded;
     1845                    }
     1846                }
     1847            }
     1848
     1849            $site_map[ $site_identifier ] = $config_filename;
     1850            $site_map_json                = wp_json_encode( $site_map, JSON_PRETTY_PRINT );
     1851            $temp_file                    = $site_map_file . '.tmp.' . uniqid();
     1852
     1853            if ( false !== file_put_contents( $temp_file, $site_map_json, LOCK_EX ) ) {
     1854                clearstatcache( true, $temp_file );
     1855                if ( file_exists( $temp_file ) ) {
     1856                    // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged
     1857                    @rename( $temp_file, $site_map_file );
     1858                }
     1859                clearstatcache( true, $temp_file );
     1860                if ( file_exists( $temp_file ) ) {
     1861                    @unlink( $temp_file );
     1862                }
     1863            }
     1864        }
     1865
     1866        return $result;
     1867    }
     1868
    17141869    /**
    17151870     * Check if the isolated proxy file exists
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/includes/pixels/google/pmw-gtg-proxy.php

    r3451824 r3468312  
    163163    }
    164164
     165    // Method 4: Fallback to plugin directory config
     166    // The plugin writes a redundant config copy next to this proxy file.
     167    // __DIR__ is always reliable, regardless of hosting configuration
     168    // (symlinks, WP Engine, non-standard layouts, etc.)
     169    $fallback_dir = __DIR__ . '/pmw-gtg-config';
     170    if ( is_dir( $fallback_dir ) ) {
     171        return $fallback_dir;
     172    }
     173
    165174    return false;
    166175}
     
    289298    }
    290299
    291     // Check config age (24 hours max)
    292     if ( ( time() - filemtime( $config_file ) ) >= 86400 ) {
     300    // Check config age (7 days max — safety net for when WP-Cron fails)
     301    // WP-Cron refreshes the config every 24 hours under normal conditions.
     302    // This extended TTL prevents false 503s on hosts where cron is unreliable.
     303    if ( ( time() - filemtime( $config_file ) ) >= 604800 ) {
    293304        pmw_gtg_send_fallback_response( 'config-expired' );
    294305    }
     
    306317
    307318    // Config is valid - log if enabled
    308     if ( ! empty( $config['logging_enabled'] ) && ! empty( $config['log_directory'] ) ) {
     319    if ( ! empty( $config['logging_enabled'] ) ) {
    309320        $log_level = isset( $config['log_level'] ) ? $config['log_level'] : 'error';
    310321        $level_priority = [ 'debug' => 7, 'info' => 6, 'notice' => 5, 'warning' => 4, 'error' => 3 ];
     
    312323
    313324        if ( 6 <= $configured_priority ) { // info level = 6
    314             $wp_content = dirname( dirname( $config['log_directory'] ) );
    315             $debug_log  = $wp_content . '/debug.log';
    316             $timestamp  = gmdate( 'd-M-Y H:i:s \U\T\C' );
    317             $log_entry  = "[{$timestamp}] pmw [info] [GTG-Proxy-Standalone] Health check request received - proxy functional\n";
    318             @file_put_contents( $debug_log, $log_entry, FILE_APPEND | LOCK_EX );
     325            // Use wp_content_dir from config (multisite-safe), fallback to log_directory derivation
     326            $debug_log = null;
     327            if ( ! empty( $config['wp_content_dir'] ) ) {
     328                $debug_log = $config['wp_content_dir'] . '/debug.log';
     329            } elseif ( ! empty( $config['log_directory'] ) ) {
     330                $debug_log = dirname( dirname( $config['log_directory'] ) ) . '/debug.log';
     331            }
     332            if ( $debug_log ) {
     333                $timestamp  = gmdate( 'd-M-Y H:i:s \U\T\C' );
     334                $log_entry  = "[{$timestamp}] pmw [info] [GTG-Proxy-Standalone] Health check request received - proxy functional\n";
     335                @file_put_contents( $debug_log, $log_entry, FILE_APPEND | LOCK_EX );
     336            }
    319337        }
    320338    }
     
    356374
    357375    /**
    358      * Cache file max age in seconds (1 hour)
     376     * Cache file max age in seconds (7 days)
     377     *
     378     * WP-Cron refreshes the config every 24 hours under normal conditions.
     379     * This extended TTL is a safety net for hosts where cron is unreliable.
    359380     *
    360381     * @var int
    361382     */
    362     const CACHE_MAX_AGE = 86400;
     383    const CACHE_MAX_AGE = 604800;
    363384
    364385    /**
     
    486507            // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized by sanitize_geo method
    487508            $geo    = isset( $_GET['geo'] ) ? self::sanitize_geo( $_GET['geo'] ) : '';
    488             // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Path is validated against allowed patterns
    489             $s_path = isset( $_GET['s'] ) ? $_GET['s'] : '';
    490             // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Mpath is used in URL construction only
    491             $mpath  = isset( $_GET['mpath'] ) ? $_GET['mpath'] : '';
     509            // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized by sanitize_s_path method
     510            $s_path = isset( $_GET['s'] ) ? self::sanitize_s_path( $_GET['s'] ) : '';
     511            // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized by sanitize_mpath method
     512            $mpath  = isset( $_GET['mpath'] ) ? self::sanitize_mpath( $_GET['mpath'] ) : '';
    492513
    493514            // Build destination path
     
    626647        // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized by sanitize_tag_id method
    627648        $tag_id = isset( $_GET['id'] ) ? self::sanitize_tag_id( $_GET['id'] ) : '';
    628         // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Path is validated against allowed patterns
    629         $s_path = isset( $_GET['s'] ) ? $_GET['s'] : '';
     649        // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized by sanitize_s_path method
     650        $s_path = isset( $_GET['s'] ) ? self::sanitize_s_path( $_GET['s'] ) : '';
    630651        // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized by sanitize_geo method
    631652        $geo    = isset( $_GET['geo'] ) ? self::sanitize_geo( $_GET['geo'] ) : '';
    632         // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Mpath is used in URL construction only
    633         $mpath  = isset( $_GET['mpath'] ) ? $_GET['mpath'] : '';
     653        // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Sanitized by sanitize_mpath method
     654        $mpath  = isset( $_GET['mpath'] ) ? self::sanitize_mpath( $_GET['mpath'] ) : '';
    634655
    635656        self::log(
     
    757778        }
    758779
    759         // Step 5: Check config age (24 hours max)
     780        // Step 5: Check config age (7 days max — safety net for WP-Cron failures)
    760781        if ( ( time() - filemtime( $cache_file ) ) >= self::CACHE_MAX_AGE ) {
    761782            pmw_gtg_send_fallback_response( 'config-expired' );
     
    778799        }
    779800
     801        // Step 8: Validate config field contents to prevent abuse via compromised config files
     802        if ( ! self::validate_config( $config ) ) {
     803            pmw_gtg_send_fallback_response( 'config-validation-failed' );
     804        }
     805
    780806        self::$config = $config;
    781807        return $config;
     808    }
     809
     810    /**
     811     * Validate config field contents
     812     *
     813     * Ensures config values are safe before the proxy acts on them.
     814     * Prevents a compromised config file from redirecting traffic or
     815     * causing writes to arbitrary locations.
     816     *
     817     * @param array $config The decoded config array.
     818     * @return bool True if config is valid, false otherwise.
     819     *
     820     * @since 1.56.1
     821     */
     822    private static function validate_config( $config ) {
     823        // Validate measurement_path: must start with /, only safe chars, max 64 chars
     824        if ( ! empty( $config['measurement_path'] ) ) {
     825            $mp = $config['measurement_path'];
     826            if ( '/' !== $mp[0] || strlen( $mp ) > 64 || ! preg_match( '/^\/[a-zA-Z0-9\/_-]+$/', $mp ) ) {
     827                return false;
     828            }
     829        }
     830
     831        // Validate proxy_url: must be a valid URL, scheme must be http or https
     832        if ( ! empty( $config['proxy_url'] ) ) {
     833            if ( ! filter_var( $config['proxy_url'], FILTER_VALIDATE_URL ) ) {
     834                return false;
     835            }
     836            $proxy_parsed = parse_url( $config['proxy_url'] );
     837            if ( ! $proxy_parsed || ! isset( $proxy_parsed['scheme'] ) || ! in_array( $proxy_parsed['scheme'], [ 'http', 'https' ], true ) ) {
     838                return false;
     839            }
     840            // proxy_url host must match site_url host to prevent redirect to external domains
     841            if ( ! empty( $config['site_url'] ) ) {
     842                $site_parsed = parse_url( $config['site_url'] );
     843                if ( $site_parsed && isset( $site_parsed['host'], $proxy_parsed['host'] ) ) {
     844                    if ( strtolower( $proxy_parsed['host'] ) !== strtolower( $site_parsed['host'] ) ) {
     845                        return false;
     846                    }
     847                }
     848            }
     849        }
     850
     851        // Validate site_url: must be a valid URL with http(s) scheme
     852        if ( ! empty( $config['site_url'] ) ) {
     853            if ( ! filter_var( $config['site_url'], FILTER_VALIDATE_URL ) ) {
     854                return false;
     855            }
     856            $site_scheme = parse_url( $config['site_url'], PHP_URL_SCHEME );
     857            if ( ! in_array( $site_scheme, [ 'http', 'https' ], true ) ) {
     858                return false;
     859            }
     860        }
     861
     862        // Validate log_directory: if present, must be absolute path without traversal
     863        if ( ! empty( $config['log_directory'] ) ) {
     864            $log_dir = $config['log_directory'];
     865            if ( '/' !== $log_dir[0] || false !== strpos( $log_dir, '..' ) ) {
     866                return false;
     867            }
     868        }
     869
     870        // Validate log_level: must be a known level
     871        if ( ! empty( $config['log_level'] ) ) {
     872            if ( ! isset( self::LOG_LEVELS[ $config['log_level'] ] ) ) {
     873                return false;
     874            }
     875        }
     876
     877        return true;
    782878    }
    783879
     
    837933
    838934        // Try to find WordPress debug.log
    839         // The log_directory in config points to wp-content/uploads/pmw-logs/
    840         // WordPress debug.log is at wp-content/debug.log
     935        // Use wp_content_dir from config (most reliable, especially for multisite)
     936        // Fallback to deriving from log_directory for backwards compatibility
    841937        $log_file = null;
    842         if ( ! empty( $config['log_directory'] ) ) {
    843             // Navigate from pmw-logs to wp-content/debug.log
     938        if ( ! empty( $config['wp_content_dir'] ) ) {
     939            $debug_log = $config['wp_content_dir'] . '/debug.log';
     940            if ( is_writable( dirname( $debug_log ) ) ) {
     941                $log_file = $debug_log;
     942            }
     943        } elseif ( ! empty( $config['log_directory'] ) ) {
     944            // Legacy fallback: navigate from pmw-logs to wp-content/debug.log
    844945            // /path/wp-content/uploads/pmw-logs/ -> /path/wp-content/debug.log
    845946            $wp_content = dirname( dirname( $config['log_directory'] ) );
     
    9491050        }
    9501051        return $geo;
     1052    }
     1053
     1054    /**
     1055     * Sanitize the s (path) parameter
     1056     *
     1057     * Strips null bytes, non-printable characters, and limits length.
     1058     * Defense-in-depth: the FPS URL validation (is_valid_fps_url) is the
     1059     * primary gate, but sanitizing inputs prevents unexpected behavior.
     1060     *
     1061     * @param string $s_path Raw path parameter.
     1062     * @return string Sanitized path parameter.
     1063     *
     1064     * @since 1.56.1
     1065     */
     1066    private static function sanitize_s_path( $s_path ) {
     1067        // Remove null bytes
     1068        $s_path = str_replace( chr( 0 ), '', $s_path );
     1069        // Remove non-printable characters
     1070        $s_path = preg_replace( '/[\x00-\x1F\x7F]/', '', $s_path );
     1071        // Limit length to 2048 characters
     1072        if ( strlen( $s_path ) > 2048 ) {
     1073            $s_path = substr( $s_path, 0, 2048 );
     1074        }
     1075        return $s_path;
     1076    }
     1077
     1078    /**
     1079     * Sanitize the mpath (measurement path) parameter
     1080     *
     1081     * Restricts to alphanumeric characters, hyphens, and underscores only,
     1082     * matching the measurement path format. Limits to 64 characters.
     1083     *
     1084     * @param string $mpath Raw mpath parameter.
     1085     * @return string Sanitized mpath parameter.
     1086     *
     1087     * @since 1.56.1
     1088     */
     1089    private static function sanitize_mpath( $mpath ) {
     1090        // Strip everything except safe characters
     1091        $mpath = preg_replace( '/[^A-Za-z0-9_-]/', '', $mpath );
     1092        // Limit length to 64 characters
     1093        if ( strlen( $mpath ) > 64 ) {
     1094            $mpath = substr( $mpath, 0, 64 );
     1095        }
     1096        return $mpath;
    9511097    }
    9521098
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/js/admin/pmw-admin.p1.min.js

    r3447088 r3468312  
    1 /*! Copyright 2025 SweetCode. All rights reserved. */(()=>{var e={348(){window.pmwAdminScriptLoaded=!0},605(){jQuery(function(){if("pmw"!==pmwGetPageId())return;let e=[],t={};if(jQuery(".section").closest("tr").hide(),jQuery(".section").each(function(){e.push({slug:jQuery(this).data("sectionSlug"),title:jQuery(this).data("sectionTitle"),badgeCount:jQuery(this).data("badgeCount")||0})}),jQuery(".subsection").each(function(){t[jQuery(this).data("sectionSlug")]=t[jQuery(this).data("sectionSlug")]||[],t[jQuery(this).data("sectionSlug")].push({title:jQuery(this).data("subsectionTitle"),slug:jQuery(this).data("subsectionSlug")})}),e.forEach(function(e){let t=e.badgeCount>0?'<span class="pmw-tab-badge">'+e.badgeCount+"</span>":"";jQuery(".nav-tab-wrapper").append('<a href="#" class="nav-tab" data-section-slug="'+e.slug+'">'+e.title+t+"</a>")}),jQuery(".nav-tab-wrapper").after(pmwCreateSubtabUlHtml(t)),jQuery(".nav-tab-wrapper a").on("click",function(n){n.preventDefault(),jQuery(this).addClass("nav-tab-active").siblings().removeClass("nav-tab-active");let a=jQuery(this).data("section-slug");pmwToggleSections(a,e),a in t&&jQuery("ul[data-section-slug="+a+"]").children(":first").trigger("click")}),jQuery(".pmw-subnav-li").on("click",function(e){e.preventDefault(),e.stopPropagation(),jQuery(this).addClass("pmw-subnav-li-active").removeClass("pmw-subnav-li-inactive").siblings().addClass("pmw-subnav-li-inactive").removeClass("pmw-subnav-li-active"),pmwToggleSubsection(jQuery(this).parent().data("section-slug"),jQuery(this).data("subsection-slug"))}),pmwGetSectionParams()){let e=pmwGetSectionParams();jQuery("a[data-section-slug="+e.section+"]").trigger("click"),!1!==e.subsection&&jQuery("ul[data-section-slug="+e.section+"]").children("[data-subsection-slug="+e.subsection+"]").trigger("click")}else jQuery("a[data-section-slug="+e[0].slug+"]").trigger("click")}),pmwCreateSubtabUlHtml=e=>{let t=Object.keys(e),n="";return t.forEach(function(t){n+='<ul class="pmw-subnav-tabs" data-section-slug="'+t+'">',e[t].forEach(function(e){n+='<li class="pmw-subnav-li pmw-subnav-li-inactive" style="cursor: pointer;" data-subsection-slug="'+e.slug+'">'+e.title+"</li>"}),n+="</ul>"}),n},pmwGetSectionParams=()=>{const e=window.location.search,t=new URLSearchParams(e);return!!t.get("section")&&{section:t.get("section"),subsection:t.get("subsection")}},pmwToggleSections=(e,t)=>{jQuery("#pmw_settings_form > h2").nextUntil(".submit").andSelf().hide(),jQuery(".pmw-subnav-tabs").hide(),jQuery(".pmw-subnav-tabs[data-section-slug="+e+"]").show();let n=t.findIndex(t=>t.slug===e);jQuery("div[data-section-slug="+e+"]").closest("table").prevAll("h2:first").next().nextUntil("h2, .submit").andSelf().show(),pmwSetUrl(t[n].slug)},pmwToggleSubsection=(e,t)=>{jQuery("#pmw_settings_form > h2").nextUntil(".submit").andSelf().hide(),jQuery("[data-section-slug="+e+"][data-subsection-slug="+t+"]").closest("tr").siblings().andSelf().hide(),jQuery("[data-section-slug="+e+"][data-subsection-slug="+t+"]").closest("table").show(),jQuery("[data-section-slug="+e+"][data-subsection-slug="+t+"]").closest("tr").nextUntil(jQuery("[data-section-slug="+e+"][data-subsection-slug]").closest("tr")).show(),pmwSetUrl(e,t)},pmwSetUrl=(e,t="")=>{const n=window.location.search,a=new URLSearchParams(n);a.delete("section"),a.delete("subsection");let s="section="+e;s+=t?"&subsection="+t:"",history.pushState("","pmw"+e,document.location.pathname+"?page=pmw&"+s),jQuery('input[name ="_wp_http_referer"]').val(pmwGetAdminPath()+"?page=pmw&"+s+"&settings-updated=true")},pmwGetAdminPath=()=>new URL(jQuery("#wp-admin-canonical").attr("href")).pathname,pmwGetPageId=()=>{const e=window.location.search;return new URLSearchParams(e).get("page")},jQuery(document).on("click","[data-section-slug]",function(){["opportunities","diagnostics","support"].includes(jQuery(this).data("section-slug"))?jQuery(".submit").hide():jQuery(".submit").show()}),jQuery(document).on("click",".advanced-section-link",e=>{e.preventDefault();let t=jQuery(e.currentTarget).data("as-section"),n=jQuery(e.currentTarget).data("as-subsection");jQuery(`a[data-section-slug=${t}]`).trigger("click"),jQuery(`ul[data-section-slug=${t}]`).children(`[data-subsection-slug=${n}]`).trigger("click")})},992(){jQuery(function(){jQuery("#debug-info-button").on("click",()=>{const e=jQuery("#debug-info-textarea")[0];e.select(),e.setSelectionRange(0,99999),pmw.copyTextToClipboard(jQuery("#debug-info-textarea").val());const t=jQuery("#debug-info-success");t.fadeIn(200),setTimeout(()=>t.fadeOut(200),3e3)}),jQuery("#pmw-pro-version-demo").on("click",function(){jQuery("#submit").trigger("click")}),document.getElementById("json-settings-file-input")&&document.getElementById("json-settings-file-input").addEventListener("change",pmw.readSettingsFile,!1),document.getElementById("ga4-data-api-credentials-upload-button")&&document.getElementById("ga4-data-api-credentials-upload-button").addEventListener("change",pmw.readGa4DataApiCredentials,!1),document.getElementById("ga4-data-api-credentials-delete-button")&&document.getElementById("ga4-data-api-credentials-delete-button").addEventListener("click",()=>{pmw.saveGa4DataApiCredentialsToDb({})},!1),jQuery("#wgact_download_logs_zip").on("click",function(e){if(e.preventDefault(),jQuery(this).prop("disabled"))return;const t=jQuery(this).data("source"),n=jQuery(this),a=n.text();n.prop("disabled",!0).text("Downloading..."),fetch(pmwAdminApi.root+"pmw/v1/logs/download",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","X-WP-Nonce":pmwAdminApi.nonce},body:new URLSearchParams({source:t}),credentials:"same-origin"}).then(e=>{if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);return e.blob()}).then(e=>{const t=window.URL.createObjectURL(e),s=document.createElement("a");s.href=t,s.download="pmw-logs-"+(new Date).toISOString().slice(0,19).replace(/:/g,"-")+".zip",document.body.appendChild(s),s.click(),window.URL.revokeObjectURL(t),document.body.removeChild(s),n.prop("disabled",!1).text(a)}).catch(e=>{console.error("Download error:",e),n.prop("disabled",!1).text(a),alert("Error downloading log files. Please try again.")})})}),function(e){e.saveSettingsToDisk=()=>{let t=document.getElementById("export-settings-json").value,n="unknown";try{let e=JSON.parse(t);e.timestamp&&(n=e.timestamp)}catch(e){console.warn("Could not extract timestamp from settings:",e)}t=t.replace(/\n/g,"\r\n");let a=new Blob([t],{type:"text/plain"}),s=document.createElement("a");s.download="pixel-manager-settings_"+n+"_"+e.getDateTimeFromTimestamp(n)+".json",s.href=window.URL.createObjectURL(a),s.target="_blank",s.style.display="none",document.body.appendChild(s),s.click(),document.body.removeChild(s)},e.getDateTimeFromTimestamp=t=>{if("unknown"===t||!t||isNaN(t))return e.getCurrentDateForFileName();let n=new Date(1e3*t);if(pmwAdminApi&&pmwAdminApi.timezone&&"number"==typeof pmwAdminApi.timezone.offset){let e=60*pmwAdminApi.timezone.offset*60*1e3;return n=new Date(n.getTime()+e),n.getUTCFullYear()+"."+("0"+(n.getUTCMonth()+1)).slice(-2)+"."+("0"+n.getUTCDate()).slice(-2)+"_"+("0"+n.getUTCHours()).slice(-2)+"-"+("0"+n.getUTCMinutes()).slice(-2)+"-"+("0"+n.getUTCSeconds()).slice(-2)}return n.getFullYear()+"."+("0"+(n.getMonth()+1)).slice(-2)+"."+("0"+n.getDate()).slice(-2)+"_"+("0"+n.getHours()).slice(-2)+"-"+("0"+n.getMinutes()).slice(-2)+"-"+("0"+n.getSeconds()).slice(-2)},e.getCurrentDateForFileName=()=>{let e=new Date;if(pmwAdminApi&&pmwAdminApi.timezone&&"number"==typeof pmwAdminApi.timezone.offset){let t=60*pmwAdminApi.timezone.offset*60*1e3;return e=new Date(e.getTime()+t),e.getUTCFullYear()+"."+("0"+(e.getUTCMonth()+1)).slice(-2)+"."+("0"+e.getUTCDate()).slice(-2)+"_"+("0"+e.getUTCHours()).slice(-2)+"-"+("0"+e.getUTCMinutes()).slice(-2)+"-"+("0"+e.getUTCSeconds()).slice(-2)}return e.getFullYear()+"."+("0"+(e.getMonth()+1)).slice(-2)+"."+("0"+e.getDate()).slice(-2)+"_"+("0"+e.getHours()).slice(-2)+"-"+("0"+e.getMinutes()).slice(-2)+"-"+("0"+e.getSeconds()).slice(-2)},e.readSettingsFile=t=>{let n=t.target.files[0];if(!n)return;let a=new FileReader;a.onload=function(t){try{JSON.parse(t.target.result)}catch(e){return document.getElementById("settings-upload-status-error").style.display="block",void(document.getElementById("settings-upload-status-error-message").innerHTML="Invalid JSON file.")}let n=JSON.parse(t.target.result);e.saveImportedSettingsToDb(n)},a.readAsText(n)},e.saveImportedSettingsToDb=e=>{fetch(pmwAdminApi.root+"pmw/v1/settings/",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":pmwAdminApi.nonce},body:JSON.stringify(e)}).then(e=>e.json()).then(async e=>{e.success?(console.log(e),document.getElementById("settings-upload-status-success").style.display="block",await new Promise(e=>setTimeout(e,1e3)),window.location.reload()):(console.log(e),document.getElementById("settings-upload-status-error").style.display="block")}).catch(e=>{console.error(e),document.getElementById("settings-upload-status-error").style.display="block"})},e.restoreBackup=e=>{console.log("restoreBackup() - timestamp: ",e),fetch(pmwAdminApi.root+"pmw/v1/options-backup/"+e+"/restore",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":pmwAdminApi.nonce}}).then(e=>e.json()).then(async e=>{e?.data?.message&&console.log("restoreBackup() - message: ",e.data.message),e.success?window.location.reload():alert(e.data.message)}).catch(e=>{console.error(e),alert(e.message)})},e.readGa4DataApiCredentials=t=>{let n=t.target.files[0];if(!n)return;let a=new FileReader;a.onload=function(t){try{JSON.parse(t.target.result)}catch(e){return document.getElementById("ga4-api-credentials-upload-status-error").style.display="block",void(document.getElementById("ga4-api-credentials-upload-status-error-message").innerHTML="Invalid JSON file.")}let n=JSON.parse(t.target.result);e.saveGa4DataApiCredentialsToDb(n)},a.readAsText(n)},e.deleteGa4DataApiCredentials=t=>{e.saveGa4DataApiCredentialsToDb({})},e.saveGa4DataApiCredentialsToDb=e=>{fetch(pmwAdminApi.root+"pmw/v1/ga4/data-api/credentials",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":pmwAdminApi.nonce},body:JSON.stringify(e)}).then(e=>e.json()).then(async e=>{e.success?(console.log(e),document.getElementById("ga4-api-credentials-upload-status-success").style.display="block",window.location.reload()):(console.log(e),document.getElementById("ga4-api-credentials-upload-status-error").style.display="block",document.getElementById("ga4-api-credentials-upload-status-error-message").innerHTML="Error message: "+e.data.message)}).catch(e=>{console.error(e),document.getElementById("ga4-api-credentials-upload-status-error").style.display="block"})},e.getAiBotUrl=()=>{if(pmw_cody?.url)return pmw_cody.url},e.loadAiChatWindow=()=>{const t=document.getElementById("pmw-chatbot-panel"),n=document.getElementById("pmw-chatbot-iframe");t&&n?(n.src=e.getAiBotUrl(),document.body.classList.add("pmw-chatbot-open"),t.classList.add("pmw-chatbot-panel-open")):console.error("Chatbot panel elements not found")},e.closeChatbot=()=>{const e=document.getElementById("pmw-chatbot-panel");e&&(e.classList.remove("pmw-chatbot-panel-open"),document.body.classList.remove("pmw-chatbot-open"))},e.codyAvailable=()=>!(void 0===window.pmw_cody||!window.pmw_cody?.available),e.ltvRecalculation=e=>{const t=e=>{let t=document.getElementsByClassName("ltv-message");for(let e=0;e<t.length;e++)t[e].style.display="none";document.getElementById("ltv-message-error").style.display="block",document.getElementById("ltv-message-error-text").innerHTML=e},n=()=>{let e=document.getElementsByClassName("ltv-message");for(let t=0;t<e.length;t++)e[t].style.display="none";document.getElementById("ltv-message-error").style.display="none"};fetch(pmwAdminApi.root+"pmw/v1/ltv/",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":pmwAdminApi.nonce},body:JSON.stringify({action:e.target.dataset.action})}).then(e=>e.json()).then(e=>{e.success?(console.log(e),e.data.status.is_scheduled&&(n(),(()=>{let e=document.getElementsByClassName("ltv-button-text");for(let t=0;t<e.length;t++)e[t].style.display="none";document.getElementById("ltv-instant-recalculation-button-text").style.display="block"})(),document.getElementById("ltv-schedule-recalculation-confirmation-message").style.display="block"),e.data.status.is_running&&(document.getElementById("wgact_ltv_recalculation").disabled=!0,n(),document.getElementById("ltv-running-recalculation-confirmation-message").style.display="block"),e.data.status.is_running||e.data.status.is_scheduled||t(e.data.message)):(console.error(e),t(e.data.message))}).catch(e=>{console.error(e),t(e)})},e.copyTextToClipboard=e=>{navigator.clipboard.writeText(e).catch(e=>{console.error("Failed to copy: ",e)})}}(window.pmw=window.pmw||{},jQuery),document.addEventListener("DOMContentLoaded",()=>{if(pmw.codyAvailable()){const e=document.getElementById("pmw-chatbot-widget");e&&(e.style.display="block");const t=document.getElementById("pmw-chat-li");t&&(t.style.display="list-item");const n=document.getElementById("pmw-chatbot-toggle"),a=document.getElementById("pmw-chatbot-close");n&&n.addEventListener("click",e=>{e.preventDefault(),pmw.loadAiChatWindow()}),a&&a.addEventListener("click",e=>{e.preventDefault(),pmw.closeChatbot()}),document.addEventListener("keydown",e=>{"Escape"===e.key&&pmw.closeChatbot()})}else console.log("DOMContentLoaded - chatbot is not available")},!0),jQuery(()=>{document.querySelector("#wgact_ltv_recalculation")&&document.querySelector("#wgact_ltv_recalculation").addEventListener("click",e=>{e.preventDefault(),pmw.ltvRecalculation(e)}),document.querySelector("#pmw_stop_ltv_calculation")&&document.querySelector("#pmw_stop_ltv_calculation").addEventListener("click",e=>{e.preventDefault(),pmw.ltvRecalculation(e)}),jQuery(()=>{jQuery(document).on("click",".pmw-restore-backup-button",function(e){e.preventDefault();const t=jQuery(this).data("timestamp");t&&pmw.restoreBackup(t)})})}),jQuery(()=>{document.querySelector("#wgact_copy_log_file_links")&&document.querySelector("#wgact_copy_log_file_links").addEventListener("click",e=>{e.preventDefault();const t=JSON.parse(e.target.dataset.links);let n="";for(let e=0,a=t.length;e<a;e++)n+=t[e]+"\n";pmw.copyTextToClipboard(n);let a=document.getElementById("wgact_copy_log_file_links");a.style.width=getComputedStyle(a).width;const s=a.innerHTML;a.innerHTML=e.target.dataset.textCopied,setTimeout(function(){a.innerHTML=s},3e3)})}),jQuery(()=>{jQuery(document).on("keydown","input, textarea, select",function(e){if("Enter"===e.key&&!e.shiftKey&&!e.ctrlKey&&!e.altKey){const t=jQuery(e.target);if(t.is("input")&&t.closest("form").length>0){const n=t.closest("form")[0],a=jQuery(n).find("#submit");a.length>0&&(e.preventDefault(),a.click())}}})})}},t={};function n(a){var s=t[a];if(void 0!==s)return s.exports;var o=t[a]={exports:{}};return e[a](o,o.exports,n),o.exports}n(992),n(348),n(605)})();
     1/*! Copyright 2025 SweetCode. All rights reserved. */(()=>{var e={176(){jQuery(function(e){const t=e("#pmw_settings_form");function s(t,s){const n=e('<div class="notice '+("success"===t?"notice-success":"notice-error")+' is-dismissible pmw-save-notice" style="margin: 10px 0;"><p>'+s+'</p><button type="button" class="notice-dismiss"><span class="screen-reader-text">Dismiss this notice.</span></button></div>');e(".nav-tab-wrapper").after(n),n.find(".notice-dismiss").on("click",function(){n.fadeOut(200,function(){e(this).remove()})}),"success"===t&&setTimeout(function(){n.fadeOut(400,function(){e(this).remove()})},5e3),e("html, body").animate({scrollTop:n.offset().top-50},300)}t.length&&t.on("submit",function(n){n.preventDefault();const a=t.find("#submit"),o=a.val();a.prop("disabled",!0).val("Saving…"),e(".pmw-save-notice").remove();const i=t.serialize();fetch(pmwAdminApi.root+"pmw/v1/options/save",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","X-WP-Nonce":pmwAdminApi.nonce},body:i}).then(e=>e.json()).then(e=>{if(!e.success||e.errors&&0!==e.errors.length){let t=e.message||"Settings saved with errors.";e.errors&&e.errors.length>0&&(t+='<ul style="margin: 4px 0 0 16px; list-style: disc;">',e.errors.forEach(function(e){t+="<li>"+e+"</li>"}),t+="</ul>"),s("error",t)}else window.location.reload()}).catch(e=>{console.error("PMW settings save error:",e),s("error","An unexpected error occurred while saving settings. Please try again.")}).finally(()=>{a.prop("disabled",!1).val(o)})})})},348(){window.pmwAdminScriptLoaded=!0},605(){jQuery(function(){if("pmw"!==pmwGetPageId())return;let e=[],t={};if(jQuery(".section").closest("tr").hide(),jQuery(".section").each(function(){e.push({slug:jQuery(this).data("sectionSlug"),title:jQuery(this).data("sectionTitle"),badgeCount:jQuery(this).data("badgeCount")||0,priority:parseInt(jQuery(this).data("priority"),10)||50,showSaveButton:jQuery(this).data("showSaveButton")})}),e.sort(function(e,t){return e.priority-t.priority}),jQuery(".subsection").each(function(){t[jQuery(this).data("sectionSlug")]=t[jQuery(this).data("sectionSlug")]||[],t[jQuery(this).data("sectionSlug")].push({title:jQuery(this).data("subsectionTitle"),slug:jQuery(this).data("subsectionSlug")})}),e.forEach(function(e){let t=e.badgeCount>0?'<span class="pmw-tab-badge">'+e.badgeCount+"</span>":"";jQuery(".nav-tab-wrapper").append('<a href="#" class="nav-tab" data-section-slug="'+e.slug+'">'+e.title+t+"</a>")}),jQuery(".nav-tab-wrapper").after(pmwCreateSubtabUlHtml(t)),jQuery(".nav-tab-wrapper a").on("click",function(s){s.preventDefault(),jQuery(this).addClass("nav-tab-active").siblings().removeClass("nav-tab-active");let n=jQuery(this).data("section-slug");pmwToggleSections(n,e),n in t&&jQuery("ul[data-section-slug="+n+"]").children(":first").trigger("click")}),jQuery(".pmw-subnav-li").on("click",function(e){e.preventDefault(),e.stopPropagation(),jQuery(this).addClass("pmw-subnav-li-active").removeClass("pmw-subnav-li-inactive").siblings().addClass("pmw-subnav-li-inactive").removeClass("pmw-subnav-li-active"),pmwToggleSubsection(jQuery(this).parent().data("section-slug"),jQuery(this).data("subsection-slug"))}),pmwGetSectionParams()){let e=pmwGetSectionParams();jQuery("a[data-section-slug="+e.section+"]").trigger("click"),!1!==e.subsection&&jQuery("ul[data-section-slug="+e.section+"]").children("[data-subsection-slug="+e.subsection+"]").trigger("click")}else jQuery("a[data-section-slug="+e[0].slug+"]").trigger("click")}),pmwCreateSubtabUlHtml=e=>{let t=Object.keys(e),s="";return t.forEach(function(t){s+='<ul class="pmw-subnav-tabs" data-section-slug="'+t+'">',e[t].forEach(function(e){s+='<li class="pmw-subnav-li pmw-subnav-li-inactive" style="cursor: pointer;" data-subsection-slug="'+e.slug+'">'+e.title+"</li>"}),s+="</ul>"}),s},pmwGetSectionParams=()=>{const e=window.location.search,t=new URLSearchParams(e);return!!t.get("section")&&{section:t.get("section"),subsection:t.get("subsection")}},pmwToggleSections=(e,t)=>{jQuery("#pmw_settings_form > h2").nextUntil(".submit").andSelf().hide(),jQuery(".pmw-subnav-tabs").hide(),jQuery(".pmw-subnav-tabs[data-section-slug="+e+"]").show();let s=t.findIndex(t=>t.slug===e);jQuery("div[data-section-slug="+e+"]").closest("table").prevAll("h2:first").next().nextUntil("h2, .submit").andSelf().show(),pmwSetUrl(t[s].slug)},pmwToggleSubsection=(e,t)=>{jQuery("#pmw_settings_form > h2").nextUntil(".submit").andSelf().hide(),jQuery("[data-section-slug="+e+"][data-subsection-slug="+t+"]").closest("tr").siblings().andSelf().hide(),jQuery("[data-section-slug="+e+"][data-subsection-slug="+t+"]").closest("table").show(),jQuery("[data-section-slug="+e+"][data-subsection-slug="+t+"]").closest("tr").nextUntil(jQuery("[data-section-slug="+e+"][data-subsection-slug]").closest("tr")).show(),pmwSetUrl(e,t)},pmwSetUrl=(e,t="")=>{const s=window.location.search,n=new URLSearchParams(s);n.delete("section"),n.delete("subsection");let a="section="+e;a+=t?"&subsection="+t:"",history.pushState("","pmw"+e,document.location.pathname+"?page=pmw&"+a)},pmwGetPageId=()=>{const e=window.location.search;return new URLSearchParams(e).get("page")},jQuery(document).on("click","[data-section-slug]",function(){const e=jQuery(this).data("sectionSlug")||jQuery(this).data("section-slug"),t=jQuery(".section[data-section-slug='"+e+"']");t.length&&0==t.data("showSaveButton")?jQuery(".submit").hide():jQuery(".submit").show()}),jQuery(document).on("click",".advanced-section-link",e=>{e.preventDefault();let t=jQuery(e.currentTarget).data("as-section"),s=jQuery(e.currentTarget).data("as-subsection");jQuery(`a[data-section-slug=${t}]`).trigger("click"),jQuery(`ul[data-section-slug=${t}]`).children(`[data-subsection-slug=${s}]`).trigger("click")})},939(){jQuery(function(e){const t=e("#pmw-ssp-activate-btn"),s=e("#pmw-ssp-reactivate-btn"),n=e("#pmw-ssp-disable-btn"),a=e("#pmw-ssp-disconnect-btn"),o=e("#pmw-ssp-sync-btn"),i=e("#pmw-ssp-test-btn"),r=e("#pmw-ssp-sync-token"),c=e("#pmw-ssp-failure-behavior");if(!t.length&&!o.length)return;const l=(e,t,s)=>{const n="success"===s?"pmw-ssp-msg-success":"error"===s?"pmw-ssp-msg-error":"pmw-ssp-msg-loading";e.html(`<span class="${n}">${t}</span>`)},d=e=>{e.html("")},u=(e,t,s)=>{const n={method:t,credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":pmwAdminApi.nonce}};return s&&(n.body=JSON.stringify(s)),fetch(pmwAdminApi.root+"pmw/v1/ssp/"+e,n).then(e=>e.json())};t.on("click",function(){const s=e.trim(r.val());s?/^[a-f0-9]{32,64}$/i.test(s)?(t.prop("disabled",!0).text("Activating…"),d(e("#pmw-ssp-activate-status")),u("activate","POST",{sync_token:s}).then(s=>{if(s.success)l(e("#pmw-ssp-activate-status"),"✓ SSP activated successfully. Reloading…","success"),setTimeout(()=>window.location.reload(),1500);else{const n=s.message||s.data?.message||"Activation failed.";l(e("#pmw-ssp-activate-status"),n,"error"),t.prop("disabled",!1).text("Activate")}}).catch(s=>{l(e("#pmw-ssp-activate-status"),"Network error: "+s.message,"error"),t.prop("disabled",!1).text("Activate")})):l(e("#pmw-ssp-activate-status"),"Invalid token format. Expected a hex string (32-64 characters).","error"):l(e("#pmw-ssp-activate-status"),"Please enter a sync token.","error")}),s.on("click",function(){s.prop("disabled",!0).text("Re-activating…"),l(e("#pmw-ssp-toggle-status"),"Re-activating…","loading"),u("enable","POST").then(t=>{if(t.success)l(e("#pmw-ssp-toggle-status"),"✓ "+t.message+" Reloading…","success"),setTimeout(()=>window.location.reload(),1500);else{const n=t.message||t.data?.message||"Re-activation failed.";l(e("#pmw-ssp-toggle-status"),n,"error"),s.prop("disabled",!1).text("Re-activate")}}).catch(t=>{l(e("#pmw-ssp-toggle-status"),"Network error: "+t.message,"error"),s.prop("disabled",!1).text("Re-activate")})}),n.on("click",function(){n.prop("disabled",!0).text("Disabling…"),l(e("#pmw-ssp-toggle-status"),"Disabling…","loading"),u("disable","POST").then(t=>{if(t.success)l(e("#pmw-ssp-toggle-status"),"✓ "+t.message+" Reloading…","success"),setTimeout(()=>window.location.reload(),1500);else{const s=t.message||t.data?.message||"Disable failed.";l(e("#pmw-ssp-toggle-status"),s,"error"),n.prop("disabled",!1).text("Disable")}}).catch(t=>{l(e("#pmw-ssp-toggle-status"),"Network error: "+t.message,"error"),n.prop("disabled",!1).text("Disable")})}),a.on("click",function(){confirm("Disconnect from SSP?\n\nThis will permanently delete the sync token and remove all connection data. You will need to re-enter the token from the SSP portal to reconnect.\n\nContinue?")&&(a.prop("disabled",!0).text("Disconnecting…"),u("disconnect","POST").then(t=>{t.success?(l(e("#pmw-ssp-disconnect-status"),"SSP disconnected. Reloading…","success"),setTimeout(()=>window.location.reload(),1500)):(l(e("#pmw-ssp-disconnect-status"),t.message||"Disconnect failed.","error"),a.prop("disabled",!1).text("Disconnect"))}).catch(t=>{l(e("#pmw-ssp-disconnect-status"),"Network error: "+t.message,"error"),a.prop("disabled",!1).text("Disconnect")}))}),c.on("change",function(){const t=e(this).val();l(e("#pmw-ssp-failure-behavior-status"),"Saving…","loading"),u("save-setting","POST",{key:"proxy_failure_behavior",value:t}).then(t=>{t.success?(l(e("#pmw-ssp-failure-behavior-status"),"✓ Saved","success"),setTimeout(()=>d(e("#pmw-ssp-failure-behavior-status")),3e3)):l(e("#pmw-ssp-failure-behavior-status"),t.message||"Save failed.","error")}).catch(t=>{l(e("#pmw-ssp-failure-behavior-status"),"Network error: "+t.message,"error")})});o.on("click",function(){o.prop("disabled",!0).text("Syncing…"),l(e("#pmw-ssp-action-status"),"Pushing configuration…","loading"),u("sync","POST").then(t=>{t.success?(l(e("#pmw-ssp-action-status"),"✓ Config synced successfully. Reloading…","success"),(t=>{if(t){if(t.last_sync_at_formatted&&e("#pmw-ssp-last-sync").text(t.last_sync_at_formatted),t.plan_name){let s=t.plan_name;t.subscription_status&&"active"!==t.subscription_status&&(s+=` <span class="pmw-ssp-badge pmw-ssp-badge--inactive">${t.subscription_status.charAt(0).toUpperCase()+t.subscription_status.slice(1)}</span>`),e("#pmw-ssp-plan-name").html(s)}if(void 0!==t.monthly_request_limit&&t.monthly_request_limit>0){const s=e=>e.toLocaleString();e("#pmw-ssp-usage").text(`${s(t.billable_this_period)} / ${s(t.monthly_request_limit)} events (${t.usage_percent}%)`)}}})(t.status),setTimeout(()=>window.location.reload(),1500)):(l(e("#pmw-ssp-action-status"),t.message||t.data?.message||"Sync failed.","error"),o.prop("disabled",!1).text("Sync Now"))}).catch(t=>{l(e("#pmw-ssp-action-status"),"Network error: "+t.message,"error"),o.prop("disabled",!1).text("Sync Now")})}),i.on("click",function(){i.prop("disabled",!0).text("Testing…"),l(e("#pmw-ssp-action-status"),"Testing proxy connectivity…","loading"),u("test","POST").then(t=>{t.success?l(e("#pmw-ssp-action-status"),"✓ "+t.message,"success"):l(e("#pmw-ssp-action-status"),t.message||"Connection test failed.","error"),i.prop("disabled",!1).text("Test Connection")}).catch(t=>{l(e("#pmw-ssp-action-status"),"Network error: "+t.message,"error"),i.prop("disabled",!1).text("Test Connection")})})})},992(){jQuery(function(){jQuery("#debug-info-button").on("click",()=>{const e=jQuery("#debug-info-textarea")[0];e.select(),e.setSelectionRange(0,99999),pmw.copyTextToClipboard(jQuery("#debug-info-textarea").val());const t=jQuery("#debug-info-success");t.fadeIn(200),setTimeout(()=>t.fadeOut(200),3e3)}),jQuery("#pmw-pro-version-demo").on("click",function(){jQuery("#submit").trigger("click")}),document.getElementById("json-settings-file-input")&&document.getElementById("json-settings-file-input").addEventListener("change",pmw.readSettingsFile,!1),document.getElementById("ga4-data-api-credentials-upload-button")&&document.getElementById("ga4-data-api-credentials-upload-button").addEventListener("change",pmw.readGa4DataApiCredentials,!1),document.getElementById("ga4-data-api-credentials-delete-button")&&document.getElementById("ga4-data-api-credentials-delete-button").addEventListener("click",()=>{pmw.saveGa4DataApiCredentialsToDb({})},!1),jQuery("#wgact_download_logs_zip").on("click",function(e){if(e.preventDefault(),jQuery(this).prop("disabled"))return;const t=jQuery(this).data("source"),s=jQuery(this),n=s.text();s.prop("disabled",!0).text("Downloading..."),fetch(pmwAdminApi.root+"pmw/v1/logs/download",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded","X-WP-Nonce":pmwAdminApi.nonce},body:new URLSearchParams({source:t}),credentials:"same-origin"}).then(e=>{if(!e.ok)throw new Error(`HTTP error! status: ${e.status}`);return e.blob()}).then(e=>{const t=window.URL.createObjectURL(e),a=document.createElement("a");a.href=t,a.download="pmw-logs-"+(new Date).toISOString().slice(0,19).replace(/:/g,"-")+".zip",document.body.appendChild(a),a.click(),window.URL.revokeObjectURL(t),document.body.removeChild(a),s.prop("disabled",!1).text(n)}).catch(e=>{console.error("Download error:",e),s.prop("disabled",!1).text(n),alert("Error downloading log files. Please try again.")})})}),function(e){e.saveSettingsToDisk=()=>{let t=document.getElementById("export-settings-json").value,s="unknown";try{let e=JSON.parse(t);e.timestamp&&(s=e.timestamp)}catch(e){console.warn("Could not extract timestamp from settings:",e)}t=t.replace(/\n/g,"\r\n");let n=new Blob([t],{type:"text/plain"}),a=document.createElement("a");a.download="pixel-manager-settings_"+s+"_"+e.getDateTimeFromTimestamp(s)+".json",a.href=window.URL.createObjectURL(n),a.target="_blank",a.style.display="none",document.body.appendChild(a),a.click(),document.body.removeChild(a)},e.getDateTimeFromTimestamp=t=>{if("unknown"===t||!t||isNaN(t))return e.getCurrentDateForFileName();let s=new Date(1e3*t);if(pmwAdminApi&&pmwAdminApi.timezone&&"number"==typeof pmwAdminApi.timezone.offset){let e=60*pmwAdminApi.timezone.offset*60*1e3;return s=new Date(s.getTime()+e),s.getUTCFullYear()+"."+("0"+(s.getUTCMonth()+1)).slice(-2)+"."+("0"+s.getUTCDate()).slice(-2)+"_"+("0"+s.getUTCHours()).slice(-2)+"-"+("0"+s.getUTCMinutes()).slice(-2)+"-"+("0"+s.getUTCSeconds()).slice(-2)}return s.getFullYear()+"."+("0"+(s.getMonth()+1)).slice(-2)+"."+("0"+s.getDate()).slice(-2)+"_"+("0"+s.getHours()).slice(-2)+"-"+("0"+s.getMinutes()).slice(-2)+"-"+("0"+s.getSeconds()).slice(-2)},e.getCurrentDateForFileName=()=>{let e=new Date;if(pmwAdminApi&&pmwAdminApi.timezone&&"number"==typeof pmwAdminApi.timezone.offset){let t=60*pmwAdminApi.timezone.offset*60*1e3;return e=new Date(e.getTime()+t),e.getUTCFullYear()+"."+("0"+(e.getUTCMonth()+1)).slice(-2)+"."+("0"+e.getUTCDate()).slice(-2)+"_"+("0"+e.getUTCHours()).slice(-2)+"-"+("0"+e.getUTCMinutes()).slice(-2)+"-"+("0"+e.getUTCSeconds()).slice(-2)}return e.getFullYear()+"."+("0"+(e.getMonth()+1)).slice(-2)+"."+("0"+e.getDate()).slice(-2)+"_"+("0"+e.getHours()).slice(-2)+"-"+("0"+e.getMinutes()).slice(-2)+"-"+("0"+e.getSeconds()).slice(-2)},e.readSettingsFile=t=>{let s=t.target.files[0];if(!s)return;let n=new FileReader;n.onload=function(t){try{JSON.parse(t.target.result)}catch(e){return document.getElementById("settings-upload-status-error").style.display="block",void(document.getElementById("settings-upload-status-error-message").innerHTML="Invalid JSON file.")}let s=JSON.parse(t.target.result);e.saveImportedSettingsToDb(s)},n.readAsText(s)},e.saveImportedSettingsToDb=e=>{fetch(pmwAdminApi.root+"pmw/v1/settings/",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":pmwAdminApi.nonce},body:JSON.stringify(e)}).then(e=>e.json()).then(async e=>{e.success?(console.log(e),document.getElementById("settings-upload-status-success").style.display="block",await new Promise(e=>setTimeout(e,1e3)),window.location.reload()):(console.log(e),document.getElementById("settings-upload-status-error").style.display="block")}).catch(e=>{console.error(e),document.getElementById("settings-upload-status-error").style.display="block"})},e.restoreBackup=e=>{console.log("restoreBackup() - timestamp: ",e),fetch(pmwAdminApi.root+"pmw/v1/options-backup/"+e+"/restore",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":pmwAdminApi.nonce}}).then(e=>e.json()).then(async e=>{e?.data?.message&&console.log("restoreBackup() - message: ",e.data.message),e.success?window.location.reload():alert(e.data.message)}).catch(e=>{console.error(e),alert(e.message)})},e.readGa4DataApiCredentials=t=>{let s=t.target.files[0];if(!s)return;let n=new FileReader;n.onload=function(t){try{JSON.parse(t.target.result)}catch(e){return document.getElementById("ga4-api-credentials-upload-status-error").style.display="block",void(document.getElementById("ga4-api-credentials-upload-status-error-message").innerHTML="Invalid JSON file.")}let s=JSON.parse(t.target.result);e.saveGa4DataApiCredentialsToDb(s)},n.readAsText(s)},e.deleteGa4DataApiCredentials=t=>{e.saveGa4DataApiCredentialsToDb({})},e.saveGa4DataApiCredentialsToDb=e=>{fetch(pmwAdminApi.root+"pmw/v1/ga4/data-api/credentials",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":pmwAdminApi.nonce},body:JSON.stringify(e)}).then(e=>e.json()).then(async e=>{e.success?(console.log(e),document.getElementById("ga4-api-credentials-upload-status-success").style.display="block",window.location.reload()):(console.log(e),document.getElementById("ga4-api-credentials-upload-status-error").style.display="block",document.getElementById("ga4-api-credentials-upload-status-error-message").innerHTML="Error message: "+e.data.message)}).catch(e=>{console.error(e),document.getElementById("ga4-api-credentials-upload-status-error").style.display="block"})},e.getAiBotUrl=()=>{if(pmw_cody?.url)return pmw_cody.url},e.loadAiChatWindow=()=>{const t=document.getElementById("pmw-chatbot-panel"),s=document.getElementById("pmw-chatbot-iframe");t&&s?(s.src=e.getAiBotUrl(),document.body.classList.add("pmw-chatbot-open"),t.classList.add("pmw-chatbot-panel-open")):console.error("Chatbot panel elements not found")},e.closeChatbot=()=>{const e=document.getElementById("pmw-chatbot-panel");e&&(e.classList.remove("pmw-chatbot-panel-open"),document.body.classList.remove("pmw-chatbot-open"))},e.codyAvailable=()=>!(void 0===window.pmw_cody||!window.pmw_cody?.available),e.ltvRecalculation=e=>{const t=e=>{let t=document.getElementsByClassName("ltv-message");for(let e=0;e<t.length;e++)t[e].style.display="none";document.getElementById("ltv-message-error").style.display="block",document.getElementById("ltv-message-error-text").innerHTML=e},s=()=>{let e=document.getElementsByClassName("ltv-message");for(let t=0;t<e.length;t++)e[t].style.display="none";document.getElementById("ltv-message-error").style.display="none"};fetch(pmwAdminApi.root+"pmw/v1/ltv/",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":pmwAdminApi.nonce},body:JSON.stringify({action:e.target.dataset.action})}).then(e=>e.json()).then(e=>{e.success?(console.log(e),e.data.status.is_scheduled&&(s(),(()=>{let e=document.getElementsByClassName("ltv-button-text");for(let t=0;t<e.length;t++)e[t].style.display="none";document.getElementById("ltv-instant-recalculation-button-text").style.display="block"})(),document.getElementById("ltv-schedule-recalculation-confirmation-message").style.display="block"),e.data.status.is_running&&(document.getElementById("wgact_ltv_recalculation").disabled=!0,s(),document.getElementById("ltv-running-recalculation-confirmation-message").style.display="block"),e.data.status.is_running||e.data.status.is_scheduled||t(e.data.message)):(console.error(e),t(e.data.message))}).catch(e=>{console.error(e),t(e)})},e.copyTextToClipboard=e=>{navigator.clipboard.writeText(e).catch(e=>{console.error("Failed to copy: ",e)})}}(window.pmw=window.pmw||{},jQuery),document.addEventListener("DOMContentLoaded",()=>{if(pmw.codyAvailable()){const e=document.getElementById("pmw-chatbot-widget");e&&(e.style.display="block");const t=document.getElementById("pmw-chat-li");t&&(t.style.display="list-item");const s=document.getElementById("pmw-chatbot-toggle"),n=document.getElementById("pmw-chatbot-close");s&&s.addEventListener("click",e=>{e.preventDefault(),pmw.loadAiChatWindow()}),n&&n.addEventListener("click",e=>{e.preventDefault(),pmw.closeChatbot()}),document.addEventListener("keydown",e=>{"Escape"===e.key&&pmw.closeChatbot()})}else console.log("DOMContentLoaded - chatbot is not available")},!0),jQuery(()=>{document.querySelector("#wgact_ltv_recalculation")&&document.querySelector("#wgact_ltv_recalculation").addEventListener("click",e=>{e.preventDefault(),pmw.ltvRecalculation(e)}),document.querySelector("#pmw_stop_ltv_calculation")&&document.querySelector("#pmw_stop_ltv_calculation").addEventListener("click",e=>{e.preventDefault(),pmw.ltvRecalculation(e)}),jQuery(()=>{jQuery(document).on("click",".pmw-restore-backup-button",function(e){e.preventDefault();const t=jQuery(this).data("timestamp");t&&pmw.restoreBackup(t)})})}),jQuery(()=>{document.querySelector("#wgact_copy_log_file_links")&&document.querySelector("#wgact_copy_log_file_links").addEventListener("click",e=>{e.preventDefault();const t=JSON.parse(e.target.dataset.links);let s="";for(let e=0,n=t.length;e<n;e++)s+=t[e]+"\n";pmw.copyTextToClipboard(s);let n=document.getElementById("wgact_copy_log_file_links");n.style.width=getComputedStyle(n).width;const a=n.innerHTML;n.innerHTML=e.target.dataset.textCopied,setTimeout(function(){n.innerHTML=a},3e3)})}),jQuery(()=>{jQuery(document).on("keydown","input, textarea, select",function(e){if("Enter"===e.key&&!e.shiftKey&&!e.ctrlKey&&!e.altKey){const t=jQuery(e.target);if(t.is("input")&&t.closest("form").length>0){const s=t.closest("form")[0],n=jQuery(s).find("#submit");n.length>0&&(e.preventDefault(),n.click())}}})})}},t={};function s(n){var a=t[n];if(void 0!==a)return a.exports;var o=t[n]={exports:{}};return e[n](o,o.exports,s),o.exports}s(992),s(348),s(605),s(176),s(939)})();
    22//# sourceMappingURL=pmw-admin.p1.min.js.map
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/js/admin/pmw-admin.p1.min.js.map

    r3447088 r3468312  
    1 {"version":3,"file":"pmw-admin.p1.min.js","mappings":"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","sources":["webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/script-blocker-warning.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/tabs.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/helpers.js","webpack://Pixel-Manager-for-WooCommerce/webpack/bootstrap","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/main.js"],"sourcesContent":["/**\n * Signal that the PMW admin script has loaded successfully.\n *\n * The PHP code sets up a detection mechanism that waits for window.load,\n * then checks if this flag is set. If not, it shows the script blocker warning.\n *\n * This approach ensures:\n * - No false positives on slow-loading pages\n * - Warning only shows when the script is actually blocked\n */\nwindow.pmwAdminScriptLoaded = true;\n","jQuery(function () {\n\n\t// Don't run if we are not one of the\n\t// WPM main tabs\n\tif (\"pmw\" !== pmwGetPageId()) return\n\n\tlet sections    = []\n\tlet subsections = {}\n\n\t// Hide unnecessary elements\n\tjQuery(\".section\").closest(\"tr\").hide()\n\n\t// Collect information on sections\n\tjQuery(\".section\").each(function () {\n\t\tsections.push({\n\t\t\t\"slug\"      : jQuery(this).data(\"sectionSlug\"),\n\t\t\t\"title\"     : jQuery(this).data(\"sectionTitle\"),\n\t\t\t\"badgeCount\": jQuery(this).data(\"badgeCount\") || 0,\n\t\t})\n\t})\n\n\t// Collect information on subsections\n\tjQuery(\".subsection\").each(function () {\n\n\t\tsubsections[jQuery(this).data(\"sectionSlug\")] = subsections[jQuery(this).data(\"sectionSlug\")] || []\n\n\t\tsubsections[jQuery(this).data(\"sectionSlug\")].push({\n\t\t\t\"title\": jQuery(this).data(\"subsectionTitle\"),\n\t\t\t\"slug\" : jQuery(this).data(\"subsectionSlug\"),\n\t\t})\n\t})\n\n\t// Create tabs for sections\n\tsections.forEach(\n\t\tfunction (section) {\n\t\t\tlet badge = section[\"badgeCount\"] > 0 ? \"<span class=\\\"pmw-tab-badge\\\">\" + section[\"badgeCount\"] + \"</span>\" : \"\"\n\t\t\tjQuery(\".nav-tab-wrapper\").append(\"<a href=\\\"#\\\" class=\\\"nav-tab\\\" data-section-slug=\\\"\" + section[\"slug\"] + \"\\\">\" + section[\"title\"] + badge + \"</a>\")\n\t\t})\n\n\t// Create tabs for each subsections\n\tjQuery(\".nav-tab-wrapper\").after(pmwCreateSubtabUlHtml(subsections))\n\n\t// Create on-click events on section tabs that toggle the views\n\tjQuery(\".nav-tab-wrapper a\").on(\"click\", function (e) {\n\n\t\te.preventDefault()\n\n\t\t// show clicked tab as active\n\t\tjQuery(this).addClass(\"nav-tab-active\").siblings().removeClass(\"nav-tab-active\")\n\n\t\t// toggle the sections visible / invisible based on clicked tab\n\n\t\tlet sectionSlug = jQuery(this).data(\"section-slug\")\n\t\tpmwToggleSections(sectionSlug, sections)\n\n\t\t// if subsection exists, click on first subsection\n\t\tif (sectionSlug in subsections) {\n\t\t\tjQuery(\"ul[data-section-slug=\" + sectionSlug + \"]\").children(\":first\").trigger(\"click\")\n\t\t}\n\t})\n\n\t// Create on-click events on subsection tabs that toggle the views\n\tjQuery(\".pmw-subnav-li\").on(\"click\", function (e) {\n\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\n\t\t// jQuery(this).hide();\n\t\tjQuery(this)\n\t\t\t.addClass(\"pmw-subnav-li-active\").removeClass(\"pmw-subnav-li-inactive\")\n\t\t\t.siblings()\n\t\t\t.addClass(\"pmw-subnav-li-inactive\").removeClass(\"pmw-subnav-li-active\")\n\n\t\tpmwToggleSubsection(jQuery(this).parent().data(\"section-slug\"), jQuery(this).data(\"subsection-slug\"))\n\t})\n\n\t/**\n\t * If someone accesses a plugin tab by deep link, open the right tab\n\t * or fallback to default (first tab)\n\t *\n\t * If deeplink is being opened,\n\t * open the according section and subsection\n\t */\n\tif (pmwGetSectionParams()) {\n\n\t\tlet sectionParams = pmwGetSectionParams()\n\n\t\tjQuery(\"a[data-section-slug=\" + sectionParams[\"section\"] + \"]\").trigger(\"click\")\n\n\t\tif (sectionParams[\"subsection\"] !== false) {\n\t\t\tjQuery(\"ul[data-section-slug=\" + sectionParams[\"section\"] + \"]\").children(\"[data-subsection-slug=\" + sectionParams[\"subsection\"] + \"]\").trigger(\"click\")\n\t\t}\n\t} else {\n\t\tjQuery(\"a[data-section-slug=\" + sections[0][\"slug\"] + \"]\").trigger(\"click\")\n\t}\n})\n\n// Creates the html with all subsection elements\npmwCreateSubtabUlHtml = (subsections) => {\n\n\tlet subsectionsKeys = Object.keys(subsections)\n\n\tlet html = \"\"\n\n\tsubsectionsKeys.forEach(function (subsectionKey) {\n\t\thtml += \"<ul class=\\\"pmw-subnav-tabs\\\" data-section-slug=\\\"\" + subsectionKey + \"\\\">\"\n\n\t\tlet subtabs = subsections[subsectionKey]\n\n\t\tsubtabs.forEach(function (subtab) {\n\t\t\thtml += \"<li class=\\\"pmw-subnav-li pmw-subnav-li-inactive\\\" style=\\\"cursor: pointer;\\\" data-subsection-slug=\\\"\" + subtab[\"slug\"] + \"\\\">\" + subtab[\"title\"] + \"</li>\"\n\t\t})\n\n\t\thtml += \"</ul>\"\n\t})\n\n\treturn html\n}\n\n/**\n * If section (and subsection) URL parameters are set,\n * return them, otherwise return false\n */\npmwGetSectionParams = () => {\n\n\tconst queryString = window.location.search\n\tconst urlParams   = new URLSearchParams(queryString)\n\n\tif (urlParams.get(\"section\")) {\n\t\treturn {\n\t\t\t\"section\"   : urlParams.get(\"section\"),\n\t\t\t\"subsection\": urlParams.get(\"subsection\"),\n\t\t}\n\t} else {\n\t\treturn false\n\t}\n}\n\n// Toggles the sections\npmwToggleSections = (sectionSlug, sections) => {\n\n\tjQuery(\"#pmw_settings_form > h2\").nextUntil(\".submit\").andSelf().hide()\n\tjQuery(\".pmw-subnav-tabs\").hide()\n\tjQuery(\".pmw-subnav-tabs[data-section-slug=\" + sectionSlug + \"]\").show()\n\n\tlet sectionPos = sections.findIndex((arrayElement) => arrayElement[\"slug\"] === sectionSlug)\n\n\tjQuery(\"div[data-section-slug=\" + sectionSlug + \"]\").closest(\"table\").prevAll(\"h2:first\").next().nextUntil(\"h2, .submit\").andSelf().show()\n\n\t// set the URL with the active tab parameter\n\tpmwSetUrl(sections[sectionPos][\"slug\"])\n}\n\npmwToggleSubsection = (sectionSlug, subsectionSlug) => {\n\n\tjQuery(\"#pmw_settings_form > h2\").nextUntil(\".submit\").andSelf().hide()\n\tjQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug=\" + subsectionSlug + \"]\").closest(\"tr\").siblings().andSelf().hide()\n\n\tjQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug=\" + subsectionSlug + \"]\").closest(\"table\").show()\n\tjQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug=\" + subsectionSlug + \"]\").closest(\"tr\").nextUntil(jQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug]\").closest(\"tr\")).show()\n\n\t// Set the URL with the active tab parameter\n\tpmwSetUrl(sectionSlug, subsectionSlug)\n}\n\n// Sets the new URL parameters\npmwSetUrl = (sectionSlug, subsectionSlug = \"\") => {\n\n\tconst queryString = window.location.search\n\tconst urlParams   = new URLSearchParams(queryString)\n\n\turlParams.delete(\"section\")\n\turlParams.delete(\"subsection\")\n\n\tlet newParams = \"section=\" + sectionSlug\n\tnewParams += subsectionSlug ? \"&subsection=\" + subsectionSlug : \"\"\n\n\thistory.pushState(\"\", \"pmw\" + sectionSlug, document.location.pathname + \"?page=pmw&\" + newParams)\n\n\t// Make WP remember which was the selected tab on a save and return to the same tab after saving\n\tjQuery(\"input[name =\\\"_wp_http_referer\\\"]\").val(pmwGetAdminPath() + \"?page=pmw&\" + newParams + \"&settings-updated=true\")\n}\n\npmwGetAdminPath = () => {\n\tlet url = new URL(jQuery(\"#wp-admin-canonical\").attr(\"href\"))\n\treturn url.pathname\n}\n\npmwGetPageId = () => {\n\n\tconst queryString = window.location.search\n\tconst urlParams   = new URLSearchParams(queryString)\n\n\treturn urlParams.get(\"page\")\n}\n\n// On click of an element that contains a data-section-slug with any value show an alert box with the text hello\njQuery(document).on(\"click\", \"[data-section-slug]\", function () {\n\n\tconst infoTabs = [\n\t\t\"opportunities\",\n\t\t\"diagnostics\",\n\t\t\"support\",\n\t]\n\n\t// If the data-section-slug value is one of infoTabs, hide the save button, otherwise show it\n\tif (infoTabs.includes(jQuery(this).data(\"section-slug\"))) {\n\t\t// Hide the element with class submit\n\t\tjQuery(\".submit\").hide()\n\t} else {\n\t\t// Show the element with class submit\n\t\tjQuery(\".submit\").show()\n\t}\n})\n\n\n// if a link with the class advanced-section-link is clicked,\n// get the data-AS-section and the data-AS-subsection values of the clicked element\n// and trigger a click on the element with the data-ssection-slug value and a click on the element with the data-subsection-slug value\njQuery(document).on(\"click\", \".advanced-section-link\", (e) => {\n\n\te.preventDefault()\n\n\tlet sectionSlug    = jQuery(e.currentTarget).data(\"as-section\")\n\tlet subsectionSlug = jQuery(e.currentTarget).data(\"as-subsection\")\n\n\tjQuery(`a[data-section-slug=${sectionSlug}]`).trigger(\"click\")\n\n\tjQuery(`ul[data-section-slug=${sectionSlug}]`).children(`[data-subsection-slug=${subsectionSlug}]`).trigger(\"click\")\n})\n","jQuery(function () {\n\n\t/**\n\t * Copy debug info to clipboard when the button is clicked.\n\t */\n\tjQuery(\"#debug-info-button\").on(\"click\", () => {\n\t\t// Select text in textarea\n\t\tconst textarea = jQuery(\"#debug-info-textarea\")[0];\n\t\ttextarea.select();\n\t\ttextarea.setSelectionRange(0, 99999); // For mobile devices\n\n\t\t// Copy selected text to clipboard\n\t\tpmw.copyTextToClipboard(jQuery(\"#debug-info-textarea\").val());\n\n\t\t// Show success message and hide after 3 seconds\n\t\tconst successElement = jQuery(\"#debug-info-success\");\n\t\tsuccessElement.fadeIn(200);\n\t\tsetTimeout(() => successElement.fadeOut(200), 3000);\n\t});\n\n\tjQuery(\"#pmw-pro-version-demo\").on(\"click\", function () {\n\t\tjQuery(\"#submit\").trigger(\"click\");\n\t});\n\n\tif (document.getElementById(\"json-settings-file-input\")) {\n\t\tdocument.getElementById(\"json-settings-file-input\")\n\t\t\t.addEventListener(\"change\", pmw.readSettingsFile, false);\n\t}\n\n\t// if element ga4-data-api-credentials-upload-button exists, then we are on the GA4 settings page\n\tif (document.getElementById(\"ga4-data-api-credentials-upload-button\")) {\n\n\t\tdocument.getElementById(\"ga4-data-api-credentials-upload-button\")\n\t\t\t.addEventListener(\"change\", pmw.readGa4DataApiCredentials, false);\n\t}\n\n\t// if element ga4-data-api-credentials-upload-button exists, then we are on the GA4 settings page\n\tif (document.getElementById(\"ga4-data-api-credentials-delete-button\")) {\n\n\t\tdocument.getElementById(\"ga4-data-api-credentials-delete-button\")\n\t\t\t.addEventListener(\"click\", () => {\n\t\t\t\tpmw.saveGa4DataApiCredentialsToDb({});\n\t\t\t}, false);\n\t}\n\n\t/**\n\t * Handle log files download via REST API\n\t */\n\tjQuery(\"#wgact_download_logs_zip\").on(\"click\", function(e) {\n\t\te.preventDefault();\n\t\t\n\t\tif (jQuery(this).prop(\"disabled\")) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tconst source = jQuery(this).data(\"source\");\n\t\tconst button = jQuery(this);\n\t\tconst originalText = button.text();\n\t\t\n\t\t// Disable button and change text\n\t\tbutton.prop(\"disabled\", true).text(\"Downloading...\");\n\t\t\n\t\t// Use fetch with proper authentication\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/logs/download\", {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded\",\n\t\t\t\t\"X-WP-Nonce\": pmwAdminApi.nonce\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tsource: source\n\t\t\t}),\n\t\t\tcredentials: 'same-origin'\n\t\t})\n\t\t.then(response => {\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`HTTP error! status: ${response.status}`);\n\t\t\t}\n\t\t\treturn response.blob();\n\t\t})\n\t\t.then(blob => {\n\t\t\t// Create download link\n\t\t\tconst url = window.URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement(\"a\");\n\t\t\ta.href = url;\n\t\t\ta.download = \"pmw-logs-\" + new Date().toISOString().slice(0,19).replace(/:/g, \"-\") + \".zip\";\n\t\t\tdocument.body.appendChild(a);\n\t\t\ta.click();\n\t\t\twindow.URL.revokeObjectURL(url);\n\t\t\tdocument.body.removeChild(a);\n\t\t\t\n\t\t\t// Re-enable the button\n\t\t\tbutton.prop(\"disabled\", false).text(originalText);\n\t\t})\n\t\t.catch(error => {\n\t\t\tconsole.error(\"Download error:\", error);\n\t\t\tbutton.prop(\"disabled\", false).text(originalText);\n\t\t\talert(\"Error downloading log files. Please try again.\");\n\t\t});\n\t});\n});\n\n// jQuery(function () {\n//\n// \timport(\"../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs\")\n// \t\t.then(({\n// \t\t\t\t   computePosition,\n// \t\t\t\t   flip,\n// \t\t\t\t   shift,\n// \t\t\t\t   offset,\n// \t\t\tarrow,\n// \t\t\t   }) => {\n// \t\t\tconsole.log(\"computePosition: \", computePosition)\n//\n// \t\t\tconst button = document.querySelector('#button');\n// \t\t\tconst tooltip = document.querySelector('#tooltip');\n// \t\t\tconst arrowElement = document.querySelector('#arrow');\n//\n// \t\t\tcomputePosition(button, tooltip, {\n// \t\t\t\tplacement: 'top',\n// \t\t\t\tmiddleware: [\n// \t\t\t\t\toffset(6),\n// \t\t\t\t\tflip(),\n// \t\t\t\t\tshift({padding: 5}),\n// \t\t\t\t\tarrow({element: arrowElement}),\n// \t\t\t\t],\n// \t\t\t}).then(({x, y}) => {\n// \t\t\t\tObject.assign(tooltip.style, {\n// \t\t\t\t\tleft: `${x}px`,\n// \t\t\t\t\ttop: `${y}px`,\n// \t\t\t\t});\n// \t\t\t});\n//\n// \t\t})\n// \t\t.catch(err => {\n// \t\t\tconsole.error(err)\n// \t\t})\n//\n// });\n\n\n(function (pmw, $, undefined) {\n\n\tpmw.saveSettingsToDisk = () => {\n\t\tlet text = document.getElementById(\"export-settings-json\").value;\n\n\t\t// Extract timestamp from the settings JSON\n\t\tlet timestamp = \"unknown\";\n\t\ttry {\n\t\t\tlet settings = JSON.parse(text);\n\t\t\tif (settings.timestamp) {\n\t\t\t\ttimestamp = settings.timestamp;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"Could not extract timestamp from settings:\", error);\n\t\t}\n\n\t\ttext                 = text.replace(/\\n/g, \"\\r\\n\"); // To retain the Line breaks.\n\t\tlet blob             = new Blob([text], {type: \"text/plain\"});\n\t\tlet anchor           = document.createElement(\"a\");\n\t\tanchor.download      = \"pixel-manager-settings_\" + timestamp + \"_\" + pmw.getDateTimeFromTimestamp(timestamp) + \".json\";\n\t\tanchor.href          = window.URL.createObjectURL(blob);\n\t\tanchor.target        = \"_blank\";\n\t\tanchor.style.display = \"none\"; // just to be safe!\n\t\tdocument.body.appendChild(anchor);\n\t\tanchor.click();\n\t\tdocument.body.removeChild(anchor);\n\t};\n\n\t// Get date and time from timestamp in year.month.day_hour-minute-second format. All components are zero padded.\n\t// Uses WordPress site timezone to match what's displayed on admin pages.\n\tpmw.getDateTimeFromTimestamp = (timestamp) => {\n\t\t// If timestamp is \"unknown\" or invalid, fall back to current date/time\n\t\tif (timestamp === \"unknown\" || !timestamp || isNaN(timestamp)) {\n\t\t\treturn pmw.getCurrentDateForFileName();\n\t\t}\n\n\t\t// Convert Unix timestamp (seconds) to milliseconds for JavaScript Date\n\t\tlet date = new Date(timestamp * 1000);\n\n\t\t// Apply WordPress timezone offset if available\n\t\tif (pmwAdminApi && pmwAdminApi.timezone && typeof pmwAdminApi.timezone.offset === \"number\") {\n\t\t\t// Create new date in WordPress timezone by adding the offset\n\t\t\tlet wpTimezoneOffsetMs = pmwAdminApi.timezone.offset * 60 * 60 * 1000; // Convert hours to milliseconds\n\t\t\tdate                   = new Date(date.getTime() + wpTimezoneOffsetMs);\n\n\t\t\t// Get WordPress timezone date/time components using UTC methods\n\t\t\t// (since we've already applied the offset to the date object)\n\t\t\tlet year    = date.getUTCFullYear();\n\t\t\tlet month   = (\"0\" + (date.getUTCMonth() + 1)).slice(-2);\n\t\t\tlet day     = (\"0\" + date.getUTCDate()).slice(-2);\n\t\t\tlet hours   = (\"0\" + date.getUTCHours()).slice(-2);\n\t\t\tlet minutes = (\"0\" + date.getUTCMinutes()).slice(-2);\n\t\t\tlet seconds = (\"0\" + date.getUTCSeconds()).slice(-2);\n\n\t\t\treturn year + \".\" + month + \".\" + day + \"_\" + hours + \"-\" + minutes + \"-\" + seconds;\n\t\t} else {\n\t\t\t// Fallback to browser local timezone if WordPress timezone data is not available\n\t\t\tlet year    = date.getFullYear();\n\t\t\tlet month   = (\"0\" + (date.getMonth() + 1)).slice(-2);\n\t\t\tlet day     = (\"0\" + date.getDate()).slice(-2);\n\t\t\tlet hours   = (\"0\" + date.getHours()).slice(-2);\n\t\t\tlet minutes = (\"0\" + date.getMinutes()).slice(-2);\n\t\t\tlet seconds = (\"0\" + date.getSeconds()).slice(-2);\n\t\t\treturn year + \".\" + month + \".\" + day + \"_\" + hours + \"-\" + minutes + \"-\" + seconds;\n\t\t}\n\t};\n\n\t// Get current date and time in year.month.day_hour-minute-second format. All components are zero padded.\n\t// Uses WordPress site timezone to match what's displayed on admin pages.\n\tpmw.getCurrentDateForFileName = () => {\n\t\tlet date = new Date();\n\n\t\t// Apply WordPress timezone offset if available\n\t\tif (pmwAdminApi && pmwAdminApi.timezone && typeof pmwAdminApi.timezone.offset === \"number\") {\n\t\t\t// Apply WordPress timezone offset\n\t\t\tlet wpTimezoneOffsetMs = pmwAdminApi.timezone.offset * 60 * 60 * 1000; // Convert hours to milliseconds\n\t\t\tdate                   = new Date(date.getTime() + wpTimezoneOffsetMs);\n\n\t\t\t// Get WordPress timezone date/time components using UTC methods\n\t\t\t// (since we've already applied the offset to the date object)\n\t\t\tlet year    = date.getUTCFullYear();\n\t\t\tlet month   = (\"0\" + (date.getUTCMonth() + 1)).slice(-2);\n\t\t\tlet day     = (\"0\" + date.getUTCDate()).slice(-2);\n\t\t\tlet hours   = (\"0\" + date.getUTCHours()).slice(-2);\n\t\t\tlet minutes = (\"0\" + date.getUTCMinutes()).slice(-2);\n\t\t\tlet seconds = (\"0\" + date.getUTCSeconds()).slice(-2);\n\n\t\t\treturn year + \".\" + month + \".\" + day + \"_\" + hours + \"-\" + minutes + \"-\" + seconds;\n\t\t} else {\n\t\t\t// Fallback to browser local timezone if WordPress timezone data is not available\n\t\t\tlet year    = date.getFullYear();\n\t\t\tlet month   = (\"0\" + (date.getMonth() + 1)).slice(-2);\n\t\t\tlet day     = (\"0\" + date.getDate()).slice(-2);\n\t\t\tlet hours   = (\"0\" + date.getHours()).slice(-2);\n\t\t\tlet minutes = (\"0\" + date.getMinutes()).slice(-2);\n\t\t\tlet seconds = (\"0\" + date.getSeconds()).slice(-2);\n\t\t\treturn year + \".\" + month + \".\" + day + \"_\" + hours + \"-\" + minutes + \"-\" + seconds;\n\t\t}\n\n\t\t// return date.toLocaleDateString(\n\t\t// \t\"en-US\", {\n\t\t// \t\tyear : \"numeric\",\n\t\t// \t\tmonth: \"2-digit\",\n\t\t// \t\tday  : \"2-digit\",\n\t\t// \t},\n\t\t// )\n\t};\n\n\tpmw.readSettingsFile = e => {\n\n\t\tlet file = e.target.files[0];\n\t\tif (!file) return;\n\t\tlet reader    = new FileReader();\n\t\treader.onload = function (e) {\n\n\t\t\t// Check if the file is a valid JSON file\n\t\t\t// If it is not a valid JSON file, display an error message\n\t\t\ttry {\n\t\t\t\tJSON.parse(e.target.result);\n\t\t\t} catch (error) {\n\t\t\t\tdocument.getElementById(\"settings-upload-status-error\").style.display     = \"block\";\n\t\t\t\tdocument.getElementById(\"settings-upload-status-error-message\").innerHTML = \"Invalid JSON file.\";\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet contents = JSON.parse(e.target.result);\n\n\t\t\t// document.getElementById(\"import-settings-json\").textContent = JSON.stringify(contents)\n\n\t\t\tpmw.saveImportedSettingsToDb(contents);\n\t\t};\n\t\treader.readAsText(file);\n\t};\n\n\tpmw.saveImportedSettingsToDb = settings => {\n\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/settings/\", {\n\t\t\tmethod     : \"POST\",\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders    : {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-WP-Nonce\"  : pmwAdminApi.nonce,\n\t\t\t},\n\t\t\tbody       : JSON.stringify(settings),\n\t\t})\n\t\t\t.then(response => response.json())\n\t\t\t.then(async message => {\n\t\t\t\tif (message.success) {\n\t\t\t\t\tconsole.log(message);\n\t\t\t\t\t// reload window\n\t\t\t\t\tdocument.getElementById(\"settings-upload-status-success\").style.display = \"block\";\n\t\t\t\t\t// wait 5 seconds\n\t\t\t\t\tawait new Promise(resolve => setTimeout(resolve, 1000));\n\t\t\t\t\twindow.location.reload();\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(message);\n\t\t\t\t\tdocument.getElementById(\"settings-upload-status-error\").style.display = \"block\";\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(error);\n\t\t\t\tdocument.getElementById(\"settings-upload-status-error\").style.display = \"block\";\n\t\t\t});\n\t};\n\n\tpmw.restoreBackup = (timestamp) => {\n\n\t\tconsole.log(\"restoreBackup() - timestamp: \", timestamp);\n\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/options-backup/\" + timestamp + \"/restore\", {\n\t\t\tmethod     : \"POST\",\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders    : {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-WP-Nonce\"  : pmwAdminApi.nonce,\n\t\t\t},\n\t\t})\n\t\t\t.then(response => response.json())\n\t\t\t.then(async message => {\n\n\t\t\t\tif (message?.data?.message) {\n\t\t\t\t\tconsole.log(\"restoreBackup() - message: \", message.data.message);\n\t\t\t\t}\n\n\t\t\t\tif (message.success) {\n\t\t\t\t\twindow.location.reload();\n\t\t\t\t} else {\n\t\t\t\t\talert(message.data.message);\n\t\t\t\t}\n\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(error);\n\t\t\t\talert(error.message);\n\t\t\t});\n\t};\n\n\tpmw.readGa4DataApiCredentials = e => {\n\n\t\tlet file = e.target.files[0];\n\t\tif (!file) return;\n\t\tlet reader    = new FileReader();\n\t\treader.onload = function (e) {\n\n\t\t\t// Check if the file is a valid JSON file\n\t\t\t// If it is not a valid JSON file, display an error message\n\t\t\ttry {\n\t\t\t\tJSON.parse(e.target.result);\n\t\t\t} catch (error) {\n\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error\").style.display     = \"block\";\n\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error-message\").innerHTML = \"Invalid JSON file.\";\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet contents = JSON.parse(e.target.result);\n\n\t\t\t// document.getElementById(\"import-settings-json\").textContent = JSON.stringify(contents)\n\n\t\t\tpmw.saveGa4DataApiCredentialsToDb(contents);\n\t\t};\n\t\treader.readAsText(file);\n\t};\n\n\tpmw.deleteGa4DataApiCredentials = e => {\n\t\tpmw.saveGa4DataApiCredentialsToDb({});\n\t};\n\n\tpmw.saveGa4DataApiCredentialsToDb = credentials => {\n\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/ga4/data-api/credentials\", {\n\t\t\tmethod     : \"POST\",\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders    : {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-WP-Nonce\"  : pmwAdminApi.nonce,\n\t\t\t},\n\t\t\tbody       : JSON.stringify(credentials),\n\t\t})\n\t\t\t.then(response => response.json())\n\t\t\t.then(async responseJson => {\n\t\t\t\tif (responseJson.success) {\n\t\t\t\t\tconsole.log(responseJson);\n\t\t\t\t\t// reload window\n\t\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-success\").style.display = \"block\";\n\t\t\t\t\t// wait 5 seconds\n\t\t\t\t\t// await new Promise(resolve => setTimeout(resolve, 5000))\n\t\t\t\t\twindow.location.reload();\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(responseJson);\n\t\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error\").style.display     = \"block\";\n\t\t\t\t\t// and add the error message\n\t\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error-message\").innerHTML = \"Error message: \" + responseJson.data.message;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(error);\n\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error\").style.display = \"block\";\n\t\t\t});\n\t};\n\n\tpmw.getAiBotUrl = () => {\n\t\tif (pmw_cody?.url) {\n\t\t\treturn pmw_cody.url;\n\t\t}\n\t};\n\n\t/**\n\t * Opens the chatbot in a side panel (like n8n)\n\t * The panel slides in from the right side of the screen\n\t */\n\tpmw.loadAiChatWindow = () => {\n\t\tconst panel = document.getElementById(\"pmw-chatbot-panel\");\n\t\tconst iframe = document.getElementById(\"pmw-chatbot-iframe\");\n\n\t\tif (!panel || !iframe) {\n\t\t\tconsole.error(\"Chatbot panel elements not found\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Set the iframe source\n\t\tiframe.src = pmw.getAiBotUrl();\n\n\t\t// Add body class to push content left\n\t\tdocument.body.classList.add(\"pmw-chatbot-open\");\n\n\t\t// Open the panel\n\t\tpanel.classList.add(\"pmw-chatbot-panel-open\");\n\t};\n\n\t/**\n\t * Closes the chatbot side panel\n\t */\n\tpmw.closeChatbot = () => {\n\t\tconst panel = document.getElementById(\"pmw-chatbot-panel\");\n\t\tif (panel) {\n\t\t\tpanel.classList.remove(\"pmw-chatbot-panel-open\");\n\t\t\t// Remove body class to restore content position\n\t\t\tdocument.body.classList.remove(\"pmw-chatbot-open\");\n\t\t}\n\t};\n\n\t/**\n\t * Check if the Cody AI chatbot is available.\n\t *\n\t * @return {boolean}\n\t */\n\tpmw.codyAvailable = () => {\n\t\tif (typeof window.pmw_cody !== \"undefined\" && window.pmw_cody?.available) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\t// Schedule a recalculation of the LTV by sending a POST REST request to the server\n\tpmw.ltvRecalculation = event => {\n\n\t\tconst displayStatusMessage = (message) => {\n\t\t\tlet elements = document.getElementsByClassName(\"ltv-message\");\n\t\t\tfor (let i = 0; i < elements.length; i++) {\n\t\t\t\telements[i].style.display = \"none\";\n\t\t\t}\n\t\t\tdocument.getElementById(\"ltv-message-error\").style.display  = \"block\";\n\t\t\tdocument.getElementById(\"ltv-message-error-text\").innerHTML = message;\n\t\t};\n\n\t\tconst displayRunImmediatelyButton = () => {\n\t\t\tlet elements = document.getElementsByClassName(\"ltv-button-text\");\n\t\t\tfor (let i = 0; i < elements.length; i++) {\n\t\t\t\telements[i].style.display = \"none\";\n\t\t\t}\n\t\t\tdocument.getElementById(\"ltv-instant-recalculation-button-text\").style.display = \"block\";\n\t\t};\n\n\t\tconst removeAllMessages = () => {\n\t\t\tlet elements = document.getElementsByClassName(\"ltv-message\");\n\t\t\tfor (let i = 0; i < elements.length; i++) {\n\t\t\t\telements[i].style.display = \"none\";\n\t\t\t}\n\n\t\t\tdocument.getElementById(\"ltv-message-error\").style.display = \"none\";\n\t\t};\n\n\t\t// console log the data-action from the nested span element of the clicked element\n\t\t// console.log(\"event.target.dataset.action\", event.target.dataset.action)\n\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/ltv/\", {\n\t\t\tmethod     : \"POST\",\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders    : {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-WP-Nonce\"  : pmwAdminApi.nonce,\n\t\t\t},\n\t\t\tbody       : JSON.stringify({\n\t\t\t\t\"action\": event.target.dataset.action,\n\t\t\t}),\n\t\t})\n\t\t\t.then(response => response.json())\n\t\t\t.then(message => {\n\t\t\t\tif (message.success) {\n\t\t\t\t\tconsole.log(message);\n\t\t\t\t\t// reload window\n\n\t\t\t\t\tif (message.data.status.is_scheduled) {\n\t\t\t\t\t\tremoveAllMessages();\n\t\t\t\t\t\tdisplayRunImmediatelyButton();\n\t\t\t\t\t\tdocument.getElementById(\"ltv-schedule-recalculation-confirmation-message\").style.display = \"block\";\n\t\t\t\t\t}\n\n\t\t\t\t\tif (message.data.status.is_running) {\n\t\t\t\t\t\t// Get the button element with the id \"wgact_ltv_recalculation\" and disable it\n\t\t\t\t\t\tdocument.getElementById(\"wgact_ltv_recalculation\").disabled = true;\n\t\t\t\t\t\tremoveAllMessages();\n\t\t\t\t\t\tdocument.getElementById(\"ltv-running-recalculation-confirmation-message\").style.display = \"block\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// if is neither message.data.status.is_running nor message.data.status.is_scheduled\n\t\t\t\t\t// then display the error message\n\t\t\t\t\tif (!message.data.status.is_running && !message.data.status.is_scheduled) {\n\t\t\t\t\t\tdisplayStatusMessage(message.data.message);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(message);\n\t\t\t\t\tdisplayStatusMessage(message.data.message);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(error);\n\t\t\t\tdisplayStatusMessage(error);\n\t\t\t});\n\t};\n\n\tpmw.copyTextToClipboard = (text) => {\n\t\tnavigator.clipboard.writeText(text)\n\t\t\t.catch(err => {\n\t\t\t\tconsole.error(\"Failed to copy: \", err);\n\t\t\t});\n\t};\n\n}(window.pmw = window.pmw || {}, jQuery));\n\n/**\n * This script listens for the DOMContentLoaded event. Once the DOM is fully loaded,\n * it checks if the chatbot (pmw.codyAvailable()) is available.\n * If the chatbot is available, it displays the chat widget button.\n * If the chatbot is not available, it logs a message to the console indicating that the chatbot is unavailable.\n *\n * @listens document#DOMContentLoaded\n */\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n\n\tif (pmw.codyAvailable()) {\n\t\tconst chatbotWidget = document.getElementById(\"pmw-chatbot-widget\");\n\t\tif (chatbotWidget) {\n\t\t\tchatbotWidget.style.display = \"block\";\n\t\t}\n\n\t\t// Show the chatbot line in the support section\n\t\tconst chatbotListItem = document.getElementById(\"pmw-chat-li\");\n\t\tif (chatbotListItem) {\n\t\t\tchatbotListItem.style.display = \"list-item\";\n\t\t}\n\n\t\t// Set up event listeners for the chatbot widget\n\t\tconst chatbotToggle = document.getElementById(\"pmw-chatbot-toggle\");\n\t\tconst chatbotClose = document.getElementById(\"pmw-chatbot-close\");\n\n\t\tif (chatbotToggle) {\n\t\t\tchatbotToggle.addEventListener(\"click\", (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tpmw.loadAiChatWindow();\n\t\t\t});\n\t\t}\n\n\t\tif (chatbotClose) {\n\t\t\tchatbotClose.addEventListener(\"click\", (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tpmw.closeChatbot();\n\t\t\t});\n\t\t}\n\n\t\t// Close chatbot on ESC key\n\t\tdocument.addEventListener(\"keydown\", (event) => {\n\t\t\tif (event.key === \"Escape\") {\n\t\t\t\tpmw.closeChatbot();\n\t\t\t}\n\t\t});\n\t} else {\n\t\tconsole.log(\"DOMContentLoaded - chatbot is not available\");\n\t}\n\n}, true);\n\n// Wait until the DOM is loaded, then console log\n// the message \"DOMContentLoaded - chatbot is not available\"\n// use jquery\njQuery(() => {\n\tif (document.querySelector(\"#wgact_ltv_recalculation\")) {\n\t\tdocument.querySelector(\"#wgact_ltv_recalculation\").addEventListener(\"click\", event => {\n\t\t\tevent.preventDefault();\n\t\t\tpmw.ltvRecalculation(event);\n\t\t});\n\t}\n\n\tif (document.querySelector(\"#pmw_stop_ltv_calculation\")) {\n\t\tdocument.querySelector(\"#pmw_stop_ltv_calculation\").addEventListener(\"click\", event => {\n\t\t\tevent.preventDefault();\n\t\t\tpmw.ltvRecalculation(event);\n\t\t});\n\t}\n\n\t// Add event listeners for backup restore buttons\n\tjQuery(() => {\n\t\tjQuery(document).on(\"click\", \".pmw-restore-backup-button\", function (event) {\n\t\t\tevent.preventDefault();\n\t\t\tconst timestamp = jQuery(this).data(\"timestamp\");\n\t\t\tif (timestamp) {\n\t\t\t\tpmw.restoreBackup(timestamp);\n\t\t\t}\n\t\t});\n\t});\n});\n\n/**\n * add an event listener to the button with the id \"wgact_copy_log_file_links\"\n * when the button is clicked, copy the log file links to the clipboard\n * the data-links attribute of the button contains a json string with the links\n */\njQuery(() => {\n\n\tif (!document.querySelector(\"#wgact_copy_log_file_links\")) {\n\t\treturn;\n\t}\n\n\tdocument.querySelector(\"#wgact_copy_log_file_links\").addEventListener(\"click\", event => {\n\t\tevent.preventDefault();\n\n\t\tconst jsonOfLinks = JSON.parse(event.target.dataset.links);\n\n\t\tlet strOfLinks = \"\";\n\n\t\tfor (let i = 0, len = jsonOfLinks.length; i < len; i++) {\n\t\t\tstrOfLinks += jsonOfLinks[i] + \"\\n\";\n\t\t}\n\n\t\tpmw.copyTextToClipboard(strOfLinks);\n\n\t\t// make the button text change to \"Copied!\" and keep the same width and text for 3 seconds\n\t\tlet button         = document.getElementById(\"wgact_copy_log_file_links\");\n\t\tbutton.style.width = getComputedStyle(button).width;\n\t\tconst originalText = button.innerHTML;\n\t\tbutton.innerHTML   = event.target.dataset.textCopied;\n\t\tsetTimeout(function () {\n\t\t\tbutton.innerHTML = originalText;\n\t\t}, 3000);\n\t});\n});\n\n// on pressing enter in form inputs, click the submit button\njQuery(() => {\n\tjQuery(document).on(\"keydown\", \"input, textarea, select\", function (event) {\n\t\tif (event.key === \"Enter\" && !event.shiftKey && !event.ctrlKey && !event.altKey) {\n\t\t\t// Only trigger submit if we're in a form and not in a textarea (where Enter should create new lines)\n\t\t\tconst $target = jQuery(event.target);\n\t\t\tif ($target.is(\"input\") && $target.closest(\"form\").length > 0) {\n\t\t\t\tconst form = $target.closest(\"form\")[0];\n\t\t\t\tconst submitButton = jQuery(form).find(\"#submit\");\n\t\t\t\tif (submitButton.length > 0) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tsubmitButton.click();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n});\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Combine all admin scripts\n * (which only run on the wpm pages)\n */\n\n// require(\"./environment-check\")\nrequire(\"./helpers\")\nrequire(\"./script-blocker-warning\")\nrequire(\"./tabs\")\n\n// #if process.env.TIER === 'premium'\n// // require(\"./helpers_premium\")\n// #endif\n\n// console.log('Pixel Manager for WooCommerce admin script')\n"],"names":["window","pmwAdminScriptLoaded","jQuery","pmwGetPageId","sections","subsections","closest","hide","each","push","this","data","forEach","section","badge","append","after","pmwCreateSubtabUlHtml","on","e","preventDefault","addClass","siblings","removeClass","sectionSlug","pmwToggleSections","children","trigger","stopPropagation","pmwToggleSubsection","parent","pmwGetSectionParams","sectionParams","subsectionsKeys","Object","keys","html","subsectionKey","subtab","queryString","location","search","urlParams","URLSearchParams","get","nextUntil","andSelf","show","sectionPos","findIndex","arrayElement","prevAll","next","pmwSetUrl","subsectionSlug","delete","newParams","history","pushState","document","pathname","val","pmwGetAdminPath","URL","attr","includes","currentTarget","textarea","select","setSelectionRange","pmw","copyTextToClipboard","successElement","fadeIn","setTimeout","fadeOut","getElementById","addEventListener","readSettingsFile","readGa4DataApiCredentials","saveGa4DataApiCredentialsToDb","prop","source","button","originalText","text","fetch","pmwAdminApi","root","method","headers","nonce","body","credentials","then","response","ok","Error","status","blob","url","createObjectURL","a","createElement","href","download","Date","toISOString","slice","replace","appendChild","click","revokeObjectURL","removeChild","catch","error","console","alert","saveSettingsToDisk","value","timestamp","settings","JSON","parse","warn","Blob","type","anchor","getDateTimeFromTimestamp","target","style","display","isNaN","getCurrentDateForFileName","date","timezone","offset","wpTimezoneOffsetMs","getTime","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","file","files","reader","FileReader","onload","result","innerHTML","contents","saveImportedSettingsToDb","readAsText","stringify","json","async","message","success","log","Promise","resolve","reload","restoreBackup","deleteGa4DataApiCredentials","responseJson","getAiBotUrl","pmw_cody","loadAiChatWindow","panel","iframe","src","classList","add","closeChatbot","remove","codyAvailable","available","ltvRecalculation","event","displayStatusMessage","elements","getElementsByClassName","i","length","removeAllMessages","dataset","action","is_scheduled","displayRunImmediatelyButton","is_running","disabled","navigator","clipboard","writeText","err","chatbotWidget","chatbotListItem","chatbotToggle","chatbotClose","key","querySelector","jsonOfLinks","links","strOfLinks","len","width","getComputedStyle","textCopied","shiftKey","ctrlKey","altKey","$target","is","form","submitButton","find","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","require"],"ignoreList":[],"sourceRoot":""}
     1{"version":3,"file":"pmw-admin.p1.min.js","mappings":"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","sources":["webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/save.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/script-blocker-warning.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/tabs.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/ssp.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/helpers.js","webpack://Pixel-Manager-for-WooCommerce/webpack/bootstrap","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/admin/main.js"],"sourcesContent":["/**\n * AJAX settings save handler.\n *\n * Intercepts the form submit, serializes all fields (PMW core + add-on tabs),\n * and POSTs to the REST endpoint. Displays success/error notices inline.\n *\n * @since 1.57.0\n */\n\njQuery(function ($) {\n\n\tconst $form = $(\"#pmw_settings_form\")\n\n\tif (!$form.length) return\n\n\t$form.on(\"submit\", function (e) {\n\t\te.preventDefault()\n\n\t\tconst $submitBtn    = $form.find(\"#submit\")\n\t\tconst originalLabel = $submitBtn.val()\n\n\t\t// Disable button and show loading state\n\t\t$submitBtn.prop(\"disabled\", true).val(\"Saving…\")\n\n\t\t// Remove any previous notices\n\t\t$(\".pmw-save-notice\").remove()\n\n\t\t// Serialize the entire form (captures all tabs including hidden checkbox fallbacks)\n\t\tconst formData = $form.serialize()\n\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/options/save\", {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded\",\n\t\t\t\t\"X-WP-Nonce\": pmwAdminApi.nonce,\n\t\t\t},\n\t\t\tbody: formData,\n\t\t})\n\t\t\t.then(response => response.json())\n\t\t\t.then(data => {\n\n\t\t\t\tif (data.success && (!data.errors || data.errors.length === 0)) {\n\t\t\t\t\t// Reload the page to refresh PHP-rendered dynamic state (active/inactive badges, etc.)\n\t\t\t\t\t// The current tab is preserved via the URL params set by pmwSetUrl()\n\t\t\t\t\twindow.location.reload()\n\t\t\t\t} else {\n\t\t\t\t\tlet errorHtml = data.message || \"Settings saved with errors.\"\n\n\t\t\t\t\tif (data.errors && data.errors.length > 0) {\n\t\t\t\t\t\terrorHtml += \"<ul style=\\\"margin: 4px 0 0 16px; list-style: disc;\\\">\"\n\t\t\t\t\t\tdata.errors.forEach(function (err) {\n\t\t\t\t\t\t\terrorHtml += \"<li>\" + err + \"</li>\"\n\t\t\t\t\t\t})\n\t\t\t\t\t\terrorHtml += \"</ul>\"\n\t\t\t\t\t}\n\n\t\t\t\t\tpmwShowSaveNotice(\"error\", errorHtml)\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tconsole.error(\"PMW settings save error:\", err)\n\t\t\t\tpmwShowSaveNotice(\"error\", \"An unexpected error occurred while saving settings. Please try again.\")\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\t$submitBtn.prop(\"disabled\", false).val(originalLabel)\n\t\t\t})\n\t})\n\n\t/**\n\t * Show a WordPress-style admin notice after save.\n\t *\n\t * @param {string} type    \"success\" or \"error\"\n\t * @param {string} message The HTML message to display\n\t */\n\tfunction pmwShowSaveNotice(type, message) {\n\t\tconst noticeClass = type === \"success\" ? \"notice-success\" : \"notice-error\"\n\n\t\tconst $notice = $(\n\t\t\t\"<div class=\\\"notice \" + noticeClass + \" is-dismissible pmw-save-notice\\\" style=\\\"margin: 10px 0;\\\">\" +\n\t\t\t\"<p>\" + message + \"</p>\" +\n\t\t\t\"<button type=\\\"button\\\" class=\\\"notice-dismiss\\\"><span class=\\\"screen-reader-text\\\">Dismiss this notice.</span></button>\" +\n\t\t\t\"</div>\"\n\t\t)\n\n\t\t// Insert after the tab wrapper\n\t\t$(\".nav-tab-wrapper\").after($notice)\n\n\t\t// Dismiss handler\n\t\t$notice.find(\".notice-dismiss\").on(\"click\", function () {\n\t\t\t$notice.fadeOut(200, function () {\n\t\t\t\t$(this).remove()\n\t\t\t})\n\t\t})\n\n\t\t// Auto-dismiss success notices after 5 seconds\n\t\tif (type === \"success\") {\n\t\t\tsetTimeout(function () {\n\t\t\t\t$notice.fadeOut(400, function () {\n\t\t\t\t\t$(this).remove()\n\t\t\t\t})\n\t\t\t}, 5000)\n\t\t}\n\n\t\t// Scroll to notice\n\t\t$(\"html, body\").animate({ scrollTop: $notice.offset().top - 50 }, 300)\n\t}\n})\n","/**\n * Signal that the PMW admin script has loaded successfully.\n *\n * The PHP code sets up a detection mechanism that waits for window.load,\n * then checks if this flag is set. If not, it shows the script blocker warning.\n *\n * This approach ensures:\n * - No false positives on slow-loading pages\n * - Warning only shows when the script is actually blocked\n */\nwindow.pmwAdminScriptLoaded = true;\n","jQuery(function () {\n\n\t// Don't run if we are not one of the\n\t// WPM main tabs\n\tif (\"pmw\" !== pmwGetPageId()) return\n\n\tlet sections    = []\n\tlet subsections = {}\n\n\t// Hide unnecessary elements\n\tjQuery(\".section\").closest(\"tr\").hide()\n\n\t// Collect information on sections\n\tjQuery(\".section\").each(function () {\n\t\tsections.push({\n\t\t\t\"slug\"          : jQuery(this).data(\"sectionSlug\"),\n\t\t\t\"title\"         : jQuery(this).data(\"sectionTitle\"),\n\t\t\t\"badgeCount\"    : jQuery(this).data(\"badgeCount\") || 0,\n\t\t\t\"priority\"      : parseInt(jQuery(this).data(\"priority\"), 10) || 50,\n\t\t\t\"showSaveButton\": jQuery(this).data(\"showSaveButton\"),\n\t\t})\n\t})\n\n\t// Sort sections by priority (ascending)\n\tsections.sort(function (a, b) {\n\t\treturn a.priority - b.priority\n\t})\n\n\t// Collect information on subsections\n\tjQuery(\".subsection\").each(function () {\n\n\t\tsubsections[jQuery(this).data(\"sectionSlug\")] = subsections[jQuery(this).data(\"sectionSlug\")] || []\n\n\t\tsubsections[jQuery(this).data(\"sectionSlug\")].push({\n\t\t\t\"title\": jQuery(this).data(\"subsectionTitle\"),\n\t\t\t\"slug\" : jQuery(this).data(\"subsectionSlug\"),\n\t\t})\n\t})\n\n\t// Create tabs for sections\n\tsections.forEach(\n\t\tfunction (section) {\n\t\t\tlet badge = section[\"badgeCount\"] > 0 ? \"<span class=\\\"pmw-tab-badge\\\">\" + section[\"badgeCount\"] + \"</span>\" : \"\"\n\t\t\tjQuery(\".nav-tab-wrapper\").append(\"<a href=\\\"#\\\" class=\\\"nav-tab\\\" data-section-slug=\\\"\" + section[\"slug\"] + \"\\\">\" + section[\"title\"] + badge + \"</a>\")\n\t\t})\n\n\t// Create tabs for each subsections\n\tjQuery(\".nav-tab-wrapper\").after(pmwCreateSubtabUlHtml(subsections))\n\n\t// Create on-click events on section tabs that toggle the views\n\tjQuery(\".nav-tab-wrapper a\").on(\"click\", function (e) {\n\n\t\te.preventDefault()\n\n\t\t// show clicked tab as active\n\t\tjQuery(this).addClass(\"nav-tab-active\").siblings().removeClass(\"nav-tab-active\")\n\n\t\t// toggle the sections visible / invisible based on clicked tab\n\n\t\tlet sectionSlug = jQuery(this).data(\"section-slug\")\n\t\tpmwToggleSections(sectionSlug, sections)\n\n\t\t// if subsection exists, click on first subsection\n\t\tif (sectionSlug in subsections) {\n\t\t\tjQuery(\"ul[data-section-slug=\" + sectionSlug + \"]\").children(\":first\").trigger(\"click\")\n\t\t}\n\t})\n\n\t// Create on-click events on subsection tabs that toggle the views\n\tjQuery(\".pmw-subnav-li\").on(\"click\", function (e) {\n\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\n\t\t// jQuery(this).hide();\n\t\tjQuery(this)\n\t\t\t.addClass(\"pmw-subnav-li-active\").removeClass(\"pmw-subnav-li-inactive\")\n\t\t\t.siblings()\n\t\t\t.addClass(\"pmw-subnav-li-inactive\").removeClass(\"pmw-subnav-li-active\")\n\n\t\tpmwToggleSubsection(jQuery(this).parent().data(\"section-slug\"), jQuery(this).data(\"subsection-slug\"))\n\t})\n\n\t/**\n\t * If someone accesses a plugin tab by deep link, open the right tab\n\t * or fallback to default (first tab)\n\t *\n\t * If deeplink is being opened,\n\t * open the according section and subsection\n\t */\n\tif (pmwGetSectionParams()) {\n\n\t\tlet sectionParams = pmwGetSectionParams()\n\n\t\tjQuery(\"a[data-section-slug=\" + sectionParams[\"section\"] + \"]\").trigger(\"click\")\n\n\t\tif (sectionParams[\"subsection\"] !== false) {\n\t\t\tjQuery(\"ul[data-section-slug=\" + sectionParams[\"section\"] + \"]\").children(\"[data-subsection-slug=\" + sectionParams[\"subsection\"] + \"]\").trigger(\"click\")\n\t\t}\n\t} else {\n\t\tjQuery(\"a[data-section-slug=\" + sections[0][\"slug\"] + \"]\").trigger(\"click\")\n\t}\n})\n\n// Creates the html with all subsection elements\npmwCreateSubtabUlHtml = (subsections) => {\n\n\tlet subsectionsKeys = Object.keys(subsections)\n\n\tlet html = \"\"\n\n\tsubsectionsKeys.forEach(function (subsectionKey) {\n\t\thtml += \"<ul class=\\\"pmw-subnav-tabs\\\" data-section-slug=\\\"\" + subsectionKey + \"\\\">\"\n\n\t\tlet subtabs = subsections[subsectionKey]\n\n\t\tsubtabs.forEach(function (subtab) {\n\t\t\thtml += \"<li class=\\\"pmw-subnav-li pmw-subnav-li-inactive\\\" style=\\\"cursor: pointer;\\\" data-subsection-slug=\\\"\" + subtab[\"slug\"] + \"\\\">\" + subtab[\"title\"] + \"</li>\"\n\t\t})\n\n\t\thtml += \"</ul>\"\n\t})\n\n\treturn html\n}\n\n/**\n * If section (and subsection) URL parameters are set,\n * return them, otherwise return false\n */\npmwGetSectionParams = () => {\n\n\tconst queryString = window.location.search\n\tconst urlParams   = new URLSearchParams(queryString)\n\n\tif (urlParams.get(\"section\")) {\n\t\treturn {\n\t\t\t\"section\"   : urlParams.get(\"section\"),\n\t\t\t\"subsection\": urlParams.get(\"subsection\"),\n\t\t}\n\t} else {\n\t\treturn false\n\t}\n}\n\n// Toggles the sections\npmwToggleSections = (sectionSlug, sections) => {\n\n\tjQuery(\"#pmw_settings_form > h2\").nextUntil(\".submit\").andSelf().hide()\n\tjQuery(\".pmw-subnav-tabs\").hide()\n\tjQuery(\".pmw-subnav-tabs[data-section-slug=\" + sectionSlug + \"]\").show()\n\n\tlet sectionPos = sections.findIndex((arrayElement) => arrayElement[\"slug\"] === sectionSlug)\n\n\tjQuery(\"div[data-section-slug=\" + sectionSlug + \"]\").closest(\"table\").prevAll(\"h2:first\").next().nextUntil(\"h2, .submit\").andSelf().show()\n\n\t// set the URL with the active tab parameter\n\tpmwSetUrl(sections[sectionPos][\"slug\"])\n}\n\npmwToggleSubsection = (sectionSlug, subsectionSlug) => {\n\n\tjQuery(\"#pmw_settings_form > h2\").nextUntil(\".submit\").andSelf().hide()\n\tjQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug=\" + subsectionSlug + \"]\").closest(\"tr\").siblings().andSelf().hide()\n\n\tjQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug=\" + subsectionSlug + \"]\").closest(\"table\").show()\n\tjQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug=\" + subsectionSlug + \"]\").closest(\"tr\").nextUntil(jQuery(\"[data-section-slug=\" + sectionSlug + \"][data-subsection-slug]\").closest(\"tr\")).show()\n\n\t// Set the URL with the active tab parameter\n\tpmwSetUrl(sectionSlug, subsectionSlug)\n}\n\n// Sets the new URL parameters\npmwSetUrl = (sectionSlug, subsectionSlug = \"\") => {\n\n\tconst queryString = window.location.search\n\tconst urlParams   = new URLSearchParams(queryString)\n\n\turlParams.delete(\"section\")\n\turlParams.delete(\"subsection\")\n\n\tlet newParams = \"section=\" + sectionSlug\n\tnewParams += subsectionSlug ? \"&subsection=\" + subsectionSlug : \"\"\n\n\thistory.pushState(\"\", \"pmw\" + sectionSlug, document.location.pathname + \"?page=pmw&\" + newParams)\n\n}\n\npmwGetPageId = () => {\n\n\tconst queryString = window.location.search\n\tconst urlParams   = new URLSearchParams(queryString)\n\n\treturn urlParams.get(\"page\")\n}\n\n// On click of an element that contains a data-section-slug with any value, toggle save button\njQuery(document).on(\"click\", \"[data-section-slug]\", function () {\n\n\t// Find the section config to check showSaveButton attribute\n\tconst sectionSlug = jQuery(this).data(\"sectionSlug\") || jQuery(this).data(\"section-slug\")\n\tconst $sectionDiv = jQuery(\".section[data-section-slug='\" + sectionSlug + \"']\")\n\n\tif ($sectionDiv.length && $sectionDiv.data(\"showSaveButton\") == 0) {\n\t\tjQuery(\".submit\").hide()\n\t} else {\n\t\tjQuery(\".submit\").show()\n\t}\n})\n\n\n// if a link with the class advanced-section-link is clicked,\n// get the data-AS-section and the data-AS-subsection values of the clicked element\n// and trigger a click on the element with the data-ssection-slug value and a click on the element with the data-subsection-slug value\njQuery(document).on(\"click\", \".advanced-section-link\", (e) => {\n\n\te.preventDefault()\n\n\tlet sectionSlug    = jQuery(e.currentTarget).data(\"as-section\")\n\tlet subsectionSlug = jQuery(e.currentTarget).data(\"as-subsection\")\n\n\tjQuery(`a[data-section-slug=${sectionSlug}]`).trigger(\"click\")\n\n\tjQuery(`ul[data-section-slug=${sectionSlug}]`).children(`[data-subsection-slug=${subsectionSlug}]`).trigger(\"click\")\n})\n","/**\n * SSP (Server Side Proxy) admin tab interactions.\n *\n * Handles activate, enable/disable toggle, disconnect,\n * sync, test connection, and proxy failure behavior setting.\n *\n * @since 1.57.0\n */\n\njQuery(function ($) {\n\n\tconst $activateBtn    = $(\"#pmw-ssp-activate-btn\")\n\tconst $reactivateBtn  = $(\"#pmw-ssp-reactivate-btn\")\n\tconst $disableBtn     = $(\"#pmw-ssp-disable-btn\")\n\tconst $disconnectBtn  = $(\"#pmw-ssp-disconnect-btn\")\n\tconst $syncBtn        = $(\"#pmw-ssp-sync-btn\")\n\tconst $testBtn        = $(\"#pmw-ssp-test-btn\")\n\tconst $tokenInput     = $(\"#pmw-ssp-sync-token\")\n\tconst $failureBehavior = $(\"#pmw-ssp-failure-behavior\")\n\n\t// If no SSP elements exist on the page, bail early\n\tif (!$activateBtn.length && !$syncBtn.length) return\n\n\tconst showStatus = ($el, message, type) => {\n\t\tconst className = type === \"success\"\n\t\t\t? \"pmw-ssp-msg-success\"\n\t\t\t: type === \"error\"\n\t\t\t\t? \"pmw-ssp-msg-error\"\n\t\t\t\t: \"pmw-ssp-msg-loading\"\n\n\t\t$el.html(`<span class=\"${className}\">${message}</span>`)\n\t}\n\n\tconst clearStatus = ($el) => {\n\t\t$el.html(\"\")\n\t}\n\n\tconst apiCall = (endpoint, method, body) => {\n\t\tconst opts = {\n\t\t\tmethod,\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-WP-Nonce\": pmwAdminApi.nonce,\n\t\t\t},\n\t\t}\n\n\t\tif (body) {\n\t\t\topts.body = JSON.stringify(body)\n\t\t}\n\n\t\treturn fetch(pmwAdminApi.root + \"pmw/v1/ssp/\" + endpoint, opts)\n\t\t\t.then(response => response.json())\n\t}\n\n\t// ─── Activate ──────────────────────────────────────────\n\n\t$activateBtn.on(\"click\", function () {\n\t\tconst token = $.trim($tokenInput.val())\n\n\t\tif (!token) {\n\t\t\tshowStatus($(\"#pmw-ssp-activate-status\"), \"Please enter a sync token.\", \"error\")\n\t\t\treturn\n\t\t}\n\n\t\t// Basic hex validation\n\t\tif (!/^[a-f0-9]{32,64}$/i.test(token)) {\n\t\t\tshowStatus($(\"#pmw-ssp-activate-status\"), \"Invalid token format. Expected a hex string (32-64 characters).\", \"error\")\n\t\t\treturn\n\t\t}\n\n\t\t$activateBtn.prop(\"disabled\", true).text(\"Activating…\")\n\t\tclearStatus($(\"#pmw-ssp-activate-status\"))\n\n\t\tapiCall(\"activate\", \"POST\", { sync_token: token })\n\t\t\t.then(data => {\n\t\t\t\tif (data.success) {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-activate-status\"), \"✓ SSP activated successfully. Reloading…\", \"success\")\n\t\t\t\t\tsetTimeout(() => window.location.reload(), 1500)\n\t\t\t\t} else {\n\t\t\t\t\tconst msg = data.message || data.data?.message || \"Activation failed.\"\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-activate-status\"), msg, \"error\")\n\t\t\t\t\t$activateBtn.prop(\"disabled\", false).text(\"Activate\")\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tshowStatus($(\"#pmw-ssp-activate-status\"), \"Network error: \" + err.message, \"error\")\n\t\t\t\t$activateBtn.prop(\"disabled\", false).text(\"Activate\")\n\t\t\t})\n\t})\n\n\t// ─── Enable / Disable Buttons ─────────────────────────\n\n\t$reactivateBtn.on(\"click\", function () {\n\t\t$reactivateBtn.prop(\"disabled\", true).text(\"Re-activating…\")\n\t\tshowStatus($(\"#pmw-ssp-toggle-status\"), \"Re-activating…\", \"loading\")\n\n\t\tapiCall(\"enable\", \"POST\")\n\t\t\t.then(data => {\n\t\t\t\tif (data.success) {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-toggle-status\"), \"✓ \" + data.message + \" Reloading…\", \"success\")\n\t\t\t\t\tsetTimeout(() => window.location.reload(), 1500)\n\t\t\t\t} else {\n\t\t\t\t\tconst msg = data.message || data.data?.message || \"Re-activation failed.\"\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-toggle-status\"), msg, \"error\")\n\t\t\t\t\t$reactivateBtn.prop(\"disabled\", false).text(\"Re-activate\")\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tshowStatus($(\"#pmw-ssp-toggle-status\"), \"Network error: \" + err.message, \"error\")\n\t\t\t\t$reactivateBtn.prop(\"disabled\", false).text(\"Re-activate\")\n\t\t\t})\n\t})\n\n\t$disableBtn.on(\"click\", function () {\n\t\t$disableBtn.prop(\"disabled\", true).text(\"Disabling…\")\n\t\tshowStatus($(\"#pmw-ssp-toggle-status\"), \"Disabling…\", \"loading\")\n\n\t\tapiCall(\"disable\", \"POST\")\n\t\t\t.then(data => {\n\t\t\t\tif (data.success) {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-toggle-status\"), \"✓ \" + data.message + \" Reloading…\", \"success\")\n\t\t\t\t\tsetTimeout(() => window.location.reload(), 1500)\n\t\t\t\t} else {\n\t\t\t\t\tconst msg = data.message || data.data?.message || \"Disable failed.\"\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-toggle-status\"), msg, \"error\")\n\t\t\t\t\t$disableBtn.prop(\"disabled\", false).text(\"Disable\")\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tshowStatus($(\"#pmw-ssp-toggle-status\"), \"Network error: \" + err.message, \"error\")\n\t\t\t\t$disableBtn.prop(\"disabled\", false).text(\"Disable\")\n\t\t\t})\n\t})\n\n\t// ─── Disconnect ────────────────────────────────────────\n\n\t$disconnectBtn.on(\"click\", function () {\n\t\tif (!confirm(\n\t\t\t\"Disconnect from SSP?\\n\\n\" +\n\t\t\t\"This will permanently delete the sync token and remove all connection data. \" +\n\t\t\t\"You will need to re-enter the token from the SSP portal to reconnect.\\n\\n\" +\n\t\t\t\"Continue?\"\n\t\t)) {\n\t\t\treturn\n\t\t}\n\n\t\t$disconnectBtn.prop(\"disabled\", true).text(\"Disconnecting…\")\n\n\t\tapiCall(\"disconnect\", \"POST\")\n\t\t\t.then(data => {\n\t\t\t\tif (data.success) {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-disconnect-status\"), \"SSP disconnected. Reloading…\", \"success\")\n\t\t\t\t\tsetTimeout(() => window.location.reload(), 1500)\n\t\t\t\t} else {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-disconnect-status\"), data.message || \"Disconnect failed.\", \"error\")\n\t\t\t\t\t$disconnectBtn.prop(\"disabled\", false).text(\"Disconnect\")\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tshowStatus($(\"#pmw-ssp-disconnect-status\"), \"Network error: \" + err.message, \"error\")\n\t\t\t\t$disconnectBtn.prop(\"disabled\", false).text(\"Disconnect\")\n\t\t\t})\n\t})\n\n\t// ─── Proxy Failure Behavior ────────────────────────────\n\n\t$failureBehavior.on(\"change\", function () {\n\t\tconst value = $(this).val()\n\n\t\tshowStatus($(\"#pmw-ssp-failure-behavior-status\"), \"Saving…\", \"loading\")\n\n\t\tapiCall(\"save-setting\", \"POST\", { key: \"proxy_failure_behavior\", value })\n\t\t\t.then(data => {\n\t\t\t\tif (data.success) {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-failure-behavior-status\"), \"✓ Saved\", \"success\")\n\t\t\t\t\tsetTimeout(() => clearStatus($(\"#pmw-ssp-failure-behavior-status\")), 3000)\n\t\t\t\t} else {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-failure-behavior-status\"), data.message || \"Save failed.\", \"error\")\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tshowStatus($(\"#pmw-ssp-failure-behavior-status\"), \"Network error: \" + err.message, \"error\")\n\t\t\t})\n\t})\n\n\t/**\n\t * Update plan and usage status fields from a sync response.\n\t */\n\tconst updateSyncMeta = (status) => {\n\t\tif (!status) return\n\n\t\tif (status.last_sync_at_formatted) {\n\t\t\t$(\"#pmw-ssp-last-sync\").text(status.last_sync_at_formatted)\n\t\t}\n\n\t\tif (status.plan_name) {\n\t\t\tlet planHtml = status.plan_name\n\t\t\tif (status.subscription_status && status.subscription_status !== \"active\") {\n\t\t\t\tplanHtml += ` <span class=\"pmw-ssp-badge pmw-ssp-badge--inactive\">${status.subscription_status.charAt(0).toUpperCase() + status.subscription_status.slice(1)}</span>`\n\t\t\t}\n\t\t\t$(\"#pmw-ssp-plan-name\").html(planHtml)\n\t\t}\n\n\t\tif (typeof status.monthly_request_limit !== \"undefined\" && status.monthly_request_limit > 0) {\n\t\t\tconst fmt = (n) => n.toLocaleString()\n\t\t\t$(\"#pmw-ssp-usage\").text(\n\t\t\t\t`${fmt(status.billable_this_period)} / ${fmt(status.monthly_request_limit)} events (${status.usage_percent}%)`\n\t\t\t)\n\t\t}\n\t}\n\n\t// ─── Sync Now ──────────────────────────────────────────\n\n\t$syncBtn.on(\"click\", function () {\n\t\t$syncBtn.prop(\"disabled\", true).text(\"Syncing…\")\n\t\tshowStatus($(\"#pmw-ssp-action-status\"), \"Pushing configuration…\", \"loading\")\n\n\t\tapiCall(\"sync\", \"POST\")\n\t\t\t.then(data => {\n\t\t\t\tif (data.success) {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-action-status\"), \"✓ Config synced successfully. Reloading…\", \"success\")\n\t\t\t\t\tupdateSyncMeta(data.status)\n\t\t\t\t\tsetTimeout(() => window.location.reload(), 1500)\n\t\t\t\t} else {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-action-status\"), data.message || data.data?.message || \"Sync failed.\", \"error\")\n\t\t\t\t\t$syncBtn.prop(\"disabled\", false).text(\"Sync Now\")\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tshowStatus($(\"#pmw-ssp-action-status\"), \"Network error: \" + err.message, \"error\")\n\t\t\t\t$syncBtn.prop(\"disabled\", false).text(\"Sync Now\")\n\t\t\t})\n\t})\n\n\t// ─── Test Connection ───────────────────────────────────\n\n\t$testBtn.on(\"click\", function () {\n\t\t$testBtn.prop(\"disabled\", true).text(\"Testing…\")\n\t\tshowStatus($(\"#pmw-ssp-action-status\"), \"Testing proxy connectivity…\", \"loading\")\n\n\t\tapiCall(\"test\", \"POST\")\n\t\t\t.then(data => {\n\t\t\t\tif (data.success) {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-action-status\"), \"✓ \" + data.message, \"success\")\n\t\t\t\t} else {\n\t\t\t\t\tshowStatus($(\"#pmw-ssp-action-status\"), data.message || \"Connection test failed.\", \"error\")\n\t\t\t\t}\n\t\t\t\t$testBtn.prop(\"disabled\", false).text(\"Test Connection\")\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tshowStatus($(\"#pmw-ssp-action-status\"), \"Network error: \" + err.message, \"error\")\n\t\t\t\t$testBtn.prop(\"disabled\", false).text(\"Test Connection\")\n\t\t\t})\n\t})\n})\n","jQuery(function () {\n\n\t/**\n\t * Copy debug info to clipboard when the button is clicked.\n\t */\n\tjQuery(\"#debug-info-button\").on(\"click\", () => {\n\t\t// Select text in textarea\n\t\tconst textarea = jQuery(\"#debug-info-textarea\")[0];\n\t\ttextarea.select();\n\t\ttextarea.setSelectionRange(0, 99999); // For mobile devices\n\n\t\t// Copy selected text to clipboard\n\t\tpmw.copyTextToClipboard(jQuery(\"#debug-info-textarea\").val());\n\n\t\t// Show success message and hide after 3 seconds\n\t\tconst successElement = jQuery(\"#debug-info-success\");\n\t\tsuccessElement.fadeIn(200);\n\t\tsetTimeout(() => successElement.fadeOut(200), 3000);\n\t});\n\n\tjQuery(\"#pmw-pro-version-demo\").on(\"click\", function () {\n\t\tjQuery(\"#submit\").trigger(\"click\");\n\t});\n\n\tif (document.getElementById(\"json-settings-file-input\")) {\n\t\tdocument.getElementById(\"json-settings-file-input\")\n\t\t\t.addEventListener(\"change\", pmw.readSettingsFile, false);\n\t}\n\n\t// if element ga4-data-api-credentials-upload-button exists, then we are on the GA4 settings page\n\tif (document.getElementById(\"ga4-data-api-credentials-upload-button\")) {\n\n\t\tdocument.getElementById(\"ga4-data-api-credentials-upload-button\")\n\t\t\t.addEventListener(\"change\", pmw.readGa4DataApiCredentials, false);\n\t}\n\n\t// if element ga4-data-api-credentials-upload-button exists, then we are on the GA4 settings page\n\tif (document.getElementById(\"ga4-data-api-credentials-delete-button\")) {\n\n\t\tdocument.getElementById(\"ga4-data-api-credentials-delete-button\")\n\t\t\t.addEventListener(\"click\", () => {\n\t\t\t\tpmw.saveGa4DataApiCredentialsToDb({});\n\t\t\t}, false);\n\t}\n\n\t/**\n\t * Handle log files download via REST API\n\t */\n\tjQuery(\"#wgact_download_logs_zip\").on(\"click\", function(e) {\n\t\te.preventDefault();\n\t\t\n\t\tif (jQuery(this).prop(\"disabled\")) {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tconst source = jQuery(this).data(\"source\");\n\t\tconst button = jQuery(this);\n\t\tconst originalText = button.text();\n\t\t\n\t\t// Disable button and change text\n\t\tbutton.prop(\"disabled\", true).text(\"Downloading...\");\n\t\t\n\t\t// Use fetch with proper authentication\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/logs/download\", {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/x-www-form-urlencoded\",\n\t\t\t\t\"X-WP-Nonce\": pmwAdminApi.nonce\n\t\t\t},\n\t\t\tbody: new URLSearchParams({\n\t\t\t\tsource: source\n\t\t\t}),\n\t\t\tcredentials: 'same-origin'\n\t\t})\n\t\t.then(response => {\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`HTTP error! status: ${response.status}`);\n\t\t\t}\n\t\t\treturn response.blob();\n\t\t})\n\t\t.then(blob => {\n\t\t\t// Create download link\n\t\t\tconst url = window.URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement(\"a\");\n\t\t\ta.href = url;\n\t\t\ta.download = \"pmw-logs-\" + new Date().toISOString().slice(0,19).replace(/:/g, \"-\") + \".zip\";\n\t\t\tdocument.body.appendChild(a);\n\t\t\ta.click();\n\t\t\twindow.URL.revokeObjectURL(url);\n\t\t\tdocument.body.removeChild(a);\n\t\t\t\n\t\t\t// Re-enable the button\n\t\t\tbutton.prop(\"disabled\", false).text(originalText);\n\t\t})\n\t\t.catch(error => {\n\t\t\tconsole.error(\"Download error:\", error);\n\t\t\tbutton.prop(\"disabled\", false).text(originalText);\n\t\t\talert(\"Error downloading log files. Please try again.\");\n\t\t});\n\t});\n});\n\n// jQuery(function () {\n//\n// \timport(\"../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs\")\n// \t\t.then(({\n// \t\t\t\t   computePosition,\n// \t\t\t\t   flip,\n// \t\t\t\t   shift,\n// \t\t\t\t   offset,\n// \t\t\tarrow,\n// \t\t\t   }) => {\n// \t\t\tconsole.log(\"computePosition: \", computePosition)\n//\n// \t\t\tconst button = document.querySelector('#button');\n// \t\t\tconst tooltip = document.querySelector('#tooltip');\n// \t\t\tconst arrowElement = document.querySelector('#arrow');\n//\n// \t\t\tcomputePosition(button, tooltip, {\n// \t\t\t\tplacement: 'top',\n// \t\t\t\tmiddleware: [\n// \t\t\t\t\toffset(6),\n// \t\t\t\t\tflip(),\n// \t\t\t\t\tshift({padding: 5}),\n// \t\t\t\t\tarrow({element: arrowElement}),\n// \t\t\t\t],\n// \t\t\t}).then(({x, y}) => {\n// \t\t\t\tObject.assign(tooltip.style, {\n// \t\t\t\t\tleft: `${x}px`,\n// \t\t\t\t\ttop: `${y}px`,\n// \t\t\t\t});\n// \t\t\t});\n//\n// \t\t})\n// \t\t.catch(err => {\n// \t\t\tconsole.error(err)\n// \t\t})\n//\n// });\n\n\n(function (pmw, $, undefined) {\n\n\tpmw.saveSettingsToDisk = () => {\n\t\tlet text = document.getElementById(\"export-settings-json\").value;\n\n\t\t// Extract timestamp from the settings JSON\n\t\tlet timestamp = \"unknown\";\n\t\ttry {\n\t\t\tlet settings = JSON.parse(text);\n\t\t\tif (settings.timestamp) {\n\t\t\t\ttimestamp = settings.timestamp;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(\"Could not extract timestamp from settings:\", error);\n\t\t}\n\n\t\ttext                 = text.replace(/\\n/g, \"\\r\\n\"); // To retain the Line breaks.\n\t\tlet blob             = new Blob([text], {type: \"text/plain\"});\n\t\tlet anchor           = document.createElement(\"a\");\n\t\tanchor.download      = \"pixel-manager-settings_\" + timestamp + \"_\" + pmw.getDateTimeFromTimestamp(timestamp) + \".json\";\n\t\tanchor.href          = window.URL.createObjectURL(blob);\n\t\tanchor.target        = \"_blank\";\n\t\tanchor.style.display = \"none\"; // just to be safe!\n\t\tdocument.body.appendChild(anchor);\n\t\tanchor.click();\n\t\tdocument.body.removeChild(anchor);\n\t};\n\n\t// Get date and time from timestamp in year.month.day_hour-minute-second format. All components are zero padded.\n\t// Uses WordPress site timezone to match what's displayed on admin pages.\n\tpmw.getDateTimeFromTimestamp = (timestamp) => {\n\t\t// If timestamp is \"unknown\" or invalid, fall back to current date/time\n\t\tif (timestamp === \"unknown\" || !timestamp || isNaN(timestamp)) {\n\t\t\treturn pmw.getCurrentDateForFileName();\n\t\t}\n\n\t\t// Convert Unix timestamp (seconds) to milliseconds for JavaScript Date\n\t\tlet date = new Date(timestamp * 1000);\n\n\t\t// Apply WordPress timezone offset if available\n\t\tif (pmwAdminApi && pmwAdminApi.timezone && typeof pmwAdminApi.timezone.offset === \"number\") {\n\t\t\t// Create new date in WordPress timezone by adding the offset\n\t\t\tlet wpTimezoneOffsetMs = pmwAdminApi.timezone.offset * 60 * 60 * 1000; // Convert hours to milliseconds\n\t\t\tdate                   = new Date(date.getTime() + wpTimezoneOffsetMs);\n\n\t\t\t// Get WordPress timezone date/time components using UTC methods\n\t\t\t// (since we've already applied the offset to the date object)\n\t\t\tlet year    = date.getUTCFullYear();\n\t\t\tlet month   = (\"0\" + (date.getUTCMonth() + 1)).slice(-2);\n\t\t\tlet day     = (\"0\" + date.getUTCDate()).slice(-2);\n\t\t\tlet hours   = (\"0\" + date.getUTCHours()).slice(-2);\n\t\t\tlet minutes = (\"0\" + date.getUTCMinutes()).slice(-2);\n\t\t\tlet seconds = (\"0\" + date.getUTCSeconds()).slice(-2);\n\n\t\t\treturn year + \".\" + month + \".\" + day + \"_\" + hours + \"-\" + minutes + \"-\" + seconds;\n\t\t} else {\n\t\t\t// Fallback to browser local timezone if WordPress timezone data is not available\n\t\t\tlet year    = date.getFullYear();\n\t\t\tlet month   = (\"0\" + (date.getMonth() + 1)).slice(-2);\n\t\t\tlet day     = (\"0\" + date.getDate()).slice(-2);\n\t\t\tlet hours   = (\"0\" + date.getHours()).slice(-2);\n\t\t\tlet minutes = (\"0\" + date.getMinutes()).slice(-2);\n\t\t\tlet seconds = (\"0\" + date.getSeconds()).slice(-2);\n\t\t\treturn year + \".\" + month + \".\" + day + \"_\" + hours + \"-\" + minutes + \"-\" + seconds;\n\t\t}\n\t};\n\n\t// Get current date and time in year.month.day_hour-minute-second format. All components are zero padded.\n\t// Uses WordPress site timezone to match what's displayed on admin pages.\n\tpmw.getCurrentDateForFileName = () => {\n\t\tlet date = new Date();\n\n\t\t// Apply WordPress timezone offset if available\n\t\tif (pmwAdminApi && pmwAdminApi.timezone && typeof pmwAdminApi.timezone.offset === \"number\") {\n\t\t\t// Apply WordPress timezone offset\n\t\t\tlet wpTimezoneOffsetMs = pmwAdminApi.timezone.offset * 60 * 60 * 1000; // Convert hours to milliseconds\n\t\t\tdate                   = new Date(date.getTime() + wpTimezoneOffsetMs);\n\n\t\t\t// Get WordPress timezone date/time components using UTC methods\n\t\t\t// (since we've already applied the offset to the date object)\n\t\t\tlet year    = date.getUTCFullYear();\n\t\t\tlet month   = (\"0\" + (date.getUTCMonth() + 1)).slice(-2);\n\t\t\tlet day     = (\"0\" + date.getUTCDate()).slice(-2);\n\t\t\tlet hours   = (\"0\" + date.getUTCHours()).slice(-2);\n\t\t\tlet minutes = (\"0\" + date.getUTCMinutes()).slice(-2);\n\t\t\tlet seconds = (\"0\" + date.getUTCSeconds()).slice(-2);\n\n\t\t\treturn year + \".\" + month + \".\" + day + \"_\" + hours + \"-\" + minutes + \"-\" + seconds;\n\t\t} else {\n\t\t\t// Fallback to browser local timezone if WordPress timezone data is not available\n\t\t\tlet year    = date.getFullYear();\n\t\t\tlet month   = (\"0\" + (date.getMonth() + 1)).slice(-2);\n\t\t\tlet day     = (\"0\" + date.getDate()).slice(-2);\n\t\t\tlet hours   = (\"0\" + date.getHours()).slice(-2);\n\t\t\tlet minutes = (\"0\" + date.getMinutes()).slice(-2);\n\t\t\tlet seconds = (\"0\" + date.getSeconds()).slice(-2);\n\t\t\treturn year + \".\" + month + \".\" + day + \"_\" + hours + \"-\" + minutes + \"-\" + seconds;\n\t\t}\n\n\t\t// return date.toLocaleDateString(\n\t\t// \t\"en-US\", {\n\t\t// \t\tyear : \"numeric\",\n\t\t// \t\tmonth: \"2-digit\",\n\t\t// \t\tday  : \"2-digit\",\n\t\t// \t},\n\t\t// )\n\t};\n\n\tpmw.readSettingsFile = e => {\n\n\t\tlet file = e.target.files[0];\n\t\tif (!file) return;\n\t\tlet reader    = new FileReader();\n\t\treader.onload = function (e) {\n\n\t\t\t// Check if the file is a valid JSON file\n\t\t\t// If it is not a valid JSON file, display an error message\n\t\t\ttry {\n\t\t\t\tJSON.parse(e.target.result);\n\t\t\t} catch (error) {\n\t\t\t\tdocument.getElementById(\"settings-upload-status-error\").style.display     = \"block\";\n\t\t\t\tdocument.getElementById(\"settings-upload-status-error-message\").innerHTML = \"Invalid JSON file.\";\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet contents = JSON.parse(e.target.result);\n\n\t\t\t// document.getElementById(\"import-settings-json\").textContent = JSON.stringify(contents)\n\n\t\t\tpmw.saveImportedSettingsToDb(contents);\n\t\t};\n\t\treader.readAsText(file);\n\t};\n\n\tpmw.saveImportedSettingsToDb = settings => {\n\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/settings/\", {\n\t\t\tmethod     : \"POST\",\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders    : {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-WP-Nonce\"  : pmwAdminApi.nonce,\n\t\t\t},\n\t\t\tbody       : JSON.stringify(settings),\n\t\t})\n\t\t\t.then(response => response.json())\n\t\t\t.then(async message => {\n\t\t\t\tif (message.success) {\n\t\t\t\t\tconsole.log(message);\n\t\t\t\t\t// reload window\n\t\t\t\t\tdocument.getElementById(\"settings-upload-status-success\").style.display = \"block\";\n\t\t\t\t\t// wait 5 seconds\n\t\t\t\t\tawait new Promise(resolve => setTimeout(resolve, 1000));\n\t\t\t\t\twindow.location.reload();\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(message);\n\t\t\t\t\tdocument.getElementById(\"settings-upload-status-error\").style.display = \"block\";\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(error);\n\t\t\t\tdocument.getElementById(\"settings-upload-status-error\").style.display = \"block\";\n\t\t\t});\n\t};\n\n\tpmw.restoreBackup = (timestamp) => {\n\n\t\tconsole.log(\"restoreBackup() - timestamp: \", timestamp);\n\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/options-backup/\" + timestamp + \"/restore\", {\n\t\t\tmethod     : \"POST\",\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders    : {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-WP-Nonce\"  : pmwAdminApi.nonce,\n\t\t\t},\n\t\t})\n\t\t\t.then(response => response.json())\n\t\t\t.then(async message => {\n\n\t\t\t\tif (message?.data?.message) {\n\t\t\t\t\tconsole.log(\"restoreBackup() - message: \", message.data.message);\n\t\t\t\t}\n\n\t\t\t\tif (message.success) {\n\t\t\t\t\twindow.location.reload();\n\t\t\t\t} else {\n\t\t\t\t\talert(message.data.message);\n\t\t\t\t}\n\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(error);\n\t\t\t\talert(error.message);\n\t\t\t});\n\t};\n\n\tpmw.readGa4DataApiCredentials = e => {\n\n\t\tlet file = e.target.files[0];\n\t\tif (!file) return;\n\t\tlet reader    = new FileReader();\n\t\treader.onload = function (e) {\n\n\t\t\t// Check if the file is a valid JSON file\n\t\t\t// If it is not a valid JSON file, display an error message\n\t\t\ttry {\n\t\t\t\tJSON.parse(e.target.result);\n\t\t\t} catch (error) {\n\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error\").style.display     = \"block\";\n\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error-message\").innerHTML = \"Invalid JSON file.\";\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet contents = JSON.parse(e.target.result);\n\n\t\t\t// document.getElementById(\"import-settings-json\").textContent = JSON.stringify(contents)\n\n\t\t\tpmw.saveGa4DataApiCredentialsToDb(contents);\n\t\t};\n\t\treader.readAsText(file);\n\t};\n\n\tpmw.deleteGa4DataApiCredentials = e => {\n\t\tpmw.saveGa4DataApiCredentialsToDb({});\n\t};\n\n\tpmw.saveGa4DataApiCredentialsToDb = credentials => {\n\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/ga4/data-api/credentials\", {\n\t\t\tmethod     : \"POST\",\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders    : {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-WP-Nonce\"  : pmwAdminApi.nonce,\n\t\t\t},\n\t\t\tbody       : JSON.stringify(credentials),\n\t\t})\n\t\t\t.then(response => response.json())\n\t\t\t.then(async responseJson => {\n\t\t\t\tif (responseJson.success) {\n\t\t\t\t\tconsole.log(responseJson);\n\t\t\t\t\t// reload window\n\t\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-success\").style.display = \"block\";\n\t\t\t\t\t// wait 5 seconds\n\t\t\t\t\t// await new Promise(resolve => setTimeout(resolve, 5000))\n\t\t\t\t\twindow.location.reload();\n\t\t\t\t} else {\n\t\t\t\t\tconsole.log(responseJson);\n\t\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error\").style.display     = \"block\";\n\t\t\t\t\t// and add the error message\n\t\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error-message\").innerHTML = \"Error message: \" + responseJson.data.message;\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(error);\n\t\t\t\tdocument.getElementById(\"ga4-api-credentials-upload-status-error\").style.display = \"block\";\n\t\t\t});\n\t};\n\n\tpmw.getAiBotUrl = () => {\n\t\tif (pmw_cody?.url) {\n\t\t\treturn pmw_cody.url;\n\t\t}\n\t};\n\n\t/**\n\t * Opens the chatbot in a side panel (like n8n)\n\t * The panel slides in from the right side of the screen\n\t */\n\tpmw.loadAiChatWindow = () => {\n\t\tconst panel = document.getElementById(\"pmw-chatbot-panel\");\n\t\tconst iframe = document.getElementById(\"pmw-chatbot-iframe\");\n\n\t\tif (!panel || !iframe) {\n\t\t\tconsole.error(\"Chatbot panel elements not found\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Set the iframe source\n\t\tiframe.src = pmw.getAiBotUrl();\n\n\t\t// Add body class to push content left\n\t\tdocument.body.classList.add(\"pmw-chatbot-open\");\n\n\t\t// Open the panel\n\t\tpanel.classList.add(\"pmw-chatbot-panel-open\");\n\t};\n\n\t/**\n\t * Closes the chatbot side panel\n\t */\n\tpmw.closeChatbot = () => {\n\t\tconst panel = document.getElementById(\"pmw-chatbot-panel\");\n\t\tif (panel) {\n\t\t\tpanel.classList.remove(\"pmw-chatbot-panel-open\");\n\t\t\t// Remove body class to restore content position\n\t\t\tdocument.body.classList.remove(\"pmw-chatbot-open\");\n\t\t}\n\t};\n\n\t/**\n\t * Check if the Cody AI chatbot is available.\n\t *\n\t * @return {boolean}\n\t */\n\tpmw.codyAvailable = () => {\n\t\tif (typeof window.pmw_cody !== \"undefined\" && window.pmw_cody?.available) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\t// Schedule a recalculation of the LTV by sending a POST REST request to the server\n\tpmw.ltvRecalculation = event => {\n\n\t\tconst displayStatusMessage = (message) => {\n\t\t\tlet elements = document.getElementsByClassName(\"ltv-message\");\n\t\t\tfor (let i = 0; i < elements.length; i++) {\n\t\t\t\telements[i].style.display = \"none\";\n\t\t\t}\n\t\t\tdocument.getElementById(\"ltv-message-error\").style.display  = \"block\";\n\t\t\tdocument.getElementById(\"ltv-message-error-text\").innerHTML = message;\n\t\t};\n\n\t\tconst displayRunImmediatelyButton = () => {\n\t\t\tlet elements = document.getElementsByClassName(\"ltv-button-text\");\n\t\t\tfor (let i = 0; i < elements.length; i++) {\n\t\t\t\telements[i].style.display = \"none\";\n\t\t\t}\n\t\t\tdocument.getElementById(\"ltv-instant-recalculation-button-text\").style.display = \"block\";\n\t\t};\n\n\t\tconst removeAllMessages = () => {\n\t\t\tlet elements = document.getElementsByClassName(\"ltv-message\");\n\t\t\tfor (let i = 0; i < elements.length; i++) {\n\t\t\t\telements[i].style.display = \"none\";\n\t\t\t}\n\n\t\t\tdocument.getElementById(\"ltv-message-error\").style.display = \"none\";\n\t\t};\n\n\t\t// console log the data-action from the nested span element of the clicked element\n\t\t// console.log(\"event.target.dataset.action\", event.target.dataset.action)\n\n\t\tfetch(pmwAdminApi.root + \"pmw/v1/ltv/\", {\n\t\t\tmethod     : \"POST\",\n\t\t\tcredentials: \"same-origin\",\n\t\t\theaders    : {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-WP-Nonce\"  : pmwAdminApi.nonce,\n\t\t\t},\n\t\t\tbody       : JSON.stringify({\n\t\t\t\t\"action\": event.target.dataset.action,\n\t\t\t}),\n\t\t})\n\t\t\t.then(response => response.json())\n\t\t\t.then(message => {\n\t\t\t\tif (message.success) {\n\t\t\t\t\tconsole.log(message);\n\t\t\t\t\t// reload window\n\n\t\t\t\t\tif (message.data.status.is_scheduled) {\n\t\t\t\t\t\tremoveAllMessages();\n\t\t\t\t\t\tdisplayRunImmediatelyButton();\n\t\t\t\t\t\tdocument.getElementById(\"ltv-schedule-recalculation-confirmation-message\").style.display = \"block\";\n\t\t\t\t\t}\n\n\t\t\t\t\tif (message.data.status.is_running) {\n\t\t\t\t\t\t// Get the button element with the id \"wgact_ltv_recalculation\" and disable it\n\t\t\t\t\t\tdocument.getElementById(\"wgact_ltv_recalculation\").disabled = true;\n\t\t\t\t\t\tremoveAllMessages();\n\t\t\t\t\t\tdocument.getElementById(\"ltv-running-recalculation-confirmation-message\").style.display = \"block\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// if is neither message.data.status.is_running nor message.data.status.is_scheduled\n\t\t\t\t\t// then display the error message\n\t\t\t\t\tif (!message.data.status.is_running && !message.data.status.is_scheduled) {\n\t\t\t\t\t\tdisplayStatusMessage(message.data.message);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error(message);\n\t\t\t\t\tdisplayStatusMessage(message.data.message);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tconsole.error(error);\n\t\t\t\tdisplayStatusMessage(error);\n\t\t\t});\n\t};\n\n\tpmw.copyTextToClipboard = (text) => {\n\t\tnavigator.clipboard.writeText(text)\n\t\t\t.catch(err => {\n\t\t\t\tconsole.error(\"Failed to copy: \", err);\n\t\t\t});\n\t};\n\n}(window.pmw = window.pmw || {}, jQuery));\n\n/**\n * This script listens for the DOMContentLoaded event. Once the DOM is fully loaded,\n * it checks if the chatbot (pmw.codyAvailable()) is available.\n * If the chatbot is available, it displays the chat widget button.\n * If the chatbot is not available, it logs a message to the console indicating that the chatbot is unavailable.\n *\n * @listens document#DOMContentLoaded\n */\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n\n\tif (pmw.codyAvailable()) {\n\t\tconst chatbotWidget = document.getElementById(\"pmw-chatbot-widget\");\n\t\tif (chatbotWidget) {\n\t\t\tchatbotWidget.style.display = \"block\";\n\t\t}\n\n\t\t// Show the chatbot line in the support section\n\t\tconst chatbotListItem = document.getElementById(\"pmw-chat-li\");\n\t\tif (chatbotListItem) {\n\t\t\tchatbotListItem.style.display = \"list-item\";\n\t\t}\n\n\t\t// Set up event listeners for the chatbot widget\n\t\tconst chatbotToggle = document.getElementById(\"pmw-chatbot-toggle\");\n\t\tconst chatbotClose = document.getElementById(\"pmw-chatbot-close\");\n\n\t\tif (chatbotToggle) {\n\t\t\tchatbotToggle.addEventListener(\"click\", (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tpmw.loadAiChatWindow();\n\t\t\t});\n\t\t}\n\n\t\tif (chatbotClose) {\n\t\t\tchatbotClose.addEventListener(\"click\", (e) => {\n\t\t\t\te.preventDefault();\n\t\t\t\tpmw.closeChatbot();\n\t\t\t});\n\t\t}\n\n\t\t// Close chatbot on ESC key\n\t\tdocument.addEventListener(\"keydown\", (event) => {\n\t\t\tif (event.key === \"Escape\") {\n\t\t\t\tpmw.closeChatbot();\n\t\t\t}\n\t\t});\n\t} else {\n\t\tconsole.log(\"DOMContentLoaded - chatbot is not available\");\n\t}\n\n}, true);\n\n// Wait until the DOM is loaded, then console log\n// the message \"DOMContentLoaded - chatbot is not available\"\n// use jquery\njQuery(() => {\n\tif (document.querySelector(\"#wgact_ltv_recalculation\")) {\n\t\tdocument.querySelector(\"#wgact_ltv_recalculation\").addEventListener(\"click\", event => {\n\t\t\tevent.preventDefault();\n\t\t\tpmw.ltvRecalculation(event);\n\t\t});\n\t}\n\n\tif (document.querySelector(\"#pmw_stop_ltv_calculation\")) {\n\t\tdocument.querySelector(\"#pmw_stop_ltv_calculation\").addEventListener(\"click\", event => {\n\t\t\tevent.preventDefault();\n\t\t\tpmw.ltvRecalculation(event);\n\t\t});\n\t}\n\n\t// Add event listeners for backup restore buttons\n\tjQuery(() => {\n\t\tjQuery(document).on(\"click\", \".pmw-restore-backup-button\", function (event) {\n\t\t\tevent.preventDefault();\n\t\t\tconst timestamp = jQuery(this).data(\"timestamp\");\n\t\t\tif (timestamp) {\n\t\t\t\tpmw.restoreBackup(timestamp);\n\t\t\t}\n\t\t});\n\t});\n});\n\n/**\n * add an event listener to the button with the id \"wgact_copy_log_file_links\"\n * when the button is clicked, copy the log file links to the clipboard\n * the data-links attribute of the button contains a json string with the links\n */\njQuery(() => {\n\n\tif (!document.querySelector(\"#wgact_copy_log_file_links\")) {\n\t\treturn;\n\t}\n\n\tdocument.querySelector(\"#wgact_copy_log_file_links\").addEventListener(\"click\", event => {\n\t\tevent.preventDefault();\n\n\t\tconst jsonOfLinks = JSON.parse(event.target.dataset.links);\n\n\t\tlet strOfLinks = \"\";\n\n\t\tfor (let i = 0, len = jsonOfLinks.length; i < len; i++) {\n\t\t\tstrOfLinks += jsonOfLinks[i] + \"\\n\";\n\t\t}\n\n\t\tpmw.copyTextToClipboard(strOfLinks);\n\n\t\t// make the button text change to \"Copied!\" and keep the same width and text for 3 seconds\n\t\tlet button         = document.getElementById(\"wgact_copy_log_file_links\");\n\t\tbutton.style.width = getComputedStyle(button).width;\n\t\tconst originalText = button.innerHTML;\n\t\tbutton.innerHTML   = event.target.dataset.textCopied;\n\t\tsetTimeout(function () {\n\t\t\tbutton.innerHTML = originalText;\n\t\t}, 3000);\n\t});\n});\n\n// on pressing enter in form inputs, click the submit button\njQuery(() => {\n\tjQuery(document).on(\"keydown\", \"input, textarea, select\", function (event) {\n\t\tif (event.key === \"Enter\" && !event.shiftKey && !event.ctrlKey && !event.altKey) {\n\t\t\t// Only trigger submit if we're in a form and not in a textarea (where Enter should create new lines)\n\t\t\tconst $target = jQuery(event.target);\n\t\t\tif ($target.is(\"input\") && $target.closest(\"form\").length > 0) {\n\t\t\t\tconst form = $target.closest(\"form\")[0];\n\t\t\t\tconst submitButton = jQuery(form).find(\"#submit\");\n\t\t\t\tif (submitButton.length > 0) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tsubmitButton.click();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n});\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Combine all admin scripts\n * (which only run on the wpm pages)\n */\n\n// require(\"./environment-check\")\nrequire(\"./helpers\")\nrequire(\"./script-blocker-warning\")\nrequire(\"./tabs\")\nrequire(\"./save\")\nrequire(\"./ssp\")\n\n// #if process.env.TIER === 'premium'\n// // require(\"./helpers_premium\")\n// #endif\n\n// console.log('Pixel Manager for WooCommerce admin script')\n"],"names":["jQuery","$","$form","pmwShowSaveNotice","type","message","$notice","after","find","on","fadeOut","this","remove","setTimeout","animate","scrollTop","offset","top","length","e","preventDefault","$submitBtn","originalLabel","val","prop","formData","serialize","fetch","pmwAdminApi","root","method","headers","nonce","body","then","response","json","data","success","errors","errorHtml","forEach","err","window","location","reload","catch","console","error","finally","pmwAdminScriptLoaded","pmwGetPageId","sections","subsections","closest","hide","each","push","parseInt","sort","a","b","priority","section","badge","append","pmwCreateSubtabUlHtml","addClass","siblings","removeClass","sectionSlug","pmwToggleSections","children","trigger","stopPropagation","pmwToggleSubsection","parent","pmwGetSectionParams","sectionParams","subsectionsKeys","Object","keys","html","subsectionKey","subtab","queryString","search","urlParams","URLSearchParams","get","nextUntil","andSelf","show","sectionPos","findIndex","arrayElement","prevAll","next","pmwSetUrl","subsectionSlug","delete","newParams","history","pushState","document","pathname","$sectionDiv","currentTarget","$activateBtn","$reactivateBtn","$disableBtn","$disconnectBtn","$syncBtn","$testBtn","$tokenInput","$failureBehavior","showStatus","$el","className","clearStatus","apiCall","endpoint","opts","credentials","JSON","stringify","token","trim","test","text","sync_token","msg","confirm","value","key","status","last_sync_at_formatted","plan_name","planHtml","subscription_status","charAt","toUpperCase","slice","monthly_request_limit","fmt","n","toLocaleString","billable_this_period","usage_percent","updateSyncMeta","textarea","select","setSelectionRange","pmw","copyTextToClipboard","successElement","fadeIn","getElementById","addEventListener","readSettingsFile","readGa4DataApiCredentials","saveGa4DataApiCredentialsToDb","source","button","originalText","ok","Error","blob","url","URL","createObjectURL","createElement","href","download","Date","toISOString","replace","appendChild","click","revokeObjectURL","removeChild","alert","saveSettingsToDisk","timestamp","settings","parse","warn","Blob","anchor","getDateTimeFromTimestamp","target","style","display","isNaN","getCurrentDateForFileName","date","timezone","wpTimezoneOffsetMs","getTime","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","file","files","reader","FileReader","onload","result","innerHTML","contents","saveImportedSettingsToDb","readAsText","async","log","Promise","resolve","restoreBackup","deleteGa4DataApiCredentials","responseJson","getAiBotUrl","pmw_cody","loadAiChatWindow","panel","iframe","src","classList","add","closeChatbot","codyAvailable","available","ltvRecalculation","event","displayStatusMessage","elements","getElementsByClassName","i","removeAllMessages","dataset","action","is_scheduled","displayRunImmediatelyButton","is_running","disabled","navigator","clipboard","writeText","chatbotWidget","chatbotListItem","chatbotToggle","chatbotClose","querySelector","jsonOfLinks","links","strOfLinks","len","width","getComputedStyle","textCopied","shiftKey","ctrlKey","altKey","$target","is","form","submitButton","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","require"],"ignoreList":[],"sourceRoot":""}
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/js/public/free/pmw-public.p1.min.js

    r3451824 r3468312  
    1 /*! Copyright 2025 SweetCode. All rights reserved. */(()=>{var e,r,t,a,i={50(){const e=e=>e=(e=e.replace(/<[^>]*>?/gm,"").replace(/\n/gm,"").replace(/\t/gm,"")).trim();jQuery("form.woocommerce-checkout").on("change","#shipping_method",t=>{t.target?.value&&t.target?.id&&r({slug:t.target.value,text:e(jQuery("label[for='"+t.target.id+"']").text())})}),jQuery(()=>{if(jQuery("#shipping_method").length){let t=jQuery("#shipping_method").find(":checked");if(t.length){if(!t.val())return;if(!t.attr("id"))return;r({slug:t.val(),text:e(jQuery("label[for='"+t.attr("id")+"']").text())})}}});const r=e=>{jQuery(document).trigger("pmw:add-shipping-info",{shippingTier:e})};let t=!1;jQuery("form.woocommerce-checkout").on("change",'input[name="payment_method"]',r=>{r.target.value&&r.target.id&&(a({slug:r.target.value,text:e(jQuery("label[for='"+r.target.id+"']").text())}),t=!0)}),jQuery(()=>{if(t)return;let r=jQuery('input[name="payment_method"]:checked');if(r.length){if(!r.val())return;if(!r.attr("id"))return;a({slug:r.val(),text:e(jQuery("label[for='"+r.attr("id")+"']").text())})}});const a=e=>{jQuery(document).trigger("pmw:add-payment-info",{paymentType:e})};jQuery(document).on("click",".remove_from_cart_button, .remove",e=>{try{let r=new URL(jQuery(e.currentTarget).attr("href")),t=pmw.getProductIdByCartItemKeyUrl(r);pmw.removeProductFromCart(t)}catch(e){console.error(e)}});const i=pmw.prepareSelectors([".checkout-button",".cart-checkout-button",".button.checkout",".xoo-wsc-ft-btn-checkout",".elementor-button--checkout",".xt_woofc-checkout",".fkcart-checkout--text"],"beginCheckout");jQuery(document).on("click init_checkout",i,()=>{jQuery(document).trigger("pmw:begin-checkout")}),jQuery(document).on("updated_cart_totals",()=>{jQuery(document).trigger("pmw:view-cart")}),jQuery(document).on("pmwLoad",e=>{jQuery(document).on("payment_method_selected",()=>{!1===pmw.paymentMethodSelected&&pmw.fireCheckoutProgress(3),pmw.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val()),pmw.paymentMethodSelected=!0})}),jQuery(document).on("pmwLoad",()=>{try{pmw.initCart()}catch(e){console.error(e)}}),jQuery(document).on("pmwLoad",()=>{pmwDataLayer.products=pmwDataLayer.products||{};let e=pmw.getAddToCartLinkProductIds();pmw.getProductsFromBackend(e)}),jQuery(document).on("pmwLoad",()=>{if(!document.referrer)return;if(pmw.retrieveData("referrer"))return;let e=new URL(document.referrer).hostname;e!==window.location.host&&pmw.storeData("referrer",e)}),jQuery(document).on("pmwLoad",()=>{let e=pmw.getUrlParameter("gclid");e&&pmw.storeData("gclid",e);let r=pmw.getUrlParameter("wbraid");r&&pmw.storeData("wbraid",r);let t=pmw.getUrlParameter("gbraid");t&&pmw.storeData("gbraid",t);let a=pmw.getUrlParameter("fbclid");a&&(a="fb.1."+Math.floor(Date.now()/1e3)+"."+a,pmw.storeData("fbclid",a));let i=pmw.getUrlParameter("ttclid");i&&pmw.storeData("ttclid",i);let o=pmw.getUrlParameter("ScCid");o&&pmw.storeData("scid",o);let n=pmw.getUrlParameter("epik");n&&pmw.storeData("epik",n)}),jQuery(document).on("pmwLoad",()=>{try{if("undefined"!=typeof pmwDataLayer&&!pmwDataLayer?.pmw_loaded){if(jQuery(document).trigger("pmw:load-always"),pmwDataLayer?.shop)if("product"===pmwDataLayer.shop.page_type&&"variable"!==pmwDataLayer.shop.product_type&&pmw.getMainProductIdFromProductPage()){let e=pmw.getProductDataForViewItemEvent(pmw.getMainProductIdFromProductPage());jQuery(document).trigger("pmw:view-item",e)}else if("product"===pmwDataLayer.shop.page_type&&"variable"===pmwDataLayer.shop.product_type&&!pmwDataLayer?.shop?.variations_output&&pmw.getMainProductIdFromProductPage()){let e=pmw.getProductDataForViewItemEvent(pmw.getMainProductIdFromProductPage());jQuery(document).trigger("pmw:view-item",e)}else"product_category"===pmwDataLayer.shop.page_type?jQuery(document).trigger("pmw:view-category"):"search"===pmwDataLayer.shop.page_type?jQuery(document).trigger("pmw:search"):"cart"===pmwDataLayer.shop.page_type?jQuery(document).trigger("pmw:view-cart"):"order_received_page"===pmwDataLayer.shop.page_type?pmwDataLayer?.order&&!pmw.isOrderIdStored(pmwDataLayer.order.id)&&(jQuery(document).trigger("pmw:purchase"),pmw.writeOrderIdToStorage(pmwDataLayer.order.id,pmwDataLayer.order.key),"function"==typeof pmw.acrRemoveCookie&&pmw.acrRemoveCookie()):jQuery(document).trigger("pmw:everywhere-else");else jQuery(document).trigger("pmw:everywhere-else");pmwDataLayer?.user?.id&&!pmw.hasLoginEventFired()&&(jQuery(document).trigger("pmw:login"),pmw.setLoginEventFired()),pmwDataLayer.pmw_loaded=!0}}catch(e){console.error(e)}}),pmwDataLayer?.general?.lazy_load_pmw&&pmw.registerShowVariationEventListener(),jQuery(document).on("pmwLoad",()=>{if(pmwDataLayer?.general?.lazy_load_pmw&&pmwDataLayer?.shop?.variations_output)try{const e=jQuery(".variations_form");if(!e.length)return;const r={};if(!e.find("select").toArray().every(e=>{const t=jQuery(e).val();return!!t&&(r[jQuery(e).attr("name")]=t,!0)}))return;const t=e.data("product_variations");if(!t)return;const a=t.find(e=>Object.entries(r).every(([r,t])=>e.attributes[r]===t));a&&pmw.triggerViewItemEventPrep(a.variation_id)}catch(e){pmw.console.error(e)}}),jQuery(document).on("pmwLoad",async()=>{!1===pmw.retrieveData("restEndpointAvailable")&&pmw.console.error("REST endpoint is not available. Using admin-ajax.php instead.")}),jQuery(document).on("pmw:page-view",async e=>{pmw.console.log("pmw:page-view event fired",{event:e});const r=await pmw.processEvent("page_view",{});if(pmwDataLayer?.general?.server_2_server?.pageview_event_s2s?.is_active){const e=pmw.pixelRegistry.getPixelsWithCapability("supportsPageViewS2S");if(e.length>0){const t={event:"page_view"};for(const a of e)r.pixels[a]&&(t[a]=r.pixels[a]);Object.keys(t).length>1&&pmw.sendEventPayloadToServer(t)}}}),jQuery(document).on("pmw:add-to-cart",async(e,r)=>{pmw.console.log("pmw:add-to-cart event fired",{event:e,product:r}),await pmw.processEvent("add_to_cart",{product:r})}),jQuery(document).on("pmw:remove-from-cart",async(e,r)=>{pmw.console.log("pmw:remove-from-cart event fired",{event:e,product:r}),await pmw.processEvent("remove_from_cart",{product:r})}),jQuery(document).on("pmw:select-item",async(e,r)=>{pmw.console.log("pmw:select-item event fired",{event:e,product:r}),await pmw.processEvent("select_item",{product:r})}),jQuery(document).on("pmw:view-cart",e=>{pmw.console.log("pmw:view-cart event fired",{event:e}),pmw.processEvent("view_cart",{})}),jQuery(document).on("pmw:begin-checkout",e=>{pmw.console.log("pmw:begin-checkout event fired",{event:e}),pmw.processEvent("begin_checkout",{})}),jQuery(document).on("pmw:add-payment-info",e=>{pmw.console.log("pmw:add-payment-info event fired",{event:e}),pmw.processEvent("add_payment_info",{})}),jQuery(document).on("pmw:add-to-wishlist",async(e,r)=>{pmw.console.log("pmw:add-to-wishlist event fired",{event:e,product:r}),await pmw.processEvent("add_to_wishlist",{product:r})}),jQuery(document).on("pmw:view-item",(e,r=null)=>{pmw.console.log("pmw:view-item event fired",{event:e,product:r}),pmw.processEvent("view_item",{product:r})}),jQuery(document).on("pmw:view-category",async(e,r=null)=>{pmw.console.log("pmw:view-category event fired",{event:e,product:r}),await pmw.processEvent("view_category",{product:r})}),jQuery(document).on("pmw:search",e=>{pmw.console.log("pmw:search event fired",{event:e}),pmw.processEvent("search",{})}),jQuery(document).on("pmw:place-order",async e=>{pmw.console.log("pmw:place-order event fired",{event:e}),await pmw.processEvent("place_order",{})}),jQuery(document).on("pmw:purchase",async e=>{pmw.console.log("pmw:purchase event fired",{event:e}),await pmw.processEvent("purchase",{order:pmwDataLayer.order})}),jQuery(document).on("pmw:login",async()=>{pmw.console.log("pmw:login event fired"),await pmw.processEvent("login",{})}),jQuery(document).on("pmw:ready",async()=>{pmw.isWooCommerceActive()&&(pmw.startIntersectionObserverToWatch(),pmw.startProductsMutationObserverToWatch())}),jQuery(document).on("pmw:load-pixels",()=>{pmw.waitForPixelsAndTriggerPageView()})},79(e,r,t){t(897),window.pmw.loadConsentModule=async()=>{const e=await t.e(625).then(t.bind(t,383));window.pmw.consent=e;const r=await t.e(968).then(t.bind(t,523));return window.pmw=window.pmw||{},window.pmw.consent=window.pmw.consent||{},window.pmw.consent.api=r,e},window.pmw=window.pmw||{},window.pmw.console=t(91),t(362)},91(e,r,t){"use strict";t.r(r),t.d(r,{error:()=>i,log:()=>a});const a=(e,...r)=>{o()&&("object"==typeof e?console.log("Pixel Manager: ",e,...r):r.length?console.log("Pixel Manager: "+e,...r):console.log("Pixel Manager: "+e))},i=(e,...r)=>{"object"==typeof e?console.error("Pixel Manager: ",e,...r):r.length?console.error("Pixel Manager: "+e,...r):console.error("Pixel Manager: "+e)},o=()=>!n()&&(!!s()||(!!c()||!!pmwDataLayer?.general?.logger?.is_active)),n=()=>(pmw.urlHasParameter("pmwloggeroff")&&pmw.storeData("loggerEnabled",!1),pmw.urlHasParameter("pmwloggeroff")),s=()=>pmw.retrieveData("loggerEnabled"),c=()=>(pmw.urlHasParameter("pmwloggeron")&&pmw.storeData("loggerEnabled",!0),pmw.urlHasParameter("pmwloggeron"))},160(e,r,t){"use strict";var a=this&&this.__spreadArrays||function(){for(var e=0,r=0,t=arguments.length;r<t;r++)e+=arguments[r].length;var a=Array(e),i=0;for(r=0;r<t;r++)for(var o=arguments[r],n=0,s=o.length;n<s;n++,i++)a[i]=o[n];return a};Object.defineProperty(r,"__esModule",{value:!0}),r.isSpecial=r.isReserved=r.isIPv4MappedAddress=r.isLocalhost=r.isPrivate=r.createChecker=r.isInSubnet=r.extractMappedIpv4=void 0;var i=t(609),o=t(503),n=/\./,s=/^(.+:ffff:)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?:%.+)?$/,c=/:/,u=/::/;function p(e){if(!i.isIPv6(e))throw new Error("not a valid IPv6 address: "+e);if(n.test(e))return p(function(e){var r=e.match(s);if(!r||!i.isIPv4(r[2]))throw new Error("not a mapped IPv4 address: "+e);var t=r[1],a=r[2].split(n).map(function(e){return parseInt(e,10)});return""+t+((a[0]<<8)+a[1]).toString(16)+":"+((a[2]<<8)+a[3]).toString(16)}(e));var r=e.split(u),t=r[0],a=r[1],o=t&&t.split(c)||[],d=a&&a.split(c)||[],l=new Array(8-(o.length+d.length));return o.concat(l,d)}function d(e){if(Array.isArray(e)){var r=e.map(function(e){return l(e)});return function(e){var t=p(e);return r.some(function(e){return e(t)})}}var t=l(e);return function(e){var r=p(e);return t(r)}}function l(e){var r=e.split("/"),t=r[0],a=r[1],i=parseInt(a,10);if(!t||!Number.isInteger(i))throw new Error("not a valid IPv6 CIDR subnet: "+e);if(i<0||i>128)throw new Error("not a valid IPv6 prefix length: "+i+" (from "+e+")");var o=p(t);return function(e){for(var r=0;r<8;++r){var t=Math.min(i-16*r,16);if(t<=0)break;if((o[r]&&parseInt(o[r],16)||0)>>16-t!==(e[r]&&parseInt(e[r],16)||0)>>16-t)return!1}return!0}}r.extractMappedIpv4=function(e){var r=e.match(s);if(!r||!i.isIPv4(r[2]))throw new Error("not a mapped IPv4 address: "+e);return r[2]},r.isInSubnet=function(e,r){return d(r)(e)},r.createChecker=d;var m={};r.isPrivate=function(e){return"private"in m==!1&&(m.private=d(o.default.private.ipv6)),m.private(e)},r.isLocalhost=function(e){return"localhost"in m==!1&&(m.localhost=d(o.default.localhost.ipv6)),m.localhost(e)},r.isIPv4MappedAddress=function(e){if("mapped"in m==!1&&(m.mapped=d("::ffff:0:0/96")),m.mapped(e)){var r=e.match(s);return Boolean(r&&i.isIPv4(r[2]))}return!1},r.isReserved=function(e){return"reserved"in m==!1&&(m.reserved=d(o.default.reserved.ipv6)),m.reserved(e)},r.isSpecial=function(e){return"special"in m==!1&&(m.special=d(a(o.default.private.ipv6,o.default.localhost.ipv6,o.default.reserved.ipv6))),m.special(e)}},165(e,r,t){!function(e){e.jQueryExists=async()=>new Promise(e=>{!function r(){if("undefined"!=typeof jQuery)return e();setTimeout(r,100)}()}),e.waitForLibrary=(e,r=5e3,t=100)=>{const a=Date.now();for(;void 0===window[e]&&!(Date.now()-a>r);)setTimeout(()=>{},t)},e.dataLayerFullyLoaded=async()=>{let e=new Promise(e=>{!function r(){if("undefined"!=typeof pmwDataLayer&&void 0!==pmwDataLayer.version)return e();setTimeout(r,100)}()}),r=setTimeout(()=>{console.error("Pixel Manager error: The pmwDataLayer is not defined. Please make sure that the pmwDataLayer script snippet is inserted and not modified by any third-party plugin, such as a consent management platform or a JavaScript optimizer.")},6e3);return e.then(()=>{clearTimeout(r)}),e},e.wpHooksExists=async()=>new Promise(e=>{!function r(){if("undefined"!=typeof wp&&void 0!==wp.hooks)return e();setTimeout(r,50)}()}),e.loadWcHooksFunctions=async()=>{await e.wpHooksExists(),await t.e(194).then(t.t.bind(t,224,23))}}(window.pmw=window.pmw||{},jQuery)},208(){!function(e){window.pmw=window.pmw||{},e.hooks={filters:{},addFilter:function(r,t,a,i=10){r&&"string"==typeof r?t&&"string"==typeof t?"function"==typeof a?(this.filters[r]||(this.filters[r]=[]),this.filters[r].push({namespace:t,callback:a,priority:i}),this.filters[r].sort((e,r)=>e.priority-r.priority),e.console.log(`Filter added: ${r} (${t}) with priority ${i}`)):e.console.error("Invalid callback provided to addFilter"):e.console.error("Invalid namespace provided to addFilter"):e.console.error("Invalid hook name provided to addFilter")},applyFilters:function(r,t,...a){if(!this.filters[r]||0===this.filters[r].length)return t;let i=t;for(const t of this.filters[r])try{const o=t.callback(i,...a);undefined!==o?i=o:e.console.warn(`Filter ${t.namespace} on ${r} returned undefined, keeping previous value`)}catch(a){e.console.error(`Filter error in ${t.namespace} on ${r}:`,a)}return i},removeFilter:function(r,t){if(!this.filters[r])return;const a=this.filters[r].length;this.filters[r]=this.filters[r].filter(e=>e.namespace!==t),this.filters[r].length<a&&e.console.log(`Filter removed: ${r} (${t})`)},removeAllFilters:function(r){this.filters[r]&&(delete this.filters[r],e.console.log(`All filters removed for: ${r}`))},hasFilter:function(e,r=null){return!(!this.filters[e]||0===this.filters[e].length)&&(!r||this.filters[e].some(e=>e.namespace===r))},getFilters:function(e){return this.filters[e]||[]}},e.hooks=e.hooks}(window.pmw=window.pmw||{},jQuery)},265(e,r,t){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.check=r.isSpecial=r.isReserved=r.isIPv4MappedAddress=r.isLocalhost=r.isPrivate=r.createChecker=r.isInSubnet=r.IPv6=r.IPv4=r.isIPv6=r.isIPv4=r.isIP=void 0;var a=t(618);r.IPv4=a;var i=t(160);r.IPv6=i;var o=t(609),n=t(609);function s(e,r){return c(r)(e)}function c(e){if(!Array.isArray(e))return c([e]);var r=e.reduce(function(e,r){var t=r.split("/")[0];return e[o.isIP(t)].push(r),e},{0:[],4:[],6:[]});if(0!==r[0].length)throw new Error("some subnets are not valid IP addresses: "+r[0]);var t=a.createChecker(r[4]),n=i.createChecker(r[6]);return function(e){if(!o.isIP(e))throw new Error("not a valid IPv4 or IPv6 address: "+e);return o.isIPv6(e)&&i.isIPv4MappedAddress(e)?n(e)||t(i.extractMappedIpv4(e)):o.isIPv6(e)?n(e):t(e)}}Object.defineProperty(r,"isIP",{enumerable:!0,get:function(){return n.isIP}}),Object.defineProperty(r,"isIPv4",{enumerable:!0,get:function(){return n.isIPv4}}),Object.defineProperty(r,"isIPv6",{enumerable:!0,get:function(){return n.isIPv6}}),r.isInSubnet=s,r.createChecker=c,r.isPrivate=function(e){return o.isIPv6(e)?i.isIPv4MappedAddress(e)?a.isPrivate(i.extractMappedIpv4(e)):i.isPrivate(e):a.isPrivate(e)},r.isLocalhost=function(e){return o.isIPv6(e)?i.isIPv4MappedAddress(e)?a.isLocalhost(i.extractMappedIpv4(e)):i.isLocalhost(e):a.isLocalhost(e)},r.isIPv4MappedAddress=function(e){return!!o.isIPv6(e)&&i.isIPv4MappedAddress(e)},r.isReserved=function(e){return o.isIPv6(e)?i.isIPv4MappedAddress(e)?a.isReserved(i.extractMappedIpv4(e)):i.isReserved(e):a.isReserved(e)},r.isSpecial=function(e){return o.isIPv6(e)?i.isIPv4MappedAddress(e)?a.isSpecial(i.extractMappedIpv4(e)):i.isSpecial(e):a.isSpecial(e)},r.check=s},341(){!function(e){e.getConsentContext=function(){const r=e.consent?.categories?.get()||{statistics:!0,marketing:!0,preferences:!0,necessary:!0};return{categories:{statistics:r.statistics,marketing:r.marketing,preferences:r.preferences,necessary:r.necessary},visitor_has_chosen:e.consent?.settings?.get()?.visitorHasChosen??!1,explicit_mode:e.consent?.explicitConsentModeActive?.()??!1}},e.getEventContext=function(){return{timestamp:Math.floor(Date.now()/1e3),url:window.location.href,referrer:e.retrieveData("referrer")?e.makeFullUrl(e.retrieveData("referrer")):document.referrer,user_agent:navigator.userAgent,page_type:pmwDataLayer?.shop?.page_type,user_id:pmwDataLayer?.user?.id?.raw||null,consent:e.getConsentContext()}},e.processEvent=async function(r,t){e.console.log(`Processing event: ${r}`,t);try{let a={event:r,event_data:t,pixels:{},context:e.getEventContext()};a=e.hooks.applyFilters("pmw_event_payload_pre",a,r);const i=e.pixelRegistry.getActivePixels();for(const t of i){const i=e.pixelRegistry.getAdapter(t);if(i&&"function"==typeof i.adapt)try{let o=await i.adapt(a.event_data,r,a.context);if(null===o)continue;o=e.hooks.applyFilters(`pmw_pixel_data_${t}`,o,r,a.event_data,a.context),a.pixels[t]=o}catch(r){e.console.error(`Error adapting data for ${t}:`,r)}else e.console.log(`No adapter found for pixel: ${t}`)}a=e.hooks.applyFilters(`pmw_event_payload_${r}`,a,a.event_data),a=e.hooks.applyFilters("pmw_event_payload_post",a,r),a.firing={};for(const t of Object.keys(a.pixels))a.firing[t]=e.pixelRegistry.getFiringDecision(t,r);return await e.dispatchToPixels(a),a}catch(t){throw e.console.error(`Error processing event ${r}:`,t),t}},e.dispatchToPixels=async function(r){const t=r.event;if(e.dispatchUnifiedEvent(r),e.dispatchPublicEvent(r),"purchase"!==t){if(pmwDataLayer?.general?.server_2_server?.active){const a=e.extractS2SData(r);if(Object.keys(a).length>0){const r=e.pixelRegistry.getPixelsForServerFiring(t);e.console.log(`S2S enabled pixels for ${t}:`,r),await e.sendEventPayloadToServer(a)}}}else e.console.log("Purchase event - skipping browser-to-server transmission (handled server-side only)")},e.dispatchUnifiedEvent=function(r){const t=e.pixelRegistry.getActivePixels();if(0===t.length)return;const a=r.event.replace(/_/g,"-");e.console.log(`Dispatching unified event pmw:pixel:${a}`,{activePixels:t,firingStatus:r.firing}),jQuery(document).trigger(`pmw:pixel:${a}`,r)},e.dispatchToBrowserPixels=function(r){const t=e.pixelRegistry.getActiveBrowserOnlyPixels();if(0===t.length)return;e.console.log(`[DEPRECATED] Dispatching to browser-only pixels for ${r.event}:`,t);const a=r.event.replace(/_/g,"-");jQuery(document).trigger(`pmw:browser:${a}`,r)},e.dispatchToS2SPixels=function(r){const t=e.pixelRegistry.getActiveS2SPixels();if(0===t.length)return;e.console.log(`[DEPRECATED] Dispatching to S2S-capable pixels for ${r.event}:`,t);const a=r.event.replace(/_/g,"-");jQuery(document).trigger(`pmw:s2s:${a}`,r)},e.dispatchPublicEvent=function(r){const t=r.event.replace(/_/g,"-");jQuery(document).trigger(`pmw:event:${t}`,r),e.console.log(`Public event dispatched: pmw:event:${t}`,r)},e.extractS2SData=function(r){const t={event:r.event},a=e.pixelRegistry.getPixelsForServerFiring(r.event);for(const e of a)r.pixels[e]&&(t[e]=r.pixels[e]);return r.event_data?.product&&(t.product=r.event_data.product),t},e.shouldFireBrowserPixel=function(e,r){return!0===e.firing?.[r]?.fire_browser},e.shouldFireServerPixel=function(e,r){return!0===e.firing?.[r]?.fire_server},e.adapters||(e.adapters={}),e.registerAdapter=function(r,t,a={}){if(!t||"function"!=typeof t.adapt)return void e.console.error(`Invalid adapter for ${r}: must have an adapt() method`);e.adapters[r]=t,e.pixelCapabilities||(e.pixelCapabilities={});let i="browser_only";a.supportsS2S&&(i="both"),e.pixelCapabilities[r]={mode:a.mode||i,supportsS2S:a.supportsS2S||!1,supportsEventDeduplication:a.supportsEventDeduplication||!1,isActive:a.isActive||null}}}(window.pmw=window.pmw||{},jQuery)},362(e,r,t){!function(e,r,a){const{isRange:i,isIP:o,isV4:n,isV6:s,version:c}=t(723);let u=null,p=!1;const d={cloudflare:{any:"https://www.cloudflare.com/cdn-cgi/trace"},icanhazip:{4:"https://ipv4.icanhazip.com",6:"https://ipv6.icanhazip.com",any:"https://icanhazip.com"},ipinfo:{any:"https://ipinfo.io/ip"},myexternalip:{any:"https://myexternalip.com/raw"},ipify:{4:"https://api4.ipify.org",6:"https://api6.ipify.org",any:"https://api64.ipify.org"},identme:{4:"https://4.ident.me/",6:"https://6.ident.me/",any:"https://ident.me/"}},l=(e,r=3e3)=>{const t=new AbortController,a=setTimeout(()=>t.abort(),r);return fetch(e,{signal:t.signal}).finally(()=>clearTimeout(a))};e.getGeoInfo={cloudflare:async()=>{const e=await l("https://www.cloudflare.com/cdn-cgi/trace");if(!e.ok)throw new Error(`The response from Cloudflare was not OK. Status: ${e.status}`);let r=await e.text();if(!r)throw new Error("No data was returned from Cloudflare");if(r=r.trim().split("\n").reduce((e,r)=>(e[(r=r.split("="))[0]]=r[1],e),{}),!r.ip||!r.loc)throw new Error("The JSON data is missing the ip or loc key from Cloudflare");if(m(r.loc))throw new Error("We have to validate the region, and this service is not returning the region.");return{ip:r.ip,countryCode:r.loc,service:"cloudflare"}},geojs:async()=>{const e=await l("https://get.geojs.io/v1/ip/geo.json");if(!e.ok)throw new Error(`The response from geojs was not OK. Status: ${e.status}`);let r=await e.json();if(!r)throw new Error("No JSON data was returned from geojs");if(!r.ip||!r.country_code||!r.region)throw new Error("The JSON data is missing the ip, country_code, or region key from geojs");return{ip:r.ip,countryCode:r.country_code,region:r.region,service:"geojs"}},ipinfo:async()=>{const e=await l("https://ipinfo.io/json");if(!e.ok)throw new Error(`The response from ipinfo was not OK from ipinfo. Status: ${e.status}`);let r=await e.json();if(!r)throw new Error("No JSON data was returned from ipinfo");if(!r.ip||!r.country||!r.region)throw new Error("The JSON data is missing the ip, country, or region key from ipinfo");return{ip:r.ip,countryCode:r.country,region:r.region,service:"ipinfo"}},ipapi:async()=>{const e=await l("https://ipapi.co/json");if(!e.ok)throw new Error(`The response from ipapi was not OK. Status: ${e.status}`);let r=await e.json();if(!r)throw new Error("No JSON data was returned from ipapi");if(!r.ip||!r.country||!r.region)throw new Error("The JSON data is missing the ip, country, or region key from ipapi");return{ip:r.ip,countryCode:r.country,region:r.region,service:"ipapi"}}};const m=e=>{if("US "!==e)return!1;return["US-CA","US-VA"].some(e=>pmwDataLayer?.general?.consent_management.restricted_regions.includes(e))};e.isVisitorAllowed=async()=>{if(null!==e.retrieveData("visitorAllowed")&&e.retrieveData("visitorAllowed")!==a)return!!JSON.parse(e.retrieveData("visitorAllowed"));if(e.isBotUserAgent())return e.storeData("visitorAllowed",!1),!1;if(Array.isArray(pmwDataLayer?.general?.server_2_server?.ip_exclude_list)&&pmwDataLayer.general.server_2_server.ip_exclude_list.length>0){const r=await e.getIp();if(w(r))return e.storeData("visitorAllowed",!1),!1}return e.storeData("visitorAllowed",!0),!0},e.isValidIpAddress=r=>!(!r||"string"!=typeof r)&&(!!o(r)&&!e.isPrivateOrReservedIp(r)),e.isPrivateOrReservedIp=e=>{if(!e)return!0;const r=n(e)?["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16","127.0.0.0/8","169.254.0.0/16","0.0.0.0/8"]:["::1/128","fc00::/7","fe80::/10","::/128"];try{const a=t(265);for(const t of r)if(a.isInSubnet(e,t))return!0}catch(r){if(n(e)){if(e.startsWith("10.")||e.startsWith("192.168.")||e.startsWith("127.")||e.startsWith("169.254.")||e.startsWith("0."))return!0;const r=e.split(".");if("172"===r[0]){const e=parseInt(r[1],10);if(e>=16&&e<=31)return!0}}else if("::1"===e||e.startsWith("fc")||e.startsWith("fd")||e.startsWith("fe80:"))return!0}return!1},e.getClientIp=async()=>{const r=e.retrieveData("client_ip");return r&&e.isValidIpAddress(r)?r:(u&&!p||(p=!1,u=(async()=>{try{const r=e.getIpWithTimeout("6",2e3),t=e.getIp("any"),[a,i]=await Promise.allSettled([r,t]);let o=null;return"fulfilled"===a.status&&a.value?(o=a.value,e.console.log(`Using IPv6 address: ${o}`)):"fulfilled"===i.status&&i.value&&(o=i.value,e.console.log(`IPv6 not available, using IP: ${o}`)),o&&e.isValidIpAddress(o)?(e.storeData("client_ip",o),p=!0,o):(p=!0,null)}catch(r){return e.console.error("Error detecting client IP:",r),p=!0,null}})()),u)},e.getIpWithTimeout=async(r,t)=>Promise.race([e.getIp(r),new Promise((e,a)=>setTimeout(()=>a(new Error(`IPv${r} detection timed out after ${t}ms`)),t))]).catch(r=>(e.console.log(r.message),null)),e.getIp=async(r="any",t=3)=>{const i=["any","4","6"];if(!i.includes(r))return console.error("The version argument must be one of the following: "+i.join(", ")),null;if("any"===r&&e.retrieveData("ip"))return e.retrieveData("ip");const n=e.retrieveData(`ipv${r}`);if(n!==a)return n;e.console.log("Testing the IP address of the browser because one ore more server-to-server APIs are enabled and require the browser IP. It may trigger connection request errors in the console while testing the IP address. This is normal and expected behavior.");try{const a=await e.getIpFromAnyService(r,t);return a&&!o(a)?(e.console.warn(`Invalid IP address received: ${a}`),null):("any"===r&&a&&e.storeData("ip",a),(4===c(a)||"4"===r&&null===a)&&e.storeData("ipv4",a),(6===c(a)||"6"===r&&null===a)&&e.storeData("ipv6",a),a)}catch(e){return null}},e.getBrowserGeoFromExternalService=async()=>{const r=performance.now();let t=[];Object.keys(e.getGeoInfo).forEach(r=>{t.push(e.getGeoInfo[r]())});try{const a=await Promise.any(t);return a.countryCode=a.countryCode.toUpperCase(),a.region&&"California"===a.region&&(a.regionCode="US-CA"),a.region&&"Virginia"===a.region&&(a.regionCode="US-VA"),e.console.log("Retrieved the browser geo info from an external service: ",a," which took ",(performance.now()-r).toFixed(2)+" ms"),a}catch(r){return e.console.error("error: ",r),null}};e.getBrowserGeo=async()=>{let r={};if(e.retrieveData("geoCountryCode")&&(r.countryCode=e.retrieveData("geoCountryCode")),e.retrieveData("geoRegionCode")&&(r.regionCode=e.retrieveData("geoRegionCode")),e.retrieveData("geoRegion")&&(r.region=e.retrieveData("geoRegion")),r.countryCode)return e.console.log("Retrieved the browser geo location from the cache: ",r),r;let a=await e.getBrowserGeoFromExternalService();if(!a){const r=(()=>{const e=t(473).getLocationByTimeZone();return e.countryCode?e:null})();a={},r&&e.console.log("Retrieved the browser geo location from the timezone: ",r),r.countryCode&&(a.countryCode=r.countryCode),r.regionCode&&(a.regionCode=r.regionCode)}return a?.ip&&e.storeData("ip",a.ip),a?.countryCode&&e.storeData("geoCountryCode",a.countryCode),a?.regionCode&&e.storeData("geoRegionCode",a.regionCode),a?.region&&e.storeData("geoRegion",a.region),a?.countryCode?a:null},e.getIpFromAnyService=async(r="any",t=3)=>{const a=performance.now(),i=Object.keys(d).filter(e=>d[e][r]).slice(0,t).reduce((e,r)=>(e[r]=d[r],e),{});let o=[];if(Object.keys(i).forEach(t=>{i[t][r]&&o.push(e.getIpFromService(t,r))}),!(o.length>0))return e.console.log("No promises to resolve"),null;try{const r=await Promise.any(o),t=(performance.now()-a).toFixed(2);return e.console.log(`Retrieved the IP address ${r.ip} from ${r.service} which took ${t} ms`),r.ip}catch(t){return e.console.log(`Could not retrieve an IP with version ${r} from any of the services.`),null}},e.getIpFromService=async(r,t="any")=>{try{let a={ip:null,service:r,ipVersion:t};if(!d[r][t])return Promise.reject(new Error(`The IP version ${t} is not available for the service ${r}`));e.console.log(`Fetching IP from ${r} using IP version ${t}`);const i=await l(d[r][t]);if(!i.ok)return Promise.reject(new Error(`The response from ${r} was not OK. Status: ${i.status}`));let n=await i.text();return"cloudflare"===r?(n=n.trim().split("\n").reduce((e,r)=>(e[(r=r.split("="))[0]]=r[1],e),{}),a.ip=n.ip):a.ip=n.trim(),o(a.ip)?a:Promise.reject(new Error(`The returned value from ${r} is not an IP address`))}catch(e){return Promise.reject(e)}};e.isVisitorNotAllowed=async()=>!1===await e.isVisitorAllowed(),e.isBotUserAgent=()=>{const e=navigator.userAgent||"";if(!e)return!0;const r=g();for(const t of r)if(e.toLowerCase().includes(t.toLowerCase()))return!0;return!1};const g=()=>{let e=[];Array.isArray(pmwDataLayer?.general?.server_2_server?.user_agent_exclude_patterns)&&(e=pmwDataLayer.general.server_2_server.user_agent_exclude_patterns);return["Googlebot","Google-InspectionTool","Google-Extended","Storebot-Google","bingbot","BingPreview","msnbot","Slurp","DuckDuckBot","Baiduspider","YandexBot","Sogou","facebookexternalhit","FacebookBot","LinkedInBot","Twitterbot","PinterestBot","TikTokBot","SnapchatAds","DiscordBot","InstagramBot","WhatsApp","AhrefsBot","SemrushBot","MJ12bot","DotBot","rogerbot","UptimeRobot","Pingdom","StatusCake","GTmetrix","ClaudeBot","GPTBot","ChatGPT","anthropic-ai","CCBot","PerplexityBot","crawler","spider","scraper","bot/","/bot","bot-"].concat(e)},f=e=>e.includes("/"),w=e=>{const r=pmwDataLayer?.general?.server_2_server?.ip_exclude_list||[];for(const t of r)if(f(t)){if(isInSubnet.isInSubnet(e,t))return!0}else if(e===t)return!0;return!1}}(window.pmw=window.pmw||{},jQuery)},473(e,r,t){"use strict";t.r(r),t.d(r,{getLocationByTimeZone:()=>a});const a=()=>{const e=Intl.DateTimeFormat().resolvedOptions().timeZone;if(""===e||!e)return null;let r={countryCode:{"Africa/Abidjan":["CI","BF","GH","GM","GN","ML","MR","SH","SL","SN","TG"],"Africa/Accra":["GH"],"Africa/Addis_Ababa":["ET"],"Africa/Algiers":["DZ"],"Africa/Asmara":["ER"],"Africa/Asmera":["ER"],"Africa/Bamako":["ML"],"Africa/Bangui":["CF"],"Africa/Banjul":["GM"],"Africa/Bissau":["GW"],"Africa/Blantyre":["MW"],"Africa/Brazzaville":["CG"],"Africa/Bujumbura":["BI"],"Africa/Cairo":["EG"],"Africa/Casablanca":["MA"],"Africa/Ceuta":["ES"],"Africa/Conakry":["GN"],"Africa/Dakar":["SN"],"Africa/Dar_es_Salaam":["TZ"],"Africa/Djibouti":["DJ"],"Africa/Douala":["CM"],"Africa/El_Aaiun":["EH"],"Africa/Freetown":["SL"],"Africa/Gaborone":["BW"],"Africa/Harare":["ZW"],"Africa/Johannesburg":["ZA","LS","SZ"],"Africa/Juba":["SS"],"Africa/Kampala":["UG"],"Africa/Khartoum":["SD"],"Africa/Kigali":["RW"],"Africa/Kinshasa":["CD"],"Africa/Lagos":["NG","AO","BJ","CD","CF","CG","CM","GA","GQ","NE"],"Africa/Libreville":["GA"],"Africa/Lome":["TG"],"Africa/Luanda":["AO"],"Africa/Lubumbashi":["CD"],"Africa/Lusaka":["ZM"],"Africa/Malabo":["GQ"],"Africa/Maputo":["MZ","BI","BW","CD","MW","RW","ZM","ZW"],"Africa/Maseru":["LS"],"Africa/Mbabane":["SZ"],"Africa/Mogadishu":["SO"],"Africa/Monrovia":["LR"],"Africa/Nairobi":["KE","DJ","ER","ET","KM","MG","SO","TZ","UG","YT"],"Africa/Ndjamena":["TD"],"Africa/Niamey":["NE"],"Africa/Nouakchott":["MR"],"Africa/Ouagadougou":["BF"],"Africa/Porto-Novo":["BJ"],"Africa/Sao_Tome":["ST"],"Africa/Timbuktu":["ML"],"Africa/Tripoli":["LY"],"Africa/Tunis":["TN"],"Africa/Windhoek":["NA"],"America/Adak":["US"],"America/Anchorage":["US"],"America/Anguilla":["AI"],"America/Antigua":["AG"],"America/Araguaina":["BR"],"America/Argentina/Buenos_Aires":["AR"],"America/Argentina/Catamarca":["AR"],"America/Argentina/Cordoba":["AR"],"America/Argentina/Jujuy":["AR"],"America/Argentina/La_Rioja":["AR"],"America/Argentina/Mendoza":["AR"],"America/Argentina/Rio_Gallegos":["AR"],"America/Argentina/Salta":["AR"],"America/Argentina/San_Juan":["AR"],"America/Argentina/San_Luis":["AR"],"America/Argentina/Tucuman":["AR"],"America/Argentina/Ushuaia":["AR"],"America/Aruba":["AW"],"America/Asuncion":["PY"],"America/Atikokan":["CA"],"America/Bahia":["BR"],"America/Bahia_Banderas":["MX"],"America/Barbados":["BB"],"America/Belem":["BR"],"America/Belize":["BZ"],"America/Blanc-Sablon":["CA"],"America/Boa_Vista":["BR"],"America/Bogota":["CO"],"America/Boise":["US"],"America/Cambridge_Bay":["CA"],"America/Campo_Grande":["BR"],"America/Cancun":["MX"],"America/Caracas":["VE"],"America/Cayenne":["GF"],"America/Cayman":["KY"],"America/Chicago":["US"],"America/Chihuahua":["MX"],"America/Coral_Harbour":["CA"],"America/Costa_Rica":["CR"],"America/Creston":["CA"],"America/Cuiaba":["BR"],"America/Curacao":["CW"],"America/Danmarkshavn":["GL"],"America/Dawson":["CA"],"America/Dawson_Creek":["CA"],"America/Denver":["US"],"America/Detroit":["US"],"America/Dominica":["DM"],"America/Edmonton":["CA"],"America/Eirunepe":["BR"],"America/El_Salvador":["SV"],"America/Fort_Nelson":["CA"],"America/Fortaleza":["BR"],"America/Glace_Bay":["CA"],"America/Goose_Bay":["CA"],"America/Grand_Turk":["TC"],"America/Grenada":["GD"],"America/Guadeloupe":["GP"],"America/Guatemala":["GT"],"America/Guayaquil":["EC"],"America/Guyana":["GY"],"America/Halifax":["CA"],"America/Havana":["CU"],"America/Hermosillo":["MX"],"America/Indiana/Indianapolis":["US"],"America/Indiana/Knox":["US"],"America/Indiana/Marengo":["US"],"America/Indiana/Petersburg":["US"],"America/Indiana/Tell_City":["US"],"America/Indiana/Vevay":["US"],"America/Indiana/Vincennes":["US"],"America/Indiana/Winamac":["US"],"America/Inuvik":["CA"],"America/Iqaluit":["CA"],"America/Jamaica":["JM"],"America/Juneau":["US"],"America/Kentucky/Louisville":["US"],"America/Kentucky/Monticello":["US"],"America/Kralendijk":["BQ"],"America/La_Paz":["BO"],"America/Lima":["PE"],"America/Los_Angeles":["US"],"America/Lower_Princes":["SX"],"America/Maceio":["BR"],"America/Managua":["NI"],"America/Manaus":["BR"],"America/Marigot":["MF"],"America/Martinique":["MQ"],"America/Matamoros":["MX"],"America/Mazatlan":["MX"],"America/Menominee":["US"],"America/Merida":["MX"],"America/Metlakatla":["US"],"America/Mexico_City":["MX"],"America/Miquelon":["PM"],"America/Moncton":["CA"],"America/Monterrey":["MX"],"America/Montevideo":["UY"],"America/Montreal":["CA"],"America/Montserrat":["MS"],"America/Nassau":["BS"],"America/New_York":["US"],"America/Nipigon":["CA"],"America/Nome":["US"],"America/Noronha":["BR"],"America/North_Dakota/Beulah":["US"],"America/North_Dakota/Center":["US"],"America/North_Dakota/New_Salem":["US"],"America/Nuuk":["GL"],"America/Ojinaga":["MX"],"America/Panama":["PA","CA","KY"],"America/Pangnirtung":["CA"],"America/Paramaribo":["SR"],"America/Phoenix":["US","CA"],"America/Port-au-Prince":["HT"],"America/Port_of_Spain":["TT"],"America/Porto_Velho":["BR"],"America/Puerto_Rico":["PR","AG","CA","AI","AW","BL","BQ","CW","DM","GD","GP","KN","LC","MF","MS","SX","TT","VC","VG","VI"],"America/Punta_Arenas":["CL"],"America/Rainy_River":["CA"],"America/Rankin_Inlet":["CA"],"America/Recife":["BR"],"America/Regina":["CA"],"America/Resolute":["CA"],"America/Rio_Branco":["BR"],"America/Santarem":["BR"],"America/Santiago":["CL"],"America/Santo_Domingo":["DO"],"America/Sao_Paulo":["BR"],"America/Scoresbysund":["GL"],"America/Sitka":["US"],"America/St_Barthelemy":["BL"],"America/St_Johns":["CA"],"America/St_Kitts":["KN"],"America/St_Lucia":["LC"],"America/St_Thomas":["VI"],"America/St_Vincent":["VC"],"America/Swift_Current":["CA"],"America/Tegucigalpa":["HN"],"America/Thule":["GL"],"America/Thunder_Bay":["CA"],"America/Tijuana":["MX"],"America/Toronto":["CA","BS"],"America/Tortola":["VG"],"America/Vancouver":["CA"],"America/Virgin":["VI"],"America/Whitehorse":["CA"],"America/Winnipeg":["CA"],"America/Yakutat":["US"],"America/Yellowknife":["CA"],"Antarctica/Casey":["AQ"],"Antarctica/Davis":["AQ"],"Antarctica/DumontDUrville":["AQ"],"Antarctica/Macquarie":["AU"],"Antarctica/Mawson":["AQ"],"Antarctica/McMurdo":["AQ"],"Antarctica/Palmer":["AQ"],"Antarctica/Rothera":["AQ"],"Antarctica/South_Pole":["AQ"],"Antarctica/Syowa":["AQ"],"Antarctica/Troll":["AQ"],"Antarctica/Vostok":["AQ"],"Arctic/Longyearbyen":["SJ"],"Asia/Aden":["YE"],"Asia/Almaty":["KZ"],"Asia/Amman":["JO"],"Asia/Anadyr":["RU"],"Asia/Aqtau":["KZ"],"Asia/Aqtobe":["KZ"],"Asia/Ashgabat":["TM"],"Asia/Atyrau":["KZ"],"Asia/Baghdad":["IQ"],"Asia/Bahrain":["BH"],"Asia/Baku":["AZ"],"Asia/Bangkok":["TH","KH","LA","VN"],"Asia/Barnaul":["RU"],"Asia/Beirut":["LB"],"Asia/Bishkek":["KG"],"Asia/Brunei":["BN"],"Asia/Chita":["RU"],"Asia/Choibalsan":["MN"],"Asia/Colombo":["LK"],"Asia/Damascus":["SY"],"Asia/Dhaka":["BD"],"Asia/Dili":["TL"],"Asia/Dubai":["AE","OM"],"Asia/Dushanbe":["TJ"],"Asia/Famagusta":["CY"],"Asia/Gaza":["PS"],"Asia/Hebron":["PS"],"Asia/Ho_Chi_Minh":["VN"],"Asia/Hong_Kong":["HK"],"Asia/Hovd":["MN"],"Asia/Irkutsk":["RU"],"Asia/Jakarta":["ID"],"Asia/Jayapura":["ID"],"Asia/Jerusalem":["IL"],"Asia/Kabul":["AF"],"Asia/Kamchatka":["RU"],"Asia/Karachi":["PK"],"Asia/Kathmandu":["NP"],"Asia/Khandyga":["RU"],"Asia/Kolkata":["IN"],"Asia/Krasnoyarsk":["RU"],"Asia/Kuala_Lumpur":["MY"],"Asia/Kuching":["MY"],"Asia/Kuwait":["KW"],"Asia/Macau":["MO"],"Asia/Magadan":["RU"],"Asia/Makassar":["ID"],"Asia/Manila":["PH"],"Asia/Muscat":["OM"],"Asia/Nicosia":["CY"],"Asia/Novokuznetsk":["RU"],"Asia/Novosibirsk":["RU"],"Asia/Omsk":["RU"],"Asia/Oral":["KZ"],"Asia/Phnom_Penh":["KH"],"Asia/Pontianak":["ID"],"Asia/Pyongyang":["KP"],"Asia/Qatar":["QA","BH"],"Asia/Qostanay":["KZ"],"Asia/Qyzylorda":["KZ"],"Asia/Riyadh":["SA","AQ","KW","YE"],"Asia/Sakhalin":["RU"],"Asia/Samarkand":["UZ"],"Asia/Seoul":["KR"],"Asia/Shanghai":["CN"],"Asia/Singapore":["SG","MY"],"Asia/Srednekolymsk":["RU"],"Asia/Taipei":["TW"],"Asia/Tashkent":["UZ"],"Asia/Tbilisi":["GE"],"Asia/Tehran":["IR"],"Asia/Thimphu":["BT"],"Asia/Tokyo":["JP"],"Asia/Tomsk":["RU"],"Asia/Ulaanbaatar":["MN"],"Asia/Urumqi":["CN"],"Asia/Ust-Nera":["RU"],"Asia/Vientiane":["LA"],"Asia/Vladivostok":["RU"],"Asia/Yakutsk":["RU"],"Asia/Yangon":["MM"],"Asia/Yekaterinburg":["RU"],"Asia/Yerevan":["AM"],"Atlantic/Azores":["PT"],"Atlantic/Bermuda":["BM"],"Atlantic/Canary":["ES"],"Atlantic/Cape_Verde":["CV"],"Atlantic/Faroe":["FO"],"Atlantic/Jan_Mayen":["SJ"],"Atlantic/Madeira":["PT"],"Atlantic/Reykjavik":["IS"],"Atlantic/South_Georgia":["GS"],"Atlantic/St_Helena":["SH"],"Atlantic/Stanley":["FK"],"Australia/Adelaide":["AU"],"Australia/Brisbane":["AU"],"Australia/Broken_Hill":["AU"],"Australia/Darwin":["AU"],"Australia/Eucla":["AU"],"Australia/Hobart":["AU"],"Australia/Lindeman":["AU"],"Australia/Lord_Howe":["AU"],"Australia/Melbourne":["AU"],"Australia/Perth":["AU"],"Australia/Sydney":["AU"],"Canada/Eastern":["CA"],"Europe/Amsterdam":["NL"],"Europe/Andorra":["AD"],"Europe/Astrakhan":["RU"],"Europe/Athens":["GR"],"Europe/Belfast":["GB"],"Europe/Belgrade":["RS","BA","HR","ME","MK","SI"],"Europe/Berlin":["DE"],"Europe/Bratislava":["SK"],"Europe/Brussels":["BE"],"Europe/Bucharest":["RO"],"Europe/Budapest":["HU"],"Europe/Busingen":["DE"],"Europe/Chisinau":["MD"],"Europe/Copenhagen":["DK"],"Europe/Dublin":["IE"],"Europe/Gibraltar":["GI"],"Europe/Guernsey":["GG"],"Europe/Helsinki":["FI","AX"],"Europe/Isle_of_Man":["IM"],"Europe/Istanbul":["TR"],"Europe/Jersey":["JE"],"Europe/Kaliningrad":["RU"],"Europe/Kiev":["UA"],"Europe/Kirov":["RU"],"Europe/Lisbon":["PT"],"Europe/Ljubljana":["SI"],"Europe/London":["GB","GG","IM","JE"],"Europe/Luxembourg":["LU"],"Europe/Madrid":["ES"],"Europe/Malta":["MT"],"Europe/Mariehamn":["AX"],"Europe/Minsk":["BY"],"Europe/Monaco":["MC"],"Europe/Moscow":["RU"],"Europe/Oslo":["NO","SJ","BV"],"Europe/Paris":["FR"],"Europe/Podgorica":["ME"],"Europe/Prague":["CZ","SK"],"Europe/Riga":["LV"],"Europe/Rome":["IT","SM","VA"],"Europe/Samara":["RU"],"Europe/San_Marino":["SM"],"Europe/Sarajevo":["BA"],"Europe/Saratov":["RU"],"Europe/Simferopol":["RU","UA"],"Europe/Skopje":["MK"],"Europe/Sofia":["BG"],"Europe/Stockholm":["SE"],"Europe/Tallinn":["EE"],"Europe/Tirane":["AL"],"Europe/Ulyanovsk":["RU"],"Europe/Uzhgorod":["UA"],"Europe/Vaduz":["LI"],"Europe/Vatican":["VA"],"Europe/Vienna":["AT"],"Europe/Vilnius":["LT"],"Europe/Volgograd":["RU"],"Europe/Warsaw":["PL"],"Europe/Zagreb":["HR"],"Europe/Zaporozhye":["UA"],"Europe/Zurich":["CH","DE","LI"],GB:["GB"],"GB-Eire":["GB"],"Indian/Antananarivo":["MG"],"Indian/Chagos":["IO"],"Indian/Christmas":["CX"],"Indian/Cocos":["CC"],"Indian/Comoro":["KM"],"Indian/Kerguelen":["TF","HM"],"Indian/Mahe":["SC"],"Indian/Maldives":["MV"],"Indian/Mauritius":["MU"],"Indian/Mayotte":["YT"],"Indian/Reunion":["RE","TF"],NZ:["NZ"],"Pacific/Apia":["WS"],"Pacific/Auckland":["NZ","AQ"],"Pacific/Bougainville":["PG"],"Pacific/Chatham":["NZ"],"Pacific/Chuuk":["FM"],"Pacific/Easter":["CL"],"Pacific/Efate":["VU"],"Pacific/Fakaofo":["TK"],"Pacific/Fiji":["FJ"],"Pacific/Funafuti":["TV"],"Pacific/Galapagos":["EC"],"Pacific/Gambier":["PF"],"Pacific/Guadalcanal":["SB"],"Pacific/Guam":["GU","MP"],"Pacific/Honolulu":["US","UM"],"Pacific/Johnston":["UM"],"Pacific/Kanton":["KI"],"Pacific/Kiritimati":["KI"],"Pacific/Kosrae":["FM"],"Pacific/Kwajalein":["MH"],"Pacific/Majuro":["MH"],"Pacific/Marquesas":["PF"],"Pacific/Midway":["UM"],"Pacific/Nauru":["NR"],"Pacific/Niue":["NU"],"Pacific/Norfolk":["NF"],"Pacific/Noumea":["NC"],"Pacific/Pago_Pago":["AS","UM"],"Pacific/Palau":["PW"],"Pacific/Pitcairn":["PN"],"Pacific/Pohnpei":["FM"],"Pacific/Port_Moresby":["PG","AQ"],"Pacific/Rarotonga":["CK"],"Pacific/Saipan":["MP"],"Pacific/Samoa":["WS"],"Pacific/Tahiti":["PF"],"Pacific/Tarawa":["KI"],"Pacific/Tongatapu":["TO"],"Pacific/Wake":["UM"],"Pacific/Wallis":["WF"],Singapore:["SG"],"US/Arizona":["US"],"US/Hawaii":["US"],"US/Samoa":["WS"]}[e][0].toUpperCase()};return"America/Los_Angeles"===e&&(r.regionCode="US-CA"),"Europe/Zurich"===e&&(r.regionCode="CH-ZH"),r}},503(e,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default={localhost:{ipv4:["127.0.0.0/8"],ipv6:["::1/128"]},private:{ipv4:["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16"],ipv6:["fe80::/10","fc00::/7"]},reserved:{ipv4:["0.0.0.0/8","100.64.0.0/10","169.254.0.0/16","192.0.0.0/24","192.0.2.0/24","192.88.99.0/24","198.18.0.0/15","198.51.100.0/24","203.0.113.0/24","224.0.0.0/4","240.0.0.0/4","255.255.255.255/32"],ipv6:["::/128","64:ff9b::/96","100::/64","2001::/32","2001:10::/28","2001:20::/28","2001:db8::/32","2002::/16","ff00::/8"]}}},544(){const e=pmw.prepareSelectors([".add_to_cart_button:not(.product_type_variable)",".ajax_add_to_cart",".single_add_to_cart_button"],"addToCart");jQuery(e).on("click adding_to_cart",(e,r)=>{try{let r=e?.target?.dataset?.quantity?e.target.dataset.quantity:null,t=e?.target?.dataset?.product_id?e.target.dataset.product_id:e?.target?.value?e.target.value:null;if("product"===pmwDataLayer.shop.page_type){if(void 0!==jQuery(e.currentTarget).attr("href")&&jQuery(e.currentTarget).attr("href").includes("add-to-cart"))return t||(t=jQuery(e.currentTarget).data("product_id")),void pmw.addProductToCart(t,1);if("simple"===pmwDataLayer.shop.product_type)return null===r&&(r=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),t||(t=jQuery(e.currentTarget).val()),t||(t=jQuery(".product").attr("id").replace("product-","")),void pmw.addProductToCart(t,r);if(["variable","variable-subscription"].indexOf(pmwDataLayer.shop.product_type)>=0)return null===r&&(r=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),t||(t=jQuery("[name='variation_id']").val()),void pmw.addProductToCart(t,r);if("grouped"===pmwDataLayer.shop.product_type)return void jQuery(".woocommerce-grouped-product-list-item").each((e,a)=>{r=Number(jQuery(a).find(".input-text.qty").val())?Number(jQuery(a).find(".input-text.qty").val()):1;let i=jQuery(a).attr("class");t=pmw.getPostIdFromString(i),pmw.addProductToCart(t,r)});if("bundle"===pmwDataLayer.shop.product_type)return null===r&&(r=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),t||(t=jQuery("input[name=add-to-cart]").val()),void pmw.addProductToCart(t,r);null===r&&(r=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),pmw.addProductToCart(t,r)}else null===r&&(r=1),t||(t=jQuery(e.currentTarget).data("product_id")?jQuery(e.currentTarget).data("product_id"):null),t||(t=jQuery(e.currentTarget).val()?jQuery(e.currentTarget).val():null),t&&r&&pmw.addProductToCart(t,r)}catch(e){console.error(e)}}),jQuery("a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)").one("click",e=>{try{if(jQuery(e.target).closest("a").attr("href")){let r=new URL(jQuery(e.currentTarget).attr("href"),window.location.origin);if(r.searchParams.has("add-to-cart")){let e=r.searchParams.get("add-to-cart"),t=r.searchParams.has("quantity")?parseInt(r.searchParams.get("quantity"),10):1;pmw.addProductToCart(e,t)}}}catch(e){console.error(e)}}),jQuery(".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product").on("click",e=>{try{let r=jQuery(e.currentTarget).nextAll(".pmwProductId:first").data("id");if(r){if(r=pmw.getIdBasedOndVariationsOutputSetting(r),!r)throw Error("Wasn't able to retrieve a productId");if(pmwDataLayer.products&&pmwDataLayer.products[r]){let e=pmw.getProductDetailsFormattedForEvent(r);jQuery(document).trigger("pmw:select-item",e)}}}catch(e){console.error(e)}}),jQuery("#billing_email").on("input",e=>{pmw.isEmail(jQuery(e.currentTarget).val())&&(pmw.fireCheckoutProgress(2),pmw.emailSelected=!0)}),jQuery("form.checkout").on("checkout_place_order_success",()=>{!1===pmw.emailSelected&&pmw.fireCheckoutProgress(2),!1===pmw.paymentMethodSelected&&(pmw.fireCheckoutProgress(3),pmw.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val())),pmw.fireCheckoutProgress(4),jQuery(document).trigger("pmw:place-order",{})}),jQuery(document).on("click","[name='update_cart']",()=>{try{jQuery(".cart_item").each((e,r)=>{const t=pmw.getProductIdByCartItemElement(r);if(!t)return void console.error("Pixel Manager: Wasn't able to retrieve a productId");const a=pmw.getProductQuantityByCartItemElement(r);a?0===a?pmw.removeProductFromCart(t):a<pmwDataLayer.cart[t].quantity?pmw.removeProductFromCart(t,pmwDataLayer.cart[t].quantity-a):a>pmwDataLayer.cart[t].quantity&&pmw.addProductToCart(t,a-pmwDataLayer.cart[t].quantity):console.error("Pixel Manager: Wasn't able to retrieve a quantity")})}catch(e){console.error(e),pmw.getCartItemsFromBackend()}}),jQuery(".add_to_wishlist,.wl-add-to").on("click",e=>{try{let r;if(jQuery(e.currentTarget).data("productid")?r=jQuery(e.currentTarget).data("productid"):jQuery(e.currentTarget).data("product-id")&&(r=jQuery(e.currentTarget).data("product-id")),!r)throw Error("Wasn't able to retrieve a productId");let t=pmw.getProductDetailsFormattedForEvent(r);jQuery(document).trigger("pmw:add-to-wishlist",t)}catch(e){console.error(e)}}),pmwDataLayer?.general?.lazy_load_pmw||pmw.registerShowVariationEventListener()},547(){!function(e){e.getLibraryVersion=()=>"1.56.0",e.checkLibraryVersion=()=>{e.getLibraryVersion()!==pmwDataLayer?.version?.number&&console.error(`Pixel Manager: The library version ${e.getLibraryVersion()} and pmwDataLayer.version.number ${pmwDataLayer.version.number} do not match. Delete the server-side cache and try again.`)}}(window.pmw=window.pmw||{},jQuery)},550(){!function(e){const r=["browser_only","server_only","both","browser_or_server"];e.pixelRegistry={getActivePixels(){const r=[];if(!e.pixelCapabilities)return r;for(const[t,a]of Object.entries(e.pixelCapabilities))if("function"==typeof a.isActive)try{a.isActive()&&r.push(t)}catch(r){e.console.error(`Error checking if ${t} is active:`,r)}return r},getActiveBrowserOnlyPixels(){const r=[],t=this.getActivePixels();for(const a of t)!0!==e.pixelCapabilities?.[a]?.supportsS2S&&r.push(a);return r},getActiveS2SPixels(){const r=[],t=this.getActivePixels();for(const a of t)!0===e.pixelCapabilities?.[a]?.supportsS2S&&r.push(a);return r},getAdapter:r=>e.adapters&&e.adapters[r]||null,getPixelsWithCapability(r){const t=[],a=this.getActivePixels();for(const i of a)!0===e.pixelCapabilities?.[i]?.[r]&&t.push(i);return t},getFiringMode(t){const a=e.pixelCapabilities?.[t]?.mode;return a&&r.includes(a)?a:!0===e.pixelCapabilities?.[t]?.supportsS2S?"both":"browser_only"},getFiringDecision(r,t){const a=this.getFiringMode(r),i=!0===pmwDataLayer?.general?.server_2_server?.active,o=!0===e.pixelCapabilities?.[r]?.supportsS2S;let n={fire_browser:!0,fire_server:!1};switch(a){case"browser_only":n={fire_browser:!0,fire_server:!1};break;case"server_only":n={fire_browser:!1,fire_server:i&&o};break;case"both":n={fire_browser:!0,fire_server:i&&o};break;case"browser_or_server":n=i&&o?{fire_browser:!1,fire_server:!0}:{fire_browser:!0,fire_server:!1}}return n=e.hooks.applyFilters("pmw_pixel_firing_decision",n,r,t,a),n},getPixelsForBrowserFiring(e){const r=[],t=this.getActivePixels();for(const a of t){this.getFiringDecision(a,e).fire_browser&&r.push(a)}return r},getPixelsForServerFiring(e){const r=[],t=this.getActivePixels();for(const a of t){this.getFiringDecision(a,e).fire_server&&r.push(a)}return r}}}(window.pmw=window.pmw||{},jQuery)},609(e,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.isIP=r.isIPv6=r.isIPv4=void 0;var t="(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])",a="("+t+"[.]){3}"+t,i=new RegExp("^"+a+"$"),o="(?:[0-9a-fA-F]{1,4})",n=new RegExp("^((?:"+o+":){7}(?:"+o+"|:)|(?:"+o+":){6}(?:"+a+"|:"+o+"|:)|(?:"+o+":){5}(?::"+a+"|(:"+o+"){1,2}|:)|(?:"+o+":){4}(?:(:"+o+"){0,1}:"+a+"|(:"+o+"){1,3}|:)|(?:"+o+":){3}(?:(:"+o+"){0,2}:"+a+"|(:"+o+"){1,4}|:)|(?:"+o+":){2}(?:(:"+o+"){0,3}:"+a+"|(:"+o+"){1,5}|:)|(?:"+o+":){1}(?:(:"+o+"){0,4}:"+a+"|(:"+o+"){1,6}|:)|(?::((?::"+o+"){0,5}:"+a+"|(?::"+o+"){1,7}|:)))(%[0-9a-zA-Z]{1,})?$");function s(e){return i.test(e)}function c(e){return n.test(e)}r.isIPv4=s,r.isIPv6=c,r.isIP=function(e){return s(e)?4:c(e)?6:0}},618(e,r,t){"use strict";var a=this&&this.__spreadArrays||function(){for(var e=0,r=0,t=arguments.length;r<t;r++)e+=arguments[r].length;var a=Array(e),i=0;for(r=0;r<t;r++)for(var o=arguments[r],n=0,s=o.length;n<s;n++,i++)a[i]=o[n];return a};Object.defineProperty(r,"__esModule",{value:!0}),r.isSpecial=r.isReserved=r.isLocalhost=r.isPrivate=r.createChecker=r.isInSubnet=void 0;var i=t(609),o=t(503);function n(e){if(!i.isIPv4(e))throw new Error("not a valid IPv4 address: "+e);var r=e.split(".");return(parseInt(r[0],10)<<24)+(parseInt(r[1],10)<<16)+(parseInt(r[2],10)<<8)+parseInt(r[3],10)>>>0}function s(e){if(Array.isArray(e)){var r=e.map(function(e){return c(e)});return function(e){var t=n(e);return r.some(function(e){return e(t)})}}var t=c(e);return function(e){var r=n(e);return t(r)}}function c(e){var r=e.split("/"),t=r[0],a=r[1],i=parseInt(a,10);if(!t||!Number.isInteger(i))throw new Error("not a valid IPv4 subnet: "+e);if(i<0||i>32)throw new Error("not a valid IPv4 prefix length: "+i+" (from "+e+")");var o=n(t);return function(e){return 0===i||o>>32-i===e>>32-i}}r.isInSubnet=function(e,r){return s(r)(e)},r.createChecker=s;var u={};r.isPrivate=function(e){return"private"in u==!1&&(u.private=s(o.default.private.ipv4)),u.private(e)},r.isLocalhost=function(e){return"localhost"in u==!1&&(u.localhost=s(o.default.localhost.ipv4)),u.localhost(e)},r.isReserved=function(e){return"reserved"in u==!1&&(u.reserved=s(o.default.reserved.ipv4)),u.reserved(e)},r.isSpecial=function(e){return"special"in u==!1&&(u.special=s(a(o.default.private.ipv4,o.default.localhost.ipv4,o.default.reserved.ipv4))),u.special(e)}},723(e,r,t){"use strict";t.r(r),t.d(r,{displayIP:()=>g,inRange:()=>l,isIP:()=>s,isRange:()=>d,isV4:()=>u,isV6:()=>p,searchIP:()=>m,storeIP:()=>m,version:()=>c});var a="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==t.g?t.g:"undefined"!=typeof self?self:{};function i(e,r){return e(r={exports:{}},r.exports),r.exports}var o=i(function(e){(function(){var r,t,a,i,o,n,s,c;t={},null!==e&&e.exports?e.exports=t:this.ipaddr=t,s=function(e,r,t,a){var i,o;if(e.length!==r.length)throw new Error("ipaddr: cannot match CIDR for objects with different lengths");for(i=0;a>0;){if((o=t-a)<0&&(o=0),e[i]>>o!==r[i]>>o)return!1;a-=t,i+=1}return!0},t.subnetMatch=function(e,r,t){var a,i,o,n,s;for(o in null==t&&(t="unicast"),r)for(!(n=r[o])[0]||n[0]instanceof Array||(n=[n]),a=0,i=n.length;a<i;a++)if(s=n[a],e.kind()===s[0].kind()&&e.match.apply(e,s))return o;return t},t.IPv4=function(){function e(e){var r,t,a;if(4!==e.length)throw new Error("ipaddr: ipv4 octet count should be 4");for(r=0,t=e.length;r<t;r++)if(!(0<=(a=e[r])&&a<=255))throw new Error("ipaddr: ipv4 octet should fit in 8 bits");this.octets=e}return e.prototype.kind=function(){return"ipv4"},e.prototype.toString=function(){return this.octets.join(".")},e.prototype.toNormalizedString=function(){return this.toString()},e.prototype.toByteArray=function(){return this.octets.slice(0)},e.prototype.match=function(e,r){var t;if(void 0===r&&(e=(t=e)[0],r=t[1]),"ipv4"!==e.kind())throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");return s(this.octets,e.octets,8,r)},e.prototype.SpecialRanges={unspecified:[[new e([0,0,0,0]),8]],broadcast:[[new e([255,255,255,255]),32]],multicast:[[new e([224,0,0,0]),4]],linkLocal:[[new e([169,254,0,0]),16]],loopback:[[new e([127,0,0,0]),8]],carrierGradeNat:[[new e([100,64,0,0]),10]],private:[[new e([10,0,0,0]),8],[new e([172,16,0,0]),12],[new e([192,168,0,0]),16]],reserved:[[new e([192,0,0,0]),24],[new e([192,0,2,0]),24],[new e([192,88,99,0]),24],[new e([198,51,100,0]),24],[new e([203,0,113,0]),24],[new e([240,0,0,0]),4]]},e.prototype.range=function(){return t.subnetMatch(this,this.SpecialRanges)},e.prototype.toIPv4MappedAddress=function(){return t.IPv6.parse("::ffff:"+this.toString())},e.prototype.prefixLengthFromSubnetMask=function(){var e,r,t,a,i,o,n;for(n={0:8,128:7,192:6,224:5,240:4,248:3,252:2,254:1,255:0},e=0,i=!1,r=t=3;t>=0;r=t+=-1){if(!((a=this.octets[r])in n))return null;if(o=n[a],i&&0!==o)return null;8!==o&&(i=!0),e+=o}return 32-e},e}(),a="(0?\\d+|0x[a-f0-9]+)",i={fourOctet:new RegExp("^"+a+"\\."+a+"\\."+a+"\\."+a+"$","i"),longValue:new RegExp("^"+a+"$","i")},t.IPv4.parser=function(e){var r,t,a,o,n;if(t=function(e){return"0"===e[0]&&"x"!==e[1]?parseInt(e,8):parseInt(e)},r=e.match(i.fourOctet))return function(){var e,i,o,n;for(n=[],e=0,i=(o=r.slice(1,6)).length;e<i;e++)a=o[e],n.push(t(a));return n}();if(r=e.match(i.longValue)){if((n=t(r[1]))>4294967295||n<0)throw new Error("ipaddr: address outside defined range");return function(){var e,r;for(r=[],o=e=0;e<=24;o=e+=8)r.push(n>>o&255);return r}().reverse()}return null},t.IPv6=function(){function e(e,r){var t,a,i,o,n,s;if(16===e.length)for(this.parts=[],t=a=0;a<=14;t=a+=2)this.parts.push(e[t]<<8|e[t+1]);else{if(8!==e.length)throw new Error("ipaddr: ipv6 part count should be 8 or 16");this.parts=e}for(i=0,o=(s=this.parts).length;i<o;i++)if(!(0<=(n=s[i])&&n<=65535))throw new Error("ipaddr: ipv6 part should fit in 16 bits");r&&(this.zoneId=r)}return e.prototype.kind=function(){return"ipv6"},e.prototype.toString=function(){return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/,"::")},e.prototype.toRFC5952String=function(){var e,r,t,a,i;for(a=/((^|:)(0(:|$)){2,})/g,i=this.toNormalizedString(),e=0,r=-1;t=a.exec(i);)t[0].length>r&&(e=t.index,r=t[0].length);return r<0?i:i.substring(0,e)+"::"+i.substring(e+r)},e.prototype.toByteArray=function(){var e,r,t,a,i;for(e=[],r=0,t=(i=this.parts).length;r<t;r++)a=i[r],e.push(a>>8),e.push(255&a);return e},e.prototype.toNormalizedString=function(){var e,r,t;return e=function(){var e,t,a,i;for(i=[],e=0,t=(a=this.parts).length;e<t;e++)r=a[e],i.push(r.toString(16));return i}.call(this).join(":"),t="",this.zoneId&&(t="%"+this.zoneId),e+t},e.prototype.toFixedLengthString=function(){var e,r,t;return e=function(){var e,t,a,i;for(i=[],e=0,t=(a=this.parts).length;e<t;e++)r=a[e],i.push(r.toString(16).padStart(4,"0"));return i}.call(this).join(":"),t="",this.zoneId&&(t="%"+this.zoneId),e+t},e.prototype.match=function(e,r){var t;if(void 0===r&&(e=(t=e)[0],r=t[1]),"ipv6"!==e.kind())throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");return s(this.parts,e.parts,16,r)},e.prototype.SpecialRanges={unspecified:[new e([0,0,0,0,0,0,0,0]),128],linkLocal:[new e([65152,0,0,0,0,0,0,0]),10],multicast:[new e([65280,0,0,0,0,0,0,0]),8],loopback:[new e([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new e([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new e([0,0,0,0,0,65535,0,0]),96],rfc6145:[new e([0,0,0,0,65535,0,0,0]),96],rfc6052:[new e([100,65435,0,0,0,0,0,0]),96],"6to4":[new e([8194,0,0,0,0,0,0,0]),16],teredo:[new e([8193,0,0,0,0,0,0,0]),32],reserved:[[new e([8193,3512,0,0,0,0,0,0]),32]]},e.prototype.range=function(){return t.subnetMatch(this,this.SpecialRanges)},e.prototype.isIPv4MappedAddress=function(){return"ipv4Mapped"===this.range()},e.prototype.toIPv4Address=function(){var e,r,a;if(!this.isIPv4MappedAddress())throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");return e=(a=this.parts.slice(-2))[0],r=a[1],new t.IPv4([e>>8,255&e,r>>8,255&r])},e.prototype.prefixLengthFromSubnetMask=function(){var e,r,t,a,i,o,n;for(n={0:16,32768:15,49152:14,57344:13,61440:12,63488:11,64512:10,65024:9,65280:8,65408:7,65472:6,65504:5,65520:4,65528:3,65532:2,65534:1,65535:0},e=0,i=!1,r=t=7;t>=0;r=t+=-1){if(!((a=this.parts[r])in n))return null;if(o=n[a],i&&0!==o)return null;16!==o&&(i=!0),e+=o}return 128-e},e}(),o="(?:[0-9a-f]+::?)+",c="%[0-9a-z]{1,}",n={zoneIndex:new RegExp(c,"i"),native:new RegExp("^(::)?("+o+")?([0-9a-f]+)?(::)?("+c+")?$","i"),transitional:new RegExp("^((?:"+o+")|(?:::)(?:"+o+")?)"+a+"\\."+a+"\\."+a+"\\."+a+"("+c+")?$","i")},r=function(e,r){var t,a,i,o,s,c;if(e.indexOf("::")!==e.lastIndexOf("::"))return null;for((c=(e.match(n.zoneIndex)||[])[0])&&(c=c.substring(1),e=e.replace(/%.+$/,"")),t=0,a=-1;(a=e.indexOf(":",a+1))>=0;)t++;if("::"===e.substr(0,2)&&t--,"::"===e.substr(-2,2)&&t--,t>r)return null;for(s=r-t,o=":";s--;)o+="0:";return":"===(e=e.replace("::",o))[0]&&(e=e.slice(1)),":"===e[e.length-1]&&(e=e.slice(0,-1)),{parts:r=function(){var r,t,a,o;for(o=[],r=0,t=(a=e.split(":")).length;r<t;r++)i=a[r],o.push(parseInt(i,16));return o}(),zoneId:c}},t.IPv6.parser=function(e){var t,a,i,o,s,c,u;if(n.native.test(e))return r(e,8);if((o=e.match(n.transitional))&&(u=o[6]||"",(t=r(o[1].slice(0,-1)+u,6)).parts)){for(a=0,i=(c=[parseInt(o[2]),parseInt(o[3]),parseInt(o[4]),parseInt(o[5])]).length;a<i;a++)if(!(0<=(s=c[a])&&s<=255))return null;return t.parts.push(c[0]<<8|c[1]),t.parts.push(c[2]<<8|c[3]),{parts:t.parts,zoneId:t.zoneId}}return null},t.IPv4.isIPv4=t.IPv6.isIPv6=function(e){return null!==this.parser(e)},t.IPv4.isValid=function(e){try{return new this(this.parser(e)),!0}catch(e){return!1}},t.IPv4.isValidFourPartDecimal=function(e){return!(!t.IPv4.isValid(e)||!e.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/))},t.IPv6.isValid=function(e){var r;if("string"==typeof e&&-1===e.indexOf(":"))return!1;try{return new this((r=this.parser(e)).parts,r.zoneId),!0}catch(e){return!1}},t.IPv4.parse=function(e){var r;if(null===(r=this.parser(e)))throw new Error("ipaddr: string is not formatted like ip address");return new this(r)},t.IPv6.parse=function(e){var r;if(null===(r=this.parser(e)).parts)throw new Error("ipaddr: string is not formatted like ip address");return new this(r.parts,r.zoneId)},t.IPv4.parseCIDR=function(e){var r,t,a;if((t=e.match(/^(.+)\/(\d+)$/))&&(r=parseInt(t[2]))>=0&&r<=32)return a=[this.parse(t[1]),r],Object.defineProperty(a,"toString",{value:function(){return this.join("/")}}),a;throw new Error("ipaddr: string is not formatted like an IPv4 CIDR range")},t.IPv4.subnetMaskFromPrefixLength=function(e){var r,t,a;if((e=parseInt(e))<0||e>32)throw new Error("ipaddr: invalid IPv4 prefix length");for(a=[0,0,0,0],t=0,r=Math.floor(e/8);t<r;)a[t]=255,t++;return r<4&&(a[r]=Math.pow(2,e%8)-1<<8-e%8),new this(a)},t.IPv4.broadcastAddressFromCIDR=function(e){var r,t,a,i,o;try{for(a=(r=this.parseCIDR(e))[0].toByteArray(),o=this.subnetMaskFromPrefixLength(r[1]).toByteArray(),i=[],t=0;t<4;)i.push(parseInt(a[t],10)|255^parseInt(o[t],10)),t++;return new this(i)}catch(e){throw new Error("ipaddr: the address does not have IPv4 CIDR format")}},t.IPv4.networkAddressFromCIDR=function(e){var r,t,a,i,o;try{for(a=(r=this.parseCIDR(e))[0].toByteArray(),o=this.subnetMaskFromPrefixLength(r[1]).toByteArray(),i=[],t=0;t<4;)i.push(parseInt(a[t],10)&parseInt(o[t],10)),t++;return new this(i)}catch(e){throw new Error("ipaddr: the address does not have IPv4 CIDR format")}},t.IPv6.parseCIDR=function(e){var r,t,a;if((t=e.match(/^(.+)\/(\d+)$/))&&(r=parseInt(t[2]))>=0&&r<=128)return a=[this.parse(t[1]),r],Object.defineProperty(a,"toString",{value:function(){return this.join("/")}}),a;throw new Error("ipaddr: string is not formatted like an IPv6 CIDR range")},t.isValid=function(e){return t.IPv6.isValid(e)||t.IPv4.isValid(e)},t.parse=function(e){if(t.IPv6.isValid(e))return t.IPv6.parse(e);if(t.IPv4.isValid(e))return t.IPv4.parse(e);throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format")},t.parseCIDR=function(e){try{return t.IPv6.parseCIDR(e)}catch(r){try{return t.IPv4.parseCIDR(e)}catch(e){throw new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format")}}},t.fromByteArray=function(e){var r;if(4===(r=e.length))return new t.IPv4(e);if(16===r)return new t.IPv6(e);throw new Error("ipaddr: the binary input is neither an IPv6 nor IPv4 address")},t.process=function(e){var r;return"ipv6"===(r=this.parse(e)).kind()&&r.isIPv4MappedAddress()?r.toIPv4Address():r}}).call(a)}),n=i(function(e,r){const t=function(e){if(!i(e))throw new Error("Invalid address: "+e);const r=(e=e.toLowerCase()).split(/\:\:/g);if(r.length>2)throw new Error("Invalid address: "+e);let t=[];if(1==r.length){if(t=e.split(/\:/g),8!==t.length)throw new Error("Invalid address: "+e)}else if(2==r.length){const e=r[0],a=r[1],i=e.split(/\:/g),o=a.split(/\:/g);for(let e in i)t[e]=i[e];for(let e=o.length;e>0;--e)t[7-(o.length-e)]=o[e-1]}for(let e=0;e<8;++e)void 0===t[e]&&(t[e]="0000"),t[e]=o(t[e],"0",4);return t.join(":")},a=function(e){if(!i(e))throw new Error("Invalid address: "+e);const r=(e=(e=(e=(e=(e=(e=t(e)).replace(/0000/g,"g")).replace(/\:000/g,":")).replace(/\:00/g,":")).replace(/\:0/g,":")).replace(/g/g,"0")).split(/\:/g);let a=!1,o=-1,n=0,s=-1,c=0;for(let e=0;e<8;++e){const t=r[e];let i="0"===t;i&&!a&&(s=e),!i&&a&&(c=e-s),c>1&&c>n&&(o=s,n=c),a="0"===t}return a&&(c=8-s),c>1&&c>n&&(o=s,n=c),o>=0&&n>1&&r.splice(o,n,"g"),e=(e=(e=(e=(e=r.join(":")).replace(/\:g\:/g,"::")).replace(/\:g/g,"::")).replace(/g\:/g,"::")).replace(/g/g,"::")},i=function(e){return/^[a-f0-9\\:]+$/gi.test(e)},o=function(e,r,t){const a=r.repeat(t);return e.length<a.length&&(e=a.substring(0,a.length-e.length)+e),e},n=function(e){return parseInt(e,16).toString(2)},s=function(e){return parseInt(e,2).toString(16)},c=function(e){const r=t(e).split(":");let a="";for(const e of r)a+=o(n(e),"0",16);return a},u=function(e){const r=[];for(let t=0;t<8;++t){const a=e.substr(16*t,16),i=o(s(a),"0",4);r.push(i)}return r.join(":")},p=function(e,r,t,n,s){if(!i(e))throw new Error("Invalid address: "+e);if(n*=1,t=(t*=1)||128,(r*=1)<1||t<1||r>128||t>128||r>t)throw new Error("Invalid masks.");const p=[],d=c(e).substr(0,r),l="0".repeat(128-t),m=Math.pow(2,t-r);for(let e=0;e<m&&!(n&&e>=n);++e){const i=o(e.toString(2),"0",t-r),n=u(d+i+l);s?p.push(a(n)):p.push(n)}return p},d=function(e,r,t,o){if(!i(e))throw new Error("Invalid address: "+e);if(t=(t*=1)||128,(r*=1)<1||t<1||r>128||t>128||r>t)throw new Error("Invalid masks.");const n=c(e).substr(0,r),s="0".repeat(128-t),p=n+"0".repeat(t-r)+s,d=n+"1".repeat(t-r)+s;return o?{start:a(u(p)),end:a(u(d)),size:Math.pow(2,t-r)}:{start:u(p),end:u(d),size:Math.pow(2,t-r)}},l=function(e,r,t,o,n){if(!i(e))throw new Error("Invalid address: "+e);if(t=(t*=1)||128,o=(o*=1)||1,(r*=1)<1||t<1||r>128||t>128||r>t)throw new Error("Invalid masks.");const s=[],p=c(e).substr(0,r),d="0".repeat(128-t),l=Math.pow(2,t-r);for(let e=0;e<l&&e<o;++e){let e="";for(let a=0;a<t-r;++a)e+=Math.floor(2*Math.random());const i=u(p+e+d);n?s.push(a(i)):s.push(i)}return s},m=function(e,r){if(!i(e))throw new Error("Invalid address: "+e);if((r*=1)<1||r>128||Math.floor(r/4)!=r/4)throw new Error("Invalid masks.");return t(e).replace(/:/g,"").split("").reverse().slice(0,(128-r)/4).join(".")};r.normalize=t,r.abbreviate=a,r.divideSubnet=p,r.range=d,r.randomSubnet=l,r.ptr=m});n.normalize,n.abbreviate,n.divideSubnet,n.range,n.randomSubnet,n.ptr;function s(e){return o.isValid(e)}function c(e){try{var r=o.parse(e).kind();return"ipv4"===r?4:"ipv6"===r?6:0}catch(e){return 0}}function u(e){return 4===c(e)}function p(e){return 6===c(e)}function d(e){try{o.parseCIDR(e);return!0}catch(e){return!1}}function l(e,r){if("string"!=typeof r){if(r&&"object"==typeof r){for(var t in r)if(!0===l(e,r[t]))return!0;return!1}return!1}if(-1===r.indexOf("/"))return e=p(e)?n.normalize(e):e,s(r=p(r)?n.normalize(r):r)&&e===r;try{var a=r.split("/"),i=o.parse(e),c=o.parse(a[0]);return i.match(c,a[1])}catch(e){return!1}}function m(e){try{var r=o.parse(e),t=r.kind();return"ipv4"===t?e:"ipv6"===t?r.isIPv4MappedAddress()?r.toIPv4Address().toString():n.abbreviate(e):null}catch(e){return null}}function g(e){try{var r=o.parse(e),t=r.kind();return"ipv4"===t?e:"ipv6"===t?r.isIPv4MappedAddress()?r.toIPv4Address().toString():n.normalize(e):""}catch(e){return""}}},897(){!function(e){const r="restEndpointAvailable",t="pmw/v1/test/",a=0,i=10;e.emailSelected=!1,e.paymentMethodSelected=!1,e.isBelowRestErrorThreshold=()=>e.retrieveData(a)<=i,e.isRestEndpointAvailable=async()=>e.retrieveData(r)?e.retrieveData(r):await e.testEndpoint(),e.testEndpoint=async(a=e.root+t,i=r)=>{try{const r=await fetch(a,{method:"POST",mode:"cors",cache:"no-cache",keepalive:!0,redirect:"error"});if(!r.ok)return e.storeData(i,!1),e.console.error("Error testing the endpoint. Status: "+r.status+" | response: ",r),!1;const t=await r.json();return t.success?(e.storeData(i,!0),!0):(e.storeData(i,!1),e.console.error("Error testing the endpoint. Response JSON: "+JSON.stringify(t)),!1)}catch(r){return e.storeData(i,!1),e.console.error("Error testing the endpoint. Error: "+r),!1}},e.isPmwRestEndpointAvailable=(t=r)=>!!e.retrieveData(t),e.writeOrderIdToStorage=(r,t,a="thankyou_page")=>{let i=e.retrieveData("orderIds",!0)||[];i.push(r),e.storeData("orderIds",i,!0),"function"==typeof e.storeOrderIdOnServer&&e.storeOrderIdOnServer({orderId:r,orderKey:t,source:a})},e.isOrderIdStored=r=>{if(!pmwDataLayer.shop.order_duplication_prevention)return e.console.log("order duplication prevention is off"),!1;return(e.retrieveData("orderIds",!0)||[]).includes(r)},e.isEmail=e=>new RegExp('^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$').test(e),e.removeProductFromCart=async(r,t=null)=>{try{if(!r)throw Error("Wasn't able to retrieve a productId");if(!(r=e.getIdBasedOndVariationsOutputSetting(r)))throw Error("Wasn't able to retrieve a productId");let a;a=null==t?pmwDataLayer.cart[r].quantity:t,pmwDataLayer.cart[r]||await e.getProductsFromBackend([r]);let i=e.getProductDetailsFormattedForEvent(r,a);jQuery(document).trigger("pmw:remove-from-cart",i),null==t||pmwDataLayer.cart[r].quantity===t?delete pmwDataLayer.cart[r]:pmwDataLayer.cart[r].quantity=pmwDataLayer.cart[r].quantity-a,e.storeCartData(pmwDataLayer.cart)}catch(r){e.console.error("error: ",r)}},e.getIdBasedOndVariationsOutputSetting=e=>{try{return pmwDataLayer?.shop?.variations_output?e:pmwDataLayer.products[e].is_variation?pmwDataLayer.products[e].parent_id:e}catch(e){console.error(e)}},e.prepareSelectors=(e,r)=>(pmwDataLayer?.shop?.selectors?.[r]&&(e=e.concat(pmwDataLayer.shop.selectors[r]),(e=[...new Set(e)]).indexOf("document")>=0&&e.splice(e.indexOf("document"),1),e.indexOf("body")>=0&&(e=["body"])),e.join(", ")),e.addProductToCart=async(r,t)=>{t=Number(t);try{if(!r)throw Error("Wasn't able to retrieve a productId");if(!(r=e.getIdBasedOndVariationsOutputSetting(r)))throw Error("Wasn't able to retrieve a productId");pmwDataLayer?.products[r]||await e.getProductsFromBackend([r]);let a=e.getProductDetailsFormattedForEvent(r,t);jQuery(document).trigger("pmw:add-to-cart",a),pmwDataLayer?.cart[r]?pmwDataLayer.cart[r].quantity=pmwDataLayer.cart[r].quantity+t:("cart"in pmwDataLayer||(pmwDataLayer.cart={}),pmwDataLayer.cart[r]=e.getProductDetailsFormattedForEvent(r,t)),e.storeCartData(pmwDataLayer.cart)}catch(r){console.error(r),e.getCartItemsFromBackend()}},e.initCart=()=>{e.doesWooCommerceCartExist()||0===Object.keys(e.retrieveCartData()).length?e.retrieveCartData()?e.saveCartObjectToDataLayer(e.retrieveCartData()):(e.storeCartData({}),e.getCartItemsFromBackend()):e.storeCartData({})},e.getCartItemsFromBackend=()=>{try{fetch(e.ajax_url,{method:"POST",cache:"no-cache",body:new URLSearchParams({action:"pmw_get_cart_items"}),keepalive:!0,redirect:"error"}).then(e=>{if(e.ok)return e.json();throw Error("Error getting cart items from backend")}).then(r=>{if(!r.success)throw Error("Error getting cart items from backend");r.data.cart||(r.data.cart={}),e.saveCartObjectToDataLayer(r.data.cart),e.storeCartData(r.data.cart),r.data.cart_item_keys&&(pmwDataLayer.cart_item_keys=Object.assign(pmwDataLayer.cart_item_keys||{},r.data.cart_item_keys))})}catch(e){console.error(e)}},e.getProductsFromBackend=async r=>{if(pmwDataLayer?.products&&(r=r.filter(e=>!(e in pmwDataLayer.products))),r&&0!==r.length&&pmwDataLayer.general.page_id&&Array.isArray(r)&&0!==r.length){try{let t={action:"pmw_get_product_ids",page_id:pmwDataLayer.general.page_id,page_type:pmwDataLayer.shop.page_type,product_ids:r};const a=await e.isRestEndpointAvailable(),i=a?e.root+"pmw/v1/products/":e.ajax_url,o={method:"POST",cache:"no-cache",body:a?JSON.stringify(t):new URLSearchParams(t)};a&&(o.headers={"Content-Type":"application/json"});let n=await fetch(i,o);if(!n.ok)throw new Error("Error getting products from backend. Status: "+n.status+" Status text: "+n.statusText);let s=await n.json();if(!s.success)throw new Error("Error getting products from backend: "+s.data);pmwDataLayer.products=Object.assign({},pmwDataLayer.products,s.data)}catch(e){console.error(e)}return!0}},e.saveCartObjectToDataLayer=e=>{pmwDataLayer.cart=e,pmwDataLayer.products=Object.assign({},pmwDataLayer.products,e)},e.triggerViewItemEventPrep=async r=>{pmwDataLayer?.products[r]||await e.getProductsFromBackend([r]),pmwDataLayer?.products[r]?e.triggerViewItemEvent(r):(e.triggerViewItemEventNoProduct(),e.console.log(`Product with ID ${r} not found in the data layer and couldn't be retrieved from the backend. Triggering view-item event without product data.`))},e.triggerViewItemEvent=r=>{let t=e.getProductDetailsFormattedForEvent(r);t&&jQuery(document).trigger("pmw:view-item",t)},e.triggerViewItemEventNoProduct=()=>{jQuery(document).trigger("pmw:view-item")},e.fireCheckoutOption=(e,r=null,t=null)=>{let a={step:e,checkout_option:r,value:t};jQuery(document).trigger("pmw:checkout-option",a)},e.fireCheckoutProgress=e=>{let r={step:e};jQuery(document).trigger("pmw:checkout-progress",r)},e.getPostIdFromString=e=>{try{return e.match(/(post-)(\d+)/)[2]}catch(e){console.error(e)}},e.triggerViewItemList=r=>{if(!r)throw Error("Wasn't able to retrieve a productId");if(!(r=e.getIdBasedOndVariationsOutputSetting(r)))throw Error("Wasn't able to retrieve a productId");jQuery(document).trigger("pmw:view-item-list",e.getProductDataForViewItemEvent(r))},e.getProductDataForViewItemEvent=r=>{if(!r)throw Error("Wasn't able to retrieve a productId");try{if(pmwDataLayer.products[r])return e.getProductDetailsFormattedForEvent(r)}catch(e){console.error(e)}},e.getMainProductIdFromProductPage=()=>{try{return["simple","variable","grouped","composite","bundle"].indexOf(pmwDataLayer.shop.product_type)>=0&&jQuery(".pmwProductId:first").data("id")}catch(e){console.error(e)}},e.viewItemListTriggerTestMode=e=>{jQuery(e).css({position:"relative"}),jQuery(e).append('<div id="viewItemListTriggerOverlay"></div>'),jQuery(e).find("#viewItemListTriggerOverlay").css({"z-index":"10",display:"block",position:"absolute",height:"100%",top:"0",left:"0",right:"0",opacity:pmwDataLayer.shop.view_item_list_trigger.opacity,"background-color":pmwDataLayer.shop.view_item_list_trigger.background_color})},e.getSearchTermFromUrl=()=>{try{return new URLSearchParams(window.location.search).get("s")}catch(e){console.error(e)}};let o,n={};e.observerCallback=(r,t)=>{r.forEach(r=>{try{let a,i=jQuery(r.target).data("ioid");if(a=jQuery(r.target).next(".pmwProductId").length?jQuery(r.target).next(".pmwProductId").data("id"):jQuery(r.target).find(".pmwProductId").data("id"),!a)throw Error("pmwProductId element not found");r.isIntersecting?n[i]=setTimeout(()=>{e.triggerViewItemList(a),pmwDataLayer.shop.view_item_list_trigger.test_mode&&e.viewItemListTriggerTestMode(r.target),!1===pmwDataLayer.shop.view_item_list_trigger.repeat&&t.unobserve(r.target)},pmwDataLayer.shop.view_item_list_trigger.timeout):(clearTimeout(n[i]),pmwDataLayer.shop.view_item_list_trigger.test_mode&&jQuery(r.target).find("#viewItemListTriggerOverlay").remove())}catch(e){console.error(e)}})};let s=0;let c={nested:[],flat:[]};const u=e=>["product","type-product","product-item-inner",...c.nested].some(r=>jQuery(e).closest("."+r).length),p=e=>["wc-block-grid__product","product","product-small","woocommerce-LoopProduct-link",...c.flat].some(r=>jQuery(e).prev().hasClass(r)),d=()=>(c=(()=>{let e={nested:[],flat:[]};try{const r=(e,r)=>jQuery(e).parents().length===jQuery(r).parents().length,t=(e,r)=>jQuery(e).parent().is(jQuery(r).parent())?{node:jQuery(e).parent(),type:"flat"}:{node:jQuery(e).parents().has(jQuery(r).parents()).first(),type:"nested"},a=e=>jQuery(e).find(".pmwProductId").length,i=(e,r)=>e.filter(e=>r.includes(e))[0]||null,o=document.querySelectorAll(".pmwProductId");if(1===o.length)return e;for(let n=0;n<o.length-1;n++){if(!r(o[n],o[n+1])){n++;continue}let s=t(o[n],o[n+1]);if("nested"===s.type){let r=s.node.children().first().attr("class"),t=r?r.split(" "):[],a=s.node.children().first().next().attr("class");const o=i(t,a?a.split(" "):[]);e.nested.push(o)}else if("flat"===s.type){if(!s.node.children().first().attr("class"))continue;let r=s.node.children().first().attr("class").split(" ")[0];e.flat.push(r)}n=n+a(s.node)-1}return e.nested=[...new Set(e.nested)],e.flat=[...new Set(e.flat)],e}catch(r){return console.error(r),e}})(),jQuery(".pmwProductId").map(function(e,r){return u(r)?jQuery(r).parent():p(r)?jQuery(this).prev():jQuery(r).closest(".product").length?jQuery(r).closest(".product"):void 0}));e.startIntersectionObserverToWatch=()=>{try{e.urlHasParameter("vildemomode")&&(pmwDataLayer.shop.view_item_list_trigger.test_mode=!0),o=new IntersectionObserver(e.observerCallback,{root:null,threshold:pmwDataLayer.shop.view_item_list_trigger.threshold}),d().each((e,r)=>{jQuery(r[0]).data("ioid",s++),o.observe(r[0])})}catch(e){console.error(e)}},e.startProductsMutationObserverToWatch=()=>{try{let e=jQuery(".pmwProductId:eq(0)").parents().has(jQuery(".pmwProductId:eq(1)").parents()).first();e.length&&l.observe(e[0],{attributes:!0,childList:!0,characterData:!0})}catch(e){console.error(e)}};const l=new MutationObserver(e=>{e.forEach(e=>{let r=e.addedNodes;if(null!==r){jQuery(r).each((e,r)=>{(u(r)||p(r))&&m(r)&&(jQuery(r).data("ioid",s++),o.observe(r))})}})});let m=e=>!(!jQuery(e).find(".pmwProductId").length&&!jQuery(e).siblings(".pmwProductId").length);e.setCookie=(e,r="",t=null)=>{if(t){let a=new Date;a.setTime(a.getTime()+24*t*60*60*1e3);let i="expires="+a.toUTCString();document.cookie=e+"="+r+";"+i+";path=/"}else document.cookie=e+"="+r+";path=/"},e.getCookie=e=>{let r=e+"=",t=decodeURIComponent(document.cookie).split(";");for(let e=0;e<t.length;e++){let a=t[e];for(;" "==a.charAt(0);)a=a.substring(1);if(0==a.indexOf(r))return a.substring(r.length,a.length)}return""},e.getCookieThatContainsRegex=e=>{let r=document.cookie.split(";");for(let t=0;t<r.length;t++){let a=r[t].trim();if(e.test(a))return a}return!1},e.deleteCookie=r=>{e.setCookie(r,"",-1)},e.storeData=(r,t,a=!1,i=!1)=>{const o=i?r:"";let n=a?e.getPersistentData:e.getSessionData,s=a?e.setPersistentData:e.setSessionData,c=n(o);i?c=t:c[r]=t,s(c,o)},e.retrieveData=(r,t=!1,a=!1)=>{const i=a?r:"";let o=t?e.getPersistentData(i):e.getSessionData(i);return a?o:o[r]},e.deleteDataKey=(r,t=!1,a=!1)=>{const i=a?r:"";let o=t?e.getPersistentData:e.getSessionData,n=t?e.setPersistentData:e.setSessionData,s=o(i);if(a)try{t&&window.localStorage&&window.localStorage.removeItem(e.getPersistentDataKey(i)),!t&&window.sessionStorage&&window.sessionStorage.removeItem(e.getSessionDataKey(i))}catch(e){console.error(e)}else delete s[r],n(s,i)},e.storeCartData=r=>{e.storeData("cart",r,!1,!0)},e.retrieveCartData=()=>e.retrieveData("cart",!1,!0),e.getSessionDataKey=(e="")=>{const r="_pmw_session_data";return e?r+"_"+e:r},e.getPersistentDataKey=e=>{const r="_pmw_persistent_data";return e?r+"_"+e:r},e.getSessionData=(r="")=>{if(window.sessionStorage){let t=window.sessionStorage.getItem(e.getSessionDataKey(r));return null!==t?JSON.parse(t):{}}{let t=e.getCookie(e.getSessionDataKey(r));return""!==t?JSON.parse(t):{}}},e.setSessionData=(r,t="")=>{window.sessionStorage?window.sessionStorage.setItem(e.getSessionDataKey(t),JSON.stringify(r)):e.setCookie(e.getSessionDataKey(t),JSON.stringify(r))},e.getPersistentData=r=>{if(window.localStorage){let t=window.localStorage.getItem(e.getPersistentDataKey(r));return null!==t?JSON.parse(t):{}}{let t=e.getCookie(e.getPersistentDataKey(r));return""!==t?JSON.parse(t):{}}},e.setPersistentData=(r,t="")=>{window.localStorage?window.localStorage.setItem(e.getPersistentDataKey(t),JSON.stringify(r)):e.setCookie(e.getPersistentDataKey(t),JSON.stringify(r),400)},e.storeOrderIdOnServer=async r=>{try{let t;await e.isRestEndpointAvailable()?t=await fetch(e.root+"pmw/v1/pixels-fired/",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({order_id:r.orderId,order_key:r.orderKey,source:r.source}),keepalive:!0,cache:"no-cache",redirect:"error"}):(e.console.log("REST API not available, falling back to AJAX"),t=await fetch(e.ajax_url,{method:"POST",body:new URLSearchParams({action:"pmw_purchase_pixels_fired",order_id:r.orderId,order_key:r.orderKey,source:r.source}),keepalive:!0,redirect:"error"}));const a=await t.json();a.success?e.console.log("",a.data):e.console.error("",a.data)}catch(e){console.error(e)}},e.getProductIdByCartItemElement=r=>{const t=jQuery(r).find(".product-remove").find("a").attr("href");if(t)return e.getProductIdByCartItemKeyUrl(new URL(t));const a=jQuery(r).find("[data-product_id]").first().attr("data-product_id");return a||null},e.getProductQuantityByCartItemElement=e=>jQuery(e).find(".qty").val()||null,e.getProductIdByCartItemKeyUrl=e=>{let r,t=new URLSearchParams(e.search).get("remove_item");return r=0===pmwDataLayer.cart_item_keys[t].variation_id?pmwDataLayer.cart_item_keys[t].product_id:pmwDataLayer.cart_item_keys[t].variation_id,r},e.getAddToCartLinkProductIds=()=>jQuery("a").map(function(){let e=jQuery(this).attr("href");if(e&&e.includes("?add-to-cart=")){let r=e.match(/(add-to-cart=)(\d+)/);if(r)return r[2]}}).get(),e.getProductDetailsFormattedForEvent=(e,r=1)=>{if(!pmwDataLayer.products[e])return null;let t={id:e.toString(),dyn_r_ids:pmwDataLayer.products[e].dyn_r_ids,name:pmwDataLayer.products[e].name,list_name:pmwDataLayer.shop.list_name,brand:pmwDataLayer.products[e].brand,category:pmwDataLayer.products[e].category,variant:pmwDataLayer.products[e].variant,list_position:pmwDataLayer.products[e].position,quantity:r,price:pmwDataLayer.products[e].price,currency:pmwDataLayer.shop.currency,is_variable:pmwDataLayer.products[e].is_variable,is_variation:pmwDataLayer.products[e].is_variation,parent_id:pmwDataLayer.products[e].parent_id};return t.is_variation&&(t.parent_id_dyn_r_ids=pmwDataLayer.products[e].parent_id_dyn_r_ids),t},e.getClidFromBrowser=(r="gclid")=>{let t;if(t={gclid:"_gcl_aw",dclid:"_gcl_dc"},e.getCookie(t[r])){return e.getCookie(t[r]).match(/(GCL.[\d]*.)(.*)/)[2]}return""},e.getUserAgent=()=>navigator.userAgent,e.getViewPort=()=>({width:Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),height:Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)}),e.consoleLogVersion=()=>{console.log(pmwDataLayer.version)};const g=new Set;e.loadScriptAndCacheIt=(r,t)=>{if(g.has(r))return e.console.log("Script already loaded: "+r),Promise.resolve();const a=r=>new Promise((t,a)=>{if(document.querySelector(`script[src="${r}"]`))return g.add(r),e.console.log("Script tag already exists: "+r),void t();const i=document.createElement("script");i.src=r,i.async=!0,i.crossOrigin="anonymous",i.onload=()=>{g.add(r),e.console.log("Successfully loaded script: "+r),t()},i.onerror=()=>{i.remove(),a(new Error("Script failed to load: "+r))},document.head.appendChild(i)});return a(r).catch(()=>{if(t)return e.console.log("Primary script failed, loading fallback: "+t),a(t);throw new Error("Primary script failed to load, and no fallback URL provided.")}).catch(e=>{if(e.message.includes("fallback"))throw e;throw new Error("Both primary and fallback scripts failed to load.")})},e.getOrderItemPrice=e=>(e.total+e.total_tax)/e.quantity,e.hasLoginEventFired=()=>{let r=e.getSessionData();return r?.loginEventFired},e.setLoginEventFired=()=>{let r=e.getSessionData();r.loginEventFired=!0,e.setSessionData(r)},e.pageLoaded=async()=>new Promise(e=>{!function r(){if("complete"===document.readyState)return e();setTimeout(r,50)}()}),e.pageReady=()=>new Promise(e=>{!function r(){if("interactive"===document.readyState||"complete"===document.readyState)return e();setTimeout(r,50)}()}),e.isMiniCartActive=()=>(window.sessionStorage&&Object.keys(window.sessionStorage).forEach(e=>{if(e.includes("wc_fragments"))return!0}),!1),e.doesWooCommerceCartExist=()=>document.cookie.includes("woocommerce_items_in_cart"),e.urlHasParameter=e=>new URLSearchParams(window.location.search).has(e),e.getUrlParameter=e=>new URLSearchParams(window.location.search).get(e),e.hashAsync=(e,r)=>crypto.subtle.digest(e,new TextEncoder("utf-8").encode(r)).then(e=>Array.prototype.map.call(new Uint8Array(e),e=>("00"+e.toString(16)).slice(-2)).join("")),e.getCartValue=()=>{let e=0;if(pmwDataLayer?.cart)for(const r in pmwDataLayer.cart){let t=pmwDataLayer.cart[r];e+=t.quantity*t.price}return e},e.doesUrlContainPatterns=e=>{for(const r of e)if(new RegExp(r).test(window.location.href))return!0;return!1},e.excludeDomainFromTracking=()=>{let e=["appspot.com","translate.google.com"];return pmwDataLayer?.general?.exclude_domains&&(e=[...e,...pmwDataLayer.general.exclude_domains]),!!e.some(e=>window.location.href.includes(e))&&(console.debug("Pixel Manager: Aborted due to excluded domain"),!0)},e.getRandomEventId=(e=16)=>{let r="";for(;r.length<e;)r+=(Math.random()+1).toString(36).substring(2);return r.substring(0,e)},e.pmwConsoleMessage=()=>{let r="Pixel Manager for WooCommerce: ";r+=pmwDataLayer.version.pro?"pro":"free",r+=" | distro: "+pmwDataLayer.version.distro,"fms"===pmwDataLayer.version.distro&&pmwDataLayer.version.pro&&(r+=" | active license: "+(pmwDataLayer.version.eligible_for_updates?"yes":"no")),r+=" | version: "+pmwDataLayer.version.number,!0===pmwDataLayer.version.show?console.log(r):e.console.log(r)},e.canLoadPremiumFeatures=()=>"fms"===pmwDataLayer.version.distro&&pmwDataLayer.version.pro&&pmwDataLayer.version.eligible_for_updates||"wcm"===pmwDataLayer.version.distro;let f=!1;e.triggerPmwDomReadyEvent=()=>{f||("complete"!==document.readyState?(jQuery(()=>{w()}),document.addEventListener("DOMContentLoaded",()=>{w()},!0)):w())};const w=()=>{f||(document.dispatchEvent(new Event("pmw:dom:ready")),f=!0)};e.getEmailFromTarget=r=>{if(r.href){let t=r.href.replace("mailto:","");if(t.indexOf("?")>-1&&(t=t.split("?")[0]),t=t.replace(/\s/g,""),t&&e.isEmail(t))return t}return""},e.sendEventPayloadToServer=r=>{"function"==typeof e.sendEventPayloadToServerPremium&&e.sendEventPayloadToServerPremium(r)},e.waitForPixelsAndTriggerPageView=async()=>new Promise(r=>{if(!pmwDataLayer?.pixels)return e.console.error("pmwDataLayer or pmwDataLayer.pixels is not defined, triggering page view event immediately."),document.dispatchEvent(new Event("pmw:page-view")),void r();let t=pmwDataLayer?.general?.server_2_server?.pageview_event_s2s?.pixels||[];if(t=t.filter(e=>pmwDataLayer.pixels[e]),0===t.length)return e.console.log("No specific pixels to wait for, triggering page view event."),document.dispatchEvent(new Event("pmw:page-view")),void r();const a=()=>{t.every(e=>!pmwDataLayer.pixels[e]||pmwDataLayer.pixels[e].loaded)?(document.dispatchEvent(new Event("pmw:page-view")),r()):setTimeout(a,100)};a()}),e.isWooCommerceActive=()=>!!pmwDataLayer.shop,e.getProductIdForSpecificPixel=(e,r)=>String(e.dyn_r_ids[pmwDataLayer.pixels[r].dynamic_remarketing.id_type]),e.isInWooCommerceSesssion=()=>{if(pmwDataLayer?.shop?.session_active)return!0;let r=new RegExp("woocommerce_cart_hash");return!!e.getCookieThatContainsRegex(r)},e.isNotInWooCommerceSesssion=()=>!e.isInWooCommerceSesssion(),e.makeFullUrl=e=>(e=e.trim(),/^(http:\/\/|https:\/\/)/.test(e)?e:"https://"+(e=e.replace(/^\/+/,""))),e.registerShowVariationEventListener=()=>{let r=null;jQuery(".single_variation_wrap").on("show_variation",(t,a)=>{try{if(!pmwDataLayer?.shop?.variations_output)return;let t=e.getIdBasedOndVariationsOutputSetting(a.variation_id);if(!t)throw Error("Wasn't able to retrieve a productId");r!==a.variation_id&&(e.triggerViewItemEventPrep(t),r=a.variation_id)}catch(e){console.error(e)}})},e.initializeCommandQueue=()=>{const r=window._pmwq=window._pmwq||[];r.forEach(function(r){if("function"==typeof r)try{r()}catch(r){e.console.error("Error executing queued command:",r)}}),r.push=function(r){if("function"==typeof r)try{r()}catch(r){e.console.error("Error executing command from queue:",r)}}}}(window.pmw=window.pmw||{},jQuery)}},o={};function n(e){var r=o[e];if(void 0!==r)return r.exports;var t=o[e]={exports:{}};return i[e].call(t.exports,t,t.exports,n),t.exports}n.m=i,r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,n.t=function(t,a){if(1&a&&(t=this(t)),8&a)return t;if("object"==typeof t&&t){if(4&a&&t.__esModule)return t;if(16&a&&"function"==typeof t.then)return t}var i=Object.create(null);n.r(i);var o={};e=e||[null,r({}),r([]),r(r)];for(var s=2&a&&t;("object"==typeof s||"function"==typeof s)&&!~e.indexOf(s);s=r(s))Object.getOwnPropertyNames(s).forEach(e=>o[e]=()=>t[e]);return o.default=()=>t,n.d(i,o),i},n.d=(e,r)=>{for(var t in r)n.o(r,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce((r,t)=>(n.f[t](e,r),r),[])),n.u=e=>({194:"wc-hooks",264:"deprecated-functions",526:"pixel-facebook",625:"consent-management",671:"pixel-google",712:"pixel-crazyegg",818:"pixel-hotjar",968:"consent-api",972:"doofinder-listener"}[e]+"."+{194:"c871cc71",264:"08bc16f9",526:"1aad8345",625:"9d45b6cb",671:"87d84819",712:"badd0e8f",818:"c3ec2dc3",968:"c33d5439",972:"5dc21f92"}[e]+".chunk.min.js"),n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),t={},a="Pixel Manager for WooCommerce:",n.l=(e,r,i,o)=>{if(t[e])t[e].push(r);else{var s,c;if(void 0!==i)for(var u=document.getElementsByTagName("script"),p=0;p<u.length;p++){var d=u[p];if(d.getAttribute("src")==e||d.getAttribute("data-webpack")==a+i){s=d;break}}s||(c=!0,(s=document.createElement("script")).charset="utf-8",n.nc&&s.setAttribute("nonce",n.nc),s.setAttribute("data-webpack",a+i),s.src=e),t[e]=[r];var l=(r,a)=>{s.onerror=s.onload=null,clearTimeout(m);var i=t[e];if(delete t[e],s.parentNode&&s.parentNode.removeChild(s),i&&i.forEach(e=>e(a)),r)return r(a)},m=setTimeout(l.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=l.bind(null,s.onerror),s.onload=l.bind(null,s.onload),c&&document.head.appendChild(s)}},n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var r=n.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var a=t.length-1;a>-1&&(!e||!/^http(s?):/.test(e));)e=t[a--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})(),(()=>{var e={792:0};n.f.j=(r,t)=>{var a=n.o(e,r)?e[r]:void 0;if(0!==a)if(a)t.push(a[2]);else{var i=new Promise((t,i)=>a=e[r]=[t,i]);t.push(a[2]=i);var o=n.p+n.u(r),s=new Error;n.l(o,t=>{if(n.o(e,r)&&(0!==(a=e[r])&&(e[r]=void 0),a)){var i=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;s.message="Loading chunk "+r+" failed.\n("+i+": "+o+")",s.name="ChunkLoadError",s.type=i,s.request=o,a[1](s)}},"chunk-"+r,r)}};var r=(r,t)=>{var a,i,[o,s,c]=t,u=0;if(o.some(r=>0!==e[r])){for(a in s)n.o(s,a)&&(n.m[a]=s[a]);if(c)c(n)}for(r&&r(t);u<o.length;u++)i=o[u],n.o(e,i)&&e[i]&&e[i][0](),e[i]=0},t=self.webpackChunkPixel_Manager_for_WooCommerce=self.webpackChunkPixel_Manager_for_WooCommerce||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})();(async()=>{if(n(165),n(547),await pmw.jQueryExists(),await pmw.dataLayerFullyLoaded(),pmwDataLayer?.general?.chunk_base_path&&(n.p=pmwDataLayer.general.chunk_base_path),n(79),n(208),n(550),n(341),pmw.initializeCommandQueue(),pmw.pmwConsoleMessage(),await pmw.loadConsentModule(),await pmw.consent.load(),jQuery(()=>{n(544)}),n(50),n.e(972).then(n.t.bind(n,652,23)),pmw.loadWcHooksFunctions(),pmw.excludeDomainFromTracking())return;const e=[];if(pmwDataLayer?.pixels?.google&&e.push(n.e(671).then(n.t.bind(n,62,23))),pmwDataLayer?.pixels?.facebook&&e.push(n.e(526).then(n.t.bind(n,767,23))),pmwDataLayer?.pixels?.hotjar&&e.push(n.e(818).then(n.t.bind(n,155,23))),pmwDataLayer?.pixels?.crazyegg&&e.push(n.e(712).then(n.t.bind(n,49,23))),await Promise.all(e),!1!==pmwDataLayer?.general?.modules?.load_deprecated_functions){const{loadDeprecatedFunctions:e}=await n.e(264).then(n.bind(n,483));e()}document.dispatchEvent(new Event("pmw:load-pixels")),document.dispatchEvent(new Event("pmwLoad")),await pmw.pageLoaded(),document.dispatchEvent(new Event("pmw:ready")),pmw.triggerPmwDomReadyEvent(),pmw.checkLibraryVersion()})()})();
     1/*! Copyright 2025 SweetCode. All rights reserved. */(()=>{var e,r,t,a,i={50(){const e=e=>e=(e=e.replace(/<[^>]*>?/gm,"").replace(/\n/gm,"").replace(/\t/gm,"")).trim();jQuery("form.woocommerce-checkout").on("change","#shipping_method",t=>{t.target?.value&&t.target?.id&&r({slug:t.target.value,text:e(jQuery("label[for='"+t.target.id+"']").text())})}),jQuery(()=>{if(jQuery("#shipping_method").length){let t=jQuery("#shipping_method").find(":checked");if(t.length){if(!t.val())return;if(!t.attr("id"))return;r({slug:t.val(),text:e(jQuery("label[for='"+t.attr("id")+"']").text())})}}});const r=e=>{jQuery(document).trigger("pmw:add-shipping-info",{shippingTier:e})};let t=!1;jQuery("form.woocommerce-checkout").on("change",'input[name="payment_method"]',r=>{r.target.value&&r.target.id&&(a({slug:r.target.value,text:e(jQuery("label[for='"+r.target.id+"']").text())}),t=!0)}),jQuery(()=>{if(t)return;let r=jQuery('input[name="payment_method"]:checked');if(r.length){if(!r.val())return;if(!r.attr("id"))return;a({slug:r.val(),text:e(jQuery("label[for='"+r.attr("id")+"']").text())})}});const a=e=>{jQuery(document).trigger("pmw:add-payment-info",{paymentType:e})};jQuery(document).on("click",".remove_from_cart_button, .remove",e=>{try{let r=new URL(jQuery(e.currentTarget).attr("href")),t=pmw.getProductIdByCartItemKeyUrl(r);pmw.removeProductFromCart(t)}catch(e){console.error(e)}});const i=pmw.prepareSelectors([".checkout-button",".cart-checkout-button",".button.checkout",".xoo-wsc-ft-btn-checkout",".elementor-button--checkout",".xt_woofc-checkout",".fkcart-checkout--text"],"beginCheckout");jQuery(document).on("click init_checkout",i,()=>{jQuery(document).trigger("pmw:begin-checkout")}),jQuery(document).on("updated_cart_totals",()=>{jQuery(document).trigger("pmw:view-cart")}),jQuery(document).on("pmwLoad",e=>{jQuery(document).on("payment_method_selected",()=>{!1===pmw.paymentMethodSelected&&pmw.fireCheckoutProgress(3),pmw.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val()),pmw.paymentMethodSelected=!0})}),jQuery(document).on("pmwLoad",()=>{try{pmw.initCart()}catch(e){console.error(e)}}),jQuery(document).on("pmwLoad",()=>{pmwDataLayer.products=pmwDataLayer.products||{};let e=pmw.getAddToCartLinkProductIds();pmw.getProductsFromBackend(e)}),jQuery(document).on("pmwLoad",()=>{if(!document.referrer)return;if(pmw.retrieveData("referrer"))return;let e=new URL(document.referrer).hostname;e!==window.location.host&&pmw.storeData("referrer",e)}),jQuery(document).on("pmwLoad",()=>{let e=pmw.getUrlParameter("gclid");e&&pmw.storeData("gclid",e);let r=pmw.getUrlParameter("wbraid");r&&pmw.storeData("wbraid",r);let t=pmw.getUrlParameter("gbraid");t&&pmw.storeData("gbraid",t);let a=pmw.getUrlParameter("fbclid");a&&(a="fb.1."+Math.floor(Date.now()/1e3)+"."+a,pmw.storeData("fbclid",a));let i=pmw.getUrlParameter("ttclid");i&&pmw.storeData("ttclid",i);let o=pmw.getUrlParameter("ScCid");o&&pmw.storeData("scid",o);let n=pmw.getUrlParameter("epik");n&&pmw.storeData("epik",n)}),jQuery(document).on("pmwLoad",()=>{try{if("undefined"!=typeof pmwDataLayer&&!pmwDataLayer?.pmw_loaded){if(jQuery(document).trigger("pmw:load-always"),pmwDataLayer?.shop)if("product"===pmwDataLayer.shop.page_type&&"variable"!==pmwDataLayer.shop.product_type&&pmw.getMainProductIdFromProductPage()){let e=pmw.getProductDataForViewItemEvent(pmw.getMainProductIdFromProductPage());jQuery(document).trigger("pmw:view-item",e)}else if("product"===pmwDataLayer.shop.page_type&&"variable"===pmwDataLayer.shop.product_type&&!pmwDataLayer?.shop?.variations_output&&pmw.getMainProductIdFromProductPage()){let e=pmw.getProductDataForViewItemEvent(pmw.getMainProductIdFromProductPage());jQuery(document).trigger("pmw:view-item",e)}else"product_category"===pmwDataLayer.shop.page_type?jQuery(document).trigger("pmw:view-category"):"search"===pmwDataLayer.shop.page_type?jQuery(document).trigger("pmw:search"):"cart"===pmwDataLayer.shop.page_type?jQuery(document).trigger("pmw:view-cart"):"order_received_page"===pmwDataLayer.shop.page_type?pmwDataLayer?.order&&!pmw.isOrderIdStored(pmwDataLayer.order.id)&&(jQuery(document).trigger("pmw:purchase"),pmw.writeOrderIdToStorage(pmwDataLayer.order.id,pmwDataLayer.order.key),"function"==typeof pmw.acrRemoveCookie&&pmw.acrRemoveCookie()):jQuery(document).trigger("pmw:everywhere-else");else jQuery(document).trigger("pmw:everywhere-else");pmwDataLayer?.user?.id&&!pmw.hasLoginEventFired()&&(jQuery(document).trigger("pmw:login"),pmw.setLoginEventFired()),pmwDataLayer?.user?.account_just_created&&!pmw.hasAccountCreatedEventFired()&&(jQuery(document).trigger("pmw:account-created"),pmw.setAccountCreatedEventFired()),pmwDataLayer.pmw_loaded=!0}}catch(e){console.error(e)}}),pmwDataLayer?.general?.lazy_load_pmw&&pmw.registerShowVariationEventListener(),jQuery(document).on("pmwLoad",()=>{if(pmwDataLayer?.general?.lazy_load_pmw&&pmwDataLayer?.shop?.variations_output)try{const e=jQuery(".variations_form");if(!e.length)return;const r={};if(!e.find("select").toArray().every(e=>{const t=jQuery(e).val();return!!t&&(r[jQuery(e).attr("name")]=t,!0)}))return;const t=e.data("product_variations");if(!t)return;const a=t.find(e=>Object.entries(r).every(([r,t])=>e.attributes[r]===t));a&&pmw.triggerViewItemEventPrep(a.variation_id)}catch(e){pmw.console.error(e)}}),jQuery(document).on("pmwLoad",async()=>{!1===pmw.retrieveData("restEndpointAvailable")&&pmw.console.error("REST endpoint is not available. Using admin-ajax.php instead.")}),jQuery(document).on("pmw:page-view",async e=>{pmw.console.log("pmw:page-view event fired",{event:e});const r=await pmw.processEvent("page_view",{});if(pmwDataLayer?.general?.server_2_server?.pageview_event_s2s?.is_active){const e=pmw.pixelRegistry.getPixelsWithCapability("supportsPageViewS2S");if(e.length>0){const t={event:"page_view"};for(const a of e)r.pixels[a]&&(t[a]=r.pixels[a]);Object.keys(t).length>1&&pmw.sendEventPayloadToServer(t)}}}),jQuery(document).on("pmw:add-to-cart",async(e,r)=>{pmw.console.log("pmw:add-to-cart event fired",{event:e,product:r}),await pmw.processEvent("add_to_cart",{product:r})}),jQuery(document).on("pmw:remove-from-cart",async(e,r)=>{pmw.console.log("pmw:remove-from-cart event fired",{event:e,product:r}),await pmw.processEvent("remove_from_cart",{product:r})}),jQuery(document).on("pmw:select-item",async(e,r)=>{pmw.console.log("pmw:select-item event fired",{event:e,product:r}),await pmw.processEvent("select_item",{product:r})}),jQuery(document).on("pmw:view-cart",e=>{pmw.console.log("pmw:view-cart event fired",{event:e}),pmw.processEvent("view_cart",{})}),jQuery(document).on("pmw:begin-checkout",e=>{pmw.console.log("pmw:begin-checkout event fired",{event:e}),pmw.processEvent("begin_checkout",{})}),jQuery(document).on("pmw:add-payment-info",e=>{pmw.console.log("pmw:add-payment-info event fired",{event:e}),pmw.processEvent("add_payment_info",{})}),jQuery(document).on("pmw:add-to-wishlist",async(e,r)=>{pmw.console.log("pmw:add-to-wishlist event fired",{event:e,product:r}),await pmw.processEvent("add_to_wishlist",{product:r})}),jQuery(document).on("pmw:view-item",(e,r=null)=>{pmw.console.log("pmw:view-item event fired",{event:e,product:r}),pmw.processEvent("view_item",{product:r})}),jQuery(document).on("pmw:view-category",async(e,r=null)=>{pmw.console.log("pmw:view-category event fired",{event:e,product:r}),await pmw.processEvent("view_category",{product:r})}),jQuery(document).on("pmw:search",e=>{pmw.console.log("pmw:search event fired",{event:e}),pmw.processEvent("search",{})}),jQuery(document).on("pmw:place-order",async e=>{pmw.console.log("pmw:place-order event fired",{event:e}),await pmw.processEvent("place_order",{})}),jQuery(document).on("pmw:purchase",async e=>{pmw.console.log("pmw:purchase event fired",{event:e}),await pmw.processEvent("purchase",{order:pmwDataLayer.order})}),jQuery(document).on("pmw:login",async()=>{pmw.console.log("pmw:login event fired"),await pmw.processEvent("login",{})}),jQuery(document).on("pmw:account-created",async()=>{pmw.console.log("pmw:account-created event fired"),await pmw.processEvent("account_created",{})}),jQuery(document).on("pmw:ready",async()=>{pmw.isWooCommerceActive()&&(pmw.startIntersectionObserverToWatch(),pmw.startProductsMutationObserverToWatch())}),jQuery(document).on("pmw:load-pixels",()=>{pmw.waitForPixelsAndTriggerPageView()})},79(e,r,t){t(897),window.pmw.loadConsentModule=async()=>{const e=await t.e(625).then(t.bind(t,383));window.pmw.consent=e;const r=await t.e(968).then(t.bind(t,523));return window.pmw=window.pmw||{},window.pmw.consent=window.pmw.consent||{},window.pmw.consent.api=r,e},window.pmw=window.pmw||{},window.pmw.console=t(91);const a=t(310);window.pmw.crossTabSync=a,t(362)},91(e,r,t){"use strict";t.r(r),t.d(r,{error:()=>i,log:()=>a});const a=(e,...r)=>{o()&&("object"==typeof e?console.log("Pixel Manager: ",e,...r):r.length?console.log("Pixel Manager: "+e,...r):console.log("Pixel Manager: "+e))},i=(e,...r)=>{"object"==typeof e?console.error("Pixel Manager: ",e,...r):r.length?console.error("Pixel Manager: "+e,...r):console.error("Pixel Manager: "+e)},o=()=>!n()&&(!!s()||(!!c()||!!pmwDataLayer?.general?.logger?.is_active)),n=()=>(pmw.urlHasParameter("pmwloggeroff")&&pmw.storeData("loggerEnabled",!1),pmw.urlHasParameter("pmwloggeroff")),s=()=>pmw.retrieveData("loggerEnabled"),c=()=>(pmw.urlHasParameter("pmwloggeron")&&pmw.storeData("loggerEnabled",!0),pmw.urlHasParameter("pmwloggeron"))},160(e,r,t){"use strict";var a=this&&this.__spreadArrays||function(){for(var e=0,r=0,t=arguments.length;r<t;r++)e+=arguments[r].length;var a=Array(e),i=0;for(r=0;r<t;r++)for(var o=arguments[r],n=0,s=o.length;n<s;n++,i++)a[i]=o[n];return a};Object.defineProperty(r,"__esModule",{value:!0}),r.isSpecial=r.isReserved=r.isIPv4MappedAddress=r.isLocalhost=r.isPrivate=r.createChecker=r.isInSubnet=r.extractMappedIpv4=void 0;var i=t(609),o=t(503),n=/\./,s=/^(.+:ffff:)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?:%.+)?$/,c=/:/,u=/::/;function p(e){if(!i.isIPv6(e))throw new Error("not a valid IPv6 address: "+e);if(n.test(e))return p(function(e){var r=e.match(s);if(!r||!i.isIPv4(r[2]))throw new Error("not a mapped IPv4 address: "+e);var t=r[1],a=r[2].split(n).map(function(e){return parseInt(e,10)});return""+t+((a[0]<<8)+a[1]).toString(16)+":"+((a[2]<<8)+a[3]).toString(16)}(e));var r=e.split(u),t=r[0],a=r[1],o=t&&t.split(c)||[],d=a&&a.split(c)||[],l=new Array(8-(o.length+d.length));return o.concat(l,d)}function d(e){if(Array.isArray(e)){var r=e.map(function(e){return l(e)});return function(e){var t=p(e);return r.some(function(e){return e(t)})}}var t=l(e);return function(e){var r=p(e);return t(r)}}function l(e){var r=e.split("/"),t=r[0],a=r[1],i=parseInt(a,10);if(!t||!Number.isInteger(i))throw new Error("not a valid IPv6 CIDR subnet: "+e);if(i<0||i>128)throw new Error("not a valid IPv6 prefix length: "+i+" (from "+e+")");var o=p(t);return function(e){for(var r=0;r<8;++r){var t=Math.min(i-16*r,16);if(t<=0)break;if((o[r]&&parseInt(o[r],16)||0)>>16-t!==(e[r]&&parseInt(e[r],16)||0)>>16-t)return!1}return!0}}r.extractMappedIpv4=function(e){var r=e.match(s);if(!r||!i.isIPv4(r[2]))throw new Error("not a mapped IPv4 address: "+e);return r[2]},r.isInSubnet=function(e,r){return d(r)(e)},r.createChecker=d;var m={};r.isPrivate=function(e){return"private"in m==!1&&(m.private=d(o.default.private.ipv6)),m.private(e)},r.isLocalhost=function(e){return"localhost"in m==!1&&(m.localhost=d(o.default.localhost.ipv6)),m.localhost(e)},r.isIPv4MappedAddress=function(e){if("mapped"in m==!1&&(m.mapped=d("::ffff:0:0/96")),m.mapped(e)){var r=e.match(s);return Boolean(r&&i.isIPv4(r[2]))}return!1},r.isReserved=function(e){return"reserved"in m==!1&&(m.reserved=d(o.default.reserved.ipv6)),m.reserved(e)},r.isSpecial=function(e){return"special"in m==!1&&(m.special=d(a(o.default.private.ipv6,o.default.localhost.ipv6,o.default.reserved.ipv6))),m.special(e)}},165(e,r,t){!function(e){e.jQueryExists=async()=>new Promise(e=>{!function r(){if("undefined"!=typeof jQuery)return e();setTimeout(r,100)}()}),e.waitForLibrary=(e,r=5e3,t=100)=>{const a=Date.now();for(;void 0===window[e]&&!(Date.now()-a>r);)setTimeout(()=>{},t)},e.dataLayerFullyLoaded=async()=>{let e=new Promise(e=>{!function r(){if("undefined"!=typeof pmwDataLayer&&void 0!==pmwDataLayer.version)return e();setTimeout(r,100)}()}),r=setTimeout(()=>{console.error("Pixel Manager error: The pmwDataLayer is not defined. Please make sure that the pmwDataLayer script snippet is inserted and not modified by any third-party plugin, such as a consent management platform or a JavaScript optimizer.")},6e3);return e.then(()=>{clearTimeout(r)}),e},e.wpHooksExists=async()=>new Promise(e=>{!function r(){if("undefined"!=typeof wp&&void 0!==wp.hooks)return e();setTimeout(r,50)}()}),e.loadWcHooksFunctions=async()=>{await e.wpHooksExists(),await t.e(194).then(t.t.bind(t,224,23))}}(window.pmw=window.pmw||{},jQuery)},208(){!function(e){window.pmw=window.pmw||{},e.hooks={filters:{},addFilter:function(r,t,a,i=10){r&&"string"==typeof r?t&&"string"==typeof t?"function"==typeof a?(this.filters[r]||(this.filters[r]=[]),this.filters[r].push({namespace:t,callback:a,priority:i}),this.filters[r].sort((e,r)=>e.priority-r.priority),e.console.log(`Filter added: ${r} (${t}) with priority ${i}`)):e.console.error("Invalid callback provided to addFilter"):e.console.error("Invalid namespace provided to addFilter"):e.console.error("Invalid hook name provided to addFilter")},applyFilters:function(r,t,...a){if(!this.filters[r]||0===this.filters[r].length)return t;let i=t;for(const t of this.filters[r])try{const o=t.callback(i,...a);undefined!==o?i=o:e.console.warn(`Filter ${t.namespace} on ${r} returned undefined, keeping previous value`)}catch(a){e.console.error(`Filter error in ${t.namespace} on ${r}:`,a)}return i},removeFilter:function(r,t){if(!this.filters[r])return;const a=this.filters[r].length;this.filters[r]=this.filters[r].filter(e=>e.namespace!==t),this.filters[r].length<a&&e.console.log(`Filter removed: ${r} (${t})`)},removeAllFilters:function(r){this.filters[r]&&(delete this.filters[r],e.console.log(`All filters removed for: ${r}`))},hasFilter:function(e,r=null){return!(!this.filters[e]||0===this.filters[e].length)&&(!r||this.filters[e].some(e=>e.namespace===r))},getFilters:function(e){return this.filters[e]||[]}},e.hooks=e.hooks}(window.pmw=window.pmw||{},jQuery)},265(e,r,t){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.check=r.isSpecial=r.isReserved=r.isIPv4MappedAddress=r.isLocalhost=r.isPrivate=r.createChecker=r.isInSubnet=r.IPv6=r.IPv4=r.isIPv6=r.isIPv4=r.isIP=void 0;var a=t(618);r.IPv4=a;var i=t(160);r.IPv6=i;var o=t(609),n=t(609);function s(e,r){return c(r)(e)}function c(e){if(!Array.isArray(e))return c([e]);var r=e.reduce(function(e,r){var t=r.split("/")[0];return e[o.isIP(t)].push(r),e},{0:[],4:[],6:[]});if(0!==r[0].length)throw new Error("some subnets are not valid IP addresses: "+r[0]);var t=a.createChecker(r[4]),n=i.createChecker(r[6]);return function(e){if(!o.isIP(e))throw new Error("not a valid IPv4 or IPv6 address: "+e);return o.isIPv6(e)&&i.isIPv4MappedAddress(e)?n(e)||t(i.extractMappedIpv4(e)):o.isIPv6(e)?n(e):t(e)}}Object.defineProperty(r,"isIP",{enumerable:!0,get:function(){return n.isIP}}),Object.defineProperty(r,"isIPv4",{enumerable:!0,get:function(){return n.isIPv4}}),Object.defineProperty(r,"isIPv6",{enumerable:!0,get:function(){return n.isIPv6}}),r.isInSubnet=s,r.createChecker=c,r.isPrivate=function(e){return o.isIPv6(e)?i.isIPv4MappedAddress(e)?a.isPrivate(i.extractMappedIpv4(e)):i.isPrivate(e):a.isPrivate(e)},r.isLocalhost=function(e){return o.isIPv6(e)?i.isIPv4MappedAddress(e)?a.isLocalhost(i.extractMappedIpv4(e)):i.isLocalhost(e):a.isLocalhost(e)},r.isIPv4MappedAddress=function(e){return!!o.isIPv6(e)&&i.isIPv4MappedAddress(e)},r.isReserved=function(e){return o.isIPv6(e)?i.isIPv4MappedAddress(e)?a.isReserved(i.extractMappedIpv4(e)):i.isReserved(e):a.isReserved(e)},r.isSpecial=function(e){return o.isIPv6(e)?i.isIPv4MappedAddress(e)?a.isSpecial(i.extractMappedIpv4(e)):i.isSpecial(e):a.isSpecial(e)},r.check=s},310(e,r,t){"use strict";t.r(r),t.d(r,{broadcastUpdate:()=>y,cleanup:()=>A,init:()=>v,isSyncableKey:()=>l,isSyncing:()=>m});const a="_pmw_cross_tab_sync",i="_pmw_session_data",o="SESSION_REQUEST",n="SESSION_RESPONSE",s="SESSION_UPDATE",c=new Set(["loginEventFired","accountCreatedEventFired","acr_attempted","store_client_ip_in_server_session"]);let u=!1,p=null,d=!1;const l=e=>!c.has(e),m=()=>u,g=()=>{const e={main:{},extensions:{}};if(!window.sessionStorage)return e;try{const r=window.sessionStorage.getItem(i);r&&(e.main=JSON.parse(r));for(let r=0;r<window.sessionStorage.length;r++){const t=window.sessionStorage.key(r);if(t&&t.startsWith(i+"_")){const r=t.substring(18);try{e.extensions[r]=JSON.parse(window.sessionStorage.getItem(t))}catch(e){}}}}catch(e){}return e},f=e=>{if(window.sessionStorage&&e){u=!0;try{if(e.main&&"object"==typeof e.main){const r=(e=>{if(!e||"object"!=typeof e)return{};const r={};for(const t of Object.keys(e))l(t)&&(r[t]=e[t]);return r})(e.main),t=window.sessionStorage.getItem(i),a=t?JSON.parse(t):{},o={...r,...a};window.sessionStorage.setItem(i,JSON.stringify(o))}if(e.extensions&&"object"==typeof e.extensions)for(const[r,t]of Object.entries(e.extensions)){const e=i+"_"+r;window.sessionStorage.getItem(e)||window.sessionStorage.setItem(e,JSON.stringify(t))}}catch(e){}u=!1}},w=e=>{try{p?p.postMessage(e):(window.localStorage.setItem(a,JSON.stringify(e)),window.localStorage.removeItem(a))}catch(e){}},h=e=>{if(e&&e.type)switch(e.type){case o:w({type:n,data:g()});break;case n:f(e.data);break;case s:if(!e.key||!l(e.key))break;u=!0;try{if(e.extension){const r=i+"_"+e.suffix;window.sessionStorage.setItem(r,JSON.stringify(e.value))}else{const r=window.sessionStorage.getItem(i),t=r?JSON.parse(r):{};t[e.key]=e.value,window.sessionStorage.setItem(i,JSON.stringify(t))}}catch(e){}u=!1}},y=(e,r,t=!1,a="")=>{u||(t||l(e))&&w({type:s,key:e,value:r,extension:t,suffix:a})},v=()=>{if(!d){d=!0;try{"undefined"!=typeof BroadcastChannel?(p=new BroadcastChannel("pmw_session_sync"),p.onmessage=e=>h(e.data)):window.addEventListener("storage",e=>{if(e.key===a&&e.newValue)try{const r=JSON.parse(e.newValue);h(r)}catch(e){}}),w({type:o})}catch(e){}}},A=()=>{if(p){try{p.close()}catch(e){}p=null}d=!1}},341(){!function(e){e.getConsentContext=function(){const r=e.consent?.categories?.get()||{statistics:!0,marketing:!0,preferences:!0,necessary:!0};return{categories:{statistics:r.statistics,marketing:r.marketing,preferences:r.preferences,necessary:r.necessary},visitor_has_chosen:e.consent?.settings?.get()?.visitorHasChosen??!1,explicit_mode:e.consent?.explicitConsentModeActive?.()??!1}},e.getEventContext=function(){return{timestamp:Math.floor(Date.now()/1e3),url:window.location.href,referrer:e.retrieveData("referrer")?e.makeFullUrl(e.retrieveData("referrer")):document.referrer,user_agent:navigator.userAgent,page_type:pmwDataLayer?.shop?.page_type,user_id:pmwDataLayer?.user?.id?.raw||null,consent:e.getConsentContext()}},e.processEvent=async function(r,t){e.console.log(`Processing event: ${r}`,t);try{let a={event:r,event_data:t,pixels:{},context:e.getEventContext()};a=e.hooks.applyFilters("pmw_event_payload_pre",a,r);const i=e.pixelRegistry.getProcessablePixels();for(const t of i){const i=e.pixelRegistry.getAdapter(t);if(i&&"function"==typeof i.adapt)try{let o=await i.adapt(a.event_data,r,a.context);if(null===o)continue;o=e.hooks.applyFilters(`pmw_pixel_data_${t}`,o,r,a.event_data,a.context),a.pixels[t]=o}catch(r){e.console.error(`Error adapting data for ${t}:`,r)}else e.console.log(`No adapter found for pixel: ${t}`)}a=e.hooks.applyFilters(`pmw_event_payload_${r}`,a,a.event_data),a=e.hooks.applyFilters("pmw_event_payload_post",a,r),a.firing={};for(const t of Object.keys(a.pixels))a.firing[t]=e.pixelRegistry.getFiringDecision(t,r);return await e.dispatchToPixels(a),a}catch(t){throw e.console.error(`Error processing event ${r}:`,t),t}},e.dispatchToPixels=async function(r){const t=r.event;if(e.dispatchUnifiedEvent(r),e.dispatchPublicEvent(r),"purchase"!==t){if("page_view"!==t&&pmwDataLayer?.general?.server_2_server?.active){const a=e.extractS2SData(r);if(Object.keys(a).length>0){if(pmwDataLayer.general.server_2_server.skip_empty_events){if(0===Object.keys(a).filter(e=>"event"!==e&&"product"!==e).length)return void e.console.log(`Skipping empty S2S event: ${t} — no destination pixels`)}const r=e.pixelRegistry.getPixelsForServerFiring(t);e.console.log(`S2S enabled pixels for ${t}:`,r),await e.sendEventPayloadToServer(a)}}}else e.console.log("Purchase event - skipping browser-to-server transmission (handled server-side only)")},e.dispatchUnifiedEvent=function(r){const t=e.pixelRegistry.getProcessablePixels();if(0===t.length)return;const a=r.event.replace(/_/g,"-");e.console.log(`Dispatching unified event pmw:pixel:${a}`,{processablePixels:t,firingStatus:r.firing}),jQuery(document).trigger(`pmw:pixel:${a}`,r)},e.dispatchToBrowserPixels=function(r){const t=e.pixelRegistry.getActiveBrowserOnlyPixels();if(0===t.length)return;e.console.log(`[DEPRECATED] Dispatching to browser-only pixels for ${r.event}:`,t);const a=r.event.replace(/_/g,"-");jQuery(document).trigger(`pmw:browser:${a}`,r)},e.dispatchToS2SPixels=function(r){const t=e.pixelRegistry.getActiveS2SPixels();if(0===t.length)return;e.console.log(`[DEPRECATED] Dispatching to S2S-capable pixels for ${r.event}:`,t);const a=r.event.replace(/_/g,"-");jQuery(document).trigger(`pmw:s2s:${a}`,r)},e.dispatchPublicEvent=function(r){const t=r.event.replace(/_/g,"-");jQuery(document).trigger(`pmw:event:${t}`,r),e.console.log(`Public event dispatched: pmw:event:${t}`,r)},e.extractS2SData=function(r){const t={event:r.event},a=e.pixelRegistry.getPixelsForServerFiring(r.event);for(const e of a)r.pixels[e]&&(t[e]=r.pixels[e]);return r.event_data?.product&&(t.product=r.event_data.product),t},e.shouldFireBrowserPixel=function(e,r){return!0===e.firing?.[r]?.fire_browser},e.shouldFireServerPixel=function(e,r){return!0===e.firing?.[r]?.fire_server},e.adapters||(e.adapters={}),e.registerAdapter=function(r,t,a={}){if(!t||"function"!=typeof t.adapt)return void e.console.error(`Invalid adapter for ${r}: must have an adapt() method`);e.adapters[r]=t,e.pixelCapabilities||(e.pixelCapabilities={});let i="browser_only";a.supportsS2S&&(i="both"),e.pixelCapabilities[r]={...a,mode:a.mode||i,supportsS2S:a.supportsS2S||!1,supportsEventDeduplication:a.supportsEventDeduplication||!1,isActive:a.isActive||null}}}(window.pmw=window.pmw||{},jQuery)},362(e,r,t){!function(e,r,a){const{isRange:i,isIP:o,isV4:n,isV6:s,version:c}=t(723);let u=null,p=!1;const d={cloudflare:{any:"https://www.cloudflare.com/cdn-cgi/trace"},icanhazip:{4:"https://ipv4.icanhazip.com",6:"https://ipv6.icanhazip.com",any:"https://icanhazip.com"},ipinfo:{any:"https://ipinfo.io/ip"},myexternalip:{any:"https://myexternalip.com/raw"},ipify:{4:"https://api4.ipify.org",6:"https://api6.ipify.org",any:"https://api64.ipify.org"},identme:{4:"https://4.ident.me/",6:"https://6.ident.me/",any:"https://ident.me/"}},l=(e,r=3e3)=>{const t=new AbortController,a=setTimeout(()=>t.abort(),r);return fetch(e,{signal:t.signal}).finally(()=>clearTimeout(a))};e.getGeoInfo={cloudflare:async()=>{const e=await l("https://www.cloudflare.com/cdn-cgi/trace");if(!e.ok)throw new Error(`The response from Cloudflare was not OK. Status: ${e.status}`);let r=await e.text();if(!r)throw new Error("No data was returned from Cloudflare");if(r=r.trim().split("\n").reduce((e,r)=>(e[(r=r.split("="))[0]]=r[1],e),{}),!r.ip||!r.loc)throw new Error("The JSON data is missing the ip or loc key from Cloudflare");if(m(r.loc))throw new Error("We have to validate the region, and this service is not returning the region.");return{ip:r.ip,countryCode:r.loc,service:"cloudflare"}},geojs:async()=>{const e=await l("https://get.geojs.io/v1/ip/geo.json");if(!e.ok)throw new Error(`The response from geojs was not OK. Status: ${e.status}`);let r=await e.json();if(!r)throw new Error("No JSON data was returned from geojs");if(!r.ip||!r.country_code||!r.region)throw new Error("The JSON data is missing the ip, country_code, or region key from geojs");return{ip:r.ip,countryCode:r.country_code,region:r.region,service:"geojs"}},ipinfo:async()=>{const e=await l("https://ipinfo.io/json");if(!e.ok)throw new Error(`The response from ipinfo was not OK from ipinfo. Status: ${e.status}`);let r=await e.json();if(!r)throw new Error("No JSON data was returned from ipinfo");if(!r.ip||!r.country||!r.region)throw new Error("The JSON data is missing the ip, country, or region key from ipinfo");return{ip:r.ip,countryCode:r.country,region:r.region,service:"ipinfo"}},ipapi:async()=>{const e=await l("https://ipapi.co/json");if(!e.ok)throw new Error(`The response from ipapi was not OK. Status: ${e.status}`);let r=await e.json();if(!r)throw new Error("No JSON data was returned from ipapi");if(!r.ip||!r.country||!r.region)throw new Error("The JSON data is missing the ip, country, or region key from ipapi");return{ip:r.ip,countryCode:r.country,region:r.region,service:"ipapi"}}};const m=e=>{if("US "!==e)return!1;return["US-CA","US-VA"].some(e=>pmwDataLayer?.general?.consent_management.restricted_regions.includes(e))};e.isVisitorAllowed=async()=>{if(null!==e.retrieveData("visitorAllowed")&&e.retrieveData("visitorAllowed")!==a)return!!JSON.parse(e.retrieveData("visitorAllowed"));if(e.isBotUserAgent())return e.storeData("visitorAllowed",!1),!1;if(Array.isArray(pmwDataLayer?.general?.server_2_server?.ip_exclude_list)&&pmwDataLayer.general.server_2_server.ip_exclude_list.length>0){const r=await e.getIp();if(w(r))return e.storeData("visitorAllowed",!1),!1}return e.storeData("visitorAllowed",!0),!0},e.isValidIpAddress=r=>!(!r||"string"!=typeof r)&&(!!o(r)&&!e.isPrivateOrReservedIp(r)),e.isPrivateOrReservedIp=e=>{if(!e)return!0;const r=n(e)?["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16","127.0.0.0/8","169.254.0.0/16","0.0.0.0/8"]:["::1/128","fc00::/7","fe80::/10","::/128"];try{const a=t(265);for(const t of r)if(a.isInSubnet(e,t))return!0}catch(r){if(n(e)){if(e.startsWith("10.")||e.startsWith("192.168.")||e.startsWith("127.")||e.startsWith("169.254.")||e.startsWith("0."))return!0;const r=e.split(".");if("172"===r[0]){const e=parseInt(r[1],10);if(e>=16&&e<=31)return!0}}else if("::1"===e||e.startsWith("fc")||e.startsWith("fd")||e.startsWith("fe80:"))return!0}return!1},e.getClientIp=async()=>{const r=e.retrieveData("client_ip");return r&&e.isValidIpAddress(r)?r:(u&&!p||(p=!1,u=(async()=>{try{const r=e.getIpWithTimeout("6",2e3),t=e.getIp("any"),[a,i]=await Promise.allSettled([r,t]);let o=null;return"fulfilled"===a.status&&a.value?(o=a.value,e.console.log(`Using IPv6 address: ${o}`)):"fulfilled"===i.status&&i.value&&(o=i.value,e.console.log(`IPv6 not available, using IP: ${o}`)),o&&e.isValidIpAddress(o)?(e.storeData("client_ip",o),p=!0,o):(p=!0,null)}catch(r){return e.console.error("Error detecting client IP:",r),p=!0,null}})()),u)},e.getIpWithTimeout=async(r,t)=>Promise.race([e.getIp(r),new Promise((e,a)=>setTimeout(()=>a(new Error(`IPv${r} detection timed out after ${t}ms`)),t))]).catch(r=>(e.console.log(r.message),null)),e.getIp=async(r="any",t=3)=>{const i=["any","4","6"];if(!i.includes(r))return console.error("The version argument must be one of the following: "+i.join(", ")),null;if("any"===r&&e.retrieveData("ip"))return e.retrieveData("ip");const n=e.retrieveData(`ipv${r}`);if(n!==a)return n;e.console.log("Testing the IP address of the browser because one ore more server-to-server APIs are enabled and require the browser IP. It may trigger connection request errors in the console while testing the IP address. This is normal and expected behavior.");try{const a=await e.getIpFromAnyService(r,t);return a&&!o(a)?(e.console.warn(`Invalid IP address received: ${a}`),null):("any"===r&&a&&e.storeData("ip",a),(4===c(a)||"4"===r&&null===a)&&e.storeData("ipv4",a),(6===c(a)||"6"===r&&null===a)&&e.storeData("ipv6",a),a)}catch(e){return null}},e.getBrowserGeoFromExternalService=async()=>{const r=performance.now();let t=[];Object.keys(e.getGeoInfo).forEach(r=>{t.push(e.getGeoInfo[r]())});try{const a=await Promise.any(t);return a.countryCode=a.countryCode.toUpperCase(),a.region&&"California"===a.region&&(a.regionCode="US-CA"),a.region&&"Virginia"===a.region&&(a.regionCode="US-VA"),e.console.log("Retrieved the browser geo info from an external service: ",a," which took ",(performance.now()-r).toFixed(2)+" ms"),a}catch(r){return e.console.error("error: ",r),null}};e.getBrowserGeo=async()=>{let r={};if(e.retrieveData("geoCountryCode")&&(r.countryCode=e.retrieveData("geoCountryCode")),e.retrieveData("geoRegionCode")&&(r.regionCode=e.retrieveData("geoRegionCode")),e.retrieveData("geoRegion")&&(r.region=e.retrieveData("geoRegion")),r.countryCode)return e.console.log("Retrieved the browser geo location from the cache: ",r),r;let a=await e.getBrowserGeoFromExternalService();if(!a){const r=(()=>{const e=t(473).getLocationByTimeZone();return e.countryCode?e:null})();a={},r&&e.console.log("Retrieved the browser geo location from the timezone: ",r),r.countryCode&&(a.countryCode=r.countryCode),r.regionCode&&(a.regionCode=r.regionCode)}return a?.ip&&e.storeData("ip",a.ip),a?.countryCode&&e.storeData("geoCountryCode",a.countryCode),a?.regionCode&&e.storeData("geoRegionCode",a.regionCode),a?.region&&e.storeData("geoRegion",a.region),a?.countryCode?a:null},e.getIpFromAnyService=async(r="any",t=3)=>{const a=performance.now(),i=Object.keys(d).filter(e=>d[e][r]).slice(0,t).reduce((e,r)=>(e[r]=d[r],e),{});let o=[];if(Object.keys(i).forEach(t=>{i[t][r]&&o.push(e.getIpFromService(t,r))}),!(o.length>0))return e.console.log("No promises to resolve"),null;try{const r=await Promise.any(o),t=(performance.now()-a).toFixed(2);return e.console.log(`Retrieved the IP address ${r.ip} from ${r.service} which took ${t} ms`),r.ip}catch(t){return e.console.log(`Could not retrieve an IP with version ${r} from any of the services.`),null}},e.getIpFromService=async(r,t="any")=>{try{let a={ip:null,service:r,ipVersion:t};if(!d[r][t])return Promise.reject(new Error(`The IP version ${t} is not available for the service ${r}`));e.console.log(`Fetching IP from ${r} using IP version ${t}`);const i=await l(d[r][t]);if(!i.ok)return Promise.reject(new Error(`The response from ${r} was not OK. Status: ${i.status}`));let n=await i.text();return"cloudflare"===r?(n=n.trim().split("\n").reduce((e,r)=>(e[(r=r.split("="))[0]]=r[1],e),{}),a.ip=n.ip):a.ip=n.trim(),o(a.ip)?a:Promise.reject(new Error(`The returned value from ${r} is not an IP address`))}catch(e){return Promise.reject(e)}};e.isVisitorNotAllowed=async()=>!1===await e.isVisitorAllowed(),e.isBotUserAgent=()=>{const e=navigator.userAgent||"";if(!e)return!0;const r=g();for(const t of r)if(e.toLowerCase().includes(t.toLowerCase()))return!0;return!1};const g=()=>{let e=[];Array.isArray(pmwDataLayer?.general?.server_2_server?.user_agent_exclude_patterns)&&(e=pmwDataLayer.general.server_2_server.user_agent_exclude_patterns);return["Googlebot","Google-InspectionTool","Google-Extended","Storebot-Google","bingbot","BingPreview","msnbot","Slurp","DuckDuckBot","Baiduspider","YandexBot","Sogou","facebookexternalhit","FacebookBot","LinkedInBot","Twitterbot","PinterestBot","TikTokBot","SnapchatAds","DiscordBot","InstagramBot","WhatsApp","AhrefsBot","SemrushBot","MJ12bot","DotBot","rogerbot","UptimeRobot","Pingdom","StatusCake","GTmetrix","ClaudeBot","GPTBot","ChatGPT","anthropic-ai","CCBot","PerplexityBot","crawler","spider","scraper","bot/","/bot","bot-"].concat(e)},f=e=>e.includes("/"),w=e=>{const r=pmwDataLayer?.general?.server_2_server?.ip_exclude_list||[];for(const t of r)if(f(t)){if(isInSubnet.isInSubnet(e,t))return!0}else if(e===t)return!0;return!1}}(window.pmw=window.pmw||{},jQuery)},473(e,r,t){"use strict";t.r(r),t.d(r,{getLocationByTimeZone:()=>a});const a=()=>{const e=Intl.DateTimeFormat().resolvedOptions().timeZone;if(""===e||!e)return null;let r={countryCode:{"Africa/Abidjan":["CI","BF","GH","GM","GN","ML","MR","SH","SL","SN","TG"],"Africa/Accra":["GH"],"Africa/Addis_Ababa":["ET"],"Africa/Algiers":["DZ"],"Africa/Asmara":["ER"],"Africa/Asmera":["ER"],"Africa/Bamako":["ML"],"Africa/Bangui":["CF"],"Africa/Banjul":["GM"],"Africa/Bissau":["GW"],"Africa/Blantyre":["MW"],"Africa/Brazzaville":["CG"],"Africa/Bujumbura":["BI"],"Africa/Cairo":["EG"],"Africa/Casablanca":["MA"],"Africa/Ceuta":["ES"],"Africa/Conakry":["GN"],"Africa/Dakar":["SN"],"Africa/Dar_es_Salaam":["TZ"],"Africa/Djibouti":["DJ"],"Africa/Douala":["CM"],"Africa/El_Aaiun":["EH"],"Africa/Freetown":["SL"],"Africa/Gaborone":["BW"],"Africa/Harare":["ZW"],"Africa/Johannesburg":["ZA","LS","SZ"],"Africa/Juba":["SS"],"Africa/Kampala":["UG"],"Africa/Khartoum":["SD"],"Africa/Kigali":["RW"],"Africa/Kinshasa":["CD"],"Africa/Lagos":["NG","AO","BJ","CD","CF","CG","CM","GA","GQ","NE"],"Africa/Libreville":["GA"],"Africa/Lome":["TG"],"Africa/Luanda":["AO"],"Africa/Lubumbashi":["CD"],"Africa/Lusaka":["ZM"],"Africa/Malabo":["GQ"],"Africa/Maputo":["MZ","BI","BW","CD","MW","RW","ZM","ZW"],"Africa/Maseru":["LS"],"Africa/Mbabane":["SZ"],"Africa/Mogadishu":["SO"],"Africa/Monrovia":["LR"],"Africa/Nairobi":["KE","DJ","ER","ET","KM","MG","SO","TZ","UG","YT"],"Africa/Ndjamena":["TD"],"Africa/Niamey":["NE"],"Africa/Nouakchott":["MR"],"Africa/Ouagadougou":["BF"],"Africa/Porto-Novo":["BJ"],"Africa/Sao_Tome":["ST"],"Africa/Timbuktu":["ML"],"Africa/Tripoli":["LY"],"Africa/Tunis":["TN"],"Africa/Windhoek":["NA"],"America/Adak":["US"],"America/Anchorage":["US"],"America/Anguilla":["AI"],"America/Antigua":["AG"],"America/Araguaina":["BR"],"America/Argentina/Buenos_Aires":["AR"],"America/Argentina/Catamarca":["AR"],"America/Argentina/Cordoba":["AR"],"America/Argentina/Jujuy":["AR"],"America/Argentina/La_Rioja":["AR"],"America/Argentina/Mendoza":["AR"],"America/Argentina/Rio_Gallegos":["AR"],"America/Argentina/Salta":["AR"],"America/Argentina/San_Juan":["AR"],"America/Argentina/San_Luis":["AR"],"America/Argentina/Tucuman":["AR"],"America/Argentina/Ushuaia":["AR"],"America/Aruba":["AW"],"America/Asuncion":["PY"],"America/Atikokan":["CA"],"America/Bahia":["BR"],"America/Bahia_Banderas":["MX"],"America/Barbados":["BB"],"America/Belem":["BR"],"America/Belize":["BZ"],"America/Blanc-Sablon":["CA"],"America/Boa_Vista":["BR"],"America/Bogota":["CO"],"America/Boise":["US"],"America/Cambridge_Bay":["CA"],"America/Campo_Grande":["BR"],"America/Cancun":["MX"],"America/Caracas":["VE"],"America/Cayenne":["GF"],"America/Cayman":["KY"],"America/Chicago":["US"],"America/Chihuahua":["MX"],"America/Coral_Harbour":["CA"],"America/Costa_Rica":["CR"],"America/Creston":["CA"],"America/Cuiaba":["BR"],"America/Curacao":["CW"],"America/Danmarkshavn":["GL"],"America/Dawson":["CA"],"America/Dawson_Creek":["CA"],"America/Denver":["US"],"America/Detroit":["US"],"America/Dominica":["DM"],"America/Edmonton":["CA"],"America/Eirunepe":["BR"],"America/El_Salvador":["SV"],"America/Fort_Nelson":["CA"],"America/Fortaleza":["BR"],"America/Glace_Bay":["CA"],"America/Goose_Bay":["CA"],"America/Grand_Turk":["TC"],"America/Grenada":["GD"],"America/Guadeloupe":["GP"],"America/Guatemala":["GT"],"America/Guayaquil":["EC"],"America/Guyana":["GY"],"America/Halifax":["CA"],"America/Havana":["CU"],"America/Hermosillo":["MX"],"America/Indiana/Indianapolis":["US"],"America/Indiana/Knox":["US"],"America/Indiana/Marengo":["US"],"America/Indiana/Petersburg":["US"],"America/Indiana/Tell_City":["US"],"America/Indiana/Vevay":["US"],"America/Indiana/Vincennes":["US"],"America/Indiana/Winamac":["US"],"America/Inuvik":["CA"],"America/Iqaluit":["CA"],"America/Jamaica":["JM"],"America/Juneau":["US"],"America/Kentucky/Louisville":["US"],"America/Kentucky/Monticello":["US"],"America/Kralendijk":["BQ"],"America/La_Paz":["BO"],"America/Lima":["PE"],"America/Los_Angeles":["US"],"America/Lower_Princes":["SX"],"America/Maceio":["BR"],"America/Managua":["NI"],"America/Manaus":["BR"],"America/Marigot":["MF"],"America/Martinique":["MQ"],"America/Matamoros":["MX"],"America/Mazatlan":["MX"],"America/Menominee":["US"],"America/Merida":["MX"],"America/Metlakatla":["US"],"America/Mexico_City":["MX"],"America/Miquelon":["PM"],"America/Moncton":["CA"],"America/Monterrey":["MX"],"America/Montevideo":["UY"],"America/Montreal":["CA"],"America/Montserrat":["MS"],"America/Nassau":["BS"],"America/New_York":["US"],"America/Nipigon":["CA"],"America/Nome":["US"],"America/Noronha":["BR"],"America/North_Dakota/Beulah":["US"],"America/North_Dakota/Center":["US"],"America/North_Dakota/New_Salem":["US"],"America/Nuuk":["GL"],"America/Ojinaga":["MX"],"America/Panama":["PA","CA","KY"],"America/Pangnirtung":["CA"],"America/Paramaribo":["SR"],"America/Phoenix":["US","CA"],"America/Port-au-Prince":["HT"],"America/Port_of_Spain":["TT"],"America/Porto_Velho":["BR"],"America/Puerto_Rico":["PR","AG","CA","AI","AW","BL","BQ","CW","DM","GD","GP","KN","LC","MF","MS","SX","TT","VC","VG","VI"],"America/Punta_Arenas":["CL"],"America/Rainy_River":["CA"],"America/Rankin_Inlet":["CA"],"America/Recife":["BR"],"America/Regina":["CA"],"America/Resolute":["CA"],"America/Rio_Branco":["BR"],"America/Santarem":["BR"],"America/Santiago":["CL"],"America/Santo_Domingo":["DO"],"America/Sao_Paulo":["BR"],"America/Scoresbysund":["GL"],"America/Sitka":["US"],"America/St_Barthelemy":["BL"],"America/St_Johns":["CA"],"America/St_Kitts":["KN"],"America/St_Lucia":["LC"],"America/St_Thomas":["VI"],"America/St_Vincent":["VC"],"America/Swift_Current":["CA"],"America/Tegucigalpa":["HN"],"America/Thule":["GL"],"America/Thunder_Bay":["CA"],"America/Tijuana":["MX"],"America/Toronto":["CA","BS"],"America/Tortola":["VG"],"America/Vancouver":["CA"],"America/Virgin":["VI"],"America/Whitehorse":["CA"],"America/Winnipeg":["CA"],"America/Yakutat":["US"],"America/Yellowknife":["CA"],"Antarctica/Casey":["AQ"],"Antarctica/Davis":["AQ"],"Antarctica/DumontDUrville":["AQ"],"Antarctica/Macquarie":["AU"],"Antarctica/Mawson":["AQ"],"Antarctica/McMurdo":["AQ"],"Antarctica/Palmer":["AQ"],"Antarctica/Rothera":["AQ"],"Antarctica/South_Pole":["AQ"],"Antarctica/Syowa":["AQ"],"Antarctica/Troll":["AQ"],"Antarctica/Vostok":["AQ"],"Arctic/Longyearbyen":["SJ"],"Asia/Aden":["YE"],"Asia/Almaty":["KZ"],"Asia/Amman":["JO"],"Asia/Anadyr":["RU"],"Asia/Aqtau":["KZ"],"Asia/Aqtobe":["KZ"],"Asia/Ashgabat":["TM"],"Asia/Atyrau":["KZ"],"Asia/Baghdad":["IQ"],"Asia/Bahrain":["BH"],"Asia/Baku":["AZ"],"Asia/Bangkok":["TH","KH","LA","VN"],"Asia/Barnaul":["RU"],"Asia/Beirut":["LB"],"Asia/Bishkek":["KG"],"Asia/Brunei":["BN"],"Asia/Chita":["RU"],"Asia/Choibalsan":["MN"],"Asia/Colombo":["LK"],"Asia/Damascus":["SY"],"Asia/Dhaka":["BD"],"Asia/Dili":["TL"],"Asia/Dubai":["AE","OM"],"Asia/Dushanbe":["TJ"],"Asia/Famagusta":["CY"],"Asia/Gaza":["PS"],"Asia/Hebron":["PS"],"Asia/Ho_Chi_Minh":["VN"],"Asia/Hong_Kong":["HK"],"Asia/Hovd":["MN"],"Asia/Irkutsk":["RU"],"Asia/Jakarta":["ID"],"Asia/Jayapura":["ID"],"Asia/Jerusalem":["IL"],"Asia/Kabul":["AF"],"Asia/Kamchatka":["RU"],"Asia/Karachi":["PK"],"Asia/Kathmandu":["NP"],"Asia/Khandyga":["RU"],"Asia/Kolkata":["IN"],"Asia/Krasnoyarsk":["RU"],"Asia/Kuala_Lumpur":["MY"],"Asia/Kuching":["MY"],"Asia/Kuwait":["KW"],"Asia/Macau":["MO"],"Asia/Magadan":["RU"],"Asia/Makassar":["ID"],"Asia/Manila":["PH"],"Asia/Muscat":["OM"],"Asia/Nicosia":["CY"],"Asia/Novokuznetsk":["RU"],"Asia/Novosibirsk":["RU"],"Asia/Omsk":["RU"],"Asia/Oral":["KZ"],"Asia/Phnom_Penh":["KH"],"Asia/Pontianak":["ID"],"Asia/Pyongyang":["KP"],"Asia/Qatar":["QA","BH"],"Asia/Qostanay":["KZ"],"Asia/Qyzylorda":["KZ"],"Asia/Riyadh":["SA","AQ","KW","YE"],"Asia/Sakhalin":["RU"],"Asia/Samarkand":["UZ"],"Asia/Seoul":["KR"],"Asia/Shanghai":["CN"],"Asia/Singapore":["SG","MY"],"Asia/Srednekolymsk":["RU"],"Asia/Taipei":["TW"],"Asia/Tashkent":["UZ"],"Asia/Tbilisi":["GE"],"Asia/Tehran":["IR"],"Asia/Thimphu":["BT"],"Asia/Tokyo":["JP"],"Asia/Tomsk":["RU"],"Asia/Ulaanbaatar":["MN"],"Asia/Urumqi":["CN"],"Asia/Ust-Nera":["RU"],"Asia/Vientiane":["LA"],"Asia/Vladivostok":["RU"],"Asia/Yakutsk":["RU"],"Asia/Yangon":["MM"],"Asia/Yekaterinburg":["RU"],"Asia/Yerevan":["AM"],"Atlantic/Azores":["PT"],"Atlantic/Bermuda":["BM"],"Atlantic/Canary":["ES"],"Atlantic/Cape_Verde":["CV"],"Atlantic/Faroe":["FO"],"Atlantic/Jan_Mayen":["SJ"],"Atlantic/Madeira":["PT"],"Atlantic/Reykjavik":["IS"],"Atlantic/South_Georgia":["GS"],"Atlantic/St_Helena":["SH"],"Atlantic/Stanley":["FK"],"Australia/Adelaide":["AU"],"Australia/Brisbane":["AU"],"Australia/Broken_Hill":["AU"],"Australia/Darwin":["AU"],"Australia/Eucla":["AU"],"Australia/Hobart":["AU"],"Australia/Lindeman":["AU"],"Australia/Lord_Howe":["AU"],"Australia/Melbourne":["AU"],"Australia/Perth":["AU"],"Australia/Sydney":["AU"],"Canada/Eastern":["CA"],"Europe/Amsterdam":["NL"],"Europe/Andorra":["AD"],"Europe/Astrakhan":["RU"],"Europe/Athens":["GR"],"Europe/Belfast":["GB"],"Europe/Belgrade":["RS","BA","HR","ME","MK","SI"],"Europe/Berlin":["DE"],"Europe/Bratislava":["SK"],"Europe/Brussels":["BE"],"Europe/Bucharest":["RO"],"Europe/Budapest":["HU"],"Europe/Busingen":["DE"],"Europe/Chisinau":["MD"],"Europe/Copenhagen":["DK"],"Europe/Dublin":["IE"],"Europe/Gibraltar":["GI"],"Europe/Guernsey":["GG"],"Europe/Helsinki":["FI","AX"],"Europe/Isle_of_Man":["IM"],"Europe/Istanbul":["TR"],"Europe/Jersey":["JE"],"Europe/Kaliningrad":["RU"],"Europe/Kiev":["UA"],"Europe/Kirov":["RU"],"Europe/Lisbon":["PT"],"Europe/Ljubljana":["SI"],"Europe/London":["GB","GG","IM","JE"],"Europe/Luxembourg":["LU"],"Europe/Madrid":["ES"],"Europe/Malta":["MT"],"Europe/Mariehamn":["AX"],"Europe/Minsk":["BY"],"Europe/Monaco":["MC"],"Europe/Moscow":["RU"],"Europe/Oslo":["NO","SJ","BV"],"Europe/Paris":["FR"],"Europe/Podgorica":["ME"],"Europe/Prague":["CZ","SK"],"Europe/Riga":["LV"],"Europe/Rome":["IT","SM","VA"],"Europe/Samara":["RU"],"Europe/San_Marino":["SM"],"Europe/Sarajevo":["BA"],"Europe/Saratov":["RU"],"Europe/Simferopol":["RU","UA"],"Europe/Skopje":["MK"],"Europe/Sofia":["BG"],"Europe/Stockholm":["SE"],"Europe/Tallinn":["EE"],"Europe/Tirane":["AL"],"Europe/Ulyanovsk":["RU"],"Europe/Uzhgorod":["UA"],"Europe/Vaduz":["LI"],"Europe/Vatican":["VA"],"Europe/Vienna":["AT"],"Europe/Vilnius":["LT"],"Europe/Volgograd":["RU"],"Europe/Warsaw":["PL"],"Europe/Zagreb":["HR"],"Europe/Zaporozhye":["UA"],"Europe/Zurich":["CH","DE","LI"],GB:["GB"],"GB-Eire":["GB"],"Indian/Antananarivo":["MG"],"Indian/Chagos":["IO"],"Indian/Christmas":["CX"],"Indian/Cocos":["CC"],"Indian/Comoro":["KM"],"Indian/Kerguelen":["TF","HM"],"Indian/Mahe":["SC"],"Indian/Maldives":["MV"],"Indian/Mauritius":["MU"],"Indian/Mayotte":["YT"],"Indian/Reunion":["RE","TF"],NZ:["NZ"],"Pacific/Apia":["WS"],"Pacific/Auckland":["NZ","AQ"],"Pacific/Bougainville":["PG"],"Pacific/Chatham":["NZ"],"Pacific/Chuuk":["FM"],"Pacific/Easter":["CL"],"Pacific/Efate":["VU"],"Pacific/Fakaofo":["TK"],"Pacific/Fiji":["FJ"],"Pacific/Funafuti":["TV"],"Pacific/Galapagos":["EC"],"Pacific/Gambier":["PF"],"Pacific/Guadalcanal":["SB"],"Pacific/Guam":["GU","MP"],"Pacific/Honolulu":["US","UM"],"Pacific/Johnston":["UM"],"Pacific/Kanton":["KI"],"Pacific/Kiritimati":["KI"],"Pacific/Kosrae":["FM"],"Pacific/Kwajalein":["MH"],"Pacific/Majuro":["MH"],"Pacific/Marquesas":["PF"],"Pacific/Midway":["UM"],"Pacific/Nauru":["NR"],"Pacific/Niue":["NU"],"Pacific/Norfolk":["NF"],"Pacific/Noumea":["NC"],"Pacific/Pago_Pago":["AS","UM"],"Pacific/Palau":["PW"],"Pacific/Pitcairn":["PN"],"Pacific/Pohnpei":["FM"],"Pacific/Port_Moresby":["PG","AQ"],"Pacific/Rarotonga":["CK"],"Pacific/Saipan":["MP"],"Pacific/Samoa":["WS"],"Pacific/Tahiti":["PF"],"Pacific/Tarawa":["KI"],"Pacific/Tongatapu":["TO"],"Pacific/Wake":["UM"],"Pacific/Wallis":["WF"],Singapore:["SG"],"US/Arizona":["US"],"US/Hawaii":["US"],"US/Samoa":["WS"]}[e][0].toUpperCase()};return"America/Los_Angeles"===e&&(r.regionCode="US-CA"),"Europe/Zurich"===e&&(r.regionCode="CH-ZH"),r}},503(e,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.default={localhost:{ipv4:["127.0.0.0/8"],ipv6:["::1/128"]},private:{ipv4:["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16"],ipv6:["fe80::/10","fc00::/7"]},reserved:{ipv4:["0.0.0.0/8","100.64.0.0/10","169.254.0.0/16","192.0.0.0/24","192.0.2.0/24","192.88.99.0/24","198.18.0.0/15","198.51.100.0/24","203.0.113.0/24","224.0.0.0/4","240.0.0.0/4","255.255.255.255/32"],ipv6:["::/128","64:ff9b::/96","100::/64","2001::/32","2001:10::/28","2001:20::/28","2001:db8::/32","2002::/16","ff00::/8"]}}},544(){const e=pmw.prepareSelectors([".add_to_cart_button:not(.product_type_variable)",".ajax_add_to_cart",".single_add_to_cart_button"],"addToCart");jQuery(e).on("click adding_to_cart",(e,r)=>{try{let r=e?.target?.dataset?.quantity?e.target.dataset.quantity:null,t=e?.target?.dataset?.product_id?e.target.dataset.product_id:e?.target?.value?e.target.value:null;if("product"===pmwDataLayer.shop.page_type){if(void 0!==jQuery(e.currentTarget).attr("href")&&jQuery(e.currentTarget).attr("href").includes("add-to-cart"))return t||(t=jQuery(e.currentTarget).data("product_id")),void pmw.addProductToCart(t,1);if("simple"===pmwDataLayer.shop.product_type)return null===r&&(r=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),t||(t=jQuery(e.currentTarget).val()),t||(t=jQuery(".product").attr("id").replace("product-","")),void pmw.addProductToCart(t,r);if(["variable","variable-subscription"].indexOf(pmwDataLayer.shop.product_type)>=0)return null===r&&(r=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),t||(t=jQuery("[name='variation_id']").val()),void pmw.addProductToCart(t,r);if("grouped"===pmwDataLayer.shop.product_type)return void jQuery(".woocommerce-grouped-product-list-item").each((e,a)=>{r=Number(jQuery(a).find(".input-text.qty").val())?Number(jQuery(a).find(".input-text.qty").val()):1;let i=jQuery(a).attr("class");t=pmw.getPostIdFromString(i),pmw.addProductToCart(t,r)});if("bundle"===pmwDataLayer.shop.product_type)return null===r&&(r=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),t||(t=jQuery("input[name=add-to-cart]").val()),void pmw.addProductToCart(t,r);null===r&&(r=Number(jQuery(".input-text.qty").val())?Number(jQuery(".input-text.qty").val()):1),pmw.addProductToCart(t,r)}else null===r&&(r=1),t||(t=jQuery(e.currentTarget).data("product_id")?jQuery(e.currentTarget).data("product_id"):null),t||(t=jQuery(e.currentTarget).val()?jQuery(e.currentTarget).val():null),t&&r&&pmw.addProductToCart(t,r)}catch(e){console.error(e)}}),jQuery("a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)").one("click",e=>{try{if(jQuery(e.target).closest("a").attr("href")){let r=new URL(jQuery(e.currentTarget).attr("href"),window.location.origin);if(r.searchParams.has("add-to-cart")){let e=r.searchParams.get("add-to-cart"),t=r.searchParams.has("quantity")?parseInt(r.searchParams.get("quantity"),10):1;pmw.addProductToCart(e,t)}}}catch(e){console.error(e)}}),jQuery(".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product").on("click",e=>{try{let r=jQuery(e.currentTarget).nextAll(".pmwProductId:first").data("id");if(r){if(r=pmw.getIdBasedOndVariationsOutputSetting(r),!r)throw Error("Wasn't able to retrieve a productId");if(pmwDataLayer.products&&pmwDataLayer.products[r]){let e=pmw.getProductDetailsFormattedForEvent(r);jQuery(document).trigger("pmw:select-item",e)}}}catch(e){console.error(e)}}),jQuery("#billing_email").on("input",e=>{pmw.isEmail(jQuery(e.currentTarget).val())&&(pmw.fireCheckoutProgress(2),pmw.emailSelected=!0)}),jQuery("form.checkout").on("checkout_place_order_success",()=>{!1===pmw.emailSelected&&pmw.fireCheckoutProgress(2),!1===pmw.paymentMethodSelected&&(pmw.fireCheckoutProgress(3),pmw.fireCheckoutOption(3,jQuery("input[name='payment_method']:checked").val())),pmw.fireCheckoutProgress(4),jQuery(document).trigger("pmw:place-order",{})}),jQuery(document).on("click","[name='update_cart']",()=>{try{jQuery(".cart_item").each((e,r)=>{const t=pmw.getProductIdByCartItemElement(r);if(!t)return void console.error("Pixel Manager: Wasn't able to retrieve a productId");const a=pmw.getProductQuantityByCartItemElement(r);a?0===a?pmw.removeProductFromCart(t):a<pmwDataLayer.cart[t].quantity?pmw.removeProductFromCart(t,pmwDataLayer.cart[t].quantity-a):a>pmwDataLayer.cart[t].quantity&&pmw.addProductToCart(t,a-pmwDataLayer.cart[t].quantity):console.error("Pixel Manager: Wasn't able to retrieve a quantity")})}catch(e){console.error(e),pmw.getCartItemsFromBackend()}}),jQuery(".add_to_wishlist,.wl-add-to").on("click",e=>{try{let r;if(jQuery(e.currentTarget).data("productid")?r=jQuery(e.currentTarget).data("productid"):jQuery(e.currentTarget).data("product-id")&&(r=jQuery(e.currentTarget).data("product-id")),!r)throw Error("Wasn't able to retrieve a productId");let t=pmw.getProductDetailsFormattedForEvent(r);jQuery(document).trigger("pmw:add-to-wishlist",t)}catch(e){console.error(e)}}),pmwDataLayer?.general?.lazy_load_pmw||pmw.registerShowVariationEventListener()},547(){!function(e){e.getLibraryVersion=()=>"1.57.0",e.checkLibraryVersion=()=>{e.getLibraryVersion()!==pmwDataLayer?.version?.number&&console.error(`Pixel Manager: The library version ${e.getLibraryVersion()} and pmwDataLayer.version.number ${pmwDataLayer.version.number} do not match. Delete the server-side cache and try again.`)}}(window.pmw=window.pmw||{},jQuery)},550(){!function(e){const r=["browser_only","server_only","both","browser_or_server"];e.pixelRegistry={getActivePixels(){const r=[];if(!e.pixelCapabilities)return r;for(const[t,a]of Object.entries(e.pixelCapabilities))if("function"==typeof a.isActive)try{a.isActive()&&r.push(t)}catch(r){e.console.error(`Error checking if ${t} is active:`,r)}return r},getActiveBrowserOnlyPixels(){const r=[],t=this.getActivePixels();for(const a of t)!0!==e.pixelCapabilities?.[a]?.supportsS2S&&r.push(a);return r},getActiveS2SPixels(){const r=[],t=this.getActivePixels();for(const a of t)!0===e.pixelCapabilities?.[a]?.supportsS2S&&r.push(a);return r},getS2SConfiguredPixels(){const r=[];if(!e.pixelCapabilities)return r;if(!0!==pmwDataLayer?.general?.server_2_server?.always_send_s2s)return r;for(const[t,a]of Object.entries(e.pixelCapabilities))if(!0===a.supportsS2S&&("function"!=typeof a.isActive||!a.isActive())&&"function"==typeof a.isConfigured)try{a.isConfigured()&&r.push(t)}catch(r){e.console.error(`Error checking if ${t} is configured:`,r)}return r},getProcessablePixels(){const e=this.getActivePixels(),r=this.getS2SConfiguredPixels(),t=new Set([...e,...r]);return Array.from(t)},getAdapter:r=>e.adapters&&e.adapters[r]||null,getPixelsWithCapability(r){const t=[],a=this.getActivePixels();for(const i of a)!0===e.pixelCapabilities?.[i]?.[r]&&t.push(i);return t},getFiringMode(t){const a=e.pixelCapabilities?.[t]?.mode;return a&&r.includes(a)?a:!0===e.pixelCapabilities?.[t]?.supportsS2S?"both":"browser_only"},getFiringDecision(r,t){const a=this.getFiringMode(r),i=!0===pmwDataLayer?.general?.server_2_server?.active,o=!0===e.pixelCapabilities?.[r]?.supportsS2S,n="function"==typeof e.pixelCapabilities?.[r]?.isActive&&e.pixelCapabilities[r].isActive(),s=!0===pmwDataLayer?.general?.server_2_server?.always_send_s2s;let c={fire_browser:!0,fire_server:!1};if(!n&&s&&o&&i)c={fire_browser:!1,fire_server:!0};else switch(a){case"browser_only":c={fire_browser:!0,fire_server:!1};break;case"server_only":c={fire_browser:!1,fire_server:i&&o};break;case"both":c={fire_browser:!0,fire_server:i&&o};break;case"browser_or_server":c=i&&o?{fire_browser:!1,fire_server:!0}:{fire_browser:!0,fire_server:!1}}return c=e.hooks.applyFilters("pmw_pixel_firing_decision",c,r,t,a),c},getPixelsForBrowserFiring(e){const r=[],t=this.getProcessablePixels();for(const a of t){this.getFiringDecision(a,e).fire_browser&&r.push(a)}return r},getPixelsForServerFiring(e){const r=[],t=this.getProcessablePixels();for(const a of t){this.getFiringDecision(a,e).fire_server&&r.push(a)}return r}}}(window.pmw=window.pmw||{},jQuery)},609(e,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.isIP=r.isIPv6=r.isIPv4=void 0;var t="(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])",a="("+t+"[.]){3}"+t,i=new RegExp("^"+a+"$"),o="(?:[0-9a-fA-F]{1,4})",n=new RegExp("^((?:"+o+":){7}(?:"+o+"|:)|(?:"+o+":){6}(?:"+a+"|:"+o+"|:)|(?:"+o+":){5}(?::"+a+"|(:"+o+"){1,2}|:)|(?:"+o+":){4}(?:(:"+o+"){0,1}:"+a+"|(:"+o+"){1,3}|:)|(?:"+o+":){3}(?:(:"+o+"){0,2}:"+a+"|(:"+o+"){1,4}|:)|(?:"+o+":){2}(?:(:"+o+"){0,3}:"+a+"|(:"+o+"){1,5}|:)|(?:"+o+":){1}(?:(:"+o+"){0,4}:"+a+"|(:"+o+"){1,6}|:)|(?::((?::"+o+"){0,5}:"+a+"|(?::"+o+"){1,7}|:)))(%[0-9a-zA-Z]{1,})?$");function s(e){return i.test(e)}function c(e){return n.test(e)}r.isIPv4=s,r.isIPv6=c,r.isIP=function(e){return s(e)?4:c(e)?6:0}},618(e,r,t){"use strict";var a=this&&this.__spreadArrays||function(){for(var e=0,r=0,t=arguments.length;r<t;r++)e+=arguments[r].length;var a=Array(e),i=0;for(r=0;r<t;r++)for(var o=arguments[r],n=0,s=o.length;n<s;n++,i++)a[i]=o[n];return a};Object.defineProperty(r,"__esModule",{value:!0}),r.isSpecial=r.isReserved=r.isLocalhost=r.isPrivate=r.createChecker=r.isInSubnet=void 0;var i=t(609),o=t(503);function n(e){if(!i.isIPv4(e))throw new Error("not a valid IPv4 address: "+e);var r=e.split(".");return(parseInt(r[0],10)<<24)+(parseInt(r[1],10)<<16)+(parseInt(r[2],10)<<8)+parseInt(r[3],10)>>>0}function s(e){if(Array.isArray(e)){var r=e.map(function(e){return c(e)});return function(e){var t=n(e);return r.some(function(e){return e(t)})}}var t=c(e);return function(e){var r=n(e);return t(r)}}function c(e){var r=e.split("/"),t=r[0],a=r[1],i=parseInt(a,10);if(!t||!Number.isInteger(i))throw new Error("not a valid IPv4 subnet: "+e);if(i<0||i>32)throw new Error("not a valid IPv4 prefix length: "+i+" (from "+e+")");var o=n(t);return function(e){return 0===i||o>>32-i===e>>32-i}}r.isInSubnet=function(e,r){return s(r)(e)},r.createChecker=s;var u={};r.isPrivate=function(e){return"private"in u==!1&&(u.private=s(o.default.private.ipv4)),u.private(e)},r.isLocalhost=function(e){return"localhost"in u==!1&&(u.localhost=s(o.default.localhost.ipv4)),u.localhost(e)},r.isReserved=function(e){return"reserved"in u==!1&&(u.reserved=s(o.default.reserved.ipv4)),u.reserved(e)},r.isSpecial=function(e){return"special"in u==!1&&(u.special=s(a(o.default.private.ipv4,o.default.localhost.ipv4,o.default.reserved.ipv4))),u.special(e)}},723(e,r,t){"use strict";t.r(r),t.d(r,{displayIP:()=>g,inRange:()=>l,isIP:()=>s,isRange:()=>d,isV4:()=>u,isV6:()=>p,searchIP:()=>m,storeIP:()=>m,version:()=>c});var a="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==t.g?t.g:"undefined"!=typeof self?self:{};function i(e,r){return e(r={exports:{}},r.exports),r.exports}var o=i(function(e){(function(){var r,t,a,i,o,n,s,c;t={},null!==e&&e.exports?e.exports=t:this.ipaddr=t,s=function(e,r,t,a){var i,o;if(e.length!==r.length)throw new Error("ipaddr: cannot match CIDR for objects with different lengths");for(i=0;a>0;){if((o=t-a)<0&&(o=0),e[i]>>o!==r[i]>>o)return!1;a-=t,i+=1}return!0},t.subnetMatch=function(e,r,t){var a,i,o,n,s;for(o in null==t&&(t="unicast"),r)for(!(n=r[o])[0]||n[0]instanceof Array||(n=[n]),a=0,i=n.length;a<i;a++)if(s=n[a],e.kind()===s[0].kind()&&e.match.apply(e,s))return o;return t},t.IPv4=function(){function e(e){var r,t,a;if(4!==e.length)throw new Error("ipaddr: ipv4 octet count should be 4");for(r=0,t=e.length;r<t;r++)if(!(0<=(a=e[r])&&a<=255))throw new Error("ipaddr: ipv4 octet should fit in 8 bits");this.octets=e}return e.prototype.kind=function(){return"ipv4"},e.prototype.toString=function(){return this.octets.join(".")},e.prototype.toNormalizedString=function(){return this.toString()},e.prototype.toByteArray=function(){return this.octets.slice(0)},e.prototype.match=function(e,r){var t;if(void 0===r&&(e=(t=e)[0],r=t[1]),"ipv4"!==e.kind())throw new Error("ipaddr: cannot match ipv4 address with non-ipv4 one");return s(this.octets,e.octets,8,r)},e.prototype.SpecialRanges={unspecified:[[new e([0,0,0,0]),8]],broadcast:[[new e([255,255,255,255]),32]],multicast:[[new e([224,0,0,0]),4]],linkLocal:[[new e([169,254,0,0]),16]],loopback:[[new e([127,0,0,0]),8]],carrierGradeNat:[[new e([100,64,0,0]),10]],private:[[new e([10,0,0,0]),8],[new e([172,16,0,0]),12],[new e([192,168,0,0]),16]],reserved:[[new e([192,0,0,0]),24],[new e([192,0,2,0]),24],[new e([192,88,99,0]),24],[new e([198,51,100,0]),24],[new e([203,0,113,0]),24],[new e([240,0,0,0]),4]]},e.prototype.range=function(){return t.subnetMatch(this,this.SpecialRanges)},e.prototype.toIPv4MappedAddress=function(){return t.IPv6.parse("::ffff:"+this.toString())},e.prototype.prefixLengthFromSubnetMask=function(){var e,r,t,a,i,o,n;for(n={0:8,128:7,192:6,224:5,240:4,248:3,252:2,254:1,255:0},e=0,i=!1,r=t=3;t>=0;r=t+=-1){if(!((a=this.octets[r])in n))return null;if(o=n[a],i&&0!==o)return null;8!==o&&(i=!0),e+=o}return 32-e},e}(),a="(0?\\d+|0x[a-f0-9]+)",i={fourOctet:new RegExp("^"+a+"\\."+a+"\\."+a+"\\."+a+"$","i"),longValue:new RegExp("^"+a+"$","i")},t.IPv4.parser=function(e){var r,t,a,o,n;if(t=function(e){return"0"===e[0]&&"x"!==e[1]?parseInt(e,8):parseInt(e)},r=e.match(i.fourOctet))return function(){var e,i,o,n;for(n=[],e=0,i=(o=r.slice(1,6)).length;e<i;e++)a=o[e],n.push(t(a));return n}();if(r=e.match(i.longValue)){if((n=t(r[1]))>4294967295||n<0)throw new Error("ipaddr: address outside defined range");return function(){var e,r;for(r=[],o=e=0;e<=24;o=e+=8)r.push(n>>o&255);return r}().reverse()}return null},t.IPv6=function(){function e(e,r){var t,a,i,o,n,s;if(16===e.length)for(this.parts=[],t=a=0;a<=14;t=a+=2)this.parts.push(e[t]<<8|e[t+1]);else{if(8!==e.length)throw new Error("ipaddr: ipv6 part count should be 8 or 16");this.parts=e}for(i=0,o=(s=this.parts).length;i<o;i++)if(!(0<=(n=s[i])&&n<=65535))throw new Error("ipaddr: ipv6 part should fit in 16 bits");r&&(this.zoneId=r)}return e.prototype.kind=function(){return"ipv6"},e.prototype.toString=function(){return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/,"::")},e.prototype.toRFC5952String=function(){var e,r,t,a,i;for(a=/((^|:)(0(:|$)){2,})/g,i=this.toNormalizedString(),e=0,r=-1;t=a.exec(i);)t[0].length>r&&(e=t.index,r=t[0].length);return r<0?i:i.substring(0,e)+"::"+i.substring(e+r)},e.prototype.toByteArray=function(){var e,r,t,a,i;for(e=[],r=0,t=(i=this.parts).length;r<t;r++)a=i[r],e.push(a>>8),e.push(255&a);return e},e.prototype.toNormalizedString=function(){var e,r,t;return e=function(){var e,t,a,i;for(i=[],e=0,t=(a=this.parts).length;e<t;e++)r=a[e],i.push(r.toString(16));return i}.call(this).join(":"),t="",this.zoneId&&(t="%"+this.zoneId),e+t},e.prototype.toFixedLengthString=function(){var e,r,t;return e=function(){var e,t,a,i;for(i=[],e=0,t=(a=this.parts).length;e<t;e++)r=a[e],i.push(r.toString(16).padStart(4,"0"));return i}.call(this).join(":"),t="",this.zoneId&&(t="%"+this.zoneId),e+t},e.prototype.match=function(e,r){var t;if(void 0===r&&(e=(t=e)[0],r=t[1]),"ipv6"!==e.kind())throw new Error("ipaddr: cannot match ipv6 address with non-ipv6 one");return s(this.parts,e.parts,16,r)},e.prototype.SpecialRanges={unspecified:[new e([0,0,0,0,0,0,0,0]),128],linkLocal:[new e([65152,0,0,0,0,0,0,0]),10],multicast:[new e([65280,0,0,0,0,0,0,0]),8],loopback:[new e([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new e([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new e([0,0,0,0,0,65535,0,0]),96],rfc6145:[new e([0,0,0,0,65535,0,0,0]),96],rfc6052:[new e([100,65435,0,0,0,0,0,0]),96],"6to4":[new e([8194,0,0,0,0,0,0,0]),16],teredo:[new e([8193,0,0,0,0,0,0,0]),32],reserved:[[new e([8193,3512,0,0,0,0,0,0]),32]]},e.prototype.range=function(){return t.subnetMatch(this,this.SpecialRanges)},e.prototype.isIPv4MappedAddress=function(){return"ipv4Mapped"===this.range()},e.prototype.toIPv4Address=function(){var e,r,a;if(!this.isIPv4MappedAddress())throw new Error("ipaddr: trying to convert a generic ipv6 address to ipv4");return e=(a=this.parts.slice(-2))[0],r=a[1],new t.IPv4([e>>8,255&e,r>>8,255&r])},e.prototype.prefixLengthFromSubnetMask=function(){var e,r,t,a,i,o,n;for(n={0:16,32768:15,49152:14,57344:13,61440:12,63488:11,64512:10,65024:9,65280:8,65408:7,65472:6,65504:5,65520:4,65528:3,65532:2,65534:1,65535:0},e=0,i=!1,r=t=7;t>=0;r=t+=-1){if(!((a=this.parts[r])in n))return null;if(o=n[a],i&&0!==o)return null;16!==o&&(i=!0),e+=o}return 128-e},e}(),o="(?:[0-9a-f]+::?)+",c="%[0-9a-z]{1,}",n={zoneIndex:new RegExp(c,"i"),native:new RegExp("^(::)?("+o+")?([0-9a-f]+)?(::)?("+c+")?$","i"),transitional:new RegExp("^((?:"+o+")|(?:::)(?:"+o+")?)"+a+"\\."+a+"\\."+a+"\\."+a+"("+c+")?$","i")},r=function(e,r){var t,a,i,o,s,c;if(e.indexOf("::")!==e.lastIndexOf("::"))return null;for((c=(e.match(n.zoneIndex)||[])[0])&&(c=c.substring(1),e=e.replace(/%.+$/,"")),t=0,a=-1;(a=e.indexOf(":",a+1))>=0;)t++;if("::"===e.substr(0,2)&&t--,"::"===e.substr(-2,2)&&t--,t>r)return null;for(s=r-t,o=":";s--;)o+="0:";return":"===(e=e.replace("::",o))[0]&&(e=e.slice(1)),":"===e[e.length-1]&&(e=e.slice(0,-1)),{parts:r=function(){var r,t,a,o;for(o=[],r=0,t=(a=e.split(":")).length;r<t;r++)i=a[r],o.push(parseInt(i,16));return o}(),zoneId:c}},t.IPv6.parser=function(e){var t,a,i,o,s,c,u;if(n.native.test(e))return r(e,8);if((o=e.match(n.transitional))&&(u=o[6]||"",(t=r(o[1].slice(0,-1)+u,6)).parts)){for(a=0,i=(c=[parseInt(o[2]),parseInt(o[3]),parseInt(o[4]),parseInt(o[5])]).length;a<i;a++)if(!(0<=(s=c[a])&&s<=255))return null;return t.parts.push(c[0]<<8|c[1]),t.parts.push(c[2]<<8|c[3]),{parts:t.parts,zoneId:t.zoneId}}return null},t.IPv4.isIPv4=t.IPv6.isIPv6=function(e){return null!==this.parser(e)},t.IPv4.isValid=function(e){try{return new this(this.parser(e)),!0}catch(e){return!1}},t.IPv4.isValidFourPartDecimal=function(e){return!(!t.IPv4.isValid(e)||!e.match(/^(0|[1-9]\d*)(\.(0|[1-9]\d*)){3}$/))},t.IPv6.isValid=function(e){var r;if("string"==typeof e&&-1===e.indexOf(":"))return!1;try{return new this((r=this.parser(e)).parts,r.zoneId),!0}catch(e){return!1}},t.IPv4.parse=function(e){var r;if(null===(r=this.parser(e)))throw new Error("ipaddr: string is not formatted like ip address");return new this(r)},t.IPv6.parse=function(e){var r;if(null===(r=this.parser(e)).parts)throw new Error("ipaddr: string is not formatted like ip address");return new this(r.parts,r.zoneId)},t.IPv4.parseCIDR=function(e){var r,t,a;if((t=e.match(/^(.+)\/(\d+)$/))&&(r=parseInt(t[2]))>=0&&r<=32)return a=[this.parse(t[1]),r],Object.defineProperty(a,"toString",{value:function(){return this.join("/")}}),a;throw new Error("ipaddr: string is not formatted like an IPv4 CIDR range")},t.IPv4.subnetMaskFromPrefixLength=function(e){var r,t,a;if((e=parseInt(e))<0||e>32)throw new Error("ipaddr: invalid IPv4 prefix length");for(a=[0,0,0,0],t=0,r=Math.floor(e/8);t<r;)a[t]=255,t++;return r<4&&(a[r]=Math.pow(2,e%8)-1<<8-e%8),new this(a)},t.IPv4.broadcastAddressFromCIDR=function(e){var r,t,a,i,o;try{for(a=(r=this.parseCIDR(e))[0].toByteArray(),o=this.subnetMaskFromPrefixLength(r[1]).toByteArray(),i=[],t=0;t<4;)i.push(parseInt(a[t],10)|255^parseInt(o[t],10)),t++;return new this(i)}catch(e){throw new Error("ipaddr: the address does not have IPv4 CIDR format")}},t.IPv4.networkAddressFromCIDR=function(e){var r,t,a,i,o;try{for(a=(r=this.parseCIDR(e))[0].toByteArray(),o=this.subnetMaskFromPrefixLength(r[1]).toByteArray(),i=[],t=0;t<4;)i.push(parseInt(a[t],10)&parseInt(o[t],10)),t++;return new this(i)}catch(e){throw new Error("ipaddr: the address does not have IPv4 CIDR format")}},t.IPv6.parseCIDR=function(e){var r,t,a;if((t=e.match(/^(.+)\/(\d+)$/))&&(r=parseInt(t[2]))>=0&&r<=128)return a=[this.parse(t[1]),r],Object.defineProperty(a,"toString",{value:function(){return this.join("/")}}),a;throw new Error("ipaddr: string is not formatted like an IPv6 CIDR range")},t.isValid=function(e){return t.IPv6.isValid(e)||t.IPv4.isValid(e)},t.parse=function(e){if(t.IPv6.isValid(e))return t.IPv6.parse(e);if(t.IPv4.isValid(e))return t.IPv4.parse(e);throw new Error("ipaddr: the address has neither IPv6 nor IPv4 format")},t.parseCIDR=function(e){try{return t.IPv6.parseCIDR(e)}catch(r){try{return t.IPv4.parseCIDR(e)}catch(e){throw new Error("ipaddr: the address has neither IPv6 nor IPv4 CIDR format")}}},t.fromByteArray=function(e){var r;if(4===(r=e.length))return new t.IPv4(e);if(16===r)return new t.IPv6(e);throw new Error("ipaddr: the binary input is neither an IPv6 nor IPv4 address")},t.process=function(e){var r;return"ipv6"===(r=this.parse(e)).kind()&&r.isIPv4MappedAddress()?r.toIPv4Address():r}}).call(a)}),n=i(function(e,r){const t=function(e){if(!i(e))throw new Error("Invalid address: "+e);const r=(e=e.toLowerCase()).split(/\:\:/g);if(r.length>2)throw new Error("Invalid address: "+e);let t=[];if(1==r.length){if(t=e.split(/\:/g),8!==t.length)throw new Error("Invalid address: "+e)}else if(2==r.length){const e=r[0],a=r[1],i=e.split(/\:/g),o=a.split(/\:/g);for(let e in i)t[e]=i[e];for(let e=o.length;e>0;--e)t[7-(o.length-e)]=o[e-1]}for(let e=0;e<8;++e)void 0===t[e]&&(t[e]="0000"),t[e]=o(t[e],"0",4);return t.join(":")},a=function(e){if(!i(e))throw new Error("Invalid address: "+e);const r=(e=(e=(e=(e=(e=(e=t(e)).replace(/0000/g,"g")).replace(/\:000/g,":")).replace(/\:00/g,":")).replace(/\:0/g,":")).replace(/g/g,"0")).split(/\:/g);let a=!1,o=-1,n=0,s=-1,c=0;for(let e=0;e<8;++e){const t=r[e];let i="0"===t;i&&!a&&(s=e),!i&&a&&(c=e-s),c>1&&c>n&&(o=s,n=c),a="0"===t}return a&&(c=8-s),c>1&&c>n&&(o=s,n=c),o>=0&&n>1&&r.splice(o,n,"g"),e=(e=(e=(e=(e=r.join(":")).replace(/\:g\:/g,"::")).replace(/\:g/g,"::")).replace(/g\:/g,"::")).replace(/g/g,"::")},i=function(e){return/^[a-f0-9\\:]+$/gi.test(e)},o=function(e,r,t){const a=r.repeat(t);return e.length<a.length&&(e=a.substring(0,a.length-e.length)+e),e},n=function(e){return parseInt(e,16).toString(2)},s=function(e){return parseInt(e,2).toString(16)},c=function(e){const r=t(e).split(":");let a="";for(const e of r)a+=o(n(e),"0",16);return a},u=function(e){const r=[];for(let t=0;t<8;++t){const a=e.substr(16*t,16),i=o(s(a),"0",4);r.push(i)}return r.join(":")},p=function(e,r,t,n,s){if(!i(e))throw new Error("Invalid address: "+e);if(n*=1,t=(t*=1)||128,(r*=1)<1||t<1||r>128||t>128||r>t)throw new Error("Invalid masks.");const p=[],d=c(e).substr(0,r),l="0".repeat(128-t),m=Math.pow(2,t-r);for(let e=0;e<m&&!(n&&e>=n);++e){const i=o(e.toString(2),"0",t-r),n=u(d+i+l);s?p.push(a(n)):p.push(n)}return p},d=function(e,r,t,o){if(!i(e))throw new Error("Invalid address: "+e);if(t=(t*=1)||128,(r*=1)<1||t<1||r>128||t>128||r>t)throw new Error("Invalid masks.");const n=c(e).substr(0,r),s="0".repeat(128-t),p=n+"0".repeat(t-r)+s,d=n+"1".repeat(t-r)+s;return o?{start:a(u(p)),end:a(u(d)),size:Math.pow(2,t-r)}:{start:u(p),end:u(d),size:Math.pow(2,t-r)}},l=function(e,r,t,o,n){if(!i(e))throw new Error("Invalid address: "+e);if(t=(t*=1)||128,o=(o*=1)||1,(r*=1)<1||t<1||r>128||t>128||r>t)throw new Error("Invalid masks.");const s=[],p=c(e).substr(0,r),d="0".repeat(128-t),l=Math.pow(2,t-r);for(let e=0;e<l&&e<o;++e){let e="";for(let a=0;a<t-r;++a)e+=Math.floor(2*Math.random());const i=u(p+e+d);n?s.push(a(i)):s.push(i)}return s},m=function(e,r){if(!i(e))throw new Error("Invalid address: "+e);if((r*=1)<1||r>128||Math.floor(r/4)!=r/4)throw new Error("Invalid masks.");return t(e).replace(/:/g,"").split("").reverse().slice(0,(128-r)/4).join(".")};r.normalize=t,r.abbreviate=a,r.divideSubnet=p,r.range=d,r.randomSubnet=l,r.ptr=m});n.normalize,n.abbreviate,n.divideSubnet,n.range,n.randomSubnet,n.ptr;function s(e){return o.isValid(e)}function c(e){try{var r=o.parse(e).kind();return"ipv4"===r?4:"ipv6"===r?6:0}catch(e){return 0}}function u(e){return 4===c(e)}function p(e){return 6===c(e)}function d(e){try{o.parseCIDR(e);return!0}catch(e){return!1}}function l(e,r){if("string"!=typeof r){if(r&&"object"==typeof r){for(var t in r)if(!0===l(e,r[t]))return!0;return!1}return!1}if(-1===r.indexOf("/"))return e=p(e)?n.normalize(e):e,s(r=p(r)?n.normalize(r):r)&&e===r;try{var a=r.split("/"),i=o.parse(e),c=o.parse(a[0]);return i.match(c,a[1])}catch(e){return!1}}function m(e){try{var r=o.parse(e),t=r.kind();return"ipv4"===t?e:"ipv6"===t?r.isIPv4MappedAddress()?r.toIPv4Address().toString():n.abbreviate(e):null}catch(e){return null}}function g(e){try{var r=o.parse(e),t=r.kind();return"ipv4"===t?e:"ipv6"===t?r.isIPv4MappedAddress()?r.toIPv4Address().toString():n.normalize(e):""}catch(e){return""}}},897(){!function(e){const r="restEndpointAvailable",t="pmw/v1/test/",a=0,i=10;e.emailSelected=!1,e.paymentMethodSelected=!1,e.isBelowRestErrorThreshold=()=>e.retrieveData(a)<=i,e.isRestEndpointAvailable=async()=>e.retrieveData(r)?e.retrieveData(r):await e.testEndpoint(),e.testEndpoint=async(a=e.root+t,i=r)=>{try{const r=await fetch(a,{method:"POST",mode:"cors",cache:"no-cache",keepalive:!0,redirect:"error"});if(!r.ok)return e.storeData(i,!1),e.console.error("Error testing the endpoint. Status: "+r.status+" | response: ",r),!1;const t=await r.json();return t.success?(e.storeData(i,!0),!0):(e.storeData(i,!1),e.console.error("Error testing the endpoint. Response JSON: "+JSON.stringify(t)),!1)}catch(r){return e.storeData(i,!1),e.console.error("Error testing the endpoint. Error: "+r),!1}},e.isPmwRestEndpointAvailable=(t=r)=>!!e.retrieveData(t),e.writeOrderIdToStorage=(r,t,a="thankyou_page")=>{let i=e.retrieveData("orderIds",!0)||[];i.push(r),e.storeData("orderIds",i,!0),"function"==typeof e.storeOrderIdOnServer&&e.storeOrderIdOnServer({orderId:r,orderKey:t,source:a})},e.isOrderIdStored=r=>{if(!pmwDataLayer.shop.order_duplication_prevention)return e.console.log("order duplication prevention is off"),!1;return(e.retrieveData("orderIds",!0)||[]).includes(r)},e.isEmail=e=>new RegExp('^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$').test(e),e.removeProductFromCart=async(r,t=null)=>{try{if(!r)throw Error("Wasn't able to retrieve a productId");if(!(r=e.getIdBasedOndVariationsOutputSetting(r)))throw Error("Wasn't able to retrieve a productId");let a;a=null==t?pmwDataLayer.cart[r].quantity:t,pmwDataLayer.cart[r]||await e.getProductsFromBackend([r]);let i=e.getProductDetailsFormattedForEvent(r,a);jQuery(document).trigger("pmw:remove-from-cart",i),null==t||pmwDataLayer.cart[r].quantity===t?delete pmwDataLayer.cart[r]:pmwDataLayer.cart[r].quantity=pmwDataLayer.cart[r].quantity-a,e.storeCartData(pmwDataLayer.cart)}catch(r){e.console.error("error: ",r)}},e.getIdBasedOndVariationsOutputSetting=e=>{try{return pmwDataLayer?.shop?.variations_output?e:pmwDataLayer.products[e].is_variation?pmwDataLayer.products[e].parent_id:e}catch(e){console.error(e)}},e.prepareSelectors=(e,r)=>(pmwDataLayer?.shop?.selectors?.[r]&&(e=e.concat(pmwDataLayer.shop.selectors[r]),(e=[...new Set(e)]).indexOf("document")>=0&&e.splice(e.indexOf("document"),1),e.indexOf("body")>=0&&(e=["body"])),e.join(", ")),e.addProductToCart=async(r,t)=>{t=Number(t);try{if(!r)throw Error("Wasn't able to retrieve a productId");if(!(r=e.getIdBasedOndVariationsOutputSetting(r)))throw Error("Wasn't able to retrieve a productId");pmwDataLayer?.products[r]||await e.getProductsFromBackend([r]);let a=e.getProductDetailsFormattedForEvent(r,t);jQuery(document).trigger("pmw:add-to-cart",a),pmwDataLayer?.cart[r]?pmwDataLayer.cart[r].quantity=pmwDataLayer.cart[r].quantity+t:("cart"in pmwDataLayer||(pmwDataLayer.cart={}),pmwDataLayer.cart[r]=e.getProductDetailsFormattedForEvent(r,t)),e.storeCartData(pmwDataLayer.cart)}catch(r){console.error(r),e.getCartItemsFromBackend()}},e.initCart=()=>{e.doesWooCommerceCartExist()||0===Object.keys(e.retrieveCartData()).length?e.retrieveCartData()?e.saveCartObjectToDataLayer(e.retrieveCartData()):(e.storeCartData({}),e.getCartItemsFromBackend()):e.storeCartData({})},e.getCartItemsFromBackend=()=>{try{fetch(e.ajax_url,{method:"POST",cache:"no-cache",body:new URLSearchParams({action:"pmw_get_cart_items"}),keepalive:!0,redirect:"error"}).then(e=>{if(e.ok)return e.json();throw Error("Error getting cart items from backend")}).then(r=>{if(!r.success)throw Error("Error getting cart items from backend");r.data.cart||(r.data.cart={}),e.saveCartObjectToDataLayer(r.data.cart),e.storeCartData(r.data.cart),r.data.cart_item_keys&&(pmwDataLayer.cart_item_keys=Object.assign(pmwDataLayer.cart_item_keys||{},r.data.cart_item_keys))})}catch(e){console.error(e)}},e.getProductsFromBackend=async r=>{if(pmwDataLayer?.products&&(r=r.filter(e=>!(e in pmwDataLayer.products))),r&&0!==r.length&&pmwDataLayer.general.page_id&&Array.isArray(r)&&0!==r.length){try{let t={action:"pmw_get_product_ids",page_id:pmwDataLayer.general.page_id,page_type:pmwDataLayer.shop.page_type,product_ids:r};const a=await e.isRestEndpointAvailable(),i=a?e.root+"pmw/v1/products/":e.ajax_url,o={method:"POST",cache:"no-cache",body:a?JSON.stringify(t):new URLSearchParams(t)};a&&(o.headers={"Content-Type":"application/json"});let n=await fetch(i,o);if(!n.ok)throw new Error("Error getting products from backend. Status: "+n.status+" Status text: "+n.statusText);let s=await n.json();if(!s.success)throw new Error("Error getting products from backend: "+s.data);pmwDataLayer.products=Object.assign({},pmwDataLayer.products,s.data)}catch(e){console.error(e)}return!0}},e.saveCartObjectToDataLayer=e=>{pmwDataLayer.cart=e,pmwDataLayer.products=Object.assign({},pmwDataLayer.products,e)},e.triggerViewItemEventPrep=async r=>{pmwDataLayer?.products[r]||await e.getProductsFromBackend([r]),pmwDataLayer?.products[r]?e.triggerViewItemEvent(r):(e.triggerViewItemEventNoProduct(),e.console.log(`Product with ID ${r} not found in the data layer and couldn't be retrieved from the backend. Triggering view-item event without product data.`))},e.triggerViewItemEvent=r=>{let t=e.getProductDetailsFormattedForEvent(r);t&&jQuery(document).trigger("pmw:view-item",t)},e.triggerViewItemEventNoProduct=()=>{jQuery(document).trigger("pmw:view-item")},e.fireCheckoutOption=(e,r=null,t=null)=>{let a={step:e,checkout_option:r,value:t};jQuery(document).trigger("pmw:checkout-option",a)},e.fireCheckoutProgress=e=>{let r={step:e};jQuery(document).trigger("pmw:checkout-progress",r)},e.getPostIdFromString=e=>{try{return e.match(/(post-)(\d+)/)[2]}catch(e){console.error(e)}},e.triggerViewItemList=r=>{if(!r)throw Error("Wasn't able to retrieve a productId");if(!(r=e.getIdBasedOndVariationsOutputSetting(r)))throw Error("Wasn't able to retrieve a productId");jQuery(document).trigger("pmw:view-item-list",e.getProductDataForViewItemEvent(r))},e.getProductDataForViewItemEvent=r=>{if(!r)throw Error("Wasn't able to retrieve a productId");try{if(pmwDataLayer.products[r])return e.getProductDetailsFormattedForEvent(r)}catch(e){console.error(e)}},e.getMainProductIdFromProductPage=()=>{try{return["simple","variable","grouped","composite","bundle"].indexOf(pmwDataLayer.shop.product_type)>=0&&jQuery(".pmwProductId:first").data("id")}catch(e){console.error(e)}},e.viewItemListTriggerTestMode=e=>{jQuery(e).css({position:"relative"}),jQuery(e).append('<div id="viewItemListTriggerOverlay"></div>'),jQuery(e).find("#viewItemListTriggerOverlay").css({"z-index":"10",display:"block",position:"absolute",height:"100%",top:"0",left:"0",right:"0",opacity:pmwDataLayer.shop.view_item_list_trigger.opacity,"background-color":pmwDataLayer.shop.view_item_list_trigger.background_color})},e.getSearchTermFromUrl=()=>{try{return new URLSearchParams(window.location.search).get("s")}catch(e){console.error(e)}};let o,n={};e.observerCallback=(r,t)=>{r.forEach(r=>{try{let a,i=jQuery(r.target).data("ioid");if(a=jQuery(r.target).next(".pmwProductId").length?jQuery(r.target).next(".pmwProductId").data("id"):jQuery(r.target).find(".pmwProductId").data("id"),!a)throw Error("pmwProductId element not found");r.isIntersecting?n[i]=setTimeout(()=>{e.triggerViewItemList(a),pmwDataLayer.shop.view_item_list_trigger.test_mode&&e.viewItemListTriggerTestMode(r.target),!1===pmwDataLayer.shop.view_item_list_trigger.repeat&&t.unobserve(r.target)},pmwDataLayer.shop.view_item_list_trigger.timeout):(clearTimeout(n[i]),pmwDataLayer.shop.view_item_list_trigger.test_mode&&jQuery(r.target).find("#viewItemListTriggerOverlay").remove())}catch(e){console.error(e)}})};let s=0;let c={nested:[],flat:[]};const u=e=>["product","type-product","product-item-inner",...c.nested].some(r=>jQuery(e).closest("."+r).length),p=e=>["wc-block-grid__product","product","product-small","woocommerce-LoopProduct-link",...c.flat].some(r=>jQuery(e).prev().hasClass(r)),d=()=>(c=(()=>{let e={nested:[],flat:[]};try{const r=(e,r)=>jQuery(e).parents().length===jQuery(r).parents().length,t=(e,r)=>jQuery(e).parent().is(jQuery(r).parent())?{node:jQuery(e).parent(),type:"flat"}:{node:jQuery(e).parents().has(jQuery(r).parents()).first(),type:"nested"},a=e=>jQuery(e).find(".pmwProductId").length,i=(e,r)=>e.filter(e=>r.includes(e))[0]||null,o=document.querySelectorAll(".pmwProductId");if(1===o.length)return e;for(let n=0;n<o.length-1;n++){if(!r(o[n],o[n+1])){n++;continue}let s=t(o[n],o[n+1]);if("nested"===s.type){let r=s.node.children().first().attr("class"),t=r?r.split(" "):[],a=s.node.children().first().next().attr("class");const o=i(t,a?a.split(" "):[]);e.nested.push(o)}else if("flat"===s.type){if(!s.node.children().first().attr("class"))continue;let r=s.node.children().first().attr("class").split(" ")[0];e.flat.push(r)}n=n+a(s.node)-1}return e.nested=[...new Set(e.nested)],e.flat=[...new Set(e.flat)],e}catch(r){return console.error(r),e}})(),jQuery(".pmwProductId").map(function(e,r){return u(r)?jQuery(r).parent():p(r)?jQuery(this).prev():jQuery(r).closest(".product").length?jQuery(r).closest(".product"):void 0}));e.startIntersectionObserverToWatch=()=>{try{e.urlHasParameter("vildemomode")&&(pmwDataLayer.shop.view_item_list_trigger.test_mode=!0),o=new IntersectionObserver(e.observerCallback,{root:null,threshold:pmwDataLayer.shop.view_item_list_trigger.threshold}),d().each((e,r)=>{jQuery(r[0]).data("ioid",s++),o.observe(r[0])})}catch(e){console.error(e)}},e.startProductsMutationObserverToWatch=()=>{try{let e=jQuery(".pmwProductId:eq(0)").parents().has(jQuery(".pmwProductId:eq(1)").parents()).first();e.length&&l.observe(e[0],{attributes:!0,childList:!0,characterData:!0})}catch(e){console.error(e)}};const l=new MutationObserver(e=>{e.forEach(e=>{let r=e.addedNodes;if(null!==r){jQuery(r).each((e,r)=>{(u(r)||p(r))&&m(r)&&(jQuery(r).data("ioid",s++),o.observe(r))})}})});let m=e=>!(!jQuery(e).find(".pmwProductId").length&&!jQuery(e).siblings(".pmwProductId").length);e.setCookie=(e,r="",t=null)=>{if(t){let a=new Date;a.setTime(a.getTime()+24*t*60*60*1e3);let i="expires="+a.toUTCString();document.cookie=e+"="+r+";"+i+";path=/"}else document.cookie=e+"="+r+";path=/"},e.getCookie=e=>{let r=e+"=",t=decodeURIComponent(document.cookie).split(";");for(let e=0;e<t.length;e++){let a=t[e];for(;" "==a.charAt(0);)a=a.substring(1);if(0==a.indexOf(r))return a.substring(r.length,a.length)}return""},e.getCookieThatContainsRegex=e=>{let r=document.cookie.split(";");for(let t=0;t<r.length;t++){let a=r[t].trim();if(e.test(a))return a}return!1},e.deleteCookie=r=>{e.setCookie(r,"",-1)},e.storeData=(r,t,a=!1,i=!1)=>{const o=i?r:"";let n=a?e.getPersistentData:e.getSessionData,s=a?e.setPersistentData:e.setSessionData,c=n(o);i?c=t:c[r]=t,s(c,o),a||!e.crossTabSync||e.crossTabSync.isSyncing()||e.crossTabSync.broadcastUpdate(r,t,i,o)},e.retrieveData=(r,t=!1,a=!1)=>{const i=a?r:"";let o=t?e.getPersistentData(i):e.getSessionData(i);return a?o:o[r]},e.deleteDataKey=(r,t=!1,a=!1)=>{const i=a?r:"";let o=t?e.getPersistentData:e.getSessionData,n=t?e.setPersistentData:e.setSessionData,s=o(i);if(a)try{t&&window.localStorage&&window.localStorage.removeItem(e.getPersistentDataKey(i)),!t&&window.sessionStorage&&window.sessionStorage.removeItem(e.getSessionDataKey(i))}catch(e){console.error(e)}else delete s[r],n(s,i)},e.storeCartData=r=>{e.storeData("cart",r,!1,!0)},e.retrieveCartData=()=>e.retrieveData("cart",!1,!0),e.getSessionDataKey=(e="")=>{const r="_pmw_session_data";return e?r+"_"+e:r},e.getPersistentDataKey=e=>{const r="_pmw_persistent_data";return e?r+"_"+e:r},e.getSessionData=(r="")=>{if(window.sessionStorage){let t=window.sessionStorage.getItem(e.getSessionDataKey(r));return null!==t?JSON.parse(t):{}}{let t=e.getCookie(e.getSessionDataKey(r));return""!==t?JSON.parse(t):{}}},e.setSessionData=(r,t="")=>{window.sessionStorage?window.sessionStorage.setItem(e.getSessionDataKey(t),JSON.stringify(r)):e.setCookie(e.getSessionDataKey(t),JSON.stringify(r))},e.getPersistentData=r=>{if(window.localStorage){let t=window.localStorage.getItem(e.getPersistentDataKey(r));return null!==t?JSON.parse(t):{}}{let t=e.getCookie(e.getPersistentDataKey(r));return""!==t?JSON.parse(t):{}}},e.setPersistentData=(r,t="")=>{window.localStorage?window.localStorage.setItem(e.getPersistentDataKey(t),JSON.stringify(r)):e.setCookie(e.getPersistentDataKey(t),JSON.stringify(r),400)},e.storeOrderIdOnServer=async r=>{try{let t;await e.isRestEndpointAvailable()?t=await fetch(e.root+"pmw/v1/pixels-fired/",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({order_id:r.orderId,order_key:r.orderKey,source:r.source}),keepalive:!0,cache:"no-cache",redirect:"error"}):(e.console.log("REST API not available, falling back to AJAX"),t=await fetch(e.ajax_url,{method:"POST",body:new URLSearchParams({action:"pmw_purchase_pixels_fired",order_id:r.orderId,order_key:r.orderKey,source:r.source}),keepalive:!0,redirect:"error"}));const a=await t.json();a.success?e.console.log("",a.data):e.console.error("",a.data)}catch(e){console.error(e)}},e.getProductIdByCartItemElement=r=>{const t=jQuery(r).find(".product-remove").find("a").attr("href");if(t)return e.getProductIdByCartItemKeyUrl(new URL(t));const a=jQuery(r).find("[data-product_id]").first().attr("data-product_id");return a||null},e.getProductQuantityByCartItemElement=e=>jQuery(e).find(".qty").val()||null,e.getProductIdByCartItemKeyUrl=e=>{let r,t=new URLSearchParams(e.search).get("remove_item");return r=0===pmwDataLayer.cart_item_keys[t].variation_id?pmwDataLayer.cart_item_keys[t].product_id:pmwDataLayer.cart_item_keys[t].variation_id,r},e.getAddToCartLinkProductIds=()=>jQuery("a").map(function(){let e=jQuery(this).attr("href");if(e&&e.includes("?add-to-cart=")){let r=e.match(/(add-to-cart=)(\d+)/);if(r)return r[2]}}).get(),e.getProductDetailsFormattedForEvent=(e,r=1)=>{if(!pmwDataLayer.products[e])return null;let t={id:e.toString(),dyn_r_ids:pmwDataLayer.products[e].dyn_r_ids,name:pmwDataLayer.products[e].name,list_name:pmwDataLayer.shop.list_name,brand:pmwDataLayer.products[e].brand,category:pmwDataLayer.products[e].category,variant:pmwDataLayer.products[e].variant,list_position:pmwDataLayer.products[e].position,quantity:r,price:pmwDataLayer.products[e].price,currency:pmwDataLayer.shop.currency,is_variable:pmwDataLayer.products[e].is_variable,is_variation:pmwDataLayer.products[e].is_variation,parent_id:pmwDataLayer.products[e].parent_id};return t.is_variation&&(t.parent_id_dyn_r_ids=pmwDataLayer.products[e].parent_id_dyn_r_ids),t},e.getClidFromBrowser=(r="gclid")=>{let t;if(t={gclid:"_gcl_aw",dclid:"_gcl_dc"},e.getCookie(t[r])){return e.getCookie(t[r]).match(/(GCL.[\d]*.)(.*)/)[2]}return""},e.getUserAgent=()=>navigator.userAgent,e.getViewPort=()=>({width:Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),height:Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)}),e.consoleLogVersion=()=>{console.log(pmwDataLayer.version)};const g=new Set;e.loadScriptAndCacheIt=(r,t)=>{if(g.has(r))return e.console.log("Script already loaded: "+r),Promise.resolve();const a=r=>new Promise((t,a)=>{if(document.querySelector(`script[src="${r}"]`))return g.add(r),e.console.log("Script tag already exists: "+r),void t();const i=document.createElement("script");i.src=r,i.async=!0,i.crossOrigin="anonymous",i.onload=()=>{g.add(r),e.console.log("Successfully loaded script: "+r),t()},i.onerror=()=>{i.remove(),a(new Error("Script failed to load: "+r))},document.head.appendChild(i)});return a(r).catch(()=>{if(t)return e.console.log("Primary script failed, loading fallback: "+t),a(t);throw new Error("Primary script failed to load, and no fallback URL provided.")}).catch(e=>{if(e.message.includes("fallback"))throw e;throw new Error("Both primary and fallback scripts failed to load.")})},e.getOrderItemPrice=e=>(e.total+e.total_tax)/e.quantity,e.hasLoginEventFired=()=>{let r=e.getSessionData();return r?.loginEventFired},e.setLoginEventFired=()=>{let r=e.getSessionData();r.loginEventFired=!0,e.setSessionData(r)},e.hasAccountCreatedEventFired=()=>{let r=e.getSessionData();return r?.accountCreatedEventFired},e.setAccountCreatedEventFired=()=>{let r=e.getSessionData();r.accountCreatedEventFired=!0,e.setSessionData(r)},e.pageLoaded=async()=>new Promise(e=>{!function r(){if("complete"===document.readyState)return e();setTimeout(r,50)}()}),e.pageReady=()=>new Promise(e=>{!function r(){if("interactive"===document.readyState||"complete"===document.readyState)return e();setTimeout(r,50)}()}),e.isMiniCartActive=()=>(window.sessionStorage&&Object.keys(window.sessionStorage).forEach(e=>{if(e.includes("wc_fragments"))return!0}),!1),e.doesWooCommerceCartExist=()=>document.cookie.includes("woocommerce_items_in_cart"),e.urlHasParameter=e=>new URLSearchParams(window.location.search).has(e),e.getUrlParameter=e=>new URLSearchParams(window.location.search).get(e),e.hashAsync=(e,r)=>crypto.subtle.digest(e,new TextEncoder("utf-8").encode(r)).then(e=>Array.prototype.map.call(new Uint8Array(e),e=>("00"+e.toString(16)).slice(-2)).join("")),e.getCartValue=()=>{let e=0;if(pmwDataLayer?.cart)for(const r in pmwDataLayer.cart){let t=pmwDataLayer.cart[r];e+=t.quantity*t.price}return e},e.doesUrlContainPatterns=e=>{for(const r of e)if(new RegExp(r).test(window.location.href))return!0;return!1},e.excludeDomainFromTracking=()=>{let e=["appspot.com","translate.google.com"];return pmwDataLayer?.general?.exclude_domains&&(e=[...e,...pmwDataLayer.general.exclude_domains]),!!e.some(e=>window.location.href.includes(e))&&(console.debug("Pixel Manager: Aborted due to excluded domain"),!0)},e.getRandomEventId=(e=16)=>{let r="";for(;r.length<e;)r+=(Math.random()+1).toString(36).substring(2);return r.substring(0,e)},e.pmwConsoleMessage=()=>{let r="Pixel Manager for WooCommerce: ";r+=pmwDataLayer.version.pro?"pro":"free",r+=" | distro: "+pmwDataLayer.version.distro,"fms"===pmwDataLayer.version.distro&&pmwDataLayer.version.pro&&(r+=" | active license: "+(pmwDataLayer.version.eligible_for_updates?"yes":"no")),r+=" | version: "+pmwDataLayer.version.number,!0===pmwDataLayer.version.show?console.log(r):e.console.log(r)},e.canLoadPremiumFeatures=()=>"fms"===pmwDataLayer.version.distro&&pmwDataLayer.version.pro&&pmwDataLayer.version.eligible_for_updates||"wcm"===pmwDataLayer.version.distro;let f=!1;e.triggerPmwDomReadyEvent=()=>{f||("complete"!==document.readyState?(jQuery(()=>{w()}),document.addEventListener("DOMContentLoaded",()=>{w()},!0)):w())};const w=()=>{f||(document.dispatchEvent(new Event("pmw:dom:ready")),f=!0)};e.getEmailFromTarget=r=>{if(r.href){let t=r.href.replace("mailto:","");if(t.indexOf("?")>-1&&(t=t.split("?")[0]),t=t.replace(/\s/g,""),t&&e.isEmail(t))return t}return""},e.sendEventPayloadToServer=r=>{"function"==typeof e.sendEventPayloadToServerPremium&&e.sendEventPayloadToServerPremium(r)},e.waitForPixelsAndTriggerPageView=async()=>e._pageViewTriggered?(e.console.log("Page view event already triggered, skipping duplicate."),Promise.resolve()):(e._pageViewTriggered=!0,new Promise(r=>{if(!pmwDataLayer?.pixels)return e.console.error("pmwDataLayer or pmwDataLayer.pixels is not defined, triggering page view event immediately."),document.dispatchEvent(new Event("pmw:page-view")),void r();let t=pmwDataLayer?.general?.server_2_server?.pageview_event_s2s?.pixels||[];if(t=t.filter(e=>pmwDataLayer.pixels[e]),0===t.length)return e.console.log("No specific pixels to wait for, triggering page view event."),document.dispatchEvent(new Event("pmw:page-view")),void r();const a=()=>{t.every(e=>!pmwDataLayer.pixels[e]||pmwDataLayer.pixels[e].loaded)?(document.dispatchEvent(new Event("pmw:page-view")),r()):setTimeout(a,100)};a()})),e.isWooCommerceActive=()=>!!pmwDataLayer.shop,e.getProductIdForSpecificPixel=(e,r)=>String(e.dyn_r_ids[pmwDataLayer.pixels[r].dynamic_remarketing.id_type]),e.isInWooCommerceSesssion=()=>{if(pmwDataLayer?.shop?.session_active)return!0;let r=new RegExp("woocommerce_cart_hash");return!!e.getCookieThatContainsRegex(r)},e.isNotInWooCommerceSesssion=()=>!e.isInWooCommerceSesssion(),e.makeFullUrl=e=>(e=e.trim(),/^(http:\/\/|https:\/\/)/.test(e)?e:"https://"+(e=e.replace(/^\/+/,""))),e.registerShowVariationEventListener=()=>{let r=null;jQuery(".single_variation_wrap").on("show_variation",(t,a)=>{try{if(!pmwDataLayer?.shop?.variations_output)return;let t=e.getIdBasedOndVariationsOutputSetting(a.variation_id);if(!t)throw Error("Wasn't able to retrieve a productId");r!==a.variation_id&&(e.triggerViewItemEventPrep(t),r=a.variation_id)}catch(e){console.error(e)}})},e.initializeCommandQueue=()=>{const r=window._pmwq=window._pmwq||[];r.forEach(function(r){if("function"==typeof r)try{r()}catch(r){e.console.error("Error executing queued command:",r)}}),r.push=function(r){if("function"==typeof r)try{r()}catch(r){e.console.error("Error executing command from queue:",r)}}}}(window.pmw=window.pmw||{},jQuery)}},o={};function n(e){var r=o[e];if(void 0!==r)return r.exports;var t=o[e]={exports:{}};return i[e].call(t.exports,t,t.exports,n),t.exports}n.m=i,r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,n.t=function(t,a){if(1&a&&(t=this(t)),8&a)return t;if("object"==typeof t&&t){if(4&a&&t.__esModule)return t;if(16&a&&"function"==typeof t.then)return t}var i=Object.create(null);n.r(i);var o={};e=e||[null,r({}),r([]),r(r)];for(var s=2&a&&t;("object"==typeof s||"function"==typeof s)&&!~e.indexOf(s);s=r(s))Object.getOwnPropertyNames(s).forEach(e=>o[e]=()=>t[e]);return o.default=()=>t,n.d(i,o),i},n.d=(e,r)=>{for(var t in r)n.o(r,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce((r,t)=>(n.f[t](e,r),r),[])),n.u=e=>({194:"wc-hooks",264:"deprecated-functions",526:"pixel-facebook",625:"consent-management",671:"pixel-google",712:"pixel-crazyegg",818:"pixel-hotjar",968:"consent-api",972:"doofinder-listener"}[e]+"."+{194:"c871cc71",264:"08bc16f9",526:"b4f040d6",625:"9d45b6cb",671:"2dcfb231",712:"badd0e8f",818:"c3ec2dc3",968:"c33d5439",972:"5dc21f92"}[e]+".chunk.min.js"),n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),t={},a="Pixel Manager for WooCommerce:",n.l=(e,r,i,o)=>{if(t[e])t[e].push(r);else{var s,c;if(void 0!==i)for(var u=document.getElementsByTagName("script"),p=0;p<u.length;p++){var d=u[p];if(d.getAttribute("src")==e||d.getAttribute("data-webpack")==a+i){s=d;break}}s||(c=!0,(s=document.createElement("script")).charset="utf-8",n.nc&&s.setAttribute("nonce",n.nc),s.setAttribute("data-webpack",a+i),s.src=e),t[e]=[r];var l=(r,a)=>{s.onerror=s.onload=null,clearTimeout(m);var i=t[e];if(delete t[e],s.parentNode&&s.parentNode.removeChild(s),i&&i.forEach(e=>e(a)),r)return r(a)},m=setTimeout(l.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=l.bind(null,s.onerror),s.onload=l.bind(null,s.onload),c&&document.head.appendChild(s)}},n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var r=n.g.document;if(!e&&r&&(r.currentScript&&"SCRIPT"===r.currentScript.tagName.toUpperCase()&&(e=r.currentScript.src),!e)){var t=r.getElementsByTagName("script");if(t.length)for(var a=t.length-1;a>-1&&(!e||!/^http(s?):/.test(e));)e=t[a--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/^blob:/,"").replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})(),(()=>{var e={792:0};n.f.j=(r,t)=>{var a=n.o(e,r)?e[r]:void 0;if(0!==a)if(a)t.push(a[2]);else{var i=new Promise((t,i)=>a=e[r]=[t,i]);t.push(a[2]=i);var o=n.p+n.u(r),s=new Error;n.l(o,t=>{if(n.o(e,r)&&(0!==(a=e[r])&&(e[r]=void 0),a)){var i=t&&("load"===t.type?"missing":t.type),o=t&&t.target&&t.target.src;s.message="Loading chunk "+r+" failed.\n("+i+": "+o+")",s.name="ChunkLoadError",s.type=i,s.request=o,a[1](s)}},"chunk-"+r,r)}};var r=(r,t)=>{var a,i,[o,s,c]=t,u=0;if(o.some(r=>0!==e[r])){for(a in s)n.o(s,a)&&(n.m[a]=s[a]);if(c)c(n)}for(r&&r(t);u<o.length;u++)i=o[u],n.o(e,i)&&e[i]&&e[i][0](),e[i]=0},t=self.webpackChunkPixel_Manager_for_WooCommerce=self.webpackChunkPixel_Manager_for_WooCommerce||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})();(async()=>{if(n(165),n(547),await pmw.jQueryExists(),await pmw.dataLayerFullyLoaded(),pmwDataLayer?.general?.chunk_base_path&&(n.p=pmwDataLayer.general.chunk_base_path),n(79),pmw.crossTabSync&&(pmw.crossTabSync.init(),window.addEventListener("beforeunload",()=>pmw.crossTabSync.cleanup())),n(208),n(550),n(341),pmw.initializeCommandQueue(),pmw.pmwConsoleMessage(),await pmw.loadConsentModule(),await pmw.consent.load(),jQuery(()=>{n(544)}),n(50),n.e(972).then(n.t.bind(n,652,23)),pmw.loadWcHooksFunctions(),pmw.excludeDomainFromTracking())return;const e=[];if(pmwDataLayer?.pixels?.google&&e.push(n.e(671).then(n.t.bind(n,62,23))),pmwDataLayer?.pixels?.facebook&&e.push(n.e(526).then(n.t.bind(n,767,23))),pmwDataLayer?.pixels?.hotjar&&e.push(n.e(818).then(n.t.bind(n,155,23))),pmwDataLayer?.pixels?.crazyegg&&e.push(n.e(712).then(n.t.bind(n,49,23))),await Promise.all(e),!1!==pmwDataLayer?.general?.modules?.load_deprecated_functions){const{loadDeprecatedFunctions:e}=await n.e(264).then(n.bind(n,483));e()}document.dispatchEvent(new Event("pmw:load-pixels")),document.dispatchEvent(new Event("pmwLoad")),await pmw.pageLoaded(),document.dispatchEvent(new Event("pmw:ready")),pmw.triggerPmwDomReadyEvent(),pmw.checkLibraryVersion()})()})();
    22//# sourceMappingURL=pmw-public.p1.min.js.map
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/js/public/free/pmw-public.p1.min.js.map

    r3451824 r3468312  
    1 {"version":3,"file":"pmw-public.p1.min.js","mappings":"+DACIA,EADAC,ECAAC,EACAC,E,QCAJ,MAAMC,EAA8BC,GAGnCA,GADAA,EAASA,EAAOC,QAAQ,aAAc,IAAIA,QAAQ,OAAQ,IAAIA,QAAQ,OAAQ,KAC9DC,OAUjBC,OAAO,6BAA6BC,GAAG,SAAU,mBAAqBC,IAEhEA,EAAMC,QAAQC,OACdF,EAAMC,QAAQE,IAEnBC,EAA4B,CAC3BC,KAAML,EAAMC,OAAOC,MACnBI,KAAMZ,EAA4BI,OAAO,cAAgBE,EAAMC,OAAOE,GAAK,MAAMG,YAKnFR,OAAO,KACN,GAAIA,OAAO,oBAAoBS,OAAQ,CAGtC,IAAIC,EAAwBV,OAAO,oBAAoBW,KAAK,YAG5D,GAAID,EAAsBD,OAAQ,CAEjC,IAAKC,EAAsBE,MAAO,OAClC,IAAKF,EAAsBG,KAAK,MAAO,OAEvCP,EAA4B,CAC3BC,KAAMG,EAAsBE,MAC5BJ,KAAMZ,EAA4BI,OAAO,cAAgBU,EAAsBG,KAAK,MAAQ,MAAML,SAEpG,CACD,IAID,MAAMF,EAA8BQ,IACnCd,OAAOe,UAAUC,QAAQ,wBAAyB,CAACF,kBAQpD,IAAIG,GAA4B,EAGhCjB,OAAO,6BAA6BC,GAAG,SAAU,+BAAkCC,IAE7EA,EAAMC,OAAOC,OACbF,EAAMC,OAAOE,KAElBa,EAA2B,CAC1BX,KAAML,EAAMC,OAAOC,MACnBI,KAAMZ,EAA4BI,OAAO,cAAgBE,EAAMC,OAAOE,GAAK,MAAMG,UAGlFS,GAA4B,KAI7BjB,OAAO,KAGN,GAAIiB,EAA2B,OAE/B,IAAIE,EAAuBnB,OAAO,wCAElC,GAAImB,EAAqBV,OAAQ,CAEhC,IAAKU,EAAqBP,MAAO,OACjC,IAAKO,EAAqBN,KAAK,MAAO,OAEtCK,EAA2B,CAC1BX,KAAMY,EAAqBP,MAC3BJ,KAAMZ,EAA4BI,OAAO,cAAgBmB,EAAqBN,KAAK,MAAQ,MAAML,SAEnG,IAID,MAAMU,EAA6BE,IAClCpB,OAAOe,UAAUC,QAAQ,uBAAwB,CAACI,iBAQnDpB,OAAOe,UAAUd,GAAG,QAAS,oCAAsCC,IAIlE,IAEC,IAAImB,EAAY,IAAIC,IAAItB,OAAOE,EAAMqB,eAAeV,KAAK,SACrDW,EAAYC,IAAIC,6BAA6BL,GAEjDI,IAAIE,sBAAsBH,EAE3B,CAAE,MAAOI,GACRC,QAAQC,MAAMF,EACf,IAoBD,MAAMG,EAA0BN,IAAIO,iBAXR,CAE3B,mBACA,wBACA,mBACA,2BACA,8BACA,qBACA,0BAG2E,iBAG5EhC,OAAOe,UAAUd,GAAG,sBAAuB8B,EAAyB,KACnE/B,OAAOe,UAAUC,QAAQ,wBAG1BhB,OAAOe,UAAUd,GAAG,sBAAuB,KAC1CD,OAAOe,UAAUC,QAAQ,mBAS1BhB,OAAOe,UAAUd,GAAG,UAAYC,IAC/BF,OAAOe,UAAUd,GAAG,0BAA2B,MAE1C,IAAUwB,IAAIQ,uBACjBR,IAAIS,qBAAqB,GAG1BT,IAAIU,mBAAmB,EAAGnC,OAAO,wCAAwCY,OACzEa,IAAIQ,uBAAwB,MAK9BjC,OAAOe,UAAUd,GAAG,UAAW,KAE9B,IACCwB,IAAIW,UACL,CAAE,MAAOR,GACRC,QAAQC,MAAMF,EACf,IAID5B,OAAOe,UAAUd,GAAG,UAAW,KAE9BoC,aAAaC,SAAWD,aAAaC,UAAY,CAAC,EAGlD,IAAIC,EAAad,IAAIe,6BAErBf,IAAIgB,uBAAuBF,KAQ5BvC,OAAOe,UAAUd,GAAG,UAAW,KAG9B,IAAKc,SAAS2B,SACb,OAID,GAAIjB,IAAIkB,aAAa,YACpB,OAGD,IACIC,EADmB,IAAItB,IAAIP,SAAS2B,UACLG,SAE/BD,IAAqBE,OAAOC,SAASC,MACxCvB,IAAIwB,UAAU,WAAYL,KAkB5B5C,OAAOe,UAAUd,GAAG,UAAW,KAE9B,IAAIiD,EAAQzB,IAAI0B,gBAAgB,SAC5BD,GAAOzB,IAAIwB,UAAU,QAASC,GAElC,IAAIE,EAAS3B,IAAI0B,gBAAgB,UAC7BC,GAAQ3B,IAAIwB,UAAU,SAAUG,GAEpC,IAAIC,EAAS5B,IAAI0B,gBAAgB,UAC7BE,GAAQ5B,IAAIwB,UAAU,SAAUI,GAGpC,IAAIC,EAAS7B,IAAI0B,gBAAgB,UAC7BG,IACHA,EAAS,QAAUC,KAAKC,MAAMC,KAAKC,MAAQ,KAAQ,IAAMJ,EACzD7B,IAAIwB,UAAU,SAAUK,IAGzB,IAAIK,EAASlC,IAAI0B,gBAAgB,UAC7BQ,GAAQlC,IAAIwB,UAAU,SAAUU,GAEpC,IAAIC,EAAOnC,IAAI0B,gBAAgB,SAC3BS,GAAMnC,IAAIwB,UAAU,OAAQW,GAEhC,IAAIC,EAAOpC,IAAI0B,gBAAgB,QAC3BU,GAAMpC,IAAIwB,UAAU,OAAQY,KAMjC7D,OAAOe,UAAUd,GAAG,UAAW,KAE9B,IACC,GAA2B,oBAAhBoC,eAAgCA,cAAcyB,WAAY,CAIpE,GAFA9D,OAAOe,UAAUC,QAAQ,mBAErBqB,cAAc0B,KACjB,GACC,YAAc1B,aAAa0B,KAAKC,WAChC,aAAe3B,aAAa0B,KAAKE,cACjCxC,IAAIyC,kCACH,CACD,IAAIC,EAAU1C,IAAI2C,+BAA+B3C,IAAIyC,mCACrDlE,OAAOe,UAAUC,QAAQ,gBAAiBmD,EAC3C,MAAO,GACN,YAAc9B,aAAa0B,KAAKC,WAChC,aAAe3B,aAAa0B,KAAKE,eAChC5B,cAAc0B,MAAMM,mBACrB5C,IAAIyC,kCACH,CAED,IAAIC,EAAU1C,IAAI2C,+BAA+B3C,IAAIyC,mCACrDlE,OAAOe,UAAUC,QAAQ,gBAAiBmD,EAC3C,KAAW,qBAAuB9B,aAAa0B,KAAKC,UACnDhE,OAAOe,UAAUC,QAAQ,qBACf,WAAaqB,aAAa0B,KAAKC,UACzChE,OAAOe,UAAUC,QAAQ,cACf,SAAWqB,aAAa0B,KAAKC,UACvChE,OAAOe,UAAUC,QAAQ,iBACf,wBAA0BqB,aAAa0B,KAAKC,UAClD3B,cAAciC,QAAU7C,IAAI8C,gBAAgBlC,aAAaiC,MAAMjE,MAClEL,OAAOe,UAAUC,QAAQ,gBACzBS,IAAI+C,sBAAsBnC,aAAaiC,MAAMjE,GAAIgC,aAAaiC,MAAMG,KACjC,mBAAxBhD,IAAIiD,iBAAgCjD,IAAIiD,mBAGpD1E,OAAOe,UAAUC,QAAQ,4BAG1BhB,OAAOe,UAAUC,QAAQ,uBAGtBqB,cAAcsC,MAAMtE,KAAOoB,IAAImD,uBAClC5E,OAAOe,UAAUC,QAAQ,aACzBS,IAAIoD,sBAGLxC,aAAayB,YAAa,CAC3B,CAED,CAAE,MAAOlC,GACRC,QAAQC,MAAMF,EACf,IASGS,cAAcyC,SAASC,eAC1BtD,IAAIuD,qCAiBLhF,OAAOe,UAAUd,GAAG,UAAW,KAC9B,GAAKoC,cAAcyC,SAASC,eACvB1C,cAAc0B,MAAMM,kBAEzB,IACC,MAAMY,EAAiBjF,OAAO,oBAC9B,IAAKiF,EAAexE,OAAQ,OAE5B,MAAMyE,EAAiB,CAAC,EAUxB,IATuBD,EAAetE,KAAK,UAAUwE,UAAUC,MAAMC,IACpE,MAAMjF,EAAQJ,OAAOqF,GAAQzE,MAC7B,QAAIR,IACH8E,EAAelF,OAAOqF,GAAQxE,KAAK,SAAWT,GACvC,KAKS,OAElB,MAAMkF,EAAoBL,EAAeM,KAAK,sBAC9C,IAAKD,EAAmB,OAExB,MAAME,EAAoBF,EAAkB3E,KAAK8E,GAChDC,OAAOC,QAAQT,GAAgBE,MAAM,EAAEX,EAAKrE,KAC3CqF,EAAUG,WAAWnB,KAASrE,IAI5BoF,GACH/D,IAAIoE,yBAAyBL,EAAkBM,aAEjD,CAAE,MAAOlE,GACRH,IAAII,QAAQC,MAAMF,EACnB,IAID5B,OAAOe,UAAUd,GAAG,UAAW8F,WACoB,IAA9CtE,IAAIkB,aAAa,0BAAoClB,IAAII,QAAQC,MAAM,mEAc5E9B,OAAOe,UAAUd,GAAG,gBAAiB8F,UAEpCtE,IAAII,QAAQmE,IAAI,4BAA6B,CAAC9F,UAG9C,MAAM+F,QAAgBxE,IAAIyE,aAAa,YAAa,CAAC,GAGrD,GAAI7D,cAAcyC,SAASqB,iBAAiBC,oBAAoBC,UAAW,CAC1E,MAAMC,EAAoB7E,IAAI8E,cAAcC,wBAAwB,uBAEpE,GAAIF,EAAkB7F,OAAS,EAAG,CAEjC,MAAMgG,EAAU,CAACvG,MAAO,aAExB,IAAK,MAAMwG,KAAaJ,EACnBL,EAAQU,OAAOD,KAClBD,EAAQC,GAAaT,EAAQU,OAAOD,IAIlChB,OAAOkB,KAAKH,GAAShG,OAAS,GACjCgB,IAAIoF,yBAAyBJ,EAE/B,CACD,IAQDzG,OAAOe,UAAUd,GAAG,kBAAmB8F,MAAO7F,EAAOiE,KAEpD1C,IAAII,QAAQmE,IAAI,8BAA+B,CAAC9F,QAAOiE,kBAGjD1C,IAAIyE,aAAa,cAAe,CACrC/B,QAASA,MAQXnE,OAAOe,UAAUd,GAAG,uBAAwB8F,MAAO7F,EAAOiE,KAEzD1C,IAAII,QAAQmE,IAAI,mCAAoC,CAAC9F,QAAOiE,kBAGtD1C,IAAIyE,aAAa,mBAAoB,CAC1C/B,QAASA,MAQXnE,OAAOe,UAAUd,GAAG,kBAAmB8F,MAAO7F,EAAOiE,KAEpD1C,IAAII,QAAQmE,IAAI,8BAA+B,CAAC9F,QAAOiE,kBAGjD1C,IAAIyE,aAAa,cAAe,CACrC/B,QAASA,MAOXnE,OAAOe,UAAUd,GAAG,gBAAkBC,IAErCuB,IAAII,QAAQmE,IAAI,4BAA6B,CAAC9F,UAK9CuB,IAAIyE,aAAa,YAAa,CAAC,KAMhClG,OAAOe,UAAUd,GAAG,qBAAuBC,IAE1CuB,IAAII,QAAQmE,IAAI,iCAAkC,CAAC9F,UAKnDuB,IAAIyE,aAAa,iBAAkB,CAAC,KAMrClG,OAAOe,UAAUd,GAAG,uBAAyBC,IAE5CuB,IAAII,QAAQmE,IAAI,mCAAoC,CAAC9F,UAKrDuB,IAAIyE,aAAa,mBAAoB,CAAC,KASvClG,OAAOe,UAAUd,GAAG,sBAAuB8F,MAAO7F,EAAOiE,KAExD1C,IAAII,QAAQmE,IAAI,kCAAmC,CAAC9F,QAAOiE,kBAGrD1C,IAAIyE,aAAa,kBAAmB,CACzC/B,QAASA,MAOXnE,OAAOe,UAAUd,GAAG,gBAAiB,CAACC,EAAOiE,EAAU,QAEtD1C,IAAII,QAAQmE,IAAI,4BAA6B,CAAC9F,QAAOiE,YAKrD1C,IAAIyE,aAAa,YAAa,CAC7B/B,QAASA,MAUXnE,OAAOe,UAAUd,GAAG,oBAAqB8F,MAAO7F,EAAOiE,EAAU,QAEhE1C,IAAII,QAAQmE,IAAI,gCAAiC,CAAC9F,QAAOiE,kBAGnD1C,IAAIyE,aAAa,gBAAiB,CACvC/B,QAASA,MAOXnE,OAAOe,UAAUd,GAAG,aAAeC,IAElCuB,IAAII,QAAQmE,IAAI,yBAA0B,CAAC9F,UAK3CuB,IAAIyE,aAAa,SAAU,CAAC,KAS7BlG,OAAOe,UAAUd,GAAG,kBAAmB8F,UAEtCtE,IAAII,QAAQmE,IAAI,8BAA+B,CAAC9F,gBAG1CuB,IAAIyE,aAAa,cAAe,CAAC,KAMxClG,OAAOe,UAAUd,GAAG,eAAgB8F,UAEnCtE,IAAII,QAAQmE,IAAI,2BAA4B,CAAC9F,gBAGvCuB,IAAIyE,aAAa,WAAY,CAClC5B,MAAOjC,aAAaiC,UAUtBtE,OAAOe,UAAUd,GAAG,YAAa8F,UAEhCtE,IAAII,QAAQmE,IAAI,+BAGVvE,IAAIyE,aAAa,QAAS,CAAC,KAMlClG,OAAOe,UAAUd,GAAG,YAAa8F,UAG3BtE,IAAIqF,wBASTrF,IAAIsF,mCAGJtF,IAAIuF,0CAGLhH,OAAOe,UAAUd,GAAG,kBAAmB,KACtCwB,IAAIwF,mC,YCtmBLC,EAAQ,KAMRpE,OAAOrB,IAAI0F,kBAAoBpB,UAC9B,MAAMqB,QAAsB,6BAC5BtE,OAAOrB,IAAI4F,QAAUD,EAErB,MAAME,QAAkB,6BAKxB,OAJAxE,OAAOrB,IAAMqB,OAAOrB,KAAO,CAAC,EAC5BqB,OAAOrB,IAAI4F,QAAUvE,OAAOrB,IAAI4F,SAAW,CAAC,EAC5CvE,OAAOrB,IAAI4F,QAAQE,IAAMD,EAElBF,GAGRtE,OAAOrB,IAAMqB,OAAOrB,KAAO,CAAC,EAC5BqB,OAAOrB,IAAII,QAAUqF,EAAQ,IAE7BA,EAAQ,I,+DCnBD,MAAMlB,EAAM,CAACwB,KAAYC,KAE1BC,MAEkB,iBAAZF,EACV3F,QAAQmE,IAAI,kBAAmBwB,KAAYC,GACjCA,EAAQhH,OAClBoB,QAAQmE,IAAI,kBAAoBwB,KAAYC,GAE5C5F,QAAQmE,IAAI,kBAAoBwB,KAarB1F,EAAQ,CAAC0F,KAAYC,KAKV,iBAAZD,EACV3F,QAAQC,MAAM,kBAAmB0F,KAAYC,GACnCA,EAAQhH,OAClBoB,QAAQC,MAAM,kBAAoB0F,KAAYC,GAE9C5F,QAAQC,MAAM,kBAAoB0F,IAS9BE,EAAkB,KAEnBC,QAEAC,QAEAC,OAEKxF,cAAcyC,SAASgD,QAAQzB,YAQnCsB,EAAe,KAEhBlG,IAAIsG,gBAAgB,iBACvBtG,IAAIwB,UAAU,iBAAiB,GAGzBxB,IAAIsG,gBAAgB,iBAQtBH,EAAuB,IACrBnG,IAAIkB,aAAa,iBAQnBkF,EAAc,KAEfpG,IAAIsG,gBAAgB,gBACvBtG,IAAIwB,UAAU,iBAAiB,GAGzBxB,IAAIsG,gBAAgB,e,maC/F5B,IAAAC,EAAAd,EAAA,KACAe,EAAAf,EAAA,KAIMgB,EAAM,KACNC,EAAa,2DACbC,EAAQ,IACRC,EAAc,KA8CpB,SAASC,EAAgBC,GACvB,IAAKP,EAAKQ,OAAOD,GACf,MAAM,IAAIE,MAAM,6BAA6BF,GAG/C,GAAIL,EAAIQ,KAAKH,GACX,OAAOD,EA7CX,SAA0BC,GACxB,IAAMI,EAAUJ,EAAGK,MAAMT,GAEzB,IAAKQ,IAAYX,EAAKa,OAAOF,EAAQ,IACnC,MAAM,IAAIF,MAAM,8BAA8BF,GAIhD,IAAMO,EAASH,EAAQ,GAGjBI,EAFOJ,EAAQ,GAEFK,MAAMd,GAAKe,IAAI,SAAAC,GAAK,OAAAC,SAASD,EAAG,GAAZ,GAKvC,MAAO,GAAGJ,IAHSC,EAAM,IAAM,GAAKA,EAAM,IAAIK,SAAS,IAG5B,MAFRL,EAAM,IAAM,GAAKA,EAAM,IAAIK,SAAS,GAGzD,CA4B2BC,CAAiBd,IAIpC,IAAAe,EAA4Bf,EAAGS,MAAMX,GAApCkB,EAAWD,EAAA,GAAEE,EAAUF,EAAA,GAExBG,EAAeF,GAAeA,EAAYP,MAAMZ,IAAW,GAC3DsB,EAAcF,GAAcA,EAAWR,MAAMZ,IAAW,GACxDuB,EAAkB,IAAIC,MAAc,GAAKH,EAAYhJ,OAASiJ,EAAWjJ,SAE/E,OAAOgJ,EAAYI,OAAOF,EAAiBD,EAC7C,CAmBA,SAAgBI,EACdC,GAEA,GAAIH,MAAMI,QAAQD,GAAkB,CAClC,IAAME,EAASF,EAAgBd,IAAI,SAAAiB,GAAU,OAAAC,EAAqBD,EAArB,GAC7C,OAAO,SAAAE,GACL,IAAMC,EAAW/B,EAAgB8B,GACjC,OAAOH,EAAOK,KAAK,SAAAC,GAAS,OAAAA,EAAMF,EAAN,EAC9B,C,CAEF,IAAME,EAAQJ,EAAqBJ,GACnC,OAAO,SAAAK,GACL,IAAMC,EAAW/B,EAAgB8B,GACjC,OAAOG,EAAMF,EACf,CACF,CAGA,SAASF,EAAqBD,GACtB,IAAAZ,EAAsCY,EAAOlB,MAAM,KAAlDwB,EAAalB,EAAA,GAAEmB,EAAkBnB,EAAA,GAClCoB,EAAevB,SAASsB,EAAoB,IAElD,IAAKD,IAAkBG,OAAOC,UAAUF,GACtC,MAAM,IAAIjC,MAAM,iCAAiCyB,GAGnD,GAAIQ,EAAe,GAAKA,EAAe,IACrC,MAAM,IAAIjC,MAAM,mCAAmCiC,EAAY,UAAUR,EAAM,KAIjF,IAAMW,EAAiBvC,EAAgBkC,GAEvC,OAAO,SAAAM,GACL,IAAK,IAAIC,EAAI,EAAGA,EAAI,IAAKA,EAAG,CAC1B,IAAMC,EAAWzH,KAAK0H,IAAIP,EAAmB,GAAJK,EAAQ,IAEjD,GAAIC,GAAY,EACd,MAUF,IANIH,EAAeE,IAAM5B,SAAS0B,EAAeE,GAAI,KAAQ,IAAO,GAAKC,KAGrEF,EAAgBC,IAAM5B,SAAS2B,EAAgBC,GAAI,KAAQ,IAC5D,GAAKC,EAGN,OAAO,C,CAIX,OAAO,CACT,CACF,CA5GAE,EAAAA,kBAAA,SAAkC3C,GAChC,IAAMI,EAAUJ,EAAGK,MAAMT,GAEzB,IAAKQ,IAAYX,EAAKa,OAAOF,EAAQ,IACnC,MAAM,IAAIF,MAAM,8BAA8BF,GAGhD,OAAOI,EAAQ,EACjB,EAmCAuC,EAAAA,WAAA,SAA2Bd,EAAiBL,GAC1C,OAAOD,EAAcC,EAAdD,CAA+BM,EACxC,EAQAc,EAAAA,cAAApB,EA0DA,IAAMqB,EAAiE,GAGvED,EAAAA,UAAA,SAA0Bd,GAIxB,MAHI,YAAae,IAAqB,IACpCA,EAA0B,QAAIrB,EAAc7B,EAAAmD,QAAQC,QAAQC,OAEvDH,EAA0B,QAAEf,EACrC,EAGAc,EAAAA,YAAA,SAA4Bd,GAI1B,MAHI,cAAee,IAAqB,IACtCA,EAA4B,UAAIrB,EAAc7B,EAAAmD,QAAQG,UAAUD,OAE3DH,EAA4B,UAAEf,EACvC,EAGAc,EAAAA,oBAAA,SAAoCd,GAIlC,GAHI,WAAYe,IAAqB,IACnCA,EAAyB,OAAIrB,EAAc,kBAEzCqB,EAAyB,OAAEf,GAAU,CACvC,IAAMzB,EAAUyB,EAAQxB,MAAMT,GAC9B,OAAOqD,QAAQ7C,GAAWX,EAAKa,OAAOF,EAAQ,I,CAEhD,OAAO,CACT,EAGAuC,EAAAA,WAAA,SAA2Bd,GAIzB,MAHI,aAAce,IAAqB,IACrCA,EAA2B,SAAIrB,EAAc7B,EAAAmD,QAAQK,SAASH,OAEzDH,EAA2B,SAAEf,EACtC,EAMAc,EAAAA,UAAA,SAA0Bd,GAQxB,MAPI,YAAae,IAAqB,IACpCA,EAA0B,QAAIrB,EAAa4B,EACtCzD,EAAAmD,QAAQC,QAAQC,KAChBrD,EAAAmD,QAAQG,UAAUD,KAClBrD,EAAAmD,QAAQK,SAASH,QAGjBH,EAA0B,QAAEf,EACrC,C,cCvMC,SAAU3I,GAEVA,EAAIkK,aAAe5F,SAAY,IAAI6F,QAAQC,KAE1C,SAAUC,IACT,GAAsB,oBAAX9L,OAAwB,OAAO6L,IAC1CE,WAAWD,EAAe,IAC1B,CAHD,KAMDrK,EAAIuK,eAAiB,CAACC,EAASC,EAAU,IAAMC,EAAW,OAEzD,MAAMC,EAAY3I,KAAKC,MACvB,UAAkC,IAApBZ,OAAOmJ,MAEhBxI,KAAKC,MAAQ0I,EAAYF,IAI7BH,WAAW,OACRI,IAIL1K,EAAI4K,qBAAuBtG,UAQ1B,IAAIuG,EAAW,IAAIV,QAASC,KAC3B,SAAUU,IACT,GACyB,oBAAjBlK,mBAC4B,IAAzBA,aAAamK,QAEvB,OAAOX,IAERE,WAAWQ,EAAY,IACvB,CARD,KAYGE,EAAeV,WAAW,KAC7BlK,QAAQC,MAAM,yOAEZ,KAMH,OAJAwK,EAASI,KAAK,KACbC,aAAaF,KAGPH,GAGR7K,EAAImL,cAAgB7G,SAAY,IAAI6F,QAAQC,KAC3C,SAAUU,IAGT,GAAkB,oBAAPM,SAA0C,IAAbA,GAAGC,MAAuB,OAAOjB,IACzEE,WAAWQ,EAAY,GACvB,CALD,KAeD9K,EAAIsL,qBAAuBhH,gBAEpBtE,EAAImL,sBACJ,kCAGP,CA/EA,CA+EC9J,OAAOrB,IAAMqB,OAAOrB,KAAO,CAAC,EAAGzB,O,SC/ChC,SAAUyB,GAGVqB,OAAOrB,IAAMqB,OAAOrB,KAAO,CAAC,EAK5BA,EAAIqL,MAAQ,CACXE,QAAS,CAAC,EA0BVC,UAAW,SAAUC,EAAUC,EAAWC,EAAUC,EAAW,IACzDH,GAAgC,iBAAbA,EAKnBC,GAAkC,iBAAdA,EAKD,mBAAbC,GAKNE,KAAKN,QAAQE,KACjBI,KAAKN,QAAQE,GAAY,IAG1BI,KAAKN,QAAQE,GAAUK,KAAK,CAC3BJ,UAAWA,EACXC,SAAWA,EACXC,SAAWA,IAIZC,KAAKN,QAAQE,GAAUM,KAAK,CAACC,EAAGC,IAAMD,EAAEJ,SAAWK,EAAEL,UAErD5L,EAAII,QAAQmE,IAAI,iBAAiBkH,MAAaC,oBAA4BE,MAjBzE5L,EAAII,QAAQC,MAAM,0CALlBL,EAAII,QAAQC,MAAM,2CALlBL,EAAII,QAAQC,MAAM,0CA4BpB,EAaA6L,aAAc,SAAUT,EAAU9M,KAAUwN,GAC3C,IAAKN,KAAKN,QAAQE,IAA+C,IAAlCI,KAAKN,QAAQE,GAAUzM,OACrD,OAAOL,EAGR,IAAIyN,EAAgBzN,EAEpB,IAAK,MAAM0N,KAAUR,KAAKN,QAAQE,GACjC,IACC,MAAMa,EAASD,EAAOV,SAASS,KAAkBD,GAvFrD,YA0FQG,EACHF,EAAgBE,EAEhBtM,EAAII,QAAQmM,KAAK,UAAUF,EAAOX,gBAAgBD,+CAEpD,CAAE,MAAOtL,GACRH,EAAII,QAAQC,MAAM,mBAAmBgM,EAAOX,gBAAgBD,KAAatL,EAE1E,CAGD,OAAOiM,CACR,EAWAI,aAAc,SAAUf,EAAUC,GACjC,IAAKG,KAAKN,QAAQE,GACjB,OAGD,MAAMgB,EAAmBZ,KAAKN,QAAQE,GAAUzM,OAChD6M,KAAKN,QAAQE,GAAYI,KAAKN,QAAQE,GAAUY,OAAOK,GAAKA,EAAEhB,YAAcA,GAExEG,KAAKN,QAAQE,GAAUzM,OAASyN,GACnCzM,EAAII,QAAQmE,IAAI,mBAAmBkH,MAAaC,KAElD,EAOAiB,iBAAkB,SAAUlB,GACvBI,KAAKN,QAAQE,YACTI,KAAKN,QAAQE,GACpBzL,EAAII,QAAQmE,IAAI,4BAA4BkH,KAE9C,EASAmB,UAAW,SAAUnB,EAAUC,EAAY,MAC1C,SAAKG,KAAKN,QAAQE,IAA+C,IAAlCI,KAAKN,QAAQE,GAAUzM,WAIlD0M,GACIG,KAAKN,QAAQE,GAAU5C,KAAK6D,GAAKA,EAAEhB,YAAcA,GAI1D,EAQAmB,WAAY,SAAUpB,GACrB,OAAOI,KAAKN,QAAQE,IAAa,EAClC,GAIDzL,EAAIqL,MAAQrL,EAAIqL,KAEhB,CA3KA,CA2KChK,OAAOrB,IAAMqB,OAAOrB,KAAO,CAAC,EAAGzB,O,uOC3MjC,IAAAuO,EAAArH,EAAA,KAKSgE,EAAAA,KAAAqD,EAJT,IAAAC,EAAAtH,EAAA,KAIegE,EAAAA,KAAAsD,EAHf,IAAAxG,EAAAd,EAAA,KAEAuH,EAAAvH,EAAA,KAUA,SAAgBwH,EAAWtE,EAAiBL,GAC1C,OAAOD,EAAcC,EAAdD,CAA+BM,EACxC,CAOA,SAAgBN,EACdC,GAEA,IAAKH,MAAMI,QAAQD,GACjB,OAAOD,EAAc,CAACC,IAGxB,IAAM4E,EAAmB5E,EAAgB6E,OACvC,SAACC,EAAK3E,GACJ,IAAM3B,EAAK2B,EAAOlB,MAAM,KAAK,GAE7B,OADC6F,EAAI7G,EAAK8G,KAAKvG,IAAkBgF,KAAKrD,GAC/B2E,CACT,EACA,CAAE,EAAG,GAAI,EAAG,GAAI,EAAG,KAGrB,GAAmC,IAA/BF,EAAiB,GAAGlO,OACtB,MAAM,IAAIgI,MAAM,4CAA4CkG,EAAiB,IAG/E,IAAMI,EAASR,EAAKzE,cAAc6E,EAAiB,IAC7CK,EAASR,EAAK1E,cAAc6E,EAAiB,IAEnD,OAAO,SAAAvE,GACL,IAAKpC,EAAK8G,KAAK1E,GACb,MAAM,IAAI3B,MAAM,qCAAqC2B,GAIvD,OAAIpC,EAAKQ,OAAO4B,IAAYoE,EAAKS,oBAAoB7E,GAC5C4E,EAAO5E,IAAY2E,EAAOP,EAAKU,kBAAkB9E,IAGtDpC,EAAKQ,OAAO4B,GACP4E,EAAO5E,GAEP2E,EAAO3E,EAElB,CACF,CA1DS1E,OAAAA,eAAAA,EAAAA,OAAAA,CAAAyJ,YAAA,EAAAC,IAAA,kBAAAX,EAAAK,IAAI,IAAEpJ,OAAAA,eAAAA,EAAAA,SAAAA,CAAAyJ,YAAA,EAAAC,IAAA,kBAAAX,EAAA5F,MAAM,IAAEnD,OAAAA,eAAAA,EAAAA,SAAAA,CAAAyJ,YAAA,EAAAC,IAAA,kBAAAX,EAAAjG,MAAM,IAU7B0C,EAAAA,WAAAwD,EASAxD,EAAAA,cAAApB,EA0CAoB,EAAAA,UAAA,SAA0Bd,GACxB,OAAIpC,EAAKQ,OAAO4B,GACVoE,EAAKS,oBAAoB7E,GACpBmE,EAAKc,UAAUb,EAAKU,kBAAkB9E,IAExCoE,EAAKa,UAAUjF,GAEfmE,EAAKc,UAAUjF,EAE1B,EAGAc,EAAAA,YAAA,SAA4Bd,GAC1B,OAAIpC,EAAKQ,OAAO4B,GACVoE,EAAKS,oBAAoB7E,GACpBmE,EAAKe,YAAYd,EAAKU,kBAAkB9E,IAE1CoE,EAAKc,YAAYlF,GAEjBmE,EAAKe,YAAYlF,EAE5B,EAGAc,EAAAA,oBAAA,SAAoCd,GAClC,QAAIpC,EAAKQ,OAAO4B,IACPoE,EAAKS,oBAAoB7E,EAIpC,EAGAc,EAAAA,WAAA,SAA2Bd,GACzB,OAAIpC,EAAKQ,OAAO4B,GACVoE,EAAKS,oBAAoB7E,GACpBmE,EAAKgB,WAAWf,EAAKU,kBAAkB9E,IAEzCoE,EAAKe,WAAWnF,GAEhBmE,EAAKgB,WAAWnF,EAE3B,EAMAc,EAAAA,UAAA,SAA0Bd,GACxB,OAAIpC,EAAKQ,OAAO4B,GACVoE,EAAKS,oBAAoB7E,GACpBmE,EAAKiB,UAAUhB,EAAKU,kBAAkB9E,IAExCoE,EAAKgB,UAAUpF,GAEfmE,EAAKiB,UAAUpF,EAE1B,EAEac,EAAAA,MAAQwD,C,SChHpB,SAAUjN,GAWVA,EAAIgO,kBAAoB,WACvB,MAAMC,EAAajO,EAAI4F,SAASqI,YAAYN,OAAS,CACpDO,YAAa,EACbC,WAAa,EACbC,aAAa,EACbC,WAAa,GAGd,MAAO,CAENJ,WAAY,CACXC,WAAaD,EAAWC,WACxBC,UAAaF,EAAWE,UACxBC,YAAaH,EAAWG,YACxBC,UAAaJ,EAAWI,WAIzBC,mBAAoBtO,EAAI4F,SAAS2I,UAAUZ,OAAOa,mBAAoB,EAGtEC,cAAezO,EAAI4F,SAAS8I,gCAAiC,EAE/D,EAOA1O,EAAI2O,gBAAkB,WACrB,MAAO,CACNC,UAAY9M,KAAKC,MAAMC,KAAKC,MAAQ,KACpCrC,IAAYyB,OAAOC,SAASuN,KAC5B5N,SAAYjB,EAAIkB,aAAa,YAAclB,EAAI8O,YAAY9O,EAAIkB,aAAa,aAAe5B,SAAS2B,SACpG8N,WAAYC,UAAUC,UACtB1M,UAAY3B,cAAc0B,MAAMC,UAChC2M,QAAYtO,cAAcsC,MAAMtE,IAAIuQ,KAAO,KAG3CvJ,QAAS5F,EAAIgO,oBAEf,EAWAhO,EAAIyE,aAAeH,eAAgB8K,EAAWC,GAE7CrP,EAAII,QAAQmE,IAAI,qBAAqB6K,IAAaC,GAElD,IAEC,IAAI7K,EAAU,CACb/F,MAAY2Q,EACZE,WAAYD,EACZnK,OAAY,CAAC,EACbqK,QAAYvP,EAAI2O,mBAKjBnK,EAAUxE,EAAIqL,MAAMa,aAAa,wBAAyB1H,EAAS4K,GAGnE,MAAMI,EAAexP,EAAI8E,cAAc2K,kBAEvC,IAAK,MAAMxK,KAAauK,EAAc,CACrC,MAAME,EAAU1P,EAAI8E,cAAc6K,WAAW1K,GAE7C,GAAKyK,GAAoC,mBAAlBA,EAAQE,MAKhC,IAEC,IAAIC,QAAkBH,EAAQE,MAAMpL,EAAQ8K,WAAYF,EAAW5K,EAAQ+K,SAK3E,GAAkB,OAAdM,EACH,SAKDA,EAAY7P,EAAIqL,MAAMa,aACrB,kBAAkBjH,IAClB4K,EACAT,EACA5K,EAAQ8K,WACR9K,EAAQ+K,SAGT/K,EAAQU,OAAOD,GAAa4K,CAC7B,CAAE,MAAO1P,GACRH,EAAII,QAAQC,MAAM,2BAA2B4E,KAAc9E,EAC5D,MA5BEH,EAAII,QAAQmE,IAAI,+BAA+BU,IA6BjD,CAIAT,EAAUxE,EAAIqL,MAAMa,aACnB,qBAAqBkD,IACrB5K,EACAA,EAAQ8K,YAKT9K,EAAUxE,EAAIqL,MAAMa,aAAa,yBAA0B1H,EAAS4K,GAGpE5K,EAAQsL,OAAS,CAAC,EAClB,IAAK,MAAM7K,KAAahB,OAAOkB,KAAKX,EAAQU,QAC3CV,EAAQsL,OAAO7K,GAAajF,EAAI8E,cAAciL,kBAAkB9K,EAAWmK,GAM5E,aAFMpP,EAAIgQ,iBAAiBxL,GAEpBA,CAER,CAAE,MAAOrE,GAER,MADAH,EAAII,QAAQC,MAAM,0BAA0B+O,KAAcjP,GACpDA,CACP,CACD,EAYAH,EAAIgQ,iBAAmB1L,eAAgBE,GAEtC,MAAM4K,EAAY5K,EAAQ/F,MAa1B,GATAuB,EAAIiQ,qBAAqBzL,GAKzBxE,EAAIkQ,oBAAoB1L,GAIN,aAAd4K,GAMJ,GAAIxO,cAAcyC,SAASqB,iBAAiByL,OAAQ,CAEnD,MAAMnL,EAAUhF,EAAIoQ,eAAe5L,GAGnC,GAAIP,OAAOkB,KAAKH,GAAShG,OAAS,EAAG,CACpC,MAAMqR,EAAerQ,EAAI8E,cAAcwL,yBAAyBlB,GAChEpP,EAAII,QAAQmE,IAAI,0BAA0B6K,KAAciB,SAClDrQ,EAAIoF,yBAAyBJ,EACpC,CACD,OAfChF,EAAII,QAAQmE,IAAI,sFAgBlB,EAkBAvE,EAAIiQ,qBAAuB,SAAUzL,GAEpC,MAAMgL,EAAexP,EAAI8E,cAAc2K,kBAEvC,GAA4B,IAAxBD,EAAaxQ,OAChB,OAID,MAAMoQ,EAAY5K,EAAQ/F,MAAMJ,QAAQ,KAAM,KAE9C2B,EAAII,QAAQmE,IAAI,uCAAuC6K,IAAa,CACnEI,aAAeA,EACfe,aAAe/L,EAAQsL,SAKxBvR,OAAOe,UAAUC,QAAQ,aAAa6P,IAAa5K,EACpD,EAWAxE,EAAIwQ,wBAA0B,SAAUhM,GAEvC,MAAMiM,EAAgBzQ,EAAI8E,cAAc4L,6BAExC,GAA6B,IAAzBD,EAAczR,OACjB,OAGDgB,EAAII,QAAQmE,IAAI,uDAAuDC,EAAQ/F,SAAUgS,GAKzF,MAAME,EAAmBnM,EAAQ/F,MAAMJ,QAAQ,KAAM,KACrDE,OAAOe,UAAUC,QAAQ,eAAeoR,IAAoBnM,EAC7D,EAWAxE,EAAI4Q,oBAAsB,SAAUpM,GAEnC,MAAMqM,EAAY7Q,EAAI8E,cAAcgM,qBAEpC,GAAyB,IAArBD,EAAU7R,OACb,OAGDgB,EAAII,QAAQmE,IAAI,sDAAsDC,EAAQ/F,SAAUoS,GAKxF,MAAME,EAAevM,EAAQ/F,MAAMJ,QAAQ,KAAM,KACjDE,OAAOe,UAAUC,QAAQ,WAAWwR,IAAgBvM,EACrD,EAwBAxE,EAAIkQ,oBAAsB,SAAU1L,GAGnC,MAAMwM,EAAkBxM,EAAQ/F,MAAMJ,QAAQ,KAAM,KAIpDE,OAAOe,UAAUC,QAAQ,aAAayR,IAAmBxM,GAEzDxE,EAAII,QAAQmE,IAAI,sCAAsCyM,IAAmBxM,EAC1E,EAUAxE,EAAIoQ,eAAiB,SAAU5L,GAE9B,MAAMQ,EAAU,CACfvG,MAAO+F,EAAQ/F,OAIV4R,EAAerQ,EAAI8E,cAAcwL,yBAAyB9L,EAAQ/F,OAExE,IAAK,MAAMwG,KAAaoL,EACnB7L,EAAQU,OAAOD,KAClBD,EAAQC,GAAaT,EAAQU,OAAOD,IAStC,OAJIT,EAAQ8K,YAAY5M,UACvBsC,EAAQtC,QAAU8B,EAAQ8K,WAAW5M,SAG/BsC,CACR,EAkBAhF,EAAIiR,uBAAyB,SAAUzM,EAASS,GAC/C,OAAqD,IAA9CT,EAAQsL,SAAS7K,IAAYiM,YACrC,EASAlR,EAAImR,sBAAwB,SAAU3M,EAASS,GAC9C,OAAoD,IAA7CT,EAAQsL,SAAS7K,IAAYmM,WACrC,EAKKpR,EAAIqR,WACRrR,EAAIqR,SAAW,CAAC,GAoCjBrR,EAAIsR,gBAAkB,SAAUrM,EAAWyK,EAAS6B,EAAU,CAAC,GAC9D,IAAK7B,GAAoC,mBAAlBA,EAAQE,MAE9B,YADA5P,EAAII,QAAQC,MAAM,uBAAuB4E,kCAK1CjF,EAAIqR,SAASpM,GAAayK,EAGrB1P,EAAIwR,oBACRxR,EAAIwR,kBAAoB,CAAC,GAI1B,IAAIC,EAAc,eACdF,EAAQG,cACXD,EAAc,QAGfzR,EAAIwR,kBAAkBvM,GAAa,CAClC0M,KAA4BJ,EAAQI,MAAQF,EAC5CC,YAA4BH,EAAQG,cAAe,EACnDE,2BAA4BL,EAAQK,6BAA8B,EAClEC,SAA4BN,EAAQM,UAAY,KAIlD,CAEA,CA/bA,CA+bCxQ,OAAOrB,IAAMqB,OAAOrB,KAAO,CAAC,EAAGzB,O,cCvchC,SAAUyB,EAAK8R,EAAGC,GAElB,MAAM,QAACC,EAAO,KAAE3E,EAAI,KAAE4E,EAAI,KAAEC,EAAMnH,QAASoH,GAAgB1M,EAAQ,KAInE,IAAI2M,EAAqB,KACpBC,GAAsB,EAE3B,MAAMC,EAAa,CAClB,WAAc,CACb,IAAO,4CAMR,UAAgB,CACf,EAAO,6BACP,EAAO,6BACP,IAAO,yBAER,OAAgB,CACf,IAAO,wBAER,aAAgB,CACf,IAAO,gCAGR,MAAgB,CACf,EAAO,yBACP,EAAO,yBACP,IAAO,2BAIR,QAAgB,CACf,EAAO,sBACP,EAAO,sBACP,IAAO,sBAwCHC,EAAmBA,CAAC3S,EAAK4S,EAlBD,OAmB7B,MAAMC,EAAa,IAAIC,gBACjBC,EAAYrI,WAAW,IAAMmI,EAAWG,QAASJ,GAEvD,OAAOK,MAAMjT,EAAK,CAAEkT,OAAQL,EAAWK,SACrCC,QAAQ,IAAM7H,aAAayH,KAG9B3S,EAAIgT,WAAa,CAEhBC,WAAY3O,UAEX,MAAM4O,QAAiBX,EAAiB,4CAExC,IAAKW,EAASC,GAAI,MAAM,IAAInM,MAAM,oDAAoDkM,EAASE,UAE/F,IAAItP,QAAaoP,EAASnU,OAE1B,IAAK+E,EAAM,MAAM,IAAIkD,MAAM,wCAY3B,GARAlD,EAAOA,EACLxF,OACAiJ,MAAM,MACN4F,OAAO,CAACkG,EAAKC,KAEND,GADPC,EAAOA,EAAK/L,MAAM,MACF,IAAM+L,EAAK,GAAID,GAC7B,CAAC,IAEAvP,EAAKgD,KAAOhD,EAAKyP,IAAK,MAAM,IAAIvM,MAAM,8DAQ3C,GAAIwM,EAAc1P,EAAKyP,KAAM,MAAM,IAAIvM,MAAM,iFAE7C,MAAO,CACNF,GAAahD,EAAKgD,GAClB2M,YAAa3P,EAAKyP,IAClBG,QAAa,eAIfC,MAAOrP,UAEN,MAAM4O,QAAiBX,EAAiB,uCAExC,IAAKW,EAASC,GAAI,MAAM,IAAInM,MAAM,+CAA+CkM,EAASE,UAE1F,IAAItP,QAAaoP,EAASU,OAE1B,IAAK9P,EAAM,MAAM,IAAIkD,MAAM,wCAC3B,IAAKlD,EAAKgD,KAAOhD,EAAK+P,eAAiB/P,EAAKgQ,OAAQ,MAAM,IAAI9M,MAAM,2EAEpE,MAAO,CACNF,GAAahD,EAAKgD,GAClB2M,YAAa3P,EAAK+P,aAClBC,OAAahQ,EAAKgQ,OAClBJ,QAAa,UAIfK,OAAQzP,UAEP,MAAM4O,QAAiBX,EAAiB,0BAExC,IAAKW,EAASC,GAAI,MAAM,IAAInM,MAAM,4DAA4DkM,EAASE,UAEvG,IAAItP,QAAaoP,EAASU,OAE1B,IAAK9P,EAAM,MAAM,IAAIkD,MAAM,yCAC3B,IAAKlD,EAAKgD,KAAOhD,EAAKkQ,UAAYlQ,EAAKgQ,OAAQ,MAAM,IAAI9M,MAAM,uEAE/D,MAAO,CACNF,GAAahD,EAAKgD,GAClB2M,YAAa3P,EAAKkQ,QAClBF,OAAahQ,EAAKgQ,OAClBJ,QAAa,WAIfO,MAAO3P,UAEN,MAAM4O,QAAiBX,EAAiB,yBAExC,IAAKW,EAASC,GAAI,MAAM,IAAInM,MAAM,+CAA+CkM,EAASE,UAE1F,IAAItP,QAAaoP,EAASU,OAE1B,IAAK9P,EAAM,MAAM,IAAIkD,MAAM,wCAC3B,IAAKlD,EAAKgD,KAAOhD,EAAKkQ,UAAYlQ,EAAKgQ,OAAQ,MAAM,IAAI9M,MAAM,sEAE/D,MAAO,CACNF,GAAahD,EAAKgD,GAClB2M,YAAa3P,EAAKkQ,QAClBF,OAAahQ,EAAKgQ,OAClBJ,QAAa,WAmBhB,MAAMF,EAAiBC,IAEtB,GAAoB,QAAhBA,EAAuB,OAAO,EAIlC,MAFuB,CAAC,QAAS,SAEX5K,KAAKiL,GAC1BlT,cAAcyC,SAAS6Q,mBAAmBC,mBAAmBC,SAASN,KAUxE9T,EAAIqU,iBAAmB/P,UAGtB,GAA2C,OAAvCtE,EAAIkB,aAAa,mBAA8BlB,EAAIkB,aAAa,oBAAsB6Q,EACzF,QAASuC,KAAKC,MAAMvU,EAAIkB,aAAa,mBAItC,GAAIlB,EAAIwU,iBAEP,OADAxU,EAAIwB,UAAU,kBAAkB,IACzB,EAIR,GAAI2G,MAAMI,QAAQ3H,cAAcyC,SAASqB,iBAAiB+P,kBACtD7T,aAAayC,QAAQqB,gBAAgB+P,gBAAgBzV,OAAS,EAAG,CAEpE,MAAM8H,QAAW9G,EAAI0U,QAErB,GAAIC,EAAoB7N,GAEvB,OADA9G,EAAIwB,UAAU,kBAAkB,IACzB,CAET,CAIA,OADAxB,EAAIwB,UAAU,kBAAkB,IACzB,GASRxB,EAAI4U,iBAAoB9N,MAClBA,GAAoB,iBAAPA,OAGbuG,EAAKvG,KAIF9G,EAAI6U,sBAAsB/N,IASnC9G,EAAI6U,sBAAyB/N,IAC5B,IAAKA,EAAI,OAAO,EAGhB,MAiBMgO,EAAgB7C,EAAKnL,GAjBD,CACzB,aACA,gBACA,iBACA,cACA,iBACA,aAIyB,CACzB,UACA,WACA,YACA,UAMD,IACC,MAAMmG,EAAaxH,EAAQ,KAC3B,IAAK,MAAMsP,KAASD,EACnB,GAAI7H,EAAWA,WAAWnG,EAAIiO,GAC7B,OAAO,CAGV,CAAE,MAAO5U,GAGR,GAAI8R,EAAKnL,GAAK,CACb,GAAIA,EAAGkO,WAAW,QACjBlO,EAAGkO,WAAW,aACdlO,EAAGkO,WAAW,SACdlO,EAAGkO,WAAW,aACdlO,EAAGkO,WAAW,MACd,OAAO,EAGR,MAAM1N,EAAQR,EAAGS,MAAM,KACvB,GAAiB,QAAbD,EAAM,GAAc,CACvB,MAAM2N,EAASvN,SAASJ,EAAM,GAAI,IAClC,GAAI2N,GAAU,IAAMA,GAAU,GAC7B,OAAO,CAET,CACD,MAEC,GAAW,QAAPnO,GAAgBA,EAAGkO,WAAW,OAASlO,EAAGkO,WAAW,OAASlO,EAAGkO,WAAW,SAC/E,OAAO,CAGV,CAEA,OAAO,GAURhV,EAAIkV,YAAc5Q,UAEjB,MAAM6Q,EAAWnV,EAAIkB,aAAa,aAClC,OAAIiU,GAAYnV,EAAI4U,iBAAiBO,GAC7BA,GAIJ/C,IAAuBC,IAK3BA,GAAsB,EACtBD,EAAqB,WACpB,IAGC,MAAMgD,EAAcpV,EAAIqV,iBAAiB,IA9RV,KA+RzBC,EAAatV,EAAI0U,MAAM,QAGtBa,EAAYC,SAAmBrL,QAAQsL,WAAW,CAACL,EAAaE,IAGvE,IAAIxO,EAAK,KAcT,MAX0B,cAAtByO,EAAWnC,QAA0BmC,EAAW5W,OACnDmI,EAAKyO,EAAW5W,MAChBqB,EAAII,QAAQmE,IAAI,uBAAuBuC,MAGV,cAArB0O,EAAUpC,QAA0BoC,EAAU7W,QACtDmI,EAAK0O,EAAU7W,MACfqB,EAAII,QAAQmE,IAAI,iCAAiCuC,MAI9CA,GAAM9G,EAAI4U,iBAAiB9N,IAC9B9G,EAAIwB,UAAU,YAAasF,GAC3BuL,GAAsB,EACfvL,IAGRuL,GAAsB,EACf,KACR,CAAE,MAAOhS,GAGR,OAFAL,EAAII,QAAQC,MAAM,6BAA8BA,GAChDgS,GAAsB,EACf,IACR,CACA,EAtCoB,IALbD,IAwDTpS,EAAIqV,iBAAmB/Q,MAAOoR,EAAWlD,IACjCrI,QAAQwL,KAAK,CACnB3V,EAAI0U,MAAMgB,GACV,IAAIvL,QAAQ,CAACyL,EAAGC,IACfvL,WAAW,IAAMuL,EAAO,IAAI7O,MAAM,MAAM0O,+BAAuClD,QAAiBA,MAE/FsD,MAAMzV,IACRL,EAAII,QAAQmE,IAAIlE,EAAM0F,SACf,OAIT/F,EAAI0U,MAAQpQ,MAAOoR,EAAY,MAAOK,EAAqB,KAE1D,MAAMC,EAAgB,CAAC,MAAO,IAAK,KAGnC,IAAKA,EAAc5B,SAASsB,GAE3B,OADAtV,QAAQC,MAAM,sDAAwD2V,EAAcC,KAAK,OAClF,KAGR,GAAkB,QAAdP,GAAuB1V,EAAIkB,aAAa,MAC3C,OAAOlB,EAAIkB,aAAa,MAIzB,MAAMgV,EAAMlW,EAAIkB,aAAa,MAAMwU,KAMnC,GAAIQ,IAAQnE,EAAW,OAAOmE,EAE9BlW,EAAII,QAAQmE,IAAI,wPAEhB,IAEC,MAAMuC,QAAW9G,EAAImW,oBAAoBT,EAAWK,GAGpD,OAAIjP,IAAOuG,EAAKvG,IACf9G,EAAII,QAAQmM,KAAK,gCAAgCzF,KAC1C,OAIU,QAAd4O,GAAuB5O,GAC1B9G,EAAIwB,UAAU,KAAMsF,IAIC,IAArBqL,EAAarL,IACK,MAAd4O,GAA4B,OAAP5O,IAEzB9G,EAAIwB,UAAU,OAAQsF,IAGE,IAArBqL,EAAarL,IACE,MAAd4O,GAA4B,OAAP5O,IAEzB9G,EAAIwB,UAAU,OAAQsF,GAGhBA,EACR,CAAE,MAAOzG,GAER,OAAO,IACR,GAGDL,EAAIoW,iCAAmC9R,UAEtC,MAAMqG,EAAY0L,YAAYpU,MAE9B,IAAIqU,EAAW,GAEfrS,OAAOkB,KAAKnF,EAAIgT,YAAYuD,QAAQ7C,IACnC4C,EAASxK,KAAK9L,EAAIgT,WAAWU,QAG9B,IACC,MAAM5P,QAAaqG,QAAQqM,IAAIF,GAqB/B,OAnBAxS,EAAK2P,YAAc3P,EAAK2P,YAAYgD,cAEhC3S,EAAKgQ,QAA0B,eAAhBhQ,EAAKgQ,SACvBhQ,EAAK4S,WAAa,SAGf5S,EAAKgQ,QAA0B,aAAhBhQ,EAAKgQ,SACvBhQ,EAAK4S,WAAa,SAGnB1W,EAAII,QAAQmE,IACX,4DACAT,EACA,gBACCuS,YAAYpU,MAAQ0I,GAAWgM,QAAQ,GAAK,OAKvC7S,CACR,CAAE,MAAOzD,GAER,OADAL,EAAII,QAAQC,MAAM,UAAWA,GACtB,IACR,GAeDL,EAAI4W,cAAgBtS,UAEnB,IAAIuS,EAAiB,CAAC,EAMtB,GAJI7W,EAAIkB,aAAa,oBAAmB2V,EAAepD,YAAczT,EAAIkB,aAAa,mBAClFlB,EAAIkB,aAAa,mBAAkB2V,EAAeH,WAAa1W,EAAIkB,aAAa,kBAChFlB,EAAIkB,aAAa,eAAc2V,EAAe/C,OAAS9T,EAAIkB,aAAa,cAExE2V,EAAepD,YAElB,OADAzT,EAAII,QAAQmE,IAAI,sDAAuDsS,GAChEA,EAGR,IAAIC,QAAgB9W,EAAIoW,mCAGxB,IAAKU,EAAS,CAEb,MAAMC,EA9B6BC,MAEpC,MACMC,EADcxR,EAAQ,KACJyR,wBAExB,OAAID,EAAYxD,YACRwD,EAGD,MAqBwBD,GAE9BF,EAAU,CAAC,EAEPC,GAAuB/W,EAAII,QAAQmE,IAAI,yDAA0DwS,GACjGA,EAAsBtD,cAAaqD,EAAQrD,YAAcsD,EAAsBtD,aAC/EsD,EAAsBL,aAAYI,EAAQJ,WAAaK,EAAsBL,WAClF,CAOA,OALII,GAAShQ,IAAI9G,EAAIwB,UAAU,KAAMsV,EAAQhQ,IACzCgQ,GAASrD,aAAazT,EAAIwB,UAAU,iBAAkBsV,EAAQrD,aAC9DqD,GAASJ,YAAY1W,EAAIwB,UAAU,gBAAiBsV,EAAQJ,YAC5DI,GAAShD,QAAQ9T,EAAIwB,UAAU,YAAasV,EAAQhD,QAEpDgD,GAASrD,YACLqD,EAGD,MASR9W,EAAImW,oBAAsB7R,MAAOoR,EAAY,MAAOK,EAAqB,KAGxE,MAAMpL,EAAY0L,YAAYpU,MAMxBkV,EAAqBlT,OAAOkB,KAAKmN,GACrCjG,OAAOqH,GAAWpB,EAAWoB,GAASgC,IACtC0B,MAAM,EAAGrB,GACT5I,OAAO,CAACkG,EAAKrQ,KACZqQ,EAAIrQ,GAAOsP,EAAWtP,GACfqQ,GAEN,CAAC,GAEL,IAAIiD,EAAW,GAYf,GAVArS,OAAOkB,KAAKgS,GAAoBZ,QAAQ7C,IAEnCyD,EAAmBzD,GAASgC,IAE/BY,EAASxK,KAAK9L,EAAIqX,iBAAiB3D,EAASgC,QAM1CY,EAAStX,OAAS,GAoBrB,OADAgB,EAAII,QAAQmE,IAAI,0BACT,KAlBP,IACC,MAAMT,QAAaqG,QAAQqM,IAAIF,GAKzBgB,GADYjB,YAAYpU,MACD0I,GAAWgM,QAAQ,GAGhD,OADA3W,EAAII,QAAQmE,IAAI,4BAA4BT,EAAKgD,WAAWhD,EAAK4P,sBAAsB4D,QAChFxT,EAAKgD,EACb,CAAE,MAAOzG,GAGR,OADAL,EAAII,QAAQmE,IAAI,yCAAyCmR,+BAClD,IACR,GAiBF1V,EAAIqX,iBAAmB/S,MAAOoP,EAASgC,EAAY,SAClD,IAEC,IAAI5R,EAAO,CACVgD,GAAW,KACX4M,QAAWA,EACXgC,UAAWA,GAIZ,IAAKpD,EAAWoB,GAASgC,GAAY,OAAOvL,QAAQ0L,OAAO,IAAI7O,MAAM,kBAAkB0O,sCAA8ChC,MAErI1T,EAAII,QAAQmE,IAAI,oBAAoBmP,sBAA4BgC,KAEhE,MAAMxC,QAAiBX,EAAiBD,EAAWoB,GAASgC,IAE5D,IAAKxC,EAASC,GACb,OAAOhJ,QAAQ0L,OAAO,IAAI7O,MAAM,qBAAqB0M,yBAA+BR,EAASE,WAG9F,IAAImE,QAA4BrE,EAASnU,OAiBzC,MAfgB,eAAZ2U,GAEH6D,EAAsBA,EACpBjZ,OACAiJ,MAAM,MACN4F,OAAO,CAACkG,EAAKC,KAELD,GADRC,EAAOA,EAAK/L,MAAM,MACD,IAAM+L,EAAK,GAAKD,GAC/B,CAAC,GAELvP,EAAKgD,GAAKyQ,EAAoBzQ,IAE9BhD,EAAKgD,GAAKyQ,EAAoBjZ,OAG1B+O,EAAKvJ,EAAKgD,IAIRhD,EAHCqG,QAAQ0L,OAAO,IAAI7O,MAAM,2BAA2B0M,0BAI7D,CAAE,MAAOrT,GACR,OAAO8J,QAAQ0L,OAAOxV,EACvB,GAqCDL,EAAIwX,oBAAsBlT,UACe,UAA3BtE,EAAIqU,mBAQlBrU,EAAIwU,eAAiB,KACpB,MAAMvF,EAAYD,UAAUC,WAAa,GAGzC,IAAKA,EACJ,OAAO,EAGR,MAAMwI,EAAcC,IAGpB,IAAK,MAAMC,KAAWF,EACrB,GAAIxI,EAAU2I,cAAcxD,SAASuD,EAAQC,eAC5C,OAAO,EAIT,OAAO,GAQR,MAAMF,EAAiBA,KAEtB,IAAIG,EAAiB,GACjB1P,MAAMI,QAAQ3H,cAAcyC,SAASqB,iBAAiBoT,+BACzDD,EAAiBjX,aAAayC,QAAQqB,gBAAgBoT,6BA6DvD,MAzDwB,CAEvB,YACA,wBACA,kBACA,kBACA,UACA,cACA,SACA,QACA,cACA,cACA,YACA,QAGA,sBACA,cACA,cACA,aACA,eACA,YACA,cACA,aACA,eACA,WAGA,YACA,aACA,UACA,SACA,WAGA,cACA,UACA,aACA,WAGA,YACA,SACA,UACA,eACA,QACA,gBAGA,UACA,SACA,UACA,OACA,OACA,QAGsB1P,OAAOyP,IASzBE,EAAUC,GACRA,EAAO5D,SAAS,KASlBO,EAAuB7N,IAC5B,MAAMmR,EAAgBrX,cAAcyC,SAASqB,iBAAiB+P,iBAAmB,GAEjF,IAAK,MAAMuD,KAAUC,EACpB,GAAIF,EAAOC,IAEV,GAAI/K,WAAWA,WAAWnG,EAAIkR,GAC7B,OAAO,OAEF,GAAIlR,IAAOkR,EAEjB,OAAO,EAIT,OAAO,EAGR,CAj1BA,CAi1BC3W,OAAOrB,IAAMqB,OAAOrB,KAAO,CAAC,EAAGzB,O,sECp1B1B,MAAM2Y,EAAwB,KAEpC,MA6bMgB,EAAWC,KAAKC,iBAAiBC,kBAAkBC,SAEzD,GAAiB,KAAbJ,IAAoBA,EACvB,OAAO,KAGR,IAAIjB,EAAc,CACjBxD,YApciB,CACjB,iBAAkC,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAC/F,eAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,uBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,sBAAkC,CAAC,KAAM,KAAM,MAC/C,cAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,eAAkC,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MACzF,oBAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,gBAAkC,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAC7E,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MACzF,kBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,iCAAkC,CAAC,MACnC,8BAAkC,CAAC,MACnC,4BAAkC,CAAC,MACnC,0BAAkC,CAAC,MACnC,6BAAkC,CAAC,MACnC,4BAAkC,CAAC,MACnC,iCAAkC,CAAC,MACnC,0BAAkC,CAAC,MACnC,6BAAkC,CAAC,MACnC,6BAAkC,CAAC,MACnC,4BAAkC,CAAC,MACnC,4BAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,yBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,uBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,uBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,uBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,uBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,+BAAkC,CAAC,MACnC,uBAAkC,CAAC,MACnC,0BAAkC,CAAC,MACnC,6BAAkC,CAAC,MACnC,4BAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,4BAAkC,CAAC,MACnC,0BAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,8BAAkC,CAAC,MACnC,8BAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,8BAAkC,CAAC,MACnC,8BAAkC,CAAC,MACnC,iCAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,KAAM,KAAM,MAC/C,sBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,kBAAkC,CAAC,KAAM,MACzC,yBAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,sBAAkC,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MACrJ,uBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,uBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,uBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,kBAAkC,CAAC,KAAM,MACzC,kBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,4BAAkC,CAAC,MACnC,uBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,YAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,YAAkC,CAAC,MACnC,eAAkC,CAAC,KAAM,KAAM,KAAM,MACrD,eAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,YAAkC,CAAC,MACnC,aAAkC,CAAC,KAAM,MACzC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,YAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,YAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,YAAkC,CAAC,MACnC,YAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,aAAkC,CAAC,KAAM,MACzC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,cAAkC,CAAC,KAAM,KAAM,KAAM,MACrD,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,KAAM,MACzC,qBAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,yBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,wBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,kBAAkC,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,MACjE,gBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,kBAAkC,CAAC,KAAM,MACzC,qBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,cAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,gBAAkC,CAAC,KAAM,KAAM,KAAM,MACrD,oBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,cAAkC,CAAC,KAAM,KAAM,MAC/C,eAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,gBAAkC,CAAC,KAAM,MACzC,cAAkC,CAAC,MACnC,cAAkC,CAAC,KAAM,KAAM,MAC/C,gBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,oBAAkC,CAAC,KAAM,MACzC,gBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,gBAAkC,CAAC,KAAM,KAAM,MAC/C,GAAkC,CAAC,MACnC,UAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,mBAAkC,CAAC,KAAM,MACzC,cAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,iBAAkC,CAAC,KAAM,MACzC,GAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,mBAAkC,CAAC,KAAM,MACzC,uBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,sBAAkC,CAAC,MACnC,eAAkC,CAAC,KAAM,MACzC,mBAAkC,CAAC,KAAM,MACzC,mBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,qBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,oBAAkC,CAAC,KAAM,MACzC,gBAAkC,CAAC,MACnC,mBAAkC,CAAC,MACnC,kBAAkC,CAAC,MACnC,uBAAkC,CAAC,KAAM,MACzC,oBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,gBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,oBAAkC,CAAC,MACnC,eAAkC,CAAC,MACnC,iBAAkC,CAAC,MACnC,UAAkC,CAAC,MACnC,aAAkC,CAAC,MACnC,YAAkC,CAAC,MACnC,WAAkC,CAAC,OAUZyE,GAAU,GAAGzB,eAYrC,MARiB,wBAAbyB,IACHjB,EAAYP,WAAa,SAGT,kBAAbwB,IACHjB,EAAYP,WAAa,SAGnBO,E,yECndRxN,EAAAA,QAAe,CAEbK,UAAW,CAETyO,KAAM,CAAC,eAGP1O,KAAM,CAAC,YAITD,QAAS,CAEP2O,KAAM,CACJ,aACA,gBACA,kBAIF1O,KAAM,CACJ,YACA,aAKJG,SAAU,CAERuO,KAAM,CACJ,YACA,gBACA,iBACA,eACA,eACA,iBACA,gBACA,kBACA,iBACA,cACA,cACA,sBAIF1O,KAAM,CACJ,SACA,eACA,WACA,YACA,eACA,eACA,gBACA,YACA,a,QCtCN,MAQM2O,EAAqBxY,IAAIO,iBARC,CAG/B,kDACA,oBACA,8BAGwE,aAEzEhC,OAAOia,GAAoBha,GAAG,uBAAwB,CAACC,EAAOqF,KAU7D,IAIC,IAAI2U,EAAYha,GAAOC,QAAQga,SAASD,SAAWha,EAAMC,OAAOga,QAAQD,SAAW,KAC/E1Y,EAAYtB,GAAOC,QAAQga,SAASC,WAAala,EAAMC,OAAOga,QAAQC,WAAala,GAAOC,QAAQC,MAAQF,EAAMC,OAAOC,MAAQ,KAMnI,GAAoC,YAAhCiC,aAAa0B,KAAKC,UAAyB,CAG9C,QACqD,IAA7ChE,OAAOE,EAAMqB,eAAeV,KAAK,SACrCb,OAAOE,EAAMqB,eAAeV,KAAK,QAAQgV,SAAS,eAQrD,OALKrU,IACJA,EAAYxB,OAAOE,EAAMqB,eAAegE,KAAK,oBAG9C9D,IAAI4Y,iBAAiB7Y,EAAW,GAKjC,GAAuC,WAAnCa,aAAa0B,KAAKE,aAoBrB,OAlBiB,OAAbiW,IACHA,EAAWvP,OAAO3K,OAAO,mBAAmBY,OAAS+J,OAAO3K,OAAO,mBAAmBY,OAAS,GAG3FY,IACJA,EAAYxB,OAAOE,EAAMqB,eAAeX,OAIpCY,IAKJA,EAAYxB,OAAO,YAAYa,KAAK,MAAMf,QAAQ,WAAY,UAG/D2B,IAAI4Y,iBAAiB7Y,EAAW0Y,GAKjC,GAAI,CAAC,WAAY,yBAAyBI,QAAQjY,aAAa0B,KAAKE,eAAiB,EAWpF,OATiB,OAAbiW,IACHA,EAAWvP,OAAO3K,OAAO,mBAAmBY,OAAS+J,OAAO3K,OAAO,mBAAmBY,OAAS,GAG3FY,IACJA,EAAYxB,OAAO,yBAAyBY,YAG7Ca,IAAI4Y,iBAAiB7Y,EAAW0Y,GAKjC,GAAuC,YAAnC7X,aAAa0B,KAAKE,aAarB,YAXAjE,OAAO,0CAA0Cua,KAAK,CAACC,EAAOC,KAI7DP,EAAWvP,OAAO3K,OAAOya,GAAS9Z,KAAK,mBAAmBC,OAAS+J,OAAO3K,OAAOya,GAAS9Z,KAAK,mBAAmBC,OAAS,EAE3H,IAAI8Z,EAAU1a,OAAOya,GAAS5Z,KAAK,SACnCW,EAAcC,IAAIkZ,oBAAoBD,GAEtCjZ,IAAI4Y,iBAAiB7Y,EAAW0Y,KAMlC,GAAuC,WAAnC7X,aAAa0B,KAAKE,aAWrB,OATiB,OAAbiW,IACHA,EAAWvP,OAAO3K,OAAO,mBAAmBY,OAAS+J,OAAO3K,OAAO,mBAAmBY,OAAS,GAG3FY,IACJA,EAAYxB,OAAO,2BAA2BY,YAG/Ca,IAAI4Y,iBAAiB7Y,EAAW0Y,GAKhB,OAAbA,IACHA,EAAWvP,OAAO3K,OAAO,mBAAmBY,OAAS+J,OAAO3K,OAAO,mBAAmBY,OAAS,GAGhGa,IAAI4Y,iBAAiB7Y,EAAW0Y,EAEjC,MAEkB,OAAbA,IACHA,EAAW,GAGP1Y,IAEJA,EAAYxB,OAAOE,EAAMqB,eAAegE,KAAK,cAAgBvF,OAAOE,EAAMqB,eAAegE,KAAK,cAAgB,MAI1G/D,IACJA,EAAYxB,OAAOE,EAAMqB,eAAeX,MAAQZ,OAAOE,EAAMqB,eAAeX,MAAQ,MAIpFY,GACG0Y,GAEHzY,IAAI4Y,iBAAiB7Y,EAAW0Y,EAInC,CAAE,MAAOtY,GACRC,QAAQC,MAAMF,EACf,IAUD5B,OAAO,6EAA6E4a,IAAI,QAAU1a,IAEjG,IACC,GAAIF,OAAOE,EAAMC,QAAQ0a,QAAQ,KAAKha,KAAK,QAAS,CAEnD,IAAIQ,EAAM,IAAIC,IAAItB,OAAOE,EAAMqB,eAAeV,KAAK,QAASiC,OAAOC,SAAS+X,QAE5E,GAAIzZ,EAAI0Z,aAAaC,IAAI,eAAgB,CAExC,IAAIxZ,EAAYH,EAAI0Z,aAAa3L,IAAI,eACjC8K,EAAY7Y,EAAI0Z,aAAaC,IAAI,YAAc7R,SAAS9H,EAAI0Z,aAAa3L,IAAI,YAAa,IAAM,EACpG3N,IAAI4Y,iBAAiB7Y,EAAW0Y,EACjC,CACD,CACD,CAAE,MAAOtY,GACRC,QAAQC,MAAMF,EACf,IAKD5B,OAAO,mGAAmGC,GAAG,QAAUC,IAEtH,IAaC,IAAIsB,EAAYxB,OAAOE,EAAMqB,eAAe0Z,QAAQ,uBAAuB1V,KAAK,MAQhF,GAAI/D,EAAW,CAId,GAFAA,EAAYC,IAAIyZ,qCAAqC1Z,IAEhDA,EAAW,MAAMiH,MAAM,uCAE5B,GAAIpG,aAAaC,UAAYD,aAAaC,SAASd,GAAY,CAE9D,IAAI2C,EAAU1C,IAAI0Z,mCAAmC3Z,GAErDxB,OAAOe,UAAUC,QAAQ,kBAAmBmD,EAC7C,CACD,CACD,CAAE,MAAOvC,GACRC,QAAQC,MAAMF,EACf,IAOD5B,OAAO,kBAAkBC,GAAG,QAAUC,IAEjCuB,IAAI2Z,QAAQpb,OAAOE,EAAMqB,eAAeX,SAE3Ca,IAAIS,qBAAqB,GACzBT,IAAI4Z,eAAgB,KActBrb,OAAO,iBAAiBC,GAAG,+BAAgC,MAKtD,IAAUwB,IAAI4Z,eACjB5Z,IAAIS,qBAAqB,IAGtB,IAAUT,IAAIQ,wBACjBR,IAAIS,qBAAqB,GACzBT,IAAIU,mBAAmB,EAAGnC,OAAO,wCAAwCY,QAG1Ea,IAAIS,qBAAqB,GAEzBlC,OAAOe,UAAUC,QAAQ,kBAAmB,CAAC,KAQ9ChB,OAAOe,UAAUd,GAAG,QAAS,uBAAwB,KAEpD,IACCD,OAAO,cAAcua,KAAK,CAACC,EAAOC,KAEjC,MAAMjZ,EAAYC,IAAI6Z,8BAA8Bb,GAEpD,IAAKjZ,EAEJ,YADAK,QAAQC,MAAM,sDAIf,MAAMoY,EAAWzY,IAAI8Z,oCAAoCd,GAEpDP,EAQY,IAAbA,EACHzY,IAAIE,sBAAsBH,GAChB0Y,EAAW7X,aAAamZ,KAAKha,GAAW0Y,SAClDzY,IAAIE,sBAAsBH,EAAWa,aAAamZ,KAAKha,GAAW0Y,SAAWA,GACnEA,EAAW7X,aAAamZ,KAAKha,GAAW0Y,UAClDzY,IAAI4Y,iBAAiB7Y,EAAW0Y,EAAW7X,aAAamZ,KAAKha,GAAW0Y,UAZxErY,QAAQC,MAAM,sDAejB,CAAE,MAAOF,GACRC,QAAQC,MAAMF,GACdH,IAAIga,yBACL,IAODzb,OAAO,+BAA+BC,GAAG,QAASC,IAEjD,IAEC,IAAIsB,EAUJ,GARIxB,OAAOE,EAAMqB,eAAegE,KAAK,aAEpC/D,EAAYxB,OAAOE,EAAMqB,eAAegE,KAAK,aACnCvF,OAAOE,EAAMqB,eAAegE,KAAK,gBAE3C/D,EAAYxB,OAAOE,EAAMqB,eAAegE,KAAK,gBAGzC/D,EAAW,MAAMiH,MAAM,uCAE5B,IAAItE,EAAU1C,IAAI0Z,mCAAmC3Z,GAGrDxB,OAAOe,UAAUC,QAAQ,sBAAuBmD,EACjD,CAAE,MAAOvC,GACRC,QAAQC,MAAMF,EACf,IAgBIS,cAAcyC,SAASC,eAC3BtD,IAAIuD,oC,SC7WJ,SAAUvD,GAIVA,EAAIia,kBAAoB,IAFI,SAM5Bja,EAAIka,oBAAsB,KAErBla,EAAIia,sBAAwBrZ,cAAcmK,SAASoP,QACtD/Z,QAAQC,MAAM,sCAAsCL,EAAIia,uDAAuDrZ,aAAamK,QAAQoP,oEAItI,CAfA,CAeC9Y,OAAOrB,IAAMqB,OAAOrB,KAAO,CAAC,EAAGzB,O,SCAhC,SAAUyB,GAMV,MAAMoa,EAAqB,CAAC,eAAgB,cAAe,OAAQ,qBAWnEpa,EAAI8E,cAAgB,CAUnB2K,eAAAA,GACC,MAAMD,EAAe,GAErB,IAAKxP,EAAIwR,kBACR,OAAOhC,EAIR,IAAK,MAAOvK,EAAWoV,KAAiBpW,OAAOC,QAAQlE,EAAIwR,mBAC1D,GAAqC,mBAA1B6I,EAAaxI,SACvB,IACKwI,EAAaxI,YAChBrC,EAAa1D,KAAK7G,EAEpB,CAAE,MAAO9E,GACRH,EAAII,QAAQC,MAAM,qBAAqB4E,eAAwB9E,EAChE,CAIF,OAAOqP,CACR,EAOAkB,0BAAAA,GACC,MAAMD,EAAgB,GAChBjB,EAAgB3D,KAAK4D,kBAE3B,IAAK,MAAMxK,KAAauK,GAEiC,IAApDxP,EAAIwR,oBAAoBvM,IAAYyM,aACvCjB,EAAc3E,KAAK7G,GAIrB,OAAOwL,CACR,EAWAK,kBAAAA,GACC,MAAMD,EAAe,GACfrB,EAAe3D,KAAK4D,kBAG1B,IAAK,MAAMxK,KAAauK,GAEiC,IAApDxP,EAAIwR,oBAAoBvM,IAAYyM,aACvCb,EAAU/E,KAAK7G,GAIjB,OAAO4L,CACR,EAQAlB,WAAW1K,GACLjF,EAAIqR,UAIFrR,EAAIqR,SAASpM,IAHZ,KAqBTF,uBAAAA,CAAwBuV,GACvB,MAAMC,EAAuB,GACvB/K,EAAuB3D,KAAK4D,kBAElC,IAAK,MAAMxK,KAAauK,GACsC,IAAzDxP,EAAIwR,oBAAoBvM,KAAaqV,IACxCC,EAAqBzO,KAAK7G,GAI5B,OAAOsV,CACR,EAWAC,aAAAA,CAAcvV,GACb,MAAM0M,EAAO3R,EAAIwR,oBAAoBvM,IAAY0M,KAGjD,OAAIA,GAAQyI,EAAmBhG,SAASzC,GAChCA,GAIgD,IAApD3R,EAAIwR,oBAAoBvM,IAAYyM,YAChC,OA9IkB,cAkJ3B,EAcA3B,iBAAAA,CAAkB9K,EAAWmK,GAC5B,MAAMuC,EAAc9F,KAAK2O,cAAcvV,GACjCwV,GAAiE,IAAnD7Z,cAAcyC,SAASqB,iBAAiByL,OACtDuB,GAAkE,IAApD1R,EAAIwR,oBAAoBvM,IAAYyM,YAExD,IAAIgJ,EAAW,CACdxJ,cAAc,EACdE,aAAc,GAGf,OAAQO,GACP,IAAK,eACJ+I,EAAW,CAACxJ,cAAc,EAAME,aAAa,GAC7C,MAED,IAAK,cAEJsJ,EAAW,CACVxJ,cAAc,EACdE,YAAcqJ,GAAc/I,GAE7B,MAED,IAAK,OAEJgJ,EAAW,CACVxJ,cAAc,EACdE,YAAcqJ,GAAc/I,GAE7B,MAED,IAAK,oBAGHgJ,EADGD,GAAc/I,EACN,CAACR,cAAc,EAAOE,aAAa,GAEnC,CAACF,cAAc,EAAME,aAAa,GAehD,OARAsJ,EAAW1a,EAAIqL,MAAMa,aACpB,4BACAwO,EACAzV,EACAmK,EACAuC,GAGM+I,CACR,EAQAC,yBAAAA,CAA0BvL,GACzB,MAAMlK,EAAe,GACfsK,EAAe3D,KAAK4D,kBAE1B,IAAK,MAAMxK,KAAauK,EAAc,CACpB3D,KAAKkE,kBAAkB9K,EAAWmK,GACtC8B,cACZhM,EAAO4G,KAAK7G,EAEd,CAEA,OAAOC,CACR,EAQAoL,wBAAAA,CAAyBlB,GACxB,MAAMlK,EAAe,GACfsK,EAAe3D,KAAK4D,kBAE1B,IAAK,MAAMxK,KAAauK,EAAc,CACpB3D,KAAKkE,kBAAkB9K,EAAWmK,GACtCgC,aACZlM,EAAO4G,KAAK7G,EAEd,CAEA,OAAOC,CACR,EAGD,CA3QA,CA2QC7D,OAAOrB,IAAMqB,OAAOrB,KAAO,CAAC,EAAGzB,O,yGCzRjC,IAAMqc,EAAQ,uDACRC,EAAQ,IAAID,EAAK,UAAUA,EAC3BE,EAAU,IAAIC,OAAO,IAAIF,EAAK,KAG9BG,EAAQ,uBACRC,EAAU,IAAIF,OAClB,QACQC,EAAK,WAAWA,EADxB,UAEQA,EAAK,WAAWH,EAAK,KAAKG,EAFlC,UAGQA,EAAK,YAAYH,EAAK,MAAMG,EAHpC,gBAIQA,EAAK,aAAaA,EAAK,UAAUH,EAAK,MAAMG,EAJpD,gBAKQA,EAAK,aAAaA,EAAK,UAAUH,EAAK,MAAMG,EALpD,gBAMQA,EAAK,aAAaA,EAAK,UAAUH,EAAK,MAAMG,EANpD,gBAOQA,EAAK,aAAaA,EAAK,UAAUH,EAAK,MAAMG,EAPpD,sBAQcA,EAAK,UAAUH,EAAK,QAAQG,EAR1C,mCAgBF,SAAgB5T,EAAO8T,GACrB,OAAOJ,EAAQ7T,KAAKiU,EACtB,CAMA,SAAgBnU,EAAOmU,GACrB,OAAOD,EAAQhU,KAAKiU,EACtB,CAVAzR,EAAAA,OAAArC,EAQAqC,EAAAA,OAAA1C,EAIA0C,EAAAA,KAAA,SAAqByR,GACnB,OAAI9T,EAAO8T,GAAW,EAClBnU,EAAOmU,GAAW,EACf,CACT,C,yXCxCA,IAAA3U,EAAAd,EAAA,KACAe,EAAAf,EAAA,KAOA,SAAS0V,EAAWrU,GAClB,IAAKP,EAAKa,OAAON,GACf,MAAM,IAAIE,MAAM,6BAA6BF,GAE/C,IAAMsU,EAAStU,EAAGS,MAAM,KACxB,OACIG,SAAS0T,EAAO,GAAI,KAAO,KAC1B1T,SAAS0T,EAAO,GAAI,KAAO,KAC3B1T,SAAS0T,EAAO,GAAI,KAAO,GAC5B1T,SAAS0T,EAAO,GAAI,MACtB,CAEJ,CAoBA,SAAgB/S,EACdC,GAEA,GAAIH,MAAMI,QAAQD,GAAkB,CAClC,IAAME,EAASF,EAAgBd,IAAI,SAAAiB,GAAU,OAAA4S,EAAkB5S,EAAlB,GAC7C,OAAO,SAAAE,GACL,IAAM2S,EAAcH,EAAWxS,GAC/B,OAAOH,EAAOK,KAAK,SAAAC,GAAS,OAAAA,EAAMwS,EAAN,EAC9B,C,CAEF,IAAMxS,EAAQuS,EAAkB/S,GAChC,OAAO,SAAAK,GACL,IAAM2S,EAAcH,EAAWxS,GAC/B,OAAOG,EAAMwS,EACf,CACF,CAGA,SAASD,EAAkB5S,GACnB,IAAAZ,EAAsCY,EAAOlB,MAAM,KAAlDwB,EAAalB,EAAA,GAAEmB,EAAkBnB,EAAA,GAClCoB,EAAevB,SAASsB,EAAoB,IAClD,IAAKD,IAAkBG,OAAOC,UAAUF,GACtC,MAAM,IAAIjC,MAAM,4BAA4ByB,GAG9C,GAAIQ,EAAe,GAAKA,EAAe,GACrC,MAAM,IAAIjC,MAAM,mCAAmCiC,EAAY,UAAUR,EAAM,KAGjF,IAAM8S,EAAaJ,EAAWpS,GAC9B,OAAO,SAAAuS,GACL,OAAqB,IAAjBrS,GAGiBsS,GAAe,GAAKtS,IACnBqS,GAAgB,GAAKrS,CAG7C,CACF,CAlDAQ,EAAAA,WAAA,SAA2Bd,EAAiBL,GAC1C,OAAOD,EAAcC,EAAdD,CAA+BM,EACxC,EASAc,EAAAA,cAAApB,EA0CA,IAAMqB,EAAiE,GAGvED,EAAAA,UAAA,SAA0Bd,GAIxB,MAHI,YAAae,IAAqB,IACpCA,EAA0B,QAAIrB,EAAc7B,EAAAmD,QAAQC,QAAQ2O,OAEvD7O,EAA0B,QAAEf,EACrC,EAGAc,EAAAA,YAAA,SAA4Bd,GAI1B,MAHI,cAAee,IAAqB,IACtCA,EAA4B,UAAIrB,EAAc7B,EAAAmD,QAAQG,UAAUyO,OAE3D7O,EAA4B,UAAEf,EACvC,EAGAc,EAAAA,WAAA,SAA2Bd,GAIzB,MAHI,aAAce,IAAqB,IACrCA,EAA2B,SAAIrB,EAAc7B,EAAAmD,QAAQK,SAASuO,OAEzD7O,EAA2B,SAAEf,EACtC,EAMAc,EAAAA,UAAA,SAA0Bd,GAQxB,MAPI,YAAae,IAAqB,IACpCA,EAA0B,QAAIrB,EAAa4B,EACtCzD,EAAAmD,QAAQC,QAAQ2O,KAChB/R,EAAAmD,QAAQG,UAAUyO,KAClB/R,EAAAmD,QAAQK,SAASuO,QAGjB7O,EAA0B,QAAEf,EACrC,C,wXCzHA,WACE,IAAI6S,EAAYC,EAAQC,EAAUC,EAAaC,EAAUC,EAAaC,EAAiBC,EAEvFN,EAAS,CAAC,EAIuC,OAA5CO,GAAqDA,EAAOvS,QAC/DuS,EAAAvS,QAAiBgS,EAHZ5P,KAKQ,OAAI4P,EAGnBK,EAAY,SAASG,EAAOhH,EAAQiH,EAAUC,GAC5C,IAAIC,EAAMC,EACV,GAAIJ,EAAMjd,SAAWiW,EAAOjW,OAC1B,MAAM,IAAIgI,MAAM,gEAGlB,IADAoV,EAAO,EACAD,EAAW,GAAG,CAKnB,IAJAE,EAAQH,EAAWC,GACP,IACVE,EAAQ,GAENJ,EAAMG,IAASC,IAAUpH,EAAOmH,IAASC,EAC3C,OAAO,EAETF,GAAYD,EACZE,GAAQ,C,CAEV,OAAO,C,EAGTX,EAAOa,YAAc,SAAS3T,EAAS4T,EAAWC,GAChD,IAAIC,EAAGC,EAAKC,EAAWC,EAAcnU,EAIrC,IAAKkU,KAHc,MAAfH,IACFA,EAAc,WAEED,EAKhB,MAJAK,EAAeL,EAAUI,IACR,IAAQC,EAAa,aAAczU,QAClDyU,EAAe,CAACA,IAEbH,EAAI,EAAGC,EAAME,EAAa5d,OAAQyd,EAAIC,EAAKD,IAE9C,GADAhU,EAASmU,EAAaH,GAClB9T,EAAQkU,SAAWpU,EAAO,GAAGoU,QAC3BlU,EAAQxB,MAAM2V,MAAMnU,EAASF,GAC/B,OAAOkU,EAKf,OAAOH,C,EAGTf,EAAO3O,KAAQ,WACb,SAASA,EAAKsO,GACZ,IAAIqB,EAAGC,EAAKK,EACZ,GAAsB,IAAlB3B,EAAOpc,OACT,MAAM,IAAIgI,MAAM,wCAElB,IAAKyV,EAAI,EAAGC,EAAMtB,EAAOpc,OAAQyd,EAAIC,EAAKD,IAExC,KAAO,IADPM,EAAQ3B,EAAOqB,KACMM,GAAS,KAC5B,MAAM,IAAI/V,MAAM,2CAGpB6E,KAAKuP,OAASA,C,CAkFhB,OA/EAtO,EAAKkQ,UAAUH,KAAO,WACpB,MAAO,M,EAGT/P,EAAKkQ,UAAUrV,SAAW,WACxB,OAAOkE,KAAKuP,OAAOnF,KAAK,I,EAG1BnJ,EAAKkQ,UAAUC,mBAAqB,WAClC,OAAOpR,KAAKlE,U,EAGdmF,EAAKkQ,UAAUE,YAAc,WAC3B,OAAOrR,KAAKuP,OAAOhE,MAAM,E,EAG3BtK,EAAKkQ,UAAU7V,MAAQ,SAASgW,EAAOC,GACrC,IAAIC,EAIJ,QAHkB,IAAdD,IACWD,GAAbE,EAAMF,GAAmB,GAAIC,EAAYC,EAAI,IAE1B,SAAjBF,EAAMN,OACR,MAAM,IAAI7V,MAAM,uDAElB,OAAO8U,EAAUjQ,KAAKuP,OAAQ+B,EAAM/B,OAAQ,EAAGgC,E,EAGjDtQ,EAAKkQ,UAAUM,cAAgB,CAC7BC,YAAa,CAAC,CAAC,IAAIzQ,EAAK,CAAC,EAAG,EAAG,EAAG,IAAK,IACvC0Q,UAAW,CAAC,CAAC,IAAI1Q,EAAK,CAAC,IAAK,IAAK,IAAK,MAAO,KAC7C2Q,UAAW,CAAC,CAAC,IAAI3Q,EAAK,CAAC,IAAK,EAAG,EAAG,IAAK,IACvC4Q,UAAW,CAAC,CAAC,IAAI5Q,EAAK,CAAC,IAAK,IAAK,EAAG,IAAK,KACzC6Q,SAAU,CAAC,CAAC,IAAI7Q,EAAK,CAAC,IAAK,EAAG,EAAG,IAAK,IACtC8Q,gBAAiB,CAAC,CAAC,IAAI9Q,EAAK,CAAC,IAAK,GAAI,EAAG,IAAK,KAC9C,QAAW,CAAC,CAAC,IAAIA,EAAK,CAAC,GAAI,EAAG,EAAG,IAAK,GAAI,CAAC,IAAIA,EAAK,CAAC,IAAK,GAAI,EAAG,IAAK,IAAK,CAAC,IAAIA,EAAK,CAAC,IAAK,IAAK,EAAG,IAAK,KACxG9C,SAAU,CAAC,CAAC,IAAI8C,EAAK,CAAC,IAAK,EAAG,EAAG,IAAK,IAAK,CAAC,IAAIA,EAAK,CAAC,IAAK,EAAG,EAAG,IAAK,IAAK,CAAC,IAAIA,EAAK,CAAC,IAAK,GAAI,GAAI,IAAK,IAAK,CAAC,IAAIA,EAAK,CAAC,IAAK,GAAI,IAAK,IAAK,IAAK,CAAC,IAAIA,EAAK,CAAC,IAAK,EAAG,IAAK,IAAK,IAAK,CAAC,IAAIA,EAAK,CAAC,IAAK,EAAG,EAAG,IAAK,KAG/MA,EAAKkQ,UAAUjI,MAAQ,WACrB,OAAO0G,EAAOa,YAAYzQ,KAAMA,KAAKyR,c,EAGvCxQ,EAAKkQ,UAAUa,oBAAsB,WACnC,OAAOpC,EAAO1O,KAAKwH,MAAM,UAAa1I,KAAKlE,W,EAG7CmF,EAAKkQ,UAAUc,2BAA6B,WAC1C,IAAIC,EAAMzU,EAAGmT,EAAGM,EAAOiB,EAAMC,EAAOC,EAcpC,IAbAA,EAAY,CACV,EAAG,EACH,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,GAEPH,EAAO,EACPC,GAAO,EACF1U,EAAImT,EAAI,EAAGA,GAAK,EAAGnT,EAAImT,IAAM,EAAG,CAEnC,MADAM,EAAQlR,KAAKuP,OAAO9R,MACP4U,GAUX,OAAO,KARP,GADAD,EAAQC,EAAUnB,GACdiB,GAAkB,IAAVC,EACV,OAAO,KAEK,IAAVA,IACFD,GAAO,GAETD,GAAQE,C,CAKZ,OAAO,GAAKF,C,EAGPjR,C,CA9FM,GAkGf4O,EAAW,uBAEXC,EAAc,CACZwC,UAAW,IAAIpD,OAAO,IAAMW,EAAW,MAAQA,EAAW,MAAQA,EAAW,MAAQA,EAAW,IAAK,KACrG0C,UAAW,IAAIrD,OAAO,IAAMW,EAAW,IAAK,MAG9CD,EAAO3O,KAAKuR,OAAS,SAASjgB,GAC5B,IAAI+I,EAAOmX,EAAclC,EAAMC,EAAO1d,EAQtC,GAPA2f,EAAe,SAASlgB,GACtB,MAAkB,MAAdA,EAAO,IAA4B,MAAdA,EAAO,GACvBsJ,SAAStJ,EAAQ,GAEjBsJ,SAAStJ,E,EAGhB+I,EAAQ/I,EAAO+I,MAAMwU,EAAYwC,WACnC,OAAQ,WACN,IAAI1B,EAAGC,EAAKW,EAAKkB,EAGjB,IADAA,EAAU,GACL9B,EAAI,EAAGC,GAFZW,EAAMlW,EAAMiQ,MAAM,EAAG,IAECpY,OAAQyd,EAAIC,EAAKD,IACrCL,EAAOiB,EAAIZ,GACX8B,EAAQzS,KAAKwS,EAAalC,IAE5B,OAAOmC,C,CARD,GAUH,GAAIpX,EAAQ/I,EAAO+I,MAAMwU,EAAYyC,WAAY,CAEtD,IADAzf,EAAQ2f,EAAanX,EAAM,KACf,YAAcxI,EAAQ,EAChC,MAAM,IAAIqI,MAAM,yCAElB,OAAS,WACP,IAAIyV,EAAG8B,EAEP,IADAA,EAAU,GACLlC,EAAQI,EAAI,EAAGA,GAAK,GAAIJ,EAAQI,GAAK,EACxC8B,EAAQzS,KAAMnN,GAAS0d,EAAS,KAElC,OAAOkC,C,CANA,GAOHC,S,CAEN,OAAO,I,EAIX/C,EAAO1O,KAAQ,WACb,SAASA,EAAKzF,EAAOmX,GACnB,IAAInV,EAAGmT,EAAGiC,EAAGhC,EAAKN,EAAMiB,EACxB,GAAqB,KAAjB/V,EAAMtI,OAER,IADA6M,KAAKvE,MAAQ,GACRgC,EAAImT,EAAI,EAAGA,GAAK,GAAInT,EAAImT,GAAK,EAChC5Q,KAAKvE,MAAMwE,KAAMxE,EAAMgC,IAAM,EAAKhC,EAAMgC,EAAI,QAEzC,IAAqB,IAAjBhC,EAAMtI,OAGf,MAAM,IAAIgI,MAAM,6CAFhB6E,KAAKvE,MAAQA,C,CAKf,IAAKoX,EAAI,EAAGhC,GADZW,EAAMxR,KAAKvE,OACWtI,OAAQ0f,EAAIhC,EAAKgC,IAErC,KAAO,IADPtC,EAAOiB,EAAIqB,KACStC,GAAQ,OAC1B,MAAM,IAAIpV,MAAM,2CAGhByX,IACF5S,KAAK4S,OAASA,E,CAmKlB,OA/JA1R,EAAKiQ,UAAUH,KAAO,WACpB,MAAO,M,EAGT9P,EAAKiQ,UAAUrV,SAAW,WACxB,OAAOkE,KAAKoR,qBAAqB5e,QAAQ,mBAAoB,K,EAG/D0O,EAAKiQ,UAAU2B,gBAAkB,WAC/B,IAAIC,EAAgBC,EAAiB1X,EAAO2X,EAAO1gB,EAKnD,IAJA0gB,EAAQ,uBACR1gB,EAASyN,KAAKoR,qBACd2B,EAAiB,EACjBC,GAAmB,EACX1X,EAAQ2X,EAAMC,KAAK3gB,IACrB+I,EAAM,GAAGnI,OAAS6f,IACpBD,EAAiBzX,EAAM4R,MACvB8F,EAAkB1X,EAAM,GAAGnI,QAG/B,OAAI6f,EAAkB,EACbzgB,EAEFA,EAAO4gB,UAAU,EAAGJ,GAAkB,KAAOxgB,EAAO4gB,UAAUJ,EAAiBC,E,EAGxF9R,EAAKiQ,UAAUE,YAAc,WAC3B,IAAI+B,EAAOxC,EAAGC,EAAKN,EAAMiB,EAGzB,IAFA4B,EAAQ,GAEHxC,EAAI,EAAGC,GADZW,EAAMxR,KAAKvE,OACWtI,OAAQyd,EAAIC,EAAKD,IACrCL,EAAOiB,EAAIZ,GACXwC,EAAMnT,KAAKsQ,GAAQ,GACnB6C,EAAMnT,KAAY,IAAPsQ,GAEb,OAAO6C,C,EAGTlS,EAAKiQ,UAAUC,mBAAqB,WAClC,IAAIiC,EAAM9C,EAAM+C,EAehB,OAdAD,EAAS,WACP,IAAIzC,EAAGC,EAAKW,EAAKkB,EAGjB,IADAA,EAAU,GACL9B,EAAI,EAAGC,GAFZW,EAAMxR,KAAKvE,OAEWtI,OAAQyd,EAAIC,EAAKD,IACrCL,EAAOiB,EAAIZ,GACX8B,EAAQzS,KAAKsQ,EAAKzU,SAAS,KAE7B,OAAO4W,C,EACNa,KAAKvT,MAAOoK,KAAK,KACpBkJ,EAAS,GACLtT,KAAK4S,SACPU,EAAS,IAAMtT,KAAK4S,QAEfS,EAAOC,C,EAGhBpS,EAAKiQ,UAAUqC,oBAAsB,WACnC,IAAIH,EAAM9C,EAAM+C,EAehB,OAdAD,EAAS,WACP,IAAIzC,EAAGC,EAAKW,EAAKkB,EAGjB,IADAA,EAAU,GACL9B,EAAI,EAAGC,GAFZW,EAAMxR,KAAKvE,OAEWtI,OAAQyd,EAAIC,EAAKD,IACrCL,EAAOiB,EAAIZ,GACX8B,EAAQzS,KAAKsQ,EAAKzU,SAAS,IAAI2X,SAAS,EAAG,MAE7C,OAAOf,C,EACNa,KAAKvT,MAAOoK,KAAK,KACpBkJ,EAAS,GACLtT,KAAK4S,SACPU,EAAS,IAAMtT,KAAK4S,QAEfS,EAAOC,C,EAGhBpS,EAAKiQ,UAAU7V,MAAQ,SAASgW,EAAOC,GACrC,IAAIC,EAIJ,QAHkB,IAAdD,IACWD,GAAbE,EAAMF,GAAmB,GAAIC,EAAYC,EAAI,IAE1B,SAAjBF,EAAMN,OACR,MAAM,IAAI7V,MAAM,uDAElB,OAAO8U,EAAUjQ,KAAKvE,MAAO6V,EAAM7V,MAAO,GAAI8V,E,EAGhDrQ,EAAKiQ,UAAUM,cAAgB,CAC7BC,YAAa,CAAC,IAAIxQ,EAAK,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,KAClD2Q,UAAW,CAAC,IAAI3Q,EAAK,CAAC,MAAQ,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IACrD0Q,UAAW,CAAC,IAAI1Q,EAAK,CAAC,MAAQ,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,GACrD4Q,SAAU,CAAC,IAAI5Q,EAAK,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,KAC/CwS,YAAa,CAAC,IAAIxS,EAAK,CAAC,MAAQ,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,GACvDyS,WAAY,CAAC,IAAIzS,EAAK,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,MAAQ,EAAG,IAAK,IACtD0S,QAAS,CAAC,IAAI1S,EAAK,CAAC,EAAG,EAAG,EAAG,EAAG,MAAQ,EAAG,EAAG,IAAK,IACnD2S,QAAS,CAAC,IAAI3S,EAAK,CAAC,IAAM,MAAQ,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IACtD,OAAQ,CAAC,IAAIA,EAAK,CAAC,KAAQ,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAClD4S,OAAQ,CAAC,IAAI5S,EAAK,CAAC,KAAQ,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,IAClD/C,SAAU,CAAC,CAAC,IAAI+C,EAAK,CAAC,KAAQ,KAAO,EAAG,EAAG,EAAG,EAAG,EAAG,IAAK,MAG3DA,EAAKiQ,UAAUjI,MAAQ,WACrB,OAAO0G,EAAOa,YAAYzQ,KAAMA,KAAKyR,c,EAGvCvQ,EAAKiQ,UAAUxP,oBAAsB,WACnC,MAAwB,eAAjB3B,KAAKkJ,O,EAGdhI,EAAKiQ,UAAU4C,cAAgB,WAC7B,IAAIC,EAAMC,EAAKzC,EACf,IAAKxR,KAAK2B,sBACR,MAAM,IAAIxG,MAAM,4DAGlB,OAD4B6Y,GAA5BxC,EAAMxR,KAAKvE,MAAM8P,OAAO,IAAe,GAAI0I,EAAMzC,EAAI,GAC9C,IAAI5B,EAAO3O,KAAK,CAAC+S,GAAQ,EAAU,IAAPA,EAAaC,GAAO,EAAS,IAANA,G,EAG5D/S,EAAKiQ,UAAUc,2BAA6B,WAC1C,IAAIC,EAAMzU,EAAGmT,EAAGL,EAAM4B,EAAMC,EAAOC,EAsBnC,IArBAA,EAAY,CACV,EAAG,GACH,MAAO,GACP,MAAO,GACP,MAAO,GACP,MAAO,GACP,MAAO,GACP,MAAO,GACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,EACP,MAAO,GAETH,EAAO,EACPC,GAAO,EACF1U,EAAImT,EAAI,EAAGA,GAAK,EAAGnT,EAAImT,IAAM,EAAG,CAEnC,MADAL,EAAOvQ,KAAKvE,MAAMgC,MACN4U,GAUV,OAAO,KARP,GADAD,EAAQC,EAAU9B,GACd4B,GAAkB,IAAVC,EACV,OAAO,KAEK,KAAVA,IACFD,GAAO,GAETD,GAAQE,C,CAKZ,OAAO,IAAMF,C,EAGRhR,C,CAxLM,GA4Lf6O,EAAW,oBAEXG,EAAY,gBAEZF,EAAc,CACZE,UAAW,IAAIhB,OAAOgB,EAAW,KACjC,OAAU,IAAIhB,OAAO,UAAYa,EAAW,uBAAyBG,EAAY,MAAO,KACxFgE,aAAc,IAAIhF,OAAQ,QAAUa,EAAW,cAAgBA,EAAW,MAAUF,EAAW,MAAQA,EAAW,MAAQA,EAAW,MAAQA,EAAa,IAAMK,EAAY,MAAQ,MAGtLP,EAAa,SAASpd,EAAQkJ,GAC5B,IAAI0Y,EAAYC,EAAW7D,EAAM8D,EAAaC,EAAkB1B,EAChE,GAAIrgB,EAAOya,QAAQ,QAAUza,EAAOgiB,YAAY,MAC9C,OAAO,KAST,KAPA3B,GAAUrgB,EAAO+I,MAAM0U,EAAuB,YAAM,IAAI,MAEtD4C,EAASA,EAAOO,UAAU,GAC1B5gB,EAASA,EAAOC,QAAQ,OAAQ,KAElC2hB,EAAa,EACbC,GAAa,GACLA,EAAY7hB,EAAOya,QAAQ,IAAKoH,EAAY,KAAO,GACzDD,IAQF,GAN4B,OAAxB5hB,EAAOiiB,OAAO,EAAG,IACnBL,IAE2B,OAAzB5hB,EAAOiiB,QAAQ,EAAG,IACpBL,IAEEA,EAAa1Y,EACf,OAAO,KAIT,IAFA6Y,EAAmB7Y,EAAQ0Y,EAC3BE,EAAc,IACPC,KACLD,GAAe,KAmBjB,MAhBkB,OADlB9hB,EAASA,EAAOC,QAAQ,KAAM6hB,IACnB,KACT9hB,EAASA,EAAOgZ,MAAM,IAEU,MAA9BhZ,EAAOA,EAAOY,OAAS,KACzBZ,EAASA,EAAOgZ,MAAM,GAAI,IAYrB,CACL9P,MAXFA,EAAS,WACP,IAAImV,EAAGC,EAAKW,EAAKkB,EAGjB,IADAA,EAAU,GACL9B,EAAI,EAAGC,GAFZW,EAAMjf,EAAOmJ,MAAM,MAEGvI,OAAQyd,EAAIC,EAAKD,IACrCL,EAAOiB,EAAIZ,GACX8B,EAAQzS,KAAKpE,SAAS0U,EAAM,KAE9B,OAAOmC,C,CARA,GAYPE,OAAQA,E,EAIZhD,EAAO1O,KAAKsR,OAAS,SAASjgB,GAC5B,IAAI8gB,EAAMzC,EAAGC,EAAKvV,EAAO4V,EAAO3B,EAAQqD,EACxC,GAAI5C,EAAoB,OAAE5U,KAAK7I,GAC7B,OAAOod,EAAWpd,EAAQ,GACrB,IAAI+I,EAAQ/I,EAAO+I,MAAM0U,EAA0B,iBACxD4C,EAAStX,EAAM,IAAM,IACrB+X,EAAO1D,EAAWrU,EAAM,GAAGiQ,MAAM,GAAI,GAAKqH,EAAQ,IACzCnX,OAAO,CAEd,IAAKmV,EAAI,EAAGC,GADZtB,EAAS,CAAC1T,SAASP,EAAM,IAAKO,SAASP,EAAM,IAAKO,SAASP,EAAM,IAAKO,SAASP,EAAM,MAC5DnI,OAAQyd,EAAIC,EAAKD,IAExC,KAAO,IADPM,EAAQ3B,EAAOqB,KACMM,GAAS,KAC5B,OAAO,KAKX,OAFAmC,EAAK5X,MAAMwE,KAAKsP,EAAO,IAAM,EAAIA,EAAO,IACxC8D,EAAK5X,MAAMwE,KAAKsP,EAAO,IAAM,EAAIA,EAAO,IACjC,CACL9T,MAAO4X,EAAK5X,MACZmX,OAAQS,EAAKT,O,CAInB,OAAO,I,EAGThD,EAAO3O,KAAK1F,OAASqU,EAAO1O,KAAKhG,OAAS,SAAS3I,GACjD,OAA+B,OAAxByN,KAAKwS,OAAOjgB,E,EAGrBqd,EAAO3O,KAAKwT,QAAU,SAASliB,GAE7B,IAEE,OADA,IAAIyN,KAAKA,KAAKwS,OAAOjgB,KACd,C,CACP,MAAOmiB,GAEP,OAAO,C,GAIX9E,EAAO3O,KAAK0T,uBAAyB,SAASpiB,GAC5C,SAAIqd,EAAO3O,KAAKwT,QAAQliB,KAAWA,EAAO+I,MAAM,qC,EAOlDsU,EAAO1O,KAAKuT,QAAU,SAASliB,GAC7B,IAAI8gB,EACJ,GAAsB,iBAAX9gB,IAAgD,IAAzBA,EAAOya,QAAQ,KAC/C,OAAO,EAET,IAGE,OADA,IAAIhN,MADJqT,EAAOrT,KAAKwS,OAAOjgB,IACLkJ,MAAO4X,EAAKT,SACnB,C,CACP,MAAO8B,GAEP,OAAO,C,GAIX9E,EAAO3O,KAAKyH,MAAQ,SAASnW,GAC3B,IAAIkJ,EAEJ,GAAc,QADdA,EAAQuE,KAAKwS,OAAOjgB,IAElB,MAAM,IAAI4I,MAAM,mDAElB,OAAO,IAAI6E,KAAKvE,E,EAGlBmU,EAAO1O,KAAKwH,MAAQ,SAASnW,GAC3B,IAAI8gB,EAEJ,GAAmB,QADnBA,EAAOrT,KAAKwS,OAAOjgB,IACVkJ,MACP,MAAM,IAAIN,MAAM,mDAElB,OAAO,IAAI6E,KAAKqT,EAAK5X,MAAO4X,EAAKT,O,EAGnChD,EAAO3O,KAAK2T,UAAY,SAASriB,GAC/B,IAAIsiB,EAAYvZ,EAAOwZ,EACvB,IAAIxZ,EAAQ/I,EAAO+I,MAAM,oBACvBuZ,EAAahZ,SAASP,EAAM,MACV,GAAKuZ,GAAc,GAOnC,OANAC,EAAS,CAAC9U,KAAK0I,MAAMpN,EAAM,IAAKuZ,GAChCzc,OAAO2c,eAAeD,EAAQ,WAAY,CACxChiB,MAAO,WACL,OAAOkN,KAAKoK,KAAK,I,IAGd0K,EAGX,MAAM,IAAI3Z,MAAM,0D,EAGlByU,EAAO3O,KAAK+T,2BAA6B,SAASxZ,GAChD,IAAIyZ,EAAkBC,EAAG3F,EAEzB,IADA/T,EAASK,SAASL,IACL,GAAKA,EAAS,GACzB,MAAM,IAAIL,MAAM,sCAKlB,IAHAoU,EAAS,CAAC,EAAG,EAAG,EAAG,GACnB2F,EAAI,EACJD,EAAmBhf,KAAKC,MAAMsF,EAAS,GAChC0Z,EAAID,GACT1F,EAAO2F,GAAK,IACZA,IAKF,OAHID,EAAmB,IACrB1F,EAAO0F,GAAoBhf,KAAKkf,IAAI,EAAG3Z,EAAS,GAAK,GAAK,EAAKA,EAAS,GAEnE,IAAIwE,KAAKuP,E,EAGlBK,EAAO3O,KAAKmU,yBAA2B,SAAS7iB,GAC9C,IAAI2f,EAAMzU,EAAU4X,EAAmB9F,EAAQ+F,EAC/C,IAME,IAJAD,GADAnD,EAAOlS,KAAK4U,UAAUriB,IACG,GAAG8e,cAC5BiE,EAAmBtV,KAAKgV,2BAA2B9C,EAAK,IAAIb,cAC5D9B,EAAS,GACT9R,EAAI,EACGA,EAAI,GACT8R,EAAOtP,KAAKpE,SAASwZ,EAAkB5X,GAAI,IAA0C,IAApC5B,SAASyZ,EAAiB7X,GAAI,KAC/EA,IAEF,OAAO,IAAIuC,KAAKuP,E,CAChB,MAAOmF,GAEP,MAAM,IAAIvZ,MAAM,qD,GAIpByU,EAAO3O,KAAKsU,uBAAyB,SAAShjB,GAC5C,IAAI2f,EAAMzU,EAAU4X,EAAmB9F,EAAQ+F,EAC/C,IAME,IAJAD,GADAnD,EAAOlS,KAAK4U,UAAUriB,IACG,GAAG8e,cAC5BiE,EAAmBtV,KAAKgV,2BAA2B9C,EAAK,IAAIb,cAC5D9B,EAAS,GACT9R,EAAI,EACGA,EAAI,GACT8R,EAAOtP,KAAKpE,SAASwZ,EAAkB5X,GAAI,IAAM5B,SAASyZ,EAAiB7X,GAAI,KAC/EA,IAEF,OAAO,IAAIuC,KAAKuP,E,CAChB,MAAOmF,GAEP,MAAM,IAAIvZ,MAAM,qD,GAIpByU,EAAO1O,KAAK0T,UAAY,SAASriB,GAC/B,IAAIsiB,EAAYvZ,EAAOwZ,EACvB,IAAIxZ,EAAQ/I,EAAO+I,MAAM,oBACvBuZ,EAAahZ,SAASP,EAAM,MACV,GAAKuZ,GAAc,IAOnC,OANAC,EAAS,CAAC9U,KAAK0I,MAAMpN,EAAM,IAAKuZ,GAChCzc,OAAO2c,eAAeD,EAAQ,WAAY,CACxChiB,MAAO,WACL,OAAOkN,KAAKoK,KAAK,I,IAGd0K,EAGX,MAAM,IAAI3Z,MAAM,0D,EAGlByU,EAAO6E,QAAU,SAASliB,GACxB,OAAOqd,EAAO1O,KAAKuT,QAAQliB,IAAWqd,EAAO3O,KAAKwT,QAAQliB,E,EAG5Dqd,EAAOlH,MAAQ,SAASnW,GACtB,GAAIqd,EAAO1O,KAAKuT,QAAQliB,GACtB,OAAOqd,EAAO1O,KAAKwH,MAAMnW,GACpB,GAAIqd,EAAO3O,KAAKwT,QAAQliB,GAC7B,OAAOqd,EAAO3O,KAAKyH,MAAMnW,GAEzB,MAAM,IAAI4I,MAAM,uD,EAIpByU,EAAOgF,UAAY,SAASriB,GAE1B,IACE,OAAOqd,EAAO1O,KAAK0T,UAAUriB,E,CAC7B,MAAOmiB,GAEP,IACE,OAAO9E,EAAO3O,KAAK2T,UAAUriB,E,CAC7B,MAAOmiB,GAEP,MAAM,IAAIvZ,MAAM,4D,IAKtByU,EAAO4F,cAAgB,SAASpC,GAC9B,IAAIjgB,EAEJ,GAAe,KADfA,EAASigB,EAAMjgB,QAEb,OAAO,IAAIyc,EAAO3O,KAAKmS,GAClB,GAAe,KAAXjgB,EACT,OAAO,IAAIyc,EAAO1O,KAAKkS,GAEvB,MAAM,IAAIjY,MAAM,+D,EAIpByU,EAAO6F,QAAU,SAASljB,GACxB,IAAI8gB,EAEJ,MAAoB,UADpBA,EAAOrT,KAAK0I,MAAMnW,IACTye,QAAqBqC,EAAK1R,sBAC1B0R,EAAKU,gBAELV,C,CAIZ,GAAEE,KAAKmC,E,qBC7pBR,MAAMC,EAAY,SAAUxV,GACzB,IAAKyV,EAAUzV,GACZ,MAAM,IAAIhF,MAAM,oBAAsBgF,GAIzC,MAAM0V,GAFN1V,EAAIA,EAAE4L,eAEOrQ,MAAM,SACnB,GAAIma,EAAG1iB,OAAS,EACb,MAAM,IAAIgI,MAAM,oBAAsBgF,GAGzC,IAAI2V,EAAW,GACf,GAAiB,GAAbD,EAAG1iB,QAGJ,GADA2iB,EAAW3V,EAAEzE,MAAM,OACK,IAApBoa,EAAS3iB,OACV,MAAM,IAAIgI,MAAM,oBAAsBgF,QAErC,GAAiB,GAAb0V,EAAG1iB,OAAa,CAExB,MAAM4iB,EAAIF,EAAG,GACPG,EAAIH,EAAG,GACPI,EAAKF,EAAEra,MAAM,OACbwa,EAAKF,EAAEta,MAAM,OACnB,IAAK,IAAI+B,KAAKwY,EACXH,EAASrY,GAAKwY,EAAGxY,GAEpB,IAAK,IAAIA,EAAIyY,EAAG/iB,OAAQsK,EAAI,IAAKA,EAC9BqY,EAAS,GAAKI,EAAG/iB,OAASsK,IAAMyY,EAAGzY,EAAI,E,CAG7C,IAAK,IAAIA,EAAI,EAAGA,EAAI,IAAKA,OACFyI,IAAhB4P,EAASrY,KACVqY,EAASrY,GAAK,QAEjBqY,EAASrY,GAAK0Y,EAASL,EAASrY,GAAI,IAAK,GAE5C,OAAOqY,EAAS1L,KAAK,I,EAGlBgM,EAAa,SAAUjW,GAC1B,IAAKyV,EAAUzV,GACZ,MAAM,IAAIhF,MAAM,oBAAsBgF,GAQzC,MAAM2V,GADN3V,GADAA,GADAA,GADAA,GADAA,GADAA,EAAIwV,EAAUxV,IACR3N,QAAQ,QAAS,MACjBA,QAAQ,SAAU,MAClBA,QAAQ,QAAS,MACjBA,QAAQ,OAAQ,MAChBA,QAAQ,KAAM,MACDkJ,MAAM,OACzB,IAAI2a,GAAgB,EAChBC,GAAkB,EAClBC,EAAa,EACbC,GAAe,EACfC,EAAU,EACd,IAAK,IAAIhZ,EAAI,EAAGA,EAAI,IAAKA,EAAG,CACzB,MAAMiZ,EAAUZ,EAASrY,GACzB,IAAIkZ,EAAqB,MAAZD,EACTC,IAAUN,IACXG,EAAc/Y,IAEZkZ,GAASN,IACXI,EAAUhZ,EAAI+Y,GAEbC,EAAU,GAAKA,EAAUF,IAC1BD,EAAiBE,EACjBD,EAAaE,GAEhBJ,EAA6B,MAAZK,C,CAsBpB,OApBIL,IACDI,EAAU,EAAID,GAEbC,EAAU,GAAKA,EAAUF,IAC1BD,EAAiBE,EACjBD,EAAaE,GAIZH,GAAkB,GAAKC,EAAa,GACrCT,EAASc,OAAON,EAAgBC,EAAY,KAQ/CpW,GADAA,GADAA,GADAA,GAFAA,EAAI2V,EAAS1L,KAAK,MAEZ5X,QAAQ,SAAU,OAClBA,QAAQ,OAAQ,OAChBA,QAAQ,OAAQ,OAChBA,QAAQ,KAAM,K,EAMjBojB,EAAY,SAAUzV,GACzB,MAAO,mBAAmB/E,KAAK+E,E,EAG5BgW,EAAW,SAAUU,EAAGC,EAAGf,GAC9B,MAAMgB,EAAUD,EAAEE,OAAOjB,GAIzB,OAHIc,EAAE1jB,OAAS4jB,EAAQ5jB,SACpB0jB,EAAIE,EAAQ5D,UAAU,EAAG4D,EAAQ5jB,OAAS0jB,EAAE1jB,QAAU0jB,GAElDA,C,EAGJI,EAAW,SAAUC,GACxB,OAAOrb,SAASqb,EAAK,IAAIpb,SAAS,E,EAE/Bqb,EAAW,SAAUC,GACxB,OAAOvb,SAASub,EAAK,GAAGtb,SAAS,G,EAG9Bub,EAAY,SAAUhE,GACzB,MACMyC,EADQH,EAAUtC,GACD3X,MAAM,KAC7B,IAAI4b,EAAU,GACd,IAAK,MAAMZ,KAAWZ,EACnBwB,GAAWnB,EAASc,EAASP,GAAU,IAAK,IAE/C,OAAOY,C,EAGJC,EAAY,SAAUH,GACzB,MAAM/D,EAAO,GACb,IAAK,IAAI5V,EAAI,EAAGA,EAAI,IAAKA,EAAG,CACzB,MAAM+Z,EAAUJ,EAAI5C,OAAW,GAAJ/W,EAAQ,IAC7Bga,EAAatB,EAASgB,EAASK,GAAU,IAAK,GACpDnE,EAAKpT,KAAKwX,E,CAEb,OAAOpE,EAAKjJ,KAAK,I,EAGdsN,EAAe,SAAUrE,EAAMsE,EAAOC,EAAOC,EAAOC,GACvD,IAAKlC,EAAUvC,GACZ,MAAM,IAAIlY,MAAM,oBAAsBkY,GAMzC,GAFAwE,GAAS,EACTD,GAFAA,GAAS,IAEQ,KAHjBD,GAAS,GAIG,GAAKC,EAAQ,GAAKD,EAAQ,KAAOC,EAAQ,KAAOD,EAAQC,EACjE,MAAM,IAAIzc,MAAM,kBAEnB,MAAM4c,EAAM,GAENC,EADUX,EAAUhE,GACCmB,OAAO,EAAGmD,GAC/BM,EAAc,IAAIjB,OAAO,IAAMY,GAC/BM,EAAajiB,KAAKkf,IAAI,EAAGyC,EAAQD,GACvC,IAAK,IAAIla,EAAI,EAAGA,EAAIya,KACXL,GAASpa,GAAKoa,KADWpa,EAAG,CAIlC,MAAM0a,EAAYhC,EAAS1Y,EAAE3B,SAAS,GAAI,IAAK8b,EAAQD,GAEjDS,EAAUb,EADGS,EAAaG,EAAYF,GAEtCH,EACHC,EAAI9X,KAAKmW,EAAWgC,IAEpBL,EAAI9X,KAAKmY,E,CAQf,OAAOL,C,EAGJ7O,EAAQ,SAAUmK,EAAMsE,EAAOC,EAAOE,GACzC,IAAKlC,EAAUvC,GACZ,MAAM,IAAIlY,MAAM,oBAAsBkY,GAKzC,GADAuE,GADAA,GAAS,IACQ,KAFjBD,GAAS,GAGG,GAAKC,EAAQ,GAAKD,EAAQ,KAAOC,EAAQ,KAAOD,EAAQC,EACjE,MAAM,IAAIzc,MAAM,kBAEnB,MACM6c,EADUX,EAAUhE,GACCmB,OAAO,EAAGmD,GAC/BM,EAAc,IAAIjB,OAAO,IAAMY,GAC/BS,EAAeL,EAAa,IAAIhB,OAAOY,EAAQD,GAASM,EACxDK,EAAaN,EAAa,IAAIhB,OAAOY,EAAQD,GAASM,EAC5D,OAAMH,EACI,CACJS,MAAOnC,EAAWmB,EAAUc,IAC5BG,IAAKpC,EAAWmB,EAAUe,IAC1BG,KAAMxiB,KAAKkf,IAAI,EAAGyC,EAAQD,IAGtB,CACJY,MAAOhB,EAAUc,GACjBG,IAAKjB,EAAUe,GACfG,KAAMxiB,KAAKkf,IAAI,EAAGyC,EAAQD,G,EAK7Be,EAAe,SAAUrF,EAAMsE,EAAOC,EAAOC,EAAOC,GACvD,IAAKlC,EAAUvC,GACZ,MAAM,IAAIlY,MAAM,oBAAsBkY,GAOzC,GAFAuE,GAFAA,GAAS,IAEQ,IACjBC,GAFAA,GAAS,IAEQ,GAJjBF,GAAS,GAKG,GAAKC,EAAQ,GAAKD,EAAQ,KAAOC,EAAQ,KAAOD,EAAQC,EACjE,MAAM,IAAIzc,MAAM,kBAEnB,MAAM4c,EAAM,GAENC,EADUX,EAAUhE,GACCmB,OAAO,EAAGmD,GAC/BM,EAAc,IAAIjB,OAAO,IAAMY,GAC/BM,EAAajiB,KAAKkf,IAAI,EAAGyC,EAAQD,GACvC,IAAK,IAAIla,EAAI,EAAGA,EAAIya,GAAcza,EAAIoa,IAASpa,EAAG,CAE/C,IAAI0a,EAAY,GAChB,IAAK,IAAIjD,EAAI,EAAGA,EAAI0C,EAAQD,IAASzC,EAClCiD,GAAaliB,KAAKC,MAAsB,EAAhBD,KAAK0iB,UAEhC,MACMP,EAAUb,EADGS,EAAaG,EAAYF,GAEtCH,EACHC,EAAI9X,KAAKmW,EAAWgC,IAEpBL,EAAI9X,KAAKmY,E,CAOf,OAAOL,C,EAGJa,EAAM,SAAUvF,EAAMwF,GACzB,IAAKjD,EAAUvC,GACZ,MAAM,IAAIlY,MAAM,oBAAsBkY,GAGzC,IADAwF,GAAQ,GACG,GAAKA,EAAO,KAAO5iB,KAAKC,MAAM2iB,EAAO,IAAMA,EAAO,EAC1D,MAAM,IAAI1d,MAAM,kBAInB,OAFiBwa,EAAUtC,GACF7gB,QAAQ,KAAM,IAAIkJ,MAAM,IAAIiX,UACtCpH,MAAM,GAAI,IAAMsN,GAAQ,GAAGzO,KAAK,I,EAI/CxM,EAAA+X,UAAoBA,EACpB/X,EAAAwY,WAAqBA,EACrBxY,EAAA8Z,aAAuBA,EACvB9Z,EAAAsL,MAAgBA,EAChBtL,EAAA8a,aAAuBA,EACvB9a,EAAAgb,IAAcA,C,iFCjQDpX,EAAK6R,GACnB,OAAOzD,EAAO6E,QAAQpB,E,CAGxB,SAAgBnU,EAAQmU,GACtB,IACE,IACMrC,EADapB,EAAOlH,MAAM2K,GACRrC,OAExB,MAAa,SAATA,EACK,EACW,SAATA,EACF,EAGA,C,CAET,MAAO8H,GACP,OAAO,C,EAIX,SAAgB1S,EAAKiN,GACnB,OAAyB,IAAlBnU,EAAQmU,E,CAGjB,SAAgBhN,EAAKgN,GACnB,OAAyB,IAAlBnU,EAAQmU,E,CAGjB,SAAgBlN,EAAQ+C,GACtB,IACe0G,EAAOgF,UAAU1L,GAC9B,OAAO,C,CACP,MAAO4P,GACP,OAAO,C,EAIX,SAAgBC,EAAQ1F,EAAcnK,GACpC,GAAqB,iBAAVA,EAmBJ,IAAIA,GAA0B,iBAAVA,EAAoB,CAE7C,IAAK,IAAM8P,KAAe9P,EACxB,IAA0C,IAAtC6P,EAAQ1F,EAAMnK,EAAM8P,IACtB,OAAO,EAGX,OAAO,C,CAEP,OAAO,C,CA3BP,IAA4B,IAAxB9P,EAAM8D,QAAQ,KAgBhB,OAHAqG,EAAOhN,EAAKgN,GAAQ4F,EAAItD,UAAUtC,GAAQA,EAGnC7R,EAFP0H,EAAQ7C,EAAK6C,GAAS+P,EAAItD,UAAUzM,GAASA,IAEbmK,IAASnK,EAfzC,IACE,IAAMgQ,EAAahQ,EAAMxN,MAAM,KAEzByd,EAAavJ,EAAOlH,MAAM2K,GAC1B+F,EAAcxJ,EAAOlH,MAAMwQ,EAAW,IAG5C,OAAOC,EAAW7d,MAAM8d,EAAaF,EAAW,G,CAChD,MAAOJ,GACP,OAAO,C,EAqBf,SAAgBO,EAAQhG,GACtB,IACE,IAAI8F,EAAavJ,EAAOlH,MAAM2K,GAC1BrC,EAAOmI,EAAWnI,OAEtB,MAAa,SAATA,EAEKqC,EACW,SAATrC,EAELmI,EAAWxX,sBAGNwX,EAAWpF,gBAAgBjY,WAG3Bmd,EAAI7C,WAAW/C,GAGjB,I,CAET,MAAOyF,GACP,OAAO,I,EAIX,SAGgBQ,EAAUjG,GACxB,IACE,IAAI8F,EAAavJ,EAAOlH,MAAM2K,GAC1BrC,EAAOmI,EAAWnI,OAEtB,MAAa,SAATA,EAEKqC,EACW,SAATrC,EAELmI,EAAWxX,sBAGNwX,EAAWpF,gBAAgBjY,WAG3Bmd,EAAItD,UAAUtC,GAGhB,E,CAET,MAAOyF,GACP,MAAO,E,WCzHV,SAAU3kB,GAEV,MAKMolB,EAE2B,wBAF3BA,EAG2B,eAH3BA,EAI2B,EAJ3BA,EAK2B,GAGjCplB,EAAI4Z,eAAwB,EAC5B5Z,EAAIQ,uBAAwB,EAE5BR,EAAIqlB,0BAA4B,IAAMrlB,EAAIkB,aAAakkB,IAA8BA,EAErFplB,EAAIslB,wBAA0BhhB,SAGzBtE,EAAIkB,aAAakkB,GACbplB,EAAIkB,aAAakkB,SAGZplB,EAAIulB,eAWlBvlB,EAAIulB,aAAejhB,MAClB1E,EAAaI,EAAIwlB,KAAOJ,EACxBK,EAAaL,KAGb,IAEC,MAAMlS,QAAiBL,MAAMjT,EAAK,CACjC8lB,OAAW,OACX/T,KAAW,OACXgU,MAAW,WACXC,WAAW,EACXC,SAAW,UAGZ,IAAK3S,EAASC,GAGb,OAFAnT,EAAIwB,UAAUikB,GAAY,GAC1BzlB,EAAII,QAAQC,MAAM,uCAAyC6S,EAASE,OAAS,gBAAiBF,IACvF,EAGR,MAAM4S,QAAqB5S,EAASU,OAGpC,OAAKkS,EAAaC,SAMlB/lB,EAAIwB,UAAUikB,GAAY,IACnB,IANNzlB,EAAIwB,UAAUikB,GAAY,GAC1BzlB,EAAII,QAAQC,MAAM,8CAAgDiU,KAAK0R,UAAUF,KAC1E,EAMT,CAAE,MAAO3lB,GAGR,OAFAH,EAAIwB,UAAUikB,GAAY,GAC1BzlB,EAAII,QAAQC,MAAM,sCAAwCF,IACnD,CACR,GAGDH,EAAIimB,2BAA6B,CAACR,EAAaL,MAAqDplB,EAAIkB,aAAaukB,GAarHzlB,EAAI+C,sBAAwB,CAACmjB,EAASC,EAAUC,EAAS,mBAGxD,IAAIC,EAAWrmB,EAAIkB,aAAa,YAAY,IAAS,GAGrDmlB,EAASva,KAAKoa,GAGdlmB,EAAIwB,UAAU,WAAY6kB,GAAU,GAEI,mBAA7BrmB,EAAIsmB,sBACdtmB,EAAIsmB,qBAAqB,CACxBJ,QAAUA,EACVC,SAAUA,EACVC,OAAUA,KAKbpmB,EAAI8C,gBAAkBojB,IAGrB,IAAKtlB,aAAa0B,KAAKikB,6BAEtB,OADAvmB,EAAII,QAAQmE,IAAI,wCACT,EAIR,OADiBvE,EAAIkB,aAAa,YAAY,IAAS,IACvCkT,SAAS8R,IAa1BlmB,EAAI2Z,QAAU6M,GAOC,IAAIzL,OACjB,6KAMY9T,KAAKuf,GAGnBxmB,EAAIE,sBAAwBoE,MAAOvE,EAAW0mB,EAAmB,QAEhE,IAEC,IAAK1mB,EAAW,MAAMiH,MAAM,uCAI5B,KAFAjH,EAAYC,EAAIyZ,qCAAqC1Z,IAErC,MAAMiH,MAAM,uCAE5B,IAAIyR,EAGHA,EADuB,MAApBgO,EACQ7lB,aAAamZ,KAAKha,GAAW0Y,SAE7BgO,EAGP7lB,aAAamZ,KAAKha,UAChBC,EAAIgB,uBAAuB,CAACjB,IAGnC,IAAI2C,EAAU1C,EAAI0Z,mCAAmC3Z,EAAW0Y,GAEhEla,OAAOe,UAAUC,QAAQ,uBAAwBmD,GAEzB,MAApB+jB,GAA4B7lB,aAAamZ,KAAKha,GAAW0Y,WAAagO,SAClE7lB,aAAamZ,KAAKha,GAEzBa,aAAamZ,KAAKha,GAAW0Y,SAAW7X,aAAamZ,KAAKha,GAAW0Y,SAAWA,EAGjFzY,EAAI0mB,cAAc9lB,aAAamZ,KAEhC,CAAE,MAAO5Z,GACRH,EAAII,QAAQC,MAAM,UAAWF,EAC9B,GAGDH,EAAIyZ,qCAAuC1Z,IAE1C,IACC,OAAIa,cAAc0B,MAAMM,kBAA0B7C,EAE9Ca,aAAaC,SAASd,GAAW4mB,aAAqB/lB,aAAaC,SAASd,GAAW6mB,UAEpF7mB,CAER,CAAE,MAAOI,GACRC,QAAQC,MAAMF,EACf,GAGDH,EAAIO,iBAAmB,CAACsmB,EAAWC,KAE9BlmB,cAAc0B,MAAMukB,YAAYC,KAGnCD,EAAYA,EAAUze,OAAOxH,aAAa0B,KAAKukB,UAAUC,KAGzDD,EAAY,IAAI,IAAIE,IAAIF,KAGVhO,QAAQ,aAAe,GACpCgO,EAAUpE,OAAOoE,EAAUhO,QAAQ,YAAa,GAI7CgO,EAAUhO,QAAQ,SAAW,IAChCgO,EAAY,CAAC,UAIRA,EAAU5Q,KAAK,OAIvBjW,EAAI4Y,iBAAmBtU,MAAOvE,EAAW0Y,KAGxCA,EAAWvP,OAAOuP,GAElB,IAEC,IAAK1Y,EAAW,MAAMiH,MAAM,uCAI5B,KAFAjH,EAAYC,EAAIyZ,qCAAqC1Z,IAErC,MAAMiH,MAAM,uCAEvBpG,cAAcC,SAASd,UACrBC,EAAIgB,uBAAuB,CAACjB,IAGnC,IAAI2C,EAAU1C,EAAI0Z,mCAAmC3Z,EAAW0Y,GAEhEla,OAAOe,UAAUC,QAAQ,kBAAmBmD,GAMxC9B,cAAcmZ,KAAKha,GAEtBa,aAAamZ,KAAKha,GAAW0Y,SAAW7X,aAAamZ,KAAKha,GAAW0Y,SAAWA,GAG1E,SAAU7X,eAAeA,aAAamZ,KAAO,CAAC,GAEpDnZ,aAAamZ,KAAKha,GAAaC,EAAI0Z,mCAAmC3Z,EAAW0Y,IAGlFzY,EAAI0mB,cAAc9lB,aAAamZ,KAEhC,CAAE,MAAO5Z,GACRC,QAAQC,MAAMF,GAGdH,EAAIga,yBACL,GAGDha,EAAIW,SAAW,KAKZX,EAAIgnB,4BAC6C,IAA/C/iB,OAAOkB,KAAKnF,EAAIinB,oBAAoBjoB,OAOpCgB,EAAIinB,mBACPjnB,EAAIknB,0BAA0BlnB,EAAIinB,qBAKnCjnB,EAAI0mB,cAAc,CAAC,GACnB1mB,EAAIga,2BAZHha,EAAI0mB,cAAc,CAAC,IAgBrB1mB,EAAIga,wBAA0B,KAC7B,IAcCnH,MAAM7S,EAAImnB,SAAU,CACnBzB,OAAW,OACXC,MAAW,WACXyB,KAAW,IAAIC,gBAAgB,CAACC,OAAQ,uBACxC1B,WAAW,EACXC,SAAW,UAEV5a,KAAKiI,IACL,GAAIA,EAASC,GACZ,OAAOD,EAASU,OAEhB,MAAM5M,MAAM,2CAGbiE,KAAKnH,IAEL,IAAIA,EAAKiiB,QAgBR,MAAM/e,MAAM,yCAdPlD,EAAKA,KAAW,OAAGA,EAAKA,KAAW,KAAI,CAAC,GAC7C9D,EAAIknB,0BAA0BpjB,EAAKA,KAAW,MAC9C9D,EAAI0mB,cAAc5iB,EAAKA,KAAW,MAI9BA,EAAKA,KAAqB,iBAC7BlD,aAAa2mB,eAAiBtjB,OAAOujB,OACpC5mB,aAAa2mB,gBAAkB,CAAC,EAChCzjB,EAAKA,KAAqB,kBAShC,CAAE,MAAO3D,GACRC,QAAQC,MAAMF,EACf,GAIDH,EAAIgB,uBAAyBsD,UAQ5B,GANI1D,cAAcC,WAEjBC,EAAaA,EAAWuL,OAAOtM,KAAeA,KAAaa,aAAaC,YAIpEC,GAAoC,IAAtBA,EAAW9B,QAGzB4B,aAAayC,QAAQokB,SAGrBtf,MAAMI,QAAQzH,IAAqC,IAAtBA,EAAW9B,OAA7C,CAEA,IAEC,IAAI8E,EAAO,CACVwjB,OAAa,sBACbG,QAAa7mB,aAAayC,QAAQokB,QAClCllB,UAAa3B,aAAa0B,KAAKC,UAC/BmlB,YAAa5mB,GAGd,MAAMwkB,QAAgCtlB,EAAIslB,0BACpC1lB,EAA0B0lB,EAA0BtlB,EAAIwlB,KAAO,mBAAqBxlB,EAAImnB,SAExF5V,EAAU,CACfmU,OAAQ,OACRC,MAAQ,WACRyB,KAAQ9B,EAA0BhR,KAAK0R,UAAUliB,GAAQ,IAAIujB,gBAAgBvjB,IAI1EwhB,IACH/T,EAAQoW,QAAU,CAAC,eAAgB,qBAGpC,IAAIzU,QAAiBL,MAAMjT,EAAK2R,GAEhC,IAAK2B,EAASC,GACb,MAAM,IAAInM,MAAM,gDAAkDkM,EAASE,OAAS,iBAAmBF,EAAS0U,YAGjH,IAAIC,QAAqB3U,EAASU,OAElC,IAAKiU,EAAa9B,QACjB,MAAM,IAAI/e,MAAM,wCAA0C6gB,EAAa/jB,MAGxElD,aAAaC,SAAWoD,OAAOujB,OAAO,CAAC,EAAG5mB,aAAaC,SAAUgnB,EAAa/jB,KAE/E,CAAE,MAAO3D,GACRC,QAAQC,MAAMF,EACf,CAEA,OAAO,CA3C0D,GA8ClEH,EAAIknB,0BAA4BY,IAE/BlnB,aAAamZ,KAAW+N,EACxBlnB,aAAaC,SAAWoD,OAAOujB,OAAO,CAAC,EAAG5mB,aAAaC,SAAUinB,IAGlE9nB,EAAIoE,yBAA2BE,UAEzB1D,cAAcC,SAASd,UACrBC,EAAIgB,uBAAuB,CAACjB,IAG9Ba,cAAcC,SAASd,GAI3BC,EAAI+nB,qBAAqBhoB,IAHzBC,EAAIgoB,gCACJhoB,EAAII,QAAQmE,IAAI,mBAAmBxE,gIAMrCC,EAAI+nB,qBAAuBhoB,IAE1B,IAAI2C,EAAU1C,EAAI0Z,mCAAmC3Z,GAEhD2C,GAELnE,OAAOe,UAAUC,QAAQ,gBAAiBmD,IAG3C1C,EAAIgoB,8BAAgC,KACnCzpB,OAAOe,UAAUC,QAAQ,kBAG1BS,EAAIU,mBAAqB,CAACunB,EAAMC,EAAkB,KAAMvpB,EAAQ,QAE/D,IAAImF,EAAO,CACVmkB,KAAiBA,EACjBC,gBAAiBA,EACjBvpB,MAAiBA,GAGlBJ,OAAOe,UAAUC,QAAQ,sBAAuBuE,IAGjD9D,EAAIS,qBAAuBwnB,IAE1B,IAAInkB,EAAO,CACVmkB,KAAMA,GAGP1pB,OAAOe,UAAUC,QAAQ,wBAAyBuE,IAGnD9D,EAAIkZ,oBAAsB9a,IAEzB,IACC,OAAOA,EAAO+I,MAAM,gBAAgB,EACrC,CAAE,MAAOhH,GACRC,QAAQC,MAAMF,EACf,GAGDH,EAAImoB,oBAAsBpoB,IAEzB,IAAKA,EAAW,MAAMiH,MAAM,uCAI5B,KAFAjH,EAAYC,EAAIyZ,qCAAqC1Z,IAErC,MAAMiH,MAAM,uCAE5BzI,OAAOe,UAAUC,QAAQ,qBAAsBS,EAAI2C,+BAA+B5C,KAGnFC,EAAI2C,+BAAiC5C,IAEpC,IAAKA,EAAW,MAAMiH,MAAM,uCAE5B,IACC,GAAIpG,aAAaC,SAASd,GAEzB,OAAOC,EAAI0Z,mCAAmC3Z,EAEhD,CAAE,MAAOI,GACRC,QAAQC,MAAMF,EACf,GAGDH,EAAIyC,gCAAkC,KAErC,IACC,MAAI,CAAC,SAAU,WAAY,UAAW,YAAa,UAAUoW,QAAQjY,aAAa0B,KAAKE,eAAiB,GAChGjE,OAAO,uBAAuBuF,KAAK,KAI5C,CAAE,MAAO3D,GACRC,QAAQC,MAAMF,EACf,GAGDH,EAAIooB,4BAA8B1pB,IAEjCH,OAAOG,GAAQ2pB,IAAI,CAAC,SAAY,aAChC9pB,OAAOG,GAAQ4pB,OAAO,+CACtB/pB,OAAOG,GAAQQ,KAAK,+BAA+BmpB,IAAI,CACtD,UAAoB,KACpB,QAAoB,QACpB,SAAoB,WACpB,OAAoB,OACpB,IAAoB,IACpB,KAAoB,IACpB,MAAoB,IACpB,QAAoBznB,aAAa0B,KAAKimB,uBAAuBC,QAC7D,mBAAoB5nB,aAAa0B,KAAKimB,uBAAuBE,oBAI/DzoB,EAAI0oB,qBAAuB,KAE1B,IAEC,OADoB,IAAIrB,gBAAgBhmB,OAAOC,SAASqnB,QACnChb,IAAI,IAC1B,CAAE,MAAOxN,GACRC,QAAQC,MAAMF,EACf,GAID,IA4CIyoB,EA5CAC,EAAa,CAAC,EAElB7oB,EAAI8oB,iBAAmB,CAAC5kB,EAAS6kB,KAEhC7kB,EAAQqS,QAASyS,IAEhB,IACC,IAAIjpB,EAEAkpB,EAAY1qB,OAAOyqB,EAAMtqB,QAAQoF,KAAK,QAY1C,GANC/D,EAFGxB,OAAOyqB,EAAMtqB,QAAQwqB,KAAK,iBAAiBlqB,OAElCT,OAAOyqB,EAAMtqB,QAAQwqB,KAAK,iBAAiBplB,KAAK,MAEhDvF,OAAOyqB,EAAMtqB,QAAQQ,KAAK,iBAAiB4E,KAAK,OAIxD/D,EAAW,MAAMiH,MAAM,kCAExBgiB,EAAMG,eAETN,EAAWI,GAAa3e,WAAW,KAElCtK,EAAImoB,oBAAoBpoB,GACpBa,aAAa0B,KAAKimB,uBAAuBa,WAAWppB,EAAIooB,4BAA4BY,EAAMtqB,SACtC,IAApDkC,aAAa0B,KAAKimB,uBAAuB1F,QAAkBkG,EAASM,UAAUL,EAAMtqB,SACtFkC,aAAa0B,KAAKimB,uBAAuB9d,UAI5CS,aAAa2d,EAAWI,IACpBroB,aAAa0B,KAAKimB,uBAAuBa,WAAW7qB,OAAOyqB,EAAMtqB,QAAQQ,KAAK,+BAA+BoqB,SAEnH,CAAE,MAAOnpB,GACRC,QAAQC,MAAMF,EACf,KAMF,IAAIopB,EAAO,EAmHX,IAAIC,EAAiC,CACpCC,OAAQ,GACRC,KAAQ,IAGT,MAAMC,EAAiBC,GACC,CACtB,UACA,eACA,wBACGJ,EAA+BC,QAGX5gB,KAAKghB,GAAatrB,OAAOqrB,GAAMxQ,QAAQ,IAAMyQ,GAAW7qB,QAG3E8qB,EAAeF,GAEC,CACpB,yBACA,UACA,gBACA,kCACGJ,EAA+BE,MAGb7gB,KAAKghB,GAAatrB,OAAOqrB,GAAMG,OAAOC,SAASH,IAGhEI,EAAwBA,KAE7BT,EAhJmCU,MAEnC,IAAIC,EAAmB,CACtBV,OAAQ,GACRC,KAAQ,IAGT,IAEC,MAAMU,EAAuBA,CAACC,EAAUC,IAGhC/rB,OAAO8rB,GAAUE,UAAUvrB,SAAWT,OAAO+rB,GAAUC,UAAUvrB,OAGnEwrB,EAA0BA,CAACH,EAAUC,IAEtC/rB,OAAO8rB,GAAUI,SAASC,GAAGnsB,OAAO+rB,GAAUG,UAC1C,CACNE,KAAMpsB,OAAO8rB,GAAUI,SACvB3D,KAAM,QAID,CACN6D,KAAMpsB,OAAO8rB,GAAUE,UAAUhR,IAAIhb,OAAO+rB,GAAUC,WAAWtO,QACjE6K,KAAM,UAIF8D,EAAmB5R,GAEjBza,OAAOya,GAAS9Z,KAAK,iBAAiBF,OAGxC6rB,EAAiBA,CAACC,EAAUC,IAQ1BD,EAASze,OAAO1N,GAASosB,EAAS3W,SAASzV,IAAQ,IAAM,KAG3DqsB,EAAgB1rB,SAAS2rB,iBAAiB,iBAGhD,GAA6B,IAAzBD,EAAchsB,OAEjB,OAAOmrB,EAMR,IAAK,IAAI7gB,EAAI,EAAGA,EAAI0hB,EAAchsB,OAAS,EAAGsK,IAAK,CAIlD,IAAK8gB,EAAqBY,EAAc1hB,GAAI0hB,EAAc1hB,EAAI,IAAK,CAElEA,IACA,QACD,CAEA,IAAI4hB,EAAeV,EAAwBQ,EAAc1hB,GAAI0hB,EAAc1hB,EAAI,IAK/E,GAA0B,WAAtB4hB,EAAapE,KAAmB,CAEnC,IAAIqE,EAAsBD,EAAaP,KAAKS,WAAWnP,QAAQ7c,KAAK,SAChEisB,EAAsBF,EAAsBA,EAAoB5jB,MAAM,KAAO,GAE7E+jB,EAAuBJ,EAAaP,KAAKS,WAAWnP,QAAQiN,OAAO9pB,KAAK,SAG5E,MAAMmsB,EAAcV,EAAeQ,EAFRC,EAAuBA,EAAqB/jB,MAAM,KAAO,IAIpF4iB,EAAiBV,OAAO3d,KAAKyf,EAC9B,MAAO,GAA0B,SAAtBL,EAAapE,KAAiB,CAGxC,IAAKoE,EAAaP,KAAKS,WAAWnP,QAAQ7c,KAAK,SAAU,SAGzD,IAAIosB,EAA8BN,EAAaP,KAAKS,WAAWnP,QAAQ7c,KAAK,SAASmI,MAAM,KAAK,GAEhG4iB,EAAiBT,KAAK5d,KAAK0f,EAC5B,CAKAliB,EAAIA,EAAIshB,EAAgBM,EAAaP,MAAQ,CAC9C,CAMA,OAHAR,EAAiBV,OAAS,IAAI,IAAI1C,IAAIoD,EAAiBV,SACvDU,EAAiBT,KAAS,IAAI,IAAI3C,IAAIoD,EAAiBT,OAEhDS,CAER,CAAE,MAAOhqB,GAER,OADAC,QAAQC,MAAMF,GACPgqB,CACR,GAmCiCD,GAE1B3rB,OAAO,iBACZiJ,IAAI,SAAU8B,EAAGsgB,GAEjB,OAAID,EAAcC,GACVrrB,OAAOqrB,GAAMa,SACVX,EAAYF,GACfrrB,OAAOsN,MAAMke,OACVxrB,OAAOqrB,GAAMxQ,QAAQ,YAAYpa,OACpCT,OAAOqrB,GAAMxQ,QAAQ,iBADtB,CAGR,IAGFpZ,EAAIsF,iCAAmC,KAEtC,IAEKtF,EAAIsG,gBAAgB,iBAAgB1F,aAAa0B,KAAKimB,uBAAuBa,WAAY,GAI7FR,EAAK,IAAI6C,qBAAqBzrB,EAAI8oB,iBAAkB,CACnDtD,KAAM,KAENkG,UAAW9qB,aAAa0B,KAAKimB,uBAAuBmD,YAGrDzB,IAAwBnR,KAAK,CAACxP,EAAGsgB,KAEhCrrB,OAAOqrB,EAAK,IAAI9lB,KAAK,OAAQylB,KAE7BX,EAAG+C,QAAQ/B,EAAK,KAElB,CAAE,MAAOzpB,GACRC,QAAQC,MAAMF,EACf,GAIDH,EAAIuF,qCAAuC,KAE1C,IAKC,IAAI2lB,EAAe3sB,OAAO,uBAAuBgsB,UAAUhR,IAAIhb,OAAO,uBAAuBgsB,WAAWtO,QAEpGiP,EAAalsB,QAChB4sB,EAAyBD,QAAQT,EAAa,GAAI,CACjD/mB,YAAe,EACf0nB,WAAe,EACfC,eAAe,GAGlB,CAAE,MAAO3rB,GACRC,QAAQC,MAAMF,EACf,GAID,MAAMyrB,EAA2B,IAAIG,iBAAiBC,IAErDA,EAAUzV,QAAQ0V,IACjB,IAAIC,EAAWD,EAASE,WACxB,GAAiB,OAAbD,EAAmB,CACV3tB,OAAO2tB,GACbpT,KAAK,CAACxP,EAAGqhB,MAMbhB,EAAcgB,IAASb,EAAYa,KAI/ByB,EAAuBzB,KAC1BpsB,OAAOosB,GAAM7mB,KAAK,OAAQylB,KAC1BX,EAAG+C,QAAQhB,KAIf,MAIF,IAAIyB,EAAyBxC,MACzBrrB,OAAOqrB,GAAM1qB,KAAK,iBAAiBF,SACrCT,OAAOqrB,GAAMyC,SAAS,iBAAiBrtB,QAgBzCgB,EAAIssB,UAAY,CAAC7G,EAAY8G,EAAc,GAAIC,EAAa,QAE3D,GAAIA,EAAY,CAEf,IAAI9J,EAAI,IAAI1gB,KACZ0gB,EAAE+J,QAAQ/J,EAAEgK,UAA0B,GAAbF,EAAkB,GAAK,GAAK,KACrD,IAAIG,EAAc,WAAajK,EAAEkK,cACjCttB,SAASutB,OAASpH,EAAa,IAAM8G,EAAc,IAAMI,EAAU,SACpE,MACCrtB,SAASutB,OAASpH,EAAa,IAAM8G,EAAc,WAcrDvsB,EAAI8sB,UAAYrH,IAEf,IAAIsH,EAAgBtH,EAAa,IAE7BuH,EADgBC,mBAAmB3tB,SAASutB,QACdtlB,MAAM,KAExC,IAAK,IAAI+B,EAAI,EAAGA,EAAI0jB,EAAGhuB,OAAQsK,IAAK,CAEnC,IAAI4jB,EAAIF,EAAG1jB,GAEX,KAAsB,KAAf4jB,EAAEC,OAAO,IACfD,EAAIA,EAAElO,UAAU,GAGjB,GAAuB,GAAnBkO,EAAErU,QAAQkU,GACb,OAAOG,EAAElO,UAAU+N,EAAK/tB,OAAQkuB,EAAEluB,OAEpC,CAEA,MAAO,IAaRgB,EAAIotB,2BAA8BtO,IAEjC,IAAIuO,EAAU/tB,SAASutB,OAAOtlB,MAAM,KAEpC,IAAK,IAAI+B,EAAI,EAAGA,EAAI+jB,EAAQruB,OAAQsK,IAAK,CACxC,IAAIujB,EAASQ,EAAQ/jB,GAAGhL,OAExB,GAAIwgB,EAAM7X,KAAK4lB,GACd,OAAOA,CAET,CAEA,OAAO,GAGR7sB,EAAIstB,aAAe7H,IAClBzlB,EAAIssB,UAAU7G,EAAY,IAAK,IAgBhCzlB,EAAIwB,UAAY,CAACwB,EAAKrE,EAAO4uB,GAAa,EAAOC,GAAY,KAE5D,MAAMrO,EAASqO,EAAYxqB,EAAM,GAEjC,IAAIyqB,EAAaF,EAAavtB,EAAI0tB,kBAAoB1tB,EAAI2tB,eACtDC,EAAaL,EAAavtB,EAAI6tB,kBAAoB7tB,EAAI8tB,eAEtDhqB,EAAO2pB,EAAWtO,GACtBqO,EAAY1pB,EAAOnF,EAAQmF,EAAKd,GAAOrE,EAEvCivB,EAAW9pB,EAAMqb,IAGlBnf,EAAIkB,aAAe,CAAC8B,EAAKuqB,GAAa,EAAOC,GAAY,KAExD,MAAMrO,EAASqO,EAAYxqB,EAAM,GAEjC,IAAIc,EAAOypB,EAAavtB,EAAI0tB,kBAAkBvO,GAAUnf,EAAI2tB,eAAexO,GAE3E,OAAOqO,EAAY1pB,EAAOA,EAAKd,IAGhChD,EAAI+tB,cAAgB,CAAC/qB,EAAKuqB,GAAa,EAAOC,GAAY,KAEzD,MAAMrO,EAASqO,EAAYxqB,EAAM,GAEjC,IAAIyqB,EAAaF,EAAavtB,EAAI0tB,kBAAoB1tB,EAAI2tB,eACtDC,EAAaL,EAAavtB,EAAI6tB,kBAAoB7tB,EAAI8tB,eAEtDhqB,EAAO2pB,EAAWtO,GAGtB,GAAIqO,EAEH,IACKD,GAAclsB,OAAO2sB,cAAc3sB,OAAO2sB,aAAaC,WAAWjuB,EAAIkuB,qBAAqB/O,KAC1FoO,GAAclsB,OAAO8sB,gBAAgB9sB,OAAO8sB,eAAeF,WAAWjuB,EAAIouB,kBAAkBjP,GAElG,CAAE,MAAOhf,GACRC,QAAQC,MAAMF,EACf,aAKM2D,EAAKd,GAEZ4qB,EAAW9pB,EAAMqb,IAGlBnf,EAAI0mB,cAAgB5iB,IACnB9D,EAAIwB,UAAU,OAAQsC,GAAM,GAAO,IAGpC9D,EAAIinB,iBAAmB,IACfjnB,EAAIkB,aAAa,QAAQ,GAAO,GAGxClB,EAAIouB,kBAAoB,CAACjP,EAAS,MACjC,MAAMkP,EAAoB,oBAE1B,OAAIlP,EACIkP,EAAoB,IAAMlP,EAG3BkP,GAGRruB,EAAIkuB,qBAAwBI,IAE3B,MAAMD,EAAoB,uBAE1B,OAAIC,EACID,EAAoB,IAAMC,EAG3BD,GAGRruB,EAAI2tB,eAAiB,CAACxO,EAAS,MAE9B,GAAI9d,OAAO8sB,eAAgB,CAE1B,IAAIrqB,EAAOzC,OAAO8sB,eAAeI,QAAQvuB,EAAIouB,kBAAkBjP,IAE/D,OAAgB,OAATrb,EAAgBwQ,KAAKC,MAAMzQ,GAAQ,CAAC,CAC5C,CAAO,CAEN,IAAIA,EAAO9D,EAAI8sB,UAAU9sB,EAAIouB,kBAAkBjP,IAE/C,MAAgB,KAATrb,EAAcwQ,KAAKC,MAAMzQ,GAAQ,CAAC,CAC1C,GAGD9D,EAAI8tB,eAAiB,CAAChqB,EAAMwqB,EAAmB,MAC1CjtB,OAAO8sB,eACV9sB,OAAO8sB,eAAeK,QAAQxuB,EAAIouB,kBAAkBE,GAAmBha,KAAK0R,UAAUliB,IAGtF9D,EAAIssB,UAAUtsB,EAAIouB,kBAAkBE,GAAmBha,KAAK0R,UAAUliB,KAIxE9D,EAAI0tB,kBAAqBY,IAExB,GAAIjtB,OAAO2sB,aAAc,CAExB,IAAIlqB,EAAOzC,OAAO2sB,aAAaO,QAAQvuB,EAAIkuB,qBAAqBI,IAEhE,OAAgB,OAATxqB,EAAgBwQ,KAAKC,MAAMzQ,GAAQ,CAAC,CAC5C,CAAO,CAEN,IAAIA,EAAO9D,EAAI8sB,UAAU9sB,EAAIkuB,qBAAqBI,IAElD,MAAgB,KAATxqB,EAAcwQ,KAAKC,MAAMzQ,GAAQ,CAAC,CAC1C,GAGD9D,EAAI6tB,kBAAoB,CAAC/pB,EAAMwqB,EAAmB,MAE7CjtB,OAAO2sB,aACV3sB,OAAO2sB,aAAaQ,QAAQxuB,EAAIkuB,qBAAqBI,GAAmBha,KAAK0R,UAAUliB,IAGvF9D,EAAIssB,UAAUtsB,EAAIkuB,qBAAqBI,GAAmBha,KAAK0R,UAAUliB,GAAO,MAIlF9D,EAAIsmB,qBAAuBhiB,UAE1B,IAEC,IAAI4O,QAEMlT,EAAIslB,0BAEbpS,QAAiBL,MAAM7S,EAAIwlB,KAAO,uBAAwB,CACzDE,OAAW,OACXiC,QAAW,CACV,eAAgB,oBAGjBP,KAAW9S,KAAK0R,UAAU,CACzByI,SAAWC,EAAaxI,QACxByI,UAAWD,EAAavI,SACxBC,OAAWsI,EAAatI,SAGzBR,WAAW,EACXD,MAAW,WACXE,SAAW,WAKZ7lB,EAAII,QAAQmE,IAAI,gDAMhB2O,QAAiBL,MAAM7S,EAAImnB,SAAU,CACpCzB,OAAW,OACX0B,KAAW,IAAIC,gBAAgB,CAC9BC,OAAW,4BACXmH,SAAWC,EAAaxI,QACxByI,UAAWD,EAAavI,SACxBC,OAAWsI,EAAatI,SAGzBR,WAAW,EACXC,SAAW,WAIb,MAAMC,QAAqB5S,EAASU,OAEhCkS,EAAaC,QAChB/lB,EAAII,QAAQmE,IAAI,GAAIuhB,EAAahiB,MAEjC9D,EAAII,QAAQC,MAAM,GAAIylB,EAAahiB,KAGrC,CAAE,MAAO3D,GACRC,QAAQC,MAAMF,EACf,GAGDH,EAAI6Z,8BAAgCb,IAEnC,MAAMnK,EAAOtQ,OAAOya,GAAS9Z,KAAK,mBAAmBA,KAAK,KAAKE,KAAK,QACpE,GAAIyP,EAAM,OAAO7O,EAAIC,6BAA6B,IAAIJ,IAAIgP,IAE1D,MAAM9O,EAAYxB,OAAOya,GAAS9Z,KAAK,qBAAqB+c,QAAQ7c,KAAK,mBACzE,OAAOW,GAAwB,MAGhCC,EAAI8Z,oCAAsCd,GAElCza,OAAOya,GAAS9Z,KAAK,QAAQC,OAAS,KAG9Ca,EAAIC,6BAA+BL,IAElC,IAGIG,EAFA6uB,EADe,IAAIvH,gBAAgBznB,EAAI+oB,QACXhb,IAAI,eAUpC,OALC5N,EADgE,IAA7Da,aAAa2mB,eAAeqH,GAA2B,aAC9ChuB,aAAa2mB,eAAeqH,GAAyB,WAErDhuB,aAAa2mB,eAAeqH,GAA2B,aAG7D7uB,GAGRC,EAAIe,2BAA6B,IAChCxC,OAAO,KAAKiJ,IAAI,WACf,IAAIqH,EAAOtQ,OAAOsN,MAAMzM,KAAK,QAE7B,GAAIyP,GAAQA,EAAKuF,SAAS,iBAAkB,CAC3C,IAAIlN,EAAU2H,EAAK1H,MAAM,uBACzB,GAAID,EAAS,OAAOA,EAAQ,EAC7B,CACD,GAAGyG,MAEJ3N,EAAI0Z,mCAAqC,CAAC3Z,EAAW0Y,EAAW,KAG/D,IAAK7X,aAAaC,SAASd,GAAY,OAAO,KAE9C,IAAI2C,EAAU,CACb9D,GAAemB,EAAU4H,WACzBknB,UAAejuB,aAAaC,SAASd,GAAW8uB,UAChD9B,KAAensB,aAAaC,SAASd,GAAWgtB,KAChD+B,UAAeluB,aAAa0B,KAAKwsB,UACjCC,MAAenuB,aAAaC,SAASd,GAAWgvB,MAChDC,SAAepuB,aAAaC,SAASd,GAAWivB,SAChDC,QAAeruB,aAAaC,SAASd,GAAWkvB,QAChDC,cAAetuB,aAAaC,SAASd,GAAWovB,SAChD1W,SAAeA,EACf2W,MAAexuB,aAAaC,SAASd,GAAWqvB,MAChDC,SAAezuB,aAAa0B,KAAK+sB,SACjCC,YAAe1uB,aAAaC,SAASd,GAAWuvB,YAChD3I,aAAe/lB,aAAaC,SAASd,GAAW4mB,aAChDC,UAAehmB,aAAaC,SAASd,GAAW6mB,WAKjD,OAFIlkB,EAAQikB,eAAcjkB,EAA6B,oBAAI9B,aAAaC,SAASd,GAAWwvB,qBAErF7sB,GAGR1C,EAAIwvB,mBAAqB,CAACC,EAAS,WAElC,IAAIC,EAOJ,GALAA,EAAe,CACdjuB,MAAO,UACPkuB,MAAO,WAGJ3vB,EAAI8sB,UAAU4C,EAAaD,IAAU,CAIxC,OAFiBzvB,EAAI8sB,UAAU4C,EAAaD,IAChBtoB,MAAM,oBACnB,EAChB,CACC,MAAO,IAITnH,EAAI4vB,aAAe,IAAM5gB,UAAUC,UAEnCjP,EAAI6vB,YAAc,KAAM,CACvBC,MAAQhuB,KAAKiuB,IAAIzwB,SAAS0wB,gBAAgBC,aAAe,EAAG5uB,OAAO6uB,YAAc,GACjFC,OAAQruB,KAAKiuB,IAAIzwB,SAAS0wB,gBAAgBI,cAAgB,EAAG/uB,OAAOgvB,aAAe,KAIpFrwB,EAAIswB,kBAAoB,KACvBlwB,QAAQmE,IAAI3D,aAAamK,UAe1B,MAAMwlB,EAAgB,IAAIxJ,IAE1B/mB,EAAIwwB,qBAAuB,CAAC5wB,EAAK6wB,KAGhC,GAAIF,EAAchX,IAAI3Z,GAErB,OADAI,EAAII,QAAQmE,IAAI,0BAA4B3E,GACrCuK,QAAQC,UAGhB,MAAMsmB,EAAcC,GACZ,IAAIxmB,QAAQ,CAACC,EAASyL,KAG5B,GAAIvW,SAASsxB,cAAc,eAAeD,OAIzC,OAHAJ,EAAcM,IAAIF,GAClB3wB,EAAII,QAAQmE,IAAI,8BAAgCosB,QAChDvmB,IAID,MAAM0mB,EAAexxB,SAASyxB,cAAc,UAC5CD,EAAOE,IAAcL,EACrBG,EAAOxsB,OAAc,EACrBwsB,EAAOG,YAAc,YAErBH,EAAOI,OAAS,KACfX,EAAcM,IAAIF,GAClB3wB,EAAII,QAAQmE,IAAI,+BAAiCosB,GACjDvmB,KAGD0mB,EAAOK,QAAU,KAChBL,EAAOxH,SACPzT,EAAO,IAAI7O,MAAM,0BAA4B2pB,KAG9CrxB,SAAS8xB,KAAKC,YAAYP,KAI5B,OAAOJ,EAAW9wB,GAChBkW,MAAM,KACN,GAAI2a,EAEH,OADAzwB,EAAII,QAAQmE,IAAI,4CAA8CksB,GACvDC,EAAWD,GAEnB,MAAM,IAAIzpB,MAAM,kEAEhB8O,MAAOzV,IACP,GAAIA,EAAM0F,QAAQqO,SAAS,YAC1B,MAAM/T,EAEP,MAAM,IAAI2G,MAAM,wDAInBhH,EAAIsxB,kBAAoBC,IAAcA,EAAUC,MAAQD,EAAUE,WAAaF,EAAU9Y,SAEzFzY,EAAImD,mBAAqB,KACxB,IAAIW,EAAO9D,EAAI2tB,iBACf,OAAO7pB,GAAM4tB,iBAGd1xB,EAAIoD,mBAAqB,KACxB,IAAIU,EAAsB9D,EAAI2tB,iBAC9B7pB,EAAsB,iBAAI,EAC1B9D,EAAI8tB,eAAehqB,IAGpB9D,EAAI2xB,WAAartB,SAAY,IAAI6F,QAAQC,KACxC,SAAUU,IACT,GAAI,aAAexL,SAASsyB,WAAY,OAAOxnB,IAC/CE,WAAWQ,EAAY,GACvB,CAHD,KAMD9K,EAAI6xB,UAAY,IACR,IAAI1nB,QAAQC,KAClB,SAAUU,IACT,GAAI,gBAAkBxL,SAASsyB,YAAc,aAAetyB,SAASsyB,WAAY,OAAOxnB,IACxFE,WAAWQ,EAAY,GACvB,CAHD,KAOF9K,EAAI8xB,iBAAmB,KAClBzwB,OAAO8sB,gBACVlqB,OAAOkB,KAAK9D,OAAO8sB,gBAAgB5X,QAAQvT,IAC1C,GAAIA,EAAIoR,SAAS,gBAChB,OAAO,KAKH,GAGRpU,EAAIgnB,yBAA2B,IAAM1nB,SAASutB,OAAOzY,SAAS,6BAE9DpU,EAAIsG,gBAAkByrB,GACL,IAAI1K,gBAAgBhmB,OAAOC,SAASqnB,QACnCpP,IAAIwY,GAGtB/xB,EAAI0B,gBAAkBqwB,GACL,IAAI1K,gBAAgBhmB,OAAOC,SAASqnB,QACnChb,IAAIokB,GAItB/xB,EAAIgyB,UAAY,CAACC,EAAMC,IACfC,OAAOC,OAAOC,OAAOJ,EAAM,IAAIK,YAAY,SAASC,OAAOL,IAAMjnB,KAAKunB,GACrErqB,MAAM6U,UAAUxV,IAAI4X,KAAK,IAAIqT,WAAWD,GAAM/qB,IAAO,KAAOA,EAAEE,SAAS,KAAKyP,OAAO,IAAKnB,KAAK,KAItGjW,EAAI0yB,aAAe,KAElB,IAAI/zB,EAAQ,EAEZ,GAAIiC,cAAcmZ,KAEjB,IAAK,MAAM/W,KAAOpC,aAAamZ,KAAM,CAGpC,IAAIrX,EAAU9B,aAAamZ,KAAK/W,GAEhCrE,GAAS+D,EAAQ+V,SAAW/V,EAAQ0sB,KACrC,CAGD,OAAOzwB,GASRqB,EAAI2yB,uBAAyBC,IAE5B,IAAK,MAAMjb,KAAWib,EACrB,GAAI,IAAI7X,OAAOpD,GAAS1Q,KAAK5F,OAAOC,SAASuN,MAC5C,OAAO,EAIT,OAAO,GAWR7O,EAAI6yB,0BAA4B,KAE/B,IAAIC,EAAkB,CACrB,cACA,wBAQD,OALIlyB,cAAcyC,SAASyvB,kBAC1BA,EAAkB,IAAIA,KAAoBlyB,aAAayC,QAAQyvB,oBAI5DA,EAAgBjqB,KAAKkqB,GAAU1xB,OAAOC,SAASuN,KAAKuF,SAAS2e,MAChE3yB,QAAQ4yB,MAAM,kDACP,IAYThzB,EAAIizB,iBAAmB,CAACj0B,EAAS,MAChC,IAAIJ,EAAK,GACT,KAAOA,EAAGI,OAASA,GAClBJ,IAAOkD,KAAK0iB,SAAW,GAAG7c,SAAS,IAAIqX,UAAU,GAElD,OAAOpgB,EAAGogB,UAAU,EAAGhgB,IAGxBgB,EAAIkzB,kBAAoB,KACvB,IAAIntB,EAAU,kCACdA,GAAWnF,aAAamK,QAAQooB,IAAM,MAAQ,OAC9CptB,GAAW,cAAgBnF,aAAamK,QAAQqoB,OACZ,QAAhCxyB,aAAamK,QAAQqoB,QAAoBxyB,aAAamK,QAAQooB,MACjEptB,GAAW,uBAAyBnF,aAAamK,QAAQsoB,qBAAuB,MAAQ,OAEzFttB,GAAW,eAAiBnF,aAAamK,QAAQoP,QAEf,IAA9BvZ,aAAamK,QAAQuoB,KACxBlzB,QAAQmE,IAAIwB,GAEZ/F,EAAII,QAAQmE,IAAIwB,IAIlB/F,EAAIuzB,uBAAyB,IACY,QAAhC3yB,aAAamK,QAAQqoB,QAAoBxyB,aAAamK,QAAQooB,KAAOvyB,aAAamK,QAAQsoB,sBAAyD,QAAhCzyB,aAAamK,QAAQqoB,OAQjJ,IAAII,GAAmB,EAQvBxzB,EAAIyzB,wBAA0B,KAGzBD,IAGwB,aAAxBl0B,SAASsyB,YAWbrzB,OAAO,KACNm1B,MAIDp0B,SAASq0B,iBAAiB,mBAAoB,KAC7CD,MACE,IAjBFA,MAyBF,MAAMA,EAAuBA,KAGxBF,IAGJl0B,SAASs0B,cAAc,IAAIC,MAAM,kBAGjCL,GAAmB,IAGpBxzB,EAAI8zB,mBAAqBp1B,IAGxB,GAAIA,EAAOmQ,KAAM,CAKhB,IAAI2X,EAAQ9nB,EAAOmQ,KAAKxQ,QAAQ,UAAW,IAW3C,GARImoB,EAAM3N,QAAQ,MAAQ,IACzB2N,EAAQA,EAAMjf,MAAM,KAAK,IAI1Bif,EAAQA,EAAMnoB,QAAQ,MAAO,IAGzBmoB,GAASxmB,EAAI2Z,QAAQ6M,GACxB,OAAOA,CAET,CAEA,MAAO,IAGRxmB,EAAIoF,yBAA2BZ,IACqB,mBAAxCxE,EAAI+zB,iCACd/zB,EAAI+zB,gCAAgCvvB,IAWtCxE,EAAIwF,gCAAkClB,SAE9B,IAAI6F,QAAQC,IAGlB,IAAKxJ,cAAcsE,OAIlB,OAHAlF,EAAII,QAAQC,MAAM,+FAClBf,SAASs0B,cAAc,IAAIC,MAAM,uBACjCzpB,IAID,IAAIoF,EAAe5O,cAAcyC,SAASqB,iBAAiBC,oBAAoBO,QAAU,GAOzF,GAHAsK,EAAeA,EAAanD,OAAOpH,GAAarE,aAAasE,OAAOD,IAGxC,IAAxBuK,EAAaxQ,OAIhB,OAHAgB,EAAII,QAAQmE,IAAI,+DAChBjF,SAASs0B,cAAc,IAAIC,MAAM,uBACjCzpB,IAKD,MAAM4pB,EAAoBA,KACPxkB,EAAa7L,MAAMsB,IACnCrE,aAAasE,OAAOD,IAAcrE,aAAasE,OAAOD,GAAWgvB,SAIlE30B,SAASs0B,cAAc,IAAIC,MAAM,kBACjCzpB,KAEAE,WAAW0pB,EAAmB,MAIhCA,MAIFh0B,EAAIqF,oBAAsB,MAChBzE,aAAa0B,KAUvBtC,EAAIk0B,6BAA+B,CAACxxB,EAASuC,IACrCkvB,OAAOzxB,EAAQmsB,UAAUjuB,aAAasE,OAAOD,GAAWmvB,oBAAoBC,UAGpFr0B,EAAIs0B,wBAA0B,KAE7B,GAAI1zB,cAAc0B,MAAMiyB,eAAgB,OAAO,EAE/C,IAAIzV,EAAkB,IAAI/D,OAAO,yBAGjC,QAFsB/a,EAAIotB,2BAA2BtO,IAOtD9e,EAAIw0B,2BAA6B,KACxBx0B,EAAIs0B,0BAGbt0B,EAAI8O,YAAclP,IAGjBA,EAAMA,EAAItB,OAGN,0BAA0B2I,KAAKrH,GAC3BA,EAOD,YAHPA,EAAMA,EAAIvB,QAAQ,OAAQ,MAM3B2B,EAAIuD,mCAAqC,KACxC,IAAIkxB,EAAsB,KAE1Bl2B,OAAO,0BAA0BC,GAAG,iBAAkB,CAACC,EAAOuF,KAK7D,IAGC,IAAKpD,cAAc0B,MAAMM,kBAAmB,OAE5C,IAAI7C,EAAYC,EAAIyZ,qCAAqCzV,EAAUK,cAEnE,IAAKtE,EAAW,MAAMiH,MAAM,uCAGxBytB,IAAwBzwB,EAAUK,eACrCrE,EAAIoE,yBAAyBrE,GAC7B00B,EAAsBzwB,EAAUK,aAGlC,CAAE,MAAOlE,GACRC,QAAQC,MAAMF,EACf,KAgBFH,EAAI00B,uBAAyB,KAE5B,MAAMC,EAAQtzB,OAAOuzB,MAAQvzB,OAAOuzB,OAAS,GAE7CD,EAAMpe,QAAQ,SAAUse,GACvB,GAAkB,mBAAPA,EACV,IACCA,GACD,CAAE,MAAO10B,GACRH,EAAII,QAAQC,MAAM,kCAAmCF,EACtD,CAEF,GAGAw0B,EAAM7oB,KAAO,SAAU+oB,GACtB,GAAkB,mBAAPA,EACV,IACCA,GACD,CAAE,MAAO10B,GACRH,EAAII,QAAQC,MAAM,sCAAuCF,EAC1D,CAEF,EAGD,CA/pDA,CA+pDCkB,OAAOrB,IAAMqB,OAAOrB,KAAO,CAAC,EAAGzB,O,GCpqD7Bu2B,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBjjB,IAAjBkjB,EACH,OAAOA,EAAaxrB,QAGrB,IAAIuS,EAAS8Y,EAAyBE,GAAY,CAGjDvrB,QAAS,CAAC,GAOX,OAHAyrB,EAAoBF,GAAU5V,KAAKpD,EAAOvS,QAASuS,EAAQA,EAAOvS,QAASsrB,GAGpE/Y,EAAOvS,OACf,CAGAsrB,EAAoBI,EAAID,EtBzBpBl3B,EAAWiG,OAAOmxB,eAAkB/hB,GAASpP,OAAOmxB,eAAe/hB,GAASA,GAASA,EAAa,UAQtG0hB,EAAoBM,EAAI,SAAS12B,EAAOgT,GAEvC,GADU,EAAPA,IAAUhT,EAAQkN,KAAKlN,IAChB,EAAPgT,EAAU,OAAOhT,EACpB,GAAoB,iBAAVA,GAAsBA,EAAO,CACtC,GAAW,EAAPgT,GAAahT,EAAM22B,WAAY,OAAO32B,EAC1C,GAAW,GAAPgT,GAAoC,mBAAfhT,EAAMsM,KAAqB,OAAOtM,CAC5D,CACA,IAAImjB,EAAK7d,OAAOsxB,OAAO,MACvBR,EAAoBS,EAAE1T,GACtB,IAAI2T,EAAM,CAAC,EACX13B,EAAiBA,GAAkB,CAAC,KAAMC,EAAS,CAAC,GAAIA,EAAS,IAAKA,EAASA,IAC/E,IAAI,IAAI03B,EAAiB,EAAP/jB,GAAYhT,GAA0B,iBAAX+2B,GAAyC,mBAAXA,MAA4B33B,EAAe8a,QAAQ6c,GAAUA,EAAU13B,EAAS03B,GAC1JzxB,OAAO0xB,oBAAoBD,GAASnf,QAASvT,GAASyyB,EAAIzyB,GAAO,IAAOrE,EAAMqE,IAI/E,OAFAyyB,EAAa,QAAI,IAAM,EACvBV,EAAoBrS,EAAEZ,EAAI2T,GACnB3T,CACR,EuBxBAiT,EAAoBrS,EAAI,CAACjZ,EAASmsB,KACjC,IAAI,IAAI5yB,KAAO4yB,EACXb,EAAoBc,EAAED,EAAY5yB,KAAS+xB,EAAoBc,EAAEpsB,EAASzG,IAC5EiB,OAAO2c,eAAenX,EAASzG,EAAK,CAAE0K,YAAY,EAAMC,IAAKioB,EAAW5yB,MCJ3E+xB,EAAoBroB,EAAI,CAAC,EAGzBqoB,EAAoB50B,EAAK21B,GACjB3rB,QAAQ4rB,IAAI9xB,OAAOkB,KAAK4vB,EAAoBroB,GAAGS,OAAO,CAACmJ,EAAUtT,KACvE+xB,EAAoBroB,EAAE1J,GAAK8yB,EAASxf,GAC7BA,GACL,KCNJye,EAAoBiB,EAAKF,IAEZ,CAAC,IAAM,WAAW,IAAM,uBAAuB,IAAM,iBAAiB,IAAM,qBAAqB,IAAM,eAAe,IAAM,iBAAiB,IAAM,eAAe,IAAM,cAAc,IAAM,sBAAsBA,GAAW,IAAM,CAAC,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,WAAW,IAAM,YAAYA,GAAW,iBCHtZf,EAAoBkB,EAAI,WACvB,GAA0B,iBAAfC,WAAyB,OAAOA,WAC3C,IACC,OAAOrqB,MAAQ,IAAIsqB,SAAS,cAAb,EAChB,CAAE,MAAOh2B,GACR,GAAsB,iBAAXkB,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxB0zB,EAAoBc,EAAI,CAACxiB,EAAK+iB,IAAUnyB,OAAO+Y,UAAUqZ,eAAejX,KAAK/L,EAAK+iB,G1BA9En4B,EAAa,CAAC,EACdC,EAAoB,iCAExB62B,EAAoBrW,EAAI,CAAC9e,EAAK02B,EAAMtzB,EAAK8yB,KACxC,GAAG73B,EAAW2B,GAAQ3B,EAAW2B,GAAKkM,KAAKwqB,OAA3C,CACA,IAAIxF,EAAQyF,EACZ,QAAWxkB,IAAR/O,EAEF,IADA,IAAIwzB,EAAUl3B,SAASm3B,qBAAqB,UACpCntB,EAAI,EAAGA,EAAIktB,EAAQx3B,OAAQsK,IAAK,CACvC,IAAI4R,EAAIsb,EAAQltB,GAChB,GAAG4R,EAAEwb,aAAa,QAAU92B,GAAOsb,EAAEwb,aAAa,iBAAmBx4B,EAAoB8E,EAAK,CAAE8tB,EAAS5V,EAAG,KAAO,CACpH,CAEG4V,IACHyF,GAAa,GACbzF,EAASxxB,SAASyxB,cAAc,WAEzB4F,QAAU,QACb5B,EAAoB6B,IACvB9F,EAAO+F,aAAa,QAAS9B,EAAoB6B,IAElD9F,EAAO+F,aAAa,eAAgB34B,EAAoB8E,GAExD8tB,EAAOE,IAAMpxB,GAEd3B,EAAW2B,GAAO,CAAC02B,GACnB,IAAIQ,EAAmB,CAAC/M,EAAMtrB,KAE7BqyB,EAAOK,QAAUL,EAAOI,OAAS,KACjChmB,aAAaT,GACb,IAAIssB,EAAU94B,EAAW2B,GAIzB,UAHO3B,EAAW2B,GAClBkxB,EAAOkG,YAAclG,EAAOkG,WAAWC,YAAYnG,GACnDiG,GAAWA,EAAQxgB,QAASse,GAAQA,EAAGp2B,IACpCsrB,EAAM,OAAOA,EAAKtrB,IAElBgM,EAAUH,WAAWwsB,EAAiBI,KAAK,UAAMnlB,EAAW,CAAE+U,KAAM,UAAWpoB,OAAQoyB,IAAW,MACtGA,EAAOK,QAAU2F,EAAiBI,KAAK,KAAMpG,EAAOK,SACpDL,EAAOI,OAAS4F,EAAiBI,KAAK,KAAMpG,EAAOI,QACnDqF,GAAcj3B,SAAS8xB,KAAKC,YAAYP,EAnCkB,G2BH3DiE,EAAoBS,EAAK/rB,IACH,oBAAX0tB,QAA0BA,OAAOC,aAC1CnzB,OAAO2c,eAAenX,EAAS0tB,OAAOC,YAAa,CAAEz4B,MAAO,WAE7DsF,OAAO2c,eAAenX,EAAS,aAAc,CAAE9K,OAAO,K,MCLvD,IAAIgyB,EACAoE,EAAoBkB,EAAEoB,gBAAe1G,EAAYoE,EAAoBkB,EAAE30B,SAAW,IACtF,IAAIhC,EAAWy1B,EAAoBkB,EAAE32B,SACrC,IAAKqxB,GAAarxB,IACbA,EAASg4B,eAAkE,WAAjDh4B,EAASg4B,cAAcC,QAAQ9gB,gBAC5Dka,EAAYrxB,EAASg4B,cAActG,MAC/BL,GAAW,CACf,IAAI6F,EAAUl3B,EAASm3B,qBAAqB,UAC5C,GAAGD,EAAQx3B,OAEV,IADA,IAAIsK,EAAIktB,EAAQx3B,OAAS,EAClBsK,GAAK,KAAOqnB,IAAc,aAAa1pB,KAAK0pB,KAAaA,EAAY6F,EAAQltB,KAAK0nB,GAE3F,CAID,IAAKL,EAAW,MAAM,IAAI3pB,MAAM,yDAChC2pB,EAAYA,EAAUtyB,QAAQ,SAAU,IAAIA,QAAQ,OAAQ,IAAIA,QAAQ,QAAS,IAAIA,QAAQ,YAAa,KAC1G02B,EAAoBpS,EAAIgO,C,WCbxB,IAAI6G,EAAkB,CACrB,IAAK,GAGNzC,EAAoBroB,EAAEqU,EAAI,CAAC+U,EAASxf,KAElC,IAAImhB,EAAqB1C,EAAoBc,EAAE2B,EAAiB1B,GAAW0B,EAAgB1B,QAAW/jB,EACtG,GAA0B,IAAvB0lB,EAGF,GAAGA,EACFnhB,EAASxK,KAAK2rB,EAAmB,QAC3B,CAGL,IAAIC,EAAU,IAAIvtB,QAAQ,CAACC,EAASyL,IAAY4hB,EAAqBD,EAAgB1B,GAAW,CAAC1rB,EAASyL,IAC1GS,EAASxK,KAAK2rB,EAAmB,GAAKC,GAGtC,IAAI93B,EAAMm1B,EAAoBpS,EAAIoS,EAAoBiB,EAAEF,GAEpDz1B,EAAQ,IAAI2G,MAgBhB+tB,EAAoBrW,EAAE9e,EAfFnB,IACnB,GAAGs2B,EAAoBc,EAAE2B,EAAiB1B,KAEf,KAD1B2B,EAAqBD,EAAgB1B,MACR0B,EAAgB1B,QAAW/jB,GACrD0lB,GAAoB,CACtB,IAAIE,EAAYl5B,IAAyB,SAAfA,EAAMqoB,KAAkB,UAAYroB,EAAMqoB,MAChE8Q,EAAUn5B,GAASA,EAAMC,QAAUD,EAAMC,OAAOsyB,IACpD3wB,EAAM0F,QAAU,iBAAmB+vB,EAAU,cAAgB6B,EAAY,KAAOC,EAAU,IAC1Fv3B,EAAM0sB,KAAO,iBACb1sB,EAAMymB,KAAO6Q,EACbt3B,EAAMw3B,QAAUD,EAChBH,EAAmB,GAAGp3B,EACvB,GAGuC,SAAWy1B,EAASA,EAE/D,GAeH,IAAIgC,EAAuB,CAACC,EAA4Bj0B,KACvD,IAGIkxB,EAAUc,GAHTkC,EAAUC,EAAaC,GAAWp0B,EAGhBwF,EAAI,EAC3B,GAAG0uB,EAASnvB,KAAMjK,GAAgC,IAAxB44B,EAAgB54B,IAAa,CACtD,IAAIo2B,KAAYiD,EACZlD,EAAoBc,EAAEoC,EAAajD,KACrCD,EAAoBI,EAAEH,GAAYiD,EAAYjD,IAGhD,GAAGkD,EAAsBA,EAAQnD,EAClC,CAEA,IADGgD,GAA4BA,EAA2Bj0B,GACrDwF,EAAI0uB,EAASh5B,OAAQsK,IACzBwsB,EAAUkC,EAAS1uB,GAChByrB,EAAoBc,EAAE2B,EAAiB1B,IAAY0B,EAAgB1B,IACrE0B,EAAgB1B,GAAS,KAE1B0B,EAAgB1B,GAAW,GAKzBqC,EAAqBC,KAAgD,0CAAIA,KAAgD,2CAAK,GAClID,EAAmB5hB,QAAQuhB,EAAqBZ,KAAK,KAAM,IAC3DiB,EAAmBrsB,KAAOgsB,EAAqBZ,KAAK,KAAMiB,EAAmBrsB,KAAKorB,KAAKiB,G,KCjF1E7zB,WA2DZ,GAzDAmB,EAAQ,KACRA,EAAQ,WAGFzF,IAAIkK,qBAGJlK,IAAI4K,uBAONhK,cAAcyC,SAASg1B,kBAE1BC,EAAAA,EAA0B13B,aAAayC,QAAQg1B,iBAOhD5yB,EAAQ,IAGRA,EAAQ,KACRA,EAAQ,KACRA,EAAQ,KAGRzF,IAAI00B,yBAGJ10B,IAAIkzB,0BAGElzB,IAAI0F,0BACJ1F,IAAI4F,QAAQ2yB,OAKlBh6B,OAAO,KACNkH,EAAQ,OAITA,EAAQ,IAGR,kCAEAzF,IAAIsL,uBAIAtL,IAAI6yB,4BAA6B,OAGrC,MAAM2F,EAAe,GAkHrB,GA/GI53B,cAAcsE,QAAQuzB,QACzBD,EAAa1sB,KACZ,kCAIElL,cAAcsE,QAAQwzB,UACzBF,EAAa1sB,KACZ,mCAIElL,cAAcsE,QAAQyzB,QACzBH,EAAa1sB,KACZ,mCAIElL,cAAcsE,QAAQ0zB,UACzBJ,EAAa1sB,KACZ,wCAwFI3B,QAAQ4rB,IAAIyC,IAGgD,IAA9D53B,cAAcyC,SAASw1B,SAASC,0BAAqC,CACxE,MAAM,wBAACC,SAAiC,6BACxCA,GACD,CAGAz5B,SAASs0B,cAAc,IAAIC,MAAM,oBAGjCv0B,SAASs0B,cAAc,IAAIC,MAAM,kBAG3B7zB,IAAI2xB,aAEVryB,SAASs0B,cAAc,IAAIC,MAAM,cACjC7zB,IAAIyzB,0BAGJzzB,IAAIka,uBAGL8e,E","sources":["webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/create fake namespace object","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/load script","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/event_listeners.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/functions_loader.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/console.mjs","webpack://Pixel-Manager-for-WooCommerce/../../src/ipv6.ts","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/functions_main.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/hooks.js","webpack://Pixel-Manager-for-WooCommerce/../../src/index.ts","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/event-processor.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/ip_services.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/geo/geo.mjs","webpack://Pixel-Manager-for-WooCommerce/../../src/ipRange.ts","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/event_listeners_on_ready.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/version.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/pixel-registry.js","webpack://Pixel-Manager-for-WooCommerce/../../src/util.ts","webpack://Pixel-Manager-for-WooCommerce/../../src/ipv4.ts","webpack://Pixel-Manager-for-WooCommerce/../node_modules/ipaddr.js/lib/ipaddr.js","webpack://Pixel-Manager-for-WooCommerce/../node_modules/ip6/ip6.js","webpack://Pixel-Manager-for-WooCommerce/../src/range-check.ts","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/functions.js","webpack://Pixel-Manager-for-WooCommerce/webpack/bootstrap","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/define property getters","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/ensure chunk","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/get javascript chunk filename","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/global","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/hasOwnProperty shorthand","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/make namespace object","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/publicPath","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/jsonp chunk loading","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/main.js"],"sourcesContent":["var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; (typeof current == 'object' || typeof current == 'function') && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"Pixel Manager for WooCommerce:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// a function that removes all \\n and \\t and html tags from a string\nconst removeHtmlTagsAndWhitespace = string => {\n\n\tstring = string.replace(/<[^>]*>?/gm, \"\").replace(/\\n/gm, \"\").replace(/\\t/gm, \"\");\n\tstring = string.trim();\n\n\treturn string;\n};\n\n/**\n * add_shipping_info event\n */\n\n// trigger when #shipping_method is changed\njQuery(\"form.woocommerce-checkout\").on(\"change\", \"#shipping_method\", (event) => {\n\n\tif (!event.target?.value) return;\n\tif (!event.target?.id) return;\n\n\ttriggerAddShippingInfoEvent({\n\t\tslug: event.target.value,\n\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + event.target.id + \"']\").text()),\n\t});\n});\n\n// trigger when a shipping method is already selected on page load\njQuery(() => {\n\tif (jQuery(\"#shipping_method\").length) {\n\n\t\t// get the checked shipping method from #shipping_method\n\t\tlet checkedShippingMethod = jQuery(\"#shipping_method\").find(\":checked\");\n\n\t\t// if there is a checked shipping method\n\t\tif (checkedShippingMethod.length) {\n\n\t\t\tif (!checkedShippingMethod.val()) return;\n\t\t\tif (!checkedShippingMethod.attr(\"id\")) return;\n\n\t\t\ttriggerAddShippingInfoEvent({\n\t\t\t\tslug: checkedShippingMethod.val(),\n\t\t\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + checkedShippingMethod.attr(\"id\") + \"']\").text()),\n\t\t\t});\n\t\t}\n\t}\n});\n\n// trigger when a shipping method is selected on page load\nconst triggerAddShippingInfoEvent = shippingTier => {\n\tjQuery(document).trigger(\"pmw:add-shipping-info\", {shippingTier});\n};\n\n/**\n * add_payment_info event\n */\n\n\t  // flag to prevent double logging of payment method change on pageload\nlet paymentMethodChangeLogged = false;\n\n// trigger when a payment method is selected\njQuery(\"form.woocommerce-checkout\").on(\"change\", \"input[name=\\\"payment_method\\\"]\", event => {\n\n\tif (!event.target.value) return;\n\tif (!event.target.id) return;\n\n\ttriggerAddPaymentInfoEvent({\n\t\tslug: event.target.value,\n\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + event.target.id + \"']\").text()),\n\t});\n\n\tpaymentMethodChangeLogged = true;\n});\n\n// trigger when a payment method is already selected on page load\njQuery(() => {\n\n\t// prevent double logging of payment method change on pageload\n\tif (paymentMethodChangeLogged) return;\n\n\tlet checkedPaymentMethod = jQuery(\"input[name=\\\"payment_method\\\"]:checked\");\n\n\tif (checkedPaymentMethod.length) {\n\n\t\tif (!checkedPaymentMethod.val()) return;\n\t\tif (!checkedPaymentMethod.attr(\"id\")) return;\n\n\t\ttriggerAddPaymentInfoEvent({\n\t\t\tslug: checkedPaymentMethod.val(),\n\t\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + checkedPaymentMethod.attr(\"id\") + \"']\").text()),\n\t\t});\n\t}\n});\n\n// trigger when a payment method is selected on page load\nconst triggerAddPaymentInfoEvent = paymentType => {\n\tjQuery(document).trigger(\"pmw:add-payment-info\", {paymentType});\n};\n\n/**\n * remove_from_cart event\n *\n * Cannot be attached directly because the mini cart doesn't necessarily contain the remove button on page load.\n */\njQuery(document).on(\"click\", \".remove_from_cart_button, .remove\", (event) => {\n\n\t// console.log(\"remove_from_cart event\" + new Date().getTime())\n\n\ttry {\n\n\t\tlet url       = new URL(jQuery(event.currentTarget).attr(\"href\"));\n\t\tlet productId = pmw.getProductIdByCartItemKeyUrl(url);\n\n\t\tpmw.removeProductFromCart(productId);\n\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n/**\n * begin_checkout event\n *\n * Cannot be attached directly because the mini cart doesn't necessarily contain the remove button on page load.\n */\nlet checkoutButtonClasses = [\n\t// \".checkout\", // this is too generic. It triggers on the checkout page on some themes fore each interaction with the checkout form.\n\t\".checkout-button\",\n\t\".cart-checkout-button\",\n\t\".button.checkout\",\n\t\".xoo-wsc-ft-btn-checkout\", // https://xootix.com/side-cart-for-woocommerce/\n\t\".elementor-button--checkout\",\n\t\".xt_woofc-checkout\", // https://wordpress.org/plugins/woo-floating-cart-lite/\n\t\".fkcart-checkout--text\", // https://funnelkit.com/\n];\n\nconst checkoutButtonSelectors = pmw.prepareSelectors(checkoutButtonClasses, \"beginCheckout\");\n\n// https://wordpress.stackexchange.com/a/352171/68337\njQuery(document).on(\"click init_checkout\", checkoutButtonSelectors, () => {\n\tjQuery(document).trigger(\"pmw:begin-checkout\");\n});\n\njQuery(document).on(\"updated_cart_totals\", () => {\n\tjQuery(document).trigger(\"pmw:view-cart\");\n});\n\n/**\n * Set up PWM events\n */\n\n// track checkout option event: purchase click\n// https://wordpress.stackexchange.com/a/352171/68337\njQuery(document).on(\"pmwLoad\", (event) => {\n\tjQuery(document).on(\"payment_method_selected\", () => {\n\n\t\tif (false === pmw.paymentMethodSelected) {\n\t\t\tpmw.fireCheckoutProgress(3);\n\t\t}\n\n\t\tpmw.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val());\n\t\tpmw.paymentMethodSelected = true;\n\t});\n});\n\n// populate the pmwDataLayer with the cart items\njQuery(document).on(\"pmwLoad\", () => {\n\n\ttry {\n\t\tpmw.initCart();\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n// get all add-to-cart= products from backend\njQuery(document).on(\"pmwLoad\", () => {\n\n\tpmwDataLayer.products = pmwDataLayer.products || {};\n\n\t// scan page for add-to-cart= links\n\tlet productIds = pmw.getAddToCartLinkProductIds();\n\n\tpmw.getProductsFromBackend(productIds);\n});\n\n/**\n * Save the referrer into a cookie\n *\n * @returns {void}\n */\njQuery(document).on(\"pmwLoad\", () => {\n\n\t// If there is no referrer, then return\n\tif (!document.referrer) {\n\t\treturn;\n\t}\n\n\t// If the referrer is already stored, then return\n\tif (pmw.retrieveData(\"referrer\")) {\n\t\treturn;\n\t}\n\n\tlet referrerUrl      = new URL(document.referrer);\n\tlet referrerHostname = referrerUrl.hostname;\n\n\tif (referrerHostname !== window.location.host) {\n\t\tpmw.storeData(\"referrer\", referrerHostname);\n\t}\n});\n\n/**\n * Collect parameters from the URL\n * and save them to the PMW session storage.\n * Parameters:\n * - gclid\n * - wbraid\n * - gbraid\n * - fbclid\n * - ttclid\n * - ScCid\n * - epik\n *\n * @returns {void}\n * */\njQuery(document).on(\"pmwLoad\", () => {\n\n\tlet gclid = pmw.getUrlParameter(\"gclid\");\n\tif (gclid) pmw.storeData(\"gclid\", gclid);\n\n\tlet wbraid = pmw.getUrlParameter(\"wbraid\");\n\tif (wbraid) pmw.storeData(\"wbraid\", wbraid);\n\n\tlet gbraid = pmw.getUrlParameter(\"gbraid\");\n\tif (gbraid) pmw.storeData(\"gbraid\", gbraid);\n\n\t// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc\n\tlet fbclid = pmw.getUrlParameter(\"fbclid\");\n\tif (fbclid) {\n\t\tfbclid = \"fb.1.\" + Math.floor(Date.now() / 1000) + \".\" + fbclid;\n\t\tpmw.storeData(\"fbclid\", fbclid);\n\t}\n\n\tlet ttclid = pmw.getUrlParameter(\"ttclid\");\n\tif (ttclid) pmw.storeData(\"ttclid\", ttclid);\n\n\tlet scid = pmw.getUrlParameter(\"ScCid\");\n\tif (scid) pmw.storeData(\"scid\", scid);\n\n\tlet epik = pmw.getUrlParameter(\"epik\");\n\tif (epik) pmw.storeData(\"epik\", epik);\n});\n\n/**\n * Create our own load event in order to better handle script flow execution when JS \"optimizers\" shuffle the code.\n */\njQuery(document).on(\"pmwLoad\", () => {\n\t// document.addEventListener(\"pmwLoad\", function () {\n\ttry {\n\t\tif (typeof pmwDataLayer != \"undefined\" && !pmwDataLayer?.pmw_loaded) {\n\n\t\t\tjQuery(document).trigger(\"pmw:load-always\");\n\n\t\t\tif (pmwDataLayer?.shop) {\n\t\t\t\tif (\n\t\t\t\t\t\"product\" === pmwDataLayer.shop.page_type &&\n\t\t\t\t\t\"variable\" !== pmwDataLayer.shop.product_type &&\n\t\t\t\t\tpmw.getMainProductIdFromProductPage()\n\t\t\t\t) {\n\t\t\t\t\tlet product = pmw.getProductDataForViewItemEvent(pmw.getMainProductIdFromProductPage());\n\t\t\t\t\tjQuery(document).trigger(\"pmw:view-item\", product);\n\t\t\t\t} else if (\n\t\t\t\t\t\"product\" === pmwDataLayer.shop.page_type &&\n\t\t\t\t\t\"variable\" === pmwDataLayer.shop.product_type &&\n\t\t\t\t\t!pmwDataLayer?.shop?.variations_output &&\n\t\t\t\t\tpmw.getMainProductIdFromProductPage()\n\t\t\t\t) {\n\t\t\t\t\t// For variable products with variations_output disabled, fire view_item with parent product data\n\t\t\t\t\tlet product = pmw.getProductDataForViewItemEvent(pmw.getMainProductIdFromProductPage());\n\t\t\t\t\tjQuery(document).trigger(\"pmw:view-item\", product);\n\t\t\t\t} else if (\"product_category\" === pmwDataLayer.shop.page_type) {\n\t\t\t\t\tjQuery(document).trigger(\"pmw:view-category\");\n\t\t\t\t} else if (\"search\" === pmwDataLayer.shop.page_type) {\n\t\t\t\t\tjQuery(document).trigger(\"pmw:search\");\n\t\t\t\t} else if (\"cart\" === pmwDataLayer.shop.page_type) {\n\t\t\t\t\tjQuery(document).trigger(\"pmw:view-cart\");\n\t\t\t\t} else if (\"order_received_page\" === pmwDataLayer.shop.page_type) {\n\t\t\t\t\tif (pmwDataLayer?.order && !pmw.isOrderIdStored(pmwDataLayer.order.id)) {\n\t\t\t\t\t\tjQuery(document).trigger(\"pmw:purchase\");\n\t\t\t\t\t\tpmw.writeOrderIdToStorage(pmwDataLayer.order.id, pmwDataLayer.order.key);\n\t\t\t\t\t\tif (typeof pmw.acrRemoveCookie === \"function\") pmw.acrRemoveCookie();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tjQuery(document).trigger(\"pmw:everywhere-else\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tjQuery(document).trigger(\"pmw:everywhere-else\");\n\t\t\t}\n\n\t\t\tif (pmwDataLayer?.user?.id && !pmw.hasLoginEventFired()) {\n\t\t\t\tjQuery(document).trigger(\"pmw:login\");\n\t\t\t\tpmw.setLoginEventFired();\n\t\t\t}\n\n\t\t\tpmwDataLayer.pmw_loaded = true;\n\t\t}\n\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n/**\n * Register the show_variation event listener\n * in case lazy loading is enabled\n * because we have to register it immediately\n * and not after the onready event.\n */\nif (pmwDataLayer?.general?.lazy_load_pmw) {\n\tpmw.registerShowVariationEventListener();\n}\n\n/**\n * In case lazy loading is enabled\n * we need to trigger the view-item event on\n * preselected variations.\n *\n * Check if a variation is selected on a variable product page\n * and trigger the view-item event if a variation is selected\n *\n * Fallback for the jQuery(\".single_variation_wrap\").on(\"show_variation\", (event, variation) => {}) event listener\n * in case lazy loading is enabled and the event listener is not triggered.\n *\n * Only fires if variations_output is enabled, as the parent product view_item\n * is already triggered on page load when variations_output is disabled.\n */\njQuery(document).on(\"pmwLoad\", () => {\n\tif (!pmwDataLayer?.general?.lazy_load_pmw) return;\n\tif (!pmwDataLayer?.shop?.variations_output) return;\n\n\ttry {\n\t\tconst $variationForm = jQuery(\".variations_form\");\n\t\tif (!$variationForm.length) return;\n\n\t\tconst selectedValues = {};\n\t\tconst allSelected    = $variationForm.find(\"select\").toArray().every(select => {\n\t\t\tconst value = jQuery(select).val();\n\t\t\tif (value) {\n\t\t\t\tselectedValues[jQuery(select).attr(\"name\")] = value;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tif (!allSelected) return;\n\n\t\tconst productVariations = $variationForm.data(\"product_variations\");\n\t\tif (!productVariations) return;\n\n\t\tconst matchingVariation = productVariations.find(variation =>\n\t\t\tObject.entries(selectedValues).every(([key, value]) =>\n\t\t\t\tvariation.attributes[key] === value,\n\t\t\t),\n\t\t);\n\n\t\tif (matchingVariation) {\n\t\t\tpmw.triggerViewItemEventPrep(matchingVariation.variation_id);\n\t\t}\n\t} catch (e) {\n\t\tpmw.console.error(e);\n\t}\n});\n\n// Check if the REST endpoint is available and log an error if it is not\njQuery(document).on(\"pmwLoad\", async () => {\n\tif (pmw.retrieveData(\"restEndpointAvailable\") === false) pmw.console.error(\"REST endpoint is not available. Using admin-ajax.php instead.\");\n});\n\n/**\n * All s2s events\n */\n\n/**\n * PageView event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n * S2S transmission is controlled by the supportsPageViewS2S capability.\n */\njQuery(document).on(\"pmw:page-view\", async (event) => {\n\n\tpmw.console.log(\"pmw:page-view event fired\", {event});\n\n\t// Use the unified event processor\n\tconst payload = await pmw.processEvent(\"page_view\", {});\n\n\t// Only send to server if pageview S2S is enabled AND there are pixels with this capability\n\tif (pmwDataLayer?.general?.server_2_server?.pageview_event_s2s?.is_active) {\n\t\tconst pageViewS2SPixels = pmw.pixelRegistry.getPixelsWithCapability(\"supportsPageViewS2S\");\n\n\t\tif (pageViewS2SPixels.length > 0) {\n\t\t\t// Extract S2S data only for pixels that support pageview S2S\n\t\t\tconst s2sData = {event: \"page_view\"};\n\n\t\t\tfor (const pixelName of pageViewS2SPixels) {\n\t\t\t\tif (payload.pixels[pixelName]) {\n\t\t\t\t\ts2sData[pixelName] = payload.pixels[pixelName];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (Object.keys(s2sData).length > 1) { // More than just 'event' key\n\t\t\t\tpmw.sendEventPayloadToServer(s2sData);\n\t\t\t}\n\t\t}\n\t}\n});\n\n/**\n * Add to cart event\n *\n * Uses the new unified event processing system with filters\n */\njQuery(document).on(\"pmw:add-to-cart\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:add-to-cart event fired\", {event, product});\n\n\t// Use the new unified event processor\n\tawait pmw.processEvent(\"add_to_cart\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * Remove from cart event\n * Uses the new unified event processing system with filters\n */\njQuery(document).on(\"pmw:remove-from-cart\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:remove-from-cart event fired\", {event, product});\n\n\t// Use the new unified event processor\n\tawait pmw.processEvent(\"remove_from_cart\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * Select item event\n * Uses the new unified event processing system with filters\n */\njQuery(document).on(\"pmw:select-item\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:select-item event fired\", {event, product});\n\n\t// Use the new unified event processor\n\tawait pmw.processEvent(\"select_item\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * View cart event\n */\njQuery(document).on(\"pmw:view-cart\", (event) => {\n\n\tpmw.console.log(\"pmw:view-cart event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"view_cart\", {});\n});\n\n/**\n * Begin checkout event\n */\njQuery(document).on(\"pmw:begin-checkout\", (event) => {\n\n\tpmw.console.log(\"pmw:begin-checkout event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"begin_checkout\", {});\n});\n\n/**\n * Add Payment Info\n */\njQuery(document).on(\"pmw:add-payment-info\", (event) => {\n\n\tpmw.console.log(\"pmw:add-payment-info event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"add_payment_info\", {});\n});\n\n/**\n * Add to wishlist event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n */\njQuery(document).on(\"pmw:add-to-wishlist\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:add-to-wishlist event fired\", {event, product});\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"add_to_wishlist\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * View Item event\n */\njQuery(document).on(\"pmw:view-item\", (event, product = null) => {\n\n\tpmw.console.log(\"pmw:view-item event fired\", {event, product});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"view_item\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * View category event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n */\njQuery(document).on(\"pmw:view-category\", async (event, product = null) => {\n\n\tpmw.console.log(\"pmw:view-category event fired\", {event, product});\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"view_category\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * Search event\n */\njQuery(document).on(\"pmw:search\", (event) => {\n\n\tpmw.console.log(\"pmw:search event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"search\", {});\n});\n\n/**\n * Place order event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n */\njQuery(document).on(\"pmw:place-order\", async (event) => {\n\n\tpmw.console.log(\"pmw:place-order event fired\", {event});\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"place_order\", {});\n});\n\n/**\n * Purchase event\n */\njQuery(document).on(\"pmw:purchase\", async (event) => {\n\n\tpmw.console.log(\"pmw:purchase event fired\", {event});\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"purchase\", {\n\t\torder: pmwDataLayer.order,\n\t});\n});\n\n/**\n * Login event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n */\njQuery(document).on(\"pmw:login\", async () => {\n\n\tpmw.console.log(\"pmw:login event fired\");\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"login\", {});\n});\n\n/**\n * Run WooCommerce specific functions\n */\njQuery(document).on(\"pmw:ready\", async () => {\n\n\t// Only run if WooCommerce is active\n\tif (!pmw.isWooCommerceActive()) {\n\t\treturn;\n\t}\n\n\t/**\n\t * Run as soon as wpm namespace is loaded\n\t */\n\n\t// Watch for products visible in viewport\n\tpmw.startIntersectionObserverToWatch();\n\n\t// Watch for lazy loaded products\n\tpmw.startProductsMutationObserverToWatch();\n});\n\njQuery(document).on(\"pmw:load-pixels\", () => {\n\tpmw.waitForPixelsAndTriggerPageView();\n});\n","/**\n * Load all PMW functions\n *\n * Ignore event listeners. They need to be loaded after\n * we made sure that jQuery has been loaded.\n */\n\nrequire(\"./functions\")\n\n/**\n * Load consent management module as a chunk\n * @returns {Promise<void>}\n */\nwindow.pmw.loadConsentModule = async () => {\n\tconst consentModule = await import(/* webpackChunkName: \"consent-management\" */ \"./consent/consent.mjs\")\n\twindow.pmw.consent = consentModule\n\t\n\tconst apiModule = await import(/* webpackChunkName: \"consent-api\" */ \"./consent/api.mjs\")\n\twindow.pmw = window.pmw || {}\n\twindow.pmw.consent = window.pmw.consent || {}\n\twindow.pmw.consent.api = apiModule\n\t\n\treturn consentModule\n}\n\nwindow.pmw = window.pmw || {}\nwindow.pmw.console = require(\"./console.mjs\")\n\nrequire(\"./ip_services\")\n\n// #if process.env.TIER === 'premium'\n// if (pmw.canLoadPremiumFeatures()) {\n// \trequire(\"./functions_premium\")\n// }\n// #endif\n","/**\n * Logs a message to the console if the logger is enabled.\n *\n * @module console\n * @param message\n * @param objects\n * @public\n * @returns {void}\n */\nexport const log = (message, ...objects) => {\n\n\tif (!isLoggerEnabled()) return\n\n\tif (typeof message === \"object\") {\n\t\tconsole.log(\"Pixel Manager: \", message, ...objects)\n\t} else if (objects.length) {\n\t\tconsole.log(\"Pixel Manager: \" + message, ...objects)\n\t} else {\n\t\tconsole.log(\"Pixel Manager: \" + message)\n\t}\n}\n\n/**\n * Logs an error message to the console.\n *\n * @module console\n * @param message\n * @param objects\n * @public\n * @returns {void}\n */\nexport const error = (message, ...objects) => {\n\n\t// if (!isLoggerEnabled()) return\n\n\t// if message is an object, log the keys\n\tif (typeof message === \"object\") {\n\t\tconsole.error(\"Pixel Manager: \", message, ...objects)\n\t} else if (objects.length) {\n\t\tconsole.error(\"Pixel Manager: \" + message, ...objects)\n\t} else {\n\t\tconsole.error(\"Pixel Manager: \" + message)\n\t}\n}\n\n/**\n * Checks if the logger is enabled.\n *\n * @return {boolean}\n */\nconst isLoggerEnabled = () => {\n\n\tif (urlLoggerOff()) return false\n\n\tif (sessionLoggerEnabled()) return true\n\n\tif (urlLoggerOn()) return true\n\n\treturn !!pmwDataLayer?.general?.logger?.is_active\n}\n\n/**\n * Turn off the logger if the URL parameter is set.\n *\n * @return {boolean}\n */\nconst urlLoggerOff = () => {\n\n\tif (pmw.urlHasParameter(\"pmwloggeroff\")) {\n\t\tpmw.storeData(\"loggerEnabled\", false)\n\t}\n\n\treturn pmw.urlHasParameter(\"pmwloggeroff\")\n}\n\n/**\n * Check if the logger is enabled for the session.\n *\n * @return {boolean}\n */\nconst sessionLoggerEnabled = () => {\n\treturn pmw.retrieveData(\"loggerEnabled\")\n}\n\n/**\n * Turn on the logger if the URL parameter is set.\n *\n * @return {boolean}\n */\nconst urlLoggerOn = () => {\n\n\tif (pmw.urlHasParameter(\"pmwloggeron\")) {\n\t\tpmw.storeData(\"loggerEnabled\", true)\n\t}\n\n\treturn pmw.urlHasParameter(\"pmwloggeron\")\n}\n",null,"(function (pmw, $, undefined) {\n\n\tpmw.jQueryExists = async () => new Promise(resolve => {\n\n\t\t(function waitForjQuery() {\n\t\t\tif (typeof jQuery !== \"undefined\") return resolve()\n\t\t\tsetTimeout(waitForjQuery, 100)\n\t\t})()\n\t})\n\n\tpmw.waitForLibrary = (library, timeout = 5000, interval = 100) => {\n\n\t\tconst startTime = Date.now()\n\t\twhile (typeof window[library] === \"undefined\") {\n\t\t\t// Check if timeout in milliseconds has passed\n\t\t\tif (Date.now() - startTime > timeout) {\n\t\t\t\tbreak // Maximum wait time reached, exit the loop\n\t\t\t}\n\t\t\t// Wait for the interval in milliseconds before checking again\n\t\t\tsetTimeout(() => {\n\t\t\t}, interval)\n\t\t}\n\t}\n\n\tpmw.dataLayerFullyLoaded = async () => {\n\n\t\t// Promise that checks if the nested object pmwDataLayer.version is defined.\n\t\t// If so, resolve.\n\t\t// We must check for the nested object pmwDataLayer.version,\n\t\t// because the pmwDataLayer object can be defined early by adding products to the data layer through\n\t\t// template inline scripts. So we need to wait until the pmwDataLayer configuration objects\n\t\t// are defined.\n\t\tlet checkVar = new Promise((resolve) => {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (\n\t\t\t\t\ttypeof pmwDataLayer !== \"undefined\"\n\t\t\t\t\t&& typeof pmwDataLayer.version !== \"undefined\"\n\t\t\t\t) {\n\t\t\t\t\treturn resolve()\n\t\t\t\t}\n\t\t\t\tsetTimeout(waitForVar, 100)\n\t\t\t})()\n\t\t})\n\n\t\t// Set a timeout to log a message after 6 seconds\n\t\tlet logTimeoutId = setTimeout(() => {\n\t\t\tconsole.error(\"Pixel Manager error: The pmwDataLayer is not defined. Please make sure that the pmwDataLayer script snippet is inserted and not modified by any third-party plugin, such as a consent management platform or a JavaScript optimizer.\")\n\n\t\t}, 6000)\n\n\t\tcheckVar.then(() => {\n\t\t\tclearTimeout(logTimeoutId)\n\t\t})\n\n\t\treturn checkVar\n\t}\n\n\tpmw.wpHooksExists = async () => new Promise(resolve => {\n\t\t(function waitForVar() {\n\n\t\t\t// Resolve if wp.hooks is defined\n\t\t\tif (typeof wp !== \"undefined\" && typeof wp.hooks !== \"undefined\") return resolve()\n\t\t\tsetTimeout(waitForVar, 50)\n\t\t})()\n\t})\n\n\t/**\n\t * Load all WooCommerce hooks functions\n\t *\n\t * Includes safeguard in case the user changed the default load order for wp-hooks, or removed it completely.\n\t *\n\t * @returns {Promise<void>}\n\t */\n\tpmw.loadWcHooksFunctions = async () => {\n\t\t// Load all WooCommerce Blocks hooks\n\t\tawait pmw.wpHooksExists()\n\t\tawait import(/* webpackChunkName: \"wc-hooks\" */ \"./wc_hooks\")\n\t}\n\n}(window.pmw = window.pmw || {}, jQuery))\n","/**\n * WordPress-style hooks system for Pixel Manager\n *\n * Provides a filter API that allows developers to modify event data\n * at various points in the event processing pipeline.\n *\n * Available Filters:\n *\n * 1. pmw_event_payload_pre (payload, eventName)\n *    - Runs before pixel adaptation\n *    - Use case: Add global tracking params, modify core data\n *\n * 2. pmw_pixel_data_{pixelName} (pixelData, eventName, eventData, context)\n *    - Runs after each pixel's adapter\n *    - Use case: Modify pixel-specific data (e.g., pmw_pixel_data_facebook)\n *\n * 3. pmw_event_payload_{eventName} (payload, eventData)\n *    - Runs for specific event types\n *    - Use case: Modify all pixels for a specific event (e.g., pmw_event_payload_add_to_cart)\n *\n * 4. pmw_event_payload_post (payload, eventName)\n *    - Runs after all processing, before dispatch\n *    - Use case: Final validation, logging, debugging\n *\n * 5. pmw_pixel_firing_decision (decision, pixelName, eventName, mode)\n *    - Runs when determining whether to fire browser/server\n *    - decision: { fire_browser: boolean, fire_server: boolean }\n *    - Use case: Force server-only for specific pixels, disable certain pixels per-event\n *\n * @since 1.51.0\n */\n\n(function (pmw, $, undefined) {\n\n\t// Initialize pmw namespace if it doesn't exist\n\twindow.pmw = window.pmw || {};\n\n\t/**\n\t * Hook system for filtering event data\n\t */\n\tpmw.hooks = {\n\t\tfilters: {},\n\n\t\t/**\n\t\t * Add a filter callback\n\t\t *\n\t\t * @param {string} hookName - The filter hook name (e.g., 'pmw_event_payload')\n\t\t * @param {string} namespace - Unique identifier for your filter (e.g., 'my-plugin')\n\t\t * @param {function} callback - The filter function that modifies the value\n\t\t * @param {number} priority - Execution order, lower numbers run first (default: 10)\n\t\t *\n\t\t * @example\n\t\t * // Modify Facebook pixel data\n\t\t * pmw.hooks.addFilter('pmw_pixel_data_facebook', 'my-plugin', (data) => {\n\t\t *   data.custom_param = 'my_value';\n\t\t *   return data;\n\t\t * }, 10);\n\t\t *\n\t\t * @example\n\t\t * // Force server-only firing for Facebook\n\t\t * pmw.hooks.addFilter('pmw_pixel_firing_decision', 'my-plugin', (decision, pixelName) => {\n\t\t *   if (pixelName === 'facebook') {\n\t\t *     return { fire_browser: false, fire_server: true };\n\t\t *   }\n\t\t *   return decision;\n\t\t * });\n\t\t */\n\t\taddFilter: function (hookName, namespace, callback, priority = 10) {\n\t\t\tif (!hookName || typeof hookName !== \"string\") {\n\t\t\t\tpmw.console.error(\"Invalid hook name provided to addFilter\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!namespace || typeof namespace !== \"string\") {\n\t\t\t\tpmw.console.error(\"Invalid namespace provided to addFilter\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof callback !== \"function\") {\n\t\t\t\tpmw.console.error(\"Invalid callback provided to addFilter\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.filters[hookName]) {\n\t\t\t\tthis.filters[hookName] = [];\n\t\t\t}\n\n\t\t\tthis.filters[hookName].push({\n\t\t\t\tnamespace: namespace,\n\t\t\t\tcallback : callback,\n\t\t\t\tpriority : priority,\n\t\t\t});\n\n\t\t\t// Sort by priority (ascending order)\n\t\t\tthis.filters[hookName].sort((a, b) => a.priority - b.priority);\n\n\t\t\tpmw.console.log(`Filter added: ${hookName} (${namespace}) with priority ${priority}`);\n\t\t},\n\n\t\t/**\n\t\t * Apply all registered filters to a value\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @param {*} value - The value to filter\n\t\t * @param {...*} args - Additional arguments passed to filter callbacks\n\t\t * @returns {*} The filtered value\n\t\t *\n\t\t * @example\n\t\t * let payload = pmw.hooks.applyFilters('pmw_event_payload_pre', payload, eventName);\n\t\t */\n\t\tapplyFilters: function (hookName, value, ...args) {\n\t\t\tif (!this.filters[hookName] || this.filters[hookName].length === 0) {\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tlet filteredValue = value;\n\n\t\t\tfor (const filter of this.filters[hookName]) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = filter.callback(filteredValue, ...args);\n\n\t\t\t\t\t// Ensure callback returns a value\n\t\t\t\t\tif (result !== undefined) {\n\t\t\t\t\t\tfilteredValue = result;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpmw.console.warn(`Filter ${filter.namespace} on ${hookName} returned undefined, keeping previous value`);\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error(`Filter error in ${filter.namespace} on ${hookName}:`, e);\n\t\t\t\t\t// Continue with the previous value if this filter fails\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn filteredValue;\n\t\t},\n\n\t\t/**\n\t\t * Remove a specific filter\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @param {string} namespace - The namespace of the filter to remove\n\t\t *\n\t\t * @example\n\t\t * pmw.hooks.removeFilter('pmw_pixel_data_facebook', 'my-plugin');\n\t\t */\n\t\tremoveFilter: function (hookName, namespace) {\n\t\t\tif (!this.filters[hookName]) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst initialLength    = this.filters[hookName].length;\n\t\t\tthis.filters[hookName] = this.filters[hookName].filter(f => f.namespace !== namespace);\n\n\t\t\tif (this.filters[hookName].length < initialLength) {\n\t\t\t\tpmw.console.log(`Filter removed: ${hookName} (${namespace})`);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Remove all filters for a specific hook\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t */\n\t\tremoveAllFilters: function (hookName) {\n\t\t\tif (this.filters[hookName]) {\n\t\t\t\tdelete this.filters[hookName];\n\t\t\t\tpmw.console.log(`All filters removed for: ${hookName}`);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Check if a specific hook has any filters\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @param {string} namespace - Optional: check for a specific namespace\n\t\t * @returns {boolean}\n\t\t */\n\t\thasFilter: function (hookName, namespace = null) {\n\t\t\tif (!this.filters[hookName] || this.filters[hookName].length === 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (namespace) {\n\t\t\t\treturn this.filters[hookName].some(f => f.namespace === namespace);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\t/**\n\t\t * Get all registered filters for a hook\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @returns {Array} Array of filter objects\n\t\t */\n\t\tgetFilters: function (hookName) {\n\t\t\treturn this.filters[hookName] || [];\n\t\t},\n\t};\n\n\t// Backward compatibility: create pmw.hooks as an alias to pmw.hooks\n\tpmw.hooks = pmw.hooks;\n\n}(window.pmw = window.pmw || {}, jQuery));\n",null,"/**\n * Event Processor\n *\n * Unified event processing system that orchestrates:\n * - Building standardized event payloads\n * - Applying filters at multiple stages\n * - Adapting data for each active pixel\n * - Dispatching to browser pixels and S2S endpoints\n *\n * @since 1.51.0\n */\n\n(function (pmw, $, undefined) {\n\n\t/**\n\t * Get the current consent context\n\t *\n\t * Provides consent status in a structured format for event payloads.\n\t * This allows third-party integrations to make decisions based on\n\t * the current consent state.\n\t *\n\t * @returns {object} Consent context object\n\t */\n\tpmw.getConsentContext = function () {\n\t\tconst categories = pmw.consent?.categories?.get() || {\n\t\t\tstatistics : true,\n\t\t\tmarketing  : true,\n\t\t\tpreferences: true,\n\t\t\tnecessary  : true,\n\t\t};\n\n\t\treturn {\n\t\t\t// Category-level consent status\n\t\t\tcategories: {\n\t\t\t\tstatistics : categories.statistics,\n\t\t\t\tmarketing  : categories.marketing,\n\t\t\t\tpreferences: categories.preferences,\n\t\t\t\tnecessary  : categories.necessary,\n\t\t\t},\n\n\t\t\t// Whether the visitor has actively made a consent choice\n\t\t\tvisitor_has_chosen: pmw.consent?.settings?.get()?.visitorHasChosen ?? false,\n\n\t\t\t// Whether explicit consent mode is active\n\t\t\texplicit_mode: pmw.consent?.explicitConsentModeActive?.() ?? false,\n\t\t};\n\t};\n\n\t/**\n\t * Global event context that's added to all events\n\t *\n\t * @returns {object} Context object with user, session, page, and consent data\n\t */\n\tpmw.getEventContext = function () {\n\t\treturn {\n\t\t\ttimestamp : Math.floor(Date.now() / 1000),\n\t\t\turl       : window.location.href,\n\t\t\treferrer  : pmw.retrieveData(\"referrer\") ? pmw.makeFullUrl(pmw.retrieveData(\"referrer\")) : document.referrer,\n\t\t\tuser_agent: navigator.userAgent,\n\t\t\tpage_type : pmwDataLayer?.shop?.page_type,\n\t\t\tuser_id   : pmwDataLayer?.user?.id?.raw || null,\n\n\t\t\t// Consent status - for third-party integrations and internal use\n\t\t\tconsent: pmw.getConsentContext(),\n\t\t};\n\t};\n\n\t/**\n\t * Process an event through the unified pipeline\n\t *\n\t * This is the main entry point for processing events with the new filter system.\n\t *\n\t * @param {string} eventName - Standardized event name (e.g., 'add_to_cart', 'view_item')\n\t * @param {object} eventData - Core event data (product, cart, order, etc.)\n\t * @returns {Promise<object>} The processed payload\n\t */\n\tpmw.processEvent = async function (eventName, eventData) {\n\n\t\tpmw.console.log(`Processing event: ${eventName}`, eventData);\n\n\t\ttry {\n\t\t\t// 1. Create base payload with standardized structure\n\t\t\tlet payload = {\n\t\t\t\tevent     : eventName,\n\t\t\t\tevent_data: eventData,\n\t\t\t\tpixels    : {},\n\t\t\t\tcontext   : pmw.getEventContext(),\n\t\t\t};\n\n\t\t\t// 2. Apply pre-processing filter\n\t\t\t// Use case: Add global tracking params, modify core data before pixel adaptations\n\t\t\tpayload = pmw.hooks.applyFilters(\"pmw_event_payload_pre\", payload, eventName);\n\n\t\t\t// 3. Transform for each active pixel\n\t\t\tconst activePixels = pmw.pixelRegistry.getActivePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\tconst adapter = pmw.pixelRegistry.getAdapter(pixelName);\n\n\t\t\t\tif (!adapter || typeof adapter.adapt !== \"function\") {\n\t\t\t\t\tpmw.console.log(`No adapter found for pixel: ${pixelName}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\ttry {\n\t\t\t\t// Adapt event data to pixel-specific format (supports async adapters)\n\t\t\t\tlet pixelData = await adapter.adapt(payload.event_data, eventName, payload.context);\n\n\t\t\t\t// Adapters return null for events they don't support\n\t\t\t\t// This allows pixels to opt-out of specific events gracefully\n\t\t\t\t// (e.g., TikTok doesn't support page_view, Pinterest doesn't support add_to_wishlist)\n\t\t\t\tif (pixelData === null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Apply pixel-specific filter\n\t\t\t\t// Use case: Modify Facebook-specific data, add custom parameters per pixel\n\t\t\t\tpixelData = pmw.hooks.applyFilters(\n\t\t\t\t\t`pmw_pixel_data_${pixelName}`,\n\t\t\t\t\tpixelData,\n\t\t\t\t\teventName,\n\t\t\t\t\tpayload.event_data,\n\t\t\t\t\tpayload.context,\n\t\t\t\t);\n\n\t\t\t\tpayload.pixels[pixelName] = pixelData;\n\t\t\t} catch (e) {\n\t\t\t\tpmw.console.error(`Error adapting data for ${pixelName}:`, e);\n\t\t\t}\n\t\t\t}\n\n\t\t\t// 4. Apply event-specific filter\n\t\t\t// Use case: Modify all pixels for a specific event type (e.g., all add_to_cart events)\n\t\t\tpayload = pmw.hooks.applyFilters(\n\t\t\t\t`pmw_event_payload_${eventName}`,\n\t\t\t\tpayload,\n\t\t\t\tpayload.event_data,\n\t\t\t);\n\n\t\t\t// 5. Apply post-processing filter\n\t\t\t// Use case: Final validation, logging, debugging, cross-pixel modifications\n\t\t\tpayload = pmw.hooks.applyFilters(\"pmw_event_payload_post\", payload, eventName);\n\n\t\t\t// 6. Add firing decisions to payload for each pixel\n\t\t\tpayload.firing = {};\n\t\t\tfor (const pixelName of Object.keys(payload.pixels)) {\n\t\t\t\tpayload.firing[pixelName] = pmw.pixelRegistry.getFiringDecision(pixelName, eventName);\n\t\t\t}\n\n\t\t\t// 7. Dispatch to pixels\n\t\t\tawait pmw.dispatchToPixels(payload);\n\n\t\t\treturn payload;\n\n\t\t} catch (e) {\n\t\t\tpmw.console.error(`Error processing event ${eventName}:`, e);\n\t\t\tthrow e;\n\t\t}\n\t};\n\n\t/**\n\t * Dispatch the processed payload to pixels\n\t *\n\t * Unified dispatch system that:\n\t * 1. Dispatches a single pmw:{event} event with firing decisions per pixel\n\t * 2. Sends to server for pixels that need S2S\n\t *\n\t * @param {object} payload - The fully processed event payload with firing decisions\n\t * @returns {Promise<void>}\n\t */\n\tpmw.dispatchToPixels = async function (payload) {\n\n\t\tconst eventName = payload.event;\n\n\t\t// Dispatch unified event (replaces separate browser/s2s events)\n\t\t// Pixels check payload.firing[pixelName].fire_browser to decide if they should fire\n\t\tpmw.dispatchUnifiedEvent(payload);\n\n\t\t// Dispatch PUBLIC event for third-party integrations\n\t\t// This is the official public API - pmw:event:* events\n\t\t// Third parties should listen to these events, not the internal pmw:* events\n\t\tpmw.dispatchPublicEvent(payload);\n\n\t\t// Purchase events are handled entirely server-side and should never be sent from browser to server\n\t\t// to prevent duplicates and race conditions. However, browser-side pixels still need to fire.\n\t\tif (eventName === \"purchase\") {\n\t\t\tpmw.console.log(\"Purchase event - skipping browser-to-server transmission (handled server-side only)\");\n\t\t\treturn; // Return early, but browser pixels have already been dispatched above\n\t\t}\n\n\t\t// Only send to server if S2S is globally enabled\n\t\tif (pmwDataLayer?.general?.server_2_server?.active) {\n\t\t\t// Extract S2S data for server transmission\n\t\t\tconst s2sData = pmw.extractS2SData(payload);\n\n\t\t\t// Send to server if there's S2S data to send\n\t\t\tif (Object.keys(s2sData).length > 0) {\n\t\t\t\tconst serverPixels = pmw.pixelRegistry.getPixelsForServerFiring(eventName);\n\t\t\t\tpmw.console.log(`S2S enabled pixels for ${eventName}:`, serverPixels);\n\t\t\t\tawait pmw.sendEventPayloadToServer(s2sData);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Dispatch unified event to all pixels\n\t *\n\t * This is the new unified event system that replaces the separate pmw:browser:* and pmw:s2s:* events.\n\t * All pixels now listen to pmw:pixel:{event-name} and check payload.firing[pixelName].fire_browser\n\t * to determine if they should fire their browser pixel.\n\t *\n\t * NOTE: This is an INTERNAL event. Third parties should use pmw:event:* events instead.\n\t *\n\t * Event namespace:\n\t * - pmw:{event}        - Entry point events (triggers processEvent)\n\t * - pmw:pixel:{event}  - Pixel dispatch events (pixels listen to these)\n\t * - pmw:event:{event}  - Public API events (third-party integrations)\n\t *\n\t * @param {object} payload - The fully processed event payload with firing decisions\n\t */\n\tpmw.dispatchUnifiedEvent = function (payload) {\n\n\t\tconst activePixels = pmw.pixelRegistry.getActivePixels();\n\n\t\tif (activePixels.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Convert underscores to hyphens for event name\n\t\tconst eventName = payload.event.replace(/_/g, \"-\");\n\n\t\tpmw.console.log(`Dispatching unified event pmw:pixel:${eventName}`, {\n\t\t\tactivePixels : activePixels,\n\t\t\tfiringStatus : payload.firing,\n\t\t});\n\n\t\t// Dispatch single unified event to pixel namespace\n\t\t// Pixels check payload.firing[pixelName].fire_browser to decide whether to fire\n\t\tjQuery(document).trigger(`pmw:pixel:${eventName}`, payload);\n\t};\n\n\t/**\n\t * @deprecated Use pmw.dispatchUnifiedEvent() instead\n\t * Dispatch to browser-only pixels (internal) - LEGACY SUPPORT\n\t *\n\t * NOTE: This function is deprecated. Migrate to listening to pmw:* events\n\t * and checking payload.firing[pixelName].fire_browser\n\t *\n\t * @param {object} payload - The fully processed event payload\n\t */\n\tpmw.dispatchToBrowserPixels = function (payload) {\n\n\t\tconst browserPixels = pmw.pixelRegistry.getActiveBrowserOnlyPixels();\n\n\t\tif (browserPixels.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tpmw.console.log(`[DEPRECATED] Dispatching to browser-only pixels for ${payload.event}:`, browserPixels);\n\n\t\t// Trigger browser-specific event that browser-only pixels can listen to (internal)\n\t\t// This allows them to access the filtered, adapted data\n\t\t// Convert underscores to hyphens for event name\n\t\tconst browserEventName = payload.event.replace(/_/g, \"-\");\n\t\tjQuery(document).trigger(`pmw:browser:${browserEventName}`, payload);\n\t};\n\n\t/**\n\t * @deprecated Use pmw.dispatchUnifiedEvent() instead\n\t * Dispatch to S2S-capable pixels (internal) - LEGACY SUPPORT\n\t *\n\t * NOTE: This function is deprecated. Migrate to listening to pmw:* events\n\t * and checking payload.firing[pixelName].fire_browser\n\t *\n\t * @param {object} payload - The fully processed event payload\n\t */\n\tpmw.dispatchToS2SPixels = function (payload) {\n\n\t\tconst s2sPixels = pmw.pixelRegistry.getActiveS2SPixels();\n\n\t\tif (s2sPixels.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tpmw.console.log(`[DEPRECATED] Dispatching to S2S-capable pixels for ${payload.event}:`, s2sPixels);\n\n\t\t// Trigger S2S event that S2S-capable pixels listen to (internal)\n\t\t// This provides adapted data with event_id for deduplication between browser and server\n\t\t// Convert underscores to hyphens for event name\n\t\tconst s2sEventName = payload.event.replace(/_/g, \"-\");\n\t\tjQuery(document).trigger(`pmw:s2s:${s2sEventName}`, payload);\n\t};\n\n\t/**\n\t * Dispatch public event for third-party integrations\n\t *\n\t * This is the official PUBLIC API for third-party integrations.\n\t * Third parties should listen to pmw:event:* events to receive\n\t * fully processed payloads with all data including consent status.\n\t *\n\t * Available events:\n\t * - pmw:event:add-to-cart\n\t * - pmw:event:remove-from-cart\n\t * - pmw:event:view-item\n\t * - pmw:event:view-item-list\n\t * - pmw:event:select-item\n\t * - pmw:event:begin-checkout\n\t * - pmw:event:add-payment-info\n\t * - pmw:event:add-to-wishlist\n\t * - pmw:event:purchase\n\t * - pmw:event:search\n\t * - pmw:event:page-view\n\t *\n\t * @param {object} payload - The fully processed event payload\n\t */\n\tpmw.dispatchPublicEvent = function (payload) {\n\n\t\t// Convert underscores to hyphens for event name (e.g., add_to_cart -> add-to-cart)\n\t\tconst publicEventName = payload.event.replace(/_/g, \"-\");\n\n\t\t// Dispatch the public event that third parties can listen to\n\t\t// This includes all processed data: event_data, pixels, firing, and context (with consent)\n\t\tjQuery(document).trigger(`pmw:event:${publicEventName}`, payload);\n\n\t\tpmw.console.log(`Public event dispatched: pmw:event:${publicEventName}`, payload);\n\t};\n\t/**\n\t * Extract server-to-server data from the payload\n\t *\n\t * Only pixels with fire_server=true in their firing decision should be included.\n\t * This creates a single payload with data for all server-firing pixels.\n\t *\n\t * @param {object} payload - The full event payload with firing decisions\n\t * @returns {object} S2S-only data for server transmission\n\t */\n\tpmw.extractS2SData = function (payload) {\n\n\t\tconst s2sData = {\n\t\t\tevent: payload.event,\n\t\t};\n\n\t\t// Use the new firing decision system\n\t\tconst serverPixels = pmw.pixelRegistry.getPixelsForServerFiring(payload.event);\n\n\t\tfor (const pixelName of serverPixels) {\n\t\t\tif (payload.pixels[pixelName]) {\n\t\t\t\ts2sData[pixelName] = payload.pixels[pixelName];\n\t\t\t}\n\t\t}\n\n\t\t// Add product data if present (for server-side processing)\n\t\tif (payload.event_data?.product) {\n\t\t\ts2sData.product = payload.event_data.product;\n\t\t}\n\n\t\treturn s2sData;\n\t};\n\n\t/**\n\t * Check if a pixel should fire its browser pixel for a given payload\n\t *\n\t * This is a convenience method for pixels to use in their event listeners.\n\t * It checks the payload.firing[pixelName].fire_browser flag.\n\t *\n\t * @param {object} payload - The event payload with firing decisions\n\t * @param {string} pixelName - The pixel name to check\n\t * @returns {boolean} True if the browser pixel should fire\n\t *\n\t * @example\n\t * jQuery(document).on(\"pmw:add-to-cart\", (event, payload) => {\n\t *   if (!pmw.shouldFireBrowserPixel(payload, 'facebook')) return;\n\t *   // Fire the pixel...\n\t * });\n\t */\n\tpmw.shouldFireBrowserPixel = function (payload, pixelName) {\n\t\treturn payload.firing?.[pixelName]?.fire_browser === true;\n\t};\n\n\t/**\n\t * Check if a pixel should fire server-side for a given payload\n\t *\n\t * @param {object} payload - The event payload with firing decisions\n\t * @param {string} pixelName - The pixel name to check\n\t * @returns {boolean} True if the server-side event should fire\n\t */\n\tpmw.shouldFireServerPixel = function (payload, pixelName) {\n\t\treturn payload.firing?.[pixelName]?.fire_server === true;\n\t};\n\n\t/**\n\t * Initialize adapters namespace\n\t */\n\tif (!pmw.adapters) {\n\t\tpmw.adapters = {};\n\t}\n\n\t/**\n\t * Helper function to register an adapter with optional capabilities\n\t *\n\t * Firing Modes:\n\t * - browser_only: Fire only in browser, no server-side (default for pixels without S2S)\n\t * - server_only: Fire only server-side, suppress browser pixel completely\n\t * - both: Fire browser AND server with event_id deduplication (Facebook, TikTok default)\n\t * - browser_or_server: Fire one OR the other, never both (GA4 purchase)\n\t *\n\t * @param {string} pixelName - The pixel name\n\t * @param {object} adapter - The adapter object with an adapt() method\n\t * @param {object} [options] - Optional capabilities configuration\n\t * @param {string} [options.mode='browser_only'] - Firing mode: browser_only, server_only, both, browser_or_server\n\t * @param {boolean} [options.supportsS2S=false] - Whether pixel supports server-to-server tracking\n\t * @param {boolean} [options.supportsEventDeduplication=false] - Whether pixel supports event deduplication\n\t * @param {function} [options.isActive] - Function that returns true if pixel is active/loaded\n\t *\n\t * @example\n\t * // Browser-only pixel (Microsoft Ads)\n\t * pmw.registerAdapter('bing', BingAdapter, {\n\t *   mode: 'browser_only',\n\t *   isActive: () => !!pmwDataLayer?.pixels?.bing?.loaded\n\t * });\n\t *\n\t * @example\n\t * // S2S pixel with deduplication (Facebook)\n\t * pmw.registerAdapter('facebook', FacebookAdapter, {\n\t *   mode: 'both',\n\t *   supportsS2S: true,\n\t *   supportsEventDeduplication: true,\n\t *   isActive: () => !!pmwDataLayer?.pixels?.facebook?.pixel_id\n\t * });\n\t */\n\tpmw.registerAdapter = function (pixelName, adapter, options = {}) {\n\t\tif (!adapter || typeof adapter.adapt !== \"function\") {\n\t\t\tpmw.console.error(`Invalid adapter for ${pixelName}: must have an adapt() method`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Store the adapter\n\t\tpmw.adapters[pixelName] = adapter;\n\n\t\t// Store pixel capabilities\n\t\tif (!pmw.pixelCapabilities) {\n\t\t\tpmw.pixelCapabilities = {};\n\t\t}\n\n\t\t// Determine default mode based on S2S support\n\t\tlet defaultMode = \"browser_only\";\n\t\tif (options.supportsS2S) {\n\t\t\tdefaultMode = \"both\";\n\t\t}\n\n\t\tpmw.pixelCapabilities[pixelName] = {\n\t\t\tmode                      : options.mode || defaultMode,\n\t\t\tsupportsS2S               : options.supportsS2S || false,\n\t\t\tsupportsEventDeduplication: options.supportsEventDeduplication || false,\n\t\t\tisActive                  : options.isActive || null,\n\t\t};\n\n\t\t// pmw.console.log(`Adapter registered for: ${pixelName}`, pmw.pixelCapabilities[pixelName]);\n\t};\n\n}(window.pmw = window.pmw || {}, jQuery));","/**\n * IP functions\n */\n\n(function (pmw, $, undefined) {\n\n\tconst {isRange, isIP, isV4, isV6, version: getIpVersion} = require(\"range_check\")\n\n\t// Promise-based IP detection to prevent race conditions\n\t// Stores the ongoing detection promise so multiple callers can await the same result\n\tlet ipDetectionPromise = null\n\t let ipDetectionResolved = false\n\n\tconst ipServices = {\n\t\t\"cloudflare\": {\n\t\t\t\"any\": \"https://www.cloudflare.com/cdn-cgi/trace\",\n\t\t},\n\t\t// icanhazip seems to regularly be added to malware databases, despite being a legitimate service run by Cloudflare\n\t\t// https://blog.apnic.net/2021/06/17/how-a-small-free-ip-tool-survived/\n\t\t// https://major.io/p/a-new-future-for-icanhazip/\n\t\t// https://major.io/p/extra-icanhaz-services-going-offline/\n\t\t\"icanhazip\"   : {\n\t\t\t\"4\"  : \"https://ipv4.icanhazip.com\",\n\t\t\t\"6\"  : \"https://ipv6.icanhazip.com\",\n\t\t\t\"any\": \"https://icanhazip.com\",\n\t\t},\n\t\t\"ipinfo\"      : {\n\t\t\t\"any\": \"https://ipinfo.io/ip\",\n\t\t},\n\t\t\"myexternalip\": {\n\t\t\t\"any\": \"https://myexternalip.com/raw\",\n\t\t\t// \"6\": \"https://api-ipv6.myexternalip.com/raw\", // This can return an IPv4 address, so we can't use it\n\t\t},\n\t\t\"ipify\"       : {\n\t\t\t\"4\"  : \"https://api4.ipify.org\",\n\t\t\t\"6\"  : \"https://api6.ipify.org\",\n\t\t\t\"any\": \"https://api64.ipify.org\", // If IPv6 is available, AND the client is configured to prefer IPv6, this will return an IPv6 address\n\t\t},\n\t\t// ident.me - Reliable service with dedicated IPv4 and IPv6 endpoints\n\t\t// https://api.ident.me/\n\t\t\"identme\"     : {\n\t\t\t\"4\"  : \"https://4.ident.me/\",\n\t\t\t\"6\"  : \"https://6.ident.me/\",\n\t\t\t\"any\": \"https://ident.me/\",\n\t\t},\n\t\t// Can't use amazon because its CORS policy blocks requests from the browser\n\t\t// \"amazon\"    : {\n\t\t// \t\"any\": \"https://checkip.amazonaws.com/\",\n\t\t// },\n\t\t// Can't use ip.sb because its CORS policy blocks requests from the browser\n\t\t// \"ip.sb\"     : {\n\t\t// \t\"any\": \"https://api.ip.sb/ip\",\n\t\t// },\n\t\t// Can't use seeip because its CORS policy blocks requests from the browser\n\t\t// \"seeip\"       : {\n\t\t// \t\"any\": \"https://api.seeip.org\",\n\t\t// \t\"4\": \"https://ipv4.seeip.org\",\n\t\t// \t\"6\": \"https://ipv6.seeip.org\",\n\t\t// },\n\t}\n\n\t/**\n\t * Default timeout for IP service requests in milliseconds.\n\t * If a service doesn't respond within this time, the request is aborted.\n\t */\n\tconst IP_SERVICE_TIMEOUT_MS = 3000\n\n\t/**\n\t * Timeout for IPv6 detection in milliseconds.\n\t * IPv6 detection gets a shorter timeout since we fall back to any IP if it fails.\n\t * This prevents long waits for users without IPv6 connectivity.\n\t */\n\tconst IPV6_DETECTION_TIMEOUT_MS = 2000\n\n\t/**\n\t * Fetch with timeout using AbortController.\n\t * Aborts the request if it takes longer than the specified timeout.\n\t *\n\t * @param {string} url - The URL to fetch\n\t * @param {number} timeoutMs - Timeout in milliseconds (default: IP_SERVICE_TIMEOUT_MS)\n\t * @returns {Promise<Response>} The fetch response\n\t * @throws {Error} Throws 'AbortError' if the request times out\n\t */\n\tconst fetchWithTimeout = (url, timeoutMs = IP_SERVICE_TIMEOUT_MS) => {\n\t\tconst controller = new AbortController()\n\t\tconst timeoutId = setTimeout(() => controller.abort(), timeoutMs)\n\n\t\treturn fetch(url, { signal: controller.signal })\n\t\t\t.finally(() => clearTimeout(timeoutId))\n\t}\n\n\tpmw.getGeoInfo = {\n\n\t\tcloudflare: async () => {\n\n\t\t\tconst response = await fetchWithTimeout(\"https://www.cloudflare.com/cdn-cgi/trace\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from Cloudflare was not OK. Status: ${response.status}`)\n\n\t\t\tlet data = await response.text()\n\n\t\t\tif (!data) throw new Error(\"No data was returned from Cloudflare\")\n\n\t\t\t// Convert key-value pairs to JSON\n\t\t\t// https://stackoverflow.com/a/39284735/452587\n\t\t\tdata = data\n\t\t\t\t.trim()\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.reduce((obj, pair) => {\n\t\t\t\t\tpair = pair.split(\"=\")\n\t\t\t\t\treturn obj[pair[0]] = pair[1], obj\n\t\t\t\t}, {})\n\n\t\t\tif (!data.ip || !data.loc) throw new Error(\"The JSON data is missing the ip or loc key from Cloudflare\")\n\n\t\t\t/**\n\t\t\t * Cloudflare doesn't return the region.\n\t\t\t * If the website manager has set a region such as California in the restricted_regions array,\n\t\t\t * we have to validate the region. This is not possible with the data from Cloudflare.\n\t\t\t * So we have to abort the process and give the other services a chance to return the region.\n\t\t\t */\n\t\t\tif (processRegion(data.loc)) throw new Error(\"We have to validate the region, and this service is not returning the region.\")\n\n\t\t\treturn {\n\t\t\t\tip         : data.ip,\n\t\t\t\tcountryCode: data.loc,\n\t\t\t\tservice    : \"cloudflare\",\n\t\t\t}\n\t\t},\n\n\t\tgeojs: async () => {\n\n\t\t\tconst response = await fetchWithTimeout(\"https://get.geojs.io/v1/ip/geo.json\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from geojs was not OK. Status: ${response.status}`)\n\n\t\t\tlet data = await response.json()\n\n\t\t\tif (!data) throw new Error(\"No JSON data was returned from geojs\")\n\t\t\tif (!data.ip || !data.country_code || !data.region) throw new Error(\"The JSON data is missing the ip, country_code, or region key from geojs\")\n\n\t\t\treturn {\n\t\t\t\tip         : data.ip,\n\t\t\t\tcountryCode: data.country_code,\n\t\t\t\tregion     : data.region,\n\t\t\t\tservice    : \"geojs\",\n\t\t\t}\n\t\t},\n\n\t\tipinfo: async () => {\n\n\t\t\tconst response = await fetchWithTimeout(\"https://ipinfo.io/json\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from ipinfo was not OK from ipinfo. Status: ${response.status}`)\n\n\t\t\tlet data = await response.json()\n\n\t\t\tif (!data) throw new Error(\"No JSON data was returned from ipinfo\")\n\t\t\tif (!data.ip || !data.country || !data.region) throw new Error(\"The JSON data is missing the ip, country, or region key from ipinfo\")\n\n\t\t\treturn {\n\t\t\t\tip         : data.ip,\n\t\t\t\tcountryCode: data.country,\n\t\t\t\tregion     : data.region,\n\t\t\t\tservice    : \"ipinfo\",\n\t\t\t}\n\t\t},\n\n\t\tipapi: async () => {\n\n\t\t\tconst response = await fetchWithTimeout(\"https://ipapi.co/json\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from ipapi was not OK. Status: ${response.status}`)\n\n\t\t\tlet data = await response.json()\n\n\t\t\tif (!data) throw new Error(\"No JSON data was returned from ipapi\")\n\t\t\tif (!data.ip || !data.country || !data.region) throw new Error(\"The JSON data is missing the ip, country, or region key from ipapi\")\n\n\t\t\treturn {\n\t\t\t\tip         : data.ip,\n\t\t\t\tcountryCode: data.country,\n\t\t\t\tregion     : data.region,\n\t\t\t\tservice    : \"ipapi\",\n\t\t\t}\n\t\t},\n\t}\n\n\t/**\n\t * /**\n\t * Cloudflare doesn't return the region.\n\t * If the website manager has set a region such as California in the restricted_regions array,\n\t * we have to validate the region. This is not possible with the data from Cloudflare.\n\t * So we have to abort the process and give the other services a chance to return the region.\n\t *\n\t * If the country code is US,\n\t * and the restricted_regions array contains \"US-CA\" or \"US-VA\",\n\t * we must process the region.\n\t *\n\t * @param countryCode\n\t * @returns {boolean}\n\t */\n\tconst processRegion = (countryCode) => {\n\n\t\tif (countryCode !== \"US \") return false\n\n\t\tconst regionsToCheck = [\"US-CA\", \"US-VA\"]\n\n\t\treturn regionsToCheck.some(region =>\n\t\t\tpmwDataLayer?.general?.consent_management.restricted_regions.includes(region),\n\t\t)\n\t}\n\n\t/**\n\t * Check if the visitor is allowed to trigger server-to-server events\n\t * This checks both bot user-agent patterns and custom IP exclusion list\n\t *\n\t * @returns {Promise<boolean>} True if the visitor is allowed\n\t */\n\tpmw.isVisitorAllowed = async () => {\n\n\t\t// Check the cache if visitor is allowed\n\t\tif (pmw.retrieveData(\"visitorAllowed\") !== null && pmw.retrieveData(\"visitorAllowed\") !== undefined) {\n\t\t\treturn !!JSON.parse(pmw.retrieveData(\"visitorAllowed\"))\n\t\t}\n\n\t\t// Check if user agent is a bot\n\t\tif (pmw.isBotUserAgent()) {\n\t\t\tpmw.storeData(\"visitorAllowed\", false)\n\t\t\treturn false\n\t\t}\n\n\t\t// Check if IP is on the exclusion list (if custom exclusions are defined)\n\t\tif (Array.isArray(pmwDataLayer?.general?.server_2_server?.ip_exclude_list) \n\t\t\t&& pmwDataLayer.general.server_2_server.ip_exclude_list.length > 0) {\n\t\t\t\n\t\t\tconst ip = await pmw.getIp()\n\t\t\t\n\t\t\tif (isOnIpExclusionList(ip)) {\n\t\t\t\tpmw.storeData(\"visitorAllowed\", false)\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\t// If not a bot and not on IP exclusion list, visitor is allowed\n\t\tpmw.storeData(\"visitorAllowed\", true)\n\t\treturn true\n\t}\n\n\t/**\n\t * Validates an IP address (IPv4 or IPv6)\n\t *\n\t * @param {string} ip - The IP address to validate\n\t * @returns {boolean} True if the IP is valid\n\t */\n\tpmw.isValidIpAddress = (ip) => {\n\t\tif (!ip || typeof ip !== \"string\") return false\n\n\t\t// Use the range_check library's isIP function for accurate validation\n\t\tif (!isIP(ip)) return false\n\n\t\t// Additional validation: ensure it's not a private/reserved IP\n\t\t// This is important for CAPI which needs public IPs\n\t\treturn !pmw.isPrivateOrReservedIp(ip)\n\t}\n\n\t/**\n\t * Check if an IP is private or reserved (not suitable for CAPI)\n\t *\n\t * @param {string} ip - The IP address to check\n\t * @returns {boolean} True if the IP is private or reserved\n\t */\n\tpmw.isPrivateOrReservedIp = (ip) => {\n\t\tif (!ip) return true\n\n\t\t// IPv4 private ranges\n\t\tconst ipv4PrivateRanges = [\n\t\t\t\"10.0.0.0/8\",\n\t\t\t\"172.16.0.0/12\",\n\t\t\t\"192.168.0.0/16\",\n\t\t\t\"127.0.0.0/8\",\n\t\t\t\"169.254.0.0/16\", // Link-local\n\t\t\t\"0.0.0.0/8\",\n\t\t]\n\n\t\t// IPv6 private/reserved ranges\n\t\tconst ipv6PrivateRanges = [\n\t\t\t\"::1/128\",         // Loopback\n\t\t\t\"fc00::/7\",        // Unique local\n\t\t\t\"fe80::/10\",       // Link-local\n\t\t\t\"::/128\",          // Unspecified\n\t\t]\n\n\t\tconst privateRanges = isV4(ip) ? ipv4PrivateRanges : ipv6PrivateRanges\n\n\t\t// Use is-in-subnet for accurate range checking\n\t\ttry {\n\t\t\tconst isInSubnet = require(\"is-in-subnet\")\n\t\t\tfor (const range of privateRanges) {\n\t\t\t\tif (isInSubnet.isInSubnet(ip, range)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// If is-in-subnet check fails, fall back to basic checks\n\t\t\t// These cover the most common private ranges\n\t\t\tif (isV4(ip)) {\n\t\t\t\tif (ip.startsWith(\"10.\") || \n\t\t\t\t\tip.startsWith(\"192.168.\") || \n\t\t\t\t\tip.startsWith(\"127.\") ||\n\t\t\t\t\tip.startsWith(\"169.254.\") ||\n\t\t\t\t\tip.startsWith(\"0.\")) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\t// Check 172.16.0.0/12 range (172.16.x.x - 172.31.x.x)\n\t\t\t\tconst parts = ip.split(\".\")\n\t\t\t\tif (parts[0] === \"172\") {\n\t\t\t\t\tconst second = parseInt(parts[1], 10)\n\t\t\t\t\tif (second >= 16 && second <= 31) {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// IPv6 basic checks\n\t\t\t\tif (ip === \"::1\" || ip.startsWith(\"fc\") || ip.startsWith(\"fd\") || ip.startsWith(\"fe80:\")) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\t/**\n\t * Get the client IP address, with race condition prevention.\n\t * Detects IPv6 and any IP in parallel, preferring IPv6 when available.\n\t * IPv6 gets a shorter timeout (2s) to avoid long waits for IPv4-only users.\n\t *\n\t * @returns {Promise<string|null>} The client IP address or null\n\t */\n\tpmw.getClientIp = async () => {\n\t\t// If we already have a resolved IP, return it immediately\n\t\tconst cachedIp = pmw.retrieveData(\"client_ip\")\n\t\tif (cachedIp && pmw.isValidIpAddress(cachedIp)) {\n\t\t\treturn cachedIp\n\t\t}\n\n\t\t// If detection is already in progress, wait for it\n\t\tif (ipDetectionPromise && !ipDetectionResolved) {\n\t\t\treturn ipDetectionPromise\n\t\t}\n\n\t\t// Start a new detection process\n\t\tipDetectionResolved = false\n\t\tipDetectionPromise = (async () => {\n\t\t\ttry {\n\t\t\t\t// Start both IPv6 and \"any\" detection in parallel\n\t\t\t\t// IPv6 is preferred by Meta and other CAPIs\n\t\t\t\tconst ipv6Promise = pmw.getIpWithTimeout(\"6\", IPV6_DETECTION_TIMEOUT_MS)\n\t\t\t\tconst anyPromise = pmw.getIp(\"any\")\n\n\t\t\t\t// Wait for both to settle (resolve or reject)\n\t\t\t\tconst [ipv6Result, anyResult] = await Promise.allSettled([ipv6Promise, anyPromise])\n\n\t\t\t\t// Determine which IP to use (prefer IPv6, fall back to any IP)\n\t\t\t\tlet ip = null\n\n\t\t\t\t// Check IPv6 result first (preferred)\n\t\t\t\tif (ipv6Result.status === \"fulfilled\" && ipv6Result.value) {\n\t\t\t\t\tip = ipv6Result.value\n\t\t\t\t\tpmw.console.log(`Using IPv6 address: ${ip}`)\n\t\t\t\t}\n\t\t\t\t// Fall back to any IP if IPv6 failed or wasn't available\n\t\t\t\telse if (anyResult.status === \"fulfilled\" && anyResult.value) {\n\t\t\t\t\tip = anyResult.value\n\t\t\t\t\tpmw.console.log(`IPv6 not available, using IP: ${ip}`)\n\t\t\t\t}\n\n\t\t\t\t// Validate before storing\n\t\t\t\tif (ip && pmw.isValidIpAddress(ip)) {\n\t\t\t\t\tpmw.storeData(\"client_ip\", ip)\n\t\t\t\t\tipDetectionResolved = true\n\t\t\t\t\treturn ip\n\t\t\t\t}\n\n\t\t\t\tipDetectionResolved = true\n\t\t\t\treturn null\n\t\t\t} catch (error) {\n\t\t\t\tpmw.console.error(\"Error detecting client IP:\", error)\n\t\t\t\tipDetectionResolved = true\n\t\t\t\treturn null\n\t\t\t}\n\t\t})()\n\n\t\treturn ipDetectionPromise\n\t}\n\n\t/**\n\t * Get IP with a custom timeout.\n\t * Wraps getIp with a timeout that rejects if the detection takes too long.\n\t *\n\t * @param {string} ipVersion - The IP version to detect (\"4\", \"6\", or \"any\")\n\t * @param {number} timeoutMs - Maximum time to wait in milliseconds\n\t * @returns {Promise<string|null>} The detected IP or null\n\t */\n\tpmw.getIpWithTimeout = async (ipVersion, timeoutMs) => {\n\t\treturn Promise.race([\n\t\t\tpmw.getIp(ipVersion),\n\t\t\tnew Promise((_, reject) => \n\t\t\t\tsetTimeout(() => reject(new Error(`IPv${ipVersion} detection timed out after ${timeoutMs}ms`)), timeoutMs)\n\t\t\t)\n\t\t]).catch(error => {\n\t\t\tpmw.console.log(error.message)\n\t\t\treturn null\n\t\t})\n\t}\n\n\tpmw.getIp = async (ipVersion = \"any\", maxServicesToCheck = 3) => {\n\n\t\tconst validVersions = [\"any\", \"4\", \"6\"]\n\n\t\t// return null if the version is not valid and console log an error\n\t\tif (!validVersions.includes(ipVersion)) {\n\t\t\tconsole.error(\"The version argument must be one of the following: \" + validVersions.join(\", \"))\n\t\t\treturn null\n\t\t}\n\n\t\tif (ipVersion === \"any\" && pmw.retrieveData(\"ip\")) {\n\t\t\treturn pmw.retrieveData(\"ip\")\n\t\t}\n\n\t\t// Get the ipv data from the cache\n\t\tconst ipv = pmw.retrieveData(`ipv${ipVersion}`)\n\n\t\t// Return it if it is not undefined\n\t\t// The value can be an IP\n\t\t// or null if we ran the test but no IP could be retrieved\n\t\t// It is undefined if the ipVersion was not tested yet\n\t\tif (ipv !== undefined) return ipv\n\n\t\tpmw.console.log(\"Testing the IP address of the browser because one ore more server-to-server APIs are enabled and require the browser IP. It may trigger connection request errors in the console while testing the IP address. This is normal and expected behavior.\")\n\n\t\ttry {// Check the cache if the IP is already stored\n\n\t\t\tconst ip = await pmw.getIpFromAnyService(ipVersion, maxServicesToCheck)\n\n\t\t\t// Validate the IP before storing\n\t\t\tif (ip && !isIP(ip)) {\n\t\t\t\tpmw.console.warn(`Invalid IP address received: ${ip}`)\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\t// Store the IP in the cache\n\t\t\tif (ipVersion === \"any\" && ip) {\n\t\t\t\tpmw.storeData(\"ip\", ip)\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tgetIpVersion(ip) === 4\n\t\t\t\t|| (ipVersion === \"4\" && ip === null)\n\t\t\t) {\n\t\t\t\tpmw.storeData(\"ipv4\", ip)\n\t\t\t}\n\n\t\t\tif (getIpVersion(ip) === 6\n\t\t\t\t|| (ipVersion === \"6\" && ip === null)\n\t\t\t) {\n\t\t\t\tpmw.storeData(\"ipv6\", ip)\n\t\t\t}\n\n\t\t\treturn ip\n\t\t} catch (error) {\n\t\t\t// console.error(error)\n\t\t\treturn null\n\t\t}\n\t}\n\n\tpmw.getBrowserGeoFromExternalService = async () => {\n\n\t\tconst startTime = performance.now()\n\n\t\tlet promises = []\n\n\t\tObject.keys(pmw.getGeoInfo).forEach(service => {\n\t\t\tpromises.push(pmw.getGeoInfo[service]())\n\t\t})\n\n\t\ttry {\n\t\t\tconst data = await Promise.any(promises)\n\n\t\t\tdata.countryCode = data.countryCode.toUpperCase()\n\n\t\t\tif (data.region && data.region === \"California\") {\n\t\t\t\tdata.regionCode = \"US-CA\"\n\t\t\t}\n\n\t\t\tif (data.region && data.region === \"Virginia\") {\n\t\t\t\tdata.regionCode = \"US-VA\"\n\t\t\t}\n\n\t\t\tpmw.console.log(\n\t\t\t\t\"Retrieved the browser geo info from an external service: \",\n\t\t\t\tdata,\n\t\t\t\t\" which took \",\n\t\t\t\t(performance.now() - startTime).toFixed(2) + \" ms\",\n\t\t\t)\n\n\t\t\t// pmw.storeData(\"countryCode\", data.countryCode)\n\t\t\t// pmw.storeData(\"ip\", data.ip)\n\t\t\treturn data\n\t\t} catch (error) {\n\t\t\tpmw.console.error(\"error: \", error)\n\t\t\treturn null\n\t\t}\n\t}\n\n\tconst getBrowserLocationByTimeZone = () => {\n\n\t\tconst geo         = require(\"./geo/geo.mjs\")\n\t\tconst geoLocation = geo.getLocationByTimeZone()\n\n\t\tif (geoLocation.countryCode) {\n\t\t\treturn geoLocation\n\t\t}\n\n\t\treturn null\n\t}\n\n\tpmw.getBrowserGeo = async () => {\n\n\t\tlet geoFromStorage = {}\n\n\t\tif (pmw.retrieveData(\"geoCountryCode\")) geoFromStorage.countryCode = pmw.retrieveData(\"geoCountryCode\")\n\t\tif (pmw.retrieveData(\"geoRegionCode\")) geoFromStorage.regionCode = pmw.retrieveData(\"geoRegionCode\")\n\t\tif (pmw.retrieveData(\"geoRegion\")) geoFromStorage.region = pmw.retrieveData(\"geoRegion\")\n\n\t\tif (geoFromStorage.countryCode) {\n\t\t\tpmw.console.log(\"Retrieved the browser geo location from the cache: \", geoFromStorage)\n\t\t\treturn geoFromStorage\n\t\t}\n\n\t\tlet geoInfo = await pmw.getBrowserGeoFromExternalService()\n\n\t\t// If the external services fail, try to use the timezone fallback to get the country\n\t\tif (!geoInfo) {\n\n\t\t\tconst gepLocationByTimeZone = getBrowserLocationByTimeZone()\n\n\t\t\tgeoInfo = {}\n\n\t\t\tif (gepLocationByTimeZone) pmw.console.log(\"Retrieved the browser geo location from the timezone: \", gepLocationByTimeZone)\n\t\t\tif (gepLocationByTimeZone.countryCode) geoInfo.countryCode = gepLocationByTimeZone.countryCode\n\t\t\tif (gepLocationByTimeZone.regionCode) geoInfo.regionCode = gepLocationByTimeZone.regionCode\n\t\t}\n\n\t\tif (geoInfo?.ip) pmw.storeData(\"ip\", geoInfo.ip)\n\t\tif (geoInfo?.countryCode) pmw.storeData(\"geoCountryCode\", geoInfo.countryCode)\n\t\tif (geoInfo?.regionCode) pmw.storeData(\"geoRegionCode\", geoInfo.regionCode)\n\t\tif (geoInfo?.region) pmw.storeData(\"geoRegion\", geoInfo.region)\n\n\t\tif (geoInfo?.countryCode) {\n\t\t\treturn geoInfo\n\t\t}\n\n\t\treturn null\n\t}\n\n\t/**\n\t * Get the IP from the visitor using different services.\n\t * Return the first valid IP address that can be retrieved the fastest.\n\t *\n\t * @returns {Promise<IP>}\n\t */\n\tpmw.getIpFromAnyService = async (ipVersion = \"any\", maxServicesToCheck = 3) => {\n\n\t\t// start tracking time\n\t\tconst startTime = performance.now()\n\n\t\t// take the ipServices object and filter it to only contain objects with an ipVersion key that matches the ipVersion argument\n\t\t// keep the original order of the ipServices object\n\t\t// also keep only the first maxServicesToCheck objects\n\n\t\tconst ipServicesFiltered = Object.keys(ipServices)\n\t\t\t.filter(service => ipServices[service][ipVersion])\n\t\t\t.slice(0, maxServicesToCheck)\n\t\t\t.reduce((obj, key) => {\n\t\t\t\t\tobj[key] = ipServices[key]\n\t\t\t\t\treturn obj\n\t\t\t\t}\n\t\t\t\t, {})\n\n\t\tlet promises = []\n\n\t\tObject.keys(ipServicesFiltered).forEach(service => {\n\t\t\t// only push if the ipVersion is available for the service\n\t\t\tif (ipServicesFiltered[service][ipVersion]) {\n\t\t\t\t// console.log(`pushing ${service} to promises array with ipVersion ${ipVersion}`)\n\t\t\t\tpromises.push(pmw.getIpFromService(service, ipVersion))\n\t\t\t}\n\t\t})\n\n\t\t// If the promises array is not empty, return the first promise that resolves the fastest\n\t\t// Ignore the promises that reject\n\t\tif (promises.length > 0) {\n\n\t\t\ttry {\n\t\t\t\tconst data = await Promise.any(promises)\n\t\t\t\t// console.log(`The Pixel Manager retrieved the IP address ${data.ip} from ${data.service} using IP version ${data.ipVersion}`)\n\n\t\t\t\t// stop tracking time\n\t\t\t\tconst endTime   = performance.now()\n\t\t\t\tconst timeTaken = (endTime - startTime).toFixed(2)\n\n\t\t\t\tpmw.console.log(`Retrieved the IP address ${data.ip} from ${data.service} which took ${timeTaken} ms`)\n\t\t\t\treturn data.ip\n\t\t\t} catch (error) {\n\t\t\t\t// console.error(error)\n\t\t\t\tpmw.console.log(`Could not retrieve an IP with version ${ipVersion} from any of the services.`)\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t} else {\n\t\t\tpmw.console.log(\"No promises to resolve\")\n\t\t\treturn null\n\t\t}\n\t}\n\n\t/**\n\t * Fetches the IP address from a specified service.\n\t *\n\t * @async\n\t * @param {string} service - The name of the service to fetch the IP from.\n\t * @param {string} [ipVersion=\"any\"] - The version of the IP (e.g., \"any\" for global).\n\t * @returns {Promise<Object>} A promise that resolves to an object containing the IP address, service name, and IP version.\n\t * @throws {Error} Will reject the promise with an error if the IP version is not available for the service, the response from the service is not OK, the returned value from the service is not an IP address, or any other error occurs.\n\t */\n\tpmw.getIpFromService = async (service, ipVersion = \"any\") => {\n\t\ttry {\n\n\t\t\tlet data = {\n\t\t\t\tip       : null,\n\t\t\t\tservice  : service,\n\t\t\t\tipVersion: ipVersion,\n\t\t\t}\n\n\t\t\t// Return reject if the ipVersion is not available for the service\n\t\t\tif (!ipServices[service][ipVersion]) return Promise.reject(new Error(`The IP version ${ipVersion} is not available for the service ${service}`))\n\n\t\t\tpmw.console.log(`Fetching IP from ${service} using IP version ${ipVersion}`)\n\n\t\t\tconst response = await fetchWithTimeout(ipServices[service][ipVersion])\n\n\t\t\tif (!response.ok) {\n\t\t\t\treturn Promise.reject(new Error(`The response from ${service} was not OK. Status: ${response.status}`))\n\t\t\t}\n\n\t\t\tlet serviceResponseData = await response.text()\n\n\t\t\tif (service === \"cloudflare\") {\n\t\t\t\t// Convert key-value pairs to JSON\n\t\t\t\tserviceResponseData = serviceResponseData\n\t\t\t\t\t.trim()\n\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t.reduce((obj, pair) => {\n\t\t\t\t\t\tpair = pair.split(\"=\")\n\t\t\t\t\t\treturn (obj[pair[0]] = pair[1]), obj\n\t\t\t\t\t}, {})\n\n\t\t\t\tdata.ip = serviceResponseData.ip\n\t\t\t} else {\n\t\t\t\tdata.ip = serviceResponseData.trim()\n\t\t\t}\n\n\t\t\tif (!isIP(data.ip)) {\n\t\t\t\treturn Promise.reject(new Error(`The returned value from ${service} is not an IP address`))\n\t\t\t}\n\n\t\t\treturn data\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error)\n\t\t}\n\t}\n\n\t/**\n\t * Cloudflare\n\t *\n\t * Response time: approx. 70ms\n\t * IPv: Returns IPv4 or IPv6 depending on the client\n\t * Dual stack: Doesn't offer dual stack detection\n\t *\n\t * @returns {Promise<*>}\n\t */\n\tconst getIpFromCloudflare = async () => {\n\n\t\tconst response = await fetchWithTimeout(\"https://www.cloudflare.com/cdn-cgi/trace\")\n\t\tlet data       = await response.text()\n\n\t\t// Convert key-value pairs to JSON\n\t\t// https://stackoverflow.com/a/39284735/452587\n\t\tdata = data\n\t\t\t.trim()\n\t\t\t.split(\"\\n\")\n\t\t\t.reduce((obj, pair) => {\n\t\t\t\tpair = pair.split(\"=\")\n\t\t\t\treturn obj[pair[0]] = pair[1], obj\n\t\t\t}, {})\n\n\t\t// return the data.ip not a promise\n\t\treturn data.ip\n\t}\n\n\t/**\n\t * Check if the visitor is NOT allowed to trigger server-to-server events\n\t * This checks both bot user-agent patterns and custom IP exclusion list\n\t *\n\t * @returns {Promise<boolean>} True if the visitor should be blocked\n\t */\n\tpmw.isVisitorNotAllowed = async () => {\n\t\treturn await pmw.isVisitorAllowed() === false\n\t}\n\n\t/**\n\t * Check if the current user agent matches known bot patterns\n\t *\n\t * @returns {boolean} True if the user agent is a bot\n\t */\n\tpmw.isBotUserAgent = () => {\n\t\tconst userAgent = navigator.userAgent || ''\n\t\t\n\t\t// If no user agent, assume it might be a bot\n\t\tif (!userAgent) {\n\t\t\treturn true\n\t\t}\n\n\t\tconst botPatterns = getBotPatterns()\n\n\t\t// Check if user agent matches any bot pattern (case-insensitive)\n\t\tfor (const pattern of botPatterns) {\n\t\t\tif (userAgent.toLowerCase().includes(pattern.toLowerCase())) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\t/**\n\t * Get list of known bot user-agent patterns\n\t *\n\t * @returns {string[]} Array of bot patterns\n\t */\n\tconst getBotPatterns = () => {\n\t\t// Get custom patterns from pmwDataLayer if available\n\t\tlet customPatterns = []\n\t\tif (Array.isArray(pmwDataLayer?.general?.server_2_server?.user_agent_exclude_patterns)) {\n\t\t\tcustomPatterns = pmwDataLayer.general.server_2_server.user_agent_exclude_patterns\n\t\t}\n\n\t\t// Default bot patterns - focusing on legitimate crawlers that identify themselves\n\t\tconst defaultPatterns = [\n\t\t\t// Search engine crawlers\n\t\t\t'Googlebot',\n\t\t\t'Google-InspectionTool',\n\t\t\t'Google-Extended',\n\t\t\t'Storebot-Google',\n\t\t\t'bingbot',\n\t\t\t'BingPreview',\n\t\t\t'msnbot',\n\t\t\t'Slurp',\n\t\t\t'DuckDuckBot',\n\t\t\t'Baiduspider',\n\t\t\t'YandexBot',\n\t\t\t'Sogou',\n\t\t\t\n\t\t\t// Social media crawlers\n\t\t\t'facebookexternalhit',\n\t\t\t'FacebookBot',\n\t\t\t'LinkedInBot',\n\t\t\t'Twitterbot',\n\t\t\t'PinterestBot',\n\t\t\t'TikTokBot',\n\t\t\t'SnapchatAds',\n\t\t\t'DiscordBot',\n\t\t\t'InstagramBot',\n\t\t\t'WhatsApp',\n\t\t\t\n\t\t\t// SEO & Analytics\n\t\t\t'AhrefsBot',\n\t\t\t'SemrushBot',\n\t\t\t'MJ12bot',\n\t\t\t'DotBot',\n\t\t\t'rogerbot',\n\t\t\t\n\t\t\t// Monitoring services\n\t\t\t'UptimeRobot',\n\t\t\t'Pingdom',\n\t\t\t'StatusCake',\n\t\t\t'GTmetrix',\n\t\t\t\n\t\t\t// AI & Research\n\t\t\t'ClaudeBot',\n\t\t\t'GPTBot',\n\t\t\t'ChatGPT',\n\t\t\t'anthropic-ai',\n\t\t\t'CCBot',\n\t\t\t'PerplexityBot',\n\t\t\t\n\t\t\t// Generic patterns\n\t\t\t'crawler',\n\t\t\t'spider',\n\t\t\t'scraper',\n\t\t\t'bot/',\n\t\t\t'/bot',\n\t\t\t'bot-',\n\t\t]\n\n\t\treturn defaultPatterns.concat(customPatterns)\n\t}\n\n\t/**\n\t * Check if an IP address is in CIDR notation\n\t *\n\t * @param {string} ipName - The IP or CIDR notation to check\n\t * @returns {boolean} True if the string contains CIDR notation\n\t */\n\tconst isCidr = (ipName) => {\n\t\treturn ipName.includes('/')\n\t}\n\n\t/**\n\t * Check if an IP address is on the custom exclusion list\n\t *\n\t * @param {string} ip - The IP address to check\n\t * @returns {boolean} True if the IP is on the exclusion list\n\t */\n\tconst isOnIpExclusionList = (ip) => {\n\t\tconst ipExcludeList = pmwDataLayer?.general?.server_2_server?.ip_exclude_list || []\n\n\t\tfor (const ipName of ipExcludeList) {\n\t\t\tif (isCidr(ipName)) {\n\t\t\t\t// Check CIDR range\n\t\t\t\tif (isInSubnet.isInSubnet(ip, ipName)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else if (ip === ipName) {\n\t\t\t\t// Exact IP match\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n}(window.pmw = window.pmw || {}, jQuery))\n","// https://stackoverflow.com/a/70870895/4688612\nexport const getLocationByTimeZone = () => {\n\n\tconst timezones = {\n\t\t\"Africa/Abidjan\"                : [\"CI\", \"BF\", \"GH\", \"GM\", \"GN\", \"ML\", \"MR\", \"SH\", \"SL\", \"SN\", \"TG\"],\n\t\t\"Africa/Accra\"                  : [\"GH\"],\n\t\t\"Africa/Addis_Ababa\"            : [\"ET\"],\n\t\t\"Africa/Algiers\"                : [\"DZ\"],\n\t\t\"Africa/Asmara\"                 : [\"ER\"],\n\t\t\"Africa/Asmera\"                 : [\"ER\"],\n\t\t\"Africa/Bamako\"                 : [\"ML\"],\n\t\t\"Africa/Bangui\"                 : [\"CF\"],\n\t\t\"Africa/Banjul\"                 : [\"GM\"],\n\t\t\"Africa/Bissau\"                 : [\"GW\"],\n\t\t\"Africa/Blantyre\"               : [\"MW\"],\n\t\t\"Africa/Brazzaville\"            : [\"CG\"],\n\t\t\"Africa/Bujumbura\"              : [\"BI\"],\n\t\t\"Africa/Cairo\"                  : [\"EG\"],\n\t\t\"Africa/Casablanca\"             : [\"MA\"],\n\t\t\"Africa/Ceuta\"                  : [\"ES\"],\n\t\t\"Africa/Conakry\"                : [\"GN\"],\n\t\t\"Africa/Dakar\"                  : [\"SN\"],\n\t\t\"Africa/Dar_es_Salaam\"          : [\"TZ\"],\n\t\t\"Africa/Djibouti\"               : [\"DJ\"],\n\t\t\"Africa/Douala\"                 : [\"CM\"],\n\t\t\"Africa/El_Aaiun\"               : [\"EH\"],\n\t\t\"Africa/Freetown\"               : [\"SL\"],\n\t\t\"Africa/Gaborone\"               : [\"BW\"],\n\t\t\"Africa/Harare\"                 : [\"ZW\"],\n\t\t\"Africa/Johannesburg\"           : [\"ZA\", \"LS\", \"SZ\"],\n\t\t\"Africa/Juba\"                   : [\"SS\"],\n\t\t\"Africa/Kampala\"                : [\"UG\"],\n\t\t\"Africa/Khartoum\"               : [\"SD\"],\n\t\t\"Africa/Kigali\"                 : [\"RW\"],\n\t\t\"Africa/Kinshasa\"               : [\"CD\"],\n\t\t\"Africa/Lagos\"                  : [\"NG\", \"AO\", \"BJ\", \"CD\", \"CF\", \"CG\", \"CM\", \"GA\", \"GQ\", \"NE\"],\n\t\t\"Africa/Libreville\"             : [\"GA\"],\n\t\t\"Africa/Lome\"                   : [\"TG\"],\n\t\t\"Africa/Luanda\"                 : [\"AO\"],\n\t\t\"Africa/Lubumbashi\"             : [\"CD\"],\n\t\t\"Africa/Lusaka\"                 : [\"ZM\"],\n\t\t\"Africa/Malabo\"                 : [\"GQ\"],\n\t\t\"Africa/Maputo\"                 : [\"MZ\", \"BI\", \"BW\", \"CD\", \"MW\", \"RW\", \"ZM\", \"ZW\"],\n\t\t\"Africa/Maseru\"                 : [\"LS\"],\n\t\t\"Africa/Mbabane\"                : [\"SZ\"],\n\t\t\"Africa/Mogadishu\"              : [\"SO\"],\n\t\t\"Africa/Monrovia\"               : [\"LR\"],\n\t\t\"Africa/Nairobi\"                : [\"KE\", \"DJ\", \"ER\", \"ET\", \"KM\", \"MG\", \"SO\", \"TZ\", \"UG\", \"YT\"],\n\t\t\"Africa/Ndjamena\"               : [\"TD\"],\n\t\t\"Africa/Niamey\"                 : [\"NE\"],\n\t\t\"Africa/Nouakchott\"             : [\"MR\"],\n\t\t\"Africa/Ouagadougou\"            : [\"BF\"],\n\t\t\"Africa/Porto-Novo\"             : [\"BJ\"],\n\t\t\"Africa/Sao_Tome\"               : [\"ST\"],\n\t\t\"Africa/Timbuktu\"               : [\"ML\"],\n\t\t\"Africa/Tripoli\"                : [\"LY\"],\n\t\t\"Africa/Tunis\"                  : [\"TN\"],\n\t\t\"Africa/Windhoek\"               : [\"NA\"],\n\t\t\"America/Adak\"                  : [\"US\"],\n\t\t\"America/Anchorage\"             : [\"US\"],\n\t\t\"America/Anguilla\"              : [\"AI\"],\n\t\t\"America/Antigua\"               : [\"AG\"],\n\t\t\"America/Araguaina\"             : [\"BR\"],\n\t\t\"America/Argentina/Buenos_Aires\": [\"AR\"],\n\t\t\"America/Argentina/Catamarca\"   : [\"AR\"],\n\t\t\"America/Argentina/Cordoba\"     : [\"AR\"],\n\t\t\"America/Argentina/Jujuy\"       : [\"AR\"],\n\t\t\"America/Argentina/La_Rioja\"    : [\"AR\"],\n\t\t\"America/Argentina/Mendoza\"     : [\"AR\"],\n\t\t\"America/Argentina/Rio_Gallegos\": [\"AR\"],\n\t\t\"America/Argentina/Salta\"       : [\"AR\"],\n\t\t\"America/Argentina/San_Juan\"    : [\"AR\"],\n\t\t\"America/Argentina/San_Luis\"    : [\"AR\"],\n\t\t\"America/Argentina/Tucuman\"     : [\"AR\"],\n\t\t\"America/Argentina/Ushuaia\"     : [\"AR\"],\n\t\t\"America/Aruba\"                 : [\"AW\"],\n\t\t\"America/Asuncion\"              : [\"PY\"],\n\t\t\"America/Atikokan\"              : [\"CA\"],\n\t\t\"America/Bahia\"                 : [\"BR\"],\n\t\t\"America/Bahia_Banderas\"        : [\"MX\"],\n\t\t\"America/Barbados\"              : [\"BB\"],\n\t\t\"America/Belem\"                 : [\"BR\"],\n\t\t\"America/Belize\"                : [\"BZ\"],\n\t\t\"America/Blanc-Sablon\"          : [\"CA\"],\n\t\t\"America/Boa_Vista\"             : [\"BR\"],\n\t\t\"America/Bogota\"                : [\"CO\"],\n\t\t\"America/Boise\"                 : [\"US\"],\n\t\t\"America/Cambridge_Bay\"         : [\"CA\"],\n\t\t\"America/Campo_Grande\"          : [\"BR\"],\n\t\t\"America/Cancun\"                : [\"MX\"],\n\t\t\"America/Caracas\"               : [\"VE\"],\n\t\t\"America/Cayenne\"               : [\"GF\"],\n\t\t\"America/Cayman\"                : [\"KY\"],\n\t\t\"America/Chicago\"               : [\"US\"],\n\t\t\"America/Chihuahua\"             : [\"MX\"],\n\t\t\"America/Coral_Harbour\"         : [\"CA\"],\n\t\t\"America/Costa_Rica\"            : [\"CR\"],\n\t\t\"America/Creston\"               : [\"CA\"],\n\t\t\"America/Cuiaba\"                : [\"BR\"],\n\t\t\"America/Curacao\"               : [\"CW\"],\n\t\t\"America/Danmarkshavn\"          : [\"GL\"],\n\t\t\"America/Dawson\"                : [\"CA\"],\n\t\t\"America/Dawson_Creek\"          : [\"CA\"],\n\t\t\"America/Denver\"                : [\"US\"],\n\t\t\"America/Detroit\"               : [\"US\"],\n\t\t\"America/Dominica\"              : [\"DM\"],\n\t\t\"America/Edmonton\"              : [\"CA\"],\n\t\t\"America/Eirunepe\"              : [\"BR\"],\n\t\t\"America/El_Salvador\"           : [\"SV\"],\n\t\t\"America/Fort_Nelson\"           : [\"CA\"],\n\t\t\"America/Fortaleza\"             : [\"BR\"],\n\t\t\"America/Glace_Bay\"             : [\"CA\"],\n\t\t\"America/Goose_Bay\"             : [\"CA\"],\n\t\t\"America/Grand_Turk\"            : [\"TC\"],\n\t\t\"America/Grenada\"               : [\"GD\"],\n\t\t\"America/Guadeloupe\"            : [\"GP\"],\n\t\t\"America/Guatemala\"             : [\"GT\"],\n\t\t\"America/Guayaquil\"             : [\"EC\"],\n\t\t\"America/Guyana\"                : [\"GY\"],\n\t\t\"America/Halifax\"               : [\"CA\"],\n\t\t\"America/Havana\"                : [\"CU\"],\n\t\t\"America/Hermosillo\"            : [\"MX\"],\n\t\t\"America/Indiana/Indianapolis\"  : [\"US\"],\n\t\t\"America/Indiana/Knox\"          : [\"US\"],\n\t\t\"America/Indiana/Marengo\"       : [\"US\"],\n\t\t\"America/Indiana/Petersburg\"    : [\"US\"],\n\t\t\"America/Indiana/Tell_City\"     : [\"US\"],\n\t\t\"America/Indiana/Vevay\"         : [\"US\"],\n\t\t\"America/Indiana/Vincennes\"     : [\"US\"],\n\t\t\"America/Indiana/Winamac\"       : [\"US\"],\n\t\t\"America/Inuvik\"                : [\"CA\"],\n\t\t\"America/Iqaluit\"               : [\"CA\"],\n\t\t\"America/Jamaica\"               : [\"JM\"],\n\t\t\"America/Juneau\"                : [\"US\"],\n\t\t\"America/Kentucky/Louisville\"   : [\"US\"],\n\t\t\"America/Kentucky/Monticello\"   : [\"US\"],\n\t\t\"America/Kralendijk\"            : [\"BQ\"],\n\t\t\"America/La_Paz\"                : [\"BO\"],\n\t\t\"America/Lima\"                  : [\"PE\"],\n\t\t\"America/Los_Angeles\"           : [\"US\"],\n\t\t\"America/Lower_Princes\"         : [\"SX\"],\n\t\t\"America/Maceio\"                : [\"BR\"],\n\t\t\"America/Managua\"               : [\"NI\"],\n\t\t\"America/Manaus\"                : [\"BR\"],\n\t\t\"America/Marigot\"               : [\"MF\"],\n\t\t\"America/Martinique\"            : [\"MQ\"],\n\t\t\"America/Matamoros\"             : [\"MX\"],\n\t\t\"America/Mazatlan\"              : [\"MX\"],\n\t\t\"America/Menominee\"             : [\"US\"],\n\t\t\"America/Merida\"                : [\"MX\"],\n\t\t\"America/Metlakatla\"            : [\"US\"],\n\t\t\"America/Mexico_City\"           : [\"MX\"],\n\t\t\"America/Miquelon\"              : [\"PM\"],\n\t\t\"America/Moncton\"               : [\"CA\"],\n\t\t\"America/Monterrey\"             : [\"MX\"],\n\t\t\"America/Montevideo\"            : [\"UY\"],\n\t\t\"America/Montreal\"              : [\"CA\"],\n\t\t\"America/Montserrat\"            : [\"MS\"],\n\t\t\"America/Nassau\"                : [\"BS\"],\n\t\t\"America/New_York\"              : [\"US\"],\n\t\t\"America/Nipigon\"               : [\"CA\"],\n\t\t\"America/Nome\"                  : [\"US\"],\n\t\t\"America/Noronha\"               : [\"BR\"],\n\t\t\"America/North_Dakota/Beulah\"   : [\"US\"],\n\t\t\"America/North_Dakota/Center\"   : [\"US\"],\n\t\t\"America/North_Dakota/New_Salem\": [\"US\"],\n\t\t\"America/Nuuk\"                  : [\"GL\"],\n\t\t\"America/Ojinaga\"               : [\"MX\"],\n\t\t\"America/Panama\"                : [\"PA\", \"CA\", \"KY\"],\n\t\t\"America/Pangnirtung\"           : [\"CA\"],\n\t\t\"America/Paramaribo\"            : [\"SR\"],\n\t\t\"America/Phoenix\"               : [\"US\", \"CA\"],\n\t\t\"America/Port-au-Prince\"        : [\"HT\"],\n\t\t\"America/Port_of_Spain\"         : [\"TT\"],\n\t\t\"America/Porto_Velho\"           : [\"BR\"],\n\t\t\"America/Puerto_Rico\"           : [\"PR\", \"AG\", \"CA\", \"AI\", \"AW\", \"BL\", \"BQ\", \"CW\", \"DM\", \"GD\", \"GP\", \"KN\", \"LC\", \"MF\", \"MS\", \"SX\", \"TT\", \"VC\", \"VG\", \"VI\"],\n\t\t\"America/Punta_Arenas\"          : [\"CL\"],\n\t\t\"America/Rainy_River\"           : [\"CA\"],\n\t\t\"America/Rankin_Inlet\"          : [\"CA\"],\n\t\t\"America/Recife\"                : [\"BR\"],\n\t\t\"America/Regina\"                : [\"CA\"],\n\t\t\"America/Resolute\"              : [\"CA\"],\n\t\t\"America/Rio_Branco\"            : [\"BR\"],\n\t\t\"America/Santarem\"              : [\"BR\"],\n\t\t\"America/Santiago\"              : [\"CL\"],\n\t\t\"America/Santo_Domingo\"         : [\"DO\"],\n\t\t\"America/Sao_Paulo\"             : [\"BR\"],\n\t\t\"America/Scoresbysund\"          : [\"GL\"],\n\t\t\"America/Sitka\"                 : [\"US\"],\n\t\t\"America/St_Barthelemy\"         : [\"BL\"],\n\t\t\"America/St_Johns\"              : [\"CA\"],\n\t\t\"America/St_Kitts\"              : [\"KN\"],\n\t\t\"America/St_Lucia\"              : [\"LC\"],\n\t\t\"America/St_Thomas\"             : [\"VI\"],\n\t\t\"America/St_Vincent\"            : [\"VC\"],\n\t\t\"America/Swift_Current\"         : [\"CA\"],\n\t\t\"America/Tegucigalpa\"           : [\"HN\"],\n\t\t\"America/Thule\"                 : [\"GL\"],\n\t\t\"America/Thunder_Bay\"           : [\"CA\"],\n\t\t\"America/Tijuana\"               : [\"MX\"],\n\t\t\"America/Toronto\"               : [\"CA\", \"BS\"],\n\t\t\"America/Tortola\"               : [\"VG\"],\n\t\t\"America/Vancouver\"             : [\"CA\"],\n\t\t\"America/Virgin\"                : [\"VI\"],\n\t\t\"America/Whitehorse\"            : [\"CA\"],\n\t\t\"America/Winnipeg\"              : [\"CA\"],\n\t\t\"America/Yakutat\"               : [\"US\"],\n\t\t\"America/Yellowknife\"           : [\"CA\"],\n\t\t\"Antarctica/Casey\"              : [\"AQ\"],\n\t\t\"Antarctica/Davis\"              : [\"AQ\"],\n\t\t\"Antarctica/DumontDUrville\"     : [\"AQ\"],\n\t\t\"Antarctica/Macquarie\"          : [\"AU\"],\n\t\t\"Antarctica/Mawson\"             : [\"AQ\"],\n\t\t\"Antarctica/McMurdo\"            : [\"AQ\"],\n\t\t\"Antarctica/Palmer\"             : [\"AQ\"],\n\t\t\"Antarctica/Rothera\"            : [\"AQ\"],\n\t\t\"Antarctica/South_Pole\"         : [\"AQ\"],\n\t\t\"Antarctica/Syowa\"              : [\"AQ\"],\n\t\t\"Antarctica/Troll\"              : [\"AQ\"],\n\t\t\"Antarctica/Vostok\"             : [\"AQ\"],\n\t\t\"Arctic/Longyearbyen\"           : [\"SJ\"],\n\t\t\"Asia/Aden\"                     : [\"YE\"],\n\t\t\"Asia/Almaty\"                   : [\"KZ\"],\n\t\t\"Asia/Amman\"                    : [\"JO\"],\n\t\t\"Asia/Anadyr\"                   : [\"RU\"],\n\t\t\"Asia/Aqtau\"                    : [\"KZ\"],\n\t\t\"Asia/Aqtobe\"                   : [\"KZ\"],\n\t\t\"Asia/Ashgabat\"                 : [\"TM\"],\n\t\t\"Asia/Atyrau\"                   : [\"KZ\"],\n\t\t\"Asia/Baghdad\"                  : [\"IQ\"],\n\t\t\"Asia/Bahrain\"                  : [\"BH\"],\n\t\t\"Asia/Baku\"                     : [\"AZ\"],\n\t\t\"Asia/Bangkok\"                  : [\"TH\", \"KH\", \"LA\", \"VN\"],\n\t\t\"Asia/Barnaul\"                  : [\"RU\"],\n\t\t\"Asia/Beirut\"                   : [\"LB\"],\n\t\t\"Asia/Bishkek\"                  : [\"KG\"],\n\t\t\"Asia/Brunei\"                   : [\"BN\"],\n\t\t\"Asia/Chita\"                    : [\"RU\"],\n\t\t\"Asia/Choibalsan\"               : [\"MN\"],\n\t\t\"Asia/Colombo\"                  : [\"LK\"],\n\t\t\"Asia/Damascus\"                 : [\"SY\"],\n\t\t\"Asia/Dhaka\"                    : [\"BD\"],\n\t\t\"Asia/Dili\"                     : [\"TL\"],\n\t\t\"Asia/Dubai\"                    : [\"AE\", \"OM\"],\n\t\t\"Asia/Dushanbe\"                 : [\"TJ\"],\n\t\t\"Asia/Famagusta\"                : [\"CY\"],\n\t\t\"Asia/Gaza\"                     : [\"PS\"],\n\t\t\"Asia/Hebron\"                   : [\"PS\"],\n\t\t\"Asia/Ho_Chi_Minh\"              : [\"VN\"],\n\t\t\"Asia/Hong_Kong\"                : [\"HK\"],\n\t\t\"Asia/Hovd\"                     : [\"MN\"],\n\t\t\"Asia/Irkutsk\"                  : [\"RU\"],\n\t\t\"Asia/Jakarta\"                  : [\"ID\"],\n\t\t\"Asia/Jayapura\"                 : [\"ID\"],\n\t\t\"Asia/Jerusalem\"                : [\"IL\"],\n\t\t\"Asia/Kabul\"                    : [\"AF\"],\n\t\t\"Asia/Kamchatka\"                : [\"RU\"],\n\t\t\"Asia/Karachi\"                  : [\"PK\"],\n\t\t\"Asia/Kathmandu\"                : [\"NP\"],\n\t\t\"Asia/Khandyga\"                 : [\"RU\"],\n\t\t\"Asia/Kolkata\"                  : [\"IN\"],\n\t\t\"Asia/Krasnoyarsk\"              : [\"RU\"],\n\t\t\"Asia/Kuala_Lumpur\"             : [\"MY\"],\n\t\t\"Asia/Kuching\"                  : [\"MY\"],\n\t\t\"Asia/Kuwait\"                   : [\"KW\"],\n\t\t\"Asia/Macau\"                    : [\"MO\"],\n\t\t\"Asia/Magadan\"                  : [\"RU\"],\n\t\t\"Asia/Makassar\"                 : [\"ID\"],\n\t\t\"Asia/Manila\"                   : [\"PH\"],\n\t\t\"Asia/Muscat\"                   : [\"OM\"],\n\t\t\"Asia/Nicosia\"                  : [\"CY\"],\n\t\t\"Asia/Novokuznetsk\"             : [\"RU\"],\n\t\t\"Asia/Novosibirsk\"              : [\"RU\"],\n\t\t\"Asia/Omsk\"                     : [\"RU\"],\n\t\t\"Asia/Oral\"                     : [\"KZ\"],\n\t\t\"Asia/Phnom_Penh\"               : [\"KH\"],\n\t\t\"Asia/Pontianak\"                : [\"ID\"],\n\t\t\"Asia/Pyongyang\"                : [\"KP\"],\n\t\t\"Asia/Qatar\"                    : [\"QA\", \"BH\"],\n\t\t\"Asia/Qostanay\"                 : [\"KZ\"],\n\t\t\"Asia/Qyzylorda\"                : [\"KZ\"],\n\t\t\"Asia/Riyadh\"                   : [\"SA\", \"AQ\", \"KW\", \"YE\"],\n\t\t\"Asia/Sakhalin\"                 : [\"RU\"],\n\t\t\"Asia/Samarkand\"                : [\"UZ\"],\n\t\t\"Asia/Seoul\"                    : [\"KR\"],\n\t\t\"Asia/Shanghai\"                 : [\"CN\"],\n\t\t\"Asia/Singapore\"                : [\"SG\", \"MY\"],\n\t\t\"Asia/Srednekolymsk\"            : [\"RU\"],\n\t\t\"Asia/Taipei\"                   : [\"TW\"],\n\t\t\"Asia/Tashkent\"                 : [\"UZ\"],\n\t\t\"Asia/Tbilisi\"                  : [\"GE\"],\n\t\t\"Asia/Tehran\"                   : [\"IR\"],\n\t\t\"Asia/Thimphu\"                  : [\"BT\"],\n\t\t\"Asia/Tokyo\"                    : [\"JP\"],\n\t\t\"Asia/Tomsk\"                    : [\"RU\"],\n\t\t\"Asia/Ulaanbaatar\"              : [\"MN\"],\n\t\t\"Asia/Urumqi\"                   : [\"CN\"],\n\t\t\"Asia/Ust-Nera\"                 : [\"RU\"],\n\t\t\"Asia/Vientiane\"                : [\"LA\"],\n\t\t\"Asia/Vladivostok\"              : [\"RU\"],\n\t\t\"Asia/Yakutsk\"                  : [\"RU\"],\n\t\t\"Asia/Yangon\"                   : [\"MM\"],\n\t\t\"Asia/Yekaterinburg\"            : [\"RU\"],\n\t\t\"Asia/Yerevan\"                  : [\"AM\"],\n\t\t\"Atlantic/Azores\"               : [\"PT\"],\n\t\t\"Atlantic/Bermuda\"              : [\"BM\"],\n\t\t\"Atlantic/Canary\"               : [\"ES\"],\n\t\t\"Atlantic/Cape_Verde\"           : [\"CV\"],\n\t\t\"Atlantic/Faroe\"                : [\"FO\"],\n\t\t\"Atlantic/Jan_Mayen\"            : [\"SJ\"],\n\t\t\"Atlantic/Madeira\"              : [\"PT\"],\n\t\t\"Atlantic/Reykjavik\"            : [\"IS\"],\n\t\t\"Atlantic/South_Georgia\"        : [\"GS\"],\n\t\t\"Atlantic/St_Helena\"            : [\"SH\"],\n\t\t\"Atlantic/Stanley\"              : [\"FK\"],\n\t\t\"Australia/Adelaide\"            : [\"AU\"],\n\t\t\"Australia/Brisbane\"            : [\"AU\"],\n\t\t\"Australia/Broken_Hill\"         : [\"AU\"],\n\t\t\"Australia/Darwin\"              : [\"AU\"],\n\t\t\"Australia/Eucla\"               : [\"AU\"],\n\t\t\"Australia/Hobart\"              : [\"AU\"],\n\t\t\"Australia/Lindeman\"            : [\"AU\"],\n\t\t\"Australia/Lord_Howe\"           : [\"AU\"],\n\t\t\"Australia/Melbourne\"           : [\"AU\"],\n\t\t\"Australia/Perth\"               : [\"AU\"],\n\t\t\"Australia/Sydney\"              : [\"AU\"],\n\t\t\"Canada/Eastern\"                : [\"CA\"],\n\t\t\"Europe/Amsterdam\"              : [\"NL\"],\n\t\t\"Europe/Andorra\"                : [\"AD\"],\n\t\t\"Europe/Astrakhan\"              : [\"RU\"],\n\t\t\"Europe/Athens\"                 : [\"GR\"],\n\t\t\"Europe/Belfast\"                : [\"GB\"],\n\t\t\"Europe/Belgrade\"               : [\"RS\", \"BA\", \"HR\", \"ME\", \"MK\", \"SI\"],\n\t\t\"Europe/Berlin\"                 : [\"DE\"],\n\t\t\"Europe/Bratislava\"             : [\"SK\"],\n\t\t\"Europe/Brussels\"               : [\"BE\"],\n\t\t\"Europe/Bucharest\"              : [\"RO\"],\n\t\t\"Europe/Budapest\"               : [\"HU\"],\n\t\t\"Europe/Busingen\"               : [\"DE\"],\n\t\t\"Europe/Chisinau\"               : [\"MD\"],\n\t\t\"Europe/Copenhagen\"             : [\"DK\"],\n\t\t\"Europe/Dublin\"                 : [\"IE\"],\n\t\t\"Europe/Gibraltar\"              : [\"GI\"],\n\t\t\"Europe/Guernsey\"               : [\"GG\"],\n\t\t\"Europe/Helsinki\"               : [\"FI\", \"AX\"],\n\t\t\"Europe/Isle_of_Man\"            : [\"IM\"],\n\t\t\"Europe/Istanbul\"               : [\"TR\"],\n\t\t\"Europe/Jersey\"                 : [\"JE\"],\n\t\t\"Europe/Kaliningrad\"            : [\"RU\"],\n\t\t\"Europe/Kiev\"                   : [\"UA\"],\n\t\t\"Europe/Kirov\"                  : [\"RU\"],\n\t\t\"Europe/Lisbon\"                 : [\"PT\"],\n\t\t\"Europe/Ljubljana\"              : [\"SI\"],\n\t\t\"Europe/London\"                 : [\"GB\", \"GG\", \"IM\", \"JE\"],\n\t\t\"Europe/Luxembourg\"             : [\"LU\"],\n\t\t\"Europe/Madrid\"                 : [\"ES\"],\n\t\t\"Europe/Malta\"                  : [\"MT\"],\n\t\t\"Europe/Mariehamn\"              : [\"AX\"],\n\t\t\"Europe/Minsk\"                  : [\"BY\"],\n\t\t\"Europe/Monaco\"                 : [\"MC\"],\n\t\t\"Europe/Moscow\"                 : [\"RU\"],\n\t\t\"Europe/Oslo\"                   : [\"NO\", \"SJ\", \"BV\"],\n\t\t\"Europe/Paris\"                  : [\"FR\"],\n\t\t\"Europe/Podgorica\"              : [\"ME\"],\n\t\t\"Europe/Prague\"                 : [\"CZ\", \"SK\"],\n\t\t\"Europe/Riga\"                   : [\"LV\"],\n\t\t\"Europe/Rome\"                   : [\"IT\", \"SM\", \"VA\"],\n\t\t\"Europe/Samara\"                 : [\"RU\"],\n\t\t\"Europe/San_Marino\"             : [\"SM\"],\n\t\t\"Europe/Sarajevo\"               : [\"BA\"],\n\t\t\"Europe/Saratov\"                : [\"RU\"],\n\t\t\"Europe/Simferopol\"             : [\"RU\", \"UA\"],\n\t\t\"Europe/Skopje\"                 : [\"MK\"],\n\t\t\"Europe/Sofia\"                  : [\"BG\"],\n\t\t\"Europe/Stockholm\"              : [\"SE\"],\n\t\t\"Europe/Tallinn\"                : [\"EE\"],\n\t\t\"Europe/Tirane\"                 : [\"AL\"],\n\t\t\"Europe/Ulyanovsk\"              : [\"RU\"],\n\t\t\"Europe/Uzhgorod\"               : [\"UA\"],\n\t\t\"Europe/Vaduz\"                  : [\"LI\"],\n\t\t\"Europe/Vatican\"                : [\"VA\"],\n\t\t\"Europe/Vienna\"                 : [\"AT\"],\n\t\t\"Europe/Vilnius\"                : [\"LT\"],\n\t\t\"Europe/Volgograd\"              : [\"RU\"],\n\t\t\"Europe/Warsaw\"                 : [\"PL\"],\n\t\t\"Europe/Zagreb\"                 : [\"HR\"],\n\t\t\"Europe/Zaporozhye\"             : [\"UA\"],\n\t\t\"Europe/Zurich\"                 : [\"CH\", \"DE\", \"LI\"],\n\t\t\"GB\"                            : [\"GB\"],\n\t\t\"GB-Eire\"                       : [\"GB\"],\n\t\t\"Indian/Antananarivo\"           : [\"MG\"],\n\t\t\"Indian/Chagos\"                 : [\"IO\"],\n\t\t\"Indian/Christmas\"              : [\"CX\"],\n\t\t\"Indian/Cocos\"                  : [\"CC\"],\n\t\t\"Indian/Comoro\"                 : [\"KM\"],\n\t\t\"Indian/Kerguelen\"              : [\"TF\", \"HM\"],\n\t\t\"Indian/Mahe\"                   : [\"SC\"],\n\t\t\"Indian/Maldives\"               : [\"MV\"],\n\t\t\"Indian/Mauritius\"              : [\"MU\"],\n\t\t\"Indian/Mayotte\"                : [\"YT\"],\n\t\t\"Indian/Reunion\"                : [\"RE\", \"TF\"],\n\t\t\"NZ\"                            : [\"NZ\"],\n\t\t\"Pacific/Apia\"                  : [\"WS\"],\n\t\t\"Pacific/Auckland\"              : [\"NZ\", \"AQ\"],\n\t\t\"Pacific/Bougainville\"          : [\"PG\"],\n\t\t\"Pacific/Chatham\"               : [\"NZ\"],\n\t\t\"Pacific/Chuuk\"                 : [\"FM\"],\n\t\t\"Pacific/Easter\"                : [\"CL\"],\n\t\t\"Pacific/Efate\"                 : [\"VU\"],\n\t\t\"Pacific/Fakaofo\"               : [\"TK\"],\n\t\t\"Pacific/Fiji\"                  : [\"FJ\"],\n\t\t\"Pacific/Funafuti\"              : [\"TV\"],\n\t\t\"Pacific/Galapagos\"             : [\"EC\"],\n\t\t\"Pacific/Gambier\"               : [\"PF\"],\n\t\t\"Pacific/Guadalcanal\"           : [\"SB\"],\n\t\t\"Pacific/Guam\"                  : [\"GU\", \"MP\"],\n\t\t\"Pacific/Honolulu\"              : [\"US\", \"UM\"],\n\t\t\"Pacific/Johnston\"              : [\"UM\"],\n\t\t\"Pacific/Kanton\"                : [\"KI\"],\n\t\t\"Pacific/Kiritimati\"            : [\"KI\"],\n\t\t\"Pacific/Kosrae\"                : [\"FM\"],\n\t\t\"Pacific/Kwajalein\"             : [\"MH\"],\n\t\t\"Pacific/Majuro\"                : [\"MH\"],\n\t\t\"Pacific/Marquesas\"             : [\"PF\"],\n\t\t\"Pacific/Midway\"                : [\"UM\"],\n\t\t\"Pacific/Nauru\"                 : [\"NR\"],\n\t\t\"Pacific/Niue\"                  : [\"NU\"],\n\t\t\"Pacific/Norfolk\"               : [\"NF\"],\n\t\t\"Pacific/Noumea\"                : [\"NC\"],\n\t\t\"Pacific/Pago_Pago\"             : [\"AS\", \"UM\"],\n\t\t\"Pacific/Palau\"                 : [\"PW\"],\n\t\t\"Pacific/Pitcairn\"              : [\"PN\"],\n\t\t\"Pacific/Pohnpei\"               : [\"FM\"],\n\t\t\"Pacific/Port_Moresby\"          : [\"PG\", \"AQ\"],\n\t\t\"Pacific/Rarotonga\"             : [\"CK\"],\n\t\t\"Pacific/Saipan\"                : [\"MP\"],\n\t\t\"Pacific/Samoa\"                 : [\"WS\"],\n\t\t\"Pacific/Tahiti\"                : [\"PF\"],\n\t\t\"Pacific/Tarawa\"                : [\"KI\"],\n\t\t\"Pacific/Tongatapu\"             : [\"TO\"],\n\t\t\"Pacific/Wake\"                  : [\"UM\"],\n\t\t\"Pacific/Wallis\"                : [\"WF\"],\n\t\t\"Singapore\"                     : [\"SG\"],\n\t\t\"US/Arizona\"                    : [\"US\"],\n\t\t\"US/Hawaii\"                     : [\"US\"],\n\t\t\"US/Samoa\"                      : [\"WS\"],\n\t}\n\n\tconst timezone = Intl.DateTimeFormat().resolvedOptions().timeZone\n\n\tif (timezone === \"\" || !timezone) {\n\t\treturn null\n\t}\n\n\tlet geoLocation = {\n\t\tcountryCode: timezones[timezone][0].toUpperCase(),\n\t}\n\n\t// if the timezone is equals \"America/Los_Angeles\" then add the regionCode \"US-CA\"\n\tif (timezone === \"America/Los_Angeles\") {\n\t\tgeoLocation.regionCode = \"US-CA\"\n\t}\n\n\tif (timezone === \"Europe/Zurich\") {\n\t\tgeoLocation.regionCode = \"CH-ZH\"\n\t}\n\n\treturn geoLocation\n}\n\n\n\n\n",null,"/**\n * Register event listeners\n */\n\n\n/**\n * add_to_cart event\n *\n * WC is inconsistent with events that emit add-to-cart events.\n * adding_to_cart and added_to_are legacy events. Also, they only work\n * on Ajax buttons on shop pages.\n *\n * Never add document or body selectors.\n * The document selector doesn't work.\n * The body selector will cause the events to fire twice and other erratic behavior if used along with other selectors.\n */\nconst addToCartSelectorsArray = [\n\t// \"document\",\n\t// \"body\",\n\t\".add_to_cart_button:not(.product_type_variable)\",\n\t\".ajax_add_to_cart\",\n\t\".single_add_to_cart_button\",\n];\n\nconst addToCartSelectors = pmw.prepareSelectors(addToCartSelectorsArray, \"addToCart\");\n\njQuery(addToCartSelectors).on(\"click adding_to_cart\", (event, data) => {\n\n\t// console.log(\"add_to_cart event fired at: \" + new Date().getTime())\n\t// console.log('add to cart data', data)\n\t// console.log('add to cart event', event)\n\t// console.log('add to cart jQuery(event.target.dataset)', jQuery(event.target.dataset))\n\t// console.log(\"add to cart event.target.dataset\", event.target.dataset)\n\t// console.log(\"add to cart event.target.dataset.quantity\", event.target.dataset.quantity)\n\t// console.log(\"add to cart event.target.dataset.product_id\", event.target.dataset.product_id)\n\n\ttry {\n\n\t\t// console.log(\"add_to_cart event detected\")\n\n\t\tlet quantity  = event?.target?.dataset?.quantity ? event.target.dataset.quantity : null;\n\t\tlet productId = event?.target?.dataset?.product_id ? event.target.dataset.product_id : event?.target?.value ? event.target.value : null;\n\n\t\t// let quantity  = event.target.dataset.quantity ? event.target.dataset.quantity : 1\n\t\t// let productId = event.target.dataset.product_id ? event.target.dataset.product_id : null\n\n\t\t// Only process on product pages\n\t\tif (pmwDataLayer.shop.page_type === \"product\") {\n\n\t\t\t// First process related and upsell products\n\t\t\tif (\n\t\t\t\ttypeof jQuery(event.currentTarget).attr(\"href\") !== \"undefined\"\n\t\t\t\t&& jQuery(event.currentTarget).attr(\"href\").includes(\"add-to-cart\")\n\t\t\t) {\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(event.currentTarget).data(\"product_id\");\n\t\t\t\t}\n\n\t\t\t\tpmw.addProductToCart(productId, 1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is simple product\n\t\t\tif (pmwDataLayer.shop.product_type === \"simple\") {\n\n\t\t\t\tif (quantity === null) {\n\t\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t\t}\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(event.currentTarget).val();\n\t\t\t\t}\n\n\t\t\t\t// Fallback if the body selector is used\n\t\t\t\tif (!productId) {\n\t\t\t\t\t// get the product ID from the element that has the class .product\n\t\t\t\t\t// that element will also have an ID that start with product- and ends with the product ID\n\t\t\t\t\t// example: product-123\n\t\t\t\t\t// save the product ID in the variable productId\n\t\t\t\t\tproductId = jQuery(\".product\").attr(\"id\").replace(\"product-\", \"\");\n\t\t\t\t}\n\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is variable product or variable-subscription\n\t\t\tif ([\"variable\", \"variable-subscription\"].indexOf(pmwDataLayer.shop.product_type) >= 0) {\n\n\t\t\t\tif (quantity === null) {\n\t\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t\t}\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(\"[name='variation_id']\").val();\n\t\t\t\t}\n\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is grouped product\n\t\t\tif (pmwDataLayer.shop.product_type === \"grouped\") {\n\n\t\t\t\tjQuery(\".woocommerce-grouped-product-list-item\").each((index, element) => {\n\n\t\t\t\t\t// Can't rely on  event.target.dataset as it always is sent with the parent product ID and the quantity 1\n\n\t\t\t\t\tquantity = Number(jQuery(element).find(\".input-text.qty\").val()) ? Number(jQuery(element).find(\".input-text.qty\").val()) : 1;\n\n\t\t\t\t\tlet classes = jQuery(element).attr(\"class\");\n\t\t\t\t\tproductId   = pmw.getPostIdFromString(classes);\n\n\t\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is bundle product\n\t\t\tif (pmwDataLayer.shop.product_type === \"bundle\") {\n\n\t\t\t\tif (quantity === null) {\n\t\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t\t}\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(\"input[name=add-to-cart]\").val();\n\t\t\t\t}\n\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// everything else\n\t\t\tif (quantity === null) {\n\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t}\n\n\t\t\tpmw.addProductToCart(productId, quantity);\n\n\t\t} else {\n\n\t\t\tif (quantity === null) {\n\t\t\t\tquantity = 1;\n\t\t\t}\n\n\t\t\tif (!productId) {\n\t\t\t\t// console.log(\"add to cart event.currentTarget\", event.currentTarget)\n\t\t\t\tproductId = jQuery(event.currentTarget).data(\"product_id\") ? jQuery(event.currentTarget).data(\"product_id\") : null;\n\t\t\t}\n\n\t\t\t// Another fallback to retrieve the product ID in case the ID is saved in the value attribute\n\t\t\tif (!productId) {\n\t\t\t\tproductId = jQuery(event.currentTarget).val() ? jQuery(event.currentTarget).val() : null;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tproductId\n\t\t\t\t&& quantity\n\t\t\t) {\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t}\n\t\t}\n\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n/**\n * If someone clicks anywhere on a custom /?add-to-cart=123 link\n * trigger the add to cart event\n */\n\n// jQuery(document).one(\"click\", \"a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)\", (event) => {\njQuery(\"a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)\").one(\"click\", (event) => {\n\n\ttry {\n\t\tif (jQuery(event.target).closest(\"a\").attr(\"href\")) {\n\n\t\t\tlet url = new URL(jQuery(event.currentTarget).attr(\"href\"), window.location.origin);\n\n\t\t\tif (url.searchParams.has(\"add-to-cart\")) {\n\n\t\t\t\tlet productId = url.searchParams.get(\"add-to-cart\");\n\t\t\t\tlet quantity  = url.searchParams.has(\"quantity\") ? parseInt(url.searchParams.get(\"quantity\"), 10) : 1;\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n// select item event\n// jQuery(document).on(\"click\", \".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product\", (event) => {\njQuery(\".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product\").on(\"click\", (event) => {\n\n\ttry {\n\n\t\t/**\n\t\t * On some pages the event fires multiple times, and on product pages\n\t\t * even on page load. Using e.stopPropagation helps to prevent this,\n\t\t * but I don't know why. We don't even have to use this, since only a real\n\t\t * product click yields a valid productId. So we filter the invalid click\n\t\t * events out later down in the code. I'll keep it that way because this is\n\t\t * the most compatible way across shops.\n\t\t *\n\t\t * e.stopPropagation();\n\t\t * */\n\n\t\tlet productId = jQuery(event.currentTarget).nextAll(\".pmwProductId:first\").data(\"id\");\n\n\t\t/**\n\t\t * On product pages, for some reason, the click event is triggered on the main product on page load.\n\t\t * In that case no ID is found. But we can discard it, since we only want to trigger the event on\n\t\t * related products, which are found below.\n\t\t */\n\n\t\tif (productId) {\n\n\t\t\tproductId = pmw.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tif (pmwDataLayer.products && pmwDataLayer.products[productId]) {\n\n\t\t\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId);\n\n\t\t\t\tjQuery(document).trigger(\"pmw:select-item\", product);\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n// checkout_progress event\n// track checkout option event: entered valid billing email\n// jQuery(document).on(\"input\", \"#billing_email\", (event) => {\njQuery(\"#billing_email\").on(\"input\", (event) => {\n\n\tif (pmw.isEmail(jQuery(event.currentTarget).val())) {\n\t\t// pmw.fireCheckoutOption(2);\n\t\tpmw.fireCheckoutProgress(2);\n\t\tpmw.emailSelected = true;\n\t}\n});\n\n\n/**\n * Place order button\n *\n * Track checkout option event: purchase click\n * https://stackoverflow.com/a/34112407/4688612\n * jQuery(document).one(\"click\", \"#place_order\", () => {\n *\n * Has to be hooked after document ready !\n */\njQuery(\"form.checkout\").on(\"checkout_place_order_success\", () => {\n\n\t// console log current time\n\t// console.log(\"checkout_place_order_success event fired at: \" + new Date().getTime())\n\n\tif (false === pmw.emailSelected) {\n\t\tpmw.fireCheckoutProgress(2);\n\t}\n\n\tif (false === pmw.paymentMethodSelected) {\n\t\tpmw.fireCheckoutProgress(3);\n\t\tpmw.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val());\n\t}\n\n\tpmw.fireCheckoutProgress(4);\n\n\tjQuery(document).trigger(\"pmw:place-order\", {});\n});\n\n/**\n * Update cart event\n *\n * Has to be hooked after document ready !\n */\njQuery(document).on(\"click\", \"[name='update_cart']\", () => {\n\n\ttry {\n\t\tjQuery(\".cart_item\").each((index, element) => {\n\n\t\t\tconst productId = pmw.getProductIdByCartItemElement(element);\n\n\t\t\tif (!productId) {\n\t\t\t\tconsole.error(\"Pixel Manager: Wasn't able to retrieve a productId\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst quantity = pmw.getProductQuantityByCartItemElement(element);\n\n\t\t\tif (!quantity) {\n\t\t\t\tconsole.error(\"Pixel Manager: Wasn't able to retrieve a quantity\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// console.log(\"productId\", productId)\n\t\t\t// console.log(\"quantity\", quantity)\n\n\t\t\tif (quantity === 0) {\n\t\t\t\tpmw.removeProductFromCart(productId);\n\t\t\t} else if (quantity < pmwDataLayer.cart[productId].quantity) {\n\t\t\t\tpmw.removeProductFromCart(productId, pmwDataLayer.cart[productId].quantity - quantity);\n\t\t\t} else if (quantity > pmwDataLayer.cart[productId].quantity) {\n\t\t\t\tpmw.addProductToCart(productId, quantity - pmwDataLayer.cart[productId].quantity);\n\t\t\t}\n\t\t});\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tpmw.getCartItemsFromBackend();\n\t}\n});\n\n// Supports the following plugins:\n// WooCommerce Wishlist: https://woo.com/products/woocommerce-wishlists/\n// YITH WooCommerce Wishlist: https://wordpress.org/plugins/yith-woocommerce-wishlist/\n// add_to_wishlist\njQuery(\".add_to_wishlist,.wl-add-to\").on(\"click\", event => {\n\n\ttry {\n\n\t\tlet productId;\n\n\t\tif (jQuery(event.currentTarget).data(\"productid\")) { // for the WooCommerce wishlist plugin\n\n\t\t\tproductId = jQuery(event.currentTarget).data(\"productid\");\n\t\t} else if (jQuery(event.currentTarget).data(\"product-id\")) {  // for the YITH wishlist plugin\n\n\t\t\tproductId = jQuery(event.currentTarget).data(\"product-id\");\n\t\t}\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId);\n\n\n\t\tjQuery(document).trigger(\"pmw:add-to-wishlist\", product);\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n/**\n * Called when the user selects all the required dropdowns / attributes\n *\n * Replaced by code in the event_listeners.js file in case of lazy loading\n *\n * Has to be hooked after document ready !\n *\n * https://stackoverflow.com/a/27849208/4688612\n * https://stackoverflow.com/a/65065335/4688612\n *\n */\n\nif (!pmwDataLayer?.general?.lazy_load_pmw) {\n\tpmw.registerShowVariationEventListener();\n}\n\n\n/**\n * Called on variable products when no selection has been done yet\n * or when the visitor deselects his choice.\n *\n * Has to be hooked after document ready !\n */\n\n// jQuery(function () {\n//\n// \tjQuery(\".single_variation_wrap\").on(\"hide_variation\", function () {\n//\n// \t\ttry {\n// \t\t\tlet classes   = jQuery(\"body\").attr(\"class\")\n// \t\t\tlet productId = classes.match(/(postid-)(\\d+)/)[2]\n//\n// \t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n//\n// \t\t\t/**\n// \t\t\t * If we have a variable product with no preset,\n// \t\t\t * and variations output is enabled,\n// \t\t\t * then we send a viewItem event with the first\n// \t\t\t * variation we find for the parent.\n// \t\t\t * If variations output is disabled,\n// \t\t\t * we just send the parent ID.\n// \t\t\t *\n// \t\t\t * And if Facebook microdata is active, use the\n// \t\t\t * microdata product ID.\n// \t\t\t */\n//\n// \t\t\tif (\n// \t\t\t\t\"variable\" === pmwDataLayer.shop.product_type &&\n// \t\t\t\tpmwDataLayer?.shop?.variations_output\n// \t\t\t) {\n// \t\t\t\tfor (const [key, product] of Object.entries(pmwDataLayer.products)) {\n// \t\t\t\t\tif (\"parent_id\" in product) {\n//\n// \t\t\t\t\t\tproductId = product.id\n// \t\t\t\t\t\tbreak\n// \t\t\t\t\t}\n// \t\t\t\t}\n//\n// \t\t\t\tif (pmwDataLayer?.pixels?.facebook?.microdata_product_id) {\n// \t\t\t\t\tproductId = pmwDataLayer.pixels.facebook.microdata_product_id\n// \t\t\t\t}\n// \t\t\t}\n//\n// \t\t\t// console.log(\"hmm\")\n// \t\t\tpmw.triggerViewItemEventPrep(productId)\n//\n// \t\t} catch (e) {\n// \t\t\tconsole.error(e)\n// \t\t}\n// \t})\n// })\n\n// jQuery(function () {\n//\n// \tjQuery(\".single_variation_wrap\").on(\"hide_variation\", function () {\n// \t\tjQuery(document).trigger(\"pmw:view-item\")\n// \t})\n// })\n","(function (pmw, $, undefined) {\n\n\tconst PMW_LIBRARY_VERSION = \"1.56.0\"\n\n\tpmw.getLibraryVersion = () => {\n\t\treturn PMW_LIBRARY_VERSION\n\t}\n\n\tpmw.checkLibraryVersion = () => {\n\n\t\tif (pmw.getLibraryVersion() !== pmwDataLayer?.version?.number) {\n\t\t\tconsole.error(`Pixel Manager: The library version ${pmw.getLibraryVersion()} and pmwDataLayer.version.number ${pmwDataLayer.version.number} do not match. Delete the server-side cache and try again.`)\n\t\t}\n\t}\n\n}(window.pmw = window.pmw || {}, jQuery))\n\n","/**\n * Pixel Registry\n *\n * Central registry for managing pixel configurations and adapters.\n * Provides methods to query which pixels are active and retrieve their adapters.\n *\n * Firing Modes:\n * - browser_only: Fire only in browser (Microsoft Ads, Taboola)\n * - server_only: Fire only server-side, suppress browser pixel (admin choice)\n * - both: Fire both browser and server with event_id for deduplication (Facebook, TikTok)\n * - browser_or_server: Fire one or the other, never both (GA4 purchase)\n *\n * @since 1.51.0\n */\n\n(function (pmw, $, undefined) {\n\n\t/**\n\t * Valid firing modes\n\t * @type {string[]}\n\t */\n\tconst VALID_FIRING_MODES = [\"browser_only\", \"server_only\", \"both\", \"browser_or_server\"];\n\n\t/**\n\t * Default firing mode for pixels that don't specify one\n\t * @type {string}\n\t */\n\tconst DEFAULT_FIRING_MODE = \"browser_only\";\n\n\t/**\n\t * Pixel Registry namespace\n\t */\n\tpmw.pixelRegistry = {\n\n\t\t/**\n\t\t * Get all active pixels (both browser-only and S2S-capable)\n\t\t *\n\t\t * Queries each registered adapter's isActive function to determine\n\t\t * if the pixel should be loaded based on pmwDataLayer configuration.\n\t\t *\n\t\t * @returns {string[]} Array of active pixel names\n\t\t */\n\t\tgetActivePixels() {\n\t\t\tconst activePixels = [];\n\n\t\t\tif (!pmw.pixelCapabilities) {\n\t\t\t\treturn activePixels;\n\t\t\t}\n\n\t\t\t// Check each registered pixel's isActive function\n\t\t\tfor (const [pixelName, capabilities] of Object.entries(pmw.pixelCapabilities)) {\n\t\t\t\tif (typeof capabilities.isActive === \"function\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (capabilities.isActive()) {\n\t\t\t\t\t\t\tactivePixels.push(pixelName);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tpmw.console.error(`Error checking if ${pixelName} is active:`, e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn activePixels;\n\t\t},\n\n\t\t/**\n\t\t * Get browser-only pixels (pixels that don't support S2S)\n\t\t *\n\t\t * @returns {string[]} Array of browser-only pixel names\n\t\t */\n\t\tgetActiveBrowserOnlyPixels() {\n\t\t\tconst browserPixels = [];\n\t\t\tconst activePixels  = this.getActivePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\t// If pixel doesn't support S2S, it's browser-only\n\t\t\t\tif (pmw.pixelCapabilities?.[pixelName]?.supportsS2S !== true) {\n\t\t\t\t\tbrowserPixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn browserPixels;\n\t\t},\n\n\t\t/**\n\t\t * Get S2S-capable pixels\n\t\t *\n\t\t * Returns pixels that declared supportsS2S capability when registering.\n\t\t * These pixels ALWAYS receive the pmw:s2s:* events to fire their browser pixels (fbq, ttq, etc.),\n\t\t * regardless of whether S2S is actually enabled. They handle their own S2S logic internally.\n\t\t *\n\t\t * @returns {string[]} Array of S2S pixel names\n\t\t */\n\t\tgetActiveS2SPixels() {\n\t\t\tconst s2sPixels    = [];\n\t\t\tconst activePixels = this.getActivePixels();\n\n\t\t\t// Check each active pixel's capabilities\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\t// Check if this pixel declared supportsS2S capability when registering\n\t\t\t\tif (pmw.pixelCapabilities?.[pixelName]?.supportsS2S === true) {\n\t\t\t\t\ts2sPixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn s2sPixels;\n\t\t},\n\n\t\t/**\n\t\t * Get adapter for a specific pixel\n\t\t *\n\t\t * @param {string} pixelName - The pixel name (e.g., 'facebook', 'google_ads')\n\t\t * @returns {object|null} The adapter object or null if not found\n\t\t */\n\t\tgetAdapter(pixelName) {\n\t\t\tif (!pmw.adapters) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn pmw.adapters[pixelName] || null;\n\t\t},\n\n\t\t/**\n\t\t * Get active pixels with a specific capability\n\t\t *\n\t\t * Returns pixels that have the specified capability flag set to true.\n\t\t * This is a generic method that allows querying any capability\n\t\t * without needing dedicated methods for each one.\n\t\t *\n\t\t * @param {string} capabilityName - The capability to check (e.g., 'supportsS2S', 'supportsPageViewS2S')\n\t\t * @returns {string[]} Array of pixel names with the specified capability\n\t\t *\n\t\t * @example\n\t\t * // Get all pixels that support page view S2S\n\t\t * pmw.pixelRegistry.getPixelsWithCapability('supportsPageViewS2S')\n\t\t * // Returns: ['facebook', 'snapchat', 'reddit']\n\t\t */\n\t\tgetPixelsWithCapability(capabilityName) {\n\t\t\tconst pixelsWithCapability = [];\n\t\t\tconst activePixels         = this.getActivePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\tif (pmw.pixelCapabilities?.[pixelName]?.[capabilityName] === true) {\n\t\t\t\t\tpixelsWithCapability.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn pixelsWithCapability;\n\t\t},\n\n\t\t/**\n\t\t * Get the firing mode for a specific pixel\n\t\t *\n\t\t * Returns the registered firing mode for the pixel. The mode determines\n\t\t * whether events fire in browser, server, or both.\n\t\t *\n\t\t * @param {string} pixelName - The pixel name\n\t\t * @returns {string} The firing mode (browser_only, server_only, both, browser_or_server)\n\t\t */\n\t\tgetFiringMode(pixelName) {\n\t\t\tconst mode = pmw.pixelCapabilities?.[pixelName]?.mode;\n\n\t\t\t// Validate mode is one of the allowed values\n\t\t\tif (mode && VALID_FIRING_MODES.includes(mode)) {\n\t\t\t\treturn mode;\n\t\t\t}\n\n\t\t\t// Legacy support: if supportsS2S is true but no mode specified, default to 'both'\n\t\t\tif (pmw.pixelCapabilities?.[pixelName]?.supportsS2S === true) {\n\t\t\t\treturn \"both\";\n\t\t\t}\n\n\t\t\treturn DEFAULT_FIRING_MODE;\n\t\t},\n\n\t\t/**\n\t\t * Determine whether browser and/or server should fire for a pixel/event combination\n\t\t *\n\t\t * This is the core method for the unified firing mode system. It considers:\n\t\t * - The pixel's registered firing mode\n\t\t * - Whether S2S is globally enabled\n\t\t * - Any filters that modify firing behavior\n\t\t *\n\t\t * @param {string} pixelName - The pixel name\n\t\t * @param {string} eventName - The event name (e.g., 'add_to_cart', 'purchase')\n\t\t * @returns {object} { fire_browser: boolean, fire_server: boolean }\n\t\t */\n\t\tgetFiringDecision(pixelName, eventName) {\n\t\t\tconst mode        = this.getFiringMode(pixelName);\n\t\t\tconst s2sEnabled  = pmwDataLayer?.general?.server_2_server?.active === true;\n\t\t\tconst supportsS2S = pmw.pixelCapabilities?.[pixelName]?.supportsS2S === true;\n\n\t\t\tlet decision = {\n\t\t\t\tfire_browser: true,\n\t\t\t\tfire_server : false,\n\t\t\t};\n\n\t\t\tswitch (mode) {\n\t\t\t\tcase \"browser_only\":\n\t\t\t\t\tdecision = {fire_browser: true, fire_server: false};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"server_only\":\n\t\t\t\t\t// Server only fires if S2S is enabled AND pixel supports it\n\t\t\t\t\tdecision = {\n\t\t\t\t\t\tfire_browser: false,\n\t\t\t\t\t\tfire_server : s2sEnabled && supportsS2S,\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"both\":\n\t\t\t\t\t// Browser always fires, server fires if enabled\n\t\t\t\t\tdecision = {\n\t\t\t\t\t\tfire_browser: true,\n\t\t\t\t\t\tfire_server : s2sEnabled && supportsS2S,\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"browser_or_server\":\n\t\t\t\t\t// If S2S enabled and supported, use server; otherwise browser\n\t\t\t\t\tif (s2sEnabled && supportsS2S) {\n\t\t\t\t\t\tdecision = {fire_browser: false, fire_server: true};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdecision = {fire_browser: true, fire_server: false};\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Apply filter to allow external modification of firing behavior\n\t\t\t// Use case: Force server-only for specific pixels, disable certain pixels per-event\n\t\t\tdecision = pmw.hooks.applyFilters(\n\t\t\t\t\"pmw_pixel_firing_decision\",\n\t\t\t\tdecision,\n\t\t\t\tpixelName,\n\t\t\t\teventName,\n\t\t\t\tmode,\n\t\t\t);\n\n\t\t\treturn decision;\n\t\t},\n\n\t\t/**\n\t\t * Get all pixels that should fire in browser for a specific event\n\t\t *\n\t\t * @param {string} eventName - The event name\n\t\t * @returns {string[]} Array of pixel names that should fire in browser\n\t\t */\n\t\tgetPixelsForBrowserFiring(eventName) {\n\t\t\tconst pixels       = [];\n\t\t\tconst activePixels = this.getActivePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\tconst decision = this.getFiringDecision(pixelName, eventName);\n\t\t\t\tif (decision.fire_browser) {\n\t\t\t\t\tpixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn pixels;\n\t\t},\n\n\t\t/**\n\t\t * Get all pixels that should fire server-side for a specific event\n\t\t *\n\t\t * @param {string} eventName - The event name\n\t\t * @returns {string[]} Array of pixel names that should fire server-side\n\t\t */\n\t\tgetPixelsForServerFiring(eventName) {\n\t\t\tconst pixels       = [];\n\t\t\tconst activePixels = this.getActivePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\tconst decision = this.getFiringDecision(pixelName, eventName);\n\t\t\t\tif (decision.fire_server) {\n\t\t\t\t\tpixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn pixels;\n\t\t},\n\t};\n\n}(window.pmw = window.pmw || {}, jQuery));",null,null,"(function() {\n  var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root, zoneIndex;\n\n  ipaddr = {};\n\n  root = this;\n\n  if ((typeof module !== \"undefined\" && module !== null) && module.exports) {\n    module.exports = ipaddr;\n  } else {\n    root['ipaddr'] = ipaddr;\n  }\n\n  matchCIDR = function(first, second, partSize, cidrBits) {\n    var part, shift;\n    if (first.length !== second.length) {\n      throw new Error(\"ipaddr: cannot match CIDR for objects with different lengths\");\n    }\n    part = 0;\n    while (cidrBits > 0) {\n      shift = partSize - cidrBits;\n      if (shift < 0) {\n        shift = 0;\n      }\n      if (first[part] >> shift !== second[part] >> shift) {\n        return false;\n      }\n      cidrBits -= partSize;\n      part += 1;\n    }\n    return true;\n  };\n\n  ipaddr.subnetMatch = function(address, rangeList, defaultName) {\n    var k, len, rangeName, rangeSubnets, subnet;\n    if (defaultName == null) {\n      defaultName = 'unicast';\n    }\n    for (rangeName in rangeList) {\n      rangeSubnets = rangeList[rangeName];\n      if (rangeSubnets[0] && !(rangeSubnets[0] instanceof Array)) {\n        rangeSubnets = [rangeSubnets];\n      }\n      for (k = 0, len = rangeSubnets.length; k < len; k++) {\n        subnet = rangeSubnets[k];\n        if (address.kind() === subnet[0].kind()) {\n          if (address.match.apply(address, subnet)) {\n            return rangeName;\n          }\n        }\n      }\n    }\n    return defaultName;\n  };\n\n  ipaddr.IPv4 = (function() {\n    function IPv4(octets) {\n      var k, len, octet;\n      if (octets.length !== 4) {\n        throw new Error(\"ipaddr: ipv4 octet count should be 4\");\n      }\n      for (k = 0, len = octets.length; k < len; k++) {\n        octet = octets[k];\n        if (!((0 <= octet && octet <= 255))) {\n          throw new Error(\"ipaddr: ipv4 octet should fit in 8 bits\");\n        }\n      }\n      this.octets = octets;\n    }\n\n    IPv4.prototype.kind = function() {\n      return 'ipv4';\n    };\n\n    IPv4.prototype.toString = function() {\n      return this.octets.join(\".\");\n    };\n\n    IPv4.prototype.toNormalizedString = function() {\n      return this.toString();\n    };\n\n    IPv4.prototype.toByteArray = function() {\n      return this.octets.slice(0);\n    };\n\n    IPv4.prototype.match = function(other, cidrRange) {\n      var ref;\n      if (cidrRange === void 0) {\n        ref = other, other = ref[0], cidrRange = ref[1];\n      }\n      if (other.kind() !== 'ipv4') {\n        throw new Error(\"ipaddr: cannot match ipv4 address with non-ipv4 one\");\n      }\n      return matchCIDR(this.octets, other.octets, 8, cidrRange);\n    };\n\n    IPv4.prototype.SpecialRanges = {\n      unspecified: [[new IPv4([0, 0, 0, 0]), 8]],\n      broadcast: [[new IPv4([255, 255, 255, 255]), 32]],\n      multicast: [[new IPv4([224, 0, 0, 0]), 4]],\n      linkLocal: [[new IPv4([169, 254, 0, 0]), 16]],\n      loopback: [[new IPv4([127, 0, 0, 0]), 8]],\n      carrierGradeNat: [[new IPv4([100, 64, 0, 0]), 10]],\n      \"private\": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]],\n      reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]]\n    };\n\n    IPv4.prototype.range = function() {\n      return ipaddr.subnetMatch(this, this.SpecialRanges);\n    };\n\n    IPv4.prototype.toIPv4MappedAddress = function() {\n      return ipaddr.IPv6.parse(\"::ffff:\" + (this.toString()));\n    };\n\n    IPv4.prototype.prefixLengthFromSubnetMask = function() {\n      var cidr, i, k, octet, stop, zeros, zerotable;\n      zerotable = {\n        0: 8,\n        128: 7,\n        192: 6,\n        224: 5,\n        240: 4,\n        248: 3,\n        252: 2,\n        254: 1,\n        255: 0\n      };\n      cidr = 0;\n      stop = false;\n      for (i = k = 3; k >= 0; i = k += -1) {\n        octet = this.octets[i];\n        if (octet in zerotable) {\n          zeros = zerotable[octet];\n          if (stop && zeros !== 0) {\n            return null;\n          }\n          if (zeros !== 8) {\n            stop = true;\n          }\n          cidr += zeros;\n        } else {\n          return null;\n        }\n      }\n      return 32 - cidr;\n    };\n\n    return IPv4;\n\n  })();\n\n  ipv4Part = \"(0?\\\\d+|0x[a-f0-9]+)\";\n\n  ipv4Regexes = {\n    fourOctet: new RegExp(\"^\" + ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part + \"$\", 'i'),\n    longValue: new RegExp(\"^\" + ipv4Part + \"$\", 'i')\n  };\n\n  ipaddr.IPv4.parser = function(string) {\n    var match, parseIntAuto, part, shift, value;\n    parseIntAuto = function(string) {\n      if (string[0] === \"0\" && string[1] !== \"x\") {\n        return parseInt(string, 8);\n      } else {\n        return parseInt(string);\n      }\n    };\n    if (match = string.match(ipv4Regexes.fourOctet)) {\n      return (function() {\n        var k, len, ref, results;\n        ref = match.slice(1, 6);\n        results = [];\n        for (k = 0, len = ref.length; k < len; k++) {\n          part = ref[k];\n          results.push(parseIntAuto(part));\n        }\n        return results;\n      })();\n    } else if (match = string.match(ipv4Regexes.longValue)) {\n      value = parseIntAuto(match[1]);\n      if (value > 0xffffffff || value < 0) {\n        throw new Error(\"ipaddr: address outside defined range\");\n      }\n      return ((function() {\n        var k, results;\n        results = [];\n        for (shift = k = 0; k <= 24; shift = k += 8) {\n          results.push((value >> shift) & 0xff);\n        }\n        return results;\n      })()).reverse();\n    } else {\n      return null;\n    }\n  };\n\n  ipaddr.IPv6 = (function() {\n    function IPv6(parts, zoneId) {\n      var i, k, l, len, part, ref;\n      if (parts.length === 16) {\n        this.parts = [];\n        for (i = k = 0; k <= 14; i = k += 2) {\n          this.parts.push((parts[i] << 8) | parts[i + 1]);\n        }\n      } else if (parts.length === 8) {\n        this.parts = parts;\n      } else {\n        throw new Error(\"ipaddr: ipv6 part count should be 8 or 16\");\n      }\n      ref = this.parts;\n      for (l = 0, len = ref.length; l < len; l++) {\n        part = ref[l];\n        if (!((0 <= part && part <= 0xffff))) {\n          throw new Error(\"ipaddr: ipv6 part should fit in 16 bits\");\n        }\n      }\n      if (zoneId) {\n        this.zoneId = zoneId;\n      }\n    }\n\n    IPv6.prototype.kind = function() {\n      return 'ipv6';\n    };\n\n    IPv6.prototype.toString = function() {\n      return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/, '::');\n    };\n\n    IPv6.prototype.toRFC5952String = function() {\n      var bestMatchIndex, bestMatchLength, match, regex, string;\n      regex = /((^|:)(0(:|$)){2,})/g;\n      string = this.toNormalizedString();\n      bestMatchIndex = 0;\n      bestMatchLength = -1;\n      while ((match = regex.exec(string))) {\n        if (match[0].length > bestMatchLength) {\n          bestMatchIndex = match.index;\n          bestMatchLength = match[0].length;\n        }\n      }\n      if (bestMatchLength < 0) {\n        return string;\n      }\n      return string.substring(0, bestMatchIndex) + '::' + string.substring(bestMatchIndex + bestMatchLength);\n    };\n\n    IPv6.prototype.toByteArray = function() {\n      var bytes, k, len, part, ref;\n      bytes = [];\n      ref = this.parts;\n      for (k = 0, len = ref.length; k < len; k++) {\n        part = ref[k];\n        bytes.push(part >> 8);\n        bytes.push(part & 0xff);\n      }\n      return bytes;\n    };\n\n    IPv6.prototype.toNormalizedString = function() {\n      var addr, part, suffix;\n      addr = ((function() {\n        var k, len, ref, results;\n        ref = this.parts;\n        results = [];\n        for (k = 0, len = ref.length; k < len; k++) {\n          part = ref[k];\n          results.push(part.toString(16));\n        }\n        return results;\n      }).call(this)).join(\":\");\n      suffix = '';\n      if (this.zoneId) {\n        suffix = '%' + this.zoneId;\n      }\n      return addr + suffix;\n    };\n\n    IPv6.prototype.toFixedLengthString = function() {\n      var addr, part, suffix;\n      addr = ((function() {\n        var k, len, ref, results;\n        ref = this.parts;\n        results = [];\n        for (k = 0, len = ref.length; k < len; k++) {\n          part = ref[k];\n          results.push(part.toString(16).padStart(4, '0'));\n        }\n        return results;\n      }).call(this)).join(\":\");\n      suffix = '';\n      if (this.zoneId) {\n        suffix = '%' + this.zoneId;\n      }\n      return addr + suffix;\n    };\n\n    IPv6.prototype.match = function(other, cidrRange) {\n      var ref;\n      if (cidrRange === void 0) {\n        ref = other, other = ref[0], cidrRange = ref[1];\n      }\n      if (other.kind() !== 'ipv6') {\n        throw new Error(\"ipaddr: cannot match ipv6 address with non-ipv6 one\");\n      }\n      return matchCIDR(this.parts, other.parts, 16, cidrRange);\n    };\n\n    IPv6.prototype.SpecialRanges = {\n      unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128],\n      linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10],\n      multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8],\n      loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128],\n      uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7],\n      ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96],\n      rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96],\n      rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96],\n      '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16],\n      teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32],\n      reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]]\n    };\n\n    IPv6.prototype.range = function() {\n      return ipaddr.subnetMatch(this, this.SpecialRanges);\n    };\n\n    IPv6.prototype.isIPv4MappedAddress = function() {\n      return this.range() === 'ipv4Mapped';\n    };\n\n    IPv6.prototype.toIPv4Address = function() {\n      var high, low, ref;\n      if (!this.isIPv4MappedAddress()) {\n        throw new Error(\"ipaddr: trying to convert a generic ipv6 address to ipv4\");\n      }\n      ref = this.parts.slice(-2), high = ref[0], low = ref[1];\n      return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]);\n    };\n\n    IPv6.prototype.prefixLengthFromSubnetMask = function() {\n      var cidr, i, k, part, stop, zeros, zerotable;\n      zerotable = {\n        0: 16,\n        32768: 15,\n        49152: 14,\n        57344: 13,\n        61440: 12,\n        63488: 11,\n        64512: 10,\n        65024: 9,\n        65280: 8,\n        65408: 7,\n        65472: 6,\n        65504: 5,\n        65520: 4,\n        65528: 3,\n        65532: 2,\n        65534: 1,\n        65535: 0\n      };\n      cidr = 0;\n      stop = false;\n      for (i = k = 7; k >= 0; i = k += -1) {\n        part = this.parts[i];\n        if (part in zerotable) {\n          zeros = zerotable[part];\n          if (stop && zeros !== 0) {\n            return null;\n          }\n          if (zeros !== 16) {\n            stop = true;\n          }\n          cidr += zeros;\n        } else {\n          return null;\n        }\n      }\n      return 128 - cidr;\n    };\n\n    return IPv6;\n\n  })();\n\n  ipv6Part = \"(?:[0-9a-f]+::?)+\";\n\n  zoneIndex = \"%[0-9a-z]{1,}\";\n\n  ipv6Regexes = {\n    zoneIndex: new RegExp(zoneIndex, 'i'),\n    \"native\": new RegExp(\"^(::)?(\" + ipv6Part + \")?([0-9a-f]+)?(::)?(\" + zoneIndex + \")?$\", 'i'),\n    transitional: new RegExp((\"^((?:\" + ipv6Part + \")|(?:::)(?:\" + ipv6Part + \")?)\") + (ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part) + (\"(\" + zoneIndex + \")?$\"), 'i')\n  };\n\n  expandIPv6 = function(string, parts) {\n    var colonCount, lastColon, part, replacement, replacementCount, zoneId;\n    if (string.indexOf('::') !== string.lastIndexOf('::')) {\n      return null;\n    }\n    zoneId = (string.match(ipv6Regexes['zoneIndex']) || [])[0];\n    if (zoneId) {\n      zoneId = zoneId.substring(1);\n      string = string.replace(/%.+$/, '');\n    }\n    colonCount = 0;\n    lastColon = -1;\n    while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) {\n      colonCount++;\n    }\n    if (string.substr(0, 2) === '::') {\n      colonCount--;\n    }\n    if (string.substr(-2, 2) === '::') {\n      colonCount--;\n    }\n    if (colonCount > parts) {\n      return null;\n    }\n    replacementCount = parts - colonCount;\n    replacement = ':';\n    while (replacementCount--) {\n      replacement += '0:';\n    }\n    string = string.replace('::', replacement);\n    if (string[0] === ':') {\n      string = string.slice(1);\n    }\n    if (string[string.length - 1] === ':') {\n      string = string.slice(0, -1);\n    }\n    parts = (function() {\n      var k, len, ref, results;\n      ref = string.split(\":\");\n      results = [];\n      for (k = 0, len = ref.length; k < len; k++) {\n        part = ref[k];\n        results.push(parseInt(part, 16));\n      }\n      return results;\n    })();\n    return {\n      parts: parts,\n      zoneId: zoneId\n    };\n  };\n\n  ipaddr.IPv6.parser = function(string) {\n    var addr, k, len, match, octet, octets, zoneId;\n    if (ipv6Regexes['native'].test(string)) {\n      return expandIPv6(string, 8);\n    } else if (match = string.match(ipv6Regexes['transitional'])) {\n      zoneId = match[6] || '';\n      addr = expandIPv6(match[1].slice(0, -1) + zoneId, 6);\n      if (addr.parts) {\n        octets = [parseInt(match[2]), parseInt(match[3]), parseInt(match[4]), parseInt(match[5])];\n        for (k = 0, len = octets.length; k < len; k++) {\n          octet = octets[k];\n          if (!((0 <= octet && octet <= 255))) {\n            return null;\n          }\n        }\n        addr.parts.push(octets[0] << 8 | octets[1]);\n        addr.parts.push(octets[2] << 8 | octets[3]);\n        return {\n          parts: addr.parts,\n          zoneId: addr.zoneId\n        };\n      }\n    }\n    return null;\n  };\n\n  ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) {\n    return this.parser(string) !== null;\n  };\n\n  ipaddr.IPv4.isValid = function(string) {\n    var e;\n    try {\n      new this(this.parser(string));\n      return true;\n    } catch (error1) {\n      e = error1;\n      return false;\n    }\n  };\n\n  ipaddr.IPv4.isValidFourPartDecimal = function(string) {\n    if (ipaddr.IPv4.isValid(string) && string.match(/^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){3}$/)) {\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  ipaddr.IPv6.isValid = function(string) {\n    var addr, e;\n    if (typeof string === \"string\" && string.indexOf(\":\") === -1) {\n      return false;\n    }\n    try {\n      addr = this.parser(string);\n      new this(addr.parts, addr.zoneId);\n      return true;\n    } catch (error1) {\n      e = error1;\n      return false;\n    }\n  };\n\n  ipaddr.IPv4.parse = function(string) {\n    var parts;\n    parts = this.parser(string);\n    if (parts === null) {\n      throw new Error(\"ipaddr: string is not formatted like ip address\");\n    }\n    return new this(parts);\n  };\n\n  ipaddr.IPv6.parse = function(string) {\n    var addr;\n    addr = this.parser(string);\n    if (addr.parts === null) {\n      throw new Error(\"ipaddr: string is not formatted like ip address\");\n    }\n    return new this(addr.parts, addr.zoneId);\n  };\n\n  ipaddr.IPv4.parseCIDR = function(string) {\n    var maskLength, match, parsed;\n    if (match = string.match(/^(.+)\\/(\\d+)$/)) {\n      maskLength = parseInt(match[2]);\n      if (maskLength >= 0 && maskLength <= 32) {\n        parsed = [this.parse(match[1]), maskLength];\n        Object.defineProperty(parsed, 'toString', {\n          value: function() {\n            return this.join('/');\n          }\n        });\n        return parsed;\n      }\n    }\n    throw new Error(\"ipaddr: string is not formatted like an IPv4 CIDR range\");\n  };\n\n  ipaddr.IPv4.subnetMaskFromPrefixLength = function(prefix) {\n    var filledOctetCount, j, octets;\n    prefix = parseInt(prefix);\n    if (prefix < 0 || prefix > 32) {\n      throw new Error('ipaddr: invalid IPv4 prefix length');\n    }\n    octets = [0, 0, 0, 0];\n    j = 0;\n    filledOctetCount = Math.floor(prefix / 8);\n    while (j < filledOctetCount) {\n      octets[j] = 255;\n      j++;\n    }\n    if (filledOctetCount < 4) {\n      octets[filledOctetCount] = Math.pow(2, prefix % 8) - 1 << 8 - (prefix % 8);\n    }\n    return new this(octets);\n  };\n\n  ipaddr.IPv4.broadcastAddressFromCIDR = function(string) {\n    var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;\n    try {\n      cidr = this.parseCIDR(string);\n      ipInterfaceOctets = cidr[0].toByteArray();\n      subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n      octets = [];\n      i = 0;\n      while (i < 4) {\n        octets.push(parseInt(ipInterfaceOctets[i], 10) | parseInt(subnetMaskOctets[i], 10) ^ 255);\n        i++;\n      }\n      return new this(octets);\n    } catch (error1) {\n      error = error1;\n      throw new Error('ipaddr: the address does not have IPv4 CIDR format');\n    }\n  };\n\n  ipaddr.IPv4.networkAddressFromCIDR = function(string) {\n    var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;\n    try {\n      cidr = this.parseCIDR(string);\n      ipInterfaceOctets = cidr[0].toByteArray();\n      subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n      octets = [];\n      i = 0;\n      while (i < 4) {\n        octets.push(parseInt(ipInterfaceOctets[i], 10) & parseInt(subnetMaskOctets[i], 10));\n        i++;\n      }\n      return new this(octets);\n    } catch (error1) {\n      error = error1;\n      throw new Error('ipaddr: the address does not have IPv4 CIDR format');\n    }\n  };\n\n  ipaddr.IPv6.parseCIDR = function(string) {\n    var maskLength, match, parsed;\n    if (match = string.match(/^(.+)\\/(\\d+)$/)) {\n      maskLength = parseInt(match[2]);\n      if (maskLength >= 0 && maskLength <= 128) {\n        parsed = [this.parse(match[1]), maskLength];\n        Object.defineProperty(parsed, 'toString', {\n          value: function() {\n            return this.join('/');\n          }\n        });\n        return parsed;\n      }\n    }\n    throw new Error(\"ipaddr: string is not formatted like an IPv6 CIDR range\");\n  };\n\n  ipaddr.isValid = function(string) {\n    return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string);\n  };\n\n  ipaddr.parse = function(string) {\n    if (ipaddr.IPv6.isValid(string)) {\n      return ipaddr.IPv6.parse(string);\n    } else if (ipaddr.IPv4.isValid(string)) {\n      return ipaddr.IPv4.parse(string);\n    } else {\n      throw new Error(\"ipaddr: the address has neither IPv6 nor IPv4 format\");\n    }\n  };\n\n  ipaddr.parseCIDR = function(string) {\n    var e;\n    try {\n      return ipaddr.IPv6.parseCIDR(string);\n    } catch (error1) {\n      e = error1;\n      try {\n        return ipaddr.IPv4.parseCIDR(string);\n      } catch (error1) {\n        e = error1;\n        throw new Error(\"ipaddr: the address has neither IPv6 nor IPv4 CIDR format\");\n      }\n    }\n  };\n\n  ipaddr.fromByteArray = function(bytes) {\n    var length;\n    length = bytes.length;\n    if (length === 4) {\n      return new ipaddr.IPv4(bytes);\n    } else if (length === 16) {\n      return new ipaddr.IPv6(bytes);\n    } else {\n      throw new Error(\"ipaddr: the binary input is neither an IPv6 nor IPv4 address\");\n    }\n  };\n\n  ipaddr.process = function(string) {\n    var addr;\n    addr = this.parse(string);\n    if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) {\n      return addr.toIPv4Address();\n    } else {\n      return addr;\n    }\n  };\n\n}).call(this);\n","/**\n * Created by elgs on 3/5/16.\n */\nconst normalize = function (a) {\n   if (!_validate(a)) {\n      throw new Error('Invalid address: ' + a);\n   }\n   a = a.toLowerCase()\n\n   const nh = a.split(/\\:\\:/g);\n   if (nh.length > 2) {\n      throw new Error('Invalid address: ' + a);\n   }\n\n   let sections = [];\n   if (nh.length == 1) {\n      // full mode\n      sections = a.split(/\\:/g);\n      if (sections.length !== 8) {\n         throw new Error('Invalid address: ' + a);\n      }\n   } else if (nh.length == 2) {\n      // compact mode\n      const n = nh[0];\n      const h = nh[1];\n      const ns = n.split(/\\:/g);\n      const hs = h.split(/\\:/g);\n      for (let i in ns) {\n         sections[i] = ns[i];\n      }\n      for (let i = hs.length; i > 0; --i) {\n         sections[7 - (hs.length - i)] = hs[i - 1];\n      }\n   }\n   for (let i = 0; i < 8; ++i) {\n      if (sections[i] === undefined) {\n         sections[i] = '0000';\n      }\n      sections[i] = _leftPad(sections[i], '0', 4);\n   }\n   return sections.join(':');\n};\n\nconst abbreviate = function (a) {\n   if (!_validate(a)) {\n      throw new Error('Invalid address: ' + a);\n   }\n   a = normalize(a);\n   a = a.replace(/0000/g, 'g');\n   a = a.replace(/\\:000/g, ':');\n   a = a.replace(/\\:00/g, ':');\n   a = a.replace(/\\:0/g, ':');\n   a = a.replace(/g/g, '0');\n   const sections = a.split(/\\:/g);\n   let zPreviousFlag = false;\n   let zeroStartIndex = -1;\n   let zeroLength = 0;\n   let zStartIndex = -1;\n   let zLength = 0;\n   for (let i = 0; i < 8; ++i) {\n      const section = sections[i];\n      let zFlag = (section === '0');\n      if (zFlag && !zPreviousFlag) {\n         zStartIndex = i;\n      }\n      if (!zFlag && zPreviousFlag) {\n         zLength = i - zStartIndex;\n      }\n      if (zLength > 1 && zLength > zeroLength) {\n         zeroStartIndex = zStartIndex;\n         zeroLength = zLength;\n      }\n      zPreviousFlag = (section === '0');\n   }\n   if (zPreviousFlag) {\n      zLength = 8 - zStartIndex;\n   }\n   if (zLength > 1 && zLength > zeroLength) {\n      zeroStartIndex = zStartIndex;\n      zeroLength = zLength;\n   }\n   //console.log(zeroStartIndex, zeroLength);\n   //console.log(sections);\n   if (zeroStartIndex >= 0 && zeroLength > 1) {\n      sections.splice(zeroStartIndex, zeroLength, 'g');\n   }\n   //console.log(sections);\n   a = sections.join(':');\n   //console.log(a);\n   a = a.replace(/\\:g\\:/g, '::');\n   a = a.replace(/\\:g/g, '::');\n   a = a.replace(/g\\:/g, '::');\n   a = a.replace(/g/g, '::');\n   //console.log(a);\n   return a;\n};\n\n// Basic validation\nconst _validate = function (a) {\n   return /^[a-f0-9\\\\:]+$/ig.test(a);\n};\n\nconst _leftPad = function (d, p, n) {\n   const padding = p.repeat(n);\n   if (d.length < padding.length) {\n      d = padding.substring(0, padding.length - d.length) + d;\n   }\n   return d;\n};\n\nconst _hex2bin = function (hex) {\n   return parseInt(hex, 16).toString(2)\n};\nconst _bin2hex = function (bin) {\n   return parseInt(bin, 2).toString(16)\n};\n\nconst _addr2bin = function (addr) {\n   const nAddr = normalize(addr);\n   const sections = nAddr.split(\":\");\n   let binAddr = '';\n   for (const section of sections) {\n      binAddr += _leftPad(_hex2bin(section), '0', 16);\n   }\n   return binAddr;\n};\n\nconst _bin2addr = function (bin) {\n   const addr = [];\n   for (let i = 0; i < 8; ++i) {\n      const binPart = bin.substr(i * 16, 16);\n      const hexSection = _leftPad(_bin2hex(binPart), '0', 4);\n      addr.push(hexSection);\n   }\n   return addr.join(':');\n};\n\nconst divideSubnet = function (addr, mask0, mask1, limit, abbr) {\n   if (!_validate(addr)) {\n      throw new Error('Invalid address: ' + addr);\n   }\n   mask0 *= 1;\n   mask1 *= 1;\n   limit *= 1;\n   mask1 = mask1 || 128;\n   if (mask0 < 1 || mask1 < 1 || mask0 > 128 || mask1 > 128 || mask0 > mask1) {\n      throw new Error('Invalid masks.');\n   }\n   const ret = [];\n   const binAddr = _addr2bin(addr);\n   const binNetPart = binAddr.substr(0, mask0);\n   const binHostPart = '0'.repeat(128 - mask1);\n   const numSubnets = Math.pow(2, mask1 - mask0);\n   for (let i = 0; i < numSubnets; ++i) {\n      if (!!limit && i >= limit) {\n         break;\n      }\n      const binSubnet = _leftPad(i.toString(2), '0', mask1 - mask0);\n      const binSubAddr = binNetPart + binSubnet + binHostPart;\n      const hexAddr = _bin2addr(binSubAddr);\n      if (!!abbr) {\n         ret.push(abbreviate(hexAddr));\n      } else {\n         ret.push(hexAddr);\n      }\n\n   }\n   // console.log(numSubnets);\n   // console.log(binNetPart, binSubnetPart, binHostPart);\n   // console.log(binNetPart.length, binSubnetPart.length, binHostPart.length);\n   // console.log(ret.length);\n   return ret;\n};\n\nconst range = function (addr, mask0, mask1, abbr) {\n   if (!_validate(addr)) {\n      throw new Error('Invalid address: ' + addr);\n   }\n   mask0 *= 1;\n   mask1 *= 1;\n   mask1 = mask1 || 128;\n   if (mask0 < 1 || mask1 < 1 || mask0 > 128 || mask1 > 128 || mask0 > mask1) {\n      throw new Error('Invalid masks.');\n   }\n   const binAddr = _addr2bin(addr);\n   const binNetPart = binAddr.substr(0, mask0);\n   const binHostPart = '0'.repeat(128 - mask1);\n   const binStartAddr = binNetPart + '0'.repeat(mask1 - mask0) + binHostPart;\n   const binEndAddr = binNetPart + '1'.repeat(mask1 - mask0) + binHostPart;\n   if (!!abbr) {\n      return {\n         start: abbreviate(_bin2addr(binStartAddr)),\n         end: abbreviate(_bin2addr(binEndAddr)),\n         size: Math.pow(2, mask1 - mask0)\n      };\n   } else {\n      return {\n         start: _bin2addr(binStartAddr),\n         end: _bin2addr(binEndAddr),\n         size: Math.pow(2, mask1 - mask0)\n      };\n   }\n};\n\nconst randomSubnet = function (addr, mask0, mask1, limit, abbr) {\n   if (!_validate(addr)) {\n      throw new Error('Invalid address: ' + addr);\n   }\n   mask0 *= 1;\n   mask1 *= 1;\n   limit *= 1;\n   mask1 = mask1 || 128;\n   limit = limit || 1;\n   if (mask0 < 1 || mask1 < 1 || mask0 > 128 || mask1 > 128 || mask0 > mask1) {\n      throw new Error('Invalid masks.');\n   }\n   const ret = [];\n   const binAddr = _addr2bin(addr);\n   const binNetPart = binAddr.substr(0, mask0);\n   const binHostPart = '0'.repeat(128 - mask1);\n   const numSubnets = Math.pow(2, mask1 - mask0);\n   for (let i = 0; i < numSubnets && i < limit; ++i) {\n      // generate an binary string with length of mask1 - mask0\n      let binSubnet = '';\n      for (let j = 0; j < mask1 - mask0; ++j) {\n         binSubnet += Math.floor(Math.random() * 2);\n      }\n      const binSubAddr = binNetPart + binSubnet + binHostPart;\n      const hexAddr = _bin2addr(binSubAddr);\n      if (!!abbr) {\n         ret.push(abbreviate(hexAddr));\n      } else {\n         ret.push(hexAddr);\n      }\n   }\n   // console.log(numSubnets);\n   // console.log(binNetPart, binSubnetPart, binHostPart);\n   // console.log(binNetPart.length, binSubnetPart.length, binHostPart.length);\n   // console.log(ret.length);\n   return ret;\n};\n\nconst ptr = function (addr, mask) {\n   if (!_validate(addr)) {\n      throw new Error('Invalid address: ' + addr);\n   }\n   mask *= 1;\n   if (mask < 1 || mask > 128 || Math.floor(mask / 4) != mask / 4) {\n      throw new Error('Invalid masks.');\n   }\n   const fullAddr = normalize(addr);\n   const reverse = fullAddr.replace(/:/g, '').split('').reverse();\n   return reverse.slice(0, (128 - mask) / 4).join('.');\n};\n\nif (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\n   exports.normalize = normalize;\n   exports.abbreviate = abbreviate;\n   exports.divideSubnet = divideSubnet;\n   exports.range = range;\n   exports.randomSubnet = randomSubnet;\n   exports.ptr = ptr;\n} else {\n   window.normalize = normalize;\n   window.abbreviate = abbreviate;\n   window.divideSubnet = divideSubnet;\n   window.range = range;\n   window.randomSubnet = randomSubnet;\n   window.ptr = ptr;\n}\n","import ipaddr from 'ipaddr.js';\n// @ts-ignore: Can't find a @types/ip6 package\nimport ip6 from 'ip6';\n\nexport function isIP(addr: string) {\n  return ipaddr.isValid(addr);\n}\n\nexport function version(addr: string): number {\n  try {\n    const parse_addr = ipaddr.parse(addr);\n    const kind = parse_addr.kind();\n\n    if (kind === 'ipv4') {\n      return 4; //IPv4\n    } else if (kind === 'ipv6') {\n      return 6; //IPv6\n    } else {\n      /* istanbul ignore next */\n      return 0; //not 4 or 6\n    }\n  } catch (err) {\n    return 0; //not 4 or 6\n  }\n}\n\nexport function isV4(addr: string) {\n  return version(addr) === 4;\n}\n\nexport function isV6(addr: string) {\n  return version(addr) === 6;\n}\n\nexport function isRange(range: string) {\n  try {\n    const cidr = ipaddr.parseCIDR(range);\n    return true;\n  } catch (err) {\n    return false;\n  }\n}\n\nexport function inRange(addr: string, range: string | string[]) {\n  if (typeof range === 'string') {\n    if (range.indexOf('/') !== -1) {\n      try {\n        const range_data = range.split('/');\n\n        const parse_addr = ipaddr.parse(addr);\n        const parse_range = ipaddr.parse(range_data[0]);\n\n        //@ts-ignore:  It works.\n        return parse_addr.match(parse_range, range_data[1]);\n      } catch (err) {\n        return false;\n      }\n    } else {\n      addr = isV6(addr) ? ip6.normalize(addr) : addr; //v6 normalize addr\n      range = isV6(range) ? ip6.normalize(range) : range; //v6 normalize range\n\n      return isIP(range as string) && addr === range;\n    }\n  } else if (range && typeof range === 'object') {\n    //list\n    for (const check_range in range) {\n      if (inRange(addr, range[check_range]) === true) {\n        return true;\n      }\n    }\n    return false;\n  } else {\n    return false;\n  }\n}\n\nexport function storeIP(addr: string) {\n  try {\n    var parse_addr = ipaddr.parse(addr);\n    var kind = parse_addr.kind();\n\n    if (kind === 'ipv4') {\n      //is a plain v4 address\n      return addr;\n    } else if (kind === 'ipv6') {\n      //@ts-ignore:  it exists!\n      if (parse_addr.isIPv4MappedAddress()) {\n        //convert v4 mapped to v6 addresses to a v4 in it's original format\n        //@ts-ignore:  it exists!\n        return parse_addr.toIPv4Address().toString();\n      } //is a v6, abbreviate it\n      else {\n        return ip6.abbreviate(addr);\n      }\n    } else {\n      return null; //invalid IP address\n    }\n  } catch (err) {\n    return null; //invalid IP address\n  }\n}\n\n// searchIP is a aliases of storeIP\nexport { storeIP as searchIP };\n\nexport function displayIP(addr: string) {\n  try {\n    var parse_addr = ipaddr.parse(addr);\n    var kind = parse_addr.kind();\n\n    if (kind === 'ipv4') {\n      //is a plain v4 address\n      return addr;\n    } else if (kind === 'ipv6') {\n      //@ts-ignore:  it exists!\n      if (parse_addr.isIPv4MappedAddress()) {\n        //convert v4 mapped to v6 addresses to a v4 in it's original format\n        //@ts-ignore:  it exists!\n        return parse_addr.toIPv4Address().toString();\n      } //is a v6, normalize it\n      else {\n        return ip6.normalize(addr);\n      }\n    } else {\n      return ''; //invalid IP address\n    }\n  } catch (err) {\n    return ''; //invalid IP address\n  }\n}\n","/**\n * Create a wpm namespace under which all functions are declared\n */\n\n// https://stackoverflow.com/a/5947280/4688612\n\n(function (pmw, $, undefined) {\n\n\tconst pmwDeduper = {\n\t\tkeyName          : \"_wpm_order_ids\",\n\t\tcookieExpiresDays: 365,\n\t};\n\n\tconst pmwRestSettings = {\n\t\t// cookiesAvailable                  : '_wpm_cookies_are_available',\n\t\tcookiePmwRestEndpointAvailable: \"restEndpointAvailable\",\n\t\trestEndpointPost              : \"pmw/v1/test/\",\n\t\trestFails                     : 0,\n\t\trestFailsThreshold            : 10,\n\t};\n\n\tpmw.emailSelected         = false;\n\tpmw.paymentMethodSelected = false;\n\n\tpmw.isBelowRestErrorThreshold = () => pmw.retrieveData(pmwRestSettings.restFails) <= pmwRestSettings.restFailsThreshold;\n\n\tpmw.isRestEndpointAvailable = async () => {\n\n\t\t// If we already tested the endpoint and have a stored value, return it\n\t\tif (pmw.retrieveData(pmwRestSettings.cookiePmwRestEndpointAvailable)) {\n\t\t\treturn pmw.retrieveData(pmwRestSettings.cookiePmwRestEndpointAvailable);\n\t\t}\n\n\t\treturn await pmw.testEndpoint();\n\t};\n\n\t/**\n\t * Tests a given endpoint by sending a POST request. If the response status is 200, it stores `true` in the dataStorage with given cookie name; else it stores `false`.\n\t *\n\t * @param {string} url - The URL of the endpoint to test. Defaults to concatenation of `pmw.root` and `wpmRestSettings.restEndpointPost`.\n\t * @param {string} cookieName - The name of the cookie where the test result will be stored. Defaults to `wpmRestSettings.cookiePmwRestEndpointAvailable`.\n\t * @returns {Promise<boolean>} - Returns a promise that resolves to `true` if the response status is 200, and `false` otherwise.\n\t * @async\n\t */\n\tpmw.testEndpoint = async (\n\t\turl        = pmw.root + pmwRestSettings.restEndpointPost,\n\t\tcookieName = pmwRestSettings.cookiePmwRestEndpointAvailable,\n\t) => {\n\n\t\ttry {\n\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod   : \"POST\",\n\t\t\t\tmode     : \"cors\",\n\t\t\t\tcache    : \"no-cache\",\n\t\t\t\tkeepalive: true,\n\t\t\t\tredirect : \"error\",\t// don't follow redirects\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tpmw.storeData(cookieName, false);\n\t\t\t\tpmw.console.error(\"Error testing the endpoint. Status: \" + response.status + \" | response: \", response);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst responseJson = await response.json();\n\n\t\t\t// Return false if responseJson.success is not true\n\t\t\tif (!responseJson.success) {\n\t\t\t\tpmw.storeData(cookieName, false);\n\t\t\t\tpmw.console.error(\"Error testing the endpoint. Response JSON: \" + JSON.stringify(responseJson));\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tpmw.storeData(cookieName, true);\n\t\t\treturn true;\n\n\t\t} catch (e) {\n\t\t\tpmw.storeData(cookieName, false);\n\t\t\tpmw.console.error(\"Error testing the endpoint. Error: \" + e);\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tpmw.isPmwRestEndpointAvailable = (cookieName = pmwRestSettings.cookiePmwRestEndpointAvailable) => !!pmw.retrieveData(cookieName);\n\n\t/**\n\t * This function writes the provided orderId into storage. It will first retrieve the existing orderIds\n\t * from the storage if any, then add the new orderId into this existing array of orderIds  and stores\n\t * the updated array back to the storage.\n\t * If the function pmw.storeOrderIdOnServer exists and order_duplication_prevention is set to true in pmwDataLayer.shop,\n\t * this function will also store the orderId, orderKey and source on the server side using pmw.storeOrderIdOnServer.\n\t *\n\t * @param {String}  orderId  - The ID of the order to be stored.\n\t * @param {String}  orderKey - The Key of the order to be stored.\n\t * @param {String}  source - The source from which the order originated (default: 'thankyou_page').\n\t */\n\tpmw.writeOrderIdToStorage = (orderId, orderKey, source = \"thankyou_page\") => {\n\n\t\t// Get existing order ids\n\t\tlet orderIds = pmw.retrieveData(\"orderIds\", true) || [];\n\n\t\t// Add the new order id\n\t\torderIds.push(orderId);\n\n\t\t// Store the order ids\n\t\tpmw.storeData(\"orderIds\", orderIds, true);\n\n\t\tif (typeof pmw.storeOrderIdOnServer === \"function\") {\n\t\t\tpmw.storeOrderIdOnServer({\n\t\t\t\torderId : orderId,\n\t\t\t\torderKey: orderKey,\n\t\t\t\tsource  : source,\n\t\t\t});\n\t\t}\n\t};\n\n\tpmw.isOrderIdStored = orderId => {\n\n\t\t// If order deduplication is disabled, return false\n\t\tif (!pmwDataLayer.shop.order_duplication_prevention) {\n\t\t\tpmw.console.log(\"order duplication prevention is off\");\n\t\t\treturn false;\n\t\t}\n\n\t\tconst orderIds = pmw.retrieveData(\"orderIds\", true) || [];\n\t\treturn orderIds.includes(orderId);\n\t};\n\n\t/**\n\t * Check if the email address is valid\n\t *\n\t * https://stackoverflow.com/questions/201323/how-can-i-validate-an-email-address-using-a-regular-expression\n\t * https://www.w3.org/TR/html5/forms.html#valid-e-mail-address\n\t * https://fightingforalostcause.net/content/misc/2006/compare-email-regex.php\n\t *\n\t * @param email\n\t * @returns {boolean}\n\t */\n\tpmw.isEmail = email => {\n\n\t\t/**\n\t\t * GitHub Copilot generated RFC 5322 compliant regex\n\t\t * - Don't allow emails without a top-level domain like \"john@localhost\"\n\t\t * - Don't allow emails with dots at the end of the name like \"[email protected]\"\n\t\t */\n\t\tconst regex = new RegExp(\n\t\t\t\"^(([^<>()\\\\[\\\\]\\\\\\\\.,;:\\\\s@\\\"]+(\\\\.[^<>()\\\\[\\\\]\\\\\\\\.,;:\\\\s@\\\"]+)*)|(\\\".+\\\"))\"\n\t\t\t+ \"@\"\n\t\t\t+ \"((\\\\[[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\])\"\n\t\t\t+ \"|(([a-zA-Z\\\\-0-9]+\\\\.)+[a-zA-Z]{2,}))$\",\n\t\t);\n\n\t\treturn regex.test(email);\n\t};\n\n\tpmw.removeProductFromCart = async (productId, quantityToRemove = null) => {\n\n\t\ttry {\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tproductId = pmw.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tlet quantity;\n\n\t\t\tif (quantityToRemove == null) {\n\t\t\t\tquantity = pmwDataLayer.cart[productId].quantity;\n\t\t\t} else {\n\t\t\t\tquantity = quantityToRemove;\n\t\t\t}\n\n\t\t\tif (!pmwDataLayer.cart[productId]) {\n\t\t\t\tawait pmw.getProductsFromBackend([productId]);\n\t\t\t}\n\n\t\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId, quantity);\n\n\t\t\tjQuery(document).trigger(\"pmw:remove-from-cart\", product);\n\n\t\t\tif (quantityToRemove == null || pmwDataLayer.cart[productId].quantity === quantityToRemove) {\n\t\t\t\tdelete pmwDataLayer.cart[productId];\n\t\t\t} else {\n\t\t\t\tpmwDataLayer.cart[productId].quantity = pmwDataLayer.cart[productId].quantity - quantity;\n\t\t\t}\n\n\t\t\tpmw.storeCartData(pmwDataLayer.cart);\n\n\t\t} catch (e) {\n\t\t\tpmw.console.error(\"error: \", e);\n\t\t}\n\t};\n\n\tpmw.getIdBasedOndVariationsOutputSetting = productId => {\n\n\t\ttry {\n\t\t\tif (pmwDataLayer?.shop?.variations_output) return productId;\n\n\t\t\tif (pmwDataLayer.products[productId].is_variation) return pmwDataLayer.products[productId].parent_id;\n\n\t\t\treturn productId;\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.prepareSelectors = (selectors, type) => {\n\n\t\tif (pmwDataLayer?.shop?.selectors?.[type]) {\n\n\t\t\t// merge the selectors from the addToCartSelectors array with the selectors from the pmwDataLayer.shop.selectors.addToCart array\n\t\t\tselectors = selectors.concat(pmwDataLayer.shop.selectors[type]);\n\n\t\t\t// Remove duplicates\n\t\t\tselectors = [...new Set(selectors)];\n\n\t\t\t// If one of the selectors is document, remove it\n\t\t\tif (selectors.indexOf(\"document\") >= 0) {\n\t\t\t\tselectors.splice(selectors.indexOf(\"document\"), 1);\n\t\t\t}\n\n\t\t\t// If one of the selectors is body, remove all others\n\t\t\tif (selectors.indexOf(\"body\") >= 0) {\n\t\t\t\tselectors = [\"body\"];\n\t\t\t}\n\t\t}\n\n\t\treturn selectors.join(\", \");\n\t};\n\n\t// add_to_cart\n\tpmw.addProductToCart = async (productId, quantity) => {\n\n\t\t// Cast quantity to number to make sure it's a number\n\t\tquantity = Number(quantity);\n\n\t\ttry {\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tproductId = pmw.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tif (!pmwDataLayer?.products[productId]) {\n\t\t\t\tawait pmw.getProductsFromBackend([productId]);\n\t\t\t}\n\n\t\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId, quantity);\n\n\t\t\tjQuery(document).trigger(\"pmw:add-to-cart\", product);\n\n\t\t\t// add product to cart pmwDataLayer['cart']\n\n\t\t\t// if the product already exists in the object, only add the additional quantity\n\t\t\t// otherwise create that product object in the pmwDataLayer['cart']\n\t\t\tif (pmwDataLayer?.cart[productId]) {\n\n\t\t\t\tpmwDataLayer.cart[productId].quantity = pmwDataLayer.cart[productId].quantity + quantity;\n\t\t\t} else {\n\n\t\t\t\tif (!(\"cart\" in pmwDataLayer)) pmwDataLayer.cart = {};\n\n\t\t\t\tpmwDataLayer.cart[productId] = pmw.getProductDetailsFormattedForEvent(productId, quantity);\n\t\t\t}\n\n\t\t\tpmw.storeCartData(pmwDataLayer.cart);\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\n\t\t\t// fallback if pmwDataLayer.cart and pmwDataLayer.products got out of sync in case cart caching has an issue\n\t\t\tpmw.getCartItemsFromBackend();\n\t\t}\n\t};\n\n\tpmw.initCart = () => {\n\n\t\t// If the WC cart doesn't exist, eg. after a confirmed purchase,\n\t\t// and we still have a cart object in the storage, reset it.\n\t\tif (\n\t\t\t!pmw.doesWooCommerceCartExist()\n\t\t\t&& Object.keys(pmw.retrieveCartData()).length !== 0\n\t\t) {\n\t\t\tpmw.storeCartData({});\n\t\t\treturn;\n\t\t}\n\n\t\t// If the cart object is in the storage, use it\n\t\tif (pmw.retrieveCartData()) {\n\t\t\tpmw.saveCartObjectToDataLayer(pmw.retrieveCartData());\n\t\t\treturn;\n\t\t}\n\n\t\t// If the cart object is missing in the storage, create an empty one and get the cart items from the backend\n\t\tpmw.storeCartData({});\n\t\tpmw.getCartItemsFromBackend();\n\t};\n\n\t// get all cart items from the backend\n\tpmw.getCartItemsFromBackend = () => {\n\t\ttry {\n\n\t\t\t/**\n\t\t\t * Can't use a REST API endpoint, as the cart session will not be loaded if the\n\t\t\t * endpoint is called.\n\t\t\t *\n\t\t\t * https://wordpress.org/support/topic/wc-cart-is-null-in-custom-rest-api/#post-11442843\n\t\t\t */\n\n\t\t\t/**\n\t\t\t * Get the cart items from the backend the data object using fetch API\n\t\t\t * and log success or error messages\n\t\t\t * and url encoded data\n\t\t\t */\n\t\t\tfetch(pmw.ajax_url, {\n\t\t\t\tmethod   : \"POST\",\n\t\t\t\tcache    : \"no-cache\",\n\t\t\t\tbody     : new URLSearchParams({action: \"pmw_get_cart_items\"}),\n\t\t\t\tkeepalive: true,\n\t\t\t\tredirect : \"error\",\n\t\t\t})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif (response.ok) {\n\t\t\t\t\t\treturn response.json();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow Error(\"Error getting cart items from backend\");\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then(data => {\n\n\t\t\t\t\tif (data.success) {\n\n\t\t\t\t\t\tif (!data.data[\"cart\"]) data.data[\"cart\"] = {};\n\t\t\t\t\t\tpmw.saveCartObjectToDataLayer(data.data[\"cart\"]);\n\t\t\t\t\t\tpmw.storeCartData(data.data[\"cart\"]);\n\n\t\t\t\t\t\t// Save cart_item_keys from AJAX response for remove_from_cart tracking\n\t\t\t\t\t\t// This provides fallback when inline scripts are suppressed via pmw_output_cart_item_data filter\n\t\t\t\t\t\tif (data.data[\"cart_item_keys\"]) {\n\t\t\t\t\t\t\tpmwDataLayer.cart_item_keys = Object.assign(\n\t\t\t\t\t\t\t\tpmwDataLayer.cart_item_keys || {},\n\t\t\t\t\t\t\t\tdata.data[\"cart_item_keys\"]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow Error(\"Error getting cart items from backend\");\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// Get product IDs from the backend\n\tpmw.getProductsFromBackend = async productIds => {\n\n\t\tif (pmwDataLayer?.products) {\n\t\t\t// If productIds already exists as key in pmwDataLayer.products, remove it from the array\n\t\t\tproductIds = productIds.filter(productId => !(productId in pmwDataLayer.products));\n\t\t}\n\n\t\t// If no product IDs are in the object, don't try to get anything from the server\n\t\tif (!productIds || productIds.length === 0) return;\n\n\t\t// if no page_id is set, don't try to get anything from the server\n\t\tif (!pmwDataLayer.general.page_id) return;\n\n\t\t// if productIds is not an array, or it's an empty array, don't try to get anything from the server\n\t\tif (!Array.isArray(productIds) || productIds.length === 0) return;\n\n\t\ttry {\n\n\t\t\tlet data = {\n\t\t\t\taction     : \"pmw_get_product_ids\",  // for the AJAX call\n\t\t\t\tpage_id    : pmwDataLayer.general.page_id,\n\t\t\t\tpage_type  : pmwDataLayer.shop.page_type,\n\t\t\t\tproduct_ids: productIds,\n\t\t\t};\n\n\t\t\tconst isRestEndpointAvailable = await pmw.isRestEndpointAvailable();\n\t\t\tconst url                     = isRestEndpointAvailable ? pmw.root + \"pmw/v1/products/\" : pmw.ajax_url;\n\n\t\t\tconst options = {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tcache : \"no-cache\",\n\t\t\t\tbody  : isRestEndpointAvailable ? JSON.stringify(data) : new URLSearchParams(data),\n\t\t\t};\n\n\t\t\t// If the REST API is available, set the headers to JSON\n\t\t\tif (isRestEndpointAvailable) {\n\t\t\t\toptions.headers = {\"Content-Type\": \"application/json\"};\n\t\t\t}\n\n\t\t\tlet response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(\"Error getting products from backend. Status: \" + response.status + \" Status text: \" + response.statusText);\n\t\t\t}\n\n\t\t\tlet responseData = await response.json();\n\n\t\t\tif (!responseData.success) {\n\t\t\t\tthrow new Error(\"Error getting products from backend: \" + responseData.data);\n\t\t\t}\n\n\t\t\tpmwDataLayer.products = Object.assign({}, pmwDataLayer.products, responseData.data);\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\n\t\treturn true;\n\t};\n\n\tpmw.saveCartObjectToDataLayer = cartObject => {\n\n\t\tpmwDataLayer.cart     = cartObject;\n\t\tpmwDataLayer.products = Object.assign({}, pmwDataLayer.products, cartObject);\n\t};\n\n\tpmw.triggerViewItemEventPrep = async productId => {\n\n\t\tif (!pmwDataLayer?.products[productId]) {\n\t\t\tawait pmw.getProductsFromBackend([productId]);\n\t\t}\n\n\t\tif (!pmwDataLayer?.products[productId]) {\n\t\t\tpmw.triggerViewItemEventNoProduct();\n\t\t\tpmw.console.log(`Product with ID ${productId} not found in the data layer and couldn't be retrieved from the backend. Triggering view-item event without product data.`);\n\t\t} else {\n\t\t\tpmw.triggerViewItemEvent(productId);\n\t\t}\n\t};\n\n\tpmw.triggerViewItemEvent = productId => {\n\n\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId);\n\n\t\tif (!product) return;\n\n\t\tjQuery(document).trigger(\"pmw:view-item\", product);\n\t};\n\n\tpmw.triggerViewItemEventNoProduct = () => {\n\t\tjQuery(document).trigger(\"pmw:view-item\");\n\t};\n\n\tpmw.fireCheckoutOption = (step, checkout_option = null, value = null) => {\n\n\t\tlet data = {\n\t\t\tstep           : step,\n\t\t\tcheckout_option: checkout_option,\n\t\t\tvalue          : value,\n\t\t};\n\n\t\tjQuery(document).trigger(\"pmw:checkout-option\", data);\n\t};\n\n\tpmw.fireCheckoutProgress = step => {\n\n\t\tlet data = {\n\t\t\tstep: step,\n\t\t};\n\n\t\tjQuery(document).trigger(\"pmw:checkout-progress\", data);\n\t};\n\n\tpmw.getPostIdFromString = string => {\n\n\t\ttry {\n\t\t\treturn string.match(/(post-)(\\d+)/)[2];\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.triggerViewItemList = productId => {\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\tproductId = pmw.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\tjQuery(document).trigger(\"pmw:view-item-list\", pmw.getProductDataForViewItemEvent(productId));\n\t};\n\n\tpmw.getProductDataForViewItemEvent = productId => {\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\ttry {\n\t\t\tif (pmwDataLayer.products[productId]) {\n\n\t\t\t\treturn pmw.getProductDetailsFormattedForEvent(productId);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.getMainProductIdFromProductPage = () => {\n\n\t\ttry {\n\t\t\tif ([\"simple\", \"variable\", \"grouped\", \"composite\", \"bundle\"].indexOf(pmwDataLayer.shop.product_type) >= 0) {\n\t\t\t\treturn jQuery(\".pmwProductId:first\").data(\"id\");\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.viewItemListTriggerTestMode = target => {\n\n\t\tjQuery(target).css({\"position\": \"relative\"});\n\t\tjQuery(target).append(\"<div id=\\\"viewItemListTriggerOverlay\\\"></div>\");\n\t\tjQuery(target).find(\"#viewItemListTriggerOverlay\").css({\n\t\t\t\"z-index\"         : \"10\",\n\t\t\t\"display\"         : \"block\",\n\t\t\t\"position\"        : \"absolute\",\n\t\t\t\"height\"          : \"100%\",\n\t\t\t\"top\"             : \"0\",\n\t\t\t\"left\"            : \"0\",\n\t\t\t\"right\"           : \"0\",\n\t\t\t\"opacity\"         : pmwDataLayer.shop.view_item_list_trigger.opacity,\n\t\t\t\"background-color\": pmwDataLayer.shop.view_item_list_trigger.background_color,\n\t\t});\n\t};\n\n\tpmw.getSearchTermFromUrl = () => {\n\n\t\ttry {\n\t\t\tlet urlParameters = new URLSearchParams(window.location.search);\n\t\t\treturn urlParameters.get(\"s\");\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// we need this to track timeouts for intersection observers\n\tlet ioTimeouts = {};\n\n\tpmw.observerCallback = (entries, observer) => {\n\n\t\tentries.forEach((entry) => {\n\n\t\t\ttry {\n\t\t\t\tlet productId;\n\n\t\t\t\tlet elementId = jQuery(entry.target).data(\"ioid\");\n\n\t\t\t\t// Get the productId from next element, if wpmProductId is a sibling, like in Gutenberg blocks\n\t\t\t\t// otherwise go search in children, like in regular WC loop items\n\t\t\t\tif (jQuery(entry.target).next(\".pmwProductId\").length) {\n\t\t\t\t\t// console.log('test 1');\n\t\t\t\t\tproductId = jQuery(entry.target).next(\".pmwProductId\").data(\"id\");\n\t\t\t\t} else {\n\t\t\t\t\tproductId = jQuery(entry.target).find(\".pmwProductId\").data(\"id\");\n\t\t\t\t}\n\n\n\t\t\t\tif (!productId) throw Error(\"pmwProductId element not found\");\n\n\t\t\t\tif (entry.isIntersecting) {\n\n\t\t\t\t\tioTimeouts[elementId] = setTimeout(() => {\n\n\t\t\t\t\t\tpmw.triggerViewItemList(productId);\n\t\t\t\t\t\tif (pmwDataLayer.shop.view_item_list_trigger.test_mode) pmw.viewItemListTriggerTestMode(entry.target);\n\t\t\t\t\t\tif (pmwDataLayer.shop.view_item_list_trigger.repeat === false) observer.unobserve(entry.target);\n\t\t\t\t\t}, pmwDataLayer.shop.view_item_list_trigger.timeout);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tclearTimeout(ioTimeouts[elementId]);\n\t\t\t\t\tif (pmwDataLayer.shop.view_item_list_trigger.test_mode) jQuery(entry.target).find(\"#viewItemListTriggerOverlay\").remove();\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t};\n\n\t// fire view_item_list only on products that have become visible\n\tlet io;\n\tlet ioid = 0;\n\n\tconst getCommonIdentifiersToWatch = () => {\n\n\t\tlet listOfClassNames = {\n\t\t\tnested: [],\n\t\t\tflat  : [],\n\t\t};\n\n\t\ttry {\n\n\t\t\tconst haveSameNestingDepth = (element1, element2) => {\n\n\t\t\t\t// If both are the same, return the parent\n\t\t\t\treturn jQuery(element1).parents().length === jQuery(element2).parents().length;\n\t\t\t};\n\n\t\t\tconst findCommonParentElement = (element1, element2) => {\n\t\t\t\t// If both are the same, return the parent\n\t\t\t\tif (jQuery(element1).parent().is(jQuery(element2).parent())) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tnode: jQuery(element1).parent(),\n\t\t\t\t\t\ttype: \"flat\",\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tnode: jQuery(element1).parents().has(jQuery(element2).parents()).first(),\n\t\t\t\t\ttype: \"nested\",\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst countOfChildren = (element) => {\n\t\t\t\t// Return the count of \"wpmProductId\" elements\n\t\t\t\treturn jQuery(element).find(\".pmwProductId\").length;\n\t\t\t};\n\n\t\t\tconst getCommonClass = (classes1, classes2) => {\n\n\t\t\t\t// console.log(\"classes1\", classes1);\n\t\t\t\t// console.log(\"classes2\", classes2);\n\t\t\t\t// classes 1 and 2 are arrays of classes\n\t\t\t\t// They may contain the same classes, but not in the same order\n\t\t\t\t// Return the first common class that's present in both arrays\n\n\t\t\t\treturn classes1.filter(value => classes2.includes(value))[0] || null;\n\t\t\t};\n\n\t\t\tconst pmwProductIds = document.querySelectorAll(\".pmwProductId\");\n\n\t\t\t// If zero or only one product template is found, then we can't run the algorithm\n\t\t\tif (pmwProductIds.length === 1) {\n\t\t\t\t// console.log(\"No product or too few templates found\")\n\t\t\t\treturn listOfClassNames;\n\t\t\t}\n\n\t\t\t// console.log(\"wpmProductIds\", wpmProductIds);\n\t\t\t// console.log(\"looping\")\n\n\t\t\tfor (let i = 0; i < pmwProductIds.length - 1; i++) {\n\n\t\t\t\t// console.log(\"i\", i)\n\n\t\t\t\tif (!haveSameNestingDepth(pmwProductIds[i], pmwProductIds[i + 1])) {\n\t\t\t\t\t// console.log(\"The nesting depth is not the same\")\n\t\t\t\t\ti++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet productsNode = findCommonParentElement(pmwProductIds[i], pmwProductIds[i + 1]);\n\t\t\t\t// console.log(\"productsNode.node\", productsNode.node)\n\t\t\t\t// console.log(\"productsNode.type\", productsNode.type)\n\n\t\t\t\t// If the productsNode is nested, get the first class of the first child. Then console log the class\n\t\t\t\tif (productsNode.type === \"nested\") {\n\n\t\t\t\t\tlet firstChildClassAttr = productsNode.node.children().first().attr(\"class\");\n\t\t\t\t\tlet firstChildClasses   = firstChildClassAttr ? firstChildClassAttr.split(\" \") : [];\n\n\t\t\t\t\tlet secondChildClassAttr = productsNode.node.children().first().next().attr(\"class\");\n\t\t\t\t\tlet secondChildClasses   = secondChildClassAttr ? secondChildClassAttr.split(\" \") : [];\n\n\t\t\t\t\tconst commonClass = getCommonClass(firstChildClasses, secondChildClasses);\n\n\t\t\t\t\tlistOfClassNames.nested.push(commonClass);\n\t\t\t\t} else if (productsNode.type === \"flat\") {\n\n\t\t\t\t\t// If class is not found, continue\n\t\t\t\t\tif (!productsNode.node.children().first().attr(\"class\")) continue;\n\n\t\t\t\t\t// firstProductTemplateClasses is the classes of the first child element of the productsNode\n\t\t\t\t\tlet firstProductTemplateClasses = productsNode.node.children().first().attr(\"class\").split(\" \")[0];\n\n\t\t\t\t\tlistOfClassNames.flat.push(firstProductTemplateClasses);\n\t\t\t\t}\n\n\t\t\t\t// which wpmProductIds is the last one in the productsNode? console log the index of the last wpmProductId in the productsNode\n\t\t\t\t// console.log(\"productsNode.children().length\", countOfChildren(productsNode));\n\n\t\t\t\ti = i + countOfChildren(productsNode.node) - 1;\n\t\t\t}\n\n\t\t\t// Make the list of class names unique\n\t\t\tlistOfClassNames.nested = [...new Set(listOfClassNames.nested)];\n\t\t\tlistOfClassNames.flat   = [...new Set(listOfClassNames.flat)];\n\n\t\t\treturn listOfClassNames;\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t\treturn listOfClassNames;\n\t\t}\n\t};\n\n\n\tlet detectedProductTemplateClasses = {\n\t\tnested: [],\n\t\tflat  : [],\n\t};\n\n\tconst isNestedClass = (elem) => {\n\t\tlet nestedClassNames = [\n\t\t\t\"product\",\n\t\t\t\"type-product\",\n\t\t\t\"product-item-inner\",\n\t\t\t...detectedProductTemplateClasses.nested,\n\t\t];\n\n\t\treturn nestedClassNames.some(className => jQuery(elem).closest(\".\" + className).length);\n\t};\n\n\tconst isFlatClass = (elem) => {\n\n\t\tlet flatClassNames = [\n\t\t\t\"wc-block-grid__product\",\n\t\t\t\"product\",\n\t\t\t\"product-small\",\n\t\t\t\"woocommerce-LoopProduct-link\",\n\t\t\t...detectedProductTemplateClasses.flat,\n\t\t];\n\n\t\treturn flatClassNames.some(className => jQuery(elem).prev().hasClass(className));\n\t};\n\n\tconst getAllElementsToWatch = () => {\n\n\t\tdetectedProductTemplateClasses = getCommonIdentifiersToWatch();\n\n\t\treturn jQuery(\".pmwProductId\")\n\t\t\t.map(function (i, elem) {\n\n\t\t\t\tif (isNestedClass(elem)) {\n\t\t\t\t\treturn jQuery(elem).parent();\n\t\t\t\t} else if (isFlatClass(elem)) {\n\t\t\t\t\treturn jQuery(this).prev();\n\t\t\t\t} else if (jQuery(elem).closest(\".product\").length) {\n\t\t\t\t\treturn jQuery(elem).closest(\".product\");\n\t\t\t\t}\n\t\t\t});\n\t};\n\n\tpmw.startIntersectionObserverToWatch = () => {\n\n\t\ttry {\n\t\t\t// enable view_item_list test mode from browser\n\t\t\tif (pmw.urlHasParameter(\"vildemomode\")) pmwDataLayer.shop.view_item_list_trigger.test_mode = true;\n\n\t\t\t// set up intersection observer\n\t\t\t// https://stackoverflow.com/questions/62084306/intersectionobserver-not-working-in-safari-or-ios\n\t\t\tio = new IntersectionObserver(pmw.observerCallback, {\n\t\t\t\troot: null,\n\t\t\t\t// root     : document.body,\n\t\t\t\tthreshold: pmwDataLayer.shop.view_item_list_trigger.threshold,\n\t\t\t});\n\n\t\t\tgetAllElementsToWatch().each((i, elem) => {\n\n\t\t\t\tjQuery(elem[0]).data(\"ioid\", ioid++);\n\n\t\t\t\tio.observe(elem[0]);\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// Watch DOM for new lazy loaded products and add them to the intersection observer\n\tpmw.startProductsMutationObserverToWatch = () => {\n\n\t\ttry {\n\t\t\t// Pass in the target node, as well as the observer options\n\n\t\t\t// selects the most common parent node\n\t\t\t// https://stackoverflow.com/a/7648323/4688612\n\t\t\tlet productsNode = jQuery(\".pmwProductId:eq(0)\").parents().has(jQuery(\".pmwProductId:eq(1)\").parents()).first();\n\n\t\t\tif (productsNode.length) {\n\t\t\t\tproductsMutationObserver.observe(productsNode[0], {\n\t\t\t\t\tattributes   : true,\n\t\t\t\t\tchildList    : true,\n\t\t\t\t\tcharacterData: true,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// Create an observer instance\n\tconst productsMutationObserver = new MutationObserver(mutations => {\n\n\t\tmutations.forEach(mutation => {\n\t\t\tlet newNodes = mutation.addedNodes; // DOM NodeList\n\t\t\tif (newNodes !== null) { // If there are new nodes added\n\t\t\t\tlet nodes = jQuery(newNodes); // jQuery set\n\t\t\t\tnodes.each((i, node) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t// jQuery(this).hasClass(\"type-product\") ||\n\t\t\t\t\t\t// jQuery(this).hasClass(\"product-small\") ||\n\t\t\t\t\t\t// jQuery(this).hasClass(\"wc-block-grid__product\")\n\t\t\t\t\t\t// jQuery(this).hasClass(\"type-product\")\n\t\t\t\t\t\tisNestedClass(node) || isFlatClass(node)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// check if the node has a child or sibling wpmProductId\n\t\t\t\t\t\t// if yes add it to the intersectionObserver\n\t\t\t\t\t\tif (hasPmwProductIdElement(node)) {\n\t\t\t\t\t\t\tjQuery(node).data(\"ioid\", ioid++);\n\t\t\t\t\t\t\tio.observe(node);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t});\n\n\tlet hasPmwProductIdElement = elem =>\n\t\t!!(jQuery(elem).find(\".pmwProductId\").length ||\n\t\t\tjQuery(elem).siblings(\".pmwProductId\").length);\n\n\t/**\n\t * Sets a new cookie or updates an existing one with the provided name and value.\n\t *\n\t * @function setCookie\n\t * @global\n\t * @param {string} cookieName - The name of the cookie.\n\t * @param {string} [cookieValue=\"\"] - The value to set for the cookie. Default value is an empty string.\n\t * @param {number|null} [expiryDays=null] - The number of days until the cookie expires. If not provided, the cookie will last until the end of the session.\n\t * @returns {void}\n\t *\n\t * @example\n\t * // This will create a cookie \"username\" with the value \"JohnDoe\" that expires in 7 days\n\t * pmw.setCookie(\"username\", \"JohnDoe\", 7);\n\t */\n\tpmw.setCookie = (cookieName, cookieValue = \"\", expiryDays = null) => {\n\n\t\tif (expiryDays) {\n\n\t\t\tlet d = new Date();\n\t\t\td.setTime(d.getTime() + (expiryDays * 24 * 60 * 60 * 1000));\n\t\t\tlet expires     = \"expires=\" + d.toUTCString();\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";\" + expires + \";path=/\";\n\t\t} else {\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";path=/\";\n\t\t}\n\t};\n\n\t/**\n\t * Retrieves the value of a specific cookie from the document's cookie string.\n\t *\n\t * @param {String} cookieName - The name of the cookie to retrieve.\n\t * @returns {String} - The value of the cookie if found, an empty string otherwise.\n\t *\n\t * @example\n\t * // returns 'value' if 'cookieName=value' exists in document.cookie\n\t * pmw.getCookie('cookieName')\n\t */\n\tpmw.getCookie = cookieName => {\n\n\t\tlet name          = cookieName + \"=\";\n\t\tlet decodedCookie = decodeURIComponent(document.cookie);\n\t\tlet ca            = decodedCookie.split(\";\");\n\n\t\tfor (let i = 0; i < ca.length; i++) {\n\n\t\t\tlet c = ca[i];\n\n\t\t\twhile (c.charAt(0) == \" \") {\n\t\t\t\tc = c.substring(1);\n\t\t\t}\n\n\t\t\tif (c.indexOf(name) == 0) {\n\t\t\t\treturn c.substring(name.length, c.length);\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\t/**\n\t * Find and get the cookie with a name that contains the string.\n\t * If one is found, then return the cookie.\n\t * If none is found, then return false.\n\t *\n\t * @param string\n\t * @returns {boolean|string}\n\t *\n\t * @since 1.32.5\n\t */\n\tpmw.getCookieThatContainsRegex = (regex) => {\n\n\t\tlet cookies = document.cookie.split(\";\");\n\n\t\tfor (let i = 0; i < cookies.length; i++) {\n\t\t\tlet cookie = cookies[i].trim();\n\n\t\t\tif (regex.test(cookie)) {\n\t\t\t\treturn cookie;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tpmw.deleteCookie = cookieName => {\n\t\tpmw.setCookie(cookieName, \"\", -1);\n\t};\n\n\t/**\n\t * Store data in the browser\n\t *\n\t * Try to store the data in the local storage (session or persistent) if available.\n\t * If not available, store the data in the cookie.\n\t *\n\t * Max cookie expiry is 400 days as specified by Google Chrome: https://developer.chrome.com/blog/cookie-max-age-expires/\n\t *\n\t * @param key\n\t * @param value\n\t * @param persistent\n\t * @param extension - If true, this will be saved in a separate key\n\t */\n\tpmw.storeData = (key, value, persistent = false, extension = false) => {\n\n\t\tconst suffix = extension ? key : \"\";\n\n\t\tlet dataGetter = persistent ? pmw.getPersistentData : pmw.getSessionData;\n\t\tlet dataSetter = persistent ? pmw.setPersistentData : pmw.setSessionData;\n\n\t\tlet data = dataGetter(suffix);\n\t\textension ? data = value : data[key] = value;\n\n\t\tdataSetter(data, suffix);\n\t};\n\n\tpmw.retrieveData = (key, persistent = false, extension = false) => {\n\n\t\tconst suffix = extension ? key : \"\";\n\n\t\tlet data = persistent ? pmw.getPersistentData(suffix) : pmw.getSessionData(suffix);\n\n\t\treturn extension ? data : data[key];\n\t};\n\n\tpmw.deleteDataKey = (key, persistent = false, extension = false) => {\n\n\t\tconst suffix = extension ? key : \"\";\n\n\t\tlet dataGetter = persistent ? pmw.getPersistentData : pmw.getSessionData;\n\t\tlet dataSetter = persistent ? pmw.setPersistentData : pmw.setSessionData;\n\n\t\tlet data = dataGetter(suffix);\n\t\t// extension ? delete data : delete data[key]\n\n\t\tif (extension) {\n\n\t\t\ttry {\n\t\t\t\tif (persistent && window.localStorage) window.localStorage.removeItem(pmw.getPersistentDataKey(suffix));\n\t\t\t\tif (!persistent && window.sessionStorage) window.sessionStorage.removeItem(pmw.getSessionDataKey(suffix));\n\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tdelete data[key];\n\n\t\tdataSetter(data, suffix);\n\t};\n\n\tpmw.storeCartData = data => {\n\t\tpmw.storeData(\"cart\", data, false, true);\n\t};\n\n\tpmw.retrieveCartData = () => {\n\t\treturn pmw.retrieveData(\"cart\", false, true);\n\t};\n\n\tpmw.getSessionDataKey = (suffix = \"\") => {\n\t\tconst defaultStorageKey = \"_pmw_session_data\";\n\n\t\tif (suffix) {\n\t\t\treturn defaultStorageKey + \"_\" + suffix;\n\t\t}\n\n\t\treturn defaultStorageKey;\n\t};\n\n\tpmw.getPersistentDataKey = (storageKeySuffix) => {\n\n\t\tconst defaultStorageKey = \"_pmw_persistent_data\";\n\n\t\tif (storageKeySuffix) {\n\t\t\treturn defaultStorageKey + \"_\" + storageKeySuffix;\n\t\t}\n\n\t\treturn defaultStorageKey;\n\t};\n\n\tpmw.getSessionData = (suffix = \"\") => {\n\n\t\tif (window.sessionStorage) {\n\n\t\t\tlet data = window.sessionStorage.getItem(pmw.getSessionDataKey(suffix));\n\n\t\t\treturn data !== null ? JSON.parse(data) : {};\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tlet data = pmw.getCookie(pmw.getSessionDataKey(suffix));\n\n\t\t\treturn data !== \"\" ? JSON.parse(data) : {};\n\t\t}\n\t};\n\n\tpmw.setSessionData = (data, storageKeySuffix = \"\") => {\n\t\tif (window.sessionStorage) {\n\t\t\twindow.sessionStorage.setItem(pmw.getSessionDataKey(storageKeySuffix), JSON.stringify(data));\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tpmw.setCookie(pmw.getSessionDataKey(storageKeySuffix), JSON.stringify(data));\n\t\t}\n\t};\n\n\tpmw.getPersistentData = (storageKeySuffix) => {\n\n\t\tif (window.localStorage) {\n\n\t\t\tlet data = window.localStorage.getItem(pmw.getPersistentDataKey(storageKeySuffix));\n\n\t\t\treturn data !== null ? JSON.parse(data) : {};\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tlet data = pmw.getCookie(pmw.getPersistentDataKey(storageKeySuffix));\n\n\t\t\treturn data !== \"\" ? JSON.parse(data) : {};\n\t\t}\n\t};\n\n\tpmw.setPersistentData = (data, storageKeySuffix = \"\") => {\n\n\t\tif (window.localStorage) {\n\t\t\twindow.localStorage.setItem(pmw.getPersistentDataKey(storageKeySuffix), JSON.stringify(data));\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tpmw.setCookie(pmw.getPersistentDataKey(storageKeySuffix), JSON.stringify(data), 400);\n\t\t}\n\t};\n\n\tpmw.storeOrderIdOnServer = async (orderDetails) => {\n\n\t\ttry {\n\n\t\t\tlet response;\n\n\t\t\tif (await pmw.isRestEndpointAvailable()) {\n\n\t\t\t\tresponse = await fetch(pmw.root + \"pmw/v1/pixels-fired/\", {\n\t\t\t\t\tmethod   : \"POST\",\n\t\t\t\t\theaders  : {\n\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\t// \"X-WP-Nonce\"  : pmw.nonce_wp_rest,\n\t\t\t\t\t},\n\t\t\t\t\tbody     : JSON.stringify({\n\t\t\t\t\t\torder_id : orderDetails.orderId,\n\t\t\t\t\t\torder_key: orderDetails.orderKey,\n\t\t\t\t\t\tsource   : orderDetails.source,\n\t\t\t\t\t\t// nonce   : pmw.pmw_nonce,\n\t\t\t\t\t}),\n\t\t\t\t\tkeepalive: true,\n\t\t\t\t\tcache    : \"no-cache\",\n\t\t\t\t\tredirect : \"error\",\n\t\t\t\t});\n\n\t\t\t} else {\n\n\t\t\t\tpmw.console.log(\"REST API not available, falling back to AJAX\");\n\n\t\t\t\t// save the state in the database\n\n\t\t\t\t// Send the data object with ajax request\n\t\t\t\t// and log success or error using fetch API and url encoded\n\t\t\t\tresponse = await fetch(pmw.ajax_url, {\n\t\t\t\t\tmethod   : \"POST\",\n\t\t\t\t\tbody     : new URLSearchParams({\n\t\t\t\t\t\taction   : \"pmw_purchase_pixels_fired\",\n\t\t\t\t\t\torder_id : orderDetails.orderId,\n\t\t\t\t\t\torder_key: orderDetails.orderKey,\n\t\t\t\t\t\tsource   : orderDetails.source,\n\t\t\t\t\t\t// nonce_ajax: pmw.nonce_ajax,\n\t\t\t\t\t}),\n\t\t\t\t\tkeepalive: true,\n\t\t\t\t\tredirect : \"error\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst responseJson = await response.json();\n\n\t\t\tif (responseJson.success) {\n\t\t\t\tpmw.console.log(\"\", responseJson.data);\n\t\t\t} else {\n\t\t\t\tpmw.console.error(\"\", responseJson.data);\n\t\t\t}\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.getProductIdByCartItemElement = element => {\n\n\t\tconst href = jQuery(element).find(\".product-remove\").find(\"a\").attr(\"href\");\n\t\tif (href) return pmw.getProductIdByCartItemKeyUrl(new URL(href));\n\n\t\tconst productId = jQuery(element).find(\"[data-product_id]\").first().attr(\"data-product_id\");\n\t\treturn productId ? productId : null;\n\t};\n\n\tpmw.getProductQuantityByCartItemElement = element => {\n\n\t\treturn jQuery(element).find(\".qty\").val() || null;\n\t};\n\n\tpmw.getProductIdByCartItemKeyUrl = url => {\n\n\t\tlet searchParams = new URLSearchParams(url.search);\n\t\tlet cartItemKey  = searchParams.get(\"remove_item\");\n\n\t\tlet productId;\n\n\t\tif (pmwDataLayer.cart_item_keys[cartItemKey][\"variation_id\"] === 0) {\n\t\t\tproductId = pmwDataLayer.cart_item_keys[cartItemKey][\"product_id\"];\n\t\t} else {\n\t\t\tproductId = pmwDataLayer.cart_item_keys[cartItemKey][\"variation_id\"];\n\t\t}\n\n\t\treturn productId;\n\t};\n\n\tpmw.getAddToCartLinkProductIds = () =>\n\t\tjQuery(\"a\").map(function () {\n\t\t\tlet href = jQuery(this).attr(\"href\");\n\n\t\t\tif (href && href.includes(\"?add-to-cart=\")) {\n\t\t\t\tlet matches = href.match(/(add-to-cart=)(\\d+)/);\n\t\t\t\tif (matches) return matches[2];\n\t\t\t}\n\t\t}).get();\n\n\tpmw.getProductDetailsFormattedForEvent = (productId, quantity = 1) => {\n\n\t\t// If pmwDataLayer.products[productId] doesn't exist, return an empty object\n\t\tif (!pmwDataLayer.products[productId]) return null;\n\n\t\tlet product = {\n\t\t\tid           : productId.toString(),\n\t\t\tdyn_r_ids    : pmwDataLayer.products[productId].dyn_r_ids,\n\t\t\tname         : pmwDataLayer.products[productId].name,\n\t\t\tlist_name    : pmwDataLayer.shop.list_name,\n\t\t\tbrand        : pmwDataLayer.products[productId].brand,\n\t\t\tcategory     : pmwDataLayer.products[productId].category,\n\t\t\tvariant      : pmwDataLayer.products[productId].variant,\n\t\t\tlist_position: pmwDataLayer.products[productId].position,\n\t\t\tquantity     : quantity,\n\t\t\tprice        : pmwDataLayer.products[productId].price,\n\t\t\tcurrency     : pmwDataLayer.shop.currency,\n\t\t\tis_variable  : pmwDataLayer.products[productId].is_variable,\n\t\t\tis_variation : pmwDataLayer.products[productId].is_variation,\n\t\t\tparent_id    : pmwDataLayer.products[productId].parent_id,\n\t\t};\n\n\t\tif (product.is_variation) product[\"parent_id_dyn_r_ids\"] = pmwDataLayer.products[productId].parent_id_dyn_r_ids;\n\n\t\treturn product;\n\t};\n\n\tpmw.getClidFromBrowser = (clidId = \"gclid\") => {\n\n\t\tlet clidCookieId;\n\n\t\tclidCookieId = {\n\t\t\tgclid: \"_gcl_aw\",\n\t\t\tdclid: \"_gcl_dc\",\n\t\t};\n\n\t\tif (pmw.getCookie(clidCookieId[clidId])) {\n\n\t\t\tlet clidCookie = pmw.getCookie(clidCookieId[clidId]);\n\t\t\tlet matches    = clidCookie.match(/(GCL.[\\d]*.)(.*)/);\n\t\t\treturn matches[2];\n\t\t} else {\n\t\t\treturn \"\";\n\t\t}\n\t};\n\n\tpmw.getUserAgent = () => navigator.userAgent;\n\n\tpmw.getViewPort = () => ({\n\t\twidth : Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0),\n\t\theight: Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0),\n\t});\n\n\n\tpmw.consoleLogVersion = () => {\n\t\tconsole.log(pmwDataLayer.version);\n\t};\n\n\t/**\n\t * Loads a script and caches it using native browser caching.\n\t *\n\t * Uses script tag injection which:\n\t * - Leverages browser's HTTP cache (respects Cache-Control headers)\n\t * - Avoids CORS preflight issues (no custom headers sent)\n\t * - Auto-executes the script on load\n\t * - Prevents duplicate script loading\n\t *\n\t * This code is .thenable\n\t */\n\n\tconst loadedScripts = new Set();\n\n\tpmw.loadScriptAndCacheIt = (url, fallbackUrl) => {\n\n\t\t// Return resolved promise if script already loaded\n\t\tif (loadedScripts.has(url)) {\n\t\t\tpmw.console.log(\"Script already loaded: \" + url);\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\tconst loadScript = (scriptUrl) => {\n\t\t\treturn new Promise((resolve, reject) => {\n\n\t\t\t\t// Check if script tag already exists in DOM\n\t\t\t\tif (document.querySelector(`script[src=\"${scriptUrl}\"]`)) {\n\t\t\t\t\tloadedScripts.add(scriptUrl);\n\t\t\t\t\tpmw.console.log(\"Script tag already exists: \" + scriptUrl);\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst script       = document.createElement(\"script\");\n\t\t\t\tscript.src         = scriptUrl;\n\t\t\t\tscript.async       = true;\n\t\t\t\tscript.crossOrigin = \"anonymous\"; // Enables CORS without sending credentials, avoids preflight issues\n\n\t\t\t\tscript.onload = () => {\n\t\t\t\t\tloadedScripts.add(scriptUrl);\n\t\t\t\t\tpmw.console.log(\"Successfully loaded script: \" + scriptUrl);\n\t\t\t\t\tresolve();\n\t\t\t\t};\n\n\t\t\t\tscript.onerror = () => {\n\t\t\t\t\tscript.remove(); // Clean up failed script tag\n\t\t\t\t\treject(new Error(\"Script failed to load: \" + scriptUrl));\n\t\t\t\t};\n\n\t\t\t\tdocument.head.appendChild(script);\n\t\t\t});\n\t\t};\n\n\t\treturn loadScript(url)\n\t\t\t.catch(() => {\n\t\t\t\tif (fallbackUrl) {\n\t\t\t\t\tpmw.console.log(\"Primary script failed, loading fallback: \" + fallbackUrl);\n\t\t\t\t\treturn loadScript(fallbackUrl);\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Primary script failed to load, and no fallback URL provided.\");\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tif (error.message.includes(\"fallback\")) {\n\t\t\t\t\tthrow error; // Re-throw if it's already the \"no fallback\" error\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Both primary and fallback scripts failed to load.\");\n\t\t\t});\n\t};\n\n\tpmw.getOrderItemPrice = orderItem => (orderItem.total + orderItem.total_tax) / orderItem.quantity;\n\n\tpmw.hasLoginEventFired = () => {\n\t\tlet data = pmw.getSessionData();\n\t\treturn data?.loginEventFired;\n\t};\n\n\tpmw.setLoginEventFired = () => {\n\t\tlet data                = pmw.getSessionData();\n\t\tdata[\"loginEventFired\"] = true;\n\t\tpmw.setSessionData(data);\n\t};\n\n\tpmw.pageLoaded = async () => new Promise(resolve => {\n\t\t(function waitForVar() {\n\t\t\tif (\"complete\" === document.readyState) return resolve();\n\t\t\tsetTimeout(waitForVar, 50);\n\t\t})();\n\t});\n\n\tpmw.pageReady = () => {\n\t\treturn new Promise(resolve => {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (\"interactive\" === document.readyState || \"complete\" === document.readyState) return resolve();\n\t\t\t\tsetTimeout(waitForVar, 50);\n\t\t\t})();\n\t\t});\n\t};\n\n\tpmw.isMiniCartActive = () => {\n\t\tif (window.sessionStorage) {\n\t\t\tObject.keys(window.sessionStorage).forEach(key => {\n\t\t\t\tif (key.includes(\"wc_fragments\")) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tpmw.doesWooCommerceCartExist = () => document.cookie.includes(\"woocommerce_items_in_cart\");\n\n\tpmw.urlHasParameter = parameter => {\n\t\tlet urlParams = new URLSearchParams(window.location.search);\n\t\treturn urlParams.has(parameter);\n\t};\n\n\tpmw.getUrlParameter = parameter => {\n\t\tlet urlParams = new URLSearchParams(window.location.search);\n\t\treturn urlParams.get(parameter);\n\t};\n\n\t// https://stackoverflow.com/a/60606893/4688612\n\tpmw.hashAsync = (algo, str) => {\n\t\treturn crypto.subtle.digest(algo, new TextEncoder(\"utf-8\").encode(str)).then(buf => {\n\t\t\treturn Array.prototype.map.call(new Uint8Array(buf), x => ((\"00\" + x.toString(16)).slice(-2))).join(\"\");\n\t\t});\n\t};\n\n\tpmw.getCartValue = () => {\n\n\t\tlet value = 0;\n\n\t\tif (pmwDataLayer?.cart) {\n\n\t\t\tfor (const key in pmwDataLayer.cart) {\n\t\t\t\t// content_ids.push(pmwDataLayer.products[key].dyn_r_ids[pmwDataLayer.pixels.facebook.dynamic_remarketing.id_type])\n\n\t\t\t\tlet product = pmwDataLayer.cart[key];\n\n\t\t\t\tvalue += product.quantity * product.price;\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t};\n\n\t/**\n\t * Detect if the current URL contains at least one pattern\n\t *\n\t * @param patterns\n\t * @returns {boolean}\n\t */\n\tpmw.doesUrlContainPatterns = patterns => {\n\n\t\tfor (const pattern of patterns) {\n\t\t\tif (new RegExp(pattern).test(window.location.href)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Detect if the current URL contains at least one pattern that is on the tracking exclusion list\n\t *\n\t * https://www.linkedin.com/pulse/how-remove-google-robot-problem-via-gtm-facebook-pixel-hjelpdahl/\n\t * https://www.youtube.com/watch?v=b4I1ePZt8Z0\n\t *\n\t * @returns {boolean}\n\t */\n\tpmw.excludeDomainFromTracking = () => {\n\n\t\tlet exclude_domains = [\n\t\t\t\"appspot.com\",\n\t\t\t\"translate.google.com\",\n\t\t];\n\n\t\tif (pmwDataLayer?.general?.exclude_domains) {\n\t\t\texclude_domains = [...exclude_domains, ...pmwDataLayer.general.exclude_domains];\n\t\t}\n\n\t\t// Abort if URL contains excluded domains\n\t\tif (exclude_domains.some(domain => window.location.href.includes(domain))) {\n\t\t\tconsole.debug(\"Pixel Manager: Aborted due to excluded domain\");\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Get a random event ID\n\t *\n\t * @param length\n\t * @return {string}\n\t */\n\tpmw.getRandomEventId = (length = 16) => {\n\t\tlet id = \"\";\n\t\twhile (id.length < length) {\n\t\t\tid += (Math.random() + 1).toString(36).substring(2);\n\t\t}\n\t\treturn id.substring(0, length);\n\t};\n\n\tpmw.pmwConsoleMessage = () => {\n\t\tlet message = \"Pixel Manager for WooCommerce: \";\n\t\tmessage += pmwDataLayer.version.pro ? \"pro\" : \"free\";\n\t\tmessage += \" | distro: \" + pmwDataLayer.version.distro;\n\t\tif (pmwDataLayer.version.distro === \"fms\" && pmwDataLayer.version.pro) {\n\t\t\tmessage += \" | active license: \" + (pmwDataLayer.version.eligible_for_updates ? \"yes\" : \"no\");\n\t\t}\n\t\tmessage += \" | version: \" + pmwDataLayer.version.number;\n\n\t\tif (pmwDataLayer.version.show === true) {\n\t\t\tconsole.log(message);\n\t\t} else {\n\t\t\tpmw.console.log(message);\n\t\t}\n\t};\n\n\tpmw.canLoadPremiumFeatures = () => {\n\t\treturn (pmwDataLayer.version.distro === \"fms\" && pmwDataLayer.version.pro && pmwDataLayer.version.eligible_for_updates) || pmwDataLayer.version.distro === \"wcm\";\n\t};\n\n\t/**\n\t * State if the pmw:dom:ready event has been fired\n\t *\n\t * @type {boolean}\n\t */\n\tlet pmwDomReadyFired = false;\n\n\n\t/**\n\t * Trigger the pmw:dom:ready event\n\t *\n\t * @returns {void}\n\t */\n\tpmw.triggerPmwDomReadyEvent = () => {\n\n\t\t// If the event has already been fired, return\n\t\tif (pmwDomReadyFired) return;\n\n\t\t// If the document is already loaded, fire the event\n\t\tif (document.readyState === \"complete\") {\n\t\t\tfirePmwDomReadyEvent();\n\t\t\treturn;\n\t\t}\n\n\t\t// Continue processing if the DOM has not yet been loaded\n\t\t// and attach the event listener to the DOMContentLoaded,\n\t\t// once through jQuery and once through the native DOM API\n\t\t// to maximize compatibility\n\n\t\t// If jQuery is available, use it to fire add the event listener\n\t\tjQuery(() => {\n\t\t\tfirePmwDomReadyEvent();\n\t\t});\n\n\t\t// Also add the event listener using the native DOM API\n\t\tdocument.addEventListener(\"DOMContentLoaded\", () => {\n\t\t\tfirePmwDomReadyEvent();\n\t\t}, true);\n\t};\n\n\t/**\n\t * Fire the pmw:dom:ready event\n\t *\n\t * @returns {void}\n\t */\n\tconst firePmwDomReadyEvent = () => {\n\n\t\t// If the event has already been fired, return\n\t\tif (pmwDomReadyFired) return;\n\n\t\t// Fire the event\n\t\tdocument.dispatchEvent(new Event(\"pmw:dom:ready\"));\n\n\t\t// Set the flag to true to indicate that the event has been fired\n\t\tpmwDomReadyFired = true;\n\t};\n\n\tpmw.getEmailFromTarget = target => {\n\n\t\t// Only try to add the clicked email if href is set\n\t\tif (target.href) {\n\n\t\t\t// Get the email from the link\n\t\t\t// But only if there is a valid email address in the link\n\t\t\t// Also, the href may contain other parameters, so we need to check for that and remove them\n\t\t\tlet email = target.href.replace(\"mailto:\", \"\");\n\n\n\t\t\tif (email.indexOf(\"?\") > -1) {\n\t\t\t\temail = email.split(\"?\")[0];\n\t\t\t}\n\n\t\t\t// Trim the email and remove all whitespaces\n\t\t\temail = email.replace(/\\s/g, \"\");\n\n\t\t\t// If the email is not empty and valid, add it to the data object\n\t\t\tif (email && pmw.isEmail(email)) {\n\t\t\t\treturn email;\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\tpmw.sendEventPayloadToServer = payload => {\n\t\tif (typeof pmw.sendEventPayloadToServerPremium === \"function\") {\n\t\t\tpmw.sendEventPayloadToServerPremium(payload);\n\t\t}\n\t};\n\n\t/**\n\t * Waits for all active pixels to load and then triggers the page view event.\n\t *\n\t * @return {Promise<unknown>}\n\t *\n\t * @since 1.49.0\n\t */\n\tpmw.waitForPixelsAndTriggerPageView = async () => {\n\n\t\treturn new Promise(resolve => {\n\n\t\t\t// Check if at least one pixel is active in the data layer\n\t\t\tif (!pmwDataLayer?.pixels) {\n\t\t\t\tpmw.console.error(\"pmwDataLayer or pmwDataLayer.pixels is not defined, triggering page view event immediately.\");\n\t\t\t\tdocument.dispatchEvent(new Event(\"pmw:page-view\"));\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet activePixels = pmwDataLayer?.general?.server_2_server?.pageview_event_s2s?.pixels || [];\n\n\t\t\t// This line filters the activePixels array, keeping only those pixel names that exist as keys\n\t\t\t// in the pmwDataLayer.pixels object (i.e., only pixels that are currently defined/active in the data layer)\n\t\t\tactivePixels = activePixels.filter(pixelName => pmwDataLayer.pixels[pixelName]);\n\n\t\t\t// If no pixels to check, trigger event immediately\n\t\t\tif (activePixels.length === 0) {\n\t\t\t\tpmw.console.log(\"No specific pixels to wait for, triggering page view event.\");\n\t\t\t\tdocument.dispatchEvent(new Event(\"pmw:page-view\"));\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if all active pixels are loaded\n\t\t\tconst checkPixelsLoaded = () => {\n\t\t\t\tconst allLoaded = activePixels.every(pixelName =>\n\t\t\t\t\t!pmwDataLayer.pixels[pixelName] || pmwDataLayer.pixels[pixelName].loaded);\n\n\t\t\t\tif (allLoaded) {\n\t\t\t\t\t// pmw.console.log(\"All specified pixels to track s2s page-view events have been loaded. Triggering page-view event.\");\n\t\t\t\t\tdocument.dispatchEvent(new Event(\"pmw:page-view\"));\n\t\t\t\t\tresolve();\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(checkPixelsLoaded, 100);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tcheckPixelsLoaded();\n\t\t});\n\t};\n\n\tpmw.isWooCommerceActive = () => {\n\t\treturn !!pmwDataLayer.shop;\n\t};\n\n\t/**\n\t * Retrieves the product ID associated with a specific pixel.\n\t *\n\t * @param {string} pixelId - The ID of the pixel to get the product ID for.\n\t * @returns {string|null} - The product ID associated with the given pixel ID,\n\t *                          or null if no product ID is found.\n\t */\n\tpmw.getProductIdForSpecificPixel = (product, pixelName) => {\n\t\treturn String(product.dyn_r_ids[pmwDataLayer.pixels[pixelName].dynamic_remarketing.id_type]);\n\t};\n\n\tpmw.isInWooCommerceSesssion = () => {\n\n\t\tif (pmwDataLayer?.shop?.session_active) return true;\n\n\t\tlet regex           = new RegExp(\"woocommerce_cart_hash\");\n\t\tlet wcSessionCookie = pmw.getCookieThatContainsRegex(regex);\n\n\t\tif (wcSessionCookie) return true;\n\n\t\treturn false;\n\t};\n\n\tpmw.isNotInWooCommerceSesssion = () => {\n\t\treturn !pmw.isInWooCommerceSesssion();\n\t};\n\n\tpmw.makeFullUrl = url => {\n\n\t\t// Trim any leading or trailing whitespace\n\t\turl = url.trim();\n\n\t\t// Check if the URL already contains a protocol\n\t\tif (/^(http:\\/\\/|https:\\/\\/)/.test(url)) {\n\t\t\treturn url;\n\t\t}\n\n\t\t// Remove leading slashes\n\t\turl = url.replace(/^\\/+/, \"\");\n\n\t\t// Add 'https://' as default protocol\n\t\treturn \"https://\" + url;\n\t};\n\n\tpmw.registerShowVariationEventListener = () => {\n\t\tlet previousVariationId = null;\n\n\t\tjQuery(\".single_variation_wrap\").on(\"show_variation\", (event, variation) => {\n\n\t\t\t// Abort if lazy loading is enabled\n\t\t\t// if (pmwDataLayer?.general?.lazy_load_pmw) return;\n\n\t\t\ttry {\n\t\t\t\t// If variations_output is disabled, don't fire view_item events from show_variation\n\t\t\t\t// because the parent product view_item is already triggered on page load\n\t\t\t\tif (!pmwDataLayer?.shop?.variations_output) return;\n\n\t\t\t\tlet productId = pmw.getIdBasedOndVariationsOutputSetting(variation.variation_id);\n\n\t\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\t\t// If the variation id is not the same as the previous one, run the function\n\t\t\t\tif (previousVariationId !== variation.variation_id) {\n\t\t\t\t\tpmw.triggerViewItemEventPrep(productId);\n\t\t\t\t\tpreviousVariationId = variation.variation_id;\n\t\t\t\t}\n\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n\t * Initializes the command queue for the application to ensure that commands\n\t * are queued and executed in a controlled manner. This function sets up\n\t * the underlying mechanism to manage and process commands effectively.\n\t *\n\t * Typically, the command queue is used by external developers\n\t * who want to make sure that their Pixel Manager API calls safely get executed,\n\t * no matter if the initialization order of the Pixel Manager is shuffled,\n\t * delayed, or lazy loaded.\n\t *\n\t * @since 1.49.0\n\t */\n\tpmw.initializeCommandQueue = () => {\n\n\t\tconst queue = window._pmwq = window._pmwq || [];\n\n\t\tqueue.forEach(function (fn) {\n\t\t\tif (typeof fn === \"function\") {\n\t\t\t\ttry {\n\t\t\t\t\tfn();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error(\"Error executing queued command:\", e);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Override push to execute commands immediately now that PMW is ready\n\t\tqueue.push = function (fn) {\n\t\t\tif (typeof fn === \"function\") {\n\t\t\t\ttry {\n\t\t\t\t\tfn();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error(\"Error executing command from queue:\", e);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t};\n\n}(window.pmw = window.pmw || {}, jQuery));\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + {\"194\":\"wc-hooks\",\"264\":\"deprecated-functions\",\"526\":\"pixel-facebook\",\"625\":\"consent-management\",\"671\":\"pixel-google\",\"712\":\"pixel-crazyegg\",\"818\":\"pixel-hotjar\",\"968\":\"consent-api\",\"972\":\"doofinder-listener\"}[chunkId] + \".\" + {\"194\":\"c871cc71\",\"264\":\"08bc16f9\",\"526\":\"1aad8345\",\"625\":\"9d45b6cb\",\"671\":\"87d84819\",\"712\":\"badd0e8f\",\"818\":\"c3ec2dc3\",\"968\":\"c33d5439\",\"972\":\"5dc21f92\"}[chunkId] + \".chunk.min.js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkPixel_Manager_for_WooCommerce\"] = self[\"webpackChunkPixel_Manager_for_WooCommerce\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","/**\n * Run PMW main loader\n */\n\nconst main = async () => {\n\n\trequire(\"./pmw/functions_main\");\n\trequire(\"./version.js\");\n\n\t// Wait until jQuery is loaded\n\tawait pmw.jQueryExists();\n\n\t// Wait until pmwDataLayer is loaded\n\tawait pmw.dataLayerFullyLoaded();\n\n\t/**\n\t * Set webpack public path for chunk loading\n\t * This ensures chunks load correctly even when scripts are combined/moved \n\t * by optimization plugins (SiteGround, Autoptimize, WP Rocket, etc.)\n\t */\n\tif (pmwDataLayer?.general?.chunk_base_path) {\n\t\t// eslint-disable-next-line no-undef, camelcase\n\t\t__webpack_public_path__ = pmwDataLayer.general.chunk_base_path;\n\t}\n\n\t// wait 1000ms\n\t// await new Promise(resolve => setTimeout(resolve, 1000))\n\n\t// Load all essential scripts first\n\trequire(\"./pmw/functions_loader\");\n\t\n\t// Load new event filtering system\n\trequire(\"./pmw/hooks\");\n\trequire(\"./pmw/pixel-registry\");\n\trequire(\"./pmw/event-processor\");\n\n\t// Initialize command queue early so filters can be registered before events fire\n\tpmw.initializeCommandQueue();\n\n\t// Output PMW console message\n\tpmw.pmwConsoleMessage();\n\n\t// Load the consent management module as a chunk\n\tawait pmw.loadConsentModule();\n\tawait pmw.consent.load();\n\n\t// Doesn't work if we listen to pmw:dom:ready because it runs too late\n\t// (at the end of the main.js file)\n\t// TODO: Find out why that order is important and optimize it. It is also difficult to test. In Cypress it works just with \"pmw:dom:ready\"\n\tjQuery(() => {\n\t\trequire(\"./pmw/event_listeners_on_ready\");\n\t});\n\n\t// Load remaining event listeners\n\trequire(\"./pmw/event_listeners\");\n\t\n\t// Load doofinder listener as a chunk\n\timport(/* webpackChunkName: \"doofinder-listener\" */ \"./pmw/listeners/doofinder\");\n\n\tpmw.loadWcHooksFunctions();\n\n\t// Check if domain is excluded from tracking\n\t// If so, return\n\tif (pmw.excludeDomainFromTracking()) return;\n\n\t// Load pixels dynamically based on configuration\n\tconst pixelLoaders = [];\n\n\t// Load free pixels conditionally\n\tif (pmwDataLayer?.pixels?.google) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-google\" */ \"./pixels/google/loader\")\n\t\t);\n\t}\n\t\n\tif (pmwDataLayer?.pixels?.facebook) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-facebook\" */ \"./pixels/facebook/loader\")\n\t\t);\n\t}\n\t\n\tif (pmwDataLayer?.pixels?.hotjar) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-hotjar\" */ \"./pixels/hotjar/loader\")\n\t\t);\n\t}\n\n\tif (pmwDataLayer?.pixels?.crazyegg) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-crazyegg\" */ \"./pixels/crazyegg/loader\")\n\t\t);\n\t}\n\n\t// #if process.env.TIER === 'premium'\n// \t/**\n// \t *  Load premium pixels conditionally\n// \t */\n// \tif (pmw.canLoadPremiumFeatures()) {\n// \t\tpixelLoaders.push(\n// \t\t\timport(/* webpackChunkName: \"pmw-premium-events\" */ \"./pmw/event_listeners_premium\")\n// \t\t);\n// \n// \t\tif (pmwDataLayer?.pixels?.contentsquare) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-contentsquare\" */ \"./pixels/contentsquare/loader\")\n// \t\t\t);\n// \t\t}\n// \n// \t\tif (pmwDataLayer?.pixels?.adroll) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-adroll\" */ \"./pixels/adroll/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.linkedin) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-linkedin\" */ \"./pixels/linkedin/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.bing) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-microsoft\" */ \"./pixels/microsoft-ads/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.outbrain) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-outbrain\" */ \"./pixels/outbrain/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.pinterest) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-pinterest\" */ \"./pixels/pinterest/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.snapchat) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-snapchat\" */ \"./pixels/snapchat/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.taboola) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-taboola\" */ \"./pixels/taboola/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.tiktok) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-tiktok\" */ \"./pixels/tiktok/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.twitter) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-twitter\" */ \"./pixels/twitter/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.reddit) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-reddit\" */ \"./pixels/reddit/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.vwo) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-vwo\" */ \"./pixels/vwo/loader\")\n// \t\t\t);\n// \t\t}\n// \t}\n\t// #endif\n\n\t// Load all active pixels in parallel\n\tawait Promise.all(pixelLoaders);\n\n\t/** Load the deprecated functions as a chunk (if enabled) */\n\tif (pmwDataLayer?.general?.modules?.load_deprecated_functions !== false) {\n\t\tconst {loadDeprecatedFunctions} = await import(/* webpackChunkName: \"deprecated-functions\" */ \"./pmw/deprecated.mjs\");\n\t\tloadDeprecatedFunctions();\n\t}\n\n\t// Preload pixels\n\tdocument.dispatchEvent(new Event(\"pmw:load-pixels\"));\n\n\t// Trigger pmwLoad event\n\tdocument.dispatchEvent(new Event(\"pmwLoad\"));\n\n\t// Wait until page is loaded\n\tawait pmw.pageLoaded();\n\n\tdocument.dispatchEvent(new Event(\"pmw:ready\"));\n\tpmw.triggerPmwDomReadyEvent();\n\n\t// Check if the library version matches the PMW version that's installed on the server\n\tpmw.checkLibraryVersion();\n};\n\nmain();\n\n\n\n\n\n\n\n\n"],"names":["leafPrototypes","getProto","inProgress","dataWebpackPrefix","removeHtmlTagsAndWhitespace","string","replace","trim","jQuery","on","event","target","value","id","triggerAddShippingInfoEvent","slug","text","length","checkedShippingMethod","find","val","attr","shippingTier","document","trigger","paymentMethodChangeLogged","triggerAddPaymentInfoEvent","checkedPaymentMethod","paymentType","url","URL","currentTarget","productId","pmw","getProductIdByCartItemKeyUrl","removeProductFromCart","e","console","error","checkoutButtonSelectors","prepareSelectors","paymentMethodSelected","fireCheckoutProgress","fireCheckoutOption","initCart","pmwDataLayer","products","productIds","getAddToCartLinkProductIds","getProductsFromBackend","referrer","retrieveData","referrerHostname","hostname","window","location","host","storeData","gclid","getUrlParameter","wbraid","gbraid","fbclid","Math","floor","Date","now","ttclid","scid","epik","pmw_loaded","shop","page_type","product_type","getMainProductIdFromProductPage","product","getProductDataForViewItemEvent","variations_output","order","isOrderIdStored","writeOrderIdToStorage","key","acrRemoveCookie","user","hasLoginEventFired","setLoginEventFired","general","lazy_load_pmw","registerShowVariationEventListener","$variationForm","selectedValues","toArray","every","select","productVariations","data","matchingVariation","variation","Object","entries","attributes","triggerViewItemEventPrep","variation_id","async","log","payload","processEvent","server_2_server","pageview_event_s2s","is_active","pageViewS2SPixels","pixelRegistry","getPixelsWithCapability","s2sData","pixelName","pixels","keys","sendEventPayloadToServer","isWooCommerceActive","startIntersectionObserverToWatch","startProductsMutationObserverToWatch","waitForPixelsAndTriggerPageView","require","loadConsentModule","consentModule","consent","apiModule","api","message","objects","isLoggerEnabled","urlLoggerOff","sessionLoggerEnabled","urlLoggerOn","logger","urlHasParameter","util","ipRange_1","dot","mappedIpv4","colon","doubleColon","getIpv6Segments","ip","isIPv6","Error","test","matches","match","isIPv4","prefix","parts","split","map","x","parseInt","toString","mappedIpv4ToIpv6","_a","beforeChunk","afterChunk","beforeParts","afterParts","missingSegments","Array","concat","createChecker","subnetOrSubnets","isArray","checks_1","subnet","createSegmentChecker","address","segments","some","check","subnetAddress","prefixLengthString","prefixLength","Number","isInteger","subnetSegments","addressSegments","i","bitCount","min","exports","specialNetsCache","default","private","ipv6","localhost","Boolean","reserved","__spreadArrays","jQueryExists","Promise","resolve","waitForjQuery","setTimeout","waitForLibrary","library","timeout","interval","startTime","dataLayerFullyLoaded","checkVar","waitForVar","version","logTimeoutId","then","clearTimeout","wpHooksExists","wp","hooks","loadWcHooksFunctions","filters","addFilter","hookName","namespace","callback","priority","this","push","sort","a","b","applyFilters","args","filteredValue","filter","result","warn","removeFilter","initialLength","f","removeAllFilters","hasFilter","getFilters","IPv4","IPv6","util_1","isInSubnet","subnetsByVersion","reduce","acc","isIP","check4","check6","isIPv4MappedAddress","extractMappedIpv4","enumerable","get","isPrivate","isLocalhost","isReserved","isSpecial","getConsentContext","categories","statistics","marketing","preferences","necessary","visitor_has_chosen","settings","visitorHasChosen","explicit_mode","explicitConsentModeActive","getEventContext","timestamp","href","makeFullUrl","user_agent","navigator","userAgent","user_id","raw","eventName","eventData","event_data","context","activePixels","getActivePixels","adapter","getAdapter","adapt","pixelData","firing","getFiringDecision","dispatchToPixels","dispatchUnifiedEvent","dispatchPublicEvent","active","extractS2SData","serverPixels","getPixelsForServerFiring","firingStatus","dispatchToBrowserPixels","browserPixels","getActiveBrowserOnlyPixels","browserEventName","dispatchToS2SPixels","s2sPixels","getActiveS2SPixels","s2sEventName","publicEventName","shouldFireBrowserPixel","fire_browser","shouldFireServerPixel","fire_server","adapters","registerAdapter","options","pixelCapabilities","defaultMode","supportsS2S","mode","supportsEventDeduplication","isActive","$","undefined","isRange","isV4","isV6","getIpVersion","ipDetectionPromise","ipDetectionResolved","ipServices","fetchWithTimeout","timeoutMs","controller","AbortController","timeoutId","abort","fetch","signal","finally","getGeoInfo","cloudflare","response","ok","status","obj","pair","loc","processRegion","countryCode","service","geojs","json","country_code","region","ipinfo","country","ipapi","consent_management","restricted_regions","includes","isVisitorAllowed","JSON","parse","isBotUserAgent","ip_exclude_list","getIp","isOnIpExclusionList","isValidIpAddress","isPrivateOrReservedIp","privateRanges","range","startsWith","second","getClientIp","cachedIp","ipv6Promise","getIpWithTimeout","anyPromise","ipv6Result","anyResult","allSettled","ipVersion","race","_","reject","catch","maxServicesToCheck","validVersions","join","ipv","getIpFromAnyService","getBrowserGeoFromExternalService","performance","promises","forEach","any","toUpperCase","regionCode","toFixed","getBrowserGeo","geoFromStorage","geoInfo","gepLocationByTimeZone","getBrowserLocationByTimeZone","geoLocation","getLocationByTimeZone","ipServicesFiltered","slice","getIpFromService","timeTaken","serviceResponseData","isVisitorNotAllowed","botPatterns","getBotPatterns","pattern","toLowerCase","customPatterns","user_agent_exclude_patterns","isCidr","ipName","ipExcludeList","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","ipv4","addToCartSelectors","quantity","dataset","product_id","addProductToCart","indexOf","each","index","element","classes","getPostIdFromString","one","closest","origin","searchParams","has","nextAll","getIdBasedOndVariationsOutputSetting","getProductDetailsFormattedForEvent","isEmail","emailSelected","getProductIdByCartItemElement","getProductQuantityByCartItemElement","cart","getCartItemsFromBackend","getLibraryVersion","checkLibraryVersion","number","VALID_FIRING_MODES","capabilities","capabilityName","pixelsWithCapability","getFiringMode","s2sEnabled","decision","getPixelsForBrowserFiring","v4Seg","v4Str","IPv4Reg","RegExp","v6Seg","IPv6Reg","s","ipv4ToLong","octets","createLongChecker","addressLong","subnetLong","expandIPv6","ipaddr","ipv4Part","ipv4Regexes","ipv6Part","ipv6Regexes","matchCIDR","zoneIndex","module","first","partSize","cidrBits","part","shift","subnetMatch","rangeList","defaultName","k","len","rangeName","rangeSubnets","kind","apply","octet","prototype","toNormalizedString","toByteArray","other","cidrRange","ref","SpecialRanges","unspecified","broadcast","multicast","linkLocal","loopback","carrierGradeNat","toIPv4MappedAddress","prefixLengthFromSubnetMask","cidr","stop","zeros","zerotable","fourOctet","longValue","parser","parseIntAuto","results","reverse","zoneId","l","toRFC5952String","bestMatchIndex","bestMatchLength","regex","exec","substring","bytes","addr","suffix","call","toFixedLengthString","padStart","uniqueLocal","ipv4Mapped","rfc6145","rfc6052","teredo","toIPv4Address","high","low","transitional","colonCount","lastColon","replacement","replacementCount","lastIndexOf","substr","isValid","error1","isValidFourPartDecimal","parseCIDR","maskLength","parsed","defineProperty","subnetMaskFromPrefixLength","filledOctetCount","j","pow","broadcastAddressFromCIDR","ipInterfaceOctets","subnetMaskOctets","networkAddressFromCIDR","fromByteArray","process","commonjsGlobal","normalize","_validate","nh","sections","n","h","ns","hs","_leftPad","abbreviate","zPreviousFlag","zeroStartIndex","zeroLength","zStartIndex","zLength","section","zFlag","splice","d","p","padding","repeat","_hex2bin","hex","_bin2hex","bin","_addr2bin","binAddr","_bin2addr","binPart","hexSection","divideSubnet","mask0","mask1","limit","abbr","ret","binNetPart","binHostPart","numSubnets","binSubnet","hexAddr","binStartAddr","binEndAddr","start","end","size","randomSubnet","random","ptr","mask","err","inRange","check_range","ip6","range_data","parse_addr","parse_range","storeIP","displayIP","pmwRestSettings","isBelowRestErrorThreshold","isRestEndpointAvailable","testEndpoint","root","cookieName","method","cache","keepalive","redirect","responseJson","success","stringify","isPmwRestEndpointAvailable","orderId","orderKey","source","orderIds","storeOrderIdOnServer","order_duplication_prevention","email","quantityToRemove","storeCartData","is_variation","parent_id","selectors","type","Set","doesWooCommerceCartExist","retrieveCartData","saveCartObjectToDataLayer","ajax_url","body","URLSearchParams","action","cart_item_keys","assign","page_id","product_ids","headers","statusText","responseData","cartObject","triggerViewItemEvent","triggerViewItemEventNoProduct","step","checkout_option","triggerViewItemList","viewItemListTriggerTestMode","css","append","view_item_list_trigger","opacity","background_color","getSearchTermFromUrl","search","io","ioTimeouts","observerCallback","observer","entry","elementId","next","isIntersecting","test_mode","unobserve","remove","ioid","detectedProductTemplateClasses","nested","flat","isNestedClass","elem","className","isFlatClass","prev","hasClass","getAllElementsToWatch","getCommonIdentifiersToWatch","listOfClassNames","haveSameNestingDepth","element1","element2","parents","findCommonParentElement","parent","is","node","countOfChildren","getCommonClass","classes1","classes2","pmwProductIds","querySelectorAll","productsNode","firstChildClassAttr","children","firstChildClasses","secondChildClassAttr","commonClass","firstProductTemplateClasses","IntersectionObserver","threshold","observe","productsMutationObserver","childList","characterData","MutationObserver","mutations","mutation","newNodes","addedNodes","hasPmwProductIdElement","siblings","setCookie","cookieValue","expiryDays","setTime","getTime","expires","toUTCString","cookie","getCookie","name","ca","decodeURIComponent","c","charAt","getCookieThatContainsRegex","cookies","deleteCookie","persistent","extension","dataGetter","getPersistentData","getSessionData","dataSetter","setPersistentData","setSessionData","deleteDataKey","localStorage","removeItem","getPersistentDataKey","sessionStorage","getSessionDataKey","defaultStorageKey","storageKeySuffix","getItem","setItem","order_id","orderDetails","order_key","cartItemKey","dyn_r_ids","list_name","brand","category","variant","list_position","position","price","currency","is_variable","parent_id_dyn_r_ids","getClidFromBrowser","clidId","clidCookieId","dclid","getUserAgent","getViewPort","width","max","documentElement","clientWidth","innerWidth","height","clientHeight","innerHeight","consoleLogVersion","loadedScripts","loadScriptAndCacheIt","fallbackUrl","loadScript","scriptUrl","querySelector","add","script","createElement","src","crossOrigin","onload","onerror","head","appendChild","getOrderItemPrice","orderItem","total","total_tax","loginEventFired","pageLoaded","readyState","pageReady","isMiniCartActive","parameter","hashAsync","algo","str","crypto","subtle","digest","TextEncoder","encode","buf","Uint8Array","getCartValue","doesUrlContainPatterns","patterns","excludeDomainFromTracking","exclude_domains","domain","debug","getRandomEventId","pmwConsoleMessage","pro","distro","eligible_for_updates","show","canLoadPremiumFeatures","pmwDomReadyFired","triggerPmwDomReadyEvent","firePmwDomReadyEvent","addEventListener","dispatchEvent","Event","getEmailFromTarget","sendEventPayloadToServerPremium","checkPixelsLoaded","loaded","getProductIdForSpecificPixel","String","dynamic_remarketing","id_type","isInWooCommerceSesssion","session_active","isNotInWooCommerceSesssion","previousVariationId","initializeCommandQueue","queue","_pmwq","fn","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","m","getPrototypeOf","t","__esModule","create","r","def","current","getOwnPropertyNames","definition","o","chunkId","all","u","g","globalThis","Function","prop","hasOwnProperty","done","needAttach","scripts","getElementsByTagName","getAttribute","charset","nc","setAttribute","onScriptComplete","doneFns","parentNode","removeChild","bind","Symbol","toStringTag","importScripts","currentScript","tagName","installedChunks","installedChunkData","promise","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","chunkLoadingGlobal","self","chunk_base_path","__webpack_public_path__","load","pixelLoaders","google","facebook","hotjar","crazyegg","modules","load_deprecated_functions","loadDeprecatedFunctions","main"],"ignoreList":[],"sourceRoot":""}
     1{"version":3,"file":"pmw-public.p1.min.js","mappings":"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","sources":["webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/create fake namespace object","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/load script","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/event_listeners.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/functions_loader.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/console.mjs","webpack://Pixel-Manager-for-WooCommerce/../../src/ipv6.ts","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/functions_main.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/hooks.js","webpack://Pixel-Manager-for-WooCommerce/../../src/index.ts","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/cross-tab-sync.mjs","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/event-processor.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/ip_services.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/geo/geo.mjs","webpack://Pixel-Manager-for-WooCommerce/../../src/ipRange.ts","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/event_listeners_on_ready.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/version.js","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/pixel-registry.js","webpack://Pixel-Manager-for-WooCommerce/../../src/util.ts","webpack://Pixel-Manager-for-WooCommerce/../../src/ipv4.ts","webpack://Pixel-Manager-for-WooCommerce/../node_modules/ipaddr.js/lib/ipaddr.js","webpack://Pixel-Manager-for-WooCommerce/../node_modules/ip6/ip6.js","webpack://Pixel-Manager-for-WooCommerce/../src/range-check.ts","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/pmw/functions.js","webpack://Pixel-Manager-for-WooCommerce/webpack/bootstrap","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/define property getters","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/ensure chunk","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/get javascript chunk filename","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/global","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/hasOwnProperty shorthand","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/make namespace object","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/publicPath","webpack://Pixel-Manager-for-WooCommerce/webpack/runtime/jsonp chunk loading","webpack://Pixel-Manager-for-WooCommerce/./src/js-src/public/main.js"],"sourcesContent":["var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; (typeof current == 'object' || typeof current == 'function') && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"Pixel Manager for WooCommerce:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// a function that removes all \\n and \\t and html tags from a string\nconst removeHtmlTagsAndWhitespace = string => {\n\n\tstring = string.replace(/<[^>]*>?/gm, \"\").replace(/\\n/gm, \"\").replace(/\\t/gm, \"\");\n\tstring = string.trim();\n\n\treturn string;\n};\n\n/**\n * add_shipping_info event\n */\n\n// trigger when #shipping_method is changed\njQuery(\"form.woocommerce-checkout\").on(\"change\", \"#shipping_method\", (event) => {\n\n\tif (!event.target?.value) return;\n\tif (!event.target?.id) return;\n\n\ttriggerAddShippingInfoEvent({\n\t\tslug: event.target.value,\n\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + event.target.id + \"']\").text()),\n\t});\n});\n\n// trigger when a shipping method is already selected on page load\njQuery(() => {\n\tif (jQuery(\"#shipping_method\").length) {\n\n\t\t// get the checked shipping method from #shipping_method\n\t\tlet checkedShippingMethod = jQuery(\"#shipping_method\").find(\":checked\");\n\n\t\t// if there is a checked shipping method\n\t\tif (checkedShippingMethod.length) {\n\n\t\t\tif (!checkedShippingMethod.val()) return;\n\t\t\tif (!checkedShippingMethod.attr(\"id\")) return;\n\n\t\t\ttriggerAddShippingInfoEvent({\n\t\t\t\tslug: checkedShippingMethod.val(),\n\t\t\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + checkedShippingMethod.attr(\"id\") + \"']\").text()),\n\t\t\t});\n\t\t}\n\t}\n});\n\n// trigger when a shipping method is selected on page load\nconst triggerAddShippingInfoEvent = shippingTier => {\n\tjQuery(document).trigger(\"pmw:add-shipping-info\", {shippingTier});\n};\n\n/**\n * add_payment_info event\n */\n\n\t  // flag to prevent double logging of payment method change on pageload\nlet paymentMethodChangeLogged = false;\n\n// trigger when a payment method is selected\njQuery(\"form.woocommerce-checkout\").on(\"change\", \"input[name=\\\"payment_method\\\"]\", event => {\n\n\tif (!event.target.value) return;\n\tif (!event.target.id) return;\n\n\ttriggerAddPaymentInfoEvent({\n\t\tslug: event.target.value,\n\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + event.target.id + \"']\").text()),\n\t});\n\n\tpaymentMethodChangeLogged = true;\n});\n\n// trigger when a payment method is already selected on page load\njQuery(() => {\n\n\t// prevent double logging of payment method change on pageload\n\tif (paymentMethodChangeLogged) return;\n\n\tlet checkedPaymentMethod = jQuery(\"input[name=\\\"payment_method\\\"]:checked\");\n\n\tif (checkedPaymentMethod.length) {\n\n\t\tif (!checkedPaymentMethod.val()) return;\n\t\tif (!checkedPaymentMethod.attr(\"id\")) return;\n\n\t\ttriggerAddPaymentInfoEvent({\n\t\t\tslug: checkedPaymentMethod.val(),\n\t\t\ttext: removeHtmlTagsAndWhitespace(jQuery(\"label[for='\" + checkedPaymentMethod.attr(\"id\") + \"']\").text()),\n\t\t});\n\t}\n});\n\n// trigger when a payment method is selected on page load\nconst triggerAddPaymentInfoEvent = paymentType => {\n\tjQuery(document).trigger(\"pmw:add-payment-info\", {paymentType});\n};\n\n/**\n * remove_from_cart event\n *\n * Cannot be attached directly because the mini cart doesn't necessarily contain the remove button on page load.\n */\njQuery(document).on(\"click\", \".remove_from_cart_button, .remove\", (event) => {\n\n\t// console.log(\"remove_from_cart event\" + new Date().getTime())\n\n\ttry {\n\n\t\tlet url       = new URL(jQuery(event.currentTarget).attr(\"href\"));\n\t\tlet productId = pmw.getProductIdByCartItemKeyUrl(url);\n\n\t\tpmw.removeProductFromCart(productId);\n\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n/**\n * begin_checkout event\n *\n * Cannot be attached directly because the mini cart doesn't necessarily contain the remove button on page load.\n */\nlet checkoutButtonClasses = [\n\t// \".checkout\", // this is too generic. It triggers on the checkout page on some themes fore each interaction with the checkout form.\n\t\".checkout-button\",\n\t\".cart-checkout-button\",\n\t\".button.checkout\",\n\t\".xoo-wsc-ft-btn-checkout\", // https://xootix.com/side-cart-for-woocommerce/\n\t\".elementor-button--checkout\",\n\t\".xt_woofc-checkout\", // https://wordpress.org/plugins/woo-floating-cart-lite/\n\t\".fkcart-checkout--text\", // https://funnelkit.com/\n];\n\nconst checkoutButtonSelectors = pmw.prepareSelectors(checkoutButtonClasses, \"beginCheckout\");\n\n// https://wordpress.stackexchange.com/a/352171/68337\njQuery(document).on(\"click init_checkout\", checkoutButtonSelectors, () => {\n\tjQuery(document).trigger(\"pmw:begin-checkout\");\n});\n\njQuery(document).on(\"updated_cart_totals\", () => {\n\tjQuery(document).trigger(\"pmw:view-cart\");\n});\n\n/**\n * Set up PWM events\n */\n\n// track checkout option event: purchase click\n// https://wordpress.stackexchange.com/a/352171/68337\njQuery(document).on(\"pmwLoad\", (event) => {\n\tjQuery(document).on(\"payment_method_selected\", () => {\n\n\t\tif (false === pmw.paymentMethodSelected) {\n\t\t\tpmw.fireCheckoutProgress(3);\n\t\t}\n\n\t\tpmw.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val());\n\t\tpmw.paymentMethodSelected = true;\n\t});\n});\n\n// populate the pmwDataLayer with the cart items\njQuery(document).on(\"pmwLoad\", () => {\n\n\ttry {\n\t\tpmw.initCart();\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n// get all add-to-cart= products from backend\njQuery(document).on(\"pmwLoad\", () => {\n\n\tpmwDataLayer.products = pmwDataLayer.products || {};\n\n\t// scan page for add-to-cart= links\n\tlet productIds = pmw.getAddToCartLinkProductIds();\n\n\tpmw.getProductsFromBackend(productIds);\n});\n\n/**\n * Save the referrer into a cookie\n *\n * @returns {void}\n */\njQuery(document).on(\"pmwLoad\", () => {\n\n\t// If there is no referrer, then return\n\tif (!document.referrer) {\n\t\treturn;\n\t}\n\n\t// If the referrer is already stored, then return\n\tif (pmw.retrieveData(\"referrer\")) {\n\t\treturn;\n\t}\n\n\tlet referrerUrl      = new URL(document.referrer);\n\tlet referrerHostname = referrerUrl.hostname;\n\n\tif (referrerHostname !== window.location.host) {\n\t\tpmw.storeData(\"referrer\", referrerHostname);\n\t}\n});\n\n/**\n * Collect parameters from the URL\n * and save them to the PMW session storage.\n * Parameters:\n * - gclid\n * - wbraid\n * - gbraid\n * - fbclid\n * - ttclid\n * - ScCid\n * - epik\n *\n * @returns {void}\n * */\njQuery(document).on(\"pmwLoad\", () => {\n\n\tlet gclid = pmw.getUrlParameter(\"gclid\");\n\tif (gclid) pmw.storeData(\"gclid\", gclid);\n\n\tlet wbraid = pmw.getUrlParameter(\"wbraid\");\n\tif (wbraid) pmw.storeData(\"wbraid\", wbraid);\n\n\tlet gbraid = pmw.getUrlParameter(\"gbraid\");\n\tif (gbraid) pmw.storeData(\"gbraid\", gbraid);\n\n\t// https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc\n\tlet fbclid = pmw.getUrlParameter(\"fbclid\");\n\tif (fbclid) {\n\t\tfbclid = \"fb.1.\" + Math.floor(Date.now() / 1000) + \".\" + fbclid;\n\t\tpmw.storeData(\"fbclid\", fbclid);\n\t}\n\n\tlet ttclid = pmw.getUrlParameter(\"ttclid\");\n\tif (ttclid) pmw.storeData(\"ttclid\", ttclid);\n\n\tlet scid = pmw.getUrlParameter(\"ScCid\");\n\tif (scid) pmw.storeData(\"scid\", scid);\n\n\tlet epik = pmw.getUrlParameter(\"epik\");\n\tif (epik) pmw.storeData(\"epik\", epik);\n});\n\n/**\n * Create our own load event in order to better handle script flow execution when JS \"optimizers\" shuffle the code.\n */\njQuery(document).on(\"pmwLoad\", () => {\n\t// document.addEventListener(\"pmwLoad\", function () {\n\ttry {\n\t\tif (typeof pmwDataLayer != \"undefined\" && !pmwDataLayer?.pmw_loaded) {\n\n\t\t\tjQuery(document).trigger(\"pmw:load-always\");\n\n\t\t\tif (pmwDataLayer?.shop) {\n\t\t\t\tif (\n\t\t\t\t\t\"product\" === pmwDataLayer.shop.page_type &&\n\t\t\t\t\t\"variable\" !== pmwDataLayer.shop.product_type &&\n\t\t\t\t\tpmw.getMainProductIdFromProductPage()\n\t\t\t\t) {\n\t\t\t\t\tlet product = pmw.getProductDataForViewItemEvent(pmw.getMainProductIdFromProductPage());\n\t\t\t\t\tjQuery(document).trigger(\"pmw:view-item\", product);\n\t\t\t\t} else if (\n\t\t\t\t\t\"product\" === pmwDataLayer.shop.page_type &&\n\t\t\t\t\t\"variable\" === pmwDataLayer.shop.product_type &&\n\t\t\t\t\t!pmwDataLayer?.shop?.variations_output &&\n\t\t\t\t\tpmw.getMainProductIdFromProductPage()\n\t\t\t\t) {\n\t\t\t\t\t// For variable products with variations_output disabled, fire view_item with parent product data\n\t\t\t\t\tlet product = pmw.getProductDataForViewItemEvent(pmw.getMainProductIdFromProductPage());\n\t\t\t\t\tjQuery(document).trigger(\"pmw:view-item\", product);\n\t\t\t\t} else if (\"product_category\" === pmwDataLayer.shop.page_type) {\n\t\t\t\t\tjQuery(document).trigger(\"pmw:view-category\");\n\t\t\t\t} else if (\"search\" === pmwDataLayer.shop.page_type) {\n\t\t\t\t\tjQuery(document).trigger(\"pmw:search\");\n\t\t\t\t} else if (\"cart\" === pmwDataLayer.shop.page_type) {\n\t\t\t\t\tjQuery(document).trigger(\"pmw:view-cart\");\n\t\t\t\t} else if (\"order_received_page\" === pmwDataLayer.shop.page_type) {\n\t\t\t\t\tif (pmwDataLayer?.order && !pmw.isOrderIdStored(pmwDataLayer.order.id)) {\n\t\t\t\t\t\tjQuery(document).trigger(\"pmw:purchase\");\n\t\t\t\t\t\tpmw.writeOrderIdToStorage(pmwDataLayer.order.id, pmwDataLayer.order.key);\n\t\t\t\t\t\tif (typeof pmw.acrRemoveCookie === \"function\") pmw.acrRemoveCookie();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tjQuery(document).trigger(\"pmw:everywhere-else\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tjQuery(document).trigger(\"pmw:everywhere-else\");\n\t\t\t}\n\n\t\t\tif (pmwDataLayer?.user?.id && !pmw.hasLoginEventFired()) {\n\t\t\t\tjQuery(document).trigger(\"pmw:login\");\n\t\t\t\tpmw.setLoginEventFired();\n\t\t\t}\n\n\t\t\tif (pmwDataLayer?.user?.account_just_created && !pmw.hasAccountCreatedEventFired()) {\n\t\t\t\tjQuery(document).trigger(\"pmw:account-created\");\n\t\t\t\tpmw.setAccountCreatedEventFired();\n\t\t\t}\n\n\t\t\tpmwDataLayer.pmw_loaded = true;\n\t\t}\n\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n/**\n * Register the show_variation event listener\n * in case lazy loading is enabled\n * because we have to register it immediately\n * and not after the onready event.\n */\nif (pmwDataLayer?.general?.lazy_load_pmw) {\n\tpmw.registerShowVariationEventListener();\n}\n\n/**\n * In case lazy loading is enabled\n * we need to trigger the view-item event on\n * preselected variations.\n *\n * Check if a variation is selected on a variable product page\n * and trigger the view-item event if a variation is selected\n *\n * Fallback for the jQuery(\".single_variation_wrap\").on(\"show_variation\", (event, variation) => {}) event listener\n * in case lazy loading is enabled and the event listener is not triggered.\n *\n * Only fires if variations_output is enabled, as the parent product view_item\n * is already triggered on page load when variations_output is disabled.\n */\njQuery(document).on(\"pmwLoad\", () => {\n\tif (!pmwDataLayer?.general?.lazy_load_pmw) return;\n\tif (!pmwDataLayer?.shop?.variations_output) return;\n\n\ttry {\n\t\tconst $variationForm = jQuery(\".variations_form\");\n\t\tif (!$variationForm.length) return;\n\n\t\tconst selectedValues = {};\n\t\tconst allSelected    = $variationForm.find(\"select\").toArray().every(select => {\n\t\t\tconst value = jQuery(select).val();\n\t\t\tif (value) {\n\t\t\t\tselectedValues[jQuery(select).attr(\"name\")] = value;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tif (!allSelected) return;\n\n\t\tconst productVariations = $variationForm.data(\"product_variations\");\n\t\tif (!productVariations) return;\n\n\t\tconst matchingVariation = productVariations.find(variation =>\n\t\t\tObject.entries(selectedValues).every(([key, value]) =>\n\t\t\t\tvariation.attributes[key] === value,\n\t\t\t),\n\t\t);\n\n\t\tif (matchingVariation) {\n\t\t\tpmw.triggerViewItemEventPrep(matchingVariation.variation_id);\n\t\t}\n\t} catch (e) {\n\t\tpmw.console.error(e);\n\t}\n});\n\n// Check if the REST endpoint is available and log an error if it is not\njQuery(document).on(\"pmwLoad\", async () => {\n\tif (pmw.retrieveData(\"restEndpointAvailable\") === false) pmw.console.error(\"REST endpoint is not available. Using admin-ajax.php instead.\");\n});\n\n/**\n * All s2s events\n */\n\n/**\n * PageView event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n * S2S transmission is controlled by the supportsPageViewS2S capability.\n */\njQuery(document).on(\"pmw:page-view\", async (event) => {\n\n\tpmw.console.log(\"pmw:page-view event fired\", {event});\n\n\t// Use the unified event processor\n\tconst payload = await pmw.processEvent(\"page_view\", {});\n\n\t// Only send to server if pageview S2S is enabled AND there are pixels with this capability\n\tif (pmwDataLayer?.general?.server_2_server?.pageview_event_s2s?.is_active) {\n\t\tconst pageViewS2SPixels = pmw.pixelRegistry.getPixelsWithCapability(\"supportsPageViewS2S\");\n\n\t\tif (pageViewS2SPixels.length > 0) {\n\t\t\t// Extract S2S data only for pixels that support pageview S2S\n\t\t\tconst s2sData = {event: \"page_view\"};\n\n\t\t\tfor (const pixelName of pageViewS2SPixels) {\n\t\t\t\tif (payload.pixels[pixelName]) {\n\t\t\t\t\ts2sData[pixelName] = payload.pixels[pixelName];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (Object.keys(s2sData).length > 1) { // More than just 'event' key\n\t\t\t\tpmw.sendEventPayloadToServer(s2sData);\n\t\t\t}\n\t\t}\n\t}\n});\n\n/**\n * Add to cart event\n *\n * Uses the new unified event processing system with filters\n */\njQuery(document).on(\"pmw:add-to-cart\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:add-to-cart event fired\", {event, product});\n\n\t// Use the new unified event processor\n\tawait pmw.processEvent(\"add_to_cart\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * Remove from cart event\n * Uses the new unified event processing system with filters\n */\njQuery(document).on(\"pmw:remove-from-cart\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:remove-from-cart event fired\", {event, product});\n\n\t// Use the new unified event processor\n\tawait pmw.processEvent(\"remove_from_cart\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * Select item event\n * Uses the new unified event processing system with filters\n */\njQuery(document).on(\"pmw:select-item\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:select-item event fired\", {event, product});\n\n\t// Use the new unified event processor\n\tawait pmw.processEvent(\"select_item\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * View cart event\n */\njQuery(document).on(\"pmw:view-cart\", (event) => {\n\n\tpmw.console.log(\"pmw:view-cart event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"view_cart\", {});\n});\n\n/**\n * Begin checkout event\n */\njQuery(document).on(\"pmw:begin-checkout\", (event) => {\n\n\tpmw.console.log(\"pmw:begin-checkout event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"begin_checkout\", {});\n});\n\n/**\n * Add Payment Info\n */\njQuery(document).on(\"pmw:add-payment-info\", (event) => {\n\n\tpmw.console.log(\"pmw:add-payment-info event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"add_payment_info\", {});\n});\n\n/**\n * Add to wishlist event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n */\njQuery(document).on(\"pmw:add-to-wishlist\", async (event, product) => {\n\n\tpmw.console.log(\"pmw:add-to-wishlist event fired\", {event, product});\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"add_to_wishlist\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * View Item event\n */\njQuery(document).on(\"pmw:view-item\", (event, product = null) => {\n\n\tpmw.console.log(\"pmw:view-item event fired\", {event, product});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"view_item\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * View category event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n */\njQuery(document).on(\"pmw:view-category\", async (event, product = null) => {\n\n\tpmw.console.log(\"pmw:view-category event fired\", {event, product});\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"view_category\", {\n\t\tproduct: product,\n\t});\n});\n\n/**\n * Search event\n */\njQuery(document).on(\"pmw:search\", (event) => {\n\n\tpmw.console.log(\"pmw:search event fired\", {event});\n\n\t/**\n\t * Process the event through the unified event processor\n\t */\n\tpmw.processEvent(\"search\", {});\n});\n\n/**\n * Place order event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n */\njQuery(document).on(\"pmw:place-order\", async (event) => {\n\n\tpmw.console.log(\"pmw:place-order event fired\", {event});\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"place_order\", {});\n});\n\n/**\n * Purchase event\n */\njQuery(document).on(\"pmw:purchase\", async (event) => {\n\n\tpmw.console.log(\"pmw:purchase event fired\", {event});\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"purchase\", {\n\t\torder: pmwDataLayer.order,\n\t});\n});\n\n/**\n * Login event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n */\njQuery(document).on(\"pmw:login\", async () => {\n\n\tpmw.console.log(\"pmw:login event fired\");\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"login\", {});\n});\n\n/**\n * Account created event\n *\n * Uses the unified event processing system with filters.\n * Each pixel's adapter handles the data transformation.\n */\njQuery(document).on(\"pmw:account-created\", async () => {\n\n\tpmw.console.log(\"pmw:account-created event fired\");\n\n\t// Use the unified event processor\n\tawait pmw.processEvent(\"account_created\", {});\n});\n\n/**\n * Run WooCommerce specific functions\n */\njQuery(document).on(\"pmw:ready\", async () => {\n\n\t// Only run if WooCommerce is active\n\tif (!pmw.isWooCommerceActive()) {\n\t\treturn;\n\t}\n\n\t/**\n\t * Run as soon as wpm namespace is loaded\n\t */\n\n\t// Watch for products visible in viewport\n\tpmw.startIntersectionObserverToWatch();\n\n\t// Watch for lazy loaded products\n\tpmw.startProductsMutationObserverToWatch();\n});\n\njQuery(document).on(\"pmw:load-pixels\", () => {\n\tpmw.waitForPixelsAndTriggerPageView();\n});\n","/**\n * Load all PMW functions\n *\n * Ignore event listeners. They need to be loaded after\n * we made sure that jQuery has been loaded.\n */\n\nrequire(\"./functions\")\n\n/**\n * Load consent management module as a chunk\n * @returns {Promise<void>}\n */\nwindow.pmw.loadConsentModule = async () => {\n\tconst consentModule = await import(/* webpackChunkName: \"consent-management\" */ \"./consent/consent.mjs\")\n\twindow.pmw.consent = consentModule\n\t\n\tconst apiModule = await import(/* webpackChunkName: \"consent-api\" */ \"./consent/api.mjs\")\n\twindow.pmw = window.pmw || {}\n\twindow.pmw.consent = window.pmw.consent || {}\n\twindow.pmw.consent.api = apiModule\n\t\n\treturn consentModule\n}\n\nwindow.pmw = window.pmw || {}\nwindow.pmw.console = require(\"./console.mjs\")\n\n// Load cross-tab session sync module\nconst crossTabSync         = require(\"./cross-tab-sync.mjs\")\nwindow.pmw.crossTabSync    = crossTabSync\n\nrequire(\"./ip_services\")\n\n// #if process.env.TIER === 'premium'\n// if (pmw.canLoadPremiumFeatures()) {\n// \trequire(\"./functions_premium\")\n// }\n// #endif\n","/**\n * Logs a message to the console if the logger is enabled.\n *\n * @module console\n * @param message\n * @param objects\n * @public\n * @returns {void}\n */\nexport const log = (message, ...objects) => {\n\n\tif (!isLoggerEnabled()) return\n\n\tif (typeof message === \"object\") {\n\t\tconsole.log(\"Pixel Manager: \", message, ...objects)\n\t} else if (objects.length) {\n\t\tconsole.log(\"Pixel Manager: \" + message, ...objects)\n\t} else {\n\t\tconsole.log(\"Pixel Manager: \" + message)\n\t}\n}\n\n/**\n * Logs an error message to the console.\n *\n * @module console\n * @param message\n * @param objects\n * @public\n * @returns {void}\n */\nexport const error = (message, ...objects) => {\n\n\t// if (!isLoggerEnabled()) return\n\n\t// if message is an object, log the keys\n\tif (typeof message === \"object\") {\n\t\tconsole.error(\"Pixel Manager: \", message, ...objects)\n\t} else if (objects.length) {\n\t\tconsole.error(\"Pixel Manager: \" + message, ...objects)\n\t} else {\n\t\tconsole.error(\"Pixel Manager: \" + message)\n\t}\n}\n\n/**\n * Checks if the logger is enabled.\n *\n * @return {boolean}\n */\nconst isLoggerEnabled = () => {\n\n\tif (urlLoggerOff()) return false\n\n\tif (sessionLoggerEnabled()) return true\n\n\tif (urlLoggerOn()) return true\n\n\treturn !!pmwDataLayer?.general?.logger?.is_active\n}\n\n/**\n * Turn off the logger if the URL parameter is set.\n *\n * @return {boolean}\n */\nconst urlLoggerOff = () => {\n\n\tif (pmw.urlHasParameter(\"pmwloggeroff\")) {\n\t\tpmw.storeData(\"loggerEnabled\", false)\n\t}\n\n\treturn pmw.urlHasParameter(\"pmwloggeroff\")\n}\n\n/**\n * Check if the logger is enabled for the session.\n *\n * @return {boolean}\n */\nconst sessionLoggerEnabled = () => {\n\treturn pmw.retrieveData(\"loggerEnabled\")\n}\n\n/**\n * Turn on the logger if the URL parameter is set.\n *\n * @return {boolean}\n */\nconst urlLoggerOn = () => {\n\n\tif (pmw.urlHasParameter(\"pmwloggeron\")) {\n\t\tpmw.storeData(\"loggerEnabled\", true)\n\t}\n\n\treturn pmw.urlHasParameter(\"pmwloggeron\")\n}\n",null,"(function (pmw, $, undefined) {\n\n\tpmw.jQueryExists = async () => new Promise(resolve => {\n\n\t\t(function waitForjQuery() {\n\t\t\tif (typeof jQuery !== \"undefined\") return resolve()\n\t\t\tsetTimeout(waitForjQuery, 100)\n\t\t})()\n\t})\n\n\tpmw.waitForLibrary = (library, timeout = 5000, interval = 100) => {\n\n\t\tconst startTime = Date.now()\n\t\twhile (typeof window[library] === \"undefined\") {\n\t\t\t// Check if timeout in milliseconds has passed\n\t\t\tif (Date.now() - startTime > timeout) {\n\t\t\t\tbreak // Maximum wait time reached, exit the loop\n\t\t\t}\n\t\t\t// Wait for the interval in milliseconds before checking again\n\t\t\tsetTimeout(() => {\n\t\t\t}, interval)\n\t\t}\n\t}\n\n\tpmw.dataLayerFullyLoaded = async () => {\n\n\t\t// Promise that checks if the nested object pmwDataLayer.version is defined.\n\t\t// If so, resolve.\n\t\t// We must check for the nested object pmwDataLayer.version,\n\t\t// because the pmwDataLayer object can be defined early by adding products to the data layer through\n\t\t// template inline scripts. So we need to wait until the pmwDataLayer configuration objects\n\t\t// are defined.\n\t\tlet checkVar = new Promise((resolve) => {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (\n\t\t\t\t\ttypeof pmwDataLayer !== \"undefined\"\n\t\t\t\t\t&& typeof pmwDataLayer.version !== \"undefined\"\n\t\t\t\t) {\n\t\t\t\t\treturn resolve()\n\t\t\t\t}\n\t\t\t\tsetTimeout(waitForVar, 100)\n\t\t\t})()\n\t\t})\n\n\t\t// Set a timeout to log a message after 6 seconds\n\t\tlet logTimeoutId = setTimeout(() => {\n\t\t\tconsole.error(\"Pixel Manager error: The pmwDataLayer is not defined. Please make sure that the pmwDataLayer script snippet is inserted and not modified by any third-party plugin, such as a consent management platform or a JavaScript optimizer.\")\n\n\t\t}, 6000)\n\n\t\tcheckVar.then(() => {\n\t\t\tclearTimeout(logTimeoutId)\n\t\t})\n\n\t\treturn checkVar\n\t}\n\n\tpmw.wpHooksExists = async () => new Promise(resolve => {\n\t\t(function waitForVar() {\n\n\t\t\t// Resolve if wp.hooks is defined\n\t\t\tif (typeof wp !== \"undefined\" && typeof wp.hooks !== \"undefined\") return resolve()\n\t\t\tsetTimeout(waitForVar, 50)\n\t\t})()\n\t})\n\n\t/**\n\t * Load all WooCommerce hooks functions\n\t *\n\t * Includes safeguard in case the user changed the default load order for wp-hooks, or removed it completely.\n\t *\n\t * @returns {Promise<void>}\n\t */\n\tpmw.loadWcHooksFunctions = async () => {\n\t\t// Load all WooCommerce Blocks hooks\n\t\tawait pmw.wpHooksExists()\n\t\tawait import(/* webpackChunkName: \"wc-hooks\" */ \"./wc_hooks\")\n\t}\n\n}(window.pmw = window.pmw || {}, jQuery))\n","/**\n * WordPress-style hooks system for Pixel Manager\n *\n * Provides a filter API that allows developers to modify event data\n * at various points in the event processing pipeline.\n *\n * Available Filters:\n *\n * 1. pmw_event_payload_pre (payload, eventName)\n *    - Runs before pixel adaptation\n *    - Use case: Add global tracking params, modify core data\n *\n * 2. pmw_pixel_data_{pixelName} (pixelData, eventName, eventData, context)\n *    - Runs after each pixel's adapter\n *    - Use case: Modify pixel-specific data (e.g., pmw_pixel_data_facebook)\n *\n * 3. pmw_event_payload_{eventName} (payload, eventData)\n *    - Runs for specific event types\n *    - Use case: Modify all pixels for a specific event (e.g., pmw_event_payload_add_to_cart)\n *\n * 4. pmw_event_payload_post (payload, eventName)\n *    - Runs after all processing, before dispatch\n *    - Use case: Final validation, logging, debugging\n *\n * 5. pmw_pixel_firing_decision (decision, pixelName, eventName, mode)\n *    - Runs when determining whether to fire browser/server\n *    - decision: { fire_browser: boolean, fire_server: boolean }\n *    - Use case: Force server-only for specific pixels, disable certain pixels per-event\n *\n * @since 1.51.0\n */\n\n(function (pmw, $, undefined) {\n\n\t// Initialize pmw namespace if it doesn't exist\n\twindow.pmw = window.pmw || {};\n\n\t/**\n\t * Hook system for filtering event data\n\t */\n\tpmw.hooks = {\n\t\tfilters: {},\n\n\t\t/**\n\t\t * Add a filter callback\n\t\t *\n\t\t * @param {string} hookName - The filter hook name (e.g., 'pmw_event_payload')\n\t\t * @param {string} namespace - Unique identifier for your filter (e.g., 'my-plugin')\n\t\t * @param {function} callback - The filter function that modifies the value\n\t\t * @param {number} priority - Execution order, lower numbers run first (default: 10)\n\t\t *\n\t\t * @example\n\t\t * // Modify Facebook pixel data\n\t\t * pmw.hooks.addFilter('pmw_pixel_data_facebook', 'my-plugin', (data) => {\n\t\t *   data.custom_param = 'my_value';\n\t\t *   return data;\n\t\t * }, 10);\n\t\t *\n\t\t * @example\n\t\t * // Force server-only firing for Facebook\n\t\t * pmw.hooks.addFilter('pmw_pixel_firing_decision', 'my-plugin', (decision, pixelName) => {\n\t\t *   if (pixelName === 'facebook') {\n\t\t *     return { fire_browser: false, fire_server: true };\n\t\t *   }\n\t\t *   return decision;\n\t\t * });\n\t\t */\n\t\taddFilter: function (hookName, namespace, callback, priority = 10) {\n\t\t\tif (!hookName || typeof hookName !== \"string\") {\n\t\t\t\tpmw.console.error(\"Invalid hook name provided to addFilter\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!namespace || typeof namespace !== \"string\") {\n\t\t\t\tpmw.console.error(\"Invalid namespace provided to addFilter\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof callback !== \"function\") {\n\t\t\t\tpmw.console.error(\"Invalid callback provided to addFilter\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.filters[hookName]) {\n\t\t\t\tthis.filters[hookName] = [];\n\t\t\t}\n\n\t\t\tthis.filters[hookName].push({\n\t\t\t\tnamespace: namespace,\n\t\t\t\tcallback : callback,\n\t\t\t\tpriority : priority,\n\t\t\t});\n\n\t\t\t// Sort by priority (ascending order)\n\t\t\tthis.filters[hookName].sort((a, b) => a.priority - b.priority);\n\n\t\t\tpmw.console.log(`Filter added: ${hookName} (${namespace}) with priority ${priority}`);\n\t\t},\n\n\t\t/**\n\t\t * Apply all registered filters to a value\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @param {*} value - The value to filter\n\t\t * @param {...*} args - Additional arguments passed to filter callbacks\n\t\t * @returns {*} The filtered value\n\t\t *\n\t\t * @example\n\t\t * let payload = pmw.hooks.applyFilters('pmw_event_payload_pre', payload, eventName);\n\t\t */\n\t\tapplyFilters: function (hookName, value, ...args) {\n\t\t\tif (!this.filters[hookName] || this.filters[hookName].length === 0) {\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tlet filteredValue = value;\n\n\t\t\tfor (const filter of this.filters[hookName]) {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = filter.callback(filteredValue, ...args);\n\n\t\t\t\t\t// Ensure callback returns a value\n\t\t\t\t\tif (result !== undefined) {\n\t\t\t\t\t\tfilteredValue = result;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpmw.console.warn(`Filter ${filter.namespace} on ${hookName} returned undefined, keeping previous value`);\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error(`Filter error in ${filter.namespace} on ${hookName}:`, e);\n\t\t\t\t\t// Continue with the previous value if this filter fails\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn filteredValue;\n\t\t},\n\n\t\t/**\n\t\t * Remove a specific filter\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @param {string} namespace - The namespace of the filter to remove\n\t\t *\n\t\t * @example\n\t\t * pmw.hooks.removeFilter('pmw_pixel_data_facebook', 'my-plugin');\n\t\t */\n\t\tremoveFilter: function (hookName, namespace) {\n\t\t\tif (!this.filters[hookName]) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst initialLength    = this.filters[hookName].length;\n\t\t\tthis.filters[hookName] = this.filters[hookName].filter(f => f.namespace !== namespace);\n\n\t\t\tif (this.filters[hookName].length < initialLength) {\n\t\t\t\tpmw.console.log(`Filter removed: ${hookName} (${namespace})`);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Remove all filters for a specific hook\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t */\n\t\tremoveAllFilters: function (hookName) {\n\t\t\tif (this.filters[hookName]) {\n\t\t\t\tdelete this.filters[hookName];\n\t\t\t\tpmw.console.log(`All filters removed for: ${hookName}`);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Check if a specific hook has any filters\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @param {string} namespace - Optional: check for a specific namespace\n\t\t * @returns {boolean}\n\t\t */\n\t\thasFilter: function (hookName, namespace = null) {\n\t\t\tif (!this.filters[hookName] || this.filters[hookName].length === 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (namespace) {\n\t\t\t\treturn this.filters[hookName].some(f => f.namespace === namespace);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\t/**\n\t\t * Get all registered filters for a hook\n\t\t *\n\t\t * @param {string} hookName - The filter hook name\n\t\t * @returns {Array} Array of filter objects\n\t\t */\n\t\tgetFilters: function (hookName) {\n\t\t\treturn this.filters[hookName] || [];\n\t\t},\n\t};\n\n\t// Backward compatibility: create pmw.hooks as an alias to pmw.hooks\n\tpmw.hooks = pmw.hooks;\n\n}(window.pmw = window.pmw || {}, jQuery));\n",null,"/**\n * Cross-Tab Session Sync Module\n *\n * Synchronizes PMW session storage data across browser tabs using\n * BroadcastChannel (primary) with a localStorage event fallback.\n *\n * This ensures that click identifiers (gclid, fbclid, ttclid, etc.),\n * IP/geo data, and other session state are available in all tabs,\n * including tabs opened via right-click → \"Open in New Tab\".\n *\n * @since 1.57.0\n * @module cross-tab-sync\n */\n\nconst CHANNEL_NAME         = \"pmw_session_sync\"\nconst LOCALSTORAGE_KEY     = \"_pmw_cross_tab_sync\"\nconst SESSION_DATA_PREFIX  = \"_pmw_session_data\"\n\n/**\n * Message types for cross-tab communication\n */\nconst MSG = {\n\tSESSION_REQUEST : \"SESSION_REQUEST\",\n\tSESSION_RESPONSE: \"SESSION_RESPONSE\",\n\tSESSION_UPDATE  : \"SESSION_UPDATE\",\n}\n\n/**\n * Keys that should NOT be synced across tabs.\n * These are per-tab behavioral flags that represent\n * one-time actions or tab-specific state.\n */\nconst EXCLUDED_KEYS = new Set([\n\t\"loginEventFired\",\n\t\"accountCreatedEventFired\",\n\t\"acr_attempted\",\n\t\"store_client_ip_in_server_session\",\n])\n\n/**\n * Guard flag to prevent re-broadcasting data\n * that was received from another tab.\n */\nlet _isSyncing = false\n\n/**\n * Reference to the BroadcastChannel instance (if supported)\n * @type {BroadcastChannel|null}\n */\nlet _channel = null\n\n/**\n * Whether the sync module has been initialized\n */\nlet _initialized = false\n\n/**\n * Check if a session data key should be synced across tabs.\n *\n * @param {string} key - The session data key\n * @return {boolean}\n */\nexport const isSyncableKey = (key) => {\n\treturn !EXCLUDED_KEYS.has(key)\n}\n\n/**\n * Check if we're currently applying synced data (to prevent re-broadcast loops).\n *\n * @return {boolean}\n */\nexport const isSyncing = () => _isSyncing\n\n/**\n * Filter an object to remove excluded keys.\n *\n * @param {Object} data - The session data object\n * @return {Object} Filtered data with excluded keys removed\n */\nconst filterSyncableData = (data) => {\n\tif (!data || typeof data !== \"object\") return {}\n\n\tconst filtered = {}\n\tfor (const key of Object.keys(data)) {\n\t\tif (isSyncableKey(key)) {\n\t\t\tfiltered[key] = data[key]\n\t\t}\n\t}\n\treturn filtered\n}\n\n/**\n * Read all session data from sessionStorage, including extension keys.\n *\n * @return {Object} Object with `main` (the default session data) and `extensions` (map of suffix → data)\n */\nconst readAllSessionData = () => {\n\tconst result = {\n\t\tmain      : {},\n\t\textensions: {},\n\t}\n\n\tif (!window.sessionStorage) return result\n\n\ttry {\n\t\t// Read main session data\n\t\tconst mainRaw = window.sessionStorage.getItem(SESSION_DATA_PREFIX)\n\t\tif (mainRaw) {\n\t\t\tresult.main = JSON.parse(mainRaw)\n\t\t}\n\n\t\t// Scan for extension keys (_pmw_session_data_*)\n\t\tfor (let i = 0; i < window.sessionStorage.length; i++) {\n\t\t\tconst storageKey = window.sessionStorage.key(i)\n\t\t\tif (storageKey && storageKey.startsWith(SESSION_DATA_PREFIX + \"_\")) {\n\t\t\t\tconst suffix = storageKey.substring(SESSION_DATA_PREFIX.length + 1)\n\t\t\t\ttry {\n\t\t\t\t\tresult.extensions[suffix] = JSON.parse(window.sessionStorage.getItem(storageKey))\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// Skip malformed extension data\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\t// sessionStorage access failed\n\t}\n\n\treturn result\n}\n\n/**\n * Merge remote session data into local session storage.\n * Local data takes precedence (local-wins strategy).\n *\n * @param {Object} remoteSnapshot - { main: {}, extensions: {} }\n */\nconst mergeRemoteData = (remoteSnapshot) => {\n\tif (!window.sessionStorage || !remoteSnapshot) return\n\n\t_isSyncing = true\n\n\ttry {\n\t\t// Merge main session data (local wins)\n\t\tif (remoteSnapshot.main && typeof remoteSnapshot.main === \"object\") {\n\t\t\tconst filteredRemote = filterSyncableData(remoteSnapshot.main)\n\t\t\tconst localRaw       = window.sessionStorage.getItem(SESSION_DATA_PREFIX)\n\t\t\tconst localData      = localRaw ? JSON.parse(localRaw) : {}\n\t\t\tconst merged         = {...filteredRemote, ...localData}\n\n\t\t\twindow.sessionStorage.setItem(SESSION_DATA_PREFIX, JSON.stringify(merged))\n\t\t}\n\n\t\t// Merge extension keys (local wins)\n\t\tif (remoteSnapshot.extensions && typeof remoteSnapshot.extensions === \"object\") {\n\t\t\tfor (const [suffix, remoteData] of Object.entries(remoteSnapshot.extensions)) {\n\t\t\t\tconst extKey   = SESSION_DATA_PREFIX + \"_\" + suffix\n\t\t\t\tconst localRaw = window.sessionStorage.getItem(extKey)\n\n\t\t\t\tif (!localRaw) {\n\t\t\t\t\t// No local data for this extension — use remote\n\t\t\t\t\twindow.sessionStorage.setItem(extKey, JSON.stringify(remoteData))\n\t\t\t\t}\n\t\t\t\t// If local data exists, keep it (local wins)\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\t// Merge failed silently\n\t}\n\n\t_isSyncing = false\n}\n\n/**\n * Send a message to other tabs.\n *\n * @param {Object} message - The message object to send\n */\nconst sendMessage = (message) => {\n\ttry {\n\t\tif (_channel) {\n\t\t\t_channel.postMessage(message)\n\t\t} else {\n\t\t\t// Fallback: use localStorage event\n\t\t\t// Write → remove pattern ensures the storage event fires every time,\n\t\t\t// even if the message content is the same\n\t\t\twindow.localStorage.setItem(LOCALSTORAGE_KEY, JSON.stringify(message))\n\t\t\twindow.localStorage.removeItem(LOCALSTORAGE_KEY)\n\t\t}\n\t} catch (e) {\n\t\t// Send failed silently\n\t}\n}\n\n/**\n * Handle an incoming message from another tab.\n *\n * @param {Object} message - The received message\n */\nconst handleMessage = (message) => {\n\tif (!message || !message.type) return\n\n\tswitch (message.type) {\n\n\t\tcase MSG.SESSION_REQUEST:\n\t\t\t// Another tab is requesting session data — send ours\n\t\t\tsendMessage({\n\t\t\t\ttype: MSG.SESSION_RESPONSE,\n\t\t\t\tdata: readAllSessionData(),\n\t\t\t})\n\t\t\tbreak\n\n\t\tcase MSG.SESSION_RESPONSE:\n\t\t\t// We received session data from another tab — merge it\n\t\t\tmergeRemoteData(message.data)\n\t\t\tbreak\n\n\t\tcase MSG.SESSION_UPDATE: {\n\t\t\t// A specific key was updated in another tab — apply it locally\n\t\t\tif (!message.key || !isSyncableKey(message.key)) break\n\n\t\t\t_isSyncing = true\n\n\t\t\ttry {\n\t\t\t\tif (message.extension) {\n\t\t\t\t\t// Extension key update\n\t\t\t\t\tconst extKey = SESSION_DATA_PREFIX + \"_\" + message.suffix\n\t\t\t\t\twindow.sessionStorage.setItem(extKey, JSON.stringify(message.value))\n\t\t\t\t} else {\n\t\t\t\t\t// Main session data key update\n\t\t\t\t\tconst localRaw  = window.sessionStorage.getItem(SESSION_DATA_PREFIX)\n\t\t\t\t\tconst localData = localRaw ? JSON.parse(localRaw) : {}\n\t\t\t\t\tlocalData[message.key] = message.value\n\t\t\t\t\twindow.sessionStorage.setItem(SESSION_DATA_PREFIX, JSON.stringify(localData))\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t// Update failed silently\n\t\t\t}\n\n\t\t\t_isSyncing = false\n\t\t\tbreak\n\t\t}\n\t}\n}\n\n/**\n * Broadcast a session data update to other tabs.\n * Called from pmw.storeData() when a key is written.\n *\n * @param {string} key - The session data key that was updated\n * @param {*} value - The new value\n * @param {boolean} extension - Whether this is an extension key\n * @param {string} suffix - The extension suffix (if extension=true)\n */\nexport const broadcastUpdate = (key, value, extension = false, suffix = \"\") => {\n\tif (_isSyncing) return\n\tif (!extension && !isSyncableKey(key)) return\n\n\tsendMessage({\n\t\ttype: MSG.SESSION_UPDATE,\n\t\tkey,\n\t\tvalue,\n\t\textension,\n\t\tsuffix,\n\t})\n}\n\n/**\n * Request session data from existing tabs.\n * Called when a new tab initializes.\n */\nconst requestSessionData = () => {\n\tsendMessage({type: MSG.SESSION_REQUEST})\n}\n\n/**\n * Initialize the cross-tab sync module.\n * Sets up either BroadcastChannel or localStorage event listener,\n * then requests session data from existing tabs.\n *\n * @since 1.57.0\n */\nexport const init = () => {\n\tif (_initialized) return\n\t_initialized = true\n\n\ttry {\n\t\tif (typeof BroadcastChannel !== \"undefined\") {\n\t\t\t// Primary transport: BroadcastChannel\n\t\t\t_channel = new BroadcastChannel(CHANNEL_NAME)\n\t\t\t_channel.onmessage = (event) => handleMessage(event.data)\n\t\t} else {\n\t\t\t// Fallback transport: localStorage storage events\n\t\t\twindow.addEventListener(\"storage\", (event) => {\n\t\t\t\tif (event.key !== LOCALSTORAGE_KEY || !event.newValue) return\n\n\t\t\t\ttry {\n\t\t\t\t\tconst message = JSON.parse(event.newValue)\n\t\t\t\t\thandleMessage(message)\n\t\t\t\t} catch (e) {\n\t\t\t\t\t// Malformed message\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\t// Request session data from any existing tabs\n\t\trequestSessionData()\n\t} catch (e) {\n\t\t// Initialization failed — sync won't be available but PMW still works\n\t}\n}\n\n/**\n * Clean up the cross-tab sync resources.\n * Called on page unload.\n *\n * @since 1.57.0\n */\nexport const cleanup = () => {\n\tif (_channel) {\n\t\ttry {\n\t\t\t_channel.close()\n\t\t} catch (e) {\n\t\t\t// Close failed silently\n\t\t}\n\t\t_channel = null\n\t}\n\t_initialized = false\n}\n","/**\n * Event Processor\n *\n * Unified event processing system that orchestrates:\n * - Building standardized event payloads\n * - Applying filters at multiple stages\n * - Adapting data for each active pixel\n * - Dispatching to browser pixels and S2S endpoints\n *\n * @since 1.51.0\n */\n\n(function (pmw, $, undefined) {\n\n\t/**\n\t * Get the current consent context\n\t *\n\t * Provides consent status in a structured format for event payloads.\n\t * This allows third-party integrations to make decisions based on\n\t * the current consent state.\n\t *\n\t * @returns {object} Consent context object\n\t */\n\tpmw.getConsentContext = function () {\n\t\tconst categories = pmw.consent?.categories?.get() || {\n\t\t\tstatistics : true,\n\t\t\tmarketing  : true,\n\t\t\tpreferences: true,\n\t\t\tnecessary  : true,\n\t\t};\n\n\t\treturn {\n\t\t\t// Category-level consent status\n\t\t\tcategories: {\n\t\t\t\tstatistics : categories.statistics,\n\t\t\t\tmarketing  : categories.marketing,\n\t\t\t\tpreferences: categories.preferences,\n\t\t\t\tnecessary  : categories.necessary,\n\t\t\t},\n\n\t\t\t// Whether the visitor has actively made a consent choice\n\t\t\tvisitor_has_chosen: pmw.consent?.settings?.get()?.visitorHasChosen ?? false,\n\n\t\t\t// Whether explicit consent mode is active\n\t\t\texplicit_mode: pmw.consent?.explicitConsentModeActive?.() ?? false,\n\t\t};\n\t};\n\n\t/**\n\t * Global event context that's added to all events\n\t *\n\t * @returns {object} Context object with user, session, page, and consent data\n\t */\n\tpmw.getEventContext = function () {\n\t\treturn {\n\t\t\ttimestamp : Math.floor(Date.now() / 1000),\n\t\t\turl       : window.location.href,\n\t\t\treferrer  : pmw.retrieveData(\"referrer\") ? pmw.makeFullUrl(pmw.retrieveData(\"referrer\")) : document.referrer,\n\t\t\tuser_agent: navigator.userAgent,\n\t\t\tpage_type : pmwDataLayer?.shop?.page_type,\n\t\t\tuser_id   : pmwDataLayer?.user?.id?.raw || null,\n\n\t\t\t// Consent status - for third-party integrations and internal use\n\t\t\tconsent: pmw.getConsentContext(),\n\t\t};\n\t};\n\n\t/**\n\t * Process an event through the unified pipeline\n\t *\n\t * This is the main entry point for processing events with the new filter system.\n\t *\n\t * @param {string} eventName - Standardized event name (e.g., 'add_to_cart', 'view_item')\n\t * @param {object} eventData - Core event data (product, cart, order, etc.)\n\t * @returns {Promise<object>} The processed payload\n\t */\n\tpmw.processEvent = async function (eventName, eventData) {\n\n\t\tpmw.console.log(`Processing event: ${eventName}`, eventData);\n\n\t\ttry {\n\t\t\t// 1. Create base payload with standardized structure\n\t\t\tlet payload = {\n\t\t\t\tevent     : eventName,\n\t\t\t\tevent_data: eventData,\n\t\t\t\tpixels    : {},\n\t\t\t\tcontext   : pmw.getEventContext(),\n\t\t\t};\n\n\t\t\t// 2. Apply pre-processing filter\n\t\t\t// Use case: Add global tracking params, modify core data before pixel adaptations\n\t\t\tpayload = pmw.hooks.applyFilters(\"pmw_event_payload_pre\", payload, eventName);\n\n\t\t\t// 3. Transform for each processable pixel (active + S2S-configured-but-not-loaded)\n\t\t\tconst activePixels = pmw.pixelRegistry.getProcessablePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\tconst adapter = pmw.pixelRegistry.getAdapter(pixelName);\n\n\t\t\t\tif (!adapter || typeof adapter.adapt !== \"function\") {\n\t\t\t\t\tpmw.console.log(`No adapter found for pixel: ${pixelName}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\ttry {\n\t\t\t\t// Adapt event data to pixel-specific format (supports async adapters)\n\t\t\t\tlet pixelData = await adapter.adapt(payload.event_data, eventName, payload.context);\n\n\t\t\t\t// Adapters return null for events they don't support\n\t\t\t\t// This allows pixels to opt-out of specific events gracefully\n\t\t\t\t// (e.g., TikTok doesn't support page_view, Pinterest doesn't support add_to_wishlist)\n\t\t\t\tif (pixelData === null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Apply pixel-specific filter\n\t\t\t\t// Use case: Modify Facebook-specific data, add custom parameters per pixel\n\t\t\t\tpixelData = pmw.hooks.applyFilters(\n\t\t\t\t\t`pmw_pixel_data_${pixelName}`,\n\t\t\t\t\tpixelData,\n\t\t\t\t\teventName,\n\t\t\t\t\tpayload.event_data,\n\t\t\t\t\tpayload.context,\n\t\t\t\t);\n\n\t\t\t\tpayload.pixels[pixelName] = pixelData;\n\t\t\t} catch (e) {\n\t\t\t\tpmw.console.error(`Error adapting data for ${pixelName}:`, e);\n\t\t\t}\n\t\t\t}\n\n\t\t\t// 4. Apply event-specific filter\n\t\t\t// Use case: Modify all pixels for a specific event type (e.g., all add_to_cart events)\n\t\t\tpayload = pmw.hooks.applyFilters(\n\t\t\t\t`pmw_event_payload_${eventName}`,\n\t\t\t\tpayload,\n\t\t\t\tpayload.event_data,\n\t\t\t);\n\n\t\t\t// 5. Apply post-processing filter\n\t\t\t// Use case: Final validation, logging, debugging, cross-pixel modifications\n\t\t\tpayload = pmw.hooks.applyFilters(\"pmw_event_payload_post\", payload, eventName);\n\n\t\t\t// 6. Add firing decisions to payload for each pixel\n\t\t\tpayload.firing = {};\n\t\t\tfor (const pixelName of Object.keys(payload.pixels)) {\n\t\t\t\tpayload.firing[pixelName] = pmw.pixelRegistry.getFiringDecision(pixelName, eventName);\n\t\t\t}\n\n\t\t\t// 7. Dispatch to pixels\n\t\t\tawait pmw.dispatchToPixels(payload);\n\n\t\t\treturn payload;\n\n\t\t} catch (e) {\n\t\t\tpmw.console.error(`Error processing event ${eventName}:`, e);\n\t\t\tthrow e;\n\t\t}\n\t};\n\n\t/**\n\t * Dispatch the processed payload to pixels\n\t *\n\t * Unified dispatch system that:\n\t * 1. Dispatches a single pmw:{event} event with firing decisions per pixel\n\t * 2. Sends to server for pixels that need S2S\n\t *\n\t * @param {object} payload - The fully processed event payload with firing decisions\n\t * @returns {Promise<void>}\n\t */\n\tpmw.dispatchToPixels = async function (payload) {\n\n\t\tconst eventName = payload.event;\n\n\t\t// Dispatch unified event (replaces separate browser/s2s events)\n\t\t// Pixels check payload.firing[pixelName].fire_browser to decide if they should fire\n\t\tpmw.dispatchUnifiedEvent(payload);\n\n\t\t// Dispatch PUBLIC event for third-party integrations\n\t\t// This is the official public API - pmw:event:* events\n\t\t// Third parties should listen to these events, not the internal pmw:* events\n\t\tpmw.dispatchPublicEvent(payload);\n\n\t\t// Purchase events are handled entirely server-side and should never be sent from browser to server\n\t\t// to prevent duplicates and race conditions. However, browser-side pixels still need to fire.\n\t\tif (eventName === \"purchase\") {\n\t\t\tpmw.console.log(\"Purchase event - skipping browser-to-server transmission (handled server-side only)\");\n\t\t\treturn; // Return early, but browser pixels have already been dispatched above\n\t\t}\n\n\t\t// Page view S2S is handled separately in the pmw:page-view event listener\n\t\t// which respects the pageview_event_s2s.is_active setting\n\t\tif (eventName === \"page_view\") {\n\t\t\treturn; // Return early, S2S handled in event_listeners.js with proper settings check\n\t\t}\n\n\t\t// Only send to server if S2S is globally enabled\n\t\tif (pmwDataLayer?.general?.server_2_server?.active) {\n\t\t\t// Extract S2S data for server transmission\n\t\t\tconst s2sData = pmw.extractS2SData(payload);\n\n\t\t\t// Send to server if there's S2S data to send\n\t\t\tif (Object.keys(s2sData).length > 0) {\n\n\t\t\t\t// Check if the event has actual destination pixel data (not just metadata like 'event' and 'product')\n\t\t\t\tif (pmwDataLayer.general.server_2_server.skip_empty_events) {\n\t\t\t\t\tconst destinationKeys = Object.keys(s2sData).filter(key => key !== \"event\" && key !== \"product\");\n\t\t\t\t\tif (destinationKeys.length === 0) {\n\t\t\t\t\t\tpmw.console.log(`Skipping empty S2S event: ${eventName} — no destination pixels`);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst serverPixels = pmw.pixelRegistry.getPixelsForServerFiring(eventName);\n\t\t\t\tpmw.console.log(`S2S enabled pixels for ${eventName}:`, serverPixels);\n\t\t\t\tawait pmw.sendEventPayloadToServer(s2sData);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Dispatch unified event to all pixels\n\t *\n\t * This is the new unified event system that replaces the separate pmw:browser:* and pmw:s2s:* events.\n\t * All pixels now listen to pmw:pixel:{event-name} and check payload.firing[pixelName].fire_browser\n\t * to determine if they should fire their browser pixel.\n\t *\n\t * NOTE: This is an INTERNAL event. Third parties should use pmw:event:* events instead.\n\t *\n\t * Event namespace:\n\t * - pmw:{event}        - Entry point events (triggers processEvent)\n\t * - pmw:pixel:{event}  - Pixel dispatch events (pixels listen to these)\n\t * - pmw:event:{event}  - Public API events (third-party integrations)\n\t *\n\t * @param {object} payload - The fully processed event payload with firing decisions\n\t */\n\tpmw.dispatchUnifiedEvent = function (payload) {\n\n\t\tconst processablePixels = pmw.pixelRegistry.getProcessablePixels();\n\n\t\tif (processablePixels.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Convert underscores to hyphens for event name\n\t\tconst eventName = payload.event.replace(/_/g, \"-\");\n\n\t\tpmw.console.log(`Dispatching unified event pmw:pixel:${eventName}`, {\n\t\t\tprocessablePixels: processablePixels,\n\t\t\tfiringStatus     : payload.firing,\n\t\t});\n\n\t\t// Dispatch single unified event to pixel namespace\n\t\t// Pixels check payload.firing[pixelName].fire_browser to decide whether to fire\n\t\tjQuery(document).trigger(`pmw:pixel:${eventName}`, payload);\n\t};\n\n\t/**\n\t * @deprecated Use pmw.dispatchUnifiedEvent() instead\n\t * Dispatch to browser-only pixels (internal) - LEGACY SUPPORT\n\t *\n\t * NOTE: This function is deprecated. Migrate to listening to pmw:* events\n\t * and checking payload.firing[pixelName].fire_browser\n\t *\n\t * @param {object} payload - The fully processed event payload\n\t */\n\tpmw.dispatchToBrowserPixels = function (payload) {\n\n\t\tconst browserPixels = pmw.pixelRegistry.getActiveBrowserOnlyPixels();\n\n\t\tif (browserPixels.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tpmw.console.log(`[DEPRECATED] Dispatching to browser-only pixels for ${payload.event}:`, browserPixels);\n\n\t\t// Trigger browser-specific event that browser-only pixels can listen to (internal)\n\t\t// This allows them to access the filtered, adapted data\n\t\t// Convert underscores to hyphens for event name\n\t\tconst browserEventName = payload.event.replace(/_/g, \"-\");\n\t\tjQuery(document).trigger(`pmw:browser:${browserEventName}`, payload);\n\t};\n\n\t/**\n\t * @deprecated Use pmw.dispatchUnifiedEvent() instead\n\t * Dispatch to S2S-capable pixels (internal) - LEGACY SUPPORT\n\t *\n\t * NOTE: This function is deprecated. Migrate to listening to pmw:* events\n\t * and checking payload.firing[pixelName].fire_browser\n\t *\n\t * @param {object} payload - The fully processed event payload\n\t */\n\tpmw.dispatchToS2SPixels = function (payload) {\n\n\t\tconst s2sPixels = pmw.pixelRegistry.getActiveS2SPixels();\n\n\t\tif (s2sPixels.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tpmw.console.log(`[DEPRECATED] Dispatching to S2S-capable pixels for ${payload.event}:`, s2sPixels);\n\n\t\t// Trigger S2S event that S2S-capable pixels listen to (internal)\n\t\t// This provides adapted data with event_id for deduplication between browser and server\n\t\t// Convert underscores to hyphens for event name\n\t\tconst s2sEventName = payload.event.replace(/_/g, \"-\");\n\t\tjQuery(document).trigger(`pmw:s2s:${s2sEventName}`, payload);\n\t};\n\n\t/**\n\t * Dispatch public event for third-party integrations\n\t *\n\t * This is the official PUBLIC API for third-party integrations.\n\t * Third parties should listen to pmw:event:* events to receive\n\t * fully processed payloads with all data including consent status.\n\t *\n\t * Available events:\n\t * - pmw:event:add-to-cart\n\t * - pmw:event:remove-from-cart\n\t * - pmw:event:view-item\n\t * - pmw:event:view-item-list\n\t * - pmw:event:select-item\n\t * - pmw:event:begin-checkout\n\t * - pmw:event:add-payment-info\n\t * - pmw:event:add-to-wishlist\n\t * - pmw:event:purchase\n\t * - pmw:event:search\n\t * - pmw:event:page-view\n\t *\n\t * @param {object} payload - The fully processed event payload\n\t */\n\tpmw.dispatchPublicEvent = function (payload) {\n\n\t\t// Convert underscores to hyphens for event name (e.g., add_to_cart -> add-to-cart)\n\t\tconst publicEventName = payload.event.replace(/_/g, \"-\");\n\n\t\t// Dispatch the public event that third parties can listen to\n\t\t// This includes all processed data: event_data, pixels, firing, and context (with consent)\n\t\tjQuery(document).trigger(`pmw:event:${publicEventName}`, payload);\n\n\t\tpmw.console.log(`Public event dispatched: pmw:event:${publicEventName}`, payload);\n\t};\n\t/**\n\t * Extract server-to-server data from the payload\n\t *\n\t * Only pixels with fire_server=true in their firing decision should be included.\n\t * This creates a single payload with data for all server-firing pixels.\n\t *\n\t * @param {object} payload - The full event payload with firing decisions\n\t * @returns {object} S2S-only data for server transmission\n\t */\n\tpmw.extractS2SData = function (payload) {\n\n\t\tconst s2sData = {\n\t\t\tevent: payload.event,\n\t\t};\n\n\t\t// Use the new firing decision system\n\t\tconst serverPixels = pmw.pixelRegistry.getPixelsForServerFiring(payload.event);\n\n\t\tfor (const pixelName of serverPixels) {\n\t\t\tif (payload.pixels[pixelName]) {\n\t\t\t\ts2sData[pixelName] = payload.pixels[pixelName];\n\t\t\t}\n\t\t}\n\n\t\t// Add product data if present (for server-side processing)\n\t\tif (payload.event_data?.product) {\n\t\t\ts2sData.product = payload.event_data.product;\n\t\t}\n\n\t\treturn s2sData;\n\t};\n\n\t/**\n\t * Check if a pixel should fire its browser pixel for a given payload\n\t *\n\t * This is a convenience method for pixels to use in their event listeners.\n\t * It checks the payload.firing[pixelName].fire_browser flag.\n\t *\n\t * @param {object} payload - The event payload with firing decisions\n\t * @param {string} pixelName - The pixel name to check\n\t * @returns {boolean} True if the browser pixel should fire\n\t *\n\t * @example\n\t * jQuery(document).on(\"pmw:add-to-cart\", (event, payload) => {\n\t *   if (!pmw.shouldFireBrowserPixel(payload, 'facebook')) return;\n\t *   // Fire the pixel...\n\t * });\n\t */\n\tpmw.shouldFireBrowserPixel = function (payload, pixelName) {\n\t\treturn payload.firing?.[pixelName]?.fire_browser === true;\n\t};\n\n\t/**\n\t * Check if a pixel should fire server-side for a given payload\n\t *\n\t * @param {object} payload - The event payload with firing decisions\n\t * @param {string} pixelName - The pixel name to check\n\t * @returns {boolean} True if the server-side event should fire\n\t */\n\tpmw.shouldFireServerPixel = function (payload, pixelName) {\n\t\treturn payload.firing?.[pixelName]?.fire_server === true;\n\t};\n\n\t/**\n\t * Initialize adapters namespace\n\t */\n\tif (!pmw.adapters) {\n\t\tpmw.adapters = {};\n\t}\n\n\t/**\n\t * Helper function to register an adapter with optional capabilities\n\t *\n\t * Firing Modes:\n\t * - browser_only: Fire only in browser, no server-side (default for pixels without S2S)\n\t * - server_only: Fire only server-side, suppress browser pixel completely\n\t * - both: Fire browser AND server with event_id deduplication (Facebook, TikTok default)\n\t * - browser_or_server: Fire one OR the other, never both (GA4 purchase)\n\t *\n\t * @param {string} pixelName - The pixel name\n\t * @param {object} adapter - The adapter object with an adapt() method\n\t * @param {object} [options] - Optional capabilities configuration\n\t * @param {string} [options.mode='browser_only'] - Firing mode: browser_only, server_only, both, browser_or_server\n\t * @param {boolean} [options.supportsS2S=false] - Whether pixel supports server-to-server tracking\n\t * @param {boolean} [options.supportsEventDeduplication=false] - Whether pixel supports event deduplication\n\t * @param {function} [options.isActive] - Function that returns true if pixel is active/loaded\n\t *\n\t * @example\n\t * // Browser-only pixel (Microsoft Ads)\n\t * pmw.registerAdapter('bing', BingAdapter, {\n\t *   mode: 'browser_only',\n\t *   isActive: () => !!pmwDataLayer?.pixels?.bing?.loaded\n\t * });\n\t *\n\t * @example\n\t * // S2S pixel with deduplication (Facebook)\n\t * pmw.registerAdapter('facebook', FacebookAdapter, {\n\t *   mode: 'both',\n\t *   supportsS2S: true,\n\t *   supportsEventDeduplication: true,\n\t *   isActive: () => !!pmwDataLayer?.pixels?.facebook?.pixel_id\n\t * });\n\t */\n\tpmw.registerAdapter = function (pixelName, adapter, options = {}) {\n\t\tif (!adapter || typeof adapter.adapt !== \"function\") {\n\t\t\tpmw.console.error(`Invalid adapter for ${pixelName}: must have an adapt() method`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Store the adapter\n\t\tpmw.adapters[pixelName] = adapter;\n\n\t\t// Store pixel capabilities\n\t\tif (!pmw.pixelCapabilities) {\n\t\t\tpmw.pixelCapabilities = {};\n\t\t}\n\n\t\t// Determine default mode based on S2S support\n\t\tlet defaultMode = \"browser_only\";\n\t\tif (options.supportsS2S) {\n\t\t\tdefaultMode = \"both\";\n\t\t}\n\n\t\tpmw.pixelCapabilities[pixelName] = {\n\t\t\t...options,\n\t\t\tmode                      : options.mode || defaultMode,\n\t\t\tsupportsS2S               : options.supportsS2S || false,\n\t\t\tsupportsEventDeduplication: options.supportsEventDeduplication || false,\n\t\t\tisActive                  : options.isActive || null,\n\t\t};\n\n\t\t// pmw.console.log(`Adapter registered for: ${pixelName}`, pmw.pixelCapabilities[pixelName]);\n\t};\n\n}(window.pmw = window.pmw || {}, jQuery));","/**\n * IP functions\n */\n\n(function (pmw, $, undefined) {\n\n\tconst {isRange, isIP, isV4, isV6, version: getIpVersion} = require(\"range_check\")\n\n\t// Promise-based IP detection to prevent race conditions\n\t// Stores the ongoing detection promise so multiple callers can await the same result\n\tlet ipDetectionPromise = null\n\t let ipDetectionResolved = false\n\n\tconst ipServices = {\n\t\t\"cloudflare\": {\n\t\t\t\"any\": \"https://www.cloudflare.com/cdn-cgi/trace\",\n\t\t},\n\t\t// icanhazip seems to regularly be added to malware databases, despite being a legitimate service run by Cloudflare\n\t\t// https://blog.apnic.net/2021/06/17/how-a-small-free-ip-tool-survived/\n\t\t// https://major.io/p/a-new-future-for-icanhazip/\n\t\t// https://major.io/p/extra-icanhaz-services-going-offline/\n\t\t\"icanhazip\"   : {\n\t\t\t\"4\"  : \"https://ipv4.icanhazip.com\",\n\t\t\t\"6\"  : \"https://ipv6.icanhazip.com\",\n\t\t\t\"any\": \"https://icanhazip.com\",\n\t\t},\n\t\t\"ipinfo\"      : {\n\t\t\t\"any\": \"https://ipinfo.io/ip\",\n\t\t},\n\t\t\"myexternalip\": {\n\t\t\t\"any\": \"https://myexternalip.com/raw\",\n\t\t\t// \"6\": \"https://api-ipv6.myexternalip.com/raw\", // This can return an IPv4 address, so we can't use it\n\t\t},\n\t\t\"ipify\"       : {\n\t\t\t\"4\"  : \"https://api4.ipify.org\",\n\t\t\t\"6\"  : \"https://api6.ipify.org\",\n\t\t\t\"any\": \"https://api64.ipify.org\", // If IPv6 is available, AND the client is configured to prefer IPv6, this will return an IPv6 address\n\t\t},\n\t\t// ident.me - Reliable service with dedicated IPv4 and IPv6 endpoints\n\t\t// https://api.ident.me/\n\t\t\"identme\"     : {\n\t\t\t\"4\"  : \"https://4.ident.me/\",\n\t\t\t\"6\"  : \"https://6.ident.me/\",\n\t\t\t\"any\": \"https://ident.me/\",\n\t\t},\n\t\t// Can't use amazon because its CORS policy blocks requests from the browser\n\t\t// \"amazon\"    : {\n\t\t// \t\"any\": \"https://checkip.amazonaws.com/\",\n\t\t// },\n\t\t// Can't use ip.sb because its CORS policy blocks requests from the browser\n\t\t// \"ip.sb\"     : {\n\t\t// \t\"any\": \"https://api.ip.sb/ip\",\n\t\t// },\n\t\t// Can't use seeip because its CORS policy blocks requests from the browser\n\t\t// \"seeip\"       : {\n\t\t// \t\"any\": \"https://api.seeip.org\",\n\t\t// \t\"4\": \"https://ipv4.seeip.org\",\n\t\t// \t\"6\": \"https://ipv6.seeip.org\",\n\t\t// },\n\t}\n\n\t/**\n\t * Default timeout for IP service requests in milliseconds.\n\t * If a service doesn't respond within this time, the request is aborted.\n\t */\n\tconst IP_SERVICE_TIMEOUT_MS = 3000\n\n\t/**\n\t * Timeout for IPv6 detection in milliseconds.\n\t * IPv6 detection gets a shorter timeout since we fall back to any IP if it fails.\n\t * This prevents long waits for users without IPv6 connectivity.\n\t */\n\tconst IPV6_DETECTION_TIMEOUT_MS = 2000\n\n\t/**\n\t * Fetch with timeout using AbortController.\n\t * Aborts the request if it takes longer than the specified timeout.\n\t *\n\t * @param {string} url - The URL to fetch\n\t * @param {number} timeoutMs - Timeout in milliseconds (default: IP_SERVICE_TIMEOUT_MS)\n\t * @returns {Promise<Response>} The fetch response\n\t * @throws {Error} Throws 'AbortError' if the request times out\n\t */\n\tconst fetchWithTimeout = (url, timeoutMs = IP_SERVICE_TIMEOUT_MS) => {\n\t\tconst controller = new AbortController()\n\t\tconst timeoutId = setTimeout(() => controller.abort(), timeoutMs)\n\n\t\treturn fetch(url, { signal: controller.signal })\n\t\t\t.finally(() => clearTimeout(timeoutId))\n\t}\n\n\tpmw.getGeoInfo = {\n\n\t\tcloudflare: async () => {\n\n\t\t\tconst response = await fetchWithTimeout(\"https://www.cloudflare.com/cdn-cgi/trace\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from Cloudflare was not OK. Status: ${response.status}`)\n\n\t\t\tlet data = await response.text()\n\n\t\t\tif (!data) throw new Error(\"No data was returned from Cloudflare\")\n\n\t\t\t// Convert key-value pairs to JSON\n\t\t\t// https://stackoverflow.com/a/39284735/452587\n\t\t\tdata = data\n\t\t\t\t.trim()\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.reduce((obj, pair) => {\n\t\t\t\t\tpair = pair.split(\"=\")\n\t\t\t\t\treturn obj[pair[0]] = pair[1], obj\n\t\t\t\t}, {})\n\n\t\t\tif (!data.ip || !data.loc) throw new Error(\"The JSON data is missing the ip or loc key from Cloudflare\")\n\n\t\t\t/**\n\t\t\t * Cloudflare doesn't return the region.\n\t\t\t * If the website manager has set a region such as California in the restricted_regions array,\n\t\t\t * we have to validate the region. This is not possible with the data from Cloudflare.\n\t\t\t * So we have to abort the process and give the other services a chance to return the region.\n\t\t\t */\n\t\t\tif (processRegion(data.loc)) throw new Error(\"We have to validate the region, and this service is not returning the region.\")\n\n\t\t\treturn {\n\t\t\t\tip         : data.ip,\n\t\t\t\tcountryCode: data.loc,\n\t\t\t\tservice    : \"cloudflare\",\n\t\t\t}\n\t\t},\n\n\t\tgeojs: async () => {\n\n\t\t\tconst response = await fetchWithTimeout(\"https://get.geojs.io/v1/ip/geo.json\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from geojs was not OK. Status: ${response.status}`)\n\n\t\t\tlet data = await response.json()\n\n\t\t\tif (!data) throw new Error(\"No JSON data was returned from geojs\")\n\t\t\tif (!data.ip || !data.country_code || !data.region) throw new Error(\"The JSON data is missing the ip, country_code, or region key from geojs\")\n\n\t\t\treturn {\n\t\t\t\tip         : data.ip,\n\t\t\t\tcountryCode: data.country_code,\n\t\t\t\tregion     : data.region,\n\t\t\t\tservice    : \"geojs\",\n\t\t\t}\n\t\t},\n\n\t\tipinfo: async () => {\n\n\t\t\tconst response = await fetchWithTimeout(\"https://ipinfo.io/json\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from ipinfo was not OK from ipinfo. Status: ${response.status}`)\n\n\t\t\tlet data = await response.json()\n\n\t\t\tif (!data) throw new Error(\"No JSON data was returned from ipinfo\")\n\t\t\tif (!data.ip || !data.country || !data.region) throw new Error(\"The JSON data is missing the ip, country, or region key from ipinfo\")\n\n\t\t\treturn {\n\t\t\t\tip         : data.ip,\n\t\t\t\tcountryCode: data.country,\n\t\t\t\tregion     : data.region,\n\t\t\t\tservice    : \"ipinfo\",\n\t\t\t}\n\t\t},\n\n\t\tipapi: async () => {\n\n\t\t\tconst response = await fetchWithTimeout(\"https://ipapi.co/json\")\n\n\t\t\tif (!response.ok) throw new Error(`The response from ipapi was not OK. Status: ${response.status}`)\n\n\t\t\tlet data = await response.json()\n\n\t\t\tif (!data) throw new Error(\"No JSON data was returned from ipapi\")\n\t\t\tif (!data.ip || !data.country || !data.region) throw new Error(\"The JSON data is missing the ip, country, or region key from ipapi\")\n\n\t\t\treturn {\n\t\t\t\tip         : data.ip,\n\t\t\t\tcountryCode: data.country,\n\t\t\t\tregion     : data.region,\n\t\t\t\tservice    : \"ipapi\",\n\t\t\t}\n\t\t},\n\t}\n\n\t/**\n\t * /**\n\t * Cloudflare doesn't return the region.\n\t * If the website manager has set a region such as California in the restricted_regions array,\n\t * we have to validate the region. This is not possible with the data from Cloudflare.\n\t * So we have to abort the process and give the other services a chance to return the region.\n\t *\n\t * If the country code is US,\n\t * and the restricted_regions array contains \"US-CA\" or \"US-VA\",\n\t * we must process the region.\n\t *\n\t * @param countryCode\n\t * @returns {boolean}\n\t */\n\tconst processRegion = (countryCode) => {\n\n\t\tif (countryCode !== \"US \") return false\n\n\t\tconst regionsToCheck = [\"US-CA\", \"US-VA\"]\n\n\t\treturn regionsToCheck.some(region =>\n\t\t\tpmwDataLayer?.general?.consent_management.restricted_regions.includes(region),\n\t\t)\n\t}\n\n\t/**\n\t * Check if the visitor is allowed to trigger server-to-server events\n\t * This checks both bot user-agent patterns and custom IP exclusion list\n\t *\n\t * @returns {Promise<boolean>} True if the visitor is allowed\n\t */\n\tpmw.isVisitorAllowed = async () => {\n\n\t\t// Check the cache if visitor is allowed\n\t\tif (pmw.retrieveData(\"visitorAllowed\") !== null && pmw.retrieveData(\"visitorAllowed\") !== undefined) {\n\t\t\treturn !!JSON.parse(pmw.retrieveData(\"visitorAllowed\"))\n\t\t}\n\n\t\t// Check if user agent is a bot\n\t\tif (pmw.isBotUserAgent()) {\n\t\t\tpmw.storeData(\"visitorAllowed\", false)\n\t\t\treturn false\n\t\t}\n\n\t\t// Check if IP is on the exclusion list (if custom exclusions are defined)\n\t\tif (Array.isArray(pmwDataLayer?.general?.server_2_server?.ip_exclude_list) \n\t\t\t&& pmwDataLayer.general.server_2_server.ip_exclude_list.length > 0) {\n\t\t\t\n\t\t\tconst ip = await pmw.getIp()\n\t\t\t\n\t\t\tif (isOnIpExclusionList(ip)) {\n\t\t\t\tpmw.storeData(\"visitorAllowed\", false)\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\t// If not a bot and not on IP exclusion list, visitor is allowed\n\t\tpmw.storeData(\"visitorAllowed\", true)\n\t\treturn true\n\t}\n\n\t/**\n\t * Validates an IP address (IPv4 or IPv6)\n\t *\n\t * @param {string} ip - The IP address to validate\n\t * @returns {boolean} True if the IP is valid\n\t */\n\tpmw.isValidIpAddress = (ip) => {\n\t\tif (!ip || typeof ip !== \"string\") return false\n\n\t\t// Use the range_check library's isIP function for accurate validation\n\t\tif (!isIP(ip)) return false\n\n\t\t// Additional validation: ensure it's not a private/reserved IP\n\t\t// This is important for CAPI which needs public IPs\n\t\treturn !pmw.isPrivateOrReservedIp(ip)\n\t}\n\n\t/**\n\t * Check if an IP is private or reserved (not suitable for CAPI)\n\t *\n\t * @param {string} ip - The IP address to check\n\t * @returns {boolean} True if the IP is private or reserved\n\t */\n\tpmw.isPrivateOrReservedIp = (ip) => {\n\t\tif (!ip) return true\n\n\t\t// IPv4 private ranges\n\t\tconst ipv4PrivateRanges = [\n\t\t\t\"10.0.0.0/8\",\n\t\t\t\"172.16.0.0/12\",\n\t\t\t\"192.168.0.0/16\",\n\t\t\t\"127.0.0.0/8\",\n\t\t\t\"169.254.0.0/16\", // Link-local\n\t\t\t\"0.0.0.0/8\",\n\t\t]\n\n\t\t// IPv6 private/reserved ranges\n\t\tconst ipv6PrivateRanges = [\n\t\t\t\"::1/128\",         // Loopback\n\t\t\t\"fc00::/7\",        // Unique local\n\t\t\t\"fe80::/10\",       // Link-local\n\t\t\t\"::/128\",          // Unspecified\n\t\t]\n\n\t\tconst privateRanges = isV4(ip) ? ipv4PrivateRanges : ipv6PrivateRanges\n\n\t\t// Use is-in-subnet for accurate range checking\n\t\ttry {\n\t\t\tconst isInSubnet = require(\"is-in-subnet\")\n\t\t\tfor (const range of privateRanges) {\n\t\t\t\tif (isInSubnet.isInSubnet(ip, range)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t// If is-in-subnet check fails, fall back to basic checks\n\t\t\t// These cover the most common private ranges\n\t\t\tif (isV4(ip)) {\n\t\t\t\tif (ip.startsWith(\"10.\") || \n\t\t\t\t\tip.startsWith(\"192.168.\") || \n\t\t\t\t\tip.startsWith(\"127.\") ||\n\t\t\t\t\tip.startsWith(\"169.254.\") ||\n\t\t\t\t\tip.startsWith(\"0.\")) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\t// Check 172.16.0.0/12 range (172.16.x.x - 172.31.x.x)\n\t\t\t\tconst parts = ip.split(\".\")\n\t\t\t\tif (parts[0] === \"172\") {\n\t\t\t\t\tconst second = parseInt(parts[1], 10)\n\t\t\t\t\tif (second >= 16 && second <= 31) {\n\t\t\t\t\t\treturn true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// IPv6 basic checks\n\t\t\t\tif (ip === \"::1\" || ip.startsWith(\"fc\") || ip.startsWith(\"fd\") || ip.startsWith(\"fe80:\")) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\t/**\n\t * Get the client IP address, with race condition prevention.\n\t * Detects IPv6 and any IP in parallel, preferring IPv6 when available.\n\t * IPv6 gets a shorter timeout (2s) to avoid long waits for IPv4-only users.\n\t *\n\t * @returns {Promise<string|null>} The client IP address or null\n\t */\n\tpmw.getClientIp = async () => {\n\t\t// If we already have a resolved IP, return it immediately\n\t\tconst cachedIp = pmw.retrieveData(\"client_ip\")\n\t\tif (cachedIp && pmw.isValidIpAddress(cachedIp)) {\n\t\t\treturn cachedIp\n\t\t}\n\n\t\t// If detection is already in progress, wait for it\n\t\tif (ipDetectionPromise && !ipDetectionResolved) {\n\t\t\treturn ipDetectionPromise\n\t\t}\n\n\t\t// Start a new detection process\n\t\tipDetectionResolved = false\n\t\tipDetectionPromise = (async () => {\n\t\t\ttry {\n\t\t\t\t// Start both IPv6 and \"any\" detection in parallel\n\t\t\t\t// IPv6 is preferred by Meta and other CAPIs\n\t\t\t\tconst ipv6Promise = pmw.getIpWithTimeout(\"6\", IPV6_DETECTION_TIMEOUT_MS)\n\t\t\t\tconst anyPromise = pmw.getIp(\"any\")\n\n\t\t\t\t// Wait for both to settle (resolve or reject)\n\t\t\t\tconst [ipv6Result, anyResult] = await Promise.allSettled([ipv6Promise, anyPromise])\n\n\t\t\t\t// Determine which IP to use (prefer IPv6, fall back to any IP)\n\t\t\t\tlet ip = null\n\n\t\t\t\t// Check IPv6 result first (preferred)\n\t\t\t\tif (ipv6Result.status === \"fulfilled\" && ipv6Result.value) {\n\t\t\t\t\tip = ipv6Result.value\n\t\t\t\t\tpmw.console.log(`Using IPv6 address: ${ip}`)\n\t\t\t\t}\n\t\t\t\t// Fall back to any IP if IPv6 failed or wasn't available\n\t\t\t\telse if (anyResult.status === \"fulfilled\" && anyResult.value) {\n\t\t\t\t\tip = anyResult.value\n\t\t\t\t\tpmw.console.log(`IPv6 not available, using IP: ${ip}`)\n\t\t\t\t}\n\n\t\t\t\t// Validate before storing\n\t\t\t\tif (ip && pmw.isValidIpAddress(ip)) {\n\t\t\t\t\tpmw.storeData(\"client_ip\", ip)\n\t\t\t\t\tipDetectionResolved = true\n\t\t\t\t\treturn ip\n\t\t\t\t}\n\n\t\t\t\tipDetectionResolved = true\n\t\t\t\treturn null\n\t\t\t} catch (error) {\n\t\t\t\tpmw.console.error(\"Error detecting client IP:\", error)\n\t\t\t\tipDetectionResolved = true\n\t\t\t\treturn null\n\t\t\t}\n\t\t})()\n\n\t\treturn ipDetectionPromise\n\t}\n\n\t/**\n\t * Get IP with a custom timeout.\n\t * Wraps getIp with a timeout that rejects if the detection takes too long.\n\t *\n\t * @param {string} ipVersion - The IP version to detect (\"4\", \"6\", or \"any\")\n\t * @param {number} timeoutMs - Maximum time to wait in milliseconds\n\t * @returns {Promise<string|null>} The detected IP or null\n\t */\n\tpmw.getIpWithTimeout = async (ipVersion, timeoutMs) => {\n\t\treturn Promise.race([\n\t\t\tpmw.getIp(ipVersion),\n\t\t\tnew Promise((_, reject) => \n\t\t\t\tsetTimeout(() => reject(new Error(`IPv${ipVersion} detection timed out after ${timeoutMs}ms`)), timeoutMs)\n\t\t\t)\n\t\t]).catch(error => {\n\t\t\tpmw.console.log(error.message)\n\t\t\treturn null\n\t\t})\n\t}\n\n\tpmw.getIp = async (ipVersion = \"any\", maxServicesToCheck = 3) => {\n\n\t\tconst validVersions = [\"any\", \"4\", \"6\"]\n\n\t\t// return null if the version is not valid and console log an error\n\t\tif (!validVersions.includes(ipVersion)) {\n\t\t\tconsole.error(\"The version argument must be one of the following: \" + validVersions.join(\", \"))\n\t\t\treturn null\n\t\t}\n\n\t\tif (ipVersion === \"any\" && pmw.retrieveData(\"ip\")) {\n\t\t\treturn pmw.retrieveData(\"ip\")\n\t\t}\n\n\t\t// Get the ipv data from the cache\n\t\tconst ipv = pmw.retrieveData(`ipv${ipVersion}`)\n\n\t\t// Return it if it is not undefined\n\t\t// The value can be an IP\n\t\t// or null if we ran the test but no IP could be retrieved\n\t\t// It is undefined if the ipVersion was not tested yet\n\t\tif (ipv !== undefined) return ipv\n\n\t\tpmw.console.log(\"Testing the IP address of the browser because one ore more server-to-server APIs are enabled and require the browser IP. It may trigger connection request errors in the console while testing the IP address. This is normal and expected behavior.\")\n\n\t\ttry {// Check the cache if the IP is already stored\n\n\t\t\tconst ip = await pmw.getIpFromAnyService(ipVersion, maxServicesToCheck)\n\n\t\t\t// Validate the IP before storing\n\t\t\tif (ip && !isIP(ip)) {\n\t\t\t\tpmw.console.warn(`Invalid IP address received: ${ip}`)\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\t// Store the IP in the cache\n\t\t\tif (ipVersion === \"any\" && ip) {\n\t\t\t\tpmw.storeData(\"ip\", ip)\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tgetIpVersion(ip) === 4\n\t\t\t\t|| (ipVersion === \"4\" && ip === null)\n\t\t\t) {\n\t\t\t\tpmw.storeData(\"ipv4\", ip)\n\t\t\t}\n\n\t\t\tif (getIpVersion(ip) === 6\n\t\t\t\t|| (ipVersion === \"6\" && ip === null)\n\t\t\t) {\n\t\t\t\tpmw.storeData(\"ipv6\", ip)\n\t\t\t}\n\n\t\t\treturn ip\n\t\t} catch (error) {\n\t\t\t// console.error(error)\n\t\t\treturn null\n\t\t}\n\t}\n\n\tpmw.getBrowserGeoFromExternalService = async () => {\n\n\t\tconst startTime = performance.now()\n\n\t\tlet promises = []\n\n\t\tObject.keys(pmw.getGeoInfo).forEach(service => {\n\t\t\tpromises.push(pmw.getGeoInfo[service]())\n\t\t})\n\n\t\ttry {\n\t\t\tconst data = await Promise.any(promises)\n\n\t\t\tdata.countryCode = data.countryCode.toUpperCase()\n\n\t\t\tif (data.region && data.region === \"California\") {\n\t\t\t\tdata.regionCode = \"US-CA\"\n\t\t\t}\n\n\t\t\tif (data.region && data.region === \"Virginia\") {\n\t\t\t\tdata.regionCode = \"US-VA\"\n\t\t\t}\n\n\t\t\tpmw.console.log(\n\t\t\t\t\"Retrieved the browser geo info from an external service: \",\n\t\t\t\tdata,\n\t\t\t\t\" which took \",\n\t\t\t\t(performance.now() - startTime).toFixed(2) + \" ms\",\n\t\t\t)\n\n\t\t\t// pmw.storeData(\"countryCode\", data.countryCode)\n\t\t\t// pmw.storeData(\"ip\", data.ip)\n\t\t\treturn data\n\t\t} catch (error) {\n\t\t\tpmw.console.error(\"error: \", error)\n\t\t\treturn null\n\t\t}\n\t}\n\n\tconst getBrowserLocationByTimeZone = () => {\n\n\t\tconst geo         = require(\"./geo/geo.mjs\")\n\t\tconst geoLocation = geo.getLocationByTimeZone()\n\n\t\tif (geoLocation.countryCode) {\n\t\t\treturn geoLocation\n\t\t}\n\n\t\treturn null\n\t}\n\n\tpmw.getBrowserGeo = async () => {\n\n\t\tlet geoFromStorage = {}\n\n\t\tif (pmw.retrieveData(\"geoCountryCode\")) geoFromStorage.countryCode = pmw.retrieveData(\"geoCountryCode\")\n\t\tif (pmw.retrieveData(\"geoRegionCode\")) geoFromStorage.regionCode = pmw.retrieveData(\"geoRegionCode\")\n\t\tif (pmw.retrieveData(\"geoRegion\")) geoFromStorage.region = pmw.retrieveData(\"geoRegion\")\n\n\t\tif (geoFromStorage.countryCode) {\n\t\t\tpmw.console.log(\"Retrieved the browser geo location from the cache: \", geoFromStorage)\n\t\t\treturn geoFromStorage\n\t\t}\n\n\t\tlet geoInfo = await pmw.getBrowserGeoFromExternalService()\n\n\t\t// If the external services fail, try to use the timezone fallback to get the country\n\t\tif (!geoInfo) {\n\n\t\t\tconst gepLocationByTimeZone = getBrowserLocationByTimeZone()\n\n\t\t\tgeoInfo = {}\n\n\t\t\tif (gepLocationByTimeZone) pmw.console.log(\"Retrieved the browser geo location from the timezone: \", gepLocationByTimeZone)\n\t\t\tif (gepLocationByTimeZone.countryCode) geoInfo.countryCode = gepLocationByTimeZone.countryCode\n\t\t\tif (gepLocationByTimeZone.regionCode) geoInfo.regionCode = gepLocationByTimeZone.regionCode\n\t\t}\n\n\t\tif (geoInfo?.ip) pmw.storeData(\"ip\", geoInfo.ip)\n\t\tif (geoInfo?.countryCode) pmw.storeData(\"geoCountryCode\", geoInfo.countryCode)\n\t\tif (geoInfo?.regionCode) pmw.storeData(\"geoRegionCode\", geoInfo.regionCode)\n\t\tif (geoInfo?.region) pmw.storeData(\"geoRegion\", geoInfo.region)\n\n\t\tif (geoInfo?.countryCode) {\n\t\t\treturn geoInfo\n\t\t}\n\n\t\treturn null\n\t}\n\n\t/**\n\t * Get the IP from the visitor using different services.\n\t * Return the first valid IP address that can be retrieved the fastest.\n\t *\n\t * @returns {Promise<IP>}\n\t */\n\tpmw.getIpFromAnyService = async (ipVersion = \"any\", maxServicesToCheck = 3) => {\n\n\t\t// start tracking time\n\t\tconst startTime = performance.now()\n\n\t\t// take the ipServices object and filter it to only contain objects with an ipVersion key that matches the ipVersion argument\n\t\t// keep the original order of the ipServices object\n\t\t// also keep only the first maxServicesToCheck objects\n\n\t\tconst ipServicesFiltered = Object.keys(ipServices)\n\t\t\t.filter(service => ipServices[service][ipVersion])\n\t\t\t.slice(0, maxServicesToCheck)\n\t\t\t.reduce((obj, key) => {\n\t\t\t\t\tobj[key] = ipServices[key]\n\t\t\t\t\treturn obj\n\t\t\t\t}\n\t\t\t\t, {})\n\n\t\tlet promises = []\n\n\t\tObject.keys(ipServicesFiltered).forEach(service => {\n\t\t\t// only push if the ipVersion is available for the service\n\t\t\tif (ipServicesFiltered[service][ipVersion]) {\n\t\t\t\t// console.log(`pushing ${service} to promises array with ipVersion ${ipVersion}`)\n\t\t\t\tpromises.push(pmw.getIpFromService(service, ipVersion))\n\t\t\t}\n\t\t})\n\n\t\t// If the promises array is not empty, return the first promise that resolves the fastest\n\t\t// Ignore the promises that reject\n\t\tif (promises.length > 0) {\n\n\t\t\ttry {\n\t\t\t\tconst data = await Promise.any(promises)\n\t\t\t\t// console.log(`The Pixel Manager retrieved the IP address ${data.ip} from ${data.service} using IP version ${data.ipVersion}`)\n\n\t\t\t\t// stop tracking time\n\t\t\t\tconst endTime   = performance.now()\n\t\t\t\tconst timeTaken = (endTime - startTime).toFixed(2)\n\n\t\t\t\tpmw.console.log(`Retrieved the IP address ${data.ip} from ${data.service} which took ${timeTaken} ms`)\n\t\t\t\treturn data.ip\n\t\t\t} catch (error) {\n\t\t\t\t// console.error(error)\n\t\t\t\tpmw.console.log(`Could not retrieve an IP with version ${ipVersion} from any of the services.`)\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t} else {\n\t\t\tpmw.console.log(\"No promises to resolve\")\n\t\t\treturn null\n\t\t}\n\t}\n\n\t/**\n\t * Fetches the IP address from a specified service.\n\t *\n\t * @async\n\t * @param {string} service - The name of the service to fetch the IP from.\n\t * @param {string} [ipVersion=\"any\"] - The version of the IP (e.g., \"any\" for global).\n\t * @returns {Promise<Object>} A promise that resolves to an object containing the IP address, service name, and IP version.\n\t * @throws {Error} Will reject the promise with an error if the IP version is not available for the service, the response from the service is not OK, the returned value from the service is not an IP address, or any other error occurs.\n\t */\n\tpmw.getIpFromService = async (service, ipVersion = \"any\") => {\n\t\ttry {\n\n\t\t\tlet data = {\n\t\t\t\tip       : null,\n\t\t\t\tservice  : service,\n\t\t\t\tipVersion: ipVersion,\n\t\t\t}\n\n\t\t\t// Return reject if the ipVersion is not available for the service\n\t\t\tif (!ipServices[service][ipVersion]) return Promise.reject(new Error(`The IP version ${ipVersion} is not available for the service ${service}`))\n\n\t\t\tpmw.console.log(`Fetching IP from ${service} using IP version ${ipVersion}`)\n\n\t\t\tconst response = await fetchWithTimeout(ipServices[service][ipVersion])\n\n\t\t\tif (!response.ok) {\n\t\t\t\treturn Promise.reject(new Error(`The response from ${service} was not OK. Status: ${response.status}`))\n\t\t\t}\n\n\t\t\tlet serviceResponseData = await response.text()\n\n\t\t\tif (service === \"cloudflare\") {\n\t\t\t\t// Convert key-value pairs to JSON\n\t\t\t\tserviceResponseData = serviceResponseData\n\t\t\t\t\t.trim()\n\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t.reduce((obj, pair) => {\n\t\t\t\t\t\tpair = pair.split(\"=\")\n\t\t\t\t\t\treturn (obj[pair[0]] = pair[1]), obj\n\t\t\t\t\t}, {})\n\n\t\t\t\tdata.ip = serviceResponseData.ip\n\t\t\t} else {\n\t\t\t\tdata.ip = serviceResponseData.trim()\n\t\t\t}\n\n\t\t\tif (!isIP(data.ip)) {\n\t\t\t\treturn Promise.reject(new Error(`The returned value from ${service} is not an IP address`))\n\t\t\t}\n\n\t\t\treturn data\n\t\t} catch (error) {\n\t\t\treturn Promise.reject(error)\n\t\t}\n\t}\n\n\t/**\n\t * Cloudflare\n\t *\n\t * Response time: approx. 70ms\n\t * IPv: Returns IPv4 or IPv6 depending on the client\n\t * Dual stack: Doesn't offer dual stack detection\n\t *\n\t * @returns {Promise<*>}\n\t */\n\tconst getIpFromCloudflare = async () => {\n\n\t\tconst response = await fetchWithTimeout(\"https://www.cloudflare.com/cdn-cgi/trace\")\n\t\tlet data       = await response.text()\n\n\t\t// Convert key-value pairs to JSON\n\t\t// https://stackoverflow.com/a/39284735/452587\n\t\tdata = data\n\t\t\t.trim()\n\t\t\t.split(\"\\n\")\n\t\t\t.reduce((obj, pair) => {\n\t\t\t\tpair = pair.split(\"=\")\n\t\t\t\treturn obj[pair[0]] = pair[1], obj\n\t\t\t}, {})\n\n\t\t// return the data.ip not a promise\n\t\treturn data.ip\n\t}\n\n\t/**\n\t * Check if the visitor is NOT allowed to trigger server-to-server events\n\t * This checks both bot user-agent patterns and custom IP exclusion list\n\t *\n\t * @returns {Promise<boolean>} True if the visitor should be blocked\n\t */\n\tpmw.isVisitorNotAllowed = async () => {\n\t\treturn await pmw.isVisitorAllowed() === false\n\t}\n\n\t/**\n\t * Check if the current user agent matches known bot patterns\n\t *\n\t * @returns {boolean} True if the user agent is a bot\n\t */\n\tpmw.isBotUserAgent = () => {\n\t\tconst userAgent = navigator.userAgent || ''\n\t\t\n\t\t// If no user agent, assume it might be a bot\n\t\tif (!userAgent) {\n\t\t\treturn true\n\t\t}\n\n\t\tconst botPatterns = getBotPatterns()\n\n\t\t// Check if user agent matches any bot pattern (case-insensitive)\n\t\tfor (const pattern of botPatterns) {\n\t\t\tif (userAgent.toLowerCase().includes(pattern.toLowerCase())) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\t/**\n\t * Get list of known bot user-agent patterns\n\t *\n\t * @returns {string[]} Array of bot patterns\n\t */\n\tconst getBotPatterns = () => {\n\t\t// Get custom patterns from pmwDataLayer if available\n\t\tlet customPatterns = []\n\t\tif (Array.isArray(pmwDataLayer?.general?.server_2_server?.user_agent_exclude_patterns)) {\n\t\t\tcustomPatterns = pmwDataLayer.general.server_2_server.user_agent_exclude_patterns\n\t\t}\n\n\t\t// Default bot patterns - focusing on legitimate crawlers that identify themselves\n\t\tconst defaultPatterns = [\n\t\t\t// Search engine crawlers\n\t\t\t'Googlebot',\n\t\t\t'Google-InspectionTool',\n\t\t\t'Google-Extended',\n\t\t\t'Storebot-Google',\n\t\t\t'bingbot',\n\t\t\t'BingPreview',\n\t\t\t'msnbot',\n\t\t\t'Slurp',\n\t\t\t'DuckDuckBot',\n\t\t\t'Baiduspider',\n\t\t\t'YandexBot',\n\t\t\t'Sogou',\n\t\t\t\n\t\t\t// Social media crawlers\n\t\t\t'facebookexternalhit',\n\t\t\t'FacebookBot',\n\t\t\t'LinkedInBot',\n\t\t\t'Twitterbot',\n\t\t\t'PinterestBot',\n\t\t\t'TikTokBot',\n\t\t\t'SnapchatAds',\n\t\t\t'DiscordBot',\n\t\t\t'InstagramBot',\n\t\t\t'WhatsApp',\n\t\t\t\n\t\t\t// SEO & Analytics\n\t\t\t'AhrefsBot',\n\t\t\t'SemrushBot',\n\t\t\t'MJ12bot',\n\t\t\t'DotBot',\n\t\t\t'rogerbot',\n\t\t\t\n\t\t\t// Monitoring services\n\t\t\t'UptimeRobot',\n\t\t\t'Pingdom',\n\t\t\t'StatusCake',\n\t\t\t'GTmetrix',\n\t\t\t\n\t\t\t// AI & Research\n\t\t\t'ClaudeBot',\n\t\t\t'GPTBot',\n\t\t\t'ChatGPT',\n\t\t\t'anthropic-ai',\n\t\t\t'CCBot',\n\t\t\t'PerplexityBot',\n\t\t\t\n\t\t\t// Generic patterns\n\t\t\t'crawler',\n\t\t\t'spider',\n\t\t\t'scraper',\n\t\t\t'bot/',\n\t\t\t'/bot',\n\t\t\t'bot-',\n\t\t]\n\n\t\treturn defaultPatterns.concat(customPatterns)\n\t}\n\n\t/**\n\t * Check if an IP address is in CIDR notation\n\t *\n\t * @param {string} ipName - The IP or CIDR notation to check\n\t * @returns {boolean} True if the string contains CIDR notation\n\t */\n\tconst isCidr = (ipName) => {\n\t\treturn ipName.includes('/')\n\t}\n\n\t/**\n\t * Check if an IP address is on the custom exclusion list\n\t *\n\t * @param {string} ip - The IP address to check\n\t * @returns {boolean} True if the IP is on the exclusion list\n\t */\n\tconst isOnIpExclusionList = (ip) => {\n\t\tconst ipExcludeList = pmwDataLayer?.general?.server_2_server?.ip_exclude_list || []\n\n\t\tfor (const ipName of ipExcludeList) {\n\t\t\tif (isCidr(ipName)) {\n\t\t\t\t// Check CIDR range\n\t\t\t\tif (isInSubnet.isInSubnet(ip, ipName)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t} else if (ip === ipName) {\n\t\t\t\t// Exact IP match\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n}(window.pmw = window.pmw || {}, jQuery))\n","// https://stackoverflow.com/a/70870895/4688612\nexport const getLocationByTimeZone = () => {\n\n\tconst timezones = {\n\t\t\"Africa/Abidjan\"                : [\"CI\", \"BF\", \"GH\", \"GM\", \"GN\", \"ML\", \"MR\", \"SH\", \"SL\", \"SN\", \"TG\"],\n\t\t\"Africa/Accra\"                  : [\"GH\"],\n\t\t\"Africa/Addis_Ababa\"            : [\"ET\"],\n\t\t\"Africa/Algiers\"                : [\"DZ\"],\n\t\t\"Africa/Asmara\"                 : [\"ER\"],\n\t\t\"Africa/Asmera\"                 : [\"ER\"],\n\t\t\"Africa/Bamako\"                 : [\"ML\"],\n\t\t\"Africa/Bangui\"                 : [\"CF\"],\n\t\t\"Africa/Banjul\"                 : [\"GM\"],\n\t\t\"Africa/Bissau\"                 : [\"GW\"],\n\t\t\"Africa/Blantyre\"               : [\"MW\"],\n\t\t\"Africa/Brazzaville\"            : [\"CG\"],\n\t\t\"Africa/Bujumbura\"              : [\"BI\"],\n\t\t\"Africa/Cairo\"                  : [\"EG\"],\n\t\t\"Africa/Casablanca\"             : [\"MA\"],\n\t\t\"Africa/Ceuta\"                  : [\"ES\"],\n\t\t\"Africa/Conakry\"                : [\"GN\"],\n\t\t\"Africa/Dakar\"                  : [\"SN\"],\n\t\t\"Africa/Dar_es_Salaam\"          : [\"TZ\"],\n\t\t\"Africa/Djibouti\"               : [\"DJ\"],\n\t\t\"Africa/Douala\"                 : [\"CM\"],\n\t\t\"Africa/El_Aaiun\"               : [\"EH\"],\n\t\t\"Africa/Freetown\"               : [\"SL\"],\n\t\t\"Africa/Gaborone\"               : [\"BW\"],\n\t\t\"Africa/Harare\"                 : [\"ZW\"],\n\t\t\"Africa/Johannesburg\"           : [\"ZA\", \"LS\", \"SZ\"],\n\t\t\"Africa/Juba\"                   : [\"SS\"],\n\t\t\"Africa/Kampala\"                : [\"UG\"],\n\t\t\"Africa/Khartoum\"               : [\"SD\"],\n\t\t\"Africa/Kigali\"                 : [\"RW\"],\n\t\t\"Africa/Kinshasa\"               : [\"CD\"],\n\t\t\"Africa/Lagos\"                  : [\"NG\", \"AO\", \"BJ\", \"CD\", \"CF\", \"CG\", \"CM\", \"GA\", \"GQ\", \"NE\"],\n\t\t\"Africa/Libreville\"             : [\"GA\"],\n\t\t\"Africa/Lome\"                   : [\"TG\"],\n\t\t\"Africa/Luanda\"                 : [\"AO\"],\n\t\t\"Africa/Lubumbashi\"             : [\"CD\"],\n\t\t\"Africa/Lusaka\"                 : [\"ZM\"],\n\t\t\"Africa/Malabo\"                 : [\"GQ\"],\n\t\t\"Africa/Maputo\"                 : [\"MZ\", \"BI\", \"BW\", \"CD\", \"MW\", \"RW\", \"ZM\", \"ZW\"],\n\t\t\"Africa/Maseru\"                 : [\"LS\"],\n\t\t\"Africa/Mbabane\"                : [\"SZ\"],\n\t\t\"Africa/Mogadishu\"              : [\"SO\"],\n\t\t\"Africa/Monrovia\"               : [\"LR\"],\n\t\t\"Africa/Nairobi\"                : [\"KE\", \"DJ\", \"ER\", \"ET\", \"KM\", \"MG\", \"SO\", \"TZ\", \"UG\", \"YT\"],\n\t\t\"Africa/Ndjamena\"               : [\"TD\"],\n\t\t\"Africa/Niamey\"                 : [\"NE\"],\n\t\t\"Africa/Nouakchott\"             : [\"MR\"],\n\t\t\"Africa/Ouagadougou\"            : [\"BF\"],\n\t\t\"Africa/Porto-Novo\"             : [\"BJ\"],\n\t\t\"Africa/Sao_Tome\"               : [\"ST\"],\n\t\t\"Africa/Timbuktu\"               : [\"ML\"],\n\t\t\"Africa/Tripoli\"                : [\"LY\"],\n\t\t\"Africa/Tunis\"                  : [\"TN\"],\n\t\t\"Africa/Windhoek\"               : [\"NA\"],\n\t\t\"America/Adak\"                  : [\"US\"],\n\t\t\"America/Anchorage\"             : [\"US\"],\n\t\t\"America/Anguilla\"              : [\"AI\"],\n\t\t\"America/Antigua\"               : [\"AG\"],\n\t\t\"America/Araguaina\"             : [\"BR\"],\n\t\t\"America/Argentina/Buenos_Aires\": [\"AR\"],\n\t\t\"America/Argentina/Catamarca\"   : [\"AR\"],\n\t\t\"America/Argentina/Cordoba\"     : [\"AR\"],\n\t\t\"America/Argentina/Jujuy\"       : [\"AR\"],\n\t\t\"America/Argentina/La_Rioja\"    : [\"AR\"],\n\t\t\"America/Argentina/Mendoza\"     : [\"AR\"],\n\t\t\"America/Argentina/Rio_Gallegos\": [\"AR\"],\n\t\t\"America/Argentina/Salta\"       : [\"AR\"],\n\t\t\"America/Argentina/San_Juan\"    : [\"AR\"],\n\t\t\"America/Argentina/San_Luis\"    : [\"AR\"],\n\t\t\"America/Argentina/Tucuman\"     : [\"AR\"],\n\t\t\"America/Argentina/Ushuaia\"     : [\"AR\"],\n\t\t\"America/Aruba\"                 : [\"AW\"],\n\t\t\"America/Asuncion\"              : [\"PY\"],\n\t\t\"America/Atikokan\"              : [\"CA\"],\n\t\t\"America/Bahia\"                 : [\"BR\"],\n\t\t\"America/Bahia_Banderas\"        : [\"MX\"],\n\t\t\"America/Barbados\"              : [\"BB\"],\n\t\t\"America/Belem\"                 : [\"BR\"],\n\t\t\"America/Belize\"                : [\"BZ\"],\n\t\t\"America/Blanc-Sablon\"          : [\"CA\"],\n\t\t\"America/Boa_Vista\"             : [\"BR\"],\n\t\t\"America/Bogota\"                : [\"CO\"],\n\t\t\"America/Boise\"                 : [\"US\"],\n\t\t\"America/Cambridge_Bay\"         : [\"CA\"],\n\t\t\"America/Campo_Grande\"          : [\"BR\"],\n\t\t\"America/Cancun\"                : [\"MX\"],\n\t\t\"America/Caracas\"               : [\"VE\"],\n\t\t\"America/Cayenne\"               : [\"GF\"],\n\t\t\"America/Cayman\"                : [\"KY\"],\n\t\t\"America/Chicago\"               : [\"US\"],\n\t\t\"America/Chihuahua\"             : [\"MX\"],\n\t\t\"America/Coral_Harbour\"         : [\"CA\"],\n\t\t\"America/Costa_Rica\"            : [\"CR\"],\n\t\t\"America/Creston\"               : [\"CA\"],\n\t\t\"America/Cuiaba\"                : [\"BR\"],\n\t\t\"America/Curacao\"               : [\"CW\"],\n\t\t\"America/Danmarkshavn\"          : [\"GL\"],\n\t\t\"America/Dawson\"                : [\"CA\"],\n\t\t\"America/Dawson_Creek\"          : [\"CA\"],\n\t\t\"America/Denver\"                : [\"US\"],\n\t\t\"America/Detroit\"               : [\"US\"],\n\t\t\"America/Dominica\"              : [\"DM\"],\n\t\t\"America/Edmonton\"              : [\"CA\"],\n\t\t\"America/Eirunepe\"              : [\"BR\"],\n\t\t\"America/El_Salvador\"           : [\"SV\"],\n\t\t\"America/Fort_Nelson\"           : [\"CA\"],\n\t\t\"America/Fortaleza\"             : [\"BR\"],\n\t\t\"America/Glace_Bay\"             : [\"CA\"],\n\t\t\"America/Goose_Bay\"             : [\"CA\"],\n\t\t\"America/Grand_Turk\"            : [\"TC\"],\n\t\t\"America/Grenada\"               : [\"GD\"],\n\t\t\"America/Guadeloupe\"            : [\"GP\"],\n\t\t\"America/Guatemala\"             : [\"GT\"],\n\t\t\"America/Guayaquil\"             : [\"EC\"],\n\t\t\"America/Guyana\"                : [\"GY\"],\n\t\t\"America/Halifax\"               : [\"CA\"],\n\t\t\"America/Havana\"                : [\"CU\"],\n\t\t\"America/Hermosillo\"            : [\"MX\"],\n\t\t\"America/Indiana/Indianapolis\"  : [\"US\"],\n\t\t\"America/Indiana/Knox\"          : [\"US\"],\n\t\t\"America/Indiana/Marengo\"       : [\"US\"],\n\t\t\"America/Indiana/Petersburg\"    : [\"US\"],\n\t\t\"America/Indiana/Tell_City\"     : [\"US\"],\n\t\t\"America/Indiana/Vevay\"         : [\"US\"],\n\t\t\"America/Indiana/Vincennes\"     : [\"US\"],\n\t\t\"America/Indiana/Winamac\"       : [\"US\"],\n\t\t\"America/Inuvik\"                : [\"CA\"],\n\t\t\"America/Iqaluit\"               : [\"CA\"],\n\t\t\"America/Jamaica\"               : [\"JM\"],\n\t\t\"America/Juneau\"                : [\"US\"],\n\t\t\"America/Kentucky/Louisville\"   : [\"US\"],\n\t\t\"America/Kentucky/Monticello\"   : [\"US\"],\n\t\t\"America/Kralendijk\"            : [\"BQ\"],\n\t\t\"America/La_Paz\"                : [\"BO\"],\n\t\t\"America/Lima\"                  : [\"PE\"],\n\t\t\"America/Los_Angeles\"           : [\"US\"],\n\t\t\"America/Lower_Princes\"         : [\"SX\"],\n\t\t\"America/Maceio\"                : [\"BR\"],\n\t\t\"America/Managua\"               : [\"NI\"],\n\t\t\"America/Manaus\"                : [\"BR\"],\n\t\t\"America/Marigot\"               : [\"MF\"],\n\t\t\"America/Martinique\"            : [\"MQ\"],\n\t\t\"America/Matamoros\"             : [\"MX\"],\n\t\t\"America/Mazatlan\"              : [\"MX\"],\n\t\t\"America/Menominee\"             : [\"US\"],\n\t\t\"America/Merida\"                : [\"MX\"],\n\t\t\"America/Metlakatla\"            : [\"US\"],\n\t\t\"America/Mexico_City\"           : [\"MX\"],\n\t\t\"America/Miquelon\"              : [\"PM\"],\n\t\t\"America/Moncton\"               : [\"CA\"],\n\t\t\"America/Monterrey\"             : [\"MX\"],\n\t\t\"America/Montevideo\"            : [\"UY\"],\n\t\t\"America/Montreal\"              : [\"CA\"],\n\t\t\"America/Montserrat\"            : [\"MS\"],\n\t\t\"America/Nassau\"                : [\"BS\"],\n\t\t\"America/New_York\"              : [\"US\"],\n\t\t\"America/Nipigon\"               : [\"CA\"],\n\t\t\"America/Nome\"                  : [\"US\"],\n\t\t\"America/Noronha\"               : [\"BR\"],\n\t\t\"America/North_Dakota/Beulah\"   : [\"US\"],\n\t\t\"America/North_Dakota/Center\"   : [\"US\"],\n\t\t\"America/North_Dakota/New_Salem\": [\"US\"],\n\t\t\"America/Nuuk\"                  : [\"GL\"],\n\t\t\"America/Ojinaga\"               : [\"MX\"],\n\t\t\"America/Panama\"                : [\"PA\", \"CA\", \"KY\"],\n\t\t\"America/Pangnirtung\"           : [\"CA\"],\n\t\t\"America/Paramaribo\"            : [\"SR\"],\n\t\t\"America/Phoenix\"               : [\"US\", \"CA\"],\n\t\t\"America/Port-au-Prince\"        : [\"HT\"],\n\t\t\"America/Port_of_Spain\"         : [\"TT\"],\n\t\t\"America/Porto_Velho\"           : [\"BR\"],\n\t\t\"America/Puerto_Rico\"           : [\"PR\", \"AG\", \"CA\", \"AI\", \"AW\", \"BL\", \"BQ\", \"CW\", \"DM\", \"GD\", \"GP\", \"KN\", \"LC\", \"MF\", \"MS\", \"SX\", \"TT\", \"VC\", \"VG\", \"VI\"],\n\t\t\"America/Punta_Arenas\"          : [\"CL\"],\n\t\t\"America/Rainy_River\"           : [\"CA\"],\n\t\t\"America/Rankin_Inlet\"          : [\"CA\"],\n\t\t\"America/Recife\"                : [\"BR\"],\n\t\t\"America/Regina\"                : [\"CA\"],\n\t\t\"America/Resolute\"              : [\"CA\"],\n\t\t\"America/Rio_Branco\"            : [\"BR\"],\n\t\t\"America/Santarem\"              : [\"BR\"],\n\t\t\"America/Santiago\"              : [\"CL\"],\n\t\t\"America/Santo_Domingo\"         : [\"DO\"],\n\t\t\"America/Sao_Paulo\"             : [\"BR\"],\n\t\t\"America/Scoresbysund\"          : [\"GL\"],\n\t\t\"America/Sitka\"                 : [\"US\"],\n\t\t\"America/St_Barthelemy\"         : [\"BL\"],\n\t\t\"America/St_Johns\"              : [\"CA\"],\n\t\t\"America/St_Kitts\"              : [\"KN\"],\n\t\t\"America/St_Lucia\"              : [\"LC\"],\n\t\t\"America/St_Thomas\"             : [\"VI\"],\n\t\t\"America/St_Vincent\"            : [\"VC\"],\n\t\t\"America/Swift_Current\"         : [\"CA\"],\n\t\t\"America/Tegucigalpa\"           : [\"HN\"],\n\t\t\"America/Thule\"                 : [\"GL\"],\n\t\t\"America/Thunder_Bay\"           : [\"CA\"],\n\t\t\"America/Tijuana\"               : [\"MX\"],\n\t\t\"America/Toronto\"               : [\"CA\", \"BS\"],\n\t\t\"America/Tortola\"               : [\"VG\"],\n\t\t\"America/Vancouver\"             : [\"CA\"],\n\t\t\"America/Virgin\"                : [\"VI\"],\n\t\t\"America/Whitehorse\"            : [\"CA\"],\n\t\t\"America/Winnipeg\"              : [\"CA\"],\n\t\t\"America/Yakutat\"               : [\"US\"],\n\t\t\"America/Yellowknife\"           : [\"CA\"],\n\t\t\"Antarctica/Casey\"              : [\"AQ\"],\n\t\t\"Antarctica/Davis\"              : [\"AQ\"],\n\t\t\"Antarctica/DumontDUrville\"     : [\"AQ\"],\n\t\t\"Antarctica/Macquarie\"          : [\"AU\"],\n\t\t\"Antarctica/Mawson\"             : [\"AQ\"],\n\t\t\"Antarctica/McMurdo\"            : [\"AQ\"],\n\t\t\"Antarctica/Palmer\"             : [\"AQ\"],\n\t\t\"Antarctica/Rothera\"            : [\"AQ\"],\n\t\t\"Antarctica/South_Pole\"         : [\"AQ\"],\n\t\t\"Antarctica/Syowa\"              : [\"AQ\"],\n\t\t\"Antarctica/Troll\"              : [\"AQ\"],\n\t\t\"Antarctica/Vostok\"             : [\"AQ\"],\n\t\t\"Arctic/Longyearbyen\"           : [\"SJ\"],\n\t\t\"Asia/Aden\"                     : [\"YE\"],\n\t\t\"Asia/Almaty\"                   : [\"KZ\"],\n\t\t\"Asia/Amman\"                    : [\"JO\"],\n\t\t\"Asia/Anadyr\"                   : [\"RU\"],\n\t\t\"Asia/Aqtau\"                    : [\"KZ\"],\n\t\t\"Asia/Aqtobe\"                   : [\"KZ\"],\n\t\t\"Asia/Ashgabat\"                 : [\"TM\"],\n\t\t\"Asia/Atyrau\"                   : [\"KZ\"],\n\t\t\"Asia/Baghdad\"                  : [\"IQ\"],\n\t\t\"Asia/Bahrain\"                  : [\"BH\"],\n\t\t\"Asia/Baku\"                     : [\"AZ\"],\n\t\t\"Asia/Bangkok\"                  : [\"TH\", \"KH\", \"LA\", \"VN\"],\n\t\t\"Asia/Barnaul\"                  : [\"RU\"],\n\t\t\"Asia/Beirut\"                   : [\"LB\"],\n\t\t\"Asia/Bishkek\"                  : [\"KG\"],\n\t\t\"Asia/Brunei\"                   : [\"BN\"],\n\t\t\"Asia/Chita\"                    : [\"RU\"],\n\t\t\"Asia/Choibalsan\"               : [\"MN\"],\n\t\t\"Asia/Colombo\"                  : [\"LK\"],\n\t\t\"Asia/Damascus\"                 : [\"SY\"],\n\t\t\"Asia/Dhaka\"                    : [\"BD\"],\n\t\t\"Asia/Dili\"                     : [\"TL\"],\n\t\t\"Asia/Dubai\"                    : [\"AE\", \"OM\"],\n\t\t\"Asia/Dushanbe\"                 : [\"TJ\"],\n\t\t\"Asia/Famagusta\"                : [\"CY\"],\n\t\t\"Asia/Gaza\"                     : [\"PS\"],\n\t\t\"Asia/Hebron\"                   : [\"PS\"],\n\t\t\"Asia/Ho_Chi_Minh\"              : [\"VN\"],\n\t\t\"Asia/Hong_Kong\"                : [\"HK\"],\n\t\t\"Asia/Hovd\"                     : [\"MN\"],\n\t\t\"Asia/Irkutsk\"                  : [\"RU\"],\n\t\t\"Asia/Jakarta\"                  : [\"ID\"],\n\t\t\"Asia/Jayapura\"                 : [\"ID\"],\n\t\t\"Asia/Jerusalem\"                : [\"IL\"],\n\t\t\"Asia/Kabul\"                    : [\"AF\"],\n\t\t\"Asia/Kamchatka\"                : [\"RU\"],\n\t\t\"Asia/Karachi\"                  : [\"PK\"],\n\t\t\"Asia/Kathmandu\"                : [\"NP\"],\n\t\t\"Asia/Khandyga\"                 : [\"RU\"],\n\t\t\"Asia/Kolkata\"                  : [\"IN\"],\n\t\t\"Asia/Krasnoyarsk\"              : [\"RU\"],\n\t\t\"Asia/Kuala_Lumpur\"             : [\"MY\"],\n\t\t\"Asia/Kuching\"                  : [\"MY\"],\n\t\t\"Asia/Kuwait\"                   : [\"KW\"],\n\t\t\"Asia/Macau\"                    : [\"MO\"],\n\t\t\"Asia/Magadan\"                  : [\"RU\"],\n\t\t\"Asia/Makassar\"                 : [\"ID\"],\n\t\t\"Asia/Manila\"                   : [\"PH\"],\n\t\t\"Asia/Muscat\"                   : [\"OM\"],\n\t\t\"Asia/Nicosia\"                  : [\"CY\"],\n\t\t\"Asia/Novokuznetsk\"             : [\"RU\"],\n\t\t\"Asia/Novosibirsk\"              : [\"RU\"],\n\t\t\"Asia/Omsk\"                     : [\"RU\"],\n\t\t\"Asia/Oral\"                     : [\"KZ\"],\n\t\t\"Asia/Phnom_Penh\"               : [\"KH\"],\n\t\t\"Asia/Pontianak\"                : [\"ID\"],\n\t\t\"Asia/Pyongyang\"                : [\"KP\"],\n\t\t\"Asia/Qatar\"                    : [\"QA\", \"BH\"],\n\t\t\"Asia/Qostanay\"                 : [\"KZ\"],\n\t\t\"Asia/Qyzylorda\"                : [\"KZ\"],\n\t\t\"Asia/Riyadh\"                   : [\"SA\", \"AQ\", \"KW\", \"YE\"],\n\t\t\"Asia/Sakhalin\"                 : [\"RU\"],\n\t\t\"Asia/Samarkand\"                : [\"UZ\"],\n\t\t\"Asia/Seoul\"                    : [\"KR\"],\n\t\t\"Asia/Shanghai\"                 : [\"CN\"],\n\t\t\"Asia/Singapore\"                : [\"SG\", \"MY\"],\n\t\t\"Asia/Srednekolymsk\"            : [\"RU\"],\n\t\t\"Asia/Taipei\"                   : [\"TW\"],\n\t\t\"Asia/Tashkent\"                 : [\"UZ\"],\n\t\t\"Asia/Tbilisi\"                  : [\"GE\"],\n\t\t\"Asia/Tehran\"                   : [\"IR\"],\n\t\t\"Asia/Thimphu\"                  : [\"BT\"],\n\t\t\"Asia/Tokyo\"                    : [\"JP\"],\n\t\t\"Asia/Tomsk\"                    : [\"RU\"],\n\t\t\"Asia/Ulaanbaatar\"              : [\"MN\"],\n\t\t\"Asia/Urumqi\"                   : [\"CN\"],\n\t\t\"Asia/Ust-Nera\"                 : [\"RU\"],\n\t\t\"Asia/Vientiane\"                : [\"LA\"],\n\t\t\"Asia/Vladivostok\"              : [\"RU\"],\n\t\t\"Asia/Yakutsk\"                  : [\"RU\"],\n\t\t\"Asia/Yangon\"                   : [\"MM\"],\n\t\t\"Asia/Yekaterinburg\"            : [\"RU\"],\n\t\t\"Asia/Yerevan\"                  : [\"AM\"],\n\t\t\"Atlantic/Azores\"               : [\"PT\"],\n\t\t\"Atlantic/Bermuda\"              : [\"BM\"],\n\t\t\"Atlantic/Canary\"               : [\"ES\"],\n\t\t\"Atlantic/Cape_Verde\"           : [\"CV\"],\n\t\t\"Atlantic/Faroe\"                : [\"FO\"],\n\t\t\"Atlantic/Jan_Mayen\"            : [\"SJ\"],\n\t\t\"Atlantic/Madeira\"              : [\"PT\"],\n\t\t\"Atlantic/Reykjavik\"            : [\"IS\"],\n\t\t\"Atlantic/South_Georgia\"        : [\"GS\"],\n\t\t\"Atlantic/St_Helena\"            : [\"SH\"],\n\t\t\"Atlantic/Stanley\"              : [\"FK\"],\n\t\t\"Australia/Adelaide\"            : [\"AU\"],\n\t\t\"Australia/Brisbane\"            : [\"AU\"],\n\t\t\"Australia/Broken_Hill\"         : [\"AU\"],\n\t\t\"Australia/Darwin\"              : [\"AU\"],\n\t\t\"Australia/Eucla\"               : [\"AU\"],\n\t\t\"Australia/Hobart\"              : [\"AU\"],\n\t\t\"Australia/Lindeman\"            : [\"AU\"],\n\t\t\"Australia/Lord_Howe\"           : [\"AU\"],\n\t\t\"Australia/Melbourne\"           : [\"AU\"],\n\t\t\"Australia/Perth\"               : [\"AU\"],\n\t\t\"Australia/Sydney\"              : [\"AU\"],\n\t\t\"Canada/Eastern\"                : [\"CA\"],\n\t\t\"Europe/Amsterdam\"              : [\"NL\"],\n\t\t\"Europe/Andorra\"                : [\"AD\"],\n\t\t\"Europe/Astrakhan\"              : [\"RU\"],\n\t\t\"Europe/Athens\"                 : [\"GR\"],\n\t\t\"Europe/Belfast\"                : [\"GB\"],\n\t\t\"Europe/Belgrade\"               : [\"RS\", \"BA\", \"HR\", \"ME\", \"MK\", \"SI\"],\n\t\t\"Europe/Berlin\"                 : [\"DE\"],\n\t\t\"Europe/Bratislava\"             : [\"SK\"],\n\t\t\"Europe/Brussels\"               : [\"BE\"],\n\t\t\"Europe/Bucharest\"              : [\"RO\"],\n\t\t\"Europe/Budapest\"               : [\"HU\"],\n\t\t\"Europe/Busingen\"               : [\"DE\"],\n\t\t\"Europe/Chisinau\"               : [\"MD\"],\n\t\t\"Europe/Copenhagen\"             : [\"DK\"],\n\t\t\"Europe/Dublin\"                 : [\"IE\"],\n\t\t\"Europe/Gibraltar\"              : [\"GI\"],\n\t\t\"Europe/Guernsey\"               : [\"GG\"],\n\t\t\"Europe/Helsinki\"               : [\"FI\", \"AX\"],\n\t\t\"Europe/Isle_of_Man\"            : [\"IM\"],\n\t\t\"Europe/Istanbul\"               : [\"TR\"],\n\t\t\"Europe/Jersey\"                 : [\"JE\"],\n\t\t\"Europe/Kaliningrad\"            : [\"RU\"],\n\t\t\"Europe/Kiev\"                   : [\"UA\"],\n\t\t\"Europe/Kirov\"                  : [\"RU\"],\n\t\t\"Europe/Lisbon\"                 : [\"PT\"],\n\t\t\"Europe/Ljubljana\"              : [\"SI\"],\n\t\t\"Europe/London\"                 : [\"GB\", \"GG\", \"IM\", \"JE\"],\n\t\t\"Europe/Luxembourg\"             : [\"LU\"],\n\t\t\"Europe/Madrid\"                 : [\"ES\"],\n\t\t\"Europe/Malta\"                  : [\"MT\"],\n\t\t\"Europe/Mariehamn\"              : [\"AX\"],\n\t\t\"Europe/Minsk\"                  : [\"BY\"],\n\t\t\"Europe/Monaco\"                 : [\"MC\"],\n\t\t\"Europe/Moscow\"                 : [\"RU\"],\n\t\t\"Europe/Oslo\"                   : [\"NO\", \"SJ\", \"BV\"],\n\t\t\"Europe/Paris\"                  : [\"FR\"],\n\t\t\"Europe/Podgorica\"              : [\"ME\"],\n\t\t\"Europe/Prague\"                 : [\"CZ\", \"SK\"],\n\t\t\"Europe/Riga\"                   : [\"LV\"],\n\t\t\"Europe/Rome\"                   : [\"IT\", \"SM\", \"VA\"],\n\t\t\"Europe/Samara\"                 : [\"RU\"],\n\t\t\"Europe/San_Marino\"             : [\"SM\"],\n\t\t\"Europe/Sarajevo\"               : [\"BA\"],\n\t\t\"Europe/Saratov\"                : [\"RU\"],\n\t\t\"Europe/Simferopol\"             : [\"RU\", \"UA\"],\n\t\t\"Europe/Skopje\"                 : [\"MK\"],\n\t\t\"Europe/Sofia\"                  : [\"BG\"],\n\t\t\"Europe/Stockholm\"              : [\"SE\"],\n\t\t\"Europe/Tallinn\"                : [\"EE\"],\n\t\t\"Europe/Tirane\"                 : [\"AL\"],\n\t\t\"Europe/Ulyanovsk\"              : [\"RU\"],\n\t\t\"Europe/Uzhgorod\"               : [\"UA\"],\n\t\t\"Europe/Vaduz\"                  : [\"LI\"],\n\t\t\"Europe/Vatican\"                : [\"VA\"],\n\t\t\"Europe/Vienna\"                 : [\"AT\"],\n\t\t\"Europe/Vilnius\"                : [\"LT\"],\n\t\t\"Europe/Volgograd\"              : [\"RU\"],\n\t\t\"Europe/Warsaw\"                 : [\"PL\"],\n\t\t\"Europe/Zagreb\"                 : [\"HR\"],\n\t\t\"Europe/Zaporozhye\"             : [\"UA\"],\n\t\t\"Europe/Zurich\"                 : [\"CH\", \"DE\", \"LI\"],\n\t\t\"GB\"                            : [\"GB\"],\n\t\t\"GB-Eire\"                       : [\"GB\"],\n\t\t\"Indian/Antananarivo\"           : [\"MG\"],\n\t\t\"Indian/Chagos\"                 : [\"IO\"],\n\t\t\"Indian/Christmas\"              : [\"CX\"],\n\t\t\"Indian/Cocos\"                  : [\"CC\"],\n\t\t\"Indian/Comoro\"                 : [\"KM\"],\n\t\t\"Indian/Kerguelen\"              : [\"TF\", \"HM\"],\n\t\t\"Indian/Mahe\"                   : [\"SC\"],\n\t\t\"Indian/Maldives\"               : [\"MV\"],\n\t\t\"Indian/Mauritius\"              : [\"MU\"],\n\t\t\"Indian/Mayotte\"                : [\"YT\"],\n\t\t\"Indian/Reunion\"                : [\"RE\", \"TF\"],\n\t\t\"NZ\"                            : [\"NZ\"],\n\t\t\"Pacific/Apia\"                  : [\"WS\"],\n\t\t\"Pacific/Auckland\"              : [\"NZ\", \"AQ\"],\n\t\t\"Pacific/Bougainville\"          : [\"PG\"],\n\t\t\"Pacific/Chatham\"               : [\"NZ\"],\n\t\t\"Pacific/Chuuk\"                 : [\"FM\"],\n\t\t\"Pacific/Easter\"                : [\"CL\"],\n\t\t\"Pacific/Efate\"                 : [\"VU\"],\n\t\t\"Pacific/Fakaofo\"               : [\"TK\"],\n\t\t\"Pacific/Fiji\"                  : [\"FJ\"],\n\t\t\"Pacific/Funafuti\"              : [\"TV\"],\n\t\t\"Pacific/Galapagos\"             : [\"EC\"],\n\t\t\"Pacific/Gambier\"               : [\"PF\"],\n\t\t\"Pacific/Guadalcanal\"           : [\"SB\"],\n\t\t\"Pacific/Guam\"                  : [\"GU\", \"MP\"],\n\t\t\"Pacific/Honolulu\"              : [\"US\", \"UM\"],\n\t\t\"Pacific/Johnston\"              : [\"UM\"],\n\t\t\"Pacific/Kanton\"                : [\"KI\"],\n\t\t\"Pacific/Kiritimati\"            : [\"KI\"],\n\t\t\"Pacific/Kosrae\"                : [\"FM\"],\n\t\t\"Pacific/Kwajalein\"             : [\"MH\"],\n\t\t\"Pacific/Majuro\"                : [\"MH\"],\n\t\t\"Pacific/Marquesas\"             : [\"PF\"],\n\t\t\"Pacific/Midway\"                : [\"UM\"],\n\t\t\"Pacific/Nauru\"                 : [\"NR\"],\n\t\t\"Pacific/Niue\"                  : [\"NU\"],\n\t\t\"Pacific/Norfolk\"               : [\"NF\"],\n\t\t\"Pacific/Noumea\"                : [\"NC\"],\n\t\t\"Pacific/Pago_Pago\"             : [\"AS\", \"UM\"],\n\t\t\"Pacific/Palau\"                 : [\"PW\"],\n\t\t\"Pacific/Pitcairn\"              : [\"PN\"],\n\t\t\"Pacific/Pohnpei\"               : [\"FM\"],\n\t\t\"Pacific/Port_Moresby\"          : [\"PG\", \"AQ\"],\n\t\t\"Pacific/Rarotonga\"             : [\"CK\"],\n\t\t\"Pacific/Saipan\"                : [\"MP\"],\n\t\t\"Pacific/Samoa\"                 : [\"WS\"],\n\t\t\"Pacific/Tahiti\"                : [\"PF\"],\n\t\t\"Pacific/Tarawa\"                : [\"KI\"],\n\t\t\"Pacific/Tongatapu\"             : [\"TO\"],\n\t\t\"Pacific/Wake\"                  : [\"UM\"],\n\t\t\"Pacific/Wallis\"                : [\"WF\"],\n\t\t\"Singapore\"                     : [\"SG\"],\n\t\t\"US/Arizona\"                    : [\"US\"],\n\t\t\"US/Hawaii\"                     : [\"US\"],\n\t\t\"US/Samoa\"                      : [\"WS\"],\n\t}\n\n\tconst timezone = Intl.DateTimeFormat().resolvedOptions().timeZone\n\n\tif (timezone === \"\" || !timezone) {\n\t\treturn null\n\t}\n\n\tlet geoLocation = {\n\t\tcountryCode: timezones[timezone][0].toUpperCase(),\n\t}\n\n\t// if the timezone is equals \"America/Los_Angeles\" then add the regionCode \"US-CA\"\n\tif (timezone === \"America/Los_Angeles\") {\n\t\tgeoLocation.regionCode = \"US-CA\"\n\t}\n\n\tif (timezone === \"Europe/Zurich\") {\n\t\tgeoLocation.regionCode = \"CH-ZH\"\n\t}\n\n\treturn geoLocation\n}\n\n\n\n\n",null,"/**\n * Register event listeners\n */\n\n\n/**\n * add_to_cart event\n *\n * WC is inconsistent with events that emit add-to-cart events.\n * adding_to_cart and added_to_are legacy events. Also, they only work\n * on Ajax buttons on shop pages.\n *\n * Never add document or body selectors.\n * The document selector doesn't work.\n * The body selector will cause the events to fire twice and other erratic behavior if used along with other selectors.\n */\nconst addToCartSelectorsArray = [\n\t// \"document\",\n\t// \"body\",\n\t\".add_to_cart_button:not(.product_type_variable)\",\n\t\".ajax_add_to_cart\",\n\t\".single_add_to_cart_button\",\n];\n\nconst addToCartSelectors = pmw.prepareSelectors(addToCartSelectorsArray, \"addToCart\");\n\njQuery(addToCartSelectors).on(\"click adding_to_cart\", (event, data) => {\n\n\t// console.log(\"add_to_cart event fired at: \" + new Date().getTime())\n\t// console.log('add to cart data', data)\n\t// console.log('add to cart event', event)\n\t// console.log('add to cart jQuery(event.target.dataset)', jQuery(event.target.dataset))\n\t// console.log(\"add to cart event.target.dataset\", event.target.dataset)\n\t// console.log(\"add to cart event.target.dataset.quantity\", event.target.dataset.quantity)\n\t// console.log(\"add to cart event.target.dataset.product_id\", event.target.dataset.product_id)\n\n\ttry {\n\n\t\t// console.log(\"add_to_cart event detected\")\n\n\t\tlet quantity  = event?.target?.dataset?.quantity ? event.target.dataset.quantity : null;\n\t\tlet productId = event?.target?.dataset?.product_id ? event.target.dataset.product_id : event?.target?.value ? event.target.value : null;\n\n\t\t// let quantity  = event.target.dataset.quantity ? event.target.dataset.quantity : 1\n\t\t// let productId = event.target.dataset.product_id ? event.target.dataset.product_id : null\n\n\t\t// Only process on product pages\n\t\tif (pmwDataLayer.shop.page_type === \"product\") {\n\n\t\t\t// First process related and upsell products\n\t\t\tif (\n\t\t\t\ttypeof jQuery(event.currentTarget).attr(\"href\") !== \"undefined\"\n\t\t\t\t&& jQuery(event.currentTarget).attr(\"href\").includes(\"add-to-cart\")\n\t\t\t) {\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(event.currentTarget).data(\"product_id\");\n\t\t\t\t}\n\n\t\t\t\tpmw.addProductToCart(productId, 1);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is simple product\n\t\t\tif (pmwDataLayer.shop.product_type === \"simple\") {\n\n\t\t\t\tif (quantity === null) {\n\t\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t\t}\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(event.currentTarget).val();\n\t\t\t\t}\n\n\t\t\t\t// Fallback if the body selector is used\n\t\t\t\tif (!productId) {\n\t\t\t\t\t// get the product ID from the element that has the class .product\n\t\t\t\t\t// that element will also have an ID that start with product- and ends with the product ID\n\t\t\t\t\t// example: product-123\n\t\t\t\t\t// save the product ID in the variable productId\n\t\t\t\t\tproductId = jQuery(\".product\").attr(\"id\").replace(\"product-\", \"\");\n\t\t\t\t}\n\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is variable product or variable-subscription\n\t\t\tif ([\"variable\", \"variable-subscription\"].indexOf(pmwDataLayer.shop.product_type) >= 0) {\n\n\t\t\t\tif (quantity === null) {\n\t\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t\t}\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(\"[name='variation_id']\").val();\n\t\t\t\t}\n\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is grouped product\n\t\t\tif (pmwDataLayer.shop.product_type === \"grouped\") {\n\n\t\t\t\tjQuery(\".woocommerce-grouped-product-list-item\").each((index, element) => {\n\n\t\t\t\t\t// Can't rely on  event.target.dataset as it always is sent with the parent product ID and the quantity 1\n\n\t\t\t\t\tquantity = Number(jQuery(element).find(\".input-text.qty\").val()) ? Number(jQuery(element).find(\".input-text.qty\").val()) : 1;\n\n\t\t\t\t\tlet classes = jQuery(element).attr(\"class\");\n\t\t\t\t\tproductId   = pmw.getPostIdFromString(classes);\n\n\t\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If is bundle product\n\t\t\tif (pmwDataLayer.shop.product_type === \"bundle\") {\n\n\t\t\t\tif (quantity === null) {\n\t\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t\t}\n\n\t\t\t\tif (!productId) {\n\t\t\t\t\tproductId = jQuery(\"input[name=add-to-cart]\").val();\n\t\t\t\t}\n\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// everything else\n\t\t\tif (quantity === null) {\n\t\t\t\tquantity = Number(jQuery(\".input-text.qty\").val()) ? Number(jQuery(\".input-text.qty\").val()) : 1;\n\t\t\t}\n\n\t\t\tpmw.addProductToCart(productId, quantity);\n\n\t\t} else {\n\n\t\t\tif (quantity === null) {\n\t\t\t\tquantity = 1;\n\t\t\t}\n\n\t\t\tif (!productId) {\n\t\t\t\t// console.log(\"add to cart event.currentTarget\", event.currentTarget)\n\t\t\t\tproductId = jQuery(event.currentTarget).data(\"product_id\") ? jQuery(event.currentTarget).data(\"product_id\") : null;\n\t\t\t}\n\n\t\t\t// Another fallback to retrieve the product ID in case the ID is saved in the value attribute\n\t\t\tif (!productId) {\n\t\t\t\tproductId = jQuery(event.currentTarget).val() ? jQuery(event.currentTarget).val() : null;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tproductId\n\t\t\t\t&& quantity\n\t\t\t) {\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t}\n\t\t}\n\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n/**\n * If someone clicks anywhere on a custom /?add-to-cart=123 link\n * trigger the add to cart event\n */\n\n// jQuery(document).one(\"click\", \"a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)\", (event) => {\njQuery(\"a:not(.add_to_cart_button, .ajax_add_to_cart, .single_add_to_cart_button)\").one(\"click\", (event) => {\n\n\ttry {\n\t\tif (jQuery(event.target).closest(\"a\").attr(\"href\")) {\n\n\t\t\tlet url = new URL(jQuery(event.currentTarget).attr(\"href\"), window.location.origin);\n\n\t\t\tif (url.searchParams.has(\"add-to-cart\")) {\n\n\t\t\t\tlet productId = url.searchParams.get(\"add-to-cart\");\n\t\t\t\tlet quantity  = url.searchParams.has(\"quantity\") ? parseInt(url.searchParams.get(\"quantity\"), 10) : 1;\n\t\t\t\tpmw.addProductToCart(productId, quantity);\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n// select item event\n// jQuery(document).on(\"click\", \".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product\", (event) => {\njQuery(\".woocommerce-LoopProduct-link, .wc-block-grid__product, .product, .product-small, .type-product\").on(\"click\", (event) => {\n\n\ttry {\n\n\t\t/**\n\t\t * On some pages the event fires multiple times, and on product pages\n\t\t * even on page load. Using e.stopPropagation helps to prevent this,\n\t\t * but I don't know why. We don't even have to use this, since only a real\n\t\t * product click yields a valid productId. So we filter the invalid click\n\t\t * events out later down in the code. I'll keep it that way because this is\n\t\t * the most compatible way across shops.\n\t\t *\n\t\t * e.stopPropagation();\n\t\t * */\n\n\t\tlet productId = jQuery(event.currentTarget).nextAll(\".pmwProductId:first\").data(\"id\");\n\n\t\t/**\n\t\t * On product pages, for some reason, the click event is triggered on the main product on page load.\n\t\t * In that case no ID is found. But we can discard it, since we only want to trigger the event on\n\t\t * related products, which are found below.\n\t\t */\n\n\t\tif (productId) {\n\n\t\t\tproductId = pmw.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tif (pmwDataLayer.products && pmwDataLayer.products[productId]) {\n\n\t\t\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId);\n\n\t\t\t\tjQuery(document).trigger(\"pmw:select-item\", product);\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n// checkout_progress event\n// track checkout option event: entered valid billing email\n// jQuery(document).on(\"input\", \"#billing_email\", (event) => {\njQuery(\"#billing_email\").on(\"input\", (event) => {\n\n\tif (pmw.isEmail(jQuery(event.currentTarget).val())) {\n\t\t// pmw.fireCheckoutOption(2);\n\t\tpmw.fireCheckoutProgress(2);\n\t\tpmw.emailSelected = true;\n\t}\n});\n\n\n/**\n * Place order button\n *\n * Track checkout option event: purchase click\n * https://stackoverflow.com/a/34112407/4688612\n * jQuery(document).one(\"click\", \"#place_order\", () => {\n *\n * Has to be hooked after document ready !\n */\njQuery(\"form.checkout\").on(\"checkout_place_order_success\", () => {\n\n\t// console log current time\n\t// console.log(\"checkout_place_order_success event fired at: \" + new Date().getTime())\n\n\tif (false === pmw.emailSelected) {\n\t\tpmw.fireCheckoutProgress(2);\n\t}\n\n\tif (false === pmw.paymentMethodSelected) {\n\t\tpmw.fireCheckoutProgress(3);\n\t\tpmw.fireCheckoutOption(3, jQuery(\"input[name='payment_method']:checked\").val());\n\t}\n\n\tpmw.fireCheckoutProgress(4);\n\n\tjQuery(document).trigger(\"pmw:place-order\", {});\n});\n\n/**\n * Update cart event\n *\n * Has to be hooked after document ready !\n */\njQuery(document).on(\"click\", \"[name='update_cart']\", () => {\n\n\ttry {\n\t\tjQuery(\".cart_item\").each((index, element) => {\n\n\t\t\tconst productId = pmw.getProductIdByCartItemElement(element);\n\n\t\t\tif (!productId) {\n\t\t\t\tconsole.error(\"Pixel Manager: Wasn't able to retrieve a productId\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst quantity = pmw.getProductQuantityByCartItemElement(element);\n\n\t\t\tif (!quantity) {\n\t\t\t\tconsole.error(\"Pixel Manager: Wasn't able to retrieve a quantity\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// console.log(\"productId\", productId)\n\t\t\t// console.log(\"quantity\", quantity)\n\n\t\t\tif (quantity === 0) {\n\t\t\t\tpmw.removeProductFromCart(productId);\n\t\t\t} else if (quantity < pmwDataLayer.cart[productId].quantity) {\n\t\t\t\tpmw.removeProductFromCart(productId, pmwDataLayer.cart[productId].quantity - quantity);\n\t\t\t} else if (quantity > pmwDataLayer.cart[productId].quantity) {\n\t\t\t\tpmw.addProductToCart(productId, quantity - pmwDataLayer.cart[productId].quantity);\n\t\t\t}\n\t\t});\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tpmw.getCartItemsFromBackend();\n\t}\n});\n\n// Supports the following plugins:\n// WooCommerce Wishlist: https://woo.com/products/woocommerce-wishlists/\n// YITH WooCommerce Wishlist: https://wordpress.org/plugins/yith-woocommerce-wishlist/\n// add_to_wishlist\njQuery(\".add_to_wishlist,.wl-add-to\").on(\"click\", event => {\n\n\ttry {\n\n\t\tlet productId;\n\n\t\tif (jQuery(event.currentTarget).data(\"productid\")) { // for the WooCommerce wishlist plugin\n\n\t\t\tproductId = jQuery(event.currentTarget).data(\"productid\");\n\t\t} else if (jQuery(event.currentTarget).data(\"product-id\")) {  // for the YITH wishlist plugin\n\n\t\t\tproductId = jQuery(event.currentTarget).data(\"product-id\");\n\t\t}\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId);\n\n\n\t\tjQuery(document).trigger(\"pmw:add-to-wishlist\", product);\n\t} catch (e) {\n\t\tconsole.error(e);\n\t}\n});\n\n\n/**\n * Called when the user selects all the required dropdowns / attributes\n *\n * Replaced by code in the event_listeners.js file in case of lazy loading\n *\n * Has to be hooked after document ready !\n *\n * https://stackoverflow.com/a/27849208/4688612\n * https://stackoverflow.com/a/65065335/4688612\n *\n */\n\nif (!pmwDataLayer?.general?.lazy_load_pmw) {\n\tpmw.registerShowVariationEventListener();\n}\n\n\n/**\n * Called on variable products when no selection has been done yet\n * or when the visitor deselects his choice.\n *\n * Has to be hooked after document ready !\n */\n\n// jQuery(function () {\n//\n// \tjQuery(\".single_variation_wrap\").on(\"hide_variation\", function () {\n//\n// \t\ttry {\n// \t\t\tlet classes   = jQuery(\"body\").attr(\"class\")\n// \t\t\tlet productId = classes.match(/(postid-)(\\d+)/)[2]\n//\n// \t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\")\n//\n// \t\t\t/**\n// \t\t\t * If we have a variable product with no preset,\n// \t\t\t * and variations output is enabled,\n// \t\t\t * then we send a viewItem event with the first\n// \t\t\t * variation we find for the parent.\n// \t\t\t * If variations output is disabled,\n// \t\t\t * we just send the parent ID.\n// \t\t\t *\n// \t\t\t * And if Facebook microdata is active, use the\n// \t\t\t * microdata product ID.\n// \t\t\t */\n//\n// \t\t\tif (\n// \t\t\t\t\"variable\" === pmwDataLayer.shop.product_type &&\n// \t\t\t\tpmwDataLayer?.shop?.variations_output\n// \t\t\t) {\n// \t\t\t\tfor (const [key, product] of Object.entries(pmwDataLayer.products)) {\n// \t\t\t\t\tif (\"parent_id\" in product) {\n//\n// \t\t\t\t\t\tproductId = product.id\n// \t\t\t\t\t\tbreak\n// \t\t\t\t\t}\n// \t\t\t\t}\n//\n// \t\t\t\tif (pmwDataLayer?.pixels?.facebook?.microdata_product_id) {\n// \t\t\t\t\tproductId = pmwDataLayer.pixels.facebook.microdata_product_id\n// \t\t\t\t}\n// \t\t\t}\n//\n// \t\t\t// console.log(\"hmm\")\n// \t\t\tpmw.triggerViewItemEventPrep(productId)\n//\n// \t\t} catch (e) {\n// \t\t\tconsole.error(e)\n// \t\t}\n// \t})\n// })\n\n// jQuery(function () {\n//\n// \tjQuery(\".single_variation_wrap\").on(\"hide_variation\", function () {\n// \t\tjQuery(document).trigger(\"pmw:view-item\")\n// \t})\n// })\n","(function (pmw, $, undefined) {\n\n\tconst PMW_LIBRARY_VERSION = \"1.57.0\"\n\n\tpmw.getLibraryVersion = () => {\n\t\treturn PMW_LIBRARY_VERSION\n\t}\n\n\tpmw.checkLibraryVersion = () => {\n\n\t\tif (pmw.getLibraryVersion() !== pmwDataLayer?.version?.number) {\n\t\t\tconsole.error(`Pixel Manager: The library version ${pmw.getLibraryVersion()} and pmwDataLayer.version.number ${pmwDataLayer.version.number} do not match. Delete the server-side cache and try again.`)\n\t\t}\n\t}\n\n}(window.pmw = window.pmw || {}, jQuery))\n\n","/**\n * Pixel Registry\n *\n * Central registry for managing pixel configurations and adapters.\n * Provides methods to query which pixels are active and retrieve their adapters.\n *\n * Firing Modes:\n * - browser_only: Fire only in browser (Microsoft Ads, Taboola)\n * - server_only: Fire only server-side, suppress browser pixel (admin choice)\n * - both: Fire both browser and server with event_id for deduplication (Facebook, TikTok)\n * - browser_or_server: Fire one or the other, never both (GA4 purchase)\n *\n * @since 1.51.0\n */\n\n(function (pmw, $, undefined) {\n\n\t/**\n\t * Valid firing modes\n\t * @type {string[]}\n\t */\n\tconst VALID_FIRING_MODES = [\"browser_only\", \"server_only\", \"both\", \"browser_or_server\"];\n\n\t/**\n\t * Default firing mode for pixels that don't specify one\n\t * @type {string}\n\t */\n\tconst DEFAULT_FIRING_MODE = \"browser_only\";\n\n\t/**\n\t * Pixel Registry namespace\n\t */\n\tpmw.pixelRegistry = {\n\n\t\t/**\n\t\t * Get all active pixels (both browser-only and S2S-capable)\n\t\t *\n\t\t * Queries each registered adapter's isActive function to determine\n\t\t * if the pixel should be loaded based on pmwDataLayer configuration.\n\t\t *\n\t\t * @returns {string[]} Array of active pixel names\n\t\t */\n\t\tgetActivePixels() {\n\t\t\tconst activePixels = [];\n\n\t\t\tif (!pmw.pixelCapabilities) {\n\t\t\t\treturn activePixels;\n\t\t\t}\n\n\t\t\t// Check each registered pixel's isActive function\n\t\t\tfor (const [pixelName, capabilities] of Object.entries(pmw.pixelCapabilities)) {\n\t\t\t\tif (typeof capabilities.isActive === \"function\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (capabilities.isActive()) {\n\t\t\t\t\t\t\tactivePixels.push(pixelName);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tpmw.console.error(`Error checking if ${pixelName} is active:`, e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn activePixels;\n\t\t},\n\n\t\t/**\n\t\t * Get browser-only pixels (pixels that don't support S2S)\n\t\t *\n\t\t * @returns {string[]} Array of browser-only pixel names\n\t\t */\n\t\tgetActiveBrowserOnlyPixels() {\n\t\t\tconst browserPixels = [];\n\t\t\tconst activePixels  = this.getActivePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\t// If pixel doesn't support S2S, it's browser-only\n\t\t\t\tif (pmw.pixelCapabilities?.[pixelName]?.supportsS2S !== true) {\n\t\t\t\t\tbrowserPixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn browserPixels;\n\t\t},\n\n\t\t/**\n\t\t * Get S2S-capable pixels\n\t\t *\n\t\t * Returns pixels that declared supportsS2S capability when registering.\n\t\t * These pixels ALWAYS receive the pmw:s2s:* events to fire their browser pixels (fbq, ttq, etc.),\n\t\t * regardless of whether S2S is actually enabled. They handle their own S2S logic internally.\n\t\t *\n\t\t * @returns {string[]} Array of S2S pixel names\n\t\t */\n\t\tgetActiveS2SPixels() {\n\t\t\tconst s2sPixels    = [];\n\t\t\tconst activePixels = this.getActivePixels();\n\n\t\t\t// Check each active pixel's capabilities\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\t// Check if this pixel declared supportsS2S capability when registering\n\t\t\t\tif (pmw.pixelCapabilities?.[pixelName]?.supportsS2S === true) {\n\t\t\t\t\ts2sPixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn s2sPixels;\n\t\t},\n\n\t\t/**\n\t\t * Get S2S-configured pixels that are not active (browser pixel not loaded)\n\t\t *\n\t\t * Returns pixels where:\n\t\t * - supportsS2S === true\n\t\t * - isConfigured() returns true (pixel has valid config in the data layer)\n\t\t * - isActive() returns false (browser pixel hasn't loaded, e.g. due to consent manager)\n\t\t *\n\t\t * Only returns results when the \"Always Send Server-Side Events\" setting is enabled.\n\t\t *\n\t\t * @returns {string[]} Array of configured-but-not-loaded S2S pixel names\n\t\t * @since 1.57.0\n\t\t */\n\t\tgetS2SConfiguredPixels() {\n\t\t\tconst configuredPixels = [];\n\n\t\t\tif (!pmw.pixelCapabilities) {\n\t\t\t\treturn configuredPixels;\n\t\t\t}\n\n\t\t\t// Only return results when always_send_s2s is enabled\n\t\t\tif (pmwDataLayer?.general?.server_2_server?.always_send_s2s !== true) {\n\t\t\t\treturn configuredPixels;\n\t\t\t}\n\n\t\t\tfor (const [pixelName, capabilities] of Object.entries(pmw.pixelCapabilities)) {\n\t\t\t\t// Skip pixels that don't support S2S\n\t\t\t\tif (capabilities.supportsS2S !== true) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Skip pixels that are already active (loaded normally with consent)\n\t\t\t\tif (typeof capabilities.isActive === \"function\" && capabilities.isActive()) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Check if pixel has valid configuration (but browser pixel hasn't loaded)\n\t\t\t\tif (typeof capabilities.isConfigured === \"function\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (capabilities.isConfigured()) {\n\t\t\t\t\t\t\tconfiguredPixels.push(pixelName);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tpmw.console.error(`Error checking if ${pixelName} is configured:`, e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn configuredPixels;\n\t\t},\n\n\t\t/**\n\t\t * Get all processable pixels: active pixels + S2S-configured-but-not-loaded pixels\n\t\t *\n\t\t * This is the union of getActivePixels() and getS2SConfiguredPixels().\n\t\t * Used by the event processor to ensure S2S-configured pixels get their\n\t\t * adapters called even when browser consent has blocked the pixel from loading.\n\t\t *\n\t\t * @returns {string[]} Deduplicated array of processable pixel names\n\t\t * @since 1.57.0\n\t\t */\n\t\tgetProcessablePixels() {\n\t\t\tconst activePixels     = this.getActivePixels();\n\t\t\tconst configuredPixels = this.getS2SConfiguredPixels();\n\n\t\t\t// Deduplicate (configuredPixels shouldn't overlap with activePixels, but be safe)\n\t\t\tconst allPixels = new Set([...activePixels, ...configuredPixels]);\n\t\t\treturn Array.from(allPixels);\n\t\t},\n\n\t\t/**\n\t\t * Get adapter for a specific pixel\n\t\t *\n\t\t * @param {string} pixelName - The pixel name (e.g., 'facebook', 'google_ads')\n\t\t * @returns {object|null} The adapter object or null if not found\n\t\t */\n\t\tgetAdapter(pixelName) {\n\t\t\tif (!pmw.adapters) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn pmw.adapters[pixelName] || null;\n\t\t},\n\n\t\t/**\n\t\t * Get active pixels with a specific capability\n\t\t *\n\t\t * Returns pixels that have the specified capability flag set to true.\n\t\t * This is a generic method that allows querying any capability\n\t\t * without needing dedicated methods for each one.\n\t\t *\n\t\t * @param {string} capabilityName - The capability to check (e.g., 'supportsS2S', 'supportsPageViewS2S')\n\t\t * @returns {string[]} Array of pixel names with the specified capability\n\t\t *\n\t\t * @example\n\t\t * // Get all pixels that support page view S2S\n\t\t * pmw.pixelRegistry.getPixelsWithCapability('supportsPageViewS2S')\n\t\t * // Returns: ['facebook', 'snapchat', 'reddit']\n\t\t */\n\t\tgetPixelsWithCapability(capabilityName) {\n\t\t\tconst pixelsWithCapability = [];\n\t\t\tconst activePixels         = this.getActivePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\tif (pmw.pixelCapabilities?.[pixelName]?.[capabilityName] === true) {\n\t\t\t\t\tpixelsWithCapability.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn pixelsWithCapability;\n\t\t},\n\n\t\t/**\n\t\t * Get the firing mode for a specific pixel\n\t\t *\n\t\t * Returns the registered firing mode for the pixel. The mode determines\n\t\t * whether events fire in browser, server, or both.\n\t\t *\n\t\t * @param {string} pixelName - The pixel name\n\t\t * @returns {string} The firing mode (browser_only, server_only, both, browser_or_server)\n\t\t */\n\t\tgetFiringMode(pixelName) {\n\t\t\tconst mode = pmw.pixelCapabilities?.[pixelName]?.mode;\n\n\t\t\t// Validate mode is one of the allowed values\n\t\t\tif (mode && VALID_FIRING_MODES.includes(mode)) {\n\t\t\t\treturn mode;\n\t\t\t}\n\n\t\t\t// Legacy support: if supportsS2S is true but no mode specified, default to 'both'\n\t\t\tif (pmw.pixelCapabilities?.[pixelName]?.supportsS2S === true) {\n\t\t\t\treturn \"both\";\n\t\t\t}\n\n\t\t\treturn DEFAULT_FIRING_MODE;\n\t\t},\n\n\t\t/**\n\t\t * Determine whether browser and/or server should fire for a pixel/event combination\n\t\t *\n\t\t * This is the core method for the unified firing mode system. It considers:\n\t\t * - The pixel's registered firing mode\n\t\t * - Whether S2S is globally enabled\n\t\t * - Any filters that modify firing behavior\n\t\t *\n\t\t * @param {string} pixelName - The pixel name\n\t\t * @param {string} eventName - The event name (e.g., 'add_to_cart', 'purchase')\n\t\t * @returns {object} { fire_browser: boolean, fire_server: boolean }\n\t\t */\n\t\tgetFiringDecision(pixelName, eventName) {\n\t\t\tconst mode        = this.getFiringMode(pixelName);\n\t\t\tconst s2sEnabled  = pmwDataLayer?.general?.server_2_server?.active === true;\n\t\t\tconst supportsS2S = pmw.pixelCapabilities?.[pixelName]?.supportsS2S === true;\n\n\t\t\t// Check if this pixel is S2S-configured but not active (browser pixel not loaded)\n\t\t\tconst isActive       = typeof pmw.pixelCapabilities?.[pixelName]?.isActive === \"function\" && pmw.pixelCapabilities[pixelName].isActive();\n\t\t\tconst alwaysSendS2S  = pmwDataLayer?.general?.server_2_server?.always_send_s2s === true;\n\t\t\tconst isS2SOnlyPixel = !isActive && alwaysSendS2S && supportsS2S && s2sEnabled;\n\n\t\t\tlet decision = {\n\t\t\t\tfire_browser: true,\n\t\t\t\tfire_server : false,\n\t\t\t};\n\n\t\t\t// If the pixel is not active (browser pixel not loaded) but always_send_s2s is enabled,\n\t\t\t// force server-only firing regardless of the declared mode\n\t\t\tif (isS2SOnlyPixel) {\n\t\t\t\tdecision = {fire_browser: false, fire_server: true};\n\t\t\t} else {\n\t\t\t\tswitch (mode) {\n\t\t\t\t\tcase \"browser_only\":\n\t\t\t\t\t\tdecision = {fire_browser: true, fire_server: false};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"server_only\":\n\t\t\t\t\t\t// Server only fires if S2S is enabled AND pixel supports it\n\t\t\t\t\t\tdecision = {\n\t\t\t\t\t\t\tfire_browser: false,\n\t\t\t\t\t\t\tfire_server : s2sEnabled && supportsS2S,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"both\":\n\t\t\t\t\t\t// Browser always fires, server fires if enabled\n\t\t\t\t\t\tdecision = {\n\t\t\t\t\t\t\tfire_browser: true,\n\t\t\t\t\t\t\tfire_server : s2sEnabled && supportsS2S,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"browser_or_server\":\n\t\t\t\t\t\t// If S2S enabled and supported, use server; otherwise browser\n\t\t\t\t\t\tif (s2sEnabled && supportsS2S) {\n\t\t\t\t\t\t\tdecision = {fire_browser: false, fire_server: true};\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdecision = {fire_browser: true, fire_server: false};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply filter to allow external modification of firing behavior\n\t\t\t// Use case: Force server-only for specific pixels, disable certain pixels per-event\n\t\t\tdecision = pmw.hooks.applyFilters(\n\t\t\t\t\"pmw_pixel_firing_decision\",\n\t\t\t\tdecision,\n\t\t\t\tpixelName,\n\t\t\t\teventName,\n\t\t\t\tmode,\n\t\t\t);\n\n\t\t\treturn decision;\n\t\t},\n\n\t\t/**\n\t\t * Get all pixels that should fire in browser for a specific event\n\t\t *\n\t\t * @param {string} eventName - The event name\n\t\t * @returns {string[]} Array of pixel names that should fire in browser\n\t\t */\n\t\tgetPixelsForBrowserFiring(eventName) {\n\t\t\tconst pixels       = [];\n\t\t\tconst activePixels = this.getProcessablePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\tconst decision = this.getFiringDecision(pixelName, eventName);\n\t\t\t\tif (decision.fire_browser) {\n\t\t\t\t\tpixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn pixels;\n\t\t},\n\n\t\t/**\n\t\t * Get all pixels that should fire server-side for a specific event\n\t\t *\n\t\t * @param {string} eventName - The event name\n\t\t * @returns {string[]} Array of pixel names that should fire server-side\n\t\t */\n\t\tgetPixelsForServerFiring(eventName) {\n\t\t\tconst pixels       = [];\n\t\t\tconst activePixels = this.getProcessablePixels();\n\n\t\t\tfor (const pixelName of activePixels) {\n\t\t\t\tconst decision = this.getFiringDecision(pixelName, eventName);\n\t\t\t\tif (decision.fire_server) {\n\t\t\t\t\tpixels.push(pixelName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn pixels;\n\t\t},\n\t};\n\n}(window.pmw = window.pmw || {}, jQuery));",null,null,"(function() {\n  var expandIPv6, ipaddr, ipv4Part, ipv4Regexes, ipv6Part, ipv6Regexes, matchCIDR, root, zoneIndex;\n\n  ipaddr = {};\n\n  root = this;\n\n  if ((typeof module !== \"undefined\" && module !== null) && module.exports) {\n    module.exports = ipaddr;\n  } else {\n    root['ipaddr'] = ipaddr;\n  }\n\n  matchCIDR = function(first, second, partSize, cidrBits) {\n    var part, shift;\n    if (first.length !== second.length) {\n      throw new Error(\"ipaddr: cannot match CIDR for objects with different lengths\");\n    }\n    part = 0;\n    while (cidrBits > 0) {\n      shift = partSize - cidrBits;\n      if (shift < 0) {\n        shift = 0;\n      }\n      if (first[part] >> shift !== second[part] >> shift) {\n        return false;\n      }\n      cidrBits -= partSize;\n      part += 1;\n    }\n    return true;\n  };\n\n  ipaddr.subnetMatch = function(address, rangeList, defaultName) {\n    var k, len, rangeName, rangeSubnets, subnet;\n    if (defaultName == null) {\n      defaultName = 'unicast';\n    }\n    for (rangeName in rangeList) {\n      rangeSubnets = rangeList[rangeName];\n      if (rangeSubnets[0] && !(rangeSubnets[0] instanceof Array)) {\n        rangeSubnets = [rangeSubnets];\n      }\n      for (k = 0, len = rangeSubnets.length; k < len; k++) {\n        subnet = rangeSubnets[k];\n        if (address.kind() === subnet[0].kind()) {\n          if (address.match.apply(address, subnet)) {\n            return rangeName;\n          }\n        }\n      }\n    }\n    return defaultName;\n  };\n\n  ipaddr.IPv4 = (function() {\n    function IPv4(octets) {\n      var k, len, octet;\n      if (octets.length !== 4) {\n        throw new Error(\"ipaddr: ipv4 octet count should be 4\");\n      }\n      for (k = 0, len = octets.length; k < len; k++) {\n        octet = octets[k];\n        if (!((0 <= octet && octet <= 255))) {\n          throw new Error(\"ipaddr: ipv4 octet should fit in 8 bits\");\n        }\n      }\n      this.octets = octets;\n    }\n\n    IPv4.prototype.kind = function() {\n      return 'ipv4';\n    };\n\n    IPv4.prototype.toString = function() {\n      return this.octets.join(\".\");\n    };\n\n    IPv4.prototype.toNormalizedString = function() {\n      return this.toString();\n    };\n\n    IPv4.prototype.toByteArray = function() {\n      return this.octets.slice(0);\n    };\n\n    IPv4.prototype.match = function(other, cidrRange) {\n      var ref;\n      if (cidrRange === void 0) {\n        ref = other, other = ref[0], cidrRange = ref[1];\n      }\n      if (other.kind() !== 'ipv4') {\n        throw new Error(\"ipaddr: cannot match ipv4 address with non-ipv4 one\");\n      }\n      return matchCIDR(this.octets, other.octets, 8, cidrRange);\n    };\n\n    IPv4.prototype.SpecialRanges = {\n      unspecified: [[new IPv4([0, 0, 0, 0]), 8]],\n      broadcast: [[new IPv4([255, 255, 255, 255]), 32]],\n      multicast: [[new IPv4([224, 0, 0, 0]), 4]],\n      linkLocal: [[new IPv4([169, 254, 0, 0]), 16]],\n      loopback: [[new IPv4([127, 0, 0, 0]), 8]],\n      carrierGradeNat: [[new IPv4([100, 64, 0, 0]), 10]],\n      \"private\": [[new IPv4([10, 0, 0, 0]), 8], [new IPv4([172, 16, 0, 0]), 12], [new IPv4([192, 168, 0, 0]), 16]],\n      reserved: [[new IPv4([192, 0, 0, 0]), 24], [new IPv4([192, 0, 2, 0]), 24], [new IPv4([192, 88, 99, 0]), 24], [new IPv4([198, 51, 100, 0]), 24], [new IPv4([203, 0, 113, 0]), 24], [new IPv4([240, 0, 0, 0]), 4]]\n    };\n\n    IPv4.prototype.range = function() {\n      return ipaddr.subnetMatch(this, this.SpecialRanges);\n    };\n\n    IPv4.prototype.toIPv4MappedAddress = function() {\n      return ipaddr.IPv6.parse(\"::ffff:\" + (this.toString()));\n    };\n\n    IPv4.prototype.prefixLengthFromSubnetMask = function() {\n      var cidr, i, k, octet, stop, zeros, zerotable;\n      zerotable = {\n        0: 8,\n        128: 7,\n        192: 6,\n        224: 5,\n        240: 4,\n        248: 3,\n        252: 2,\n        254: 1,\n        255: 0\n      };\n      cidr = 0;\n      stop = false;\n      for (i = k = 3; k >= 0; i = k += -1) {\n        octet = this.octets[i];\n        if (octet in zerotable) {\n          zeros = zerotable[octet];\n          if (stop && zeros !== 0) {\n            return null;\n          }\n          if (zeros !== 8) {\n            stop = true;\n          }\n          cidr += zeros;\n        } else {\n          return null;\n        }\n      }\n      return 32 - cidr;\n    };\n\n    return IPv4;\n\n  })();\n\n  ipv4Part = \"(0?\\\\d+|0x[a-f0-9]+)\";\n\n  ipv4Regexes = {\n    fourOctet: new RegExp(\"^\" + ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part + \"$\", 'i'),\n    longValue: new RegExp(\"^\" + ipv4Part + \"$\", 'i')\n  };\n\n  ipaddr.IPv4.parser = function(string) {\n    var match, parseIntAuto, part, shift, value;\n    parseIntAuto = function(string) {\n      if (string[0] === \"0\" && string[1] !== \"x\") {\n        return parseInt(string, 8);\n      } else {\n        return parseInt(string);\n      }\n    };\n    if (match = string.match(ipv4Regexes.fourOctet)) {\n      return (function() {\n        var k, len, ref, results;\n        ref = match.slice(1, 6);\n        results = [];\n        for (k = 0, len = ref.length; k < len; k++) {\n          part = ref[k];\n          results.push(parseIntAuto(part));\n        }\n        return results;\n      })();\n    } else if (match = string.match(ipv4Regexes.longValue)) {\n      value = parseIntAuto(match[1]);\n      if (value > 0xffffffff || value < 0) {\n        throw new Error(\"ipaddr: address outside defined range\");\n      }\n      return ((function() {\n        var k, results;\n        results = [];\n        for (shift = k = 0; k <= 24; shift = k += 8) {\n          results.push((value >> shift) & 0xff);\n        }\n        return results;\n      })()).reverse();\n    } else {\n      return null;\n    }\n  };\n\n  ipaddr.IPv6 = (function() {\n    function IPv6(parts, zoneId) {\n      var i, k, l, len, part, ref;\n      if (parts.length === 16) {\n        this.parts = [];\n        for (i = k = 0; k <= 14; i = k += 2) {\n          this.parts.push((parts[i] << 8) | parts[i + 1]);\n        }\n      } else if (parts.length === 8) {\n        this.parts = parts;\n      } else {\n        throw new Error(\"ipaddr: ipv6 part count should be 8 or 16\");\n      }\n      ref = this.parts;\n      for (l = 0, len = ref.length; l < len; l++) {\n        part = ref[l];\n        if (!((0 <= part && part <= 0xffff))) {\n          throw new Error(\"ipaddr: ipv6 part should fit in 16 bits\");\n        }\n      }\n      if (zoneId) {\n        this.zoneId = zoneId;\n      }\n    }\n\n    IPv6.prototype.kind = function() {\n      return 'ipv6';\n    };\n\n    IPv6.prototype.toString = function() {\n      return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/, '::');\n    };\n\n    IPv6.prototype.toRFC5952String = function() {\n      var bestMatchIndex, bestMatchLength, match, regex, string;\n      regex = /((^|:)(0(:|$)){2,})/g;\n      string = this.toNormalizedString();\n      bestMatchIndex = 0;\n      bestMatchLength = -1;\n      while ((match = regex.exec(string))) {\n        if (match[0].length > bestMatchLength) {\n          bestMatchIndex = match.index;\n          bestMatchLength = match[0].length;\n        }\n      }\n      if (bestMatchLength < 0) {\n        return string;\n      }\n      return string.substring(0, bestMatchIndex) + '::' + string.substring(bestMatchIndex + bestMatchLength);\n    };\n\n    IPv6.prototype.toByteArray = function() {\n      var bytes, k, len, part, ref;\n      bytes = [];\n      ref = this.parts;\n      for (k = 0, len = ref.length; k < len; k++) {\n        part = ref[k];\n        bytes.push(part >> 8);\n        bytes.push(part & 0xff);\n      }\n      return bytes;\n    };\n\n    IPv6.prototype.toNormalizedString = function() {\n      var addr, part, suffix;\n      addr = ((function() {\n        var k, len, ref, results;\n        ref = this.parts;\n        results = [];\n        for (k = 0, len = ref.length; k < len; k++) {\n          part = ref[k];\n          results.push(part.toString(16));\n        }\n        return results;\n      }).call(this)).join(\":\");\n      suffix = '';\n      if (this.zoneId) {\n        suffix = '%' + this.zoneId;\n      }\n      return addr + suffix;\n    };\n\n    IPv6.prototype.toFixedLengthString = function() {\n      var addr, part, suffix;\n      addr = ((function() {\n        var k, len, ref, results;\n        ref = this.parts;\n        results = [];\n        for (k = 0, len = ref.length; k < len; k++) {\n          part = ref[k];\n          results.push(part.toString(16).padStart(4, '0'));\n        }\n        return results;\n      }).call(this)).join(\":\");\n      suffix = '';\n      if (this.zoneId) {\n        suffix = '%' + this.zoneId;\n      }\n      return addr + suffix;\n    };\n\n    IPv6.prototype.match = function(other, cidrRange) {\n      var ref;\n      if (cidrRange === void 0) {\n        ref = other, other = ref[0], cidrRange = ref[1];\n      }\n      if (other.kind() !== 'ipv6') {\n        throw new Error(\"ipaddr: cannot match ipv6 address with non-ipv6 one\");\n      }\n      return matchCIDR(this.parts, other.parts, 16, cidrRange);\n    };\n\n    IPv6.prototype.SpecialRanges = {\n      unspecified: [new IPv6([0, 0, 0, 0, 0, 0, 0, 0]), 128],\n      linkLocal: [new IPv6([0xfe80, 0, 0, 0, 0, 0, 0, 0]), 10],\n      multicast: [new IPv6([0xff00, 0, 0, 0, 0, 0, 0, 0]), 8],\n      loopback: [new IPv6([0, 0, 0, 0, 0, 0, 0, 1]), 128],\n      uniqueLocal: [new IPv6([0xfc00, 0, 0, 0, 0, 0, 0, 0]), 7],\n      ipv4Mapped: [new IPv6([0, 0, 0, 0, 0, 0xffff, 0, 0]), 96],\n      rfc6145: [new IPv6([0, 0, 0, 0, 0xffff, 0, 0, 0]), 96],\n      rfc6052: [new IPv6([0x64, 0xff9b, 0, 0, 0, 0, 0, 0]), 96],\n      '6to4': [new IPv6([0x2002, 0, 0, 0, 0, 0, 0, 0]), 16],\n      teredo: [new IPv6([0x2001, 0, 0, 0, 0, 0, 0, 0]), 32],\n      reserved: [[new IPv6([0x2001, 0xdb8, 0, 0, 0, 0, 0, 0]), 32]]\n    };\n\n    IPv6.prototype.range = function() {\n      return ipaddr.subnetMatch(this, this.SpecialRanges);\n    };\n\n    IPv6.prototype.isIPv4MappedAddress = function() {\n      return this.range() === 'ipv4Mapped';\n    };\n\n    IPv6.prototype.toIPv4Address = function() {\n      var high, low, ref;\n      if (!this.isIPv4MappedAddress()) {\n        throw new Error(\"ipaddr: trying to convert a generic ipv6 address to ipv4\");\n      }\n      ref = this.parts.slice(-2), high = ref[0], low = ref[1];\n      return new ipaddr.IPv4([high >> 8, high & 0xff, low >> 8, low & 0xff]);\n    };\n\n    IPv6.prototype.prefixLengthFromSubnetMask = function() {\n      var cidr, i, k, part, stop, zeros, zerotable;\n      zerotable = {\n        0: 16,\n        32768: 15,\n        49152: 14,\n        57344: 13,\n        61440: 12,\n        63488: 11,\n        64512: 10,\n        65024: 9,\n        65280: 8,\n        65408: 7,\n        65472: 6,\n        65504: 5,\n        65520: 4,\n        65528: 3,\n        65532: 2,\n        65534: 1,\n        65535: 0\n      };\n      cidr = 0;\n      stop = false;\n      for (i = k = 7; k >= 0; i = k += -1) {\n        part = this.parts[i];\n        if (part in zerotable) {\n          zeros = zerotable[part];\n          if (stop && zeros !== 0) {\n            return null;\n          }\n          if (zeros !== 16) {\n            stop = true;\n          }\n          cidr += zeros;\n        } else {\n          return null;\n        }\n      }\n      return 128 - cidr;\n    };\n\n    return IPv6;\n\n  })();\n\n  ipv6Part = \"(?:[0-9a-f]+::?)+\";\n\n  zoneIndex = \"%[0-9a-z]{1,}\";\n\n  ipv6Regexes = {\n    zoneIndex: new RegExp(zoneIndex, 'i'),\n    \"native\": new RegExp(\"^(::)?(\" + ipv6Part + \")?([0-9a-f]+)?(::)?(\" + zoneIndex + \")?$\", 'i'),\n    transitional: new RegExp((\"^((?:\" + ipv6Part + \")|(?:::)(?:\" + ipv6Part + \")?)\") + (ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part + \"\\\\.\" + ipv4Part) + (\"(\" + zoneIndex + \")?$\"), 'i')\n  };\n\n  expandIPv6 = function(string, parts) {\n    var colonCount, lastColon, part, replacement, replacementCount, zoneId;\n    if (string.indexOf('::') !== string.lastIndexOf('::')) {\n      return null;\n    }\n    zoneId = (string.match(ipv6Regexes['zoneIndex']) || [])[0];\n    if (zoneId) {\n      zoneId = zoneId.substring(1);\n      string = string.replace(/%.+$/, '');\n    }\n    colonCount = 0;\n    lastColon = -1;\n    while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) {\n      colonCount++;\n    }\n    if (string.substr(0, 2) === '::') {\n      colonCount--;\n    }\n    if (string.substr(-2, 2) === '::') {\n      colonCount--;\n    }\n    if (colonCount > parts) {\n      return null;\n    }\n    replacementCount = parts - colonCount;\n    replacement = ':';\n    while (replacementCount--) {\n      replacement += '0:';\n    }\n    string = string.replace('::', replacement);\n    if (string[0] === ':') {\n      string = string.slice(1);\n    }\n    if (string[string.length - 1] === ':') {\n      string = string.slice(0, -1);\n    }\n    parts = (function() {\n      var k, len, ref, results;\n      ref = string.split(\":\");\n      results = [];\n      for (k = 0, len = ref.length; k < len; k++) {\n        part = ref[k];\n        results.push(parseInt(part, 16));\n      }\n      return results;\n    })();\n    return {\n      parts: parts,\n      zoneId: zoneId\n    };\n  };\n\n  ipaddr.IPv6.parser = function(string) {\n    var addr, k, len, match, octet, octets, zoneId;\n    if (ipv6Regexes['native'].test(string)) {\n      return expandIPv6(string, 8);\n    } else if (match = string.match(ipv6Regexes['transitional'])) {\n      zoneId = match[6] || '';\n      addr = expandIPv6(match[1].slice(0, -1) + zoneId, 6);\n      if (addr.parts) {\n        octets = [parseInt(match[2]), parseInt(match[3]), parseInt(match[4]), parseInt(match[5])];\n        for (k = 0, len = octets.length; k < len; k++) {\n          octet = octets[k];\n          if (!((0 <= octet && octet <= 255))) {\n            return null;\n          }\n        }\n        addr.parts.push(octets[0] << 8 | octets[1]);\n        addr.parts.push(octets[2] << 8 | octets[3]);\n        return {\n          parts: addr.parts,\n          zoneId: addr.zoneId\n        };\n      }\n    }\n    return null;\n  };\n\n  ipaddr.IPv4.isIPv4 = ipaddr.IPv6.isIPv6 = function(string) {\n    return this.parser(string) !== null;\n  };\n\n  ipaddr.IPv4.isValid = function(string) {\n    var e;\n    try {\n      new this(this.parser(string));\n      return true;\n    } catch (error1) {\n      e = error1;\n      return false;\n    }\n  };\n\n  ipaddr.IPv4.isValidFourPartDecimal = function(string) {\n    if (ipaddr.IPv4.isValid(string) && string.match(/^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){3}$/)) {\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  ipaddr.IPv6.isValid = function(string) {\n    var addr, e;\n    if (typeof string === \"string\" && string.indexOf(\":\") === -1) {\n      return false;\n    }\n    try {\n      addr = this.parser(string);\n      new this(addr.parts, addr.zoneId);\n      return true;\n    } catch (error1) {\n      e = error1;\n      return false;\n    }\n  };\n\n  ipaddr.IPv4.parse = function(string) {\n    var parts;\n    parts = this.parser(string);\n    if (parts === null) {\n      throw new Error(\"ipaddr: string is not formatted like ip address\");\n    }\n    return new this(parts);\n  };\n\n  ipaddr.IPv6.parse = function(string) {\n    var addr;\n    addr = this.parser(string);\n    if (addr.parts === null) {\n      throw new Error(\"ipaddr: string is not formatted like ip address\");\n    }\n    return new this(addr.parts, addr.zoneId);\n  };\n\n  ipaddr.IPv4.parseCIDR = function(string) {\n    var maskLength, match, parsed;\n    if (match = string.match(/^(.+)\\/(\\d+)$/)) {\n      maskLength = parseInt(match[2]);\n      if (maskLength >= 0 && maskLength <= 32) {\n        parsed = [this.parse(match[1]), maskLength];\n        Object.defineProperty(parsed, 'toString', {\n          value: function() {\n            return this.join('/');\n          }\n        });\n        return parsed;\n      }\n    }\n    throw new Error(\"ipaddr: string is not formatted like an IPv4 CIDR range\");\n  };\n\n  ipaddr.IPv4.subnetMaskFromPrefixLength = function(prefix) {\n    var filledOctetCount, j, octets;\n    prefix = parseInt(prefix);\n    if (prefix < 0 || prefix > 32) {\n      throw new Error('ipaddr: invalid IPv4 prefix length');\n    }\n    octets = [0, 0, 0, 0];\n    j = 0;\n    filledOctetCount = Math.floor(prefix / 8);\n    while (j < filledOctetCount) {\n      octets[j] = 255;\n      j++;\n    }\n    if (filledOctetCount < 4) {\n      octets[filledOctetCount] = Math.pow(2, prefix % 8) - 1 << 8 - (prefix % 8);\n    }\n    return new this(octets);\n  };\n\n  ipaddr.IPv4.broadcastAddressFromCIDR = function(string) {\n    var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;\n    try {\n      cidr = this.parseCIDR(string);\n      ipInterfaceOctets = cidr[0].toByteArray();\n      subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n      octets = [];\n      i = 0;\n      while (i < 4) {\n        octets.push(parseInt(ipInterfaceOctets[i], 10) | parseInt(subnetMaskOctets[i], 10) ^ 255);\n        i++;\n      }\n      return new this(octets);\n    } catch (error1) {\n      error = error1;\n      throw new Error('ipaddr: the address does not have IPv4 CIDR format');\n    }\n  };\n\n  ipaddr.IPv4.networkAddressFromCIDR = function(string) {\n    var cidr, error, i, ipInterfaceOctets, octets, subnetMaskOctets;\n    try {\n      cidr = this.parseCIDR(string);\n      ipInterfaceOctets = cidr[0].toByteArray();\n      subnetMaskOctets = this.subnetMaskFromPrefixLength(cidr[1]).toByteArray();\n      octets = [];\n      i = 0;\n      while (i < 4) {\n        octets.push(parseInt(ipInterfaceOctets[i], 10) & parseInt(subnetMaskOctets[i], 10));\n        i++;\n      }\n      return new this(octets);\n    } catch (error1) {\n      error = error1;\n      throw new Error('ipaddr: the address does not have IPv4 CIDR format');\n    }\n  };\n\n  ipaddr.IPv6.parseCIDR = function(string) {\n    var maskLength, match, parsed;\n    if (match = string.match(/^(.+)\\/(\\d+)$/)) {\n      maskLength = parseInt(match[2]);\n      if (maskLength >= 0 && maskLength <= 128) {\n        parsed = [this.parse(match[1]), maskLength];\n        Object.defineProperty(parsed, 'toString', {\n          value: function() {\n            return this.join('/');\n          }\n        });\n        return parsed;\n      }\n    }\n    throw new Error(\"ipaddr: string is not formatted like an IPv6 CIDR range\");\n  };\n\n  ipaddr.isValid = function(string) {\n    return ipaddr.IPv6.isValid(string) || ipaddr.IPv4.isValid(string);\n  };\n\n  ipaddr.parse = function(string) {\n    if (ipaddr.IPv6.isValid(string)) {\n      return ipaddr.IPv6.parse(string);\n    } else if (ipaddr.IPv4.isValid(string)) {\n      return ipaddr.IPv4.parse(string);\n    } else {\n      throw new Error(\"ipaddr: the address has neither IPv6 nor IPv4 format\");\n    }\n  };\n\n  ipaddr.parseCIDR = function(string) {\n    var e;\n    try {\n      return ipaddr.IPv6.parseCIDR(string);\n    } catch (error1) {\n      e = error1;\n      try {\n        return ipaddr.IPv4.parseCIDR(string);\n      } catch (error1) {\n        e = error1;\n        throw new Error(\"ipaddr: the address has neither IPv6 nor IPv4 CIDR format\");\n      }\n    }\n  };\n\n  ipaddr.fromByteArray = function(bytes) {\n    var length;\n    length = bytes.length;\n    if (length === 4) {\n      return new ipaddr.IPv4(bytes);\n    } else if (length === 16) {\n      return new ipaddr.IPv6(bytes);\n    } else {\n      throw new Error(\"ipaddr: the binary input is neither an IPv6 nor IPv4 address\");\n    }\n  };\n\n  ipaddr.process = function(string) {\n    var addr;\n    addr = this.parse(string);\n    if (addr.kind() === 'ipv6' && addr.isIPv4MappedAddress()) {\n      return addr.toIPv4Address();\n    } else {\n      return addr;\n    }\n  };\n\n}).call(this);\n","/**\n * Created by elgs on 3/5/16.\n */\nconst normalize = function (a) {\n   if (!_validate(a)) {\n      throw new Error('Invalid address: ' + a);\n   }\n   a = a.toLowerCase()\n\n   const nh = a.split(/\\:\\:/g);\n   if (nh.length > 2) {\n      throw new Error('Invalid address: ' + a);\n   }\n\n   let sections = [];\n   if (nh.length == 1) {\n      // full mode\n      sections = a.split(/\\:/g);\n      if (sections.length !== 8) {\n         throw new Error('Invalid address: ' + a);\n      }\n   } else if (nh.length == 2) {\n      // compact mode\n      const n = nh[0];\n      const h = nh[1];\n      const ns = n.split(/\\:/g);\n      const hs = h.split(/\\:/g);\n      for (let i in ns) {\n         sections[i] = ns[i];\n      }\n      for (let i = hs.length; i > 0; --i) {\n         sections[7 - (hs.length - i)] = hs[i - 1];\n      }\n   }\n   for (let i = 0; i < 8; ++i) {\n      if (sections[i] === undefined) {\n         sections[i] = '0000';\n      }\n      sections[i] = _leftPad(sections[i], '0', 4);\n   }\n   return sections.join(':');\n};\n\nconst abbreviate = function (a) {\n   if (!_validate(a)) {\n      throw new Error('Invalid address: ' + a);\n   }\n   a = normalize(a);\n   a = a.replace(/0000/g, 'g');\n   a = a.replace(/\\:000/g, ':');\n   a = a.replace(/\\:00/g, ':');\n   a = a.replace(/\\:0/g, ':');\n   a = a.replace(/g/g, '0');\n   const sections = a.split(/\\:/g);\n   let zPreviousFlag = false;\n   let zeroStartIndex = -1;\n   let zeroLength = 0;\n   let zStartIndex = -1;\n   let zLength = 0;\n   for (let i = 0; i < 8; ++i) {\n      const section = sections[i];\n      let zFlag = (section === '0');\n      if (zFlag && !zPreviousFlag) {\n         zStartIndex = i;\n      }\n      if (!zFlag && zPreviousFlag) {\n         zLength = i - zStartIndex;\n      }\n      if (zLength > 1 && zLength > zeroLength) {\n         zeroStartIndex = zStartIndex;\n         zeroLength = zLength;\n      }\n      zPreviousFlag = (section === '0');\n   }\n   if (zPreviousFlag) {\n      zLength = 8 - zStartIndex;\n   }\n   if (zLength > 1 && zLength > zeroLength) {\n      zeroStartIndex = zStartIndex;\n      zeroLength = zLength;\n   }\n   //console.log(zeroStartIndex, zeroLength);\n   //console.log(sections);\n   if (zeroStartIndex >= 0 && zeroLength > 1) {\n      sections.splice(zeroStartIndex, zeroLength, 'g');\n   }\n   //console.log(sections);\n   a = sections.join(':');\n   //console.log(a);\n   a = a.replace(/\\:g\\:/g, '::');\n   a = a.replace(/\\:g/g, '::');\n   a = a.replace(/g\\:/g, '::');\n   a = a.replace(/g/g, '::');\n   //console.log(a);\n   return a;\n};\n\n// Basic validation\nconst _validate = function (a) {\n   return /^[a-f0-9\\\\:]+$/ig.test(a);\n};\n\nconst _leftPad = function (d, p, n) {\n   const padding = p.repeat(n);\n   if (d.length < padding.length) {\n      d = padding.substring(0, padding.length - d.length) + d;\n   }\n   return d;\n};\n\nconst _hex2bin = function (hex) {\n   return parseInt(hex, 16).toString(2)\n};\nconst _bin2hex = function (bin) {\n   return parseInt(bin, 2).toString(16)\n};\n\nconst _addr2bin = function (addr) {\n   const nAddr = normalize(addr);\n   const sections = nAddr.split(\":\");\n   let binAddr = '';\n   for (const section of sections) {\n      binAddr += _leftPad(_hex2bin(section), '0', 16);\n   }\n   return binAddr;\n};\n\nconst _bin2addr = function (bin) {\n   const addr = [];\n   for (let i = 0; i < 8; ++i) {\n      const binPart = bin.substr(i * 16, 16);\n      const hexSection = _leftPad(_bin2hex(binPart), '0', 4);\n      addr.push(hexSection);\n   }\n   return addr.join(':');\n};\n\nconst divideSubnet = function (addr, mask0, mask1, limit, abbr) {\n   if (!_validate(addr)) {\n      throw new Error('Invalid address: ' + addr);\n   }\n   mask0 *= 1;\n   mask1 *= 1;\n   limit *= 1;\n   mask1 = mask1 || 128;\n   if (mask0 < 1 || mask1 < 1 || mask0 > 128 || mask1 > 128 || mask0 > mask1) {\n      throw new Error('Invalid masks.');\n   }\n   const ret = [];\n   const binAddr = _addr2bin(addr);\n   const binNetPart = binAddr.substr(0, mask0);\n   const binHostPart = '0'.repeat(128 - mask1);\n   const numSubnets = Math.pow(2, mask1 - mask0);\n   for (let i = 0; i < numSubnets; ++i) {\n      if (!!limit && i >= limit) {\n         break;\n      }\n      const binSubnet = _leftPad(i.toString(2), '0', mask1 - mask0);\n      const binSubAddr = binNetPart + binSubnet + binHostPart;\n      const hexAddr = _bin2addr(binSubAddr);\n      if (!!abbr) {\n         ret.push(abbreviate(hexAddr));\n      } else {\n         ret.push(hexAddr);\n      }\n\n   }\n   // console.log(numSubnets);\n   // console.log(binNetPart, binSubnetPart, binHostPart);\n   // console.log(binNetPart.length, binSubnetPart.length, binHostPart.length);\n   // console.log(ret.length);\n   return ret;\n};\n\nconst range = function (addr, mask0, mask1, abbr) {\n   if (!_validate(addr)) {\n      throw new Error('Invalid address: ' + addr);\n   }\n   mask0 *= 1;\n   mask1 *= 1;\n   mask1 = mask1 || 128;\n   if (mask0 < 1 || mask1 < 1 || mask0 > 128 || mask1 > 128 || mask0 > mask1) {\n      throw new Error('Invalid masks.');\n   }\n   const binAddr = _addr2bin(addr);\n   const binNetPart = binAddr.substr(0, mask0);\n   const binHostPart = '0'.repeat(128 - mask1);\n   const binStartAddr = binNetPart + '0'.repeat(mask1 - mask0) + binHostPart;\n   const binEndAddr = binNetPart + '1'.repeat(mask1 - mask0) + binHostPart;\n   if (!!abbr) {\n      return {\n         start: abbreviate(_bin2addr(binStartAddr)),\n         end: abbreviate(_bin2addr(binEndAddr)),\n         size: Math.pow(2, mask1 - mask0)\n      };\n   } else {\n      return {\n         start: _bin2addr(binStartAddr),\n         end: _bin2addr(binEndAddr),\n         size: Math.pow(2, mask1 - mask0)\n      };\n   }\n};\n\nconst randomSubnet = function (addr, mask0, mask1, limit, abbr) {\n   if (!_validate(addr)) {\n      throw new Error('Invalid address: ' + addr);\n   }\n   mask0 *= 1;\n   mask1 *= 1;\n   limit *= 1;\n   mask1 = mask1 || 128;\n   limit = limit || 1;\n   if (mask0 < 1 || mask1 < 1 || mask0 > 128 || mask1 > 128 || mask0 > mask1) {\n      throw new Error('Invalid masks.');\n   }\n   const ret = [];\n   const binAddr = _addr2bin(addr);\n   const binNetPart = binAddr.substr(0, mask0);\n   const binHostPart = '0'.repeat(128 - mask1);\n   const numSubnets = Math.pow(2, mask1 - mask0);\n   for (let i = 0; i < numSubnets && i < limit; ++i) {\n      // generate an binary string with length of mask1 - mask0\n      let binSubnet = '';\n      for (let j = 0; j < mask1 - mask0; ++j) {\n         binSubnet += Math.floor(Math.random() * 2);\n      }\n      const binSubAddr = binNetPart + binSubnet + binHostPart;\n      const hexAddr = _bin2addr(binSubAddr);\n      if (!!abbr) {\n         ret.push(abbreviate(hexAddr));\n      } else {\n         ret.push(hexAddr);\n      }\n   }\n   // console.log(numSubnets);\n   // console.log(binNetPart, binSubnetPart, binHostPart);\n   // console.log(binNetPart.length, binSubnetPart.length, binHostPart.length);\n   // console.log(ret.length);\n   return ret;\n};\n\nconst ptr = function (addr, mask) {\n   if (!_validate(addr)) {\n      throw new Error('Invalid address: ' + addr);\n   }\n   mask *= 1;\n   if (mask < 1 || mask > 128 || Math.floor(mask / 4) != mask / 4) {\n      throw new Error('Invalid masks.');\n   }\n   const fullAddr = normalize(addr);\n   const reverse = fullAddr.replace(/:/g, '').split('').reverse();\n   return reverse.slice(0, (128 - mask) / 4).join('.');\n};\n\nif (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\n   exports.normalize = normalize;\n   exports.abbreviate = abbreviate;\n   exports.divideSubnet = divideSubnet;\n   exports.range = range;\n   exports.randomSubnet = randomSubnet;\n   exports.ptr = ptr;\n} else {\n   window.normalize = normalize;\n   window.abbreviate = abbreviate;\n   window.divideSubnet = divideSubnet;\n   window.range = range;\n   window.randomSubnet = randomSubnet;\n   window.ptr = ptr;\n}\n","import ipaddr from 'ipaddr.js';\n// @ts-ignore: Can't find a @types/ip6 package\nimport ip6 from 'ip6';\n\nexport function isIP(addr: string) {\n  return ipaddr.isValid(addr);\n}\n\nexport function version(addr: string): number {\n  try {\n    const parse_addr = ipaddr.parse(addr);\n    const kind = parse_addr.kind();\n\n    if (kind === 'ipv4') {\n      return 4; //IPv4\n    } else if (kind === 'ipv6') {\n      return 6; //IPv6\n    } else {\n      /* istanbul ignore next */\n      return 0; //not 4 or 6\n    }\n  } catch (err) {\n    return 0; //not 4 or 6\n  }\n}\n\nexport function isV4(addr: string) {\n  return version(addr) === 4;\n}\n\nexport function isV6(addr: string) {\n  return version(addr) === 6;\n}\n\nexport function isRange(range: string) {\n  try {\n    const cidr = ipaddr.parseCIDR(range);\n    return true;\n  } catch (err) {\n    return false;\n  }\n}\n\nexport function inRange(addr: string, range: string | string[]) {\n  if (typeof range === 'string') {\n    if (range.indexOf('/') !== -1) {\n      try {\n        const range_data = range.split('/');\n\n        const parse_addr = ipaddr.parse(addr);\n        const parse_range = ipaddr.parse(range_data[0]);\n\n        //@ts-ignore:  It works.\n        return parse_addr.match(parse_range, range_data[1]);\n      } catch (err) {\n        return false;\n      }\n    } else {\n      addr = isV6(addr) ? ip6.normalize(addr) : addr; //v6 normalize addr\n      range = isV6(range) ? ip6.normalize(range) : range; //v6 normalize range\n\n      return isIP(range as string) && addr === range;\n    }\n  } else if (range && typeof range === 'object') {\n    //list\n    for (const check_range in range) {\n      if (inRange(addr, range[check_range]) === true) {\n        return true;\n      }\n    }\n    return false;\n  } else {\n    return false;\n  }\n}\n\nexport function storeIP(addr: string) {\n  try {\n    var parse_addr = ipaddr.parse(addr);\n    var kind = parse_addr.kind();\n\n    if (kind === 'ipv4') {\n      //is a plain v4 address\n      return addr;\n    } else if (kind === 'ipv6') {\n      //@ts-ignore:  it exists!\n      if (parse_addr.isIPv4MappedAddress()) {\n        //convert v4 mapped to v6 addresses to a v4 in it's original format\n        //@ts-ignore:  it exists!\n        return parse_addr.toIPv4Address().toString();\n      } //is a v6, abbreviate it\n      else {\n        return ip6.abbreviate(addr);\n      }\n    } else {\n      return null; //invalid IP address\n    }\n  } catch (err) {\n    return null; //invalid IP address\n  }\n}\n\n// searchIP is a aliases of storeIP\nexport { storeIP as searchIP };\n\nexport function displayIP(addr: string) {\n  try {\n    var parse_addr = ipaddr.parse(addr);\n    var kind = parse_addr.kind();\n\n    if (kind === 'ipv4') {\n      //is a plain v4 address\n      return addr;\n    } else if (kind === 'ipv6') {\n      //@ts-ignore:  it exists!\n      if (parse_addr.isIPv4MappedAddress()) {\n        //convert v4 mapped to v6 addresses to a v4 in it's original format\n        //@ts-ignore:  it exists!\n        return parse_addr.toIPv4Address().toString();\n      } //is a v6, normalize it\n      else {\n        return ip6.normalize(addr);\n      }\n    } else {\n      return ''; //invalid IP address\n    }\n  } catch (err) {\n    return ''; //invalid IP address\n  }\n}\n","/**\n * Create a wpm namespace under which all functions are declared\n */\n\n// https://stackoverflow.com/a/5947280/4688612\n\n(function (pmw, $, undefined) {\n\n\tconst pmwDeduper = {\n\t\tkeyName          : \"_wpm_order_ids\",\n\t\tcookieExpiresDays: 365,\n\t};\n\n\tconst pmwRestSettings = {\n\t\t// cookiesAvailable                  : '_wpm_cookies_are_available',\n\t\tcookiePmwRestEndpointAvailable: \"restEndpointAvailable\",\n\t\trestEndpointPost              : \"pmw/v1/test/\",\n\t\trestFails                     : 0,\n\t\trestFailsThreshold            : 10,\n\t};\n\n\tpmw.emailSelected         = false;\n\tpmw.paymentMethodSelected = false;\n\n\tpmw.isBelowRestErrorThreshold = () => pmw.retrieveData(pmwRestSettings.restFails) <= pmwRestSettings.restFailsThreshold;\n\n\tpmw.isRestEndpointAvailable = async () => {\n\n\t\t// If we already tested the endpoint and have a stored value, return it\n\t\tif (pmw.retrieveData(pmwRestSettings.cookiePmwRestEndpointAvailable)) {\n\t\t\treturn pmw.retrieveData(pmwRestSettings.cookiePmwRestEndpointAvailable);\n\t\t}\n\n\t\treturn await pmw.testEndpoint();\n\t};\n\n\t/**\n\t * Tests a given endpoint by sending a POST request. If the response status is 200, it stores `true` in the dataStorage with given cookie name; else it stores `false`.\n\t *\n\t * @param {string} url - The URL of the endpoint to test. Defaults to concatenation of `pmw.root` and `wpmRestSettings.restEndpointPost`.\n\t * @param {string} cookieName - The name of the cookie where the test result will be stored. Defaults to `wpmRestSettings.cookiePmwRestEndpointAvailable`.\n\t * @returns {Promise<boolean>} - Returns a promise that resolves to `true` if the response status is 200, and `false` otherwise.\n\t * @async\n\t */\n\tpmw.testEndpoint = async (\n\t\turl        = pmw.root + pmwRestSettings.restEndpointPost,\n\t\tcookieName = pmwRestSettings.cookiePmwRestEndpointAvailable,\n\t) => {\n\n\t\ttry {\n\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod   : \"POST\",\n\t\t\t\tmode     : \"cors\",\n\t\t\t\tcache    : \"no-cache\",\n\t\t\t\tkeepalive: true,\n\t\t\t\tredirect : \"error\",\t// don't follow redirects\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tpmw.storeData(cookieName, false);\n\t\t\t\tpmw.console.error(\"Error testing the endpoint. Status: \" + response.status + \" | response: \", response);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst responseJson = await response.json();\n\n\t\t\t// Return false if responseJson.success is not true\n\t\t\tif (!responseJson.success) {\n\t\t\t\tpmw.storeData(cookieName, false);\n\t\t\t\tpmw.console.error(\"Error testing the endpoint. Response JSON: \" + JSON.stringify(responseJson));\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tpmw.storeData(cookieName, true);\n\t\t\treturn true;\n\n\t\t} catch (e) {\n\t\t\tpmw.storeData(cookieName, false);\n\t\t\tpmw.console.error(\"Error testing the endpoint. Error: \" + e);\n\t\t\treturn false;\n\t\t}\n\t};\n\n\tpmw.isPmwRestEndpointAvailable = (cookieName = pmwRestSettings.cookiePmwRestEndpointAvailable) => !!pmw.retrieveData(cookieName);\n\n\t/**\n\t * This function writes the provided orderId into storage. It will first retrieve the existing orderIds\n\t * from the storage if any, then add the new orderId into this existing array of orderIds  and stores\n\t * the updated array back to the storage.\n\t * If the function pmw.storeOrderIdOnServer exists and order_duplication_prevention is set to true in pmwDataLayer.shop,\n\t * this function will also store the orderId, orderKey and source on the server side using pmw.storeOrderIdOnServer.\n\t *\n\t * @param {String}  orderId  - The ID of the order to be stored.\n\t * @param {String}  orderKey - The Key of the order to be stored.\n\t * @param {String}  source - The source from which the order originated (default: 'thankyou_page').\n\t */\n\tpmw.writeOrderIdToStorage = (orderId, orderKey, source = \"thankyou_page\") => {\n\n\t\t// Get existing order ids\n\t\tlet orderIds = pmw.retrieveData(\"orderIds\", true) || [];\n\n\t\t// Add the new order id\n\t\torderIds.push(orderId);\n\n\t\t// Store the order ids\n\t\tpmw.storeData(\"orderIds\", orderIds, true);\n\n\t\tif (typeof pmw.storeOrderIdOnServer === \"function\") {\n\t\t\tpmw.storeOrderIdOnServer({\n\t\t\t\torderId : orderId,\n\t\t\t\torderKey: orderKey,\n\t\t\t\tsource  : source,\n\t\t\t});\n\t\t}\n\t};\n\n\tpmw.isOrderIdStored = orderId => {\n\n\t\t// If order deduplication is disabled, return false\n\t\tif (!pmwDataLayer.shop.order_duplication_prevention) {\n\t\t\tpmw.console.log(\"order duplication prevention is off\");\n\t\t\treturn false;\n\t\t}\n\n\t\tconst orderIds = pmw.retrieveData(\"orderIds\", true) || [];\n\t\treturn orderIds.includes(orderId);\n\t};\n\n\t/**\n\t * Check if the email address is valid\n\t *\n\t * https://stackoverflow.com/questions/201323/how-can-i-validate-an-email-address-using-a-regular-expression\n\t * https://www.w3.org/TR/html5/forms.html#valid-e-mail-address\n\t * https://fightingforalostcause.net/content/misc/2006/compare-email-regex.php\n\t *\n\t * @param email\n\t * @returns {boolean}\n\t */\n\tpmw.isEmail = email => {\n\n\t\t/**\n\t\t * GitHub Copilot generated RFC 5322 compliant regex\n\t\t * - Don't allow emails without a top-level domain like \"john@localhost\"\n\t\t * - Don't allow emails with dots at the end of the name like \"[email protected]\"\n\t\t */\n\t\tconst regex = new RegExp(\n\t\t\t\"^(([^<>()\\\\[\\\\]\\\\\\\\.,;:\\\\s@\\\"]+(\\\\.[^<>()\\\\[\\\\]\\\\\\\\.,;:\\\\s@\\\"]+)*)|(\\\".+\\\"))\"\n\t\t\t+ \"@\"\n\t\t\t+ \"((\\\\[[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\.[0-9]{1,3}\\\\])\"\n\t\t\t+ \"|(([a-zA-Z\\\\-0-9]+\\\\.)+[a-zA-Z]{2,}))$\",\n\t\t);\n\n\t\treturn regex.test(email);\n\t};\n\n\tpmw.removeProductFromCart = async (productId, quantityToRemove = null) => {\n\n\t\ttry {\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tproductId = pmw.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tlet quantity;\n\n\t\t\tif (quantityToRemove == null) {\n\t\t\t\tquantity = pmwDataLayer.cart[productId].quantity;\n\t\t\t} else {\n\t\t\t\tquantity = quantityToRemove;\n\t\t\t}\n\n\t\t\tif (!pmwDataLayer.cart[productId]) {\n\t\t\t\tawait pmw.getProductsFromBackend([productId]);\n\t\t\t}\n\n\t\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId, quantity);\n\n\t\t\tjQuery(document).trigger(\"pmw:remove-from-cart\", product);\n\n\t\t\tif (quantityToRemove == null || pmwDataLayer.cart[productId].quantity === quantityToRemove) {\n\t\t\t\tdelete pmwDataLayer.cart[productId];\n\t\t\t} else {\n\t\t\t\tpmwDataLayer.cart[productId].quantity = pmwDataLayer.cart[productId].quantity - quantity;\n\t\t\t}\n\n\t\t\tpmw.storeCartData(pmwDataLayer.cart);\n\n\t\t} catch (e) {\n\t\t\tpmw.console.error(\"error: \", e);\n\t\t}\n\t};\n\n\tpmw.getIdBasedOndVariationsOutputSetting = productId => {\n\n\t\ttry {\n\t\t\tif (pmwDataLayer?.shop?.variations_output) return productId;\n\n\t\t\tif (pmwDataLayer.products[productId].is_variation) return pmwDataLayer.products[productId].parent_id;\n\n\t\t\treturn productId;\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.prepareSelectors = (selectors, type) => {\n\n\t\tif (pmwDataLayer?.shop?.selectors?.[type]) {\n\n\t\t\t// merge the selectors from the addToCartSelectors array with the selectors from the pmwDataLayer.shop.selectors.addToCart array\n\t\t\tselectors = selectors.concat(pmwDataLayer.shop.selectors[type]);\n\n\t\t\t// Remove duplicates\n\t\t\tselectors = [...new Set(selectors)];\n\n\t\t\t// If one of the selectors is document, remove it\n\t\t\tif (selectors.indexOf(\"document\") >= 0) {\n\t\t\t\tselectors.splice(selectors.indexOf(\"document\"), 1);\n\t\t\t}\n\n\t\t\t// If one of the selectors is body, remove all others\n\t\t\tif (selectors.indexOf(\"body\") >= 0) {\n\t\t\t\tselectors = [\"body\"];\n\t\t\t}\n\t\t}\n\n\t\treturn selectors.join(\", \");\n\t};\n\n\t// add_to_cart\n\tpmw.addProductToCart = async (productId, quantity) => {\n\n\t\t// Cast quantity to number to make sure it's a number\n\t\tquantity = Number(quantity);\n\n\t\ttry {\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tproductId = pmw.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\tif (!pmwDataLayer?.products[productId]) {\n\t\t\t\tawait pmw.getProductsFromBackend([productId]);\n\t\t\t}\n\n\t\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId, quantity);\n\n\t\t\tjQuery(document).trigger(\"pmw:add-to-cart\", product);\n\n\t\t\t// add product to cart pmwDataLayer['cart']\n\n\t\t\t// if the product already exists in the object, only add the additional quantity\n\t\t\t// otherwise create that product object in the pmwDataLayer['cart']\n\t\t\tif (pmwDataLayer?.cart[productId]) {\n\n\t\t\t\tpmwDataLayer.cart[productId].quantity = pmwDataLayer.cart[productId].quantity + quantity;\n\t\t\t} else {\n\n\t\t\t\tif (!(\"cart\" in pmwDataLayer)) pmwDataLayer.cart = {};\n\n\t\t\t\tpmwDataLayer.cart[productId] = pmw.getProductDetailsFormattedForEvent(productId, quantity);\n\t\t\t}\n\n\t\t\tpmw.storeCartData(pmwDataLayer.cart);\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\n\t\t\t// fallback if pmwDataLayer.cart and pmwDataLayer.products got out of sync in case cart caching has an issue\n\t\t\tpmw.getCartItemsFromBackend();\n\t\t}\n\t};\n\n\tpmw.initCart = () => {\n\n\t\t// If the WC cart doesn't exist, eg. after a confirmed purchase,\n\t\t// and we still have a cart object in the storage, reset it.\n\t\tif (\n\t\t\t!pmw.doesWooCommerceCartExist()\n\t\t\t&& Object.keys(pmw.retrieveCartData()).length !== 0\n\t\t) {\n\t\t\tpmw.storeCartData({});\n\t\t\treturn;\n\t\t}\n\n\t\t// If the cart object is in the storage, use it\n\t\tif (pmw.retrieveCartData()) {\n\t\t\tpmw.saveCartObjectToDataLayer(pmw.retrieveCartData());\n\t\t\treturn;\n\t\t}\n\n\t\t// If the cart object is missing in the storage, create an empty one and get the cart items from the backend\n\t\tpmw.storeCartData({});\n\t\tpmw.getCartItemsFromBackend();\n\t};\n\n\t// get all cart items from the backend\n\tpmw.getCartItemsFromBackend = () => {\n\t\ttry {\n\n\t\t\t/**\n\t\t\t * Can't use a REST API endpoint, as the cart session will not be loaded if the\n\t\t\t * endpoint is called.\n\t\t\t *\n\t\t\t * https://wordpress.org/support/topic/wc-cart-is-null-in-custom-rest-api/#post-11442843\n\t\t\t */\n\n\t\t\t/**\n\t\t\t * Get the cart items from the backend the data object using fetch API\n\t\t\t * and log success or error messages\n\t\t\t * and url encoded data\n\t\t\t */\n\t\t\tfetch(pmw.ajax_url, {\n\t\t\t\tmethod   : \"POST\",\n\t\t\t\tcache    : \"no-cache\",\n\t\t\t\tbody     : new URLSearchParams({action: \"pmw_get_cart_items\"}),\n\t\t\t\tkeepalive: true,\n\t\t\t\tredirect : \"error\",\n\t\t\t})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif (response.ok) {\n\t\t\t\t\t\treturn response.json();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow Error(\"Error getting cart items from backend\");\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.then(data => {\n\n\t\t\t\t\tif (data.success) {\n\n\t\t\t\t\t\tif (!data.data[\"cart\"]) data.data[\"cart\"] = {};\n\t\t\t\t\t\tpmw.saveCartObjectToDataLayer(data.data[\"cart\"]);\n\t\t\t\t\t\tpmw.storeCartData(data.data[\"cart\"]);\n\n\t\t\t\t\t\t// Save cart_item_keys from AJAX response for remove_from_cart tracking\n\t\t\t\t\t\t// This provides fallback when inline scripts are suppressed via pmw_output_cart_item_data filter\n\t\t\t\t\t\tif (data.data[\"cart_item_keys\"]) {\n\t\t\t\t\t\t\tpmwDataLayer.cart_item_keys = Object.assign(\n\t\t\t\t\t\t\t\tpmwDataLayer.cart_item_keys || {},\n\t\t\t\t\t\t\t\tdata.data[\"cart_item_keys\"]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow Error(\"Error getting cart items from backend\");\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// Get product IDs from the backend\n\tpmw.getProductsFromBackend = async productIds => {\n\n\t\tif (pmwDataLayer?.products) {\n\t\t\t// If productIds already exists as key in pmwDataLayer.products, remove it from the array\n\t\t\tproductIds = productIds.filter(productId => !(productId in pmwDataLayer.products));\n\t\t}\n\n\t\t// If no product IDs are in the object, don't try to get anything from the server\n\t\tif (!productIds || productIds.length === 0) return;\n\n\t\t// if no page_id is set, don't try to get anything from the server\n\t\tif (!pmwDataLayer.general.page_id) return;\n\n\t\t// if productIds is not an array, or it's an empty array, don't try to get anything from the server\n\t\tif (!Array.isArray(productIds) || productIds.length === 0) return;\n\n\t\ttry {\n\n\t\t\tlet data = {\n\t\t\t\taction     : \"pmw_get_product_ids\",  // for the AJAX call\n\t\t\t\tpage_id    : pmwDataLayer.general.page_id,\n\t\t\t\tpage_type  : pmwDataLayer.shop.page_type,\n\t\t\t\tproduct_ids: productIds,\n\t\t\t};\n\n\t\t\tconst isRestEndpointAvailable = await pmw.isRestEndpointAvailable();\n\t\t\tconst url                     = isRestEndpointAvailable ? pmw.root + \"pmw/v1/products/\" : pmw.ajax_url;\n\n\t\t\tconst options = {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tcache : \"no-cache\",\n\t\t\t\tbody  : isRestEndpointAvailable ? JSON.stringify(data) : new URLSearchParams(data),\n\t\t\t};\n\n\t\t\t// If the REST API is available, set the headers to JSON\n\t\t\tif (isRestEndpointAvailable) {\n\t\t\t\toptions.headers = {\"Content-Type\": \"application/json\"};\n\t\t\t}\n\n\t\t\tlet response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(\"Error getting products from backend. Status: \" + response.status + \" Status text: \" + response.statusText);\n\t\t\t}\n\n\t\t\tlet responseData = await response.json();\n\n\t\t\tif (!responseData.success) {\n\t\t\t\tthrow new Error(\"Error getting products from backend: \" + responseData.data);\n\t\t\t}\n\n\t\t\tpmwDataLayer.products = Object.assign({}, pmwDataLayer.products, responseData.data);\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\n\t\treturn true;\n\t};\n\n\tpmw.saveCartObjectToDataLayer = cartObject => {\n\n\t\tpmwDataLayer.cart     = cartObject;\n\t\tpmwDataLayer.products = Object.assign({}, pmwDataLayer.products, cartObject);\n\t};\n\n\tpmw.triggerViewItemEventPrep = async productId => {\n\n\t\tif (!pmwDataLayer?.products[productId]) {\n\t\t\tawait pmw.getProductsFromBackend([productId]);\n\t\t}\n\n\t\tif (!pmwDataLayer?.products[productId]) {\n\t\t\tpmw.triggerViewItemEventNoProduct();\n\t\t\tpmw.console.log(`Product with ID ${productId} not found in the data layer and couldn't be retrieved from the backend. Triggering view-item event without product data.`);\n\t\t} else {\n\t\t\tpmw.triggerViewItemEvent(productId);\n\t\t}\n\t};\n\n\tpmw.triggerViewItemEvent = productId => {\n\n\t\tlet product = pmw.getProductDetailsFormattedForEvent(productId);\n\n\t\tif (!product) return;\n\n\t\tjQuery(document).trigger(\"pmw:view-item\", product);\n\t};\n\n\tpmw.triggerViewItemEventNoProduct = () => {\n\t\tjQuery(document).trigger(\"pmw:view-item\");\n\t};\n\n\tpmw.fireCheckoutOption = (step, checkout_option = null, value = null) => {\n\n\t\tlet data = {\n\t\t\tstep           : step,\n\t\t\tcheckout_option: checkout_option,\n\t\t\tvalue          : value,\n\t\t};\n\n\t\tjQuery(document).trigger(\"pmw:checkout-option\", data);\n\t};\n\n\tpmw.fireCheckoutProgress = step => {\n\n\t\tlet data = {\n\t\t\tstep: step,\n\t\t};\n\n\t\tjQuery(document).trigger(\"pmw:checkout-progress\", data);\n\t};\n\n\tpmw.getPostIdFromString = string => {\n\n\t\ttry {\n\t\t\treturn string.match(/(post-)(\\d+)/)[2];\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.triggerViewItemList = productId => {\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\tproductId = pmw.getIdBasedOndVariationsOutputSetting(productId);\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\tjQuery(document).trigger(\"pmw:view-item-list\", pmw.getProductDataForViewItemEvent(productId));\n\t};\n\n\tpmw.getProductDataForViewItemEvent = productId => {\n\n\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\ttry {\n\t\t\tif (pmwDataLayer.products[productId]) {\n\n\t\t\t\treturn pmw.getProductDetailsFormattedForEvent(productId);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.getMainProductIdFromProductPage = () => {\n\n\t\ttry {\n\t\t\tif ([\"simple\", \"variable\", \"grouped\", \"composite\", \"bundle\"].indexOf(pmwDataLayer.shop.product_type) >= 0) {\n\t\t\t\treturn jQuery(\".pmwProductId:first\").data(\"id\");\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.viewItemListTriggerTestMode = target => {\n\n\t\tjQuery(target).css({\"position\": \"relative\"});\n\t\tjQuery(target).append(\"<div id=\\\"viewItemListTriggerOverlay\\\"></div>\");\n\t\tjQuery(target).find(\"#viewItemListTriggerOverlay\").css({\n\t\t\t\"z-index\"         : \"10\",\n\t\t\t\"display\"         : \"block\",\n\t\t\t\"position\"        : \"absolute\",\n\t\t\t\"height\"          : \"100%\",\n\t\t\t\"top\"             : \"0\",\n\t\t\t\"left\"            : \"0\",\n\t\t\t\"right\"           : \"0\",\n\t\t\t\"opacity\"         : pmwDataLayer.shop.view_item_list_trigger.opacity,\n\t\t\t\"background-color\": pmwDataLayer.shop.view_item_list_trigger.background_color,\n\t\t});\n\t};\n\n\tpmw.getSearchTermFromUrl = () => {\n\n\t\ttry {\n\t\t\tlet urlParameters = new URLSearchParams(window.location.search);\n\t\t\treturn urlParameters.get(\"s\");\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// we need this to track timeouts for intersection observers\n\tlet ioTimeouts = {};\n\n\tpmw.observerCallback = (entries, observer) => {\n\n\t\tentries.forEach((entry) => {\n\n\t\t\ttry {\n\t\t\t\tlet productId;\n\n\t\t\t\tlet elementId = jQuery(entry.target).data(\"ioid\");\n\n\t\t\t\t// Get the productId from next element, if wpmProductId is a sibling, like in Gutenberg blocks\n\t\t\t\t// otherwise go search in children, like in regular WC loop items\n\t\t\t\tif (jQuery(entry.target).next(\".pmwProductId\").length) {\n\t\t\t\t\t// console.log('test 1');\n\t\t\t\t\tproductId = jQuery(entry.target).next(\".pmwProductId\").data(\"id\");\n\t\t\t\t} else {\n\t\t\t\t\tproductId = jQuery(entry.target).find(\".pmwProductId\").data(\"id\");\n\t\t\t\t}\n\n\n\t\t\t\tif (!productId) throw Error(\"pmwProductId element not found\");\n\n\t\t\t\tif (entry.isIntersecting) {\n\n\t\t\t\t\tioTimeouts[elementId] = setTimeout(() => {\n\n\t\t\t\t\t\tpmw.triggerViewItemList(productId);\n\t\t\t\t\t\tif (pmwDataLayer.shop.view_item_list_trigger.test_mode) pmw.viewItemListTriggerTestMode(entry.target);\n\t\t\t\t\t\tif (pmwDataLayer.shop.view_item_list_trigger.repeat === false) observer.unobserve(entry.target);\n\t\t\t\t\t}, pmwDataLayer.shop.view_item_list_trigger.timeout);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tclearTimeout(ioTimeouts[elementId]);\n\t\t\t\t\tif (pmwDataLayer.shop.view_item_list_trigger.test_mode) jQuery(entry.target).find(\"#viewItemListTriggerOverlay\").remove();\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t};\n\n\t// fire view_item_list only on products that have become visible\n\tlet io;\n\tlet ioid = 0;\n\n\tconst getCommonIdentifiersToWatch = () => {\n\n\t\tlet listOfClassNames = {\n\t\t\tnested: [],\n\t\t\tflat  : [],\n\t\t};\n\n\t\ttry {\n\n\t\t\tconst haveSameNestingDepth = (element1, element2) => {\n\n\t\t\t\t// If both are the same, return the parent\n\t\t\t\treturn jQuery(element1).parents().length === jQuery(element2).parents().length;\n\t\t\t};\n\n\t\t\tconst findCommonParentElement = (element1, element2) => {\n\t\t\t\t// If both are the same, return the parent\n\t\t\t\tif (jQuery(element1).parent().is(jQuery(element2).parent())) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tnode: jQuery(element1).parent(),\n\t\t\t\t\t\ttype: \"flat\",\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tnode: jQuery(element1).parents().has(jQuery(element2).parents()).first(),\n\t\t\t\t\ttype: \"nested\",\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst countOfChildren = (element) => {\n\t\t\t\t// Return the count of \"wpmProductId\" elements\n\t\t\t\treturn jQuery(element).find(\".pmwProductId\").length;\n\t\t\t};\n\n\t\t\tconst getCommonClass = (classes1, classes2) => {\n\n\t\t\t\t// console.log(\"classes1\", classes1);\n\t\t\t\t// console.log(\"classes2\", classes2);\n\t\t\t\t// classes 1 and 2 are arrays of classes\n\t\t\t\t// They may contain the same classes, but not in the same order\n\t\t\t\t// Return the first common class that's present in both arrays\n\n\t\t\t\treturn classes1.filter(value => classes2.includes(value))[0] || null;\n\t\t\t};\n\n\t\t\tconst pmwProductIds = document.querySelectorAll(\".pmwProductId\");\n\n\t\t\t// If zero or only one product template is found, then we can't run the algorithm\n\t\t\tif (pmwProductIds.length === 1) {\n\t\t\t\t// console.log(\"No product or too few templates found\")\n\t\t\t\treturn listOfClassNames;\n\t\t\t}\n\n\t\t\t// console.log(\"wpmProductIds\", wpmProductIds);\n\t\t\t// console.log(\"looping\")\n\n\t\t\tfor (let i = 0; i < pmwProductIds.length - 1; i++) {\n\n\t\t\t\t// console.log(\"i\", i)\n\n\t\t\t\tif (!haveSameNestingDepth(pmwProductIds[i], pmwProductIds[i + 1])) {\n\t\t\t\t\t// console.log(\"The nesting depth is not the same\")\n\t\t\t\t\ti++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tlet productsNode = findCommonParentElement(pmwProductIds[i], pmwProductIds[i + 1]);\n\t\t\t\t// console.log(\"productsNode.node\", productsNode.node)\n\t\t\t\t// console.log(\"productsNode.type\", productsNode.type)\n\n\t\t\t\t// If the productsNode is nested, get the first class of the first child. Then console log the class\n\t\t\t\tif (productsNode.type === \"nested\") {\n\n\t\t\t\t\tlet firstChildClassAttr = productsNode.node.children().first().attr(\"class\");\n\t\t\t\t\tlet firstChildClasses   = firstChildClassAttr ? firstChildClassAttr.split(\" \") : [];\n\n\t\t\t\t\tlet secondChildClassAttr = productsNode.node.children().first().next().attr(\"class\");\n\t\t\t\t\tlet secondChildClasses   = secondChildClassAttr ? secondChildClassAttr.split(\" \") : [];\n\n\t\t\t\t\tconst commonClass = getCommonClass(firstChildClasses, secondChildClasses);\n\n\t\t\t\t\tlistOfClassNames.nested.push(commonClass);\n\t\t\t\t} else if (productsNode.type === \"flat\") {\n\n\t\t\t\t\t// If class is not found, continue\n\t\t\t\t\tif (!productsNode.node.children().first().attr(\"class\")) continue;\n\n\t\t\t\t\t// firstProductTemplateClasses is the classes of the first child element of the productsNode\n\t\t\t\t\tlet firstProductTemplateClasses = productsNode.node.children().first().attr(\"class\").split(\" \")[0];\n\n\t\t\t\t\tlistOfClassNames.flat.push(firstProductTemplateClasses);\n\t\t\t\t}\n\n\t\t\t\t// which wpmProductIds is the last one in the productsNode? console log the index of the last wpmProductId in the productsNode\n\t\t\t\t// console.log(\"productsNode.children().length\", countOfChildren(productsNode));\n\n\t\t\t\ti = i + countOfChildren(productsNode.node) - 1;\n\t\t\t}\n\n\t\t\t// Make the list of class names unique\n\t\t\tlistOfClassNames.nested = [...new Set(listOfClassNames.nested)];\n\t\t\tlistOfClassNames.flat   = [...new Set(listOfClassNames.flat)];\n\n\t\t\treturn listOfClassNames;\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t\treturn listOfClassNames;\n\t\t}\n\t};\n\n\n\tlet detectedProductTemplateClasses = {\n\t\tnested: [],\n\t\tflat  : [],\n\t};\n\n\tconst isNestedClass = (elem) => {\n\t\tlet nestedClassNames = [\n\t\t\t\"product\",\n\t\t\t\"type-product\",\n\t\t\t\"product-item-inner\",\n\t\t\t...detectedProductTemplateClasses.nested,\n\t\t];\n\n\t\treturn nestedClassNames.some(className => jQuery(elem).closest(\".\" + className).length);\n\t};\n\n\tconst isFlatClass = (elem) => {\n\n\t\tlet flatClassNames = [\n\t\t\t\"wc-block-grid__product\",\n\t\t\t\"product\",\n\t\t\t\"product-small\",\n\t\t\t\"woocommerce-LoopProduct-link\",\n\t\t\t...detectedProductTemplateClasses.flat,\n\t\t];\n\n\t\treturn flatClassNames.some(className => jQuery(elem).prev().hasClass(className));\n\t};\n\n\tconst getAllElementsToWatch = () => {\n\n\t\tdetectedProductTemplateClasses = getCommonIdentifiersToWatch();\n\n\t\treturn jQuery(\".pmwProductId\")\n\t\t\t.map(function (i, elem) {\n\n\t\t\t\tif (isNestedClass(elem)) {\n\t\t\t\t\treturn jQuery(elem).parent();\n\t\t\t\t} else if (isFlatClass(elem)) {\n\t\t\t\t\treturn jQuery(this).prev();\n\t\t\t\t} else if (jQuery(elem).closest(\".product\").length) {\n\t\t\t\t\treturn jQuery(elem).closest(\".product\");\n\t\t\t\t}\n\t\t\t});\n\t};\n\n\tpmw.startIntersectionObserverToWatch = () => {\n\n\t\ttry {\n\t\t\t// enable view_item_list test mode from browser\n\t\t\tif (pmw.urlHasParameter(\"vildemomode\")) pmwDataLayer.shop.view_item_list_trigger.test_mode = true;\n\n\t\t\t// set up intersection observer\n\t\t\t// https://stackoverflow.com/questions/62084306/intersectionobserver-not-working-in-safari-or-ios\n\t\t\tio = new IntersectionObserver(pmw.observerCallback, {\n\t\t\t\troot: null,\n\t\t\t\t// root     : document.body,\n\t\t\t\tthreshold: pmwDataLayer.shop.view_item_list_trigger.threshold,\n\t\t\t});\n\n\t\t\tgetAllElementsToWatch().each((i, elem) => {\n\n\t\t\t\tjQuery(elem[0]).data(\"ioid\", ioid++);\n\n\t\t\t\tio.observe(elem[0]);\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// Watch DOM for new lazy loaded products and add them to the intersection observer\n\tpmw.startProductsMutationObserverToWatch = () => {\n\n\t\ttry {\n\t\t\t// Pass in the target node, as well as the observer options\n\n\t\t\t// selects the most common parent node\n\t\t\t// https://stackoverflow.com/a/7648323/4688612\n\t\t\tlet productsNode = jQuery(\".pmwProductId:eq(0)\").parents().has(jQuery(\".pmwProductId:eq(1)\").parents()).first();\n\n\t\t\tif (productsNode.length) {\n\t\t\t\tproductsMutationObserver.observe(productsNode[0], {\n\t\t\t\t\tattributes   : true,\n\t\t\t\t\tchildList    : true,\n\t\t\t\t\tcharacterData: true,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\t// Create an observer instance\n\tconst productsMutationObserver = new MutationObserver(mutations => {\n\n\t\tmutations.forEach(mutation => {\n\t\t\tlet newNodes = mutation.addedNodes; // DOM NodeList\n\t\t\tif (newNodes !== null) { // If there are new nodes added\n\t\t\t\tlet nodes = jQuery(newNodes); // jQuery set\n\t\t\t\tnodes.each((i, node) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\t// jQuery(this).hasClass(\"type-product\") ||\n\t\t\t\t\t\t// jQuery(this).hasClass(\"product-small\") ||\n\t\t\t\t\t\t// jQuery(this).hasClass(\"wc-block-grid__product\")\n\t\t\t\t\t\t// jQuery(this).hasClass(\"type-product\")\n\t\t\t\t\t\tisNestedClass(node) || isFlatClass(node)\n\t\t\t\t\t) {\n\t\t\t\t\t\t// check if the node has a child or sibling wpmProductId\n\t\t\t\t\t\t// if yes add it to the intersectionObserver\n\t\t\t\t\t\tif (hasPmwProductIdElement(node)) {\n\t\t\t\t\t\t\tjQuery(node).data(\"ioid\", ioid++);\n\t\t\t\t\t\t\tio.observe(node);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t});\n\n\tlet hasPmwProductIdElement = elem =>\n\t\t!!(jQuery(elem).find(\".pmwProductId\").length ||\n\t\t\tjQuery(elem).siblings(\".pmwProductId\").length);\n\n\t/**\n\t * Sets a new cookie or updates an existing one with the provided name and value.\n\t *\n\t * @function setCookie\n\t * @global\n\t * @param {string} cookieName - The name of the cookie.\n\t * @param {string} [cookieValue=\"\"] - The value to set for the cookie. Default value is an empty string.\n\t * @param {number|null} [expiryDays=null] - The number of days until the cookie expires. If not provided, the cookie will last until the end of the session.\n\t * @returns {void}\n\t *\n\t * @example\n\t * // This will create a cookie \"username\" with the value \"JohnDoe\" that expires in 7 days\n\t * pmw.setCookie(\"username\", \"JohnDoe\", 7);\n\t */\n\tpmw.setCookie = (cookieName, cookieValue = \"\", expiryDays = null) => {\n\n\t\tif (expiryDays) {\n\n\t\t\tlet d = new Date();\n\t\t\td.setTime(d.getTime() + (expiryDays * 24 * 60 * 60 * 1000));\n\t\t\tlet expires     = \"expires=\" + d.toUTCString();\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";\" + expires + \";path=/\";\n\t\t} else {\n\t\t\tdocument.cookie = cookieName + \"=\" + cookieValue + \";path=/\";\n\t\t}\n\t};\n\n\t/**\n\t * Retrieves the value of a specific cookie from the document's cookie string.\n\t *\n\t * @param {String} cookieName - The name of the cookie to retrieve.\n\t * @returns {String} - The value of the cookie if found, an empty string otherwise.\n\t *\n\t * @example\n\t * // returns 'value' if 'cookieName=value' exists in document.cookie\n\t * pmw.getCookie('cookieName')\n\t */\n\tpmw.getCookie = cookieName => {\n\n\t\tlet name          = cookieName + \"=\";\n\t\tlet decodedCookie = decodeURIComponent(document.cookie);\n\t\tlet ca            = decodedCookie.split(\";\");\n\n\t\tfor (let i = 0; i < ca.length; i++) {\n\n\t\t\tlet c = ca[i];\n\n\t\t\twhile (c.charAt(0) == \" \") {\n\t\t\t\tc = c.substring(1);\n\t\t\t}\n\n\t\t\tif (c.indexOf(name) == 0) {\n\t\t\t\treturn c.substring(name.length, c.length);\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\t/**\n\t * Find and get the cookie with a name that contains the string.\n\t * If one is found, then return the cookie.\n\t * If none is found, then return false.\n\t *\n\t * @param string\n\t * @returns {boolean|string}\n\t *\n\t * @since 1.32.5\n\t */\n\tpmw.getCookieThatContainsRegex = (regex) => {\n\n\t\tlet cookies = document.cookie.split(\";\");\n\n\t\tfor (let i = 0; i < cookies.length; i++) {\n\t\t\tlet cookie = cookies[i].trim();\n\n\t\t\tif (regex.test(cookie)) {\n\t\t\t\treturn cookie;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tpmw.deleteCookie = cookieName => {\n\t\tpmw.setCookie(cookieName, \"\", -1);\n\t};\n\n\t/**\n\t * Store data in the browser\n\t *\n\t * Try to store the data in the local storage (session or persistent) if available.\n\t * If not available, store the data in the cookie.\n\t *\n\t * Max cookie expiry is 400 days as specified by Google Chrome: https://developer.chrome.com/blog/cookie-max-age-expires/\n\t *\n\t * @param key\n\t * @param value\n\t * @param persistent\n\t * @param extension - If true, this will be saved in a separate key\n\t */\n\tpmw.storeData = (key, value, persistent = false, extension = false) => {\n\n\t\tconst suffix = extension ? key : \"\";\n\n\t\tlet dataGetter = persistent ? pmw.getPersistentData : pmw.getSessionData;\n\t\tlet dataSetter = persistent ? pmw.setPersistentData : pmw.setSessionData;\n\n\t\tlet data = dataGetter(suffix);\n\t\textension ? data = value : data[key] = value;\n\n\t\tdataSetter(data, suffix);\n\n\t\t// Broadcast session data changes to other tabs\n\t\tif (!persistent && pmw.crossTabSync && !pmw.crossTabSync.isSyncing()) {\n\t\t\tpmw.crossTabSync.broadcastUpdate(key, value, extension, suffix);\n\t\t}\n\t};\n\n\tpmw.retrieveData = (key, persistent = false, extension = false) => {\n\n\t\tconst suffix = extension ? key : \"\";\n\n\t\tlet data = persistent ? pmw.getPersistentData(suffix) : pmw.getSessionData(suffix);\n\n\t\treturn extension ? data : data[key];\n\t};\n\n\tpmw.deleteDataKey = (key, persistent = false, extension = false) => {\n\n\t\tconst suffix = extension ? key : \"\";\n\n\t\tlet dataGetter = persistent ? pmw.getPersistentData : pmw.getSessionData;\n\t\tlet dataSetter = persistent ? pmw.setPersistentData : pmw.setSessionData;\n\n\t\tlet data = dataGetter(suffix);\n\t\t// extension ? delete data : delete data[key]\n\n\t\tif (extension) {\n\n\t\t\ttry {\n\t\t\t\tif (persistent && window.localStorage) window.localStorage.removeItem(pmw.getPersistentDataKey(suffix));\n\t\t\t\tif (!persistent && window.sessionStorage) window.sessionStorage.removeItem(pmw.getSessionDataKey(suffix));\n\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tdelete data[key];\n\n\t\tdataSetter(data, suffix);\n\t};\n\n\tpmw.storeCartData = data => {\n\t\tpmw.storeData(\"cart\", data, false, true);\n\t};\n\n\tpmw.retrieveCartData = () => {\n\t\treturn pmw.retrieveData(\"cart\", false, true);\n\t};\n\n\tpmw.getSessionDataKey = (suffix = \"\") => {\n\t\tconst defaultStorageKey = \"_pmw_session_data\";\n\n\t\tif (suffix) {\n\t\t\treturn defaultStorageKey + \"_\" + suffix;\n\t\t}\n\n\t\treturn defaultStorageKey;\n\t};\n\n\tpmw.getPersistentDataKey = (storageKeySuffix) => {\n\n\t\tconst defaultStorageKey = \"_pmw_persistent_data\";\n\n\t\tif (storageKeySuffix) {\n\t\t\treturn defaultStorageKey + \"_\" + storageKeySuffix;\n\t\t}\n\n\t\treturn defaultStorageKey;\n\t};\n\n\tpmw.getSessionData = (suffix = \"\") => {\n\n\t\tif (window.sessionStorage) {\n\n\t\t\tlet data = window.sessionStorage.getItem(pmw.getSessionDataKey(suffix));\n\n\t\t\treturn data !== null ? JSON.parse(data) : {};\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tlet data = pmw.getCookie(pmw.getSessionDataKey(suffix));\n\n\t\t\treturn data !== \"\" ? JSON.parse(data) : {};\n\t\t}\n\t};\n\n\tpmw.setSessionData = (data, storageKeySuffix = \"\") => {\n\t\tif (window.sessionStorage) {\n\t\t\twindow.sessionStorage.setItem(pmw.getSessionDataKey(storageKeySuffix), JSON.stringify(data));\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tpmw.setCookie(pmw.getSessionDataKey(storageKeySuffix), JSON.stringify(data));\n\t\t}\n\t};\n\n\tpmw.getPersistentData = (storageKeySuffix) => {\n\n\t\tif (window.localStorage) {\n\n\t\t\tlet data = window.localStorage.getItem(pmw.getPersistentDataKey(storageKeySuffix));\n\n\t\t\treturn data !== null ? JSON.parse(data) : {};\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tlet data = pmw.getCookie(pmw.getPersistentDataKey(storageKeySuffix));\n\n\t\t\treturn data !== \"\" ? JSON.parse(data) : {};\n\t\t}\n\t};\n\n\tpmw.setPersistentData = (data, storageKeySuffix = \"\") => {\n\n\t\tif (window.localStorage) {\n\t\t\twindow.localStorage.setItem(pmw.getPersistentDataKey(storageKeySuffix), JSON.stringify(data));\n\t\t} else {\n\t\t\t// fallback to cookie\n\t\t\tpmw.setCookie(pmw.getPersistentDataKey(storageKeySuffix), JSON.stringify(data), 400);\n\t\t}\n\t};\n\n\tpmw.storeOrderIdOnServer = async (orderDetails) => {\n\n\t\ttry {\n\n\t\t\tlet response;\n\n\t\t\tif (await pmw.isRestEndpointAvailable()) {\n\n\t\t\t\tresponse = await fetch(pmw.root + \"pmw/v1/pixels-fired/\", {\n\t\t\t\t\tmethod   : \"POST\",\n\t\t\t\t\theaders  : {\n\t\t\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\t\t// \"X-WP-Nonce\"  : pmw.nonce_wp_rest,\n\t\t\t\t\t},\n\t\t\t\t\tbody     : JSON.stringify({\n\t\t\t\t\t\torder_id : orderDetails.orderId,\n\t\t\t\t\t\torder_key: orderDetails.orderKey,\n\t\t\t\t\t\tsource   : orderDetails.source,\n\t\t\t\t\t\t// nonce   : pmw.pmw_nonce,\n\t\t\t\t\t}),\n\t\t\t\t\tkeepalive: true,\n\t\t\t\t\tcache    : \"no-cache\",\n\t\t\t\t\tredirect : \"error\",\n\t\t\t\t});\n\n\t\t\t} else {\n\n\t\t\t\tpmw.console.log(\"REST API not available, falling back to AJAX\");\n\n\t\t\t\t// save the state in the database\n\n\t\t\t\t// Send the data object with ajax request\n\t\t\t\t// and log success or error using fetch API and url encoded\n\t\t\t\tresponse = await fetch(pmw.ajax_url, {\n\t\t\t\t\tmethod   : \"POST\",\n\t\t\t\t\tbody     : new URLSearchParams({\n\t\t\t\t\t\taction   : \"pmw_purchase_pixels_fired\",\n\t\t\t\t\t\torder_id : orderDetails.orderId,\n\t\t\t\t\t\torder_key: orderDetails.orderKey,\n\t\t\t\t\t\tsource   : orderDetails.source,\n\t\t\t\t\t\t// nonce_ajax: pmw.nonce_ajax,\n\t\t\t\t\t}),\n\t\t\t\t\tkeepalive: true,\n\t\t\t\t\tredirect : \"error\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst responseJson = await response.json();\n\n\t\t\tif (responseJson.success) {\n\t\t\t\tpmw.console.log(\"\", responseJson.data);\n\t\t\t} else {\n\t\t\t\tpmw.console.error(\"\", responseJson.data);\n\t\t\t}\n\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t};\n\n\tpmw.getProductIdByCartItemElement = element => {\n\n\t\tconst href = jQuery(element).find(\".product-remove\").find(\"a\").attr(\"href\");\n\t\tif (href) return pmw.getProductIdByCartItemKeyUrl(new URL(href));\n\n\t\tconst productId = jQuery(element).find(\"[data-product_id]\").first().attr(\"data-product_id\");\n\t\treturn productId ? productId : null;\n\t};\n\n\tpmw.getProductQuantityByCartItemElement = element => {\n\n\t\treturn jQuery(element).find(\".qty\").val() || null;\n\t};\n\n\tpmw.getProductIdByCartItemKeyUrl = url => {\n\n\t\tlet searchParams = new URLSearchParams(url.search);\n\t\tlet cartItemKey  = searchParams.get(\"remove_item\");\n\n\t\tlet productId;\n\n\t\tif (pmwDataLayer.cart_item_keys[cartItemKey][\"variation_id\"] === 0) {\n\t\t\tproductId = pmwDataLayer.cart_item_keys[cartItemKey][\"product_id\"];\n\t\t} else {\n\t\t\tproductId = pmwDataLayer.cart_item_keys[cartItemKey][\"variation_id\"];\n\t\t}\n\n\t\treturn productId;\n\t};\n\n\tpmw.getAddToCartLinkProductIds = () =>\n\t\tjQuery(\"a\").map(function () {\n\t\t\tlet href = jQuery(this).attr(\"href\");\n\n\t\t\tif (href && href.includes(\"?add-to-cart=\")) {\n\t\t\t\tlet matches = href.match(/(add-to-cart=)(\\d+)/);\n\t\t\t\tif (matches) return matches[2];\n\t\t\t}\n\t\t}).get();\n\n\tpmw.getProductDetailsFormattedForEvent = (productId, quantity = 1) => {\n\n\t\t// If pmwDataLayer.products[productId] doesn't exist, return an empty object\n\t\tif (!pmwDataLayer.products[productId]) return null;\n\n\t\tlet product = {\n\t\t\tid           : productId.toString(),\n\t\t\tdyn_r_ids    : pmwDataLayer.products[productId].dyn_r_ids,\n\t\t\tname         : pmwDataLayer.products[productId].name,\n\t\t\tlist_name    : pmwDataLayer.shop.list_name,\n\t\t\tbrand        : pmwDataLayer.products[productId].brand,\n\t\t\tcategory     : pmwDataLayer.products[productId].category,\n\t\t\tvariant      : pmwDataLayer.products[productId].variant,\n\t\t\tlist_position: pmwDataLayer.products[productId].position,\n\t\t\tquantity     : quantity,\n\t\t\tprice        : pmwDataLayer.products[productId].price,\n\t\t\tcurrency     : pmwDataLayer.shop.currency,\n\t\t\tis_variable  : pmwDataLayer.products[productId].is_variable,\n\t\t\tis_variation : pmwDataLayer.products[productId].is_variation,\n\t\t\tparent_id    : pmwDataLayer.products[productId].parent_id,\n\t\t};\n\n\t\tif (product.is_variation) product[\"parent_id_dyn_r_ids\"] = pmwDataLayer.products[productId].parent_id_dyn_r_ids;\n\n\t\treturn product;\n\t};\n\n\tpmw.getClidFromBrowser = (clidId = \"gclid\") => {\n\n\t\tlet clidCookieId;\n\n\t\tclidCookieId = {\n\t\t\tgclid: \"_gcl_aw\",\n\t\t\tdclid: \"_gcl_dc\",\n\t\t};\n\n\t\tif (pmw.getCookie(clidCookieId[clidId])) {\n\n\t\t\tlet clidCookie = pmw.getCookie(clidCookieId[clidId]);\n\t\t\tlet matches    = clidCookie.match(/(GCL.[\\d]*.)(.*)/);\n\t\t\treturn matches[2];\n\t\t} else {\n\t\t\treturn \"\";\n\t\t}\n\t};\n\n\tpmw.getUserAgent = () => navigator.userAgent;\n\n\tpmw.getViewPort = () => ({\n\t\twidth : Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0),\n\t\theight: Math.max(document.documentElement.clientHeight || 0, window.innerHeight || 0),\n\t});\n\n\n\tpmw.consoleLogVersion = () => {\n\t\tconsole.log(pmwDataLayer.version);\n\t};\n\n\t/**\n\t * Loads a script and caches it using native browser caching.\n\t *\n\t * Uses script tag injection which:\n\t * - Leverages browser's HTTP cache (respects Cache-Control headers)\n\t * - Avoids CORS preflight issues (no custom headers sent)\n\t * - Auto-executes the script on load\n\t * - Prevents duplicate script loading\n\t *\n\t * This code is .thenable\n\t */\n\n\tconst loadedScripts = new Set();\n\n\tpmw.loadScriptAndCacheIt = (url, fallbackUrl) => {\n\n\t\t// Return resolved promise if script already loaded\n\t\tif (loadedScripts.has(url)) {\n\t\t\tpmw.console.log(\"Script already loaded: \" + url);\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\tconst loadScript = (scriptUrl) => {\n\t\t\treturn new Promise((resolve, reject) => {\n\n\t\t\t\t// Check if script tag already exists in DOM\n\t\t\t\tif (document.querySelector(`script[src=\"${scriptUrl}\"]`)) {\n\t\t\t\t\tloadedScripts.add(scriptUrl);\n\t\t\t\t\tpmw.console.log(\"Script tag already exists: \" + scriptUrl);\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst script       = document.createElement(\"script\");\n\t\t\t\tscript.src         = scriptUrl;\n\t\t\t\tscript.async       = true;\n\t\t\t\tscript.crossOrigin = \"anonymous\"; // Enables CORS without sending credentials, avoids preflight issues\n\n\t\t\t\tscript.onload = () => {\n\t\t\t\t\tloadedScripts.add(scriptUrl);\n\t\t\t\t\tpmw.console.log(\"Successfully loaded script: \" + scriptUrl);\n\t\t\t\t\tresolve();\n\t\t\t\t};\n\n\t\t\t\tscript.onerror = () => {\n\t\t\t\t\tscript.remove(); // Clean up failed script tag\n\t\t\t\t\treject(new Error(\"Script failed to load: \" + scriptUrl));\n\t\t\t\t};\n\n\t\t\t\tdocument.head.appendChild(script);\n\t\t\t});\n\t\t};\n\n\t\treturn loadScript(url)\n\t\t\t.catch(() => {\n\t\t\t\tif (fallbackUrl) {\n\t\t\t\t\tpmw.console.log(\"Primary script failed, loading fallback: \" + fallbackUrl);\n\t\t\t\t\treturn loadScript(fallbackUrl);\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Primary script failed to load, and no fallback URL provided.\");\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tif (error.message.includes(\"fallback\")) {\n\t\t\t\t\tthrow error; // Re-throw if it's already the \"no fallback\" error\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Both primary and fallback scripts failed to load.\");\n\t\t\t});\n\t};\n\n\tpmw.getOrderItemPrice = orderItem => (orderItem.total + orderItem.total_tax) / orderItem.quantity;\n\n\tpmw.hasLoginEventFired = () => {\n\t\tlet data = pmw.getSessionData();\n\t\treturn data?.loginEventFired;\n\t};\n\n\tpmw.setLoginEventFired = () => {\n\t\tlet data                = pmw.getSessionData();\n\t\tdata[\"loginEventFired\"] = true;\n\t\tpmw.setSessionData(data);\n\t};\n\n\tpmw.hasAccountCreatedEventFired = () => {\n\t\tlet data = pmw.getSessionData();\n\t\treturn data?.accountCreatedEventFired;\n\t};\n\n\tpmw.setAccountCreatedEventFired = () => {\n\t\tlet data                         = pmw.getSessionData();\n\t\tdata[\"accountCreatedEventFired\"] = true;\n\t\tpmw.setSessionData(data);\n\t};\n\n\tpmw.pageLoaded = async () => new Promise(resolve => {\n\t\t(function waitForVar() {\n\t\t\tif (\"complete\" === document.readyState) return resolve();\n\t\t\tsetTimeout(waitForVar, 50);\n\t\t})();\n\t});\n\n\tpmw.pageReady = () => {\n\t\treturn new Promise(resolve => {\n\t\t\t(function waitForVar() {\n\t\t\t\tif (\"interactive\" === document.readyState || \"complete\" === document.readyState) return resolve();\n\t\t\t\tsetTimeout(waitForVar, 50);\n\t\t\t})();\n\t\t});\n\t};\n\n\tpmw.isMiniCartActive = () => {\n\t\tif (window.sessionStorage) {\n\t\t\tObject.keys(window.sessionStorage).forEach(key => {\n\t\t\t\tif (key.includes(\"wc_fragments\")) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tpmw.doesWooCommerceCartExist = () => document.cookie.includes(\"woocommerce_items_in_cart\");\n\n\tpmw.urlHasParameter = parameter => {\n\t\tlet urlParams = new URLSearchParams(window.location.search);\n\t\treturn urlParams.has(parameter);\n\t};\n\n\tpmw.getUrlParameter = parameter => {\n\t\tlet urlParams = new URLSearchParams(window.location.search);\n\t\treturn urlParams.get(parameter);\n\t};\n\n\t// https://stackoverflow.com/a/60606893/4688612\n\tpmw.hashAsync = (algo, str) => {\n\t\treturn crypto.subtle.digest(algo, new TextEncoder(\"utf-8\").encode(str)).then(buf => {\n\t\t\treturn Array.prototype.map.call(new Uint8Array(buf), x => ((\"00\" + x.toString(16)).slice(-2))).join(\"\");\n\t\t});\n\t};\n\n\tpmw.getCartValue = () => {\n\n\t\tlet value = 0;\n\n\t\tif (pmwDataLayer?.cart) {\n\n\t\t\tfor (const key in pmwDataLayer.cart) {\n\t\t\t\t// content_ids.push(pmwDataLayer.products[key].dyn_r_ids[pmwDataLayer.pixels.facebook.dynamic_remarketing.id_type])\n\n\t\t\t\tlet product = pmwDataLayer.cart[key];\n\n\t\t\t\tvalue += product.quantity * product.price;\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t};\n\n\t/**\n\t * Detect if the current URL contains at least one pattern\n\t *\n\t * @param patterns\n\t * @returns {boolean}\n\t */\n\tpmw.doesUrlContainPatterns = patterns => {\n\n\t\tfor (const pattern of patterns) {\n\t\t\tif (new RegExp(pattern).test(window.location.href)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Detect if the current URL contains at least one pattern that is on the tracking exclusion list\n\t *\n\t * https://www.linkedin.com/pulse/how-remove-google-robot-problem-via-gtm-facebook-pixel-hjelpdahl/\n\t * https://www.youtube.com/watch?v=b4I1ePZt8Z0\n\t *\n\t * @returns {boolean}\n\t */\n\tpmw.excludeDomainFromTracking = () => {\n\n\t\tlet exclude_domains = [\n\t\t\t\"appspot.com\",\n\t\t\t\"translate.google.com\",\n\t\t];\n\n\t\tif (pmwDataLayer?.general?.exclude_domains) {\n\t\t\texclude_domains = [...exclude_domains, ...pmwDataLayer.general.exclude_domains];\n\t\t}\n\n\t\t// Abort if URL contains excluded domains\n\t\tif (exclude_domains.some(domain => window.location.href.includes(domain))) {\n\t\t\tconsole.debug(\"Pixel Manager: Aborted due to excluded domain\");\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t};\n\n\t/**\n\t * Get a random event ID\n\t *\n\t * @param length\n\t * @return {string}\n\t */\n\tpmw.getRandomEventId = (length = 16) => {\n\t\tlet id = \"\";\n\t\twhile (id.length < length) {\n\t\t\tid += (Math.random() + 1).toString(36).substring(2);\n\t\t}\n\t\treturn id.substring(0, length);\n\t};\n\n\tpmw.pmwConsoleMessage = () => {\n\t\tlet message = \"Pixel Manager for WooCommerce: \";\n\t\tmessage += pmwDataLayer.version.pro ? \"pro\" : \"free\";\n\t\tmessage += \" | distro: \" + pmwDataLayer.version.distro;\n\t\tif (pmwDataLayer.version.distro === \"fms\" && pmwDataLayer.version.pro) {\n\t\t\tmessage += \" | active license: \" + (pmwDataLayer.version.eligible_for_updates ? \"yes\" : \"no\");\n\t\t}\n\t\tmessage += \" | version: \" + pmwDataLayer.version.number;\n\n\t\tif (pmwDataLayer.version.show === true) {\n\t\t\tconsole.log(message);\n\t\t} else {\n\t\t\tpmw.console.log(message);\n\t\t}\n\t};\n\n\tpmw.canLoadPremiumFeatures = () => {\n\t\treturn (pmwDataLayer.version.distro === \"fms\" && pmwDataLayer.version.pro && pmwDataLayer.version.eligible_for_updates) || pmwDataLayer.version.distro === \"wcm\";\n\t};\n\n\t/**\n\t * State if the pmw:dom:ready event has been fired\n\t *\n\t * @type {boolean}\n\t */\n\tlet pmwDomReadyFired = false;\n\n\n\t/**\n\t * Trigger the pmw:dom:ready event\n\t *\n\t * @returns {void}\n\t */\n\tpmw.triggerPmwDomReadyEvent = () => {\n\n\t\t// If the event has already been fired, return\n\t\tif (pmwDomReadyFired) return;\n\n\t\t// If the document is already loaded, fire the event\n\t\tif (document.readyState === \"complete\") {\n\t\t\tfirePmwDomReadyEvent();\n\t\t\treturn;\n\t\t}\n\n\t\t// Continue processing if the DOM has not yet been loaded\n\t\t// and attach the event listener to the DOMContentLoaded,\n\t\t// once through jQuery and once through the native DOM API\n\t\t// to maximize compatibility\n\n\t\t// If jQuery is available, use it to fire add the event listener\n\t\tjQuery(() => {\n\t\t\tfirePmwDomReadyEvent();\n\t\t});\n\n\t\t// Also add the event listener using the native DOM API\n\t\tdocument.addEventListener(\"DOMContentLoaded\", () => {\n\t\t\tfirePmwDomReadyEvent();\n\t\t}, true);\n\t};\n\n\t/**\n\t * Fire the pmw:dom:ready event\n\t *\n\t * @returns {void}\n\t */\n\tconst firePmwDomReadyEvent = () => {\n\n\t\t// If the event has already been fired, return\n\t\tif (pmwDomReadyFired) return;\n\n\t\t// Fire the event\n\t\tdocument.dispatchEvent(new Event(\"pmw:dom:ready\"));\n\n\t\t// Set the flag to true to indicate that the event has been fired\n\t\tpmwDomReadyFired = true;\n\t};\n\n\tpmw.getEmailFromTarget = target => {\n\n\t\t// Only try to add the clicked email if href is set\n\t\tif (target.href) {\n\n\t\t\t// Get the email from the link\n\t\t\t// But only if there is a valid email address in the link\n\t\t\t// Also, the href may contain other parameters, so we need to check for that and remove them\n\t\t\tlet email = target.href.replace(\"mailto:\", \"\");\n\n\n\t\t\tif (email.indexOf(\"?\") > -1) {\n\t\t\t\temail = email.split(\"?\")[0];\n\t\t\t}\n\n\t\t\t// Trim the email and remove all whitespaces\n\t\t\temail = email.replace(/\\s/g, \"\");\n\n\t\t\t// If the email is not empty and valid, add it to the data object\n\t\t\tif (email && pmw.isEmail(email)) {\n\t\t\t\treturn email;\n\t\t\t}\n\t\t}\n\n\t\treturn \"\";\n\t};\n\n\tpmw.sendEventPayloadToServer = payload => {\n\t\tif (typeof pmw.sendEventPayloadToServerPremium === \"function\") {\n\t\t\tpmw.sendEventPayloadToServerPremium(payload);\n\t\t}\n\t};\n\n\t/**\n\t * Waits for all active pixels to load and then triggers the page view event.\n\t *\n\t * @return {Promise<unknown>}\n\t *\n\t * @since 1.49.0\n\t */\n\tpmw.waitForPixelsAndTriggerPageView = async () => {\n\n\t\t// Guard against duplicate page view events (e.g. when consent API re-triggers pmw:load-pixels)\n\t\tif (pmw._pageViewTriggered) {\n\t\t\tpmw.console.log(\"Page view event already triggered, skipping duplicate.\");\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\tpmw._pageViewTriggered = true;\n\n\t\treturn new Promise(resolve => {\n\n\t\t\t// Check if at least one pixel is active in the data layer\n\t\t\tif (!pmwDataLayer?.pixels) {\n\t\t\t\tpmw.console.error(\"pmwDataLayer or pmwDataLayer.pixels is not defined, triggering page view event immediately.\");\n\t\t\t\tdocument.dispatchEvent(new Event(\"pmw:page-view\"));\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet activePixels = pmwDataLayer?.general?.server_2_server?.pageview_event_s2s?.pixels || [];\n\n\t\t\t// This line filters the activePixels array, keeping only those pixel names that exist as keys\n\t\t\t// in the pmwDataLayer.pixels object (i.e., only pixels that are currently defined/active in the data layer)\n\t\t\tactivePixels = activePixels.filter(pixelName => pmwDataLayer.pixels[pixelName]);\n\n\t\t\t// If no pixels to check, trigger event immediately\n\t\t\tif (activePixels.length === 0) {\n\t\t\t\tpmw.console.log(\"No specific pixels to wait for, triggering page view event.\");\n\t\t\t\tdocument.dispatchEvent(new Event(\"pmw:page-view\"));\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if all active pixels are loaded\n\t\t\tconst checkPixelsLoaded = () => {\n\t\t\t\tconst allLoaded = activePixels.every(pixelName =>\n\t\t\t\t\t!pmwDataLayer.pixels[pixelName] || pmwDataLayer.pixels[pixelName].loaded);\n\n\t\t\t\tif (allLoaded) {\n\t\t\t\t\t// pmw.console.log(\"All specified pixels to track s2s page-view events have been loaded. Triggering page-view event.\");\n\t\t\t\t\tdocument.dispatchEvent(new Event(\"pmw:page-view\"));\n\t\t\t\t\tresolve();\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(checkPixelsLoaded, 100);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tcheckPixelsLoaded();\n\t\t});\n\t};\n\n\tpmw.isWooCommerceActive = () => {\n\t\treturn !!pmwDataLayer.shop;\n\t};\n\n\t/**\n\t * Retrieves the product ID associated with a specific pixel.\n\t *\n\t * @param {string} pixelId - The ID of the pixel to get the product ID for.\n\t * @returns {string|null} - The product ID associated with the given pixel ID,\n\t *                          or null if no product ID is found.\n\t */\n\tpmw.getProductIdForSpecificPixel = (product, pixelName) => {\n\t\treturn String(product.dyn_r_ids[pmwDataLayer.pixels[pixelName].dynamic_remarketing.id_type]);\n\t};\n\n\tpmw.isInWooCommerceSesssion = () => {\n\n\t\tif (pmwDataLayer?.shop?.session_active) return true;\n\n\t\tlet regex           = new RegExp(\"woocommerce_cart_hash\");\n\t\tlet wcSessionCookie = pmw.getCookieThatContainsRegex(regex);\n\n\t\tif (wcSessionCookie) return true;\n\n\t\treturn false;\n\t};\n\n\tpmw.isNotInWooCommerceSesssion = () => {\n\t\treturn !pmw.isInWooCommerceSesssion();\n\t};\n\n\tpmw.makeFullUrl = url => {\n\n\t\t// Trim any leading or trailing whitespace\n\t\turl = url.trim();\n\n\t\t// Check if the URL already contains a protocol\n\t\tif (/^(http:\\/\\/|https:\\/\\/)/.test(url)) {\n\t\t\treturn url;\n\t\t}\n\n\t\t// Remove leading slashes\n\t\turl = url.replace(/^\\/+/, \"\");\n\n\t\t// Add 'https://' as default protocol\n\t\treturn \"https://\" + url;\n\t};\n\n\tpmw.registerShowVariationEventListener = () => {\n\t\tlet previousVariationId = null;\n\n\t\tjQuery(\".single_variation_wrap\").on(\"show_variation\", (event, variation) => {\n\n\t\t\t// Abort if lazy loading is enabled\n\t\t\t// if (pmwDataLayer?.general?.lazy_load_pmw) return;\n\n\t\t\ttry {\n\t\t\t\t// If variations_output is disabled, don't fire view_item events from show_variation\n\t\t\t\t// because the parent product view_item is already triggered on page load\n\t\t\t\tif (!pmwDataLayer?.shop?.variations_output) return;\n\n\t\t\t\tlet productId = pmw.getIdBasedOndVariationsOutputSetting(variation.variation_id);\n\n\t\t\t\tif (!productId) throw Error(\"Wasn't able to retrieve a productId\");\n\n\t\t\t\t// If the variation id is not the same as the previous one, run the function\n\t\t\t\tif (previousVariationId !== variation.variation_id) {\n\t\t\t\t\tpmw.triggerViewItemEventPrep(productId);\n\t\t\t\t\tpreviousVariationId = variation.variation_id;\n\t\t\t\t}\n\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t};\n\n\t/**\n\t * Initializes the command queue for the application to ensure that commands\n\t * are queued and executed in a controlled manner. This function sets up\n\t * the underlying mechanism to manage and process commands effectively.\n\t *\n\t * Typically, the command queue is used by external developers\n\t * who want to make sure that their Pixel Manager API calls safely get executed,\n\t * no matter if the initialization order of the Pixel Manager is shuffled,\n\t * delayed, or lazy loaded.\n\t *\n\t * @since 1.49.0\n\t */\n\tpmw.initializeCommandQueue = () => {\n\n\t\tconst queue = window._pmwq = window._pmwq || [];\n\n\t\tqueue.forEach(function (fn) {\n\t\t\tif (typeof fn === \"function\") {\n\t\t\t\ttry {\n\t\t\t\t\tfn();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error(\"Error executing queued command:\", e);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// Override push to execute commands immediately now that PMW is ready\n\t\tqueue.push = function (fn) {\n\t\t\tif (typeof fn === \"function\") {\n\t\t\t\ttry {\n\t\t\t\t\tfn();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tpmw.console.error(\"Error executing command from queue:\", e);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t};\n\n}(window.pmw = window.pmw || {}, jQuery));\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + {\"194\":\"wc-hooks\",\"264\":\"deprecated-functions\",\"526\":\"pixel-facebook\",\"625\":\"consent-management\",\"671\":\"pixel-google\",\"712\":\"pixel-crazyegg\",\"818\":\"pixel-hotjar\",\"968\":\"consent-api\",\"972\":\"doofinder-listener\"}[chunkId] + \".\" + {\"194\":\"c871cc71\",\"264\":\"08bc16f9\",\"526\":\"b4f040d6\",\"625\":\"9d45b6cb\",\"671\":\"2dcfb231\",\"712\":\"badd0e8f\",\"818\":\"c3ec2dc3\",\"968\":\"c33d5439\",\"972\":\"5dc21f92\"}[chunkId] + \".chunk.min.js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/^blob:/, \"\").replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkPixel_Manager_for_WooCommerce\"] = self[\"webpackChunkPixel_Manager_for_WooCommerce\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","/**\n * Run PMW main loader\n */\n\nconst main = async () => {\n\n\trequire(\"./pmw/functions_main\");\n\trequire(\"./version.js\");\n\n\t// Wait until jQuery is loaded\n\tawait pmw.jQueryExists();\n\n\t// Wait until pmwDataLayer is loaded\n\tawait pmw.dataLayerFullyLoaded();\n\n\t/**\n\t * Set webpack public path for chunk loading\n\t * This ensures chunks load correctly even when scripts are combined/moved \n\t * by optimization plugins (SiteGround, Autoptimize, WP Rocket, etc.)\n\t */\n\tif (pmwDataLayer?.general?.chunk_base_path) {\n\t\t// eslint-disable-next-line no-undef, camelcase\n\t\t__webpack_public_path__ = pmwDataLayer.general.chunk_base_path;\n\t}\n\n\t// wait 1000ms\n\t// await new Promise(resolve => setTimeout(resolve, 1000))\n\n\t// Load all essential scripts first\n\trequire(\"./pmw/functions_loader\");\n\n\t// Initialize cross-tab session sync early so that session data\n\t// from existing tabs is available before event listeners run\n\tif (pmw.crossTabSync) {\n\t\tpmw.crossTabSync.init();\n\t\twindow.addEventListener(\"beforeunload\", () => pmw.crossTabSync.cleanup());\n\t}\n\t\n\t// Load new event filtering system\n\trequire(\"./pmw/hooks\");\n\trequire(\"./pmw/pixel-registry\");\n\trequire(\"./pmw/event-processor\");\n\n\t// Initialize command queue early so filters can be registered before events fire\n\tpmw.initializeCommandQueue();\n\n\t// Output PMW console message\n\tpmw.pmwConsoleMessage();\n\n\t// Load the consent management module as a chunk\n\tawait pmw.loadConsentModule();\n\tawait pmw.consent.load();\n\n\t// Doesn't work if we listen to pmw:dom:ready because it runs too late\n\t// (at the end of the main.js file)\n\t// TODO: Find out why that order is important and optimize it. It is also difficult to test. In Cypress it works just with \"pmw:dom:ready\"\n\tjQuery(() => {\n\t\trequire(\"./pmw/event_listeners_on_ready\");\n\t});\n\n\t// Load remaining event listeners\n\trequire(\"./pmw/event_listeners\");\n\t\n\t// Load doofinder listener as a chunk\n\timport(/* webpackChunkName: \"doofinder-listener\" */ \"./pmw/listeners/doofinder\");\n\n\tpmw.loadWcHooksFunctions();\n\n\t// Check if domain is excluded from tracking\n\t// If so, return\n\tif (pmw.excludeDomainFromTracking()) return;\n\n\t// Load pixels dynamically based on configuration\n\tconst pixelLoaders = [];\n\n\t// Load free pixels conditionally\n\tif (pmwDataLayer?.pixels?.google) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-google\" */ \"./pixels/google/loader\")\n\t\t);\n\t}\n\t\n\tif (pmwDataLayer?.pixels?.facebook) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-facebook\" */ \"./pixels/facebook/loader\")\n\t\t);\n\t}\n\t\n\tif (pmwDataLayer?.pixels?.hotjar) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-hotjar\" */ \"./pixels/hotjar/loader\")\n\t\t);\n\t}\n\n\tif (pmwDataLayer?.pixels?.crazyegg) {\n\t\tpixelLoaders.push(\n\t\t\timport(/* webpackChunkName: \"pixel-crazyegg\" */ \"./pixels/crazyegg/loader\")\n\t\t);\n\t}\n\n\t// #if process.env.TIER === 'premium'\n// \t/**\n// \t *  Load premium pixels conditionally\n// \t */\n// \tif (pmw.canLoadPremiumFeatures()) {\n// \t\tpixelLoaders.push(\n// \t\t\timport(/* webpackChunkName: \"pmw-premium-events\" */ \"./pmw/event_listeners_premium\")\n// \t\t);\n// \n// \t\tif (pmwDataLayer?.pixels?.contentsquare) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-contentsquare\" */ \"./pixels/contentsquare/loader\")\n// \t\t\t);\n// \t\t}\n// \n// \t\tif (pmwDataLayer?.pixels?.adroll) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-adroll\" */ \"./pixels/adroll/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.linkedin) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-linkedin\" */ \"./pixels/linkedin/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.bing) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-microsoft\" */ \"./pixels/microsoft-ads/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.outbrain) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-outbrain\" */ \"./pixels/outbrain/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.pinterest) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-pinterest\" */ \"./pixels/pinterest/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.snapchat) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-snapchat\" */ \"./pixels/snapchat/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.taboola) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-taboola\" */ \"./pixels/taboola/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.tiktok) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-tiktok\" */ \"./pixels/tiktok/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.twitter) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-twitter\" */ \"./pixels/twitter/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.reddit) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-reddit\" */ \"./pixels/reddit/loader\")\n// \t\t\t);\n// \t\t}\n// \t\t\n// \t\tif (pmwDataLayer?.pixels?.vwo) {\n// \t\t\tpixelLoaders.push(\n// \t\t\t\timport(/* webpackChunkName: \"pixel-vwo\" */ \"./pixels/vwo/loader\")\n// \t\t\t);\n// \t\t}\n// \t}\n\t// #endif\n\n\t// Load all active pixels in parallel\n\tawait Promise.all(pixelLoaders);\n\n\t/** Load the deprecated functions as a chunk (if enabled) */\n\tif (pmwDataLayer?.general?.modules?.load_deprecated_functions !== false) {\n\t\tconst {loadDeprecatedFunctions} = await import(/* webpackChunkName: \"deprecated-functions\" */ \"./pmw/deprecated.mjs\");\n\t\tloadDeprecatedFunctions();\n\t}\n\n\t// Preload pixels\n\tdocument.dispatchEvent(new Event(\"pmw:load-pixels\"));\n\n\t// Trigger pmwLoad event\n\tdocument.dispatchEvent(new Event(\"pmwLoad\"));\n\n\t// Wait until page is loaded\n\tawait pmw.pageLoaded();\n\n\tdocument.dispatchEvent(new Event(\"pmw:ready\"));\n\tpmw.triggerPmwDomReadyEvent();\n\n\t// Check if the library version matches the PMW version that's installed on the server\n\tpmw.checkLibraryVersion();\n};\n\nmain();\n\n\n\n\n\n\n\n\n"],"names":["leafPrototypes","getProto","inProgress","dataWebpackPrefix","removeHtmlTagsAndWhitespace","string","replace","trim","jQuery","on","event","target","value","id","triggerAddShippingInfoEvent","slug","text","length","checkedShippingMethod","find","val","attr","shippingTier","document","trigger","paymentMethodChangeLogged","triggerAddPaymentInfoEvent","checkedPaymentMethod","paymentType","url","URL","currentTarget","productId","pmw","getProductIdByCartItemKeyUrl","removeProductFromCart","e","console","error","checkoutButtonSelectors","prepareSelectors","paymentMethodSelected","fireCheckoutProgress","fireCheckoutOption","initCart","pmwDataLayer","products","productIds","getAddToCartLinkProductIds","getProductsFromBackend","referrer","retrieveData","referrerHostname","hostname","window","location","host","storeData","gclid","getUrlParameter","wbraid","gbraid","fbclid","Math","floor","Date","now","ttclid","scid","epik","pmw_loaded","shop","page_type","product_type","getMainProductIdFromProductPage","product","getProductDataForViewItemEvent","variations_output","order","isOrderIdStored","writeOrderIdToStorage","key","acrRemoveCookie","user","hasLoginEventFired","setLoginEventFired","account_just_created","hasAccountCreatedEventFired","setAccountCreatedEventFired","general","lazy_load_pmw","registerShowVariationEventListener","$variationForm","selectedValues","toArray","every","select","productVariations","data","matchingVariation","variation","Object","entries","attributes","triggerViewItemEventPrep","variation_id","async","log","payload","processEvent","server_2_server","pageview_event_s2s","is_active","pageViewS2SPixels","pixelRegistry","getPixelsWithCapability","s2sData","pixelName","pixels","keys","sendEventPayloadToServer","isWooCommerceActive","startIntersectionObserverToWatch","startProductsMutationObserverToWatch","waitForPixelsAndTriggerPageView","require","loadConsentModule","consentModule","consent","apiModule","api","crossTabSync","message","objects","isLoggerEnabled","urlLoggerOff","sessionLoggerEnabled","urlLoggerOn","logger","urlHasParameter","util","ipRange_1","dot","mappedIpv4","colon","doubleColon","getIpv6Segments","ip","isIPv6","Error","test","matches","match","isIPv4","prefix","parts","split","map","x","parseInt","toString","mappedIpv4ToIpv6","_a","beforeChunk","afterChunk","beforeParts","afterParts","missingSegments","Array","concat","createChecker","subnetOrSubnets","isArray","checks_1","subnet","createSegmentChecker","address","segments","some","check","subnetAddress","prefixLengthString","prefixLength","Number","isInteger","subnetSegments","addressSegments","i","bitCount","min","exports","specialNetsCache","default","private","ipv6","localhost","Boolean","reserved","__spreadArrays","jQueryExists","Promise","resolve","waitForjQuery","setTimeout","waitForLibrary","library","timeout","interval","startTime","dataLayerFullyLoaded","checkVar","waitForVar","version","logTimeoutId","then","clearTimeout","wpHooksExists","wp","hooks","loadWcHooksFunctions","filters","addFilter","hookName","namespace","callback","priority","this","push","sort","a","b","applyFilters","args","filteredValue","filter","result","warn","removeFilter","initialLength","f","removeAllFilters","hasFilter","getFilters","IPv4","IPv6","util_1","isInSubnet","subnetsByVersion","reduce","acc","isIP","check4","check6","isIPv4MappedAddress","extractMappedIpv4","enumerable","get","isPrivate","isLocalhost","isReserved","isSpecial","LOCALSTORAGE_KEY","SESSION_DATA_PREFIX","MSG","EXCLUDED_KEYS","Set","_isSyncing","_channel","_initialized","isSyncableKey","has","isSyncing","readAllSessionData","main","extensions","sessionStorage","mainRaw","getItem","JSON","parse","storageKey","startsWith","suffix","substring","mergeRemoteData","remoteSnapshot","filteredRemote","filtered","filterSyncableData","localRaw","localData","merged","setItem","stringify","remoteData","extKey","sendMessage","postMessage","localStorage","removeItem","handleMessage","type","extension","broadcastUpdate","init","BroadcastChannel","onmessage","addEventListener","newValue","cleanup","close","getConsentContext","categories","statistics","marketing","preferences","necessary","visitor_has_chosen","settings","visitorHasChosen","explicit_mode","explicitConsentModeActive","getEventContext","timestamp","href","makeFullUrl","user_agent","navigator","userAgent","user_id","raw","eventName","eventData","event_data","context","activePixels","getProcessablePixels","adapter","getAdapter","adapt","pixelData","firing","getFiringDecision","dispatchToPixels","dispatchUnifiedEvent","dispatchPublicEvent","active","extractS2SData","skip_empty_events","serverPixels","getPixelsForServerFiring","processablePixels","firingStatus","dispatchToBrowserPixels","browserPixels","getActiveBrowserOnlyPixels","browserEventName","dispatchToS2SPixels","s2sPixels","getActiveS2SPixels","s2sEventName","publicEventName","shouldFireBrowserPixel","fire_browser","shouldFireServerPixel","fire_server","adapters","registerAdapter","options","pixelCapabilities","defaultMode","supportsS2S","mode","supportsEventDeduplication","isActive","$","undefined","isRange","isV4","isV6","getIpVersion","ipDetectionPromise","ipDetectionResolved","ipServices","fetchWithTimeout","timeoutMs","controller","AbortController","timeoutId","abort","fetch","signal","finally","getGeoInfo","cloudflare","response","ok","status","obj","pair","loc","processRegion","countryCode","service","geojs","json","country_code","region","ipinfo","country","ipapi","consent_management","restricted_regions","includes","isVisitorAllowed","isBotUserAgent","ip_exclude_list","getIp","isOnIpExclusionList","isValidIpAddress","isPrivateOrReservedIp","privateRanges","range","second","getClientIp","cachedIp","ipv6Promise","getIpWithTimeout","anyPromise","ipv6Result","anyResult","allSettled","ipVersion","race","_","reject","catch","maxServicesToCheck","validVersions","join","ipv","getIpFromAnyService","getBrowserGeoFromExternalService","performance","promises","forEach","any","toUpperCase","regionCode","toFixed","getBrowserGeo","geoFromStorage","geoInfo","gepLocationByTimeZone","getBrowserLocationByTimeZone","geoLocation","getLocationByTimeZone","ipServicesFiltered","slice","getIpFromService","timeTaken","serviceResponseData","isVisitorNotAllowed","botPatterns","getBotPatterns","pattern","toLowerCase","customPatterns","user_agent_exclude_patterns","isCidr","ipName","ipExcludeList","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","ipv4","addToCartSelectors","quantity","dataset","product_id","addProductToCart","indexOf","each","index","element","classes","getPostIdFromString","one","closest","origin","searchParams","nextAll","getIdBasedOndVariationsOutputSetting","getProductDetailsFormattedForEvent","isEmail","emailSelected","getProductIdByCartItemElement","getProductQuantityByCartItemElement","cart","getCartItemsFromBackend","getLibraryVersion","checkLibraryVersion","number","VALID_FIRING_MODES","getActivePixels","capabilities","getS2SConfiguredPixels","configuredPixels","always_send_s2s","isConfigured","allPixels","from","capabilityName","pixelsWithCapability","getFiringMode","s2sEnabled","alwaysSendS2S","decision","getPixelsForBrowserFiring","v4Seg","v4Str","IPv4Reg","RegExp","v6Seg","IPv6Reg","s","ipv4ToLong","octets","createLongChecker","addressLong","subnetLong","expandIPv6","ipaddr","ipv4Part","ipv4Regexes","ipv6Part","ipv6Regexes","matchCIDR","zoneIndex","module","first","partSize","cidrBits","part","shift","subnetMatch","rangeList","defaultName","k","len","rangeName","rangeSubnets","kind","apply","octet","prototype","toNormalizedString","toByteArray","other","cidrRange","ref","SpecialRanges","unspecified","broadcast","multicast","linkLocal","loopback","carrierGradeNat","toIPv4MappedAddress","prefixLengthFromSubnetMask","cidr","stop","zeros","zerotable","fourOctet","longValue","parser","parseIntAuto","results","reverse","zoneId","l","toRFC5952String","bestMatchIndex","bestMatchLength","regex","exec","bytes","addr","call","toFixedLengthString","padStart","uniqueLocal","ipv4Mapped","rfc6145","rfc6052","teredo","toIPv4Address","high","low","transitional","colonCount","lastColon","replacement","replacementCount","lastIndexOf","substr","isValid","error1","isValidFourPartDecimal","parseCIDR","maskLength","parsed","defineProperty","subnetMaskFromPrefixLength","filledOctetCount","j","pow","broadcastAddressFromCIDR","ipInterfaceOctets","subnetMaskOctets","networkAddressFromCIDR","fromByteArray","process","commonjsGlobal","normalize","_validate","nh","sections","n","h","ns","hs","_leftPad","abbreviate","zPreviousFlag","zeroStartIndex","zeroLength","zStartIndex","zLength","section","zFlag","splice","d","p","padding","repeat","_hex2bin","hex","_bin2hex","bin","_addr2bin","binAddr","_bin2addr","binPart","hexSection","divideSubnet","mask0","mask1","limit","abbr","ret","binNetPart","binHostPart","numSubnets","binSubnet","hexAddr","binStartAddr","binEndAddr","start","end","size","randomSubnet","random","ptr","mask","err","inRange","check_range","ip6","range_data","parse_addr","parse_range","storeIP","displayIP","pmwRestSettings","isBelowRestErrorThreshold","isRestEndpointAvailable","testEndpoint","root","cookieName","method","cache","keepalive","redirect","responseJson","success","isPmwRestEndpointAvailable","orderId","orderKey","source","orderIds","storeOrderIdOnServer","order_duplication_prevention","email","quantityToRemove","storeCartData","is_variation","parent_id","selectors","doesWooCommerceCartExist","retrieveCartData","saveCartObjectToDataLayer","ajax_url","body","URLSearchParams","action","cart_item_keys","assign","page_id","product_ids","headers","statusText","responseData","cartObject","triggerViewItemEvent","triggerViewItemEventNoProduct","step","checkout_option","triggerViewItemList","viewItemListTriggerTestMode","css","append","view_item_list_trigger","opacity","background_color","getSearchTermFromUrl","search","io","ioTimeouts","observerCallback","observer","entry","elementId","next","isIntersecting","test_mode","unobserve","remove","ioid","detectedProductTemplateClasses","nested","flat","isNestedClass","elem","className","isFlatClass","prev","hasClass","getAllElementsToWatch","getCommonIdentifiersToWatch","listOfClassNames","haveSameNestingDepth","element1","element2","parents","findCommonParentElement","parent","is","node","countOfChildren","getCommonClass","classes1","classes2","pmwProductIds","querySelectorAll","productsNode","firstChildClassAttr","children","firstChildClasses","secondChildClassAttr","commonClass","firstProductTemplateClasses","IntersectionObserver","threshold","observe","productsMutationObserver","childList","characterData","MutationObserver","mutations","mutation","newNodes","addedNodes","hasPmwProductIdElement","siblings","setCookie","cookieValue","expiryDays","setTime","getTime","expires","toUTCString","cookie","getCookie","name","ca","decodeURIComponent","c","charAt","getCookieThatContainsRegex","cookies","deleteCookie","persistent","dataGetter","getPersistentData","getSessionData","dataSetter","setPersistentData","setSessionData","deleteDataKey","getPersistentDataKey","getSessionDataKey","defaultStorageKey","storageKeySuffix","order_id","orderDetails","order_key","cartItemKey","dyn_r_ids","list_name","brand","category","variant","list_position","position","price","currency","is_variable","parent_id_dyn_r_ids","getClidFromBrowser","clidId","clidCookieId","dclid","getUserAgent","getViewPort","width","max","documentElement","clientWidth","innerWidth","height","clientHeight","innerHeight","consoleLogVersion","loadedScripts","loadScriptAndCacheIt","fallbackUrl","loadScript","scriptUrl","querySelector","add","script","createElement","src","crossOrigin","onload","onerror","head","appendChild","getOrderItemPrice","orderItem","total","total_tax","loginEventFired","accountCreatedEventFired","pageLoaded","readyState","pageReady","isMiniCartActive","parameter","hashAsync","algo","str","crypto","subtle","digest","TextEncoder","encode","buf","Uint8Array","getCartValue","doesUrlContainPatterns","patterns","excludeDomainFromTracking","exclude_domains","domain","debug","getRandomEventId","pmwConsoleMessage","pro","distro","eligible_for_updates","show","canLoadPremiumFeatures","pmwDomReadyFired","triggerPmwDomReadyEvent","firePmwDomReadyEvent","dispatchEvent","Event","getEmailFromTarget","sendEventPayloadToServerPremium","_pageViewTriggered","checkPixelsLoaded","loaded","getProductIdForSpecificPixel","String","dynamic_remarketing","id_type","isInWooCommerceSesssion","session_active","isNotInWooCommerceSesssion","previousVariationId","initializeCommandQueue","queue","_pmwq","fn","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","m","getPrototypeOf","t","__esModule","create","r","def","current","getOwnPropertyNames","definition","o","chunkId","all","u","g","globalThis","Function","prop","hasOwnProperty","done","needAttach","scripts","getElementsByTagName","getAttribute","charset","nc","setAttribute","onScriptComplete","doneFns","parentNode","removeChild","bind","Symbol","toStringTag","importScripts","currentScript","tagName","installedChunks","installedChunkData","promise","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","chunkLoadingGlobal","self","chunk_base_path","__webpack_public_path__","load","pixelLoaders","google","facebook","hotjar","crazyegg","modules","load_deprecated_functions","loadDeprecatedFunctions"],"ignoreList":[],"sourceRoot":""}
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/readme.txt

    r3451824 r3468312  
    55Tested up to: 6.9
    66Requires PHP: 7.3
    7 Stable tag: 1.56.0
     7Stable tag: 1.57.0
    88License: GPLv3 or later
    99License URI: http://www.gnu.org/licenses/gpl-3.0.html
     
    328328== Changelog ==
    329329
     330= 1.57.0  =
     331*Release date - 24.02.2026*
     332
     333* New: Implemented account created event tracking
     334* New: Added Abilities API integration
     335* Tweak: Implement cross-tab session synchronization for improved data consistency
     336* Tweak: Added modern styling and impact indicators to opportunity cards
     337* Tweak: Bumped up WC version compatibility to 10.5
     338* Tweak: Enhanced GTG Proxy: Improved config resilience, reduced unnecessary health check requests, and added periodic config refresh
     339* Tweak: Implemented REST API for saving settings via AJAX; refactored admin tabs and enhance section rendering
     340* Tweak: Update styles for impact badges and add Google Automated Discounts and Customer Reviews opportunities
     341
    330342= 1.56.0  =
    331343*Release date - 02.02.2026*
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/vendor/composer/autoload_static.php

    r3219444 r3468312  
    1414
    1515    public static $prefixLengthsPsr4 = array (
    16         'l' => 
     16        'l' =>
    1717        array (
    1818            'libphonenumber\\' => 15,
    1919        ),
    20         'S' => 
     20        'S' =>
    2121        array (
    2222            'Symfony\\Polyfill\\Mbstring\\' => 26,
     
    2424            'Swpm\\WoocommercePixelManager\\' => 29,
    2525        ),
    26         'G' => 
     26        'G' =>
    2727        array (
    2828            'Giggsey\\Locale\\' => 15,
     
    3131
    3232    public static $prefixDirsPsr4 = array (
    33         'libphonenumber\\' => 
     33        'libphonenumber\\' =>
    3434        array (
    3535            0 => __DIR__ . '/..' . '/giggsey/libphonenumber-for-php/src',
    3636        ),
    37         'Symfony\\Polyfill\\Mbstring\\' => 
     37        'Symfony\\Polyfill\\Mbstring\\' =>
    3838        array (
    3939            0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
    4040        ),
    41         'Symfony\\Polyfill\\Iconv\\' => 
     41        'Symfony\\Polyfill\\Iconv\\' =>
    4242        array (
    4343            0 => __DIR__ . '/..' . '/symfony/polyfill-iconv',
    4444        ),
    45         'Swpm\\WoocommercePixelManager\\' => 
     45        'Swpm\\WoocommercePixelManager\\' =>
    4646        array (
    4747            0 => __DIR__ . '/../..' . '/src',
    4848        ),
    49         'Giggsey\\Locale\\' => 
     49        'Giggsey\\Locale\\' =>
    5050        array (
    5151            0 => __DIR__ . '/..' . '/giggsey/locale/src',
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/vendor/composer/installed.php

    r3451824 r3468312  
    44        'pretty_version' => 'dev-master',
    55        'version' => 'dev-master',
    6         'reference' => '3656eba32544289ea9284f47927508bff8d76edc',
     6        'reference' => '0b9db2f4cdcb40177ed1bbf772f19736e918838e',
    77        'type' => 'wordpress-plugin',
    88        'install_path' => __DIR__ . '/../../',
     
    5656            'pretty_version' => 'dev-master',
    5757            'version' => 'dev-master',
    58             'reference' => '3656eba32544289ea9284f47927508bff8d76edc',
     58            'reference' => '0b9db2f4cdcb40177ed1bbf772f19736e918838e',
    5959            'type' => 'wordpress-plugin',
    6060            'install_path' => __DIR__ . '/../../',
  • woocommerce-google-adwords-conversion-tracking-tag/trunk/wgact.php

    r3451824 r3468312  
    1111 * Text Domain:          woocommerce-google-adwords-conversion-tracking-tag
    1212 * Domain path:          /languages
    13  * Version:              1.56.0
     13 * Version:              1.57.0
    1414 *
    1515 * WC requires at least: 3.7
    16  * WC tested up to:      10.2
     16 * WC tested up to:      10.5
    1717 *
    1818 * License:              GNU General Public License v3.0
     
    2323defined('ABSPATH') || exit; // Exit if accessed directly
    2424
    25 $pmw_version     = '1.56.0';
     25$pmw_version     = '1.57.0';
    2626$plugin_basename = plugin_basename(__FILE__);
    2727
Note: See TracChangeset for help on using the changeset viewer.