{
  "version": 3,
  "sources": ["/cdn/shop/t/163/assets/emz-gift-wrap.js?cb=1"],
  "sourcesContent": ["/**\n * Em'z Blendz gift wrap package builder\n *\n * Pairs with snippets/emz-gift-wrap.liquid on the cart page. Customers\n * assign cart lines (whole or part of a line's quantity) to numbered\n * gift packages and write a message per package. Saving rewrites the\n * cart through the AJAX API:\n *\n *   - every wrapped item line carries the visible property\n *     \"Gift package: N\" (canonical for fulfillment)\n *   - every package gets one wrap line (qty 1, Paper & Ribbon variant)\n *     with properties \"Package\", \"Contains\", and \"Gift message\"\n *\n * Wrap lines are always removed and re-added on save so the \"Contains\"\n * summary regenerates. All cart mutations run one at a time through a\n * promise queue: parallel Shopify cart writes race and corrupt state.\n * Quantity reductions on original lines run before any adds, so a\n * re-add that auto-merges into an existing line can never be clobbered\n * by a later reduction taken from the stale snapshot.\n *\n * Unwrapping never trusts /cart/add.js auto-merge to reunite the\n * re-added quantity with a surviving plain line: Shopify stores\n * empty-valued and app-injected properties invisibly, and any stored\n * mismatch makes the merge silently fail, stranding the quantities on\n * separate lines. Instead a matching plain line is folded into the\n * re-add (both removed, combined quantity added back), and properties\n * with empty values are always stripped from re-adds.\n *\n * The queue must survive hostile conditions: Shopify throttles bursts\n * of cart writes (HTTP 429, and other app scripts share that budget),\n * and /cart/change.js fails 400 on a stale line key. A step that dies\n * mid-queue strands a half-rewritten cart with no wrap line but\n * properties intact. Three defenses: the model is rebuilt from a\n * fresh /cart.js AT SAVE TIME (open-time snapshots go stale while the\n * builder sits open), every step retries transient failures with\n * backoff, and change retries verify against /cart.js first so an\n * operation that actually landed is never replayed.\n *\n * Self-healing (spec Phase 3, pulled into Phase 2): customers edit the\n * cart with the theme's own controls, which know nothing about\n * packages. On /cart load and after every cart:updated event (cart\n * page and drawer edits both dispatch it), the cart is checked while\n * the builder is closed: member lines whose wrap line is gone lose\n * their \"Gift package\" property through the same hard-strip fold the\n * builder uses, wrap lines whose package has no members left are\n * removed with an inline notice, and stale \"Contains\" summaries are\n * regenerated. A consistent cart is a no-op, so the post-heal reload\n * cannot loop.\n *\n * After the queue settles, ajaxProduct:added is dispatched once (header\n * count and drawer listeners expect it) and the page reloads, the same\n * finish the theme itself uses for adds made from the cart page.\n *\n * Builder state is fetched fresh from /cart.js on every open; the\n * Liquid snippet only supplies product tags (absent from /cart.js) and\n * the wrap price. Validation and self-healing beyond MAX_PACKAGES are\n * Phase 3.\n */\n(function () {\n  'use strict';\n\n  if (window.emzGiftWrapLoaded) return;\n  window.emzGiftWrapLoaded = true;\n\n  // ---------------------------------------------------------------- config\n\n  var MAX_PACKAGES = 4;\n  var GIFT_MESSAGE_MAX_CHARS = 200;\n  var WRAP_PRODUCT_ID = 1701645615170;\n  var WRAP_VARIANT_PAPER = 14066474451010;\n  var ROPE_PRODUCT_ID = 7249236688962;\n\n  // Line item property keys; fulfillment reads these on packing slips.\n  var PROP_MEMBER = 'Gift package';\n  var PROP_PACKAGE = 'Package';\n  var PROP_CONTAINS = 'Contains';\n  var PROP_MESSAGE = 'Gift message';\n  var PROP_ROPE_FOR = 'Rope for';   // written by emz-rope-addon.js\n\n  // A line is not wrappable when the product id matches, or when any of\n  // the substrings below appears (case-insensitively) in the product\n  // type or any tag. Subscriptions and gift cards are checked off the\n  // cart line itself.\n  var EXCLUDED_PRODUCT_IDS = [\n    WRAP_PRODUCT_ID, // the wrap product itself\n    7249236688962,   // Soap on a Rope (rides tied to its bar)\n    1701643026498,   // legacy Nulls \"Tissue and Ribbon\"\n    1701643681858    // legacy Nulls \"Box and Ribbon\"\n  ];\n  var EXCLUDED_TYPE_OR_TAG_SUBSTRINGS = [\n    'nulls gift product',\n    'b&b',\n    'guest amenities',\n    'hospitality',\n    'buyer:hospitality',\n    'gallon',\n    'bulk'\n  ];\n\n  var REASON_SUBSCRIPTION = \"Subscriptions ship on their own schedule and can't be wrapped\";\n  var REASON_GIFT_CARD = 'Gift cards are delivered by email, so there is nothing to wrap';\n  var REASON_GENERAL = 'This item is not available for gift wrapping';\n  var MSG_MAX_PACKAGES = 'You can build up to ' + MAX_PACKAGES + ' gift packages in one order.';\n  var MSG_SAVE_FAILED = 'Something went wrong while saving your gift options. Your cart is shown as it stands now, please try again.';\n  var MSG_NOTHING_ELIGIBLE = 'Nothing in your cart can be gift wrapped right now.';\n\n  var OPEN_HASH = '#gift-wrap';\n\n  // ---------------------------------------------------------------- state\n\n  var root, builder, toggle, linesEl, packagesEl, errorEl, noticeEl, saveBtn, cancelBtn;\n  var wrapPrice = '';\n  var tagsByProduct = {};\n  var lines = [];                // snapshot of assignable cart lines\n  var wrapLines = [];            // snapshot of existing wrap lines\n  var ropeLines = [];            // rope follower lines (see buildModel)\n  var assignments = {};          // line key -> { pkg: 0|1..MAX, qty }\n  var messagesByPackage = {};    // package number -> message text\n  var saving = false;\n  var healing = false;\n  var healTimer = null;\n\n  var HEAL_NOTICE_FLAG = 'emzGiftWrapHealNotice';\n\n  // One-time drawer row pulse (discoverability): fired on the first\n  // drawer open with a wrappable line, at most once per session.\n  var PULSE_FLAG = 'emzGiftWrapPulseShown';\n  var PULSE_CLASS = 'emz-gift-wrap-drawer-row--pulse';\n  var pulseShownThisPage = false;\n\n  function cartUrl() {\n    return (window.theme && theme.routes && theme.routes.cart) || '/cart.js';\n  }\n  function cartAddUrl() {\n    return (window.theme && theme.routes && theme.routes.cartAdd) || '/cart/add.js';\n  }\n  function cartChangeUrl() {\n    return (window.theme && theme.routes && theme.routes.cartChange) || '/cart/change.js';\n  }\n\n  function escapeHtml(str) {\n    return String(str == null ? '' : str)\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;');\n  }\n\n  function thumbUrl(url) {\n    if (!url) return '';\n    return url + (url.indexOf('?') === -1 ? '?' : '&') + 'width=96';\n  }\n\n  // ---------------------------------------------------------- eligibility\n\n  function eligibility(item) {\n    if (item.selling_plan_allocation) {\n      return { ok: false, reason: REASON_SUBSCRIPTION };\n    }\n    if (item.gift_card) {\n      return { ok: false, reason: REASON_GIFT_CARD };\n    }\n    if (EXCLUDED_PRODUCT_IDS.indexOf(item.product_id) !== -1) {\n      return { ok: false, reason: REASON_GENERAL };\n    }\n    var haystack = [item.product_type || ''].concat(tagsByProduct[item.product_id] || []);\n    for (var i = 0; i < haystack.length; i++) {\n      var value = String(haystack[i]).toLowerCase();\n      for (var j = 0; j < EXCLUDED_TYPE_OR_TAG_SUBSTRINGS.length; j++) {\n        if (value.indexOf(EXCLUDED_TYPE_OR_TAG_SUBSTRINGS[j]) !== -1) {\n          return { ok: false, reason: REASON_GENERAL };\n        }\n      }\n    }\n    return { ok: true, reason: '' };\n  }\n\n  // ---------------------------------------------------------------- model\n\n  function buildModel(cart) {\n    lines = [];\n    wrapLines = [];\n    ropeLines = [];\n    assignments = {};\n\n    cart.items.forEach(function (item) {\n      if (item.product_id === WRAP_PRODUCT_ID) {\n        wrapLines.push(item);\n        var props = item.properties || {};\n        var num = parseInt(props[PROP_PACKAGE], 10);\n        if (num && messagesByPackage[num] === undefined) {\n          messagesByPackage[num] =\n            props[PROP_MESSAGE] && props[PROP_MESSAGE] !== 'None' ? props[PROP_MESSAGE] : '';\n        }\n        return;\n      }\n\n      if (item.product_id === ROPE_PRODUCT_ID) {\n        var ropeProps = item.properties || {};\n        // A rope tied to a specific bar is a follower, never an\n        // assignable row: it inherits its bar's package in the save\n        // plan. Bare ropes (no \"Rope for\") and subscription ropes\n        // fall through to the excluded-row path below.\n        if (!item.selling_plan_allocation && ropeProps[PROP_ROPE_FOR]) {\n          ropeLines.push({\n            key: item.key,\n            variantId: item.variant_id,\n            quantity: item.quantity,\n            ropeFor: ropeProps[PROP_ROPE_FOR],\n            currentPackage: parseInt(ropeProps[PROP_MEMBER], 10) || 0\n          });\n          return;\n        }\n      }\n\n      var properties = item.properties || {};\n      var elig = eligibility(item);\n      var currentPackage = parseInt(properties[PROP_MEMBER], 10) || 0;\n      var line = {\n        key: item.key,\n        variantId: item.variant_id,\n        productId: item.product_id,\n        title: item.product_title,\n        variantTitle:\n          item.variant_title && item.variant_title !== 'Default Title' ? item.variant_title : '',\n        image: item.image,\n        quantity: item.quantity,\n        properties: properties,\n        eligible: elig.ok,\n        reason: elig.reason,\n        currentPackage: currentPackage\n      };\n      lines.push(line);\n      assignments[line.key] = { pkg: currentPackage, qty: item.quantity };\n    });\n  }\n\n  function packageNumbersInUse() {\n    var seen = {};\n    var numbers = [];\n    lines.forEach(function (line) {\n      var a = assignments[line.key];\n      if (a && a.pkg > 0 && a.qty > 0 && !seen[a.pkg]) {\n        seen[a.pkg] = true;\n        numbers.push(a.pkg);\n      }\n    });\n    return numbers.sort(function (a, b) { return a - b; });\n  }\n\n  function nextFreePackageNumber() {\n    var used = packageNumbersInUse();\n    for (var n = 1; n <= MAX_PACKAGES; n++) {\n      if (used.indexOf(n) === -1) return n;\n    }\n    return 0;\n  }\n\n  function lineLabel(line) {\n    return line.title + (line.variantTitle ? ' (' + line.variantTitle + ')' : '');\n  }\n\n  // ------------------------------------------------------ rope followers\n\n  function ropeGroups() {\n    var byBar = {};\n    var groups = [];\n    ropeLines.forEach(function (line) {\n      if (!byBar[line.ropeFor]) {\n        byBar[line.ropeFor] = { ropeFor: line.ropeFor, variantId: line.variantId, lines: [], total: 0 };\n        groups.push(byBar[line.ropeFor]);\n      }\n      byBar[line.ropeFor].lines.push(line);\n      byBar[line.ropeFor].total += line.quantity;\n    });\n    return groups;\n  }\n\n  // Desired distribution of a rope group across packages, derived\n  // from the matching bar's assignments: wrapped bars claim ropes\n  // first, package number ascending, up to min(wrapped bar units,\n  // rope units); the remainder stays plain. Rope quantity is never\n  // invented, and it is TRIMMED to the bar's total units: a rope\n  // whose bar left the cart is unfulfillable (the packing slip would\n  // order a knot onto a bar that is not in the order), so zero bar\n  // units means an empty plan and the group is removed outright.\n  function ropePlanForGroup(group) {\n    var totalBarUnits = 0;\n    var barUnitsByPkg = {};\n    lines.forEach(function (line) {\n      if (line.title !== group.ropeFor) return;\n      totalBarUnits += line.quantity;\n      if (!line.eligible) return;\n      var a = assignments[line.key];\n      if (!a || a.pkg <= 0) return;\n      barUnitsByPkg[a.pkg] = (barUnitsByPkg[a.pkg] || 0) + Math.max(1, Math.min(a.qty, line.quantity));\n    });\n    var remaining = Math.min(group.total, totalBarUnits);\n    var desired = {};\n    Object.keys(barUnitsByPkg)\n      .map(Number)\n      .sort(function (a, b) { return a - b; })\n      .forEach(function (pkg) {\n        var claim = Math.min(remaining, barUnitsByPkg[pkg]);\n        if (claim > 0) {\n          desired[String(pkg)] = claim;\n          remaining -= claim;\n        }\n      });\n    if (remaining > 0) desired['0'] = remaining;\n    return desired;\n  }\n\n  // True when a group's cart lines already match the plan, so no-op\n  // saves stage no mutations and self-healing converges. Duplicate\n  // lines for one package count as a mismatch so they collapse.\n  function ropeStateMatchesPlan(group, desired) {\n    var current = {};\n    var duplicate = false;\n    group.lines.forEach(function (line) {\n      var k = String(line.currentPackage || 0);\n      if (current[k] !== undefined) duplicate = true;\n      current[k] = (current[k] || 0) + line.quantity;\n    });\n    if (duplicate) return false;\n    var desiredKeys = Object.keys(desired);\n    if (desiredKeys.length !== Object.keys(current).length) return false;\n    for (var i = 0; i < desiredKeys.length; i++) {\n      if (current[desiredKeys[i]] !== desired[desiredKeys[i]]) return false;\n    }\n    return true;\n  }\n\n  function containsSummary(pkg) {\n    var counts = {};\n    var order = [];\n    lines.forEach(function (line) {\n      var a = assignments[line.key];\n      if (!a || a.pkg !== pkg || a.qty < 1) return;\n      var label = lineLabel(line);\n      if (counts[label] === undefined) {\n        counts[label] = 0;\n        order.push(label);\n      }\n      counts[label] += a.qty;\n    });\n    var parts = order.map(function (label) { return counts[label] + 'x ' + label; });\n    // Ropes claimed into this package ride on their bar's entry:\n    // \"1x Bar + rope\", or \"+ 2x rope\" when fewer ropes than bars.\n    ropeGroups().forEach(function (group) {\n      var claimed = ropePlanForGroup(group)[String(pkg)] || 0;\n      if (!claimed) return;\n      for (var i = 0; i < order.length; i++) {\n        if (order[i].indexOf(group.ropeFor) === 0) {\n          parts[i] += claimed === counts[order[i]] ? ' + rope' : ' + ' + claimed + 'x rope';\n          break;\n        }\n      }\n    });\n    return parts.join(', ');\n  }\n\n  // --------------------------------------------------------------- render\n\n  function render() {\n    renderLines();\n    renderPackages();\n  }\n\n  function renderLines() {\n    if (!lines.length) {\n      linesEl.innerHTML = '';\n      return;\n    }\n\n    var eligible = lines.filter(function (l) { return l.eligible; });\n    var used = packageNumbersInUse();\n    var canAddNew = used.length < MAX_PACKAGES;\n    var ropeTitles = {};\n    ropeLines.forEach(function (l) { ropeTitles[l.ropeFor] = true; });\n    var html = '';\n\n    if (!eligible.length) {\n      html += '<p class=\"emz-gift-wrap__none\">' + escapeHtml(MSG_NOTHING_ELIGIBLE) + '</p>';\n    }\n\n    lines.forEach(function (line, index) {\n      var a = assignments[line.key];\n      var rowClass = 'emz-gift-wrap__line' + (line.eligible ? '' : ' emz-gift-wrap__line--excluded');\n      html += '<div class=\"' + rowClass + '\" data-gw-line data-key=\"' + escapeHtml(line.key) + '\">';\n\n      if (line.image) {\n        html +=\n          '<img class=\"emz-gift-wrap__line-thumb\" src=\"' + escapeHtml(thumbUrl(line.image)) +\n          '\" width=\"48\" height=\"48\" loading=\"lazy\" alt=\"\">';\n      } else {\n        html += '<span class=\"emz-gift-wrap__line-thumb emz-gift-wrap__line-thumb--empty\"></span>';\n      }\n\n      html += '<div class=\"emz-gift-wrap__line-info\">';\n      html += '<div class=\"emz-gift-wrap__line-title\">' + escapeHtml(line.title) + '</div>';\n      var metaBits = [];\n      if (line.variantTitle) metaBits.push(line.variantTitle);\n      metaBits.push('Qty ' + line.quantity);\n      html += '<div class=\"emz-gift-wrap__line-meta\">' + escapeHtml(metaBits.join(' / ')) + '</div>';\n      if (ropeTitles[line.title]) {\n        html += '<div class=\"emz-gift-wrap__line-rope\">+ rope, follows this bar</div>';\n      }\n      if (!line.eligible) {\n        html += '<div class=\"emz-gift-wrap__line-reason\">' + escapeHtml(line.reason) + '</div>';\n      }\n      html += '</div>';\n\n      if (line.eligible) {\n        var selectId = 'GiftWrapSelect-' + index;\n        html += '<div class=\"emz-gift-wrap__line-controls\">';\n        html +=\n          '<label class=\"hidden-label\" for=\"' + selectId + '\">Gift wrap for ' +\n          escapeHtml(lineLabel(line)) + '</label>';\n        html += '<select id=\"' + selectId + '\" class=\"emz-gift-wrap__select\" data-gw-select>';\n        html += '<option value=\"0\"' + (a.pkg === 0 ? ' selected' : '') + '>No gift wrap</option>';\n        used.forEach(function (n) {\n          html +=\n            '<option value=\"' + n + '\"' + (a.pkg === n ? ' selected' : '') + '>Package ' + n +\n            '</option>';\n        });\n        if (a.pkg > 0 && used.indexOf(a.pkg) === -1) {\n          html += '<option value=\"' + a.pkg + '\" selected>Package ' + a.pkg + '</option>';\n        }\n        if (canAddNew) {\n          html += '<option value=\"new\">+ New package</option>';\n        }\n        html += '</select>';\n\n        if (a.pkg > 0 && line.quantity > 1) {\n          var qtyId = 'GiftWrapQty-' + index;\n          html += '<label class=\"emz-gift-wrap__qty-label\" for=\"' + qtyId + '\">Wrap ';\n          html +=\n            '<input id=\"' + qtyId + '\" class=\"emz-gift-wrap__qty\" data-gw-qty type=\"number\" min=\"1\" max=\"' +\n            line.quantity + '\" step=\"1\" inputmode=\"numeric\" value=\"' + a.qty + '\">';\n          html += ' of ' + line.quantity + '</label>';\n        }\n        html += '</div>';\n      }\n\n      html += '</div>';\n    });\n\n    linesEl.innerHTML = html;\n  }\n\n  function renderPackages() {\n    var used = packageNumbersInUse();\n    var html = '';\n\n    used.forEach(function (n) {\n      var message = messagesByPackage[n] || '';\n      var areaId = 'GiftWrapMessage-' + n;\n      html += '<div class=\"emz-gift-wrap__package\" data-gw-package=\"' + n + '\">';\n      html +=\n        '<div class=\"emz-gift-wrap__package-head\"><span>Package ' + n + '</span><span>' +\n        escapeHtml(wrapPrice) + '</span></div>';\n      html +=\n        '<div class=\"emz-gift-wrap__package-contents\">' + escapeHtml(containsSummary(n)) +\n        '</div>';\n      html +=\n        '<label class=\"emz-gift-wrap__message-label\" for=\"' + areaId +\n        '\">Gift message (optional)</label>';\n      html +=\n        '<textarea id=\"' + areaId + '\" class=\"emz-gift-wrap__message\" data-gw-message data-package=\"' +\n        n + '\" maxlength=\"' + GIFT_MESSAGE_MAX_CHARS +\n        '\" rows=\"2\" placeholder=\"We write this on the card\">' + escapeHtml(message) +\n        '</textarea>';\n      html +=\n        '<div class=\"emz-gift-wrap__message-hint\">Up to ' + GIFT_MESSAGE_MAX_CHARS +\n        ' characters.</div>';\n      html += '</div>';\n    });\n\n    packagesEl.innerHTML = html;\n  }\n\n  function showError(message) {\n    errorEl.textContent = message;\n    errorEl.hidden = false;\n  }\n\n  function clearError() {\n    errorEl.textContent = '';\n    errorEl.hidden = true;\n  }\n\n  // --------------------------------------------------------- open / close\n\n  function openBuilder() {\n    clearError();\n    toggle.setAttribute('aria-expanded', 'true');\n    builder.hidden = false;\n\n    fetchCart()\n      .then(function (cart) {\n        buildModel(cart);\n        render();\n      })\n      .catch(function (err) {\n        console.warn('[EMZ Gift Wrap] Could not load the cart', err);\n        showError(MSG_SAVE_FAILED);\n      });\n  }\n\n  function closeBuilder() {\n    toggle.setAttribute('aria-expanded', 'false');\n    builder.hidden = true;\n  }\n\n  // ----------------------------------------------------------------- save\n\n  function propsWithout(properties, dropKey) {\n    var out = {};\n    var keys = Object.keys(properties || {});\n    keys.forEach(function (key) {\n      if (key === dropKey) return;\n      var value = properties[key];\n      // Empty-valued properties are stored invisibly by Shopify and\n      // defeat /cart/add.js line merging; never carry them forward.\n      if (value === null || value === undefined || String(value) === '') return;\n      out[key] = value;\n    });\n    return out;\n  }\n\n  function propsEqual(a, b) {\n    var keysA = Object.keys(a);\n    var keysB = Object.keys(b);\n    if (keysA.length !== keysB.length) return false;\n    for (var i = 0; i < keysA.length; i++) {\n      var key = keysA[i];\n      if (!(key in b) || String(a[key]) !== String(b[key])) return false;\n    }\n    return true;\n  }\n\n  function postJson(url, payload) {\n    return fetch(url, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        'X-Requested-With': 'XMLHttpRequest'\n      },\n      body: JSON.stringify(payload)\n    }).then(function (response) {\n      return response.json().then(function (data) {\n        if (!response.ok || (data && data.status)) {\n          var error = new Error(\n            (data && (data.description || data.message)) || 'Cart request failed'\n          );\n          error.httpStatus = response.status;\n          throw error;\n        }\n        return data;\n      });\n    });\n  }\n\n  function fetchCart() {\n    return fetch(cartUrl(), { headers: { 'X-Requested-With': 'XMLHttpRequest' } })\n      .then(function (response) { return response.json(); });\n  }\n\n  function changeLine(key, quantity) {\n    return postJson(cartChangeUrl(), { id: key, quantity: quantity });\n  }\n\n  function addLine(variantId, quantity, properties) {\n    var payload = { id: variantId, quantity: quantity };\n    if (properties && Object.keys(properties).length) payload.properties = properties;\n    return postJson(cartAddUrl(), payload);\n  }\n\n  var STEP_RETRIES = 3;\n\n  function delay(ms) {\n    return new Promise(function (resolve) { setTimeout(resolve, ms); });\n  }\n\n  // No httpStatus means the request itself died (network); 429 is the\n  // cart write throttle; 5xx is Shopify's side. Anything else (400\n  // stale key, 422 rejection) is a real answer and must not be\n  // replayed blindly.\n  function isTransient(err) {\n    return !err.httpStatus || err.httpStatus === 429 || err.httpStatus >= 500;\n  }\n\n  // Sets a line's quantity, surviving throttling and dropped\n  // responses. Every retry first asks /cart.js whether the change\n  // already landed (or the line is already gone, for removals), so an\n  // operation is never applied twice and a stale-key removal resolves\n  // instead of killing the queue.\n  function changeLineReliably(key, quantity) {\n    var attempts = 0;\n    function landed() {\n      return fetchCart().then(function (cart) {\n        for (var i = 0; i < cart.items.length; i++) {\n          if (cart.items[i].key === key) return cart.items[i].quantity === quantity;\n        }\n        return quantity === 0;\n      }).catch(function () { return false; });\n    }\n    function attempt() {\n      attempts += 1;\n      return changeLine(key, quantity).catch(function (err) {\n        console.warn('[EMZ Gift Wrap] change attempt ' + attempts + ' failed', key, err);\n        return delay(350 * attempts).then(landed).then(function (done) {\n          if (done) return null;\n          if (attempts >= STEP_RETRIES || !isTransient(err)) throw err;\n          return attempt();\n        });\n      });\n    }\n    return attempt();\n  }\n\n  // Adds retry only on transient failures: a hard rejection (sold out,\n  // invalid variant) must surface, and replaying an answered request\n  // could double-add.\n  function addLineReliably(variantId, quantity, properties) {\n    var attempts = 0;\n    function attempt() {\n      attempts += 1;\n      return addLine(variantId, quantity, properties).catch(function (err) {\n        console.warn('[EMZ Gift Wrap] add attempt ' + attempts + ' failed', variantId, err);\n        if (attempts >= STEP_RETRIES || !isTransient(err)) throw err;\n        return delay(350 * attempts).then(attempt);\n      });\n    }\n    return attempt();\n  }\n\n  // Builds the mutation queue in three strict stages. Reductions and\n  // removals (stage 1 and 2) all run before any add (stage 3): adds can\n  // auto-merge into surviving lines, and a reduction computed from the\n  // pre-save snapshot would wipe out a merged-in quantity if it ran\n  // after the merge.\n  function buildQueue() {\n    var reductions = [];\n    var additions = [];\n    var absorbed = {};\n\n    // A plain line this save otherwise leaves untouched, holding the\n    // same variant and the same normalized properties, that a\n    // re-added plain quantity can be folded into.\n    function findPlainSibling(line, baseProps) {\n      for (var i = 0; i < lines.length; i++) {\n        var other = lines[i];\n        if (other.key === line.key || absorbed[other.key]) continue;\n        if (other.variantId !== line.variantId || !other.eligible) continue;\n        var oa = assignments[other.key];\n        if (!oa || oa.pkg !== 0 || other.currentPackage !== 0) continue;\n        if (propsEqual(propsWithout(other.properties, PROP_MEMBER), baseProps)) return other;\n      }\n      return null;\n    }\n\n    wrapLines.forEach(function (wrap) {\n      reductions.push(function () { return changeLineReliably(wrap.key, 0); });\n    });\n\n    lines.forEach(function (line) {\n      if (!line.eligible) return;\n      var a = assignments[line.key];\n      var pkg = a.pkg;\n      var qty = pkg > 0 ? Math.max(1, Math.min(a.qty, line.quantity)) : 0;\n\n      var unchanged =\n        (pkg === 0 && line.currentPackage === 0) ||\n        (pkg === line.currentPackage && qty === line.quantity);\n      if (unchanged) return;\n\n      var baseProps = propsWithout(line.properties, PROP_MEMBER);\n\n      if (line.currentPackage === 0 && pkg > 0 && qty < line.quantity) {\n        // Partial wrap of a plain line: keep the original at the\n        // reduced quantity, add the wrapped remainder as a new line.\n        reductions.push(function () { return changeLineReliably(line.key, line.quantity - qty); });\n      } else {\n        reductions.push(function () { return changeLineReliably(line.key, 0); });\n        if (pkg === 0 || qty < line.quantity) {\n          var plainQty = pkg === 0 ? line.quantity : line.quantity - qty;\n          var sibling = findPlainSibling(line, baseProps);\n          if (sibling) {\n            absorbed[sibling.key] = true;\n            plainQty += sibling.quantity;\n            reductions.push(function () { return changeLineReliably(sibling.key, 0); });\n          }\n          additions.push(function () { return addLineReliably(line.variantId, plainQty, baseProps); });\n        }\n      }\n\n      if (pkg > 0) {\n        var wrappedProps = propsWithout(line.properties, PROP_MEMBER);\n        wrappedProps[PROP_MEMBER] = String(pkg);\n        additions.push(function () { return addLineReliably(line.variantId, qty, wrappedProps); });\n      }\n    });\n\n    // Ropes follow their bar: rewrite any rope group whose lines do\n    // not already match the plan (hard strip, remove and re-add,\n    // both properties carried). Groups already in place stage no\n    // mutations, which keeps no-op saves and heal convergence clean.\n    ropeGroups().forEach(function (group) {\n      var desired = ropePlanForGroup(group);\n      if (ropeStateMatchesPlan(group, desired)) return;\n      group.lines.forEach(function (line) {\n        reductions.push(function () { return changeLineReliably(line.key, 0); });\n      });\n      Object.keys(desired).forEach(function (pkgKey) {\n        var props = {};\n        props[PROP_ROPE_FOR] = group.ropeFor;\n        if (pkgKey !== '0') props[PROP_MEMBER] = pkgKey;\n        additions.push(function () { return addLineReliably(group.variantId, desired[pkgKey], props); });\n      });\n    });\n\n    packageNumbersInUse().forEach(function (n) {\n      additions.push(function () {\n        var props = {};\n        props[PROP_PACKAGE] = String(n);\n        props[PROP_CONTAINS] = containsSummary(n);\n        var message = (messagesByPackage[n] || '').trim().slice(0, GIFT_MESSAGE_MAX_CHARS);\n        props[PROP_MESSAGE] = message || 'None';\n        return addLineReliably(WRAP_VARIANT_PAPER, 1, props);\n      });\n    });\n\n    return reductions.concat(additions);\n  }\n\n  function runQueue(queue) {\n    return queue.reduce(function (chain, step) {\n      return chain.then(step);\n    }, Promise.resolve());\n  }\n\n  function save() {\n    if (saving) return;\n    saving = true;\n    clearError();\n    saveBtn.classList.add('btn--loading');\n    saveBtn.disabled = true;\n\n    // Rebuild the model from the live cart at save time, carrying the\n    // customer's package choices over by line key (keys hash variant +\n    // properties, so quantity edits keep them stable). The open-time\n    // snapshot goes stale while the builder sits open \u2014 drawer edits,\n    // other tabs, app scripts \u2014 and a stale key fails /cart/change.js\n    // with a 400 mid-queue, stranding a half-rewritten cart.\n    var chosen = assignments;\n    fetchCart()\n      .then(function (cart) {\n        buildModel(cart);\n        Object.keys(chosen).forEach(function (key) {\n          if (assignments[key]) {\n            assignments[key].pkg = chosen[key].pkg;\n            assignments[key].qty = chosen[key].qty;\n          }\n        });\n        return runQueue(buildQueue());\n      })\n      .then(function () {\n        document.dispatchEvent(new CustomEvent('ajaxProduct:added'));\n        // Drop the #gift-wrap hash so the reload lands on a closed\n        // builder with the updated cart lines in view.\n        if (window.history && history.replaceState) {\n          history.replaceState(null, '', window.location.pathname + window.location.search);\n        }\n        window.scrollTo(0, 0);\n        window.location.reload();\n      })\n      .catch(function (err) {\n        console.warn('[EMZ Gift Wrap] Save failed', err);\n        saving = false;\n        saveBtn.classList.remove('btn--loading');\n        saveBtn.disabled = false;\n        // Re-render from the real cart so the builder reflects whatever\n        // part of the queue landed before the failure; a second Save\n        // rebuilds intent from that live state and completes the job.\n        openBuilder();\n        showError(MSG_SAVE_FAILED);\n        errorEl.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      });\n  }\n\n  // --------------------------------------------------------- self-healing\n\n  // Inspects the cart for damage left by native cart controls and,\n  // when found, rewrites it through the same queue the builder uses:\n  // orphaned members get the hard-strip fold, empty or malformed wrap\n  // lines are removed and never re-added, and every surviving wrap\n  // line comes back with a freshly computed \"Contains\". Returns false\n  // when the cart is already consistent.\n  function heal(cart) {\n    buildModel(cart);\n\n    var wrapByPkg = {};\n    wrapLines.forEach(function (wrap) {\n      var n = parseInt((wrap.properties || {})[PROP_PACKAGE], 10) || 0;\n      if (!wrapByPkg[n]) wrapByPkg[n] = [];\n      wrapByPkg[n].push(wrap);\n    });\n\n    var needsHeal = false;\n\n    // Members whose wrap line is gone lose their assignment; the\n    // queue then strips the property and folds the quantity back\n    // into a matching plain line.\n    lines.forEach(function (line) {\n      var a = assignments[line.key];\n      if (a && a.pkg > 0 && !wrapByPkg[a.pkg]) {\n        a.pkg = 0;\n        needsHeal = true;\n      }\n    });\n\n    // Rope followers out of sync with the bar-derived plan trigger\n    // the same rewrite: an orphaned \"Gift package\" on a rope after a\n    // wrap-line removal, claims drifted by native quantity edits, or\n    // rope units exceeding their bar's units (trimmed), including a\n    // bar removed entirely (empty plan removes the whole group).\n    // Checked after the bar zeroing above so the plan reflects the\n    // healed assignments.\n    var ropesRemovedWithBar = false;\n    ropeGroups().forEach(function (group) {\n      var plan = ropePlanForGroup(group);\n      if (ropeStateMatchesPlan(group, plan)) return;\n      needsHeal = true;\n      var planned = 0;\n      Object.keys(plan).forEach(function (k) { planned += plan[k]; });\n      if (planned === 0) ropesRemovedWithBar = true;\n    });\n\n    var emptied = [];\n    var usedMap = {};\n    packageNumbersInUse().forEach(function (n) { usedMap[n] = true; });\n    Object.keys(wrapByPkg).forEach(function (k) {\n      var n = parseInt(k, 10);\n      var group = wrapByPkg[k];\n      if (!n || !usedMap[n]) {\n        // No package number at all, or no member items left.\n        emptied.push(n);\n        needsHeal = true;\n        return;\n      }\n      if (group.length > 1) {\n        // Duplicate wrap lines for one package; the rewrite collapses\n        // them to a single line.\n        needsHeal = true;\n        return;\n      }\n      var stored = (group[0].properties || {})[PROP_CONTAINS] || '';\n      if (stored !== containsSummary(n)) needsHeal = true;\n    });\n\n    if (!needsHeal) return Promise.resolve(false);\n\n    var notices = [];\n    var numbers = emptied.filter(function (n) { return n > 0; }).sort();\n    if (numbers.length === 1) {\n      notices.push('Package ' + numbers[0] + ' was empty, so we removed its gift wrap charge.');\n    } else if (numbers.length > 1) {\n      notices.push('Packages ' + numbers.join(' and ') + ' were empty, so we removed their gift wrap charges.');\n    } else if (emptied.length) {\n      notices.push('A gift wrap charge without a package was removed.');\n    }\n    if (ropesRemovedWithBar) {\n      notices.push('We removed the rope add-on because its soap bar was removed.');\n    }\n\n    return runQueue(buildQueue()).then(function () {\n      return { notice: notices.length ? notices.join(' ') : null };\n    });\n  }\n\n  function runHeal() {\n    if (saving || healing) return;\n    if (builder && !builder.hidden) return;\n    healing = true;\n    fetchCart()\n      .then(function (cart) { return heal(cart); })\n      .then(function (result) {\n        if (result === false) {\n          healing = false;\n          return;\n        }\n        if (result.notice) {\n          try { sessionStorage.setItem(HEAL_NOTICE_FLAG, result.notice); } catch (err) { }\n        }\n        // One added-event for the header count and drawer rebuild.\n        document.dispatchEvent(new CustomEvent('ajaxProduct:added'));\n        if (root) {\n          // On /cart the page body shows the lines server-rendered,\n          // so reload; healing stays true so nothing re-enters first.\n          window.location.reload();\n          return;\n        }\n        // Off /cart (drawer edits on any page) the rebuilt drawer is\n        // the only cart UI; no reload needed. The notice waits in\n        // sessionStorage for the next /cart render.\n        healing = false;\n      })\n      .catch(function (err) {\n        healing = false;\n        console.warn('[EMZ Gift Wrap] Self-heal failed', err);\n      });\n  }\n\n  // Debounced: cart:updated can fire several times for one gesture,\n  // and healing must never race the builder or its save queue.\n  function scheduleHeal() {\n    if (saving || healing) return;\n    if (builder && !builder.hidden) return;\n    clearTimeout(healTimer);\n    healTimer = setTimeout(runHeal, 600);\n  }\n\n  // --------------------------------------------------------------- events\n\n  function onLinesChange(evt) {\n    var select = evt.target.closest('[data-gw-select]');\n    var qtyInput = evt.target.closest('[data-gw-qty]');\n    var row = evt.target.closest('[data-gw-line]');\n    if (!row) return;\n    var key = row.getAttribute('data-key');\n    var a = assignments[key];\n    if (!a) return;\n\n    var line = null;\n    for (var i = 0; i < lines.length; i++) {\n      if (lines[i].key === key) { line = lines[i]; break; }\n    }\n    if (!line) return;\n\n    clearError();\n\n    if (select) {\n      var value = select.value;\n      if (value === 'new') {\n        var next = nextFreePackageNumber();\n        if (!next) {\n          select.value = String(a.pkg);\n          showError(MSG_MAX_PACKAGES);\n          return;\n        }\n        a.pkg = next;\n      } else {\n        a.pkg = parseInt(value, 10) || 0;\n      }\n      a.qty = line.quantity;\n      render();\n    } else if (qtyInput) {\n      var qty = parseInt(qtyInput.value, 10);\n      if (isNaN(qty)) qty = 1;\n      a.qty = Math.max(1, Math.min(qty, line.quantity));\n      render();\n    }\n  }\n\n  function onMessageInput(evt) {\n    var area = evt.target.closest('[data-gw-message]');\n    if (!area) return;\n    messagesByPackage[parseInt(area.getAttribute('data-package'), 10)] = area.value;\n  }\n\n  // Discoverability pulse: the first time the drawer opens with a\n  // wrappable line in the cart, the entry row runs one subtle\n  // attention animation. Once per session via sessionStorage, with an\n  // in-page fallback flag so blocked storage (private browsing) still\n  // caps it at one per page view. Reduced-motion users never pulse\n  // (belt; the CSS guard is the suspenders). Off /cart the tag-based\n  // exclusions have no data (tags come from the builder snippet), so\n  // a tag-excluded line can trigger the pulse; accepted for an\n  // attention heuristic. The row survives drawer rebuilds (it sits\n  // outside [data-products]), so the class must be removed on\n  // animationend rather than left behind.\n  function maybePulseDrawerRow() {\n    if (pulseShownThisPage) return;\n    var row = document.querySelector('.emz-gift-wrap-drawer-row');\n    if (!row || row.classList.contains(PULSE_CLASS)) return;\n    if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;\n    try {\n      if (sessionStorage.getItem(PULSE_FLAG)) return;\n    } catch (err) { }\n    fetchCart().then(function (cart) {\n      var any = (cart.items || []).some(function (item) {\n        return eligibility(item).ok;\n      });\n      if (!any || pulseShownThisPage) return;\n      pulseShownThisPage = true;\n      try { sessionStorage.setItem(PULSE_FLAG, '1'); } catch (err) { }\n      row.classList.add(PULSE_CLASS);\n      row.addEventListener('animationend', function () {\n        row.classList.remove(PULSE_CLASS);\n      }, { once: true });\n    }).catch(function () { });\n  }\n\n  function init() {\n    root = document.querySelector('[data-gift-wrap]');\n\n    // Self-healing triggers wire on EVERY page this script loads on\n    // (the drawer entry snippet loads it sitewide): drawer edits made\n    // anywhere must heal immediately, not wait for a /cart visit.\n    // ajaxProduct:added is the belt for add flows; a consistent cart\n    // makes the extra debounced check a no-op.\n    document.addEventListener('cart:updated', scheduleHeal);\n    document.addEventListener('ajaxProduct:added', scheduleHeal);\n    scheduleHeal();\n\n    // theme.js dispatches drawerOpen.CartDrawer on every cart drawer\n    // open, manual and post-add alike.\n    document.addEventListener('drawerOpen.CartDrawer', maybePulseDrawerRow);\n\n    // A parked heal notice normally shows inside the builder, but a\n    // heal can empty the cart entirely (bar removed -> ropes removed\n    // -> package empty -> wrap charge removed), and /cart then\n    // renders without the builder. Surface the notice standalone so\n    // the disappearing charges are explained; the sitewide drawer\n    // snippet already loads the stylesheet.\n    if (!root && document.body && document.body.classList.contains('template-cart')) {\n      var parked = null;\n      try {\n        parked = sessionStorage.getItem(HEAL_NOTICE_FLAG);\n        if (parked) sessionStorage.removeItem(HEAL_NOTICE_FLAG);\n      } catch (err) { }\n      if (parked) {\n        var holder = document.querySelector('.page-content .section-header') ||\n          document.querySelector('.page-content');\n        if (holder) {\n          var standalone = document.createElement('p');\n          standalone.className = 'emz-gift-wrap__notice';\n          standalone.setAttribute('role', 'status');\n          standalone.textContent = parked;\n          holder.appendChild(standalone);\n        }\n      }\n    }\n\n    // Everything below is builder wiring; it exists only on /cart.\n    if (!root) return;\n\n    builder = root.querySelector('[data-gw-builder]');\n    toggle = root.querySelector('[data-gw-toggle]');\n    linesEl = root.querySelector('[data-gw-lines]');\n    packagesEl = root.querySelector('[data-gw-packages]');\n    errorEl = root.querySelector('[data-gw-error]');\n    noticeEl = root.querySelector('[data-gw-notice]');\n    saveBtn = root.querySelector('[data-gw-save]');\n    cancelBtn = root.querySelector('[data-gw-cancel]');\n    wrapPrice = root.getAttribute('data-wrap-price') || '';\n\n    // A heal that removed an empty wrap line reloads the page; its\n    // notice is parked in sessionStorage and shown here afterward.\n    if (noticeEl) {\n      var healNote = null;\n      try {\n        healNote = sessionStorage.getItem(HEAL_NOTICE_FLAG);\n        if (healNote) sessionStorage.removeItem(HEAL_NOTICE_FLAG);\n      } catch (err) { }\n      if (healNote) {\n        noticeEl.textContent = healNote;\n        noticeEl.hidden = false;\n      }\n    }\n\n    var metaEl = root.querySelector('[data-gw-product-meta]');\n    if (metaEl) {\n      try {\n        JSON.parse(metaEl.textContent).forEach(function (entry) {\n          tagsByProduct[entry.id] = entry.tags || [];\n        });\n      } catch (err) {\n        console.warn('[EMZ Gift Wrap] Could not parse product meta', err);\n      }\n    }\n\n    toggle.addEventListener('click', function () {\n      if (builder.hidden) openBuilder();\n      else closeBuilder();\n    });\n    cancelBtn.addEventListener('click', closeBuilder);\n    saveBtn.addEventListener('click', save);\n    linesEl.addEventListener('change', onLinesChange);\n    packagesEl.addEventListener('input', onMessageInput);\n\n    // ---- landing scroll ------------------------------------------\n    // A single scrollIntoView lands wrong on Safari: the header can\n    // cover the builder, and layout keeps shifting after\n    // DOMContentLoaded (cart images, the free-shipping banner, app\n    // embeds), while iOS collapses its URL bar even on programmatic\n    // scrolls. Each assert measures what is pinned over the viewport\n    // top AT THAT MOMENT and corrects the residual, because the\n    // pinned stack changes height as the page scrolls (measured on\n    // the cart page: 175px at page top compacting to 100px once\n    // scrolled). The anchor is the [data-gift-wrap] container, whose\n    // top edge is the entry button. The customer scrolling on their\n    // own cancels everything.\n    //\n    // What actually pins is defined by emz-sticky-header-fix.css: the\n    // SECTION wrappers, announcement at top 0 (z-60) and the header\n    // section below it (z-50), both position sticky at all times.\n    // .header-sticky-wrapper itself is position relative and\n    // .site-header sits static inside it, so measuring those reads\n    // zero overlay; they stay in the list only as fallbacks for\n    // other header configurations, gated by the position check.\n\n    var OVERLAY_SELECTORS = '.shopify-section-group-header-group, [id$=\"__announcement\"], [id$=\"__header\"], .emz-announcement-section, .emz-header-section, .site-header, #HeaderWrapper';\n    var LANDING_GAP = 16;\n\n    // Depth of the pinned header stack right now. Only fixed or\n    // sticky elements count: in-flow header content scrolls away\n    // with the page and never overlays the builder.\n    function overlayDepth() {\n      var depth = 0;\n      var els = document.querySelectorAll(OVERLAY_SELECTORS);\n      for (var i = 0; i < els.length; i++) {\n        var style = getComputedStyle(els[i]);\n        if (style.position !== 'fixed' && style.position !== 'sticky') continue;\n        var rect = els[i].getBoundingClientRect();\n        if (rect.height === 0 || rect.top > innerHeight / 2) continue;\n        if (rect.bottom > depth) depth = rect.bottom;\n      }\n      return Math.max(0, depth);\n    }\n\n    // Minimal-scroll landing: the builder must be visible, but the\n    // page should still read as the cart. The builder top may rest\n    // anywhere between the pinned stack (plus a gap) and just past\n    // mid-viewport; inside that band nothing scrolls, so the page\n    // title, the continue-shopping line, and on taller screens the\n    // first cart lines stay in view. Scrolling engages only when the\n    // builder is covered by the header (scroll up to the gap) or\n    // below the band (scroll down just far enough).\n    function landingDelta() {\n      var top = root.getBoundingClientRect().top;\n      var floor = overlayDepth() + LANDING_GAP;\n      var ceiling = Math.max(floor + 40, Math.round(window.innerHeight * 0.55));\n      if (top < floor - 4) return top - floor;\n      if (top > ceiling + 4) return top - ceiling;\n      return 0;\n    }\n\n    function builderVisiblyPlaced() {\n      return landingDelta() === 0;\n    }\n\n    var programmaticScroll = false;\n\n    function assertScroll() {\n      var delta = landingDelta();\n      if (delta === 0) return;\n      // Instant, overriding the theme's scroll-behavior: smooth CSS.\n      // A plain scroll still animates under that CSS, and animated\n      // scrolls need animation frames that throttled or interrupted\n      // pages never grant, so they can silently go nowhere. Safari's\n      // stop-wherever-it-is smooth scrolling is how the builder\n      // landed mid-cart in the first place.\n      var htmlStyle = document.documentElement.style;\n      var previous = htmlStyle.scrollBehavior;\n      htmlStyle.scrollBehavior = 'auto';\n      programmaticScroll = true;\n      window.scrollBy(0, delta);\n      htmlStyle.scrollBehavior = previous;\n      requestAnimationFrame(function () {\n        requestAnimationFrame(function () { programmaticScroll = false; });\n      });\n    }\n\n    function landBuilderInView() {\n      var deadline = Date.now() + 3200;\n      var cancelled = false;\n      function cancel() { cancelled = true; }\n      window.addEventListener('wheel', cancel, { once: true, passive: true });\n      window.addEventListener('touchstart', cancel, { once: true, passive: true });\n      window.addEventListener('keydown', cancel, { once: true });\n      // A scroll this code did not make is the customer taking over,\n      // whatever input produced it: scrollbar drags fire only scroll\n      // events, never wheel or touch.\n      function onScroll() {\n        if (!programmaticScroll) cancel();\n      }\n      window.addEventListener('scroll', onScroll, { passive: true });\n      setTimeout(function () { window.removeEventListener('scroll', onScroll); }, 3300);\n\n      assertScroll();\n\n      function reassert() {\n        if (cancelled || Date.now() > deadline) return;\n        if (!builderVisiblyPlaced()) assertScroll();\n      }\n      setTimeout(reassert, 450);\n      setTimeout(reassert, 1100);\n      setTimeout(reassert, 2200);\n      if (document.readyState !== 'complete') {\n        window.addEventListener('load', function () { setTimeout(reassert, 60); }, { once: true });\n      }\n      // iOS URL bar collapse resizes the visual viewport; re-check\n      // once each resize settles, inside the same deadline window.\n      if (window.visualViewport) {\n        var vv = window.visualViewport;\n        var onResize = function () { setTimeout(reassert, 120); };\n        vv.addEventListener('resize', onResize);\n        setTimeout(function () { vv.removeEventListener('resize', onResize); }, 3400);\n      }\n    }\n\n    function openFromHash() {\n      if (window.location.hash !== OPEN_HASH) return;\n      document.dispatchEvent(new CustomEvent('cart:close'));\n      openBuilder();\n      landBuilderInView();\n    }\n\n    window.addEventListener('hashchange', openFromHash);\n    openFromHash();\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', init);\n  } else {\n    init();\n  }\n})();\n"],
  "mappings": "CA0DC,UAAY,CACX,aAEA,GAAI,OAAO,kBAAmB,OAC9B,OAAO,kBAAoB,GAI3B,IAAI,aAAe,EACf,uBAAyB,IACzB,gBAAkB,cAClB,mBAAqB,cACrB,gBAAkB,cAGlB,YAAc,eACd,aAAe,UACf,cAAgB,WAChB,aAAe,eACf,cAAgB,WAMhB,qBAAuB,CACzB,gBACA,cACA,cACA,aACF,EACI,gCAAkC,CACpC,qBACA,MACA,kBACA,cACA,oBACA,SACA,MACF,EAEI,oBAAsB,gEACtB,iBAAmB,iEACnB,eAAiB,+CACjB,iBAAmB,uBAAyB,aAAe,+BAC3D,gBAAkB,8GAClB,qBAAuB,sDAEvB,UAAY,aAIZ,KAAM,QAAS,OAAQ,QAAS,WAAY,QAAS,SAAU,QAAS,UACxE,UAAY,GACZ,cAAgB,CAAC,EACjB,MAAQ,CAAC,EACT,UAAY,CAAC,EACb,UAAY,CAAC,EACb,YAAc,CAAC,EACf,kBAAoB,CAAC,EACrB,OAAS,GACT,QAAU,GACV,UAAY,KAEZ,iBAAmB,wBAInB,WAAa,wBACb,YAAc,kCACd,mBAAqB,GAEzB,SAAS,SAAU,CACjB,OAAQ,OAAO,OAAS,MAAM,QAAU,MAAM,OAAO,MAAS,UAChE,CACA,SAAS,YAAa,CACpB,OAAQ,OAAO,OAAS,MAAM,QAAU,MAAM,OAAO,SAAY,cACnE,CACA,SAAS,eAAgB,CACvB,OAAQ,OAAO,OAAS,MAAM,QAAU,MAAM,OAAO,YAAe,iBACtE,CAEA,SAAS,WAAW,IAAK,CACvB,OAAO,OAAO,KAAO,KAAO,GAAK,GAAG,EACjC,QAAQ,KAAM,OAAO,EACrB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,QAAQ,CAC3B,CAEA,SAAS,SAAS,IAAK,CACrB,OAAK,IACE,KAAO,IAAI,QAAQ,GAAG,IAAM,GAAK,IAAM,KAAO,WADpC,EAEnB,CAIA,SAAS,YAAY,KAAM,CACzB,GAAI,KAAK,wBACP,MAAO,CAAE,GAAI,GAAO,OAAQ,mBAAoB,EAElD,GAAI,KAAK,UACP,MAAO,CAAE,GAAI,GAAO,OAAQ,gBAAiB,EAE/C,GAAI,qBAAqB,QAAQ,KAAK,UAAU,IAAM,GACpD,MAAO,CAAE,GAAI,GAAO,OAAQ,cAAe,EAG7C,QADI,SAAW,CAAC,KAAK,cAAgB,EAAE,EAAE,OAAO,cAAc,KAAK,UAAU,GAAK,CAAC,CAAC,EAC3E,EAAI,EAAG,EAAI,SAAS,OAAQ,IAEnC,QADI,MAAQ,OAAO,SAAS,CAAC,CAAC,EAAE,YAAY,EACnC,EAAI,EAAG,EAAI,gCAAgC,OAAQ,IAC1D,GAAI,MAAM,QAAQ,gCAAgC,CAAC,CAAC,IAAM,GACxD,MAAO,CAAE,GAAI,GAAO,OAAQ,cAAe,EAIjD,MAAO,CAAE,GAAI,GAAM,OAAQ,EAAG,CAChC,CAIA,SAAS,WAAW,KAAM,CACxB,MAAQ,CAAC,EACT,UAAY,CAAC,EACb,UAAY,CAAC,EACb,YAAc,CAAC,EAEf,KAAK,MAAM,QAAQ,SAAU,KAAM,CACjC,GAAI,KAAK,aAAe,gBAAiB,CACvC,UAAU,KAAK,IAAI,EACnB,IAAI,MAAQ,KAAK,YAAc,CAAC,EAC5B,IAAM,SAAS,MAAM,YAAY,EAAG,EAAE,EACtC,KAAO,kBAAkB,GAAG,IAAM,SACpC,kBAAkB,GAAG,EACnB,MAAM,YAAY,GAAK,MAAM,YAAY,IAAM,OAAS,MAAM,YAAY,EAAI,IAElF,MACF,CAEA,GAAI,KAAK,aAAe,gBAAiB,CACvC,IAAI,UAAY,KAAK,YAAc,CAAC,EAKpC,GAAI,CAAC,KAAK,yBAA2B,UAAU,aAAa,EAAG,CAC7D,UAAU,KAAK,CACb,IAAK,KAAK,IACV,UAAW,KAAK,WAChB,SAAU,KAAK,SACf,QAAS,UAAU,aAAa,EAChC,eAAgB,SAAS,UAAU,WAAW,EAAG,EAAE,GAAK,CAC1D,CAAC,EACD,MACF,CACF,CAEA,IAAI,WAAa,KAAK,YAAc,CAAC,EACjC,KAAO,YAAY,IAAI,EACvB,eAAiB,SAAS,WAAW,WAAW,EAAG,EAAE,GAAK,EAC1D,KAAO,CACT,IAAK,KAAK,IACV,UAAW,KAAK,WAChB,UAAW,KAAK,WAChB,MAAO,KAAK,cACZ,aACE,KAAK,eAAiB,KAAK,gBAAkB,gBAAkB,KAAK,cAAgB,GACtF,MAAO,KAAK,MACZ,SAAU,KAAK,SACf,WAAY,WACZ,SAAU,KAAK,GACf,OAAQ,KAAK,OACb,eAAgB,cAClB,EACA,MAAM,KAAK,IAAI,EACf,YAAY,KAAK,GAAG,EAAI,CAAE,IAAK,eAAgB,IAAK,KAAK,QAAS,CACpE,CAAC,CACH,CAEA,SAAS,qBAAsB,CAC7B,IAAI,KAAO,CAAC,EACR,QAAU,CAAC,EACf,aAAM,QAAQ,SAAU,KAAM,CAC5B,IAAI,EAAI,YAAY,KAAK,GAAG,EACxB,GAAK,EAAE,IAAM,GAAK,EAAE,IAAM,GAAK,CAAC,KAAK,EAAE,GAAG,IAC5C,KAAK,EAAE,GAAG,EAAI,GACd,QAAQ,KAAK,EAAE,GAAG,EAEtB,CAAC,EACM,QAAQ,KAAK,SAAU,EAAG,EAAG,CAAE,OAAO,EAAI,CAAG,CAAC,CACvD,CAEA,SAAS,uBAAwB,CAE/B,QADI,KAAO,oBAAoB,EACtB,EAAI,EAAG,GAAK,aAAc,IACjC,GAAI,KAAK,QAAQ,CAAC,IAAM,GAAI,OAAO,EAErC,MAAO,EACT,CAEA,SAAS,UAAU,KAAM,CACvB,OAAO,KAAK,OAAS,KAAK,aAAe,KAAO,KAAK,aAAe,IAAM,GAC5E,CAIA,SAAS,YAAa,CACpB,IAAI,MAAQ,CAAC,EACT,OAAS,CAAC,EACd,iBAAU,QAAQ,SAAU,KAAM,CAC3B,MAAM,KAAK,OAAO,IACrB,MAAM,KAAK,OAAO,EAAI,CAAE,QAAS,KAAK,QAAS,UAAW,KAAK,UAAW,MAAO,CAAC,EAAG,MAAO,CAAE,EAC9F,OAAO,KAAK,MAAM,KAAK,OAAO,CAAC,GAEjC,MAAM,KAAK,OAAO,EAAE,MAAM,KAAK,IAAI,EACnC,MAAM,KAAK,OAAO,EAAE,OAAS,KAAK,QACpC,CAAC,EACM,MACT,CAUA,SAAS,iBAAiB,MAAO,CAC/B,IAAI,cAAgB,EAChB,cAAgB,CAAC,EACrB,MAAM,QAAQ,SAAU,KAAM,CAC5B,GAAI,KAAK,QAAU,MAAM,UACzB,eAAiB,KAAK,SAClB,EAAC,KAAK,UACV,KAAI,EAAI,YAAY,KAAK,GAAG,EACxB,CAAC,GAAK,EAAE,KAAO,IACnB,cAAc,EAAE,GAAG,GAAK,cAAc,EAAE,GAAG,GAAK,GAAK,KAAK,IAAI,EAAG,KAAK,IAAI,EAAE,IAAK,KAAK,QAAQ,CAAC,GACjG,CAAC,EACD,IAAI,UAAY,KAAK,IAAI,MAAM,MAAO,aAAa,EAC/C,QAAU,CAAC,EACf,cAAO,KAAK,aAAa,EACtB,IAAI,MAAM,EACV,KAAK,SAAU,EAAG,EAAG,CAAE,OAAO,EAAI,CAAG,CAAC,EACtC,QAAQ,SAAU,IAAK,CACtB,IAAI,MAAQ,KAAK,IAAI,UAAW,cAAc,GAAG,CAAC,EAC9C,MAAQ,IACV,QAAQ,OAAO,GAAG,CAAC,EAAI,MACvB,WAAa,MAEjB,CAAC,EACC,UAAY,IAAG,QAAQ,CAAG,EAAI,WAC3B,OACT,CAKA,SAAS,qBAAqB,MAAO,QAAS,CAC5C,IAAI,QAAU,CAAC,EACX,UAAY,GAMhB,GALA,MAAM,MAAM,QAAQ,SAAU,KAAM,CAClC,IAAI,EAAI,OAAO,KAAK,gBAAkB,CAAC,EACnC,QAAQ,CAAC,IAAM,SAAW,UAAY,IAC1C,QAAQ,CAAC,GAAK,QAAQ,CAAC,GAAK,GAAK,KAAK,QACxC,CAAC,EACG,UAAW,MAAO,GACtB,IAAI,YAAc,OAAO,KAAK,OAAO,EACrC,GAAI,YAAY,SAAW,OAAO,KAAK,OAAO,EAAE,OAAQ,MAAO,GAC/D,QAAS,EAAI,EAAG,EAAI,YAAY,OAAQ,IACtC,GAAI,QAAQ,YAAY,CAAC,CAAC,IAAM,QAAQ,YAAY,CAAC,CAAC,EAAG,MAAO,GAElE,MAAO,EACT,CAEA,SAAS,gBAAgB,IAAK,CAC5B,IAAI,OAAS,CAAC,EACV,MAAQ,CAAC,EACb,MAAM,QAAQ,SAAU,KAAM,CAC5B,IAAI,EAAI,YAAY,KAAK,GAAG,EAC5B,GAAI,GAAC,GAAK,EAAE,MAAQ,KAAO,EAAE,IAAM,GACnC,KAAI,MAAQ,UAAU,IAAI,EACtB,OAAO,KAAK,IAAM,SACpB,OAAO,KAAK,EAAI,EAChB,MAAM,KAAK,KAAK,GAElB,OAAO,KAAK,GAAK,EAAE,IACrB,CAAC,EACD,IAAI,MAAQ,MAAM,IAAI,SAAU,MAAO,CAAE,OAAO,OAAO,KAAK,EAAI,KAAO,KAAO,CAAC,EAG/E,kBAAW,EAAE,QAAQ,SAAU,MAAO,CACpC,IAAI,QAAU,iBAAiB,KAAK,EAAE,OAAO,GAAG,CAAC,GAAK,EACtD,GAAK,SACL,QAAS,EAAI,EAAG,EAAI,MAAM,OAAQ,IAChC,GAAI,MAAM,CAAC,EAAE,QAAQ,MAAM,OAAO,IAAM,EAAG,CACzC,MAAM,CAAC,GAAK,UAAY,OAAO,MAAM,CAAC,CAAC,EAAI,UAAY,MAAQ,QAAU,SACzE,KACF,EAEJ,CAAC,EACM,MAAM,KAAK,IAAI,CACxB,CAIA,SAAS,QAAS,CAChB,YAAY,EACZ,eAAe,CACjB,CAEA,SAAS,aAAc,CACrB,GAAI,CAAC,MAAM,OAAQ,CACjB,QAAQ,UAAY,GACpB,MACF,CAEA,IAAI,SAAW,MAAM,OAAO,SAAU,EAAG,CAAE,OAAO,EAAE,QAAU,CAAC,EAC3D,KAAO,oBAAoB,EAC3B,UAAY,KAAK,OAAS,aAC1B,WAAa,CAAC,EAClB,UAAU,QAAQ,SAAU,EAAG,CAAE,WAAW,EAAE,OAAO,EAAI,EAAM,CAAC,EAChE,IAAI,KAAO,GAEN,SAAS,SACZ,MAAQ,kCAAoC,WAAW,oBAAoB,EAAI,QAGjF,MAAM,QAAQ,SAAU,KAAM,MAAO,CACnC,IAAI,EAAI,YAAY,KAAK,GAAG,EACxB,SAAW,uBAAyB,KAAK,SAAW,GAAK,kCAC7D,MAAQ,eAAiB,SAAW,4BAA8B,WAAW,KAAK,GAAG,EAAI,KAErF,KAAK,MACP,MACE,+CAAiD,WAAW,SAAS,KAAK,KAAK,CAAC,EAChF,kDAEF,MAAQ,mFAGV,MAAQ,yCACR,MAAQ,0CAA4C,WAAW,KAAK,KAAK,EAAI,SAC7E,IAAI,SAAW,CAAC,EAYhB,GAXI,KAAK,cAAc,SAAS,KAAK,KAAK,YAAY,EACtD,SAAS,KAAK,OAAS,KAAK,QAAQ,EACpC,MAAQ,yCAA2C,WAAW,SAAS,KAAK,KAAK,CAAC,EAAI,SAClF,WAAW,KAAK,KAAK,IACvB,MAAQ,wEAEL,KAAK,WACR,MAAQ,2CAA6C,WAAW,KAAK,MAAM,EAAI,UAEjF,MAAQ,SAEJ,KAAK,SAAU,CACjB,IAAI,SAAW,kBAAoB,MAoBnC,GAnBA,MAAQ,6CACR,MACE,oCAAsC,SAAW,mBACjD,WAAW,UAAU,IAAI,CAAC,EAAI,WAChC,MAAQ,eAAiB,SAAW,kDACpC,MAAQ,qBAAuB,EAAE,MAAQ,EAAI,YAAc,IAAM,yBACjE,KAAK,QAAQ,SAAU,EAAG,CACxB,MACE,kBAAoB,EAAI,KAAO,EAAE,MAAQ,EAAI,YAAc,IAAM,YAAc,EAC/E,WACJ,CAAC,EACG,EAAE,IAAM,GAAK,KAAK,QAAQ,EAAE,GAAG,IAAM,KACvC,MAAQ,kBAAoB,EAAE,IAAM,sBAAwB,EAAE,IAAM,aAElE,YACF,MAAQ,8CAEV,MAAQ,YAEJ,EAAE,IAAM,GAAK,KAAK,SAAW,EAAG,CAClC,IAAI,MAAQ,eAAiB,MAC7B,MAAQ,gDAAkD,MAAQ,UAClE,MACE,cAAgB,MAAQ,uEACxB,KAAK,SAAW,yCAA2C,EAAE,IAAM,KACrE,MAAQ,OAAS,KAAK,SAAW,UACnC,CACA,MAAQ,QACV,CAEA,MAAQ,QACV,CAAC,EAED,QAAQ,UAAY,IACtB,CAEA,SAAS,gBAAiB,CACxB,IAAI,KAAO,oBAAoB,EAC3B,KAAO,GAEX,KAAK,QAAQ,SAAU,EAAG,CACxB,IAAI,QAAU,kBAAkB,CAAC,GAAK,GAClC,OAAS,mBAAqB,EAClC,MAAQ,wDAA0D,EAAI,KACtE,MACE,0DAA4D,EAAI,gBAChE,WAAW,SAAS,EAAI,gBAC1B,MACE,gDAAkD,WAAW,gBAAgB,CAAC,CAAC,EAC/E,SACF,MACE,oDAAsD,OACtD,oCACF,MACE,iBAAmB,OAAS,kEAC5B,EAAI,gBAAkB,uBACtB,sDAAwD,WAAW,OAAO,EAC1E,cACF,MACE,kDAAoD,uBACpD,qBACF,MAAQ,QACV,CAAC,EAED,WAAW,UAAY,IACzB,CAEA,SAAS,UAAU,QAAS,CAC1B,QAAQ,YAAc,QACtB,QAAQ,OAAS,EACnB,CAEA,SAAS,YAAa,CACpB,QAAQ,YAAc,GACtB,QAAQ,OAAS,EACnB,CAIA,SAAS,aAAc,CACrB,WAAW,EACX,OAAO,aAAa,gBAAiB,MAAM,EAC3C,QAAQ,OAAS,GAEjB,UAAU,EACP,KAAK,SAAU,KAAM,CACpB,WAAW,IAAI,EACf,OAAO,CACT,CAAC,EACA,MAAM,SAAU,IAAK,CACpB,QAAQ,KAAK,0CAA2C,GAAG,EAC3D,UAAU,eAAe,CAC3B,CAAC,CACL,CAEA,SAAS,cAAe,CACtB,OAAO,aAAa,gBAAiB,OAAO,EAC5C,QAAQ,OAAS,EACnB,CAIA,SAAS,aAAa,WAAY,QAAS,CACzC,IAAI,IAAM,CAAC,EACP,KAAO,OAAO,KAAK,YAAc,CAAC,CAAC,EACvC,YAAK,QAAQ,SAAU,IAAK,CAC1B,GAAI,MAAQ,QACZ,KAAI,MAAQ,WAAW,GAAG,EAGtB,OAAU,MAA+B,OAAO,KAAK,IAAM,KAC/D,IAAI,GAAG,EAAI,OACb,CAAC,EACM,GACT,CAEA,SAAS,WAAW,EAAG,EAAG,CACxB,IAAI,MAAQ,OAAO,KAAK,CAAC,EACrB,MAAQ,OAAO,KAAK,CAAC,EACzB,GAAI,MAAM,SAAW,MAAM,OAAQ,MAAO,GAC1C,QAAS,EAAI,EAAG,EAAI,MAAM,OAAQ,IAAK,CACrC,IAAI,IAAM,MAAM,CAAC,EACjB,GAAI,EAAE,OAAO,IAAM,OAAO,EAAE,GAAG,CAAC,IAAM,OAAO,EAAE,GAAG,CAAC,EAAG,MAAO,EAC/D,CACA,MAAO,EACT,CAEA,SAAS,SAAS,IAAK,QAAS,CAC9B,OAAO,MAAM,IAAK,CAChB,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,mBAAoB,gBACtB,EACA,KAAM,KAAK,UAAU,OAAO,CAC9B,CAAC,EAAE,KAAK,SAAU,SAAU,CAC1B,OAAO,SAAS,KAAK,EAAE,KAAK,SAAU,KAAM,CAC1C,GAAI,CAAC,SAAS,IAAO,MAAQ,KAAK,OAAS,CACzC,IAAI,MAAQ,IAAI,MACb,OAAS,KAAK,aAAe,KAAK,UAAa,qBAClD,EACA,YAAM,WAAa,SAAS,OACtB,KACR,CACA,OAAO,IACT,CAAC,CACH,CAAC,CACH,CAEA,SAAS,WAAY,CACnB,OAAO,MAAM,QAAQ,EAAG,CAAE,QAAS,CAAE,mBAAoB,gBAAiB,CAAE,CAAC,EAC1E,KAAK,SAAU,SAAU,CAAE,OAAO,SAAS,KAAK,CAAG,CAAC,CACzD,CAEA,SAAS,WAAW,IAAK,SAAU,CACjC,OAAO,SAAS,cAAc,EAAG,CAAE,GAAI,IAAK,SAAU,QAAS,CAAC,CAClE,CAEA,SAAS,QAAQ,UAAW,SAAU,WAAY,CAChD,IAAI,QAAU,CAAE,GAAI,UAAW,SAAU,QAAS,EAClD,OAAI,YAAc,OAAO,KAAK,UAAU,EAAE,SAAQ,QAAQ,WAAa,YAChE,SAAS,WAAW,EAAG,OAAO,CACvC,CAEA,IAAI,aAAe,EAEnB,SAAS,MAAM,GAAI,CACjB,OAAO,IAAI,QAAQ,SAAU,QAAS,CAAE,WAAW,QAAS,EAAE,CAAG,CAAC,CACpE,CAMA,SAAS,YAAY,IAAK,CACxB,MAAO,CAAC,IAAI,YAAc,IAAI,aAAe,KAAO,IAAI,YAAc,GACxE,CAOA,SAAS,mBAAmB,IAAK,SAAU,CACzC,IAAI,SAAW,EACf,SAAS,QAAS,CAChB,OAAO,UAAU,EAAE,KAAK,SAAU,KAAM,CACtC,QAAS,EAAI,EAAG,EAAI,KAAK,MAAM,OAAQ,IACrC,GAAI,KAAK,MAAM,CAAC,EAAE,MAAQ,IAAK,OAAO,KAAK,MAAM,CAAC,EAAE,WAAa,SAEnE,OAAO,WAAa,CACtB,CAAC,EAAE,MAAM,UAAY,CAAE,MAAO,EAAO,CAAC,CACxC,CACA,SAAS,SAAU,CACjB,iBAAY,EACL,WAAW,IAAK,QAAQ,EAAE,MAAM,SAAU,IAAK,CACpD,eAAQ,KAAK,kCAAoC,SAAW,UAAW,IAAK,GAAG,EACxE,MAAM,IAAM,QAAQ,EAAE,KAAK,MAAM,EAAE,KAAK,SAAU,KAAM,CAC7D,GAAI,KAAM,OAAO,KACjB,GAAI,UAAY,cAAgB,CAAC,YAAY,GAAG,EAAG,MAAM,IACzD,OAAO,QAAQ,CACjB,CAAC,CACH,CAAC,CACH,CACA,OAAO,QAAQ,CACjB,CAKA,SAAS,gBAAgB,UAAW,SAAU,WAAY,CACxD,IAAI,SAAW,EACf,SAAS,SAAU,CACjB,iBAAY,EACL,QAAQ,UAAW,SAAU,UAAU,EAAE,MAAM,SAAU,IAAK,CAEnE,GADA,QAAQ,KAAK,+BAAiC,SAAW,UAAW,UAAW,GAAG,EAC9E,UAAY,cAAgB,CAAC,YAAY,GAAG,EAAG,MAAM,IACzD,OAAO,MAAM,IAAM,QAAQ,EAAE,KAAK,OAAO,CAC3C,CAAC,CACH,CACA,OAAO,QAAQ,CACjB,CAOA,SAAS,YAAa,CACpB,IAAI,WAAa,CAAC,EACd,UAAY,CAAC,EACb,SAAW,CAAC,EAKhB,SAAS,iBAAiB,KAAM,UAAW,CACzC,QAAS,EAAI,EAAG,EAAI,MAAM,OAAQ,IAAK,CACrC,IAAI,MAAQ,MAAM,CAAC,EACnB,GAAI,QAAM,MAAQ,KAAK,KAAO,SAAS,MAAM,GAAG,IAC5C,QAAM,YAAc,KAAK,WAAa,CAAC,MAAM,UACjD,KAAI,GAAK,YAAY,MAAM,GAAG,EAC9B,GAAI,GAAC,IAAM,GAAG,MAAQ,GAAK,MAAM,iBAAmB,IAChD,WAAW,aAAa,MAAM,WAAY,WAAW,EAAG,SAAS,EAAG,OAAO,MACjF,CACA,OAAO,IACT,CAEA,iBAAU,QAAQ,SAAU,KAAM,CAChC,WAAW,KAAK,UAAY,CAAE,OAAO,mBAAmB,KAAK,IAAK,CAAC,CAAG,CAAC,CACzE,CAAC,EAED,MAAM,QAAQ,SAAU,KAAM,CAC5B,GAAK,KAAK,SACV,KAAI,EAAI,YAAY,KAAK,GAAG,EACxB,IAAM,EAAE,IACR,IAAM,IAAM,EAAI,KAAK,IAAI,EAAG,KAAK,IAAI,EAAE,IAAK,KAAK,QAAQ,CAAC,EAAI,EAE9D,UACD,MAAQ,GAAK,KAAK,iBAAmB,GACrC,MAAQ,KAAK,gBAAkB,MAAQ,KAAK,SAC/C,GAAI,WAEJ,KAAI,UAAY,aAAa,KAAK,WAAY,WAAW,EAEzD,GAAI,KAAK,iBAAmB,GAAK,IAAM,GAAK,IAAM,KAAK,SAGrD,WAAW,KAAK,UAAY,CAAE,OAAO,mBAAmB,KAAK,IAAK,KAAK,SAAW,GAAG,CAAG,CAAC,UAEzF,WAAW,KAAK,UAAY,CAAE,OAAO,mBAAmB,KAAK,IAAK,CAAC,CAAG,CAAC,EACnE,MAAQ,GAAK,IAAM,KAAK,SAAU,CACpC,IAAI,SAAW,MAAQ,EAAI,KAAK,SAAW,KAAK,SAAW,IACvD,QAAU,iBAAiB,KAAM,SAAS,EAC1C,UACF,SAAS,QAAQ,GAAG,EAAI,GACxB,UAAY,QAAQ,SACpB,WAAW,KAAK,UAAY,CAAE,OAAO,mBAAmB,QAAQ,IAAK,CAAC,CAAG,CAAC,GAE5E,UAAU,KAAK,UAAY,CAAE,OAAO,gBAAgB,KAAK,UAAW,SAAU,SAAS,CAAG,CAAC,CAC7F,CAGF,GAAI,IAAM,EAAG,CACX,IAAI,aAAe,aAAa,KAAK,WAAY,WAAW,EAC5D,aAAa,WAAW,EAAI,OAAO,GAAG,EACtC,UAAU,KAAK,UAAY,CAAE,OAAO,gBAAgB,KAAK,UAAW,IAAK,YAAY,CAAG,CAAC,CAC3F,GACF,CAAC,EAMD,WAAW,EAAE,QAAQ,SAAU,MAAO,CACpC,IAAI,QAAU,iBAAiB,KAAK,EAChC,qBAAqB,MAAO,OAAO,IACvC,MAAM,MAAM,QAAQ,SAAU,KAAM,CAClC,WAAW,KAAK,UAAY,CAAE,OAAO,mBAAmB,KAAK,IAAK,CAAC,CAAG,CAAC,CACzE,CAAC,EACD,OAAO,KAAK,OAAO,EAAE,QAAQ,SAAU,OAAQ,CAC7C,IAAI,MAAQ,CAAC,EACb,MAAM,aAAa,EAAI,MAAM,QACzB,SAAW,MAAK,MAAM,WAAW,EAAI,QACzC,UAAU,KAAK,UAAY,CAAE,OAAO,gBAAgB,MAAM,UAAW,QAAQ,MAAM,EAAG,KAAK,CAAG,CAAC,CACjG,CAAC,EACH,CAAC,EAED,oBAAoB,EAAE,QAAQ,SAAU,EAAG,CACzC,UAAU,KAAK,UAAY,CACzB,IAAI,MAAQ,CAAC,EACb,MAAM,YAAY,EAAI,OAAO,CAAC,EAC9B,MAAM,aAAa,EAAI,gBAAgB,CAAC,EACxC,IAAI,SAAW,kBAAkB,CAAC,GAAK,IAAI,KAAK,EAAE,MAAM,EAAG,sBAAsB,EACjF,aAAM,YAAY,EAAI,SAAW,OAC1B,gBAAgB,mBAAoB,EAAG,KAAK,CACrD,CAAC,CACH,CAAC,EAEM,WAAW,OAAO,SAAS,CACpC,CAEA,SAAS,SAAS,MAAO,CACvB,OAAO,MAAM,OAAO,SAAU,MAAO,KAAM,CACzC,OAAO,MAAM,KAAK,IAAI,CACxB,EAAG,QAAQ,QAAQ,CAAC,CACtB,CAEA,SAAS,MAAO,CACd,GAAI,QACJ,QAAS,GACT,WAAW,EACX,QAAQ,UAAU,IAAI,cAAc,EACpC,QAAQ,SAAW,GAQnB,IAAI,OAAS,YACb,UAAU,EACP,KAAK,SAAU,KAAM,CACpB,kBAAW,IAAI,EACf,OAAO,KAAK,MAAM,EAAE,QAAQ,SAAU,IAAK,CACrC,YAAY,GAAG,IACjB,YAAY,GAAG,EAAE,IAAM,OAAO,GAAG,EAAE,IACnC,YAAY,GAAG,EAAE,IAAM,OAAO,GAAG,EAAE,IAEvC,CAAC,EACM,SAAS,WAAW,CAAC,CAC9B,CAAC,EACA,KAAK,UAAY,CAChB,SAAS,cAAc,IAAI,YAAY,mBAAmB,CAAC,EAGvD,OAAO,SAAW,QAAQ,cAC5B,QAAQ,aAAa,KAAM,GAAI,OAAO,SAAS,SAAW,OAAO,SAAS,MAAM,EAElF,OAAO,SAAS,EAAG,CAAC,EACpB,OAAO,SAAS,OAAO,CACzB,CAAC,EACA,MAAM,SAAU,IAAK,CACpB,QAAQ,KAAK,8BAA+B,GAAG,EAC/C,OAAS,GACT,QAAQ,UAAU,OAAO,cAAc,EACvC,QAAQ,SAAW,GAInB,YAAY,EACZ,UAAU,eAAe,EACzB,QAAQ,eAAe,CAAE,SAAU,SAAU,MAAO,QAAS,CAAC,CAChE,CAAC,EACL,CAUA,SAAS,KAAK,KAAM,CAClB,WAAW,IAAI,EAEf,IAAI,UAAY,CAAC,EACjB,UAAU,QAAQ,SAAU,KAAM,CAChC,IAAI,EAAI,UAAU,KAAK,YAAc,CAAC,GAAG,YAAY,EAAG,EAAE,GAAK,EAC1D,UAAU,CAAC,IAAG,UAAU,CAAC,EAAI,CAAC,GACnC,UAAU,CAAC,EAAE,KAAK,IAAI,CACxB,CAAC,EAED,IAAI,UAAY,GAKhB,MAAM,QAAQ,SAAU,KAAM,CAC5B,IAAI,EAAI,YAAY,KAAK,GAAG,EACxB,GAAK,EAAE,IAAM,GAAK,CAAC,UAAU,EAAE,GAAG,IACpC,EAAE,IAAM,EACR,UAAY,GAEhB,CAAC,EASD,IAAI,oBAAsB,GAC1B,WAAW,EAAE,QAAQ,SAAU,MAAO,CACpC,IAAI,KAAO,iBAAiB,KAAK,EACjC,GAAI,sBAAqB,MAAO,IAAI,EACpC,WAAY,GACZ,IAAI,QAAU,EACd,OAAO,KAAK,IAAI,EAAE,QAAQ,SAAU,EAAG,CAAE,SAAW,KAAK,CAAC,CAAG,CAAC,EAC1D,UAAY,IAAG,oBAAsB,IAC3C,CAAC,EAED,IAAI,QAAU,CAAC,EACX,QAAU,CAAC,EAqBf,GApBA,oBAAoB,EAAE,QAAQ,SAAU,EAAG,CAAE,QAAQ,CAAC,EAAI,EAAM,CAAC,EACjE,OAAO,KAAK,SAAS,EAAE,QAAQ,SAAU,EAAG,CAC1C,IAAI,EAAI,SAAS,EAAG,EAAE,EAClB,MAAQ,UAAU,CAAC,EACvB,GAAI,CAAC,GAAK,CAAC,QAAQ,CAAC,EAAG,CAErB,QAAQ,KAAK,CAAC,EACd,UAAY,GACZ,MACF,CACA,GAAI,MAAM,OAAS,EAAG,CAGpB,UAAY,GACZ,MACF,CACA,IAAI,QAAU,MAAM,CAAC,EAAE,YAAc,CAAC,GAAG,aAAa,GAAK,GACvD,SAAW,gBAAgB,CAAC,IAAG,UAAY,GACjD,CAAC,EAEG,CAAC,UAAW,OAAO,QAAQ,QAAQ,EAAK,EAE5C,IAAI,QAAU,CAAC,EACX,QAAU,QAAQ,OAAO,SAAU,EAAG,CAAE,OAAO,EAAI,CAAG,CAAC,EAAE,KAAK,EAClE,OAAI,QAAQ,SAAW,EACrB,QAAQ,KAAK,WAAa,QAAQ,CAAC,EAAI,iDAAiD,EAC/E,QAAQ,OAAS,EAC1B,QAAQ,KAAK,YAAc,QAAQ,KAAK,OAAO,EAAI,qDAAqD,EAC/F,QAAQ,QACjB,QAAQ,KAAK,mDAAmD,EAE9D,qBACF,QAAQ,KAAK,8DAA8D,EAGtE,SAAS,WAAW,CAAC,EAAE,KAAK,UAAY,CAC7C,MAAO,CAAE,OAAQ,QAAQ,OAAS,QAAQ,KAAK,GAAG,EAAI,IAAK,CAC7D,CAAC,CACH,CAEA,SAAS,SAAU,CACb,QAAU,SACV,SAAW,CAAC,QAAQ,SACxB,QAAU,GACV,UAAU,EACP,KAAK,SAAU,KAAM,CAAE,OAAO,KAAK,IAAI,CAAG,CAAC,EAC3C,KAAK,SAAU,OAAQ,CACtB,GAAI,SAAW,GAAO,CACpB,QAAU,GACV,MACF,CACA,GAAI,OAAO,OACT,GAAI,CAAE,eAAe,QAAQ,iBAAkB,OAAO,MAAM,CAAG,OAAS,IAAK,CAAE,CAIjF,GADA,SAAS,cAAc,IAAI,YAAY,mBAAmB,CAAC,EACvD,KAAM,CAGR,OAAO,SAAS,OAAO,EACvB,MACF,CAIA,QAAU,EACZ,CAAC,EACA,MAAM,SAAU,IAAK,CACpB,QAAU,GACV,QAAQ,KAAK,mCAAoC,GAAG,CACtD,CAAC,EACL,CAIA,SAAS,cAAe,CAClB,QAAU,SACV,SAAW,CAAC,QAAQ,SACxB,aAAa,SAAS,EACtB,UAAY,WAAW,QAAS,GAAG,EACrC,CAIA,SAAS,cAAc,IAAK,CAC1B,IAAI,OAAS,IAAI,OAAO,QAAQ,kBAAkB,EAC9C,SAAW,IAAI,OAAO,QAAQ,eAAe,EAC7C,IAAM,IAAI,OAAO,QAAQ,gBAAgB,EAC7C,GAAK,IACL,KAAI,IAAM,IAAI,aAAa,UAAU,EACjC,EAAI,YAAY,GAAG,EACvB,GAAK,EAGL,SADI,KAAO,KACF,EAAI,EAAG,EAAI,MAAM,OAAQ,IAChC,GAAI,MAAM,CAAC,EAAE,MAAQ,IAAK,CAAE,KAAO,MAAM,CAAC,EAAG,KAAO,CAEtD,GAAK,MAIL,GAFA,WAAW,EAEP,OAAQ,CACV,IAAI,MAAQ,OAAO,MACnB,GAAI,QAAU,MAAO,CACnB,IAAI,KAAO,sBAAsB,EACjC,GAAI,CAAC,KAAM,CACT,OAAO,MAAQ,OAAO,EAAE,GAAG,EAC3B,UAAU,gBAAgB,EAC1B,MACF,CACA,EAAE,IAAM,IACV,MACE,EAAE,IAAM,SAAS,MAAO,EAAE,GAAK,EAEjC,EAAE,IAAM,KAAK,SACb,OAAO,CACT,SAAW,SAAU,CACnB,IAAI,IAAM,SAAS,SAAS,MAAO,EAAE,EACjC,MAAM,GAAG,IAAG,IAAM,GACtB,EAAE,IAAM,KAAK,IAAI,EAAG,KAAK,IAAI,IAAK,KAAK,QAAQ,CAAC,EAChD,OAAO,CACT,IACF,CAEA,SAAS,eAAe,IAAK,CAC3B,IAAI,KAAO,IAAI,OAAO,QAAQ,mBAAmB,EAC5C,OACL,kBAAkB,SAAS,KAAK,aAAa,cAAc,EAAG,EAAE,CAAC,EAAI,KAAK,MAC5E,CAaA,SAAS,qBAAsB,CAC7B,GAAI,oBACJ,KAAI,IAAM,SAAS,cAAc,2BAA2B,EAC5D,GAAI,GAAC,KAAO,IAAI,UAAU,SAAS,WAAW,IAC1C,SAAO,YAAc,OAAO,WAAW,kCAAkC,EAAE,SAC/E,IAAI,CACF,GAAI,eAAe,QAAQ,UAAU,EAAG,MAC1C,OAAS,IAAK,CAAE,CAChB,UAAU,EAAE,KAAK,SAAU,KAAM,CAC/B,IAAI,KAAO,KAAK,OAAS,CAAC,GAAG,KAAK,SAAU,KAAM,CAChD,OAAO,YAAY,IAAI,EAAE,EAC3B,CAAC,EACD,GAAI,GAAC,KAAO,oBACZ,oBAAqB,GACrB,GAAI,CAAE,eAAe,QAAQ,WAAY,GAAG,CAAG,OAAS,IAAK,CAAE,CAC/D,IAAI,UAAU,IAAI,WAAW,EAC7B,IAAI,iBAAiB,eAAgB,UAAY,CAC/C,IAAI,UAAU,OAAO,WAAW,CAClC,EAAG,CAAE,KAAM,EAAK,CAAC,EACnB,CAAC,EAAE,MAAM,UAAY,CAAE,CAAC,GAC1B,CAEA,SAAS,MAAO,CAsBd,GArBA,KAAO,SAAS,cAAc,kBAAkB,EAOhD,SAAS,iBAAiB,eAAgB,YAAY,EACtD,SAAS,iBAAiB,oBAAqB,YAAY,EAC3D,aAAa,EAIb,SAAS,iBAAiB,wBAAyB,mBAAmB,EAQlE,CAAC,MAAQ,SAAS,MAAQ,SAAS,KAAK,UAAU,SAAS,eAAe,EAAG,CAC/E,IAAI,OAAS,KACb,GAAI,CACF,OAAS,eAAe,QAAQ,gBAAgB,EAC5C,QAAQ,eAAe,WAAW,gBAAgB,CACxD,OAAS,IAAK,CAAE,CAChB,GAAI,OAAQ,CACV,IAAI,OAAS,SAAS,cAAc,+BAA+B,GACjE,SAAS,cAAc,eAAe,EACxC,GAAI,OAAQ,CACV,IAAI,WAAa,SAAS,cAAc,GAAG,EAC3C,WAAW,UAAY,wBACvB,WAAW,aAAa,OAAQ,QAAQ,EACxC,WAAW,YAAc,OACzB,OAAO,YAAY,UAAU,CAC/B,CACF,CACF,CAGA,GAAI,CAAC,KAAM,OAcX,GAZA,QAAU,KAAK,cAAc,mBAAmB,EAChD,OAAS,KAAK,cAAc,kBAAkB,EAC9C,QAAU,KAAK,cAAc,iBAAiB,EAC9C,WAAa,KAAK,cAAc,oBAAoB,EACpD,QAAU,KAAK,cAAc,iBAAiB,EAC9C,SAAW,KAAK,cAAc,kBAAkB,EAChD,QAAU,KAAK,cAAc,gBAAgB,EAC7C,UAAY,KAAK,cAAc,kBAAkB,EACjD,UAAY,KAAK,aAAa,iBAAiB,GAAK,GAIhD,SAAU,CACZ,IAAI,SAAW,KACf,GAAI,CACF,SAAW,eAAe,QAAQ,gBAAgB,EAC9C,UAAU,eAAe,WAAW,gBAAgB,CAC1D,OAAS,IAAK,CAAE,CACZ,WACF,SAAS,YAAc,SACvB,SAAS,OAAS,GAEtB,CAEA,IAAI,OAAS,KAAK,cAAc,wBAAwB,EACxD,GAAI,OACF,GAAI,CACF,KAAK,MAAM,OAAO,WAAW,EAAE,QAAQ,SAAU,MAAO,CACtD,cAAc,MAAM,EAAE,EAAI,MAAM,MAAQ,CAAC,CAC3C,CAAC,CACH,OAAS,IAAK,CACZ,QAAQ,KAAK,+CAAgD,GAAG,CAClE,CAGF,OAAO,iBAAiB,QAAS,UAAY,CACvC,QAAQ,OAAQ,YAAY,EAC3B,aAAa,CACpB,CAAC,EACD,UAAU,iBAAiB,QAAS,YAAY,EAChD,QAAQ,iBAAiB,QAAS,IAAI,EACtC,QAAQ,iBAAiB,SAAU,aAAa,EAChD,WAAW,iBAAiB,QAAS,cAAc,EAuBnD,IAAI,kBAAoB,8JACpB,YAAc,GAKlB,SAAS,cAAe,CAGtB,QAFI,MAAQ,EACR,IAAM,SAAS,iBAAiB,iBAAiB,EAC5C,EAAI,EAAG,EAAI,IAAI,OAAQ,IAAK,CACnC,IAAI,MAAQ,iBAAiB,IAAI,CAAC,CAAC,EACnC,GAAI,QAAM,WAAa,SAAW,MAAM,WAAa,UACrD,KAAI,KAAO,IAAI,CAAC,EAAE,sBAAsB,EACpC,KAAK,SAAW,GAAK,KAAK,IAAM,YAAc,GAC9C,KAAK,OAAS,QAAO,MAAQ,KAAK,QACxC,CACA,OAAO,KAAK,IAAI,EAAG,KAAK,CAC1B,CAUA,SAAS,cAAe,CACtB,IAAI,IAAM,KAAK,sBAAsB,EAAE,IACnC,MAAQ,aAAa,EAAI,YACzB,QAAU,KAAK,IAAI,MAAQ,GAAI,KAAK,MAAM,OAAO,YAAc,GAAI,CAAC,EACxE,OAAI,IAAM,MAAQ,EAAU,IAAM,MAC9B,IAAM,QAAU,EAAU,IAAM,QAC7B,CACT,CAEA,SAAS,sBAAuB,CAC9B,OAAO,aAAa,IAAM,CAC5B,CAEA,IAAI,mBAAqB,GAEzB,SAAS,cAAe,CACtB,IAAI,MAAQ,aAAa,EACzB,GAAI,QAAU,EAOd,KAAI,UAAY,SAAS,gBAAgB,MACrC,SAAW,UAAU,eACzB,UAAU,eAAiB,OAC3B,mBAAqB,GACrB,OAAO,SAAS,EAAG,KAAK,EACxB,UAAU,eAAiB,SAC3B,sBAAsB,UAAY,CAChC,sBAAsB,UAAY,CAAE,mBAAqB,EAAO,CAAC,CACnE,CAAC,EACH,CAEA,SAAS,mBAAoB,CAC3B,IAAI,SAAW,KAAK,IAAI,EAAI,KACxB,UAAY,GAChB,SAAS,QAAS,CAAE,UAAY,EAAM,CACtC,OAAO,iBAAiB,QAAS,OAAQ,CAAE,KAAM,GAAM,QAAS,EAAK,CAAC,EACtE,OAAO,iBAAiB,aAAc,OAAQ,CAAE,KAAM,GAAM,QAAS,EAAK,CAAC,EAC3E,OAAO,iBAAiB,UAAW,OAAQ,CAAE,KAAM,EAAK,CAAC,EAIzD,SAAS,UAAW,CACb,oBAAoB,OAAO,CAClC,CACA,OAAO,iBAAiB,SAAU,SAAU,CAAE,QAAS,EAAK,CAAC,EAC7D,WAAW,UAAY,CAAE,OAAO,oBAAoB,SAAU,QAAQ,CAAG,EAAG,IAAI,EAEhF,aAAa,EAEb,SAAS,UAAW,CACd,WAAa,KAAK,IAAI,EAAI,UACzB,qBAAqB,GAAG,aAAa,CAC5C,CASA,GARA,WAAW,SAAU,GAAG,EACxB,WAAW,SAAU,IAAI,EACzB,WAAW,SAAU,IAAI,EACrB,SAAS,aAAe,YAC1B,OAAO,iBAAiB,OAAQ,UAAY,CAAE,WAAW,SAAU,EAAE,CAAG,EAAG,CAAE,KAAM,EAAK,CAAC,EAIvF,OAAO,eAAgB,CACzB,IAAI,GAAK,OAAO,eACZ,SAAW,UAAY,CAAE,WAAW,SAAU,GAAG,CAAG,EACxD,GAAG,iBAAiB,SAAU,QAAQ,EACtC,WAAW,UAAY,CAAE,GAAG,oBAAoB,SAAU,QAAQ,CAAG,EAAG,IAAI,CAC9E,CACF,CAEA,SAAS,cAAe,CAClB,OAAO,SAAS,OAAS,YAC7B,SAAS,cAAc,IAAI,YAAY,YAAY,CAAC,EACpD,YAAY,EACZ,kBAAkB,EACpB,CAEA,OAAO,iBAAiB,aAAc,YAAY,EAClD,aAAa,CACf,CAEI,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,IAAI,EAElD,KAAK,CAET,GAAG",
  "names": []
}
