@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.
Files changed (230) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -43
  3. package/dist/cjs/aws-config-loader.js +57 -0
  4. package/dist/cjs/build-loaders.js +58 -0
  5. package/dist/cjs/config.module.js +138 -0
  6. package/dist/cjs/index.js +46 -0
  7. package/dist/cjs/interfaces/config-service.interface.js +11 -0
  8. package/dist/cjs/interfaces/default-schema.interface.js +63 -0
  9. package/dist/cjs/{nestjs-config-aws/src/interfaces → interfaces}/index.js +1 -1
  10. package/dist/cjs/interfaces/module-options.interface.js +3 -0
  11. package/dist/cjs/package.json +3 -0
  12. package/dist/cjs/services/config.service.js +142 -0
  13. package/dist/esm/aws-config-loader.js +54 -0
  14. package/dist/esm/build-loaders.js +55 -0
  15. package/dist/esm/config.module.js +135 -0
  16. package/dist/esm/index.js +18 -0
  17. package/dist/esm/interfaces/config-service.interface.js +7 -0
  18. package/dist/esm/interfaces/default-schema.interface.js +59 -0
  19. package/dist/esm/interfaces/index.js +8 -0
  20. package/dist/esm/interfaces/module-options.interface.js +2 -0
  21. package/dist/esm/package.json +3 -0
  22. package/dist/esm/services/config.service.js +139 -0
  23. package/dist/types/aws-config-loader.d.ts +74 -0
  24. package/dist/types/aws-config-loader.d.ts.map +1 -0
  25. package/dist/types/build-loaders.d.ts +30 -0
  26. package/dist/types/build-loaders.d.ts.map +1 -0
  27. package/dist/types/{nestjs-config-aws/src/config.module.d.ts → config.module.d.ts} +2 -8
  28. package/dist/types/config.module.d.ts.map +1 -0
  29. package/dist/types/index.d.ts +10 -0
  30. package/dist/types/index.d.ts.map +1 -0
  31. package/dist/types/interfaces/config-service.interface.d.ts.map +1 -0
  32. package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/default-schema.interface.d.ts +14 -14
  33. package/dist/types/interfaces/default-schema.interface.d.ts.map +1 -0
  34. package/dist/types/interfaces/index.d.ts.map +1 -0
  35. package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/module-options.interface.d.ts +22 -3
  36. package/dist/types/interfaces/module-options.interface.d.ts.map +1 -0
  37. package/dist/types/services/config.service.d.ts.map +1 -0
  38. package/package.json +12 -6
  39. package/dist/cjs/config-aws/src/config-manager.js +0 -366
  40. package/dist/cjs/config-aws/src/errors/index.js +0 -77
  41. package/dist/cjs/config-aws/src/index.js +0 -37
  42. package/dist/cjs/config-aws/src/interfaces/config-loader.interface.js +0 -3
  43. package/dist/cjs/config-aws/src/interfaces/config-manager.interface.js +0 -3
  44. package/dist/cjs/config-aws/src/interfaces/env-file-loader.interface.js +0 -3
  45. package/dist/cjs/config-aws/src/interfaces/environment-loader.interface.js +0 -3
  46. package/dist/cjs/config-aws/src/interfaces/s3-loader.interface.js +0 -3
  47. package/dist/cjs/config-aws/src/interfaces/secrets-manager-loader.interface.js +0 -3
  48. package/dist/cjs/config-aws/src/interfaces/ssm-parameter-store-loader.interface.js +0 -3
  49. package/dist/cjs/config-aws/src/loaders/env-file.loader.js +0 -169
  50. package/dist/cjs/config-aws/src/loaders/environment.loader.js +0 -85
  51. package/dist/cjs/config-aws/src/loaders/s3.loader.js +0 -145
  52. package/dist/cjs/config-aws/src/loaders/secrets-manager.loader.js +0 -169
  53. package/dist/cjs/config-aws/src/loaders/ssm-parameter-store.loader.js +0 -199
  54. package/dist/cjs/config-aws/src/utils/env-file-parser.util.js +0 -98
  55. package/dist/cjs/config-aws/src/utils/validation.util.js +0 -116
  56. package/dist/cjs/nestjs-config-aws/src/config.module.js +0 -175
  57. package/dist/cjs/nestjs-config-aws/src/index.js +0 -61
  58. package/dist/cjs/nestjs-config-aws/src/integration/index.js +0 -23
  59. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.js +0 -3
  60. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.js +0 -3
  61. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/index.js +0 -26
  62. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/integration-options.interface.js +0 -3
  63. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/integration-state.interface.js +0 -3
  64. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.js +0 -73
  65. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.js +0 -3
  66. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.js +0 -4
  67. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/utility-types.interface.js +0 -52
  68. package/dist/cjs/nestjs-config-aws/src/integration/nestjs-config-integration.module.js +0 -124
  69. package/dist/cjs/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.js +0 -592
  70. package/dist/cjs/nestjs-config-aws/src/integration/providers/configuration-factory.provider.js +0 -385
  71. package/dist/cjs/nestjs-config-aws/src/integration/providers/index.js +0 -20
  72. package/dist/cjs/nestjs-config-aws/src/integration/services/async-config-helper.service.js +0 -366
  73. package/dist/cjs/nestjs-config-aws/src/integration/services/error-handler.service.js +0 -267
  74. package/dist/cjs/nestjs-config-aws/src/integration/services/factory-registration.service.js +0 -517
  75. package/dist/cjs/nestjs-config-aws/src/integration/services/index.js +0 -26
  76. package/dist/cjs/nestjs-config-aws/src/integration/services/integration-state.service.js +0 -81
  77. package/dist/cjs/nestjs-config-aws/src/integration/services/namespace-handler.service.js +0 -465
  78. package/dist/cjs/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js +0 -318
  79. package/dist/cjs/nestjs-config-aws/src/integration/services/precedence-handler.service.js +0 -292
  80. package/dist/cjs/nestjs-config-aws/src/integration/services/validation-integration.service.js +0 -595
  81. package/dist/cjs/nestjs-config-aws/src/integration/utils/config-integration.util.js +0 -283
  82. package/dist/cjs/nestjs-config-aws/src/integration/utils/index.js +0 -19
  83. package/dist/cjs/nestjs-config-aws/src/interfaces/config-service.interface.js +0 -11
  84. package/dist/cjs/nestjs-config-aws/src/interfaces/default-schema.interface.js +0 -63
  85. package/dist/cjs/nestjs-config-aws/src/interfaces/module-options.interface.js +0 -3
  86. package/dist/cjs/nestjs-config-aws/src/services/config.service.js +0 -142
  87. package/dist/esm/config-aws/src/config-manager.js +0 -362
  88. package/dist/esm/config-aws/src/errors/index.js +0 -69
  89. package/dist/esm/config-aws/src/index.js +0 -21
  90. package/dist/esm/config-aws/src/interfaces/config-loader.interface.js +0 -2
  91. package/dist/esm/config-aws/src/interfaces/config-manager.interface.js +0 -2
  92. package/dist/esm/config-aws/src/interfaces/env-file-loader.interface.js +0 -2
  93. package/dist/esm/config-aws/src/interfaces/environment-loader.interface.js +0 -2
  94. package/dist/esm/config-aws/src/interfaces/s3-loader.interface.js +0 -2
  95. package/dist/esm/config-aws/src/interfaces/secrets-manager-loader.interface.js +0 -2
  96. package/dist/esm/config-aws/src/interfaces/ssm-parameter-store-loader.interface.js +0 -2
  97. package/dist/esm/config-aws/src/loaders/env-file.loader.js +0 -132
  98. package/dist/esm/config-aws/src/loaders/environment.loader.js +0 -81
  99. package/dist/esm/config-aws/src/loaders/s3.loader.js +0 -141
  100. package/dist/esm/config-aws/src/loaders/secrets-manager.loader.js +0 -165
  101. package/dist/esm/config-aws/src/loaders/ssm-parameter-store.loader.js +0 -195
  102. package/dist/esm/config-aws/src/utils/env-file-parser.util.js +0 -94
  103. package/dist/esm/config-aws/src/utils/validation.util.js +0 -112
  104. package/dist/esm/nestjs-config-aws/src/config.module.js +0 -172
  105. package/dist/esm/nestjs-config-aws/src/index.js +0 -23
  106. package/dist/esm/nestjs-config-aws/src/integration/index.js +0 -7
  107. package/dist/esm/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.js +0 -2
  108. package/dist/esm/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.js +0 -2
  109. package/dist/esm/nestjs-config-aws/src/integration/interfaces/index.js +0 -10
  110. package/dist/esm/nestjs-config-aws/src/integration/interfaces/integration-options.interface.js +0 -2
  111. package/dist/esm/nestjs-config-aws/src/integration/interfaces/integration-state.interface.js +0 -2
  112. package/dist/esm/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.js +0 -64
  113. package/dist/esm/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.js +0 -2
  114. package/dist/esm/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.js +0 -3
  115. package/dist/esm/nestjs-config-aws/src/integration/interfaces/utility-types.interface.js +0 -44
  116. package/dist/esm/nestjs-config-aws/src/integration/nestjs-config-integration.module.js +0 -121
  117. package/dist/esm/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.js +0 -589
  118. package/dist/esm/nestjs-config-aws/src/integration/providers/configuration-factory.provider.js +0 -382
  119. package/dist/esm/nestjs-config-aws/src/integration/providers/index.js +0 -4
  120. package/dist/esm/nestjs-config-aws/src/integration/services/async-config-helper.service.js +0 -363
  121. package/dist/esm/nestjs-config-aws/src/integration/services/error-handler.service.js +0 -264
  122. package/dist/esm/nestjs-config-aws/src/integration/services/factory-registration.service.js +0 -514
  123. package/dist/esm/nestjs-config-aws/src/integration/services/index.js +0 -10
  124. package/dist/esm/nestjs-config-aws/src/integration/services/integration-state.service.js +0 -78
  125. package/dist/esm/nestjs-config-aws/src/integration/services/namespace-handler.service.js +0 -462
  126. package/dist/esm/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js +0 -315
  127. package/dist/esm/nestjs-config-aws/src/integration/services/precedence-handler.service.js +0 -289
  128. package/dist/esm/nestjs-config-aws/src/integration/services/validation-integration.service.js +0 -589
  129. package/dist/esm/nestjs-config-aws/src/integration/utils/config-integration.util.js +0 -240
  130. package/dist/esm/nestjs-config-aws/src/integration/utils/index.js +0 -3
  131. package/dist/esm/nestjs-config-aws/src/interfaces/config-service.interface.js +0 -7
  132. package/dist/esm/nestjs-config-aws/src/interfaces/default-schema.interface.js +0 -59
  133. package/dist/esm/nestjs-config-aws/src/interfaces/index.js +0 -8
  134. package/dist/esm/nestjs-config-aws/src/interfaces/module-options.interface.js +0 -2
  135. package/dist/esm/nestjs-config-aws/src/services/config.service.js +0 -139
  136. package/dist/types/config-aws/src/config-manager.d.ts +0 -119
  137. package/dist/types/config-aws/src/config-manager.d.ts.map +0 -1
  138. package/dist/types/config-aws/src/errors/index.d.ts +0 -43
  139. package/dist/types/config-aws/src/errors/index.d.ts.map +0 -1
  140. package/dist/types/config-aws/src/index.d.ts +0 -24
  141. package/dist/types/config-aws/src/index.d.ts.map +0 -1
  142. package/dist/types/config-aws/src/interfaces/config-loader.interface.d.ts +0 -33
  143. package/dist/types/config-aws/src/interfaces/config-loader.interface.d.ts.map +0 -1
  144. package/dist/types/config-aws/src/interfaces/config-manager.interface.d.ts +0 -86
  145. package/dist/types/config-aws/src/interfaces/config-manager.interface.d.ts.map +0 -1
  146. package/dist/types/config-aws/src/interfaces/env-file-loader.interface.d.ts +0 -12
  147. package/dist/types/config-aws/src/interfaces/env-file-loader.interface.d.ts.map +0 -1
  148. package/dist/types/config-aws/src/interfaces/environment-loader.interface.d.ts +0 -10
  149. package/dist/types/config-aws/src/interfaces/environment-loader.interface.d.ts.map +0 -1
  150. package/dist/types/config-aws/src/interfaces/s3-loader.interface.d.ts +0 -14
  151. package/dist/types/config-aws/src/interfaces/s3-loader.interface.d.ts.map +0 -1
  152. package/dist/types/config-aws/src/interfaces/secrets-manager-loader.interface.d.ts +0 -12
  153. package/dist/types/config-aws/src/interfaces/secrets-manager-loader.interface.d.ts.map +0 -1
  154. package/dist/types/config-aws/src/interfaces/ssm-parameter-store-loader.interface.d.ts +0 -14
  155. package/dist/types/config-aws/src/interfaces/ssm-parameter-store-loader.interface.d.ts.map +0 -1
  156. package/dist/types/config-aws/src/loaders/env-file.loader.d.ts +0 -69
  157. package/dist/types/config-aws/src/loaders/env-file.loader.d.ts.map +0 -1
  158. package/dist/types/config-aws/src/loaders/environment.loader.d.ts +0 -46
  159. package/dist/types/config-aws/src/loaders/environment.loader.d.ts.map +0 -1
  160. package/dist/types/config-aws/src/loaders/s3.loader.d.ts +0 -62
  161. package/dist/types/config-aws/src/loaders/s3.loader.d.ts.map +0 -1
  162. package/dist/types/config-aws/src/loaders/secrets-manager.loader.d.ts +0 -68
  163. package/dist/types/config-aws/src/loaders/secrets-manager.loader.d.ts.map +0 -1
  164. package/dist/types/config-aws/src/loaders/ssm-parameter-store.loader.d.ts +0 -78
  165. package/dist/types/config-aws/src/loaders/ssm-parameter-store.loader.d.ts.map +0 -1
  166. package/dist/types/config-aws/src/utils/env-file-parser.util.d.ts +0 -45
  167. package/dist/types/config-aws/src/utils/env-file-parser.util.d.ts.map +0 -1
  168. package/dist/types/config-aws/src/utils/validation.util.d.ts +0 -53
  169. package/dist/types/config-aws/src/utils/validation.util.d.ts.map +0 -1
  170. package/dist/types/nestjs-config-aws/src/config.module.d.ts.map +0 -1
  171. package/dist/types/nestjs-config-aws/src/index.d.ts +0 -11
  172. package/dist/types/nestjs-config-aws/src/index.d.ts.map +0 -1
  173. package/dist/types/nestjs-config-aws/src/integration/index.d.ts +0 -6
  174. package/dist/types/nestjs-config-aws/src/integration/index.d.ts.map +0 -1
  175. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.d.ts +0 -71
  176. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.d.ts.map +0 -1
  177. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.d.ts +0 -24
  178. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.d.ts.map +0 -1
  179. package/dist/types/nestjs-config-aws/src/integration/interfaces/index.d.ts +0 -9
  180. package/dist/types/nestjs-config-aws/src/integration/interfaces/index.d.ts.map +0 -1
  181. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-options.interface.d.ts +0 -66
  182. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-options.interface.d.ts.map +0 -1
  183. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-state.interface.d.ts +0 -17
  184. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-state.interface.d.ts.map +0 -1
  185. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.d.ts +0 -332
  186. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.d.ts.map +0 -1
  187. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.d.ts +0 -259
  188. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.d.ts.map +0 -1
  189. package/dist/types/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.d.ts +0 -209
  190. package/dist/types/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.d.ts.map +0 -1
  191. package/dist/types/nestjs-config-aws/src/integration/interfaces/utility-types.interface.d.ts +0 -249
  192. package/dist/types/nestjs-config-aws/src/integration/interfaces/utility-types.interface.d.ts.map +0 -1
  193. package/dist/types/nestjs-config-aws/src/integration/nestjs-config-integration.module.d.ts +0 -36
  194. package/dist/types/nestjs-config-aws/src/integration/nestjs-config-integration.module.d.ts.map +0 -1
  195. package/dist/types/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.d.ts +0 -134
  196. package/dist/types/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.d.ts.map +0 -1
  197. package/dist/types/nestjs-config-aws/src/integration/providers/configuration-factory.provider.d.ts +0 -119
  198. package/dist/types/nestjs-config-aws/src/integration/providers/configuration-factory.provider.d.ts.map +0 -1
  199. package/dist/types/nestjs-config-aws/src/integration/providers/index.d.ts +0 -3
  200. package/dist/types/nestjs-config-aws/src/integration/providers/index.d.ts.map +0 -1
  201. package/dist/types/nestjs-config-aws/src/integration/services/async-config-helper.service.d.ts +0 -84
  202. package/dist/types/nestjs-config-aws/src/integration/services/async-config-helper.service.d.ts.map +0 -1
  203. package/dist/types/nestjs-config-aws/src/integration/services/error-handler.service.d.ts +0 -84
  204. package/dist/types/nestjs-config-aws/src/integration/services/error-handler.service.d.ts.map +0 -1
  205. package/dist/types/nestjs-config-aws/src/integration/services/factory-registration.service.d.ts +0 -158
  206. package/dist/types/nestjs-config-aws/src/integration/services/factory-registration.service.d.ts.map +0 -1
  207. package/dist/types/nestjs-config-aws/src/integration/services/index.d.ts +0 -9
  208. package/dist/types/nestjs-config-aws/src/integration/services/index.d.ts.map +0 -1
  209. package/dist/types/nestjs-config-aws/src/integration/services/integration-state.service.d.ts +0 -41
  210. package/dist/types/nestjs-config-aws/src/integration/services/integration-state.service.d.ts.map +0 -1
  211. package/dist/types/nestjs-config-aws/src/integration/services/namespace-handler.service.d.ts +0 -192
  212. package/dist/types/nestjs-config-aws/src/integration/services/namespace-handler.service.d.ts.map +0 -1
  213. package/dist/types/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.d.ts +0 -87
  214. package/dist/types/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.d.ts.map +0 -1
  215. package/dist/types/nestjs-config-aws/src/integration/services/precedence-handler.service.d.ts +0 -103
  216. package/dist/types/nestjs-config-aws/src/integration/services/precedence-handler.service.d.ts.map +0 -1
  217. package/dist/types/nestjs-config-aws/src/integration/services/validation-integration.service.d.ts +0 -222
  218. package/dist/types/nestjs-config-aws/src/integration/services/validation-integration.service.d.ts.map +0 -1
  219. package/dist/types/nestjs-config-aws/src/integration/utils/config-integration.util.d.ts +0 -81
  220. package/dist/types/nestjs-config-aws/src/integration/utils/config-integration.util.d.ts.map +0 -1
  221. package/dist/types/nestjs-config-aws/src/integration/utils/index.d.ts +0 -2
  222. package/dist/types/nestjs-config-aws/src/integration/utils/index.d.ts.map +0 -1
  223. package/dist/types/nestjs-config-aws/src/interfaces/config-service.interface.d.ts.map +0 -1
  224. package/dist/types/nestjs-config-aws/src/interfaces/default-schema.interface.d.ts.map +0 -1
  225. package/dist/types/nestjs-config-aws/src/interfaces/index.d.ts.map +0 -1
  226. package/dist/types/nestjs-config-aws/src/interfaces/module-options.interface.d.ts.map +0 -1
  227. package/dist/types/nestjs-config-aws/src/services/config.service.d.ts.map +0 -1
  228. /package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/config-service.interface.d.ts +0 -0
  229. /package/dist/types/{nestjs-config-aws/src/interfaces → interfaces}/index.d.ts +0 -0
  230. /package/dist/types/{nestjs-config-aws/src/services → services}/config.service.d.ts +0 -0
@@ -1,514 +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 __param = (this && this.__param) || function (paramIndex, decorator) {
11
- return function (target, key) { decorator(target, key, paramIndex); }
12
- };
13
- var FactoryRegistrationService_1;
14
- import { Injectable, Logger, Inject, Optional } from '@nestjs/common';
15
- import { ConfigurationFactoryProviderImpl } from '../providers/configuration-factory.provider';
16
- import { AwsConfigurationLoaderService } from '../providers/aws-configuration-loader.service';
17
- import { NESTJS_CONFIG_AWS_INTEGRATION_OPTIONS } from '../nestjs-config-integration.module';
18
- import { NamespaceHandlerService } from './namespace-handler.service';
19
- import { ValidationIntegrationService } from './validation-integration.service';
20
- /**
21
- * Service responsible for registering configuration factories with @nestjs/config.
22
- * This service creates and manages the bridge between AWS-loaded configuration
23
- * and the standard @nestjs/config module.
24
- */
25
- let FactoryRegistrationService = FactoryRegistrationService_1 = class FactoryRegistrationService {
26
- configurationFactoryProvider;
27
- awsConfigurationLoader;
28
- namespaceHandler;
29
- validationService;
30
- options;
31
- logger = new Logger(FactoryRegistrationService_1.name);
32
- registeredFactories = new Map();
33
- isInitialized = false;
34
- constructor(configurationFactoryProvider, awsConfigurationLoader, namespaceHandler, validationService, options = {}) {
35
- this.configurationFactoryProvider = configurationFactoryProvider;
36
- this.awsConfigurationLoader = awsConfigurationLoader;
37
- this.namespaceHandler = namespaceHandler;
38
- this.validationService = validationService;
39
- this.options = options;
40
- }
41
- /**
42
- * Register configuration factories with @nestjs/config based on AWS-loaded configuration.
43
- * This method loads configuration from AWS sources and creates factories that can be
44
- * consumed by @nestjs/config.
45
- *
46
- * @returns Promise resolving to array of registered configuration factories
47
- */
48
- async registerFactories() {
49
- if (this.isInitialized) {
50
- this.logger.debug('Factories already registered, returning cached factories');
51
- return Array.from(this.registeredFactories.values());
52
- }
53
- try {
54
- this.logger.debug('Starting factory registration process');
55
- // Load configuration from AWS sources
56
- const awsConfig = await this.loadAwsConfiguration();
57
- // Create configuration factories based on options
58
- const factories = await this.createConfigurationFactories(awsConfig);
59
- // Register factories and track them
60
- this.registerFactoriesInternal(factories);
61
- this.isInitialized = true;
62
- this.logger.log(`Successfully registered ${factories.length} configuration factories`);
63
- return factories;
64
- }
65
- catch (error) {
66
- const registrationError = error instanceof Error ? error : new Error(String(error));
67
- this.logger.error('Failed to register configuration factories:', registrationError);
68
- // Handle registration failure based on options
69
- if (this.options.failOnAwsError) {
70
- throw registrationError;
71
- }
72
- // Return empty factories array if fallback is enabled
73
- if (this.options.fallbackToLocal) {
74
- this.logger.warn('Falling back to empty configuration factories due to AWS error');
75
- return [];
76
- }
77
- throw registrationError;
78
- }
79
- }
80
- /**
81
- * Register configuration factories asynchronously.
82
- * This method is designed to work with @nestjs/config's forRootAsync pattern.
83
- *
84
- * @returns Promise resolving to array of configuration factories
85
- */
86
- async registerFactoriesAsync() {
87
- this.logger.debug('Starting async factory registration');
88
- try {
89
- // Ensure AWS services are available before proceeding
90
- const isAwsAvailable = await this.awsConfigurationLoader.isAvailable();
91
- if (!isAwsAvailable && this.options.failOnAwsError) {
92
- throw new Error('AWS services are not available and failOnAwsError is enabled');
93
- }
94
- if (!isAwsAvailable) {
95
- this.logger.warn('AWS services not available, registering empty factories');
96
- return [];
97
- }
98
- // Load configuration asynchronously
99
- const factories = await this.registerFactories();
100
- this.logger.debug(`Async factory registration completed with ${factories.length} factories`);
101
- return factories;
102
- }
103
- catch (error) {
104
- const asyncError = error instanceof Error ? error : new Error(String(error));
105
- this.logger.error('Async factory registration failed:', asyncError);
106
- // Handle async registration failure
107
- if (this.options.fallbackToLocal) {
108
- this.logger.warn('Falling back to empty factories for async registration');
109
- return [];
110
- }
111
- throw asyncError;
112
- }
113
- }
114
- /**
115
- * Create a single configuration factory for immediate use.
116
- * This method can be used for synchronous factory creation.
117
- *
118
- * @param namespace - Optional namespace for the factory
119
- * @param config - Configuration data to use for the factory
120
- * @returns Configuration factory
121
- */
122
- createSyncFactory(namespace, config) {
123
- this.logger.debug(`Creating synchronous factory for namespace: ${namespace || 'default'}`);
124
- // Use provided config or create empty config
125
- const factoryConfig = config || {};
126
- // Create factory using the configuration factory provider
127
- const factory = this.configurationFactoryProvider.createFactory(namespace || '', factoryConfig);
128
- // Track the factory
129
- const factoryKey = namespace || 'default';
130
- this.registeredFactories.set(factoryKey, factory);
131
- this.logger.debug(`Created synchronous factory: ${factoryKey}`);
132
- return factory;
133
- }
134
- /**
135
- * Register factories for specific namespaces.
136
- * This method allows selective registration of configuration for specific namespaces.
137
- *
138
- * @param namespaces - Array of namespace names to register
139
- * @returns Promise resolving to array of namespace-specific factories
140
- */
141
- async registerNamespacedFactories(namespaces) {
142
- this.logger.debug(`Registering factories for namespaces: ${namespaces.join(', ')}`);
143
- try {
144
- // Load namespaced configuration from AWS
145
- const namespacedConfig = await this.awsConfigurationLoader.loadNamespacedConfiguration(namespaces);
146
- // Create factories for each namespace
147
- const factories = [];
148
- for (const namespace of namespaces) {
149
- const namespaceConfig = namespacedConfig[namespace];
150
- if (namespaceConfig && Object.keys(namespaceConfig).length > 0) {
151
- const factory = this.configurationFactoryProvider.createFactory(namespace, namespaceConfig);
152
- factories.push(factory);
153
- // Track the factory
154
- this.registeredFactories.set(namespace, factory);
155
- this.logger.debug(`Created factory for namespace: ${namespace}`);
156
- }
157
- else {
158
- this.logger.warn(`No configuration found for namespace: ${namespace}`);
159
- }
160
- }
161
- this.logger.log(`Successfully registered ${factories.length} namespaced factories`);
162
- return factories;
163
- }
164
- catch (error) {
165
- const namespacedError = error instanceof Error ? error : new Error(String(error));
166
- this.logger.error('Failed to register namespaced factories:', namespacedError);
167
- if (this.options.failOnAwsError) {
168
- throw namespacedError;
169
- }
170
- // Return empty factories if fallback is enabled
171
- return [];
172
- }
173
- }
174
- /**
175
- * Get all registered factories.
176
- * @returns Map of factory names to configuration factories
177
- */
178
- getRegisteredFactories() {
179
- return new Map(this.registeredFactories);
180
- }
181
- /**
182
- * Get a specific registered factory by name.
183
- * @param name - Name of the factory to retrieve
184
- * @returns Configuration factory or undefined if not found
185
- */
186
- getFactory(name) {
187
- return this.registeredFactories.get(name);
188
- }
189
- /**
190
- * Check if factories have been initialized.
191
- * @returns Whether factories have been registered
192
- */
193
- isFactoriesInitialized() {
194
- return this.isInitialized;
195
- }
196
- /**
197
- * Register validated namespace factories with schema validation.
198
- * This method creates factories that validate configuration using Joi, class-validator, or custom functions.
199
- *
200
- * @param namespaces - Array of namespace names to register
201
- * @param validationSchemas - Validation schemas for each namespace
202
- * @param validationType - Type of validation to use
203
- * @returns Promise resolving to array of validated namespace factories
204
- */
205
- async registerValidatedNamespaceFactories(namespaces, validationSchemas, validationType = 'custom') {
206
- this.logger.debug(`Registering validated factories for namespaces: ${namespaces.join(', ')} with ${validationType} validation`);
207
- try {
208
- // Load namespaced configuration from AWS
209
- const namespacedConfig = await this.awsConfigurationLoader.loadNamespacedConfiguration(namespaces);
210
- const sources = await this.awsConfigurationLoader.getAvailableSources();
211
- // Create validated factories for each namespace
212
- const factories = [];
213
- for (const namespace of namespaces) {
214
- const namespaceConfig = namespacedConfig[namespace];
215
- const validationSchema = validationSchemas[namespace];
216
- if (namespaceConfig && Object.keys(namespaceConfig).length > 0 && validationSchema) {
217
- try {
218
- // Create validated factory using the validation service
219
- const factory = this.validationService.createValidatedFactory(namespace, namespaceConfig, validationSchema, validationType, sources.filter(s => s.namespace === namespace || s.data[namespace]));
220
- factories.push(factory);
221
- // Track the factory
222
- this.registeredFactories.set(namespace, factory);
223
- this.logger.debug(`Created validated factory for namespace: ${namespace}`);
224
- }
225
- catch (error) {
226
- this.logger.error(`Failed to create validated factory for namespace ${namespace}:`, error);
227
- if (this.options.failOnAwsError) {
228
- throw error;
229
- }
230
- }
231
- }
232
- else {
233
- if (!namespaceConfig || Object.keys(namespaceConfig).length === 0) {
234
- this.logger.warn(`No configuration found for namespace: ${namespace}`);
235
- }
236
- if (!validationSchema) {
237
- this.logger.warn(`No validation schema provided for namespace: ${namespace}`);
238
- }
239
- }
240
- }
241
- this.logger.log(`Successfully registered ${factories.length} validated namespace factories`);
242
- return factories;
243
- }
244
- catch (error) {
245
- const validatedError = error instanceof Error ? error : new Error(String(error));
246
- this.logger.error('Failed to register validated namespace factories:', validatedError);
247
- if (this.options.failOnAwsError) {
248
- throw validatedError;
249
- }
250
- // Return empty factories if fallback is enabled
251
- return [];
252
- }
253
- }
254
- /**
255
- * Create enhanced namespace factories using the namespace handler service.
256
- * This method provides improved namespace support with better configuration extraction.
257
- *
258
- * @param namespaces - Array of namespace names to create factories for
259
- * @returns Promise resolving to array of enhanced namespace factories
260
- */
261
- async createEnhancedNamespaceFactories(namespaces) {
262
- this.logger.debug(`Creating enhanced namespace factories for: ${namespaces.join(', ')}`);
263
- try {
264
- // Load configuration from AWS sources
265
- const awsConfig = await this.awsConfigurationLoader.loadConfiguration();
266
- const sources = await this.awsConfigurationLoader.getAvailableSources();
267
- // Organize configuration by namespaces using the namespace handler
268
- const organizedConfig = this.namespaceHandler.organizeConfigByNamespaces(awsConfig, namespaces);
269
- // Create namespace factories using the namespace handler
270
- const factories = this.namespaceHandler.createMultipleNamespaceFactories(organizedConfig, sources);
271
- // Track the factories
272
- for (const factory of factories) {
273
- const namespace = factory.__namespace;
274
- if (namespace) {
275
- this.registeredFactories.set(namespace, factory);
276
- }
277
- }
278
- this.logger.log(`Successfully created ${factories.length} enhanced namespace factories`);
279
- return factories;
280
- }
281
- catch (error) {
282
- const enhancedError = error instanceof Error ? error : new Error(String(error));
283
- this.logger.error('Failed to create enhanced namespace factories:', enhancedError);
284
- if (this.options.failOnAwsError) {
285
- throw enhancedError;
286
- }
287
- return [];
288
- }
289
- }
290
- /**
291
- * Get validation recommendations for current configuration.
292
- * This method analyzes the loaded configuration and provides validation recommendations.
293
- *
294
- * @returns Promise resolving to validation recommendations
295
- */
296
- async getValidationRecommendations() {
297
- try {
298
- const awsConfig = await this.awsConfigurationLoader.loadConfiguration();
299
- return this.validationService.getValidationRecommendations(awsConfig);
300
- }
301
- catch (error) {
302
- this.logger.error('Failed to get validation recommendations:', error);
303
- return {
304
- recommendedProvider: 'custom',
305
- reasons: ['Unable to analyze configuration'],
306
- examples: {}
307
- };
308
- }
309
- }
310
- /**
311
- * Validate namespace access patterns for current configuration.
312
- * This method checks if namespace configurations are properly structured for @nestjs/config access.
313
- *
314
- * @param namespaces - Namespaces to validate
315
- * @returns Promise resolving to validation results
316
- */
317
- async validateNamespaceAccess(namespaces) {
318
- try {
319
- const namespacedConfig = await this.awsConfigurationLoader.loadNamespacedConfiguration(namespaces);
320
- const results = {};
321
- for (const [namespace, config] of Object.entries(namespacedConfig)) {
322
- results[namespace] = this.namespaceHandler.validateNamespaceAccess(namespace, config);
323
- }
324
- return results;
325
- }
326
- catch (error) {
327
- this.logger.error('Failed to validate namespace access:', error);
328
- return {};
329
- }
330
- }
331
- /**
332
- * Reset the factory registration state.
333
- * This method clears all registered factories and resets the initialization state.
334
- */
335
- reset() {
336
- this.logger.debug('Resetting factory registration state');
337
- this.registeredFactories.clear();
338
- this.isInitialized = false;
339
- }
340
- /**
341
- * Load configuration from AWS sources with error handling.
342
- * @returns Promise resolving to AWS configuration data
343
- */
344
- async loadAwsConfiguration() {
345
- try {
346
- // Check if namespaces are specified for targeted loading
347
- if (this.options.namespaces && this.options.namespaces.length > 0) {
348
- this.logger.debug(`Loading configuration for namespaces: ${this.options.namespaces.join(', ')}`);
349
- const namespacedConfig = await this.awsConfigurationLoader.loadNamespacedConfiguration(this.options.namespaces);
350
- // Flatten namespaced configuration for factory creation
351
- const flattenedConfig = {};
352
- for (const [namespace, config] of Object.entries(namespacedConfig)) {
353
- flattenedConfig[namespace] = config;
354
- }
355
- return flattenedConfig;
356
- }
357
- else {
358
- // Load all available configuration
359
- this.logger.debug('Loading all available AWS configuration');
360
- return await this.awsConfigurationLoader.loadConfiguration();
361
- }
362
- }
363
- catch (error) {
364
- const loadError = error instanceof Error ? error : new Error(String(error));
365
- this.logger.error('Failed to load AWS configuration:', loadError);
366
- // Handle AWS unavailability
367
- if (this.options.fallbackToLocal) {
368
- this.logger.warn('AWS configuration loading failed, using empty configuration');
369
- return {};
370
- }
371
- throw loadError;
372
- }
373
- }
374
- /**
375
- * Create configuration factories based on loaded AWS configuration.
376
- * @param awsConfig - Configuration data loaded from AWS
377
- * @returns Promise resolving to array of configuration factories
378
- */
379
- async createConfigurationFactories(awsConfig) {
380
- const factories = [];
381
- try {
382
- // Get configuration sources for metadata
383
- const sources = await this.awsConfigurationLoader.getAvailableSources();
384
- if (this.options.namespaces && this.options.namespaces.length > 0) {
385
- // Create namespaced factories
386
- factories.push(...this.createNamespacedFactoriesFromConfig(awsConfig, sources));
387
- }
388
- else {
389
- // Create a single factory with all configuration
390
- const factory = this.createSingleFactoryFromConfig(awsConfig, sources);
391
- if (factory) {
392
- factories.push(factory);
393
- }
394
- }
395
- this.logger.debug(`Created ${factories.length} configuration factories`);
396
- return factories;
397
- }
398
- catch (error) {
399
- const factoryError = error instanceof Error ? error : new Error(String(error));
400
- this.logger.error('Failed to create configuration factories:', factoryError);
401
- throw factoryError;
402
- }
403
- }
404
- /**
405
- * Create namespaced factories from configuration data.
406
- * @param config - Configuration data organized by namespace
407
- * @param sources - Configuration sources metadata
408
- * @returns Array of namespaced configuration factories
409
- */
410
- createNamespacedFactoriesFromConfig(config, sources) {
411
- const factories = [];
412
- for (const [namespace, namespaceConfig] of Object.entries(config)) {
413
- if (this.isValidNamespaceConfig(namespace, namespaceConfig)) {
414
- try {
415
- const factory = this.configurationFactoryProvider.createAwsConfigurationFactory(namespace, namespaceConfig, sources.filter(s => s.namespace === namespace || s.data[namespace]), this.options.precedence || 'aws-first');
416
- factories.push(factory);
417
- this.logger.debug(`Created namespaced factory: ${namespace}`);
418
- }
419
- catch (error) {
420
- this.logger.error(`Failed to create factory for namespace ${namespace}:`, error);
421
- }
422
- }
423
- }
424
- return factories;
425
- }
426
- /**
427
- * Create a single factory from all configuration data.
428
- * @param config - All configuration data
429
- * @param sources - Configuration sources metadata
430
- * @returns Single configuration factory or null if no valid configuration
431
- */
432
- createSingleFactoryFromConfig(config, sources) {
433
- if (!config || Object.keys(config).length === 0) {
434
- this.logger.warn('No configuration data available for factory creation');
435
- return null;
436
- }
437
- try {
438
- const factory = this.configurationFactoryProvider.createAwsConfigurationFactory(undefined, config, sources, this.options.precedence || 'aws-first');
439
- this.logger.debug('Created single configuration factory');
440
- return factory;
441
- }
442
- catch (error) {
443
- this.logger.error('Failed to create single configuration factory:', error);
444
- return null;
445
- }
446
- }
447
- /**
448
- * Register factories internally and track them.
449
- * @param factories - Array of factories to register
450
- */
451
- registerFactoriesInternal(factories) {
452
- for (const factory of factories) {
453
- // Determine factory name/key
454
- const factoryKey = this.getFactoryKey(factory);
455
- // Track the factory
456
- this.registeredFactories.set(factoryKey, factory);
457
- this.logger.debug(`Registered factory: ${factoryKey}`);
458
- }
459
- }
460
- /**
461
- * Get a unique key for a factory for tracking purposes.
462
- * @param factory - Configuration factory
463
- * @returns Unique key for the factory
464
- */
465
- getFactoryKey(factory) {
466
- // Check if it's an AWS configuration factory with namespace
467
- if ('namespace' in factory && factory.namespace) {
468
- return factory.namespace;
469
- }
470
- // Generate a unique key based on factory properties
471
- const factoryString = factory.toString();
472
- const hash = this.simpleHash(factoryString);
473
- return `factory_${hash}`;
474
- }
475
- /**
476
- * Generate a simple hash for factory identification.
477
- * @param str - String to hash
478
- * @returns Simple hash value
479
- */
480
- simpleHash(str) {
481
- let hash = 0;
482
- for (let i = 0; i < str.length; i++) {
483
- const char = str.charCodeAt(i);
484
- hash = ((hash << 5) - hash) + char;
485
- hash = hash & hash; // Convert to 32-bit integer
486
- }
487
- return Math.abs(hash).toString(36);
488
- }
489
- /**
490
- * Validate if a namespace configuration is valid.
491
- * @param namespace - The namespace name
492
- * @param config - The configuration data
493
- * @returns True if valid, false otherwise
494
- */
495
- isValidNamespaceConfig(namespace, config) {
496
- return typeof namespace === 'string' &&
497
- namespace.trim() !== '' &&
498
- config !== null &&
499
- config !== undefined &&
500
- typeof config === 'object' &&
501
- !Array.isArray(config);
502
- }
503
- };
504
- FactoryRegistrationService = FactoryRegistrationService_1 = __decorate([
505
- Injectable(),
506
- __param(4, Optional()),
507
- __param(4, Inject(NESTJS_CONFIG_AWS_INTEGRATION_OPTIONS)),
508
- __metadata("design:paramtypes", [ConfigurationFactoryProviderImpl,
509
- AwsConfigurationLoaderService,
510
- NamespaceHandlerService,
511
- ValidationIntegrationService, Object])
512
- ], FactoryRegistrationService);
513
- export { FactoryRegistrationService };
514
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS1yZWdpc3RyYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9pbnRlZ3JhdGlvbi9zZXJ2aWNlcy9mYWN0b3J5LXJlZ2lzdHJhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEUsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDL0YsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFHOUYsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDNUYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdEUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFaEY7Ozs7R0FJRztBQUVJLElBQU0sMEJBQTBCLGtDQUFoQyxNQUFNLDBCQUEwQjtJQU1sQjtJQUNBO0lBQ0E7SUFDQTtJQUVBO0lBVkYsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLDRCQUEwQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JELG1CQUFtQixHQUErQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3JFLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFFOUIsWUFDbUIsNEJBQThELEVBQzlELHNCQUFxRCxFQUNyRCxnQkFBeUMsRUFDekMsaUJBQStDLEVBRS9DLFVBQThCLEVBQUU7UUFMaEMsaUNBQTRCLEdBQTVCLDRCQUE0QixDQUFrQztRQUM5RCwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQStCO1FBQ3JELHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBeUI7UUFDekMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUE4QjtRQUUvQyxZ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QztZQUNuQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLDRCQUE0QjtRQUNsRCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxzQkFBc0IsQ0FBQyxTQUFpQixFQUFFLE1BQVc7UUFDM0QsT0FBTyxPQUFPLFNBQVMsS0FBSyxRQUFRO1lBQzdCLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO1lBQ3ZCLE1BQU0sS0FBSyxJQUFJO1lBQ2YsTUFBTSxLQUFLLFNBQVM7WUFDcEIsT0FBTyxNQUFNLEtBQUssUUFBUTtZQUMxQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztDQUNGLENBQUE7QUE3akJZLDBCQUEwQjtJQUR0QyxVQUFVLEVBQUU7SUFXUixXQUFBLFFBQVEsRUFBRSxDQUFBO0lBQUUsV0FBQSxNQUFNLENBQUMscUNBQXFDLENBQUMsQ0FBQTtxQ0FKWCxnQ0FBZ0M7UUFDdEMsNkJBQTZCO1FBQ25DLHVCQUF1QjtRQUN0Qiw0QkFBNEI7R0FUdkQsMEJBQTBCLENBNmpCdEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBMb2dnZXIsIEluamVjdCwgT3B0aW9uYWwgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbmZpZ0ZhY3RvcnkgfSBmcm9tICdAbmVzdGpzL2NvbmZpZyc7XHJcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25GYWN0b3J5UHJvdmlkZXJJbXBsIH0gZnJvbSAnLi4vcHJvdmlkZXJzL2NvbmZpZ3VyYXRpb24tZmFjdG9yeS5wcm92aWRlcic7XHJcbmltcG9ydCB7IEF3c0NvbmZpZ3VyYXRpb25Mb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vcHJvdmlkZXJzL2F3cy1jb25maWd1cmF0aW9uLWxvYWRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSW50ZWdyYXRpb25PcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pbnRlZ3JhdGlvbi1vcHRpb25zLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25Tb3VyY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmZpZ3VyYXRpb24tc291cmNlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IE5FU1RKU19DT05GSUdfQVdTX0lOVEVHUkFUSU9OX09QVElPTlMgfSBmcm9tICcuLi9uZXN0anMtY29uZmlnLWludGVncmF0aW9uLm1vZHVsZSc7XHJcbmltcG9ydCB7IE5hbWVzcGFjZUhhbmRsZXJTZXJ2aWNlIH0gZnJvbSAnLi9uYW1lc3BhY2UtaGFuZGxlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbkludGVncmF0aW9uU2VydmljZSB9IGZyb20gJy4vdmFsaWRhdGlvbi1pbnRlZ3JhdGlvbi5zZXJ2aWNlJztcclxuXHJcbi8qKlxyXG4gKiBTZXJ2aWNlIHJlc3BvbnNpYmxlIGZvciByZWdpc3RlcmluZyBjb25maWd1cmF0aW9uIGZhY3RvcmllcyB3aXRoIEBuZXN0anMvY29uZmlnLlxyXG4gKiBUaGlzIHNlcnZpY2UgY3JlYXRlcyBhbmQgbWFuYWdlcyB0aGUgYnJpZGdlIGJldHdlZW4gQVdTLWxvYWRlZCBjb25maWd1cmF0aW9uXHJcbiAqIGFuZCB0aGUgc3RhbmRhcmQgQG5lc3Rqcy9jb25maWcgbW9kdWxlLlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgRmFjdG9yeVJlZ2lzdHJhdGlvblNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihGYWN0b3J5UmVnaXN0cmF0aW9uU2VydmljZS5uYW1lKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdGVyZWRGYWN0b3JpZXM6IE1hcDxzdHJpbmcsIENvbmZpZ0ZhY3Rvcnk+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlndXJhdGlvbkZhY3RvcnlQcm92aWRlcjogQ29uZmlndXJhdGlvbkZhY3RvcnlQcm92aWRlckltcGwsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGF3c0NvbmZpZ3VyYXRpb25Mb2FkZXI6IEF3c0NvbmZpZ3VyYXRpb25Mb2FkZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBuYW1lc3BhY2VIYW5kbGVyOiBOYW1lc3BhY2VIYW5kbGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdGlvblNlcnZpY2U6IFZhbGlkYXRpb25JbnRlZ3JhdGlvblNlcnZpY2UsXHJcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE5FU1RKU19DT05GSUdfQVdTX0lOVEVHUkFUSU9OX09QVElPTlMpIFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBJbnRlZ3JhdGlvbk9wdGlvbnMgPSB7fVxyXG4gICkge31cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgY29uZmlndXJhdGlvbiBmYWN0b3JpZXMgd2l0aCBAbmVzdGpzL2NvbmZpZyBiYXNlZCBvbiBBV1MtbG9hZGVkIGNvbmZpZ3VyYXRpb24uXHJcbiAgICogVGhpcyBtZXRob2QgbG9hZHMgY29uZmlndXJhdGlvbiBmcm9tIEFXUyBzb3VyY2VzIGFuZCBjcmVhdGVzIGZhY3RvcmllcyB0aGF0IGNhbiBiZVxyXG4gICAqIGNvbnN1bWVkIGJ5IEBuZXN0anMvY29uZmlnLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFycmF5IG9mIHJlZ2lzdGVyZWQgY29uZmlndXJhdGlvbiBmYWN0b3JpZXNcclxuICAgKi9cclxuICBhc3luYyByZWdpc3RlckZhY3RvcmllcygpOiBQcm9taXNlPENvbmZpZ0ZhY3RvcnlbXT4ge1xyXG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnRmFjdG9yaWVzIGFscmVhZHkgcmVnaXN0ZXJlZCwgcmV0dXJuaW5nIGNhY2hlZCBmYWN0b3JpZXMnKTtcclxuICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5yZWdpc3RlcmVkRmFjdG9yaWVzLnZhbHVlcygpKTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnU3RhcnRpbmcgZmFjdG9yeSByZWdpc3RyYXRpb24gcHJvY2VzcycpO1xyXG4gICAgICBcclxuICAgICAgLy8gTG9hZCBjb25maWd1cmF0aW9uIGZyb20gQVdTIHNvdXJjZXNcclxuICAgICAgY29uc3QgYXdzQ29uZmlnID0gYXdhaXQgdGhpcy5sb2FkQXdzQ29uZmlndXJhdGlvbigpO1xyXG4gICAgICBcclxuICAgICAgLy8gQ3JlYXRlIGNvbmZpZ3VyYXRpb24gZmFjdG9yaWVzIGJhc2VkIG9uIG9wdGlvbnNcclxuICAgICAgY29uc3QgZmFjdG9yaWVzID0gYXdhaXQgdGhpcy5jcmVhdGVDb25maWd1cmF0aW9uRmFjdG9yaWVzKGF3c0NvbmZpZyk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBSZWdpc3RlciBmYWN0b3JpZXMgYW5kIHRyYWNrIHRoZW1cclxuICAgICAgdGhpcy5yZWdpc3RlckZhY3Rvcmllc0ludGVybmFsKGZhY3Rvcmllcyk7XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmxvZ2dlci5sb2coYFN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkICR7ZmFjdG9yaWVzLmxlbmd0aH0gY29uZmlndXJhdGlvbiBmYWN0b3JpZXNgKTtcclxuICAgICAgXHJcbiAgICAgIHJldHVybiBmYWN0b3JpZXM7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zdCByZWdpc3RyYXRpb25FcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byByZWdpc3RlciBjb25maWd1cmF0aW9uIGZhY3RvcmllczonLCByZWdpc3RyYXRpb25FcnJvcik7XHJcbiAgICAgIFxyXG4gICAgICAvLyBIYW5kbGUgcmVnaXN0cmF0aW9uIGZhaWx1cmUgYmFzZWQgb24gb3B0aW9uc1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhaWxPbkF3c0Vycm9yKSB7XHJcbiAgICAgICAgdGhyb3cgcmVnaXN0cmF0aW9uRXJyb3I7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIC8vIFJldHVybiBlbXB0eSBmYWN0b3JpZXMgYXJyYXkgaWYgZmFsbGJhY2sgaXMgZW5hYmxlZFxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhbGxiYWNrVG9Mb2NhbCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ0ZhbGxpbmcgYmFjayB0byBlbXB0eSBjb25maWd1cmF0aW9uIGZhY3RvcmllcyBkdWUgdG8gQVdTIGVycm9yJyk7XHJcbiAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aHJvdyByZWdpc3RyYXRpb25FcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24gZmFjdG9yaWVzIGFzeW5jaHJvbm91c2x5LlxyXG4gICAqIFRoaXMgbWV0aG9kIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBAbmVzdGpzL2NvbmZpZydzIGZvclJvb3RBc3luYyBwYXR0ZXJuLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFycmF5IG9mIGNvbmZpZ3VyYXRpb24gZmFjdG9yaWVzXHJcbiAgICovXHJcbiAgYXN5bmMgcmVnaXN0ZXJGYWN0b3JpZXNBc3luYygpOiBQcm9taXNlPENvbmZpZ0ZhY3RvcnlbXT4ge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ1N0YXJ0aW5nIGFzeW5jIGZhY3RvcnkgcmVnaXN0cmF0aW9uJyk7XHJcbiAgICBcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIEVuc3VyZSBBV1Mgc2VydmljZXMgYXJlIGF2YWlsYWJsZSBiZWZvcmUgcHJvY2VlZGluZ1xyXG4gICAgICBjb25zdCBpc0F3c0F2YWlsYWJsZSA9IGF3YWl0IHRoaXMuYXdzQ29uZmlndXJhdGlvbkxvYWRlci5pc0F2YWlsYWJsZSgpO1xyXG4gICAgICBcclxuICAgICAgaWYgKCFpc0F3c0F2YWlsYWJsZSAmJiB0aGlzLm9wdGlvbnMuZmFpbE9uQXdzRXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FXUyBzZXJ2aWNlcyBhcmUgbm90IGF2YWlsYWJsZSBhbmQgZmFpbE9uQXdzRXJyb3IgaXMgZW5hYmxlZCcpO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICBpZiAoIWlzQXdzQXZhaWxhYmxlKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybignQVdTIHNlcnZpY2VzIG5vdCBhdmFpbGFibGUsIHJlZ2lzdGVyaW5nIGVtcHR5IGZhY3RvcmllcycpO1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gTG9hZCBjb25maWd1cmF0aW9uIGFzeW5jaHJvbm91c2x5XHJcbiAgICAgIGNvbnN0IGZhY3RvcmllcyA9IGF3YWl0IHRoaXMucmVnaXN0ZXJGYWN0b3JpZXMoKTtcclxuICAgICAgXHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBBc3luYyBmYWN0b3J5IHJlZ2lzdHJhdGlvbiBjb21wbGV0ZWQgd2l0aCAke2ZhY3Rvcmllcy5sZW5ndGh9IGZhY3Rvcmllc2ApO1xyXG4gICAgICByZXR1cm4gZmFjdG9yaWVzO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgYXN5bmNFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0FzeW5jIGZhY3RvcnkgcmVnaXN0cmF0aW9uIGZhaWxlZDonLCBhc3luY0Vycm9yKTtcclxuICAgICAgXHJcbiAgICAgIC8vIEhhbmRsZSBhc3luYyByZWdpc3RyYXRpb24gZmFpbHVyZVxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhbGxiYWNrVG9Mb2NhbCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ0ZhbGxpbmcgYmFjayB0byBlbXB0eSBmYWN0b3JpZXMgZm9yIGFzeW5jIHJlZ2lzdHJhdGlvbicpO1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgdGhyb3cgYXN5bmNFcnJvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIHNpbmdsZSBjb25maWd1cmF0aW9uIGZhY3RvcnkgZm9yIGltbWVkaWF0ZSB1c2UuXHJcbiAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIHN5bmNocm9ub3VzIGZhY3RvcnkgY3JlYXRpb24uXHJcbiAgICogXHJcbiAgICogQHBhcmFtIG5hbWVzcGFjZSAtIE9wdGlvbmFsIG5hbWVzcGFjZSBmb3IgdGhlIGZhY3RvcnlcclxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBkYXRhIHRvIHVzZSBmb3IgdGhlIGZhY3RvcnlcclxuICAgKiBAcmV0dXJucyBDb25maWd1cmF0aW9uIGZhY3RvcnlcclxuICAgKi9cclxuICBjcmVhdGVTeW5jRmFjdG9yeShuYW1lc3BhY2U/OiBzdHJpbmcsIGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiBDb25maWdGYWN0b3J5IHtcclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDcmVhdGluZyBzeW5jaHJvbm91cyBmYWN0b3J5IGZvciBuYW1lc3BhY2U6ICR7bmFtZXNwYWNlIHx8ICdkZWZhdWx0J31gKTtcclxuICAgIFxyXG4gICAgLy8gVXNlIHByb3ZpZGVkIGNvbmZpZyBvciBjcmVhdGUgZW1wdHkgY29uZmlnXHJcbiAgICBjb25zdCBmYWN0b3J5Q29uZmlnID0gY29uZmlnIHx8IHt9O1xyXG4gICAgXHJcbiAgICAvLyBDcmVhdGUgZmFjdG9yeSB1c2luZyB0aGUgY29uZmlndXJhdGlvbiBmYWN0b3J5IHByb3ZpZGVyXHJcbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5jb25maWd1cmF0aW9uRmFjdG9yeVByb3ZpZGVyLmNyZWF0ZUZhY3RvcnkoXHJcbiAgICAgIG5hbWVzcGFjZSB8fCAnJyxcclxuICAgICAgZmFjdG9yeUNvbmZpZ1xyXG4gICAgKTtcclxuICAgIFxyXG4gICAgLy8gVHJhY2sgdGhlIGZhY3RvcnlcclxuICAgIGNvbnN0IGZhY3RvcnlLZXkgPSBuYW1lc3BhY2UgfHwgJ2RlZmF1bHQnO1xyXG4gICAgdGhpcy5yZWdpc3RlcmVkRmFjdG9yaWVzLnNldChmYWN0b3J5S2V5LCBmYWN0b3J5KTtcclxuICAgIFxyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYENyZWF0ZWQgc3luY2hyb25vdXMgZmFjdG9yeTogJHtmYWN0b3J5S2V5fWApO1xyXG4gICAgcmV0dXJuIGZhY3Rvcnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlciBmYWN0b3JpZXMgZm9yIHNwZWNpZmljIG5hbWVzcGFjZXMuXHJcbiAgICogVGhpcyBtZXRob2QgYWxsb3dzIHNlbGVjdGl2ZSByZWdpc3RyYXRpb24gb2YgY29uZmlndXJhdGlvbiBmb3Igc3BlY2lmaWMgbmFtZXNwYWNlcy5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gbmFtZXNwYWNlcyAtIEFycmF5IG9mIG5hbWVzcGFjZSBuYW1lcyB0byByZWdpc3RlclxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFycmF5IG9mIG5hbWVzcGFjZS1zcGVjaWZpYyBmYWN0b3JpZXNcclxuICAgKi9cclxuICBhc3luYyByZWdpc3Rlck5hbWVzcGFjZWRGYWN0b3JpZXMobmFtZXNwYWNlczogc3RyaW5nW10pOiBQcm9taXNlPENvbmZpZ0ZhY3RvcnlbXT4ge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYFJlZ2lzdGVyaW5nIGZhY3RvcmllcyBmb3IgbmFtZXNwYWNlczogJHtuYW1lc3BhY2VzLmpvaW4oJywgJyl9YCk7XHJcbiAgICBcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIExvYWQgbmFtZXNwYWNlZCBjb25maWd1cmF0aW9uIGZyb20gQVdTXHJcbiAgICAgIGNvbnN0IG5hbWVzcGFjZWRDb25maWcgPSBhd2FpdCB0aGlzLmF3c0NvbmZpZ3VyYXRpb25Mb2FkZXIubG9hZE5hbWVzcGFjZWRDb25maWd1cmF0aW9uKG5hbWVzcGFjZXMpO1xyXG4gICAgICBcclxuICAgICAgLy8gQ3JlYXRlIGZhY3RvcmllcyBmb3IgZWFjaCBuYW1lc3BhY2VcclxuICAgICAgY29uc3QgZmFjdG9yaWVzOiBDb25maWdGYWN0b3J5W10gPSBbXTtcclxuICAgICAgXHJcbiAgICAgIGZvciAoY29uc3QgbmFtZXNwYWNlIG9mIG5hbWVzcGFjZXMpIHtcclxuICAgICAgICBjb25zdCBuYW1lc3BhY2VDb25maWcgPSBuYW1lc3BhY2VkQ29uZmlnW25hbWVzcGFjZV07XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKG5hbWVzcGFjZUNvbmZpZyAmJiBPYmplY3Qua2V5cyhuYW1lc3BhY2VDb25maWcpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmNvbmZpZ3VyYXRpb25GYWN0b3J5UHJvdmlkZXIuY3JlYXRlRmFjdG9yeShuYW1lc3BhY2UsIG5hbWVzcGFjZUNvbmZpZyk7XHJcbiAgICAgICAgICBmYWN0b3JpZXMucHVzaChmYWN0b3J5KTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgLy8gVHJhY2sgdGhlIGZhY3RvcnlcclxuICAgICAgICAgIHRoaXMucmVnaXN0ZXJlZEZhY3Rvcmllcy5zZXQobmFtZXNwYWNlLCBmYWN0b3J5KTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYENyZWF0ZWQgZmFjdG9yeSBmb3IgbmFtZXNwYWNlOiAke25hbWVzcGFjZX1gKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgTm8gY29uZmlndXJhdGlvbiBmb3VuZCBmb3IgbmFtZXNwYWNlOiAke25hbWVzcGFjZX1gKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhgU3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQgJHtmYWN0b3JpZXMubGVuZ3RofSBuYW1lc3BhY2VkIGZhY3Rvcmllc2ApO1xyXG4gICAgICByZXR1cm4gZmFjdG9yaWVzO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgbmFtZXNwYWNlZEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIHJlZ2lzdGVyIG5hbWVzcGFjZWQgZmFjdG9yaWVzOicsIG5hbWVzcGFjZWRFcnJvcik7XHJcbiAgICAgIFxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhaWxPbkF3c0Vycm9yKSB7XHJcbiAgICAgICAgdGhyb3cgbmFtZXNwYWNlZEVycm9yO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAvLyBSZXR1cm4gZW1wdHkgZmFjdG9yaWVzIGlmIGZhbGxiYWNrIGlzIGVuYWJsZWRcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFsbCByZWdpc3RlcmVkIGZhY3Rvcmllcy5cclxuICAgKiBAcmV0dXJucyBNYXAgb2YgZmFjdG9yeSBuYW1lcyB0byBjb25maWd1cmF0aW9uIGZhY3Rvcmllc1xyXG4gICAqL1xyXG4gIGdldFJlZ2lzdGVyZWRGYWN0b3JpZXMoKTogTWFwPHN0cmluZywgQ29uZmlnRmFjdG9yeT4ge1xyXG4gICAgcmV0dXJuIG5ldyBNYXAodGhpcy5yZWdpc3RlcmVkRmFjdG9yaWVzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhIHNwZWNpZmljIHJlZ2lzdGVyZWQgZmFjdG9yeSBieSBuYW1lLlxyXG4gICAqIEBwYXJhbSBuYW1lIC0gTmFtZSBvZiB0aGUgZmFjdG9yeSB0byByZXRyaWV2ZVxyXG4gICAqIEByZXR1cm5zIENvbmZpZ3VyYXRpb24gZmFjdG9yeSBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXHJcbiAgICovXHJcbiAgZ2V0RmFjdG9yeShuYW1lOiBzdHJpbmcpOiBDb25maWdGYWN0b3J5IHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyZWRGYWN0b3JpZXMuZ2V0KG5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hlY2sgaWYgZmFjdG9yaWVzIGhhdmUgYmVlbiBpbml0aWFsaXplZC5cclxuICAgKiBAcmV0dXJucyBXaGV0aGVyIGZhY3RvcmllcyBoYXZlIGJlZW4gcmVnaXN0ZXJlZFxyXG4gICAqL1xyXG4gIGlzRmFjdG9yaWVzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0luaXRpYWxpemVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgdmFsaWRhdGVkIG5hbWVzcGFjZSBmYWN0b3JpZXMgd2l0aCBzY2hlbWEgdmFsaWRhdGlvbi5cclxuICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGZhY3RvcmllcyB0aGF0IHZhbGlkYXRlIGNvbmZpZ3VyYXRpb24gdXNpbmcgSm9pLCBjbGFzcy12YWxpZGF0b3IsIG9yIGN1c3RvbSBmdW5jdGlvbnMuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIG5hbWVzcGFjZXMgLSBBcnJheSBvZiBuYW1lc3BhY2UgbmFtZXMgdG8gcmVnaXN0ZXJcclxuICAgKiBAcGFyYW0gdmFsaWRhdGlvblNjaGVtYXMgLSBWYWxpZGF0aW9uIHNjaGVtYXMgZm9yIGVhY2ggbmFtZXNwYWNlXHJcbiAgICogQHBhcmFtIHZhbGlkYXRpb25UeXBlIC0gVHlwZSBvZiB2YWxpZGF0aW9uIHRvIHVzZVxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFycmF5IG9mIHZhbGlkYXRlZCBuYW1lc3BhY2UgZmFjdG9yaWVzXHJcbiAgICovXHJcbiAgYXN5bmMgcmVnaXN0ZXJWYWxpZGF0ZWROYW1lc3BhY2VGYWN0b3JpZXMoXHJcbiAgICBuYW1lc3BhY2VzOiBzdHJpbmdbXSxcclxuICAgIHZhbGlkYXRpb25TY2hlbWFzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxyXG4gICAgdmFsaWRhdGlvblR5cGU6ICdqb2knIHwgJ2NsYXNzLXZhbGlkYXRvcicgfCAnY3VzdG9tJyA9ICdjdXN0b20nXHJcbiAgKTogUHJvbWlzZTxDb25maWdGYWN0b3J5W10+IHtcclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBSZWdpc3RlcmluZyB2YWxpZGF0ZWQgZmFjdG9yaWVzIGZvciBuYW1lc3BhY2VzOiAke25hbWVzcGFjZXMuam9pbignLCAnKX0gd2l0aCAke3ZhbGlkYXRpb25UeXBlfSB2YWxpZGF0aW9uYCk7XHJcbiAgICBcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIExvYWQgbmFtZXNwYWNlZCBjb25maWd1cmF0aW9uIGZyb20gQVdTXHJcbiAgICAgIGNvbnN0IG5hbWVzcGFjZWRDb25maWcgPSBhd2FpdCB0aGlzLmF3c0NvbmZpZ3VyYXRpb25Mb2FkZXIubG9hZE5hbWVzcGFjZWRDb25maWd1cmF0aW9uKG5hbWVzcGFjZXMpO1xyXG4gICAgICBjb25zdCBzb3VyY2VzID0gYXdhaXQgdGhpcy5hd3NDb25maWd1cmF0aW9uTG9hZGVyLmdldEF2YWlsYWJsZVNvdXJjZXMoKTtcclxuICAgICAgXHJcbiAgICAgIC8vIENyZWF0ZSB2YWxpZGF0ZWQgZmFjdG9yaWVzIGZvciBlYWNoIG5hbWVzcGFjZVxyXG4gICAgICBjb25zdCBmYWN0b3JpZXM6IENvbmZpZ0ZhY3RvcnlbXSA9IFtdO1xyXG4gICAgICBcclxuICAgICAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2YgbmFtZXNwYWNlcykge1xyXG4gICAgICAgIGNvbnN0IG5hbWVzcGFjZUNvbmZpZyA9IG5hbWVzcGFjZWRDb25maWdbbmFtZXNwYWNlXTtcclxuICAgICAgICBjb25zdCB2YWxpZGF0aW9uU2NoZW1hID0gdmFsaWRhdGlvblNjaGVtYXNbbmFtZXNwYWNlXTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAobmFtZXNwYWNlQ29uZmlnICYmIE9iamVjdC5rZXlzKG5hbWVzcGFjZUNvbmZpZykubGVuZ3RoID4gMCAmJiB2YWxpZGF0aW9uU2NoZW1hKSB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyBDcmVhdGUgdmFsaWRhdGVkIGZhY3RvcnkgdXNpbmcgdGhlIHZhbGlkYXRpb24gc2VydmljZVxyXG4gICAgICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy52YWxpZGF0aW9uU2VydmljZS5jcmVhdGVWYWxpZGF0ZWRGYWN0b3J5KFxyXG4gICAgICAgICAgICAgIG5hbWVzcGFjZSxcclxuICAgICAgICAgICAgICBuYW1lc3BhY2VDb25maWcsXHJcbiAgICAgICAgICAgICAgdmFsaWRhdGlvblNjaGVtYSxcclxuICAgICAgICAgICAgICB2YWxpZGF0aW9uVHlwZSxcclxuICAgICAgICAgICAgICBzb3VyY2VzLmZpbHRlcihzID0+IHMubmFtZXNwYWNlID09PSBuYW1lc3BhY2UgfHwgcy5kYXRhW25hbWVzcGFjZV0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBmYWN0b3JpZXMucHVzaChmYWN0b3J5KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIFRyYWNrIHRoZSBmYWN0b3J5XHJcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJlZEZhY3Rvcmllcy5zZXQobmFtZXNwYWNlLCBmYWN0b3J5KTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDcmVhdGVkIHZhbGlkYXRlZCBmYWN0b3J5IGZvciBuYW1lc3BhY2U6ICR7bmFtZXNwYWNlfWApO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgdmFsaWRhdGVkIGZhY3RvcnkgZm9yIG5hbWVzcGFjZSAke25hbWVzcGFjZX06YCwgZXJyb3IpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5mYWlsT25Bd3NFcnJvcikge1xyXG4gICAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICghbmFtZXNwYWNlQ29uZmlnIHx8IE9iamVjdC5rZXlzKG5hbWVzcGFjZUNvbmZpZykubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYE5vIGNvbmZpZ3VyYXRpb24gZm91bmQgZm9yIG5hbWVzcGFjZTogJHtuYW1lc3BhY2V9YCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIXZhbGlkYXRpb25TY2hlbWEpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgTm8gdmFsaWRhdGlvbiBzY2hlbWEgcHJvdmlkZWQgZm9yIG5hbWVzcGFjZTogJHtuYW1lc3BhY2V9YCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmxvZ2dlci5sb2coYFN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkICR7ZmFjdG9yaWVzLmxlbmd0aH0gdmFsaWRhdGVkIG5hbWVzcGFjZSBmYWN0b3JpZXNgKTtcclxuICAgICAgcmV0dXJuIGZhY3RvcmllcztcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnN0IHZhbGlkYXRlZEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIHJlZ2lzdGVyIHZhbGlkYXRlZCBuYW1lc3BhY2UgZmFjdG9yaWVzOicsIHZhbGlkYXRlZEVycm9yKTtcclxuICAgICAgXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFpbE9uQXdzRXJyb3IpIHtcclxuICAgICAgICB0aHJvdyB2YWxpZGF0ZWRFcnJvcjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gUmV0dXJuIGVtcHR5IGZhY3RvcmllcyBpZiBmYWxsYmFjayBpcyBlbmFibGVkXHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBlbmhhbmNlZCBuYW1lc3BhY2UgZmFjdG9yaWVzIHVzaW5nIHRoZSBuYW1lc3BhY2UgaGFuZGxlciBzZXJ2aWNlLlxyXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGltcHJvdmVkIG5hbWVzcGFjZSBzdXBwb3J0IHdpdGggYmV0dGVyIGNvbmZpZ3VyYXRpb24gZXh0cmFjdGlvbi5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gbmFtZXNwYWNlcyAtIEFycmF5IG9mIG5hbWVzcGFjZSBuYW1lcyB0byBjcmVhdGUgZmFjdG9yaWVzIGZvclxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFycmF5IG9mIGVuaGFuY2VkIG5hbWVzcGFjZSBmYWN0b3JpZXNcclxuICAgKi9cclxuICBhc3luYyBjcmVhdGVFbmhhbmNlZE5hbWVzcGFjZUZhY3RvcmllcyhuYW1lc3BhY2VzOiBzdHJpbmdbXSk6IFByb21pc2U8Q29uZmlnRmFjdG9yeVtdPiB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQ3JlYXRpbmcgZW5oYW5jZWQgbmFtZXNwYWNlIGZhY3RvcmllcyBmb3I6ICR7bmFtZXNwYWNlcy5qb2luKCcsICcpfWApO1xyXG4gICAgXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBMb2FkIGNvbmZpZ3VyYXRpb24gZnJvbSBBV1Mgc291cmNlc1xyXG4gICAgICBjb25zdCBhd3NDb25maWcgPSBhd2FpdCB0aGlzLmF3c0NvbmZpZ3VyYXRpb25Mb2FkZXIubG9hZENvbmZpZ3VyYXRpb24oKTtcclxuICAgICAgY29uc3Qgc291cmNlcyA9IGF3YWl0IHRoaXMuYXdzQ29uZmlndXJhdGlvbkxvYWRlci5nZXRBdmFpbGFibGVTb3VyY2VzKCk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBPcmdhbml6ZSBjb25maWd1cmF0aW9uIGJ5IG5hbWVzcGFjZXMgdXNpbmcgdGhlIG5hbWVzcGFjZSBoYW5kbGVyXHJcbiAgICAgIGNvbnN0IG9yZ2FuaXplZENvbmZpZyA9IHRoaXMubmFtZXNwYWNlSGFuZGxlci5vcmdhbml6ZUNvbmZpZ0J5TmFtZXNwYWNlcyhhd3NDb25maWcsIG5hbWVzcGFjZXMpO1xyXG4gICAgICBcclxuICAgICAgLy8gQ3JlYXRlIG5hbWVzcGFjZSBmYWN0b3JpZXMgdXNpbmcgdGhlIG5hbWVzcGFjZSBoYW5kbGVyXHJcbiAgICAgIGNvbnN0IGZhY3RvcmllcyA9IHRoaXMubmFtZXNwYWNlSGFuZGxlci5jcmVhdGVNdWx0aXBsZU5hbWVzcGFjZUZhY3Rvcmllcyhvcmdhbml6ZWRDb25maWcsIHNvdXJjZXMpO1xyXG4gICAgICBcclxuICAgICAgLy8gVHJhY2sgdGhlIGZhY3Rvcmllc1xyXG4gICAgICBmb3IgKGNvbnN0IGZhY3Rvcnkgb2YgZmFjdG9yaWVzKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlID0gKGZhY3RvcnkgYXMgYW55KS5fX25hbWVzcGFjZTtcclxuICAgICAgICBpZiAobmFtZXNwYWNlKSB7XHJcbiAgICAgICAgICB0aGlzLnJlZ2lzdGVyZWRGYWN0b3JpZXMuc2V0KG5hbWVzcGFjZSwgZmFjdG9yeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmxvZ2dlci5sb2coYFN1Y2Nlc3NmdWxseSBjcmVhdGVkICR7ZmFjdG9yaWVzLmxlbmd0aH0gZW5oYW5jZWQgbmFtZXNwYWNlIGZhY3Rvcmllc2ApO1xyXG4gICAgICByZXR1cm4gZmFjdG9yaWVzO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgZW5oYW5jZWRFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgZW5oYW5jZWQgbmFtZXNwYWNlIGZhY3RvcmllczonLCBlbmhhbmNlZEVycm9yKTtcclxuICAgICAgXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmFpbE9uQXdzRXJyb3IpIHtcclxuICAgICAgICB0aHJvdyBlbmhhbmNlZEVycm9yO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdmFsaWRhdGlvbiByZWNvbW1lbmRhdGlvbnMgZm9yIGN1cnJlbnQgY29uZmlndXJhdGlvbi5cclxuICAgKiBUaGlzIG1ldGhvZCBhbmFseXplcyB0aGUgbG9hZGVkIGNvbmZpZ3VyYXRpb24gYW5kIHByb3ZpZGVzIHZhbGlkYXRpb24gcmVjb21tZW5kYXRpb25zLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHZhbGlkYXRpb24gcmVjb21tZW5kYXRpb25zXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0VmFsaWRhdGlvblJlY29tbWVuZGF0aW9ucygpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGF3c0NvbmZpZyA9IGF3YWl0IHRoaXMuYXdzQ29uZmlndXJhdGlvbkxvYWRlci5sb2FkQ29uZmlndXJhdGlvbigpO1xyXG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0aW9uU2VydmljZS5nZXRWYWxpZGF0aW9uUmVjb21tZW5kYXRpb25zKGF3c0NvbmZpZyk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGdldCB2YWxpZGF0aW9uIHJlY29tbWVuZGF0aW9uczonLCBlcnJvcik7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgcmVjb21tZW5kZWRQcm92aWRlcjogJ2N1c3RvbScsXHJcbiAgICAgICAgcmVhc29uczogWydVbmFibGUgdG8gYW5hbHl6ZSBjb25maWd1cmF0aW9uJ10sXHJcbiAgICAgICAgZXhhbXBsZXM6IHt9XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZSBuYW1lc3BhY2UgYWNjZXNzIHBhdHRlcm5zIGZvciBjdXJyZW50IGNvbmZpZ3VyYXRpb24uXHJcbiAgICogVGhpcyBtZXRob2QgY2hlY2tzIGlmIG5hbWVzcGFjZSBjb25maWd1cmF0aW9ucyBhcmUgcHJvcGVybHkgc3RydWN0dXJlZCBmb3IgQG5lc3Rqcy9jb25maWcgYWNjZXNzLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBuYW1lc3BhY2VzIC0gTmFtZXNwYWNlcyB0byB2YWxpZGF0ZVxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHZhbGlkYXRpb24gcmVzdWx0c1xyXG4gICAqL1xyXG4gIGFzeW5jIHZhbGlkYXRlTmFtZXNwYWNlQWNjZXNzKG5hbWVzcGFjZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBuYW1lc3BhY2VkQ29uZmlnID0gYXdhaXQgdGhpcy5hd3NDb25maWd1cmF0aW9uTG9hZGVyLmxvYWROYW1lc3BhY2VkQ29uZmlndXJhdGlvbihuYW1lc3BhY2VzKTtcclxuICAgICAgY29uc3QgcmVzdWx0czogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG4gICAgICBcclxuICAgICAgZm9yIChjb25zdCBbbmFtZXNwYWNlLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKG5hbWVzcGFjZWRDb25maWcpKSB7XHJcbiAgICAgICAgcmVzdWx0c1tuYW1lc3BhY2VdID0gdGhpcy5uYW1lc3BhY2VIYW5kbGVyLnZhbGlkYXRlTmFtZXNwYWNlQWNjZXNzKG5hbWVzcGFjZSwgY29uZmlnKTtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcignRmFpbGVkIHRvIHZhbGlkYXRlIG5hbWVzcGFjZSBhY2Nlc3M6JywgZXJyb3IpO1xyXG4gICAgICByZXR1cm4ge307XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNldCB0aGUgZmFjdG9yeSByZWdpc3RyYXRpb24gc3RhdGUuXHJcbiAgICogVGhpcyBtZXRob2QgY2xlYXJzIGFsbCByZWdpc3RlcmVkIGZhY3RvcmllcyBhbmQgcmVzZXRzIHRoZSBpbml0aWFsaXphdGlvbiBzdGF0ZS5cclxuICAgKi9cclxuICByZXNldCgpOiB2b2lkIHtcclxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdSZXNldHRpbmcgZmFjdG9yeSByZWdpc3RyYXRpb24gc3RhdGUnKTtcclxuICAgIHRoaXMucmVnaXN0ZXJlZEZhY3Rvcmllcy5jbGVhcigpO1xyXG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2FkIGNvbmZpZ3VyYXRpb24gZnJvbSBBV1Mgc291cmNlcyB3aXRoIGVycm9yIGhhbmRsaW5nLlxyXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIEFXUyBjb25maWd1cmF0aW9uIGRhdGFcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGxvYWRBd3NDb25maWd1cmF0aW9uKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gQ2hlY2sgaWYgbmFtZXNwYWNlcyBhcmUgc3BlY2lmaWVkIGZvciB0YXJnZXRlZCBsb2FkaW5nXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubmFtZXNwYWNlcyAmJiB0aGlzLm9wdGlvbnMubmFtZXNwYWNlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYExvYWRpbmcgY29uZmlndXJhdGlvbiBmb3IgbmFtZXNwYWNlczogJHt0aGlzLm9wdGlvbnMubmFtZXNwYWNlcy5qb2luKCcsICcpfWApO1xyXG4gICAgICAgIGNvbnN0IG5hbWVzcGFjZWRDb25maWcgPSBhd2FpdCB0aGlzLmF3c0NvbmZpZ3VyYXRpb25Mb2FkZXIubG9hZE5hbWVzcGFjZWRDb25maWd1cmF0aW9uKHRoaXMub3B0aW9ucy5uYW1lc3BhY2VzKTtcclxuICAgICAgICBcclxuICAgICAgICAvLyBGbGF0dGVuIG5hbWVzcGFjZWQgY29uZmlndXJhdGlvbiBmb3IgZmFjdG9yeSBjcmVhdGlvblxyXG4gICAgICAgIGNvbnN0IGZsYXR0ZW5lZENvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG4gICAgICAgIGZvciAoY29uc3QgW25hbWVzcGFjZSwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhuYW1lc3BhY2VkQ29uZmlnKSkge1xyXG4gICAgICAgICAgZmxhdHRlbmVkQ29uZmlnW25hbWVzcGFjZV0gPSBjb25maWc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBmbGF0dGVuZWRDb25maWc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gTG9hZCBhbGwgYXZhaWxhYmxlIGNvbmZpZ3VyYXRpb25cclxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnTG9hZGluZyBhbGwgYXZhaWxhYmxlIEFXUyBjb25maWd1cmF0aW9uJyk7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXdzQ29uZmlndXJhdGlvbkxvYWRlci5sb2FkQ29uZmlndXJhdGlvbigpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zdCBsb2FkRXJyb3IgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSk7XHJcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBBV1MgY29uZmlndXJhdGlvbjonLCBsb2FkRXJyb3IpO1xyXG4gICAgICBcclxuICAgICAgLy8gSGFuZGxlIEFXUyB1bmF2YWlsYWJpbGl0eVxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZhbGxiYWNrVG9Mb2NhbCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ0FXUyBjb25maWd1cmF0aW9uIGxvYWRpbmcgZmFpbGVkLCB1c2luZyBlbXB0eSBjb25maWd1cmF0aW9uJyk7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICB0aHJvdyBsb2FkRXJyb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgY29uZmlndXJhdGlvbiBmYWN0b3JpZXMgYmFzZWQgb24gbG9hZGVkIEFXUyBjb25maWd1cmF0aW9uLlxyXG4gICAqIEBwYXJhbSBhd3NDb25maWcgLSBDb25maWd1cmF0aW9uIGRhdGEgbG9hZGVkIGZyb20gQVdTXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gYXJyYXkgb2YgY29uZmlndXJhdGlvbiBmYWN0b3JpZXNcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZUNvbmZpZ3VyYXRpb25GYWN0b3JpZXMoYXdzQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUHJvbWlzZTxDb25maWdGYWN0b3J5W10+IHtcclxuICAgIGNvbnN0IGZhY3RvcmllczogQ29uZmlnRmFjdG9yeVtdID0gW107XHJcbiAgICBcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIEdldCBjb25maWd1cmF0aW9uIHNvdXJjZXMgZm9yIG1ldGFkYXRhXHJcbiAgICAgIGNvbnN0IHNvdXJjZXMgPSBhd2FpdCB0aGlzLmF3c0NvbmZpZ3VyYXRpb25Mb2FkZXIuZ2V0QXZhaWxhYmxlU291cmNlcygpO1xyXG4gICAgICBcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5uYW1lc3BhY2VzICYmIHRoaXMub3B0aW9ucy5uYW1lc3BhY2VzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAvLyBDcmVhdGUgbmFtZXNwYWNlZCBmYWN0b3JpZXNcclxuICAgICAgICBmYWN0b3JpZXMucHVzaCguLi50aGlzLmNyZWF0ZU5hbWVzcGFjZWRGYWN0b3JpZXNGcm9tQ29uZmlnKGF3c0NvbmZpZywgc291cmNlcykpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIENyZWF0ZSBhIHNpbmdsZSBmYWN0b3J5IHdpdGggYWxsIGNvbmZpZ3VyYXRpb25cclxuICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5jcmVhdGVTaW5nbGVGYWN0b3J5RnJvbUNvbmZpZyhhd3NDb25maWcsIHNvdXJjZXMpO1xyXG4gICAgICAgIGlmIChmYWN0b3J5KSB7XHJcbiAgICAgICAgICBmYWN0b3JpZXMucHVzaChmYWN0b3J5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBDcmVhdGVkICR7ZmFjdG9yaWVzLmxlbmd0aH0gY29uZmlndXJhdGlvbiBmYWN0b3JpZXNgKTtcclxuICAgICAgcmV0dXJuIGZhY3RvcmllcztcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnN0IGZhY3RvcnlFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgY29uZmlndXJhdGlvbiBmYWN0b3JpZXM6JywgZmFjdG9yeUVycm9yKTtcclxuICAgICAgdGhyb3cgZmFjdG9yeUVycm9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIG5hbWVzcGFjZWQgZmFjdG9yaWVzIGZyb20gY29uZmlndXJhdGlvbiBkYXRhLlxyXG4gICAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIGRhdGEgb3JnYW5pemVkIGJ5IG5hbWVzcGFjZVxyXG4gICAqIEBwYXJhbSBzb3VyY2VzIC0gQ29uZmlndXJhdGlvbiBzb3VyY2VzIG1ldGFkYXRhXHJcbiAgICogQHJldHVybnMgQXJyYXkgb2YgbmFtZXNwYWNlZCBjb25maWd1cmF0aW9uIGZhY3Rvcmllc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgY3JlYXRlTmFtZXNwYWNlZEZhY3Rvcmllc0Zyb21Db25maWcoXHJcbiAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXHJcbiAgICBzb3VyY2VzOiBDb25maWd1cmF0aW9uU291cmNlW11cclxuICApOiBDb25maWdGYWN0b3J5W10ge1xyXG4gICAgY29uc3QgZmFjdG9yaWVzOiBDb25maWdGYWN0b3J5W10gPSBbXTtcclxuICAgIFxyXG4gICAgZm9yIChjb25zdCBbbmFtZXNwYWNlLCBuYW1lc3BhY2VDb25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZykpIHtcclxuICAgICAgaWYgKHRoaXMuaXNWYWxpZE5hbWVzcGFjZUNvbmZpZyhuYW1lc3BhY2UsIG5hbWVzcGFjZUNvbmZpZykpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuY29uZmlndXJhdGlvbkZhY3RvcnlQcm92aWRlci5jcmVhdGVBd3NDb25maWd1cmF0aW9uRmFjdG9yeShcclxuICAgICAgICAgICAgbmFtZXNwYWNlLFxyXG4gICAgICAgICAgICBuYW1lc3BhY2VDb25maWcgYXMgUmVjb3JkPHN0cmluZywgYW55PixcclxuICAgICAgICAgICAgc291cmNlcy5maWx0ZXIocyA9PiBzLm5hbWVzcGFjZSA9PT0gbmFtZXNwYWNlIHx8IHMuZGF0YVtuYW1lc3BhY2VdKSxcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnByZWNlZGVuY2UgfHwgJ2F3cy1maXJzdCdcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIGZhY3Rvcmllcy5wdXNoKGZhY3RvcnkpO1xyXG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYENyZWF0ZWQgbmFtZXNwYWNlZCBmYWN0b3J5OiAke25hbWVzcGFjZX1gKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgZmFjdG9yeSBmb3IgbmFtZXNwYWNlICR7bmFtZXNwYWNlfTpgLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiBmYWN0b3JpZXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBzaW5nbGUgZmFjdG9yeSBmcm9tIGFsbCBjb25maWd1cmF0aW9uIGRhdGEuXHJcbiAgICogQHBhcmFtIGNvbmZpZyAtIEFsbCBjb25maWd1cmF0aW9uIGRhdGFcclxuICAgKiBAcGFyYW0gc291cmNlcyAtIENvbmZpZ3VyYXRpb24gc291cmNlcyBtZXRhZGF0YVxyXG4gICAqIEByZXR1cm5zIFNpbmdsZSBjb25maWd1cmF0aW9uIGZhY3Rvcnkgb3IgbnVsbCBpZiBubyB2YWxpZCBjb25maWd1cmF0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVTaW5nbGVGYWN0b3J5RnJvbUNvbmZpZyhcclxuICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55PixcclxuICAgIHNvdXJjZXM6IENvbmZpZ3VyYXRpb25Tb3VyY2VbXVxyXG4gICk6IENvbmZpZ0ZhY3RvcnkgfCBudWxsIHtcclxuICAgIGlmICghY29uZmlnIHx8IE9iamVjdC5rZXlzKGNvbmZpZykubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ05vIGNvbmZpZ3VyYXRpb24gZGF0YSBhdmFpbGFibGUgZm9yIGZhY3RvcnkgY3JlYXRpb24nKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmNvbmZpZ3VyYXRpb25GYWN0b3J5UHJvdmlkZXIuY3JlYXRlQXdzQ29uZmlndXJhdGlvbkZhY3RvcnkoXHJcbiAgICAgICAgdW5kZWZpbmVkLFxyXG4gICAgICAgIGNvbmZpZyxcclxuICAgICAgICBzb3VyY2VzLFxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wcmVjZWRlbmNlIHx8ICdhd3MtZmlyc3QnXHJcbiAgICAgICk7XHJcbiAgICAgIFxyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQ3JlYXRlZCBzaW5nbGUgY29uZmlndXJhdGlvbiBmYWN0b3J5Jyk7XHJcbiAgICAgIHJldHVybiBmYWN0b3J5O1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgc2luZ2xlIGNvbmZpZ3VyYXRpb24gZmFjdG9yeTonLCBlcnJvcik7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgZmFjdG9yaWVzIGludGVybmFsbHkgYW5kIHRyYWNrIHRoZW0uXHJcbiAgICogQHBhcmFtIGZhY3RvcmllcyAtIEFycmF5IG9mIGZhY3RvcmllcyB0byByZWdpc3RlclxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVnaXN0ZXJGYWN0b3JpZXNJbnRlcm5hbChmYWN0b3JpZXM6IENvbmZpZ0ZhY3RvcnlbXSk6IHZvaWQge1xyXG4gICAgZm9yIChjb25zdCBmYWN0b3J5IG9mIGZhY3Rvcmllcykge1xyXG4gICAgICAvLyBEZXRlcm1pbmUgZmFjdG9yeSBuYW1lL2tleVxyXG4gICAgICBjb25zdCBmYWN0b3J5S2V5ID0gdGhpcy5nZXRGYWN0b3J5S2V5KGZhY3RvcnkpO1xyXG4gICAgICBcclxuICAgICAgLy8gVHJhY2sgdGhlIGZhY3RvcnlcclxuICAgICAgdGhpcy5yZWdpc3RlcmVkRmFjdG9yaWVzLnNldChmYWN0b3J5S2V5LCBmYWN0b3J5KTtcclxuICAgICAgXHJcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBSZWdpc3RlcmVkIGZhY3Rvcnk6ICR7ZmFjdG9yeUtleX1gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhIHVuaXF1ZSBrZXkgZm9yIGEgZmFjdG9yeSBmb3IgdHJhY2tpbmcgcHVycG9zZXMuXHJcbiAgICogQHBhcmFtIGZhY3RvcnkgLSBDb25maWd1cmF0aW9uIGZhY3RvcnlcclxuICAgKiBAcmV0dXJucyBVbmlxdWUga2V5IGZvciB0aGUgZmFjdG9yeVxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0RmFjdG9yeUtleShmYWN0b3J5OiBDb25maWdGYWN0b3J5KTogc3RyaW5nIHtcclxuICAgIC8vIENoZWNrIGlmIGl0J3MgYW4gQVdTIGNvbmZpZ3VyYXRpb24gZmFjdG9yeSB3aXRoIG5hbWVzcGFjZVxyXG4gICAgaWYgKCduYW1lc3BhY2UnIGluIGZhY3RvcnkgJiYgZmFjdG9yeS5uYW1lc3BhY2UpIHtcclxuICAgICAgcmV0dXJuIGZhY3RvcnkubmFtZXNwYWNlIGFzIHN0cmluZztcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8gR2VuZXJhdGUgYSB1bmlxdWUga2V5IGJhc2VkIG9uIGZhY3RvcnkgcHJvcGVydGllc1xyXG4gICAgY29uc3QgZmFjdG9yeVN0cmluZyA9IGZhY3RvcnkudG9TdHJpbmcoKTtcclxuICAgIGNvbnN0IGhhc2ggPSB0aGlzLnNpbXBsZUhhc2goZmFjdG9yeVN0cmluZyk7XHJcbiAgICBcclxuICAgIHJldHVybiBgZmFjdG9yeV8ke2hhc2h9YDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgc2ltcGxlIGhhc2ggZm9yIGZhY3RvcnkgaWRlbnRpZmljYXRpb24uXHJcbiAgICogQHBhcmFtIHN0ciAtIFN0cmluZyB0byBoYXNoXHJcbiAgICogQHJldHVybnMgU2ltcGxlIGhhc2ggdmFsdWVcclxuICAgKi9cclxuICBwcml2YXRlIHNpbXBsZUhhc2goc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IGhhc2ggPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICBoYXNoID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBjaGFyO1xyXG4gICAgICBoYXNoID0gaGFzaCAmIGhhc2g7IC8vIENvbnZlcnQgdG8gMzItYml0IGludGVnZXJcclxuICAgIH1cclxuICAgIHJldHVybiBNYXRoLmFicyhoYXNoKS50b1N0cmluZygzNik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZSBpZiBhIG5hbWVzcGFjZSBjb25maWd1cmF0aW9uIGlzIHZhbGlkLlxyXG4gICAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIG5hbWVcclxuICAgKiBAcGFyYW0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gZGF0YVxyXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdmFsaWQsIGZhbHNlIG90aGVyd2lzZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaXNWYWxpZE5hbWVzcGFjZUNvbmZpZyhuYW1lc3BhY2U6IHN0cmluZywgY29uZmlnOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0eXBlb2YgbmFtZXNwYWNlID09PSAnc3RyaW5nJyAmJiBcclxuICAgICAgICAgICBuYW1lc3BhY2UudHJpbSgpICE9PSAnJyAmJlxyXG4gICAgICAgICAgIGNvbmZpZyAhPT0gbnVsbCAmJlxyXG4gICAgICAgICAgIGNvbmZpZyAhPT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgICAgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiZcclxuICAgICAgICAgICAhQXJyYXkuaXNBcnJheShjb25maWcpO1xyXG4gIH1cclxufSJdfQ==
@@ -1,10 +0,0 @@
1
- // Integration services exports
2
- export * from './integration-state.service';
3
- export * from './error-handler.service';
4
- export * from './precedence-handler.service';
5
- export * from './factory-registration.service';
6
- export * from './nestjs-config-integration.service';
7
- export * from './async-config-helper.service';
8
- export * from './namespace-handler.service';
9
- export * from './validation-integration.service';
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvaW50ZWdyYXRpb24vc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyxxQ0FBcUMsQ0FBQztBQUNwRCxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxrQ0FBa0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEludGVncmF0aW9uIHNlcnZpY2VzIGV4cG9ydHNcclxuZXhwb3J0ICogZnJvbSAnLi9pbnRlZ3JhdGlvbi1zdGF0ZS5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9lcnJvci1oYW5kbGVyLnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL3ByZWNlZGVuY2UtaGFuZGxlci5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9mYWN0b3J5LXJlZ2lzdHJhdGlvbi5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9uZXN0anMtY29uZmlnLWludGVncmF0aW9uLnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2FzeW5jLWNvbmZpZy1oZWxwZXIuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbmFtZXNwYWNlLWhhbmRsZXIuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdmFsaWRhdGlvbi1pbnRlZ3JhdGlvbi5zZXJ2aWNlJzsiXX0=