@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,292 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var PrecedenceHandlerService_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.PrecedenceHandlerService = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ /**
13
+ * Service responsible for handling configuration precedence rules and merging strategies.
14
+ */
15
+ let PrecedenceHandlerService = PrecedenceHandlerService_1 = class PrecedenceHandlerService {
16
+ logger = new common_1.Logger(PrecedenceHandlerService_1.name);
17
+ /**
18
+ * Apply precedence rules to merge configuration from multiple sources.
19
+ * @param sources - Array of configuration sources
20
+ * @param precedenceRule - The precedence rule to apply
21
+ * @returns Merged configuration data
22
+ */
23
+ applyPrecedenceRules(sources, precedenceRule) {
24
+ this.logger.debug(`Applying precedence rule: ${precedenceRule} to ${sources.length} sources`);
25
+ if (sources.length === 0) {
26
+ return {};
27
+ }
28
+ if (sources.length === 1) {
29
+ return sources[0]?.data || {};
30
+ }
31
+ switch (precedenceRule) {
32
+ case 'aws-first':
33
+ return this.applyAwsFirstPrecedence(sources);
34
+ case 'local-first':
35
+ return this.applyLocalFirstPrecedence(sources);
36
+ case 'merge':
37
+ return this.applyMergePrecedence(sources);
38
+ default:
39
+ this.logger.warn(`Unknown precedence rule: ${precedenceRule}, defaulting to 'aws-first'`);
40
+ return this.applyAwsFirstPrecedence(sources);
41
+ }
42
+ }
43
+ /**
44
+ * Apply AWS-first precedence: AWS sources override local sources.
45
+ * Priority order: AWS Secrets Manager > SSM Parameter Store > Environment > Local Files
46
+ * @param sources - Configuration sources
47
+ * @returns Merged configuration
48
+ */
49
+ applyAwsFirstPrecedence(sources) {
50
+ this.logger.debug('Applying AWS-first precedence');
51
+ const sortedSources = this.sortSourcesByAwsFirstPriority(sources);
52
+ return this.mergeSourcesInOrder(sortedSources);
53
+ }
54
+ /**
55
+ * Apply local-first precedence: Local sources override AWS sources.
56
+ * Priority order: Local Files > Environment > SSM Parameter Store > AWS Secrets Manager
57
+ * @param sources - Configuration sources
58
+ * @returns Merged configuration
59
+ */
60
+ applyLocalFirstPrecedence(sources) {
61
+ this.logger.debug('Applying local-first precedence');
62
+ const sortedSources = this.sortSourcesByLocalFirstPriority(sources);
63
+ return this.mergeSourcesInOrder(sortedSources);
64
+ }
65
+ /**
66
+ * Apply merge precedence: Intelligent merging based on source type and priority.
67
+ * Uses a balanced approach where both AWS and local sources contribute.
68
+ * @param sources - Configuration sources
69
+ * @returns Merged configuration
70
+ */
71
+ applyMergePrecedence(sources) {
72
+ this.logger.debug('Applying merge precedence');
73
+ // Group sources by type
74
+ const sourceGroups = this.groupSourcesByType(sources);
75
+ // Merge within each group first
76
+ const mergedGroups = {};
77
+ for (const [type, typeSources] of Object.entries(sourceGroups)) {
78
+ if (typeSources.length > 0) {
79
+ mergedGroups[type] = this.mergeSourcesInOrder(typeSources);
80
+ }
81
+ }
82
+ // Then merge across groups with balanced priority
83
+ return this.mergeGroupsWithBalancedPriority(mergedGroups);
84
+ }
85
+ /**
86
+ * Sort sources by AWS-first priority.
87
+ * @param sources - Configuration sources
88
+ * @returns Sorted sources (lowest priority first, highest priority last)
89
+ */
90
+ sortSourcesByAwsFirstPriority(sources) {
91
+ const priorityMap = {
92
+ 'local-file': 1,
93
+ 'environment': 2,
94
+ 'ssm': 3,
95
+ 'secrets-manager': 4
96
+ };
97
+ return [...sources].sort((a, b) => {
98
+ const priorityA = priorityMap[a.type] || 0;
99
+ const priorityB = priorityMap[b.type] || 0;
100
+ if (priorityA !== priorityB) {
101
+ return priorityA - priorityB;
102
+ }
103
+ // If same type, sort by explicit priority
104
+ return a.priority - b.priority;
105
+ });
106
+ }
107
+ /**
108
+ * Sort sources by local-first priority.
109
+ * @param sources - Configuration sources
110
+ * @returns Sorted sources (lowest priority first, highest priority last)
111
+ */
112
+ sortSourcesByLocalFirstPriority(sources) {
113
+ const priorityMap = {
114
+ 'secrets-manager': 1,
115
+ 'ssm': 2,
116
+ 'environment': 3,
117
+ 'local-file': 4
118
+ };
119
+ return [...sources].sort((a, b) => {
120
+ const priorityA = priorityMap[a.type] || 0;
121
+ const priorityB = priorityMap[b.type] || 0;
122
+ if (priorityA !== priorityB) {
123
+ return priorityA - priorityB;
124
+ }
125
+ // If same type, sort by explicit priority
126
+ return a.priority - b.priority;
127
+ });
128
+ }
129
+ /**
130
+ * Group sources by their type.
131
+ * @param sources - Configuration sources
132
+ * @returns Sources grouped by type
133
+ */
134
+ groupSourcesByType(sources) {
135
+ const groups = {};
136
+ for (const source of sources) {
137
+ if (!groups[source.type]) {
138
+ groups[source.type] = [];
139
+ }
140
+ groups[source.type]?.push(source);
141
+ }
142
+ // Sort within each group by priority
143
+ for (const type in groups) {
144
+ groups[type]?.sort((a, b) => a.priority - b.priority);
145
+ }
146
+ return groups;
147
+ }
148
+ /**
149
+ * Merge sources in the given order (later sources override earlier ones).
150
+ * @param sources - Ordered configuration sources
151
+ * @returns Merged configuration
152
+ */
153
+ mergeSourcesInOrder(sources) {
154
+ let merged = {};
155
+ for (const source of sources) {
156
+ this.logger.debug(`Merging source: ${source.name} (${source.type})`);
157
+ merged = this.deepMerge(merged, source.data);
158
+ }
159
+ return merged;
160
+ }
161
+ /**
162
+ * Merge groups with balanced priority for merge precedence.
163
+ * @param groups - Configuration groups by type
164
+ * @returns Merged configuration
165
+ */
166
+ mergeGroupsWithBalancedPriority(groups) {
167
+ let merged = {};
168
+ // Merge in balanced order: local-file -> environment -> ssm -> secrets-manager
169
+ const mergeOrder = ['local-file', 'environment', 'ssm', 'secrets-manager'];
170
+ for (const type of mergeOrder) {
171
+ if (groups[type]) {
172
+ this.logger.debug(`Merging group: ${type}`);
173
+ merged = this.deepMerge(merged, groups[type]);
174
+ }
175
+ }
176
+ return merged;
177
+ }
178
+ /**
179
+ * Deep merge two configuration objects with conflict resolution.
180
+ * @param target - Target object (lower priority)
181
+ * @param source - Source object (higher priority)
182
+ * @returns Merged object
183
+ */
184
+ deepMerge(target, source) {
185
+ const result = { ...target };
186
+ for (const [key, value] of Object.entries(source)) {
187
+ if (this.shouldDeepMerge(result[key], value)) {
188
+ result[key] = this.deepMerge(result[key], value);
189
+ }
190
+ else {
191
+ result[key] = this.cloneValue(value);
192
+ }
193
+ }
194
+ return result;
195
+ }
196
+ /**
197
+ * Determine if two values should be deep merged.
198
+ * @param target - Target value
199
+ * @param source - Source value
200
+ * @returns True if should deep merge, false otherwise
201
+ */
202
+ shouldDeepMerge(target, source) {
203
+ return target !== null &&
204
+ source !== null &&
205
+ typeof target === 'object' &&
206
+ typeof source === 'object' &&
207
+ !Array.isArray(target) &&
208
+ !Array.isArray(source);
209
+ }
210
+ /**
211
+ * Clone a value to avoid reference issues.
212
+ * @param value - Value to clone
213
+ * @returns Cloned value
214
+ */
215
+ cloneValue(value) {
216
+ if (value === null || typeof value !== 'object') {
217
+ return value;
218
+ }
219
+ if (Array.isArray(value)) {
220
+ return value.map(item => this.cloneValue(item));
221
+ }
222
+ const cloned = {};
223
+ for (const [key, val] of Object.entries(value)) {
224
+ cloned[key] = this.cloneValue(val);
225
+ }
226
+ return cloned;
227
+ }
228
+ /**
229
+ * Validate configuration sources for precedence handling.
230
+ * @param sources - Configuration sources to validate
231
+ * @returns Validation result with any issues found
232
+ */
233
+ validateSources(sources) {
234
+ const issues = [];
235
+ if (!Array.isArray(sources)) {
236
+ issues.push('Sources must be an array');
237
+ return { valid: false, issues };
238
+ }
239
+ for (let i = 0; i < sources.length; i++) {
240
+ const source = sources[i];
241
+ if (!source) {
242
+ issues.push(`Source at index ${i} is null or undefined`);
243
+ continue;
244
+ }
245
+ if (!source.name || typeof source.name !== 'string') {
246
+ issues.push(`Source at index ${i} must have a valid name`);
247
+ }
248
+ if (!source.type || !['environment', 'secrets-manager', 'ssm', 'local-file'].includes(source.type)) {
249
+ issues.push(`Source at index ${i} must have a valid type`);
250
+ }
251
+ if (typeof source.priority !== 'number') {
252
+ issues.push(`Source at index ${i} must have a numeric priority`);
253
+ }
254
+ if (!source.data || typeof source.data !== 'object') {
255
+ issues.push(`Source at index ${i} must have valid data object`);
256
+ }
257
+ if (!source.loadedAt || !(source.loadedAt instanceof Date)) {
258
+ issues.push(`Source at index ${i} must have a valid loadedAt date`);
259
+ }
260
+ }
261
+ return { valid: issues.length === 0, issues };
262
+ }
263
+ /**
264
+ * Get the effective priority for a source based on precedence rule.
265
+ * @param source - Configuration source
266
+ * @param precedenceRule - Precedence rule
267
+ * @returns Effective priority
268
+ */
269
+ getEffectivePriority(source, precedenceRule) {
270
+ const basePriority = source.priority;
271
+ switch (precedenceRule) {
272
+ case 'aws-first':
273
+ const awsFirstBonus = source.type === 'secrets-manager' ? 1000 :
274
+ source.type === 'ssm' ? 500 : 0;
275
+ return basePriority + awsFirstBonus;
276
+ case 'local-first':
277
+ const localFirstBonus = source.type === 'local-file' ? 1000 :
278
+ source.type === 'environment' ? 500 : 0;
279
+ return basePriority + localFirstBonus;
280
+ case 'merge':
281
+ // In merge mode, all sources have equal weight
282
+ return basePriority;
283
+ default:
284
+ return basePriority;
285
+ }
286
+ }
287
+ };
288
+ exports.PrecedenceHandlerService = PrecedenceHandlerService;
289
+ exports.PrecedenceHandlerService = PrecedenceHandlerService = PrecedenceHandlerService_1 = __decorate([
290
+ (0, common_1.Injectable)()
291
+ ], PrecedenceHandlerService);
292
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlY2VkZW5jZS1oYW5kbGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvaW50ZWdyYXRpb24vc2VydmljZXMvcHJlY2VkZW5jZS1oYW5kbGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLDJDQUFvRDtBQUlwRDs7R0FFRztBQUVJLElBQU0sd0JBQXdCLGdDQUE5QixNQUFNLHdCQUF3QjtJQUNsQixNQUFNLEdBQUcsSUFBSSxlQUFNLENBQUMsMEJBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFcEU7Ozs7O09BS0c7SUFDSCxvQkFBb0IsQ0FDbEIsT0FBOEIsRUFDOUIsY0FBOEI7UUFFOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLGNBQWMsT0FBTyxPQUFPLENBQUMsTUFBTSxVQUFVLENBQUMsQ0FBQztRQUU5RixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7UUFDaEMsQ0FBQztRQUVELFFBQVEsY0FBYyxFQUFFLENBQUM7WUFDdkIsS0FBSyxXQUFXO2dCQUNkLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQy9DLEtBQUssYUFBYTtnQkFDaEIsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakQsS0FBSyxPQUFPO2dCQUNWLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVDO2dCQUNFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDRCQUE0QixjQUFj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S0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvRCxPQUFPLFlBQVksR0FBRyxlQUFlLENBQUM7WUFFeEMsS0FBSyxPQUFPO2dCQUNWLCtDQUErQztnQkFDL0MsT0FBTyxZQUFZLENBQUM7WUFFdEI7Z0JBQ0UsT0FBTyxZQUFZLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7Q0FDRixDQUFBO0FBelVZLDREQUF3QjttQ0FBeEIsd0JBQXdCO0lBRHBDLElBQUEsbUJBQVUsR0FBRTtHQUNBLHdCQUF3QixDQXlVcEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBMb2dnZXIgfSBmcm9tICdAbmVzdGpzL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25Tb3VyY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmZpZ3VyYXRpb24tc291cmNlLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFByZWNlZGVuY2VSdWxlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pbnRlZ3JhdGlvbi1vcHRpb25zLmludGVyZmFjZSc7XHJcblxyXG4vKipcclxuICogU2VydmljZSByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgY29uZmlndXJhdGlvbiBwcmVjZWRlbmNlIHJ1bGVzIGFuZCBtZXJnaW5nIHN0cmF0ZWdpZXMuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBQcmVjZWRlbmNlSGFuZGxlclNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihQcmVjZWRlbmNlSGFuZGxlclNlcnZpY2UubmFtZSk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IHByZWNlZGVuY2UgcnVsZXMgdG8gbWVyZ2UgY29uZmlndXJhdGlvbiBmcm9tIG11bHRpcGxlIHNvdXJjZXMuXHJcbiAgICogQHBhcmFtIHNvdXJjZXMgLSBBcnJheSBvZiBjb25maWd1cmF0aW9uIHNvdXJjZXNcclxuICAgKiBAcGFyYW0gcHJlY2VkZW5jZVJ1bGUgLSBUaGUgcHJlY2VkZW5jZSBydWxlIHRvIGFwcGx5XHJcbiAgICogQHJldHVybnMgTWVyZ2VkIGNvbmZpZ3VyYXRpb24gZGF0YVxyXG4gICAqL1xyXG4gIGFwcGx5UHJlY2VkZW5jZVJ1bGVzKFxyXG4gICAgc291cmNlczogQ29uZmlndXJhdGlvblNvdXJjZVtdLFxyXG4gICAgcHJlY2VkZW5jZVJ1bGU6IFByZWNlZGVuY2VSdWxlXHJcbiAgKTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgQXBwbHlpbmcgcHJlY2VkZW5jZSBydWxlOiAke3ByZWNlZGVuY2VSdWxlfSB0byAke3NvdXJjZXMubGVuZ3RofSBzb3VyY2VzYCk7XHJcblxyXG4gICAgaWYgKHNvdXJjZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc291cmNlcy5sZW5ndGggPT09IDEpIHtcclxuICAgICAgcmV0dXJuIHNvdXJjZXNbMF0/LmRhdGEgfHwge307XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoIChwcmVjZWRlbmNlUnVsZSkge1xyXG4gICAgICBjYXNlICdhd3MtZmlyc3QnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5QXdzRmlyc3RQcmVjZWRlbmNlKHNvdXJjZXMpO1xyXG4gICAgICBjYXNlICdsb2NhbC1maXJzdCc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlMb2NhbEZpcnN0UHJlY2VkZW5jZShzb3VyY2VzKTtcclxuICAgICAgY2FzZSAnbWVyZ2UnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5TWVyZ2VQcmVjZWRlbmNlKHNvdXJjZXMpO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFVua25vd24gcHJlY2VkZW5jZSBydWxlOiAke3ByZWNlZGVuY2VSdWxlfSwgZGVmYXVsdGluZyB0byAnYXdzLWZpcnN0J2ApO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5QXdzRmlyc3RQcmVjZWRlbmNlKHNvdXJjZXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXBwbHkgQVdTLWZpcnN0IHByZWNlZGVuY2U6IEFXUyBzb3VyY2VzIG92ZXJyaWRlIGxvY2FsIHNvdXJjZXMuXHJcbiAgICogUHJpb3JpdHkgb3JkZXI6IEFXUyBTZWNyZXRzIE1hbmFnZXIgPiBTU00gUGFyYW1ldGVyIFN0b3JlID4gRW52aXJvbm1lbnQgPiBMb2NhbCBGaWxlc1xyXG4gICAqIEBwYXJhbSBzb3VyY2VzIC0gQ29uZmlndXJhdGlvbiBzb3VyY2VzXHJcbiAgICogQHJldHVybnMgTWVyZ2VkIGNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBwcml2YXRlIGFwcGx5QXdzRmlyc3RQcmVjZWRlbmNlKHNvdXJjZXM6IENvbmZpZ3VyYXRpb25Tb3VyY2VbXSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0FwcGx5aW5nIEFXUy1maXJzdCBwcmVjZWRlbmNlJyk7XHJcbiAgICBcclxuICAgIGNvbnN0IHNvcnRlZFNvdXJjZXMgPSB0aGlzLnNvcnRTb3VyY2VzQnlBd3NGaXJzdFByaW9yaXR5KHNvdXJjZXMpO1xyXG4gICAgcmV0dXJuIHRoaXMubWVyZ2VTb3VyY2VzSW5PcmRlcihzb3J0ZWRTb3VyY2VzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IGxvY2FsLWZpcnN0IHByZWNlZGVuY2U6IExvY2FsIHNvdXJjZXMgb3ZlcnJpZGUgQVdTIHNvdXJjZXMuXHJcbiAgICogUHJpb3JpdHkgb3JkZXI6IExvY2FsIEZpbGVzID4gRW52aXJvbm1lbnQgPiBTU00gUGFyYW1ldGVyIFN0b3JlID4gQVdTIFNlY3JldHMgTWFuYWdlclxyXG4gICAqIEBwYXJhbSBzb3VyY2VzIC0gQ29uZmlndXJhdGlvbiBzb3VyY2VzXHJcbiAgICogQHJldHVybnMgTWVyZ2VkIGNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBwcml2YXRlIGFwcGx5TG9jYWxGaXJzdFByZWNlZGVuY2Uoc291cmNlczogQ29uZmlndXJhdGlvblNvdXJjZVtdKTogUmVjb3JkPHN0cmluZywgYW55PiB7XHJcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnQXBwbHlpbmcgbG9jYWwtZmlyc3QgcHJlY2VkZW5jZScpO1xyXG4gICAgXHJcbiAgICBjb25zdCBzb3J0ZWRTb3VyY2VzID0gdGhpcy5zb3J0U291cmNlc0J5TG9jYWxGaXJzdFByaW9yaXR5KHNvdXJjZXMpO1xyXG4gICAgcmV0dXJuIHRoaXMubWVyZ2VTb3VyY2VzSW5PcmRlcihzb3J0ZWRTb3VyY2VzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGx5IG1lcmdlIHByZWNlZGVuY2U6IEludGVsbGlnZW50IG1lcmdpbmcgYmFzZWQgb24gc291cmNlIHR5cGUgYW5kIHByaW9yaXR5LlxyXG4gICAqIFVzZXMgYSBiYWxhbmNlZCBhcHByb2FjaCB3aGVyZSBib3RoIEFXUyBhbmQgbG9jYWwgc291cmNlcyBjb250cmlidXRlLlxyXG4gICAqIEBwYXJhbSBzb3VyY2VzIC0gQ29uZmlndXJhdGlvbiBzb3VyY2VzXHJcbiAgICogQHJldHVybnMgTWVyZ2VkIGNvbmZpZ3VyYXRpb25cclxuICAgKi9cclxuICBwcml2YXRlIGFwcGx5TWVyZ2VQcmVjZWRlbmNlKHNvdXJjZXM6IENvbmZpZ3VyYXRpb25Tb3VyY2VbXSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoJ0FwcGx5aW5nIG1lcmdlIHByZWNlZGVuY2UnKTtcclxuICAgIFxyXG4gICAgLy8gR3JvdXAgc291cmNlcyBieSB0eXBlXHJcbiAgICBjb25zdCBzb3VyY2VHcm91cHMgPSB0aGlzLmdyb3VwU291cmNlc0J5VHlwZShzb3VyY2VzKTtcclxuICAgIFxyXG4gICAgLy8gTWVyZ2Ugd2l0aGluIGVhY2ggZ3JvdXAgZmlyc3RcclxuICAgIGNvbnN0IG1lcmdlZEdyb3VwczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG4gICAgXHJcbiAgICBmb3IgKGNvbnN0IFt0eXBlLCB0eXBlU291cmNlc10gb2YgT2JqZWN0LmVudHJpZXMoc291cmNlR3JvdXBzKSkge1xyXG4gICAgICBpZiAodHlwZVNvdXJjZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIG1lcmdlZEdyb3Vwc1t0eXBlXSA9IHRoaXMubWVyZ2VTb3VyY2VzSW5PcmRlcih0eXBlU291cmNlcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGVuIG1lcmdlIGFjcm9zcyBncm91cHMgd2l0aCBiYWxhbmNlZCBwcmlvcml0eVxyXG4gICAgcmV0dXJuIHRoaXMubWVyZ2VHcm91cHNXaXRoQmFsYW5jZWRQcmlvcml0eShtZXJnZWRHcm91cHMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU29ydCBzb3VyY2VzIGJ5IEFXUy1maXJzdCBwcmlvcml0eS5cclxuICAgKiBAcGFyYW0gc291cmNlcyAtIENvbmZpZ3VyYXRpb24gc291cmNlc1xyXG4gICAqIEByZXR1cm5zIFNvcnRlZCBzb3VyY2VzIChsb3dlc3QgcHJpb3JpdHkgZmlyc3QsIGhpZ2hlc3QgcHJpb3JpdHkgbGFzdClcclxuICAgKi9cclxuICBwcml2YXRlIHNvcnRTb3VyY2VzQnlBd3NGaXJzdFByaW9yaXR5KHNvdXJjZXM6IENvbmZpZ3VyYXRpb25Tb3VyY2VbXSk6IENvbmZpZ3VyYXRpb25Tb3VyY2VbXSB7XHJcbiAgICBjb25zdCBwcmlvcml0eU1hcDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcclxuICAgICAgJ2xvY2FsLWZpbGUnOiAxLFxyXG4gICAgICAnZW52aXJvbm1lbnQnOiAyLFxyXG4gICAgICAnc3NtJzogMyxcclxuICAgICAgJ3NlY3JldHMtbWFuYWdlcic6IDRcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIFsuLi5zb3VyY2VzXS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIGNvbnN0IHByaW9yaXR5QSA9IHByaW9yaXR5TWFwW2EudHlwZV0gfHwgMDtcclxuICAgICAgY29uc3QgcHJpb3JpdHlCID0gcHJpb3JpdHlNYXBbYi50eXBlXSB8fCAwO1xyXG4gICAgICBcclxuICAgICAgaWYgKHByaW9yaXR5QSAhPT0gcHJpb3JpdHlCKSB7XHJcbiAgICAgICAgcmV0dXJuIHByaW9yaXR5QSAtIHByaW9yaXR5QjtcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgLy8gSWYgc2FtZSB0eXBlLCBzb3J0IGJ5IGV4cGxpY2l0IHByaW9yaXR5XHJcbiAgICAgIHJldHVybiBhLnByaW9yaXR5IC0gYi5wcmlvcml0eTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU29ydCBzb3VyY2VzIGJ5IGxvY2FsLWZpcnN0IHByaW9yaXR5LlxyXG4gICAqIEBwYXJhbSBzb3VyY2VzIC0gQ29uZmlndXJhdGlvbiBzb3VyY2VzXHJcbiAgICogQHJldHVybnMgU29ydGVkIHNvdXJjZXMgKGxvd2VzdCBwcmlvcml0eSBmaXJzdCwgaGlnaGVzdCBwcmlvcml0eSBsYXN0KVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc29ydFNvdXJjZXNCeUxvY2FsRmlyc3RQcmlvcml0eShzb3VyY2VzOiBDb25maWd1cmF0aW9uU291cmNlW10pOiBDb25maWd1cmF0aW9uU291cmNlW10ge1xyXG4gICAgY29uc3QgcHJpb3JpdHlNYXA6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XHJcbiAgICAgICdzZWNyZXRzLW1hbmFnZXInOiAxLFxyXG4gICAgICAnc3NtJzogMixcclxuICAgICAgJ2Vudmlyb25tZW50JzogMyxcclxuICAgICAgJ2xvY2FsLWZpbGUnOiA0XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBbLi4uc291cmNlc10uc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICBjb25zdCBwcmlvcml0eUEgPSBwcmlvcml0eU1hcFthLnR5cGVdIHx8IDA7XHJcbiAgICAgIGNvbnN0IHByaW9yaXR5QiA9IHByaW9yaXR5TWFwW2IudHlwZV0gfHwgMDtcclxuICAgICAgXHJcbiAgICAgIGlmIChwcmlvcml0eUEgIT09IHByaW9yaXR5Qikge1xyXG4gICAgICAgIHJldHVybiBwcmlvcml0eUEgLSBwcmlvcml0eUI7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIC8vIElmIHNhbWUgdHlwZSwgc29ydCBieSBleHBsaWNpdCBwcmlvcml0eVxyXG4gICAgICByZXR1cm4gYS5wcmlvcml0eSAtIGIucHJpb3JpdHk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdyb3VwIHNvdXJjZXMgYnkgdGhlaXIgdHlwZS5cclxuICAgKiBAcGFyYW0gc291cmNlcyAtIENvbmZpZ3VyYXRpb24gc291cmNlc1xyXG4gICAqIEByZXR1cm5zIFNvdXJjZXMgZ3JvdXBlZCBieSB0eXBlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBncm91cFNvdXJjZXNCeVR5cGUoc291cmNlczogQ29uZmlndXJhdGlvblNvdXJjZVtdKTogUmVjb3JkPHN0cmluZywgQ29uZmlndXJhdGlvblNvdXJjZVtdPiB7XHJcbiAgICBjb25zdCBncm91cHM6IFJlY29yZDxzdHJpbmcsIENvbmZpZ3VyYXRpb25Tb3VyY2VbXT4gPSB7fTtcclxuICAgIFxyXG4gICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xyXG4gICAgICBpZiAoIWdyb3Vwc1tzb3VyY2UudHlwZV0pIHtcclxuICAgICAgICBncm91cHNbc291cmNlLnR5cGVdID0gW107XHJcbiAgICAgIH1cclxuICAgICAgZ3JvdXBzW3NvdXJjZS50eXBlXT8ucHVzaChzb3VyY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFNvcnQgd2l0aGluIGVhY2ggZ3JvdXAgYnkgcHJpb3JpdHlcclxuICAgIGZvciAoY29uc3QgdHlwZSBpbiBncm91cHMpIHtcclxuICAgICAgZ3JvdXBzW3R5cGVdPy5zb3J0KChhLCBiKSA9PiBhLnByaW9yaXR5IC0gYi5wcmlvcml0eSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGdyb3VwcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1lcmdlIHNvdXJjZXMgaW4gdGhlIGdpdmVuIG9yZGVyIChsYXRlciBzb3VyY2VzIG92ZXJyaWRlIGVhcmxpZXIgb25lcykuXHJcbiAgICogQHBhcmFtIHNvdXJjZXMgLSBPcmRlcmVkIGNvbmZpZ3VyYXRpb24gc291cmNlc1xyXG4gICAqIEByZXR1cm5zIE1lcmdlZCBjb25maWd1cmF0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtZXJnZVNvdXJjZXNJbk9yZGVyKHNvdXJjZXM6IENvbmZpZ3VyYXRpb25Tb3VyY2VbXSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgbGV0IG1lcmdlZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG5cclxuICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcclxuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYE1lcmdpbmcgc291cmNlOiAke3NvdXJjZS5uYW1lfSAoJHtzb3VyY2UudHlwZX0pYCk7XHJcbiAgICAgIG1lcmdlZCA9IHRoaXMuZGVlcE1lcmdlKG1lcmdlZCwgc291cmNlLmRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBtZXJnZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXJnZSBncm91cHMgd2l0aCBiYWxhbmNlZCBwcmlvcml0eSBmb3IgbWVyZ2UgcHJlY2VkZW5jZS5cclxuICAgKiBAcGFyYW0gZ3JvdXBzIC0gQ29uZmlndXJhdGlvbiBncm91cHMgYnkgdHlwZVxyXG4gICAqIEByZXR1cm5zIE1lcmdlZCBjb25maWd1cmF0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtZXJnZUdyb3Vwc1dpdGhCYWxhbmNlZFByaW9yaXR5KGdyb3VwczogUmVjb3JkPHN0cmluZywgYW55Pik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xyXG4gICAgbGV0IG1lcmdlZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG5cclxuICAgIC8vIE1lcmdlIGluIGJhbGFuY2VkIG9yZGVyOiBsb2NhbC1maWxlIC0+IGVudmlyb25tZW50IC0+IHNzbSAtPiBzZWNyZXRzLW1hbmFnZXJcclxuICAgIGNvbnN0IG1lcmdlT3JkZXIgPSBbJ2xvY2FsLWZpbGUnLCAnZW52aXJvbm1lbnQnLCAnc3NtJywgJ3NlY3JldHMtbWFuYWdlciddO1xyXG4gICAgXHJcbiAgICBmb3IgKGNvbnN0IHR5cGUgb2YgbWVyZ2VPcmRlcikge1xyXG4gICAgICBpZiAoZ3JvdXBzW3R5cGVdKSB7XHJcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYE1lcmdpbmcgZ3JvdXA6ICR7dHlwZX1gKTtcclxuICAgICAgICBtZXJnZWQgPSB0aGlzLmRlZXBNZXJnZShtZXJnZWQsIGdyb3Vwc1t0eXBlXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWVyZ2VkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVlcCBtZXJnZSB0d28gY29uZmlndXJhdGlvbiBvYmplY3RzIHdpdGggY29uZmxpY3QgcmVzb2x1dGlvbi5cclxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGFyZ2V0IG9iamVjdCAobG93ZXIgcHJpb3JpdHkpXHJcbiAgICogQHBhcmFtIHNvdXJjZSAtIFNvdXJjZSBvYmplY3QgKGhpZ2hlciBwcmlvcml0eSlcclxuICAgKiBAcmV0dXJucyBNZXJnZWQgb2JqZWN0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkZWVwTWVyZ2UodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBzb3VyY2U6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcclxuICAgIGNvbnN0IHJlc3VsdCA9IHsgLi4udGFyZ2V0IH07XHJcblxyXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc291cmNlKSkge1xyXG4gICAgICBpZiAodGhpcy5zaG91bGREZWVwTWVyZ2UocmVzdWx0W2tleV0sIHZhbHVlKSkge1xyXG4gICAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5kZWVwTWVyZ2UocmVzdWx0W2tleV0sIHZhbHVlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHRba2V5XSA9IHRoaXMuY2xvbmVWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGV0ZXJtaW5lIGlmIHR3byB2YWx1ZXMgc2hvdWxkIGJlIGRlZXAgbWVyZ2VkLlxyXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBUYXJnZXQgdmFsdWVcclxuICAgKiBAcGFyYW0gc291cmNlIC0gU291cmNlIHZhbHVlXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBzaG91bGQgZGVlcCBtZXJnZSwgZmFsc2Ugb3RoZXJ3aXNlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzaG91bGREZWVwTWVyZ2UodGFyZ2V0OiBhbnksIHNvdXJjZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGFyZ2V0ICE9PSBudWxsICYmXHJcbiAgICAgICAgICAgc291cmNlICE9PSBudWxsICYmXHJcbiAgICAgICAgICAgdHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcgJiZcclxuICAgICAgICAgICB0eXBlb2Ygc291cmNlID09PSAnb2JqZWN0JyAmJlxyXG4gICAgICAgICAgICFBcnJheS5pc0FycmF5KHRhcmdldCkgJiZcclxuICAgICAgICAgICAhQXJyYXkuaXNBcnJheShzb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvbmUgYSB2YWx1ZSB0byBhdm9pZCByZWZlcmVuY2UgaXNzdWVzLlxyXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIGNsb25lXHJcbiAgICogQHJldHVybnMgQ2xvbmVkIHZhbHVlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjbG9uZVZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xyXG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICByZXR1cm4gdmFsdWUubWFwKGl0ZW0gPT4gdGhpcy5jbG9uZVZhbHVlKGl0ZW0pKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjbG9uZWQ6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcclxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcclxuICAgICAgY2xvbmVkW2tleV0gPSB0aGlzLmNsb25lVmFsdWUodmFsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2xvbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGUgY29uZmlndXJhdGlvbiBzb3VyY2VzIGZvciBwcmVjZWRlbmNlIGhhbmRsaW5nLlxyXG4gICAqIEBwYXJhbSBzb3VyY2VzIC0gQ29uZmlndXJhdGlvbiBzb3VyY2VzIHRvIHZhbGlkYXRlXHJcbiAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCBhbnkgaXNzdWVzIGZvdW5kXHJcbiAgICovXHJcbiAgdmFsaWRhdGVTb3VyY2VzKHNvdXJjZXM6IENvbmZpZ3VyYXRpb25Tb3VyY2VbXSk6IHsgdmFsaWQ6IGJvb2xlYW47IGlzc3Vlczogc3RyaW5nW10gfSB7XHJcbiAgICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNvdXJjZXMpKSB7XHJcbiAgICAgIGlzc3Vlcy5wdXNoKCdTb3VyY2VzIG11c3QgYmUgYW4gYXJyYXknKTtcclxuICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlLCBpc3N1ZXMgfTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvdXJjZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3Qgc291cmNlID0gc291cmNlc1tpXTtcclxuICAgICAgXHJcbiAgICAgIGlmICghc291cmNlKSB7XHJcbiAgICAgICAgaXNzdWVzLnB1c2goYFNvdXJjZSBhdCBpbmRleCAke2l9IGlzIG51bGwgb3IgdW5kZWZpbmVkYCk7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIGlmICghc291cmNlLm5hbWUgfHwgdHlwZW9mIHNvdXJjZS5uYW1lICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGlzc3Vlcy5wdXNoKGBTb3VyY2UgYXQgaW5kZXggJHtpfSBtdXN0IGhhdmUgYSB2YWxpZCBuYW1lYCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghc291cmNlLnR5cGUgfHwgIVsnZW52aXJvbm1lbnQnLCAnc2VjcmV0cy1tYW5hZ2VyJywgJ3NzbScsICdsb2NhbC1maWxlJ10uaW5jbHVkZXMoc291cmNlLnR5cGUpKSB7XHJcbiAgICAgICAgaXNzdWVzLnB1c2goYFNvdXJjZSBhdCBpbmRleCAke2l9IG11c3QgaGF2ZSBhIHZhbGlkIHR5cGVgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHR5cGVvZiBzb3VyY2UucHJpb3JpdHkgIT09ICdudW1iZXInKSB7XHJcbiAgICAgICAgaXNzdWVzLnB1c2goYFNvdXJjZSBhdCBpbmRleCAke2l9IG11c3QgaGF2ZSBhIG51bWVyaWMgcHJpb3JpdHlgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFzb3VyY2UuZGF0YSB8fCB0eXBlb2Ygc291cmNlLmRhdGEgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgaXNzdWVzLnB1c2goYFNvdXJjZSBhdCBpbmRleCAke2l9IG11c3QgaGF2ZSB2YWxpZCBkYXRhIG9iamVjdGApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXNvdXJjZS5sb2FkZWRBdCB8fCAhKHNvdXJjZS5sb2FkZWRBdCBpbnN0YW5jZW9mIERhdGUpKSB7XHJcbiAgICAgICAgaXNzdWVzLnB1c2goYFNvdXJjZSBhdCBpbmRleCAke2l9IG11c3QgaGF2ZSBhIHZhbGlkIGxvYWRlZEF0IGRhdGVgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHZhbGlkOiBpc3N1ZXMubGVuZ3RoID09PSAwLCBpc3N1ZXMgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgZWZmZWN0aXZlIHByaW9yaXR5IGZvciBhIHNvdXJjZSBiYXNlZCBvbiBwcmVjZWRlbmNlIHJ1bGUuXHJcbiAgICogQHBhcmFtIHNvdXJjZSAtIENvbmZpZ3VyYXRpb24gc291cmNlXHJcbiAgICogQHBhcmFtIHByZWNlZGVuY2VSdWxlIC0gUHJlY2VkZW5jZSBydWxlXHJcbiAgICogQHJldHVybnMgRWZmZWN0aXZlIHByaW9yaXR5XHJcbiAgICovXHJcbiAgZ2V0RWZmZWN0aXZlUHJpb3JpdHkoc291cmNlOiBDb25maWd1cmF0aW9uU291cmNlLCBwcmVjZWRlbmNlUnVsZTogUHJlY2VkZW5jZVJ1bGUpOiBudW1iZXIge1xyXG4gICAgY29uc3QgYmFzZVByaW9yaXR5ID0gc291cmNlLnByaW9yaXR5O1xyXG4gICAgXHJcbiAgICBzd2l0Y2ggKHByZWNlZGVuY2VSdWxlKSB7XHJcbiAgICAgIGNhc2UgJ2F3cy1maXJzdCc6XHJcbiAgICAgICAgY29uc3QgYXdzRmlyc3RCb251cyA9IHNvdXJjZS50eXBlID09PSAnc2VjcmV0cy1tYW5hZ2VyJyA/IDEwMDAgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS50eXBlID09PSAnc3NtJyA/IDUwMCA6IDA7XHJcbiAgICAgICAgcmV0dXJuIGJhc2VQcmlvcml0eSArIGF3c0ZpcnN0Qm9udXM7XHJcbiAgICAgICAgXHJcbiAgICAgIGNhc2UgJ2xvY2FsLWZpcnN0JzpcclxuICAgICAgICBjb25zdCBsb2NhbEZpcnN0Qm9udXMgPSBzb3VyY2UudHlwZSA9PT0gJ2xvY2FsLWZpbGUnID8gMTAwMCA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UudHlwZSA9PT0gJ2Vudmlyb25tZW50JyA/IDUwMCA6IDA7XHJcbiAgICAgICAgcmV0dXJuIGJhc2VQcmlvcml0eSArIGxvY2FsRmlyc3RCb251cztcclxuICAgICAgICBcclxuICAgICAgY2FzZSAnbWVyZ2UnOlxyXG4gICAgICAgIC8vIEluIG1lcmdlIG1vZGUsIGFsbCBzb3VyY2VzIGhhdmUgZXF1YWwgd2VpZ2h0XHJcbiAgICAgICAgcmV0dXJuIGJhc2VQcmlvcml0eTtcclxuICAgICAgICBcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gYmFzZVByaW9yaXR5O1xyXG4gICAgfVxyXG4gIH1cclxufSJdfQ==