{"appVersion":"258.0.18","id":"3kn97bhp1w","name":"MoEngage-SFMC Solution Package V3","version":1,"modelVersion":"9","references":{"journeys/78d45fa2-b82b-43f5-a83e-8a414a979136":[{"identifier":"eventDefinitions/006c8b6d-4568-4dc9-943c-8d013ade9dec","relationship":"required"},{"identifier":"categories/60359","relationship":"required"},{"identifier":"registeredCustomActivities/c1246b39-72f9-4236-83cc-7d01610f0ea6","relationship":"required"}],"journeys/4b36601c-7d19-407e-b13a-164a6aa0a0aa":[{"identifier":"eventDefinitions/3cf0a4ea-d16e-4a7a-abf6-1f9b8f23f156","relationship":"required"},{"identifier":"categories/60359","relationship":"required"},{"identifier":"registeredCustomActivities/031ffd20-ba25-4f6e-bb8f-763379441019","relationship":"required"}],"eventDefinitions/3cf0a4ea-d16e-4a7a-abf6-1f9b8f23f156":[{"identifier":"dataExtensions/97e1d659-a98c-f011-a5dc-5cba2c191b88","relationship":"required"}],"eventDefinitions/006c8b6d-4568-4dc9-943c-8d013ade9dec":[{"identifier":"dataExtensions/96e1d659-a98c-f011-a5dc-5cba2c191b88","relationship":"required"}],"registeredCustomActivities/c1246b39-72f9-4236-83cc-7d01610f0ea6":[],"registeredCustomActivities/031ffd20-ba25-4f6e-bb8f-763379441019":[],"automations/f6b1914c-7338-455c-b619-93d98d5abb20":[{"identifier":"scriptActivities/0e3eadae-8e94-4b1d-9e82-1e78616b7fb2","relationship":"required"},{"identifier":"categories/60362","relationship":"required"}],"categories/60359":[{"identifier":"categories/36351","relationship":"required"}],"automations/9a922a01-5f0c-4e08-9e4c-69ef6760af98":[{"identifier":"queryActivities/22f9d9de-0772-432b-97ff-992b6349ab9f","relationship":"required"},{"identifier":"queryActivities/53898a0b-0e11-4273-9484-66500e37a425","relationship":"required"},{"identifier":"queryActivities/46bcdab4-f685-4cbf-aa3e-3f33c82d7e06","relationship":"required"},{"identifier":"categories/60362","relationship":"required"}],"dataExtensions/97e1d659-a98c-f011-a5dc-5cba2c191b88":[{"identifier":"categories/60358","relationship":"required"}],"dataExtensions/95e1d659-a98c-f011-a5dc-5cba2c191b88":[{"identifier":"categories/60358","relationship":"required"}],"dataExtensions/51195004-bc92-ef11-a5d1-5cba2c191058":[{"identifier":"categories/60356","relationship":"required"}],"dataExtensions/98e1d659-a98c-f011-a5dc-5cba2c191b88":[{"identifier":"categories/60356","relationship":"required"}],"dataExtensions/31e6a7ca-267f-ef11-a5d1-5cba2c191058":[{"identifier":"categories/60534","relationship":"required"}],"dataExtensions/9fbdc401-fe91-f011-a5dc-5cba2c191b88":[{"identifier":"categories/60357","relationship":"required"}],"dataExtensions/92e1d659-a98c-f011-a5dc-5cba2c191b88":[{"identifier":"categories/60357","relationship":"required"}],"dataExtensions/a0bdc401-fe91-f011-a5dc-5cba2c191b88":[{"identifier":"categories/60357","relationship":"required"}],"dataExtensions/94e1d659-a98c-f011-a5dc-5cba2c191b88":[{"identifier":"categories/60355","relationship":"required"}],"dataExtensions/96e1d659-a98c-f011-a5dc-5cba2c191b88":[{"identifier":"categories/60355","relationship":"required"}],"categories/60358":[{"identifier":"categories/36326","relationship":"required"}],"categories/60356":[{"identifier":"categories/36326","relationship":"required"}],"categories/60534":[{"identifier":"categories/36326","relationship":"required"}],"categories/60357":[{"identifier":"categories/36326","relationship":"required"}],"categories/60355":[{"identifier":"categories/36326","relationship":"required"}],"categories/36326":[],"scriptActivities/0e3eadae-8e94-4b1d-9e82-1e78616b7fb2":[{"identifier":"dataExtensions/51195004-bc92-ef11-a5d1-5cba2c191058","relationship":"required"},{"identifier":"categories/36348","relationship":"required"}],"categories/60362":[{"identifier":"categories/36344","relationship":"required"}],"categories/36351":[],"queryActivities/22f9d9de-0772-432b-97ff-992b6349ab9f":[{"identifier":"dataExtensions/a0bdc401-fe91-f011-a5dc-5cba2c191b88","relationship":"required"},{"identifier":"dataExtensions/9fbdc401-fe91-f011-a5dc-5cba2c191b88","relationship":"required"},{"identifier":"categories/36346","relationship":"required"}],"queryActivities/53898a0b-0e11-4273-9484-66500e37a425":[{"identifier":"dataExtensions/a0bdc401-fe91-f011-a5dc-5cba2c191b88","relationship":"required"},{"identifier":"categories/36346","relationship":"required"}],"queryActivities/46bcdab4-f685-4cbf-aa3e-3f33c82d7e06":[{"identifier":"dataExtensions/a0bdc401-fe91-f011-a5dc-5cba2c191b88","relationship":"required"},{"identifier":"dataExtensions/9fbdc401-fe91-f011-a5dc-5cba2c191b88","relationship":"required"},{"identifier":"categories/36346","relationship":"required"}],"categories/36344":[],"categories/36348":[],"categories/36346":[],"cloudPageCollections/60360":[{"identifier":"categories/60360","relationship":"required"},{"identifier":"categories/36353","relationship":"required"}],"categories/60360":[{"identifier":"categories/36353","relationship":"required"}],"categories/36353":[],"cloudPageCollections/60361":[{"identifier":"categories/60361","relationship":"required"},{"identifier":"categories/36353","relationship":"required"}],"categories/60361":[{"identifier":"categories/36353","relationship":"required"}],"landingPages/708434-4844":[{"identifier":"primaryLandingPages/708434-4844","relationship":"required"},{"identifier":"dataExtensions/31e6a7ca-267f-ef11-a5d1-5cba2c191058","relationship":"required"},{"identifier":"dataExtensions/92e1d659-a98c-f011-a5dc-5cba2c191b88","relationship":"required"},{"identifier":"categories/36352","relationship":"required"}],"primaryLandingPages/708435-4845":[{"identifier":"cloudPageCollections/60361","relationship":"required"},{"identifier":"categories/36352","relationship":"required"}],"landingPages/708435-4845":[{"identifier":"primaryLandingPages/708435-4845","relationship":"required"},{"identifier":"dataExtensions/a0bdc401-fe91-f011-a5dc-5cba2c191b88","relationship":"required"},{"identifier":"dataExtensions/92e1d659-a98c-f011-a5dc-5cba2c191b88","relationship":"required"},{"identifier":"categories/36352","relationship":"required"}],"primaryLandingPages/708434-4844":[{"identifier":"cloudPageCollections/60360","relationship":"required"},{"identifier":"categories/36352","relationship":"required"}],"categories/36352":[]},"input":[{"key":"cloudPages-domain","type":"entityPicker","label":"FIELD_DEFINITION_CLOUDPAGES_DOMAIN","meta":{"entityType":"cloudpagesDomain"},"isSystem":true,"entities":["primaryLandingPages/708435-4845","primaryLandingPages/708434-4844"]}],"config":{"preserveCategories":true,"storeImagesAsReferences":false},"entities":{"assets":{},"attributeGroups":{},"attributeRelationships":{},"attributeSets":{},"automations":{"f6b1914c-7338-455c-b619-93d98d5abb20":{"issues":[],"originID":"f6b1914c-7338-455c-b619-93d98d5abb20","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"categoryId":"{{mcpm#/entities/categories/60362/data/id}}","description":"","key":"b5341e5c-f5ae-7594-9310-ab651cdf88a7","name":"MoEngage Users Sync","steps":[{"activities":[{"name":"{{mcpm#/entities/scriptActivities/0e3eadae-8e94-4b1d-9e82-1e78616b7fb2/data/name}}","activityObjectId":"{{mcpm#/entities/scriptActivities/0e3eadae-8e94-4b1d-9e82-1e78616b7fb2/data/id}}","objectTypeId":423,"displayOrder":0,"serializedObject":"<SSJSActivity xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://exacttarget.com/wsdl/partnerAPI\"><PartnerKey xsi:nil=\"true\" /><ObjectID>0e3eadae-8e94-4b1d-9e82-1e78616b7fb2</ObjectID><Name>MoEngage User Sync Script V2</Name><CategoryId>0</CategoryId></SSJSActivity>"}],"annotation":"","name":""}],"startSource":{"typeId":1,"schedule":{"iCalRecur":"FREQ=DAILY;COUNT=1;INTERVAL=1","startDate":"2025-09-08T17:30:00","timeZoneId":34}}}},"9a922a01-5f0c-4e08-9e4c-69ef6760af98":{"issues":[],"originID":"9a922a01-5f0c-4e08-9e4c-69ef6760af98","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"categoryId":"{{mcpm#/entities/categories/60362/data/id}}","description":"","key":"bc254aac-c883-4944-8289-831d5a56723b","name":"MoEngage Streams Data Simplification","steps":[{"activities":[{"name":"{{mcpm#/entities/queryActivities/22f9d9de-0772-432b-97ff-992b6349ab9f/data/name}}","activityObjectId":"{{mcpm#/entities/queryActivities/22f9d9de-0772-432b-97ff-992b6349ab9f/data/id}}","objectTypeId":300,"displayOrder":0,"serializedObject":"<QueryDefinition xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://exacttarget.com/wsdl/partnerAPI\"><PartnerKey xsi:nil=\"true\" /><ObjectID>22f9d9de-0772-432b-97ff-992b6349ab9f</ObjectID><Name>Simplify MoEngage Streams JSON</Name></QueryDefinition>"},{"name":"{{mcpm#/entities/queryActivities/53898a0b-0e11-4273-9484-66500e37a425/data/name}}","activityObjectId":"{{mcpm#/entities/queryActivities/53898a0b-0e11-4273-9484-66500e37a425/data/id}}","objectTypeId":300,"displayOrder":1,"serializedObject":"<QueryDefinition xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://exacttarget.com/wsdl/partnerAPI\"><PartnerKey xsi:nil=\"true\" /><ObjectID>53898a0b-0e11-4273-9484-66500e37a425</ObjectID><Name>Populating the event_uuid field</Name></QueryDefinition>"}],"annotation":"","name":""},{"activities":[{"name":"{{mcpm#/entities/queryActivities/46bcdab4-f685-4cbf-aa3e-3f33c82d7e06/data/name}}","activityObjectId":"{{mcpm#/entities/queryActivities/46bcdab4-f685-4cbf-aa3e-3f33c82d7e06/data/id}}","objectTypeId":300,"displayOrder":0,"serializedObject":"<QueryDefinition xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://exacttarget.com/wsdl/partnerAPI\"><PartnerKey xsi:nil=\"true\" /><ObjectID>46bcdab4-f685-4cbf-aa3e-3f33c82d7e06</ObjectID><Name>MoEngage Flag Old Streams data to True</Name></QueryDefinition>"}],"annotation":"","name":""}],"startSource":{"typeId":1,"schedule":{"iCalRecur":"FREQ=DAILY;COUNT=1;INTERVAL=1","startDate":"2025-09-12T20:00:00","timeZoneId":34}}}}},"categories":{"36326":{"issues":[],"originID":"36326","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"description":"","categoryType":"dataextension","parentId":0,"name":"Data Extensions","editable":0,"extendable":1}},"36344":{"issues":[],"originID":"36344","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"description":"","categoryType":"AUTOMATIONS","parentId":0,"name":"my automations","editable":0,"extendable":1}},"36346":{"issues":[],"originID":"36346","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"description":"","categoryType":"queryactivity","parentId":0,"name":"Query","editable":0,"extendable":1}},"36348":{"issues":[],"originID":"36348","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"description":"","categoryType":"SSJSActivity","parentId":0,"name":"Scripts","editable":0,"extendable":1}},"36351":{"issues":[],"originID":"36351","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"description":"","categoryType":"journey","parentId":0,"name":"my journeys","editable":0,"extendable":1}},"36352":{"issues":[],"originID":"36352","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"description":"The root folder for assets","categoryType":"asset","parentId":0,"name":"Content Builder","editable":0,"extendable":1}},"36353":{"issues":[],"originID":"36353","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"description":"The root folder for CloudPages","categoryType":"cloudpages","parentId":0,"name":"CloudPages","editable":0,"extendable":1}},"60355":{"issues":[],"originID":"60355","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"description":"","categoryType":"dataextension","parentId":"{{mcpm#/entities/categories/36326/data/id}}","name":"MoEngage Event DE","editable":1,"extendable":1}},"60356":{"issues":[],"originID":"60356","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"description":"","categoryType":"dataextension","parentId":"{{mcpm#/entities/categories/36326/data/id}}","name":"MoEngage User Sync","editable":1,"extendable":1}},"60357":{"issues":[],"originID":"60357","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"description":"","categoryType":"dataextension","parentId":"{{mcpm#/entities/categories/36326/data/id}}","name":"MoEngage Data Track","editable":1,"extendable":1}},"60358":{"issues":[],"originID":"60358","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"description":"","categoryType":"dataextension","parentId":"{{mcpm#/entities/categories/36326/data/id}}","name":"MoEngage Push DE","editable":1,"extendable":1}},"60359":{"issues":[],"originID":"60359","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"description":"","categoryType":"journey","parentId":"{{mcpm#/entities/categories/36351/data/id}}","name":"MoEngage-SFMC","editable":1,"extendable":1}},"60360":{"issues":[],"originID":"60360","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"description":"","categoryType":"cloudpages","parentId":"{{mcpm#/entities/categories/36353/data/id}}","name":"MoEngage Credentials","editable":1,"extendable":0}},"60361":{"issues":[],"originID":"60361","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"description":"","categoryType":"cloudpages","parentId":"{{mcpm#/entities/categories/36353/data/id}}","name":"MoEngage Data Tracking","editable":1,"extendable":0}},"60362":{"issues":[],"originID":"60362","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"description":"","categoryType":"automations","parentId":"{{mcpm#/entities/categories/36344/data/id}}","name":"MoEngage-SFMC","editable":1,"extendable":1}},"60534":{"issues":[],"originID":"60534","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"description":"","categoryType":"dataextension","parentId":"{{mcpm#/entities/categories/36326/data/id}}","name":"MoEngage Credential DE","editable":1,"extendable":1}}},"cloudPageCollections":{"60360":{"issues":[],"originID":"60360","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"name":"MoEngage Credentials","description":"","parentId":"{{mcpm#/entities/categories/36353/data/id}}","parentName":"{{mcpm#/entities/categories/36353/data/name}}"}},"60361":{"issues":[],"originID":"60361","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"name":"MoEngage Data Tracking","description":"","parentId":"{{mcpm#/entities/categories/36353/data/id}}","parentName":"{{mcpm#/entities/categories/36353/data/name}}"}}},"codeResources":{},"dataExtensions":{"97e1d659-a98c-f011-a5dc-5cba2c191b88":{"issues":[],"originID":"97e1d659-a98c-f011-a5dc-5cba2c191b88","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"categoryId":"{{mcpm#/entities/categories/60358/data/id}}","dataRetentionProperties":{"isDeleteAtEndOfRetentionPeriod":false,"isResetRetentionPeriodOnImport":false,"isRowBasedRetention":false,"rowBasedThreshold":1000000000},"description":"","isFieldAdditionAllowed":true,"isFieldModificationAllowed":true,"isObjectDeletable":true,"isSendable":true,"isTestable":true,"name":"MoEngage Push Customer DE","sendableCustomObjectField":"MoEngage_ID","sendableSubscriberField":"_SubscriberKey","customerKey":"MoEngage Push Customer DE","fields":[{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":false,"isPrimaryKey":true,"isReadOnly":false,"isTemplateField":false,"length":100,"masktype":"None","mustOverride":false,"name":"MoEngage_ID","ordinal":0,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":100,"masktype":"None","mustOverride":false,"name":"First Name","ordinal":1,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":100,"masktype":"None","mustOverride":false,"name":"Last Name","ordinal":2,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":100,"masktype":"None","mustOverride":false,"name":"Mobile Number","ordinal":5,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":254,"masktype":"None","mustOverride":false,"name":"Email","ordinal":6,"type":"EmailAddress"}]}},"95e1d659-a98c-f011-a5dc-5cba2c191b88":{"issues":[],"originID":"95e1d659-a98c-f011-a5dc-5cba2c191b88","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"categoryId":"{{mcpm#/entities/categories/60358/data/id}}","dataRetentionProperties":{"isDeleteAtEndOfRetentionPeriod":false,"isResetRetentionPeriodOnImport":false,"isRowBasedRetention":false,"rowBasedThreshold":1000000000},"description":" ","isFieldAdditionAllowed":true,"isFieldModificationAllowed":true,"isObjectDeletable":true,"isSendable":false,"isTestable":false,"name":"MoEngage Push Activity Log","customerKey":"MoEngage Push Activity Log","fields":[{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":false,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":200,"masktype":"None","mustOverride":false,"name":"RequestID","ordinal":0,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":200,"masktype":"None","mustOverride":false,"name":"UserID","ordinal":1,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":200,"masktype":"None","mustOverride":false,"name":"CampaignName","ordinal":2,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":500,"masktype":"None","mustOverride":false,"name":"Status","ordinal":3,"type":"Text"},{"defaultValue":"GETDATE()","description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"masktype":"None","mustOverride":false,"name":"Date","ordinal":4,"type":"Date"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":500,"masktype":"None","mustOverride":false,"name":"Response","ordinal":5,"type":"Text"}]}},"51195004-bc92-ef11-a5d1-5cba2c191058":{"issues":[],"originID":"51195004-bc92-ef11-a5d1-5cba2c191058","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"categoryId":"{{mcpm#/entities/categories/60356/data/id}}","dataRetentionProperties":{"isDeleteAtEndOfRetentionPeriod":false,"isResetRetentionPeriodOnImport":false,"isRowBasedRetention":false,"rowBasedThreshold":1000000000},"description":"","isFieldAdditionAllowed":true,"isFieldModificationAllowed":true,"isObjectDeletable":true,"isSendable":false,"isTestable":false,"name":"Users Sync Automation Logs","customerKey":"Users Sync Automation Logs","fields":[{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":100,"masktype":"None","mustOverride":false,"name":"Timestamp","ordinal":0,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":400,"masktype":"None","mustOverride":false,"name":"Type","ordinal":1,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":4000,"masktype":"None","mustOverride":false,"name":"Description","ordinal":2,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":200,"masktype":"None","mustOverride":false,"name":"Message","ordinal":3,"type":"Text"}]}},"98e1d659-a98c-f011-a5dc-5cba2c191b88":{"issues":[],"originID":"98e1d659-a98c-f011-a5dc-5cba2c191b88","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"categoryId":"{{mcpm#/entities/categories/60356/data/id}}","dataRetentionProperties":{"isDeleteAtEndOfRetentionPeriod":false,"isResetRetentionPeriodOnImport":false,"isRowBasedRetention":false,"rowBasedThreshold":1000000000},"description":"","isFieldAdditionAllowed":true,"isFieldModificationAllowed":true,"isObjectDeletable":true,"isSendable":true,"isTestable":true,"name":"Sync Users to MoEngage","sendableCustomObjectField":"customer_id","sendableSubscriberField":"_SubscriberKey","customerKey":"Sync Users to MoEngage","fields":[{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":false,"isPrimaryKey":true,"isReadOnly":false,"isTemplateField":false,"length":200,"masktype":"None","mustOverride":false,"name":"customer_id","ordinal":0,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":50,"masktype":"None","mustOverride":false,"name":"moengage_id","ordinal":1,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":50,"masktype":"None","mustOverride":false,"name":"name","ordinal":2,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":50,"masktype":"None","mustOverride":false,"name":"first_name","ordinal":3,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":50,"masktype":"None","mustOverride":false,"name":"last_name","ordinal":4,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":254,"masktype":"None","mustOverride":false,"name":"email","ordinal":5,"type":"EmailAddress"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":50,"masktype":"None","mustOverride":false,"name":"mobile","ordinal":6,"type":"Phone"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":50,"masktype":"None","mustOverride":false,"name":"campaign_name","ordinal":8,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":false,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":50,"masktype":"None","mustOverride":false,"name":"MoEngage Workspace Name","ordinal":18,"type":"Text"},{"defaultValue":"false","description":"","isHidden":false,"isInheritable":true,"isOverridable":true,"isNullable":false,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"masktype":"None","mustOverride":false,"name":"Synced","ordinal":19,"type":"Boolean"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"masktype":"None","mustOverride":false,"name":"ANDROID","ordinal":20,"type":"Boolean"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"masktype":"None","mustOverride":false,"name":"IOS","ordinal":21,"type":"Boolean"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"masktype":"None","mustOverride":false,"name":"WEB","ordinal":22,"type":"Boolean"}]}},"31e6a7ca-267f-ef11-a5d1-5cba2c191058":{"issues":[],"originID":"31e6a7ca-267f-ef11-a5d1-5cba2c191058","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"categoryId":"{{mcpm#/entities/categories/60534/data/id}}","dataRetentionProperties":{"isDeleteAtEndOfRetentionPeriod":false,"isResetRetentionPeriodOnImport":false,"isRowBasedRetention":false,"rowBasedThreshold":1000000000},"description":"","isFieldAdditionAllowed":true,"isFieldModificationAllowed":true,"isObjectDeletable":false,"isSendable":true,"isTestable":false,"name":"MoEngage Credentials","sendableCustomObjectField":"WorkspaceName","sendableSubscriberField":"_SubscriberKey","customerKey":"MoEngage Credentials","fields":[{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":false,"isPrimaryKey":true,"isReadOnly":false,"isTemplateField":false,"length":200,"masktype":"None","mustOverride":false,"name":"WorkspaceName","ordinal":0,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":200,"masktype":"None","mustOverride":false,"name":"DataCenter","ordinal":1,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":200,"masktype":"None","mustOverride":false,"name":"WorkspaceID","ordinal":2,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":200,"masktype":"None","mustOverride":false,"name":"DataKey","ordinal":3,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":200,"masktype":"None","mustOverride":false,"name":"PushKey","ordinal":4,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"masktype":"None","mustOverride":false,"name":"Active","ordinal":5,"type":"Boolean"}]}},"9fbdc401-fe91-f011-a5dc-5cba2c191b88":{"issues":[],"originID":"9fbdc401-fe91-f011-a5dc-5cba2c191b88","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"categoryId":"{{mcpm#/entities/categories/60357/data/id}}","dataRetentionProperties":{"isDeleteAtEndOfRetentionPeriod":false,"isResetRetentionPeriodOnImport":false,"isRowBasedRetention":false,"rowBasedThreshold":1000000000},"description":"","isFieldAdditionAllowed":true,"isFieldModificationAllowed":true,"isObjectDeletable":true,"isSendable":false,"isTestable":false,"name":"MoEngage Data Track","customerKey":"MoEngage Data Track","fields":[{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":500,"masktype":"None","mustOverride":false,"name":"event_name","ordinal":0,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":500,"masktype":"None","mustOverride":false,"name":"event_code","ordinal":1,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":500,"masktype":"None","mustOverride":false,"name":"event_uuid","ordinal":2,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":500,"masktype":"None","mustOverride":false,"name":"event_time","ordinal":3,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":500,"masktype":"None","mustOverride":false,"name":"event_type","ordinal":4,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":500,"masktype":"None","mustOverride":false,"name":"event_source","ordinal":5,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":500,"masktype":"None","mustOverride":false,"name":"mobile_number","ordinal":6,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":500,"masktype":"None","mustOverride":false,"name":"uid","ordinal":7,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":4000,"masktype":"None","mustOverride":false,"name":"event_attributes","ordinal":8,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":4000,"masktype":"None","mustOverride":false,"name":"user_attributes","ordinal":9,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":4000,"masktype":"None","mustOverride":false,"name":"device_attributes","ordinal":10,"type":"Text"}]}},"92e1d659-a98c-f011-a5dc-5cba2c191b88":{"issues":[],"originID":"92e1d659-a98c-f011-a5dc-5cba2c191b88","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"categoryId":"{{mcpm#/entities/categories/60357/data/id}}","dataRetentionProperties":{"isDeleteAtEndOfRetentionPeriod":false,"isResetRetentionPeriodOnImport":false,"isRowBasedRetention":false,"rowBasedThreshold":1000000000},"description":"","isFieldAdditionAllowed":true,"isFieldModificationAllowed":true,"isObjectDeletable":true,"isSendable":false,"isTestable":false,"name":"MoEngage Tracking Credential","customerKey":"MoEngage Tracking Credential","fields":[{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":false,"isPrimaryKey":true,"isReadOnly":false,"isTemplateField":false,"length":50,"masktype":"None","mustOverride":false,"name":"UserName","ordinal":0,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":false,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":50,"masktype":"None","mustOverride":false,"name":"Password","ordinal":1,"type":"Text"},{"defaultValue":"True","description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"masktype":"None","mustOverride":false,"name":"Active","ordinal":2,"type":"Boolean"}]}},"a0bdc401-fe91-f011-a5dc-5cba2c191b88":{"issues":[],"originID":"a0bdc401-fe91-f011-a5dc-5cba2c191b88","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"categoryId":"{{mcpm#/entities/categories/60357/data/id}}","dataRetentionProperties":{"isDeleteAtEndOfRetentionPeriod":false,"isResetRetentionPeriodOnImport":false,"isRowBasedRetention":false,"rowBasedThreshold":1000000000},"description":"","isFieldAdditionAllowed":true,"isFieldModificationAllowed":true,"isObjectDeletable":true,"isSendable":false,"isTestable":false,"name":"Test MoEngage Data Track","customerKey":"Test MoEngage Data Track","fields":[{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":false,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":500,"masktype":"None","mustOverride":false,"name":"app_name","ordinal":0,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":false,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"masktype":"None","mustOverride":false,"name":"source","ordinal":1,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":false,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"masktype":"None","mustOverride":false,"name":"events","ordinal":3,"type":"Text"},{"defaultValue":"False","description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"masktype":"None","mustOverride":false,"name":"IsParsed","ordinal":4,"type":"Boolean"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":200,"masktype":"None","mustOverride":false,"name":"event_uuid","ordinal":5,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":false,"isPrimaryKey":true,"isReadOnly":false,"isTemplateField":false,"length":500,"masktype":"None","mustOverride":false,"name":"moe_request_id","ordinal":7,"type":"Text"},{"defaultValue":"GETDATE()","description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":false,"isPrimaryKey":true,"isReadOnly":false,"isTemplateField":false,"masktype":"None","mustOverride":false,"name":"Timestamp","ordinal":8,"type":"Date"}]}},"94e1d659-a98c-f011-a5dc-5cba2c191b88":{"issues":[],"originID":"94e1d659-a98c-f011-a5dc-5cba2c191b88","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"categoryId":"{{mcpm#/entities/categories/60355/data/id}}","dataRetentionProperties":{"isDeleteAtEndOfRetentionPeriod":false,"isResetRetentionPeriodOnImport":false,"isRowBasedRetention":false,"rowBasedThreshold":1000000000},"description":"","isFieldAdditionAllowed":true,"isFieldModificationAllowed":true,"isObjectDeletable":true,"isSendable":false,"isTestable":false,"name":"MoEngage Event Activity Log","customerKey":"MoEngage Event Activity Log","fields":[{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":false,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":200,"masktype":"None","mustOverride":false,"name":"RequestID","ordinal":0,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":200,"masktype":"None","mustOverride":false,"name":"CustomerID","ordinal":1,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":500,"masktype":"None","mustOverride":false,"name":"EventConfigData","ordinal":2,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":500,"masktype":"None","mustOverride":false,"name":"Status","ordinal":3,"type":"Text"},{"defaultValue":"GETDATE()","description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"masktype":"None","mustOverride":false,"name":"Date","ordinal":4,"type":"Date"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":500,"masktype":"None","mustOverride":false,"name":"Response","ordinal":5,"type":"Text"}]}},"96e1d659-a98c-f011-a5dc-5cba2c191b88":{"issues":[],"originID":"96e1d659-a98c-f011-a5dc-5cba2c191b88","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"categoryId":"{{mcpm#/entities/categories/60355/data/id}}","dataRetentionProperties":{"isDeleteAtEndOfRetentionPeriod":false,"isResetRetentionPeriodOnImport":false,"isRowBasedRetention":false,"rowBasedThreshold":1000000000},"description":"","isFieldAdditionAllowed":true,"isFieldModificationAllowed":true,"isObjectDeletable":true,"isSendable":true,"isTestable":true,"name":"MoEngage Event Customer DE","sendableCustomObjectField":"MoEngage_ID","sendableSubscriberField":"_SubscriberKey","customerKey":"MoEngage Event Customer DE","fields":[{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":false,"isPrimaryKey":true,"isReadOnly":false,"isTemplateField":false,"length":100,"masktype":"None","mustOverride":false,"name":"MoEngage_ID","ordinal":0,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":100,"masktype":"None","mustOverride":false,"name":"First Name","ordinal":1,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":100,"masktype":"None","mustOverride":false,"name":"Last Name","ordinal":2,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":100,"masktype":"None","mustOverride":false,"name":"Mobile Number","ordinal":5,"type":"Text"},{"description":"","isHidden":false,"isInheritable":false,"isOverridable":false,"isNullable":true,"isPrimaryKey":false,"isReadOnly":false,"isTemplateField":false,"length":254,"masktype":"None","mustOverride":false,"name":"Email","ordinal":6,"type":"EmailAddress"}]}}},"dataExtractActivities":{},"dataFilterDefinitions":{},"dataFilters":{},"eventDefinitions":{"3cf0a4ea-d16e-4a7a-abf6-1f9b8f23f156":{"issues":[],"originID":"3cf0a4ea-d16e-4a7a-abf6-1f9b8f23f156","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"name":"MoEngage PUSH Custom Activity Journey","type":"EmailAudience","dataExtensionId":"{{mcpm#/entities/dataExtensions/97e1d659-a98c-f011-a5dc-5cba2c191b88/data/id}}","description":"","eventDefinitionKey":"eventDef{{mcpm#/random/eventDefcnv6RLgYFue7pkdR}}","mode":"Production","iconUrl":"/images/icon-data-extension.svg","isVisibleInPicker":false,"category":"Audience","disableDEDataLogging":false,"isPlatformObject":false,"metaData":{"scheduleState":"No Schedule","criteriaDescription":"","scheduleFlowMode":"runOnce","runOnceScheduleMode":"onPublish"},"configurationArguments":{"unconfigured":false},"arguments":{"serializedObjectType":3,"eventDefinitionId":"3cf0a4ea-d16e-4a7a-abf6-1f9b8f23f156","eventDefinitionKey":"eventDefcnv6RLgYFue7pkdR","dataExtensionId":"97e1d659-a98c-f011-a5dc-5cba2c191b88","criteria":"","useHighWatermark":false,"automationId":"ff46296f-3f7d-4459-bb2f-a7747a13be07"},"sourceApplicationExtensionId":"97e942ee-6914-4d3d-9e52-37ecb71f79ed"}},"006c8b6d-4568-4dc9-943c-8d013ade9dec":{"issues":[],"originID":"006c8b6d-4568-4dc9-943c-8d013ade9dec","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"name":"MoEngage EVENT Custom Activity Journey","type":"EmailAudience","dataExtensionId":"{{mcpm#/entities/dataExtensions/96e1d659-a98c-f011-a5dc-5cba2c191b88/data/id}}","description":"","eventDefinitionKey":"eventDef{{mcpm#/random/eventDefhpGS9H7RFqHO5hUw}}","mode":"Production","iconUrl":"/images/icon-data-extension.svg","isVisibleInPicker":false,"category":"Audience","disableDEDataLogging":false,"isPlatformObject":false,"metaData":{"scheduleState":"No Schedule","criteriaDescription":"","scheduleFlowMode":"runOnce","runOnceScheduleMode":"onPublish"},"configurationArguments":{"unconfigured":false},"arguments":{"serializedObjectType":3,"eventDefinitionId":"006c8b6d-4568-4dc9-943c-8d013ade9dec","eventDefinitionKey":"eventDefhpGS9H7RFqHO5hUw","dataExtensionId":"96e1d659-a98c-f011-a5dc-5cba2c191b88","criteria":"","useHighWatermark":false,"automationId":"b9c1cb39-5b24-4c13-91a8-6122fe6759ed"},"sourceApplicationExtensionId":"97e942ee-6914-4d3d-9e52-37ecb71f79ed"}}},"fileTransferActivities":{},"importActivities":{},"journeys":{"78d45fa2-b82b-43f5-a83e-8a414a979136":{"issues":[],"originID":"78d45fa2-b82b-43f5-a83e-8a414a979136","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"name":"MoEngage EVENT Custom Activity Journey","key":"bKMt4K6qgLido4Mj","workflowApiVersion":1,"description":"","activities":[{"type":"REST","arguments":{"executionMode":"{{Context.ExecutionMode}}","definitionId":"{{Context.DefinitionId}}","activityId":"{{Activity.Id}}","contactKey":"{{Context.ContactKey}}","execute":{"inArguments":[{"moengageCredentials":{"workspaceName":"Encrypted_Security_Review_Workspace"},"authorization":{"authToken":"36LOJS5XhRtg3X1xSCb8BdIV","et_subdomain":"rest.s13.exacttarget.com","authTSSD":"mc2nbfybf05jg5cw0p468sv5yf74"},"eventConfiguration":{"type":"event","customer_id":"{{Event.eventDefhpGS9H7RFqHO5hUw.\"Email\"}}","actions":[{"action":"Test","attributes":{"name":"Test","campaign_id":"Test"}}]},"nonPerEventConfiguration":{"type":"event","customer_id":"Email","actions":[{"action":"Test","attributes":{"source":"SFMC","name":"Test","campaign_id":"Test"}}]}}],"outArguments":[],"url":"https://moengage-event-0cc816f82108.herokuapp.com/journeybuilder/execute","verb":"POST","body":"","format":"json","useJwt":false,"timeout":2000},"testExecute":"","startActivityKey":"{{Context.StartActivityKey}}","definitionInstanceId":"{{Context.DefinitionInstanceId}}","requestObjectId":"{{Context.RequestObjectId}}"},"description":"","id":"02b9daab-f8f1-4982-83b0-2503eb0124bd","key":"REST-2","metaData":{"icon":"https://moengagesalesforce-event-9e52164e2c1e.herokuapp.com/images/icon.png","category":"message","iconSmall":"","statsContactIcon":"","original_icon":"images/icon.png","isConfigured":true},"configurationArguments":{"save":{"url":"https://moengage-event-0cc816f82108.herokuapp.com/save","verb":"POST","body":"","format":"json","useJwt":false,"timeout":2000},"testSave":"","publish":{"url":"https://moengage-event-0cc816f82108.herokuapp.com/publish","verb":"POST","body":"","format":"json","useJwt":false,"timeout":2000},"testPublish":"","unpublish":"","stop":{"url":"https://moengage-event-0cc816f82108.herokuapp.com/stop","verb":"POST","body":"","format":"json","useJwt":false,"timeout":2000},"testStop":"","testUnpublish":"","partnerActivityId":"","validate":{"url":"https://moengage-event-0cc816f82108.herokuapp.com/validate","verb":"POST","body":"","format":"json","useJwt":false,"timeout":2000},"testValidate":"","outArgumentSchema":{},"applicationExtensionKey":"{{mcpm#/entities/registeredCustomActivities/c1246b39-72f9-4236-83cc-7d01610f0ea6/data/key}}"},"name":"","outcomes":[{"arguments":{},"key":"2b6e7793-a4a3-4fca-afa2-e17d86ffe3fa","metaData":{"invalid":false}}],"schema":{"arguments":{}}}],"channel":"","defaults":{"email":["{{Event.{{mcpm#/entities/eventDefinitions/006c8b6d-4568-4dc9-943c-8d013ade9dec/data/eventDefinitionKey}}.\"Email\"}}"],"properties":{"analyticsTracking":{"enabled":false,"analyticsType":"google","urlDomainsToTrack":[]}}},"definitionType":"Multistep","entryMode":"SingleEntryAcrossAllVersions","executionMode":"Production","exits":[],"goals":[],"metaData":{"highThroughputSending":{"email":false}},"triggers":[{"arguments":{"startActivityKey":"{{Context.StartActivityKey}}","dequeueReason":"{{Context.DequeueReason}}","lastExecutedActivityKey":"{{Context.LastExecutedActivityKey}}","filterResult":"true"},"configurationArguments":{"filterDefinitionId":"00000000-0000-0000-0000-000000000000","criteria":"","schemaVersionId":0},"description":"","id":"f836d143-f319-4f4b-9ede-a7d3da205fee","key":"TRIGGER","metaData":{"chainType":"None","configurationRequired":false,"entrySourceGroupConfigUrl":"jb:///data/entry/audience/entrysourcegroupconfig.json","eventDefinitionId":"{{mcpm#/entities/eventDefinitions/006c8b6d-4568-4dc9-943c-8d013ade9dec/data/id}}","eventDefinitionKey":"{{mcpm#/entities/eventDefinitions/006c8b6d-4568-4dc9-943c-8d013ade9dec/data/eventDefinitionKey}}","iconUrl":"/images/icon-data-extension.svg","title":"Data Extension"},"name":"TRIGGER","outcomes":[],"type":"EmailAudience"}],"categoryId":"{{mcpm#/entities/categories/60359/data/id}}","version":5}},"4b36601c-7d19-407e-b13a-164a6aa0a0aa":{"issues":[],"originID":"4b36601c-7d19-407e-b13a-164a6aa0a0aa","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"name":"MoEngage PUSH Custom Activity Journey","key":"Sm6ChXoX4Gs5XTf5","workflowApiVersion":1,"description":"","activities":[{"type":"REST","arguments":{"executionMode":"{{Context.ExecutionMode}}","definitionId":"{{Context.DefinitionId}}","activityId":"{{Activity.Id}}","contactKey":"{{Context.ContactKey}}","execute":{"inArguments":[{"iosPayload":{},"webPayload":{},"moengageCredentials":{"workspaceName":"Encrypted_Security_Review_Workspace"},"dataExtenstionData":{"MoEngage_ID":"{{Event.eventDefcnv6RLgYFue7pkdR.\"MoEngage_ID\"}}","First Name":"{{Event.eventDefcnv6RLgYFue7pkdR.\"First Name\"}}","Last Name":"{{Event.eventDefcnv6RLgYFue7pkdR.\"Last Name\"}}","Mobile Number":"{{Event.eventDefcnv6RLgYFue7pkdR.\"Mobile Number\"}}","Email":"{{Event.eventDefcnv6RLgYFue7pkdR.\"Email\"}}"},"userFilter":{"userAttribute":"USER_ATTRIBUTE_UNIQUE_ID","userAttributeValue":"{{Event.eventDefcnv6RLgYFue7pkdR.\"MoEngage_ID\"}}"},"pushConfiguration":{"campaignName":"Test","campaignTags":[""],"targetPlatform":["ANDROID"],"conversionGoals":[],"advancedSettings":{"ignoreFC":"false","sendAtHighPriority":"false","campaignThrottleRpm":100000}},"androidPayload":{"nonPerMessage":"Test","message":"Test","title":"Test","Summary":"","richContent":[],"defaultAction":{"type":"navigation","value":"www.google.com","kvPairs":{}}},"authorization":{"authToken":"3GkCt9XjVuOMYi8C7PWehbn3","et_subdomain":"rest.s13.exacttarget.com","authTSSD":"mc2nbfybf05jg5cw0p468sv5yf74"}}],"outArguments":[],"url":"https://moengagesalesforce-push-7b3d058c7a8f.herokuapp.com/journeybuilder/execute","verb":"POST","body":"","format":"json","useJwt":false,"timeout":2000},"testExecute":"","startActivityKey":"{{Context.StartActivityKey}}","definitionInstanceId":"{{Context.DefinitionInstanceId}}","requestObjectId":"{{Context.RequestObjectId}}"},"description":"","id":"af09fb24-095f-4a03-9f17-605d87f7ebe2","key":"REST-1","metaData":{"icon":"https://moengagesalesforce-push-7b3d058c7a8f.herokuapp.com/images/iconSmall.png","category":"message","iconSmall":"","statsContactIcon":"","original_icon":"images/iconSmall.png","isConfigured":true},"configurationArguments":{"applicationExtensionKey":"{{mcpm#/entities/registeredCustomActivities/031ffd20-ba25-4f6e-bb8f-763379441019/data/key}}","applicationExtensionId":"031ffd20-ba25-4f6e-bb8f-763379441019","save":{"url":"https://moengagesalesforce-push-7b3d058c7a8f.herokuapp.com/save","verb":"POST","body":"","format":"json","useJwt":false,"timeout":2000},"testSave":"","publish":{"url":"https://moengagesalesforce-push-7b3d058c7a8f.herokuapp.com/publish","verb":"POST","body":"","format":"json","useJwt":false,"timeout":2000},"testPublish":"","unpublish":"","stop":{"url":"https://moengagesalesforce-push-7b3d058c7a8f.herokuapp.com/stop","verb":"POST","body":"","format":"json","useJwt":false,"timeout":2000},"testStop":"","testUnpublish":"","partnerActivityId":"","validate":{"url":"https://moengagesalesforce-push-7b3d058c7a8f.herokuapp.com/validate","verb":"POST","body":"","format":"json","useJwt":false,"timeout":2000},"testValidate":"","outArgumentSchema":{}},"name":"","outcomes":[{"arguments":{},"key":"5054001d-b3ba-4232-948d-bcd772474638","metaData":{"invalid":false}}],"schema":{"arguments":{}}}],"channel":"","defaults":{"email":["{{Event.{{mcpm#/entities/eventDefinitions/3cf0a4ea-d16e-4a7a-abf6-1f9b8f23f156/data/eventDefinitionKey}}.\"Email\"}}"],"properties":{"analyticsTracking":{"enabled":false,"analyticsType":"google","urlDomainsToTrack":[]}}},"definitionType":"Multistep","entryMode":"SingleEntryAcrossAllVersions","executionMode":"Production","exits":[],"goals":[],"metaData":{"highThroughputSending":{"email":false}},"triggers":[{"arguments":{"startActivityKey":"{{Context.StartActivityKey}}","dequeueReason":"{{Context.DequeueReason}}","lastExecutedActivityKey":"{{Context.LastExecutedActivityKey}}","filterResult":"true"},"configurationArguments":{"schemaVersionId":0,"criteria":"","filterDefinitionId":"00000000-0000-0000-0000-000000000000"},"description":"","id":"7e4d41e9-3463-46ff-8e7b-242d5808ee15","key":"TRIGGER","metaData":{"chainType":"None","configurationRequired":false,"entrySourceGroupConfigUrl":"jb:///data/entry/audience/entrysourcegroupconfig.json","eventDefinitionId":"{{mcpm#/entities/eventDefinitions/3cf0a4ea-d16e-4a7a-abf6-1f9b8f23f156/data/id}}","eventDefinitionKey":"{{mcpm#/entities/eventDefinitions/3cf0a4ea-d16e-4a7a-abf6-1f9b8f23f156/data/eventDefinitionKey}}","iconUrl":"/images/icon-data-extension.svg","title":"Data Extension"},"name":"TRIGGER","outcomes":[],"type":"EmailAudience"}],"categoryId":"{{mcpm#/entities/categories/60359/data/id}}","version":2}}},"journeyTemplates":{},"landingPages":{"708434-4844":{"issues":[{"type":"UNSUPPORTED_AMPSCRIPT","level":"INFO","sourceJobType":"PACKAGE","issue":"UNRESOLVED_VARIABLE"},{"type":"ENTITY_NOT_FOUND","level":"WARNING","sourceJobType":"PACKAGE","entity":{"entityType":"dataExtensions","retrievalProperty":"customerKey","value":"MoEngage Credentials Test","parentPath":"$['asset']['views']['html']['slots']['col1']['blocks']['j8jimzgymf7']['content']:I5683"},"entityParent":{"entityType":"landingPages","retrievalProperty":"id","value":"708434-4844","parentPath":"root"},"depPath":[{"entityType":"landingPages","retrievalProperty":"id","value":"708434-4844","parentPath":"root"}]},{"type":"ENTITY_NOT_FOUND","level":"WARNING","sourceJobType":"PACKAGE","entity":{"entityType":"dataExtensions","retrievalProperty":"customerKey","value":"MoEngage Credentials Test","parentPath":"$['asset']['views']['html']['slots']['col1']['blocks']['j8jimzgymf7']['content']:I6442"},"entityParent":{"entityType":"landingPages","retrievalProperty":"id","value":"708434-4844","parentPath":"root"},"depPath":[{"entityType":"landingPages","retrievalProperty":"id","value":"708434-4844","parentPath":"root"}]},{"type":"ENTITY_NOT_FOUND","level":"WARNING","sourceJobType":"PACKAGE","entity":{"entityType":"dataExtensions","retrievalProperty":"customerKey","value":"MoEngage Credentials Test","parentPath":"$['asset']['views']['html']['slots']['col1']['blocks']['j8jimzgymf7']['content']:I7508"},"entityParent":{"entityType":"landingPages","retrievalProperty":"id","value":"708434-4844","parentPath":"root"},"depPath":[{"entityType":"landingPages","retrievalProperty":"id","value":"708434-4844","parentPath":"root"}]},{"type":"ENTITY_NOT_FOUND","level":"WARNING","sourceJobType":"PACKAGE","entity":{"entityType":"dataExtensions","retrievalProperty":"customerKey","value":"9C175D79-CA62-44A4-899F-586A526A2424","parentPath":"$['asset']['views']['html']['slots']['col1']['blocks']['j8jimzgymf7']['content']:I9321"},"entityParent":{"entityType":"landingPages","retrievalProperty":"id","value":"708434-4844","parentPath":"root"},"depPath":[{"entityType":"landingPages","retrievalProperty":"id","value":"708434-4844","parentPath":"root"}]},{"type":"ENTITY_NOT_FOUND","level":"WARNING","sourceJobType":"PACKAGE","entity":{"entityType":"dataExtensions","retrievalProperty":"customerKey","value":"9C175D79-CA62-44A4-899F-586A526A2424","parentPath":"$['asset']['views']['html']['slots']['col1']['blocks']['j8jimzgymf7']['content']:I9700"},"entityParent":{"entityType":"landingPages","retrievalProperty":"id","value":"708434-4844","parentPath":"root"},"depPath":[{"entityType":"landingPages","retrievalProperty":"id","value":"708434-4844","parentPath":"root"}]},{"type":"ENTITY_NOT_FOUND","level":"WARNING","sourceJobType":"PACKAGE","entity":{"entityType":"dataExtensions","retrievalProperty":"customerKey","value":"9C175D79-CA62-44A4-899F-586A526A2424","parentPath":"$['asset']['views']['html']['slots']['col1']['blocks']['j8jimzgymf7']['content']:I10475"},"entityParent":{"entityType":"landingPages","retrievalProperty":"id","value":"708434-4844","parentPath":"root"},"depPath":[{"entityType":"landingPages","retrievalProperty":"id","value":"708434-4844","parentPath":"root"}]},{"type":"ENTITY_NOT_FOUND","level":"WARNING","sourceJobType":"PACKAGE","entity":{"entityType":"dataExtensions","retrievalProperty":"customerKey","value":"9C175D79-CA62-44A4-899F-586A526A2424","parentPath":"$['asset']['views']['html']['slots']['col1']['blocks']['j8jimzgymf7']['content']:I11337"},"entityParent":{"entityType":"landingPages","retrievalProperty":"id","value":"708434-4844","parentPath":"root"},"depPath":[{"entityType":"landingPages","retrievalProperty":"id","value":"708434-4844","parentPath":"root"}]}],"originID":"708434-4844","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"asset":{"assetType":{"id":205,"name":"webpage","displayName":"Web Page"},"customerKey":"e2ca6c29-a1dc-412a-a081-15efe977e4d1","name":"MoEngage Workspace and Data Tracking Credentials Authentication","category":{"id":"{{mcpm#/entities/categories/36352/data/id}}"},"contentType":"text/html","meta":{"globalStyles":{"isLocked":false,"body":{"max-width":"1280px","color":"#000000","font-family":"Arial","font-size":"12px","margin":"0px auto"},"template":{"background-color":"#FFFFFF","border":"none","box-sizing":"border-box","padding":"0px","width":"100%"},"buttons":{},"h1":{},"h2":{},"h3":{},"links":{}}},"views":{"html":{"thumbnail":{},"content":"<!DOCTYPE html>\n<html lang=\"en\">\n<script runat=\"server\">\n    Platform.Load(\"Core\", \"1.1.1\");\n\n    var dataCenter, workspaceID, dataAPIKey, pushAPIKey, updateCount, submitted;\n    var workspaceName, existingRecord, message, apiResponse;\n    var username, password, updateCount2, submitted2, existingRecord2, message2, operation, usernameTextbox, usernameDropdown, isUpdateChecked;\n    var showPage2 = false;\n\n    // Encryption key - In production, this should be stored securely (e.g., in a secure Data Extension or configuration)\n    var encryptionKey = \"YourSecureEncryptionKey123!@#$%^&*\";\n\n    // Function to encrypt data using AES encryption\n    function encryptData(plainText, key) {\n        try {\n            // Simple XOR-based encryption for SSJS (since AES libraries aren't available in SSJS)\n            // In a real implementation, you'd want to use stronger encryption\n            var encrypted = \"\";\n            var keyLength = key.length;\n            \n            for (var i = 0; i < plainText.length; i++) {\n                var charCode = plainText.charCodeAt(i) ^ key.charCodeAt(i % keyLength);\n                encrypted += String.fromCharCode(charCode);\n            }\n            \n            // Convert to Base64 for safe storage\n            return Base64Encode(encrypted);\n        } catch (e) {\n            Write(\"Encryption Error: \" + Stringify(e));\n            return plainText; // Fallback to plain text if encryption fails\n        }\n    }\n\n    // Function to decrypt data\n    function decryptData(encryptedText, key) {\n        try {\n            // Decode from Base64 first\n            var decoded = Base64Decode(encryptedText);\n            var decrypted = \"\";\n            var keyLength = key.length;\n            \n            for (var i = 0; i < decoded.length; i++) {\n                var charCode = decoded.charCodeAt(i) ^ key.charCodeAt(i % keyLength);\n                decrypted += String.fromCharCode(charCode);\n            }\n            \n            return decrypted;\n        } catch (e) {\n            Write(\"Decryption Error: \" + Stringify(e));\n            return encryptedText; // Return as-is if decryption fails\n        }\n    }\n\n    // Function to call MoEngage Test Connection API\n    function testMoEngageConnection(workspaceID, dataAPIKey, dataCenter) {\n        var payload = {\n            \"app_id\": workspaceID,\n            \"app_secret\": dataAPIKey,\n            \"source\": \"SFMC\",\n            \"region\": dataCenter\n        };\n\n        var decoded = workspaceID + \":\" + dataAPIKey;\n        var encoded = Base64Encode(decoded);\n\n        var strPayload = Stringify(payload);\n        var isValidCredentials = false; // Flag for valid credentials, default to false\n\n        try {\n            //Test Connection API Call\n            var url = \"https://api-\" + dataCenter + \".moengage.com/v1/integrations/authentication\";\n            var contentType = \"application/json\";\n            var payload = strPayload;\n            var headerNames = [\"MOE-APPKEY\", \"Authorization\"];\n            var headerValues = [dataAPIKey, \"Basic \" + encoded];\n            var result = HTTP.Post(url, contentType, payload, headerNames, headerValues);\n\n            var statusCode = result.StatusCode;\n\n            if (statusCode == 200) {\n                var responseJSON = Platform.Function.ParseJSON(result.Response[0]);\n                var status = responseJSON.status;\n\n                if (status == \"success\") {\n                    isValidCredentials = true; // Set as valid if status is 'success'.\n                }\n\n            } else {\n                isValidCredentials = false; // Set as invalid if status is not success.\n            }\n        }\n        catch (e) {\n            message = 'Error in calling the MoEngage API for validation';\n            isValidCredentials = false;\n        }\n        return isValidCredentials; // Return true if credentials are valid, otherwise false\n    }\n\n    // Function to encrypt a string for page 2\n    function encrypt(str) {\n        Variable.SetValue(\"@ToEncrypt\", str);\n\n        var scr = \"\";\n        scr += \"\\%\\%[\";\n        scr += \"SET @Encrypted = EncryptSymmetric(@ToEncrypt, 'AES', 'SymmetricKey-DataTracking', @null, 'SaltKey-DataTracking', @null, 'IVKey-DataTracking', @null)\";\n        scr += \"Output(Concat(@Encrypted))\";\n        scr += \"]\\%\\%\";\n\n        return Platform.Function.TreatAsContent(scr);\n    }\n\n    // Capture the values submitted via the form for Page 1\n    submitted = Request.GetFormField(\"submitted\");\n    workspaceName = Request.GetFormField(\"workspaceName\");\n    dataCenter = Request.GetFormField(\"datacenter\");\n    workspaceID = Request.GetFormField(\"workspaceID\");\n    dataAPIKey = Request.GetFormField(\"Data_API_KEY\");\n    pushAPIKey = Request.GetFormField(\"push_API_KEY\");\n\n    // Capture submitted form values for Page 2\n    submitted2 = Request.GetFormField(\"submitted2\");\n    operation = Request.GetFormField(\"operation\");\n    isUpdateChecked = (operation === \"update\");\n    usernameTextbox = Request.GetFormField(\"usernameTextbox\");\n    usernameDropdown = Request.GetFormField(\"usernameDropdown\");\n    username = usernameTextbox || usernameDropdown;\n    password = Request.GetFormField(\"password\");\n\n    // Check if we should show page 2 based on session or successful completion of page 1\n    // Removed automatic page switching - let JavaScript handle transitions\n\n    // Process Page 1 submission\n    if (submitted == 'true') {\n        if (dataAPIKey != \"\" && workspaceID != \"\" && dataCenter != \"\") {\n\n            // Check for existing record - workspace name is not encrypted for lookup purposes\n            existingRecord = DataExtension.Init(\"{{mcpm#/entities/dataExtensions/31e6a7ca-267f-ef11-a5d1-5cba2c191058/data/customerKey}}\").Rows.Lookup([\"WorkspaceName\"], [workspaceName]);\n\n            // Test MoEngage connection with plain text credentials\n            var isValid = testMoEngageConnection(workspaceID, dataAPIKey, dataCenter);\n            var activeStatus = isValid ? \"True\" : \"False\";\n\n            // Encrypt sensitive data before storing\n            var encryptedWorkspaceID = encryptData(workspaceID, encryptionKey);\n            var encryptedDataAPIKey = encryptData(dataAPIKey, encryptionKey);\n            var encryptedPushAPIKey = pushAPIKey ? encryptData(pushAPIKey, encryptionKey) : \"\";\n\n            if (existingRecord != null) {\n                // Update the existing record with encrypted data\n                updateCount = DataExtension.Init(\"{{mcpm#/entities/dataExtensions/31e6a7ca-267f-ef11-a5d1-5cba2c191058/data/customerKey}}\").Rows.Update({\n                    \"DataCenter\": dataCenter,\n                    \"WorkspaceID\": encryptedWorkspaceID,\n                    \"DataKey\": encryptedDataAPIKey,\n                    \"PushKey\": encryptedPushAPIKey,\n                    \"Active\": activeStatus\n                }, [\"WorkspaceName\"], [workspaceName]);\n\n                if (updateCount > 0) {\n                    message = isValid ? 'Credentials validated and encrypted! Existing record successfully updated and marked as ACTIVE' : 'Credentials are invalid! Existing record updated and marked as INACTIVE';\n                    // Don't set showPage2 here - let JavaScript handle the transition after showing the message\n                } else {\n                    message = 'Error updating the record';\n                }\n            } else {\n                // If no existing record, and credentials are valid, insert new encrypted record\n                if (activeStatus == 'True') {\n                    insertCount = DataExtension.Init(\"{{mcpm#/entities/dataExtensions/31e6a7ca-267f-ef11-a5d1-5cba2c191058/data/customerKey}}\").Rows.Add({\n                        \"WorkspaceName\": workspaceName,\n                        \"DataCenter\": dataCenter,\n                        \"WorkspaceID\": encryptedWorkspaceID,\n                        \"DataKey\": encryptedDataAPIKey,\n                        \"PushKey\": encryptedPushAPIKey,\n                        \"Active\": \"True\"\n                    });\n\n                    if (insertCount > 0) {\n                        message = 'Credentials validated and encrypted! Record inserted successfully and marked as ACTIVE';\n                        // Don't set showPage2 here - let JavaScript handle the transition after showing the message\n                    } else {\n                        message = 'Error inserting data';\n                    }\n                } else {\n                    message = 'Invalid credentials! Data was not inserted';\n                }\n            }\n        } else {\n            message = 'Please enter all required fields';\n        }\n    }\n\n    // Process Page 2 submission\n    if (submitted2 == 'true') {\n        try {\n            //Write(\"SSJS Submit Button Clicked - \");\n            //Write(\"operation: \" + operation + \" - \");\n            //Write(\"isUpdateChecked: \" + isUpdateChecked + \" - \");\n            //Write(\"username: \" + username + \" - \");\n            //Write(\"usernameTextbox: \" + usernameTextbox + \" - \");\n            //Write(\"usernameDropdown: \" + usernameDropdown + \" - \");\n            //Write(\"password: \" + password + \" - \");\n\n            if ((usernameTextbox != \"\" || usernameDropdown != \"\") && password != \"\") {\n                // Encrypt the password\n                var encryptedPassword = encrypt(password);\n\n                if (isUpdateChecked == true) {\n                    // Existing Record check - Dropdown username\n                    existingRecord2 = DataExtension.Init(\"{{mcpm#/entities/dataExtensions/92e1d659-a98c-f011-a5dc-5cba2c191b88/data/customerKey}}\").Rows.Lookup([\"UserName\"], [usernameDropdown]);\n                    Write(\"Existing Record: \" + Stringify(existingRecord2) + \" - \");\n                    if (existingRecord2 != null) {\n                        Write(\"In Update Block - \");\n                        // Update the record\n                        updateCount2 = DataExtension.Init(\"{{mcpm#/entities/dataExtensions/92e1d659-a98c-f011-a5dc-5cba2c191b88/data/customerKey}}\").Rows.Update({\n                            \"UserName\": usernameDropdown,\n                            \"Password\": encryptedPassword\n                        }, [\"UserName\"], [usernameDropdown]);\n\n                        message2 = updateCount2 > 0 ? \"Record updated successfully\" : \"Error updating the record\";\n                    } else {\n                        message2 = \"Record not found for update\";\n                    }\n                } else if (isUpdateChecked == false) {\n                    Write(\"In Insert Block - \");\n\n                    // Check if the to-be-inserted record already exists\n                    // Existing Record check - Dropdown username\n                    var existingRecordTextbox = DataExtension.Init(\"{{mcpm#/entities/dataExtensions/92e1d659-a98c-f011-a5dc-5cba2c191b88/data/customerKey}}\").Rows.Lookup([\"UserName\"], [usernameTextbox]);\n\n                    var jsonArray = existingRecordTextbox;\n                    var existingUsername = \"\";\n\n                    if (jsonArray.length > 0) {\n                        var firstObject = jsonArray[0];\n                        existingUsername = firstObject.UserName;\n                    }\n\n                    // Output the username (you can use this variable for other operations)\n                    Write(\"Extracted Username: \" + existingUsername);\n\n                    if (existingUsername == usernameTextbox) {\n                        message2 = \"Record already exists. Please select the update checkbox to update a record\";\n                    } else {\n                        // Insert new record\n                        var insertCount2 = DataExtension.Init(\"{{mcpm#/entities/dataExtensions/92e1d659-a98c-f011-a5dc-5cba2c191b88/data/customerKey}}\").Rows.Add({\n                            \"UserName\": usernameTextbox,\n                            \"Password\": encryptedPassword\n                        });\n\n                        message2 = insertCount2 > 0 ? \"Record inserted successfully\" : \"Error inserting the record\";\n                    }\n                }\n            } else {\n                message2 = \"Please fill in all required fields\";\n            }\n        } catch (e) {\n            message2 = \"An error occurred: \" + e.message;\n        }\n    }\n\n    // Output the message variables back to the HTML forms\n    Variable.SetValue(\"@message\", message);\n    Variable.SetValue(\"@message2\", message2);\n    Variable.SetValue(\"@showPage2\", showPage2);\n</script>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>MoEngage Authentication System</title>\n    <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.rtl.min.css\" integrity=\"sha384-dpuaG1suU0eT09tx5plTaGMLBsfDLzUCCUXOY2j/LSvXYuG6Bqs43ALlhIqAJVRb\" crossorigin=\"anonymous\">\n    <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js\"></script>\n    <!-- Include CryptoJS library for encryption -->\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.js\"></script>\n    <script src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js\"></script>\n    <style>\n        .form-container {\n            max-width: 600px;\n            margin: auto;\n            background: #f9f9f9;\n            padding: 20px;\n            border-radius: 10px;\n            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n        }\n\n        .form-container label {\n            margin-right: 10px;\n        }\n\n        .form-container .form-control,\n        .form-container .form-select {\n            max-width: calc(100% - 150px);\n        }\n\n        .form-container .form-group {\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n        }\n\n        .form-container .form-check {\n            display: flex;\n            align-items: center;\n        }\n\n        .form-container .form-check-label {\n            margin-left: 5px;\n        }\n\n        .form-container .btn-primary {\n            width: 100%;\n        }\n\n        #page1 {\n            display: block;\n        }\n\n        #page2 {\n            display: none;\n        }\n    </style>\n</head>\n\n<body>\n    <!-- Page 1: MoEngage Workspace Authentication -->\n    <div id=\"page1\">\n        <div class=\"step mb-3 justify-content-center align-items-center\">\n            <div class=\"row\">\n                <div class=\"col-12\">\n                    <h2 class=\"p-3 mb-3 text-white text-center\" style=\"background-color: #00237c;\">MoEngage Workspace\n                        Authentication (Encrypted Storage)</h2>\n                    <div class=\"alert alert-info mx-auto\" style=\"width: 90%;\">\n                        <strong>Security Notice:</strong> All sensitive data (Workspace ID, API Keys) will be encrypted before storage.\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"mx-auto\" style=\"width: 90%;\">\n                <div class=\"justify-content-center align-items-center\">\n                    <form method=\"POST\" action=\"\">\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"datacenter\" class=\"form-label fw-semibold fs-5\">Data Center: </label>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <select class=\"form-select\" aria-label=\"Default select example\" required=\"\" id=\"datacenter\" name=\"datacenter\">\n                                        <option value=\"01\" selected=\"\">01</option>\n                                        <option value=\"02\">02</option>\n                                        <option value=\"03\">03</option>\n                                        <option value=\"04\">04</option>\n                                        <option value=\"05\">05</option>\n                                        <option value=\"06\">06</option>\n                                    </select>\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"workspaceName\" class=\"form-label fw-semibold fs-5\">Workspace Name: </label>\n                                    <small class=\"text-muted d-block\">Not encrypted (used for lookups)</small>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <input type=\"text\" id=\"workspaceName\" name=\"workspaceName\" class=\"form-control\" required=\"\">\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"workspaceID\" class=\"form-label fw-semibold fs-5\">Workspace ID: </label>\n                                    <small class=\"text-muted d-block\">🔒 Will be encrypted</small>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <input type=\"text\" id=\"workspaceID\" name=\"workspaceID\" class=\"form-control\" required=\"\">\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"Data_API_KEY\" class=\"form-label fw-semibold fs-5\">Data API Key: </label>\n                                    <small class=\"text-muted d-block\">🔒 Will be encrypted</small>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <input type=\"password\" id=\"Data_API_KEY\" name=\"Data_API_KEY\" class=\"form-control\" required=\"\">\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"push_API_KEY\" class=\"form-label fw-semibold fs-5\">Campaign/Push API\n                                        Key: </label>\n                                    <small class=\"text-muted d-block\">🔒 Will be encrypted</small>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <input type=\"password\" id=\"push_API_KEY\" name=\"push_API_KEY\" class=\"form-control\">\n                                </div>\n                            </div>\n                        </div>\n\n                        <input type=\"hidden\" name=\"message\" value=\"%%=v(@message)=%%\">\n                        <input type=\"hidden\" name=\"submitted\" value=\"true\">\n\n                        <div class=\"row\">\n                            <div class=\"col-12 text-center\">\n                                <input class=\"btn btn-primary p-2 w-50 mt-5\" style=\"background-color:#00237c\" type=\"submit\" value=\"Submit & Encrypt\">\n                            </div>\n                        </div>\n                    </form>\n\n                    <p id=\"message\" style=\"color:green;font-size:20px; font-weight:900;text-align:center\">\n                        %%=v(@message)=%%\n                    </p>\n\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <!-- Page 2: MoEngage Data Tracking Authentication -->\n    <div id=\"page2\" style=\"display: none;\">\n        <div class=\"container mt-5\">\n            <div class=\"form-container\">\n                <h3 class=\"text-center text-white p-3 mb-4\" style=\"background-color: #00237c;\">MoEngage Data Tracking\n                    Authentication</h3>\n              <div class=\"alert alert-info mx-auto\" style=\"width: 90%;\">\n                        <strong>Security Notice:</strong> Please remember the password entered and share the same with MoEngage for raising a ticket for Streams. All sensitive data will be encrypted before storage.\n                    </div>\n\n                <form id=\"authForm\" method=\"POST\" action=\"\">\n                    <div class=\"mb-4 form-check form-switch mx-4\">\n                        <input class=\"form-check-input mx-2\" type=\"checkbox\" id=\"operation\" name=\"operation\" value=\"update\">\n                        <label class=\"form-check-label mx-2\" for=\"operation\">Update Existing Record</label>\n                    </div>\n\n                    <div class=\"mb-4 form-group mx-4 row\">\n                        <label for=\"username\" class=\"form-label fs-6 col-sm-2\">Username</label>\n                        <select id=\"usernameDropdown\" name=\"usernameDropdown\" class=\"form-select col-sm-10\"\n                            style=\"display: none;\">\n                            <option class=\"dropdown-header\" selected disabled>Select the Existing Username</option>\n                            %%[\n                            SET @rows = LookupRows(\"{{mcpm#/entities/dataExtensions/92e1d659-a98c-f011-a5dc-5cba2c191b88/data/name}}\", \"Active\", \"True\")\n                            FOR @i = 1 TO RowCount(@rows) DO\n                            SET @row = Row(@rows, @i)\n                            SET @username = Field(@row, \"UserName\")\n                            ]%%\n                            <option value=\"%%=v(@username)=%%\">%%=v(@username)=%%</option>\n                            %%[NEXT @i]%%\n                        </select>\n                        <input type=\"text\" id=\"usernameTextbox\" name=\"usernameTextbox\" class=\"form-control col-sm-10\"\n                            placeholder=\"Enter username\" minlength=\"8\" required>\n                    </div>\n\n                    <div class=\"mb-4 form-group mx-4 row\">\n                        <label for=\"password\" class=\"form-label fs-6 col-sm-2\">Password</label>\n                        <input type=\"password\" id=\"password\" name=\"password\" class=\"form-control col-sm-10\"\n                            placeholder=\"Enter password\" minlength=\"8\" required>\n                    </div>\n\n                    <input type=\"hidden\" name=\"message2\" value=\"%%=v(@message2)=%%\">\n                    <input type=\"hidden\" name=\"submitted2\" value=\"true\">\n                    <input type=\"hidden\" name=\"showPage2\" value=\"true\">\n\n                    <div class=\"text-start mx-4\">\n                        <button type=\"submit\" class=\"btn btn-primary w-auto\"\n                            style=\"background-color:#00237c\">Submit</button>\n                    </div>\n                </form>\n\n                <p id=\"message2\" class=\"mt-4 text-center\" style=\"color:green;font-size:20px; font-weight:900;\">\n                    %%=v(@message2)=%%\n                </p>\n\n                <!-- Back button to return to Page 1 -->\n                <div class=\"text-center mt-3\">\n                    <button id=\"backToPage1\" class=\"btn btn-secondary\" style=\"background-color:#6c757d\">Back to Workspace Authentication</button>\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <!-- JavaScript for page transitions and functionality -->\n    <script>\n        $(document).ready(function () {\n            // Page 1 JavaScript functionality\n            // Add visual feedback for encrypted fields\n            $('input[type=\"password\"], #workspaceID').on('input', function() {\n                if ($(this).val().length > 0) {\n                    $(this).addClass('border-warning');\n                } else {\n                    $(this).removeClass('border-warning');\n                }\n            });\n\n            // Page 2 JavaScript functionality\n            const operationCheckbox = $('#operation');\n            const usernameTextbox = $('#usernameTextbox');\n            const usernameDropdown = $('#usernameDropdown');\n\n            // Toggle username input based on checkbox state\n            operationCheckbox.on('change', function () {\n                if (this.checked) {\n                    usernameTextbox.hide();\n                    $(\"#usernameTextbox\").removeAttr('required', '');\n                    usernameDropdown.show();\n                } else {\n                    usernameTextbox.show();\n                    $(\"#usernameTextbox\").attr(\"required\",\"required\");\n                    usernameDropdown.hide();\n                }\n            });\n\n            // Back to Page 1 functionality\n            $('#backToPage1').on('click', function() {\n                $('#page2').hide();\n                $('#page1').show();\n            });\n\n            // Handle Page 1 success message and transition to Page 2\n            if ($('#message').text().trim() !== '') {\n                var messageText = $('#message').text().trim();\n                // Check if Page 1 was successful and should transition to Page 2\n                if (messageText.includes('successfully') && (messageText.includes('ACTIVE') || messageText.includes('inserted'))) {\n                    // Show the success message for 5 seconds, then transition to Page 2\n                    setTimeout(function () {\n                        $('#message').fadeOut(500, function() {\n                            // After message fades out, transition to Page 2\n                            $('#page1').fadeOut(500, function() {\n                                $('#page2').fadeIn(500);\n                            });\n                        });\n                    }, 5000);\n                } else {\n                    // If not successful, just hide the message after 5 seconds (stay on Page 1)\n                    setTimeout(function () {\n                        $('#message').fadeOut();\n                    }, 5000);\n                }\n            } else {\n                // Check if we should show page 2 initially (on page load after server-side processing)\n                %%[ IF @showPage2 == \"True\" THEN ]%%\n                    // If server-side determined we should show page 2, do the transition immediately\n                    $('#page1').hide();\n                    $('#page2').show();\n                %%[ ENDIF ]%%\n            }\n\n            // Handle Page 2 success message\n            if ($('#message2').text().trim() !== '') {\n                setTimeout(function () {\n                    $('#message2').fadeOut();\n                }, 5000);\n            }\n        });\n    </script>\n</body>\n</html>","meta":{},"slots":{"col1":{"content":"<div data-type=\"block\" data-key=\"j8jimzgymf7\"></div>","design":"<p style=\"font-family:arial;color:#ccc;font-size:11px;text-align:center;vertical-align:middle;font-weight:bold;padding:10px;margin:0;border:#ccc dashed 1px;\">Drop blocks or content here</p>","blocks":{"j8jimzgymf7":{"assetType":{"id":220,"name":"codesnippetblock"},"content":"<!DOCTYPE html>\n<html lang=\"en\">\n<script runat=\"server\">\n    Platform.Load(\"Core\", \"1.1.1\");\n\n    var dataCenter, workspaceID, dataAPIKey, pushAPIKey, updateCount, submitted;\n    var workspaceName, existingRecord, message, apiResponse;\n    var username, password, updateCount2, submitted2, existingRecord2, message2, operation, usernameTextbox, usernameDropdown, isUpdateChecked;\n    var showPage2 = false;\n\n    // Encryption key - In production, this should be stored securely (e.g., in a secure Data Extension or configuration)\n    var encryptionKey = \"YourSecureEncryptionKey123!@#$%^&*\";\n\n    // Function to encrypt data using AES encryption\n    function encryptData(plainText, key) {\n        try {\n            // Simple XOR-based encryption for SSJS (since AES libraries aren't available in SSJS)\n            // In a real implementation, you'd want to use stronger encryption\n            var encrypted = \"\";\n            var keyLength = key.length;\n            \n            for (var i = 0; i < plainText.length; i++) {\n                var charCode = plainText.charCodeAt(i) ^ key.charCodeAt(i % keyLength);\n                encrypted += String.fromCharCode(charCode);\n            }\n            \n            // Convert to Base64 for safe storage\n            return Base64Encode(encrypted);\n        } catch (e) {\n            Write(\"Encryption Error: \" + Stringify(e));\n            return plainText; // Fallback to plain text if encryption fails\n        }\n    }\n\n    // Function to decrypt data\n    function decryptData(encryptedText, key) {\n        try {\n            // Decode from Base64 first\n            var decoded = Base64Decode(encryptedText);\n            var decrypted = \"\";\n            var keyLength = key.length;\n            \n            for (var i = 0; i < decoded.length; i++) {\n                var charCode = decoded.charCodeAt(i) ^ key.charCodeAt(i % keyLength);\n                decrypted += String.fromCharCode(charCode);\n            }\n            \n            return decrypted;\n        } catch (e) {\n            Write(\"Decryption Error: \" + Stringify(e));\n            return encryptedText; // Return as-is if decryption fails\n        }\n    }\n\n    // Function to call MoEngage Test Connection API\n    function testMoEngageConnection(workspaceID, dataAPIKey, dataCenter) {\n        var payload = {\n            \"app_id\": workspaceID,\n            \"app_secret\": dataAPIKey,\n            \"source\": \"SFMC\",\n            \"region\": dataCenter\n        };\n\n        var decoded = workspaceID + \":\" + dataAPIKey;\n        var encoded = Base64Encode(decoded);\n\n        var strPayload = Stringify(payload);\n        var isValidCredentials = false; // Flag for valid credentials, default to false\n\n        try {\n            //Test Connection API Call\n            var url = \"https://api-\" + dataCenter + \".moengage.com/v1/integrations/authentication\";\n            var contentType = \"application/json\";\n            var payload = strPayload;\n            var headerNames = [\"MOE-APPKEY\", \"Authorization\"];\n            var headerValues = [dataAPIKey, \"Basic \" + encoded];\n            var result = HTTP.Post(url, contentType, payload, headerNames, headerValues);\n\n            var statusCode = result.StatusCode;\n\n            if (statusCode == 200) {\n                var responseJSON = Platform.Function.ParseJSON(result.Response[0]);\n                var status = responseJSON.status;\n\n                if (status == \"success\") {\n                    isValidCredentials = true; // Set as valid if status is 'success'.\n                }\n\n            } else {\n                isValidCredentials = false; // Set as invalid if status is not success.\n            }\n        }\n        catch (e) {\n            message = 'Error in calling the MoEngage API for validation';\n            isValidCredentials = false;\n        }\n        return isValidCredentials; // Return true if credentials are valid, otherwise false\n    }\n\n    // Function to encrypt a string for page 2\n    function encrypt(str) {\n        Variable.SetValue(\"@ToEncrypt\", str);\n\n        var scr = \"\";\n        scr += \"\\%\\%[\";\n        scr += \"SET @Encrypted = EncryptSymmetric(@ToEncrypt, 'AES', 'SymmetricKey-DataTracking', @null, 'SaltKey-DataTracking', @null, 'IVKey-DataTracking', @null)\";\n        scr += \"Output(Concat(@Encrypted))\";\n        scr += \"]\\%\\%\";\n\n        return Platform.Function.TreatAsContent(scr);\n    }\n\n    // Capture the values submitted via the form for Page 1\n    submitted = Request.GetFormField(\"submitted\");\n    workspaceName = Request.GetFormField(\"workspaceName\");\n    dataCenter = Request.GetFormField(\"datacenter\");\n    workspaceID = Request.GetFormField(\"workspaceID\");\n    dataAPIKey = Request.GetFormField(\"Data_API_KEY\");\n    pushAPIKey = Request.GetFormField(\"push_API_KEY\");\n\n    // Capture submitted form values for Page 2\n    submitted2 = Request.GetFormField(\"submitted2\");\n    operation = Request.GetFormField(\"operation\");\n    isUpdateChecked = (operation === \"update\");\n    usernameTextbox = Request.GetFormField(\"usernameTextbox\");\n    usernameDropdown = Request.GetFormField(\"usernameDropdown\");\n    username = usernameTextbox || usernameDropdown;\n    password = Request.GetFormField(\"password\");\n\n    // Check if we should show page 2 based on session or successful completion of page 1\n    var showPage2Flag = Request.GetFormField(\"showPage2\");\n    if (showPage2Flag == \"true\") {\n        showPage2 = true;\n    }\n\n    // Process Page 1 submission\n    if (submitted == 'true') {\n        if (dataAPIKey != \"\" && workspaceID != \"\" && dataCenter != \"\") {\n\n            // Check for existing record - workspace name is not encrypted for lookup purposes\n            existingRecord = DataExtension.Init(\"MoEngage Credentials Test\").Rows.Lookup([\"WorkspaceName\"], [workspaceName]);\n\n            // Test MoEngage connection with plain text credentials\n            var isValid = testMoEngageConnection(workspaceID, dataAPIKey, dataCenter);\n            var activeStatus = isValid ? \"True\" : \"False\";\n\n            // Encrypt sensitive data before storing\n            var encryptedWorkspaceID = encryptData(workspaceID, encryptionKey);\n            var encryptedDataAPIKey = encryptData(dataAPIKey, encryptionKey);\n            var encryptedPushAPIKey = pushAPIKey ? encryptData(pushAPIKey, encryptionKey) : \"\";\n\n            if (existingRecord != null) {\n                // Update the existing record with encrypted data\n                updateCount = DataExtension.Init(\"MoEngage Credentials Test\").Rows.Update({\n                    \"DataCenter\": dataCenter,\n                    \"WorkspaceID\": encryptedWorkspaceID,\n                    \"DataKey\": encryptedDataAPIKey,\n                    \"PushKey\": encryptedPushAPIKey,\n                    \"Active\": activeStatus\n                }, [\"WorkspaceName\"], [workspaceName]);\n\n                if (updateCount > 0) {\n                    message = isValid ? 'Credentials validated and encrypted! Existing record successfully updated and marked as ACTIVE' : 'Credentials are invalid! Existing record updated and marked as INACTIVE';\n                    if (isValid) {\n                        showPage2 = true; // Show page 2 only if credentials are valid\n                    }\n                } else {\n                    message = 'Error updating the record';\n                }\n            } else {\n                // If no existing record, and credentials are valid, insert new encrypted record\n                if (activeStatus == 'True') {\n                    insertCount = DataExtension.Init(\"MoEngage Credentials Test\").Rows.Add({\n                        \"WorkspaceName\": workspaceName,\n                        \"DataCenter\": dataCenter,\n                        \"WorkspaceID\": encryptedWorkspaceID,\n                        \"DataKey\": encryptedDataAPIKey,\n                        \"PushKey\": encryptedPushAPIKey,\n                        \"Active\": \"True\"\n                    });\n\n                    if (insertCount > 0) {\n                        message = 'Credentials validated and encrypted! Record inserted successfully and marked as ACTIVE';\n                        showPage2 = true; // Show page 2 on successful insertion\n                    } else {\n                        message = 'Error inserting data';\n                    }\n                } else {\n                    message = 'Invalid credentials! Data was not inserted';\n                }\n            }\n        } else {\n            message = 'Please enter all required fields';\n        }\n    }\n\n    // Process Page 2 submission\n    if (submitted2 == 'true') {\n        try {\n            Write(\"SSJS Submit Button Clicked - \");\n            Write(\"operation: \" + operation + \" - \");\n            Write(\"isUpdateChecked: \" + isUpdateChecked + \" - \");\n            Write(\"username: \" + username + \" - \");\n            Write(\"usernameTextbox: \" + usernameTextbox + \" - \");\n            Write(\"usernameDropdown: \" + usernameDropdown + \" - \");\n            Write(\"password: \" + password + \" - \");\n\n            if ((usernameTextbox != \"\" || usernameDropdown != \"\") && password != \"\") {\n                // Encrypt the password\n                var encryptedPassword = encrypt(password);\n\n                if (isUpdateChecked == true) {\n                    // Existing Record check - Dropdown username\n                    existingRecord2 = DataExtension.Init(\"9C175D79-CA62-44A4-899F-586A526A2424\").Rows.Lookup([\"UserName\"], [usernameDropdown]);\n                    Write(\"Existing Record: \" + Stringify(existingRecord2) + \" - \");\n                    if (existingRecord2 != null) {\n                        Write(\"In Update Block - \");\n                        // Update the record\n                        updateCount2 = DataExtension.Init(\"9C175D79-CA62-44A4-899F-586A526A2424\").Rows.Update({\n                            \"UserName\": usernameDropdown,\n                            \"Password\": encryptedPassword\n                        }, [\"UserName\"], [usernameDropdown]);\n\n                        message2 = updateCount2 > 0 ? \"Record updated successfully\" : \"Error updating the record\";\n                    } else {\n                        message2 = \"Record not found for update\";\n                    }\n                } else if (isUpdateChecked == false) {\n                    Write(\"In Insert Block - \");\n\n                    // Check if the to-be-inserted record already exists\n                    // Existing Record check - Dropdown username\n                    var existingRecordTextbox = DataExtension.Init(\"9C175D79-CA62-44A4-899F-586A526A2424\").Rows.Lookup([\"UserName\"], [usernameTextbox]);\n\n                    var jsonArray = existingRecordTextbox;\n                    var existingUsername = \"\";\n\n                    if (jsonArray.length > 0) {\n                        var firstObject = jsonArray[0];\n                        existingUsername = firstObject.UserName;\n                    }\n\n                    // Output the username (you can use this variable for other operations)\n                    Write(\"Extracted Username: \" + existingUsername);\n\n                    if (existingUsername == usernameTextbox) {\n                        message2 = \"Record already exists. Please select the update checkbox to update a record\";\n                    } else {\n                        // Insert new record\n                        var insertCount2 = DataExtension.Init(\"9C175D79-CA62-44A4-899F-586A526A2424\").Rows.Add({\n                            \"UserName\": usernameTextbox,\n                            \"Password\": encryptedPassword\n                        });\n\n                        message2 = insertCount2 > 0 ? \"Record inserted successfully\" : \"Error inserting the record\";\n                    }\n                }\n            } else {\n                message2 = \"Please fill in all required fields\";\n            }\n        } catch (e) {\n            message2 = \"An error occurred: \" + e.message;\n        }\n    }\n\n    // Output the message variables back to the HTML forms\n    Variable.SetValue(\"@message\", message);\n    Variable.SetValue(\"@message2\", message2);\n    Variable.SetValue(\"@showPage2\", showPage2);\n</script>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>MoEngage Authentication System</title>\n    <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.rtl.min.css\" integrity=\"sha384-dpuaG1suU0eT09tx5plTaGMLBsfDLzUCCUXOY2j/LSvXYuG6Bqs43ALlhIqAJVRb\" crossorigin=\"anonymous\">\n    <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js\"></script>\n    <!-- Include CryptoJS library for encryption -->\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.js\"></script>\n    <script src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js\"></script>\n    <style>\n        .form-container {\n            max-width: 600px;\n            margin: auto;\n            background: #f9f9f9;\n            padding: 20px;\n            border-radius: 10px;\n            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n        }\n\n        .form-container label {\n            margin-right: 10px;\n        }\n\n        .form-container .form-control,\n        .form-container .form-select {\n            max-width: calc(100% - 150px);\n        }\n\n        .form-container .form-group {\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n        }\n\n        .form-container .form-check {\n            display: flex;\n            align-items: center;\n        }\n\n        .form-container .form-check-label {\n            margin-left: 5px;\n        }\n\n        .form-container .btn-primary {\n            width: 100%;\n        }\n\n        #page1 {\n            display: block;\n        }\n\n        #page2 {\n            display: none;\n        }\n    </style>\n</head>\n\n<body>\n    <!-- Page 1: MoEngage Workspace Authentication -->\n    <div id=\"page1\" %%[ IF @showPage2 == \"True\" THEN ]%% style=\"display: none;\" %%[ ENDIF ]%%>\n        <div class=\"step mb-3 justify-content-center align-items-center\">\n            <div class=\"row\">\n                <div class=\"col-12\">\n                    <h2 class=\"p-3 mb-3 text-white text-center\" style=\"background-color: #00237c;\">MoEngage Workspace\n                        Authentication (Encrypted Storage)</h2>\n                    <div class=\"alert alert-info mx-auto\" style=\"width: 90%;\">\n                        <strong>Security Notice:</strong> All sensitive data (Workspace ID, API Keys) will be encrypted before storage.\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"mx-auto\" style=\"width: 90%;\">\n                <div class=\"justify-content-center align-items-center\">\n                    <form method=\"POST\" action=\"\">\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"datacenter\" class=\"form-label fw-semibold fs-5\">Data Center: </label>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <select class=\"form-select\" aria-label=\"Default select example\" required=\"\" id=\"datacenter\" name=\"datacenter\">\n                                        <option value=\"01\" selected=\"\">01</option>\n                                        <option value=\"02\">02</option>\n                                        <option value=\"03\">03</option>\n                                        <option value=\"04\">04</option>\n                                        <option value=\"05\">05</option>\n                                        <option value=\"06\">06</option>\n                                    </select>\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"workspaceName\" class=\"form-label fw-semibold fs-5\">Workspace Name: </label>\n                                    <small class=\"text-muted d-block\">Not encrypted (used for lookups)</small>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <input type=\"text\" id=\"workspaceName\" name=\"workspaceName\" class=\"form-control\" required=\"\">\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"workspaceID\" class=\"form-label fw-semibold fs-5\">Workspace ID: </label>\n                                    <small class=\"text-muted d-block\">🔒 Will be encrypted</small>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <input type=\"text\" id=\"workspaceID\" name=\"workspaceID\" class=\"form-control\" required=\"\">\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"Data_API_KEY\" class=\"form-label fw-semibold fs-5\">Data API Key: </label>\n                                    <small class=\"text-muted d-block\">🔒 Will be encrypted</small>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <input type=\"password\" id=\"Data_API_KEY\" name=\"Data_API_KEY\" class=\"form-control\" required=\"\">\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"push_API_KEY\" class=\"form-label fw-semibold fs-5\">Campaign/Push API\n                                        Key: </label>\n                                    <small class=\"text-muted d-block\">🔒 Will be encrypted</small>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <input type=\"password\" id=\"push_API_KEY\" name=\"push_API_KEY\" class=\"form-control\">\n                                </div>\n                            </div>\n                        </div>\n\n                        <input type=\"hidden\" name=\"message\" value=\"%%=v(@message)=%%\">\n                        <input type=\"hidden\" name=\"submitted\" value=\"true\">\n\n                        <div class=\"row\">\n                            <div class=\"col-12 text-center\">\n                                <input class=\"btn btn-primary p-2 w-50 mt-5\" style=\"background-color:#00237c\" type=\"submit\" value=\"Submit & Encrypt\">\n                            </div>\n                        </div>\n                    </form>\n\n                    <p id=\"message\" style=\"color:green;font-size:20px; font-weight:900;text-align:center\">\n                        %%=v(@message)=%%\n                    </p>\n\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <!-- Page 2: MoEngage Data Tracking Authentication -->\n    <div id=\"page2\" %%[ IF @showPage2 == \"True\" THEN ]%% style=\"display: block;\" %%[ ENDIF ]%%>\n        <div class=\"container mt-5\">\n            <div class=\"form-container\">\n                <h3 class=\"text-center text-white p-3 mb-4\" style=\"background-color: #00237c;\">MoEngage Data Tracking\n                    Authentication</h3>\n\n                <form id=\"authForm\" method=\"POST\" action=\"\">\n                    <div class=\"mb-4 form-check form-switch mx-4\">\n                        <input class=\"form-check-input mx-2\" type=\"checkbox\" id=\"operation\" name=\"operation\" value=\"update\">\n                        <label class=\"form-check-label mx-2\" for=\"operation\">Update Existing Record</label>\n                    </div>\n\n                    <div class=\"mb-4 form-group mx-4 row\">\n                        <label for=\"username\" class=\"form-label fs-6 col-sm-2\">Username</label>\n                        <select id=\"usernameDropdown\" name=\"usernameDropdown\" class=\"form-select col-sm-10\"\n                            style=\"display: none;\">\n                            <option class=\"dropdown-header\" selected disabled>Select the Existing Username</option>\n                            %%[\n                            SET @rows = LookupRows(\"{{mcpm#/entities/dataExtensions/92e1d659-a98c-f011-a5dc-5cba2c191b88/data/name}}\", \"Active\", \"True\")\n                            FOR @i = 1 TO RowCount(@rows) DO\n                            SET @row = Row(@rows, @i)\n                            SET @username = Field(@row, \"UserName\")\n                            ]%%\n                            <option value=\"%%=v(@username)=%%\">%%=v(@username)=%%</option>\n                            %%[NEXT @i]%%\n                        </select>\n                        <input type=\"text\" id=\"usernameTextbox\" name=\"usernameTextbox\" class=\"form-control col-sm-10\"\n                            placeholder=\"Enter username\" minlength=\"8\" required>\n                    </div>\n\n                    <div class=\"mb-4 form-group mx-4 row\">\n                        <label for=\"password\" class=\"form-label fs-6 col-sm-2\">Password</label>\n                        <input type=\"password\" id=\"password\" name=\"password\" class=\"form-control col-sm-10\"\n                            placeholder=\"Enter password\" minlength=\"8\" required>\n                    </div>\n\n                    <input type=\"hidden\" name=\"message2\" value=\"%%=v(@message2)=%%\">\n                    <input type=\"hidden\" name=\"submitted2\" value=\"true\">\n                    <input type=\"hidden\" name=\"showPage2\" value=\"true\">\n\n                    <div class=\"text-start mx-4\">\n                        <button type=\"submit\" class=\"btn btn-primary w-auto\"\n                            style=\"background-color:#00237c\">Submit</button>\n                    </div>\n                </form>\n\n                <p id=\"message2\" class=\"mt-4 text-center\" style=\"color:green;font-size:20px; font-weight:900;\">\n                    %%=v(@message2)=%%\n                </p>\n\n                <!-- Back button to return to Page 1 -->\n                <div class=\"text-center mt-3\">\n                    <button id=\"backToPage1\" class=\"btn btn-secondary\" style=\"background-color:#6c757d\">Back to Workspace Authentication</button>\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <!-- JavaScript for page transitions and functionality -->\n    <script>\n        $(document).ready(function () {\n            // Page 1 JavaScript functionality\n            // Hide the message after 5 seconds if it's present\n            if ($('#message').text().trim() !== '') {\n                setTimeout(function () {\n                    $('#message').fadeOut();\n                }, 5000);\n            }\n\n            // Add visual feedback for encrypted fields\n            $('input[type=\"password\"], #workspaceID').on('input', function() {\n                if ($(this).val().length > 0) {\n                    $(this).addClass('border-warning');\n                } else {\n                    $(this).removeClass('border-warning');\n                }\n            });\n\n            // Page 2 JavaScript functionality\n            const operationCheckbox = $('#operation');\n            const usernameTextbox = $('#usernameTextbox');\n            const usernameDropdown = $('#usernameDropdown');\n\n            // Toggle username input based on checkbox state\n            operationCheckbox.on('change', function () {\n                if (this.checked) {\n                    usernameTextbox.hide();\n                    $(\"#usernameTextbox\").removeAttr('required', '');\n                    usernameDropdown.show();\n                } else {\n                    usernameTextbox.show();\n                    $(\"#usernameTextbox\").attr(\"required\",\"required\");\n                    usernameDropdown.hide();\n                }\n            });\n\n            // Hide message2 after 5 seconds\n            if ($('#message2').text().trim() !== '') {\n                setTimeout(function () {\n                    $('#message2').fadeOut();\n                }, 5000);\n            }\n\n            // Back to Page 1 functionality\n            $('#backToPage1').on('click', function() {\n                $('#page2').hide();\n                $('#page1').show();\n            });\n\n            // Check if we should show page 2 initially\n            %%[ IF @showPage2 == \"True\" THEN ]%%\n                $('#page1').hide();\n                $('#page2').show();\n            %%[ ENDIF ]%%\n        });\n    </script>\n</body>\n</html>","design":"<div class=\"default-design\"><div style=\"width:100%;height:150px;background: url(data:image/png;base64,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) repeat-x 0 0\"></div></div>","meta":{},"modelVersion":2}},"modelVersion":2}},"modelVersion":2}},"availableViews":["html"]},"content":{"channelTypeId":3,"contentType":"text/html","isDefault":true,"isStaticContent":false,"name":"MoEngage Workspace and Data Tracking Credentials Authentication","siteId":"{{mcpm#/entities/primaryLandingPages/708434-4844/data/definition/landingPageId}}"},"name":"MoEngage Workspace and Data Tracking Credentials Authentication","primaryId":"{{mcpm#/entities/primaryLandingPages/708434-4844/data/id}}","state":{"contentType":"text/html","description":"","name":"MoEngage Workspace and Data Tracking Credentials Authentication","siteId":"{{mcpm#/entities/primaryLandingPages/708434-4844/data/definition/landingPageId}}"}}},"708435-4845":{"issues":[],"originID":"708435-4845","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"asset":{"assetType":{"id":205,"name":"webpage","displayName":"Web Page"},"customerKey":"2d06b987-bd9a-4e73-af2d-278d0ccadc59","name":"MoEngage Campaign Tracking","category":{"id":"{{mcpm#/entities/categories/36352/data/id}}"},"contentType":"text/html","meta":{"globalStyles":{"isLocked":false,"body":{"max-width":"1280px","color":"#000000","font-family":"Arial","font-size":"12px","margin":"0px auto"},"template":{"background-color":"#FFFFFF","border":"none","box-sizing":"border-box","padding":"0px","width":"100%"},"buttons":{},"h1":{},"h2":{},"h3":{},"links":{}}},"views":{"html":{"thumbnail":{},"content":"<!DOCTYPE html>\n<html>\n<head>\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0\" />\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n\t<style class=\"main_style\">\n.layout-canvas-g {\n  background-color: #fff;\n  border: none;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  padding: 0;\n  width: 100%;\n}\n.layout-canvas-g > .header,\n.layout-canvas-g > .section,\n.layout-canvas-g > .footer {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n  word-wrap: break-word;\n}\n.layout-canvas-g > .section {\n  margin: 10px 0;\n}\n.layout-canvas-g > .section > .columns {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  word-wrap: break-word;\n}\nbody {\n  color: #000;\n  font-family: Arial;\n  font-size: 12px;\n  margin: 0 auto;\n  max-width: 1280px;\n}\n@media only screen and (max-width: 480px) {\n  .mobile-hidden {\n    display: none !important;\n  }\n  .responsive-td {\n    width: 100% !important;\n    display: block !important;\n    padding: 0 !important;\n  }\n}\n.layout-canvas-g > .section > .columns {\n  width: 100%;\n}\n\n</style>\n\n</head>\n<body>\n<div class=\"layout layout-canvas-g\">\n\t<div class=\"section\">\n\t\t<div class=\"columns col1\">\n\t\t\t<div data-type=\"slot\" data-key=\"col1\"></div>\n\t\t</div>\n\t</div>\n</div>\n</body>\n</html>\n","meta":{},"slots":{"col1":{"content":"<div data-type=\"block\" data-key=\"w3basi8lqoc\"></div>","design":"<p style=\"font-family:arial;color:#ccc;font-size:11px;text-align:center;vertical-align:middle;font-weight:bold;padding:10px;margin:0;border:#ccc dashed 1px;\">Drop blocks or content here</p>","blocks":{"w3basi8lqoc":{"assetType":{"id":197,"name":"htmlblock"},"content":"<table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" role=\"presentation\" style=\"min-width: 100%; \" class=\"stylingblock-content-wrapper\"><tr><td class=\"stylingblock-content-wrapper camarker-inner\"><script runat=\"server\">\n    Platform.Load(\"Core\", \"1.1.1\");\n\n    // Get the value of postman header\n    var authHeader = Platform.Request.GetRequestHeader(\"Authorization\");\n\n    // Check if Authorization header starts with Basic.\n    if (authHeader && authHeader.indexOf(\"Basic \") === 0) {\n        // Decode the Base64 encoded credentials\n        var encodedCredentials = authHeader.substring(6);\n        var decodedCredentials = Platform.Function.Base64Decode(encodedCredentials);\n\n        // Split the decoded credentials into username and password.\n        var credentialsArray = decodedCredentials.split(\":\");\n        var username = credentialsArray[0];\n        var password = credentialsArray[1];\n\n        // Lookup encrypted password for this username\n        var expectedPasswordEncrypted = Platform.Function.Lookup(\n            '{{mcpm#/entities/dataExtensions/92e1d659-a98c-f011-a5dc-5cba2c191b88/data/name}}',\n            'Password',\n            'UserName',\n            username\n        );\n\n        var isAuthorized = false;\n\n        if (expectedPasswordEncrypted && expectedPasswordEncrypted != \"\") {\n            try {\n                Variable.SetValue(\"@EncryptedPassword\", expectedPasswordEncrypted);\n                var decryptedPassword = Platform.Function.TreatAsContent(\n                    \"%%[ SET @DecryptedPwd = DecryptSymmetric(@EncryptedPassword, 'AES', 'SymmetricKey-DataTracking', '', 'SaltKey-DataTracking', '', 'IVKey-DataTracking', '') ]%%%%=v(@DecryptedPwd)=%%\"\n                );\n\n                if (decryptedPassword) {\n                    decryptedPassword = decryptedPassword.toString().replace(/^\\s+|\\s+$/g, '');\n                    if (username === username && password === decryptedPassword) {\n                        isAuthorized = true;\n                    }\n                }\n            } catch (decryptError) {\n                isAuthorized = false;\n            }\n        }\n\n        if (isAuthorized) {\n            var requestMethod = Request.Method;\n\n            if (requestMethod == \"POST\") {\n                var jsonpost = Platform.Request.GetPostData();\n\n                try {\n                    var jsonData = Platform.Function.ParseJSON(jsonpost);\n\n                    // Init DE with external key\n                    var DE = DataExtension.Init(\"{{mcpm#/entities/dataExtensions/a0bdc401-fe91-f011-a5dc-5cba2c191b88/data/customerKey}}\");\n\n                    // Loop through events array\n                    if (jsonData.events && jsonData.events.length > 0) {\n                        for (var i = 0; i < jsonData.events.length; i++) {\n                            var singleEvent = jsonData.events[i];\n\n                            var row = {\n                                \"app_name\": jsonData.app_name || \"\",\n                                \"source\": jsonData.source || \"\",\n                                \"moe_request_id\": jsonData.moe_request_id || \"\",\n                                \"events\": Platform.Function.Stringify(singleEvent) || \"\"\n                            };\n\n                            DE.Rows.Add(row);\n                        }\n                    }\n\n                    Platform.Response.SetResponseHeader(\"Content-Type\", \"application/json\");\n                    Platform.Response.Write('{\"status\":\"success\",\"message\":\"Events stored successfully\"}');\n                } catch (err) {\n                    Platform.Response.SetResponseHeader(\"Content-Type\", \"application/json\");\n                    Platform.Response.Write('{\"status\":\"error\",\"message\":\"Invalid JSON payload\"}');\n                }\n            } else {\n                Platform.Response.SetResponseHeader(\"Content-Type\", \"application/json\");\n                Platform.Response.Write('{\"status\":\"error\",\"message\":\"Invalid request method. Please use POST.\"}');\n            }\n        } else {\n            Platform.Response.SetResponseHeader(\"Content-Type\", \"application/json\");\n            Platform.Response.Write('{\"status\":\"error\",\"message\":\"Unauthorized\"}');\n        }\n    } else {\n        Platform.Response.SetResponseHeader(\"Content-Type\", \"application/json\");\n        Platform.Response.Write('{\"status\":\"error\",\"message\":\"Authorization header missing or invalid\"}');\n    }\n</script>\n</td></tr></table>","design":"<table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" role=\"presentation\" style=\"min-width: 100%; \" class=\"stylingblock-content-wrapper\"><tr><td class=\"stylingblock-content-wrapper camarker-inner\"><div class=\"default-design\"><div style=\"width:100%;height:150px;background: url(data:image/png;base64,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) repeat-x 0 0\"></div></div></td></tr></table>","meta":{"wrapperStyles":{"mobile":{"visible":true},"styling":{}}},"modelVersion":2}},"modelVersion":2}},"modelVersion":2}},"availableViews":["html"]},"content":{"channelTypeId":3,"contentType":"text/html","isDefault":true,"isStaticContent":false,"name":"MoEngage Campaign Tracking","siteId":"{{mcpm#/entities/primaryLandingPages/708435-4845/data/definition/landingPageId}}"},"name":"MoEngage Campaign Tracking","primaryId":"{{mcpm#/entities/primaryLandingPages/708435-4845/data/id}}","state":{"contentType":"text/html","description":"","name":"MoEngage Campaign Tracking","siteId":"{{mcpm#/entities/primaryLandingPages/708435-4845/data/definition/landingPageId}}"}}}},"microsites":{},"micrositePages":{},"micrositePageVersions":{},"primaryLandingPages":{"708435-4845":{"issues":[],"originID":"708435-4845","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"asset":{"assetType":{"id":205,"name":"webpage","displayName":"Web Page"},"customerKey":"2d06b987-bd9a-4e73-af2d-278d0ccadc59","name":"MoEngage Campaign Tracking","category":{"id":"{{mcpm#/entities/categories/36352/data/id}}"},"contentType":"text/html","meta":{"globalStyles":{"isLocked":false,"body":{"max-width":"1280px","color":"#000000","font-family":"Arial","font-size":"12px","margin":"0px auto"},"template":{"background-color":"#FFFFFF","border":"none","box-sizing":"border-box","padding":"0px","width":"100%"},"buttons":{},"h1":{},"h2":{},"h3":{},"links":{}}},"views":{"html":{"thumbnail":{},"content":"<!DOCTYPE html>\n<html>\n<head>\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0\" />\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n\t<style class=\"main_style\">\n.layout-canvas-g {\n  background-color: #fff;\n  border: none;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  padding: 0;\n  width: 100%;\n}\n.layout-canvas-g > .header,\n.layout-canvas-g > .section,\n.layout-canvas-g > .footer {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n  word-wrap: break-word;\n}\n.layout-canvas-g > .section {\n  margin: 10px 0;\n}\n.layout-canvas-g > .section > .columns {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  word-wrap: break-word;\n}\nbody {\n  color: #000;\n  font-family: Arial;\n  font-size: 12px;\n  margin: 0 auto;\n  max-width: 1280px;\n}\n@media only screen and (max-width: 480px) {\n  .mobile-hidden {\n    display: none !important;\n  }\n  .responsive-td {\n    width: 100% !important;\n    display: block !important;\n    padding: 0 !important;\n  }\n}\n.layout-canvas-g > .section > .columns {\n  width: 100%;\n}\n\n</style>\n\n</head>\n<body>\n<div class=\"layout layout-canvas-g\">\n\t<div class=\"section\">\n\t\t<div class=\"columns col1\">\n\t\t\t<div data-type=\"slot\" data-key=\"col1\"></div>\n\t\t</div>\n\t</div>\n</div>\n</body>\n</html>\n","meta":{},"slots":{"col1":{"content":"<div data-type=\"block\" data-key=\"w3basi8lqoc\"></div>","design":"<p style=\"font-family:arial;color:#ccc;font-size:11px;text-align:center;vertical-align:middle;font-weight:bold;padding:10px;margin:0;border:#ccc dashed 1px;\">Drop blocks or content here</p>","blocks":{"w3basi8lqoc":{"assetType":{"id":197,"name":"htmlblock"},"content":"<table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" role=\"presentation\" style=\"min-width: 100%; \" class=\"stylingblock-content-wrapper\"><tr><td class=\"stylingblock-content-wrapper camarker-inner\"><script runat=\"server\">\n    Platform.Load(\"Core\", \"1.1.1\");\n\n    // Get the value of postman header\n    var authHeader = Platform.Request.GetRequestHeader(\"Authorization\");\n\n    // Check if Authorization header starts with Basic.\n    if (authHeader && authHeader.indexOf(\"Basic \") === 0) {\n        // Decode the Base64 encoded credentials\n        var encodedCredentials = authHeader.substring(6);\n        var decodedCredentials = Platform.Function.Base64Decode(encodedCredentials);\n\n        // Split the decoded credentials into username and password.\n        var credentialsArray = decodedCredentials.split(\":\");\n        var username = credentialsArray[0];\n        var password = credentialsArray[1];\n\n        // Lookup encrypted password for this username\n        var expectedPasswordEncrypted = Platform.Function.Lookup(\n            'MoEngage Tracking Credential',\n            'Password',\n            'UserName',\n            username\n        );\n\n        var isAuthorized = false;\n\n        if (expectedPasswordEncrypted && expectedPasswordEncrypted != \"\") {\n            try {\n                Variable.SetValue(\"@EncryptedPassword\", expectedPasswordEncrypted);\n                var decryptedPassword = Platform.Function.TreatAsContent(\n                    \"%%[ SET @DecryptedPwd = DecryptSymmetric(@EncryptedPassword, 'AES', 'SymmetricKey-DataTracking', '', 'SaltKey-DataTracking', '', 'IVKey-DataTracking', '') ]%%%%=v(@DecryptedPwd)=%%\"\n                );\n\n                if (decryptedPassword) {\n                    decryptedPassword = decryptedPassword.toString().replace(/^\\s+|\\s+$/g, '');\n                    if (username === username && password === decryptedPassword) {\n                        isAuthorized = true;\n                    }\n                }\n            } catch (decryptError) {\n                isAuthorized = false;\n            }\n        }\n\n        if (isAuthorized) {\n            var requestMethod = Request.Method;\n\n            if (requestMethod == \"POST\") {\n                var jsonpost = Platform.Request.GetPostData();\n\n                try {\n                    var jsonData = Platform.Function.ParseJSON(jsonpost);\n\n                    // Init DE with external key\n                    var DE = DataExtension.Init(\"Test MoEngage Data Track\");\n\n                    // Loop through events array\n                    if (jsonData.events && jsonData.events.length > 0) {\n                        for (var i = 0; i < jsonData.events.length; i++) {\n                            var singleEvent = jsonData.events[i];\n\n                            var row = {\n                                \"app_name\": jsonData.app_name || \"\",\n                                \"source\": jsonData.source || \"\",\n                                \"moe_request_id\": jsonData.moe_request_id || \"\",\n                                \"events\": Platform.Function.Stringify(singleEvent) || \"\"\n                            };\n\n                            DE.Rows.Add(row);\n                        }\n                    }\n\n                    Platform.Response.SetResponseHeader(\"Content-Type\", \"application/json\");\n                    Platform.Response.Write('{\"status\":\"success\",\"message\":\"Events stored successfully\"}');\n                } catch (err) {\n                    Platform.Response.SetResponseHeader(\"Content-Type\", \"application/json\");\n                    Platform.Response.Write('{\"status\":\"error\",\"message\":\"Invalid JSON payload\"}');\n                }\n            } else {\n                Platform.Response.SetResponseHeader(\"Content-Type\", \"application/json\");\n                Platform.Response.Write('{\"status\":\"error\",\"message\":\"Invalid request method. Please use POST.\"}');\n            }\n        } else {\n            Platform.Response.SetResponseHeader(\"Content-Type\", \"application/json\");\n            Platform.Response.Write('{\"status\":\"error\",\"message\":\"Unauthorized\"}');\n        }\n    } else {\n        Platform.Response.SetResponseHeader(\"Content-Type\", \"application/json\");\n        Platform.Response.Write('{\"status\":\"error\",\"message\":\"Authorization header missing or invalid\"}');\n    }\n</script>\n</td></tr></table>","design":"<table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" role=\"presentation\" style=\"min-width: 100%; \" class=\"stylingblock-content-wrapper\"><tr><td class=\"stylingblock-content-wrapper camarker-inner\"><div class=\"default-design\"><div style=\"width:100%;height:150px;background: url(data:image/png;base64,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) repeat-x 0 0\"></div></div></td></tr></table>","meta":{"wrapperStyles":{"mobile":{"visible":true},"styling":{}}},"modelVersion":2}},"modelVersion":2}},"modelVersion":2}},"availableViews":["html"]},"content":{"channelTypeId":3,"contentType":"text/html","isDefault":true,"isStaticContent":false,"name":"MoEngage Campaign Tracking"},"definition":{"categoryId":"{{mcpm#/entities/cloudPageCollections/60361/data/id}}","description":"","domain":"{{mcpm:cloudPages-domain}}","isNoFollow":false,"isNoIndex":false,"key":"bckblfqz3hl","name":"MoEngage Campaign Tracking","pageTypeId":3,"requiresSsl":true,"url":"https://mc2nbfybf05jg5cw0p468sv5yf74.pub.sfmc-content.com/bckblfqz3hl"},"name":"MoEngage Campaign Tracking","state":{"contentType":"text/html","description":"","name":"MoEngage Campaign Tracking"}}},"708434-4844":{"issues":[],"originID":"708434-4844","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"asset":{"assetType":{"id":205,"name":"webpage","displayName":"Web Page"},"customerKey":"e2ca6c29-a1dc-412a-a081-15efe977e4d1","name":"MoEngage Workspace and Data Tracking Credentials Authentication","category":{"id":"{{mcpm#/entities/categories/36352/data/id}}"},"contentType":"text/html","meta":{"globalStyles":{"isLocked":false,"body":{"max-width":"1280px","color":"#000000","font-family":"Arial","font-size":"12px","margin":"0px auto"},"template":{"background-color":"#FFFFFF","border":"none","box-sizing":"border-box","padding":"0px","width":"100%"},"buttons":{},"h1":{},"h2":{},"h3":{},"links":{}}},"views":{"html":{"thumbnail":{},"content":"<!DOCTYPE html>\n<html lang=\"en\">\n<script runat=\"server\">\n    Platform.Load(\"Core\", \"1.1.1\");\n\n    var dataCenter, workspaceID, dataAPIKey, pushAPIKey, updateCount, submitted;\n    var workspaceName, existingRecord, message, apiResponse;\n    var username, password, updateCount2, submitted2, existingRecord2, message2, operation, usernameTextbox, usernameDropdown, isUpdateChecked;\n    var showPage2 = false;\n\n    // Encryption key - In production, this should be stored securely (e.g., in a secure Data Extension or configuration)\n    var encryptionKey = \"YourSecureEncryptionKey123!@#$%^&*\";\n\n    // Function to encrypt data using AES encryption\n    function encryptData(plainText, key) {\n        try {\n            // Simple XOR-based encryption for SSJS (since AES libraries aren't available in SSJS)\n            // In a real implementation, you'd want to use stronger encryption\n            var encrypted = \"\";\n            var keyLength = key.length;\n            \n            for (var i = 0; i < plainText.length; i++) {\n                var charCode = plainText.charCodeAt(i) ^ key.charCodeAt(i % keyLength);\n                encrypted += String.fromCharCode(charCode);\n            }\n            \n            // Convert to Base64 for safe storage\n            return Base64Encode(encrypted);\n        } catch (e) {\n            Write(\"Encryption Error: \" + Stringify(e));\n            return plainText; // Fallback to plain text if encryption fails\n        }\n    }\n\n    // Function to decrypt data\n    function decryptData(encryptedText, key) {\n        try {\n            // Decode from Base64 first\n            var decoded = Base64Decode(encryptedText);\n            var decrypted = \"\";\n            var keyLength = key.length;\n            \n            for (var i = 0; i < decoded.length; i++) {\n                var charCode = decoded.charCodeAt(i) ^ key.charCodeAt(i % keyLength);\n                decrypted += String.fromCharCode(charCode);\n            }\n            \n            return decrypted;\n        } catch (e) {\n            Write(\"Decryption Error: \" + Stringify(e));\n            return encryptedText; // Return as-is if decryption fails\n        }\n    }\n\n    // Function to call MoEngage Test Connection API\n    function testMoEngageConnection(workspaceID, dataAPIKey, dataCenter) {\n        var payload = {\n            \"app_id\": workspaceID,\n            \"app_secret\": dataAPIKey,\n            \"source\": \"SFMC\",\n            \"region\": dataCenter\n        };\n\n        var decoded = workspaceID + \":\" + dataAPIKey;\n        var encoded = Base64Encode(decoded);\n\n        var strPayload = Stringify(payload);\n        var isValidCredentials = false; // Flag for valid credentials, default to false\n\n        try {\n            //Test Connection API Call\n            var url = \"https://api-\" + dataCenter + \".moengage.com/v1/integrations/authentication\";\n            var contentType = \"application/json\";\n            var payload = strPayload;\n            var headerNames = [\"MOE-APPKEY\", \"Authorization\"];\n            var headerValues = [dataAPIKey, \"Basic \" + encoded];\n            var result = HTTP.Post(url, contentType, payload, headerNames, headerValues);\n\n            var statusCode = result.StatusCode;\n\n            if (statusCode == 200) {\n                var responseJSON = Platform.Function.ParseJSON(result.Response[0]);\n                var status = responseJSON.status;\n\n                if (status == \"success\") {\n                    isValidCredentials = true; // Set as valid if status is 'success'.\n                }\n\n            } else {\n                isValidCredentials = false; // Set as invalid if status is not success.\n            }\n        }\n        catch (e) {\n            message = 'Error in calling the MoEngage API for validation';\n            isValidCredentials = false;\n        }\n        return isValidCredentials; // Return true if credentials are valid, otherwise false\n    }\n\n    // Function to encrypt a string for page 2\n    function encrypt(str) {\n        Variable.SetValue(\"@ToEncrypt\", str);\n\n        var scr = \"\";\n        scr += \"\\%\\%[\";\n        scr += \"SET @Encrypted = EncryptSymmetric(@ToEncrypt, 'AES', 'SymmetricKey-DataTracking', @null, 'SaltKey-DataTracking', @null, 'IVKey-DataTracking', @null)\";\n        scr += \"Output(Concat(@Encrypted))\";\n        scr += \"]\\%\\%\";\n\n        return Platform.Function.TreatAsContent(scr);\n    }\n\n    // Capture the values submitted via the form for Page 1\n    submitted = Request.GetFormField(\"submitted\");\n    workspaceName = Request.GetFormField(\"workspaceName\");\n    dataCenter = Request.GetFormField(\"datacenter\");\n    workspaceID = Request.GetFormField(\"workspaceID\");\n    dataAPIKey = Request.GetFormField(\"Data_API_KEY\");\n    pushAPIKey = Request.GetFormField(\"push_API_KEY\");\n\n    // Capture submitted form values for Page 2\n    submitted2 = Request.GetFormField(\"submitted2\");\n    operation = Request.GetFormField(\"operation\");\n    isUpdateChecked = (operation === \"update\");\n    usernameTextbox = Request.GetFormField(\"usernameTextbox\");\n    usernameDropdown = Request.GetFormField(\"usernameDropdown\");\n    username = usernameTextbox || usernameDropdown;\n    password = Request.GetFormField(\"password\");\n\n    // Check if we should show page 2 based on session or successful completion of page 1\n    // Removed automatic page switching - let JavaScript handle transitions\n\n    // Process Page 1 submission\n    if (submitted == 'true') {\n        if (dataAPIKey != \"\" && workspaceID != \"\" && dataCenter != \"\") {\n\n            // Check for existing record - workspace name is not encrypted for lookup purposes\n            existingRecord = DataExtension.Init(\"MoEngage Credentials\").Rows.Lookup([\"WorkspaceName\"], [workspaceName]);\n\n            // Test MoEngage connection with plain text credentials\n            var isValid = testMoEngageConnection(workspaceID, dataAPIKey, dataCenter);\n            var activeStatus = isValid ? \"True\" : \"False\";\n\n            // Encrypt sensitive data before storing\n            var encryptedWorkspaceID = encryptData(workspaceID, encryptionKey);\n            var encryptedDataAPIKey = encryptData(dataAPIKey, encryptionKey);\n            var encryptedPushAPIKey = pushAPIKey ? encryptData(pushAPIKey, encryptionKey) : \"\";\n\n            if (existingRecord != null) {\n                // Update the existing record with encrypted data\n                updateCount = DataExtension.Init(\"MoEngage Credentials\").Rows.Update({\n                    \"DataCenter\": dataCenter,\n                    \"WorkspaceID\": encryptedWorkspaceID,\n                    \"DataKey\": encryptedDataAPIKey,\n                    \"PushKey\": encryptedPushAPIKey,\n                    \"Active\": activeStatus\n                }, [\"WorkspaceName\"], [workspaceName]);\n\n                if (updateCount > 0) {\n                    message = isValid ? 'Credentials validated and encrypted! Existing record successfully updated and marked as ACTIVE' : 'Credentials are invalid! Existing record updated and marked as INACTIVE';\n                    // Don't set showPage2 here - let JavaScript handle the transition after showing the message\n                } else {\n                    message = 'Error updating the record';\n                }\n            } else {\n                // If no existing record, and credentials are valid, insert new encrypted record\n                if (activeStatus == 'True') {\n                    insertCount = DataExtension.Init(\"MoEngage Credentials\").Rows.Add({\n                        \"WorkspaceName\": workspaceName,\n                        \"DataCenter\": dataCenter,\n                        \"WorkspaceID\": encryptedWorkspaceID,\n                        \"DataKey\": encryptedDataAPIKey,\n                        \"PushKey\": encryptedPushAPIKey,\n                        \"Active\": \"True\"\n                    });\n\n                    if (insertCount > 0) {\n                        message = 'Credentials validated and encrypted! Record inserted successfully and marked as ACTIVE';\n                        // Don't set showPage2 here - let JavaScript handle the transition after showing the message\n                    } else {\n                        message = 'Error inserting data';\n                    }\n                } else {\n                    message = 'Invalid credentials! Data was not inserted';\n                }\n            }\n        } else {\n            message = 'Please enter all required fields';\n        }\n    }\n\n    // Process Page 2 submission\n    if (submitted2 == 'true') {\n        try {\n            //Write(\"SSJS Submit Button Clicked - \");\n            //Write(\"operation: \" + operation + \" - \");\n            //Write(\"isUpdateChecked: \" + isUpdateChecked + \" - \");\n            //Write(\"username: \" + username + \" - \");\n            //Write(\"usernameTextbox: \" + usernameTextbox + \" - \");\n            //Write(\"usernameDropdown: \" + usernameDropdown + \" - \");\n            //Write(\"password: \" + password + \" - \");\n\n            if ((usernameTextbox != \"\" || usernameDropdown != \"\") && password != \"\") {\n                // Encrypt the password\n                var encryptedPassword = encrypt(password);\n\n                if (isUpdateChecked == true) {\n                    // Existing Record check - Dropdown username\n                    existingRecord2 = DataExtension.Init(\"MoEngage Tracking Credential\").Rows.Lookup([\"UserName\"], [usernameDropdown]);\n                    Write(\"Existing Record: \" + Stringify(existingRecord2) + \" - \");\n                    if (existingRecord2 != null) {\n                        Write(\"In Update Block - \");\n                        // Update the record\n                        updateCount2 = DataExtension.Init(\"MoEngage Tracking Credential\").Rows.Update({\n                            \"UserName\": usernameDropdown,\n                            \"Password\": encryptedPassword\n                        }, [\"UserName\"], [usernameDropdown]);\n\n                        message2 = updateCount2 > 0 ? \"Record updated successfully\" : \"Error updating the record\";\n                    } else {\n                        message2 = \"Record not found for update\";\n                    }\n                } else if (isUpdateChecked == false) {\n                    Write(\"In Insert Block - \");\n\n                    // Check if the to-be-inserted record already exists\n                    // Existing Record check - Dropdown username\n                    var existingRecordTextbox = DataExtension.Init(\"MoEngage Tracking Credential\").Rows.Lookup([\"UserName\"], [usernameTextbox]);\n\n                    var jsonArray = existingRecordTextbox;\n                    var existingUsername = \"\";\n\n                    if (jsonArray.length > 0) {\n                        var firstObject = jsonArray[0];\n                        existingUsername = firstObject.UserName;\n                    }\n\n                    // Output the username (you can use this variable for other operations)\n                    Write(\"Extracted Username: \" + existingUsername);\n\n                    if (existingUsername == usernameTextbox) {\n                        message2 = \"Record already exists. Please select the update checkbox to update a record\";\n                    } else {\n                        // Insert new record\n                        var insertCount2 = DataExtension.Init(\"MoEngage Tracking Credential\").Rows.Add({\n                            \"UserName\": usernameTextbox,\n                            \"Password\": encryptedPassword\n                        });\n\n                        message2 = insertCount2 > 0 ? \"Record inserted successfully\" : \"Error inserting the record\";\n                    }\n                }\n            } else {\n                message2 = \"Please fill in all required fields\";\n            }\n        } catch (e) {\n            message2 = \"An error occurred: \" + e.message;\n        }\n    }\n\n    // Output the message variables back to the HTML forms\n    Variable.SetValue(\"@message\", message);\n    Variable.SetValue(\"@message2\", message2);\n    Variable.SetValue(\"@showPage2\", showPage2);\n</script>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>MoEngage Authentication System</title>\n    <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.rtl.min.css\" integrity=\"sha384-dpuaG1suU0eT09tx5plTaGMLBsfDLzUCCUXOY2j/LSvXYuG6Bqs43ALlhIqAJVRb\" crossorigin=\"anonymous\">\n    <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js\"></script>\n    <!-- Include CryptoJS library for encryption -->\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.js\"></script>\n    <script src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js\"></script>\n    <style>\n        .form-container {\n            max-width: 600px;\n            margin: auto;\n            background: #f9f9f9;\n            padding: 20px;\n            border-radius: 10px;\n            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n        }\n\n        .form-container label {\n            margin-right: 10px;\n        }\n\n        .form-container .form-control,\n        .form-container .form-select {\n            max-width: calc(100% - 150px);\n        }\n\n        .form-container .form-group {\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n        }\n\n        .form-container .form-check {\n            display: flex;\n            align-items: center;\n        }\n\n        .form-container .form-check-label {\n            margin-left: 5px;\n        }\n\n        .form-container .btn-primary {\n            width: 100%;\n        }\n\n        #page1 {\n            display: block;\n        }\n\n        #page2 {\n            display: none;\n        }\n    </style>\n</head>\n\n<body>\n    <!-- Page 1: MoEngage Workspace Authentication -->\n    <div id=\"page1\">\n        <div class=\"step mb-3 justify-content-center align-items-center\">\n            <div class=\"row\">\n                <div class=\"col-12\">\n                    <h2 class=\"p-3 mb-3 text-white text-center\" style=\"background-color: #00237c;\">MoEngage Workspace\n                        Authentication (Encrypted Storage)</h2>\n                    <div class=\"alert alert-info mx-auto\" style=\"width: 90%;\">\n                        <strong>Security Notice:</strong> All sensitive data (Workspace ID, API Keys) will be encrypted before storage.\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"mx-auto\" style=\"width: 90%;\">\n                <div class=\"justify-content-center align-items-center\">\n                    <form method=\"POST\" action=\"\">\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"datacenter\" class=\"form-label fw-semibold fs-5\">Data Center: </label>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <select class=\"form-select\" aria-label=\"Default select example\" required=\"\" id=\"datacenter\" name=\"datacenter\">\n                                        <option value=\"01\" selected=\"\">01</option>\n                                        <option value=\"02\">02</option>\n                                        <option value=\"03\">03</option>\n                                        <option value=\"04\">04</option>\n                                        <option value=\"05\">05</option>\n                                        <option value=\"06\">06</option>\n                                    </select>\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"workspaceName\" class=\"form-label fw-semibold fs-5\">Workspace Name: </label>\n                                    <small class=\"text-muted d-block\">Not encrypted (used for lookups)</small>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <input type=\"text\" id=\"workspaceName\" name=\"workspaceName\" class=\"form-control\" required=\"\">\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"workspaceID\" class=\"form-label fw-semibold fs-5\">Workspace ID: </label>\n                                    <small class=\"text-muted d-block\">🔒 Will be encrypted</small>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <input type=\"text\" id=\"workspaceID\" name=\"workspaceID\" class=\"form-control\" required=\"\">\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"Data_API_KEY\" class=\"form-label fw-semibold fs-5\">Data API Key: </label>\n                                    <small class=\"text-muted d-block\">🔒 Will be encrypted</small>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <input type=\"password\" id=\"Data_API_KEY\" name=\"Data_API_KEY\" class=\"form-control\" required=\"\">\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"push_API_KEY\" class=\"form-label fw-semibold fs-5\">Campaign/Push API\n                                        Key: </label>\n                                    <small class=\"text-muted d-block\">🔒 Will be encrypted</small>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <input type=\"password\" id=\"push_API_KEY\" name=\"push_API_KEY\" class=\"form-control\">\n                                </div>\n                            </div>\n                        </div>\n\n                        <input type=\"hidden\" name=\"message\" value=\"%%=v(@message)=%%\">\n                        <input type=\"hidden\" name=\"submitted\" value=\"true\">\n\n                        <div class=\"row\">\n                            <div class=\"col-12 text-center\">\n                                <input class=\"btn btn-primary p-2 w-50 mt-5\" style=\"background-color:#00237c\" type=\"submit\" value=\"Submit & Encrypt\">\n                            </div>\n                        </div>\n                    </form>\n\n                    <p id=\"message\" style=\"color:green;font-size:20px; font-weight:900;text-align:center\">\n                        %%=v(@message)=%%\n                    </p>\n\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <!-- Page 2: MoEngage Data Tracking Authentication -->\n    <div id=\"page2\" style=\"display: none;\">\n        <div class=\"container mt-5\">\n            <div class=\"form-container\">\n                <h3 class=\"text-center text-white p-3 mb-4\" style=\"background-color: #00237c;\">MoEngage Data Tracking\n                    Authentication</h3>\n              <div class=\"alert alert-info mx-auto\" style=\"width: 90%;\">\n                        <strong>Security Notice:</strong> Please remember the password entered and share the same with MoEngage for raising a ticket for Streams. All sensitive data will be encrypted before storage.\n                    </div>\n\n                <form id=\"authForm\" method=\"POST\" action=\"\">\n                    <div class=\"mb-4 form-check form-switch mx-4\">\n                        <input class=\"form-check-input mx-2\" type=\"checkbox\" id=\"operation\" name=\"operation\" value=\"update\">\n                        <label class=\"form-check-label mx-2\" for=\"operation\">Update Existing Record</label>\n                    </div>\n\n                    <div class=\"mb-4 form-group mx-4 row\">\n                        <label for=\"username\" class=\"form-label fs-6 col-sm-2\">Username</label>\n                        <select id=\"usernameDropdown\" name=\"usernameDropdown\" class=\"form-select col-sm-10\"\n                            style=\"display: none;\">\n                            <option class=\"dropdown-header\" selected disabled>Select the Existing Username</option>\n                            %%[\n                            SET @rows = LookupRows(\"MoEngage Tracking Credential\", \"Active\", \"True\")\n                            FOR @i = 1 TO RowCount(@rows) DO\n                            SET @row = Row(@rows, @i)\n                            SET @username = Field(@row, \"UserName\")\n                            ]%%\n                            <option value=\"%%=v(@username)=%%\">%%=v(@username)=%%</option>\n                            %%[NEXT @i]%%\n                        </select>\n                        <input type=\"text\" id=\"usernameTextbox\" name=\"usernameTextbox\" class=\"form-control col-sm-10\"\n                            placeholder=\"Enter username\" minlength=\"8\" required>\n                    </div>\n\n                    <div class=\"mb-4 form-group mx-4 row\">\n                        <label for=\"password\" class=\"form-label fs-6 col-sm-2\">Password</label>\n                        <input type=\"password\" id=\"password\" name=\"password\" class=\"form-control col-sm-10\"\n                            placeholder=\"Enter password\" minlength=\"8\" required>\n                    </div>\n\n                    <input type=\"hidden\" name=\"message2\" value=\"%%=v(@message2)=%%\">\n                    <input type=\"hidden\" name=\"submitted2\" value=\"true\">\n                    <input type=\"hidden\" name=\"showPage2\" value=\"true\">\n\n                    <div class=\"text-start mx-4\">\n                        <button type=\"submit\" class=\"btn btn-primary w-auto\"\n                            style=\"background-color:#00237c\">Submit</button>\n                    </div>\n                </form>\n\n                <p id=\"message2\" class=\"mt-4 text-center\" style=\"color:green;font-size:20px; font-weight:900;\">\n                    %%=v(@message2)=%%\n                </p>\n\n                <!-- Back button to return to Page 1 -->\n                <div class=\"text-center mt-3\">\n                    <button id=\"backToPage1\" class=\"btn btn-secondary\" style=\"background-color:#6c757d\">Back to Workspace Authentication</button>\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <!-- JavaScript for page transitions and functionality -->\n    <script>\n        $(document).ready(function () {\n            // Page 1 JavaScript functionality\n            // Add visual feedback for encrypted fields\n            $('input[type=\"password\"], #workspaceID').on('input', function() {\n                if ($(this).val().length > 0) {\n                    $(this).addClass('border-warning');\n                } else {\n                    $(this).removeClass('border-warning');\n                }\n            });\n\n            // Page 2 JavaScript functionality\n            const operationCheckbox = $('#operation');\n            const usernameTextbox = $('#usernameTextbox');\n            const usernameDropdown = $('#usernameDropdown');\n\n            // Toggle username input based on checkbox state\n            operationCheckbox.on('change', function () {\n                if (this.checked) {\n                    usernameTextbox.hide();\n                    $(\"#usernameTextbox\").removeAttr('required', '');\n                    usernameDropdown.show();\n                } else {\n                    usernameTextbox.show();\n                    $(\"#usernameTextbox\").attr(\"required\",\"required\");\n                    usernameDropdown.hide();\n                }\n            });\n\n            // Back to Page 1 functionality\n            $('#backToPage1').on('click', function() {\n                $('#page2').hide();\n                $('#page1').show();\n            });\n\n            // Handle Page 1 success message and transition to Page 2\n            if ($('#message').text().trim() !== '') {\n                var messageText = $('#message').text().trim();\n                // Check if Page 1 was successful and should transition to Page 2\n                if (messageText.includes('successfully') && (messageText.includes('ACTIVE') || messageText.includes('inserted'))) {\n                    // Show the success message for 5 seconds, then transition to Page 2\n                    setTimeout(function () {\n                        $('#message').fadeOut(500, function() {\n                            // After message fades out, transition to Page 2\n                            $('#page1').fadeOut(500, function() {\n                                $('#page2').fadeIn(500);\n                            });\n                        });\n                    }, 5000);\n                } else {\n                    // If not successful, just hide the message after 5 seconds (stay on Page 1)\n                    setTimeout(function () {\n                        $('#message').fadeOut();\n                    }, 5000);\n                }\n            } else {\n                // Check if we should show page 2 initially (on page load after server-side processing)\n                %%[ IF @showPage2 == \"True\" THEN ]%%\n                    // If server-side determined we should show page 2, do the transition immediately\n                    $('#page1').hide();\n                    $('#page2').show();\n                %%[ ENDIF ]%%\n            }\n\n            // Handle Page 2 success message\n            if ($('#message2').text().trim() !== '') {\n                setTimeout(function () {\n                    $('#message2').fadeOut();\n                }, 5000);\n            }\n        });\n    </script>\n</body>\n</html>","meta":{},"slots":{"col1":{"content":"<div data-type=\"block\" data-key=\"j8jimzgymf7\"></div>","design":"<p style=\"font-family:arial;color:#ccc;font-size:11px;text-align:center;vertical-align:middle;font-weight:bold;padding:10px;margin:0;border:#ccc dashed 1px;\">Drop blocks or content here</p>","blocks":{"j8jimzgymf7":{"assetType":{"id":220,"name":"codesnippetblock"},"content":"<!DOCTYPE html>\n<html lang=\"en\">\n<script runat=\"server\">\n    Platform.Load(\"Core\", \"1.1.1\");\n\n    var dataCenter, workspaceID, dataAPIKey, pushAPIKey, updateCount, submitted;\n    var workspaceName, existingRecord, message, apiResponse;\n    var username, password, updateCount2, submitted2, existingRecord2, message2, operation, usernameTextbox, usernameDropdown, isUpdateChecked;\n    var showPage2 = false;\n\n    // Encryption key - In production, this should be stored securely (e.g., in a secure Data Extension or configuration)\n    var encryptionKey = \"YourSecureEncryptionKey123!@#$%^&*\";\n\n    // Function to encrypt data using AES encryption\n    function encryptData(plainText, key) {\n        try {\n            // Simple XOR-based encryption for SSJS (since AES libraries aren't available in SSJS)\n            // In a real implementation, you'd want to use stronger encryption\n            var encrypted = \"\";\n            var keyLength = key.length;\n            \n            for (var i = 0; i < plainText.length; i++) {\n                var charCode = plainText.charCodeAt(i) ^ key.charCodeAt(i % keyLength);\n                encrypted += String.fromCharCode(charCode);\n            }\n            \n            // Convert to Base64 for safe storage\n            return Base64Encode(encrypted);\n        } catch (e) {\n            Write(\"Encryption Error: \" + Stringify(e));\n            return plainText; // Fallback to plain text if encryption fails\n        }\n    }\n\n    // Function to decrypt data\n    function decryptData(encryptedText, key) {\n        try {\n            // Decode from Base64 first\n            var decoded = Base64Decode(encryptedText);\n            var decrypted = \"\";\n            var keyLength = key.length;\n            \n            for (var i = 0; i < decoded.length; i++) {\n                var charCode = decoded.charCodeAt(i) ^ key.charCodeAt(i % keyLength);\n                decrypted += String.fromCharCode(charCode);\n            }\n            \n            return decrypted;\n        } catch (e) {\n            Write(\"Decryption Error: \" + Stringify(e));\n            return encryptedText; // Return as-is if decryption fails\n        }\n    }\n\n    // Function to call MoEngage Test Connection API\n    function testMoEngageConnection(workspaceID, dataAPIKey, dataCenter) {\n        var payload = {\n            \"app_id\": workspaceID,\n            \"app_secret\": dataAPIKey,\n            \"source\": \"SFMC\",\n            \"region\": dataCenter\n        };\n\n        var decoded = workspaceID + \":\" + dataAPIKey;\n        var encoded = Base64Encode(decoded);\n\n        var strPayload = Stringify(payload);\n        var isValidCredentials = false; // Flag for valid credentials, default to false\n\n        try {\n            //Test Connection API Call\n            var url = \"https://api-\" + dataCenter + \".moengage.com/v1/integrations/authentication\";\n            var contentType = \"application/json\";\n            var payload = strPayload;\n            var headerNames = [\"MOE-APPKEY\", \"Authorization\"];\n            var headerValues = [dataAPIKey, \"Basic \" + encoded];\n            var result = HTTP.Post(url, contentType, payload, headerNames, headerValues);\n\n            var statusCode = result.StatusCode;\n\n            if (statusCode == 200) {\n                var responseJSON = Platform.Function.ParseJSON(result.Response[0]);\n                var status = responseJSON.status;\n\n                if (status == \"success\") {\n                    isValidCredentials = true; // Set as valid if status is 'success'.\n                }\n\n            } else {\n                isValidCredentials = false; // Set as invalid if status is not success.\n            }\n        }\n        catch (e) {\n            message = 'Error in calling the MoEngage API for validation';\n            isValidCredentials = false;\n        }\n        return isValidCredentials; // Return true if credentials are valid, otherwise false\n    }\n\n    // Function to encrypt a string for page 2\n    function encrypt(str) {\n        Variable.SetValue(\"@ToEncrypt\", str);\n\n        var scr = \"\";\n        scr += \"\\%\\%[\";\n        scr += \"SET @Encrypted = EncryptSymmetric(@ToEncrypt, 'AES', 'SymmetricKey-DataTracking', @null, 'SaltKey-DataTracking', @null, 'IVKey-DataTracking', @null)\";\n        scr += \"Output(Concat(@Encrypted))\";\n        scr += \"]\\%\\%\";\n\n        return Platform.Function.TreatAsContent(scr);\n    }\n\n    // Capture the values submitted via the form for Page 1\n    submitted = Request.GetFormField(\"submitted\");\n    workspaceName = Request.GetFormField(\"workspaceName\");\n    dataCenter = Request.GetFormField(\"datacenter\");\n    workspaceID = Request.GetFormField(\"workspaceID\");\n    dataAPIKey = Request.GetFormField(\"Data_API_KEY\");\n    pushAPIKey = Request.GetFormField(\"push_API_KEY\");\n\n    // Capture submitted form values for Page 2\n    submitted2 = Request.GetFormField(\"submitted2\");\n    operation = Request.GetFormField(\"operation\");\n    isUpdateChecked = (operation === \"update\");\n    usernameTextbox = Request.GetFormField(\"usernameTextbox\");\n    usernameDropdown = Request.GetFormField(\"usernameDropdown\");\n    username = usernameTextbox || usernameDropdown;\n    password = Request.GetFormField(\"password\");\n\n    // Check if we should show page 2 based on session or successful completion of page 1\n    var showPage2Flag = Request.GetFormField(\"showPage2\");\n    if (showPage2Flag == \"true\") {\n        showPage2 = true;\n    }\n\n    // Process Page 1 submission\n    if (submitted == 'true') {\n        if (dataAPIKey != \"\" && workspaceID != \"\" && dataCenter != \"\") {\n\n            // Check for existing record - workspace name is not encrypted for lookup purposes\n            existingRecord = DataExtension.Init(\"MoEngage Credentials Test\").Rows.Lookup([\"WorkspaceName\"], [workspaceName]);\n\n            // Test MoEngage connection with plain text credentials\n            var isValid = testMoEngageConnection(workspaceID, dataAPIKey, dataCenter);\n            var activeStatus = isValid ? \"True\" : \"False\";\n\n            // Encrypt sensitive data before storing\n            var encryptedWorkspaceID = encryptData(workspaceID, encryptionKey);\n            var encryptedDataAPIKey = encryptData(dataAPIKey, encryptionKey);\n            var encryptedPushAPIKey = pushAPIKey ? encryptData(pushAPIKey, encryptionKey) : \"\";\n\n            if (existingRecord != null) {\n                // Update the existing record with encrypted data\n                updateCount = DataExtension.Init(\"MoEngage Credentials Test\").Rows.Update({\n                    \"DataCenter\": dataCenter,\n                    \"WorkspaceID\": encryptedWorkspaceID,\n                    \"DataKey\": encryptedDataAPIKey,\n                    \"PushKey\": encryptedPushAPIKey,\n                    \"Active\": activeStatus\n                }, [\"WorkspaceName\"], [workspaceName]);\n\n                if (updateCount > 0) {\n                    message = isValid ? 'Credentials validated and encrypted! Existing record successfully updated and marked as ACTIVE' : 'Credentials are invalid! Existing record updated and marked as INACTIVE';\n                    if (isValid) {\n                        showPage2 = true; // Show page 2 only if credentials are valid\n                    }\n                } else {\n                    message = 'Error updating the record';\n                }\n            } else {\n                // If no existing record, and credentials are valid, insert new encrypted record\n                if (activeStatus == 'True') {\n                    insertCount = DataExtension.Init(\"MoEngage Credentials Test\").Rows.Add({\n                        \"WorkspaceName\": workspaceName,\n                        \"DataCenter\": dataCenter,\n                        \"WorkspaceID\": encryptedWorkspaceID,\n                        \"DataKey\": encryptedDataAPIKey,\n                        \"PushKey\": encryptedPushAPIKey,\n                        \"Active\": \"True\"\n                    });\n\n                    if (insertCount > 0) {\n                        message = 'Credentials validated and encrypted! Record inserted successfully and marked as ACTIVE';\n                        showPage2 = true; // Show page 2 on successful insertion\n                    } else {\n                        message = 'Error inserting data';\n                    }\n                } else {\n                    message = 'Invalid credentials! Data was not inserted';\n                }\n            }\n        } else {\n            message = 'Please enter all required fields';\n        }\n    }\n\n    // Process Page 2 submission\n    if (submitted2 == 'true') {\n        try {\n            Write(\"SSJS Submit Button Clicked - \");\n            Write(\"operation: \" + operation + \" - \");\n            Write(\"isUpdateChecked: \" + isUpdateChecked + \" - \");\n            Write(\"username: \" + username + \" - \");\n            Write(\"usernameTextbox: \" + usernameTextbox + \" - \");\n            Write(\"usernameDropdown: \" + usernameDropdown + \" - \");\n            Write(\"password: \" + password + \" - \");\n\n            if ((usernameTextbox != \"\" || usernameDropdown != \"\") && password != \"\") {\n                // Encrypt the password\n                var encryptedPassword = encrypt(password);\n\n                if (isUpdateChecked == true) {\n                    // Existing Record check - Dropdown username\n                    existingRecord2 = DataExtension.Init(\"9C175D79-CA62-44A4-899F-586A526A2424\").Rows.Lookup([\"UserName\"], [usernameDropdown]);\n                    Write(\"Existing Record: \" + Stringify(existingRecord2) + \" - \");\n                    if (existingRecord2 != null) {\n                        Write(\"In Update Block - \");\n                        // Update the record\n                        updateCount2 = DataExtension.Init(\"9C175D79-CA62-44A4-899F-586A526A2424\").Rows.Update({\n                            \"UserName\": usernameDropdown,\n                            \"Password\": encryptedPassword\n                        }, [\"UserName\"], [usernameDropdown]);\n\n                        message2 = updateCount2 > 0 ? \"Record updated successfully\" : \"Error updating the record\";\n                    } else {\n                        message2 = \"Record not found for update\";\n                    }\n                } else if (isUpdateChecked == false) {\n                    Write(\"In Insert Block - \");\n\n                    // Check if the to-be-inserted record already exists\n                    // Existing Record check - Dropdown username\n                    var existingRecordTextbox = DataExtension.Init(\"9C175D79-CA62-44A4-899F-586A526A2424\").Rows.Lookup([\"UserName\"], [usernameTextbox]);\n\n                    var jsonArray = existingRecordTextbox;\n                    var existingUsername = \"\";\n\n                    if (jsonArray.length > 0) {\n                        var firstObject = jsonArray[0];\n                        existingUsername = firstObject.UserName;\n                    }\n\n                    // Output the username (you can use this variable for other operations)\n                    Write(\"Extracted Username: \" + existingUsername);\n\n                    if (existingUsername == usernameTextbox) {\n                        message2 = \"Record already exists. Please select the update checkbox to update a record\";\n                    } else {\n                        // Insert new record\n                        var insertCount2 = DataExtension.Init(\"9C175D79-CA62-44A4-899F-586A526A2424\").Rows.Add({\n                            \"UserName\": usernameTextbox,\n                            \"Password\": encryptedPassword\n                        });\n\n                        message2 = insertCount2 > 0 ? \"Record inserted successfully\" : \"Error inserting the record\";\n                    }\n                }\n            } else {\n                message2 = \"Please fill in all required fields\";\n            }\n        } catch (e) {\n            message2 = \"An error occurred: \" + e.message;\n        }\n    }\n\n    // Output the message variables back to the HTML forms\n    Variable.SetValue(\"@message\", message);\n    Variable.SetValue(\"@message2\", message2);\n    Variable.SetValue(\"@showPage2\", showPage2);\n</script>\n\n<head>\n    <meta charset=\"utf-8\">\n    <title>MoEngage Authentication System</title>\n    <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.rtl.min.css\" integrity=\"sha384-dpuaG1suU0eT09tx5plTaGMLBsfDLzUCCUXOY2j/LSvXYuG6Bqs43ALlhIqAJVRb\" crossorigin=\"anonymous\">\n    <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js\"></script>\n    <!-- Include CryptoJS library for encryption -->\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.js\"></script>\n    <script src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js\"></script>\n    <style>\n        .form-container {\n            max-width: 600px;\n            margin: auto;\n            background: #f9f9f9;\n            padding: 20px;\n            border-radius: 10px;\n            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n        }\n\n        .form-container label {\n            margin-right: 10px;\n        }\n\n        .form-container .form-control,\n        .form-container .form-select {\n            max-width: calc(100% - 150px);\n        }\n\n        .form-container .form-group {\n            display: flex;\n            align-items: center;\n            justify-content: space-between;\n        }\n\n        .form-container .form-check {\n            display: flex;\n            align-items: center;\n        }\n\n        .form-container .form-check-label {\n            margin-left: 5px;\n        }\n\n        .form-container .btn-primary {\n            width: 100%;\n        }\n\n        #page1 {\n            display: block;\n        }\n\n        #page2 {\n            display: none;\n        }\n    </style>\n</head>\n\n<body>\n    <!-- Page 1: MoEngage Workspace Authentication -->\n    <div id=\"page1\" %%[ IF @showPage2 == \"True\" THEN ]%% style=\"display: none;\" %%[ ENDIF ]%%>\n        <div class=\"step mb-3 justify-content-center align-items-center\">\n            <div class=\"row\">\n                <div class=\"col-12\">\n                    <h2 class=\"p-3 mb-3 text-white text-center\" style=\"background-color: #00237c;\">MoEngage Workspace\n                        Authentication (Encrypted Storage)</h2>\n                    <div class=\"alert alert-info mx-auto\" style=\"width: 90%;\">\n                        <strong>Security Notice:</strong> All sensitive data (Workspace ID, API Keys) will be encrypted before storage.\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"mx-auto\" style=\"width: 90%;\">\n                <div class=\"justify-content-center align-items-center\">\n                    <form method=\"POST\" action=\"\">\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"datacenter\" class=\"form-label fw-semibold fs-5\">Data Center: </label>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <select class=\"form-select\" aria-label=\"Default select example\" required=\"\" id=\"datacenter\" name=\"datacenter\">\n                                        <option value=\"01\" selected=\"\">01</option>\n                                        <option value=\"02\">02</option>\n                                        <option value=\"03\">03</option>\n                                        <option value=\"04\">04</option>\n                                        <option value=\"05\">05</option>\n                                        <option value=\"06\">06</option>\n                                    </select>\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"workspaceName\" class=\"form-label fw-semibold fs-5\">Workspace Name: </label>\n                                    <small class=\"text-muted d-block\">Not encrypted (used for lookups)</small>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <input type=\"text\" id=\"workspaceName\" name=\"workspaceName\" class=\"form-control\" required=\"\">\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"workspaceID\" class=\"form-label fw-semibold fs-5\">Workspace ID: </label>\n                                    <small class=\"text-muted d-block\">🔒 Will be encrypted</small>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <input type=\"text\" id=\"workspaceID\" name=\"workspaceID\" class=\"form-control\" required=\"\">\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"Data_API_KEY\" class=\"form-label fw-semibold fs-5\">Data API Key: </label>\n                                    <small class=\"text-muted d-block\">🔒 Will be encrypted</small>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <input type=\"password\" id=\"Data_API_KEY\" name=\"Data_API_KEY\" class=\"form-control\" required=\"\">\n                                </div>\n                            </div>\n                        </div>\n\n                        <div class=\"row\">\n                            <div class=\"col-5\">\n                                <div class=\"mb-3 text-left\">\n                                    <label for=\"push_API_KEY\" class=\"form-label fw-semibold fs-5\">Campaign/Push API\n                                        Key: </label>\n                                    <small class=\"text-muted d-block\">🔒 Will be encrypted</small>\n                                </div>\n                            </div>\n                            <div class=\"col-7\">\n                                <div class=\"mb-3 text-center\">\n                                    <input type=\"password\" id=\"push_API_KEY\" name=\"push_API_KEY\" class=\"form-control\">\n                                </div>\n                            </div>\n                        </div>\n\n                        <input type=\"hidden\" name=\"message\" value=\"%%=v(@message)=%%\">\n                        <input type=\"hidden\" name=\"submitted\" value=\"true\">\n\n                        <div class=\"row\">\n                            <div class=\"col-12 text-center\">\n                                <input class=\"btn btn-primary p-2 w-50 mt-5\" style=\"background-color:#00237c\" type=\"submit\" value=\"Submit & Encrypt\">\n                            </div>\n                        </div>\n                    </form>\n\n                    <p id=\"message\" style=\"color:green;font-size:20px; font-weight:900;text-align:center\">\n                        %%=v(@message)=%%\n                    </p>\n\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <!-- Page 2: MoEngage Data Tracking Authentication -->\n    <div id=\"page2\" %%[ IF @showPage2 == \"True\" THEN ]%% style=\"display: block;\" %%[ ENDIF ]%%>\n        <div class=\"container mt-5\">\n            <div class=\"form-container\">\n                <h3 class=\"text-center text-white p-3 mb-4\" style=\"background-color: #00237c;\">MoEngage Data Tracking\n                    Authentication</h3>\n\n                <form id=\"authForm\" method=\"POST\" action=\"\">\n                    <div class=\"mb-4 form-check form-switch mx-4\">\n                        <input class=\"form-check-input mx-2\" type=\"checkbox\" id=\"operation\" name=\"operation\" value=\"update\">\n                        <label class=\"form-check-label mx-2\" for=\"operation\">Update Existing Record</label>\n                    </div>\n\n                    <div class=\"mb-4 form-group mx-4 row\">\n                        <label for=\"username\" class=\"form-label fs-6 col-sm-2\">Username</label>\n                        <select id=\"usernameDropdown\" name=\"usernameDropdown\" class=\"form-select col-sm-10\"\n                            style=\"display: none;\">\n                            <option class=\"dropdown-header\" selected disabled>Select the Existing Username</option>\n                            %%[\n                            SET @rows = LookupRows(\"MoEngage Tracking Credential\", \"Active\", \"True\")\n                            FOR @i = 1 TO RowCount(@rows) DO\n                            SET @row = Row(@rows, @i)\n                            SET @username = Field(@row, \"UserName\")\n                            ]%%\n                            <option value=\"%%=v(@username)=%%\">%%=v(@username)=%%</option>\n                            %%[NEXT @i]%%\n                        </select>\n                        <input type=\"text\" id=\"usernameTextbox\" name=\"usernameTextbox\" class=\"form-control col-sm-10\"\n                            placeholder=\"Enter username\" minlength=\"8\" required>\n                    </div>\n\n                    <div class=\"mb-4 form-group mx-4 row\">\n                        <label for=\"password\" class=\"form-label fs-6 col-sm-2\">Password</label>\n                        <input type=\"password\" id=\"password\" name=\"password\" class=\"form-control col-sm-10\"\n                            placeholder=\"Enter password\" minlength=\"8\" required>\n                    </div>\n\n                    <input type=\"hidden\" name=\"message2\" value=\"%%=v(@message2)=%%\">\n                    <input type=\"hidden\" name=\"submitted2\" value=\"true\">\n                    <input type=\"hidden\" name=\"showPage2\" value=\"true\">\n\n                    <div class=\"text-start mx-4\">\n                        <button type=\"submit\" class=\"btn btn-primary w-auto\"\n                            style=\"background-color:#00237c\">Submit</button>\n                    </div>\n                </form>\n\n                <p id=\"message2\" class=\"mt-4 text-center\" style=\"color:green;font-size:20px; font-weight:900;\">\n                    %%=v(@message2)=%%\n                </p>\n\n                <!-- Back button to return to Page 1 -->\n                <div class=\"text-center mt-3\">\n                    <button id=\"backToPage1\" class=\"btn btn-secondary\" style=\"background-color:#6c757d\">Back to Workspace Authentication</button>\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <!-- JavaScript for page transitions and functionality -->\n    <script>\n        $(document).ready(function () {\n            // Page 1 JavaScript functionality\n            // Hide the message after 5 seconds if it's present\n            if ($('#message').text().trim() !== '') {\n                setTimeout(function () {\n                    $('#message').fadeOut();\n                }, 5000);\n            }\n\n            // Add visual feedback for encrypted fields\n            $('input[type=\"password\"], #workspaceID').on('input', function() {\n                if ($(this).val().length > 0) {\n                    $(this).addClass('border-warning');\n                } else {\n                    $(this).removeClass('border-warning');\n                }\n            });\n\n            // Page 2 JavaScript functionality\n            const operationCheckbox = $('#operation');\n            const usernameTextbox = $('#usernameTextbox');\n            const usernameDropdown = $('#usernameDropdown');\n\n            // Toggle username input based on checkbox state\n            operationCheckbox.on('change', function () {\n                if (this.checked) {\n                    usernameTextbox.hide();\n                    $(\"#usernameTextbox\").removeAttr('required', '');\n                    usernameDropdown.show();\n                } else {\n                    usernameTextbox.show();\n                    $(\"#usernameTextbox\").attr(\"required\",\"required\");\n                    usernameDropdown.hide();\n                }\n            });\n\n            // Hide message2 after 5 seconds\n            if ($('#message2').text().trim() !== '') {\n                setTimeout(function () {\n                    $('#message2').fadeOut();\n                }, 5000);\n            }\n\n            // Back to Page 1 functionality\n            $('#backToPage1').on('click', function() {\n                $('#page2').hide();\n                $('#page1').show();\n            });\n\n            // Check if we should show page 2 initially\n            %%[ IF @showPage2 == \"True\" THEN ]%%\n                $('#page1').hide();\n                $('#page2').show();\n            %%[ ENDIF ]%%\n        });\n    </script>\n</body>\n</html>","design":"<div class=\"default-design\"><div style=\"width:100%;height:150px;background: url(data:image/png;base64,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) repeat-x 0 0\"></div></div>","meta":{},"modelVersion":2}},"modelVersion":2}},"modelVersion":2}},"availableViews":["html"]},"content":{"channelTypeId":3,"contentType":"text/html","isDefault":true,"isStaticContent":false,"name":"MoEngage Workspace and Data Tracking Credentials Authentication"},"definition":{"categoryId":"{{mcpm#/entities/cloudPageCollections/60360/data/id}}","description":"","domain":"{{mcpm:cloudPages-domain}}","isNoFollow":false,"isNoIndex":false,"key":"sazjwqdveph","name":"MoEngage Workspace and Data Tracking Credentials Authentication","pageTypeId":3,"requiresSsl":true,"url":"https://mc2nbfybf05jg5cw0p468sv5yf74.pub.sfmc-content.com/sazjwqdveph"},"name":"MoEngage Workspace and Data Tracking Credentials Authentication","state":{"contentType":"text/html","description":"","name":"MoEngage Workspace and Data Tracking Credentials Authentication"}}}},"queryActivities":{"22f9d9de-0772-432b-97ff-992b6349ab9f":{"issues":[],"originID":"22f9d9de-0772-432b-97ff-992b6349ab9f","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"name":"Simplify MoEngage Streams JSON","categoryId":"{{mcpm#/entities/categories/36346/data/id}}","description":"","isFrozen":false,"key":"22F9D9DE-0772-432B-97FF-992B6349AB9F","queryText":"SELECT app_name, source, moe_request_id, \nJSON_VALUE(events, '$.event_name') AS event_name, \nJSON_VALUE(events, '$.event_code') AS event_code,\nJSON_VALUE(events, '$.event_uuid') AS event_uuid,\nJSON_VALUE(events, '$.event_time') AS event_time,\nJSON_VALUE(events, '$.event_type') AS event_type,\nJSON_VALUE(events, '$.event_source') AS event_source,\nJSON_VALUE(events, '$.mobile_number') AS mobile_number,\nJSON_VALUE(events, '$.uid') AS uid, \nJSON_QUERY(events, '$.event_attributes') AS event_attributes, \nJSON_QUERY(events, '$.user_attributes') AS user_attributes, \nJSON_QUERY(events, '$.device_attributes') AS device_attributes\nFROM {{mcpm#/entities/dataExtensions/a0bdc401-fe91-f011-a5dc-5cba2c191b88/data/namePrefix}}[{{mcpm#/entities/dataExtensions/a0bdc401-fe91-f011-a5dc-5cba2c191b88/data/name}}]\nWHERE IsParsed='False'","targetId":"{{mcpm#/entities/dataExtensions/9fbdc401-fe91-f011-a5dc-5cba2c191b88/data/id}}","targetUpdateTypeId":2,"targetUpdateTypeName":"Append"}},"53898a0b-0e11-4273-9484-66500e37a425":{"issues":[],"originID":"53898a0b-0e11-4273-9484-66500e37a425","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"name":"Populating the event_uuid field","categoryId":"{{mcpm#/entities/categories/36346/data/id}}","description":"","isFrozen":false,"key":"53898A0B-0E11-4273-9484-66500E37A425","queryText":"SELECT JSON_VALUE(events, '$.event_uuid') AS event_uuid, \nTimestamp, moe_request_id, source, events, app_name\nFROM {{mcpm#/entities/dataExtensions/a0bdc401-fe91-f011-a5dc-5cba2c191b88/data/namePrefix}}[{{mcpm#/entities/dataExtensions/a0bdc401-fe91-f011-a5dc-5cba2c191b88/data/name}}]\nWHERE IsParsed='False'","targetId":"{{mcpm#/entities/dataExtensions/a0bdc401-fe91-f011-a5dc-5cba2c191b88/data/id}}","targetUpdateTypeId":1,"targetUpdateTypeName":"Update"}},"46bcdab4-f685-4cbf-aa3e-3f33c82d7e06":{"issues":[],"originID":"46bcdab4-f685-4cbf-aa3e-3f33c82d7e06","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"name":"MoEngage Flag Old Streams data to True","categoryId":"{{mcpm#/entities/categories/36346/data/id}}","description":"","isFrozen":false,"key":"46BCDAB4-F685-4CBF-AA3E-3F33C82D7E06","queryText":"SELECT p.app_name, p.source, p.events, p.event_uuid, p.moe_request_id, p.Timestamp, \r\n'True' AS IsParsed\r\nFROM {{mcpm#/entities/dataExtensions/a0bdc401-fe91-f011-a5dc-5cba2c191b88/data/namePrefix}}[{{mcpm#/entities/dataExtensions/a0bdc401-fe91-f011-a5dc-5cba2c191b88/data/name}}] AS p\r\nINNER JOIN {{mcpm#/entities/dataExtensions/9fbdc401-fe91-f011-a5dc-5cba2c191b88/data/namePrefix}}[{{mcpm#/entities/dataExtensions/9fbdc401-fe91-f011-a5dc-5cba2c191b88/data/name}}] AS c ON c.event_uuid = p.event_uuid","targetId":"{{mcpm#/entities/dataExtensions/a0bdc401-fe91-f011-a5dc-5cba2c191b88/data/id}}","targetUpdateTypeId":1,"targetUpdateTypeName":"Update"}}},"registeredCustomActivities":{"c1246b39-72f9-4236-83cc-7d01610f0ea6":{"issues":[],"originID":"c1246b39-72f9-4236-83cc-7d01610f0ea6","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"applicationId":"c42429c4-8ef4-44dc-bea3-ffd73fd6d5c3","category":"Messaging","createdBy":747437567,"createdDate":"2025-07-10T06:14:00.000Z","description":"MoEngage Event Custom Activity","endpointUrl":"https://moengagesalesforce-event-9e52164e2c1e.herokuapp.com/","extensionTypeId":"1400c9f8-8ae1-407b-8101-faa84ce41bfe","helpUrl":"","helpText":"","id":"c1246b39-72f9-4236-83cc-7d01610f0ea6","isPublic":true,"key":"2b37a6fe-3d53-42b2-90a0-e583eb205e5e","modifiedBy":747437567,"modifiedDate":"2025-10-30T17:57:22.000Z","name":"MoEngage Event","parentId":"3aed9cab-f185-42da-8c80-705462d478b4","version":""}},"031ffd20-ba25-4f6e-bb8f-763379441019":{"issues":[],"originID":"031ffd20-ba25-4f6e-bb8f-763379441019","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"applicationId":"c42429c4-8ef4-44dc-bea3-ffd73fd6d5c3","category":"Messaging","createdBy":747437567,"createdDate":"2025-07-10T06:12:00.000Z","description":"MoEngage Push Custom Activity","endpointUrl":"https://moengagesalesforce-push-7b3d058c7a8f.herokuapp.com/","extensionTypeId":"1400c9f8-8ae1-407b-8101-faa84ce41bfe","helpUrl":"","helpText":"","id":"031ffd20-ba25-4f6e-bb8f-763379441019","isPublic":true,"key":"d3bdcfb1-8514-47c3-b2c6-687e9f7db857","modifiedBy":747437567,"modifiedDate":"2025-07-10T06:12:21.000Z","name":"MoEngage Push","parentId":"7fa365a9-e8e9-4650-b06c-1979747a7a58","version":""}}},"scriptActivities":{"0e3eadae-8e94-4b1d-9e82-1e78616b7fb2":{"issues":[],"originID":"0e3eadae-8e94-4b1d-9e82-1e78616b7fb2","originEID":"mc2nbfybf05jg5cw0p468sv5yf74","data":{"categoryId":"{{mcpm#/entities/categories/36348/data/id}}","description":"","key":"696f45c9-a11a-45b5-ac25-ef2227e6cd0a","name":"MoEngage User Sync Script V2","script":"<script runat=\"server\">\n    Platform.Load(\"Core\", \"1.1.1\");\n\n    // Encryption key - This should match the key used in the form (store securely in production)\n    var encryptionKey = \"YourSecureEncryptionKey123!@#$%^&*\";\n\n    // Function to decrypt data using the same XOR method used in the form\n    function decryptData(encryptedText, key) {\n        try {\n            if (!encryptedText || encryptedText === '') {\n                return '';\n            }\n            \n            // Decode from Base64 first\n            var decoded = Base64Decode(encryptedText);\n            var decrypted = \"\";\n            var keyLength = key.length;\n            \n            for (var i = 0; i < decoded.length; i++) {\n                var charCode = decoded.charCodeAt(i) ^ key.charCodeAt(i % keyLength);\n                decrypted += String.fromCharCode(charCode);\n            }\n            \n            return decrypted;\n        } catch (e) {\n            // Log decryption error\n            var timestamp = Now();\n            Platform.Function.InsertData(\"{{mcpm#/entities/dataExtensions/51195004-bc92-ef11-a5d1-5cba2c191058/data/name}}\", [\"Timestamp\", \"Message\", \"Type\", \"Description\"], [timestamp, \"Decryption Error\", \"Error\", \"Error decrypting data: \" + Stringify(e)]);\n            return encryptedText; // Return as-is if decryption fails\n        }\n    }\n\n    try {\n        var userDEName = \"Sync Users to MoEngage\";\n        var credsDEName = \"MoEngage Credentials\";\n\n        // Initialize Data Extensions\n        var userDE = DataExtension.Init(userDEName);\n        var credsDE = DataExtension.Init(credsDEName);\n\n        // Retrieve only active workspace credentials records\n        var activeCredsFilter = {\n            Property: \"Active\",\n            SimpleOperator: \"equals\",\n            Value: \"True\"\n        };\n\n        var credentials = [];\n        try {\n            credentials = credsDE.Rows.Retrieve(activeCredsFilter);\n        } catch (credError) {\n            var timestamp = Now();\n            Platform.Function.InsertData(\"{{mcpm#/entities/dataExtensions/51195004-bc92-ef11-a5d1-5cba2c191058/data/name}}\", [\"Timestamp\", \"Message\", \"Type\", \"Description\"], [timestamp, \"Credentials Retrieval Failed\", \"Error\", \"Error retrieving credentials: \" + Stringify(credError)]);\n            return;\n        }\n\n        // Check if any active credentials are found\n        if (credentials.length === 0) {\n            var timestamp = Now();\n            Platform.Function.InsertData(\"{{mcpm#/entities/dataExtensions/51195004-bc92-ef11-a5d1-5cba2c191058/data/name}}\", [\"Timestamp\", \"Message\", \"Type\", \"Description\"], [timestamp, \"No Active Credentials Found\", \"Warning\", \"No active MoEngage credentials found. Skipping sync process.\"]);\n            return;\n        }\n\n        // Process each set of credentials\n        for (var c = 0; c < credentials.length; c++) {\n            try {\n                var cred = credentials[c];\n                var workspaceName = cred[\"WorkspaceName\"];\n                var dataCenter = cred[\"DataCenter\"];\n                \n                // Decrypt sensitive fields\n                var workspaceId = decryptData(cred[\"WorkspaceID\"], encryptionKey);\n                var dataApiKey = decryptData(cred[\"DataKey\"], encryptionKey);\n                var pushApiKey = decryptData(cred[\"PushKey\"], encryptionKey);\n\n                var timestamp = Now();\n                Platform.Function.InsertData(\"{{mcpm#/entities/dataExtensions/51195004-bc92-ef11-a5d1-5cba2c191058/data/name}}\", [\"Timestamp\", \"Message\", \"Type\", \"Description\"], [timestamp, \"Sync Started\", \"Initiated\", \"Processing workspace: \" + workspaceName]);\n\n                // Get users to sync using Rows.Lookup instead of WSProxy\n                var userFilter = {\n                    LeftOperand: {\n                        Property: \"MoEngage Workspace Name\",\n                        SimpleOperator: \"equals\",\n                        Value: workspaceName\n                    },\n                    LogicalOperator: \"AND\",\n                    RightOperand: {\n                        Property: \"Synced\",\n                        SimpleOperator: \"equals\",\n                        Value: \"False\"\n                    }\n                };\n\n                var usersToSync = [];\n                try {\n                    usersToSync = userDE.Rows.Retrieve(userFilter);\n                } catch (userRetrieveError) {\n                    var timestamp = Now();\n                    Platform.Function.InsertData(\"{{mcpm#/entities/dataExtensions/51195004-bc92-ef11-a5d1-5cba2c191058/data/name}}\", [\"Timestamp\", \"Message\", \"Type\", \"Description\"], [timestamp, \"User Retrieval Failed\", \"Error\", \"Error retrieving users for \" + workspaceName + \": \" + Stringify(userRetrieveError)]);\n                    continue;\n                }\n\n                if (usersToSync.length === 0) {\n                    var timestamp = Now();\n                    Platform.Function.InsertData(\"{{mcpm#/entities/dataExtensions/51195004-bc92-ef11-a5d1-5cba2c191058/data/name}}\", [\"Timestamp\", \"Message\", \"Type\", \"Description\"], [timestamp, \"No Users to Sync\", \"Info\", \"No users found with Synced = False for workspace: \" + workspaceName]);\n                    continue;\n                }\n\n                // Process users in batches\n                var batchSize = 200;\n                var totalUsers = usersToSync.length;\n                \n                for (var batch = 0; batch < Math.ceil(totalUsers / batchSize); batch++) {\n                    var startIndex = batch * batchSize;\n                    var endIndex = Math.min(startIndex + batchSize, totalUsers);\n                    var currentBatch = usersToSync.slice(startIndex, endIndex);\n\n                    var elements = [];\n                    var customerIds = [];\n\n                    // Process each user in the current batch\n                    for (var i = 0; i < currentBatch.length; i++) {\n                        var user = currentBatch[i];\n                        var customer_id = user[\"customer_id\"];\n                        var attributes = {\"source\": \"SFMC\"};\n                        var platforms = [];\n\n                        // Add all user properties to attributes\n                        for (var prop in user) {\n                            if (user.hasOwnProperty(prop)) {\n                                var propValue = user[prop];\n                                \n                                // Handle platform flags\n                                if (prop === \"ANDROID\" && propValue === \"True\") {\n                                    platforms.push({\"platform\": \"ANDROID\", \"active\": \"true\"});\n                                } else if (prop === \"IOS\" && propValue === \"True\") {\n                                    platforms.push({\"platform\": \"IOS\", \"active\": \"true\"});\n                                } else if (prop === \"WEB\" && propValue === \"True\") {\n                                    platforms.push({\"platform\": \"WEB\", \"active\": \"true\"});\n                                }\n                                \n                                attributes[prop] = propValue;\n                            }\n                        }\n\n                        attributes[\"platforms\"] = platforms;\n\n                        elements.push({\n                            \"type\": \"customer\",\n                            \"customer_id\": customer_id,\n                            \"attributes\": attributes\n                        });\n\n                        customerIds.push(customer_id);\n                    }\n\n                    // Create payload\n                    var finalPayload = {\n                        \"type\": \"transition\",\n                        \"elements\": elements\n                    };\n\n                    var strFinalPayload = Stringify(finalPayload);\n\n                    // Make API call\n                    try {\n                        var url = \"https://api-\" + dataCenter + \".moengage.com/v1/transition/\" + workspaceId;\n                        var contentType = \"application/json\";\n                        var decoded = workspaceId + \":\" + dataApiKey;\n                        var encoded = Base64Encode(decoded);\n                        var headerNames = [\"Authorization\"];\n                        var headerValues = [\"Basic \" + encoded];\n                        \n                        var response = HTTP.Post(url, contentType, strFinalPayload, headerNames, headerValues);\n                        var statusCode = response.StatusCode;\n\n                        if (statusCode == 200) {\n                            // Update users as synced\n                            for (var u = 0; u < customerIds.length; u++) {\n                                try {\n                                    userDE.Rows.Update({\"Synced\": \"True\"}, [\"customer_id\"], [customerIds[u]]);\n                                } catch (updateError) {\n                                    // Log individual update errors but continue\n                                    var timestamp = Now();\n                                    Platform.Function.InsertData(\"{{mcpm#/entities/dataExtensions/51195004-bc92-ef11-a5d1-5cba2c191058/data/name}}\", [\"Timestamp\", \"Message\", \"Type\", \"Description\"], [timestamp, \"Update Failed\", \"Warning\", \"Failed to update user \" + customerIds[u] + \": \" + Stringify(updateError)]);\n                                }\n                            }\n\n                            var timestamp = Now();\n                            Platform.Function.InsertData(\"{{mcpm#/entities/dataExtensions/51195004-bc92-ef11-a5d1-5cba2c191058/data/name}}\", [\"Timestamp\", \"Message\", \"Type\", \"Description\"], [timestamp, \"Batch Sync Success\", \"Success\", \"Successfully synced batch \" + (batch + 1) + \" for \" + workspaceName + \" (\" + elements.length + \" users)\"]);\n                        } else {\n                            var timestamp = Now();\n                            Platform.Function.InsertData(\"{{mcpm#/entities/dataExtensions/51195004-bc92-ef11-a5d1-5cba2c191058/data/name}}\", [\"Timestamp\", \"Message\", \"Type\", \"Description\"], [timestamp, \"API Call Failed\", \"Error\", \"MoEngage API failed for \" + workspaceName + \" with status: \" + statusCode + \". Response: \" + (response.Response ? response.Response[0] : 'No response')]);\n                        }\n                        \n                    } catch (apiError) {\n                        var timestamp = Now();\n                        Platform.Function.InsertData(\"{{mcpm#/entities/dataExtensions/51195004-bc92-ef11-a5d1-5cba2c191058/data/name}}\", [\"Timestamp\", \"Message\", \"Type\", \"Description\"], [timestamp, \"API Request Failed\", \"Error\", \"API request failed for \" + workspaceName + \": \" + Stringify(apiError)]);\n                    }\n                }\n\n            } catch (workspaceError) {\n                var timestamp = Now();\n                Platform.Function.InsertData(\"{{mcpm#/entities/dataExtensions/51195004-bc92-ef11-a5d1-5cba2c191058/data/name}}\", [\"Timestamp\", \"Message\", \"Type\", \"Description\"], [timestamp, \"Workspace Processing Failed\", \"Error\", \"Error processing workspace \" + (workspaceName || \"unknown\") + \": \" + Stringify(workspaceError)]);\n                continue;\n            }\n        }\n\n    } catch (mainError) {\n        var timestamp = Now();\n        Platform.Function.InsertData(\"{{mcpm#/entities/dataExtensions/51195004-bc92-ef11-a5d1-5cba2c191058/data/name}}\", [\"Timestamp\", \"Message\", \"Type\", \"Description\"], [timestamp, \"Automation Failed\", \"Error\", \"Main automation error: \" + Stringify(mainError)]);\n    }\n</script>"}}},"sendDefinitions":{},"sharedDataExtensions":{},"siteMapVersions":{},"subscriberLists":{},"triggeredSendDefinitions":{},"verificationActivities":{}},"selectedEntities":{"assets":[],"attributeGroups":[],"automations":["f6b1914c-7338-455c-b619-93d98d5abb20","9a922a01-5f0c-4e08-9e4c-69ef6760af98"],"cloudPageCollections":["60360","60361"],"dataExtensions":["31e6a7ca-267f-ef11-a5d1-5cba2c191058","9fbdc401-fe91-f011-a5dc-5cba2c191b88","a0bdc401-fe91-f011-a5dc-5cba2c191b88","92e1d659-a98c-f011-a5dc-5cba2c191b88","96e1d659-a98c-f011-a5dc-5cba2c191b88","94e1d659-a98c-f011-a5dc-5cba2c191b88","97e1d659-a98c-f011-a5dc-5cba2c191b88","95e1d659-a98c-f011-a5dc-5cba2c191b88","51195004-bc92-ef11-a5d1-5cba2c191058","98e1d659-a98c-f011-a5dc-5cba2c191b88"],"journeys":["78d45fa2-b82b-43f5-a83e-8a414a979136","4b36601c-7d19-407e-b13a-164a6aa0a0aa"],"journeyTemplates":[],"sendDefinitions":[],"sharedDataExtensions":[],"triggeredSendDefinitions":[]}}