Files
nextcloud-server-mirror/dist/encryption-settings_admin.mjs.map
2026-10-07 08:58:40 +00:00

1 line
16 KiB
Plaintext

{"version":3,"file":"encryption-settings_admin.mjs","sources":["../build/frontend/apps/encryption/src/components/SettingsAdminHomeStorage.vue","../build/frontend/apps/encryption/src/components/SettingsAdminRecoveryKey.vue","../build/frontend/apps/encryption/src/components/SettingsAdminRecoveryKeyChange.vue","../build/frontend/apps/encryption/src/views/SettingsAdmin.vue","../build/frontend/apps/encryption/src/settings-admin.ts"],"sourcesContent":["<!--\n - SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n -->\n\n<script setup lang=\"ts\">\nimport axios from '@nextcloud/axios'\nimport { t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { watchDebounced } from '@vueuse/core'\nimport { ref, watch } from 'vue'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'\n\nconst encryptHomeStorage = defineModel<boolean>({ required: true })\nconst isSavingHomeStorageEncryption = ref(false)\n\nwatch(encryptHomeStorage, () => {\n\tisSavingHomeStorageEncryption.value = true\n})\nwatchDebounced(encryptHomeStorage, async (encryptHomeStorage, oldValue) => {\n\tif (encryptHomeStorage === oldValue) {\n\t\t// user changed their mind (likely quickly toggled), do nothing\n\t\tisSavingHomeStorageEncryption.value = false\n\t\treturn\n\t}\n\n\ttry {\n\t\tawait axios.post(\n\t\t\tgenerateUrl('/apps/encryption/ajax/setEncryptHomeStorage'),\n\t\t\t{ encryptHomeStorage },\n\t\t)\n\t} finally {\n\t\tisSavingHomeStorageEncryption.value = false\n\t}\n}, { debounce: 800 })\n</script>\n\n<template>\n\t<NcCheckboxRadioSwitch\n\t\tv-model=\"encryptHomeStorage\"\n\t\t:loading=\"isSavingHomeStorageEncryption\"\n\t\t:description=\"t('encryption', 'Controls whether server-side encryption applies to files within the home storage of accounts. Modifying this setting does not control separately mounted external storage, and does not trigger bulk encryption or decryption of existing files.')\"\n\t\ttype=\"switch\">\n\t\t{{ t('encryption', 'Encrypt the home storage') }}\n\t</NcCheckboxRadioSwitch>\n</template>\n","<!--\n - SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n -->\n\n<script setup lang=\"ts\">\nimport axios from '@nextcloud/axios'\nimport { showSuccess } from '@nextcloud/dialogs'\nimport { t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { computed, ref, useTemplateRef } from 'vue'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcFormGroup from '@nextcloud/vue/components/NcFormGroup'\nimport NcNoteCard from '@nextcloud/vue/components/NcNoteCard'\nimport NcPasswordField from '@nextcloud/vue/components/NcPasswordField'\nimport { logger } from '../utils/logger.ts'\n\nconst recoveryEnabled = defineModel<boolean>({ required: true })\nconst formElement = useTemplateRef('form')\n\nconst isLoading = ref(false)\nconst hasError = ref(false)\n\nconst password = ref('')\nconst confirmPassword = ref('')\nconst passwordMatch = computed(() => password.value === confirmPassword.value)\n\n/**\n * Handle the form submission to enable or disable the admin recovery key\n */\nasync function onSubmit() {\n\tif (isLoading.value) {\n\t\treturn\n\t}\n\n\tif (!passwordMatch.value) {\n\t\treturn\n\t}\n\n\thasError.value = false\n\tisLoading.value = true\n\ttry {\n\t\tconst { data } = await axios.post(\n\t\t\tgenerateUrl('/apps/encryption/ajax/adminRecovery'),\n\t\t\t{\n\t\t\t\tadminEnableRecovery: !recoveryEnabled.value,\n\t\t\t\trecoveryPassword: password.value,\n\t\t\t\tconfirmPassword: confirmPassword.value,\n\t\t\t},\n\t\t)\n\t\trecoveryEnabled.value = !recoveryEnabled.value\n\t\tpassword.value = confirmPassword.value = ''\n\t\tformElement.value?.reset()\n\t\tif (data.data.message) {\n\t\t\tshowSuccess(data.data.message)\n\t\t}\n\t} catch (error) {\n\t\thasError.value = true\n\t\tlogger.error('Failed to update recovery key settings', { error })\n\t} finally {\n\t\tisLoading.value = false\n\t}\n}\n</script>\n\n<template>\n\t<form ref=\"form\" @submit.prevent=\"onSubmit\">\n\t\t<NcFormGroup\n\t\t\t:label=\"recoveryEnabled ? t('encryption', 'Disable administrator recovery key') : t('encryption', 'Enable administrator recovery key')\"\n\t\t\t:description=\"t('encryption', 'Controls whether the administrator recovery key is available to help restore access to encrypted files if an account login password is lost. Each account must also opt in to recovery separately in its personal settings.')\">\n\t\t\t<NcPasswordField\n\t\t\t\tv-model=\"password\"\n\t\t\t\trequired\n\t\t\t\tname=\"password\"\n\t\t\t\t:label=\"t('encryption', 'Recovery key password')\" />\n\t\t\t<NcPasswordField\n\t\t\t\tv-model=\"confirmPassword\"\n\t\t\t\trequired\n\t\t\t\tname=\"confirmPassword\"\n\t\t\t\t:error=\"!!confirmPassword && !passwordMatch\"\n\t\t\t\t:helperText=\"(passwordMatch || !confirmPassword) ? '' : t('encryption', 'Passwords fields do not match')\"\n\t\t\t\t:label=\"t('encryption', 'Repeat recovery key password')\" />\n\n\t\t\t<NcButton type=\"submit\" :variant=\"recoveryEnabled ? 'error' : 'primary'\">\n\t\t\t\t{{ recoveryEnabled ? t('encryption', 'Disable administrator recovery key') : t('encryption', 'Enable administrator recovery key') }}\n\t\t\t</NcButton>\n\n\t\t\t<NcNoteCard v-if=\"hasError\" type=\"error\">\n\t\t\t\t{{ t('encryption', 'An error occurred while updating the recovery key settings. Please try again.') }}\n\t\t\t</NcNoteCard>\n\t\t</NcFormGroup>\n\t</form>\n</template>\n","<!--\n - SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n -->\n\n<script setup lang=\"ts\">\nimport axios from '@nextcloud/axios'\nimport { t } from '@nextcloud/l10n'\nimport { generateUrl } from '@nextcloud/router'\nimport { computed, ref, useTemplateRef } from 'vue'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcFormGroup from '@nextcloud/vue/components/NcFormGroup'\nimport NcNoteCard from '@nextcloud/vue/components/NcNoteCard'\nimport NcPasswordField from '@nextcloud/vue/components/NcPasswordField'\nimport { logger } from '../utils/logger.ts'\n\nconst formElement = useTemplateRef('form')\n\nconst isLoading = ref(false)\nconst hasError = ref(false)\n\nconst oldPassword = ref('')\nconst password = ref('')\nconst confirmPassword = ref('')\nconst passwordMatch = computed(() => password.value === confirmPassword.value)\n\n/**\n * Handle the form submission to change the admin recovery key password\n */\nasync function onSubmit() {\n\tif (isLoading.value) {\n\t\treturn\n\t}\n\n\tif (!passwordMatch.value) {\n\t\treturn\n\t}\n\n\thasError.value = false\n\tisLoading.value = true\n\ttry {\n\t\tawait axios.post(\n\t\t\tgenerateUrl('/apps/encryption/ajax/changeRecoveryPassword'),\n\t\t\t{\n\t\t\t\toldPassword: oldPassword.value,\n\t\t\t\tnewPassword: password.value,\n\t\t\t\tconfirmPassword: confirmPassword.value,\n\t\t\t},\n\t\t)\n\t\toldPassword.value = password.value = confirmPassword.value = ''\n\t\tformElement.value?.reset()\n\t} catch (error) {\n\t\thasError.value = true\n\t\tlogger.error('Failed to update recovery key settings', { error })\n\t} finally {\n\t\tisLoading.value = false\n\t}\n}\n</script>\n\n<template>\n\t<form ref=\"form\" :class=\"$style.settingsAdminRecoveryKeyChange\" @submit.prevent=\"onSubmit\">\n\t\t<NcFormGroup\n\t\t\t:label=\"t('encryption', 'Change recovery key password')\">\n\t\t\t<NcPasswordField\n\t\t\t\tv-model=\"oldPassword\"\n\t\t\t\trequired\n\t\t\t\tname=\"oldPassword\"\n\t\t\t\t:label=\"t('encryption', 'Old recovery key password')\" />\n\t\t\t<NcPasswordField\n\t\t\t\tv-model=\"password\"\n\t\t\t\trequired\n\t\t\t\tname=\"password\"\n\t\t\t\t:label=\"t('encryption', 'New recovery key password')\" />\n\t\t\t<NcPasswordField\n\t\t\t\tv-model=\"confirmPassword\"\n\t\t\t\trequired\n\t\t\t\tname=\"confirmPassword\"\n\t\t\t\t:error=\"!passwordMatch && !!confirmPassword\"\n\t\t\t\t:helperText=\"(passwordMatch || !confirmPassword) ? '' : t('encryption', 'Passwords fields do not match')\"\n\t\t\t\t:label=\"t('encryption', 'Repeat new recovery key password')\" />\n\n\t\t\t<NcButton type=\"submit\" variant=\"primary\">\n\t\t\t\t{{ t('encryption', 'Change recovery key password') }}\n\t\t\t</NcButton>\n\n\t\t\t<NcNoteCard v-if=\"hasError\" type=\"error\">\n\t\t\t\t{{ t('encryption', 'An error occurred while changing the recovery key password. Please try again.') }}\n\t\t\t</NcNoteCard>\n\t\t</NcFormGroup>\n\t</form>\n</template>\n\n<style module>\n.settingsAdminRecoveryKeyChange {\n\tmargin-top: var(--clickable-area-small);\n}\n</style>\n","<!--\n - SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n -->\n\n<script setup lang=\"ts\">\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { NcNoteCard, NcSettingsSection } from '@nextcloud/vue'\nimport { ref } from 'vue'\nimport SettingsAdminHomeStorage from '../components/SettingsAdminHomeStorage.vue'\nimport SettingsAdminRecoveryKey from '../components/SettingsAdminRecoveryKey.vue'\nimport SettingsAdminRecoveryKeyChange from '../components/SettingsAdminRecoveryKeyChange.vue'\nimport { InitStatus } from '../utils/types.ts'\n\nconst adminSettings = loadState<{\n\trecoveryEnabled: boolean\n\tinitStatus: typeof InitStatus[keyof typeof InitStatus]\n\tencryptHomeStorage: boolean\n\tmasterKeyEnabled: boolean\n\tserverSideEncryptionEnabled: boolean\n}>('encryption', 'adminSettings')\n\nconst encryptHomeStorage = ref(adminSettings.encryptHomeStorage!)\nconst recoveryEnabled = ref(adminSettings.recoveryEnabled!)\n</script>\n\n<template>\n\t<NcSettingsSection :name=\"t('encryption', 'Default encryption module')\">\n\t\t<NcNoteCard v-if=\"adminSettings.initStatus === InitStatus.NotInitialized && !adminSettings.masterKeyEnabled\" type=\"warning\">\n\t\t\t{{ adminSettings.serverSideEncryptionEnabled\n\t\t\t\t? t('encryption', 'Your encryption keys are not initialized for this session. Please sign out and sign back in.')\n\t\t\t\t: t('encryption', 'Server-side encryption is disabled. To enable it, open Administration settings, select Security, and turn on Server-side encryption.') }}\n\t\t</NcNoteCard>\n\n\t\t<template v-else>\n\t\t\t<SettingsAdminHomeStorage v-model=\"encryptHomeStorage\" />\n\t\t\t<br>\n\t\t\t<SettingsAdminRecoveryKey v-if=\"!adminSettings.masterKeyEnabled\" v-model=\"recoveryEnabled\" />\n\t\t\t<SettingsAdminRecoveryKeyChange v-if=\"!adminSettings.masterKeyEnabled && recoveryEnabled\" />\n\t\t</template>\n\t</NcSettingsSection>\n</template>\n","/*!\n * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { createApp } from 'vue'\nimport SettingsAdmin from './views/SettingsAdmin.vue'\n\nconst app = createApp(SettingsAdmin)\napp.mount('#encryption-settings-section')\n"],"names":["encryptHomeStorage","_useModel","__props","isSavingHomeStorageEncryption","ref","watch","watchDebounced","oldValue","axios","generateUrl","_createBlock","_unref","NcCheckboxRadioSwitch","$event","t","recoveryEnabled","formElement","useTemplateRef","isLoading","hasError","password","confirmPassword","passwordMatch","computed","onSubmit","data","showSuccess","error","logger","_createElementBlock","_createVNode","NcFormGroup","NcPasswordField","NcButton","NcNoteCard","oldPassword","_normalizeClass","$style","adminSettings","loadState","NcSettingsSection","InitStatus","_createTextVNode","_toDisplayString","_Fragment","SettingsAdminHomeStorage","_createElementVNode","SettingsAdminRecoveryKey","SettingsAdminRecoveryKeyChange","app","createApp","SettingsAdmin"],"mappings":"gqGAaA,MAAMA,EAAqBC,EAAoBC,EAAA,YAAmB,EAC5DC,EAAgCC,EAAI,EAAK,EAE/C,OAAAC,EAAML,EAAoB,IAAM,CAC/BG,EAA8B,MAAQ,EACvC,CAAC,EACDG,EAAeN,EAAoB,MAAOA,EAAoBO,IAAa,CAC1E,GAAIP,IAAuBO,EAAU,CAEpCJ,EAA8B,MAAQ,GACtC,MACD,CAEA,GAAI,CACH,MAAMK,EAAM,KACXC,EAAY,6CAA6C,EACzD,CAAE,mBAAAT,CAAAA,CAAmB,CAEvB,SACCG,EAA8B,MAAQ,EACvC,CACD,EAAG,CAAE,SAAU,IAAK,cAInBO,EAMwBC,EAAAC,CAAA,EAAA,YALdZ,EAAA,2CAAAA,EAAkB,MAAAa,GAC1B,QAASV,EAAA,MACT,YAAaQ,EAAAG,CAAA,EAAC,aAAA,kPAAA,EACf,KAAK,QAAA,aACL,IAAiD,KAA9CH,EAAAG,CAAA,EAAC,aAAA,0BAAA,CAAA,EAAA,CAAA,CAAA,kMC1BN,MAAMC,EAAkBd,EAAoBC,EAAA,YAAmB,EACzDc,EAAcC,EAAe,MAAM,EAEnCC,EAAYd,EAAI,EAAK,EACrBe,EAAWf,EAAI,EAAK,EAEpBgB,EAAWhB,EAAI,EAAE,EACjBiB,EAAkBjB,EAAI,EAAE,EACxBkB,EAAgBC,EAAS,IAAMH,EAAS,QAAUC,EAAgB,KAAK,EAK7E,eAAeG,GAAW,CACzB,GAAI,CAAAN,EAAU,OAITI,EAAc,MAInB,CAAAH,EAAS,MAAQ,GACjBD,EAAU,MAAQ,GAClB,GAAI,CACH,KAAM,CAAE,KAAAO,CAAA,EAAS,MAAMjB,EAAM,KAC5BC,EAAY,qCAAqC,EACjD,CACC,oBAAqB,CAACM,EAAgB,MACtC,iBAAkBK,EAAS,MAC3B,gBAAiBC,EAAgB,KAAA,CAClC,EAEDN,EAAgB,MAAQ,CAACA,EAAgB,MACzCK,EAAS,MAAQC,EAAgB,MAAQ,GACzCL,EAAY,OAAO,MAAA,EACfS,EAAK,KAAK,SACbC,EAAYD,EAAK,KAAK,OAAO,CAE/B,OAASE,EAAO,CACfR,EAAS,MAAQ,GACjBS,EAAO,MAAM,yCAA0C,CAAE,MAAAD,CAAA,CAAO,CACjE,QAAA,CACCT,EAAU,MAAQ,EACnB,CAAA,CACD,mBAICW,EAyBO,OAAA,CAzBD,IAAI,OAAQ,WAAgBL,EAAQ,CAAA,SAAA,CAAA,CAAA,GACzCM,EAuBcnB,EAAAoB,CAAA,EAAA,CAtBZ,MAAOhB,EAAA,MAAkBJ,EAAAG,CAAA,qDAAwDH,EAAAG,CAAA,EAAC,aAAA,mCAAA,EAClF,YAAaH,EAAAG,CAAA,EAAC,aAAA,6NAAA,CAAA,aACf,IAIqD,CAJrDgB,EAIqDnB,EAAAqB,CAAA,EAAA,YAH3CZ,EAAA,2CAAAA,EAAQ,MAAAP,GACjB,SAAA,GACA,KAAK,WACJ,MAAOF,EAAAG,CAAA,EAAC,aAAA,uBAAA,CAAA,iCACVgB,EAM4DnB,EAAAqB,CAAA,EAAA,YALlDX,EAAA,2CAAAA,EAAe,MAAAR,GACxB,SAAA,GACA,KAAK,kBACJ,MAAK,CAAA,CAAIQ,EAAA,OAAe,CAAKC,EAAA,MAC7B,WAAaA,EAAA,OAAa,CAAKD,EAAA,SAAwBV,EAAAG,CAAA,EAAC,aAAA,+BAAA,EACxD,MAAOH,EAAAG,CAAA,EAAC,aAAA,8BAAA,CAAA,sDAEVgB,EAEWnB,EAAAsB,CAAA,EAAA,CAFD,KAAK,SAAU,QAASlB,EAAA,MAAe,QAAA,SAAA,aAChD,IAAoI,KAAjIA,EAAA,MAAkBJ,EAAAG,CAAA,EAAC,aAAA,oCAAA,EAAuDH,EAAAG,CAAA,EAAC,aAAA,mCAAA,CAAA,EAAA,CAAA,CAAA,uBAG7DK,EAAA,WAAlBT,EAEaC,EAAAuB,CAAA,EAAA,OAFe,KAAK,OAAA,aAChC,IAAsG,KAAnGvB,EAAAG,CAAA,EAAC,aAAA,+EAAA,CAAA,EAAA,CAAA,CAAA,qHCxER,MAAME,EAAcC,EAAe,MAAM,EAEnCC,EAAYd,EAAI,EAAK,EACrBe,EAAWf,EAAI,EAAK,EAEpB+B,EAAc/B,EAAI,EAAE,EACpBgB,EAAWhB,EAAI,EAAE,EACjBiB,EAAkBjB,EAAI,EAAE,EACxBkB,EAAgBC,EAAS,IAAMH,EAAS,QAAUC,EAAgB,KAAK,EAK7E,eAAeG,GAAW,CACzB,GAAI,CAAAN,EAAU,OAITI,EAAc,MAInB,CAAAH,EAAS,MAAQ,GACjBD,EAAU,MAAQ,GAClB,GAAI,CACH,MAAMV,EAAM,KACXC,EAAY,8CAA8C,EAC1D,CACC,YAAa0B,EAAY,MACzB,YAAaf,EAAS,MACtB,gBAAiBC,EAAgB,KAAA,CAClC,EAEDc,EAAY,MAAQf,EAAS,MAAQC,EAAgB,MAAQ,GAC7DL,EAAY,OAAO,MAAA,CACpB,OAASW,EAAO,CACfR,EAAS,MAAQ,GACjBS,EAAO,MAAM,yCAA0C,CAAE,MAAAD,CAAA,CAAO,CACjE,QAAA,CACCT,EAAU,MAAQ,EACnB,CAAA,CACD,mBAICW,EA6BO,OAAA,CA7BD,IAAI,OAAQ,MAAKO,EAAEC,EAAAA,OAAO,8BAA8B,EAAG,WAAgBb,EAAQ,CAAA,SAAA,CAAA,CAAA,GACxFM,EA2BcnB,EAAAoB,CAAA,EAAA,CA1BZ,MAAOpB,EAAAG,CAAA,EAAC,aAAA,8BAAA,CAAA,aACT,IAIyD,CAJzDgB,EAIyDnB,EAAAqB,CAAA,EAAA,YAH/CG,EAAA,2CAAAA,EAAW,MAAAtB,GACpB,SAAA,GACA,KAAK,cACJ,MAAOF,EAAAG,CAAA,EAAC,aAAA,2BAAA,CAAA,iCACVgB,EAIyDnB,EAAAqB,CAAA,EAAA,YAH/CZ,EAAA,2CAAAA,EAAQ,MAAAP,GACjB,SAAA,GACA,KAAK,WACJ,MAAOF,EAAAG,CAAA,EAAC,aAAA,2BAAA,CAAA,iCACVgB,EAMgEnB,EAAAqB,CAAA,EAAA,YALtDX,EAAA,2CAAAA,EAAe,MAAAR,GACxB,SAAA,GACA,KAAK,kBACJ,MAAK,CAAGS,EAAA,OAAa,CAAA,CAAMD,EAAA,MAC3B,WAAaC,EAAA,OAAa,CAAKD,EAAA,SAAwBV,EAAAG,CAAA,EAAC,aAAA,+BAAA,EACxD,MAAOH,EAAAG,CAAA,EAAC,aAAA,kCAAA,CAAA,sDAEVgB,EAEWnB,EAAAsB,CAAA,EAAA,CAFD,KAAK,SAAS,QAAQ,SAAA,aAC/B,IAAqD,KAAlDtB,EAAAG,CAAA,EAAC,aAAA,8BAAA,CAAA,EAAA,CAAA,CAAA,SAGaK,EAAA,WAAlBT,EAEaC,EAAAuB,CAAA,EAAA,OAFe,KAAK,OAAA,aAChC,IAAsG,KAAnGvB,EAAAG,CAAA,EAAC,aAAA,+EAAA,CAAA,EAAA,CAAA,CAAA,gNCxER,MAAMwB,EAAgBC,EAMnB,aAAc,eAAe,EAE1BvC,EAAqBI,EAAIkC,EAAc,kBAAmB,EAC1DvB,EAAkBX,EAAIkC,EAAc,eAAgB,oBAIzD5B,EAaoBC,EAAA6B,CAAA,EAAA,CAbA,KAAM7B,EAAAG,CAAA,EAAC,aAAA,2BAAA,CAAA,aAC1B,IAIa,CAJKH,EAAA2B,CAAA,EAAc,aAAe3B,EAAA8B,CAAA,EAAW,gBAAc,CAAK9B,EAAA2B,CAAA,EAAc,sBAA3F5B,EAIaC,EAAAuB,CAAA,EAAA,OAJgG,KAAK,SAAA,aACjH,IAE6J,CAF1JQ,EAAAC,EAAAhC,EAAA2B,CAAA,EAAc,4BAAkC3B,EAAAG,CAAA,EAAC,aAAA,8FAAA,EAAqHH,EAAAG,CAAA,EAAC,aAAA,sIAAA,CAAA,EAAA,CAAA,CAAA,eAK3Ke,EAKWe,EAAA,CAAA,IAAA,GAAA,CAJVd,EAAyDe,EAAA,YAAtB7C,EAAA,2CAAAA,EAAkB,MAAAa,EAAA,qCACrDiC,EAAI,KAAA,KAAA,KAAA,EAAA,GAC6BnC,EAAA2B,CAAA,EAAc,+BAA/C5B,EAA6FqC,EAAA,kBAAnBhC,EAAA,2CAAAA,EAAe,MAAAF,EAAA,2BAClDF,EAAA2B,CAAA,EAAc,kBAAoBvB,EAAA,WAAzEL,EAA4FsC,EAAA,CAAA,IAAA,CAAA,CAAA,yCC/BzFC,GAAMC,EAAUC,EAAa,EACnCF,GAAI,MAAM,8BAA8B"}