{
  "version": 3,
  "sources": ["/cdn/shop/t/81/assets/ll-card-list.js?bust=1789016739529"],
  "sourcesContent": ["/* ===========================================================================\r\n   Completes the set checklist from the filter index.\r\n\r\n   WHAT WAS WRONG\r\n     The snippet reads coll.products under `paginate by 250`, which is the most\r\n     Liquid will give it. On a 1,168 product collection that is a fifth of the\r\n     shelf, and the headline stated a completeness percentage from it as fact.\r\n\r\n     Worse, it assumed the collection was ONE set. It settles a set size by\r\n     taking the largest printed denominator it sees and counts every card in\r\n     the collection against that. Measured on Mega Evolution, the collection\r\n     actually holds six sets:\r\n\r\n       /217 Ascended Heroes 376   /132 Mega Evolution Base 210\r\n       /86  Chaos Rising    129   /94  Phantasmal Flames   121\r\n       /84  Pitch Black     108   /88  Perfect Order       102\r\n\r\n     So it reported \"139 of the 217 cards in this set (64%)\" while Ascended\r\n     Heroes alone was 205 of 217, and five other sets were folded into the same\r\n     number. Reading further into the collection without splitting the sets\r\n     would have made that more confidently wrong, not less.\r\n\r\n   WHERE THE NUMBERS COME FROM\r\n     The index holds every product with no ceiling, but it carries no titles,\r\n     so the card number cannot come from there the way the snippet takes it\r\n     from the title. It does not need to: the handle ends in the same pair.\r\n\r\n       pikachu-ascended-heroes-055-217          ->  55 / 217\r\n       mega-venusaur-ex-mega-evolution-base-003-132 -> 3 / 132\r\n\r\n     1,050 of the 1,168 handles carry it. The 118 that do not are sealed\r\n     products, which is exactly what the title parser skips too. The\r\n     denominator identifies the set with 98 to 100% purity against the index's\r\n     own set_name facet, so it is what the cards are grouped by, and set_name\r\n     supplies the label.\r\n\r\n   WHY THIS IS AN ENHANCEMENT AND NOT THE SOURCE\r\n     The server rendered list is what assistant crawlers read, and they do not\r\n     run scripts. Nothing here is required for the page to be correct: it\r\n     replaces a narrow, honestly captioned count with a complete one. If any\r\n     fetch fails the page keeps exactly what Liquid rendered.\r\n   =========================================================================== */\r\n\r\n(function () {\r\n  'use strict';\r\n\r\n  var root = document.getElementById('card-list');\r\n  if (!root) return;\r\n\r\n  var base = root.getAttribute('data-index-base') || '';\r\n  var handle = root.getAttribute('data-handle') || '';\r\n  if (!base || !handle) return;\r\n\r\n  /* asset_url appends its own cache busting query and a base URL cannot be\r\n     trimmed back past it, so every index file is addressed by swapping the\r\n     filename inside the Pokemon shard's URL. */\r\n  function url(file) { return base.replace('ll-index-pokemon.json', file); }\r\n\r\n  function getJson(u) {\r\n    return fetch(u, { headers: { Accept: 'application/json' } })\r\n      .then(function (r) { return r.ok ? r.json() : null; })\r\n      .catch(function () { return null; });\r\n  }\r\n\r\n  /* TWO NUMBERING SCHEMES, AND THE DASH THAT TELLS THEM APART.\r\n\r\n     Pokemon, Magic and Lorcana print a card number over the set size, and the\r\n     handle keeps it: gardevoir-chilling-reign-reverse-holo-061-198. One Piece\r\n     and Digimon print a SET CODE and a number instead, with no size at all:\r\n     monkey-d-luffy-leader-op16-022, mamemon-double-diamond-sr-bt6-064.\r\n\r\n     The old pattern had no leading dash, so it happily read op16-022 as card\r\n     16 of a set of 22 and shattered One Piece into dozens of two card sets\r\n     that the minimum-size filter then threw away. That is why those\r\n     collections showed no checklist at all rather than a wrong one. Requiring\r\n     the dash separates them: a set size is always preceded by one, a set code\r\n     never is. Measured across the index: 11,601 slash against 0 code on\r\n     Pokemon, 0 slash against 143 code on One Piece, 0 against 233 on Digimon. */\r\n  var NUM  = /-(\\d{1,3})-(\\d{1,3})$/;\r\n  var CODE = /-([a-z][a-z0-9]{0,4})-(\\d{1,3})$/;\r\n\r\n  function parseCard(h) {\r\n    var m = NUM.exec(h);\r\n    if (m) return { num: parseInt(m[1], 10), den: parseInt(m[2], 10) };\r\n    m = CODE.exec(h);\r\n    if (m) return { num: parseInt(m[2], 10), den: 0, code: m[1] };\r\n    return null;\r\n  }\r\n  var IN_STOCK = 2, F_FLAGS = 5, F_SET = 3, F_PRICE = 6;\r\n\r\n  /* A handful of cards carry a denominator that belongs to no set on the\r\n     shelf: a /6 promo, a /162 stray. One card is not a checklist, and drawing\r\n     a six cell grid beside a 217 cell one implies a set we do not stock. */\r\n  var MIN_SET = 8;\r\n\r\n  /* Which printing a handle describes. Order matters: a reverse holo says both\r\n     \"reverse\" and \"holo\", and it is the reverse that a collector is tracking. */\r\n  var P_REVERSE = /(^|-)reverse(-|$)/;\r\n  var P_FOIL    = /(^|-)foil(-|$)/;\r\n  var P_HOLO    = /(^|-)holo(-|$)/;\r\n  var P_PROMO   = /(^|-)promo(-|$)/;\r\n\r\n  function printingOf(h) {\r\n    if (P_REVERSE.test(h)) return 'reverse';\r\n    if (P_FOIL.test(h)) return 'foil';\r\n    if (P_HOLO.test(h)) return 'holo';\r\n    if (P_PROMO.test(h)) return 'promo';\r\n    return 'normal';\r\n  }\r\n\r\n  function titleCase(slug) {\r\n    var out = [];\r\n    slug.split('-').forEach(function (w, i) {\r\n      /* A slug cannot hold an apostrophe, so \"the world's strongest warriors\"\r\n         arrives as the-world-s-strongest-warriors and read back as \"The World\r\n         S Strongest Warriors\". A lone s after a word is that apostrophe. */\r\n      if (i > 0 && (w === 's' || w === 't') && out.length) {\r\n        out[out.length - 1] += \"'\" + w;\r\n        return;\r\n      }\r\n      if (w === 'ex' || w === 'gx' || w === 'tcg') { out.push(w.toUpperCase()); return; }\r\n      out.push(w.charAt(0).toUpperCase() + w.slice(1));\r\n    });\r\n    return out.join(' ');\r\n  }\r\n\r\n  /* ---- selecting rows and buying them in one go ---------------------------\r\n     Same endpoint and same payload shape the collection card's own Add button\r\n     uses, so a bulk add and a single add are indistinguishable to the cart.\r\n     items[] rather than a request per card: one round trip, and Shopify either\r\n     takes the whole selection or none of it, so the cart can never end up\r\n     holding half of what was ticked. */\r\n\r\n  (function bulk() {\r\n    var bar = root.querySelector('[data-llcl-bulk]');\r\n    var count = root.querySelector('[data-llcl-count]');\r\n    var btn = root.querySelector('[data-llcl-add]');\r\n    if (!bar || !btn) return;\r\n\r\n    function picked() {\r\n      return [].slice.call(root.querySelectorAll('.llcl__pick:checked'));\r\n    }\r\n    function sync() {\r\n      var boxes = picked();\r\n      var n = boxes.length;\r\n      if (count) count.textContent = String(n);\r\n\r\n      /* What the selection costs, so a shopper filling a set knows before the\r\n         cart does. Read off the row rather than fetched, because the price is\r\n         already rendered there. */\r\n      var pence = 0, unpriced = 0;\r\n      boxes.forEach(function (b) {\r\n        var row = b.closest('.llcl__row');\r\n        var txt = row && row.querySelector('.llcl__price');\r\n        var v = txt && txt.textContent.replace(/[^0-9.]/g, '');\r\n        if (v) pence += Math.round(parseFloat(v) * 100); else unpriced++;\r\n      });\r\n      var totalEl = root.querySelector('[data-llcl-total]');\r\n      if (totalEl) {\r\n        /* One Price TBC row used to blank the whole total, which is the least\r\n           useful moment to say nothing: a set selection is dozens of rows and\r\n           one of them being unpriced should not hide what the other forty\r\n           cost. The known total stands, with a plus to say it is a floor. */\r\n        totalEl.textContent = n ? (MONEY(pence) + (unpriced ? '+' : '')) : '';\r\n        totalEl.title = unpriced ? (unpriced + ' selected card(s) have no price yet') : '';\r\n      }\r\n\r\n      bar.hidden = n === 0;\r\n      btn.disabled = false;\r\n      btn.textContent = 'Add to cart';\r\n    }\r\n\r\n    root.addEventListener('change', function (e) {\r\n      if (e.target && e.target.classList.contains('llcl__pick')) sync();\r\n    });\r\n\r\n    btn.addEventListener('click', function () {\r\n      var boxes = picked();\r\n      if (!boxes.length) return;\r\n      btn.disabled = true;\r\n      btn.textContent = 'Adding';\r\n\r\n      /* A row Liquid rendered already knows its variant. One built from the\r\n         index knows only its handle, so those are looked up now, in parallel,\r\n         and only for what was actually ticked. */\r\n      var resolve = boxes.map(function (b) {\r\n        var vid = b.getAttribute('data-vid');\r\n        if (vid) return Promise.resolve(Number(vid));\r\n        var h = b.getAttribute('data-handle');\r\n        if (!h) return Promise.resolve(0);\r\n        return fetch('/products/' + h + '.js', { headers: { Accept: 'application/json' } })\r\n          .then(function (r) { return r.ok ? r.json() : null; })\r\n          .then(function (p) {\r\n            if (!p || !p.variants) return 0;\r\n            for (var i = 0; i < p.variants.length; i++) {\r\n              if (p.variants[i].available) return p.variants[i].id;\r\n            }\r\n            return 0;\r\n          })\r\n          .catch(function () { return 0; });\r\n      });\r\n\r\n      var rootUrl = (window.Shopify && window.Shopify.routes && window.Shopify.routes.root) || '/';\r\n      Promise.all(resolve).then(function (ids) {\r\n      var items = ids.filter(Boolean).map(function (id) { return { id: id, quantity: 1 }; });\r\n      if (!items.length) throw new Error('Not added');\r\n      return fetch(rootUrl + 'cart/add.js', {\r\n        method: 'POST',\r\n        headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\r\n        credentials: 'same-origin',\r\n        body: JSON.stringify({ items: items })\r\n      });\r\n      }).then(function (r) {\r\n        return r.json().then(function (j) { return { ok: r.ok, json: j }; })\r\n                       .catch(function () { return { ok: r.ok, json: {} }; });\r\n      }).then(function (res) {\r\n        if (!res.ok) throw new Error((res.json && (res.json.description || res.json.message)) || 'Could not add');\r\n        btn.textContent = 'Added ' + boxes.length;\r\n        boxes.forEach(function (b) { b.checked = false; });\r\n        /* The header count is owned by the section, which does not expose its\r\n           updater, so say what happened and let anything listening refresh. */\r\n        try { document.dispatchEvent(new CustomEvent('ll:cart:updated', { detail: { added: items.length } })); } catch (e) {}\r\n        setTimeout(sync, 1600);\r\n      }).catch(function (err) {\r\n        btn.disabled = false;\r\n        btn.textContent = (err && err.message) ? 'Not added' : 'Not added';\r\n        setTimeout(sync, 2200);\r\n      });\r\n    });\r\n\r\n    sync();\r\n  }());\r\n\r\n  /* WHERE THE SET DATA ALREADY WON, STAND DOWN.\r\n\r\n     On a collection carrying custom.card_list the page has arrived complete\r\n     and correct: every card in the set, named, with the ones this shop has\r\n     never listed shown as such. Rebuilding that from the index would replace\r\n     real names with names guessed from handles, and a 120 card set with the 84\r\n     the printed numbers happen to describe.\r\n\r\n     A FLAG, NOT AN EARLY RETURN. Returning here skipped the rest of this file,\r\n     which is where the money formatter, the hover handlers and the paint queue\r\n     are set up: the checklist rendered perfectly and then nothing in it worked,\r\n     including the selection bar, which counted a tick and then threw before it\r\n     could show itself. Only the rebuild is skipped now. */\r\n  var SET_SOURCED = root.getAttribute('data-source') === 'set';\r\n\r\n  if (!SET_SOURCED) getJson(url('ll-collection-map.json')).then(function (map) {\r\n    var entry = map && map.collections && map.collections[handle];\r\n    if (!entry) return null;\r\n    mapEntry = entry;\r\n    mapAll = map;\r\n\r\n    var shards = (entry.shards && entry.shards[0] === '*')\r\n      ? (map.shards || []) : (entry.shards || []);\r\n    if (!shards.length) return null;\r\n\r\n    var members = entry.members\r\n      ? getJson(url('ll-members-' + handle + '.json'))\r\n      : Promise.resolve(null);\r\n\r\n    return Promise.all([\r\n      members,\r\n      Promise.all(shards.map(function (g) { return getJson(url('ll-index-' + g + '.json')); }))\r\n    ]).then(function (both) {\r\n      var mem = both[0], loaded = both[1].filter(Boolean);\r\n      if (!loaded.length) return null;\r\n\r\n      /* Which handles are in this collection, and what the index knows about\r\n         each: stock, and the set it is filed under. */\r\n      var want = null;\r\n      if (mem && mem.handles) {\r\n        want = Object.create(null);\r\n        for (var i = 0; i < mem.handles.length; i++) want[mem.handles[i]] = 1;\r\n      }\r\n\r\n      var rows = [];\r\n      loaded.forEach(function (shard) {\r\n        var names = (shard.dict && shard.dict.set_name) || [];\r\n        var facetCode = -1;\r\n        if (!want && entry.facet === 'set_name' && entry.value) {\r\n          facetCode = names.indexOf(entry.value);\r\n          if (facetCode === -1) return;\r\n        }\r\n        shard.products.forEach(function (r) {\r\n          if (want) { if (!want[r[0]]) return; }\r\n          else if (facetCode > -1) { if (r[F_SET] !== facetCode) return; }\r\n          else return;\r\n          rows.push({\r\n            handle: r[0],\r\n            inStock: !!(r[F_FLAGS] & IN_STOCK),\r\n            price: r[F_PRICE] || 0,\r\n            set: (typeof r[F_SET] === 'number' && names[r[F_SET]]) || ''\r\n          });\r\n        });\r\n      });\r\n      if (!rows.length) return null;\r\n\r\n      /* Group by printed denominator, which is the set, and record every\r\n         PRINTING of each number rather than just whether the number is held.\r\n\r\n         A master set is not the numbers 1 to 217. It is every printing of\r\n         them: the base card, its reverse holo, the holo, and whatever secret\r\n         rares sit above the printed size. A checklist that collapses those\r\n         into one cell tells a master set collector almost nothing, because the\r\n         cell is already filled by a card they are not chasing.\r\n\r\n         The printing is in the handle, the same place the number is:\r\n\r\n           erikas-oddish-ascended-heroes-energy-reverse-holo-001-217\r\n           pecharunt-ascended-heroes-holo-143-217\r\n           wailord-ex-pitch-black-016-084                     (base) */\r\n      var sets = Object.create(null);\r\n      rows.forEach(function (row) {\r\n        var card = parseCard(row.handle);\r\n        if (!card || !card.num) return;       /* sealed, no card number */\r\n        var den = card.den;\r\n        if (den > 500) return;\r\n\r\n        /* KEYED ON THE SET NAME, not the denominator.\r\n\r\n           The denominator was only ever a proxy for the set, and it is one the\r\n           code-numbered games do not have. The index carries the set as a\r\n           facet on every product, which is the authoritative answer for all of\r\n           them. Products with no set on file still fall back to grouping by\r\n           denominator so a Pokemon shelf does not lose them. */\r\n        var key = row.set || (den ? ('den:' + den) : null);\r\n        if (!key) return;\r\n\r\n        var s = sets[key] || (sets[key] = {\r\n          den: 0, nums: {}, stock: {}, names: {}, items: [], byNum: {}, dens: {}\r\n        });\r\n        if (den) s.dens[den] = (s.dens[den] || 0) + 1;\r\n        var num = card.num;\r\n        var printing = printingOf(row.handle);\r\n        s.nums[num] = 1;\r\n        if (row.inStock) s.stock[num] = 1;\r\n        if (row.set) s.names[row.set] = (s.names[row.set] || 0) + 1;\r\n        var cell = s.byNum[num] || (s.byNum[num] = {});\r\n        cell[printing] = (cell[printing] || 0) + 1;\r\n        if (row.inStock) cell.buyable = 1;\r\n        s.items.push({\r\n          num: num, handle: row.handle, price: row.price,\r\n          inStock: row.inStock, set: row.set, printing: printing\r\n        });\r\n      });\r\n\r\n      /* THE SET SIZE, PRINTED WHERE THERE IS ONE AND INFERRED WHERE THERE IS\r\n         NOT.\r\n\r\n         A slash game states its size on every card, so the size is whatever\r\n         most of them agree on. A code game states nothing, so the best that\r\n         can be said is the highest number on the shelf, and the display says\r\n         \"est\" rather than presenting a guess as a fact. */\r\n      Object.keys(sets).forEach(function (k) {\r\n        var s = sets[k];\r\n        var best = 0, bestN = 0;\r\n        for (var d in s.dens) if (s.dens[d] > bestN) { bestN = s.dens[d]; best = Number(d); }\r\n        var held = Object.keys(s.nums).map(Number);\r\n        if (best && bestN >= s.items.length * 0.5) {\r\n          s.den = best;\r\n          s.estimated = false;\r\n        } else {\r\n          s.den = held.length ? Math.max.apply(null, held) : 0;\r\n          s.estimated = true;\r\n        }\r\n      });\r\n\r\n      var out = Object.keys(sets).map(function (k) { return sets[k]; })\r\n        .filter(function (s) { return s.den > 0 && Object.keys(s.nums).length >= MIN_SET; });\r\n\r\n      out.forEach(function (s) {\r\n        var held = Object.keys(s.nums).map(Number);\r\n        s.base = held.filter(function (n) { return n <= s.den; });\r\n        s.above = held.filter(function (n) { return n > s.den; }).sort(function (a, b) { return a - b; });\r\n        s.inStock = Object.keys(s.stock).length;\r\n\r\n        /* The master set breakdown. Reverse holos are counted against the\r\n           printed size because a set that reverses at all reverses nearly\r\n           every base card, so 88 of 217 is a meaningful fraction. Secret rares\r\n           have no knowable target, so they are reported as a count and never\r\n           as a percentage of something invented. */\r\n        /* EVERY GAME HAS VARIANTS; NOT EVERY GAME CALLS THEM REVERSE HOLOS.\r\n\r\n           Counting reverses alone read 4,616 on Pokemon and a flat zero on One\r\n           Piece, whose parallel printings are foils. A stat that is structurally\r\n           zero for a whole game is worse than no stat. So this counts any card\r\n           held in more than its plain printing, which is the axis a master set\r\n           collector is actually working along whatever the game calls it. */\r\n        s.reverse = [];\r\n        s.printings = s.items.length;\r\n        for (var n in s.byNum) {\r\n          if (Number(n) > s.den) continue;\r\n          var c = s.byNum[n];\r\n          if (c.reverse || c.foil || c.holo || c.promo) s.reverse.push(Number(n));\r\n        }\r\n\r\n        var best = '', bestN = 0;\r\n        for (var nm in s.names) if (s.names[nm] > bestN) { bestN = s.names[nm]; best = nm; }\r\n        s.label = best ? titleCase(best) : ('Set of ' + s.den);\r\n      });\r\n\r\n      /* NOTHING INSIDE THE PRINTED SET, NOTHING TO SHOW.\r\n\r\n         A set whose only stock is numbered ABOVE its printed size renders an\r\n         empty grid and a line reading \"Brilliant Stars 0/1\", which says we\r\n         stock none of a set of one and is true but useless. It happens where\r\n         the only card held is a secret rare, or where a stray denominator has\r\n         collected a few promos.\r\n\r\n         The count line above still measures the sets that ARE shown, so\r\n         hiding these does not move the headline. The moment one base card\r\n         arrives the set reappears on its own, because this is computed from\r\n         the index on every load rather than configured anywhere. */\r\n      out = out.filter(function (s) { return s.base.length > 0; });\r\n      if (!out.length) return null;\r\n\r\n      out.sort(function (a, b) { return b.base.length - a.base.length; });\r\n      return out;\r\n    });\r\n  }).then(function (sets) {\r\n    if (!sets || !sets.length) return;\r\n    render(sets);\r\n  }).catch(function () { /* the page keeps what Liquid rendered */ });\r\n\r\n  /* 6694/9315 is nine characters in a column 58px wide, so the collection wide\r\n     strip ran out of room and clipped its last stat. Thousands are abbreviated\r\n     above four figures, where the exact digit stopped being the point. */\r\n  function shortNum(n) {\r\n    if (n < 10000) return String(n);\r\n    var k = n / 1000;\r\n    return (k >= 100 ? Math.round(k) : k.toFixed(1).replace(/\\.0$/, '')) + 'k';\r\n  }\r\n\r\n  function masterStat(label, n, of) {\r\n    var w = el('span', 'llcl__stat');\r\n    w.appendChild(el('b', null, of ? (shortNum(n) + '/' + shortNum(of)) : shortNum(n)));\r\n    w.appendChild(el('span', null, label));\r\n    w.title = of ? (n.toLocaleString() + ' of ' + of.toLocaleString() + ' ' + label)\r\n                 : (n.toLocaleString() + ' ' + label);\r\n    return w;\r\n  }\r\n\r\n  function el(tag, cls, text) {\r\n    var n = document.createElement(tag);\r\n    if (cls) n.className = cls;\r\n    if (text != null) n.textContent = text;\r\n    return n;\r\n  }\r\n\r\n  /* ---- naming a card the index cannot name --------------------------------\r\n     The index carries no titles, so a row it alone knows about has to take its\r\n     name from the handle. The handle is the slugified title, so the pieces are\r\n     all there: strip the trailing number pair, strip the set slug, and what is\r\n     left is the card and its finish.\r\n\r\n       galarian-obstagoon-ascended-heroes-reverse-holo-132-217\r\n         -> Galarian Obstagoon      (reverse holo)\r\n\r\n     This is a fallback and only a fallback. Any row Liquid already rendered\r\n     keeps its real title, so on a set that fits inside 250 products nothing is\r\n     derived at all; derivation only fills the tail of the big collections that\r\n     could never be reached before. */\r\n\r\n  var FINISH = {\r\n    holo: 1, reverse: 1, foil: 1, promo: 1, alternate: 1,\r\n    prerelease: 1, staff: 1, jumbo: 1, cosmos: 1, poke: 1, ball: 1,\r\n    /* One Piece and Digimon name their parallels differently again. */\r\n    art: 1, parallel: 1, manga: 1\r\n  };\r\n  var SMALL = { the: 1, of: 1, and: 1, a: 1, in: 1 };\r\n\r\n  /* Game slugs that sit in front of a card's own name and say nothing about\r\n     the card. Stripped only from the FRONT, so a card actually called Pokemon\r\n     something keeps it. */\r\n  var GAME_PREFIX = /^(one-piece|pokemon|digimon|disney-lorcana|lorcana|magic-the-gathering|mtg|yu-gi-oh)-/;\r\n\r\n  function nameFromHandle(handle, setSlug) {\r\n    /* Strip whichever numbering scheme this handle uses. Only the slash form\r\n       was handled, so a One Piece row came out as \"Izo Op16 002\" with its set\r\n       code and number still sitting in the name. */\r\n    var t = handle;\r\n    if (NUM.test(t)) t = t.replace(NUM, '');\r\n    else if (CODE.test(t)) t = t.replace(CODE, '');\r\n    t = t.replace(/-+$/, '');\r\n    t = t.replace(GAME_PREFIX, '');\r\n    if (setSlug) t = t.replace(new RegExp('-?' + setSlug + '-?', 'g'), '-');\r\n    var parts = t.split('-').filter(Boolean);\r\n\r\n    var tail = [];\r\n    while (parts.length > 1 && FINISH[parts[parts.length - 1]]) tail.unshift(parts.pop());\r\n\r\n    function cap(w, i) {\r\n      if (w === 'ex' || w === 'gx' || w === 'vmax' || w === 'vstar') return w.toUpperCase();\r\n      if (i > 0 && SMALL[w]) return w;\r\n      return w.charAt(0).toUpperCase() + w.slice(1);\r\n    }\r\n    return {\r\n      name: parts.map(cap).join(' ') || handle,\r\n      variant: tail.join(' ')\r\n    };\r\n  }\r\n\r\n  var MONEY;\r\n  try {\r\n    var _c = document.documentElement.getAttribute('data-currency') || 'GBP';\r\n    var _nf = new Intl.NumberFormat('en-GB', { style: 'currency', currency: _c });\r\n    MONEY = function (p) { return _nf.format(p / 100); };\r\n  } catch (e) {\r\n    MONEY = function (p) { return '\u00A3' + (p / 100).toFixed(2); };\r\n  }\r\n\r\n  function buildRow(item, setSlug) {\r\n    var li = el('li', 'llcl__row' + (item.inStock ? ' llcl__row--in' : ''));\r\n    li.id = 'llcl-card-' + item.num;\r\n    li.setAttribute('data-num', String(item.num));\r\n    li.setAttribute('data-handle', item.handle);\r\n\r\n    if (item.inStock) {\r\n      /* A box keyed by HANDLE rather than variant id.\r\n\r\n         The index carries no variant ids, and fetching one per row to fill a\r\n         list nobody may open would be a thousand requests for nothing. It is\r\n         not needed at tick time either: the id is only wanted at the moment\r\n         Add is pressed, and by then the selection is a handful of rows. So the\r\n         box records which product it is and the ids are resolved on add.\r\n\r\n         Without this, every row on a collection bigger than 250 products had\r\n         neither a checkbox nor any other in stock marker, because the checkbox\r\n         WAS the marker. */\r\n      var box = document.createElement('input');\r\n      box.type = 'checkbox';\r\n      box.className = 'llcl__pick';\r\n      box.setAttribute('data-handle', item.handle);\r\n      box.setAttribute('aria-label', 'Select this card to add to cart');\r\n      li.appendChild(box);\r\n    } else {\r\n      var gap = el('span', 'llcl__pick-gap');\r\n      gap.setAttribute('aria-hidden', 'true');\r\n      li.appendChild(gap);\r\n    }\r\n\r\n    var num = el('span', 'llcl__num', String(item.num));\r\n    num.appendChild(el('span', 'llcl__den', '/' + item.den));\r\n    li.appendChild(num);\r\n    li.appendChild(thumbSlot(item.handle));\r\n\r\n    var parsed = nameFromHandle(item.handle, setSlug);\r\n    var a = el('a', 'llcl__name', parsed.name);\r\n    a.href = '/products/' + item.handle;\r\n    a.setAttribute('data-peek', item.handle);\r\n    if (parsed.variant) a.appendChild(el('span', 'llcl__var', parsed.variant));\r\n    li.appendChild(a);\r\n\r\n    li.appendChild(el('span', 'llcl__price', item.price > 0 ? MONEY(item.price) : 'Price TBC'));\r\n    li.appendChild(el('span', 'llcl__state', item.inStock ? 'In stock' : 'Sold out'));\r\n    return li;\r\n  }\r\n\r\n\r\n  /* ---- rendering, and why almost none of it happens up front ---------------\r\n\r\n     The first version built every grid cell and every priced row the moment\r\n     the index came back. On a set page that is fine. On /collections/pokemon\r\n     it was 72 sets, 9,318 number cells and 11,518 priced rows: 109,715 DOM\r\n     nodes, about four fifths of them ours, and the page locked up hard enough\r\n     that a one line script could not be evaluated in it.\r\n\r\n     None of that work was needed on load. A shopper opens one set, maybe two.\r\n     So a set is a summary line until it is opened, and its grid and its priced\r\n     list are built the first time it is. A single set collection still shows\r\n     its grid immediately, because there the grid IS the content and there is\r\n     only one of it. */\r\n\r\n  function render(sets) {\r\n    var body = root.querySelector('.llcl__body');\r\n    var sub = root.querySelector('.llcl__sub');\r\n    var meter = root.querySelector('.llcl__meter i');\r\n    var head = root.querySelector('.llcl__h');\r\n    var tpl = root.querySelector('.llcl__disc');\r\n    if (!body || !tpl) return;\r\n\r\n    var totalHeld = 0, totalSize = 0, totalStock = 0;\r\n    sets.forEach(function (s) {\r\n      totalHeld += s.base.length; totalSize += s.den; totalStock += s.inStock;\r\n    });\r\n    var pct = totalSize ? Math.round(totalHeld * 100 / totalSize) : 0;\r\n    var multi = sets.length > 1;\r\n\r\n    if (head && multi) head.textContent = head.textContent.replace(/card list$/, 'card lists');\r\n\r\n    var totalRev = 0, totalSecret = 0, totalPrint = 0;\r\n    sets.forEach(function (s) {\r\n      totalRev += s.reverse.length; totalSecret += s.above.length; totalPrint += s.printings;\r\n    });\r\n\r\n    if (sub) {\r\n      /* THE SAME NUMBER THREE TIMES.\r\n\r\n         This line read \"Base set 77 of 84 (92%)\" directly above a tile reading\r\n         77/84 BASE and a bar drawn at 92%. Three renderings of one fact, and\r\n         the line was the least scannable of them. The tiles keep the counts;\r\n         this keeps only what they do not say. */\r\n      sub.textContent = '';\r\n      var anyEst = false;\r\n      sets.forEach(function (x) { if (x.estimated) anyEst = true; });\r\n      sub.appendChild(el('b', null, pct + '% complete'));\r\n      if (anyEst) {\r\n        var e = el('i', 'llcl__est', 'est');\r\n        e.title = 'Some sets here print no set size, so it is estimated from the highest number stocked.';\r\n        sub.appendChild(e);\r\n      }\r\n      sub.appendChild(document.createTextNode(\r\n        (multi ? ' across ' + sets.length + ' sets' : '') +\r\n        ' \u00B7 ' + totalStock + ' buyable \u00B7 ' + (totalSize - totalHeld) + ' to find'\r\n      ));\r\n    }\r\n    if (meter) meter.style.width = pct + '%';\r\n\r\n    /* The master set line: the three things a completionist counts, each with\r\n       its own honest denominator. Base has a printed size. Reverse holos are\r\n       measured against it because a set that reverses at all reverses nearly\r\n       every card. Secret rares have no knowable target, so they are a count. */\r\n    var head2 = root.querySelector('.llcl__master');\r\n    if (!head2) {\r\n      head2 = el('div', 'llcl__master');\r\n      var headBox = root.querySelector('.llcl__head');\r\n      if (headBox) headBox.appendChild(head2);\r\n    }\r\n    head2.textContent = '';\r\n    head2.appendChild(masterStat('Base', totalHeld, totalSize));\r\n    head2.appendChild(masterStat('Variant', totalRev, totalSize));\r\n    head2.appendChild(masterStat('Secret', totalSecret, null));\r\n    head2.appendChild(masterStat('Prints', totalPrint, null));\r\n\r\n    /* Rows Liquid rendered are harvested before anything is torn down: they\r\n       carry the real titles and the working checkboxes, and neither can be\r\n       rebuilt from the index. */\r\n    var existing = Object.create(null);\r\n    [].slice.call(root.querySelectorAll('.llcl__row[data-handle]')).forEach(function (li) {\r\n      existing[li.getAttribute('data-handle')] = li;\r\n    });\r\n\r\n    var old = body.querySelectorAll('.llcl__grid, .llcl__extras, .llcl__setname');\r\n    for (var i = 0; i < old.length; i++) old[i].remove();\r\n\r\n    sets.forEach(function (s) {\r\n      var setSlug = '', bestN = 0;\r\n      for (var nm in s.names) if (s.names[nm] > bestN) { bestN = s.names[nm]; setSlug = nm; }\r\n      s.slug = setSlug;\r\n      s.multi = multi;\r\n\r\n      if (!multi) {\r\n        body.insertBefore(buildGrid(s), tpl);\r\n        body.insertBefore(buildKey(s), tpl);\r\n        if (s.above.length) body.insertBefore(buildExtras(s), tpl);\r\n        lazyList(tpl, s, existing);\r\n        return;\r\n      }\r\n\r\n      /* A set is a line until someone wants it. 72 collapsed summaries cost\r\n         a few hundred nodes; 72 open ones cost ninety thousand. */\r\n      /* THREE THIN LINES, NOT A CARD.\r\n\r\n         Each set used to be a wrapped title, an inline count and three chip\r\n         pills stacked underneath: about 70px, and seventy of them in a list\r\n         nobody can scan. The same facts fit in three lines that are each one\r\n         line tall. The name gets the width and truncates rather than wrapping,\r\n         the count sits hard right where the eye can run down it, and the\r\n         counts a base percentage hides are plain text rather than pills. */\r\n      var d = el('details', 'llcl__set');\r\n      var sm = el('summary', 'llcl__set-s');\r\n\r\n      var top = el('span', 'llcl__set-top');\r\n      top.appendChild(el('span', 'llcl__setname-n', s.label));\r\n      var c = el('span', 'llcl__setname-c', s.base.length + '/' + s.den);\r\n      if (s.estimated) {\r\n        /* Says out loud that this denominator is the highest number on the\r\n           shelf rather than a printed set size, because One Piece and Digimon\r\n           print no size and a bare 84/117 would read as though they did. */\r\n        c.appendChild(el('i', 'llcl__est', 'est'));\r\n        c.title = 'Set size not printed on these cards. Estimated from the highest number stocked.';\r\n      }\r\n      top.appendChild(c);\r\n      sm.appendChild(top);\r\n\r\n      var bar = el('span', 'llcl__bar');\r\n      var fill = el('i');\r\n      fill.style.width = Math.round(s.base.length * 100 / s.den) + '%';\r\n      bar.appendChild(fill);\r\n      var rev = el('b');\r\n      rev.style.width = Math.round(s.reverse.length * 100 / s.den) + '%';\r\n      bar.appendChild(rev);\r\n      sm.appendChild(bar);\r\n\r\n      var meta = el('span', 'llcl__meta-line');\r\n      var bits = [];\r\n      if (s.reverse.length) bits.push(s.reverse.length + ' variant');\r\n      if (s.above.length) bits.push(s.above.length + ' secret');\r\n      bits.push(s.printings + ' printings');\r\n      meta.textContent = bits.join(' \u00B7 ');\r\n      sm.appendChild(meta);\r\n      d.appendChild(sm);\r\n\r\n      var slot = el('div', 'llcl__set-body');\r\n      d.appendChild(slot);\r\n      body.insertBefore(d, tpl);\r\n\r\n      var built = false;\r\n      d.addEventListener('toggle', function () {\r\n        if (!d.open || built) return;\r\n        built = true;\r\n        slot.appendChild(buildGrid(s));\r\n        slot.appendChild(buildKey(s));\r\n        if (s.above.length) slot.appendChild(buildExtras(s));\r\n        var disc = tpl.cloneNode(true);\r\n        slot.appendChild(disc);\r\n        lazyList(disc, s, existing);\r\n      });\r\n    });\r\n\r\n    if (multi) tpl.remove();\r\n    root.setAttribute('data-llcl-complete', '1');\r\n  }\r\n\r\n  function buildGrid(s) {\r\n    var ol = el('ol', 'llcl__grid');\r\n    ol.setAttribute('aria-label', 'Card numbers in ' + s.label);\r\n    var have = Object.create(null);\r\n    s.base.forEach(function (v) { have[v] = 1; });\r\n\r\n    /* One handle per number, so a cell can show the card it stands for. An in\r\n       stock printing wins, because that is the one a shopper can act on. */\r\n    var handleFor = Object.create(null);\r\n    s.items.forEach(function (it) {\r\n      if (!handleFor[it.num] || (it.inStock && !handleFor[it.num].inStock)) handleFor[it.num] = it;\r\n    });\r\n\r\n    for (var i = 1; i <= s.den; i++) {\r\n      var cell = s.byNum[i];\r\n      var cls = 'llcl__n';\r\n      if (have[i]) {\r\n        cls += ' llcl__n--have';\r\n        /* The corner marker is the master set part: a filled cell says we have\r\n           the card, the marker says we also have its reverse holo. Without it\r\n           the grid looks finished to someone who is only missing reverses. */\r\n        if (cell && (cell.reverse || cell.foil || cell.holo || cell.promo)) cls += ' llcl__n--rev';\r\n        if (cell && !cell.buyable) cls += ' llcl__n--gone';\r\n      }\r\n      var li = el('li', cls);\r\n      if (have[i]) {\r\n        var a = el('a', null, String(i));\r\n        a.href = '#' + rowId(s, i);\r\n        if (handleFor[i]) a.setAttribute('data-peek', handleFor[i].handle);\r\n        a.title = i + ' \u2014 ' + Object.keys(cell || {}).filter(function (k) { return k !== 'buyable'; }).join(', ');\r\n        li.appendChild(a);\r\n      } else {\r\n        li.textContent = String(i);\r\n        li.setAttribute('aria-label', 'Card ' + i + ', not in stock');\r\n      }\r\n      ol.appendChild(li);\r\n    }\r\n    return ol;\r\n  }\r\n\r\n  /* Secret rares were a run of loose numbers after a label, which is the one\r\n     part of a checklist a collector reads most carefully and the part that\r\n     looked least like the rest of it. Same cells as the grid above, so the\r\n     eye treats them as what they are: more of the set, numbered past its end. */\r\n  function buildExtras(s) {\r\n    var wrap = el('div', 'llcl__secret');\r\n    var head = el('p', 'llcl__secret-h');\r\n    head.appendChild(el('span', null, 'Secret rares'));\r\n    head.appendChild(el('b', null, String(s.above.length)));\r\n    wrap.appendChild(head);\r\n\r\n    var ol = el('ol', 'llcl__grid llcl__grid--secret');\r\n    ol.setAttribute('aria-label', 'Cards numbered above ' + s.den + ' in ' + s.label);\r\n    s.above.forEach(function (n) {\r\n      var cell = s.byNum[n] || {};\r\n      var cls = 'llcl__n llcl__n--have';\r\n      if (cell.reverse || cell.foil || cell.holo || cell.promo) cls += ' llcl__n--rev';\r\n      if (!cell.buyable) cls += ' llcl__n--gone';\r\n      var li = el('li', cls);\r\n      var a = el('a', null, String(n));\r\n      a.href = '#' + rowId(s, n);\r\n      var pick = null;\r\n      for (var k = 0; k < s.items.length; k++) {\r\n        if (s.items[k].num === n && (!pick || (s.items[k].inStock && !pick.inStock))) pick = s.items[k];\r\n      }\r\n      if (pick) a.setAttribute('data-peek', pick.handle);\r\n      li.appendChild(a);\r\n      ol.appendChild(li);\r\n    });\r\n    wrap.appendChild(ol);\r\n    return wrap;\r\n  }\r\n\r\n  /* Card numbers repeat across sets, so a bare number stops being unique the\r\n     moment a second set is on the page. */\r\n  /* Three states worth a word each. Without this the corner notch is a smudge\r\n     and a hollow cell reads as a rendering fault rather than as sold out. */\r\n  function buildKey(s) {\r\n    var k = el('div', 'llcl__key');\r\n    function item(cls, text) {\r\n      var i = el('span', 'llcl__key-i');\r\n      i.appendChild(el('span', 'llcl__n ' + cls));\r\n      i.appendChild(el('span', null, text));\r\n      return i;\r\n    }\r\n    k.appendChild(item('llcl__n--have', 'in stock'));\r\n    if (s.reverse.length) k.appendChild(item('llcl__n--have llcl__n--rev', 'variant too'));\r\n    k.appendChild(item('llcl__n--have llcl__n--gone', 'sold out'));\r\n    k.appendChild(item('', 'not stocked'));\r\n    return k;\r\n  }\r\n\r\n  function rowId(s, num) {\r\n    return s.multi ? ('llcl-card-' + s.den + '-' + num) : ('llcl-card-' + num);\r\n  }\r\n\r\n  /* The priced list is the expensive half and it lives behind a disclosure most\r\n     visitors never open, so it is not built until they do. */\r\n  function lazyList(disc, s, existing) {\r\n    ensureThumbIO();\r\n    /* Kicked off before a single row exists, so the map is already on its way\r\n       by the time the first thumbnail scrolls into view. */\r\n    bulkPrefetch();\r\n    var ul = disc.querySelector('ul');\r\n    if (!ul) return;\r\n\r\n    /* Emptied here rather than in build(), because a set's disclosure is a\r\n       clone of the one Liquid rendered and therefore arrives holding a copy of\r\n       all 217 server rows. Left until the disclosure was opened, every closed\r\n       set carried a stale duplicate of them, ids and all. */\r\n    ul.innerHTML = '';\r\n\r\n    s.items.sort(function (a, b) { return a.num - b.num; });\r\n    var seen = Object.create(null), unique = [];\r\n    s.items.forEach(function (item) {\r\n      if (seen[item.handle]) return;\r\n      seen[item.handle] = 1;\r\n      item.den = s.den;\r\n      unique.push(item);\r\n    });\r\n\r\n    /* Started as soon as the set's list is prepared, so the pictures are on\r\n       their way before the first row scrolls into view. */\r\n    var slugEntry = mapAll && mapAll.collections && mapAll.collections[s.slug];\r\n    ul.__llclBulk = s.multi && slugEntry\r\n      ? bulkFor(s.slug, slugEntry.count)\r\n      : bulkPrefetch();\r\n\r\n    /* COLLECTING TOOLS.\r\n\r\n       The list answers \"how much\" one row at a time, which is fine for buying\r\n       a card and useless for filling a set. These two do the gathering: one\r\n       tick takes everything in the set that can actually be bought, and the\r\n       filter clears the sold out rows out of the way so what is left is a\r\n       shopping list rather than a catalogue. */\r\n    var tools = el('div', 'llcl__tools');\r\n\r\n    var all = el('button', 'llcl__tool', 'Select all buyable');\r\n    all.type = 'button';\r\n    all.addEventListener('click', function () {\r\n      var boxes = ul.querySelectorAll('input.llcl__pick');\r\n      var anyOff = false;\r\n      for (var i = 0; i < boxes.length; i++) if (!boxes[i].checked) { anyOff = true; break; }\r\n      for (var j = 0; j < boxes.length; j++) boxes[j].checked = anyOff;\r\n      all.textContent = anyOff ? 'Clear selection' : 'Select all buyable';\r\n      /* Dispatched from a BOX, not from the root. The bulk bar listens for a\r\n         change whose target carries the checkbox class, so an event raised on\r\n         the container matched nothing: ninety one rows were ticked on screen\r\n         while the bar still read zero selected and stayed hidden. */\r\n      if (boxes[0]) boxes[0].dispatchEvent(new Event('change', { bubbles: true }));\r\n    });\r\n    tools.appendChild(all);\r\n\r\n    var only = el('label', 'llcl__tool llcl__tool--check');\r\n    var onlyBox = document.createElement('input');\r\n    onlyBox.type = 'checkbox';\r\n    onlyBox.addEventListener('change', function () {\r\n      ul.classList.toggle('is-buyable-only', onlyBox.checked);\r\n    });\r\n    only.appendChild(onlyBox);\r\n    only.appendChild(el('span', null, 'In stock only'));\r\n    tools.appendChild(only);\r\n\r\n    ul.parentNode.insertBefore(tools, ul);\r\n\r\n    var label = disc.querySelector('.llcl__disc-s span');\r\n    if (label) {\r\n      label.textContent = s.multi\r\n        ? ('Show the ' + unique.length + ' ' + s.label + ' cards with prices')\r\n        : ('Show all ' + unique.length + ' cards with prices');\r\n    }\r\n\r\n    /* BUILT IN SLICES.\r\n\r\n       377 rows is a few thousand elements, and building them in one pass is a\r\n       single blocking task at exactly the moment someone taps to open a set,\r\n       which is the worst time to have one. The first slice fills the panel\r\n       immediately and the rest arrive a frame at a time, so the list is usable\r\n       before it is finished. */\r\n    var built = false;\r\n    function build() {\r\n      if (built) return;\r\n      built = true;\r\n      var i = 0;\r\n\r\n      function slice(budget) {\r\n        var frag = document.createDocumentFragment();\r\n        var end = Math.min(i + budget, unique.length);\r\n        for (; i < end; i++) {\r\n          var item = unique[i];\r\n          var li = existing[item.handle] || buildRow(item, s.slug);\r\n          li.id = rowId(s, item.num);\r\n          /* A reused row never passes through buildRow, so it has to be told\r\n             which product it is before the shared hover handler acts on it. */\r\n          var nameEl = li.querySelector('.llcl__name');\r\n          if (nameEl && !nameEl.hasAttribute('data-peek')) {\r\n            nameEl.setAttribute('data-peek', item.handle);\r\n          }\r\n          if (!li.querySelector('.llcl__thumb')) {\r\n            li.insertBefore(thumbSlot(item.handle), nameEl);\r\n          }\r\n          frag.appendChild(li);\r\n        }\r\n        ul.appendChild(frag);\r\n        observeRows(ul);\r\n        if (i < unique.length) requestAnimationFrame(function () { slice(60); });\r\n      }\r\n\r\n      slice(40);\r\n    }\r\n\r\n    disc.addEventListener('toggle', function () { if (disc.open) build(); });\r\n    if (disc.open) build();\r\n    disc.__llclBuild = build;\r\n  }\r\n\r\n  /* A grid cell links to a row inside a disclosure that may not be open, and\r\n     on a multi set page may not even be built yet. Without this a filled number\r\n     scrolled nowhere at all. */\r\n  root.addEventListener('click', function (e) {\r\n    var a = e.target.closest && e.target.closest('.llcl__grid a[href^=\"#llcl-card-\"]');\r\n    if (!a) return;\r\n    var scope = a.closest('.llcl__set-body') || root;\r\n    var disc = scope.querySelector('.llcl__disc');\r\n    if (disc) {\r\n      if (disc.__llclBuild) disc.__llclBuild();\r\n      disc.open = true;\r\n    }\r\n    e.preventDefault();\r\n\r\n    /* The rows are built a slice at a time, so the one this cell points at\r\n       very likely does not exist yet on the click that opened the list: the\r\n       first pick highlighted nothing while every later pick worked. Wait for\r\n       it rather than guessing how many frames the build will take. */\r\n    whenRow(a.getAttribute('href').slice(1), function (target) {\r\n      landOn(target);\r\n    });\r\n  });\r\n\r\n  function whenRow(id, cb, tries) {\r\n    var target = document.getElementById(id);\r\n    if (target) { cb(target); return; }\r\n    tries = (tries || 0) + 1;\r\n    if (tries > 40) return;               /* ~40 frames, then give up quietly */\r\n    requestAnimationFrame(function () { whenRow(id, cb, tries); });\r\n  }\r\n\r\n  function landOn(target) {\r\n\r\n    /* EVERY PRINTING OF THAT NUMBER, not just the first row.\r\n\r\n       Opening the list at the right place still left you hunting: the rows all\r\n       look alike and a master set number often has three of them, base, holo\r\n       and reverse. Highlighting the number's whole run answers the question\r\n       the cell was asked, which is \"what have you got for card 47\", and the\r\n       previous pick is cleared so only one answer is on screen at a time. */\r\n    var num = target.getAttribute('data-num');\r\n    var list = target.closest('ul');\r\n    var was = root.querySelectorAll('.llcl__row.is-target');\r\n    for (var i = 0; i < was.length; i++) was[i].classList.remove('is-target');\r\n\r\n    var run = list ? list.querySelectorAll('.llcl__row[data-num=\"' + num + '\"]') : [target];\r\n    for (var j = 0; j < run.length; j++) run[j].classList.add('is-target');\r\n\r\n    /* A row hidden by the in stock filter cannot be scrolled to, and silently\r\n       going nowhere reads as a broken link. */\r\n    if (getComputedStyle(target).display === 'none' && list) {\r\n      list.classList.remove('is-buyable-only');\r\n      var box = list.parentNode.querySelector('.llcl__tool--check input');\r\n      if (box) box.checked = false;\r\n    }\r\n    target.scrollIntoView({ block: 'center' });\r\n  }\r\n  /* ---- hovering a number shows the card ------------------------------------\r\n     The grid answers \"do they have it\" and the list answers \"how much\", but\r\n     neither shows the card, and on a set page the picture is most of what a\r\n     collector is checking. The index carries no images, so the product is\r\n     fetched on hover and remembered: a shopper skims a handful of numbers, not\r\n     two hundred, so this stays a few requests rather than a preload. */\r\n\r\n  var peekEl = null, peekCache = Object.create(null), peekFor = null;\r\n  var mapEntry = null, mapAll = null;\r\n\r\n  /* ---- loading the pictures without stalling the scroll --------------------\r\n\r\n     THREE THINGS WERE WRONG.\r\n\r\n     The observer was rooted on the VIEWPORT while the rows live inside\r\n     .llcl__body, which is the thing that actually scrolls. Its 200px margin\r\n     was therefore measured against the window and meant nothing to the panel,\r\n     so rows arrived in the wrong batches.\r\n\r\n     Every row that entered view fired its own request immediately. Flicking\r\n     down a 322 row list put hundreds of fetches in flight at once, and the\r\n     tail of that queue was still resolving long after the shopper had stopped,\r\n     which is the lag: not the images, the stampede.\r\n\r\n     And each product needed its own request in the first place, when the\r\n     storefront will hand over a whole collection, images included, in one.\r\n\r\n     So: one bulk request where it can cover the page, an observer rooted on\r\n     the real scroller, and a queue that never has more than a few requests\r\n     open and drops anything that scrolled back out of view before its turn. */\r\n\r\n  var thumbIO = null;\r\n  var bulkCache = Object.create(null);   /* slug -> promise of {handle: image} */\r\n  var queue = [], inFlight = 0;\r\n  var MAX_INFLIGHT = 5;\r\n\r\n  /* ONE REQUEST PER SET, NOT ONE PER CARD.\r\n\r\n     A collection's products.json hands over up to 250 products WITH their\r\n     images. On a set page that is the whole shelf in a single request and no\r\n     card ever needs its own.\r\n\r\n     A parent collection cannot use it: POKEMON is 12,985 products, 52 pages,\r\n     and its first page would rarely be the rows on screen. That is why the big\r\n     collections were still making a request per visible row, and why they were\r\n     the ones that stuttered.\r\n\r\n     But the rows being LOOKED at always belong to one set, and 139 of the 159\r\n     sets in the index are collections in their own right. So when a set is\r\n     opened its own collection is fetched instead: Fusion Strike is one request\r\n     rather than forty. The 20 sets with no collection of their own, and any\r\n     set larger than two pages, fall back to the per row queue.\r\n\r\n     THE PROMISE is cached, not the result. Caching only the result meant every\r\n     caller that arrived while a request was open was told there was no map and\r\n     went off to fetch its own product. */\r\n  function bulkFor(slug, count) {\r\n    if (!slug) return Promise.resolve(null);\r\n    if (bulkCache[slug]) return bulkCache[slug];\r\n    /* ONE PAGE, OR NONE.\r\n\r\n       products.json returns whole product objects, variants and all, so a page\r\n       of 250 is megabytes and JSON.parse of it is a single blocking task. Two\r\n       pages for Ascended Heroes was a 426ms frame on its own: the bulk request\r\n       had simply moved the stall from the network to the parser.\r\n\r\n       One page is worth it because it covers a whole set page and removes\r\n       every per row request there. Anything larger is left to the per row\r\n       queue, which fetches a handful of small products once scrolling stops\r\n       and never parses more than it is about to draw. */\r\n    if (!(count > 0) || count > 250) {\r\n      bulkCache[slug] = Promise.resolve(null);\r\n      return bulkCache[slug];\r\n    }\r\n    bulkCache[slug] = fetch('/collections/' + slug + '/products.json?limit=250',\r\n                            { headers: { Accept: 'application/json' } })\r\n      .then(function (r) { return r.ok ? r.json() : null; })\r\n      .then(function (j) {\r\n        if (!j || !j.products) return null;\r\n        var m = Object.create(null), any = false;\r\n        j.products.forEach(function (pr) {\r\n          var img = pr.images && pr.images[0] && pr.images[0].src;\r\n          if (pr.handle && img) { m[pr.handle] = img; any = true; }\r\n        });\r\n        return any ? m : null;\r\n      })\r\n      .catch(function () { return null; });\r\n    return bulkCache[slug];\r\n  }\r\n\r\n  /* The collection being viewed, which covers a set page in one go. */\r\n  function bulkPrefetch() {\r\n    return bulkFor(handle, mapEntry && mapEntry.count);\r\n  }\r\n\r\n  /* The set a row belongs to, which covers a set opened inside a big one. */\r\n  function bulkForRow(b) {\r\n    var ul = b.closest('ul');\r\n    if (ul && ul.__llclBulk) return ul.__llclBulk;\r\n    return bulkPrefetch();\r\n  }\r\n\r\n  /* PAINTING WAITS FOR THE SCROLL TO STOP.\r\n\r\n     Fixing the requests made the rendering worse, which only showed up when\r\n     measured. With one bulk response every picture is available instantly, so\r\n     a scroll that used to attach 39 images attached 274, and the median frame\r\n     went from 40ms to 73ms with a 203ms worst case. The stampede had moved\r\n     from the network to the decoder, and batching a few per frame did not help\r\n     because the problem was the total, not the burst.\r\n\r\n     Nobody looks at a row they are flicking past. So a row entering view only\r\n     REGISTERS its picture; nothing is attached until the container has been\r\n     still for a moment, and then only for the rows actually on screen. A fast\r\n     scroll through 377 rows now paints the dozen you land on instead of 274\r\n     you never saw. */\r\n  var pending = [], lastScroll = 0, paintTimer = null;\r\n  /* How still the list has to be before pictures are drawn.\r\n\r\n     A real fling fires scroll events continuously, so nothing is drawn while\r\n     one is in progress whatever this is set to; the number governs how quickly\r\n     pictures appear once you slow down. 130ms was cautious enough that a\r\n     gentle scroll felt like it was withholding them. At 60ms they fill in\r\n     almost as soon as you ease off, and a genuine flick is still skipped. */\r\n  var QUIET_MS = 60, PER_PASS = 12;\r\n\r\n  function paint(b, src) {\r\n    if (!src || b.classList.contains('is-loaded') || b.__llclSrc) return;\r\n    b.__llclSrc = src;\r\n    pending.push(b);\r\n    schedulePaint();\r\n  }\r\n\r\n  function schedulePaint() {\r\n    if (paintTimer) return;\r\n    paintTimer = setTimeout(runPaint, QUIET_MS);\r\n  }\r\n\r\n  function runPaint() {\r\n    paintTimer = null;\r\n    if (performance.now() - lastScroll < QUIET_MS) { schedulePaint(); return; }\r\n\r\n    /* THE BOUNDS ARE READ ONCE.\r\n\r\n       onScreen used to measure the scroller for every pending row, so a pass\r\n       over 377 of them forced hundreds of layout reads and produced a 419ms\r\n       frame: the check for cheap painting cost more than the painting. The\r\n       container is measured once here and each row is compared against that. */\r\n    var scroller = root.querySelector('.llcl__body');\r\n    var top = 0, bottom = window.innerHeight;\r\n    if (scroller) {\r\n      var sr = scroller.getBoundingClientRect();\r\n      top = sr.top; bottom = sr.bottom;\r\n    }\r\n\r\n    var next = [], done = 0;\r\n    for (var i = 0; i < pending.length; i++) {\r\n      var b = pending[i];\r\n      if (b.classList.contains('is-loaded')) continue;\r\n      if (done >= PER_PASS) { next.push(b); continue; }\r\n      var r = b.getBoundingClientRect();\r\n      var visible = (r.width || r.height) && r.bottom > top - 80 && r.top < bottom + 80;\r\n      if (!visible) { next.push(b); continue; }\r\n      done++;\r\n      if (b.__llclSrc) { attach(b, b.__llclSrc); continue; }\r\n      (function (btn) {\r\n        loadProduct(btn.getAttribute('data-thumb')).then(function (pr) {\r\n          if (pr) attach(btn, pr.featured_image || (pr.images && pr.images[0]));\r\n        }).catch(function () {});\r\n      }(b));\r\n    }\r\n    pending = next;\r\n    /* Anything still waiting is either off screen or over this pass's budget,\r\n       so come back for it rather than dropping it. */\r\n    if (pending.length && done > 0) schedulePaint();\r\n  }\r\n\r\n  function noteScroll() { lastScroll = performance.now(); schedulePaint(); }\r\n\r\n  function attach(b, src) {\r\n    if (b.classList.contains('is-loaded')) return;\r\n    var img = new Image();\r\n    img.decoding = 'async';\r\n    img.loading = 'lazy';\r\n    img.alt = '';\r\n    /* A fixed box in CSS already, so give the element the same intrinsic size\r\n       and the row never reflows as pictures arrive. */\r\n    img.width = 72; img.height = 72;\r\n    img.src = src + (src.indexOf('?') > -1 ? '&' : '?') + 'width=72';\r\n    b.appendChild(img);\r\n    b.classList.add('is-loaded');\r\n  }\r\n\r\n  /* Still worth loading? A row flicked past while its turn was queued is not,\r\n     and skipping it is what keeps a fast scroll cheap. */\r\n  function stillWanted(b) {\r\n    if (!b.isConnected || b.classList.contains('is-loaded')) return false;\r\n    var scroller = b.closest('.llcl__body');\r\n    var r = b.getBoundingClientRect();\r\n    /* A row under content-visibility: auto reports a zero size box while it is\r\n       still skipped, and measuring one told this that every thumbnail had\r\n       scrolled away: nothing loaded at all. The observer only queues what it\r\n       has just seen intersect, so when there is nothing to measure, believe it\r\n       rather than the rectangle. */\r\n    if (r.width === 0 && r.height === 0) return true;\r\n    var top = 0, bottom = window.innerHeight;\r\n    if (scroller) {\r\n      var sr = scroller.getBoundingClientRect();\r\n      top = sr.top; bottom = sr.bottom;\r\n    }\r\n    return r.bottom > top - 400 && r.top < bottom + 400;\r\n  }\r\n\r\n  function pump() {\r\n    while (inFlight < MAX_INFLIGHT && queue.length) {\r\n      var b = queue.shift();\r\n      if (!stillWanted(b)) continue;\r\n      inFlight++;\r\n      /* eslint-disable no-loop-func */\r\n      (function (btn) {\r\n        loadProduct(btn.getAttribute('data-thumb')).then(function (p) {\r\n          if (p) paint(btn, p.featured_image || (p.images && p.images[0]));\r\n        }).catch(function () {}).then(function () {\r\n          inFlight--;\r\n          pump();\r\n        });\r\n      }(b));\r\n    }\r\n  }\r\n\r\n  function thumbSlot(handle) {\r\n    var b = document.createElement('button');\r\n    b.type = 'button';\r\n    b.className = 'llcl__thumb';\r\n    b.setAttribute('data-thumb', handle);\r\n    b.setAttribute('aria-label', 'Show a picture of this card');\r\n    return b;\r\n  }\r\n\r\n  /* The ROW is observed, not the thumbnail inside it.\r\n\r\n     Rows carry content-visibility: auto so the browser can skip drawing the\r\n     ones off screen, which took the median frame during a scroll from 36ms to\r\n     23ms and the long frames from 20 to none. The catch is that a skipped row\r\n     never reports its descendants, so observing the button meant no picture in\r\n     a 322 row list ever loaded. The row is the element the browser is tracking,\r\n     so that is the element to watch, and the button is found inside it once it\r\n     is on screen. */\r\n  function observeRows(ul) {\r\n    if (!thumbIO) return;\r\n    var rows = ul.querySelectorAll('.llcl__row');\r\n    for (var i = 0; i < rows.length; i++) thumbIO.observe(rows[i]);\r\n  }\r\n\r\n  function ensureThumbIO(scope) {\r\n    if (thumbIO || !window.IntersectionObserver) return;\r\n\r\n    /* Rooted on the panel body where that is what scrolls, and on the window\r\n       where the checklist has fallen back to a plain block. */\r\n    var scroller = (scope || root).querySelector('.llcl__body');\r\n    if (scroller) {\r\n      var oy = getComputedStyle(scroller).overflowY;\r\n      if (oy !== 'auto' && oy !== 'scroll') scroller = null;\r\n    }\r\n\r\n    if (scroller) scroller.addEventListener('scroll', noteScroll, { passive: true });\r\n    window.addEventListener('scroll', noteScroll, { passive: true });\r\n\r\n    thumbIO = new IntersectionObserver(function (entries) {\r\n      var hits = [];\r\n      entries.forEach(function (en) {\r\n        if (!en.isIntersecting) return;\r\n        thumbIO.unobserve(en.target);\r\n        var b = en.target.querySelector('.llcl__thumb');\r\n        if (b && !b.classList.contains('is-loaded')) hits.push(b);\r\n      });\r\n      if (!hits.length) return;\r\n\r\n      hits.forEach(function (b) {\r\n        bulkForRow(b).then(function (map) {\r\n          var src = map && map[b.getAttribute('data-thumb')];\r\n          if (src) { paint(b, src); return; }\r\n          /* No bulk map for this set, so the picture has to be fetched. That\r\n             waits for the same quiet moment the painting does, so a flick\r\n             through a set fetches nothing at all. */\r\n          if (b.__llclSrc || b.__llclPending) return;\r\n          b.__llclPending = 1;\r\n          pending.push(b);\r\n          schedulePaint();\r\n        });\r\n      });\r\n    }, { root: scroller || null, rootMargin: '300px 0px' });\r\n  }\r\n\r\n  function loadProduct(handle) {\r\n    if (!handle) return Promise.resolve(null);\r\n    if (peekCache[handle]) return Promise.resolve(peekCache[handle]);\r\n    return fetch('/products/' + handle + '.js', { headers: { Accept: 'application/json' } })\r\n      .then(function (r) { return r.ok ? r.json() : null; })\r\n      .then(function (p) { if (p) peekCache[handle] = p; return p; })\r\n      .catch(function () { return null; });\r\n  }\r\n\r\n  /* Tapping a thumbnail opens it large. One overlay, reused, dismissed by a tap\r\n     anywhere on it or by Escape. */\r\n  var boxEl = null;\r\n\r\n  function openBox(handle) {\r\n    loadProduct(handle).then(function (p) {\r\n      if (!p) return;\r\n      if (!boxEl) {\r\n        boxEl = el('div', 'llcl__box');\r\n        boxEl.hidden = true;\r\n        boxEl.addEventListener('click', closeBox);\r\n        document.body.appendChild(boxEl);\r\n        document.addEventListener('keydown', function (e) {\r\n          if (e.key === 'Escape') closeBox();\r\n        });\r\n      }\r\n      boxEl.innerHTML = '';\r\n      var src = p.featured_image || (p.images && p.images[0]);\r\n      if (src) {\r\n        var img = new Image();\r\n        img.src = src + (src.indexOf('?') > -1 ? '&' : '?') + 'width=900';\r\n        img.alt = p.title;\r\n        boxEl.appendChild(img);\r\n      }\r\n      boxEl.appendChild(el('span', 'llcl__box-t', p.title));\r\n      boxEl.hidden = false;\r\n    });\r\n  }\r\n\r\n  function closeBox() { if (boxEl) boxEl.hidden = true; }\r\n\r\n  root.addEventListener('click', function (e) {\r\n    var b = e.target.closest && e.target.closest('.llcl__thumb');\r\n    if (!b) return;\r\n    e.preventDefault();\r\n    e.stopPropagation();\r\n    openBox(b.getAttribute('data-thumb'));\r\n  });\r\n\r\n\r\n\r\n  function peekShow(a) {\r\n    var handle = a.getAttribute('data-peek');\r\n    if (!handle) return;\r\n    peekFor = handle;\r\n\r\n    if (!peekEl) {\r\n      peekEl = el('div', 'llcl__peek');\r\n      peekEl.hidden = true;\r\n      document.body.appendChild(peekEl);\r\n    }\r\n    var r = a.getBoundingClientRect();\r\n    /* Left of the rail, which is where the room is, and clamped so a cell near\r\n       the bottom does not push the preview off the screen. */\r\n    peekEl.style.top = Math.max(8, Math.min(r.top - 40, window.innerHeight - 260)) + 'px';\r\n    /* Left of whatever was hovered, unless there is no room there, in which\r\n       case it goes to the right of it: a row in a narrow drawer has the rail\r\n       hard against the screen edge. */\r\n    var want = r.left - 214;\r\n    peekEl.style.left = (want < 8 ? Math.min(r.right + 12, window.innerWidth - 208) : want) + 'px';\r\n\r\n    function paint(p) {\r\n      if (peekFor !== handle || !p) return;\r\n      peekEl.innerHTML = '';\r\n      var src = p.featured_image || (p.images && p.images[0]);\r\n      if (src) {\r\n        var img = new Image();\r\n        img.src = src.indexOf('?') > -1 ? src + '&width=360' : src + '?width=360';\r\n        img.alt = '';\r\n        peekEl.appendChild(img);\r\n      }\r\n      peekEl.appendChild(el('span', 'llcl__peek-t', p.title));\r\n      peekEl.hidden = false;\r\n    }\r\n\r\n    if (peekCache[handle]) { paint(peekCache[handle]); return; }\r\n    fetch('/products/' + handle + '.js', { headers: { Accept: 'application/json' } })\r\n      .then(function (r2) { return r2.ok ? r2.json() : null; })\r\n      .then(function (p) { if (p) { peekCache[handle] = p; paint(p); } })\r\n      .catch(function () {});\r\n  }\r\n\r\n  function peekHide() { peekFor = null; if (peekEl) peekEl.hidden = true; }\r\n\r\n  /* Gated on the POINTER, not on a hover media query.\r\n\r\n     `(hover: hover)` looked like the right test and is not: it reports false on\r\n     plenty of real desktops, and it reported false in the browser this was\r\n     built in, which suppressed the preview on a machine with a mouse and no\r\n     touchscreen at all. pointerType is the fact rather than an inference, so a\r\n     mouse gets the preview and a finger never does. */\r\n  function peekFromEvent(e, show) {\r\n    if (e.pointerType && e.pointerType !== 'mouse') return;\r\n    var a = e.target.closest && e.target.closest('a[data-peek]');\r\n    if (!a) return;\r\n    if (show) peekShow(a); else peekHide();\r\n  }\r\n\r\n  root.addEventListener('pointerover', function (e) { peekFromEvent(e, true); });\r\n  root.addEventListener('pointerout', function (e) { peekFromEvent(e, false); });\r\n\r\n  /* Keyboard gets the same thing on focus, where there is no pointer at all. */\r\n  root.addEventListener('focusin', function (e) {\r\n    var a = e.target.closest && e.target.closest('a[data-peek]');\r\n    if (a) peekShow(a);\r\n  });\r\n  root.addEventListener('focusout', peekHide);\r\n  window.addEventListener('scroll', peekHide, { passive: true });\r\n  /* The markup is already right; these are the parts markup cannot do. Placed\r\n     last so every helper it leans on has been defined. */\r\n  if (SET_SOURCED) {\r\n    ensureThumbIO();\r\n    var served = root.querySelector('[data-llcl-list]');\r\n    if (served) {\r\n      [].slice.call(served.querySelectorAll('.llcl__row[data-handle]')).forEach(function (li) {\r\n        if (li.querySelector('.llcl__thumb')) return;\r\n        var nameEl = li.querySelector('.llcl__name');\r\n        if (nameEl) li.insertBefore(thumbSlot(li.getAttribute('data-handle')), nameEl);\r\n      });\r\n      observeRows(served);\r\n    }\r\n    root.setAttribute('data-llcl-complete', 'set');\r\n  }\r\n}());\r\n"],
  "mappings": "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",
  "names": ["items", "n", "handle", "paint"]
}
