@dyanet/nestjs-config-aws 1.2.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +60 -43
- package/dist/cjs/aws-config-loader.js +57 -0
- package/dist/cjs/build-loaders.js +58 -0
- package/dist/cjs/config.module.js +138 -0
- package/dist/cjs/index.js +46 -0
- package/dist/cjs/interfaces/config-service.interface.js +11 -0
- package/dist/cjs/interfaces/default-schema.interface.js +63 -0
- package/dist/cjs/{nestjs-config-aws/src/interfaces → interfaces}/index.js +1 -1
- package/dist/cjs/interfaces/module-options.interface.js +3 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/services/config.service.js +142 -0
- package/dist/esm/aws-config-loader.js +54 -0
- package/dist/esm/build-loaders.js +55 -0
- package/dist/esm/config.module.js +135 -0
- package/dist/esm/index.js +18 -0
- package/dist/esm/interfaces/config-service.interface.js +7 -0
- package/dist/esm/interfaces/default-schema.interface.js +59 -0
- package/dist/esm/interfaces/index.js +8 -0
- package/dist/esm/interfaces/module-options.interface.js +2 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/services/config.service.js +139 -0
- package/dist/types/aws-config-loader.d.ts +74 -0
- package/dist/types/aws-config-loader.d.ts.map +1 -0
- package/dist/types/build-loaders.d.ts +30 -0
- package/dist/types/build-loaders.d.ts.map +1 -0
- package/dist/types/{nestjs-config-aws/src/config.module.d.ts → config.module.d.ts} +2 -8
- package/dist/types/config.module.d.ts.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/interfaces/config-service.interface.d.ts.map +1 -0
- package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/default-schema.interface.d.ts +14 -14
- package/dist/types/interfaces/default-schema.interface.d.ts.map +1 -0
- package/dist/types/interfaces/index.d.ts.map +1 -0
- package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/module-options.interface.d.ts +22 -3
- package/dist/types/interfaces/module-options.interface.d.ts.map +1 -0
- package/dist/types/services/config.service.d.ts.map +1 -0
- package/package.json +12 -6
- package/dist/cjs/config-aws/src/config-manager.js +0 -366
- package/dist/cjs/config-aws/src/errors/index.js +0 -77
- package/dist/cjs/config-aws/src/index.js +0 -37
- package/dist/cjs/config-aws/src/interfaces/config-loader.interface.js +0 -3
- package/dist/cjs/config-aws/src/interfaces/config-manager.interface.js +0 -3
- package/dist/cjs/config-aws/src/interfaces/env-file-loader.interface.js +0 -3
- package/dist/cjs/config-aws/src/interfaces/environment-loader.interface.js +0 -3
- package/dist/cjs/config-aws/src/interfaces/s3-loader.interface.js +0 -3
- package/dist/cjs/config-aws/src/interfaces/secrets-manager-loader.interface.js +0 -3
- package/dist/cjs/config-aws/src/interfaces/ssm-parameter-store-loader.interface.js +0 -3
- package/dist/cjs/config-aws/src/loaders/env-file.loader.js +0 -169
- package/dist/cjs/config-aws/src/loaders/environment.loader.js +0 -85
- package/dist/cjs/config-aws/src/loaders/s3.loader.js +0 -145
- package/dist/cjs/config-aws/src/loaders/secrets-manager.loader.js +0 -169
- package/dist/cjs/config-aws/src/loaders/ssm-parameter-store.loader.js +0 -199
- package/dist/cjs/config-aws/src/utils/env-file-parser.util.js +0 -98
- package/dist/cjs/config-aws/src/utils/validation.util.js +0 -116
- package/dist/cjs/nestjs-config-aws/src/config.module.js +0 -175
- package/dist/cjs/nestjs-config-aws/src/index.js +0 -61
- package/dist/cjs/nestjs-config-aws/src/integration/index.js +0 -23
- package/dist/cjs/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.js +0 -3
- package/dist/cjs/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.js +0 -3
- package/dist/cjs/nestjs-config-aws/src/integration/interfaces/index.js +0 -26
- package/dist/cjs/nestjs-config-aws/src/integration/interfaces/integration-options.interface.js +0 -3
- package/dist/cjs/nestjs-config-aws/src/integration/interfaces/integration-state.interface.js +0 -3
- package/dist/cjs/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.js +0 -73
- package/dist/cjs/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.js +0 -3
- package/dist/cjs/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.js +0 -4
- package/dist/cjs/nestjs-config-aws/src/integration/interfaces/utility-types.interface.js +0 -52
- package/dist/cjs/nestjs-config-aws/src/integration/nestjs-config-integration.module.js +0 -124
- package/dist/cjs/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.js +0 -592
- package/dist/cjs/nestjs-config-aws/src/integration/providers/configuration-factory.provider.js +0 -385
- package/dist/cjs/nestjs-config-aws/src/integration/providers/index.js +0 -20
- package/dist/cjs/nestjs-config-aws/src/integration/services/async-config-helper.service.js +0 -366
- package/dist/cjs/nestjs-config-aws/src/integration/services/error-handler.service.js +0 -267
- package/dist/cjs/nestjs-config-aws/src/integration/services/factory-registration.service.js +0 -517
- package/dist/cjs/nestjs-config-aws/src/integration/services/index.js +0 -26
- package/dist/cjs/nestjs-config-aws/src/integration/services/integration-state.service.js +0 -81
- package/dist/cjs/nestjs-config-aws/src/integration/services/namespace-handler.service.js +0 -465
- package/dist/cjs/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js +0 -318
- package/dist/cjs/nestjs-config-aws/src/integration/services/precedence-handler.service.js +0 -292
- package/dist/cjs/nestjs-config-aws/src/integration/services/validation-integration.service.js +0 -595
- package/dist/cjs/nestjs-config-aws/src/integration/utils/config-integration.util.js +0 -283
- package/dist/cjs/nestjs-config-aws/src/integration/utils/index.js +0 -19
- package/dist/cjs/nestjs-config-aws/src/interfaces/config-service.interface.js +0 -11
- package/dist/cjs/nestjs-config-aws/src/interfaces/default-schema.interface.js +0 -63
- package/dist/cjs/nestjs-config-aws/src/interfaces/module-options.interface.js +0 -3
- package/dist/cjs/nestjs-config-aws/src/services/config.service.js +0 -142
- package/dist/esm/config-aws/src/config-manager.js +0 -362
- package/dist/esm/config-aws/src/errors/index.js +0 -69
- package/dist/esm/config-aws/src/index.js +0 -21
- package/dist/esm/config-aws/src/interfaces/config-loader.interface.js +0 -2
- package/dist/esm/config-aws/src/interfaces/config-manager.interface.js +0 -2
- package/dist/esm/config-aws/src/interfaces/env-file-loader.interface.js +0 -2
- package/dist/esm/config-aws/src/interfaces/environment-loader.interface.js +0 -2
- package/dist/esm/config-aws/src/interfaces/s3-loader.interface.js +0 -2
- package/dist/esm/config-aws/src/interfaces/secrets-manager-loader.interface.js +0 -2
- package/dist/esm/config-aws/src/interfaces/ssm-parameter-store-loader.interface.js +0 -2
- package/dist/esm/config-aws/src/loaders/env-file.loader.js +0 -132
- package/dist/esm/config-aws/src/loaders/environment.loader.js +0 -81
- package/dist/esm/config-aws/src/loaders/s3.loader.js +0 -141
- package/dist/esm/config-aws/src/loaders/secrets-manager.loader.js +0 -165
- package/dist/esm/config-aws/src/loaders/ssm-parameter-store.loader.js +0 -195
- package/dist/esm/config-aws/src/utils/env-file-parser.util.js +0 -94
- package/dist/esm/config-aws/src/utils/validation.util.js +0 -112
- package/dist/esm/nestjs-config-aws/src/config.module.js +0 -172
- package/dist/esm/nestjs-config-aws/src/index.js +0 -23
- package/dist/esm/nestjs-config-aws/src/integration/index.js +0 -7
- package/dist/esm/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.js +0 -2
- package/dist/esm/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.js +0 -2
- package/dist/esm/nestjs-config-aws/src/integration/interfaces/index.js +0 -10
- package/dist/esm/nestjs-config-aws/src/integration/interfaces/integration-options.interface.js +0 -2
- package/dist/esm/nestjs-config-aws/src/integration/interfaces/integration-state.interface.js +0 -2
- package/dist/esm/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.js +0 -64
- package/dist/esm/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.js +0 -2
- package/dist/esm/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.js +0 -3
- package/dist/esm/nestjs-config-aws/src/integration/interfaces/utility-types.interface.js +0 -44
- package/dist/esm/nestjs-config-aws/src/integration/nestjs-config-integration.module.js +0 -121
- package/dist/esm/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.js +0 -589
- package/dist/esm/nestjs-config-aws/src/integration/providers/configuration-factory.provider.js +0 -382
- package/dist/esm/nestjs-config-aws/src/integration/providers/index.js +0 -4
- package/dist/esm/nestjs-config-aws/src/integration/services/async-config-helper.service.js +0 -363
- package/dist/esm/nestjs-config-aws/src/integration/services/error-handler.service.js +0 -264
- package/dist/esm/nestjs-config-aws/src/integration/services/factory-registration.service.js +0 -514
- package/dist/esm/nestjs-config-aws/src/integration/services/index.js +0 -10
- package/dist/esm/nestjs-config-aws/src/integration/services/integration-state.service.js +0 -78
- package/dist/esm/nestjs-config-aws/src/integration/services/namespace-handler.service.js +0 -462
- package/dist/esm/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js +0 -315
- package/dist/esm/nestjs-config-aws/src/integration/services/precedence-handler.service.js +0 -289
- package/dist/esm/nestjs-config-aws/src/integration/services/validation-integration.service.js +0 -589
- package/dist/esm/nestjs-config-aws/src/integration/utils/config-integration.util.js +0 -240
- package/dist/esm/nestjs-config-aws/src/integration/utils/index.js +0 -3
- package/dist/esm/nestjs-config-aws/src/interfaces/config-service.interface.js +0 -7
- package/dist/esm/nestjs-config-aws/src/interfaces/default-schema.interface.js +0 -59
- package/dist/esm/nestjs-config-aws/src/interfaces/index.js +0 -8
- package/dist/esm/nestjs-config-aws/src/interfaces/module-options.interface.js +0 -2
- package/dist/esm/nestjs-config-aws/src/services/config.service.js +0 -139
- package/dist/types/config-aws/src/config-manager.d.ts +0 -119
- package/dist/types/config-aws/src/config-manager.d.ts.map +0 -1
- package/dist/types/config-aws/src/errors/index.d.ts +0 -43
- package/dist/types/config-aws/src/errors/index.d.ts.map +0 -1
- package/dist/types/config-aws/src/index.d.ts +0 -24
- package/dist/types/config-aws/src/index.d.ts.map +0 -1
- package/dist/types/config-aws/src/interfaces/config-loader.interface.d.ts +0 -33
- package/dist/types/config-aws/src/interfaces/config-loader.interface.d.ts.map +0 -1
- package/dist/types/config-aws/src/interfaces/config-manager.interface.d.ts +0 -86
- package/dist/types/config-aws/src/interfaces/config-manager.interface.d.ts.map +0 -1
- package/dist/types/config-aws/src/interfaces/env-file-loader.interface.d.ts +0 -12
- package/dist/types/config-aws/src/interfaces/env-file-loader.interface.d.ts.map +0 -1
- package/dist/types/config-aws/src/interfaces/environment-loader.interface.d.ts +0 -10
- package/dist/types/config-aws/src/interfaces/environment-loader.interface.d.ts.map +0 -1
- package/dist/types/config-aws/src/interfaces/s3-loader.interface.d.ts +0 -14
- package/dist/types/config-aws/src/interfaces/s3-loader.interface.d.ts.map +0 -1
- package/dist/types/config-aws/src/interfaces/secrets-manager-loader.interface.d.ts +0 -12
- package/dist/types/config-aws/src/interfaces/secrets-manager-loader.interface.d.ts.map +0 -1
- package/dist/types/config-aws/src/interfaces/ssm-parameter-store-loader.interface.d.ts +0 -14
- package/dist/types/config-aws/src/interfaces/ssm-parameter-store-loader.interface.d.ts.map +0 -1
- package/dist/types/config-aws/src/loaders/env-file.loader.d.ts +0 -69
- package/dist/types/config-aws/src/loaders/env-file.loader.d.ts.map +0 -1
- package/dist/types/config-aws/src/loaders/environment.loader.d.ts +0 -46
- package/dist/types/config-aws/src/loaders/environment.loader.d.ts.map +0 -1
- package/dist/types/config-aws/src/loaders/s3.loader.d.ts +0 -62
- package/dist/types/config-aws/src/loaders/s3.loader.d.ts.map +0 -1
- package/dist/types/config-aws/src/loaders/secrets-manager.loader.d.ts +0 -68
- package/dist/types/config-aws/src/loaders/secrets-manager.loader.d.ts.map +0 -1
- package/dist/types/config-aws/src/loaders/ssm-parameter-store.loader.d.ts +0 -78
- package/dist/types/config-aws/src/loaders/ssm-parameter-store.loader.d.ts.map +0 -1
- package/dist/types/config-aws/src/utils/env-file-parser.util.d.ts +0 -45
- package/dist/types/config-aws/src/utils/env-file-parser.util.d.ts.map +0 -1
- package/dist/types/config-aws/src/utils/validation.util.d.ts +0 -53
- package/dist/types/config-aws/src/utils/validation.util.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/config.module.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/index.d.ts +0 -11
- package/dist/types/nestjs-config-aws/src/index.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/index.d.ts +0 -6
- package/dist/types/nestjs-config-aws/src/integration/index.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.d.ts +0 -71
- package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.d.ts +0 -24
- package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/interfaces/index.d.ts +0 -9
- package/dist/types/nestjs-config-aws/src/integration/interfaces/index.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-options.interface.d.ts +0 -66
- package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-options.interface.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-state.interface.d.ts +0 -17
- package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-state.interface.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.d.ts +0 -332
- package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.d.ts +0 -259
- package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.d.ts +0 -209
- package/dist/types/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/interfaces/utility-types.interface.d.ts +0 -249
- package/dist/types/nestjs-config-aws/src/integration/interfaces/utility-types.interface.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/nestjs-config-integration.module.d.ts +0 -36
- package/dist/types/nestjs-config-aws/src/integration/nestjs-config-integration.module.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.d.ts +0 -134
- package/dist/types/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/providers/configuration-factory.provider.d.ts +0 -119
- package/dist/types/nestjs-config-aws/src/integration/providers/configuration-factory.provider.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/providers/index.d.ts +0 -3
- package/dist/types/nestjs-config-aws/src/integration/providers/index.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/services/async-config-helper.service.d.ts +0 -84
- package/dist/types/nestjs-config-aws/src/integration/services/async-config-helper.service.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/services/error-handler.service.d.ts +0 -84
- package/dist/types/nestjs-config-aws/src/integration/services/error-handler.service.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/services/factory-registration.service.d.ts +0 -158
- package/dist/types/nestjs-config-aws/src/integration/services/factory-registration.service.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/services/index.d.ts +0 -9
- package/dist/types/nestjs-config-aws/src/integration/services/index.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/services/integration-state.service.d.ts +0 -41
- package/dist/types/nestjs-config-aws/src/integration/services/integration-state.service.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/services/namespace-handler.service.d.ts +0 -192
- package/dist/types/nestjs-config-aws/src/integration/services/namespace-handler.service.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.d.ts +0 -87
- package/dist/types/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/services/precedence-handler.service.d.ts +0 -103
- package/dist/types/nestjs-config-aws/src/integration/services/precedence-handler.service.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/services/validation-integration.service.d.ts +0 -222
- package/dist/types/nestjs-config-aws/src/integration/services/validation-integration.service.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/utils/config-integration.util.d.ts +0 -81
- package/dist/types/nestjs-config-aws/src/integration/utils/config-integration.util.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/integration/utils/index.d.ts +0 -2
- package/dist/types/nestjs-config-aws/src/integration/utils/index.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/interfaces/config-service.interface.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/interfaces/default-schema.interface.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/interfaces/index.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/interfaces/module-options.interface.d.ts.map +0 -1
- package/dist/types/nestjs-config-aws/src/services/config.service.d.ts.map +0 -1
- /package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/config-service.interface.d.ts +0 -0
- /package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/index.d.ts +0 -0
- /package/dist/types/{nestjs-config-aws/src/services → services}/config.service.d.ts +0 -0
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
import { NestConfigAwsIntegrationModule } from '../nestjs-config-integration.module';
|
|
2
|
-
/**
|
|
3
|
-
* Utility functions for integrating nestjs-config-aws with @nestjs/config.
|
|
4
|
-
* These functions provide convenient ways to set up AWS configuration integration.
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Create a configuration factory that loads from AWS sources.
|
|
8
|
-
* This factory can be used directly in @nestjs/config's load array.
|
|
9
|
-
*
|
|
10
|
-
* @param options - Integration options for AWS configuration
|
|
11
|
-
* @returns Promise resolving to configuration factory
|
|
12
|
-
*/
|
|
13
|
-
export async function createAwsConfigFactory(options = {}) {
|
|
14
|
-
// Import services dynamically to avoid circular dependencies
|
|
15
|
-
const { AsyncConfigHelperService } = await import('../services/async-config-helper.service');
|
|
16
|
-
const { FactoryRegistrationService } = await import('../services/factory-registration.service');
|
|
17
|
-
const { ConfigurationFactoryProviderImpl } = await import('../providers/configuration-factory.provider');
|
|
18
|
-
const { AwsConfigurationLoaderService } = await import('../providers/aws-configuration-loader.service');
|
|
19
|
-
const { PrecedenceHandlerService } = await import('../services/precedence-handler.service');
|
|
20
|
-
const { NamespaceHandlerService } = await import('../services/namespace-handler.service');
|
|
21
|
-
const { ValidationIntegrationService } = await import('../services/validation-integration.service');
|
|
22
|
-
// Create service instances
|
|
23
|
-
const precedenceHandler = new PrecedenceHandlerService();
|
|
24
|
-
const configFactoryProvider = new ConfigurationFactoryProviderImpl(precedenceHandler);
|
|
25
|
-
const awsLoader = new AwsConfigurationLoaderService(options);
|
|
26
|
-
const namespaceHandler = new NamespaceHandlerService();
|
|
27
|
-
const validationService = new ValidationIntegrationService();
|
|
28
|
-
const factoryRegistration = new FactoryRegistrationService(configFactoryProvider, awsLoader, namespaceHandler, validationService, options);
|
|
29
|
-
const asyncHelper = new AsyncConfigHelperService(factoryRegistration, options);
|
|
30
|
-
// Create and return the async factory
|
|
31
|
-
return await asyncHelper.createAsyncConfigFactory();
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Create configuration factories for specific namespaces.
|
|
35
|
-
* This function creates separate factories for each namespace.
|
|
36
|
-
*
|
|
37
|
-
* @param namespaces - Array of namespace names
|
|
38
|
-
* @param options - Integration options for AWS configuration
|
|
39
|
-
* @returns Promise resolving to array of namespaced configuration factories
|
|
40
|
-
*/
|
|
41
|
-
export async function createAwsNamespacedFactories(namespaces, options = {}) {
|
|
42
|
-
// Import services dynamically
|
|
43
|
-
const { AsyncConfigHelperService } = await import('../services/async-config-helper.service');
|
|
44
|
-
const { FactoryRegistrationService } = await import('../services/factory-registration.service');
|
|
45
|
-
const { ConfigurationFactoryProviderImpl } = await import('../providers/configuration-factory.provider');
|
|
46
|
-
const { AwsConfigurationLoaderService } = await import('../providers/aws-configuration-loader.service');
|
|
47
|
-
const { PrecedenceHandlerService } = await import('../services/precedence-handler.service');
|
|
48
|
-
const { NamespaceHandlerService } = await import('../services/namespace-handler.service');
|
|
49
|
-
const { ValidationIntegrationService } = await import('../services/validation-integration.service');
|
|
50
|
-
// Create service instances
|
|
51
|
-
const precedenceHandler = new PrecedenceHandlerService();
|
|
52
|
-
const configFactoryProvider = new ConfigurationFactoryProviderImpl(precedenceHandler);
|
|
53
|
-
const awsLoader = new AwsConfigurationLoaderService(options);
|
|
54
|
-
const namespaceHandler = new NamespaceHandlerService();
|
|
55
|
-
const validationService = new ValidationIntegrationService();
|
|
56
|
-
const factoryRegistration = new FactoryRegistrationService(configFactoryProvider, awsLoader, namespaceHandler, validationService, options);
|
|
57
|
-
const asyncHelper = new AsyncConfigHelperService(factoryRegistration, options);
|
|
58
|
-
// Create and return the namespaced factories
|
|
59
|
-
return await asyncHelper.createAsyncNamespacedFactories(namespaces);
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Create enhanced ConfigModule options with AWS integration.
|
|
63
|
-
* This function enhances existing ConfigModule options with AWS-sourced configuration.
|
|
64
|
-
*
|
|
65
|
-
* @param baseOptions - Base ConfigModule options to enhance
|
|
66
|
-
* @param integrationOptions - Integration options for AWS configuration
|
|
67
|
-
* @returns Promise resolving to enhanced ConfigModule options
|
|
68
|
-
*/
|
|
69
|
-
export async function createEnhancedConfigOptions(baseOptions = {}, integrationOptions = {}) {
|
|
70
|
-
// Import services dynamically
|
|
71
|
-
const { AsyncConfigHelperService } = await import('../services/async-config-helper.service');
|
|
72
|
-
const { FactoryRegistrationService } = await import('../services/factory-registration.service');
|
|
73
|
-
const { ConfigurationFactoryProviderImpl } = await import('../providers/configuration-factory.provider');
|
|
74
|
-
const { AwsConfigurationLoaderService } = await import('../providers/aws-configuration-loader.service');
|
|
75
|
-
const { PrecedenceHandlerService } = await import('../services/precedence-handler.service');
|
|
76
|
-
const { NamespaceHandlerService } = await import('../services/namespace-handler.service');
|
|
77
|
-
const { ValidationIntegrationService } = await import('../services/validation-integration.service');
|
|
78
|
-
// Create service instances
|
|
79
|
-
const precedenceHandler = new PrecedenceHandlerService();
|
|
80
|
-
const configFactoryProvider = new ConfigurationFactoryProviderImpl(precedenceHandler);
|
|
81
|
-
const awsLoader = new AwsConfigurationLoaderService(integrationOptions);
|
|
82
|
-
const namespaceHandler = new NamespaceHandlerService();
|
|
83
|
-
const validationService = new ValidationIntegrationService();
|
|
84
|
-
const factoryRegistration = new FactoryRegistrationService(configFactoryProvider, awsLoader, namespaceHandler, validationService, integrationOptions);
|
|
85
|
-
const asyncHelper = new AsyncConfigHelperService(factoryRegistration, integrationOptions);
|
|
86
|
-
// Create and return enhanced options
|
|
87
|
-
return await asyncHelper.createAsyncConfigOptions(baseOptions);
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Create a complete integration module for use with @nestjs/config.
|
|
91
|
-
* This function returns a module that can be imported alongside ConfigModule.
|
|
92
|
-
*
|
|
93
|
-
* @param options - Integration options for AWS configuration
|
|
94
|
-
* @returns Dynamic module for AWS integration
|
|
95
|
-
*/
|
|
96
|
-
export function createAwsIntegrationModule(options = {}) {
|
|
97
|
-
return NestConfigAwsIntegrationModule.forRoot(options);
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Create an async integration module for use with @nestjs/config.
|
|
101
|
-
* This function returns a module that can be imported alongside ConfigModule for async scenarios.
|
|
102
|
-
*
|
|
103
|
-
* @param useFactory - Factory function to create integration options
|
|
104
|
-
* @param inject - Dependencies to inject into the factory function
|
|
105
|
-
* @param imports - Modules to import for the factory function
|
|
106
|
-
* @returns Dynamic module for async AWS integration
|
|
107
|
-
*/
|
|
108
|
-
export function createAsyncAwsIntegrationModule(useFactory, inject = [], imports = []) {
|
|
109
|
-
return NestConfigAwsIntegrationModule.forRootAsync({
|
|
110
|
-
useFactory,
|
|
111
|
-
inject,
|
|
112
|
-
imports,
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Create a factory function that can be used with ConfigModule.forRoot().
|
|
117
|
-
* This factory function loads AWS configuration and merges it with local configuration.
|
|
118
|
-
*
|
|
119
|
-
* @param integrationOptions - Integration options for AWS configuration
|
|
120
|
-
* @returns Factory function for use with ConfigModule
|
|
121
|
-
*/
|
|
122
|
-
export function createConfigModuleFactory(integrationOptions = {}) {
|
|
123
|
-
return async () => {
|
|
124
|
-
try {
|
|
125
|
-
// Create AWS configuration factory
|
|
126
|
-
const awsFactory = await createAwsConfigFactory(integrationOptions);
|
|
127
|
-
// Return ConfigModule options with AWS factory
|
|
128
|
-
return {
|
|
129
|
-
load: [awsFactory],
|
|
130
|
-
isGlobal: integrationOptions.registerGlobally ?? true,
|
|
131
|
-
cache: integrationOptions.factoryOptions?.cache ?? true,
|
|
132
|
-
expandVariables: integrationOptions.factoryOptions?.expandVariables ?? true,
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
catch (error) {
|
|
136
|
-
// Handle error based on integration options
|
|
137
|
-
if (integrationOptions.failOnAwsError) {
|
|
138
|
-
throw error;
|
|
139
|
-
}
|
|
140
|
-
// Return basic options as fallback
|
|
141
|
-
if (integrationOptions.fallbackToLocal) {
|
|
142
|
-
return {
|
|
143
|
-
load: [],
|
|
144
|
-
isGlobal: integrationOptions.registerGlobally ?? true,
|
|
145
|
-
cache: integrationOptions.factoryOptions?.cache ?? true,
|
|
146
|
-
expandVariables: integrationOptions.factoryOptions?.expandVariables ?? true,
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
throw error;
|
|
150
|
-
}
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Create a factory function with dependency injection support.
|
|
155
|
-
* This factory function can receive injected dependencies and use them to configure AWS integration.
|
|
156
|
-
*
|
|
157
|
-
* @param integrationOptions - Integration options for AWS configuration
|
|
158
|
-
* @param dependencies - Array of dependency tokens to inject
|
|
159
|
-
* @returns Factory function with dependency injection support
|
|
160
|
-
*/
|
|
161
|
-
export function createConfigModuleFactoryWithDependencies(integrationOptions = {}, dependencies = []) {
|
|
162
|
-
return async (...injectedDependencies) => {
|
|
163
|
-
try {
|
|
164
|
-
// Import services dynamically
|
|
165
|
-
const { AsyncConfigHelperService } = await import('../services/async-config-helper.service');
|
|
166
|
-
const { FactoryRegistrationService } = await import('../services/factory-registration.service');
|
|
167
|
-
const { ConfigurationFactoryProviderImpl } = await import('../providers/configuration-factory.provider');
|
|
168
|
-
const { AwsConfigurationLoaderService } = await import('../providers/aws-configuration-loader.service');
|
|
169
|
-
const { PrecedenceHandlerService } = await import('../services/precedence-handler.service');
|
|
170
|
-
const { NamespaceHandlerService } = await import('../services/namespace-handler.service');
|
|
171
|
-
const { ValidationIntegrationService } = await import('../services/validation-integration.service');
|
|
172
|
-
// Create service instances
|
|
173
|
-
const precedenceHandler = new PrecedenceHandlerService();
|
|
174
|
-
const configFactoryProvider = new ConfigurationFactoryProviderImpl(precedenceHandler);
|
|
175
|
-
const awsLoader = new AwsConfigurationLoaderService(integrationOptions);
|
|
176
|
-
const namespaceHandler = new NamespaceHandlerService();
|
|
177
|
-
const validationService = new ValidationIntegrationService();
|
|
178
|
-
const factoryRegistration = new FactoryRegistrationService(configFactoryProvider, awsLoader, namespaceHandler, validationService, integrationOptions);
|
|
179
|
-
const asyncHelper = new AsyncConfigHelperService(factoryRegistration, integrationOptions);
|
|
180
|
-
// Create factory with dependencies
|
|
181
|
-
const factoryWithDeps = asyncHelper.createAsyncFactoryWithDependencies(dependencies);
|
|
182
|
-
// Execute factory with injected dependencies
|
|
183
|
-
return await factoryWithDeps(...injectedDependencies);
|
|
184
|
-
}
|
|
185
|
-
catch (error) {
|
|
186
|
-
// Handle error based on integration options
|
|
187
|
-
if (integrationOptions.failOnAwsError) {
|
|
188
|
-
throw error;
|
|
189
|
-
}
|
|
190
|
-
// Return basic options as fallback
|
|
191
|
-
if (integrationOptions.fallbackToLocal) {
|
|
192
|
-
return {
|
|
193
|
-
load: [],
|
|
194
|
-
isGlobal: integrationOptions.registerGlobally ?? true,
|
|
195
|
-
cache: integrationOptions.factoryOptions?.cache ?? true,
|
|
196
|
-
expandVariables: integrationOptions.factoryOptions?.expandVariables ?? true,
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
throw error;
|
|
200
|
-
}
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Check if AWS configuration is available for integration.
|
|
205
|
-
* This function can be used to determine if AWS integration should be enabled.
|
|
206
|
-
*
|
|
207
|
-
* @param options - Integration options for AWS configuration
|
|
208
|
-
* @returns Promise resolving to availability status
|
|
209
|
-
*/
|
|
210
|
-
export async function checkAwsConfigAvailability(options = {}) {
|
|
211
|
-
try {
|
|
212
|
-
// Import services dynamically
|
|
213
|
-
const { AsyncConfigHelperService } = await import('../services/async-config-helper.service');
|
|
214
|
-
const { FactoryRegistrationService } = await import('../services/factory-registration.service');
|
|
215
|
-
const { ConfigurationFactoryProviderImpl } = await import('../providers/configuration-factory.provider');
|
|
216
|
-
const { AwsConfigurationLoaderService } = await import('../providers/aws-configuration-loader.service');
|
|
217
|
-
const { PrecedenceHandlerService } = await import('../services/precedence-handler.service');
|
|
218
|
-
const { NamespaceHandlerService } = await import('../services/namespace-handler.service');
|
|
219
|
-
const { ValidationIntegrationService } = await import('../services/validation-integration.service');
|
|
220
|
-
// Create service instances
|
|
221
|
-
const precedenceHandler = new PrecedenceHandlerService();
|
|
222
|
-
const configFactoryProvider = new ConfigurationFactoryProviderImpl(precedenceHandler);
|
|
223
|
-
const awsLoader = new AwsConfigurationLoaderService(options);
|
|
224
|
-
const namespaceHandler = new NamespaceHandlerService();
|
|
225
|
-
const validationService = new ValidationIntegrationService();
|
|
226
|
-
const factoryRegistration = new FactoryRegistrationService(configFactoryProvider, awsLoader, namespaceHandler, validationService, options);
|
|
227
|
-
const asyncHelper = new AsyncConfigHelperService(factoryRegistration, options);
|
|
228
|
-
// Check availability
|
|
229
|
-
return await asyncHelper.checkAsyncAvailability();
|
|
230
|
-
}
|
|
231
|
-
catch (error) {
|
|
232
|
-
const availabilityError = error instanceof Error ? error : new Error(String(error));
|
|
233
|
-
return {
|
|
234
|
-
isAvailable: false,
|
|
235
|
-
factoriesCount: 0,
|
|
236
|
-
errors: [availabilityError.message],
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLWludGVncmF0aW9uLnV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvaW50ZWdyYXRpb24vdXRpbHMvY29uZmlnLWludGVncmF0aW9uLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFckY7OztHQUdHO0FBRUg7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxzQkFBc0IsQ0FBQyxVQUE4QixFQUFFO0lBQzNFLDZEQUE2RDtJQUM3RCxNQUFNLEVBQUUsd0JBQXdCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQzdGLE1BQU0sRUFBRSwwQkFBMEIsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLDBDQUEwQyxDQUFDLENBQUM7SUFDaEcsTUFBTSxFQUFFLGdDQUFnQyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsNkNBQTZDLENBQUMsQ0FBQztJQUN6RyxNQUFNLEVBQUUsNkJBQTZCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0lBQ3hHLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFDNUYsTUFBTSxFQUFFLHVCQUF1QixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUMxRixNQUFNLEVBQUUsNEJBQTRCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBRXBHLDJCQUEyQjtJQUMzQixNQUFNLGlCQUFpQixHQUFHLElBQUksd0JBQXdCLEVBQUUsQ0FBQztJQUN6RCxNQUFNLHFCQUFxQixHQUFHLElBQUksZ0NBQWdDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUN0RixNQUFNLFNBQVMsR0FBRyxJQUFJLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO0lBQ3ZELE1BQU0saUJBQWlCLEdBQUcsSUFBSSw0QkFBNEIsRUFBRSxDQUFDO0lBQzdELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSwwQkFBMEIsQ0FDeEQscUJBQXFCLEVBQ3JCLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLE9BQU8sQ0FDUixDQUFDO0lBQ0YsTUFBTSxXQUFXLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUUvRSxzQ0FBc0M7SUFDdEMsT0FBTyxNQUFNLFdBQVcsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSw0QkFBNEIsQ0FDaEQsVUFBb0IsRUFDcEIsVUFBOEIsRUFBRTtJQUVoQyw4QkFBOEI7SUFDOUIsTUFBTSxFQUFFLHdCQUF3QixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMseUNBQXlDLENBQUMsQ0FBQztJQUM3RixNQUFNLEVBQUUsMEJBQTBCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0lBQ2hHLE1BQU0sRUFBRSxnQ0FBZ0MsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLDZDQUE2QyxDQUFDLENBQUM7SUFDekcsTUFBTSxFQUFFLDZCQUE2QixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUN4RyxNQUFNLEVBQUUsd0JBQXdCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0lBQzVGLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLHVDQUF1QyxDQUFDLENBQUM7SUFDMUYsTUFBTSxFQUFFLDRCQUE0QixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsNENBQTRDLENBQUMsQ0FBQztJQUVwRywyQkFBMkI7SUFDM0IsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLHdCQUF3QixFQUFFLENBQUM7SUFDekQsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLGdDQUFnQyxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDdEYsTUFBTSxTQUFTLEdBQUcsSUFBSSw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3RCxNQUFNLGdCQUFnQixHQUFHLElBQUksdUJBQXVCLEVBQUUsQ0FBQztJQUN2RCxNQUFNLGlCQUFpQixHQUFHLElBQUksNEJBQTRCLEVBQUUsQ0FBQztJQUM3RCxNQUFNLG1CQUFtQixHQUFHLElBQUksMEJBQTBCLENBQ3hELHFCQUFxQixFQUNyQixTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixPQUFPLENBQ1IsQ0FBQztJQUNGLE1BQU0sV0FBVyxHQUFHLElBQUksd0JBQXdCLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFL0UsNkNBQTZDO0lBQzdDLE9BQU8sTUFBTSxXQUFXLENBQUMsOEJBQThCLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDdEUsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLDJCQUEyQixDQUMvQyxjQUFtQyxFQUFFLEVBQ3JDLHFCQUF5QyxFQUFFO0lBRTNDLDhCQUE4QjtJQUM5QixNQUFNLEVBQUUsd0JBQXdCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQzdGLE1BQU0sRUFBRSwwQkFBMEIsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLDBDQUEwQyxDQUFDLENBQUM7SUFDaEcsTUFBTSxFQUFFLGdDQUFnQyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsNkNBQTZDLENBQUMsQ0FBQztJQUN6RyxNQUFNLEVBQUUsNkJBQTZCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0lBQ3hHLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7SUFDNUYsTUFBTSxFQUFFLHVCQUF1QixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUMxRixNQUFNLEVBQUUsNEJBQTRCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBRXBHLDJCQUEyQjtJQUMzQixNQUFNLGlCQUFpQixHQUFHLElBQUksd0JBQXdCLEVBQUUsQ0FBQztJQUN6RCxNQUFNLHFCQUFxQixHQUFHLElBQUksZ0NBQWdDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUN0RixNQUFNLFNBQVMsR0FBRyxJQUFJLDZCQUE2QixDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDeEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLHVCQUF1QixFQUFFLENBQUM7SUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLDRCQUE0QixFQUFFLENBQUM7SUFDN0QsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLDBCQUEwQixDQUN4RCxxQkFBcUIsRUFDckIsU0FBUyxFQUNULGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsa0JBQWtCLENBQ25CLENBQUM7SUFDRixNQUFNLFdBQVcsR0FBRyxJQUFJLHdCQUF3QixDQUFDLG1CQUFtQixFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFFMUYscUNBQXFDO0lBQ3JDLE9BQU8sTUFBTSxXQUFXLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxVQUE4QixFQUFFO0lBQ3pFLE9BQU8sOEJBQThCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSwrQkFBK0IsQ0FDN0MsVUFBZ0YsRUFDaEYsU0FBZ0IsRUFBRSxFQUNsQixVQUFpQixFQUFFO0lBRW5CLE9BQU8sOEJBQThCLENBQUMsWUFBWSxDQUFDO1FBQ2pELFVBQVU7UUFDVixNQUFNO1FBQ04sT0FBTztLQUNSLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQ3ZDLHFCQUF5QyxFQUFFO0lBRTNDLE9BQU8sS0FBSyxJQUFrQyxFQUFFO1FBQzlDLElBQUksQ0FBQztZQUNILG1DQUFtQztZQUNuQyxNQUFNLFVBQVUsR0FBRyxNQUFNLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFFcEUsK0NBQStDO1lBQy9DLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUNsQixRQUFRLEVBQUUsa0JBQWtCLENBQUMsZ0JBQWdCLElBQUksSUFBSTtnQkFDckQsS0FBSyxFQUFFLGtCQUFrQixDQUFDLGNBQWMsRUFBRSxLQUFLLElBQUksSUFBSTtnQkFDdkQsZUFBZSxFQUFFLGtCQUFrQixDQUFDLGNBQWMsRUFBRSxlQUFlLElBQUksSUFBSTthQUM1RSxDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZiw0Q0FBNEM7WUFDNUMsSUFBSSxrQkFBa0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxLQUFLLENBQUM7WUFDZCxDQUFDO1lBRUQsbUNBQW1DO1lBQ25DLElBQUksa0JBQWtCLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3ZDLE9BQU87b0JBQ0wsSUFBSSxFQUFFLEVBQUU7b0JBQ1IsUUFBUSxFQUFFLGtCQUFrQixDQUFDLGdCQUFnQixJQUFJLElBQUk7b0JBQ3JELEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxjQUFjLEVBQUUsS0FBSyxJQUFJLElBQUk7b0JBQ3ZELGVBQWUsRUFBRSxrQkFBa0IsQ0FBQyxjQUFjLEVBQUUsZUFBZSxJQUFJLElBQUk7aUJBQzVFLENBQUM7WUFDSixDQUFDO1lBRUQsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUseUNBQXlDLENBQ3ZELHFCQUF5QyxFQUFFLEVBQzNDLGVBQXNCLEVBQUU7SUFFeEIsT0FBTyxLQUFLLEVBQUUsR0FBRyxvQkFBMkIsRUFBZ0MsRUFBRTtRQUM1RSxJQUFJLENBQUM7WUFDSCw4QkFBOEI7WUFDOUIsTUFBTSxFQUFFLHdCQUF3QixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMseUNBQXlDLENBQUMsQ0FBQztZQUM3RixNQUFNLEVBQUUsMEJBQTBCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1lBQ2hHLE1BQU0sRUFBRSxnQ0FBZ0MsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLDZDQUE2QyxDQUFDLENBQUM7WUFDekcsTUFBTSxFQUFFLDZCQUE2QixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsK0NBQStDLENBQUMsQ0FBQztZQUN4RyxNQUFNLEVBQUUsd0JBQXdCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1lBQzVGLE1BQU0sRUFBRSx1QkFBdUIsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLHVDQUF1QyxDQUFDLENBQUM7WUFDMUYsTUFBTSxFQUFFLDRCQUE0QixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsNENBQTRDLENBQUMsQ0FBQztZQUVwRywyQkFBMkI7WUFDM0IsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLHdCQUF3QixFQUFFLENBQUM7WUFDekQsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLGdDQUFnQyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDdEYsTUFBTSxTQUFTLEdBQUcsSUFBSSw2QkFBNkIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3hFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1lBQ3ZELE1BQU0saUJBQWlCLEdBQUcsSUFBSSw0QkFBNEIsRUFBRSxDQUFDO1lBQzdELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSwwQkFBMEIsQ0FDeEQscUJBQXFCLEVBQ3JCLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGtCQUFrQixDQUNuQixDQUFDO1lBQ0YsTUFBTSxXQUFXLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxtQkFBbUIsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1lBRTFGLG1DQUFtQztZQUNuQyxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsa0NBQWtDLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFckYsNkNBQTZDO1lBQzdDLE9BQU8sTUFBTSxlQUFlLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsNENBQTRDO1lBQzVDLElBQUksa0JBQWtCLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RDLE1BQU0sS0FBSyxDQUFDO1lBQ2QsQ0FBQztZQUVELG1DQUFtQztZQUNuQyxJQUFJLGtCQUFrQixDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN2QyxPQUFPO29CQUNMLElBQUksRUFBRSxFQUFFO29CQUNSLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJO29CQUNyRCxLQUFLLEVBQUUsa0JBQWtCLENBQUMsY0FBYyxFQUFFLEtBQUssSUFBSSxJQUFJO29CQUN2RCxlQUFlLEVBQUUsa0JBQWtCLENBQUMsY0FBYyxFQUFFLGVBQWUsSUFBSSxJQUFJO2lCQUM1RSxDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLDBCQUEwQixDQUM5QyxVQUE4QixFQUFFO0lBTWhDLElBQUksQ0FBQztRQUNILDhCQUE4QjtRQUM5QixNQUFNLEVBQUUsd0JBQXdCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1FBQzdGLE1BQU0sRUFBRSwwQkFBMEIsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDaEcsTUFBTSxFQUFFLGdDQUFnQyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUN6RyxNQUFNLEVBQUUsNkJBQTZCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1FBQ3hHLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFDNUYsTUFBTSxFQUFFLHVCQUF1QixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUMxRixNQUFNLEVBQUUsNEJBQTRCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBRXBHLDJCQUEyQjtRQUMzQixNQUFNLGlCQUFpQixHQUFHLElBQUksd0JBQXdCLEVBQUUsQ0FBQztRQUN6RCxNQUFNLHFCQUFxQixHQUFHLElBQUksZ0NBQWdDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN0RixNQUFNLFNBQVMsR0FBRyxJQUFJLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQ3ZELE1BQU0saUJBQWlCLEdBQUcsSUFBSSw0QkFBNEIsRUFBRSxDQUFDO1FBQzdELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSwwQkFBMEIsQ0FDeEQscUJBQXFCLEVBQ3JCLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLE9BQU8sQ0FDUixDQUFDO1FBQ0YsTUFBTSxXQUFXLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUUvRSxxQkFBcUI7UUFDckIsT0FBTyxNQUFNLFdBQVcsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRXBGLE9BQU87WUFDTCxXQUFXLEVBQUUsS0FBSztZQUNsQixjQUFjLEVBQUUsQ0FBQztZQUNqQixNQUFNLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUM7U0FDcEMsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uZmlnRmFjdG9yeSwgQ29uZmlnTW9kdWxlT3B0aW9ucyB9IGZyb20gJ0BuZXN0anMvY29uZmlnJztcclxuaW1wb3J0IHsgRHluYW1pY01vZHVsZSB9IGZyb20gJ0BuZXN0anMvY29tbW9uJztcclxuaW1wb3J0IHsgSW50ZWdyYXRpb25PcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pbnRlZ3JhdGlvbi1vcHRpb25zLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IE5lc3RDb25maWdBd3NJbnRlZ3JhdGlvbk1vZHVsZSB9IGZyb20gJy4uL25lc3Rqcy1jb25maWctaW50ZWdyYXRpb24ubW9kdWxlJztcclxuXHJcbi8qKlxyXG4gKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgaW50ZWdyYXRpbmcgbmVzdGpzLWNvbmZpZy1hd3Mgd2l0aCBAbmVzdGpzL2NvbmZpZy5cclxuICogVGhlc2UgZnVuY3Rpb25zIHByb3ZpZGUgY29udmVuaWVudCB3YXlzIHRvIHNldCB1cCBBV1MgY29uZmlndXJhdGlvbiBpbnRlZ3JhdGlvbi5cclxuICovXHJcblxyXG4vKipcclxuICogQ3JlYXRlIGEgY29uZmlndXJhdGlvbiBmYWN0b3J5IHRoYXQgbG9hZHMgZnJvbSBBV1Mgc291cmNlcy5cclxuICogVGhpcyBmYWN0b3J5IGNhbiBiZSB1c2VkIGRpcmVjdGx5IGluIEBuZXN0anMvY29uZmlnJ3MgbG9hZCBhcnJheS5cclxuICogXHJcbiAqIEBwYXJhbSBvcHRpb25zIC0gSW50ZWdyYXRpb24gb3B0aW9ucyBmb3IgQVdTIGNvbmZpZ3VyYXRpb25cclxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gY29uZmlndXJhdGlvbiBmYWN0b3J5XHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXdzQ29uZmlnRmFjdG9yeShvcHRpb25zOiBJbnRlZ3JhdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8Q29uZmlnRmFjdG9yeT4ge1xyXG4gIC8vIEltcG9ydCBzZXJ2aWNlcyBkeW5hbWljYWxseSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXNcclxuICBjb25zdCB7IEFzeW5jQ29uZmlnSGVscGVyU2VydmljZSB9ID0gYXdhaXQgaW1wb3J0KCcuLi9zZXJ2aWNlcy9hc3luYy1jb25maWctaGVscGVyLnNlcnZpY2UnKTtcclxuICBjb25zdCB7IEZhY3RvcnlSZWdpc3RyYXRpb25TZXJ2aWNlIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3NlcnZpY2VzL2ZhY3RvcnktcmVnaXN0cmF0aW9uLnNlcnZpY2UnKTtcclxuICBjb25zdCB7IENvbmZpZ3VyYXRpb25GYWN0b3J5UHJvdmlkZXJJbXBsIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3Byb3ZpZGVycy9jb25maWd1cmF0aW9uLWZhY3RvcnkucHJvdmlkZXInKTtcclxuICBjb25zdCB7IEF3c0NvbmZpZ3VyYXRpb25Mb2FkZXJTZXJ2aWNlIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3Byb3ZpZGVycy9hd3MtY29uZmlndXJhdGlvbi1sb2FkZXIuc2VydmljZScpO1xyXG4gIGNvbnN0IHsgUHJlY2VkZW5jZUhhbmRsZXJTZXJ2aWNlIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3NlcnZpY2VzL3ByZWNlZGVuY2UtaGFuZGxlci5zZXJ2aWNlJyk7XHJcbiAgY29uc3QgeyBOYW1lc3BhY2VIYW5kbGVyU2VydmljZSB9ID0gYXdhaXQgaW1wb3J0KCcuLi9zZXJ2aWNlcy9uYW1lc3BhY2UtaGFuZGxlci5zZXJ2aWNlJyk7XHJcbiAgY29uc3QgeyBWYWxpZGF0aW9uSW50ZWdyYXRpb25TZXJ2aWNlIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24taW50ZWdyYXRpb24uc2VydmljZScpO1xyXG5cclxuICAvLyBDcmVhdGUgc2VydmljZSBpbnN0YW5jZXNcclxuICBjb25zdCBwcmVjZWRlbmNlSGFuZGxlciA9IG5ldyBQcmVjZWRlbmNlSGFuZGxlclNlcnZpY2UoKTtcclxuICBjb25zdCBjb25maWdGYWN0b3J5UHJvdmlkZXIgPSBuZXcgQ29uZmlndXJhdGlvbkZhY3RvcnlQcm92aWRlckltcGwocHJlY2VkZW5jZUhhbmRsZXIpO1xyXG4gIGNvbnN0IGF3c0xvYWRlciA9IG5ldyBBd3NDb25maWd1cmF0aW9uTG9hZGVyU2VydmljZShvcHRpb25zKTtcclxuICBjb25zdCBuYW1lc3BhY2VIYW5kbGVyID0gbmV3IE5hbWVzcGFjZUhhbmRsZXJTZXJ2aWNlKCk7XHJcbiAgY29uc3QgdmFsaWRhdGlvblNlcnZpY2UgPSBuZXcgVmFsaWRhdGlvbkludGVncmF0aW9uU2VydmljZSgpO1xyXG4gIGNvbnN0IGZhY3RvcnlSZWdpc3RyYXRpb24gPSBuZXcgRmFjdG9yeVJlZ2lzdHJhdGlvblNlcnZpY2UoXHJcbiAgICBjb25maWdGYWN0b3J5UHJvdmlkZXIsXHJcbiAgICBhd3NMb2FkZXIsXHJcbiAgICBuYW1lc3BhY2VIYW5kbGVyLFxyXG4gICAgdmFsaWRhdGlvblNlcnZpY2UsXHJcbiAgICBvcHRpb25zXHJcbiAgKTtcclxuICBjb25zdCBhc3luY0hlbHBlciA9IG5ldyBBc3luY0NvbmZpZ0hlbHBlclNlcnZpY2UoZmFjdG9yeVJlZ2lzdHJhdGlvbiwgb3B0aW9ucyk7XHJcblxyXG4gIC8vIENyZWF0ZSBhbmQgcmV0dXJuIHRoZSBhc3luYyBmYWN0b3J5XHJcbiAgcmV0dXJuIGF3YWl0IGFzeW5jSGVscGVyLmNyZWF0ZUFzeW5jQ29uZmlnRmFjdG9yeSgpO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGNvbmZpZ3VyYXRpb24gZmFjdG9yaWVzIGZvciBzcGVjaWZpYyBuYW1lc3BhY2VzLlxyXG4gKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgc2VwYXJhdGUgZmFjdG9yaWVzIGZvciBlYWNoIG5hbWVzcGFjZS5cclxuICogXHJcbiAqIEBwYXJhbSBuYW1lc3BhY2VzIC0gQXJyYXkgb2YgbmFtZXNwYWNlIG5hbWVzXHJcbiAqIEBwYXJhbSBvcHRpb25zIC0gSW50ZWdyYXRpb24gb3B0aW9ucyBmb3IgQVdTIGNvbmZpZ3VyYXRpb25cclxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gYXJyYXkgb2YgbmFtZXNwYWNlZCBjb25maWd1cmF0aW9uIGZhY3Rvcmllc1xyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUF3c05hbWVzcGFjZWRGYWN0b3JpZXMoXHJcbiAgbmFtZXNwYWNlczogc3RyaW5nW10sXHJcbiAgb3B0aW9uczogSW50ZWdyYXRpb25PcHRpb25zID0ge31cclxuKTogUHJvbWlzZTxDb25maWdGYWN0b3J5W10+IHtcclxuICAvLyBJbXBvcnQgc2VydmljZXMgZHluYW1pY2FsbHlcclxuICBjb25zdCB7IEFzeW5jQ29uZmlnSGVscGVyU2VydmljZSB9ID0gYXdhaXQgaW1wb3J0KCcuLi9zZXJ2aWNlcy9hc3luYy1jb25maWctaGVscGVyLnNlcnZpY2UnKTtcclxuICBjb25zdCB7IEZhY3RvcnlSZWdpc3RyYXRpb25TZXJ2aWNlIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3NlcnZpY2VzL2ZhY3RvcnktcmVnaXN0cmF0aW9uLnNlcnZpY2UnKTtcclxuICBjb25zdCB7IENvbmZpZ3VyYXRpb25GYWN0b3J5UHJvdmlkZXJJbXBsIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3Byb3ZpZGVycy9jb25maWd1cmF0aW9uLWZhY3RvcnkucHJvdmlkZXInKTtcclxuICBjb25zdCB7IEF3c0NvbmZpZ3VyYXRpb25Mb2FkZXJTZXJ2aWNlIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3Byb3ZpZGVycy9hd3MtY29uZmlndXJhdGlvbi1sb2FkZXIuc2VydmljZScpO1xyXG4gIGNvbnN0IHsgUHJlY2VkZW5jZUhhbmRsZXJTZXJ2aWNlIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3NlcnZpY2VzL3ByZWNlZGVuY2UtaGFuZGxlci5zZXJ2aWNlJyk7XHJcbiAgY29uc3QgeyBOYW1lc3BhY2VIYW5kbGVyU2VydmljZSB9ID0gYXdhaXQgaW1wb3J0KCcuLi9zZXJ2aWNlcy9uYW1lc3BhY2UtaGFuZGxlci5zZXJ2aWNlJyk7XHJcbiAgY29uc3QgeyBWYWxpZGF0aW9uSW50ZWdyYXRpb25TZXJ2aWNlIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24taW50ZWdyYXRpb24uc2VydmljZScpO1xyXG5cclxuICAvLyBDcmVhdGUgc2VydmljZSBpbnN0YW5jZXNcclxuICBjb25zdCBwcmVjZWRlbmNlSGFuZGxlciA9IG5ldyBQcmVjZWRlbmNlSGFuZGxlclNlcnZpY2UoKTtcclxuICBjb25zdCBjb25maWdGYWN0b3J5UHJvdmlkZXIgPSBuZXcgQ29uZmlndXJhdGlvbkZhY3RvcnlQcm92aWRlckltcGwocHJlY2VkZW5jZUhhbmRsZXIpO1xyXG4gIGNvbnN0IGF3c0xvYWRlciA9IG5ldyBBd3NDb25maWd1cmF0aW9uTG9hZGVyU2VydmljZShvcHRpb25zKTtcclxuICBjb25zdCBuYW1lc3BhY2VIYW5kbGVyID0gbmV3IE5hbWVzcGFjZUhhbmRsZXJTZXJ2aWNlKCk7XHJcbiAgY29uc3QgdmFsaWRhdGlvblNlcnZpY2UgPSBuZXcgVmFsaWRhdGlvbkludGVncmF0aW9uU2VydmljZSgpO1xyXG4gIGNvbnN0IGZhY3RvcnlSZWdpc3RyYXRpb24gPSBuZXcgRmFjdG9yeVJlZ2lzdHJhdGlvblNlcnZpY2UoXHJcbiAgICBjb25maWdGYWN0b3J5UHJvdmlkZXIsXHJcbiAgICBhd3NMb2FkZXIsXHJcbiAgICBuYW1lc3BhY2VIYW5kbGVyLFxyXG4gICAgdmFsaWRhdGlvblNlcnZpY2UsXHJcbiAgICBvcHRpb25zXHJcbiAgKTtcclxuICBjb25zdCBhc3luY0hlbHBlciA9IG5ldyBBc3luY0NvbmZpZ0hlbHBlclNlcnZpY2UoZmFjdG9yeVJlZ2lzdHJhdGlvbiwgb3B0aW9ucyk7XHJcblxyXG4gIC8vIENyZWF0ZSBhbmQgcmV0dXJuIHRoZSBuYW1lc3BhY2VkIGZhY3Rvcmllc1xyXG4gIHJldHVybiBhd2FpdCBhc3luY0hlbHBlci5jcmVhdGVBc3luY05hbWVzcGFjZWRGYWN0b3JpZXMobmFtZXNwYWNlcyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgZW5oYW5jZWQgQ29uZmlnTW9kdWxlIG9wdGlvbnMgd2l0aCBBV1MgaW50ZWdyYXRpb24uXHJcbiAqIFRoaXMgZnVuY3Rpb24gZW5oYW5jZXMgZXhpc3RpbmcgQ29uZmlnTW9kdWxlIG9wdGlvbnMgd2l0aCBBV1Mtc291cmNlZCBjb25maWd1cmF0aW9uLlxyXG4gKiBcclxuICogQHBhcmFtIGJhc2VPcHRpb25zIC0gQmFzZSBDb25maWdNb2R1bGUgb3B0aW9ucyB0byBlbmhhbmNlXHJcbiAqIEBwYXJhbSBpbnRlZ3JhdGlvbk9wdGlvbnMgLSBJbnRlZ3JhdGlvbiBvcHRpb25zIGZvciBBV1MgY29uZmlndXJhdGlvblxyXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBlbmhhbmNlZCBDb25maWdNb2R1bGUgb3B0aW9uc1xyXG4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUVuaGFuY2VkQ29uZmlnT3B0aW9ucyhcclxuICBiYXNlT3B0aW9uczogQ29uZmlnTW9kdWxlT3B0aW9ucyA9IHt9LFxyXG4gIGludGVncmF0aW9uT3B0aW9uczogSW50ZWdyYXRpb25PcHRpb25zID0ge31cclxuKTogUHJvbWlzZTxDb25maWdNb2R1bGVPcHRpb25zPiB7XHJcbiAgLy8gSW1wb3J0IHNlcnZpY2VzIGR5bmFtaWNhbGx5XHJcbiAgY29uc3QgeyBBc3luY0NvbmZpZ0hlbHBlclNlcnZpY2UgfSA9IGF3YWl0IGltcG9ydCgnLi4vc2VydmljZXMvYXN5bmMtY29uZmlnLWhlbHBlci5zZXJ2aWNlJyk7XHJcbiAgY29uc3QgeyBGYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZSB9ID0gYXdhaXQgaW1wb3J0KCcuLi9zZXJ2aWNlcy9mYWN0b3J5LXJlZ2lzdHJhdGlvbi5zZXJ2aWNlJyk7XHJcbiAgY29uc3QgeyBDb25maWd1cmF0aW9uRmFjdG9yeVByb3ZpZGVySW1wbCB9ID0gYXdhaXQgaW1wb3J0KCcuLi9wcm92aWRlcnMvY29uZmlndXJhdGlvbi1mYWN0b3J5LnByb3ZpZGVyJyk7XHJcbiAgY29uc3QgeyBBd3NDb25maWd1cmF0aW9uTG9hZGVyU2VydmljZSB9ID0gYXdhaXQgaW1wb3J0KCcuLi9wcm92aWRlcnMvYXdzLWNvbmZpZ3VyYXRpb24tbG9hZGVyLnNlcnZpY2UnKTtcclxuICBjb25zdCB7IFByZWNlZGVuY2VIYW5kbGVyU2VydmljZSB9ID0gYXdhaXQgaW1wb3J0KCcuLi9zZXJ2aWNlcy9wcmVjZWRlbmNlLWhhbmRsZXIuc2VydmljZScpO1xyXG4gIGNvbnN0IHsgTmFtZXNwYWNlSGFuZGxlclNlcnZpY2UgfSA9IGF3YWl0IGltcG9ydCgnLi4vc2VydmljZXMvbmFtZXNwYWNlLWhhbmRsZXIuc2VydmljZScpO1xyXG4gIGNvbnN0IHsgVmFsaWRhdGlvbkludGVncmF0aW9uU2VydmljZSB9ID0gYXdhaXQgaW1wb3J0KCcuLi9zZXJ2aWNlcy92YWxpZGF0aW9uLWludGVncmF0aW9uLnNlcnZpY2UnKTtcclxuXHJcbiAgLy8gQ3JlYXRlIHNlcnZpY2UgaW5zdGFuY2VzXHJcbiAgY29uc3QgcHJlY2VkZW5jZUhhbmRsZXIgPSBuZXcgUHJlY2VkZW5jZUhhbmRsZXJTZXJ2aWNlKCk7XHJcbiAgY29uc3QgY29uZmlnRmFjdG9yeVByb3ZpZGVyID0gbmV3IENvbmZpZ3VyYXRpb25GYWN0b3J5UHJvdmlkZXJJbXBsKHByZWNlZGVuY2VIYW5kbGVyKTtcclxuICBjb25zdCBhd3NMb2FkZXIgPSBuZXcgQXdzQ29uZmlndXJhdGlvbkxvYWRlclNlcnZpY2UoaW50ZWdyYXRpb25PcHRpb25zKTtcclxuICBjb25zdCBuYW1lc3BhY2VIYW5kbGVyID0gbmV3IE5hbWVzcGFjZUhhbmRsZXJTZXJ2aWNlKCk7XHJcbiAgY29uc3QgdmFsaWRhdGlvblNlcnZpY2UgPSBuZXcgVmFsaWRhdGlvbkludGVncmF0aW9uU2VydmljZSgpO1xyXG4gIGNvbnN0IGZhY3RvcnlSZWdpc3RyYXRpb24gPSBuZXcgRmFjdG9yeVJlZ2lzdHJhdGlvblNlcnZpY2UoXHJcbiAgICBjb25maWdGYWN0b3J5UHJvdmlkZXIsXHJcbiAgICBhd3NMb2FkZXIsXHJcbiAgICBuYW1lc3BhY2VIYW5kbGVyLFxyXG4gICAgdmFsaWRhdGlvblNlcnZpY2UsXHJcbiAgICBpbnRlZ3JhdGlvbk9wdGlvbnNcclxuICApO1xyXG4gIGNvbnN0IGFzeW5jSGVscGVyID0gbmV3IEFzeW5jQ29uZmlnSGVscGVyU2VydmljZShmYWN0b3J5UmVnaXN0cmF0aW9uLCBpbnRlZ3JhdGlvbk9wdGlvbnMpO1xyXG5cclxuICAvLyBDcmVhdGUgYW5kIHJldHVybiBlbmhhbmNlZCBvcHRpb25zXHJcbiAgcmV0dXJuIGF3YWl0IGFzeW5jSGVscGVyLmNyZWF0ZUFzeW5jQ29uZmlnT3B0aW9ucyhiYXNlT3B0aW9ucyk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYSBjb21wbGV0ZSBpbnRlZ3JhdGlvbiBtb2R1bGUgZm9yIHVzZSB3aXRoIEBuZXN0anMvY29uZmlnLlxyXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBtb2R1bGUgdGhhdCBjYW4gYmUgaW1wb3J0ZWQgYWxvbmdzaWRlIENvbmZpZ01vZHVsZS5cclxuICogXHJcbiAqIEBwYXJhbSBvcHRpb25zIC0gSW50ZWdyYXRpb24gb3B0aW9ucyBmb3IgQVdTIGNvbmZpZ3VyYXRpb25cclxuICogQHJldHVybnMgRHluYW1pYyBtb2R1bGUgZm9yIEFXUyBpbnRlZ3JhdGlvblxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF3c0ludGVncmF0aW9uTW9kdWxlKG9wdGlvbnM6IEludGVncmF0aW9uT3B0aW9ucyA9IHt9KTogRHluYW1pY01vZHVsZSB7XHJcbiAgcmV0dXJuIE5lc3RDb25maWdBd3NJbnRlZ3JhdGlvbk1vZHVsZS5mb3JSb290KG9wdGlvbnMpO1xyXG59XHJcblxyXG4vKipcclxuICogQ3JlYXRlIGFuIGFzeW5jIGludGVncmF0aW9uIG1vZHVsZSBmb3IgdXNlIHdpdGggQG5lc3Rqcy9jb25maWcuXHJcbiAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG1vZHVsZSB0aGF0IGNhbiBiZSBpbXBvcnRlZCBhbG9uZ3NpZGUgQ29uZmlnTW9kdWxlIGZvciBhc3luYyBzY2VuYXJpb3MuXHJcbiAqIFxyXG4gKiBAcGFyYW0gdXNlRmFjdG9yeSAtIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIGludGVncmF0aW9uIG9wdGlvbnNcclxuICogQHBhcmFtIGluamVjdCAtIERlcGVuZGVuY2llcyB0byBpbmplY3QgaW50byB0aGUgZmFjdG9yeSBmdW5jdGlvblxyXG4gKiBAcGFyYW0gaW1wb3J0cyAtIE1vZHVsZXMgdG8gaW1wb3J0IGZvciB0aGUgZmFjdG9yeSBmdW5jdGlvblxyXG4gKiBAcmV0dXJucyBEeW5hbWljIG1vZHVsZSBmb3IgYXN5bmMgQVdTIGludGVncmF0aW9uXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXN5bmNBd3NJbnRlZ3JhdGlvbk1vZHVsZShcclxuICB1c2VGYWN0b3J5OiAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8SW50ZWdyYXRpb25PcHRpb25zPiB8IEludGVncmF0aW9uT3B0aW9ucyxcclxuICBpbmplY3Q6IGFueVtdID0gW10sXHJcbiAgaW1wb3J0czogYW55W10gPSBbXVxyXG4pOiBEeW5hbWljTW9kdWxlIHtcclxuICByZXR1cm4gTmVzdENvbmZpZ0F3c0ludGVncmF0aW9uTW9kdWxlLmZvclJvb3RBc3luYyh7XHJcbiAgICB1c2VGYWN0b3J5LFxyXG4gICAgaW5qZWN0LFxyXG4gICAgaW1wb3J0cyxcclxuICB9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB3aXRoIENvbmZpZ01vZHVsZS5mb3JSb290KCkuXHJcbiAqIFRoaXMgZmFjdG9yeSBmdW5jdGlvbiBsb2FkcyBBV1MgY29uZmlndXJhdGlvbiBhbmQgbWVyZ2VzIGl0IHdpdGggbG9jYWwgY29uZmlndXJhdGlvbi5cclxuICogXHJcbiAqIEBwYXJhbSBpbnRlZ3JhdGlvbk9wdGlvbnMgLSBJbnRlZ3JhdGlvbiBvcHRpb25zIGZvciBBV1MgY29uZmlndXJhdGlvblxyXG4gKiBAcmV0dXJucyBGYWN0b3J5IGZ1bmN0aW9uIGZvciB1c2Ugd2l0aCBDb25maWdNb2R1bGVcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb25maWdNb2R1bGVGYWN0b3J5KFxyXG4gIGludGVncmF0aW9uT3B0aW9uczogSW50ZWdyYXRpb25PcHRpb25zID0ge31cclxuKTogKCkgPT4gUHJvbWlzZTxDb25maWdNb2R1bGVPcHRpb25zPiB7XHJcbiAgcmV0dXJuIGFzeW5jICgpOiBQcm9taXNlPENvbmZpZ01vZHVsZU9wdGlvbnM+ID0+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIENyZWF0ZSBBV1MgY29uZmlndXJhdGlvbiBmYWN0b3J5XHJcbiAgICAgIGNvbnN0IGF3c0ZhY3RvcnkgPSBhd2FpdCBjcmVhdGVBd3NDb25maWdGYWN0b3J5KGludGVncmF0aW9uT3B0aW9ucyk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBSZXR1cm4gQ29uZmlnTW9kdWxlIG9wdGlvbnMgd2l0aCBBV1MgZmFjdG9yeVxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGxvYWQ6IFthd3NGYWN0b3J5XSxcclxuICAgICAgICBpc0dsb2JhbDogaW50ZWdyYXRpb25PcHRpb25zLnJlZ2lzdGVyR2xvYmFsbHkgPz8gdHJ1ZSxcclxuICAgICAgICBjYWNoZTogaW50ZWdyYXRpb25PcHRpb25zLmZhY3RvcnlPcHRpb25zPy5jYWNoZSA/PyB0cnVlLFxyXG4gICAgICAgIGV4cGFuZFZhcmlhYmxlczogaW50ZWdyYXRpb25PcHRpb25zLmZhY3RvcnlPcHRpb25zPy5leHBhbmRWYXJpYWJsZXMgPz8gdHJ1ZSxcclxuICAgICAgfTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIEhhbmRsZSBlcnJvciBiYXNlZCBvbiBpbnRlZ3JhdGlvbiBvcHRpb25zXHJcbiAgICAgIGlmIChpbnRlZ3JhdGlvbk9wdGlvbnMuZmFpbE9uQXdzRXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gUmV0dXJuIGJhc2ljIG9wdGlvbnMgYXMgZmFsbGJhY2tcclxuICAgICAgaWYgKGludGVncmF0aW9uT3B0aW9ucy5mYWxsYmFja1RvTG9jYWwpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgbG9hZDogW10sXHJcbiAgICAgICAgICBpc0dsb2JhbDogaW50ZWdyYXRpb25PcHRpb25zLnJlZ2lzdGVyR2xvYmFsbHkgPz8gdHJ1ZSxcclxuICAgICAgICAgIGNhY2hlOiBpbnRlZ3JhdGlvbk9wdGlvbnMuZmFjdG9yeU9wdGlvbnM/LmNhY2hlID8/IHRydWUsXHJcbiAgICAgICAgICBleHBhbmRWYXJpYWJsZXM6IGludGVncmF0aW9uT3B0aW9ucy5mYWN0b3J5T3B0aW9ucz8uZXhwYW5kVmFyaWFibGVzID8/IHRydWUsXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICB9XHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZSBhIGZhY3RvcnkgZnVuY3Rpb24gd2l0aCBkZXBlbmRlbmN5IGluamVjdGlvbiBzdXBwb3J0LlxyXG4gKiBUaGlzIGZhY3RvcnkgZnVuY3Rpb24gY2FuIHJlY2VpdmUgaW5qZWN0ZWQgZGVwZW5kZW5jaWVzIGFuZCB1c2UgdGhlbSB0byBjb25maWd1cmUgQVdTIGludGVncmF0aW9uLlxyXG4gKiBcclxuICogQHBhcmFtIGludGVncmF0aW9uT3B0aW9ucyAtIEludGVncmF0aW9uIG9wdGlvbnMgZm9yIEFXUyBjb25maWd1cmF0aW9uXHJcbiAqIEBwYXJhbSBkZXBlbmRlbmNpZXMgLSBBcnJheSBvZiBkZXBlbmRlbmN5IHRva2VucyB0byBpbmplY3RcclxuICogQHJldHVybnMgRmFjdG9yeSBmdW5jdGlvbiB3aXRoIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN1cHBvcnRcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb25maWdNb2R1bGVGYWN0b3J5V2l0aERlcGVuZGVuY2llcyhcclxuICBpbnRlZ3JhdGlvbk9wdGlvbnM6IEludGVncmF0aW9uT3B0aW9ucyA9IHt9LFxyXG4gIGRlcGVuZGVuY2llczogYW55W10gPSBbXVxyXG4pOiAoLi4uYXJnczogYW55W10pID0+IFByb21pc2U8Q29uZmlnTW9kdWxlT3B0aW9ucz4ge1xyXG4gIHJldHVybiBhc3luYyAoLi4uaW5qZWN0ZWREZXBlbmRlbmNpZXM6IGFueVtdKTogUHJvbWlzZTxDb25maWdNb2R1bGVPcHRpb25zPiA9PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBJbXBvcnQgc2VydmljZXMgZHluYW1pY2FsbHlcclxuICAgICAgY29uc3QgeyBBc3luY0NvbmZpZ0hlbHBlclNlcnZpY2UgfSA9IGF3YWl0IGltcG9ydCgnLi4vc2VydmljZXMvYXN5bmMtY29uZmlnLWhlbHBlci5zZXJ2aWNlJyk7XHJcbiAgICAgIGNvbnN0IHsgRmFjdG9yeVJlZ2lzdHJhdGlvblNlcnZpY2UgfSA9IGF3YWl0IGltcG9ydCgnLi4vc2VydmljZXMvZmFjdG9yeS1yZWdpc3RyYXRpb24uc2VydmljZScpO1xyXG4gICAgICBjb25zdCB7IENvbmZpZ3VyYXRpb25GYWN0b3J5UHJvdmlkZXJJbXBsIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3Byb3ZpZGVycy9jb25maWd1cmF0aW9uLWZhY3RvcnkucHJvdmlkZXInKTtcclxuICAgICAgY29uc3QgeyBBd3NDb25maWd1cmF0aW9uTG9hZGVyU2VydmljZSB9ID0gYXdhaXQgaW1wb3J0KCcuLi9wcm92aWRlcnMvYXdzLWNvbmZpZ3VyYXRpb24tbG9hZGVyLnNlcnZpY2UnKTtcclxuICAgICAgY29uc3QgeyBQcmVjZWRlbmNlSGFuZGxlclNlcnZpY2UgfSA9IGF3YWl0IGltcG9ydCgnLi4vc2VydmljZXMvcHJlY2VkZW5jZS1oYW5kbGVyLnNlcnZpY2UnKTtcclxuICAgICAgY29uc3QgeyBOYW1lc3BhY2VIYW5kbGVyU2VydmljZSB9ID0gYXdhaXQgaW1wb3J0KCcuLi9zZXJ2aWNlcy9uYW1lc3BhY2UtaGFuZGxlci5zZXJ2aWNlJyk7XHJcbiAgICAgIGNvbnN0IHsgVmFsaWRhdGlvbkludGVncmF0aW9uU2VydmljZSB9ID0gYXdhaXQgaW1wb3J0KCcuLi9zZXJ2aWNlcy92YWxpZGF0aW9uLWludGVncmF0aW9uLnNlcnZpY2UnKTtcclxuXHJcbiAgICAgIC8vIENyZWF0ZSBzZXJ2aWNlIGluc3RhbmNlc1xyXG4gICAgICBjb25zdCBwcmVjZWRlbmNlSGFuZGxlciA9IG5ldyBQcmVjZWRlbmNlSGFuZGxlclNlcnZpY2UoKTtcclxuICAgICAgY29uc3QgY29uZmlnRmFjdG9yeVByb3ZpZGVyID0gbmV3IENvbmZpZ3VyYXRpb25GYWN0b3J5UHJvdmlkZXJJbXBsKHByZWNlZGVuY2VIYW5kbGVyKTtcclxuICAgICAgY29uc3QgYXdzTG9hZGVyID0gbmV3IEF3c0NvbmZpZ3VyYXRpb25Mb2FkZXJTZXJ2aWNlKGludGVncmF0aW9uT3B0aW9ucyk7XHJcbiAgICAgIGNvbnN0IG5hbWVzcGFjZUhhbmRsZXIgPSBuZXcgTmFtZXNwYWNlSGFuZGxlclNlcnZpY2UoKTtcclxuICAgICAgY29uc3QgdmFsaWRhdGlvblNlcnZpY2UgPSBuZXcgVmFsaWRhdGlvbkludGVncmF0aW9uU2VydmljZSgpO1xyXG4gICAgICBjb25zdCBmYWN0b3J5UmVnaXN0cmF0aW9uID0gbmV3IEZhY3RvcnlSZWdpc3RyYXRpb25TZXJ2aWNlKFxyXG4gICAgICAgIGNvbmZpZ0ZhY3RvcnlQcm92aWRlcixcclxuICAgICAgICBhd3NMb2FkZXIsXHJcbiAgICAgICAgbmFtZXNwYWNlSGFuZGxlcixcclxuICAgICAgICB2YWxpZGF0aW9uU2VydmljZSxcclxuICAgICAgICBpbnRlZ3JhdGlvbk9wdGlvbnNcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgYXN5bmNIZWxwZXIgPSBuZXcgQXN5bmNDb25maWdIZWxwZXJTZXJ2aWNlKGZhY3RvcnlSZWdpc3RyYXRpb24sIGludGVncmF0aW9uT3B0aW9ucyk7XHJcblxyXG4gICAgICAvLyBDcmVhdGUgZmFjdG9yeSB3aXRoIGRlcGVuZGVuY2llc1xyXG4gICAgICBjb25zdCBmYWN0b3J5V2l0aERlcHMgPSBhc3luY0hlbHBlci5jcmVhdGVBc3luY0ZhY3RvcnlXaXRoRGVwZW5kZW5jaWVzKGRlcGVuZGVuY2llcyk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBFeGVjdXRlIGZhY3Rvcnkgd2l0aCBpbmplY3RlZCBkZXBlbmRlbmNpZXNcclxuICAgICAgcmV0dXJuIGF3YWl0IGZhY3RvcnlXaXRoRGVwcyguLi5pbmplY3RlZERlcGVuZGVuY2llcyk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAvLyBIYW5kbGUgZXJyb3IgYmFzZWQgb24gaW50ZWdyYXRpb24gb3B0aW9uc1xyXG4gICAgICBpZiAoaW50ZWdyYXRpb25PcHRpb25zLmZhaWxPbkF3c0Vycm9yKSB7XHJcbiAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIC8vIFJldHVybiBiYXNpYyBvcHRpb25zIGFzIGZhbGxiYWNrXHJcbiAgICAgIGlmIChpbnRlZ3JhdGlvbk9wdGlvbnMuZmFsbGJhY2tUb0xvY2FsKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGxvYWQ6IFtdLFxyXG4gICAgICAgICAgaXNHbG9iYWw6IGludGVncmF0aW9uT3B0aW9ucy5yZWdpc3Rlckdsb2JhbGx5ID8/IHRydWUsXHJcbiAgICAgICAgICBjYWNoZTogaW50ZWdyYXRpb25PcHRpb25zLmZhY3RvcnlPcHRpb25zPy5jYWNoZSA/PyB0cnVlLFxyXG4gICAgICAgICAgZXhwYW5kVmFyaWFibGVzOiBpbnRlZ3JhdGlvbk9wdGlvbnMuZmFjdG9yeU9wdGlvbnM/LmV4cGFuZFZhcmlhYmxlcyA/PyB0cnVlLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHRocm93IGVycm9yO1xyXG4gICAgfVxyXG4gIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiBBV1MgY29uZmlndXJhdGlvbiBpcyBhdmFpbGFibGUgZm9yIGludGVncmF0aW9uLlxyXG4gKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZiBBV1MgaW50ZWdyYXRpb24gc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAqIFxyXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEludGVncmF0aW9uIG9wdGlvbnMgZm9yIEFXUyBjb25maWd1cmF0aW9uXHJcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGF2YWlsYWJpbGl0eSBzdGF0dXNcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0F3c0NvbmZpZ0F2YWlsYWJpbGl0eShcclxuICBvcHRpb25zOiBJbnRlZ3JhdGlvbk9wdGlvbnMgPSB7fVxyXG4pOiBQcm9taXNlPHtcclxuICBpc0F2YWlsYWJsZTogYm9vbGVhbjtcclxuICBmYWN0b3JpZXNDb3VudDogbnVtYmVyO1xyXG4gIGVycm9yczogc3RyaW5nW107XHJcbn0+IHtcclxuICB0cnkge1xyXG4gICAgLy8gSW1wb3J0IHNlcnZpY2VzIGR5bmFtaWNhbGx5XHJcbiAgICBjb25zdCB7IEFzeW5jQ29uZmlnSGVscGVyU2VydmljZSB9ID0gYXdhaXQgaW1wb3J0KCcuLi9zZXJ2aWNlcy9hc3luYy1jb25maWctaGVscGVyLnNlcnZpY2UnKTtcclxuICAgIGNvbnN0IHsgRmFjdG9yeVJlZ2lzdHJhdGlvblNlcnZpY2UgfSA9IGF3YWl0IGltcG9ydCgnLi4vc2VydmljZXMvZmFjdG9yeS1yZWdpc3RyYXRpb24uc2VydmljZScpO1xyXG4gICAgY29uc3QgeyBDb25maWd1cmF0aW9uRmFjdG9yeVByb3ZpZGVySW1wbCB9ID0gYXdhaXQgaW1wb3J0KCcuLi9wcm92aWRlcnMvY29uZmlndXJhdGlvbi1mYWN0b3J5LnByb3ZpZGVyJyk7XHJcbiAgICBjb25zdCB7IEF3c0NvbmZpZ3VyYXRpb25Mb2FkZXJTZXJ2aWNlIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3Byb3ZpZGVycy9hd3MtY29uZmlndXJhdGlvbi1sb2FkZXIuc2VydmljZScpO1xyXG4gICAgY29uc3QgeyBQcmVjZWRlbmNlSGFuZGxlclNlcnZpY2UgfSA9IGF3YWl0IGltcG9ydCgnLi4vc2VydmljZXMvcHJlY2VkZW5jZS1oYW5kbGVyLnNlcnZpY2UnKTtcclxuICAgIGNvbnN0IHsgTmFtZXNwYWNlSGFuZGxlclNlcnZpY2UgfSA9IGF3YWl0IGltcG9ydCgnLi4vc2VydmljZXMvbmFtZXNwYWNlLWhhbmRsZXIuc2VydmljZScpO1xyXG4gICAgY29uc3QgeyBWYWxpZGF0aW9uSW50ZWdyYXRpb25TZXJ2aWNlIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24taW50ZWdyYXRpb24uc2VydmljZScpO1xyXG5cclxuICAgIC8vIENyZWF0ZSBzZXJ2aWNlIGluc3RhbmNlc1xyXG4gICAgY29uc3QgcHJlY2VkZW5jZUhhbmRsZXIgPSBuZXcgUHJlY2VkZW5jZUhhbmRsZXJTZXJ2aWNlKCk7XHJcbiAgICBjb25zdCBjb25maWdGYWN0b3J5UHJvdmlkZXIgPSBuZXcgQ29uZmlndXJhdGlvbkZhY3RvcnlQcm92aWRlckltcGwocHJlY2VkZW5jZUhhbmRsZXIpO1xyXG4gICAgY29uc3QgYXdzTG9hZGVyID0gbmV3IEF3c0NvbmZpZ3VyYXRpb25Mb2FkZXJTZXJ2aWNlKG9wdGlvbnMpO1xyXG4gICAgY29uc3QgbmFtZXNwYWNlSGFuZGxlciA9IG5ldyBOYW1lc3BhY2VIYW5kbGVyU2VydmljZSgpO1xyXG4gICAgY29uc3QgdmFsaWRhdGlvblNlcnZpY2UgPSBuZXcgVmFsaWRhdGlvbkludGVncmF0aW9uU2VydmljZSgpO1xyXG4gICAgY29uc3QgZmFjdG9yeVJlZ2lzdHJhdGlvbiA9IG5ldyBGYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZShcclxuICAgICAgY29uZmlnRmFjdG9yeVByb3ZpZGVyLFxyXG4gICAgICBhd3NMb2FkZXIsXHJcbiAgICAgIG5hbWVzcGFjZUhhbmRsZXIsXHJcbiAgICAgIHZhbGlkYXRpb25TZXJ2aWNlLFxyXG4gICAgICBvcHRpb25zXHJcbiAgICApO1xyXG4gICAgY29uc3QgYXN5bmNIZWxwZXIgPSBuZXcgQXN5bmNDb25maWdIZWxwZXJTZXJ2aWNlKGZhY3RvcnlSZWdpc3RyYXRpb24sIG9wdGlvbnMpO1xyXG5cclxuICAgIC8vIENoZWNrIGF2YWlsYWJpbGl0eVxyXG4gICAgcmV0dXJuIGF3YWl0IGFzeW5jSGVscGVyLmNoZWNrQXN5bmNBdmFpbGFiaWxpdHkoKTtcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgY29uc3QgYXZhaWxhYmlsaXR5RXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XHJcbiAgICBcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGlzQXZhaWxhYmxlOiBmYWxzZSxcclxuICAgICAgZmFjdG9yaWVzQ291bnQ6IDAsXHJcbiAgICAgIGVycm9yczogW2F2YWlsYWJpbGl0eUVycm9yLm1lc3NhZ2VdLFxyXG4gICAgfTtcclxuICB9XHJcbn0iXX0=
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
// Integration utilities exports
|
|
2
|
-
export * from './config-integration.util';
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvaW50ZWdyYXRpb24vdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0NBQWdDO0FBQ2hDLGNBQWMsMkJBQTJCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbnRlZ3JhdGlvbiB1dGlsaXRpZXMgZXhwb3J0c1xyXG5leHBvcnQgKiBmcm9tICcuL2NvbmZpZy1pbnRlZ3JhdGlvbi51dGlsJzsiXX0=
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Abstract ConfigService interface for dependency injection.
|
|
3
|
-
* Provides type-safe access to configuration values with generic type support.
|
|
4
|
-
*/
|
|
5
|
-
export class ConfigService {
|
|
6
|
-
}
|
|
7
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLXNlcnZpY2UuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvY29uZmlnLXNlcnZpY2UuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE1BQU0sT0FBZ0IsYUFBYTtDQW1CbEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQWJzdHJhY3QgQ29uZmlnU2VydmljZSBpbnRlcmZhY2UgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxyXG4gKiBQcm92aWRlcyB0eXBlLXNhZmUgYWNjZXNzIHRvIGNvbmZpZ3VyYXRpb24gdmFsdWVzIHdpdGggZ2VuZXJpYyB0eXBlIHN1cHBvcnQuXHJcbiAqL1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29uZmlnU2VydmljZTxUID0gYW55PiB7XHJcbiAgLyoqXHJcbiAgICogR2V0IGEgY29uZmlndXJhdGlvbiB2YWx1ZSBieSBrZXkgd2l0aCB0eXBlIHNhZmV0eS5cclxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIGNvbmZpZ3VyYXRpb24ga2V5IHRvIHJldHJpZXZlXHJcbiAgICogQHJldHVybnMgVGhlIGNvbmZpZ3VyYXRpb24gdmFsdWUgd2l0aCBwcm9wZXIgdHlwaW5nXHJcbiAgICovXHJcbiAgYWJzdHJhY3QgZ2V0PEsgZXh0ZW5kcyBrZXlvZiBUPihrZXk6IEspOiBUW0tdO1xyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiB0aGUgY29uZmlndXJhdGlvbiBzZXJ2aWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLlxyXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHNlcnZpY2UgaXMgcmVhZHkgdG8gc2VydmUgY29uZmlndXJhdGlvbiB2YWx1ZXNcclxuICAgKi9cclxuICBhYnN0cmFjdCBpc0luaXRpYWxpemVkKCk6IGJvb2xlYW47XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhbGwgY29uZmlndXJhdGlvbiB2YWx1ZXMuXHJcbiAgICogQHJldHVybnMgVGhlIGNvbXBsZXRlIGNvbmZpZ3VyYXRpb24gb2JqZWN0XHJcbiAgICovXHJcbiAgYWJzdHJhY3QgZ2V0QWxsKCk6IFQ7XHJcbn1cclxuIl19
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
/**
|
|
3
|
-
* Default configuration schema using Zod.
|
|
4
|
-
* Provides a flexible base schema that can be extended by applications.
|
|
5
|
-
*/
|
|
6
|
-
export const defaultConfigSchema = z.object({
|
|
7
|
-
/** Node.js environment */
|
|
8
|
-
NODE_ENV: z.enum(['production', 'development', 'test']).optional(),
|
|
9
|
-
/** Application environment (mirrors NODE_ENV with 'local' default) */
|
|
10
|
-
APP_ENV: z.enum(['production', 'test', 'development', 'local']).default('local'),
|
|
11
|
-
/** AWS region for services */
|
|
12
|
-
AWS_REGION: z.string().optional(),
|
|
13
|
-
/** AWS profile for local development */
|
|
14
|
-
AWS_PROFILE: z.string().optional(),
|
|
15
|
-
/** Application port */
|
|
16
|
-
PORT: z.coerce.number().positive().optional(),
|
|
17
|
-
/** Application host */
|
|
18
|
-
HOST: z.string().optional(),
|
|
19
|
-
/** Log level */
|
|
20
|
-
LOG_LEVEL: z.enum(['error', 'warn', 'info', 'debug', 'verbose']).optional(),
|
|
21
|
-
/** Database URL */
|
|
22
|
-
DATABASE_URL: z.string().url().optional(),
|
|
23
|
-
/** Redis URL */
|
|
24
|
-
REDIS_URL: z.string().url().optional(),
|
|
25
|
-
});
|
|
26
|
-
/**
|
|
27
|
-
* Environment-specific validation schemas.
|
|
28
|
-
*/
|
|
29
|
-
export const environmentSchemas = {
|
|
30
|
-
local: defaultConfigSchema.extend({
|
|
31
|
-
// Local environment may have fewer required fields
|
|
32
|
-
AWS_REGION: z.string().optional(),
|
|
33
|
-
}),
|
|
34
|
-
development: defaultConfigSchema.extend({
|
|
35
|
-
// Development environment requirements
|
|
36
|
-
AWS_REGION: z.string().min(1, 'AWS_REGION is required in development'),
|
|
37
|
-
}),
|
|
38
|
-
test: defaultConfigSchema.extend({
|
|
39
|
-
// Test environment requirements
|
|
40
|
-
AWS_REGION: z.string().min(1, 'AWS_REGION is required in test'),
|
|
41
|
-
}),
|
|
42
|
-
production: defaultConfigSchema.extend({
|
|
43
|
-
// Production environment requirements
|
|
44
|
-
AWS_REGION: z.string().min(1, 'AWS_REGION is required in production'),
|
|
45
|
-
LOG_LEVEL: z.enum(['error', 'warn', 'info']).default('info'),
|
|
46
|
-
}),
|
|
47
|
-
};
|
|
48
|
-
/**
|
|
49
|
-
* Helper function to get the appropriate schema for the current environment.
|
|
50
|
-
*/
|
|
51
|
-
export function getSchemaForEnvironment(appEnv) {
|
|
52
|
-
const env = appEnv;
|
|
53
|
-
return environmentSchemas[env] || defaultConfigSchema;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Validation helper for APP_ENV values.
|
|
57
|
-
*/
|
|
58
|
-
export const appEnvSchema = z.enum(['production', 'test', 'development', 'local']);
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1zY2hlbWEuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvZGVmYXVsdC1zY2hlbWEuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEI7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMxQywwQkFBMEI7SUFDMUIsUUFBUSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBRWxFLHNFQUFzRTtJQUN0RSxPQUFPLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUVoRiw4QkFBOEI7SUFDOUIsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFFakMsd0NBQXdDO0lBQ3hDLFdBQVcsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBRWxDLHVCQUF1QjtJQUN2QixJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFFN0MsdUJBQXVCO0lBQ3ZCLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBRTNCLGdCQUFnQjtJQUNoQixTQUFTLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUUzRSxtQkFBbUI7SUFDbkIsWUFBWSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFFekMsZ0JBQWdCO0lBQ2hCLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ3ZDLENBQUMsQ0FBQztBQU9IOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDaEMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLE1BQU0sQ0FBQztRQUNoQyxtREFBbUQ7UUFDbkQsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7S0FDbEMsQ0FBQztJQUVGLFdBQVcsRUFBRSxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7UUFDdEMsdUNBQXVDO1FBQ3ZDLFVBQVUsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSx1Q0FBdUMsQ0FBQztLQUN2RSxDQUFDO0lBRUYsSUFBSSxFQUFFLG1CQUFtQixDQUFDLE1BQU0sQ0FBQztRQUMvQixnQ0FBZ0M7UUFDaEMsVUFBVSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGdDQUFnQyxDQUFDO0tBQ2hFLENBQUM7SUFFRixVQUFVLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxDQUFDO1FBQ3JDLHNDQUFzQztRQUN0QyxVQUFVLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsc0NBQXNDLENBQUM7UUFDckUsU0FBUyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztLQUM3RCxDQUFDO0NBQ0gsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE1BQWM7SUFDcEQsTUFBTSxHQUFHLEdBQUcsTUFBeUMsQ0FBQztJQUN0RCxPQUFPLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLG1CQUFtQixDQUFDO0FBQ3hELENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xyXG5cclxuLyoqXHJcbiAqIERlZmF1bHQgY29uZmlndXJhdGlvbiBzY2hlbWEgdXNpbmcgWm9kLlxyXG4gKiBQcm92aWRlcyBhIGZsZXhpYmxlIGJhc2Ugc2NoZW1hIHRoYXQgY2FuIGJlIGV4dGVuZGVkIGJ5IGFwcGxpY2F0aW9ucy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29uZmlnU2NoZW1hID0gei5vYmplY3Qoe1xyXG4gIC8qKiBOb2RlLmpzIGVudmlyb25tZW50ICovXHJcbiAgTk9ERV9FTlY6IHouZW51bShbJ3Byb2R1Y3Rpb24nLCAnZGV2ZWxvcG1lbnQnLCAndGVzdCddKS5vcHRpb25hbCgpLFxyXG4gIFxyXG4gIC8qKiBBcHBsaWNhdGlvbiBlbnZpcm9ubWVudCAobWlycm9ycyBOT0RFX0VOViB3aXRoICdsb2NhbCcgZGVmYXVsdCkgKi9cclxuICBBUFBfRU5WOiB6LmVudW0oWydwcm9kdWN0aW9uJywgJ3Rlc3QnLCAnZGV2ZWxvcG1lbnQnLCAnbG9jYWwnXSkuZGVmYXVsdCgnbG9jYWwnKSxcclxuICBcclxuICAvKiogQVdTIHJlZ2lvbiBmb3Igc2VydmljZXMgKi9cclxuICBBV1NfUkVHSU9OOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXHJcbiAgXHJcbiAgLyoqIEFXUyBwcm9maWxlIGZvciBsb2NhbCBkZXZlbG9wbWVudCAqL1xyXG4gIEFXU19QUk9GSUxFOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXHJcbiAgXHJcbiAgLyoqIEFwcGxpY2F0aW9uIHBvcnQgKi9cclxuICBQT1JUOiB6LmNvZXJjZS5udW1iZXIoKS5wb3NpdGl2ZSgpLm9wdGlvbmFsKCksXHJcbiAgXHJcbiAgLyoqIEFwcGxpY2F0aW9uIGhvc3QgKi9cclxuICBIT1NUOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXHJcbiAgXHJcbiAgLyoqIExvZyBsZXZlbCAqL1xyXG4gIExPR19MRVZFTDogei5lbnVtKFsnZXJyb3InLCAnd2FybicsICdpbmZvJywgJ2RlYnVnJywgJ3ZlcmJvc2UnXSkub3B0aW9uYWwoKSxcclxuICBcclxuICAvKiogRGF0YWJhc2UgVVJMICovXHJcbiAgREFUQUJBU0VfVVJMOiB6LnN0cmluZygpLnVybCgpLm9wdGlvbmFsKCksXHJcbiAgXHJcbiAgLyoqIFJlZGlzIFVSTCAqL1xyXG4gIFJFRElTX1VSTDogei5zdHJpbmcoKS51cmwoKS5vcHRpb25hbCgpLFxyXG59KTtcclxuXHJcbi8qKlxyXG4gKiBUeXBlIGluZmVyZW5jZSBmb3IgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBzY2hlbWEuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBEZWZhdWx0Q29uZmlnU2NoZW1hID0gei5pbmZlcjx0eXBlb2YgZGVmYXVsdENvbmZpZ1NjaGVtYT47XHJcblxyXG4vKipcclxuICogRW52aXJvbm1lbnQtc3BlY2lmaWMgdmFsaWRhdGlvbiBzY2hlbWFzLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGVudmlyb25tZW50U2NoZW1hcyA9IHtcclxuICBsb2NhbDogZGVmYXVsdENvbmZpZ1NjaGVtYS5leHRlbmQoe1xyXG4gICAgLy8gTG9jYWwgZW52aXJvbm1lbnQgbWF5IGhhdmUgZmV3ZXIgcmVxdWlyZWQgZmllbGRzXHJcbiAgICBBV1NfUkVHSU9OOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXHJcbiAgfSksXHJcbiAgXHJcbiAgZGV2ZWxvcG1lbnQ6IGRlZmF1bHRDb25maWdTY2hlbWEuZXh0ZW5kKHtcclxuICAgIC8vIERldmVsb3BtZW50IGVudmlyb25tZW50IHJlcXVpcmVtZW50c1xyXG4gICAgQVdTX1JFR0lPTjogei5zdHJpbmcoKS5taW4oMSwgJ0FXU19SRUdJT04gaXMgcmVxdWlyZWQgaW4gZGV2ZWxvcG1lbnQnKSxcclxuICB9KSxcclxuICBcclxuICB0ZXN0OiBkZWZhdWx0Q29uZmlnU2NoZW1hLmV4dGVuZCh7XHJcbiAgICAvLyBUZXN0IGVudmlyb25tZW50IHJlcXVpcmVtZW50c1xyXG4gICAgQVdTX1JFR0lPTjogei5zdHJpbmcoKS5taW4oMSwgJ0FXU19SRUdJT04gaXMgcmVxdWlyZWQgaW4gdGVzdCcpLFxyXG4gIH0pLFxyXG4gIFxyXG4gIHByb2R1Y3Rpb246IGRlZmF1bHRDb25maWdTY2hlbWEuZXh0ZW5kKHtcclxuICAgIC8vIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQgcmVxdWlyZW1lbnRzXHJcbiAgICBBV1NfUkVHSU9OOiB6LnN0cmluZygpLm1pbigxLCAnQVdTX1JFR0lPTiBpcyByZXF1aXJlZCBpbiBwcm9kdWN0aW9uJyksXHJcbiAgICBMT0dfTEVWRUw6IHouZW51bShbJ2Vycm9yJywgJ3dhcm4nLCAnaW5mbyddKS5kZWZhdWx0KCdpbmZvJyksXHJcbiAgfSksXHJcbn07XHJcblxyXG4vKipcclxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgYXBwcm9wcmlhdGUgc2NoZW1hIGZvciB0aGUgY3VycmVudCBlbnZpcm9ubWVudC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRTY2hlbWFGb3JFbnZpcm9ubWVudChhcHBFbnY6IHN0cmluZyk6IHouWm9kU2NoZW1hIHtcclxuICBjb25zdCBlbnYgPSBhcHBFbnYgYXMga2V5b2YgdHlwZW9mIGVudmlyb25tZW50U2NoZW1hcztcclxuICByZXR1cm4gZW52aXJvbm1lbnRTY2hlbWFzW2Vudl0gfHwgZGVmYXVsdENvbmZpZ1NjaGVtYTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFZhbGlkYXRpb24gaGVscGVyIGZvciBBUFBfRU5WIHZhbHVlcy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBhcHBFbnZTY2hlbWEgPSB6LmVudW0oWydwcm9kdWN0aW9uJywgJ3Rlc3QnLCAnZGV2ZWxvcG1lbnQnLCAnbG9jYWwnXSk7XHJcblxyXG4vKipcclxuICogVHlwZSBmb3IgdmFsaWQgQVBQX0VOViB2YWx1ZXMuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBBcHBFbnYgPSB6LmluZmVyPHR5cGVvZiBhcHBFbnZTY2hlbWE+O1xyXG4iXX0=
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
// Core interfaces
|
|
2
|
-
export * from './config-service.interface';
|
|
3
|
-
export * from './module-options.interface';
|
|
4
|
-
// Error classes - re-export from core for backward compatibility
|
|
5
|
-
export { ConfigurationError, ValidationError, AWSServiceError, ConfigurationLoadError, MissingConfigurationError, } from '@dyanet/config-aws';
|
|
6
|
-
// Default schema and types
|
|
7
|
-
export * from './default-schema.interface';
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvaW50ZXJmYWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxrQkFBa0I7QUFDbEIsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDRCQUE0QixDQUFDO0FBRTNDLGlFQUFpRTtBQUNqRSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGVBQWUsRUFDZixlQUFlLEVBQ2Ysc0JBQXNCLEVBQ3RCLHlCQUF5QixHQUMxQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLDJCQUEyQjtBQUMzQixjQUFjLDRCQUE0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29yZSBpbnRlcmZhY2VzXHJcbmV4cG9ydCAqIGZyb20gJy4vY29uZmlnLXNlcnZpY2UuaW50ZXJmYWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGUtb3B0aW9ucy5pbnRlcmZhY2UnO1xyXG5cclxuLy8gRXJyb3IgY2xhc3NlcyAtIHJlLWV4cG9ydCBmcm9tIGNvcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcclxuZXhwb3J0IHtcclxuICBDb25maWd1cmF0aW9uRXJyb3IsXHJcbiAgVmFsaWRhdGlvbkVycm9yLFxyXG4gIEFXU1NlcnZpY2VFcnJvcixcclxuICBDb25maWd1cmF0aW9uTG9hZEVycm9yLFxyXG4gIE1pc3NpbmdDb25maWd1cmF0aW9uRXJyb3IsXHJcbn0gZnJvbSAnQGR5YW5ldC9jb25maWctYXdzJztcclxuXHJcbi8vIERlZmF1bHQgc2NoZW1hIGFuZCB0eXBlc1xyXG5leHBvcnQgKiBmcm9tICcuL2RlZmF1bHQtc2NoZW1hLmludGVyZmFjZSc7XHJcbiJdfQ==
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLW9wdGlvbnMuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvbW9kdWxlLW9wdGlvbnMuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBab2RUeXBlIH0gZnJvbSAnem9kJztcclxuXHJcbi8qKlxyXG4gKiBDb25maWd1cmF0aW9uIGZvciBBV1MgU2VjcmV0cyBNYW5hZ2VyIGludGVncmF0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTZWNyZXRzTWFuYWdlckNvbmZpZyB7XHJcbiAgLyoqIEFXUyByZWdpb24gZm9yIFNlY3JldHMgTWFuYWdlciAqL1xyXG4gIHJlZ2lvbj86IHN0cmluZztcclxuICAvKiogQmFzZSBwYXRoIGZvciBzZWNyZXRzIGluIGRpZmZlcmVudCBlbnZpcm9ubWVudHMgKi9cclxuICBwYXRocz86IHtcclxuICAgIGRldmVsb3BtZW50Pzogc3RyaW5nO1xyXG4gICAgdGVzdD86IHN0cmluZztcclxuICAgIHByb2R1Y3Rpb24/OiBzdHJpbmc7XHJcbiAgfTtcclxuICAvKiogV2hldGhlciB0byBlbmFibGUgU2VjcmV0cyBNYW5hZ2VyIGludGVncmF0aW9uICovXHJcbiAgZW5hYmxlZD86IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb25maWd1cmF0aW9uIGZvciBBV1MgU3lzdGVtcyBNYW5hZ2VyIFBhcmFtZXRlciBTdG9yZSBpbnRlZ3JhdGlvbi5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU1NNQ29uZmlnIHtcclxuICAvKiogQVdTIHJlZ2lvbiBmb3IgU1NNIFBhcmFtZXRlciBTdG9yZSAqL1xyXG4gIHJlZ2lvbj86IHN0cmluZztcclxuICAvKiogQmFzZSBwYXRoIGZvciBwYXJhbWV0ZXJzIGluIGRpZmZlcmVudCBlbnZpcm9ubWVudHMgKi9cclxuICBwYXRocz86IHtcclxuICAgIGRldmVsb3BtZW50Pzogc3RyaW5nO1xyXG4gICAgdGVzdD86IHN0cmluZztcclxuICAgIHByb2R1Y3Rpb24/OiBzdHJpbmc7XHJcbiAgfTtcclxuICAvKiogV2hldGhlciB0byBlbmFibGUgU1NNIFBhcmFtZXRlciBTdG9yZSBpbnRlZ3JhdGlvbiAqL1xyXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xyXG4gIC8qKiBXaGV0aGVyIHRvIGRlY3J5cHQgU2VjdXJlU3RyaW5nIHBhcmFtZXRlcnMgKi9cclxuICBkZWNyeXB0PzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIE9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIHRoZSBOZXN0SlMgQVdTIENvbmZpZ3VyYXRpb24gbW9kdWxlLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBOZXN0Q29uZmlnQXdzTW9kdWxlT3B0aW9uczxUID0gYW55PiB7XHJcbiAgLyoqIFpvZCBzY2hlbWEgZm9yIGNvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiAqL1xyXG4gIHNjaGVtYT86IFpvZFR5cGU8VD47XHJcbiAgXHJcbiAgLyoqIENvbmZpZ3VyYXRpb24gZm9yIEFXUyBTZWNyZXRzIE1hbmFnZXIgaW50ZWdyYXRpb24gKi9cclxuICBzZWNyZXRzTWFuYWdlckNvbmZpZz86IFNlY3JldHNNYW5hZ2VyQ29uZmlnO1xyXG4gIFxyXG4gIC8qKiBDb25maWd1cmF0aW9uIGZvciBBV1MgU3lzdGVtcyBNYW5hZ2VyIFBhcmFtZXRlciBTdG9yZSBpbnRlZ3JhdGlvbiAqL1xyXG4gIHNzbUNvbmZpZz86IFNTTUNvbmZpZztcclxuICBcclxuICAvKiogUHJlZml4IGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGUuZy4sICdBUFBfJykgKi9cclxuICBlbnZQcmVmaXg/OiBzdHJpbmc7XHJcbiAgXHJcbiAgLyoqIFdoZXRoZXIgdG8gaWdub3JlIHZhbGlkYXRpb24gZXJyb3JzIGFuZCBjb250aW51ZSB3aXRoIHBhcnRpYWwgY29uZmlnICovXHJcbiAgaWdub3JlVmFsaWRhdGlvbkVycm9ycz86IGJvb2xlYW47XHJcbiAgXHJcbiAgLyoqIEN1c3RvbSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGZvciBBUFBfRU5WIChkZWZhdWx0cyB0byAnQVBQX0VOVicpICovXHJcbiAgYXBwRW52VmFyaWFibGU/OiBzdHJpbmc7XHJcbiAgXHJcbiAgLyoqIFdoZXRoZXIgdG8gbG9hZCBjb25maWd1cmF0aW9uIHN5bmNocm9ub3VzbHkgZHVyaW5nIG1vZHVsZSBpbml0aWFsaXphdGlvbiAqL1xyXG4gIGxvYWRTeW5jPzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFzeW5jIGZhY3Rvcnkgb3B0aW9ucyBmb3IgZHluYW1pYyBtb2R1bGUgY29uZmlndXJhdGlvbi5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmVzdENvbmZpZ0F3c01vZHVsZUFzeW5jT3B0aW9uczxUID0gYW55PiB7XHJcbiAgLyoqIEZhY3RvcnkgZnVuY3Rpb24gdG8gY3JlYXRlIG1vZHVsZSBvcHRpb25zICovXHJcbiAgdXNlRmFjdG9yeTogKC4uLmFyZ3M6IGFueVtdKSA9PiBQcm9taXNlPE5lc3RDb25maWdBd3NNb2R1bGVPcHRpb25zPFQ+PiB8IE5lc3RDb25maWdBd3NNb2R1bGVPcHRpb25zPFQ+O1xyXG4gIFxyXG4gIC8qKiBEZXBlbmRlbmNpZXMgdG8gaW5qZWN0IGludG8gdGhlIGZhY3RvcnkgZnVuY3Rpb24gKi9cclxuICBpbmplY3Q/OiBhbnlbXTtcclxuICBcclxuICAvKiogSW1wb3J0cyByZXF1aXJlZCBmb3IgdGhlIGZhY3RvcnkgZnVuY3Rpb24gKi9cclxuICBpbXBvcnRzPzogYW55W107XHJcbn1cclxuIl19
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
-
};
|
|
10
|
-
var ConfigServiceImpl_1;
|
|
11
|
-
import { Injectable, Logger } from '@nestjs/common';
|
|
12
|
-
import { ConfigManager, ConfigurationError } from '@dyanet/config-aws';
|
|
13
|
-
import { ConfigService } from '../interfaces/config-service.interface';
|
|
14
|
-
/**
|
|
15
|
-
* NestJS Injectable wrapper around ConfigManager from @dyanet/config-aws.
|
|
16
|
-
* Provides type-safe configuration access with NestJS dependency injection support.
|
|
17
|
-
*
|
|
18
|
-
* This is a thin adapter layer that delegates all configuration loading and
|
|
19
|
-
* management to the framework-agnostic ConfigManager from config-aws.
|
|
20
|
-
*
|
|
21
|
-
* @example
|
|
22
|
-
* ```typescript
|
|
23
|
-
* import { ConfigServiceImpl } from '@dyanet/nestjs-config-aws';
|
|
24
|
-
* import { z } from 'zod';
|
|
25
|
-
*
|
|
26
|
-
* const schema = z.object({
|
|
27
|
-
* DATABASE_URL: z.string(),
|
|
28
|
-
* PORT: z.coerce.number().default(3000),
|
|
29
|
-
* });
|
|
30
|
-
*
|
|
31
|
-
* const configService = new ConfigServiceImpl({
|
|
32
|
-
* loaders: [new EnvironmentLoader()],
|
|
33
|
-
* schema,
|
|
34
|
-
* });
|
|
35
|
-
*
|
|
36
|
-
* await configService.initialize();
|
|
37
|
-
* const dbUrl = configService.get('DATABASE_URL');
|
|
38
|
-
* ```
|
|
39
|
-
*/
|
|
40
|
-
let ConfigServiceImpl = ConfigServiceImpl_1 = class ConfigServiceImpl extends ConfigService {
|
|
41
|
-
logger = new Logger(ConfigServiceImpl_1.name);
|
|
42
|
-
configManager;
|
|
43
|
-
enableNestLogging;
|
|
44
|
-
constructor(options = {}) {
|
|
45
|
-
super();
|
|
46
|
-
this.enableNestLogging = options.enableNestLogging ?? true;
|
|
47
|
-
// Create ConfigManager from config-aws with provided options
|
|
48
|
-
this.configManager = new ConfigManager({
|
|
49
|
-
loaders: options.loaders,
|
|
50
|
-
schema: options.schema,
|
|
51
|
-
precedence: options.precedence,
|
|
52
|
-
validateOnLoad: options.validateOnLoad,
|
|
53
|
-
enableLogging: options.enableLogging,
|
|
54
|
-
logger: options.logger,
|
|
55
|
-
verbose: options.verbose,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Initialize the configuration service by loading configuration from all sources.
|
|
60
|
-
* This method should be called during application startup.
|
|
61
|
-
*
|
|
62
|
-
* @throws ConfigurationError if loading or validation fails
|
|
63
|
-
*/
|
|
64
|
-
async initialize() {
|
|
65
|
-
if (this.configManager.isLoaded()) {
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
try {
|
|
69
|
-
if (this.enableNestLogging) {
|
|
70
|
-
this.logger.log('Initializing configuration service...');
|
|
71
|
-
}
|
|
72
|
-
await this.configManager.load();
|
|
73
|
-
if (this.enableNestLogging) {
|
|
74
|
-
this.logger.log('Configuration service initialized successfully');
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
catch (error) {
|
|
78
|
-
const errorMessage = `Failed to initialize configuration service: ${error instanceof Error ? error.message : String(error)}`;
|
|
79
|
-
this.logger.error(errorMessage);
|
|
80
|
-
throw error;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Get a configuration value by key with type safety.
|
|
85
|
-
*
|
|
86
|
-
* @param key - The configuration key to retrieve
|
|
87
|
-
* @returns The configuration value with proper typing
|
|
88
|
-
* @throws ConfigurationError if configuration is not initialized
|
|
89
|
-
*/
|
|
90
|
-
get(key) {
|
|
91
|
-
if (!this.configManager.isLoaded()) {
|
|
92
|
-
throw new ConfigurationError('Configuration service not initialized. Call initialize() first.');
|
|
93
|
-
}
|
|
94
|
-
return this.configManager.get(key);
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Check if the configuration service has been initialized.
|
|
98
|
-
*
|
|
99
|
-
* @returns True if the service is ready to serve configuration values
|
|
100
|
-
*/
|
|
101
|
-
isInitialized() {
|
|
102
|
-
return this.configManager.isLoaded();
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Get all configuration values.
|
|
106
|
-
*
|
|
107
|
-
* @returns The complete configuration object
|
|
108
|
-
* @throws ConfigurationError if configuration is not initialized
|
|
109
|
-
*/
|
|
110
|
-
getAll() {
|
|
111
|
-
if (!this.configManager.isLoaded()) {
|
|
112
|
-
throw new ConfigurationError('Configuration service not initialized. Call initialize() first.');
|
|
113
|
-
}
|
|
114
|
-
return this.configManager.getAll();
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Get the current application environment.
|
|
118
|
-
*
|
|
119
|
-
* @returns The APP_ENV value or 'development' as default
|
|
120
|
-
*/
|
|
121
|
-
getAppEnv() {
|
|
122
|
-
return this.configManager.getAppEnv();
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Get the underlying ConfigManager instance.
|
|
126
|
-
* Useful for advanced use cases that need direct access to ConfigManager features.
|
|
127
|
-
*
|
|
128
|
-
* @returns The ConfigManager instance from @dyanet/config-aws
|
|
129
|
-
*/
|
|
130
|
-
getConfigManager() {
|
|
131
|
-
return this.configManager;
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
ConfigServiceImpl = ConfigServiceImpl_1 = __decorate([
|
|
135
|
-
Injectable(),
|
|
136
|
-
__metadata("design:paramtypes", [Object])
|
|
137
|
-
], ConfigServiceImpl);
|
|
138
|
-
export { ConfigServiceImpl };
|
|
139
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvc2VydmljZXMvY29uZmlnLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQWN2RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUVJLElBQU0saUJBQWlCLHlCQUF2QixNQUFNLGlCQUErQyxTQUFRLGFBQWdCO0lBQ2pFLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxtQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QyxhQUFhLENBQW1CO0lBQ2hDLGlCQUFpQixDQUFVO0lBRTVDLFlBQVksVUFBbUMsRUFBRTtRQUMvQyxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDO1FBRTNELDZEQUE2RDtRQUM3RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxDQUFJO1lBQ3hDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdEIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO1lBQzlCLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztZQUN0QyxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7WUFDcEMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3RCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztTQUN6QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsVUFBVTtRQUNkLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ2xDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsdUNBQXVDLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBRUQsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1lBRWhDLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7WUFDcEUsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxZQUFZLEdBQUcsK0NBQStDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdILElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxHQUFHLENBQW9CLEdBQU07UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNuQyxNQUFNLElBQUksa0JBQWtCLENBQzFCLGlFQUFpRSxDQUNsRSxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU07UUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ25DLE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsaUVBQWlFLENBQ2xFLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztDQUNGLENBQUE7QUE1R1ksaUJBQWlCO0lBRDdCLFVBQVUsRUFBRTs7R0FDQSxpQkFBaUIsQ0E0RzdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTG9nZ2VyIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBDb25maWdNYW5hZ2VyLCBDb25maWd1cmF0aW9uRXJyb3IgfSBmcm9tICdAZHlhbmV0L2NvbmZpZy1hd3MnO1xyXG5pbXBvcnQgdHlwZSB7IENvbmZpZ01hbmFnZXJPcHRpb25zIH0gZnJvbSAnQGR5YW5ldC9jb25maWctYXdzJztcclxuXHJcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmZpZy1zZXJ2aWNlLmludGVyZmFjZSc7XHJcblxyXG4vKipcclxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBOZXN0SlMgQ29uZmlnU2VydmljZSB3cmFwcGVyLlxyXG4gKiBFeHRlbmRzIENvbmZpZ01hbmFnZXJPcHRpb25zIGZyb20gQGR5YW5ldC9jb25maWctYXdzLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBDb25maWdTZXJ2aWNlT3B0aW9uczxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IGV4dGVuZHMgQ29uZmlnTWFuYWdlck9wdGlvbnM8VD4ge1xyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIE5lc3RKUyBsb2dnaW5nXHJcbiAgICogQGRlZmF1bHQgdHJ1ZVxyXG4gICAqL1xyXG4gIGVuYWJsZU5lc3RMb2dnaW5nPzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIE5lc3RKUyBJbmplY3RhYmxlIHdyYXBwZXIgYXJvdW5kIENvbmZpZ01hbmFnZXIgZnJvbSBAZHlhbmV0L2NvbmZpZy1hd3MuXHJcbiAqIFByb3ZpZGVzIHR5cGUtc2FmZSBjb25maWd1cmF0aW9uIGFjY2VzcyB3aXRoIE5lc3RKUyBkZXBlbmRlbmN5IGluamVjdGlvbiBzdXBwb3J0LlxyXG4gKiBcclxuICogVGhpcyBpcyBhIHRoaW4gYWRhcHRlciBsYXllciB0aGF0IGRlbGVnYXRlcyBhbGwgY29uZmlndXJhdGlvbiBsb2FkaW5nIGFuZFxyXG4gKiBtYW5hZ2VtZW50IHRvIHRoZSBmcmFtZXdvcmstYWdub3N0aWMgQ29uZmlnTWFuYWdlciBmcm9tIGNvbmZpZy1hd3MuXHJcbiAqIFxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGB0eXBlc2NyaXB0XHJcbiAqIGltcG9ydCB7IENvbmZpZ1NlcnZpY2VJbXBsIH0gZnJvbSAnQGR5YW5ldC9uZXN0anMtY29uZmlnLWF3cyc7XHJcbiAqIGltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xyXG4gKiBcclxuICogY29uc3Qgc2NoZW1hID0gei5vYmplY3Qoe1xyXG4gKiAgIERBVEFCQVNFX1VSTDogei5zdHJpbmcoKSxcclxuICogICBQT1JUOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDMwMDApLFxyXG4gKiB9KTtcclxuICogXHJcbiAqIGNvbnN0IGNvbmZpZ1NlcnZpY2UgPSBuZXcgQ29uZmlnU2VydmljZUltcGwoe1xyXG4gKiAgIGxvYWRlcnM6IFtuZXcgRW52aXJvbm1lbnRMb2FkZXIoKV0sXHJcbiAqICAgc2NoZW1hLFxyXG4gKiB9KTtcclxuICogXHJcbiAqIGF3YWl0IGNvbmZpZ1NlcnZpY2UuaW5pdGlhbGl6ZSgpO1xyXG4gKiBjb25zdCBkYlVybCA9IGNvbmZpZ1NlcnZpY2UuZ2V0KCdEQVRBQkFTRV9VUkwnKTtcclxuICogYGBgXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDb25maWdTZXJ2aWNlSW1wbDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IGV4dGVuZHMgQ29uZmlnU2VydmljZTxUPiB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKENvbmZpZ1NlcnZpY2VJbXBsLm5hbWUpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnTWFuYWdlcjogQ29uZmlnTWFuYWdlcjxUPjtcclxuICBwcml2YXRlIHJlYWRvbmx5IGVuYWJsZU5lc3RMb2dnaW5nOiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBDb25maWdTZXJ2aWNlT3B0aW9uczxUPiA9IHt9KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgXHJcbiAgICB0aGlzLmVuYWJsZU5lc3RMb2dnaW5nID0gb3B0aW9ucy5lbmFibGVOZXN0TG9nZ2luZyA/PyB0cnVlO1xyXG4gICAgXHJcbiAgICAvLyBDcmVhdGUgQ29uZmlnTWFuYWdlciBmcm9tIGNvbmZpZy1hd3Mgd2l0aCBwcm92aWRlZCBvcHRpb25zXHJcbiAgICB0aGlzLmNvbmZpZ01hbmFnZXIgPSBuZXcgQ29uZmlnTWFuYWdlcjxUPih7XHJcbiAgICAgIGxvYWRlcnM6IG9wdGlvbnMubG9hZGVycyxcclxuICAgICAgc2NoZW1hOiBvcHRpb25zLnNjaGVtYSxcclxuICAgICAgcHJlY2VkZW5jZTogb3B0aW9ucy5wcmVjZWRlbmNlLFxyXG4gICAgICB2YWxpZGF0ZU9uTG9hZDogb3B0aW9ucy52YWxpZGF0ZU9uTG9hZCxcclxuICAgICAgZW5hYmxlTG9nZ2luZzogb3B0aW9ucy5lbmFibGVMb2dnaW5nLFxyXG4gICAgICBsb2dnZXI6IG9wdGlvbnMubG9nZ2VyLFxyXG4gICAgICB2ZXJib3NlOiBvcHRpb25zLnZlcmJvc2UsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXRpYWxpemUgdGhlIGNvbmZpZ3VyYXRpb24gc2VydmljZSBieSBsb2FkaW5nIGNvbmZpZ3VyYXRpb24gZnJvbSBhbGwgc291cmNlcy5cclxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGR1cmluZyBhcHBsaWNhdGlvbiBzdGFydHVwLlxyXG4gICAqIFxyXG4gICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkVycm9yIGlmIGxvYWRpbmcgb3IgdmFsaWRhdGlvbiBmYWlsc1xyXG4gICAqL1xyXG4gIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5jb25maWdNYW5hZ2VyLmlzTG9hZGVkKCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLmVuYWJsZU5lc3RMb2dnaW5nKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKCdJbml0aWFsaXppbmcgY29uZmlndXJhdGlvbiBzZXJ2aWNlLi4uJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlnTWFuYWdlci5sb2FkKCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5lbmFibGVOZXN0TG9nZ2luZykge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZygnQ29uZmlndXJhdGlvbiBzZXJ2aWNlIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseScpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgRmFpbGVkIHRvIGluaXRpYWxpemUgY29uZmlndXJhdGlvbiBzZXJ2aWNlOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gO1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpO1xyXG4gICAgICB0aHJvdyBlcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhIGNvbmZpZ3VyYXRpb24gdmFsdWUgYnkga2V5IHdpdGggdHlwZSBzYWZldHkuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGtleSAtIFRoZSBjb25maWd1cmF0aW9uIGtleSB0byByZXRyaWV2ZVxyXG4gICAqIEByZXR1cm5zIFRoZSBjb25maWd1cmF0aW9uIHZhbHVlIHdpdGggcHJvcGVyIHR5cGluZ1xyXG4gICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkVycm9yIGlmIGNvbmZpZ3VyYXRpb24gaXMgbm90IGluaXRpYWxpemVkXHJcbiAgICovXHJcbiAgZ2V0PEsgZXh0ZW5kcyBrZXlvZiBUPihrZXk6IEspOiBUW0tdIHtcclxuICAgIGlmICghdGhpcy5jb25maWdNYW5hZ2VyLmlzTG9hZGVkKCkpIHtcclxuICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcclxuICAgICAgICAnQ29uZmlndXJhdGlvbiBzZXJ2aWNlIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBpbml0aWFsaXplKCkgZmlyc3QuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnTWFuYWdlci5nZXQoa2V5KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHRoZSBjb25maWd1cmF0aW9uIHNlcnZpY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgc2VydmljZSBpcyByZWFkeSB0byBzZXJ2ZSBjb25maWd1cmF0aW9uIHZhbHVlc1xyXG4gICAqL1xyXG4gIGlzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWdNYW5hZ2VyLmlzTG9hZGVkKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYWxsIGNvbmZpZ3VyYXRpb24gdmFsdWVzLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFRoZSBjb21wbGV0ZSBjb25maWd1cmF0aW9uIG9iamVjdFxyXG4gICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkVycm9yIGlmIGNvbmZpZ3VyYXRpb24gaXMgbm90IGluaXRpYWxpemVkXHJcbiAgICovXHJcbiAgZ2V0QWxsKCk6IFQge1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZ01hbmFnZXIuaXNMb2FkZWQoKSkge1xyXG4gICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxyXG4gICAgICAgICdDb25maWd1cmF0aW9uIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkLiBDYWxsIGluaXRpYWxpemUoKSBmaXJzdC4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWdNYW5hZ2VyLmdldEFsbCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uIGVudmlyb25tZW50LlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFRoZSBBUFBfRU5WIHZhbHVlIG9yICdkZXZlbG9wbWVudCcgYXMgZGVmYXVsdFxyXG4gICAqL1xyXG4gIGdldEFwcEVudigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnTWFuYWdlci5nZXRBcHBFbnYoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgdW5kZXJseWluZyBDb25maWdNYW5hZ2VyIGluc3RhbmNlLlxyXG4gICAqIFVzZWZ1bCBmb3IgYWR2YW5jZWQgdXNlIGNhc2VzIHRoYXQgbmVlZCBkaXJlY3QgYWNjZXNzIHRvIENvbmZpZ01hbmFnZXIgZmVhdHVyZXMuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMgVGhlIENvbmZpZ01hbmFnZXIgaW5zdGFuY2UgZnJvbSBAZHlhbmV0L2NvbmZpZy1hd3NcclxuICAgKi9cclxuICBnZXRDb25maWdNYW5hZ2VyKCk6IENvbmZpZ01hbmFnZXI8VD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnTWFuYWdlcjtcclxuICB9XHJcbn1cclxuIl19
|