{"data":[{"capping":{},"containsJinjava":true,"displayType":"LAYER","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"4","timesType":"DAYS"},"type":"MAXIMUM"},"id":"5ab9209c-15c0-4d9c-91a0-1a618b0ad084","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":true,"options":{"batchDelivery":false,"controlGroup":50,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{"times":"1"},"type":"AFTER_SHOW"},"subject":"[Global][AUT] Abandoned Carts - Popup Test 3 - ver 3.0","targetRestriction":["DESKTOP"],"trigger":{"options":{"delayType":"SECONDS","delayValue":"4"},"type":"ON_LANDING"},"variants":[{"content":{},"id":13462788,"name":"Variant A","parsedData":{},"percentage":50,"selector":null,"selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[{"requirement":"/pl/","type":"CONTAIN"},{"requirement":"/es/","type":"CONTAIN"},{"requirement":"/fr/","type":"CONTAIN"},{"requirement":"/it/","type":"CONTAIN"},{"requirement":"adid=","type":"CONTAIN"},{"requirement":"banner=","type":"CONTAIN"},{"requirement":"id=","type":"CONTAIN"},{"requirement":"/de/","type":"CONTAIN"},{"requirement":"/ro/","type":"CONTAIN"},{"requirement":"/nl/","type":"CONTAIN"}],"viewsPageUrl":[{"requirement":"i1000","type":"CONTAIN"},{"requirement":"search?query","type":"CONTAIN"}]},{"capping":{},"containsJinjava":true,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ALWAYS"},"id":"c6686ad4-a6fd-4ea1-8505-825134fe2a36","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":false,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"[snrs-dev] Memory game tier 1","targetRestriction":[],"trigger":{"options":{"delayType":"SECONDS"},"type":"ON_DEMAND"},"variants":[{"content":{},"id":18744160,"name":"Variant A","parsedData":{},"percentage":100,"selector":"#promoCodeText","selectorPrefix":"INNER"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"special-promo","type":"CONTAIN"}]},{"capping":{},"containsJinjava":false,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"DAYS"},"type":"ONCE_PER_DAY"},"id":"49ada220-3742-4fb1-9a1e-335b0effc84d","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":true,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"campaign":"","medium":"","parameters":{},"source":"","term":""}},"stopDisplay":{"options":{"times":"3"},"type":"AFTER_ACTION"},"subject":"[UXR][1] SOHO UXR-1143","targetRestriction":["DESKTOP"],"trigger":{"options":{"delayType":"SECONDS","delayValue":"5"},"type":"ON_LANDING"},"variants":[{"content":{},"id":19029141,"name":"Variant A","parsedData":{},"percentage":100,"selector":"#root","selectorPrefix":"AFTER"}],"viewsExcludePageUrl":[{"requirement":"login","type":"CONTAIN"},{"requirement":"dashboard","type":"CONTAIN"},{"requirement":"/unsubscribe","type":"CONTAIN"},{"requirement":"/payment","type":"CONTAIN"},{"requirement":"/page/cart","type":"CONTAIN"},{"requirement":"/page/get-key","type":"CONTAIN"}],"viewsPageUrl":[{"requirement":"-i10000263325006","type":"CONTAIN"},{"requirement":"-i10000508375003 ","type":"CONTAIN"},{"requirement":"-i10000513957002 ","type":"CONTAIN"},{"requirement":"-i10000511772002 ","type":"CONTAIN"},{"requirement":"-i10000193024007 ","type":"CONTAIN"},{"requirement":"-i10000513289001 ","type":"CONTAIN"},{"requirement":"-i10000506827001 ","type":"CONTAIN"},{"requirement":"-i10000271538001 ","type":"CONTAIN"},{"requirement":"-i10000271164001 ","type":"CONTAIN"},{"requirement":"-i10000509759009 ","type":"CONTAIN"},{"requirement":"-i10000509436001 ","type":"CONTAIN"},{"requirement":"-i10000509395002 ","type":"CONTAIN"},{"requirement":"-i10000514274002 ","type":"CONTAIN"},{"requirement":"-i10000513222002 ","type":"CONTAIN"},{"requirement":"-i10000512348001 ","type":"CONTAIN"},{"requirement":"-i10000510949002 ","type":"CONTAIN"},{"requirement":"-i10000512964006 ","type":"CONTAIN"},{"requirement":"-i10000510431001 ","type":"CONTAIN"},{"requirement":"-i10000506106001 ","type":"CONTAIN"},{"requirement":"-i10000510443003 ","type":"CONTAIN"},{"requirement":"-i10000510949002 ","type":"CONTAIN"},{"requirement":"-i10000513211001","type":"CONTAIN"},{"requirement":"-i10000508375006 ","type":"CONTAIN"},{"requirement":"-i10000325952001 ","type":"CONTAIN"},{"requirement":"-i10000505065004 ","type":"CONTAIN"},{"requirement":"-i10000513446001 ","type":"CONTAIN"},{"requirement":"-i10000048960004 ","type":"CONTAIN"},{"requirement":"-i10000505518004 ","type":"CONTAIN"},{"requirement":"-i10000508601003 ","type":"CONTAIN"},{"requirement":"-i10000169589008 ","type":"CONTAIN"},{"requirement":"-i10000339638002 ","type":"CONTAIN"},{"requirement":"-i10000509174001 ","type":"CONTAIN"},{"requirement":"-i10000508375001 ","type":"CONTAIN"},{"requirement":"-i10000189061002 ","type":"CONTAIN"},{"requirement":"-i10000512543001 ","type":"CONTAIN"},{"requirement":"-i10000509395004 ","type":"CONTAIN"},{"requirement":"-i10000190438002 ","type":"CONTAIN"},{"requirement":"-i10000508598002","type":"CONTAIN"},{"requirement":"-i10000271146001 ","type":"CONTAIN"},{"requirement":"-i10000192334009 ","type":"CONTAIN"},{"requirement":"-i10000195108006 ","type":"CONTAIN"},{"requirement":"-i10000513148001 ","type":"CONTAIN"}]},{"capping":{},"containsJinjava":false,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ONCE_PER_DAY"},"id":"3df85552-4d3a-4a5f-8b99-a51ac8ca00fe","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":false,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"[UXR][1] Get-key cancel reasons UXR-116","targetRestriction":["DESKTOP"],"trigger":{"options":{"delayType":"SECONDS","delayValue":"1"},"type":"ON_LANDING"},"variants":[{"content":{"css":"#ajfraj {\r\n  width: 500px;\r\n    height: 305px;\r\n    padding: 16px;\r\n    overflow: hidden;\r\n}\r\n .alchibox {\r\n  z-index: 2147483647 !important;\r\n  bottom: 0%;\r\n  position: fixed;\r\n  right: 0px;\r\n  border-radius: 4px 0px 0px 4px;\r\n  flex-direction: column;\r\n  align-items: center;\r\n  transition: transform ease-in-out 0.2s;\r\n  padding: 0 4px;\r\n  height: 240px;\r\n  background-color: rgb(255, 255, 255);\r\n  width: 430px;\r\n  display: flex;\r\n  flex-direction: column;\r\n  background-color: #F5F5F5;\r\n  box-shadow: 0px 4px 10px 0px #00000033;\r\n}\r\n .tcontainer {\r\n\t max-width: 272px;\r\n}\r\n  \r\n  \r\n#dialog-container {\r\n  padding-top: 35px; \r\nheight: 96%;\r\n  min-height: 400px;\r\n  position: relative;\r\n  background-color: rgb(255, 255, 255);\r\n  width: 64%;\r\n  display: flex;\r\n  flex-direction: column;\r\n  border-radius: 3px;\r\n  box-shadow: rgba(0, 0, 0, 0.2) 0px 6px 16px 0px;\r\n}\r\n  \r\n@media only screen and (max-width: 768px) {\r\n  #dialog-container {\r\n  width: 100%;\r\n  }\r\n  .alchibox {\r\n  bottom: 260px;\r\n  position: fixed;\r\n  right: 0;\r\n\t border-radius: 4px 0px 0px 4px;\r\n  border-width: 1px 0px 1px 1px;\r\n\t transform: translateY(0);\r\n\t transform: translateX(0);\r\n  }\r\n\t\r\n#alchibox-hide {\r\n  top: 20px;\r\n  left: -25px;\r\n  rotate: -90deg;\r\n  right: unset;\r\n}\r\n.container {\r\n\tmax-width: 224px;\r\n}\r\n}\r\n/*Utils*/\r\n.snrs-hidden {\r\n  display: none !important;\r\n}\r\n/*Buttons*/\r\n.snrs-btn {\r\n  border-radius: 3px;\r\n  border: 1px solid #0b68ff;\r\n  cursor: pointer;\r\n  font-weight: 500;\r\n}\r\n.snrs-btn-on-white-background {\r\n  background-color: #0b68ff;\r\n  color: #fff;\r\n}\r\n.snrs-btn-on-white-background:hover {\r\n  background-color: #0044d9;\r\n  color: white;\r\n}\r\n.snrs-btn-small {\r\n  padding: 6px 16px;\r\n  font-size: 13px;\r\n}\r\n.snrs-corner-message {\r\n  position: fixed;\r\n  display: -webkit-box;\r\n  display: -ms-flexbox;\r\n  display: flex;\r\n  background-color: #fff;\r\n  width: 280px;\r\n  overflow: hidden;\r\n  -ms-flex-wrap: wrap;\r\n    flex-wrap: wrap;\r\n  -webkit-box-pack: center;\r\n    -ms-flex-pack: center;\r\n      justify-content: center;\r\n  bottom: 0;\r\n  right: 50%;\r\n  -webkit-transform: translateX(50%);\r\n    -ms-transform: translateX(50%);\r\n      transform: translateX(50%);\r\n}\r\n@media (min-width: 480px) {\r\n  .snrs-corner-message {\r\n  bottom: 48px;\r\n  right: 48px;\r\n  -webkit-transform: none;\r\n    -ms-transform: none;\r\n      transform: none;\r\n  }\r\n}\r\n.snrs-corner-message .snrs-btn {\r\n  margin-bottom: 30px;\r\n}\r\n.snrs-corner-message-header {\r\n  display: -webkit-box;\r\n  display: -ms-flexbox;\r\n  display: flex;\r\n}\r\n.snrs-corner-message-title {\r\n  padding: 28px;\r\n  font-size: 24px;\r\n  font-weight: 500;\r\n  line-height: 26px;\r\n  text-align: center;\r\n  color: #384350;\r\n}\r\n.snrs-icon-close {\r\n  position: absolute;\r\n  display: block;\r\n  top: 2px;\r\n  right: 8px;\r\n  cursor: pointer;\r\n  width: 8px;\r\n  height: 8px;\r\n}\r\n.snrs-corner-message-desc {\r\n  padding: 0 28px 28px;\r\n  text-align: center;\r\n  font-size: 13px;\r\n  color: #889199;\r\n}","html":"<html><head></head><body> <iframe id=\"ajfraj\"frameborder=\"0\"></iframe></body></html>","js":"(function(){\r\nvar alchicode=\"https://survey.alchemer.eu/s3/91158795/New-Survey\";\r\nvar gaid=\"\";\r\nvar skc=\"\";\r\nfor(let i = 0; i <dataLayer.length; i++) {\r\n  if(dataLayer[i].user!=null)\nskc=dataLayer[i].user.skc;\r\n}\r\nlet name = \"_ga=\";\r\nlet decodedCookie = decodeURIComponent(document.cookie);\r\nlet ca = decodedCookie.split(';');\r\nfor(let i = 0; i <ca.length; i++) {\nlet c = ca[i];\nwhile (c.charAt(0) == ' ') {\nc = c.substring(1);\n}\nif (c.indexOf(name) == 0) {\ngaid=c.substring(name.length, c.length);\n}\r\n  }\r\nvar page=window.location.pathname;\r\nvar ifr=document.getElementById(\"ajfraj\"); \r\n  ifr.src=alchicode+\"?page=\"+page+\"&gaid=\"+gaid+\"&skc=\"+skc;\r\n//obsluga X-a\r\ndocument.getElementById(\"alchemer-close-button\").addEventListener(\"click\", function() {\r\n   SR_NASA.event.trackCustomEvent(\n\"dynamicContent.click\", // event action name\n{ // additional parameters\n\"id\": '3df85552-4d3a-4a5f-8b99-a51ac8ca00fe'\n});\r\n  document.getElementById(\"alchibox\").style.display=\"none\";\r\n});\r\n})()"},"id":19797380,"name":"Wariant A","parsedData":{},"percentage":100,"selector":".mt-3.grid.w-full.grid-cols-1.justify-center.gap-3","selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"g2a.com/page/get-key","type":"CONTAIN"}]},{"capping":{},"containsJinjava":true,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ALWAYS"},"id":"bf76c493-9bb6-426f-9219-ec65d2f4b3c3","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":false,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"Memory anon view","targetRestriction":[],"trigger":{"options":{"delayType":"SECONDS"},"type":"ON_DEMAND"},"variants":[{"content":{},"id":18852441,"name":"Variant A","parsedData":{},"percentage":100,"selector":"test","selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"memory-game-test","type":"CONTAIN"}]},{"capping":{},"containsJinjava":true,"displayType":"LAYER","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"7","timesType":"DAYS"},"type":"MAXIMUM"},"id":"3468aecd-e1a9-471c-85c0-dd587233e711","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":true,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"[ALL][GLOBAL][AUT] G2A premium promo","targetRestriction":["DESKTOP"],"trigger":{"options":{"delayType":"SECONDS","delayValue":"30"},"type":"ON_LANDING"},"variants":[{"content":{},"id":19077641,"name":"Variant A","parsedData":{},"percentage":100,"selector":null,"selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"-i1000","type":"CONTAIN"},{"requirement":"/search?","type":"CONTAIN"},{"requirement":"/category/","type":"CONTAIN"}]},{"capping":{},"containsJinjava":true,"displayType":"LAYER","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ALWAYS"},"id":"79d1eb9c-645f-4223-909d-9d36ce896d34","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":false,"options":{"batchDelivery":false,"controlGroup":0,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"[snrdev] Popup z rekomendacjami 2024-07-05","targetRestriction":[],"trigger":{"options":{"delayType":"SECONDS"},"type":"ON_LANDING"},"variants":[{"content":{},"id":12600908,"name":"Variant A","parsedData":{},"percentage":100,"selector":null,"selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"snrdev-popup","type":"CONTAIN"}]},{"capping":{},"containsJinjava":true,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ONCE"},"id":"a137fc03-1441-4912-89de-e4d969cde969","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":true,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{"times":"1"},"type":"AFTER_SHOW"},"subject":"[DEGP][MATE][ONG] - 26.08.2026 - Software - Popup - SLS","targetRestriction":["DESKTOP"],"trigger":{"options":{"delayType":"SECONDS","delayValue":"10"},"type":"ON_LANDING"},"variants":[{"content":{},"id":20078542,"name":"Variant A","parsedData":{},"percentage":100,"selector":".snrs-modal-wrapper","selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[{"requirement":"id=","type":"CONTAIN"},{"requirement":"banner=","type":"CONTAIN"},{"requirement":"adid=","type":"CONTAIN"}],"viewsPageUrl":[{"requirement":"search?query","type":"CONTAIN"},{"requirement":"-i1000","type":"CONTAIN"}]},{"capping":{},"containsJinjava":true,"displayType":"LAYER","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"7","timesType":"DAYS"},"type":"MAXIMUM"},"id":"2b181395-2b22-433b-8331-fe6cf4b3df6a","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":true,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"[ALL][GLOBAL][AUT] G2A premium promo - NEW","targetRestriction":["DESKTOP"],"trigger":{"options":{"delayType":"SECONDS","delayValue":"30"},"type":"ON_LANDING"},"variants":[{"content":{},"id":19613080,"name":"Variant A","parsedData":{},"percentage":100,"selector":null,"selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"/search?","type":"CONTAIN"},{"requirement":"/category/","type":"CONTAIN"},{"requirement":"^https:\\/\\/www\\.g2a\\.com(\\/[a-z]{2})?\\/?$","type":"REGEXP"}]},{"capping":{},"containsJinjava":true,"displayType":"LAYER","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ONCE_PER_DAY"},"id":"239a3e46-d8e9-4837-8e4d-a030eedcdbe0","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":true,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"AFTER_ACTION"},"subject":"[DEGP][MATE][AUT] Recurring Buy - Subscription - Popup - RTN","targetRestriction":["DESKTOP"],"trigger":{"options":{"delayType":"SECONDS","delayValue":"30"},"type":"ON_LANDING"},"variants":[{"content":{},"id":18321480,"name":"Variant A","parsedData":{},"percentage":100,"selector":null,"selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[{"requirement":"adid=","type":"CONTAIN"},{"requirement":"id=","type":"CONTAIN"},{"requirement":"banner=","type":"CONTAIN"}],"viewsPageUrl":[{"requirement":"/category","type":"CONTAIN"},{"requirement":"search?query","type":"CONTAIN"},{"requirement":"-i1000","type":"CONTAIN"},{"requirement":"^https:\\/\\/www\\.g2a\\.com(\\/[a-z]{2})?\\/?$","type":"REGEXP"}]},{"capping":{},"containsJinjava":true,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ONCE"},"id":"8ce0af4d-8069-404e-a1d5-6e3db7460ab5","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":true,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{"times":"1"},"type":"AFTER_SHOW"},"subject":"[DEGP][MATE][ONG] - 26.08.2026 - Accounts - Popup - SLS","targetRestriction":["DESKTOP"],"trigger":{"options":{"delayType":"SECONDS","delayValue":"10"},"type":"ON_LANDING"},"variants":[{"content":{},"id":20079880,"name":"Variant A","parsedData":{},"percentage":100,"selector":".snrs-modal-wrapper","selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[{"requirement":"adid=","type":"CONTAIN"},{"requirement":"banner=","type":"CONTAIN"},{"requirement":"id=","type":"CONTAIN"}],"viewsPageUrl":[{"requirement":"search?query","type":"CONTAIN"},{"requirement":"-i1000","type":"CONTAIN"}]},{"capping":{},"containsJinjava":false,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"DAYS"},"type":"ONCE"},"id":"6a044bbf-87d2-4de7-87e5-66add869ccee","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":true,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"campaign":"","medium":"","parameters":{},"source":"","term":""}},"stopDisplay":{"options":{"times":"3"},"type":"AFTER_ACTION"},"subject":"[UXR] Metrics 9.Purchase/NPS RWD","targetRestriction":["MOBILE"],"trigger":{"options":{"delayType":"SECONDS","delayValue":"5"},"type":"ON_LANDING"},"variants":[{"content":{},"id":11353348,"name":"Variant A","parsedData":{},"percentage":50,"selector":"#root","selectorPrefix":"BEFORE"},{"content":{},"id":11353349,"name":"Variant B","parsedData":{},"percentage":50,"selector":"#root","selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"/get-key","type":"CONTAIN"}]},{"capping":{},"containsJinjava":true,"displayType":"LAYER","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ALWAYS"},"id":"fb24ecd6-66b6-40a6-ac34-fb766e87c799","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":false,"options":{"batchDelivery":false,"controlGroup":0,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"[snrdev] Popup z rekomendacjami - API","targetRestriction":["DESKTOP"],"trigger":{"options":{"delayType":"SECONDS"},"type":"ON_LANDING"},"variants":[{"content":{},"id":13003988,"name":"Variant A","parsedData":{},"percentage":100,"selector":null,"selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"api-popup","type":"CONTAIN"}]},{"capping":{},"containsJinjava":false,"displayType":"LAYER","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"2","times":"2","timesType":"DAYS"},"type":"MAXIMUM"},"id":"4338ffda-70c3-41fc-8179-57a1e8fc4405","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":true,"options":{"batchDelivery":false,"controlGroup":0,"utm":{"campaign":"","medium":"","parameters":{},"source":"","term":""}},"stopDisplay":{"options":{"times":"5"},"type":"AFTER_ACTION"},"subject":"[snr-dev] Web Push - Opt-in FORM - Desktop 2023-10-31","targetRestriction":["DESKTOP"],"trigger":{"options":{"delayType":"SECONDS","delayValue":"2"},"type":"ON_LANDING"},"variants":[{"content":{},"id":10087749,"name":"Variant A","parsedData":{},"percentage":100,"selector":null,"selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[{"requirement":"login","type":"CONTAIN"},{"requirement":"getkey","type":"CONTAIN"},{"requirement":"checkout","type":"CONTAIN"},{"requirement":"cart","type":"CONTAIN"},{"requirement":"redeem","type":"CONTAIN"},{"requirement":"?nktestwebpush","type":"CONTAIN"},{"requirement":"payment","type":"CONTAIN"},{"requirement":"/news/","type":"CONTAIN"},{"requirement":"/sellers/","type":"CONTAIN"},{"requirement":"supporthub","type":"CONTAIN"},{"requirement":"dashboard","type":"CONTAIN"},{"requirement":"loot","type":"CONTAIN"},{"requirement":"transaction-rating","type":"CONTAIN"},{"requirement":"reliability","type":"CONTAIN"},{"requirement":"get-key","type":"CONTAIN"}],"viewsPageUrl":[]},{"capping":{},"containsJinjava":true,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ALWAYS"},"id":"6d5c77c4-a42c-4dcf-8c77-2f13ac18fe38","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":true,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"[ALL][GLOBAL] FTB DC Sidebar Reminder v3.0","targetRestriction":["MOBILE","DESKTOP"],"trigger":{"options":{"delayType":"SECONDS","delayValue":"30"},"type":"ON_LANDING"},"variants":[{"content":{},"id":18957662,"name":"Variant A","parsedData":{},"percentage":100,"selector":" .snrs-modal-wrapper","selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[{"requirement":"adid=","type":"CONTAIN"},{"requirement":"id=","type":"CONTAIN"},{"requirement":"banner=","type":"CONTAIN"}],"viewsPageUrl":[{"requirement":"-i1000","type":"CONTAIN"},{"requirement":"search?query","type":"CONTAIN"},{"requirement":"/category","type":"CONTAIN"},{"requirement":"^https:\\/\\/www\\.g2a\\.com(\\/[a-z]{2})?\\/?$","type":"REGEXP"}]},{"capping":{},"containsJinjava":true,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ALWAYS"},"id":"79b8a21c-4add-4ab7-adf9-4a7f39458aca","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":false,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"[snrs-dev] Memory game tier 2","targetRestriction":[],"trigger":{"options":{"delayType":"SECONDS"},"type":"ON_DEMAND"},"variants":[{"content":{},"id":18744200,"name":"Variant A","parsedData":{},"percentage":100,"selector":"#promoCodeText","selectorPrefix":"INNER"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"special-promo","type":"CONTAIN"}]},{"capping":{},"containsJinjava":false,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"2","timesType":"DAYS"},"type":"MAXIMUM"},"id":"8862ff0c-e733-40b7-981b-97fc2ff113ab","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":true,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"campaign":"","medium":"","parameters":{},"source":"","term":""}},"stopDisplay":{"options":{"times":"4"},"type":"AFTER_ACTION"},"subject":"[snr-dev] Web Push - Optin FORM - Mobile 2023-10-31","targetRestriction":["MOBILE"],"trigger":{"options":{"delayType":"SECONDS","delayValue":"3","scrollingPercentage":"20"},"type":"ON_LANDING"},"variants":[{"content":{},"id":10089147,"name":"Variant A","parsedData":{},"percentage":100,"selector":".snrs-modal-wrapper","selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[{"requirement":"supporthub","type":"CONTAIN"},{"requirement":"transaction-rating","type":"CONTAIN"},{"requirement":"/sellers/","type":"CONTAIN"},{"requirement":"payment","type":"CONTAIN"},{"requirement":"/news/","type":"CONTAIN"},{"requirement":"cart","type":"CONTAIN"},{"requirement":"dashboard","type":"CONTAIN"},{"requirement":"getkey","type":"CONTAIN"},{"requirement":"get-key","type":"CONTAIN"},{"requirement":"?nktestwebpush","type":"CONTAIN"},{"requirement":"loot","type":"CONTAIN"},{"requirement":"reliability","type":"CONTAIN"},{"requirement":"login","type":"CONTAIN"},{"requirement":"checkout","type":"CONTAIN"},{"requirement":"redeem","type":"CONTAIN"},{"requirement":"?testWebpush","type":"CONTAIN"}],"viewsPageUrl":[]},{"capping":{},"containsJinjava":true,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ALWAYS"},"id":"89a16906-9e4c-4e8f-99e1-7cb9e801202e","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":false,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"Sidebar + PopUp z kodem rabatowym","targetRestriction":[],"trigger":{"options":{"delayType":"SECONDS","delayValue":"30"},"type":"ON_LANDING"},"variants":[{"content":{},"id":18310920,"name":"Variant A","parsedData":{},"percentage":100,"selector":".snrs-modal-wrapper","selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"?sidebar-popup","type":"CONTAIN"}]},{"capping":{},"containsJinjava":true,"displayType":"LAYER","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"7","timesType":"DAYS"},"type":"MAXIMUM"},"id":"53cd74bf-fc4e-4bcf-b2e1-76c4af0fbe09","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":true,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"[ALL][GLOBAL][AUT] G2A upgrade premium - Awarness","targetRestriction":["DESKTOP"],"trigger":{"options":{"delayType":"SECONDS","delayValue":"30"},"type":"ON_LANDING"},"variants":[{"content":{},"id":18227840,"name":"Variant A","parsedData":{},"percentage":100,"selector":null,"selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[{"requirement":"/pl/","type":"CONTAIN"}],"viewsPageUrl":[{"requirement":"-i1000","type":"CONTAIN"},{"requirement":"/search?","type":"CONTAIN"},{"requirement":"/category/","type":"CONTAIN"}]},{"capping":{},"containsJinjava":true,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ALWAYS"},"id":"211f6627-67ee-4743-99e8-724282e947a6","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":false,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"[snrs-dev] Memory game tier 4","targetRestriction":[],"trigger":{"options":{"delayType":"SECONDS"},"type":"ON_DEMAND"},"variants":[{"content":{},"id":18744280,"name":"Variant A","parsedData":{},"percentage":100,"selector":"#promoCodeText","selectorPrefix":"INNER"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"special-promo","type":"CONTAIN"}]},{"capping":{},"containsJinjava":false,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"DAYS"},"type":"ONCE"},"id":"1e17cea1-b938-47c6-a896-5d5664b891fc","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":true,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"campaign":"","medium":"","parameters":{},"source":"","term":""}},"stopDisplay":{"options":{"times":"3"},"type":"AFTER_ACTION"},"subject":"[UXR][n] Metrics 7.Purchase/NPS Desktop SZARY","targetRestriction":["DESKTOP"],"trigger":{"options":{"delayType":"SECONDS","delayValue":"5"},"type":"ON_LANDING"},"variants":[{"content":{},"id":13972100,"name":"Variant A","parsedData":{},"percentage":50,"selector":"#root","selectorPrefix":"BEFORE"},{"content":{},"id":13972101,"name":"Variant B","parsedData":{},"percentage":50,"selector":"#root","selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"/get-key","type":"CONTAIN"}]},{"capping":{},"containsJinjava":true,"displayType":"LAYER","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ALWAYS"},"id":"8ea92759-347e-4e39-9c14-4765145ce5da","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":false,"options":{"batchDelivery":false,"controlGroup":0,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"[snrdev] Sidebar z rekomendacjami 2024-07-05","targetRestriction":[],"trigger":{"options":{"delayType":"SECONDS"},"type":"ON_LANDING"},"variants":[{"content":{},"id":12617669,"name":"Variant A","parsedData":{},"percentage":100,"selector":null,"selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"snrdev-side","type":"CONTAIN"}]},{"capping":{},"containsJinjava":true,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ALWAYS"},"id":"d63cc04e-b78a-4185-9773-b79100c0760c","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":false,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"[snrs-dev] Memory game tier 3","targetRestriction":[],"trigger":{"options":{"delayType":"SECONDS"},"type":"ON_DEMAND"},"variants":[{"content":{},"id":18744260,"name":"Variant A","parsedData":{},"percentage":100,"selector":"#promoCodeText","selectorPrefix":"INNER"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"special-promo","type":"CONTAIN"}]},{"capping":{},"containsJinjava":true,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ALWAYS"},"id":"60565de8-9496-4352-bff6-b4cbd1c9e3e1","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":true,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"[GLOBAL] FTB DC - Order Summary -15% - NoConsent","targetRestriction":["MOBILE","DESKTOP"],"trigger":{"options":{"delayType":"SECONDS"},"type":"ON_LANDING"},"variants":[{"content":{},"id":18152040,"name":"Variant A","parsedData":{},"percentage":100,"selector":".synerise_dynamic","selectorPrefix":"AFTER"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"/page/cart/order-summary","type":"CONTAIN"}]},{"capping":{},"containsJinjava":true,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ALWAYS"},"id":"45adc2b9-42d7-4700-8da9-3612093f7d34","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":true,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"[GLOBAL] FTB DC - Order Summary -15% - WithConsent","targetRestriction":["DESKTOP","MOBILE"],"trigger":{"options":{"delayType":"SECONDS"},"type":"ON_LANDING"},"variants":[{"content":{},"id":18168941,"name":"Variant A","parsedData":{},"percentage":100,"selector":".synerise_dynamic","selectorPrefix":"AFTER"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"/page/cart/order-summary","type":"CONTAIN"}]},{"capping":{},"containsJinjava":true,"displayType":"LAYER","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ALWAYS"},"id":"1a22fdd2-9b32-4c27-aff5-89a046098128","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":false,"options":{"batchDelivery":false,"controlGroup":0,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"[snrdev] Sidebar z rekomendacjami - API","targetRestriction":["DESKTOP"],"trigger":{"options":{"delayType":"SECONDS"},"type":"ON_LANDING"},"variants":[{"content":{},"id":13004289,"name":"Variant A","parsedData":{},"percentage":100,"selector":null,"selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"api-sidebar","type":"CONTAIN"}]},{"capping":{},"containsJinjava":true,"displayType":"LAYER","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ALWAYS"},"id":"d7a1e662-741e-4ae8-ba84-c2d60a3272e5","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":false,"options":{"batchDelivery":false,"controlGroup":0,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"[snrdev] Porzucony koszyk popup","targetRestriction":[],"trigger":{"options":{"delayType":"SECONDS"},"type":"ON_LANDING"},"variants":[{"content":{},"id":13006128,"name":"Variant A","parsedData":{},"percentage":100,"selector":null,"selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"snrcart","type":"CONTAIN"}]},{"capping":{},"containsJinjava":false,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ALWAYS"},"id":"740e308a-c504-4c67-8dc1-87998095c0b7","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":false,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"shopping assistant - en","targetRestriction":[],"trigger":{"options":{"delayType":"SECONDS"},"type":"ON_LANDING"},"variants":[{"content":{"css":"","html":"<html><head></head><body><div id=\"ai-assistant-container\"></div></body></html>","js":"(function () {\n  \"use strict\";\n  // Configuration\n  function getToken() {\nreturn SR_NASA.auth.trackerKey();\n  }\n  function getUuid() {\nreturn SyneriseTC.uuid;\n  }\n  const config = {\ncontainerId: \"ai-assistant-container\",\napiEndpoint: `https://api.synerise.com/gen-ai/v2/ai-assistant/chat?code=${getToken()}&clientUUID=${getUuid()}`,\nauthToken: getToken(),\nbuttonImageSrc: \"https://upload.snrcdn.net/4abaf88f166f7e2fdc00c33822155eb2677ed6df/default/origin/c280a52a62644c428f57b000d1f327f8.png\",\npromptIconSrc: \"https://upload.snrcdn.net/4abaf88f166f7e2fdc00c33822155eb2677ed6df/default/origin/fd4112cd63cb48c1acfaec04f4884977.png\",\npromptText: \"What can I help you with? Just type your question…\",\nsuggestions: [\n'Gift ideas for a sports lover',\n'Gift ideas for a boyfriend who loves horror',\n'Gift ideas for children'\n],\nplaceholder: \"Write your question\",\nthreadId: null,\nmessageHistory: [],\nerrorMessages: {\n\"MESSAGE REMOVED DUE TO THE CONTENT POLICY INFRINGEMENT\":\n\"This message was removed due to a content policy violation.\",\nMESSAGE_REMOVED_DUE_TO_THE_CONTENT_POLICY_INFRINGEMENT:\n\"This message was removed due to a content policy violation.\",\n\"<MESSAGE REMOVED DUE TO THE CONTENT POLICY INFRINGEMENT>\":\n\"This message was removed due to a content policy violation.\",\n},\n  };\n  let root = null;\n  function $(id) {\nreturn root.getElementById(id);\n  }\n  function getStyles() {\nreturn `\n:host {\n  --input-Input-background: #FFFFFF;\n  --input-Input-font-color: #000000;\n  --input-Input-button-color: #5104bf;\n  --input-Input-button-color-hover: #51219E;\n  --input-Input-icon-color: #FFFFFF;\n  --topbar-icon-color: #757575;\n  --color-white: var(--input-Input-font-color);\n  --color-black: #000000;\n  --color-purple: var(--input-Input-button-color);\n  --color-purple-dark: var(--input-Input-button-color-hover);\n  position: relative;\n  width: 100%;\n  max-width: 100%;\n  font-size: 13px;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;\n  color: #000000;\n  line-height: 1.5;\n  -webkit-font-smoothing: antialiased;\n}\n/* Chatbot Button - Floating */\n.ai-assistant-button {\n  position: fixed;\n  width: 60px;\n  height: 60px;\n  border-radius: 50%;\n  cursor: pointer;\n  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n  object-fit: cover;\n  z-index: 10000;\n  transition: transform 0.2s ease, box-shadow 0.2s ease;\n  user-select: none;\n  -webkit-user-select: none;\n  bottom: 20px;\n  right: 20px;\n}\n.ai-assistant-button:hover {\n  transform: scale(1.05);\n  box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2);\n}\n.ai-assistant-button:active {\n  transform: scale(0.95);\n}\n.ai-assistant-button:focus {\n  outline: 2px solid var(--color-purple);\n  outline-offset: 2px;\n}\n/* Chat Window */\n.ai-assistant-chat {\n  position: fixed;\n  bottom: calc(20px + 70px);\n  right: 20px;\n  width: 640px;\n  max-width: calc(100vw - 40px);\n  height: calc(100vh - 200px - 20px);\n  background: white;\n  border-radius: 4px;\n  --tw-shadow: 0 10px 10px 0 var(--tw-shadow-color, var(--token-color-shadow-sm));\nbox-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n  display: none;\n  flex-direction: column;\n  z-index: 10001;\n  overflow: hidden;\n}\n.ai-assistant-chat.open {\n  display: flex;\n  outline: 1px solid #9AA1B1;\n}\n/* Chat Header */\n.ai-assistant-header {\n  background: #FFFFFF;\n  color: #000000;\n  padding: 16px 20px;\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  border-bottom: 1px solid #9AA1B1;\n}\n.ai-assistant-header h3 {\n  margin: 0;\n  font-size: 18px;\n  font-weight: 600;\n  color: #000000;\n}\n.ai-assistant-header-actions {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n}\n.ai-assistant-reset {\n  background: transparent;\n  border: none;\n  color: #000;\n  width: 24px;\n  height: 24px;\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  transition: opacity 0.2s ease;\n  padding: 0;\n}\n.ai-assistant-reset:hover {\n  opacity: 0.6;\n}\n.ai-assistant-reset svg {\n  width: 18px;\n  height: 18px;\n  fill: var(--topbar-icon-color);\n}\n.ai-assistant-close {\n  background: transparent;\n  border: none;\n  color: #000;\n  width: 24px;\n  height: 24px;\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  transition: opacity 0.2s ease;\n  padding: 0;\n}\n.ai-assistant-close:hover {\n  opacity: 0.6;\n}\n.ai-assistant-close svg {\n  width: 20px;\n  height: 20px;\n  fill: var(--topbar-icon-color);\n}\n/* Messages Container */\n.ai-assistant-messages {\n  flex: 1;\n  overflow-y: auto;\n  padding: 20px;\n  background: #f9fafb;\n  display: flex;\n  flex-direction: column;\n  gap: 16px;\n}\n/* Prompt Section */\n.ai-assistant-prompt {\n  display: flex;\n  align-items: flex-start;\n  gap: 12px;\n  margin-bottom: 16px;\n}\n.ai-assistant-prompt-icon {\n  width: 20px;\n  height: 20px;\n  flex-shrink: 0;\n  margin-top: 2px;\n  object-fit: contain;\n}\n.ai-assistant-prompt-text {\n  color: #000000;\n  font-size: 14px;\n  line-height: 1.5;\n  margin: 0;\n}\n/* Suggestion Buttons */\n.ai-assistant-suggestions {\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n  margin-bottom: 16px;\n}\n.ai-assistant-suggestion-btn {\n  background: var(--color-purple);\n  color: #ffffff;\n  border: none;\n  padding: 12px 16px;\n  border-radius: 8px;\n  font-size: 14px;\n  text-align: left;\n  cursor: pointer;\n  transition: background 0.2s ease, transform 0.1s ease;\n  font-family: inherit;\n}\n.ai-assistant-suggestion-btn:hover {\n  background: var(--color-purple-dark);\n  transform: translateY(-1px);\n}\n.ai-assistant-suggestion-btn:active {\n  transform: translateY(0);\n}\n/* Selected Suggestion Bar */\n.ai-assistant-selected {\n  background: #000000;\n  color: #FFFFFF;\n  padding: 12px 16px;\n  border-radius: 4px;\n  font-size: 14px;\n  margin-bottom: 16px;\n  animation: ai-assistant-fadeIn 0.3s ease;\n  width: auto;\n  margin-left: auto;\n}\n/* AI Message */\n.ai-assistant-ai-message {\n  display: flex;\n  align-items: flex-start;\n  gap: 12px;\n  margin-bottom: 16px;\n  animation: ai-assistant-fadeIn 0.3s ease;\n}\n.ai-assistant-ai-message-text {\n  color: #000000;\n  font-size: 14px;\n  line-height: 1.5;\n  margin: 0;\n  display: inline;\n  width: -webkit-fill-available;\n}\n.ai-assistant-typing-text {\n  display: inline;\n}\n.ai-assistant-typing-cursor {\n  display: inline-block;\n  color: #000000;\n  font-weight: 300;\n  animation: ai-assistant-blinkCursor 1s infinite;\n  margin-left: 2px;\n}\n@keyframes ai-assistant-blinkCursor {\n  0%, 50% { opacity: 1; }\n  51%, 100% { opacity: 0; }\n}\n/* Results Section */\n.ai-assistant-results {\n  margin-top: 16px;\n}\n.ai-assistant-results-header {\n  display: flex;\n  align-items: flex-start;\n  gap: 12px;\n  margin-bottom: 16px;\n}\n.ai-assistant-results-title {\n  color: #000;\n  font-size: 14px;\n  font-weight: 600;\n  margin: 0;\n  line-height: 1.5;\n}\n/* Products Grid */\n.ai-assistant-products {\n  display: grid;\n  grid-template-columns: repeat(3, 1fr);\n  // grid-template-rows: repeat(2, 1fr);\n  gap: 12px;\n  margin-bottom: 16px;\n}\n.ai-assistant-product {\n  width: 100%;\n  animation: ai-assistant-fadeIn 0.3s ease;\n}\n.ai-assistant-product-cover {\n  width: 100%;\n  aspect-ratio: 1;\n  background: #f0f0f0;\n  border-radius: 4px;\n  margin-bottom: 8px;\n  object-fit: contain;\n}\n.ai-assistant-product-title {\n  font-size: 14px;\n  font-weight: 600;\n  color: #000;\n  margin: 0 0 4px 0;\n  line-height: 1.3;\n  display: -webkit-box;\n  -webkit-line-clamp: 2;\n  -webkit-box-orient: vertical;\n  overflow: hidden;\n}\n.ai-assistant-product-author {\n  font-size: 12px;\n  color: #666;\n  margin: 0 0 4px 0;\n}\n.ai-assistant-product-price {\n  font-size: 14px;\n  font-weight: 600;\n  color: #000;\n  margin: 0;\n}\n.ai-assistant-product-prices {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: baseline;\n  gap: 6px;\n  margin: 0;\n}\n.ai-assistant-price-current {\n  font-size: 14px;\n  font-weight: 600;\n  color: #000;\n}\n.ai-assistant-price-sale {\n  font-size: 14px;\n  font-weight: 700;\n  color: #d32f2f;\n}\n.ai-assistant-price-old {\n  font-size: 12px;\n  font-weight: 400;\n  color: #999;\n  text-decoration: line-through;\n}\n.ai-assistant-price-omnibus {\n  width: 100%;\n  font-size: 10px;\n  color: #999;\n  margin-top: 2px;\n}\n/* Input Area */\n.ai-assistant-input-area {\n  padding: 16px 16px;\n  background: var(--input-Input-background);\n  border-top: 1px solid #9AA1B1;\n  display: flex;\n  align-items: center;\n  gap: 8px;\n}\n.ai-assistant-input {\n  flex: 1;\n  padding: 7px 12px;\n  height: auto;\n  // border: 1px solid #e0e0e0;\n  border: none;\n  border-radius: 4px;\n  font-size: 14px;\n  outline: none;\n  transition: border-color 0.2s ease;\n  font-family: inherit;\n  background: var(--input-Input-background);\n  color: var(--input-Input-font-color);\n}\n.ai-assistant-input::placeholder {\n  color: var(--input-Input-font-color);\n  opacity: 0.6;\n}\n.ai-assistant-input:focus {\n  border-color: var(--input-Input-button-color);\n}\n.ai-assistant-send {\n  width: 32px;\n  height: 32px;\n  border-radius: 4px;\n  background: var(--input-Input-button-color);\n  border: none;\n  color: var(--input-Input-icon-color);\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  transition: transform 0.2s ease, background 0.2s ease;\n}\n.ai-assistant-send:hover {\n  background: var(--input-Input-button-color-hover);\n  transform: scale(1.05);\n}\n.ai-assistant-send:active {\n  transform: scale(0.95);\n}\n.ai-assistant-send:disabled {\n  opacity: 0.5;\n  cursor: not-allowed;\n}\n.ai-assistant-send svg {\n  width: 16px;\n  height: 13px;\n}\n.ai-assistant-send path {\n  fill: var(--input-Input-icon-color);\n}\n/* Microphone Button */\n.ai-assistant-microphone {\n  width: 32px;\n  height: 32px;\n  border-radius: 4px;\n  background: transparent;\n  border: 1px solid #e0e0e0;\n  color: #666;\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  transition: all 0.2s ease;\n  padding: 0;\n}\n// .ai-assistant-microphone:hover {\n//   background: #f5f5f5;\n//   border-color: var(--input-Input-button-color);\n//   color: var(--input-Input-button-color);\n// }\n.ai-assistant-microphone:active {\n  transform: scale(0.95);\n}\n.ai-assistant-microphone.recording {\n  background: #ff4444;\n  border-color: #ff4444;\n  color: white;\n  animation: ai-assistant-pulseRecording 1.5s infinite;\n}\n.ai-assistant-microphone svg {\n  width: 16px;\n  height: 16px;\n}\n@keyframes ai-assistant-pulseRecording {\n  0%, 100% {\nopacity: 1;\nbox-shadow: 0 0 0 0 rgba(255, 68, 68, 0.7);\n  }\n  50% {\nopacity: 0.8;\nbox-shadow: 0 0 0 8px rgba(255, 68, 68, 0);\n  }\n}\n/* Typing Indicator */\n.ai-assistant-typing {\n  display: flex;\n  gap: 4px;\n  padding: 12px 16px;\n  align-self: flex-start;\n}\n.ai-assistant-typing span {\n  width: 8px;\n  height: 8px;\n  border-radius: 50%;\n  background: #999;\n  animation: ai-assistant-typing 1.4s infinite;\n}\n.ai-assistant-typing span:nth-child(2) {\n  animation-delay: 0.2s;\n}\n.ai-assistant-typing span:nth-child(3) {\n  animation-delay: 0.4s;\n}\n@keyframes ai-assistant-fadeIn {\n  from { opacity: 0; transform: translateY(10px); }\n  to { opacity: 1; transform: translateY(0); }\n}\n@keyframes ai-assistant-typing {\n  0%, 60%, 100% { transform: translateY(0); opacity: 0.7; }\n  30% { transform: translateY(-10px); opacity: 1; }\n}\n/* Error Message */\n.ai-assistant-error {\n  padding: 16px;\n  text-align: center;\n  animation: ai-assistant-fadeIn 0.3s ease;\n}\n.ai-assistant-error-text {\n  color: #666;\n  font-size: 14px;\n  margin: 0;\n}\n/* Mobile Responsive */\n@media (max-width: 480px) {\n  .ai-assistant-chat {\nwidth: calc(100vw - 20px);\nright: 10px;\nbottom: 80px;\nmax-height: calc(100vh - 250px);\nborder-radius: 12px;\n  }\n  .ai-assistant-chat input {\nfont-size: 16px;\n  }\n  .ai-assistant-button {\nbottom: 15px;\nright: 15px;\nwidth: 56px;\nheight: 56px;\n  }\n  .ai-assistant-products {\ngrid-template-columns: repeat(2, 1fr);\ngrid-template-rows: repeat(3, 1fr);\ngap: 8px;\n  }\n  .ai-assistant-product {\nwidth: 100%;\n  }\n}\n`;\n  }\n  const STORAGE_KEY = \"ai-124-thread-id\";\n  function saveThreadId(threadId) {\nif (threadId) {\ntry {\nlocalStorage.setItem(STORAGE_KEY, threadId);\n} catch (e) {\nconsole.warn(\"Failed to save threadId to localStorage:\", e);\n}\n}\n  }\n  function loadThreadId() {\ntry {\nreturn localStorage.getItem(STORAGE_KEY);\n} catch (e) {\nconsole.warn(\"Failed to load threadId from localStorage:\", e);\nreturn null;\n}\n  }\n  function clearThreadId() {\ntry {\nlocalStorage.removeItem(STORAGE_KEY);\n} catch (e) {\nconsole.warn(\"Failed to clear threadId from localStorage:\", e);\n}\n  }\n  function createPromptIcon() {\nreturn `<img src=\"${config.promptIconSrc}\" alt=\"\" class=\"ai-assistant-prompt-icon\">`;\n  }\n  function createChatbotHTML() {\nconst suggestionsHTML = config.suggestions\n.map(\n(suggestion, index) =>\n`<button class=\"ai-assistant-suggestion-btn\" data-suggestion=\"${index}\">${suggestion}</button>`,\n)\n.join(\"\");\nreturn `\n<img class=\"ai-assistant-button\" id=\"ai-assistant-toggle\" src=\"${config.buttonImageSrc}\" alt=\"Open chat\" aria-label=\"Open chat\" role=\"button\" tabindex=\"0\">\n<div class=\"ai-assistant-chat\" id=\"ai-assistant-chat\">\n<div class=\"ai-assistant-header\">\n<h3>AI assistant</h3>\n<div class=\"ai-assistant-header-actions\">\n<button class=\"ai-assistant-reset\" id=\"ai-assistant-reset\" aria-label=\"Start new conversation\" title=\"Start over\">\n<svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\">\n<path d=\"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\"/>\n</svg>\n</button>\n<button class=\"ai-assistant-close\" id=\"ai-assistant-close\" aria-label=\"Close chat\">\n<svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\">\n<path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"/>\n</svg>\n</button>\n</div>\n</div>\n<div class=\"ai-assistant-messages\" id=\"ai-assistant-messages\"></div>\n<div class=\"ai-assistant-input-area\" id=\"ai-assistant-input-area\">\n<input\ntype=\"text\"\nclass=\"ai-assistant-input\"\nid=\"ai-assistant-input\"\nplaceholder=\"${config.placeholder}\"\naria-label=\"Type your message\"\n/>\n<button class=\"ai-assistant-microphone\" id=\"ai-assistant-microphone\" aria-label=\"Start voice input\" title=\"Voice input\">\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n<path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z\"></path>\n<path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"></path>\n<line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"></line>\n<line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\"></line>\n</svg>\n</button>\n<button class=\"ai-assistant-send\" id=\"ai-assistant-send\" aria-label=\"Send message\">\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"13\" viewBox=\"0 0 16 13\" fill=\"none\">\n<path d=\"M15.7803 5.52288L10.4776 0.219647C10.1847 -0.0732157 9.70986 -0.0732157 9.417 0.219647C9.12414 0.51251 9.12414 0.987334 9.417 1.2802L13.4395 5.3032H0.75C0.482051 5.3032 0.234456 5.44615 0.100481 5.6782C-0.0334936 5.91025 -0.0334936 6.19615 0.100481 6.4282C0.234456 6.66025 0.482051 6.8032 0.75 6.8032H13.4395L9.417 10.8261C9.22693 11.0155 9.15247 11.2919 9.22174 11.5511C9.291 11.8103 9.49343 12.0127 9.75261 12.082C10.0118 12.1512 10.2882 12.0768 10.4775 11.8867L15.7803 6.58347C15.921 6.44286 16 6.25209 16 6.05317C16 5.85426 15.921 5.66349 15.7803 5.52288Z\" fill=\"white\"/>\n</svg>\n</button>\n</div>\n</div>\n`;\n  }\n  function resetConversation() {\nclearThreadId();\nconfig.threadId = null;\nconfig.messageHistory = [];\nconst messagesContainer = $(\"ai-assistant-messages\");\nif (messagesContainer) {\nmessagesContainer.innerHTML = \"\";\n}\naddPromptSection();\n  }\n  function addPromptSection() {\nconst messagesContainer = $(\"ai-assistant-messages\");\nconst promptDiv = document.createElement(\"div\");\npromptDiv.className = \"ai-assistant-prompt\";\npromptDiv.innerHTML = `\n${createPromptIcon()}\n<p class=\"ai-assistant-prompt-text\">${config.promptText}</p>\n`;\nmessagesContainer.appendChild(promptDiv);\nconst suggestionsDiv = document.createElement(\"div\");\nsuggestionsDiv.className = \"ai-assistant-suggestions\";\nsuggestionsDiv.id = \"ai-assistant-suggestions\";\nconfig.suggestions.forEach((suggestion, index) => {\nconst btn = document.createElement(\"button\");\nbtn.className = \"ai-assistant-suggestion-btn\";\nbtn.textContent = suggestion;\nbtn.dataset.suggestion = index;\nbtn.addEventListener(\"click\", () => handleSuggestionClick(suggestion));\nsuggestionsDiv.appendChild(btn);\n});\nmessagesContainer.appendChild(suggestionsDiv);\nmessagesContainer.scrollTop = messagesContainer.scrollHeight;\n  }\n  function getErrorMessage(originalMessage) {\nif (!originalMessage) return null;\n// Check if message matches any error pattern\nfor (const [errorPattern, errorMessage] of Object.entries(\nconfig.errorMessages,\n)) {\nif (\noriginalMessage.includes(errorPattern) ||\noriginalMessage === errorPattern\n) {\nreturn errorMessage;\n}\n}\nreturn null;\n  }\n  // V2 helpers: extract text from AI message elements\n  function extractTextFromElements(elements) {\nif (!Array.isArray(elements)) return \"\";\nreturn elements\n.filter((el) => el.type === \"BUBBLE_TEXT\" || el.type === \"TEXT\")\n.map((el) => el.content)\n.join(\"\\n\");\n  }\n  // V2 helpers: extract carousel items from AI message elements\n  function extractCarouselItems(elements) {\nif (!Array.isArray(elements)) return [];\nconst items = [];\nelements.forEach((el) => {\nif (el.type === \"CAROUSEL\" && Array.isArray(el.content)) {\nel.content.forEach((item) => items.push(normalizeCarouselItem(item)));\n}\n});\nreturn items;\n  }\n  // V2 helpers: normalize CarouselItem to format compatible with createProductElement\n  function normalizeCarouselItem(item) {\nreturn {\ntitle: item.title || \"\",\nimageLink: item.img || \"\",\nlink: item.action?.url || item.url || \"\",\ncategory: item.attributes?.category || \"\",\nprice: null,\nmeta: item.meta || [],\nattributes: item.attributes || {},\n};\n  }\n  function addSelectedSuggestion(text) {\nconst messagesContainer = $(\"ai-assistant-messages\");\nconst selectedDiv = document.createElement(\"div\");\nselectedDiv.className = \"ai-assistant-selected\";\n// Check if message is an error\nconst errorMessage = getErrorMessage(text);\nselectedDiv.textContent = errorMessage || text;\nmessagesContainer.appendChild(selectedDiv);\nmessagesContainer.scrollTop = messagesContainer.scrollHeight;\n  }\n  function addAIMessage(content, skipAnimation = false) {\nconst messagesContainer = $(\"ai-assistant-messages\");\nconst aiMessageDiv = document.createElement(\"div\");\naiMessageDiv.className = \"ai-assistant-ai-message\";\nif (skipAnimation) {\n// Display immediately without animation (for restored messages)\naiMessageDiv.innerHTML = `\n${createPromptIcon()}\n<p class=\"ai-assistant-ai-message-text\">${content}</p>\n`;\nmessagesContainer.appendChild(aiMessageDiv);\nmessagesContainer.scrollTop = messagesContainer.scrollHeight;\n} else {\n// Display with typing animation\naiMessageDiv.innerHTML = `\n${createPromptIcon()}\n<p class=\"ai-assistant-ai-message-text\">\n<span class=\"ai-assistant-typing-text\"></span>\n<span class=\"ai-assistant-typing-cursor\">|</span>\n</p>\n`;\nmessagesContainer.appendChild(aiMessageDiv);\nmessagesContainer.scrollTop = messagesContainer.scrollHeight;\n// Animate typing effect\nconst textElement = aiMessageDiv.querySelector(\n\".ai-assistant-typing-text\",\n);\nconst cursorElement = aiMessageDiv.querySelector(\n\".ai-assistant-typing-cursor\",\n);\nlet currentIndex = 0;\nconst typingSpeed = 20; // milliseconds per character\nfunction typeCharacter() {\nif (currentIndex < content.length) {\ntextElement.textContent += content[currentIndex];\ncurrentIndex++;\nmessagesContainer.scrollTop = messagesContainer.scrollHeight;\nsetTimeout(typeCharacter, typingSpeed);\n} else {\n// Remove cursor when typing is complete\ncursorElement.style.display = \"none\";\n}\n}\n// Start typing animation\ntypeCharacter();\n}\n  }\n  function showErrorMessage() {\nconst messagesContainer = $(\"ai-assistant-messages\");\nconst errorDiv = document.createElement(\"div\");\nerrorDiv.className = \"ai-assistant-error\";\nerrorDiv.innerHTML = `\n<p class=\"ai-assistant-error-text\">Oops, something went wrong</p>\n`;\nmessagesContainer.appendChild(errorDiv);\nmessagesContainer.scrollTop = messagesContainer.scrollHeight;\nsetTimeout(() => {\nerrorDiv.style.transition = \"opacity 0.5s ease\";\nerrorDiv.style.opacity = \"0\";\nsetTimeout(() => errorDiv.remove(), 500);\n}, 2000);\n  }\n  // Format product price\n  function formatPrice(price) {\nif (price === null || price === undefined) return \"\";\nif (typeof price === \"number\") {\nreturn `${price.toFixed(2)} EUR`;\n}\nreturn String(price).replace(/\\bPLN\\b/g, \"EUR\").replace(/zł/gi, \"EUR\");\n  }\n  // Build price HTML from product attributes\n  function buildPriceHTML(product) {\nconst attrs = product.attributes || {};\nconst regular = parseFloat(attrs[\"price.value\"]) || product.price;\nconst sale = parseFloat(attrs[\"salePrice.value\"]) || null;\nconst omnibus = attrs[\"attributes.history_price\"];\n// Parse omnibus - comes as \"39.99 PLN\" or \"0.00 PLN\"\nlet omnibusValue = null;\nif (omnibus) {\nconst parsed = parseFloat(omnibus);\nif (parsed > 0) omnibusValue = parsed;\n}\nconst hasSale = sale && regular && sale < regular;\n// V2 fallback: if no price from attributes, render meta entries (HTML strings)\nif (!regular && !sale && product.meta && product.meta.length > 0) {\nlet html = '<div class=\"ai-assistant-product-prices\">';\nproduct.meta.forEach((entry) => {\nhtml += `<span class=\"ai-assistant-price-current\">${entry}</span>`;\n});\nhtml += \"</div>\";\nreturn html;\n}\nlet html = '<div class=\"ai-assistant-product-prices\">';\nif (hasSale) {\nhtml += `<span class=\"ai-assistant-price-old\">${formatPrice(regular)}</span>`;\nhtml += `<span class=\"ai-assistant-price-sale\">${formatPrice(sale)}</span>`;\n} else if (regular) {\nhtml += `<span class=\"ai-assistant-price-current\">${formatPrice(regular)}</span>`;\n}\nif (omnibusValue) {\nhtml += `<span class=\"ai-assistant-price-omnibus\">Lowest price in the last 30 days: ${formatPrice(omnibusValue)}</span>`;\n}\nhtml += \"</div>\";\nreturn html;\n  }\n  // Create product HTML element\n  function createProductElement(product) {\nconst defaultImage =\n\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgwIiBoZWlnaHQ9IjI3MCIgdmlld0JveD0iMCAwIDE4MCAyNzAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxODAiIGhlaWdodD0iMjcwIiBmaWxsPSIjRjBGMEYwIi8+Cjx0ZXh0IHg9IjkwIiB5PSIxMzUiIGZvbnQtZmFtaWx5PSJBcmlhbCIgZm9udC1zaXplPSIxNCIgZmlsbD0iIzk5OTk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+Qm9vayBDb3ZlcjwvdGV4dD4KPC9zdmc+\";\nconst productLink = product.link || product.url || \"#\";\nconst productDiv = document.createElement(\"div\");\nproductDiv.className = \"ai-assistant-product\";\nproductDiv.innerHTML = `\n<a href=\"${productLink}\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"text-decoration: none; color: inherit;\">\n<img src=\"${product.imageLink || product.cover || defaultImage}\"\nalt=\"${product.title || \"\"}\"\nclass=\"ai-assistant-product-cover\"\nonerror=\"this.src='${defaultImage}'\">\n<h5 class=\"ai-assistant-product-title\">${product.title || \"\"}</h5>\n<p class=\"ai-assistant-product-author\">${product.category || product.author || \"\"}</p>\n${buildPriceHTML(product)}\n</a>\n`;\nreturn productDiv;\n  }\n  // Add results section with products\n  function addResultsSection(title, products) {\nconst messagesContainer = $(\"ai-assistant-messages\");\nif (!messagesContainer) return;\nconst resultsDiv = document.createElement(\"div\");\nresultsDiv.className = \"ai-assistant-results\";\nconst headerDiv = document.createElement(\"div\");\nheaderDiv.className = \"ai-assistant-results-header\";\nheaderDiv.innerHTML = `\n${createPromptIcon()}\n<h4 class=\"ai-assistant-results-title\">${title}</h4>\n`;\nresultsDiv.appendChild(headerDiv);\nif (!products || products.length === 0) {\nshowErrorMessage();\nreturn;\n}\nconst limitedProducts = products.slice(0, 6);\nconst productsDiv = document.createElement(\"div\");\nproductsDiv.className = \"ai-assistant-products\";\nlimitedProducts.forEach((product) => {\nproductsDiv.appendChild(createProductElement(product));\n});\nresultsDiv.appendChild(productsDiv);\nmessagesContainer.appendChild(resultsDiv);\n// Scroll to the last selected message (user message) before results\nsetTimeout(() => {\nconst selectedMessages = messagesContainer.querySelectorAll(\n\".ai-assistant-selected\",\n);\nif (selectedMessages.length > 0) {\nconst lastSelected = selectedMessages[selectedMessages.length - 1];\nlastSelected.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n} else {\nresultsDiv.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n}\n}, 100);\n  }\n  function showTypingIndicator() {\nconst messagesContainer = $(\"ai-assistant-messages\");\nconst typingDiv = document.createElement(\"div\");\ntypingDiv.className = \"ai-assistant-typing\";\ntypingDiv.id = \"ai-assistant-typing\";\ntypingDiv.innerHTML = \"<span></span><span></span><span></span>\";\nmessagesContainer.appendChild(typingDiv);\nmessagesContainer.scrollTop = messagesContainer.scrollHeight;\n  }\n  function hideTypingIndicator() {\nconst typingDiv = $(\"ai-assistant-typing\");\nif (typingDiv) {\ntypingDiv.remove();\n}\n  }\n  function displayErrorMessage(errorMessage) {\nconst errorDiv = document.createElement(\"div\");\nerrorDiv.className = \"ai-assistant-error\";\nerrorDiv.innerHTML = `\n<p class=\"ai-assistant-error-text\">${errorMessage}</p>\n`;\nconst messagesContainer = $(\"ai-assistant-messages\");\nmessagesContainer.appendChild(errorDiv);\nmessagesContainer.scrollTop = messagesContainer.scrollHeight;\n  }\n  function processAPIResponse(response) {\nconst messages =\nresponse.data && Array.isArray(response.data.messages)\n? response.data.messages\n: [];\nif (!messages.length) {\nshowErrorMessage();\nreturn;\n}\n// Check if last message is a human error (v2: content is BubbleTextMessageElement)\nconst lastMessage = messages[messages.length - 1];\nif (lastMessage.type === \"HUMAN\") {\nconst humanText = lastMessage.content?.content || \"\";\nconst errorMsg = getErrorMessage(humanText);\nif (errorMsg) {\ndisplayErrorMessage(errorMsg);\nreturn;\n}\n}\n// Find the last AI message\nconst aiMessages = messages.filter((m) => m.type === \"AI\");\nconst lastAIMessage =\naiMessages.length > 0 ? aiMessages[aiMessages.length - 1] : null;\nif (!lastAIMessage) {\nreturn;\n}\nconst elements = lastAIMessage.content || [];\n// Extract text content from message elements\nconst textContent = extractTextFromElements(elements);\n// Check for error in AI text\nconst errorMessage = getErrorMessage(textContent);\nif (errorMessage) {\ndisplayErrorMessage(errorMessage);\nreturn;\n}\n// Extract carousel items from AI message elements\nlet carouselItems = extractCarouselItems(elements);\n// Fallback: use context.items only if no carousel in message elements\nif (\ncarouselItems.length === 0 &&\nresponse.data?.context?.items &&\nArray.isArray(response.data.context.items)\n) {\ncarouselItems = response.data.context.items.map(normalizeCarouselItem);\n}\n// Update message history\nmessages.forEach((msg) => {\nlet content;\nif (msg.type === \"HUMAN\") {\ncontent = msg.content?.content || \"\";\n} else if (msg.type === \"AI\") {\ncontent = extractTextFromElements(msg.content);\n}\nif (content && !getErrorMessage(content)) {\nconst exists = config.messageHistory.some(\n(m) => m.type === msg.type && m.content === content,\n);\nif (!exists) {\nconfig.messageHistory.push({ type: msg.type, content });\n}\n}\n});\n// Display error messages from human messages\nmessages.forEach((msg) => {\nif (msg.type === \"HUMAN\") {\nconst humanText = msg.content?.content || \"\";\nconst errMsg = getErrorMessage(humanText);\nif (errMsg) {\ndisplayErrorMessage(errMsg);\n}\n}\n});\n// Display results\nif (carouselItems.length > 0) {\nconst resultsTitle =\ntextContent || \"Here are great gift ideas for you\";\naddResultsSection(resultsTitle, carouselItems);\n} else if (textContent) {\nconst aiMessageExists = Array.from(\nroot.querySelectorAll(\".ai-assistant-ai-message-text\"),\n).some((el) => el.textContent === textContent);\nif (!aiMessageExists) {\naddAIMessage(textContent);\n}\n} else {\nshowErrorMessage();\n}\n  }\n  // Handle suggestion click\n  async function handleSuggestionClick(suggestion) {\nconst suggestionsDiv = $(\"ai-assistant-suggestions\");\nif (suggestionsDiv) {\nsuggestionsDiv.style.display = \"none\";\n}\naddSelectedSuggestion(suggestion);\n// Pause microphone during request\npauseMicrophoneForRequest();\nshowTypingIndicator();\ntry {\nconst response = await sendChatRequest(suggestion);\nif (response.meta?.threadId) {\nconfig.threadId = response.meta.threadId;\nsaveThreadId(response.meta.threadId);\n}\nhideTypingIndicator();\nprocessAPIResponse(response);\n} catch (error) {\nhideTypingIndicator();\nconsole.error(\"Error handling suggestion:\", error);\nshowErrorMessage();\n} finally {\n// Resume microphone after request if it was recording before\nresumeMicrophoneAfterRequest();\n}\n  }\n  async function fetchConversationHistory(threadId) {\nif (!threadId) return null;\nconst conversationEndpoint = `https://api.synerise.com/gen-ai/v2/ai-assistant/chat/${threadId}/messages?code=${getToken()}&clientUUID=${getUuid()}`;\nconst headers = {\n\"Content-Type\": \"application/json\",\n};\ntry {\nconst response = await fetch(conversationEndpoint, {\nmethod: \"GET\",\nheaders: headers,\n});\nif (!response.ok) {\nconsole.warn(\"Failed to fetch conversation history:\", response.status);\nreturn { error: true, status: response.status };\n}\nreturn await response.json();\n} catch (error) {\nconsole.error(\"Error fetching conversation history:\", error);\nreturn { error: true };\n}\n  }\n  async function restoreConversationHistory() {\nconst savedThreadId = loadThreadId();\nif (!savedThreadId) {\nreturn;\n}\nconfig.threadId = savedThreadId;\nconst historyData = await fetchConversationHistory(savedThreadId);\n// If there was an error fetching history, clear threadId\nif (historyData && historyData.error) {\nclearThreadId();\nconfig.threadId = null;\nreturn;\n}\nif (!historyData?.data?.messages) {\nreturn;\n}\nconst messagesContainer = $(\"ai-assistant-messages\");\nif (!messagesContainer) {\nreturn;\n}\n// Clear existing prompt and suggestions\nconst promptDiv = messagesContainer.querySelector(\".ai-assistant-prompt\");\nconst suggestionsDiv = messagesContainer.querySelector(\n\".ai-assistant-suggestions\",\n);\nif (promptDiv) promptDiv.remove();\nif (suggestionsDiv) suggestionsDiv.remove();\n// Process v2 messages (type: \"HUMAN\"/\"AI\", structured content)\nconst messagesToDisplay = [];\nhistoryData.data.messages.forEach((msg, index) => {\nif (msg.type === \"HUMAN\") {\nconst humanText = msg.content?.content || \"\";\nif (getErrorMessage(humanText)) return;\nconfig.messageHistory.push({ type: msg.type, content: humanText });\nmessagesToDisplay.push({ type: \"human\", content: humanText, index });\n} else if (msg.type === \"AI\") {\nconst elements = msg.content || [];\nconst textContent = extractTextFromElements(elements);\nif (getErrorMessage(textContent)) return;\nconfig.messageHistory.push({ type: msg.type, content: textContent });\n// Extract carousel items from AI message elements\nconst carouselItems = extractCarouselItems(elements);\nif (carouselItems.length > 0) {\nmessagesToDisplay.push({\ntype: \"products\",\ntitle: textContent || \"Here are great gift ideas for you\",\nproducts: carouselItems,\nindex,\n});\n} else if (textContent) {\nmessagesToDisplay.push({ type: \"ai\", content: textContent, index });\n}\n}\n});\n// Check for annotatedItems in context (GET response uses SimpleShopAssistantAnswer)\nconst annotatedItems = historyData.data?.context?.annotatedItems;\nif (\nannotatedItems &&\nArray.isArray(annotatedItems) &&\nannotatedItems.length > 0\n) {\nlet titleForItems = \"Here are great gift ideas for you\";\nfor (let i = messagesToDisplay.length - 1; i >= 0; i--) {\nif (messagesToDisplay[i].type === \"ai\") {\ntitleForItems = messagesToDisplay[i].content;\nmessagesToDisplay[i].useAsTitleOnly = true;\nbreak;\n}\n}\nmessagesToDisplay.push({\ntype: \"products\",\ntitle: titleForItems,\nproducts: annotatedItems,\nindex: messagesToDisplay.length,\n});\n}\n// Display messages in chronological order\nmessagesToDisplay.forEach((msgItem) => {\nif (msgItem.type === \"human\") {\naddSelectedSuggestion(msgItem.content);\n} else if (msgItem.type === \"ai\" && !msgItem.useAsTitleOnly) {\naddAIMessage(msgItem.content, true);\n} else if (msgItem.type === \"products\") {\naddResultsSection(msgItem.title, msgItem.products);\n}\n});\nmessagesContainer.scrollTop = messagesContainer.scrollHeight;\n  }\n  async function sendChatRequest(message) {\nconst requestBody = {\nclientUUID: getUuid(),\nmessage: {\ntype: \"HUMAN\",\ncontent: {\ntype: \"BUBBLE_TEXT\",\ncontent: message,\n},\n},\n};\nconst headers = {\n\"Content-Type\": \"application/json\",\n};\nlet url;\nconst currentThreadId = config.threadId || loadThreadId();\nif (currentThreadId) {\n// Continue existing conversation via dedicated endpoint\nurl = `https://api.synerise.com/gen-ai/v2/ai-assistant/chat/${currentThreadId}/messages?code=${getToken()}`;\n} else {\nurl = config.apiEndpoint;\n}\nconst response = await fetch(url, {\nmethod: \"POST\",\nheaders: headers,\nbody: JSON.stringify(requestBody),\n});\nif (!response.ok) {\nthrow new Error(\n`API request failed: ${response.status} ${response.statusText}`,\n);\n}\nreturn await response.json();\n  }\n  async function handleSendMessage() {\nconst input = $(\"ai-assistant-input\");\nconst sendButton = $(\"ai-assistant-send\");\nconst message = input.value.trim();\nif (!message) return;\nconst suggestionsDiv = $(\"ai-assistant-suggestions\");\nif (suggestionsDiv && suggestionsDiv.style.display !== \"none\") {\nsuggestionsDiv.style.display = \"none\";\n}\naddSelectedSuggestion(message);\ninput.value = \"\";\nsendButton.disabled = true;\ninput.disabled = true;\n// Pause microphone during request\npauseMicrophoneForRequest();\nshowTypingIndicator();\ntry {\nconst response = await sendChatRequest(message);\nif (response.meta?.threadId) {\nconfig.threadId = response.meta.threadId;\nsaveThreadId(response.meta.threadId);\n}\nhideTypingIndicator();\nprocessAPIResponse(response);\n} catch (error) {\nhideTypingIndicator();\nconsole.error(\"Error sending message:\", error);\nshowErrorMessage();\n} finally {\nsendButton.disabled = false;\ninput.disabled = false;\ninput.focus();\n// Resume microphone after request if it was recording before\nresumeMicrophoneAfterRequest();\n}\n  }\n  function toggleChat() {\nconst chat = $(\"ai-assistant-chat\");\nchat.classList.toggle(\"open\");\nif (chat.classList.contains(\"open\")) {\nconst input = $(\"ai-assistant-input\");\nsetTimeout(() => input.focus(), 100);\n}\n  }\n  // Speech recognition functionality\n  let recognition = null;\n  let isRecording = false;\n  let shouldContinueRecording = false;\n  let wasRecordingBeforeRequest = false;\n  function initSpeechRecognition() {\nconst SpeechRecognition =\nwindow.SpeechRecognition || window.webkitSpeechRecognition;\nif (!SpeechRecognition) {\nconsole.warn(\"Speech recognition not supported in this browser\");\nreturn false;\n}\nrecognition = new SpeechRecognition();\nrecognition.continuous = true;\nrecognition.interimResults = false;\nrecognition.lang = \"en-US\";\nrecognition.onstart = () => {\nisRecording = true;\nshouldContinueRecording = true;\nconst micButton = $(\"ai-assistant-microphone\");\nif (micButton) {\nmicButton.classList.add(\"recording\");\n}\n};\nrecognition.onresult = (event) => {\n// Get the last result (most recent speech)\nconst lastResult = event.results[event.results.length - 1];\nconst transcript = lastResult[0].transcript.trim();\n// Only process if the result is final\nif (lastResult.isFinal && transcript) {\nconst input = $(\"ai-assistant-input\");\nif (input) {\ninput.value = transcript;\n// Automatically send the message\nsetTimeout(() => {\nhandleSendMessage();\n}, 100);\n}\n}\n};\nrecognition.onerror = (event) => {\nconsole.error(\"Speech recognition error:\", event.error);\n// Don't stop on 'no-speech' error - just continue listening\nif (event.error === \"no-speech\") {\nreturn;\n}\n// For other errors, show message but keep trying if shouldContinueRecording\nif (event.error !== \"aborted\" && event.error !== \"network\") {\nconst messagesContainer = $(\"ai-assistant-messages\");\nif (messagesContainer) {\nconst errorDiv = document.createElement(\"div\");\nerrorDiv.className = \"ai-assistant-error\";\nerrorDiv.innerHTML = `\n<p class=\"ai-assistant-error-text\">Speech recognition error: ${event.error}</p>\n`;\nmessagesContainer.appendChild(errorDiv);\nmessagesContainer.scrollTop = messagesContainer.scrollHeight;\n}\n}\n// If we should continue, restart recognition after a short delay\nif (shouldContinueRecording && event.error !== \"aborted\") {\nsetTimeout(() => {\nif (shouldContinueRecording && recognition) {\ntry {\nrecognition.start();\n} catch (e) {\nconsole.error(\"Error restarting recognition:\", e);\n}\n}\n}, 500);\n}\n};\nrecognition.onend = () => {\n// Automatically restart if we should continue recording\nif (shouldContinueRecording) {\ntry {\nrecognition.start();\n} catch (error) {\nconsole.error(\"Error restarting recognition:\", error);\nisRecording = false;\nshouldContinueRecording = false;\nconst micButton = $(\"ai-assistant-microphone\");\nif (micButton) {\nmicButton.classList.remove(\"recording\");\n}\n}\n} else {\nisRecording = false;\nconst micButton = $(\"ai-assistant-microphone\");\nif (micButton) {\nmicButton.classList.remove(\"recording\");\n}\n}\n};\nreturn true;\n  }\n  function toggleSpeechRecognition() {\nif (!recognition) {\nif (!initSpeechRecognition()) {\nconst messagesContainer = $(\"ai-assistant-messages\");\nif (messagesContainer) {\nconst errorDiv = document.createElement(\"div\");\nerrorDiv.className = \"ai-assistant-error\";\nerrorDiv.innerHTML = `\n<p class=\"ai-assistant-error-text\">Speech recognition is not supported in this browser.</p>\n`;\nmessagesContainer.appendChild(errorDiv);\nmessagesContainer.scrollTop = messagesContainer.scrollHeight;\n}\nreturn;\n}\n}\nif (isRecording) {\n// Stop recording\nshouldContinueRecording = false;\nrecognition.stop();\n} else {\n// Start continuous recording\nshouldContinueRecording = true;\ntry {\nrecognition.start();\n} catch (error) {\nconsole.error(\"Error starting speech recognition:\", error);\nshouldContinueRecording = false;\n}\n}\n  }\n  // Pause microphone during request\n  function pauseMicrophoneForRequest() {\nif (isRecording && recognition) {\nwasRecordingBeforeRequest = true;\nshouldContinueRecording = false;\nrecognition.stop();\n} else {\nwasRecordingBeforeRequest = false;\n}\n  }\n  // Resume microphone after request if it was recording before\n  function resumeMicrophoneAfterRequest() {\nif (wasRecordingBeforeRequest && recognition) {\nshouldContinueRecording = true;\ntry {\nrecognition.start();\n} catch (error) {\nconsole.error(\"Error resuming speech recognition:\", error);\nwasRecordingBeforeRequest = false;\n}\n}\n  }\n  function loadConfiguration() {\nconst container = document.getElementById(config.containerId);\nif (container) {\nif (container.dataset.apiEndpoint) {\nconfig.apiEndpoint = container.dataset.apiEndpoint;\n}\nif (container.dataset.buttonImageSrc) {\nconfig.buttonImageSrc = container.dataset.buttonImageSrc;\n}\nif (container.dataset.promptIconSrc) {\nconfig.promptIconSrc = container.dataset.promptIconSrc;\n}\n}\nif (window.AIAssistantConfig) {\nObject.assign(config, window.AIAssistantConfig);\n}\n  }\n  async function initChatbot() {\nconst container = document.getElementById(config.containerId);\nif (!container) {\nconsole.error(\"AI Assistant: Container not found!\");\nreturn;\n}\nloadConfiguration();\nconst savedThreadId = loadThreadId();\nif (savedThreadId) {\nconfig.threadId = savedThreadId;\n}\n// Create Shadow DOM for style encapsulation\nroot = container.attachShadow({ mode: \"open\" });\nconst styleEl = document.createElement(\"style\");\nstyleEl.textContent = getStyles();\nroot.appendChild(styleEl);\nconst wrapper = document.createElement(\"div\");\nwrapper.innerHTML = createChatbotHTML();\nwhile (wrapper.firstChild) {\nroot.appendChild(wrapper.firstChild);\n}\n// Light DOM style for hiding external chatbase elements\nconst hostStyle = document.createElement(\"style\");\nhostStyle.textContent =\n\"#chatbase-bubble-button, #chatbase-message-bubbles { display: none !important; }\";\ndocument.head.appendChild(hostStyle);\nconst toggleButton = $(\"ai-assistant-toggle\");\ntoggleButton.addEventListener(\"click\", toggleChat);\ntoggleButton.addEventListener(\"keypress\", (e) => {\nif (e.key === \"Enter\" || e.key === \" \") {\ne.preventDefault();\ntoggleChat();\n}\n});\n$(\"ai-assistant-close\").addEventListener(\"click\", toggleChat);\n$(\"ai-assistant-reset\").addEventListener(\"click\", resetConversation);\n$(\"ai-assistant-send\").addEventListener(\"click\", handleSendMessage);\nconst micButton = $(\"ai-assistant-microphone\");\nif (micButton) {\nmicButton.addEventListener(\"click\", toggleSpeechRecognition);\n}\nconst input = $(\"ai-assistant-input\");\ninput.addEventListener(\"keypress\", (e) => {\nif (e.key === \"Enter\") {\nhandleSendMessage();\n}\n});\nif (savedThreadId) {\ntry {\nawait restoreConversationHistory();\n} catch (error) {\nconsole.error(\"Error restoring conversation history:\", error);\nsetTimeout(() => {\naddPromptSection();\n}, 300);\n}\n} else {\nsetTimeout(() => {\naddPromptSection();\n}, 300);\n}\n  }\n  if (document.readyState === \"loading\") {\ndocument.addEventListener(\"DOMContentLoaded\", initChatbot);\n  } else {\ninitChatbot();\n  }\n})();"},"id":18352981,"name":"Variant A","parsedData":{},"percentage":100,"selector":".snrs-modal-wrapper","selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"?shoppingAI","type":"CONTAIN"}]},{"capping":{},"containsJinjava":true,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ALWAYS"},"id":"36c821f5-d900-4e8f-8325-ec1769411147","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":false,"options":{"batchDelivery":false,"controlGroup":0,"utm":{"campaign":"","medium":"","parameters":{},"source":"","term":""}},"stopDisplay":{"options":{},"type":"NEVER"},"subject":"[Survey] Newsletter Unsubscribe - All v2","targetRestriction":[],"trigger":{"options":{"delayType":"SECONDS"},"type":"ON_LANDING"},"variants":[{"content":{},"id":14280882,"name":"Variant A","parsedData":{},"percentage":100,"selector":"section[id=\"3c9cfa85-51d3-4be1-8e6d-067da9f86a44\"]","selectorPrefix":"BEFORE"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"/unsubscribe","type":"CONTAIN"}]},{"capping":{},"containsJinjava":true,"displayType":"OBJECT","experimentId":null,"experimentVariantId":null,"frequency":{"options":{"count":"1","times":"1","timesType":"HOURS"},"type":"ALWAYS"},"id":"3ca88eaa-f9c7-4751-8f6d-196a6833c6fb","isABX":false,"isControlGroup":false,"isGlobalControlGroupEnabled":false,"isSegment":false,"options":{"batchDelivery":false,"controlGroup":0,"includeAudience":false,"utm":{"parameters":{}}},"stopDisplay":{"options":{},"type":"AFTER_ACTION"},"subject":"[HP DE] Gaming4you seller banner ","targetRestriction":["DESKTOP"],"trigger":{"options":{"delayType":"SECONDS","delayValue":"1"},"type":"ON_LANDING"},"variants":[{"content":{},"id":17110740,"name":"Wariant A","parsedData":{},"percentage":100,"selector":"#bb401c15-018f-4099-a7b3-f74d9a39e0fc","selectorPrefix":"AFTER"}],"viewsExcludePageUrl":[],"viewsPageUrl":[{"requirement":"https://www.g2a.com/de/","type":"EQUALS"}]}]}