@wallfree-dev/angular-core 0.0.59-beta.1
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/README.md +60 -0
- package/esm2022/lib/airgap-angular-core.module.mjs +63 -0
- package/esm2022/lib/base/base.component.mjs +38 -0
- package/esm2022/lib/base/base.facade.mjs +37 -0
- package/esm2022/lib/capacitor-plugins/definitions.mjs +15 -0
- package/esm2022/lib/capacitor-plugins/injection-tokens.mjs +11 -0
- package/esm2022/lib/capacitor-plugins/isolated-modules/isolated-modules.plugin-wrapper.mjs +67 -0
- package/esm2022/lib/capacitor-plugins/isolated-modules/isolated-modules.plugin.mjs +247 -0
- package/esm2022/lib/components/account-item/account-item.component.mjs +30 -0
- package/esm2022/lib/components/account-selection/account-selection.component.mjs +61 -0
- package/esm2022/lib/components/components.module.mjs +97 -0
- package/esm2022/lib/components/currency-symbol/currency-symbol.component.mjs +45 -0
- package/esm2022/lib/components/currency-symbol/currency-symbol.facade.mjs +8 -0
- package/esm2022/lib/components/currency-symbol/currency-symbol.types.mjs +2 -0
- package/esm2022/lib/components/from-to/from-to.component.mjs +100 -0
- package/esm2022/lib/components/iac-qr/iac-qr.component.mjs +192 -0
- package/esm2022/lib/components/identicon/identicon.component.mjs +51 -0
- package/esm2022/lib/components/isolated-modules-badges/isolated-modules-badges.component.mjs +16 -0
- package/esm2022/lib/components/isolated-modules-details/isolated-modules-details.component.mjs +43 -0
- package/esm2022/lib/components/isolated-modules-details/isolated-modules-details.facade.mjs +7 -0
- package/esm2022/lib/components/isolated-modules-list/isolated-modules-list.component.mjs +50 -0
- package/esm2022/lib/components/isolated-modules-list/isolated-modules-list.facade.mjs +7 -0
- package/esm2022/lib/components/isolated-modules-onboarding/isolated-modules-onboarding.component.mjs +12 -0
- package/esm2022/lib/components/network-badge/network-badge.component.mjs +19 -0
- package/esm2022/lib/components/qr/qr.component.mjs +36 -0
- package/esm2022/lib/components/qr-settings/qr-settings.component.mjs +30 -0
- package/esm2022/lib/components/titled-address/titled-address.component.mjs +31 -0
- package/esm2022/lib/components/titled-text/titled-text.component.mjs +28 -0
- package/esm2022/lib/config/app-config.mjs +3 -0
- package/esm2022/lib/pages/isolated-modules-list/isolated-modules-list.facade.mjs +7 -0
- package/esm2022/lib/pipes/amount-converter/amount-converter.pipe.mjs +82 -0
- package/esm2022/lib/pipes/fee-converter/fee-converter.pipe.mjs +36 -0
- package/esm2022/lib/pipes/pipes.module.mjs +19 -0
- package/esm2022/lib/pipes/wallet-filter/wallet-filter.pipe.mjs +36 -0
- package/esm2022/lib/protocol/adapter/protocol-v0-adapter.mjs +880 -0
- package/esm2022/lib/protocol/isolated/base-isolated.mjs +27 -0
- package/esm2022/lib/protocol/isolated/block-explorer-isolated.mjs +32 -0
- package/esm2022/lib/protocol/isolated/protocol-offline-isolated.mjs +37 -0
- package/esm2022/lib/protocol/isolated/protocol-online-isolated.mjs +52 -0
- package/esm2022/lib/protocol/isolated/v3-serializer-companion-isolated.mjs +35 -0
- package/esm2022/lib/services/address/address.service.mjs +78 -0
- package/esm2022/lib/services/clipboard/clipboard.service.mjs +48 -0
- package/esm2022/lib/services/deeplink/deeplink.service.mjs +73 -0
- package/esm2022/lib/services/environment/base-environment.service.mjs +6 -0
- package/esm2022/lib/services/filesystem/filesystem.service.mjs +291 -0
- package/esm2022/lib/services/iac/base.iac.service.mjs +155 -0
- package/esm2022/lib/services/iac/message-handler-single.mjs +48 -0
- package/esm2022/lib/services/iac/message-handler.mjs +22 -0
- package/esm2022/lib/services/iac/qr-generator.mjs +17 -0
- package/esm2022/lib/services/image/fetcher/image-direct.fetcher.mjs +16 -0
- package/esm2022/lib/services/image/fetcher/image-proxy.fetcher.mjs +45 -0
- package/esm2022/lib/services/image/image.service.mjs +39 -0
- package/esm2022/lib/services/key-pair/key-pair.service.mjs +57 -0
- package/esm2022/lib/services/language/language.service.mjs +47 -0
- package/esm2022/lib/services/modules/base-modules.service.mjs +157 -0
- package/esm2022/lib/services/modules/controller/base-modules.controller.mjs +2 -0
- package/esm2022/lib/services/modules/controller/integral/integral-modules.controller.mjs +91 -0
- package/esm2022/lib/services/modules/controller/isolated/isolated-modules.controller.mjs +190 -0
- package/esm2022/lib/services/modules/controller/modules.controller.mjs +85 -0
- package/esm2022/lib/services/permissions/permissions.service.mjs +140 -0
- package/esm2022/lib/services/protocol/defaults.mjs +55 -0
- package/esm2022/lib/services/protocol/protocol.service.mjs +230 -0
- package/esm2022/lib/services/protocol/store/base-protocol-store.service.mjs +63 -0
- package/esm2022/lib/services/protocol/store/main/main-protocol-store.service.mjs +91 -0
- package/esm2022/lib/services/protocol/store/sub/sub-protocol-store.service.mjs +174 -0
- package/esm2022/lib/services/qr/qr-generators/bc-ur-generator.mjs +127 -0
- package/esm2022/lib/services/qr/qr-generators/metamask-generator.mjs +117 -0
- package/esm2022/lib/services/qr/qr-generators/output-descriptor-generator.mjs +49 -0
- package/esm2022/lib/services/qr/qr-generators/serializer-v2-generator.mjs +30 -0
- package/esm2022/lib/services/qr/qr-generators/serializer-v3-generator.mjs +45 -0
- package/esm2022/lib/services/qr/qr-generators/xpub-generator.mjs +38 -0
- package/esm2022/lib/services/qr/qr-handler/serializer-v2-handler.mjs +114 -0
- package/esm2022/lib/services/qr/qr-handler/serializer-v3-handler.mjs +274 -0
- package/esm2022/lib/services/qr-scanner/qr-scanner.service.mjs +61 -0
- package/esm2022/lib/services/serializer/serializer.service.mjs +181 -0
- package/esm2022/lib/services/storage/base.storage.mjs +30 -0
- package/esm2022/lib/services/storage/storage.service.mjs +33 -0
- package/esm2022/lib/services/token/token.service.mjs +52 -0
- package/esm2022/lib/services/transaction/transaction.service.mjs +67 -0
- package/esm2022/lib/services/ui-event/ui-event.service.mjs +198 -0
- package/esm2022/lib/services/ui-event-elements/ui-event-elements.service.mjs +122 -0
- package/esm2022/lib/services/uri/uri.service.mjs +51 -0
- package/esm2022/lib/translation/AirGapTranslateLoader.mjs +26 -0
- package/esm2022/lib/types/Either.mjs +2 -0
- package/esm2022/lib/types/ExternalAliasResolver.mjs +2 -0
- package/esm2022/lib/types/RuntimeMode.mjs +6 -0
- package/esm2022/lib/types/SupportedLanguage.mjs +2 -0
- package/esm2022/lib/types/Token.mjs +2 -0
- package/esm2022/lib/types/isolated-modules/IsolatedModule.mjs +2 -0
- package/esm2022/lib/types/isolated-modules/IsolatedModuleManifest.mjs +2 -0
- package/esm2022/lib/types/isolated-modules/IsolatedModuleMetadata.mjs +2 -0
- package/esm2022/lib/types/ui/UIAction.mjs +6 -0
- package/esm2022/lib/types/ui/UIResource.mjs +8 -0
- package/esm2022/lib/utils/ExposedPromise.mjs +103 -0
- package/esm2022/lib/utils/airgap-transaction.mjs +23 -0
- package/esm2022/lib/utils/array.mjs +32 -0
- package/esm2022/lib/utils/modules/isolated/isolated-modules-metadata.mjs +10 -0
- package/esm2022/lib/utils/modules/load-protocol.mjs +19 -0
- package/esm2022/lib/utils/not-initialized.mjs +7 -0
- package/esm2022/lib/utils/protocol/delegation.mjs +33 -0
- package/esm2022/lib/utils/protocol/protocol-identifier.mjs +4 -0
- package/esm2022/lib/utils/protocol/protocol-network-identifier.mjs +18 -0
- package/esm2022/lib/utils/protocol/protocol-options.mjs +114 -0
- package/esm2022/lib/utils/protocol/protocol-v0-adapter.mjs +390 -0
- package/esm2022/lib/utils/utils.mjs +80 -0
- package/esm2022/lib/utils/worker.mjs +28 -0
- package/esm2022/public-api.mjs +102 -0
- package/esm2022/wallfree-dev-angular-core.mjs +5 -0
- package/fesm2022/wallfree-dev-angular-core.mjs +6933 -0
- package/fesm2022/wallfree-dev-angular-core.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/airgap-angular-core.module.d.ts +25 -0
- package/lib/airgap-angular-core.module.d.ts.map +1 -0
- package/lib/base/base.component.d.ts +18 -0
- package/lib/base/base.component.d.ts.map +1 -0
- package/lib/base/base.facade.d.ts +16 -0
- package/lib/base/base.facade.d.ts.map +1 -0
- package/lib/capacitor-plugins/definitions.d.ts +122 -0
- package/lib/capacitor-plugins/definitions.d.ts.map +1 -0
- package/lib/capacitor-plugins/injection-tokens.d.ts +18 -0
- package/lib/capacitor-plugins/injection-tokens.d.ts.map +1 -0
- package/lib/capacitor-plugins/isolated-modules/isolated-modules.plugin-wrapper.d.ts +20 -0
- package/lib/capacitor-plugins/isolated-modules/isolated-modules.plugin-wrapper.d.ts.map +1 -0
- package/lib/capacitor-plugins/isolated-modules/isolated-modules.plugin.d.ts +38 -0
- package/lib/capacitor-plugins/isolated-modules/isolated-modules.plugin.d.ts.map +1 -0
- package/lib/components/account-item/account-item.component.d.ts +15 -0
- package/lib/components/account-item/account-item.component.d.ts.map +1 -0
- package/lib/components/account-selection/account-selection.component.d.ts +23 -0
- package/lib/components/account-selection/account-selection.component.d.ts.map +1 -0
- package/lib/components/components.module.d.ts +28 -0
- package/lib/components/components.module.d.ts.map +1 -0
- package/lib/components/currency-symbol/currency-symbol.component.d.ts +20 -0
- package/lib/components/currency-symbol/currency-symbol.component.d.ts.map +1 -0
- package/lib/components/currency-symbol/currency-symbol.facade.d.ts +16 -0
- package/lib/components/currency-symbol/currency-symbol.facade.d.ts.map +1 -0
- package/lib/components/currency-symbol/currency-symbol.types.d.ts +35 -0
- package/lib/components/currency-symbol/currency-symbol.types.d.ts.map +1 -0
- package/lib/components/from-to/from-to.component.d.ts +33 -0
- package/lib/components/from-to/from-to.component.d.ts.map +1 -0
- package/lib/components/iac-qr/iac-qr.component.d.ts +45 -0
- package/lib/components/iac-qr/iac-qr.component.d.ts.map +1 -0
- package/lib/components/identicon/identicon.component.d.ts +14 -0
- package/lib/components/identicon/identicon.component.d.ts.map +1 -0
- package/lib/components/isolated-modules-badges/isolated-modules-badges.component.d.ts +8 -0
- package/lib/components/isolated-modules-badges/isolated-modules-badges.component.d.ts.map +1 -0
- package/lib/components/isolated-modules-details/isolated-modules-details.component.d.ts +17 -0
- package/lib/components/isolated-modules-details/isolated-modules-details.component.d.ts.map +1 -0
- package/lib/components/isolated-modules-details/isolated-modules-details.facade.d.ts +17 -0
- package/lib/components/isolated-modules-details/isolated-modules-details.facade.d.ts.map +1 -0
- package/lib/components/isolated-modules-list/isolated-modules-list.component.d.ts +20 -0
- package/lib/components/isolated-modules-list/isolated-modules-list.component.d.ts.map +1 -0
- package/lib/components/isolated-modules-list/isolated-modules-list.facade.d.ts +15 -0
- package/lib/components/isolated-modules-list/isolated-modules-list.facade.d.ts.map +1 -0
- package/lib/components/isolated-modules-onboarding/isolated-modules-onboarding.component.d.ts +6 -0
- package/lib/components/isolated-modules-onboarding/isolated-modules-onboarding.component.d.ts.map +1 -0
- package/lib/components/network-badge/network-badge.component.d.ts +9 -0
- package/lib/components/network-badge/network-badge.component.d.ts.map +1 -0
- package/lib/components/qr/qr.component.d.ts +16 -0
- package/lib/components/qr/qr.component.d.ts.map +1 -0
- package/lib/components/qr-settings/qr-settings.component.d.ts +12 -0
- package/lib/components/qr-settings/qr-settings.component.d.ts.map +1 -0
- package/lib/components/titled-address/titled-address.component.d.ts +13 -0
- package/lib/components/titled-address/titled-address.component.d.ts.map +1 -0
- package/lib/components/titled-text/titled-text.component.d.ts +11 -0
- package/lib/components/titled-text/titled-text.component.d.ts.map +1 -0
- package/lib/config/app-config.d.ts +15 -0
- package/lib/config/app-config.d.ts.map +1 -0
- package/lib/pages/isolated-modules-list/isolated-modules-list.facade.d.ts +16 -0
- package/lib/pages/isolated-modules-list/isolated-modules-list.facade.d.ts.map +1 -0
- package/lib/pipes/amount-converter/amount-converter.pipe.d.ts +29 -0
- package/lib/pipes/amount-converter/amount-converter.pipe.d.ts.map +1 -0
- package/lib/pipes/fee-converter/fee-converter.pipe.d.ts +20 -0
- package/lib/pipes/fee-converter/fee-converter.pipe.d.ts.map +1 -0
- package/lib/pipes/pipes.module.d.ts +10 -0
- package/lib/pipes/pipes.module.d.ts.map +1 -0
- package/lib/pipes/wallet-filter/wallet-filter.pipe.d.ts +15 -0
- package/lib/pipes/wallet-filter/wallet-filter.pipe.d.ts.map +1 -0
- package/lib/protocol/adapter/protocol-v0-adapter.d.ts +231 -0
- package/lib/protocol/adapter/protocol-v0-adapter.d.ts.map +1 -0
- package/lib/protocol/isolated/base-isolated.d.ts +11 -0
- package/lib/protocol/isolated/base-isolated.d.ts.map +1 -0
- package/lib/protocol/isolated/block-explorer-isolated.d.ts +14 -0
- package/lib/protocol/isolated/block-explorer-isolated.d.ts.map +1 -0
- package/lib/protocol/isolated/protocol-offline-isolated.d.ts +17 -0
- package/lib/protocol/isolated/protocol-offline-isolated.d.ts.map +1 -0
- package/lib/protocol/isolated/protocol-online-isolated.d.ts +21 -0
- package/lib/protocol/isolated/protocol-online-isolated.d.ts.map +1 -0
- package/lib/protocol/isolated/v3-serializer-companion-isolated.d.ts +17 -0
- package/lib/protocol/isolated/v3-serializer-companion-isolated.d.ts.map +1 -0
- package/lib/services/address/address.service.d.ts +26 -0
- package/lib/services/address/address.service.d.ts.map +1 -0
- package/lib/services/clipboard/clipboard.service.d.ts +14 -0
- package/lib/services/clipboard/clipboard.service.d.ts.map +1 -0
- package/lib/services/deeplink/deeplink.service.d.ts +18 -0
- package/lib/services/deeplink/deeplink.service.d.ts.map +1 -0
- package/lib/services/environment/base-environment.service.d.ts +6 -0
- package/lib/services/environment/base-environment.service.d.ts.map +1 -0
- package/lib/services/filesystem/filesystem.service.d.ts +42 -0
- package/lib/services/filesystem/filesystem.service.d.ts.map +1 -0
- package/lib/services/iac/base.iac.service.d.ts +41 -0
- package/lib/services/iac/base.iac.service.d.ts.map +1 -0
- package/lib/services/iac/message-handler-single.d.ts +20 -0
- package/lib/services/iac/message-handler-single.d.ts.map +1 -0
- package/lib/services/iac/message-handler.d.ts +34 -0
- package/lib/services/iac/message-handler.d.ts.map +1 -0
- package/lib/services/iac/qr-generator.d.ts +13 -0
- package/lib/services/iac/qr-generator.d.ts.map +1 -0
- package/lib/services/image/fetcher/image-direct.fetcher.d.ts +9 -0
- package/lib/services/image/fetcher/image-direct.fetcher.d.ts.map +1 -0
- package/lib/services/image/fetcher/image-proxy.fetcher.d.ts +9 -0
- package/lib/services/image/fetcher/image-proxy.fetcher.d.ts.map +1 -0
- package/lib/services/image/image.service.d.ts +20 -0
- package/lib/services/image/image.service.d.ts.map +1 -0
- package/lib/services/key-pair/key-pair.service.d.ts +14 -0
- package/lib/services/key-pair/key-pair.service.d.ts.map +1 -0
- package/lib/services/language/language.service.d.ts +21 -0
- package/lib/services/language/language.service.d.ts.map +1 -0
- package/lib/services/modules/base-modules.service.d.ts +34 -0
- package/lib/services/modules/base-modules.service.d.ts.map +1 -0
- package/lib/services/modules/controller/base-modules.controller.d.ts +19 -0
- package/lib/services/modules/controller/base-modules.controller.d.ts.map +1 -0
- package/lib/services/modules/controller/integral/integral-modules.controller.d.ts +22 -0
- package/lib/services/modules/controller/integral/integral-modules.controller.d.ts.map +1 -0
- package/lib/services/modules/controller/isolated/isolated-modules.controller.d.ts +32 -0
- package/lib/services/modules/controller/isolated/isolated-modules.controller.d.ts.map +1 -0
- package/lib/services/modules/controller/modules.controller.d.ts +27 -0
- package/lib/services/modules/controller/modules.controller.d.ts.map +1 -0
- package/lib/services/permissions/permissions.service.d.ts +39 -0
- package/lib/services/permissions/permissions.service.d.ts.map +1 -0
- package/lib/services/protocol/defaults.d.ts +6 -0
- package/lib/services/protocol/defaults.d.ts.map +1 -0
- package/lib/services/protocol/protocol.service.d.ts +47 -0
- package/lib/services/protocol/protocol.service.d.ts.map +1 -0
- package/lib/services/protocol/store/base-protocol-store.service.d.ts +36 -0
- package/lib/services/protocol/store/base-protocol-store.service.d.ts.map +1 -0
- package/lib/services/protocol/store/main/main-protocol-store.service.d.ts +21 -0
- package/lib/services/protocol/store/main/main-protocol-store.service.d.ts.map +1 -0
- package/lib/services/protocol/store/sub/sub-protocol-store.service.d.ts +31 -0
- package/lib/services/protocol/store/sub/sub-protocol-store.service.d.ts.map +1 -0
- package/lib/services/qr/qr-generators/bc-ur-generator.d.ts +16 -0
- package/lib/services/qr/qr-generators/bc-ur-generator.d.ts.map +1 -0
- package/lib/services/qr/qr-generators/metamask-generator.d.ts +16 -0
- package/lib/services/qr/qr-generators/metamask-generator.d.ts.map +1 -0
- package/lib/services/qr/qr-generators/output-descriptor-generator.d.ts +13 -0
- package/lib/services/qr/qr-generators/output-descriptor-generator.d.ts.map +1 -0
- package/lib/services/qr/qr-generators/serializer-v2-generator.d.ts +13 -0
- package/lib/services/qr/qr-generators/serializer-v2-generator.d.ts.map +1 -0
- package/lib/services/qr/qr-generators/serializer-v3-generator.d.ts +12 -0
- package/lib/services/qr/qr-generators/serializer-v3-generator.d.ts.map +1 -0
- package/lib/services/qr/qr-generators/xpub-generator.d.ts +12 -0
- package/lib/services/qr/qr-generators/xpub-generator.d.ts.map +1 -0
- package/lib/services/qr/qr-handler/serializer-v2-handler.d.ts +20 -0
- package/lib/services/qr/qr-handler/serializer-v2-handler.d.ts.map +1 -0
- package/lib/services/qr/qr-handler/serializer-v3-handler.d.ts +23 -0
- package/lib/services/qr/qr-handler/serializer-v3-handler.d.ts.map +1 -0
- package/lib/services/qr-scanner/qr-scanner.service.d.ts +23 -0
- package/lib/services/qr-scanner/qr-scanner.service.d.ts.map +1 -0
- package/lib/services/serializer/serializer.service.d.ts +34 -0
- package/lib/services/serializer/serializer.service.d.ts.map +1 -0
- package/lib/services/storage/base.storage.d.ts +15 -0
- package/lib/services/storage/base.storage.d.ts.map +1 -0
- package/lib/services/storage/storage.service.d.ts +28 -0
- package/lib/services/storage/storage.service.d.ts.map +1 -0
- package/lib/services/token/token.service.d.ts +11 -0
- package/lib/services/token/token.service.d.ts.map +1 -0
- package/lib/services/transaction/transaction.service.d.ts +21 -0
- package/lib/services/transaction/transaction.service.d.ts.map +1 -0
- package/lib/services/ui-event/ui-event.service.d.ts +58 -0
- package/lib/services/ui-event/ui-event.service.d.ts.map +1 -0
- package/lib/services/ui-event-elements/ui-event-elements.service.d.ts +16 -0
- package/lib/services/ui-event-elements/ui-event-elements.service.d.ts.map +1 -0
- package/lib/services/uri/uri.service.d.ts +15 -0
- package/lib/services/uri/uri.service.d.ts.map +1 -0
- package/lib/translation/AirGapTranslateLoader.d.ts +15 -0
- package/lib/translation/AirGapTranslateLoader.d.ts.map +1 -0
- package/lib/types/Either.d.ts +2 -0
- package/lib/types/Either.d.ts.map +1 -0
- package/lib/types/ExternalAliasResolver.d.ts +6 -0
- package/lib/types/ExternalAliasResolver.d.ts.map +1 -0
- package/lib/types/RuntimeMode.d.ts +5 -0
- package/lib/types/RuntimeMode.d.ts.map +1 -0
- package/lib/types/SupportedLanguage.d.ts +2 -0
- package/lib/types/SupportedLanguage.d.ts.map +1 -0
- package/lib/types/Token.d.ts +9 -0
- package/lib/types/Token.d.ts.map +1 -0
- package/lib/types/isolated-modules/IsolatedModule.d.ts +28 -0
- package/lib/types/isolated-modules/IsolatedModule.d.ts.map +1 -0
- package/lib/types/isolated-modules/IsolatedModuleManifest.d.ts +24 -0
- package/lib/types/isolated-modules/IsolatedModuleManifest.d.ts.map +1 -0
- package/lib/types/isolated-modules/IsolatedModuleMetadata.d.ts +21 -0
- package/lib/types/isolated-modules/IsolatedModuleMetadata.d.ts.map +1 -0
- package/lib/types/ui/UIAction.d.ts +10 -0
- package/lib/types/ui/UIAction.d.ts.map +1 -0
- package/lib/types/ui/UIResource.d.ts +11 -0
- package/lib/types/ui/UIResource.d.ts.map +1 -0
- package/lib/utils/ExposedPromise.d.ts +40 -0
- package/lib/utils/ExposedPromise.d.ts.map +1 -0
- package/lib/utils/airgap-transaction.d.ts +4 -0
- package/lib/utils/airgap-transaction.d.ts.map +1 -0
- package/lib/utils/array.d.ts +6 -0
- package/lib/utils/array.d.ts.map +1 -0
- package/lib/utils/modules/isolated/isolated-modules-metadata.d.ts +3 -0
- package/lib/utils/modules/isolated/isolated-modules-metadata.d.ts.map +1 -0
- package/lib/utils/modules/load-protocol.d.ts +4 -0
- package/lib/utils/modules/load-protocol.d.ts.map +1 -0
- package/lib/utils/not-initialized.d.ts +2 -0
- package/lib/utils/not-initialized.d.ts.map +1 -0
- package/lib/utils/protocol/delegation.d.ts +6 -0
- package/lib/utils/protocol/delegation.d.ts.map +1 -0
- package/lib/utils/protocol/protocol-identifier.d.ts +3 -0
- package/lib/utils/protocol/protocol-identifier.d.ts.map +1 -0
- package/lib/utils/protocol/protocol-network-identifier.d.ts +8 -0
- package/lib/utils/protocol/protocol-network-identifier.d.ts.map +1 -0
- package/lib/utils/protocol/protocol-options.d.ts +6 -0
- package/lib/utils/protocol/protocol-options.d.ts.map +1 -0
- package/lib/utils/protocol/protocol-v0-adapter.d.ts +75 -0
- package/lib/utils/protocol/protocol-v0-adapter.d.ts.map +1 -0
- package/lib/utils/utils.d.ts +9 -0
- package/lib/utils/utils.d.ts.map +1 -0
- package/lib/utils/worker.d.ts +11 -0
- package/lib/utils/worker.d.ts.map +1 -0
- package/package.json +88 -0
- package/public-api.d.ts +87 -0
- package/public-api.d.ts.map +1 -0
- package/src/assets/i18n-common/de.json +112 -0
- package/src/assets/i18n-common/en.json +112 -0
- package/src/assets/i18n-common/es.json +112 -0
- package/src/assets/i18n-common/fr.json +112 -0
- package/src/assets/i18n-common/pt_BR.json +112 -0
- package/src/assets/i18n-common/ru.json +112 -0
- package/src/assets/i18n-common/zh_CN.json +112 -0
- package/src/assets/img/identicon_placeholder.png +0 -0
- package/src/assets/native/isolated_modules/isolated-modules.js-engine-android.js +34 -0
- package/src/assets/native/isolated_modules/isolated-modules.script.js +304 -0
- package/src/assets/symbols/abt.svg +1 -0
- package/src/assets/symbols/adx.svg +1 -0
- package/src/assets/symbols/ae.svg +17 -0
- package/src/assets/symbols/agi.svg +1 -0
- package/src/assets/symbols/aion.svg +1 -0
- package/src/assets/symbols/amb.svg +1 -0
- package/src/assets/symbols/ampl.svg +7 -0
- package/src/assets/symbols/ant.svg +1 -0
- package/src/assets/symbols/aoa.svg +7 -0
- package/src/assets/symbols/appc.svg +1 -0
- package/src/assets/symbols/aqua.svg +5 -0
- package/src/assets/symbols/arn.svg +1 -0
- package/src/assets/symbols/ary.svg +1 -0
- package/src/assets/symbols/ast.svg +1 -0
- package/src/assets/symbols/astr.png +0 -0
- package/src/assets/symbols/atm.svg +1 -0
- package/src/assets/symbols/atom.svg +1 -0
- package/src/assets/symbols/auto.svg +1 -0
- package/src/assets/symbols/bal.svg +7 -0
- package/src/assets/symbols/band.svg +7 -0
- package/src/assets/symbols/bat.svg +1 -0
- package/src/assets/symbols/bcbc.svg +1 -0
- package/src/assets/symbols/bcpt.svg +1 -0
- package/src/assets/symbols/bix.svg +1 -0
- package/src/assets/symbols/blz.svg +1 -0
- package/src/assets/symbols/bnb.svg +1 -0
- package/src/assets/symbols/bnt.svg +1 -0
- package/src/assets/symbols/bnty.svg +1 -0
- package/src/assets/symbols/bpt.svg +1 -0
- package/src/assets/symbols/brc.svg +7 -0
- package/src/assets/symbols/brd.svg +1 -0
- package/src/assets/symbols/btc.svg +1 -0
- package/src/assets/symbols/btctz.png +0 -0
- package/src/assets/symbols/btm.svg +1 -0
- package/src/assets/symbols/busd.svg +7 -0
- package/src/assets/symbols/bytom.svg +7 -0
- package/src/assets/symbols/cacu.svg +1 -0
- package/src/assets/symbols/cdt.svg +1 -0
- package/src/assets/symbols/cel.svg +7 -0
- package/src/assets/symbols/cennz.svg +7 -0
- package/src/assets/symbols/cfx.svg +1 -0
- package/src/assets/symbols/chsb.svg +7 -0
- package/src/assets/symbols/chz.svg +7 -0
- package/src/assets/symbols/ckbtc.png +0 -0
- package/src/assets/symbols/cmt.svg +1 -0
- package/src/assets/symbols/cnd.svg +1 -0
- package/src/assets/symbols/cob.svg +1 -0
- package/src/assets/symbols/comp.svg +7 -0
- package/src/assets/symbols/coreum.png +0 -0
- package/src/assets/symbols/cred.svg +1 -0
- package/src/assets/symbols/cro.svg +7 -0
- package/src/assets/symbols/crpt.svg +1 -0
- package/src/assets/symbols/crv.svg +7 -0
- package/src/assets/symbols/cs.svg +1 -0
- package/src/assets/symbols/ctez.svg +1 -0
- package/src/assets/symbols/ctr.svg +1 -0
- package/src/assets/symbols/ctxc.svg +1 -0
- package/src/assets/symbols/cusdc.svg +7 -0
- package/src/assets/symbols/cvc.svg +1 -0
- package/src/assets/symbols/cvt.svg +7 -0
- package/src/assets/symbols/czrx.svg +7 -0
- package/src/assets/symbols/dai.svg +7 -0
- package/src/assets/symbols/dat.svg +1 -0
- package/src/assets/symbols/data.svg +1 -0
- package/src/assets/symbols/dcn.svg +1 -0
- package/src/assets/symbols/deez.svg +1 -0
- package/src/assets/symbols/dent.svg +1 -0
- package/src/assets/symbols/dew.svg +1 -0
- package/src/assets/symbols/dgd.svg +1 -0
- package/src/assets/symbols/dia.svg +7 -0
- package/src/assets/symbols/divx.svg +7 -0
- package/src/assets/symbols/dlt.svg +1 -0
- package/src/assets/symbols/dnt.svg +1 -0
- package/src/assets/symbols/dock.svg +1 -0
- package/src/assets/symbols/doga.png +0 -0
- package/src/assets/symbols/dot.svg +14 -0
- package/src/assets/symbols/drgn.svg +1 -0
- package/src/assets/symbols/drop.svg +1 -0
- package/src/assets/symbols/dth.svg +1 -0
- package/src/assets/symbols/dtr.svg +1 -0
- package/src/assets/symbols/dx.svg +7 -0
- package/src/assets/symbols/edg.svg +1 -0
- package/src/assets/symbols/edo.svg +1 -0
- package/src/assets/symbols/elf.svg +1 -0
- package/src/assets/symbols/elix.svg +1 -0
- package/src/assets/symbols/eng.svg +1 -0
- package/src/assets/symbols/enj.svg +1 -0
- package/src/assets/symbols/entrp.svg +1 -0
- package/src/assets/symbols/eos.svg +1 -0
- package/src/assets/symbols/eth.svg +1 -0
- package/src/assets/symbols/ethtz.png +0 -0
- package/src/assets/symbols/eurc.svg +8 -0
- package/src/assets/symbols/evx.svg +1 -0
- package/src/assets/symbols/fet.svg +7 -0
- package/src/assets/symbols/frax.svg +26 -0
- package/src/assets/symbols/fsn.svg +1 -0
- package/src/assets/symbols/ftc.svg +1 -0
- package/src/assets/symbols/ftm.svg +7 -0
- package/src/assets/symbols/fuel.svg +1 -0
- package/src/assets/symbols/fun.svg +1 -0
- package/src/assets/symbols/gbx.svg +1 -0
- package/src/assets/symbols/generic-coin.svg +1 -0
- package/src/assets/symbols/glmr.svg +1 -0
- package/src/assets/symbols/gno.svg +1 -0
- package/src/assets/symbols/gnt.svg +1 -0
- package/src/assets/symbols/grs.svg +1 -0
- package/src/assets/symbols/gsc.svg +1 -0
- package/src/assets/symbols/gto.svg +1 -0
- package/src/assets/symbols/gup.svg +1 -0
- package/src/assets/symbols/gusd.svg +1 -0
- package/src/assets/symbols/gvt.svg +1 -0
- package/src/assets/symbols/gzr.svg +1 -0
- package/src/assets/symbols/hedg.svg +7 -0
- package/src/assets/symbols/hodl.svg +1 -0
- package/src/assets/symbols/hot.svg +7 -0
- package/src/assets/symbols/hpb.svg +1 -0
- package/src/assets/symbols/ht.svg +1 -0
- package/src/assets/symbols/husd.svg +7 -0
- package/src/assets/symbols/icn.svg +1 -0
- package/src/assets/symbols/icp.svg +16 -0
- package/src/assets/symbols/icx.svg +1 -0
- package/src/assets/symbols/inb.svg +7 -0
- package/src/assets/symbols/ino.svg +7 -0
- package/src/assets/symbols/ins.svg +1 -0
- package/src/assets/symbols/iost.svg +1 -0
- package/src/assets/symbols/iotx.svg +1 -0
- package/src/assets/symbols/itc.svg +1 -0
- package/src/assets/symbols/jnt.svg +1 -0
- package/src/assets/symbols/kcs.svg +7 -0
- package/src/assets/symbols/kin.svg +1 -0
- package/src/assets/symbols/knc.svg +1 -0
- package/src/assets/symbols/ksm.svg +1 -0
- package/src/assets/symbols/kusd.svg +1 -0
- package/src/assets/symbols/ldo.svg +97 -0
- package/src/assets/symbols/lend.svg +1 -0
- package/src/assets/symbols/leo.svg +7 -0
- package/src/assets/symbols/link.svg +7 -0
- package/src/assets/symbols/loom.svg +1 -0
- package/src/assets/symbols/lpt.svg +1 -0
- package/src/assets/symbols/lrc.svg +1 -0
- package/src/assets/symbols/lun.svg +1 -0
- package/src/assets/symbols/mana.svg +1 -0
- package/src/assets/symbols/matic.svg +7 -0
- package/src/assets/symbols/mcap.svg +1 -0
- package/src/assets/symbols/mco.svg +1 -0
- package/src/assets/symbols/mda.svg +1 -0
- package/src/assets/symbols/mds.svg +1 -0
- package/src/assets/symbols/mkr.svg +1 -0
- package/src/assets/symbols/mln.svg +7 -0
- package/src/assets/symbols/mnw.svg +1 -0
- package/src/assets/symbols/mod.svg +1 -0
- package/src/assets/symbols/movr.svg +10 -0
- package/src/assets/symbols/mth.svg +1 -0
- package/src/assets/symbols/mtl.svg +1 -0
- package/src/assets/symbols/mxc.svg +7 -0
- package/src/assets/symbols/nas.svg +1 -0
- package/src/assets/symbols/ncash.svg +1 -0
- package/src/assets/symbols/neu.svg +1 -0
- package/src/assets/symbols/nexo.svg +1 -0
- package/src/assets/symbols/ngc.svg +1 -0
- package/src/assets/symbols/nio.svg +1 -0
- package/src/assets/symbols/nmr.svg +7 -0
- package/src/assets/symbols/noah.svg +7 -0
- package/src/assets/symbols/npxs.svg +1 -0
- package/src/assets/symbols/nuls.svg +1 -0
- package/src/assets/symbols/nxm.svg +7 -0
- package/src/assets/symbols/oax.svg +1 -0
- package/src/assets/symbols/ocean.svg +7 -0
- package/src/assets/symbols/okb.svg +7 -0
- package/src/assets/symbols/omg.svg +1 -0
- package/src/assets/symbols/ong.svg +1 -0
- package/src/assets/symbols/op.svg +21 -0
- package/src/assets/symbols/ost.svg +1 -0
- package/src/assets/symbols/pax.svg +1 -0
- package/src/assets/symbols/paxg.svg +7 -0
- package/src/assets/symbols/pay.svg +1 -0
- package/src/assets/symbols/plenty.svg +1 -0
- package/src/assets/symbols/plr.svg +1 -0
- package/src/assets/symbols/pnk.svg +7 -0
- package/src/assets/symbols/poe.svg +1 -0
- package/src/assets/symbols/poly.svg +1 -0
- package/src/assets/symbols/powr.svg +1 -0
- package/src/assets/symbols/ppp.svg +1 -0
- package/src/assets/symbols/ppt.svg +1 -0
- package/src/assets/symbols/prl.svg +1 -0
- package/src/assets/symbols/qash.svg +1 -0
- package/src/assets/symbols/qnt.svg +7 -0
- package/src/assets/symbols/qrl.svg +1 -0
- package/src/assets/symbols/qsp.svg +1 -0
- package/src/assets/symbols/qtum.svg +1 -0
- package/src/assets/symbols/quipu.png +0 -0
- package/src/assets/symbols/r.svg +1 -0
- package/src/assets/symbols/rcn.svg +1 -0
- package/src/assets/symbols/rdn.svg +1 -0
- package/src/assets/symbols/ren.svg +7 -0
- package/src/assets/symbols/rep.svg +1 -0
- package/src/assets/symbols/repv2.svg +7 -0
- package/src/assets/symbols/req.svg +1 -0
- package/src/assets/symbols/rev.svg +7 -0
- package/src/assets/symbols/rhoc.svg +1 -0
- package/src/assets/symbols/rlc.svg +1 -0
- package/src/assets/symbols/rsr.svg +7 -0
- package/src/assets/symbols/sai.svg +7 -0
- package/src/assets/symbols/salt.svg +1 -0
- package/src/assets/symbols/san.svg +1 -0
- package/src/assets/symbols/sdn.svg +1 -0
- package/src/assets/symbols/shx.svg +32 -0
- package/src/assets/symbols/sirs.svg +1 -0
- package/src/assets/symbols/smart.svg +1 -0
- package/src/assets/symbols/sngls.svg +1 -0
- package/src/assets/symbols/snm.svg +1 -0
- package/src/assets/symbols/snt.svg +1 -0
- package/src/assets/symbols/snx.svg +7 -0
- package/src/assets/symbols/soc.svg +1 -0
- package/src/assets/symbols/sol.svg +1 -0
- package/src/assets/symbols/spank.svg +1 -0
- package/src/assets/symbols/sphtx.svg +1 -0
- package/src/assets/symbols/srm.svg +7 -0
- package/src/assets/symbols/srn.svg +1 -0
- package/src/assets/symbols/stake.svg +7 -0
- package/src/assets/symbols/stellar.png +0 -0
- package/src/assets/symbols/storj.svg +1 -0
- package/src/assets/symbols/storm.svg +1 -0
- package/src/assets/symbols/stq.svg +1 -0
- package/src/assets/symbols/stxtz.svg +18 -0
- package/src/assets/symbols/sub.svg +1 -0
- package/src/assets/symbols/sushi.svg +7 -0
- package/src/assets/symbols/sxp.svg +7 -0
- package/src/assets/symbols/sxtz.svg +6 -0
- package/src/assets/symbols/taas.svg +1 -0
- package/src/assets/symbols/tau.svg +1 -0
- package/src/assets/symbols/tbx.svg +1 -0
- package/src/assets/symbols/tel.svg +1 -0
- package/src/assets/symbols/ten.svg +1 -0
- package/src/assets/symbols/theta.svg +1 -0
- package/src/assets/symbols/tix.svg +1 -0
- package/src/assets/symbols/tkn.svg +1 -0
- package/src/assets/symbols/tnt.svg +1 -0
- package/src/assets/symbols/tomo.svg +1 -0
- package/src/assets/symbols/trac.svg +7 -0
- package/src/assets/symbols/trb.svg +7 -0
- package/src/assets/symbols/trx.svg +1 -0
- package/src/assets/symbols/tusd.svg +1 -0
- package/src/assets/symbols/tzbtc.svg +1 -0
- package/src/assets/symbols/ubt.svg +7 -0
- package/src/assets/symbols/ubtc.svg +1 -0
- package/src/assets/symbols/udefi.svg +1 -0
- package/src/assets/symbols/uma.svg +7 -0
- package/src/assets/symbols/usdc.svg +1 -0
- package/src/assets/symbols/usdt.png +0 -0
- package/src/assets/symbols/usdt.svg +1 -0
- package/src/assets/symbols/usdtz.svg +17 -0
- package/src/assets/symbols/ust.svg +1 -0
- package/src/assets/symbols/utk.svg +1 -0
- package/src/assets/symbols/uusd.svg +1 -0
- package/src/assets/symbols/uxtz.svg +1 -0
- package/src/assets/symbols/velo.svg +5 -0
- package/src/assets/symbols/ven.svg +7 -0
- package/src/assets/symbols/veri.svg +1 -0
- package/src/assets/symbols/verse.svg +1 -0
- package/src/assets/symbols/vest.svg +7 -0
- package/src/assets/symbols/vib.svg +1 -0
- package/src/assets/symbols/vibe.svg +1 -0
- package/src/assets/symbols/wabi.svg +1 -0
- package/src/assets/symbols/wax.svg +1 -0
- package/src/assets/symbols/wbtc.svg +7 -0
- package/src/assets/symbols/weth.svg +18 -0
- package/src/assets/symbols/wic.svg +7 -0
- package/src/assets/symbols/wings.svg +1 -0
- package/src/assets/symbols/wnxm.svg +7 -0
- package/src/assets/symbols/wpr.svg +1 -0
- package/src/assets/symbols/wrap.png +0 -0
- package/src/assets/symbols/wtc.svg +1 -0
- package/src/assets/symbols/wusdc.png +0 -0
- package/src/assets/symbols/xchf.svg +1 -0
- package/src/assets/symbols/xdce.svg +7 -0
- package/src/assets/symbols/xin.svg +7 -0
- package/src/assets/symbols/xpa.svg +1 -0
- package/src/assets/symbols/xpl.svg +1 -0
- package/src/assets/symbols/xtz.svg +5 -0
- package/src/assets/symbols/yfi.svg +7 -0
- package/src/assets/symbols/you.svg +1 -0
- package/src/assets/symbols/yoyow.svg +1 -0
- package/src/assets/symbols/ytez.svg +1 -0
- package/src/assets/symbols/zb.svg +7 -0
- package/src/assets/symbols/zil.svg +1 -0
- package/src/assets/symbols/zrx.svg +1 -0
- package/src/assets/workers/airgap-coin-lib.js +119 -0
- package/wallfree-dev-angular-core.d.ts.map +1 -0
|
@@ -0,0 +1,880 @@
|
|
|
1
|
+
/* eslint-disable max-lines */
|
|
2
|
+
/* eslint-disable max-classes-per-file */
|
|
3
|
+
import { NetworkType as NetworkTypeV0, ProtocolBlockExplorer as ProtocolBlockExplorerV0, ProtocolNetwork as ProtocolNetworkV0, SubProtocolSymbols, SubProtocolType as SubProtocolTypeV0 } from '@wallfree-dev/coinlib-core';
|
|
4
|
+
import { derive, mnemonicToSeed } from '@wallfree-dev/crypto';
|
|
5
|
+
import { canEncryptAES, canEncryptAsymmetric, canFetchDataForAddress, canFetchDataForMultipleAddresses, canSignMessage, hasConfigurableContract, hasMultiAddressPublicKeys, implementsInterface, isAmount, isBip32Protocol, isMultiTokenSubProtocol, isOfflineProtocol, isOnlineProtocol, isTransactionStatusChecker, newAmount, newExtendedPublicKey, newExtendedSecretKey, newPublicKey, newSecretKey, newSignature } from '@wallfree-dev/module-kit';
|
|
6
|
+
import BigNumber from 'bignumber.js';
|
|
7
|
+
import { isTezosSaplingProtocol } from '@wallfree-dev/tezos';
|
|
8
|
+
import { isBitcoinSegwitProtocol, isBitcoinTaprootProtocol } from '@wallfree-dev/bitcoin';
|
|
9
|
+
import { getProtocolOptionsByIdentifierLegacy } from '../../utils/protocol/protocol-options';
|
|
10
|
+
import { supportsV1Delegation } from '../../utils/protocol/delegation';
|
|
11
|
+
import { convertFeeDefaultsV1ToV0, convertNetworkTypeV1ToV0, convertTransactionDetailsV1ToV0, convertTransactionStatusV1ToV0, getBytesFormatV1FromV0, getPublicKeyType, getSecretKeyType } from '../../utils/protocol/protocol-v0-adapter';
|
|
12
|
+
// ProtocolBlockExplorer
|
|
13
|
+
export class ProtocolBlockExplorerAdapter extends ProtocolBlockExplorerV0 {
|
|
14
|
+
constructor(blockExplorerV1, url) {
|
|
15
|
+
super(url);
|
|
16
|
+
this.blockExplorerV1 = blockExplorerV1;
|
|
17
|
+
}
|
|
18
|
+
async getAddressLink(address) {
|
|
19
|
+
return this.blockExplorerV1.createAddressUrl(address);
|
|
20
|
+
}
|
|
21
|
+
async getTransactionLink(transactionId) {
|
|
22
|
+
return this.blockExplorerV1.createTransactionUrl(transactionId);
|
|
23
|
+
}
|
|
24
|
+
toJSON() {
|
|
25
|
+
return {
|
|
26
|
+
blockExplorer: this.blockExplorer
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// ProtocolNetwork
|
|
31
|
+
export class ProtocolNetworkAdapter extends ProtocolNetworkV0 {
|
|
32
|
+
constructor(name, type, rpcUrl, blockExplorer, extras = {}) {
|
|
33
|
+
const networkType = Object.values(NetworkTypeV0).includes(type)
|
|
34
|
+
? type
|
|
35
|
+
: convertNetworkTypeV1ToV0(type);
|
|
36
|
+
super(name, networkType, rpcUrl, blockExplorer, extras);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// ProtocolOptions
|
|
40
|
+
export class ProtocolOptionsAdapter {
|
|
41
|
+
constructor(network, config = {}) {
|
|
42
|
+
this.network = network;
|
|
43
|
+
this.config = config;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// TransactionValidator
|
|
47
|
+
export class TransactionValidatorAdapter {
|
|
48
|
+
constructor(protocolIdentifier, serializerCompanion) {
|
|
49
|
+
this.protocolIdentifier = protocolIdentifier;
|
|
50
|
+
this.serializerCompanion = serializerCompanion;
|
|
51
|
+
}
|
|
52
|
+
async validateUnsignedTransaction(transaction) {
|
|
53
|
+
return this.serializerCompanion.validateTransactionSignRequest(this.protocolIdentifier, transaction);
|
|
54
|
+
}
|
|
55
|
+
async validateSignedTransaction(transaction) {
|
|
56
|
+
return this.serializerCompanion.validateTransactionSignResponse(this.protocolIdentifier, transaction);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// ICoinProtocol
|
|
60
|
+
export class ICoinProtocolAdapter {
|
|
61
|
+
constructor(protocolV1, protocolMetadata, crypto, network, blockExplorerV1, blockExplorerMetadata, v3SerializerCompanion) {
|
|
62
|
+
this.protocolV1 = protocolV1;
|
|
63
|
+
this.protocolMetadata = protocolMetadata;
|
|
64
|
+
this.crypto = crypto;
|
|
65
|
+
this.network = network;
|
|
66
|
+
this.v3SerializerCompanion = v3SerializerCompanion;
|
|
67
|
+
const units = this.protocolMetadata.units;
|
|
68
|
+
const mainUnit = this.protocolMetadata.mainUnit;
|
|
69
|
+
const symbol = units[mainUnit].symbol;
|
|
70
|
+
const feeUnits = protocolMetadata.fee?.units ?? protocolMetadata.units;
|
|
71
|
+
const mainFeeUnit = protocolMetadata.fee?.mainUnit ?? protocolMetadata.mainUnit;
|
|
72
|
+
const feeSymbol = feeUnits[mainFeeUnit].symbol;
|
|
73
|
+
const feeDefaults = protocolMetadata.fee?.defaults ?? {
|
|
74
|
+
low: newAmount('0', 'blockchain'),
|
|
75
|
+
medium: newAmount('0', 'blockchain'),
|
|
76
|
+
high: newAmount('0', 'blockchain')
|
|
77
|
+
};
|
|
78
|
+
const maxDecimals = Math.max(...Object.values(protocolMetadata.units).map((unit) => unit.decimals));
|
|
79
|
+
this.name = this.protocolMetadata.name;
|
|
80
|
+
this.identifier = this.protocolMetadata.identifier;
|
|
81
|
+
this.symbol = symbol.value;
|
|
82
|
+
this.marketSymbol = symbol.market ?? symbol.value;
|
|
83
|
+
this.assetSymbol = symbol.asset;
|
|
84
|
+
this.decimals = units[mainUnit].decimals;
|
|
85
|
+
this.feeSymbol = feeSymbol.value;
|
|
86
|
+
this.feeDefaults = this.convertFeeDefaultsV1ToV0(feeDefaults);
|
|
87
|
+
this.feeDecimals = feeUnits[mainFeeUnit].decimals;
|
|
88
|
+
this.units = Object.entries(protocolMetadata.units).map((entry) => {
|
|
89
|
+
const unitSymbol = entry[0];
|
|
90
|
+
const factor = new BigNumber(1).shiftedBy(-(maxDecimals - entry[1].decimals)).toFixed();
|
|
91
|
+
return { unitSymbol, factor };
|
|
92
|
+
});
|
|
93
|
+
this.supportsHD = isBip32Protocol(this.protocolV1);
|
|
94
|
+
this.standardDerivationPath = this.protocolMetadata.account?.standardDerivationPath ?? 'm/';
|
|
95
|
+
this.addressIsCaseSensitive = this.protocolMetadata.account.address?.isCaseSensitive ?? false;
|
|
96
|
+
this.addressValidationPattern = this.protocolMetadata.account?.address?.regex ?? '*+';
|
|
97
|
+
this.addressPlaceholder = this.protocolMetadata.account?.address?.placeholder ?? '';
|
|
98
|
+
let knownOptions;
|
|
99
|
+
try {
|
|
100
|
+
knownOptions = getProtocolOptionsByIdentifierLegacy(this.protocolMetadata.identifier);
|
|
101
|
+
// eslint-disable-next-line no-empty
|
|
102
|
+
}
|
|
103
|
+
catch { }
|
|
104
|
+
this.blockExplorerV0 =
|
|
105
|
+
blockExplorerV1 && blockExplorerMetadata ? new ProtocolBlockExplorerAdapter(blockExplorerV1, blockExplorerMetadata.url) : undefined;
|
|
106
|
+
this.networkV0 = this.getNetwork(knownOptions);
|
|
107
|
+
this.options = new ProtocolOptionsAdapter(this.networkV0, knownOptions?.config ?? {});
|
|
108
|
+
}
|
|
109
|
+
async getSymbol() {
|
|
110
|
+
return this.symbol;
|
|
111
|
+
}
|
|
112
|
+
async getName() {
|
|
113
|
+
return this.name;
|
|
114
|
+
}
|
|
115
|
+
async getMarketSymbol() {
|
|
116
|
+
return this.marketSymbol;
|
|
117
|
+
}
|
|
118
|
+
async getAssetSymbol() {
|
|
119
|
+
return this.assetSymbol;
|
|
120
|
+
}
|
|
121
|
+
async getFeeSymbol() {
|
|
122
|
+
return this.feeSymbol;
|
|
123
|
+
}
|
|
124
|
+
async getFeeDefaults() {
|
|
125
|
+
return this.feeDefaults;
|
|
126
|
+
}
|
|
127
|
+
async getDecimals() {
|
|
128
|
+
return this.decimals;
|
|
129
|
+
}
|
|
130
|
+
async getFeeDecimals() {
|
|
131
|
+
return this.feeDecimals;
|
|
132
|
+
}
|
|
133
|
+
async getIdentifier() {
|
|
134
|
+
return this.identifier;
|
|
135
|
+
}
|
|
136
|
+
async getUnits() {
|
|
137
|
+
return this.units;
|
|
138
|
+
}
|
|
139
|
+
async getSupportsHD() {
|
|
140
|
+
return this.supportsHD;
|
|
141
|
+
}
|
|
142
|
+
async getStandardDerivationPath() {
|
|
143
|
+
return this.standardDerivationPath;
|
|
144
|
+
}
|
|
145
|
+
async getAddressIsCaseSensitive() {
|
|
146
|
+
return this.addressIsCaseSensitive;
|
|
147
|
+
}
|
|
148
|
+
async getAddressValidationPattern() {
|
|
149
|
+
return this.addressValidationPattern;
|
|
150
|
+
}
|
|
151
|
+
async getAddressPlaceholder() {
|
|
152
|
+
return this.addressPlaceholder;
|
|
153
|
+
}
|
|
154
|
+
async getOptions() {
|
|
155
|
+
return this.options;
|
|
156
|
+
}
|
|
157
|
+
async getBlockExplorerLinkForAddress(address) {
|
|
158
|
+
if (this.blockExplorerV0 === undefined) {
|
|
159
|
+
throw new Error('Method not supported, BlockExplorer not found.');
|
|
160
|
+
}
|
|
161
|
+
return this.blockExplorerV0.getAddressLink(address);
|
|
162
|
+
}
|
|
163
|
+
async getBlockExplorerLinkForTxId(txId) {
|
|
164
|
+
if (this.blockExplorerV0 === undefined) {
|
|
165
|
+
throw new Error('Method not supported, BlockExplorer not found.');
|
|
166
|
+
}
|
|
167
|
+
return this.blockExplorerV0.getTransactionLink(txId);
|
|
168
|
+
}
|
|
169
|
+
async getTransactionsFromPublicKey(publicKey, limit, cursor) {
|
|
170
|
+
if (!isOnlineProtocol(this.protocolV1)) {
|
|
171
|
+
throw new Error('Method not supported, required interface: Online.');
|
|
172
|
+
}
|
|
173
|
+
const transactions = await this.protocolV1.getTransactionsForPublicKey(newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey)), limit, cursor);
|
|
174
|
+
return {
|
|
175
|
+
transactions: await this.convertTransactionDetailsV1ToV0(transactions.transactions),
|
|
176
|
+
cursor
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
async getTransactionsFromExtendedPublicKey(extendedPublicKey, limit, cursor) {
|
|
180
|
+
if (!isOnlineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
|
|
181
|
+
throw new Error('Method not supported, required interface: Online, Bip32.');
|
|
182
|
+
}
|
|
183
|
+
const transactions = await this.protocolV1.getTransactionsForPublicKey(newExtendedPublicKey(extendedPublicKey, getBytesFormatV1FromV0(extendedPublicKey)), limit, cursor);
|
|
184
|
+
return {
|
|
185
|
+
transactions: await this.convertTransactionDetailsV1ToV0(transactions.transactions),
|
|
186
|
+
cursor
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
async getTransactionsFromAddresses(addresses, limit, cursor) {
|
|
190
|
+
if (!isOnlineProtocol(this.protocolV1)) {
|
|
191
|
+
throw new Error('Method not supported, required interface: Online, FetchDataForAddress/FetchDataForMultipleAddresses.');
|
|
192
|
+
}
|
|
193
|
+
let transactions;
|
|
194
|
+
if (addresses.length === 1 && canFetchDataForAddress(this.protocolV1)) {
|
|
195
|
+
transactions = await this.protocolV1.getTransactionsForAddress(addresses[0], limit, cursor);
|
|
196
|
+
}
|
|
197
|
+
else if (canFetchDataForMultipleAddresses(this.protocolV1)) {
|
|
198
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
199
|
+
transactions = await this.protocolV1.getTransactionsForAddresses(addresses, limit, cursor);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
throw new Error('Method not supported, required interface: Online, FetchDataForAddress/FetchDataForMultipleAddresses.');
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
transactions: await this.convertTransactionDetailsV1ToV0(transactions.transactions),
|
|
206
|
+
cursor: transactions.cursor ? transactions.cursor : cursor
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
async getBalanceOfAddresses(addresses, _data) {
|
|
210
|
+
if (!isOnlineProtocol(this.protocolV1)) {
|
|
211
|
+
throw new Error('Method not supported, required interface: Online, FetchDataForAddress/FetchDataForMultipleAddresses.');
|
|
212
|
+
}
|
|
213
|
+
let balance;
|
|
214
|
+
if (addresses.length === 1 && canFetchDataForAddress(this.protocolV1)) {
|
|
215
|
+
balance = await this.protocolV1.getBalanceOfAddress(addresses[0]);
|
|
216
|
+
}
|
|
217
|
+
else if (canFetchDataForMultipleAddresses(this.protocolV1)) {
|
|
218
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
219
|
+
balance = await this.protocolV1.getBalanceOfAddresses(addresses);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
throw new Error('Method not supported, required interface: Online, FetchDataForAddress/FetchDataForMultipleAddresses.');
|
|
223
|
+
}
|
|
224
|
+
return newAmount(balance.total).blockchain(this.protocolMetadata.units).value;
|
|
225
|
+
}
|
|
226
|
+
async getBalanceOfPublicKey(publicKey, data) {
|
|
227
|
+
if (!isOnlineProtocol(this.protocolV1)) {
|
|
228
|
+
throw new Error('Method not supported, required inferface: Online.');
|
|
229
|
+
}
|
|
230
|
+
const publicKeyV1 = newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey));
|
|
231
|
+
const balance = data?.assetID && isMultiTokenSubProtocol(this.protocolV1)
|
|
232
|
+
? await this.protocolV1.getBalanceOfPublicKey(publicKeyV1, { tokenId: data.assetID })
|
|
233
|
+
: await this.protocolV1.getBalanceOfPublicKey(publicKeyV1);
|
|
234
|
+
return newAmount(balance.total).blockchain(this.protocolMetadata.units).value;
|
|
235
|
+
}
|
|
236
|
+
async getBalanceOfExtendedPublicKey(extendedPublicKey, _offset, data) {
|
|
237
|
+
if (!isOnlineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
|
|
238
|
+
throw new Error('Method not supported, required inferface: Online, Bip32.');
|
|
239
|
+
}
|
|
240
|
+
const extendedPublicKeyV1 = newExtendedPublicKey(extendedPublicKey, getBytesFormatV1FromV0(extendedPublicKey));
|
|
241
|
+
const balance = data?.assetID && isMultiTokenSubProtocol(this.protocolV1)
|
|
242
|
+
? await this.protocolV1.getBalanceOfPublicKey(extendedPublicKeyV1, { tokenId: data.assetID })
|
|
243
|
+
: await this.protocolV1.getBalanceOfPublicKey(extendedPublicKeyV1);
|
|
244
|
+
return newAmount(balance.total).blockchain(this.protocolMetadata.units).value;
|
|
245
|
+
}
|
|
246
|
+
async getAvailableBalanceOfAddresses(addresses, _data) {
|
|
247
|
+
if (!isOnlineProtocol(this.protocolV1)) {
|
|
248
|
+
throw new Error('Method not supported, required interface: Online, FetchDataForAddress/FetchDataForMultipleAddresses.');
|
|
249
|
+
}
|
|
250
|
+
let balance;
|
|
251
|
+
if (addresses.length === 1 && canFetchDataForAddress(this.protocolV1)) {
|
|
252
|
+
balance = await this.protocolV1.getBalanceOfAddress(addresses[0]);
|
|
253
|
+
}
|
|
254
|
+
else if (canFetchDataForMultipleAddresses(this.protocolV1)) {
|
|
255
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
256
|
+
balance = await this.protocolV1.getBalanceOfAddresses(addresses);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
throw new Error('Method not supported, required interface: Online, FetchDataForAddress/FetchDataForMultipleAddresses.');
|
|
260
|
+
}
|
|
261
|
+
return newAmount(balance.transferable ?? balance.total).blockchain(this.protocolMetadata.units).value;
|
|
262
|
+
}
|
|
263
|
+
async getTransactionStatuses(transactionHash) {
|
|
264
|
+
if (!isOnlineProtocol(this.protocolV1) || !isTransactionStatusChecker(this.protocolV1)) {
|
|
265
|
+
throw new Error('Method not supported, required inferface: Online, TransactionStatusChecker.');
|
|
266
|
+
}
|
|
267
|
+
const statuses = await this.protocolV1.getTransactionStatus(transactionHash);
|
|
268
|
+
return transactionHash.map((hash) => {
|
|
269
|
+
const status = statuses[hash];
|
|
270
|
+
return convertTransactionStatusV1ToV0(status);
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
async getBalanceOfPublicKeyForSubProtocols(_publicKey, _subProtocols) {
|
|
274
|
+
throw new Error('Method not supported.');
|
|
275
|
+
}
|
|
276
|
+
async estimateMaxTransactionValueFromExtendedPublicKey(extendedPublicKey, recipients, fee, data) {
|
|
277
|
+
if (!isOnlineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
|
|
278
|
+
throw new Error('Method not supported, required inferface: Online, Bip32.');
|
|
279
|
+
}
|
|
280
|
+
const maxAmount = await this.protocolV1.getTransactionMaxAmountWithPublicKey(newExtendedPublicKey(extendedPublicKey, getBytesFormatV1FromV0(extendedPublicKey)), recipients, {
|
|
281
|
+
arbitraryData: this.getArbitraryData(data),
|
|
282
|
+
fee: fee ? newAmount(fee, 'blockchain') : undefined
|
|
283
|
+
});
|
|
284
|
+
return newAmount(maxAmount).blockchain(this.protocolMetadata.units).value;
|
|
285
|
+
}
|
|
286
|
+
async estimateMaxTransactionValueFromPublicKey(publicKey, recipients, fee, data) {
|
|
287
|
+
if (!isOnlineProtocol(this.protocolV1)) {
|
|
288
|
+
throw new Error('Method not supported, required inferface: Online.');
|
|
289
|
+
}
|
|
290
|
+
const maxAmount = await this.protocolV1.getTransactionMaxAmountWithPublicKey(newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey)), recipients, {
|
|
291
|
+
fee: fee ? newAmount(fee, 'blockchain') : undefined,
|
|
292
|
+
arbitraryData: this.getArbitraryData(data)
|
|
293
|
+
});
|
|
294
|
+
return newAmount(maxAmount).blockchain(this.protocolMetadata.units).value;
|
|
295
|
+
}
|
|
296
|
+
async estimateFeeDefaultsFromExtendedPublicKey(publicKey, recipients, values, data) {
|
|
297
|
+
if (!isOnlineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
|
|
298
|
+
throw new Error('Method not supported, required inferface: Online, Bip32.');
|
|
299
|
+
}
|
|
300
|
+
const feeEstimation = await this.protocolV1.getTransactionFeeWithPublicKey(newExtendedPublicKey(publicKey, getBytesFormatV1FromV0(publicKey)), this.combineTransactionDetails(recipients, values), {
|
|
301
|
+
arbitraryData: this.getArbitraryData(data),
|
|
302
|
+
assetId: data?.assetID ? parseInt(data.assetID, 10) : undefined
|
|
303
|
+
});
|
|
304
|
+
if (feeEstimation === undefined) {
|
|
305
|
+
throw new Error('Method `estimateFeeDefaultsFromExtendedPublicKey` not supported.');
|
|
306
|
+
}
|
|
307
|
+
const feeDefaults = isAmount(feeEstimation)
|
|
308
|
+
? { low: feeEstimation, medium: feeEstimation, high: feeEstimation }
|
|
309
|
+
: feeEstimation;
|
|
310
|
+
return this.convertFeeDefaultsV1ToV0(feeDefaults);
|
|
311
|
+
}
|
|
312
|
+
async estimateFeeDefaultsFromPublicKey(publicKey, recipients, values, data) {
|
|
313
|
+
if (!isOnlineProtocol(this.protocolV1)) {
|
|
314
|
+
throw new Error('Method not supported, required inferface: Online.');
|
|
315
|
+
}
|
|
316
|
+
if (recipients.length !== values.length) {
|
|
317
|
+
throw new Error('Recipients length must match values length.');
|
|
318
|
+
}
|
|
319
|
+
const transactionDetails = recipients.map((recipient, index) => ({
|
|
320
|
+
to: recipient,
|
|
321
|
+
amount: newAmount(values[index], 'blockchain')
|
|
322
|
+
}));
|
|
323
|
+
const feeEstimation = await this.protocolV1.getTransactionFeeWithPublicKey(newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey)), transactionDetails, {
|
|
324
|
+
arbitraryData: this.getArbitraryData(data),
|
|
325
|
+
assetId: data?.assetID ? parseInt(data.assetID, 10) : undefined
|
|
326
|
+
});
|
|
327
|
+
if (feeEstimation === undefined) {
|
|
328
|
+
throw new Error('Method `estimateFeeDefaultsFromPublicKey` not supported.');
|
|
329
|
+
}
|
|
330
|
+
const feeDefaults = isAmount(feeEstimation)
|
|
331
|
+
? { low: feeEstimation, medium: feeEstimation, high: feeEstimation }
|
|
332
|
+
: feeEstimation;
|
|
333
|
+
return this.convertFeeDefaultsV1ToV0(feeDefaults);
|
|
334
|
+
}
|
|
335
|
+
async prepareTransactionFromExtendedPublicKey(extendedPublicKey, _offset, recipients, values, fee, extras) {
|
|
336
|
+
if (!isOnlineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
|
|
337
|
+
throw new Error('Method not supported, required inferface: Online.');
|
|
338
|
+
}
|
|
339
|
+
const isSegwit = isBitcoinSegwitProtocol(this.protocolV1);
|
|
340
|
+
const isTaproot = isBitcoinTaprootProtocol(this.protocolV1);
|
|
341
|
+
let transaction;
|
|
342
|
+
if (isSegwit || isTaproot) {
|
|
343
|
+
transaction = await (isSegwit
|
|
344
|
+
? this.protocolV1
|
|
345
|
+
: this.protocolV1).prepareTransactionWithPublicKey(newExtendedPublicKey(extendedPublicKey, getBytesFormatV1FromV0(extendedPublicKey)), this.combineTransactionDetails(recipients, values), {
|
|
346
|
+
fee: newAmount(fee, 'blockchain'),
|
|
347
|
+
arbitraryData: this.getArbitraryData(extras),
|
|
348
|
+
masterFingerprint: {
|
|
349
|
+
format: 'hex',
|
|
350
|
+
value: extras?.masterFingerprint
|
|
351
|
+
},
|
|
352
|
+
replaceByFee: extras?.replaceByFee
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
transaction = await this.protocolV1.prepareTransactionWithPublicKey(newExtendedPublicKey(extendedPublicKey, getBytesFormatV1FromV0(extendedPublicKey)), this.combineTransactionDetails(recipients, values), {
|
|
357
|
+
fee: newAmount(fee, 'blockchain'),
|
|
358
|
+
assetId: extras?.assetID ? parseInt(extras.assetID, 10) : undefined,
|
|
359
|
+
arbitraryData: this.getArbitraryData(extras)
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
const transactionV0 = await this.convertUnsignedTransactionV1ToV0(transaction, extendedPublicKey);
|
|
363
|
+
return transactionV0.transaction;
|
|
364
|
+
}
|
|
365
|
+
async prepareTransactionFromPublicKey(publicKey, recipients, values, fee, extras) {
|
|
366
|
+
if (!isOnlineProtocol(this.protocolV1)) {
|
|
367
|
+
throw new Error('Method not supported, required inferface: Online.');
|
|
368
|
+
}
|
|
369
|
+
const transaction = await this.protocolV1.prepareTransactionWithPublicKey(newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey)), this.combineTransactionDetails(recipients, values), {
|
|
370
|
+
fee: newAmount(fee, 'blockchain'),
|
|
371
|
+
arbitraryData: this.getArbitraryData(extras),
|
|
372
|
+
assetId: extras?.assetID ? parseInt(extras.assetID, 10) : undefined
|
|
373
|
+
});
|
|
374
|
+
const transactionV0 = await this.convertUnsignedTransactionV1ToV0(transaction, publicKey);
|
|
375
|
+
return transactionV0.transaction;
|
|
376
|
+
}
|
|
377
|
+
async broadcastTransaction(rawTransaction) {
|
|
378
|
+
if (!isOnlineProtocol(this.protocolV1)) {
|
|
379
|
+
throw new Error('Method not supported, required inferface: Online.');
|
|
380
|
+
}
|
|
381
|
+
const transaction = { transaction: rawTransaction, accountIdentifier: '' };
|
|
382
|
+
const signed = await this.convertSignedTransactionV0ToV1(transaction);
|
|
383
|
+
return this.protocolV1.broadcastTransaction(signed);
|
|
384
|
+
}
|
|
385
|
+
async getAddressFromPublicKey(publicKey, _cursor) {
|
|
386
|
+
const address = await this.protocolV1.getAddressFromPublicKey(newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey)));
|
|
387
|
+
return {
|
|
388
|
+
address: typeof address === 'string' ? address : address.address,
|
|
389
|
+
cursor: typeof address === 'object' ? address.cursor : { hasNext: false }
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
async getAddressesFromPublicKey(publicKey, _cursor) {
|
|
393
|
+
if (hasMultiAddressPublicKeys(this.protocolV1)) {
|
|
394
|
+
const pk = newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey));
|
|
395
|
+
const addresses = await this.protocolV1.getInitialAddressesFromPublicKey(pk);
|
|
396
|
+
return addresses;
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
return [await this.getAddressFromPublicKey(publicKey)];
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
async getAddressFromExtendedPublicKey(extendedPublicKey, visibilityDerivationIndex, addressDerivationIndex) {
|
|
403
|
+
if (!isBip32Protocol(this.protocolV1)) {
|
|
404
|
+
throw new Error('Method not supported, required inferface: Bip32.');
|
|
405
|
+
}
|
|
406
|
+
const derivedPublicKey = await this.protocolV1.deriveFromExtendedPublicKey(newExtendedPublicKey(extendedPublicKey, getBytesFormatV1FromV0(extendedPublicKey)), visibilityDerivationIndex, addressDerivationIndex);
|
|
407
|
+
return this.getAddressFromPublicKey(derivedPublicKey.value);
|
|
408
|
+
}
|
|
409
|
+
async getAddressesFromExtendedPublicKey(extendedPublicKey, visibilityDerivationIndex, addressCount, offset) {
|
|
410
|
+
if (!isBip32Protocol(this.protocolV1)) {
|
|
411
|
+
throw new Error('Method not supported, required inferface: Bip32.');
|
|
412
|
+
}
|
|
413
|
+
const generatorArray = Array.from(new Array(addressCount), (_, i) => i + offset);
|
|
414
|
+
return Promise.all(generatorArray.map((addressDerivationIndex) => this.getAddressFromExtendedPublicKey(extendedPublicKey, visibilityDerivationIndex, addressDerivationIndex)));
|
|
415
|
+
}
|
|
416
|
+
async getTransactionDetails(transaction, data) {
|
|
417
|
+
const unsigned = await this.convertUnsignedTransactionV0ToV1(transaction, data?.transactionOwner);
|
|
418
|
+
let transactions;
|
|
419
|
+
if (this.isExtendedPublicKey(transaction.publicKey)) {
|
|
420
|
+
if (!isBip32Protocol(this.protocolV1)) {
|
|
421
|
+
throw new Error('Method not supported, required inferface: Bip32.');
|
|
422
|
+
}
|
|
423
|
+
transactions = await this.protocolV1.getDetailsFromTransaction(unsigned, newExtendedPublicKey(transaction.publicKey, getBytesFormatV1FromV0(transaction.publicKey)));
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
const publicKey = newPublicKey(transaction.publicKey, getBytesFormatV1FromV0(transaction.publicKey));
|
|
427
|
+
transactions =
|
|
428
|
+
data?.knownViewingKeys && isTezosSaplingProtocol(this.protocolV1)
|
|
429
|
+
? await this.protocolV1.getDetailsFromTransaction(unsigned, publicKey, data.knownViewingKeys)
|
|
430
|
+
: await this.protocolV1.getDetailsFromTransaction(unsigned, publicKey);
|
|
431
|
+
}
|
|
432
|
+
const transactionsV0 = await this.convertTransactionDetailsV1ToV0(transactions);
|
|
433
|
+
return transactionsV0.map((tx) => ({
|
|
434
|
+
...tx,
|
|
435
|
+
transactionDetails: tx.transactionDetails ?? transaction.transaction
|
|
436
|
+
}));
|
|
437
|
+
}
|
|
438
|
+
async getTransactionDetailsFromSigned(transaction, data) {
|
|
439
|
+
const signed = await this.convertSignedTransactionV0ToV1(transaction, data?.transactionOwner);
|
|
440
|
+
let transactions;
|
|
441
|
+
if (this.isExtendedPublicKey(transaction.accountIdentifier)) {
|
|
442
|
+
if (!isBip32Protocol(this.protocolV1)) {
|
|
443
|
+
throw new Error('Method not supported, required inferface: Bip32.');
|
|
444
|
+
}
|
|
445
|
+
transactions = await this.protocolV1.getDetailsFromTransaction(signed, newExtendedPublicKey(transaction.accountIdentifier, getBytesFormatV1FromV0(transaction.accountIdentifier)));
|
|
446
|
+
}
|
|
447
|
+
else {
|
|
448
|
+
const publicKey = newPublicKey(transaction.accountIdentifier, getBytesFormatV1FromV0(transaction.accountIdentifier));
|
|
449
|
+
transactions =
|
|
450
|
+
data?.knownViewingKeys && isTezosSaplingProtocol(this.protocolV1)
|
|
451
|
+
? await this.protocolV1.getDetailsFromTransaction(signed, publicKey, data.knownViewingKeys)
|
|
452
|
+
: await this.protocolV1.getDetailsFromTransaction(signed, publicKey);
|
|
453
|
+
}
|
|
454
|
+
const transactionsV0 = await this.convertTransactionDetailsV1ToV0(transactions);
|
|
455
|
+
return transactionsV0.map((tx) => ({
|
|
456
|
+
...tx,
|
|
457
|
+
transactionDetails: tx.transactionDetails ?? transaction.transaction
|
|
458
|
+
}));
|
|
459
|
+
}
|
|
460
|
+
async verifyMessage(message, signature, publicKey) {
|
|
461
|
+
if (!isOfflineProtocol(this.protocolV1) || !canSignMessage(this.protocolV1)) {
|
|
462
|
+
throw new Error('Method not supported, required inferface: Offline, SignMessage.');
|
|
463
|
+
}
|
|
464
|
+
return this.protocolV1.verifyMessageWithPublicKey(message, newSignature(signature, getBytesFormatV1FromV0(signature)), newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey)));
|
|
465
|
+
}
|
|
466
|
+
async encryptAsymmetric(payload, publicKey) {
|
|
467
|
+
if (!isOfflineProtocol(this.protocolV1) || !canEncryptAsymmetric(this.protocolV1)) {
|
|
468
|
+
throw new Error('Method not supported, required inferface: Offline, AsymmetricEncryption.');
|
|
469
|
+
}
|
|
470
|
+
return this.protocolV1.encryptAsymmetricWithPublicKey(payload, newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey)));
|
|
471
|
+
}
|
|
472
|
+
async getPublicKeyFromMnemonic(mnemonic, derivationPath, password) {
|
|
473
|
+
if (!isOfflineProtocol(this.protocolV1)) {
|
|
474
|
+
throw new Error('Method not supported, required inferface: Offline.');
|
|
475
|
+
}
|
|
476
|
+
const crypto = this.crypto ?? (await this.protocolV1.getCryptoConfiguration());
|
|
477
|
+
const seed = await mnemonicToSeed(crypto, mnemonic, password);
|
|
478
|
+
return this.getPublicKeyFromHexSecret(seed.toString('hex'), derivationPath);
|
|
479
|
+
}
|
|
480
|
+
async getPrivateKeyFromMnemonic(mnemonic, derivationPath, password) {
|
|
481
|
+
if (!isOfflineProtocol(this.protocolV1)) {
|
|
482
|
+
throw new Error('Method not supported, required inferface: Offline.');
|
|
483
|
+
}
|
|
484
|
+
const crypto = this.crypto ?? (await this.protocolV1.getCryptoConfiguration());
|
|
485
|
+
const seed = await mnemonicToSeed(crypto, mnemonic, password);
|
|
486
|
+
return this.getPrivateKeyFromHexSecret(seed.toString('hex'), derivationPath);
|
|
487
|
+
}
|
|
488
|
+
async getExtendedPublicKeyFromMnemonic(mnemonic, derivationPath, password) {
|
|
489
|
+
if (!isOfflineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
|
|
490
|
+
throw new Error('Method not supported, required inferface: Offline, Bip32.');
|
|
491
|
+
}
|
|
492
|
+
const crypto = this.crypto ?? (await this.protocolV1.getCryptoConfiguration());
|
|
493
|
+
const seed = await mnemonicToSeed(crypto, mnemonic, password);
|
|
494
|
+
return this.getExtendedPublicKeyFromHexSecret(seed.toString('hex'), derivationPath);
|
|
495
|
+
}
|
|
496
|
+
async getExtendedPrivateKeyFromMnemonic(mnemonic, derivationPath, password) {
|
|
497
|
+
if (!isOfflineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
|
|
498
|
+
throw new Error('Method not supported, required inferface: Offline, Bip32.');
|
|
499
|
+
}
|
|
500
|
+
const crypto = this.crypto ?? (await this.protocolV1.getCryptoConfiguration());
|
|
501
|
+
const seed = await mnemonicToSeed(crypto, mnemonic, password);
|
|
502
|
+
return this.getExtendedPrivateKeyFromHexSecret(seed.toString('hex'), derivationPath);
|
|
503
|
+
}
|
|
504
|
+
async getPublicKeyFromHexSecret(secret, derivationPath) {
|
|
505
|
+
if (!isOfflineProtocol(this.protocolV1)) {
|
|
506
|
+
throw new Error('Method not supported, required inferface: Offline, Bip32.');
|
|
507
|
+
}
|
|
508
|
+
const crypto = this.crypto ?? (await this.protocolV1.getCryptoConfiguration());
|
|
509
|
+
const derivative = await derive(crypto, Buffer.from(secret, 'hex'), derivationPath);
|
|
510
|
+
const keyPair = await this.protocolV1.getKeyPairFromDerivative(derivative);
|
|
511
|
+
return keyPair.publicKey.value;
|
|
512
|
+
}
|
|
513
|
+
async getPrivateKeyFromHexSecret(secret, derivationPath) {
|
|
514
|
+
if (!isOfflineProtocol(this.protocolV1)) {
|
|
515
|
+
throw new Error('Method not supported, required inferface: Offline.');
|
|
516
|
+
}
|
|
517
|
+
const crypto = this.crypto ?? (await this.protocolV1.getCryptoConfiguration());
|
|
518
|
+
const derivative = await derive(crypto, Buffer.from(secret, 'hex'), derivationPath);
|
|
519
|
+
const keyPair = await this.protocolV1.getKeyPairFromDerivative(derivative);
|
|
520
|
+
return keyPair.secretKey.value;
|
|
521
|
+
}
|
|
522
|
+
async getExtendedPublicKeyFromHexSecret(secret, derivationPath) {
|
|
523
|
+
if (!isOfflineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
|
|
524
|
+
throw new Error('Method not supported, required inferface: Offline, Bip32.');
|
|
525
|
+
}
|
|
526
|
+
const crypto = this.crypto ?? (await this.protocolV1.getCryptoConfiguration());
|
|
527
|
+
const derivative = await derive(crypto, Buffer.from(secret, 'hex'), derivationPath);
|
|
528
|
+
const keyPair = await this.protocolV1.getExtendedKeyPairFromDerivative(derivative);
|
|
529
|
+
return keyPair.publicKey.value;
|
|
530
|
+
}
|
|
531
|
+
async getExtendedPrivateKeyFromHexSecret(secret, derivationPath) {
|
|
532
|
+
if (!isOfflineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
|
|
533
|
+
throw new Error('Method not supported, required inferface: Offline, Bip32.');
|
|
534
|
+
}
|
|
535
|
+
const crypto = this.crypto ?? (await this.protocolV1.getCryptoConfiguration());
|
|
536
|
+
const derivative = await derive(crypto, Buffer.from(secret, 'hex'), derivationPath);
|
|
537
|
+
const keyPair = await this.protocolV1.getExtendedKeyPairFromDerivative(derivative);
|
|
538
|
+
return keyPair.secretKey.value;
|
|
539
|
+
}
|
|
540
|
+
async signWithExtendedPrivateKey(extendedPrivateKey, transaction, childDerivationPath) {
|
|
541
|
+
if (!isOfflineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
|
|
542
|
+
throw new Error('Method not supported, required inferface: Offline, Bip32.');
|
|
543
|
+
}
|
|
544
|
+
const unsigned = await this.convertUnsignedTransactionV0ToV1({
|
|
545
|
+
transaction,
|
|
546
|
+
publicKey: ''
|
|
547
|
+
});
|
|
548
|
+
const extendedSecretKey = newExtendedSecretKey(extendedPrivateKey, getBytesFormatV1FromV0(extendedPrivateKey));
|
|
549
|
+
const secretKey = childDerivationPath
|
|
550
|
+
? await this.deriveSecretKey(extendedSecretKey, childDerivationPath)
|
|
551
|
+
: extendedSecretKey;
|
|
552
|
+
const signed = await this.protocolV1.signTransactionWithSecretKey(unsigned, secretKey);
|
|
553
|
+
const signedV0 = await this.convertSignedTransactionV1ToV0(signed, '');
|
|
554
|
+
return signedV0.transaction;
|
|
555
|
+
}
|
|
556
|
+
async signWithPrivateKey(privateKey, transaction) {
|
|
557
|
+
if (!isOfflineProtocol(this.protocolV1)) {
|
|
558
|
+
throw new Error('Method not supported, required inferface: Offline.');
|
|
559
|
+
}
|
|
560
|
+
const unsigned = await this.convertUnsignedTransactionV0ToV1({
|
|
561
|
+
transaction,
|
|
562
|
+
publicKey: ''
|
|
563
|
+
});
|
|
564
|
+
const signed = await this.protocolV1.signTransactionWithSecretKey(unsigned, newSecretKey(privateKey, getBytesFormatV1FromV0(privateKey)));
|
|
565
|
+
const signedV0 = await this.convertSignedTransactionV1ToV0(signed, '');
|
|
566
|
+
return signedV0.transaction;
|
|
567
|
+
}
|
|
568
|
+
async signMessage(message, keypair) {
|
|
569
|
+
if (!isOfflineProtocol(this.protocolV1) || !canSignMessage(this.protocolV1)) {
|
|
570
|
+
throw new Error('Method not supported, required inferface: Offline, SignMessage.');
|
|
571
|
+
}
|
|
572
|
+
const privateKey = getSecretKeyType(keypair.privateKey) === 'xpriv'
|
|
573
|
+
? await this.getPrivateKeyFromExtendedPrivateKey(keypair.privateKey)
|
|
574
|
+
: keypair.privateKey;
|
|
575
|
+
const publicKey = keypair.publicKey
|
|
576
|
+
? getPublicKeyType(keypair.publicKey) === 'xpub'
|
|
577
|
+
? await this.getPublicKeyFromExtendedPrivateKey(keypair.publicKey)
|
|
578
|
+
: keypair.publicKey
|
|
579
|
+
: '';
|
|
580
|
+
const signature = await this.protocolV1.signMessageWithKeyPair(message, {
|
|
581
|
+
secretKey: newSecretKey(privateKey, getBytesFormatV1FromV0(privateKey)),
|
|
582
|
+
publicKey: newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey))
|
|
583
|
+
});
|
|
584
|
+
return signature.value;
|
|
585
|
+
}
|
|
586
|
+
async decryptAsymmetric(encryptedPayload, keypair) {
|
|
587
|
+
if (!isOfflineProtocol(this.protocolV1) || !canEncryptAsymmetric(this.protocolV1)) {
|
|
588
|
+
throw new Error('Method not supported, required inferface: Offline, AsymmetricEncryption.');
|
|
589
|
+
}
|
|
590
|
+
const privateKey = getSecretKeyType(keypair.privateKey) === 'xpriv'
|
|
591
|
+
? await this.getPrivateKeyFromExtendedPrivateKey(keypair.privateKey)
|
|
592
|
+
: keypair.privateKey;
|
|
593
|
+
const publicKey = keypair.publicKey
|
|
594
|
+
? getPublicKeyType(keypair.publicKey) === 'xpub'
|
|
595
|
+
? await this.getPublicKeyFromExtendedPrivateKey(keypair.publicKey)
|
|
596
|
+
: keypair.publicKey
|
|
597
|
+
: '';
|
|
598
|
+
return this.protocolV1.decryptAsymmetricWithKeyPair(encryptedPayload, {
|
|
599
|
+
secretKey: newSecretKey(privateKey, getBytesFormatV1FromV0(privateKey)),
|
|
600
|
+
publicKey: newPublicKey(publicKey, getBytesFormatV1FromV0(publicKey))
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
async encryptAES(payload, privateKey) {
|
|
604
|
+
if (!isOfflineProtocol(this.protocolV1) || !canEncryptAES(this.protocolV1)) {
|
|
605
|
+
throw new Error('Method not supported, required inferface: Offline, AES.');
|
|
606
|
+
}
|
|
607
|
+
// eslint-disable-next-line no-param-reassign
|
|
608
|
+
privateKey = getSecretKeyType(privateKey) === 'xpriv' ? await this.getPrivateKeyFromExtendedPrivateKey(privateKey) : privateKey;
|
|
609
|
+
return this.protocolV1.encryptAESWithSecretKey(payload, newSecretKey(privateKey, getBytesFormatV1FromV0(privateKey)));
|
|
610
|
+
}
|
|
611
|
+
async decryptAES(encryptedPayload, privateKey) {
|
|
612
|
+
if (!isOfflineProtocol(this.protocolV1) || !canEncryptAES(this.protocolV1)) {
|
|
613
|
+
throw new Error('Method not supported, required inferface: Offline, AES.');
|
|
614
|
+
}
|
|
615
|
+
// eslint-disable-next-line no-param-reassign
|
|
616
|
+
privateKey = getSecretKeyType(privateKey) === 'xpriv' ? await this.getPrivateKeyFromExtendedPrivateKey(privateKey) : privateKey;
|
|
617
|
+
return this.protocolV1.decryptAESWithSecretKey(encryptedPayload, newSecretKey(privateKey, getBytesFormatV1FromV0(privateKey)));
|
|
618
|
+
}
|
|
619
|
+
async getPrivateKeyFromExtendedPrivateKey(extendedPrivateKey, childDerivationPath) {
|
|
620
|
+
if (!isOfflineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
|
|
621
|
+
throw new Error('Method not supported, required inferface: Offline, Bip32.');
|
|
622
|
+
}
|
|
623
|
+
const secretKey = await this.deriveSecretKey(newExtendedSecretKey(extendedPrivateKey, getBytesFormatV1FromV0(extendedPrivateKey)), childDerivationPath);
|
|
624
|
+
return secretKey.value;
|
|
625
|
+
}
|
|
626
|
+
async getPublicKeyFromExtendedPrivateKey(extendedPublicKey, childDerivationPath) {
|
|
627
|
+
if (!isBip32Protocol(this.protocolV1)) {
|
|
628
|
+
throw new Error('Method not supported, required inferface: Bip32.');
|
|
629
|
+
}
|
|
630
|
+
const publicKey = await this.derivePublicKey(newExtendedPublicKey(extendedPublicKey, getBytesFormatV1FromV0(extendedPublicKey)), childDerivationPath);
|
|
631
|
+
return publicKey.value;
|
|
632
|
+
}
|
|
633
|
+
getNetwork(protocolOptions) {
|
|
634
|
+
let knownOptions;
|
|
635
|
+
try {
|
|
636
|
+
knownOptions = protocolOptions ?? getProtocolOptionsByIdentifierLegacy(this.identifier);
|
|
637
|
+
// eslint-disable-next-line no-empty
|
|
638
|
+
}
|
|
639
|
+
catch { }
|
|
640
|
+
const { name, type, rpcUrl, ...rest } = this.network ?? {};
|
|
641
|
+
return new ProtocolNetworkAdapter(name ?? knownOptions?.network.name ?? '', type ?? knownOptions?.network.type ?? 'mainnet', rpcUrl ?? knownOptions?.network.rpcUrl ?? '', this.blockExplorerV0, rest || (knownOptions?.network.extras ?? {}));
|
|
642
|
+
}
|
|
643
|
+
async deriveSecretKey(extendedSecretKey, childDerivationPath = '0/0') {
|
|
644
|
+
if (!isOfflineProtocol(this.protocolV1) || !isBip32Protocol(this.protocolV1)) {
|
|
645
|
+
throw new Error(`Protocol doesn't support secret key derivation, missing inferface: Offline, Bip32.`);
|
|
646
|
+
}
|
|
647
|
+
if (childDerivationPath.startsWith('m')) {
|
|
648
|
+
throw new Error('Received full derivation path, expected child derivation path');
|
|
649
|
+
}
|
|
650
|
+
if (childDerivationPath.toLowerCase().includes('h') || childDerivationPath.includes(`'`)) {
|
|
651
|
+
throw new Error('Child derivation path cannot include hardened children');
|
|
652
|
+
}
|
|
653
|
+
const [visibilityIndex, addressIndex] = childDerivationPath.split('/').map((index) => parseInt(index, 10));
|
|
654
|
+
return this.protocolV1.deriveFromExtendedSecretKey(extendedSecretKey, visibilityIndex, addressIndex);
|
|
655
|
+
}
|
|
656
|
+
async derivePublicKey(extendedPublicKey, childDerivationPath = '0/0') {
|
|
657
|
+
if (!isBip32Protocol(this.protocolV1)) {
|
|
658
|
+
throw new Error(`Protocol doesn't support public key derivation, missing inferface: Bip32.`);
|
|
659
|
+
}
|
|
660
|
+
if (childDerivationPath.startsWith('m')) {
|
|
661
|
+
throw new Error('Received full derivation path, expected child derivation path');
|
|
662
|
+
}
|
|
663
|
+
if (childDerivationPath.toLowerCase().includes('h') || childDerivationPath.includes(`'`)) {
|
|
664
|
+
throw new Error('Child derivation path cannot include hardened children');
|
|
665
|
+
}
|
|
666
|
+
const [visibilityIndex, addressIndex] = childDerivationPath.split('/').map((index) => parseInt(index, 10));
|
|
667
|
+
return this.protocolV1.deriveFromExtendedPublicKey(extendedPublicKey, visibilityIndex, addressIndex);
|
|
668
|
+
}
|
|
669
|
+
async getSerializerIdentifier(base) {
|
|
670
|
+
const identifier = base ?? (await this.getIdentifier());
|
|
671
|
+
return identifier.startsWith(SubProtocolSymbols.ETH_ERC20)
|
|
672
|
+
? SubProtocolSymbols.ETH_ERC20
|
|
673
|
+
: identifier.startsWith(SubProtocolSymbols.OPTIMISM_ERC20)
|
|
674
|
+
? SubProtocolSymbols.OPTIMISM_ERC20
|
|
675
|
+
: identifier;
|
|
676
|
+
}
|
|
677
|
+
async convertUnsignedTransactionV0ToV1(transaction, owner) {
|
|
678
|
+
const identifier = await this.getSerializerIdentifier(owner);
|
|
679
|
+
return this.v3SerializerCompanion.fromTransactionSignRequest(identifier, transaction);
|
|
680
|
+
}
|
|
681
|
+
async convertUnsignedTransactionV1ToV0(transaction, publicKey, callbackUrl, owner) {
|
|
682
|
+
const identifier = await this.getSerializerIdentifier(owner);
|
|
683
|
+
return this.v3SerializerCompanion.toTransactionSignRequest(identifier, transaction, publicKey, callbackUrl);
|
|
684
|
+
}
|
|
685
|
+
async convertSignedTransactionV0ToV1(transaction, owner) {
|
|
686
|
+
const identifier = await this.getSerializerIdentifier(owner);
|
|
687
|
+
return this.v3SerializerCompanion.fromTransactionSignResponse(identifier, transaction);
|
|
688
|
+
}
|
|
689
|
+
async convertSignedTransactionV1ToV0(transaction, accountIdentifier, owner) {
|
|
690
|
+
const identifier = await this.getSerializerIdentifier(owner);
|
|
691
|
+
return this.v3SerializerCompanion.toTransactionSignResponse(identifier, transaction, accountIdentifier);
|
|
692
|
+
}
|
|
693
|
+
convertFeeDefaultsV1ToV0(feeDefaults) {
|
|
694
|
+
return convertFeeDefaultsV1ToV0(feeDefaults, this.protocolMetadata);
|
|
695
|
+
}
|
|
696
|
+
async convertTransactionDetailsV1ToV0(txs) {
|
|
697
|
+
return convertTransactionDetailsV1ToV0(txs, this.protocolMetadata, this.networkV0);
|
|
698
|
+
}
|
|
699
|
+
combineTransactionDetails(recipients, values) {
|
|
700
|
+
if (recipients.length !== values.length) {
|
|
701
|
+
throw new Error('Recipients length must match values length.');
|
|
702
|
+
}
|
|
703
|
+
return recipients.map((recipient, index) => ({
|
|
704
|
+
to: recipient,
|
|
705
|
+
amount: newAmount(values[index], 'blockchain')
|
|
706
|
+
}));
|
|
707
|
+
}
|
|
708
|
+
isExtendedPublicKey(publicKey) {
|
|
709
|
+
return publicKey.startsWith('xpub') || publicKey.startsWith('ypub') || publicKey.startsWith('zpub');
|
|
710
|
+
}
|
|
711
|
+
getArbitraryData(data) {
|
|
712
|
+
const simpleArbitraryDataMetadataSchema = {
|
|
713
|
+
name: 'required',
|
|
714
|
+
maxLength: 'optional',
|
|
715
|
+
regex: 'optional'
|
|
716
|
+
};
|
|
717
|
+
return this.protocolMetadata.transaction?.arbitraryData
|
|
718
|
+
? implementsInterface(this.protocolMetadata.transaction?.arbitraryData, simpleArbitraryDataMetadataSchema)
|
|
719
|
+
? data[this.protocolMetadata.transaction.arbitraryData.name]
|
|
720
|
+
: data[this.protocolMetadata.transaction.arbitraryData.root?.name ?? this.protocolMetadata.transaction.arbitraryData.inner?.name]
|
|
721
|
+
: undefined;
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
// ICoinDelegateProtocol
|
|
725
|
+
export class ICoinDelegateProtocolAdapter extends ICoinProtocolAdapter {
|
|
726
|
+
async getDefaultDelegatee() {
|
|
727
|
+
return this.protocolV1.getDefaultDelegatee();
|
|
728
|
+
}
|
|
729
|
+
async getCurrentDelegateesForPublicKey(publicKey, data) {
|
|
730
|
+
return this.protocolV1.getCurrentDelegateesForPublicKey({ type: 'pub', value: publicKey, format: getBytesFormatV1FromV0(publicKey) }, data);
|
|
731
|
+
}
|
|
732
|
+
async getCurrentDelegateesForAddress(address, data) {
|
|
733
|
+
return this.protocolV1.getCurrentDelegateesForAddress(address, data);
|
|
734
|
+
}
|
|
735
|
+
async getDelegateeDetails(address, data) {
|
|
736
|
+
return this.protocolV1.getDelegateeDetails(address, data);
|
|
737
|
+
}
|
|
738
|
+
async isPublicKeyDelegating(publicKey, data) {
|
|
739
|
+
return this.protocolV1.isPublicKeyDelegating({ type: 'pub', value: publicKey, format: getBytesFormatV1FromV0(publicKey) }, data);
|
|
740
|
+
}
|
|
741
|
+
async isAddressDelegating(address, data) {
|
|
742
|
+
return this.protocolV1.isAddressDelegating(address, data);
|
|
743
|
+
}
|
|
744
|
+
async getDelegatorDetailsFromPublicKey(publicKey, data) {
|
|
745
|
+
return this.protocolV1.getDelegatorDetailsFromPublicKey({ type: 'pub', value: publicKey, format: getBytesFormatV1FromV0(publicKey) }, data);
|
|
746
|
+
}
|
|
747
|
+
async getDelegatorDetailsFromAddress(address, data) {
|
|
748
|
+
return this.protocolV1.getDelegatorDetailsFromAddress(address, data);
|
|
749
|
+
}
|
|
750
|
+
async getDelegationDetailsFromPublicKey(publicKey, delegatees, data) {
|
|
751
|
+
return this.protocolV1.getDelegationDetailsFromPublicKey({ type: 'pub', value: publicKey, format: getBytesFormatV1FromV0(publicKey) }, delegatees, data);
|
|
752
|
+
}
|
|
753
|
+
async getDelegationDetailsFromAddress(address, delegatees, data) {
|
|
754
|
+
return this.protocolV1.getDelegationDetailsFromAddress(address, delegatees, data);
|
|
755
|
+
}
|
|
756
|
+
async prepareDelegatorActionFromPublicKey(publicKey, type, data) {
|
|
757
|
+
const transactions = await this.protocolV1.prepareDelegatorActionFromPublicKey({ type: 'pub', value: publicKey, format: getBytesFormatV1FromV0(publicKey) }, type, data);
|
|
758
|
+
const transactionsV0 = await Promise.all(transactions.map((transaction) => this.convertUnsignedTransactionV1ToV0(transaction, publicKey)));
|
|
759
|
+
return transactionsV0.map((transaction) => transaction.transaction);
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
// ICoinSubProtocol
|
|
763
|
+
export class ICoinSubProtocolAdapter extends ICoinProtocolAdapter {
|
|
764
|
+
constructor(protocolV1, protocolMetadata, crypto, network, v1BlockExplorer, blockExplorerMetadata, v3SerializerCompanion, type, contractAddress) {
|
|
765
|
+
super(protocolV1, protocolMetadata, crypto, network, v1BlockExplorer, blockExplorerMetadata, v3SerializerCompanion);
|
|
766
|
+
this.isSubProtocol = true;
|
|
767
|
+
this.subProtocolType = type === 'account' ? SubProtocolTypeV0.ACCOUNT : SubProtocolTypeV0.TOKEN;
|
|
768
|
+
this.contractAddress = contractAddress;
|
|
769
|
+
}
|
|
770
|
+
async getIsSubProtocol() {
|
|
771
|
+
return this.isSubProtocol;
|
|
772
|
+
}
|
|
773
|
+
async getSubProtocolType() {
|
|
774
|
+
return this.subProtocolType;
|
|
775
|
+
}
|
|
776
|
+
async getContractAddress() {
|
|
777
|
+
return this.contractAddress;
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
export class ICoinDelegateSubProtocolAdapter extends ICoinSubProtocolAdapter {
|
|
781
|
+
constructor(protocolV1, protocolMetadata, crypto, network, v1BlockExplorer, blockExplorerMetadata, v3SerializerCompanion, type, contractAddress) {
|
|
782
|
+
super(protocolV1, protocolMetadata, crypto, network, v1BlockExplorer, blockExplorerMetadata, v3SerializerCompanion, type, contractAddress);
|
|
783
|
+
this.delegateProtocolAdapter = new ICoinDelegateProtocolAdapter(protocolV1, protocolMetadata, crypto, network, v1BlockExplorer, blockExplorerMetadata, v3SerializerCompanion);
|
|
784
|
+
}
|
|
785
|
+
async getDefaultDelegatee() {
|
|
786
|
+
return this.delegateProtocolAdapter.getDefaultDelegatee();
|
|
787
|
+
}
|
|
788
|
+
async getCurrentDelegateesForPublicKey(publicKey, data) {
|
|
789
|
+
return this.delegateProtocolAdapter.getCurrentDelegateesForPublicKey(publicKey, data);
|
|
790
|
+
}
|
|
791
|
+
async getCurrentDelegateesForAddress(address, data) {
|
|
792
|
+
return this.delegateProtocolAdapter.getCurrentDelegateesForAddress(address, data);
|
|
793
|
+
}
|
|
794
|
+
async getDelegateeDetails(address, data) {
|
|
795
|
+
return this.delegateProtocolAdapter.getDelegateeDetails(address, data);
|
|
796
|
+
}
|
|
797
|
+
async isPublicKeyDelegating(publicKey, data) {
|
|
798
|
+
return this.delegateProtocolAdapter.isPublicKeyDelegating(publicKey, data);
|
|
799
|
+
}
|
|
800
|
+
async isAddressDelegating(address, data) {
|
|
801
|
+
return this.delegateProtocolAdapter.isAddressDelegating(address, data);
|
|
802
|
+
}
|
|
803
|
+
async getDelegatorDetailsFromPublicKey(publicKey, data) {
|
|
804
|
+
return this.delegateProtocolAdapter.getDelegatorDetailsFromPublicKey(publicKey, data);
|
|
805
|
+
}
|
|
806
|
+
async getDelegatorDetailsFromAddress(address, data) {
|
|
807
|
+
return this.delegateProtocolAdapter.getDelegatorDetailsFromAddress(address, data);
|
|
808
|
+
}
|
|
809
|
+
async getDelegationDetailsFromPublicKey(publicKey, delegatees, data) {
|
|
810
|
+
return this.delegateProtocolAdapter.getDelegationDetailsFromPublicKey(publicKey, delegatees, data);
|
|
811
|
+
}
|
|
812
|
+
async getDelegationDetailsFromAddress(address, delegatees, data) {
|
|
813
|
+
return this.delegateProtocolAdapter.getDelegationDetailsFromAddress(address, delegatees, data);
|
|
814
|
+
}
|
|
815
|
+
async prepareDelegatorActionFromPublicKey(publicKey, type, data) {
|
|
816
|
+
return this.delegateProtocolAdapter.prepareDelegatorActionFromPublicKey(publicKey, type, data);
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
// Factories
|
|
820
|
+
export async function createICoinProtocolAdapter(protocolV1, blockExplorerV1, v3SerializerCompanion, extra = {}) {
|
|
821
|
+
const [protocolMetadata, crypto, network, blockExplorerMetadata] = await Promise.all([
|
|
822
|
+
extra.protocolMetadata ? Promise.resolve(extra.protocolMetadata) : protocolV1.getMetadata(),
|
|
823
|
+
extra.crypto
|
|
824
|
+
? Promise.resolve(extra.crypto)
|
|
825
|
+
: extra.crypto === null || !isOfflineProtocol(protocolV1) || (extra.type !== 'offline' && extra.type !== 'full')
|
|
826
|
+
? Promise.resolve(undefined)
|
|
827
|
+
: protocolV1.getCryptoConfiguration(),
|
|
828
|
+
extra.network
|
|
829
|
+
? Promise.resolve(extra.network)
|
|
830
|
+
: extra.network === null || !isOnlineProtocol(protocolV1) || (extra.type !== 'online' && extra.type !== 'full')
|
|
831
|
+
? Promise.resolve(undefined)
|
|
832
|
+
: protocolV1.getNetwork(),
|
|
833
|
+
extra.blockExplorerMetadata
|
|
834
|
+
? Promise.resolve(extra.blockExplorerMetadata)
|
|
835
|
+
: extra.blockExplorerMetadata === null || blockExplorerV1 === undefined || (extra.type !== 'online' && extra.type !== 'full')
|
|
836
|
+
? Promise.resolve(undefined)
|
|
837
|
+
: blockExplorerV1.getMetadata()
|
|
838
|
+
]);
|
|
839
|
+
if (supportsV1Delegation(protocolV1)) {
|
|
840
|
+
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
|
841
|
+
return new ICoinDelegateProtocolAdapter(protocolV1, protocolMetadata, crypto, network, blockExplorerV1, blockExplorerMetadata, v3SerializerCompanion);
|
|
842
|
+
}
|
|
843
|
+
else {
|
|
844
|
+
return new ICoinProtocolAdapter(protocolV1, protocolMetadata, crypto, network, blockExplorerV1, blockExplorerMetadata, v3SerializerCompanion);
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
// eslint-disable-next-line complexity
|
|
848
|
+
export async function createICoinSubProtocolAdapter(protocolV1, blockExplorerV1, v3SerializerCompanion, extra = {}) {
|
|
849
|
+
const [protocolMetadata, crypto, network, blockExplorerMetadata, type, contractAddress] = await Promise.all([
|
|
850
|
+
extra.protocolMetadata ? Promise.resolve(extra.protocolMetadata) : protocolV1.getMetadata(),
|
|
851
|
+
extra.crypto
|
|
852
|
+
? Promise.resolve(extra.crypto)
|
|
853
|
+
: extra.crypto === null || !isOfflineProtocol(protocolV1) || (extra?.type !== 'offline' && extra?.type !== 'full')
|
|
854
|
+
? Promise.resolve(undefined)
|
|
855
|
+
: protocolV1.getCryptoConfiguration(),
|
|
856
|
+
extra.network
|
|
857
|
+
? Promise.resolve(extra.network)
|
|
858
|
+
: extra.network === null || !isOnlineProtocol(protocolV1) || (extra?.type !== 'online' && extra?.type !== 'full')
|
|
859
|
+
? Promise.resolve(undefined)
|
|
860
|
+
: protocolV1.getNetwork(),
|
|
861
|
+
extra.blockExplorerMetadata
|
|
862
|
+
? Promise.resolve(extra.blockExplorerMetadata)
|
|
863
|
+
: extra.blockExplorerMetadata === null || blockExplorerV1 === undefined || (extra?.type !== 'online' && extra?.type !== 'full')
|
|
864
|
+
? Promise.resolve(undefined)
|
|
865
|
+
: blockExplorerV1.getMetadata(),
|
|
866
|
+
extra.subType ? Promise.resolve(extra.subType) : protocolV1.getType(),
|
|
867
|
+
extra.contractAddress
|
|
868
|
+
? Promise.resolve(extra.contractAddress)
|
|
869
|
+
: extra.contractAddress === null || !hasConfigurableContract(protocolV1)
|
|
870
|
+
? Promise.resolve(undefined)
|
|
871
|
+
: protocolV1.getContractAddress()
|
|
872
|
+
]);
|
|
873
|
+
if (supportsV1Delegation(protocolV1)) {
|
|
874
|
+
return new ICoinDelegateSubProtocolAdapter(protocolV1, protocolMetadata, crypto, network, blockExplorerV1, blockExplorerMetadata, v3SerializerCompanion, type, contractAddress);
|
|
875
|
+
}
|
|
876
|
+
else {
|
|
877
|
+
return new ICoinSubProtocolAdapter(protocolV1, protocolMetadata, crypto, network, blockExplorerV1, blockExplorerMetadata, v3SerializerCompanion, type, contractAddress);
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9jb2wtdjAtYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvcHJvdG9jb2wvYWRhcHRlci9wcm90b2NvbC12MC1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDhCQUE4QjtBQUM5Qix5Q0FBeUM7QUFDekMsT0FBTyxFQVlMLFdBQVcsSUFBSSxhQUFhLEVBQzVCLHFCQUFxQixJQUFJLHVCQUF1QixFQUNoRCxlQUFlLElBQUksaUJBQWlCLEVBR3BDLGtCQUFrQixFQUNsQixlQUFlLElBQUksaUJBQWlCLEVBRXJDLE1BQU0sNEJBQTRCLENBQUE7QUFJbkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUM3RCxPQUFPLEVBV0wsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixzQkFBc0IsRUFDdEIsZ0NBQWdDLEVBQ2hDLGNBQWMsRUFRZCx1QkFBdUIsRUFDdkIseUJBQXlCLEVBQ3pCLG1CQUFtQixFQUNuQixRQUFRLEVBQ1IsZUFBZSxFQUNmLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsZ0JBQWdCLEVBQ2hCLDBCQUEwQixFQUUxQixTQUFTLEVBQ1Qsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixZQUFZLEVBQ1osWUFBWSxFQUNaLFlBQVksRUFrQmIsTUFBTSwwQkFBMEIsQ0FBQTtBQUNqQyxPQUFPLFNBQVMsTUFBTSxjQUFjLENBQUE7QUFHcEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDNUQsT0FBTyxFQUFpRCx1QkFBdUIsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ3hJLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBQzVGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBQ3RFLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsd0JBQXdCLEVBQ3hCLCtCQUErQixFQUMvQiw4QkFBOEIsRUFDOUIsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDakIsTUFBTSwwQ0FBMEMsQ0FBQTtBQUVqRCx3QkFBd0I7QUFFeEIsTUFBTSxPQUFPLDRCQUE2QixTQUFRLHVCQUF1QjtJQUN2RSxZQUE2QixlQUFvQyxFQUFFLEdBQVc7UUFDNUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRGlCLG9CQUFlLEdBQWYsZUFBZSxDQUFxQjtJQUVqRSxDQUFDO0lBRU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFlO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN2RCxDQUFDO0lBRU0sS0FBSyxDQUFDLGtCQUFrQixDQUFDLGFBQXFCO1FBQ25ELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUNqRSxDQUFDO0lBRU0sTUFBTTtRQUNYLE9BQU87WUFDTCxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7U0FDbEMsQ0FBQTtJQUNILENBQUM7Q0FDRjtBQUVELGtCQUFrQjtBQUVsQixNQUFNLE9BQU8sc0JBQXVCLFNBQVEsaUJBQWlCO0lBQzNELFlBQ0UsSUFBWSxFQUNaLElBQXlDLEVBQ3pDLE1BQWMsRUFDZCxhQUFrRCxFQUNsRCxTQUFrQixFQUFFO1FBRXBCLE1BQU0sV0FBVyxHQUFrQixNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFxQixDQUFDO1lBQzdGLENBQUMsQ0FBRSxJQUFzQjtZQUN6QixDQUFDLENBQUMsd0JBQXdCLENBQUMsSUFBMkIsQ0FBQyxDQUFBO1FBRXpELEtBQUssQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDekQsQ0FBQztDQUNGO0FBRUQsa0JBQWtCO0FBRWxCLE1BQU0sT0FBTyxzQkFBc0I7SUFDakMsWUFBNEIsT0FBMEIsRUFBa0IsU0FBa0IsRUFBRTtRQUFoRSxZQUFPLEdBQVAsT0FBTyxDQUFtQjtRQUFrQixXQUFNLEdBQU4sTUFBTSxDQUFjO0lBQUcsQ0FBQztDQUNqRztBQUVELHVCQUF1QjtBQUV2QixNQUFNLE9BQU8sMkJBQTJCO0lBQ3RDLFlBQTZCLGtCQUEwQixFQUFtQixtQkFBZ0Q7UUFBN0YsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFRO1FBQW1CLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBNkI7SUFBRyxDQUFDO0lBRXZILEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxXQUFtQztRQUMxRSxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDdEcsQ0FBQztJQUVNLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxXQUFvQztRQUN6RSxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDdkcsQ0FBQztDQUNGO0FBRUQsZ0JBQWdCO0FBRWhCLE1BQU0sT0FBTyxvQkFBb0I7SUFzQi9CLFlBQ2tCLFVBQWEsRUFDWixnQkFBa0MsRUFDbEMsTUFBdUMsRUFDdkMsT0FBb0MsRUFDckQsZUFBZ0QsRUFDaEQscUJBQXdELEVBQ3ZDLHFCQUFrRDtRQU5uRCxlQUFVLEdBQVYsVUFBVSxDQUFHO1FBQ1oscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxXQUFNLEdBQU4sTUFBTSxDQUFpQztRQUN2QyxZQUFPLEdBQVAsT0FBTyxDQUE2QjtRQUdwQywwQkFBcUIsR0FBckIscUJBQXFCLENBQTZCO1FBRW5FLE1BQU0sS0FBSyxHQUEwQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFBO1FBQ2hFLE1BQU0sUUFBUSxHQUFXLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUE7UUFDdkQsTUFBTSxNQUFNLEdBQW1CLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUE7UUFFckQsTUFBTSxRQUFRLEdBQTBCLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxLQUFLLElBQUksZ0JBQWdCLENBQUMsS0FBSyxDQUFBO1FBQzdGLE1BQU0sV0FBVyxHQUFXLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxRQUFRLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFBO1FBQ3ZGLE1BQU0sU0FBUyxHQUFtQixRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFBO1FBRTlELE1BQU0sV0FBVyxHQUFnQixnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsUUFBUSxJQUFJO1lBQ2pFLEdBQUcsRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQztZQUNqQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUM7WUFDcEMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDO1NBQ25DLENBQUE7UUFFRCxNQUFNLFdBQVcsR0FBVyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBRTNHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQTtRQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUE2QixDQUFBO1FBRXJFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQTtRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQTtRQUNqRCxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUE7UUFDL0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFBO1FBRXhDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQTtRQUNoQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUM3RCxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUE7UUFFakQsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2hFLE1BQU0sVUFBVSxHQUFXLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNuQyxNQUFNLE1BQU0sR0FBVyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtZQUUvRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFBO1FBQy9CLENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLFVBQVUsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRWxELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLHNCQUFzQixJQUFJLElBQUksQ0FBQTtRQUMzRixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsZUFBZSxJQUFJLEtBQUssQ0FBQTtRQUM3RixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQTtRQUNyRixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsV0FBVyxJQUFJLEVBQUUsQ0FBQTtRQUVuRixJQUFJLFlBQTJDLENBQUE7UUFDL0MsSUFBSSxDQUFDO1lBQ0gsWUFBWSxHQUFHLG9DQUFvQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUE2QixDQUFDLENBQUE7WUFDeEcsb0NBQW9DO1FBQ3RDLENBQUM7UUFBQyxNQUFNLENBQUMsQ0FBQSxDQUFDO1FBRVYsSUFBSSxDQUFDLGVBQWU7WUFDbEIsZUFBZSxJQUFJLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxJQUFJLDRCQUE0QixDQUFDLGVBQWUsRUFBRSxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFBO1FBQ3JJLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUM5QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZGLENBQUM7SUFFTSxLQUFLLENBQUMsU0FBUztRQUNwQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUE7SUFDcEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQTtJQUNsQixDQUFDO0lBRU0sS0FBSyxDQUFDLGVBQWU7UUFDMUIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFBO0lBQzFCLENBQUM7SUFFTSxLQUFLLENBQUMsY0FBYztRQUN6QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUE7SUFDekIsQ0FBQztJQUVNLEtBQUssQ0FBQyxZQUFZO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQTtJQUN2QixDQUFDO0lBRU0sS0FBSyxDQUFDLGNBQWM7UUFDekIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFBO0lBQ3pCLENBQUM7SUFFTSxLQUFLLENBQUMsV0FBVztRQUN0QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUE7SUFDdEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxjQUFjO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQTtJQUN6QixDQUFDO0lBRU0sS0FBSyxDQUFDLGFBQWE7UUFDeEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFBO0lBQ3hCLENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUTtRQUNuQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUE7SUFDbkIsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQTtJQUN4QixDQUFDO0lBRU0sS0FBSyxDQUFDLHlCQUF5QjtRQUNwQyxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQTtJQUNwQyxDQUFDO0lBRU0sS0FBSyxDQUFDLHlCQUF5QjtRQUNwQyxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQTtJQUNwQyxDQUFDO0lBRU0sS0FBSyxDQUFDLDJCQUEyQjtRQUN0QyxPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQTtJQUN0QyxDQUFDO0lBRU0sS0FBSyxDQUFDLHFCQUFxQjtRQUNoQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQTtJQUNoQyxDQUFDO0lBRU0sS0FBSyxDQUFDLFVBQVU7UUFDckIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3JCLENBQUM7SUFFTSxLQUFLLENBQUMsOEJBQThCLENBQUMsT0FBZTtRQUN6RCxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFBO1FBQ25FLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3JELENBQUM7SUFFTSxLQUFLLENBQUMsMkJBQTJCLENBQUMsSUFBWTtRQUNuRCxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFBO1FBQ25FLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDdEQsQ0FBQztJQUVNLEtBQUssQ0FBQyw0QkFBNEIsQ0FDdkMsU0FBaUIsRUFDakIsS0FBYSxFQUNiLE1BQW1DO1FBRW5DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUE7UUFDdEUsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFpQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsMkJBQTJCLENBQ2xHLFlBQVksQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUMsRUFDMUQsS0FBSyxFQUNMLE1BQTJCLENBQzVCLENBQUE7UUFFRCxPQUFPO1lBQ0wsWUFBWSxFQUFFLE1BQU0sSUFBSSxDQUFDLCtCQUErQixDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7WUFDbkYsTUFBTTtTQUNQLENBQUE7SUFDSCxDQUFDO0lBRU0sS0FBSyxDQUFDLG9DQUFvQyxDQUMvQyxpQkFBeUIsRUFDekIsS0FBYSxFQUNiLE1BQW1DO1FBRW5DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDNUUsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFBO1FBQzdFLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBaUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLDJCQUEyQixDQUNsRyxvQkFBb0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQ2xGLEtBQUssRUFDTCxNQUEyQixDQUM1QixDQUFBO1FBRUQsT0FBTztZQUNMLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDO1lBQ25GLE1BQU07U0FDUCxDQUFBO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyw0QkFBNEIsQ0FDdkMsU0FBbUIsRUFDbkIsS0FBYSxFQUNiLE1BQW1DO1FBRW5DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLHNHQUFzRyxDQUFDLENBQUE7UUFDekgsQ0FBQztRQUVELElBQUksWUFBMEMsQ0FBQTtRQUM5QyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3RFLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUEyQixDQUFDLENBQUE7UUFDbEgsQ0FBQzthQUFNLElBQUksZ0NBQWdDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDN0QsNkRBQTZEO1lBQzdELFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsMkJBQTJCLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUEyQixDQUFDLENBQUE7UUFDakgsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLHNHQUFzRyxDQUFDLENBQUE7UUFDekgsQ0FBQztRQUVELE9BQU87WUFDTCxZQUFZLEVBQUUsTUFBTSxJQUFJLENBQUMsK0JBQStCLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztZQUNuRixNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTTtTQUMzRCxDQUFBO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxTQUFtQixFQUFFLEtBQWtDO1FBQ3hGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLHNHQUFzRyxDQUFDLENBQUE7UUFDekgsQ0FBQztRQUVELElBQUksT0FBZ0IsQ0FBQTtRQUNwQixJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3RFLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDbkUsQ0FBQzthQUFNLElBQUksZ0NBQWdDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDN0QsNkRBQTZEO1lBQzdELE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDbEUsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLHNHQUFzRyxDQUFDLENBQUE7UUFDekgsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQTtJQUMvRSxDQUFDO0lBRU0sS0FBSyxDQUFDLHFCQUFxQixDQUNoQyxTQUFpQixFQUNqQixJQUEwRTtRQUUxRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFBO1FBQ3RFLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBYyxZQUFZLENBQUMsU0FBUyxFQUFFLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUE7UUFFekYsTUFBTSxPQUFPLEdBQ1gsSUFBSSxFQUFFLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3ZELENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyRixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRTlELE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQTtJQUMvRSxDQUFDO0lBRU0sS0FBSyxDQUFDLDZCQUE2QixDQUN4QyxpQkFBeUIsRUFDekIsT0FBZSxFQUNmLElBQW1EO1FBRW5ELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDNUUsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFBO1FBQzdFLENBQUM7UUFFRCxNQUFNLG1CQUFtQixHQUFzQixvQkFBb0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUE7UUFFakksTUFBTSxPQUFPLEdBQ1gsSUFBSSxFQUFFLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3ZELENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdGLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUV0RSxPQUFPLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUE7SUFDL0UsQ0FBQztJQUVNLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxTQUFtQixFQUFFLEtBQWtDO1FBQ2pHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLHNHQUFzRyxDQUFDLENBQUE7UUFDekgsQ0FBQztRQUVELElBQUksT0FBZ0IsQ0FBQTtRQUNwQixJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3RFLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDbkUsQ0FBQzthQUFNLElBQUksZ0NBQWdDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDN0QsNkRBQTZEO1lBQzdELE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDbEUsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLHNHQUFzRyxDQUFDLENBQUE7UUFDekgsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFBO0lBQ3ZHLENBQUM7SUFFTSxLQUFLLENBQUMsc0JBQXNCLENBQUMsZUFBeUI7UUFDM0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3ZGLE1BQU0sSUFBSSxLQUFLLENBQUMsNkVBQTZFLENBQUMsQ0FBQTtRQUNoRyxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQTRDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUVySCxPQUFPLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRTtZQUMxQyxNQUFNLE1BQU0sR0FBNEIsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBRXRELE9BQU8sOEJBQThCLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDL0MsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRU0sS0FBSyxDQUFDLG9DQUFvQyxDQUFDLFVBQWtCLEVBQUUsYUFBaUM7UUFDckcsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO0lBQzFDLENBQUM7SUFFTSxLQUFLLENBQUMsZ0RBQWdELENBQzNELGlCQUF5QixFQUN6QixVQUFvQixFQUNwQixHQUFZLEVBQ1osSUFBaUM7UUFFakMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM1RSxNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUE7UUFDN0UsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFXLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxvQ0FBb0MsQ0FDbEYsb0JBQW9CLENBQUMsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUNsRixVQUFVLEVBQ1Y7WUFDRSxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQztZQUMxQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1NBQ3BELENBQ0YsQ0FBQTtRQUVELE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFBO0lBQzNFLENBQUM7SUFFTSxLQUFLLENBQUMsd0NBQXdDLENBQ25ELFNBQWlCLEVBQ2pCLFVBQW9CLEVBQ3BCLEdBQVksRUFDWixJQUF3RDtRQUV4RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFBO1FBQ3RFLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBVyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsb0NBQW9DLENBQ2xGLFlBQVksQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUMsRUFDMUQsVUFBVSxFQUNWO1lBQ0UsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNuRCxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQztTQUMzQyxDQUNGLENBQUE7UUFFRCxPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQTtJQUMzRSxDQUFDO0lBRU0sS0FBSyxDQUFDLHdDQUF3QyxDQUNuRCxTQUFpQixFQUNqQixVQUFvQixFQUNwQixNQUFnQixFQUNoQixJQUtDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM1RSxNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUE7UUFDN0UsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUE4QixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsOEJBQThCLENBQ25HLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUNsRSxJQUFJLENBQUMseUJBQXlCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxFQUNsRDtZQUNFLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1lBQzFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUNoRSxDQUNGLENBQUE7UUFFRCxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLGtFQUFrRSxDQUFDLENBQUE7UUFDckYsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFnQixRQUFRLENBQUMsYUFBYSxDQUFDO1lBQ3RELENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFO1lBQ3BFLENBQUMsQ0FBQyxhQUFhLENBQUE7UUFFakIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDbkQsQ0FBQztJQUVNLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FDM0MsU0FBaUIsRUFDakIsVUFBb0IsRUFDcEIsTUFBZ0IsRUFDaEIsSUFLQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUE7UUFDdEUsQ0FBQztRQUVELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFBO1FBQ2hFLENBQUM7UUFFRCxNQUFNLGtCQUFrQixHQUF5QixVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBaUIsRUFBRSxLQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDckcsRUFBRSxFQUFFLFNBQVM7WUFDYixNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxZQUFZLENBQUM7U0FDL0MsQ0FBQyxDQUFDLENBQUE7UUFFSCxNQUFNLGFBQWEsR0FBOEIsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLDhCQUE4QixDQUNuRyxZQUFZLENBQUMsU0FBUyxFQUFFLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQzFELGtCQUFrQixFQUNsQjtZQUNFLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1lBQzFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUNoRSxDQUNGLENBQUE7UUFFRCxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUE7UUFDN0UsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFnQixRQUFRLENBQUMsYUFBYSxDQUFDO1lBQ3RELENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFO1lBQ3BFLENBQUMsQ0FBQyxhQUFhLENBQUE7UUFFakIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDbkQsQ0FBQztJQUVNLEtBQUssQ0FBQyx1Q0FBdUMsQ0FDbEQsaUJBQXlCLEVBQ3pCLE9BQWUsRUFDZixVQUFvQixFQUNwQixNQUFnQixFQUNoQixHQUFXLEVBQ1gsTUFTQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDNUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFBO1FBQ3RFLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBRyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDekQsTUFBTSxTQUFTLEdBQUcsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRTNELElBQUksV0FBZ0MsQ0FBQTtRQUNwQyxJQUFJLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUMxQixXQUFXLEdBQUcsTUFBTSxDQUFDLFFBQVE7Z0JBQzNCLENBQUMsQ0FBRSxJQUFJLENBQUMsVUFBb0M7Z0JBQzVDLENBQUMsQ0FBRSxJQUFJLENBQUMsVUFBcUMsQ0FDOUMsQ0FBQywrQkFBK0IsQ0FDL0Isb0JBQW9CLENBQUMsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUNsRixJQUFJLENBQUMseUJBQXlCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxFQUNsRDtnQkFDRSxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUM7Z0JBQ2pDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO2dCQUM1QyxpQkFBaUIsRUFBRTtvQkFDakIsTUFBTSxFQUFFLEtBQUs7b0JBQ2IsS0FBSyxFQUFFLE1BQU0sRUFBRSxpQkFBaUI7aUJBQ2pDO2dCQUNELFlBQVksRUFBRSxNQUFNLEVBQUUsWUFBWTthQUNuQyxDQUNGLENBQUE7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsK0JBQStCLENBQ2pFLG9CQUFvQixDQUFDLGlCQUFpQixFQUFFLHNCQUFzQixDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFDbEYsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsRUFDbEQ7Z0JBQ0UsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDO2dCQUNqQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7Z0JBQ25FLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO2FBQzdDLENBQ0YsQ0FBQTtRQUNILENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtRQUVqRyxPQUFPLGFBQWEsQ0FBQyxXQUFXLENBQUE7SUFDbEMsQ0FBQztJQUVNLEtBQUssQ0FBQywrQkFBK0IsQ0FDMUMsU0FBaUIsRUFDakIsVUFBb0IsRUFDcEIsTUFBZ0IsRUFDaEIsR0FBVyxFQUNYLE1BS0M7UUFFRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFBO1FBQ3RFLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBd0IsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLCtCQUErQixDQUM1RixZQUFZLENBQUMsU0FBUyxFQUFFLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQzFELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEVBQ2xEO1lBQ0UsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDO1lBQ2pDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO1lBQzVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUNwRSxDQUNGLENBQUE7UUFFRCxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFFekYsT0FBTyxhQUFhLENBQUMsV0FBVyxDQUFBO0lBQ2xDLENBQUM7SUFFTSxLQUFLLENBQUMsb0JBQW9CLENBQUMsY0FBbUI7UUFDbkQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQTtRQUN0RSxDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsRUFBRSxDQUFBO1FBQzFFLE1BQU0sTUFBTSxHQUFzQixNQUFNLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUV4RixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDckQsQ0FBQztJQUVNLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxTQUFpQixFQUFFLE9BQWdDO1FBQ3RGLE1BQU0sT0FBTyxHQUErQixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQ3ZGLFlBQVksQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FDM0QsQ0FBQTtRQUVELE9BQU87WUFDTCxPQUFPLEVBQUUsT0FBTyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPO1lBQ2hFLE1BQU0sRUFBRSxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRTtTQUMxRSxDQUFBO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxTQUFpQixFQUFFLE9BQWdDO1FBQ3hGLElBQUkseUJBQXlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDL0MsTUFBTSxFQUFFLEdBQWMsWUFBWSxDQUFDLFNBQVMsRUFBRSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFBO1lBQ2hGLE1BQU0sU0FBUyxHQUF3QixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsZ0NBQWdDLENBQUMsRUFBRSxDQUFDLENBQUE7WUFFakcsT0FBTyxTQUFTLENBQUE7UUFDbEIsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtRQUN4RCxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQywrQkFBK0IsQ0FDMUMsaUJBQXlCLEVBQ3pCLHlCQUFpQyxFQUNqQyxzQkFBOEI7UUFFOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUE7UUFDckUsQ0FBQztRQUVELE1BQU0sZ0JBQWdCLEdBQWMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLDJCQUEyQixDQUNuRixvQkFBb0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQ2xGLHlCQUF5QixFQUN6QixzQkFBc0IsQ0FDdkIsQ0FBQTtRQUVELE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQzdELENBQUM7SUFFTSxLQUFLLENBQUMsaUNBQWlDLENBQzVDLGlCQUF5QixFQUN6Qix5QkFBaUMsRUFDakMsWUFBb0IsRUFDcEIsTUFBYztRQUVkLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFBO1FBQ3JFLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFBO1FBRWhGLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FDaEIsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLHNCQUE4QixFQUFFLEVBQUUsQ0FDcEQsSUFBSSxDQUFDLCtCQUErQixDQUFDLGlCQUFpQixFQUFFLHlCQUF5QixFQUFFLHNCQUFzQixDQUFDLENBQzNHLENBQ0YsQ0FBQTtJQUNILENBQUM7SUFFTSxLQUFLLENBQUMscUJBQXFCLENBQ2hDLFdBQWtDLEVBQ2xDLElBTUM7UUFFRCxNQUFNLFFBQVEsR0FBd0IsTUFBTSxJQUFJLENBQUMsZ0NBQWdDLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO1FBRXRILElBQUksWUFBaUMsQ0FBQTtRQUNyQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUE7WUFDckUsQ0FBQztZQUVELFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQzVELFFBQVEsRUFDUixvQkFBb0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUMzRixDQUFBO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLFNBQVMsR0FBYyxZQUFZLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQTtZQUMvRyxZQUFZO2dCQUNWLElBQUksRUFBRSxnQkFBZ0IsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO29CQUMvRCxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLHlCQUF5QixDQUFDLFFBQWUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDO29CQUNwRyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQTtRQUM1RSxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQXlCLE1BQU0sSUFBSSxDQUFDLCtCQUErQixDQUFDLFlBQVksQ0FBQyxDQUFBO1FBRXJHLE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FDdkIsQ0FBQyxFQUFzQixFQUFzQixFQUFFLENBQUMsQ0FBQztZQUMvQyxHQUFHLEVBQUU7WUFDTCxrQkFBa0IsRUFBRSxFQUFFLENBQUMsa0JBQWtCLElBQUksV0FBVyxDQUFDLFdBQVc7U0FDckUsQ0FBQyxDQUNILENBQUE7SUFDSCxDQUFDO0lBRU0sS0FBSyxDQUFDLCtCQUErQixDQUMxQyxXQUFnQyxFQUNoQyxJQU1DO1FBRUQsTUFBTSxNQUFNLEdBQXNCLE1BQU0sSUFBSSxDQUFDLDhCQUE4QixDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQTtRQUVoSCxJQUFJLFlBQWlDLENBQUE7UUFDckMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUM1RCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUE7WUFDckUsQ0FBQztZQUVELFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQzVELE1BQU0sRUFDTixvQkFBb0IsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FDM0csQ0FBQTtRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxTQUFTLEdBQWMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFBO1lBQy9ILFlBQVk7Z0JBQ1YsSUFBSSxFQUFFLGdCQUFnQixJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7b0JBQy9ELENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsTUFBYSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUM7b0JBQ2xHLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQzFFLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBeUIsTUFBTSxJQUFJLENBQUMsK0JBQStCLENBQUMsWUFBWSxDQUFDLENBQUE7UUFFckcsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUN2QixDQUFDLEVBQXNCLEVBQXNCLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLEdBQUcsRUFBRTtZQUNMLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsSUFBSSxXQUFXLENBQUMsV0FBVztTQUNyRSxDQUFDLENBQ0gsQ0FBQTtJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQWUsRUFBRSxTQUFpQixFQUFFLFNBQWlCO1FBQzlFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDNUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRUFBaUUsQ0FBQyxDQUFBO1FBQ3BGLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsMEJBQTBCLENBQy9DLE9BQU8sRUFDUCxZQUFZLENBQUMsU0FBUyxFQUFFLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQzFELFlBQVksQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FDM0QsQ0FBQTtJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBZSxFQUFFLFNBQWlCO1FBQy9ELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNsRixNQUFNLElBQUksS0FBSyxDQUFDLDBFQUEwRSxDQUFDLENBQUE7UUFDN0YsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDNUgsQ0FBQztJQUVNLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxRQUFnQixFQUFFLGNBQXNCLEVBQUUsUUFBaUI7UUFDL0YsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQTtRQUN2RSxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQXdCLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFBO1FBQ25HLE1BQU0sSUFBSSxHQUFXLE1BQU0sY0FBYyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFFckUsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQTtJQUM3RSxDQUFDO0lBRU0sS0FBSyxDQUFDLHlCQUF5QixDQUFDLFFBQWdCLEVBQUUsY0FBc0IsRUFBRSxRQUFpQjtRQUNoRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDeEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFBO1FBQ3ZFLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBd0IsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUE7UUFDbkcsTUFBTSxJQUFJLEdBQVcsTUFBTSxjQUFjLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUVyRSxPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBQzlFLENBQUM7SUFFTSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsUUFBZ0IsRUFBRSxjQUFzQixFQUFFLFFBQWlCO1FBQ3ZHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDN0UsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFBO1FBQzlFLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBd0IsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUE7UUFDbkcsTUFBTSxJQUFJLEdBQVcsTUFBTSxjQUFjLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUVyRSxPQUFPLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBQ3JGLENBQUM7SUFFTSxLQUFLLENBQUMsaUNBQWlDLENBQUMsUUFBZ0IsRUFBRSxjQUFzQixFQUFFLFFBQWlCO1FBQ3hHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDN0UsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFBO1FBQzlFLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBd0IsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUE7UUFDbkcsTUFBTSxJQUFJLEdBQVcsTUFBTSxjQUFjLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtRQUVyRSxPQUFPLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFBO0lBQ3RGLENBQUM7SUFFTSxLQUFLLENBQUMseUJBQXlCLENBQUMsTUFBYyxFQUFFLGNBQXNCO1FBQzNFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUE7UUFDOUUsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUF3QixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQTtRQUNuRyxNQUFNLFVBQVUsR0FBcUIsTUFBTSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFBO1FBQ3JHLE1BQU0sT0FBTyxHQUFZLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUVuRixPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFBO0lBQ2hDLENBQUM7SUFFTSxLQUFLLENBQUMsMEJBQTBCLENBQUMsTUFBYyxFQUFFLGNBQXNCO1FBQzVFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUE7UUFDdkUsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUF3QixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQTtRQUNuRyxNQUFNLFVBQVUsR0FBcUIsTUFBTSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFBO1FBQ3JHLE1BQU0sT0FBTyxHQUFZLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUVuRixPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFBO0lBQ2hDLENBQUM7SUFFTSxLQUFLLENBQUMsaUNBQWlDLENBQUMsTUFBYyxFQUFFLGNBQXNCO1FBQ25GLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDN0UsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFBO1FBQzlFLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBd0IsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUE7UUFDbkcsTUFBTSxVQUFVLEdBQXFCLE1BQU0sTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQTtRQUNyRyxNQUFNLE9BQU8sR0FBb0IsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLGdDQUFnQyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRW5HLE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUE7SUFDaEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxNQUFjLEVBQUUsY0FBc0I7UUFDcEYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM3RSxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUE7UUFDOUUsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUF3QixJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQTtRQUNuRyxNQUFNLFVBQVUsR0FBcUIsTUFBTSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFBO1FBQ3JHLE1BQU0sT0FBTyxHQUFvQixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsZ0NBQWdDLENBQUMsVUFBVSxDQUFDLENBQUE7UUFFbkcsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQTtJQUNoQyxDQUFDO0lBRU0sS0FBSyxDQUFDLDBCQUEwQixDQUFDLGtCQUEwQixFQUFFLFdBQWdCLEVBQUUsbUJBQTRCO1FBQ2hILElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDN0UsTUFBTSxJQUFJLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFBO1FBQzlFLENBQUM7UUFFRCxNQUFNLFFBQVEsR0FBd0IsTUFBTSxJQUFJLENBQUMsZ0NBQWdDLENBQUM7WUFDaEYsV0FBVztZQUNYLFNBQVMsRUFBRSxFQUFFO1NBQ2QsQ0FBQyxDQUFBO1FBRUYsTUFBTSxpQkFBaUIsR0FBc0Isb0JBQW9CLENBQUMsa0JBQWtCLEVBQUUsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFBO1FBRWpJLE1BQU0sU0FBUyxHQUFrQyxtQkFBbUI7WUFDbEUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQztZQUNwRSxDQUFDLENBQUMsaUJBQWlCLENBQUE7UUFFckIsTUFBTSxNQUFNLEdBQXNCLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyw0QkFBNEIsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDekcsTUFBTSxRQUFRLEdBQTRCLE1BQU0sSUFBSSxDQUFDLDhCQUE4QixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUUvRixPQUFPLFFBQVEsQ0FBQyxXQUFXLENBQUE7SUFDN0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxVQUFrQixFQUFFLFdBQWdCO1FBQ2xFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUE7UUFDdkUsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUF3QixNQUFNLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQztZQUNoRixXQUFXO1lBQ1gsU0FBUyxFQUFFLEVBQUU7U0FDZCxDQUFDLENBQUE7UUFFRixNQUFNLE1BQU0sR0FBc0IsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLDRCQUE0QixDQUNsRixRQUFRLEVBQ1IsWUFBWSxDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUM3RCxDQUFBO1FBQ0QsTUFBTSxRQUFRLEdBQTRCLE1BQU0sSUFBSSxDQUFDLDhCQUE4QixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUUvRixPQUFPLFFBQVEsQ0FBQyxXQUFXLENBQUE7SUFDN0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBZSxFQUFFLE9BQW1EO1FBQzNGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDNUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpRUFBaUUsQ0FBQyxDQUFBO1FBQ3BGLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FDZCxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssT0FBTztZQUM5QyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsbUNBQW1DLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztZQUNwRSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQTtRQUV4QixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUztZQUNqQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLE1BQU07Z0JBQzlDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO2dCQUNsRSxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVM7WUFDckIsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUVOLE1BQU0sU0FBUyxHQUFjLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUU7WUFDakYsU0FBUyxFQUFFLFlBQVksQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdkUsU0FBUyxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdEUsQ0FBQyxDQUFBO1FBRUYsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFBO0lBQ3hCLENBQUM7SUFFTSxLQUFLLENBQUMsaUJBQWlCLENBQUMsZ0JBQXdCLEVBQUUsT0FBbUQ7UUFDMUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ2xGLE1BQU0sSUFBSSxLQUFLLENBQUMsMEVBQTBFLENBQUMsQ0FBQTtRQUM3RixDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQ2QsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLE9BQU87WUFDOUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLG1DQUFtQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDcEUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUE7UUFFeEIsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVM7WUFDakMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsS0FBSyxNQUFNO2dCQUM5QyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsa0NBQWtDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztnQkFDbEUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTO1lBQ3JCLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFFTixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsNEJBQTRCLENBQUMsZ0JBQWdCLEVBQUU7WUFDcEUsU0FBUyxFQUFFLFlBQVksQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdkUsU0FBUyxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdEUsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBZSxFQUFFLFVBQWtCO1FBQ3pELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDM0UsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFBO1FBQzVFLENBQUM7UUFFRCw2Q0FBNkM7UUFDN0MsVUFBVSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsbUNBQW1DLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQTtRQUUvSCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3ZILENBQUM7SUFFTSxLQUFLLENBQUMsVUFBVSxDQUFDLGdCQUF3QixFQUFFLFVBQWtCO1FBQ2xFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDM0UsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFBO1FBQzVFLENBQUM7UUFFRCw2Q0FBNkM7UUFDN0MsVUFBVSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsbUNBQW1DLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQTtRQUUvSCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLFVBQVUsRUFBRSxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDaEksQ0FBQztJQUVNLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxrQkFBMEIsRUFBRSxtQkFBNEI7UUFDdkcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM3RSxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUE7UUFDOUUsQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFjLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FDckQsb0JBQW9CLENBQUMsa0JBQWtCLEVBQUUsc0JBQXNCLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUNwRixtQkFBbUIsQ0FDcEIsQ0FBQTtRQUVELE9BQU8sU0FBUyxDQUFDLEtBQUssQ0FBQTtJQUN4QixDQUFDO0lBRU0sS0FBSyxDQUFDLGtDQUFrQyxDQUFDLGlCQUF5QixFQUFFLG1CQUE0QjtRQUNyRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQTtRQUNyRSxDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQWMsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUNyRCxvQkFBb0IsQ0FBQyxpQkFBaUIsRUFBRSxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQ2xGLG1CQUFtQixDQUNwQixDQUFBO1FBRUQsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFBO0lBQ3hCLENBQUM7SUFFUyxVQUFVLENBQUMsZUFBbUM7UUFDdEQsSUFBSSxZQUEyQyxDQUFBO1FBQy9DLElBQUksQ0FBQztZQUNILFlBQVksR0FBRyxlQUFlLElBQUksb0NBQW9DLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQ3ZGLG9DQUFvQztRQUN0QyxDQUFDO1FBQUMsTUFBTSxDQUFDLENBQUEsQ0FBQztRQUVWLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFBO1FBRTFELE9BQU8sSUFBSSxzQkFBc0IsQ0FDL0IsSUFBSSxJQUFJLFlBQVksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFDeEMsSUFBSSxJQUFJLFlBQVksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLFNBQVMsRUFDL0MsTUFBTSxJQUFJLFlBQVksRUFBRSxPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUUsRUFDNUMsSUFBSSxDQUFDLGVBQWUsRUFDcEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQzdDLENBQUE7SUFDSCxDQUFDO0lBRVMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxpQkFBb0MsRUFBRSxzQkFBOEIsS0FBSztRQUN2RyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzdFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0ZBQW9GLENBQUMsQ0FBQTtRQUN2RyxDQUFDO1FBRUQsSUFBSSxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLCtEQUErRCxDQUFDLENBQUE7UUFDbEYsQ0FBQztRQUVELElBQUksbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pGLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQTtRQUMzRSxDQUFDO1FBRUQsTUFBTSxDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUMsR0FBYSxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFFNUgsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLDJCQUEyQixDQUFDLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUN0RyxDQUFDO0lBRVMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxpQkFBb0MsRUFBRSxzQkFBOEIsS0FBSztRQUN2RyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkVBQTJFLENBQUMsQ0FBQTtRQUM5RixDQUFDO1FBRUQsSUFBSSxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLCtEQUErRCxDQUFDLENBQUE7UUFDbEYsQ0FBQztRQUVELElBQUksbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pGLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQTtRQUMzRSxDQUFDO1FBRUQsTUFBTSxDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUMsR0FBYSxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFFNUgsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLDJCQUEyQixDQUFDLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxZQUFZLENBQUMsQ0FBQTtJQUN0RyxDQUFDO0lBRVMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLElBQWE7UUFDbkQsTUFBTSxVQUFVLEdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQTtRQUUvRCxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDO1lBQ3hELENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTO1lBQzlCLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQztnQkFDMUQsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLGNBQWM7Z0JBQ25DLENBQUMsQ0FBQyxVQUFVLENBQUE7SUFDaEIsQ0FBQztJQUVNLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxXQUFtQyxFQUFFLEtBQWM7UUFDL0YsTUFBTSxVQUFVLEdBQVcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFcEUsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsMEJBQTBCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQ3ZGLENBQUM7SUFFTSxLQUFLLENBQUMsZ0NBQWdDLENBQzNDLFdBQWdDLEVBQ2hDLFNBQWlCLEVBQ2pCLFdBQW9CLEVBQ3BCLEtBQWM7UUFFZCxNQUFNLFVBQVUsR0FBVyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUVwRSxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUM3RyxDQUFDO0lBRU0sS0FBSyxDQUFDLDhCQUE4QixDQUFDLFdBQW9DLEVBQUUsS0FBYztRQUM5RixNQUFNLFVBQVUsR0FBVyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUVwRSxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDeEYsQ0FBQztJQUVNLEtBQUssQ0FBQyw4QkFBOEIsQ0FDekMsV0FBOEIsRUFDOUIsaUJBQXlCLEVBQ3pCLEtBQWM7UUFFZCxNQUFNLFVBQVUsR0FBVyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUVwRSxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixDQUFDLENBQUE7SUFDekcsQ0FBQztJQUVNLHdCQUF3QixDQUFDLFdBQXdCO1FBQ3RELE9BQU8sd0JBQXdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBQ3JFLENBQUM7SUFFTSxLQUFLLENBQUMsK0JBQStCLENBQUMsR0FBd0I7UUFDbkUsT0FBTywrQkFBK0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNwRixDQUFDO0lBRVMseUJBQXlCLENBQXdCLFVBQW9CLEVBQUUsTUFBZ0I7UUFDL0YsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUE7UUFDaEUsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQWlCLEVBQUUsS0FBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzNELEVBQUUsRUFBRSxTQUFTO1lBQ2IsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsWUFBWSxDQUFDO1NBQy9DLENBQUMsQ0FBQyxDQUFBO0lBQ0wsQ0FBQztJQUVTLG1CQUFtQixDQUFDLFNBQWlCO1FBQzdDLE9BQU8sU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDckcsQ0FBQztJQUVTLGdCQUFnQixDQUFDLElBQVM7UUFDbEMsTUFBTSxpQ0FBaUMsR0FBcUQ7WUFDMUYsSUFBSSxFQUFFLFVBQVU7WUFDaEIsU0FBUyxFQUFFLFVBQVU7WUFDckIsS0FBSyxFQUFFLFVBQVU7U0FDbEIsQ0FBQTtRQUVELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxhQUFhO1lBQ3JELENBQUMsQ0FBQyxtQkFBbUIsQ0FDakIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQ2hELGlDQUFpQyxDQUNsQztnQkFDRCxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztnQkFDNUQsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7WUFDbkksQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNmLENBQUM7Q0FDRjtBQUVELHdCQUF3QjtBQUV4QixNQUFNLE9BQU8sNEJBQ1gsU0FBUSxvQkFBdUI7SUFHeEIsS0FBSyxDQUFDLG1CQUFtQjtRQUM5QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtJQUM5QyxDQUFDO0lBRU0sS0FBSyxDQUFDLGdDQUFnQyxDQUFDLFNBQWlCLEVBQUUsSUFBVTtRQUN6RSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsZ0NBQWdDLENBQ3JELEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUM1RSxJQUFJLENBQ0wsQ0FBQTtJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsOEJBQThCLENBQUMsT0FBZSxFQUFFLElBQVU7UUFDckUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUN0RSxDQUFDO0lBRU0sS0FBSyxDQUFDLG1CQUFtQixDQUFDLE9BQWUsRUFBRSxJQUFVO1FBQzFELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVNLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxTQUFpQixFQUFFLElBQVU7UUFDOUQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ2xJLENBQUM7SUFFTSxLQUFLLENBQUMsbUJBQW1CLENBQUMsT0FBZSxFQUFFLElBQVU7UUFDMUQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUMzRCxDQUFDO0lBRU0sS0FBSyxDQUFDLGdDQUFnQyxDQUFDLFNBQWlCLEVBQUUsSUFBVTtRQUN6RSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsZ0NBQWdDLENBQ3JELEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUM1RSxJQUFJLENBQ0wsQ0FBQTtJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsOEJBQThCLENBQUMsT0FBZSxFQUFFLElBQVU7UUFDckUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUN0RSxDQUFDO0lBRU0sS0FBSyxDQUFDLGlDQUFpQyxDQUFDLFNBQWlCLEVBQUUsVUFBb0IsRUFBRSxJQUFVO1FBQ2hHLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQ0FBaUMsQ0FDdEQsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQzVFLFVBQVUsRUFDVixJQUFJLENBQ0wsQ0FBQTtJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsK0JBQStCLENBQUMsT0FBZSxFQUFFLFVBQW9CLEVBQUUsSUFBVTtRQUM1RixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsK0JBQStCLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUNuRixDQUFDO0lBRU0sS0FBSyxDQUFDLG1DQUFtQyxDQUFDLFNBQWlCLEVBQUUsSUFBUyxFQUFFLElBQVU7UUFDdkYsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLG1DQUFtQyxDQUM1RSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsc0JBQXNCLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFDNUUsSUFBSSxFQUNKLElBQUksQ0FDTCxDQUFBO1FBRUQsTUFBTSxjQUFjLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUN0QyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQ2pHLENBQUE7UUFFRCxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUNyRSxDQUFDO0NBQ0Y7QUFFRCxtQkFBbUI7QUFFbkIsTUFBTSxPQUFPLHVCQUNYLFNBQVEsb0JBQXVCO0lBTy9CLFlBQ0UsVUFBYSxFQUNiLGdCQUFrQyxFQUNsQyxNQUF1QyxFQUN2QyxPQUFvQyxFQUNwQyxlQUFnRCxFQUNoRCxxQkFBd0QsRUFDeEQscUJBQWtELEVBQ2xELElBQXFCLEVBQ3JCLGVBQW1DO1FBRW5DLEtBQUssQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUscUJBQXFCLEVBQUUscUJBQXFCLENBQUMsQ0FBQTtRQWZyRyxrQkFBYSxHQUFZLElBQUksQ0FBQTtRQWlCM0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQTtRQUMvRixJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQTtJQUN4QyxDQUFDO0lBRU0sS0FBSyxDQUFDLGdCQUFnQjtRQUMzQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUE7SUFDM0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxrQkFBa0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFBO0lBQzdCLENBQUM7SUFFTSxLQUFLLENBQUMsa0JBQWtCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQTtJQUM3QixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sK0JBR1gsU0FBUSx1QkFBMEI7SUFLbEMsWUFDRSxVQUFhLEVBQ2IsZ0JBQWtDLEVBQ2xDLE1BQXVDLEVBQ3ZDLE9BQW9DLEVBQ3BDLGVBQWdELEVBQ2hELHFCQUF3RCxFQUN4RCxxQkFBa0QsRUFDbEQsSUFBcUIsRUFDckIsZUFBbUM7UUFFbkMsS0FBSyxDQUNILFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsTUFBTSxFQUNOLE9BQU8sRUFDUCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixJQUFJLEVBQ0osZUFBZSxDQUNoQixDQUFBO1FBRUQsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksNEJBQTRCLENBQzdELFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsTUFBTSxFQUNOLE9BQU8sRUFDUCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLHFCQUFxQixDQUN0QixDQUFBO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxtQkFBbUI7UUFDOUIsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtJQUMzRCxDQUFDO0lBRU0sS0FBSyxDQUFDLGdDQUFnQyxDQUFDLFNBQWlCLEVBQUUsSUFBVTtRQUN6RSxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxnQ0FBZ0MsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDdkYsQ0FBQztJQUVNLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxPQUFlLEVBQUUsSUFBVTtRQUNyRSxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDbkYsQ0FBQztJQUVNLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxPQUFlLEVBQUUsSUFBVTtRQUMxRCxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDeEUsQ0FBQztJQUVNLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxTQUFpQixFQUFFLElBQVU7UUFDOUQsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQzVFLENBQUM7SUFFTSxLQUFLLENBQUMsbUJBQW1CLENBQUMsT0FBZSxFQUFFLElBQVU7UUFDMUQsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3hFLENBQUM7SUFFTSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsU0FBaUIsRUFBRSxJQUFVO1FBQ3pFLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLGdDQUFnQyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUN2RixDQUFDO0lBRU0sS0FBSyxDQUFDLDhCQUE4QixDQUFDLE9BQWUsRUFBRSxJQUFVO1FBQ3JFLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLDhCQUE4QixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUNuRixDQUFDO0lBRU0sS0FBSyxDQUFDLGlDQUFpQyxDQUFDLFNBQWlCLEVBQUUsVUFBb0IsRUFBRSxJQUFVO1FBQ2hHLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLGlDQUFpQyxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDcEcsQ0FBQztJQUVNLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxPQUFlLEVBQUUsVUFBb0IsRUFBRSxJQUFVO1FBQzVGLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLCtCQUErQixDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDaEcsQ0FBQztJQUVNLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxTQUFpQixFQUFFLElBQVMsRUFBRSxJQUFVO1FBQ3ZGLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLG1DQUFtQyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDaEcsQ0FBQztDQUNGO0FBRUQsWUFBWTtBQUVaLE1BQU0sQ0FBQyxLQUFLLFVBQVUsMEJBQTBCLENBQzlDLFVBQWEsRUFDYixlQUFnRCxFQUNoRCxxQkFBa0QsRUFDbEQsUUFNSSxFQUFFO0lBRU4sTUFBTSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUscUJBQXFCLENBQUMsR0FLNUQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ3BCLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRTtRQUMzRixLQUFLLENBQUMsTUFBTTtZQUNWLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDL0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQztnQkFDaEgsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO2dCQUM1QixDQUFDLENBQUMsVUFBVSxDQUFDLHNCQUFzQixFQUFFO1FBQ3ZDLEtBQUssQ0FBQyxPQUFPO1lBQ1gsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUNoQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDO2dCQUMvRyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7Z0JBQzVCLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFO1FBQzNCLEtBQUssQ0FBQyxxQkFBcUI7WUFDekIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDO1lBQzlDLENBQUMsQ0FBQyxLQUFLLENBQUMscUJBQXFCLEtBQUssSUFBSSxJQUFJLGVBQWUsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQztnQkFDN0gsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO2dCQUM1QixDQUFDLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRTtLQUNsQyxDQUFDLENBQUE7SUFFRixJQUFJLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDckMsbUVBQW1FO1FBQ25FLE9BQU8sSUFBSSw0QkFBNEIsQ0FDckMsVUFBVSxFQUNWLGdCQUFnQixFQUNoQixNQUFNLEVBQ04sT0FBTyxFQUNQLGVBQWUsRUFDZixxQkFBcUIsRUFDckIscUJBQXFCLENBQ3RCLENBQUE7SUFDSCxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sSUFBSSxvQkFBb0IsQ0FDN0IsVUFBVSxFQUNWLGdCQUFnQixFQUNoQixNQUFNLEVBQ04sT0FBTyxFQUNQLGVBQWUsRUFDZixxQkFBcUIsRUFDckIscUJBQXFCLENBQ3RCLENBQUE7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVELHNDQUFzQztBQUN0QyxNQUFNLENBQUMsS0FBSyxVQUFVLDZCQUE2QixDQUNqRCxVQUFhLEVBQ2IsZUFBZ0QsRUFDaEQscUJBQWtELEVBQ2xELFFBUUksRUFBRTtJQUVOLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsR0FPbkYsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ3BCLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRTtRQUMzRixLQUFLLENBQUMsTUFBTTtZQUNWLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDL0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxLQUFLLFNBQVMsSUFBSSxLQUFLLEVBQUUsSUFBSSxLQUFLLE1BQU0sQ0FBQztnQkFDbEgsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO2dCQUM1QixDQUFDLENBQUMsVUFBVSxDQUFDLHNCQUFzQixFQUFFO1FBQ3ZDLEtBQUssQ0FBQyxPQUFPO1lBQ1gsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUNoQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEtBQUssUUFBUSxJQUFJLEtBQUssRUFBRSxJQUFJLEtBQUssTUFBTSxDQUFDO2dCQUNqSCxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7Z0JBQzVCLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFO1FBQzNCLEtBQUssQ0FBQyxxQkFBcUI7WUFDekIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDO1lBQzlDLENBQUMsQ0FBQyxLQUFLLENBQUMscUJBQXFCLEtBQUssSUFBSSxJQUFJLGVBQWUsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxLQUFLLFFBQVEsSUFBSSxLQUFLLEVBQUUsSUFBSSxLQUFLLE1BQU0sQ0FBQztnQkFDL0gsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO2dCQUM1QixDQUFDLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRTtRQUNqQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRTtRQUNyRSxLQUFLLENBQUMsZUFBZTtZQUNuQixDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO1lBQ3hDLENBQUMsQ0FBQyxLQUFLLENBQUMsZUFBZSxLQUFLLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQztnQkFDeEUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO2dCQUM1QixDQUFDLENBQUMsVUFBVSxDQUFDLGtCQUFrQixFQUFFO0tBQ3BDLENBQUMsQ0FBQTtJQUVGLElBQUksb0JBQW9CLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNyQyxPQUFPLElBQUksK0JBQStCLENBQ3hDLFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsTUFBTSxFQUNOLE9BQU8sRUFDUCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixJQUFJLEVBQ0osZUFBZSxDQUNoQixDQUFBO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLElBQUksdUJBQXVCLENBQ2hDLFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsTUFBTSxFQUNOLE9BQU8sRUFDUCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixJQUFJLEVBQ0osZUFBZSxDQUNoQixDQUFBO0lBQ0gsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGluZXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIG1heC1jbGFzc2VzLXBlci1maWxlICovXG5pbXBvcnQge1xuICBDcnlwdG9DbGllbnQsXG4gIERlbGVnYXRlZURldGFpbHMsXG4gIERlbGVnYXRpb25EZXRhaWxzLFxuICBEZWxlZ2F0b3JEZXRhaWxzLFxuICBGZWVEZWZhdWx0cyBhcyBGZWVEZWZhdWx0c1YwLFxuICBJQWlyR2FwVHJhbnNhY3Rpb24sXG4gIElBaXJHYXBUcmFuc2FjdGlvblJlc3VsdCxcbiAgSUNvaW5EZWxlZ2F0ZVByb3RvY29sLFxuICBJQ29pblByb3RvY29sLFxuICBJQ29pblN1YlByb3RvY29sLFxuICBJUHJvdG9jb2xUcmFuc2FjdGlvbkN1cnNvcixcbiAgTmV0d29ya1R5cGUgYXMgTmV0d29ya1R5cGVWMCxcbiAgUHJvdG9jb2xCbG9ja0V4cGxvcmVyIGFzIFByb3RvY29sQmxvY2tFeHBsb3JlclYwLFxuICBQcm90b2NvbE5ldHdvcmsgYXMgUHJvdG9jb2xOZXR3b3JrVjAsXG4gIFByb3RvY29sU3ltYm9scyxcbiAgU2lnbmVkVHJhbnNhY3Rpb24gYXMgU2lnbmVkVHJhbnNhY3Rpb25WMCxcbiAgU3ViUHJvdG9jb2xTeW1ib2xzLFxuICBTdWJQcm90b2NvbFR5cGUgYXMgU3ViUHJvdG9jb2xUeXBlVjAsXG4gIFVuc2lnbmVkVHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUcmFuc2FjdGlvblYwXG59IGZyb20gJ0B3YWxsZnJlZS1kZXYvY29pbmxpYi1jb3JlJ1xuaW1wb3J0IHsgSVByb3RvY29sQWRkcmVzc0N1cnNvciwgSUFpckdhcEFkZHJlc3NSZXN1bHQgfSBmcm9tICdAd2FsbGZyZWUtZGV2L2NvaW5saWItY29yZS9pbnRlcmZhY2VzL0lBaXJHYXBBZGRyZXNzJ1xuaW1wb3J0IHsgQWlyR2FwVHJhbnNhY3Rpb25TdGF0dXMgYXMgQWlyR2FwVHJhbnNhY3Rpb25TdGF0dXNWMCB9IGZyb20gJ0B3YWxsZnJlZS1kZXYvY29pbmxpYi1jb3JlL2ludGVyZmFjZXMvSUFpckdhcFRyYW5zYWN0aW9uJ1xuaW1wb3J0IHsgUHJvdG9jb2xPcHRpb25zIGFzIFByb3RvY29sT3B0aW9uc1YwIH0gZnJvbSAnQHdhbGxmcmVlLWRldi9jb2lubGliLWNvcmUvdXRpbHMvUHJvdG9jb2xPcHRpb25zJ1xuaW1wb3J0IHsgZGVyaXZlLCBtbmVtb25pY1RvU2VlZCB9IGZyb20gJ0B3YWxsZnJlZS1kZXYvY3J5cHRvJ1xuaW1wb3J0IHtcbiAgQWRkcmVzc1dpdGhDdXJzb3IsXG4gIEFpckdhcEFueVByb3RvY29sLFxuICBBaXJHYXBCbG9ja0V4cGxvcmVyLFxuICBBaXJHYXBUcmFuc2FjdGlvbixcbiAgQWlyR2FwVHJhbnNhY3Rpb25TdGF0dXMsXG4gIEFpckdhcFRyYW5zYWN0aW9uc1dpdGhDdXJzb3IsXG4gIEFpckdhcFYzU2VyaWFsaXplckNvbXBhbmlvbixcbiAgQW1vdW50LFxuICBCYWxhbmNlLFxuICBCbG9ja0V4cGxvcmVyTWV0YWRhdGEsXG4gIGNhbkVuY3J5cHRBRVMsXG4gIGNhbkVuY3J5cHRBc3ltbWV0cmljLFxuICBjYW5GZXRjaERhdGFGb3JBZGRyZXNzLFxuICBjYW5GZXRjaERhdGFGb3JNdWx0aXBsZUFkZHJlc3NlcyxcbiAgY2FuU2lnbk1lc3NhZ2UsXG4gIENyeXB0b0NvbmZpZ3VyYXRpb24sXG4gIENyeXB0b0Rlcml2YXRpdmUsXG4gIEV4dGVuZGVkS2V5UGFpcixcbiAgRXh0ZW5kZWRQdWJsaWNLZXksXG4gIEV4dGVuZGVkU2VjcmV0S2V5LFxuICBGZWVEZWZhdWx0cyxcbiAgRmVlRXN0aW1hdGlvbixcbiAgaGFzQ29uZmlndXJhYmxlQ29udHJhY3QsXG4gIGhhc011bHRpQWRkcmVzc1B1YmxpY0tleXMsXG4gIGltcGxlbWVudHNJbnRlcmZhY2UsXG4gIGlzQW1vdW50LFxuICBpc0JpcDMyUHJvdG9jb2wsXG4gIGlzTXVsdGlUb2tlblN1YlByb3RvY29sLFxuICBpc09mZmxpbmVQcm90b2NvbCxcbiAgaXNPbmxpbmVQcm90b2NvbCxcbiAgaXNUcmFuc2FjdGlvblN0YXR1c0NoZWNrZXIsXG4gIEtleVBhaXIsXG4gIG5ld0Ftb3VudCxcbiAgbmV3RXh0ZW5kZWRQdWJsaWNLZXksXG4gIG5ld0V4dGVuZGVkU2VjcmV0S2V5LFxuICBuZXdQdWJsaWNLZXksXG4gIG5ld1NlY3JldEtleSxcbiAgbmV3U2lnbmF0dXJlLFxuICBQcm90b2NvbENvbmZpZ3VyYXRpb24sXG4gIFByb3RvY29sTWV0YWRhdGEsXG4gIFByb3RvY29sTmV0d29yayxcbiAgUHJvdG9jb2xOZXR3b3JrVHlwZSxcbiAgUHJvdG9jb2xTeW1ib2wsXG4gIFByb3RvY29sVHJhbnNhY3Rpb25BcmJpdHJhcnlEYXRhTWV0YWRhdGEsXG4gIFByb3RvY29sVW5pdHNNZXRhZGF0YSxcbiAgUHVibGljS2V5LFxuICBTY2hlbWEsXG4gIFNlY3JldEtleSxcbiAgU2lnbmF0dXJlLFxuICBTaWduZWRUcmFuc2FjdGlvbixcbiAgU3ViUHJvdG9jb2wsXG4gIFN1YlByb3RvY29sVHlwZSxcbiAgVHJhbnNhY3Rpb25DdXJzb3IsXG4gIFRyYW5zYWN0aW9uRGV0YWlscyxcbiAgVW5zaWduZWRUcmFuc2FjdGlvblxufSBmcm9tICdAd2FsbGZyZWUtZGV2L21vZHVsZS1raXQnXG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcydcbmltcG9ydCB7IFRyYW5zYWN0aW9uU2lnblJlcXVlc3QsIFRyYW5zYWN0aW9uU2lnblJlc3BvbnNlLCBUcmFuc2FjdGlvblZhbGlkYXRvciB9IGZyb20gJ0B3YWxsZnJlZS1kZXYvc2VyaWFsaXplcidcbmltcG9ydCB7IEFpckdhcERlbGVnYXRlUHJvdG9jb2wgfSBmcm9tICdAd2FsbGZyZWUtZGV2L21vZHVsZS1raXQvaW50ZXJuYWwnXG5pbXBvcnQgeyBpc1Rlem9zU2FwbGluZ1Byb3RvY29sIH0gZnJvbSAnQHdhbGxmcmVlLWRldi90ZXpvcydcbmltcG9ydCB7IEJpdGNvaW5TZWd3aXRQcm90b2NvbCwgQml0Y29pblRhcHJvb3RQcm90b2NvbCwgaXNCaXRjb2luU2Vnd2l0UHJvdG9jb2wsIGlzQml0Y29pblRhcHJvb3RQcm90b2NvbCB9IGZyb20gJ0B3YWxsZnJlZS1kZXYvYml0Y29pbidcbmltcG9ydCB7IGdldFByb3RvY29sT3B0aW9uc0J5SWRlbnRpZmllckxlZ2FjeSB9IGZyb20gJy4uLy4uL3V0aWxzL3Byb3RvY29sL3Byb3RvY29sLW9wdGlvbnMnXG5pbXBvcnQgeyBzdXBwb3J0c1YxRGVsZWdhdGlvbiB9IGZyb20gJy4uLy4uL3V0aWxzL3Byb3RvY29sL2RlbGVnYXRpb24nXG5pbXBvcnQge1xuICBjb252ZXJ0RmVlRGVmYXVsdHNWMVRvVjAsXG4gIGNvbnZlcnROZXR3b3JrVHlwZVYxVG9WMCxcbiAgY29udmVydFRyYW5zYWN0aW9uRGV0YWlsc1YxVG9WMCxcbiAgY29udmVydFRyYW5zYWN0aW9uU3RhdHVzVjFUb1YwLFxuICBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwLFxuICBnZXRQdWJsaWNLZXlUeXBlLFxuICBnZXRTZWNyZXRLZXlUeXBlXG59IGZyb20gJy4uLy4uL3V0aWxzL3Byb3RvY29sL3Byb3RvY29sLXYwLWFkYXB0ZXInXG5cbi8vIFByb3RvY29sQmxvY2tFeHBsb3JlclxuXG5leHBvcnQgY2xhc3MgUHJvdG9jb2xCbG9ja0V4cGxvcmVyQWRhcHRlciBleHRlbmRzIFByb3RvY29sQmxvY2tFeHBsb3JlclYwIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBibG9ja0V4cGxvcmVyVjE6IEFpckdhcEJsb2NrRXhwbG9yZXIsIHVybDogc3RyaW5nKSB7XG4gICAgc3VwZXIodXJsKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFkZHJlc3NMaW5rKGFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuYmxvY2tFeHBsb3JlclYxLmNyZWF0ZUFkZHJlc3NVcmwoYWRkcmVzcylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRUcmFuc2FjdGlvbkxpbmsodHJhbnNhY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5ibG9ja0V4cGxvcmVyVjEuY3JlYXRlVHJhbnNhY3Rpb25VcmwodHJhbnNhY3Rpb25JZClcbiAgfVxuXG4gIHB1YmxpYyB0b0pTT04oKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgYmxvY2tFeHBsb3JlcjogdGhpcy5ibG9ja0V4cGxvcmVyXG4gICAgfVxuICB9XG59XG5cbi8vIFByb3RvY29sTmV0d29ya1xuXG5leHBvcnQgY2xhc3MgUHJvdG9jb2xOZXR3b3JrQWRhcHRlciBleHRlbmRzIFByb3RvY29sTmV0d29ya1YwIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHR5cGU6IFByb3RvY29sTmV0d29ya1R5cGUgfCBOZXR3b3JrVHlwZVYwLFxuICAgIHJwY1VybDogc3RyaW5nLFxuICAgIGJsb2NrRXhwbG9yZXI6IFByb3RvY29sQmxvY2tFeHBsb3JlclYwIHwgdW5kZWZpbmVkLFxuICAgIGV4dHJhczogdW5rbm93biA9IHt9XG4gICkge1xuICAgIGNvbnN0IG5ldHdvcmtUeXBlOiBOZXR3b3JrVHlwZVYwID0gT2JqZWN0LnZhbHVlcyhOZXR3b3JrVHlwZVYwKS5pbmNsdWRlcyh0eXBlIGFzIE5ldHdvcmtUeXBlVjApXG4gICAgICA/ICh0eXBlIGFzIE5ldHdvcmtUeXBlVjApXG4gICAgICA6IGNvbnZlcnROZXR3b3JrVHlwZVYxVG9WMCh0eXBlIGFzIFByb3RvY29sTmV0d29ya1R5cGUpXG5cbiAgICBzdXBlcihuYW1lLCBuZXR3b3JrVHlwZSwgcnBjVXJsLCBibG9ja0V4cGxvcmVyLCBleHRyYXMpXG4gIH1cbn1cblxuLy8gUHJvdG9jb2xPcHRpb25zXG5cbmV4cG9ydCBjbGFzcyBQcm90b2NvbE9wdGlvbnNBZGFwdGVyIGltcGxlbWVudHMgUHJvdG9jb2xPcHRpb25zVjAge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgbmV0d29yazogUHJvdG9jb2xOZXR3b3JrVjAsIHB1YmxpYyByZWFkb25seSBjb25maWc6IHVua25vd24gPSB7fSkge31cbn1cblxuLy8gVHJhbnNhY3Rpb25WYWxpZGF0b3JcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uVmFsaWRhdG9yQWRhcHRlciBpbXBsZW1lbnRzIFRyYW5zYWN0aW9uVmFsaWRhdG9yIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm90b2NvbElkZW50aWZpZXI6IHN0cmluZywgcHJpdmF0ZSByZWFkb25seSBzZXJpYWxpemVyQ29tcGFuaW9uOiBBaXJHYXBWM1NlcmlhbGl6ZXJDb21wYW5pb24pIHt9XG5cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlVW5zaWduZWRUcmFuc2FjdGlvbih0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25TaWduUmVxdWVzdCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplckNvbXBhbmlvbi52YWxpZGF0ZVRyYW5zYWN0aW9uU2lnblJlcXVlc3QodGhpcy5wcm90b2NvbElkZW50aWZpZXIsIHRyYW5zYWN0aW9uKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlU2lnbmVkVHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uU2lnblJlc3BvbnNlKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVyQ29tcGFuaW9uLnZhbGlkYXRlVHJhbnNhY3Rpb25TaWduUmVzcG9uc2UodGhpcy5wcm90b2NvbElkZW50aWZpZXIsIHRyYW5zYWN0aW9uKVxuICB9XG59XG5cbi8vIElDb2luUHJvdG9jb2xcblxuZXhwb3J0IGNsYXNzIElDb2luUHJvdG9jb2xBZGFwdGVyPFQgZXh0ZW5kcyBBaXJHYXBBbnlQcm90b2NvbCA9IEFpckdhcEFueVByb3RvY29sPiBpbXBsZW1lbnRzIElDb2luUHJvdG9jb2wge1xuICBwdWJsaWMgcmVhZG9ubHkgc3ltYm9sOiBzdHJpbmdcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZ1xuICBwdWJsaWMgcmVhZG9ubHkgbWFya2V0U3ltYm9sOiBzdHJpbmdcbiAgcHVibGljIHJlYWRvbmx5IGFzc2V0U3ltYm9sOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgcHVibGljIHJlYWRvbmx5IGZlZVN5bWJvbDogc3RyaW5nXG4gIHB1YmxpYyByZWFkb25seSBmZWVEZWZhdWx0czogRmVlRGVmYXVsdHNWMFxuICBwdWJsaWMgcmVhZG9ubHkgZGVjaW1hbHM6IG51bWJlclxuICBwdWJsaWMgcmVhZG9ubHkgZmVlRGVjaW1hbHM6IG51bWJlclxuICBwdWJsaWMgcmVhZG9ubHkgaWRlbnRpZmllcjogUHJvdG9jb2xTeW1ib2xzXG4gIHB1YmxpYyByZWFkb25seSB1bml0czogeyB1bml0U3ltYm9sOiBzdHJpbmc7IGZhY3Rvcjogc3RyaW5nIH1bXVxuICBwdWJsaWMgcmVhZG9ubHkgc3VwcG9ydHNIRDogYm9vbGVhblxuICBwdWJsaWMgcmVhZG9ubHkgc3RhbmRhcmREZXJpdmF0aW9uUGF0aDogc3RyaW5nXG4gIHB1YmxpYyByZWFkb25seSBhZGRyZXNzSXNDYXNlU2Vuc2l0aXZlOiBib29sZWFuXG4gIHB1YmxpYyByZWFkb25seSBhZGRyZXNzVmFsaWRhdGlvblBhdHRlcm46IHN0cmluZ1xuICBwdWJsaWMgcmVhZG9ubHkgYWRkcmVzc1BsYWNlaG9sZGVyOiBzdHJpbmdcbiAgcHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IFByb3RvY29sT3B0aW9uc1YwXG4gIHB1YmxpYyByZWFkb25seSBjcnlwdG9DbGllbnQ6IENyeXB0b0NsaWVudFxuXG4gIHByaXZhdGUgcmVhZG9ubHkgbmV0d29ya1YwOiBQcm90b2NvbE5ldHdvcmtWMFxuICBwcml2YXRlIHJlYWRvbmx5IGJsb2NrRXhwbG9yZXJWMDogUHJvdG9jb2xCbG9ja0V4cGxvcmVyQWRhcHRlciB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBwcm90b2NvbFYxOiBULFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvdG9jb2xNZXRhZGF0YTogUHJvdG9jb2xNZXRhZGF0YSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNyeXB0bzogQ3J5cHRvQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5ldHdvcms6IFByb3RvY29sTmV0d29yayB8IHVuZGVmaW5lZCxcbiAgICBibG9ja0V4cGxvcmVyVjE6IEFpckdhcEJsb2NrRXhwbG9yZXIgfCB1bmRlZmluZWQsXG4gICAgYmxvY2tFeHBsb3Jlck1ldGFkYXRhOiBCbG9ja0V4cGxvcmVyTWV0YWRhdGEgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSB2M1NlcmlhbGl6ZXJDb21wYW5pb246IEFpckdhcFYzU2VyaWFsaXplckNvbXBhbmlvblxuICApIHtcbiAgICBjb25zdCB1bml0czogUHJvdG9jb2xVbml0c01ldGFkYXRhID0gdGhpcy5wcm90b2NvbE1ldGFkYXRhLnVuaXRzXG4gICAgY29uc3QgbWFpblVuaXQ6IHN0cmluZyA9IHRoaXMucHJvdG9jb2xNZXRhZGF0YS5tYWluVW5pdFxuICAgIGNvbnN0IHN5bWJvbDogUHJvdG9jb2xTeW1ib2wgPSB1bml0c1ttYWluVW5pdF0uc3ltYm9sXG5cbiAgICBjb25zdCBmZWVVbml0czogUHJvdG9jb2xVbml0c01ldGFkYXRhID0gcHJvdG9jb2xNZXRhZGF0YS5mZWU/LnVuaXRzID8/IHByb3RvY29sTWV0YWRhdGEudW5pdHNcbiAgICBjb25zdCBtYWluRmVlVW5pdDogc3RyaW5nID0gcHJvdG9jb2xNZXRhZGF0YS5mZWU/Lm1haW5Vbml0ID8/IHByb3RvY29sTWV0YWRhdGEubWFpblVuaXRcbiAgICBjb25zdCBmZWVTeW1ib2w6IFByb3RvY29sU3ltYm9sID0gZmVlVW5pdHNbbWFpbkZlZVVuaXRdLnN5bWJvbFxuXG4gICAgY29uc3QgZmVlRGVmYXVsdHM6IEZlZURlZmF1bHRzID0gcHJvdG9jb2xNZXRhZGF0YS5mZWU/LmRlZmF1bHRzID8/IHtcbiAgICAgIGxvdzogbmV3QW1vdW50KCcwJywgJ2Jsb2NrY2hhaW4nKSxcbiAgICAgIG1lZGl1bTogbmV3QW1vdW50KCcwJywgJ2Jsb2NrY2hhaW4nKSxcbiAgICAgIGhpZ2g6IG5ld0Ftb3VudCgnMCcsICdibG9ja2NoYWluJylcbiAgICB9XG5cbiAgICBjb25zdCBtYXhEZWNpbWFsczogbnVtYmVyID0gTWF0aC5tYXgoLi4uT2JqZWN0LnZhbHVlcyhwcm90b2NvbE1ldGFkYXRhLnVuaXRzKS5tYXAoKHVuaXQpID0+IHVuaXQuZGVjaW1hbHMpKVxuXG4gICAgdGhpcy5uYW1lID0gdGhpcy5wcm90b2NvbE1ldGFkYXRhLm5hbWVcbiAgICB0aGlzLmlkZW50aWZpZXIgPSB0aGlzLnByb3RvY29sTWV0YWRhdGEuaWRlbnRpZmllciBhcyBQcm90b2NvbFN5bWJvbHNcblxuICAgIHRoaXMuc3ltYm9sID0gc3ltYm9sLnZhbHVlXG4gICAgdGhpcy5tYXJrZXRTeW1ib2wgPSBzeW1ib2wubWFya2V0ID8/IHN5bWJvbC52YWx1ZVxuICAgIHRoaXMuYXNzZXRTeW1ib2wgPSBzeW1ib2wuYXNzZXRcbiAgICB0aGlzLmRlY2ltYWxzID0gdW5pdHNbbWFpblVuaXRdLmRlY2ltYWxzXG5cbiAgICB0aGlzLmZlZVN5bWJvbCA9IGZlZVN5bWJvbC52YWx1ZVxuICAgIHRoaXMuZmVlRGVmYXVsdHMgPSB0aGlzLmNvbnZlcnRGZWVEZWZhdWx0c1YxVG9WMChmZWVEZWZhdWx0cylcbiAgICB0aGlzLmZlZURlY2ltYWxzID0gZmVlVW5pdHNbbWFpbkZlZVVuaXRdLmRlY2ltYWxzXG5cbiAgICB0aGlzLnVuaXRzID0gT2JqZWN0LmVudHJpZXMocHJvdG9jb2xNZXRhZGF0YS51bml0cykubWFwKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgdW5pdFN5bWJvbDogc3RyaW5nID0gZW50cnlbMF1cbiAgICAgIGNvbnN0IGZhY3Rvcjogc3RyaW5nID0gbmV3IEJpZ051bWJlcigxKS5zaGlmdGVkQnkoLShtYXhEZWNpbWFscyAtIGVudHJ5WzFdLmRlY2ltYWxzKSkudG9GaXhlZCgpXG5cbiAgICAgIHJldHVybiB7IHVuaXRTeW1ib2wsIGZhY3RvciB9XG4gICAgfSlcblxuICAgIHRoaXMuc3VwcG9ydHNIRCA9IGlzQmlwMzJQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpXG5cbiAgICB0aGlzLnN0YW5kYXJkRGVyaXZhdGlvblBhdGggPSB0aGlzLnByb3RvY29sTWV0YWRhdGEuYWNjb3VudD8uc3RhbmRhcmREZXJpdmF0aW9uUGF0aCA/PyAnbS8nXG4gICAgdGhpcy5hZGRyZXNzSXNDYXNlU2Vuc2l0aXZlID0gdGhpcy5wcm90b2NvbE1ldGFkYXRhLmFjY291bnQuYWRkcmVzcz8uaXNDYXNlU2Vuc2l0aXZlID8/IGZhbHNlXG4gICAgdGhpcy5hZGRyZXNzVmFsaWRhdGlvblBhdHRlcm4gPSB0aGlzLnByb3RvY29sTWV0YWRhdGEuYWNjb3VudD8uYWRkcmVzcz8ucmVnZXggPz8gJyorJ1xuICAgIHRoaXMuYWRkcmVzc1BsYWNlaG9sZGVyID0gdGhpcy5wcm90b2NvbE1ldGFkYXRhLmFjY291bnQ/LmFkZHJlc3M/LnBsYWNlaG9sZGVyID8/ICcnXG5cbiAgICBsZXQga25vd25PcHRpb25zOiBQcm90b2NvbE9wdGlvbnNWMCB8IHVuZGVmaW5lZFxuICAgIHRyeSB7XG4gICAgICBrbm93bk9wdGlvbnMgPSBnZXRQcm90b2NvbE9wdGlvbnNCeUlkZW50aWZpZXJMZWdhY3kodGhpcy5wcm90b2NvbE1ldGFkYXRhLmlkZW50aWZpZXIgYXMgUHJvdG9jb2xTeW1ib2xzKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgdGhpcy5ibG9ja0V4cGxvcmVyVjAgPVxuICAgICAgYmxvY2tFeHBsb3JlclYxICYmIGJsb2NrRXhwbG9yZXJNZXRhZGF0YSA/IG5ldyBQcm90b2NvbEJsb2NrRXhwbG9yZXJBZGFwdGVyKGJsb2NrRXhwbG9yZXJWMSwgYmxvY2tFeHBsb3Jlck1ldGFkYXRhLnVybCkgOiB1bmRlZmluZWRcbiAgICB0aGlzLm5ldHdvcmtWMCA9IHRoaXMuZ2V0TmV0d29yayhrbm93bk9wdGlvbnMpXG4gICAgdGhpcy5vcHRpb25zID0gbmV3IFByb3RvY29sT3B0aW9uc0FkYXB0ZXIodGhpcy5uZXR3b3JrVjAsIGtub3duT3B0aW9ucz8uY29uZmlnID8/IHt9KVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFN5bWJvbCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnN5bWJvbFxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldE5hbWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5uYW1lXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0TWFya2V0U3ltYm9sKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMubWFya2V0U3ltYm9sXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QXNzZXRTeW1ib2woKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5hc3NldFN5bWJvbFxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEZlZVN5bWJvbCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmZlZVN5bWJvbFxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEZlZURlZmF1bHRzKCk6IFByb21pc2U8RmVlRGVmYXVsdHNWMD4ge1xuICAgIHJldHVybiB0aGlzLmZlZURlZmF1bHRzXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVjaW1hbHMoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5kZWNpbWFsc1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEZlZURlY2ltYWxzKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuZmVlRGVjaW1hbHNcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRJZGVudGlmaWVyKCk6IFByb21pc2U8UHJvdG9jb2xTeW1ib2xzPiB7XG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpZmllclxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFVuaXRzKCk6IFByb21pc2U8eyB1bml0U3ltYm9sOiBzdHJpbmc7IGZhY3Rvcjogc3RyaW5nIH1bXT4ge1xuICAgIHJldHVybiB0aGlzLnVuaXRzXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0U3VwcG9ydHNIRCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdXBwb3J0c0hEXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0U3RhbmRhcmREZXJpdmF0aW9uUGF0aCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnN0YW5kYXJkRGVyaXZhdGlvblBhdGhcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBZGRyZXNzSXNDYXNlU2Vuc2l0aXZlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmFkZHJlc3NJc0Nhc2VTZW5zaXRpdmVcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBZGRyZXNzVmFsaWRhdGlvblBhdHRlcm4oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5hZGRyZXNzVmFsaWRhdGlvblBhdHRlcm5cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBZGRyZXNzUGxhY2Vob2xkZXIoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5hZGRyZXNzUGxhY2Vob2xkZXJcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRPcHRpb25zKCk6IFByb21pc2U8UHJvdG9jb2xPcHRpb25zVjA+IHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QmxvY2tFeHBsb3JlckxpbmtGb3JBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuYmxvY2tFeHBsb3JlclYwID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIEJsb2NrRXhwbG9yZXIgbm90IGZvdW5kLicpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYmxvY2tFeHBsb3JlclYwLmdldEFkZHJlc3NMaW5rKGFkZHJlc3MpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QmxvY2tFeHBsb3JlckxpbmtGb3JUeElkKHR4SWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuYmxvY2tFeHBsb3JlclYwID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIEJsb2NrRXhwbG9yZXIgbm90IGZvdW5kLicpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYmxvY2tFeHBsb3JlclYwLmdldFRyYW5zYWN0aW9uTGluayh0eElkKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFRyYW5zYWN0aW9uc0Zyb21QdWJsaWNLZXkoXG4gICAgcHVibGljS2V5OiBzdHJpbmcsXG4gICAgbGltaXQ6IG51bWJlcixcbiAgICBjdXJzb3I/OiBJUHJvdG9jb2xUcmFuc2FjdGlvbkN1cnNvclxuICApOiBQcm9taXNlPElBaXJHYXBUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIGlmICghaXNPbmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbnRlcmZhY2U6IE9ubGluZS4nKVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uczogQWlyR2FwVHJhbnNhY3Rpb25zV2l0aEN1cnNvciA9IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRUcmFuc2FjdGlvbnNGb3JQdWJsaWNLZXkoXG4gICAgICBuZXdQdWJsaWNLZXkocHVibGljS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKHB1YmxpY0tleSkpLFxuICAgICAgbGltaXQsXG4gICAgICBjdXJzb3IgYXMgVHJhbnNhY3Rpb25DdXJzb3JcbiAgICApXG5cbiAgICByZXR1cm4ge1xuICAgICAgdHJhbnNhY3Rpb25zOiBhd2FpdCB0aGlzLmNvbnZlcnRUcmFuc2FjdGlvbkRldGFpbHNWMVRvVjAodHJhbnNhY3Rpb25zLnRyYW5zYWN0aW9ucyksXG4gICAgICBjdXJzb3JcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0VHJhbnNhY3Rpb25zRnJvbUV4dGVuZGVkUHVibGljS2V5KFxuICAgIGV4dGVuZGVkUHVibGljS2V5OiBzdHJpbmcsXG4gICAgbGltaXQ6IG51bWJlcixcbiAgICBjdXJzb3I/OiBJUHJvdG9jb2xUcmFuc2FjdGlvbkN1cnNvclxuICApOiBQcm9taXNlPElBaXJHYXBUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIGlmICghaXNPbmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpIHx8ICFpc0JpcDMyUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW50ZXJmYWNlOiBPbmxpbmUsIEJpcDMyLicpXG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25zOiBBaXJHYXBUcmFuc2FjdGlvbnNXaXRoQ3Vyc29yID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldFRyYW5zYWN0aW9uc0ZvclB1YmxpY0tleShcbiAgICAgIG5ld0V4dGVuZGVkUHVibGljS2V5KGV4dGVuZGVkUHVibGljS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKGV4dGVuZGVkUHVibGljS2V5KSksXG4gICAgICBsaW1pdCxcbiAgICAgIGN1cnNvciBhcyBUcmFuc2FjdGlvbkN1cnNvclxuICAgIClcblxuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2FjdGlvbnM6IGF3YWl0IHRoaXMuY29udmVydFRyYW5zYWN0aW9uRGV0YWlsc1YxVG9WMCh0cmFuc2FjdGlvbnMudHJhbnNhY3Rpb25zKSxcbiAgICAgIGN1cnNvclxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRUcmFuc2FjdGlvbnNGcm9tQWRkcmVzc2VzKFxuICAgIGFkZHJlc3Nlczogc3RyaW5nW10sXG4gICAgbGltaXQ6IG51bWJlcixcbiAgICBjdXJzb3I/OiBJUHJvdG9jb2xUcmFuc2FjdGlvbkN1cnNvclxuICApOiBQcm9taXNlPElBaXJHYXBUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIGlmICghaXNPbmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbnRlcmZhY2U6IE9ubGluZSwgRmV0Y2hEYXRhRm9yQWRkcmVzcy9GZXRjaERhdGFGb3JNdWx0aXBsZUFkZHJlc3Nlcy4nKVxuICAgIH1cblxuICAgIGxldCB0cmFuc2FjdGlvbnM6IEFpckdhcFRyYW5zYWN0aW9uc1dpdGhDdXJzb3JcbiAgICBpZiAoYWRkcmVzc2VzLmxlbmd0aCA9PT0gMSAmJiBjYW5GZXRjaERhdGFGb3JBZGRyZXNzKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRyYW5zYWN0aW9ucyA9IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRUcmFuc2FjdGlvbnNGb3JBZGRyZXNzKGFkZHJlc3Nlc1swXSwgbGltaXQsIGN1cnNvciBhcyBUcmFuc2FjdGlvbkN1cnNvcilcbiAgICB9IGVsc2UgaWYgKGNhbkZldGNoRGF0YUZvck11bHRpcGxlQWRkcmVzc2VzKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIHRyYW5zYWN0aW9ucyA9IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRUcmFuc2FjdGlvbnNGb3JBZGRyZXNzZXMoYWRkcmVzc2VzLCBsaW1pdCwgY3Vyc29yIGFzIFRyYW5zYWN0aW9uQ3Vyc29yKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbnRlcmZhY2U6IE9ubGluZSwgRmV0Y2hEYXRhRm9yQWRkcmVzcy9GZXRjaERhdGFGb3JNdWx0aXBsZUFkZHJlc3Nlcy4nKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICB0cmFuc2FjdGlvbnM6IGF3YWl0IHRoaXMuY29udmVydFRyYW5zYWN0aW9uRGV0YWlsc1YxVG9WMCh0cmFuc2FjdGlvbnMudHJhbnNhY3Rpb25zKSxcbiAgICAgIGN1cnNvcjogdHJhbnNhY3Rpb25zLmN1cnNvciA/IHRyYW5zYWN0aW9ucy5jdXJzb3IgOiBjdXJzb3JcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QmFsYW5jZU9mQWRkcmVzc2VzKGFkZHJlc3Nlczogc3RyaW5nW10sIF9kYXRhPzogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH0pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghaXNPbmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbnRlcmZhY2U6IE9ubGluZSwgRmV0Y2hEYXRhRm9yQWRkcmVzcy9GZXRjaERhdGFGb3JNdWx0aXBsZUFkZHJlc3Nlcy4nKVxuICAgIH1cblxuICAgIGxldCBiYWxhbmNlOiBCYWxhbmNlXG4gICAgaWYgKGFkZHJlc3Nlcy5sZW5ndGggPT09IDEgJiYgY2FuRmV0Y2hEYXRhRm9yQWRkcmVzcyh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICBiYWxhbmNlID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldEJhbGFuY2VPZkFkZHJlc3MoYWRkcmVzc2VzWzBdKVxuICAgIH0gZWxzZSBpZiAoY2FuRmV0Y2hEYXRhRm9yTXVsdGlwbGVBZGRyZXNzZXModGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgYmFsYW5jZSA9IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRCYWxhbmNlT2ZBZGRyZXNzZXMoYWRkcmVzc2VzKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbnRlcmZhY2U6IE9ubGluZSwgRmV0Y2hEYXRhRm9yQWRkcmVzcy9GZXRjaERhdGFGb3JNdWx0aXBsZUFkZHJlc3Nlcy4nKVxuICAgIH1cblxuICAgIHJldHVybiBuZXdBbW91bnQoYmFsYW5jZS50b3RhbCkuYmxvY2tjaGFpbih0aGlzLnByb3RvY29sTWV0YWRhdGEudW5pdHMpLnZhbHVlXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QmFsYW5jZU9mUHVibGljS2V5KFxuICAgIHB1YmxpY0tleTogc3RyaW5nLFxuICAgIGRhdGE/OiB7IFtrZXk6IHN0cmluZ106IHVua25vd247IGFkZHJlc3NJbmRleD86IG51bWJlcjsgYXNzZXRJRD86IHN0cmluZyB9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc09ubGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGluZmVyZmFjZTogT25saW5lLicpXG4gICAgfVxuXG4gICAgY29uc3QgcHVibGljS2V5VjE6IFB1YmxpY0tleSA9IG5ld1B1YmxpY0tleShwdWJsaWNLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHVibGljS2V5KSlcblxuICAgIGNvbnN0IGJhbGFuY2U6IEJhbGFuY2UgPVxuICAgICAgZGF0YT8uYXNzZXRJRCAmJiBpc011bHRpVG9rZW5TdWJQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpXG4gICAgICAgID8gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldEJhbGFuY2VPZlB1YmxpY0tleShwdWJsaWNLZXlWMSwgeyB0b2tlbklkOiBkYXRhLmFzc2V0SUQgfSlcbiAgICAgICAgOiBhd2FpdCB0aGlzLnByb3RvY29sVjEuZ2V0QmFsYW5jZU9mUHVibGljS2V5KHB1YmxpY0tleVYxKVxuXG4gICAgcmV0dXJuIG5ld0Ftb3VudChiYWxhbmNlLnRvdGFsKS5ibG9ja2NoYWluKHRoaXMucHJvdG9jb2xNZXRhZGF0YS51bml0cykudmFsdWVcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRCYWxhbmNlT2ZFeHRlbmRlZFB1YmxpY0tleShcbiAgICBleHRlbmRlZFB1YmxpY0tleTogc3RyaW5nLFxuICAgIF9vZmZzZXQ6IG51bWJlcixcbiAgICBkYXRhPzogeyBba2V5OiBzdHJpbmddOiB1bmtub3duOyBhc3NldElEPzogc3RyaW5nIH1cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzT25saW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSB8fCAhaXNCaXAzMlByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGluZmVyZmFjZTogT25saW5lLCBCaXAzMi4nKVxuICAgIH1cblxuICAgIGNvbnN0IGV4dGVuZGVkUHVibGljS2V5VjE6IEV4dGVuZGVkUHVibGljS2V5ID0gbmV3RXh0ZW5kZWRQdWJsaWNLZXkoZXh0ZW5kZWRQdWJsaWNLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAoZXh0ZW5kZWRQdWJsaWNLZXkpKVxuXG4gICAgY29uc3QgYmFsYW5jZTogQmFsYW5jZSA9XG4gICAgICBkYXRhPy5hc3NldElEICYmIGlzTXVsdGlUb2tlblN1YlByb3RvY29sKHRoaXMucHJvdG9jb2xWMSlcbiAgICAgICAgPyBhd2FpdCB0aGlzLnByb3RvY29sVjEuZ2V0QmFsYW5jZU9mUHVibGljS2V5KGV4dGVuZGVkUHVibGljS2V5VjEsIHsgdG9rZW5JZDogZGF0YS5hc3NldElEIH0pXG4gICAgICAgIDogYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldEJhbGFuY2VPZlB1YmxpY0tleShleHRlbmRlZFB1YmxpY0tleVYxKVxuXG4gICAgcmV0dXJuIG5ld0Ftb3VudChiYWxhbmNlLnRvdGFsKS5ibG9ja2NoYWluKHRoaXMucHJvdG9jb2xNZXRhZGF0YS51bml0cykudmFsdWVcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBdmFpbGFibGVCYWxhbmNlT2ZBZGRyZXNzZXMoYWRkcmVzc2VzOiBzdHJpbmdbXSwgX2RhdGE/OiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc09ubGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGludGVyZmFjZTogT25saW5lLCBGZXRjaERhdGFGb3JBZGRyZXNzL0ZldGNoRGF0YUZvck11bHRpcGxlQWRkcmVzc2VzLicpXG4gICAgfVxuXG4gICAgbGV0IGJhbGFuY2U6IEJhbGFuY2VcbiAgICBpZiAoYWRkcmVzc2VzLmxlbmd0aCA9PT0gMSAmJiBjYW5GZXRjaERhdGFGb3JBZGRyZXNzKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIGJhbGFuY2UgPSBhd2FpdCB0aGlzLnByb3RvY29sVjEuZ2V0QmFsYW5jZU9mQWRkcmVzcyhhZGRyZXNzZXNbMF0pXG4gICAgfSBlbHNlIGlmIChjYW5GZXRjaERhdGFGb3JNdWx0aXBsZUFkZHJlc3Nlcyh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBiYWxhbmNlID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldEJhbGFuY2VPZkFkZHJlc3NlcyhhZGRyZXNzZXMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGludGVyZmFjZTogT25saW5lLCBGZXRjaERhdGFGb3JBZGRyZXNzL0ZldGNoRGF0YUZvck11bHRpcGxlQWRkcmVzc2VzLicpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0Ftb3VudChiYWxhbmNlLnRyYW5zZmVyYWJsZSA/PyBiYWxhbmNlLnRvdGFsKS5ibG9ja2NoYWluKHRoaXMucHJvdG9jb2xNZXRhZGF0YS51bml0cykudmFsdWVcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRUcmFuc2FjdGlvblN0YXR1c2VzKHRyYW5zYWN0aW9uSGFzaDogc3RyaW5nW10pOiBQcm9taXNlPEFpckdhcFRyYW5zYWN0aW9uU3RhdHVzVjBbXT4ge1xuICAgIGlmICghaXNPbmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpIHx8ICFpc1RyYW5zYWN0aW9uU3RhdHVzQ2hlY2tlcih0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9ubGluZSwgVHJhbnNhY3Rpb25TdGF0dXNDaGVja2VyLicpXG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdHVzZXM6IFJlY29yZDxzdHJpbmcsIEFpckdhcFRyYW5zYWN0aW9uU3RhdHVzPiA9IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRUcmFuc2FjdGlvblN0YXR1cyh0cmFuc2FjdGlvbkhhc2gpXG5cbiAgICByZXR1cm4gdHJhbnNhY3Rpb25IYXNoLm1hcCgoaGFzaDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXM6IEFpckdhcFRyYW5zYWN0aW9uU3RhdHVzID0gc3RhdHVzZXNbaGFzaF1cblxuICAgICAgcmV0dXJuIGNvbnZlcnRUcmFuc2FjdGlvblN0YXR1c1YxVG9WMChzdGF0dXMpXG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRCYWxhbmNlT2ZQdWJsaWNLZXlGb3JTdWJQcm90b2NvbHMoX3B1YmxpY0tleTogc3RyaW5nLCBfc3ViUHJvdG9jb2xzOiBJQ29pblN1YlByb3RvY29sW10pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZC4nKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGVzdGltYXRlTWF4VHJhbnNhY3Rpb25WYWx1ZUZyb21FeHRlbmRlZFB1YmxpY0tleShcbiAgICBleHRlbmRlZFB1YmxpY0tleTogc3RyaW5nLFxuICAgIHJlY2lwaWVudHM6IHN0cmluZ1tdLFxuICAgIGZlZT86IHN0cmluZyxcbiAgICBkYXRhPzogeyBba2V5OiBzdHJpbmddOiB1bmtub3duIH1cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzT25saW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSB8fCAhaXNCaXAzMlByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGluZmVyZmFjZTogT25saW5lLCBCaXAzMi4nKVxuICAgIH1cblxuICAgIGNvbnN0IG1heEFtb3VudDogQW1vdW50ID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldFRyYW5zYWN0aW9uTWF4QW1vdW50V2l0aFB1YmxpY0tleShcbiAgICAgIG5ld0V4dGVuZGVkUHVibGljS2V5KGV4dGVuZGVkUHVibGljS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKGV4dGVuZGVkUHVibGljS2V5KSksXG4gICAgICByZWNpcGllbnRzLFxuICAgICAge1xuICAgICAgICBhcmJpdHJhcnlEYXRhOiB0aGlzLmdldEFyYml0cmFyeURhdGEoZGF0YSksXG4gICAgICAgIGZlZTogZmVlID8gbmV3QW1vdW50KGZlZSwgJ2Jsb2NrY2hhaW4nKSA6IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIClcblxuICAgIHJldHVybiBuZXdBbW91bnQobWF4QW1vdW50KS5ibG9ja2NoYWluKHRoaXMucHJvdG9jb2xNZXRhZGF0YS51bml0cykudmFsdWVcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBlc3RpbWF0ZU1heFRyYW5zYWN0aW9uVmFsdWVGcm9tUHVibGljS2V5KFxuICAgIHB1YmxpY0tleTogc3RyaW5nLFxuICAgIHJlY2lwaWVudHM6IHN0cmluZ1tdLFxuICAgIGZlZT86IHN0cmluZyxcbiAgICBkYXRhPzogeyBba2V5OiBzdHJpbmddOiB1bmtub3duOyBhZGRyZXNzSW5kZXg/OiBudW1iZXIgfVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghaXNPbmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9ubGluZS4nKVxuICAgIH1cblxuICAgIGNvbnN0IG1heEFtb3VudDogQW1vdW50ID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldFRyYW5zYWN0aW9uTWF4QW1vdW50V2l0aFB1YmxpY0tleShcbiAgICAgIG5ld1B1YmxpY0tleShwdWJsaWNLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHVibGljS2V5KSksXG4gICAgICByZWNpcGllbnRzLFxuICAgICAge1xuICAgICAgICBmZWU6IGZlZSA/IG5ld0Ftb3VudChmZWUsICdibG9ja2NoYWluJykgOiB1bmRlZmluZWQsXG4gICAgICAgIGFyYml0cmFyeURhdGE6IHRoaXMuZ2V0QXJiaXRyYXJ5RGF0YShkYXRhKVxuICAgICAgfVxuICAgIClcblxuICAgIHJldHVybiBuZXdBbW91bnQobWF4QW1vdW50KS5ibG9ja2NoYWluKHRoaXMucHJvdG9jb2xNZXRhZGF0YS51bml0cykudmFsdWVcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBlc3RpbWF0ZUZlZURlZmF1bHRzRnJvbUV4dGVuZGVkUHVibGljS2V5KFxuICAgIHB1YmxpY0tleTogc3RyaW5nLFxuICAgIHJlY2lwaWVudHM6IHN0cmluZ1tdLFxuICAgIHZhbHVlczogc3RyaW5nW10sXG4gICAgZGF0YT86IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd25cblxuICAgICAgLy8gVGV6b3MgRkEyXG4gICAgICBhc3NldElEPzogc3RyaW5nXG4gICAgfVxuICApOiBQcm9taXNlPEZlZURlZmF1bHRzVjA+IHtcbiAgICBpZiAoIWlzT25saW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSB8fCAhaXNCaXAzMlByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGluZmVyZmFjZTogT25saW5lLCBCaXAzMi4nKVxuICAgIH1cblxuICAgIGNvbnN0IGZlZUVzdGltYXRpb246IEZlZUVzdGltYXRpb24gfCB1bmRlZmluZWQgPSBhd2FpdCB0aGlzLnByb3RvY29sVjEuZ2V0VHJhbnNhY3Rpb25GZWVXaXRoUHVibGljS2V5KFxuICAgICAgbmV3RXh0ZW5kZWRQdWJsaWNLZXkocHVibGljS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKHB1YmxpY0tleSkpLFxuICAgICAgdGhpcy5jb21iaW5lVHJhbnNhY3Rpb25EZXRhaWxzKHJlY2lwaWVudHMsIHZhbHVlcyksXG4gICAgICB7XG4gICAgICAgIGFyYml0cmFyeURhdGE6IHRoaXMuZ2V0QXJiaXRyYXJ5RGF0YShkYXRhKSxcbiAgICAgICAgYXNzZXRJZDogZGF0YT8uYXNzZXRJRCA/IHBhcnNlSW50KGRhdGEuYXNzZXRJRCwgMTApIDogdW5kZWZpbmVkXG4gICAgICB9XG4gICAgKVxuXG4gICAgaWYgKGZlZUVzdGltYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgYGVzdGltYXRlRmVlRGVmYXVsdHNGcm9tRXh0ZW5kZWRQdWJsaWNLZXlgIG5vdCBzdXBwb3J0ZWQuJylcbiAgICB9XG5cbiAgICBjb25zdCBmZWVEZWZhdWx0czogRmVlRGVmYXVsdHMgPSBpc0Ftb3VudChmZWVFc3RpbWF0aW9uKVxuICAgICAgPyB7IGxvdzogZmVlRXN0aW1hdGlvbiwgbWVkaXVtOiBmZWVFc3RpbWF0aW9uLCBoaWdoOiBmZWVFc3RpbWF0aW9uIH1cbiAgICAgIDogZmVlRXN0aW1hdGlvblxuXG4gICAgcmV0dXJuIHRoaXMuY29udmVydEZlZURlZmF1bHRzVjFUb1YwKGZlZURlZmF1bHRzKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGVzdGltYXRlRmVlRGVmYXVsdHNGcm9tUHVibGljS2V5KFxuICAgIHB1YmxpY0tleTogc3RyaW5nLFxuICAgIHJlY2lwaWVudHM6IHN0cmluZ1tdLFxuICAgIHZhbHVlczogc3RyaW5nW10sXG4gICAgZGF0YT86IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd25cblxuICAgICAgLy8gVGV6b3MgRkEyXG4gICAgICBhc3NldElEPzogc3RyaW5nXG4gICAgfVxuICApOiBQcm9taXNlPEZlZURlZmF1bHRzVjA+IHtcbiAgICBpZiAoIWlzT25saW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBPbmxpbmUuJylcbiAgICB9XG5cbiAgICBpZiAocmVjaXBpZW50cy5sZW5ndGggIT09IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVjaXBpZW50cyBsZW5ndGggbXVzdCBtYXRjaCB2YWx1ZXMgbGVuZ3RoLicpXG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25EZXRhaWxzOiBUcmFuc2FjdGlvbkRldGFpbHNbXSA9IHJlY2lwaWVudHMubWFwKChyZWNpcGllbnQ6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4gKHtcbiAgICAgIHRvOiByZWNpcGllbnQsXG4gICAgICBhbW91bnQ6IG5ld0Ftb3VudCh2YWx1ZXNbaW5kZXhdLCAnYmxvY2tjaGFpbicpXG4gICAgfSkpXG5cbiAgICBjb25zdCBmZWVFc3RpbWF0aW9uOiBGZWVFc3RpbWF0aW9uIHwgdW5kZWZpbmVkID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldFRyYW5zYWN0aW9uRmVlV2l0aFB1YmxpY0tleShcbiAgICAgIG5ld1B1YmxpY0tleShwdWJsaWNLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHVibGljS2V5KSksXG4gICAgICB0cmFuc2FjdGlvbkRldGFpbHMsXG4gICAgICB7XG4gICAgICAgIGFyYml0cmFyeURhdGE6IHRoaXMuZ2V0QXJiaXRyYXJ5RGF0YShkYXRhKSxcbiAgICAgICAgYXNzZXRJZDogZGF0YT8uYXNzZXRJRCA/IHBhcnNlSW50KGRhdGEuYXNzZXRJRCwgMTApIDogdW5kZWZpbmVkXG4gICAgICB9XG4gICAgKVxuXG4gICAgaWYgKGZlZUVzdGltYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2QgYGVzdGltYXRlRmVlRGVmYXVsdHNGcm9tUHVibGljS2V5YCBub3Qgc3VwcG9ydGVkLicpXG4gICAgfVxuXG4gICAgY29uc3QgZmVlRGVmYXVsdHM6IEZlZURlZmF1bHRzID0gaXNBbW91bnQoZmVlRXN0aW1hdGlvbilcbiAgICAgID8geyBsb3c6IGZlZUVzdGltYXRpb24sIG1lZGl1bTogZmVlRXN0aW1hdGlvbiwgaGlnaDogZmVlRXN0aW1hdGlvbiB9XG4gICAgICA6IGZlZUVzdGltYXRpb25cblxuICAgIHJldHVybiB0aGlzLmNvbnZlcnRGZWVEZWZhdWx0c1YxVG9WMChmZWVEZWZhdWx0cylcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwcmVwYXJlVHJhbnNhY3Rpb25Gcm9tRXh0ZW5kZWRQdWJsaWNLZXkoXG4gICAgZXh0ZW5kZWRQdWJsaWNLZXk6IHN0cmluZyxcbiAgICBfb2Zmc2V0OiBudW1iZXIsXG4gICAgcmVjaXBpZW50czogc3RyaW5nW10sXG4gICAgdmFsdWVzOiBzdHJpbmdbXSxcbiAgICBmZWU6IHN0cmluZyxcbiAgICBleHRyYXM/OiB7XG4gICAgICBba2V5OiBzdHJpbmddOiB1bmtub3duXG5cbiAgICAgIC8vIEJpdGNvaW5cbiAgICAgIG1hc3RlckZpbmdlcnByaW50OiBzdHJpbmdcbiAgICAgIHJlcGxhY2VCeUZlZTogYm9vbGVhblxuXG4gICAgICAvLyBUZXpvcyBGQTJcbiAgICAgIGFzc2V0SUQ/OiBzdHJpbmdcbiAgICB9XG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCFpc09ubGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkgfHwgIWlzQmlwMzJQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9ubGluZS4nKVxuICAgIH1cblxuICAgIGNvbnN0IGlzU2Vnd2l0ID0gaXNCaXRjb2luU2Vnd2l0UHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKVxuICAgIGNvbnN0IGlzVGFwcm9vdCA9IGlzQml0Y29pblRhcHJvb3RQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpXG5cbiAgICBsZXQgdHJhbnNhY3Rpb246IFVuc2lnbmVkVHJhbnNhY3Rpb25cbiAgICBpZiAoaXNTZWd3aXQgfHwgaXNUYXByb290KSB7XG4gICAgICB0cmFuc2FjdGlvbiA9IGF3YWl0IChpc1NlZ3dpdFxuICAgICAgICA/ICh0aGlzLnByb3RvY29sVjEgYXMgQml0Y29pblNlZ3dpdFByb3RvY29sKVxuICAgICAgICA6ICh0aGlzLnByb3RvY29sVjEgYXMgQml0Y29pblRhcHJvb3RQcm90b2NvbClcbiAgICAgICkucHJlcGFyZVRyYW5zYWN0aW9uV2l0aFB1YmxpY0tleShcbiAgICAgICAgbmV3RXh0ZW5kZWRQdWJsaWNLZXkoZXh0ZW5kZWRQdWJsaWNLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAoZXh0ZW5kZWRQdWJsaWNLZXkpKSxcbiAgICAgICAgdGhpcy5jb21iaW5lVHJhbnNhY3Rpb25EZXRhaWxzKHJlY2lwaWVudHMsIHZhbHVlcyksXG4gICAgICAgIHtcbiAgICAgICAgICBmZWU6IG5ld0Ftb3VudChmZWUsICdibG9ja2NoYWluJyksXG4gICAgICAgICAgYXJiaXRyYXJ5RGF0YTogdGhpcy5nZXRBcmJpdHJhcnlEYXRhKGV4dHJhcyksXG4gICAgICAgICAgbWFzdGVyRmluZ2VycHJpbnQ6IHtcbiAgICAgICAgICAgIGZvcm1hdDogJ2hleCcsXG4gICAgICAgICAgICB2YWx1ZTogZXh0cmFzPy5tYXN0ZXJGaW5nZXJwcmludFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVwbGFjZUJ5RmVlOiBleHRyYXM/LnJlcGxhY2VCeUZlZVxuICAgICAgICB9XG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLnByZXBhcmVUcmFuc2FjdGlvbldpdGhQdWJsaWNLZXkoXG4gICAgICAgIG5ld0V4dGVuZGVkUHVibGljS2V5KGV4dGVuZGVkUHVibGljS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKGV4dGVuZGVkUHVibGljS2V5KSksXG4gICAgICAgIHRoaXMuY29tYmluZVRyYW5zYWN0aW9uRGV0YWlscyhyZWNpcGllbnRzLCB2YWx1ZXMpLFxuICAgICAgICB7XG4gICAgICAgICAgZmVlOiBuZXdBbW91bnQoZmVlLCAnYmxvY2tjaGFpbicpLFxuICAgICAgICAgIGFzc2V0SWQ6IGV4dHJhcz8uYXNzZXRJRCA/IHBhcnNlSW50KGV4dHJhcy5hc3NldElELCAxMCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgYXJiaXRyYXJ5RGF0YTogdGhpcy5nZXRBcmJpdHJhcnlEYXRhKGV4dHJhcylcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uVjAgPSBhd2FpdCB0aGlzLmNvbnZlcnRVbnNpZ25lZFRyYW5zYWN0aW9uVjFUb1YwKHRyYW5zYWN0aW9uLCBleHRlbmRlZFB1YmxpY0tleSlcblxuICAgIHJldHVybiB0cmFuc2FjdGlvblYwLnRyYW5zYWN0aW9uXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcHJlcGFyZVRyYW5zYWN0aW9uRnJvbVB1YmxpY0tleShcbiAgICBwdWJsaWNLZXk6IHN0cmluZyxcbiAgICByZWNpcGllbnRzOiBzdHJpbmdbXSxcbiAgICB2YWx1ZXM6IHN0cmluZ1tdLFxuICAgIGZlZTogc3RyaW5nLFxuICAgIGV4dHJhcz86IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd25cblxuICAgICAgLy8gVGV6b3MgRkEyXG4gICAgICBhc3NldElEPzogc3RyaW5nXG4gICAgfVxuICApOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghaXNPbmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9ubGluZS4nKVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uOiBVbnNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLnByZXBhcmVUcmFuc2FjdGlvbldpdGhQdWJsaWNLZXkoXG4gICAgICBuZXdQdWJsaWNLZXkocHVibGljS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKHB1YmxpY0tleSkpLFxuICAgICAgdGhpcy5jb21iaW5lVHJhbnNhY3Rpb25EZXRhaWxzKHJlY2lwaWVudHMsIHZhbHVlcyksXG4gICAgICB7XG4gICAgICAgIGZlZTogbmV3QW1vdW50KGZlZSwgJ2Jsb2NrY2hhaW4nKSxcbiAgICAgICAgYXJiaXRyYXJ5RGF0YTogdGhpcy5nZXRBcmJpdHJhcnlEYXRhKGV4dHJhcyksXG4gICAgICAgIGFzc2V0SWQ6IGV4dHJhcz8uYXNzZXRJRCA/IHBhcnNlSW50KGV4dHJhcy5hc3NldElELCAxMCkgOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICApXG5cbiAgICBjb25zdCB0cmFuc2FjdGlvblYwID0gYXdhaXQgdGhpcy5jb252ZXJ0VW5zaWduZWRUcmFuc2FjdGlvblYxVG9WMCh0cmFuc2FjdGlvbiwgcHVibGljS2V5KVxuXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uVjAudHJhbnNhY3Rpb25cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBicm9hZGNhc3RUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogYW55KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzT25saW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBPbmxpbmUuJylcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHsgdHJhbnNhY3Rpb246IHJhd1RyYW5zYWN0aW9uLCBhY2NvdW50SWRlbnRpZmllcjogJycgfVxuICAgIGNvbnN0IHNpZ25lZDogU2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLmNvbnZlcnRTaWduZWRUcmFuc2FjdGlvblYwVG9WMSh0cmFuc2FjdGlvbilcblxuICAgIHJldHVybiB0aGlzLnByb3RvY29sVjEuYnJvYWRjYXN0VHJhbnNhY3Rpb24oc2lnbmVkKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFkZHJlc3NGcm9tUHVibGljS2V5KHB1YmxpY0tleTogc3RyaW5nLCBfY3Vyc29yPzogSVByb3RvY29sQWRkcmVzc0N1cnNvcik6IFByb21pc2U8SUFpckdhcEFkZHJlc3NSZXN1bHQ+IHtcbiAgICBjb25zdCBhZGRyZXNzOiBBZGRyZXNzV2l0aEN1cnNvciB8IHN0cmluZyA9IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShcbiAgICAgIG5ld1B1YmxpY0tleShwdWJsaWNLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHVibGljS2V5KSlcbiAgICApXG5cbiAgICByZXR1cm4ge1xuICAgICAgYWRkcmVzczogdHlwZW9mIGFkZHJlc3MgPT09ICdzdHJpbmcnID8gYWRkcmVzcyA6IGFkZHJlc3MuYWRkcmVzcyxcbiAgICAgIGN1cnNvcjogdHlwZW9mIGFkZHJlc3MgPT09ICdvYmplY3QnID8gYWRkcmVzcy5jdXJzb3IgOiB7IGhhc05leHQ6IGZhbHNlIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QWRkcmVzc2VzRnJvbVB1YmxpY0tleShwdWJsaWNLZXk6IHN0cmluZywgX2N1cnNvcj86IElQcm90b2NvbEFkZHJlc3NDdXJzb3IpOiBQcm9taXNlPElBaXJHYXBBZGRyZXNzUmVzdWx0W10+IHtcbiAgICBpZiAoaGFzTXVsdGlBZGRyZXNzUHVibGljS2V5cyh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICBjb25zdCBwazogUHVibGljS2V5ID0gbmV3UHVibGljS2V5KHB1YmxpY0tleSwgZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMChwdWJsaWNLZXkpKVxuICAgICAgY29uc3QgYWRkcmVzc2VzOiBBZGRyZXNzV2l0aEN1cnNvcltdID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldEluaXRpYWxBZGRyZXNzZXNGcm9tUHVibGljS2V5KHBrKVxuXG4gICAgICByZXR1cm4gYWRkcmVzc2VzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbYXdhaXQgdGhpcy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXkpXVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBZGRyZXNzRnJvbUV4dGVuZGVkUHVibGljS2V5KFxuICAgIGV4dGVuZGVkUHVibGljS2V5OiBzdHJpbmcsXG4gICAgdmlzaWJpbGl0eURlcml2YXRpb25JbmRleDogbnVtYmVyLFxuICAgIGFkZHJlc3NEZXJpdmF0aW9uSW5kZXg6IG51bWJlclxuICApOiBQcm9taXNlPElBaXJHYXBBZGRyZXNzUmVzdWx0PiB7XG4gICAgaWYgKCFpc0JpcDMyUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBCaXAzMi4nKVxuICAgIH1cblxuICAgIGNvbnN0IGRlcml2ZWRQdWJsaWNLZXk6IFB1YmxpY0tleSA9IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5kZXJpdmVGcm9tRXh0ZW5kZWRQdWJsaWNLZXkoXG4gICAgICBuZXdFeHRlbmRlZFB1YmxpY0tleShleHRlbmRlZFB1YmxpY0tleSwgZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMChleHRlbmRlZFB1YmxpY0tleSkpLFxuICAgICAgdmlzaWJpbGl0eURlcml2YXRpb25JbmRleCxcbiAgICAgIGFkZHJlc3NEZXJpdmF0aW9uSW5kZXhcbiAgICApXG5cbiAgICByZXR1cm4gdGhpcy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShkZXJpdmVkUHVibGljS2V5LnZhbHVlKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFkZHJlc3Nlc0Zyb21FeHRlbmRlZFB1YmxpY0tleShcbiAgICBleHRlbmRlZFB1YmxpY0tleTogc3RyaW5nLFxuICAgIHZpc2liaWxpdHlEZXJpdmF0aW9uSW5kZXg6IG51bWJlcixcbiAgICBhZGRyZXNzQ291bnQ6IG51bWJlcixcbiAgICBvZmZzZXQ6IG51bWJlclxuICApOiBQcm9taXNlPElBaXJHYXBBZGRyZXNzUmVzdWx0W10+IHtcbiAgICBpZiAoIWlzQmlwMzJQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IEJpcDMyLicpXG4gICAgfVxuXG4gICAgY29uc3QgZ2VuZXJhdG9yQXJyYXkgPSBBcnJheS5mcm9tKG5ldyBBcnJheShhZGRyZXNzQ291bnQpLCAoXywgaSkgPT4gaSArIG9mZnNldClcblxuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIGdlbmVyYXRvckFycmF5Lm1hcCgoYWRkcmVzc0Rlcml2YXRpb25JbmRleDogbnVtYmVyKSA9PlxuICAgICAgICB0aGlzLmdldEFkZHJlc3NGcm9tRXh0ZW5kZWRQdWJsaWNLZXkoZXh0ZW5kZWRQdWJsaWNLZXksIHZpc2liaWxpdHlEZXJpdmF0aW9uSW5kZXgsIGFkZHJlc3NEZXJpdmF0aW9uSW5kZXgpXG4gICAgICApXG4gICAgKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFRyYW5zYWN0aW9uRGV0YWlscyhcbiAgICB0cmFuc2FjdGlvbjogVW5zaWduZWRUcmFuc2FjdGlvblYwLFxuICAgIGRhdGE/OiB7XG4gICAgICBba2V5OiBzdHJpbmddOiB1bmtub3duXG4gICAgICB0cmFuc2FjdGlvbk93bmVyPzogc3RyaW5nXG5cbiAgICAgIC8vIFRlem9zU2FwbGluZ1xuICAgICAga25vd25WaWV3aW5nS2V5cz86IHN0cmluZ1tdXG4gICAgfVxuICApOiBQcm9taXNlPElBaXJHYXBUcmFuc2FjdGlvbltdPiB7XG4gICAgY29uc3QgdW5zaWduZWQ6IFVuc2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLmNvbnZlcnRVbnNpZ25lZFRyYW5zYWN0aW9uVjBUb1YxKHRyYW5zYWN0aW9uLCBkYXRhPy50cmFuc2FjdGlvbk93bmVyKVxuXG4gICAgbGV0IHRyYW5zYWN0aW9uczogQWlyR2FwVHJhbnNhY3Rpb25bXVxuICAgIGlmICh0aGlzLmlzRXh0ZW5kZWRQdWJsaWNLZXkodHJhbnNhY3Rpb24ucHVibGljS2V5KSkge1xuICAgICAgaWYgKCFpc0JpcDMyUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IEJpcDMyLicpXG4gICAgICB9XG5cbiAgICAgIHRyYW5zYWN0aW9ucyA9IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXREZXRhaWxzRnJvbVRyYW5zYWN0aW9uKFxuICAgICAgICB1bnNpZ25lZCxcbiAgICAgICAgbmV3RXh0ZW5kZWRQdWJsaWNLZXkodHJhbnNhY3Rpb24ucHVibGljS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKHRyYW5zYWN0aW9uLnB1YmxpY0tleSkpXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHB1YmxpY0tleTogUHVibGljS2V5ID0gbmV3UHVibGljS2V5KHRyYW5zYWN0aW9uLnB1YmxpY0tleSwgZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMCh0cmFuc2FjdGlvbi5wdWJsaWNLZXkpKVxuICAgICAgdHJhbnNhY3Rpb25zID1cbiAgICAgICAgZGF0YT8ua25vd25WaWV3aW5nS2V5cyAmJiBpc1Rlem9zU2FwbGluZ1Byb3RvY29sKHRoaXMucHJvdG9jb2xWMSlcbiAgICAgICAgICA/IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXREZXRhaWxzRnJvbVRyYW5zYWN0aW9uKHVuc2lnbmVkIGFzIGFueSwgcHVibGljS2V5LCBkYXRhLmtub3duVmlld2luZ0tleXMpXG4gICAgICAgICAgOiBhd2FpdCB0aGlzLnByb3RvY29sVjEuZ2V0RGV0YWlsc0Zyb21UcmFuc2FjdGlvbih1bnNpZ25lZCwgcHVibGljS2V5KVxuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uc1YwOiBJQWlyR2FwVHJhbnNhY3Rpb25bXSA9IGF3YWl0IHRoaXMuY29udmVydFRyYW5zYWN0aW9uRGV0YWlsc1YxVG9WMCh0cmFuc2FjdGlvbnMpXG5cbiAgICByZXR1cm4gdHJhbnNhY3Rpb25zVjAubWFwKFxuICAgICAgKHR4OiBJQWlyR2FwVHJhbnNhY3Rpb24pOiBJQWlyR2FwVHJhbnNhY3Rpb24gPT4gKHtcbiAgICAgICAgLi4udHgsXG4gICAgICAgIHRyYW5zYWN0aW9uRGV0YWlsczogdHgudHJhbnNhY3Rpb25EZXRhaWxzID8/IHRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uXG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRUcmFuc2FjdGlvbkRldGFpbHNGcm9tU2lnbmVkKFxuICAgIHRyYW5zYWN0aW9uOiBTaWduZWRUcmFuc2FjdGlvblYwLFxuICAgIGRhdGE/OiB7XG4gICAgICBba2V5OiBzdHJpbmddOiB1bmtub3duXG4gICAgICB0cmFuc2FjdGlvbk93bmVyPzogc3RyaW5nXG5cbiAgICAgIC8vIFRlem9zU2FwbGluZ1xuICAgICAga25vd25WaWV3aW5nS2V5cz86IHN0cmluZ1tdXG4gICAgfVxuICApOiBQcm9taXNlPElBaXJHYXBUcmFuc2FjdGlvbltdPiB7XG4gICAgY29uc3Qgc2lnbmVkOiBTaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuY29udmVydFNpZ25lZFRyYW5zYWN0aW9uVjBUb1YxKHRyYW5zYWN0aW9uLCBkYXRhPy50cmFuc2FjdGlvbk93bmVyKVxuXG4gICAgbGV0IHRyYW5zYWN0aW9uczogQWlyR2FwVHJhbnNhY3Rpb25bXVxuICAgIGlmICh0aGlzLmlzRXh0ZW5kZWRQdWJsaWNLZXkodHJhbnNhY3Rpb24uYWNjb3VudElkZW50aWZpZXIpKSB7XG4gICAgICBpZiAoIWlzQmlwMzJQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGluZmVyZmFjZTogQmlwMzIuJylcbiAgICAgIH1cblxuICAgICAgdHJhbnNhY3Rpb25zID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldERldGFpbHNGcm9tVHJhbnNhY3Rpb24oXG4gICAgICAgIHNpZ25lZCxcbiAgICAgICAgbmV3RXh0ZW5kZWRQdWJsaWNLZXkodHJhbnNhY3Rpb24uYWNjb3VudElkZW50aWZpZXIsIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAodHJhbnNhY3Rpb24uYWNjb3VudElkZW50aWZpZXIpKVxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwdWJsaWNLZXk6IFB1YmxpY0tleSA9IG5ld1B1YmxpY0tleSh0cmFuc2FjdGlvbi5hY2NvdW50SWRlbnRpZmllciwgZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMCh0cmFuc2FjdGlvbi5hY2NvdW50SWRlbnRpZmllcikpXG4gICAgICB0cmFuc2FjdGlvbnMgPVxuICAgICAgICBkYXRhPy5rbm93blZpZXdpbmdLZXlzICYmIGlzVGV6b3NTYXBsaW5nUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKVxuICAgICAgICAgID8gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldERldGFpbHNGcm9tVHJhbnNhY3Rpb24oc2lnbmVkIGFzIGFueSwgcHVibGljS2V5LCBkYXRhLmtub3duVmlld2luZ0tleXMpXG4gICAgICAgICAgOiBhd2FpdCB0aGlzLnByb3RvY29sVjEuZ2V0RGV0YWlsc0Zyb21UcmFuc2FjdGlvbihzaWduZWQsIHB1YmxpY0tleSlcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbnNWMDogSUFpckdhcFRyYW5zYWN0aW9uW10gPSBhd2FpdCB0aGlzLmNvbnZlcnRUcmFuc2FjdGlvbkRldGFpbHNWMVRvVjAodHJhbnNhY3Rpb25zKVxuXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uc1YwLm1hcChcbiAgICAgICh0eDogSUFpckdhcFRyYW5zYWN0aW9uKTogSUFpckdhcFRyYW5zYWN0aW9uID0+ICh7XG4gICAgICAgIC4uLnR4LFxuICAgICAgICB0cmFuc2FjdGlvbkRldGFpbHM6IHR4LnRyYW5zYWN0aW9uRGV0YWlscyA/PyB0cmFuc2FjdGlvbi50cmFuc2FjdGlvblxuICAgICAgfSlcbiAgICApXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdmVyaWZ5TWVzc2FnZShtZXNzYWdlOiBzdHJpbmcsIHNpZ25hdHVyZTogc3RyaW5nLCBwdWJsaWNLZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghaXNPZmZsaW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSB8fCAhY2FuU2lnbk1lc3NhZ2UodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBPZmZsaW5lLCBTaWduTWVzc2FnZS4nKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnByb3RvY29sVjEudmVyaWZ5TWVzc2FnZVdpdGhQdWJsaWNLZXkoXG4gICAgICBtZXNzYWdlLFxuICAgICAgbmV3U2lnbmF0dXJlKHNpZ25hdHVyZSwgZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMChzaWduYXR1cmUpKSxcbiAgICAgIG5ld1B1YmxpY0tleShwdWJsaWNLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHVibGljS2V5KSlcbiAgICApXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZW5jcnlwdEFzeW1tZXRyaWMocGF5bG9hZDogc3RyaW5nLCBwdWJsaWNLZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc09mZmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpIHx8ICFjYW5FbmNyeXB0QXN5bW1ldHJpYyh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9mZmxpbmUsIEFzeW1tZXRyaWNFbmNyeXB0aW9uLicpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucHJvdG9jb2xWMS5lbmNyeXB0QXN5bW1ldHJpY1dpdGhQdWJsaWNLZXkocGF5bG9hZCwgbmV3UHVibGljS2V5KHB1YmxpY0tleSwgZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMChwdWJsaWNLZXkpKSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRQdWJsaWNLZXlGcm9tTW5lbW9uaWMobW5lbW9uaWM6IHN0cmluZywgZGVyaXZhdGlvblBhdGg6IHN0cmluZywgcGFzc3dvcmQ/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghaXNPZmZsaW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBPZmZsaW5lLicpXG4gICAgfVxuXG4gICAgY29uc3QgY3J5cHRvOiBDcnlwdG9Db25maWd1cmF0aW9uID0gdGhpcy5jcnlwdG8gPz8gKGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRDcnlwdG9Db25maWd1cmF0aW9uKCkpXG4gICAgY29uc3Qgc2VlZDogQnVmZmVyID0gYXdhaXQgbW5lbW9uaWNUb1NlZWQoY3J5cHRvLCBtbmVtb25pYywgcGFzc3dvcmQpXG5cbiAgICByZXR1cm4gdGhpcy5nZXRQdWJsaWNLZXlGcm9tSGV4U2VjcmV0KHNlZWQudG9TdHJpbmcoJ2hleCcpLCBkZXJpdmF0aW9uUGF0aClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRQcml2YXRlS2V5RnJvbU1uZW1vbmljKG1uZW1vbmljOiBzdHJpbmcsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsIHBhc3N3b3JkPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzT2ZmbGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGluZmVyZmFjZTogT2ZmbGluZS4nKVxuICAgIH1cblxuICAgIGNvbnN0IGNyeXB0bzogQ3J5cHRvQ29uZmlndXJhdGlvbiA9IHRoaXMuY3J5cHRvID8/IChhd2FpdCB0aGlzLnByb3RvY29sVjEuZ2V0Q3J5cHRvQ29uZmlndXJhdGlvbigpKVxuICAgIGNvbnN0IHNlZWQ6IEJ1ZmZlciA9IGF3YWl0IG1uZW1vbmljVG9TZWVkKGNyeXB0bywgbW5lbW9uaWMsIHBhc3N3b3JkKVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJpdmF0ZUtleUZyb21IZXhTZWNyZXQoc2VlZC50b1N0cmluZygnaGV4JyksIGRlcml2YXRpb25QYXRoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEV4dGVuZGVkUHVibGljS2V5RnJvbU1uZW1vbmljKG1uZW1vbmljOiBzdHJpbmcsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcsIHBhc3N3b3JkPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzT2ZmbGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkgfHwgIWlzQmlwMzJQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9mZmxpbmUsIEJpcDMyLicpXG4gICAgfVxuXG4gICAgY29uc3QgY3J5cHRvOiBDcnlwdG9Db25maWd1cmF0aW9uID0gdGhpcy5jcnlwdG8gPz8gKGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRDcnlwdG9Db25maWd1cmF0aW9uKCkpXG4gICAgY29uc3Qgc2VlZDogQnVmZmVyID0gYXdhaXQgbW5lbW9uaWNUb1NlZWQoY3J5cHRvLCBtbmVtb25pYywgcGFzc3dvcmQpXG5cbiAgICByZXR1cm4gdGhpcy5nZXRFeHRlbmRlZFB1YmxpY0tleUZyb21IZXhTZWNyZXQoc2VlZC50b1N0cmluZygnaGV4JyksIGRlcml2YXRpb25QYXRoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEV4dGVuZGVkUHJpdmF0ZUtleUZyb21NbmVtb25pYyhtbmVtb25pYzogc3RyaW5nLCBkZXJpdmF0aW9uUGF0aDogc3RyaW5nLCBwYXNzd29yZD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc09mZmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpIHx8ICFpc0JpcDMyUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBPZmZsaW5lLCBCaXAzMi4nKVxuICAgIH1cblxuICAgIGNvbnN0IGNyeXB0bzogQ3J5cHRvQ29uZmlndXJhdGlvbiA9IHRoaXMuY3J5cHRvID8/IChhd2FpdCB0aGlzLnByb3RvY29sVjEuZ2V0Q3J5cHRvQ29uZmlndXJhdGlvbigpKVxuICAgIGNvbnN0IHNlZWQ6IEJ1ZmZlciA9IGF3YWl0IG1uZW1vbmljVG9TZWVkKGNyeXB0bywgbW5lbW9uaWMsIHBhc3N3b3JkKVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0RXh0ZW5kZWRQcml2YXRlS2V5RnJvbUhleFNlY3JldChzZWVkLnRvU3RyaW5nKCdoZXgnKSwgZGVyaXZhdGlvblBhdGgpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0UHVibGljS2V5RnJvbUhleFNlY3JldChzZWNyZXQ6IHN0cmluZywgZGVyaXZhdGlvblBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc09mZmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9mZmxpbmUsIEJpcDMyLicpXG4gICAgfVxuXG4gICAgY29uc3QgY3J5cHRvOiBDcnlwdG9Db25maWd1cmF0aW9uID0gdGhpcy5jcnlwdG8gPz8gKGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRDcnlwdG9Db25maWd1cmF0aW9uKCkpXG4gICAgY29uc3QgZGVyaXZhdGl2ZTogQ3J5cHRvRGVyaXZhdGl2ZSA9IGF3YWl0IGRlcml2ZShjcnlwdG8sIEJ1ZmZlci5mcm9tKHNlY3JldCwgJ2hleCcpLCBkZXJpdmF0aW9uUGF0aClcbiAgICBjb25zdCBrZXlQYWlyOiBLZXlQYWlyID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldEtleVBhaXJGcm9tRGVyaXZhdGl2ZShkZXJpdmF0aXZlKVxuXG4gICAgcmV0dXJuIGtleVBhaXIucHVibGljS2V5LnZhbHVlXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0UHJpdmF0ZUtleUZyb21IZXhTZWNyZXQoc2VjcmV0OiBzdHJpbmcsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghaXNPZmZsaW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBPZmZsaW5lLicpXG4gICAgfVxuXG4gICAgY29uc3QgY3J5cHRvOiBDcnlwdG9Db25maWd1cmF0aW9uID0gdGhpcy5jcnlwdG8gPz8gKGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRDcnlwdG9Db25maWd1cmF0aW9uKCkpXG4gICAgY29uc3QgZGVyaXZhdGl2ZTogQ3J5cHRvRGVyaXZhdGl2ZSA9IGF3YWl0IGRlcml2ZShjcnlwdG8sIEJ1ZmZlci5mcm9tKHNlY3JldCwgJ2hleCcpLCBkZXJpdmF0aW9uUGF0aClcbiAgICBjb25zdCBrZXlQYWlyOiBLZXlQYWlyID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldEtleVBhaXJGcm9tRGVyaXZhdGl2ZShkZXJpdmF0aXZlKVxuXG4gICAgcmV0dXJuIGtleVBhaXIuc2VjcmV0S2V5LnZhbHVlXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RXh0ZW5kZWRQdWJsaWNLZXlGcm9tSGV4U2VjcmV0KHNlY3JldDogc3RyaW5nLCBkZXJpdmF0aW9uUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzT2ZmbGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkgfHwgIWlzQmlwMzJQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9mZmxpbmUsIEJpcDMyLicpXG4gICAgfVxuXG4gICAgY29uc3QgY3J5cHRvOiBDcnlwdG9Db25maWd1cmF0aW9uID0gdGhpcy5jcnlwdG8gPz8gKGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRDcnlwdG9Db25maWd1cmF0aW9uKCkpXG4gICAgY29uc3QgZGVyaXZhdGl2ZTogQ3J5cHRvRGVyaXZhdGl2ZSA9IGF3YWl0IGRlcml2ZShjcnlwdG8sIEJ1ZmZlci5mcm9tKHNlY3JldCwgJ2hleCcpLCBkZXJpdmF0aW9uUGF0aClcbiAgICBjb25zdCBrZXlQYWlyOiBFeHRlbmRlZEtleVBhaXIgPSBhd2FpdCB0aGlzLnByb3RvY29sVjEuZ2V0RXh0ZW5kZWRLZXlQYWlyRnJvbURlcml2YXRpdmUoZGVyaXZhdGl2ZSlcblxuICAgIHJldHVybiBrZXlQYWlyLnB1YmxpY0tleS52YWx1ZVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEV4dGVuZGVkUHJpdmF0ZUtleUZyb21IZXhTZWNyZXQoc2VjcmV0OiBzdHJpbmcsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghaXNPZmZsaW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSB8fCAhaXNCaXAzMlByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGluZmVyZmFjZTogT2ZmbGluZSwgQmlwMzIuJylcbiAgICB9XG5cbiAgICBjb25zdCBjcnlwdG86IENyeXB0b0NvbmZpZ3VyYXRpb24gPSB0aGlzLmNyeXB0byA/PyAoYXdhaXQgdGhpcy5wcm90b2NvbFYxLmdldENyeXB0b0NvbmZpZ3VyYXRpb24oKSlcbiAgICBjb25zdCBkZXJpdmF0aXZlOiBDcnlwdG9EZXJpdmF0aXZlID0gYXdhaXQgZGVyaXZlKGNyeXB0bywgQnVmZmVyLmZyb20oc2VjcmV0LCAnaGV4JyksIGRlcml2YXRpb25QYXRoKVxuICAgIGNvbnN0IGtleVBhaXI6IEV4dGVuZGVkS2V5UGFpciA9IGF3YWl0IHRoaXMucHJvdG9jb2xWMS5nZXRFeHRlbmRlZEtleVBhaXJGcm9tRGVyaXZhdGl2ZShkZXJpdmF0aXZlKVxuXG4gICAgcmV0dXJuIGtleVBhaXIuc2VjcmV0S2V5LnZhbHVlXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2lnbldpdGhFeHRlbmRlZFByaXZhdGVLZXkoZXh0ZW5kZWRQcml2YXRlS2V5OiBzdHJpbmcsIHRyYW5zYWN0aW9uOiBhbnksIGNoaWxkRGVyaXZhdGlvblBhdGg/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghaXNPZmZsaW5lUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSB8fCAhaXNCaXAzMlByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGluZmVyZmFjZTogT2ZmbGluZSwgQmlwMzIuJylcbiAgICB9XG5cbiAgICBjb25zdCB1bnNpZ25lZDogVW5zaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuY29udmVydFVuc2lnbmVkVHJhbnNhY3Rpb25WMFRvVjEoe1xuICAgICAgdHJhbnNhY3Rpb24sXG4gICAgICBwdWJsaWNLZXk6ICcnXG4gICAgfSlcblxuICAgIGNvbnN0IGV4dGVuZGVkU2VjcmV0S2V5OiBFeHRlbmRlZFNlY3JldEtleSA9IG5ld0V4dGVuZGVkU2VjcmV0S2V5KGV4dGVuZGVkUHJpdmF0ZUtleSwgZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMChleHRlbmRlZFByaXZhdGVLZXkpKVxuXG4gICAgY29uc3Qgc2VjcmV0S2V5OiBFeHRlbmRlZFNlY3JldEtleSB8IFNlY3JldEtleSA9IGNoaWxkRGVyaXZhdGlvblBhdGhcbiAgICAgID8gYXdhaXQgdGhpcy5kZXJpdmVTZWNyZXRLZXkoZXh0ZW5kZWRTZWNyZXRLZXksIGNoaWxkRGVyaXZhdGlvblBhdGgpXG4gICAgICA6IGV4dGVuZGVkU2VjcmV0S2V5XG5cbiAgICBjb25zdCBzaWduZWQ6IFNpZ25lZFRyYW5zYWN0aW9uID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLnNpZ25UcmFuc2FjdGlvbldpdGhTZWNyZXRLZXkodW5zaWduZWQsIHNlY3JldEtleSlcbiAgICBjb25zdCBzaWduZWRWMDogVHJhbnNhY3Rpb25TaWduUmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbnZlcnRTaWduZWRUcmFuc2FjdGlvblYxVG9WMChzaWduZWQsICcnKVxuXG4gICAgcmV0dXJuIHNpZ25lZFYwLnRyYW5zYWN0aW9uXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2lnbldpdGhQcml2YXRlS2V5KHByaXZhdGVLZXk6IHN0cmluZywgdHJhbnNhY3Rpb246IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc09mZmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9mZmxpbmUuJylcbiAgICB9XG5cbiAgICBjb25zdCB1bnNpZ25lZDogVW5zaWduZWRUcmFuc2FjdGlvbiA9IGF3YWl0IHRoaXMuY29udmVydFVuc2lnbmVkVHJhbnNhY3Rpb25WMFRvVjEoe1xuICAgICAgdHJhbnNhY3Rpb24sXG4gICAgICBwdWJsaWNLZXk6ICcnXG4gICAgfSlcblxuICAgIGNvbnN0IHNpZ25lZDogU2lnbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCB0aGlzLnByb3RvY29sVjEuc2lnblRyYW5zYWN0aW9uV2l0aFNlY3JldEtleShcbiAgICAgIHVuc2lnbmVkLFxuICAgICAgbmV3U2VjcmV0S2V5KHByaXZhdGVLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHJpdmF0ZUtleSkpXG4gICAgKVxuICAgIGNvbnN0IHNpZ25lZFYwOiBUcmFuc2FjdGlvblNpZ25SZXNwb25zZSA9IGF3YWl0IHRoaXMuY29udmVydFNpZ25lZFRyYW5zYWN0aW9uVjFUb1YwKHNpZ25lZCwgJycpXG5cbiAgICByZXR1cm4gc2lnbmVkVjAudHJhbnNhY3Rpb25cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzaWduTWVzc2FnZShtZXNzYWdlOiBzdHJpbmcsIGtleXBhaXI6IHsgcHVibGljS2V5Pzogc3RyaW5nOyBwcml2YXRlS2V5OiBzdHJpbmcgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc09mZmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpIHx8ICFjYW5TaWduTWVzc2FnZSh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3Qgc3VwcG9ydGVkLCByZXF1aXJlZCBpbmZlcmZhY2U6IE9mZmxpbmUsIFNpZ25NZXNzYWdlLicpXG4gICAgfVxuXG4gICAgY29uc3QgcHJpdmF0ZUtleSA9XG4gICAgICBnZXRTZWNyZXRLZXlUeXBlKGtleXBhaXIucHJpdmF0ZUtleSkgPT09ICd4cHJpdidcbiAgICAgICAgPyBhd2FpdCB0aGlzLmdldFByaXZhdGVLZXlGcm9tRXh0ZW5kZWRQcml2YXRlS2V5KGtleXBhaXIucHJpdmF0ZUtleSlcbiAgICAgICAgOiBrZXlwYWlyLnByaXZhdGVLZXlcblxuICAgIGNvbnN0IHB1YmxpY0tleSA9IGtleXBhaXIucHVibGljS2V5XG4gICAgICA/IGdldFB1YmxpY0tleVR5cGUoa2V5cGFpci5wdWJsaWNLZXkpID09PSAneHB1YidcbiAgICAgICAgPyBhd2FpdCB0aGlzLmdldFB1YmxpY0tleUZyb21FeHRlbmRlZFByaXZhdGVLZXkoa2V5cGFpci5wdWJsaWNLZXkpXG4gICAgICAgIDoga2V5cGFpci5wdWJsaWNLZXlcbiAgICAgIDogJydcblxuICAgIGNvbnN0IHNpZ25hdHVyZTogU2lnbmF0dXJlID0gYXdhaXQgdGhpcy5wcm90b2NvbFYxLnNpZ25NZXNzYWdlV2l0aEtleVBhaXIobWVzc2FnZSwge1xuICAgICAgc2VjcmV0S2V5OiBuZXdTZWNyZXRLZXkocHJpdmF0ZUtleSwgZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMChwcml2YXRlS2V5KSksXG4gICAgICBwdWJsaWNLZXk6IG5ld1B1YmxpY0tleShwdWJsaWNLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHVibGljS2V5KSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHNpZ25hdHVyZS52YWx1ZVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGRlY3J5cHRBc3ltbWV0cmljKGVuY3J5cHRlZFBheWxvYWQ6IHN0cmluZywga2V5cGFpcjogeyBwdWJsaWNLZXk/OiBzdHJpbmc7IHByaXZhdGVLZXk6IHN0cmluZyB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzT2ZmbGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkgfHwgIWNhbkVuY3J5cHRBc3ltbWV0cmljKHRoaXMucHJvdG9jb2xWMSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBzdXBwb3J0ZWQsIHJlcXVpcmVkIGluZmVyZmFjZTogT2ZmbGluZSwgQXN5bW1ldHJpY0VuY3J5cHRpb24uJylcbiAgICB9XG5cbiAgICBjb25zdCBwcml2YXRlS2V5ID1cbiAgICAgIGdldFNlY3JldEtleVR5cGUoa2V5cGFpci5wcml2YXRlS2V5KSA9PT0gJ3hwcml2J1xuICAgICAgICA/IGF3YWl0IHRoaXMuZ2V0UHJpdmF0ZUtleUZyb21FeHRlbmRlZFByaXZhdGVLZXkoa2V5cGFpci5wcml2YXRlS2V5KVxuICAgICAgICA6IGtleXBhaXIucHJpdmF0ZUtleVxuXG4gICAgY29uc3QgcHVibGljS2V5ID0ga2V5cGFpci5wdWJsaWNLZXlcbiAgICAgID8gZ2V0UHVibGljS2V5VHlwZShrZXlwYWlyLnB1YmxpY0tleSkgPT09ICd4cHViJ1xuICAgICAgICA/IGF3YWl0IHRoaXMuZ2V0UHVibGljS2V5RnJvbUV4dGVuZGVkUHJpdmF0ZUtleShrZXlwYWlyLnB1YmxpY0tleSlcbiAgICAgICAgOiBrZXlwYWlyLnB1YmxpY0tleVxuICAgICAgOiAnJ1xuXG4gICAgcmV0dXJuIHRoaXMucHJvdG9jb2xWMS5kZWNyeXB0QXN5bW1ldHJpY1dpdGhLZXlQYWlyKGVuY3J5cHRlZFBheWxvYWQsIHtcbiAgICAgIHNlY3JldEtleTogbmV3U2VjcmV0S2V5KHByaXZhdGVLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHJpdmF0ZUtleSkpLFxuICAgICAgcHVibGljS2V5OiBuZXdQdWJsaWNLZXkocHVibGljS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKHB1YmxpY0tleSkpXG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBlbmNyeXB0QUVTKHBheWxvYWQ6IHN0cmluZywgcHJpdmF0ZUtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzT2ZmbGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkgfHwgIWNhbkVuY3J5cHRBRVModGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBPZmZsaW5lLCBBRVMuJylcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICBwcml2YXRlS2V5ID0gZ2V0U2VjcmV0S2V5VHlwZShwcml2YXRlS2V5KSA9PT0gJ3hwcml2JyA/IGF3YWl0IHRoaXMuZ2V0UHJpdmF0ZUtleUZyb21FeHRlbmRlZFByaXZhdGVLZXkocHJpdmF0ZUtleSkgOiBwcml2YXRlS2V5XG5cbiAgICByZXR1cm4gdGhpcy5wcm90b2NvbFYxLmVuY3J5cHRBRVNXaXRoU2VjcmV0S2V5KHBheWxvYWQsIG5ld1NlY3JldEtleShwcml2YXRlS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKHByaXZhdGVLZXkpKSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZWNyeXB0QUVTKGVuY3J5cHRlZFBheWxvYWQ6IHN0cmluZywgcHJpdmF0ZUtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlzT2ZmbGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkgfHwgIWNhbkVuY3J5cHRBRVModGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBPZmZsaW5lLCBBRVMuJylcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICBwcml2YXRlS2V5ID0gZ2V0U2VjcmV0S2V5VHlwZShwcml2YXRlS2V5KSA9PT0gJ3hwcml2JyA/IGF3YWl0IHRoaXMuZ2V0UHJpdmF0ZUtleUZyb21FeHRlbmRlZFByaXZhdGVLZXkocHJpdmF0ZUtleSkgOiBwcml2YXRlS2V5XG5cbiAgICByZXR1cm4gdGhpcy5wcm90b2NvbFYxLmRlY3J5cHRBRVNXaXRoU2VjcmV0S2V5KGVuY3J5cHRlZFBheWxvYWQsIG5ld1NlY3JldEtleShwcml2YXRlS2V5LCBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKHByaXZhdGVLZXkpKSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRQcml2YXRlS2V5RnJvbUV4dGVuZGVkUHJpdmF0ZUtleShleHRlbmRlZFByaXZhdGVLZXk6IHN0cmluZywgY2hpbGREZXJpdmF0aW9uUGF0aD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc09mZmxpbmVQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpIHx8ICFpc0JpcDMyUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBPZmZsaW5lLCBCaXAzMi4nKVxuICAgIH1cblxuICAgIGNvbnN0IHNlY3JldEtleTogU2VjcmV0S2V5ID0gYXdhaXQgdGhpcy5kZXJpdmVTZWNyZXRLZXkoXG4gICAgICBuZXdFeHRlbmRlZFNlY3JldEtleShleHRlbmRlZFByaXZhdGVLZXksIGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAoZXh0ZW5kZWRQcml2YXRlS2V5KSksXG4gICAgICBjaGlsZERlcml2YXRpb25QYXRoXG4gICAgKVxuXG4gICAgcmV0dXJuIHNlY3JldEtleS52YWx1ZVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFB1YmxpY0tleUZyb21FeHRlbmRlZFByaXZhdGVLZXkoZXh0ZW5kZWRQdWJsaWNLZXk6IHN0cmluZywgY2hpbGREZXJpdmF0aW9uUGF0aD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCFpc0JpcDMyUHJvdG9jb2wodGhpcy5wcm90b2NvbFYxKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IHN1cHBvcnRlZCwgcmVxdWlyZWQgaW5mZXJmYWNlOiBCaXAzMi4nKVxuICAgIH1cblxuICAgIGNvbnN0IHB1YmxpY0tleTogUHVibGljS2V5ID0gYXdhaXQgdGhpcy5kZXJpdmVQdWJsaWNLZXkoXG4gICAgICBuZXdFeHRlbmRlZFB1YmxpY0tleShleHRlbmRlZFB1YmxpY0tleSwgZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMChleHRlbmRlZFB1YmxpY0tleSkpLFxuICAgICAgY2hpbGREZXJpdmF0aW9uUGF0aFxuICAgIClcblxuICAgIHJldHVybiBwdWJsaWNLZXkudmFsdWVcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXROZXR3b3JrKHByb3RvY29sT3B0aW9ucz86IFByb3RvY29sT3B0aW9uc1YwKTogUHJvdG9jb2xOZXR3b3JrVjAge1xuICAgIGxldCBrbm93bk9wdGlvbnM6IFByb3RvY29sT3B0aW9uc1YwIHwgdW5kZWZpbmVkXG4gICAgdHJ5IHtcbiAgICAgIGtub3duT3B0aW9ucyA9IHByb3RvY29sT3B0aW9ucyA/PyBnZXRQcm90b2NvbE9wdGlvbnNCeUlkZW50aWZpZXJMZWdhY3kodGhpcy5pZGVudGlmaWVyKVxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgfSBjYXRjaCB7fVxuXG4gICAgY29uc3QgeyBuYW1lLCB0eXBlLCBycGNVcmwsIC4uLnJlc3QgfSA9IHRoaXMubmV0d29yayA/PyB7fVxuXG4gICAgcmV0dXJuIG5ldyBQcm90b2NvbE5ldHdvcmtBZGFwdGVyKFxuICAgICAgbmFtZSA/PyBrbm93bk9wdGlvbnM/Lm5ldHdvcmsubmFtZSA/PyAnJyxcbiAgICAgIHR5cGUgPz8ga25vd25PcHRpb25zPy5uZXR3b3JrLnR5cGUgPz8gJ21haW5uZXQnLFxuICAgICAgcnBjVXJsID8/IGtub3duT3B0aW9ucz8ubmV0d29yay5ycGNVcmwgPz8gJycsXG4gICAgICB0aGlzLmJsb2NrRXhwbG9yZXJWMCxcbiAgICAgIHJlc3QgfHwgKGtub3duT3B0aW9ucz8ubmV0d29yay5leHRyYXMgPz8ge30pXG4gICAgKVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGRlcml2ZVNlY3JldEtleShleHRlbmRlZFNlY3JldEtleTogRXh0ZW5kZWRTZWNyZXRLZXksIGNoaWxkRGVyaXZhdGlvblBhdGg6IHN0cmluZyA9ICcwLzAnKTogUHJvbWlzZTxTZWNyZXRLZXk+IHtcbiAgICBpZiAoIWlzT2ZmbGluZVByb3RvY29sKHRoaXMucHJvdG9jb2xWMSkgfHwgIWlzQmlwMzJQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3RvY29sIGRvZXNuJ3Qgc3VwcG9ydCBzZWNyZXQga2V5IGRlcml2YXRpb24sIG1pc3NpbmcgaW5mZXJmYWNlOiBPZmZsaW5lLCBCaXAzMi5gKVxuICAgIH1cblxuICAgIGlmIChjaGlsZERlcml2YXRpb25QYXRoLnN0YXJ0c1dpdGgoJ20nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWNlaXZlZCBmdWxsIGRlcml2YXRpb24gcGF0aCwgZXhwZWN0ZWQgY2hpbGQgZGVyaXZhdGlvbiBwYXRoJylcbiAgICB9XG5cbiAgICBpZiAoY2hpbGREZXJpdmF0aW9uUGF0aC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdoJykgfHwgY2hpbGREZXJpdmF0aW9uUGF0aC5pbmNsdWRlcyhgJ2ApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoaWxkIGRlcml2YXRpb24gcGF0aCBjYW5ub3QgaW5jbHVkZSBoYXJkZW5lZCBjaGlsZHJlbicpXG4gICAgfVxuXG4gICAgY29uc3QgW3Zpc2liaWxpdHlJbmRleCwgYWRkcmVzc0luZGV4XTogbnVtYmVyW10gPSBjaGlsZERlcml2YXRpb25QYXRoLnNwbGl0KCcvJykubWFwKChpbmRleDogc3RyaW5nKSA9PiBwYXJzZUludChpbmRleCwgMTApKVxuXG4gICAgcmV0dXJuIHRoaXMucHJvdG9jb2xWMS5kZXJpdmVGcm9tRXh0ZW5kZWRTZWNyZXRLZXkoZXh0ZW5kZWRTZWNyZXRLZXksIHZpc2liaWxpdHlJbmRleCwgYWRkcmVzc0luZGV4KVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGRlcml2ZVB1YmxpY0tleShleHRlbmRlZFB1YmxpY0tleTogRXh0ZW5kZWRQdWJsaWNLZXksIGNoaWxkRGVyaXZhdGlvblBhdGg6IHN0cmluZyA9ICcwLzAnKTogUHJvbWlzZTxQdWJsaWNLZXk+IHtcbiAgICBpZiAoIWlzQmlwMzJQcm90b2NvbCh0aGlzLnByb3RvY29sVjEpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3RvY29sIGRvZXNuJ3Qgc3VwcG9ydCBwdWJsaWMga2V5IGRlcml2YXRpb24sIG1pc3NpbmcgaW5mZXJmYWNlOiBCaXAzMi5gKVxuICAgIH1cblxuICAgIGlmIChjaGlsZERlcml2YXRpb25QYXRoLnN0YXJ0c1dpdGgoJ20nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWNlaXZlZCBmdWxsIGRlcml2YXRpb24gcGF0aCwgZXhwZWN0ZWQgY2hpbGQgZGVyaXZhdGlvbiBwYXRoJylcbiAgICB9XG5cbiAgICBpZiAoY2hpbGREZXJpdmF0aW9uUGF0aC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdoJykgfHwgY2hpbGREZXJpdmF0aW9uUGF0aC5pbmNsdWRlcyhgJ2ApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoaWxkIGRlcml2YXRpb24gcGF0aCBjYW5ub3QgaW5jbHVkZSBoYXJkZW5lZCBjaGlsZHJlbicpXG4gICAgfVxuXG4gICAgY29uc3QgW3Zpc2liaWxpdHlJbmRleCwgYWRkcmVzc0luZGV4XTogbnVtYmVyW10gPSBjaGlsZERlcml2YXRpb25QYXRoLnNwbGl0KCcvJykubWFwKChpbmRleDogc3RyaW5nKSA9PiBwYXJzZUludChpbmRleCwgMTApKVxuXG4gICAgcmV0dXJuIHRoaXMucHJvdG9jb2xWMS5kZXJpdmVGcm9tRXh0ZW5kZWRQdWJsaWNLZXkoZXh0ZW5kZWRQdWJsaWNLZXksIHZpc2liaWxpdHlJbmRleCwgYWRkcmVzc0luZGV4KVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldFNlcmlhbGl6ZXJJZGVudGlmaWVyKGJhc2U/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGlkZW50aWZpZXI6IHN0cmluZyA9IGJhc2UgPz8gKGF3YWl0IHRoaXMuZ2V0SWRlbnRpZmllcigpKVxuXG4gICAgcmV0dXJuIGlkZW50aWZpZXIuc3RhcnRzV2l0aChTdWJQcm90b2NvbFN5bWJvbHMuRVRIX0VSQzIwKVxuICAgICAgPyBTdWJQcm90b2NvbFN5bWJvbHMuRVRIX0VSQzIwXG4gICAgICA6IGlkZW50aWZpZXIuc3RhcnRzV2l0aChTdWJQcm90b2NvbFN5bWJvbHMuT1BUSU1JU01fRVJDMjApXG4gICAgICA/IFN1YlByb3RvY29sU3ltYm9scy5PUFRJTUlTTV9FUkMyMFxuICAgICAgOiBpZGVudGlmaWVyXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY29udmVydFVuc2lnbmVkVHJhbnNhY3Rpb25WMFRvVjEodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uU2lnblJlcXVlc3QsIG93bmVyPzogc3RyaW5nKTogUHJvbWlzZTxVbnNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgaWRlbnRpZmllcjogc3RyaW5nID0gYXdhaXQgdGhpcy5nZXRTZXJpYWxpemVySWRlbnRpZmllcihvd25lcilcblxuICAgIHJldHVybiB0aGlzLnYzU2VyaWFsaXplckNvbXBhbmlvbi5mcm9tVHJhbnNhY3Rpb25TaWduUmVxdWVzdChpZGVudGlmaWVyLCB0cmFuc2FjdGlvbilcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjb252ZXJ0VW5zaWduZWRUcmFuc2FjdGlvblYxVG9WMChcbiAgICB0cmFuc2FjdGlvbjogVW5zaWduZWRUcmFuc2FjdGlvbixcbiAgICBwdWJsaWNLZXk6IHN0cmluZyxcbiAgICBjYWxsYmFja1VybD86IHN0cmluZyxcbiAgICBvd25lcj86IHN0cmluZ1xuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uU2lnblJlcXVlc3Q+IHtcbiAgICBjb25zdCBpZGVudGlmaWVyOiBzdHJpbmcgPSBhd2FpdCB0aGlzLmdldFNlcmlhbGl6ZXJJZGVudGlmaWVyKG93bmVyKVxuXG4gICAgcmV0dXJuIHRoaXMudjNTZXJpYWxpemVyQ29tcGFuaW9uLnRvVHJhbnNhY3Rpb25TaWduUmVxdWVzdChpZGVudGlmaWVyLCB0cmFuc2FjdGlvbiwgcHVibGljS2V5LCBjYWxsYmFja1VybClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjb252ZXJ0U2lnbmVkVHJhbnNhY3Rpb25WMFRvVjEodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uU2lnblJlc3BvbnNlLCBvd25lcj86IHN0cmluZyk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBpZGVudGlmaWVyOiBzdHJpbmcgPSBhd2FpdCB0aGlzLmdldFNlcmlhbGl6ZXJJZGVudGlmaWVyKG93bmVyKVxuXG4gICAgcmV0dXJuIHRoaXMudjNTZXJpYWxpemVyQ29tcGFuaW9uLmZyb21UcmFuc2FjdGlvblNpZ25SZXNwb25zZShpZGVudGlmaWVyLCB0cmFuc2FjdGlvbilcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjb252ZXJ0U2lnbmVkVHJhbnNhY3Rpb25WMVRvVjAoXG4gICAgdHJhbnNhY3Rpb246IFNpZ25lZFRyYW5zYWN0aW9uLFxuICAgIGFjY291bnRJZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgb3duZXI/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxUcmFuc2FjdGlvblNpZ25SZXNwb25zZT4ge1xuICAgIGNvbnN0IGlkZW50aWZpZXI6IHN0cmluZyA9IGF3YWl0IHRoaXMuZ2V0U2VyaWFsaXplcklkZW50aWZpZXIob3duZXIpXG5cbiAgICByZXR1cm4gdGhpcy52M1NlcmlhbGl6ZXJDb21wYW5pb24udG9UcmFuc2FjdGlvblNpZ25SZXNwb25zZShpZGVudGlmaWVyLCB0cmFuc2FjdGlvbiwgYWNjb3VudElkZW50aWZpZXIpXG4gIH1cblxuICBwdWJsaWMgY29udmVydEZlZURlZmF1bHRzVjFUb1YwKGZlZURlZmF1bHRzOiBGZWVEZWZhdWx0cyk6IEZlZURlZmF1bHRzVjAge1xuICAgIHJldHVybiBjb252ZXJ0RmVlRGVmYXVsdHNWMVRvVjAoZmVlRGVmYXVsdHMsIHRoaXMucHJvdG9jb2xNZXRhZGF0YSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjb252ZXJ0VHJhbnNhY3Rpb25EZXRhaWxzVjFUb1YwKHR4czogQWlyR2FwVHJhbnNhY3Rpb25bXSk6IFByb21pc2U8SUFpckdhcFRyYW5zYWN0aW9uW10+IHtcbiAgICByZXR1cm4gY29udmVydFRyYW5zYWN0aW9uRGV0YWlsc1YxVG9WMCh0eHMsIHRoaXMucHJvdG9jb2xNZXRhZGF0YSwgdGhpcy5uZXR3b3JrVjApXG4gIH1cblxuICBwcm90ZWN0ZWQgY29tYmluZVRyYW5zYWN0aW9uRGV0YWlsczxfVW5pdHMgZXh0ZW5kcyBzdHJpbmc+KHJlY2lwaWVudHM6IHN0cmluZ1tdLCB2YWx1ZXM6IHN0cmluZ1tdKTogVHJhbnNhY3Rpb25EZXRhaWxzPF9Vbml0cz5bXSB7XG4gICAgaWYgKHJlY2lwaWVudHMubGVuZ3RoICE9PSB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY2lwaWVudHMgbGVuZ3RoIG11c3QgbWF0Y2ggdmFsdWVzIGxlbmd0aC4nKVxuICAgIH1cblxuICAgIHJldHVybiByZWNpcGllbnRzLm1hcCgocmVjaXBpZW50OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+ICh7XG4gICAgICB0bzogcmVjaXBpZW50LFxuICAgICAgYW1vdW50OiBuZXdBbW91bnQodmFsdWVzW2luZGV4XSwgJ2Jsb2NrY2hhaW4nKVxuICAgIH0pKVxuICB9XG5cbiAgcHJvdGVjdGVkIGlzRXh0ZW5kZWRQdWJsaWNLZXkocHVibGljS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcHVibGljS2V5LnN0YXJ0c1dpdGgoJ3hwdWInKSB8fCBwdWJsaWNLZXkuc3RhcnRzV2l0aCgneXB1YicpIHx8IHB1YmxpY0tleS5zdGFydHNXaXRoKCd6cHViJylcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRBcmJpdHJhcnlEYXRhKGRhdGE6IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2ltcGxlQXJiaXRyYXJ5RGF0YU1ldGFkYXRhU2NoZW1hOiBTY2hlbWE8UHJvdG9jb2xUcmFuc2FjdGlvbkFyYml0cmFyeURhdGFNZXRhZGF0YT4gPSB7XG4gICAgICBuYW1lOiAncmVxdWlyZWQnLFxuICAgICAgbWF4TGVuZ3RoOiAnb3B0aW9uYWwnLFxuICAgICAgcmVnZXg6ICdvcHRpb25hbCdcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wcm90b2NvbE1ldGFkYXRhLnRyYW5zYWN0aW9uPy5hcmJpdHJhcnlEYXRhXG4gICAgICA/IGltcGxlbWVudHNJbnRlcmZhY2U8UHJvdG9jb2xUcmFuc2FjdGlvbkFyYml0cmFyeURhdGFNZXRhZGF0YT4oXG4gICAgICAgICAgdGhpcy5wcm90b2NvbE1ldGFkYXRhLnRyYW5zYWN0aW9uPy5hcmJpdHJhcnlEYXRhLFxuICAgICAgICAgIHNpbXBsZUFyYml0cmFyeURhdGFNZXRhZGF0YVNjaGVtYVxuICAgICAgICApXG4gICAgICAgID8gZGF0YVt0aGlzLnByb3RvY29sTWV0YWRhdGEudHJhbnNhY3Rpb24uYXJiaXRyYXJ5RGF0YS5uYW1lXVxuICAgICAgICA6IGRhdGFbdGhpcy5wcm90b2NvbE1ldGFkYXRhLnRyYW5zYWN0aW9uLmFyYml0cmFyeURhdGEucm9vdD8ubmFtZSA/PyB0aGlzLnByb3RvY29sTWV0YWRhdGEudHJhbnNhY3Rpb24uYXJiaXRyYXJ5RGF0YS5pbm5lcj8ubmFtZV1cbiAgICAgIDogdW5kZWZpbmVkXG4gIH1cbn1cblxuLy8gSUNvaW5EZWxlZ2F0ZVByb3RvY29sXG5cbmV4cG9ydCBjbGFzcyBJQ29pbkRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyPFQgZXh0ZW5kcyBBaXJHYXBBbnlQcm90b2NvbCAmIEFpckdhcERlbGVnYXRlUHJvdG9jb2w+XG4gIGV4dGVuZHMgSUNvaW5Qcm90b2NvbEFkYXB0ZXI8VD5cbiAgaW1wbGVtZW50cyBJQ29pbkRlbGVnYXRlUHJvdG9jb2xcbntcbiAgcHVibGljIGFzeW5jIGdldERlZmF1bHREZWxlZ2F0ZWUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5wcm90b2NvbFYxLmdldERlZmF1bHREZWxlZ2F0ZWUoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEN1cnJlbnREZWxlZ2F0ZWVzRm9yUHVibGljS2V5KHB1YmxpY0tleTogc3RyaW5nLCBkYXRhPzogYW55KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLnByb3RvY29sVjEuZ2V0Q3VycmVudERlbGVnYXRlZXNGb3JQdWJsaWNLZXkoXG4gICAgICB7IHR5cGU6ICdwdWInLCB2YWx1ZTogcHVibGljS2V5LCBmb3JtYXQ6IGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHVibGljS2V5KSB9LFxuICAgICAgZGF0YVxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRDdXJyZW50RGVsZWdhdGVlc0ZvckFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBkYXRhPzogYW55KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLnByb3RvY29sVjEuZ2V0Q3VycmVudERlbGVnYXRlZXNGb3JBZGRyZXNzKGFkZHJlc3MsIGRhdGEpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVsZWdhdGVlRGV0YWlscyhhZGRyZXNzOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBQcm9taXNlPERlbGVnYXRlZURldGFpbHM+IHtcbiAgICByZXR1cm4gdGhpcy5wcm90b2NvbFYxLmdldERlbGVnYXRlZURldGFpbHMoYWRkcmVzcywgZGF0YSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpc1B1YmxpY0tleURlbGVnYXRpbmcocHVibGljS2V5OiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5wcm90b2NvbFYxLmlzUHVibGljS2V5RGVsZWdhdGluZyh7IHR5cGU6ICdwdWInLCB2YWx1ZTogcHVibGljS2V5LCBmb3JtYXQ6IGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHVibGljS2V5KSB9LCBkYXRhKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGlzQWRkcmVzc0RlbGVnYXRpbmcoYWRkcmVzczogc3RyaW5nLCBkYXRhPzogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMucHJvdG9jb2xWMS5pc0FkZHJlc3NEZWxlZ2F0aW5nKGFkZHJlc3MsIGRhdGEpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVsZWdhdG9yRGV0YWlsc0Zyb21QdWJsaWNLZXkocHVibGljS2V5OiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBQcm9taXNlPERlbGVnYXRvckRldGFpbHM+IHtcbiAgICByZXR1cm4gdGhpcy5wcm90b2NvbFYxLmdldERlbGVnYXRvckRldGFpbHNGcm9tUHVibGljS2V5KFxuICAgICAgeyB0eXBlOiAncHViJywgdmFsdWU6IHB1YmxpY0tleSwgZm9ybWF0OiBnZXRCeXRlc0Zvcm1hdFYxRnJvbVYwKHB1YmxpY0tleSkgfSxcbiAgICAgIGRhdGFcbiAgICApXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVsZWdhdG9yRGV0YWlsc0Zyb21BZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgZGF0YT86IGFueSk6IFByb21pc2U8RGVsZWdhdG9yRGV0YWlscz4ge1xuICAgIHJldHVybiB0aGlzLnByb3RvY29sVjEuZ2V0RGVsZWdhdG9yRGV0YWlsc0Zyb21BZGRyZXNzKGFkZHJlc3MsIGRhdGEpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVsZWdhdGlvbkRldGFpbHNGcm9tUHVibGljS2V5KHB1YmxpY0tleTogc3RyaW5nLCBkZWxlZ2F0ZWVzOiBzdHJpbmdbXSwgZGF0YT86IGFueSk6IFByb21pc2U8RGVsZWdhdGlvbkRldGFpbHM+IHtcbiAgICByZXR1cm4gdGhpcy5wcm90b2NvbFYxLmdldERlbGVnYXRpb25EZXRhaWxzRnJvbVB1YmxpY0tleShcbiAgICAgIHsgdHlwZTogJ3B1YicsIHZhbHVlOiBwdWJsaWNLZXksIGZvcm1hdDogZ2V0Qnl0ZXNGb3JtYXRWMUZyb21WMChwdWJsaWNLZXkpIH0sXG4gICAgICBkZWxlZ2F0ZWVzLFxuICAgICAgZGF0YVxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXREZWxlZ2F0aW9uRGV0YWlsc0Zyb21BZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgZGVsZWdhdGVlczogc3RyaW5nW10sIGRhdGE/OiBhbnkpOiBQcm9taXNlPERlbGVnYXRpb25EZXRhaWxzPiB7XG4gICAgcmV0dXJuIHRoaXMucHJvdG9jb2xWMS5nZXREZWxlZ2F0aW9uRGV0YWlsc0Zyb21BZGRyZXNzKGFkZHJlc3MsIGRlbGVnYXRlZXMsIGRhdGEpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcHJlcGFyZURlbGVnYXRvckFjdGlvbkZyb21QdWJsaWNLZXkocHVibGljS2V5OiBzdHJpbmcsIHR5cGU6IGFueSwgZGF0YT86IGFueSk6IFByb21pc2U8YW55W10+IHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbnMgPSBhd2FpdCB0aGlzLnByb3RvY29sVjEucHJlcGFyZURlbGVnYXRvckFjdGlvbkZyb21QdWJsaWNLZXkoXG4gICAgICB7IHR5cGU6ICdwdWInLCB2YWx1ZTogcHVibGljS2V5LCBmb3JtYXQ6IGdldEJ5dGVzRm9ybWF0VjFGcm9tVjAocHVibGljS2V5KSB9LFxuICAgICAgdHlwZSxcbiAgICAgIGRhdGFcbiAgICApXG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbnNWMCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgdHJhbnNhY3Rpb25zLm1hcCgodHJhbnNhY3Rpb24pID0+IHRoaXMuY29udmVydFVuc2lnbmVkVHJhbnNhY3Rpb25WMVRvVjAodHJhbnNhY3Rpb24sIHB1YmxpY0tleSkpXG4gICAgKVxuXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uc1YwLm1hcCgodHJhbnNhY3Rpb24pID0+IHRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uKVxuICB9XG59XG5cbi8vIElDb2luU3ViUHJvdG9jb2xcblxuZXhwb3J0IGNsYXNzIElDb2luU3ViUHJvdG9jb2xBZGFwdGVyPFQgZXh0ZW5kcyBBaXJHYXBBbnlQcm90b2NvbCAmIFN1YlByb3RvY29sID0gQWlyR2FwQW55UHJvdG9jb2wgJiBTdWJQcm90b2NvbD5cbiAgZXh0ZW5kcyBJQ29pblByb3RvY29sQWRhcHRlcjxUPlxuICBpbXBsZW1lbnRzIElDb2luU3ViUHJvdG9jb2xcbntcbiAgcHVibGljIHJlYWRvbmx5IGlzU3ViUHJvdG9jb2w6IGJvb2xlYW4gPSB0cnVlXG4gIHB1YmxpYyByZWFkb25seSBzdWJQcm90b2NvbFR5cGU6IFN1YlByb3RvY29sVHlwZVYwXG4gIHB1YmxpYyByZWFkb25seSBjb250cmFjdEFkZHJlc3M/OiBzdHJpbmdcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90b2NvbFYxOiBULFxuICAgIHByb3RvY29sTWV0YWRhdGE6IFByb3RvY29sTWV0YWRhdGEsXG4gICAgY3J5cHRvOiBDcnlwdG9Db25maWd1cmF0aW9uIHwgdW5kZWZpbmVkLFxuICAgIG5ldHdvcms6IFByb3RvY29sTmV0d29yayB8IHVuZGVmaW5lZCxcbiAgICB2MUJsb2NrRXhwbG9yZXI6IEFpckdhcEJsb2NrRXhwbG9yZXIgfCB1bmRlZmluZWQsXG4gICAgYmxvY2tFeHBsb3Jlck1ldGFkYXRhOiBCbG9ja0V4cGxvcmVyTWV0YWRhdGEgfCB1bmRlZmluZWQsXG4gICAgdjNTZXJpYWxpemVyQ29tcGFuaW9uOiBBaXJHYXBWM1NlcmlhbGl6ZXJDb21wYW5pb24sXG4gICAgdHlwZTogU3ViUHJvdG9jb2xUeXBlLFxuICAgIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIHN1cGVyKHByb3RvY29sVjEsIHByb3RvY29sTWV0YWRhdGEsIGNyeXB0bywgbmV0d29yaywgdjFCbG9ja0V4cGxvcmVyLCBibG9ja0V4cGxvcmVyTWV0YWRhdGEsIHYzU2VyaWFsaXplckNvbXBhbmlvbilcblxuICAgIHRoaXMuc3ViUHJvdG9jb2xUeXBlID0gdHlwZSA9PT0gJ2FjY291bnQnID8gU3ViUHJvdG9jb2xUeXBlVjAuQUNDT1VOVCA6IFN1YlByb3RvY29sVHlwZVYwLlRPS0VOXG4gICAgdGhpcy5jb250cmFjdEFkZHJlc3MgPSBjb250cmFjdEFkZHJlc3NcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRJc1N1YlByb3RvY29sKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmlzU3ViUHJvdG9jb2xcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRTdWJQcm90b2NvbFR5cGUoKTogUHJvbWlzZTxTdWJQcm90b2NvbFR5cGVWMD4ge1xuICAgIHJldHVybiB0aGlzLnN1YlByb3RvY29sVHlwZVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENvbnRyYWN0QWRkcmVzcygpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyYWN0QWRkcmVzc1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJQ29pbkRlbGVnYXRlU3ViUHJvdG9jb2xBZGFwdGVyPFxuICAgIFQgZXh0ZW5kcyBBaXJHYXBBbnlQcm90b2NvbCAmIEFpckdhcERlbGVnYXRlUHJvdG9jb2wgJiBTdWJQcm90b2NvbCA9IEFpckdhcEFueVByb3RvY29sICYgQWlyR2FwRGVsZWdhdGVQcm90b2NvbCAmIFN1YlByb3RvY29sXG4gID5cbiAgZXh0ZW5kcyBJQ29pblN1YlByb3RvY29sQWRhcHRlcjxUPlxuICBpbXBsZW1lbnRzIElDb2luU3ViUHJvdG9jb2wsIElDb2luRGVsZWdhdGVQcm90b2NvbFxue1xuICBwcml2YXRlIHJlYWRvbmx5IGRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyOiBJQ29pbkRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyPFQ+XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdG9jb2xWMTogVCxcbiAgICBwcm90b2NvbE1ldGFkYXRhOiBQcm90b2NvbE1ldGFkYXRhLFxuICAgIGNyeXB0bzogQ3J5cHRvQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCxcbiAgICBuZXR3b3JrOiBQcm90b2NvbE5ldHdvcmsgfCB1bmRlZmluZWQsXG4gICAgdjFCbG9ja0V4cGxvcmVyOiBBaXJHYXBCbG9ja0V4cGxvcmVyIHwgdW5kZWZpbmVkLFxuICAgIGJsb2NrRXhwbG9yZXJNZXRhZGF0YTogQmxvY2tFeHBsb3Jlck1ldGFkYXRhIHwgdW5kZWZpbmVkLFxuICAgIHYzU2VyaWFsaXplckNvbXBhbmlvbjogQWlyR2FwVjNTZXJpYWxpemVyQ29tcGFuaW9uLFxuICAgIHR5cGU6IFN1YlByb3RvY29sVHlwZSxcbiAgICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIHByb3RvY29sVjEsXG4gICAgICBwcm90b2NvbE1ldGFkYXRhLFxuICAgICAgY3J5cHRvLFxuICAgICAgbmV0d29yayxcbiAgICAgIHYxQmxvY2tFeHBsb3JlcixcbiAgICAgIGJsb2NrRXhwbG9yZXJNZXRhZGF0YSxcbiAgICAgIHYzU2VyaWFsaXplckNvbXBhbmlvbixcbiAgICAgIHR5cGUsXG4gICAgICBjb250cmFjdEFkZHJlc3NcbiAgICApXG5cbiAgICB0aGlzLmRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyID0gbmV3IElDb2luRGVsZWdhdGVQcm90b2NvbEFkYXB0ZXIoXG4gICAgICBwcm90b2NvbFYxLFxuICAgICAgcHJvdG9jb2xNZXRhZGF0YSxcbiAgICAgIGNyeXB0byxcbiAgICAgIG5ldHdvcmssXG4gICAgICB2MUJsb2NrRXhwbG9yZXIsXG4gICAgICBibG9ja0V4cGxvcmVyTWV0YWRhdGEsXG4gICAgICB2M1NlcmlhbGl6ZXJDb21wYW5pb25cbiAgICApXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVmYXVsdERlbGVnYXRlZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyLmdldERlZmF1bHREZWxlZ2F0ZWUoKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEN1cnJlbnREZWxlZ2F0ZWVzRm9yUHVibGljS2V5KHB1YmxpY0tleTogc3RyaW5nLCBkYXRhPzogYW55KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLmRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyLmdldEN1cnJlbnREZWxlZ2F0ZWVzRm9yUHVibGljS2V5KHB1YmxpY0tleSwgZGF0YSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRDdXJyZW50RGVsZWdhdGVlc0ZvckFkZHJlc3MoYWRkcmVzczogc3RyaW5nLCBkYXRhPzogYW55KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLmRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyLmdldEN1cnJlbnREZWxlZ2F0ZWVzRm9yQWRkcmVzcyhhZGRyZXNzLCBkYXRhKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldERlbGVnYXRlZURldGFpbHMoYWRkcmVzczogc3RyaW5nLCBkYXRhPzogYW55KTogUHJvbWlzZTxEZWxlZ2F0ZWVEZXRhaWxzPiB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVQcm90b2NvbEFkYXB0ZXIuZ2V0RGVsZWdhdGVlRGV0YWlscyhhZGRyZXNzLCBkYXRhKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGlzUHVibGljS2V5RGVsZWdhdGluZyhwdWJsaWNLZXk6IHN0cmluZywgZGF0YT86IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyLmlzUHVibGljS2V5RGVsZWdhdGluZyhwdWJsaWNLZXksIGRhdGEpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaXNBZGRyZXNzRGVsZWdhdGluZyhhZGRyZXNzOiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZVByb3RvY29sQWRhcHRlci5pc0FkZHJlc3NEZWxlZ2F0aW5nKGFkZHJlc3MsIGRhdGEpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVsZWdhdG9yRGV0YWlsc0Zyb21QdWJsaWNLZXkocHVibGljS2V5OiBzdHJpbmcsIGRhdGE/OiBhbnkpOiBQcm9taXNlPERlbGVnYXRvckRldGFpbHM+IHtcbiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZVByb3RvY29sQWRhcHRlci5nZXREZWxlZ2F0b3JEZXRhaWxzRnJvbVB1YmxpY0tleShwdWJsaWNLZXksIGRhdGEpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGVsZWdhdG9yRGV0YWlsc0Zyb21BZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgZGF0YT86IGFueSk6IFByb21pc2U8RGVsZWdhdG9yRGV0YWlscz4ge1xuICAgIHJldHVybiB0aGlzLmRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyLmdldERlbGVnYXRvckRldGFpbHNGcm9tQWRkcmVzcyhhZGRyZXNzLCBkYXRhKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldERlbGVnYXRpb25EZXRhaWxzRnJvbVB1YmxpY0tleShwdWJsaWNLZXk6IHN0cmluZywgZGVsZWdhdGVlczogc3RyaW5nW10sIGRhdGE/OiBhbnkpOiBQcm9taXNlPERlbGVnYXRpb25EZXRhaWxzPiB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVQcm90b2NvbEFkYXB0ZXIuZ2V0RGVsZWdhdGlvbkRldGFpbHNGcm9tUHVibGljS2V5KHB1YmxpY0tleSwgZGVsZWdhdGVlcywgZGF0YSlcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXREZWxlZ2F0aW9uRGV0YWlsc0Zyb21BZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgZGVsZWdhdGVlczogc3RyaW5nW10sIGRhdGE/OiBhbnkpOiBQcm9taXNlPERlbGVnYXRpb25EZXRhaWxzPiB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVQcm90b2NvbEFkYXB0ZXIuZ2V0RGVsZWdhdGlvbkRldGFpbHNGcm9tQWRkcmVzcyhhZGRyZXNzLCBkZWxlZ2F0ZWVzLCBkYXRhKVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHByZXBhcmVEZWxlZ2F0b3JBY3Rpb25Gcm9tUHVibGljS2V5KHB1YmxpY0tleTogc3RyaW5nLCB0eXBlOiBhbnksIGRhdGE/OiBhbnkpOiBQcm9taXNlPGFueVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuZGVsZWdhdGVQcm90b2NvbEFkYXB0ZXIucHJlcGFyZURlbGVnYXRvckFjdGlvbkZyb21QdWJsaWNLZXkocHVibGljS2V5LCB0eXBlLCBkYXRhKVxuICB9XG59XG5cbi8vIEZhY3Rvcmllc1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlSUNvaW5Qcm90b2NvbEFkYXB0ZXI8VCBleHRlbmRzIEFpckdhcEFueVByb3RvY29sPihcbiAgcHJvdG9jb2xWMTogVCxcbiAgYmxvY2tFeHBsb3JlclYxOiBBaXJHYXBCbG9ja0V4cGxvcmVyIHwgdW5kZWZpbmVkLFxuICB2M1NlcmlhbGl6ZXJDb21wYW5pb246IEFpckdhcFYzU2VyaWFsaXplckNvbXBhbmlvbixcbiAgZXh0cmE6IHtcbiAgICB0eXBlPzogUHJvdG9jb2xDb25maWd1cmF0aW9uWyd0eXBlJ11cbiAgICBwcm90b2NvbE1ldGFkYXRhPzogUHJvdG9jb2xNZXRhZGF0YVxuICAgIGNyeXB0bz86IENyeXB0b0NvbmZpZ3VyYXRpb24gfCBudWxsXG4gICAgbmV0d29yaz86IFByb3RvY29sTmV0d29yayB8IG51bGxcbiAgICBibG9ja0V4cGxvcmVyTWV0YWRhdGE/OiBCbG9ja0V4cGxvcmVyTWV0YWRhdGEgfCBudWxsXG4gIH0gPSB7fVxuKTogUHJvbWlzZTxJQ29pblByb3RvY29sQWRhcHRlcjxUPj4ge1xuICBjb25zdCBbcHJvdG9jb2xNZXRhZGF0YSwgY3J5cHRvLCBuZXR3b3JrLCBibG9ja0V4cGxvcmVyTWV0YWRhdGFdOiBbXG4gICAgUHJvdG9jb2xNZXRhZGF0YSxcbiAgICBDcnlwdG9Db25maWd1cmF0aW9uIHwgdW5kZWZpbmVkLFxuICAgIFByb3RvY29sTmV0d29yayB8IHVuZGVmaW5lZCxcbiAgICBCbG9ja0V4cGxvcmVyTWV0YWRhdGEgfCB1bmRlZmluZWRcbiAgXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBleHRyYS5wcm90b2NvbE1ldGFkYXRhID8gUHJvbWlzZS5yZXNvbHZlKGV4dHJhLnByb3RvY29sTWV0YWRhdGEpIDogcHJvdG9jb2xWMS5nZXRNZXRhZGF0YSgpLFxuICAgIGV4dHJhLmNyeXB0b1xuICAgICAgPyBQcm9taXNlLnJlc29sdmUoZXh0cmEuY3J5cHRvKVxuICAgICAgOiBleHRyYS5jcnlwdG8gPT09IG51bGwgfHwgIWlzT2ZmbGluZVByb3RvY29sKHByb3RvY29sVjEpIHx8IChleHRyYS50eXBlICE9PSAnb2ZmbGluZScgJiYgZXh0cmEudHlwZSAhPT0gJ2Z1bGwnKVxuICAgICAgPyBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgOiBwcm90b2NvbFYxLmdldENyeXB0b0NvbmZpZ3VyYXRpb24oKSxcbiAgICBleHRyYS5uZXR3b3JrXG4gICAgICA/IFByb21pc2UucmVzb2x2ZShleHRyYS5uZXR3b3JrKVxuICAgICAgOiBleHRyYS5uZXR3b3JrID09PSBudWxsIHx8ICFpc09ubGluZVByb3RvY29sKHByb3RvY29sVjEpIHx8IChleHRyYS50eXBlICE9PSAnb25saW5lJyAmJiBleHRyYS50eXBlICE9PSAnZnVsbCcpXG4gICAgICA/IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICA6IHByb3RvY29sVjEuZ2V0TmV0d29yaygpLFxuICAgIGV4dHJhLmJsb2NrRXhwbG9yZXJNZXRhZGF0YVxuICAgICAgPyBQcm9taXNlLnJlc29sdmUoZXh0cmEuYmxvY2tFeHBsb3Jlck1ldGFkYXRhKVxuICAgICAgOiBleHRyYS5ibG9ja0V4cGxvcmVyTWV0YWRhdGEgPT09IG51bGwgfHwgYmxvY2tFeHBsb3JlclYxID09PSB1bmRlZmluZWQgfHwgKGV4dHJhLnR5cGUgIT09ICdvbmxpbmUnICYmIGV4dHJhLnR5cGUgIT09ICdmdWxsJylcbiAgICAgID8gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIDogYmxvY2tFeHBsb3JlclYxLmdldE1ldGFkYXRhKClcbiAgXSlcblxuICBpZiAoc3VwcG9ydHNWMURlbGVnYXRpb24ocHJvdG9jb2xWMSkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgcmV0dXJuIG5ldyBJQ29pbkRlbGVnYXRlUHJvdG9jb2xBZGFwdGVyKFxuICAgICAgcHJvdG9jb2xWMSxcbiAgICAgIHByb3RvY29sTWV0YWRhdGEsXG4gICAgICBjcnlwdG8sXG4gICAgICBuZXR3b3JrLFxuICAgICAgYmxvY2tFeHBsb3JlclYxLFxuICAgICAgYmxvY2tFeHBsb3Jlck1ldGFkYXRhLFxuICAgICAgdjNTZXJpYWxpemVyQ29tcGFuaW9uXG4gICAgKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgSUNvaW5Qcm90b2NvbEFkYXB0ZXIoXG4gICAgICBwcm90b2NvbFYxLFxuICAgICAgcHJvdG9jb2xNZXRhZGF0YSxcbiAgICAgIGNyeXB0byxcbiAgICAgIG5ldHdvcmssXG4gICAgICBibG9ja0V4cGxvcmVyVjEsXG4gICAgICBibG9ja0V4cGxvcmVyTWV0YWRhdGEsXG4gICAgICB2M1NlcmlhbGl6ZXJDb21wYW5pb25cbiAgICApXG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVJQ29pblN1YlByb3RvY29sQWRhcHRlcjxUIGV4dGVuZHMgQWlyR2FwQW55UHJvdG9jb2wgJiBTdWJQcm90b2NvbD4oXG4gIHByb3RvY29sVjE6IFQsXG4gIGJsb2NrRXhwbG9yZXJWMTogQWlyR2FwQmxvY2tFeHBsb3JlciB8IHVuZGVmaW5lZCxcbiAgdjNTZXJpYWxpemVyQ29tcGFuaW9uOiBBaXJHYXBWM1NlcmlhbGl6ZXJDb21wYW5pb24sXG4gIGV4dHJhOiB7XG4gICAgdHlwZT86IFByb3RvY29sQ29uZmlndXJhdGlvblsndHlwZSddXG4gICAgcHJvdG9jb2xNZXRhZGF0YT86IFByb3RvY29sTWV0YWRhdGFcbiAgICBjcnlwdG8/OiBDcnlwdG9Db25maWd1cmF0aW9uIHwgbnVsbFxuICAgIG5ldHdvcms/OiBQcm90b2NvbE5ldHdvcmsgfCBudWxsXG4gICAgYmxvY2tFeHBsb3Jlck1ldGFkYXRhPzogQmxvY2tFeHBsb3Jlck1ldGFkYXRhIHwgbnVsbFxuICAgIHN1YlR5cGU/OiBTdWJQcm90b2NvbFR5cGVcbiAgICBjb250cmFjdEFkZHJlc3M/OiBzdHJpbmcgfCBudWxsXG4gIH0gPSB7fVxuKTogUHJvbWlzZTxJQ29pblN1YlByb3RvY29sQWRhcHRlcjxUPj4ge1xuICBjb25zdCBbcHJvdG9jb2xNZXRhZGF0YSwgY3J5cHRvLCBuZXR3b3JrLCBibG9ja0V4cGxvcmVyTWV0YWRhdGEsIHR5cGUsIGNvbnRyYWN0QWRkcmVzc106IFtcbiAgICBQcm90b2NvbE1ldGFkYXRhLFxuICAgIENyeXB0b0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWQsXG4gICAgUHJvdG9jb2xOZXR3b3JrIHwgdW5kZWZpbmVkLFxuICAgIEJsb2NrRXhwbG9yZXJNZXRhZGF0YSB8IHVuZGVmaW5lZCxcbiAgICBTdWJQcm90b2NvbFR5cGUsXG4gICAgc3RyaW5nIHwgdW5kZWZpbmVkXG4gIF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZXh0cmEucHJvdG9jb2xNZXRhZGF0YSA/IFByb21pc2UucmVzb2x2ZShleHRyYS5wcm90b2NvbE1ldGFkYXRhKSA6IHByb3RvY29sVjEuZ2V0TWV0YWRhdGEoKSxcbiAgICBleHRyYS5jcnlwdG9cbiAgICAgID8gUHJvbWlzZS5yZXNvbHZlKGV4dHJhLmNyeXB0bylcbiAgICAgIDogZXh0cmEuY3J5cHRvID09PSBudWxsIHx8ICFpc09mZmxpbmVQcm90b2NvbChwcm90b2NvbFYxKSB8fCAoZXh0cmE/LnR5cGUgIT09ICdvZmZsaW5lJyAmJiBleHRyYT8udHlwZSAhPT0gJ2Z1bGwnKVxuICAgICAgPyBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgOiBwcm90b2NvbFYxLmdldENyeXB0b0NvbmZpZ3VyYXRpb24oKSxcbiAgICBleHRyYS5uZXR3b3JrXG4gICAgICA/IFByb21pc2UucmVzb2x2ZShleHRyYS5uZXR3b3JrKVxuICAgICAgOiBleHRyYS5uZXR3b3JrID09PSBudWxsIHx8ICFpc09ubGluZVByb3RvY29sKHByb3RvY29sVjEpIHx8IChleHRyYT8udHlwZSAhPT0gJ29ubGluZScgJiYgZXh0cmE/LnR5cGUgIT09ICdmdWxsJylcbiAgICAgID8gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICAgIDogcHJvdG9jb2xWMS5nZXROZXR3b3JrKCksXG4gICAgZXh0cmEuYmxvY2tFeHBsb3Jlck1ldGFkYXRhXG4gICAgICA/IFByb21pc2UucmVzb2x2ZShleHRyYS5ibG9ja0V4cGxvcmVyTWV0YWRhdGEpXG4gICAgICA6IGV4dHJhLmJsb2NrRXhwbG9yZXJNZXRhZGF0YSA9PT0gbnVsbCB8fCBibG9ja0V4cGxvcmVyVjEgPT09IHVuZGVmaW5lZCB8fCAoZXh0cmE/LnR5cGUgIT09ICdvbmxpbmUnICYmIGV4dHJhPy50eXBlICE9PSAnZnVsbCcpXG4gICAgICA/IFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICA6IGJsb2NrRXhwbG9yZXJWMS5nZXRNZXRhZGF0YSgpLFxuICAgIGV4dHJhLnN1YlR5cGUgPyBQcm9taXNlLnJlc29sdmUoZXh0cmEuc3ViVHlwZSkgOiBwcm90b2NvbFYxLmdldFR5cGUoKSxcbiAgICBleHRyYS5jb250cmFjdEFkZHJlc3NcbiAgICAgID8gUHJvbWlzZS5yZXNvbHZlKGV4dHJhLmNvbnRyYWN0QWRkcmVzcylcbiAgICAgIDogZXh0cmEuY29udHJhY3RBZGRyZXNzID09PSBudWxsIHx8ICFoYXNDb25maWd1cmFibGVDb250cmFjdChwcm90b2NvbFYxKVxuICAgICAgPyBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKVxuICAgICAgOiBwcm90b2NvbFYxLmdldENvbnRyYWN0QWRkcmVzcygpXG4gIF0pXG5cbiAgaWYgKHN1cHBvcnRzVjFEZWxlZ2F0aW9uKHByb3RvY29sVjEpKSB7XG4gICAgcmV0dXJuIG5ldyBJQ29pbkRlbGVnYXRlU3ViUHJvdG9jb2xBZGFwdGVyKFxuICAgICAgcHJvdG9jb2xWMSxcbiAgICAgIHByb3RvY29sTWV0YWRhdGEsXG4gICAgICBjcnlwdG8sXG4gICAgICBuZXR3b3JrLFxuICAgICAgYmxvY2tFeHBsb3JlclYxLFxuICAgICAgYmxvY2tFeHBsb3Jlck1ldGFkYXRhLFxuICAgICAgdjNTZXJpYWxpemVyQ29tcGFuaW9uLFxuICAgICAgdHlwZSxcbiAgICAgIGNvbnRyYWN0QWRkcmVzc1xuICAgIClcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IElDb2luU3ViUHJvdG9jb2xBZGFwdGVyKFxuICAgICAgcHJvdG9jb2xWMSxcbiAgICAgIHByb3RvY29sTWV0YWRhdGEsXG4gICAgICBjcnlwdG8sXG4gICAgICBuZXR3b3JrLFxuICAgICAgYmxvY2tFeHBsb3JlclYxLFxuICAgICAgYmxvY2tFeHBsb3Jlck1ldGFkYXRhLFxuICAgICAgdjNTZXJpYWxpemVyQ29tcGFuaW9uLFxuICAgICAgdHlwZSxcbiAgICAgIGNvbnRyYWN0QWRkcmVzc1xuICAgIClcbiAgfVxufVxuIl19
|