@transcend-io/cli 10.24.0 → 10.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/README.md +4 -10
  2. package/dist/{app-1gLg-ah3.mjs → app-Be_bWVbs.mjs} +18 -18
  3. package/dist/{app-1gLg-ah3.mjs.map → app-Be_bWVbs.mjs.map} +1 -1
  4. package/dist/{approvePrivacyRequests-qaoxGH11.mjs → approvePrivacyRequests-DZ8xgodd.mjs} +2 -2
  5. package/dist/{approvePrivacyRequests-qaoxGH11.mjs.map → approvePrivacyRequests-DZ8xgodd.mjs.map} +1 -1
  6. package/dist/bin/bash-complete.mjs +1 -1
  7. package/dist/bin/cli.mjs +1 -1
  8. package/dist/bin/deprecated-command.mjs +1 -1
  9. package/dist/{buildExamples-CDlFYuEg.mjs → buildExamples-D_wEzFqc.mjs} +2 -2
  10. package/dist/{buildExamples-CDlFYuEg.mjs.map → buildExamples-D_wEzFqc.mjs.map} +1 -1
  11. package/dist/{buildXdiSyncEndpoint-Bmr-hWLk.mjs → buildXdiSyncEndpoint-CRFU2TZ3.mjs} +2 -2
  12. package/dist/{buildXdiSyncEndpoint-Bmr-hWLk.mjs.map → buildXdiSyncEndpoint-CRFU2TZ3.mjs.map} +1 -1
  13. package/dist/{bulkRestartRequests-n2_EwVEM.mjs → bulkRestartRequests-BghEtYm9.mjs} +2 -2
  14. package/dist/{bulkRestartRequests-n2_EwVEM.mjs.map → bulkRestartRequests-BghEtYm9.mjs.map} +1 -1
  15. package/dist/{bulkRetryEnrichers-DDftLRtp.mjs → bulkRetryEnrichers-COIzxVFx.mjs} +2 -2
  16. package/dist/{bulkRetryEnrichers-DDftLRtp.mjs.map → bulkRetryEnrichers-COIzxVFx.mjs.map} +1 -1
  17. package/dist/{cancelPrivacyRequests-CunKdVs6.mjs → cancelPrivacyRequests-BBo40MAY.mjs} +2 -2
  18. package/dist/{cancelPrivacyRequests-CunKdVs6.mjs.map → cancelPrivacyRequests-BBo40MAY.mjs.map} +1 -1
  19. package/dist/codecs-DRBjmo_R.mjs +2 -0
  20. package/dist/codecs-DRBjmo_R.mjs.map +1 -0
  21. package/dist/{command-DO9AWMvB.mjs → command-_10zKpx_.mjs} +2 -2
  22. package/dist/{command-DO9AWMvB.mjs.map → command-_10zKpx_.mjs.map} +1 -1
  23. package/dist/constants-DpXqmVej.mjs +2 -0
  24. package/dist/constants-DpXqmVej.mjs.map +1 -0
  25. package/dist/{createExtraKeyHandler-DTbSbhrp.mjs → createExtraKeyHandler-B92yu9gf.mjs} +2 -2
  26. package/dist/{createExtraKeyHandler-DTbSbhrp.mjs.map → createExtraKeyHandler-B92yu9gf.mjs.map} +1 -1
  27. package/dist/{downloadPrivacyRequestFiles-AArYL4OL.mjs → downloadPrivacyRequestFiles-HasUwQ3g.mjs} +2 -2
  28. package/dist/{downloadPrivacyRequestFiles-AArYL4OL.mjs.map → downloadPrivacyRequestFiles-HasUwQ3g.mjs.map} +1 -1
  29. package/dist/enums-OiLcZ26O.mjs +2 -0
  30. package/dist/enums-OiLcZ26O.mjs.map +1 -0
  31. package/dist/{generateCrossAccountApiKeys-DfGJ8Svq.mjs → generateCrossAccountApiKeys-CTftMHkZ.mjs} +2 -2
  32. package/dist/{generateCrossAccountApiKeys-DfGJ8Svq.mjs.map → generateCrossAccountApiKeys-CTftMHkZ.mjs.map} +1 -1
  33. package/dist/{impl-Y2Gge5Bd.mjs → impl-68qRHtkN.mjs} +2 -2
  34. package/dist/{impl-Y2Gge5Bd.mjs.map → impl-68qRHtkN.mjs.map} +1 -1
  35. package/dist/{impl-T66dFrc42.mjs → impl-B1kMfs5H2.mjs} +2 -2
  36. package/dist/{impl-T66dFrc42.mjs.map → impl-B1kMfs5H2.mjs.map} +1 -1
  37. package/dist/{impl-4oiDSr3J2.mjs → impl-B2MSm0v92.mjs} +2 -2
  38. package/dist/{impl-4oiDSr3J2.mjs.map → impl-B2MSm0v92.mjs.map} +1 -1
  39. package/dist/{impl-C6eLQ_5o2.mjs → impl-BBtEcG982.mjs} +2 -2
  40. package/dist/{impl-C6eLQ_5o2.mjs.map → impl-BBtEcG982.mjs.map} +1 -1
  41. package/dist/{impl-Cqruzptc.mjs → impl-BHjJOlaA.mjs} +2 -2
  42. package/dist/{impl-Cqruzptc.mjs.map → impl-BHjJOlaA.mjs.map} +1 -1
  43. package/dist/{impl-N_erRf2y.mjs → impl-BUCzxz5Q.mjs} +2 -2
  44. package/dist/{impl-N_erRf2y.mjs.map → impl-BUCzxz5Q.mjs.map} +1 -1
  45. package/dist/{impl-CymJoQ9l.mjs → impl-BW-bQqpr.mjs} +2 -2
  46. package/dist/{impl-CymJoQ9l.mjs.map → impl-BW-bQqpr.mjs.map} +1 -1
  47. package/dist/{impl-DgkExXp2.mjs → impl-BX76WSDL.mjs} +2 -2
  48. package/dist/{impl-DgkExXp2.mjs.map → impl-BX76WSDL.mjs.map} +1 -1
  49. package/dist/{impl-DjgE9MBH2.mjs → impl-Bowpnu3L2.mjs} +2 -2
  50. package/dist/{impl-DjgE9MBH2.mjs.map → impl-Bowpnu3L2.mjs.map} +1 -1
  51. package/dist/{impl-SESkv0Uk.mjs → impl-BpGo1xvV.mjs} +2 -2
  52. package/dist/{impl-SESkv0Uk.mjs.map → impl-BpGo1xvV.mjs.map} +1 -1
  53. package/dist/{impl-DtJCihfL2.mjs → impl-C-ALqsq_2.mjs} +2 -2
  54. package/dist/{impl-DtJCihfL2.mjs.map → impl-C-ALqsq_2.mjs.map} +1 -1
  55. package/dist/{impl-BZ4pxOP_.mjs → impl-C3m876YF.mjs} +2 -2
  56. package/dist/{impl-BZ4pxOP_.mjs.map → impl-C3m876YF.mjs.map} +1 -1
  57. package/dist/{impl-8gLOHK9a.mjs → impl-CDpRNfVC.mjs} +2 -2
  58. package/dist/{impl-8gLOHK9a.mjs.map → impl-CDpRNfVC.mjs.map} +1 -1
  59. package/dist/{impl-nikMH0CU2.mjs → impl-CNgcbGao2.mjs} +2 -2
  60. package/dist/{impl-nikMH0CU2.mjs.map → impl-CNgcbGao2.mjs.map} +1 -1
  61. package/dist/{impl-y9YssNt_.mjs → impl-CR8CFkpN.mjs} +2 -2
  62. package/dist/{impl-y9YssNt_.mjs.map → impl-CR8CFkpN.mjs.map} +1 -1
  63. package/dist/{impl-Bu7iHn-Z.mjs → impl-CXFrrZrn.mjs} +2 -2
  64. package/dist/{impl-Bu7iHn-Z.mjs.map → impl-CXFrrZrn.mjs.map} +1 -1
  65. package/dist/{impl-C7-Z-9EZ.mjs → impl-CcQHrRfV.mjs} +2 -2
  66. package/dist/{impl-C7-Z-9EZ.mjs.map → impl-CcQHrRfV.mjs.map} +1 -1
  67. package/dist/{impl-D53J7hI_.mjs → impl-ChsUi8qf.mjs} +2 -2
  68. package/dist/{impl-D53J7hI_.mjs.map → impl-ChsUi8qf.mjs.map} +1 -1
  69. package/dist/{impl-CtbuXbCF.mjs → impl-CiaTPxwK.mjs} +2 -2
  70. package/dist/{impl-CtbuXbCF.mjs.map → impl-CiaTPxwK.mjs.map} +1 -1
  71. package/dist/{impl-CIJjwRW4.mjs → impl-CmEcR0Zw.mjs} +2 -2
  72. package/dist/{impl-CIJjwRW4.mjs.map → impl-CmEcR0Zw.mjs.map} +1 -1
  73. package/dist/{impl-GnoT1LmK2.mjs → impl-CsZgh1DF2.mjs} +2 -2
  74. package/dist/{impl-GnoT1LmK2.mjs.map → impl-CsZgh1DF2.mjs.map} +1 -1
  75. package/dist/{impl-BZ-EmLtv.mjs → impl-CvWGYCmA.mjs} +2 -2
  76. package/dist/{impl-BZ-EmLtv.mjs.map → impl-CvWGYCmA.mjs.map} +1 -1
  77. package/dist/{impl-D9VysVCe.mjs → impl-D3qD4wsS.mjs} +2 -2
  78. package/dist/{impl-D9VysVCe.mjs.map → impl-D3qD4wsS.mjs.map} +1 -1
  79. package/dist/{impl-qSB65eS52.mjs → impl-D9mgSBq12.mjs} +2 -2
  80. package/dist/{impl-qSB65eS52.mjs.map → impl-D9mgSBq12.mjs.map} +1 -1
  81. package/dist/{impl-E2edQft02.mjs → impl-DH4QGrpo2.mjs} +2 -2
  82. package/dist/{impl-E2edQft02.mjs.map → impl-DH4QGrpo2.mjs.map} +1 -1
  83. package/dist/{impl-B6kpEx0X.mjs → impl-DKwLt-1y.mjs} +2 -2
  84. package/dist/{impl-B6kpEx0X.mjs.map → impl-DKwLt-1y.mjs.map} +1 -1
  85. package/dist/{impl-BVh3JHAk2.mjs → impl-DPURgXIE2.mjs} +2 -2
  86. package/dist/{impl-BVh3JHAk2.mjs.map → impl-DPURgXIE2.mjs.map} +1 -1
  87. package/dist/{impl-C3-twUUE2.mjs → impl-DYObnoPT2.mjs} +2 -2
  88. package/dist/{impl-C3-twUUE2.mjs.map → impl-DYObnoPT2.mjs.map} +1 -1
  89. package/dist/{impl-C8azdMaD.mjs → impl-DdjTOXMv.mjs} +2 -2
  90. package/dist/{impl-C8azdMaD.mjs.map → impl-DdjTOXMv.mjs.map} +1 -1
  91. package/dist/{impl-BYtnm2cU2.mjs → impl-DdrG94XW2.mjs} +2 -2
  92. package/dist/{impl-BYtnm2cU2.mjs.map → impl-DdrG94XW2.mjs.map} +1 -1
  93. package/dist/{impl-DUHcGmOB.mjs → impl-Dp8o3Xpr.mjs} +2 -2
  94. package/dist/{impl-DUHcGmOB.mjs.map → impl-Dp8o3Xpr.mjs.map} +1 -1
  95. package/dist/{impl-Dniv3dkB2.mjs → impl-DuJq7y6R2.mjs} +2 -2
  96. package/dist/{impl-Dniv3dkB2.mjs.map → impl-DuJq7y6R2.mjs.map} +1 -1
  97. package/dist/{impl-U_CtHEj5.mjs → impl-Dy6N4m4z.mjs} +2 -2
  98. package/dist/{impl-U_CtHEj5.mjs.map → impl-Dy6N4m4z.mjs.map} +1 -1
  99. package/dist/{impl-gfNcn8cd.mjs → impl-DyBnYMC0.mjs} +2 -2
  100. package/dist/{impl-gfNcn8cd.mjs.map → impl-DyBnYMC0.mjs.map} +1 -1
  101. package/dist/{impl-vQQfP_hX.mjs → impl-OClvbqbu.mjs} +2 -2
  102. package/dist/{impl-vQQfP_hX.mjs.map → impl-OClvbqbu.mjs.map} +1 -1
  103. package/dist/{impl-SauDltth2.mjs → impl-X9wzJgpd2.mjs} +2 -2
  104. package/dist/{impl-SauDltth2.mjs.map → impl-X9wzJgpd2.mjs.map} +1 -1
  105. package/dist/{impl-HaxoPgWV2.mjs → impl-cvCm-R922.mjs} +2 -2
  106. package/dist/{impl-HaxoPgWV2.mjs.map → impl-cvCm-R922.mjs.map} +1 -1
  107. package/dist/{impl-dcRplDpN2.mjs → impl-h3e2wqI02.mjs} +2 -2
  108. package/dist/{impl-dcRplDpN2.mjs.map → impl-h3e2wqI02.mjs.map} +1 -1
  109. package/dist/{impl-4heSgrC92.mjs → impl-j3D9roJl2.mjs} +2 -2
  110. package/dist/{impl-4heSgrC92.mjs.map → impl-j3D9roJl2.mjs.map} +1 -1
  111. package/dist/index.d.mts +1 -66
  112. package/dist/index.d.mts.map +1 -1
  113. package/dist/index.mjs +3 -3
  114. package/dist/index.mjs.map +1 -1
  115. package/dist/{markRequestDataSiloIdsCompleted-CklEg1h9.mjs → markRequestDataSiloIdsCompleted-DJGp-2gY.mjs} +2 -2
  116. package/dist/{markRequestDataSiloIdsCompleted-CklEg1h9.mjs.map → markRequestDataSiloIdsCompleted-DJGp-2gY.mjs.map} +1 -1
  117. package/dist/{markSilentPrivacyRequests-C_Fc81_k.mjs → markSilentPrivacyRequests-CuHc3S4U.mjs} +2 -2
  118. package/dist/{markSilentPrivacyRequests-C_Fc81_k.mjs.map → markSilentPrivacyRequests-CuHc3S4U.mjs.map} +1 -1
  119. package/dist/{notifyPrivacyRequestsAdditionalTime-DEb7lcKx.mjs → notifyPrivacyRequestsAdditionalTime-BLiGkHmi.mjs} +2 -2
  120. package/dist/{notifyPrivacyRequestsAdditionalTime-DEb7lcKx.mjs.map → notifyPrivacyRequestsAdditionalTime-BLiGkHmi.mjs.map} +1 -1
  121. package/dist/parseVariablesFromString-B2TB86Fo.mjs +3 -0
  122. package/dist/parseVariablesFromString-B2TB86Fo.mjs.map +1 -0
  123. package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-DcSSx712.mjs → pullChunkedCustomSiloOutstandingIdentifiers-BUoW1oAe.mjs} +2 -2
  124. package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-DcSSx712.mjs.map → pullChunkedCustomSiloOutstandingIdentifiers-BUoW1oAe.mjs.map} +1 -1
  125. package/dist/{pullManualEnrichmentIdentifiersToCsv-CEtJleqX.mjs → pullManualEnrichmentIdentifiersToCsv-DdbzOCjx.mjs} +2 -2
  126. package/dist/{pullManualEnrichmentIdentifiersToCsv-CEtJleqX.mjs.map → pullManualEnrichmentIdentifiersToCsv-DdbzOCjx.mjs.map} +1 -1
  127. package/dist/pullTranscendConfiguration-DFQkyoIo.mjs +58 -0
  128. package/dist/pullTranscendConfiguration-DFQkyoIo.mjs.map +1 -0
  129. package/dist/{pushCronIdentifiersFromCsv-dCDnCM6Y.mjs → pushCronIdentifiersFromCsv-DIxlbAK4.mjs} +2 -2
  130. package/dist/{pushCronIdentifiersFromCsv-dCDnCM6Y.mjs.map → pushCronIdentifiersFromCsv-DIxlbAK4.mjs.map} +1 -1
  131. package/dist/{pushManualEnrichmentIdentifiersFromCsv-D6tsUf6k.mjs → pushManualEnrichmentIdentifiersFromCsv-C3eyJhg9.mjs} +2 -2
  132. package/dist/{pushManualEnrichmentIdentifiersFromCsv-D6tsUf6k.mjs.map → pushManualEnrichmentIdentifiersFromCsv-C3eyJhg9.mjs.map} +1 -1
  133. package/dist/{readTranscendYaml-CWIS9ki1.mjs → readTranscendYaml-ceJQNB1O.mjs} +2 -2
  134. package/dist/{readTranscendYaml-CWIS9ki1.mjs.map → readTranscendYaml-ceJQNB1O.mjs.map} +1 -1
  135. package/dist/{removeUnverifiedRequestIdentifiers-kGR-7H8G.mjs → removeUnverifiedRequestIdentifiers-DqAIUK-9.mjs} +2 -2
  136. package/dist/{removeUnverifiedRequestIdentifiers-kGR-7H8G.mjs.map → removeUnverifiedRequestIdentifiers-DqAIUK-9.mjs.map} +1 -1
  137. package/dist/{retryRequestDataSilos-d8gzmd-2.mjs → retryRequestDataSilos-BuvgC-ni.mjs} +2 -2
  138. package/dist/{retryRequestDataSilos-d8gzmd-2.mjs.map → retryRequestDataSilos-BuvgC-ni.mjs.map} +1 -1
  139. package/dist/{skipPreflightJobs-B7C-mjSV.mjs → skipPreflightJobs-CryW-m_h.mjs} +2 -2
  140. package/dist/{skipPreflightJobs-B7C-mjSV.mjs.map → skipPreflightJobs-CryW-m_h.mjs.map} +1 -1
  141. package/dist/{skipRequestDataSilos-B5m8luWz.mjs → skipRequestDataSilos-Ccpg2iM2.mjs} +2 -2
  142. package/dist/{skipRequestDataSilos-B5m8luWz.mjs.map → skipRequestDataSilos-Ccpg2iM2.mjs.map} +1 -1
  143. package/dist/{streamPrivacyRequestsToCsv-HwUKG1kF.mjs → streamPrivacyRequestsToCsv-BzNHbKej.mjs} +2 -2
  144. package/dist/{streamPrivacyRequestsToCsv-HwUKG1kF.mjs.map → streamPrivacyRequestsToCsv-BzNHbKej.mjs.map} +1 -1
  145. package/dist/{updateConsentManagerVersionToLatest-B9RIn1o-.mjs → updateConsentManagerVersionToLatest-Dl0mS41Z.mjs} +2 -2
  146. package/dist/{updateConsentManagerVersionToLatest-B9RIn1o-.mjs.map → updateConsentManagerVersionToLatest-Dl0mS41Z.mjs.map} +1 -1
  147. package/dist/{uploadConsents-Cbn0O4fM.mjs → uploadConsents-D7nAATPi.mjs} +2 -2
  148. package/dist/{uploadConsents-Cbn0O4fM.mjs.map → uploadConsents-D7nAATPi.mjs.map} +1 -1
  149. package/dist/{uploadCookiesFromCsv-r8mTeMe9.mjs → uploadCookiesFromCsv-DMoFL2a2.mjs} +2 -2
  150. package/dist/{uploadCookiesFromCsv-r8mTeMe9.mjs.map → uploadCookiesFromCsv-DMoFL2a2.mjs.map} +1 -1
  151. package/dist/{uploadDataFlowsFromCsv-BsBay5Vi.mjs → uploadDataFlowsFromCsv-ySUAO5lC.mjs} +2 -2
  152. package/dist/{uploadDataFlowsFromCsv-BsBay5Vi.mjs.map → uploadDataFlowsFromCsv-ySUAO5lC.mjs.map} +1 -1
  153. package/dist/{uploadPrivacyRequestsFromCsv-B0hRYldF.mjs → uploadPrivacyRequestsFromCsv-DyE1kiP8.mjs} +2 -2
  154. package/dist/{uploadPrivacyRequestsFromCsv-B0hRYldF.mjs.map → uploadPrivacyRequestsFromCsv-DyE1kiP8.mjs.map} +1 -1
  155. package/dist/{validateTranscendAuth-CbYKgCP5.mjs → validateTranscendAuth-Dl8UUCAQ.mjs} +2 -2
  156. package/dist/{validateTranscendAuth-CbYKgCP5.mjs.map → validateTranscendAuth-Dl8UUCAQ.mjs.map} +1 -1
  157. package/package.json +4 -4
  158. package/dist/codecs-HQHBtqht.mjs +0 -2
  159. package/dist/codecs-HQHBtqht.mjs.map +0 -1
  160. package/dist/constants-DR-hU9Xj.mjs +0 -2
  161. package/dist/constants-DR-hU9Xj.mjs.map +0 -1
  162. package/dist/enums-UlIe_AeF.mjs +0 -2
  163. package/dist/enums-UlIe_AeF.mjs.map +0 -1
  164. package/dist/parseVariablesFromString-6ZwJyWSu.mjs +0 -3
  165. package/dist/parseVariablesFromString-6ZwJyWSu.mjs.map +0 -1
  166. package/dist/pullTranscendConfiguration-C21Yq51h.mjs +0 -58
  167. package/dist/pullTranscendConfiguration-C21Yq51h.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants-DR-hU9Xj.mjs","names":[],"sources":["../package.json","../src/constants.ts"],"sourcesContent":["","import { ScopeName, TRANSCEND_SCOPES, type ScopeDefinition } from '@transcend-io/privacy-types';\nimport { keyBy } from 'lodash-es';\n\nimport { TranscendInput } from './codecs.js';\nimport { TranscendPullResource } from './enums.js';\n\nexport { description, version } from '../package.json';\n/**\n * The name of the main binary for the CLI\n */\nexport const name = 'transcend';\n\nexport const ADMIN_DASH = 'https://app.transcend.io';\n\nexport const ADMIN_DASH_INTEGRATIONS = `${ADMIN_DASH}/infrastructure/integrations`;\nexport const ADMIN_DASH_DATAPOINTS = `${ADMIN_DASH}/data-map/data-inventory/data-points`;\n\n/**\n * Override default transcend API url using\n * TRANSCEND_API_URL=https://api.us.transcend.io transcend ...\n */\nexport const DEFAULT_TRANSCEND_API = process.env.TRANSCEND_API_URL || 'https://api.transcend.io';\n\n/**\n * Default the `--auth` flag to the `TRANSCEND_API_KEY` environment variable\n * when it is set, so callers do not need to pass `--auth` on every invocation:\n * TRANSCEND_API_KEY=... transcend policy bundles\n * When unset, `--auth` remains required.\n */\nexport const DEFAULT_TRANSCEND_API_KEY = process.env.TRANSCEND_API_KEY || undefined;\n\n/**\n * Override default transcend API url using\n * TRANSCEND_CONSENT_API_URL=https://consent.us.transcend.io transcend ...\n */\nexport const DEFAULT_TRANSCEND_CONSENT_API =\n process.env.TRANSCEND_CONSENT_API_URL || 'https://consent.transcend.io';\n\n/**\n * Mapping between resource type and scopes required for cli\n */\nexport const TR_PUSH_RESOURCE_SCOPE_MAP: {\n [k in TranscendPullResource]: ScopeName[];\n} = {\n [TranscendPullResource.ApiKeys]: [ScopeName.ViewApiKeys],\n [TranscendPullResource.Templates]: [ScopeName.ManageEmailTemplates],\n // ViewApiKeys — resolve api-key-title → apiKeyId when present on data silos\n [TranscendPullResource.DataSilos]: [\n ScopeName.ManageDataMap,\n ScopeName.ConnectDataSilos,\n ScopeName.ViewApiKeys,\n ],\n [TranscendPullResource.Enrichers]: [ScopeName.ManageRequestIdentities],\n [TranscendPullResource.BusinessEntities]: [ScopeName.ManageDataInventory],\n [TranscendPullResource.ProcessingActivities]: [ScopeName.ManageDataMap],\n [TranscendPullResource.Identifiers]: [ScopeName.ManageRequestIdentities],\n [TranscendPullResource.Attributes]: [ScopeName.ManageGlobalAttributes],\n [TranscendPullResource.DataFlows]: [ScopeName.ManageDataFlow],\n [TranscendPullResource.Cookies]: [ScopeName.ManageDataFlow],\n [TranscendPullResource.ConsentManager]: [ScopeName.ManageConsentManagerDeveloperSettings],\n [TranscendPullResource.Partitions]: [ScopeName.ManageConsentManagerDeveloperSettings],\n [TranscendPullResource.Actions]: [ScopeName.ManageDataSubjectRequestSettings],\n [TranscendPullResource.DataSubjects]: [ScopeName.ManageDataSubjectRequestSettings],\n [TranscendPullResource.Prompts]: [ScopeName.ManagePrompts],\n [TranscendPullResource.PromptPartials]: [ScopeName.ManagePrompts],\n [TranscendPullResource.PromptGroups]: [ScopeName.ManagePrompts],\n [TranscendPullResource.Vendors]: [ScopeName.ManageDataInventory],\n [TranscendPullResource.DataCategories]: [ScopeName.ManageDataInventory],\n [TranscendPullResource.ProcessingPurposes]: [ScopeName.ManageDataInventory],\n [TranscendPullResource.ActionItems]: [\n ScopeName.ManageAllActionItems,\n ScopeName.ViewGlobalAttributes,\n ],\n [TranscendPullResource.ActionItemCollections]: [ScopeName.ManageActionItemCollections],\n [TranscendPullResource.Teams]: [ScopeName.ManageAccessControl],\n [TranscendPullResource.Messages]: [ScopeName.ManageIntlMessages],\n [TranscendPullResource.PrivacyCenters]: [ScopeName.ManagePrivacyCenter],\n [TranscendPullResource.Policies]: [ScopeName.ManagePolicies],\n [TranscendPullResource.Assessments]: [ScopeName.ManageAssessments],\n [TranscendPullResource.AssessmentTemplates]: [ScopeName.ManageAssessments],\n [TranscendPullResource.Purposes]: [\n ScopeName.ManageConsentManager,\n ScopeName.ManagePreferenceStoreSettings,\n ],\n [TranscendPullResource.PreferenceOptions]: [ScopeName.ManagePreferenceStoreSettings],\n [TranscendPullResource.SystemDiscovery]: [ScopeName.ManageDataMap],\n // Primary: ManagePreferenceStoreSettings (createOrUpdateConsentWorkflowTrigger).\n // Related fetches used during sync:\n // - ViewDataSubjectRequestSettings — resolve action-type / data-subject-type (legacy)\n // - ViewConsentManager — resolve purposes[].tracking-type → purposeId\n // - ViewDataMap — resolve data-silo-titles (legacy, only when present)\n // - ManageWorkflows — list DSR workflows when workflow-title is set (V2)\n [TranscendPullResource.PreferenceWorkflowConfigs]: [\n ScopeName.ManagePreferenceStoreSettings,\n ScopeName.ViewDataSubjectRequestSettings,\n ScopeName.ViewConsentManager,\n ScopeName.ViewDataMap,\n ScopeName.ManageWorkflows,\n ],\n // ManageWorkflows inherits ViewDataSubjectRequestSettings and ViewGlobalAttributes\n // (needed to resolve action/data-subject/attribute-key names to IDs on push)\n [TranscendPullResource.WorkflowConfigs]: [ScopeName.ManageWorkflows],\n};\n\n/**\n * Mapping between resource type and scopes required for cli\n */\nexport const TR_PULL_RESOURCE_SCOPE_MAP: {\n [k in TranscendPullResource]: ScopeName[];\n} = {\n [TranscendPullResource.ApiKeys]: [ScopeName.ViewApiKeys],\n [TranscendPullResource.Templates]: [ScopeName.ViewEmailTemplates],\n // ViewApiKeys — dataSilos.apiKeys on the enriched pull query\n [TranscendPullResource.DataSilos]: [\n ScopeName.ViewDataMap,\n ScopeName.ViewDataSubjectRequestSettings,\n ScopeName.ViewApiKeys,\n ],\n [TranscendPullResource.Enrichers]: [ScopeName.ViewRequestIdentitySettings],\n [TranscendPullResource.BusinessEntities]: [ScopeName.ViewDataInventory],\n [TranscendPullResource.ProcessingActivities]: [ScopeName.ViewDataInventory],\n [TranscendPullResource.Identifiers]: [ScopeName.ViewRequestIdentitySettings],\n [TranscendPullResource.Attributes]: [ScopeName.ViewGlobalAttributes],\n [TranscendPullResource.DataFlows]: [ScopeName.ViewDataFlow],\n [TranscendPullResource.Cookies]: [ScopeName.ViewDataFlow],\n [TranscendPullResource.ConsentManager]: [ScopeName.ViewConsentManager],\n [TranscendPullResource.Partitions]: [ScopeName.ViewConsentManager],\n [TranscendPullResource.Actions]: [ScopeName.ViewDataSubjectRequestSettings],\n [TranscendPullResource.DataSubjects]: [ScopeName.ViewDataSubjectRequestSettings],\n [TranscendPullResource.Prompts]: [ScopeName.ViewPrompts],\n [TranscendPullResource.PromptPartials]: [ScopeName.ViewPrompts],\n [TranscendPullResource.PromptGroups]: [ScopeName.ViewPrompts],\n [TranscendPullResource.Vendors]: [ScopeName.ViewDataInventory],\n [TranscendPullResource.DataCategories]: [ScopeName.ViewDataInventory],\n [TranscendPullResource.ProcessingPurposes]: [ScopeName.ViewDataInventory],\n [TranscendPullResource.ActionItemCollections]: [ScopeName.ViewAllActionItems],\n [TranscendPullResource.ActionItems]: [ScopeName.ViewAllActionItems],\n [TranscendPullResource.Teams]: [ScopeName.ViewScopes],\n [TranscendPullResource.Messages]: [ScopeName.ViewIntlMessages],\n [TranscendPullResource.PrivacyCenters]: [ScopeName.ViewPrivacyCenter],\n [TranscendPullResource.Policies]: [ScopeName.ViewPolicies],\n [TranscendPullResource.Assessments]: [ScopeName.ViewAssessments],\n [TranscendPullResource.AssessmentTemplates]: [ScopeName.ViewAssessments],\n [TranscendPullResource.Purposes]: [\n ScopeName.ViewConsentManager,\n ScopeName.ViewPreferenceStoreSettings,\n ],\n [TranscendPullResource.PreferenceOptions]: [ScopeName.ViewPreferenceStoreSettings],\n [TranscendPullResource.SystemDiscovery]: [ScopeName.ViewDataMap],\n // ViewPreferenceStoreSettings — consentWorkflowTriggers GraphQL query\n // ManageWorkflows — resolve workflowConfigId → workflow-title for V2 configs\n [TranscendPullResource.PreferenceWorkflowConfigs]: [\n ScopeName.ViewPreferenceStoreSettings,\n ScopeName.ManageWorkflows,\n ],\n [TranscendPullResource.WorkflowConfigs]: [ScopeName.ViewWorkflows],\n};\n\nexport const TR_YML_RESOURCE_TO_FIELD_NAME: Record<TranscendPullResource, keyof TranscendInput> = {\n [TranscendPullResource.ApiKeys]: 'api-keys',\n [TranscendPullResource.Attributes]: 'attributes',\n [TranscendPullResource.DataFlows]: 'data-flows',\n [TranscendPullResource.Cookies]: 'cookies',\n [TranscendPullResource.ConsentManager]: 'consent-manager',\n [TranscendPullResource.Partitions]: 'partitions',\n [TranscendPullResource.Actions]: 'actions',\n [TranscendPullResource.DataSubjects]: 'data-subjects',\n [TranscendPullResource.BusinessEntities]: 'business-entities',\n [TranscendPullResource.ProcessingActivities]: 'processing-activities',\n [TranscendPullResource.Identifiers]: 'identifiers',\n [TranscendPullResource.Enrichers]: 'enrichers',\n [TranscendPullResource.DataSilos]: 'data-silos',\n [TranscendPullResource.Templates]: 'templates',\n [TranscendPullResource.Prompts]: 'prompts',\n [TranscendPullResource.PromptPartials]: 'prompt-partials',\n [TranscendPullResource.PromptGroups]: 'prompt-groups',\n [TranscendPullResource.Vendors]: 'vendors',\n [TranscendPullResource.DataCategories]: 'data-categories',\n [TranscendPullResource.ProcessingPurposes]: 'processing-purposes',\n [TranscendPullResource.ActionItems]: 'action-items',\n [TranscendPullResource.ActionItemCollections]: 'action-item-collections',\n [TranscendPullResource.Teams]: 'teams',\n [TranscendPullResource.Messages]: 'messages',\n [TranscendPullResource.PrivacyCenters]: 'privacy-center',\n [TranscendPullResource.Policies]: 'policies',\n [TranscendPullResource.Assessments]: 'assessments',\n [TranscendPullResource.AssessmentTemplates]: 'assessment-templates',\n [TranscendPullResource.Purposes]: 'purposes',\n [TranscendPullResource.PreferenceOptions]: 'preference-options',\n [TranscendPullResource.SystemDiscovery]: 'system-discovery',\n [TranscendPullResource.PreferenceWorkflowConfigs]: 'preference-workflow-configs',\n [TranscendPullResource.WorkflowConfigs]: 'workflow-configs',\n};\n\nexport const SCOPES_BY_TITLE = keyBy(\n Object.entries(TRANSCEND_SCOPES).map(([name, value]) => ({\n ...value,\n name,\n })),\n 'title',\n) as Record<\n string,\n ScopeDefinition & {\n /** The camelCased name which identifies the scope */\n name: ScopeName;\n }\n>;\n\nexport const SCOPE_TITLES = Object.keys(SCOPES_BY_TITLE);\n\n/**\n * HTTP statuses that should be retried *in place* without splitting.\n * 429: Rate-limited\n * 502: Upstream/edge gateway error\n * 329: Reserved for custom infra (kept defensively)\n */\nexport const RETRYABLE_BATCH_STATUSES = new Set([429, 502, 500, 504, 329] as const);\n\n/**\n * Debugging\n */\nexport const DEBUG = process.env.DEBUG === '1';\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- let e=function(e){return e.Json=`json`,e}({}),t=function(e){return e.Assessments=`assessments`,e}({}),n=function(e){return e.OneTrust=`oneTrust`,e.File=`file`,e}({}),r=function(e){return e.ApiKeys=`apiKeys`,e.Attributes=`customFields`,e.Templates=`templates`,e.DataSilos=`dataSilos`,e.Enrichers=`enrichers`,e.DataFlows=`dataFlows`,e.BusinessEntities=`businessEntities`,e.ProcessingActivities=`processingActivities`,e.Actions=`actions`,e.DataSubjects=`dataSubjects`,e.Identifiers=`identifiers`,e.Cookies=`cookies`,e.ConsentManager=`consentManager`,e.Partitions=`partitions`,e.Prompts=`prompts`,e.PromptPartials=`promptPartials`,e.PromptGroups=`promptGroups`,e.Vendors=`vendors`,e.DataCategories=`dataCategories`,e.ProcessingPurposes=`processingPurposes`,e.ActionItems=`actionItems`,e.ActionItemCollections=`actionItemCollections`,e.Teams=`teams`,e.PrivacyCenters=`privacyCenters`,e.Policies=`policies`,e.Messages=`messages`,e.Assessments=`assessments`,e.AssessmentTemplates=`assessmentTemplates`,e.Purposes=`purposes`,e.PreferenceOptions=`preferenceOptions`,e.SystemDiscovery=`systemDiscovery`,e.PreferenceWorkflowConfigs=`preferenceWorkflowConfigs`,e.WorkflowConfigs=`workflowConfigs`,e}({});export{r as i,t as n,n as r,e as t};
2
- //# sourceMappingURL=enums-UlIe_AeF.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"enums-UlIe_AeF.mjs","names":[],"sources":["../src/enums.ts"],"sourcesContent":["import { makeEnum } from '@transcend-io/type-utils';\n\n/** Accepted file formats for exporting resources from OneTrust */\nexport enum OneTrustFileFormat {\n Json = 'json',\n}\n\n/**\n * Resources that can be pulled in from OneTrust\n */\nexport enum OneTrustPullResource {\n Assessments = 'assessments',\n}\n\n/**\n * Where to read OneTrust resources from\n */\nexport enum OneTrustPullSource {\n OneTrust = 'oneTrust',\n File = 'file',\n}\n\n/**\n * Resources that can be pulled in\n */\nexport enum TranscendPullResource {\n ApiKeys = 'apiKeys',\n Attributes = 'customFields',\n Templates = 'templates',\n DataSilos = 'dataSilos',\n Enrichers = 'enrichers',\n DataFlows = 'dataFlows',\n BusinessEntities = 'businessEntities',\n ProcessingActivities = 'processingActivities',\n Actions = 'actions',\n DataSubjects = 'dataSubjects',\n Identifiers = 'identifiers',\n Cookies = 'cookies',\n ConsentManager = 'consentManager',\n Partitions = 'partitions',\n Prompts = 'prompts',\n PromptPartials = 'promptPartials',\n PromptGroups = 'promptGroups',\n Vendors = 'vendors',\n DataCategories = 'dataCategories',\n ProcessingPurposes = 'processingPurposes',\n ActionItems = 'actionItems',\n ActionItemCollections = 'actionItemCollections',\n Teams = 'teams',\n PrivacyCenters = 'privacyCenters',\n Policies = 'policies',\n Messages = 'messages',\n Assessments = 'assessments',\n AssessmentTemplates = 'assessmentTemplates',\n Purposes = 'purposes',\n PreferenceOptions = 'preferenceOptions',\n SystemDiscovery = 'systemDiscovery',\n PreferenceWorkflowConfigs = 'preferenceWorkflowConfigs',\n WorkflowConfigs = 'workflowConfigs',\n}\n"],"mappings":"AAGA,IAAY,EAAL,SAAA,EAAA,OACL,GAAA,KAAA,aACD,CAKW,EAAL,SAAA,EAAA,OACL,GAAA,YAAA,oBACD,CAKW,EAAL,SAAA,EAAA,OACL,GAAA,SAAA,WACA,EAAA,KAAA,aACD,CAKW,EAAL,SAAA,EAAA,OACL,GAAA,QAAA,UACA,EAAA,WAAA,eACA,EAAA,UAAA,YACA,EAAA,UAAA,YACA,EAAA,UAAA,YACA,EAAA,UAAA,YACA,EAAA,iBAAA,mBACA,EAAA,qBAAA,uBACA,EAAA,QAAA,UACA,EAAA,aAAA,eACA,EAAA,YAAA,cACA,EAAA,QAAA,UACA,EAAA,eAAA,iBACA,EAAA,WAAA,aACA,EAAA,QAAA,UACA,EAAA,eAAA,iBACA,EAAA,aAAA,eACA,EAAA,QAAA,UACA,EAAA,eAAA,iBACA,EAAA,mBAAA,qBACA,EAAA,YAAA,cACA,EAAA,sBAAA,wBACA,EAAA,MAAA,QACA,EAAA,eAAA,iBACA,EAAA,SAAA,WACA,EAAA,SAAA,WACA,EAAA,YAAA,cACA,EAAA,oBAAA,sBACA,EAAA,SAAA,WACA,EAAA,kBAAA,oBACA,EAAA,gBAAA,kBACA,EAAA,0BAAA,4BACA,EAAA,gBAAA,wBACD"}
@@ -1,3 +0,0 @@
1
- import{t as e}from"./logger-Ckep4QXn.mjs";import{chunk as t,difference as n,flatten as r,keyBy as i,uniq as a}from"lodash-es";import o from"colors";import{apply as s,getEntries as c}from"@transcend-io/type-utils";import{CREATE_DATA_SILOS as l,UPDATE_DATA_SILOS as u,UPDATE_OR_CREATE_DATA_POINT as d,convertToDataSubjectBlockList as f,createDataSubject as p,fetchAllActions as m,fetchAllAttributes as h,fetchAllDataSilos as g,fetchAllDataSubjects as _,fetchApiKeys as v,fetchIdentifiersAndCreateMissing as y,makeGraphQLRequest as b,syncAction as x,syncActionItemCollections as S,syncActionItems as C,syncAttribute as w,syncBusinessEntities as T,syncConsentManager as ee,syncConsentWorkflowTriggers as te,syncCookies as ne,syncDataCategories as re,syncDataFlows as ie,syncDataSiloDependencies as ae,syncDataSubject as oe,syncEnricher as se,syncIdentifier as ce,syncIntlMessages as le,syncPartitions as ue,syncPolicies as de,syncPreferenceOptionValues as fe,syncPreferenceTopics as pe,syncPrivacyCenter as me,syncProcessingActivities as he,syncProcessingPurposes as ge,syncPromptGroups as _e,syncPromptPartials as ve,syncPrompts as ye,syncPurposes as be,syncTeams as xe,syncTemplate as Se,syncVendors as Ce,syncWorkflowConfigs as we}from"@transcend-io/sdk";import{map as E,mapSeries as D}from"@transcend-io/utils";import O from"cli-progress";const k=/^[A-Za-z]+$/;function Te(e){let t=[],n=(e,n)=>{k.test(e)||t.push(`${n}: slug "${e}" is invalid — slugs must contain only alphabetical letters (A-Z, a-z). Topic slugs are normalized to PascalCase server-side, so YAML slugs should already be PascalCase or matching will break on subsequent pulls.`)};for(let t of e[`preference-options`]??[])n(t.slug,`preference-options`);for(let t of e.purposes??[])for(let e of t[`preference-topics`]??[]){n(e.slug,`purposes (topic "${e.title}")`);for(let t of e.options??[])n(t.slug,`purposes (topic "${e.title}" option "${t.title}")`)}return t}async function A({"data-silos":t=[],"data-subjects":s=[],"processing-activities":c=[],enrichers:l=[]},u,d=!1){let f=a([...r(t.map(e=>e[`data-subjects`]||[])||[]),...r(c.map(({dataSubjectTypes:e})=>e??[])??[]),...r(l.map(e=>e[`data-subjects`]||[])||[]),...s.map(e=>e.type)]);if(f.length===0&&!d)return{};let m=await _(u,{logger:e}),h=i(m,`type`),g=n(f,m.map(({type:e})=>e));if(g.length>0){e.info(o.magenta(`Creating ${g.length} new data subjects...`));for(let t of g){e.info(o.magenta(`Creating data subject ${t}...`));let n=await p(u,{input:t,logger:e});e.info(o.green(`Created data subject ${t}!`)),h[t]=n}}return h}async function j(n,r,{pageSize:a,dataSubjectsByName:c,apiKeysByTitle:p}){let m=!1,h=new Date().getTime();e.info(o.magenta(`Syncing "${n.length}" data silos...`));let _=i(await g(r,{titles:n.map(({title:e})=>e),pageSize:a,logger:e}),`title`),v=n.filter(({title:e})=>!_[e]);v.length>0&&(e.info(o.magenta(`Creating "${v.length}" data silos that did not exist...`)),await D(t(v,20),async t=>{let{createDataSilos:{dataSilos:n}}=await b(r,l,{variables:{input:t.map(e=>({name:e[`outer-type`]||e.integrationName,title:e.title,country:e.country,countrySubDivision:e.countrySubDivision,sombraId:e[`sombra-id`]}))},logger:e});n.forEach(e=>{_[e.title]=e})}),e.info(o.green(`Successfully created "${v.length}" data silos!`)));let y=t(n,20);await D(y,async(t,n)=>{e.info(o.magenta(`[Batch ${n+1}/${y.length}] Syncing "${t.length}" data silos`)),await b(r,u,{variables:{input:{dataSilos:t.map(e=>({id:_[e.title].id,country:e.country,countrySubDivision:e.countrySubDivision,url:e.url,headers:e.headers,description:e.description,identifiers:e[`identity-keys`],isLive:!e.disabled,ownerEmails:e.owners,teamNames:e.teams,dependedOnDataSiloTitles:e[`deletion-dependencies`]?void 0:[],apiKeyId:e[`api-key-title`]?p[e[`api-key-title`]].id:void 0,dataSubjectBlockListIds:e[`data-subjects`]?f(e[`data-subjects`],c):void 0,attributes:e.attributes,businessEntityTitles:e.businessEntityTitles,sombraId:e[`sombra-id`],notifyEmailAddress:e[`email-settings`]?.[`notify-email-address`],promptAVendorEmailSendFrequency:e[`email-settings`]?.[`send-frequency`],promptAVendorEmailSendType:e[`email-settings`]?.[`send-type`],promptAVendorEmailIncludeIdentifiersAttachment:e[`email-settings`]?.[`include-identifiers-attachment`],promptAVendorEmailCompletionLinkType:e[`email-settings`]?.[`completion-link-type`],manualWorkRetryFrequency:e[`email-settings`]?.[`manual-work-retry-frequency`]}))}},logger:e}),e.info(o.green(`[Batch ${n+1}/${y.length}] Synced "${t.length}" data silos!`))});let x=new O.SingleBar({},O.Presets.shades_classic),S=n.filter(({datapoints:e=[]})=>e.length>0),C=n.map(({datapoints:e=[]})=>e.length).reduce((e,t)=>e+t,0);e.info(o.magenta(`Syncing "${C}" datapoints from "${S.length}" data silos...`)),x.start(C,0);let w=0;await E(S,async({datapoints:t,title:n})=>{t&&await D(t,async t=>{let i=t.fields?t.fields.map(({key:e,description:t,categories:n,purposes:r,attributes:i,...a})=>({name:e,description:t,categories:n?n.map(e=>({...e,name:e.name||`Other`})):void 0,purposes:r?r.map(e=>({...e,name:e.name||`Other`})):void 0,attributes:i,accessRequestVisibilityEnabled:a[`access-request-visibility-enabled`],erasureRequestRedactionEnabled:a[`erasure-request-redaction-enabled`]})):void 0,a={dataSiloId:_[n].id,path:t.path,name:t.key,title:t.title,description:t.description,...t.owners?{ownerEmails:t.owners}:{},...t.teams?{teamNames:t.teams}:{},...t[`data-collection-tag`]?{dataCollectionTag:t[`data-collection-tag`]}:{},querySuggestions:t[`privacy-action-queries`]?Object.entries(t[`privacy-action-queries`]).map(([e,t])=>({requestType:e,suggestedQuery:t})):void 0,enabledActions:t[`privacy-actions`]||[],subDataPoints:i},s=(a.subDataPoints||[]).map(({name:e})=>e),c=s.filter((e,t)=>s.indexOf(e)!==t);if(c.length>0)e.info(o.red(`\nCannot update datapoint "${t.key}" as it has duplicate sub-datapoints with the same name: \n${c.join(`
2
- `)}`)),m=!0;else try{await b(r,d,{variables:a,logger:e})}catch(r){e.info(o.red(`\nFailed to update datapoint "${t.key}" for data silo "${n}"! - \n${r.message}`)),m=!0}w+=1,x.update(w)})},{concurrency:10}),x.stop();let T=new Date().getTime()-h;return e.info(o.green(`Synced "${n.length}" data silos and "${C}" datapoints in "${T/1e3}" seconds!`)),{success:!m,dataSiloTitleToId:s(_,({id:e})=>e)}}async function M(t,n,{pageSize:r=50,publishToPrivacyCenter:i=!0,classifyService:a=!1,deleteExtraAttributeValues:s=!1,logger:c,warnings:l=[]}){let u=c??e,d=[],f=!1,p=(e,t,n)=>{d.push({resource:e,item:n,message:t}),f=!0};u.info(o.magenta(`Fetching data with page size ${r}...`));let{templates:g,attributes:b,actions:D,identifiers:O,"data-subjects":k,"business-entities":M,enrichers:N,cookies:P,"consent-manager":F,"data-silos":I,"data-flows":L,prompts:R,"prompt-groups":z,"prompt-partials":B,vendors:V,"data-categories":H,"processing-activities":U,"processing-purposes":W,"action-items":G,"action-item-collections":K,teams:q,"privacy-center":J,messages:Y,policies:Ee,partitions:De,"preference-workflow-configs":Oe,"workflow-configs":ke}=t,Ae=t[`preference-options`],X=t.purposes,je=Te(t);if(je.length>0){for(let e of je)p(`preference-slugs`,e);return{success:!1,errors:d,warnings:l.length>0?l:void 0}}let[Z,Q,Me]=await Promise.all([N||O?y(n,{input:t,skipPublish:!i,logger:e}):{},I||k||N||U?A(t,n):{},I&&I.map(e=>e[`api-key-title`]||[]).reduce((e,t)=>e+t.length,0)>0?v(n,{apiKeyInputs:t,logger:e}):{}]);if(Oe?.length&&(await te(n,Oe,{logger:u,pageSize:r})||p(`preference-workflow-configs`,`Failed to sync preference workflow configs`)),ke?.length&&(await we(n,ke,{logger:u})||p(`workflow-configs`,`Failed to sync workflow configs`)),Ae?.length&&(await fe(n,Ae,{logger:u})||p(`preference-options`,`Failed to sync preference option values`)),X?.length){let{success:e,purposeIdByTrackingType:t}=await be(n,X,{logger:u});e||p(`purposes`,`Failed to sync one or more purposes`);let r=X.flatMap(e=>(e[`preference-topics`]??[]).map(t=>({...t,"tracking-type":e.trackingType})));r.length>0&&(await pe(n,r,{logger:u,purposeIdByTrackingType:t})||p(`preference-topics`,`Failed to sync one or more preference topics`))}if(F){u.info(o.magenta(`Syncing consent manager...`));try{await ee(n,F,{logger:u}),u.info(o.green(`Successfully synced consent manager!`))}catch(e){p(`consent-manager`,e.message),u.error(o.red(`Failed to sync consent manager! - ${e.message}`))}}if(R){let t=await ye(n,R,{logger:e});f||=!t}if(B){let t=await ve(n,B,{logger:e});f||=!t}if(z){let t=await _e(n,z,{logger:e});f||=!t}if(q){let t=await xe(n,q,{logger:e});f||=!t}if(g&&(e.info(o.magenta(`Syncing "${g.length}" email templates...`)),await E(g,async t=>{e.info(o.magenta(`Syncing template "${t.title}"...`));try{await Se(n,t,{logger:e}),e.info(o.green(`Successfully synced template "${t.title}"!`))}catch(n){f=!0,e.error(o.red(`Failed to sync template "${t.title}"! - ${n.message}`))}},{concurrency:10}),e.info(o.green(`Synced "${g.length}" email templates!`))),M){let t=await T(n,M,{logger:e});f||=!t}if(V){let t=await Ce(n,V,{logger:e});f||=!t}if(H){let t=await re(n,H,{logger:e});f||=!t}if(W){let t=await ge(n,W,{logger:e});f||=!t}if(De){let t=await ue(n,De,{logger:e});f||=!t}if(P){let t=await ne(n,P,{logger:e});f||=!t}if(K){let t=await S(n,K,{logger:e});f||=!t}if(b){e.info(o.magenta(`Syncing "${b.length}" attributes...`));let t=await h(n,{logger:e});await E(b,async r=>{let i=t.find(e=>e.name===r.name);e.info(o.magenta(`Syncing attribute "${r.name}"...`));try{await w(n,r,{existingAttribute:i,deleteExtraAttributeValues:s,logger:e}),e.info(o.green(`Successfully synced attribute "${r.name}"!`))}catch(t){f=!0,e.error(o.red(`Failed to sync attribute "${r.name}"! - ${t.message}`))}},{concurrency:10}),e.info(o.green(`Synced "${b.length}" attributes!`))}if(G){let t=await C(n,G,{logger:e});f||=!t}if(N&&(e.info(o.magenta(`Syncing "${N.length}" enrichers...`)),await E(N,async t=>{e.info(o.magenta(`Syncing enricher "${t.title}"...`));try{await se(n,{input:t,identifierByName:Z,dataSubjectsByName:Q,logger:e}),e.info(o.green(`Successfully synced enricher "${t.title}"!`))}catch(n){f=!0,e.error(o.red(`Failed to sync enricher "${t.title}"! - ${n.message}`))}},{concurrency:10}),e.info(o.green(`Synced "${N.length}" enrichers!`))),O&&(e.info(o.magenta(`Syncing "${O.length}" identifiers...`)),await E(O,async t=>{let r=Z[t.name];if(!r)throw Error(`Failed to find identifier with name: ${t.type}. Should have been auto-created by cli.`);e.info(o.magenta(`Syncing identifier "${t.type}"...`));try{await ce(n,{input:t,dataSubjectsByName:Q,identifierId:r.id,skipPublish:!i,logger:e}),e.info(o.green(`Successfully synced identifier "${t.type}"!`))}catch(n){f=!0,e.info(o.red(`Failed to sync identifier "${t.type}"! - ${n.message}`))}},{concurrency:10}),e.info(o.green(`Synced "${O.length}" identifiers!`))),D){e.info(o.magenta(`Syncing "${D.length}" actions...`));let t=await m(n,{logger:e});await E(D,async r=>{let a=t.find(e=>e.type===r.type);if(!a)throw Error(`Failed to find action with type: ${r.type}. Should have already existing in the organization.`);e.info(o.magenta(`Syncing action "${r.type}"...`));try{await x(n,{action:r,actionId:a.id,skipPublish:!i},{logger:e}),e.info(o.green(`Successfully synced action "${r.type}"!`))}catch(t){f=!0,e.error(o.red(`Failed to sync action "${r.type}"! - ${t.message}`))}},{concurrency:10}),e.info(o.green(`Synced "${D.length}" actions!`))}if(k){e.info(o.magenta(`Syncing "${k.length}" data subjects...`));let t=await _(n,{logger:e});await E(k,async r=>{let a=t.find(e=>e.type===r.type);if(!a)throw Error(`Failed to find data subject with type: ${r.type}. Should have already existing in the organization.`);e.info(o.magenta(`Syncing data subject "${r.type}"...`));try{await oe(n,{input:r,dataSubjectId:a.id,skipPublish:!i,logger:e}),e.info(o.green(`Successfully synced data subject "${r.type}"!`))}catch(t){f=!0;let n=r.supportsAuthorizedAgent!==void 0&&/authorized.agent/i.test(t.message)?` (enable the Authorized Agents feature for this organization before setting "supportsAuthorizedAgent")`:``;e.info(o.red(`Failed to sync data subject "${r.type}"! - ${t.message}${n}`))}},{concurrency:10}),e.info(o.green(`Synced "${k.length}" data subjects!`))}if(L){let t=await ie(n,L,{classifyService:a,logger:e});f||=!t}if(J)try{await me(n,J,{logger:e,skipPublish:!i})||p(`privacy-center`,`Failed to sync privacy center`)}catch(e){p(`privacy-center`,e.message)}if(Y){let t=await le(n,Y,{logger:e});f||=!t}if(Ee){let t=await de(n,Ee,{logger:e});f||=!t}let $=[];if(I){let{success:e,dataSiloTitleToId:t}=await j(I,n,{dataSubjectsByName:Q,apiKeysByTitle:Me,pageSize:r});I?.forEach(e=>{e[`deletion-dependencies`]&&$.push([t[e.title],e[`deletion-dependencies`]])}),f||=!e}if($.length>0&&await ae(n,{input:$,logger:e}),U){let t=await he(n,U,{logger:e});f||=!t}return{success:!f,errors:d,warnings:l.length>0?l:void 0}}function N(e,...t){let n=JSON.parse(JSON.stringify(e));return t.forEach(e=>{c(e).forEach(([e,t])=>{n[e]===void 0?n[e]=t:Array.isArray(t)?n[e]=[...n[e],...t]:n[e]=t})}),n}function P(e){let t=e.split(`,`).filter(e=>!!e),n={};return t.forEach(e=>{let[t,r]=e.split(`:`);if(!t||!r)throw Error(`Invalid variable: ${e}. Expected format: key:value`);n[t]=r}),n}export{A as a,j as i,N as n,M as r,P as t};
3
- //# sourceMappingURL=parseVariablesFromString-6ZwJyWSu.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseVariablesFromString-6ZwJyWSu.mjs","names":[],"sources":["../src/lib/preference-management/validatePreferenceManagementSlugs.ts","../src/lib/graphql/ensureAllDataSubjectsExist.ts","../src/lib/graphql/syncDataSilos.ts","../src/lib/graphql/syncConfigurationToTranscend.ts","../src/lib/mergeTranscendInputs.ts","../src/lib/helpers/parseVariablesFromString.ts"],"sourcesContent":["import type { TranscendInput } from '../../codecs.js';\n\n/** Slugs for preference topics and option values must be alphabetical letters only. */\nexport const PREFERENCE_SLUG_REGEX = /^[A-Za-z]+$/;\n\n/**\n * Validate preference topic and option value slugs before push.\n *\n * @param input - Parsed transcend.yml input\n * @returns List of validation error messages (empty when valid)\n */\nexport function validatePreferenceManagementSlugs(input: TranscendInput): string[] {\n const errors: string[] = [];\n\n const validateSlug = (slug: string, context: string): void => {\n if (!PREFERENCE_SLUG_REGEX.test(slug)) {\n errors.push(\n `${context}: slug \"${slug}\" is invalid — slugs must contain only alphabetical letters (A-Z, a-z). ` +\n 'Topic slugs are normalized to PascalCase server-side, so YAML slugs should already be PascalCase ' +\n 'or matching will break on subsequent pulls.',\n );\n }\n };\n\n for (const option of input['preference-options'] ?? []) {\n validateSlug(option.slug, 'preference-options');\n }\n\n for (const purpose of input.purposes ?? []) {\n for (const topic of purpose['preference-topics'] ?? []) {\n validateSlug(topic.slug, `purposes (topic \"${topic.title}\")`);\n for (const option of topic.options ?? []) {\n validateSlug(option.slug, `purposes (topic \"${topic.title}\" option \"${option.title}\")`);\n }\n }\n }\n\n return errors;\n}\n","import { createDataSubject, fetchAllDataSubjects, type DataSubject } from '@transcend-io/sdk';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { keyBy, flatten, uniq, difference } from 'lodash-es';\n\nimport { TranscendInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\n\n/**\n * Fetch all of the data subjects in the organization\n *\n * @param input - Input to fetch\n * @param client - GraphQL client\n * @param fetchAll - When true, always fetch all subjects\n * @returns The list of data subjects\n */\nexport async function ensureAllDataSubjectsExist(\n {\n 'data-silos': dataSilos = [],\n 'data-subjects': dataSubjects = [],\n 'processing-activities': processingActivities = [],\n enrichers = [],\n }: TranscendInput,\n client: GraphQLClient,\n fetchAll = false,\n): Promise<{ [type in string]: DataSubject }> {\n const expectedDataSubjects = uniq([\n ...flatten(dataSilos.map((silo) => silo['data-subjects'] || []) || []),\n ...flatten(processingActivities.map(({ dataSubjectTypes }) => dataSubjectTypes ?? []) ?? []),\n ...flatten(enrichers.map((enricher) => enricher['data-subjects'] || []) || []),\n ...dataSubjects.map((subject) => subject.type),\n ]);\n if (expectedDataSubjects.length === 0 && !fetchAll) {\n return {};\n }\n\n const internalSubjects = await fetchAllDataSubjects(client, { logger });\n const dataSubjectByName = keyBy(internalSubjects, 'type');\n\n const missingDataSubjects = difference(\n expectedDataSubjects,\n internalSubjects.map(({ type }) => type),\n );\n\n if (missingDataSubjects.length > 0) {\n logger.info(colors.magenta(`Creating ${missingDataSubjects.length} new data subjects...`));\n for (const dataSubjectType of missingDataSubjects) {\n logger.info(colors.magenta(`Creating data subject ${dataSubjectType}...`));\n const created = await createDataSubject(client, { input: dataSubjectType, logger });\n logger.info(colors.green(`Created data subject ${dataSubjectType}!`));\n dataSubjectByName[dataSubjectType] = created;\n }\n }\n\n return dataSubjectByName;\n}\n","import {\n makeGraphQLRequest,\n ApiKey,\n convertToDataSubjectBlockList,\n type DataSubject,\n fetchAllDataSilos,\n type DataSilo,\n CREATE_DATA_SILOS,\n UPDATE_DATA_SILOS,\n UPDATE_OR_CREATE_DATA_POINT,\n} from '@transcend-io/sdk';\nimport { apply } from '@transcend-io/type-utils';\nimport { mapSeries, map } from '@transcend-io/utils';\n/* eslint-disable max-lines */\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { chunk, keyBy } from 'lodash-es';\n\nimport { DataSiloInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\n\nconst BATCH_SILOS_LIMIT = 20;\n\n/**\n * Sync a data silo configuration\n *\n * @param dataSilos - Data silos to sync\n * @param client - GraphQL client\n * @param options - Options\n * @returns Data silo info\n */\nexport async function syncDataSilos(\n dataSilos: DataSiloInput[],\n client: GraphQLClient,\n {\n pageSize,\n dataSubjectsByName,\n apiKeysByTitle,\n }: {\n /** Page size */\n pageSize: number;\n /** The data subjects in the organization */\n dataSubjectsByName: { [type in string]: DataSubject };\n /** API key title to API key */\n apiKeysByTitle: { [title in string]: ApiKey };\n },\n): Promise<{\n /** Whether successfully updated */\n success: boolean;\n /** A mapping between data silo title to data silo ID */\n dataSiloTitleToId: { [k in string]: string };\n}> {\n let encounteredError = false;\n\n // Time duration\n const t0 = new Date().getTime();\n logger.info(colors.magenta(`Syncing \"${dataSilos.length}\" data silos...`));\n\n // Determine the set of data silos that already exist\n const existingDataSilos = await fetchAllDataSilos(client, {\n titles: dataSilos.map(({ title }) => title),\n pageSize,\n logger,\n });\n\n // Create a mapping of title -> existing silo, if it exists\n const existingDataSiloByTitle = keyBy<Pick<DataSilo, 'id' | 'title'>>(existingDataSilos, 'title');\n\n // Create new silos that do not exist\n const newDataSiloInputs = dataSilos.filter(({ title }) => !existingDataSiloByTitle[title]);\n if (newDataSiloInputs.length > 0) {\n logger.info(\n colors.magenta(`Creating \"${newDataSiloInputs.length}\" data silos that did not exist...`),\n );\n\n // Batch the creation\n const chunked = chunk(newDataSiloInputs, BATCH_SILOS_LIMIT);\n await mapSeries(chunked, async (dependencyUpdateChunk) => {\n const {\n createDataSilos: { dataSilos },\n } = await makeGraphQLRequest<{\n /** Mutation result */\n createDataSilos: {\n /** New data silos */\n dataSilos: Pick<DataSilo, 'id' | 'title'>[];\n };\n }>(client, CREATE_DATA_SILOS, {\n variables: {\n input: dependencyUpdateChunk.map((input) => ({\n name: input['outer-type'] || input.integrationName,\n title: input.title,\n country: input.country,\n countrySubDivision: input.countrySubDivision,\n sombraId: input['sombra-id'],\n })),\n },\n logger,\n });\n\n // save mapping of title and id\n dataSilos.forEach((silo) => {\n existingDataSiloByTitle[silo.title] = silo;\n });\n });\n\n logger.info(colors.green(`Successfully created \"${newDataSiloInputs.length}\" data silos!`));\n }\n\n // Batch the updates\n const chunkedUpdates = chunk(dataSilos, BATCH_SILOS_LIMIT);\n await mapSeries(chunkedUpdates, async (dataSiloUpdateChunk, ind) => {\n logger.info(\n colors.magenta(\n `[Batch ${ind + 1}/${chunkedUpdates.length}] Syncing \"${\n dataSiloUpdateChunk.length\n }\" data silos`,\n ),\n );\n await makeGraphQLRequest<{\n /** Mutation result */\n updateDataSilos: {\n /** New data silos */\n dataSilos: Pick<DataSilo, 'id' | 'title'>[];\n };\n }>(client, UPDATE_DATA_SILOS, {\n variables: {\n input: {\n dataSilos: dataSiloUpdateChunk.map((input) => ({\n id: existingDataSiloByTitle[input.title].id,\n country: input.country,\n countrySubDivision: input.countrySubDivision,\n url: input.url,\n headers: input.headers,\n description: input.description,\n identifiers: input['identity-keys'],\n isLive: !input.disabled,\n ownerEmails: input.owners,\n teamNames: input.teams,\n // clear out if not specified, otherwise the update needs to be applied after\n // all data silos are created\n dependedOnDataSiloTitles: input['deletion-dependencies'] ? undefined : [],\n apiKeyId: input['api-key-title']\n ? apiKeysByTitle[input['api-key-title']].id\n : undefined,\n dataSubjectBlockListIds: input['data-subjects']\n ? convertToDataSubjectBlockList(input['data-subjects'], dataSubjectsByName)\n : undefined,\n attributes: input.attributes,\n businessEntityTitles: input.businessEntityTitles,\n sombraId: input['sombra-id'],\n // AVC settings\n notifyEmailAddress: input['email-settings']?.['notify-email-address'],\n promptAVendorEmailSendFrequency: input['email-settings']?.['send-frequency'],\n promptAVendorEmailSendType: input['email-settings']?.['send-type'],\n promptAVendorEmailIncludeIdentifiersAttachment:\n input['email-settings']?.['include-identifiers-attachment'],\n promptAVendorEmailCompletionLinkType: input['email-settings']?.['completion-link-type'],\n manualWorkRetryFrequency: input['email-settings']?.['manual-work-retry-frequency'],\n })),\n },\n },\n logger,\n });\n logger.info(\n colors.green(\n `[Batch ${ind + 1}/${chunkedUpdates.length}] Synced \"${\n dataSiloUpdateChunk.length\n }\" data silos!`,\n ),\n );\n });\n\n // Sync datapoints\n\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n const dataSilosWithDataPoints = dataSilos.filter(({ datapoints = [] }) => datapoints.length > 0);\n const totalDataPoints = dataSilos\n .map(({ datapoints = [] }) => datapoints.length)\n .reduce((acc, count) => acc + count, 0);\n logger.info(\n colors.magenta(\n `Syncing \"${totalDataPoints}\" datapoints from \"${dataSilosWithDataPoints.length}\" data silos...`,\n ),\n );\n progressBar.start(totalDataPoints, 0);\n let total = 0;\n\n await map(\n dataSilosWithDataPoints,\n async ({ datapoints, title }) => {\n if (datapoints) {\n await mapSeries(datapoints, async (datapoint) => {\n const fields = datapoint.fields\n ? datapoint.fields.map(\n ({ key, description, categories, purposes, attributes, ...rest }) =>\n // TODO: Support setting title separately from the 'key/name'\n ({\n name: key,\n description,\n categories: !categories\n ? undefined\n : categories.map((category) => ({\n ...category,\n name: category.name || 'Other',\n })),\n purposes: !purposes\n ? undefined\n : purposes.map((purpose) => ({\n ...purpose,\n name: purpose.name || 'Other',\n })),\n attributes,\n accessRequestVisibilityEnabled: rest['access-request-visibility-enabled'],\n erasureRequestRedactionEnabled: rest['erasure-request-redaction-enabled'],\n }),\n )\n : undefined;\n\n const payload = {\n dataSiloId: existingDataSiloByTitle[title].id,\n path: datapoint.path,\n name: datapoint.key,\n title: datapoint.title,\n description: datapoint.description,\n ...(datapoint.owners\n ? {\n ownerEmails: datapoint.owners,\n }\n : {}),\n ...(datapoint.teams\n ? {\n teamNames: datapoint.teams,\n }\n : {}),\n ...(datapoint['data-collection-tag']\n ? { dataCollectionTag: datapoint['data-collection-tag'] }\n : {}),\n querySuggestions: !datapoint['privacy-action-queries']\n ? undefined\n : Object.entries(datapoint['privacy-action-queries']).map(([key, value]) => ({\n requestType: key,\n suggestedQuery: value,\n })),\n enabledActions: datapoint['privacy-actions'] || [], // clear out when not specified\n subDataPoints: fields,\n };\n\n // Ensure no duplicate sub-datapoints are provided\n const subDataPointsToUpdate = (payload.subDataPoints || []).map(({ name }) => name);\n const duplicateDataPoints = subDataPointsToUpdate.filter(\n (name, index) => subDataPointsToUpdate.indexOf(name) !== index,\n );\n if (duplicateDataPoints.length > 0) {\n logger.info(\n colors.red(\n `\\nCannot update datapoint \"${\n datapoint.key\n }\" as it has duplicate sub-datapoints with the same name: \\n${duplicateDataPoints.join(\n '\\n',\n )}`,\n ),\n );\n encounteredError = true;\n } else {\n try {\n await makeGraphQLRequest(client, UPDATE_OR_CREATE_DATA_POINT, {\n variables: payload,\n logger,\n });\n } catch (err) {\n logger.info(\n colors.red(\n `\\nFailed to update datapoint \"${datapoint.key}\" for data silo \"${title}\"! - \\n${err.message}`,\n ),\n );\n encounteredError = true;\n }\n }\n total += 1;\n progressBar.update(total);\n });\n }\n },\n {\n concurrency: 10,\n },\n );\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n logger.info(\n colors.green(\n `Synced \"${dataSilos.length}\" data silos and \"${totalDataPoints}\" datapoints in \"${\n totalTime / 1000\n }\" seconds!`,\n ),\n );\n return {\n success: !encounteredError,\n dataSiloTitleToId: apply(existingDataSiloByTitle, ({ id }) => id),\n };\n}\n/* eslint-enable max-lines */\n","import {\n fetchAllActions,\n fetchAllAttributes,\n fetchAllDataSubjects,\n fetchApiKeys,\n fetchIdentifiersAndCreateMissing,\n syncAction,\n syncActionItemCollections,\n syncActionItems,\n syncAttribute,\n syncBusinessEntities,\n syncDataCategories,\n syncConsentManager,\n syncCookies,\n syncDataFlows,\n syncDataSubject,\n syncDataSiloDependencies,\n syncEnricher,\n syncIdentifier,\n syncIntlMessages,\n syncPartitions,\n syncPolicies,\n syncPrivacyCenter,\n syncProcessingActivities,\n syncProcessingPurposes,\n syncPromptGroups,\n syncPromptPartials,\n syncPrompts,\n syncConsentWorkflowTriggers,\n syncWorkflowConfigs,\n syncPreferenceOptionValues,\n syncPurposes,\n syncPreferenceTopics,\n syncTeams,\n syncTemplate,\n syncVendors,\n type Identifier,\n} from '@transcend-io/sdk';\nimport { map, type Logger, type SyncError, type SyncResult } from '@transcend-io/utils';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\n\n/* eslint-disable max-lines */\nimport { TranscendInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\nimport { validatePreferenceManagementSlugs } from '../preference-management/validatePreferenceManagementSlugs.js';\nimport { ensureAllDataSubjectsExist } from './ensureAllDataSubjectsExist.js';\nimport { syncDataSilos } from './syncDataSilos.js';\n\nconst CONCURRENCY = 10;\n\n/**\n * Sync the yaml input back to Transcend using the GraphQL APIs\n *\n * @param input - The yml input\n * @param client - GraphQL client\n * @param pageSize - Page size\n * @returns Structured sync result with per-resource errors\n */\nexport async function syncConfigurationToTranscend(\n input: TranscendInput,\n client: GraphQLClient,\n {\n pageSize = 50,\n // TODO: https://transcend.height.app/T-23779\n publishToPrivacyCenter = true,\n classifyService = false,\n deleteExtraAttributeValues = false,\n logger: syncLogger,\n warnings = [],\n }: {\n /** Page size */\n pageSize?: number;\n /** When true, skip publishing to privacy center */\n publishToPrivacyCenter?: boolean;\n /** When true, delete any attributes being synced up */\n deleteExtraAttributeValues?: boolean;\n /** classify data flow service if missing */\n classifyService?: boolean;\n /** Optional logger (e.g. collecting logger for MCP debug responses) */\n logger?: Logger;\n /** Non-fatal warnings to include in the result */\n warnings?: string[];\n },\n): Promise<SyncResult> {\n const activeLogger = syncLogger ?? logger;\n const errors: SyncError[] = [];\n let encounteredError = false;\n\n const recordError = (resource: string, message: string, item?: string): void => {\n errors.push({ resource, item, message });\n encounteredError = true;\n };\n\n activeLogger.info(colors.magenta(`Fetching data with page size ${pageSize}...`));\n\n const {\n templates,\n attributes,\n actions,\n identifiers,\n 'data-subjects': dataSubjects,\n 'business-entities': businessEntities,\n enrichers,\n cookies,\n 'consent-manager': consentManager,\n 'data-silos': dataSilos,\n 'data-flows': dataFlows,\n prompts,\n 'prompt-groups': promptGroups,\n 'prompt-partials': promptPartials,\n vendors,\n 'data-categories': dataCategories,\n 'processing-activities': processingActivities,\n 'processing-purposes': processingPurposes,\n 'action-items': actionItems,\n 'action-item-collections': actionItemCollections,\n teams,\n 'privacy-center': privacyCenter,\n messages,\n policies,\n partitions,\n 'preference-workflow-configs': preferenceWorkflowConfigs,\n 'workflow-configs': workflowConfigs,\n } = input;\n\n const preferenceOptions = input['preference-options'];\n const purposes = input.purposes;\n\n const preferenceSlugErrors = validatePreferenceManagementSlugs(input);\n if (preferenceSlugErrors.length > 0) {\n for (const message of preferenceSlugErrors) {\n recordError('preference-slugs', message);\n }\n return {\n success: false,\n errors,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n }\n\n const [identifierByName, dataSubjectsByName, apiKeyTitleMap] = await Promise.all([\n // Ensure all identifiers are created and create a map from name -> identifier.id\n enrichers || identifiers\n ? fetchIdentifiersAndCreateMissing(client, {\n input,\n skipPublish: !publishToPrivacyCenter,\n logger,\n })\n : ({} as { [k in string]: Identifier }),\n // Grab all data subjects in the organization\n dataSilos || dataSubjects || enrichers || processingActivities\n ? ensureAllDataSubjectsExist(input, client)\n : {},\n // Grab API keys\n dataSilos &&\n dataSilos\n .map((dataSilo) => dataSilo['api-key-title'] || [])\n .reduce((acc, lst) => acc + lst.length, 0) > 0\n ? fetchApiKeys(client, { apiKeyInputs: input, logger })\n : {},\n ]);\n\n if (preferenceWorkflowConfigs?.length) {\n const preferenceWorkflowConfigsSuccess = await syncConsentWorkflowTriggers(\n client,\n preferenceWorkflowConfigs,\n {\n logger: activeLogger,\n pageSize,\n },\n );\n if (!preferenceWorkflowConfigsSuccess) {\n recordError('preference-workflow-configs', 'Failed to sync preference workflow configs');\n }\n }\n\n if (workflowConfigs?.length) {\n const workflowConfigsSuccess = await syncWorkflowConfigs(client, workflowConfigs, {\n logger: activeLogger,\n });\n if (!workflowConfigsSuccess) {\n recordError('workflow-configs', 'Failed to sync workflow configs');\n }\n }\n\n if (preferenceOptions?.length) {\n const preferenceOptionsSuccess = await syncPreferenceOptionValues(client, preferenceOptions, {\n logger: activeLogger,\n });\n if (!preferenceOptionsSuccess) {\n recordError('preference-options', 'Failed to sync preference option values');\n }\n }\n\n // Sync consent purposes and their nested preference topics.\n // Order matters: option values (above) exist first, then purposes, then topics\n // (which link to their purpose by ID and to option values by slug).\n if (purposes?.length) {\n const { success: purposesSuccess, purposeIdByTrackingType } = await syncPurposes(\n client,\n purposes,\n { logger: activeLogger },\n );\n if (!purposesSuccess) {\n recordError('purposes', 'Failed to sync one or more purposes');\n }\n\n const topics = purposes.flatMap((purpose) =>\n (purpose['preference-topics'] ?? []).map((topic) => ({\n ...topic,\n 'tracking-type': purpose.trackingType,\n })),\n );\n if (topics.length > 0) {\n const topicsSuccess = await syncPreferenceTopics(client, topics, {\n logger: activeLogger,\n purposeIdByTrackingType,\n });\n if (!topicsSuccess) {\n recordError('preference-topics', 'Failed to sync one or more preference topics');\n }\n }\n }\n\n // Sync consent manager\n if (consentManager) {\n activeLogger.info(colors.magenta('Syncing consent manager...'));\n try {\n await syncConsentManager(client, consentManager, { logger: activeLogger });\n activeLogger.info(colors.green('Successfully synced consent manager!'));\n } catch (err) {\n recordError('consent-manager', (err as Error).message);\n activeLogger.error(colors.red(`Failed to sync consent manager! - ${(err as Error).message}`));\n }\n }\n\n // Sync prompts\n if (prompts) {\n const promptsSuccess = await syncPrompts(client, prompts, { logger });\n encounteredError = encounteredError || !promptsSuccess;\n }\n if (promptPartials) {\n const promptsSuccess = await syncPromptPartials(client, promptPartials, { logger });\n encounteredError = encounteredError || !promptsSuccess;\n }\n if (promptGroups) {\n const promptsSuccess = await syncPromptGroups(client, promptGroups, { logger });\n encounteredError = encounteredError || !promptsSuccess;\n }\n\n if (teams) {\n const teamsSuccess = await syncTeams(client, teams, { logger });\n encounteredError = encounteredError || !teamsSuccess;\n }\n\n // Sync email templates\n if (templates) {\n logger.info(colors.magenta(`Syncing \"${templates.length}\" email templates...`));\n await map(\n templates,\n async (template) => {\n logger.info(colors.magenta(`Syncing template \"${template.title}\"...`));\n try {\n await syncTemplate(client, template, { logger });\n logger.info(colors.green(`Successfully synced template \"${template.title}\"!`));\n } catch (err) {\n encounteredError = true;\n logger.error(colors.red(`Failed to sync template \"${template.title}\"! - ${err.message}`));\n }\n },\n {\n concurrency: CONCURRENCY,\n },\n );\n logger.info(colors.green(`Synced \"${templates.length}\" email templates!`));\n }\n\n // Sync business entities\n if (businessEntities) {\n const businessEntitySuccess = await syncBusinessEntities(client, businessEntities, { logger });\n encounteredError = encounteredError || !businessEntitySuccess;\n }\n\n // Sync vendors\n if (vendors) {\n const vendorsSuccess = await syncVendors(client, vendors, { logger });\n encounteredError = encounteredError || !vendorsSuccess;\n }\n\n // Sync data categories\n if (dataCategories) {\n const dataCategoriesSuccess = await syncDataCategories(client, dataCategories, { logger });\n encounteredError = encounteredError || !dataCategoriesSuccess;\n }\n\n // Sync processing purposes\n if (processingPurposes) {\n const processingPurposesSuccess = await syncProcessingPurposes(client, processingPurposes, {\n logger,\n });\n encounteredError = encounteredError || !processingPurposesSuccess;\n }\n\n // Sync partitions\n if (partitions) {\n const partitionsSuccess = await syncPartitions(client, partitions, { logger });\n encounteredError = encounteredError || !partitionsSuccess;\n }\n\n // Sync cookies\n if (cookies) {\n const cookiesSuccess = await syncCookies(client, cookies, { logger });\n encounteredError = encounteredError || !cookiesSuccess;\n }\n\n // Sync action item collections\n if (actionItemCollections) {\n const actionItemCollectionsSuccess = await syncActionItemCollections(\n client,\n actionItemCollections,\n { logger },\n );\n encounteredError = encounteredError || !actionItemCollectionsSuccess;\n }\n\n // Sync attributes\n if (attributes) {\n // Fetch existing\n logger.info(colors.magenta(`Syncing \"${attributes.length}\" attributes...`));\n const existingAttributes = await fetchAllAttributes(client, { logger });\n await map(\n attributes,\n async (attribute) => {\n const existing = existingAttributes.find((attr) => attr.name === attribute.name);\n\n logger.info(colors.magenta(`Syncing attribute \"${attribute.name}\"...`));\n try {\n await syncAttribute(client, attribute, {\n existingAttribute: existing,\n deleteExtraAttributeValues,\n logger,\n });\n logger.info(colors.green(`Successfully synced attribute \"${attribute.name}\"!`));\n } catch (err) {\n encounteredError = true;\n logger.error(\n colors.red(`Failed to sync attribute \"${attribute.name}\"! - ${err.message}`),\n );\n }\n },\n {\n concurrency: CONCURRENCY,\n },\n );\n logger.info(colors.green(`Synced \"${attributes.length}\" attributes!`));\n }\n\n // Sync action items\n if (actionItems) {\n const actionItemsSuccess = await syncActionItems(client, actionItems, { logger });\n encounteredError = encounteredError || !actionItemsSuccess;\n }\n\n // Sync enrichers\n if (enrichers) {\n logger.info(colors.magenta(`Syncing \"${enrichers.length}\" enrichers...`));\n await map(\n enrichers,\n async (enricher) => {\n logger.info(colors.magenta(`Syncing enricher \"${enricher.title}\"...`));\n try {\n await syncEnricher(client, {\n input: enricher,\n identifierByName,\n dataSubjectsByName,\n logger,\n });\n logger.info(colors.green(`Successfully synced enricher \"${enricher.title}\"!`));\n } catch (err) {\n encounteredError = true;\n logger.error(colors.red(`Failed to sync enricher \"${enricher.title}\"! - ${err.message}`));\n }\n },\n {\n concurrency: CONCURRENCY,\n },\n );\n logger.info(colors.green(`Synced \"${enrichers.length}\" enrichers!`));\n }\n\n // Sync identifiers\n if (identifiers) {\n // Fetch existing\n logger.info(colors.magenta(`Syncing \"${identifiers.length}\" identifiers...`));\n await map(\n identifiers,\n async (identifier) => {\n const existing = identifierByName[identifier.name];\n if (!existing) {\n throw new Error(\n `Failed to find identifier with name: ${identifier.type}. Should have been auto-created by cli.`,\n );\n }\n\n logger.info(colors.magenta(`Syncing identifier \"${identifier.type}\"...`));\n try {\n await syncIdentifier(client, {\n input: identifier,\n dataSubjectsByName,\n identifierId: existing.id,\n skipPublish: !publishToPrivacyCenter,\n logger,\n });\n logger.info(colors.green(`Successfully synced identifier \"${identifier.type}\"!`));\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(`Failed to sync identifier \"${identifier.type}\"! - ${err.message}`),\n );\n }\n },\n {\n concurrency: CONCURRENCY,\n },\n );\n logger.info(colors.green(`Synced \"${identifiers.length}\" identifiers!`));\n }\n\n // Sync actions\n if (actions) {\n // Fetch existing\n logger.info(colors.magenta(`Syncing \"${actions.length}\" actions...`));\n const existingActions = await fetchAllActions(client, { logger });\n await map(\n actions,\n async (action) => {\n const existing = existingActions.find((act) => act.type === action.type);\n if (!existing) {\n throw new Error(\n `Failed to find action with type: ${action.type}. Should have already existing in the organization.`,\n );\n }\n\n logger.info(colors.magenta(`Syncing action \"${action.type}\"...`));\n try {\n await syncAction(\n client,\n {\n action,\n actionId: existing.id,\n skipPublish: !publishToPrivacyCenter,\n },\n { logger },\n );\n logger.info(colors.green(`Successfully synced action \"${action.type}\"!`));\n } catch (err) {\n encounteredError = true;\n logger.error(colors.red(`Failed to sync action \"${action.type}\"! - ${err.message}`));\n }\n },\n {\n concurrency: CONCURRENCY,\n },\n );\n logger.info(colors.green(`Synced \"${actions.length}\" actions!`));\n }\n\n // Sync data subjects\n if (dataSubjects) {\n // Fetch existing\n logger.info(colors.magenta(`Syncing \"${dataSubjects.length}\" data subjects...`));\n const existingDataSubjects = await fetchAllDataSubjects(client, { logger });\n await map(\n dataSubjects,\n async (dataSubject) => {\n const existing = existingDataSubjects.find((subj) => subj.type === dataSubject.type);\n if (!existing) {\n throw new Error(\n `Failed to find data subject with type: ${dataSubject.type}. Should have already existing in the organization.`,\n );\n }\n\n logger.info(colors.magenta(`Syncing data subject \"${dataSubject.type}\"...`));\n try {\n await syncDataSubject(client, {\n input: dataSubject,\n dataSubjectId: existing.id,\n skipPublish: !publishToPrivacyCenter,\n logger,\n });\n logger.info(colors.green(`Successfully synced data subject \"${dataSubject.type}\"!`));\n } catch (err) {\n encounteredError = true;\n // supportsAuthorizedAgent is gated on the Authorized Agents feature being\n // enabled for the organization; surface a clearer hint than the raw API error\n const hint =\n dataSubject.supportsAuthorizedAgent !== undefined &&\n /authorized.agent/i.test(err.message)\n ? ' (enable the Authorized Agents feature for this organization before setting \"supportsAuthorizedAgent\")'\n : '';\n logger.info(\n colors.red(\n `Failed to sync data subject \"${dataSubject.type}\"! - ${err.message}${hint}`,\n ),\n );\n }\n },\n {\n concurrency: CONCURRENCY,\n },\n );\n logger.info(colors.green(`Synced \"${dataSubjects.length}\" data subjects!`));\n }\n\n // Sync data flows\n if (dataFlows) {\n const syncedDataFlows = await syncDataFlows(client, dataFlows, { classifyService, logger });\n encounteredError = encounteredError || !syncedDataFlows;\n }\n\n // Sync privacy center\n if (privacyCenter) {\n try {\n const privacyCenterSuccess = await syncPrivacyCenter(client, privacyCenter, {\n logger,\n skipPublish: !publishToPrivacyCenter,\n });\n if (!privacyCenterSuccess) {\n recordError('privacy-center', 'Failed to sync privacy center');\n }\n } catch (err) {\n recordError('privacy-center', (err as Error).message);\n }\n }\n\n // Sync messages\n if (messages) {\n const messagesSuccess = await syncIntlMessages(client, messages, { logger });\n encounteredError = encounteredError || !messagesSuccess;\n }\n\n // Sync policies\n if (policies) {\n const policiesSuccess = await syncPolicies(client, policies, { logger });\n encounteredError = encounteredError || !policiesSuccess;\n }\n\n // Store dependency updates\n const dependencyUpdates: [string, string[]][] = [];\n // Sync data silos\n if (dataSilos) {\n const { success, dataSiloTitleToId } = await syncDataSilos(dataSilos, client, {\n dataSubjectsByName,\n apiKeysByTitle: apiKeyTitleMap,\n pageSize,\n });\n dataSilos?.forEach((dataSilo) => {\n // Queue up dependency update\n if (dataSilo['deletion-dependencies']) {\n dependencyUpdates.push([\n dataSiloTitleToId[dataSilo.title],\n dataSilo['deletion-dependencies'],\n ]);\n }\n });\n encounteredError = encounteredError || !success;\n }\n\n // Dependencies updated at the end after all data silos are created\n if (dependencyUpdates.length > 0) {\n await syncDataSiloDependencies(client, { input: dependencyUpdates, logger });\n }\n\n // Update processing activities\n if (processingActivities) {\n const processingActivitySuccess = await syncProcessingActivities(client, processingActivities, {\n logger,\n });\n encounteredError = encounteredError || !processingActivitySuccess;\n }\n\n if (publishToPrivacyCenter) {\n // TODO: https://transcend.height.app/T-23779\n }\n\n return {\n success: !encounteredError,\n errors,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n}\n/* eslint-enable max-lines */\n","import { getEntries } from '@transcend-io/type-utils';\n\nimport { TranscendInput } from '../codecs.js';\n\n/**\n * Combine a set of TranscendInput yaml files into a single yaml\n *\n * @param base - Base input\n * @param inputs - The list of inputs\n * @returns Merged input\n */\nexport function mergeTranscendInputs(\n base: TranscendInput,\n ...inputs: TranscendInput[]\n): TranscendInput {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cloned: any = JSON.parse(JSON.stringify(base));\n inputs.forEach((input) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getEntries(input).forEach(([key, value]: [any, any]) => {\n if (cloned[key] === undefined) {\n cloned[key] = value;\n } else if (Array.isArray(value)) {\n cloned[key] = [...cloned[key], ...value];\n } else {\n cloned[key] = value;\n }\n });\n });\n return cloned;\n}\n","/**\n * Parse variables from string\n *\n * @param variables - Variables as string\n * @returns Variables as object\n */\nexport function parseVariablesFromString(variables: string): {\n [k in string]: string;\n} {\n // Parse out the variables\n const splitVars = variables.split(',').filter((x) => !!x);\n const vars: { [k in string]: string } = {};\n splitVars.forEach((variable) => {\n const [k, v] = variable.split(':');\n if (!k || !v) {\n throw new Error(`Invalid variable: ${variable}. Expected format: key:value`);\n }\n vars[k] = v;\n });\n return vars;\n}\n"],"mappings":"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"}
@@ -1,58 +0,0 @@
1
- import"./enums-UlIe_AeF.mjs";import{t as e}from"./logger-Ckep4QXn.mjs";import{ActionItemCode as t,ConsentTrackerStatus as n,PreferenceTopicType as r,RequestAction as i,RetentionType as a,WorkflowConfigType as o}from"@transcend-io/privacy-types";import{flatten as s,groupBy as c,keyBy as l,mapValues as u}from"lodash-es";import d from"colors";import{ASSESSMENT_SECTION_FIELDS as f,convertToDataSubjectAllowlist as p,fetchAllActionItemCollections as m,fetchAllActionItems as h,fetchAllActions as g,fetchAllAssessments as _,fetchAllAttributes as v,fetchAllBusinessEntities as y,fetchAllConsentWorkflowTriggers as b,fetchAllCookies as x,fetchAllDataCategories as S,fetchAllDataFlows as C,fetchAllDataSubjects as w,fetchAllEnrichers as T,fetchAllIdentifiers as E,fetchAllMessages as D,fetchAllPolicies as ee,fetchAllPreferenceOptionValues as te,fetchAllPrivacyCenters as ne,fetchAllProcessingActivities as re,fetchAllProcessingPurposes as ie,fetchAllPromptGroups as ae,fetchAllPromptPartials as oe,fetchAllPrompts as se,fetchAllPurposesAndPreferences as ce,fetchAllSiloDiscoveryResults as le,fetchAllTeams as ue,fetchAllTemplates as de,fetchAllVendors as fe,fetchAllWorkflowConfigs as pe,fetchApiKeys as me,fetchConsentManager as he,fetchConsentManagerExperiences as ge,fetchConsentManagerTheme as _e,fetchConsentThemes as ve,fetchConsentVariants as ye,fetchEnrichedDataSilos as be,fetchPartitions as xe,formatAttributeValues as O,formatRegions as k,makeGraphQLRequest as A,parseAssessmentDisplayLogic as j,parseAssessmentRiskLogic as M,parsePurposesFromTriggerCondition as Se,resolveWorkflowTitleFromId as Ce,workflowConfigMatchKey as we}from"@transcend-io/sdk";import{gql as N}from"graphql-request";const P=N`
2
- query TranscendCliAssessmentTemplates(
3
- $first: Int!
4
- $offset: Int!
5
- $filterBy: AssessmentFormTemplateFiltersInput
6
- ) {
7
- assessmentFormTemplates(
8
- first: $first
9
- offset: $offset
10
- filterBy: $filterBy
11
- ) {
12
- nodes {
13
- id
14
- creator {
15
- id
16
- email
17
- name
18
- }
19
- lastEditor {
20
- id
21
- email
22
- name
23
- }
24
- title
25
- description
26
- status
27
- source
28
- parentId
29
- isLocked
30
- isArchived
31
- createdAt
32
- updatedAt
33
- retentionSchedule {
34
- id
35
- type
36
- durationDays
37
- operation
38
- createdAt
39
- updatedAt
40
- }
41
- assessmentEmailSet {
42
- id
43
- title
44
- description
45
- isDefault
46
- templates {
47
- id
48
- title
49
- }
50
- }
51
- sections {
52
- ${f}
53
- }
54
- }
55
- }
56
- }
57
- `;async function F(t){let n=[],r=0,i=!1;do{let{assessmentFormTemplates:{nodes:a}}=await A(t,P,{variables:{first:20,offset:r},logger:e});n.push(...a),r+=20,i=a.length===20}while(i);return n.sort((e,t)=>e.title.localeCompare(t.title))}const I=[`dataSilos`,`enrichers`,`templates`,`apiKeys`];async function L(f,{dataSiloIds:A,integrationNames:N,debug:P,resources:L=I,pageSize:R,skipDatapoints:Te,includeGuessedCategories:z,skipSubDatapoints:Ee,trackerStatuses:B=Object.values(n)}){if(A.length>0&&N.length>0)throw Error(`Only 1 of integrationNames OR dataSiloIds can be provided`);e.info(d.magenta(`Fetching data with page size ${R}...`));let[V,De,H,U,W,G,K,q,Oe,ke,Ae,je,J,Me,Ne,Pe,Fe,Ie,Le,Re,ze,Be,Ve,He,Ue,We,Ge,Ke,qe,Je,Ye,Xe,Y,X,Ze,Qe]=await Promise.all([L.includes(`dataSilos`)||L.includes(`dataSubjects`)?w(f,{logger:e}):[],L.includes(`apiKeys`)?me(f,{fetchAll:!0,logger:e}):[],L.includes(`dataSilos`)?be(f,{ids:A,integrationNames:N,pageSize:R,debug:P,includeGuessedCategories:z,skipDatapoints:Te,skipSubDatapoints:Ee,logger:e}):[],L.includes(`enrichers`)?T(f,{logger:e}):[],L.includes(`dataFlows`)?[...B.includes(n.Live)?await C(f,{logger:e,filterBy:{status:n.Live}}):[],...B.includes(n.NeedsReview)?await C(f,{logger:e,filterBy:{status:n.NeedsReview}}):[]]:[],L.includes(`cookies`)?[...B.includes(n.Live)?await x(f,{logger:e,filterBy:{status:n.Live}}):[],...B.includes(n.NeedsReview)?await x(f,{logger:e,filterBy:{status:n.NeedsReview}}):[]]:[],L.includes(`customFields`)?v(f,{logger:e}):[],L.includes(`templates`)?de(f,{logger:e}):[],L.includes(`identifiers`)?E(f,{logger:e}):[],L.includes(`actions`)?g(f,{logger:e}):[],L.includes(`businessEntities`)?y(f,{logger:e}):[],L.includes(`processingActivities`)?re(f,{logger:e}):[],L.includes(`consentManager`)?he(f,{logger:e}):void 0,L.includes(`consentManager`)?ge(f,{logger:e}):[],L.includes(`consentManager`)?ye(f,{logger:e}):[],L.includes(`consentManager`)?ve(f,{logger:e}):[],L.includes(`prompts`)?se(f,{logger:e}):[],L.includes(`promptPartials`)?oe(f,{logger:e}):[],L.includes(`promptGroups`)?ae(f,{logger:e}):[],L.includes(`vendors`)?fe(f,{logger:e}):[],L.includes(`dataCategories`)?S(f,{logger:e}):[],L.includes(`processingPurposes`)?ie(f,{logger:e}):[],L.includes(`actionItems`)?h(f,{logger:e,filterBy:{type:[t.Onboarding]}}):[],L.includes(`actionItemCollections`)?m(f,{logger:e}):[],L.includes(`teams`)?ue(f,{logger:e}):[],L.includes(`policies`)?ee(f,{logger:e}):[],L.includes(`privacyCenters`)?ne(f,{logger:e}):[],L.includes(`messages`)?D(f,{logger:e}):[],L.includes(`partitions`)?xe(f,{logger:e}):[],L.includes(`assessments`)?_(f,{logger:e}):[],L.includes(`assessmentTemplates`)?F(f):[],L.includes(`purposes`)?ce(f,{logger:e}):[],L.includes(`preferenceWorkflowConfigs`)?b(f,{logger:e}):[],L.includes(`workflowConfigs`)?pe(f,{logger:e,workflowConfigType:o.DSR}):[],L.includes(`preferenceOptions`)?te(f,{logger:e}):[],L.includes(`systemDiscovery`)?le(f,{logger:e}):[]]),Z=L.includes(`consentManager`)&&J?await _e(f,{logger:e,filterBy:{airgapBundleId:J.id}}):void 0,Q={},$e=s(H.map(([{apiKeys:e}])=>e.map(({title:e})=>e))),$=Object.values(De).filter(({title:e})=>L.includes(`apiKeys`)?!0:$e.includes(e));if($.length>0&&L.includes(`apiKeys`)&&(Q[`api-keys`]=$.map(({title:e})=>({title:e}))),qe.length>0&&L.includes(`partitions`)&&(Q.partitions=qe.map(({name:e,partition:t})=>({name:e,partition:t}))),J&&L.includes(`consentManager`)&&(Q[`consent-manager`]={bundleUrls:{TEST:J.testBundleURL,PRODUCTION:J.bundleURL},domains:J.configuration.domains||void 0,partition:J.configuration.partition||void 0,consentPrecedence:J.configuration.consentPrecedence||void 0,unknownRequestPolicy:J.configuration.unknownRequestPolicy||void 0,unknownCookiePolicy:J.configuration.unknownCookiePolicy||void 0,syncEndpoint:J.configuration.syncEndpoint||void 0,telemetryPartitioning:J.configuration.telemetryPartitioning||void 0,signedIabAgreement:J.configuration.signedIabAgreement||void 0,syncGroups:J.configuration.syncGroups||void 0,theme:Z?{primaryColor:Z.primaryColor||void 0,fontColor:Z.fontColor||void 0,privacyPolicy:Z.privacyPolicy||void 0,prompt:Z.prompt}:void 0,experiences:Me.map(e=>({name:e.name,displayName:e.displayName||void 0,regions:e.regions.map(e=>({countrySubDivision:e.countrySubDivision||void 0,country:e.country||void 0})),onConsentExpiry:e.onConsentExpiry,consentExpiry:e.consentExpiry,operator:e.operator,displayPriority:e.displayPriority,viewState:e.viewState,purposes:e.purposes.map(e=>({trackingType:e.trackingType})),optedOutPurposes:e.optedOutPurposes.map(e=>({trackingType:e.trackingType})),browserLanguages:e.browserLanguages,browserTimeZones:e.browserTimeZones,consentUiVariantSlug:e.consentUiVariant?.slug})),consentVariants:Ne.map(e=>({id:e.id,name:e.name,slug:e.slug,description:e.description||void 0,configuration:JSON.stringify(e.configuration),locales:e.locales,status:e.status,userFlow:e.userFlow||void 0,themeSlug:e.theme?.slug||void 0})),consentThemes:Pe.map(e=>({id:e.id,name:e.name,slug:e.slug,configuration:JSON.stringify(e.configuration)}))}),Je.length>0&&L.includes(`assessments`)&&(Q.assessments=Je.map(({title:e,assessmentGroup:t,sections:n,creator:r,description:i,status:a,assignees:o,externalAssignees:s,reviewers:c,isLocked:l,isArchived:u,isExternallyCreated:d,dueDate:f,createdAt:p,assignedAt:m,submittedAt:h,approvedAt:g,rejectedAt:_,titleIsInternal:v,retentionSchedule:y,attributeValues:b,resources:x,syncedRows:S})=>({title:e,group:t.title,sections:n.map(({title:e,status:t,questions:n,assignees:r,isReviewed:i,externalAssignees:a})=>({title:e,status:t,questions:n.map(({title:e,type:t,subType:n,placeholder:r,description:i,isRequired:a,referenceId:o,displayLogic:s,riskLogic:c,riskCategories:l,riskFramework:u,answerOptions:d,selectedAnswers:f,allowedMimeTypes:p,allowSelectOther:m,syncModel:h,syncColumn:g,attributeKey:_,requireRiskEvaluation:v,requireRiskMatrixEvaluation:y})=>{let b=s?j(s):void 0;return{title:e,type:t,"sub-type":n,placeholder:r,description:i,"is-required":a,"reference-id":o,"display-logic":b&&Object.keys(b).length>0?{action:b.action,rule:b.rule?{"depends-on-question-reference-id":b.rule.dependsOnQuestionReferenceId,"comparison-operator":b.rule.comparisonOperator,"comparison-operands":`comparisonOperands`in b.rule?b.rule.comparisonOperands:void 0}:void 0,"nested-rule":b.nestedRule?{"logic-operator":b.nestedRule.logicOperator,rules:(b.nestedRule.rules||[]).map(e=>({"depends-on-question-reference-id":e.dependsOnQuestionReferenceId,"comparison-operator":e.comparisonOperator,"comparison-operands":`comparisonOperands`in e?e.comparisonOperands:void 0}))}:void 0}:void 0,"risk-logic":c.map(e=>{let t=M(e);return{"risk-level":t.riskAssignment?.riskLevelId,"comparison-operands":t.comparisonOperands,"comparison-operator":t.comparisonOperator}}),"risk-categories":l.map(({title:e})=>e),"risk-framework":u?.title,"answer-options":d.map(({value:e})=>({value:e})),"selected-answers":f.map(({value:e})=>e),"allowed-mime-types":p,"allow-select-other":m,"sync-model":h||void 0,"sync-column":g||void 0,"attribute-key":_?.name,"require-risk-evaluation":v,"require-risk-matrix-evaluation":y}}),assignees:r.map(({email:e})=>e),"external-assignees":a.map(({email:e})=>e),"is-reviewed":i})),creator:r?.email,description:i,status:a,assignees:o.map(({email:e})=>e),"external-assignees":s.map(({email:e})=>e),reviewers:c.map(({email:e})=>e),locked:l,archived:u,external:d,"title-is-internal":v,"due-date":f||void 0,"created-at":p||void 0,"assigned-at":m||void 0,"submitted-at":h||void 0,"approved-at":g||void 0,"rejected-at":_||void 0,"retention-schedule":y?{type:y.type,"duration-days":y.durationDays,operand:y.operation}:void 0,attributes:b!==void 0&&b.length>0?O(b):void 0,resources:x.map(({resourceType:e,title:t,name:n,category:r,type:i,purpose:a})=>({type:e,title:r?`${r} - ${n}`:a?`${a} - ${n}`:t||n||i||``})),rows:S.map(({resourceType:e,title:t,name:n,category:r,type:i,purpose:a})=>({type:e,title:r?`${r} - ${n}`:a?`${a} - ${n}`:t||n||i||``}))}))),Ye.length>0&&L.includes(`assessmentTemplates`)&&(Q[`assessment-templates`]=Ye.map(({title:e,description:t,sections:n,status:r,source:i,creator:a,isLocked:o,isArchived:s,createdAt:c,retentionSchedule:l})=>({title:e,description:t,sections:n.map(({title:e,questions:t})=>({title:e,questions:t.map(({title:e,type:t,subType:n,placeholder:r,description:i,isRequired:a,referenceId:o,displayLogic:s,riskLogic:c,riskCategories:l,riskFramework:u,answerOptions:d,allowedMimeTypes:f,allowSelectOther:p,syncModel:m,syncColumn:h,attributeKey:g,requireRiskEvaluation:_,requireRiskMatrixEvaluation:v})=>{let y=s?j(s):void 0;return{title:e,type:t,"sub-type":n,placeholder:r,description:i,"is-required":a,"reference-id":o,"display-logic":y&&Object.keys(y).length>0?{action:y.action,rule:y.rule?{"depends-on-question-reference-id":y.rule.dependsOnQuestionReferenceId,"comparison-operator":y.rule.comparisonOperator,"comparison-operands":`comparisonOperands`in y.rule?y.rule.comparisonOperands:void 0}:void 0,"nested-rule":y.nestedRule?{"logic-operator":y.nestedRule.logicOperator,rules:(y.nestedRule.rules||[]).map(e=>({"depends-on-question-reference-id":e.dependsOnQuestionReferenceId,"comparison-operator":e.comparisonOperator,"comparison-operands":`comparisonOperands`in e?e.comparisonOperands:void 0}))}:void 0}:void 0,"risk-logic":c.map(e=>{let t=M(e);return{"risk-level":t.riskAssignment?.riskLevelId,"risk-matrix-row":t.riskAssignment?.riskMatrixRowId,"risk-matrix-column":t.riskAssignment?.riskMatrixColumnId,"comparison-operands":t.comparisonOperands,"comparison-operator":t.comparisonOperator}}),"risk-categories":l.map(({title:e})=>e),"risk-framework":u?.title,"answer-options":d.map(({value:e})=>({value:e})),"allowed-mime-types":f,"allow-select-other":p,"sync-model":m||void 0,"sync-column":h||void 0,"attribute-key":g?.name,"require-risk-evaluation":_,"require-risk-matrix-evaluation":v}})})),status:r,source:i,creator:a?.email,locked:o,archived:s,"created-at":c||void 0,"retention-schedule":l?{type:l.type,"duration-days":l.durationDays,operand:l.operation}:void 0}))),Qe.length>0&&L.includes(`systemDiscovery`)&&(Q[`system-discovery`]=Qe.map(({title:e,resourceId:t,suggestedCatalog:{title:n},plugin:{dataSilo:{title:r}},country:i,countrySubDivision:a,plaintextContext:o,containsSensitiveData:s,status:c})=>({title:e,resourceId:t,suggestedCatalog:n,plugin:r,country:i||void 0,countrySubDivision:a||void 0,plaintextContext:o,containsSensitiveData:s,status:c}))),Fe.length>0&&L.includes(`prompts`)&&(Q.prompts=Fe.map(({title:e,content:t})=>({title:e,content:t}))),Ie.length>0&&L.includes(`promptPartials`)&&(Q[`prompt-partials`]=Ie.map(({title:e,content:t})=>({title:e,content:t}))),Le.length>0&&L.includes(`promptGroups`)&&(Q[`prompt-groups`]=Le.map(({title:e,description:t,prompts:n})=>({title:e,description:t,prompts:n.map(({title:e})=>e)}))),Ue.length>0&&L.includes(`teams`)&&(Q.teams=Ue.map(({name:e,description:t,ssoDepartment:n,ssoGroup:r,ssoTitle:i,users:a,scopes:o,parentTeam:s})=>({name:e,description:t,"sso-department":n||void 0,"sso-group":r||void 0,"sso-title":i||void 0,"parent-team-name":s?.name,users:a.map(({email:e})=>e),scopes:o.map(({name:e})=>e)}))),V.length>0&&L.includes(`dataSubjects`)&&(Q[`data-subjects`]=V.map(({type:e,title:t,active:n,adminDashboardDefaultSilentMode:r,supportsAuthorizedAgent:i,actions:a})=>({type:e,title:t?.defaultMessage,active:n,adminDashboardDefaultSilentMode:r,supportsAuthorizedAgent:i,actions:a.map(({type:e})=>e)}))),We.length>0&&(Q.policies=We.map(({title:e,type:t,versions:n,disabledLocales:r})=>({title:e?.defaultMessage,type:t,content:n?.[0]?.content?.defaultMessage,disabledLocales:r}))),Ke.length>0&&(Q.messages=Ke.map(({id:e,defaultMessage:t,targetReactIntlId:n,description:r,translations:i})=>({id:e,defaultMessage:t,description:r,targetReactIntlId:n||void 0,translations:i.reduce((e,{locale:t,value:n})=>Object.assign(e,{[t]:n}),{})}))),Ge.length>0){let e=Ge[0];Q[`privacy-center`]={isDisabled:e.isDisabled,showPrivacyRequestButton:e.showPrivacyRequestButton,showPolicies:e.showPolicies,showTrackingTechnologies:e.showTrackingTechnologies,showCookies:e.showCookies,showDataFlows:e.showDataFlows,showConsentManager:e.showConsentManager,showManageYourPrivacy:e.showManageYourPrivacy,showMarketingPreferences:e.showMarketingPreferences,locales:e.locales,defaultLocale:e.defaultLocale,preferBrowserDefaultLocale:e.preferBrowserDefaultLocale,supportEmail:e.supportEmail||void 0,replyToEmail:e.replyToEmail||void 0,useNoReplyEmailAddress:e.useNoReplyEmailAddress,useCustomEmailDomain:e.useCustomEmailDomain,transformAccessReportJsonToCsv:e.transformAccessReportJsonToCsv,home:e.home||void 0,expandSideMenuByDefault:e.expandSideMenuByDefault,workflowsCustomFieldsRequired:e.workflowsCustomFieldsRequired,footerLayout:e.footerLayout,...e.childOrganizations.length>0?{displayedChildOrganizationUris:e.childOrganizations.map(e=>e.uri)}:{},...e.footerLinks.length>0?{footerLinks:[...e.footerLinks].sort((e,t)=>e.displayOrder-t.displayOrder).map(e=>({title:e.title.defaultMessage,...e.url?{url:e.url}:{},...e.iconOnly?{iconOnly:e.iconOnly}:{}}))}:{},theme:e.theme}}if(Ae.length>0&&L.includes(`businessEntities`)&&(Q[`business-entities`]=Ae.map(({title:e,description:t,address:n,headquarterCountry:r,headquarterSubDivision:i,dataProtectionOfficerName:a,dataProtectionOfficerEmail:o,attributeValues:s})=>({title:e,description:t||void 0,address:n||void 0,headquarterCountry:r||void 0,headquarterSubDivision:i||void 0,dataProtectionOfficerName:a||void 0,dataProtectionOfficerEmail:o||void 0,attributes:s!==void 0&&s.length>0?O(s):void 0}))),je.length>0&&L.includes(`processingActivities`)&&(Q[`processing-activities`]=je.map(({title:e,description:t,securityMeasureDetails:n,controllerships:r,storageRegions:i,transferRegions:o,retentionType:s,retentionPeriod:c,dataProtectionImpactAssessmentLink:l,dataProtectionImpactAssessmentStatus:u,attributeValues:d,dataSilos:f,dataSubjects:p,teams:m,owners:h,processingPurposeSubCategories:g,dataSubCategories:_,saaSCategories:v})=>({title:e,description:t,securityMeasureDetails:n??void 0,controllerships:r.length>0?r:void 0,storageRegions:i.length>0?k(i):void 0,transferRegions:o.length>0?k(o):void 0,retentionType:s,retentionPeriod:s===a.StatedPeriod?c:void 0,dataProtectionImpactAssessmentLink:l??void 0,dataProtectionImpactAssessmentStatus:u,attributes:d!==void 0&&d.length>0?O(d):void 0,dataSiloTitles:f.length>0?f.map(({title:e})=>e):void 0,dataSubjectTypes:p.length>0?p.map(({type:e})=>e):void 0,teamNames:m.length>0?m.map(({name:e})=>e):void 0,ownerEmails:h.length>0?h.map(({email:e})=>e):void 0,processingSubPurposes:g.length>0?g.map(({name:e,purpose:t})=>({purpose:t,...e?{name:e}:{}})):void 0,dataSubCategories:_.length>0?_.map(({name:e,category:t})=>({category:t,...e?{name:e}:{}})):void 0,saaSCategories:v.length>0?v.map(({title:e})=>e):void 0}))),ke.length>0&&L.includes(`actions`)&&(Q.actions=ke.map(({type:e,skipSecondaryIfNoFiles:t,skipDownloadableStep:n,requiresReview:r,regionList:a,regionDetectionMethod:o,waitingPeriod:s})=>({type:e,...e===i.Erasure?{skipSecondaryIfNoFiles:t,skipDownloadableStep:n}:{},requiresReview:r,waitingPeriod:s,regionDetectionMethod:o,regionList:a.length>0?a:void 0}))),Oe.length>0&&L.includes(`identifiers`)&&(Q.identifiers=Oe.map(({name:e,type:t,regex:n,selectOptions:r,privacyCenterVisibility:i,isRequiredInForm:a,placeholder:o,displayTitle:s,dataSubjects:c,displayDescription:l,displayOrder:u,isUniqueOnPreferenceStore:d})=>({name:e,type:t,regex:n,selectOptions:r.length>0?r:void 0,privacyCenterVisibility:i.length>0?i:void 0,isRequiredInForm:a,placeholder:o||void 0,dataSubjects:c.length>0?c.map(({type:e})=>e):void 0,displayTitle:s?.defaultMessage,displayDescription:l?.defaultMessage,displayOrder:u,isUniqueOnPreferenceStore:d}))),Ve.length>0&&L.includes(`actionItems`)&&(Q[`action-items`]=Ve.map(({teams:e,users:t,customerExperienceActionItemIds:[n],dueDate:r,priority:i,resolved:a,collections:o,notes:s,link:c,title:l,type:u,attributeValues:d})=>({teams:e.map(({name:e})=>e),users:t.map(({email:e})=>e),dueDate:r||void 0,title:l,notes:s,customerExperienceActionItemId:n,collections:o.map(({title:e})=>e),link:c,priority:i||void 0,resolved:a,type:u,attributes:d!==void 0&&d.length>0?O(d):void 0}))),He.length>0&&L.includes(`actionItemCollections`)&&(Q[`action-item-collections`]=He.map(({title:e,description:t,hidden:n,productLine:r})=>({title:e,description:t||void 0,hidden:n,productLine:r}))),Re.length>0&&L.includes(`vendors`)&&(Q.vendors=Re.map(({title:e,description:t,dataProcessingAgreementLink:n,contactName:r,contactPhone:i,address:a,headquarterCountry:o,headquarterSubDivision:s,websiteUrl:c,businessEntity:l,teams:u,owners:d,attributeValues:f})=>({title:e,description:t||void 0,dataProcessingAgreementLink:n||void 0,contactName:r||void 0,contactPhone:i||void 0,address:a||void 0,headquarterCountry:o||void 0,headquarterSubDivision:s||void 0,websiteUrl:c||void 0,businessEntity:l?.title,teams:u&&u.length>0?u.map(({name:e})=>e):void 0,owners:d&&d.length>0?d.map(({email:e})=>e):void 0,attributes:f!==void 0&&f.length>0?O(f):void 0}))),ze.length>0&&L.includes(`dataCategories`)&&(Q[`data-categories`]=ze.map(({name:e,category:t,description:n,regex:r,owners:i,teams:a,attributeValues:o})=>({name:e,category:t,description:n||void 0,regex:r||void 0,owners:i&&i.length>0?i.map(({email:e})=>e):void 0,teams:a&&a.length>0?a.map(({name:e})=>e):void 0,attributes:o!==void 0&&o.length>0?O(o):void 0}))),Be.length>0&&L.includes(`processingPurposes`)&&(Q[`processing-purposes`]=Be.map(({name:e,purpose:t,description:n,owners:r,teams:i,attributeValues:a})=>({name:e,purpose:t,description:n||void 0,owners:r&&r.length>0?r.map(({email:e})=>e):void 0,teams:i&&i.length>0?i.map(({name:e})=>e):void 0,attributes:a!==void 0&&a.length>0?O(a):void 0}))),W.length>0&&L.includes(`dataFlows`)&&(Q[`data-flows`]=W.map(({value:e,type:t,description:n,trackingType:r,service:i,status:a,owners:o,teams:s,attributeValues:c})=>({value:e,type:t,description:n||void 0,trackingPurposes:r,status:a,service:i?.integrationName,owners:o.map(({email:e})=>e),teams:s.map(({name:e})=>e),attributes:c!==void 0&&c.length>0?O(c):void 0}))),G.length>0&&L.includes(`cookies`)&&(Q.cookies=G.map(({name:e,isRegex:t,description:n,trackingPurposes:r,service:i,status:a,owners:o,teams:s,attributeValues:c})=>({name:e,isRegex:t,description:n||void 0,trackingPurposes:r,status:a,service:i?.integrationName,owners:o.map(({email:e})=>e),teams:s.map(({name:e})=>e),attributes:c!==void 0&&c.length>0?O(c):void 0}))),K.length>0&&L.includes(`customFields`)&&(Q.attributes=K.map(({description:e,name:t,type:n,values:r,enabledOn:i=[]})=>({description:e||void 0,resources:i,name:t,type:n,values:r.map(({name:e,color:t,description:n})=>({name:e,color:t||void 0,description:n}))}))),Xe.length>0&&(Q.purposes=Xe.map(({name:e,description:t,trackingType:n,defaultConsent:i,configurable:a,showInConsentManager:o,isActive:s,displayOrder:c,optOutSignals:l,authLevel:u,topics:d,showInPrivacyCenter:f,title:p})=>({name:e,title:p,description:t||void 0,trackingType:n,"default-consent":i,configurable:a,"show-in-consent-manager":o,"show-in-privacy-center":f,"is-active":s,"display-order":c,"opt-out-signals":l.length>0?l:void 0,"auth-level":u||void 0,"preference-topics":d.map(({slug:e,title:t,type:n,color:i,displayDescription:a,defaultConfiguration:o,showInPrivacyCenter:s,preferenceOptionValues:c})=>({slug:e,title:t.defaultMessage,type:n,color:i,description:a.defaultMessage,"default-configuration":o,"show-in-privacy-center":s,options:n===r.Boolean?[]:c.map(({title:e,slug:t})=>({title:e.defaultMessage,slug:t}))}))}))),X.length>0&&L.includes(`workflowConfigs`)){let t=X.map(e=>({title:e.title.defaultMessage,"action-type":e.action.type,...e.internalName?{"internal-name":e.internalName}:{},...e.subtitle?{subtitle:e.subtitle.defaultMessage}:{},...e.description?{description:e.description.defaultMessage}:{},...e.subject?{"data-subject-type":e.subject.type}:{},visibility:e.workflowConfigVisibility,type:e.workflowConfigType,...e.collectDataSubjectRegions?{"collect-data-subject-regions":e.collectDataSubjectRegions}:{},...e.regionList.length>0?{"region-list":e.regionList}:{},...e.expiryTime&&e.expiryTime.length>0?{"expiry-time":e.expiryTime}:{},...e.WorkflowConfigAttributeKeys&&e.WorkflowConfigAttributeKeys.length>0?{"attribute-keys":e.WorkflowConfigAttributeKeys.map(({attributeKey:e})=>e.name)}:{}})),n=c(X,we);for(let t of Object.values(n))if(t.length>1){let n=t[0];e.warn(`Found "${t.length}" workflow configs with the same title, action-type, data-subject-type, and region-list for "${n.title.defaultMessage}" (${n.action.type}). Push will fail until they are disambiguated (for example with unique internal names).`)}t.length>0&&(Q[`workflow-configs`]=t)}if(Y.length>0&&L.includes(`preferenceWorkflowConfigs`)){let t=Y.some(e=>e.workflowConfigId)?await pe(f,{logger:e,workflowConfigType:o.DSR}):[];Q[`preference-workflow-configs`]=Y.map(e=>{let n=Se(e.triggerCondition),r={name:e.name,"data-subject-type":e.subject.type,"is-silent":e.isSilent,"allow-unauthenticated":e.allowUnauthenticated,"is-active":e.isActive,purposes:n};if(e.workflowConfigId){let n=Ce(t,e.workflowConfigId);if(n)return{...r,"workflow-title":n}}return{...r,"action-type":e.action.type,"data-silo-titles":e.dataSilos.length>0?e.dataSilos.map(e=>e.title):void 0}})}if(Ze.length>0&&L.includes(`preferenceOptions`)&&(Q[`preference-options`]=Ze.map(({slug:e,title:t})=>({slug:e,title:t.defaultMessage}))),A.length===0&&q.length>0&&L.includes(`templates`)&&(Q.templates=q.map(({title:e})=>({title:e}))),U.length>0&&L.includes(`enrichers`)&&(Q.enrichers=U.map(({title:e,url:t,type:n,inputIdentifier:r,identifiers:a,actions:o,testRegex:s,dataSubjects:c,expirationDuration:l,lookerQueryTitle:u,transitionRequestStatus:d,phoneNumbers:f,regionList:p})=>({title:e,url:t||void 0,type:n,"input-identifier":r?.name,"output-identifiers":a.map(({name:e})=>e),"privacy-actions":Object.values(i).length===o.length?void 0:o,testRegex:s||void 0,lookerQueryTitle:u||void 0,expirationDuration:parseInt(l,10),transitionRequestStatus:d||void 0,phoneNumbers:f&&f.length>0?f:void 0,regionList:p&&p.length>0?p:void 0,"data-subjects":c.map(({type:e})=>e)}))),H.length>0&&L.includes(`dataSilos`)){let e=l(V,`type`);Q[`data-silos`]=H.map(([{title:t,description:n,url:r,type:i,outerType:a,apiKeys:o,notifyEmailAddress:s,identifiers:c,dependentDataSilos:d,owners:f,country:m,countrySubDivision:h,teams:g,subjectBlocklist:_,isLive:v,promptAVendorEmailSendFrequency:y,promptAVendorEmailSendType:b,promptAVendorEmailIncludeIdentifiersAttachment:x,promptAVendorEmailCompletionLinkType:S,manualWorkRetryFrequency:C,catalog:w,attributeValues:T,discoveredBy:E,businessEntities:D,sombra:ee},te])=>({title:t,description:n,integrationName:i,"outer-type":a||void 0,url:r||void 0,"api-key-title":o[0]?.title,"sombra-id":ee?.id||void 0,"identity-keys":c.filter(({isConnected:e})=>e).map(({name:e})=>e),...d.length>0?{"deletion-dependencies":d.map(({title:e})=>e)}:{},...f.length>0?{owners:f.map(({email:e})=>e)}:{},...g.length>0?{teams:g.map(({name:e})=>e)}:{},...E.length>0?{discoveredBy:E.map(({title:e})=>e)}:{},...D.length>0?{businessEntities:D.map(({title:e})=>e)}:{},country:m||void 0,countrySubDivision:h||void 0,disabled:!v,"data-subjects":_.length>0?p(_.map(({type:e})=>e),e):void 0,...w.hasAvcFunctionality?{"email-settings":{"notify-email-address":s||void 0,"send-frequency":y,"send-type":b,"include-identifiers-attachment":x,"completion-link-type":S,"manual-work-retry-frequency":C}}:{},attributes:T!==void 0&&T.length>0?O(T):void 0,datapoints:te.map(e=>({key:e.name,title:e.title?.defaultMessage,description:e.description?.defaultMessage,owners:e.owners.map(({email:e})=>e),teams:e.teams.map(({name:e})=>e),...e.path.length>0?{path:e.path}:{},...e.dataCollection?.title?{"data-collection-tag":e.dataCollection.title.defaultMessage}:{},...e.dbIntegrationQueries.length>0?{"privacy-action-queries":u(l(e.dbIntegrationQueries,`requestType`),e=>e.suggestedQuery||e.query||void 0)}:{},...e.subDataPoints.length>0?{fields:e.subDataPoints.map(e=>({key:e.name,description:e.description,purposes:e.purposes,categories:e.categories,...z&&e.pendingCategoryGuesses?{"guessed-categories":e.pendingCategoryGuesses.filter(e=>e.status===`PENDING`).map(e=>({category:{name:e.category.name,category:e.category.category},status:e.status,confidence:e.confidence,classifierVersion:e.classifierVersion||void 0}))}:{},"access-request-visibility-enabled":e.accessRequestVisibilityEnabled,"erasure-request-redaction-enabled":e.erasureRequestRedactionEnabled,attributes:e.attributeValues!==void 0&&e.attributeValues.length>0?O(e.attributeValues):void 0})).sort((e,t)=>e.key.localeCompare(t.key))}:{},"privacy-actions":e.actionSettings.filter(({active:e})=>e).map(({type:e})=>e)})).sort((e,t)=>[...e.path??[],e.key].join(`.`).localeCompare([...t.path??[],t.key].join(`.`)))}))}return Q}export{P as i,L as n,F as r,I as t};
58
- //# sourceMappingURL=pullTranscendConfiguration-C21Yq51h.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pullTranscendConfiguration-C21Yq51h.mjs","names":[],"sources":["../src/lib/graphql/gqls/assessmentTemplate.ts","../src/lib/graphql/fetchAllAssessmentTemplates.ts","../src/lib/graphql/pullTranscendConfiguration.ts"],"sourcesContent":["import { ASSESSMENT_SECTION_FIELDS } from '@transcend-io/sdk';\nimport { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\n// orderBy: [\n// { field: createdAt, direction: ASC }\n// { field: name, direction: ASC }\n// ]\nexport const ASSESSMENT_TEMPLATES = gql`\n query TranscendCliAssessmentTemplates(\n $first: Int!\n $offset: Int!\n $filterBy: AssessmentFormTemplateFiltersInput\n ) {\n assessmentFormTemplates(\n first: $first\n offset: $offset\n filterBy: $filterBy\n ) {\n nodes {\n id\n creator {\n id\n email\n name\n }\n lastEditor {\n id\n email\n name\n }\n title\n description\n status\n source\n parentId\n isLocked\n isArchived\n createdAt\n updatedAt\n retentionSchedule {\n id\n type\n durationDays\n operation\n createdAt\n updatedAt\n }\n assessmentEmailSet {\n id\n title\n description\n isDefault\n templates {\n id\n title\n }\n }\n sections {\n ${ASSESSMENT_SECTION_FIELDS}\n }\n }\n }\n }\n`;\n","import {\n AssessmentFormTemplateSource,\n AssessmentFormTemplateStatus,\n} from '@transcend-io/privacy-types';\nimport {\n makeGraphQLRequest,\n type AssessmentSection,\n type RetentionSchedule,\n type UserPreview,\n} from '@transcend-io/sdk';\nimport { GraphQLClient } from 'graphql-request';\n\nimport { logger } from '../../logger.js';\nimport { ASSESSMENT_TEMPLATES } from './gqls/index.js';\n\n/**\n * Represents an assessment template with various properties and metadata.\n */\nexport interface AssessmentTemplate {\n /** The ID of the assessment template */\n id: string;\n /** The user who created the assessment template */\n creator: UserPreview;\n /** The user who last edited the assessment template */\n lastEditor: UserPreview;\n /** The title of the assessment template */\n title: string;\n /** The description of the assessment template */\n description: string;\n /** The current status of the assessment template */\n status: AssessmentFormTemplateStatus;\n /** The source fo the form template */\n source: AssessmentFormTemplateSource;\n /** ID of parent template */\n parentId: string;\n /** Indicates if the assessment template is locked */\n isLocked: boolean;\n /** Indicates if the assessment template is archived */\n isArchived: boolean;\n /** The date when the assessment template was created */\n createdAt: string;\n /** The date when the assessment template was last updated */\n updatedAt: string;\n /** The retention schedule of the assessment template */\n retentionSchedule?: RetentionSchedule;\n /** The sections of the assessment template */\n sections: AssessmentSection[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all assessment templates in the organization\n *\n * @param client - GraphQL client\n * @returns All assessment templates in the organization\n */\nexport async function fetchAllAssessmentTemplates(\n client: GraphQLClient,\n): Promise<AssessmentTemplate[]> {\n const assessmentTemplates: AssessmentTemplate[] = [];\n let offset = 0;\n\n let shouldContinue = false;\n do {\n const {\n assessmentFormTemplates: { nodes },\n } = await makeGraphQLRequest<{\n /** Templates */\n assessmentFormTemplates: {\n /** Nodes */\n nodes: AssessmentTemplate[];\n };\n }>(client, ASSESSMENT_TEMPLATES, {\n variables: { first: PAGE_SIZE, offset },\n logger,\n });\n assessmentTemplates.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return assessmentTemplates.sort((a, b) => a.title.localeCompare(b.title));\n}\n","import { LocaleValue } from '@transcend-io/internationalization';\nimport {\n RequestAction,\n ConsentTrackerStatus,\n ActionItemCode,\n RetentionType,\n PreferenceTopicType,\n WorkflowConfigType,\n type ConsentThemeInput,\n type ConsentVariantInput,\n} from '@transcend-io/privacy-types';\nimport {\n fetchAllActionItemCollections,\n fetchAllActionItems,\n fetchAllActions,\n fetchAllAssessments,\n fetchAllAttributes,\n fetchAllBusinessEntities,\n fetchAllCookies,\n fetchAllDataCategories,\n fetchAllDataFlows,\n fetchAllPolicies,\n fetchAllPrivacyCenters,\n fetchAllProcessingPurposes,\n fetchAllSiloDiscoveryResults,\n fetchAllTemplates,\n fetchConsentManager,\n fetchConsentManagerExperiences,\n fetchConsentVariants,\n fetchConsentThemes,\n fetchConsentManagerTheme,\n fetchAllEnrichers,\n fetchAllIdentifiers,\n fetchAllMessages,\n fetchAllPromptGroups,\n fetchAllPromptPartials,\n fetchAllProcessingActivities,\n fetchAllPrompts,\n fetchAllPurposesAndPreferences,\n fetchAllConsentWorkflowTriggers,\n fetchAllPreferenceOptionValues,\n fetchAllWorkflowConfigs,\n fetchPartitions,\n fetchAllTeams,\n fetchAllVendors,\n fetchApiKeys,\n formatAttributeValues,\n formatRegions,\n parseAssessmentDisplayLogic,\n parseAssessmentRiskLogic,\n parsePurposesFromTriggerCondition,\n resolveWorkflowTitleFromId,\n convertToDataSubjectAllowlist,\n fetchAllDataSubjects,\n fetchEnrichedDataSilos,\n workflowConfigMatchKey,\n type AssessmentRule,\n} from '@transcend-io/sdk';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { flatten, groupBy, keyBy, mapValues } from 'lodash-es';\n\n/* eslint-disable max-lines */\nimport {\n TranscendInput,\n ApiKeyInput,\n DataSiloInput,\n AttributeInput,\n ActionInput,\n IdentifierInput,\n BusinessEntityInput,\n EnricherInput,\n PromptGroupInput,\n DataFlowInput,\n PromptPartialInput,\n DataSubjectInput,\n CookieInput,\n PromptInput,\n DatapointInput,\n FieldInput,\n ProcessingPurposeInput,\n ProcessingActivityInput,\n DataCategoryInput,\n VendorInput,\n PolicyInput,\n IntlMessageInput,\n ActionItemInput,\n TeamInput,\n ActionItemCollectionInput,\n AssessmentInput,\n AssessmentTemplateInput,\n AssessmentSectionInput,\n AssessmentSectionQuestionInput,\n RiskLogicInput,\n ConsentPurpose,\n PreferenceWorkflowConfigInput,\n WorkflowConfigInput,\n ConsentPreferenceTopic,\n ConsentPreferenceTopicOptionValue,\n type SiloDiscoveryResultInput,\n} from '../../codecs.js';\nimport { TranscendPullResource } from '../../enums.js';\nimport { logger } from '../../logger.js';\nimport { fetchAllAssessmentTemplates } from './fetchAllAssessmentTemplates.js';\n\nexport const DEFAULT_TRANSCEND_PULL_RESOURCES = [\n TranscendPullResource.DataSilos,\n TranscendPullResource.Enrichers,\n TranscendPullResource.Templates,\n TranscendPullResource.ApiKeys,\n];\n\nexport interface TranscendPullConfigurationInput {\n /** Page size */\n pageSize: number;\n /** Enable debug logs */\n debug: boolean;\n /** The data silo IDs to sync. If empty list, pull all. */\n dataSiloIds: string[];\n /** Resources to pull in */\n resources?: TranscendPullResource[];\n /** The data silo types to sync.If empty list, pull all. */\n integrationNames: string[];\n /** The tracker statuses to pull */\n trackerStatuses?: ConsentTrackerStatus[];\n /** Skip fetching of datapoints */\n skipDatapoints?: boolean;\n /** Skip fetching of subdatapoints */\n skipSubDatapoints?: boolean;\n /** When true, metadata around guessed data categories should be included */\n includeGuessedCategories?: boolean;\n}\n\n/**\n * Pull a yaml configuration from Transcend\n *\n * @param client - GraphQL client\n * @param dataSiloIds - The data silos to sync. If empty list, pull all.\n * @returns The configuration\n */\nexport async function pullTranscendConfiguration(\n client: GraphQLClient,\n {\n dataSiloIds,\n integrationNames,\n debug,\n resources = DEFAULT_TRANSCEND_PULL_RESOURCES,\n pageSize,\n skipDatapoints,\n includeGuessedCategories,\n skipSubDatapoints,\n trackerStatuses = Object.values(ConsentTrackerStatus),\n }: TranscendPullConfigurationInput,\n): Promise<TranscendInput> {\n if (dataSiloIds.length > 0 && integrationNames.length > 0) {\n throw new Error('Only 1 of integrationNames OR dataSiloIds can be provided');\n }\n\n logger.info(colors.magenta(`Fetching data with page size ${pageSize}...`));\n\n // Fetch all data, but only conditional fetch data that is requested\n const [\n dataSubjects,\n apiKeyTitleMap,\n dataSilos,\n enrichers,\n dataFlows,\n cookies,\n attributes,\n templates,\n identifiers,\n actions,\n businessEntities,\n processingActivities,\n consentManager,\n consentManagerExperiences,\n consentVariants,\n consentThemes,\n prompts,\n promptPartials,\n promptGroups,\n vendors,\n dataCategories,\n processingPurposes,\n actionItems,\n actionItemCollections,\n teams,\n policies,\n privacyCenters,\n messages,\n partitions,\n assessments,\n assessmentTemplates,\n purposes,\n preferenceWorkflowConfigs,\n workflowConfigs,\n preferenceOptionValues,\n siloDiscoveryResults,\n ] = await Promise.all([\n // Grab all data subjects in the organization\n resources.includes(TranscendPullResource.DataSilos) ||\n resources.includes(TranscendPullResource.DataSubjects)\n ? fetchAllDataSubjects(client, { logger })\n : [],\n // Grab API keys\n resources.includes(TranscendPullResource.ApiKeys)\n ? fetchApiKeys(client, { fetchAll: true, logger })\n : [],\n // Fetch the data silos\n resources.includes(TranscendPullResource.DataSilos)\n ? fetchEnrichedDataSilos(client, {\n ids: dataSiloIds,\n integrationNames,\n pageSize,\n debug,\n includeGuessedCategories,\n skipDatapoints,\n skipSubDatapoints,\n logger,\n })\n : [],\n // Fetch enrichers\n resources.includes(TranscendPullResource.Enrichers)\n ? fetchAllEnrichers(client, { logger })\n : [],\n // Fetch data flows\n resources.includes(TranscendPullResource.DataFlows)\n ? [\n ...(trackerStatuses.includes(ConsentTrackerStatus.Live)\n ? await fetchAllDataFlows(client, {\n logger,\n filterBy: { status: ConsentTrackerStatus.Live },\n })\n : []),\n ...(trackerStatuses.includes(ConsentTrackerStatus.NeedsReview)\n ? await fetchAllDataFlows(client, {\n logger,\n filterBy: { status: ConsentTrackerStatus.NeedsReview },\n })\n : []),\n ]\n : [],\n // Fetch data flows\n resources.includes(TranscendPullResource.Cookies)\n ? [\n ...(trackerStatuses.includes(ConsentTrackerStatus.Live)\n ? await fetchAllCookies(client, {\n logger,\n filterBy: { status: ConsentTrackerStatus.Live },\n })\n : []),\n ...(trackerStatuses.includes(ConsentTrackerStatus.NeedsReview)\n ? await fetchAllCookies(client, {\n logger,\n filterBy: { status: ConsentTrackerStatus.NeedsReview },\n })\n : []),\n ]\n : [],\n // Fetch attributes\n resources.includes(TranscendPullResource.Attributes)\n ? fetchAllAttributes(client, { logger })\n : [],\n // Fetch email templates\n resources.includes(TranscendPullResource.Templates)\n ? fetchAllTemplates(client, { logger })\n : [],\n // Fetch identifiers\n resources.includes(TranscendPullResource.Identifiers)\n ? fetchAllIdentifiers(client, { logger })\n : [],\n // Fetch actions\n resources.includes(TranscendPullResource.Actions) ? fetchAllActions(client, { logger }) : [],\n // Fetch business entities\n resources.includes(TranscendPullResource.BusinessEntities)\n ? fetchAllBusinessEntities(client, { logger })\n : [],\n // Fetch processing activities\n resources.includes(TranscendPullResource.ProcessingActivities)\n ? fetchAllProcessingActivities(client, { logger })\n : [],\n // Fetch consent manager\n resources.includes(TranscendPullResource.ConsentManager)\n ? fetchConsentManager(client, { logger })\n : undefined,\n // Fetch consent manager experiences\n resources.includes(TranscendPullResource.ConsentManager)\n ? fetchConsentManagerExperiences(client, { logger })\n : [],\n // Fetch consent manager consent variants\n resources.includes(TranscendPullResource.ConsentManager)\n ? fetchConsentVariants(client, { logger })\n : [],\n // Fetch consent manager consent themes\n resources.includes(TranscendPullResource.ConsentManager)\n ? fetchConsentThemes(client, { logger })\n : [],\n // Fetch prompts\n resources.includes(TranscendPullResource.Prompts) ? fetchAllPrompts(client, { logger }) : [],\n // Fetch promptPartials\n resources.includes(TranscendPullResource.PromptPartials)\n ? fetchAllPromptPartials(client, { logger })\n : [],\n // Fetch promptGroups\n resources.includes(TranscendPullResource.PromptGroups)\n ? fetchAllPromptGroups(client, { logger })\n : [],\n // Fetch vendors\n resources.includes(TranscendPullResource.Vendors) ? fetchAllVendors(client, { logger }) : [],\n // Fetch dataCategories\n resources.includes(TranscendPullResource.DataCategories)\n ? fetchAllDataCategories(client, { logger })\n : [],\n // Fetch dataCategories\n resources.includes(TranscendPullResource.ProcessingPurposes)\n ? fetchAllProcessingPurposes(client, { logger })\n : [],\n // Fetch actionItems\n resources.includes(TranscendPullResource.ActionItems)\n ? fetchAllActionItems(client, {\n logger,\n filterBy: { type: [ActionItemCode.Onboarding] },\n })\n : [],\n // Fetch actionItemCollections\n resources.includes(TranscendPullResource.ActionItemCollections)\n ? fetchAllActionItemCollections(client, { logger })\n : [],\n // Fetch teams\n resources.includes(TranscendPullResource.Teams) ? fetchAllTeams(client, { logger }) : [],\n // Fetch policies\n resources.includes(TranscendPullResource.Policies) ? fetchAllPolicies(client, { logger }) : [],\n // Fetch privacy centers\n resources.includes(TranscendPullResource.PrivacyCenters)\n ? fetchAllPrivacyCenters(client, { logger })\n : [],\n // Fetch messages\n resources.includes(TranscendPullResource.Messages) ? fetchAllMessages(client, { logger }) : [],\n // Fetch partitions\n resources.includes(TranscendPullResource.Partitions) ? fetchPartitions(client, { logger }) : [],\n // Fetch assessments\n resources.includes(TranscendPullResource.Assessments)\n ? fetchAllAssessments(client, { logger })\n : [],\n // Fetch assessmentTemplates\n resources.includes(TranscendPullResource.AssessmentTemplates)\n ? fetchAllAssessmentTemplates(client)\n : [],\n // Fetch purpose and preferences\n resources.includes(TranscendPullResource.Purposes)\n ? fetchAllPurposesAndPreferences(client, { logger })\n : [],\n resources.includes(TranscendPullResource.PreferenceWorkflowConfigs)\n ? fetchAllConsentWorkflowTriggers(client, { logger })\n : [],\n resources.includes(TranscendPullResource.WorkflowConfigs)\n ? fetchAllWorkflowConfigs(client, {\n logger,\n workflowConfigType: WorkflowConfigType.DSR,\n })\n : [],\n resources.includes(TranscendPullResource.PreferenceOptions)\n ? fetchAllPreferenceOptionValues(client, { logger })\n : [],\n // Fetch silo discovery results\n resources.includes(TranscendPullResource.SystemDiscovery)\n ? fetchAllSiloDiscoveryResults(client, { logger })\n : [],\n ]);\n\n const consentManagerTheme =\n resources.includes(TranscendPullResource.ConsentManager) && consentManager\n ? await fetchConsentManagerTheme(client, {\n logger,\n filterBy: { airgapBundleId: consentManager.id },\n })\n : undefined;\n\n const result: TranscendInput = {};\n\n // Save API keys\n const apiKeyTitles = flatten(dataSilos.map(([{ apiKeys }]) => apiKeys.map(({ title }) => title)));\n const relevantApiKeys = Object.values(apiKeyTitleMap).filter(({ title }) =>\n resources.includes(TranscendPullResource.ApiKeys) ? true : apiKeyTitles.includes(title),\n );\n if (relevantApiKeys.length > 0 && resources.includes(TranscendPullResource.ApiKeys)) {\n result['api-keys'] = relevantApiKeys.map(\n ({ title }): ApiKeyInput => ({\n title,\n }),\n );\n }\n\n // Save Partitions\n if (partitions.length > 0 && resources.includes(TranscendPullResource.Partitions)) {\n result.partitions = partitions.map(({ name, partition }) => ({\n name,\n partition,\n }));\n }\n\n // Save Consent Manager\n if (consentManager && resources.includes(TranscendPullResource.ConsentManager)) {\n result['consent-manager'] = {\n bundleUrls: {\n TEST: consentManager.testBundleURL,\n PRODUCTION: consentManager.bundleURL,\n },\n domains: consentManager.configuration.domains || undefined,\n partition: consentManager.configuration.partition || undefined,\n consentPrecedence: consentManager.configuration.consentPrecedence || undefined,\n unknownRequestPolicy: consentManager.configuration.unknownRequestPolicy || undefined,\n unknownCookiePolicy: consentManager.configuration.unknownCookiePolicy || undefined,\n syncEndpoint: consentManager.configuration.syncEndpoint || undefined,\n telemetryPartitioning: consentManager.configuration.telemetryPartitioning || undefined,\n signedIabAgreement: consentManager.configuration.signedIabAgreement || undefined,\n // TODO: https://transcend.height.app/T-23919 - reconsider simpler yml shape\n syncGroups: consentManager.configuration.syncGroups || undefined,\n theme: !consentManagerTheme\n ? undefined\n : {\n primaryColor: consentManagerTheme.primaryColor || undefined,\n fontColor: consentManagerTheme.fontColor || undefined,\n privacyPolicy: consentManagerTheme.privacyPolicy || undefined,\n prompt: consentManagerTheme.prompt,\n },\n experiences: consentManagerExperiences.map((experience) => ({\n name: experience.name,\n displayName: experience.displayName || undefined,\n regions: experience.regions.map((region) => ({\n countrySubDivision: region.countrySubDivision || undefined,\n country: region.country || undefined,\n })),\n onConsentExpiry: experience.onConsentExpiry,\n consentExpiry: experience.consentExpiry,\n operator: experience.operator,\n displayPriority: experience.displayPriority,\n viewState: experience.viewState,\n purposes: experience.purposes.map((purpose) => ({\n trackingType: purpose.trackingType,\n })),\n optedOutPurposes: experience.optedOutPurposes.map((purpose) => ({\n trackingType: purpose.trackingType,\n })),\n browserLanguages: experience.browserLanguages,\n browserTimeZones: experience.browserTimeZones,\n consentUiVariantSlug: experience.consentUiVariant?.slug,\n })),\n consentVariants: consentVariants.map(\n (variant): ConsentVariantInput => ({\n id: variant.id,\n name: variant.name,\n slug: variant.slug,\n // Backend returns null when unset; omit from yaml rather than writing null\n description: variant.description || undefined,\n configuration: JSON.stringify(variant.configuration),\n locales: variant.locales as LocaleValue[],\n status: variant.status,\n userFlow: variant.userFlow || undefined,\n themeSlug: variant.theme?.slug || undefined,\n }),\n ),\n consentThemes: consentThemes.map(\n (theme): ConsentThemeInput => ({\n id: theme.id,\n name: theme.name,\n slug: theme.slug,\n configuration: JSON.stringify(theme.configuration),\n }),\n ),\n };\n }\n\n // Save assessments\n if (assessments.length > 0 && resources.includes(TranscendPullResource.Assessments)) {\n result.assessments = assessments.map(\n ({\n title,\n assessmentGroup,\n sections,\n creator,\n description,\n status,\n assignees,\n externalAssignees,\n reviewers,\n isLocked,\n isArchived,\n isExternallyCreated,\n dueDate,\n createdAt,\n assignedAt,\n submittedAt,\n approvedAt,\n rejectedAt,\n titleIsInternal,\n retentionSchedule,\n attributeValues,\n resources,\n syncedRows,\n }): AssessmentInput => ({\n title,\n group: assessmentGroup.title,\n sections: sections.map(\n ({\n title,\n status,\n questions,\n assignees,\n isReviewed,\n externalAssignees,\n }): AssessmentSectionInput => ({\n title,\n status,\n questions: questions.map(\n ({\n title,\n type,\n subType,\n placeholder,\n description,\n isRequired,\n referenceId,\n displayLogic,\n riskLogic,\n riskCategories,\n riskFramework,\n answerOptions,\n selectedAnswers,\n allowedMimeTypes,\n allowSelectOther,\n syncModel,\n syncColumn,\n attributeKey,\n requireRiskEvaluation,\n requireRiskMatrixEvaluation,\n }): AssessmentSectionQuestionInput => {\n const displayLogicParsed = displayLogic\n ? parseAssessmentDisplayLogic(displayLogic)\n : undefined;\n return {\n title,\n type,\n 'sub-type': subType,\n placeholder,\n description,\n 'is-required': isRequired,\n 'reference-id': referenceId,\n 'display-logic':\n displayLogicParsed && Object.keys(displayLogicParsed).length > 0\n ? {\n action: displayLogicParsed.action!,\n rule: displayLogicParsed.rule\n ? {\n 'depends-on-question-reference-id':\n displayLogicParsed.rule.dependsOnQuestionReferenceId,\n 'comparison-operator': displayLogicParsed.rule.comparisonOperator,\n 'comparison-operands':\n // Safely access property with a check\n 'comparisonOperands' in displayLogicParsed.rule\n ? displayLogicParsed.rule.comparisonOperands\n : undefined,\n }\n : undefined,\n 'nested-rule': displayLogicParsed.nestedRule\n ? {\n 'logic-operator': displayLogicParsed.nestedRule.logicOperator,\n rules: (displayLogicParsed.nestedRule.rules || []).map(\n (rule: AssessmentRule) => ({\n 'depends-on-question-reference-id':\n rule.dependsOnQuestionReferenceId,\n 'comparison-operator': rule.comparisonOperator,\n 'comparison-operands':\n // Safely access property on the nested rule\n 'comparisonOperands' in rule\n ? rule.comparisonOperands\n : undefined,\n }),\n ),\n }\n : undefined,\n }\n : undefined,\n 'risk-logic': riskLogic.map((logic): RiskLogicInput => {\n const parsed = parseAssessmentRiskLogic(logic);\n return {\n 'risk-level': parsed.riskAssignment?.riskLevelId,\n 'comparison-operands': parsed.comparisonOperands,\n 'comparison-operator': parsed.comparisonOperator,\n };\n }),\n 'risk-categories': riskCategories.map(({ title }) => title),\n 'risk-framework': riskFramework?.title,\n 'answer-options': answerOptions.map(({ value }) => ({\n value,\n })),\n 'selected-answers': selectedAnswers.map(({ value }) => value),\n 'allowed-mime-types': allowedMimeTypes,\n 'allow-select-other': allowSelectOther,\n 'sync-model': syncModel || undefined,\n 'sync-column': syncColumn || undefined,\n 'attribute-key': attributeKey?.name,\n 'require-risk-evaluation': requireRiskEvaluation,\n 'require-risk-matrix-evaluation': requireRiskMatrixEvaluation,\n };\n },\n ),\n assignees: assignees.map(({ email }) => email),\n 'external-assignees': externalAssignees.map(({ email }) => email),\n 'is-reviewed': isReviewed,\n }),\n ),\n creator: creator?.email,\n description,\n status,\n assignees: assignees.map(({ email }) => email),\n 'external-assignees': externalAssignees.map(({ email }) => email),\n reviewers: reviewers.map(({ email }) => email),\n locked: isLocked,\n archived: isArchived,\n external: isExternallyCreated,\n 'title-is-internal': titleIsInternal,\n 'due-date': dueDate || undefined,\n 'created-at': createdAt || undefined,\n 'assigned-at': assignedAt || undefined,\n 'submitted-at': submittedAt || undefined,\n 'approved-at': approvedAt || undefined,\n 'rejected-at': rejectedAt || undefined,\n 'retention-schedule': retentionSchedule\n ? {\n type: retentionSchedule.type,\n 'duration-days': retentionSchedule.durationDays,\n operand: retentionSchedule.operation,\n }\n : undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n resources: resources.map(({ resourceType, title, name, category, type, purpose }) => ({\n type: resourceType,\n title: category\n ? `${category} - ${name}`\n : purpose\n ? `${purpose} - ${name}`\n : title || name || type || '',\n })),\n rows: syncedRows.map(({ resourceType, title, name, category, type, purpose }) => ({\n type: resourceType,\n title: category\n ? `${category} - ${name}`\n : purpose\n ? `${purpose} - ${name}`\n : title || name || type || '',\n })),\n }),\n );\n }\n\n // Save assessmentTemplates\n if (\n assessmentTemplates.length > 0 &&\n resources.includes(TranscendPullResource.AssessmentTemplates)\n ) {\n result['assessment-templates'] = assessmentTemplates.map(\n ({\n title,\n description,\n sections,\n status,\n source,\n creator,\n isLocked,\n isArchived,\n createdAt,\n retentionSchedule,\n }): AssessmentTemplateInput => ({\n title,\n description,\n sections: sections.map(\n ({ title, questions }): AssessmentSectionInput => ({\n title,\n questions: questions.map(\n ({\n title,\n type,\n subType,\n placeholder,\n description,\n isRequired,\n referenceId,\n displayLogic,\n riskLogic,\n riskCategories,\n riskFramework,\n answerOptions,\n allowedMimeTypes,\n allowSelectOther,\n syncModel,\n syncColumn,\n attributeKey,\n requireRiskEvaluation,\n requireRiskMatrixEvaluation,\n }): AssessmentSectionQuestionInput => {\n const displayLogicParsed = displayLogic\n ? parseAssessmentDisplayLogic(displayLogic)\n : undefined;\n return {\n title,\n type,\n 'sub-type': subType,\n placeholder,\n description,\n 'is-required': isRequired,\n 'reference-id': referenceId,\n 'display-logic':\n displayLogicParsed && Object.keys(displayLogicParsed).length > 0\n ? {\n action: displayLogicParsed.action!,\n rule: displayLogicParsed.rule\n ? {\n 'depends-on-question-reference-id':\n displayLogicParsed.rule.dependsOnQuestionReferenceId,\n 'comparison-operator': displayLogicParsed.rule.comparisonOperator,\n 'comparison-operands':\n // Safely access property with a check\n 'comparisonOperands' in displayLogicParsed.rule\n ? displayLogicParsed.rule.comparisonOperands\n : undefined,\n }\n : undefined,\n 'nested-rule': displayLogicParsed.nestedRule\n ? {\n 'logic-operator': displayLogicParsed.nestedRule.logicOperator,\n rules: (displayLogicParsed.nestedRule.rules || []).map(\n (rule: AssessmentRule) => ({\n 'depends-on-question-reference-id':\n rule.dependsOnQuestionReferenceId,\n 'comparison-operator': rule.comparisonOperator,\n 'comparison-operands':\n // Safely access property on the nested rule\n 'comparisonOperands' in rule\n ? rule.comparisonOperands\n : undefined,\n }),\n ),\n }\n : undefined,\n }\n : undefined,\n 'risk-logic': riskLogic.map((logic): RiskLogicInput => {\n const parsed = parseAssessmentRiskLogic(logic);\n return {\n 'risk-level': parsed.riskAssignment?.riskLevelId,\n 'risk-matrix-row': parsed.riskAssignment?.riskMatrixRowId,\n 'risk-matrix-column': parsed.riskAssignment?.riskMatrixColumnId,\n 'comparison-operands': parsed.comparisonOperands,\n 'comparison-operator': parsed.comparisonOperator,\n };\n }),\n 'risk-categories': riskCategories.map(({ title }) => title),\n 'risk-framework': riskFramework?.title,\n 'answer-options': answerOptions.map(({ value }) => ({\n value,\n })),\n 'allowed-mime-types': allowedMimeTypes,\n 'allow-select-other': allowSelectOther,\n 'sync-model': syncModel || undefined,\n 'sync-column': syncColumn || undefined,\n 'attribute-key': attributeKey?.name,\n 'require-risk-evaluation': requireRiskEvaluation,\n 'require-risk-matrix-evaluation': requireRiskMatrixEvaluation,\n };\n },\n ),\n }),\n ),\n status,\n source,\n creator: creator?.email,\n locked: isLocked,\n archived: isArchived,\n 'created-at': createdAt || undefined,\n 'retention-schedule': retentionSchedule\n ? {\n type: retentionSchedule.type,\n 'duration-days': retentionSchedule.durationDays,\n operand: retentionSchedule.operation,\n }\n : undefined,\n }),\n );\n }\n\n // Save Silo Discovery Results\n if (\n siloDiscoveryResults.length > 0 &&\n resources.includes(TranscendPullResource.SystemDiscovery)\n ) {\n result['system-discovery'] = siloDiscoveryResults.map(\n ({\n title,\n resourceId,\n suggestedCatalog: { title: suggestedCatalogTitle },\n plugin: {\n dataSilo: { title: dataSiloTitle },\n },\n country,\n countrySubDivision,\n plaintextContext,\n containsSensitiveData,\n status,\n }): SiloDiscoveryResultInput => ({\n title,\n resourceId,\n suggestedCatalog: suggestedCatalogTitle,\n plugin: dataSiloTitle,\n country: country || undefined,\n countrySubDivision: countrySubDivision || undefined,\n plaintextContext,\n containsSensitiveData,\n status,\n }),\n );\n }\n\n // Save prompts\n if (prompts.length > 0 && resources.includes(TranscendPullResource.Prompts)) {\n result.prompts = prompts.map(\n ({ title, content }): PromptInput => ({\n title,\n content,\n }),\n );\n }\n\n // Save promptPartials\n if (promptPartials.length > 0 && resources.includes(TranscendPullResource.PromptPartials)) {\n result['prompt-partials'] = promptPartials.map(\n ({ title, content }): PromptPartialInput => ({\n title,\n content,\n }),\n );\n }\n\n // Save promptGroups\n if (promptGroups.length > 0 && resources.includes(TranscendPullResource.PromptGroups)) {\n result['prompt-groups'] = promptGroups.map(\n ({ title, description, prompts }): PromptGroupInput => ({\n title,\n description,\n prompts: prompts.map(({ title }) => title),\n }),\n );\n }\n\n // Save teams\n if (teams.length > 0 && resources.includes(TranscendPullResource.Teams)) {\n result.teams = teams.map(\n ({\n name,\n description,\n ssoDepartment,\n ssoGroup,\n ssoTitle,\n users,\n scopes,\n parentTeam,\n }): TeamInput => ({\n name,\n description,\n 'sso-department': ssoDepartment || undefined,\n 'sso-group': ssoGroup || undefined,\n 'sso-title': ssoTitle || undefined,\n 'parent-team-name': parentTeam?.name,\n users: users.map(({ email }) => email),\n scopes: scopes.map(({ name }) => name),\n }),\n );\n }\n\n // Save Data Subjects\n if (dataSubjects.length > 0 && resources.includes(TranscendPullResource.DataSubjects)) {\n result['data-subjects'] = dataSubjects.map(\n ({\n type,\n title,\n active,\n adminDashboardDefaultSilentMode,\n supportsAuthorizedAgent,\n actions,\n }): DataSubjectInput => ({\n type,\n title: title?.defaultMessage,\n active,\n adminDashboardDefaultSilentMode,\n supportsAuthorizedAgent,\n actions: actions.map(({ type }) => type),\n }),\n );\n }\n\n // Save privacy policies\n if (policies.length > 0) {\n result.policies = policies.map(\n ({ title, type, versions, disabledLocales }): PolicyInput => ({\n title: title?.defaultMessage,\n type,\n content: versions?.[0]?.content?.defaultMessage,\n disabledLocales,\n }),\n );\n }\n\n // Save messages\n if (messages.length > 0) {\n result.messages = messages.map(\n ({ id, defaultMessage, targetReactIntlId, description, translations }): IntlMessageInput => ({\n id,\n defaultMessage,\n description,\n targetReactIntlId: targetReactIntlId || undefined,\n translations: translations.reduce(\n (acc, { locale, value }) => Object.assign(acc, { [locale]: value }),\n {} as Record<LocaleValue, string>,\n ),\n }),\n );\n }\n\n // Save privacy center\n if (privacyCenters.length > 0) {\n const privacyCenter = privacyCenters[0];\n result['privacy-center'] = {\n isDisabled: privacyCenter.isDisabled,\n showPrivacyRequestButton: privacyCenter.showPrivacyRequestButton,\n showPolicies: privacyCenter.showPolicies,\n showTrackingTechnologies: privacyCenter.showTrackingTechnologies,\n showCookies: privacyCenter.showCookies,\n showDataFlows: privacyCenter.showDataFlows,\n showConsentManager: privacyCenter.showConsentManager,\n showManageYourPrivacy: privacyCenter.showManageYourPrivacy,\n showMarketingPreferences: privacyCenter.showMarketingPreferences,\n locales: privacyCenter.locales,\n defaultLocale: privacyCenter.defaultLocale,\n preferBrowserDefaultLocale: privacyCenter.preferBrowserDefaultLocale,\n supportEmail: privacyCenter.supportEmail || undefined,\n replyToEmail: privacyCenter.replyToEmail || undefined,\n useNoReplyEmailAddress: privacyCenter.useNoReplyEmailAddress,\n useCustomEmailDomain: privacyCenter.useCustomEmailDomain,\n transformAccessReportJsonToCsv: privacyCenter.transformAccessReportJsonToCsv,\n home: privacyCenter.home || undefined,\n expandSideMenuByDefault: privacyCenter.expandSideMenuByDefault,\n workflowsCustomFieldsRequired: privacyCenter.workflowsCustomFieldsRequired,\n footerLayout: privacyCenter.footerLayout,\n ...(privacyCenter.childOrganizations.length > 0\n ? {\n displayedChildOrganizationUris: privacyCenter.childOrganizations.map(\n (child) => child.uri,\n ),\n }\n : {}),\n ...(privacyCenter.footerLinks.length > 0\n ? {\n footerLinks: [...privacyCenter.footerLinks]\n .sort((a, b) => a.displayOrder - b.displayOrder)\n .map((link) => ({\n title: link.title.defaultMessage,\n ...(link.url ? { url: link.url } : {}),\n ...(link.iconOnly ? { iconOnly: link.iconOnly } : {}),\n })),\n }\n : {}),\n theme: privacyCenter.theme,\n };\n }\n\n // Save business entities\n if (businessEntities.length > 0 && resources.includes(TranscendPullResource.BusinessEntities)) {\n result['business-entities'] = businessEntities.map(\n ({\n title,\n description,\n address,\n headquarterCountry,\n headquarterSubDivision,\n dataProtectionOfficerName,\n dataProtectionOfficerEmail,\n attributeValues,\n }): BusinessEntityInput => ({\n title,\n description: description || undefined,\n address: address || undefined,\n headquarterCountry: headquarterCountry || undefined,\n headquarterSubDivision: headquarterSubDivision || undefined,\n dataProtectionOfficerName: dataProtectionOfficerName || undefined,\n dataProtectionOfficerEmail: dataProtectionOfficerEmail || undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save processing activities\n if (\n processingActivities.length > 0 &&\n resources.includes(TranscendPullResource.ProcessingActivities)\n ) {\n result['processing-activities'] = processingActivities.map(\n ({\n title,\n description,\n securityMeasureDetails,\n controllerships,\n storageRegions,\n transferRegions,\n retentionType,\n retentionPeriod,\n dataProtectionImpactAssessmentLink,\n dataProtectionImpactAssessmentStatus,\n attributeValues,\n dataSilos,\n dataSubjects,\n teams,\n owners,\n processingPurposeSubCategories,\n dataSubCategories,\n saaSCategories,\n }): ProcessingActivityInput => ({\n title,\n description,\n securityMeasureDetails: securityMeasureDetails ?? undefined,\n controllerships: controllerships.length > 0 ? controllerships : undefined,\n storageRegions: storageRegions.length > 0 ? formatRegions(storageRegions) : undefined,\n transferRegions: transferRegions.length > 0 ? formatRegions(transferRegions) : undefined,\n retentionType,\n retentionPeriod: retentionType === RetentionType.StatedPeriod ? retentionPeriod : undefined,\n dataProtectionImpactAssessmentLink: dataProtectionImpactAssessmentLink ?? undefined,\n dataProtectionImpactAssessmentStatus,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n dataSiloTitles: dataSilos.length > 0 ? dataSilos.map(({ title }) => title) : undefined,\n dataSubjectTypes:\n dataSubjects.length > 0 ? dataSubjects.map(({ type }) => type) : undefined,\n teamNames: teams.length > 0 ? teams.map(({ name }) => name) : undefined,\n ownerEmails: owners.length > 0 ? owners.map(({ email }) => email) : undefined,\n processingSubPurposes:\n processingPurposeSubCategories.length > 0\n ? processingPurposeSubCategories.map(({ name, purpose }) => ({\n purpose,\n ...(name ? { name } : {}),\n }))\n : undefined,\n dataSubCategories:\n dataSubCategories.length > 0\n ? dataSubCategories.map(({ name, category }) => ({\n category,\n ...(name ? { name } : {}),\n }))\n : undefined,\n saaSCategories:\n saaSCategories.length > 0 ? saaSCategories.map(({ title }) => title) : undefined,\n }),\n );\n }\n\n // Save Actions\n if (actions.length > 0 && resources.includes(TranscendPullResource.Actions)) {\n result.actions = actions.map(\n ({\n type,\n skipSecondaryIfNoFiles,\n skipDownloadableStep,\n requiresReview,\n regionList,\n regionDetectionMethod,\n waitingPeriod,\n }): ActionInput => ({\n type,\n ...(type === RequestAction.Erasure\n ? {\n skipSecondaryIfNoFiles,\n skipDownloadableStep,\n }\n : {}),\n requiresReview,\n waitingPeriod,\n regionDetectionMethod,\n regionList: regionList.length > 0 ? regionList : undefined,\n }),\n );\n }\n\n // Save identifiers\n if (identifiers.length > 0 && resources.includes(TranscendPullResource.Identifiers)) {\n result.identifiers = identifiers.map(\n ({\n name,\n type,\n regex,\n selectOptions,\n privacyCenterVisibility,\n isRequiredInForm,\n placeholder,\n displayTitle,\n dataSubjects,\n displayDescription,\n displayOrder,\n isUniqueOnPreferenceStore,\n }): IdentifierInput => ({\n name,\n type,\n regex,\n selectOptions: selectOptions.length > 0 ? selectOptions : undefined,\n privacyCenterVisibility:\n privacyCenterVisibility.length > 0 ? privacyCenterVisibility : undefined,\n isRequiredInForm,\n placeholder: placeholder || undefined,\n dataSubjects: dataSubjects.length > 0 ? dataSubjects.map(({ type }) => type) : undefined,\n displayTitle: displayTitle?.defaultMessage,\n displayDescription: displayDescription?.defaultMessage,\n displayOrder,\n isUniqueOnPreferenceStore,\n }),\n );\n }\n\n // Save action items\n if (actionItems.length > 0 && resources.includes(TranscendPullResource.ActionItems)) {\n result['action-items'] = actionItems.map(\n ({\n teams,\n users,\n customerExperienceActionItemIds: [customerExperienceActionItemId],\n dueDate,\n priority,\n resolved,\n collections,\n notes,\n link,\n title,\n type,\n attributeValues,\n }): ActionItemInput => ({\n teams: teams.map(({ name }) => name),\n users: users.map(({ email }) => email),\n dueDate: dueDate || undefined,\n title,\n notes,\n customerExperienceActionItemId,\n collections: collections.map(({ title }) => title),\n link,\n priority: priority || undefined,\n resolved,\n type,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save action item collections\n if (\n actionItemCollections.length > 0 &&\n resources.includes(TranscendPullResource.ActionItemCollections)\n ) {\n result['action-item-collections'] = actionItemCollections.map(\n ({ title, description, hidden, productLine }): ActionItemCollectionInput => ({\n title,\n description: description || undefined,\n hidden,\n productLine,\n }),\n );\n }\n\n // Save vendors\n if (vendors.length > 0 && resources.includes(TranscendPullResource.Vendors)) {\n result.vendors = vendors.map(\n ({\n title,\n description,\n dataProcessingAgreementLink,\n contactName,\n contactPhone,\n address,\n headquarterCountry,\n headquarterSubDivision,\n websiteUrl,\n businessEntity,\n teams,\n owners,\n attributeValues,\n }): VendorInput => ({\n title,\n description: description || undefined,\n dataProcessingAgreementLink: dataProcessingAgreementLink || undefined,\n contactName: contactName || undefined,\n contactPhone: contactPhone || undefined,\n address: address || undefined,\n headquarterCountry: headquarterCountry || undefined,\n headquarterSubDivision: headquarterSubDivision || undefined,\n websiteUrl: websiteUrl || undefined,\n businessEntity: businessEntity?.title,\n teams: teams && teams.length > 0 ? teams.map(({ name }) => name) : undefined,\n owners: owners && owners.length > 0 ? owners.map(({ email }) => email) : undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save data categories\n if (dataCategories.length > 0 && resources.includes(TranscendPullResource.DataCategories)) {\n result['data-categories'] = dataCategories.map(\n ({\n name,\n category,\n description,\n regex,\n owners,\n teams,\n attributeValues,\n }): DataCategoryInput => ({\n name,\n category,\n description: description || undefined,\n regex: regex || undefined,\n owners: owners && owners.length > 0 ? owners.map(({ email }) => email) : undefined,\n teams: teams && teams.length > 0 ? teams.map(({ name }) => name) : undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save processing purposes\n if (\n processingPurposes.length > 0 &&\n resources.includes(TranscendPullResource.ProcessingPurposes)\n ) {\n result['processing-purposes'] = processingPurposes.map(\n ({ name, purpose, description, owners, teams, attributeValues }): ProcessingPurposeInput => ({\n name,\n purpose,\n description: description || undefined,\n owners: owners && owners.length > 0 ? owners.map(({ email }) => email) : undefined,\n teams: teams && teams.length > 0 ? teams.map(({ name }) => name) : undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save data flows\n if (dataFlows.length > 0 && resources.includes(TranscendPullResource.DataFlows)) {\n result['data-flows'] = dataFlows.map(\n ({\n value,\n type,\n description,\n trackingType,\n service,\n status,\n owners,\n teams,\n attributeValues,\n }): DataFlowInput => ({\n value,\n type,\n description: description || undefined,\n trackingPurposes: trackingType,\n status,\n service: service?.integrationName,\n owners: owners.map(({ email }) => email),\n teams: teams.map(({ name }) => name),\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save cookies\n if (cookies.length > 0 && resources.includes(TranscendPullResource.Cookies)) {\n result.cookies = cookies.map(\n ({\n name,\n isRegex,\n description,\n trackingPurposes,\n service,\n status,\n owners,\n teams,\n attributeValues,\n }): CookieInput => ({\n name,\n isRegex,\n description: description || undefined,\n trackingPurposes,\n status,\n service: service?.integrationName,\n owners: owners.map(({ email }) => email),\n teams: teams.map(({ name }) => name),\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save attributes\n if (attributes.length > 0 && resources.includes(TranscendPullResource.Attributes)) {\n result.attributes = attributes.map(\n ({ description, name, type, values, enabledOn = [] }): AttributeInput => ({\n description: description || undefined,\n resources: enabledOn,\n name,\n type,\n values: values.map(({ name, color, description }) => ({\n name,\n color: color || undefined,\n description,\n })),\n }),\n );\n }\n\n // save purposes\n if (purposes.length > 0) {\n result.purposes = purposes.map(\n ({\n name,\n description,\n trackingType,\n defaultConsent,\n configurable,\n showInConsentManager,\n isActive,\n displayOrder,\n optOutSignals,\n authLevel,\n topics,\n showInPrivacyCenter,\n title,\n }): ConsentPurpose => ({\n name,\n title,\n description: description || undefined,\n trackingType,\n 'default-consent': defaultConsent,\n configurable,\n 'show-in-consent-manager': showInConsentManager,\n 'show-in-privacy-center': showInPrivacyCenter,\n 'is-active': isActive,\n 'display-order': displayOrder,\n 'opt-out-signals': optOutSignals.length > 0 ? optOutSignals : undefined,\n 'auth-level': authLevel || undefined,\n 'preference-topics': topics.map(\n ({\n slug,\n title,\n type,\n color,\n displayDescription,\n defaultConfiguration,\n showInPrivacyCenter,\n preferenceOptionValues,\n }): ConsentPreferenceTopic => ({\n slug,\n title: title.defaultMessage,\n type,\n color,\n description: displayDescription.defaultMessage,\n 'default-configuration': defaultConfiguration,\n 'show-in-privacy-center': showInPrivacyCenter,\n options:\n type === PreferenceTopicType.Boolean\n ? []\n : preferenceOptionValues.map(({ title, slug }) => ({\n title: title.defaultMessage,\n slug,\n })),\n }),\n ),\n }),\n );\n }\n\n if (workflowConfigs.length > 0 && resources.includes(TranscendPullResource.WorkflowConfigs)) {\n const pulledWorkflowConfigs = workflowConfigs.map(\n (config): WorkflowConfigInput => ({\n title: config.title.defaultMessage,\n 'action-type': config.action.type,\n ...(config.internalName ? { 'internal-name': config.internalName } : {}),\n ...(config.subtitle ? { subtitle: config.subtitle.defaultMessage } : {}),\n ...(config.description ? { description: config.description.defaultMessage } : {}),\n ...(config.subject ? { 'data-subject-type': config.subject.type } : {}),\n visibility: config.workflowConfigVisibility,\n type: config.workflowConfigType,\n ...(config.collectDataSubjectRegions\n ? {\n 'collect-data-subject-regions': config.collectDataSubjectRegions,\n }\n : {}),\n ...(config.regionList.length > 0 ? { 'region-list': config.regionList } : {}),\n ...(config.expiryTime && config.expiryTime.length > 0\n ? { 'expiry-time': config.expiryTime }\n : {}),\n ...(config.WorkflowConfigAttributeKeys && config.WorkflowConfigAttributeKeys.length > 0\n ? {\n 'attribute-keys': config.WorkflowConfigAttributeKeys.map(\n ({ attributeKey }) => attributeKey.name,\n ),\n }\n : {}),\n }),\n );\n // TODO: https://linear.app/transcend/issue/WAL-10312 - remove once internalName is unique in DB\n const configsByMatchKey = groupBy(workflowConfigs, workflowConfigMatchKey);\n for (const configs of Object.values(configsByMatchKey)) {\n if (configs.length > 1) {\n const sample = configs[0];\n logger.warn(\n `Found \"${configs.length}\" workflow configs with the same title, action-type, ` +\n `data-subject-type, and region-list for \"${sample.title.defaultMessage}\" ` +\n `(${sample.action.type}). Push will fail until they are disambiguated ` +\n '(for example with unique internal names).',\n );\n }\n }\n if (pulledWorkflowConfigs.length > 0) {\n result['workflow-configs'] = pulledWorkflowConfigs;\n }\n }\n\n if (\n preferenceWorkflowConfigs.length > 0 &&\n resources.includes(TranscendPullResource.PreferenceWorkflowConfigs)\n ) {\n const needsWorkflowTitles = preferenceWorkflowConfigs.some(\n (trigger) => trigger.workflowConfigId,\n );\n const dsrWorkflows = needsWorkflowTitles\n ? await fetchAllWorkflowConfigs(client, {\n logger,\n workflowConfigType: WorkflowConfigType.DSR,\n })\n : [];\n\n result['preference-workflow-configs'] = preferenceWorkflowConfigs.map(\n (trigger): PreferenceWorkflowConfigInput => {\n const purposes = parsePurposesFromTriggerCondition(trigger.triggerCondition);\n const shared = {\n name: trigger.name,\n 'data-subject-type': trigger.subject.type,\n 'is-silent': trigger.isSilent,\n 'allow-unauthenticated': trigger.allowUnauthenticated,\n 'is-active': trigger.isActive,\n purposes,\n };\n\n if (trigger.workflowConfigId) {\n const workflowTitle = resolveWorkflowTitleFromId(dsrWorkflows, trigger.workflowConfigId);\n if (workflowTitle) {\n return {\n ...shared,\n 'workflow-title': workflowTitle,\n };\n }\n // Workflow deleted or unreadable — fall back to legacy fields so YAML stays usable\n }\n\n return {\n ...shared,\n 'action-type': trigger.action.type,\n 'data-silo-titles':\n trigger.dataSilos.length > 0 ? trigger.dataSilos.map((ds) => ds.title) : undefined,\n };\n },\n );\n }\n\n if (\n preferenceOptionValues.length > 0 &&\n resources.includes(TranscendPullResource.PreferenceOptions)\n ) {\n result['preference-options'] = preferenceOptionValues.map(\n ({ slug, title }): ConsentPreferenceTopicOptionValue => ({\n slug,\n title: title.defaultMessage,\n }),\n );\n }\n\n // save email templates\n if (\n dataSiloIds.length === 0 &&\n templates.length > 0 &&\n resources.includes(TranscendPullResource.Templates)\n ) {\n result.templates = templates.map(({ title }) => ({ title }));\n }\n\n // Save enrichers\n if (enrichers.length > 0 && resources.includes(TranscendPullResource.Enrichers)) {\n result.enrichers = enrichers.map(\n ({\n title,\n url,\n type,\n inputIdentifier,\n identifiers,\n actions,\n testRegex,\n dataSubjects,\n expirationDuration,\n lookerQueryTitle,\n transitionRequestStatus,\n phoneNumbers,\n regionList,\n }): EnricherInput => ({\n title,\n url: url || undefined,\n type,\n 'input-identifier': inputIdentifier?.name,\n 'output-identifiers': identifiers.map(({ name }) => name),\n 'privacy-actions':\n Object.values(RequestAction).length === actions.length ? undefined : actions,\n testRegex: testRegex || undefined,\n lookerQueryTitle: lookerQueryTitle || undefined,\n expirationDuration: parseInt(expirationDuration, 10),\n transitionRequestStatus: transitionRequestStatus || undefined,\n phoneNumbers: phoneNumbers && phoneNumbers.length > 0 ? phoneNumbers : undefined,\n regionList: regionList && regionList.length > 0 ? regionList : undefined,\n 'data-subjects': dataSubjects.map(({ type }) => type),\n }),\n );\n }\n\n // Save data silos\n if (dataSilos.length > 0 && resources.includes(TranscendPullResource.DataSilos)) {\n const indexedDataSubjects = keyBy(dataSubjects, 'type');\n result['data-silos'] = dataSilos.map(\n ([\n {\n title,\n description,\n url,\n type,\n outerType,\n apiKeys,\n notifyEmailAddress,\n identifiers,\n dependentDataSilos,\n owners,\n country,\n countrySubDivision,\n teams,\n subjectBlocklist,\n isLive,\n promptAVendorEmailSendFrequency,\n promptAVendorEmailSendType,\n promptAVendorEmailIncludeIdentifiersAttachment,\n promptAVendorEmailCompletionLinkType,\n manualWorkRetryFrequency,\n catalog,\n attributeValues,\n discoveredBy,\n businessEntities,\n sombra,\n },\n dataPoints,\n ]): DataSiloInput => ({\n title,\n description,\n integrationName: type,\n 'outer-type': outerType || undefined,\n url: url || undefined,\n 'api-key-title': apiKeys[0]?.title,\n 'sombra-id': sombra?.id || undefined,\n 'identity-keys': identifiers\n .filter(({ isConnected }) => isConnected)\n .map(({ name }) => name),\n ...(dependentDataSilos.length > 0\n ? {\n 'deletion-dependencies': dependentDataSilos.map(({ title }) => title),\n }\n : {}),\n ...(owners.length > 0 ? { owners: owners.map(({ email }) => email) } : {}),\n ...(teams.length > 0 ? { teams: teams.map(({ name }) => name) } : {}),\n ...(discoveredBy.length > 0\n ? { discoveredBy: discoveredBy.map(({ title }) => title) }\n : {}),\n ...(businessEntities.length > 0\n ? {\n businessEntities: businessEntities.map(({ title }) => title),\n }\n : {}),\n country: country || undefined,\n countrySubDivision: countrySubDivision || undefined,\n disabled: !isLive,\n 'data-subjects':\n subjectBlocklist.length > 0\n ? convertToDataSubjectAllowlist(\n subjectBlocklist.map(({ type }) => type),\n indexedDataSubjects,\n )\n : undefined,\n ...(catalog.hasAvcFunctionality\n ? {\n 'email-settings': {\n 'notify-email-address': notifyEmailAddress || undefined,\n 'send-frequency': promptAVendorEmailSendFrequency,\n 'send-type': promptAVendorEmailSendType,\n 'include-identifiers-attachment': promptAVendorEmailIncludeIdentifiersAttachment,\n 'completion-link-type': promptAVendorEmailCompletionLinkType,\n 'manual-work-retry-frequency': manualWorkRetryFrequency,\n },\n }\n : {}),\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n\n datapoints: dataPoints\n .map(\n (dataPoint): DatapointInput => ({\n key: dataPoint.name,\n title: dataPoint.title?.defaultMessage,\n description: dataPoint.description?.defaultMessage,\n owners: dataPoint.owners.map(({ email }) => email),\n teams: dataPoint.teams.map(({ name }) => name),\n ...(dataPoint.path.length > 0 ? { path: dataPoint.path } : {}),\n ...(dataPoint.dataCollection?.title\n ? {\n 'data-collection-tag': dataPoint.dataCollection.title.defaultMessage,\n }\n : {}),\n ...(dataPoint.dbIntegrationQueries.length > 0\n ? {\n 'privacy-action-queries': mapValues(\n keyBy(dataPoint.dbIntegrationQueries, 'requestType'),\n (databaseIntegrationQuery) =>\n databaseIntegrationQuery.suggestedQuery ||\n databaseIntegrationQuery.query ||\n undefined,\n ),\n }\n : {}),\n ...(dataPoint.subDataPoints.length > 0\n ? {\n fields: dataPoint.subDataPoints\n .map(\n (field): FieldInput => ({\n key: field.name,\n description: field.description,\n purposes: field.purposes,\n categories: field.categories,\n ...(includeGuessedCategories && field.pendingCategoryGuesses\n ? {\n 'guessed-categories': field.pendingCategoryGuesses\n .filter((guess) => guess.status === 'PENDING')\n .map((guess) => ({\n category: {\n name: guess.category.name,\n category: guess.category.category,\n },\n status: guess.status,\n confidence: guess.confidence,\n classifierVersion: guess.classifierVersion || undefined,\n })),\n }\n : {}),\n 'access-request-visibility-enabled': field.accessRequestVisibilityEnabled,\n 'erasure-request-redaction-enabled': field.erasureRequestRedactionEnabled,\n attributes:\n field.attributeValues !== undefined && field.attributeValues.length > 0\n ? formatAttributeValues(field.attributeValues)\n : undefined,\n }),\n )\n .sort((a, b) => a.key.localeCompare(b.key)),\n }\n : {}),\n 'privacy-actions': dataPoint.actionSettings\n .filter(({ active }) => active)\n .map(({ type }) => type),\n }),\n )\n .sort((a, b) =>\n [...(a.path ?? []), a.key]\n .join('.')\n .localeCompare([...(b.path ?? []), b.key].join('.')),\n ),\n }),\n );\n }\n return result;\n}\n/* eslint-enable max-lines */\n"],"mappings":"gqDAUA,MAAa,EAAuB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAmD3B,EAA0B;;;;;ECJtC,eAAsB,EACpB,EAC+B,CAC/B,IAAM,EAA4C,EAAE,CAChD,EAAS,EAET,EAAiB,GACrB,EAAG,CACD,GAAM,CACJ,wBAAyB,CAAE,UACzB,MAAM,EAMP,EAAQ,EAAsB,CAC/B,UAAW,CAAE,MAAO,GAAW,SAAQ,CACvC,SACD,CAAC,CACF,EAAoB,KAAK,GAAG,EAAM,CAClC,GAAU,GACV,EAAiB,EAAM,SAAW,SAC3B,GAET,OAAO,EAAoB,MAAM,EAAG,IAAM,EAAE,MAAM,cAAc,EAAE,MAAM,CAAC,CCuB3E,MAAa,EAAmC,+CAK/C,CA8BD,eAAsB,EACpB,EACA,CACE,cACA,mBACA,QACA,YAAY,EACZ,WACA,kBACA,2BACA,qBACA,kBAAkB,OAAO,OAAO,EAAqB,EAE9B,CACzB,GAAI,EAAY,OAAS,GAAK,EAAiB,OAAS,EACtD,MAAU,MAAM,4DAA4D,CAG9E,EAAO,KAAK,EAAO,QAAQ,gCAAgC,EAAS,KAAK,CAAC,CAG1E,GAAM,CACJ,EACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,GACA,GACA,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACA,EACA,GACA,IACE,MAAM,QAAQ,IAAI,CAEpB,EAAU,SAAA,YAAyC,EACnD,EAAU,SAAA,eAA4C,CAClD,EAAqB,EAAQ,CAAE,SAAQ,CAAC,CACxC,EAAE,CAEN,EAAU,SAAA,UAAuC,CAC7C,GAAa,EAAQ,CAAE,SAAU,GAAM,SAAQ,CAAC,CAChD,EAAE,CAEN,EAAU,SAAA,YAAyC,CAC/C,GAAuB,EAAQ,CAC7B,IAAK,EACL,mBACA,WACA,QACA,2BACA,kBACA,qBACA,SACD,CAAC,CACF,EAAE,CAEN,EAAU,SAAA,YAAyC,CAC/C,EAAkB,EAAQ,CAAE,SAAQ,CAAC,CACrC,EAAE,CAEN,EAAU,SAAA,YAAyC,CAC/C,CACE,GAAI,EAAgB,SAAS,EAAqB,KAAK,CACnD,MAAM,EAAkB,EAAQ,CAC9B,SACA,SAAU,CAAE,OAAQ,EAAqB,KAAM,CAChD,CAAC,CACF,EAAE,CACN,GAAI,EAAgB,SAAS,EAAqB,YAAY,CAC1D,MAAM,EAAkB,EAAQ,CAC9B,SACA,SAAU,CAAE,OAAQ,EAAqB,YAAa,CACvD,CAAC,CACF,EAAE,CACP,CACD,EAAE,CAEN,EAAU,SAAA,UAAuC,CAC7C,CACE,GAAI,EAAgB,SAAS,EAAqB,KAAK,CACnD,MAAM,EAAgB,EAAQ,CAC5B,SACA,SAAU,CAAE,OAAQ,EAAqB,KAAM,CAChD,CAAC,CACF,EAAE,CACN,GAAI,EAAgB,SAAS,EAAqB,YAAY,CAC1D,MAAM,EAAgB,EAAQ,CAC5B,SACA,SAAU,CAAE,OAAQ,EAAqB,YAAa,CACvD,CAAC,CACF,EAAE,CACP,CACD,EAAE,CAEN,EAAU,SAAA,eAA0C,CAChD,EAAmB,EAAQ,CAAE,SAAQ,CAAC,CACtC,EAAE,CAEN,EAAU,SAAA,YAAyC,CAC/C,GAAkB,EAAQ,CAAE,SAAQ,CAAC,CACrC,EAAE,CAEN,EAAU,SAAA,cAA2C,CACjD,EAAoB,EAAQ,CAAE,SAAQ,CAAC,CACvC,EAAE,CAEN,EAAU,SAAA,UAAuC,CAAG,EAAgB,EAAQ,CAAE,SAAQ,CAAC,CAAG,EAAE,CAE5F,EAAU,SAAA,mBAAgD,CACtD,EAAyB,EAAQ,CAAE,SAAQ,CAAC,CAC5C,EAAE,CAEN,EAAU,SAAA,uBAAoD,CAC1D,GAA6B,EAAQ,CAAE,SAAQ,CAAC,CAChD,EAAE,CAEN,EAAU,SAAA,iBAA8C,CACpD,GAAoB,EAAQ,CAAE,SAAQ,CAAC,CACvC,IAAA,GAEJ,EAAU,SAAA,iBAA8C,CACpD,GAA+B,EAAQ,CAAE,SAAQ,CAAC,CAClD,EAAE,CAEN,EAAU,SAAA,iBAA8C,CACpD,GAAqB,EAAQ,CAAE,SAAQ,CAAC,CACxC,EAAE,CAEN,EAAU,SAAA,iBAA8C,CACpD,GAAmB,EAAQ,CAAE,SAAQ,CAAC,CACtC,EAAE,CAEN,EAAU,SAAA,UAAuC,CAAG,GAAgB,EAAQ,CAAE,SAAQ,CAAC,CAAG,EAAE,CAE5F,EAAU,SAAA,iBAA8C,CACpD,GAAuB,EAAQ,CAAE,SAAQ,CAAC,CAC1C,EAAE,CAEN,EAAU,SAAA,eAA4C,CAClD,GAAqB,EAAQ,CAAE,SAAQ,CAAC,CACxC,EAAE,CAEN,EAAU,SAAA,UAAuC,CAAG,GAAgB,EAAQ,CAAE,SAAQ,CAAC,CAAG,EAAE,CAE5F,EAAU,SAAA,iBAA8C,CACpD,EAAuB,EAAQ,CAAE,SAAQ,CAAC,CAC1C,EAAE,CAEN,EAAU,SAAA,qBAAkD,CACxD,GAA2B,EAAQ,CAAE,SAAQ,CAAC,CAC9C,EAAE,CAEN,EAAU,SAAA,cAA2C,CACjD,EAAoB,EAAQ,CAC1B,SACA,SAAU,CAAE,KAAM,CAAC,EAAe,WAAW,CAAE,CAChD,CAAC,CACF,EAAE,CAEN,EAAU,SAAA,wBAAqD,CAC3D,EAA8B,EAAQ,CAAE,SAAQ,CAAC,CACjD,EAAE,CAEN,EAAU,SAAA,QAAqC,CAAG,GAAc,EAAQ,CAAE,SAAQ,CAAC,CAAG,EAAE,CAExF,EAAU,SAAA,WAAwC,CAAG,GAAiB,EAAQ,CAAE,SAAQ,CAAC,CAAG,EAAE,CAE9F,EAAU,SAAA,iBAA8C,CACpD,GAAuB,EAAQ,CAAE,SAAQ,CAAC,CAC1C,EAAE,CAEN,EAAU,SAAA,WAAwC,CAAG,EAAiB,EAAQ,CAAE,SAAQ,CAAC,CAAG,EAAE,CAE9F,EAAU,SAAA,aAA0C,CAAG,GAAgB,EAAQ,CAAE,SAAQ,CAAC,CAAG,EAAE,CAE/F,EAAU,SAAA,cAA2C,CACjD,EAAoB,EAAQ,CAAE,SAAQ,CAAC,CACvC,EAAE,CAEN,EAAU,SAAA,sBAAmD,CACzD,EAA4B,EAAO,CACnC,EAAE,CAEN,EAAU,SAAA,WAAwC,CAC9C,GAA+B,EAAQ,CAAE,SAAQ,CAAC,CAClD,EAAE,CACN,EAAU,SAAA,4BAAyD,CAC/D,EAAgC,EAAQ,CAAE,SAAQ,CAAC,CACnD,EAAE,CACN,EAAU,SAAA,kBAA+C,CACrD,GAAwB,EAAQ,CAC9B,SACA,mBAAoB,EAAmB,IACxC,CAAC,CACF,EAAE,CACN,EAAU,SAAA,oBAAiD,CACvD,GAA+B,EAAQ,CAAE,SAAQ,CAAC,CAClD,EAAE,CAEN,EAAU,SAAA,kBAA+C,CACrD,GAA6B,EAAQ,CAAE,SAAQ,CAAC,CAChD,EAAE,CACP,CAAC,CAEI,EACJ,EAAU,SAAA,iBAA8C,EAAI,EACxD,MAAM,GAAyB,EAAQ,CACrC,SACA,SAAU,CAAE,eAAgB,EAAe,GAAI,CAChD,CAAC,CACF,IAAA,GAEA,EAAyB,EAAE,CAG3B,GAAe,EAAQ,EAAU,KAAK,CAAC,CAAE,cAAe,EAAQ,KAAK,CAAE,WAAY,EAAM,CAAC,CAAC,CAC3F,EAAkB,OAAO,OAAO,GAAe,CAAC,QAAQ,CAAE,WAC9D,EAAU,SAAA,UAAuC,CAAG,GAAO,GAAa,SAAS,EAAM,CACxF,CAoiBD,GAniBI,EAAgB,OAAS,GAAK,EAAU,SAAA,UAAuC,GACjF,EAAO,YAAc,EAAgB,KAClC,CAAE,YAA0B,CAC3B,QACD,EACF,EAIC,GAAW,OAAS,GAAK,EAAU,SAAA,aAA0C,GAC/E,EAAO,WAAa,GAAW,KAAK,CAAE,OAAM,gBAAiB,CAC3D,OACA,YACD,EAAE,EAID,GAAkB,EAAU,SAAA,iBAA8C,GAC5E,EAAO,mBAAqB,CAC1B,WAAY,CACV,KAAM,EAAe,cACrB,WAAY,EAAe,UAC5B,CACD,QAAS,EAAe,cAAc,SAAW,IAAA,GACjD,UAAW,EAAe,cAAc,WAAa,IAAA,GACrD,kBAAmB,EAAe,cAAc,mBAAqB,IAAA,GACrE,qBAAsB,EAAe,cAAc,sBAAwB,IAAA,GAC3E,oBAAqB,EAAe,cAAc,qBAAuB,IAAA,GACzE,aAAc,EAAe,cAAc,cAAgB,IAAA,GAC3D,sBAAuB,EAAe,cAAc,uBAAyB,IAAA,GAC7E,mBAAoB,EAAe,cAAc,oBAAsB,IAAA,GAEvE,WAAY,EAAe,cAAc,YAAc,IAAA,GACvD,MAAQ,EAEJ,CACE,aAAc,EAAoB,cAAgB,IAAA,GAClD,UAAW,EAAoB,WAAa,IAAA,GAC5C,cAAe,EAAoB,eAAiB,IAAA,GACpD,OAAQ,EAAoB,OAC7B,CAND,IAAA,GAOJ,YAAa,GAA0B,IAAK,IAAgB,CAC1D,KAAM,EAAW,KACjB,YAAa,EAAW,aAAe,IAAA,GACvC,QAAS,EAAW,QAAQ,IAAK,IAAY,CAC3C,mBAAoB,EAAO,oBAAsB,IAAA,GACjD,QAAS,EAAO,SAAW,IAAA,GAC5B,EAAE,CACH,gBAAiB,EAAW,gBAC5B,cAAe,EAAW,cAC1B,SAAU,EAAW,SACrB,gBAAiB,EAAW,gBAC5B,UAAW,EAAW,UACtB,SAAU,EAAW,SAAS,IAAK,IAAa,CAC9C,aAAc,EAAQ,aACvB,EAAE,CACH,iBAAkB,EAAW,iBAAiB,IAAK,IAAa,CAC9D,aAAc,EAAQ,aACvB,EAAE,CACH,iBAAkB,EAAW,iBAC7B,iBAAkB,EAAW,iBAC7B,qBAAsB,EAAW,kBAAkB,KACpD,EAAE,CACH,gBAAiB,GAAgB,IAC9B,IAAkC,CACjC,GAAI,EAAQ,GACZ,KAAM,EAAQ,KACd,KAAM,EAAQ,KAEd,YAAa,EAAQ,aAAe,IAAA,GACpC,cAAe,KAAK,UAAU,EAAQ,cAAc,CACpD,QAAS,EAAQ,QACjB,OAAQ,EAAQ,OAChB,SAAU,EAAQ,UAAY,IAAA,GAC9B,UAAW,EAAQ,OAAO,MAAQ,IAAA,GACnC,EACF,CACD,cAAe,GAAc,IAC1B,IAA8B,CAC7B,GAAI,EAAM,GACV,KAAM,EAAM,KACZ,KAAM,EAAM,KACZ,cAAe,KAAK,UAAU,EAAM,cAAc,CACnD,EACF,CACF,EAIC,GAAY,OAAS,GAAK,EAAU,SAAA,cAA2C,GACjF,EAAO,YAAc,GAAY,KAC9B,CACC,QACA,kBACA,WACA,UACA,cACA,SACA,YACA,oBACA,YACA,WACA,aACA,sBACA,UACA,YACA,aACA,cACA,aACA,aACA,kBACA,oBACA,kBACA,YACA,iBACsB,CACtB,QACA,MAAO,EAAgB,MACvB,SAAU,EAAS,KAChB,CACC,QACA,SACA,YACA,YACA,aACA,wBAC6B,CAC7B,QACA,SACA,UAAW,EAAU,KAClB,CACC,QACA,OACA,UACA,cACA,cACA,aACA,cACA,eACA,YACA,iBACA,gBACA,gBACA,kBACA,mBACA,mBACA,YACA,aACA,eACA,wBACA,iCACoC,CACpC,IAAM,EAAqB,EACvB,EAA4B,EAAa,CACzC,IAAA,GACJ,MAAO,CACL,QACA,OACA,WAAY,EACZ,cACA,cACA,cAAe,EACf,eAAgB,EAChB,gBACE,GAAsB,OAAO,KAAK,EAAmB,CAAC,OAAS,EAC3D,CACE,OAAQ,EAAmB,OAC3B,KAAM,EAAmB,KACrB,CACE,mCACE,EAAmB,KAAK,6BAC1B,sBAAuB,EAAmB,KAAK,mBAC/C,sBAEE,uBAAwB,EAAmB,KACvC,EAAmB,KAAK,mBACxB,IAAA,GACP,CACD,IAAA,GACJ,cAAe,EAAmB,WAC9B,CACE,iBAAkB,EAAmB,WAAW,cAChD,OAAQ,EAAmB,WAAW,OAAS,EAAE,EAAE,IAChD,IAA0B,CACzB,mCACE,EAAK,6BACP,sBAAuB,EAAK,mBAC5B,sBAEE,uBAAwB,EACpB,EAAK,mBACL,IAAA,GACP,EACF,CACF,CACD,IAAA,GACL,CACD,IAAA,GACN,aAAc,EAAU,IAAK,GAA0B,CACrD,IAAM,EAAS,EAAyB,EAAM,CAC9C,MAAO,CACL,aAAc,EAAO,gBAAgB,YACrC,sBAAuB,EAAO,mBAC9B,sBAAuB,EAAO,mBAC/B,EACD,CACF,kBAAmB,EAAe,KAAK,CAAE,WAAY,EAAM,CAC3D,iBAAkB,GAAe,MACjC,iBAAkB,EAAc,KAAK,CAAE,YAAa,CAClD,QACD,EAAE,CACH,mBAAoB,EAAgB,KAAK,CAAE,WAAY,EAAM,CAC7D,qBAAsB,EACtB,qBAAsB,EACtB,aAAc,GAAa,IAAA,GAC3B,cAAe,GAAc,IAAA,GAC7B,gBAAiB,GAAc,KAC/B,0BAA2B,EAC3B,iCAAkC,EACnC,EAEJ,CACD,UAAW,EAAU,KAAK,CAAE,WAAY,EAAM,CAC9C,qBAAsB,EAAkB,KAAK,CAAE,WAAY,EAAM,CACjE,cAAe,EAChB,EACF,CACD,QAAS,GAAS,MAClB,cACA,SACA,UAAW,EAAU,KAAK,CAAE,WAAY,EAAM,CAC9C,qBAAsB,EAAkB,KAAK,CAAE,WAAY,EAAM,CACjE,UAAW,EAAU,KAAK,CAAE,WAAY,EAAM,CAC9C,OAAQ,EACR,SAAU,EACV,SAAU,EACV,oBAAqB,EACrB,WAAY,GAAW,IAAA,GACvB,aAAc,GAAa,IAAA,GAC3B,cAAe,GAAc,IAAA,GAC7B,eAAgB,GAAe,IAAA,GAC/B,cAAe,GAAc,IAAA,GAC7B,cAAe,GAAc,IAAA,GAC7B,qBAAsB,EAClB,CACE,KAAM,EAAkB,KACxB,gBAAiB,EAAkB,aACnC,QAAS,EAAkB,UAC5B,CACD,IAAA,GACJ,WACE,IAAoB,IAAA,IAAa,EAAgB,OAAS,EACtD,EAAsB,EAAgB,CACtC,IAAA,GACN,UAAW,EAAU,KAAK,CAAE,eAAc,QAAO,OAAM,WAAU,OAAM,cAAe,CACpF,KAAM,EACN,MAAO,EACH,GAAG,EAAS,KAAK,IACjB,EACE,GAAG,EAAQ,KAAK,IAChB,GAAS,GAAQ,GAAQ,GAChC,EAAE,CACH,KAAM,EAAW,KAAK,CAAE,eAAc,QAAO,OAAM,WAAU,OAAM,cAAe,CAChF,KAAM,EACN,MAAO,EACH,GAAG,EAAS,KAAK,IACjB,EACE,GAAG,EAAQ,KAAK,IAChB,GAAS,GAAQ,GAAQ,GAChC,EAAE,CACJ,EACF,EAKD,GAAoB,OAAS,GAC7B,EAAU,SAAA,sBAAmD,GAE7D,EAAO,wBAA0B,GAAoB,KAClD,CACC,QACA,cACA,WACA,SACA,SACA,UACA,WACA,aACA,YACA,wBAC8B,CAC9B,QACA,cACA,SAAU,EAAS,KAChB,CAAE,QAAO,gBAAyC,CACjD,QACA,UAAW,EAAU,KAClB,CACC,QACA,OACA,UACA,cACA,cACA,aACA,cACA,eACA,YACA,iBACA,gBACA,gBACA,mBACA,mBACA,YACA,aACA,eACA,wBACA,iCACoC,CACpC,IAAM,EAAqB,EACvB,EAA4B,EAAa,CACzC,IAAA,GACJ,MAAO,CACL,QACA,OACA,WAAY,EACZ,cACA,cACA,cAAe,EACf,eAAgB,EAChB,gBACE,GAAsB,OAAO,KAAK,EAAmB,CAAC,OAAS,EAC3D,CACE,OAAQ,EAAmB,OAC3B,KAAM,EAAmB,KACrB,CACE,mCACE,EAAmB,KAAK,6BAC1B,sBAAuB,EAAmB,KAAK,mBAC/C,sBAEE,uBAAwB,EAAmB,KACvC,EAAmB,KAAK,mBACxB,IAAA,GACP,CACD,IAAA,GACJ,cAAe,EAAmB,WAC9B,CACE,iBAAkB,EAAmB,WAAW,cAChD,OAAQ,EAAmB,WAAW,OAAS,EAAE,EAAE,IAChD,IAA0B,CACzB,mCACE,EAAK,6BACP,sBAAuB,EAAK,mBAC5B,sBAEE,uBAAwB,EACpB,EAAK,mBACL,IAAA,GACP,EACF,CACF,CACD,IAAA,GACL,CACD,IAAA,GACN,aAAc,EAAU,IAAK,GAA0B,CACrD,IAAM,EAAS,EAAyB,EAAM,CAC9C,MAAO,CACL,aAAc,EAAO,gBAAgB,YACrC,kBAAmB,EAAO,gBAAgB,gBAC1C,qBAAsB,EAAO,gBAAgB,mBAC7C,sBAAuB,EAAO,mBAC9B,sBAAuB,EAAO,mBAC/B,EACD,CACF,kBAAmB,EAAe,KAAK,CAAE,WAAY,EAAM,CAC3D,iBAAkB,GAAe,MACjC,iBAAkB,EAAc,KAAK,CAAE,YAAa,CAClD,QACD,EAAE,CACH,qBAAsB,EACtB,qBAAsB,EACtB,aAAc,GAAa,IAAA,GAC3B,cAAe,GAAc,IAAA,GAC7B,gBAAiB,GAAc,KAC/B,0BAA2B,EAC3B,iCAAkC,EACnC,EAEJ,CACF,EACF,CACD,SACA,SACA,QAAS,GAAS,MAClB,OAAQ,EACR,SAAU,EACV,aAAc,GAAa,IAAA,GAC3B,qBAAsB,EAClB,CACE,KAAM,EAAkB,KACxB,gBAAiB,EAAkB,aACnC,QAAS,EAAkB,UAC5B,CACD,IAAA,GACL,EACF,EAKD,GAAqB,OAAS,GAC9B,EAAU,SAAA,kBAA+C,GAEzD,EAAO,oBAAsB,GAAqB,KAC/C,CACC,QACA,aACA,iBAAkB,CAAE,MAAO,GAC3B,OAAQ,CACN,SAAU,CAAE,MAAO,IAErB,UACA,qBACA,mBACA,wBACA,aAC+B,CAC/B,QACA,aACA,iBAAkB,EAClB,OAAQ,EACR,QAAS,GAAW,IAAA,GACpB,mBAAoB,GAAsB,IAAA,GAC1C,mBACA,wBACA,SACD,EACF,EAIC,GAAQ,OAAS,GAAK,EAAU,SAAA,UAAuC,GACzE,EAAO,QAAU,GAAQ,KACtB,CAAE,QAAO,cAA4B,CACpC,QACA,UACD,EACF,EAIC,GAAe,OAAS,GAAK,EAAU,SAAA,iBAA8C,GACvF,EAAO,mBAAqB,GAAe,KACxC,CAAE,QAAO,cAAmC,CAC3C,QACA,UACD,EACF,EAIC,GAAa,OAAS,GAAK,EAAU,SAAA,eAA4C,GACnF,EAAO,iBAAmB,GAAa,KACpC,CAAE,QAAO,cAAa,cAAiC,CACtD,QACA,cACA,QAAS,EAAQ,KAAK,CAAE,WAAY,EAAM,CAC3C,EACF,EAIC,GAAM,OAAS,GAAK,EAAU,SAAA,QAAqC,GACrE,EAAO,MAAQ,GAAM,KAClB,CACC,OACA,cACA,gBACA,WACA,WACA,QACA,SACA,iBACgB,CAChB,OACA,cACA,iBAAkB,GAAiB,IAAA,GACnC,YAAa,GAAY,IAAA,GACzB,YAAa,GAAY,IAAA,GACzB,mBAAoB,GAAY,KAChC,MAAO,EAAM,KAAK,CAAE,WAAY,EAAM,CACtC,OAAQ,EAAO,KAAK,CAAE,UAAW,EAAK,CACvC,EACF,EAIC,EAAa,OAAS,GAAK,EAAU,SAAA,eAA4C,GACnF,EAAO,iBAAmB,EAAa,KACpC,CACC,OACA,QACA,SACA,kCACA,0BACA,cACuB,CACvB,OACA,MAAO,GAAO,eACd,SACA,kCACA,0BACA,QAAS,EAAQ,KAAK,CAAE,UAAW,EAAK,CACzC,EACF,EAIC,GAAS,OAAS,IACpB,EAAO,SAAW,GAAS,KACxB,CAAE,QAAO,OAAM,WAAU,sBAAoC,CAC5D,MAAO,GAAO,eACd,OACA,QAAS,IAAW,IAAI,SAAS,eACjC,kBACD,EACF,EAIC,GAAS,OAAS,IACpB,EAAO,SAAW,GAAS,KACxB,CAAE,KAAI,iBAAgB,oBAAmB,cAAa,mBAAsC,CAC3F,KACA,iBACA,cACA,kBAAmB,GAAqB,IAAA,GACxC,aAAc,EAAa,QACxB,EAAK,CAAE,SAAQ,WAAY,OAAO,OAAO,EAAK,EAAG,GAAS,EAAO,CAAC,CACnE,EAAE,CACH,CACF,EACF,EAIC,GAAe,OAAS,EAAG,CAC7B,IAAM,EAAgB,GAAe,GACrC,EAAO,kBAAoB,CACzB,WAAY,EAAc,WAC1B,yBAA0B,EAAc,yBACxC,aAAc,EAAc,aAC5B,yBAA0B,EAAc,yBACxC,YAAa,EAAc,YAC3B,cAAe,EAAc,cAC7B,mBAAoB,EAAc,mBAClC,sBAAuB,EAAc,sBACrC,yBAA0B,EAAc,yBACxC,QAAS,EAAc,QACvB,cAAe,EAAc,cAC7B,2BAA4B,EAAc,2BAC1C,aAAc,EAAc,cAAgB,IAAA,GAC5C,aAAc,EAAc,cAAgB,IAAA,GAC5C,uBAAwB,EAAc,uBACtC,qBAAsB,EAAc,qBACpC,+BAAgC,EAAc,+BAC9C,KAAM,EAAc,MAAQ,IAAA,GAC5B,wBAAyB,EAAc,wBACvC,8BAA+B,EAAc,8BAC7C,aAAc,EAAc,aAC5B,GAAI,EAAc,mBAAmB,OAAS,EAC1C,CACE,+BAAgC,EAAc,mBAAmB,IAC9D,GAAU,EAAM,IAClB,CACF,CACD,EAAE,CACN,GAAI,EAAc,YAAY,OAAS,EACnC,CACE,YAAa,CAAC,GAAG,EAAc,YAAY,CACxC,MAAM,EAAG,IAAM,EAAE,aAAe,EAAE,aAAa,CAC/C,IAAK,IAAU,CACd,MAAO,EAAK,MAAM,eAClB,GAAI,EAAK,IAAM,CAAE,IAAK,EAAK,IAAK,CAAG,EAAE,CACrC,GAAI,EAAK,SAAW,CAAE,SAAU,EAAK,SAAU,CAAG,EAAE,CACrD,EAAE,CACN,CACD,EAAE,CACN,MAAO,EAAc,MACtB,CA8aH,GA1aI,GAAiB,OAAS,GAAK,EAAU,SAAA,mBAAgD,GAC3F,EAAO,qBAAuB,GAAiB,KAC5C,CACC,QACA,cACA,UACA,qBACA,yBACA,4BACA,6BACA,sBAC0B,CAC1B,QACA,YAAa,GAAe,IAAA,GAC5B,QAAS,GAAW,IAAA,GACpB,mBAAoB,GAAsB,IAAA,GAC1C,uBAAwB,GAA0B,IAAA,GAClD,0BAA2B,GAA6B,IAAA,GACxD,2BAA4B,GAA8B,IAAA,GAC1D,WACE,IAAoB,IAAA,IAAa,EAAgB,OAAS,EACtD,EAAsB,EAAgB,CACtC,IAAA,GACP,EACF,EAKD,GAAqB,OAAS,GAC9B,EAAU,SAAA,uBAAoD,GAE9D,EAAO,yBAA2B,GAAqB,KACpD,CACC,QACA,cACA,yBACA,kBACA,iBACA,kBACA,gBACA,kBACA,qCACA,uCACA,kBACA,YACA,eACA,QACA,SACA,iCACA,oBACA,qBAC8B,CAC9B,QACA,cACA,uBAAwB,GAA0B,IAAA,GAClD,gBAAiB,EAAgB,OAAS,EAAI,EAAkB,IAAA,GAChE,eAAgB,EAAe,OAAS,EAAI,EAAc,EAAe,CAAG,IAAA,GAC5E,gBAAiB,EAAgB,OAAS,EAAI,EAAc,EAAgB,CAAG,IAAA,GAC/E,gBACA,gBAAiB,IAAkB,EAAc,aAAe,EAAkB,IAAA,GAClF,mCAAoC,GAAsC,IAAA,GAC1E,uCACA,WACE,IAAoB,IAAA,IAAa,EAAgB,OAAS,EACtD,EAAsB,EAAgB,CACtC,IAAA,GACN,eAAgB,EAAU,OAAS,EAAI,EAAU,KAAK,CAAE,WAAY,EAAM,CAAG,IAAA,GAC7E,iBACE,EAAa,OAAS,EAAI,EAAa,KAAK,CAAE,UAAW,EAAK,CAAG,IAAA,GACnE,UAAW,EAAM,OAAS,EAAI,EAAM,KAAK,CAAE,UAAW,EAAK,CAAG,IAAA,GAC9D,YAAa,EAAO,OAAS,EAAI,EAAO,KAAK,CAAE,WAAY,EAAM,CAAG,IAAA,GACpE,sBACE,EAA+B,OAAS,EACpC,EAA+B,KAAK,CAAE,OAAM,cAAe,CACzD,UACA,GAAI,EAAO,CAAE,OAAM,CAAG,EAAE,CACzB,EAAE,CACH,IAAA,GACN,kBACE,EAAkB,OAAS,EACvB,EAAkB,KAAK,CAAE,OAAM,eAAgB,CAC7C,WACA,GAAI,EAAO,CAAE,OAAM,CAAG,EAAE,CACzB,EAAE,CACH,IAAA,GACN,eACE,EAAe,OAAS,EAAI,EAAe,KAAK,CAAE,WAAY,EAAM,CAAG,IAAA,GAC1E,EACF,EAIC,GAAQ,OAAS,GAAK,EAAU,SAAA,UAAuC,GACzE,EAAO,QAAU,GAAQ,KACtB,CACC,OACA,yBACA,uBACA,iBACA,aACA,wBACA,oBACkB,CAClB,OACA,GAAI,IAAS,EAAc,QACvB,CACE,yBACA,uBACD,CACD,EAAE,CACN,iBACA,gBACA,wBACA,WAAY,EAAW,OAAS,EAAI,EAAa,IAAA,GAClD,EACF,EAIC,GAAY,OAAS,GAAK,EAAU,SAAA,cAA2C,GACjF,EAAO,YAAc,GAAY,KAC9B,CACC,OACA,OACA,QACA,gBACA,0BACA,mBACA,cACA,eACA,eACA,qBACA,eACA,gCACsB,CACtB,OACA,OACA,QACA,cAAe,EAAc,OAAS,EAAI,EAAgB,IAAA,GAC1D,wBACE,EAAwB,OAAS,EAAI,EAA0B,IAAA,GACjE,mBACA,YAAa,GAAe,IAAA,GAC5B,aAAc,EAAa,OAAS,EAAI,EAAa,KAAK,CAAE,UAAW,EAAK,CAAG,IAAA,GAC/E,aAAc,GAAc,eAC5B,mBAAoB,GAAoB,eACxC,eACA,4BACD,EACF,EAIC,GAAY,OAAS,GAAK,EAAU,SAAA,cAA2C,GACjF,EAAO,gBAAkB,GAAY,KAClC,CACC,QACA,QACA,gCAAiC,CAAC,GAClC,UACA,WACA,WACA,cACA,QACA,OACA,QACA,OACA,sBACsB,CACtB,MAAO,EAAM,KAAK,CAAE,UAAW,EAAK,CACpC,MAAO,EAAM,KAAK,CAAE,WAAY,EAAM,CACtC,QAAS,GAAW,IAAA,GACpB,QACA,QACA,iCACA,YAAa,EAAY,KAAK,CAAE,WAAY,EAAM,CAClD,OACA,SAAU,GAAY,IAAA,GACtB,WACA,OACA,WACE,IAAoB,IAAA,IAAa,EAAgB,OAAS,EACtD,EAAsB,EAAgB,CACtC,IAAA,GACP,EACF,EAKD,GAAsB,OAAS,GAC/B,EAAU,SAAA,wBAAqD,GAE/D,EAAO,2BAA6B,GAAsB,KACvD,CAAE,QAAO,cAAa,SAAQ,kBAA8C,CAC3E,QACA,YAAa,GAAe,IAAA,GAC5B,SACA,cACD,EACF,EAIC,GAAQ,OAAS,GAAK,EAAU,SAAA,UAAuC,GACzE,EAAO,QAAU,GAAQ,KACtB,CACC,QACA,cACA,8BACA,cACA,eACA,UACA,qBACA,yBACA,aACA,iBACA,QACA,SACA,sBACkB,CAClB,QACA,YAAa,GAAe,IAAA,GAC5B,4BAA6B,GAA+B,IAAA,GAC5D,YAAa,GAAe,IAAA,GAC5B,aAAc,GAAgB,IAAA,GAC9B,QAAS,GAAW,IAAA,GACpB,mBAAoB,GAAsB,IAAA,GAC1C,uBAAwB,GAA0B,IAAA,GAClD,WAAY,GAAc,IAAA,GAC1B,eAAgB,GAAgB,MAChC,MAAO,GAAS,EAAM,OAAS,EAAI,EAAM,KAAK,CAAE,UAAW,EAAK,CAAG,IAAA,GACnE,OAAQ,GAAU,EAAO,OAAS,EAAI,EAAO,KAAK,CAAE,WAAY,EAAM,CAAG,IAAA,GACzE,WACE,IAAoB,IAAA,IAAa,EAAgB,OAAS,EACtD,EAAsB,EAAgB,CACtC,IAAA,GACP,EACF,EAIC,GAAe,OAAS,GAAK,EAAU,SAAA,iBAA8C,GACvF,EAAO,mBAAqB,GAAe,KACxC,CACC,OACA,WACA,cACA,QACA,SACA,QACA,sBACwB,CACxB,OACA,WACA,YAAa,GAAe,IAAA,GAC5B,MAAO,GAAS,IAAA,GAChB,OAAQ,GAAU,EAAO,OAAS,EAAI,EAAO,KAAK,CAAE,WAAY,EAAM,CAAG,IAAA,GACzE,MAAO,GAAS,EAAM,OAAS,EAAI,EAAM,KAAK,CAAE,UAAW,EAAK,CAAG,IAAA,GACnE,WACE,IAAoB,IAAA,IAAa,EAAgB,OAAS,EACtD,EAAsB,EAAgB,CACtC,IAAA,GACP,EACF,EAKD,GAAmB,OAAS,GAC5B,EAAU,SAAA,qBAAkD,GAE5D,EAAO,uBAAyB,GAAmB,KAChD,CAAE,OAAM,UAAS,cAAa,SAAQ,QAAO,sBAA+C,CAC3F,OACA,UACA,YAAa,GAAe,IAAA,GAC5B,OAAQ,GAAU,EAAO,OAAS,EAAI,EAAO,KAAK,CAAE,WAAY,EAAM,CAAG,IAAA,GACzE,MAAO,GAAS,EAAM,OAAS,EAAI,EAAM,KAAK,CAAE,UAAW,EAAK,CAAG,IAAA,GACnE,WACE,IAAoB,IAAA,IAAa,EAAgB,OAAS,EACtD,EAAsB,EAAgB,CACtC,IAAA,GACP,EACF,EAIC,EAAU,OAAS,GAAK,EAAU,SAAA,YAAyC,GAC7E,EAAO,cAAgB,EAAU,KAC9B,CACC,QACA,OACA,cACA,eACA,UACA,SACA,SACA,QACA,sBACoB,CACpB,QACA,OACA,YAAa,GAAe,IAAA,GAC5B,iBAAkB,EAClB,SACA,QAAS,GAAS,gBAClB,OAAQ,EAAO,KAAK,CAAE,WAAY,EAAM,CACxC,MAAO,EAAM,KAAK,CAAE,UAAW,EAAK,CACpC,WACE,IAAoB,IAAA,IAAa,EAAgB,OAAS,EACtD,EAAsB,EAAgB,CACtC,IAAA,GACP,EACF,EAIC,EAAQ,OAAS,GAAK,EAAU,SAAA,UAAuC,GACzE,EAAO,QAAU,EAAQ,KACtB,CACC,OACA,UACA,cACA,mBACA,UACA,SACA,SACA,QACA,sBACkB,CAClB,OACA,UACA,YAAa,GAAe,IAAA,GAC5B,mBACA,SACA,QAAS,GAAS,gBAClB,OAAQ,EAAO,KAAK,CAAE,WAAY,EAAM,CACxC,MAAO,EAAM,KAAK,CAAE,UAAW,EAAK,CACpC,WACE,IAAoB,IAAA,IAAa,EAAgB,OAAS,EACtD,EAAsB,EAAgB,CACtC,IAAA,GACP,EACF,EAIC,EAAW,OAAS,GAAK,EAAU,SAAA,eAA0C,GAC/E,EAAO,WAAa,EAAW,KAC5B,CAAE,cAAa,OAAM,OAAM,SAAQ,YAAY,EAAE,KAAwB,CACxE,YAAa,GAAe,IAAA,GAC5B,UAAW,EACX,OACA,OACA,OAAQ,EAAO,KAAK,CAAE,OAAM,QAAO,kBAAmB,CACpD,OACA,MAAO,GAAS,IAAA,GAChB,cACD,EAAE,CACJ,EACF,EAIC,GAAS,OAAS,IACpB,EAAO,SAAW,GAAS,KACxB,CACC,OACA,cACA,eACA,iBACA,eACA,uBACA,WACA,eACA,gBACA,YACA,SACA,sBACA,YACqB,CACrB,OACA,QACA,YAAa,GAAe,IAAA,GAC5B,eACA,kBAAmB,EACnB,eACA,0BAA2B,EAC3B,yBAA0B,EAC1B,YAAa,EACb,gBAAiB,EACjB,kBAAmB,EAAc,OAAS,EAAI,EAAgB,IAAA,GAC9D,aAAc,GAAa,IAAA,GAC3B,oBAAqB,EAAO,KACzB,CACC,OACA,QACA,OACA,QACA,qBACA,uBACA,sBACA,6BAC6B,CAC7B,OACA,MAAO,EAAM,eACb,OACA,QACA,YAAa,EAAmB,eAChC,wBAAyB,EACzB,yBAA0B,EAC1B,QACE,IAAS,EAAoB,QACzB,EAAE,CACF,EAAuB,KAAK,CAAE,QAAO,WAAY,CAC/C,MAAO,EAAM,eACb,OACD,EAAE,CACV,EACF,CACF,EACF,EAGC,EAAgB,OAAS,GAAK,EAAU,SAAA,kBAA+C,CAAE,CAC3F,IAAM,EAAwB,EAAgB,IAC3C,IAAiC,CAChC,MAAO,EAAO,MAAM,eACpB,cAAe,EAAO,OAAO,KAC7B,GAAI,EAAO,aAAe,CAAE,gBAAiB,EAAO,aAAc,CAAG,EAAE,CACvE,GAAI,EAAO,SAAW,CAAE,SAAU,EAAO,SAAS,eAAgB,CAAG,EAAE,CACvE,GAAI,EAAO,YAAc,CAAE,YAAa,EAAO,YAAY,eAAgB,CAAG,EAAE,CAChF,GAAI,EAAO,QAAU,CAAE,oBAAqB,EAAO,QAAQ,KAAM,CAAG,EAAE,CACtE,WAAY,EAAO,yBACnB,KAAM,EAAO,mBACb,GAAI,EAAO,0BACP,CACE,+BAAgC,EAAO,0BACxC,CACD,EAAE,CACN,GAAI,EAAO,WAAW,OAAS,EAAI,CAAE,cAAe,EAAO,WAAY,CAAG,EAAE,CAC5E,GAAI,EAAO,YAAc,EAAO,WAAW,OAAS,EAChD,CAAE,cAAe,EAAO,WAAY,CACpC,EAAE,CACN,GAAI,EAAO,6BAA+B,EAAO,4BAA4B,OAAS,EAClF,CACE,iBAAkB,EAAO,4BAA4B,KAClD,CAAE,kBAAmB,EAAa,KACpC,CACF,CACD,EAAE,CACP,EACF,CAEK,EAAoB,EAAQ,EAAiB,GAAuB,CAC1E,IAAK,IAAM,KAAW,OAAO,OAAO,EAAkB,CACpD,GAAI,EAAQ,OAAS,EAAG,CACtB,IAAM,EAAS,EAAQ,GACvB,EAAO,KACL,UAAU,EAAQ,OAAO,+FACoB,EAAO,MAAM,eAAe,KACnE,EAAO,OAAO,KAAK,0FAE1B,CAGD,EAAsB,OAAS,IACjC,EAAO,oBAAsB,GAIjC,GACE,EAA0B,OAAS,GACnC,EAAU,SAAA,4BAAyD,CACnE,CAIA,IAAM,EAHsB,EAA0B,KACnD,GAAY,EAAQ,iBAEiB,CACpC,MAAM,GAAwB,EAAQ,CACpC,SACA,mBAAoB,EAAmB,IACxC,CAAC,CACF,EAAE,CAEN,EAAO,+BAAiC,EAA0B,IAC/D,GAA2C,CAC1C,IAAM,EAAW,GAAkC,EAAQ,iBAAiB,CACtE,EAAS,CACb,KAAM,EAAQ,KACd,oBAAqB,EAAQ,QAAQ,KACrC,YAAa,EAAQ,SACrB,wBAAyB,EAAQ,qBACjC,YAAa,EAAQ,SACrB,WACD,CAED,GAAI,EAAQ,iBAAkB,CAC5B,IAAM,EAAgB,GAA2B,EAAc,EAAQ,iBAAiB,CACxF,GAAI,EACF,MAAO,CACL,GAAG,EACH,iBAAkB,EACnB,CAKL,MAAO,CACL,GAAG,EACH,cAAe,EAAQ,OAAO,KAC9B,mBACE,EAAQ,UAAU,OAAS,EAAI,EAAQ,UAAU,IAAK,GAAO,EAAG,MAAM,CAAG,IAAA,GAC5E,EAEJ,CA6DH,GAzDE,GAAuB,OAAS,GAChC,EAAU,SAAA,oBAAiD,GAE3D,EAAO,sBAAwB,GAAuB,KACnD,CAAE,OAAM,YAAgD,CACvD,OACA,MAAO,EAAM,eACd,EACF,EAKD,EAAY,SAAW,GACvB,EAAU,OAAS,GACnB,EAAU,SAAA,YAAyC,GAEnD,EAAO,UAAY,EAAU,KAAK,CAAE,YAAa,CAAE,QAAO,EAAE,EAI1D,EAAU,OAAS,GAAK,EAAU,SAAA,YAAyC,GAC7E,EAAO,UAAY,EAAU,KAC1B,CACC,QACA,MACA,OACA,kBACA,cACA,UACA,YACA,eACA,qBACA,mBACA,0BACA,eACA,iBACoB,CACpB,QACA,IAAK,GAAO,IAAA,GACZ,OACA,mBAAoB,GAAiB,KACrC,qBAAsB,EAAY,KAAK,CAAE,UAAW,EAAK,CACzD,kBACE,OAAO,OAAO,EAAc,CAAC,SAAW,EAAQ,OAAS,IAAA,GAAY,EACvE,UAAW,GAAa,IAAA,GACxB,iBAAkB,GAAoB,IAAA,GACtC,mBAAoB,SAAS,EAAoB,GAAG,CACpD,wBAAyB,GAA2B,IAAA,GACpD,aAAc,GAAgB,EAAa,OAAS,EAAI,EAAe,IAAA,GACvE,WAAY,GAAc,EAAW,OAAS,EAAI,EAAa,IAAA,GAC/D,gBAAiB,EAAa,KAAK,CAAE,UAAW,EAAK,CACtD,EACF,EAIC,EAAU,OAAS,GAAK,EAAU,SAAA,YAAyC,CAAE,CAC/E,IAAM,EAAsB,EAAM,EAAc,OAAO,CACvD,EAAO,cAAgB,EAAU,KAC9B,CACC,CACE,QACA,cACA,MACA,OACA,YACA,UACA,qBACA,cACA,qBACA,SACA,UACA,qBACA,QACA,mBACA,SACA,kCACA,6BACA,iDACA,uCACA,2BACA,UACA,kBACA,eACA,mBACA,WAEF,OACoB,CACpB,QACA,cACA,gBAAiB,EACjB,aAAc,GAAa,IAAA,GAC3B,IAAK,GAAO,IAAA,GACZ,gBAAiB,EAAQ,IAAI,MAC7B,YAAa,IAAQ,IAAM,IAAA,GAC3B,gBAAiB,EACd,QAAQ,CAAE,iBAAkB,EAAY,CACxC,KAAK,CAAE,UAAW,EAAK,CAC1B,GAAI,EAAmB,OAAS,EAC5B,CACE,wBAAyB,EAAmB,KAAK,CAAE,WAAY,EAAM,CACtE,CACD,EAAE,CACN,GAAI,EAAO,OAAS,EAAI,CAAE,OAAQ,EAAO,KAAK,CAAE,WAAY,EAAM,CAAE,CAAG,EAAE,CACzE,GAAI,EAAM,OAAS,EAAI,CAAE,MAAO,EAAM,KAAK,CAAE,UAAW,EAAK,CAAE,CAAG,EAAE,CACpE,GAAI,EAAa,OAAS,EACtB,CAAE,aAAc,EAAa,KAAK,CAAE,WAAY,EAAM,CAAE,CACxD,EAAE,CACN,GAAI,EAAiB,OAAS,EAC1B,CACE,iBAAkB,EAAiB,KAAK,CAAE,WAAY,EAAM,CAC7D,CACD,EAAE,CACN,QAAS,GAAW,IAAA,GACpB,mBAAoB,GAAsB,IAAA,GAC1C,SAAU,CAAC,EACX,gBACE,EAAiB,OAAS,EACtB,EACE,EAAiB,KAAK,CAAE,UAAW,EAAK,CACxC,EACD,CACD,IAAA,GACN,GAAI,EAAQ,oBACR,CACE,iBAAkB,CAChB,uBAAwB,GAAsB,IAAA,GAC9C,iBAAkB,EAClB,YAAa,EACb,iCAAkC,EAClC,uBAAwB,EACxB,8BAA+B,EAChC,CACF,CACD,EAAE,CACN,WACE,IAAoB,IAAA,IAAa,EAAgB,OAAS,EACtD,EAAsB,EAAgB,CACtC,IAAA,GAEN,WAAY,GACT,IACE,IAA+B,CAC9B,IAAK,EAAU,KACf,MAAO,EAAU,OAAO,eACxB,YAAa,EAAU,aAAa,eACpC,OAAQ,EAAU,OAAO,KAAK,CAAE,WAAY,EAAM,CAClD,MAAO,EAAU,MAAM,KAAK,CAAE,UAAW,EAAK,CAC9C,GAAI,EAAU,KAAK,OAAS,EAAI,CAAE,KAAM,EAAU,KAAM,CAAG,EAAE,CAC7D,GAAI,EAAU,gBAAgB,MAC1B,CACE,sBAAuB,EAAU,eAAe,MAAM,eACvD,CACD,EAAE,CACN,GAAI,EAAU,qBAAqB,OAAS,EACxC,CACE,yBAA0B,EACxB,EAAM,EAAU,qBAAsB,cAAc,CACnD,GACC,EAAyB,gBACzB,EAAyB,OACzB,IAAA,GACH,CACF,CACD,EAAE,CACN,GAAI,EAAU,cAAc,OAAS,EACjC,CACE,OAAQ,EAAU,cACf,IACE,IAAuB,CACtB,IAAK,EAAM,KACX,YAAa,EAAM,YACnB,SAAU,EAAM,SAChB,WAAY,EAAM,WAClB,GAAI,GAA4B,EAAM,uBAClC,CACE,qBAAsB,EAAM,uBACzB,OAAQ,GAAU,EAAM,SAAW,UAAU,CAC7C,IAAK,IAAW,CACf,SAAU,CACR,KAAM,EAAM,SAAS,KACrB,SAAU,EAAM,SAAS,SAC1B,CACD,OAAQ,EAAM,OACd,WAAY,EAAM,WAClB,kBAAmB,EAAM,mBAAqB,IAAA,GAC/C,EAAE,CACN,CACD,EAAE,CACN,oCAAqC,EAAM,+BAC3C,oCAAqC,EAAM,+BAC3C,WACE,EAAM,kBAAoB,IAAA,IAAa,EAAM,gBAAgB,OAAS,EAClE,EAAsB,EAAM,gBAAgB,CAC5C,IAAA,GACP,EACF,CACA,MAAM,EAAG,IAAM,EAAE,IAAI,cAAc,EAAE,IAAI,CAAC,CAC9C,CACD,EAAE,CACN,kBAAmB,EAAU,eAC1B,QAAQ,CAAE,YAAa,EAAO,CAC9B,KAAK,CAAE,UAAW,EAAK,CAC3B,EACF,CACA,MAAM,EAAG,IACR,CAAC,GAAI,EAAE,MAAQ,EAAE,CAAG,EAAE,IAAI,CACvB,KAAK,IAAI,CACT,cAAc,CAAC,GAAI,EAAE,MAAQ,EAAE,CAAG,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,CACvD,CACJ,EACF,CAEH,OAAO"}