@icure/api 8.10.2 → 8.11.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.
- package/icc-api/api/IccPatientApi.d.ts +1 -1
- package/icc-api/api/IccPatientApi.js +4 -2
- package/icc-api/api/IccPatientApi.js.map +1 -1
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.d.ts +11 -0
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.js +75 -13
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.js.map +1 -1
- package/icc-x-api/crypto/SecurityMetadataDecryptor.d.ts +14 -0
- package/icc-x-api/crypto/SecurityMetadataDecryptor.js +28 -0
- package/icc-x-api/crypto/SecurityMetadataDecryptor.js.map +1 -1
- package/icc-x-api/icc-patient-x-api.d.ts +4 -1
- package/icc-x-api/icc-patient-x-api.js +5 -2
- package/icc-x-api/icc-patient-x-api.js.map +1 -1
- package/package.json +1 -1
- package/test/benchmarks/lzma-benchmark.spec.d.ts +1 -0
- package/test/benchmarks/lzma-benchmark.spec.js +131 -0
- package/test/benchmarks/lzma-benchmark.spec.js.map +1 -0
- package/test/benchmarks/lzma-compat.spec.d.ts +1 -0
- package/test/benchmarks/lzma-compat.spec.js +187 -0
- package/test/benchmarks/lzma-compat.spec.js.map +1 -0
- package/test/benchmarks/playwright.config.d.ts +2 -0
- package/test/benchmarks/playwright.config.js +18 -0
- package/test/benchmarks/playwright.config.js.map +1 -0
- package/test/icc-api/api/IccAgendaApi.d.ts +1 -0
- package/test/icc-api/api/IccAgendaApi.js +64 -0
- package/test/icc-api/api/IccAgendaApi.js.map +1 -0
- package/test/icc-api/api/IccAnonymousAccessApi.d.ts +1 -0
- package/test/icc-api/api/IccAnonymousAccessApi.js +58 -0
- package/test/icc-api/api/IccAnonymousAccessApi.js.map +1 -0
- package/test/icc-api/api/IccCalendarItemApi.d.ts +1 -0
- package/test/icc-api/api/IccCalendarItemApi.js +67 -0
- package/test/icc-api/api/IccCalendarItemApi.js.map +1 -0
- package/test/icc-api/api/IccCalendarItemTypeApi.d.ts +1 -0
- package/test/icc-api/api/IccCalendarItemTypeApi.js +96 -0
- package/test/icc-api/api/IccCalendarItemTypeApi.js.map +1 -0
- package/test/icc-api/api/IccCodeApi.d.ts +1 -0
- package/test/icc-api/api/IccCodeApi.js +38 -0
- package/test/icc-api/api/IccCodeApi.js.map +1 -0
- package/test/icc-api/api/IccDocumentApi.d.ts +1 -0
- package/test/icc-api/api/IccDocumentApi.js +199 -0
- package/test/icc-api/api/IccDocumentApi.js.map +1 -0
- package/test/icc-api/api/IccGroupApi.d.ts +1 -0
- package/test/icc-api/api/IccGroupApi.js +50 -0
- package/test/icc-api/api/IccGroupApi.js.map +1 -0
- package/test/icc-api/api/IccKeywordApi.d.ts +1 -0
- package/test/icc-api/api/IccKeywordApi.js +64 -0
- package/test/icc-api/api/IccKeywordApi.js.map +1 -0
- package/test/icc-api/api/IccMedicalLocationApi.d.ts +1 -0
- package/test/icc-api/api/IccMedicalLocationApi.js +64 -0
- package/test/icc-api/api/IccMedicalLocationApi.js.map +1 -0
- package/test/icc-api/api/IccPlaceApi.d.ts +1 -0
- package/test/icc-api/api/IccPlaceApi.js +64 -0
- package/test/icc-api/api/IccPlaceApi.js.map +1 -0
- package/test/icc-api/api/IccRecoveryDataApi.d.ts +1 -0
- package/test/icc-api/api/IccRecoveryDataApi.js +95 -0
- package/test/icc-api/api/IccRecoveryDataApi.js.map +1 -0
- package/test/icc-api/api/IccRoleApi.d.ts +1 -0
- package/test/icc-api/api/IccRoleApi.js +34 -0
- package/test/icc-api/api/IccRoleApi.js.map +1 -0
- package/test/icc-api/api/IccUserApi.d.ts +1 -0
- package/test/icc-api/api/IccUserApi.js +96 -0
- package/test/icc-api/api/IccUserApi.js.map +1 -0
- package/test/icc-api/e2e/IccCalendarItemApi.d.ts +1 -0
- package/test/icc-api/e2e/IccCalendarItemApi.js +46 -0
- package/test/icc-api/e2e/IccCalendarItemApi.js.map +1 -0
- package/test/icc-api/model/modelHelpersTest.d.ts +1 -0
- package/test/icc-api/model/modelHelpersTest.js +45 -0
- package/test/icc-api/model/modelHelpersTest.js.map +1 -0
- package/test/icc-x-api/auth/group-switch-test.d.ts +1 -0
- package/test/icc-x-api/auth/group-switch-test.js +81 -0
- package/test/icc-x-api/auth/group-switch-test.js.map +1 -0
- package/test/icc-x-api/auth/jwt-concurrency-test.d.ts +2 -0
- package/test/icc-x-api/auth/jwt-concurrency-test.js +112 -0
- package/test/icc-x-api/auth/jwt-concurrency-test.js.map +1 -0
- package/test/icc-x-api/auth/jwt-provider-test.d.ts +1 -0
- package/test/icc-x-api/auth/jwt-provider-test.js +197 -0
- package/test/icc-x-api/auth/jwt-provider-test.js.map +1 -0
- package/test/icc-x-api/auth/smart-auth-provider-test.d.ts +1 -0
- package/test/icc-x-api/auth/smart-auth-provider-test.js +224 -0
- package/test/icc-x-api/auth/smart-auth-provider-test.js.map +1 -0
- package/test/icc-x-api/autofix-anonymity-test.d.ts +1 -0
- package/test/icc-x-api/autofix-anonymity-test.js +122 -0
- package/test/icc-x-api/autofix-anonymity-test.js.map +1 -0
- package/test/icc-x-api/confidential-entities-test.d.ts +1 -0
- package/test/icc-x-api/confidential-entities-test.js +168 -0
- package/test/icc-x-api/confidential-entities-test.js.map +1 -0
- package/test/icc-x-api/crud/comprehensive-crud-test.d.ts +1 -0
- package/test/icc-x-api/crud/comprehensive-crud-test.js +276 -0
- package/test/icc-x-api/crud/comprehensive-crud-test.js.map +1 -0
- package/test/icc-x-api/crud/entities-crud-test-interface.d.ts +16 -0
- package/test/icc-x-api/crud/entities-crud-test-interface.js +407 -0
- package/test/icc-x-api/crud/entities-crud-test-interface.js.map +1 -0
- package/test/icc-x-api/crypto/anonymous-delegations-test.d.ts +1 -0
- package/test/icc-x-api/crypto/anonymous-delegations-test.js +587 -0
- package/test/icc-x-api/crypto/anonymous-delegations-test.js.map +1 -0
- package/test/icc-x-api/crypto/concurrency.d.ts +1 -0
- package/test/icc-x-api/crypto/concurrency.js +35 -0
- package/test/icc-x-api/crypto/concurrency.js.map +1 -0
- package/test/icc-x-api/crypto/crypto-utils.d.ts +1 -0
- package/test/icc-x-api/crypto/crypto-utils.js +79 -0
- package/test/icc-x-api/crypto/crypto-utils.js.map +1 -0
- package/test/icc-x-api/crypto/cryptoTest.d.ts +2 -0
- package/test/icc-x-api/crypto/cryptoTest.js +402 -0
- package/test/icc-x-api/crypto/cryptoTest.js.map +1 -0
- package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.d.ts +1 -0
- package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js +166 -0
- package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js.map +1 -0
- package/test/icc-x-api/crypto/exchange-data-manager-test.d.ts +1 -0
- package/test/icc-x-api/crypto/exchange-data-manager-test.js +674 -0
- package/test/icc-x-api/crypto/exchange-data-manager-test.js.map +1 -0
- package/test/icc-x-api/crypto/full-crypto-test.d.ts +1 -0
- package/test/icc-x-api/crypto/full-crypto-test.js +454 -0
- package/test/icc-x-api/crypto/full-crypto-test.js.map +1 -0
- package/test/icc-x-api/crypto/legacy-metadata-migration-test.d.ts +1 -0
- package/test/icc-x-api/crypto/legacy-metadata-migration-test.js +379 -0
- package/test/icc-x-api/crypto/legacy-metadata-migration-test.js.map +1 -0
- package/test/icc-x-api/crypto/secure-delegations-manager-test.d.ts +1 -0
- package/test/icc-x-api/crypto/secure-delegations-manager-test.js +278 -0
- package/test/icc-x-api/crypto/secure-delegations-manager-test.js.map +1 -0
- package/test/icc-x-api/crypto/shamir.d.ts +2 -0
- package/test/icc-x-api/crypto/shamir.js +167 -0
- package/test/icc-x-api/crypto/shamir.js.map +1 -0
- package/test/icc-x-api/crypto/share-deduplication-test.d.ts +1 -0
- package/test/icc-x-api/crypto/share-deduplication-test.js +250 -0
- package/test/icc-x-api/crypto/share-deduplication-test.js.map +1 -0
- package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.d.ts +1 -0
- package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js +71 -0
- package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js.map +1 -0
- package/test/icc-x-api/crypto/soft-deleted-data-owners.d.ts +2 -0
- package/test/icc-x-api/crypto/soft-deleted-data-owners.js +113 -0
- package/test/icc-x-api/crypto/soft-deleted-data-owners.js.map +1 -0
- package/test/icc-x-api/crypto/user-encryption-keys-manager-test.d.ts +1 -0
- package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js +246 -0
- package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js.map +1 -0
- package/test/icc-x-api/entity-with-attachments-api-test.d.ts +1 -0
- package/test/icc-x-api/entity-with-attachments-api-test.js +142 -0
- package/test/icc-x-api/entity-with-attachments-api-test.js.map +1 -0
- package/test/icc-x-api/filters/filters.d.ts +1 -0
- package/test/icc-x-api/filters/filters.js +49 -0
- package/test/icc-x-api/filters/filters.js.map +1 -0
- package/test/icc-x-api/filters/healthelement.d.ts +1 -0
- package/test/icc-x-api/filters/healthelement.js +333 -0
- package/test/icc-x-api/filters/healthelement.js.map +1 -0
- package/test/icc-x-api/icc-accesslog-x-api.d.ts +1 -0
- package/test/icc-x-api/icc-accesslog-x-api.js +106 -0
- package/test/icc-x-api/icc-accesslog-x-api.js.map +1 -0
- package/test/icc-x-api/icc-application-settings-x-api.d.ts +1 -0
- package/test/icc-x-api/icc-application-settings-x-api.js +91 -0
- package/test/icc-x-api/icc-application-settings-x-api.js.map +1 -0
- package/test/icc-x-api/icc-auth-api.d.ts +1 -0
- package/test/icc-x-api/icc-auth-api.js +47 -0
- package/test/icc-x-api/icc-auth-api.js.map +1 -0
- package/test/icc-x-api/icc-calendar-item-x-api.d.ts +1 -0
- package/test/icc-x-api/icc-calendar-item-x-api.js +150 -0
- package/test/icc-x-api/icc-calendar-item-x-api.js.map +1 -0
- package/test/icc-x-api/icc-code-x-api-test.d.ts +1 -0
- package/test/icc-x-api/icc-code-x-api-test.js +74 -0
- package/test/icc-x-api/icc-code-x-api-test.js.map +1 -0
- package/test/icc-x-api/icc-contact-x-api.d.ts +1 -0
- package/test/icc-x-api/icc-contact-x-api.js +355 -0
- package/test/icc-x-api/icc-contact-x-api.js.map +1 -0
- package/test/icc-x-api/icc-document-x-api.d.ts +1 -0
- package/test/icc-x-api/icc-document-x-api.js +76 -0
- package/test/icc-x-api/icc-document-x-api.js.map +1 -0
- package/test/icc-x-api/icc-form-x-api.d.ts +1 -0
- package/test/icc-x-api/icc-form-x-api.js +413 -0
- package/test/icc-x-api/icc-form-x-api.js.map +1 -0
- package/test/icc-x-api/icc-hcparty-x-api-test.d.ts +1 -0
- package/test/icc-x-api/icc-hcparty-x-api-test.js +43 -0
- package/test/icc-x-api/icc-hcparty-x-api-test.js.map +1 -0
- package/test/icc-x-api/icc-helement-x-api-test.d.ts +1 -0
- package/test/icc-x-api/icc-helement-x-api-test.js +155 -0
- package/test/icc-x-api/icc-helement-x-api-test.js.map +1 -0
- package/test/icc-x-api/icc-invoice-x-api.d.ts +1 -0
- package/test/icc-x-api/icc-invoice-x-api.js +99 -0
- package/test/icc-x-api/icc-invoice-x-api.js.map +1 -0
- package/test/icc-x-api/icc-maintenance-task-x-api-test.d.ts +1 -0
- package/test/icc-x-api/icc-maintenance-task-x-api-test.js +222 -0
- package/test/icc-x-api/icc-maintenance-task-x-api-test.js.map +1 -0
- package/test/icc-x-api/icc-message-x-api.d.ts +1 -0
- package/test/icc-x-api/icc-message-x-api.js +54 -0
- package/test/icc-x-api/icc-message-x-api.js.map +1 -0
- package/test/icc-x-api/icc-patient-x-api-test.d.ts +1 -0
- package/test/icc-x-api/icc-patient-x-api-test.js +209 -0
- package/test/icc-x-api/icc-patient-x-api-test.js.map +1 -0
- package/test/icc-x-api/icc-recovery-x-api.d.ts +1 -0
- package/test/icc-x-api/icc-recovery-x-api.js +175 -0
- package/test/icc-x-api/icc-recovery-x-api.js.map +1 -0
- package/test/icc-x-api/icc-topic-x-api.d.ts +1 -0
- package/test/icc-x-api/icc-topic-x-api.js +269 -0
- package/test/icc-x-api/icc-topic-x-api.js.map +1 -0
- package/test/icc-x-api/icc-user-x-api-test.d.ts +1 -0
- package/test/icc-x-api/icc-user-x-api-test.js +99 -0
- package/test/icc-x-api/icc-user-x-api-test.js.map +1 -0
- package/test/icc-x-api/keyless-api.d.ts +1 -0
- package/test/icc-x-api/keyless-api.js +125 -0
- package/test/icc-x-api/keyless-api.js.map +1 -0
- package/test/icc-x-api/patient-user.d.ts +2 -0
- package/test/icc-x-api/patient-user.js +103 -0
- package/test/icc-x-api/patient-user.js.map +1 -0
- package/test/icc-x-api/storage/storage.d.ts +1 -0
- package/test/icc-x-api/storage/storage.js +48 -0
- package/test/icc-x-api/storage/storage.js.map +1 -0
- package/test/icc-x-api/test-api-no-parent.d.ts +1 -0
- package/test/icc-x-api/test-api-no-parent.js +79 -0
- package/test/icc-x-api/test-api-no-parent.js.map +1 -0
- package/test/icc-x-api/test-legacy-data-support.d.ts +1 -0
- package/test/icc-x-api/test-legacy-data-support.js +375 -0
- package/test/icc-x-api/test-legacy-data-support.js.map +1 -0
- package/test/icc-x-api/utils/date-encode-test.d.ts +1 -0
- package/test/icc-x-api/utils/date-encode-test.js +150 -0
- package/test/icc-x-api/utils/date-encode-test.js.map +1 -0
- package/test/icc-x-api/utils/graph-test.d.ts +1 -0
- package/test/icc-x-api/utils/graph-test.js +54 -0
- package/test/icc-x-api/utils/graph-test.js.map +1 -0
- package/test/icc-x-api/utils/lru-temporised-async-cache-test.d.ts +1 -0
- package/test/icc-x-api/utils/lru-temporised-async-cache-test.js +364 -0
- package/test/icc-x-api/utils/lru-temporised-async-cache-test.js.map +1 -0
- package/test/icc-x-api/utils/lzma-benchmark-test.d.ts +1 -0
- package/test/icc-x-api/utils/lzma-benchmark-test.js +132 -0
- package/test/icc-x-api/utils/lzma-benchmark-test.js.map +1 -0
- package/test/icc-x-api/utils/lzma-compat-test.d.ts +1 -0
- package/test/icc-x-api/utils/lzma-compat-test.js +218 -0
- package/test/icc-x-api/utils/lzma-compat-test.js.map +1 -0
- package/test/icc-x-api/utils/mutex-test.d.ts +1 -0
- package/test/icc-x-api/utils/mutex-test.js +114 -0
- package/test/icc-x-api/utils/mutex-test.js.map +1 -0
- package/test/icc-x-api/utils/to-moment-test.d.ts +1 -0
- package/test/icc-x-api/utils/to-moment-test.js +110 -0
- package/test/icc-x-api/utils/to-moment-test.js.map +1 -0
- package/test/support/CSM-185.d.ts +1 -0
- package/test/support/CSM-185.js +124 -0
- package/test/support/CSM-185.js.map +1 -0
- package/test/support/CSM-243.d.ts +1 -0
- package/test/support/CSM-243.js +120 -0
- package/test/support/CSM-243.js.map +1 -0
- package/test/support/CSM-543.d.ts +1 -0
- package/test/support/CSM-543.js +164 -0
- package/test/support/CSM-543.js.map +1 -0
- package/test/support/CSM-729.d.ts +1 -0
- package/test/support/CSM-729.js +225 -0
- package/test/support/CSM-729.js.map +1 -0
- package/test/support/CSM-814.d.ts +1 -0
- package/test/support/CSM-814.js +475 -0
- package/test/support/CSM-814.js.map +1 -0
- package/test/support/CSM-87.d.ts +0 -0
- package/test/support/CSM-87.js +21 -0
- package/test/support/CSM-87.js.map +1 -0
- package/test/support/CSM-93.d.ts +1 -0
- package/test/support/CSM-93.js +112 -0
- package/test/support/CSM-93.js.map +1 -0
- package/test/utils/FakeDataOwnerApi.d.ts +32 -0
- package/test/utils/FakeDataOwnerApi.js +136 -0
- package/test/utils/FakeDataOwnerApi.js.map +1 -0
- package/test/utils/FakeEncryptionKeysManager.d.ts +36 -0
- package/test/utils/FakeEncryptionKeysManager.js +97 -0
- package/test/utils/FakeEncryptionKeysManager.js.map +1 -0
- package/test/utils/FakeExchangeDataApi.d.ts +32 -0
- package/test/utils/FakeExchangeDataApi.js +92 -0
- package/test/utils/FakeExchangeDataApi.js.map +1 -0
- package/test/utils/FakeExchangeDataManager.d.ts +48 -0
- package/test/utils/FakeExchangeDataManager.js +82 -0
- package/test/utils/FakeExchangeDataManager.js.map +1 -0
- package/test/utils/FakeExchangeDataMapManager.d.ts +12 -0
- package/test/utils/FakeExchangeDataMapManager.js +38 -0
- package/test/utils/FakeExchangeDataMapManager.js.map +1 -0
- package/test/utils/FakeGenericApi.d.ts +16 -0
- package/test/utils/FakeGenericApi.js +65 -0
- package/test/utils/FakeGenericApi.js.map +1 -0
- package/test/utils/KeylessCryptoStrategies.d.ts +23 -0
- package/test/utils/KeylessCryptoStrategies.js +26 -0
- package/test/utils/KeylessCryptoStrategies.js.map +1 -0
- package/test/utils/TestApi.d.ts +3 -0
- package/test/utils/TestApi.js +30 -0
- package/test/utils/TestApi.js.map +1 -0
- package/test/utils/TestCollectionUtils.d.ts +1 -0
- package/test/utils/TestCollectionUtils.js +310 -0
- package/test/utils/TestCollectionUtils.js.map +1 -0
- package/test/utils/TestCryptoStrategies.d.ts +42 -0
- package/test/utils/TestCryptoStrategies.js +80 -0
- package/test/utils/TestCryptoStrategies.js.map +1 -0
- package/test/utils/TestStorage.d.ts +23 -0
- package/test/utils/TestStorage.js +61 -0
- package/test/utils/TestStorage.js.map +1 -0
- package/test/utils/roles.d.ts +14 -0
- package/test/utils/roles.js +345 -0
- package/test/utils/roles.js.map +1 -0
- package/test/utils/test_utils.d.ts +87 -0
- package/test/utils/test_utils.js +452 -0
- package/test/utils/test_utils.js.map +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SecurityMetadataDecryptor.js","sourceRoot":"","sources":["../../../icc-x-api/crypto/SecurityMetadataDecryptor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oCAA4G;AAQ5G,uDAAmG;AAEnG,IAAO,eAAe,GAAG,yBAAgB,CAAC,eAAe,CAAA;AAUzD,IAAY,oBAIX;AAJD,WAAY,oBAAoB;IAC9B,uEAAY,CAAA;IACZ,iFAAa,CAAA;IACb,mFAAc,CAAA;AAChB,CAAC,EAJW,oBAAoB,oCAApB,oBAAoB,QAI/B;AAED,MAAa,yBAAyB;IACpC,YACmB,mBAAwC,EACxC,UAA4B,EAC5B,YAAiC,EACjC,eAAuC,EACvC,2BAAwD,EACxD,YAA8B;QAL9B,wBAAmB,GAAnB,mBAAmB,CAAqB;QACxC,eAAU,GAAV,UAAU,CAAkB;QAC5B,iBAAY,GAAZ,YAAY,CAAqB;QACjC,oBAAe,GAAf,eAAe,CAAwB;QACvC,gCAA2B,GAA3B,2BAA2B,CAA6B;QACxD,iBAAY,GAAZ,YAAY,CAAkB;IAC9C,CAAC;IAEE,wBAAwB,CAC5B,QAAmD,EACnD,yBAAmC,EACnC,YAAkC;;YAElC,uEAAuE;YACvE,MAAM,GAAG,GAAqC,EAAE,CAAA;YAChD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,CAAC,EAAE,yBAAyB,EAAE,YAAY,CAAC,CAAA;gBACxG,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;gBAC3E,GAAG,CAAC,CAAC,CAAC,EAAG,CAAC,GAAG,CAAC,GAAG,qBAAqB,CAAC,CAAA;YACzC,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC;KAAA;IAEa,4BAA4B,CACxC,MAA6C,EAC7C,yBAAmC,EACnC,YAAkC;;;YAElC,IAAI,CAAC,yBAAyB,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;YACpG,IAAI,WAAmD,CAAA;YACvD,IAAI,iBAAiB,GAAyC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACzF,IAAI,YAAY,GAA+B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;YACvD,QAAQ,YAAY,EAAE,CAAC;gBACrB,KAAK,oBAAoB,CAAC,QAAQ;oBAChC,WAAW,GAAG,MAAA,MAAM,CAAC,WAAW,mCAAI,EAAE,CAAA;oBACtC,MAAK;gBACP,KAAK,oBAAoB,CAAC,aAAa;oBACrC,WAAW,GAAG,MAAA,MAAM,CAAC,cAAc,mCAAI,EAAE,CAAA;oBACzC,iBAAiB,GAAG,CAAO,GAAG,EAAE,EAAE;wBAChC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC;4BAAE,OAAO,KAAK,CAAA;wBAChD,IAAI,CAAC;4BACH,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,IAAA,cAAM,EAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;4BACzE,OAAO,IAAI,CAAA;wBACb,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACX,OAAO,CAAC,IAAI,CAAC,wBAAwB,GAAG,wBAAwB,EAAE,CAAC,CAAC,CAAA;4BACpE,OAAO,KAAK,CAAA;wBACd,CAAC;oBACH,CAAC,CAAA,CAAA;oBACD,YAAY,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;oBAC7C,MAAK;gBACP,KAAK,oBAAoB,CAAC,cAAc;oBACtC,WAAW,GAAG,MAAA,MAAM,CAAC,kBAAkB,mCAAI,EAAE,CAAA;oBAC7C,MAAK;gBACP;oBACE,MAAM,IAAI,KAAK,CAAC,gDAAgD,YAAY,EAAE,CAAC,CAAA;YACnF,CAAC;YACD,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,EAAE,CAC7F,yBAAyB,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,KAAK,UAAU,CAAC;gBACzE,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,UAAU,EAAE,WAAW,CAAC;gBAChE,CAAC,CAAC,IAAI,CAAC,gCAAgC,CACnC,UAAU,EACV,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CACpG,CACN,CAAA;YACD,MAAM,GAAG,GAA4D,EAAE,CAAA;YACvE,KAAK,MAAM,UAAU,IAAI,oBAAoB,EAAE,CAAC;gBAC9C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;gBAChG,IAAI,SAAS;oBACX,GAAG,CAAC,IAAI,CAAC;wBACP,SAAS,EAAE,YAAY,CAAC,SAAS,CAAC;wBAClC,oBAAoB,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,WAAY,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,WAAY,CAAC;qBACjH,CAAC,CAAA;YACN,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC;KAAA;IAEO,gCAAgC,CAAC,UAAkB,EAAE,WAAyB;QACpF,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iCAAM,CAAC,KAAE,WAAW,EAAE,UAAU,GAAE,CAAC,CAAC,CAAA;IACvG,CAAC;IAEa,0BAA0B,CACtC,UAAsB,EACtB,iBAAuD;;YAEvD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,4BAA4B,CAAC,UAAU,CAAC,KAAM,EAAE,UAAU,CAAC,WAAY,CAAC,CAAA;YAC5H,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,uIAAuI;oBACvI,gIAAgI;oBAChI,+HAA+H;oBAC/H,MAAM,SAAS,GAAG,IAAA,iBAAS,EAAC,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,IAAA,cAAM,EAAC,UAAU,CAAC,GAAI,CAAC,CAAC,CAAC,CAAA;oBAC5F,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;oBAC3C,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAChC,IAAI,MAAM,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;4BAAE,OAAO,cAAc,CAAC,CAAC,CAAC,CAAA;oBAC1E,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,IAAI,CAAC,qGAAqG,CAAC,CAAA;oBACrH,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,wEAAwE;gBAC1E,CAAC;YACH,CAAC;QACH,CAAC;KAAA;IAEK,kCAAkC,CACtC,QAAmD,EACnD,yBAAmC,EACnC,YAAkC;;;YAElC,MAAM,YAAY,GAAgB,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA;YAC7C,MAAM,uBAAuB,GAAgB,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA;YACxD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,KAAK,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAA,MAAA,CAAC,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,EAAE,CAAC;oBACtG,IACE,CAAC,UAAU,CAAC,SAAS;wBACrB,CAAC,UAAU,CAAC,QAAQ;wBACpB,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,UAAU,CAAC,SAAS,IAAI,EAAE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAC/F,CAAC;wBACD,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;4BAC9B,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;wBAC7C,CAAC;6BAAM,CAAC;4BACN,uBAAuB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;wBAC5C,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,sBAAsB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC,GAAG,YAAY,CAAC,EAAE,KAAK,CAAC,CAAA;YAC1G,MAAM,qBAAqB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,6CAA6C,CAAC,CAAC,GAAG,uBAAuB,CAAC,CAAC,CAAA;YACjI,MAAM,GAAG,GAAqC,EAAE,CAAA;YAChD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,MAAM,aAAa,GAAgB,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA;gBAC9C,KAAK,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAA,MAAA,MAAM,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,EAAE,CAAC;oBAC3G,MAAM,MAAM,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,sBAAsB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAA;oBACnI,IACE,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW;wBACnB,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,eAAC,OAAA,EAAE,KAAI,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,YAAY,0CAAE,SAAS,CAAA,IAAI,EAAE,KAAI,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,YAAY,0CAAE,QAAQ,CAAA,CAAA,EAAA,CAAC,EACrH,CAAC;wBACD,CAAC;wBAAA,CAAC,MAAM,IAAI,CAAC,+BAA+B,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAChH,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAC7B,CAAA;oBACH,CAAC;gBACH,CAAC;gBACD,GAAG,CAAC,MAAM,CAAC,EAAG,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAA;YACtC,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC;KAAA;IAED,yBAAyB,CAAC,UAA4B,EAAE,YAAkC;;QACxF,QAAQ,YAAY,EAAE,CAAC;YACrB,KAAK,oBAAoB,CAAC,QAAQ;gBAChC,OAAO,CAAC,MAAA,UAAU,CAAC,SAAS,mCAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;YAChD,KAAK,oBAAoB,CAAC,aAAa;gBACrC,OAAO,CAAC,MAAA,UAAU,CAAC,cAAc,mCAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;YACrD,KAAK,oBAAoB,CAAC,cAAc;gBACtC,OAAO,CAAC,MAAA,UAAU,CAAC,eAAe,mCAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;YACtD;gBACE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC;IAEK,8CAA8C,CAClD,QAAmD,EACnD,yBAAmC,EACnC,YAAkC;;;YAElC,MAAM,YAAY,GAAgB,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA;YAC7C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,MAAA,MAAA,CAAC,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,EAAE,CAAC;oBACpF,IAAI,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,UAAU,CAAC,SAAS,IAAI,EAAE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACpG,IAAI,UAAU,CAAC,cAAc,IAAI,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,CAAC;4BAC1F,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;wBAC7C,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,yBAAyB,GAAG,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC,GAAG,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YACzI,MAAM,GAAG,GAAqC,EAAE,CAAA;YAChD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,MAAM,aAAa,GAAgB,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA;gBAC9C,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,MAAA,MAAA,MAAM,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,EAAE,CAAC;oBACzF,MAAM,0BAA0B,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,yBAAyB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;oBAC/H,IAAI,0BAA0B,aAA1B,0BAA0B,uBAA1B,0BAA0B,CAAE,WAAW,EAAE,CAAC;wBAC5C,CAAC;wBAAA,CAAC,MAAM,IAAI,CAAC,+BAA+B,CAAC,UAAU,EAAE,YAAY,EAAE,0BAA0B,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CACpI,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAC7B,CAAA;oBACH,CAAC;gBACH,CAAC;gBACD,GAAG,CAAC,MAAM,CAAC,EAAG,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAA;YACtC,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC;KAAA;IAEK,4CAA4C,CAChD,QAAmD,EACnD,yBAAmC,EACnC,YAAkC;;;YAElC,MAAM,yBAAyB,GAAgB,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA;YAC1D,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,KAAK,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAA,MAAA,CAAC,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,EAAE,CAAC;oBACtG,IAAI,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,UAAU,CAAC,SAAS,IAAI,EAAE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACpG,IAAI,CAAC,UAAU,CAAC,cAAc,IAAI,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,CAAC;4BAC3F,yBAAyB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;wBAC9C,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,gBAAgB,GACpB,yBAAyB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,uBAAuB,CAAC,CAAC,GAAG,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YAC9H,MAAM,6BAA6B,GAAwC,EAAE,CAAA;YAC7E,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE,CAAC;gBAC/C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,qBAAqB,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAA;gBACxH,IAAI,SAAS,EAAE,CAAC;oBACd,6BAA6B,CAAC,eAAe,CAAC,EAAE,CAAC,GAAG,SAAS,CAAA;gBAC/D,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,MAAM,IAAI,CAAC;gBAAE,OAAO,EAAE,CAAA;YACrE,MAAM,yBAAyB,GAC7B,MAAM,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,MAAM,GAAG,CAAC;gBACrD,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;gBACrH,CAAC,CAAC,EAAE,CAAA;YACR,MAAM,GAAG,GAAqC,EAAE,CAAA;YAChD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,MAAM,aAAa,GAAgB,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA;gBAC9C,KAAK,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAA,MAAA,MAAM,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,EAAE,CAAC;oBAC3G,MAAM,cAAc,GAAG,6BAA6B,CAAC,aAAa,CAAC,CAAA;oBACnE,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;oBACrF,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,EAAE,CAAC;wBACxB,CAAC;wBAAA,CAAC,MAAM,IAAI,CAAC,+BAA+B,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAChH,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAC7B,CAAA;oBACH,CAAC;gBACH,CAAC;gBACD,GAAG,CAAC,MAAM,CAAC,EAAG,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAA;YACtC,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC;KAAA;IAEK,UAAU,CACd,MAA6C,EAC7C,yBAAmC,EACnC,YAAkC;;YAElC,MAAM,0BAA0B,GAAG;gBACjC,GAAG,CAAC,MAAM,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,yBAAyB,EAAE,YAAY,CAAC,CAAC;gBAC5F,GAAG,CAAC,MAAM,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,yBAAyB,EAAE,YAAY,CAAC,CAAC;aAC7F,CAAA;YACD,OAAO,yBAAyB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;gBACjD,MAAM,4BAA4B,GAAG,0BAA0B;qBAC5D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;qBACjE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;gBAC1B,OAAO;oBACL,OAAO,EAAE,SAAS;oBAClB,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,4BAA4B,CAAC,CAAC;iBACtD,CAAA;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;IAEK,2BAA2B,CAC/B,MAA6C,EAC7C,yBAAmC,EACnC,YAAkC;;YAElC,OAAO,IAAI,CAAC,4BAA4B,CAAC,MAAM,EAAE,yBAAyB,EAAE,YAAY,CAAC,CAAA;QAC3F,CAAC;KAAA;IAEK,2BAA2B,CAC/B,MAA6C,EAC7C,yBAAmC,EACnC,YAAkC;;;YAElC,MAAM,uBAAuB,GAAiC,MAAM,CAAC,OAAO,CAAC,MAAA,MAAA,MAAM,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,CAAA;YAC9H,MAAM,uBAAuB,GAAa,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,UAAU,CAAC,EAAY,EAAE;gBAClH,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;oBAC/B,OAAO,CAAC,aAAa,CAAC,CAAA;gBACxB,CAAC;qBAAM,CAAC;oBACN,OAAO,EAAE,CAAA;gBACX,CAAC;YACH,CAAC,CAAC,CAAA;YACF,MAAM,2BAA2B,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,6CAA6C,CAAC,uBAAuB,CAAC,CAAA;YAClI,MAAM,2BAA2B,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,UAAU,CAAC,EAAY,EAAE;gBAC5G,IACE,CAAC,UAAU,CAAC,cAAc;oBAC1B,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,IAAI,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC;oBAC/F,CAAC,2BAA2B,CAAC,aAAa,CAAC;oBAC3C,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,YAAY,CAAC,EACxD,CAAC;oBACD,OAAO,CAAC,aAAa,CAAC,CAAA;gBACxB,CAAC;qBAAM,CAAC;oBACN,OAAO,EAAE,CAAA;gBACX,CAAC;YACH,CAAC,CAAC,CAAA;YACF,MAAM,gBAAgB,GACpB,2BAA2B,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,uBAAuB,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YAC/H,MAAM,6BAA6B,GAAwC,EAAE,CAAA;YAC7E,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE,CAAC;gBAC/C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,qBAAqB,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAA;gBACxH,IAAI,SAAS,EAAE,CAAC;oBACd,6BAA6B,CAAC,eAAe,CAAC,EAAE,CAAC,GAAG,SAAS,CAAA;gBAC/D,CAAC;YACH,CAAC;YACD,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,UAAU,CAAC,EAAY,EAAE;gBACrG,IACE,UAAU,CAAC,cAAc;oBACzB,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,IAAI,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC;oBAC/F,CAAC,2BAA2B,CAAC,aAAa,CAAC;oBAC3C,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,YAAY,CAAC,EACxD,CAAC;oBACD,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;gBACpC,CAAC;qBAAM,CAAC;oBACN,OAAO,EAAE,CAAA;gBACX,CAAC;YACH,CAAC,CAAC,CAAA;YACF,MAAM,2BAA2B,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,oBAAoB,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAA;YAC5H,MAAM,gBAAgB,GACpB,2BAA2B,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,2BAA2B,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YACpI,MAAM,0BAA0B,GAA4D,EAAE,CAAA;YAC9F,KAAK,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,IAAI,uBAAuB,EAAE,CAAC;gBAClE,IAAI,YAAY,GAMA,SAAS,CAAA;gBACzB,IAAI,2BAA2B,CAAC,aAAa,CAAC,EAAE,CAAC;oBAC/C,YAAY,GAAG,2BAA2B,CAAC,aAAa,CAAC,CAAA;gBAC3D,CAAC;qBAAM,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;oBACrC,YAAY,GAAG,gBAAgB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;gBAC5D,CAAC;qBAAM,IAAI,6BAA6B,CAAC,aAAa,CAAC,EAAE,CAAC;oBACxD,YAAY,GAAG,gBAAgB,CAAC,6BAA6B,CAAC,aAAa,CAAC,CAAC,CAAA;gBAC/E,CAAC;gBACD,IAAI,YAAY,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;oBAC7C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,+BAA+B,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC,WAAW,CAAC,CAAA;oBAChH,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;wBAC1B,0BAA0B,CAAC,IAAI,CAAC;4BAC9B,SAAS,EAAE,CAAC;4BACZ,oBAAoB,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC;yBAChG,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,0BAA0B,CAAA;QACnC,CAAC;KAAA;IAEK,0BAA0B,CAAC,WAAoC;;;YAGnE,MAAM,GAAG,GAA0D,EAAE,CAAA;YACrE,8GAA8G;YAC9G,IAAI,oBAAoB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAA,MAAA,WAAW,CAAC,MAAM,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,CAAA;YACvG,IAAI,2BAA2B,GAAiC,EAAE,CAAA;YAClE,KAAK,MAAM,eAAe,IAAI,oBAAoB,EAAE,CAAC;gBACnD,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,CAAA;gBACrC,IAAI,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;oBAChD,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG;wBACxB,QAAQ,EAAE,UAAU,CAAC,QAAQ;wBAC7B,SAAS,EAAE,UAAU,CAAC,SAAS;wBAC/B,aAAa,EAAE,IAAI;wBACnB,WAAW,EAAE,UAAU,CAAC,WAAW;wBACnC,mBAAmB,EAAE,SAAS;qBAC/B,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,2BAA2B,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;gBACnD,CAAC;YACH,CAAC;YACD,oBAAoB,GAAG,2BAA2B,CAAA;YAClD,IAAI,CAAC,oBAAoB,CAAC,MAAM;gBAAE,OAAO,GAAG,CAAA;YAC5C,2BAA2B,GAAG,EAAE,CAAA;YAChC,mIAAmI;YACnI,mFAAmF;YACnF,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,6CAA6C,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACvI,KAAK,MAAM,eAAe,IAAI,oBAAoB,EAAE,CAAC;gBACnD,MAAM,wBAAwB,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAA;gBACvE,IAAI,wBAAwB,EAAE,CAAC;oBAC7B,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG;wBACxB,QAAQ,EAAE,wBAAwB,CAAC,YAAY,CAAC,QAAQ;wBACxD,SAAS,EAAE,wBAAwB,CAAC,YAAY,CAAC,SAAS;wBAC1D,aAAa,EAAE,KAAK;wBACpB,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,WAAW;wBAC3C,mBAAmB,EAAE,wBAAwB,CAAC,mBAAmB;qBAClE,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,2BAA2B,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;gBACnD,CAAC;YACH,CAAC;YACD,oBAAoB,GAAG,2BAA2B,CAAA;YAClD,IAAI,CAAC,oBAAoB,CAAC,MAAM;gBAAE,OAAO,GAAG,CAAA;YAC5C,2BAA2B,GAAG,EAAE,CAAA;YAChC,0IAA0I;YAC1I,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,+BAA+B,EAAE,CAAA;YAC3E,MAAM,yBAAyB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,uBAAuB,CAClF,oBAAoB;iBACjB,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,UAAU,CAAC,SAAS,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;iBACzG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAC5B,CAAA;YACD,MAAM,6BAA6B,GAAwC,EAAE,CAAA;YAC7E,KAAK,MAAM,eAAe,IAAI,yBAAyB,EAAE,CAAC;gBACxD,IAAI,CAAC,CAAC,eAAe,CAAC,wBAAwB,EAAE,CAAC;oBAC/C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,qBAAqB,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAA;oBACxH,IAAI,SAAS,EAAE,CAAC;wBACd,6BAA6B,CAAC,eAAe,CAAC,EAAE,CAAC,GAAG,SAAS,CAAA;oBAC/D,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,MAAM,CAAC,MAAM,CAAC,6BAA6B,CAAC,EAAE,IAAI,CAAC,CAAA;YAC/H,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,oBAAoB,EAAE,CAAC;gBACtD,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,QAAQ,IAAI,CAAC,KAAK,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBACnF,MAAM,MAAM,GAAG,6BAA6B,CAAC,IAAI,CAAC,CAAA;oBAClD,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;oBACvE,IAAI,gBAAgB,EAAE,CAAC;wBACrB,GAAG,CAAC,IAAI,CAAC,GAAG;4BACV,SAAS,EAAE,gBAAgB,CAAC,YAAY,CAAC,SAAS;4BAClD,QAAQ,EAAE,gBAAgB,CAAC,YAAY,CAAC,QAAQ;4BAChD,aAAa,EAAE,KAAK;4BACpB,WAAW,EAAE,UAAU,CAAC,WAAW;4BACnC,mBAAmB,EAAE,gBAAgB,CAAC,mBAAmB;yBAC1D,CAAA;oBACH,CAAC;yBAAM,CAAC;wBACN,2BAA2B,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAA;oBACtD,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,2BAA2B,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAA;gBACtD,CAAC;YACH,CAAC;YACD,uCACK,GAAG,GACH,MAAM,CAAC,WAAW,CACnB,2BAA2B,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE,EAAE,CAAC;gBAC5D,IAAI;gBACJ;oBACE,SAAS,EAAE,gBAAgB,CAAC,SAAS;oBACrC,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;oBACnC,aAAa,EAAE,KAAK;oBACpB,WAAW,EAAE,gBAAgB,CAAC,WAAW;oBACzC,mBAAmB,EAAE,SAAS;iBAC/B;aACF,CAAC,CACH,EACF;QACH,CAAC;KAAA;IAEK,+BAA+B,CAAC,UAA4B,EAAE,YAAkC,EAAE,GAAc;;YACpH,QAAQ,YAAY,EAAE,CAAC;gBACrB,KAAK,oBAAoB,CAAC,QAAQ;oBAChC,OAAO,IAAI,CAAC,2BAA2B,CAAC,gBAAgB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;gBAC3E,KAAK,oBAAoB,CAAC,aAAa;oBACrC,OAAO,IAAI,CAAC,2BAA2B,CAAC,qBAAqB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;gBAChF,KAAK,oBAAoB,CAAC,cAAc;oBACtC,OAAO,IAAI,CAAC,2BAA2B,CAAC,sBAAsB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;gBACjF;oBACE,MAAM,IAAI,KAAK,CAAC,gDAAgD,YAAY,EAAE,CAAC,CAAA;YACnF,CAAC;QACH,CAAC;KAAA;IAEK,oCAAoC,CACxC,MAA6C,EAC7C,yBAAmC;;;YAEnC,IAAI,CAAC,yBAAyB,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;YACpG,0CAA0C;YAC1C,IAAI,MAAM,CAAC,IAAI,CAAC,MAAA,MAAM,CAAC,WAAW,mCAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,yBAAyB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAC3G,OAAO,eAAe,CAAC,KAAK,CAAA;YAC9B,CAAC;YACD,OAAO,SAAS,CAAA;QAClB,CAAC;KAAA;IAEK,oCAAoC,CACxC,MAA6C,EAC7C,yBAAmC;;;YAEnC,IAAI,CAAC,yBAAyB,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;YACpG,0IAA0I;YAC1I,kDAAkD;YAClD,IAAI,qBAAqB,GAAuB,MAAM,CAAC,MAAM,CAAC,MAAA,MAAA,MAAM,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,gBAAgB,EAAE,EAAE,CAC1I,yBAAyB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,gBAAgB,CAAC,SAAS,IAAI,SAAS,KAAK,gBAAgB,CAAC,QAAQ,CAAC,CACnI,CAAA;YACD,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,CAAC;gBAClC,MAAM,wBAAwB,GAAG,MAAM,CAAC,IAAI,CAC1C,MAAM,IAAI,CAAC,YAAY,CAAC,6CAA6C,CAAC,MAAM,CAAC,IAAI,CAAC,MAAA,MAAA,MAAM,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,CAAC,CACrI,CAAA;gBACD,qBAAqB,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,eAAC,OAAA,CAAC,MAAA,MAAA,MAAM,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA,EAAA,CAAC,CAAA;YAC1H,CAAC;YACD,MAAM,WAAW,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,EAAE,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAA;YACjG,IAAI,QAAQ,GAAgC,SAAS,CAAA;YACrD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,IAAI,UAAU,KAAK,eAAe,CAAC,KAAK,EAAE,CAAC;oBACzC,OAAO,eAAe,CAAC,KAAK,CAAA;gBAC9B,CAAC;gBACD,IAAI,UAAU,KAAK,eAAe,CAAC,IAAI,EAAE,CAAC;oBACxC,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAA;gBACjC,CAAC;YACH,CAAC;YACD,OAAO,QAAQ,CAAA;QACjB,CAAC;KAAA;IAEK,oBAAoB,CACxB,MAA6C,EAC7C,yBAAmC;;YAEnC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,oCAAoC,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAA;YACvG,IAAI,YAAY,IAAI,SAAS;gBAAE,OAAO,YAAY,CAAA;YAClD,OAAO,IAAI,CAAC,oCAAoC,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAA;QACrF,CAAC;KAAA;IAED,oBAAoB,CAAC,MAA6C;;QAChE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAA,MAAM,CAAC,cAAc,mCAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAA,MAAA,MAAM,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;IACxI,CAAC;CACF;AA7fD,8DA6fC","sourcesContent":["import { b64_2ab, EncryptedEntityWithType, EntityWithDelegationTypeName, hex2ua, ua2string } from '../utils'\nimport { ExchangeKeysManager } from './ExchangeKeysManager'\nimport { CryptoPrimitives } from './CryptoPrimitives'\nimport { Delegation } from '../../icc-api/model/Delegation'\nimport { ExchangeDataManager } from './ExchangeDataManager'\nimport { ExchangeDataMapManager } from './ExchangeDataMapManager'\nimport { SecureDelegationsEncryption } from './SecureDelegationsEncryption'\nimport { IccDataOwnerXApi } from '../icc-data-owner-x-api'\nimport { EncryptedEntity, EncryptedEntityStub, SecureDelegation } from '../../icc-api/model/models'\nimport { ExchangeData } from '../../icc-api/model/internal/ExchangeData'\nimport AccessLevelEnum = SecureDelegation.AccessLevelEnum\n\nexport type DelegationMembersDetails = {\n delegator: string | undefined\n delegate: string | undefined\n fullyExplicit: boolean\n accessControlSecret: string | undefined\n accessLevel: AccessLevelEnum\n}\n\nexport enum SecurityMetadataType {\n SecretId = 1, // Start from 1, avoids issues with SecretId being falsy\n EncryptionKey,\n OwningEntityId,\n}\n\nexport class SecurityMetadataDecryptor {\n constructor(\n private readonly exchangeKeysManager: ExchangeKeysManager,\n private readonly primitives: CryptoPrimitives,\n private readonly exchangeData: ExchangeDataManager,\n private readonly exchangeDataMap: ExchangeDataMapManager,\n private readonly secureDelegationsEncryption: SecureDelegationsEncryption,\n private readonly dataOwnerApi: IccDataOwnerXApi\n ) {}\n\n async decryptLegacyDelegations(\n entities: (EncryptedEntityStub | EncryptedEntity)[],\n dataOwnersHierarchySubset: string[],\n metadataType: SecurityMetadataType\n ): Promise<{ [entityId: string]: string[] }> {\n // For legacy delegations there is no advantage in doing stuff in bulk.\n const res: { [entityId: string]: string[] } = {}\n for (const e of entities) {\n const allDecrypted = await this.extractFromLegacyDelegations(e, dataOwnersHierarchySubset, metadataType)\n const deduplicatedDecrypted = new Set(allDecrypted.map((x) => x.decrypted))\n res[e.id!] = [...deduplicatedDecrypted]\n }\n return res\n }\n\n private async extractFromLegacyDelegations(\n entity: EncryptedEntityStub | EncryptedEntity,\n dataOwnersHierarchySubset: string[],\n metadataType: SecurityMetadataType\n ): Promise<{ decrypted: string; dataOwnersWithAccess: string[] }[]> {\n if (!dataOwnersHierarchySubset.length) throw new Error(\"`dataOwnersHierarchySubset` can't be empty\")\n let delegations: { [delegateId: string]: Delegation[] }\n let validateDecrypted: (result: string) => Promise<boolean> = (x) => Promise.resolve(!!x)\n let mapDecrypted: (result: string) => string = (x) => x\n switch (metadataType) {\n case SecurityMetadataType.SecretId:\n delegations = entity.delegations ?? {}\n break\n case SecurityMetadataType.EncryptionKey:\n delegations = entity.encryptionKeys ?? {}\n validateDecrypted = async (key) => {\n if (!/^[0-9A-Fa-f\\-]+$/g.test(key)) return false\n try {\n await this.primitives.AES.importKey('raw', hex2ua(key.replace(/-/g, '')))\n return true\n } catch (e) {\n console.warn(`Could not import key ${key} as an encryption key.`, e)\n return false\n }\n }\n mapDecrypted = (key) => key.replace(/-/g, '')\n break\n case SecurityMetadataType.OwningEntityId:\n delegations = entity.cryptedForeignKeys ?? {}\n break\n default:\n throw new Error(`Internal error: invalid SecurityMetadataType ${metadataType}`)\n }\n const delegationsWithOwner = Object.entries(delegations).flatMap(([delegateId, delegations]) =>\n dataOwnersHierarchySubset.some((dataOwnerId) => dataOwnerId === delegateId)\n ? this.populateLegacyDelegationDelegate(delegateId, delegations)\n : this.populateLegacyDelegationDelegate(\n delegateId,\n delegations.filter((d) => dataOwnersHierarchySubset.some((dataOwnerId) => d.owner === dataOwnerId))\n )\n )\n const res: { decrypted: string; dataOwnersWithAccess: string[] }[] = []\n for (const delegation of delegationsWithOwner) {\n const decrypted = await this.tryDecryptLegacyDelegation(delegation, (k) => validateDecrypted(k))\n if (decrypted)\n res.push({\n decrypted: mapDecrypted(decrypted),\n dataOwnersWithAccess: delegation.owner ? [delegation.owner, delegation.delegatedTo!] : [delegation.delegatedTo!],\n })\n }\n return res\n }\n\n private populateLegacyDelegationDelegate(delegateId: string, delegations: Delegation[]): Delegation[] {\n return delegations.map((d) => (d.delegatedTo === delegateId ? d : { ...d, delegatedTo: delegateId }))\n }\n\n private async tryDecryptLegacyDelegation(\n delegation: Delegation,\n validateDecrypted: (result: string) => Promise<boolean>\n ): Promise<string | undefined> {\n const exchangeKeys = await this.exchangeKeysManager.getDecryptionExchangeKeysFor(delegation.owner!, delegation.delegatedTo!)\n for (const key of exchangeKeys) {\n try {\n // Format of encrypted key for any delegation should be entityId:key, but with the merging of entities the entityId might not match the\n // current id. As a checksum we are only verifying that the decrypted bytes can be represented as a string with exactly one ':'.\n // Additionally, we also have a validator that is specific for each type of delegation content (encryption key, secret id, ...)\n const decrypted = ua2string(await this.primitives.AES.decrypt(key, hex2ua(delegation.key!)))\n const decryptedSplit = decrypted.split(':')\n if (decryptedSplit.length === 2) {\n if (await validateDecrypted(decryptedSplit[1])) return decryptedSplit[1]\n } else {\n console.warn(\"Error in the decrypted delegation: content should contain exactly 1 ':', the delegation is ignored.\")\n }\n } catch (e) {\n // Do nothing: the delegation uses another exchange key owner->delegator\n }\n }\n }\n\n async decryptSecureDelegationsUsingCache(\n entities: (EncryptedEntityStub | EncryptedEntity)[],\n dataOwnersHierarchySubset: string[],\n metadataType: SecurityMetadataType\n ): Promise<{ [entityId: string]: string[] }> {\n const toSearchById: Set<string> = new Set([])\n const toSearchByDelegationKey: Set<string> = new Set([])\n for (const e of entities) {\n for (const [delegationKey, delegation] of Object.entries(e.securityMetadata?.secureDelegations ?? {})) {\n if (\n !delegation.delegator ||\n !delegation.delegate ||\n dataOwnersHierarchySubset.some((it) => it == delegation.delegator || it == delegation.delegate)\n ) {\n if (delegation.exchangeDataId) {\n toSearchById.add(delegation.exchangeDataId)\n } else {\n toSearchByDelegationKey.add(delegationKey)\n }\n }\n }\n }\n const cachedByExchangeDataId = await this.exchangeData.getDecryptionDataKeyByIds([...toSearchById], false)\n const cachedByDelegationKey = await this.exchangeData.getCachedDecryptionDataKeyByAccessControlHash([...toSearchByDelegationKey])\n const res: { [entityId: string]: string[] } = {}\n for (const entity of entities) {\n const currEntityRes: Set<string> = new Set([])\n for (const [delegationKey, delegation] of Object.entries(entity.securityMetadata?.secureDelegations ?? {})) {\n const cached = delegation.exchangeDataId ? cachedByExchangeDataId[delegation.exchangeDataId] : cachedByDelegationKey[delegationKey]\n if (\n cached?.exchangeKey &&\n dataOwnersHierarchySubset.some((it) => it == cached?.exchangeData?.delegator || it == cached?.exchangeData?.delegate)\n ) {\n ;(await this.decryptSecureDelegationMetadata(delegation, metadataType, cached.exchangeKey)).forEach((decrypted) =>\n currEntityRes.add(decrypted)\n )\n }\n }\n res[entity.id!] = [...currEntityRes]\n }\n return res\n }\n\n hasSecurityMetadataOfType(delegation: SecureDelegation, metadataType: SecurityMetadataType): boolean {\n switch (metadataType) {\n case SecurityMetadataType.SecretId:\n return (delegation.secretIds ?? []).length > 0\n case SecurityMetadataType.EncryptionKey:\n return (delegation.encryptionKeys ?? []).length > 0\n case SecurityMetadataType.OwningEntityId:\n return (delegation.owningEntityIds ?? []).length > 0\n default:\n throw new Error('Internal error: invalid metadata type')\n }\n }\n\n async decryptSecureDelegationsUsingKnownExchangeData(\n entities: (EncryptedEntityStub | EncryptedEntity)[],\n dataOwnersHierarchySubset: string[],\n metadataType: SecurityMetadataType\n ): Promise<{ [entityId: string]: string[] }> {\n const toSearchById: Set<string> = new Set([])\n for (const e of entities) {\n for (const delegation of Object.values(e.securityMetadata?.secureDelegations ?? {})) {\n if (dataOwnersHierarchySubset.some((it) => it == delegation.delegator || it == delegation.delegate)) {\n if (delegation.exchangeDataId && this.hasSecurityMetadataOfType(delegation, metadataType)) {\n toSearchById.add(delegation.exchangeDataId)\n }\n }\n }\n }\n const retrievedByExchangeDataId = toSearchById.size > 0 ? await this.exchangeData.getDecryptionDataKeyByIds([...toSearchById], true) : {}\n const res: { [entityId: string]: string[] } = {}\n for (const entity of entities) {\n const currEntityRes: Set<string> = new Set([])\n for (const delegation of Object.values(entity.securityMetadata?.secureDelegations ?? {})) {\n const currDelegationExchangeData = delegation.exchangeDataId ? retrievedByExchangeDataId[delegation.exchangeDataId] : undefined\n if (currDelegationExchangeData?.exchangeKey) {\n ;(await this.decryptSecureDelegationMetadata(delegation, metadataType, currDelegationExchangeData.exchangeKey)).forEach((decrypted) =>\n currEntityRes.add(decrypted)\n )\n }\n }\n res[entity.id!] = [...currEntityRes]\n }\n return res\n }\n\n async decryptSecureDelegationsUsingExchangeDataMap(\n entities: (EncryptedEntityStub | EncryptedEntity)[],\n dataOwnersHierarchySubset: string[],\n metadataType: SecurityMetadataType\n ): Promise<{ [entityId: string]: string[] }> {\n const toSearchByExchangeDataMap: Set<string> = new Set([])\n for (const e of entities) {\n for (const [delegationKey, delegation] of Object.entries(e.securityMetadata?.secureDelegations ?? {})) {\n if (dataOwnersHierarchySubset.some((it) => it == delegation.delegator || it == delegation.delegate)) {\n if (!delegation.exchangeDataId && this.hasSecurityMetadataOfType(delegation, metadataType)) {\n toSearchByExchangeDataMap.add(delegationKey)\n }\n }\n }\n }\n const exchangeDataMaps =\n toSearchByExchangeDataMap.size > 0 ? await this.exchangeDataMap.getExchangeDataMapBatch([...toSearchByExchangeDataMap]) : []\n const exchangeDataIdByDelegationKey: { [delegationKey: string]: string } = {}\n for (const exchangeDataMap of exchangeDataMaps) {\n const decrypted = await this.secureDelegationsEncryption.decryptExchangeDataId(exchangeDataMap.encryptedExchangeDataIds)\n if (decrypted) {\n exchangeDataIdByDelegationKey[exchangeDataMap.id] = decrypted\n }\n }\n if (Object.keys(exchangeDataIdByDelegationKey).length == 0) return {}\n const retrievedByExchangeDataId =\n Object.values(exchangeDataIdByDelegationKey).length > 0\n ? await this.exchangeData.getDecryptionDataKeyByIds([...new Set(Object.values(exchangeDataIdByDelegationKey))], true)\n : {}\n const res: { [entityId: string]: string[] } = {}\n for (const entity of entities) {\n const currEntityRes: Set<string> = new Set([])\n for (const [delegationKey, delegation] of Object.entries(entity.securityMetadata?.secureDelegations ?? {})) {\n const exchangeDataId = exchangeDataIdByDelegationKey[delegationKey]\n const cached = exchangeDataId ? retrievedByExchangeDataId[exchangeDataId] : undefined\n if (cached?.exchangeKey) {\n ;(await this.decryptSecureDelegationMetadata(delegation, metadataType, cached.exchangeKey)).forEach((decrypted) =>\n currEntityRes.add(decrypted)\n )\n }\n }\n res[entity.id!] = [...currEntityRes]\n }\n return res\n }\n\n async decryptAll(\n entity: EncryptedEntityStub | EncryptedEntity,\n dataOwnersHierarchySubset: string[],\n metadataType: SecurityMetadataType\n ): Promise<{ ownerId: string; extracted: string[] }[]> {\n const allExtractedWithDataOwners = [\n ...(await this.decryptAllLegacyDelegations(entity, dataOwnersHierarchySubset, metadataType)),\n ...(await this.decryptAllSecureDelegations(entity, dataOwnersHierarchySubset, metadataType)),\n ]\n return dataOwnersHierarchySubset.map((dataOwner) => {\n const decryptedEntriesForDataOwner = allExtractedWithDataOwners\n .filter((x) => x.dataOwnersWithAccess.some((d) => dataOwner == d))\n .map((x) => x.decrypted)\n return {\n ownerId: dataOwner,\n extracted: [...new Set(decryptedEntriesForDataOwner)],\n }\n })\n }\n\n async decryptAllLegacyDelegations(\n entity: EncryptedEntityStub | EncryptedEntity,\n dataOwnersHierarchySubset: string[],\n metadataType: SecurityMetadataType\n ): Promise<{ decrypted: string; dataOwnersWithAccess: string[] }[]> {\n return this.extractFromLegacyDelegations(entity, dataOwnersHierarchySubset, metadataType)\n }\n\n async decryptAllSecureDelegations(\n entity: EncryptedEntityStub | EncryptedEntity,\n dataOwnersHierarchySubset: string[],\n metadataType: SecurityMetadataType\n ): Promise<{ decrypted: string; dataOwnersWithAccess: string[] }[]> {\n const secureDelegationEntries: [string, SecureDelegation][] = Object.entries(entity.securityMetadata?.secureDelegations ?? {})\n const toSearchByDelegationKey: string[] = secureDelegationEntries.flatMap(([delegationKey, delegation]): string[] => {\n if (!delegation.exchangeDataId) {\n return [delegationKey]\n } else {\n return []\n }\n })\n const exchangeDataByDelegationKey = await this.exchangeData.getCachedDecryptionDataKeyByAccessControlHash(toSearchByDelegationKey)\n const toSearchWithExchangeDataMap = secureDelegationEntries.flatMap(([delegationKey, delegation]): string[] => {\n if (\n !delegation.exchangeDataId &&\n dataOwnersHierarchySubset.some((it) => delegation.delegate == it || delegation.delegator == it) &&\n !exchangeDataByDelegationKey[delegationKey] &&\n this.hasSecurityMetadataOfType(delegation, metadataType)\n ) {\n return [delegationKey]\n } else {\n return []\n }\n })\n const exchangeDataMaps =\n toSearchWithExchangeDataMap.length > 0 ? await this.exchangeDataMap.getExchangeDataMapBatch(toSearchWithExchangeDataMap) : []\n const exchangeDataIdByDelegationKey: { [delegationKey: string]: string } = {}\n for (const exchangeDataMap of exchangeDataMaps) {\n const decrypted = await this.secureDelegationsEncryption.decryptExchangeDataId(exchangeDataMap.encryptedExchangeDataIds)\n if (decrypted) {\n exchangeDataIdByDelegationKey[exchangeDataMap.id] = decrypted\n }\n }\n const toSearchDirectlyById = secureDelegationEntries.flatMap(([delegationKey, delegation]): string[] => {\n if (\n delegation.exchangeDataId &&\n dataOwnersHierarchySubset.some((it) => delegation.delegate == it || delegation.delegator == it) &&\n !exchangeDataByDelegationKey[delegationKey] &&\n this.hasSecurityMetadataOfType(delegation, metadataType)\n ) {\n return [delegation.exchangeDataId]\n } else {\n return []\n }\n })\n const allExchangeDataIdToRetrieve = [...new Set([...toSearchDirectlyById, ...Object.values(exchangeDataIdByDelegationKey)])]\n const exchangeDataById =\n allExchangeDataIdToRetrieve.length > 0 ? await this.exchangeData.getDecryptionDataKeyByIds(allExchangeDataIdToRetrieve, true) : {}\n const allExtractedWithDataOwners: { decrypted: string; dataOwnersWithAccess: string[] }[] = []\n for (const [delegationKey, delegation] of secureDelegationEntries) {\n let exchangeData:\n | {\n exchangeKey: CryptoKey | undefined\n accessControlSecret: string | undefined\n exchangeData: ExchangeData\n }\n | undefined = undefined\n if (exchangeDataByDelegationKey[delegationKey]) {\n exchangeData = exchangeDataByDelegationKey[delegationKey]\n } else if (delegation.exchangeDataId) {\n exchangeData = exchangeDataById[delegation.exchangeDataId]\n } else if (exchangeDataIdByDelegationKey[delegationKey]) {\n exchangeData = exchangeDataById[exchangeDataIdByDelegationKey[delegationKey]]\n }\n if (exchangeData && exchangeData.exchangeKey) {\n const decrypted = await this.decryptSecureDelegationMetadata(delegation, metadataType, exchangeData.exchangeKey)\n for (const d of decrypted) {\n allExtractedWithDataOwners.push({\n decrypted: d,\n dataOwnersWithAccess: [exchangeData.exchangeData.delegator, exchangeData.exchangeData.delegate],\n })\n }\n }\n }\n return allExtractedWithDataOwners\n }\n\n async getDelegationMemberDetails(typedEntity: EncryptedEntityWithType): Promise<{\n [delegationKey: string]: DelegationMembersDetails\n }> {\n const res: { [delegationKey: string]: DelegationMembersDetails } = {}\n // 1. Add all explicit data owners, keep only delegations with at least an anonymous data owner to check later\n let remainingDelegations = Object.entries(typedEntity.entity.securityMetadata?.secureDelegations ?? {})\n let updatedRemainingDelegations: [string, SecureDelegation][] = []\n for (const delegationEntry of remainingDelegations) {\n const delegation = delegationEntry[1]\n if (delegation.delegator && delegation.delegate) {\n res[delegationEntry[0]] = {\n delegate: delegation.delegate,\n delegator: delegation.delegator,\n fullyExplicit: true,\n accessLevel: delegation.permissions,\n accessControlSecret: undefined,\n }\n } else {\n updatedRemainingDelegations.push(delegationEntry)\n }\n }\n remainingDelegations = updatedRemainingDelegations\n if (!remainingDelegations.length) return res\n updatedRemainingDelegations = []\n // 2. Attempt to identify the anonymous data owner of remaining delegations by checking if we have the exchange data cached by hash\n // Note: we can find exchange data by hash only if we could successfully decrypt it\n const cachedExchangeData = await this.exchangeData.getCachedDecryptionDataKeyByAccessControlHash(remainingDelegations.map((d) => d[0]))\n for (const delegationEntry of remainingDelegations) {\n const exchangeDataOfDelegation = cachedExchangeData[delegationEntry[0]]\n if (exchangeDataOfDelegation) {\n res[delegationEntry[0]] = {\n delegate: exchangeDataOfDelegation.exchangeData.delegate,\n delegator: exchangeDataOfDelegation.exchangeData.delegator,\n fullyExplicit: false,\n accessLevel: delegationEntry[1].permissions,\n accessControlSecret: exchangeDataOfDelegation.accessControlSecret,\n }\n } else {\n updatedRemainingDelegations.push(delegationEntry)\n }\n }\n remainingDelegations = updatedRemainingDelegations\n if (!remainingDelegations.length) return res\n updatedRemainingDelegations = []\n // 3. Attempt to identify the anonymous data owner of remaining delegations between us (or one of our parents) and an anonymous data owner\n const hierarchy = await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds()\n const remainingExchangeDataMaps = await this.exchangeDataMap.getExchangeDataMapBatch(\n remainingDelegations\n .filter(([_, delegation]) => hierarchy.some((x) => x == delegation.delegator || x == delegation.delegate))\n .map(([hash, _]) => hash)\n )\n const exchangeDataIdByDelegationKey: { [delegationKey: string]: string } = {}\n for (const exchangeDataMap of remainingExchangeDataMaps) {\n if (!!exchangeDataMap.encryptedExchangeDataIds) {\n const decrypted = await this.secureDelegationsEncryption.decryptExchangeDataId(exchangeDataMap.encryptedExchangeDataIds)\n if (decrypted) {\n exchangeDataIdByDelegationKey[exchangeDataMap.id] = decrypted\n }\n }\n }\n const exchangeDataByIds = await this.exchangeData.getDecryptionDataKeyByIds(Object.values(exchangeDataIdByDelegationKey), true)\n for (const [hash, delegation] of remainingDelegations) {\n if (hierarchy.some((x) => x === delegation.delegate || x === delegation.delegator)) {\n const dataId = exchangeDataIdByDelegationKey[hash]\n const exchangeDataInfo = dataId ? exchangeDataByIds[dataId] : undefined\n if (exchangeDataInfo) {\n res[hash] = {\n delegator: exchangeDataInfo.exchangeData.delegator,\n delegate: exchangeDataInfo.exchangeData.delegate,\n fullyExplicit: false,\n accessLevel: delegation.permissions,\n accessControlSecret: exchangeDataInfo.accessControlSecret,\n }\n } else {\n updatedRemainingDelegations.push([hash, delegation])\n }\n } else {\n updatedRemainingDelegations.push([hash, delegation])\n }\n }\n return {\n ...res,\n ...Object.fromEntries(\n updatedRemainingDelegations.map(([hash, secureDelegation]) => [\n hash,\n {\n delegator: secureDelegation.delegator,\n delegate: secureDelegation.delegate,\n fullyExplicit: false,\n accessLevel: secureDelegation.permissions,\n accessControlSecret: undefined,\n },\n ])\n ),\n }\n }\n\n async decryptSecureDelegationMetadata(delegation: SecureDelegation, metadataType: SecurityMetadataType, key: CryptoKey): Promise<string[]> {\n switch (metadataType) {\n case SecurityMetadataType.SecretId:\n return this.secureDelegationsEncryption.decryptSecretIds(delegation, key)\n case SecurityMetadataType.EncryptionKey:\n return this.secureDelegationsEncryption.decryptEncryptionKeys(delegation, key)\n case SecurityMetadataType.OwningEntityId:\n return this.secureDelegationsEncryption.decryptOwningEntityIds(delegation, key)\n default:\n throw new Error(`Internal error: invalid SecurityMetadataType ${metadataType}`)\n }\n }\n\n async getEntityLegacyDelegationAccessLevel(\n entity: EncryptedEntityStub | EncryptedEntity,\n dataOwnersHierarchySubset: string[]\n ): Promise<AccessLevelEnum | undefined> {\n if (!dataOwnersHierarchySubset.length) throw new Error(\"`dataOwnersHierarchySubset` can't be empty\")\n // Legacy delegations provide write access\n if (Object.keys(entity.delegations ?? {}).some((delegate) => dataOwnersHierarchySubset.includes(delegate))) {\n return AccessLevelEnum.WRITE\n }\n return undefined\n }\n\n async getEntitySecureDelegationAccessLevel(\n entity: EncryptedEntityStub | EncryptedEntity,\n dataOwnersHierarchySubset: string[]\n ): Promise<AccessLevelEnum | undefined> {\n if (!dataOwnersHierarchySubset.length) throw new Error(\"`dataOwnersHierarchySubset` can't be empty\")\n // If the data owner is explicit all delegations he can access has his id. If the delegator is anonymous all delegations he can access are\n // accessible by hash. No mixed scenario possible.\n let accessibleDelegations: SecureDelegation[] = Object.values(entity.securityMetadata?.secureDelegations ?? {}).filter((secureDelegation) =>\n dataOwnersHierarchySubset.some((dataOwner) => dataOwner === secureDelegation.delegator || dataOwner === secureDelegation.delegate)\n )\n if (!accessibleDelegations.length) {\n const availableCanonicalHashes = Object.keys(\n await this.exchangeData.getCachedDecryptionDataKeyByAccessControlHash(Object.keys(entity.securityMetadata?.secureDelegations ?? {}))\n )\n accessibleDelegations = availableCanonicalHashes.map((hash) => (entity.securityMetadata?.secureDelegations ?? {})[hash])\n }\n const permissions = accessibleDelegations.map((secureDelegation) => secureDelegation.permissions)\n let maxLevel: AccessLevelEnum | undefined = undefined\n for (const permission of permissions) {\n if (permission === AccessLevelEnum.WRITE) {\n return AccessLevelEnum.WRITE\n }\n if (permission === AccessLevelEnum.READ) {\n maxLevel = AccessLevelEnum.READ\n }\n }\n return maxLevel\n }\n\n async getEntityAccessLevel(\n entity: EncryptedEntityStub | EncryptedEntity,\n dataOwnersHierarchySubset: string[]\n ): Promise<AccessLevelEnum | undefined> {\n const legacyAccess = await this.getEntityLegacyDelegationAccessLevel(entity, dataOwnersHierarchySubset)\n if (legacyAccess != undefined) return legacyAccess\n return this.getEntitySecureDelegationAccessLevel(entity, dataOwnersHierarchySubset)\n }\n\n hasAnyEncryptionKeys(entity: EncryptedEntityStub | EncryptedEntity): boolean {\n return Object.keys(entity.encryptionKeys ?? {}).length > 0 || Object.keys(entity.securityMetadata?.secureDelegations ?? {}).length > 0\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SecurityMetadataDecryptor.js","sourceRoot":"","sources":["../../../icc-x-api/crypto/SecurityMetadataDecryptor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oCAA4G;AAQ5G,uDAAmG;AAEnG,IAAO,eAAe,GAAG,yBAAgB,CAAC,eAAe,CAAA;AAUzD,IAAY,oBAIX;AAJD,WAAY,oBAAoB;IAC9B,uEAAY,CAAA;IACZ,iFAAa,CAAA;IACb,mFAAc,CAAA;AAChB,CAAC,EAJW,oBAAoB,oCAApB,oBAAoB,QAI/B;AAED,MAAa,yBAAyB;IACpC,YACmB,mBAAwC,EACxC,UAA4B,EAC5B,YAAiC,EACjC,eAAuC,EACvC,2BAAwD,EACxD,YAA8B;QAL9B,wBAAmB,GAAnB,mBAAmB,CAAqB;QACxC,eAAU,GAAV,UAAU,CAAkB;QAC5B,iBAAY,GAAZ,YAAY,CAAqB;QACjC,oBAAe,GAAf,eAAe,CAAwB;QACvC,gCAA2B,GAA3B,2BAA2B,CAA6B;QACxD,iBAAY,GAAZ,YAAY,CAAkB;IAC9C,CAAC;IAEE,wBAAwB,CAC5B,QAAmD,EACnD,yBAAmC,EACnC,YAAkC;;YAElC,uEAAuE;YACvE,MAAM,GAAG,GAAqC,EAAE,CAAA;YAChD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,CAAC,EAAE,yBAAyB,EAAE,YAAY,CAAC,CAAA;gBACxG,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;gBAC3E,GAAG,CAAC,CAAC,CAAC,EAAG,CAAC,GAAG,CAAC,GAAG,qBAAqB,CAAC,CAAA;YACzC,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC;KAAA;IAEa,4BAA4B,CACxC,MAA6C,EAC7C,yBAAmC,EACnC,YAAkC;;;YAElC,IAAI,CAAC,yBAAyB,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;YACpG,IAAI,WAAmD,CAAA;YACvD,IAAI,iBAAiB,GAAyC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACzF,IAAI,YAAY,GAA+B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;YACvD,QAAQ,YAAY,EAAE,CAAC;gBACrB,KAAK,oBAAoB,CAAC,QAAQ;oBAChC,WAAW,GAAG,MAAA,MAAM,CAAC,WAAW,mCAAI,EAAE,CAAA;oBACtC,MAAK;gBACP,KAAK,oBAAoB,CAAC,aAAa;oBACrC,WAAW,GAAG,MAAA,MAAM,CAAC,cAAc,mCAAI,EAAE,CAAA;oBACzC,iBAAiB,GAAG,CAAO,GAAG,EAAE,EAAE;wBAChC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC;4BAAE,OAAO,KAAK,CAAA;wBAChD,IAAI,CAAC;4BACH,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,IAAA,cAAM,EAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;4BACzE,OAAO,IAAI,CAAA;wBACb,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACX,OAAO,CAAC,IAAI,CAAC,wBAAwB,GAAG,wBAAwB,EAAE,CAAC,CAAC,CAAA;4BACpE,OAAO,KAAK,CAAA;wBACd,CAAC;oBACH,CAAC,CAAA,CAAA;oBACD,YAAY,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;oBAC7C,MAAK;gBACP,KAAK,oBAAoB,CAAC,cAAc;oBACtC,WAAW,GAAG,MAAA,MAAM,CAAC,kBAAkB,mCAAI,EAAE,CAAA;oBAC7C,MAAK;gBACP;oBACE,MAAM,IAAI,KAAK,CAAC,gDAAgD,YAAY,EAAE,CAAC,CAAA;YACnF,CAAC;YACD,MAAM,oBAAoB,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,EAAE,CAC7F,yBAAyB,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,KAAK,UAAU,CAAC;gBACzE,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,UAAU,EAAE,WAAW,CAAC;gBAChE,CAAC,CAAC,IAAI,CAAC,gCAAgC,CACnC,UAAU,EACV,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,CAAC,CACpG,CACN,CAAA;YACD,MAAM,GAAG,GAA4D,EAAE,CAAA;YACvE,KAAK,MAAM,UAAU,IAAI,oBAAoB,EAAE,CAAC;gBAC9C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,0BAA0B,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;gBAChG,IAAI,SAAS;oBACX,GAAG,CAAC,IAAI,CAAC;wBACP,SAAS,EAAE,YAAY,CAAC,SAAS,CAAC;wBAClC,oBAAoB,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,WAAY,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,WAAY,CAAC;qBACjH,CAAC,CAAA;YACN,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC;KAAA;IAEO,gCAAgC,CAAC,UAAkB,EAAE,WAAyB;QACpF,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iCAAM,CAAC,KAAE,WAAW,EAAE,UAAU,GAAE,CAAC,CAAC,CAAA;IACvG,CAAC;IAEa,0BAA0B,CACtC,UAAsB,EACtB,iBAAuD;;YAEvD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,4BAA4B,CAAC,UAAU,CAAC,KAAM,EAAE,UAAU,CAAC,WAAY,CAAC,CAAA;YAC5H,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,uIAAuI;oBACvI,gIAAgI;oBAChI,+HAA+H;oBAC/H,MAAM,SAAS,GAAG,IAAA,iBAAS,EAAC,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,IAAA,cAAM,EAAC,UAAU,CAAC,GAAI,CAAC,CAAC,CAAC,CAAA;oBAC5F,MAAM,cAAc,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;oBAC3C,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAChC,IAAI,MAAM,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;4BAAE,OAAO,cAAc,CAAC,CAAC,CAAC,CAAA;oBAC1E,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,IAAI,CAAC,qGAAqG,CAAC,CAAA;oBACrH,CAAC;gBACH,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,wEAAwE;gBAC1E,CAAC;YACH,CAAC;QACH,CAAC;KAAA;IAEK,kCAAkC,CACtC,QAAmD,EACnD,yBAAmC,EACnC,YAAkC;;;YAElC,MAAM,YAAY,GAAgB,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA;YAC7C,MAAM,uBAAuB,GAAgB,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA;YACxD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,KAAK,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAA,MAAA,CAAC,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,EAAE,CAAC;oBACtG,IACE,CAAC,UAAU,CAAC,SAAS;wBACrB,CAAC,UAAU,CAAC,QAAQ;wBACpB,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,UAAU,CAAC,SAAS,IAAI,EAAE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAC/F,CAAC;wBACD,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;4BAC9B,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;wBAC7C,CAAC;6BAAM,CAAC;4BACN,uBAAuB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;wBAC5C,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,sBAAsB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC,GAAG,YAAY,CAAC,EAAE,KAAK,CAAC,CAAA;YAC1G,MAAM,qBAAqB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,6CAA6C,CAAC,CAAC,GAAG,uBAAuB,CAAC,CAAC,CAAA;YACjI,MAAM,GAAG,GAAqC,EAAE,CAAA;YAChD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,MAAM,aAAa,GAAgB,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA;gBAC9C,KAAK,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAA,MAAA,MAAM,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,EAAE,CAAC;oBAC3G,MAAM,MAAM,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,sBAAsB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAA;oBACnI,IACE,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW;wBACnB,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,eAAC,OAAA,EAAE,KAAI,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,YAAY,0CAAE,SAAS,CAAA,IAAI,EAAE,KAAI,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,YAAY,0CAAE,QAAQ,CAAA,CAAA,EAAA,CAAC,EACrH,CAAC;wBACD,CAAC;wBAAA,CAAC,MAAM,IAAI,CAAC,+BAA+B,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAChH,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAC7B,CAAA;oBACH,CAAC;gBACH,CAAC;gBACD,GAAG,CAAC,MAAM,CAAC,EAAG,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAA;YACtC,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC;KAAA;IAED,yBAAyB,CAAC,UAA4B,EAAE,YAAkC;;QACxF,QAAQ,YAAY,EAAE,CAAC;YACrB,KAAK,oBAAoB,CAAC,QAAQ;gBAChC,OAAO,CAAC,MAAA,UAAU,CAAC,SAAS,mCAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;YAChD,KAAK,oBAAoB,CAAC,aAAa;gBACrC,OAAO,CAAC,MAAA,UAAU,CAAC,cAAc,mCAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;YACrD,KAAK,oBAAoB,CAAC,cAAc;gBACtC,OAAO,CAAC,MAAA,UAAU,CAAC,eAAe,mCAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;YACtD;gBACE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC;IAEK,8CAA8C,CAClD,QAAmD,EACnD,yBAAmC,EACnC,YAAkC;;;YAElC,MAAM,YAAY,GAAgB,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA;YAC7C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,MAAA,MAAA,CAAC,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,EAAE,CAAC;oBACpF,IAAI,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,UAAU,CAAC,SAAS,IAAI,EAAE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACpG,IAAI,UAAU,CAAC,cAAc,IAAI,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,CAAC;4BAC1F,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;wBAC7C,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,yBAAyB,GAAG,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC,GAAG,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YACzI,MAAM,GAAG,GAAqC,EAAE,CAAA;YAChD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,MAAM,aAAa,GAAgB,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA;gBAC9C,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,MAAA,MAAA,MAAM,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,EAAE,CAAC;oBACzF,MAAM,0BAA0B,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,yBAAyB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;oBAC/H,IAAI,0BAA0B,aAA1B,0BAA0B,uBAA1B,0BAA0B,CAAE,WAAW,EAAE,CAAC;wBAC5C,CAAC;wBAAA,CAAC,MAAM,IAAI,CAAC,+BAA+B,CAAC,UAAU,EAAE,YAAY,EAAE,0BAA0B,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CACpI,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAC7B,CAAA;oBACH,CAAC;gBACH,CAAC;gBACD,GAAG,CAAC,MAAM,CAAC,EAAG,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAA;YACtC,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC;KAAA;IAEK,4CAA4C,CAChD,QAAmD,EACnD,yBAAmC,EACnC,YAAkC;;;YAElC,MAAM,yBAAyB,GAAgB,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA;YAC1D,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,KAAK,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAA,MAAA,CAAC,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,EAAE,CAAC;oBACtG,IAAI,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,UAAU,CAAC,SAAS,IAAI,EAAE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACpG,IAAI,CAAC,UAAU,CAAC,cAAc,IAAI,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,CAAC;4BAC3F,yBAAyB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;wBAC9C,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,gBAAgB,GACpB,yBAAyB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,uBAAuB,CAAC,CAAC,GAAG,yBAAyB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YAC9H,MAAM,6BAA6B,GAAwC,EAAE,CAAA;YAC7E,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE,CAAC;gBAC/C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,qBAAqB,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAA;gBACxH,IAAI,SAAS,EAAE,CAAC;oBACd,6BAA6B,CAAC,eAAe,CAAC,EAAE,CAAC,GAAG,SAAS,CAAA;gBAC/D,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,MAAM,IAAI,CAAC;gBAAE,OAAO,EAAE,CAAA;YACrE,MAAM,yBAAyB,GAC7B,MAAM,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,MAAM,GAAG,CAAC;gBACrD,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;gBACrH,CAAC,CAAC,EAAE,CAAA;YACR,MAAM,GAAG,GAAqC,EAAE,CAAA;YAChD,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,MAAM,aAAa,GAAgB,IAAI,GAAG,CAAC,EAAE,CAAC,CAAA;gBAC9C,KAAK,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAA,MAAA,MAAM,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,EAAE,CAAC;oBAC3G,MAAM,cAAc,GAAG,6BAA6B,CAAC,aAAa,CAAC,CAAA;oBACnE,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,yBAAyB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;oBACrF,IAAI,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,EAAE,CAAC;wBACxB,CAAC;wBAAA,CAAC,MAAM,IAAI,CAAC,+BAA+B,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAChH,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAC7B,CAAA;oBACH,CAAC;gBACH,CAAC;gBACD,GAAG,CAAC,MAAM,CAAC,EAAG,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAA;YACtC,CAAC;YACD,OAAO,GAAG,CAAA;QACZ,CAAC;KAAA;IAEK,UAAU,CACd,MAA6C,EAC7C,yBAAmC,EACnC,YAAkC;;YAElC,MAAM,0BAA0B,GAAG;gBACjC,GAAG,CAAC,MAAM,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,yBAAyB,EAAE,YAAY,CAAC,CAAC;gBAC5F,GAAG,CAAC,MAAM,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,yBAAyB,EAAE,YAAY,CAAC,CAAC;aAC7F,CAAA;YACD,OAAO,yBAAyB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;gBACjD,MAAM,4BAA4B,GAAG,0BAA0B;qBAC5D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;qBACjE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;gBAC1B,OAAO;oBACL,OAAO,EAAE,SAAS;oBAClB,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,4BAA4B,CAAC,CAAC;iBACtD,CAAA;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;IAEK,2BAA2B,CAC/B,MAA6C,EAC7C,yBAAmC,EACnC,YAAkC;;YAElC,OAAO,IAAI,CAAC,4BAA4B,CAAC,MAAM,EAAE,yBAAyB,EAAE,YAAY,CAAC,CAAA;QAC3F,CAAC;KAAA;IAED;;;;;;;;;;OAUG;IACG,mCAAmC,CACvC,MAA6C,EAC7C,yBAAmC,EACnC,YAAkC;;;YAElC,MAAM,KAAK,GAAG;gBACZ,GAAG,CAAC,MAAM,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,yBAAyB,EAAE,YAAY,CAAC,CAAC;gBAC5F,GAAG,CAAC,MAAM,IAAI,CAAC,2BAA2B,CAAC,MAAM,EAAE,yBAAyB,EAAE,YAAY,CAAC,CAAC;aAC7F,CAAA;YACD,MAAM,MAAM,GAA2C,EAAE,CAAA;YACzD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAChD,CAAC;oBAAA,OAAC,MAAM,CAAC,OAAO,qCAAd,MAAM,CAAC,OAAO,IAAM,IAAI,GAAG,EAAE,EAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBACtD,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAA;QACf,CAAC;KAAA;IAEK,2BAA2B,CAC/B,MAA6C,EAC7C,yBAAmC,EACnC,YAAkC;;;YAElC,MAAM,uBAAuB,GAAiC,MAAM,CAAC,OAAO,CAAC,MAAA,MAAA,MAAM,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,CAAA;YAC9H,MAAM,uBAAuB,GAAa,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,UAAU,CAAC,EAAY,EAAE;gBAClH,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;oBAC/B,OAAO,CAAC,aAAa,CAAC,CAAA;gBACxB,CAAC;qBAAM,CAAC;oBACN,OAAO,EAAE,CAAA;gBACX,CAAC;YACH,CAAC,CAAC,CAAA;YACF,MAAM,2BAA2B,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,6CAA6C,CAAC,uBAAuB,CAAC,CAAA;YAClI,MAAM,2BAA2B,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,UAAU,CAAC,EAAY,EAAE;gBAC5G,IACE,CAAC,UAAU,CAAC,cAAc;oBAC1B,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,IAAI,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC;oBAC/F,CAAC,2BAA2B,CAAC,aAAa,CAAC;oBAC3C,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,YAAY,CAAC,EACxD,CAAC;oBACD,OAAO,CAAC,aAAa,CAAC,CAAA;gBACxB,CAAC;qBAAM,CAAC;oBACN,OAAO,EAAE,CAAA;gBACX,CAAC;YACH,CAAC,CAAC,CAAA;YACF,MAAM,gBAAgB,GACpB,2BAA2B,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,uBAAuB,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YAC/H,MAAM,6BAA6B,GAAwC,EAAE,CAAA;YAC7E,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE,CAAC;gBAC/C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,qBAAqB,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAA;gBACxH,IAAI,SAAS,EAAE,CAAC;oBACd,6BAA6B,CAAC,eAAe,CAAC,EAAE,CAAC,GAAG,SAAS,CAAA;gBAC/D,CAAC;YACH,CAAC;YACD,MAAM,oBAAoB,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,UAAU,CAAC,EAAY,EAAE;gBACrG,IACE,UAAU,CAAC,cAAc;oBACzB,yBAAyB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,IAAI,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC;oBAC/F,CAAC,2BAA2B,CAAC,aAAa,CAAC;oBAC3C,IAAI,CAAC,yBAAyB,CAAC,UAAU,EAAE,YAAY,CAAC,EACxD,CAAC;oBACD,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;gBACpC,CAAC;qBAAM,CAAC;oBACN,OAAO,EAAE,CAAA;gBACX,CAAC;YACH,CAAC,CAAC,CAAA;YACF,MAAM,2BAA2B,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,oBAAoB,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAA;YAC5H,MAAM,gBAAgB,GACpB,2BAA2B,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,2BAA2B,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YACpI,MAAM,0BAA0B,GAA4D,EAAE,CAAA;YAC9F,KAAK,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,IAAI,uBAAuB,EAAE,CAAC;gBAClE,IAAI,YAAY,GAMA,SAAS,CAAA;gBACzB,IAAI,2BAA2B,CAAC,aAAa,CAAC,EAAE,CAAC;oBAC/C,YAAY,GAAG,2BAA2B,CAAC,aAAa,CAAC,CAAA;gBAC3D,CAAC;qBAAM,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;oBACrC,YAAY,GAAG,gBAAgB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;gBAC5D,CAAC;qBAAM,IAAI,6BAA6B,CAAC,aAAa,CAAC,EAAE,CAAC;oBACxD,YAAY,GAAG,gBAAgB,CAAC,6BAA6B,CAAC,aAAa,CAAC,CAAC,CAAA;gBAC/E,CAAC;gBACD,IAAI,YAAY,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;oBAC7C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,+BAA+B,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC,WAAW,CAAC,CAAA;oBAChH,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;wBAC1B,0BAA0B,CAAC,IAAI,CAAC;4BAC9B,SAAS,EAAE,CAAC;4BACZ,oBAAoB,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,YAAY,CAAC,QAAQ,CAAC;yBAChG,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,0BAA0B,CAAA;QACnC,CAAC;KAAA;IAEK,0BAA0B,CAAC,WAAoC;;;YAGnE,MAAM,GAAG,GAA0D,EAAE,CAAA;YACrE,8GAA8G;YAC9G,IAAI,oBAAoB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAA,MAAA,WAAW,CAAC,MAAM,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,CAAA;YACvG,IAAI,2BAA2B,GAAiC,EAAE,CAAA;YAClE,KAAK,MAAM,eAAe,IAAI,oBAAoB,EAAE,CAAC;gBACnD,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,CAAA;gBACrC,IAAI,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;oBAChD,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG;wBACxB,QAAQ,EAAE,UAAU,CAAC,QAAQ;wBAC7B,SAAS,EAAE,UAAU,CAAC,SAAS;wBAC/B,aAAa,EAAE,IAAI;wBACnB,WAAW,EAAE,UAAU,CAAC,WAAW;wBACnC,mBAAmB,EAAE,SAAS;qBAC/B,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,2BAA2B,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;gBACnD,CAAC;YACH,CAAC;YACD,oBAAoB,GAAG,2BAA2B,CAAA;YAClD,IAAI,CAAC,oBAAoB,CAAC,MAAM;gBAAE,OAAO,GAAG,CAAA;YAC5C,2BAA2B,GAAG,EAAE,CAAA;YAChC,mIAAmI;YACnI,mFAAmF;YACnF,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,6CAA6C,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACvI,KAAK,MAAM,eAAe,IAAI,oBAAoB,EAAE,CAAC;gBACnD,MAAM,wBAAwB,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAA;gBACvE,IAAI,wBAAwB,EAAE,CAAC;oBAC7B,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG;wBACxB,QAAQ,EAAE,wBAAwB,CAAC,YAAY,CAAC,QAAQ;wBACxD,SAAS,EAAE,wBAAwB,CAAC,YAAY,CAAC,SAAS;wBAC1D,aAAa,EAAE,KAAK;wBACpB,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,WAAW;wBAC3C,mBAAmB,EAAE,wBAAwB,CAAC,mBAAmB;qBAClE,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,2BAA2B,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;gBACnD,CAAC;YACH,CAAC;YACD,oBAAoB,GAAG,2BAA2B,CAAA;YAClD,IAAI,CAAC,oBAAoB,CAAC,MAAM;gBAAE,OAAO,GAAG,CAAA;YAC5C,2BAA2B,GAAG,EAAE,CAAA;YAChC,0IAA0I;YAC1I,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,+BAA+B,EAAE,CAAA;YAC3E,MAAM,yBAAyB,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,uBAAuB,CAClF,oBAAoB;iBACjB,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,UAAU,CAAC,SAAS,IAAI,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;iBACzG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAC5B,CAAA;YACD,MAAM,6BAA6B,GAAwC,EAAE,CAAA;YAC7E,KAAK,MAAM,eAAe,IAAI,yBAAyB,EAAE,CAAC;gBACxD,IAAI,CAAC,CAAC,eAAe,CAAC,wBAAwB,EAAE,CAAC;oBAC/C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,2BAA2B,CAAC,qBAAqB,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAA;oBACxH,IAAI,SAAS,EAAE,CAAC;wBACd,6BAA6B,CAAC,eAAe,CAAC,EAAE,CAAC,GAAG,SAAS,CAAA;oBAC/D,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,MAAM,CAAC,MAAM,CAAC,6BAA6B,CAAC,EAAE,IAAI,CAAC,CAAA;YAC/H,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,oBAAoB,EAAE,CAAC;gBACtD,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,QAAQ,IAAI,CAAC,KAAK,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;oBACnF,MAAM,MAAM,GAAG,6BAA6B,CAAC,IAAI,CAAC,CAAA;oBAClD,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;oBACvE,IAAI,gBAAgB,EAAE,CAAC;wBACrB,GAAG,CAAC,IAAI,CAAC,GAAG;4BACV,SAAS,EAAE,gBAAgB,CAAC,YAAY,CAAC,SAAS;4BAClD,QAAQ,EAAE,gBAAgB,CAAC,YAAY,CAAC,QAAQ;4BAChD,aAAa,EAAE,KAAK;4BACpB,WAAW,EAAE,UAAU,CAAC,WAAW;4BACnC,mBAAmB,EAAE,gBAAgB,CAAC,mBAAmB;yBAC1D,CAAA;oBACH,CAAC;yBAAM,CAAC;wBACN,2BAA2B,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAA;oBACtD,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,2BAA2B,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAA;gBACtD,CAAC;YACH,CAAC;YACD,uCACK,GAAG,GACH,MAAM,CAAC,WAAW,CACnB,2BAA2B,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE,EAAE,CAAC;gBAC5D,IAAI;gBACJ;oBACE,SAAS,EAAE,gBAAgB,CAAC,SAAS;oBACrC,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;oBACnC,aAAa,EAAE,KAAK;oBACpB,WAAW,EAAE,gBAAgB,CAAC,WAAW;oBACzC,mBAAmB,EAAE,SAAS;iBAC/B;aACF,CAAC,CACH,EACF;QACH,CAAC;KAAA;IAEK,+BAA+B,CAAC,UAA4B,EAAE,YAAkC,EAAE,GAAc;;YACpH,QAAQ,YAAY,EAAE,CAAC;gBACrB,KAAK,oBAAoB,CAAC,QAAQ;oBAChC,OAAO,IAAI,CAAC,2BAA2B,CAAC,gBAAgB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;gBAC3E,KAAK,oBAAoB,CAAC,aAAa;oBACrC,OAAO,IAAI,CAAC,2BAA2B,CAAC,qBAAqB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;gBAChF,KAAK,oBAAoB,CAAC,cAAc;oBACtC,OAAO,IAAI,CAAC,2BAA2B,CAAC,sBAAsB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;gBACjF;oBACE,MAAM,IAAI,KAAK,CAAC,gDAAgD,YAAY,EAAE,CAAC,CAAA;YACnF,CAAC;QACH,CAAC;KAAA;IAEK,oCAAoC,CACxC,MAA6C,EAC7C,yBAAmC;;;YAEnC,IAAI,CAAC,yBAAyB,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;YACpG,0CAA0C;YAC1C,IAAI,MAAM,CAAC,IAAI,CAAC,MAAA,MAAM,CAAC,WAAW,mCAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,yBAAyB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAC3G,OAAO,eAAe,CAAC,KAAK,CAAA;YAC9B,CAAC;YACD,OAAO,SAAS,CAAA;QAClB,CAAC;KAAA;IAEK,oCAAoC,CACxC,MAA6C,EAC7C,yBAAmC;;;YAEnC,IAAI,CAAC,yBAAyB,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;YACpG,0IAA0I;YAC1I,kDAAkD;YAClD,IAAI,qBAAqB,GAAuB,MAAM,CAAC,MAAM,CAAC,MAAA,MAAA,MAAM,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,gBAAgB,EAAE,EAAE,CAC1I,yBAAyB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,gBAAgB,CAAC,SAAS,IAAI,SAAS,KAAK,gBAAgB,CAAC,QAAQ,CAAC,CACnI,CAAA;YACD,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,CAAC;gBAClC,MAAM,wBAAwB,GAAG,MAAM,CAAC,IAAI,CAC1C,MAAM,IAAI,CAAC,YAAY,CAAC,6CAA6C,CAAC,MAAM,CAAC,IAAI,CAAC,MAAA,MAAA,MAAM,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,CAAC,CACrI,CAAA;gBACD,qBAAqB,GAAG,wBAAwB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,eAAC,OAAA,CAAC,MAAA,MAAA,MAAM,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA,EAAA,CAAC,CAAA;YAC1H,CAAC;YACD,MAAM,WAAW,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,EAAE,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAA;YACjG,IAAI,QAAQ,GAAgC,SAAS,CAAA;YACrD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,IAAI,UAAU,KAAK,eAAe,CAAC,KAAK,EAAE,CAAC;oBACzC,OAAO,eAAe,CAAC,KAAK,CAAA;gBAC9B,CAAC;gBACD,IAAI,UAAU,KAAK,eAAe,CAAC,IAAI,EAAE,CAAC;oBACxC,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAA;gBACjC,CAAC;YACH,CAAC;YACD,OAAO,QAAQ,CAAA;QACjB,CAAC;KAAA;IAEK,oBAAoB,CACxB,MAA6C,EAC7C,yBAAmC;;YAEnC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,oCAAoC,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAA;YACvG,IAAI,YAAY,IAAI,SAAS;gBAAE,OAAO,YAAY,CAAA;YAClD,OAAO,IAAI,CAAC,oCAAoC,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAA;QACrF,CAAC;KAAA;IAED,oBAAoB,CAAC,MAA6C;;QAChE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAA,MAAM,CAAC,cAAc,mCAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAA,MAAA,MAAM,CAAC,gBAAgB,0CAAE,iBAAiB,mCAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;IACxI,CAAC;CACF;AA1hBD,8DA0hBC","sourcesContent":["import { b64_2ab, EncryptedEntityWithType, EntityWithDelegationTypeName, hex2ua, ua2string } from '../utils'\nimport { ExchangeKeysManager } from './ExchangeKeysManager'\nimport { CryptoPrimitives } from './CryptoPrimitives'\nimport { Delegation } from '../../icc-api/model/Delegation'\nimport { ExchangeDataManager } from './ExchangeDataManager'\nimport { ExchangeDataMapManager } from './ExchangeDataMapManager'\nimport { SecureDelegationsEncryption } from './SecureDelegationsEncryption'\nimport { IccDataOwnerXApi } from '../icc-data-owner-x-api'\nimport { EncryptedEntity, EncryptedEntityStub, SecureDelegation } from '../../icc-api/model/models'\nimport { ExchangeData } from '../../icc-api/model/internal/ExchangeData'\nimport AccessLevelEnum = SecureDelegation.AccessLevelEnum\n\nexport type DelegationMembersDetails = {\n delegator: string | undefined\n delegate: string | undefined\n fullyExplicit: boolean\n accessControlSecret: string | undefined\n accessLevel: AccessLevelEnum\n}\n\nexport enum SecurityMetadataType {\n SecretId = 1, // Start from 1, avoids issues with SecretId being falsy\n EncryptionKey,\n OwningEntityId,\n}\n\nexport class SecurityMetadataDecryptor {\n constructor(\n private readonly exchangeKeysManager: ExchangeKeysManager,\n private readonly primitives: CryptoPrimitives,\n private readonly exchangeData: ExchangeDataManager,\n private readonly exchangeDataMap: ExchangeDataMapManager,\n private readonly secureDelegationsEncryption: SecureDelegationsEncryption,\n private readonly dataOwnerApi: IccDataOwnerXApi\n ) {}\n\n async decryptLegacyDelegations(\n entities: (EncryptedEntityStub | EncryptedEntity)[],\n dataOwnersHierarchySubset: string[],\n metadataType: SecurityMetadataType\n ): Promise<{ [entityId: string]: string[] }> {\n // For legacy delegations there is no advantage in doing stuff in bulk.\n const res: { [entityId: string]: string[] } = {}\n for (const e of entities) {\n const allDecrypted = await this.extractFromLegacyDelegations(e, dataOwnersHierarchySubset, metadataType)\n const deduplicatedDecrypted = new Set(allDecrypted.map((x) => x.decrypted))\n res[e.id!] = [...deduplicatedDecrypted]\n }\n return res\n }\n\n private async extractFromLegacyDelegations(\n entity: EncryptedEntityStub | EncryptedEntity,\n dataOwnersHierarchySubset: string[],\n metadataType: SecurityMetadataType\n ): Promise<{ decrypted: string; dataOwnersWithAccess: string[] }[]> {\n if (!dataOwnersHierarchySubset.length) throw new Error(\"`dataOwnersHierarchySubset` can't be empty\")\n let delegations: { [delegateId: string]: Delegation[] }\n let validateDecrypted: (result: string) => Promise<boolean> = (x) => Promise.resolve(!!x)\n let mapDecrypted: (result: string) => string = (x) => x\n switch (metadataType) {\n case SecurityMetadataType.SecretId:\n delegations = entity.delegations ?? {}\n break\n case SecurityMetadataType.EncryptionKey:\n delegations = entity.encryptionKeys ?? {}\n validateDecrypted = async (key) => {\n if (!/^[0-9A-Fa-f\\-]+$/g.test(key)) return false\n try {\n await this.primitives.AES.importKey('raw', hex2ua(key.replace(/-/g, '')))\n return true\n } catch (e) {\n console.warn(`Could not import key ${key} as an encryption key.`, e)\n return false\n }\n }\n mapDecrypted = (key) => key.replace(/-/g, '')\n break\n case SecurityMetadataType.OwningEntityId:\n delegations = entity.cryptedForeignKeys ?? {}\n break\n default:\n throw new Error(`Internal error: invalid SecurityMetadataType ${metadataType}`)\n }\n const delegationsWithOwner = Object.entries(delegations).flatMap(([delegateId, delegations]) =>\n dataOwnersHierarchySubset.some((dataOwnerId) => dataOwnerId === delegateId)\n ? this.populateLegacyDelegationDelegate(delegateId, delegations)\n : this.populateLegacyDelegationDelegate(\n delegateId,\n delegations.filter((d) => dataOwnersHierarchySubset.some((dataOwnerId) => d.owner === dataOwnerId))\n )\n )\n const res: { decrypted: string; dataOwnersWithAccess: string[] }[] = []\n for (const delegation of delegationsWithOwner) {\n const decrypted = await this.tryDecryptLegacyDelegation(delegation, (k) => validateDecrypted(k))\n if (decrypted)\n res.push({\n decrypted: mapDecrypted(decrypted),\n dataOwnersWithAccess: delegation.owner ? [delegation.owner, delegation.delegatedTo!] : [delegation.delegatedTo!],\n })\n }\n return res\n }\n\n private populateLegacyDelegationDelegate(delegateId: string, delegations: Delegation[]): Delegation[] {\n return delegations.map((d) => (d.delegatedTo === delegateId ? d : { ...d, delegatedTo: delegateId }))\n }\n\n private async tryDecryptLegacyDelegation(\n delegation: Delegation,\n validateDecrypted: (result: string) => Promise<boolean>\n ): Promise<string | undefined> {\n const exchangeKeys = await this.exchangeKeysManager.getDecryptionExchangeKeysFor(delegation.owner!, delegation.delegatedTo!)\n for (const key of exchangeKeys) {\n try {\n // Format of encrypted key for any delegation should be entityId:key, but with the merging of entities the entityId might not match the\n // current id. As a checksum we are only verifying that the decrypted bytes can be represented as a string with exactly one ':'.\n // Additionally, we also have a validator that is specific for each type of delegation content (encryption key, secret id, ...)\n const decrypted = ua2string(await this.primitives.AES.decrypt(key, hex2ua(delegation.key!)))\n const decryptedSplit = decrypted.split(':')\n if (decryptedSplit.length === 2) {\n if (await validateDecrypted(decryptedSplit[1])) return decryptedSplit[1]\n } else {\n console.warn(\"Error in the decrypted delegation: content should contain exactly 1 ':', the delegation is ignored.\")\n }\n } catch (e) {\n // Do nothing: the delegation uses another exchange key owner->delegator\n }\n }\n }\n\n async decryptSecureDelegationsUsingCache(\n entities: (EncryptedEntityStub | EncryptedEntity)[],\n dataOwnersHierarchySubset: string[],\n metadataType: SecurityMetadataType\n ): Promise<{ [entityId: string]: string[] }> {\n const toSearchById: Set<string> = new Set([])\n const toSearchByDelegationKey: Set<string> = new Set([])\n for (const e of entities) {\n for (const [delegationKey, delegation] of Object.entries(e.securityMetadata?.secureDelegations ?? {})) {\n if (\n !delegation.delegator ||\n !delegation.delegate ||\n dataOwnersHierarchySubset.some((it) => it == delegation.delegator || it == delegation.delegate)\n ) {\n if (delegation.exchangeDataId) {\n toSearchById.add(delegation.exchangeDataId)\n } else {\n toSearchByDelegationKey.add(delegationKey)\n }\n }\n }\n }\n const cachedByExchangeDataId = await this.exchangeData.getDecryptionDataKeyByIds([...toSearchById], false)\n const cachedByDelegationKey = await this.exchangeData.getCachedDecryptionDataKeyByAccessControlHash([...toSearchByDelegationKey])\n const res: { [entityId: string]: string[] } = {}\n for (const entity of entities) {\n const currEntityRes: Set<string> = new Set([])\n for (const [delegationKey, delegation] of Object.entries(entity.securityMetadata?.secureDelegations ?? {})) {\n const cached = delegation.exchangeDataId ? cachedByExchangeDataId[delegation.exchangeDataId] : cachedByDelegationKey[delegationKey]\n if (\n cached?.exchangeKey &&\n dataOwnersHierarchySubset.some((it) => it == cached?.exchangeData?.delegator || it == cached?.exchangeData?.delegate)\n ) {\n ;(await this.decryptSecureDelegationMetadata(delegation, metadataType, cached.exchangeKey)).forEach((decrypted) =>\n currEntityRes.add(decrypted)\n )\n }\n }\n res[entity.id!] = [...currEntityRes]\n }\n return res\n }\n\n hasSecurityMetadataOfType(delegation: SecureDelegation, metadataType: SecurityMetadataType): boolean {\n switch (metadataType) {\n case SecurityMetadataType.SecretId:\n return (delegation.secretIds ?? []).length > 0\n case SecurityMetadataType.EncryptionKey:\n return (delegation.encryptionKeys ?? []).length > 0\n case SecurityMetadataType.OwningEntityId:\n return (delegation.owningEntityIds ?? []).length > 0\n default:\n throw new Error('Internal error: invalid metadata type')\n }\n }\n\n async decryptSecureDelegationsUsingKnownExchangeData(\n entities: (EncryptedEntityStub | EncryptedEntity)[],\n dataOwnersHierarchySubset: string[],\n metadataType: SecurityMetadataType\n ): Promise<{ [entityId: string]: string[] }> {\n const toSearchById: Set<string> = new Set([])\n for (const e of entities) {\n for (const delegation of Object.values(e.securityMetadata?.secureDelegations ?? {})) {\n if (dataOwnersHierarchySubset.some((it) => it == delegation.delegator || it == delegation.delegate)) {\n if (delegation.exchangeDataId && this.hasSecurityMetadataOfType(delegation, metadataType)) {\n toSearchById.add(delegation.exchangeDataId)\n }\n }\n }\n }\n const retrievedByExchangeDataId = toSearchById.size > 0 ? await this.exchangeData.getDecryptionDataKeyByIds([...toSearchById], true) : {}\n const res: { [entityId: string]: string[] } = {}\n for (const entity of entities) {\n const currEntityRes: Set<string> = new Set([])\n for (const delegation of Object.values(entity.securityMetadata?.secureDelegations ?? {})) {\n const currDelegationExchangeData = delegation.exchangeDataId ? retrievedByExchangeDataId[delegation.exchangeDataId] : undefined\n if (currDelegationExchangeData?.exchangeKey) {\n ;(await this.decryptSecureDelegationMetadata(delegation, metadataType, currDelegationExchangeData.exchangeKey)).forEach((decrypted) =>\n currEntityRes.add(decrypted)\n )\n }\n }\n res[entity.id!] = [...currEntityRes]\n }\n return res\n }\n\n async decryptSecureDelegationsUsingExchangeDataMap(\n entities: (EncryptedEntityStub | EncryptedEntity)[],\n dataOwnersHierarchySubset: string[],\n metadataType: SecurityMetadataType\n ): Promise<{ [entityId: string]: string[] }> {\n const toSearchByExchangeDataMap: Set<string> = new Set([])\n for (const e of entities) {\n for (const [delegationKey, delegation] of Object.entries(e.securityMetadata?.secureDelegations ?? {})) {\n if (dataOwnersHierarchySubset.some((it) => it == delegation.delegator || it == delegation.delegate)) {\n if (!delegation.exchangeDataId && this.hasSecurityMetadataOfType(delegation, metadataType)) {\n toSearchByExchangeDataMap.add(delegationKey)\n }\n }\n }\n }\n const exchangeDataMaps =\n toSearchByExchangeDataMap.size > 0 ? await this.exchangeDataMap.getExchangeDataMapBatch([...toSearchByExchangeDataMap]) : []\n const exchangeDataIdByDelegationKey: { [delegationKey: string]: string } = {}\n for (const exchangeDataMap of exchangeDataMaps) {\n const decrypted = await this.secureDelegationsEncryption.decryptExchangeDataId(exchangeDataMap.encryptedExchangeDataIds)\n if (decrypted) {\n exchangeDataIdByDelegationKey[exchangeDataMap.id] = decrypted\n }\n }\n if (Object.keys(exchangeDataIdByDelegationKey).length == 0) return {}\n const retrievedByExchangeDataId =\n Object.values(exchangeDataIdByDelegationKey).length > 0\n ? await this.exchangeData.getDecryptionDataKeyByIds([...new Set(Object.values(exchangeDataIdByDelegationKey))], true)\n : {}\n const res: { [entityId: string]: string[] } = {}\n for (const entity of entities) {\n const currEntityRes: Set<string> = new Set([])\n for (const [delegationKey, delegation] of Object.entries(entity.securityMetadata?.secureDelegations ?? {})) {\n const exchangeDataId = exchangeDataIdByDelegationKey[delegationKey]\n const cached = exchangeDataId ? retrievedByExchangeDataId[exchangeDataId] : undefined\n if (cached?.exchangeKey) {\n ;(await this.decryptSecureDelegationMetadata(delegation, metadataType, cached.exchangeKey)).forEach((decrypted) =>\n currEntityRes.add(decrypted)\n )\n }\n }\n res[entity.id!] = [...currEntityRes]\n }\n return res\n }\n\n async decryptAll(\n entity: EncryptedEntityStub | EncryptedEntity,\n dataOwnersHierarchySubset: string[],\n metadataType: SecurityMetadataType\n ): Promise<{ ownerId: string; extracted: string[] }[]> {\n const allExtractedWithDataOwners = [\n ...(await this.decryptAllLegacyDelegations(entity, dataOwnersHierarchySubset, metadataType)),\n ...(await this.decryptAllSecureDelegations(entity, dataOwnersHierarchySubset, metadataType)),\n ]\n return dataOwnersHierarchySubset.map((dataOwner) => {\n const decryptedEntriesForDataOwner = allExtractedWithDataOwners\n .filter((x) => x.dataOwnersWithAccess.some((d) => dataOwner == d))\n .map((x) => x.decrypted)\n return {\n ownerId: dataOwner,\n extracted: [...new Set(decryptedEntriesForDataOwner)],\n }\n })\n }\n\n async decryptAllLegacyDelegations(\n entity: EncryptedEntityStub | EncryptedEntity,\n dataOwnersHierarchySubset: string[],\n metadataType: SecurityMetadataType\n ): Promise<{ decrypted: string; dataOwnersWithAccess: string[] }[]> {\n return this.extractFromLegacyDelegations(entity, dataOwnersHierarchySubset, metadataType)\n }\n\n /**\n * For every value (secret id / encryption key / owning entity id, depending on metadataType) decryptable by the\n * given hierarchy, returns which data owners have DIRECT access to it: i.e. are explicitly named as either party\n * (delegator/delegate, owner/delegatedTo) of the specific delegation edge that carries that value - never a data\n * owner merely reachable by inference through a parent/child hierarchy relationship. Both parties of an edge get\n * equal credit for its content because they have equal decrypt access to it by construction (the edge's exchange\n * key can be unwrapped by either party's private key).\n *\n * Used to check whether sharing a value with a delegate would be redundant because some other, already-decryptable\n * delegation on the entity already grants that delegate the exact same value directly.\n */\n async directlyAccessibleValuesByDataOwner(\n entity: EncryptedEntityStub | EncryptedEntity,\n dataOwnersHierarchySubset: string[],\n metadataType: SecurityMetadataType\n ): Promise<{ [dataOwnerId: string]: Set<string> }> {\n const edges = [\n ...(await this.decryptAllLegacyDelegations(entity, dataOwnersHierarchySubset, metadataType)),\n ...(await this.decryptAllSecureDelegations(entity, dataOwnersHierarchySubset, metadataType)),\n ]\n const result: { [dataOwnerId: string]: Set<string> } = {}\n for (const edge of edges) {\n for (const partyId of edge.dataOwnersWithAccess) {\n ;(result[partyId] ??= new Set()).add(edge.decrypted)\n }\n }\n return result\n }\n\n async decryptAllSecureDelegations(\n entity: EncryptedEntityStub | EncryptedEntity,\n dataOwnersHierarchySubset: string[],\n metadataType: SecurityMetadataType\n ): Promise<{ decrypted: string; dataOwnersWithAccess: string[] }[]> {\n const secureDelegationEntries: [string, SecureDelegation][] = Object.entries(entity.securityMetadata?.secureDelegations ?? {})\n const toSearchByDelegationKey: string[] = secureDelegationEntries.flatMap(([delegationKey, delegation]): string[] => {\n if (!delegation.exchangeDataId) {\n return [delegationKey]\n } else {\n return []\n }\n })\n const exchangeDataByDelegationKey = await this.exchangeData.getCachedDecryptionDataKeyByAccessControlHash(toSearchByDelegationKey)\n const toSearchWithExchangeDataMap = secureDelegationEntries.flatMap(([delegationKey, delegation]): string[] => {\n if (\n !delegation.exchangeDataId &&\n dataOwnersHierarchySubset.some((it) => delegation.delegate == it || delegation.delegator == it) &&\n !exchangeDataByDelegationKey[delegationKey] &&\n this.hasSecurityMetadataOfType(delegation, metadataType)\n ) {\n return [delegationKey]\n } else {\n return []\n }\n })\n const exchangeDataMaps =\n toSearchWithExchangeDataMap.length > 0 ? await this.exchangeDataMap.getExchangeDataMapBatch(toSearchWithExchangeDataMap) : []\n const exchangeDataIdByDelegationKey: { [delegationKey: string]: string } = {}\n for (const exchangeDataMap of exchangeDataMaps) {\n const decrypted = await this.secureDelegationsEncryption.decryptExchangeDataId(exchangeDataMap.encryptedExchangeDataIds)\n if (decrypted) {\n exchangeDataIdByDelegationKey[exchangeDataMap.id] = decrypted\n }\n }\n const toSearchDirectlyById = secureDelegationEntries.flatMap(([delegationKey, delegation]): string[] => {\n if (\n delegation.exchangeDataId &&\n dataOwnersHierarchySubset.some((it) => delegation.delegate == it || delegation.delegator == it) &&\n !exchangeDataByDelegationKey[delegationKey] &&\n this.hasSecurityMetadataOfType(delegation, metadataType)\n ) {\n return [delegation.exchangeDataId]\n } else {\n return []\n }\n })\n const allExchangeDataIdToRetrieve = [...new Set([...toSearchDirectlyById, ...Object.values(exchangeDataIdByDelegationKey)])]\n const exchangeDataById =\n allExchangeDataIdToRetrieve.length > 0 ? await this.exchangeData.getDecryptionDataKeyByIds(allExchangeDataIdToRetrieve, true) : {}\n const allExtractedWithDataOwners: { decrypted: string; dataOwnersWithAccess: string[] }[] = []\n for (const [delegationKey, delegation] of secureDelegationEntries) {\n let exchangeData:\n | {\n exchangeKey: CryptoKey | undefined\n accessControlSecret: string | undefined\n exchangeData: ExchangeData\n }\n | undefined = undefined\n if (exchangeDataByDelegationKey[delegationKey]) {\n exchangeData = exchangeDataByDelegationKey[delegationKey]\n } else if (delegation.exchangeDataId) {\n exchangeData = exchangeDataById[delegation.exchangeDataId]\n } else if (exchangeDataIdByDelegationKey[delegationKey]) {\n exchangeData = exchangeDataById[exchangeDataIdByDelegationKey[delegationKey]]\n }\n if (exchangeData && exchangeData.exchangeKey) {\n const decrypted = await this.decryptSecureDelegationMetadata(delegation, metadataType, exchangeData.exchangeKey)\n for (const d of decrypted) {\n allExtractedWithDataOwners.push({\n decrypted: d,\n dataOwnersWithAccess: [exchangeData.exchangeData.delegator, exchangeData.exchangeData.delegate],\n })\n }\n }\n }\n return allExtractedWithDataOwners\n }\n\n async getDelegationMemberDetails(typedEntity: EncryptedEntityWithType): Promise<{\n [delegationKey: string]: DelegationMembersDetails\n }> {\n const res: { [delegationKey: string]: DelegationMembersDetails } = {}\n // 1. Add all explicit data owners, keep only delegations with at least an anonymous data owner to check later\n let remainingDelegations = Object.entries(typedEntity.entity.securityMetadata?.secureDelegations ?? {})\n let updatedRemainingDelegations: [string, SecureDelegation][] = []\n for (const delegationEntry of remainingDelegations) {\n const delegation = delegationEntry[1]\n if (delegation.delegator && delegation.delegate) {\n res[delegationEntry[0]] = {\n delegate: delegation.delegate,\n delegator: delegation.delegator,\n fullyExplicit: true,\n accessLevel: delegation.permissions,\n accessControlSecret: undefined,\n }\n } else {\n updatedRemainingDelegations.push(delegationEntry)\n }\n }\n remainingDelegations = updatedRemainingDelegations\n if (!remainingDelegations.length) return res\n updatedRemainingDelegations = []\n // 2. Attempt to identify the anonymous data owner of remaining delegations by checking if we have the exchange data cached by hash\n // Note: we can find exchange data by hash only if we could successfully decrypt it\n const cachedExchangeData = await this.exchangeData.getCachedDecryptionDataKeyByAccessControlHash(remainingDelegations.map((d) => d[0]))\n for (const delegationEntry of remainingDelegations) {\n const exchangeDataOfDelegation = cachedExchangeData[delegationEntry[0]]\n if (exchangeDataOfDelegation) {\n res[delegationEntry[0]] = {\n delegate: exchangeDataOfDelegation.exchangeData.delegate,\n delegator: exchangeDataOfDelegation.exchangeData.delegator,\n fullyExplicit: false,\n accessLevel: delegationEntry[1].permissions,\n accessControlSecret: exchangeDataOfDelegation.accessControlSecret,\n }\n } else {\n updatedRemainingDelegations.push(delegationEntry)\n }\n }\n remainingDelegations = updatedRemainingDelegations\n if (!remainingDelegations.length) return res\n updatedRemainingDelegations = []\n // 3. Attempt to identify the anonymous data owner of remaining delegations between us (or one of our parents) and an anonymous data owner\n const hierarchy = await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds()\n const remainingExchangeDataMaps = await this.exchangeDataMap.getExchangeDataMapBatch(\n remainingDelegations\n .filter(([_, delegation]) => hierarchy.some((x) => x == delegation.delegator || x == delegation.delegate))\n .map(([hash, _]) => hash)\n )\n const exchangeDataIdByDelegationKey: { [delegationKey: string]: string } = {}\n for (const exchangeDataMap of remainingExchangeDataMaps) {\n if (!!exchangeDataMap.encryptedExchangeDataIds) {\n const decrypted = await this.secureDelegationsEncryption.decryptExchangeDataId(exchangeDataMap.encryptedExchangeDataIds)\n if (decrypted) {\n exchangeDataIdByDelegationKey[exchangeDataMap.id] = decrypted\n }\n }\n }\n const exchangeDataByIds = await this.exchangeData.getDecryptionDataKeyByIds(Object.values(exchangeDataIdByDelegationKey), true)\n for (const [hash, delegation] of remainingDelegations) {\n if (hierarchy.some((x) => x === delegation.delegate || x === delegation.delegator)) {\n const dataId = exchangeDataIdByDelegationKey[hash]\n const exchangeDataInfo = dataId ? exchangeDataByIds[dataId] : undefined\n if (exchangeDataInfo) {\n res[hash] = {\n delegator: exchangeDataInfo.exchangeData.delegator,\n delegate: exchangeDataInfo.exchangeData.delegate,\n fullyExplicit: false,\n accessLevel: delegation.permissions,\n accessControlSecret: exchangeDataInfo.accessControlSecret,\n }\n } else {\n updatedRemainingDelegations.push([hash, delegation])\n }\n } else {\n updatedRemainingDelegations.push([hash, delegation])\n }\n }\n return {\n ...res,\n ...Object.fromEntries(\n updatedRemainingDelegations.map(([hash, secureDelegation]) => [\n hash,\n {\n delegator: secureDelegation.delegator,\n delegate: secureDelegation.delegate,\n fullyExplicit: false,\n accessLevel: secureDelegation.permissions,\n accessControlSecret: undefined,\n },\n ])\n ),\n }\n }\n\n async decryptSecureDelegationMetadata(delegation: SecureDelegation, metadataType: SecurityMetadataType, key: CryptoKey): Promise<string[]> {\n switch (metadataType) {\n case SecurityMetadataType.SecretId:\n return this.secureDelegationsEncryption.decryptSecretIds(delegation, key)\n case SecurityMetadataType.EncryptionKey:\n return this.secureDelegationsEncryption.decryptEncryptionKeys(delegation, key)\n case SecurityMetadataType.OwningEntityId:\n return this.secureDelegationsEncryption.decryptOwningEntityIds(delegation, key)\n default:\n throw new Error(`Internal error: invalid SecurityMetadataType ${metadataType}`)\n }\n }\n\n async getEntityLegacyDelegationAccessLevel(\n entity: EncryptedEntityStub | EncryptedEntity,\n dataOwnersHierarchySubset: string[]\n ): Promise<AccessLevelEnum | undefined> {\n if (!dataOwnersHierarchySubset.length) throw new Error(\"`dataOwnersHierarchySubset` can't be empty\")\n // Legacy delegations provide write access\n if (Object.keys(entity.delegations ?? {}).some((delegate) => dataOwnersHierarchySubset.includes(delegate))) {\n return AccessLevelEnum.WRITE\n }\n return undefined\n }\n\n async getEntitySecureDelegationAccessLevel(\n entity: EncryptedEntityStub | EncryptedEntity,\n dataOwnersHierarchySubset: string[]\n ): Promise<AccessLevelEnum | undefined> {\n if (!dataOwnersHierarchySubset.length) throw new Error(\"`dataOwnersHierarchySubset` can't be empty\")\n // If the data owner is explicit all delegations he can access has his id. If the delegator is anonymous all delegations he can access are\n // accessible by hash. No mixed scenario possible.\n let accessibleDelegations: SecureDelegation[] = Object.values(entity.securityMetadata?.secureDelegations ?? {}).filter((secureDelegation) =>\n dataOwnersHierarchySubset.some((dataOwner) => dataOwner === secureDelegation.delegator || dataOwner === secureDelegation.delegate)\n )\n if (!accessibleDelegations.length) {\n const availableCanonicalHashes = Object.keys(\n await this.exchangeData.getCachedDecryptionDataKeyByAccessControlHash(Object.keys(entity.securityMetadata?.secureDelegations ?? {}))\n )\n accessibleDelegations = availableCanonicalHashes.map((hash) => (entity.securityMetadata?.secureDelegations ?? {})[hash])\n }\n const permissions = accessibleDelegations.map((secureDelegation) => secureDelegation.permissions)\n let maxLevel: AccessLevelEnum | undefined = undefined\n for (const permission of permissions) {\n if (permission === AccessLevelEnum.WRITE) {\n return AccessLevelEnum.WRITE\n }\n if (permission === AccessLevelEnum.READ) {\n maxLevel = AccessLevelEnum.READ\n }\n }\n return maxLevel\n }\n\n async getEntityAccessLevel(\n entity: EncryptedEntityStub | EncryptedEntity,\n dataOwnersHierarchySubset: string[]\n ): Promise<AccessLevelEnum | undefined> {\n const legacyAccess = await this.getEntityLegacyDelegationAccessLevel(entity, dataOwnersHierarchySubset)\n if (legacyAccess != undefined) return legacyAccess\n return this.getEntitySecureDelegationAccessLevel(entity, dataOwnersHierarchySubset)\n }\n\n hasAnyEncryptionKeys(entity: EncryptedEntityStub | EncryptedEntity): boolean {\n return Object.keys(entity.encryptionKeys ?? {}).length > 0 || Object.keys(entity.securityMetadata?.secureDelegations ?? {}).length > 0\n }\n}\n"]}
|
|
@@ -497,7 +497,10 @@ export declare class IccPatientXApi extends IccPatientApi implements EncryptedEn
|
|
|
497
497
|
*/
|
|
498
498
|
getEncryptionKeysOf(entity: models.Patient): Promise<string[]>;
|
|
499
499
|
/**
|
|
500
|
-
* Merge two patients into one.
|
|
500
|
+
* Merge two patients into one.
|
|
501
|
+
* Both the from and mergedInto patient must be decrypted patients, otherwise the method may have unexpected behavior.
|
|
502
|
+
*
|
|
503
|
+
* This method performs the following operations:
|
|
501
504
|
* - The `from` patient will be soft-deleted, and it will point to the `into` patient. Only the `deletionDate` and `mergeToPatientId` fields of the
|
|
502
505
|
* patient will be changed (automatically by this method). Note that the value of {@link from} is only used to verify that the client is aware of
|
|
503
506
|
* the last version of the `from` patient: any changes to its content and/or metadata compared to what is actually stored in the database will be
|
|
@@ -1017,7 +1017,10 @@ class IccPatientXApi extends icc_api_1.IccPatientApi {
|
|
|
1017
1017
|
return this.crypto.xapi.encryptionKeysOf({ entity, type: EntityWithDelegationTypeName_1.EntityWithDelegationTypeName.Patient }, undefined);
|
|
1018
1018
|
}
|
|
1019
1019
|
/**
|
|
1020
|
-
* Merge two patients into one.
|
|
1020
|
+
* Merge two patients into one.
|
|
1021
|
+
* Both the from and mergedInto patient must be decrypted patients, otherwise the method may have unexpected behavior.
|
|
1022
|
+
*
|
|
1023
|
+
* This method performs the following operations:
|
|
1021
1024
|
* - The `from` patient will be soft-deleted, and it will point to the `into` patient. Only the `deletionDate` and `mergeToPatientId` fields of the
|
|
1022
1025
|
* patient will be changed (automatically by this method). Note that the value of {@link from} is only used to verify that the client is aware of
|
|
1023
1026
|
* the last version of the `from` patient: any changes to its content and/or metadata compared to what is actually stored in the database will be
|
|
@@ -1059,7 +1062,7 @@ class IccPatientXApi extends icc_api_1.IccPatientApi {
|
|
|
1059
1062
|
});
|
|
1060
1063
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1061
1064
|
const encryptedMerged = (yield this.encryptAs(yield this.dataOwnerApi.getCurrentDataOwnerId(), [mergedInto]))[0];
|
|
1062
|
-
const merged = yield _super.baseMergePatients.call(this, from.id, from.rev, encryptedMerged);
|
|
1065
|
+
const merged = yield _super.baseMergePatients.call(this, from.id, from.rev, encryptedMerged, true);
|
|
1063
1066
|
return (yield this.tryDecryptOrReturnOriginal([merged]))[0].entity;
|
|
1064
1067
|
});
|
|
1065
1068
|
}
|