{
  "version": 3,
  "sources": ["/cdn/shop/t/16/assets/soulyshine-customily-crm-events.js?sscrm=20260815-3"],
  "sourcesContent": ["(function () {\n  'use strict';\n\n  if (window.__soulyshineCustomilyCrmEventsInstalled) return;\n  window.__soulyshineCustomilyCrmEventsInstalled = true;\n\n  var rootSelector = '#customily-options, .customily-main-app, .customily-options-wrapper, .customily_gallery';\n  var variantSelector = 'variant-selects, variant-radios, .product-form__input, .product-form__input--option-material, [data-variant-picker], [data-option-selector]';\n  var previewSelector = '.customily_gallery_media, .customily_gallery .canvas-container, .customily_gallery canvas, .customily_gallery img, [class*=\"customily\"] img';\n  var atcSelector = 'button[name=\"add\"], button.product-form__submit, [data-add-to-cart]';\n  var previewUploadEndpoint = 'https://soulyshine-crm-v2-ingest.teeomega-mail.workers.dev/v2/preview-images/';\n  var trackingConfigEndpoint = 'https://soulyshine-crm-v2-ingest.teeomega-mail.workers.dev/v2/storefront-config';\n  var pendingCartStorageKey = 'sscrm_pending_cart_snapshot_v2';\n  var OBSERVER_DEBOUNCE_MS = 200;\n  var HANDLER_BUDGET_MS = 5;\n  var LONG_TASK_BUDGET_MS = 50;\n  var CONFIG_REFRESH_MS = 60000;\n  var state = {\n    enabled: false,\n    initialized: false,\n    disabledReason: 'config_pending',\n    previewObserver: null,\n    observerTimer: 0,\n    observerRootTimer: 0,\n    configTimer: 0,\n    started: false,\n    previewRequested: false,\n    previewCycle: 0,\n    previewCreatedCycle: 0,\n    previewCompletedCycles: {},\n    lastPreviewClickAt: 0,\n    previewVisible: false,\n    saved: false,\n    lastPayloads: {},\n    changeTimer: 0,\n    lastAtcSnapshotAt: 0,\n    lastPreviewUrl: '',\n    lastMaterial: '',\n    customerSelectionValues: {},\n    customerSelectionNames: {},\n    customerSelectionOwners: {},\n    customerSelectionOrder: [],\n    activeBreedSlot: 0,\n    snapshotSequence: 0,\n    previewSnapshots: {},\n    previewUploads: {},\n    previewUrlSyncs: {},\n    previewCompletingCycles: {},\n    pendingCartRecovery: false,\n    prewarmedPreview: null,\n    prewarmPreviewPromise: null,\n    lastTrustedInteractionAt: 0,\n    budgetBreaches: {},\n    previewCapturePausedUntil: 0\n  };\n\n  function trackingAllowed() {\n    return state.enabled && window.__soulyshineCrmDisabled !== true;\n  }\n\n  function stopPreviewObserver() {\n    window.clearTimeout(state.observerTimer);\n    window.clearTimeout(state.observerRootTimer);\n    state.observerTimer = 0;\n    state.observerRootTimer = 0;\n    if (state.previewObserver) state.previewObserver.disconnect();\n    state.previewObserver = null;\n  }\n\n  function disableTracking(reason) {\n    state.enabled = false;\n    state.disabledReason = clean(reason || 'disabled', 120);\n    state.previewRequested = false;\n    stopPreviewObserver();\n    window.clearTimeout(state.changeTimer);\n    state.changeTimer = 0;\n  }\n\n  function runBudgeted(label, task) {\n    if (!trackingAllowed()) return;\n    var clock = window.performance && typeof window.performance.now === 'function'\n      ? window.performance\n      : { now: Date.now };\n    var startedAt = clock.now();\n    try {\n      var result = task();\n      if (result && typeof result.catch === 'function') result.catch(function () {});\n    } catch (_error) {\n      return;\n    }\n    var elapsed = clock.now() - startedAt;\n    if (elapsed > HANDLER_BUDGET_MS) {\n      state.budgetBreaches[label] = (state.budgetBreaches[label] || 0) + 1;\n    }\n    if (elapsed >= LONG_TASK_BUDGET_MS) {\n      // Protect the storefront by pausing image work only. Never disable event\n      // tracking or interfere with Customily/Shopify after one slow task.\n      state.previewCapturePausedUntil = Date.now() + 60000;\n      stopPreviewObserver();\n    } else if (elapsed > HANDLER_BUDGET_MS && /^(?:click|change|input|option_click|preview_mutation)$/i.test(label)) {\n      // Polling retries remain active, so stopping the observer reduces DOM work\n      // without losing the Preview lifecycle or touching the commerce action.\n      stopPreviewObserver();\n    }\n  }\n\n  function deferTracking(label, task, delay) {\n    return window.setTimeout(function () {\n      runBudgeted(label, task);\n    }, Math.max(0, delay || 0));\n  }\n\n  function deferIdle(label, task, timeout) {\n    if (!trackingAllowed()) return;\n    if (typeof window.requestIdleCallback === 'function') {\n      window.requestIdleCallback(function () {\n        runBudgeted(label, task);\n      }, { timeout: timeout || 1000 });\n      return;\n    }\n    deferTracking(label, task, 0);\n  }\n\n  function clean(value, maxLength) {\n    if (value === undefined || value === null) return '';\n    return String(value).replace(/\\s+/g, ' ').trim().slice(0, maxLength || 256);\n  }\n\n  function normalizedName(field) {\n    return clean(field && field.name, 256)\n      .replace(/[\\u200B-\\u200D\\uFEFF]/g, '')\n      .toLowerCase();\n  }\n\n  function canonicalLabel(value) {\n    return clean(value, 256)\n      .replace(/^option\\s+\\d+\\s+of\\s+\\d+\\s*/i, '')\n      .replace(/\\s*\\(\\s*\\d+\\s*[|/]\\s*\\d+\\s*\\)\\s*\\*?\\s*required\\s*$/i, '')\n      .replace(/\\s*\\*+\\s*required\\s*$/i, '')\n      .replace(/\\s+/g, ' ')\n      .trim();\n  }\n\n  function propertyLabel(field) {\n    var name = clean(field && field.name, 256).replace(/[\\u200B-\\u200D\\uFEFF]/g, '');\n    var match = name.match(/^properties\\[(.*)\\]$/i);\n    return match ? canonicalLabel(match[1]) : '';\n  }\n\n  function isUsableField(field) {\n    if (!field || field.disabled) return false;\n    if ((field.type === 'radio' || field.type === 'checkbox') && !field.checked) return false;\n    return true;\n  }\n\n  function fields() {\n    return Array.prototype.slice.call(document.querySelectorAll(\n      '#customily-options input, #customily-options select, #customily-options textarea, ' +\n      'form[action*=\"/cart/add\"] input, form[action*=\"/cart/add\"] select, ' +\n      'form[action*=\"/cart/add\"] textarea, input[name=\"Material\"], select[name=\"Material\"], ' +\n      'input[name=\"options[Material]\"], select[name=\"options[Material]\"], ' +\n      'input[name=\"properties[_customily-preview]\"], input[name=\"properties[_customily-thumb]\"]'\n    )).filter(isUsableField);\n  }\n\n  // This is deliberately scoped to Customily controls. It is evaluated only\n  // when Preview/Add to cart is clicked, never while the customer is typing,\n  // and never prevents the commerce action. It only decides whether CRM may\n  // commit a snapshot of the customer's personalization.\n  function customilyFormFields() {\n    return Array.prototype.slice.call(document.querySelectorAll(\n      '#customily-options input, #customily-options select, #customily-options textarea, ' +\n      '.customily-main-app input, .customily-main-app select, .customily-main-app textarea, ' +\n      '.customily-options-wrapper input, .customily-options-wrapper select, .customily-options-wrapper textarea'\n    )).filter(function (field) {\n      return field && !field.disabled && field.type !== 'hidden';\n    });\n  }\n\n  function requiredCustomilyField(field) {\n    if (!field || field.disabled) return false;\n    if (field.required || field.getAttribute('aria-required') === 'true' || field.getAttribute('data-required') === 'true') return true;\n    var rawName = clean(field.name, 500);\n    if (/\\*\\s*required\\s*\\]?$/i.test(rawName)) return true;\n    var container = field.closest && field.closest('.customily-option, .customily-option-group, [data-required], [class*=\"customily-option\"], fieldset');\n    if (!container) return false;\n    if (container.getAttribute('data-required') === 'true' || container.getAttribute('aria-required') === 'true') return true;\n    var label = container.querySelector('legend, .customily-option-label, [class*=\"label\"], label');\n    return Boolean(label && /(?:\\*\\s*required|\\*\\s*$|\\brequired\\b)/i.test(clean(label.textContent, 500)));\n  }\n\n  function completedRequiredCustomilyField(field, allFields) {\n    if (!field || field.disabled) return true;\n    if (field.type === 'radio') {\n      return allFields.some(function (candidate) {\n        return candidate.type === 'radio' && candidate.name === field.name && candidate.checked;\n      });\n    }\n    if (field.type === 'checkbox') return Boolean(field.checked);\n    if (field.type === 'file') return Boolean(field.files && field.files.length);\n    if (field.validity && field.validity.valid === false) return false;\n    return meaningfulValue(field.value);\n  }\n\n  function hasIncompleteRequiredCustomilyFields() {\n    var allFields = customilyFormFields();\n    return allFields.some(function (field) {\n      return requiredCustomilyField(field) && !completedRequiredCustomilyField(field, allFields);\n    });\n  }\n\n  function meaningfulValue(value) {\n    return Boolean(value) &&\n      !/^(?:choose|select|please choose)(?:\\s|$)/i.test(value) &&\n      !/^(?:selected|checked|on)$/i.test(value);\n  }\n\n  function canonicalMaterial(value) {\n    var text = clean(value, 500).toLowerCase().replace(/[^a-z0-9]+/g, ' ').trim();\n    if (!text) return '';\n    if (text.indexOf('18k rose gold vermeil') >= 0 || text.indexOf('rose gold vermeil') >= 0) return '18K Rose Gold Vermeil';\n    if (text.indexOf('white gold vermeil') >= 0) return 'White Gold Vermeil';\n    if (text.indexOf('10k solid gold') >= 0) return '10K Solid Gold';\n    if (text.indexOf('925 sterling silver') >= 0 || text.indexOf('sterling silver') >= 0) return '925 Sterling Silver';\n    if (text.indexOf('18k gold vermeil') >= 0 || text.indexOf('gold vermeil') >= 0) return '18K Gold Vermeil';\n    if (text.indexOf('18k gold plated') >= 0 || text.indexOf('gold plated') >= 0) return '18K Gold Plated';\n    if (text.indexOf('silver plated') >= 0) return 'Silver Plated';\n    return '';\n  }\n\n  function breedSlotFromLabel(value) {\n    var label = clean(value, 200);\n    var numbered = label.match(/choose\\s+(?:(?:dog|cat)\\s+)?breed\\s*#?\\s*(\\d+)/i);\n    var ordinal = label.match(/choose\\s+(\\d+)(?:st|nd|rd|th)\\s+(?:(?:dog|cat)\\s+)?breed/i);\n    return Number(numbered && numbered[1] || ordinal && ordinal[1] || 0);\n  }\n\n  function isBreedMenuValue(value) {\n    return /^(?:[a-z](?:\\s*[-\u2013]\\s*[a-z])?\\s+(?:dog|cat)\\s+breeds?|choose\\s+breed|select\\s+breed)$/i.test(clean(value, 200));\n  }\n\n  function breedSlotFromContext(field) {\n    var node = field && field.parentElement;\n    var depth = 0;\n    while (node && depth < 6 && !node.matches(rootSelector)) {\n      var directLabels = Array.prototype.slice.call(node.children || []).filter(function (child) {\n        return /^(LABEL|LEGEND|H2|H3|H4|P)$/i.test(child.tagName || '') || /label|title|heading/i.test(child.className || '');\n      });\n      for (var index = 0; index < directLabels.length; index += 1) {\n        var slot = breedSlotFromLabel(directLabels[index].textContent);\n        if (slot) return slot;\n      }\n      node = node.parentElement;\n      depth += 1;\n    }\n    return 0;\n  }\n\n  function displayLabel(field, index) {\n    var label = propertyLabel(field);\n    if (!label) label = clean(field.getAttribute && (field.getAttribute('aria-label') || field.getAttribute('data-label')), 100);\n    if (!label && field.labels && field.labels.length) label = clean(field.labels[0].textContent, 100);\n    if (!label && field.closest) {\n      var group = field.closest('.customily-option, .customily-option-group, fieldset, [class*=\"option\"]');\n      var groupLabel = group && group.querySelector('legend, .customily-option-label, [class*=\"label\"], label');\n      if (groupLabel) label = clean(groupLabel.textContent, 100);\n    }\n    if (!label) {\n      label = clean(field.name, 100)\n        .replace(/^properties\\[/i, '')\n        .replace(/\\]$/u, '')\n        .replace(/^_customily[_-]*/i, '')\n        .replace(/[_-]+/g, ' ');\n    }\n    label = canonicalLabel(label) || ('Option ' + (index + 1));\n    var slot = /breed/i.test(label) ? breedSlotFromContext(field) : 0;\n    if (slot && !/(?:#|number|no\\.?\\s*)\\s*\\d+/i.test(label)) {\n      label = 'Choose breed #' + slot + ' \u00B7 ' + label;\n    }\n    return label;\n  }\n\n  function assetName(value) {\n    var source = clean(value, 2048);\n    if (!source) return '';\n    try {\n      source = decodeURIComponent(new URL(source, window.location.href).pathname.split('/').pop() || '');\n    } catch (_error) {\n      source = source.split(/[?#]/)[0].split('/').pop() || '';\n    }\n    source = source\n      .replace(/\\.(?:avif|gif|jpe?g|png|svg|webp)$/i, '')\n      .replace(/(?:[-_]\\d+x\\d+|[-_]thumb(?:nail)?|[-_]small|[-_]medium|[-_]large)$/i, '')\n      .replace(/[_-]+/g, ' ')\n      .trim();\n    if (!meaningfulValue(source) || /^(?:customily|image|option|thumbnail|preview)$/i.test(source)) return '';\n    if (/^[a-f0-9]{16,}$/i.test(source.replace(/\\s+/g, ''))) return '';\n    return clean(source, 500);\n  }\n\n  // Customily's option-art CDN commonly uses an opaque UUID-like asset ID\n  // (for example `g1 f94fc7f4 deb9 41e3 8e5b eff784fd74fa`). It is never a\n  // customer-facing breed and must not become analytics evidence.\n  function opaqueCustomilyAssetId(value) {\n    var text = clean(value, 500);\n    return /^(?:[a-z]+\\d*[\\s_-]+)?[a-f0-9]{8}(?:[\\s_-]+[a-f0-9]{4}){3}[\\s_-]+[a-f0-9]{12}$/i.test(text) ||\n      /^[a-f0-9]{16,}$/i.test(text.replace(/[\\s_-]+/g, ''));\n  }\n\n  function exactValueFromNode(node) {\n    if (!node || !node.getAttribute) return '';\n    var attributes = [\n      'data-option-name', 'data-name', 'data-title', 'data-alt',\n      'alt', 'title', 'aria-label'\n    ];\n    for (var index = 0; index < attributes.length; index += 1) {\n      var candidate = clean(node.getAttribute(attributes[index]), 500);\n      if (meaningfulValue(candidate)) return candidate;\n    }\n    var image = /^(?:IMG|SOURCE)$/i.test(node.tagName || '') ? node : node.querySelector && node.querySelector('img, source');\n    if (image) {\n      for (var imageIndex = 0; imageIndex < attributes.length; imageIndex += 1) {\n        var imageCandidate = clean(image.getAttribute(attributes[imageIndex]), 500);\n        if (meaningfulValue(imageCandidate)) return imageCandidate;\n      }\n      var filename = assetName(image.currentSrc || image.src || image.getAttribute('srcset'));\n      if (filename) return filename;\n    }\n    var dataValue = clean(node.getAttribute('data-value'), 500);\n    if (/^https?:\\/\\//i.test(dataValue)) dataValue = assetName(dataValue);\n    if (\n      meaningfulValue(dataValue) &&\n      !/^[a-f0-9-]{24,}$/i.test(dataValue.replace(/\\s+/g, ''))\n    ) return dataValue;\n    return '';\n  }\n\n  function thumbnailValue(field, interactionTarget) {\n    var nodes = [];\n    if (interactionTarget && interactionTarget.closest) {\n      nodes.push(interactionTarget);\n      nodes.push(interactionTarget.closest('label, [role=\"option\"], .customily-option, .customily-option-group, [class*=\"thumbnail\"], [class*=\"swatch\"]'));\n    }\n    if (field && field.closest) {\n      nodes.push(field.closest('label, [role=\"option\"], .customily-option, .customily-option-group, [class*=\"thumbnail\"], [class*=\"swatch\"]'));\n    }\n    for (var index = 0; index < nodes.length; index += 1) {\n      var candidate = exactValueFromNode(nodes[index]);\n      if (candidate) return candidate;\n    }\n    return '';\n  }\n\n  // Customily breed tiles frequently expose the library name (for example\n  // `P-R Dog Breeds`) in data-option-name while the clicked image filename is\n  // the actual selected breed. Read that filename only from the customer's\n  // click target; never scan gallery/product images or infer a default.\n  function clickedTileAssetValue(target) {\n    if (!target || !target.closest) return '';\n    var node = target.closest('img, label, [role=\"option\"], .customily-option, .customily-option-group, [class*=\"thumbnail\"], [class*=\"swatch\"]');\n    var image = node && (/^IMG$/i.test(node.tagName || '') ? node : node.querySelector && node.querySelector('img'));\n    if (!image) return '';\n    var value = assetName(image.currentSrc || image.src || image.getAttribute('srcset'));\n    return meaningfulValue(value) && !isBreedMenuValue(value) && !opaqueCustomilyAssetId(value) ? value : '';\n  }\n\n  function displaySelection(field, interactionTarget) {\n    if (field.tagName === 'SELECT' && field.selectedIndex >= 0) {\n      return {\n        value: clean(field.options[field.selectedIndex] && field.options[field.selectedIndex].textContent, 500) || clean(field.value, 500),\n        source: 'selected_option'\n      };\n    }\n    if (field.type === 'radio' || field.type === 'checkbox') {\n      var thumbnail = thumbnailValue(field, interactionTarget);\n      if (thumbnail) return { value: thumbnail, source: 'thumbnail_name' };\n      var labelValue = field.labels && field.labels.length\n        ? clean(field.labels[field.labels.length - 1].textContent, 500)\n        : '';\n      if (meaningfulValue(labelValue)) return { value: labelValue, source: 'option_label' };\n      var controlValue = clean(field.value, 500);\n      return { value: meaningfulValue(controlValue) ? controlValue : '', source: 'control_value' };\n    }\n    if (field.type === 'file') return { value: field.files && field.files.length ? 'Uploaded' : '', source: 'file_state' };\n    return { value: clean(field.value, 500), source: 'input_value' };\n  }\n\n  function displayValue(field) {\n    return displaySelection(field, null).value;\n  }\n\n  function rememberCustomerSelection(field, interactionTarget) {\n    if (!field || !/^(INPUT|SELECT|TEXTAREA)$/i.test(field.tagName || '')) return;\n    var list = fields();\n    var index = list.indexOf(field);\n    var fieldIndex = index >= 0 ? index : state.customerSelectionOrder.length;\n    var baseLabel = displayLabel(field, fieldIndex);\n    var selection = displaySelection(field, interactionTarget);\n    var value = selection.value;\n    // A first-level \"A Dog Breeds\" / \"P-R Cat Breeds\" control is a library\n    // selector, not the customer's actual breed. Its adjacent dropdown owns\n    // the final selected value. Never use the library swatch image as a breed:\n    // Customily serves those swatches with opaque asset filenames, which can\n    // otherwise be recorded as unrelated text. We retain the group only as\n    // customer-interaction evidence, then map its live hidden property below.\n    var rawBreedControlValue = clean(field.value, 500);\n    if (/breed/i.test(baseLabel)) {\n      // Do not infer a breed from Customily artwork. The native control value\n      // is either an exact breed (safe to retain) or an alphabetic library\n      // group (resolved to its dynamic hidden property at commit time).\n      value = rawBreedControlValue;\n      selection.source = isBreedMenuValue(value) ? 'breed_group' : 'breed_control';\n    }\n    if (!baseLabel || !meaningfulValue(value)) return;\n    var fieldName = normalizedName(field);\n    var fieldId = clean(field.id, 120);\n    var contextualSlot = breedSlotFromContext(field) || breedSlotFromLabel(baseLabel);\n    if (/breed/i.test(baseLabel) && contextualSlot) state.activeBreedSlot = contextualSlot;\n    if (/breed/i.test(baseLabel) && !contextualSlot && state.activeBreedSlot) contextualSlot = state.activeBreedSlot;\n    var breedMenu = /breed/i.test(baseLabel) && isBreedMenuValue(value);\n    if (/breed/i.test(baseLabel) && contextualSlot) {\n      baseLabel = (breedMenu ? 'Breed group #' : 'Choose breed #') + contextualSlot;\n    }\n    var owner = /breed/i.test(baseLabel) && contextualSlot\n      ? (breedMenu ? 'breed-group|' : 'breed-choice|') + contextualSlot\n      : (field.type === 'radio' || field.type === 'checkbox')\n        ? ['choice-group', fieldName || canonicalLabel(baseLabel).toLowerCase(), contextualSlot].join('|')\n        : [fieldName, fieldId, contextualSlot, fieldName || fieldId || contextualSlot ? '' : fieldIndex].join('|');\n    // Radio options in one Customily group have different element IDs. Treat the\n    // checked option as the authoritative value and remove the previous choice,\n    // otherwise a former \"Soft\" selection can survive after \"Slim\" is chosen.\n    Object.keys(state.customerSelectionOwners).forEach(function (existingLabel) {\n      if (state.customerSelectionOwners[existingLabel] !== owner || existingLabel === baseLabel) return;\n      delete state.customerSelectionValues[existingLabel];\n      delete state.customerSelectionNames[existingLabel];\n      delete state.customerSelectionOwners[existingLabel];\n      state.customerSelectionOrder = state.customerSelectionOrder.filter(function (item) { return item !== existingLabel; });\n    });\n    var label = baseLabel;\n    var suffix = 2;\n    while (\n      Object.prototype.hasOwnProperty.call(state.customerSelectionValues, label) &&\n      state.customerSelectionOwners[label] !== owner\n    ) {\n      label = baseLabel + ' ' + suffix;\n      suffix += 1;\n    }\n    if (!Object.prototype.hasOwnProperty.call(state.customerSelectionValues, label)) {\n      if (state.customerSelectionOrder.length >= 80) return;\n      state.customerSelectionOrder.push(label);\n    }\n    state.customerSelectionValues[label] = value;\n    state.customerSelectionNames[label] = fieldName;\n    state.customerSelectionOwners[label] = owner;\n  }\n\n  function customizationValues() {\n    var values = {};\n    state.customerSelectionOrder.slice(0, 80).forEach(function (label) {\n      var value = clean(state.customerSelectionValues[label], 500);\n      if (!meaningfulValue(value)) return;\n      var uniqueLabel = label;\n      var suffix = 2;\n      while (Object.prototype.hasOwnProperty.call(values, uniqueLabel)) {\n        uniqueLabel = label + ' ' + suffix;\n        suffix += 1;\n      }\n      if (Object.keys(values).length < 40) values[uniqueLabel] = value;\n    });\n    return values;\n  }\n\n  function refreshRememberedSelections() {\n    var rememberedNames = {};\n    Object.keys(state.customerSelectionNames).forEach(function (label) {\n      var name = state.customerSelectionNames[label];\n      if (name) rememberedNames[name] = true;\n    });\n    fields().forEach(function (field) {\n      if (rememberedNames[normalizedName(field)]) rememberCustomerSelection(field, field);\n    });\n  }\n\n  function lineItemProperties() {\n    var output = {};\n    fields().forEach(function (field) {\n      var label = propertyLabel(field);\n      if (!label || Object.keys(output).length >= 80) return;\n      var value = field.type === 'hidden' ? clean(field.value, 2048) : displaySelection(field, field).value;\n      if (!meaningfulValue(value)) return;\n      // A multi-pet Customily product can repeat the same dynamic label for\n      // several pet slots (for example `P-R Dog Breeds`). An object assignment\n      // used to overwrite the earlier pet and made one final breed look as if\n      // it belonged to every matching slot. Preserve DOM order with a stable\n      // suffix so the ingest Worker can map each value back to its own pet.\n      var uniqueLabel = label;\n      var suffix = 2;\n      while (Object.prototype.hasOwnProperty.call(output, uniqueLabel)) {\n        uniqueLabel = label + ' ' + suffix;\n        suffix += 1;\n      }\n      output[uniqueLabel] = clean(value, 2048);\n    });\n    return output;\n  }\n\n  function materialFromTarget(target) {\n    if (!target) return '';\n    var nodes = [target];\n    if (target.closest) {\n      nodes.push(target.closest('label[data-option-name*=\"material\" i], label, [data-option-name*=\"material\" i]'));\n    }\n    for (var nodeIndex = 0; nodeIndex < nodes.length; nodeIndex += 1) {\n      var node = nodes[nodeIndex];\n      if (!node) continue;\n      var candidates = [\n        node.getAttribute && node.getAttribute('data-option-value'),\n        node.value,\n        node.getAttribute && node.getAttribute('value'),\n        node.getAttribute && node.getAttribute('aria-label'),\n        node.textContent\n      ];\n      for (var candidateIndex = 0; candidateIndex < candidates.length; candidateIndex += 1) {\n        var canonical = canonicalMaterial(candidates[candidateIndex]);\n        if (canonical) return canonical;\n      }\n    }\n    return '';\n  }\n\n  function materialFromDom() {\n    var candidates = Array.prototype.slice.call(document.querySelectorAll(\n      'input[name=\"Material\"]:checked, select[name=\"Material\"], ' +\n      'input[name=\"options[Material]\"]:checked, select[name=\"options[Material]\"], ' +\n      'input[name*=\"material\" i]:checked, select[name*=\"material\" i], ' +\n      '[data-option-name=\"Material\" i] input:checked, [data-option-name=\"Material\" i] select, ' +\n      '[data-option-name*=\"material\" i][aria-selected=\"true\"], ' +\n      '[data-option-name*=\"material\" i][aria-checked=\"true\"], ' +\n      '.product-form__input--option-material input:checked, .product-form__input--option-material select'\n    ));\n    for (var index = 0; index < candidates.length; index += 1) {\n      var value = materialFromTarget(candidates[index]);\n      if (value) {\n        state.lastMaterial = value;\n        return value;\n      }\n    }\n    return state.lastMaterial;\n  }\n\n  function committedCustomizationValues(properties, material) {\n    var values = customizationValues();\n    // Customily often serializes the final breed under a dynamic library label\n    // (for example `P-R Dog Breeds`) rather than the numbered control the\n    // customer clicked. Keep a slot only when that numbered control has an\n    // explicit customer interaction; this preserves the no-default-breeds\n    // rule while allowing the final Customily value to reach Insights.\n    var selectedBreedSlots = Object.keys(state.customerSelectionOwners).map(function (label) {\n      var owner = state.customerSelectionOwners[label] || '';\n      // Both a direct exact-breed choice and the library selector represent an\n      // explicit customer interaction. The latter gets its exact value from\n      // Customily's live dynamic hidden property, in DOM order below.\n      var match = owner.match(/^breed-(?:choice|group)\\|(\\d+)$/);\n      var value = clean(state.customerSelectionValues[label], 500);\n      return match && meaningfulValue(value) && !opaqueCustomilyAssetId(value) ? Number(match[1]) : 0;\n    }).filter(function (slot, index, list) {\n      return slot > 0 && list.indexOf(slot) === index;\n    }).sort(function (left, right) { return left - right; });\n    var fallbackBreedIndex = 0;\n    Object.keys(properties || {}).forEach(function (label) {\n      if (/^_customily/i.test(label)) return;\n      var value = clean(properties[label], 500);\n      if (!meaningfulValue(value)) return;\n      var normalized = canonicalLabel(label).toLowerCase();\n      var isBreed = /breed/i.test(label);\n      var breedWasChosen = Object.keys(values).some(function (existing) {\n        return /breed/i.test(existing) && canonicalLabel(existing).toLowerCase() === normalized;\n      });\n      // Preserve the customer-selected-only rule for breeds. Other current form\n      // values become committed evidence only when Preview/Add to cart is clicked.\n      if (isBreed && !breedWasChosen) {\n        var propertySlot = breedSlotFromLabel(label);\n        // Dynamic Customily library labels normally have no slot. Their order in\n        // the line-item properties is the same order as the customer-selected\n        // breed controls, so map only the next explicitly interacted slot.\n        if (!propertySlot && !/breed\\s*(?:design|style|variant|version|number)/i.test(label)) {\n          propertySlot = selectedBreedSlots[fallbackBreedIndex] || 0;\n          fallbackBreedIndex += 1;\n        }\n        if (!propertySlot || selectedBreedSlots.indexOf(propertySlot) === -1 || opaqueCustomilyAssetId(value)) return;\n        values['Breed #' + propertySlot] = value;\n        return;\n      }\n      Object.keys(values).forEach(function (existing) {\n        var existingNormalized = canonicalLabel(existing).toLowerCase().replace(/\\s+\\d+$/, '');\n        if (existingNormalized === normalized) delete values[existing];\n      });\n      values[canonicalLabel(label)] = value;\n    });\n    if (material) values.Material = material;\n    return values;\n  }\n\n  function selectedValue(nameTests, valueTest) {\n    for (var index = 0; index < state.customerSelectionOrder.length; index += 1) {\n      var label = state.customerSelectionOrder[index];\n      var fieldName = state.customerSelectionNames[label] || '';\n      if (!nameTests.some(function (test) { return test.test(label.toLowerCase()) || test.test(fieldName); })) continue;\n      var value = clean(state.customerSelectionValues[label], 500);\n      if (meaningfulValue(value) && (!valueTest || valueTest(value))) return value;\n    }\n    return '';\n  }\n\n  function httpsUrl(value) {\n    var cleaned = clean(value, 2048);\n    return /^https:\\/\\//i.test(cleaned) ? cleaned : '';\n  }\n\n  function isVerifiedPersonalizationUrl(value) {\n    var candidate = httpsUrl(value);\n    if (!candidate) return false;\n    try {\n      var hostname = new URL(candidate).hostname.toLowerCase();\n      return hostname === 'cdn.customily.com' || /\\.customily\\.com$/i.test(hostname);\n    } catch (_error) {\n      return false;\n    }\n  }\n\n  function exactCustomilyPreviewUrlFromProperties(properties) {\n    var previewUrl = '';\n    Object.keys(properties || {}).some(function (rawLabel) {\n      var label = clean(rawLabel, 180).replace(/[\\u200B-\\u200D\\uFEFF]/g, '').toLowerCase();\n      if (label !== '_customily-preview') return false;\n      var candidate = httpsUrl(properties[rawLabel]);\n      previewUrl = isVerifiedPersonalizationUrl(candidate) ? candidate : '';\n      return Boolean(previewUrl);\n    });\n    return previewUrl;\n  }\n\n  function customilyPreviewUrlFromProperties(properties) {\n    // Product-agnostic contract: `_customily-thumb` is an option/product image,\n    // never evidence of the customer's finished personalization.\n    return exactCustomilyPreviewUrlFromProperties(properties);\n  }\n\n  function syncExactCustomilyPreview(snapshot, eventName, reason) {\n    if (!trackingAllowed() || !snapshot || !snapshot.id) return;\n    var currentLineItems = lineItemProperties();\n    var exactPreviewUrl = exactCustomilyPreviewUrlFromProperties(currentLineItems);\n    if (!exactPreviewUrl || state.previewUrlSyncs[snapshot.id] === exactPreviewUrl) return;\n    state.previewUrlSyncs[snapshot.id] = exactPreviewUrl;\n    uploadPreviewSnapshot(snapshot.id, exactPreviewUrl).then(function (uploaded) {\n      publish(eventName, {\n        trigger: reason,\n        snapshotAction: snapshot.action,\n        customizationSnapshotId: snapshot.id,\n        snapshotSequence: snapshot.sequence,\n        previewObjectKey: uploaded && uploaded.objectKey ? uploaded.objectKey : undefined,\n        previewContentType: uploaded && uploaded.contentType ? uploaded.contentType : undefined,\n        previewUrl: exactPreviewUrl,\n        lineItemProperties: currentLineItems,\n        previewCaptureStatus: uploaded ? 'archived_r2' : 'ready'\n      }, true, snapshot.actionData);\n    });\n  }\n\n  function scheduleExactCustomilyPreviewSync(snapshot, eventName) {\n    [450, 1100, 2200, 3500, 6000, 10000, 16000, 25000].forEach(function (delay) {\n      deferTracking('customily_preview_url_' + delay + 'ms', function () {\n        syncExactCustomilyPreview(snapshot, eventName, snapshot.action + '_customily_preview_' + delay + 'ms');\n      }, delay);\n    });\n  }\n\n  function previewObjectKey(snapshotId) {\n    return snapshotId ? 'previews/snapshots/' + snapshotId + '.webp' : '';\n  }\n\n  function previewImageSources() {\n    var sources = [];\n    function add(source) {\n      if (!source || sources.indexOf(source) >= 0) return;\n      var width = source.naturalWidth || source.width || 0;\n      var height = source.naturalHeight || source.height || 0;\n      if (width > 0 && height > 0) sources.push(source);\n    }\n\n    // Customily's Fabric canvas can be tainted by cross-origin swatches. Its\n    // active canvas thumbnail is a data URL generated by Customily itself and\n    // is therefore the safest exact personalization source. Try images first,\n    // then retain the canvas as a fallback for products that do not expose the\n    // generated thumbnail.\n    var images = document.querySelectorAll(\n      '.customily_gallery_thumbnail.active.canvas-thumbnail img, .customily_gallery_media img[data-customily-preview], .customily_gallery img[data-customily-preview]'\n    );\n    for (var imageIndex = 0; imageIndex < images.length; imageIndex += 1) {\n      var source = String(images[imageIndex].currentSrc || images[imageIndex].src || '');\n      if (/^(?:data:image\\/|blob:)/i.test(source) || isVerifiedPersonalizationUrl(source)) add(images[imageIndex]);\n    }\n\n    var canvases = document.querySelectorAll(\n      '#preview-canvas.lower-canvas, canvas#preview-canvas, .customily_gallery_media canvas, .customily_gallery .canvas-container canvas'\n    );\n    for (var canvasIndex = 0; canvasIndex < canvases.length; canvasIndex += 1) {\n      add(canvases[canvasIndex]);\n    }\n    return sources;\n  }\n\n  function previewImageSource() {\n    return previewImageSources()[0] || null;\n  }\n\n  function previewFingerprint(source) {\n    if (!source) return '';\n    // Do not normalize the complete data URL: Customily previews can be several\n    // megabytes and scanning that string would violate the storefront budget.\n    var src = String(source.currentSrc || source.src || '');\n    if (src) {\n      if (/^data:/i.test(src)) {\n        var quarter = Math.floor(src.length / 4);\n        var middle = Math.floor(src.length / 2);\n        var threeQuarter = Math.floor(src.length * 3 / 4);\n        return 'data:' + src.length + ':' +\n          src.slice(quarter, quarter + 48) + ':' +\n          src.slice(middle, middle + 48) + ':' +\n          src.slice(threeQuarter, threeQuarter + 48);\n      }\n      return 'src:' + clean(src, 2048);\n    }\n    return 'canvas:' + clean(source.id, 80) + ':' + clean(source.className, 120) + ':' +\n      (source.width || 0) + 'x' + (source.height || 0);\n  }\n\n  function renderedPreviewHasContent(canvas) {\n    // Reject a transparent/solid-white Customily frame. This is intentionally\n    // sampled at 24x24 so the check stays below the storefront performance\n    // budget while still detecting the centered jewelry/pet artwork.\n    var probe = document.createElement('canvas');\n    probe.width = 24;\n    probe.height = 24;\n    var context = probe.getContext('2d', { alpha: true, willReadFrequently: true });\n    if (!context) return false;\n    try {\n      context.drawImage(canvas, 0, 0, probe.width, probe.height);\n      var pixels = context.getImageData(0, 0, probe.width, probe.height).data;\n      var corners = [0, 23, 552, 575];\n      var background = [0, 0, 0, 0];\n      corners.forEach(function (pixelIndex) {\n        var offset = pixelIndex * 4;\n        background[0] += pixels[offset];\n        background[1] += pixels[offset + 1];\n        background[2] += pixels[offset + 2];\n        background[3] += pixels[offset + 3];\n      });\n      background = background.map(function (value) { return value / corners.length; });\n      var visible = 0;\n      var different = 0;\n      for (var index = 0; index < pixels.length; index += 4) {\n        var alpha = pixels[index + 3];\n        if (alpha > 12) visible += 1;\n        var distance = Math.abs(pixels[index] - background[0]) +\n          Math.abs(pixels[index + 1] - background[1]) +\n          Math.abs(pixels[index + 2] - background[2]) +\n          Math.abs(alpha - background[3]);\n        if (distance > 30) different += 1;\n      }\n      return visible >= 3 && different >= 2;\n    } catch (_error) {\n      return false;\n    }\n  }\n\n  function previewBlob(priority) {\n    return new Promise(function (resolve) {\n      if (!trackingAllowed()) return resolve(null);\n      if (Date.now() < state.previewCapturePausedUntil) return resolve(null);\n      function renderThumbnail() {\n        if (!trackingAllowed()) return resolve(null);\n        runBudgeted('preview_thumbnail_300px', function () {\n          var sources = previewImageSources();\n          function trySource(index) {\n            if (!trackingAllowed() || index >= sources.length) return resolve(null);\n            var source = sources[index];\n            var width = source.naturalWidth || source.width || 0;\n            var height = source.naturalHeight || source.height || 0;\n            if (!width || !height) return trySource(index + 1);\n            var maxSide = 300;\n            var scale = Math.min(1, maxSide / Math.max(width, height));\n            var canvas = document.createElement('canvas');\n            canvas.width = Math.max(1, Math.round(width * scale));\n            canvas.height = Math.max(1, Math.round(height * scale));\n            var context = canvas.getContext('2d', { alpha: true });\n            if (!context) return trySource(index + 1);\n            try {\n              context.drawImage(source, 0, 0, canvas.width, canvas.height);\n              if (!renderedPreviewHasContent(canvas)) return trySource(index + 1);\n              canvas.toBlob(function (blob) {\n                // Safari and a few embedded browsers can fall back to PNG even\n                // when WebP is requested. The ingest endpoint accepts these\n                // formats and preserves the actual content type, so rejecting\n                // the fallback here would silently lose a valid preview.\n                if (blob && /^image\\/(?:webp|png|jpeg)$/i.test(blob.type || '')) return resolve(blob);\n                trySource(index + 1);\n              }, 'image/webp', 0.78);\n            } catch (_error) {\n              trySource(index + 1);\n            }\n          }\n          trySource(0);\n        });\n      }\n      // Normal Preview work is deliberately idle-only. Add to cart may move\n      // Customily/cart state before that idle slot runs, so a pointer-down\n      // prewarm requests this same 300px canvas conversion on the next task.\n      // It still never delays the click or the commerce request.\n      if (priority) {\n        window.setTimeout(renderThumbnail, 0);\n      } else if (typeof window.requestIdleCallback === 'function') {\n        window.requestIdleCallback(renderThumbnail, { timeout: 1200 });\n      } else {\n        window.setTimeout(renderThumbnail, 0);\n      }\n    });\n  }\n\n  function prewarmAddToCartPreview() {\n    if (!trackingAllowed() || Date.now() < state.previewCapturePausedUntil) return;\n    var source = previewImageSource();\n    var fingerprint = previewFingerprint(source);\n    if (!fingerprint) return;\n    var cached = state.prewarmedPreview;\n    if (cached && cached.fingerprint === fingerprint && cached.expiresAt > Date.now()) return;\n    if (state.prewarmPreviewPromise) return;\n    state.prewarmPreviewPromise = previewBlob(true).then(function (blob) {\n      if (blob) {\n        state.prewarmedPreview = {\n          blob: blob,\n          fingerprint: fingerprint,\n          expiresAt: Date.now() + 15000\n        };\n      }\n      state.prewarmPreviewPromise = null;\n      return blob;\n    }, function () {\n      state.prewarmPreviewPromise = null;\n      return null;\n    });\n  }\n\n  function prewarmedPreviewBlob() {\n    var cached = state.prewarmedPreview;\n    if (!cached || cached.expiresAt <= Date.now()) return null;\n    if (cached.fingerprint !== previewFingerprint(previewImageSource())) return null;\n    return cached.blob || null;\n  }\n\n  function previewBlobFromUrl(previewUrl) {\n    return new Promise(function (resolve) {\n      if (!trackingAllowed() || !isVerifiedPersonalizationUrl(previewUrl) || typeof window.fetch !== 'function') return resolve(null);\n      var controller = typeof window.AbortController === 'function' ? new AbortController() : null;\n      var timer = window.setTimeout(function () { if (controller) controller.abort(); }, 4500);\n      fetch(previewUrl, {\n        method: 'GET',\n        mode: 'cors',\n        credentials: 'omit',\n        cache: 'no-store',\n        signal: controller ? controller.signal : undefined\n      }).then(function (response) {\n        if (!response.ok) throw new Error('preview_download_failed');\n        var declaredSize = Number(response.headers.get('Content-Length') || 0);\n        if (declaredSize > 5000000) throw new Error('preview_too_large');\n        return response.blob();\n      }).then(function (sourceBlob) {\n        if (!sourceBlob || !/^image\\//i.test(sourceBlob.type || '') || sourceBlob.size > 5000000) return null;\n        if (typeof window.createImageBitmap !== 'function') return null;\n        return window.createImageBitmap(sourceBlob).then(function (bitmap) {\n          var width = bitmap.width || 0;\n          var height = bitmap.height || 0;\n          if (!width || !height) {\n            bitmap.close();\n            return null;\n          }\n          var scale = Math.min(1, 300 / Math.max(width, height));\n          var canvas = document.createElement('canvas');\n          canvas.width = Math.max(1, Math.round(width * scale));\n          canvas.height = Math.max(1, Math.round(height * scale));\n          var context = canvas.getContext('2d', { alpha: true });\n          if (!context) {\n            bitmap.close();\n            return null;\n          }\n          context.drawImage(bitmap, 0, 0, canvas.width, canvas.height);\n          bitmap.close();\n          if (!renderedPreviewHasContent(canvas)) return null;\n          return new Promise(function (blobResolve) {\n            canvas.toBlob(function (thumbnail) {\n              blobResolve(thumbnail && /^image\\/(?:webp|png|jpeg)$/i.test(thumbnail.type || '') ? thumbnail : null);\n            }, 'image/webp', 0.78);\n          });\n        });\n      }).then(function (thumbnail) {\n        window.clearTimeout(timer);\n        resolve(thumbnail || null);\n      }).catch(function () {\n        window.clearTimeout(timer);\n        resolve(null);\n      });\n    });\n  }\n\n  function uploadPreviewSnapshot(snapshotId, preferredPreviewUrl) {\n    if (!trackingAllowed() || !snapshotId) return Promise.resolve(null);\n    if (state.previewUploads[snapshotId]) return state.previewUploads[snapshotId];\n    var uploadAttempt = Promise.resolve(prewarmedPreviewBlob()).then(function (blob) {\n      if (blob) return blob;\n      return previewBlob();\n    }).then(function (blob) {\n      if (blob) return blob;\n      return previewBlobFromUrl(preferredPreviewUrl || previewUrlFromDom());\n    }).then(function (blob) {\n      if (!trackingAllowed() || !blob) return null;\n      return fetch(previewUploadEndpoint + encodeURIComponent(snapshotId), {\n        method: 'POST',\n        mode: 'cors',\n        credentials: 'omit',\n        // Preserve PNG/JPEG fallbacks from browsers that cannot encode WebP.\n        // The Worker validates this header before writing the 300px thumbnail.\n        headers: { 'Content-Type': /^image\\/(?:webp|png|jpeg)$/i.test(blob.type || '') ? blob.type : 'image/webp' },\n        body: blob,\n        keepalive: blob.size <= 64000\n      }).then(function (response) {\n        if (!response.ok) return null;\n        return response.json().then(function (data) {\n          return data && data.objectKey ? data : null;\n        });\n      });\n    }).catch(function () { return null; });\n    state.previewUploads[snapshotId] = uploadAttempt;\n    return uploadAttempt.then(function (uploaded) {\n      // Customily often renders the preview asynchronously. A first attempt can\n      // legitimately find an empty/not-yet-sized canvas, so only cache success.\n      // Clearing a null result lets the scheduled 450/1100/2200/3500ms attempts\n      // capture the finished preview without blocking the Preview or ATC action.\n      if (!uploaded && state.previewUploads[snapshotId] === uploadAttempt) {\n        delete state.previewUploads[snapshotId];\n      }\n      return uploaded;\n    });\n  }\n\n  function previewUrlFromDom() {\n    var exactLineItemUrl = customilyPreviewUrlFromProperties(lineItemProperties());\n    if (exactLineItemUrl) return exactLineItemUrl;\n    var hiddenUrl = httpsUrl(findValue([\n      /_customily.*(?:thumb|preview)/,\n      /properties\\[.*(?:thumb|preview)/,\n      /(?:thumb|preview).*(?:customily|personalization)/\n    ]));\n    if (isVerifiedPersonalizationUrl(hiddenUrl)) return hiddenUrl;\n    // Some Customily products expose a rendered CDN preview in the gallery;\n    // accept it only when it is hosted by Customily. Shopify CDN images can be\n    // main product media, option art, upload inputs, or swatches.\n    var activePreview = document.querySelector(\n      '.customily_gallery_thumbnail.active img, .customily_gallery_media img[data-customily-preview]'\n    );\n    var activePreviewUrl = activePreview && httpsUrl(activePreview.currentSrc || activePreview.src);\n    if (isVerifiedPersonalizationUrl(activePreviewUrl)) return activePreviewUrl;\n    var images = Array.prototype.slice.call(document.querySelectorAll(\n      '.customily_gallery_media img, .customily_gallery img, img[data-customily-preview], [data-customily-preview] img'\n    )).filter(function (image) {\n      return !image.closest('#customily-options, .customily-options-wrapper, .customily-option, .customily-option-group, [class*=\"thumbnail\"], [class*=\"swatch\"]');\n    }).sort(function (left, right) {\n      var leftArea = (left.naturalWidth || left.width || 0) * (left.naturalHeight || left.height || 0);\n      var rightArea = (right.naturalWidth || right.width || 0) * (right.naturalHeight || right.height || 0);\n      return rightArea - leftArea;\n    });\n    for (var index = 0; index < images.length; index += 1) {\n      var candidate = httpsUrl(images[index].currentSrc || images[index].src);\n      if (isVerifiedPersonalizationUrl(candidate)) return candidate;\n    }\n    return isVerifiedPersonalizationUrl(state.lastPreviewUrl) ? state.lastPreviewUrl : '';\n  }\n\n  function findValue(nameTests, valueTest) {\n    var list = fields();\n    for (var index = 0; index < list.length; index += 1) {\n      var field = list[index];\n      var name = normalizedName(field);\n      var matchesName = nameTests.some(function (test) { return test.test(name); });\n      if (!matchesName) continue;\n      var value = displayValue(field);\n      if (meaningfulValue(value) && (!valueTest || valueTest(value))) return value;\n    }\n    return '';\n  }\n\n  function productHandle() {\n    var match = window.location.pathname.match(/^\\/products\\/([^/?#]+)/);\n    return match ? clean(match[1], 180) : '';\n  }\n\n  function personalizationData() {\n    refreshRememberedSelections();\n    var breed = selectedValue(\n      [/breed/, /dog breeds/, /cat breeds/],\n      function (value) { return !/^[a-z](?:-[a-z])?\\s+(?:dog|cat)\\s+breeds$/i.test(value); }\n    );\n    var material = materialFromDom() || selectedValue([/^material$/, /options\\[material\\]/, /properties\\[material\\]/]);\n    var petName = selectedValue([/pet'?s? name/, /dog'?s? name/, /cat'?s? name/]);\n    var petType = selectedValue([/choose pet(?:\\s*#?\\d+)?\\]/, /pet type/]);\n    var engraving = selectedValue([/engrav/]);\n    var customizationId = findValue([/_customily.*(?:customization|id)/]);\n    var personalizationId = findValue([/_customily.*personalization/]);\n    var previewUrl = previewUrlFromDom();\n    var properties = lineItemProperties();\n    if (material && !Object.keys(properties).some(function (label) { return /^material$/i.test(label); })) {\n      properties.Material = material;\n    }\n    var optionValues = committedCustomizationValues(properties, material);\n    if (previewUrl) state.lastPreviewUrl = previewUrl;\n\n    var data = {\n      productHandle: productHandle(),\n      breed: breed,\n      petName: petName,\n      petType: petType,\n      material: material,\n      engraving: engraving ? 'yes' : '',\n      customizationId: customizationId,\n      personalizationId: personalizationId,\n      previewUrl: previewUrl,\n      customizationValues: Object.keys(optionValues).length ? optionValues : undefined,\n      selectionEvidence: Object.keys(optionValues).length ? 'customer_interaction' : undefined,\n      customerSelectedKeys: Object.keys(optionValues).length ? Object.keys(optionValues) : undefined,\n      lineItemProperties: Object.keys(properties).length ? properties : undefined\n    };\n    Object.keys(data).forEach(function (key) {\n      if (!data[key]) delete data[key];\n    });\n    return data;\n  }\n\n  function publish(eventName, extra, allowDuplicate, actionSnapshot) {\n    if (!trackingAllowed()) return false;\n    if (!window.Shopify || !Shopify.analytics || typeof Shopify.analytics.publish !== 'function') return false;\n    // Customer-selected values are evidence only when the customer explicitly\n    // commits them with Preview or Add to cart. All other lifecycle events keep\n    // a minimal product context and cannot contribute customization demand.\n    var data = Object.assign(\n      {},\n      actionSnapshot || { productHandle: productHandle() },\n      extra || {}\n    );\n    var signature = JSON.stringify(data);\n    if (!allowDuplicate && state.lastPayloads[eventName] === signature) return true;\n    state.lastPayloads[eventName] = signature;\n    try {\n      var result = Shopify.analytics.publish('soulyshine_' + eventName, data);\n      if (result && typeof result.catch === 'function') result.catch(function () {});\n      return true;\n    } catch (_error) {\n      return false;\n    }\n  }\n\n  function ensureStarted(reason) {\n    if (!trackingAllowed() || state.started) return;\n    state.started = true;\n    publish('customization_started', { trigger: clean(reason, 64) });\n  }\n\n  function scheduleChanged(reason) {\n    if (!trackingAllowed()) return;\n    ensureStarted(reason);\n    window.clearTimeout(state.changeTimer);\n    state.changeTimer = deferTracking('customization_changed', function () {\n      publish('customization_changed', { trigger: clean(reason, 64) }, true);\n      detectSaved();\n    }, 450);\n  }\n\n  function detectSaved() {\n    if (!trackingAllowed() || state.saved) return;\n    var data = personalizationData();\n    if (!data.customizationId && !data.personalizationId) return;\n    state.saved = true;\n    publish('customization_saved');\n  }\n\n  function newSnapshotId(action) {\n    state.snapshotSequence += 1;\n    return 'sscs_' + action + '_' + Date.now().toString(36) + '_' + state.snapshotSequence;\n  }\n\n  async function markPreviewCreated(reason, cycle, force) {\n    if (!trackingAllowed()) return;\n    var targetCycle = cycle || state.previewCycle;\n    if (!targetCycle || state.previewCompletedCycles[targetCycle] || state.previewCompletingCycles[targetCycle] || !state.started) return;\n    var snapshot = state.previewSnapshots[targetCycle];\n    if (!snapshot) return;\n    var currentLineItems = lineItemProperties();\n    var exactPreviewUrl = exactCustomilyPreviewUrlFromProperties(currentLineItems);\n    var currentPreviewUrl = exactPreviewUrl || customilyPreviewUrlFromProperties(currentLineItems) || previewUrlFromDom();\n    var currentPreviewSource = previewImageSource();\n    var currentFingerprint = previewFingerprint(currentPreviewSource);\n    var hasDrawablePreview = Boolean(currentPreviewSource && (\n      (currentPreviewSource.naturalWidth || currentPreviewSource.width || 0) > 0 &&\n      (currentPreviewSource.naturalHeight || currentPreviewSource.height || 0) > 0\n    ));\n    var hasUpdatedPreview = Boolean(\n      (currentPreviewUrl && currentPreviewUrl !== snapshot.beforeUrl) ||\n      (currentFingerprint && currentFingerprint !== snapshot.beforeFingerprint)\n    );\n    // Customily renders the selected design live before the customer presses\n    // Preview; the click often only opens the modal. A drawable canvas/image at\n    // click time is therefore the correct customer preview even when its\n    // fingerprint does not change after the click.\n    var shouldArchive = hasDrawablePreview || Boolean(currentPreviewUrl);\n    if (!force && !shouldArchive) return;\n    state.previewCompletingCycles[targetCycle] = true;\n    var uploaded = shouldArchive ? await uploadPreviewSnapshot(snapshot.id, currentPreviewUrl) : null;\n    // A public Customily URL is sometimes written while the idle thumbnail\n    // capture is running. Re-read it before deciding the attempt failed.\n    currentLineItems = lineItemProperties();\n    exactPreviewUrl = exactCustomilyPreviewUrlFromProperties(currentLineItems);\n    currentPreviewUrl = exactPreviewUrl || customilyPreviewUrlFromProperties(currentLineItems) || currentPreviewUrl || previewUrlFromDom();\n    if (exactPreviewUrl) state.previewUrlSyncs[snapshot.id] = exactPreviewUrl;\n    if (!uploaded && currentPreviewUrl && currentPreviewUrl === snapshot.beforeUrl && !hasUpdatedPreview && !hasDrawablePreview) {\n      // Never attach a stale URL from an earlier personalization to the new\n      // click. R2 can still supply the exact captured image when available.\n      currentPreviewUrl = '';\n    }\n    if (!uploaded && !currentPreviewUrl && !force) {\n      delete state.previewCompletingCycles[targetCycle];\n      return;\n    }\n    if (targetCycle === state.previewCycle) {\n      state.previewRequested = false;\n      stopPreviewObserver();\n    }\n    state.previewCompletedCycles[targetCycle] = true;\n    delete state.previewCompletingCycles[targetCycle];\n    state.previewCreatedCycle = Math.max(state.previewCreatedCycle, targetCycle);\n    publish('preview_created', {\n      trigger: clean(reason, 64),\n      snapshotAction: 'preview',\n      customizationSnapshotId: snapshot.id,\n      snapshotSequence: snapshot.sequence,\n      previewObjectKey: uploaded && uploaded.objectKey ? uploaded.objectKey : undefined,\n      previewContentType: uploaded && uploaded.contentType ? uploaded.contentType : undefined,\n      previewUrl: currentPreviewUrl || undefined,\n      lineItemProperties: currentLineItems,\n      previewCaptureStatus: uploaded ? 'archived_r2' : currentPreviewUrl ? 'ready' : shouldArchive ? 'capture_failed' : 'missing'\n    }, true, snapshot.actionData);\n    delete state.previewSnapshots[targetCycle];\n    if (state.previewVisible) publish('preview_viewed');\n  }\n\n  function publishCartSnapshot(trigger) {\n    if (!trackingAllowed()) return;\n    var now = Date.now();\n    if (now - state.lastAtcSnapshotAt < 1200) return;\n    state.lastAtcSnapshotAt = now;\n    ensureStarted(trigger);\n    var snapshotId = newSnapshotId('add_to_cart');\n    var snapshotSequence = state.snapshotSequence;\n    var actionData = personalizationData();\n    savePendingCartSnapshot({\n      id: snapshotId,\n      sequence: snapshotSequence,\n      productHandle: actionData.productHandle || productHandle(),\n      actionData: actionData,\n      createdAt: Date.now()\n    });\n    var archivedPreview = null;\n    var lastEmittedPreviewUrl = '';\n    function emitCartSnapshot(reason, uploaded) {\n      var currentLineItems = lineItemProperties();\n      var savedPreviewUrl = customilyPreviewUrlFromProperties(currentLineItems) || previewUrlFromDom();\n      if (!uploaded && savedPreviewUrl && savedPreviewUrl === lastEmittedPreviewUrl) return;\n      if (savedPreviewUrl) lastEmittedPreviewUrl = savedPreviewUrl;\n      // Add to cart can complete after Customily has applied its final dynamic\n      // controls. Rebuild the committed selection at emission time so Insights\n      // and the archived preview always describe the same final design.\n      var finalActionData = personalizationData();\n      if (finalActionData && finalActionData.customizationValues) actionData = finalActionData;\n      savePendingCartSnapshot({\n        id: snapshotId,\n        sequence: snapshotSequence,\n        productHandle: actionData.productHandle || productHandle(),\n        actionData: actionData,\n        createdAt: Date.now()\n      });\n      publish('customization_completed', {\n        trigger: reason,\n        snapshotAction: 'add_to_cart',\n        customizationSnapshotId: snapshotId,\n        snapshotSequence: snapshotSequence,\n        previewObjectKey: uploaded && uploaded.objectKey ? uploaded.objectKey : undefined,\n        previewContentType: uploaded && uploaded.contentType ? uploaded.contentType : undefined,\n        previewUrl: savedPreviewUrl || undefined,\n        lineItemProperties: currentLineItems,\n        previewCaptureStatus: uploaded ? 'archived_r2' : savedPreviewUrl ? 'ready' : 'uploading_r2'\n      }, true, actionData);\n    }\n    function retryCartArchive(reason) {\n      if (!trackingAllowed()) return;\n      var currentLineItems = lineItemProperties();\n      var exactPreviewUrl = exactCustomilyPreviewUrlFromProperties(currentLineItems);\n      var currentPreviewUrl = exactPreviewUrl || customilyPreviewUrlFromProperties(currentLineItems) || previewUrlFromDom();\n      if (currentPreviewUrl && currentPreviewUrl !== lastEmittedPreviewUrl) {\n        emitCartSnapshot(reason + '_customily_url', null);\n      }\n      if (archivedPreview) return;\n      uploadPreviewSnapshot(snapshotId, currentPreviewUrl).then(function (uploaded) {\n        if (!uploaded || archivedPreview) return;\n        archivedPreview = uploaded;\n        emitCartSnapshot(reason, uploaded);\n      });\n    }\n    emitCartSnapshot(trigger, null);\n    retryCartArchive(trigger + '_archived');\n    deferTracking('cart_archive_450ms', function () { retryCartArchive(trigger + '_450ms'); }, 450);\n    deferTracking('cart_archive_1100ms', function () { retryCartArchive(trigger + '_1100ms'); }, 1100);\n    deferTracking('cart_archive_2200ms', function () { retryCartArchive(trigger + '_2200ms'); }, 2200);\n    deferTracking('cart_archive_3500ms', function () { retryCartArchive(trigger + '_3500ms'); }, 3500);\n    deferTracking('cart_archive_6000ms', function () { retryCartArchive(trigger + '_6000ms'); }, 6000);\n    deferTracking('cart_archive_10000ms', function () { retryCartArchive(trigger + '_10000ms'); }, 10000);\n    deferTracking('cart_archive_16000ms', function () { retryCartArchive(trigger + '_16000ms'); }, 16000);\n    deferTracking('cart_archive_final', function () { retryCartArchive(trigger + '_25000ms'); }, 25000);\n    schedulePendingCartRecovery('add_to_cart');\n    detectSaved();\n  }\n\n  function savePendingCartSnapshot(snapshot) {\n    try {\n      window.sessionStorage.setItem(pendingCartStorageKey, JSON.stringify(snapshot));\n    } catch (_error) {}\n  }\n\n  function pendingCartSnapshot() {\n    try {\n      var snapshot = JSON.parse(window.sessionStorage.getItem(pendingCartStorageKey) || 'null');\n      if (!snapshot || !snapshot.id || !snapshot.createdAt || Date.now() - Number(snapshot.createdAt) > 10 * 60 * 1000) {\n        window.sessionStorage.removeItem(pendingCartStorageKey);\n        return null;\n      }\n      return snapshot;\n    } catch (_error) {\n      return null;\n    }\n  }\n\n  function clearPendingCartSnapshot(snapshotId) {\n    try {\n      var current = pendingCartSnapshot();\n      if (!current || current.id === snapshotId) window.sessionStorage.removeItem(pendingCartStorageKey);\n    } catch (_error) {}\n  }\n\n  function cartItemHandle(item) {\n    var direct = clean(item && (item.handle || item.product_handle), 180);\n    if (direct) return direct;\n    var match = clean(item && item.url, 2048).match(/\\/products\\/([^/?#]+)/i);\n    return match ? clean(match[1], 180) : '';\n  }\n\n  function recoverPendingCartPreview(reason) {\n    if (!trackingAllowed() || state.pendingCartRecovery || typeof window.fetch !== 'function') return;\n    var snapshot = pendingCartSnapshot();\n    if (!snapshot) return;\n    state.pendingCartRecovery = true;\n    fetch('/cart.js', {\n      method: 'GET',\n      credentials: 'same-origin',\n      cache: 'no-store',\n      headers: { Accept: 'application/json' }\n    }).then(function (response) {\n      if (!response.ok) throw new Error('cart_snapshot_unavailable');\n      return response.json();\n    }).then(function (cart) {\n      var items = cart && Array.isArray(cart.items) ? cart.items : [];\n      var matches = items.filter(function (item) {\n        return !snapshot.productHandle || cartItemHandle(item) === snapshot.productHandle;\n      });\n      var item = matches.length ? matches[matches.length - 1] : items[items.length - 1];\n      var properties = item && item.properties && typeof item.properties === 'object' ? item.properties : {};\n      var exactPreviewUrl = exactCustomilyPreviewUrlFromProperties(properties);\n      if (!exactPreviewUrl) return null;\n      return uploadPreviewSnapshot(snapshot.id, exactPreviewUrl).then(function (uploaded) {\n        var published = publish('customization_completed', {\n          trigger: clean(reason + '_cart_json', 64),\n          snapshotAction: 'add_to_cart',\n          customizationSnapshotId: snapshot.id,\n          snapshotSequence: snapshot.sequence,\n          previewObjectKey: uploaded && uploaded.objectKey ? uploaded.objectKey : undefined,\n          previewContentType: uploaded && uploaded.contentType ? uploaded.contentType : undefined,\n          previewUrl: exactPreviewUrl,\n          lineItemProperties: properties,\n          previewCaptureStatus: uploaded ? 'archived_r2' : 'ready'\n        }, true, snapshot.actionData || {});\n        if (published) clearPendingCartSnapshot(snapshot.id);\n        return published;\n      });\n    }).catch(function () {}).then(function () {\n      state.pendingCartRecovery = false;\n    });\n  }\n\n  function schedulePendingCartRecovery(reason) {\n    [700, 1600, 3200, 6500].forEach(function (delay) {\n      deferTracking('pending_cart_recovery_' + delay + 'ms', function () {\n        recoverPendingCartPreview(reason + '_' + delay + 'ms');\n      }, delay);\n    });\n  }\n\n  function isCustomilyTarget(target) {\n    return Boolean(target && target.closest && target.closest(rootSelector));\n  }\n\n  function isMaterialTarget(target) {\n    return Boolean(target && target.matches && (\n      target.matches('input[name=\"Material\"], select[name=\"Material\"], input[name=\"options[Material]\"], select[name=\"options[Material]\"]') ||\n      /material/.test(normalizedName(target)) ||\n      Boolean(target.closest && target.closest('[data-option-name*=\"material\" i], .product-form__input--option-material'))\n    ));\n  }\n\n  function isVariantTarget(target) {\n    return Boolean(target && target.closest && target.closest(variantSelector));\n  }\n\n  function fieldFromClick(target) {\n    if (!target || !target.closest) return null;\n    var direct = target.closest('input, select, textarea');\n    if (direct) return direct;\n    var label = target.closest('label');\n    if (label && label.control) return label.control;\n    var option = target.closest('.customily-option, .customily-option-group, [class*=\"option\"]');\n    if (!option) return null;\n    // Customily tile clicks often land on an image/span inside a group whose\n    // first input is the default option. This handler runs after the click has\n    // updated the UI, so prefer the currently selected/checked control rather\n    // than the first control in DOM order.\n    var controls = Array.prototype.slice.call(option.querySelectorAll('input, select, textarea'));\n    return controls.find(isUsableField) || controls[0] || null;\n  }\n\n  function fieldLabel(target) {\n    return normalizedName(target).replace(/^properties\\[/, '').replace(/\\]$/, '');\n  }\n\n  function previewObserverRoots() {\n    var roots = Array.prototype.slice.call(document.querySelectorAll(rootSelector + ', ' + variantSelector));\n    return roots.filter(function (root, index) {\n      return roots.indexOf(root) === index && !roots.some(function (candidate, candidateIndex) {\n        return candidateIndex !== index && candidate.contains(root);\n      });\n    });\n  }\n\n  function inspectPendingPreview() {\n    if (!trackingAllowed() || !state.previewRequested) {\n      stopPreviewObserver();\n      return;\n    }\n    watchPreview();\n    if (document.querySelector(previewSelector)) {\n      return markPreviewCreated('preview_scoped_dom', state.previewCycle, false);\n    }\n  }\n\n  function startPreviewObserver() {\n    stopPreviewObserver();\n    if (!trackingAllowed() || !state.previewRequested || !('MutationObserver' in window)) return;\n    var roots = previewObserverRoots();\n    if (!roots.length) {\n      state.observerRootTimer = window.setTimeout(function () {\n        if (trackingAllowed() && state.previewRequested) startPreviewObserver();\n      }, 250);\n      return;\n    }\n    state.previewObserver = new MutationObserver(function () {\n      if (!trackingAllowed() || !state.previewRequested) {\n        stopPreviewObserver();\n        return;\n      }\n      window.clearTimeout(state.observerTimer);\n      state.observerTimer = window.setTimeout(function () {\n        runBudgeted('preview_mutation', inspectPendingPreview);\n      }, OBSERVER_DEBOUNCE_MS);\n    });\n    roots.forEach(function (root) {\n      state.previewObserver.observe(root, {\n        childList: true,\n        subtree: true,\n        attributes: true,\n        attributeFilter: ['value', 'src', 'class']\n      });\n    });\n  }\n\n  document.addEventListener('change', function (event) {\n    var target = event.target;\n    if (!trackingAllowed() || !event.isTrusted) return;\n    deferTracking('change', function () {\n      if (!isCustomilyTarget(target) && !isVariantTarget(target) && !isMaterialTarget(target)) return;\n      var changedMaterial = materialFromTarget(target);\n      if (changedMaterial) state.lastMaterial = changedMaterial;\n      rememberCustomerSelection(target, target);\n      var label = fieldLabel(target);\n      scheduleChanged(label || 'option_change');\n\n      if (isMaterialTarget(target)) publish('material_selected');\n      if (/breed/.test(label)) publish('breed_viewed');\n      if (/engrav/.test(label) && target.checked) publish('engraving_added');\n      if (target.type === 'file' && target.files && target.files.length > 0) {\n        publish('pet_photo_submitted', { fileCount: clean(target.files.length, 4) });\n      }\n    });\n  }, { capture: true, passive: true });\n\n  document.addEventListener('input', function (event) {\n    var target = event.target;\n    if (!trackingAllowed() || !event.isTrusted) return;\n    deferTracking('input', function () {\n      if (!isCustomilyTarget(target)) return;\n      rememberCustomerSelection(target, target);\n      scheduleChanged(fieldLabel(target) || 'text_input');\n    });\n  }, { capture: true, passive: true });\n\n  document.addEventListener('customily:material-changed', function () {\n    if (!trackingAllowed()) return;\n    deferTracking('material_changed', function () {\n      if (Date.now() - state.lastTrustedInteractionAt >= 1500) return;\n      var currentMaterial = materialFromDom();\n      if (currentMaterial) state.lastMaterial = currentMaterial;\n      fields().filter(isMaterialTarget).forEach(function (field) { rememberCustomerSelection(field, field); });\n      scheduleChanged('material');\n      publish('material_selected');\n    });\n  }, { passive: true });\n\n  // Klaviyo dispatches this only after a form submission succeeds. Keep this\n  // listener passive and defer all CRM work so the form UX and storefront are\n  // never blocked. Do not identify from field input or an unsubmitted form.\n  window.addEventListener('klaviyoForms', function (event) {\n    var detail = event && event.detail;\n    if (!trackingAllowed() || !detail || detail.type !== 'submit') return;\n    deferTracking('klaviyo_form_submit', function () {\n      var meta = detail.metaData && typeof detail.metaData === 'object' ? detail.metaData : {};\n      var email = clean(meta.email || meta.$email || meta.Email || meta.email_address, 320).toLowerCase();\n      if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) return;\n      publish('customer_identified', {\n        customerEmail: email,\n        firstName: clean(meta.first_name || meta.firstName || meta.firstname || meta['First Name'], 120),\n        identitySource: 'klaviyo_form_submit',\n        klaviyoFormId: clean(detail.formId, 180),\n        klaviyoCompanyId: clean(detail.companyId, 180)\n      }, true);\n    }, 0);\n  }, { passive: true });\n\n  // Begin only the in-memory 300px canvas conversion before Add to cart. This\n  // is not a snapshot and sends no data. It gives the subsequent click enough\n  // time to use the Customily canvas even when the cart UI changes quickly.\n  document.addEventListener('pointerdown', function (event) {\n    var origin = event.target;\n    if (!trackingAllowed() || !event.isTrusted || !origin || !origin.closest) return;\n    var target = origin.closest(atcSelector);\n    if (!target) return;\n    var text = clean(target.textContent, 160).toLowerCase();\n    if (!/add to cart/i.test(text) && !target.closest('form[action*=\"/cart/add\"]')) return;\n    if (hasIncompleteRequiredCustomilyFields()) return;\n    deferTracking('atc_preview_prewarm', prewarmAddToCartPreview, 0);\n  }, { capture: true, passive: true });\n\n  document.addEventListener('click', function (event) {\n    var clickOrigin = event.target;\n    if (!trackingAllowed() || !event.isTrusted || !clickOrigin || !clickOrigin.closest) return;\n    var relevant = clickOrigin.closest(rootSelector + ', ' + variantSelector + ', ' + atcSelector + ', button, [role=\"button\"], a');\n    if (!relevant) return;\n    deferTracking('click', function () {\n      var clickedField = fieldFromClick(clickOrigin);\n      if (isCustomilyTarget(clickOrigin) || isVariantTarget(clickOrigin) || isMaterialTarget(clickOrigin) || isMaterialTarget(clickedField)) {\n        state.lastTrustedInteractionAt = Date.now();\n        var clickedMaterial = materialFromTarget(clickOrigin) || materialFromTarget(clickedField);\n        if (clickedMaterial) state.lastMaterial = clickedMaterial;\n        ensureStarted('customily_click');\n        deferTracking('option_click', function () {\n          var selectedField = fieldFromClick(clickOrigin);\n          if (!selectedField || !isUsableField(selectedField)) return;\n          rememberCustomerSelection(selectedField, clickOrigin);\n          scheduleChanged(fieldLabel(selectedField) || 'option_click');\n        });\n      }\n      var target = clickOrigin.closest('button, [role=\"button\"], a, ' + atcSelector);\n      if (!target) return;\n      var text = clean(target.textContent, 160).toLowerCase();\n\n      if (/preview\\s+(?:your\\s+)?personalization/.test(text) && !/thumbnail/.test(target.className || '')) {\n        var previewClickAt = Date.now();\n        if (previewClickAt - state.lastPreviewClickAt < 1500) return;\n        state.lastPreviewClickAt = previewClickAt;\n        // Customily may show its own validation UI, but CRM must never create\n        // evidence from an incomplete design. Do not prevent or delay the\n        // click; simply leave no preview/value/snapshot trail in CRM.\n        if (hasIncompleteRequiredCustomilyFields()) {\n          state.previewRequested = false;\n          stopPreviewObserver();\n          return;\n        }\n        ensureStarted('preview_button');\n        state.previewRequested = true;\n        state.previewCycle += 1;\n        var previewCycle = state.previewCycle;\n        var previewSnapshotId = newSnapshotId('preview');\n        state.previewSnapshots[previewCycle] = {\n          id: previewSnapshotId,\n          action: 'preview',\n          sequence: state.snapshotSequence,\n          actionData: personalizationData(),\n          beforeUrl: previewUrlFromDom(),\n          beforeFingerprint: previewFingerprint(previewImageSource())\n        };\n        publish('preview_clicked', {\n          snapshotAction: 'preview',\n          customizationSnapshotId: previewSnapshotId,\n          snapshotSequence: state.snapshotSequence,\n          previewCaptureStatus: 'requested'\n        }, true, state.previewSnapshots[previewCycle].actionData);\n        scheduleExactCustomilyPreviewSync(state.previewSnapshots[previewCycle], 'preview_created');\n        startPreviewObserver();\n        publish('free_preview_requested');\n        deferTracking('preview_retry_450ms', function () { return markPreviewCreated('preview_button_450ms', previewCycle, false); }, 450);\n        deferTracking('preview_retry_1100ms', function () { return markPreviewCreated('preview_button_1100ms', previewCycle, false); }, 1100);\n        deferTracking('preview_retry_2200ms', function () { return markPreviewCreated('preview_button_2200ms', previewCycle, false); }, 2200);\n        deferTracking('preview_retry_3500ms', function () { return markPreviewCreated('preview_button_3500ms', previewCycle, false); }, 3500);\n        deferTracking('preview_retry_6000ms', function () { return markPreviewCreated('preview_button_6000ms', previewCycle, false); }, 6000);\n        deferTracking('preview_retry_10000ms', function () { return markPreviewCreated('preview_button_10000ms', previewCycle, false); }, 10000);\n        deferTracking('preview_retry_16000ms', function () { return markPreviewCreated('preview_button_16000ms', previewCycle, false); }, 16000);\n        deferTracking('preview_retry_final', function () { return markPreviewCreated('preview_button_final', previewCycle, true); }, 25000);\n      }\n\n      if (target.matches(atcSelector) && (/add to cart/i.test(text) || target.closest('form[action*=\"/cart/add\"]'))) {\n        // Same rule as Preview: no CRM customization snapshot until every\n        // required Customily field is complete. Shopify/Customily retains full\n        // control of validation and the actual add-to-cart behavior.\n        if (hasIncompleteRequiredCustomilyFields()) return;\n        publishCartSnapshot('add_to_cart');\n      }\n    });\n  }, { capture: true, passive: true });\n\n  var originalPreviewReady = window.__ssCustomilyPreviewReady;\n  window.__ssCustomilyPreviewReady = function () {\n    if (typeof originalPreviewReady === 'function') originalPreviewReady.apply(this, arguments);\n    if (trackingAllowed() && state.previewRequested) {\n      deferTracking('customily_ready', function () {\n        // \"Ready\" can fire before the final gallery image/URL is drawable.\n        // It is a retry signal, not permission to finalize capture_failed.\n        return markPreviewCreated('customily_ready', state.previewCycle, false);\n      });\n    }\n  };\n\n  function watchPreview() {\n    if (!trackingAllowed()) return;\n    var preview = document.querySelector(previewSelector);\n    if (!preview || preview.__soulyshineCrmObserved) return;\n    preview.__soulyshineCrmObserved = true;\n    if ('IntersectionObserver' in window) {\n      new IntersectionObserver(function (entries) {\n        if (!trackingAllowed()) return;\n        deferTracking('preview_intersection', function () {\n          entries.forEach(function (entry) {\n            if (!entry.isIntersecting) return;\n            state.previewVisible = true;\n            if (state.previewCreatedCycle) publish('preview_viewed');\n          });\n        });\n      }, { threshold: 0.35 }).observe(preview);\n    }\n  }\n\n  function initialize() {\n    if (state.initialized || !trackingAllowed()) return;\n    state.initialized = true;\n    schedulePendingCartRecovery('page_load');\n    state.lastMaterial = materialFromDom();\n    deferIdle('initialize_preview', watchPreview, 1500);\n  }\n\n  function enableTracking() {\n    if (window.__soulyshineCrmDisabled === true) {\n      disableTracking('local_kill_switch');\n      return;\n    }\n    state.enabled = true;\n    state.disabledReason = '';\n    if (document.readyState === 'loading') {\n      document.addEventListener('DOMContentLoaded', initialize, { once: true, passive: true });\n    } else {\n      initialize();\n    }\n  }\n\n  function scheduleConfigRefresh() {\n    window.clearTimeout(state.configTimer);\n    state.configTimer = window.setTimeout(function () {\n      if (document.visibilityState === 'hidden') {\n        scheduleConfigRefresh();\n        return;\n      }\n      refreshTrackingConfig();\n    }, CONFIG_REFRESH_MS);\n  }\n\n  function refreshTrackingConfig() {\n    fetch(trackingConfigEndpoint, {\n      method: 'GET',\n      mode: 'cors',\n      credentials: 'omit',\n      cache: 'no-store'\n    }).then(function (response) {\n      if (!response.ok) throw new Error('tracking_config_unavailable');\n      return response.json();\n    }).then(function (config) {\n      if (config && config.trackingEnabled === true) enableTracking();\n      else disableTracking('remote_kill_switch');\n    }).catch(function () {\n      disableTracking('config_unavailable');\n    }).then(scheduleConfigRefresh);\n  }\n\n  window.__soulyshineCrmKillSwitch = function (disabled) {\n    window.__soulyshineCrmDisabled = disabled !== false;\n    if (window.__soulyshineCrmDisabled) disableTracking('local_kill_switch');\n    else refreshTrackingConfig();\n  };\n\n  window.setTimeout(refreshTrackingConfig, 0);\n})();\n"],
  "mappings": "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",
  "names": ["source", "item"]
}
