{ "exportFormatVersion": 2, "exportTime": "2026-01-07 12:43:08", "containerVersion": { "path": "accounts/1424898657/containers/70755865/versions/0", "accountId": "1424898657", "containerId": "70755865", "containerVersionId": "0", "container": { "path": "accounts/1424898657/containers/70755865", "accountId": "1424898657", "containerId": "70755865", "name": "TestiTicketShop", "publicId": "GTM-PNQLFQS", "usageContext": [ "WEB" ], "fingerprint": "1655970368736", "tagManagerUrl": "https://tagmanager.google.com/#/container/accounts/1424898657/containers/70755865/workspaces?apiLink=container", "features": { "supportUserPermissions": true, "supportEnvironments": true, "supportWorkspaces": true, "supportGtagConfigs": false, "supportBuiltInVariables": true, "supportClients": false, "supportFolders": true, "supportTags": true, "supportTemplates": true, "supportTriggers": true, "supportVariables": true, "supportVersions": true, "supportZones": true, "supportTransformations": false }, "tagIds": [ "GTM-PNQLFQS" ] }, "tag": [ { "accountId": "1424898657", "containerId": "70755865", "tagId": "424", "name": "Facebook - add_to_cart - CM.com", "type": "cvt_70755865_423", "parameter": [ { "type": "BOOLEAN", "key": "disablePushState", "value": "false" }, { "type": "TEMPLATE", "key": "pixelId", "value": "{{CM.com Ticketshop - Facebook Tracking Pixel ID}}" }, { "type": "TEMPLATE", "key": "standardEventName", "value": "AddToCart" }, { "type": "BOOLEAN", "key": "disableAutoConfig", "value": "false" }, { "type": "BOOLEAN", "key": "enhancedEcommerce", "value": "false" }, { "type": "BOOLEAN", "key": "dpoLDU", "value": "false" }, { "type": "TEMPLATE", "key": "eventName", "value": "standard" }, { "type": "BOOLEAN", "key": "objectPropertiesFromVariable", "value": "false" }, { "type": "BOOLEAN", "key": "consent", "value": "true" }, { "type": "BOOLEAN", "key": "advancedMatching", "value": "false" } ], "fingerprint": "1767787986615", "firingTriggerId": [ "422" ], "parentFolderId": "419", "tagFiringOption": "ONCE_PER_EVENT", "monitoringMetadata": { "type": "MAP" }, "consentSettings": { "consentStatus": "NOT_SET" } }, { "accountId": "1424898657", "containerId": "70755865", "tagId": "429", "name": "TikTok - begin_checkout - CM.com", "type": "cvt_70755865_427", "parameter": [ { "type": "TEMPLATE", "key": "ga_ecomm", "value": "ecomm" }, { "type": "TEMPLATE", "key": "pixel_code", "value": "{{CM.com Ticketshop - TikTok ID}}" }, { "type": "TEMPLATE", "key": "event", "value": "InitiateCheckout" }, { "type": "BOOLEAN", "key": "enhance_ecomm", "value": "true" }, { "type": "TEMPLATE", "key": "hash", "value": "hashed" } ], "fingerprint": "1767787986630", "firingTriggerId": [ "428" ], "parentFolderId": "426", "tagFiringOption": "ONCE_PER_EVENT", "monitoringMetadata": { "type": "MAP" }, "consentSettings": { "consentStatus": "NOT_SET" } }, { "accountId": "1424898657", "containerId": "70755865", "tagId": "431", "name": "TikTok - add_payment_info - CM.com", "type": "cvt_70755865_427", "parameter": [ { "type": "TEMPLATE", "key": "ga_ecomm", "value": "ecomm" }, { "type": "TEMPLATE", "key": "pixel_code", "value": "{{CM.com Ticketshop - TikTok ID}}" }, { "type": "TEMPLATE", "key": "event", "value": "AddPaymentInfo" }, { "type": "BOOLEAN", "key": "enhance_ecomm", "value": "true" }, { "type": "TEMPLATE", "key": "hash", "value": "hashed" } ], "fingerprint": "1767787986630", "firingTriggerId": [ "430" ], "tagFiringOption": "ONCE_PER_EVENT", "monitoringMetadata": { "type": "MAP" }, "consentSettings": { "consentStatus": "NOT_SET" } }, { "accountId": "1424898657", "containerId": "70755865", "tagId": "435", "name": "Facebook - page_view - CM.com", "type": "cvt_70755865_423", "parameter": [ { "type": "BOOLEAN", "key": "disablePushState", "value": "false" }, { "type": "TEMPLATE", "key": "pixelId", "value": "{{CM.com Ticketshop - Facebook Tracking Pixel ID}}" }, { "type": "TEMPLATE", "key": "standardEventName", "value": "PageView" }, { "type": "BOOLEAN", "key": "disableAutoConfig", "value": "false" }, { "type": "BOOLEAN", "key": "enhancedEcommerce", "value": "false" }, { "type": "BOOLEAN", "key": "dpoLDU", "value": "false" }, { "type": "TEMPLATE", "key": "eventName", "value": "standard" }, { "type": "BOOLEAN", "key": "objectPropertiesFromVariable", "value": "false" }, { "type": "BOOLEAN", "key": "consent", "value": "true" }, { "type": "BOOLEAN", "key": "advancedMatching", "value": "false" } ], "fingerprint": "1767787986644", "firingTriggerId": [ "433", "434" ], "parentFolderId": "419", "tagFiringOption": "ONCE_PER_EVENT", "monitoringMetadata": { "type": "MAP" }, "consentSettings": { "consentStatus": "NOT_SET" } }, { "accountId": "1424898657", "containerId": "70755865", "tagId": "440", "name": "Facebook - purchase - CM.com", "type": "cvt_70755865_423", "parameter": [ { "type": "BOOLEAN", "key": "disablePushState", "value": "false" }, { "type": "TEMPLATE", "key": "pixelId", "value": "{{CM.com Ticketshop - Facebook Tracking Pixel ID}}" }, { "type": "BOOLEAN", "key": "disableAutoConfig", "value": "false" }, { "type": "TEMPLATE", "key": "eecEventName", "value": "eec" }, { "type": "BOOLEAN", "key": "enhancedEcommerce", "value": "true" }, { "type": "BOOLEAN", "key": "dpoLDU", "value": "false" }, { "type": "BOOLEAN", "key": "objectPropertiesFromVariable", "value": "false" }, { "type": "BOOLEAN", "key": "consent", "value": "true" }, { "type": "BOOLEAN", "key": "advancedMatching", "value": "false" } ], "fingerprint": "1767787986645", "firingTriggerId": [ "439" ], "parentFolderId": "419", "tagFiringOption": "ONCE_PER_EVENT", "monitoringMetadata": { "type": "MAP" }, "consentSettings": { "consentStatus": "NOT_SET" } }, { "accountId": "1424898657", "containerId": "70755865", "tagId": "444", "name": "TikTok - page_view - CM.com", "type": "cvt_70755865_427", "parameter": [ { "type": "TEMPLATE", "key": "single_multi_product", "value": "single" }, { "type": "TEMPLATE", "key": "pixel_code", "value": "{{CM.com Ticketshop - TikTok ID}}" }, { "type": "TEMPLATE", "key": "event", "value": "ViewContent" }, { "type": "BOOLEAN", "key": "enhance_ecomm", "value": "false" }, { "type": "TEMPLATE", "key": "hash", "value": "hashed" } ], "fingerprint": "1767787986645", "firingTriggerId": [ "433", "434" ], "parentFolderId": "426", "tagFiringOption": "ONCE_PER_EVENT", "monitoringMetadata": { "type": "MAP" }, "consentSettings": { "consentStatus": "NOT_SET" } }, { "accountId": "1424898657", "containerId": "70755865", "tagId": "445", "name": "Facebook - begin_checkout - CM.com", "type": "cvt_70755865_423", "parameter": [ { "type": "BOOLEAN", "key": "disablePushState", "value": "false" }, { "type": "TEMPLATE", "key": "pixelId", "value": "{{CM.com Ticketshop - Facebook Tracking Pixel ID}}" }, { "type": "TEMPLATE", "key": "standardEventName", "value": "InitiateCheckout" }, { "type": "BOOLEAN", "key": "disableAutoConfig", "value": "false" }, { "type": "BOOLEAN", "key": "enhancedEcommerce", "value": "false" }, { "type": "BOOLEAN", "key": "dpoLDU", "value": "false" }, { "type": "TEMPLATE", "key": "eventName", "value": "standard" }, { "type": "BOOLEAN", "key": "objectPropertiesFromVariable", "value": "false" }, { "type": "BOOLEAN", "key": "consent", "value": "true" }, { "type": "BOOLEAN", "key": "advancedMatching", "value": "false" } ], "fingerprint": "1767787986645", "firingTriggerId": [ "428" ], "parentFolderId": "419", "tagFiringOption": "ONCE_PER_EVENT", "monitoringMetadata": { "type": "MAP" }, "consentSettings": { "consentStatus": "NOT_SET" } }, { "accountId": "1424898657", "containerId": "70755865", "tagId": "452", "name": "Snapchat - purchase - CM.com", "type": "cvt_K4VXG", "parameter": [ { "type": "TEMPLATE", "key": "transaction_id", "value": "{{eCommerce - Transaction ID}}" }, { "type": "LIST", "key": "additional_init_data", "list": [ { "type": "MAP", "map": [ { "type": "TEMPLATE", "key": "key", "value": "payment_type" }, { "type": "TEMPLATE", "key": "value", "value": "{{eCommerce - Payment Type}}" } ] } ] }, { "type": "TEMPLATE", "key": "event_type", "value": "PURCHASE" }, { "type": "TEMPLATE", "key": "price", "value": "{{eCommerce - Value}}" }, { "type": "TEMPLATE", "key": "currency", "value": "{{eCommerce - Currency Code}}" }, { "type": "TEMPLATE", "key": "pixel_id", "value": "{{CM.com Ticketshop - Snapchat Pixel}}" } ], "fingerprint": "1767787986646", "firingTriggerId": [ "442" ], "parentFolderId": "447", "tagFiringOption": "ONCE_PER_EVENT", "monitoringMetadata": { "type": "MAP" }, "consentSettings": { "consentStatus": "NOT_SET" } }, { "accountId": "1424898657", "containerId": "70755865", "tagId": "453", "name": "Snapchat - page_view - CM.com", "type": "cvt_K4VXG", "parameter": [ { "type": "TEMPLATE", "key": "transaction_id", "value": "{{eCommerce - Transaction ID}}" }, { "type": "TEMPLATE", "key": "event_type", "value": "PAGE_VIEW" }, { "type": "TEMPLATE", "key": "price", "value": "{{eCommerce - Value}}" }, { "type": "TEMPLATE", "key": "currency", "value": "{{eCommerce - Currency Code}}" }, { "type": "TEMPLATE", "key": "pixel_id", "value": "{{CM.com Ticketshop - Snapchat Pixel}}" } ], "fingerprint": "1767787986646", "firingTriggerId": [ "433", "434" ], "parentFolderId": "447", "tagFiringOption": "ONCE_PER_EVENT", "monitoringMetadata": { "type": "MAP" }, "consentSettings": { "consentStatus": "NOT_SET" } }, { "accountId": "1424898657", "containerId": "70755865", "tagId": "454", "name": "TikTok - add_to_cart - CM.com", "type": "cvt_70755865_427", "parameter": [ { "type": "TEMPLATE", "key": "single_multi_product", "value": "single" }, { "type": "TEMPLATE", "key": "pixel_code", "value": "{{CM.com Ticketshop - TikTok ID}}" }, { "type": "TEMPLATE", "key": "event", "value": "AddToCart" }, { "type": "BOOLEAN", "key": "enhance_ecomm", "value": "false" }, { "type": "TEMPLATE", "key": "hash", "value": "hashed" } ], "fingerprint": "1767787986646", "firingTriggerId": [ "422" ], "parentFolderId": "426", "tagFiringOption": "ONCE_PER_EVENT", "monitoringMetadata": { "type": "MAP" }, "consentSettings": { "consentStatus": "NOT_SET" } }, { "accountId": "1424898657", "containerId": "70755865", "tagId": "455", "name": "Facebook - add_payment_info - CM.com", "type": "cvt_70755865_423", "parameter": [ { "type": "BOOLEAN", "key": "disablePushState", "value": "false" }, { "type": "TEMPLATE", "key": "pixelId", "value": "{{CM.com Ticketshop - Facebook Tracking Pixel ID}}" }, { "type": "TEMPLATE", "key": "standardEventName", "value": "AddPaymentInfo" }, { "type": "BOOLEAN", "key": "disableAutoConfig", "value": "false" }, { "type": "BOOLEAN", "key": "enhancedEcommerce", "value": "false" }, { "type": "BOOLEAN", "key": "dpoLDU", "value": "false" }, { "type": "TEMPLATE", "key": "eventName", "value": "standard" }, { "type": "BOOLEAN", "key": "objectPropertiesFromVariable", "value": "false" }, { "type": "BOOLEAN", "key": "consent", "value": "true" }, { "type": "BOOLEAN", "key": "advancedMatching", "value": "false" } ], "fingerprint": "1767787986722", "firingTriggerId": [ "430" ], "tagFiringOption": "ONCE_PER_EVENT", "monitoringMetadata": { "type": "MAP" }, "consentSettings": { "consentStatus": "NOT_SET" } }, { "accountId": "1424898657", "containerId": "70755865", "tagId": "459", "name": "TikTok - purchase - CM.com", "type": "cvt_70755865_427", "parameter": [ { "type": "TEMPLATE", "key": "single_multi_product", "value": "single" }, { "type": "TEMPLATE", "key": "pixel_code", "value": "{{CM.com Ticketshop - TikTok ID}}" }, { "type": "TEMPLATE", "key": "event", "value": "CompletePayment" }, { "type": "BOOLEAN", "key": "enhance_ecomm", "value": "false" }, { "type": "TEMPLATE", "key": "hash", "value": "hashed" } ], "fingerprint": "1767787986728", "firingTriggerId": [ "442" ], "parentFolderId": "426", "tagFiringOption": "ONCE_PER_EVENT", "monitoringMetadata": { "type": "MAP" }, "consentSettings": { "consentStatus": "NOT_SET" } }, { "accountId": "1424898657", "containerId": "70755865", "tagId": "461", "name": "Snapchat - add_to_cart - CM.com", "type": "cvt_K4VXG", "parameter": [ { "type": "TEMPLATE", "key": "transaction_id", "value": "{{eCommerce - Transaction ID}}" }, { "type": "TEMPLATE", "key": "event_type", "value": "ADD_CART" }, { "type": "TEMPLATE", "key": "price", "value": "{{eCommerce - Value}}" }, { "type": "TEMPLATE", "key": "currency", "value": "{{eCommerce - Currency Code}}" }, { "type": "TEMPLATE", "key": "pixel_id", "value": "{{CM.com Ticketshop - Snapchat Pixel}}" } ], "fingerprint": "1767787986728", "firingTriggerId": [ "422" ], "parentFolderId": "447", "tagFiringOption": "ONCE_PER_EVENT", "monitoringMetadata": { "type": "MAP" }, "consentSettings": { "consentStatus": "NOT_SET" } }, { "accountId": "1424898657", "containerId": "70755865", "tagId": "462", "name": "Snapchat - begin_checkout - CM.com", "type": "cvt_K4VXG", "parameter": [ { "type": "TEMPLATE", "key": "transaction_id", "value": "{{eCommerce - Transaction ID}}" }, { "type": "TEMPLATE", "key": "event_type", "value": "START_CHECKOUT" }, { "type": "TEMPLATE", "key": "price", "value": "{{eCommerce - Value}}" }, { "type": "TEMPLATE", "key": "currency", "value": "{{eCommerce - Currency Code}}" }, { "type": "TEMPLATE", "key": "pixel_id", "value": "{{CM.com Ticketshop - Snapchat Pixel}}" } ], "fingerprint": "1767787986728", "firingTriggerId": [ "428" ], "parentFolderId": "447", "tagFiringOption": "ONCE_PER_EVENT", "monitoringMetadata": { "type": "MAP" }, "consentSettings": { "consentStatus": "NOT_SET" } } ], "trigger": [ { "accountId": "1424898657", "containerId": "70755865", "triggerId": "418", "name": "Order Status - Paid", "type": "CUSTOM_EVENT", "customEventFilter": [ { "type": "EQUALS", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{_event}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "purchase" } ] } ], "filter": [ { "type": "CONTAINS", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{Page Path}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "/success" } ] } ], "fingerprint": "1767787986604" }, { "accountId": "1424898657", "containerId": "70755865", "triggerId": "422", "name": "eCommerce - add_to_cart - CM.com", "type": "CUSTOM_EVENT", "customEventFilter": [ { "type": "EQUALS", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{_event}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "add_to_cart" } ] } ], "filter": [ { "type": "CONTAINS", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{Page URL}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "sales.ticketing.cm.com" } ] } ], "fingerprint": "1767789354449" }, { "accountId": "1424898657", "containerId": "70755865", "triggerId": "428", "name": "eCommerce - begin_checkout - CM.com", "type": "CUSTOM_EVENT", "customEventFilter": [ { "type": "EQUALS", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{_event}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "begin_checkout" } ] } ], "filter": [ { "type": "CONTAINS", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{Page URL}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "sales.ticketing.cm.com" } ] } ], "fingerprint": "1767789368881" }, { "accountId": "1424898657", "containerId": "70755865", "triggerId": "430", "name": "eCommerce- add_payment_info - CM.com", "type": "CUSTOM_EVENT", "customEventFilter": [ { "type": "EQUALS", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{_event}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "add_payment_info" } ] } ], "filter": [ { "type": "CONTAINS", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{Page URL}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "sales.ticketing.cm.com" } ] } ], "fingerprint": "1767789403853" }, { "accountId": "1424898657", "containerId": "70755865", "triggerId": "433", "name": "All pages - CM.com", "type": "PAGEVIEW", "filter": [ { "type": "CONTAINS", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{Page URL}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "sales.ticketing.cm.com" } ] } ], "fingerprint": "1767787986644" }, { "accountId": "1424898657", "containerId": "70755865", "triggerId": "434", "name": "eCommerce - page_view - CM.com", "type": "CUSTOM_EVENT", "customEventFilter": [ { "type": "EQUALS", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{_event}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "page_view" } ] } ], "filter": [ { "type": "CONTAINS", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{Page URL}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "sales.ticketing.cm.com" } ] } ], "fingerprint": "1767789379238" }, { "accountId": "1424898657", "containerId": "70755865", "triggerId": "436", "name": "eCommerce - page view - purchase - CM.com", "type": "PAGEVIEW", "filter": [ { "type": "CONTAINS", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{Page URL}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "/success" } ] } ], "fingerprint": "1767787986645" }, { "accountId": "1424898657", "containerId": "70755865", "triggerId": "438", "name": "eCommerce - purchase - CM.com", "type": "CUSTOM_EVENT", "customEventFilter": [ { "type": "EQUALS", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{_event}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "purchase" } ] } ], "filter": [ { "type": "CONTAINS", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{Page URL}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "sales.ticketing.cm.com" } ] } ], "fingerprint": "1767788573905" }, { "accountId": "1424898657", "containerId": "70755865", "triggerId": "439", "name": "Trigger Group - Facebook - purchase - CM.com", "type": "TRIGGER_GROUP", "fingerprint": "1767787986645", "parentFolderId": "419", "parameter": [ { "type": "LIST", "key": "triggerIds", "list": [ { "type": "TRIGGER_REFERENCE", "value": "433" }, { "type": "TRIGGER_REFERENCE", "value": "438" } ] } ] }, { "accountId": "1424898657", "containerId": "70755865", "triggerId": "441", "name": "Enhanced eCommerce - Interaction", "type": "CUSTOM_EVENT", "customEventFilter": [ { "type": "EQUALS", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{_event}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "impression|addToCart|removeFromCart|detail|checkout|purchase" } ] } ], "fingerprint": "1767787986645" }, { "accountId": "1424898657", "containerId": "70755865", "triggerId": "442", "name": "Trigger Group - purchase", "type": "TRIGGER_GROUP", "fingerprint": "1767787986645", "parameter": [ { "type": "LIST", "key": "triggerIds", "list": [ { "type": "TRIGGER_REFERENCE", "value": "438" }, { "type": "TRIGGER_REFERENCE", "value": "418" } ] } ] }, { "accountId": "1424898657", "containerId": "70755865", "triggerId": "443", "name": "eCommerce - remove_from_cart - CM.com", "type": "CUSTOM_EVENT", "customEventFilter": [ { "type": "EQUALS", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{_event}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "remove_from_cart" } ] } ], "filter": [ { "type": "CONTAINS", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{Page URL}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "sales.ticketing.cm.com" } ] } ], "fingerprint": "1767789390061" } ], "variable": [ { "accountId": "1424898657", "containerId": "70755865", "variableId": "421", "name": "CM.com Ticketshop - Facebook Tracking Pixel ID", "type": "c", "parameter": [ { "type": "TEMPLATE", "key": "value", "value": "1234567890" } ], "fingerprint": "1767787986604", "parentFolderId": "420", "formatValue": {} }, { "accountId": "1424898657", "containerId": "70755865", "variableId": "425", "name": "CM.com Ticketshop - TikTok ID", "type": "c", "parameter": [ { "type": "TEMPLATE", "key": "value", "value": "XXXX" } ], "fingerprint": "1767787986615", "parentFolderId": "420", "formatValue": {} }, { "accountId": "1424898657", "containerId": "70755865", "variableId": "437", "name": "eCommerce - Coupon", "type": "v", "parameter": [ { "type": "INTEGER", "key": "dataLayerVersion", "value": "2" }, { "type": "BOOLEAN", "key": "setDefaultValue", "value": "false" }, { "type": "TEMPLATE", "key": "name", "value": "coupon" } ], "fingerprint": "1767787986645", "formatValue": {} }, { "accountId": "1424898657", "containerId": "70755865", "variableId": "446", "name": "eCommerce - Payment Type", "type": "v", "parameter": [ { "type": "INTEGER", "key": "dataLayerVersion", "value": "2" }, { "type": "BOOLEAN", "key": "setDefaultValue", "value": "false" }, { "type": "TEMPLATE", "key": "name", "value": "payment_type" } ], "fingerprint": "1767787986645", "formatValue": {} }, { "accountId": "1424898657", "containerId": "70755865", "variableId": "448", "name": "eCommerce - Transaction ID", "type": "v", "parameter": [ { "type": "INTEGER", "key": "dataLayerVersion", "value": "2" }, { "type": "BOOLEAN", "key": "setDefaultValue", "value": "false" }, { "type": "TEMPLATE", "key": "name", "value": "transaction_id" } ], "fingerprint": "1767787986645", "formatValue": {} }, { "accountId": "1424898657", "containerId": "70755865", "variableId": "449", "name": "eCommerce - Value", "type": "v", "parameter": [ { "type": "INTEGER", "key": "dataLayerVersion", "value": "2" }, { "type": "BOOLEAN", "key": "setDefaultValue", "value": "false" }, { "type": "TEMPLATE", "key": "name", "value": "value" } ], "fingerprint": "1767787986646", "formatValue": {} }, { "accountId": "1424898657", "containerId": "70755865", "variableId": "450", "name": "eCommerce - Currency Code", "type": "v", "parameter": [ { "type": "INTEGER", "key": "dataLayerVersion", "value": "2" }, { "type": "BOOLEAN", "key": "setDefaultValue", "value": "true" }, { "type": "TEMPLATE", "key": "defaultValue", "value": "EU" }, { "type": "TEMPLATE", "key": "name", "value": "currency" } ], "fingerprint": "1767787986646", "formatValue": {} }, { "accountId": "1424898657", "containerId": "70755865", "variableId": "451", "name": "CM.com Ticketshop - Snapchat Pixel", "type": "c", "parameter": [ { "type": "TEMPLATE", "key": "value", "value": "XXXX" } ], "fingerprint": "1767787986646", "parentFolderId": "420", "formatValue": {} }, { "accountId": "1424898657", "containerId": "70755865", "variableId": "456", "name": "CM.com Ticketshop - Facebook Page", "type": "c", "parameter": [ { "type": "TEMPLATE", "key": "value", "value": "https://www.facebook.com/xxxxxxxxxxx/" } ], "fingerprint": "1767787986723", "parentFolderId": "420", "formatValue": {} }, { "accountId": "1424898657", "containerId": "70755865", "variableId": "457", "name": "CM.com - event", "type": "v", "parameter": [ { "type": "INTEGER", "key": "dataLayerVersion", "value": "2" }, { "type": "BOOLEAN", "key": "setDefaultValue", "value": "false" }, { "type": "TEMPLATE", "key": "name", "value": "event" } ], "fingerprint": "1767787986723", "formatValue": {} }, { "accountId": "1424898657", "containerId": "70755865", "variableId": "460", "name": "eCommmerce - Items", "type": "v", "parameter": [ { "type": "INTEGER", "key": "dataLayerVersion", "value": "2" }, { "type": "BOOLEAN", "key": "setDefaultValue", "value": "false" }, { "type": "TEMPLATE", "key": "name", "value": "items" } ], "fingerprint": "1767787986728", "formatValue": {} }, { "accountId": "1424898657", "containerId": "70755865", "variableId": "463", "name": "eCommerce - Datalayer", "type": "v", "parameter": [ { "type": "INTEGER", "key": "dataLayerVersion", "value": "2" }, { "type": "BOOLEAN", "key": "setDefaultValue", "value": "false" }, { "type": "TEMPLATE", "key": "name", "value": "ecommerce" } ], "fingerprint": "1767787986729", "formatValue": {} } ], "folder": [ { "accountId": "1424898657", "containerId": "70755865", "folderId": "419", "name": "Facebook", "fingerprint": "1767787986604" }, { "accountId": "1424898657", "containerId": "70755865", "folderId": "420", "name": "Constants", "fingerprint": "1767787986604" }, { "accountId": "1424898657", "containerId": "70755865", "folderId": "426", "name": "TikTok", "fingerprint": "1767787986615" }, { "accountId": "1424898657", "containerId": "70755865", "folderId": "447", "name": "Snapchat", "fingerprint": "1767787986645" } ], "builtInVariable": [ { "accountId": "1424898657", "containerId": "70755865", "type": "PAGE_URL", "name": "Page URL" }, { "accountId": "1424898657", "containerId": "70755865", "type": "PAGE_HOSTNAME", "name": "Page Hostname" }, { "accountId": "1424898657", "containerId": "70755865", "type": "PAGE_PATH", "name": "Page Path" }, { "accountId": "1424898657", "containerId": "70755865", "type": "REFERRER", "name": "Referrer" }, { "accountId": "1424898657", "containerId": "70755865", "type": "EVENT", "name": "Event" } ], "fingerprint": "1767789788020", "tagManagerUrl": "https://tagmanager.google.com/#/versions/accounts/1424898657/containers/70755865/versions/0?apiLink=version", "customTemplate": [ { "accountId": "1424898657", "containerId": "70755865", "templateId": "423", "name": "Facebook Pixel", "fingerprint": "1767787986605", "templateData": "___TERMS_OF_SERVICE___\n\nBy creating or modifying this file you agree to Google Tag Manager's Community\nTemplate Gallery Developer Terms of Service available at\nhttps://developers.google.com/tag-manager/gallery-tos (or such other URL as\nGoogle may provide), as modified from time to time.\n\n\n___INFO___\n\n{\n \"displayName\": \"Facebook Pixel\",\n \"__wm\": \"VGVtcGxhdGUtQXV0aG9yX0ZhY2Vib29rLVNpbW8tQWhhdmE\\u003d\",\n \"description\": \"This is an unofficial Google Tag Manager template for the Facebook Pixel.\",\n \"securityGroups\": [],\n \"categories\": [\n \"ADVERTISING\",\n \"ANALYTICS\"\n ],\n \"id\": \"cvt_temp_public_id\",\n \"type\": \"TAG\",\n \"version\": 1,\n \"brand\": {\n \"displayName\": \"facebookarchive\",\n \"id\": \"github.com_facebookarchive\",\n \"thumbnail\": \"data:image/png;base64,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\"\n },\n \"containerContexts\": [\n \"WEB\"\n ]\n}\n\n\n___TEMPLATE_PARAMETERS___\n\n[\n {\n \"alwaysInSummary\": true,\n \"valueValidators\": [\n {\n \"errorMessage\": \"You must provide a Pixel ID\",\n \"type\": \"NON_EMPTY\"\n },\n {\n \"args\": [\n \"^[0-9,]+$\"\n ],\n \"errorMessage\": \"Invalid Pixel ID format\",\n \"type\": \"REGEX\"\n }\n ],\n \"displayName\": \"Facebook Pixel ID(s)\",\n \"simpleValueType\": true,\n \"name\": \"pixelId\",\n \"type\": \"TEXT\",\n \"valueHint\": \"e.g. 12345678910\"\n },\n {\n \"type\": \"CHECKBOX\",\n \"name\": \"enhancedEcommerce\",\n \"checkboxText\": \"Enhanced Ecommerce dataLayer Integration\",\n \"simpleValueType\": true,\n \"help\": \"If you check this, then the Facebook pixel will populate \\u003cstrong\\u003eEvent Name\\u003c/strong\\u003e and \\u003cstrong\\u003eObject Properties\\u003c/strong\\u003e automatically from the last \\u003ca href\\u003d\\\"https://developers.google.com/tag-manager/enhanced-ecommerce\\\"\\u003eecommerce\\u003c/a\\u003e object pushed into the dataLayer array.\"\n },\n {\n \"type\": \"RADIO\",\n \"name\": \"eventName\",\n \"displayName\": \"Event Name\",\n \"radioItems\": [\n {\n \"value\": \"standard\",\n \"displayValue\": \"Standard\",\n \"subParams\": [\n {\n \"type\": \"SELECT\",\n \"name\": \"standardEventName\",\n \"macrosInSelect\": false,\n \"selectItems\": [\n {\n \"displayValue\": \"PageView\",\n \"value\": \"PageView\"\n },\n {\n \"displayValue\": \"AddPaymentInfo\",\n \"value\": \"AddPaymentInfo\"\n },\n {\n \"displayValue\": \"AddToCart\",\n \"value\": \"AddToCart\"\n },\n {\n \"displayValue\": \"AddToWishlist\",\n \"value\": \"AddToWishlist\"\n },\n {\n \"displayValue\": \"CompleteRegistration\",\n \"value\": \"CompleteRegistration\"\n },\n {\n \"displayValue\": \"Contact\",\n \"value\": \"Contact\"\n },\n {\n \"displayValue\": \"CustomizeProduct\",\n \"value\": \"CustomizeProduct\"\n },\n {\n \"displayValue\": \"Donate\",\n \"value\": \"Donate\"\n },\n {\n \"displayValue\": \"FindLocation\",\n \"value\": \"FindLocation\"\n },\n {\n \"displayValue\": \"InitiateCheckout\",\n \"value\": \"InitiateCheckout\"\n },\n {\n \"displayValue\": \"Lead\",\n \"value\": \"Lead\"\n },\n {\n \"displayValue\": \"Purchase\",\n \"value\": \"Purchase\"\n },\n {\n \"displayValue\": \"Schedule\",\n \"value\": \"Schedule\"\n },\n {\n \"displayValue\": \"Search\",\n \"value\": \"Search\"\n },\n {\n \"displayValue\": \"StartTrial\",\n \"value\": \"StartTrial\"\n },\n {\n \"displayValue\": \"SubmitApplication\",\n \"value\": \"SubmitApplication\"\n },\n {\n \"displayValue\": \"Subscribe\",\n \"value\": \"Subscribe\"\n },\n {\n \"displayValue\": \"ViewContent\",\n \"value\": \"ViewContent\"\n }\n ],\n \"simpleValueType\": true,\n \"defaultValue\": \"PageView\"\n }\n ]\n },\n {\n \"value\": \"custom\",\n \"displayValue\": \"Custom\",\n \"subParams\": [\n {\n \"type\": \"TEXT\",\n \"name\": \"customEventName\",\n \"displayName\": \"\",\n \"simpleValueType\": true\n }\n ]\n },\n {\n \"value\": \"variable\",\n \"displayValue\": \"Variable\",\n \"subParams\": [\n {\n \"type\": \"SELECT\",\n \"name\": \"variableEventName\",\n \"macrosInSelect\": true,\n \"selectItems\": [],\n \"simpleValueType\": true\n }\n ]\n }\n ],\n \"simpleValueType\": true,\n \"enablingConditions\": [\n {\n \"paramName\": \"enhancedEcommerce\",\n \"paramValue\": true,\n \"type\": \"NOT_EQUALS\"\n }\n ]\n },\n {\n \"type\": \"RADIO\",\n \"name\": \"eecEventName\",\n \"displayName\": \"Event Name\",\n \"radioItems\": [\n {\n \"value\": \"eec\",\n \"displayValue\": \"Set automatically from dataLayer\"\n }\n ],\n \"simpleValueType\": true,\n \"help\": \"The Enhanced Ecommerce integration populates the Event Name automatically depending on what type of \\u003cstrong\\u003eecommerce\\u003c/strong\\u003e object was last pushed into dataLayer (\\\"detail\\\" -\\u003e \\\"ViewContent\\\", \\\"add\\\" -\\u003e \\\"AddToCart\\\", \\\"checkout\\\" -\\u003e \\\"InitiateCheckout\\\", \\\"purchase\\\" -\\u003e \\\"Purchase\\\").\",\n \"enablingConditions\": [\n {\n \"paramName\": \"enhancedEcommerce\",\n \"paramValue\": true,\n \"type\": \"EQUALS\"\n }\n ]\n },\n {\n \"type\": \"SELECT\",\n \"name\": \"consent\",\n \"displayName\": \"Consent Granted (GDPR)\",\n \"macrosInSelect\": true,\n \"selectItems\": [\n {\n \"value\": true,\n \"displayValue\": \"True\"\n },\n {\n \"value\": false,\n \"displayValue\": \"False\"\n }\n ],\n \"simpleValueType\": true,\n \"help\": \"If you set Consent Granted to \\u003cstrong\\u003efalse\\u003c/strong\\u003e, the pixel will not send any hits until a tag is fired where Consent Granted is set to \\u003cstrong\\u003etrue\\u003c/strong\\u003e. See \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/facebook-pixel/implementation/gdpr/\\\"\\u003ethis article\\u003c/a\\u003e for more information.\"\n },\n {\n \"simpleValueType\": true,\n \"name\": \"advancedMatching\",\n \"checkboxText\": \"Enable Advanced Matching\",\n \"type\": \"CHECKBOX\"\n },\n {\n \"type\": \"GROUP\",\n \"name\": \"dataProcessingOptionsGroup\",\n \"displayName\": \"Data Processing Options\",\n \"groupStyle\": \"ZIPPY_CLOSED\",\n \"subParams\": [\n {\n \"type\": \"LABEL\",\n \"name\": \"dpoInfo\",\n \"displayName\": \"Data Processing Options force this Facebook event to comply to regional regulations with regard to the processing and selling of user data. Read \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/marketing-apis/data-processing-options\\\"\\u003ethis\\u003c/a\\u003e for more information about how to configure this section.\"\n },\n {\n \"type\": \"CHECKBOX\",\n \"name\": \"dpoLDU\",\n \"checkboxText\": \"Limited Data Use (LDU)\",\n \"simpleValueType\": true\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"dpoCountry\",\n \"displayName\": \"Country\",\n \"simpleValueType\": true,\n \"defaultValue\": 0,\n \"enablingConditions\": [\n {\n \"paramName\": \"dpoLDU\",\n \"paramValue\": true,\n \"type\": \"EQUALS\"\n }\n ],\n \"valueValidators\": [\n {\n \"type\": \"NUMBER\"\n }\n ]\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"dpoState\",\n \"displayName\": \"State\",\n \"simpleValueType\": true,\n \"defaultValue\": 0,\n \"enablingConditions\": [\n {\n \"paramName\": \"dpoLDU\",\n \"paramValue\": true,\n \"type\": \"EQUALS\"\n }\n ],\n \"valueValidators\": [\n {\n \"type\": \"NUMBER\"\n }\n ]\n }\n ]\n },\n {\n \"enablingConditions\": [\n {\n \"paramName\": \"advancedMatching\",\n \"type\": \"EQUALS\",\n \"paramValue\": true\n }\n ],\n \"displayName\": \"Customer Information Data Parameters\",\n \"name\": \"advancedMatchingGroup\",\n \"groupStyle\": \"ZIPPY_CLOSED\",\n \"type\": \"GROUP\",\n \"subParams\": [\n {\n \"displayName\": \"\",\n \"name\": \"advancedMatchingList\",\n \"simpleTableColumns\": [\n {\n \"selectItems\": [\n {\n \"displayValue\": \"City\",\n \"value\": \"ct\"\n },\n {\n \"displayValue\": \"Country\",\n \"value\": \"cn\"\n },\n {\n \"displayValue\": \"Date of Birth\",\n \"value\": \"db\"\n },\n {\n \"displayValue\": \"Email\",\n \"value\": \"em\"\n },\n {\n \"displayValue\": \"External ID\",\n \"value\": \"external_id\"\n },\n {\n \"displayValue\": \"First Name\",\n \"value\": \"fn\"\n },\n {\n \"displayValue\": \"Gender\",\n \"value\": \"ge\"\n },\n {\n \"displayValue\": \"Last Name\",\n \"value\": \"ln\"\n },\n {\n \"displayValue\": \"Phone\",\n \"value\": \"ph\"\n },\n {\n \"displayValue\": \"State\",\n \"value\": \"st\"\n },\n {\n \"displayValue\": \"Zip Code\",\n \"value\": \"zp\"\n }\n ],\n \"defaultValue\": \"\",\n \"displayName\": \"Parameter name\",\n \"name\": \"name\",\n \"isUnique\": true,\n \"type\": \"SELECT\"\n },\n {\n \"defaultValue\": \"\",\n \"displayName\": \"Parameter value\",\n \"name\": \"value\",\n \"type\": \"TEXT\"\n }\n ],\n \"type\": \"SIMPLE_TABLE\",\n \"newRowButtonText\": \"Add parameter\",\n \"valueValidators\": [\n {\n \"type\": \"NON_EMPTY\"\n }\n ]\n }\n ]\n },\n {\n \"displayName\": \"Object Properties\",\n \"name\": \"objectPropertiesGroup\",\n \"groupStyle\": \"ZIPPY_CLOSED\",\n \"type\": \"GROUP\",\n \"subParams\": [\n {\n \"type\": \"LABEL\",\n \"name\": \"enhancedEcommerceObject\",\n \"displayName\": \"\\u003cstrong\\u003eWarning!\\u003c/strong\\u003e Object properties are populated automatically based on the most recent \\u003cstrong\\u003eecommerce\\u003c/strong\\u003e object pushed into dataLayer. If you add properties here that are already set by the integration (content_type, contents, num_items, value, currency), then the properties you add here will override those set automatically by the integration!\",\n \"enablingConditions\": [\n {\n \"paramName\": \"enhancedEcommerce\",\n \"paramValue\": true,\n \"type\": \"EQUALS\"\n }\n ]\n },\n {\n \"type\": \"SELECT\",\n \"name\": \"objectPropertiesFromVariable\",\n \"displayName\": \"Load Properties From Variable\",\n \"macrosInSelect\": true,\n \"selectItems\": [\n {\n \"value\": false,\n \"displayValue\": \"False\"\n }\n ],\n \"simpleValueType\": true,\n \"help\": \"You can use a variable that returns a JavaScript object with the properties you want to use. This object will be merged with any additional properties you add via the table below. Any conflicts will be resolved in favor of the properties you add to the table.\"\n },\n {\n \"name\": \"objectPropertyList\",\n \"simpleTableColumns\": [\n {\n \"valueValidators\": [],\n \"defaultValue\": \"\",\n \"displayName\": \"Property Name\",\n \"name\": \"name\",\n \"isUnique\": true,\n \"type\": \"TEXT\"\n },\n {\n \"defaultValue\": \"\",\n \"displayName\": \"Property Value\",\n \"name\": \"value\",\n \"type\": \"TEXT\"\n }\n ],\n \"type\": \"SIMPLE_TABLE\",\n \"newRowButtonText\": \"Add property\"\n }\n ]\n },\n {\n \"displayName\": \"More Settings\",\n \"name\": \"moreSettingsGroup\",\n \"groupStyle\": \"ZIPPY_CLOSED\",\n \"type\": \"GROUP\",\n \"subParams\": [\n {\n \"help\": \"Facebook collects some metadata (e.g. structured data) and user interactions (e.g. clicks) automatically. Check this box to disable this automatic configuration of the pixel.\",\n \"simpleValueType\": true,\n \"name\": \"disableAutoConfig\",\n \"checkboxText\": \"Disable Automatic Configuration\",\n \"type\": \"CHECKBOX\"\n },\n {\n \"type\": \"CHECKBOX\",\n \"name\": \"disablePushState\",\n \"checkboxText\": \"Disable History Event Tracking\",\n \"simpleValueType\": true,\n \"help\": \"The Facebook Pixel tracks history events (pushState and replaceState) automatically as PageViews. Check this box to prevent the pixel from tracking such events automatically.\"\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"eventId\",\n \"displayName\": \"Event ID\",\n \"simpleValueType\": true,\n \"help\": \"Set the Event ID parameter in case you are tracking the same event server-side as well. The Event ID can be used to deduplicate the same event if sent from multiple sources. See more \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/marketing-api/conversions-api/deduplicate-pixel-and-server-events/\\\"\\u003ehere\\u003c/a\\u003e.\"\n }\n ]\n }\n]\n\n\n___SANDBOXED_JS_FOR_WEB_TEMPLATE___\n\nconst createQueue = require('createQueue');\nconst callInWindow = require('callInWindow');\nconst aliasInWindow = require('aliasInWindow');\nconst copyFromWindow = require('copyFromWindow');\nconst setInWindow = require('setInWindow');\nconst injectScript = require('injectScript');\nconst makeTableMap = require('makeTableMap');\nconst makeNumber = require('makeNumber');\nconst getType = require('getType');\nconst copyFromDataLayer = require('copyFromDataLayer');\nconst math = require('Math');\nconst log = require('logToConsole');\n\nconst initIds = copyFromWindow('_fbq_gtm_ids') || [];\nconst pixelIds = data.pixelId;\nconst standardEventNames = ['AddPaymentInfo', 'AddToCart', 'AddToWishlist', 'CompleteRegistration', 'Contact', 'CustomizeProduct', 'Donate', 'FindLocation', 'InitiateCheckout', 'Lead', 'PageView', 'Purchase', 'Schedule', 'Search', 'StartTrial', 'SubmitApplication', 'Subscribe', 'ViewContent'];\nconst ecommerce = copyFromDataLayer('ecommerce', 1);\n\n// Helper methods\nconst fail = msg => {\n log(msg);\n data.gtmOnFailure();\n};\n\nconst mergeObj = (obj, obj2) => {\n for (let key in obj2) {\n if (obj2.hasOwnProperty(key)) {\n obj[key] = obj2[key];\n }\n }\n return obj;\n};\n\nconst parseEecObj = prod => {\n return {\n id: prod.id,\n quantity: prod.quantity\n };\n};\n\n// Initialize EEC integration\nlet eventName, action, eecObjectProps;\nif (data.enhancedEcommerce) {\n if (!ecommerce) return fail('Facebook Pixel: No valid \"ecommerce\" object found in dataLayer');\n if (ecommerce.detail) { eventName = 'ViewContent'; action = 'detail'; }\n else if (ecommerce.add) { eventName = 'AddToCart'; action = 'add'; }\n else if (ecommerce.checkout) { eventName = 'InitiateCheckout'; action = 'checkout'; }\n else if (ecommerce.purchase) { eventName = 'Purchase'; action = 'purchase'; }\n else return fail('Facebook Pixel: Most recently pushed \"ecommerce\" object must be one of types \"detail\", \"add\", \"checkout\" or \"purchase\".');\n \n if (!ecommerce[action].products || getType(ecommerce[action].products) !== 'array') return fail('Facebook pixel: Most recently pushed \"ecommerce\" object did not have a valid \"products\" array.');\n eecObjectProps = {\n content_type: 'product',\n contents: ecommerce[action].products.map(parseEecObj),\n value: ecommerce[action].products.reduce((acc, cur) => {\n const curVal = math.round(makeNumber(cur.price || 0) * (cur.quantity || 1) * 100) / 100;\n return acc + curVal;\n }, 0.0),\n currency: ecommerce.currencyCode || 'USD'\n };\n if (['InitiateCheckout', 'Purchase'].indexOf(eventName) > -1) eecObjectProps.num_items = ecommerce[action].products.reduce((acc,cur) => {\n return acc + makeNumber(cur.quantity || 1);\n }, 0);\n}\n\n// Build the fbq() command arguments\nconst cidParams = data.advancedMatchingList && data.advancedMatchingList.length ? makeTableMap(data.advancedMatchingList, 'name', 'value') : {};\nconst objectProps = data.objectPropertyList && data.objectPropertyList.length ? makeTableMap(data.objectPropertyList, 'name', 'value') : {};\nconst objectPropsFromVar = getType(data.objectPropertiesFromVariable) === 'object' ? data.objectPropertiesFromVariable : {};\nconst mergedObjectProps = mergeObj(objectPropsFromVar, objectProps);\nconst finalObjectProps = mergeObj(eecObjectProps || {}, mergedObjectProps);\neventName = eventName || (data.eventName === 'custom' ? data.customEventName : (data.eventName === 'variable' ? data.variableEventName : data.standardEventName));\n\nconst command = standardEventNames.indexOf(eventName) === -1 ? 'trackSingleCustom' : 'trackSingle';\nconst consent = data.consent === false ? 'revoke' : 'grant';\n\n// Utility function to use either fbq.queue[]\n// (if the FB SDK hasn't loaded yet), or fbq.callMethod()\n// if the SDK has loaded.\nconst getFbq = () => {\n // Return the existing 'fbq' global method if available\n let fbq = copyFromWindow('fbq');\n if (fbq) {\n return fbq;\n }\n \n // Initialize the 'fbq' global method to either use\n // fbq.callMethod or fbq.queue)\n setInWindow('fbq', function() { \n const callMethod = copyFromWindow('fbq.callMethod.apply');\n if (callMethod) { \n callInWindow('fbq.callMethod.apply', null, arguments); \n } else { \n callInWindow('fbq.queue.push', arguments);\n }\n });\n aliasInWindow('_fbq', 'fbq');\n \n // Create the fbq.queue\n createQueue('fbq.queue');\n \n // Return the global 'fbq' method, created above\n return copyFromWindow('fbq');\n};\n\n// Get reference to the global method\nconst fbq = getFbq();\n\nfbq('consent', consent);\n\n // Set Data Processing Options\nif (data.dpoLDU) {\n fbq('dataProcessingOptions', ['LDU'], makeNumber(data.dpoCountry), makeNumber(data.dpoState));\n}\n\n// Handle multiple, comma-separated pixel IDs,\n// and initialize each ID if not done already.\npixelIds.split(',').forEach(pixelId => {\n if (initIds.indexOf(pixelId) === -1) {\n \n // If the user has chosen to disable automatic configuration\n if (data.disableAutoConfig) {\n fbq('set', 'autoConfig', false, pixelId);\n }\n \n // If the user has chosen to disable pushState and replaceState tracking\n if (data.disablePushState) {\n setInWindow('fbq.disablePushState', true);\n }\n \t\n \n // Initialize pixel and store in global array\n fbq('init', pixelId, cidParams);\n\n // Monitoring agent string for Tag Setup\n fbq('set','agent','tmSimo-GTM-WebTemplate', pixelId);\n\n initIds.push(pixelId);\n setInWindow('_fbq_gtm_ids', initIds, true);\n \n }\n\n // Call the fbq() method with the parameters defined earlier\n if (data.eventId) {\n fbq(command, pixelId, eventName, finalObjectProps, {eventID: data.eventId});\n } else {\n fbq(command, pixelId, eventName, finalObjectProps);\n }\n});\n\ninjectScript('https://connect.facebook.net/en_US/fbevents.js', data.gtmOnSuccess, data.gtmOnFailure, 'fbPixel');\n\n\n___WEB_PERMISSIONS___\n\n[\n {\n \"instance\": {\n \"key\": {\n \"publicId\": \"access_globals\",\n \"versionId\": \"1\"\n },\n \"param\": [\n {\n \"key\": \"keys\",\n \"value\": {\n \"type\": 2,\n \"listItem\": [\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"fbq\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"_fbq_gtm\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"_fbq\"\n },\n {\n \"type\": 8,\n \"boolean\": false\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"_fbq_gtm_ids\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"fbq.callMethod.apply\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n },\n {\n \"type\": 8,\n \"boolean\": true\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"fbq.queue.push\"\n },\n {\n \"type\": 8,\n \"boolean\": false\n },\n {\n \"type\": 8,\n \"boolean\": false\n },\n {\n \"type\": 8,\n \"boolean\": true\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"fbq.queue\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"fbq.disablePushState\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n }\n ]\n }\n ]\n }\n }\n ]\n },\n \"clientAnnotations\": {\n \"isEditedByUser\": true\n },\n \"isRequired\": true\n },\n {\n \"instance\": {\n \"key\": {\n \"publicId\": \"inject_script\",\n \"versionId\": \"1\"\n },\n \"param\": [\n {\n \"key\": \"urls\",\n \"value\": {\n \"type\": 2,\n \"listItem\": [\n {\n \"type\": 1,\n \"string\": \"https://connect.facebook.net/en_US/fbevents.js\"\n }\n ]\n }\n }\n ]\n },\n \"clientAnnotations\": {\n \"isEditedByUser\": true\n },\n \"isRequired\": true\n },\n {\n \"instance\": {\n \"key\": {\n \"publicId\": \"logging\",\n \"versionId\": \"1\"\n },\n \"param\": [\n {\n \"key\": \"environments\",\n \"value\": {\n \"type\": 1,\n \"string\": \"debug\"\n }\n }\n ]\n },\n \"isRequired\": true\n },\n {\n \"instance\": {\n \"key\": {\n \"publicId\": \"read_data_layer\",\n \"versionId\": \"1\"\n },\n \"param\": [\n {\n \"key\": \"keyPatterns\",\n \"value\": {\n \"type\": 2,\n \"listItem\": [\n {\n \"type\": 1,\n \"string\": \"ecommerce\"\n }\n ]\n }\n }\n ]\n },\n \"clientAnnotations\": {\n \"isEditedByUser\": true\n },\n \"isRequired\": true\n }\n]\n\n\n___TESTS___\n\nscenarios:\n- name: Library is injected\n code: |-\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('injectScript').wasCalledWith(scriptUrl, success, failure, 'fbPixel');\n assertApi('gtmOnSuccess').wasCalled();\n- name: fbq does not exist - method created\n code: |-\n let fbq;\n\n mock('copyFromWindow', key => {\n if (key === 'fbq') return fbq;\n });\n\n mock('createQueue', key => {});\n\n mock('setInWindow', (key, val) => {\n if (key === 'fbq') fbq = val;\n });\n\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('aliasInWindow').wasCalledWith('_fbq', 'fbq');\n assertApi('setInWindow').wasCalled();\n assertApi('gtmOnSuccess').wasCalled();\n- name: fbq exists - method copied\n code: |-\n mock('setInWindow', key => {\n if (key === 'fbq') fail('setInWindow called with fbq even though variable exists');\n });\n\n mock('createQueue', key => {});\n\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('gtmOnSuccess').wasCalled();\n- name: makeTableMap called\n code: |-\n mockData.advancedMatching = true;\n\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('makeTableMap').wasCalledWith(mockData.advancedMatchingList, 'name', 'value');\n assertApi('makeTableMap').wasCalledWith(mockData.objectPropertyList, 'name', 'value');\n assertApi('gtmOnSuccess').wasCalled();\n- name: Consent set\n code: |-\n mock('copyFromWindow', key => {\n if (key === 'fbq') return function() {\n if (arguments[0] === 'consent') {\n assertThat(arguments[1], 'Consent set incorrectly').isEqualTo('grant');\n }\n };\n });\n\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('gtmOnSuccess').wasCalled();\n- name: DPO LDU set\n code: |-\n mockData.dpoLDU = true;\n mockData.dpoCountry = '0';\n mockData.dpoState = '0';\n\n mock('copyFromWindow', key => {\n if (key === 'fbq') return function() {\n if (arguments[0] === 'consent') {\n assertThat(arguments[1], 'Consent set incorrectly').isEqualTo('grant');\n }\n if (arguments[0] === 'dataProcessingOptions') {\n assertThat(arguments[1], 'LDU array value not set').isEqualTo(['LDU']);\n assertThat(arguments[2], 'LDU country not set').isEqualTo(0);\n assertThat(arguments[3], 'LDU state not set').isEqualTo(0);\n }\n };\n });\n\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('gtmOnSuccess').wasCalled();\n- name: DPO LDU not set\n code: |-\n mock('copyFromWindow', key => {\n if (key === 'fbq') return function() {\n if (arguments[0] === 'consent') {\n assertThat(arguments[1], 'Consent set incorrectly').isEqualTo('grant');\n }\n if (arguments[0] === 'dataProcessingOptions') {\n fail('dataProcessingOptions called even though DPO was not set');\n }\n };\n });\n\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('gtmOnSuccess').wasCalled();\n- name: Pixel IDs set - do not initialize\n code: |-\n mock('copyFromWindow', key => {\n if (key === '_fbq_gtm_ids') return ['12345', '23456'];\n if (key === 'fbq') return function() {\n if (arguments[0] === 'init') fail('init called even though pixel IDs already initialized');\n };\n });\n\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('gtmOnSuccess').wasCalled();\n- name: Pixel IDs not set - run init process\n code: \"let index = 0;\\nlet count = 0;\\nlet _fbq_gtm_ids;\\n\\nmockData.advancedMatching\\\n \\ = true;\\nmockData.disableAutoConfig = true;\\nmockData.disablePushState = true;\\n\\\n \\nmock('setInWindow', (key, val) => {\\n if (key === 'fbq.disablePushState') count\\\n \\ += 1;\\n if (key === '_fbq_gtm_ids') _fbq_gtm_ids = val;\\n});\\n\\nconst initObj\\\n \\ = {\\n ct: 'Helsinki',\\n cn: 'Finland',\\n external_id: 'UserId'\\n};\\n\\nmock('copyFromWindow',\\\n \\ key => {\\n if (key === 'fbq') return function() {\\n if (arguments[0] ===\\\n \\ 'set' && arguments[1] === 'autoConfig' && arguments[2] === false) {\\n assertThat(arguments[3],\\\n \\ 'autoConfig called with incorrect pixelId').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ }\\n if (arguments[0] === 'set' && arguments[1] === 'agent') {\\n assertThat(arguments[2],\\\n \\ 'agent set with invalid value').isEqualTo('tmSimo-GTM-WebTemplate');\\n \\\n \\ assertThat(arguments[3], 'agent set with invalid pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ index += 1;\\n }\\n if (arguments[0] === 'init') {\\n assertThat(arguments[1],\\\n \\ 'init called with incorrect pixelId').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'init called with incorrect initObj').isEqualTo(initObj);\\n\\\n \\ } \\n };\\n});\\n\\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\\n \\nassertThat(_fbq_gtm_ids, '_fbq_gtm_ids has incorrect contents').isEqualTo(mockData.pixelId.split(','));\\n\\\n assertThat(index, 'init called incorrect number of times: ' + index).isEqualTo(2);\\n\\\n assertThat(count, 'fbq.disablePushState called incorrect number of times: ' +\\\n \\ count).isEqualTo(2);\\n\\n// Verify that the tag finished successfully.\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Send standard event\n code: \"const eventParams = {\\n prop1: 'val1',\\n prop2: 'val2'\\n};\\n\\nlet index\\\n \\ = 0;\\nmock('copyFromWindow', key => {\\n if (key === 'fbq') return function()\\\n \\ {\\n if (arguments[0] === 'trackSingle') {\\n assertThat(arguments[1],\\\n \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo(mockData.standardEventName);\\n\\\n \\ assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(eventParams);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Send custom event\n code: \"mockData.eventName = 'custom';\\n\\nconst eventParams = {\\n prop1: 'val1',\\n\\\n \\ prop2: 'val2'\\n};\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n if\\\n \\ (key === 'fbq') return function() {\\n if (arguments[0] === 'trackSingleCustom')\\\n \\ {\\n assertThat(arguments[1], 'trackSingleCustom called with incorrect pixel\\\n \\ ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n assertThat(arguments[2],\\\n \\ 'trackSingleCustom called with incorrect event name').isEqualTo(mockData.customEventName);\\n\\\n \\ assertThat(arguments[3], 'trackSingleCustom called with incorrect event\\\n \\ parameters').isEqualTo(eventParams);\\n index += 1;\\n }\\n };\\n});\\n\\\n \\ \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\n//\\\n \\ Verify that the tag finished successfully.\\nassertThat(index, 'trackSingleCustom\\\n \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Send variable event with standard name\n code: \"mockData.eventName = 'variable';\\nmockData.variableEventName = 'PageView';\\n\\\n \\nconst eventParams = {\\n prop1: 'val1',\\n prop2: 'val2'\\n};\\n\\nlet index =\\\n \\ 0;\\nmock('copyFromWindow', key => {\\n if (key === 'fbq') return function()\\\n \\ {\\n if (arguments[0] === 'trackSingle') {\\n assertThat(arguments[1],\\\n \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo(mockData.variableEventName);\\n\\\n \\ assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(eventParams);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Send variable event with custom name\n code: \"mockData.eventName = 'variable';\\nmockData.variableEventName = 'custom';\\n\\\n \\nconst eventParams = {\\n prop1: 'val1',\\n prop2: 'val2'\\n};\\n\\nlet index =\\\n \\ 0;\\nmock('copyFromWindow', key => {\\n if (key === 'fbq') return function()\\\n \\ {\\n if (arguments[0] === 'trackSingleCustom') {\\n assertThat(arguments[1],\\\n \\ 'trackSingleCustom called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingleCustom called with incorrect event\\\n \\ name').isEqualTo(mockData.variableEventName);\\n assertThat(arguments[3],\\\n \\ 'trackSingleCustom called with incorrect event parameters').isEqualTo(eventParams);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingleCustom called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Send event parameters from a variable\n code: \"mockData.objectPropertiesFromVariable = {\\n prop1: 'val1',\\n prop2: 'val2'\\n\\\n };\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n if (key === 'fbq') return\\\n \\ function() {\\n if (arguments[0] === 'trackSingle') {\\n assertThat(arguments[1],\\\n \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo(mockData.standardEventName);\\n\\\n \\ assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockData.objectPropertiesFromVariable);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Enhanced Ecommerce integration fails with invalid object\n code: |-\n mockData.enhancedEcommerce = true;\n\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('logToConsole').wasCalledWith('Facebook Pixel: No valid \"ecommerce\" object found in dataLayer');\n assertApi('gtmOnFailure').wasCalled();\n assertApi('gtmOnSuccess').wasNotCalled();\n- name: Enhanced Ecommerce integration fails with invalid action\n code: |-\n mockData.enhancedEcommerce = true;\n\n mock('copyFromDataLayer', key => {\n if (key === 'ecommerce') return {\n invalid: true\n };\n });\n\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('logToConsole').wasCalledWith('Facebook Pixel: Most recently pushed \"ecommerce\" object must be one of types \"detail\", \"add\", \"checkout\" or \"purchase\".');\n assertApi('gtmOnFailure').wasCalled();\n assertApi('gtmOnSuccess').wasNotCalled();\n- name: Enhanced Ecommerce ViewContent works\n code: \"mockData.enhancedEcommerce = true;\\nmockData.objectPropertyList = {};\\n\\n\\\n mock('copyFromDataLayer', key => {\\n if (key === 'ecommerce') return {\\n currencyCode:\\\n \\ 'EUR',\\n detail: {\\n products: mockEec.gtm.products\\n }\\n };\\n});\\n\\\n \\nlet index = 0;\\nmock('copyFromWindow', key => {\\n if (key === 'fbq') return\\\n \\ function() {\\n if (arguments[0] === 'trackSingle') {\\n assertThat(arguments[1],\\\n \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('ViewContent');\\n\\\n \\ assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Enhanced Ecommerce AddToCart works\n code: \"mockData.enhancedEcommerce = true;\\nmockData.objectPropertyList = {};\\n\\n\\\n mock('copyFromDataLayer', key => {\\n if (key === 'ecommerce') return {\\n currencyCode:\\\n \\ 'EUR',\\n add: {\\n products: mockEec.gtm.products\\n }\\n };\\n});\\n\\\n \\nlet index = 0;\\nmock('copyFromWindow', key => {\\n if (key === 'fbq') return\\\n \\ function() {\\n if (arguments[0] === 'trackSingle') {\\n assertThat(arguments[1],\\\n \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('AddToCart');\\n\\\n \\ assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Enhanced Ecommerce InitiateCheckout works\n code: \"mockData.enhancedEcommerce = true;\\nmockEec.fb.num_items = 3;\\nmockData.objectPropertyList\\\n \\ = {};\\n\\nmock('copyFromDataLayer', key => {\\n if (key === 'ecommerce') return\\\n \\ {\\n currencyCode: 'EUR',\\n checkout: {\\n products: mockEec.gtm.products\\n\\\n \\ }\\n };\\n});\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n if (key\\\n \\ === 'fbq') return function() {\\n if (arguments[0] === 'trackSingle') {\\n\\\n \\ assertThat(arguments[1], 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('InitiateCheckout');\\n\\\n \\ assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Enhanced Ecommerce Purchase works\n code: \"mockData.enhancedEcommerce = true;\\nmockEec.fb.num_items = 3;\\nmockData.objectPropertyList\\\n \\ = {};\\n\\nmock('copyFromDataLayer', key => {\\n if (key === 'ecommerce') return\\\n \\ {\\n currencyCode: 'EUR',\\n purchase: {\\n products: mockEec.gtm.products\\n\\\n \\ }\\n };\\n});\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n if (key\\\n \\ === 'fbq') return function() {\\n if (arguments[0] === 'trackSingle') {\\n\\\n \\ assertThat(arguments[1], 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('Purchase');\\n\\\n \\ assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Object merge with variable and list works\n code: \"mockData.objectPropertiesFromVariable = {\\n prop1: 'var1',\\n prop2: 'var2',\\n\\\n \\ prop3: 'var3'\\n};\\n\\nconst expected = {\\n prop1: 'val1',\\n prop2: 'val2',\\n\\\n \\ prop3: 'var3'\\n};\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n if\\\n \\ (key === 'fbq') return function() {\\n if (arguments[0] === 'trackSingle')\\\n \\ {\\n assertThat(arguments[1], 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('PageView');\\n\\\n \\ assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(expected);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Object merge with variable, list and eec works\n code: \"mockData.enhancedEcommerce = true;\\nmockData.objectPropertiesFromVariable\\\n \\ = {\\n content_type: 'product_group'\\n};\\nmockData.objectPropertyList = [{\\n\\\n \\ name: 'currency',\\n value: 'USD'\\n}];\\nmockEec.fb.num_items = 3;\\nmockEec.fb.content_type\\\n \\ = 'product_group';\\nmockEec.fb.currency = 'USD';\\n\\nmock('copyFromDataLayer',\\\n \\ key => {\\n if (key === 'ecommerce') return {\\n currencyCode: 'EUR',\\n \\\n \\ purchase: {\\n products: mockEec.gtm.products\\n }\\n };\\n});\\n\\nlet\\\n \\ index = 0;\\nmock('copyFromWindow', key => {\\n if (key === 'fbq') return function()\\\n \\ {\\n if (arguments[0] === 'trackSingle') {\\n assertThat(arguments[1],\\\n \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('Purchase');\\n\\\n \\ assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Send event ID\n code: \"mockData.eventId = 'eventId';\\n\\nmock('copyFromWindow', key => {\\n if (key\\\n \\ === 'fbq') return function() {\\n if (arguments[0] === 'trackSingle') {\\n\\\n \\ assertThat(arguments[4], 'eventID not included in hit').isEqualTo({eventID:\\\n \\ mockData.eventId});\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\nsetup: \"const mockData = {\\n pixelId: '12345,23456',\\n eventName: 'standard',\\n\\\n \\ standardEventName: 'PageView',\\n customEventName: 'custom',\\n variableEventName:\\\n \\ 'standard',\\n consent: true,\\n advancedMatching: false,\\n advancedMatchingList:\\\n \\ [{name: 'ct', value: 'Helsinki'},{name: 'cn', value: 'Finland'},{name: 'external_id',\\\n \\ value: 'UserId'}],\\n objectPropertiesFromVariable: false,\\n objectPropertyList:\\\n \\ [{name: 'prop1', value: 'val1'},{name: 'prop2', value: 'val2'}],\\n disableAutoConfig:\\\n \\ false,\\n disablePushState: false,\\n enhancedEcommerce: false,\\n eventId: ''\\n\\\n };\\n\\nconst mockEec = {\\n gtm: { \\n products: [{\\n id: 'i1',\\n name:\\\n \\ 'n1',\\n category: 'c1',\\n price: '1.00',\\n quantity: 1\\n },{\\n\\\n \\ id: 'i2',\\n name: 'n2',\\n category: 'c2',\\n price: '2.00',\\n\\\n \\ quantity: 2\\n }]\\n },\\n fb: {\\n content_type: 'product',\\n contents:\\\n \\ [{\\n id: 'i1',\\n quantity: 1\\n },{\\n id: 'i2',\\n quantity:\\\n \\ 2\\n }],\\n currency: 'EUR',\\n value: 5.00\\n }\\n};\\n\\nconst scriptUrl\\\n \\ = 'https://connect.facebook.net/en_US/fbevents.js';\\n\\n// Create injectScript\\\n \\ mock\\nlet success, failure;\\nmock('injectScript', (url, onsuccess, onfailure)\\\n \\ => {\\n success = onsuccess;\\n failure = onfailure;\\n onsuccess();\\n});\\n\\n\\\n mock('copyFromWindow', key => {\\n if (key === 'fbq') return () => {};\\n});\"\n\n\n___NOTES___\n\nCreated on 18/05/2019, 21:57:16\n\n\n", "galleryReference": { "host": "github.com", "owner": "facebookarchive", "repository": "GoogleTagManager-WebTemplate-For-FacebookPixel", "version": "11c004614f6b8f7cc999caabef521086116ce302", "signature": "de30f66e675f24ef8640cea7175b615c94807fa8f027929f94c3d0b45a520d86" } }, { "accountId": "1424898657", "containerId": "70755865", "templateId": "427", "name": "TikTok Pixel", "fingerprint": "1767787986615", "templateData": "___TERMS_OF_SERVICE___\n\nBy creating or modifying this file you agree to Google Tag Manager's Community\nTemplate Gallery Developer Terms of Service available at\nhttps://developers.google.com/tag-manager/gallery-tos (or such other URL as\nGoogle may provide), as modified from time to time.\n\n\n___INFO___\n\n{\n \"type\": \"TAG\",\n \"id\": \"cvt_temp_public_id\",\n \"version\": 1,\n \"securityGroups\": [],\n \"displayName\": \"TikTok Pixel\",\n \"categories\": [\n \"ADVERTISING\",\n \"ANALYTICS\"\n ],\n \"brand\": {\n \"id\": \"github.com_tiktok\",\n \"displayName\": \"tiktok\",\n \"thumbnail\": \"data:image/png;base64,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\\u003d\\u003d\"\n },\n \"description\": \"Install TikTok Pixel easily to your site without the need to write a line of code.\",\n \"containerContexts\": [\n \"WEB\"\n ]\n}\n\n\n___TEMPLATE_PARAMETERS___\n\n[\n {\n \"type\": \"GROUP\",\n \"name\": \"Section 1 - TikTok Event Configuration\",\n \"displayName\": \"TikTok Event Configuration\",\n \"groupStyle\": \"NO_ZIPPY\",\n \"subParams\": [\n {\n \"type\": \"TEXT\",\n \"name\": \"pixel_code\",\n \"displayName\": \"Pixel ID\",\n \"simpleValueType\": true,\n \"valueValidators\": [],\n \"help\": \"You can find your Pixel ID in Events Manager\",\n \"valueHint\": \"CD9079RC77U0N3GBV16Y\"\n },\n {\n \"type\": \"SELECT\",\n \"name\": \"event\",\n \"displayName\": \"Event Name\",\n \"macrosInSelect\": true,\n \"selectItems\": [\n {\n \"value\": \"CompletePayment\",\n \"displayValue\": \"CompletePayment\"\n },\n {\n \"value\": \"AddToCart\",\n \"displayValue\": \"AddToCart\"\n },\n {\n \"value\": \"ViewContent\",\n \"displayValue\": \"ViewContent\"\n },\n {\n \"value\": \"InitiateCheckout\",\n \"displayValue\": \"InitiateCheckout\"\n },\n {\n \"value\": \"AddToWishlist\",\n \"displayValue\": \"AddToWishlist\"\n },\n {\n \"value\": \"AddPaymentInfo\",\n \"displayValue\": \"AddPaymentInfo\"\n },\n {\n \"value\": \"PlaceAnOrder\",\n \"displayValue\": \"PlaceAnOrder\"\n },\n {\n \"value\": \"Contact\",\n \"displayValue\": \"Contact\"\n },\n {\n \"value\": \"Download\",\n \"displayValue\": \"Download\"\n },\n {\n \"value\": \"SubmitForm\",\n \"displayValue\": \"SubmitForm\"\n },\n {\n \"value\": \"CompleteRegistration\",\n \"displayValue\": \"CompleteRegistration\"\n },\n {\n \"value\": \"Subscribe\",\n \"displayValue\": \"Subscribe\"\n },\n {\n \"value\": \"ClickButton\",\n \"displayValue\": \"ClickButton\"\n },\n {\n \"value\": \"Search\",\n \"displayValue\": \"Search\"\n }\n ],\n \"simpleValueType\": true,\n \"help\": \"TikTok supports 14 standard events. You may refer to our \\u003ca href\\u003d\\\"https://ads.tiktok.com/help/article?aid\\u003d10028\\\" target\\u003d\\\"_blank\\\"\\u003edocumentation\\u003c/a\\u003e and choose a suitable event to tag.\",\n \"defaultValue\": \"{{Event}}\"\n }\n ],\n \"help\": \"\\u003ca href\\u003d\\\"https://business-api.tiktok.com/portal/docs?id\\u003d1799004006287425\\\" target\\u003d\\\"_blank\\\"\\u003eLearn more\\u003c/a\\u003e about using TikTok Pixel with Google Tag Manager.\"\n },\n {\n \"type\": \"GROUP\",\n \"name\": \"Section 3 - Parameter Override\",\n \"displayName\": \"Parameter Override\",\n \"groupStyle\": \"ZIPPY_CLOSED\",\n \"subParams\": [\n {\n \"type\": \"LABEL\",\n \"name\": \"Parameter Override Description\",\n \"displayName\": \"\\u003ca target\\u003d\\\"_blank\\\" href\\u003d\\\"https://business-api.tiktok.com/portal/docs?id\\u003d1799004110681154#item-link-How%20to%20set%20up%20deduplication\\\"\\u003eLearn more\\u003c/a\\u003e about how to manually configure event parameters with \\\"Parameter Override\\\".\"\n },\n {\n \"type\": \"GROUP\",\n \"name\": \"Advanced Matching Configurations\",\n \"displayName\": \"Advanced Matching Configurations\",\n \"groupStyle\": \"NO_ZIPPY\",\n \"subParams\": [\n {\n \"type\": \"RADIO\",\n \"name\": \"hash\",\n \"displayName\": \"Hashed / Non-Hashed AM Parameters\",\n \"radioItems\": [\n {\n \"value\": \"hashed\",\n \"displayValue\": \"SHA256 AM Parameters\"\n },\n {\n \"value\": \"non-hashed\",\n \"displayValue\": \"Plain AM Parameters\",\n \"help\": \"TikTok Pixel will hash plain email and phone for you\"\n }\n ],\n \"simpleValueType\": true,\n \"help\": \"Tell us if your AM parameters have been hashed.\"\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"email\",\n \"displayName\": \"Email\",\n \"simpleValueType\": true,\n \"enablingConditions\": [\n {\n \"paramName\": \"hash\",\n \"paramValue\": \"non-hashed\",\n \"type\": \"EQUALS\"\n }\n ]\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"phone\",\n \"displayName\": \"Phone\",\n \"simpleValueType\": true,\n \"enablingConditions\": [\n {\n \"paramName\": \"hash\",\n \"paramValue\": \"non-hashed\",\n \"type\": \"EQUALS\"\n }\n ],\n \"help\": \"If the country code is 86, then do not include country code (example: 13800000000). Otherwise, include country code with + and remove any other characters (spaces, \\u0027-\\u0027) between numbers (example for US: +12133734253).\"\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"external_id\",\n \"displayName\": \"External ID\",\n \"simpleValueType\": true,\n \"enablingConditions\": [\n {\n \"paramName\": \"hash\",\n \"paramValue\": \"non-hashed\",\n \"type\": \"EQUALS\"\n }\n ],\n \"help\": \"Any unique identifier on the advertiser\\u0027s side, such as loyalty membership ID, user ID, or external cookie ID.\"\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"sha256_email\",\n \"displayName\": \"SHA256 Hashed Email\",\n \"simpleValueType\": true,\n \"enablingConditions\": [\n {\n \"paramName\": \"hash\",\n \"paramValue\": \"hashed\",\n \"type\": \"EQUALS\"\n }\n ]\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"sha256_phone\",\n \"displayName\": \"SHA256 Hashed Phone\",\n \"simpleValueType\": true,\n \"enablingConditions\": [\n {\n \"paramName\": \"hash\",\n \"paramValue\": \"hashed\",\n \"type\": \"EQUALS\"\n }\n ],\n \"help\": \"If the country code is 86, then do not include country code (example: 13800000000). Otherwise, include country code with + and remove any other characters (spaces, \\u0027-\\u0027) between numbers (example for US: +12133734253).\"\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"sha256_external_id\",\n \"displayName\": \"SHA256 Hashed External ID\",\n \"simpleValueType\": true,\n \"enablingConditions\": [\n {\n \"paramName\": \"hash\",\n \"paramValue\": \"hashed\",\n \"type\": \"EQUALS\"\n }\n ],\n \"help\": \"Any unique identifier on the advertiser\\u0027s side, such as loyalty membership ID, user ID, or external cookie ID.\"\n }\n ],\n \"help\": \"Advance matching parameters are hashed and then shared with TikTok to help attribute more conversions to your ads and improve ad retargeting. \\u003cbr\\u003e \\u003ca target\\u003d\\\"_blank\\\" href\\u003d\\\"https://business-api.tiktok.com/portal/docs?id\\u003d1799004110681154#item-link-User%20data\\\"\\u003eLearn more\\u003c/a\\u003e about how to format Advanced Matching parameters.\"\n },\n {\n \"type\": \"GROUP\",\n \"name\": \"Properties\",\n \"displayName\": \"Properties (e.g. product data)\",\n \"groupStyle\": \"NO_ZIPPY\",\n \"subParams\": [\n {\n \"type\": \"CHECKBOX\",\n \"name\": \"enhance_ecomm\",\n \"checkboxText\": \"Use Google Analytics E-commerce Data Layers (Recommended)\",\n \"simpleValueType\": true,\n \"help\": \"If you have Google\\u0027s \\u003ca href\\u003d\\\"https://developers.google.com/analytics/devguides/collection/ga4/ecommerce?client_type\\u003dgtm#implementation\\\" target\\u003d\\\"_blank\\\"\\u003eEnhanced E-Commerce\\u003c/a\\u003e or \\u003ca href\\u003d\\\"https://support.google.com/tagmanager/answer/6107169?hl\\u003den#standard-ecommerce\\\" target\\u003d\\\"_blank\\\"\\u003e Standard E-Commerce\\u003c/a\\u003e Data Layers set up to collect information about the shopping behavior of your users. TikTok will automatically collect these data as parameters to help you improve your ad performance.\",\n \"defaultValue\": true\n },\n {\n \"type\": \"RADIO\",\n \"name\": \"ga_ecomm\",\n \"displayName\": \"Google Analytics E-commerce Data Layers\",\n \"radioItems\": [\n {\n \"value\": \"ecomm\",\n \"displayValue\": \"Standard Ecommerce\"\n },\n {\n \"value\": \"enhance_ecomm\",\n \"displayValue\": \"Enhanced Ecommerce\"\n }\n ],\n \"simpleValueType\": true,\n \"enablingConditions\": [\n {\n \"paramName\": \"enhance_ecomm\",\n \"paramValue\": true,\n \"type\": \"EQUALS\"\n }\n ],\n \"defaultValue\": \"ecomm\"\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"ecomm_currency\",\n \"displayName\": \"Currency\",\n \"simpleValueType\": true,\n \"valueHint\": \"USD\",\n \"help\": \"If you haven\\u0027t added the currency to the e-commerce data layer, add the current code here. Note: Adding the code will replace the \\u0027currency code\\u0027 or \\u0027currency\\u0027 field from your data layer.\",\n \"enablingConditions\": [\n {\n \"paramName\": \"enhance_ecomm\",\n \"paramValue\": true,\n \"type\": \"EQUALS\"\n }\n ]\n },\n {\n \"type\": \"RADIO\",\n \"name\": \"single_multi_product\",\n \"displayName\": \"Manually Input Single / Multiple Products from Data Layer\",\n \"radioItems\": [\n {\n \"value\": \"single\",\n \"displayValue\": \"Single Content\"\n },\n {\n \"value\": \"multiple\",\n \"displayValue\": \"Multiple Contents\",\n \"help\": \"Send a list of contents as a JSON string. \\u003ca href\\u003d\\\"https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON\\\" target\\u003d\\\"_blank\\\"\\u003eLearn more about JSON\\u003c/a\\u003e\"\n },\n {\n \"value\": \"empty\",\n \"displayValue\": \"No Contents\"\n }\n ],\n \"simpleValueType\": true,\n \"enablingConditions\": [\n {\n \"paramName\": \"enhance_ecomm\",\n \"paramValue\": false,\n \"type\": \"EQUALS\"\n }\n ]\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"contents\",\n \"displayName\": \"contents\",\n \"simpleValueType\": true,\n \"enablingConditions\": [\n {\n \"paramName\": \"single_multi_product\",\n \"paramValue\": \"multiple\",\n \"type\": \"EQUALS\"\n }\n ],\n \"help\": \"Please make sure \\\"contents\\\" is \\u003ca href\\u003d\\\"https://business-api.tiktok.com/portal/docs?id\\u003d1799004110681154#item-link-contents%20parameters\\\" target\\u003d\\\"_blank\\\"\\u003ea list of valid content objects\\u003c/a\\u003e or encoded as \\u003ca href\\u003d\\\"https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/JSON\\\" target\\u003d\\\"_blank\\\"\\u003ea valid JSON string\\u003c/a\\u003e.\",\n \"valueHint\": \"[{\\\"content_id\\\": \\\"abc\\\", \\\"price\\\": 10, \\\"quantity\\\": 1}]\"\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"content_id\",\n \"displayName\": \"content_id\",\n \"simpleValueType\": true,\n \"enablingConditions\": [\n {\n \"paramName\": \"single_multi_product\",\n \"paramValue\": \"single\",\n \"type\": \"EQUALS\"\n }\n ],\n \"help\": \"Recommended: Unique ID of the item, either SKU ID or item group ID\"\n },\n {\n \"type\": \"SELECT\",\n \"name\": \"content_type\",\n \"displayName\": \"content_type\",\n \"macrosInSelect\": false,\n \"selectItems\": [\n {\n \"value\": \"product\",\n \"displayValue\": \"product\"\n },\n {\n \"value\": \"product_group\",\n \"displayValue\": \"product_group\"\n }\n ],\n \"simpleValueType\": true,\n \"enablingConditions\": [\n {\n \"paramName\": \"single_multi_product\",\n \"paramValue\": \"single\",\n \"type\": \"EQUALS\"\n }\n ],\n \"help\": \"Recommended: Select \\\"product\\\" if your content_id is SKU ID, or select \\\"product_group\\\" if your content_id is item group ID\",\n \"notSetText\": \"\"\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"content_name\",\n \"displayName\": \"content_name\",\n \"simpleValueType\": true,\n \"enablingConditions\": [\n {\n \"paramName\": \"single_multi_product\",\n \"paramValue\": \"single\",\n \"type\": \"EQUALS\"\n }\n ],\n \"help\": \"Recommended: Title of your product or page\"\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"content_category\",\n \"displayName\": \"content_category\",\n \"simpleValueType\": true,\n \"help\": \"Recommended: Category of the product or page\",\n \"enablingConditions\": [\n {\n \"paramName\": \"single_multi_product\",\n \"paramValue\": \"single\",\n \"type\": \"EQUALS\"\n }\n ]\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"price\",\n \"displayName\": \"price\",\n \"simpleValueType\": true,\n \"enablingConditions\": [\n {\n \"paramName\": \"single_multi_product\",\n \"paramValue\": \"single\",\n \"type\": \"EQUALS\"\n }\n ],\n \"help\": \"Recommended: Price of this item\"\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"quantity\",\n \"displayName\": \"quantity\",\n \"simpleValueType\": true,\n \"enablingConditions\": [\n {\n \"paramName\": \"single_multi_product\",\n \"paramValue\": \"single\",\n \"type\": \"EQUALS\"\n }\n ],\n \"help\": \"Recommended: Quantity of this item\"\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"value\",\n \"displayName\": \"value\",\n \"simpleValueType\": true,\n \"enablingConditions\": [\n {\n \"paramName\": \"enhance_ecomm\",\n \"paramValue\": false,\n \"type\": \"EQUALS\"\n }\n ],\n \"help\": \"Recommended: Total value of the order\"\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"currency\",\n \"displayName\": \"currency\",\n \"simpleValueType\": true,\n \"enablingConditions\": [\n {\n \"paramName\": \"enhance_ecomm\",\n \"paramValue\": false,\n \"type\": \"EQUALS\"\n }\n ],\n \"help\": \"Recommended: ISO 4217 code. Examples: \\\"EUR\\\", \\\"USD\\\", \\\"JPY\\\". See \\u003ca href\\u003d\\\"https://ads.tiktok.com/help/article/about-parameters?lang\\u003den\\\" target\\u003d\\\"_blank\\\"\\u003ehere\\u003c/a\\u003e for a list of currencies supported.\"\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"description\",\n \"displayName\": \"description\",\n \"simpleValueType\": true,\n \"help\": \"Recommended: Description of the product or page\",\n \"enablingConditions\": [\n {\n \"paramName\": \"enhance_ecomm\",\n \"paramValue\": false,\n \"type\": \"EQUALS\"\n }\n ]\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"brand\",\n \"displayName\": \"brand\",\n \"simpleValueType\": true,\n \"help\": \"Recommended: Brand name of the product\",\n \"enablingConditions\": [\n {\n \"paramName\": \"enhance_ecomm\",\n \"paramValue\": false,\n \"type\": \"EQUALS\"\n }\n ]\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"query\",\n \"displayName\": \"query\",\n \"simpleValueType\": true,\n \"help\": \"Recommended for Search events: The text string that was searched for. For instance, a person searches for a product on your website, you can forward the keyword being searched here.\",\n \"enablingConditions\": [\n {\n \"paramName\": \"enhance_ecomm\",\n \"paramValue\": false,\n \"type\": \"EQUALS\"\n }\n ]\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"status\",\n \"displayName\": \"status\",\n \"simpleValueType\": true,\n \"help\": \"Optional: Status of an order, item, or service.\",\n \"enablingConditions\": [\n {\n \"paramName\": \"enhance_ecomm\",\n \"paramValue\": false,\n \"type\": \"EQUALS\"\n }\n ]\n }\n ],\n \"help\": \"Configure and send \\u003ca href\\u003d\\\"https://business-api.tiktok.com/portal/docs?id\\u003d1799004110681154#item-link-Product%20data\\\" target\\u003d\\\"_blank\\\"\\u003eadditional parameters\\u003c/a\\u003e to TikTok for to improve Ad performance and unlock Ad features.\"\n },\n {\n \"type\": \"GROUP\",\n \"name\": \"De-duplication Configurations\",\n \"displayName\": \"De-duplication Configurations\",\n \"groupStyle\": \"NO_ZIPPY\",\n \"subParams\": [\n {\n \"type\": \"TEXT\",\n \"name\": \"event_id\",\n \"displayName\": \"Event ID\",\n \"simpleValueType\": true\n }\n ],\n \"help\": \"If you use both TikTok Pixel template and Events API template to send events, you can set up Event ID to deduplicate the two sources. \\u003ca target\\u003d\\\"_blank\\\" href\\u003d\\\"https://business-api.tiktok.com/portal/docs?id\\u003d1799004097478658#item-link-How%20to%20set%20up%20deduplication\\\"\\u003eLearn more\\u003c/a\\u003e about how to set up deduplication.\"\n }\n ]\n },\n {\n \"type\": \"GROUP\",\n \"name\": \"Section 2 - Additional Properties\",\n \"displayName\": \"Additional Properties\",\n \"groupStyle\": \"ZIPPY_CLOSED\",\n \"subParams\": [\n {\n \"type\": \"LABEL\",\n \"name\": \"Description\",\n \"displayName\": \"You may configure and send more custom parameters to TikTok to unlock additional Ad features targeted at specific verticals (i.e. Travel)\"\n },\n {\n \"type\": \"PARAM_TABLE\",\n \"name\": \"custom_properties\",\n \"displayName\": \"\",\n \"paramTableColumns\": [\n {\n \"param\": {\n \"type\": \"TEXT\",\n \"name\": \"key\",\n \"displayName\": \"Key\",\n \"simpleValueType\": true,\n \"canBeEmptyString\": false\n },\n \"isUnique\": true\n },\n {\n \"param\": {\n \"type\": \"TEXT\",\n \"name\": \"value\",\n \"displayName\": \"Value\",\n \"simpleValueType\": true\n },\n \"isUnique\": false\n }\n ]\n }\n ]\n }\n]\n\n\n___SANDBOXED_JS_FOR_WEB_TEMPLATE___\n\n/*\n * Copyright 2022 ByteDance Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst version = \"0_2_01\";\n\nconst log = require(\"logToConsole\");\nconst copyFromWindow = require(\"copyFromWindow\");\nconst copyFromDataLayer = require(\"copyFromDataLayer\");\nconst makeNumber = require(\"makeNumber\");\nconst callInWindow = require(\"callInWindow\");\nconst Object = require(\"Object\");\nconst JSON = require(\"JSON\");\n\nconst ecommerce = copyFromDataLayer(\"ecommerce\");\nconst eventModel = copyFromDataLayer(\"eventModel\");\nconst userDataFromDataLayer = copyFromDataLayer(\"user_data\");\nconst ttContents = copyFromDataLayer('tt_contents') || (eventModel && eventModel.tt_contents);\nconst ttContentType = copyFromDataLayer('tt_content_type') || (eventModel && eventModel.tt_content_type);\nconst ttExternalId = copyFromDataLayer('tt_external_id') || (eventModel && eventModel.tt_external_id);\n\nconst ValidEvents = {\n ViewContent: 1,\n ClickButton: 1,\n Search: 1,\n AddToWishlist: 1,\n AddToCart: 1,\n InitiateCheckout: 1,\n AddPaymentInfo: 1,\n CompletePayment: 1,\n PlaceAnOrder: 1,\n Contact: 1,\n Download: 1,\n SubmitForm: 1,\n CompleteRegistration: 1,\n Subscribe: 1,\n};\n\nconst TTEventMap = {\n 'add_payment_info': 'AddPaymentInfo',\n 'add_to_cart': 'AddToCart',\n 'add_to_wishlist': 'AddToWishlist',\n 'begin_checkout': 'InitiateCheckout',\n 'page_view': 'Pageview',\n 'purchase': 'CompletePayment',\n 'search': 'Search',\n 'sign_up': 'CompleteRegistration',\n 'view_item': 'ViewContent',\n};\n\nconst checkExistence = (key) => {\n return typeof copyFromWindow(key) !== \"undefined\";\n};\n\nconst looksLikeSHA256 = (s) => {\n return s && s.length == 64;\n};\n\nconst getConfigHash = (data) => {\n // What API is used. 0: None, 1: Tag Manager, 2: Google Tag, 3: Both\n var apiVersion = 0;\n if (ecommerce || userDataFromDataLayer) apiVersion += 1;\n if (eventModel && (eventModel.items || eventModel.value || eventModel.currency || eventModel.user_data)) apiVersion += 2;\n\n var contents = 0;\n if (data.enhance_ecomm == false && data.single_multi_product == \"empty\") contents = 1;\n else if (data.enhance_ecomm == false && data.single_multi_product == \"single\") contents = 2;\n else if (data.enhance_ecomm == false && data.single_multi_product == \"multiple\") contents = 3;\n else if (data.enhance_ecomm == true && data.ga_ecomm == \"enhance_ecomm\") contents = 4;\n else if (data.enhance_ecomm == true && data.ga_ecomm == \"ecomm\") contents = 5;\n\n return '' + apiVersion + contents;\n};\n\nconst getEnhancedEcommerceData = (data, ecommerce) => {\n if (!ecommerce) {\n return null;\n }\n\n if (data.event == \"ViewContent\" && ecommerce.detail && ecommerce.detail.products) {\n return ecommerce.detail.products;\n } else if (data.event == \"AddToCart\" && ecommerce.add && ecommerce.add.products) {\n return ecommerce.add.products;\n } else if ((data.event == \"InitiateCheckout\" || data.event == \"AddPaymentInfo\") && ecommerce.checkout && ecommerce.checkout.products) {\n return ecommerce.checkout.products;\n } else if ((data.event == \"CompletePayment\" || data.event == \"PlaceAnOrder\" || data.event == \"Subscribe\") && ecommerce.purchase && ecommerce.purchase.products) {\n return ecommerce.purchase.products;\n } else {\n if (ecommerce.detail && ecommerce.detail.products)\n return ecommerce.detail.products;\n if (ecommerce.add && ecommerce.add.products)\n return ecommerce.add.products;\n if (ecommerce.checkout && ecommerce.checkout.products)\n return ecommerce.checkout.products;\n if (ecommerce.purchase && ecommerce.purchase.products)\n return ecommerce.purchase.products;\n }\n return null;\n};\n\nconst getItemCategories = (item) => {\n var categories = [];\n if (item.item_category) categories.push(item.item_category);\n if (item.item_category2) categories.push(item.item_category2);\n if (item.item_category3) categories.push(item.item_category3);\n if (item.item_category4) categories.push(item.item_category4);\n if (item.item_category5) categories.push(item.item_category5);\n\n if (categories.length > 0) {\n return categories.join(',');\n }\n\n return null;\n};\n\nconst getEcommerceData = (data, ecommerce) => {\n var value = 0;\n var currency = \"USD\"; // default value\n var contents = [];\n\n /* \n Standard Ecommerce Support. For more details on Ecommerce Data Structure\n https://developers.google.com/analytics/devguides/collection/ga4/ecommerce?client_type=gtm\n We will need to check for standard ecommerce events if Enhanced Ecommerce doesnt work\n */\n const secData = (ecommerce && ecommerce.items) || (eventModel && eventModel.items) || ttContents;\n if (secData) {\n log(\"1a. Standard Ecommerce - Data layers detected\");\n secData.map(function (ed) {\n // Form the TikTok Parameter Object\n var content = {};\n if (ed.item_id) content.content_id = ed.item_id;\n if (!ed.item_id && ed.id) content.content_id = ed.id;\n if (ed.item_name) content.content_name = ed.item_name;\n if (ed.item_brand) content.brand = ed.item_brand;\n var categoryString = getItemCategories(ed);\n if (categoryString) content.content_category = categoryString;\n if (ed.price) content.price = makeNumber(ed.price);\n if (ed.quantity) {\n content.quantity = makeNumber(ed.quantity);\n } else {\n content.quantity = 1;\n }\n content.content_type = ttContentType || \"product\";\n contents.push(content);\n // Calulate the total value shown\n if (ed.price) {\n if (!ed.quantity) ed.quantity = 1;\n value += ed.price * ed.quantity;\n }\n });\n } else if (data.ga_ecomm == \"ecomm\") {\n log(\"1a. Standard Ecommerce - Unable to detect any Data Layers\");\n }\n\n /* \n Enhanced Ecommerce Support. Fore more details on Enhanced Ecommerce Data Structure\n https://developers.google.com/analytics/devguides/collection/ua/gtm/enhanced-ecommerce#details\n ViewContent = detail\n AddToCart = add\n InitiateCheckout, AddPaymentInfo = checkout\n CompletePayment, PlaceAnOrder, Subscribe = purchase\n */\n const eecData = getEnhancedEcommerceData(data, ecommerce);\n if (eecData !== null && contents.length == 0) {\n log(\"1b. Enhanced Ecommerce - Data layers detected\");\n eecData.map(function (ed) {\n // Form the TikTok Parameter Object\n var content = {};\n if (ed.id) content.content_id = ed.id;\n if (ed.name) content.content_name = ed.name;\n if (ed.brand) content.brand = ed.brand;\n if (ed.category) content.content_category = ed.category;\n if (ed.price) content.price = makeNumber(ed.price);\n if (ed.quantity) {\n content.quantity = makeNumber(ed.quantity);\n } else {\n content.quantity = 1;\n }\n content.content_type = ttContentType || \"product\";\n contents.push(content);\n // Calulate the total value shown\n if (ed.price) {\n if (!ed.quantity) ed.quantity = 1;\n value += ed.price * ed.quantity;\n }\n });\n } else if (data.ga_ecomm == \"enhance_ecomm\") {\n log(\"1b. Enhanced Ecommerce - Unable to detect any ecommerce data layers\");\n }\n\n if (data.ecomm_currency)\n currency = data.ecomm_currency;\n else if (ecommerce && ecommerce.currencyCode)\n currency = ecommerce.currencyCode;\n else if (ecommerce && ecommerce.currency)\n currency = ecommerce.currency;\n else if (eventModel && eventModel.currency)\n currency = eventModel.currency;\n\n if (ecommerce && ecommerce.value) {\n value = ecommerce.value;\n } else if (\n ecommerce &&\n ecommerce.purchase &&\n ecommerce.purchase.actionField &&\n ecommerce.purchase.actionField.revenue\n ) {\n value = ecommerce.purchase.actionField.revenue;\n } else if (eventModel && eventModel.value) {\n value = eventModel.value;\n }\n\n return {\n value: value,\n currency: currency,\n contents: contents\n };\n};\n\nconst isHashed = (val) => {\n return val && val.match(\"^[A-Fa-f0-9]{64}$\") != null;\n};\n\nconst getUserDataFromDataLayer = () => {\n var userData = {};\n const email = (userDataFromDataLayer && (userDataFromDataLayer.email_address || userDataFromDataLayer.sha256_email_address)) ||\n (eventModel && eventModel.user_data && (eventModel.user_data.email_address || eventModel.user_data.sha256_email_address));\n if (email) {\n if (isHashed(email)) {\n userData.sha256_email = email;\n } else {\n userData.email = email;\n }\n }\n\n const phone = (userDataFromDataLayer && (userDataFromDataLayer.phone_number || userDataFromDataLayer.sha256_phone_number)) ||\n (eventModel && eventModel.user_data && (eventModel.user_data.phone_number || eventModel.user_data.sha256_phone_number));\n if (phone) {\n if (isHashed(phone)) {\n userData.sha256_phone_number = phone;\n } else {\n userData.phone_number = phone;\n }\n }\n\n if (ttExternalId) {\n userData.external_id = ttExternalId;\n }\n\n return userData;\n};\n\nconst main = () => {\n // Forming the passed in parameters\n var parameters = {\n gtm_version: version + ':' + getConfigHash(data),\n event_trigger_source: 'GoogleTagManagerClient',\n };\n const ttEvent = TTEventMap[data.event] || data.event;\n\n // Check if enhance ecomm is enabled.\n if (data.enhance_ecomm == true) {\n const ecomData = getEcommerceData(data, ecommerce);\n parameters.currency = ecomData.currency;\n parameters.value = ecomData.value;\n if (ecomData.contents && ecomData.contents.length > 0) {\n parameters.contents = ecomData.contents;\n }\n } else {\n if (data.single_multi_product == \"single\") {\n // Single Content\n if (data.content_id) parameters.content_id = data.content_id;\n if (data.content_type || ttContentType) parameters.content_type = data.content_type || ttContentType;\n if (data.content_name) parameters.content_name = data.content_name;\n if (data.price) parameters.price = makeNumber(data.price);\n if (data.quantity) parameters.quantity = makeNumber(data.quantity);\n if (data.currency) parameters.currency = data.currency;\n if (data.value) {\n parameters.value = makeNumber(data.value);\n } else {\n if (data.price && data.quantity) {\n parameters.value = makeNumber(data.price) * makeNumber(data.quantity);\n }\n }\n if (data.content_category)\n parameters.content_category = data.content_category;\n if (data.description) parameters.description = data.description;\n if (data.query) parameters.query = data.query;\n if (data.status) parameters.status = data.status;\n } else if (data.single_multi_product == \"multiple\") {\n // Multiple Content\n if (data.contents) {\n const parsedContents = JSON.parse(data.contents);\n if (parsedContents !== undefined) {\n parameters.contents = parsedContents;\n } else {\n parameters.contents = data.contents;\n }\n }\n if (data.currency) parameters.currency = data.currency;\n if (data.value) parameters.value = makeNumber(data.value);\n if (data.description) parameters.description = data.description;\n if (data.query) parameters.query = data.query;\n if (data.status) parameters.status = data.status;\n } else if (data.single_multi_product == \"empty\") {\n // No Content\n if (data.currency) parameters.currency = data.currency;\n if (data.value) parameters.value = makeNumber(data.value);\n if (data.description) parameters.description = data.description;\n if (data.query) parameters.query = data.query;\n if (data.status) parameters.status = data.status;\n }\n }\n\n // Additional Object Properties\n if (data.custom_properties && data.custom_properties.length > 0) {\n for (let i = 0; i < data.custom_properties.length; i++) {\n let objectParam = data.custom_properties[i];\n if (objectParam.key) {\n parameters[objectParam.key] = objectParam.value;\n }\n }\n }\n\n // Advanced Matching and sending TT events\n var userData = getUserDataFromDataLayer();\n\n if (data.hash == \"hashed\") {\n // Send hashed data\n if (data.sha256_email) userData.sha256_email = data.sha256_email;\n if (data.sha256_phone)\n userData.sha256_phone_number = data.sha256_phone;\n // Note: The key is still \"external_id\"\n if (data.sha256_external_id)\n userData.external_id = data.sha256_external_id;\n log(\"2a. Advanced matching with hashed PII\");\n } else if (data.hash == \"non-hashed\") {\n // Send non-hashed data and TikTok Pixel will hash it for you.\n if (data.email) userData.email = data.email;\n if (data.phone) userData.phone_number = data.phone;\n if (data.external_id) userData.external_id = data.external_id;\n log(\n \"2b. Advanced matching without hashed data, TikTok Pixel will hash the data for you.\"\n );\n }\n\n if (Object.keys(userData).length > 0) {\n callInWindow(\"ttq.identify\", userData);\n }\n\n log(\n \"3. Base code found, sending \",\n ttEvent,\n \"event with\",\n parameters,\n data.event_id\n );\n\n if (data.pixel_code) {\n callInWindow(\"ttq.track\", ttEvent, parameters, {\n event_id: data.event_id,\n pixel_code: data.pixel_code\n });\n } else {\n callInWindow(\"ttq.track\", ttEvent, parameters, {\n event_id: data.event_id\n });\n }\n};\n\nconst validate = (data) => {\n const errors = [];\n const warnings = [];\n\n // errors\n if (!checkExistence(\"ttq\")) {\n errors.push(\"ttq not found\");\n }\n\n // clean up\n if (data.external_id) {\n data.external_id = data.external_id.trim();\n }\n\n // warnings\n // 1. Prevent user from passing in SHA256 hash as \"email\" or \"phone\" to avoid double-hashing.\n // 2. Prevent user from passing in non-hash as \"sha256_email\" or \"sha256_phone\".\n if (data.email) {\n if (data.email.indexOf(\"@\") === -1)\n warnings.push(\"data.email is not an email\");\n if (looksLikeSHA256(data.email))\n warnings.push(\"data.email appears to be a SHA256 hash\");\n }\n if (data.phone) {\n if (looksLikeSHA256(data.phone))\n warnings.push(\"data.phone appears to be a SHA256 hash\");\n }\n if (data.sha256_email) {\n if (!looksLikeSHA256(data.sha256_email))\n warnings.push(\"data.sha256_email is not a SHA256 hash\");\n }\n if (data.sha256_phone) {\n if (!looksLikeSHA256(data.sha256_phone))\n warnings.push(\"data.sha256_phone is not a SHA256 hash\");\n }\n\n if (TTEventMap[data.event] == undefined && ValidEvents[data.event] === undefined) {\n warnings.push('data.event \"' + data.event + '\" is not a valid event');\n }\n\n for (const msg of warnings) {\n log(\"[WARN] \" + msg);\n }\n for (const msg of errors) {\n log(\"[ERROR] \" + msg);\n }\n return errors;\n};\n\nconst start = () => {\n const errors = validate(data);\n if (errors.length > 0) {\n data.gtmOnFailure();\n return;\n }\n\n main();\n\n data.gtmOnSuccess();\n};\n\nstart();\n\n\n___WEB_PERMISSIONS___\n\n[\n {\n \"instance\": {\n \"key\": {\n \"publicId\": \"logging\",\n \"versionId\": \"1\"\n },\n \"param\": [\n {\n \"key\": \"environments\",\n \"value\": {\n \"type\": 1,\n \"string\": \"debug\"\n }\n }\n ]\n },\n \"clientAnnotations\": {\n \"isEditedByUser\": true\n },\n \"isRequired\": true\n },\n {\n \"instance\": {\n \"key\": {\n \"publicId\": \"access_globals\",\n \"versionId\": \"1\"\n },\n \"param\": [\n {\n \"key\": \"keys\",\n \"value\": {\n \"type\": 2,\n \"listItem\": [\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"ttq\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n },\n {\n \"type\": 8,\n \"boolean\": false\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"ttq.identify\"\n },\n {\n \"type\": 8,\n \"boolean\": false\n },\n {\n \"type\": 8,\n \"boolean\": false\n },\n {\n \"type\": 8,\n \"boolean\": true\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"ttq.track\"\n },\n {\n \"type\": 8,\n \"boolean\": false\n },\n {\n \"type\": 8,\n \"boolean\": false\n },\n {\n \"type\": 8,\n \"boolean\": true\n }\n ]\n }\n ]\n }\n }\n ]\n },\n \"clientAnnotations\": {\n \"isEditedByUser\": true\n },\n \"isRequired\": true\n },\n {\n \"instance\": {\n \"key\": {\n \"publicId\": \"read_data_layer\",\n \"versionId\": \"1\"\n },\n \"param\": [\n {\n \"key\": \"allowedKeys\",\n \"value\": {\n \"type\": 1,\n \"string\": \"any\"\n }\n }\n ]\n },\n \"clientAnnotations\": {\n \"isEditedByUser\": true\n },\n \"isRequired\": true\n }\n]\n\n\n___TESTS___\n\nscenarios:\n- name: Basic\n code: \"const mockData = {\\n event: 'view_item',\\n pixel_code: 'my_pixel_code',\\n\\\n \\ \\n advance_matching: true,\\n hash: \\\"non-hashed\\\",\\n external_id: ' abc\\\n \\ ',\\n \\n single_multi_product: 'single',\\n content_type: 'product',\\n content_id:\\\n \\ 'abc123',\\n};\\nrunCode(mockData);\\n\\nassertThat(Calls['ttq.identify'].length).isStrictlyEqualTo(1);\\n\\\n assertThat(Calls['ttq.identify'][0].params).isEqualTo({\\n \\\"external_id\\\": \\\"\\\n abc\\\"\\n});\\n\\nassertThat(Calls['ttq.track'].length).isStrictlyEqualTo(1);\\nassertThat(Calls['ttq.track'][0].params.gtm_version).isEqualTo(\\\"\\\n 0_2_01:00\\\");\\nassertThat(Calls['ttq.track'][0].params.content_type).isEqualTo(\\\"\\\n product\\\");\\nassertThat(Calls['ttq.track'][0].params.content_id).isEqualTo(\\\"\\\n abc123\\\");\\nassertThat(Calls['ttq.track'][0].params.event_trigger_source).isEqualTo(\\\"\\\n GoogleTagManagerClient\\\");\\nassertThat(Calls['ttq.track'][0].pixel.pixel_code).isEqualTo(\\\"\\\n my_pixel_code\\\");\\nassertThat(Calls['ttq.track'][0].eventName).isEqualTo(\\\"ViewContent\\\"\\\n );\\n\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: MissingPixelCode\n code: |-\n const mockData = {\n event: 'ViewContent',\n };\n runCode(mockData);\n\n assertThat(LogsError.length).isStrictlyEqualTo(0);\n assertThat(Calls['ttq.track'][0].pixel.pixel_code).isEqualTo(undefined);\n- name: InvalidPII\n code: \"const mockData = {\\n event: 'CompletePayment',\\n pixel_code: 'my_pixel_code',\\n\\\n \\ \\n email: 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad',\\n\\\n \\ phone: 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad',\\n\\\n \\ sha256_email: 'a@a.com',\\n sha256_phone: '+11231231234',\\n};\\nrunCode(mockData);\\n\\\n \\n// Check hashed PII not passed into plain PII fields\\nassertThat(LogsWarn).contains(\\\"\\\n [WARN] data.email is not an email\\\");\\nassertThat(LogsWarn).contains(\\\"[WARN]\\\n \\ data.email appears to be a SHA256 hash\\\");\\nassertThat(LogsWarn).contains(\\\"\\\n [WARN] data.phone appears to be a SHA256 hash\\\");\\n\\n// Check plain PII not passed\\\n \\ into hashed PII fields\\nassertThat(LogsWarn).contains(\\\"[WARN] data.sha256_email\\\n \\ is not a SHA256 hash\\\");\\nassertThat(LogsWarn).contains(\\\"[WARN] data.sha256_phone\\\n \\ is not a SHA256 hash\\\");\\n\\n\"\n- name: InvalidEvent\n code: |\n const mockData = {\n event: 'InvalidEvent',\n pixel_code: 'my_pixel_code',\n };\n runCode(mockData);\n\n // Check we warn about invalid event name\n assertThat(LogsWarn).contains('[WARN] data.event \"InvalidEvent\" is not a valid event');\n- name: ValidPIIHashed\n code: \"const mockData = {\\n event: 'CompletePayment',\\n pixel_code: 'my_pixel_code',\\n\\\n \\ \\n hash: 'hashed',\\n sha256_email: 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad',\\n\\\n \\ sha256_phone: 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad',\\n\\\n };\\nrunCode(mockData);\\n\\nassertThat(Calls['ttq.identify'].length).isStrictlyEqualTo(1);\\n\\\n assertThat(Calls['ttq.identify'][0].params).isEqualTo({\\n \\\"sha256_email\\\": 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad',\\n\\\n \\ \\\"sha256_phone_number\\\": 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad'\\n\\\n });\\n\"\n- name: ValidPIIPlain\n code: \"const mockData = {\\n event: 'CompletePayment',\\n pixel_code: 'my_pixel_code',\\n\\\n \\ \\n hash: 'non-hashed',\\n email: 'a@a.com',\\n phone: '+11231231234',\\n};\\n\\\n runCode(mockData);\\n\\nassertThat(Calls['ttq.identify'].length).isStrictlyEqualTo(1);\\n\\\n assertThat(Calls['ttq.identify'][0].params).isEqualTo({\\n \\\"email\\\": 'a@a.com',\\n\\\n \\ \\\"phone_number\\\": '+11231231234'\\n});\\n\\n\"\n- name: MultipleProducts\n code: |-\n const mockData = {\n event: 'CompletePayment',\n pixel_code: 'my_pixel_code',\n single_multi_product: 'multiple',\n contents: '[{\"content_id\": \"abc123\", \"price\": 1.23}]',\n };\n runCode(mockData);\n\n assertThat(Calls['ttq.track'].length).isStrictlyEqualTo(1);\n assertThat(Calls['ttq.track'][0].params.contents[0].content_id).isEqualTo(\"abc123\");\n assertThat(Calls['ttq.track'][0].params.contents[0].price).isEqualTo(1.23);\n\n // Verify that the tag finished successfully.\n assertApi('gtmOnSuccess').wasCalled();\n- name: MultipleProductsInvalidContentsJSON\n code: |-\n const mockData = {\n event: 'CompletePayment',\n event_id: '1234',\n pixel_code: 'my_pixel_code',\n single_multi_product: 'multiple',\n contents: '[{\"content_id\": \"abc123\", \"price\": 1.23}]]]]]',\n };\n runCode(mockData);\n\n assertThat(Calls['ttq.track'].length).isStrictlyEqualTo(1);\n // Parsing failure should just forward the event to Pixel.\n assertThat(Calls['ttq.track'][0].params.contents).isEqualTo('[{\"content_id\": \"abc123\", \"price\": 1.23}]]]]]');\n\n // Verify that the tag finished successfully.\n assertApi('gtmOnSuccess').wasCalled();\n- name: SingleProduct\n code: |-\n const mockData = {\n event: 'CompletePayment',\n pixel_code: 'my_pixel_code',\n single_multi_product: 'single',\n content_id: 'abc123',\n content_type: 'product',\n content_name: 'tee shirt',\n price: '12.34',\n quantity: '2',\n currency: 'USD',\n value: '24.68',\n custom_properties: [\n {\n key: 'custom_property_1',\n value: 1,\n },\n {\n key: 'custom_property_2',\n value: '2',\n },\n {\n key: '',\n value: '3',\n },\n ],\n };\n runCode(mockData);\n\n assertThat(Calls['ttq.track'].length).isStrictlyEqualTo(1);\n assertThat(Calls['ttq.track'][0].params.content_id).isEqualTo(\"abc123\");\n assertThat(Calls['ttq.track'][0].params.content_type).isEqualTo(\"product\");\n assertThat(Calls['ttq.track'][0].params.content_name).isEqualTo(\"tee shirt\");\n assertThat(Calls['ttq.track'][0].params.price).isEqualTo(12.34);\n assertThat(Calls['ttq.track'][0].params.quantity).isEqualTo(2);\n assertThat(Calls['ttq.track'][0].params.currency).isEqualTo(\"USD\");\n assertThat(Calls['ttq.track'][0].params.value).isEqualTo(24.68);\n assertThat(Calls['ttq.track'][0].params.custom_property_1).isEqualTo(1);\n assertThat(Calls['ttq.track'][0].params.custom_property_2).isEqualTo('2');\n assertThat(Calls['ttq.track'][0].params['']).isUndefined();\n\n // Verify that the tag finished successfully.\n assertApi('gtmOnSuccess').wasCalled();\n- name: StandardEcommerce\n code: |-\n const mockData = {\n event: 'CompletePayment',\n pixel_code: 'my_pixel_code',\n enhance_ecomm: true,\n ecommerce: {\n currency: 'CAD',\n value: 7.77,\n items: [\n {\n item_id: 'abc123',\n item_name: 'tee shirt',\n item_brand: 'mybrand',\n item_category: \"Apparel\",\n item_category2: \"Adult\",\n item_category4: \"Crew\",\n price: 9.99,\n discount: 2.22,\n quantity: 1\n }\n ]\n }\n };\n\n runCode(mockData);\n\n assertThat(Calls['ttq.track'].length).isStrictlyEqualTo(1);\n assertThat(Calls['ttq.track'][0].params.contents.length).isStrictlyEqualTo(1);\n assertThat(Calls['ttq.track'][0].params.contents[0].content_id).isEqualTo(\"abc123\");\n assertThat(Calls['ttq.track'][0].params.contents[0].content_type).isEqualTo(\"product\");\n assertThat(Calls['ttq.track'][0].params.contents[0].content_name).isEqualTo(\"tee shirt\");\n assertThat(Calls['ttq.track'][0].params.contents[0].content_category).isEqualTo(\"Apparel,Adult,Crew\");\n assertThat(Calls['ttq.track'][0].params.contents[0].brand).isEqualTo(\"mybrand\");\n assertThat(Calls['ttq.track'][0].params.contents[0].price).isEqualTo(9.99);\n assertThat(Calls['ttq.track'][0].params.contents[0].quantity).isEqualTo(1);\n assertThat(Calls['ttq.track'][0].params.currency).isEqualTo(\"CAD\");\n assertThat(Calls['ttq.track'][0].params.value).isEqualTo(7.77);\n\n assertApi('gtmOnSuccess').wasCalled();\n- name: EnhancedEcommerce\n code: |-\n const mockData = {\n event: 'CompletePayment',\n pixel_code: 'my_pixel_code',\n enhance_ecomm: true,\n ecomm_currency: 'CNY',\n ecommerce: {\n detail: {\n products: [{\n name: 'tee shirt',\n id: 'abc123',\n price: '9.99',\n brand: 'mybrand',\n category: 'apparel',\n variant: 'blue'\n }]\n }\n }\n };\n\n runCode(mockData);\n\n assertThat(Calls['ttq.track'].length).isStrictlyEqualTo(1);\n assertThat(Calls['ttq.track'][0].params.contents.length).isStrictlyEqualTo(1);\n assertThat(Calls['ttq.track'][0].params.contents[0].content_id).isEqualTo(\"abc123\");\n assertThat(Calls['ttq.track'][0].params.contents[0].content_type).isEqualTo(\"product\");\n assertThat(Calls['ttq.track'][0].params.contents[0].content_name).isEqualTo(\"tee shirt\");\n assertThat(Calls['ttq.track'][0].params.contents[0].content_category).isEqualTo(\"apparel\");\n assertThat(Calls['ttq.track'][0].params.contents[0].brand).isEqualTo(\"mybrand\");\n assertThat(Calls['ttq.track'][0].params.contents[0].price).isEqualTo(9.99);\n assertThat(Calls['ttq.track'][0].params.contents[0].quantity).isEqualTo(1);\n assertThat(Calls['ttq.track'][0].params.currency).isEqualTo(\"CNY\");\n assertThat(Calls['ttq.track'][0].params.value).isEqualTo(9.99);\n\n assertApi('gtmOnSuccess').wasCalled();\nsetup: \"const log = require('logToConsole');\\n\\nconst LogsError = [];\\nconst LogsWarn\\\n \\ = []; \\nconst Calls = {};\\n\\nmock('logToConsole', function() {\\n if (arguments.length\\\n \\ > 0 && arguments[0].substring(0, 7) == '[ERROR]') {\\n LogsError.push(arguments[0]);\\n\\\n \\ }\\n if (arguments.length > 0 && arguments[0].substring(0, 6) == '[WARN]') {\\n\\\n \\ LogsWarn.push(arguments[0]);\\n }\\n // Print out logs, as normally as possible\\n\\\n \\ log(arguments); // Note: bind and call not available\\n});\\n\\nmock('callInWindow',\\\n \\ function() {\\n const fnName = arguments[0];\\n Calls[fnName] = Calls[fnName]\\\n \\ || [];\\n const call = {};\\n call.arguments = arguments;\\n Calls[fnName].push(call);\\n\\\n \\ \\n if (fnName === 'ttq.identify') {\\n call.params = arguments[1];\\n } else\\\n \\ if (fnName === 'ttq.track') {\\n call.eventName = arguments[1];\\n call.params\\\n \\ = arguments[2];\\n call.pixel = arguments[3];\\n }\\n});\\n\\nmock('copyFromWindow',\\\n \\ function(name) {\\n // Assume base code always exists.\\n return {};\\n});\\n\\n\\\n mock('copyFromDataLayer', function(name) {\\n if (name == \\\"ecommerce\\\") {\\n \\\n \\ return mockData.ecommerce;\\n }\\n \\n return undefined;\\n});\"\n\n\n___NOTES___\n\nCreated on 19/08/2022, 17:04:57\n\n\n", "galleryReference": { "host": "github.com", "owner": "tiktok", "repository": "gtm-template-pixel", "version": "cfe618d563a596ca92bc2fe1002332ea8a752064", "signature": "d6df3d5cb371a3e8e9b60be928dfdc9d98ce1cce68d2835d5c6204f9d19fbe66" } }, { "accountId": "1424898657", "containerId": "70755865", "templateId": "432", "name": "Snap Pixel", "fingerprint": "1767787986631", "templateData": "___TERMS_OF_SERVICE___\n\nBy creating or modifying this file you agree to Google Tag Manager's Community\nTemplate Gallery Developer Terms of Service available at\nhttps://developers.google.com/tag-manager/gallery-tos (or such other URL as\nGoogle may provide), as modified from time to time.\n\n\n___INFO___\n\n{\n \"categories\": [\n \"ADVERTISING\",\n \"ANALYTICS\",\n \"ATTRIBUTION\",\n \"CONVERSIONS\",\n \"MARKETING\"\n ],\n \"displayName\": \"Snap Pixel\",\n \"description\": \"The Snap Pixel helps advertisers measure the cross-device impact of campaigns. Advertisers will be able to see how many Snapchatters take action on their website(s).\",\n \"id\": \"cvt_K4VXG\",\n \"type\": \"TAG\",\n \"version\": 1,\n \"brand\": {\n \"thumbnail\": \"data:image/png;base64,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\\u003d\\u003d\",\n \"displayName\": \"Snapchat\",\n \"id\": \"github.com_Snapchat\"\n },\n \"containerContexts\": [\n \"WEB\"\n ]\n}\n\n\n___TEMPLATE_PARAMETERS___\n\n[\n {\n \"valueValidators\": [\n {\n \"type\": \"NON_EMPTY\"\n },\n {\n \"args\": [\n \"[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}\"\n ],\n \"type\": \"REGEX\"\n }\n ],\n \"displayName\": \"Pixel ID\",\n \"name\": \"pixel_id\",\n \"type\": \"TEXT\"\n },\n {\n \"macrosInSelect\": true,\n \"selectItems\": [\n {\n \"displayValue\": \"Page View\",\n \"value\": \"PAGE_VIEW\"\n },\n {\n \"displayValue\": \"Add Cart\",\n \"value\": \"ADD_CART\"\n },\n {\n \"displayValue\": \"Save\",\n \"value\": \"SAVE\"\n },\n {\n \"displayValue\": \"Purchase\",\n \"value\": \"PURCHASE\"\n },\n {\n \"displayValue\": \"Level Complete\",\n \"value\": \"LEVEL_COMPLETE\"\n },\n {\n \"displayValue\": \"Start Checkout\",\n \"value\": \"START_CHECKOUT\"\n },\n {\n \"displayValue\": \"Sign Up\",\n \"value\": \"SIGN_UP\"\n },\n {\n \"displayValue\": \"App Install\",\n \"value\": \"APP_INSTALL\"\n },\n {\n \"displayValue\": \"App Open\",\n \"value\": \"APP_OPEN\"\n },\n {\n \"displayValue\": \"Add Billing\",\n \"value\": \"ADD_BILLING\"\n },\n {\n \"displayValue\": \"Search\",\n \"value\": \"SEARCH\"\n },\n {\n \"value\": \"VIEW_CONTENT\",\n \"displayValue\": \"View Content\"\n },\n {\n \"value\": \"SUBSCRIBE\",\n \"displayValue\": \"Subscribe\"\n },\n {\n \"value\": \"AD_CLICK\",\n \"displayValue\": \"Ad Click\"\n },\n {\n \"value\": \"AD_VIEW\",\n \"displayValue\": \"Ad View\"\n },\n {\n \"value\": \"COMPLETE_TUTORIAL\",\n \"displayValue\": \"Complete Tutorial\"\n },\n {\n \"value\": \"INVITE\",\n \"displayValue\": \"Invite\"\n },\n {\n \"value\": \"LOGIN\",\n \"displayValue\": \"Login\"\n },\n {\n \"value\": \"SHARE\",\n \"displayValue\": \"Share\"\n },\n {\n \"value\": \"RESERVE\",\n \"displayValue\": \"Reserve\"\n },\n {\n \"value\": \"ACHIEVEMENT_UNLOCKED\",\n \"displayValue\": \"Achievement Unlocked\"\n },\n {\n \"value\": \"ADD_TO_WISHLIST\",\n \"displayValue\": \"Add To Wishlist\"\n },\n {\n \"value\": \"SPENT_CREDITS\",\n \"displayValue\": \"Spent Credits\"\n },\n {\n \"value\": \"RATE\",\n \"displayValue\": \"Rate\"\n },\n {\n \"value\": \"START_TRIAL\",\n \"displayValue\": \"Start Trial\"\n },\n {\n \"value\": \"LIST_VIEW\",\n \"displayValue\": \"List View\"\n },\n {\n \"value\": \"CUSTOM_EVENT_1\",\n \"displayValue\": \"Custom Event 1\"\n },\n {\n \"value\": \"CUSTOM_EVENT_2\",\n \"displayValue\": \"Custom Event 2\"\n },\n {\n \"value\": \"CUSTOM_EVENT_3\",\n \"displayValue\": \"Custom Event 3\"\n },\n {\n \"value\": \"CUSTOM_EVENT_4\",\n \"displayValue\": \"Custom Event 4\"\n },\n {\n \"value\": \"CUSTOM_EVENT_5\",\n \"displayValue\": \"Custom Event 5\"\n }\n ],\n \"displayName\": \"Event Type\",\n \"name\": \"event_type\",\n \"type\": \"SELECT\"\n },\n {\n \"displayName\": \"User Email\",\n \"name\": \"user_email\",\n \"type\": \"TEXT\"\n },\n {\n \"displayName\": \"User Hashed Email (SHA-256)\",\n \"name\": \"user_hashed_email\",\n \"type\": \"TEXT\"\n },\n {\n \"displayName\": \"User Phone Number\",\n \"name\": \"user_phone_number\",\n \"type\": \"TEXT\"\n },\n {\n \"displayName\": \"User Hashed Phone Number (SHA-256)\",\n \"name\": \"user_hashed_phone_number\",\n \"type\": \"TEXT\"\n },\n {\n \"displayName\": \"User First Name\",\n \"name\": \"firstname\",\n \"type\": \"TEXT\"\n },\n {\n \"displayName\": \"User Last Name\",\n \"name\": \"lastname\",\n \"type\": \"TEXT\"\n },\n {\n \"displayName\": \"User Mobile Ad ID\",\n \"name\": \"user_mobile_ad_id\",\n \"type\": \"TEXT\"\n },\n {\n \"displayName\": \"User Hashed Mobile Ad ID (SHA-256)\",\n \"name\": \"user_hashed_mobile_ad_id\",\n \"type\": \"TEXT\"\n },\n {\n \"displayName\": \"Price\",\n \"name\": \"price\",\n \"type\": \"TEXT\"\n },\n {\n \"displayName\": \"Item Category\",\n \"name\": \"item_category\",\n \"type\": \"TEXT\"\n },\n {\n \"displayName\": \"Item IDs\",\n \"name\": \"item_ids\",\n \"type\": \"TEXT\"\n },\n {\n \"displayName\": \"Currency\",\n \"name\": \"currency\",\n \"type\": \"TEXT\"\n },\n {\n \"displayName\": \"Number of Items\",\n \"name\": \"number_items\",\n \"type\": \"TEXT\"\n },\n {\n \"displayName\": \"Transaction ID\",\n \"name\": \"transaction_id\",\n \"type\": \"TEXT\"\n },\n {\n \"displayName\": \"Description\",\n \"name\": \"description\",\n \"type\": \"TEXT\"\n },\n {\n \"displayName\": \"Level\",\n \"name\": \"level\",\n \"type\": \"TEXT\"\n },\n {\n \"displayName\": \"Search String\",\n \"name\": \"search_string\",\n \"type\": \"TEXT\"\n },\n {\n \"displayName\": \"Sign Up Method\",\n \"name\": \"sign_up_method\",\n \"type\": \"TEXT\"\n },\n {\n \"displayName\": \"Client Deduplication ID\",\n \"name\": \"client_dedup_id\",\n \"type\": \"TEXT\"\n },\n {\n \"notSetText\": \"Not Applicable\",\n \"macrosInSelect\": true,\n \"selectItems\": [\n {\n \"displayValue\": \"true\",\n \"value\": 1\n },\n {\n \"displayValue\": \"false\",\n \"value\": 0\n }\n ],\n \"displayName\": \"Success\",\n \"simpleValueType\": true,\n \"name\": \"success\",\n \"type\": \"SELECT\",\n \"help\": \"A variable, if provided, should evaluate to \\\"1\\\" for true and \\\"0\\\" for false\"\n },\n {\n \"notSetText\": \"Not Applicable\",\n \"macrosInSelect\": true,\n \"selectItems\": [\n {\n \"displayValue\": \"true\",\n \"value\": 1\n },\n {\n \"displayValue\": \"false\",\n \"value\": 0\n }\n ],\n \"displayName\": \"Payment Info Available\",\n \"simpleValueType\": true,\n \"name\": \"payment_info_available\",\n \"type\": \"SELECT\",\n \"help\": \"A variable, if provided, should evaluate to \\\"1\\\" for true and \\\"0\\\" for false\"\n },\n {\n \"type\": \"PARAM_TABLE\",\n \"name\": \"additional_init_data\",\n \"displayName\": \"Additional Initialization Data\",\n \"paramTableColumns\": [\n {\n \"param\": {\n \"type\": \"TEXT\",\n \"name\": \"key\",\n \"displayName\": \"Key\",\n \"simpleValueType\": true\n },\n \"isUnique\": true\n },\n {\n \"param\": {\n \"type\": \"TEXT\",\n \"name\": \"value\",\n \"displayName\": \"Value\",\n \"simpleValueType\": true,\n \"defaultValue\": \"\"\n },\n \"isUnique\": false\n }\n ],\n \"help\": \"Enter in custom initialization data\"\n }\n]\n\n\n___SANDBOXED_JS_FOR_WEB_TEMPLATE___\n\nvar log = require('logToConsole');\nvar callInWindow = require('callInWindow');\nvar copyFromWindow = require('copyFromWindow');\nvar createQueue = require('createQueue');\nvar injectScript = require('injectScript');\nvar makeTableMap = require('makeTableMap');\nvar sendPixel = require('sendPixel');\nvar setInWindow = require('setInWindow');\n\nfunction mergeObjects() {\n var res = {};\n for(var i = 0; i < arguments.length; ++i) {\n for(var x in arguments[i]) {\n res[x] = arguments[i][x];\n }\n }\n return res;\n}\n\nfunction bootstrapFn() {\n var snaptr = copyFromWindow('snaptr');\n if (snaptr) {\n return snaptr;\n }\n \n setInWindow('snaptr', function() {\n var handler = copyFromWindow('snaptr.handleRequest');\n if (handler) {\n callInWindow('snaptr.handleRequest.apply', null, arguments);\n } else {\n callInWindow('snaptr.queue.push', arguments);\n }\n });\n return copyFromWindow('snaptr');\n}\n\nfunction bootstrap() {\n var existingSnaptr = copyFromWindow('snaptr');\n var snaptr = bootstrapFn();\n createQueue('snaptr.queue');\n setInWindow('snaptr.sendPixelByGTM', sendPixel, true);\n\n data.integration = \"gtm\";\n log(\"data = \", data);\n var additionalInitData = (data.additional_init_data) ? makeTableMap(data.additional_init_data, 'key', 'value') : {};\n var initData = mergeObjects(data, additionalInitData);\n\n log(\"initData = \", initData);\n if (initData.pixel_id) {\n snaptr('init', initData.pixel_id, initData);\n if (initData.event_type) {\n snaptr('track', initData.pixel_id, initData.event_type, data);\n }\n }\n\n if (!existingSnaptr) {\n var url = 'https://sc-static.net/scevent.min.js';\n injectScript(url, data.gtmOnSuccess, data.gtmOnFailure, url);\n }\n}\n\nbootstrap();\n\n\n___WEB_PERMISSIONS___\n\n[\n {\n \"instance\": {\n \"key\": {\n \"publicId\": \"inject_script\",\n \"versionId\": \"1\"\n },\n \"param\": [\n {\n \"key\": \"urls\",\n \"value\": {\n \"type\": 2,\n \"listItem\": [\n {\n \"type\": 1,\n \"string\": \"https://sc-static.net/*\"\n },\n {\n \"type\": 1,\n \"string\": \"https://tr.snapchat.com/*\"\n }\n ]\n }\n }\n ]\n },\n \"clientAnnotations\": {\n \"isEditedByUser\": true\n },\n \"isRequired\": true\n },\n {\n \"instance\": {\n \"key\": {\n \"publicId\": \"logging\",\n \"versionId\": \"1\"\n },\n \"param\": [\n {\n \"key\": \"environments\",\n \"value\": {\n \"type\": 1,\n \"string\": \"debug\"\n }\n }\n ]\n },\n \"clientAnnotations\": {\n \"isEditedByUser\": true\n },\n \"isRequired\": true\n },\n {\n \"instance\": {\n \"key\": {\n \"publicId\": \"access_globals\",\n \"versionId\": \"1\"\n },\n \"param\": [\n {\n \"key\": \"keys\",\n \"value\": {\n \"type\": 2,\n \"listItem\": [\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"snaptr\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": true\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"snaptr.handleRequest\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n },\n {\n \"type\": 8,\n \"boolean\": true\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"snaptr.handleRequest.apply\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n },\n {\n \"type\": 8,\n \"boolean\": true\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"snaptr.queue\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"snaptr.queue.push\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n },\n {\n \"type\": 8,\n \"boolean\": true\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"snaptr.sendPixelByGTM\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": true\n }\n ]\n }\n ]\n }\n }\n ]\n },\n \"clientAnnotations\": {\n \"isEditedByUser\": true\n },\n \"isRequired\": true\n },\n {\n \"instance\": {\n \"key\": {\n \"publicId\": \"send_pixel\",\n \"versionId\": \"1\"\n },\n \"param\": [\n {\n \"key\": \"urls\",\n \"value\": {\n \"type\": 2,\n \"listItem\": [\n {\n \"type\": 1,\n \"string\": \"https://tr.snapchat.com/*\"\n }\n ]\n }\n }\n ]\n },\n \"clientAnnotations\": {\n \"isEditedByUser\": true\n },\n \"isRequired\": true\n }\n]\n\n\n___TESTS___\n\nscenarios: []\n\n\n___NOTES___\n\nCreated on 1/31/2019, 2:56:12 PM\n\n\n", "galleryReference": { "host": "github.com", "owner": "Snapchat", "repository": "snapchat-google-tag-manager", "version": "1255335a1796fb2b65eced05a8726ff47f167222", "signature": "308a287e0ba64b2f6dcfc6add3b5bc8237efd435e1d69bd07eb84eaadffdaf6e", "galleryTemplateId": "K4VXG" } }, { "accountId": "1424898657", "containerId": "70755865", "templateId": "458", "name": "dataLayer Builder + Enhanced Ecommerce", "fingerprint": "1767787986723", "templateData": "___TERMS_OF_SERVICE___\n\nBy creating or modifying this file you agree to Google Tag Manager's Community\nTemplate Gallery Developer Terms of Service available at\nhttps://developers.google.com/tag-manager/gallery-tos (or such other URL as\nGoogle may provide), as modified from time to time.\n\n\n___INFO___\n\n{\n \"displayName\": \"dataLayer Builder + Enhanced Ecommerce\",\n \"categories\": [\n \"CONVERSIONS\",\n \"ANALYTICS\",\n \"UTILITY\"\n ],\n \"description\": \"This custom template gives you the ability to build any of Google\\u0027s Enhanced Ecommerce dataLayers, with easy to use dropdown functionality, and the ability to add as many custom parameters as you want.\",\n \"securityGroups\": [],\n \"id\": \"cvt_temp_public_id\",\n \"type\": \"TAG\",\n \"version\": 1,\n \"brand\": {\n \"thumbnail\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAIAAAAxBA+LAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA4RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0NzBlYjdiNC1iM2Q5LTQ4NGMtYTUxNC1lNmY2NWNmOThmYzYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RDRDRDdGQzU1MkQzMTFFOUFGQTQ5QTdGMUFDRTkzMzAiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RDRDRDdGQzQ1MkQzMTFFOUFGQTQ5QTdGMUFDRTkzMzAiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6N2Q4ZTBkYTEtZmUxOC1lYjQ3LWFjYWItNzFiODc3ZjUwMmU2IiBzdFJlZjpkb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6YWRiY2ZkMDktMGFlZi00ZTQyLWJlMzEtOGQ3ZTdjYWY0NzEwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+YlFdawAAND1JREFUeNrs3QmcFNWh7/HeZmBWdkRBkW0QcViuQXFECApOQE3c2Aw3yQ0getFn4kLyuRFuArznBhgXkijgNUaRxbgLjKAICpIoCIOCbCMIwswwMDAzPWt31z3QSb9O19LV3VW9VP++Hz7J2NNzuuqcU+dfp6q6yi5Jkg0AgHTloAoAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAgCAEAIAgBACAIAQAgCAEAIAgBACAIAQAgCAEAIAgBACAIAQAgCAEAIAgBACAIAQAgCAEAIAgBACAIAQAgCAEAIAgBACAIAQAICW4qAIAyUeSar6Wqj+XzpRKdfsl9ze2pkqpqcomec7+0u60uXLtGW1sGW3tub3tuX3seQX2NgPtbQed/RUQIbskSdQCgKTQfMp37G1f+Xu+yg225pMR/3lGvqPjNfaOwx0X/NCedwnVCYIQQIrwtfiOv+37ZomvYv0/5nyxD235/R3df+Lo/lN76/OoYBCEAJJVy2lv2fO+A09JDcdMKd+R4eg2wVlwv73tYCobBCGAZOJt8O5/yrv3MZGFcfg0xwU/chY+yvFSEIQAkoLvyArvroek+iPxHe2czl53O/vPs2W0oQlAEAJIDKnhqHfbdF/56oQNea27OC9/3nH+TbQFCEIAcZ8IHl3l2XZnfI6FanP0mOoa9LTNmUWjgCAEEJ8MbPaWPug98EwSjX1tBrqK3rTnXEzjgCAEYLLmas+nt/pOfJR0C9aqU0bRW/YOV9FEBCFBCMAsUsNRz8fXSzV7knT5nFmuojcc5xXTUgQhAJiQgu5vPBtHSvWHk3opHRmuq95wnH8D7ZW2uOk2APPmgqOTPQVtZ+9r49k6TqraRJMRhABgnJbTno+LpbqDqbG03oaWzT9K3uO3IAgBpNpk0OPZcotUszvFknvLD5Phqx0gCAGkPO/OB5LxGtGw8V13wPPZz2g+ghAAYuL77nXvgadTdeGPveUr+xONmG64ahSAcZOqxvKWkn6pfYDRlZNx/Vf27O60JjNCAIiYd/tdKX+azeP2br+bpiQIASBiZ48rHnvLCitSvsZ3/D0alCAEgIjSo9m78xfWmdrummmTfLQqQQgAupPj4B8k9yHLrI5Us9t3dCXNmia4WAZA7DHY0Ly6u63phKUGx/z+GdfvEv9P8zIjBIBwOXjoBYul4LlJ4Ve+inU0LkEIAOEjw5eyXxzU5jv4R1qXIASAcGlR+aFUu8+aq3b8XampkiYmCAFAMy0Ov2Tdua5HOvoaTUwQAoBGDDb5vnvDyuv33V9pZIIQANRzonKDzVNr5RU8sdHaKwiCEEBMpIq1Vl9D79mwB0EIACozwo+sH/Y8vJ4gBABlnlrpTKn1w/7kVpqaIAQApanS2RSU0mA1d6TDahKEABB5QtTsTo+Jr1tyH6a5CUIAkAVh3f50WdPar2lughAAZPFQfyRdVrX+EM1NEAKATFNVukR+w1FamyAEAFk8NJ9MlzVtOklzE4QAIM+HtHmGe/MpWpsgBIA05muiDghCACAIQRACQFqSvA1UAkEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAgCKkCAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAQGxcVAEQB766ypbjpS2VX3urD3lrjvvcVZKnSfI2252Zjqw29swce6s8V4fero59XJ36iP8Vr1NpAEEIpHz4Ne5d27jv/aZvPvFWH9b/h3ZXq8yLhrbqOVz8y+xxjfhPKhMgCIGUITXV1u9YLv41Hdxgk6RoSvA0NZVtFP/Ez47W+a37jsn+3k9aFxTbHE6qFyAIgeTlqdpft+lJ9/a/SE11hk0rG2vqd64Q/5xtuuVedXfOVdMd2R2oasBAdimqPVYA/xqBB2rWPlxfutJm8gZlz8zJvfqevO/PdGS3T/hat6wbJJ3ZmRYDZacRGSM+op9bFVeNArHN2OpPnX7z/5Q/cYmYtNnM362Umt21Gx4rf7SXmHrafB7qHyAIgUSq37G8/Il+dZufsfm8cU3fhtOn37m/4veXNx/9nFYACEIgMRPBk38Zf+qVSb66ykQtQ8vx0spnhtasnxvnGAYIQiDdNR/5e8WTgxtKVyVBIHtrSmafWFLsc5+gXQCCEIiH+u0vn1h0jff0t8mzSE37P6h86oqWit20DkAQAuaqWfe7U6/+u+RtTrYF81QfOvHsVc2HP6WNAIIQMIcknX77FzXv/zZpF9DXWHPiueuaDnxIWwEEIWC8M+8+WPfxU8ke1i0NVS/c1Pzt32gvgCAEjFSz7ne1mxamxsS1pb5q6Q2eE/toNYAgBIxRv+2lZD4iKuerP1n1wo2+xjO0HUAQArFq/vZv1aumpdxie6r2Vy//iY0bKAIEIRDb1OrUyb+MS8JrRPVo+Ortuk//QCMCBCEQverXpnlPH0nd5T/zzoNiakg7AgQhEI367a807Ho9pVdB8jRWvzadA6QAQQhEzNdQffrtX1pgRZoObjj7cCgABCEQkZqS/7bM3TvPvPerFD3NCRCEQGJ4qg7UffpHy6yOt/pw/d9foFkBghDQPR18/78t9szbmg//n+RtoWUBghDQMR08WXb2WfPW4j19pGEnZwoBghDQoW7z05Z8zm3dlkU0LkAQAmFILfX1n71oyVVrPvxpS+UemhggCAEtDV++aeFbdNZ//hJNDBCEgGZUbH/F0jH/Bk0MEISAKqmprmn/eguvoOfEXk/l1zQ0QBACyhr3r7P8F8/FOtLQAEEIKGsq22j9dTywgYYGCEJALQg/tvw6Nn+7lYYGCEJAgeRt8ZTvsvxqemuOe2uO0dwAQQiE8lTuSZObkLWUf0lzAwQhIAvCkwfTZU0rdtPcAEEIhPJWH06XIKw+RHMDBCEgC8LainRZ09NHaW6AIARC+eqr0mVN6ypoboAgBEKlz+P6fPWnaG6AIATSeO7b7KYSAIIQSOck9FIHAEEIpC+pqZZKAAhCAAAIQgAACEIAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIAABBCAAAQQgAAEEIACAIAQAgCAEAIAgBACAIAQAgCAEAIAgBACAIAQAgCAEAIAgBACAIAQAgCAEAIAgBACAIAQAgCAEAIAgBACAIAQAgCAEAIAgBACAIAQAgCAEAIAgBACAIAQAgCAEAIAgBACAIAQAgCAEAIAgBACAIAQCIOxdVgChIzW7PyYOeU4d8teW++pOSp0m8YnNl2h0Z9lZ5ztzOzjZdne0udrXrbnM4qS4ABCGsoKX8y6aDG5q/2dx89HPPqTKbJIX9E3tGVkaXyzIvujLz4qtb9xnlyOlINQIgCJFaUz+p6dDmhp0rGr56y3v6SMR/3dLQfOQz8c+2+Vmb3S4SMavw9uxBE5xtulG1AAhCJDVf4xn335e6tz7nObHPqExtPrxV/Dvz3szWl4zJveru1peMFelIVQMgCJFkEeiuqt04v27LH6SmWnNmmb7GPe+JfxnnXZo3alb2wPE2OxdtAUgYBiAEJZSnsfbDR44/0qN2w2NmpWCQlordp16ZVLFwYOO+dVQ+AGaESLCm/eur/zrdc7Iszp/bUv5l1eLrswbc3vbmZ5x5XWgIAMwIEfeJYLO7+q93nXh+dPxTMKCh9LWKJ/rV71xBcwAgCBHfCVnF7orfX+7e+lzCl8TXcPrUyxOrV06RPI20CwCCEHGZh335ZuXTV3hO7E2eRXJ/9sKJRcO8NcdoHQAEIcxV9/HvT75029k7wiSZ5qPbKp++sqX8S9oIAEEIs9Ssm3P67V/aJF9yLp73zNETfxrZ/O3faCkABCFMSMH1c2ve/+8kX0ifu6pq8fUtx3bQXgAIQhipbvMzNSWzU2JRfY01Z69lrdpPqwEgCGGMhq/ePv3WL1Jogc/OC5fe4Ks/SdsBIAgRK8+JvadenZy05wVVF7tq/6lXJtl8XloQAEGI6EmexpN/vi0ON04zQ+O+dTXr59KIAAhCRO/Muw+1VHyVustf88G85kNbaEcABCGi0VS2qW7zs6m9Dj7vqZU/lzxNtCYAghCRkbwt1a/daYEV8ZzYW/vhIzQoAIIQkXFvfjapbqIWi9oNj3lPf0ubAiAIoZev4XTNB/OsM7v1NJ5JkS9BAiAIkRTqPv69r/6UldaofvvLnqoDtCwAghA65k8t9Sl/jYzCJNdb+9HjNC4AghA6Jk+fv2TJe7LUb/uLz11F+wIgCBFG3d8WW3Om62ms3/4y7QuAIISWluO7Wr7bbtW1c3/2Ak0MgCCElvodr1o75j2VX9PKAAhCqGr86i1rr2DDl2/QygAIQijznv62pWK3xZP+6zU0NACCEMqaDmyw/Do2f7tV8jTS1gAIQigF4aHNll9HydvSfORz2hoAQQgFFr5e9F9W8+g22hoAQQj5XMnXUv5VOqxoy/FSWhsAQYhQ3jNH0+TkmefkQZobAEEIWTxUH06bNT1EcwMgCBHKV1vBmkKVM5M6iJTdQaURhEiteLDijbYVSZ5GqaWeFo9sTM/MphIi33ug0ghCpFY8tDSk0cp6mo2JB2cGPSfy8YNKA0EIJDwIm+uM2RKy2qXLNm/cmtoz06XSbBlt2dYIQiBJ2V2tCcII19S4MT0jXSotjSKfIIRlNtt06sIuY4rJ6ZQuFZbT0bB+1rpzunSzzI42EIRIqZGuQxqtbOt8Q8pxtr0wTWrMmX+BYWVldUuXXcusC2wgCJFKjZrdIY3W1G5MH3a1654uQdjGsPSyZ6dLpaVP5BOEYKRLtTVta9iaOjv0sjmc6VBpro59DAvCvL7pMiPM7WMDQYhUGuna90iXNW13sWEjnTPD1aF3OlRaRudLDA3CNDgh7cyyZ1/EwEIQIqX2XlvlpskZL1eX/gaWlnnBIOv3DWemq6Nxee/MtucVWL/S8voZdQQeBCHiuNd//gBWM+LSLhxi/RrrOtio62z/ERLtr7B+ELYfYgNBiJST2f2qdFjNVhcNNbK0i6+2fse46EqDR5AORdYfJdtfaQNBiNRLiDQY051tujkNvdQz88LvGfVljOTtGD2HGzxb6nyd9WeEHYfbQBAi9Xb8Ly6yt8q19jq27lts9NbgatVrpKVHdIfhK2jP7WPtL1GItbPn9mJIIQiRgluvM7N1wfUWD8J+NxhfZv8fWXn36KIrHdntjR9ELrBypdm7jGE8IQiRqrIGjLPy8JSZ07rvD4yvtP4/NPZakuTqEoW3mTKIdLvNwj3N2msHgtDqQdjvRgsfHc267BZ7Rpbx20N2h6x+Yy2672DPKrzVlII7XmPZo6OtOjk6jmAwIQiRsuNeq9zsQZOsunY5Q+80qeTsy39qzSG95/dNu9OC3dH9J5asNOdFk3nmIkGI1JZbNMOS65VxfmGrHteYNdfs/0NL3o4g54opJo4jPafb7BY8pOzo8XOGEYIQKR4YFwxs1WeU9dYrb8RDZm4TLuvtQDjzL8gaaOI5Y3tWV0c3q52TdnQeZc+/jGGEIETKyx81y2Jr5OrQK3uwuYd8RRBa7Dm9ucPutTszzc3afr+x2uBY8AADCEEIK2jVc3jrSyx1/Xf+9b8z+8JOe6vc3OH3W2cjz+6QW3SP2Z9iz+/v6Ha7ZSrN3v5KR5cf2EAQwhra3PiEZR4wlHnRldmD74jDB+WNeMDIB9gmdtfhut/E5/ph52WPWObSEmfhIwwdBCGsI+O8/nnX/MISvdXZ9pZFNns8nvtjz8g6uwOR+lydCnKuvic+n2XP7e3sY4We5uh6i6PTSBsIQlhJfvEcV4eeqb4Wedf8MrPb5XH7ODH1tMClRu1u+YPdGb9ZmvPS36b8o/tcOc6Bv2fQIAhhNfaM7PYT/5LSB0gzzi/M/8G8OH9o+/FLU/o23DlXTGnVJ743xXZmO4e8mNJP63Ve9iiP4SUIYU2ZFxedvcwkRYM8M6f9j1+1u1rFe0xse1HbW/6QqhObjr3b/jABMxtHp5HOlL3e0tFljLP3DIYLghCWlX/tf529l2YKaj/+hYzz+ifko7P/7cc5Q6en3q6Dq3WHySsSdY89Z+Ej9o7DUq/Ssrql+nQWBCHCbuj29pNeOfuM8tTK7+I5WQPHJ3AB2t78tOGP8TNbu/FLM7r+WwJz2DX0tRS7Aakzy1X0hr1VZ8YJghBWj8JWuR1//q6rQ8o8Xy3nqrsSfk8AuzOzw0/fyOjcL4V2HeLzJROtSmt9nmvYaltmityXwO5wXbnM3u57DBEEIdKCM/+CTndtMO3+y0bKvvzf2yXHKTpHdvuOd76fEjsQecPvT5LbCdnzL80YtsaWkfRXG4kUvHyJ44KbGRwIQqRTFra9sNN/bnJ17JPMC5l71d3tJ/w5Pt8a1FVpbbp1uvujJM/CvJG/anPTgiSKmPZXZlzzflJnoUjBIS85Lv4PhoV0ZpckiVpIT776k1X/86PmQ5uTcNna/OD/5l33X8lYae4TVUtvbD7y92SstLGPiiBMwgWTar70fDJWqj+SfLuEWa4rlzEXBEGY1iRP0+k373H/bUkS9chWuWIiaNIjZI2ptJb66hU/r9+5IrkqbeJLWZfdkryV1njcs+Vm6VQS7UDYsy9yXfW6vd3ljAMgCGGr3/ZS9RszpKa6hC9JRtfBHX683NWpIPkrre7jp868N1PyNie+0s4f0H7y8hS4lsfX7C190HvgmWRYFkeXsa4hL9padWLzB0GIf/CcPFi9amrTwY8SNzK58kf+Km/0bLOfFmSgluOlp5b/pOXYzsRVmvPspTHFc+N/q4Ho07B8jXfbVKnhWMKWwJXnLHzE2es/+b4gCELISJL78xfPrP61r64yzp/cqueItjc/LWY2qVdpPk/tpidr1s+J/3w6s/tV7W55NpFfFox+D6LG+9Us78FFNskb7z2HbuOcA+ZzBzUQhNAc2Btr6jYtqN24QGp2x+HjMjr3y//BvGQ+I6iHt7aidt3v3H9fInlb4lRp1/82a8C45LmkNpr9rtqvvbt+7Tv2VpxGuk4jXP3n2jtewzYOghD64tBdVffpH+s+ecbnPmHahGZo3vAHzkag3SLf4fGe/rb2o/nuz//HvNlh5oVX5H3/wazC2yxTadLpL7x7H/cdfc0meUwa4hznj3X2nWnvOJztGgQhIh+kvM2NX77p/uyFxv0f2HzGjFOOnE7ZA8flXDElJY/p6ZtSN3yxzL3tz82HtxpVpjP/AhF+OUP+I+Vuj6e3pzUc8x1+0Xf4Jal2r2FDW94ljgvHO7r/zJ7Tg20ZBCFiHtzrTzXsfrvx6zVNBzZEN0fMOK9/q77Xt+47pnXvkTaHKx0qTUwQG3a90VS2sembj8UMO/JdBldm18Gteo3MuuyWzIuuTOmjoBEk4pldvmNvSVUf+05utnkiPzjvzLa3H+LoPNrR7TYRhGy5IAhhCs+Jfc1Ht7VUfOk5sd9bfchbc9xXf1Jqafj/A3h2e/HPmd/V1b6H67x+GecPzLxwiHgljWfWUkvFVy1Ht3lOHmg5sU9UoK+hWmo47Wt2++fZjtb59owsR1Z7Z4eervY9XR16ZnT7Xma3y8WLaVxpHqn6c5GLUu0+qe6AVLfP1lIjeWrF/4rfnb3gMyPf7sqxZXay5/a05/S05/YREWhvM8Bmd7GRgiAEACAC3GsUAEAQAgBAEAIAQBACAEAQAgBAEAIAQBACAEAQAgBAEAIAQBACAEAQAgBAEAIAQBACAEAQAgBAEAIAQBACAEAQAgBAEAIAQBACAEAQAgBAEAIAQBACAEAQAgBAEAIAQBACAEAQAgBAEAIAQBACAEAQAgBAEAIAQBACAEAQAgBAEAIAQBACAEAQAgBAEAIAQBACAEAQAgBAEAIAQBACAEAQAoBp3G73qlWrJk2a5HA4xP+Kn8UrVItl2CVJohYAQCMFp06dumLFiuAXJ0yYsGTJkpycHOqHIATiR+yGh7ySn59fXFxMzdCIZi+ziD356yIax40bR5tagIsqMHC38eDBg/6fc3Nze/bsSZ0YSz4YzZgxgyCkEc22adMmxdd37dpFEBKEsJWVlW3btk1sJ4sWLZL/tqCgYPz48YWFhSNGjOjcuTPVxUxIjpE0ziorK8vLy0Ne7NWrl8ZBzh49eii+3r17d+qTIExrpaWlixcvVsy/gH379s2bN8//8/z582+++Wamielpy5YtisfWBHaS4mzjxo3yttixY8eAAQPU/mTUqFGKrw8ZMoT6tAauGo1mj/Lee+8dNGiQdgqGePDBB3v37r106VIqMA2tXbtW7VfvvPMO9ZPkREauWbOmoKAg8Ir4WbyikZ1gRmhlZWVlY8eOFVO96P582rRp69ev52KztOJ2uwMHBuSWLVs2ZcoUainJFRcXb9u2befOnd99913Xrl0HDhzIJkwQpqmSkpIxY8bEWIj/ImyyMH2sXr1a47cbNmzYsmVLUVERFZXkxAZLM1kVh0YjmAved999hhQlsvDXv/41VZomXn/9de03bN26lVoCCMJk53a7p02bpnZEdOTIkYsXL96xY0dtba3vnPLy8k8++WT+/PlqBS5atEjtMkJYbP8p5IvYcs8//zy3KQESiEOjuixfvnzDhg3y1wsKCubOnSu/Ar7zOUVFRZMnTxZvULysZtasWWPHjtV5gNT/PY1du3ZVV1f7SxMfPXr06B49evTv33/w4MGxXHloUuFbtmzZs2eP2D9Yt26d2Ifwlzlo0CCx3xB89WxlZeXGjRtD/rZv377GXokQWJiqqip/MonFuPTSS8Xy9OvXz7xDXvJuI+ohZI9K/KfYbdL5XbqwX0j31+emTZv81e5f06uvvrqwsFB/f0tUO5aUlNTU1GivoIbS0tK9e/fKXx8xYkRg2RS/FLh+/fqQPwy5mjeW+wAY3vcC39oKFBi8wQ4bNozTLhGTEE5FRYVdidjIDx48qKeEBQsWKJawcuXKsH+7du3aa6+91h6OiNWdO3dGumomFb5582btYu+5555A1YmSddaMYjnaS1JXVyeKEi2lvYLiDeJt4s2Gdx75R4vOIK+csCuipxLE8i9ZsiTsaia2HbUbUXRIxQ/S2TQTJ06U/62ocMVl0xbS4ZOk74naFp+bqM5sYQRheGqDi84U9FPsvmKU0Q7gsJ0+hFhUnRuASYWLN6ilvpwY9UwNQlGynpgPbo4odia0g0T+KeJFsXby10WLxBKEouYVY0AxGMJ+inntqN2I4nMVk0NPfovtUXHxRMXGPwij6HthxxO1vQRFojNENEARhIh4p17nlqlnWqk2/IlOHHZfUm0DCBtX5hWucywOTgWTgjCiUUM+rBtCzKTle+tqnUFnj1KsBP0pqDMLzWvHsI2ouN+pvcuo8Yf+wuMchGb0PcWdqrBTQ517VyAIw1DchEQPM/XIQ9RBpSeuzCtc+7ic2raquIXHGIRRjBohw3rsjShqSSOB5EmjZ6xXq4Qoal5jHU1tx7CNqLbLGLZRFHu1xmzVpCCMse+pHZNQm1+KjqRxaEf8ljGcIDSA4lEsPQeXYhlAIzqoEtEuv3mFRzHWBAYUY4NQ7fCaf1wQo/zKf1Kb9xiyK604LQgcrVLsV3oOzCqulHxk9NM+Fqd/z8/AdtTTiPKZtP9EdaRHof3z73gGoUbf079LId/RVOxLYjMMfqeoAcX+HOmxK4IQes/tGTJjiCh6A+fAg4/7i8VQHDI0RlXzCtcYdv1XKwRPSUUaaY8XsQSh4skt8XGKFSJeVFyS2Pd1tOd8ivMePR+qfU1TSH77r9dQe7/iOSSz21FPI6rllsbeiWKjK/ai6HZBYul7/qYPPuwp2kXjOjVRq2Hn6GoxLO91gb0BEIRGDmf6r2GLbjqoOLJonPpWOyEh31TMK1ztOgWNC2vFoKZxIirqIFQMGO1D2WrHimOZFCouRsgAJ48cPWNWFKf91HJFXslxaEediaIYEmqTG8Wj0GotaF4Qqh3UVTuboHFmN+T98q6iVhWKbW3qjrs18D3CMBS/Da32NZ2ysrInn3wyovIHDRoUfKvJ1atXy7+2X1BQ8NRTT6l9ma+4uHjNmjXye78tWrRITBGC/8q8wtW+ZCk+Ue2BG+JvRTBUVlYq/m3U5F9lE8SoofHNKrGEogbk6yiKivoZSYq30h45cmTwf954440hXzAVrVNSUhLFw/lEyffff7/abwcMGDB//vwHH3ww5PVNmzaFrGDytOPMmTPlBf7pT39SbJFPPvlE/uLDDz8c58d6KPY90TRq91MUL4pfffHFF/KtMuz3SuXftgy09YQJE0JGrT179nBzOL5HGBPF/bVId721z6yEPTCl5yi/nj80r/CoT07on6zo3CuXL2osF6FE3W3kExr5YijOY7TPhKl1yLBXuipOVuSLFId2jPFkm+LkRnGx1SZ55s0IFTeTsE2jeGlSSDeQL7P+LzGDQ6OpF4RRf5tY8WKBkM3JvMJj+RK0/oNgegYjPWdcdIZ91CdX9F8Hq3gWVvuQbNRVrVjPRhWuvx3173AoJpZ8R0FnxschCCMaK4KXf6WSsD3K37eJQw6NWk1lZaX8xRkzZui5YdLAgQPlL+7fvz8OhZeVlcl/O2HCBJ33ebrjjjuMOqqmuCT5+fnRlRb1w7YUb6I9YsQI+YtXX3214hG2iA7JFhQU6KnqSy+9VLuek6cdNWps3rx5IoGCj3kqHoW+66674rzxKtae2L7C/qFYl7DNXVRUJIqS36lx2rRp/g5w55139u/fv0+fPjz6OzrcdDsMtQeLm6G8vFz+Yrt27fT8reJoFXyqwLzCxYxB/luxTepc66iDSk5xSUQLOnSI6DHLGtxut/xsnFgGxfNVw4YNC37ca+BMWESfOHr0aPNqLyHtGEgIxdvWh5yKW7ZsmXzPYOzYsXEeKBRrT+f2pcejjz6qNhaJPTbR5caMGdO7d+/rrrtu4cKFW7ZsYegmCI3UsWNH+YulpaWKb+7Vq9eOcOQDn7bCwkKd7wy5FiOxhesvuW/fvlbqMIoXbtx6661qexhiXz7kRTGvUpxeJERi23HUqFHyF4N3FMSIL5+GiipNkrtO6689PTujS5Ysefjhh7XfJmpDhKLYwbrkkkt4vg1BaJjhw4fLX1S8w72/sw7Q1KVLl0gPuKldHqa4DUS6duYVfuTIEZ3vPH78eHI2faS7LH4vvvii/EXFo3x+Q4cONaQpTZLYdvRfAymvnMCMR/Eo9M0335wktad/+9KZhXPmzDlw4MDixYvD7piKcUZU3b333ssTvghCA3Tt2lV7nzQi8guswx48EZNI84Zy8wr/5ptvEjJYyK1Zs8YXla+//jrSz6qsrFT8vo3YAVI7JCt23uXvf+KJJ5Kk/ye8HX/2s5/JX1y7dq1N/Sh08pwni2X7UiPWbsqUKR988EF5ebnobPPnz9cIxUWLFvEMcILQAEVFRfIRX+yTlpSURFqU2G5nzZoV8mLw5RKKT25bt26dnsIVD6YFnz0yr/BevXpFXbKwa9cuAycQ8Q9a7R2d6Ijd+fif5kmedgxWXFws3wDnzZsn9jkUj0IrBmccKPa93bt3m/eJ/qts7r///kAoKp5EFFkYxWBFECKU/CyOcN9990V6zOG5556THxcNmRDId+7En6idkgzJZvmLgwYNikPhOTk58qFK51AuhjMxqBnYWPJ11DNAi8UolYniRF3UhwrUJj3xlFTtGGzu3LmK+xzyo9Bi+aO4HYF5fU/P6V6RUvLjBPfee28Uofjqq6+uWbNG/tvNmzczjBOEsZo8ebLiPvvUqVP1Z6Ho7vLDOPPnzw85q3/HHXfI/3bx4sVhhyHFg2n9+vWLT+Hjx4+Xv+GZZ54JWy3PPvussY11ww03KM4etP/q5ZdfHiQT6Yk6kZ0GntsTix3/szvJ047BFC8BFfsc8qPQDz30UAIHCnnfs6mcMw727rvvht2FnT179r3/Su1CGLEfIK+WlStXMoyHwVcp9dC4l27Yr+KqPeNU8REHajd71LiTpNodC+XfBzevcLVbkmrfRVrj0a9Rf6Fe8Z4G2rdrUauWSL+qrP9JtjoZ8nRi7fue6Ly1rIHtGN3y66xbPbeHVfxCfdi7LsRyr3CNm8uo3RI9pO/Jb7yg8XwlxcVgDOfOMgbQfrqK2EoV7/zkv/e/2j3m1e5cpXb7f/G6fDvXeBC2YvkmFa795CP5voLYzrUfEhRLBigus9pQrnbH7Ujvr6ZWAzv1UUwgxcHO1CCMQztGt/xqOysR3Z1OIyfUHk5iSN+L6DkYiiUrdg+1fFUsljGcIDSGntun3RNE+xnfGhut9jYfeKKe+F+NJwuq3WLKvMI1Hvfj/xP/82PF/4aUbOwt1jRaSnyQKNY/3onUF/suGvMMPY8GDDtURfQsJ8V6kM9KTQ3COLSjscsfxTMW1B5V4Y/DwPYbUvMx9j1/4aI/+G+fJn7Q2LGW9z21HRR59So+cDSWu+YShNA12EVB+wnyYQcjPc/21DisZ17h2tmvRrFWYzwqGMUz1qO4PWnYYTqix9/oPGRndhCa3Y5RL7/21qfz1upqRxqNejCveX1PbbMVKx541rTa4yF5Ni9BaHwWxvgEarER6rmLcSwnnMLe8N6kwtUOM2pv9oo70bGfHot6HaN4JK/aQxBjL0Q+vschCE1tx1iOQmscpYhorNdzoDXqIDSv74WdE6slpXnPTyUI05fYiqLbZfY/BT7GKUIsc8E4FB7RGOrf7E0KwujGo+geTK9YmVEUpdivQqaVcQhCU9sxliDU6LSRjvVhj+7EEoQm9T2xjnrmsjytiSCM69RQY/9UsZdH8cTzsBcjhHxERMOBSYWL1dRTbOAQkHlBKJ17fo3OZhJvi/pB3oofEelZRp2BGp8gNK8dYwlCtVNl0e2+aPeNGIPQvL4nqlTnPorYryIFCcJ4EFuLGAjUJoiiv4o9ONFxYzw0IXqz2NTVNirx6eIjokhZUwsXNaO49+q/ZCC4QFODMLDXIhZGcfjwt1HYg8naaxrjKSvto6Mh0524BaFJ7RjjBbpG7XOE9A35Jhx7EIbte/4TJVH0Pf/l6Bq7KTF26TR0dkvgy5SGCLlFS5cuXRSfvBMLt9stcivsjZ2SqvCysrLAE2pyc3Pl94EU9Rby9WHbuZs0GrhqigujtjyIrh3js4nJu8qECRNeffXV1KpAA+uQLm0IHsxrGDMG7hD+p1ukVuFhN0u1R3mYgTEipatO8S5Iibq5aJJUIF3aENxiDQmm/0E/SGeVlZXyhycXFBQoPr4DIAiRiJ4kM2nSJD1/+N577yVkeo3U8vLLL8tffOihh5LkGbwgCAHbjBkzQl5ZsWJF2EdbrFq1Sn6jasWnySDNp4Pye9YLN910E5UDghDJ4sYbb5S/OH78eI3H0JSUlChm3q233kp9Ipjigx7Fvpfh16OBIASiN2zYMMWn2fXu3Xvp0qUhcSj+c+HChWPGjJGXIwpRfOwO0pbiE63V9r2AKPD1CRhm1apV2kc1/b+VPy8tmPjtuHHjqEwEHzmQ7zONHDnygw8+oHJgCL4+AcOIADty5IjiuZxAyGmXIJKSFESIxx9/XP7iXXfdRc3AKBwahZGmT5/+8MMPR/e3IgWXLFlCHSLYli1b5JdTCSNGjKByQBAiGeXk5MyZM0fxi8/aZsyYIVKQS+ERQvGuMfPnz+cyGRiIc4QwRVlZ2Ysvvjhv3ryw7xw5cuTMmTOLi4upNMh7Ue/eveWvm3QHPhCEgPEqKys3bty4a9eu/fv3h5wgFFPAQYMG9evXr6ioiIqColWrVm3atCnkxXbt2s2ZM4fKAUEIAIAxOEcIACAIAQAgCAEAIAgBACAIAQAgCAEAIAgBACAIAQAgCAEAIAgBACAIAQAgCAEAIAgBAEh5LqogyZWVlS1cuND/87PPPkuFJEpJSck777wjfhg8ePCUKVOoEIAgTC/+5+rpeWd+fr6xz5itq6tbtGgRQZhwNTU1/oaYMWNG8ncbAAShwcrLy8ePH6/nnWKUZEQD3QZIIZwjBAAwI0Qkdu7cqfHb3Nxcqgh0G4AgtLIBAwZQCaDbAJbBoVEAAEEIc5SVld3zT4EXS0tLZ8+ebQ8ifltSUhJRybEU4na7V61aJd4f+Nvrrrtu4cKFoszAe0RR/sVeunRpHNZIvFmUIBYjUMKkSZNCFsnUEvTUSQLFXj/ineL94q9CVlC7mRSbW/xJcDl9+/ZVWxL/Ygd3DPGfGp8Y548zpJLVljmwJGp/nvA+j38hQYfgEzxR/1VdXZ3GlfcTJ04UbzCpkICVK1cWFBSo/fmsWbP8fy7e5n9FfJZ5C+Mv8Nprr9Xon6L8gwcPxlhCRUWFeXVieLcxtn7Eb7W/7yHK37x5s57lF0WJNlUrZ8mSJYE/1O4Y4ld6urrZH2dIF5JvESHLLN6QhH0eIQjC+AVhYAsRP8w4J6Q3KyaHIYX4LViwIOyOkf/PdQZhLAsjrF27VnEBQl4RKaU2LoSUID59xj8FZ5tGCbHXiXlBaEj9yDNeMV3EO7WXX9RAoHH99SwvR1SRPAz8zSFfhoR/nCFdSG2Z1YIwGfo8CMKEBaF/GBW7sSF7auI9wZuBGJfNKCR4QhN4T/B2IgoMTIxE+XqCMJaFEcQsJHijFaUFlyOWLTiixBvke7jBJYhPlO96B8eAYgmG1IlJQRh7/Yj36Fw7tSwMXn7/x4n5cfAHBe8f+Infirryt0jIRFP8Z3BO+GMsgR9nSBcKXuZAAIvPFcu/8pzgP0mGPg+CMJFB6O/3im8L2aWV50rshYjfBm8earuKgUICG6RGEEa9MPqXR3xc4G0hSxJcglrWhrxNjKpm1IkZQRh7/QiBGNAoQTRNoKXk42bIVz7Umjt4jiIqWeNIQPCcSXycRnXF4eNi70LyZRbvVJxbJ0mfB0GY4CDUHj2D3xmyIRlSSPB+tHwvUr4VqW2KhixMRMsT/M7gsSPwuhjp9LdC8EBvVJ2YEYQG1o+gdgowMBFRG171N3fIEWaNiUhwjIWsWpw/LvYuJN811DgamQx9HgShYUGoIWQfNvivtAcjKeh8W/BVAEYVEtgv1jOIB48dGkEY9cIE/0pjxzYgMEwHV2+gBLUdcMWPCy7BqDoxvNsYWz96ljYwwoZMm/Q3d/Ahu7CzEMUFjv/Hxd6F5CcL9JSQwD4PNXx9Ik4GDhyo/YYhQ4b4f/jiiy+MLaSysvLDDz/0/3zTTTeFXVSdN72Meo3cbvfy5cv9Pw8dOjTsBz399NP+0y35+fnyEoYNGxa2hFGjRvl/CNwC26Q6MYSx9aNn7UaMGOH/Yd++fWoX32s3d/BvCwsLtT9u9OjRMfau2D8u9i6kUY1mt6lRC4wA7iwTsZDT9cH69u2r9qucnBztYi+88MKwHx1dIeXl5YGfBw8erGcdxTQi8MgLw9co+CKO3r17RxFCwSWEXQzbuWc7xKdODOk2xtaPnrXr3Llz4Oe9e/cq3gRHu56Df6uxFehn9sfF3oW0qzEJ+zwIQiONGzcudRdeY1sN1rNnz6RaHjUFBQXBX2RWs2fPnoTXSXTdJsb60V9CjDGfugzpQinX50EQIrw2bdpYaXX6naN/8pcOdYL4dyEWmCBEUnC73XqOq2icp0zI8miI/WHFyVYnxtaPzhLWrVuXthtFnJ93nQx9HiG4WMb6gh/xE/IlazWmHlfp0qVLRMtTVlZWeo74IaSEffv2WaNOTKofW7jHP/lVVlYGatKQM3zJL/YulHJ9HgRhWuvZs2fgauz169eHfb/Y/AJXVJqhc+fOgeX57LPPwr5/2rRpA8/ZsGGDvIQtW7aELWH27Nn+2yIHbsGcbHVieP0EvhyydevWiCa7vXr1SoeNIvYulHJ9HgRhups+fbr/h+eee07s/mu/+ZFHHjF7eWbOnOn/4fHHH3e73ToTyH/OI6SEZcuWhc2wuXPnLjonLy8vaevE2Pq54447/D888MADgVmFIlG++BT/z7NmzYrxqF0Kib0LpVyfB0GY1iZPnhw4rnLfffdpbIcLFy5cvny5/85V5gl8uU0sz9SpU9WWR7z+y1/+0v+zmOIUFRXJSxCbusY+ryghkGEhJSRbnRhbPxMnTgxMIH7zm99orN1jjz0WGHZvv/329NkoYu9CKdfnoYp7CsTnFmv67+6h/cCH6AoR/PcmDmwe8jt3iA/y3zVY/K/ZCxNyH6mwtw+2Kd2VKrgE8bP8bpMhz/GRr7IhdWLGLdYMqZ/gu+GItVO8p3Zw/chvABTR8mssSYjAzak17tISh48zpAtFt0UksM9DEVeNRkz7SzyDBw+eMmVKEi622DzWr1/vvznFh+eITS5w0409e/b4pwXiRTFFWL16tdnLM27cuAULFjzwwAPi5+XniCXs06dPYWHhxo0bA8vjJwYI+be8g0sYP368WPLp06cHvsUvCgn+YpwoQb5rHM86ibTbxF4/xcXFgRI01s5PvDM5+23cOmF0XSjl+jyYEZp+r9GQ6UJSzQj9N4/WPr4nNkv/TX7jsDDyPVxFGrfzN6SE2OvE8G5jbP0oPpIwhNrtKC0/I4y9kqOY9Ce8z4N7jaa1nJycOXPmiE1XPvRfe+21YutasmRJ3O4pE9jDraioEDu58iea+hdp+/bt2vf5jLGEJKwTY+tH/Fa8R7xTsQT/4yRT+mZJyVDJqdXnIWcP3rdCWgncXrlLly6x38ordpWVlYFbgPbq1SuKyxdjLyHZ6sTYtXO73YEvsUVXguXFXskp1+dBEAIA0h2HRgEABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQAABCEAAAQhAAAEIQCAIAQAgCAEAIAgBACAIAQAgCAEAIAgBACAIAQAgCAEAIAgBACAIAQAgCAEAIAgBACAIAQAIMX9rwADAD01rrUtAS0TAAAAAElFTkSuQmCC\",\n \"displayName\": \"Mikeulrich75\",\n \"id\": \"github.com_Mikeulrich75\"\n },\n \"containerContexts\": [\n \"WEB\"\n ]\n}\n\n\n___TEMPLATE_PARAMETERS___\n\n[\n {\n \"valueValidators\": [\n {\n \"type\": \"NON_EMPTY\"\n }\n ],\n \"displayName\": \"Event Parameter\",\n \"simpleValueType\": true,\n \"name\": \"event\",\n \"type\": \"TEXT\",\n \"valueHint\": \"Event name fired into dataLayer\"\n },\n {\n \"help\": \"Select the EE dataLayer type\",\n \"selectItems\": [\n {\n \"displayValue\": \"Impressions\",\n \"value\": \"impressions\"\n },\n {\n \"displayValue\": \"Product Click\",\n \"value\": \"click\"\n },\n {\n \"displayValue\": \"Product Detail\",\n \"value\": \"detail\"\n },\n {\n \"displayValue\": \"Add to Cart\",\n \"value\": \"add\"\n },\n {\n \"displayValue\": \"Remove from Cart\",\n \"value\": \"remove\"\n },\n {\n \"displayValue\": \"Checkout\",\n \"value\": \"checkout\"\n },\n {\n \"displayValue\": \"Purchase\",\n \"value\": \"purchase\"\n },\n {\n \"displayValue\": \"Promotion Impressions\",\n \"value\": \"promoView\"\n },\n {\n \"displayValue\": \"Promotion Clicks\",\n \"value\": \"promoClick\"\n },\n {\n \"displayValue\": \"Refunds\",\n \"value\": \"refund\"\n },\n {\n \"displayValue\": \"Checkout Options\",\n \"value\": \"checkout_option\"\n }\n ],\n \"valueValidators\": [\n {\n \"type\": \"NON_EMPTY\"\n }\n ],\n \"displayName\": \"EE Event Type\",\n \"defaultValue\": \"---\",\n \"simpleValueType\": true,\n \"name\": \"eventType\",\n \"type\": \"SELECT\"\n },\n {\n \"help\": \"Select true to set currency\",\n \"macrosInSelect\": false,\n \"selectItems\": [\n {\n \"displayValue\": \"true\",\n \"value\": true\n },\n {\n \"displayValue\": \"false\",\n \"value\": false\n }\n ],\n \"displayName\": \"Currency Parameter\",\n \"defaultValue\": false,\n \"simpleValueType\": true,\n \"name\": \"currencyDropDown\",\n \"type\": \"SELECT\",\n \"subParams\": [\n {\n \"enablingConditions\": [\n {\n \"paramName\": \"currencyDropDown\",\n \"type\": \"EQUALS\",\n \"paramValue\": true\n }\n ],\n \"displayName\": \"value\",\n \"defaultValue\": \"\",\n \"simpleValueType\": true,\n \"name\": \"currencyParameter\",\n \"type\": \"TEXT\",\n \"valueHint\": \"Currency value\"\n }\n ]\n },\n {\n \"help\": \"Select true to add actionfield parameters\",\n \"macrosInSelect\": false,\n \"selectItems\": [\n {\n \"displayValue\": \"true\",\n \"value\": true\n },\n {\n \"displayValue\": \"false\",\n \"value\": false\n }\n ],\n \"enablingConditions\": [\n {\n \"paramName\": \"eventType\",\n \"type\": \"EQUALS\",\n \"paramValue\": \"click\"\n },\n {\n \"paramName\": \"eventType\",\n \"type\": \"EQUALS\",\n \"paramValue\": \"detail\"\n },\n {\n \"paramName\": \"eventType\",\n \"type\": \"EQUALS\",\n \"paramValue\": \"add\"\n },\n {\n \"paramName\": \"eventType\",\n \"type\": \"EQUALS\",\n \"paramValue\": \"remove\"\n },\n {\n \"paramName\": \"eventType\",\n \"type\": \"EQUALS\",\n \"paramValue\": \"checkout\"\n },\n {\n \"paramName\": \"eventType\",\n \"type\": \"EQUALS\",\n \"paramValue\": \"purchase\"\n },\n {\n \"paramName\": \"eventType\",\n \"type\": \"EQUALS\",\n \"paramValue\": \"promoView\"\n },\n {\n \"paramName\": \"eventType\",\n \"type\": \"EQUALS\",\n \"paramValue\": \"refund\"\n },\n {\n \"paramName\": \"eventType\",\n \"type\": \"EQUALS\",\n \"paramValue\": \"checkout_option\"\n }\n ],\n \"displayName\": \"Actionfield Object Parameters\",\n \"defaultValue\": false,\n \"simpleValueType\": true,\n \"name\": \"actionFieldDropDown\",\n \"type\": \"SELECT\",\n \"subParams\": [\n {\n \"help\": \"\",\n \"enablingConditions\": [\n {\n \"paramName\": \"actionFieldDropDown\",\n \"type\": \"EQUALS\",\n \"paramValue\": true\n }\n ],\n \"valueValidators\": [],\n \"displayName\": \"\",\n \"name\": \"actionFieldParameters\",\n \"simpleTableColumns\": [\n {\n \"selectItems\": [\n {\n \"displayValue\": \"id\",\n \"value\": \"id\"\n },\n {\n \"displayValue\": \"affiliation\",\n \"value\": \"affiliation\"\n },\n {\n \"displayValue\": \"revenue\",\n \"value\": \"revenue\"\n },\n {\n \"displayValue\": \"tax\",\n \"value\": \"tax\"\n },\n {\n \"displayValue\": \"shipping\",\n \"value\": \"shipping\"\n },\n {\n \"displayValue\": \"coupon\",\n \"value\": \"coupon\"\n },\n {\n \"displayValue\": \"list\",\n \"value\": \"list\"\n },\n {\n \"displayValue\": \"step\",\n \"value\": \"step\"\n },\n {\n \"displayValue\": \"option\",\n \"value\": \"option\"\n }\n ],\n \"valueValidators\": [\n {\n \"type\": \"NON_EMPTY\"\n }\n ],\n \"defaultValue\": \"\",\n \"displayName\": \"key\",\n \"name\": \"name\",\n \"isUnique\": true,\n \"type\": \"SELECT\"\n },\n {\n \"valueValidators\": [\n {\n \"type\": \"NON_EMPTY\"\n }\n ],\n \"defaultValue\": \"\",\n \"displayName\": \"value\",\n \"name\": \"value\",\n \"isUnique\": false,\n \"type\": \"TEXT\",\n \"valueHint\": \"key value\"\n }\n ],\n \"type\": \"SIMPLE_TABLE\"\n }\n ]\n },\n {\n \"valueValidators\": [\n {\n \"type\": \"NON_EMPTY\"\n }\n ],\n \"enablingConditions\": [\n {\n \"paramName\": \"eventType\",\n \"type\": \"NOT_EQUALS\",\n \"paramValue\": \"checkout_option\"\n }\n ],\n \"displayName\": \"Product/Promo Object\",\n \"simpleValueType\": true,\n \"name\": \"products\",\n \"type\": \"TEXT\",\n \"valueHint\": \"Array of product or promo objects\"\n },\n {\n \"help\": \"Select true to add custom parameters\",\n \"macrosInSelect\": false,\n \"selectItems\": [\n {\n \"displayValue\": \"true\",\n \"value\": true\n },\n {\n \"displayValue\": \"false\",\n \"value\": false\n }\n ],\n \"displayName\": \"Custom Parameters\",\n \"defaultValue\": false,\n \"simpleValueType\": true,\n \"name\": \"customParameterDropDown\",\n \"type\": \"SELECT\",\n \"subParams\": [\n {\n \"alwaysInSummary\": false,\n \"enablingConditions\": [\n {\n \"paramName\": \"customParameterDropDown\",\n \"type\": \"EQUALS\",\n \"paramValue\": true\n }\n ],\n \"valueValidators\": [],\n \"displayName\": \"\",\n \"name\": \"customParameter\",\n \"simpleTableColumns\": [\n {\n \"valueValidators\": [\n {\n \"type\": \"NON_EMPTY\"\n }\n ],\n \"defaultValue\": \"\",\n \"displayName\": \"key\",\n \"name\": \"name\",\n \"isUnique\": true,\n \"type\": \"TEXT\",\n \"valueHint\": \"key name\"\n },\n {\n \"valueValidators\": [\n {\n \"type\": \"NON_EMPTY\"\n }\n ],\n \"defaultValue\": \"\",\n \"displayName\": \"value\",\n \"name\": \"value\",\n \"type\": \"TEXT\",\n \"valueHint\": \"key value\"\n }\n ],\n \"type\": \"SIMPLE_TABLE\"\n }\n ]\n }\n]\n\n\n___SANDBOXED_JS_FOR_WEB_TEMPLATE___\n\nconst makeTableMap = require('makeTableMap');\nconst query = require('queryPermission');\nconst createQueue = require('createQueue');\nconst dataLayerPush = createQueue('dataLayer');\nconst log = require('logToConsole');\nconst merge = function() {\n const obj = {},\n il = arguments.length;\n let i = 0,\n key;\n for (; i < il; i++) {\n for (key in arguments[i]) {\n if (arguments[i].hasOwnProperty(key)) {\n obj[key] = arguments[i][key];\n }\n }\n }\n return obj;\n};\nconst event = {'event': data.event};\nconst currencyParameter = data.currencyParameter;\nconst actionFieldParameters = data.actionFieldParameters ? makeTableMap(data.actionFieldParameters, 'name', 'value') : undefined;\nconst actionFieldDropDown = data.actionFieldDropDown;\nconst products = data.products;\nconst customParameter = data.customParameter ? makeTableMap(data.customParameter, 'name', 'value') : undefined;\nconst customParameterDropDown = data.customParameterDropDown;\nconst eventType = data.eventType;\nconst dLayer = {};\nif (eventType === 'impressions') {\n dLayer.ecommerce = {\n 'currencyCode': currencyParameter,\n 'impressions': products \n };\n} else if (eventType === 'click') {\n dLayer.ecommerce = {\n 'currencyCode': currencyParameter,\n 'click': { \n 'actionField': actionFieldParameters,\n 'products': products\n } \n }; \n} else if (eventType === 'detail') {\n dLayer.ecommerce = {\n 'currencyCode': currencyParameter,\n 'detail': {\n 'actionField': actionFieldParameters, \n 'products': products\n }\n };\n} else if (eventType === 'add') {\n dLayer.ecommerce = {\n 'currencyCode': currencyParameter,\n 'add': { \n 'actionField': actionFieldParameters, \n 'products': products\n }\n };\n} else if (eventType === 'remove') {\n dLayer.ecommerce = {\n 'currencyCode': currencyParameter,\n 'remove': { \n 'actionField': actionFieldParameters, \n 'products': products \n }\n }; \n} else if (eventType === 'promoView') {\n dLayer.ecommerce = {\n 'currencyCode': currencyParameter,\n 'promoView': { \n 'actionField': actionFieldParameters, \n 'promotions': products \n }\n }; \n} else if (eventType === 'promoClick') {\n dLayer.ecommerce = {\n 'currencyCode': currencyParameter,\n 'promoClick': { \n 'promotions': products \n }\n }; \n} else if (eventType === 'checkout') {\n dLayer.ecommerce = {\n 'currencyCode': currencyParameter,\n 'checkout': { \n 'actionField': actionFieldParameters, \n 'products': products \n }\n }; \n} else if (eventType === 'checkout_option') {\n dLayer.ecommerce = {\n 'currencyCode': currencyParameter,\n 'checkout_option': { \n 'actionField': actionFieldParameters, \n 'products': products \n }\n }; \n} else if (eventType === 'purchase') {\n dLayer.ecommerce = {\n 'currencyCode': currencyParameter,\n 'purchase': { \n 'actionField': actionFieldParameters, // Transaction ID. Required for purchases and refunds.\n 'products': products // Name or ID is required.\n }\n };\n} else if (eventType === 'refund') {\n dLayer.ecommerce = {\n 'currencyCode': currencyParameter,\n 'refund': { \n 'actionField': actionFieldParameters, // Transaction ID. Required for purchases and refunds.\n 'products': products // Product ID and quantity. Required for partial refunds.\n }\n };\n}\nconst dataLayer = merge(event, customParameter, dLayer);\nif (query('access_globals', 'readwrite', 'dataLayer')) {\n dataLayerPush(dataLayer);\n log(\"data:\", dataLayer);\n}\ndata.gtmOnSuccess();\n\n\n___WEB_PERMISSIONS___\n\n[\n {\n \"instance\": {\n \"key\": {\n \"publicId\": \"logging\",\n \"versionId\": \"1\"\n },\n \"param\": [\n {\n \"key\": \"environments\",\n \"value\": {\n \"type\": 1,\n \"string\": \"debug\"\n }\n }\n ]\n },\n \"isRequired\": true\n },\n {\n \"instance\": {\n \"key\": {\n \"publicId\": \"access_globals\",\n \"versionId\": \"1\"\n },\n \"param\": [\n {\n \"key\": \"keys\",\n \"value\": {\n \"type\": 2,\n \"listItem\": [\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"dataLayer\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n }\n ]\n }\n ]\n }\n }\n ]\n },\n \"clientAnnotations\": {\n \"isEditedByUser\": true\n },\n \"isRequired\": true\n }\n]\n\n\n___NOTES___\n\nCreated on 7/2/2019, 9:34:14 AM\n\n\n", "galleryReference": { "host": "github.com", "owner": "Mikeulrich75", "repository": "dataLayerBuilderEnhancedEcommerce", "version": "81e10709ee6cd35180fab16353d932f1991ae1b4", "signature": "195dc8d1157b7f7684f333014b6bb159f6e343356c69f866cd4ef2ab6f84f7eb" } } ] } }