@dyanet/nestjs-config-aws 1.0.1 → 1.2.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 (391) hide show
  1. package/README.md +213 -1013
  2. package/dist/cjs/config-aws/src/config-manager.js +366 -0
  3. package/dist/cjs/config-aws/src/errors/index.js +77 -0
  4. package/dist/cjs/config-aws/src/index.js +37 -0
  5. package/dist/cjs/config-aws/src/interfaces/config-loader.interface.js +3 -0
  6. package/dist/cjs/config-aws/src/interfaces/config-manager.interface.js +3 -0
  7. package/dist/cjs/config-aws/src/interfaces/env-file-loader.interface.js +3 -0
  8. package/dist/cjs/config-aws/src/interfaces/environment-loader.interface.js +3 -0
  9. package/dist/cjs/config-aws/src/interfaces/s3-loader.interface.js +3 -0
  10. package/dist/cjs/config-aws/src/interfaces/secrets-manager-loader.interface.js +3 -0
  11. package/dist/cjs/config-aws/src/interfaces/ssm-parameter-store-loader.interface.js +3 -0
  12. package/dist/cjs/config-aws/src/loaders/env-file.loader.js +169 -0
  13. package/dist/cjs/config-aws/src/loaders/environment.loader.js +85 -0
  14. package/dist/cjs/config-aws/src/loaders/s3.loader.js +145 -0
  15. package/dist/cjs/config-aws/src/loaders/secrets-manager.loader.js +169 -0
  16. package/dist/cjs/config-aws/src/loaders/ssm-parameter-store.loader.js +199 -0
  17. package/dist/cjs/config-aws/src/utils/env-file-parser.util.js +98 -0
  18. package/dist/cjs/config-aws/src/utils/validation.util.js +116 -0
  19. package/dist/cjs/nestjs-config-aws/src/config.module.js +175 -0
  20. package/dist/cjs/nestjs-config-aws/src/index.js +61 -0
  21. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/index.js +1 -1
  22. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.js +3 -0
  23. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.js +3 -0
  24. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/interfaces/index.js +1 -1
  25. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/integration-options.interface.js +3 -0
  26. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/integration-state.interface.js +3 -0
  27. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.js +73 -0
  28. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.js +3 -0
  29. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.js +4 -0
  30. package/dist/cjs/nestjs-config-aws/src/integration/interfaces/utility-types.interface.js +52 -0
  31. package/dist/cjs/nestjs-config-aws/src/integration/nestjs-config-integration.module.js +124 -0
  32. package/dist/cjs/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.js +592 -0
  33. package/dist/cjs/nestjs-config-aws/src/integration/providers/configuration-factory.provider.js +385 -0
  34. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/providers/index.js +1 -1
  35. package/dist/cjs/nestjs-config-aws/src/integration/services/async-config-helper.service.js +366 -0
  36. package/dist/cjs/nestjs-config-aws/src/integration/services/error-handler.service.js +267 -0
  37. package/dist/cjs/nestjs-config-aws/src/integration/services/factory-registration.service.js +517 -0
  38. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/services/index.js +1 -1
  39. package/dist/cjs/nestjs-config-aws/src/integration/services/integration-state.service.js +81 -0
  40. package/dist/cjs/nestjs-config-aws/src/integration/services/namespace-handler.service.js +465 -0
  41. package/dist/cjs/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js +318 -0
  42. package/dist/cjs/nestjs-config-aws/src/integration/services/precedence-handler.service.js +292 -0
  43. package/dist/cjs/nestjs-config-aws/src/integration/services/validation-integration.service.js +595 -0
  44. package/dist/cjs/nestjs-config-aws/src/integration/utils/config-integration.util.js +283 -0
  45. package/dist/cjs/{integration → nestjs-config-aws/src/integration}/utils/index.js +1 -1
  46. package/dist/cjs/nestjs-config-aws/src/interfaces/config-service.interface.js +11 -0
  47. package/dist/cjs/nestjs-config-aws/src/interfaces/default-schema.interface.js +63 -0
  48. package/dist/cjs/nestjs-config-aws/src/interfaces/index.js +30 -0
  49. package/dist/cjs/nestjs-config-aws/src/interfaces/module-options.interface.js +3 -0
  50. package/dist/cjs/nestjs-config-aws/src/services/config.service.js +142 -0
  51. package/dist/esm/config-aws/src/config-manager.js +362 -0
  52. package/dist/esm/config-aws/src/errors/index.js +69 -0
  53. package/dist/esm/config-aws/src/index.js +21 -0
  54. package/dist/esm/config-aws/src/interfaces/config-loader.interface.js +2 -0
  55. package/dist/esm/config-aws/src/interfaces/config-manager.interface.js +2 -0
  56. package/dist/esm/config-aws/src/interfaces/env-file-loader.interface.js +2 -0
  57. package/dist/esm/config-aws/src/interfaces/environment-loader.interface.js +2 -0
  58. package/dist/esm/config-aws/src/interfaces/s3-loader.interface.js +2 -0
  59. package/dist/esm/config-aws/src/interfaces/secrets-manager-loader.interface.js +2 -0
  60. package/dist/esm/config-aws/src/interfaces/ssm-parameter-store-loader.interface.js +2 -0
  61. package/dist/esm/config-aws/src/loaders/env-file.loader.js +132 -0
  62. package/dist/esm/config-aws/src/loaders/environment.loader.js +81 -0
  63. package/dist/esm/config-aws/src/loaders/s3.loader.js +141 -0
  64. package/dist/esm/config-aws/src/loaders/secrets-manager.loader.js +165 -0
  65. package/dist/esm/config-aws/src/loaders/ssm-parameter-store.loader.js +195 -0
  66. package/dist/esm/config-aws/src/utils/env-file-parser.util.js +94 -0
  67. package/dist/esm/config-aws/src/utils/validation.util.js +112 -0
  68. package/dist/esm/nestjs-config-aws/src/config.module.js +172 -0
  69. package/dist/esm/nestjs-config-aws/src/index.js +23 -0
  70. package/dist/esm/nestjs-config-aws/src/integration/index.js +7 -0
  71. package/dist/esm/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.js +2 -0
  72. package/dist/esm/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.js +2 -0
  73. package/dist/esm/nestjs-config-aws/src/integration/interfaces/index.js +10 -0
  74. package/dist/esm/nestjs-config-aws/src/integration/interfaces/integration-options.interface.js +2 -0
  75. package/dist/esm/nestjs-config-aws/src/integration/interfaces/integration-state.interface.js +2 -0
  76. package/dist/esm/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.js +64 -0
  77. package/dist/esm/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.js +2 -0
  78. package/dist/esm/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.js +3 -0
  79. package/dist/esm/nestjs-config-aws/src/integration/interfaces/utility-types.interface.js +44 -0
  80. package/dist/esm/nestjs-config-aws/src/integration/nestjs-config-integration.module.js +121 -0
  81. package/dist/esm/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.js +589 -0
  82. package/dist/esm/nestjs-config-aws/src/integration/providers/configuration-factory.provider.js +382 -0
  83. package/dist/esm/nestjs-config-aws/src/integration/providers/index.js +4 -0
  84. package/dist/esm/nestjs-config-aws/src/integration/services/async-config-helper.service.js +363 -0
  85. package/dist/esm/nestjs-config-aws/src/integration/services/error-handler.service.js +264 -0
  86. package/dist/esm/nestjs-config-aws/src/integration/services/factory-registration.service.js +514 -0
  87. package/dist/esm/nestjs-config-aws/src/integration/services/index.js +10 -0
  88. package/dist/esm/nestjs-config-aws/src/integration/services/integration-state.service.js +78 -0
  89. package/dist/esm/nestjs-config-aws/src/integration/services/namespace-handler.service.js +462 -0
  90. package/dist/esm/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.js +315 -0
  91. package/dist/esm/nestjs-config-aws/src/integration/services/precedence-handler.service.js +289 -0
  92. package/dist/esm/nestjs-config-aws/src/integration/services/validation-integration.service.js +589 -0
  93. package/dist/esm/nestjs-config-aws/src/integration/utils/config-integration.util.js +240 -0
  94. package/dist/esm/nestjs-config-aws/src/integration/utils/index.js +3 -0
  95. package/dist/esm/nestjs-config-aws/src/interfaces/config-service.interface.js +7 -0
  96. package/dist/esm/nestjs-config-aws/src/interfaces/default-schema.interface.js +59 -0
  97. package/dist/esm/nestjs-config-aws/src/interfaces/index.js +8 -0
  98. package/dist/esm/nestjs-config-aws/src/interfaces/module-options.interface.js +2 -0
  99. package/dist/esm/nestjs-config-aws/src/services/config.service.js +139 -0
  100. package/dist/types/config-aws/src/config-manager.d.ts +119 -0
  101. package/dist/types/config-aws/src/config-manager.d.ts.map +1 -0
  102. package/dist/types/config-aws/src/errors/index.d.ts +43 -0
  103. package/dist/types/config-aws/src/errors/index.d.ts.map +1 -0
  104. package/dist/types/config-aws/src/index.d.ts +24 -0
  105. package/dist/types/config-aws/src/index.d.ts.map +1 -0
  106. package/dist/types/config-aws/src/interfaces/config-loader.interface.d.ts +33 -0
  107. package/dist/types/config-aws/src/interfaces/config-loader.interface.d.ts.map +1 -0
  108. package/dist/types/config-aws/src/interfaces/config-manager.interface.d.ts +86 -0
  109. package/dist/types/config-aws/src/interfaces/config-manager.interface.d.ts.map +1 -0
  110. package/dist/types/config-aws/src/interfaces/env-file-loader.interface.d.ts +12 -0
  111. package/dist/types/config-aws/src/interfaces/env-file-loader.interface.d.ts.map +1 -0
  112. package/dist/types/config-aws/src/interfaces/environment-loader.interface.d.ts +10 -0
  113. package/dist/types/config-aws/src/interfaces/environment-loader.interface.d.ts.map +1 -0
  114. package/dist/types/config-aws/src/interfaces/s3-loader.interface.d.ts +14 -0
  115. package/dist/types/config-aws/src/interfaces/s3-loader.interface.d.ts.map +1 -0
  116. package/dist/types/config-aws/src/interfaces/secrets-manager-loader.interface.d.ts +12 -0
  117. package/dist/types/config-aws/src/interfaces/secrets-manager-loader.interface.d.ts.map +1 -0
  118. package/dist/types/config-aws/src/interfaces/ssm-parameter-store-loader.interface.d.ts +14 -0
  119. package/dist/types/config-aws/src/interfaces/ssm-parameter-store-loader.interface.d.ts.map +1 -0
  120. package/dist/types/config-aws/src/loaders/env-file.loader.d.ts +69 -0
  121. package/dist/types/config-aws/src/loaders/env-file.loader.d.ts.map +1 -0
  122. package/dist/types/config-aws/src/loaders/environment.loader.d.ts +46 -0
  123. package/dist/types/config-aws/src/loaders/environment.loader.d.ts.map +1 -0
  124. package/dist/types/config-aws/src/loaders/s3.loader.d.ts +62 -0
  125. package/dist/types/config-aws/src/loaders/s3.loader.d.ts.map +1 -0
  126. package/dist/types/config-aws/src/loaders/secrets-manager.loader.d.ts +68 -0
  127. package/dist/types/config-aws/src/loaders/secrets-manager.loader.d.ts.map +1 -0
  128. package/dist/types/config-aws/src/loaders/ssm-parameter-store.loader.d.ts +78 -0
  129. package/dist/types/config-aws/src/loaders/ssm-parameter-store.loader.d.ts.map +1 -0
  130. package/dist/types/config-aws/src/utils/env-file-parser.util.d.ts +45 -0
  131. package/dist/types/config-aws/src/utils/env-file-parser.util.d.ts.map +1 -0
  132. package/dist/types/{utils → config-aws/src/utils}/validation.util.d.ts +10 -10
  133. package/dist/types/config-aws/src/utils/validation.util.d.ts.map +1 -0
  134. package/dist/types/{config.module.d.ts → nestjs-config-aws/src/config.module.d.ts} +1 -0
  135. package/dist/types/nestjs-config-aws/src/config.module.d.ts.map +1 -0
  136. package/dist/types/{index.d.ts → nestjs-config-aws/src/index.d.ts} +2 -4
  137. package/dist/types/nestjs-config-aws/src/index.d.ts.map +1 -0
  138. package/dist/types/nestjs-config-aws/src/integration/index.d.ts.map +1 -0
  139. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-factory.interface.d.ts.map +1 -0
  140. package/dist/types/nestjs-config-aws/src/integration/interfaces/configuration-source.interface.d.ts.map +1 -0
  141. package/dist/types/nestjs-config-aws/src/integration/interfaces/index.d.ts.map +1 -0
  142. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-options.interface.d.ts.map +1 -0
  143. package/dist/types/nestjs-config-aws/src/integration/interfaces/integration-state.interface.d.ts.map +1 -0
  144. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-compatibility.interface.d.ts.map +1 -0
  145. package/dist/types/nestjs-config-aws/src/integration/interfaces/nestjs-config-integration.interface.d.ts.map +1 -0
  146. package/dist/types/nestjs-config-aws/src/integration/interfaces/typed-configuration.interface.d.ts.map +1 -0
  147. package/dist/types/nestjs-config-aws/src/integration/interfaces/utility-types.interface.d.ts.map +1 -0
  148. package/dist/types/nestjs-config-aws/src/integration/nestjs-config-integration.module.d.ts.map +1 -0
  149. package/dist/types/nestjs-config-aws/src/integration/providers/aws-configuration-loader.service.d.ts.map +1 -0
  150. package/dist/types/nestjs-config-aws/src/integration/providers/configuration-factory.provider.d.ts.map +1 -0
  151. package/dist/types/nestjs-config-aws/src/integration/providers/index.d.ts.map +1 -0
  152. package/dist/types/nestjs-config-aws/src/integration/services/async-config-helper.service.d.ts.map +1 -0
  153. package/dist/types/nestjs-config-aws/src/integration/services/error-handler.service.d.ts.map +1 -0
  154. package/dist/types/nestjs-config-aws/src/integration/services/factory-registration.service.d.ts.map +1 -0
  155. package/dist/types/nestjs-config-aws/src/integration/services/index.d.ts.map +1 -0
  156. package/dist/types/nestjs-config-aws/src/integration/services/integration-state.service.d.ts.map +1 -0
  157. package/dist/types/nestjs-config-aws/src/integration/services/namespace-handler.service.d.ts.map +1 -0
  158. package/dist/types/nestjs-config-aws/src/integration/services/nestjs-config-integration.service.d.ts.map +1 -0
  159. package/dist/types/nestjs-config-aws/src/integration/services/precedence-handler.service.d.ts.map +1 -0
  160. package/dist/types/nestjs-config-aws/src/integration/services/validation-integration.service.d.ts.map +1 -0
  161. package/dist/types/nestjs-config-aws/src/integration/utils/config-integration.util.d.ts.map +1 -0
  162. package/dist/types/nestjs-config-aws/src/integration/utils/index.d.ts.map +1 -0
  163. package/dist/types/nestjs-config-aws/src/interfaces/config-service.interface.d.ts.map +1 -0
  164. package/dist/types/{interfaces → nestjs-config-aws/src/interfaces}/default-schema.interface.d.ts +28 -28
  165. package/dist/types/nestjs-config-aws/src/interfaces/default-schema.interface.d.ts.map +1 -0
  166. package/dist/types/nestjs-config-aws/src/interfaces/index.d.ts +5 -0
  167. package/dist/types/nestjs-config-aws/src/interfaces/index.d.ts.map +1 -0
  168. package/dist/types/nestjs-config-aws/src/interfaces/module-options.interface.d.ts.map +1 -0
  169. package/dist/types/nestjs-config-aws/src/services/config.service.d.ts +88 -0
  170. package/dist/types/nestjs-config-aws/src/services/config.service.d.ts.map +1 -0
  171. package/package.json +20 -27
  172. package/LICENSE +0 -21
  173. package/dist/cjs/config.module.js +0 -178
  174. package/dist/cjs/config.module.js.map +0 -1
  175. package/dist/cjs/index.js +0 -47
  176. package/dist/cjs/index.js.map +0 -1
  177. package/dist/cjs/integration/index.js.map +0 -1
  178. package/dist/cjs/integration/interfaces/configuration-factory.interface.js +0 -3
  179. package/dist/cjs/integration/interfaces/configuration-factory.interface.js.map +0 -1
  180. package/dist/cjs/integration/interfaces/configuration-source.interface.js +0 -3
  181. package/dist/cjs/integration/interfaces/configuration-source.interface.js.map +0 -1
  182. package/dist/cjs/integration/interfaces/index.js.map +0 -1
  183. package/dist/cjs/integration/interfaces/integration-options.interface.js +0 -3
  184. package/dist/cjs/integration/interfaces/integration-options.interface.js.map +0 -1
  185. package/dist/cjs/integration/interfaces/integration-state.interface.js +0 -3
  186. package/dist/cjs/integration/interfaces/integration-state.interface.js.map +0 -1
  187. package/dist/cjs/integration/interfaces/nestjs-config-compatibility.interface.js +0 -73
  188. package/dist/cjs/integration/interfaces/nestjs-config-compatibility.interface.js.map +0 -1
  189. package/dist/cjs/integration/interfaces/nestjs-config-integration.interface.js +0 -3
  190. package/dist/cjs/integration/interfaces/nestjs-config-integration.interface.js.map +0 -1
  191. package/dist/cjs/integration/interfaces/typed-configuration.interface.js +0 -4
  192. package/dist/cjs/integration/interfaces/typed-configuration.interface.js.map +0 -1
  193. package/dist/cjs/integration/interfaces/utility-types.interface.js +0 -52
  194. package/dist/cjs/integration/interfaces/utility-types.interface.js.map +0 -1
  195. package/dist/cjs/integration/nestjs-config-integration.module.js +0 -124
  196. package/dist/cjs/integration/nestjs-config-integration.module.js.map +0 -1
  197. package/dist/cjs/integration/providers/aws-configuration-loader.service.js +0 -591
  198. package/dist/cjs/integration/providers/aws-configuration-loader.service.js.map +0 -1
  199. package/dist/cjs/integration/providers/configuration-factory.provider.js +0 -383
  200. package/dist/cjs/integration/providers/configuration-factory.provider.js.map +0 -1
  201. package/dist/cjs/integration/providers/index.js.map +0 -1
  202. package/dist/cjs/integration/services/async-config-helper.service.js +0 -356
  203. package/dist/cjs/integration/services/async-config-helper.service.js.map +0 -1
  204. package/dist/cjs/integration/services/error-handler.service.js +0 -265
  205. package/dist/cjs/integration/services/error-handler.service.js.map +0 -1
  206. package/dist/cjs/integration/services/factory-registration.service.js +0 -512
  207. package/dist/cjs/integration/services/factory-registration.service.js.map +0 -1
  208. package/dist/cjs/integration/services/index.js.map +0 -1
  209. package/dist/cjs/integration/services/integration-state.service.js +0 -83
  210. package/dist/cjs/integration/services/integration-state.service.js.map +0 -1
  211. package/dist/cjs/integration/services/namespace-handler.service.js +0 -467
  212. package/dist/cjs/integration/services/namespace-handler.service.js.map +0 -1
  213. package/dist/cjs/integration/services/nestjs-config-integration.service.js +0 -316
  214. package/dist/cjs/integration/services/nestjs-config-integration.service.js.map +0 -1
  215. package/dist/cjs/integration/services/precedence-handler.service.js +0 -294
  216. package/dist/cjs/integration/services/precedence-handler.service.js.map +0 -1
  217. package/dist/cjs/integration/services/validation-integration.service.js +0 -591
  218. package/dist/cjs/integration/services/validation-integration.service.js.map +0 -1
  219. package/dist/cjs/integration/utils/config-integration.util.js +0 -283
  220. package/dist/cjs/integration/utils/config-integration.util.js.map +0 -1
  221. package/dist/cjs/integration/utils/index.js.map +0 -1
  222. package/dist/cjs/interfaces/config-loader.interface.js +0 -3
  223. package/dist/cjs/interfaces/config-loader.interface.js.map +0 -1
  224. package/dist/cjs/interfaces/config-service.interface.js +0 -11
  225. package/dist/cjs/interfaces/config-service.interface.js.map +0 -1
  226. package/dist/cjs/interfaces/default-schema.interface.js +0 -63
  227. package/dist/cjs/interfaces/default-schema.interface.js.map +0 -1
  228. package/dist/cjs/interfaces/errors.interface.js +0 -77
  229. package/dist/cjs/interfaces/errors.interface.js.map +0 -1
  230. package/dist/cjs/interfaces/index.js +0 -25
  231. package/dist/cjs/interfaces/index.js.map +0 -1
  232. package/dist/cjs/interfaces/module-options.interface.js +0 -3
  233. package/dist/cjs/interfaces/module-options.interface.js.map +0 -1
  234. package/dist/cjs/loaders/environment.loader.js +0 -59
  235. package/dist/cjs/loaders/environment.loader.js.map +0 -1
  236. package/dist/cjs/loaders/secrets-manager.loader.js +0 -122
  237. package/dist/cjs/loaders/secrets-manager.loader.js.map +0 -1
  238. package/dist/cjs/loaders/ssm-parameter-store.loader.js +0 -146
  239. package/dist/cjs/loaders/ssm-parameter-store.loader.js.map +0 -1
  240. package/dist/cjs/services/config.service.js +0 -297
  241. package/dist/cjs/services/config.service.js.map +0 -1
  242. package/dist/cjs/utils/validation.util.js +0 -114
  243. package/dist/cjs/utils/validation.util.js.map +0 -1
  244. package/dist/esm/config.module.js +0 -175
  245. package/dist/esm/config.module.js.map +0 -1
  246. package/dist/esm/index.js +0 -18
  247. package/dist/esm/index.js.map +0 -1
  248. package/dist/esm/integration/index.js +0 -7
  249. package/dist/esm/integration/index.js.map +0 -1
  250. package/dist/esm/integration/interfaces/configuration-factory.interface.js +0 -2
  251. package/dist/esm/integration/interfaces/configuration-factory.interface.js.map +0 -1
  252. package/dist/esm/integration/interfaces/configuration-source.interface.js +0 -2
  253. package/dist/esm/integration/interfaces/configuration-source.interface.js.map +0 -1
  254. package/dist/esm/integration/interfaces/index.js +0 -10
  255. package/dist/esm/integration/interfaces/index.js.map +0 -1
  256. package/dist/esm/integration/interfaces/integration-options.interface.js +0 -2
  257. package/dist/esm/integration/interfaces/integration-options.interface.js.map +0 -1
  258. package/dist/esm/integration/interfaces/integration-state.interface.js +0 -2
  259. package/dist/esm/integration/interfaces/integration-state.interface.js.map +0 -1
  260. package/dist/esm/integration/interfaces/nestjs-config-compatibility.interface.js +0 -64
  261. package/dist/esm/integration/interfaces/nestjs-config-compatibility.interface.js.map +0 -1
  262. package/dist/esm/integration/interfaces/nestjs-config-integration.interface.js +0 -2
  263. package/dist/esm/integration/interfaces/nestjs-config-integration.interface.js.map +0 -1
  264. package/dist/esm/integration/interfaces/typed-configuration.interface.js +0 -3
  265. package/dist/esm/integration/interfaces/typed-configuration.interface.js.map +0 -1
  266. package/dist/esm/integration/interfaces/utility-types.interface.js +0 -44
  267. package/dist/esm/integration/interfaces/utility-types.interface.js.map +0 -1
  268. package/dist/esm/integration/nestjs-config-integration.module.js +0 -121
  269. package/dist/esm/integration/nestjs-config-integration.module.js.map +0 -1
  270. package/dist/esm/integration/providers/aws-configuration-loader.service.js +0 -588
  271. package/dist/esm/integration/providers/aws-configuration-loader.service.js.map +0 -1
  272. package/dist/esm/integration/providers/configuration-factory.provider.js +0 -380
  273. package/dist/esm/integration/providers/configuration-factory.provider.js.map +0 -1
  274. package/dist/esm/integration/providers/index.js +0 -4
  275. package/dist/esm/integration/providers/index.js.map +0 -1
  276. package/dist/esm/integration/services/async-config-helper.service.js +0 -353
  277. package/dist/esm/integration/services/async-config-helper.service.js.map +0 -1
  278. package/dist/esm/integration/services/error-handler.service.js +0 -262
  279. package/dist/esm/integration/services/error-handler.service.js.map +0 -1
  280. package/dist/esm/integration/services/factory-registration.service.js +0 -509
  281. package/dist/esm/integration/services/factory-registration.service.js.map +0 -1
  282. package/dist/esm/integration/services/index.js +0 -10
  283. package/dist/esm/integration/services/index.js.map +0 -1
  284. package/dist/esm/integration/services/integration-state.service.js +0 -80
  285. package/dist/esm/integration/services/integration-state.service.js.map +0 -1
  286. package/dist/esm/integration/services/namespace-handler.service.js +0 -464
  287. package/dist/esm/integration/services/namespace-handler.service.js.map +0 -1
  288. package/dist/esm/integration/services/nestjs-config-integration.service.js +0 -313
  289. package/dist/esm/integration/services/nestjs-config-integration.service.js.map +0 -1
  290. package/dist/esm/integration/services/precedence-handler.service.js +0 -291
  291. package/dist/esm/integration/services/precedence-handler.service.js.map +0 -1
  292. package/dist/esm/integration/services/validation-integration.service.js +0 -585
  293. package/dist/esm/integration/services/validation-integration.service.js.map +0 -1
  294. package/dist/esm/integration/utils/config-integration.util.js +0 -240
  295. package/dist/esm/integration/utils/config-integration.util.js.map +0 -1
  296. package/dist/esm/integration/utils/index.js +0 -3
  297. package/dist/esm/integration/utils/index.js.map +0 -1
  298. package/dist/esm/interfaces/config-loader.interface.js +0 -2
  299. package/dist/esm/interfaces/config-loader.interface.js.map +0 -1
  300. package/dist/esm/interfaces/config-service.interface.js +0 -7
  301. package/dist/esm/interfaces/config-service.interface.js.map +0 -1
  302. package/dist/esm/interfaces/default-schema.interface.js +0 -59
  303. package/dist/esm/interfaces/default-schema.interface.js.map +0 -1
  304. package/dist/esm/interfaces/errors.interface.js +0 -69
  305. package/dist/esm/interfaces/errors.interface.js.map +0 -1
  306. package/dist/esm/interfaces/index.js +0 -9
  307. package/dist/esm/interfaces/index.js.map +0 -1
  308. package/dist/esm/interfaces/module-options.interface.js +0 -2
  309. package/dist/esm/interfaces/module-options.interface.js.map +0 -1
  310. package/dist/esm/loaders/environment.loader.js +0 -55
  311. package/dist/esm/loaders/environment.loader.js.map +0 -1
  312. package/dist/esm/loaders/secrets-manager.loader.js +0 -118
  313. package/dist/esm/loaders/secrets-manager.loader.js.map +0 -1
  314. package/dist/esm/loaders/ssm-parameter-store.loader.js +0 -142
  315. package/dist/esm/loaders/ssm-parameter-store.loader.js.map +0 -1
  316. package/dist/esm/services/config.service.js +0 -261
  317. package/dist/esm/services/config.service.js.map +0 -1
  318. package/dist/esm/utils/validation.util.js +0 -110
  319. package/dist/esm/utils/validation.util.js.map +0 -1
  320. package/dist/types/config.module.d.ts.map +0 -1
  321. package/dist/types/index.d.ts.map +0 -1
  322. package/dist/types/integration/index.d.ts.map +0 -1
  323. package/dist/types/integration/interfaces/configuration-factory.interface.d.ts.map +0 -1
  324. package/dist/types/integration/interfaces/configuration-source.interface.d.ts.map +0 -1
  325. package/dist/types/integration/interfaces/index.d.ts.map +0 -1
  326. package/dist/types/integration/interfaces/integration-options.interface.d.ts.map +0 -1
  327. package/dist/types/integration/interfaces/integration-state.interface.d.ts.map +0 -1
  328. package/dist/types/integration/interfaces/nestjs-config-compatibility.interface.d.ts.map +0 -1
  329. package/dist/types/integration/interfaces/nestjs-config-integration.interface.d.ts.map +0 -1
  330. package/dist/types/integration/interfaces/typed-configuration.interface.d.ts.map +0 -1
  331. package/dist/types/integration/interfaces/utility-types.interface.d.ts.map +0 -1
  332. package/dist/types/integration/nestjs-config-integration.module.d.ts.map +0 -1
  333. package/dist/types/integration/providers/aws-configuration-loader.service.d.ts.map +0 -1
  334. package/dist/types/integration/providers/configuration-factory.provider.d.ts.map +0 -1
  335. package/dist/types/integration/providers/index.d.ts.map +0 -1
  336. package/dist/types/integration/services/async-config-helper.service.d.ts.map +0 -1
  337. package/dist/types/integration/services/error-handler.service.d.ts.map +0 -1
  338. package/dist/types/integration/services/factory-registration.service.d.ts.map +0 -1
  339. package/dist/types/integration/services/index.d.ts.map +0 -1
  340. package/dist/types/integration/services/integration-state.service.d.ts.map +0 -1
  341. package/dist/types/integration/services/namespace-handler.service.d.ts.map +0 -1
  342. package/dist/types/integration/services/nestjs-config-integration.service.d.ts.map +0 -1
  343. package/dist/types/integration/services/precedence-handler.service.d.ts.map +0 -1
  344. package/dist/types/integration/services/validation-integration.service.d.ts.map +0 -1
  345. package/dist/types/integration/utils/config-integration.util.d.ts.map +0 -1
  346. package/dist/types/integration/utils/index.d.ts.map +0 -1
  347. package/dist/types/interfaces/config-loader.interface.d.ts +0 -22
  348. package/dist/types/interfaces/config-loader.interface.d.ts.map +0 -1
  349. package/dist/types/interfaces/config-service.interface.d.ts.map +0 -1
  350. package/dist/types/interfaces/default-schema.interface.d.ts.map +0 -1
  351. package/dist/types/interfaces/errors.interface.d.ts +0 -38
  352. package/dist/types/interfaces/errors.interface.d.ts.map +0 -1
  353. package/dist/types/interfaces/index.d.ts +0 -6
  354. package/dist/types/interfaces/index.d.ts.map +0 -1
  355. package/dist/types/interfaces/module-options.interface.d.ts.map +0 -1
  356. package/dist/types/loaders/environment.loader.d.ts +0 -26
  357. package/dist/types/loaders/environment.loader.d.ts.map +0 -1
  358. package/dist/types/loaders/secrets-manager.loader.d.ts +0 -52
  359. package/dist/types/loaders/secrets-manager.loader.d.ts.map +0 -1
  360. package/dist/types/loaders/ssm-parameter-store.loader.d.ts +0 -68
  361. package/dist/types/loaders/ssm-parameter-store.loader.d.ts.map +0 -1
  362. package/dist/types/services/config.service.d.ts +0 -94
  363. package/dist/types/services/config.service.d.ts.map +0 -1
  364. package/dist/types/utils/validation.util.d.ts.map +0 -1
  365. /package/dist/types/{integration → nestjs-config-aws/src/integration}/index.d.ts +0 -0
  366. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/configuration-factory.interface.d.ts +0 -0
  367. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/configuration-source.interface.d.ts +0 -0
  368. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/index.d.ts +0 -0
  369. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/integration-options.interface.d.ts +0 -0
  370. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/integration-state.interface.d.ts +0 -0
  371. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/nestjs-config-compatibility.interface.d.ts +0 -0
  372. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/nestjs-config-integration.interface.d.ts +0 -0
  373. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/typed-configuration.interface.d.ts +0 -0
  374. /package/dist/types/{integration → nestjs-config-aws/src/integration}/interfaces/utility-types.interface.d.ts +0 -0
  375. /package/dist/types/{integration → nestjs-config-aws/src/integration}/nestjs-config-integration.module.d.ts +0 -0
  376. /package/dist/types/{integration → nestjs-config-aws/src/integration}/providers/aws-configuration-loader.service.d.ts +0 -0
  377. /package/dist/types/{integration → nestjs-config-aws/src/integration}/providers/configuration-factory.provider.d.ts +0 -0
  378. /package/dist/types/{integration → nestjs-config-aws/src/integration}/providers/index.d.ts +0 -0
  379. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/async-config-helper.service.d.ts +0 -0
  380. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/error-handler.service.d.ts +0 -0
  381. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/factory-registration.service.d.ts +0 -0
  382. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/index.d.ts +0 -0
  383. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/integration-state.service.d.ts +0 -0
  384. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/namespace-handler.service.d.ts +0 -0
  385. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/nestjs-config-integration.service.d.ts +0 -0
  386. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/precedence-handler.service.d.ts +0 -0
  387. /package/dist/types/{integration → nestjs-config-aws/src/integration}/services/validation-integration.service.d.ts +0 -0
  388. /package/dist/types/{integration → nestjs-config-aws/src/integration}/utils/config-integration.util.d.ts +0 -0
  389. /package/dist/types/{integration → nestjs-config-aws/src/integration}/utils/index.d.ts +0 -0
  390. /package/dist/types/{interfaces → nestjs-config-aws/src/interfaces}/config-service.interface.d.ts +0 -0
  391. /package/dist/types/{interfaces → nestjs-config-aws/src/interfaces}/module-options.interface.d.ts +0 -0
@@ -0,0 +1,589 @@
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 ValidationIntegrationService_1;
11
+ import { Injectable, Logger } from '@nestjs/common';
12
+ /**
13
+ * Joi validation schema provider.
14
+ */
15
+ export class JoiValidationProvider {
16
+ name = 'joi';
17
+ joi;
18
+ constructor() {
19
+ try {
20
+ // Try to import Joi dynamically
21
+ this.joi = require('joi');
22
+ }
23
+ catch {
24
+ // Joi is not available
25
+ this.joi = null;
26
+ }
27
+ }
28
+ isAvailable() {
29
+ return this.joi !== null;
30
+ }
31
+ validate(config, schema) {
32
+ if (!this.joi) {
33
+ return { isValid: false, errors: ['Joi is not available'] };
34
+ }
35
+ try {
36
+ // Use joi.attempt which throws on validation error, or fall back to schema.validate
37
+ if (this.joi.attempt) {
38
+ this.joi.attempt(config, schema);
39
+ return { isValid: true, errors: [] };
40
+ }
41
+ const { error } = schema.validate(config);
42
+ if (error) {
43
+ const errors = error.details?.map((detail) => detail.message) || [error.message];
44
+ return { isValid: false, errors };
45
+ }
46
+ return { isValid: true, errors: [] };
47
+ }
48
+ catch (error) {
49
+ const validationError = error instanceof Error ? error : new Error(String(error));
50
+ return { isValid: false, errors: [validationError.message] };
51
+ }
52
+ }
53
+ }
54
+ /**
55
+ * Class-validator validation schema provider.
56
+ */
57
+ export class ClassValidatorProvider {
58
+ name = 'class-validator';
59
+ classValidator;
60
+ classTransformer;
61
+ constructor() {
62
+ try {
63
+ // Try to import class-validator and class-transformer dynamically
64
+ this.classValidator = require('class-validator');
65
+ this.classTransformer = require('class-transformer');
66
+ }
67
+ catch {
68
+ // class-validator is not available
69
+ this.classValidator = null;
70
+ this.classTransformer = null;
71
+ }
72
+ }
73
+ isAvailable() {
74
+ return this.classValidator !== null && this.classTransformer !== null;
75
+ }
76
+ validate(config, schemaClass) {
77
+ if (!this.classValidator || !this.classTransformer) {
78
+ return { isValid: false, errors: ['class-validator or class-transformer is not available'] };
79
+ }
80
+ try {
81
+ // Transform plain object to class instance
82
+ const instance = this.classTransformer.plainToClass(schemaClass, config);
83
+ // Validate the instance
84
+ const errors = this.classValidator.validateSync(instance);
85
+ if (errors && errors.length > 0) {
86
+ const errorMessages = errors.map((error) => {
87
+ const constraints = error.constraints || {};
88
+ return Object.values(constraints).join(', ');
89
+ }).filter((msg) => msg.length > 0);
90
+ return { isValid: false, errors: errorMessages };
91
+ }
92
+ return { isValid: true, errors: [] };
93
+ }
94
+ catch (error) {
95
+ const validationError = error instanceof Error ? error : new Error(String(error));
96
+ return { isValid: false, errors: [validationError.message] };
97
+ }
98
+ }
99
+ }
100
+ /**
101
+ * Custom validation function provider.
102
+ */
103
+ export class CustomValidationProvider {
104
+ name = 'custom';
105
+ isAvailable() {
106
+ return true;
107
+ }
108
+ validate(config, validationFn) {
109
+ try {
110
+ const result = validationFn(config);
111
+ if (Array.isArray(result) && result.length > 0) {
112
+ return { isValid: false, errors: result };
113
+ }
114
+ return { isValid: true, errors: [] };
115
+ }
116
+ catch (error) {
117
+ const validationError = error instanceof Error ? error : new Error(String(error));
118
+ return { isValid: false, errors: [validationError.message] };
119
+ }
120
+ }
121
+ }
122
+ /**
123
+ * Service for integrating AWS-sourced configuration with @nestjs/config validation.
124
+ * Supports Joi, class-validator, and custom validation functions.
125
+ */
126
+ let ValidationIntegrationService = ValidationIntegrationService_1 = class ValidationIntegrationService {
127
+ logger = new Logger(ValidationIntegrationService_1.name);
128
+ validationProviders = new Map();
129
+ constructor() {
130
+ // Register available validation providers
131
+ this.registerValidationProviders();
132
+ }
133
+ /**
134
+ * Create a validated configuration factory.
135
+ * This factory will validate AWS-sourced configuration before returning it.
136
+ *
137
+ * @param namespace - Optional namespace for the configuration
138
+ * @param config - Configuration data to validate
139
+ * @param validationSchema - Validation schema (Joi schema, class-validator class, or custom function)
140
+ * @param validationType - Type of validation ('joi', 'class-validator', or 'custom')
141
+ * @param sources - Configuration sources metadata
142
+ * @returns Validated configuration factory
143
+ */
144
+ createValidatedFactory(namespace, config, validationSchema, validationType, sources) {
145
+ this.logger.debug(`Creating validated factory for namespace: ${namespace || 'default'} with ${validationType} validation`);
146
+ const factory = () => {
147
+ this.logger.debug(`Validated factory called for namespace: ${namespace || 'default'}`);
148
+ // Validate configuration
149
+ const validationResult = this.validateConfiguration(config, validationSchema, validationType, sources);
150
+ if (!validationResult.isValid) {
151
+ const errorMessage = `Configuration validation failed for ${namespace || 'default'}: ${validationResult.errors.join(', ')}`;
152
+ this.logger.error(errorMessage);
153
+ // Create detailed error with source information
154
+ const detailedError = this.createValidationError(namespace || 'default', validationResult.errors, sources);
155
+ throw detailedError;
156
+ }
157
+ this.logger.debug(`Configuration validation passed for namespace: ${namespace || 'default'}`);
158
+ return config;
159
+ };
160
+ // Add validation metadata
161
+ factory.__isValidatedFactory = true;
162
+ factory.__validationType = validationType;
163
+ factory.__namespace = namespace;
164
+ factory.__sources = sources?.map(s => s.name) || [];
165
+ return factory;
166
+ }
167
+ /**
168
+ * Validate configuration using the specified validation type and schema.
169
+ *
170
+ * @param config - Configuration to validate
171
+ * @param schema - Validation schema
172
+ * @param validationType - Type of validation
173
+ * @param sources - Configuration sources for error reporting
174
+ * @returns Validation result
175
+ */
176
+ validateConfiguration(config, schema, validationType, sources) {
177
+ const provider = this.validationProviders.get(validationType);
178
+ if (!provider) {
179
+ return {
180
+ isValid: false,
181
+ errors: [`Validation provider '${validationType}' is not available`],
182
+ warnings: []
183
+ };
184
+ }
185
+ if (!provider.isAvailable()) {
186
+ return {
187
+ isValid: false,
188
+ errors: [`Validation provider '${validationType}' is not properly configured`],
189
+ warnings: []
190
+ };
191
+ }
192
+ try {
193
+ const result = provider.validate(config, schema);
194
+ // Add source information to errors
195
+ const enhancedErrors = result.errors.map(error => this.enhanceErrorWithSourceInfo(error, sources));
196
+ return {
197
+ isValid: result.isValid,
198
+ errors: enhancedErrors,
199
+ warnings: []
200
+ };
201
+ }
202
+ catch (error) {
203
+ const validationError = error instanceof Error ? error : new Error(String(error));
204
+ return {
205
+ isValid: false,
206
+ errors: [validationError.message],
207
+ warnings: []
208
+ };
209
+ }
210
+ }
211
+ /**
212
+ * Create a factory that validates configuration and provides fallback values.
213
+ *
214
+ * @param namespace - Optional namespace
215
+ * @param config - Configuration data
216
+ * @param validationSchema - Validation schema
217
+ * @param validationType - Type of validation
218
+ * @param fallbackConfig - Fallback configuration to use if validation fails
219
+ * @param sources - Configuration sources
220
+ * @returns Factory with validation and fallback
221
+ */
222
+ createValidatedFactoryWithFallback(namespace, config, validationSchema, validationType, fallbackConfig, sources) {
223
+ this.logger.debug(`Creating validated factory with fallback for namespace: ${namespace || 'default'}`);
224
+ const factory = () => {
225
+ this.logger.debug(`Validated factory with fallback called for namespace: ${namespace || 'default'}`);
226
+ // Validate configuration
227
+ const validationResult = this.validateConfiguration(config, validationSchema, validationType, sources);
228
+ if (!validationResult.isValid) {
229
+ this.logger.warn(`Configuration validation failed for ${namespace || 'default'}, using fallback: ${validationResult.errors.join(', ')}`);
230
+ // Validate fallback configuration
231
+ const fallbackValidation = this.validateConfiguration(fallbackConfig, validationSchema, validationType);
232
+ if (fallbackValidation.isValid) {
233
+ return fallbackConfig;
234
+ }
235
+ else {
236
+ // Both primary and fallback failed
237
+ const errorMessage = `Both primary and fallback configuration validation failed for ${namespace || 'default'}`;
238
+ this.logger.error(errorMessage);
239
+ const detailedError = this.createValidationError(namespace || 'default', [...validationResult.errors, ...fallbackValidation.errors], sources);
240
+ throw detailedError;
241
+ }
242
+ }
243
+ this.logger.debug(`Configuration validation passed for namespace: ${namespace || 'default'}`);
244
+ return config;
245
+ };
246
+ // Add metadata
247
+ factory.__isValidatedFactory = true;
248
+ factory.__hasFallback = true;
249
+ factory.__validationType = validationType;
250
+ factory.__namespace = namespace;
251
+ factory.__sources = sources?.map(s => s.name) || [];
252
+ return factory;
253
+ }
254
+ /**
255
+ * Validate multiple namespace configurations.
256
+ *
257
+ * @param namespacedConfig - Configuration organized by namespace
258
+ * @param validationSchemas - Validation schemas for each namespace
259
+ * @param validationType - Type of validation
260
+ * @param sources - Configuration sources
261
+ * @returns Validation results for each namespace
262
+ */
263
+ validateNamespacedConfiguration(namespacedConfig, validationSchemas, validationType, sources) {
264
+ const results = {};
265
+ for (const [namespace, config] of Object.entries(namespacedConfig)) {
266
+ const schema = validationSchemas[namespace];
267
+ if (schema) {
268
+ results[namespace] = this.validateConfiguration(config, schema, validationType, sources);
269
+ }
270
+ else {
271
+ results[namespace] = {
272
+ isValid: true,
273
+ errors: [],
274
+ warnings: [`No validation schema provided for namespace: ${namespace}`]
275
+ };
276
+ }
277
+ }
278
+ return results;
279
+ }
280
+ /**
281
+ * Check which validation providers are available.
282
+ *
283
+ * @returns Object indicating availability of each provider
284
+ */
285
+ getAvailableValidationProviders() {
286
+ const availability = {};
287
+ for (const [name, provider] of this.validationProviders) {
288
+ availability[name] = provider.isAvailable();
289
+ }
290
+ return availability;
291
+ }
292
+ /**
293
+ * Get validation recommendations based on configuration structure.
294
+ *
295
+ * @param config - Configuration to analyze
296
+ * @returns Validation recommendations
297
+ */
298
+ getValidationRecommendations(config) {
299
+ const analysis = this.analyzeConfigurationStructure(config);
300
+ let recommendedProvider = 'custom';
301
+ const reasons = [];
302
+ const examples = {};
303
+ // Determine best validation approach
304
+ if (analysis.hasComplexNesting || analysis.hasArrays) {
305
+ if (this.validationProviders.get('joi')?.isAvailable()) {
306
+ recommendedProvider = 'joi';
307
+ reasons.push('Complex nested structure detected - Joi provides excellent nested validation');
308
+ examples['joi'] = this.generateJoiExample(config);
309
+ }
310
+ }
311
+ if (analysis.hasTypedValues && this.validationProviders.get('class-validator')?.isAvailable()) {
312
+ recommendedProvider = 'class-validator';
313
+ reasons.push('Typed values detected - class-validator provides strong type safety');
314
+ examples['class-validator'] = this.generateClassValidatorExample(config);
315
+ }
316
+ // Always provide custom example
317
+ examples['custom'] = this.generateCustomValidationExample(config);
318
+ return {
319
+ recommendedProvider,
320
+ reasons,
321
+ examples
322
+ };
323
+ }
324
+ /**
325
+ * Register validation providers.
326
+ */
327
+ registerValidationProviders() {
328
+ this.validationProviders.set('joi', new JoiValidationProvider());
329
+ this.validationProviders.set('class-validator', new ClassValidatorProvider());
330
+ this.validationProviders.set('custom', new CustomValidationProvider());
331
+ // Log available providers
332
+ const available = Array.from(this.validationProviders.entries())
333
+ .filter(([_, provider]) => provider.isAvailable())
334
+ .map(([name]) => name);
335
+ this.logger.debug(`Available validation providers: ${available.join(', ')}`);
336
+ }
337
+ /**
338
+ * Create a detailed validation error with source information.
339
+ *
340
+ * @param namespace - Namespace that failed validation
341
+ * @param errors - Validation errors
342
+ * @param sources - Configuration sources
343
+ * @returns Detailed error
344
+ */
345
+ createValidationError(namespace, errors, sources) {
346
+ let message = `Configuration validation failed for namespace '${namespace}':\n`;
347
+ message += errors.map(error => ` - ${error}`).join('\n');
348
+ if (sources && sources.length > 0) {
349
+ message += '\n\nConfiguration sources:\n';
350
+ message += sources.map(source => ` - ${source.name} (${source.type}): ${Object.keys(source.data).length} keys`).join('\n');
351
+ }
352
+ const error = new Error(message);
353
+ error.name = 'ConfigurationValidationError';
354
+ error.namespace = namespace;
355
+ error.validationErrors = errors;
356
+ error.sources = sources;
357
+ return error;
358
+ }
359
+ /**
360
+ * Enhance error message with source information.
361
+ *
362
+ * @param error - Original error message
363
+ * @param sources - Configuration sources
364
+ * @returns Enhanced error message
365
+ */
366
+ enhanceErrorWithSourceInfo(error, sources) {
367
+ if (!sources || sources.length === 0) {
368
+ return error;
369
+ }
370
+ const sourceNames = sources.map(s => s.name).join(', ');
371
+ return `${error} (from sources: ${sourceNames})`;
372
+ }
373
+ /**
374
+ * Analyze configuration structure for validation recommendations.
375
+ *
376
+ * @param config - Configuration to analyze
377
+ * @returns Structure analysis
378
+ */
379
+ analyzeConfigurationStructure(config) {
380
+ let hasComplexNesting = false;
381
+ let hasArrays = false;
382
+ let hasTypedValues = false;
383
+ let maxDepth = 0;
384
+ const analyze = (obj, depth = 0) => {
385
+ maxDepth = Math.max(maxDepth, depth);
386
+ if (depth > 2) {
387
+ hasComplexNesting = true;
388
+ }
389
+ for (const value of Object.values(obj)) {
390
+ if (Array.isArray(value)) {
391
+ hasArrays = true;
392
+ }
393
+ else if (typeof value === 'object' && value !== null) {
394
+ analyze(value, depth + 1);
395
+ }
396
+ else if (typeof value === 'number' || typeof value === 'boolean') {
397
+ hasTypedValues = true;
398
+ }
399
+ }
400
+ };
401
+ analyze(config);
402
+ return {
403
+ hasComplexNesting,
404
+ hasArrays,
405
+ hasTypedValues,
406
+ depth: maxDepth
407
+ };
408
+ }
409
+ /**
410
+ * Generate Joi validation example.
411
+ *
412
+ * @param config - Configuration to generate example for
413
+ * @returns Joi validation example
414
+ */
415
+ generateJoiExample(config) {
416
+ const schema = this.generateJoiSchemaFromConfig(config);
417
+ return `const Joi = require('joi');
418
+
419
+ const schema = ${schema};
420
+
421
+ // Usage in factory
422
+ const factory = () => {
423
+ const config = loadAwsConfig();
424
+ const { error, value } = schema.validate(config);
425
+ if (error) throw error;
426
+ return value;
427
+ };`;
428
+ }
429
+ /**
430
+ * Generate class-validator example.
431
+ *
432
+ * @param config - Configuration to generate example for
433
+ * @returns class-validator example
434
+ */
435
+ generateClassValidatorExample(config) {
436
+ const classDefinition = this.generateClassFromConfig(config);
437
+ return `import { IsString, IsNumber, IsOptional, validateSync } from 'class-validator';
438
+ import { plainToClass } from 'class-transformer';
439
+
440
+ ${classDefinition}
441
+
442
+ // Usage in factory
443
+ const factory = () => {
444
+ const config = loadAwsConfig();
445
+ const instance = plainToClass(ConfigClass, config);
446
+ const errors = validateSync(instance);
447
+ if (errors.length > 0) throw new Error('Validation failed');
448
+ return config;
449
+ };`;
450
+ }
451
+ /**
452
+ * Generate custom validation example.
453
+ *
454
+ * @param config - Configuration to generate example for
455
+ * @returns Custom validation example
456
+ */
457
+ generateCustomValidationExample(config) {
458
+ const validationChecks = this.generateValidationChecks(config);
459
+ return `const validateConfig = (config) => {
460
+ const errors = [];
461
+
462
+ ${validationChecks}
463
+
464
+ return errors;
465
+ };
466
+
467
+ // Usage in factory
468
+ const factory = () => {
469
+ const config = loadAwsConfig();
470
+ const errors = validateConfig(config);
471
+ if (errors.length > 0) throw new Error(\`Validation failed: \${errors.join(', ')}\`);
472
+ return config;
473
+ };`;
474
+ }
475
+ /**
476
+ * Generate Joi schema from configuration structure.
477
+ *
478
+ * @param config - Configuration object
479
+ * @returns Joi schema string
480
+ */
481
+ generateJoiSchemaFromConfig(config) {
482
+ const generateSchema = (obj) => {
483
+ if (typeof obj === 'string')
484
+ return 'Joi.string()';
485
+ if (typeof obj === 'number')
486
+ return 'Joi.number()';
487
+ if (typeof obj === 'boolean')
488
+ return 'Joi.boolean()';
489
+ if (Array.isArray(obj))
490
+ return 'Joi.array()';
491
+ if (typeof obj === 'object' && obj !== null) {
492
+ const properties = Object.entries(obj)
493
+ .map(([key, value]) => ` ${key}: ${generateSchema(value)}`)
494
+ .join(',\n');
495
+ return `Joi.object({\n${properties}\n})`;
496
+ }
497
+ return 'Joi.any()';
498
+ };
499
+ return generateSchema(config);
500
+ }
501
+ /**
502
+ * Generate class definition from configuration structure.
503
+ *
504
+ * @param config - Configuration object
505
+ * @returns Class definition string
506
+ */
507
+ generateClassFromConfig(config) {
508
+ const properties = Object.entries(config)
509
+ .map(([key, value]) => {
510
+ const decorator = this.getClassValidatorDecorator(value);
511
+ return ` ${decorator}\n ${key}: ${this.getTypeScriptType(value)};`;
512
+ })
513
+ .join('\n\n');
514
+ return `class ConfigClass {\n${properties}\n}`;
515
+ }
516
+ /**
517
+ * Generate validation checks for custom validation.
518
+ *
519
+ * @param config - Configuration object
520
+ * @returns Validation checks string
521
+ */
522
+ generateValidationChecks(config) {
523
+ return Object.entries(config)
524
+ .map(([key, value]) => {
525
+ const check = this.getValidationCheck(key, value);
526
+ return ` ${check}`;
527
+ })
528
+ .join('\n');
529
+ }
530
+ /**
531
+ * Get class-validator decorator for a value.
532
+ *
533
+ * @param value - Value to get decorator for
534
+ * @returns Decorator string
535
+ */
536
+ getClassValidatorDecorator(value) {
537
+ if (typeof value === 'string')
538
+ return '@IsString()';
539
+ if (typeof value === 'number')
540
+ return '@IsNumber()';
541
+ if (typeof value === 'boolean')
542
+ return '@IsBoolean()';
543
+ return '@IsOptional()';
544
+ }
545
+ /**
546
+ * Get TypeScript type for a value.
547
+ *
548
+ * @param value - Value to get type for
549
+ * @returns TypeScript type string
550
+ */
551
+ getTypeScriptType(value) {
552
+ if (typeof value === 'string')
553
+ return 'string';
554
+ if (typeof value === 'number')
555
+ return 'number';
556
+ if (typeof value === 'boolean')
557
+ return 'boolean';
558
+ if (Array.isArray(value))
559
+ return 'any[]';
560
+ if (typeof value === 'object')
561
+ return 'object';
562
+ return 'any';
563
+ }
564
+ /**
565
+ * Get validation check for custom validation.
566
+ *
567
+ * @param key - Configuration key
568
+ * @param value - Configuration value
569
+ * @returns Validation check string
570
+ */
571
+ getValidationCheck(key, value) {
572
+ if (typeof value === 'string') {
573
+ return `if (!config.${key} || typeof config.${key} !== 'string') errors.push('${key} must be a string');`;
574
+ }
575
+ if (typeof value === 'number') {
576
+ return `if (config.${key} === undefined || typeof config.${key} !== 'number') errors.push('${key} must be a number');`;
577
+ }
578
+ if (typeof value === 'boolean') {
579
+ return `if (config.${key} === undefined || typeof config.${key} !== 'boolean') errors.push('${key} must be a boolean');`;
580
+ }
581
+ return `if (config.${key} === undefined) errors.push('${key} is required');`;
582
+ }
583
+ };
584
+ ValidationIntegrationService = ValidationIntegrationService_1 = __decorate([
585
+ Injectable(),
586
+ __metadata("design:paramtypes", [])
587
+ ], ValidationIntegrationService);
588
+ export { ValidationIntegrationService };
589
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1pbnRlZ3JhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2ludGVncmF0aW9uL3NlcnZpY2VzL3ZhbGlkYXRpb24taW50ZWdyYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQWFwRDs7R0FFRztBQUNILE1BQU0sT0FBTyxxQkFBcUI7SUFDaEMsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNMLEdBQUcsQ0FBTTtJQUVqQjtRQUNFLElBQUksQ0FBQztZQUNILGdDQUFnQztZQUNoQyxJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsdUJBQXVCO1lBQ3ZCLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUVELFFBQVEsQ0FBQyxNQUFXLEVBQUUsTUFBVztRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2QsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDO1FBQzlELENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxvRkFBb0Y7WUFDcEYsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ2pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxF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QW1DLEdBQUcsZ0NBQWdDLEdBQUcsdUJBQXVCLENBQUM7UUFDM0gsQ0FBQztRQUNELE9BQU8sY0FBYyxHQUFHLGdDQUFnQyxHQUFHLGlCQUFpQixDQUFDO0lBQy9FLENBQUM7Q0FDRixDQUFBO0FBNWlCWSw0QkFBNEI7SUFEeEMsVUFBVSxFQUFFOztHQUNBLDRCQUE0QixDQTRpQnhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTG9nZ2VyIH0gZnJvbSAnQG5lc3Rqcy9jb21tb24nO1xyXG5pbXBvcnQgeyBDb25maWdGYWN0b3J5IH0gZnJvbSAnQG5lc3Rqcy9jb25maWcnO1xyXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uU291cmNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb25maWd1cmF0aW9uLXNvdXJjZS5pbnRlcmZhY2UnO1xyXG5cclxuLyoqXHJcbiAqIEludGVyZmFjZSBmb3IgdmFsaWRhdGlvbiBzY2hlbWEgcHJvdmlkZXJzLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uU2NoZW1hUHJvdmlkZXIge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB2YWxpZGF0ZShjb25maWc6IGFueSwgc2NoZW1hOiBhbnkpOiB7IGlzVmFsaWQ6IGJvb2xlYW47IGVycm9yczogc3RyaW5nW10gfTtcclxuICBpc0F2YWlsYWJsZSgpOiBib29sZWFuO1xyXG59XHJcblxyXG4vKipcclxuICogSm9pIHZhbGlkYXRpb24gc2NoZW1hIHByb3ZpZGVyLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEpvaVZhbGlkYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIFZhbGlkYXRpb25TY2hlbWFQcm92aWRlciB7XHJcbiAgbmFtZSA9ICdqb2knO1xyXG4gIHByaXZhdGUgam9pOiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gVHJ5IHRvIGltcG9ydCBKb2kgZHluYW1pY2FsbHlcclxuICAgICAgdGhpcy5qb2kgPSByZXF1aXJlKCdqb2knKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICAvLyBKb2kgaXMgbm90IGF2YWlsYWJsZVxyXG4gICAgICB0aGlzLmpvaSA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0F2YWlsYWJsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmpvaSAhPT0gbnVsbDtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlKGNvbmZpZzogYW55LCBzY2hlbWE6IGFueSk6IHsgaXNWYWxpZDogYm9vbGVhbjsgZXJyb3JzOiBzdHJpbmdbXSB9IHtcclxuICAgIGlmICghdGhpcy5qb2kpIHtcclxuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9yczogWydKb2kgaXMgbm90IGF2YWlsYWJsZSddIH07XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gVXNlIGpvaS5hdHRlbXB0IHdoaWNoIHRocm93cyBvbiB2YWxpZGF0aW9uIGVycm9yLCBvciBmYWxsIGJhY2sgdG8gc2NoZW1hLnZhbGlkYXRlXHJcbiAgICAgIGlmICh0aGlzLmpvaS5hdHRlbXB0KSB7XHJcbiAgICAgICAgdGhpcy5qb2kuYXR0ZW1wdChjb25maWcsIHNjaGVtYSk7XHJcbiAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogdHJ1ZSwgZXJyb3JzOiBbXSB9O1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICBjb25zdCB7IGVycm9yIH0gPSBzY2hlbWEudmFsaWRhdGUoY29uZmlnKTtcclxuICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3JzID0gZXJyb3IuZGV0YWlscz8ubWFwKChkZXRhaWw6IGFueSkgPT4gZGV0YWlsLm1lc3NhZ2UpIHx8IFtlcnJvci5tZXNzYWdlXTtcclxuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JzIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUsIGVycm9yczogW10gfTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9yczogW3ZhbGlkYXRpb25FcnJvci5tZXNzYWdlXSB9O1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENsYXNzLXZhbGlkYXRvciB2YWxpZGF0aW9uIHNjaGVtYSBwcm92aWRlci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBDbGFzc1ZhbGlkYXRvclByb3ZpZGVyIGltcGxlbWVudHMgVmFsaWRhdGlvblNjaGVtYVByb3ZpZGVyIHtcclxuICBuYW1lID0gJ2NsYXNzLXZhbGlkYXRvcic7XHJcbiAgcHJpdmF0ZSBjbGFzc1ZhbGlkYXRvcjogYW55O1xyXG4gIHByaXZhdGUgY2xhc3NUcmFuc2Zvcm1lcjogYW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIFRyeSB0byBpbXBvcnQgY2xhc3MtdmFsaWRhdG9yIGFuZCBjbGFzcy10cmFuc2Zvcm1lciBkeW5hbWljYWxseVxyXG4gICAgICB0aGlzLmNsYXNzVmFsaWRhdG9yID0gcmVxdWlyZSgnY2xhc3MtdmFsaWRhdG9yJyk7XHJcbiAgICAgIHRoaXMuY2xhc3NUcmFuc2Zvcm1lciA9IHJlcXVpcmUoJ2NsYXNzLXRyYW5zZm9ybWVyJyk7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgLy8gY2xhc3MtdmFsaWRhdG9yIGlzIG5vdCBhdmFpbGFibGVcclxuICAgICAgdGhpcy5jbGFzc1ZhbGlkYXRvciA9IG51bGw7XHJcbiAgICAgIHRoaXMuY2xhc3NUcmFuc2Zvcm1lciA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0F2YWlsYWJsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmNsYXNzVmFsaWRhdG9yICE9PSBudWxsICYmIHRoaXMuY2xhc3NUcmFuc2Zvcm1lciAhPT0gbnVsbDtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlKGNvbmZpZzogYW55LCBzY2hlbWFDbGFzczogYW55KTogeyBpc1ZhbGlkOiBib29sZWFuOyBlcnJvcnM6IHN0cmluZ1tdIH0ge1xyXG4gICAgaWYgKCF0aGlzLmNsYXNzVmFsaWRhdG9yIHx8ICF0aGlzLmNsYXNzVHJhbnNmb3JtZXIpIHtcclxuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9yczogWydjbGFzcy12YWxpZGF0b3Igb3IgY2xhc3MtdHJhbnNmb3JtZXIgaXMgbm90IGF2YWlsYWJsZSddIH07XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gVHJhbnNmb3JtIHBsYWluIG9iamVjdCB0byBjbGFzcyBpbnN0YW5jZVxyXG4gICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuY2xhc3NUcmFuc2Zvcm1lci5wbGFpblRvQ2xhc3Moc2NoZW1hQ2xhc3MsIGNvbmZpZyk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBWYWxpZGF0ZSB0aGUgaW5zdGFuY2VcclxuICAgICAgY29uc3QgZXJyb3JzID0gdGhpcy5jbGFzc1ZhbGlkYXRvci52YWxpZGF0ZVN5bmMoaW5zdGFuY2UpO1xyXG4gICAgICBcclxuICAgICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZXMgPSBlcnJvcnMubWFwKChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBjb25zdHJhaW50cyA9IGVycm9yLmNvbnN0cmFpbnRzIHx8IHt9O1xyXG4gICAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoY29uc3RyYWludHMpLmpvaW4oJywgJyk7XHJcbiAgICAgICAgfSkuZmlsdGVyKChtc2c6IHN0cmluZykgPT4gbXNnLmxlbmd0aCA+IDApO1xyXG5cclxuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JzOiBlcnJvck1lc3NhZ2VzIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUsIGVycm9yczogW10gfTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIGVycm9yczogW3ZhbGlkYXRpb25FcnJvci5tZXNzYWdlXSB9O1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uIHByb3ZpZGVyLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEN1c3RvbVZhbGlkYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIFZhbGlkYXRpb25TY2hlbWFQcm92aWRlciB7XHJcbiAgbmFtZSA9ICdjdXN0b20nO1xyXG5cclxuICBpc0F2YWlsYWJsZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGUoY29uZmlnOiBhbnksIHZhbGlkYXRpb25GbjogKGNvbmZpZzogYW55KSA9PiBzdHJpbmdbXSB8IHZvaWQpOiB7IGlzVmFsaWQ6IGJvb2xlYW47IGVycm9yczogc3RyaW5nW10gfSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSB2YWxpZGF0aW9uRm4oY29uZmlnKTtcclxuICAgICAgXHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgcmVzdWx0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JzOiByZXN1bHQgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogdHJ1ZSwgZXJyb3JzOiBbXSB9O1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc3QgdmFsaWRhdGlvbkVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKFN0cmluZyhlcnJvcikpO1xyXG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiBmYWxzZSwgZXJyb3JzOiBbdmFsaWRhdGlvbkVycm9yLm1lc3NhZ2VdIH07XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogU2VydmljZSBmb3IgaW50ZWdyYXRpbmcgQVdTLXNvdXJjZWQgY29uZmlndXJhdGlvbiB3aXRoIEBuZXN0anMvY29uZmlnIHZhbGlkYXRpb24uXHJcbiAqIFN1cHBvcnRzIEpvaSwgY2xhc3MtdmFsaWRhdG9yLCBhbmQgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb25zLlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkludGVncmF0aW9uU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKFZhbGlkYXRpb25JbnRlZ3JhdGlvblNlcnZpY2UubmFtZSk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB2YWxpZGF0aW9uUHJvdmlkZXJzOiBNYXA8c3RyaW5nLCBWYWxpZGF0aW9uU2NoZW1hUHJvdmlkZXI+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIC8vIFJlZ2lzdGVyIGF2YWlsYWJsZSB2YWxpZGF0aW9uIHByb3ZpZGVyc1xyXG4gICAgdGhpcy5yZWdpc3RlclZhbGlkYXRpb25Qcm92aWRlcnMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIHZhbGlkYXRlZCBjb25maWd1cmF0aW9uIGZhY3RvcnkuXHJcbiAgICogVGhpcyBmYWN0b3J5IHdpbGwgdmFsaWRhdGUgQVdTLXNvdXJjZWQgY29uZmlndXJhdGlvbiBiZWZvcmUgcmV0dXJuaW5nIGl0LlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBuYW1lc3BhY2UgLSBPcHRpb25hbCBuYW1lc3BhY2UgZm9yIHRoZSBjb25maWd1cmF0aW9uXHJcbiAgICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZGF0YSB0byB2YWxpZGF0ZVxyXG4gICAqIEBwYXJhbSB2YWxpZGF0aW9uU2NoZW1hIC0gVmFsaWRhdGlvbiBzY2hlbWEgKEpvaSBzY2hlbWEsIGNsYXNzLXZhbGlkYXRvciBjbGFzcywgb3IgY3VzdG9tIGZ1bmN0aW9uKVxyXG4gICAqIEBwYXJhbSB2YWxpZGF0aW9uVHlwZSAtIFR5cGUgb2YgdmFsaWRhdGlvbiAoJ2pvaScsICdjbGFzcy12YWxpZGF0b3InLCBvciAnY3VzdG9tJylcclxuICAgKiBAcGFyYW0gc291cmNlcyAtIENvbmZpZ3VyYXRpb24gc291cmNlcyBtZXRhZGF0YVxyXG4gICAqIEByZXR1cm5zIFZhbGlkYXRlZCBjb25maWd1cmF0aW9uIGZhY3RvcnlcclxuICAgKi9cclxuICBjcmVhdGVWYWxpZGF0ZWRGYWN0b3J5KFxyXG4gICAgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXHJcbiAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXHJcbiAgICB2YWxpZGF0aW9uU2NoZW1hOiBhbnksXHJcbiAgICB2YWxpZGF0aW9uVHlwZTogJ2pvaScgfCAnY2xhc3MtdmFsaWRhdG9yJyB8ICdjdXN0b20nLFxyXG4gICAgc291cmNlcz86IENvbmZpZ3VyYXRpb25Tb3VyY2VbXVxyXG4gICk6IENvbmZpZ0ZhY3Rvcnkge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoYENyZWF0aW5nIHZhbGlkYXRlZCBmYWN0b3J5IGZvciBuYW1lc3BhY2U6ICR7bmFtZXNwYWNlIHx8ICdkZWZhdWx0J30gd2l0aCAke3ZhbGlkYXRpb25UeXBlfSB2YWxpZGF0aW9uYCk7XHJcblxyXG4gICAgY29uc3QgZmFjdG9yeSA9ICgpID0+IHtcclxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFZhbGlkYXRlZCBmYWN0b3J5IGNhbGxlZCBmb3IgbmFtZXNwYWNlOiAke25hbWVzcGFjZSB8fCAnZGVmYXVsdCd9YCk7XHJcblxyXG4gICAgICAvLyBWYWxpZGF0ZSBjb25maWd1cmF0aW9uXHJcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSB0aGlzLnZhbGlkYXRlQ29uZmlndXJhdGlvbihjb25maWcsIHZhbGlkYXRpb25TY2hlbWEsIHZhbGlkYXRpb25UeXBlLCBzb3VyY2VzKTtcclxuXHJcbiAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBmYWlsZWQgZm9yICR7bmFtZXNwYWNlIHx8ICdkZWZhdWx0J306ICR7dmFsaWRhdGlvblJlc3VsdC5lcnJvcnMuam9pbignLCAnKX1gO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ3JlYXRlIGRldGFpbGVkIGVycm9yIHdpdGggc291cmNlIGluZm9ybWF0aW9uXHJcbiAgICAgICAgY29uc3QgZGV0YWlsZWRFcnJvciA9IHRoaXMuY3JlYXRlVmFsaWRhdGlvbkVycm9yKFxyXG4gICAgICAgICAgbmFtZXNwYWNlIHx8ICdkZWZhdWx0JyxcclxuICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQuZXJyb3JzLFxyXG4gICAgICAgICAgc291cmNlc1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhyb3cgZGV0YWlsZWRFcnJvcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBwYXNzZWQgZm9yIG5hbWVzcGFjZTogJHtuYW1lc3BhY2UgfHwgJ2RlZmF1bHQnfWApO1xyXG4gICAgICByZXR1cm4gY29uZmlnO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBBZGQgdmFsaWRhdGlvbiBtZXRhZGF0YVxyXG4gICAgKGZhY3RvcnkgYXMgYW55KS5fX2lzVmFsaWRhdGVkRmFjdG9yeSA9IHRydWU7XHJcbiAgICAoZmFjdG9yeSBhcyBhbnkpLl9fdmFsaWRhdGlvblR5cGUgPSB2YWxpZGF0aW9uVHlwZTtcclxuICAgIChmYWN0b3J5IGFzIGFueSkuX19uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XHJcbiAgICAoZmFjdG9yeSBhcyBhbnkpLl9fc291cmNlcyA9IHNvdXJjZXM/Lm1hcChzID0+IHMubmFtZSkgfHwgW107XHJcblxyXG4gICAgcmV0dXJuIGZhY3Rvcnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZSBjb25maWd1cmF0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQgdmFsaWRhdGlvbiB0eXBlIGFuZCBzY2hlbWEuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdG8gdmFsaWRhdGVcclxuICAgKiBAcGFyYW0gc2NoZW1hIC0gVmFsaWRhdGlvbiBzY2hlbWFcclxuICAgKiBAcGFyYW0gdmFsaWRhdGlvblR5cGUgLSBUeXBlIG9mIHZhbGlkYXRpb25cclxuICAgKiBAcGFyYW0gc291cmNlcyAtIENvbmZpZ3VyYXRpb24gc291cmNlcyBmb3IgZXJyb3IgcmVwb3J0aW5nXHJcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHRcclxuICAgKi9cclxuICB2YWxpZGF0ZUNvbmZpZ3VyYXRpb24oXHJcbiAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXHJcbiAgICBzY2hlbWE6IGFueSxcclxuICAgIHZhbGlkYXRpb25UeXBlOiAnam9pJyB8ICdjbGFzcy12YWxpZGF0b3InIHwgJ2N1c3RvbScsXHJcbiAgICBzb3VyY2VzPzogQ29uZmlndXJhdGlvblNvdXJjZVtdXHJcbiAgKTogeyBpc1ZhbGlkOiBib29sZWFuOyBlcnJvcnM6IHN0cmluZ1tdOyB3YXJuaW5nczogc3RyaW5nW10gfSB7XHJcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMudmFsaWRhdGlvblByb3ZpZGVycy5nZXQodmFsaWRhdGlvblR5cGUpO1xyXG4gICAgXHJcbiAgICBpZiAoIXByb3ZpZGVyKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXHJcbiAgICAgICAgZXJyb3JzOiBbYFZhbGlkYXRpb24gcHJvdmlkZXIgJyR7dmFsaWRhdGlvblR5cGV9JyBpcyBub3QgYXZhaWxhYmxlYF0sXHJcbiAgICAgICAgd2FybmluZ3M6IFtdXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFwcm92aWRlci5pc0F2YWlsYWJsZSgpKSB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXHJcbiAgICAgICAgZXJyb3JzOiBbYFZhbGlkYXRpb24gcHJvdmlkZXIgJyR7dmFsaWRhdGlvblR5cGV9JyBpcyBub3QgcHJvcGVybHkgY29uZmlndXJlZGBdLFxyXG4gICAgICAgIHdhcm5pbmdzOiBbXVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHByb3ZpZGVyLnZhbGlkYXRlKGNvbmZpZywgc2NoZW1hKTtcclxuICAgICAgXHJcbiAgICAgIC8vIEFkZCBzb3VyY2UgaW5mb3JtYXRpb24gdG8gZXJyb3JzXHJcbiAgICAgIGNvbnN0IGVuaGFuY2VkRXJyb3JzID0gcmVzdWx0LmVycm9ycy5tYXAoZXJyb3IgPT4gXHJcbiAgICAgICAgdGhpcy5lbmhhbmNlRXJyb3JXaXRoU291cmNlSW5mbyhlcnJvciwgc291cmNlcylcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgaXNWYWxpZDogcmVzdWx0LmlzVmFsaWQsXHJcbiAgICAgICAgZXJyb3JzOiBlbmhhbmNlZEVycm9ycyxcclxuICAgICAgICB3YXJuaW5nczogW11cclxuICAgICAgfTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcclxuICAgICAgICBlcnJvcnM6IFt2YWxpZGF0aW9uRXJyb3IubWVzc2FnZV0sXHJcbiAgICAgICAgd2FybmluZ3M6IFtdXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSBmYWN0b3J5IHRoYXQgdmFsaWRhdGVzIGNvbmZpZ3VyYXRpb24gYW5kIHByb3ZpZGVzIGZhbGxiYWNrIHZhbHVlcy5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gT3B0aW9uYWwgbmFtZXNwYWNlXHJcbiAgICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZGF0YVxyXG4gICAqIEBwYXJhbSB2YWxpZGF0aW9uU2NoZW1hIC0gVmFsaWRhdGlvbiBzY2hlbWFcclxuICAgKiBAcGFyYW0gdmFsaWRhdGlvblR5cGUgLSBUeXBlIG9mIHZhbGlkYXRpb25cclxuICAgKiBAcGFyYW0gZmFsbGJhY2tDb25maWcgLSBGYWxsYmFjayBjb25maWd1cmF0aW9uIHRvIHVzZSBpZiB2YWxpZGF0aW9uIGZhaWxzXHJcbiAgICogQHBhcmFtIHNvdXJjZXMgLSBDb25maWd1cmF0aW9uIHNvdXJjZXNcclxuICAgKiBAcmV0dXJucyBGYWN0b3J5IHdpdGggdmFsaWRhdGlvbiBhbmQgZmFsbGJhY2tcclxuICAgKi9cclxuICBjcmVhdGVWYWxpZGF0ZWRGYWN0b3J5V2l0aEZhbGxiYWNrKFxyXG4gICAgbmFtZXNwYWNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXHJcbiAgICBjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXHJcbiAgICB2YWxpZGF0aW9uU2NoZW1hOiBhbnksXHJcbiAgICB2YWxpZGF0aW9uVHlwZTogJ2pvaScgfCAnY2xhc3MtdmFsaWRhdG9yJyB8ICdjdXN0b20nLFxyXG4gICAgZmFsbGJhY2tDb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4sXHJcbiAgICBzb3VyY2VzPzogQ29uZmlndXJhdGlvblNvdXJjZVtdXHJcbiAgKTogQ29uZmlnRmFjdG9yeSB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQ3JlYXRpbmcgdmFsaWRhdGVkIGZhY3Rvcnkgd2l0aCBmYWxsYmFjayBmb3IgbmFtZXNwYWNlOiAke25hbWVzcGFjZSB8fCAnZGVmYXVsdCd9YCk7XHJcblxyXG4gICAgY29uc3QgZmFjdG9yeSA9ICgpID0+IHtcclxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFZhbGlkYXRlZCBmYWN0b3J5IHdpdGggZmFsbGJhY2sgY2FsbGVkIGZvciBuYW1lc3BhY2U6ICR7bmFtZXNwYWNlIHx8ICdkZWZhdWx0J31gKTtcclxuXHJcbiAgICAgIC8vIFZhbGlkYXRlIGNvbmZpZ3VyYXRpb25cclxuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IHRoaXMudmFsaWRhdGVDb25maWd1cmF0aW9uKGNvbmZpZywgdmFsaWRhdGlvblNjaGVtYSwgdmFsaWRhdGlvblR5cGUsIHNvdXJjZXMpO1xyXG5cclxuICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0LmlzVmFsaWQpIHtcclxuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBDb25maWd1cmF0aW9uIHZhbGlkYXRpb24gZmFpbGVkIGZvciAke25hbWVzcGFjZSB8fCAnZGVmYXVsdCd9LCB1c2luZyBmYWxsYmFjazogJHt2YWxpZGF0aW9uUmVzdWx0LmVycm9ycy5qb2luKCcsICcpfWApO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFZhbGlkYXRlIGZhbGxiYWNrIGNvbmZpZ3VyYXRpb25cclxuICAgICAgICBjb25zdCBmYWxsYmFja1ZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRlQ29uZmlndXJhdGlvbihmYWxsYmFja0NvbmZpZywgdmFsaWRhdGlvblNjaGVtYSwgdmFsaWRhdGlvblR5cGUpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmIChmYWxsYmFja1ZhbGlkYXRpb24uaXNWYWxpZCkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbGxiYWNrQ29uZmlnO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBCb3RoIHByaW1hcnkgYW5kIGZhbGxiYWNrIGZhaWxlZFxyXG4gICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYEJvdGggcHJpbWFyeSBhbmQgZmFsbGJhY2sgY29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgJHtuYW1lc3BhY2UgfHwgJ2RlZmF1bHQnfWA7XHJcbiAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBjb25zdCBkZXRhaWxlZEVycm9yID0gdGhpcy5jcmVhdGVWYWxpZGF0aW9uRXJyb3IoXHJcbiAgICAgICAgICAgIG5hbWVzcGFjZSB8fCAnZGVmYXVsdCcsXHJcbiAgICAgICAgICAgIFsuLi52YWxpZGF0aW9uUmVzdWx0LmVycm9ycywgLi4uZmFsbGJhY2tWYWxpZGF0aW9uLmVycm9yc10sXHJcbiAgICAgICAgICAgIHNvdXJjZXNcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIHRocm93IGRldGFpbGVkRXJyb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHBhc3NlZCBmb3IgbmFtZXNwYWNlOiAke25hbWVzcGFjZSB8fCAnZGVmYXVsdCd9YCk7XHJcbiAgICAgIHJldHVybiBjb25maWc7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEFkZCBtZXRhZGF0YVxyXG4gICAgKGZhY3RvcnkgYXMgYW55KS5fX2lzVmFsaWRhdGVkRmFjdG9yeSA9IHRydWU7XHJcbiAgICAoZmFjdG9yeSBhcyBhbnkpLl9faGFzRmFsbGJhY2sgPSB0cnVlO1xyXG4gICAgKGZhY3RvcnkgYXMgYW55KS5fX3ZhbGlkYXRpb25UeXBlID0gdmFsaWRhdGlvblR5cGU7XHJcbiAgICAoZmFjdG9yeSBhcyBhbnkpLl9fbmFtZXNwYWNlID0gbmFtZXNwYWNlO1xyXG4gICAgKGZhY3RvcnkgYXMgYW55KS5fX3NvdXJjZXMgPSBzb3VyY2VzPy5tYXAocyA9PiBzLm5hbWUpIHx8IFtdO1xyXG5cclxuICAgIHJldHVybiBmYWN0b3J5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGUgbXVsdGlwbGUgbmFtZXNwYWNlIGNvbmZpZ3VyYXRpb25zLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBuYW1lc3BhY2VkQ29uZmlnIC0gQ29uZmlndXJhdGlvbiBvcmdhbml6ZWQgYnkgbmFtZXNwYWNlXHJcbiAgICogQHBhcmFtIHZhbGlkYXRpb25TY2hlbWFzIC0gVmFsaWRhdGlvbiBzY2hlbWFzIGZvciBlYWNoIG5hbWVzcGFjZVxyXG4gICAqIEBwYXJhbSB2YWxpZGF0aW9uVHlwZSAtIFR5cGUgb2YgdmFsaWRhdGlvblxyXG4gICAqIEBwYXJhbSBzb3VyY2VzIC0gQ29uZmlndXJhdGlvbiBzb3VyY2VzXHJcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHRzIGZvciBlYWNoIG5hbWVzcGFjZVxyXG4gICAqL1xyXG4gIHZhbGlkYXRlTmFtZXNwYWNlZENvbmZpZ3VyYXRpb24oXHJcbiAgICBuYW1lc3BhY2VkQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBhbnk+PixcclxuICAgIHZhbGlkYXRpb25TY2hlbWFzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxyXG4gICAgdmFsaWRhdGlvblR5cGU6ICdqb2knIHwgJ2NsYXNzLXZhbGlkYXRvcicgfCAnY3VzdG9tJyxcclxuICAgIHNvdXJjZXM/OiBDb25maWd1cmF0aW9uU291cmNlW11cclxuICApOiBSZWNvcmQ8c3RyaW5nLCB7IGlzVmFsaWQ6IGJvb2xlYW47IGVycm9yczogc3RyaW5nW107IHdhcm5pbmdzOiBzdHJpbmdbXSB9PiB7XHJcbiAgICBjb25zdCByZXN1bHRzOiBSZWNvcmQ8c3RyaW5nLCB7IGlzVmFsaWQ6IGJvb2xlYW47IGVycm9yczogc3RyaW5nW107IHdhcm5pbmdzOiBzdHJpbmdbXSB9PiA9IHt9O1xyXG5cclxuICAgIGZvciAoY29uc3QgW25hbWVzcGFjZSwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhuYW1lc3BhY2VkQ29uZmlnKSkge1xyXG4gICAgICBjb25zdCBzY2hlbWEgPSB2YWxpZGF0aW9uU2NoZW1hc1tuYW1lc3BhY2VdO1xyXG4gICAgICBcclxuICAgICAgaWYgKHNjaGVtYSkge1xyXG4gICAgICAgIHJlc3VsdHNbbmFtZXNwYWNlXSA9IHRoaXMudmFsaWRhdGVDb25maWd1cmF0aW9uKGNvbmZpZywgc2NoZW1hLCB2YWxpZGF0aW9uVHlwZSwgc291cmNlcyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0c1tuYW1lc3BhY2VdID0ge1xyXG4gICAgICAgICAgaXNWYWxpZDogdHJ1ZSxcclxuICAgICAgICAgIGVycm9yczogW10sXHJcbiAgICAgICAgICB3YXJuaW5nczogW2BObyB2YWxpZGF0aW9uIHNjaGVtYSBwcm92aWRlZCBmb3IgbmFtZXNwYWNlOiAke25hbWVzcGFjZX1gXVxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0cztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIHdoaWNoIHZhbGlkYXRpb24gcHJvdmlkZXJzIGFyZSBhdmFpbGFibGUuXHJcbiAgICogXHJcbiAgICogQHJldHVybnMgT2JqZWN0IGluZGljYXRpbmcgYXZhaWxhYmlsaXR5IG9mIGVhY2ggcHJvdmlkZXJcclxuICAgKi9cclxuICBnZXRBdmFpbGFibGVWYWxpZGF0aW9uUHJvdmlkZXJzKCk6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IGF2YWlsYWJpbGl0eTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcclxuICAgIFxyXG4gICAgZm9yIChjb25zdCBbbmFtZSwgcHJvdmlkZXJdIG9mIHRoaXMudmFsaWRhdGlvblByb3ZpZGVycykge1xyXG4gICAgICBhdmFpbGFiaWxpdHlbbmFtZV0gPSBwcm92aWRlci5pc0F2YWlsYWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhdmFpbGFiaWxpdHk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdmFsaWRhdGlvbiByZWNvbW1lbmRhdGlvbnMgYmFzZWQgb24gY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdG8gYW5hbHl6ZVxyXG4gICAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVjb21tZW5kYXRpb25zXHJcbiAgICovXHJcbiAgZ2V0VmFsaWRhdGlvblJlY29tbWVuZGF0aW9ucyhjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4pOiB7XHJcbiAgICByZWNvbW1lbmRlZFByb3ZpZGVyOiBzdHJpbmc7XHJcbiAgICByZWFzb25zOiBzdHJpbmdbXTtcclxuICAgIGV4YW1wbGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xyXG4gIH0ge1xyXG4gICAgY29uc3QgYW5hbHlzaXMgPSB0aGlzLmFuYWx5emVDb25maWd1cmF0aW9uU3RydWN0dXJlKGNvbmZpZyk7XHJcbiAgICBcclxuICAgIGxldCByZWNvbW1lbmRlZFByb3ZpZGVyID0gJ2N1c3RvbSc7XHJcbiAgICBjb25zdCByZWFzb25zOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgY29uc3QgZXhhbXBsZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcclxuXHJcbiAgICAvLyBEZXRlcm1pbmUgYmVzdCB2YWxpZGF0aW9uIGFwcHJvYWNoXHJcbiAgICBpZiAoYW5hbHlzaXMuaGFzQ29tcGxleE5lc3RpbmcgfHwgYW5hbHlzaXMuaGFzQXJyYXlzKSB7XHJcbiAgICAgIGlmICh0aGlzLnZhbGlkYXRpb25Qcm92aWRlcnMuZ2V0KCdqb2knKT8uaXNBdmFpbGFibGUoKSkge1xyXG4gICAgICAgIHJlY29tbWVuZGVkUHJvdmlkZXIgPSAnam9pJztcclxuICAgICAgICByZWFzb25zLnB1c2goJ0NvbXBsZXggbmVzdGVkIHN0cnVjdHVyZSBkZXRlY3RlZCAtIEpvaSBwcm92aWRlcyBleGNlbGxlbnQgbmVzdGVkIHZhbGlkYXRpb24nKTtcclxuICAgICAgICBleGFtcGxlc1snam9pJ10gPSB0aGlzLmdlbmVyYXRlSm9pRXhhbXBsZShjb25maWcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGFuYWx5c2lzLmhhc1R5cGVkVmFsdWVzICYmIHRoaXMudmFsaWRhdGlvblByb3ZpZGVycy5nZXQoJ2NsYXNzLXZhbGlkYXRvcicpPy5pc0F2YWlsYWJsZSgpKSB7XHJcbiAgICAgIHJlY29tbWVuZGVkUHJvdmlkZXIgPSAnY2xhc3MtdmFsaWRhdG9yJztcclxuICAgICAgcmVhc29ucy5wdXNoKCdUeXBlZCB2YWx1ZXMgZGV0ZWN0ZWQgLSBjbGFzcy12YWxpZGF0b3IgcHJvdmlkZXMgc3Ryb25nIHR5cGUgc2FmZXR5Jyk7XHJcbiAgICAgIGV4YW1wbGVzWydjbGFzcy12YWxpZGF0b3InXSA9IHRoaXMuZ2VuZXJhdGVDbGFzc1ZhbGlkYXRvckV4YW1wbGUoY29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBbHdheXMgcHJvdmlkZSBjdXN0b20gZXhhbXBsZVxyXG4gICAgZXhhbXBsZXNbJ2N1c3RvbSddID0gdGhpcy5nZW5lcmF0ZUN1c3RvbVZhbGlkYXRpb25FeGFtcGxlKGNvbmZpZyk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmVjb21tZW5kZWRQcm92aWRlcixcclxuICAgICAgcmVhc29ucyxcclxuICAgICAgZXhhbXBsZXNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlciB2YWxpZGF0aW9uIHByb3ZpZGVycy5cclxuICAgKi9cclxuICBwcml2YXRlIHJlZ2lzdGVyVmFsaWRhdGlvblByb3ZpZGVycygpOiB2b2lkIHtcclxuICAgIHRoaXMudmFsaWRhdGlvblByb3ZpZGVycy5zZXQoJ2pvaScsIG5ldyBKb2lWYWxpZGF0aW9uUHJvdmlkZXIoKSk7XHJcbiAgICB0aGlzLnZhbGlkYXRpb25Qcm92aWRlcnMuc2V0KCdjbGFzcy12YWxpZGF0b3InLCBuZXcgQ2xhc3NWYWxpZGF0b3JQcm92aWRlcigpKTtcclxuICAgIHRoaXMudmFsaWRhdGlvblByb3ZpZGVycy5zZXQoJ2N1c3RvbScsIG5ldyBDdXN0b21WYWxpZGF0aW9uUHJvdmlkZXIoKSk7XHJcblxyXG4gICAgLy8gTG9nIGF2YWlsYWJsZSBwcm92aWRlcnNcclxuICAgIGNvbnN0IGF2YWlsYWJsZSA9IEFycmF5LmZyb20odGhpcy52YWxpZGF0aW9uUHJvdmlkZXJzLmVudHJpZXMoKSlcclxuICAgICAgLmZpbHRlcigoW18sIHByb3ZpZGVyXSkgPT4gcHJvdmlkZXIuaXNBdmFpbGFibGUoKSlcclxuICAgICAgLm1hcCgoW25hbWVdKSA9PiBuYW1lKTtcclxuXHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQXZhaWxhYmxlIHZhbGlkYXRpb24gcHJvdmlkZXJzOiAke2F2YWlsYWJsZS5qb2luKCcsICcpfWApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgZGV0YWlsZWQgdmFsaWRhdGlvbiBlcnJvciB3aXRoIHNvdXJjZSBpbmZvcm1hdGlvbi5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gbmFtZXNwYWNlIC0gTmFtZXNwYWNlIHRoYXQgZmFpbGVkIHZhbGlkYXRpb25cclxuICAgKiBAcGFyYW0gZXJyb3JzIC0gVmFsaWRhdGlvbiBlcnJvcnNcclxuICAgKiBAcGFyYW0gc291cmNlcyAtIENvbmZpZ3VyYXRpb24gc291cmNlc1xyXG4gICAqIEByZXR1cm5zIERldGFpbGVkIGVycm9yXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVWYWxpZGF0aW9uRXJyb3IoXHJcbiAgICBuYW1lc3BhY2U6IHN0cmluZyxcclxuICAgIGVycm9yczogc3RyaW5nW10sXHJcbiAgICBzb3VyY2VzPzogQ29uZmlndXJhdGlvblNvdXJjZVtdXHJcbiAgKTogRXJyb3Ige1xyXG4gICAgbGV0IG1lc3NhZ2UgPSBgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgbmFtZXNwYWNlICcke25hbWVzcGFjZX0nOlxcbmA7XHJcbiAgICBtZXNzYWdlICs9IGVycm9ycy5tYXAoZXJyb3IgPT4gYCAgLSAke2Vycm9yfWApLmpvaW4oJ1xcbicpO1xyXG5cclxuICAgIGlmIChzb3VyY2VzICYmIHNvdXJjZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBtZXNzYWdlICs9ICdcXG5cXG5Db25maWd1cmF0aW9uIHNvdXJjZXM6XFxuJztcclxuICAgICAgbWVzc2FnZSArPSBzb3VyY2VzLm1hcChzb3VyY2UgPT4gXHJcbiAgICAgICAgYCAgLSAke3NvdXJjZS5uYW1lfSAoJHtzb3VyY2UudHlwZX0pOiAke09iamVjdC5rZXlzKHNvdXJjZS5kYXRhKS5sZW5ndGh9IGtleXNgXHJcbiAgICAgICkuam9pbignXFxuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICBlcnJvci5uYW1lID0gJ0NvbmZpZ3VyYXRpb25WYWxpZGF0aW9uRXJyb3InO1xyXG4gICAgKGVycm9yIGFzIGFueSkubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xyXG4gICAgKGVycm9yIGFzIGFueSkudmFsaWRhdGlvbkVycm9ycyA9IGVycm9ycztcclxuICAgIChlcnJvciBhcyBhbnkpLnNvdXJjZXMgPSBzb3VyY2VzO1xyXG5cclxuICAgIHJldHVybiBlcnJvcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVuaGFuY2UgZXJyb3IgbWVzc2FnZSB3aXRoIHNvdXJjZSBpbmZvcm1hdGlvbi5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gZXJyb3IgLSBPcmlnaW5hbCBlcnJvciBtZXNzYWdlXHJcbiAgICogQHBhcmFtIHNvdXJjZXMgLSBDb25maWd1cmF0aW9uIHNvdXJjZXNcclxuICAgKiBAcmV0dXJucyBFbmhhbmNlZCBlcnJvciBtZXNzYWdlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBlbmhhbmNlRXJyb3JXaXRoU291cmNlSW5mbyhlcnJvcjogc3RyaW5nLCBzb3VyY2VzPzogQ29uZmlndXJhdGlvblNvdXJjZVtdKTogc3RyaW5nIHtcclxuICAgIGlmICghc291cmNlcyB8fCBzb3VyY2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gZXJyb3I7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc291cmNlTmFtZXMgPSBzb3VyY2VzLm1hcChzID0+IHMubmFtZSkuam9pbignLCAnKTtcclxuICAgIHJldHVybiBgJHtlcnJvcn0gKGZyb20gc291cmNlczogJHtzb3VyY2VOYW1lc30pYDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFuYWx5emUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZm9yIHZhbGlkYXRpb24gcmVjb21tZW5kYXRpb25zLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIHRvIGFuYWx5emVcclxuICAgKiBAcmV0dXJucyBTdHJ1Y3R1cmUgYW5hbHlzaXNcclxuICAgKi9cclxuICBwcml2YXRlIGFuYWx5emVDb25maWd1cmF0aW9uU3RydWN0dXJlKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pik6IHtcclxuICAgIGhhc0NvbXBsZXhOZXN0aW5nOiBib29sZWFuO1xyXG4gICAgaGFzQXJyYXlzOiBib29sZWFuO1xyXG4gICAgaGFzVHlwZWRWYWx1ZXM6IGJvb2xlYW47XHJcbiAgICBkZXB0aDogbnVtYmVyO1xyXG4gIH0ge1xyXG4gICAgbGV0IGhhc0NvbXBsZXhOZXN0aW5nID0gZmFsc2U7XHJcbiAgICBsZXQgaGFzQXJyYXlzID0gZmFsc2U7XHJcbiAgICBsZXQgaGFzVHlwZWRWYWx1ZXMgPSBmYWxzZTtcclxuICAgIGxldCBtYXhEZXB0aCA9IDA7XHJcblxyXG4gICAgY29uc3QgYW5hbHl6ZSA9IChvYmo6IGFueSwgZGVwdGg6IG51bWJlciA9IDApOiB2b2lkID0+IHtcclxuICAgICAgbWF4RGVwdGggPSBNYXRoLm1heChtYXhEZXB0aCwgZGVwdGgpO1xyXG5cclxuICAgICAgaWYgKGRlcHRoID4gMikge1xyXG4gICAgICAgIGhhc0NvbXBsZXhOZXN0aW5nID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKG9iaikpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcclxuICAgICAgICAgIGhhc0FycmF5cyA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICBhbmFseXplKHZhbHVlLCBkZXB0aCArIDEpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgICAgaGFzVHlwZWRWYWx1ZXMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBhbmFseXplKGNvbmZpZyk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaGFzQ29tcGxleE5lc3RpbmcsXHJcbiAgICAgIGhhc0FycmF5cyxcclxuICAgICAgaGFzVHlwZWRWYWx1ZXMsXHJcbiAgICAgIGRlcHRoOiBtYXhEZXB0aFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIEpvaSB2YWxpZGF0aW9uIGV4YW1wbGUuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gdG8gZ2VuZXJhdGUgZXhhbXBsZSBmb3JcclxuICAgKiBAcmV0dXJucyBKb2kgdmFsaWRhdGlvbiBleGFtcGxlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZUpvaUV4YW1wbGUoY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuZ2VuZXJhdGVKb2lTY2hlbWFGcm9tQ29uZmlnKGNvbmZpZyk7XHJcbiAgICByZXR1cm4gYGNvbnN0IEpvaSA9IHJlcXVpcmUoJ2pvaScpO1xyXG5cclxuY29uc3Qgc2NoZW1hID0gJHtzY2hlbWF9O1xyXG5cclxuLy8gVXNhZ2UgaW4gZmFjdG9yeVxyXG5jb25zdCBmYWN0b3J5ID0gKCkgPT4ge1xyXG4gIGNvbnN0IGNvbmZpZyA9IGxvYWRBd3NDb25maWcoKTtcclxuICBjb25zdCB7IGVycm9yLCB2YWx1ZSB9ID0gc2NoZW1hLnZhbGlkYXRlKGNvbmZpZyk7XHJcbiAgaWYgKGVycm9yKSB0aHJvdyBlcnJvcjtcclxuICByZXR1cm4gdmFsdWU7XHJcbn07YDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGNsYXNzLXZhbGlkYXRvciBleGFtcGxlLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIHRvIGdlbmVyYXRlIGV4YW1wbGUgZm9yXHJcbiAgICogQHJldHVybnMgY2xhc3MtdmFsaWRhdG9yIGV4YW1wbGVcclxuICAgKi9cclxuICBwcml2YXRlIGdlbmVyYXRlQ2xhc3NWYWxpZGF0b3JFeGFtcGxlKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBjbGFzc0RlZmluaXRpb24gPSB0aGlzLmdlbmVyYXRlQ2xhc3NGcm9tQ29uZmlnKGNvbmZpZyk7XHJcbiAgICByZXR1cm4gYGltcG9ydCB7IElzU3RyaW5nLCBJc051bWJlciwgSXNPcHRpb25hbCwgdmFsaWRhdGVTeW5jIH0gZnJvbSAnY2xhc3MtdmFsaWRhdG9yJztcclxuaW1wb3J0IHsgcGxhaW5Ub0NsYXNzIH0gZnJvbSAnY2xhc3MtdHJhbnNmb3JtZXInO1xyXG5cclxuJHtjbGFzc0RlZmluaXRpb259XHJcblxyXG4vLyBVc2FnZSBpbiBmYWN0b3J5XHJcbmNvbnN0IGZhY3RvcnkgPSAoKSA9PiB7XHJcbiAgY29uc3QgY29uZmlnID0gbG9hZEF3c0NvbmZpZygpO1xyXG4gIGNvbnN0IGluc3RhbmNlID0gcGxhaW5Ub0NsYXNzKENvbmZpZ0NsYXNzLCBjb25maWcpO1xyXG4gIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlU3luYyhpbnN0YW5jZSk7XHJcbiAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoJ1ZhbGlkYXRpb24gZmFpbGVkJyk7XHJcbiAgcmV0dXJuIGNvbmZpZztcclxufTtgO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgY3VzdG9tIHZhbGlkYXRpb24gZXhhbXBsZS5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiB0byBnZW5lcmF0ZSBleGFtcGxlIGZvclxyXG4gICAqIEByZXR1cm5zIEN1c3RvbSB2YWxpZGF0aW9uIGV4YW1wbGVcclxuICAgKi9cclxuICBwcml2YXRlIGdlbmVyYXRlQ3VzdG9tVmFsaWRhdGlvbkV4YW1wbGUoY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHZhbGlkYXRpb25DaGVja3MgPSB0aGlzLmdlbmVyYXRlVmFsaWRhdGlvbkNoZWNrcyhjb25maWcpO1xyXG4gICAgcmV0dXJuIGBjb25zdCB2YWxpZGF0ZUNvbmZpZyA9IChjb25maWcpID0+IHtcclxuICBjb25zdCBlcnJvcnMgPSBbXTtcclxuICBcclxuJHt2YWxpZGF0aW9uQ2hlY2tzfVxyXG4gIFxyXG4gIHJldHVybiBlcnJvcnM7XHJcbn07XHJcblxyXG4vLyBVc2FnZSBpbiBmYWN0b3J5XHJcbmNvbnN0IGZhY3RvcnkgPSAoKSA9PiB7XHJcbiAgY29uc3QgY29uZmlnID0gbG9hZEF3c0NvbmZpZygpO1xyXG4gIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlQ29uZmlnKGNvbmZpZyk7XHJcbiAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB0aHJvdyBuZXcgRXJyb3IoXFxgVmFsaWRhdGlvbiBmYWlsZWQ6IFxcJHtlcnJvcnMuam9pbignLCAnKX1cXGApO1xyXG4gIHJldHVybiBjb25maWc7XHJcbn07YDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIEpvaSBzY2hlbWEgZnJvbSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZS5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvYmplY3RcclxuICAgKiBAcmV0dXJucyBKb2kgc2NoZW1hIHN0cmluZ1xyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2VuZXJhdGVKb2lTY2hlbWFGcm9tQ29uZmlnKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBnZW5lcmF0ZVNjaGVtYSA9IChvYmo6IGFueSk6IHN0cmluZyA9PiB7XHJcbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgcmV0dXJuICdKb2kuc3RyaW5nKCknO1xyXG4gICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ251bWJlcicpIHJldHVybiAnSm9pLm51bWJlcigpJztcclxuICAgICAgaWYgKHR5cGVvZiBvYmogPT09ICdib29sZWFuJykgcmV0dXJuICdKb2kuYm9vbGVhbigpJztcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuICdKb2kuYXJyYXkoKSc7XHJcbiAgICAgIFxyXG4gICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgJiYgb2JqICE9PSBudWxsKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5lbnRyaWVzKG9iailcclxuICAgICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gYCAgJHtrZXl9OiAke2dlbmVyYXRlU2NoZW1hKHZhbHVlKX1gKVxyXG4gICAgICAgICAgLmpvaW4oJyxcXG4nKTtcclxuICAgICAgICByZXR1cm4gYEpvaS5vYmplY3Qoe1xcbiR7cHJvcGVydGllc31cXG59KWA7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHJldHVybiAnSm9pLmFueSgpJztcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIGdlbmVyYXRlU2NoZW1hKGNvbmZpZyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBjbGFzcyBkZWZpbml0aW9uIGZyb20gY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0XHJcbiAgICogQHJldHVybnMgQ2xhc3MgZGVmaW5pdGlvbiBzdHJpbmdcclxuICAgKi9cclxuICBwcml2YXRlIGdlbmVyYXRlQ2xhc3NGcm9tQ29uZmlnKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmVudHJpZXMoY29uZmlnKVxyXG4gICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcclxuICAgICAgICBjb25zdCBkZWNvcmF0b3IgPSB0aGlzLmdldENsYXNzVmFsaWRhdG9yRGVjb3JhdG9yKHZhbHVlKTtcclxuICAgICAgICByZXR1cm4gYCAgJHtkZWNvcmF0b3J9XFxuICAke2tleX06ICR7dGhpcy5nZXRUeXBlU2NyaXB0VHlwZSh2YWx1ZSl9O2A7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5qb2luKCdcXG5cXG4nKTtcclxuXHJcbiAgICByZXR1cm4gYGNsYXNzIENvbmZpZ0NsYXNzIHtcXG4ke3Byb3BlcnRpZXN9XFxufWA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSB2YWxpZGF0aW9uIGNoZWNrcyBmb3IgY3VzdG9tIHZhbGlkYXRpb24uXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0XHJcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiBjaGVja3Mgc3RyaW5nXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZW5lcmF0ZVZhbGlkYXRpb25DaGVja3MoY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogc3RyaW5nIHtcclxuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhjb25maWcpXHJcbiAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoZWNrID0gdGhpcy5nZXRWYWxpZGF0aW9uQ2hlY2soa2V5LCB2YWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuIGAgICR7Y2hlY2t9YDtcclxuICAgICAgfSlcclxuICAgICAgLmpvaW4oJ1xcbicpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGNsYXNzLXZhbGlkYXRvciBkZWNvcmF0b3IgZm9yIGEgdmFsdWUuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gZ2V0IGRlY29yYXRvciBmb3JcclxuICAgKiBAcmV0dXJucyBEZWNvcmF0b3Igc3RyaW5nXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBnZXRDbGFzc1ZhbGlkYXRvckRlY29yYXRvcih2YWx1ZTogYW55KTogc3RyaW5nIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSByZXR1cm4gJ0BJc1N0cmluZygpJztcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSByZXR1cm4gJ0BJc051bWJlcigpJztcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuICdASXNCb29sZWFuKCknO1xyXG4gICAgcmV0dXJuICdASXNPcHRpb25hbCgpJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBUeXBlU2NyaXB0IHR5cGUgZm9yIGEgdmFsdWUuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gZ2V0IHR5cGUgZm9yXHJcbiAgICogQHJldHVybnMgVHlwZVNjcmlwdCB0eXBlIHN0cmluZ1xyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0VHlwZVNjcmlwdFR5cGUodmFsdWU6IGFueSk6IHN0cmluZyB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuICdzdHJpbmcnO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiAnbnVtYmVyJztcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykgcmV0dXJuICdib29sZWFuJztcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuICdhbnlbXSc7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuICdvYmplY3QnO1xyXG4gICAgcmV0dXJuICdhbnknO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHZhbGlkYXRpb24gY2hlY2sgZm9yIGN1c3RvbSB2YWxpZGF0aW9uLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBrZXkgLSBDb25maWd1cmF0aW9uIGtleVxyXG4gICAqIEBwYXJhbSB2YWx1ZSAtIENvbmZpZ3VyYXRpb24gdmFsdWVcclxuICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIGNoZWNrIHN0cmluZ1xyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0VmFsaWRhdGlvbkNoZWNrKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogc3RyaW5nIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHJldHVybiBgaWYgKCFjb25maWcuJHtrZXl9IHx8IHR5cGVvZiBjb25maWcuJHtrZXl9ICE9PSAnc3RyaW5nJykgZXJyb3JzLnB1c2goJyR7a2V5fSBtdXN0IGJlIGEgc3RyaW5nJyk7YDtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XHJcbiAgICAgIHJldHVybiBgaWYgKGNvbmZpZy4ke2tleX0gPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgY29uZmlnLiR7a2V5fSAhPT0gJ251bWJlcicpIGVycm9ycy5wdXNoKCcke2tleX0gbXVzdCBiZSBhIG51bWJlcicpO2A7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgcmV0dXJuIGBpZiAoY29uZmlnLiR7a2V5fSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjb25maWcuJHtrZXl9ICE9PSAnYm9vbGVhbicpIGVycm9ycy5wdXNoKCcke2tleX0gbXVzdCBiZSBhIGJvb2xlYW4nKTtgO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGBpZiAoY29uZmlnLiR7a2V5fSA9PT0gdW5kZWZpbmVkKSBlcnJvcnMucHVzaCgnJHtrZXl9IGlzIHJlcXVpcmVkJyk7YDtcclxuICB9XHJcbn0iXX0=