@revxui/api-clients-ts 1.1.498-beta02 → 1.1.500

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 (1168) hide show
  1. package/README.md +4 -6
  2. package/api/adminController.service.d.ts +74 -0
  3. package/api/advertiserController.service.d.ts +107 -75
  4. package/api/api.d.ts +9 -21
  5. package/api/appSettingsController.service.d.ts +37 -24
  6. package/api/appsFlyerController.service.d.ts +6 -4
  7. package/api/audienceController.service.d.ts +160 -112
  8. package/api/auditController.service.d.ts +31 -25
  9. package/api/bidFunnelController.service.d.ts +18 -14
  10. package/api/bulkStrategyController.service.d.ts +32 -22
  11. package/api/cSSThemeController_.service.d.ts +12 -8
  12. package/api/campaignController.service.d.ts +76 -54
  13. package/api/catalogController.service.d.ts +38 -28
  14. package/api/clickDestinationController.service.d.ts +34 -24
  15. package/api/creativeController.service.d.ts +103 -73
  16. package/api/creativeSetsController.service.d.ts +117 -85
  17. package/api/creativeSetsV2Controller.service.d.ts +48 -26
  18. package/api/creativeTemplateThemesController.service.d.ts +25 -17
  19. package/api/creativeTemplateVariablesController.service.d.ts +5 -3
  20. package/api/creativeTemplatesController.service.d.ts +24 -18
  21. package/api/customerReportingController.service.d.ts +26 -14
  22. package/api/dCOVideoSettingsController.service.d.ts +82 -54
  23. package/api/dashboardController.service.d.ts +130 -98
  24. package/api/experimentsController.service.d.ts +130 -90
  25. package/api/notificationsController.service.d.ts +45 -21
  26. package/api/pixelController.service.d.ts +46 -32
  27. package/api/reportController.service.d.ts +16 -12
  28. package/api/reportingController.service.d.ts +25 -19
  29. package/api/reportingSchedulerController.service.d.ts +49 -35
  30. package/api/safeguardController.service.d.ts +192 -0
  31. package/api/sliceXController.service.d.ts +67 -49
  32. package/api/strategyController.service.d.ts +242 -165
  33. package/api/strategyTemplateController.service.d.ts +14 -10
  34. package/api/uILoggerController.service.d.ts +32 -0
  35. package/api/userPreferenceController.service.d.ts +69 -0
  36. package/esm2020/api/adminController.service.mjs +185 -0
  37. package/esm2020/api/advertiserController.service.mjs +173 -73
  38. package/esm2020/api/api.mjs +10 -22
  39. package/esm2020/api/appSettingsController.service.mjs +66 -30
  40. package/esm2020/api/appsFlyerController.service.mjs +16 -9
  41. package/esm2020/api/audienceController.service.mjs +260 -121
  42. package/esm2020/api/auditController.service.mjs +66 -47
  43. package/esm2020/api/bidFunnelController.service.mjs +43 -30
  44. package/esm2020/api/bulkStrategyController.service.mjs +55 -28
  45. package/esm2020/api/cSSThemeController_.service.mjs +25 -12
  46. package/esm2020/api/campaignController.service.mjs +124 -59
  47. package/esm2020/api/catalogController.service.mjs +55 -27
  48. package/esm2020/api/clickDestinationController.service.mjs +58 -30
  49. package/esm2020/api/creativeController.service.mjs +191 -102
  50. package/esm2020/api/creativeSetsController.service.mjs +187 -98
  51. package/esm2020/api/creativeSetsV2Controller.service.mjs +69 -37
  52. package/esm2020/api/creativeTemplateThemesController.service.mjs +47 -24
  53. package/esm2020/api/creativeTemplateVariablesController.service.mjs +15 -8
  54. package/esm2020/api/creativeTemplatesController.service.mjs +41 -23
  55. package/esm2020/api/customerReportingController.service.mjs +43 -26
  56. package/esm2020/api/dCOVideoSettingsController.service.mjs +168 -76
  57. package/esm2020/api/dashboardController.service.mjs +217 -120
  58. package/esm2020/api/experimentsController.service.mjs +220 -87
  59. package/esm2020/api/notificationsController.service.mjs +92 -22
  60. package/esm2020/api/pixelController.service.mjs +83 -39
  61. package/esm2020/api/reportController.service.mjs +31 -20
  62. package/esm2020/api/reportingController.service.mjs +40 -23
  63. package/esm2020/api/reportingSchedulerController.service.mjs +97 -54
  64. package/esm2020/api/safeguardController.service.mjs +502 -0
  65. package/esm2020/api/sliceXController.service.mjs +107 -61
  66. package/esm2020/api/strategyController.service.mjs +381 -178
  67. package/esm2020/api/strategyTemplateController.service.mjs +25 -16
  68. package/esm2020/api/uILoggerController.service.mjs +100 -0
  69. package/esm2020/api/userPreferenceController.service.mjs +182 -0
  70. package/esm2020/api.module.mjs +13 -31
  71. package/esm2020/encoder.mjs +1 -1
  72. package/esm2020/model/aBTestDTO.mjs +1 -1
  73. package/esm2020/model/aBTestingDTO.mjs +15 -13
  74. package/esm2020/model/aBTestingResponseDetails.mjs +15 -13
  75. package/esm2020/model/aBTestingVariantDTO.mjs +27 -2
  76. package/esm2020/model/abandonedSessionUserTargeting.mjs +4 -4
  77. package/esm2020/model/activityLog.mjs +1 -12
  78. package/esm2020/model/activityLogsCreativeSetsBulkUpdateDTO.mjs +11 -2
  79. package/esm2020/model/activityLogsStrategyBulkUpdateDTO.mjs +11 -2
  80. package/esm2020/model/adBreak.mjs +1 -12
  81. package/esm2020/model/adFormatCount.mjs +4 -4
  82. package/esm2020/model/adPod.mjs +1 -12
  83. package/esm2020/model/adoDTO.mjs +1 -1
  84. package/esm2020/model/adoPersonDetails.mjs +4 -4
  85. package/esm2020/model/advertiser.mjs +1 -1
  86. package/esm2020/model/advertiserAppSettingsDTO.mjs +27 -5
  87. package/esm2020/model/advertiserCohortDTO.mjs +12 -5
  88. package/esm2020/model/advertiserCohortResponse.mjs +9 -13
  89. package/esm2020/model/advertiserCohortResponseList.mjs +1 -12
  90. package/esm2020/model/advertiserCurrencyData.mjs +4 -4
  91. package/esm2020/model/advertiserDynamicDetails.mjs +1 -1
  92. package/esm2020/model/advertiserDynamicVideoConfig.mjs +1 -12
  93. package/esm2020/model/advertiserLayoutVariables.mjs +4 -4
  94. package/esm2020/model/advertiserPojo.mjs +1 -1
  95. package/esm2020/model/advertiserSettings.mjs +9 -2
  96. package/esm2020/model/ageGroup.mjs +4 -4
  97. package/esm2020/model/apiListResponseABTestDTO.mjs +1 -12
  98. package/esm2020/model/apiListResponseActivityLog.mjs +1 -12
  99. package/esm2020/model/apiListResponseActivityLogsCreativeSetsBulkUpdateDTO.mjs +1 -12
  100. package/esm2020/model/apiListResponseActivityLogsStrategyBulkUpdateDTO.mjs +1 -12
  101. package/esm2020/model/apiListResponseAudiencePerformanceDTO.mjs +1 -12
  102. package/esm2020/model/apiListResponseBaseModel.mjs +1 -12
  103. package/esm2020/model/apiListResponseCatalogFeed.mjs +1 -12
  104. package/esm2020/model/apiListResponseClickDestination.mjs +1 -12
  105. package/esm2020/model/apiListResponseCreativeCompactDTO.mjs +1 -12
  106. package/esm2020/model/apiListResponseCreativeDTO.mjs +1 -12
  107. package/esm2020/model/apiListResponseCreativePerformanceList.mjs +1 -12
  108. package/esm2020/model/apiListResponseCreativeSetDashboardMetric.mjs +1 -12
  109. package/esm2020/model/apiListResponseCreativeSetPerformanceList.mjs +1 -12
  110. package/esm2020/model/apiListResponseCreativeSizeMappingDTO.mjs +1 -12
  111. package/esm2020/model/apiListResponseCreativeTemplateDTO.mjs +1 -12
  112. package/esm2020/model/apiListResponseHotstarNativeFileRequest.mjs +1 -12
  113. package/esm2020/model/apiListResponseMacro.mjs +1 -12
  114. package/esm2020/model/apiListResponsePixel.mjs +1 -12
  115. package/esm2020/model/apiListResponseReportingSchedulerResponse.mjs +1 -12
  116. package/esm2020/model/apiListResponseReportingSchedulerUserResponse.mjs +1 -12
  117. package/esm2020/model/apiListResponseSizeWithPreview.mjs +1 -12
  118. package/esm2020/model/apiListResponseStrategyRuleResponse.mjs +1 -12
  119. package/esm2020/model/apiListResponseStrategyTemplateResponse.mjs +1 -12
  120. package/esm2020/model/apiListResponseVariablesMappingDTO.mjs +1 -12
  121. package/esm2020/model/apiResponseObjectABTestDTO.mjs +1 -1
  122. package/esm2020/model/apiResponseObjectABTestingResponseDetails.mjs +1 -1
  123. package/esm2020/model/apiResponseObjectAdvertiserCohortResponseList.mjs +1 -1
  124. package/esm2020/model/apiResponseObjectAdvertiserCurrencyData.mjs +1 -1
  125. package/esm2020/model/apiResponseObjectAdvertiserDynamicDetails.mjs +1 -1
  126. package/esm2020/model/apiResponseObjectAdvertiserDynamicVideoConfig.mjs +1 -1
  127. package/esm2020/model/apiResponseObjectAdvertiserPojo.mjs +1 -1
  128. package/esm2020/model/apiResponseObjectAdvertiserSettings.mjs +1 -1
  129. package/esm2020/model/apiResponseObjectApiListResponseActivityLogsCreativeSetsBulkUpdateDTO.mjs +1 -1
  130. package/esm2020/model/apiResponseObjectApiListResponseActivityLogsStrategyBulkUpdateDTO.mjs +1 -1
  131. package/esm2020/model/apiResponseObjectApiListResponseAudiencePerformanceDTO.mjs +1 -1
  132. package/esm2020/model/apiResponseObjectApiListResponseBaseModel.mjs +1 -1
  133. package/esm2020/model/apiResponseObjectApiListResponseCatalogFeed.mjs +1 -1
  134. package/esm2020/model/apiResponseObjectApiListResponseClickDestination.mjs +1 -1
  135. package/esm2020/model/apiResponseObjectApiListResponseCreativeCompactDTO.mjs +1 -1
  136. package/esm2020/model/apiResponseObjectApiListResponseCreativeDTO.mjs +1 -1
  137. package/esm2020/model/apiResponseObjectApiListResponseCreativePerformanceList.mjs +1 -1
  138. package/esm2020/model/apiResponseObjectApiListResponseCreativeSetDashboardMetric.mjs +1 -1
  139. package/esm2020/model/apiResponseObjectApiListResponseCreativeSetPerformanceList.mjs +1 -1
  140. package/esm2020/model/apiResponseObjectApiListResponseCreativeTemplateDTO.mjs +1 -1
  141. package/esm2020/model/apiResponseObjectApiListResponsePixel.mjs +1 -1
  142. package/esm2020/model/apiResponseObjectApiListResponseVariablesMappingDTO.mjs +1 -1
  143. package/esm2020/model/apiResponseObjectArrayListCombinedAudienceAnalysisResponse.mjs +1 -12
  144. package/esm2020/model/apiResponseObjectAudienceAccessDTO.mjs +1 -1
  145. package/esm2020/model/apiResponseObjectAudienceDTO.mjs +1 -1
  146. package/esm2020/model/apiResponseObjectBaseModel.mjs +1 -1
  147. package/esm2020/model/apiResponseObjectBidToConversionDTO.mjs +1 -1
  148. package/esm2020/model/apiResponseObjectBidToConversionFilterMap.mjs +1 -1
  149. package/esm2020/model/apiResponseObjectBudgetStatsDTO.mjs +1 -1
  150. package/esm2020/model/apiResponseObjectBulkEditCreativeSetsResponse.mjs +1 -1
  151. package/esm2020/model/apiResponseObjectBulkEditStrategiesResponse.mjs +1 -1
  152. package/esm2020/model/apiResponseObjectBulkstrategiesUpdateResponse.mjs +1 -1
  153. package/esm2020/model/apiResponseObjectCampaignDTO.mjs +1 -1
  154. package/esm2020/model/apiResponseObjectCampaignDTOList.mjs +1 -1
  155. package/esm2020/model/apiResponseObjectCatalogFeed.mjs +1 -1
  156. package/esm2020/model/apiResponseObjectChartDashboardResponse.mjs +1 -1
  157. package/esm2020/model/apiResponseObjectClickDestination.mjs +1 -1
  158. package/esm2020/model/apiResponseObjectClickDestinationAutomationUrls.mjs +1 -1
  159. package/esm2020/model/apiResponseObjectCohortCampaignStrategyResponse.mjs +1 -1
  160. package/esm2020/model/apiResponseObjectCreativeDTO.mjs +1 -1
  161. package/esm2020/model/apiResponseObjectCreativePerformanceData.mjs +1 -1
  162. package/esm2020/model/apiResponseObjectCreativePreviewDTO.mjs +1 -1
  163. package/esm2020/model/apiResponseObjectCreativeSetDetails.mjs +1 -1
  164. package/esm2020/model/apiResponseObjectCreativeSetResponse.mjs +1 -1
  165. package/esm2020/model/apiResponseObjectCreativeTemplatesMetadataDTO.mjs +1 -1
  166. package/esm2020/model/apiResponseObjectDashboardMetrics.mjs +1 -1
  167. package/esm2020/model/apiResponseObjectDashboardResponse.mjs +1 -1
  168. package/esm2020/model/apiResponseObjectDcoVideoActivateResponse.mjs +1 -1
  169. package/esm2020/model/apiResponseObjectDcoVideoAssetUploadResponse.mjs +1 -1
  170. package/esm2020/model/apiResponseObjectDcoVideoDeleteResponse.mjs +1 -1
  171. package/esm2020/model/apiResponseObjectDcoVideoGenerateSampleResponse.mjs +1 -1
  172. package/esm2020/model/apiResponseObjectDcoVideoGeneratedCountResponse.mjs +1 -1
  173. package/esm2020/model/apiResponseObjectDcoVideoSamplesResponse.mjs +1 -1
  174. package/esm2020/model/apiResponseObjectDcoVideoSettingsDTO.mjs +1 -1
  175. package/esm2020/model/apiResponseObjectDictionaryResponse.mjs +1 -1
  176. package/esm2020/model/apiResponseObjectDmpAudienceDTO.mjs +1 -1
  177. package/esm2020/model/apiResponseObjectDuplicateCreativeSetResponse.mjs +1 -1
  178. package/esm2020/model/apiResponseObjectEResponseobject.mjs +2 -0
  179. package/esm2020/model/apiResponseObjectEligibleUsersResponse.mjs +1 -1
  180. package/esm2020/model/apiResponseObjectFileDownloadResponse.mjs +1 -1
  181. package/esm2020/model/apiResponseObjectGeoListDTO.mjs +1 -1
  182. package/esm2020/model/apiResponseObjectIncrementalityTestCreateFormAudienceResponseObject.mjs +1 -1
  183. package/esm2020/model/apiResponseObjectIncrementalityTestDetails.mjs +1 -1
  184. package/esm2020/model/apiResponseObjectIncrementalityTestReportCalculationDetails.mjs +1 -1
  185. package/esm2020/model/apiResponseObjectIncrementalityTestResponse.mjs +1 -1
  186. package/esm2020/model/apiResponseObjectJsonNode.mjs +1 -1
  187. package/esm2020/model/apiResponseObjectListABTestingResponseDetails.mjs +1 -12
  188. package/esm2020/model/apiResponseObjectListAppSettingsDTO.mjs +1 -12
  189. package/esm2020/model/apiResponseObjectListAudienceDTO.mjs +1 -12
  190. package/esm2020/model/apiResponseObjectListAuditDetails.mjs +1 -12
  191. package/esm2020/model/apiResponseObjectListAuditMarker.mjs +1 -12
  192. package/esm2020/model/apiResponseObjectListBackfillAudienceQueryTemplateDTO.mjs +1 -12
  193. package/esm2020/model/apiResponseObjectListBaseModel.mjs +1 -12
  194. package/esm2020/model/apiResponseObjectListBulkstrategiesValidationResponse.mjs +1 -12
  195. package/esm2020/model/apiResponseObjectListCampaignDTO.mjs +1 -12
  196. package/esm2020/model/apiResponseObjectListCreativeEntity.mjs +1 -12
  197. package/esm2020/model/apiResponseObjectListCreativeFiles.mjs +1 -12
  198. package/esm2020/model/apiResponseObjectListCreativeMetaData.mjs +1 -12
  199. package/esm2020/model/apiResponseObjectListDashboardResponse.mjs +1 -12
  200. package/esm2020/model/apiResponseObjectListDcoVideoBrandGuidelineDTO.mjs +1 -12
  201. package/esm2020/model/apiResponseObjectListDcoVideoDimensionDTO.mjs +1 -12
  202. package/esm2020/model/apiResponseObjectListDcoVideoMusicTrackDTO.mjs +1 -12
  203. package/esm2020/model/apiResponseObjectListDcoVideoSettingsDTO.mjs +1 -12
  204. package/esm2020/model/apiResponseObjectListDcoVideoTemplateDTO.mjs +1 -12
  205. package/esm2020/model/apiResponseObjectListDynamicVideoTemplate.mjs +1 -12
  206. package/esm2020/model/apiResponseObjectListExperimentsEntity.mjs +1 -12
  207. package/esm2020/model/apiResponseObjectListIncrementalityTestDetails.mjs +1 -12
  208. package/esm2020/model/apiResponseObjectListMapstringobject.mjs +2 -0
  209. package/esm2020/model/apiResponseObjectListMenuCrubResponse.mjs +1 -12
  210. package/esm2020/model/apiResponseObjectListSafeguardAlertDTO.mjs +2 -0
  211. package/esm2020/model/apiResponseObjectListSafeguardBlockedItemDTO.mjs +1 -12
  212. package/esm2020/model/apiResponseObjectListSafeguardDetail.mjs +1 -12
  213. package/esm2020/model/apiResponseObjectListSafeguardExclusionDTO.mjs +1 -12
  214. package/esm2020/model/apiResponseObjectListSafeguardRuleMasterEntity.mjs +1 -12
  215. package/esm2020/model/apiResponseObjectListSliceXBudgetUtilisationResponse.mjs +1 -12
  216. package/esm2020/model/apiResponseObjectListSliceXStaticMetaDataResponse.mjs +1 -12
  217. package/esm2020/model/apiResponseObjectListSliceXWinReachResponse.mjs +1 -12
  218. package/esm2020/model/apiResponseObjectListStrategy.mjs +1 -12
  219. package/esm2020/model/apiResponseObjectListStrategyCreativeSetsCloneDataResponse.mjs +1 -12
  220. package/esm2020/model/apiResponseObjectListTemplateThemeDTO.mjs +1 -12
  221. package/esm2020/model/apiResponseObjectListTemplateVariablesDTO.mjs +1 -12
  222. package/esm2020/model/apiResponseObjectListUserPreferenceDTO.mjs +1 -12
  223. package/esm2020/model/apiResponseObjectListstring.mjs +13 -0
  224. package/esm2020/model/apiResponseObjectMapintResponseMessage.mjs +2 -0
  225. package/esm2020/model/apiResponseObjectMaplongAdFormatCount.mjs +2 -0
  226. package/esm2020/model/apiResponseObjectMaplongResponseMessage.mjs +2 -0
  227. package/esm2020/model/apiResponseObjectMaplongstring.mjs +13 -0
  228. package/esm2020/model/apiResponseObjectMapstringlong.mjs +13 -0
  229. package/esm2020/model/apiResponseObjectMenuCrubResponse.mjs +1 -1
  230. package/esm2020/model/apiResponseObjectMetaRulesDto.mjs +1 -1
  231. package/esm2020/model/apiResponseObjectOptimizationRuleResponse.mjs +1 -1
  232. package/esm2020/model/apiResponseObjectParentBasedObject.mjs +1 -1
  233. package/esm2020/model/apiResponseObjectPixel.mjs +1 -1
  234. package/esm2020/model/apiResponseObjectReportResponse.mjs +1 -1
  235. package/esm2020/model/apiResponseObjectReportingResponse.mjs +1 -1
  236. package/esm2020/model/apiResponseObjectReportingSchedulerResponse.mjs +1 -1
  237. package/esm2020/model/apiResponseObjectResponseMessage.mjs +1 -1
  238. package/esm2020/model/apiResponseObjectSafeguardDetail.mjs +1 -1
  239. package/esm2020/model/apiResponseObjectSafeguardExclusionDTO.mjs +1 -1
  240. package/esm2020/model/apiResponseObjectSafeguardResponseDTO.mjs +1 -1
  241. package/esm2020/model/apiResponseObjectSiteListDTO.mjs +1 -1
  242. package/esm2020/model/apiResponseObjectSkadTargetPrivileges.mjs +1 -1
  243. package/esm2020/model/apiResponseObjectSlicexChartResponse.mjs +1 -1
  244. package/esm2020/model/apiResponseObjectSlicexListResponse.mjs +1 -1
  245. package/esm2020/model/apiResponseObjectStrategyAudienceIncTestMap.mjs +1 -1
  246. package/esm2020/model/apiResponseObjectStrategyCreativeAssociationResponseDTO.mjs +1 -1
  247. package/esm2020/model/apiResponseObjectStrategyDTO.mjs +1 -1
  248. package/esm2020/model/apiResponseObjectStrategyOptRecommendationResponse.mjs +1 -1
  249. package/esm2020/model/apiResponseObjectStrategyOptimizationDataResponse.mjs +1 -1
  250. package/esm2020/model/apiResponseObjectStrategyQuickEditDTO.mjs +1 -1
  251. package/esm2020/model/apiResponseObjectStrategyRuleResponse.mjs +1 -1
  252. package/esm2020/model/apiResponseObjectTag.mjs +1 -1
  253. package/esm2020/model/apiResponseObjectTargetingObject.mjs +1 -1
  254. package/esm2020/model/apiResponseObjectTemplateThemeDTO.mjs +1 -1
  255. package/esm2020/model/apiResponseObjectVoid.mjs +4 -4
  256. package/esm2020/model/apiResponseObjectWhitelabelingEntity.mjs +1 -1
  257. package/esm2020/model/apiResponseObjectWidgetPerformanceMetrics.mjs +1 -1
  258. package/esm2020/model/apiResponseObjectboolean.mjs +13 -0
  259. package/esm2020/model/apiResponseObjectlong.mjs +13 -0
  260. package/esm2020/model/apiResponseObjectstring.mjs +13 -0
  261. package/esm2020/model/appSettingsDTO.mjs +23 -13
  262. package/esm2020/model/appSettingsPropertyDTO.mjs +10 -5
  263. package/esm2020/model/assetSelectionDTO.mjs +8 -13
  264. package/esm2020/model/auctionTypeEditField.mjs +12 -5
  265. package/esm2020/model/audienceAccessDTO.mjs +4 -4
  266. package/esm2020/model/audienceAnalysisRequest.mjs +4 -4
  267. package/esm2020/model/audienceBackFilledStats.mjs +4 -4
  268. package/esm2020/model/audienceBackfillQueryTemplateRequest.mjs +14 -5
  269. package/esm2020/model/audienceBackfillRequest.mjs +9 -2
  270. package/esm2020/model/audienceDTO.mjs +38 -2
  271. package/esm2020/model/audienceESDTO.mjs +24 -5
  272. package/esm2020/model/audiencePerformanceDTO.mjs +8 -2
  273. package/esm2020/model/audienceStrDeviceDTO.mjs +1 -12
  274. package/esm2020/model/audienceStrEditField.mjs +1 -1
  275. package/esm2020/model/auditChange.mjs +4 -4
  276. package/esm2020/model/auditDetails.mjs +1 -12
  277. package/esm2020/model/auditMarker.mjs +4 -4
  278. package/esm2020/model/bIgIntegerEditFiled.mjs +4 -4
  279. package/esm2020/model/backfillAudienceQueryTemplateDTO.mjs +4 -4
  280. package/esm2020/model/bannerAdSuppDimensionsDTO.mjs +4 -4
  281. package/esm2020/model/baseModel.mjs +4 -4
  282. package/esm2020/model/baseModelEditField.mjs +1 -1
  283. package/esm2020/model/baseModelWithCreativeSetType.mjs +26 -5
  284. package/esm2020/model/bidToConversionDTO.mjs +1 -1
  285. package/esm2020/model/bidToConversionFilterDTO.mjs +4 -4
  286. package/esm2020/model/bidToConversionFilterMap.mjs +1 -12
  287. package/esm2020/model/bigDecimalEditField.mjs +4 -4
  288. package/esm2020/model/booleanEditField.mjs +4 -4
  289. package/esm2020/model/budgetCapStrategyDTO.mjs +1 -12
  290. package/esm2020/model/budgetCheckStrategy.mjs +4 -4
  291. package/esm2020/model/budgetStatsDTO.mjs +4 -4
  292. package/esm2020/model/bulkEditCreativeSetsDTO.mjs +1 -1
  293. package/esm2020/model/bulkEditCreativeSetsListDTO.mjs +1 -12
  294. package/esm2020/model/bulkEditCreativeSetsResponse.mjs +1 -12
  295. package/esm2020/model/bulkEditStrategiesDTO.mjs +1 -1
  296. package/esm2020/model/bulkEditStrategiesResponse.mjs +1 -12
  297. package/esm2020/model/bulkEditStrategyListDTO.mjs +1 -12
  298. package/esm2020/model/bulkstrategiesRequest.mjs +4 -4
  299. package/esm2020/model/bulkstrategiesUpdateResponse.mjs +1 -12
  300. package/esm2020/model/bulkstrategiesValidationRequest.mjs +4 -4
  301. package/esm2020/model/bulkstrategiesValidationResponse.mjs +4 -4
  302. package/esm2020/model/cSSThemeEntity.mjs +4 -4
  303. package/esm2020/model/cTVTargeting.mjs +1 -1
  304. package/esm2020/model/campaignDTO.mjs +1 -1
  305. package/esm2020/model/campaignDTOList.mjs +1 -12
  306. package/esm2020/model/campaignESDTO.mjs +1 -1
  307. package/esm2020/model/catalogFeed.mjs +4 -4
  308. package/esm2020/model/chartDashboardResponse.mjs +1 -1
  309. package/esm2020/model/clickDestination.mjs +17 -13
  310. package/esm2020/model/clickDestinationAutomationUrls.mjs +4 -4
  311. package/esm2020/model/cohortCampaignStrategyDO.mjs +12 -5
  312. package/esm2020/model/cohortCampaignStrategyResponse.mjs +1 -12
  313. package/esm2020/model/cohortData.mjs +1 -12
  314. package/esm2020/model/combinedAudienceAnalysisResponse.mjs +4 -4
  315. package/esm2020/model/compareValues.mjs +4 -4
  316. package/esm2020/model/contentGenre.mjs +1 -1
  317. package/esm2020/model/contentLanguage.mjs +1 -1
  318. package/esm2020/model/creative.mjs +4 -4
  319. package/esm2020/model/creativeAssetEntity.mjs +4 -4
  320. package/esm2020/model/creativeAssetOptimizationRequest.mjs +23 -2
  321. package/esm2020/model/creativeAssetUploadResponse.mjs +12 -5
  322. package/esm2020/model/creativeCompactDTO.mjs +22 -2
  323. package/esm2020/model/creativeDTO.mjs +45 -2
  324. package/esm2020/model/creativeDetails.mjs +23 -2
  325. package/esm2020/model/creativeEntity.mjs +34 -2
  326. package/esm2020/model/creativeFileForSet.mjs +26 -2
  327. package/esm2020/model/creativeFiles.mjs +26 -2
  328. package/esm2020/model/creativeHtmlFileForSet.mjs +27 -2
  329. package/esm2020/model/creativeHtmlMockupDTO.mjs +1 -1
  330. package/esm2020/model/creativeListEditField.mjs +1 -12
  331. package/esm2020/model/creativeMetaData.mjs +1 -1
  332. package/esm2020/model/creativeMockUpsDTO.mjs +1 -1
  333. package/esm2020/model/creativePerformanceData.mjs +4 -4
  334. package/esm2020/model/creativePerformanceList.mjs +1 -1
  335. package/esm2020/model/creativePreviewDTO.mjs +1 -1
  336. package/esm2020/model/creativeSetDashboardMetric.mjs +23 -2
  337. package/esm2020/model/creativeSetDetails.mjs +23 -2
  338. package/esm2020/model/creativeSetListEditField.mjs +1 -12
  339. package/esm2020/model/creativeSetPerformanceList.mjs +23 -2
  340. package/esm2020/model/creativeSetRequest.mjs +27 -2
  341. package/esm2020/model/creativeSetRescheduleRequest.mjs +4 -4
  342. package/esm2020/model/creativeSetResponse.mjs +26 -5
  343. package/esm2020/model/creativeSizeMappingDTO.mjs +30 -5
  344. package/esm2020/model/creativeStrategyAssociationStatus.mjs +1 -12
  345. package/esm2020/model/creativeTemplateDTO.mjs +4 -4
  346. package/esm2020/model/creativeTemplatesMetadataDTO.mjs +4 -4
  347. package/esm2020/model/creativeThirdPartyAdTag.mjs +1 -1
  348. package/esm2020/model/cumulativeCohortData.mjs +4 -4
  349. package/esm2020/model/currencyModel.mjs +4 -4
  350. package/esm2020/model/customerReportingData.mjs +1 -12
  351. package/esm2020/model/customerReportingDataListResponse.mjs +1 -12
  352. package/esm2020/model/customerReportingItemData.mjs +4 -4
  353. package/esm2020/model/customerReportingRequest.mjs +4 -4
  354. package/esm2020/model/customerReportingResponse.mjs +1 -1
  355. package/esm2020/model/dashboardData.mjs +1 -1
  356. package/esm2020/model/dashboardFilters.mjs +4 -4
  357. package/esm2020/model/dashboardMetrics.mjs +4 -4
  358. package/esm2020/model/dashboardRequest.mjs +1 -1
  359. package/esm2020/model/dashboardResponse.mjs +1 -12
  360. package/esm2020/model/day.mjs +4 -4
  361. package/esm2020/model/dayPart.mjs +1 -12
  362. package/esm2020/model/dayPartEditField.mjs +1 -1
  363. package/esm2020/model/dcoAttributesDTO.mjs +12 -5
  364. package/esm2020/model/dcoVideoActivateRequest.mjs +4 -4
  365. package/esm2020/model/dcoVideoActivateResponse.mjs +4 -4
  366. package/esm2020/model/dcoVideoAssetDTO.mjs +11 -5
  367. package/esm2020/model/dcoVideoAssetUploadResponse.mjs +1 -12
  368. package/esm2020/model/dcoVideoBrandGuidelineDTO.mjs +4 -4
  369. package/esm2020/model/dcoVideoCatalogItemDTO.mjs +4 -4
  370. package/esm2020/model/dcoVideoDeleteResponse.mjs +4 -4
  371. package/esm2020/model/dcoVideoDimensionDTO.mjs +4 -4
  372. package/esm2020/model/dcoVideoErrorDTO.mjs +4 -4
  373. package/esm2020/model/dcoVideoGenerateSampleRequest.mjs +1 -12
  374. package/esm2020/model/dcoVideoGenerateSampleResponse.mjs +1 -12
  375. package/esm2020/model/dcoVideoGeneratedCountResponse.mjs +4 -4
  376. package/esm2020/model/dcoVideoMusicTrackDTO.mjs +4 -4
  377. package/esm2020/model/dcoVideoPaginationDTO.mjs +4 -4
  378. package/esm2020/model/dcoVideoSampleDTO.mjs +1 -1
  379. package/esm2020/model/dcoVideoSamplesResponse.mjs +1 -1
  380. package/esm2020/model/dcoVideoSettingsCreateRequest.mjs +1 -12
  381. package/esm2020/model/dcoVideoSettingsDTO.mjs +1 -1
  382. package/esm2020/model/dcoVideoSettingsUpdateRequest.mjs +1 -12
  383. package/esm2020/model/dcoVideoTemplateDTO.mjs +1 -1
  384. package/esm2020/model/dcoVideoTemplateRequirementsDTO.mjs +4 -4
  385. package/esm2020/model/dcoVideoUploadedAssetDTO.mjs +4 -4
  386. package/esm2020/model/dealCategoryDTO.mjs +1 -1
  387. package/esm2020/model/dealCategoryEditField.mjs +1 -1
  388. package/esm2020/model/dealESDTO.mjs +4 -4
  389. package/esm2020/model/deviceTargetModel.mjs +11 -5
  390. package/esm2020/model/dictionaryResponse.mjs +1 -12
  391. package/esm2020/model/dmpAudience.mjs +1 -12
  392. package/esm2020/model/dmpAudienceCriteria.mjs +4 -4
  393. package/esm2020/model/dmpAudienceDTO.mjs +1 -12
  394. package/esm2020/model/duplicateCampaignStrategyRequestDTO.mjs +8 -13
  395. package/esm2020/model/duplicateCreativeSetResponse.mjs +26 -5
  396. package/esm2020/model/duplicateCreativeSetsRequestDTO.mjs +1 -1
  397. package/esm2020/model/duration.mjs +1 -1
  398. package/esm2020/model/durationModel.mjs +4 -4
  399. package/esm2020/model/durationStrModel.mjs +4 -4
  400. package/esm2020/model/dynamicVideoConfigDTO.mjs +22 -5
  401. package/esm2020/model/dynamicVideoDTO.mjs +1 -12
  402. package/esm2020/model/dynamicVideoTemplate.mjs +1 -1
  403. package/esm2020/model/eResponseobject.mjs +13 -0
  404. package/esm2020/model/eligibleUsersRequest.mjs +4 -4
  405. package/esm2020/model/eligibleUsersResponse.mjs +4 -4
  406. package/esm2020/model/endCards.mjs +11 -5
  407. package/esm2020/model/experimentsEntity.mjs +15 -2
  408. package/esm2020/model/extendedBaseModel.mjs +1 -12
  409. package/esm2020/model/extendedTargetingObject.mjs +1 -12
  410. package/esm2020/model/failedDTO.mjs +4 -4
  411. package/esm2020/model/failedStrategyDTO.mjs +4 -4
  412. package/esm2020/model/failedStrategyFieldsDTO.mjs +4 -4
  413. package/esm2020/model/fcapDetails.mjs +4 -4
  414. package/esm2020/model/fcapEditField.mjs +1 -1
  415. package/esm2020/model/fileDownloadResponse.mjs +4 -4
  416. package/esm2020/model/filterModel.mjs +12 -5
  417. package/esm2020/model/geoFenceDTO.mjs +11 -5
  418. package/esm2020/model/geoListDTO.mjs +1 -12
  419. package/esm2020/model/geoListRequest.mjs +9 -13
  420. package/esm2020/model/hotstarFileRequest.mjs +1 -12
  421. package/esm2020/model/hotstarNativeFileRequest.mjs +4 -4
  422. package/esm2020/model/hybridAdMapping.mjs +1 -1
  423. package/esm2020/model/iPBasedBackFill.mjs +1 -12
  424. package/esm2020/model/incrementalityReportDTO.mjs +4 -4
  425. package/esm2020/model/incrementalityReportResponse.mjs +4 -4
  426. package/esm2020/model/incrementalityResponse.mjs +1 -12
  427. package/esm2020/model/incrementalityTestCreateFormAudienceResponseObject.mjs +1 -12
  428. package/esm2020/model/incrementalityTestDTO.mjs +21 -2
  429. package/esm2020/model/incrementalityTestDetails.mjs +28 -2
  430. package/esm2020/model/incrementalityTestReportCalculationDetails.mjs +4 -4
  431. package/esm2020/model/incrementalityTestResponse.mjs +1 -1
  432. package/esm2020/model/inputStream.mjs +13 -0
  433. package/esm2020/model/integerEditField.mjs +4 -4
  434. package/esm2020/model/jobResponse.mjs +14 -5
  435. package/esm2020/model/jsonNode.mjs +18 -5
  436. package/esm2020/model/lookAlikeAudienceConfigDTO.mjs +9 -13
  437. package/esm2020/model/macro.mjs +13 -5
  438. package/esm2020/model/mapintResponseMessage.mjs +2 -0
  439. package/esm2020/model/maplongAdFormatCount.mjs +2 -0
  440. package/esm2020/model/maplongResponseMessage.mjs +2 -0
  441. package/esm2020/model/maplongstring.mjs +13 -0
  442. package/esm2020/model/mapstringlong.mjs +13 -0
  443. package/esm2020/model/mapstringobject.mjs +13 -0
  444. package/esm2020/model/menuCrubResponse.mjs +1 -12
  445. package/esm2020/model/metaRuleDto.mjs +15 -13
  446. package/esm2020/model/metaRulesDto.mjs +1 -12
  447. package/esm2020/model/modelError.mjs +4 -4
  448. package/esm2020/model/modelFile.mjs +13 -0
  449. package/esm2020/model/models.mjs +27 -34
  450. package/esm2020/model/nameAndTitleModel.mjs +4 -4
  451. package/esm2020/model/nativeAsset.mjs +4 -4
  452. package/esm2020/model/nativeAssetPojo.mjs +4 -4
  453. package/esm2020/model/notificationListResponseNotificationResponse.mjs +1 -12
  454. package/esm2020/model/notificationResponse.mjs +11 -5
  455. package/esm2020/model/onDayCohortData.mjs +4 -4
  456. package/esm2020/model/optimizationJobItemStatusDTO.mjs +13 -5
  457. package/esm2020/model/optimizationJobStatusResponse.mjs +11 -13
  458. package/esm2020/model/optimizationRuleAuditLogDTO.mjs +12 -2
  459. package/esm2020/model/optimizationRuleAuditLogDTOList.mjs +1 -12
  460. package/esm2020/model/optimizationRuleDTO.mjs +13 -5
  461. package/esm2020/model/optimizationRuleResponse.mjs +4 -4
  462. package/esm2020/model/osTargeting.mjs +1 -1
  463. package/esm2020/model/parentBasedObject.mjs +4 -4
  464. package/esm2020/model/pixel.mjs +1 -1
  465. package/esm2020/model/pixelDataFileDTO.mjs +68 -5
  466. package/esm2020/model/pixelDataScheduleDTO.mjs +1 -1
  467. package/esm2020/model/pixelRemoteConfigDTO.mjs +1 -1
  468. package/esm2020/model/platformAudienceDTO.mjs +4 -4
  469. package/esm2020/model/publisherId.mjs +1 -1
  470. package/esm2020/model/rTBAggregators.mjs +1 -1
  471. package/esm2020/model/rTBAggregatorsEditField.mjs +1 -1
  472. package/esm2020/model/rTBSites.mjs +1 -1
  473. package/esm2020/model/rTBSitesEditField.mjs +1 -1
  474. package/esm2020/model/recencyTargetingDTO.mjs +11 -5
  475. package/esm2020/model/remoteFileDTO.mjs +20 -5
  476. package/esm2020/model/reportProperty.mjs +12 -5
  477. package/esm2020/model/reportRequest.mjs +15 -2
  478. package/esm2020/model/reportResponse.mjs +15 -2
  479. package/esm2020/model/reportingRequest.mjs +20 -2
  480. package/esm2020/model/reportingResponse.mjs +15 -2
  481. package/esm2020/model/reportingSchedulerRequest.mjs +1 -1
  482. package/esm2020/model/reportingSchedulerResponse.mjs +18 -2
  483. package/esm2020/model/reportingSchedulerUserResponse.mjs +4 -4
  484. package/esm2020/model/resource.mjs +2 -0
  485. package/esm2020/model/responseMessage.mjs +4 -4
  486. package/esm2020/model/ruleComponentDTO.mjs +4 -4
  487. package/esm2020/model/ruleDTO.mjs +16 -2
  488. package/esm2020/model/ruleOperatorDto.mjs +4 -4
  489. package/esm2020/model/ruleValueDto.mjs +4 -4
  490. package/esm2020/model/safeguardAlertDTO.mjs +13 -0
  491. package/esm2020/model/safeguardBlockedItemDTO.mjs +11 -5
  492. package/esm2020/model/safeguardDetail.mjs +10 -2
  493. package/esm2020/model/safeguardExclusionDTO.mjs +10 -13
  494. package/esm2020/model/safeguardRequestDTO.mjs +10 -13
  495. package/esm2020/model/safeguardResponseDTO.mjs +10 -13
  496. package/esm2020/model/safeguardRuleMasterEntity.mjs +4 -4
  497. package/esm2020/model/schedulerRequest.mjs +10 -2
  498. package/esm2020/model/searchRequest.mjs +1 -1
  499. package/esm2020/model/selectedTargetDTO.mjs +16 -5
  500. package/esm2020/model/siteListDTO.mjs +1 -12
  501. package/esm2020/model/siteListRequest.mjs +4 -4
  502. package/esm2020/model/siteModel.mjs +4 -4
  503. package/esm2020/model/size.mjs +4 -4
  504. package/esm2020/model/sizeWithPreview.mjs +4 -4
  505. package/esm2020/model/skadTargetPrivileges.mjs +1 -12
  506. package/esm2020/model/sliceXBudgetUtilisationRequest.mjs +1 -1
  507. package/esm2020/model/sliceXBudgetUtilisationResponse.mjs +4 -4
  508. package/esm2020/model/sliceXStaticMetaDataRequest.mjs +4 -4
  509. package/esm2020/model/sliceXStaticMetaDataResponse.mjs +4 -4
  510. package/esm2020/model/sliceXWinReachRequest.mjs +1 -1
  511. package/esm2020/model/sliceXWinReachResponse.mjs +4 -4
  512. package/esm2020/model/slicexChartResponse.mjs +1 -12
  513. package/esm2020/model/slicexData.mjs +4 -4
  514. package/esm2020/model/slicexGridData.mjs +1 -1
  515. package/esm2020/model/slicexListResponse.mjs +1 -12
  516. package/esm2020/model/slicexRequest.mjs +1 -1
  517. package/esm2020/model/slicexRequestExtended.mjs +1 -1
  518. package/esm2020/model/sortModel.mjs +4 -4
  519. package/esm2020/model/statusBaseObject.mjs +4 -4
  520. package/esm2020/model/strategy.mjs +1 -1
  521. package/esm2020/model/strategyAudienceIncTestMap.mjs +1 -12
  522. package/esm2020/model/strategyCreativeAssociationRequestDTO.mjs +1 -12
  523. package/esm2020/model/strategyCreativeAssociationResponseDTO.mjs +1 -12
  524. package/esm2020/model/strategyCreativeSetsCloneDataResponse.mjs +1 -12
  525. package/esm2020/model/strategyDTO.mjs +41 -2
  526. package/esm2020/model/strategyInlineDTO.mjs +11 -5
  527. package/esm2020/model/strategyListEditField.mjs +1 -12
  528. package/esm2020/model/strategyOptBlockTargetingReq.mjs +4 -4
  529. package/esm2020/model/strategyOptRecommendationResponse.mjs +1 -12
  530. package/esm2020/model/strategyOptimizationDataResponse.mjs +1 -1
  531. package/esm2020/model/strategyQuickEditDTO.mjs +11 -5
  532. package/esm2020/model/strategyRuleResponse.mjs +17 -5
  533. package/esm2020/model/strategyTargettingPerformanceData.mjs +4 -4
  534. package/esm2020/model/strategyTemplateDTO.mjs +13 -5
  535. package/esm2020/model/strategyTemplateResponse.mjs +10 -2
  536. package/esm2020/model/strategyUpdateResponse.mjs +4 -4
  537. package/esm2020/model/strategyWithCreativeSetsDAO.mjs +4 -4
  538. package/esm2020/model/stringEditField.mjs +4 -4
  539. package/esm2020/model/tag.mjs +4 -4
  540. package/esm2020/model/targetAppCategories.mjs +1 -1
  541. package/esm2020/model/targetBrowsers.mjs +1 -1
  542. package/esm2020/model/targetDeviceTypes.mjs +1 -1
  543. package/esm2020/model/targetGeoDTO.mjs +1 -1
  544. package/esm2020/model/targetGeoEditField.mjs +1 -1
  545. package/esm2020/model/targetMobileDeviceBrands.mjs +1 -1
  546. package/esm2020/model/targetMobileDeviceModels.mjs +1 -1
  547. package/esm2020/model/targetMobileDevices.mjs +1 -1
  548. package/esm2020/model/targetObject.mjs +4 -4
  549. package/esm2020/model/targetOperatingSystem.mjs +1 -1
  550. package/esm2020/model/targetOperatingSystemEditField.mjs +1 -1
  551. package/esm2020/model/targetingObject.mjs +1 -12
  552. package/esm2020/model/temperatureTargetingDTO.mjs +4 -4
  553. package/esm2020/model/templateThemeDTO.mjs +4 -4
  554. package/esm2020/model/templateVariablesDTO.mjs +16 -5
  555. package/esm2020/model/timeZoneDTO.mjs +4 -4
  556. package/esm2020/model/totalUniqueUserRequest.mjs +4 -4
  557. package/esm2020/model/uRI.mjs +13 -0
  558. package/esm2020/model/uRL.mjs +2 -0
  559. package/esm2020/model/uRLStreamHandler.mjs +13 -0
  560. package/esm2020/model/userInfoEntity.mjs +4 -4
  561. package/esm2020/model/userPreferenceCategory.mjs +4 -4
  562. package/esm2020/model/userPreferenceDTO.mjs +1 -12
  563. package/esm2020/model/variablesMappingDTO.mjs +4 -4
  564. package/esm2020/model/vastCreative.mjs +14 -2
  565. package/esm2020/model/videoAdTagVerifyRequest.mjs +4 -4
  566. package/esm2020/model/videoAsset.mjs +4 -4
  567. package/esm2020/model/videoAttributes.mjs +55 -5
  568. package/esm2020/model/videoProperties.mjs +14 -5
  569. package/esm2020/model/videoRewardedTypeTargeting.mjs +4 -4
  570. package/esm2020/model/videoTargeting.mjs +4 -4
  571. package/esm2020/model/weatherESDTO.mjs +4 -4
  572. package/esm2020/model/whitelabelingEntity.mjs +10 -2
  573. package/esm2020/model/widgetPerformanceMetrics.mjs +4 -4
  574. package/esm2020/model/zipCode.mjs +1 -1
  575. package/fesm2015/revxui-api-clients-ts.mjs +5491 -2771
  576. package/fesm2015/revxui-api-clients-ts.mjs.map +1 -1
  577. package/fesm2020/revxui-api-clients-ts.mjs +5545 -4973
  578. package/fesm2020/revxui-api-clients-ts.mjs.map +1 -1
  579. package/model/aBTestDTO.d.ts +20 -19
  580. package/model/aBTestingDTO.d.ts +31 -15
  581. package/model/aBTestingResponseDetails.d.ts +42 -26
  582. package/model/aBTestingVariantDTO.d.ts +45 -17
  583. package/model/abandonedSessionUserTargeting.d.ts +5 -5
  584. package/model/activityLog.d.ts +16 -15
  585. package/model/activityLogsCreativeSetsBulkUpdateDTO.d.ts +19 -9
  586. package/model/activityLogsStrategyBulkUpdateDTO.d.ts +19 -9
  587. package/model/adBreak.d.ts +6 -5
  588. package/model/adFormatCount.d.ts +6 -6
  589. package/model/adPod.d.ts +6 -5
  590. package/model/adoDTO.d.ts +6 -6
  591. package/model/adoPersonDetails.d.ts +7 -7
  592. package/model/advertiser.d.ts +27 -27
  593. package/model/advertiserAppSettingsDTO.d.ts +30 -6
  594. package/model/advertiserCohortDTO.d.ts +20 -12
  595. package/model/advertiserCohortResponse.d.ts +21 -10
  596. package/model/advertiserCohortResponseList.d.ts +5 -4
  597. package/model/advertiserCurrencyData.d.ts +9 -9
  598. package/model/advertiserDynamicDetails.d.ts +12 -10
  599. package/model/advertiserDynamicVideoConfig.d.ts +9 -7
  600. package/model/advertiserLayoutVariables.d.ts +7 -7
  601. package/model/advertiserPojo.d.ts +46 -46
  602. package/model/advertiserSettings.d.ts +24 -16
  603. package/model/ageGroup.d.ts +5 -5
  604. package/model/apiListResponseABTestDTO.d.ts +6 -5
  605. package/model/apiListResponseActivityLog.d.ts +6 -5
  606. package/model/apiListResponseActivityLogsCreativeSetsBulkUpdateDTO.d.ts +6 -5
  607. package/model/apiListResponseActivityLogsStrategyBulkUpdateDTO.d.ts +6 -5
  608. package/model/apiListResponseAudiencePerformanceDTO.d.ts +6 -5
  609. package/model/apiListResponseBaseModel.d.ts +6 -5
  610. package/model/apiListResponseCatalogFeed.d.ts +6 -5
  611. package/model/apiListResponseClickDestination.d.ts +6 -5
  612. package/model/apiListResponseCreativeCompactDTO.d.ts +6 -5
  613. package/model/apiListResponseCreativeDTO.d.ts +6 -5
  614. package/model/apiListResponseCreativePerformanceList.d.ts +6 -5
  615. package/model/apiListResponseCreativeSetDashboardMetric.d.ts +6 -5
  616. package/model/apiListResponseCreativeSetPerformanceList.d.ts +6 -5
  617. package/model/apiListResponseCreativeSizeMappingDTO.d.ts +6 -5
  618. package/model/apiListResponseCreativeTemplateDTO.d.ts +6 -5
  619. package/model/apiListResponseHotstarNativeFileRequest.d.ts +6 -5
  620. package/model/apiListResponseMacro.d.ts +6 -5
  621. package/model/apiListResponsePixel.d.ts +6 -5
  622. package/model/apiListResponseReportingSchedulerResponse.d.ts +6 -5
  623. package/model/apiListResponseReportingSchedulerUserResponse.d.ts +6 -5
  624. package/model/apiListResponseSizeWithPreview.d.ts +6 -5
  625. package/model/apiListResponseStrategyRuleResponse.d.ts +6 -5
  626. package/model/apiListResponseStrategyTemplateResponse.d.ts +6 -5
  627. package/model/apiListResponseVariablesMappingDTO.d.ts +6 -5
  628. package/model/apiResponseObjectABTestDTO.d.ts +5 -5
  629. package/model/apiResponseObjectABTestingResponseDetails.d.ts +5 -5
  630. package/model/apiResponseObjectAdvertiserCohortResponseList.d.ts +5 -5
  631. package/model/apiResponseObjectAdvertiserCurrencyData.d.ts +5 -5
  632. package/model/apiResponseObjectAdvertiserDynamicDetails.d.ts +5 -5
  633. package/model/apiResponseObjectAdvertiserDynamicVideoConfig.d.ts +5 -5
  634. package/model/apiResponseObjectAdvertiserPojo.d.ts +5 -5
  635. package/model/apiResponseObjectAdvertiserSettings.d.ts +5 -5
  636. package/model/apiResponseObjectApiListResponseActivityLogsCreativeSetsBulkUpdateDTO.d.ts +5 -5
  637. package/model/apiResponseObjectApiListResponseActivityLogsStrategyBulkUpdateDTO.d.ts +5 -5
  638. package/model/apiResponseObjectApiListResponseAudiencePerformanceDTO.d.ts +5 -5
  639. package/model/apiResponseObjectApiListResponseBaseModel.d.ts +5 -5
  640. package/model/apiResponseObjectApiListResponseCatalogFeed.d.ts +5 -5
  641. package/model/apiResponseObjectApiListResponseClickDestination.d.ts +5 -5
  642. package/model/apiResponseObjectApiListResponseCreativeCompactDTO.d.ts +5 -5
  643. package/model/apiResponseObjectApiListResponseCreativeDTO.d.ts +5 -5
  644. package/model/apiResponseObjectApiListResponseCreativePerformanceList.d.ts +5 -5
  645. package/model/apiResponseObjectApiListResponseCreativeSetDashboardMetric.d.ts +5 -5
  646. package/model/apiResponseObjectApiListResponseCreativeSetPerformanceList.d.ts +5 -5
  647. package/model/apiResponseObjectApiListResponseCreativeTemplateDTO.d.ts +5 -5
  648. package/model/apiResponseObjectApiListResponsePixel.d.ts +5 -5
  649. package/model/apiResponseObjectApiListResponseVariablesMappingDTO.d.ts +5 -5
  650. package/model/apiResponseObjectArrayListCombinedAudienceAnalysisResponse.d.ts +6 -5
  651. package/model/apiResponseObjectAudienceAccessDTO.d.ts +5 -5
  652. package/model/apiResponseObjectAudienceDTO.d.ts +5 -5
  653. package/model/apiResponseObjectBaseModel.d.ts +5 -5
  654. package/model/apiResponseObjectBidToConversionDTO.d.ts +5 -5
  655. package/model/apiResponseObjectBidToConversionFilterMap.d.ts +5 -5
  656. package/model/apiResponseObjectBudgetStatsDTO.d.ts +5 -5
  657. package/model/apiResponseObjectBulkEditCreativeSetsResponse.d.ts +5 -5
  658. package/model/apiResponseObjectBulkEditStrategiesResponse.d.ts +5 -5
  659. package/model/apiResponseObjectBulkstrategiesUpdateResponse.d.ts +5 -5
  660. package/model/apiResponseObjectCampaignDTO.d.ts +5 -5
  661. package/model/apiResponseObjectCampaignDTOList.d.ts +5 -5
  662. package/model/apiResponseObjectCatalogFeed.d.ts +5 -5
  663. package/model/apiResponseObjectChartDashboardResponse.d.ts +5 -5
  664. package/model/apiResponseObjectClickDestination.d.ts +5 -5
  665. package/model/apiResponseObjectClickDestinationAutomationUrls.d.ts +5 -5
  666. package/model/apiResponseObjectCohortCampaignStrategyResponse.d.ts +5 -5
  667. package/model/apiResponseObjectCreativeDTO.d.ts +5 -5
  668. package/model/apiResponseObjectCreativePerformanceData.d.ts +5 -5
  669. package/model/apiResponseObjectCreativePreviewDTO.d.ts +5 -5
  670. package/model/apiResponseObjectCreativeSetDetails.d.ts +5 -5
  671. package/model/apiResponseObjectCreativeSetResponse.d.ts +5 -5
  672. package/model/apiResponseObjectCreativeTemplatesMetadataDTO.d.ts +5 -5
  673. package/model/apiResponseObjectDashboardMetrics.d.ts +5 -5
  674. package/model/apiResponseObjectDashboardResponse.d.ts +5 -5
  675. package/model/apiResponseObjectDcoVideoActivateResponse.d.ts +5 -5
  676. package/model/apiResponseObjectDcoVideoAssetUploadResponse.d.ts +5 -5
  677. package/model/apiResponseObjectDcoVideoDeleteResponse.d.ts +5 -5
  678. package/model/apiResponseObjectDcoVideoGenerateSampleResponse.d.ts +5 -5
  679. package/model/apiResponseObjectDcoVideoGeneratedCountResponse.d.ts +5 -5
  680. package/model/apiResponseObjectDcoVideoSamplesResponse.d.ts +5 -5
  681. package/model/apiResponseObjectDcoVideoSettingsDTO.d.ts +5 -5
  682. package/model/apiResponseObjectDictionaryResponse.d.ts +5 -5
  683. package/model/apiResponseObjectDmpAudienceDTO.d.ts +5 -5
  684. package/model/apiResponseObjectDuplicateCreativeSetResponse.d.ts +5 -5
  685. package/model/apiResponseObjectEResponseobject.d.ts +17 -0
  686. package/model/apiResponseObjectEligibleUsersResponse.d.ts +5 -5
  687. package/model/apiResponseObjectFileDownloadResponse.d.ts +5 -5
  688. package/model/apiResponseObjectGeoListDTO.d.ts +5 -5
  689. package/model/apiResponseObjectIncrementalityTestCreateFormAudienceResponseObject.d.ts +5 -5
  690. package/model/apiResponseObjectIncrementalityTestDetails.d.ts +5 -5
  691. package/model/apiResponseObjectIncrementalityTestReportCalculationDetails.d.ts +5 -5
  692. package/model/apiResponseObjectIncrementalityTestResponse.d.ts +5 -5
  693. package/model/apiResponseObjectJsonNode.d.ts +5 -5
  694. package/model/apiResponseObjectListABTestingResponseDetails.d.ts +6 -5
  695. package/model/apiResponseObjectListAppSettingsDTO.d.ts +6 -5
  696. package/model/apiResponseObjectListAudienceDTO.d.ts +6 -5
  697. package/model/apiResponseObjectListAuditDetails.d.ts +6 -5
  698. package/model/apiResponseObjectListAuditMarker.d.ts +6 -5
  699. package/model/apiResponseObjectListBackfillAudienceQueryTemplateDTO.d.ts +6 -5
  700. package/model/apiResponseObjectListBaseModel.d.ts +6 -5
  701. package/model/apiResponseObjectListBulkstrategiesValidationResponse.d.ts +6 -5
  702. package/model/apiResponseObjectListCampaignDTO.d.ts +6 -5
  703. package/model/apiResponseObjectListCreativeEntity.d.ts +6 -5
  704. package/model/apiResponseObjectListCreativeFiles.d.ts +6 -5
  705. package/model/apiResponseObjectListCreativeMetaData.d.ts +6 -5
  706. package/model/apiResponseObjectListDashboardResponse.d.ts +6 -5
  707. package/model/apiResponseObjectListDcoVideoBrandGuidelineDTO.d.ts +6 -5
  708. package/model/apiResponseObjectListDcoVideoDimensionDTO.d.ts +6 -5
  709. package/model/apiResponseObjectListDcoVideoMusicTrackDTO.d.ts +6 -5
  710. package/model/apiResponseObjectListDcoVideoSettingsDTO.d.ts +6 -5
  711. package/model/apiResponseObjectListDcoVideoTemplateDTO.d.ts +6 -5
  712. package/model/apiResponseObjectListDynamicVideoTemplate.d.ts +6 -5
  713. package/model/apiResponseObjectListExperimentsEntity.d.ts +6 -5
  714. package/model/apiResponseObjectListIncrementalityTestDetails.d.ts +6 -5
  715. package/model/apiResponseObjectListMapstringobject.d.ts +17 -0
  716. package/model/apiResponseObjectListMenuCrubResponse.d.ts +6 -5
  717. package/model/apiResponseObjectListSafeguardAlertDTO.d.ts +17 -0
  718. package/model/apiResponseObjectListSafeguardBlockedItemDTO.d.ts +6 -5
  719. package/model/apiResponseObjectListSafeguardDetail.d.ts +6 -5
  720. package/model/apiResponseObjectListSafeguardExclusionDTO.d.ts +6 -5
  721. package/model/apiResponseObjectListSafeguardRuleMasterEntity.d.ts +6 -5
  722. package/model/apiResponseObjectListSliceXBudgetUtilisationResponse.d.ts +6 -5
  723. package/model/apiResponseObjectListSliceXStaticMetaDataResponse.d.ts +6 -5
  724. package/model/apiResponseObjectListSliceXWinReachResponse.d.ts +6 -5
  725. package/model/apiResponseObjectListStrategy.d.ts +6 -5
  726. package/model/apiResponseObjectListStrategyCreativeSetsCloneDataResponse.d.ts +6 -5
  727. package/model/apiResponseObjectListTemplateThemeDTO.d.ts +6 -5
  728. package/model/apiResponseObjectListTemplateVariablesDTO.d.ts +6 -5
  729. package/model/apiResponseObjectListUserPreferenceDTO.d.ts +6 -5
  730. package/model/apiResponseObjectListstring.d.ts +16 -0
  731. package/model/apiResponseObjectMapintResponseMessage.d.ts +19 -0
  732. package/model/apiResponseObjectMaplongAdFormatCount.d.ts +19 -0
  733. package/model/apiResponseObjectMaplongResponseMessage.d.ts +19 -0
  734. package/model/apiResponseObjectMaplongstring.d.ts +18 -0
  735. package/model/apiResponseObjectMapstringlong.d.ts +18 -0
  736. package/model/apiResponseObjectMenuCrubResponse.d.ts +5 -5
  737. package/model/apiResponseObjectMetaRulesDto.d.ts +5 -5
  738. package/model/apiResponseObjectOptimizationRuleResponse.d.ts +5 -5
  739. package/model/apiResponseObjectParentBasedObject.d.ts +5 -5
  740. package/model/apiResponseObjectPixel.d.ts +5 -5
  741. package/model/apiResponseObjectReportResponse.d.ts +5 -5
  742. package/model/apiResponseObjectReportingResponse.d.ts +5 -5
  743. package/model/apiResponseObjectReportingSchedulerResponse.d.ts +5 -5
  744. package/model/apiResponseObjectResponseMessage.d.ts +5 -5
  745. package/model/apiResponseObjectSafeguardDetail.d.ts +5 -5
  746. package/model/apiResponseObjectSafeguardExclusionDTO.d.ts +5 -5
  747. package/model/apiResponseObjectSafeguardResponseDTO.d.ts +5 -5
  748. package/model/apiResponseObjectSiteListDTO.d.ts +5 -5
  749. package/model/apiResponseObjectSkadTargetPrivileges.d.ts +5 -5
  750. package/model/apiResponseObjectSlicexChartResponse.d.ts +5 -5
  751. package/model/apiResponseObjectSlicexListResponse.d.ts +5 -5
  752. package/model/apiResponseObjectStrategyAudienceIncTestMap.d.ts +5 -5
  753. package/model/apiResponseObjectStrategyCreativeAssociationResponseDTO.d.ts +5 -5
  754. package/model/apiResponseObjectStrategyDTO.d.ts +5 -5
  755. package/model/apiResponseObjectStrategyOptRecommendationResponse.d.ts +5 -5
  756. package/model/apiResponseObjectStrategyOptimizationDataResponse.d.ts +5 -5
  757. package/model/apiResponseObjectStrategyQuickEditDTO.d.ts +5 -5
  758. package/model/apiResponseObjectStrategyRuleResponse.d.ts +5 -5
  759. package/model/apiResponseObjectTag.d.ts +5 -5
  760. package/model/apiResponseObjectTargetingObject.d.ts +5 -5
  761. package/model/apiResponseObjectTemplateThemeDTO.d.ts +5 -5
  762. package/model/apiResponseObjectVoid.d.ts +4 -5
  763. package/model/apiResponseObjectWhitelabelingEntity.d.ts +5 -5
  764. package/model/apiResponseObjectWidgetPerformanceMetrics.d.ts +5 -5
  765. package/model/apiResponseObjectboolean.d.ts +16 -0
  766. package/model/apiResponseObjectlong.d.ts +16 -0
  767. package/model/apiResponseObjectstring.d.ts +16 -0
  768. package/model/appSettingsDTO.d.ts +35 -11
  769. package/model/appSettingsPropertyDTO.d.ts +12 -6
  770. package/model/assetSelectionDTO.d.ts +15 -7
  771. package/model/auctionTypeEditField.d.ts +13 -5
  772. package/model/audienceAccessDTO.d.ts +5 -5
  773. package/model/audienceAnalysisRequest.d.ts +7 -7
  774. package/model/audienceBackFilledStats.d.ts +11 -11
  775. package/model/audienceBackfillQueryTemplateRequest.d.ts +17 -7
  776. package/model/audienceBackfillRequest.d.ts +14 -6
  777. package/model/audienceDTO.d.ts +85 -43
  778. package/model/audienceESDTO.d.ts +44 -23
  779. package/model/audiencePerformanceDTO.d.ts +23 -16
  780. package/model/audienceStrDeviceDTO.d.ts +9 -8
  781. package/model/audienceStrEditField.d.ts +6 -6
  782. package/model/auditChange.d.ts +8 -8
  783. package/model/auditDetails.d.ts +13 -12
  784. package/model/auditMarker.d.ts +11 -11
  785. package/model/bIgIntegerEditFiled.d.ts +5 -5
  786. package/model/backfillAudienceQueryTemplateDTO.d.ts +7 -7
  787. package/model/bannerAdSuppDimensionsDTO.d.ts +8 -8
  788. package/model/baseModel.d.ts +5 -5
  789. package/model/baseModelEditField.d.ts +4 -4
  790. package/model/baseModelWithCreativeSetType.d.ts +31 -9
  791. package/model/bidToConversionDTO.d.ts +52 -52
  792. package/model/bidToConversionFilterDTO.d.ts +6 -6
  793. package/model/bidToConversionFilterMap.d.ts +7 -4
  794. package/model/bigDecimalEditField.d.ts +5 -5
  795. package/model/booleanEditField.d.ts +5 -5
  796. package/model/budgetCapStrategyDTO.d.ts +10 -9
  797. package/model/budgetCheckStrategy.d.ts +8 -8
  798. package/model/budgetStatsDTO.d.ts +9 -9
  799. package/model/bulkEditCreativeSetsDTO.d.ts +9 -8
  800. package/model/bulkEditCreativeSetsListDTO.d.ts +7 -5
  801. package/model/bulkEditCreativeSetsResponse.d.ts +11 -8
  802. package/model/bulkEditStrategiesDTO.d.ts +21 -20
  803. package/model/bulkEditStrategiesResponse.d.ts +10 -8
  804. package/model/bulkEditStrategyListDTO.d.ts +7 -5
  805. package/model/bulkstrategiesRequest.d.ts +9 -9
  806. package/model/bulkstrategiesUpdateResponse.d.ts +7 -6
  807. package/model/bulkstrategiesValidationRequest.d.ts +5 -5
  808. package/model/bulkstrategiesValidationResponse.d.ts +7 -7
  809. package/model/cSSThemeEntity.d.ts +5 -5
  810. package/model/cTVTargeting.d.ts +5 -5
  811. package/model/campaignDTO.d.ts +50 -50
  812. package/model/campaignDTOList.d.ts +5 -4
  813. package/model/campaignESDTO.d.ts +40 -40
  814. package/model/catalogFeed.d.ts +20 -20
  815. package/model/chartDashboardResponse.d.ts +7 -6
  816. package/model/clickDestination.d.ts +59 -40
  817. package/model/clickDestinationAutomationUrls.d.ts +11 -11
  818. package/model/cohortCampaignStrategyDO.d.ts +14 -6
  819. package/model/cohortCampaignStrategyResponse.d.ts +5 -4
  820. package/model/cohortData.d.ts +11 -5
  821. package/model/combinedAudienceAnalysisResponse.d.ts +9 -9
  822. package/model/compareValues.d.ts +7 -7
  823. package/model/contentGenre.d.ts +4 -4
  824. package/model/contentLanguage.d.ts +4 -4
  825. package/model/creative.d.ts +23 -23
  826. package/model/creativeAssetEntity.d.ts +9 -9
  827. package/model/creativeAssetOptimizationRequest.d.ts +29 -6
  828. package/model/creativeAssetUploadResponse.d.ts +16 -8
  829. package/model/creativeCompactDTO.d.ts +39 -18
  830. package/model/creativeDTO.d.ts +97 -50
  831. package/model/creativeDetails.d.ts +33 -10
  832. package/model/creativeEntity.d.ts +81 -45
  833. package/model/creativeFileForSet.d.ts +52 -25
  834. package/model/creativeFiles.d.ts +49 -22
  835. package/model/creativeHtmlFileForSet.d.ts +47 -20
  836. package/model/creativeHtmlMockupDTO.d.ts +5 -4
  837. package/model/creativeListEditField.d.ts +6 -5
  838. package/model/creativeMetaData.d.ts +14 -14
  839. package/model/creativeMockUpsDTO.d.ts +5 -4
  840. package/model/creativePerformanceData.d.ts +41 -41
  841. package/model/creativePerformanceList.d.ts +98 -101
  842. package/model/creativePreviewDTO.d.ts +6 -5
  843. package/model/creativeSetDashboardMetric.d.ts +115 -92
  844. package/model/creativeSetDetails.d.ts +55 -28
  845. package/model/creativeSetListEditField.d.ts +6 -5
  846. package/model/creativeSetPerformanceList.d.ts +121 -101
  847. package/model/creativeSetRequest.d.ts +65 -34
  848. package/model/creativeSetRescheduleRequest.d.ts +5 -5
  849. package/model/creativeSetResponse.d.ts +29 -7
  850. package/model/creativeSizeMappingDTO.d.ts +37 -10
  851. package/model/creativeStrategyAssociationStatus.d.ts +8 -7
  852. package/model/creativeTemplateDTO.d.ts +16 -22
  853. package/model/creativeTemplatesMetadataDTO.d.ts +5 -5
  854. package/model/creativeThirdPartyAdTag.d.ts +4 -4
  855. package/model/cumulativeCohortData.d.ts +7 -7
  856. package/model/currencyModel.d.ts +6 -6
  857. package/model/customerReportingData.d.ts +12 -11
  858. package/model/customerReportingDataListResponse.d.ts +5 -4
  859. package/model/customerReportingItemData.d.ts +7 -7
  860. package/model/customerReportingRequest.d.ts +9 -9
  861. package/model/customerReportingResponse.d.ts +5 -5
  862. package/model/dashboardData.d.ts +93 -93
  863. package/model/dashboardFilters.d.ts +6 -6
  864. package/model/dashboardMetrics.d.ts +84 -84
  865. package/model/dashboardRequest.d.ts +6 -5
  866. package/model/dashboardResponse.d.ts +7 -6
  867. package/model/day.d.ts +6 -6
  868. package/model/dayPart.d.ts +6 -5
  869. package/model/dayPartEditField.d.ts +4 -4
  870. package/model/dcoAttributesDTO.d.ts +17 -9
  871. package/model/dcoVideoActivateRequest.d.ts +5 -8
  872. package/model/dcoVideoActivateResponse.d.ts +8 -8
  873. package/model/dcoVideoAssetDTO.d.ts +22 -15
  874. package/model/dcoVideoAssetUploadResponse.d.ts +7 -6
  875. package/model/dcoVideoBrandGuidelineDTO.d.ts +6 -6
  876. package/model/dcoVideoCatalogItemDTO.d.ts +6 -6
  877. package/model/dcoVideoDeleteResponse.d.ts +7 -7
  878. package/model/dcoVideoDimensionDTO.d.ts +5 -5
  879. package/model/dcoVideoErrorDTO.d.ts +5 -5
  880. package/model/dcoVideoGenerateSampleRequest.d.ts +10 -12
  881. package/model/dcoVideoGenerateSampleResponse.d.ts +19 -16
  882. package/model/dcoVideoGeneratedCountResponse.d.ts +14 -14
  883. package/model/dcoVideoMusicTrackDTO.d.ts +11 -11
  884. package/model/dcoVideoPaginationDTO.d.ts +9 -9
  885. package/model/dcoVideoSampleDTO.d.ts +13 -13
  886. package/model/dcoVideoSamplesResponse.d.ts +6 -5
  887. package/model/dcoVideoSettingsCreateRequest.d.ts +10 -12
  888. package/model/dcoVideoSettingsDTO.d.ts +20 -19
  889. package/model/dcoVideoSettingsUpdateRequest.d.ts +9 -11
  890. package/model/dcoVideoTemplateDTO.d.ts +14 -13
  891. package/model/dcoVideoTemplateRequirementsDTO.d.ts +7 -7
  892. package/model/dcoVideoUploadedAssetDTO.d.ts +8 -8
  893. package/model/dealCategoryDTO.d.ts +4 -4
  894. package/model/dealCategoryEditField.d.ts +4 -4
  895. package/model/dealESDTO.d.ts +11 -11
  896. package/model/deviceTargetModel.d.ts +19 -12
  897. package/model/dictionaryResponse.d.ts +6 -5
  898. package/model/dmpAudience.d.ts +11 -10
  899. package/model/dmpAudienceCriteria.d.ts +6 -6
  900. package/model/dmpAudienceDTO.d.ts +10 -9
  901. package/model/duplicateCampaignStrategyRequestDTO.d.ts +26 -18
  902. package/model/duplicateCreativeSetResponse.d.ts +30 -8
  903. package/model/duplicateCreativeSetsRequestDTO.d.ts +10 -10
  904. package/model/duration.d.ts +5 -5
  905. package/model/durationModel.d.ts +5 -5
  906. package/model/durationStrModel.d.ts +5 -5
  907. package/model/dynamicVideoConfigDTO.d.ts +24 -6
  908. package/model/dynamicVideoDTO.d.ts +6 -5
  909. package/model/dynamicVideoTemplate.d.ts +8 -8
  910. package/model/eResponseobject.d.ts +15 -0
  911. package/model/eligibleUsersRequest.d.ts +15 -15
  912. package/model/eligibleUsersResponse.d.ts +4 -4
  913. package/model/endCards.d.ts +14 -7
  914. package/model/experimentsEntity.d.ts +38 -24
  915. package/model/extendedBaseModel.d.ts +9 -6
  916. package/model/extendedTargetingObject.d.ts +6 -5
  917. package/model/failedDTO.d.ts +6 -6
  918. package/model/failedStrategyDTO.d.ts +6 -6
  919. package/model/failedStrategyFieldsDTO.d.ts +5 -5
  920. package/model/fcapDetails.d.ts +6 -6
  921. package/model/fcapEditField.d.ts +4 -4
  922. package/model/fileDownloadResponse.d.ts +5 -5
  923. package/model/filterModel.d.ts +13 -5
  924. package/model/geoFenceDTO.d.ts +14 -7
  925. package/model/geoListDTO.d.ts +6 -5
  926. package/model/geoListRequest.d.ts +15 -6
  927. package/model/hotstarFileRequest.d.ts +7 -6
  928. package/model/hotstarNativeFileRequest.d.ts +5 -5
  929. package/model/hybridAdMapping.d.ts +6 -6
  930. package/model/iPBasedBackFill.d.ts +6 -5
  931. package/model/incrementalityReportDTO.d.ts +7 -7
  932. package/model/incrementalityReportResponse.d.ts +14 -14
  933. package/model/incrementalityResponse.d.ts +7 -6
  934. package/model/incrementalityTestCreateFormAudienceResponseObject.d.ts +6 -5
  935. package/model/incrementalityTestDTO.d.ts +52 -28
  936. package/model/incrementalityTestDetails.d.ts +62 -30
  937. package/model/incrementalityTestReportCalculationDetails.d.ts +29 -25
  938. package/model/incrementalityTestResponse.d.ts +4 -4
  939. package/model/inputStream.d.ts +13 -0
  940. package/model/integerEditField.d.ts +5 -5
  941. package/model/jobResponse.d.ts +19 -9
  942. package/model/jsonNode.d.ts +38 -3
  943. package/model/lookAlikeAudienceConfigDTO.d.ts +18 -9
  944. package/model/macro.d.ts +19 -10
  945. package/model/mapintResponseMessage.d.ts +15 -0
  946. package/model/maplongAdFormatCount.d.ts +15 -0
  947. package/model/maplongResponseMessage.d.ts +15 -0
  948. package/model/maplongstring.d.ts +14 -0
  949. package/model/mapstringlong.d.ts +14 -0
  950. package/model/mapstringobject.d.ts +14 -0
  951. package/model/menuCrubResponse.d.ts +6 -5
  952. package/model/metaRuleDto.d.ts +29 -12
  953. package/model/metaRulesDto.d.ts +5 -4
  954. package/model/modelError.d.ts +5 -5
  955. package/model/modelFile.d.ts +32 -0
  956. package/model/models.d.ts +26 -33
  957. package/model/nameAndTitleModel.d.ts +5 -5
  958. package/model/nativeAsset.d.ts +9 -9
  959. package/model/nativeAssetPojo.d.ts +15 -15
  960. package/model/notificationListResponseNotificationResponse.d.ts +7 -6
  961. package/model/notificationResponse.d.ts +21 -14
  962. package/model/onDayCohortData.d.ts +7 -7
  963. package/model/optimizationJobItemStatusDTO.d.ts +17 -8
  964. package/model/optimizationJobStatusResponse.d.ts +22 -11
  965. package/model/optimizationRuleAuditLogDTO.d.ts +26 -14
  966. package/model/optimizationRuleAuditLogDTOList.d.ts +5 -4
  967. package/model/optimizationRuleDTO.d.ts +27 -18
  968. package/model/optimizationRuleResponse.d.ts +6 -6
  969. package/model/osTargeting.d.ts +4 -4
  970. package/model/parentBasedObject.d.ts +12 -12
  971. package/model/pixel.d.ts +19 -19
  972. package/model/pixelDataFileDTO.d.ts +86 -18
  973. package/model/pixelDataScheduleDTO.d.ts +16 -16
  974. package/model/pixelRemoteConfigDTO.d.ts +7 -7
  975. package/model/platformAudienceDTO.d.ts +7 -7
  976. package/model/publisherId.d.ts +4 -4
  977. package/model/rTBAggregators.d.ts +4 -4
  978. package/model/rTBAggregatorsEditField.d.ts +4 -4
  979. package/model/rTBSites.d.ts +4 -4
  980. package/model/rTBSitesEditField.d.ts +4 -4
  981. package/model/recencyTargetingDTO.d.ts +12 -5
  982. package/model/remoteFileDTO.d.ts +28 -11
  983. package/model/reportProperty.d.ts +23 -13
  984. package/model/reportRequest.d.ts +32 -15
  985. package/model/reportResponse.d.ts +37 -22
  986. package/model/reportingRequest.d.ts +48 -22
  987. package/model/reportingResponse.d.ts +37 -22
  988. package/model/reportingSchedulerRequest.d.ts +6 -6
  989. package/model/reportingSchedulerResponse.d.ts +38 -19
  990. package/model/reportingSchedulerUserResponse.d.ts +5 -5
  991. package/model/resource.d.ts +24 -0
  992. package/model/responseMessage.d.ts +5 -5
  993. package/model/ruleComponentDTO.d.ts +9 -9
  994. package/model/ruleDTO.d.ts +26 -10
  995. package/model/ruleOperatorDto.d.ts +7 -7
  996. package/model/ruleValueDto.d.ts +5 -5
  997. package/model/safeguardAlertDTO.d.ts +19 -0
  998. package/model/safeguardBlockedItemDTO.d.ts +20 -13
  999. package/model/safeguardDetail.d.ts +28 -18
  1000. package/model/safeguardExclusionDTO.d.ts +17 -7
  1001. package/model/safeguardRequestDTO.d.ts +27 -16
  1002. package/model/safeguardResponseDTO.d.ts +28 -17
  1003. package/model/safeguardRuleMasterEntity.d.ts +10 -10
  1004. package/model/schedulerRequest.d.ts +15 -6
  1005. package/model/searchRequest.d.ts +6 -5
  1006. package/model/selectedTargetDTO.d.ts +20 -7
  1007. package/model/siteListDTO.d.ts +6 -5
  1008. package/model/siteListRequest.d.ts +4 -4
  1009. package/model/siteModel.d.ts +9 -9
  1010. package/model/size.d.ts +5 -5
  1011. package/model/sizeWithPreview.d.ts +6 -6
  1012. package/model/skadTargetPrivileges.d.ts +9 -8
  1013. package/model/sliceXBudgetUtilisationRequest.d.ts +6 -6
  1014. package/model/sliceXBudgetUtilisationResponse.d.ts +7 -7
  1015. package/model/sliceXStaticMetaDataRequest.d.ts +5 -5
  1016. package/model/sliceXStaticMetaDataResponse.d.ts +9 -9
  1017. package/model/sliceXWinReachRequest.d.ts +8 -7
  1018. package/model/sliceXWinReachResponse.d.ts +9 -9
  1019. package/model/slicexChartResponse.d.ts +11 -10
  1020. package/model/slicexData.d.ts +88 -88
  1021. package/model/slicexGridData.d.ts +89 -89
  1022. package/model/slicexListResponse.d.ts +7 -6
  1023. package/model/slicexRequest.d.ts +7 -6
  1024. package/model/slicexRequestExtended.d.ts +8 -7
  1025. package/model/sortModel.d.ts +5 -5
  1026. package/model/statusBaseObject.d.ts +8 -8
  1027. package/model/strategy.d.ts +34 -34
  1028. package/model/strategyAudienceIncTestMap.d.ts +7 -4
  1029. package/model/strategyCreativeAssociationRequestDTO.d.ts +7 -6
  1030. package/model/strategyCreativeAssociationResponseDTO.d.ts +6 -5
  1031. package/model/strategyCreativeSetsCloneDataResponse.d.ts +11 -9
  1032. package/model/strategyDTO.d.ts +150 -102
  1033. package/model/strategyInlineDTO.d.ts +29 -22
  1034. package/model/strategyListEditField.d.ts +6 -5
  1035. package/model/strategyOptBlockTargetingReq.d.ts +5 -5
  1036. package/model/strategyOptRecommendationResponse.d.ts +6 -5
  1037. package/model/strategyOptimizationDataResponse.d.ts +3 -3
  1038. package/model/strategyQuickEditDTO.d.ts +26 -19
  1039. package/model/strategyRuleResponse.d.ts +35 -21
  1040. package/model/strategyTargettingPerformanceData.d.ts +15 -15
  1041. package/model/strategyTemplateDTO.d.ts +20 -11
  1042. package/model/strategyTemplateResponse.d.ts +20 -11
  1043. package/model/strategyUpdateResponse.d.ts +10 -10
  1044. package/model/strategyWithCreativeSetsDAO.d.ts +5 -5
  1045. package/model/stringEditField.d.ts +5 -5
  1046. package/model/tag.d.ts +8 -8
  1047. package/model/targetAppCategories.d.ts +5 -5
  1048. package/model/targetBrowsers.d.ts +4 -4
  1049. package/model/targetDeviceTypes.d.ts +4 -4
  1050. package/model/targetGeoDTO.d.ts +5 -5
  1051. package/model/targetGeoEditField.d.ts +4 -4
  1052. package/model/targetMobileDeviceBrands.d.ts +4 -4
  1053. package/model/targetMobileDeviceModels.d.ts +4 -4
  1054. package/model/targetMobileDevices.d.ts +5 -5
  1055. package/model/targetObject.d.ts +5 -5
  1056. package/model/targetOperatingSystem.d.ts +4 -4
  1057. package/model/targetOperatingSystemEditField.d.ts +4 -4
  1058. package/model/targetingObject.d.ts +6 -5
  1059. package/model/temperatureTargetingDTO.d.ts +5 -5
  1060. package/model/templateThemeDTO.d.ts +12 -12
  1061. package/model/templateVariablesDTO.d.ts +23 -11
  1062. package/model/timeZoneDTO.d.ts +7 -7
  1063. package/model/totalUniqueUserRequest.d.ts +5 -5
  1064. package/model/uRI.d.ts +30 -0
  1065. package/model/uRL.d.ts +27 -0
  1066. package/model/uRLStreamHandler.d.ts +13 -0
  1067. package/model/userInfoEntity.d.ts +13 -13
  1068. package/model/userPreferenceCategory.d.ts +6 -6
  1069. package/model/userPreferenceDTO.d.ts +9 -8
  1070. package/model/variablesMappingDTO.d.ts +11 -11
  1071. package/model/vastCreative.d.ts +20 -7
  1072. package/model/videoAdTagVerifyRequest.d.ts +4 -4
  1073. package/model/videoAsset.d.ts +8 -8
  1074. package/model/videoAttributes.d.ts +75 -21
  1075. package/model/videoProperties.d.ts +24 -14
  1076. package/model/videoRewardedTypeTargeting.d.ts +5 -5
  1077. package/model/videoTargeting.d.ts +5 -5
  1078. package/model/weatherESDTO.d.ts +8 -8
  1079. package/model/whitelabelingEntity.d.ts +23 -14
  1080. package/model/widgetPerformanceMetrics.d.ts +11 -11
  1081. package/model/zipCode.d.ts +4 -4
  1082. package/package.json +1 -1
  1083. package/api/appsFlyerAudienceController.service.d.ts +0 -51
  1084. package/api/consoleCreativeController.service.d.ts +0 -28
  1085. package/api/fileUploadController.service.d.ts +0 -43
  1086. package/api/mDMPAudienceController.service.d.ts +0 -30
  1087. package/api/safeGuardController.service.d.ts +0 -166
  1088. package/api/shopeeAudienceController.service.d.ts +0 -98
  1089. package/api/smartCachingController.service.d.ts +0 -27
  1090. package/api/springRoleTestingController_.service.d.ts +0 -64
  1091. package/api/uILoggerController_.service.d.ts +0 -30
  1092. package/api/userPreferenceController_.service.d.ts +0 -61
  1093. package/esm2020/api/appsFlyerAudienceController.service.mjs +0 -144
  1094. package/esm2020/api/consoleCreativeController.service.mjs +0 -78
  1095. package/esm2020/api/fileUploadController.service.mjs +0 -144
  1096. package/esm2020/api/mDMPAudienceController.service.mjs +0 -88
  1097. package/esm2020/api/safeGuardController.service.mjs +0 -428
  1098. package/esm2020/api/shopeeAudienceController.service.mjs +0 -278
  1099. package/esm2020/api/smartCachingController.service.mjs +0 -78
  1100. package/esm2020/api/springRoleTestingController_.service.mjs +0 -154
  1101. package/esm2020/api/uILoggerController_.service.mjs +0 -94
  1102. package/esm2020/api/userPreferenceController_.service.mjs +0 -154
  1103. package/esm2020/model/apiListResponseCreativeFiles.mjs +0 -13
  1104. package/esm2020/model/apiListResponseFileModel.mjs +0 -13
  1105. package/esm2020/model/apiResponseObjectBoolean.mjs +0 -13
  1106. package/esm2020/model/apiResponseObjectEResponseObject.mjs +0 -2
  1107. package/esm2020/model/apiResponseObjectListMapStringObject.mjs +0 -13
  1108. package/esm2020/model/apiResponseObjectListString.mjs +0 -13
  1109. package/esm2020/model/apiResponseObjectLong.mjs +0 -13
  1110. package/esm2020/model/apiResponseObjectMapIntegerResponseMessage.mjs +0 -13
  1111. package/esm2020/model/apiResponseObjectMapLongAdFormatCount.mjs +0 -13
  1112. package/esm2020/model/apiResponseObjectMapLongResponseMessage.mjs +0 -13
  1113. package/esm2020/model/apiResponseObjectMapLongString.mjs +0 -13
  1114. package/esm2020/model/apiResponseObjectMapStringLong.mjs +0 -13
  1115. package/esm2020/model/apiResponseObjectString.mjs +0 -13
  1116. package/esm2020/model/appsFlyerAudienceCreateDto.mjs +0 -13
  1117. package/esm2020/model/appsFlyerAudienceSyncDto.mjs +0 -13
  1118. package/esm2020/model/appsFlyerAudienceTokenDto.mjs +0 -13
  1119. package/esm2020/model/assetsUploadBody.mjs +0 -13
  1120. package/esm2020/model/audienceUploadBody.mjs +0 -13
  1121. package/esm2020/model/creativeListCommonAttributes.mjs +0 -2
  1122. package/esm2020/model/eResponseObject.mjs +0 -13
  1123. package/esm2020/model/fileModel.mjs +0 -13
  1124. package/esm2020/model/mDmpAudienceDTO.mjs +0 -13
  1125. package/esm2020/model/shopeeAudienceAPIResponse.mjs +0 -2
  1126. package/esm2020/model/shopeeAudienceDTO.mjs +0 -13
  1127. package/esm2020/model/shopeeAudienceDescriptionDTO.mjs +0 -13
  1128. package/esm2020/model/shopeeAudienceErrorResponse.mjs +0 -13
  1129. package/esm2020/model/shopeeAudienceListResp.mjs +0 -13
  1130. package/esm2020/model/shopeeAudienceListResponse.mjs +0 -13
  1131. package/esm2020/model/shopeeAudienceResp.mjs +0 -13
  1132. package/esm2020/model/shopeeAudienceResponse.mjs +0 -2
  1133. package/esm2020/model/shopeeAudienceResponseObject.mjs +0 -2
  1134. package/esm2020/model/uploadCreativeBody.mjs +0 -13
  1135. package/esm2020/model/v2UploadBody.mjs +0 -13
  1136. package/model/apiListResponseCreativeFiles.d.ts +0 -15
  1137. package/model/apiListResponseFileModel.d.ts +0 -15
  1138. package/model/apiResponseObjectBoolean.d.ts +0 -16
  1139. package/model/apiResponseObjectEResponseObject.d.ts +0 -17
  1140. package/model/apiResponseObjectListMapStringObject.d.ts +0 -16
  1141. package/model/apiResponseObjectListString.d.ts +0 -16
  1142. package/model/apiResponseObjectLong.d.ts +0 -16
  1143. package/model/apiResponseObjectMapIntegerResponseMessage.d.ts +0 -16
  1144. package/model/apiResponseObjectMapLongAdFormatCount.d.ts +0 -16
  1145. package/model/apiResponseObjectMapLongResponseMessage.d.ts +0 -16
  1146. package/model/apiResponseObjectMapLongString.d.ts +0 -16
  1147. package/model/apiResponseObjectMapStringLong.d.ts +0 -16
  1148. package/model/apiResponseObjectString.d.ts +0 -16
  1149. package/model/appsFlyerAudienceCreateDto.d.ts +0 -16
  1150. package/model/appsFlyerAudienceSyncDto.d.ts +0 -17
  1151. package/model/appsFlyerAudienceTokenDto.d.ts +0 -14
  1152. package/model/assetsUploadBody.d.ts +0 -29
  1153. package/model/audienceUploadBody.d.ts +0 -14
  1154. package/model/creativeListCommonAttributes.d.ts +0 -109
  1155. package/model/eResponseObject.d.ts +0 -15
  1156. package/model/fileModel.d.ts +0 -22
  1157. package/model/mDmpAudienceDTO.d.ts +0 -17
  1158. package/model/shopeeAudienceAPIResponse.d.ts +0 -17
  1159. package/model/shopeeAudienceDTO.d.ts +0 -22
  1160. package/model/shopeeAudienceDescriptionDTO.d.ts +0 -20
  1161. package/model/shopeeAudienceErrorResponse.d.ts +0 -15
  1162. package/model/shopeeAudienceListResp.d.ts +0 -20
  1163. package/model/shopeeAudienceListResponse.d.ts +0 -16
  1164. package/model/shopeeAudienceResp.d.ts +0 -14
  1165. package/model/shopeeAudienceResponse.d.ts +0 -17
  1166. package/model/shopeeAudienceResponseObject.d.ts +0 -17
  1167. package/model/uploadCreativeBody.d.ts +0 -14
  1168. package/model/v2UploadBody.d.ts +0 -14
@@ -1,14 +1,15 @@
1
1
  /**
2
- * OpenAPI definition
3
- * No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)
2
+ * Api Documentation
3
+ * Api Documentation
4
4
  *
5
- * OpenAPI spec version: v0
5
+ * OpenAPI spec version: 1.0
6
6
  *
7
7
  *
8
8
  * NOTE: This class is auto generated by the swagger code generator program.
9
9
  * https://github.com/swagger-api/swagger-codegen.git
10
10
  * Do not edit the class manually.
11
- */ /* tslint:disable:no-unused-variable member-ordering */
11
+ */
12
+ /* tslint:disable:no-unused-variable member-ordering */
12
13
  import { Inject, Injectable, Optional } from '@angular/core';
13
14
  import { HttpHeaders, HttpParams } from '@angular/common/http';
14
15
  import { CustomHttpUrlEncodingCodec } from '../encoder';
@@ -20,7 +21,7 @@ import * as i2 from "../configuration";
20
21
  export class ExperimentsControllerService {
21
22
  constructor(httpClient, basePath, configuration) {
22
23
  this.httpClient = httpClient;
23
- this.basePath = 'https://beta02-apiv2.atomex.net';
24
+ this.basePath = 'https://apiv2stage3.atomex.net';
24
25
  this.defaultHeaders = new HttpHeaders();
25
26
  this.configuration = new Configuration();
26
27
  if (basePath) {
@@ -44,15 +45,21 @@ export class ExperimentsControllerService {
44
45
  }
45
46
  return false;
46
47
  }
47
- activateABTest(expId, observe = 'body', reportProgress = false) {
48
+ activateABTestUsingPOST(expId, reqId, token, observe = 'body', reportProgress = false) {
48
49
  if (expId === null || expId === undefined) {
49
- throw new Error('Required parameter expId was null or undefined when calling activateABTest.');
50
+ throw new Error('Required parameter expId was null or undefined when calling activateABTestUsingPOST.');
50
51
  }
51
52
  let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
52
53
  if (expId !== undefined && expId !== null) {
53
54
  queryParameters = queryParameters.set('expId', expId);
54
55
  }
55
56
  let headers = this.defaultHeaders;
57
+ if (reqId !== undefined && reqId !== null) {
58
+ headers = headers.set('reqId', String(reqId));
59
+ }
60
+ if (token !== undefined && token !== null) {
61
+ headers = headers.set('token', String(token));
62
+ }
56
63
  // to determine the Accept header
57
64
  let httpHeaderAccepts = [
58
65
  'application/json'
@@ -62,8 +69,10 @@ export class ExperimentsControllerService {
62
69
  headers = headers.set('Accept', httpHeaderAcceptSelected);
63
70
  }
64
71
  // to determine the Content-Type header
65
- const consumes = [];
66
- return this.httpClient.request('post', `${this.basePath}/v2/api/experiments/abtest/activate`, {
72
+ const consumes = [
73
+ 'application/json'
74
+ ];
75
+ return this.httpClient.post(`${this.basePath}/v2/api/experiments/abtest/activate`, null, {
67
76
  params: queryParameters,
68
77
  withCredentials: this.configuration.withCredentials,
69
78
  headers: headers,
@@ -71,15 +80,21 @@ export class ExperimentsControllerService {
71
80
  reportProgress: reportProgress
72
81
  });
73
82
  }
74
- activateExperiment(experimentIds, observe = 'body', reportProgress = false) {
83
+ activateExperimentUsingPOST(experimentIds, reqId, token, observe = 'body', reportProgress = false) {
75
84
  if (experimentIds === null || experimentIds === undefined) {
76
- throw new Error('Required parameter experimentIds was null or undefined when calling activateExperiment.');
85
+ throw new Error('Required parameter experimentIds was null or undefined when calling activateExperimentUsingPOST.');
77
86
  }
78
87
  let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
79
88
  if (experimentIds !== undefined && experimentIds !== null) {
80
89
  queryParameters = queryParameters.set('experimentIds', experimentIds);
81
90
  }
82
91
  let headers = this.defaultHeaders;
92
+ if (reqId !== undefined && reqId !== null) {
93
+ headers = headers.set('reqId', String(reqId));
94
+ }
95
+ if (token !== undefined && token !== null) {
96
+ headers = headers.set('token', String(token));
97
+ }
83
98
  // to determine the Accept header
84
99
  let httpHeaderAccepts = [
85
100
  'application/json'
@@ -89,8 +104,10 @@ export class ExperimentsControllerService {
89
104
  headers = headers.set('Accept', httpHeaderAcceptSelected);
90
105
  }
91
106
  // to determine the Content-Type header
92
- const consumes = [];
93
- return this.httpClient.request('post', `${this.basePath}/v2/api/experiments/activate`, {
107
+ const consumes = [
108
+ 'application/json'
109
+ ];
110
+ return this.httpClient.post(`${this.basePath}/v2/api/experiments/activate`, null, {
94
111
  params: queryParameters,
95
112
  withCredentials: this.configuration.withCredentials,
96
113
  headers: headers,
@@ -98,15 +115,21 @@ export class ExperimentsControllerService {
98
115
  reportProgress: reportProgress
99
116
  });
100
117
  }
101
- archiveABTest(expId, observe = 'body', reportProgress = false) {
118
+ archiveABTestUsingPOST(expId, reqId, token, observe = 'body', reportProgress = false) {
102
119
  if (expId === null || expId === undefined) {
103
- throw new Error('Required parameter expId was null or undefined when calling archiveABTest.');
120
+ throw new Error('Required parameter expId was null or undefined when calling archiveABTestUsingPOST.');
104
121
  }
105
122
  let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
106
123
  if (expId !== undefined && expId !== null) {
107
124
  queryParameters = queryParameters.set('expId', expId);
108
125
  }
109
126
  let headers = this.defaultHeaders;
127
+ if (reqId !== undefined && reqId !== null) {
128
+ headers = headers.set('reqId', String(reqId));
129
+ }
130
+ if (token !== undefined && token !== null) {
131
+ headers = headers.set('token', String(token));
132
+ }
110
133
  // to determine the Accept header
111
134
  let httpHeaderAccepts = [
112
135
  'application/json'
@@ -116,8 +139,10 @@ export class ExperimentsControllerService {
116
139
  headers = headers.set('Accept', httpHeaderAcceptSelected);
117
140
  }
118
141
  // to determine the Content-Type header
119
- const consumes = [];
120
- return this.httpClient.request('post', `${this.basePath}/v2/api/experiments/abtest/archive`, {
142
+ const consumes = [
143
+ 'application/json'
144
+ ];
145
+ return this.httpClient.post(`${this.basePath}/v2/api/experiments/abtest/archive`, null, {
121
146
  params: queryParameters,
122
147
  withCredentials: this.configuration.withCredentials,
123
148
  headers: headers,
@@ -125,15 +150,21 @@ export class ExperimentsControllerService {
125
150
  reportProgress: reportProgress
126
151
  });
127
152
  }
128
- archiveExperiment(experimentIds, observe = 'body', reportProgress = false) {
153
+ archiveExperimentUsingPOST(experimentIds, reqId, token, observe = 'body', reportProgress = false) {
129
154
  if (experimentIds === null || experimentIds === undefined) {
130
- throw new Error('Required parameter experimentIds was null or undefined when calling archiveExperiment.');
155
+ throw new Error('Required parameter experimentIds was null or undefined when calling archiveExperimentUsingPOST.');
131
156
  }
132
157
  let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
133
158
  if (experimentIds !== undefined && experimentIds !== null) {
134
159
  queryParameters = queryParameters.set('experimentIds', experimentIds);
135
160
  }
136
161
  let headers = this.defaultHeaders;
162
+ if (reqId !== undefined && reqId !== null) {
163
+ headers = headers.set('reqId', String(reqId));
164
+ }
165
+ if (token !== undefined && token !== null) {
166
+ headers = headers.set('token', String(token));
167
+ }
137
168
  // to determine the Accept header
138
169
  let httpHeaderAccepts = [
139
170
  'application/json'
@@ -143,8 +174,10 @@ export class ExperimentsControllerService {
143
174
  headers = headers.set('Accept', httpHeaderAcceptSelected);
144
175
  }
145
176
  // to determine the Content-Type header
146
- const consumes = [];
147
- return this.httpClient.request('post', `${this.basePath}/v2/api/experiments/archive`, {
177
+ const consumes = [
178
+ 'application/json'
179
+ ];
180
+ return this.httpClient.post(`${this.basePath}/v2/api/experiments/archive`, null, {
148
181
  params: queryParameters,
149
182
  withCredentials: this.configuration.withCredentials,
150
183
  headers: headers,
@@ -152,11 +185,17 @@ export class ExperimentsControllerService {
152
185
  reportProgress: reportProgress
153
186
  });
154
187
  }
155
- createABTest(body, observe = 'body', reportProgress = false) {
156
- if (body === null || body === undefined) {
157
- throw new Error('Required parameter body was null or undefined when calling createABTest.');
188
+ createABTestUsingPOST(dto, reqId, token, observe = 'body', reportProgress = false) {
189
+ if (dto === null || dto === undefined) {
190
+ throw new Error('Required parameter dto was null or undefined when calling createABTestUsingPOST.');
158
191
  }
159
192
  let headers = this.defaultHeaders;
193
+ if (reqId !== undefined && reqId !== null) {
194
+ headers = headers.set('reqId', String(reqId));
195
+ }
196
+ if (token !== undefined && token !== null) {
197
+ headers = headers.set('token', String(token));
198
+ }
160
199
  // to determine the Accept header
161
200
  let httpHeaderAccepts = [
162
201
  'application/json'
@@ -173,19 +212,24 @@ export class ExperimentsControllerService {
173
212
  if (httpContentTypeSelected != undefined) {
174
213
  headers = headers.set('Content-Type', httpContentTypeSelected);
175
214
  }
176
- return this.httpClient.request('post', `${this.basePath}/v2/api/experiments/abtest/create`, {
177
- body: body,
215
+ return this.httpClient.post(`${this.basePath}/v2/api/experiments/abtest/create`, dto, {
178
216
  withCredentials: this.configuration.withCredentials,
179
217
  headers: headers,
180
218
  observe: observe,
181
219
  reportProgress: reportProgress
182
220
  });
183
221
  }
184
- createIncrementalityTest(body, observe = 'body', reportProgress = false) {
185
- if (body === null || body === undefined) {
186
- throw new Error('Required parameter body was null or undefined when calling createIncrementalityTest.');
222
+ createIncrementalityTestUsingPOST(incrementalityTestRequest, reqId, token, observe = 'body', reportProgress = false) {
223
+ if (incrementalityTestRequest === null || incrementalityTestRequest === undefined) {
224
+ throw new Error('Required parameter incrementalityTestRequest was null or undefined when calling createIncrementalityTestUsingPOST.');
187
225
  }
188
226
  let headers = this.defaultHeaders;
227
+ if (reqId !== undefined && reqId !== null) {
228
+ headers = headers.set('reqId', String(reqId));
229
+ }
230
+ if (token !== undefined && token !== null) {
231
+ headers = headers.set('token', String(token));
232
+ }
189
233
  // to determine the Accept header
190
234
  let httpHeaderAccepts = [
191
235
  'application/json'
@@ -202,23 +246,28 @@ export class ExperimentsControllerService {
202
246
  if (httpContentTypeSelected != undefined) {
203
247
  headers = headers.set('Content-Type', httpContentTypeSelected);
204
248
  }
205
- return this.httpClient.request('post', `${this.basePath}/v2/api/experiments/incrementalitytest/create`, {
206
- body: body,
249
+ return this.httpClient.post(`${this.basePath}/v2/api/experiments/incrementalitytest/create`, incrementalityTestRequest, {
207
250
  withCredentials: this.configuration.withCredentials,
208
251
  headers: headers,
209
252
  observe: observe,
210
253
  reportProgress: reportProgress
211
254
  });
212
255
  }
213
- deactivateABTest(expId, observe = 'body', reportProgress = false) {
256
+ deactivateABTestUsingPOST(expId, reqId, token, observe = 'body', reportProgress = false) {
214
257
  if (expId === null || expId === undefined) {
215
- throw new Error('Required parameter expId was null or undefined when calling deactivateABTest.');
258
+ throw new Error('Required parameter expId was null or undefined when calling deactivateABTestUsingPOST.');
216
259
  }
217
260
  let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
218
261
  if (expId !== undefined && expId !== null) {
219
262
  queryParameters = queryParameters.set('expId', expId);
220
263
  }
221
264
  let headers = this.defaultHeaders;
265
+ if (reqId !== undefined && reqId !== null) {
266
+ headers = headers.set('reqId', String(reqId));
267
+ }
268
+ if (token !== undefined && token !== null) {
269
+ headers = headers.set('token', String(token));
270
+ }
222
271
  // to determine the Accept header
223
272
  let httpHeaderAccepts = [
224
273
  'application/json'
@@ -228,8 +277,10 @@ export class ExperimentsControllerService {
228
277
  headers = headers.set('Accept', httpHeaderAcceptSelected);
229
278
  }
230
279
  // to determine the Content-Type header
231
- const consumes = [];
232
- return this.httpClient.request('post', `${this.basePath}/v2/api/experiments/abtest/deactivate`, {
280
+ const consumes = [
281
+ 'application/json'
282
+ ];
283
+ return this.httpClient.post(`${this.basePath}/v2/api/experiments/abtest/deactivate`, null, {
233
284
  params: queryParameters,
234
285
  withCredentials: this.configuration.withCredentials,
235
286
  headers: headers,
@@ -237,15 +288,21 @@ export class ExperimentsControllerService {
237
288
  reportProgress: reportProgress
238
289
  });
239
290
  }
240
- deactivateExperiment(experimentIds, observe = 'body', reportProgress = false) {
291
+ deactivateExperimentUsingPOST(experimentIds, reqId, token, observe = 'body', reportProgress = false) {
241
292
  if (experimentIds === null || experimentIds === undefined) {
242
- throw new Error('Required parameter experimentIds was null or undefined when calling deactivateExperiment.');
293
+ throw new Error('Required parameter experimentIds was null or undefined when calling deactivateExperimentUsingPOST.');
243
294
  }
244
295
  let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
245
296
  if (experimentIds !== undefined && experimentIds !== null) {
246
297
  queryParameters = queryParameters.set('experimentIds', experimentIds);
247
298
  }
248
299
  let headers = this.defaultHeaders;
300
+ if (reqId !== undefined && reqId !== null) {
301
+ headers = headers.set('reqId', String(reqId));
302
+ }
303
+ if (token !== undefined && token !== null) {
304
+ headers = headers.set('token', String(token));
305
+ }
249
306
  // to determine the Accept header
250
307
  let httpHeaderAccepts = [
251
308
  'application/json'
@@ -255,8 +312,10 @@ export class ExperimentsControllerService {
255
312
  headers = headers.set('Accept', httpHeaderAcceptSelected);
256
313
  }
257
314
  // to determine the Content-Type header
258
- const consumes = [];
259
- return this.httpClient.request('post', `${this.basePath}/v2/api/experiments/deactivate`, {
315
+ const consumes = [
316
+ 'application/json'
317
+ ];
318
+ return this.httpClient.post(`${this.basePath}/v2/api/experiments/deactivate`, null, {
260
319
  params: queryParameters,
261
320
  withCredentials: this.configuration.withCredentials,
262
321
  headers: headers,
@@ -264,11 +323,17 @@ export class ExperimentsControllerService {
264
323
  reportProgress: reportProgress
265
324
  });
266
325
  }
267
- getABTestById(experimentId, observe = 'body', reportProgress = false) {
326
+ getABTestByIdUsingGET(experimentId, reqId, token, observe = 'body', reportProgress = false) {
268
327
  if (experimentId === null || experimentId === undefined) {
269
- throw new Error('Required parameter experimentId was null or undefined when calling getABTestById.');
328
+ throw new Error('Required parameter experimentId was null or undefined when calling getABTestByIdUsingGET.');
270
329
  }
271
330
  let headers = this.defaultHeaders;
331
+ if (reqId !== undefined && reqId !== null) {
332
+ headers = headers.set('reqId', String(reqId));
333
+ }
334
+ if (token !== undefined && token !== null) {
335
+ headers = headers.set('token', String(token));
336
+ }
272
337
  // to determine the Accept header
273
338
  let httpHeaderAccepts = [
274
339
  'application/json'
@@ -279,18 +344,24 @@ export class ExperimentsControllerService {
279
344
  }
280
345
  // to determine the Content-Type header
281
346
  const consumes = [];
282
- return this.httpClient.request('get', `${this.basePath}/v2/api/experiments/abtest/get/${encodeURIComponent(String(experimentId))}`, {
347
+ return this.httpClient.get(`${this.basePath}/v2/api/experiments/abtest/get/${encodeURIComponent(String(experimentId))}`, {
283
348
  withCredentials: this.configuration.withCredentials,
284
349
  headers: headers,
285
350
  observe: observe,
286
351
  reportProgress: reportProgress
287
352
  });
288
353
  }
289
- getAllABTests(licenseeId, observe = 'body', reportProgress = false) {
354
+ getAllABTestsUsingGET(licenseeId, reqId, token, observe = 'body', reportProgress = false) {
290
355
  if (licenseeId === null || licenseeId === undefined) {
291
- throw new Error('Required parameter licenseeId was null or undefined when calling getAllABTests.');
356
+ throw new Error('Required parameter licenseeId was null or undefined when calling getAllABTestsUsingGET.');
292
357
  }
293
358
  let headers = this.defaultHeaders;
359
+ if (reqId !== undefined && reqId !== null) {
360
+ headers = headers.set('reqId', String(reqId));
361
+ }
362
+ if (token !== undefined && token !== null) {
363
+ headers = headers.set('token', String(token));
364
+ }
294
365
  // to determine the Accept header
295
366
  let httpHeaderAccepts = [
296
367
  'application/json'
@@ -301,18 +372,24 @@ export class ExperimentsControllerService {
301
372
  }
302
373
  // to determine the Content-Type header
303
374
  const consumes = [];
304
- return this.httpClient.request('get', `${this.basePath}/v2/api/experiments/abtest/all/get/${encodeURIComponent(String(licenseeId))}`, {
375
+ return this.httpClient.get(`${this.basePath}/v2/api/experiments/abtest/all/get/${encodeURIComponent(String(licenseeId))}`, {
305
376
  withCredentials: this.configuration.withCredentials,
306
377
  headers: headers,
307
378
  observe: observe,
308
379
  reportProgress: reportProgress
309
380
  });
310
381
  }
311
- getAllExperiments(licenseeId, observe = 'body', reportProgress = false) {
382
+ getAllExperimentsUsingGET(licenseeId, reqId, token, observe = 'body', reportProgress = false) {
312
383
  if (licenseeId === null || licenseeId === undefined) {
313
- throw new Error('Required parameter licenseeId was null or undefined when calling getAllExperiments.');
384
+ throw new Error('Required parameter licenseeId was null or undefined when calling getAllExperimentsUsingGET.');
314
385
  }
315
386
  let headers = this.defaultHeaders;
387
+ if (reqId !== undefined && reqId !== null) {
388
+ headers = headers.set('reqId', String(reqId));
389
+ }
390
+ if (token !== undefined && token !== null) {
391
+ headers = headers.set('token', String(token));
392
+ }
316
393
  // to determine the Accept header
317
394
  let httpHeaderAccepts = [
318
395
  'application/json'
@@ -323,22 +400,28 @@ export class ExperimentsControllerService {
323
400
  }
324
401
  // to determine the Content-Type header
325
402
  const consumes = [];
326
- return this.httpClient.request('get', `${this.basePath}/v2/api/experiments/all/get/${encodeURIComponent(String(licenseeId))}`, {
403
+ return this.httpClient.get(`${this.basePath}/v2/api/experiments/all/get/${encodeURIComponent(String(licenseeId))}`, {
327
404
  withCredentials: this.configuration.withCredentials,
328
405
  headers: headers,
329
406
  observe: observe,
330
407
  reportProgress: reportProgress
331
408
  });
332
409
  }
333
- getAllReportsForIncrementalityTest(licenseeId, refresh, observe = 'body', reportProgress = false) {
410
+ getAllReportsForIncrementalityTestUsingGET(licenseeId, refresh, reqId, token, observe = 'body', reportProgress = false) {
334
411
  if (licenseeId === null || licenseeId === undefined) {
335
- throw new Error('Required parameter licenseeId was null or undefined when calling getAllReportsForIncrementalityTest.');
412
+ throw new Error('Required parameter licenseeId was null or undefined when calling getAllReportsForIncrementalityTestUsingGET.');
336
413
  }
337
414
  let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
338
415
  if (refresh !== undefined && refresh !== null) {
339
416
  queryParameters = queryParameters.set('refresh', refresh);
340
417
  }
341
418
  let headers = this.defaultHeaders;
419
+ if (reqId !== undefined && reqId !== null) {
420
+ headers = headers.set('reqId', String(reqId));
421
+ }
422
+ if (token !== undefined && token !== null) {
423
+ headers = headers.set('token', String(token));
424
+ }
342
425
  // to determine the Accept header
343
426
  let httpHeaderAccepts = [
344
427
  'application/json'
@@ -349,7 +432,7 @@ export class ExperimentsControllerService {
349
432
  }
350
433
  // to determine the Content-Type header
351
434
  const consumes = [];
352
- return this.httpClient.request('get', `${this.basePath}/v2/api/experiments/incrementalitytest/all/get/${encodeURIComponent(String(licenseeId))}`, {
435
+ return this.httpClient.get(`${this.basePath}/v2/api/experiments/incrementalitytest/all/get/${encodeURIComponent(String(licenseeId))}`, {
353
436
  params: queryParameters,
354
437
  withCredentials: this.configuration.withCredentials,
355
438
  headers: headers,
@@ -357,15 +440,21 @@ export class ExperimentsControllerService {
357
440
  reportProgress: reportProgress
358
441
  });
359
442
  }
360
- getAudienceForIncrementalityTest(campaignId, experimentId, observe = 'body', reportProgress = false) {
443
+ getAudienceForIncrementalityTestUsingGET(campaignId, experimentId, reqId, token, observe = 'body', reportProgress = false) {
361
444
  if (campaignId === null || campaignId === undefined) {
362
- throw new Error('Required parameter campaignId was null or undefined when calling getAudienceForIncrementalityTest.');
445
+ throw new Error('Required parameter campaignId was null or undefined when calling getAudienceForIncrementalityTestUsingGET.');
363
446
  }
364
447
  let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
365
448
  if (experimentId !== undefined && experimentId !== null) {
366
449
  queryParameters = queryParameters.set('experimentId', experimentId);
367
450
  }
368
451
  let headers = this.defaultHeaders;
452
+ if (reqId !== undefined && reqId !== null) {
453
+ headers = headers.set('reqId', String(reqId));
454
+ }
455
+ if (token !== undefined && token !== null) {
456
+ headers = headers.set('token', String(token));
457
+ }
369
458
  // to determine the Accept header
370
459
  let httpHeaderAccepts = [
371
460
  'application/json'
@@ -376,7 +465,7 @@ export class ExperimentsControllerService {
376
465
  }
377
466
  // to determine the Content-Type header
378
467
  const consumes = [];
379
- return this.httpClient.request('get', `${this.basePath}/v2/api/experiments/incrementalitytest/audience/get/${encodeURIComponent(String(campaignId))}`, {
468
+ return this.httpClient.get(`${this.basePath}/v2/api/experiments/incrementalitytest/audience/get/${encodeURIComponent(String(campaignId))}`, {
380
469
  params: queryParameters,
381
470
  withCredentials: this.configuration.withCredentials,
382
471
  headers: headers,
@@ -384,12 +473,18 @@ export class ExperimentsControllerService {
384
473
  reportProgress: reportProgress
385
474
  });
386
475
  }
387
- getAudienceForStrategyUpdateInIncrementalityTest(campaignId, observe = 'body', reportProgress = false) {
476
+ getAudienceForStrategyUpdateInIncrementalityTestUsingPOST(campaignId, reqId, token, observe = 'body', reportProgress = false) {
388
477
  let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
389
478
  if (campaignId !== undefined && campaignId !== null) {
390
479
  queryParameters = queryParameters.set('campaignId', campaignId);
391
480
  }
392
481
  let headers = this.defaultHeaders;
482
+ if (reqId !== undefined && reqId !== null) {
483
+ headers = headers.set('reqId', String(reqId));
484
+ }
485
+ if (token !== undefined && token !== null) {
486
+ headers = headers.set('token', String(token));
487
+ }
393
488
  // to determine the Accept header
394
489
  let httpHeaderAccepts = [
395
490
  'application/json'
@@ -399,8 +494,10 @@ export class ExperimentsControllerService {
399
494
  headers = headers.set('Accept', httpHeaderAcceptSelected);
400
495
  }
401
496
  // to determine the Content-Type header
402
- const consumes = [];
403
- return this.httpClient.request('post', `${this.basePath}/v2/api/experiments/incrementalitytest/strategy/audience`, {
497
+ const consumes = [
498
+ 'application/json'
499
+ ];
500
+ return this.httpClient.post(`${this.basePath}/v2/api/experiments/incrementalitytest/strategy/audience`, null, {
404
501
  params: queryParameters,
405
502
  withCredentials: this.configuration.withCredentials,
406
503
  headers: headers,
@@ -408,15 +505,21 @@ export class ExperimentsControllerService {
408
505
  reportProgress: reportProgress
409
506
  });
410
507
  }
411
- getIncrementalityTestById(experimentId, refresh, observe = 'body', reportProgress = false) {
508
+ getIncrementalityTestByIdUsingGET(experimentId, refresh, reqId, token, observe = 'body', reportProgress = false) {
412
509
  if (experimentId === null || experimentId === undefined) {
413
- throw new Error('Required parameter experimentId was null or undefined when calling getIncrementalityTestById.');
510
+ throw new Error('Required parameter experimentId was null or undefined when calling getIncrementalityTestByIdUsingGET.');
414
511
  }
415
512
  let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
416
513
  if (refresh !== undefined && refresh !== null) {
417
514
  queryParameters = queryParameters.set('refresh', refresh);
418
515
  }
419
516
  let headers = this.defaultHeaders;
517
+ if (reqId !== undefined && reqId !== null) {
518
+ headers = headers.set('reqId', String(reqId));
519
+ }
520
+ if (token !== undefined && token !== null) {
521
+ headers = headers.set('token', String(token));
522
+ }
420
523
  // to determine the Accept header
421
524
  let httpHeaderAccepts = [
422
525
  'application/json'
@@ -427,7 +530,7 @@ export class ExperimentsControllerService {
427
530
  }
428
531
  // to determine the Content-Type header
429
532
  const consumes = [];
430
- return this.httpClient.request('get', `${this.basePath}/v2/api/experiments/incrementalitytest/get/${encodeURIComponent(String(experimentId))}`, {
533
+ return this.httpClient.get(`${this.basePath}/v2/api/experiments/incrementalitytest/get/${encodeURIComponent(String(experimentId))}`, {
431
534
  params: queryParameters,
432
535
  withCredentials: this.configuration.withCredentials,
433
536
  headers: headers,
@@ -435,15 +538,21 @@ export class ExperimentsControllerService {
435
538
  reportProgress: reportProgress
436
539
  });
437
540
  }
438
- getIncrementalityTestReportCsvById(experimentId, refresh, observe = 'body', reportProgress = false) {
541
+ getIncrementalityTestReportCsvByIdUsingGET(experimentId, refresh, reqId, token, observe = 'body', reportProgress = false) {
439
542
  if (experimentId === null || experimentId === undefined) {
440
- throw new Error('Required parameter experimentId was null or undefined when calling getIncrementalityTestReportCsvById.');
543
+ throw new Error('Required parameter experimentId was null or undefined when calling getIncrementalityTestReportCsvByIdUsingGET.');
441
544
  }
442
545
  let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
443
546
  if (refresh !== undefined && refresh !== null) {
444
547
  queryParameters = queryParameters.set('refresh', refresh);
445
548
  }
446
549
  let headers = this.defaultHeaders;
550
+ if (reqId !== undefined && reqId !== null) {
551
+ headers = headers.set('reqId', String(reqId));
552
+ }
553
+ if (token !== undefined && token !== null) {
554
+ headers = headers.set('token', String(token));
555
+ }
447
556
  // to determine the Accept header
448
557
  let httpHeaderAccepts = [
449
558
  'application/json'
@@ -454,7 +563,7 @@ export class ExperimentsControllerService {
454
563
  }
455
564
  // to determine the Content-Type header
456
565
  const consumes = [];
457
- return this.httpClient.request('get', `${this.basePath}/v2/api/experiments/incrementalitytest/report/csv/get/${encodeURIComponent(String(experimentId))}`, {
566
+ return this.httpClient.get(`${this.basePath}/v2/api/experiments/incrementalitytest/report/csv/get/${encodeURIComponent(String(experimentId))}`, {
458
567
  params: queryParameters,
459
568
  withCredentials: this.configuration.withCredentials,
460
569
  headers: headers,
@@ -462,15 +571,21 @@ export class ExperimentsControllerService {
462
571
  reportProgress: reportProgress
463
572
  });
464
573
  }
465
- getReportForIncrementalityTestById(experimentId, refresh, observe = 'body', reportProgress = false) {
574
+ getReportForIncrementalityTestByIdUsingGET(experimentId, refresh, reqId, token, observe = 'body', reportProgress = false) {
466
575
  if (experimentId === null || experimentId === undefined) {
467
- throw new Error('Required parameter experimentId was null or undefined when calling getReportForIncrementalityTestById.');
576
+ throw new Error('Required parameter experimentId was null or undefined when calling getReportForIncrementalityTestByIdUsingGET.');
468
577
  }
469
578
  let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
470
579
  if (refresh !== undefined && refresh !== null) {
471
580
  queryParameters = queryParameters.set('refresh', refresh);
472
581
  }
473
582
  let headers = this.defaultHeaders;
583
+ if (reqId !== undefined && reqId !== null) {
584
+ headers = headers.set('reqId', String(reqId));
585
+ }
586
+ if (token !== undefined && token !== null) {
587
+ headers = headers.set('token', String(token));
588
+ }
474
589
  // to determine the Accept header
475
590
  let httpHeaderAccepts = [
476
591
  'application/json'
@@ -481,7 +596,7 @@ export class ExperimentsControllerService {
481
596
  }
482
597
  // to determine the Content-Type header
483
598
  const consumes = [];
484
- return this.httpClient.request('get', `${this.basePath}/v2/api/experiments/incrementalitytest/report/get/${encodeURIComponent(String(experimentId))}`, {
599
+ return this.httpClient.get(`${this.basePath}/v2/api/experiments/incrementalitytest/report/get/${encodeURIComponent(String(experimentId))}`, {
485
600
  params: queryParameters,
486
601
  withCredentials: this.configuration.withCredentials,
487
602
  headers: headers,
@@ -489,12 +604,12 @@ export class ExperimentsControllerService {
489
604
  reportProgress: reportProgress
490
605
  });
491
606
  }
492
- getVariantReportByExperimentId(showuu, experimentId, refresh, observe = 'body', reportProgress = false) {
493
- if (showuu === null || showuu === undefined) {
494
- throw new Error('Required parameter showuu was null or undefined when calling getVariantReportByExperimentId.');
495
- }
607
+ getVariantReportByExperimentIdUsingPOST(experimentId, showuu, refresh, reqId, token, observe = 'body', reportProgress = false) {
496
608
  if (experimentId === null || experimentId === undefined) {
497
- throw new Error('Required parameter experimentId was null or undefined when calling getVariantReportByExperimentId.');
609
+ throw new Error('Required parameter experimentId was null or undefined when calling getVariantReportByExperimentIdUsingPOST.');
610
+ }
611
+ if (showuu === null || showuu === undefined) {
612
+ throw new Error('Required parameter showuu was null or undefined when calling getVariantReportByExperimentIdUsingPOST.');
498
613
  }
499
614
  let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
500
615
  if (refresh !== undefined && refresh !== null) {
@@ -504,6 +619,12 @@ export class ExperimentsControllerService {
504
619
  queryParameters = queryParameters.set('showuu', showuu);
505
620
  }
506
621
  let headers = this.defaultHeaders;
622
+ if (reqId !== undefined && reqId !== null) {
623
+ headers = headers.set('reqId', String(reqId));
624
+ }
625
+ if (token !== undefined && token !== null) {
626
+ headers = headers.set('token', String(token));
627
+ }
507
628
  // to determine the Accept header
508
629
  let httpHeaderAccepts = [
509
630
  'application/json'
@@ -513,8 +634,10 @@ export class ExperimentsControllerService {
513
634
  headers = headers.set('Accept', httpHeaderAcceptSelected);
514
635
  }
515
636
  // to determine the Content-Type header
516
- const consumes = [];
517
- return this.httpClient.request('post', `${this.basePath}/v2/api/experiments/abtest/report/get/${encodeURIComponent(String(experimentId))}`, {
637
+ const consumes = [
638
+ 'application/json'
639
+ ];
640
+ return this.httpClient.post(`${this.basePath}/v2/api/experiments/abtest/report/get/${encodeURIComponent(String(experimentId))}`, null, {
518
641
  params: queryParameters,
519
642
  withCredentials: this.configuration.withCredentials,
520
643
  headers: headers,
@@ -522,14 +645,20 @@ export class ExperimentsControllerService {
522
645
  reportProgress: reportProgress
523
646
  });
524
647
  }
525
- updateABTest(body, experimentId, observe = 'body', reportProgress = false) {
526
- if (body === null || body === undefined) {
527
- throw new Error('Required parameter body was null or undefined when calling updateABTest.');
648
+ updateABTestUsingPOST(dto, experimentId, reqId, token, observe = 'body', reportProgress = false) {
649
+ if (dto === null || dto === undefined) {
650
+ throw new Error('Required parameter dto was null or undefined when calling updateABTestUsingPOST.');
528
651
  }
529
652
  if (experimentId === null || experimentId === undefined) {
530
- throw new Error('Required parameter experimentId was null or undefined when calling updateABTest.');
653
+ throw new Error('Required parameter experimentId was null or undefined when calling updateABTestUsingPOST.');
531
654
  }
532
655
  let headers = this.defaultHeaders;
656
+ if (reqId !== undefined && reqId !== null) {
657
+ headers = headers.set('reqId', String(reqId));
658
+ }
659
+ if (token !== undefined && token !== null) {
660
+ headers = headers.set('token', String(token));
661
+ }
533
662
  // to determine the Accept header
534
663
  let httpHeaderAccepts = [
535
664
  'application/json'
@@ -546,22 +675,27 @@ export class ExperimentsControllerService {
546
675
  if (httpContentTypeSelected != undefined) {
547
676
  headers = headers.set('Content-Type', httpContentTypeSelected);
548
677
  }
549
- return this.httpClient.request('post', `${this.basePath}/v2/api/experiments/abtest/update/${encodeURIComponent(String(experimentId))}`, {
550
- body: body,
678
+ return this.httpClient.post(`${this.basePath}/v2/api/experiments/abtest/update/${encodeURIComponent(String(experimentId))}`, dto, {
551
679
  withCredentials: this.configuration.withCredentials,
552
680
  headers: headers,
553
681
  observe: observe,
554
682
  reportProgress: reportProgress
555
683
  });
556
684
  }
557
- updateIncrementalityTest(body, experimentId, observe = 'body', reportProgress = false) {
558
- if (body === null || body === undefined) {
559
- throw new Error('Required parameter body was null or undefined when calling updateIncrementalityTest.');
560
- }
685
+ updateIncrementalityTestUsingPOST(experimentId, incrementalityTestDTO, reqId, token, observe = 'body', reportProgress = false) {
561
686
  if (experimentId === null || experimentId === undefined) {
562
- throw new Error('Required parameter experimentId was null or undefined when calling updateIncrementalityTest.');
687
+ throw new Error('Required parameter experimentId was null or undefined when calling updateIncrementalityTestUsingPOST.');
688
+ }
689
+ if (incrementalityTestDTO === null || incrementalityTestDTO === undefined) {
690
+ throw new Error('Required parameter incrementalityTestDTO was null or undefined when calling updateIncrementalityTestUsingPOST.');
563
691
  }
564
692
  let headers = this.defaultHeaders;
693
+ if (reqId !== undefined && reqId !== null) {
694
+ headers = headers.set('reqId', String(reqId));
695
+ }
696
+ if (token !== undefined && token !== null) {
697
+ headers = headers.set('token', String(token));
698
+ }
565
699
  // to determine the Accept header
566
700
  let httpHeaderAccepts = [
567
701
  'application/json'
@@ -578,8 +712,7 @@ export class ExperimentsControllerService {
578
712
  if (httpContentTypeSelected != undefined) {
579
713
  headers = headers.set('Content-Type', httpContentTypeSelected);
580
714
  }
581
- return this.httpClient.request('post', `${this.basePath}/v2/api/experiments/incrementalitytest/update/${encodeURIComponent(String(experimentId))}`, {
582
- body: body,
715
+ return this.httpClient.post(`${this.basePath}/v2/api/experiments/incrementalitytest/update/${encodeURIComponent(String(experimentId))}`, incrementalityTestDTO, {
583
716
  withCredentials: this.configuration.withCredentials,
584
717
  headers: headers,
585
718
  observe: observe,
@@ -599,4 +732,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
599
732
  }] }, { type: i2.Configuration, decorators: [{
600
733
  type: Optional
601
734
  }] }]; } });
602
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwZXJpbWVudHNDb250cm9sbGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hcGkvZXhwZXJpbWVudHNDb250cm9sbGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRyxDQUFBLHVEQUF1RDtBQUUxRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBMkIsZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBYyxXQUFXLEVBQUUsVUFBVSxFQUNWLE1BQWdDLHNCQUFzQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUE2QixZQUFZLENBQUM7QUFtQi9FLE9BQU8sRUFBRSxTQUFTLEVBQXNCLE1BQTBCLGNBQWMsQ0FBQztBQUNqRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQTBDLGtCQUFrQixDQUFDOzs7O0FBSXJGLE1BQU0sT0FBTyw0QkFBNEI7SUFNckMsWUFBc0IsVUFBc0IsRUFBZ0MsUUFBZ0IsRUFBYyxhQUE0QjtRQUFoSCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBSmxDLGFBQVEsR0FBRyxpQ0FBaUMsQ0FBQztRQUNoRCxtQkFBYyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDbkMsa0JBQWEsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBR3ZDLElBQUksUUFBUSxFQUFFO1lBQ1YsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7U0FDNUI7UUFDRCxJQUFJLGFBQWEsRUFBRTtZQUNmLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1lBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLGFBQWEsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUN2RTtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSyxjQUFjLENBQUMsUUFBa0I7UUFDckMsTUFBTSxJQUFJLEdBQUcscUJBQXFCLENB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Q0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6RyxJQUFJLHVCQUF1QixJQUFJLFNBQVMsRUFBRTtZQUN0QyxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztTQUNsRTtRQUVELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQTZDLE1BQU0sRUFBQyxHQUFHLElBQUksQ0FBQyxRQUFRLGlEQUFpRCxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxFQUN6TDtZQUNJLElBQUksRUFBRSxJQUFJO1lBQ1YsZUFBZSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZTtZQUNuRCxPQUFPLEVBQUUsT0FBTztZQUNoQixPQUFPLEVBQUUsT0FBTztZQUNoQixjQUFjLEVBQUUsY0FBYztTQUNqQyxDQUNKLENBQUM7SUFDTixDQUFDOzswSEFsOUJRLDRCQUE0Qiw0Q0FNNEIsU0FBUzs4SEFOakUsNEJBQTRCOzRGQUE1Qiw0QkFBNEI7a0JBRHhDLFVBQVU7OzBCQU93QyxRQUFROzswQkFBRyxNQUFNOzJCQUFDLFNBQVM7OzBCQUFxQixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQVBJIGRlZmluaXRpb25cbiAqIE5vIGRlc2NyaXB0aW9uIHByb3ZpZGVkIChnZW5lcmF0ZWQgYnkgU3dhZ2dlciBDb2RlZ2VuIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4pXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IHYwXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzd2FnZ2VyIGNvZGUgZ2VuZXJhdG9yIHByb2dyYW0uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuLmdpdFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovLyogdHNsaW50OmRpc2FibGU6bm8tdW51c2VkLXZhcmlhYmxlIG1lbWJlci1vcmRlcmluZyAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gICAgICAgICAgICAgICAgICAgICAgZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyxcbiAgICAgICAgIEh0dHBSZXNwb25zZSwgSHR0cEV2ZW50IH0gICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYyB9ICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vZW5jb2Rlcic7XG5cbmltcG9ydCB7IE9ic2VydmFibGUgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQUJUZXN0aW5nRFRPIH0gZnJvbSAnLi4vbW9kZWwvYUJUZXN0aW5nRFRPJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlT2JqZWN0QUJUZXN0aW5nUmVzcG9uc2VEZXRhaWxzIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RBQlRlc3RpbmdSZXNwb25zZURldGFpbHMnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3RDcmVhdGVGb3JtQXVkaWVuY2VSZXNwb25zZU9iamVjdCB9IGZyb20gJy4uL21vZGVsL2FwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0Q3JlYXRlRm9ybUF1ZGllbmNlUmVzcG9uc2VPYmplY3QnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3REZXRhaWxzIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3REZXRhaWxzJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0UmVwb3J0Q2FsY3VsYXRpb25EZXRhaWxzIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3RSZXBvcnRDYWxjdWxhdGlvbkRldGFpbHMnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3RSZXNwb25zZSB9IGZyb20gJy4uL21vZGVsL2FwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0UmVzcG9uc2UnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RMaXN0QUJUZXN0aW5nUmVzcG9uc2VEZXRhaWxzIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RMaXN0QUJUZXN0aW5nUmVzcG9uc2VEZXRhaWxzJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlT2JqZWN0TGlzdERhc2hib2FyZFJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RMaXN0RGFzaGJvYXJkUmVzcG9uc2UnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RMaXN0RXhwZXJpbWVudHNFbnRpdHkgfSBmcm9tICcuLi9tb2RlbC9hcGlSZXNwb25zZU9iamVjdExpc3RFeHBlcmltZW50c0VudGl0eSc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZU9iamVjdExpc3RJbmNyZW1lbnRhbGl0eVRlc3REZXRhaWxzIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RMaXN0SW5jcmVtZW50YWxpdHlUZXN0RGV0YWlscyc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZU9iamVjdE1hcExvbmdSZXNwb25zZU1lc3NhZ2UgfSBmcm9tICcuLi9tb2RlbC9hcGlSZXNwb25zZU9iamVjdE1hcExvbmdSZXNwb25zZU1lc3NhZ2UnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RTdHJhdGVneUF1ZGllbmNlSW5jVGVzdE1hcCB9IGZyb20gJy4uL21vZGVsL2FwaVJlc3BvbnNlT2JqZWN0U3RyYXRlZ3lBdWRpZW5jZUluY1Rlc3RNYXAnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RWb2lkIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RWb2lkJztcbmltcG9ydCB7IEluY3JlbWVudGFsaXR5VGVzdERUTyB9IGZyb20gJy4uL21vZGVsL2luY3JlbWVudGFsaXR5VGVzdERUTyc7XG5cbmltcG9ydCB7IEJBU0VfUEFUSCwgQ09MTEVDVElPTl9GT1JNQVRTIH0gICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi92YXJpYWJsZXMnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24nO1xuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBFeHBlcmltZW50c0NvbnRyb2xsZXJTZXJ2aWNlIHtcblxuICAgIHByb3RlY3RlZCBiYXNlUGF0aCA9ICdodHRwczovL2JldGEwMi1hcGl2Mi5hdG9tZXgubmV0JztcbiAgICBwdWJsaWMgZGVmYXVsdEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaHR0cENsaWVudDogSHR0cENsaWVudCwgQE9wdGlvbmFsKClASW5qZWN0KEJBU0VfUEFUSCkgYmFzZVBhdGg6IHN0cmluZywgQE9wdGlvbmFsKCkgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbikge1xuICAgICAgICBpZiAoYmFzZVBhdGgpIHtcbiAgICAgICAgICAgIHRoaXMuYmFzZVBhdGggPSBiYXNlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgICAgICAgICAgIHRoaXMuYmFzZVBhdGggPSBiYXNlUGF0aCB8fCBjb25maWd1cmF0aW9uLmJhc2VQYXRoIHx8IHRoaXMuYmFzZVBhdGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29uc3VtZXMgc3RyaW5nW10gbWltZS10eXBlc1xuICAgICAqIEByZXR1cm4gdHJ1ZTogY29uc3VtZXMgY29udGFpbnMgJ211bHRpcGFydC9mb3JtLWRhdGEnLCBmYWxzZTogb3RoZXJ3aXNlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjYW5Db25zdW1lRm9ybShjb25zdW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZm9ybSA9ICdtdWx0aXBhcnQvZm9ybS1kYXRhJztcbiAgICAgICAgZm9yIChjb25zdCBjb25zdW1lIG9mIGNvbnN1bWVzKSB7XG4gICAgICAgICAgICBpZiAoZm9ybSA9PT0gY29uc3VtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqICBBUEkgdG8gYWN0aXZhdGUgQUIgVGVzdCBFeHBlcmltZW50LlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBleHBJZCBcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWN0aXZhdGVBQlRlc3QoZXhwSWQ6IGFueSwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdFZvaWQ+O1xuICAgIHB1YmxpYyBhY3RpdmF0ZUFCVGVzdChleHBJZDogYW55LCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RWb2lkPj47XG4gICAgcHVibGljIGFjdGl2YXRlQUJUZXN0KGV4cElkOiBhbnksIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3RWb2lkPj47XG4gICAgcHVibGljIGFjdGl2YXRlQUJUZXN0KGV4cElkOiBhbnksIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChleHBJZCA9PT0gbnVsbCB8fCBleHBJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBleHBJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGFjdGl2YXRlQUJUZXN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiBuZXcgQ3VzdG9tSHR0cFVybEVuY29kaW5nQ29kZWMoKX0pO1xuICAgICAgICBpZiAoZXhwSWQgIT09IHVuZGVmaW5lZCAmJiBleHBJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnZXhwSWQnLCA8YW55PmV4cElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8QXBpUmVzcG9uc2VPYmplY3RWb2lkPigncG9zdCcsYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2V4cGVyaW1lbnRzL2FidGVzdC9hY3RpdmF0ZWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiBxdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBUEkgdG8gQWN0aXZhdGUgTGlzdHMgb2YgSW5jcmVtZW50YWxpdHkgVGVzdCBFeHBlcmltZW50IElkcy5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZXhwZXJpbWVudElkcyBcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWN0aXZhdGVFeHBlcmltZW50KGV4cGVyaW1lbnRJZHM6IGFueSwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdE1hcExvbmdSZXNwb25zZU1lc3NhZ2U+O1xuICAgIHB1YmxpYyBhY3RpdmF0ZUV4cGVyaW1lbnQoZXhwZXJpbWVudElkczogYW55LCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RNYXBMb25nUmVzcG9uc2VNZXNzYWdlPj47XG4gICAgcHVibGljIGFjdGl2YXRlRXhwZXJpbWVudChleHBlcmltZW50SWRzOiBhbnksIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3RNYXBMb25nUmVzcG9uc2VNZXNzYWdlPj47XG4gICAgcHVibGljIGFjdGl2YXRlRXhwZXJpbWVudChleHBlcmltZW50SWRzOiBhbnksIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChleHBlcmltZW50SWRzID09PSBudWxsIHx8IGV4cGVyaW1lbnRJZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZXhwZXJpbWVudElkcyB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGFjdGl2YXRlRXhwZXJpbWVudC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogbmV3IEN1c3RvbUh0dHBVcmxFbmNvZGluZ0NvZGVjKCl9KTtcbiAgICAgICAgaWYgKGV4cGVyaW1lbnRJZHMgIT09IHVuZGVmaW5lZCAmJiBleHBlcmltZW50SWRzICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdleHBlcmltZW50SWRzJywgPGFueT5leHBlcmltZW50SWRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8QXBpUmVzcG9uc2VPYmplY3RNYXBMb25nUmVzcG9uc2VNZXNzYWdlPigncG9zdCcsYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2V4cGVyaW1lbnRzL2FjdGl2YXRlYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBBUEkgdG8gYXJjaGl2ZSBBQiBUZXN0IEV4cGVyaW1lbnQuXG4gICAgICogXG4gICAgICogQHBhcmFtIGV4cElkIFxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBhcmNoaXZlQUJUZXN0KGV4cElkOiBhbnksIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3RWb2lkPjtcbiAgICBwdWJsaWMgYXJjaGl2ZUFCVGVzdChleHBJZDogYW55LCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RWb2lkPj47XG4gICAgcHVibGljIGFyY2hpdmVBQlRlc3QoZXhwSWQ6IGFueSwgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdFZvaWQ+PjtcbiAgICBwdWJsaWMgYXJjaGl2ZUFCVGVzdChleHBJZDogYW55LCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoZXhwSWQgPT09IG51bGwgfHwgZXhwSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZXhwSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBhcmNoaXZlQUJUZXN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiBuZXcgQ3VzdG9tSHR0cFVybEVuY29kaW5nQ29kZWMoKX0pO1xuICAgICAgICBpZiAoZXhwSWQgIT09IHVuZGVmaW5lZCAmJiBleHBJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnZXhwSWQnLCA8YW55PmV4cElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8QXBpUmVzcG9uc2VPYmplY3RWb2lkPigncG9zdCcsYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2V4cGVyaW1lbnRzL2FidGVzdC9hcmNoaXZlYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFQSSB0byBBcmNoaXZlIExpc3RzIG9mIEluY3JlbWVudGFsaXR5IFRlc3QgRXhwZXJpbWVudCBpZHNcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZXhwZXJpbWVudElkcyBcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXJjaGl2ZUV4cGVyaW1lbnQoZXhwZXJpbWVudElkczogYW55LCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0TWFwTG9uZ1Jlc3BvbnNlTWVzc2FnZT47XG4gICAgcHVibGljIGFyY2hpdmVFeHBlcmltZW50KGV4cGVyaW1lbnRJZHM6IGFueSwgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwaVJlc3BvbnNlT2JqZWN0TWFwTG9uZ1Jlc3BvbnNlTWVzc2FnZT4+O1xuICAgIHB1YmxpYyBhcmNoaXZlRXhwZXJpbWVudChleHBlcmltZW50SWRzOiBhbnksIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3RNYXBMb25nUmVzcG9uc2VNZXNzYWdlPj47XG4gICAgcHVibGljIGFyY2hpdmVFeHBlcmltZW50KGV4cGVyaW1lbnRJZHM6IGFueSwgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGV4cGVyaW1lbnRJZHMgPT09IG51bGwgfHwgZXhwZXJpbWVudElkcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBleHBlcmltZW50SWRzIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgYXJjaGl2ZUV4cGVyaW1lbnQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IG5ldyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYygpfSk7XG4gICAgICAgIGlmIChleHBlcmltZW50SWRzICE9PSB1bmRlZmluZWQgJiYgZXhwZXJpbWVudElkcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnZXhwZXJpbWVudElkcycsIDxhbnk+ZXhwZXJpbWVudElkcyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEFwaVJlc3BvbnNlT2JqZWN0TWFwTG9uZ1Jlc3BvbnNlTWVzc2FnZT4oJ3Bvc3QnLGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9leHBlcmltZW50cy9hcmNoaXZlYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBBcGkgdG8gIGNyZWF0ZSBBQiBUZXN0IEV4cGVyaW1lbnQuXG4gICAgICogXG4gICAgICogQHBhcmFtIGJvZHkgXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUFCVGVzdChib2R5OiBBQlRlc3RpbmdEVE8sIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3RBQlRlc3RpbmdSZXNwb25zZURldGFpbHM+O1xuICAgIHB1YmxpYyBjcmVhdGVBQlRlc3QoYm9keTogQUJUZXN0aW5nRFRPLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RBQlRlc3RpbmdSZXNwb25zZURldGFpbHM+PjtcbiAgICBwdWJsaWMgY3JlYXRlQUJUZXN0KGJvZHk6IEFCVGVzdGluZ0RUTywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdEFCVGVzdGluZ1Jlc3BvbnNlRGV0YWlscz4+O1xuICAgIHB1YmxpYyBjcmVhdGVBQlRlc3QoYm9keTogQUJUZXN0aW5nRFRPLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoYm9keSA9PT0gbnVsbCB8fCBib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGJvZHkgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjcmVhdGVBQlRlc3QuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEFwaVJlc3BvbnNlT2JqZWN0QUJUZXN0aW5nUmVzcG9uc2VEZXRhaWxzPigncG9zdCcsYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2V4cGVyaW1lbnRzL2FidGVzdC9jcmVhdGVgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGJvZHk6IGJvZHksXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQXBpIHRvICBjcmVhdGUgSW5jcmVtZW50YWxpdHkgVGVzdCBFeHBlcmltZW50LlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBib2R5IFxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVJbmNyZW1lbnRhbGl0eVRlc3QoYm9keTogSW5jcmVtZW50YWxpdHlUZXN0RFRPLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0UmVzcG9uc2U+O1xuICAgIHB1YmxpYyBjcmVhdGVJbmNyZW1lbnRhbGl0eVRlc3QoYm9keTogSW5jcmVtZW50YWxpdHlUZXN0RFRPLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3RSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBjcmVhdGVJbmNyZW1lbnRhbGl0eVRlc3QoYm9keTogSW5jcmVtZW50YWxpdHlUZXN0RFRPLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0UmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgY3JlYXRlSW5jcmVtZW50YWxpdHlUZXN0KGJvZHk6IEluY3JlbWVudGFsaXR5VGVzdERUTywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGJvZHkgPT09IG51bGwgfHwgYm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBib2R5IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY3JlYXRlSW5jcmVtZW50YWxpdHlUZXN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdFJlc3BvbnNlPigncG9zdCcsYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2V4cGVyaW1lbnRzL2luY3JlbWVudGFsaXR5dGVzdC9jcmVhdGVgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGJvZHk6IGJvZHksXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQVBJIHRvIGRlYWN0aXZhdGUgQUIgVGVzdCBFeHBlcmltZW50LlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBleHBJZCBcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVhY3RpdmF0ZUFCVGVzdChleHBJZDogYW55LCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0Vm9pZD47XG4gICAgcHVibGljIGRlYWN0aXZhdGVBQlRlc3QoZXhwSWQ6IGFueSwgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwaVJlc3BvbnNlT2JqZWN0Vm9pZD4+O1xuICAgIHB1YmxpYyBkZWFjdGl2YXRlQUJUZXN0KGV4cElkOiBhbnksIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3RWb2lkPj47XG4gICAgcHVibGljIGRlYWN0aXZhdGVBQlRlc3QoZXhwSWQ6IGFueSwgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGV4cElkID09PSBudWxsIHx8IGV4cElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGV4cElkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVhY3RpdmF0ZUFCVGVzdC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogbmV3IEN1c3RvbUh0dHBVcmxFbmNvZGluZ0NvZGVjKCl9KTtcbiAgICAgICAgaWYgKGV4cElkICE9PSB1bmRlZmluZWQgJiYgZXhwSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycyA9IHF1ZXJ5UGFyYW1ldGVycy5zZXQoJ2V4cElkJywgPGFueT5leHBJZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEFwaVJlc3BvbnNlT2JqZWN0Vm9pZD4oJ3Bvc3QnLGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9leHBlcmltZW50cy9hYnRlc3QvZGVhY3RpdmF0ZWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiBxdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBUEkgdG8gRGVhY3RpdmF0ZSBMaXN0cyBvZiBJbmNyZW1lbnRhbGl0eSBUZXN0IEV4cGVyaW1lbnQgSWRzXG4gICAgICogXG4gICAgICogQHBhcmFtIGV4cGVyaW1lbnRJZHMgXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGRlYWN0aXZhdGVFeHBlcmltZW50KGV4cGVyaW1lbnRJZHM6IGFueSwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdE1hcExvbmdSZXNwb25zZU1lc3NhZ2U+O1xuICAgIHB1YmxpYyBkZWFjdGl2YXRlRXhwZXJpbWVudChleHBlcmltZW50SWRzOiBhbnksIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdE1hcExvbmdSZXNwb25zZU1lc3NhZ2U+PjtcbiAgICBwdWJsaWMgZGVhY3RpdmF0ZUV4cGVyaW1lbnQoZXhwZXJpbWVudElkczogYW55LCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0TWFwTG9uZ1Jlc3BvbnNlTWVzc2FnZT4+O1xuICAgIHB1YmxpYyBkZWFjdGl2YXRlRXhwZXJpbWVudChleHBlcmltZW50SWRzOiBhbnksIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChleHBlcmltZW50SWRzID09PSBudWxsIHx8IGV4cGVyaW1lbnRJZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZXhwZXJpbWVudElkcyB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRlYWN0aXZhdGVFeHBlcmltZW50LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiBuZXcgQ3VzdG9tSHR0cFVybEVuY29kaW5nQ29kZWMoKX0pO1xuICAgICAgICBpZiAoZXhwZXJpbWVudElkcyAhPT0gdW5kZWZpbmVkICYmIGV4cGVyaW1lbnRJZHMgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycyA9IHF1ZXJ5UGFyYW1ldGVycy5zZXQoJ2V4cGVyaW1lbnRJZHMnLCA8YW55PmV4cGVyaW1lbnRJZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxBcGlSZXNwb25zZU9iamVjdE1hcExvbmdSZXNwb25zZU1lc3NhZ2U+KCdwb3N0JyxgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZXhwZXJpbWVudHMvZGVhY3RpdmF0ZWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiBxdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQVBJIHRvIGdldCBhbiBleGlzdGluZyBBQiBUZXN0IE1ldGFkYXRhIGJ5IEV4cGVyaW1lbnQgSWQuXG4gICAgICogXG4gICAgICogQHBhcmFtIGV4cGVyaW1lbnRJZCBcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QUJUZXN0QnlJZChleHBlcmltZW50SWQ6IGFueSwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdEFCVGVzdGluZ1Jlc3BvbnNlRGV0YWlscz47XG4gICAgcHVibGljIGdldEFCVGVzdEJ5SWQoZXhwZXJpbWVudElkOiBhbnksIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdEFCVGVzdGluZ1Jlc3BvbnNlRGV0YWlscz4+O1xuICAgIHB1YmxpYyBnZXRBQlRlc3RCeUlkKGV4cGVyaW1lbnRJZDogYW55LCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0QUJUZXN0aW5nUmVzcG9uc2VEZXRhaWxzPj47XG4gICAgcHVibGljIGdldEFCVGVzdEJ5SWQoZXhwZXJpbWVudElkOiBhbnksIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChleHBlcmltZW50SWQgPT09IG51bGwgfHwgZXhwZXJpbWVudElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGV4cGVyaW1lbnRJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEFCVGVzdEJ5SWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEFwaVJlc3BvbnNlT2JqZWN0QUJUZXN0aW5nUmVzcG9uc2VEZXRhaWxzPignZ2V0JyxgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZXhwZXJpbWVudHMvYWJ0ZXN0L2dldC8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZXhwZXJpbWVudElkKSl9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFQSSB0byBnZXQgYWxsIGV4cGVyaW1lbnRzIG9mIHR5cGUgQUJUZXN0LlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBsaWNlbnNlZUlkIFxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBbGxBQlRlc3RzKGxpY2Vuc2VlSWQ6IGFueSwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdExpc3RBQlRlc3RpbmdSZXNwb25zZURldGFpbHM+O1xuICAgIHB1YmxpYyBnZXRBbGxBQlRlc3RzKGxpY2Vuc2VlSWQ6IGFueSwgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwaVJlc3BvbnNlT2JqZWN0TGlzdEFCVGVzdGluZ1Jlc3BvbnNlRGV0YWlscz4+O1xuICAgIHB1YmxpYyBnZXRBbGxBQlRlc3RzKGxpY2Vuc2VlSWQ6IGFueSwgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdExpc3RBQlRlc3RpbmdSZXNwb25zZURldGFpbHM+PjtcbiAgICBwdWJsaWMgZ2V0QWxsQUJUZXN0cyhsaWNlbnNlZUlkOiBhbnksIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChsaWNlbnNlZUlkID09PSBudWxsIHx8IGxpY2Vuc2VlSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgbGljZW5zZWVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEFsbEFCVGVzdHMuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEFwaVJlc3BvbnNlT2JqZWN0TGlzdEFCVGVzdGluZ1Jlc3BvbnNlRGV0YWlscz4oJ2dldCcsYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2V4cGVyaW1lbnRzL2FidGVzdC9hbGwvZ2V0LyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhsaWNlbnNlZUlkKSl9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFQSSB0byBnZXQgYWxsIGV4cGVyaW1lbnRzIGJ5IExpY2Vuc2VlIElkLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBsaWNlbnNlZUlkIFxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBbGxFeHBlcmltZW50cyhsaWNlbnNlZUlkOiBhbnksIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3RMaXN0RXhwZXJpbWVudHNFbnRpdHk+O1xuICAgIHB1YmxpYyBnZXRBbGxFeHBlcmltZW50cyhsaWNlbnNlZUlkOiBhbnksIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdExpc3RFeHBlcmltZW50c0VudGl0eT4+O1xuICAgIHB1YmxpYyBnZXRBbGxFeHBlcmltZW50cyhsaWNlbnNlZUlkOiBhbnksIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3RMaXN0RXhwZXJpbWVudHNFbnRpdHk+PjtcbiAgICBwdWJsaWMgZ2V0QWxsRXhwZXJpbWVudHMobGljZW5zZWVJZDogYW55LCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAobGljZW5zZWVJZCA9PT0gbnVsbCB8fCBsaWNlbnNlZUlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGxpY2Vuc2VlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRBbGxFeHBlcmltZW50cy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8QXBpUmVzcG9uc2VPYmplY3RMaXN0RXhwZXJpbWVudHNFbnRpdHk+KCdnZXQnLGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9leHBlcmltZW50cy9hbGwvZ2V0LyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhsaWNlbnNlZUlkKSl9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFQSSB0byBnZXQgYWxsIEluY3JlbWVudGFsaXR5IFRlc3RzIGZvciBhIGdpdmVuIExpY2Vuc2VlIElkLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBsaWNlbnNlZUlkIFxuICAgICAqIEBwYXJhbSByZWZyZXNoIFxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBbGxSZXBvcnRzRm9ySW5jcmVtZW50YWxpdHlUZXN0KGxpY2Vuc2VlSWQ6IGFueSwgcmVmcmVzaD86IGFueSwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdExpc3RJbmNyZW1lbnRhbGl0eVRlc3REZXRhaWxzPjtcbiAgICBwdWJsaWMgZ2V0QWxsUmVwb3J0c0ZvckluY3JlbWVudGFsaXR5VGVzdChsaWNlbnNlZUlkOiBhbnksIHJlZnJlc2g/OiBhbnksIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdExpc3RJbmNyZW1lbnRhbGl0eVRlc3REZXRhaWxzPj47XG4gICAgcHVibGljIGdldEFsbFJlcG9ydHNGb3JJbmNyZW1lbnRhbGl0eVRlc3QobGljZW5zZWVJZDogYW55LCByZWZyZXNoPzogYW55LCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0TGlzdEluY3JlbWVudGFsaXR5VGVzdERldGFpbHM+PjtcbiAgICBwdWJsaWMgZ2V0QWxsUmVwb3J0c0ZvckluY3JlbWVudGFsaXR5VGVzdChsaWNlbnNlZUlkOiBhbnksIHJlZnJlc2g/OiBhbnksIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChsaWNlbnNlZUlkID09PSBudWxsIHx8IGxpY2Vuc2VlSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgbGljZW5zZWVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEFsbFJlcG9ydHNGb3JJbmNyZW1lbnRhbGl0eVRlc3QuJyk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogbmV3IEN1c3RvbUh0dHBVcmxFbmNvZGluZ0NvZGVjKCl9KTtcbiAgICAgICAgaWYgKHJlZnJlc2ggIT09IHVuZGVmaW5lZCAmJiByZWZyZXNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdyZWZyZXNoJywgPGFueT5yZWZyZXNoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8QXBpUmVzcG9uc2VPYmplY3RMaXN0SW5jcmVtZW50YWxpdHlUZXN0RGV0YWlscz4oJ2dldCcsYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2V4cGVyaW1lbnRzL2luY3JlbWVudGFsaXR5dGVzdC9hbGwvZ2V0LyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhsaWNlbnNlZUlkKSl9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFQSSB0byBnZXQgR2xvYmFsbHkgQmxvY2tlZCBhbmQgVGFyZ2V0ZWQgQXVkaWVuY2VzIGZvciBhbiBFeHBlcmltZW50LCBnaXZlbiB0aGUgQ2FtcGFpZ24gSWQuXG4gICAgICogXG4gICAgICogQHBhcmFtIGNhbXBhaWduSWQgXG4gICAgICogQHBhcmFtIGV4cGVyaW1lbnRJZCBcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QXVkaWVuY2VGb3JJbmNyZW1lbnRhbGl0eVRlc3QoY2FtcGFpZ25JZDogYW55LCBleHBlcmltZW50SWQ/OiBhbnksIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3RDcmVhdGVGb3JtQXVkaWVuY2VSZXNwb25zZU9iamVjdD47XG4gICAgcHVibGljIGdldEF1ZGllbmNlRm9ySW5jcmVtZW50YWxpdHlUZXN0KGNhbXBhaWduSWQ6IGFueSwgZXhwZXJpbWVudElkPzogYW55LCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3RDcmVhdGVGb3JtQXVkaWVuY2VSZXNwb25zZU9iamVjdD4+O1xuICAgIHB1YmxpYyBnZXRBdWRpZW5jZUZvckluY3JlbWVudGFsaXR5VGVzdChjYW1wYWlnbklkOiBhbnksIGV4cGVyaW1lbnRJZD86IGFueSwgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdENyZWF0ZUZvcm1BdWRpZW5jZVJlc3BvbnNlT2JqZWN0Pj47XG4gICAgcHVibGljIGdldEF1ZGllbmNlRm9ySW5jcmVtZW50YWxpdHlUZXN0KGNhbXBhaWduSWQ6IGFueSwgZXhwZXJpbWVudElkPzogYW55LCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoY2FtcGFpZ25JZCA9PT0gbnVsbCB8fCBjYW1wYWlnbklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNhbXBhaWduSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRBdWRpZW5jZUZvckluY3JlbWVudGFsaXR5VGVzdC4nKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiBuZXcgQ3VzdG9tSHR0cFVybEVuY29kaW5nQ29kZWMoKX0pO1xuICAgICAgICBpZiAoZXhwZXJpbWVudElkICE9PSB1bmRlZmluZWQgJiYgZXhwZXJpbWVudElkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdleHBlcmltZW50SWQnLCA8YW55PmV4cGVyaW1lbnRJZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEFwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0Q3JlYXRlRm9ybUF1ZGllbmNlUmVzcG9uc2VPYmplY3Q+KCdnZXQnLGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9leHBlcmltZW50cy9pbmNyZW1lbnRhbGl0eXRlc3QvYXVkaWVuY2UvZ2V0LyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhjYW1wYWlnbklkKSl9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFQSSB0byBnZXQgYWxsIEF1ZGllbmNlcyBpbiBTdHJhdGVneSBVcGRhdGUvQ3JlYXRlIGZvciBhbiBFeHBlcmltZW50LCBnaXZlbiB0aGUgQ2FtcGFpZ24gSWQuXG4gICAgICogXG4gICAgICogQHBhcmFtIGNhbXBhaWduSWQgXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldEF1ZGllbmNlRm9yU3RyYXRlZ3lVcGRhdGVJbkluY3JlbWVudGFsaXR5VGVzdChjYW1wYWlnbklkPzogYW55LCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0U3RyYXRlZ3lBdWRpZW5jZUluY1Rlc3RNYXA+O1xuICAgIHB1YmxpYyBnZXRBdWRpZW5jZUZvclN0cmF0ZWd5VXBkYXRlSW5JbmNyZW1lbnRhbGl0eVRlc3QoY2FtcGFpZ25JZD86IGFueSwgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwaVJlc3BvbnNlT2JqZWN0U3RyYXRlZ3lBdWRpZW5jZUluY1Rlc3RNYXA+PjtcbiAgICBwdWJsaWMgZ2V0QXVkaWVuY2VGb3JTdHJhdGVneVVwZGF0ZUluSW5jcmVtZW50YWxpdHlUZXN0KGNhbXBhaWduSWQ/OiBhbnksIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3RTdHJhdGVneUF1ZGllbmNlSW5jVGVzdE1hcD4+O1xuICAgIHB1YmxpYyBnZXRBdWRpZW5jZUZvclN0cmF0ZWd5VXBkYXRlSW5JbmNyZW1lbnRhbGl0eVRlc3QoY2FtcGFpZ25JZD86IGFueSwgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cblxuICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IG5ldyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYygpfSk7XG4gICAgICAgIGlmIChjYW1wYWlnbklkICE9PSB1bmRlZmluZWQgJiYgY2FtcGFpZ25JZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnY2FtcGFpZ25JZCcsIDxhbnk+Y2FtcGFpZ25JZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEFwaVJlc3BvbnNlT2JqZWN0U3RyYXRlZ3lBdWRpZW5jZUluY1Rlc3RNYXA+KCdwb3N0JyxgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZXhwZXJpbWVudHMvaW5jcmVtZW50YWxpdHl0ZXN0L3N0cmF0ZWd5L2F1ZGllbmNlYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBBUEkgdG8gZ2V0IGFuIGV4aXN0aW5nIEluY3JlbWVudGFsaXR5IFRlc3QgTWV0YWRhdGEgYnkgRXhwZXJpbWVudCBJZC5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZXhwZXJpbWVudElkIFxuICAgICAqIEBwYXJhbSByZWZyZXNoIFxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRJbmNyZW1lbnRhbGl0eVRlc3RCeUlkKGV4cGVyaW1lbnRJZDogYW55LCByZWZyZXNoPzogYW55LCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0RGV0YWlscz47XG4gICAgcHVibGljIGdldEluY3JlbWVudGFsaXR5VGVzdEJ5SWQoZXhwZXJpbWVudElkOiBhbnksIHJlZnJlc2g/OiBhbnksIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdERldGFpbHM+PjtcbiAgICBwdWJsaWMgZ2V0SW5jcmVtZW50YWxpdHlUZXN0QnlJZChleHBlcmltZW50SWQ6IGFueSwgcmVmcmVzaD86IGFueSwgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdERldGFpbHM+PjtcbiAgICBwdWJsaWMgZ2V0SW5jcmVtZW50YWxpdHlUZXN0QnlJZChleHBlcmltZW50SWQ6IGFueSwgcmVmcmVzaD86IGFueSwgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGV4cGVyaW1lbnRJZCA9PT0gbnVsbCB8fCBleHBlcmltZW50SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZXhwZXJpbWVudElkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0SW5jcmVtZW50YWxpdHlUZXN0QnlJZC4nKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiBuZXcgQ3VzdG9tSHR0cFVybEVuY29kaW5nQ29kZWMoKX0pO1xuICAgICAgICBpZiAocmVmcmVzaCAhPT0gdW5kZWZpbmVkICYmIHJlZnJlc2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycyA9IHF1ZXJ5UGFyYW1ldGVycy5zZXQoJ3JlZnJlc2gnLCA8YW55PnJlZnJlc2gpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdERldGFpbHM+KCdnZXQnLGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9leHBlcmltZW50cy9pbmNyZW1lbnRhbGl0eXRlc3QvZ2V0LyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhleHBlcmltZW50SWQpKX1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhcmFtczogcXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIEFQSSB0byBkb3dubG9hZCBhbiBleGlzdGluZyBJbmNyZW1lbnRhbGl0eSBUZXN0IFJlcG9ydCBDU1YgYnkgRXhwZXJpbWVudCBJZC5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZXhwZXJpbWVudElkIFxuICAgICAqIEBwYXJhbSByZWZyZXNoIFxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRJbmNyZW1lbnRhbGl0eVRlc3RSZXBvcnRDc3ZCeUlkKGV4cGVyaW1lbnRJZDogYW55LCByZWZyZXNoPzogYW55LCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0RGV0YWlscz47XG4gICAgcHVibGljIGdldEluY3JlbWVudGFsaXR5VGVzdFJlcG9ydENzdkJ5SWQoZXhwZXJpbWVudElkOiBhbnksIHJlZnJlc2g/OiBhbnksIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdERldGFpbHM+PjtcbiAgICBwdWJsaWMgZ2V0SW5jcmVtZW50YWxpdHlUZXN0UmVwb3J0Q3N2QnlJZChleHBlcmltZW50SWQ6IGFueSwgcmVmcmVzaD86IGFueSwgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdERldGFpbHM+PjtcbiAgICBwdWJsaWMgZ2V0SW5jcmVtZW50YWxpdHlUZXN0UmVwb3J0Q3N2QnlJZChleHBlcmltZW50SWQ6IGFueSwgcmVmcmVzaD86IGFueSwgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGV4cGVyaW1lbnRJZCA9PT0gbnVsbCB8fCBleHBlcmltZW50SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZXhwZXJpbWVudElkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0SW5jcmVtZW50YWxpdHlUZXN0UmVwb3J0Q3N2QnlJZC4nKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiBuZXcgQ3VzdG9tSHR0cFVybEVuY29kaW5nQ29kZWMoKX0pO1xuICAgICAgICBpZiAocmVmcmVzaCAhPT0gdW5kZWZpbmVkICYmIHJlZnJlc2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycyA9IHF1ZXJ5UGFyYW1ldGVycy5zZXQoJ3JlZnJlc2gnLCA8YW55PnJlZnJlc2gpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdERldGFpbHM+KCdnZXQnLGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9leHBlcmltZW50cy9pbmNyZW1lbnRhbGl0eXRlc3QvcmVwb3J0L2Nzdi9nZXQvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGV4cGVyaW1lbnRJZCkpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiBxdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBUEkgdG8gZ2V0IFJlcG9ydCBmb3IgYW4gSW5jcmVtZW50YWxpdHkgVGVzdCBCeSBFeHBlcmltZW50IElkXG4gICAgICogXG4gICAgICogQHBhcmFtIGV4cGVyaW1lbnRJZCBcbiAgICAgKiBAcGFyYW0gcmVmcmVzaCBcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UmVwb3J0Rm9ySW5jcmVtZW50YWxpdHlUZXN0QnlJZChleHBlcmltZW50SWQ6IGFueSwgcmVmcmVzaD86IGFueSwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdFJlcG9ydENhbGN1bGF0aW9uRGV0YWlscz47XG4gICAgcHVibGljIGdldFJlcG9ydEZvckluY3JlbWVudGFsaXR5VGVzdEJ5SWQoZXhwZXJpbWVudElkOiBhbnksIHJlZnJlc2g/OiBhbnksIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdFJlcG9ydENhbGN1bGF0aW9uRGV0YWlscz4+O1xuICAgIHB1YmxpYyBnZXRSZXBvcnRGb3JJbmNyZW1lbnRhbGl0eVRlc3RCeUlkKGV4cGVyaW1lbnRJZDogYW55LCByZWZyZXNoPzogYW55LCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0UmVwb3J0Q2FsY3VsYXRpb25EZXRhaWxzPj47XG4gICAgcHVibGljIGdldFJlcG9ydEZvckluY3JlbWVudGFsaXR5VGVzdEJ5SWQoZXhwZXJpbWVudElkOiBhbnksIHJlZnJlc2g/OiBhbnksIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChleHBlcmltZW50SWQgPT09IG51bGwgfHwgZXhwZXJpbWVudElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGV4cGVyaW1lbnRJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFJlcG9ydEZvckluY3JlbWVudGFsaXR5VGVzdEJ5SWQuJyk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogbmV3IEN1c3RvbUh0dHBVcmxFbmNvZGluZ0NvZGVjKCl9KTtcbiAgICAgICAgaWYgKHJlZnJlc2ggIT09IHVuZGVmaW5lZCAmJiByZWZyZXNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdyZWZyZXNoJywgPGFueT5yZWZyZXNoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8QXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3RSZXBvcnRDYWxjdWxhdGlvbkRldGFpbHM+KCdnZXQnLGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9leHBlcmltZW50cy9pbmNyZW1lbnRhbGl0eXRlc3QvcmVwb3J0L2dldC8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZXhwZXJpbWVudElkKSl9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFQSSB0byBnZXQgQUIgVGVzdGluZyBWYXJpYW50IFJlcG9ydCBieSBFeHBlcmltZW50IElkLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBzaG93dXUgXG4gICAgICogQHBhcmFtIGV4cGVyaW1lbnRJZCBcbiAgICAgKiBAcGFyYW0gcmVmcmVzaCBcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VmFyaWFudFJlcG9ydEJ5RXhwZXJpbWVudElkKHNob3d1dTogYW55LCBleHBlcmltZW50SWQ6IGFueSwgcmVmcmVzaD86IGFueSwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdExpc3REYXNoYm9hcmRSZXNwb25zZT47XG4gICAgcHVibGljIGdldFZhcmlhbnRSZXBvcnRCeUV4cGVyaW1lbnRJZChzaG93dXU6IGFueSwgZXhwZXJpbWVudElkOiBhbnksIHJlZnJlc2g/OiBhbnksIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdExpc3REYXNoYm9hcmRSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBnZXRWYXJpYW50UmVwb3J0QnlFeHBlcmltZW50SWQoc2hvd3V1OiBhbnksIGV4cGVyaW1lbnRJZDogYW55LCByZWZyZXNoPzogYW55LCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0TGlzdERhc2hib2FyZFJlc3BvbnNlPj47XG4gICAgcHVibGljIGdldFZhcmlhbnRSZXBvcnRCeUV4cGVyaW1lbnRJZChzaG93dXU6IGFueSwgZXhwZXJpbWVudElkOiBhbnksIHJlZnJlc2g/OiBhbnksIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChzaG93dXUgPT09IG51bGwgfHwgc2hvd3V1ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNob3d1dSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhcmlhbnRSZXBvcnRCeUV4cGVyaW1lbnRJZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHBlcmltZW50SWQgPT09IG51bGwgfHwgZXhwZXJpbWVudElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGV4cGVyaW1lbnRJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhcmlhbnRSZXBvcnRCeUV4cGVyaW1lbnRJZC4nKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiBuZXcgQ3VzdG9tSHR0cFVybEVuY29kaW5nQ29kZWMoKX0pO1xuICAgICAgICBpZiAocmVmcmVzaCAhPT0gdW5kZWZpbmVkICYmIHJlZnJlc2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycyA9IHF1ZXJ5UGFyYW1ldGVycy5zZXQoJ3JlZnJlc2gnLCA8YW55PnJlZnJlc2gpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaG93dXUgIT09IHVuZGVmaW5lZCAmJiBzaG93dXUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycyA9IHF1ZXJ5UGFyYW1ldGVycy5zZXQoJ3Nob3d1dScsIDxhbnk+c2hvd3V1KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8QXBpUmVzcG9uc2VPYmplY3RMaXN0RGFzaGJvYXJkUmVzcG9uc2U+KCdwb3N0JyxgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZXhwZXJpbWVudHMvYWJ0ZXN0L3JlcG9ydC9nZXQvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGV4cGVyaW1lbnRJZCkpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiBxdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQXBpIHRvICB1cGRhdGUgZXhpc2l0aW5nIEFCIFRlc3QgRXhwZXJpbWVudC5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gYm9keSBcbiAgICAgKiBAcGFyYW0gZXhwZXJpbWVudElkIFxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVBQlRlc3QoYm9keTogQUJUZXN0aW5nRFRPLCBleHBlcmltZW50SWQ6IGFueSwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdEFCVGVzdGluZ1Jlc3BvbnNlRGV0YWlscz47XG4gICAgcHVibGljIHVwZGF0ZUFCVGVzdChib2R5OiBBQlRlc3RpbmdEVE8sIGV4cGVyaW1lbnRJZDogYW55LCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RBQlRlc3RpbmdSZXNwb25zZURldGFpbHM+PjtcbiAgICBwdWJsaWMgdXBkYXRlQUJUZXN0KGJvZHk6IEFCVGVzdGluZ0RUTywgZXhwZXJpbWVudElkOiBhbnksIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3RBQlRlc3RpbmdSZXNwb25zZURldGFpbHM+PjtcbiAgICBwdWJsaWMgdXBkYXRlQUJUZXN0KGJvZHk6IEFCVGVzdGluZ0RUTywgZXhwZXJpbWVudElkOiBhbnksIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChib2R5ID09PSBudWxsIHx8IGJvZHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgYm9keSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwZGF0ZUFCVGVzdC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHBlcmltZW50SWQgPT09IG51bGwgfHwgZXhwZXJpbWVudElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGV4cGVyaW1lbnRJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwZGF0ZUFCVGVzdC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8QXBpUmVzcG9uc2VPYmplY3RBQlRlc3RpbmdSZXNwb25zZURldGFpbHM+KCdwb3N0JyxgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZXhwZXJpbWVudHMvYWJ0ZXN0L3VwZGF0ZS8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZXhwZXJpbWVudElkKSl9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5LFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQVBJIHRvIHVwZGF0ZSBJbmNyZW1lbnRhbGl0eSBUZXN0IEV4cGVyaW1lbnQgYnkgRXhwZXJpbWVudCBJZC5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gYm9keSBcbiAgICAgKiBAcGFyYW0gZXhwZXJpbWVudElkIFxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVJbmNyZW1lbnRhbGl0eVRlc3QoYm9keTogSW5jcmVtZW50YWxpdHlUZXN0RFRPLCBleHBlcmltZW50SWQ6IGFueSwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdERldGFpbHM+O1xuICAgIHB1YmxpYyB1cGRhdGVJbmNyZW1lbnRhbGl0eVRlc3QoYm9keTogSW5jcmVtZW50YWxpdHlUZXN0RFRPLCBleHBlcmltZW50SWQ6IGFueSwgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0RGV0YWlscz4+O1xuICAgIHB1YmxpYyB1cGRhdGVJbmNyZW1lbnRhbGl0eVRlc3QoYm9keTogSW5jcmVtZW50YWxpdHlUZXN0RFRPLCBleHBlcmltZW50SWQ6IGFueSwgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdERldGFpbHM+PjtcbiAgICBwdWJsaWMgdXBkYXRlSW5jcmVtZW50YWxpdHlUZXN0KGJvZHk6IEluY3JlbWVudGFsaXR5VGVzdERUTywgZXhwZXJpbWVudElkOiBhbnksIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChib2R5ID09PSBudWxsIHx8IGJvZHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgYm9keSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwZGF0ZUluY3JlbWVudGFsaXR5VGVzdC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleHBlcmltZW50SWQgPT09IG51bGwgfHwgZXhwZXJpbWVudElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGV4cGVyaW1lbnRJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwZGF0ZUluY3JlbWVudGFsaXR5VGVzdC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8QXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3REZXRhaWxzPigncG9zdCcsYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2V4cGVyaW1lbnRzL2luY3JlbWVudGFsaXR5dGVzdC91cGRhdGUvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGV4cGVyaW1lbnRJZCkpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYm9keTogYm9keSxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxufVxuIl19
735
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwZXJpbWVudHNDb250cm9sbGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hcGkvZXhwZXJpbWVudHNDb250cm9sbGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUNILHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBMkIsZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBYyxXQUFXLEVBQUUsVUFBVSxFQUNWLE1BQWdDLHNCQUFzQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUE2QixZQUFZLENBQUM7QUFtQi9FLE9BQU8sRUFBRSxTQUFTLEVBQXNCLE1BQTBCLGNBQWMsQ0FBQztBQUNqRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQTBDLGtCQUFrQixDQUFDOzs7O0FBSXJGLE1BQU0sT0FBTyw0QkFBNEI7SUFNckMsWUFBc0IsVUFBc0IsRUFBZ0MsUUFBZ0IsRUFBYyxhQUE0QjtRQUFoSCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBSmxDLGFBQVEsR0FBRyxnQ0FBZ0MsQ0FBQztRQUMvQyxtQkFBYyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7UUFDbkMsa0JBQWEsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBR3ZDLElBQUksUUFBUSxFQUFFO1lBQ1YsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7U0FDNUI7UUFDRCxJQUFJLGFBQWEsRUFBRTtZQUNmLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1lBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLGFBQWEsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUN2RTtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSyxjQUFjLENBQUMsUUFBa0I7UUFDckMsTUFBTSxJQUFJLEdBQUcscUJBQXFCLENB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Q0YsTUFBTSx3QkFBd0IsR0FBdUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlHLElBQUksd0JBQXdCLElBQUksU0FBUyxFQUFFO1lBQ3ZDLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1NBQzdEO1FBRUQsdUNBQXVDO1FBQ3ZDLE1BQU0sUUFBUSxHQUFhO1lBQ3ZCLGtCQUFrQjtTQUNyQixDQUFDO1FBQ0YsTUFBTSx1QkFBdUIsR0FBdUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6RyxJQUFJLHVCQUF1QixJQUFJLFNBQVMsRUFBRTtZQUN0QyxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztTQUNsRTtRQUVELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQTZDLEdBQUcsSUFBSSxDQUFDLFFBQVEsaURBQWlELGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLEVBQy9LLHFCQUFxQixFQUNyQjtZQUNJLGVBQWUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWU7WUFDbkQsT0FBTyxFQUFFLE9BQU87WUFDaEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsY0FBYyxFQUFFLGNBQWM7U0FDakMsQ0FDSixDQUFDO0lBQ04sQ0FBQzs7MEhBMXFDUSw0QkFBNEIsNENBTTRCLFNBQVM7OEhBTmpFLDRCQUE0Qjs0RkFBNUIsNEJBQTRCO2tCQUR4QyxVQUFVOzswQkFPd0MsUUFBUTs7MEJBQUcsTUFBTTsyQkFBQyxTQUFTOzswQkFBcUIsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBpIERvY3VtZW50YXRpb25cbiAqIEFwaSBEb2N1bWVudGF0aW9uXG4gKlxuICogT3BlbkFQSSBzcGVjIHZlcnNpb246IDEuMFxuICogXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc3dhZ2dlciBjb2RlIGdlbmVyYXRvciBwcm9ncmFtLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3N3YWdnZXItYXBpL3N3YWdnZXItY29kZWdlbi5naXRcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuLyogdHNsaW50OmRpc2FibGU6bm8tdW51c2VkLXZhcmlhYmxlIG1lbWJlci1vcmRlcmluZyAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gICAgICAgICAgICAgICAgICAgICAgZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyxcbiAgICAgICAgIEh0dHBSZXNwb25zZSwgSHR0cEV2ZW50IH0gICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYyB9ICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vZW5jb2Rlcic7XG5cbmltcG9ydCB7IE9ic2VydmFibGUgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQUJUZXN0aW5nRFRPIH0gZnJvbSAnLi4vbW9kZWwvYUJUZXN0aW5nRFRPJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlT2JqZWN0QUJUZXN0aW5nUmVzcG9uc2VEZXRhaWxzIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RBQlRlc3RpbmdSZXNwb25zZURldGFpbHMnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3RDcmVhdGVGb3JtQXVkaWVuY2VSZXNwb25zZU9iamVjdCB9IGZyb20gJy4uL21vZGVsL2FwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0Q3JlYXRlRm9ybUF1ZGllbmNlUmVzcG9uc2VPYmplY3QnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3REZXRhaWxzIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3REZXRhaWxzJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0UmVwb3J0Q2FsY3VsYXRpb25EZXRhaWxzIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3RSZXBvcnRDYWxjdWxhdGlvbkRldGFpbHMnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3RSZXNwb25zZSB9IGZyb20gJy4uL21vZGVsL2FwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0UmVzcG9uc2UnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RMaXN0QUJUZXN0aW5nUmVzcG9uc2VEZXRhaWxzIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RMaXN0QUJUZXN0aW5nUmVzcG9uc2VEZXRhaWxzJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlT2JqZWN0TGlzdERhc2hib2FyZFJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RMaXN0RGFzaGJvYXJkUmVzcG9uc2UnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RMaXN0RXhwZXJpbWVudHNFbnRpdHkgfSBmcm9tICcuLi9tb2RlbC9hcGlSZXNwb25zZU9iamVjdExpc3RFeHBlcmltZW50c0VudGl0eSc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZU9iamVjdExpc3RJbmNyZW1lbnRhbGl0eVRlc3REZXRhaWxzIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RMaXN0SW5jcmVtZW50YWxpdHlUZXN0RGV0YWlscyc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZU9iamVjdE1hcGxvbmdSZXNwb25zZU1lc3NhZ2UgfSBmcm9tICcuLi9tb2RlbC9hcGlSZXNwb25zZU9iamVjdE1hcGxvbmdSZXNwb25zZU1lc3NhZ2UnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RTdHJhdGVneUF1ZGllbmNlSW5jVGVzdE1hcCB9IGZyb20gJy4uL21vZGVsL2FwaVJlc3BvbnNlT2JqZWN0U3RyYXRlZ3lBdWRpZW5jZUluY1Rlc3RNYXAnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RWb2lkIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RWb2lkJztcbmltcG9ydCB7IEluY3JlbWVudGFsaXR5VGVzdERUTyB9IGZyb20gJy4uL21vZGVsL2luY3JlbWVudGFsaXR5VGVzdERUTyc7XG5cbmltcG9ydCB7IEJBU0VfUEFUSCwgQ09MTEVDVElPTl9GT1JNQVRTIH0gICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi92YXJpYWJsZXMnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24nO1xuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBFeHBlcmltZW50c0NvbnRyb2xsZXJTZXJ2aWNlIHtcblxuICAgIHByb3RlY3RlZCBiYXNlUGF0aCA9ICdodHRwczovL2FwaXYyc3RhZ2UzLmF0b21leC5uZXQnO1xuICAgIHB1YmxpYyBkZWZhdWx0SGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xuICAgIHB1YmxpYyBjb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKUBJbmplY3QoQkFTRV9QQVRIKSBiYXNlUGF0aDogc3RyaW5nLCBAT3B0aW9uYWwoKSBjb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIGlmIChiYXNlUGF0aCkge1xuICAgICAgICAgICAgdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgICAgICAgICAgdGhpcy5iYXNlUGF0aCA9IGJhc2VQYXRoIHx8IGNvbmZpZ3VyYXRpb24uYmFzZVBhdGggfHwgdGhpcy5iYXNlUGF0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBjb25zdW1lcyBzdHJpbmdbXSBtaW1lLXR5cGVzXG4gICAgICogQHJldHVybiB0cnVlOiBjb25zdW1lcyBjb250YWlucyAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsIGZhbHNlOiBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwcml2YXRlIGNhbkNvbnN1bWVGb3JtKGNvbnN1bWVzOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBmb3JtID0gJ211bHRpcGFydC9mb3JtLWRhdGEnO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnN1bWUgb2YgY29uc3VtZXMpIHtcbiAgICAgICAgICAgIGlmIChmb3JtID09PSBjb25zdW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogIEFQSSB0byBhY3RpdmF0ZSBBQiBUZXN0IEV4cGVyaW1lbnQuXG4gICAgICogXG4gICAgICogQHBhcmFtIGV4cElkIGV4cElkXG4gICAgICogQHBhcmFtIHJlcUlkIHJlcXVlc3QgaWRcbiAgICAgKiBAcGFyYW0gdG9rZW4gQXV0aCBUb2tlblxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBhY3RpdmF0ZUFCVGVzdFVzaW5nUE9TVChleHBJZDogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3RWb2lkPjtcbiAgICBwdWJsaWMgYWN0aXZhdGVBQlRlc3RVc2luZ1BPU1QoZXhwSWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RWb2lkPj47XG4gICAgcHVibGljIGFjdGl2YXRlQUJUZXN0VXNpbmdQT1NUKGV4cElkOiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdFZvaWQ+PjtcbiAgICBwdWJsaWMgYWN0aXZhdGVBQlRlc3RVc2luZ1BPU1QoZXhwSWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoZXhwSWQgPT09IG51bGwgfHwgZXhwSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZXhwSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBhY3RpdmF0ZUFCVGVzdFVzaW5nUE9TVC4nKTtcbiAgICAgICAgfVxuXG5cblxuICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IG5ldyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYygpfSk7XG4gICAgICAgIGlmIChleHBJZCAhPT0gdW5kZWZpbmVkICYmIGV4cElkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdleHBJZCcsIDxhbnk+ZXhwSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICBpZiAocmVxSWQgIT09IHVuZGVmaW5lZCAmJiByZXFJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdyZXFJZCcsIFN0cmluZyhyZXFJZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdW5kZWZpbmVkICYmIHRva2VuICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3Rva2VuJywgU3RyaW5nKHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxBcGlSZXNwb25zZU9iamVjdFZvaWQ+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9leHBlcmltZW50cy9hYnRlc3QvYWN0aXZhdGVgLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFQSSB0byBBY3RpdmF0ZSBMaXN0cyBvZiBJbmNyZW1lbnRhbGl0eSBUZXN0IEV4cGVyaW1lbnQgSWRzLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBleHBlcmltZW50SWRzIGV4cGVyaW1lbnRJZHNcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGFjdGl2YXRlRXhwZXJpbWVudFVzaW5nUE9TVChleHBlcmltZW50SWRzOiBzdHJpbmcsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdE1hcGxvbmdSZXNwb25zZU1lc3NhZ2U+O1xuICAgIHB1YmxpYyBhY3RpdmF0ZUV4cGVyaW1lbnRVc2luZ1BPU1QoZXhwZXJpbWVudElkczogc3RyaW5nLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdE1hcGxvbmdSZXNwb25zZU1lc3NhZ2U+PjtcbiAgICBwdWJsaWMgYWN0aXZhdGVFeHBlcmltZW50VXNpbmdQT1NUKGV4cGVyaW1lbnRJZHM6IHN0cmluZywgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0TWFwbG9uZ1Jlc3BvbnNlTWVzc2FnZT4+O1xuICAgIHB1YmxpYyBhY3RpdmF0ZUV4cGVyaW1lbnRVc2luZ1BPU1QoZXhwZXJpbWVudElkczogc3RyaW5nLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChleHBlcmltZW50SWRzID09PSBudWxsIHx8IGV4cGVyaW1lbnRJZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZXhwZXJpbWVudElkcyB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGFjdGl2YXRlRXhwZXJpbWVudFVzaW5nUE9TVC4nKTtcbiAgICAgICAgfVxuXG5cblxuICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IG5ldyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYygpfSk7XG4gICAgICAgIGlmIChleHBlcmltZW50SWRzICE9PSB1bmRlZmluZWQgJiYgZXhwZXJpbWVudElkcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnZXhwZXJpbWVudElkcycsIDxhbnk+ZXhwZXJpbWVudElkcyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEFwaVJlc3BvbnNlT2JqZWN0TWFwbG9uZ1Jlc3BvbnNlTWVzc2FnZT4oYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2V4cGVyaW1lbnRzL2FjdGl2YXRlYCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiBxdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQVBJIHRvIGFyY2hpdmUgQUIgVGVzdCBFeHBlcmltZW50LlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBleHBJZCBleHBJZFxuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXJjaGl2ZUFCVGVzdFVzaW5nUE9TVChleHBJZDogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3RWb2lkPjtcbiAgICBwdWJsaWMgYXJjaGl2ZUFCVGVzdFVzaW5nUE9TVChleHBJZDogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdFZvaWQ+PjtcbiAgICBwdWJsaWMgYXJjaGl2ZUFCVGVzdFVzaW5nUE9TVChleHBJZDogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3RWb2lkPj47XG4gICAgcHVibGljIGFyY2hpdmVBQlRlc3RVc2luZ1BPU1QoZXhwSWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoZXhwSWQgPT09IG51bGwgfHwgZXhwSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZXhwSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBhcmNoaXZlQUJUZXN0VXNpbmdQT1NULicpO1xuICAgICAgICB9XG5cblxuXG4gICAgICAgIGxldCBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogbmV3IEN1c3RvbUh0dHBVcmxFbmNvZGluZ0NvZGVjKCl9KTtcbiAgICAgICAgaWYgKGV4cElkICE9PSB1bmRlZmluZWQgJiYgZXhwSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycyA9IHF1ZXJ5UGFyYW1ldGVycy5zZXQoJ2V4cElkJywgPGFueT5leHBJZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEFwaVJlc3BvbnNlT2JqZWN0Vm9pZD4oYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2V4cGVyaW1lbnRzL2FidGVzdC9hcmNoaXZlYCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiBxdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBUEkgdG8gQXJjaGl2ZSBMaXN0cyBvZiBJbmNyZW1lbnRhbGl0eSBUZXN0IEV4cGVyaW1lbnQgaWRzXG4gICAgICogXG4gICAgICogQHBhcmFtIGV4cGVyaW1lbnRJZHMgZXhwZXJpbWVudElkc1xuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXJjaGl2ZUV4cGVyaW1lbnRVc2luZ1BPU1QoZXhwZXJpbWVudElkczogc3RyaW5nLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3RNYXBsb25nUmVzcG9uc2VNZXNzYWdlPjtcbiAgICBwdWJsaWMgYXJjaGl2ZUV4cGVyaW1lbnRVc2luZ1BPU1QoZXhwZXJpbWVudElkczogc3RyaW5nLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdE1hcGxvbmdSZXNwb25zZU1lc3NhZ2U+PjtcbiAgICBwdWJsaWMgYXJjaGl2ZUV4cGVyaW1lbnRVc2luZ1BPU1QoZXhwZXJpbWVudElkczogc3RyaW5nLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3RNYXBsb25nUmVzcG9uc2VNZXNzYWdlPj47XG4gICAgcHVibGljIGFyY2hpdmVFeHBlcmltZW50VXNpbmdQT1NUKGV4cGVyaW1lbnRJZHM6IHN0cmluZywgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoZXhwZXJpbWVudElkcyA9PT0gbnVsbCB8fCBleHBlcmltZW50SWRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGV4cGVyaW1lbnRJZHMgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBhcmNoaXZlRXhwZXJpbWVudFVzaW5nUE9TVC4nKTtcbiAgICAgICAgfVxuXG5cblxuICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IG5ldyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYygpfSk7XG4gICAgICAgIGlmIChleHBlcmltZW50SWRzICE9PSB1bmRlZmluZWQgJiYgZXhwZXJpbWVudElkcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnZXhwZXJpbWVudElkcycsIDxhbnk+ZXhwZXJpbWVudElkcyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEFwaVJlc3BvbnNlT2JqZWN0TWFwbG9uZ1Jlc3BvbnNlTWVzc2FnZT4oYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2V4cGVyaW1lbnRzL2FyY2hpdmVgLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBBcGkgdG8gIGNyZWF0ZSBBQiBUZXN0IEV4cGVyaW1lbnQuXG4gICAgICogXG4gICAgICogQHBhcmFtIGR0byBkdG9cbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUFCVGVzdFVzaW5nUE9TVChkdG86IEFCVGVzdGluZ0RUTywgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0QUJUZXN0aW5nUmVzcG9uc2VEZXRhaWxzPjtcbiAgICBwdWJsaWMgY3JlYXRlQUJUZXN0VXNpbmdQT1NUKGR0bzogQUJUZXN0aW5nRFRPLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdEFCVGVzdGluZ1Jlc3BvbnNlRGV0YWlscz4+O1xuICAgIHB1YmxpYyBjcmVhdGVBQlRlc3RVc2luZ1BPU1QoZHRvOiBBQlRlc3RpbmdEVE8sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdEFCVGVzdGluZ1Jlc3BvbnNlRGV0YWlscz4+O1xuICAgIHB1YmxpYyBjcmVhdGVBQlRlc3RVc2luZ1BPU1QoZHRvOiBBQlRlc3RpbmdEVE8sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGR0byA9PT0gbnVsbCB8fCBkdG8gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZHRvIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY3JlYXRlQUJUZXN0VXNpbmdQT1NULicpO1xuICAgICAgICB9XG5cblxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgaWYgKHJlcUlkICE9PSB1bmRlZmluZWQgJiYgcmVxSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgncmVxSWQnLCBTdHJpbmcocmVxSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCd0b2tlbicsIFN0cmluZyh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEFwaVJlc3BvbnNlT2JqZWN0QUJUZXN0aW5nUmVzcG9uc2VEZXRhaWxzPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZXhwZXJpbWVudHMvYWJ0ZXN0L2NyZWF0ZWAsXG4gICAgICAgICAgICBkdG8sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQXBpIHRvICBjcmVhdGUgSW5jcmVtZW50YWxpdHkgVGVzdCBFeHBlcmltZW50LlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBpbmNyZW1lbnRhbGl0eVRlc3RSZXF1ZXN0IGluY3JlbWVudGFsaXR5VGVzdFJlcXVlc3RcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUluY3JlbWVudGFsaXR5VGVzdFVzaW5nUE9TVChpbmNyZW1lbnRhbGl0eVRlc3RSZXF1ZXN0OiBJbmNyZW1lbnRhbGl0eVRlc3REVE8sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdFJlc3BvbnNlPjtcbiAgICBwdWJsaWMgY3JlYXRlSW5jcmVtZW50YWxpdHlUZXN0VXNpbmdQT1NUKGluY3JlbWVudGFsaXR5VGVzdFJlcXVlc3Q6IEluY3JlbWVudGFsaXR5VGVzdERUTywgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3RSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBjcmVhdGVJbmNyZW1lbnRhbGl0eVRlc3RVc2luZ1BPU1QoaW5jcmVtZW50YWxpdHlUZXN0UmVxdWVzdDogSW5jcmVtZW50YWxpdHlUZXN0RFRPLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3RSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBjcmVhdGVJbmNyZW1lbnRhbGl0eVRlc3RVc2luZ1BPU1QoaW5jcmVtZW50YWxpdHlUZXN0UmVxdWVzdDogSW5jcmVtZW50YWxpdHlUZXN0RFRPLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChpbmNyZW1lbnRhbGl0eVRlc3RSZXF1ZXN0ID09PSBudWxsIHx8IGluY3JlbWVudGFsaXR5VGVzdFJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgaW5jcmVtZW50YWxpdHlUZXN0UmVxdWVzdCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGNyZWF0ZUluY3JlbWVudGFsaXR5VGVzdFVzaW5nUE9TVC4nKTtcbiAgICAgICAgfVxuXG5cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdFJlc3BvbnNlPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZXhwZXJpbWVudHMvaW5jcmVtZW50YWxpdHl0ZXN0L2NyZWF0ZWAsXG4gICAgICAgICAgICBpbmNyZW1lbnRhbGl0eVRlc3RSZXF1ZXN0LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIEFQSSB0byBkZWFjdGl2YXRlIEFCIFRlc3QgRXhwZXJpbWVudC5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZXhwSWQgZXhwSWRcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGRlYWN0aXZhdGVBQlRlc3RVc2luZ1BPU1QoZXhwSWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0Vm9pZD47XG4gICAgcHVibGljIGRlYWN0aXZhdGVBQlRlc3RVc2luZ1BPU1QoZXhwSWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RWb2lkPj47XG4gICAgcHVibGljIGRlYWN0aXZhdGVBQlRlc3RVc2luZ1BPU1QoZXhwSWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0Vm9pZD4+O1xuICAgIHB1YmxpYyBkZWFjdGl2YXRlQUJUZXN0VXNpbmdQT1NUKGV4cElkOiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGV4cElkID09PSBudWxsIHx8IGV4cElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGV4cElkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVhY3RpdmF0ZUFCVGVzdFVzaW5nUE9TVC4nKTtcbiAgICAgICAgfVxuXG5cblxuICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IG5ldyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYygpfSk7XG4gICAgICAgIGlmIChleHBJZCAhPT0gdW5kZWZpbmVkICYmIGV4cElkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdleHBJZCcsIDxhbnk+ZXhwSWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICBpZiAocmVxSWQgIT09IHVuZGVmaW5lZCAmJiByZXFJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdyZXFJZCcsIFN0cmluZyhyZXFJZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdW5kZWZpbmVkICYmIHRva2VuICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3Rva2VuJywgU3RyaW5nKHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxBcGlSZXNwb25zZU9iamVjdFZvaWQ+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9leHBlcmltZW50cy9hYnRlc3QvZGVhY3RpdmF0ZWAsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhcmFtczogcXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQVBJIHRvIERlYWN0aXZhdGUgTGlzdHMgb2YgSW5jcmVtZW50YWxpdHkgVGVzdCBFeHBlcmltZW50IElkc1xuICAgICAqIFxuICAgICAqIEBwYXJhbSBleHBlcmltZW50SWRzIGV4cGVyaW1lbnRJZHNcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGRlYWN0aXZhdGVFeHBlcmltZW50VXNpbmdQT1NUKGV4cGVyaW1lbnRJZHM6IHN0cmluZywgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0TWFwbG9uZ1Jlc3BvbnNlTWVzc2FnZT47XG4gICAgcHVibGljIGRlYWN0aXZhdGVFeHBlcmltZW50VXNpbmdQT1NUKGV4cGVyaW1lbnRJZHM6IHN0cmluZywgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RNYXBsb25nUmVzcG9uc2VNZXNzYWdlPj47XG4gICAgcHVibGljIGRlYWN0aXZhdGVFeHBlcmltZW50VXNpbmdQT1NUKGV4cGVyaW1lbnRJZHM6IHN0cmluZywgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0TWFwbG9uZ1Jlc3BvbnNlTWVzc2FnZT4+O1xuICAgIHB1YmxpYyBkZWFjdGl2YXRlRXhwZXJpbWVudFVzaW5nUE9TVChleHBlcmltZW50SWRzOiBzdHJpbmcsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGV4cGVyaW1lbnRJZHMgPT09IG51bGwgfHwgZXhwZXJpbWVudElkcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBleHBlcmltZW50SWRzIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVhY3RpdmF0ZUV4cGVyaW1lbnRVc2luZ1BPU1QuJyk7XG4gICAgICAgIH1cblxuXG5cbiAgICAgICAgbGV0IHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiBuZXcgQ3VzdG9tSHR0cFVybEVuY29kaW5nQ29kZWMoKX0pO1xuICAgICAgICBpZiAoZXhwZXJpbWVudElkcyAhPT0gdW5kZWZpbmVkICYmIGV4cGVyaW1lbnRJZHMgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycyA9IHF1ZXJ5UGFyYW1ldGVycy5zZXQoJ2V4cGVyaW1lbnRJZHMnLCA8YW55PmV4cGVyaW1lbnRJZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICBpZiAocmVxSWQgIT09IHVuZGVmaW5lZCAmJiByZXFJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdyZXFJZCcsIFN0cmluZyhyZXFJZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdW5kZWZpbmVkICYmIHRva2VuICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3Rva2VuJywgU3RyaW5nKHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxBcGlSZXNwb25zZU9iamVjdE1hcGxvbmdSZXNwb25zZU1lc3NhZ2U+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9leHBlcmltZW50cy9kZWFjdGl2YXRlYCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiBxdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgQVBJIHRvIGdldCBhbiBleGlzdGluZyBBQiBUZXN0IE1ldGFkYXRhIGJ5IEV4cGVyaW1lbnQgSWQuXG4gICAgICogXG4gICAgICogQHBhcmFtIGV4cGVyaW1lbnRJZCBleHBlcmltZW50SWRcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldEFCVGVzdEJ5SWRVc2luZ0dFVChleHBlcmltZW50SWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0QUJUZXN0aW5nUmVzcG9uc2VEZXRhaWxzPjtcbiAgICBwdWJsaWMgZ2V0QUJUZXN0QnlJZFVzaW5nR0VUKGV4cGVyaW1lbnRJZDogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdEFCVGVzdGluZ1Jlc3BvbnNlRGV0YWlscz4+O1xuICAgIHB1YmxpYyBnZXRBQlRlc3RCeUlkVXNpbmdHRVQoZXhwZXJpbWVudElkOiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdEFCVGVzdGluZ1Jlc3BvbnNlRGV0YWlscz4+O1xuICAgIHB1YmxpYyBnZXRBQlRlc3RCeUlkVXNpbmdHRVQoZXhwZXJpbWVudElkOiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGV4cGVyaW1lbnRJZCA9PT0gbnVsbCB8fCBleHBlcmltZW50SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZXhwZXJpbWVudElkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0QUJUZXN0QnlJZFVzaW5nR0VULicpO1xuICAgICAgICB9XG5cblxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgaWYgKHJlcUlkICE9PSB1bmRlZmluZWQgJiYgcmVxSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgncmVxSWQnLCBTdHJpbmcocmVxSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCd0b2tlbicsIFN0cmluZyh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8QXBpUmVzcG9uc2VPYmplY3RBQlRlc3RpbmdSZXNwb25zZURldGFpbHM+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9leHBlcmltZW50cy9hYnRlc3QvZ2V0LyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhleHBlcmltZW50SWQpKX1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQVBJIHRvIGdldCBhbGwgZXhwZXJpbWVudHMgb2YgdHlwZSBBQlRlc3QuXG4gICAgICogXG4gICAgICogQHBhcmFtIGxpY2Vuc2VlSWQgbGljZW5zZWVJZFxuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QWxsQUJUZXN0c1VzaW5nR0VUKGxpY2Vuc2VlSWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0TGlzdEFCVGVzdGluZ1Jlc3BvbnNlRGV0YWlscz47XG4gICAgcHVibGljIGdldEFsbEFCVGVzdHNVc2luZ0dFVChsaWNlbnNlZUlkOiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwaVJlc3BvbnNlT2JqZWN0TGlzdEFCVGVzdGluZ1Jlc3BvbnNlRGV0YWlscz4+O1xuICAgIHB1YmxpYyBnZXRBbGxBQlRlc3RzVXNpbmdHRVQobGljZW5zZWVJZDogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3RMaXN0QUJUZXN0aW5nUmVzcG9uc2VEZXRhaWxzPj47XG4gICAgcHVibGljIGdldEFsbEFCVGVzdHNVc2luZ0dFVChsaWNlbnNlZUlkOiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGxpY2Vuc2VlSWQgPT09IG51bGwgfHwgbGljZW5zZWVJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBsaWNlbnNlZUlkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0QWxsQUJUZXN0c1VzaW5nR0VULicpO1xuICAgICAgICB9XG5cblxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgaWYgKHJlcUlkICE9PSB1bmRlZmluZWQgJiYgcmVxSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgncmVxSWQnLCBTdHJpbmcocmVxSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCd0b2tlbicsIFN0cmluZyh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8QXBpUmVzcG9uc2VPYmplY3RMaXN0QUJUZXN0aW5nUmVzcG9uc2VEZXRhaWxzPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZXhwZXJpbWVudHMvYWJ0ZXN0L2FsbC9nZXQvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGxpY2Vuc2VlSWQpKX1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQVBJIHRvIGdldCBhbGwgZXhwZXJpbWVudHMgYnkgTGljZW5zZWUgSWQuXG4gICAgICogXG4gICAgICogQHBhcmFtIGxpY2Vuc2VlSWQgbGljZW5zZWVJZFxuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QWxsRXhwZXJpbWVudHNVc2luZ0dFVChsaWNlbnNlZUlkOiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdExpc3RFeHBlcmltZW50c0VudGl0eT47XG4gICAgcHVibGljIGdldEFsbEV4cGVyaW1lbnRzVXNpbmdHRVQobGljZW5zZWVJZDogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdExpc3RFeHBlcmltZW50c0VudGl0eT4+O1xuICAgIHB1YmxpYyBnZXRBbGxFeHBlcmltZW50c1VzaW5nR0VUKGxpY2Vuc2VlSWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0TGlzdEV4cGVyaW1lbnRzRW50aXR5Pj47XG4gICAgcHVibGljIGdldEFsbEV4cGVyaW1lbnRzVXNpbmdHRVQobGljZW5zZWVJZDogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChsaWNlbnNlZUlkID09PSBudWxsIHx8IGxpY2Vuc2VlSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgbGljZW5zZWVJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEFsbEV4cGVyaW1lbnRzVXNpbmdHRVQuJyk7XG4gICAgICAgIH1cblxuXG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICBpZiAocmVxSWQgIT09IHVuZGVmaW5lZCAmJiByZXFJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdyZXFJZCcsIFN0cmluZyhyZXFJZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdW5kZWZpbmVkICYmIHRva2VuICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3Rva2VuJywgU3RyaW5nKHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxBcGlSZXNwb25zZU9iamVjdExpc3RFeHBlcmltZW50c0VudGl0eT4oYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2V4cGVyaW1lbnRzL2FsbC9nZXQvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGxpY2Vuc2VlSWQpKX1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQVBJIHRvIGdldCBhbGwgSW5jcmVtZW50YWxpdHkgVGVzdHMgZm9yIGEgZ2l2ZW4gTGljZW5zZWUgSWQuXG4gICAgICogXG4gICAgICogQHBhcmFtIGxpY2Vuc2VlSWQgbGljZW5zZWVJZFxuICAgICAqIEBwYXJhbSByZWZyZXNoIHJlZnJlc2hcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldEFsbFJlcG9ydHNGb3JJbmNyZW1lbnRhbGl0eVRlc3RVc2luZ0dFVChsaWNlbnNlZUlkOiBudW1iZXIsIHJlZnJlc2g/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3RMaXN0SW5jcmVtZW50YWxpdHlUZXN0RGV0YWlscz47XG4gICAgcHVibGljIGdldEFsbFJlcG9ydHNGb3JJbmNyZW1lbnRhbGl0eVRlc3RVc2luZ0dFVChsaWNlbnNlZUlkOiBudW1iZXIsIHJlZnJlc2g/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdExpc3RJbmNyZW1lbnRhbGl0eVRlc3REZXRhaWxzPj47XG4gICAgcHVibGljIGdldEFsbFJlcG9ydHNGb3JJbmNyZW1lbnRhbGl0eVRlc3RVc2luZ0dFVChsaWNlbnNlZUlkOiBudW1iZXIsIHJlZnJlc2g/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3RMaXN0SW5jcmVtZW50YWxpdHlUZXN0RGV0YWlscz4+O1xuICAgIHB1YmxpYyBnZXRBbGxSZXBvcnRzRm9ySW5jcmVtZW50YWxpdHlUZXN0VXNpbmdHRVQobGljZW5zZWVJZDogbnVtYmVyLCByZWZyZXNoPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAobGljZW5zZWVJZCA9PT0gbnVsbCB8fCBsaWNlbnNlZUlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGxpY2Vuc2VlSWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRBbGxSZXBvcnRzRm9ySW5jcmVtZW50YWxpdHlUZXN0VXNpbmdHRVQuJyk7XG4gICAgICAgIH1cblxuXG5cblxuICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IG5ldyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYygpfSk7XG4gICAgICAgIGlmIChyZWZyZXNoICE9PSB1bmRlZmluZWQgJiYgcmVmcmVzaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgncmVmcmVzaCcsIDxhbnk+cmVmcmVzaCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEFwaVJlc3BvbnNlT2JqZWN0TGlzdEluY3JlbWVudGFsaXR5VGVzdERldGFpbHM+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9leHBlcmltZW50cy9pbmNyZW1lbnRhbGl0eXRlc3QvYWxsL2dldC8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcobGljZW5zZWVJZCkpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiBxdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBUEkgdG8gZ2V0IEdsb2JhbGx5IEJsb2NrZWQgYW5kIFRhcmdldGVkIEF1ZGllbmNlcyBmb3IgYW4gRXhwZXJpbWVudCwgZ2l2ZW4gdGhlIENhbXBhaWduIElkLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBjYW1wYWlnbklkIGNhbXBhaWduSWRcbiAgICAgKiBAcGFyYW0gZXhwZXJpbWVudElkIGV4cGVyaW1lbnRJZFxuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QXVkaWVuY2VGb3JJbmNyZW1lbnRhbGl0eVRlc3RVc2luZ0dFVChjYW1wYWlnbklkOiBudW1iZXIsIGV4cGVyaW1lbnRJZD86IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0Q3JlYXRlRm9ybUF1ZGllbmNlUmVzcG9uc2VPYmplY3Q+O1xuICAgIHB1YmxpYyBnZXRBdWRpZW5jZUZvckluY3JlbWVudGFsaXR5VGVzdFVzaW5nR0VUKGNhbXBhaWduSWQ6IG51bWJlciwgZXhwZXJpbWVudElkPzogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdENyZWF0ZUZvcm1BdWRpZW5jZVJlc3BvbnNlT2JqZWN0Pj47XG4gICAgcHVibGljIGdldEF1ZGllbmNlRm9ySW5jcmVtZW50YWxpdHlUZXN0VXNpbmdHRVQoY2FtcGFpZ25JZDogbnVtYmVyLCBleHBlcmltZW50SWQ/OiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdENyZWF0ZUZvcm1BdWRpZW5jZVJlc3BvbnNlT2JqZWN0Pj47XG4gICAgcHVibGljIGdldEF1ZGllbmNlRm9ySW5jcmVtZW50YWxpdHlUZXN0VXNpbmdHRVQoY2FtcGFpZ25JZDogbnVtYmVyLCBleHBlcmltZW50SWQ/OiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGNhbXBhaWduSWQgPT09IG51bGwgfHwgY2FtcGFpZ25JZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjYW1wYWlnbklkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0QXVkaWVuY2VGb3JJbmNyZW1lbnRhbGl0eVRlc3RVc2luZ0dFVC4nKTtcbiAgICAgICAgfVxuXG5cblxuXG4gICAgICAgIGxldCBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogbmV3IEN1c3RvbUh0dHBVcmxFbmNvZGluZ0NvZGVjKCl9KTtcbiAgICAgICAgaWYgKGV4cGVyaW1lbnRJZCAhPT0gdW5kZWZpbmVkICYmIGV4cGVyaW1lbnRJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnZXhwZXJpbWVudElkJywgPGFueT5leHBlcmltZW50SWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICBpZiAocmVxSWQgIT09IHVuZGVmaW5lZCAmJiByZXFJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdyZXFJZCcsIFN0cmluZyhyZXFJZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdW5kZWZpbmVkICYmIHRva2VuICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3Rva2VuJywgU3RyaW5nKHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdENyZWF0ZUZvcm1BdWRpZW5jZVJlc3BvbnNlT2JqZWN0PihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZXhwZXJpbWVudHMvaW5jcmVtZW50YWxpdHl0ZXN0L2F1ZGllbmNlL2dldC8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoY2FtcGFpZ25JZCkpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiBxdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBUEkgdG8gZ2V0IGFsbCBBdWRpZW5jZXMgaW4gU3RyYXRlZ3kgVXBkYXRlL0NyZWF0ZSBmb3IgYW4gRXhwZXJpbWVudCwgZ2l2ZW4gdGhlIENhbXBhaWduIElkLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBjYW1wYWlnbklkIGNhbXBhaWduSWRcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldEF1ZGllbmNlRm9yU3RyYXRlZ3lVcGRhdGVJbkluY3JlbWVudGFsaXR5VGVzdFVzaW5nUE9TVChjYW1wYWlnbklkPzogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3RTdHJhdGVneUF1ZGllbmNlSW5jVGVzdE1hcD47XG4gICAgcHVibGljIGdldEF1ZGllbmNlRm9yU3RyYXRlZ3lVcGRhdGVJbkluY3JlbWVudGFsaXR5VGVzdFVzaW5nUE9TVChjYW1wYWlnbklkPzogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdFN0cmF0ZWd5QXVkaWVuY2VJbmNUZXN0TWFwPj47XG4gICAgcHVibGljIGdldEF1ZGllbmNlRm9yU3RyYXRlZ3lVcGRhdGVJbkluY3JlbWVudGFsaXR5VGVzdFVzaW5nUE9TVChjYW1wYWlnbklkPzogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3RTdHJhdGVneUF1ZGllbmNlSW5jVGVzdE1hcD4+O1xuICAgIHB1YmxpYyBnZXRBdWRpZW5jZUZvclN0cmF0ZWd5VXBkYXRlSW5JbmNyZW1lbnRhbGl0eVRlc3RVc2luZ1BPU1QoY2FtcGFpZ25JZD86IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuXG5cblxuICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IG5ldyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYygpfSk7XG4gICAgICAgIGlmIChjYW1wYWlnbklkICE9PSB1bmRlZmluZWQgJiYgY2FtcGFpZ25JZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnY2FtcGFpZ25JZCcsIDxhbnk+Y2FtcGFpZ25JZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEFwaVJlc3BvbnNlT2JqZWN0U3RyYXRlZ3lBdWRpZW5jZUluY1Rlc3RNYXA+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9leHBlcmltZW50cy9pbmNyZW1lbnRhbGl0eXRlc3Qvc3RyYXRlZ3kvYXVkaWVuY2VgLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBBUEkgdG8gZ2V0IGFuIGV4aXN0aW5nIEluY3JlbWVudGFsaXR5IFRlc3QgTWV0YWRhdGEgYnkgRXhwZXJpbWVudCBJZC5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZXhwZXJpbWVudElkIGV4cGVyaW1lbnRJZFxuICAgICAqIEBwYXJhbSByZWZyZXNoIHJlZnJlc2hcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldEluY3JlbWVudGFsaXR5VGVzdEJ5SWRVc2luZ0dFVChleHBlcmltZW50SWQ6IG51bWJlciwgcmVmcmVzaD86IGJvb2xlYW4sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdERldGFpbHM+O1xuICAgIHB1YmxpYyBnZXRJbmNyZW1lbnRhbGl0eVRlc3RCeUlkVXNpbmdHRVQoZXhwZXJpbWVudElkOiBudW1iZXIsIHJlZnJlc2g/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdERldGFpbHM+PjtcbiAgICBwdWJsaWMgZ2V0SW5jcmVtZW50YWxpdHlUZXN0QnlJZFVzaW5nR0VUKGV4cGVyaW1lbnRJZDogbnVtYmVyLCByZWZyZXNoPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0RGV0YWlscz4+O1xuICAgIHB1YmxpYyBnZXRJbmNyZW1lbnRhbGl0eVRlc3RCeUlkVXNpbmdHRVQoZXhwZXJpbWVudElkOiBudW1iZXIsIHJlZnJlc2g/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChleHBlcmltZW50SWQgPT09IG51bGwgfHwgZXhwZXJpbWVudElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGV4cGVyaW1lbnRJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEluY3JlbWVudGFsaXR5VGVzdEJ5SWRVc2luZ0dFVC4nKTtcbiAgICAgICAgfVxuXG5cblxuXG4gICAgICAgIGxldCBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogbmV3IEN1c3RvbUh0dHBVcmxFbmNvZGluZ0NvZGVjKCl9KTtcbiAgICAgICAgaWYgKHJlZnJlc2ggIT09IHVuZGVmaW5lZCAmJiByZWZyZXNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdyZWZyZXNoJywgPGFueT5yZWZyZXNoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgaWYgKHJlcUlkICE9PSB1bmRlZmluZWQgJiYgcmVxSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgncmVxSWQnLCBTdHJpbmcocmVxSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCd0b2tlbicsIFN0cmluZyh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8QXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3REZXRhaWxzPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZXhwZXJpbWVudHMvaW5jcmVtZW50YWxpdHl0ZXN0L2dldC8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZXhwZXJpbWVudElkKSl9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBBUEkgdG8gZG93bmxvYWQgYW4gZXhpc3RpbmcgSW5jcmVtZW50YWxpdHkgVGVzdCBSZXBvcnQgQ1NWIGJ5IEV4cGVyaW1lbnQgSWQuXG4gICAgICogXG4gICAgICogQHBhcmFtIGV4cGVyaW1lbnRJZCBleHBlcmltZW50SWRcbiAgICAgKiBAcGFyYW0gcmVmcmVzaCByZWZyZXNoXG4gICAgICogQHBhcmFtIHJlcUlkIHJlcXVlc3QgaWRcbiAgICAgKiBAcGFyYW0gdG9rZW4gQXV0aCBUb2tlblxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRJbmNyZW1lbnRhbGl0eVRlc3RSZXBvcnRDc3ZCeUlkVXNpbmdHRVQoZXhwZXJpbWVudElkOiBudW1iZXIsIHJlZnJlc2g/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3REZXRhaWxzPjtcbiAgICBwdWJsaWMgZ2V0SW5jcmVtZW50YWxpdHlUZXN0UmVwb3J0Q3N2QnlJZFVzaW5nR0VUKGV4cGVyaW1lbnRJZDogbnVtYmVyLCByZWZyZXNoPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3REZXRhaWxzPj47XG4gICAgcHVibGljIGdldEluY3JlbWVudGFsaXR5VGVzdFJlcG9ydENzdkJ5SWRVc2luZ0dFVChleHBlcmltZW50SWQ6IG51bWJlciwgcmVmcmVzaD86IGJvb2xlYW4sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdERldGFpbHM+PjtcbiAgICBwdWJsaWMgZ2V0SW5jcmVtZW50YWxpdHlUZXN0UmVwb3J0Q3N2QnlJZFVzaW5nR0VUKGV4cGVyaW1lbnRJZDogbnVtYmVyLCByZWZyZXNoPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoZXhwZXJpbWVudElkID09PSBudWxsIHx8IGV4cGVyaW1lbnRJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBleHBlcmltZW50SWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRJbmNyZW1lbnRhbGl0eVRlc3RSZXBvcnRDc3ZCeUlkVXNpbmdHRVQuJyk7XG4gICAgICAgIH1cblxuXG5cblxuICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IG5ldyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYygpfSk7XG4gICAgICAgIGlmIChyZWZyZXNoICE9PSB1bmRlZmluZWQgJiYgcmVmcmVzaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgncmVmcmVzaCcsIDxhbnk+cmVmcmVzaCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEFwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0RGV0YWlscz4oYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2V4cGVyaW1lbnRzL2luY3JlbWVudGFsaXR5dGVzdC9yZXBvcnQvY3N2L2dldC8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZXhwZXJpbWVudElkKSl9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFQSSB0byBnZXQgUmVwb3J0IGZvciBhbiBJbmNyZW1lbnRhbGl0eSBUZXN0IEJ5IEV4cGVyaW1lbnQgSWRcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZXhwZXJpbWVudElkIGV4cGVyaW1lbnRJZFxuICAgICAqIEBwYXJhbSByZWZyZXNoIHJlZnJlc2hcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldFJlcG9ydEZvckluY3JlbWVudGFsaXR5VGVzdEJ5SWRVc2luZ0dFVChleHBlcmltZW50SWQ6IG51bWJlciwgcmVmcmVzaD86IGJvb2xlYW4sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdFJlcG9ydENhbGN1bGF0aW9uRGV0YWlscz47XG4gICAgcHVibGljIGdldFJlcG9ydEZvckluY3JlbWVudGFsaXR5VGVzdEJ5SWRVc2luZ0dFVChleHBlcmltZW50SWQ6IG51bWJlciwgcmVmcmVzaD86IGJvb2xlYW4sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0UmVwb3J0Q2FsY3VsYXRpb25EZXRhaWxzPj47XG4gICAgcHVibGljIGdldFJlcG9ydEZvckluY3JlbWVudGFsaXR5VGVzdEJ5SWRVc2luZ0dFVChleHBlcmltZW50SWQ6IG51bWJlciwgcmVmcmVzaD86IGJvb2xlYW4sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdEluY3JlbWVudGFsaXR5VGVzdFJlcG9ydENhbGN1bGF0aW9uRGV0YWlscz4+O1xuICAgIHB1YmxpYyBnZXRSZXBvcnRGb3JJbmNyZW1lbnRhbGl0eVRlc3RCeUlkVXNpbmdHRVQoZXhwZXJpbWVudElkOiBudW1iZXIsIHJlZnJlc2g/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChleHBlcmltZW50SWQgPT09IG51bGwgfHwgZXhwZXJpbWVudElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGV4cGVyaW1lbnRJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFJlcG9ydEZvckluY3JlbWVudGFsaXR5VGVzdEJ5SWRVc2luZ0dFVC4nKTtcbiAgICAgICAgfVxuXG5cblxuXG4gICAgICAgIGxldCBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogbmV3IEN1c3RvbUh0dHBVcmxFbmNvZGluZ0NvZGVjKCl9KTtcbiAgICAgICAgaWYgKHJlZnJlc2ggIT09IHVuZGVmaW5lZCAmJiByZWZyZXNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdyZWZyZXNoJywgPGFueT5yZWZyZXNoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgaWYgKHJlcUlkICE9PSB1bmRlZmluZWQgJiYgcmVxSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgncmVxSWQnLCBTdHJpbmcocmVxSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCd0b2tlbicsIFN0cmluZyh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8QXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3RSZXBvcnRDYWxjdWxhdGlvbkRldGFpbHM+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9leHBlcmltZW50cy9pbmNyZW1lbnRhbGl0eXRlc3QvcmVwb3J0L2dldC8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZXhwZXJpbWVudElkKSl9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFQSSB0byBnZXQgQUIgVGVzdGluZyBWYXJpYW50IFJlcG9ydCBieSBFeHBlcmltZW50IElkLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBleHBlcmltZW50SWQgZXhwZXJpbWVudElkXG4gICAgICogQHBhcmFtIHNob3d1dSBzaG93dXVcbiAgICAgKiBAcGFyYW0gcmVmcmVzaCByZWZyZXNoXG4gICAgICogQHBhcmFtIHJlcUlkIHJlcXVlc3QgaWRcbiAgICAgKiBAcGFyYW0gdG9rZW4gQXV0aCBUb2tlblxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYXJpYW50UmVwb3J0QnlFeHBlcmltZW50SWRVc2luZ1BPU1QoZXhwZXJpbWVudElkOiBudW1iZXIsIHNob3d1dTogYm9vbGVhbiwgcmVmcmVzaD86IGJvb2xlYW4sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdExpc3REYXNoYm9hcmRSZXNwb25zZT47XG4gICAgcHVibGljIGdldFZhcmlhbnRSZXBvcnRCeUV4cGVyaW1lbnRJZFVzaW5nUE9TVChleHBlcmltZW50SWQ6IG51bWJlciwgc2hvd3V1OiBib29sZWFuLCByZWZyZXNoPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RMaXN0RGFzaGJvYXJkUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZ2V0VmFyaWFudFJlcG9ydEJ5RXhwZXJpbWVudElkVXNpbmdQT1NUKGV4cGVyaW1lbnRJZDogbnVtYmVyLCBzaG93dXU6IGJvb2xlYW4sIHJlZnJlc2g/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3RMaXN0RGFzaGJvYXJkUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZ2V0VmFyaWFudFJlcG9ydEJ5RXhwZXJpbWVudElkVXNpbmdQT1NUKGV4cGVyaW1lbnRJZDogbnVtYmVyLCBzaG93dXU6IGJvb2xlYW4sIHJlZnJlc2g/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChleHBlcmltZW50SWQgPT09IG51bGwgfHwgZXhwZXJpbWVudElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGV4cGVyaW1lbnRJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhcmlhbnRSZXBvcnRCeUV4cGVyaW1lbnRJZFVzaW5nUE9TVC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaG93dXUgPT09IG51bGwgfHwgc2hvd3V1ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNob3d1dSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhcmlhbnRSZXBvcnRCeUV4cGVyaW1lbnRJZFVzaW5nUE9TVC4nKTtcbiAgICAgICAgfVxuXG5cblxuXG4gICAgICAgIGxldCBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogbmV3IEN1c3RvbUh0dHBVcmxFbmNvZGluZ0NvZGVjKCl9KTtcbiAgICAgICAgaWYgKHJlZnJlc2ggIT09IHVuZGVmaW5lZCAmJiByZWZyZXNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdyZWZyZXNoJywgPGFueT5yZWZyZXNoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvd3V1ICE9PSB1bmRlZmluZWQgJiYgc2hvd3V1ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdzaG93dXUnLCA8YW55PnNob3d1dSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEFwaVJlc3BvbnNlT2JqZWN0TGlzdERhc2hib2FyZFJlc3BvbnNlPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZXhwZXJpbWVudHMvYWJ0ZXN0L3JlcG9ydC9nZXQvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGV4cGVyaW1lbnRJZCkpfWAsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhcmFtczogcXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogIEFwaSB0byAgdXBkYXRlIGV4aXNpdGluZyBBQiBUZXN0IEV4cGVyaW1lbnQuXG4gICAgICogXG4gICAgICogQHBhcmFtIGR0byBkdG9cbiAgICAgKiBAcGFyYW0gZXhwZXJpbWVudElkIGV4cGVyaW1lbnRJZFxuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlQUJUZXN0VXNpbmdQT1NUKGR0bzogQUJUZXN0aW5nRFRPLCBleHBlcmltZW50SWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0QUJUZXN0aW5nUmVzcG9uc2VEZXRhaWxzPjtcbiAgICBwdWJsaWMgdXBkYXRlQUJUZXN0VXNpbmdQT1NUKGR0bzogQUJUZXN0aW5nRFRPLCBleHBlcmltZW50SWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RBQlRlc3RpbmdSZXNwb25zZURldGFpbHM+PjtcbiAgICBwdWJsaWMgdXBkYXRlQUJUZXN0VXNpbmdQT1NUKGR0bzogQUJUZXN0aW5nRFRPLCBleHBlcmltZW50SWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0QUJUZXN0aW5nUmVzcG9uc2VEZXRhaWxzPj47XG4gICAgcHVibGljIHVwZGF0ZUFCVGVzdFVzaW5nUE9TVChkdG86IEFCVGVzdGluZ0RUTywgZXhwZXJpbWVudElkOiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGR0byA9PT0gbnVsbCB8fCBkdG8gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZHRvIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBkYXRlQUJUZXN0VXNpbmdQT1NULicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4cGVyaW1lbnRJZCA9PT0gbnVsbCB8fCBleHBlcmltZW50SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZXhwZXJpbWVudElkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBkYXRlQUJUZXN0VXNpbmdQT1NULicpO1xuICAgICAgICB9XG5cblxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgaWYgKHJlcUlkICE9PSB1bmRlZmluZWQgJiYgcmVxSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgncmVxSWQnLCBTdHJpbmcocmVxSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCd0b2tlbicsIFN0cmluZyh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEFwaVJlc3BvbnNlT2JqZWN0QUJUZXN0aW5nUmVzcG9uc2VEZXRhaWxzPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZXhwZXJpbWVudHMvYWJ0ZXN0L3VwZGF0ZS8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZXhwZXJpbWVudElkKSl9YCxcbiAgICAgICAgICAgIGR0byxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFQSSB0byB1cGRhdGUgSW5jcmVtZW50YWxpdHkgVGVzdCBFeHBlcmltZW50IGJ5IEV4cGVyaW1lbnQgSWQuXG4gICAgICogXG4gICAgICogQHBhcmFtIGV4cGVyaW1lbnRJZCBleHBlcmltZW50SWRcbiAgICAgKiBAcGFyYW0gaW5jcmVtZW50YWxpdHlUZXN0RFRPIGluY3JlbWVudGFsaXR5VGVzdERUT1xuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlSW5jcmVtZW50YWxpdHlUZXN0VXNpbmdQT1NUKGV4cGVyaW1lbnRJZDogbnVtYmVyLCBpbmNyZW1lbnRhbGl0eVRlc3REVE86IEluY3JlbWVudGFsaXR5VGVzdERUTywgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0RGV0YWlscz47XG4gICAgcHVibGljIHVwZGF0ZUluY3JlbWVudGFsaXR5VGVzdFVzaW5nUE9TVChleHBlcmltZW50SWQ6IG51bWJlciwgaW5jcmVtZW50YWxpdHlUZXN0RFRPOiBJbmNyZW1lbnRhbGl0eVRlc3REVE8sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0RGV0YWlscz4+O1xuICAgIHB1YmxpYyB1cGRhdGVJbmNyZW1lbnRhbGl0eVRlc3RVc2luZ1BPU1QoZXhwZXJpbWVudElkOiBudW1iZXIsIGluY3JlbWVudGFsaXR5VGVzdERUTzogSW5jcmVtZW50YWxpdHlUZXN0RFRPLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3RJbmNyZW1lbnRhbGl0eVRlc3REZXRhaWxzPj47XG4gICAgcHVibGljIHVwZGF0ZUluY3JlbWVudGFsaXR5VGVzdFVzaW5nUE9TVChleHBlcmltZW50SWQ6IG51bWJlciwgaW5jcmVtZW50YWxpdHlUZXN0RFRPOiBJbmNyZW1lbnRhbGl0eVRlc3REVE8sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGV4cGVyaW1lbnRJZCA9PT0gbnVsbCB8fCBleHBlcmltZW50SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZXhwZXJpbWVudElkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBkYXRlSW5jcmVtZW50YWxpdHlUZXN0VXNpbmdQT1NULicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluY3JlbWVudGFsaXR5VGVzdERUTyA9PT0gbnVsbCB8fCBpbmNyZW1lbnRhbGl0eVRlc3REVE8gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgaW5jcmVtZW50YWxpdHlUZXN0RFRPIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBkYXRlSW5jcmVtZW50YWxpdHlUZXN0VXNpbmdQT1NULicpO1xuICAgICAgICB9XG5cblxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgaWYgKHJlcUlkICE9PSB1bmRlZmluZWQgJiYgcmVxSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgncmVxSWQnLCBTdHJpbmcocmVxSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCd0b2tlbicsIFN0cmluZyh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEFwaVJlc3BvbnNlT2JqZWN0SW5jcmVtZW50YWxpdHlUZXN0RGV0YWlscz4oYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2V4cGVyaW1lbnRzL2luY3JlbWVudGFsaXR5dGVzdC91cGRhdGUvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGV4cGVyaW1lbnRJZCkpfWAsXG4gICAgICAgICAgICBpbmNyZW1lbnRhbGl0eVRlc3REVE8sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbn1cbiJdfQ==