@aws-mdaa/dataops-job-l3-construct 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 (1071) hide show
  1. package/.jsii +5265 -0
  2. package/README.md +11 -0
  3. package/docs/dataops-job.drawio +45 -0
  4. package/docs/dataops-job.png +0 -0
  5. package/lib/dataops-job-l3-construct.d.ts +344 -0
  6. package/lib/dataops-job-l3-construct.js +295 -0
  7. package/lib/index.d.ts +5 -0
  8. package/lib/index.js +24 -0
  9. package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/README.md +185 -0
  10. package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/lib/index.d.ts +57 -0
  11. package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/lib/index.js +200 -0
  12. package/node_modules/@aws-mdaa/s3-bucketpolicy-helper/package.json +46 -0
  13. package/node_modules/@aws-mdaa/s3-inventory-helper/README.md +3 -0
  14. package/node_modules/@aws-mdaa/s3-inventory-helper/lib/index.d.ts +66 -0
  15. package/node_modules/@aws-mdaa/s3-inventory-helper/lib/index.js +224 -0
  16. package/node_modules/@aws-mdaa/s3-inventory-helper/package.json +46 -0
  17. package/node_modules/lodash/LICENSE +47 -0
  18. package/node_modules/lodash/README.md +39 -0
  19. package/node_modules/lodash/_DataView.js +7 -0
  20. package/node_modules/lodash/_Hash.js +32 -0
  21. package/node_modules/lodash/_LazyWrapper.js +28 -0
  22. package/node_modules/lodash/_ListCache.js +32 -0
  23. package/node_modules/lodash/_LodashWrapper.js +22 -0
  24. package/node_modules/lodash/_Map.js +7 -0
  25. package/node_modules/lodash/_MapCache.js +32 -0
  26. package/node_modules/lodash/_Promise.js +7 -0
  27. package/node_modules/lodash/_Set.js +7 -0
  28. package/node_modules/lodash/_SetCache.js +27 -0
  29. package/node_modules/lodash/_Stack.js +27 -0
  30. package/node_modules/lodash/_Symbol.js +6 -0
  31. package/node_modules/lodash/_Uint8Array.js +6 -0
  32. package/node_modules/lodash/_WeakMap.js +7 -0
  33. package/node_modules/lodash/_apply.js +21 -0
  34. package/node_modules/lodash/_arrayAggregator.js +22 -0
  35. package/node_modules/lodash/_arrayEach.js +22 -0
  36. package/node_modules/lodash/_arrayEachRight.js +21 -0
  37. package/node_modules/lodash/_arrayEvery.js +23 -0
  38. package/node_modules/lodash/_arrayFilter.js +25 -0
  39. package/node_modules/lodash/_arrayIncludes.js +17 -0
  40. package/node_modules/lodash/_arrayIncludesWith.js +22 -0
  41. package/node_modules/lodash/_arrayLikeKeys.js +49 -0
  42. package/node_modules/lodash/_arrayMap.js +21 -0
  43. package/node_modules/lodash/_arrayPush.js +20 -0
  44. package/node_modules/lodash/_arrayReduce.js +26 -0
  45. package/node_modules/lodash/_arrayReduceRight.js +24 -0
  46. package/node_modules/lodash/_arraySample.js +15 -0
  47. package/node_modules/lodash/_arraySampleSize.js +17 -0
  48. package/node_modules/lodash/_arrayShuffle.js +15 -0
  49. package/node_modules/lodash/_arraySome.js +23 -0
  50. package/node_modules/lodash/_asciiSize.js +12 -0
  51. package/node_modules/lodash/_asciiToArray.js +12 -0
  52. package/node_modules/lodash/_asciiWords.js +15 -0
  53. package/node_modules/lodash/_assignMergeValue.js +20 -0
  54. package/node_modules/lodash/_assignValue.js +28 -0
  55. package/node_modules/lodash/_assocIndexOf.js +21 -0
  56. package/node_modules/lodash/_baseAggregator.js +21 -0
  57. package/node_modules/lodash/_baseAssign.js +17 -0
  58. package/node_modules/lodash/_baseAssignIn.js +17 -0
  59. package/node_modules/lodash/_baseAssignValue.js +25 -0
  60. package/node_modules/lodash/_baseAt.js +23 -0
  61. package/node_modules/lodash/_baseClamp.js +22 -0
  62. package/node_modules/lodash/_baseClone.js +166 -0
  63. package/node_modules/lodash/_baseConforms.js +18 -0
  64. package/node_modules/lodash/_baseConformsTo.js +27 -0
  65. package/node_modules/lodash/_baseCreate.js +30 -0
  66. package/node_modules/lodash/_baseDelay.js +21 -0
  67. package/node_modules/lodash/_baseDifference.js +67 -0
  68. package/node_modules/lodash/_baseEach.js +14 -0
  69. package/node_modules/lodash/_baseEachRight.js +14 -0
  70. package/node_modules/lodash/_baseEvery.js +21 -0
  71. package/node_modules/lodash/_baseExtremum.js +32 -0
  72. package/node_modules/lodash/_baseFill.js +32 -0
  73. package/node_modules/lodash/_baseFilter.js +21 -0
  74. package/node_modules/lodash/_baseFindIndex.js +24 -0
  75. package/node_modules/lodash/_baseFindKey.js +23 -0
  76. package/node_modules/lodash/_baseFlatten.js +38 -0
  77. package/node_modules/lodash/_baseFor.js +16 -0
  78. package/node_modules/lodash/_baseForOwn.js +16 -0
  79. package/node_modules/lodash/_baseForOwnRight.js +16 -0
  80. package/node_modules/lodash/_baseForRight.js +15 -0
  81. package/node_modules/lodash/_baseFunctions.js +19 -0
  82. package/node_modules/lodash/_baseGet.js +24 -0
  83. package/node_modules/lodash/_baseGetAllKeys.js +20 -0
  84. package/node_modules/lodash/_baseGetTag.js +28 -0
  85. package/node_modules/lodash/_baseGt.js +14 -0
  86. package/node_modules/lodash/_baseHas.js +19 -0
  87. package/node_modules/lodash/_baseHasIn.js +13 -0
  88. package/node_modules/lodash/_baseInRange.js +18 -0
  89. package/node_modules/lodash/_baseIndexOf.js +20 -0
  90. package/node_modules/lodash/_baseIndexOfWith.js +23 -0
  91. package/node_modules/lodash/_baseIntersection.js +74 -0
  92. package/node_modules/lodash/_baseInverter.js +21 -0
  93. package/node_modules/lodash/_baseInvoke.js +24 -0
  94. package/node_modules/lodash/_baseIsArguments.js +18 -0
  95. package/node_modules/lodash/_baseIsArrayBuffer.js +17 -0
  96. package/node_modules/lodash/_baseIsDate.js +18 -0
  97. package/node_modules/lodash/_baseIsEqual.js +28 -0
  98. package/node_modules/lodash/_baseIsEqualDeep.js +83 -0
  99. package/node_modules/lodash/_baseIsMap.js +18 -0
  100. package/node_modules/lodash/_baseIsMatch.js +62 -0
  101. package/node_modules/lodash/_baseIsNaN.js +12 -0
  102. package/node_modules/lodash/_baseIsNative.js +47 -0
  103. package/node_modules/lodash/_baseIsRegExp.js +18 -0
  104. package/node_modules/lodash/_baseIsSet.js +18 -0
  105. package/node_modules/lodash/_baseIsTypedArray.js +60 -0
  106. package/node_modules/lodash/_baseIteratee.js +31 -0
  107. package/node_modules/lodash/_baseKeys.js +30 -0
  108. package/node_modules/lodash/_baseKeysIn.js +33 -0
  109. package/node_modules/lodash/_baseLodash.js +10 -0
  110. package/node_modules/lodash/_baseLt.js +14 -0
  111. package/node_modules/lodash/_baseMap.js +22 -0
  112. package/node_modules/lodash/_baseMatches.js +22 -0
  113. package/node_modules/lodash/_baseMatchesProperty.js +33 -0
  114. package/node_modules/lodash/_baseMean.js +20 -0
  115. package/node_modules/lodash/_baseMerge.js +42 -0
  116. package/node_modules/lodash/_baseMergeDeep.js +94 -0
  117. package/node_modules/lodash/_baseNth.js +20 -0
  118. package/node_modules/lodash/_baseOrderBy.js +49 -0
  119. package/node_modules/lodash/_basePick.js +19 -0
  120. package/node_modules/lodash/_basePickBy.js +30 -0
  121. package/node_modules/lodash/_baseProperty.js +14 -0
  122. package/node_modules/lodash/_basePropertyDeep.js +16 -0
  123. package/node_modules/lodash/_basePropertyOf.js +14 -0
  124. package/node_modules/lodash/_basePullAll.js +51 -0
  125. package/node_modules/lodash/_basePullAt.js +37 -0
  126. package/node_modules/lodash/_baseRandom.js +18 -0
  127. package/node_modules/lodash/_baseRange.js +28 -0
  128. package/node_modules/lodash/_baseReduce.js +23 -0
  129. package/node_modules/lodash/_baseRepeat.js +35 -0
  130. package/node_modules/lodash/_baseRest.js +17 -0
  131. package/node_modules/lodash/_baseSample.js +15 -0
  132. package/node_modules/lodash/_baseSampleSize.js +18 -0
  133. package/node_modules/lodash/_baseSet.js +51 -0
  134. package/node_modules/lodash/_baseSetData.js +17 -0
  135. package/node_modules/lodash/_baseSetToString.js +22 -0
  136. package/node_modules/lodash/_baseShuffle.js +15 -0
  137. package/node_modules/lodash/_baseSlice.js +31 -0
  138. package/node_modules/lodash/_baseSome.js +22 -0
  139. package/node_modules/lodash/_baseSortBy.js +21 -0
  140. package/node_modules/lodash/_baseSortedIndex.js +42 -0
  141. package/node_modules/lodash/_baseSortedIndexBy.js +67 -0
  142. package/node_modules/lodash/_baseSortedUniq.js +30 -0
  143. package/node_modules/lodash/_baseSum.js +24 -0
  144. package/node_modules/lodash/_baseTimes.js +20 -0
  145. package/node_modules/lodash/_baseToNumber.js +24 -0
  146. package/node_modules/lodash/_baseToPairs.js +18 -0
  147. package/node_modules/lodash/_baseToString.js +37 -0
  148. package/node_modules/lodash/_baseTrim.js +19 -0
  149. package/node_modules/lodash/_baseUnary.js +14 -0
  150. package/node_modules/lodash/_baseUniq.js +72 -0
  151. package/node_modules/lodash/_baseUnset.js +20 -0
  152. package/node_modules/lodash/_baseUpdate.js +18 -0
  153. package/node_modules/lodash/_baseValues.js +19 -0
  154. package/node_modules/lodash/_baseWhile.js +26 -0
  155. package/node_modules/lodash/_baseWrapperValue.js +25 -0
  156. package/node_modules/lodash/_baseXor.js +36 -0
  157. package/node_modules/lodash/_baseZipObject.js +23 -0
  158. package/node_modules/lodash/_cacheHas.js +13 -0
  159. package/node_modules/lodash/_castArrayLikeObject.js +14 -0
  160. package/node_modules/lodash/_castFunction.js +14 -0
  161. package/node_modules/lodash/_castPath.js +21 -0
  162. package/node_modules/lodash/_castRest.js +14 -0
  163. package/node_modules/lodash/_castSlice.js +18 -0
  164. package/node_modules/lodash/_charsEndIndex.js +19 -0
  165. package/node_modules/lodash/_charsStartIndex.js +20 -0
  166. package/node_modules/lodash/_cloneArrayBuffer.js +16 -0
  167. package/node_modules/lodash/_cloneBuffer.js +35 -0
  168. package/node_modules/lodash/_cloneDataView.js +16 -0
  169. package/node_modules/lodash/_cloneRegExp.js +17 -0
  170. package/node_modules/lodash/_cloneSymbol.js +18 -0
  171. package/node_modules/lodash/_cloneTypedArray.js +16 -0
  172. package/node_modules/lodash/_compareAscending.js +41 -0
  173. package/node_modules/lodash/_compareMultiple.js +44 -0
  174. package/node_modules/lodash/_composeArgs.js +39 -0
  175. package/node_modules/lodash/_composeArgsRight.js +41 -0
  176. package/node_modules/lodash/_copyArray.js +20 -0
  177. package/node_modules/lodash/_copyObject.js +40 -0
  178. package/node_modules/lodash/_copySymbols.js +16 -0
  179. package/node_modules/lodash/_copySymbolsIn.js +16 -0
  180. package/node_modules/lodash/_coreJsData.js +6 -0
  181. package/node_modules/lodash/_countHolders.js +21 -0
  182. package/node_modules/lodash/_createAggregator.js +23 -0
  183. package/node_modules/lodash/_createAssigner.js +37 -0
  184. package/node_modules/lodash/_createBaseEach.js +32 -0
  185. package/node_modules/lodash/_createBaseFor.js +25 -0
  186. package/node_modules/lodash/_createBind.js +28 -0
  187. package/node_modules/lodash/_createCaseFirst.js +33 -0
  188. package/node_modules/lodash/_createCompounder.js +24 -0
  189. package/node_modules/lodash/_createCtor.js +37 -0
  190. package/node_modules/lodash/_createCurry.js +46 -0
  191. package/node_modules/lodash/_createFind.js +25 -0
  192. package/node_modules/lodash/_createFlow.js +78 -0
  193. package/node_modules/lodash/_createHybrid.js +92 -0
  194. package/node_modules/lodash/_createInverter.js +17 -0
  195. package/node_modules/lodash/_createMathOperation.js +38 -0
  196. package/node_modules/lodash/_createOver.js +27 -0
  197. package/node_modules/lodash/_createPadding.js +33 -0
  198. package/node_modules/lodash/_createPartial.js +43 -0
  199. package/node_modules/lodash/_createRange.js +30 -0
  200. package/node_modules/lodash/_createRecurry.js +56 -0
  201. package/node_modules/lodash/_createRelationalOperation.js +20 -0
  202. package/node_modules/lodash/_createRound.js +35 -0
  203. package/node_modules/lodash/_createSet.js +19 -0
  204. package/node_modules/lodash/_createToPairs.js +30 -0
  205. package/node_modules/lodash/_createWrap.js +106 -0
  206. package/node_modules/lodash/_customDefaultsAssignIn.js +29 -0
  207. package/node_modules/lodash/_customDefaultsMerge.js +28 -0
  208. package/node_modules/lodash/_customOmitClone.js +16 -0
  209. package/node_modules/lodash/_deburrLetter.js +71 -0
  210. package/node_modules/lodash/_defineProperty.js +11 -0
  211. package/node_modules/lodash/_equalArrays.js +84 -0
  212. package/node_modules/lodash/_equalByTag.js +112 -0
  213. package/node_modules/lodash/_equalObjects.js +90 -0
  214. package/node_modules/lodash/_escapeHtmlChar.js +21 -0
  215. package/node_modules/lodash/_escapeStringChar.js +22 -0
  216. package/node_modules/lodash/_flatRest.js +16 -0
  217. package/node_modules/lodash/_freeGlobal.js +4 -0
  218. package/node_modules/lodash/_getAllKeys.js +16 -0
  219. package/node_modules/lodash/_getAllKeysIn.js +17 -0
  220. package/node_modules/lodash/_getData.js +15 -0
  221. package/node_modules/lodash/_getFuncName.js +31 -0
  222. package/node_modules/lodash/_getHolder.js +13 -0
  223. package/node_modules/lodash/_getMapData.js +18 -0
  224. package/node_modules/lodash/_getMatchData.js +24 -0
  225. package/node_modules/lodash/_getNative.js +17 -0
  226. package/node_modules/lodash/_getPrototype.js +6 -0
  227. package/node_modules/lodash/_getRawTag.js +46 -0
  228. package/node_modules/lodash/_getSymbols.js +30 -0
  229. package/node_modules/lodash/_getSymbolsIn.js +25 -0
  230. package/node_modules/lodash/_getTag.js +58 -0
  231. package/node_modules/lodash/_getValue.js +13 -0
  232. package/node_modules/lodash/_getView.js +33 -0
  233. package/node_modules/lodash/_getWrapDetails.js +17 -0
  234. package/node_modules/lodash/_hasPath.js +39 -0
  235. package/node_modules/lodash/_hasUnicode.js +26 -0
  236. package/node_modules/lodash/_hasUnicodeWord.js +15 -0
  237. package/node_modules/lodash/_hashClear.js +15 -0
  238. package/node_modules/lodash/_hashDelete.js +17 -0
  239. package/node_modules/lodash/_hashGet.js +30 -0
  240. package/node_modules/lodash/_hashHas.js +23 -0
  241. package/node_modules/lodash/_hashSet.js +23 -0
  242. package/node_modules/lodash/_initCloneArray.js +26 -0
  243. package/node_modules/lodash/_initCloneByTag.js +77 -0
  244. package/node_modules/lodash/_initCloneObject.js +18 -0
  245. package/node_modules/lodash/_insertWrapDetails.js +23 -0
  246. package/node_modules/lodash/_isFlattenable.js +20 -0
  247. package/node_modules/lodash/_isIndex.js +25 -0
  248. package/node_modules/lodash/_isIterateeCall.js +30 -0
  249. package/node_modules/lodash/_isKey.js +29 -0
  250. package/node_modules/lodash/_isKeyable.js +15 -0
  251. package/node_modules/lodash/_isLaziable.js +28 -0
  252. package/node_modules/lodash/_isMaskable.js +14 -0
  253. package/node_modules/lodash/_isMasked.js +20 -0
  254. package/node_modules/lodash/_isPrototype.js +18 -0
  255. package/node_modules/lodash/_isStrictComparable.js +15 -0
  256. package/node_modules/lodash/_iteratorToArray.js +18 -0
  257. package/node_modules/lodash/_lazyClone.js +23 -0
  258. package/node_modules/lodash/_lazyReverse.js +23 -0
  259. package/node_modules/lodash/_lazyValue.js +69 -0
  260. package/node_modules/lodash/_listCacheClear.js +13 -0
  261. package/node_modules/lodash/_listCacheDelete.js +35 -0
  262. package/node_modules/lodash/_listCacheGet.js +19 -0
  263. package/node_modules/lodash/_listCacheHas.js +16 -0
  264. package/node_modules/lodash/_listCacheSet.js +26 -0
  265. package/node_modules/lodash/_mapCacheClear.js +21 -0
  266. package/node_modules/lodash/_mapCacheDelete.js +18 -0
  267. package/node_modules/lodash/_mapCacheGet.js +16 -0
  268. package/node_modules/lodash/_mapCacheHas.js +16 -0
  269. package/node_modules/lodash/_mapCacheSet.js +22 -0
  270. package/node_modules/lodash/_mapToArray.js +18 -0
  271. package/node_modules/lodash/_matchesStrictComparable.js +20 -0
  272. package/node_modules/lodash/_memoizeCapped.js +26 -0
  273. package/node_modules/lodash/_mergeData.js +90 -0
  274. package/node_modules/lodash/_metaMap.js +6 -0
  275. package/node_modules/lodash/_nativeCreate.js +6 -0
  276. package/node_modules/lodash/_nativeKeys.js +6 -0
  277. package/node_modules/lodash/_nativeKeysIn.js +20 -0
  278. package/node_modules/lodash/_nodeUtil.js +30 -0
  279. package/node_modules/lodash/_objectToString.js +22 -0
  280. package/node_modules/lodash/_overArg.js +15 -0
  281. package/node_modules/lodash/_overRest.js +36 -0
  282. package/node_modules/lodash/_parent.js +16 -0
  283. package/node_modules/lodash/_reEscape.js +4 -0
  284. package/node_modules/lodash/_reEvaluate.js +4 -0
  285. package/node_modules/lodash/_reInterpolate.js +4 -0
  286. package/node_modules/lodash/_realNames.js +4 -0
  287. package/node_modules/lodash/_reorder.js +29 -0
  288. package/node_modules/lodash/_replaceHolders.js +29 -0
  289. package/node_modules/lodash/_root.js +9 -0
  290. package/node_modules/lodash/_safeGet.js +21 -0
  291. package/node_modules/lodash/_setCacheAdd.js +19 -0
  292. package/node_modules/lodash/_setCacheHas.js +14 -0
  293. package/node_modules/lodash/_setData.js +20 -0
  294. package/node_modules/lodash/_setToArray.js +18 -0
  295. package/node_modules/lodash/_setToPairs.js +18 -0
  296. package/node_modules/lodash/_setToString.js +14 -0
  297. package/node_modules/lodash/_setWrapToString.js +21 -0
  298. package/node_modules/lodash/_shortOut.js +37 -0
  299. package/node_modules/lodash/_shuffleSelf.js +28 -0
  300. package/node_modules/lodash/_stackClear.js +15 -0
  301. package/node_modules/lodash/_stackDelete.js +18 -0
  302. package/node_modules/lodash/_stackGet.js +14 -0
  303. package/node_modules/lodash/_stackHas.js +14 -0
  304. package/node_modules/lodash/_stackSet.js +34 -0
  305. package/node_modules/lodash/_strictIndexOf.js +23 -0
  306. package/node_modules/lodash/_strictLastIndexOf.js +21 -0
  307. package/node_modules/lodash/_stringSize.js +18 -0
  308. package/node_modules/lodash/_stringToArray.js +18 -0
  309. package/node_modules/lodash/_stringToPath.js +27 -0
  310. package/node_modules/lodash/_toKey.js +21 -0
  311. package/node_modules/lodash/_toSource.js +26 -0
  312. package/node_modules/lodash/_trimmedEndIndex.js +19 -0
  313. package/node_modules/lodash/_unescapeHtmlChar.js +21 -0
  314. package/node_modules/lodash/_unicodeSize.js +44 -0
  315. package/node_modules/lodash/_unicodeToArray.js +40 -0
  316. package/node_modules/lodash/_unicodeWords.js +69 -0
  317. package/node_modules/lodash/_updateWrapDetails.js +46 -0
  318. package/node_modules/lodash/_wrapperClone.js +23 -0
  319. package/node_modules/lodash/add.js +22 -0
  320. package/node_modules/lodash/after.js +42 -0
  321. package/node_modules/lodash/array.js +67 -0
  322. package/node_modules/lodash/ary.js +29 -0
  323. package/node_modules/lodash/assign.js +58 -0
  324. package/node_modules/lodash/assignIn.js +40 -0
  325. package/node_modules/lodash/assignInWith.js +38 -0
  326. package/node_modules/lodash/assignWith.js +37 -0
  327. package/node_modules/lodash/at.js +23 -0
  328. package/node_modules/lodash/attempt.js +35 -0
  329. package/node_modules/lodash/before.js +40 -0
  330. package/node_modules/lodash/bind.js +57 -0
  331. package/node_modules/lodash/bindAll.js +41 -0
  332. package/node_modules/lodash/bindKey.js +68 -0
  333. package/node_modules/lodash/camelCase.js +29 -0
  334. package/node_modules/lodash/capitalize.js +23 -0
  335. package/node_modules/lodash/castArray.js +44 -0
  336. package/node_modules/lodash/ceil.js +26 -0
  337. package/node_modules/lodash/chain.js +38 -0
  338. package/node_modules/lodash/chunk.js +50 -0
  339. package/node_modules/lodash/clamp.js +39 -0
  340. package/node_modules/lodash/clone.js +36 -0
  341. package/node_modules/lodash/cloneDeep.js +29 -0
  342. package/node_modules/lodash/cloneDeepWith.js +40 -0
  343. package/node_modules/lodash/cloneWith.js +42 -0
  344. package/node_modules/lodash/collection.js +30 -0
  345. package/node_modules/lodash/commit.js +33 -0
  346. package/node_modules/lodash/compact.js +31 -0
  347. package/node_modules/lodash/concat.js +43 -0
  348. package/node_modules/lodash/cond.js +60 -0
  349. package/node_modules/lodash/conforms.js +35 -0
  350. package/node_modules/lodash/conformsTo.js +32 -0
  351. package/node_modules/lodash/constant.js +26 -0
  352. package/node_modules/lodash/core.js +3877 -0
  353. package/node_modules/lodash/core.min.js +29 -0
  354. package/node_modules/lodash/countBy.js +40 -0
  355. package/node_modules/lodash/create.js +43 -0
  356. package/node_modules/lodash/curry.js +57 -0
  357. package/node_modules/lodash/curryRight.js +54 -0
  358. package/node_modules/lodash/date.js +3 -0
  359. package/node_modules/lodash/debounce.js +191 -0
  360. package/node_modules/lodash/deburr.js +45 -0
  361. package/node_modules/lodash/defaultTo.js +25 -0
  362. package/node_modules/lodash/defaults.js +64 -0
  363. package/node_modules/lodash/defaultsDeep.js +30 -0
  364. package/node_modules/lodash/defer.js +26 -0
  365. package/node_modules/lodash/delay.js +28 -0
  366. package/node_modules/lodash/difference.js +33 -0
  367. package/node_modules/lodash/differenceBy.js +44 -0
  368. package/node_modules/lodash/differenceWith.js +40 -0
  369. package/node_modules/lodash/divide.js +22 -0
  370. package/node_modules/lodash/drop.js +38 -0
  371. package/node_modules/lodash/dropRight.js +39 -0
  372. package/node_modules/lodash/dropRightWhile.js +45 -0
  373. package/node_modules/lodash/dropWhile.js +45 -0
  374. package/node_modules/lodash/each.js +1 -0
  375. package/node_modules/lodash/eachRight.js +1 -0
  376. package/node_modules/lodash/endsWith.js +43 -0
  377. package/node_modules/lodash/entries.js +1 -0
  378. package/node_modules/lodash/entriesIn.js +1 -0
  379. package/node_modules/lodash/eq.js +37 -0
  380. package/node_modules/lodash/escape.js +43 -0
  381. package/node_modules/lodash/escapeRegExp.js +32 -0
  382. package/node_modules/lodash/every.js +56 -0
  383. package/node_modules/lodash/extend.js +1 -0
  384. package/node_modules/lodash/extendWith.js +1 -0
  385. package/node_modules/lodash/fill.js +45 -0
  386. package/node_modules/lodash/filter.js +52 -0
  387. package/node_modules/lodash/find.js +42 -0
  388. package/node_modules/lodash/findIndex.js +55 -0
  389. package/node_modules/lodash/findKey.js +44 -0
  390. package/node_modules/lodash/findLast.js +25 -0
  391. package/node_modules/lodash/findLastIndex.js +59 -0
  392. package/node_modules/lodash/findLastKey.js +44 -0
  393. package/node_modules/lodash/first.js +1 -0
  394. package/node_modules/lodash/flake.lock +40 -0
  395. package/node_modules/lodash/flake.nix +20 -0
  396. package/node_modules/lodash/flatMap.js +29 -0
  397. package/node_modules/lodash/flatMapDeep.js +31 -0
  398. package/node_modules/lodash/flatMapDepth.js +31 -0
  399. package/node_modules/lodash/flatten.js +22 -0
  400. package/node_modules/lodash/flattenDeep.js +25 -0
  401. package/node_modules/lodash/flattenDepth.js +33 -0
  402. package/node_modules/lodash/flip.js +28 -0
  403. package/node_modules/lodash/floor.js +26 -0
  404. package/node_modules/lodash/flow.js +27 -0
  405. package/node_modules/lodash/flowRight.js +26 -0
  406. package/node_modules/lodash/forEach.js +41 -0
  407. package/node_modules/lodash/forEachRight.js +31 -0
  408. package/node_modules/lodash/forIn.js +39 -0
  409. package/node_modules/lodash/forInRight.js +37 -0
  410. package/node_modules/lodash/forOwn.js +36 -0
  411. package/node_modules/lodash/forOwnRight.js +34 -0
  412. package/node_modules/lodash/fp/F.js +1 -0
  413. package/node_modules/lodash/fp/T.js +1 -0
  414. package/node_modules/lodash/fp/__.js +1 -0
  415. package/node_modules/lodash/fp/_baseConvert.js +569 -0
  416. package/node_modules/lodash/fp/_convertBrowser.js +18 -0
  417. package/node_modules/lodash/fp/_falseOptions.js +7 -0
  418. package/node_modules/lodash/fp/_mapping.js +358 -0
  419. package/node_modules/lodash/fp/_util.js +16 -0
  420. package/node_modules/lodash/fp/add.js +5 -0
  421. package/node_modules/lodash/fp/after.js +5 -0
  422. package/node_modules/lodash/fp/all.js +1 -0
  423. package/node_modules/lodash/fp/allPass.js +1 -0
  424. package/node_modules/lodash/fp/always.js +1 -0
  425. package/node_modules/lodash/fp/any.js +1 -0
  426. package/node_modules/lodash/fp/anyPass.js +1 -0
  427. package/node_modules/lodash/fp/apply.js +1 -0
  428. package/node_modules/lodash/fp/array.js +2 -0
  429. package/node_modules/lodash/fp/ary.js +5 -0
  430. package/node_modules/lodash/fp/assign.js +5 -0
  431. package/node_modules/lodash/fp/assignAll.js +5 -0
  432. package/node_modules/lodash/fp/assignAllWith.js +5 -0
  433. package/node_modules/lodash/fp/assignIn.js +5 -0
  434. package/node_modules/lodash/fp/assignInAll.js +5 -0
  435. package/node_modules/lodash/fp/assignInAllWith.js +5 -0
  436. package/node_modules/lodash/fp/assignInWith.js +5 -0
  437. package/node_modules/lodash/fp/assignWith.js +5 -0
  438. package/node_modules/lodash/fp/assoc.js +1 -0
  439. package/node_modules/lodash/fp/assocPath.js +1 -0
  440. package/node_modules/lodash/fp/at.js +5 -0
  441. package/node_modules/lodash/fp/attempt.js +5 -0
  442. package/node_modules/lodash/fp/before.js +5 -0
  443. package/node_modules/lodash/fp/bind.js +5 -0
  444. package/node_modules/lodash/fp/bindAll.js +5 -0
  445. package/node_modules/lodash/fp/bindKey.js +5 -0
  446. package/node_modules/lodash/fp/camelCase.js +5 -0
  447. package/node_modules/lodash/fp/capitalize.js +5 -0
  448. package/node_modules/lodash/fp/castArray.js +5 -0
  449. package/node_modules/lodash/fp/ceil.js +5 -0
  450. package/node_modules/lodash/fp/chain.js +5 -0
  451. package/node_modules/lodash/fp/chunk.js +5 -0
  452. package/node_modules/lodash/fp/clamp.js +5 -0
  453. package/node_modules/lodash/fp/clone.js +5 -0
  454. package/node_modules/lodash/fp/cloneDeep.js +5 -0
  455. package/node_modules/lodash/fp/cloneDeepWith.js +5 -0
  456. package/node_modules/lodash/fp/cloneWith.js +5 -0
  457. package/node_modules/lodash/fp/collection.js +2 -0
  458. package/node_modules/lodash/fp/commit.js +5 -0
  459. package/node_modules/lodash/fp/compact.js +5 -0
  460. package/node_modules/lodash/fp/complement.js +1 -0
  461. package/node_modules/lodash/fp/compose.js +1 -0
  462. package/node_modules/lodash/fp/concat.js +5 -0
  463. package/node_modules/lodash/fp/cond.js +5 -0
  464. package/node_modules/lodash/fp/conforms.js +1 -0
  465. package/node_modules/lodash/fp/conformsTo.js +5 -0
  466. package/node_modules/lodash/fp/constant.js +5 -0
  467. package/node_modules/lodash/fp/contains.js +1 -0
  468. package/node_modules/lodash/fp/convert.js +18 -0
  469. package/node_modules/lodash/fp/countBy.js +5 -0
  470. package/node_modules/lodash/fp/create.js +5 -0
  471. package/node_modules/lodash/fp/curry.js +5 -0
  472. package/node_modules/lodash/fp/curryN.js +5 -0
  473. package/node_modules/lodash/fp/curryRight.js +5 -0
  474. package/node_modules/lodash/fp/curryRightN.js +5 -0
  475. package/node_modules/lodash/fp/date.js +2 -0
  476. package/node_modules/lodash/fp/debounce.js +5 -0
  477. package/node_modules/lodash/fp/deburr.js +5 -0
  478. package/node_modules/lodash/fp/defaultTo.js +5 -0
  479. package/node_modules/lodash/fp/defaults.js +5 -0
  480. package/node_modules/lodash/fp/defaultsAll.js +5 -0
  481. package/node_modules/lodash/fp/defaultsDeep.js +5 -0
  482. package/node_modules/lodash/fp/defaultsDeepAll.js +5 -0
  483. package/node_modules/lodash/fp/defer.js +5 -0
  484. package/node_modules/lodash/fp/delay.js +5 -0
  485. package/node_modules/lodash/fp/difference.js +5 -0
  486. package/node_modules/lodash/fp/differenceBy.js +5 -0
  487. package/node_modules/lodash/fp/differenceWith.js +5 -0
  488. package/node_modules/lodash/fp/dissoc.js +1 -0
  489. package/node_modules/lodash/fp/dissocPath.js +1 -0
  490. package/node_modules/lodash/fp/divide.js +5 -0
  491. package/node_modules/lodash/fp/drop.js +5 -0
  492. package/node_modules/lodash/fp/dropLast.js +1 -0
  493. package/node_modules/lodash/fp/dropLastWhile.js +1 -0
  494. package/node_modules/lodash/fp/dropRight.js +5 -0
  495. package/node_modules/lodash/fp/dropRightWhile.js +5 -0
  496. package/node_modules/lodash/fp/dropWhile.js +5 -0
  497. package/node_modules/lodash/fp/each.js +1 -0
  498. package/node_modules/lodash/fp/eachRight.js +1 -0
  499. package/node_modules/lodash/fp/endsWith.js +5 -0
  500. package/node_modules/lodash/fp/entries.js +1 -0
  501. package/node_modules/lodash/fp/entriesIn.js +1 -0
  502. package/node_modules/lodash/fp/eq.js +5 -0
  503. package/node_modules/lodash/fp/equals.js +1 -0
  504. package/node_modules/lodash/fp/escape.js +5 -0
  505. package/node_modules/lodash/fp/escapeRegExp.js +5 -0
  506. package/node_modules/lodash/fp/every.js +5 -0
  507. package/node_modules/lodash/fp/extend.js +1 -0
  508. package/node_modules/lodash/fp/extendAll.js +1 -0
  509. package/node_modules/lodash/fp/extendAllWith.js +1 -0
  510. package/node_modules/lodash/fp/extendWith.js +1 -0
  511. package/node_modules/lodash/fp/fill.js +5 -0
  512. package/node_modules/lodash/fp/filter.js +5 -0
  513. package/node_modules/lodash/fp/find.js +5 -0
  514. package/node_modules/lodash/fp/findFrom.js +5 -0
  515. package/node_modules/lodash/fp/findIndex.js +5 -0
  516. package/node_modules/lodash/fp/findIndexFrom.js +5 -0
  517. package/node_modules/lodash/fp/findKey.js +5 -0
  518. package/node_modules/lodash/fp/findLast.js +5 -0
  519. package/node_modules/lodash/fp/findLastFrom.js +5 -0
  520. package/node_modules/lodash/fp/findLastIndex.js +5 -0
  521. package/node_modules/lodash/fp/findLastIndexFrom.js +5 -0
  522. package/node_modules/lodash/fp/findLastKey.js +5 -0
  523. package/node_modules/lodash/fp/first.js +1 -0
  524. package/node_modules/lodash/fp/flatMap.js +5 -0
  525. package/node_modules/lodash/fp/flatMapDeep.js +5 -0
  526. package/node_modules/lodash/fp/flatMapDepth.js +5 -0
  527. package/node_modules/lodash/fp/flatten.js +5 -0
  528. package/node_modules/lodash/fp/flattenDeep.js +5 -0
  529. package/node_modules/lodash/fp/flattenDepth.js +5 -0
  530. package/node_modules/lodash/fp/flip.js +5 -0
  531. package/node_modules/lodash/fp/floor.js +5 -0
  532. package/node_modules/lodash/fp/flow.js +5 -0
  533. package/node_modules/lodash/fp/flowRight.js +5 -0
  534. package/node_modules/lodash/fp/forEach.js +5 -0
  535. package/node_modules/lodash/fp/forEachRight.js +5 -0
  536. package/node_modules/lodash/fp/forIn.js +5 -0
  537. package/node_modules/lodash/fp/forInRight.js +5 -0
  538. package/node_modules/lodash/fp/forOwn.js +5 -0
  539. package/node_modules/lodash/fp/forOwnRight.js +5 -0
  540. package/node_modules/lodash/fp/fromPairs.js +5 -0
  541. package/node_modules/lodash/fp/function.js +2 -0
  542. package/node_modules/lodash/fp/functions.js +5 -0
  543. package/node_modules/lodash/fp/functionsIn.js +5 -0
  544. package/node_modules/lodash/fp/get.js +5 -0
  545. package/node_modules/lodash/fp/getOr.js +5 -0
  546. package/node_modules/lodash/fp/groupBy.js +5 -0
  547. package/node_modules/lodash/fp/gt.js +5 -0
  548. package/node_modules/lodash/fp/gte.js +5 -0
  549. package/node_modules/lodash/fp/has.js +5 -0
  550. package/node_modules/lodash/fp/hasIn.js +5 -0
  551. package/node_modules/lodash/fp/head.js +5 -0
  552. package/node_modules/lodash/fp/identical.js +1 -0
  553. package/node_modules/lodash/fp/identity.js +5 -0
  554. package/node_modules/lodash/fp/inRange.js +5 -0
  555. package/node_modules/lodash/fp/includes.js +5 -0
  556. package/node_modules/lodash/fp/includesFrom.js +5 -0
  557. package/node_modules/lodash/fp/indexBy.js +1 -0
  558. package/node_modules/lodash/fp/indexOf.js +5 -0
  559. package/node_modules/lodash/fp/indexOfFrom.js +5 -0
  560. package/node_modules/lodash/fp/init.js +1 -0
  561. package/node_modules/lodash/fp/initial.js +5 -0
  562. package/node_modules/lodash/fp/intersection.js +5 -0
  563. package/node_modules/lodash/fp/intersectionBy.js +5 -0
  564. package/node_modules/lodash/fp/intersectionWith.js +5 -0
  565. package/node_modules/lodash/fp/invert.js +5 -0
  566. package/node_modules/lodash/fp/invertBy.js +5 -0
  567. package/node_modules/lodash/fp/invertObj.js +1 -0
  568. package/node_modules/lodash/fp/invoke.js +5 -0
  569. package/node_modules/lodash/fp/invokeArgs.js +5 -0
  570. package/node_modules/lodash/fp/invokeArgsMap.js +5 -0
  571. package/node_modules/lodash/fp/invokeMap.js +5 -0
  572. package/node_modules/lodash/fp/isArguments.js +5 -0
  573. package/node_modules/lodash/fp/isArray.js +5 -0
  574. package/node_modules/lodash/fp/isArrayBuffer.js +5 -0
  575. package/node_modules/lodash/fp/isArrayLike.js +5 -0
  576. package/node_modules/lodash/fp/isArrayLikeObject.js +5 -0
  577. package/node_modules/lodash/fp/isBoolean.js +5 -0
  578. package/node_modules/lodash/fp/isBuffer.js +5 -0
  579. package/node_modules/lodash/fp/isDate.js +5 -0
  580. package/node_modules/lodash/fp/isElement.js +5 -0
  581. package/node_modules/lodash/fp/isEmpty.js +5 -0
  582. package/node_modules/lodash/fp/isEqual.js +5 -0
  583. package/node_modules/lodash/fp/isEqualWith.js +5 -0
  584. package/node_modules/lodash/fp/isError.js +5 -0
  585. package/node_modules/lodash/fp/isFinite.js +5 -0
  586. package/node_modules/lodash/fp/isFunction.js +5 -0
  587. package/node_modules/lodash/fp/isInteger.js +5 -0
  588. package/node_modules/lodash/fp/isLength.js +5 -0
  589. package/node_modules/lodash/fp/isMap.js +5 -0
  590. package/node_modules/lodash/fp/isMatch.js +5 -0
  591. package/node_modules/lodash/fp/isMatchWith.js +5 -0
  592. package/node_modules/lodash/fp/isNaN.js +5 -0
  593. package/node_modules/lodash/fp/isNative.js +5 -0
  594. package/node_modules/lodash/fp/isNil.js +5 -0
  595. package/node_modules/lodash/fp/isNull.js +5 -0
  596. package/node_modules/lodash/fp/isNumber.js +5 -0
  597. package/node_modules/lodash/fp/isObject.js +5 -0
  598. package/node_modules/lodash/fp/isObjectLike.js +5 -0
  599. package/node_modules/lodash/fp/isPlainObject.js +5 -0
  600. package/node_modules/lodash/fp/isRegExp.js +5 -0
  601. package/node_modules/lodash/fp/isSafeInteger.js +5 -0
  602. package/node_modules/lodash/fp/isSet.js +5 -0
  603. package/node_modules/lodash/fp/isString.js +5 -0
  604. package/node_modules/lodash/fp/isSymbol.js +5 -0
  605. package/node_modules/lodash/fp/isTypedArray.js +5 -0
  606. package/node_modules/lodash/fp/isUndefined.js +5 -0
  607. package/node_modules/lodash/fp/isWeakMap.js +5 -0
  608. package/node_modules/lodash/fp/isWeakSet.js +5 -0
  609. package/node_modules/lodash/fp/iteratee.js +5 -0
  610. package/node_modules/lodash/fp/join.js +5 -0
  611. package/node_modules/lodash/fp/juxt.js +1 -0
  612. package/node_modules/lodash/fp/kebabCase.js +5 -0
  613. package/node_modules/lodash/fp/keyBy.js +5 -0
  614. package/node_modules/lodash/fp/keys.js +5 -0
  615. package/node_modules/lodash/fp/keysIn.js +5 -0
  616. package/node_modules/lodash/fp/lang.js +2 -0
  617. package/node_modules/lodash/fp/last.js +5 -0
  618. package/node_modules/lodash/fp/lastIndexOf.js +5 -0
  619. package/node_modules/lodash/fp/lastIndexOfFrom.js +5 -0
  620. package/node_modules/lodash/fp/lowerCase.js +5 -0
  621. package/node_modules/lodash/fp/lowerFirst.js +5 -0
  622. package/node_modules/lodash/fp/lt.js +5 -0
  623. package/node_modules/lodash/fp/lte.js +5 -0
  624. package/node_modules/lodash/fp/map.js +5 -0
  625. package/node_modules/lodash/fp/mapKeys.js +5 -0
  626. package/node_modules/lodash/fp/mapValues.js +5 -0
  627. package/node_modules/lodash/fp/matches.js +1 -0
  628. package/node_modules/lodash/fp/matchesProperty.js +5 -0
  629. package/node_modules/lodash/fp/math.js +2 -0
  630. package/node_modules/lodash/fp/max.js +5 -0
  631. package/node_modules/lodash/fp/maxBy.js +5 -0
  632. package/node_modules/lodash/fp/mean.js +5 -0
  633. package/node_modules/lodash/fp/meanBy.js +5 -0
  634. package/node_modules/lodash/fp/memoize.js +5 -0
  635. package/node_modules/lodash/fp/merge.js +5 -0
  636. package/node_modules/lodash/fp/mergeAll.js +5 -0
  637. package/node_modules/lodash/fp/mergeAllWith.js +5 -0
  638. package/node_modules/lodash/fp/mergeWith.js +5 -0
  639. package/node_modules/lodash/fp/method.js +5 -0
  640. package/node_modules/lodash/fp/methodOf.js +5 -0
  641. package/node_modules/lodash/fp/min.js +5 -0
  642. package/node_modules/lodash/fp/minBy.js +5 -0
  643. package/node_modules/lodash/fp/mixin.js +5 -0
  644. package/node_modules/lodash/fp/multiply.js +5 -0
  645. package/node_modules/lodash/fp/nAry.js +1 -0
  646. package/node_modules/lodash/fp/negate.js +5 -0
  647. package/node_modules/lodash/fp/next.js +5 -0
  648. package/node_modules/lodash/fp/noop.js +5 -0
  649. package/node_modules/lodash/fp/now.js +5 -0
  650. package/node_modules/lodash/fp/nth.js +5 -0
  651. package/node_modules/lodash/fp/nthArg.js +5 -0
  652. package/node_modules/lodash/fp/number.js +2 -0
  653. package/node_modules/lodash/fp/object.js +2 -0
  654. package/node_modules/lodash/fp/omit.js +5 -0
  655. package/node_modules/lodash/fp/omitAll.js +1 -0
  656. package/node_modules/lodash/fp/omitBy.js +5 -0
  657. package/node_modules/lodash/fp/once.js +5 -0
  658. package/node_modules/lodash/fp/orderBy.js +5 -0
  659. package/node_modules/lodash/fp/over.js +5 -0
  660. package/node_modules/lodash/fp/overArgs.js +5 -0
  661. package/node_modules/lodash/fp/overEvery.js +5 -0
  662. package/node_modules/lodash/fp/overSome.js +5 -0
  663. package/node_modules/lodash/fp/pad.js +5 -0
  664. package/node_modules/lodash/fp/padChars.js +5 -0
  665. package/node_modules/lodash/fp/padCharsEnd.js +5 -0
  666. package/node_modules/lodash/fp/padCharsStart.js +5 -0
  667. package/node_modules/lodash/fp/padEnd.js +5 -0
  668. package/node_modules/lodash/fp/padStart.js +5 -0
  669. package/node_modules/lodash/fp/parseInt.js +5 -0
  670. package/node_modules/lodash/fp/partial.js +5 -0
  671. package/node_modules/lodash/fp/partialRight.js +5 -0
  672. package/node_modules/lodash/fp/partition.js +5 -0
  673. package/node_modules/lodash/fp/path.js +1 -0
  674. package/node_modules/lodash/fp/pathEq.js +1 -0
  675. package/node_modules/lodash/fp/pathOr.js +1 -0
  676. package/node_modules/lodash/fp/paths.js +1 -0
  677. package/node_modules/lodash/fp/pick.js +5 -0
  678. package/node_modules/lodash/fp/pickAll.js +1 -0
  679. package/node_modules/lodash/fp/pickBy.js +5 -0
  680. package/node_modules/lodash/fp/pipe.js +1 -0
  681. package/node_modules/lodash/fp/placeholder.js +6 -0
  682. package/node_modules/lodash/fp/plant.js +5 -0
  683. package/node_modules/lodash/fp/pluck.js +1 -0
  684. package/node_modules/lodash/fp/prop.js +1 -0
  685. package/node_modules/lodash/fp/propEq.js +1 -0
  686. package/node_modules/lodash/fp/propOr.js +1 -0
  687. package/node_modules/lodash/fp/property.js +1 -0
  688. package/node_modules/lodash/fp/propertyOf.js +5 -0
  689. package/node_modules/lodash/fp/props.js +1 -0
  690. package/node_modules/lodash/fp/pull.js +5 -0
  691. package/node_modules/lodash/fp/pullAll.js +5 -0
  692. package/node_modules/lodash/fp/pullAllBy.js +5 -0
  693. package/node_modules/lodash/fp/pullAllWith.js +5 -0
  694. package/node_modules/lodash/fp/pullAt.js +5 -0
  695. package/node_modules/lodash/fp/random.js +5 -0
  696. package/node_modules/lodash/fp/range.js +5 -0
  697. package/node_modules/lodash/fp/rangeRight.js +5 -0
  698. package/node_modules/lodash/fp/rangeStep.js +5 -0
  699. package/node_modules/lodash/fp/rangeStepRight.js +5 -0
  700. package/node_modules/lodash/fp/rearg.js +5 -0
  701. package/node_modules/lodash/fp/reduce.js +5 -0
  702. package/node_modules/lodash/fp/reduceRight.js +5 -0
  703. package/node_modules/lodash/fp/reject.js +5 -0
  704. package/node_modules/lodash/fp/remove.js +5 -0
  705. package/node_modules/lodash/fp/repeat.js +5 -0
  706. package/node_modules/lodash/fp/replace.js +5 -0
  707. package/node_modules/lodash/fp/rest.js +5 -0
  708. package/node_modules/lodash/fp/restFrom.js +5 -0
  709. package/node_modules/lodash/fp/result.js +5 -0
  710. package/node_modules/lodash/fp/reverse.js +5 -0
  711. package/node_modules/lodash/fp/round.js +5 -0
  712. package/node_modules/lodash/fp/sample.js +5 -0
  713. package/node_modules/lodash/fp/sampleSize.js +5 -0
  714. package/node_modules/lodash/fp/seq.js +2 -0
  715. package/node_modules/lodash/fp/set.js +5 -0
  716. package/node_modules/lodash/fp/setWith.js +5 -0
  717. package/node_modules/lodash/fp/shuffle.js +5 -0
  718. package/node_modules/lodash/fp/size.js +5 -0
  719. package/node_modules/lodash/fp/slice.js +5 -0
  720. package/node_modules/lodash/fp/snakeCase.js +5 -0
  721. package/node_modules/lodash/fp/some.js +5 -0
  722. package/node_modules/lodash/fp/sortBy.js +5 -0
  723. package/node_modules/lodash/fp/sortedIndex.js +5 -0
  724. package/node_modules/lodash/fp/sortedIndexBy.js +5 -0
  725. package/node_modules/lodash/fp/sortedIndexOf.js +5 -0
  726. package/node_modules/lodash/fp/sortedLastIndex.js +5 -0
  727. package/node_modules/lodash/fp/sortedLastIndexBy.js +5 -0
  728. package/node_modules/lodash/fp/sortedLastIndexOf.js +5 -0
  729. package/node_modules/lodash/fp/sortedUniq.js +5 -0
  730. package/node_modules/lodash/fp/sortedUniqBy.js +5 -0
  731. package/node_modules/lodash/fp/split.js +5 -0
  732. package/node_modules/lodash/fp/spread.js +5 -0
  733. package/node_modules/lodash/fp/spreadFrom.js +5 -0
  734. package/node_modules/lodash/fp/startCase.js +5 -0
  735. package/node_modules/lodash/fp/startsWith.js +5 -0
  736. package/node_modules/lodash/fp/string.js +2 -0
  737. package/node_modules/lodash/fp/stubArray.js +5 -0
  738. package/node_modules/lodash/fp/stubFalse.js +5 -0
  739. package/node_modules/lodash/fp/stubObject.js +5 -0
  740. package/node_modules/lodash/fp/stubString.js +5 -0
  741. package/node_modules/lodash/fp/stubTrue.js +5 -0
  742. package/node_modules/lodash/fp/subtract.js +5 -0
  743. package/node_modules/lodash/fp/sum.js +5 -0
  744. package/node_modules/lodash/fp/sumBy.js +5 -0
  745. package/node_modules/lodash/fp/symmetricDifference.js +1 -0
  746. package/node_modules/lodash/fp/symmetricDifferenceBy.js +1 -0
  747. package/node_modules/lodash/fp/symmetricDifferenceWith.js +1 -0
  748. package/node_modules/lodash/fp/tail.js +5 -0
  749. package/node_modules/lodash/fp/take.js +5 -0
  750. package/node_modules/lodash/fp/takeLast.js +1 -0
  751. package/node_modules/lodash/fp/takeLastWhile.js +1 -0
  752. package/node_modules/lodash/fp/takeRight.js +5 -0
  753. package/node_modules/lodash/fp/takeRightWhile.js +5 -0
  754. package/node_modules/lodash/fp/takeWhile.js +5 -0
  755. package/node_modules/lodash/fp/tap.js +5 -0
  756. package/node_modules/lodash/fp/template.js +5 -0
  757. package/node_modules/lodash/fp/templateSettings.js +5 -0
  758. package/node_modules/lodash/fp/throttle.js +5 -0
  759. package/node_modules/lodash/fp/thru.js +5 -0
  760. package/node_modules/lodash/fp/times.js +5 -0
  761. package/node_modules/lodash/fp/toArray.js +5 -0
  762. package/node_modules/lodash/fp/toFinite.js +5 -0
  763. package/node_modules/lodash/fp/toInteger.js +5 -0
  764. package/node_modules/lodash/fp/toIterator.js +5 -0
  765. package/node_modules/lodash/fp/toJSON.js +5 -0
  766. package/node_modules/lodash/fp/toLength.js +5 -0
  767. package/node_modules/lodash/fp/toLower.js +5 -0
  768. package/node_modules/lodash/fp/toNumber.js +5 -0
  769. package/node_modules/lodash/fp/toPairs.js +5 -0
  770. package/node_modules/lodash/fp/toPairsIn.js +5 -0
  771. package/node_modules/lodash/fp/toPath.js +5 -0
  772. package/node_modules/lodash/fp/toPlainObject.js +5 -0
  773. package/node_modules/lodash/fp/toSafeInteger.js +5 -0
  774. package/node_modules/lodash/fp/toString.js +5 -0
  775. package/node_modules/lodash/fp/toUpper.js +5 -0
  776. package/node_modules/lodash/fp/transform.js +5 -0
  777. package/node_modules/lodash/fp/trim.js +5 -0
  778. package/node_modules/lodash/fp/trimChars.js +5 -0
  779. package/node_modules/lodash/fp/trimCharsEnd.js +5 -0
  780. package/node_modules/lodash/fp/trimCharsStart.js +5 -0
  781. package/node_modules/lodash/fp/trimEnd.js +5 -0
  782. package/node_modules/lodash/fp/trimStart.js +5 -0
  783. package/node_modules/lodash/fp/truncate.js +5 -0
  784. package/node_modules/lodash/fp/unapply.js +1 -0
  785. package/node_modules/lodash/fp/unary.js +5 -0
  786. package/node_modules/lodash/fp/unescape.js +5 -0
  787. package/node_modules/lodash/fp/union.js +5 -0
  788. package/node_modules/lodash/fp/unionBy.js +5 -0
  789. package/node_modules/lodash/fp/unionWith.js +5 -0
  790. package/node_modules/lodash/fp/uniq.js +5 -0
  791. package/node_modules/lodash/fp/uniqBy.js +5 -0
  792. package/node_modules/lodash/fp/uniqWith.js +5 -0
  793. package/node_modules/lodash/fp/uniqueId.js +5 -0
  794. package/node_modules/lodash/fp/unnest.js +1 -0
  795. package/node_modules/lodash/fp/unset.js +5 -0
  796. package/node_modules/lodash/fp/unzip.js +5 -0
  797. package/node_modules/lodash/fp/unzipWith.js +5 -0
  798. package/node_modules/lodash/fp/update.js +5 -0
  799. package/node_modules/lodash/fp/updateWith.js +5 -0
  800. package/node_modules/lodash/fp/upperCase.js +5 -0
  801. package/node_modules/lodash/fp/upperFirst.js +5 -0
  802. package/node_modules/lodash/fp/useWith.js +1 -0
  803. package/node_modules/lodash/fp/util.js +2 -0
  804. package/node_modules/lodash/fp/value.js +5 -0
  805. package/node_modules/lodash/fp/valueOf.js +5 -0
  806. package/node_modules/lodash/fp/values.js +5 -0
  807. package/node_modules/lodash/fp/valuesIn.js +5 -0
  808. package/node_modules/lodash/fp/where.js +1 -0
  809. package/node_modules/lodash/fp/whereEq.js +1 -0
  810. package/node_modules/lodash/fp/without.js +5 -0
  811. package/node_modules/lodash/fp/words.js +5 -0
  812. package/node_modules/lodash/fp/wrap.js +5 -0
  813. package/node_modules/lodash/fp/wrapperAt.js +5 -0
  814. package/node_modules/lodash/fp/wrapperChain.js +5 -0
  815. package/node_modules/lodash/fp/wrapperLodash.js +5 -0
  816. package/node_modules/lodash/fp/wrapperReverse.js +5 -0
  817. package/node_modules/lodash/fp/wrapperValue.js +5 -0
  818. package/node_modules/lodash/fp/xor.js +5 -0
  819. package/node_modules/lodash/fp/xorBy.js +5 -0
  820. package/node_modules/lodash/fp/xorWith.js +5 -0
  821. package/node_modules/lodash/fp/zip.js +5 -0
  822. package/node_modules/lodash/fp/zipAll.js +5 -0
  823. package/node_modules/lodash/fp/zipObj.js +1 -0
  824. package/node_modules/lodash/fp/zipObject.js +5 -0
  825. package/node_modules/lodash/fp/zipObjectDeep.js +5 -0
  826. package/node_modules/lodash/fp/zipWith.js +5 -0
  827. package/node_modules/lodash/fp.js +2 -0
  828. package/node_modules/lodash/fromPairs.js +28 -0
  829. package/node_modules/lodash/function.js +25 -0
  830. package/node_modules/lodash/functions.js +31 -0
  831. package/node_modules/lodash/functionsIn.js +31 -0
  832. package/node_modules/lodash/get.js +33 -0
  833. package/node_modules/lodash/groupBy.js +41 -0
  834. package/node_modules/lodash/gt.js +29 -0
  835. package/node_modules/lodash/gte.js +30 -0
  836. package/node_modules/lodash/has.js +35 -0
  837. package/node_modules/lodash/hasIn.js +34 -0
  838. package/node_modules/lodash/head.js +23 -0
  839. package/node_modules/lodash/identity.js +21 -0
  840. package/node_modules/lodash/inRange.js +55 -0
  841. package/node_modules/lodash/includes.js +53 -0
  842. package/node_modules/lodash/index.js +1 -0
  843. package/node_modules/lodash/indexOf.js +42 -0
  844. package/node_modules/lodash/initial.js +22 -0
  845. package/node_modules/lodash/intersection.js +30 -0
  846. package/node_modules/lodash/intersectionBy.js +45 -0
  847. package/node_modules/lodash/intersectionWith.js +41 -0
  848. package/node_modules/lodash/invert.js +42 -0
  849. package/node_modules/lodash/invertBy.js +56 -0
  850. package/node_modules/lodash/invoke.js +24 -0
  851. package/node_modules/lodash/invokeMap.js +41 -0
  852. package/node_modules/lodash/isArguments.js +36 -0
  853. package/node_modules/lodash/isArray.js +26 -0
  854. package/node_modules/lodash/isArrayBuffer.js +27 -0
  855. package/node_modules/lodash/isArrayLike.js +33 -0
  856. package/node_modules/lodash/isArrayLikeObject.js +33 -0
  857. package/node_modules/lodash/isBoolean.js +29 -0
  858. package/node_modules/lodash/isBuffer.js +38 -0
  859. package/node_modules/lodash/isDate.js +27 -0
  860. package/node_modules/lodash/isElement.js +25 -0
  861. package/node_modules/lodash/isEmpty.js +77 -0
  862. package/node_modules/lodash/isEqual.js +35 -0
  863. package/node_modules/lodash/isEqualWith.js +41 -0
  864. package/node_modules/lodash/isError.js +36 -0
  865. package/node_modules/lodash/isFinite.js +36 -0
  866. package/node_modules/lodash/isFunction.js +37 -0
  867. package/node_modules/lodash/isInteger.js +33 -0
  868. package/node_modules/lodash/isLength.js +35 -0
  869. package/node_modules/lodash/isMap.js +27 -0
  870. package/node_modules/lodash/isMatch.js +36 -0
  871. package/node_modules/lodash/isMatchWith.js +41 -0
  872. package/node_modules/lodash/isNaN.js +38 -0
  873. package/node_modules/lodash/isNative.js +40 -0
  874. package/node_modules/lodash/isNil.js +25 -0
  875. package/node_modules/lodash/isNull.js +22 -0
  876. package/node_modules/lodash/isNumber.js +38 -0
  877. package/node_modules/lodash/isObject.js +31 -0
  878. package/node_modules/lodash/isObjectLike.js +29 -0
  879. package/node_modules/lodash/isPlainObject.js +62 -0
  880. package/node_modules/lodash/isRegExp.js +27 -0
  881. package/node_modules/lodash/isSafeInteger.js +37 -0
  882. package/node_modules/lodash/isSet.js +27 -0
  883. package/node_modules/lodash/isString.js +30 -0
  884. package/node_modules/lodash/isSymbol.js +29 -0
  885. package/node_modules/lodash/isTypedArray.js +27 -0
  886. package/node_modules/lodash/isUndefined.js +22 -0
  887. package/node_modules/lodash/isWeakMap.js +28 -0
  888. package/node_modules/lodash/isWeakSet.js +28 -0
  889. package/node_modules/lodash/iteratee.js +53 -0
  890. package/node_modules/lodash/join.js +26 -0
  891. package/node_modules/lodash/kebabCase.js +28 -0
  892. package/node_modules/lodash/keyBy.js +36 -0
  893. package/node_modules/lodash/keys.js +37 -0
  894. package/node_modules/lodash/keysIn.js +32 -0
  895. package/node_modules/lodash/lang.js +58 -0
  896. package/node_modules/lodash/last.js +20 -0
  897. package/node_modules/lodash/lastIndexOf.js +46 -0
  898. package/node_modules/lodash/lodash.js +17209 -0
  899. package/node_modules/lodash/lodash.min.js +140 -0
  900. package/node_modules/lodash/lowerCase.js +27 -0
  901. package/node_modules/lodash/lowerFirst.js +22 -0
  902. package/node_modules/lodash/lt.js +29 -0
  903. package/node_modules/lodash/lte.js +30 -0
  904. package/node_modules/lodash/map.js +53 -0
  905. package/node_modules/lodash/mapKeys.js +36 -0
  906. package/node_modules/lodash/mapValues.js +43 -0
  907. package/node_modules/lodash/matches.js +46 -0
  908. package/node_modules/lodash/matchesProperty.js +44 -0
  909. package/node_modules/lodash/math.js +17 -0
  910. package/node_modules/lodash/max.js +29 -0
  911. package/node_modules/lodash/maxBy.js +34 -0
  912. package/node_modules/lodash/mean.js +22 -0
  913. package/node_modules/lodash/meanBy.js +31 -0
  914. package/node_modules/lodash/memoize.js +73 -0
  915. package/node_modules/lodash/merge.js +39 -0
  916. package/node_modules/lodash/mergeWith.js +39 -0
  917. package/node_modules/lodash/method.js +34 -0
  918. package/node_modules/lodash/methodOf.js +33 -0
  919. package/node_modules/lodash/min.js +29 -0
  920. package/node_modules/lodash/minBy.js +34 -0
  921. package/node_modules/lodash/mixin.js +74 -0
  922. package/node_modules/lodash/multiply.js +22 -0
  923. package/node_modules/lodash/negate.js +40 -0
  924. package/node_modules/lodash/next.js +35 -0
  925. package/node_modules/lodash/noop.js +17 -0
  926. package/node_modules/lodash/now.js +23 -0
  927. package/node_modules/lodash/nth.js +29 -0
  928. package/node_modules/lodash/nthArg.js +32 -0
  929. package/node_modules/lodash/number.js +5 -0
  930. package/node_modules/lodash/object.js +49 -0
  931. package/node_modules/lodash/omit.js +57 -0
  932. package/node_modules/lodash/omitBy.js +29 -0
  933. package/node_modules/lodash/once.js +25 -0
  934. package/node_modules/lodash/orderBy.js +47 -0
  935. package/node_modules/lodash/over.js +24 -0
  936. package/node_modules/lodash/overArgs.js +61 -0
  937. package/node_modules/lodash/overEvery.js +34 -0
  938. package/node_modules/lodash/overSome.js +37 -0
  939. package/node_modules/lodash/package.json +17 -0
  940. package/node_modules/lodash/pad.js +49 -0
  941. package/node_modules/lodash/padEnd.js +39 -0
  942. package/node_modules/lodash/padStart.js +39 -0
  943. package/node_modules/lodash/parseInt.js +43 -0
  944. package/node_modules/lodash/partial.js +50 -0
  945. package/node_modules/lodash/partialRight.js +49 -0
  946. package/node_modules/lodash/partition.js +43 -0
  947. package/node_modules/lodash/pick.js +25 -0
  948. package/node_modules/lodash/pickBy.js +37 -0
  949. package/node_modules/lodash/plant.js +48 -0
  950. package/node_modules/lodash/property.js +32 -0
  951. package/node_modules/lodash/propertyOf.js +30 -0
  952. package/node_modules/lodash/pull.js +29 -0
  953. package/node_modules/lodash/pullAll.js +29 -0
  954. package/node_modules/lodash/pullAllBy.js +33 -0
  955. package/node_modules/lodash/pullAllWith.js +32 -0
  956. package/node_modules/lodash/pullAt.js +43 -0
  957. package/node_modules/lodash/random.js +82 -0
  958. package/node_modules/lodash/range.js +46 -0
  959. package/node_modules/lodash/rangeRight.js +41 -0
  960. package/node_modules/lodash/rearg.js +33 -0
  961. package/node_modules/lodash/reduce.js +51 -0
  962. package/node_modules/lodash/reduceRight.js +36 -0
  963. package/node_modules/lodash/reject.js +46 -0
  964. package/node_modules/lodash/release.md +48 -0
  965. package/node_modules/lodash/remove.js +53 -0
  966. package/node_modules/lodash/repeat.js +37 -0
  967. package/node_modules/lodash/replace.js +29 -0
  968. package/node_modules/lodash/rest.js +40 -0
  969. package/node_modules/lodash/result.js +56 -0
  970. package/node_modules/lodash/reverse.js +34 -0
  971. package/node_modules/lodash/round.js +26 -0
  972. package/node_modules/lodash/sample.js +24 -0
  973. package/node_modules/lodash/sampleSize.js +37 -0
  974. package/node_modules/lodash/seq.js +16 -0
  975. package/node_modules/lodash/set.js +35 -0
  976. package/node_modules/lodash/setWith.js +32 -0
  977. package/node_modules/lodash/shuffle.js +25 -0
  978. package/node_modules/lodash/size.js +46 -0
  979. package/node_modules/lodash/slice.js +37 -0
  980. package/node_modules/lodash/snakeCase.js +28 -0
  981. package/node_modules/lodash/some.js +51 -0
  982. package/node_modules/lodash/sortBy.js +48 -0
  983. package/node_modules/lodash/sortedIndex.js +24 -0
  984. package/node_modules/lodash/sortedIndexBy.js +33 -0
  985. package/node_modules/lodash/sortedIndexOf.js +31 -0
  986. package/node_modules/lodash/sortedLastIndex.js +25 -0
  987. package/node_modules/lodash/sortedLastIndexBy.js +33 -0
  988. package/node_modules/lodash/sortedLastIndexOf.js +31 -0
  989. package/node_modules/lodash/sortedUniq.js +24 -0
  990. package/node_modules/lodash/sortedUniqBy.js +26 -0
  991. package/node_modules/lodash/split.js +52 -0
  992. package/node_modules/lodash/spread.js +63 -0
  993. package/node_modules/lodash/startCase.js +29 -0
  994. package/node_modules/lodash/startsWith.js +39 -0
  995. package/node_modules/lodash/string.js +33 -0
  996. package/node_modules/lodash/stubArray.js +23 -0
  997. package/node_modules/lodash/stubFalse.js +18 -0
  998. package/node_modules/lodash/stubObject.js +23 -0
  999. package/node_modules/lodash/stubString.js +18 -0
  1000. package/node_modules/lodash/stubTrue.js +18 -0
  1001. package/node_modules/lodash/subtract.js +22 -0
  1002. package/node_modules/lodash/sum.js +24 -0
  1003. package/node_modules/lodash/sumBy.js +33 -0
  1004. package/node_modules/lodash/tail.js +22 -0
  1005. package/node_modules/lodash/take.js +37 -0
  1006. package/node_modules/lodash/takeRight.js +39 -0
  1007. package/node_modules/lodash/takeRightWhile.js +45 -0
  1008. package/node_modules/lodash/takeWhile.js +45 -0
  1009. package/node_modules/lodash/tap.js +29 -0
  1010. package/node_modules/lodash/template.js +272 -0
  1011. package/node_modules/lodash/templateSettings.js +67 -0
  1012. package/node_modules/lodash/throttle.js +69 -0
  1013. package/node_modules/lodash/thru.js +28 -0
  1014. package/node_modules/lodash/times.js +51 -0
  1015. package/node_modules/lodash/toArray.js +58 -0
  1016. package/node_modules/lodash/toFinite.js +42 -0
  1017. package/node_modules/lodash/toInteger.js +36 -0
  1018. package/node_modules/lodash/toIterator.js +23 -0
  1019. package/node_modules/lodash/toJSON.js +1 -0
  1020. package/node_modules/lodash/toLength.js +38 -0
  1021. package/node_modules/lodash/toLower.js +28 -0
  1022. package/node_modules/lodash/toNumber.js +64 -0
  1023. package/node_modules/lodash/toPairs.js +30 -0
  1024. package/node_modules/lodash/toPairsIn.js +30 -0
  1025. package/node_modules/lodash/toPath.js +33 -0
  1026. package/node_modules/lodash/toPlainObject.js +32 -0
  1027. package/node_modules/lodash/toSafeInteger.js +37 -0
  1028. package/node_modules/lodash/toString.js +28 -0
  1029. package/node_modules/lodash/toUpper.js +28 -0
  1030. package/node_modules/lodash/transform.js +65 -0
  1031. package/node_modules/lodash/trim.js +47 -0
  1032. package/node_modules/lodash/trimEnd.js +41 -0
  1033. package/node_modules/lodash/trimStart.js +43 -0
  1034. package/node_modules/lodash/truncate.js +111 -0
  1035. package/node_modules/lodash/unary.js +22 -0
  1036. package/node_modules/lodash/unescape.js +34 -0
  1037. package/node_modules/lodash/union.js +26 -0
  1038. package/node_modules/lodash/unionBy.js +39 -0
  1039. package/node_modules/lodash/unionWith.js +34 -0
  1040. package/node_modules/lodash/uniq.js +25 -0
  1041. package/node_modules/lodash/uniqBy.js +31 -0
  1042. package/node_modules/lodash/uniqWith.js +28 -0
  1043. package/node_modules/lodash/uniqueId.js +28 -0
  1044. package/node_modules/lodash/unset.js +34 -0
  1045. package/node_modules/lodash/unzip.js +45 -0
  1046. package/node_modules/lodash/unzipWith.js +39 -0
  1047. package/node_modules/lodash/update.js +35 -0
  1048. package/node_modules/lodash/updateWith.js +33 -0
  1049. package/node_modules/lodash/upperCase.js +27 -0
  1050. package/node_modules/lodash/upperFirst.js +22 -0
  1051. package/node_modules/lodash/util.js +34 -0
  1052. package/node_modules/lodash/value.js +1 -0
  1053. package/node_modules/lodash/valueOf.js +1 -0
  1054. package/node_modules/lodash/values.js +34 -0
  1055. package/node_modules/lodash/valuesIn.js +32 -0
  1056. package/node_modules/lodash/without.js +31 -0
  1057. package/node_modules/lodash/words.js +35 -0
  1058. package/node_modules/lodash/wrap.js +30 -0
  1059. package/node_modules/lodash/wrapperAt.js +48 -0
  1060. package/node_modules/lodash/wrapperChain.js +34 -0
  1061. package/node_modules/lodash/wrapperLodash.js +147 -0
  1062. package/node_modules/lodash/wrapperReverse.js +44 -0
  1063. package/node_modules/lodash/wrapperValue.js +21 -0
  1064. package/node_modules/lodash/xor.js +28 -0
  1065. package/node_modules/lodash/xorBy.js +39 -0
  1066. package/node_modules/lodash/xorWith.js +34 -0
  1067. package/node_modules/lodash/zip.js +22 -0
  1068. package/node_modules/lodash/zipObject.js +24 -0
  1069. package/node_modules/lodash/zipObjectDeep.js +23 -0
  1070. package/node_modules/lodash/zipWith.js +32 -0
  1071. package/package.json +93 -0
@@ -0,0 +1,295 @@
1
+ /*!
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ "use strict";
7
+ var _a;
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.GlueJobL3Construct = void 0;
10
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
11
+
12
+ const dataops_project_l3_construct_1 = require("@aws-mdaa/dataops-project-l3-construct");
13
+ const eventbridge_helper_1 = require("@aws-mdaa/eventbridge-helper");
14
+ const glue_constructs_1 = require("@aws-mdaa/glue-constructs");
15
+ const iam_constructs_1 = require("@aws-mdaa/iam-constructs");
16
+ const s3_constructs_1 = require("@aws-mdaa/s3-constructs");
17
+ const l3_construct_1 = require("@aws-mdaa/l3-construct");
18
+ const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
19
+ const construct_1 = require("@aws-mdaa/construct"); //NOSONAR
20
+ const path = require("path");
21
+ const aws_events_targets_1 = require("aws-cdk-lib/aws-events-targets");
22
+ const sns_constructs_1 = require("@aws-mdaa/sns-constructs");
23
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
24
+ const aws_logs_1 = require("aws-cdk-lib/aws-logs");
25
+ const cloudwatch_constructs_1 = require("@aws-mdaa/cloudwatch-constructs");
26
+ const aws_kms_1 = require("aws-cdk-lib/aws-kms");
27
+ const utils_1 = require("@aws-mdaa/cloudwatch-constructs/lib/utils");
28
+ class GlueJobL3Construct extends l3_construct_1.MdaaL3Construct {
29
+ constructor(scope, id, props) {
30
+ super(scope, id, props);
31
+ this.props = props;
32
+ if (!this.props.deploymentRoleArn) {
33
+ throw new Error('Deployment role ARN is required for job configuration');
34
+ }
35
+ const deploymentRole = iam_constructs_1.MdaaRole.fromRoleArn(this.scope, `deployment-role`, this.props.deploymentRoleArn);
36
+ if (!this.props.projectBucketName) {
37
+ throw new Error('Project bucket name is required for job configuration');
38
+ }
39
+ const projectBucket = s3_constructs_1.MdaaBucket.fromBucketName(this.scope, `project-bucket`, this.props.projectBucketName);
40
+ if (!this.props.projectKMSArn) {
41
+ throw new Error('Project KMS Key is required for job configuration');
42
+ }
43
+ this.projectKmsKey = aws_kms_1.Key.fromKeyArn(this, this.props.projectName, this.props.projectKMSArn);
44
+ // Build our jobs!
45
+ const allJobs = this.props.jobConfigs;
46
+ Object.keys(allJobs).forEach(jobName => {
47
+ const jobConfig = allJobs[jobName];
48
+ this.createJob(jobName, jobConfig, deploymentRole, projectBucket);
49
+ });
50
+ //CDK S3 Deployment automatically adds inline policy to project deployment role.
51
+ this.scope.node.children.forEach(child => {
52
+ if (child.node.id.startsWith('deployment-role')) {
53
+ construct_1.MdaaNagSuppressions.addCodeResourceSuppressions(child, [
54
+ { id: 'AwsSolutions-IAM5', reason: 'Inline policy used only for deployment.' },
55
+ { id: 'NIST.800.53.R5-IAMNoInlinePolicy', reason: 'Policy used only for deployment.' },
56
+ { id: 'HIPAA.Security-IAMNoInlinePolicy', reason: 'Policy used only for deployment.' },
57
+ { id: 'PCI.DSS.321-IAMNoInlinePolicy', reason: 'Policy used only for deployment.' },
58
+ ], true);
59
+ }
60
+ });
61
+ }
62
+ deployAdditionalFiles(additionalFilesSources, projectBucket, deploymentRole, deploymentId, deploymentPath, extract) {
63
+ // Deploy Source asset(s) to /deployment/libs/<job> location.
64
+ return new aws_s3_deployment_1.BucketDeployment(this.scope, deploymentId, {
65
+ sources: additionalFilesSources,
66
+ destinationBucket: projectBucket,
67
+ destinationKeyPrefix: deploymentPath,
68
+ role: deploymentRole,
69
+ extract: extract,
70
+ });
71
+ }
72
+ addAdditionalScripts(jobName, jobConfig, projectBucket, deploymentRole, defaultArguments) {
73
+ if (jobConfig.additionalScripts) {
74
+ /**
75
+ * Group all files at parent directory level. This will allow creating zip lib assests at various directory levels
76
+ * ex. '/main/script1.py' , '/util/script2.py' , '/util/script3.py' will create 2 zip files representing 'main' and 'utils'
77
+ * */
78
+ const directoryToFile = {};
79
+ jobConfig.additionalScripts.forEach(fileLocation => {
80
+ const filePath = path.dirname(fileLocation.trim());
81
+ if (filePath in directoryToFile) {
82
+ directoryToFile[filePath].push(`!${path.basename(fileLocation.trim())}`);
83
+ }
84
+ else {
85
+ directoryToFile[filePath] = [`!${path.basename(fileLocation.trim())}`];
86
+ }
87
+ });
88
+ // Create Source asset for each directory
89
+ const additionalFilesSources = Object.entries(directoryToFile).map(([filePath, fileNames]) => {
90
+ return aws_s3_deployment_1.Source.asset(filePath, { exclude: ['**', ...fileNames] });
91
+ });
92
+ const deploymentPath = `deployment/libs/${jobName}`;
93
+ const additionalFileDeployment = this.deployAdditionalFiles(additionalFilesSources, projectBucket, deploymentRole, deploymentPath, `job-deployment-${jobName}-additional-script`, false);
94
+ // Extract zip name(s) for each source and create comma separated list of s3 locations
95
+ const libraryZipNames = [];
96
+ for (let i = 0; i < additionalFilesSources.length; i++) {
97
+ const libName = aws_cdk_lib_1.Fn.select(i, additionalFileDeployment.objectKeys); // Extract file name of zip containing additional scripts
98
+ libraryZipNames.push(`s3://${additionalFileDeployment.deployedBucket.bucketName}/${deploymentPath}/${libName}`);
99
+ }
100
+ // Add comma separated list of zip file names to default arguments.
101
+ if (defaultArguments['--extra-py-files']) {
102
+ defaultArguments['--extra-py-files'] += ',' + libraryZipNames.join(',');
103
+ }
104
+ else {
105
+ defaultArguments['--extra-py-files'] = libraryZipNames.join(',');
106
+ }
107
+ }
108
+ }
109
+ addAdditionalJars(jobName, jobConfig, projectBucket, deploymentRole, defaultArguments) {
110
+ if (jobConfig.additionalJars) {
111
+ // Create Source asset for each directory
112
+ const additionalFilesSources = jobConfig.additionalJars.map(fullFileName => {
113
+ const filePath = path.dirname(fullFileName.trim());
114
+ const fileName = path.basename(fullFileName.trim());
115
+ return aws_s3_deployment_1.Source.asset(filePath, { exclude: ['**', `!${fileName}`] });
116
+ });
117
+ const deploymentPath = `deployment/libs/${jobName}`;
118
+ const additionalFileDeployment = this.deployAdditionalFiles(additionalFilesSources, projectBucket, deploymentRole, `job-deployment-${jobName}-additional-jar`, deploymentPath, true);
119
+ const extraJarNames = jobConfig.additionalJars.map(fullFileName => {
120
+ const fileName = path.basename(fullFileName.trim());
121
+ return `s3://${additionalFileDeployment.deployedBucket.bucketName}/${deploymentPath}/${fileName}`;
122
+ });
123
+ // Add comma separated list of zip file names to default arguments.
124
+ if (defaultArguments['--extra-jars']) {
125
+ defaultArguments['--extra-jars'] += ',' + extraJarNames.join(',');
126
+ }
127
+ else {
128
+ defaultArguments['--extra-jars'] = extraJarNames.join(',');
129
+ }
130
+ }
131
+ }
132
+ addAdditionalFiles(jobName, jobConfig, projectBucket, deploymentRole, defaultArguments) {
133
+ if (jobConfig.additionalFiles) {
134
+ // Create Source asset for each directory
135
+ const additionalFilesSources = jobConfig.additionalFiles.map(fullFileName => {
136
+ const filePath = path.dirname(fullFileName.trim());
137
+ const fileName = path.basename(fullFileName.trim());
138
+ return aws_s3_deployment_1.Source.asset(filePath, { exclude: ['**', `!${fileName}`] });
139
+ });
140
+ const deploymentPath = `deployment/files/${jobName}`;
141
+ const additionalFileDeployment = this.deployAdditionalFiles(additionalFilesSources, projectBucket, deploymentRole, `job-deployment-${jobName}-additional-file`, deploymentPath, true);
142
+ const extraFileNames = jobConfig.additionalFiles.map(fullFileName => {
143
+ const fileName = path.basename(fullFileName.trim());
144
+ return `s3://${additionalFileDeployment.deployedBucket.bucketName}/${deploymentPath}/${fileName}`;
145
+ });
146
+ // Add comma separated list of zip file names to default arguments.
147
+ if (defaultArguments['--extra-files']) {
148
+ defaultArguments['--extra-files'] += ',' + extraFileNames.join(',');
149
+ }
150
+ else {
151
+ defaultArguments['--extra-files'] = extraFileNames.join(',');
152
+ }
153
+ }
154
+ }
155
+ createJob(jobName, jobConfig, deploymentRole, projectBucket) {
156
+ const defaultArguments = jobConfig.defaultArguments ? jobConfig.defaultArguments : {};
157
+ const scriptPath = path.dirname(jobConfig.command.scriptLocation.trim());
158
+ const scriptName = path.basename(jobConfig.command.scriptLocation.trim());
159
+ const scriptSource = aws_s3_deployment_1.Source.asset(scriptPath, { exclude: ['**', `!${scriptName}`] });
160
+ const scriptDeploymentPath = `deployment/jobs/${jobName}`;
161
+ const scriptDeployment = new aws_s3_deployment_1.BucketDeployment(this.scope, `job-deployment-${jobName}`, {
162
+ sources: [scriptSource],
163
+ destinationBucket: projectBucket,
164
+ destinationKeyPrefix: scriptDeploymentPath,
165
+ role: deploymentRole,
166
+ extract: true,
167
+ });
168
+ this.addAdditionalScripts(jobName, jobConfig, projectBucket, deploymentRole, defaultArguments);
169
+ this.addAdditionalJars(jobName, jobConfig, projectBucket, deploymentRole, defaultArguments);
170
+ this.addAdditionalFiles(jobName, jobConfig, projectBucket, deploymentRole, defaultArguments);
171
+ construct_1.MdaaNagSuppressions.addCodeResourceSuppressions(this.scope, [
172
+ { id: 'AwsSolutions-L1', reason: 'Function is used only as custom resource during CDK deployment.' },
173
+ {
174
+ id: 'NIST.800.53.R5-LambdaConcurrency',
175
+ reason: 'Function is used only as custom resource during CDK deployment.',
176
+ },
177
+ {
178
+ id: 'NIST.800.53.R5-LambdaInsideVPC',
179
+ reason: 'Function is used only as custom resource during CDK deployment and interacts only with S3.',
180
+ },
181
+ {
182
+ id: 'NIST.800.53.R5-LambdaDLQ',
183
+ reason: 'Function is used only as custom resource during CDK deployment. Errors will be handled by CloudFormation.',
184
+ },
185
+ {
186
+ id: 'HIPAA.Security-LambdaConcurrency',
187
+ reason: 'Function is used only as custom resource during CDK deployment.',
188
+ },
189
+ {
190
+ id: 'PCI.DSS.321-LambdaConcurrency',
191
+ reason: 'Function is used only as custom resource during CDK deployment.',
192
+ },
193
+ {
194
+ id: 'HIPAA.Security-LambdaInsideVPC',
195
+ reason: 'Function is used only as custom resource during CDK deployment and interacts only with S3.',
196
+ },
197
+ {
198
+ id: 'PCI.DSS.321-LambdaInsideVPC',
199
+ reason: 'Function is used only as custom resource during CDK deployment and interacts only with S3.',
200
+ },
201
+ {
202
+ id: 'HIPAA.Security-LambdaDLQ',
203
+ reason: 'Function is used only as custom resource during CDK deployment. Errors will be handled by CloudFormation.',
204
+ },
205
+ {
206
+ id: 'PCI.DSS.321-LambdaDLQ',
207
+ reason: 'Function is used only as custom resource during CDK deployment. Errors will be handled by CloudFormation.',
208
+ },
209
+ ], true);
210
+ // Connections will require an array of references where they are defined
211
+ let connectionsConfigured;
212
+ if (jobConfig.connections) {
213
+ connectionsConfigured = {
214
+ connections: jobConfig.connections,
215
+ };
216
+ }
217
+ defaultArguments['--TempDir'] = `s3://${this.props.projectBucketName}/temp/jobs/${jobName}`;
218
+ // add continuous logging unless explicitly disabled
219
+ if (jobConfig.continuousLogging) {
220
+ const logGroupName = jobName;
221
+ const logGroupNamePathPrefix = '/aws/glue';
222
+ defaultArguments['--continuous-log-logGroup'] = this.createLogGroup(logGroupNamePathPrefix, logGroupName, jobConfig.continuousLogging);
223
+ }
224
+ else {
225
+ console.log(`Continuous logging not enabled for job: ${jobName}`);
226
+ }
227
+ const inputParams = defaultArguments['--input_params'];
228
+ if (inputParams) {
229
+ defaultArguments['--input_params'] = JSON.stringify(inputParams);
230
+ }
231
+ if (!this.props.securityConfigurationName) {
232
+ throw new Error('Security configuration name is required for job monitoring event rule');
233
+ }
234
+ const job = new glue_constructs_1.MdaaCfnJob(this.scope, `${jobName}-job`, {
235
+ command: {
236
+ name: jobConfig.command.name,
237
+ pythonVersion: jobConfig.command.pythonVersion,
238
+ scriptLocation: `s3://${scriptDeployment.deployedBucket.bucketName}/${scriptDeploymentPath}/${scriptName}`,
239
+ },
240
+ role: jobConfig.executionRoleArn,
241
+ allocatedCapacity: jobConfig.allocatedCapacity,
242
+ connections: connectionsConfigured,
243
+ defaultArguments: defaultArguments,
244
+ description: jobConfig.description,
245
+ executionProperty: jobConfig.executionProperty,
246
+ glueVersion: jobConfig.glueVersion,
247
+ maxCapacity: jobConfig.maxCapacity,
248
+ maxRetries: jobConfig.maxRetries,
249
+ name: jobName,
250
+ notificationProperty: jobConfig.notificationProperty,
251
+ numberOfWorkers: jobConfig.numberOfWorkers,
252
+ securityConfiguration: this.props.securityConfigurationName,
253
+ timeout: jobConfig.timeout,
254
+ workerType: jobConfig.workerType,
255
+ naming: this.props.naming,
256
+ });
257
+ if (job.name) {
258
+ dataops_project_l3_construct_1.DataOpsProjectUtils.createProjectSSMParam(this.scope, this.props.naming, this.props.projectName, `job/name/${jobName}`, job.name);
259
+ const eventRule = this.createJobMonitoringEventRule(`${jobName}-monitor`, [job.name]);
260
+ if (!this.props.notificationTopicArn) {
261
+ throw new Error('Notification topic ARN is required for job monitoring event rule');
262
+ }
263
+ eventRule.addTarget(new aws_events_targets_1.SnsTopic(sns_constructs_1.MdaaSnsTopic.fromTopicArn(this.scope, `${jobName}-topic`, this.props.notificationTopicArn)));
264
+ }
265
+ }
266
+ createJobMonitoringEventRule(ruleName, jobNames) {
267
+ return eventbridge_helper_1.EventBridgeHelper.createGlueMonitoringEventRule(this.scope, this.props.naming, ruleName, 'Workflow Job failure events', {
268
+ jobName: jobNames,
269
+ state: ['FAILED', 'TIMEOUT', 'STOPPED'],
270
+ });
271
+ }
272
+ createLogGroup(logGroupNamePathPrefix, logGroupName, loggingConfig) {
273
+ let logGroupRetentionDays;
274
+ if (loggingConfig.logGroupRetentionDays != 0) {
275
+ logGroupRetentionDays = loggingConfig.logGroupRetentionDays;
276
+ }
277
+ else {
278
+ logGroupRetentionDays = aws_logs_1.RetentionDays.INFINITE;
279
+ }
280
+ const logProps = {
281
+ naming: this.props.naming,
282
+ logGroupName: logGroupName,
283
+ logGroupNamePathPrefix: logGroupNamePathPrefix,
284
+ encryptionKey: this.projectKmsKey,
285
+ retention: logGroupRetentionDays,
286
+ };
287
+ new cloudwatch_constructs_1.MdaaLogGroup(this, logGroupName, logProps);
288
+ // `updateProps` always returns a prop with a logGroupName
289
+ return (0, utils_1.updateProps)(logProps).logGroupName;
290
+ }
291
+ }
292
+ exports.GlueJobL3Construct = GlueJobL3Construct;
293
+ _a = JSII_RTTI_SYMBOL_1;
294
+ GlueJobL3Construct[_a] = { fqn: "@aws-mdaa/dataops-job-l3-construct.GlueJobL3Construct", version: "1.2.0" };
295
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YW9wcy1qb2ItbDMtY29uc3RydWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGF0YW9wcy1qb2ItbDMtY29uc3RydWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7OztHQUdHO0FBRUgseUZBQTZFO0FBQzdFLHFFQUFpRTtBQUNqRSwrREFBdUQ7QUFDdkQsNkRBQW9EO0FBQ3BELDJEQUFxRDtBQUNyRCx5REFBK0U7QUFFL0UscUVBQWtGO0FBQ2xGLG1EQUEwRCxDQUFDLFNBQVM7QUFFcEUsNkJBQTZCO0FBQzdCLHVFQUEwRDtBQUMxRCw2REFBd0Q7QUFFeEQsNkNBQWlDO0FBRWpDLG1EQUFxRDtBQUNyRCwyRUFBK0Q7QUFDL0QsaURBQWdEO0FBQ2hELHFFQUF3RTtBQThVeEUsTUFBYSxrQkFBbUIsU0FBUSw4QkFBZTtJQUlyRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRW5CLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1FBQzNFLENBQUM7UUFDRCxNQUFNLGNBQWMsR0FBRyx5QkFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN6RyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsTUFBTSxhQUFhLEdBQUcsMEJBQVUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUss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LElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUNqQixRQUFRLEVBQ1IsNkJBQTZCLEVBQzdCO1lBQ0UsT0FBTyxFQUFFLFFBQVE7WUFDakIsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUM7U0FDeEMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLGNBQWMsQ0FBQyxzQkFBOEIsRUFBRSxZQUFvQixFQUFFLGFBQTRCO1FBQ3ZHLElBQUkscUJBQW9DLENBQUM7UUFFekMsSUFBSSxhQUFhLENBQUMscUJBQXFCLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0MscUJBQXFCLEdBQUcsYUFBYSxDQUFDLHFCQUFxQixDQUFDO1FBQzlELENBQUM7YUFBTSxDQUFDO1lBQ04scUJBQXFCLEdBQUcsd0JBQWEsQ0FBQyxRQUFRLENBQUM7UUFDakQsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHO1lBQ2YsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtZQUN6QixZQUFZLEVBQUUsWUFBWTtZQUMxQixzQkFBc0IsRUFBRSxzQkFBc0I7WUFDOUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLFNBQVMsRUFBRSxxQkFBcUI7U0FDakMsQ0FBQztRQUNGLElBQUksb0NBQVksQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9DLDBEQUEwRDtRQUMxRCxPQUFPLElBQUEsbUJBQVcsRUFBQyxRQUFRLENBQUMsQ0FBQyxZQUFhLENBQUM7SUFDN0MsQ0FBQzs7QUF2V0gsZ0RBd1dDIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuaW1wb3J0IHsgRGF0YU9wc1Byb2plY3RVdGlscyB9IGZyb20gJ0Bhd3MtbWRhYS9kYXRhb3BzLXByb2plY3QtbDMtY29uc3RydWN0JztcbmltcG9ydCB7IEV2ZW50QnJpZGdlSGVscGVyIH0gZnJvbSAnQGF3cy1tZGFhL2V2ZW50YnJpZGdlLWhlbHBlcic7XG5pbXBvcnQgeyBNZGFhQ2ZuSm9iIH0gZnJvbSAnQGF3cy1tZGFhL2dsdWUtY29uc3RydWN0cyc7XG5pbXBvcnQgeyBNZGFhUm9sZSB9IGZyb20gJ0Bhd3MtbWRhYS9pYW0tY29uc3RydWN0cyc7XG5pbXBvcnQgeyBNZGFhQnVja2V0IH0gZnJvbSAnQGF3cy1tZGFhL3MzLWNvbnN0cnVjdHMnO1xuaW1wb3J0IHsgTWRhYUwzQ29uc3RydWN0LCBNZGFhTDNDb25zdHJ1Y3RQcm9wcyB9IGZyb20gJ0Bhd3MtbWRhYS9sMy1jb25zdHJ1Y3QnO1xuaW1wb3J0IHsgQ2ZuSm9iIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWdsdWUnO1xuaW1wb3J0IHsgQnVja2V0RGVwbG95bWVudCwgSVNvdXJjZSwgU291cmNlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWRlcGxveW1lbnQnO1xuaW1wb3J0IHsgTWRhYU5hZ1N1cHByZXNzaW9ucyB9IGZyb20gJ0Bhd3MtbWRhYS9jb25zdHJ1Y3QnOyAvL05PU09OQVJcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFNuc1RvcGljIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzJztcbmltcG9ydCB7IE1kYWFTbnNUb3BpYyB9IGZyb20gJ0Bhd3MtbWRhYS9zbnMtY29uc3RydWN0cyc7XG5pbXBvcnQgeyBSdWxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgeyBGbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FbGVtZW50IH0gZnJvbSAnQGF3cy1tZGFhL2NvbmZpZyc7XG5pbXBvcnQgeyBSZXRlbnRpb25EYXlzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHsgTWRhYUxvZ0dyb3VwIH0gZnJvbSAnQGF3cy1tZGFhL2Nsb3Vkd2F0Y2gtY29uc3RydWN0cyc7XG5pbXBvcnQgeyBJS2V5LCBLZXkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7IHVwZGF0ZVByb3BzIH0gZnJvbSAnQGF3cy1tZGFhL2Nsb3Vkd2F0Y2gtY29uc3RydWN0cy9saWIvdXRpbHMnO1xuaW1wb3J0IHsgSUJ1Y2tldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgeyBJUm9sZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuXG5leHBvcnQgdHlwZSBKb2JDb21tYW5kUHl0aG9uVmVyc2lvbiA9ICcyJyB8ICczJyB8IHVuZGVmaW5lZDtcbmV4cG9ydCB0eXBlIEpvYkNvbW1hbmROYW1lID0gJ2dsdWVldGwnIHwgJ3B5dGhvbnNoZWxsJztcblxuLyoqXG4gKiBRLUVOSEFOQ0VELUlOVEVSRkFDRVxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIEdsdWUgam9iIGxvZ2dpbmcgd2l0aCBDbG91ZFdhdGNoIGxvZyByZXRlbnRpb24gbWFuYWdlbWVudCBhbmQgY29tcGxpYW5jZSByZXF1aXJlbWVudHMuIERlZmluZXMgbG9nIHJldGVudGlvbiBzZXR0aW5ncyBmb3IgR2x1ZSBqb2IgZXhlY3V0aW9uIGxvZ3MgZW5zdXJpbmcgcHJvcGVyIGxvZyBtYW5hZ2VtZW50LCBjb21wbGlhbmNlLCBhbmQgY29zdCBvcHRpbWl6YXRpb24gZm9yIERhdGFPcHMgam9iIG1vbml0b3JpbmcgYW5kIGF1ZGl0IHRyYWlscy5cbiAqXG4gKiBVc2UgY2FzZXM6IExvZyByZXRlbnRpb24gbWFuYWdlbWVudDsgQ29tcGxpYW5jZSByZXF1aXJlbWVudHM7IENvc3Qgb3B0aW1pemF0aW9uOyBBdWRpdCB0cmFpbCBtYW5hZ2VtZW50XG4gKlxuICogQVdTOiBDbG91ZFdhdGNoIGxvZyBncm91cCByZXRlbnRpb24gZm9yIEdsdWUgam9iIGV4ZWN1dGlvbiBsb2dzIGFuZCBtb25pdG9yaW5nXG4gKlxuICogVmFsaWRhdGlvbjogbG9nR3JvdXBSZXRlbnRpb25EYXlzIGlzIHJlcXVpcmVkIHdpdGggc3BlY2lmaWMgYWxsb3dlZCB2YWx1ZXMgZm9yIHJldGVudGlvbiBwZXJpb2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dnaW5nQ29uZmlnIHtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogUmVxdWlyZWQgQ2xvdWRXYXRjaCBsb2cgZ3JvdXAgcmV0ZW50aW9uIHBlcmlvZCBpbiBkYXlzIGZvciBHbHVlIGpvYiBsb2cgbWFuYWdlbWVudCBhbmQgY29tcGxpYW5jZSByZXF1aXJlbWVudHMuIERlZmluZXMgaG93IGxvbmcgam9iIGV4ZWN1dGlvbiBsb2dzIGFyZSByZXRhaW5lZCBpbiBDbG91ZFdhdGNoIHdpdGggc3BlY2lmaWMgYWxsb3dlZCB2YWx1ZXMgZm9yIGxvZyByZXRlbnRpb24sIGNvbXBsaWFuY2UgbWFuYWdlbWVudCwgYW5kIHN0b3JhZ2UgY29zdCBvcHRpbWl6YXRpb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogTG9nIHJldGVudGlvbiBtYW5hZ2VtZW50OyBDb21wbGlhbmNlIHJlcXVpcmVtZW50czsgU3RvcmFnZSBjb3N0IG9wdGltaXphdGlvbjsgQXVkaXQgdHJhaWwgbWFuYWdlbWVudFxuICAgKlxuICAgKiBBV1M6IENsb3VkV2F0Y2ggbG9nIGdyb3VwIHJldGVudGlvbiBmb3IgR2x1ZSBqb2IgZXhlY3V0aW9uIGxvZ3MgYW5kIGF1ZGl0IHRyYWlsIG1hbmFnZW1lbnRcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSAxLDMsNSw3LDE0LDMwLDYwLDkwLDEyMCwxNTAsMTgwLDM2NSw0MDAsNTQ1LDczMSwxODI3LDM2NTMsIG9yIDA7IHJlcXVpcmVkIGZvciBsb2cgcmV0ZW50aW9uIGNvbmZpZ3VyYXRpb25cbiAgICoqL1xuICByZWFkb25seSBsb2dHcm91cFJldGVudGlvbkRheXM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBRLUVOSEFOQ0VELUlOVEVSRkFDRVxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIEdsdWUgam9iIGNvbW1hbmQgc3BlY2lmaWNhdGlvbiB3aXRoIHNjcmlwdCBleGVjdXRpb24gYW5kIHJ1bnRpbWUgZW52aXJvbm1lbnQgc2V0dGluZ3MuIERlZmluZXMgam9iIGNvbW1hbmQgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgam9iIHR5cGUsIFB5dGhvbiB2ZXJzaW9uLCBhbmQgc2NyaXB0IGxvY2F0aW9uIGZvciBHbHVlIEVUTCBhbmQgUHl0aG9uIHNoZWxsIGpvYiBleGVjdXRpb24gd2l0aGluIERhdGFPcHMgd29ya2Zsb3dzLlxuICpcbiAqIFVzZSBjYXNlczogSm9iIGNvbW1hbmQgY29uZmlndXJhdGlvbjsgU2NyaXB0IGV4ZWN1dGlvbjsgUnVudGltZSBlbnZpcm9ubWVudDsgRVRMIGpvYiBzZXR1cFxuICpcbiAqIEFXUzogR2x1ZSBqb2IgY29tbWFuZCBjb25maWd1cmF0aW9uIGZvciBzY3JpcHQgZXhlY3V0aW9uIGFuZCBydW50aW1lIGVudmlyb25tZW50XG4gKlxuICogVmFsaWRhdGlvbjogbmFtZSBhbmQgc2NyaXB0TG9jYXRpb24gYXJlIHJlcXVpcmVkOyBweXRob25WZXJzaW9uIGlzIG9wdGlvbmFsIHdpdGggc3BlY2lmaWMgY29uc3RyYWludHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2JDb21tYW5kIHtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogUmVxdWlyZWQgam9iIGNvbW1hbmQgbmFtZSBzcGVjaWZpY2F0aW9uIGNvbnRyb2xsaW5nIEdsdWUgam9iIGV4ZWN1dGlvbiB0eXBlIGFuZCBydW50aW1lIGVudmlyb25tZW50LiBEZWZpbmVzIHdoZXRoZXIgdG8gdXNlIGdsdWVldGwgZm9yIEVUTCBqb2JzIHdpdGggU3BhcmsgcnVudGltZSBvciBweXRob25zaGVsbCBmb3IgUHl0aG9uIHNjcmlwdCBleGVjdXRpb24gd2l0aCBkaWZmZXJlbnQgcmVzb3VyY2UgYWxsb2NhdGlvbiBhbmQgY2FwYWJpbGl0aWVzLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEpvYiB0eXBlIHNlbGVjdGlvbjsgUnVudGltZSBlbnZpcm9ubWVudDsgRXhlY3V0aW9uIG1vZGVsOyBSZXNvdXJjZSBhbGxvY2F0aW9uXG4gICAqXG4gICAqIEFXUzogR2x1ZSBqb2IgY29tbWFuZCBuYW1lIGZvciBleGVjdXRpb24gdHlwZSBhbmQgcnVudGltZSBlbnZpcm9ubWVudCBzZWxlY3Rpb25cbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBnbHVlZXRsIG9yIHB5dGhvbnNoZWxsOyByZXF1aXJlZCBmb3Igam9iIGNvbW1hbmQgdHlwZSBhbmQgZXhlY3V0aW9uIGVudmlyb25tZW50XG4gICAqICAgKiovXG4gIHJlYWRvbmx5IG5hbWU6IEpvYkNvbW1hbmROYW1lO1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBPcHRpb25hbCBQeXRob24gdmVyc2lvbiBzcGVjaWZpY2F0aW9uIGZvciBHbHVlIGpvYiBydW50aW1lIGVudmlyb25tZW50IGVuYWJsaW5nIHZlcnNpb24tc3BlY2lmaWMgc2NyaXB0IGV4ZWN1dGlvbiBhbmQgY29tcGF0aWJpbGl0eS4gV2hlbiBzcGVjaWZpZWQsIGNvbnRyb2xzIHRoZSBQeXRob24gcnVudGltZSB2ZXJzaW9uIGZvciBqb2IgZXhlY3V0aW9uIGVuc3VyaW5nIHNjcmlwdCBjb21wYXRpYmlsaXR5IGFuZCBmZWF0dXJlIGF2YWlsYWJpbGl0eS5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBQeXRob24gdmVyc2lvbiBjb250cm9sOyBSdW50aW1lIGNvbXBhdGliaWxpdHk7IFNjcmlwdCBleGVjdXRpb247IFZlcnNpb24gbWFuYWdlbWVudFxuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIFB5dGhvbiB2ZXJzaW9uIGZvciBydW50aW1lIGVudmlyb25tZW50IGFuZCBzY3JpcHQgY29tcGF0aWJpbGl0eVxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIDIgb3IgMyBpZiBwcm92aWRlZDsgY29udHJvbHMgUHl0aG9uIHJ1bnRpbWUgdmVyc2lvbiBmb3Igam9iIGV4ZWN1dGlvblxuICAgKiAgICoqL1xuICByZWFkb25seSBweXRob25WZXJzaW9uPzogSm9iQ29tbWFuZFB5dGhvblZlcnNpb247XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIFJlcXVpcmVkIHJlbGF0aXZlIHBhdGggdG8gR2x1ZSBzY3JpcHQgZm9yIGpvYiBleGVjdXRpb24gZW5hYmxpbmcgc2NyaXB0IGxvY2F0aW9uIHNwZWNpZmljYXRpb24gYW5kIGNvZGUgZGVwbG95bWVudC4gUHJvdmlkZXMgdGhlIFMzIHBhdGggb3IgcmVsYXRpdmUgbG9jYXRpb24gb2YgdGhlIEdsdWUgc2NyaXB0IHRoYXQgd2lsbCBiZSBleGVjdXRlZCBieSB0aGUgam9iIGZvciBFVEwgcHJvY2Vzc2luZyBhbmQgZGF0YSB0cmFuc2Zvcm1hdGlvbi5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBTY3JpcHQgbG9jYXRpb247IENvZGUgZGVwbG95bWVudDsgSm9iIGV4ZWN1dGlvbjsgRVRMIHByb2Nlc3NpbmdcbiAgICpcbiAgICogQVdTOiBHbHVlIGpvYiBzY3JpcHQgbG9jYXRpb24gZm9yIGNvZGUgZXhlY3V0aW9uIGFuZCBFVEwgcHJvY2Vzc2luZ1xuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIHZhbGlkIHNjcmlwdCBwYXRoOyByZXF1aXJlZCBmb3Igam9iIHNjcmlwdCBsb2NhdGlvbiBhbmQgY29kZSBleGVjdXRpb25cbiAgICoqL1xuICByZWFkb25seSBzY3JpcHRMb2NhdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBKb2JXb3JrZXJUeXBlID0gJ1N0YW5kYXJkJyB8ICdHLjFYJyB8ICdHLjJYJztcblxuLyoqXG4gKiBRLUVOSEFOQ0VELUlOVEVSRkFDRVxuICogQ29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIEdsdWUgam9iIHByb3BlcnRpZXMgcHJvdmlkaW5nIEVUTCBqb2IgY29uZmlndXJhdGlvbiBhbmQgcmVzb3VyY2UgbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMuIERlZmluZXMgY29tcGxldGUgR2x1ZSBqb2Igc2V0dXAgaW5jbHVkaW5nIGV4ZWN1dGlvbiByb2xlcywgY29tbWFuZHMsIGNhcGFjaXR5IGFsbG9jYXRpb24sIHJldHJ5IHBvbGljaWVzLCBhbmQgbW9uaXRvcmluZyBmb3IgRGF0YU9wcyBFVEwgcHJvY2Vzc2luZyBhbmQgZGF0YSB0cmFuc2Zvcm1hdGlvbiB3b3JrZmxvd3MuXG4gKlxuICogVXNlIGNhc2VzOiBFVEwgam9iIGNvbmZpZ3VyYXRpb247IERhdGEgdHJhbnNmb3JtYXRpb247IEpvYiByZXNvdXJjZSBtYW5hZ2VtZW50OyBEYXRhT3BzIHByb2Nlc3NpbmdcbiAqXG4gKiBBV1M6IEdsdWUgam9iIGNvbmZpZ3VyYXRpb24gZm9yIEVUTCBwcm9jZXNzaW5nIGFuZCBkYXRhIHRyYW5zZm9ybWF0aW9uIHdvcmtmbG93c1xuICpcbiAqIFZhbGlkYXRpb246IGV4ZWN1dGlvblJvbGVBcm4sIGNvbW1hbmQsIGFuZCBkZXNjcmlwdGlvbiBhcmUgcmVxdWlyZWQ7IG90aGVyIHByb3BlcnRpZXMgYXJlIG9wdGlvbmFsIHdpdGggc3BlY2lmaWMgY29uc3RyYWludHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKb2JDb25maWcge1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBSZXF1aXJlZCBleGVjdXRpb24gcm9sZSBBUk4gZm9yIEdsdWUgam9iIHBlcm1pc3Npb25zIGVuYWJsaW5nIHNlY3VyZSBqb2IgZXhlY3V0aW9uIGFuZCBBV1Mgc2VydmljZSBhY2Nlc3MuIFByb3ZpZGVzIHRoZSBJQU0gcm9sZSB0aGF0IHRoZSBHbHVlIGpvYiB3aWxsIGFzc3VtZSBmb3IgZXhlY3V0aW5nIEVUTCBvcGVyYXRpb25zIGFuZCBhY2Nlc3NpbmcgQVdTIHNlcnZpY2VzIGR1cmluZyBkYXRhIHByb2Nlc3Npbmcgd29ya2Zsb3dzLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEpvYiBwZXJtaXNzaW9uczsgU2VydmljZSBhY2Nlc3M7IFNlY3VyZSBleGVjdXRpb247IElBTSByb2xlIG1hbmFnZW1lbnRcbiAgICpcbiAgICogQVdTOiBJQU0gcm9sZSBBUk4gZm9yIEdsdWUgam9iIGV4ZWN1dGlvbiBwZXJtaXNzaW9ucyBhbmQgc2VydmljZSBhY2Nlc3NcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSB2YWxpZCBJQU0gcm9sZSBBUk47IHJlcXVpcmVkIGZvciBqb2IgZXhlY3V0aW9uIHBlcm1pc3Npb25zIGFuZCBzZXJ2aWNlIGFjY2Vzc1xuICAgKiovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblJvbGVBcm46IHN0cmluZztcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogUmVxdWlyZWQgam9iIGNvbW1hbmQgY29uZmlndXJhdGlvbiBkZWZpbmluZyBzY3JpcHQgZXhlY3V0aW9uIGFuZCBydW50aW1lIGVudmlyb25tZW50IGZvciBHbHVlIGpvYiBwcm9jZXNzaW5nLiBQcm92aWRlcyB0aGUgY29tbWFuZCBzcGVjaWZpY2F0aW9uIGluY2x1ZGluZyBqb2IgdHlwZSwgUHl0aG9uIHZlcnNpb24sIGFuZCBzY3JpcHQgbG9jYXRpb24gZm9yIEVUTCBqb2IgZXhlY3V0aW9uIGFuZCBkYXRhIHRyYW5zZm9ybWF0aW9uLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IFNjcmlwdCBleGVjdXRpb247IFJ1bnRpbWUgY29uZmlndXJhdGlvbjsgSm9iIGNvbW1hbmQgc2V0dXA7IEVUTCBwcm9jZXNzaW5nXG4gICAqXG4gICAqIEFXUzogR2x1ZSBqb2IgY29tbWFuZCBmb3Igc2NyaXB0IGV4ZWN1dGlvbiBhbmQgcnVudGltZSBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgdmFsaWQgSm9iQ29tbWFuZDsgcmVxdWlyZWQgZm9yIGpvYiBjb21tYW5kIGNvbmZpZ3VyYXRpb24gYW5kIHNjcmlwdCBleGVjdXRpb25cbiAgICogICAqKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogSm9iQ29tbWFuZDtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgdGVtcGxhdGUgcmVmZXJlbmNlIGZvciBqb2IgY29uZmlndXJhdGlvbiBpbmhlcml0YW5jZSBlbmFibGluZyByZXVzYWJsZSBqb2IgY29uZmlndXJhdGlvbnMgYW5kIHN0YW5kYXJkaXplZCBzZXR1cHMuIFdoZW4gc3BlY2lmaWVkLCBpbmhlcml0cyBjb25maWd1cmF0aW9uIGZyb20gYSB0ZW1wbGF0ZSBkZWZpbmVkIGVsc2V3aGVyZSBpbiB0aGUgY29uZmlndXJhdGlvbiBmb3IgY29uc2lzdGVudCBqb2Igc2V0dXAgYW5kIG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIFVzZSBjYXNlczogQ29uZmlndXJhdGlvbiBpbmhlcml0YW5jZTsgVGVtcGxhdGUgcmV1c2U7IFN0YW5kYXJkaXplZCBzZXR1cDsgQ29uZmlndXJhdGlvbiBtYW5hZ2VtZW50XG4gICAqXG4gICAqIEFXUzogSm9iIHRlbXBsYXRlIHJlZmVyZW5jZSBmb3IgY29uZmlndXJhdGlvbiBpbmhlcml0YW5jZSBhbmQgc3RhbmRhcmRpemVkIGpvYiBzZXR1cFxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIHZhbGlkIHRlbXBsYXRlIG5hbWUgaWYgcHJvdmlkZWQ7IGVuYWJsZXMgY29uZmlndXJhdGlvbiBpbmhlcml0YW5jZSBmcm9tIGRlZmluZWQgdGVtcGxhdGVzXG4gICAqKi9cbiAgcmVhZG9ubHkgdGVtcGxhdGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIGFsbG9jYXRlZCBjYXBhY2l0eSBzcGVjaWZpY2F0aW9uIGZvciBHbHVlIGpvYiByZXNvdXJjZSBhbGxvY2F0aW9uIGNvbnRyb2xsaW5nIGpvYiBwZXJmb3JtYW5jZSBhbmQgY29zdCBtYW5hZ2VtZW50LiBEZWZpbmVzIHRoZSBudW1iZXIgb2YgY2FwYWNpdHkgdW5pdHMgYWxsb2NhdGVkIHRvIHRoZSBqb2IgZm9yIHByb2Nlc3NpbmcgcGVyZm9ybWFuY2UgYW5kIHJlc291cmNlIHV0aWxpemF0aW9uIG9wdGltaXphdGlvbi5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBSZXNvdXJjZSBhbGxvY2F0aW9uOyBQZXJmb3JtYW5jZSB0dW5pbmc7IENvc3QgbWFuYWdlbWVudDsgQ2FwYWNpdHkgcGxhbm5pbmdcbiAgICpcbiAgICogQVdTOiBHbHVlIGpvYiBhbGxvY2F0ZWQgY2FwYWNpdHkgZm9yIHJlc291cmNlIGFsbG9jYXRpb24gYW5kIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIHBvc2l0aXZlIGludGVnZXIgaWYgcHJvdmlkZWQ7IGNvbnRyb2xzIGpvYiByZXNvdXJjZSBhbGxvY2F0aW9uIGFuZCBwZXJmb3JtYW5jZVxuICAgKiovXG4gIHJlYWRvbmx5IGFsbG9jYXRlZENhcGFjaXR5PzogbnVtYmVyO1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBPcHRpb25hbCBhcnJheSBvZiBjb25uZWN0aW9uIG5hbWVzIGZvciBHbHVlIGpvYiBuZXR3b3JrIGNvbm5lY3Rpdml0eSBlbmFibGluZyBkYXRhYmFzZSBhbmQgZXh0ZXJuYWwgc3lzdGVtIGFjY2Vzcy4gUHJvdmlkZXMgbmV0d29yayBjb25uZWN0aW9ucyBmb3IgYWNjZXNzaW5nIGRhdGFiYXNlcywgVlBDIHJlc291cmNlcywgYW5kIGV4dGVybmFsIHN5c3RlbXMgZHVyaW5nIEVUTCBwcm9jZXNzaW5nIGFuZCBkYXRhIGludGVncmF0aW9uLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IERhdGFiYXNlIGNvbm5lY3Rpdml0eTsgVlBDIGFjY2VzczsgRXh0ZXJuYWwgc3lzdGVtIGludGVncmF0aW9uOyBOZXR3b3JrIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQVdTOiBHbHVlIGpvYiBjb25uZWN0aW9ucyBmb3IgZGF0YWJhc2UgYW5kIGV4dGVybmFsIHN5c3RlbSBjb25uZWN0aXZpdHlcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBhcnJheSBvZiB2YWxpZCBjb25uZWN0aW9uIG5hbWVzIGlmIHByb3ZpZGVkOyBlbmFibGVzIGRhdGFiYXNlIGFuZCBleHRlcm5hbCBzeXN0ZW0gYWNjZXNzXG4gICAqKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvbnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgZGVmYXVsdCBhcmd1bWVudHMgbWFwIGZvciBHbHVlIGpvYiBwYXJhbWV0ZXIgY29uZmlndXJhdGlvbiBlbmFibGluZyBqb2IgY3VzdG9taXphdGlvbiBhbmQgcnVudGltZSBiZWhhdmlvciBjb250cm9sLiBQcm92aWRlcyBkZWZhdWx0IHBhcmFtZXRlcnMgYW5kIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBqb2IgZm9yIHJ1bnRpbWUgY29uZmlndXJhdGlvbiBhbmQgYmVoYXZpb3IgY3VzdG9taXphdGlvbi5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBKb2IgcGFyYW1ldGVyczsgUnVudGltZSBjb25maWd1cmF0aW9uOyBCZWhhdmlvciBjdXN0b21pemF0aW9uOyBQYXJhbWV0ZXIgbWFuYWdlbWVudFxuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIGRlZmF1bHQgYXJndW1lbnRzIGZvciBydW50aW1lIGNvbmZpZ3VyYXRpb24gYW5kIHBhcmFtZXRlciBtYW5hZ2VtZW50XG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgdmFsaWQgQ29uZmlndXJhdGlvbkVsZW1lbnQgaWYgcHJvdmlkZWQ7IGVuYWJsZXMgam9iIHBhcmFtZXRlciBjb25maWd1cmF0aW9uIGFuZCBjdXN0b21pemF0aW9uXG4gICAqKi9cbiAgcmVhZG9ubHkgZGVmYXVsdEFyZ3VtZW50cz86IENvbmZpZ3VyYXRpb25FbGVtZW50O1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBSZXF1aXJlZCBqb2IgZGVzY3JpcHRpb24gZm9yIGRvY3VtZW50YXRpb24gYW5kIG9wZXJhdGlvbmFsIG1hbmFnZW1lbnQgZW5hYmxpbmcgam9iIGlkZW50aWZpY2F0aW9uIGFuZCBwdXJwb3NlIGRvY3VtZW50YXRpb24uIFByb3ZpZGVzIGRlc2NyaXB0aXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBqb2IncyBwdXJwb3NlLCBmdW5jdGlvbmFsaXR5LCBhbmQgb3BlcmF0aW9uYWwgY2hhcmFjdGVyaXN0aWNzIGZvciBtYW5hZ2VtZW50IGFuZCBkb2N1bWVudGF0aW9uLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEpvYiBkb2N1bWVudGF0aW9uOyBPcGVyYXRpb25hbCBtYW5hZ2VtZW50OyBQdXJwb3NlIGlkZW50aWZpY2F0aW9uOyBNYW5hZ2VtZW50IGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEFXUzogR2x1ZSBqb2IgZGVzY3JpcHRpb24gZm9yIGRvY3VtZW50YXRpb24gYW5kIG9wZXJhdGlvbmFsIG1hbmFnZW1lbnRcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBkZXNjcmlwdGl2ZSB0ZXh0OyByZXF1aXJlZCBmb3Igam9iIGRvY3VtZW50YXRpb24gYW5kIG9wZXJhdGlvbmFsIG1hbmFnZW1lbnRcbiAgICoqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBPcHRpb25hbCBleGVjdXRpb24gcHJvcGVydHkgY29uZmlndXJhdGlvbiBmb3IgR2x1ZSBqb2IgY29uY3VycmVuY3kgY29udHJvbCBlbmFibGluZyBwYXJhbGxlbCBleGVjdXRpb24gbWFuYWdlbWVudCBhbmQgcmVzb3VyY2Ugb3B0aW1pemF0aW9uLiBEZWZpbmVzIGV4ZWN1dGlvbiBwcm9wZXJ0aWVzIGluY2x1ZGluZyBtYXhpbXVtIGNvbmN1cnJlbnQgZXhlY3V0aW9ucyBmb3Igam9iIHNjaGVkdWxpbmcgYW5kIHJlc291cmNlIG1hbmFnZW1lbnQuXG4gICAqXG4gICAqIFVzZSBjYXNlczogQ29uY3VycmVuY3kgY29udHJvbDsgUGFyYWxsZWwgZXhlY3V0aW9uOyBSZXNvdXJjZSBtYW5hZ2VtZW50OyBKb2Igc2NoZWR1bGluZ1xuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIGV4ZWN1dGlvbiBwcm9wZXJ0aWVzIGZvciBjb25jdXJyZW5jeSBjb250cm9sIGFuZCBwYXJhbGxlbCBleGVjdXRpb24gbWFuYWdlbWVudFxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIHZhbGlkIEV4ZWN1dGlvblByb3BlcnR5UHJvcGVydHkgaWYgcHJvdmlkZWQ7IGNvbnRyb2xzIGpvYiBjb25jdXJyZW5jeSBhbmQgcGFyYWxsZWwgZXhlY3V0aW9uXG4gICAqICAgKiovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblByb3BlcnR5PzogQ2ZuSm9iLkV4ZWN1dGlvblByb3BlcnR5UHJvcGVydHk7XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIEdsdWUgdmVyc2lvbiBzcGVjaWZpY2F0aW9uIGZvciBydW50aW1lIGVudmlyb25tZW50IGNvbnRyb2wgZW5hYmxpbmcgdmVyc2lvbi1zcGVjaWZpYyBmZWF0dXJlcyBhbmQgY29tcGF0aWJpbGl0eS4gRGVmaW5lcyB0aGUgR2x1ZSBydW50aW1lIHZlcnNpb24gZm9yIGpvYiBleGVjdXRpb24gZW5zdXJpbmcgZmVhdHVyZSBhdmFpbGFiaWxpdHkgYW5kIGNvbXBhdGliaWxpdHkgd2l0aCBqb2IgcmVxdWlyZW1lbnRzLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IFJ1bnRpbWUgdmVyc2lvbiBjb250cm9sOyBGZWF0dXJlIGF2YWlsYWJpbGl0eTsgQ29tcGF0aWJpbGl0eSBtYW5hZ2VtZW50OyBWZXJzaW9uIHNwZWNpZmljYXRpb25cbiAgICpcbiAgICogQVdTOiBHbHVlIHZlcnNpb24gZm9yIHJ1bnRpbWUgZW52aXJvbm1lbnQgYW5kIGZlYXR1cmUgYXZhaWxhYmlsaXR5XG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgdmFsaWQgR2x1ZSB2ZXJzaW9uIGlmIHByb3ZpZGVkOyBjb250cm9scyBydW50aW1lIGVudmlyb25tZW50IGFuZCBmZWF0dXJlIGF2YWlsYWJpbGl0eVxuICAgKiovXG4gIHJlYWRvbmx5IGdsdWVWZXJzaW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBPcHRpb25hbCBtYXhpbXVtIGNhcGFjaXR5IHNwZWNpZmljYXRpb24gZm9yIEdsdWUgam9iIHJlc291cmNlIGxpbWl0cyBjb250cm9sbGluZyBtYXhpbXVtIHJlc291cmNlIGFsbG9jYXRpb24gYW5kIGNvc3QgbWFuYWdlbWVudC4gRGVmaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgRFBVcyAoRGF0YSBQcm9jZXNzaW5nIFVuaXRzKSB0aGF0IGNhbiBiZSBhbGxvY2F0ZWQgdG8gdGhlIGpvYiBmb3IgcmVzb3VyY2UgY29udHJvbCBhbmQgY29zdCBvcHRpbWl6YXRpb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogUmVzb3VyY2UgbGltaXRzOyBDb3N0IGNvbnRyb2w7IE1heGltdW0gYWxsb2NhdGlvbjsgUmVzb3VyY2UgbWFuYWdlbWVudFxuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIG1heGltdW0gY2FwYWNpdHkgZm9yIHJlc291cmNlIGxpbWl0cyBhbmQgY29zdCBjb250cm9sXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgcG9zaXRpdmUgbnVtYmVyIGlmIHByb3ZpZGVkOyBjb250cm9scyBtYXhpbXVtIERQVSBhbGxvY2F0aW9uIGFuZCByZXNvdXJjZSBsaW1pdHNcbiAgICoqL1xuICByZWFkb25seSBtYXhDYXBhY2l0eT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgbWF4aW11bSByZXRyeSBjb3VudCBmb3IgR2x1ZSBqb2IgZmFpbHVyZSBoYW5kbGluZyBlbmFibGluZyBhdXRvbWF0aWMgcmV0cnkgYW5kIGVycm9yIHJlY292ZXJ5LiBEZWZpbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGJlZm9yZSBqb2IgZmFpbHVyZSBvY2N1cnMgZm9yIGF1dG9tYXRpYyBlcnJvciByZWNvdmVyeSBhbmQgam9iIHJlbGlhYmlsaXR5LlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEVycm9yIHJlY292ZXJ5OyBBdXRvbWF0aWMgcmV0cnk7IEpvYiByZWxpYWJpbGl0eTsgRmFpbHVyZSBoYW5kbGluZ1xuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIG1heGltdW0gcmV0cmllcyBmb3IgYXV0b21hdGljIGVycm9yIHJlY292ZXJ5IGFuZCBqb2IgcmVsaWFiaWxpdHlcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBub24tbmVnYXRpdmUgaW50ZWdlciBpZiBwcm92aWRlZDsgY29udHJvbHMgYXV0b21hdGljIHJldHJ5IGJlaGF2aW9yIGFuZCBlcnJvciByZWNvdmVyeVxuICAgKiovXG4gIHJlYWRvbmx5IG1heFJldHJpZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIG5vdGlmaWNhdGlvbiBwcm9wZXJ0eSBjb25maWd1cmF0aW9uIGZvciBHbHVlIGpvYiBtb25pdG9yaW5nIGFuZCBhbGVydGluZyBlbmFibGluZyBqb2Igc3RhdHVzIG5vdGlmaWNhdGlvbnMgYW5kIG9wZXJhdGlvbmFsIGF3YXJlbmVzcy4gRGVmaW5lcyBub3RpZmljYXRpb24gc2V0dGluZ3MgaW5jbHVkaW5nIG5vdGlmaWNhdGlvbiBkZWxheSBmb3Igam9iIG1vbml0b3JpbmcgYW5kIG9wZXJhdGlvbmFsIGFsZXJ0aW5nLlxuICAgKlxuICAgKiBVc2UgY2FzZXM6IEpvYiBtb25pdG9yaW5nOyBTdGF0dXMgbm90aWZpY2F0aW9uczsgT3BlcmF0aW9uYWwgYWxlcnRpbmc7IE1vbml0b3JpbmcgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIG5vdGlmaWNhdGlvbiBwcm9wZXJ0aWVzIGZvciBtb25pdG9yaW5nIGFuZCBhbGVydGluZyBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgdmFsaWQgTm90aWZpY2F0aW9uUHJvcGVydHlQcm9wZXJ0eSBpZiBwcm92aWRlZDsgZW5hYmxlcyBqb2IgbW9uaXRvcmluZyBhbmQgYWxlcnRpbmdcbiAgICogICAqKi9cbiAgcmVhZG9ubHkgbm90aWZpY2F0aW9uUHJvcGVydHk/OiBDZm5Kb2IuTm90aWZpY2F0aW9uUHJvcGVydHlQcm9wZXJ0eTtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgbnVtYmVyIG9mIHdvcmtlcnMgc3BlY2lmaWNhdGlvbiBmb3IgR2x1ZSBqb2IgcGFyYWxsZWwgcHJvY2Vzc2luZyBlbmFibGluZyBkaXN0cmlidXRlZCBwcm9jZXNzaW5nIGFuZCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uIERlZmluZXMgdGhlIG51bWJlciBvZiB3b3JrZXJzIGFzc2lnbmVkIHRvIHRoZSBqb2IgZm9yIHBhcmFsbGVsIHByb2Nlc3NpbmcgYW5kIGRpc3RyaWJ1dGVkIGRhdGEgdHJhbnNmb3JtYXRpb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogUGFyYWxsZWwgcHJvY2Vzc2luZzsgRGlzdHJpYnV0ZWQgcHJvY2Vzc2luZzsgUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uOyBXb3JrZXIgYWxsb2NhdGlvblxuICAgKlxuICAgKiBBV1M6IEdsdWUgam9iIG51bWJlciBvZiB3b3JrZXJzIGZvciBwYXJhbGxlbCBwcm9jZXNzaW5nIGFuZCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHByb3ZpZGVkOyBjb250cm9scyBwYXJhbGxlbCBwcm9jZXNzaW5nIGFuZCB3b3JrZXIgYWxsb2NhdGlvblxuICAgKiovXG4gIHJlYWRvbmx5IG51bWJlck9mV29ya2Vycz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgdGltZW91dCBzcGVjaWZpY2F0aW9uIGZvciBHbHVlIGpvYiBleGVjdXRpb24gbGltaXRzIGVuYWJsaW5nIGpvYiBydW50aW1lIGNvbnRyb2wgYW5kIHJlc291cmNlIG1hbmFnZW1lbnQuIERlZmluZXMgdGhlIG1heGltdW0gZXhlY3V0aW9uIHRpbWUgZm9yIHRoZSBqb2IgaW4gbWludXRlcyBmb3IgcnVudGltZSBjb250cm9sIGFuZCByZXNvdXJjZSBvcHRpbWl6YXRpb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogUnVudGltZSBjb250cm9sOyBFeGVjdXRpb24gbGltaXRzOyBSZXNvdXJjZSBtYW5hZ2VtZW50OyBUaW1lb3V0IGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQVdTOiBHbHVlIGpvYiB0aW1lb3V0IGZvciBleGVjdXRpb24gdGltZSBsaW1pdHMgYW5kIHJlc291cmNlIG1hbmFnZW1lbnRcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VyIGluIG1pbnV0ZXMgaWYgcHJvdmlkZWQ7IGNvbnRyb2xzIGpvYiBleGVjdXRpb24gdGltZSBsaW1pdHNcbiAgICoqL1xuICByZWFkb25seSB0aW1lb3V0PzogbnVtYmVyO1xuICAvKipcbiAgICogUS1FTkhBTkNFRC1QUk9QRVJUWVxuICAgKiBPcHRpb25hbCB3b3JrZXIgdHlwZSBzcGVjaWZpY2F0aW9uIGZvciBHbHVlIGpvYiBjb21wdXRlIHJlc291cmNlIHNlbGVjdGlvbiBlbmFibGluZyBwZXJmb3JtYW5jZSBhbmQgY29zdCBvcHRpbWl6YXRpb24uIERlZmluZXMgdGhlIHR5cGUgb2Ygd29ya2VycyAoU3RhbmRhcmQsIEcuMVgsIEcuMlgpIGZvciBjb21wdXRlIHJlc291cmNlIGFsbG9jYXRpb24gYW5kIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcy5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBDb21wdXRlIHJlc291cmNlIHNlbGVjdGlvbjsgUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uOyBDb3N0IG1hbmFnZW1lbnQ7IFdvcmtlciB0eXBlIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQVdTOiBHbHVlIGpvYiB3b3JrZXIgdHlwZSBmb3IgY29tcHV0ZSByZXNvdXJjZSBhbGxvY2F0aW9uIGFuZCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBTdGFuZGFyZCwgRy4xWCwgb3IgRy4yWCBpZiBwcm92aWRlZDsgY29udHJvbHMgY29tcHV0ZSByZXNvdXJjZSB0eXBlIGFuZCBwZXJmb3JtYW5jZVxuICAgKiAgICoqL1xuICByZWFkb25seSB3b3JrZXJUeXBlPzogSm9iV29ya2VyVHlwZTtcbiAgLyoqXG4gICAqIFEtRU5IQU5DRUQtUFJPUEVSVFlcbiAgICogT3B0aW9uYWwgYXJyYXkgb2YgYWRkaXRpb25hbCBzY3JpcHQgcGF0aHMgZm9yIEdsdWUgam9iIGRlcGVuZGVuY3kgbWFuYWdlbWVudCBlbmFibGluZyBtb2R1bGFyIEVUTCBkZXZlbG9wbWVudCBhbmQgY29kZSByZXVzZS4gUHJvdmlkZXMgcmVsYXRpdmUgcGF0aHMgdG8gYWRkaXRpb25hbCBHbHVlIHNjcmlwdHMgcmVmZXJlbmNlZCBieSB0aGUgbWFpbiBFVEwgc2NyaXB0IGZvciBtb2R1bGFyIGRldmVsb3BtZW50IGFuZCBjb2RlIG9yZ2FuaXphdGlvbi5cbiAgICpcbiAgICogVXNlIGNhc2VzOiBTY3JpcHQgZGVwZW5kZW5jaWVzOyBNb2R1bGFyIGRldmVsb3BtZW50OyBDb2RlIHJldXNlOyBEZXBlbmRlbmN5IG1hbmFnZW1lbnRcbiAgICpcbiAgICogQVdTOiBBZGRpdGlvbmFsIEdsdWUgc2NyaXB0cyBmb3Igam9iIGRlcGVuZGVuY2llcyBhbmQgbW9kdWxhciBFVEwgZGV2ZWxvcG1lbnRcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSBhcnJheSBvZiB2YWxpZCBzY3JpcHQgcGF0aHMgaWYgcHJvdmlkZWQ7IGVuYWJsZXMgc2NyaXB0IGRlcGVuZGVuY2llcyBhbmQgbW9kdWxhciBkZXZlbG9wbWVudFxuICAgKiovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxTY3JpcHRzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIGFycmF5IG9mIGFkZGl0aW9uYWwgSkFSIGZpbGUgcGF0aHMgZm9yIEdsdWUgam9iIGxpYnJhcnkgZGVwZW5kZW5jaWVzIGVuYWJsaW5nIEphdmEgbGlicmFyeSBpbnRlZ3JhdGlvbiBhbmQgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eS4gUHJvdmlkZXMgcmVsYXRpdmUgcGF0aHMgdG8gSkFSIGZpbGVzIHJlZmVyZW5jZWQgYnkgdGhlIEVUTCBzY3JpcHQgZm9yIEphdmEgbGlicmFyeSBpbnRlZ3JhdGlvbiBhbmQgZXh0ZW5kZWQgcHJvY2Vzc2luZyBjYXBhYmlsaXRpZXMuXG4gICAqXG4gICAqIFVzZSBjYXNlczogSmF2YSBsaWJyYXJ5IGludGVncmF0aW9uOyBFeHRlbmRlZCBmdW5jdGlvbmFsaXR5OyBMaWJyYXJ5IGRlcGVuZGVuY2llczsgSkFSIGZpbGUgbWFuYWdlbWVudFxuICAgKlxuICAgKiBBV1M6IEFkZGl0aW9uYWwgSkFSIGZpbGVzIGZvciBHbHVlIGpvYiBsaWJyYXJ5IGRlcGVuZGVuY2llcyBhbmQgSmF2YSBpbnRlZ3JhdGlvblxuICAgKlxuICAgKiBWYWxpZGF0aW9uOiBNdXN0IGJlIGFycmF5IG9mIHZhbGlkIEpBUiBmaWxlIHBhdGhzIGlmIHByb3ZpZGVkOyBlbmFibGVzIEphdmEgbGlicmFyeSBpbnRlZ3JhdGlvbiBhbmQgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eVxuICAgKiovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxKYXJzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIGFycmF5IG9mIGFkZGl0aW9uYWwgZmlsZSBwYXRocyBmb3IgR2x1ZSBqb2IgcmVzb3VyY2UgZGVwZW5kZW5jaWVzIGVuYWJsaW5nIGV4dGVybmFsIGZpbGUgYWNjZXNzIGFuZCByZXNvdXJjZSBtYW5hZ2VtZW50LiBQcm92aWRlcyByZWxhdGl2ZSBwYXRocyB0byBhZGRpdGlvbmFsIGZpbGVzIHJlZmVyZW5jZWQgYnkgdGhlIEVUTCBzY3JpcHQgZm9yIGV4dGVybmFsIHJlc291cmNlIGFjY2VzcyBhbmQgZmlsZSBkZXBlbmRlbmNpZXMuXG4gICAqXG4gICAqIFVzZSBjYXNlczogRmlsZSBkZXBlbmRlbmNpZXM7IEV4dGVybmFsIHJlc291cmNlczsgUmVzb3VyY2UgbWFuYWdlbWVudDsgRmlsZSBhY2Nlc3NcbiAgICpcbiAgICogQVdTOiBBZGRpdGlvbmFsIGZpbGVzIGZvciBHbHVlIGpvYiByZXNvdXJjZSBkZXBlbmRlbmNpZXMgYW5kIGV4dGVybmFsIGZpbGUgYWNjZXNzXG4gICAqXG4gICAqIFZhbGlkYXRpb246IE11c3QgYmUgYXJyYXkgb2YgdmFsaWQgZmlsZSBwYXRocyBpZiBwcm92aWRlZDsgZW5hYmxlcyBleHRlcm5hbCBmaWxlIGFjY2VzcyBhbmQgcmVzb3VyY2UgZGVwZW5kZW5jaWVzXG4gICAqKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbEZpbGVzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBRLUVOSEFOQ0VELVBST1BFUlRZXG4gICAqIE9wdGlvbmFsIGNvbnRpbnVvdXMgbG9nZ2luZyBjb25maWd1cmF0aW9uIGZvciBHbHVlIGpvYiByZWFsLXRpbWUgbW9uaXRvcmluZyBlbmFibGluZyBsaXZlIGxvZyBzdHJlYW1pbmcgYW5kIHRyb3VibGVzaG9vdGluZyBzdXBwb3J0LiBXaGVuIGVuYWJsZWQsIHN0cmVhbXMgam9iIGxvZ3MgdG8gQ2xvdWRXYXRjaCBMb2dzIGluIHJlYWwtdGltZSBmb3IgbGl2ZSBtb25pdG9yaW5nIGFuZCB0cm91Ymxlc2hvb3RpbmcgZHVyaW5nIGpvYiBleGVjdXRpb24uXG4gICAqXG4gICAqIFVzZSBjYXNlczogUmVhbC10aW1lIG1vbml0b3Jpbmc7IExpdmUgbG9nIHN0cmVhbWluZzsgVHJvdWJsZXNob290aW5nIHN1cHBvcnQ7IE9wZXJhdGlvbmFsIHZpc2liaWxpdHlcbiAgICpcbiAgICogQVdTOiBHbHVlIGpvYiBjb250aW51b3VzIGxvZ2dpbmcgZm9yIHJlYWwtdGltZSBtb25pdG9yaW5nIGFuZCB0cm91Ymxlc2hvb3RpbmdcbiAgICpcbiAgICogVmFsaWRhdGlvbjogTXVzdCBiZSB2YWxpZCBMb2dnaW5nQ29uZmlnIGlmIHByb3ZpZGVkOyBlbmFibGVzIHJlYWwtdGltZSBsb2cgc3RyZWFtaW5nIGFuZCBtb25pdG9yaW5nXG4gICAqKi9cbiAgcmVhZG9ubHkgY29udGludW91c0xvZ2dpbmc/OiBMb2dnaW5nQ29uZmlnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdsdWVKb2JMM0NvbnN0cnVjdFByb3BzIGV4dGVuZHMgTWRhYUwzQ29uc3RydWN0UHJvcHMge1xuICAvKipcbiAgICogUm9sZSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZGVwbG95IHRoZSBKb2IgY29kZS4gU2hvdWxkIGJlIG9idGFpbmVkIGZyb20gdGhlIERhdGFPcHMgUHJvamVjdFxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudFJvbGVBcm4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgRGF0YSBPcHMgcHJvamVjdCBidWNrZXQgd2hlcmUgam9iIHJlc291cmNlcyB3aWxsIGJlIGRlcGxveWVkIGFuZCB3aGljaCB3aWxsIGJlIHVzZWQgYXMgYSB0ZW1wb3Jhcnkgam9iIGxvY2F0aW9uXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0QnVja2V0TmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE1hcCBvZiBqb2IgbmFtZXMgdG8gam9iIGNvbmZpZ3VyYXRpb25zXG4gICAqL1xuICByZWFkb25seSBqb2JDb25maWdzOiB7IFtrZXk6IHN0cmluZ106IEpvYkNvbmZpZyB9O1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgR2x1ZSBTZWN1cml0eSBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQgZm9yIGFsbCBqb2JzLiBMaWtlbHkgc3VwcGxpZWQgYnkgdGhlIERhdGFPcHMgUHJvamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5Q29uZmlndXJhdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBkYXRhb3BzIHByb2plY3QgdG8gd2hpY2ggdGhlIGpvYiB3aWxsIGJlIGFzc29jaWF0ZWQuXG4gICAqL1xuICByZWFkb25seSBwcm9qZWN0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOb3RpZmljYXRpb24gdG9waWMgQXJuXG4gICAqL1xuICByZWFkb25seSBub3RpZmljYXRpb25Ub3BpY0Fybj86IHN0cmluZztcblxuICAvKipcbiAgICogRGF0YW9wcyBwcm9qZWN0IEtNUyBrZXkgQVJOLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVjdEtNU0Fybj86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIEdsdWVKb2JMM0NvbnN0cnVjdCBleHRlbmRzIE1kYWFMM0NvbnN0cnVjdCB7XG4gIHByb3RlY3RlZCByZWFkb25seSBwcm9wczogR2x1ZUpvYkwzQ29uc3RydWN0UHJvcHM7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvamVjdEttc0tleTogSUtleTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogR2x1ZUpvYkwzQ29uc3RydWN0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICBpZiAoIXRoaXMucHJvcHMuZGVwbG95bWVudFJvbGVBcm4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGVwbG95bWVudCByb2xlIEFSTiBpcyByZXF1aXJlZCBmb3Igam9iIGNvbmZpZ3VyYXRpb24nKTtcbiAgICB9XG4gICAgY29uc3QgZGVwbG95bWVudFJvbGUgPSBNZGFhUm9sZS5mcm9tUm9sZUFybih0aGlzLnNjb3BlLCBgZGVwbG95bWVudC1yb2xlYCwgdGhpcy5wcm9wcy5kZXBsb3ltZW50Um9sZUFybik7XG4gICAgaWYgKCF0aGlzLnByb3BzLnByb2plY3RCdWNrZXROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3QgYnVja2V0IG5hbWUgaXMgcmVxdWlyZWQgZm9yIGpvYiBjb25maWd1cmF0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IHByb2plY3RCdWNrZXQgPSBNZGFhQnVja2V0LmZyb21CdWNrZXROYW1lKHRoaXMuc2NvcGUsIGBwcm9qZWN0LWJ1Y2tldGAsIHRoaXMucHJvcHMucHJvamVjdEJ1Y2tldE5hbWUpO1xuICAgIGlmICghdGhpcy5wcm9wcy5wcm9qZWN0S01TQXJuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3QgS01TIEtleSBpcyByZXF1aXJlZCBmb3Igam9iIGNvbmZpZ3VyYXRpb24nKTtcbiAgICB9XG4gICAgdGhpcy5wcm9qZWN0S21zS2V5ID0gS2V5LmZyb21LZXlBcm4odGhpcywgdGhpcy5wcm9wcy5wcm9qZWN0TmFtZSwgdGhpcy5wcm9wcy5wcm9qZWN0S01TQXJuKTtcblxuICAgIC8vIEJ1aWxkIG91ciBqb2JzIVxuICAgIGNvbnN0IGFsbEpvYnMgPSB0aGlzLnByb3BzLmpvYkNvbmZpZ3M7XG4gICAgT2JqZWN0LmtleXMoYWxsSm9icykuZm9yRWFjaChqb2JOYW1lID0+IHtcbiAgICAgIGNvbnN0IGpvYkNvbmZpZyA9IGFsbEpvYnNbam9iTmFtZV07XG4gICAgICB0aGlzLmNyZWF0ZUpvYihqb2JOYW1lLCBqb2JDb25maWcsIGRlcGxveW1lbnRSb2xlLCBwcm9qZWN0QnVja2V0KTtcbiAgICB9KTtcbiAgICAvL0NESyBTMyBEZXBsb3ltZW50IGF1dG9tYXRpY2FsbHkgYWRkcyBpbmxpbmUgcG9saWN5IHRvIHByb2plY3QgZGVwbG95bWVudCByb2xlLlxuICAgIHRoaXMuc2NvcGUubm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIGlmIChjaGlsZC5ub2RlLmlkLnN0YXJ0c1dpdGgoJ2RlcGxveW1lbnQtcm9sZScpKSB7XG4gICAgICAgIE1kYWFOYWdTdXBwcmVzc2lvbnMuYWRkQ29kZVJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsIHJlYXNvbjogJ0lubGluZSBwb2xpY3kgdXNlZCBvbmx5IGZvciBkZXBsb3ltZW50LicgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdOSVNULjgwMC41My5SNS1JQU1Ob0lubGluZVBvbGljeScsIHJlYXNvbjogJ1BvbGljeSB1c2VkIG9ubHkgZm9yIGRlcGxveW1lbnQuJyB9LFxuICAgICAgICAgICAgeyBpZDogJ0hJUEFBLlNlY3VyaXR5LUlBTU5vSW5saW5lUG9saWN5JywgcmVhc29uOiAnUG9saWN5IHVzZWQgb25seSBmb3IgZGVwbG95bWVudC4nIH0sXG4gICAgICAgICAgICB7IGlkOiAnUENJLkRTUy4zMjEtSUFNTm9JbmxpbmVQb2xpY3knLCByZWFzb246ICdQb2xpY3kgdXNlZCBvbmx5IGZvciBkZXBsb3ltZW50LicgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRlcGxveUFkZGl0aW9uYWxGaWxlcyhcbiAgICBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzOiBJU291cmNlW10sXG4gICAgcHJvamVjdEJ1Y2tldDogSUJ1Y2tldCxcbiAgICBkZXBsb3ltZW50Um9sZTogSVJvbGUsXG4gICAgZGVwbG95bWVudElkOiBzdHJpbmcsXG4gICAgZGVwbG95bWVudFBhdGg6IHN0cmluZyxcbiAgICBleHRyYWN0OiBib29sZWFuLFxuICApOiBCdWNrZXREZXBsb3ltZW50IHtcbiAgICAvLyBEZXBsb3kgU291cmNlIGFzc2V0KHMpIHRvIC9kZXBsb3ltZW50L2xpYnMvPGpvYj4gbG9jYXRpb24uXG4gICAgcmV0dXJuIG5ldyBCdWNrZXREZXBsb3ltZW50KHRoaXMuc2NvcGUsIGRlcGxveW1lbnRJZCwge1xuICAgICAgc291cmNlczogYWRkaXRpb25hbEZpbGVzU291cmNlcyxcbiAgICAgIGRlc3RpbmF0aW9uQnVja2V0OiBwcm9qZWN0QnVja2V0LFxuICAgICAgZGVzdGluYXRpb25LZXlQcmVmaXg6IGRlcGxveW1lbnRQYXRoLFxuICAgICAgcm9sZTogZGVwbG95bWVudFJvbGUsXG4gICAgICBleHRyYWN0OiBleHRyYWN0LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRBZGRpdGlvbmFsU2NyaXB0cyhcbiAgICBqb2JOYW1lOiBzdHJpbmcsXG4gICAgam9iQ29uZmlnOiBKb2JDb25maWcsXG4gICAgcHJvamVjdEJ1Y2tldDogSUJ1Y2tldCxcbiAgICBkZXBsb3ltZW50Um9sZTogSVJvbGUsXG4gICAgZGVmYXVsdEFyZ3VtZW50czogQ29uZmlndXJhdGlvbkVsZW1lbnQsXG4gICkge1xuICAgIGlmIChqb2JDb25maWcuYWRkaXRpb25hbFNjcmlwdHMpIHtcbiAgICAgIC8qKlxuICAgICAgICogR3JvdXAgYWxsIGZpbGVzIGF0IHBhcmVudCBkaXJlY3RvcnkgbGV2ZWwuIFRoaXMgd2lsbCBhbGxvdyBjcmVhdGluZyB6aXAgbGliIGFzc2VzdHMgYXQgdmFyaW91cyBkaXJlY3RvcnkgbGV2ZWxzXG4gICAgICAgKiBleC4gJy9tYWluL3NjcmlwdDEucHknICwgJy91dGlsL3NjcmlwdDIucHknICwgJy91dGlsL3NjcmlwdDMucHknIHdpbGwgY3JlYXRlIDIgemlwIGZpbGVzIHJlcHJlc2VudGluZyAnbWFpbicgYW5kICd1dGlscydcbiAgICAgICAqICAqL1xuICAgICAgY29uc3QgZGlyZWN0b3J5VG9GaWxlOiB7IFtmaWxlUGF0aDogc3RyaW5nXTogc3RyaW5nW10gfSA9IHt9O1xuICAgICAgam9iQ29uZmlnLmFkZGl0aW9uYWxTY3JpcHRzLmZvckVhY2goZmlsZUxvY2F0aW9uID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmRpcm5hbWUoZmlsZUxvY2F0aW9uLnRyaW0oKSk7XG4gICAgICAgIGlmIChmaWxlUGF0aCBpbiBkaXJlY3RvcnlUb0ZpbGUpIHtcbiAgICAgICAgICBkaXJlY3RvcnlUb0ZpbGVbZmlsZVBhdGhdLnB1c2goYCEke3BhdGguYmFzZW5hbWUoZmlsZUxvY2F0aW9uLnRyaW0oKSl9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGlyZWN0b3J5VG9GaWxlW2ZpbGVQYXRoXSA9IFtgISR7cGF0aC5iYXNlbmFtZShmaWxlTG9jYXRpb24udHJpbSgpKX1gXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIENyZWF0ZSBTb3VyY2UgYXNzZXQgZm9yIGVhY2ggZGlyZWN0b3J5XG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzID0gT2JqZWN0LmVudHJpZXMoZGlyZWN0b3J5VG9GaWxlKS5tYXAoKFtmaWxlUGF0aCwgZmlsZU5hbWVzXSkgPT4ge1xuICAgICAgICByZXR1cm4gU291cmNlLmFzc2V0KGZpbGVQYXRoLCB7IGV4Y2x1ZGU6IFsnKionLCAuLi5maWxlTmFtZXNdIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXBsb3ltZW50UGF0aCA9IGBkZXBsb3ltZW50L2xpYnMvJHtqb2JOYW1lfWA7XG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmlsZURlcGxveW1lbnQgPSB0aGlzLmRlcGxveUFkZGl0aW9uYWxGaWxlcyhcbiAgICAgICAgYWRkaXRpb25hbEZpbGVzU291cmNlcyxcbiAgICAgICAgcHJvamVjdEJ1Y2tldCxcbiAgICAgICAgZGVwbG95bWVudFJvbGUsXG4gICAgICAgIGRlcGxveW1lbnRQYXRoLFxuICAgICAgICBgam9iLWRlcGxveW1lbnQtJHtqb2JOYW1lfS1hZGRpdGlvbmFsLXNjcmlwdGAsXG4gICAgICAgIGZhbHNlLCAvLyBHbHVlIGV4cGVjdHMgemlwIG9mIGFkZGl0aW9uYWwgc2NyaXB0cywgaGVuY2UgZGlzYWJsaW5nIHRoZSBleHRyYWN0aW9uXG4gICAgICApO1xuXG4gICAgICAvLyBFeHRyYWN0IHppcCBuYW1lKHMpIGZvciBlYWNoIHNvdXJjZSBhbmQgY3JlYXRlIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHMzIGxvY2F0aW9uc1xuICAgICAgY29uc3QgbGlicmFyeVppcE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZGl0aW9uYWxGaWxlc1NvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbGliTmFtZSA9IEZuLnNlbGVjdChpLCBhZGRpdGlvbmFsRmlsZURlcGxveW1lbnQub2JqZWN0S2V5cyk7IC8vIEV4dHJhY3QgZmlsZSBuYW1lIG9mIHppcCBjb250YWluaW5nIGFkZGl0aW9uYWwgc2NyaXB0c1xuICAgICAgICBsaWJyYXJ5WmlwTmFtZXMucHVzaChgczM6Ly8ke2FkZGl0aW9uYWxGaWxlRGVwbG95bWVudC5kZXBsb3llZEJ1Y2tldC5idWNrZXROYW1lfS8ke2RlcGxveW1lbnRQYXRofS8ke2xpYk5hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB6aXAgZmlsZSBuYW1lcyB0byBkZWZhdWx0IGFyZ3VtZW50cy5cbiAgICAgIGlmIChkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLXB5LWZpbGVzJ10pIHtcbiAgICAgICAgZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1weS1maWxlcyddICs9ICcsJyArIGxpYnJhcnlaaXBOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLXB5LWZpbGVzJ10gPSBsaWJyYXJ5WmlwTmFtZXMuam9pbignLCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQWRkaXRpb25hbEphcnMoXG4gICAgam9iTmFtZTogc3RyaW5nLFxuICAgIGpvYkNvbmZpZzogSm9iQ29uZmlnLFxuICAgIHByb2plY3RCdWNrZXQ6IElCdWNrZXQsXG4gICAgZGVwbG95bWVudFJvbGU6IElSb2xlLFxuICAgIGRlZmF1bHRBcmd1bWVudHM6IENvbmZpZ3VyYXRpb25FbGVtZW50LFxuICApIHtcbiAgICBpZiAoam9iQ29uZmlnLmFkZGl0aW9uYWxKYXJzKSB7XG4gICAgICAvLyBDcmVhdGUgU291cmNlIGFzc2V0IGZvciBlYWNoIGRpcmVjdG9yeVxuICAgICAgY29uc3QgYWRkaXRpb25hbEZpbGVzU291cmNlcyA9IGpvYkNvbmZpZy5hZGRpdGlvbmFsSmFycy5tYXAoZnVsbEZpbGVOYW1lID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmRpcm5hbWUoZnVsbEZpbGVOYW1lLnRyaW0oKSk7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmdWxsRmlsZU5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIFNvdXJjZS5hc3NldChmaWxlUGF0aCwgeyBleGNsdWRlOiBbJyoqJywgYCEke2ZpbGVOYW1lfWBdIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXBsb3ltZW50UGF0aCA9IGBkZXBsb3ltZW50L2xpYnMvJHtqb2JOYW1lfWA7XG5cbiAgICAgIGNvbnN0IGFkZGl0aW9uYWxGaWxlRGVwbG95bWVudCA9IHRoaXMuZGVwbG95QWRkaXRpb25hbEZpbGVzKFxuICAgICAgICBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzLFxuICAgICAgICBwcm9qZWN0QnVja2V0LFxuICAgICAgICBkZXBsb3ltZW50Um9sZSxcbiAgICAgICAgYGpvYi1kZXBsb3ltZW50LSR7am9iTmFtZX0tYWRkaXRpb25hbC1qYXJgLFxuICAgICAgICBkZXBsb3ltZW50UGF0aCxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGV4dHJhSmFyTmFtZXMgPSBqb2JDb25maWcuYWRkaXRpb25hbEphcnMubWFwKGZ1bGxGaWxlTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmdWxsRmlsZU5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIGBzMzovLyR7YWRkaXRpb25hbEZpbGVEZXBsb3ltZW50LmRlcGxveWVkQnVja2V0LmJ1Y2tldE5hbWV9LyR7ZGVwbG95bWVudFBhdGh9LyR7ZmlsZU5hbWV9YDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgemlwIGZpbGUgbmFtZXMgdG8gZGVmYXVsdCBhcmd1bWVudHMuXG4gICAgICBpZiAoZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1qYXJzJ10pIHtcbiAgICAgICAgZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1qYXJzJ10gKz0gJywnICsgZXh0cmFKYXJOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLWphcnMnXSA9IGV4dHJhSmFyTmFtZXMuam9pbignLCcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkQWRkaXRpb25hbEZpbGVzKFxuICAgIGpvYk5hbWU6IHN0cmluZyxcbiAgICBqb2JDb25maWc6IEpvYkNvbmZpZyxcbiAgICBwcm9qZWN0QnVja2V0OiBJQnVja2V0LFxuICAgIGRlcGxveW1lbnRSb2xlOiBJUm9sZSxcbiAgICBkZWZhdWx0QXJndW1lbnRzOiBDb25maWd1cmF0aW9uRWxlbWVudCxcbiAgKSB7XG4gICAgaWYgKGpvYkNvbmZpZy5hZGRpdGlvbmFsRmlsZXMpIHtcbiAgICAgIC8vIENyZWF0ZSBTb3VyY2UgYXNzZXQgZm9yIGVhY2ggZGlyZWN0b3J5XG4gICAgICBjb25zdCBhZGRpdGlvbmFsRmlsZXNTb3VyY2VzID0gam9iQ29uZmlnLmFkZGl0aW9uYWxGaWxlcy5tYXAoZnVsbEZpbGVOYW1lID0+IHtcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmRpcm5hbWUoZnVsbEZpbGVOYW1lLnRyaW0oKSk7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmdWxsRmlsZU5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIFNvdXJjZS5hc3NldChmaWxlUGF0aCwgeyBleGNsdWRlOiBbJyoqJywgYCEke2ZpbGVOYW1lfWBdIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXBsb3ltZW50UGF0aCA9IGBkZXBsb3ltZW50L2ZpbGVzLyR7am9iTmFtZX1gO1xuICAgICAgY29uc3QgYWRkaXRpb25hbEZpbGVEZXBsb3ltZW50ID0gdGhpcy5kZXBsb3lBZGRpdGlvbmFsRmlsZXMoXG4gICAgICAgIGFkZGl0aW9uYWxGaWxlc1NvdXJjZXMsXG4gICAgICAgIHByb2plY3RCdWNrZXQsXG4gICAgICAgIGRlcGxveW1lbnRSb2xlLFxuICAgICAgICBgam9iLWRlcGxveW1lbnQtJHtqb2JOYW1lfS1hZGRpdGlvbmFsLWZpbGVgLFxuICAgICAgICBkZXBsb3ltZW50UGF0aCxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG4gICAgICBjb25zdCBleHRyYUZpbGVOYW1lcyA9IGpvYkNvbmZpZy5hZGRpdGlvbmFsRmlsZXMubWFwKGZ1bGxGaWxlTmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gcGF0aC5iYXNlbmFtZShmdWxsRmlsZU5hbWUudHJpbSgpKTtcbiAgICAgICAgcmV0dXJuIGBzMzovLyR7YWRkaXRpb25hbEZpbGVEZXBsb3ltZW50LmRlcGxveWVkQnVja2V0LmJ1Y2tldE5hbWV9LyR7ZGVwbG95bWVudFBhdGh9LyR7ZmlsZU5hbWV9YDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgemlwIGZpbGUgbmFtZXMgdG8gZGVmYXVsdCBhcmd1bWVudHMuXG4gICAgICBpZiAoZGVmYXVsdEFyZ3VtZW50c1snLS1leHRyYS1maWxlcyddKSB7XG4gICAgICAgIGRlZmF1bHRBcmd1bWVudHNbJy0tZXh0cmEtZmlsZXMnXSArPSAnLCcgKyBleHRyYUZpbGVOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWZhdWx0QXJndW1lbnRzWyctLWV4dHJhLWZpbGVzJ10gPSBleHRyYUZpbGVOYW1lcy5qb2luKCcsJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVKb2Ioam9iTmFtZTogc3RyaW5nLCBqb2JDb25maWc6IEpvYkNvbmZpZywgZGVwbG95bWVudFJvbGU6IElSb2xlLCBwcm9qZWN0QnVja2V0OiBJQnVja2V0KSB7XG4gICAgY29uc3QgZGVmYXVsdEFyZ3VtZW50cyA9IGpvYkNvbmZpZy5kZWZhdWx0QXJndW1lbnRzID8gam9iQ29uZmlnLmRlZmF1bHRBcmd1bWVudHMgOiB7fTtcbiAgICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5kaXJuYW1lKGpvYkNvbmZpZy5jb21tYW5kLnNjcmlwdExvY2F0aW9uLnRyaW0oKSk7XG4gICAgY29uc3Qgc2NyaXB0TmFtZSA9IHBhdGguYmFzZW5hbWUoam9iQ29uZmlnLmNvbW1hbmQuc2NyaXB0TG9jYXRpb24udHJpbSgpKTtcbiAgICBjb25zdCBzY3JpcHRTb3VyY2UgPSBTb3VyY2UuYXNzZXQoc2NyaXB0UGF0aCwgeyBleGNsdWRlOiBbJyoqJywgYCEke3NjcmlwdE5hbWV9YF0gfSk7XG5cbiAgICBjb25zdCBzY3JpcHREZXBsb3ltZW50UGF0aCA9IGBkZXBsb3ltZW50L2pvYnMvJHtqb2JOYW1lfWA7XG4gICAgY29uc3Qgc2NyaXB0RGVwbG95bWVudCA9IG5ldyBCdWNrZXREZXBsb3ltZW50KHRoaXMuc2NvcGUsIGBqb2ItZGVwbG95bWVudC0ke2pvYk5hbWV9YCwge1xuICAgICAgc291cmNlczogW3NjcmlwdFNvdXJjZV0sXG4gICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogcHJvamVjdEJ1Y2tldCxcbiAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBzY3JpcHREZXBsb3ltZW50UGF0aCxcbiAgICAgIHJvbGU6IGRlcGxveW1lbnRSb2xlLFxuICAgICAgZXh0cmFjdDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIHRoaXMuYWRkQWRkaXRpb25hbFNjcmlwdHMoam9iTmFtZSwgam9iQ29uZmlnLCBwcm9qZWN0QnVja2V0LCBkZXBsb3ltZW50Um9sZSwgZGVmYXVsdEFyZ3VtZW50cyk7XG4gICAgdGhpcy5hZGRBZGRpdGlvbmFsSmFycyhqb2JOYW1lLCBqb2JDb25maWcsIHByb2plY3RCdWNrZXQsIGRlcGxveW1lbnRSb2xlLCBkZWZhdWx0QXJndW1lbnRzKTtcbiAgICB0aGlzLmFkZEFkZGl0aW9uYWxGaWxlcyhqb2JOYW1lLCBqb2JDb25maWcsIHByb2plY3RCdWNrZXQsIGRlcGxveW1lbnRSb2xlLCBkZWZhdWx0QXJndW1lbnRzKTtcbiAgICBNZGFhTmFnU3VwcHJlc3Npb25zLmFkZENvZGVSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgICAgIHRoaXMuc2NvcGUsXG4gICAgICBbXG4gICAgICAgIHsgaWQ6ICdBd3NTb2x1dGlvbnMtTDEnLCByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudC4nIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ05JU1QuODAwLjUzLlI1LUxhbWJkYUNvbmN1cnJlbmN5JyxcbiAgICAgICAgICByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudC4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdOSVNULjgwMC41My5SNS1MYW1iZGFJbnNpZGVWUEMnLFxuICAgICAgICAgIHJlYXNvbjogJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50IGFuZCBpbnRlcmFjdHMgb25seSB3aXRoIFMzLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ05JU1QuODAwLjUzLlI1LUxhbWJkYURMUScsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50LiBFcnJvcnMgd2lsbCBiZSBoYW5kbGVkIGJ5IENsb3VkRm9ybWF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0hJUEFBLlNlY3VyaXR5LUxhbWJkYUNvbmN1cnJlbmN5JyxcbiAgICAgICAgICByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudC4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdQQ0kuRFNTLjMyMS1MYW1iZGFDb25jdXJyZW5jeScsXG4gICAgICAgICAgcmVhc29uOiAnRnVuY3Rpb24gaXMgdXNlZCBvbmx5IGFzIGN1c3RvbSByZXNvdXJjZSBkdXJpbmcgQ0RLIGRlcGxveW1lbnQuJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnSElQQUEuU2VjdXJpdHktTGFtYmRhSW5zaWRlVlBDJyxcbiAgICAgICAgICByZWFzb246ICdGdW5jdGlvbiBpcyB1c2VkIG9ubHkgYXMgY3VzdG9tIHJlc291cmNlIGR1cmluZyBDREsgZGVwbG95bWVudCBhbmQgaW50ZXJhY3RzIG9ubHkgd2l0aCBTMy4nLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdQQ0kuRFNTLjMyMS1MYW1iZGFJbnNpZGVWUEMnLFxuICAgICAgICAgIHJlYXNvbjogJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50IGFuZCBpbnRlcmFjdHMgb25seSB3aXRoIFMzLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0hJUEFBLlNlY3VyaXR5LUxhbWJkYURMUScsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50LiBFcnJvcnMgd2lsbCBiZSBoYW5kbGVkIGJ5IENsb3VkRm9ybWF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ1BDSS5EU1MuMzIxLUxhbWJkYURMUScsXG4gICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgJ0Z1bmN0aW9uIGlzIHVzZWQgb25seSBhcyBjdXN0b20gcmVzb3VyY2UgZHVyaW5nIENESyBkZXBsb3ltZW50LiBFcnJvcnMgd2lsbCBiZSBoYW5kbGVkIGJ5IENsb3VkRm9ybWF0aW9uLicsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICAgIC8vIENvbm5lY3Rpb25zIHdpbGwgcmVxdWlyZSBhbiBhcnJheSBvZiByZWZlcmVuY2VzIHdoZXJlIHRoZXkgYXJlIGRlZmluZWRcbiAgICBsZXQgY29ubmVjdGlvbnNDb25maWd1cmVkOiBDb25maWd1cmF0aW9uRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICBpZiAoam9iQ29uZmlnLmNvbm5lY3Rpb25zKSB7XG4gICAgICBjb25uZWN0aW9uc0NvbmZpZ3VyZWQgPSB7XG4gICAgICAgIGNvbm5lY3Rpb25zOiBqb2JDb25maWcuY29ubmVjdGlvbnMsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGRlZmF1bHRBcmd1bWVudHNbJy0tVGVtcERpciddID0gYHMzOi8vJHt0aGlzLnByb3BzLnByb2plY3RCdWNrZXROYW1lfS90ZW1wL2pvYnMvJHtqb2JOYW1lfWA7XG5cbiAgICAvLyBhZGQgY29udGludW91cyBsb2dnaW5nIHVubGVzcyBleHBsaWNpdGx5IGRpc2FibGVkXG4gICAgaWYgKGpvYkNvbmZpZy5jb250aW51b3VzTG9nZ2luZykge1xuICAgICAgY29uc3QgbG9nR3JvdXBOYW1lID0gam9iTmFtZTtcbiAgICAgIGNvbnN0IGxvZ0dyb3VwTmFtZVBhdGhQcmVmaXggPSAnL2F3cy9nbHVlJztcbiAgICAgIGRlZmF1bHRBcmd1bWVudHNbJy0tY29udGludW91cy1sb2ctbG9nR3JvdXAnXSA9IHRoaXMuY3JlYXRlTG9nR3JvdXAoXG4gICAgICAgIGxvZ0dyb3VwTmFtZVBhdGhQcmVmaXgsXG4gICAgICAgIGxvZ0dyb3VwTmFtZSxcbiAgICAgICAgam9iQ29uZmlnLmNvbnRpbnVvdXNMb2dnaW5nLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coYENvbnRpbnVvdXMgbG9nZ2luZyBub3QgZW5hYmxlZCBmb3Igam9iOiAke2pvYk5hbWV9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXRQYXJhbXMgPSBkZWZhdWx0QXJndW1lbnRzWyctLWlucHV0X3BhcmFtcyddO1xuICAgIGlmIChpbnB1dFBhcmFtcykge1xuICAgICAgZGVmYXVsdEFyZ3VtZW50c1snLS1pbnB1dF9wYXJhbXMnXSA9IEpTT04uc3RyaW5naWZ5KGlucHV0UGFyYW1zKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnByb3BzLnNlY3VyaXR5Q29uZmlndXJhdGlvbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VjdXJpdHkgY29uZmlndXJhdGlvbiBuYW1lIGlzIHJlcXVpcmVkIGZvciBqb2IgbW9uaXRvcmluZyBldmVudCBydWxlJyk7XG4gICAgfVxuICAgIGNvbnN0IGpvYiA9IG5ldyBNZGFhQ2ZuSm9iKHRoaXMuc2NvcGUsIGAke2pvYk5hbWV9LWpvYmAsIHtcbiAgICAgIGNvbW1hbmQ6IHtcbiAgICAgICAgbmFtZTogam9iQ29uZmlnLmNvbW1hbmQubmFtZSxcbiAgICAgICAgcHl0aG9uVmVyc2lvbjogam9iQ29uZmlnLmNvbW1hbmQucHl0aG9uVmVyc2lvbixcbiAgICAgICAgc2NyaXB0TG9jYXRpb246IGBzMzovLyR7c2NyaXB0RGVwbG95bWVudC5kZXBsb3llZEJ1Y2tldC5idWNrZXROYW1lfS8ke3NjcmlwdERlcGxveW1lbnRQYXRofS8ke3NjcmlwdE5hbWV9YCxcbiAgICAgIH0sXG4gICAgICByb2xlOiBqb2JDb25maWcuZXhlY3V0aW9uUm9sZUFybixcbiAgICAgIGFsbG9jYXRlZENhcGFjaXR5OiBqb2JDb25maWcuYWxsb2NhdGVkQ2FwYWNpdHksXG4gICAgICBjb25uZWN0aW9uczogY29ubmVjdGlvbnNDb25maWd1cmVkLFxuICAgICAgZGVmYXVsdEFyZ3VtZW50czogZGVmYXVsdEFyZ3VtZW50cyxcbiAgICAgIGRlc2NyaXB0aW9uOiBqb2JDb25maWcuZGVzY3JpcHRpb24sXG4gICAgICBleGVjdXRpb25Qcm9wZXJ0eTogam9iQ29uZmlnLmV4ZWN1dGlvblByb3BlcnR5LFxuICAgICAgZ2x1ZVZlcnNpb246IGpvYkNvbmZpZy5nbHVlVmVyc2lvbixcbiAgICAgIG1heENhcGFjaXR5OiBqb2JDb25maWcubWF4Q2FwYWNpdHksXG4gICAgICBtYXhSZXRyaWVzOiBqb2JDb25maWcubWF4UmV0cmllcyxcbiAgICAgIG5hbWU6IGpvYk5hbWUsXG4gICAgICBub3RpZmljYXRpb25Qcm9wZXJ0eTogam9iQ29uZmlnLm5vdGlmaWNhdGlvblByb3BlcnR5LFxuICAgICAgbnVtYmVyT2ZXb3JrZXJzOiBqb2JDb25maWcubnVtYmVyT2ZXb3JrZXJzLFxuICAgICAgc2VjdXJpdHlDb25maWd1cmF0aW9uOiB0aGlzLnByb3BzLnNlY3VyaXR5Q29uZmlndXJhdGlvbk5hbWUsXG4gICAgICB0aW1lb3V0OiBqb2JDb25maWcudGltZW91dCxcbiAgICAgIHdvcmtlclR5cGU6IGpvYkNvbmZpZy53b3JrZXJUeXBlLFxuICAgICAgbmFtaW5nOiB0aGlzLnByb3BzLm5hbWluZyxcbiAgICB9KTtcbiAgICBpZiAoam9iLm5hbWUpIHtcbiAgICAgIERhdGFPcHNQcm9qZWN0VXRpbHMuY3JlYXRlUHJvamVjdFNTTVBhcmFtKFxuICAgICAgICB0aGlzLnNjb3BlLFxuICAgICAgICB0aGlzLnByb3BzLm5hbWluZyxcbiAgICAgICAgdGhpcy5wcm9wcy5wcm9qZWN0TmFtZSxcbiAgICAgICAgYGpvYi9uYW1lLyR7am9iTmFtZX1gLFxuICAgICAgICBqb2IubmFtZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGV2ZW50UnVsZSA9IHRoaXMuY3JlYXRlSm9iTW9uaXRvcmluZ0V2ZW50UnVsZShgJHtqb2JOYW1lfS1tb25pdG9yYCwgW2pvYi5uYW1lXSk7XG4gICAgICBpZiAoIXRoaXMucHJvcHMubm90aWZpY2F0aW9uVG9waWNBcm4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3RpZmljYXRpb24gdG9waWMgQVJOIGlzIHJlcXVpcmVkIGZvciBqb2IgbW9uaXRvcmluZyBldmVudCBydWxlJyk7XG4gICAgICB9XG4gICAgICBldmVudFJ1bGUuYWRkVGFyZ2V0KFxuICAgICAgICBuZXcgU25zVG9waWMoTWRhYVNuc1RvcGljLmZyb21Ub3BpY0Fybih0aGlzLnNjb3BlLCBgJHtqb2JOYW1lfS10b3BpY2AsIHRoaXMucHJvcHMubm90aWZpY2F0aW9uVG9waWNBcm4pKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVKb2JNb25pdG9yaW5nRXZlbnRSdWxlKHJ1bGVOYW1lOiBzdHJpbmcsIGpvYk5hbWVzOiBzdHJpbmdbXSk6IFJ1bGUge1xuICAgIHJldHVybiBFdmVudEJyaWRnZUhlbHBlci5jcmVhdGVHbHVlTW9uaXRvcmluZ0V2ZW50UnVsZShcbiAgICAgIHRoaXMuc2NvcGUsXG4gICAgICB0aGlzLnByb3BzLm5hbWluZyxcbiAgICAgIHJ1bGVOYW1lLFxuICAgICAgJ1dvcmtmbG93IEpvYiBmYWlsdXJlIGV2ZW50cycsXG4gICAgICB7XG4gICAgICAgIGpvYk5hbWU6IGpvYk5hbWVzLFxuICAgICAgICBzdGF0ZTogWydGQUlMRUQnLCAnVElNRU9VVCcsICdTVE9QUEVEJ10sXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUxvZ0dyb3VwKGxvZ0dyb3VwTmFtZVBhdGhQcmVmaXg6IHN0cmluZywgbG9nR3JvdXBOYW1lOiBzdHJpbmcsIGxvZ2dpbmdDb25maWc6IExvZ2dpbmdDb25maWcpOiBzdHJpbmcge1xuICAgIGxldCBsb2dHcm91cFJldGVudGlvbkRheXM6IFJldGVudGlvbkRheXM7XG5cbiAgICBpZiAobG9nZ2luZ0NvbmZpZy5sb2dHcm91cFJldGVudGlvbkRheXMgIT0gMCkge1xuICAgICAgbG9nR3JvdXBSZXRlbnRpb25EYXlzID0gbG9nZ2luZ0NvbmZpZy5sb2dHcm91cFJldGVudGlvbkRheXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ0dyb3VwUmV0ZW50aW9uRGF5cyA9IFJldGVudGlvbkRheXMuSU5GSU5JVEU7XG4gICAgfVxuXG4gICAgY29uc3QgbG9nUHJvcHMgPSB7XG4gICAgICBuYW1pbmc6IHRoaXMucHJvcHMubmFtaW5nLFxuICAgICAgbG9nR3JvdXBOYW1lOiBsb2dHcm91cE5hbWUsXG4gICAgICBsb2dHcm91cE5hbWVQYXRoUHJlZml4OiBsb2dHcm91cE5hbWVQYXRoUHJlZml4LFxuICAgICAgZW5jcnlwdGlvbktleTogdGhpcy5wcm9qZWN0S21zS2V5LFxuICAgICAgcmV0ZW50aW9uOiBsb2dHcm91cFJldGVudGlvbkRheXMsXG4gICAgfTtcbiAgICBuZXcgTWRhYUxvZ0dyb3VwKHRoaXMsIGxvZ0dyb3VwTmFtZSwgbG9nUHJvcHMpO1xuICAgIC8vIGB1cGRhdGVQcm9wc2AgYWx3YXlzIHJldHVybnMgYSBwcm9wIHdpdGggYSBsb2dHcm91cE5hbWVcbiAgICByZXR1cm4gdXBkYXRlUHJvcHMobG9nUHJvcHMpLmxvZ0dyb3VwTmFtZSE7XG4gIH1cbn1cbiJdfQ==
package/lib/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /*!
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ export * from './dataops-job-l3-construct';
package/lib/index.js ADDED
@@ -0,0 +1,24 @@
1
+ /*!
2
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+
6
+ "use strict";
7
+
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
20
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ __exportStar(require("./dataops-job-l3-construct"), exports);
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsNkRBQTJDIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9kYXRhb3BzLWpvYi1sMy1jb25zdHJ1Y3QnO1xuIl19
@@ -0,0 +1,185 @@
1
+ # S3 Bucket Policy Helper
2
+
3
+ This is a helper class that helps construct working S3 Bucket policy statements that can be added to a bucket construct.
4
+
5
+ ## Class RestrictObjectPrefixToRoles
6
+
7
+ This helper class helps construct a working policy that allows a group of Roles to access to an object prefix in S3.
8
+
9
+ Depending on the values provided, it will produce two PolicyStatement types accessible by methods.
10
+
11
+ One for Read access to an object prefix that generally resolves to:
12
+
13
+ ```yaml
14
+ - Action: s3:GetObject*
15
+ Condition:
16
+ StringLike:
17
+ aws:userId:
18
+ - AROA12345678:*
19
+ Effect: Allow
20
+ Principal: "*"
21
+ Resource:
22
+ Fn::Join:
23
+ - ""
24
+ - - Fn::GetAtt:
25
+ - BuckettransformedCbdgadDatalakeTransformedPrototype20210115E093F710
26
+ - Arn
27
+ - /inventory/*
28
+ Sid: inventory/Read
29
+ ```
30
+
31
+ One for write access to an object prefix that generally resolves to:
32
+
33
+ ```yaml
34
+ - Action:
35
+ - s3:GetObject*
36
+ - s3:PutObject*
37
+ - s3:DeleteObject*
38
+ Condition:
39
+ StringLike:
40
+ aws:userId:
41
+ - AROA12345678:*
42
+ Effect: Allow
43
+ Principal: "*"
44
+ Resource:
45
+ Fn::Join:
46
+ - ""
47
+ - - Fn::GetAtt:
48
+ - BuckettransformedCbdgadDatalakeTransformedPrototype20210115E093F710
49
+ - Arn
50
+ - /inventory/*
51
+ Sid: inventory/ReadWrite
52
+ ```
53
+
54
+ Conditionals against `aws:userId` are used to support federated roles. The `@aws-mdaa/iam-role-helper` is used to resolve the requested ARNs to AROA IDs.
55
+
56
+ ## RestrictObjectPrefixToRoles example
57
+
58
+ ```typescript
59
+ import {MdaaRoleResolver} from '@aws-mdaa/am-role-helper'
60
+ import {RestrictObjectPrefixToRoles} from '@aws-mdaa/3-bucketpolicy-helper'
61
+
62
+ const roleResolver = new MdaaRoleResolver({
63
+ roleArns: [
64
+ 'arn:{{partition}}:iam::{{account}}:role/application_abc/component_xyz/S3Access',
65
+ 'arn:{{partition}}:iam::{{account}}:role/service-role/QuickSightAction'
66
+ ]
67
+ })
68
+
69
+ roleResolver.init().then(() => {
70
+ const RestrictPrefix = new RestrictObjectPrefixToRoles({
71
+ // bucket in this context is a constructed s3.Bucket class
72
+ s3Bucket: bucket,
73
+ s3Prefix: '/protected',
74
+ readRoles: [
75
+ 'arn:{{partition}}:iam::{{account}}:role/application_abc/component_xyz/S3Access',
76
+ 'arn:{{partition}}:iam::{{account}}:role/service-role/QuickSightAction'
77
+ ],
78
+ readWriteRoles: [
79
+ 'arn:{{partition}}:iam::{{account}}:role/application_abc/component_xyz/S3Access'
80
+ ],
81
+ roleAroaResolver: roleResolver
82
+ })
83
+
84
+ bucket.addToResourcePolicy(RestrictPrefix.readStatement())
85
+ bucket.addToResourcePolicy(RestrictPrefix.readWriteStatement())
86
+ })
87
+ ```
88
+
89
+ ## Class RestrictBucketToRoles
90
+
91
+ Helper class to construct a policy that will restrict a bucket to a set of roles. This is realized through a Deny where source role is not on the list, and an Allow where source role is.
92
+
93
+ Depending on the values provided, it will produce two PolicyStatement types accessible by methods.
94
+
95
+ One for general bucket access that resolves to:
96
+
97
+ ```yaml
98
+ - Action:
99
+ - s3:List*
100
+ - s3:GetBucket*
101
+ Condition:
102
+ StringLike:
103
+ aws:userId:
104
+ - AROA12345678:*
105
+ Effect: Allow
106
+ Principal: "*"
107
+ Resource:
108
+ - Fn::Join:
109
+ - ""
110
+ - - Fn::GetAtt:
111
+ - BuckettransformedCbdgadDatalakeTransformedPrototype20210115E093F710
112
+ - Arn
113
+ - /*
114
+ - Fn::GetAtt:
115
+ - BuckettransformedCbdgadDatalakeTransformedPrototype20210115E093F710
116
+ - Arn
117
+ Sid: BucketAllow
118
+ ```
119
+
120
+ One that denies access to the bucket that resolves to:
121
+
122
+ NOTE: To permit things like inventory we exclude the s3 service from the Deny statements. Also since we're using a NotPrincipal statement, we also include the root account to assure access to the bucket isn't lost if the Roles are deleted.
123
+
124
+ ```yaml
125
+ - Action:
126
+ - s3:PutObject*
127
+ - s3:GetObject*
128
+ - s3:List*
129
+ - s3:GetBucket*
130
+ Condition:
131
+ StringNotLike:
132
+ aws:userId:
133
+ - AROA12345678:*
134
+ Effect: Deny
135
+ NotPrincipal:
136
+ Service: s3.amazonaws.com
137
+ AWS:
138
+ Fn::Join:
139
+ - ""
140
+ - - "arn:"
141
+ - Ref: AWS::Partition
142
+ - ":iam::"
143
+ - Ref: AWS::AccountId
144
+ - :root
145
+ Resource:
146
+ - Fn::Join:
147
+ - ""
148
+ - - Fn::GetAtt:
149
+ - BuckettransformedCbdgadDatalakeTransformedPrototype20210115E093F710
150
+ - Arn
151
+ - /*
152
+ - Fn::GetAtt:
153
+ - BuckettransformedCbdgadDatalakeTransformedPrototype20210115E093F710
154
+ - Arn
155
+ Sid: BucketDeny
156
+ ```
157
+
158
+ ## RestrictBucketToRoles example
159
+
160
+ ```typescript
161
+ import {MdaaRoleResolver} from '@aws-mdaa/am-role-helper'
162
+ import {RestrictBucketToRoles} from '@aws-mdaa/3-bucketpolicy-helper'
163
+
164
+ const roleResolver = new MdaaRoleResolver({
165
+ roleArns: [
166
+ 'arn:{{partition}}:iam::{{account}}:role/application_abc/component_xyz/S3Access',
167
+ 'arn:{{partition}}:iam::{{account}}:role/service-role/QuickSightAction'
168
+ ]
169
+ })
170
+
171
+ roleResolver.init().then(() => {
172
+ const RestrictBucket = new RestrictBucketToRoles({
173
+ // bucket in this context is a constructed s3.Bucket class
174
+ s3Bucket: bucket,
175
+ roles: [
176
+ 'arn:{{partition}}:iam::{{account}}:role/application_abc/component_xyz/S3Access',
177
+ 'arn:{{partition}}:iam::{{account}}:role/service-role/QuickSightAction'
178
+ ],
179
+ roleAroaResolver: roleResolver
180
+ })
181
+
182
+ bucket.addToResourcePolicy(RestrictBucket.allowStatement())
183
+ bucket.addToResourcePolicy(RestrictBucket.denyStatement())
184
+ })
185
+ ```