@microsoft/terraform-cdk-constructs 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. package/.jsii +54846 -26661
  2. package/API.md +72091 -23784
  3. package/lib/azure-actiongroup/index.d.ts +0 -10
  4. package/lib/azure-actiongroup/index.js +1 -11
  5. package/lib/azure-actiongroup/lib/action-group.d.ts +0 -10
  6. package/lib/azure-actiongroup/lib/action-group.js +6 -32
  7. package/lib/azure-actiongroup/lib/index.d.ts +1 -4
  8. package/lib/azure-actiongroup/lib/index.js +2 -5
  9. package/lib/azure-activitylogalert/index.d.ts +0 -10
  10. package/lib/azure-activitylogalert/index.js +1 -11
  11. package/lib/azure-activitylogalert/lib/activity-log-alert.d.ts +0 -10
  12. package/lib/azure-activitylogalert/lib/activity-log-alert.js +6 -32
  13. package/lib/azure-activitylogalert/lib/index.d.ts +1 -4
  14. package/lib/azure-activitylogalert/lib/index.js +2 -5
  15. package/lib/azure-aks/index.d.ts +0 -8
  16. package/lib/azure-aks/index.js +1 -11
  17. package/lib/azure-aks/lib/aks-cluster.d.ts +4 -13
  18. package/lib/azure-aks/lib/aks-cluster.js +13 -36
  19. package/lib/azure-aks/lib/index.d.ts +1 -10
  20. package/lib/azure-aks/lib/index.js +2 -21
  21. package/lib/azure-diagnosticsettings/index.d.ts +0 -6
  22. package/lib/azure-diagnosticsettings/index.js +1 -7
  23. package/lib/azure-diagnosticsettings/lib/diagnostic-settings.d.ts +0 -10
  24. package/lib/azure-diagnosticsettings/lib/diagnostic-settings.js +6 -32
  25. package/lib/azure-diagnosticsettings/lib/index.d.ts +1 -7
  26. package/lib/azure-diagnosticsettings/lib/index.js +2 -8
  27. package/lib/azure-dnsforwardingruleset/index.d.ts +1 -0
  28. package/lib/azure-dnsforwardingruleset/index.js +18 -0
  29. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset-schemas.d.ts +24 -0
  30. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset-schemas.js +206 -0
  31. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.d.ts +174 -0
  32. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.js +214 -0
  33. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule-schemas.d.ts +24 -0
  34. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule-schemas.js +242 -0
  35. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.d.ts +193 -0
  36. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.js +193 -0
  37. package/lib/azure-dnsforwardingruleset/lib/index.d.ts +6 -0
  38. package/lib/azure-dnsforwardingruleset/lib/index.js +23 -0
  39. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link-schemas.d.ts +24 -0
  40. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link-schemas.js +199 -0
  41. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.d.ts +160 -0
  42. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.js +178 -0
  43. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.integ.d.ts +9 -0
  44. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.integ.js +133 -0
  45. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.spec.d.ts +9 -0
  46. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.spec.js +350 -0
  47. package/lib/azure-dnsforwardingruleset/test/forwarding-rule.spec.d.ts +9 -0
  48. package/lib/azure-dnsforwardingruleset/test/forwarding-rule.spec.js +397 -0
  49. package/lib/azure-dnsforwardingruleset/test/virtual-network-link.spec.d.ts +9 -0
  50. package/lib/azure-dnsforwardingruleset/test/virtual-network-link.spec.js +285 -0
  51. package/lib/azure-dnsresolver/index.d.ts +1 -0
  52. package/lib/azure-dnsresolver/index.js +18 -0
  53. package/lib/azure-dnsresolver/lib/dns-resolver-schemas.d.ts +24 -0
  54. package/lib/azure-dnsresolver/lib/dns-resolver-schemas.js +218 -0
  55. package/lib/azure-dnsresolver/lib/dns-resolver.d.ts +170 -0
  56. package/lib/azure-dnsresolver/lib/dns-resolver.js +236 -0
  57. package/lib/azure-dnsresolver/lib/inbound-endpoint-schemas.d.ts +24 -0
  58. package/lib/azure-dnsresolver/lib/inbound-endpoint-schemas.js +261 -0
  59. package/lib/azure-dnsresolver/lib/inbound-endpoint.d.ts +189 -0
  60. package/lib/azure-dnsresolver/lib/inbound-endpoint.js +243 -0
  61. package/lib/azure-dnsresolver/lib/index.d.ts +6 -0
  62. package/lib/azure-dnsresolver/lib/index.js +23 -0
  63. package/lib/azure-dnsresolver/lib/outbound-endpoint-schemas.d.ts +24 -0
  64. package/lib/azure-dnsresolver/lib/outbound-endpoint-schemas.js +231 -0
  65. package/lib/azure-dnsresolver/lib/outbound-endpoint.d.ts +175 -0
  66. package/lib/azure-dnsresolver/lib/outbound-endpoint.js +234 -0
  67. package/lib/azure-dnsresolver/test/dns-resolver.integ.d.ts +14 -0
  68. package/lib/azure-dnsresolver/test/dns-resolver.integ.js +117 -0
  69. package/lib/azure-dnsresolver/test/dns-resolver.spec.d.ts +9 -0
  70. package/lib/azure-dnsresolver/test/dns-resolver.spec.js +353 -0
  71. package/lib/azure-dnsresolver/test/inbound-endpoint.integ.d.ts +9 -0
  72. package/lib/azure-dnsresolver/test/inbound-endpoint.integ.js +151 -0
  73. package/lib/azure-dnsresolver/test/inbound-endpoint.spec.d.ts +9 -0
  74. package/lib/azure-dnsresolver/test/inbound-endpoint.spec.js +441 -0
  75. package/lib/azure-dnsresolver/test/outbound-endpoint.integ.d.ts +9 -0
  76. package/lib/azure-dnsresolver/test/outbound-endpoint.integ.js +149 -0
  77. package/lib/azure-dnsresolver/test/outbound-endpoint.spec.d.ts +9 -0
  78. package/lib/azure-dnsresolver/test/outbound-endpoint.spec.js +301 -0
  79. package/lib/azure-dnszone/index.d.ts +1 -0
  80. package/lib/azure-dnszone/index.js +18 -0
  81. package/lib/azure-dnszone/lib/dns-zone-schemas.d.ts +24 -0
  82. package/lib/azure-dnszone/lib/dns-zone-schemas.js +191 -0
  83. package/lib/azure-dnszone/lib/dns-zone.d.ts +182 -0
  84. package/lib/azure-dnszone/lib/dns-zone.js +228 -0
  85. package/lib/azure-dnszone/lib/index.d.ts +2 -0
  86. package/lib/azure-dnszone/lib/index.js +19 -0
  87. package/lib/azure-dnszone/test/dns-zone.integ.d.ts +9 -0
  88. package/lib/azure-dnszone/test/dns-zone.integ.js +85 -0
  89. package/lib/azure-dnszone/test/dns-zone.spec.d.ts +9 -0
  90. package/lib/azure-dnszone/test/dns-zone.spec.js +285 -0
  91. package/lib/azure-metricalert/index.d.ts +0 -10
  92. package/lib/azure-metricalert/index.js +1 -11
  93. package/lib/azure-metricalert/lib/index.d.ts +1 -4
  94. package/lib/azure-metricalert/lib/index.js +2 -5
  95. package/lib/azure-metricalert/lib/metric-alert.d.ts +0 -10
  96. package/lib/azure-metricalert/lib/metric-alert.js +6 -32
  97. package/lib/azure-networkinterface/index.d.ts +0 -3
  98. package/lib/azure-networkinterface/index.js +1 -4
  99. package/lib/azure-networkinterface/lib/index.d.ts +1 -5
  100. package/lib/azure-networkinterface/lib/index.js +2 -5
  101. package/lib/azure-networkinterface/lib/network-interface.d.ts +4 -9
  102. package/lib/azure-networkinterface/lib/network-interface.js +14 -29
  103. package/lib/azure-networkinterface/test/network-interface.integ.js +20 -6
  104. package/lib/azure-networksecuritygroup/index.d.ts +0 -5
  105. package/lib/azure-networksecuritygroup/index.js +1 -6
  106. package/lib/azure-networksecuritygroup/lib/index.d.ts +2 -5
  107. package/lib/azure-networksecuritygroup/lib/index.js +17 -14
  108. package/lib/azure-networksecuritygroup/lib/network-security-group.d.ts +4 -13
  109. package/lib/azure-networksecuritygroup/lib/network-security-group.js +14 -36
  110. package/lib/azure-policyassignment/index.d.ts +1 -0
  111. package/lib/azure-policyassignment/index.js +18 -0
  112. package/lib/azure-policyassignment/lib/index.d.ts +2 -0
  113. package/lib/azure-policyassignment/lib/index.js +19 -0
  114. package/lib/azure-policyassignment/lib/policy-assignment-schemas.d.ts +25 -0
  115. package/lib/azure-policyassignment/lib/policy-assignment-schemas.js +260 -0
  116. package/lib/azure-policyassignment/lib/policy-assignment.d.ts +342 -0
  117. package/lib/azure-policyassignment/lib/policy-assignment.js +228 -0
  118. package/lib/azure-policyassignment/test/policy-assignment.integ.d.ts +13 -0
  119. package/lib/azure-policyassignment/test/policy-assignment.integ.js +153 -0
  120. package/lib/azure-policyassignment/test/policy-assignment.spec.d.ts +9 -0
  121. package/lib/azure-policyassignment/test/policy-assignment.spec.js +651 -0
  122. package/lib/azure-policydefinition/index.d.ts +1 -0
  123. package/lib/azure-policydefinition/index.js +18 -0
  124. package/lib/azure-policydefinition/lib/index.d.ts +2 -0
  125. package/lib/azure-policydefinition/lib/index.js +19 -0
  126. package/lib/azure-policydefinition/lib/policy-definition-schemas.d.ts +25 -0
  127. package/lib/azure-policydefinition/lib/policy-definition-schemas.js +210 -0
  128. package/lib/azure-policydefinition/lib/policy-definition.d.ts +260 -0
  129. package/lib/azure-policydefinition/lib/policy-definition.js +199 -0
  130. package/lib/azure-policydefinition/test/policy-definition.integ.d.ts +9 -0
  131. package/lib/azure-policydefinition/test/policy-definition.integ.js +137 -0
  132. package/lib/azure-policydefinition/test/policy-definition.spec.d.ts +9 -0
  133. package/lib/azure-policydefinition/test/policy-definition.spec.js +596 -0
  134. package/lib/azure-privatednszone/index.d.ts +1 -0
  135. package/lib/azure-privatednszone/index.js +18 -0
  136. package/lib/azure-privatednszone/lib/index.d.ts +2 -0
  137. package/lib/azure-privatednszone/lib/index.js +19 -0
  138. package/lib/azure-privatednszone/lib/private-dns-zone-schemas.d.ts +24 -0
  139. package/lib/azure-privatednszone/lib/private-dns-zone-schemas.js +254 -0
  140. package/lib/azure-privatednszone/lib/private-dns-zone.d.ts +178 -0
  141. package/lib/azure-privatednszone/lib/private-dns-zone.js +272 -0
  142. package/lib/azure-privatednszone/test/private-dns-zone.integ.d.ts +9 -0
  143. package/lib/azure-privatednszone/test/private-dns-zone.integ.js +84 -0
  144. package/lib/azure-privatednszone/test/private-dns-zone.spec.d.ts +9 -0
  145. package/lib/azure-privatednszone/test/private-dns-zone.spec.js +341 -0
  146. package/lib/azure-privatednszonelink/index.d.ts +1 -0
  147. package/lib/azure-privatednszonelink/index.js +18 -0
  148. package/lib/azure-privatednszonelink/lib/index.d.ts +2 -0
  149. package/lib/azure-privatednszonelink/lib/index.js +19 -0
  150. package/lib/azure-privatednszonelink/lib/private-dns-zone-link-schemas.d.ts +24 -0
  151. package/lib/azure-privatednszonelink/lib/private-dns-zone-link-schemas.js +262 -0
  152. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.d.ts +202 -0
  153. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +250 -0
  154. package/lib/azure-privatednszonelink/test/private-dns-zone-link.integ.d.ts +9 -0
  155. package/lib/azure-privatednszonelink/test/private-dns-zone-link.integ.js +110 -0
  156. package/lib/azure-privatednszonelink/test/private-dns-zone-link.spec.d.ts +9 -0
  157. package/lib/azure-privatednszonelink/test/private-dns-zone-link.spec.js +465 -0
  158. package/lib/azure-publicipaddress/index.d.ts +0 -5
  159. package/lib/azure-publicipaddress/index.js +1 -6
  160. package/lib/azure-publicipaddress/lib/index.d.ts +2 -9
  161. package/lib/azure-publicipaddress/lib/index.js +17 -17
  162. package/lib/azure-publicipaddress/lib/public-ip-address.d.ts +4 -13
  163. package/lib/azure-publicipaddress/lib/public-ip-address.js +14 -36
  164. package/lib/azure-resourcegroup/index.d.ts +0 -37
  165. package/lib/azure-resourcegroup/index.js +1 -39
  166. package/lib/azure-resourcegroup/lib/index.d.ts +1 -44
  167. package/lib/azure-resourcegroup/lib/index.js +2 -43
  168. package/lib/azure-resourcegroup/lib/resource-group.d.ts +9 -23
  169. package/lib/azure-resourcegroup/lib/resource-group.js +23 -56
  170. package/lib/azure-resourcegroup/test/resource-group.spec.js +13 -19
  171. package/lib/azure-roleassignment/index.d.ts +1 -0
  172. package/lib/azure-roleassignment/index.js +18 -0
  173. package/lib/azure-roleassignment/lib/index.d.ts +2 -0
  174. package/lib/azure-roleassignment/lib/index.js +19 -0
  175. package/lib/azure-roleassignment/lib/role-assignment-schemas.d.ts +25 -0
  176. package/lib/azure-roleassignment/lib/role-assignment-schemas.js +238 -0
  177. package/lib/azure-roleassignment/lib/role-assignment.d.ts +294 -0
  178. package/lib/azure-roleassignment/lib/role-assignment.js +257 -0
  179. package/lib/azure-roleassignment/test/role-assignment.integ.d.ts +12 -0
  180. package/lib/azure-roleassignment/test/role-assignment.integ.js +101 -0
  181. package/lib/azure-roleassignment/test/role-assignment.spec.d.ts +9 -0
  182. package/lib/azure-roleassignment/test/role-assignment.spec.js +633 -0
  183. package/lib/azure-roledefinition/index.d.ts +1 -0
  184. package/lib/azure-roledefinition/index.js +18 -0
  185. package/lib/azure-roledefinition/lib/index.d.ts +2 -0
  186. package/lib/azure-roledefinition/lib/index.js +19 -0
  187. package/lib/azure-roledefinition/lib/role-definition-schemas.d.ts +25 -0
  188. package/lib/azure-roledefinition/lib/role-definition-schemas.js +195 -0
  189. package/lib/azure-roledefinition/lib/role-definition.d.ts +236 -0
  190. package/lib/azure-roledefinition/lib/role-definition.js +192 -0
  191. package/lib/azure-roledefinition/test/role-definition.integ.d.ts +12 -0
  192. package/lib/azure-roledefinition/test/role-definition.integ.js +142 -0
  193. package/lib/azure-roledefinition/test/role-definition.spec.d.ts +9 -0
  194. package/lib/azure-roledefinition/test/role-definition.spec.js +946 -0
  195. package/lib/azure-storageaccount/index.d.ts +0 -19
  196. package/lib/azure-storageaccount/index.js +1 -20
  197. package/lib/azure-storageaccount/lib/index.d.ts +1 -7
  198. package/lib/azure-storageaccount/lib/index.js +2 -8
  199. package/lib/azure-storageaccount/lib/storage-account.d.ts +4 -9
  200. package/lib/azure-storageaccount/lib/storage-account.js +15 -29
  201. package/lib/azure-subnet/index.d.ts +0 -3
  202. package/lib/azure-subnet/index.js +1 -4
  203. package/lib/azure-subnet/lib/index.d.ts +1 -4
  204. package/lib/azure-subnet/lib/index.js +2 -5
  205. package/lib/azure-subnet/lib/subnet.d.ts +3 -14
  206. package/lib/azure-subnet/lib/subnet.js +28 -47
  207. package/lib/azure-subnet/test/subnet.integ.js +19 -7
  208. package/lib/azure-subnet/test/subnet.spec.js +1 -2
  209. package/lib/azure-virtualmachine/index.d.ts +0 -6
  210. package/lib/azure-virtualmachine/index.js +1 -7
  211. package/lib/azure-virtualmachine/lib/index.d.ts +1 -10
  212. package/lib/azure-virtualmachine/lib/index.js +2 -21
  213. package/lib/azure-virtualmachine/lib/virtual-machine.d.ts +4 -13
  214. package/lib/azure-virtualmachine/lib/virtual-machine.js +15 -36
  215. package/lib/azure-virtualnetwork/index.d.ts +0 -9
  216. package/lib/azure-virtualnetwork/index.js +1 -11
  217. package/lib/azure-virtualnetwork/lib/index.d.ts +2 -9
  218. package/lib/azure-virtualnetwork/lib/index.js +17 -20
  219. package/lib/azure-virtualnetwork/lib/virtual-network.d.ts +4 -13
  220. package/lib/azure-virtualnetwork/lib/virtual-network.js +15 -36
  221. package/lib/azure-virtualnetworkmanager/index.d.ts +1 -0
  222. package/lib/azure-virtualnetworkmanager/index.js +18 -0
  223. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration-schemas.d.ts +48 -0
  224. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration-schemas.js +265 -0
  225. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.d.ts +185 -0
  226. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +206 -0
  227. package/lib/azure-virtualnetworkmanager/lib/index.d.ts +14 -0
  228. package/lib/azure-virtualnetworkmanager/lib/index.js +31 -0
  229. package/lib/azure-virtualnetworkmanager/lib/network-group-schemas.d.ts +32 -0
  230. package/lib/azure-virtualnetworkmanager/lib/network-group-schemas.js +189 -0
  231. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member-schemas.d.ts +32 -0
  232. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member-schemas.js +201 -0
  233. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.d.ts +135 -0
  234. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +163 -0
  235. package/lib/azure-virtualnetworkmanager/lib/network-group.d.ts +139 -0
  236. package/lib/azure-virtualnetworkmanager/lib/network-group.js +158 -0
  237. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration-schemas.d.ts +32 -0
  238. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration-schemas.js +182 -0
  239. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.d.ts +144 -0
  240. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +164 -0
  241. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection-schemas.d.ts +38 -0
  242. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection-schemas.js +206 -0
  243. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.d.ts +142 -0
  244. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +162 -0
  245. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-schemas.d.ts +39 -0
  246. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-schemas.js +359 -0
  247. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.d.ts +221 -0
  248. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +204 -0
  249. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager-schemas.d.ts +32 -0
  250. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager-schemas.js +236 -0
  251. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.d.ts +337 -0
  252. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +283 -0
  253. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.d.ts +25 -0
  254. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.js +402 -0
  255. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.d.ts +9 -0
  256. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.js +1652 -0
  257. package/lib/azure-vmss/index.d.ts +0 -5
  258. package/lib/azure-vmss/index.js +1 -6
  259. package/lib/azure-vmss/lib/index.d.ts +0 -7
  260. package/lib/azure-vmss/lib/index.js +1 -21
  261. package/lib/azure-vmss/lib/virtual-machine-scale-set.d.ts +5 -13
  262. package/lib/azure-vmss/lib/virtual-machine-scale-set.js +29 -53
  263. package/lib/core-azure/lib/azapi/azapi-resource-tags.spec.d.ts +10 -0
  264. package/lib/core-azure/lib/azapi/azapi-resource-tags.spec.js +218 -0
  265. package/lib/core-azure/lib/azapi/azapi-resource.d.ts +178 -26
  266. package/lib/core-azure/lib/azapi/azapi-resource.js +328 -90
  267. package/lib/core-azure/lib/azapi/azapi-resource.spec.js +2 -2
  268. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.js +2 -2
  269. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.js +5 -5
  270. package/lib/core-azure/lib/azapi/providers-azapi/provider/index.js +5 -3
  271. package/lib/core-azure/lib/azapi/providers-azapi/resource/index.js +5 -5
  272. package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.js +3 -3
  273. package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.js +3 -3
  274. package/lib/core-azure/lib/azapi/resource-schema-validator.d.ts +118 -0
  275. package/lib/core-azure/lib/azapi/resource-schema-validator.js +236 -0
  276. package/lib/core-azure/lib/azapi/resource-version-manager.d.ts +103 -0
  277. package/lib/core-azure/lib/azapi/resource-version-manager.js +168 -0
  278. package/lib/core-azure/lib/azapi/schema-mapper/schema-mapper.js +11 -6
  279. package/lib/core-azure/lib/index.d.ts +2 -2
  280. package/lib/core-azure/lib/index.js +5 -5
  281. package/lib/core-azure/lib/version-manager/api-version-manager.js +1 -1
  282. package/lib/core-azure/lib/version-manager/interfaces/version-interfaces.js +7 -7
  283. package/lib/index.d.ts +19 -0
  284. package/lib/index.js +21 -2
  285. package/lib/testing/index.js +2 -2
  286. package/lib/testing/lib/cleanup.d.ts +1 -0
  287. package/lib/testing/lib/cleanup.js +19 -12
  288. package/lib/testing/lib/metadata.js +19 -16
  289. package/package.json +1 -1
  290. package/scripts/cleanup-test-resources.ts +22 -4
  291. package/scripts/generate-index.js +25 -8
@@ -0,0 +1,946 @@
1
+ "use strict";
2
+ /**
3
+ * Comprehensive tests for the unified RoleDefinition implementation
4
+ *
5
+ * This test suite validates the unified RoleDefinition class that uses
6
+ * the VersionedAzapiResource framework. Tests cover automatic version resolution,
7
+ * explicit version pinning, schema validation, property transformation, and
8
+ * role definition-specific functionality.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ const cdktf_1 = require("cdktf");
12
+ const cdktf = require("cdktf");
13
+ const api_version_manager_1 = require("../../core-azure/lib/version-manager/api-version-manager");
14
+ const version_interfaces_1 = require("../../core-azure/lib/version-manager/interfaces/version-interfaces");
15
+ const role_definition_1 = require("../lib/role-definition");
16
+ const role_definition_schemas_1 = require("../lib/role-definition-schemas");
17
+ describe("RoleDefinition - Unified Implementation", () => {
18
+ let app;
19
+ let stack;
20
+ let manager;
21
+ beforeEach(() => {
22
+ app = cdktf_1.Testing.app();
23
+ stack = new cdktf.TerraformStack(app, "TestStack");
24
+ manager = api_version_manager_1.ApiVersionManager.instance();
25
+ // Ensure Role Definition schemas are registered
26
+ try {
27
+ manager.registerResourceType(role_definition_schemas_1.ROLE_DEFINITION_TYPE, role_definition_schemas_1.ALL_ROLE_DEFINITION_VERSIONS);
28
+ }
29
+ catch (error) {
30
+ // Ignore if already registered
31
+ }
32
+ });
33
+ describe("Constructor and Basic Properties", () => {
34
+ it("should create role definition with automatic latest version resolution", () => {
35
+ const props = {
36
+ name: "test-role",
37
+ roleName: "Test Role",
38
+ permissions: [
39
+ {
40
+ actions: ["Microsoft.Compute/virtualMachines/read"],
41
+ notActions: [],
42
+ dataActions: [],
43
+ notDataActions: [],
44
+ },
45
+ ],
46
+ assignableScopes: [
47
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
48
+ ],
49
+ };
50
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "TestRole", props);
51
+ expect(roleDefinition).toBeInstanceOf(role_definition_1.RoleDefinition);
52
+ expect(roleDefinition.resolvedApiVersion).toBe("2022-04-01"); // Latest version
53
+ expect(roleDefinition.props).toBe(props);
54
+ // Name is a deterministic UUID based on roleName and assignableScopes
55
+ expect(roleDefinition.name).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/);
56
+ });
57
+ it("should create role definition with explicit version pinning", () => {
58
+ const props = {
59
+ name: "test-role-pinned",
60
+ apiVersion: "2022-04-01",
61
+ roleName: "Test Role Pinned",
62
+ permissions: [
63
+ {
64
+ actions: ["Microsoft.Storage/storageAccounts/read"],
65
+ },
66
+ ],
67
+ assignableScopes: [
68
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
69
+ ],
70
+ };
71
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "TestRole", props);
72
+ expect(roleDefinition.resolvedApiVersion).toBe("2022-04-01");
73
+ });
74
+ it("should create role definition with all optional properties", () => {
75
+ const props = {
76
+ name: "test-role-full",
77
+ roleName: "Test Role Full",
78
+ description: "A comprehensive test role for unit testing",
79
+ type: "CustomRole",
80
+ permissions: [
81
+ {
82
+ actions: [
83
+ "Microsoft.Compute/virtualMachines/read",
84
+ "Microsoft.Compute/virtualMachines/start/action",
85
+ ],
86
+ notActions: ["Microsoft.Compute/virtualMachines/delete"],
87
+ dataActions: [
88
+ "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read",
89
+ ],
90
+ notDataActions: [],
91
+ },
92
+ ],
93
+ assignableScopes: [
94
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
95
+ "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg",
96
+ ],
97
+ ignoreChanges: ["description"],
98
+ enableValidation: true,
99
+ enableMigrationAnalysis: true,
100
+ enableTransformation: true,
101
+ };
102
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "TestRole", props);
103
+ expect(roleDefinition.props.roleName).toBe("Test Role Full");
104
+ expect(roleDefinition.props.description).toBe("A comprehensive test role for unit testing");
105
+ expect(roleDefinition.props.type).toBe("CustomRole");
106
+ expect(roleDefinition.props.permissions).toBeDefined();
107
+ expect(roleDefinition.props.assignableScopes).toHaveLength(2);
108
+ });
109
+ it("should generate deterministic UUID name when name is not provided", () => {
110
+ const props = {
111
+ roleName: "Test Role",
112
+ permissions: [
113
+ {
114
+ actions: ["Microsoft.Resources/subscriptions/read"],
115
+ },
116
+ ],
117
+ assignableScopes: [
118
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
119
+ ],
120
+ };
121
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "TestRole", props);
122
+ // Name is a deterministic UUID, not the construct ID
123
+ expect(roleDefinition.name).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/);
124
+ });
125
+ it("should require roleName to be provided", () => {
126
+ const props = {
127
+ name: "test-role",
128
+ permissions: [
129
+ {
130
+ actions: ["Microsoft.Resources/subscriptions/read"],
131
+ },
132
+ ],
133
+ assignableScopes: [
134
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
135
+ ],
136
+ };
137
+ expect(() => {
138
+ new role_definition_1.RoleDefinition(stack, "TestRole", props);
139
+ }).toThrow("Required property 'roleName' is missing");
140
+ });
141
+ it("should require permissions to be provided", () => {
142
+ const props = {
143
+ name: "test-role",
144
+ roleName: "Test Role",
145
+ assignableScopes: [
146
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
147
+ ],
148
+ };
149
+ expect(() => {
150
+ new role_definition_1.RoleDefinition(stack, "TestRole", props);
151
+ }).toThrow("Required property 'permissions' is missing");
152
+ });
153
+ it("should require assignableScopes to be provided", () => {
154
+ const props = {
155
+ name: "test-role",
156
+ roleName: "Test Role",
157
+ permissions: [
158
+ {
159
+ actions: ["Microsoft.Resources/subscriptions/read"],
160
+ },
161
+ ],
162
+ };
163
+ expect(() => {
164
+ new role_definition_1.RoleDefinition(stack, "TestRole", props);
165
+ }).toThrow("Required property 'assignableScopes' is missing");
166
+ });
167
+ });
168
+ describe("Framework Integration", () => {
169
+ it("should resolve latest API version automatically", () => {
170
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "TestRole", {
171
+ name: "test-role",
172
+ roleName: "Test Role",
173
+ permissions: [
174
+ {
175
+ actions: ["Microsoft.Resources/subscriptions/read"],
176
+ },
177
+ ],
178
+ assignableScopes: [
179
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
180
+ ],
181
+ });
182
+ expect(roleDefinition.resolvedApiVersion).toBe("2022-04-01");
183
+ expect(roleDefinition.latestVersion()).toBe("2022-04-01");
184
+ });
185
+ it("should support all registered API versions", () => {
186
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "TestRole", {
187
+ name: "test-role",
188
+ roleName: "Test Role",
189
+ permissions: [
190
+ {
191
+ actions: ["Microsoft.Resources/subscriptions/read"],
192
+ },
193
+ ],
194
+ assignableScopes: [
195
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
196
+ ],
197
+ });
198
+ const supportedVersions = roleDefinition.supportedVersions();
199
+ expect(supportedVersions).toContain("2022-04-01");
200
+ });
201
+ it("should validate version support", () => {
202
+ // Valid version
203
+ expect(() => {
204
+ new role_definition_1.RoleDefinition(stack, "ValidVersion", {
205
+ name: "test-role",
206
+ roleName: "Test Role",
207
+ permissions: [
208
+ {
209
+ actions: ["Microsoft.Resources/subscriptions/read"],
210
+ },
211
+ ],
212
+ assignableScopes: [
213
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
214
+ ],
215
+ apiVersion: "2022-04-01",
216
+ });
217
+ }).not.toThrow();
218
+ // Invalid version
219
+ expect(() => {
220
+ new role_definition_1.RoleDefinition(stack, "InvalidVersion", {
221
+ name: "test-role",
222
+ roleName: "Test Role",
223
+ permissions: [
224
+ {
225
+ actions: ["Microsoft.Resources/subscriptions/read"],
226
+ },
227
+ ],
228
+ assignableScopes: [
229
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
230
+ ],
231
+ apiVersion: "2020-01-01",
232
+ });
233
+ }).toThrow("Unsupported API version '2020-01-01'");
234
+ });
235
+ it("should load correct schema for resolved version", () => {
236
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "TestRole", {
237
+ name: "test-role",
238
+ roleName: "Test Role",
239
+ permissions: [
240
+ {
241
+ actions: ["Microsoft.Resources/subscriptions/read"],
242
+ },
243
+ ],
244
+ assignableScopes: [
245
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
246
+ ],
247
+ apiVersion: "2022-04-01",
248
+ });
249
+ expect(roleDefinition.schema).toBeDefined();
250
+ expect(roleDefinition.schema.resourceType).toBe(role_definition_schemas_1.ROLE_DEFINITION_TYPE);
251
+ expect(roleDefinition.schema.version).toBe("2022-04-01");
252
+ expect(roleDefinition.schema.properties).toBeDefined();
253
+ });
254
+ it("should load version configuration correctly", () => {
255
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "TestRole", {
256
+ name: "test-role",
257
+ roleName: "Test Role",
258
+ permissions: [
259
+ {
260
+ actions: ["Microsoft.Resources/subscriptions/read"],
261
+ },
262
+ ],
263
+ assignableScopes: [
264
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
265
+ ],
266
+ });
267
+ expect(roleDefinition.versionConfig).toBeDefined();
268
+ expect(roleDefinition.versionConfig.version).toBe("2022-04-01");
269
+ expect(roleDefinition.versionConfig.supportLevel).toBe(version_interfaces_1.VersionSupportLevel.ACTIVE);
270
+ });
271
+ });
272
+ describe("Property Validation", () => {
273
+ it("should validate properties when validation is enabled", () => {
274
+ const props = {
275
+ name: "test-role",
276
+ roleName: "Test Role",
277
+ permissions: [
278
+ {
279
+ actions: ["Microsoft.Resources/subscriptions/read"],
280
+ },
281
+ ],
282
+ assignableScopes: [
283
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
284
+ ],
285
+ enableValidation: true,
286
+ };
287
+ expect(() => {
288
+ new role_definition_1.RoleDefinition(stack, "TestRole", props);
289
+ }).not.toThrow();
290
+ });
291
+ it("should have validation results for valid properties", () => {
292
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "TestRole", {
293
+ name: "valid-role",
294
+ roleName: "Valid Role",
295
+ description: "A valid role definition",
296
+ permissions: [
297
+ {
298
+ actions: ["Microsoft.Resources/subscriptions/read"],
299
+ },
300
+ ],
301
+ assignableScopes: [
302
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
303
+ ],
304
+ enableValidation: true,
305
+ });
306
+ expect(roleDefinition.validationResult).toBeDefined();
307
+ expect(roleDefinition.validationResult.valid).toBe(true);
308
+ expect(roleDefinition.validationResult.errors).toHaveLength(0);
309
+ });
310
+ it("should skip validation when disabled", () => {
311
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "TestRole", {
312
+ name: "test-role",
313
+ roleName: "Test Role",
314
+ permissions: [
315
+ {
316
+ actions: ["Microsoft.Resources/subscriptions/read"],
317
+ },
318
+ ],
319
+ assignableScopes: [
320
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
321
+ ],
322
+ enableValidation: false,
323
+ });
324
+ expect(roleDefinition).toBeDefined();
325
+ });
326
+ });
327
+ describe("Migration Analysis", () => {
328
+ it("should skip migration analysis for single version", () => {
329
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "TestRole", {
330
+ name: "test-role",
331
+ roleName: "Test Role",
332
+ permissions: [
333
+ {
334
+ actions: ["Microsoft.Resources/subscriptions/read"],
335
+ },
336
+ ],
337
+ assignableScopes: [
338
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
339
+ ],
340
+ apiVersion: "2022-04-01",
341
+ });
342
+ // Since there's only one version, migration analysis should be skipped
343
+ expect(roleDefinition).toBeDefined();
344
+ });
345
+ it("should skip migration analysis when disabled", () => {
346
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "TestRole", {
347
+ name: "test-role",
348
+ roleName: "Test Role",
349
+ permissions: [
350
+ {
351
+ actions: ["Microsoft.Resources/subscriptions/read"],
352
+ },
353
+ ],
354
+ assignableScopes: [
355
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
356
+ ],
357
+ enableMigrationAnalysis: false,
358
+ });
359
+ expect(roleDefinition.migrationAnalysis).toBeUndefined();
360
+ });
361
+ });
362
+ describe("Resource Creation and Body", () => {
363
+ it("should create correct resource body with minimal properties", () => {
364
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "TestRole", {
365
+ name: "test-role",
366
+ roleName: "Test Role",
367
+ permissions: [
368
+ {
369
+ actions: ["Microsoft.Resources/subscriptions/read"],
370
+ },
371
+ ],
372
+ assignableScopes: [
373
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
374
+ ],
375
+ });
376
+ expect(roleDefinition).toBeDefined();
377
+ expect(roleDefinition.props.roleName).toBeDefined();
378
+ expect(roleDefinition.props.permissions).toBeDefined();
379
+ expect(roleDefinition.props.assignableScopes).toBeDefined();
380
+ });
381
+ it("should create correct resource body with all properties", () => {
382
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "TestRole", {
383
+ name: "test-role",
384
+ roleName: "Test Role",
385
+ description: "A test role definition",
386
+ type: "CustomRole",
387
+ permissions: [
388
+ {
389
+ actions: ["Microsoft.Compute/virtualMachines/read"],
390
+ notActions: ["Microsoft.Compute/virtualMachines/delete"],
391
+ dataActions: [
392
+ "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read",
393
+ ],
394
+ notDataActions: [],
395
+ },
396
+ ],
397
+ assignableScopes: [
398
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
399
+ "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg",
400
+ ],
401
+ });
402
+ expect(roleDefinition).toBeDefined();
403
+ expect(roleDefinition.props.roleName).toBe("Test Role");
404
+ expect(roleDefinition.props.description).toBe("A test role definition");
405
+ expect(roleDefinition.props.type).toBe("CustomRole");
406
+ });
407
+ it("should create Terraform outputs", () => {
408
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "TestRole", {
409
+ name: "test-role-outputs",
410
+ roleName: "Test Role",
411
+ permissions: [
412
+ {
413
+ actions: ["Microsoft.Resources/subscriptions/read"],
414
+ },
415
+ ],
416
+ assignableScopes: [
417
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
418
+ ],
419
+ });
420
+ expect(roleDefinition.idOutput).toBeInstanceOf(cdktf.TerraformOutput);
421
+ expect(roleDefinition.nameOutput).toBeInstanceOf(cdktf.TerraformOutput);
422
+ });
423
+ });
424
+ describe("Permissions Configuration", () => {
425
+ it("should support control plane actions", () => {
426
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "ControlPlaneRole", {
427
+ name: "control-plane-role",
428
+ roleName: "Control Plane Role",
429
+ permissions: [
430
+ {
431
+ actions: [
432
+ "Microsoft.Compute/virtualMachines/read",
433
+ "Microsoft.Compute/virtualMachines/start/action",
434
+ "Microsoft.Compute/virtualMachines/restart/action",
435
+ ],
436
+ },
437
+ ],
438
+ assignableScopes: [
439
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
440
+ ],
441
+ });
442
+ expect(roleDefinition.props.permissions[0].actions).toHaveLength(3);
443
+ });
444
+ it("should support control plane notActions", () => {
445
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "NotActionsRole", {
446
+ name: "not-actions-role",
447
+ roleName: "Not Actions Role",
448
+ permissions: [
449
+ {
450
+ actions: ["Microsoft.Compute/virtualMachines/*"],
451
+ notActions: [
452
+ "Microsoft.Compute/virtualMachines/delete",
453
+ "Microsoft.Compute/virtualMachines/write",
454
+ ],
455
+ },
456
+ ],
457
+ assignableScopes: [
458
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
459
+ ],
460
+ });
461
+ expect(roleDefinition.props.permissions[0].notActions).toHaveLength(2);
462
+ });
463
+ it("should support data plane actions", () => {
464
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "DataPlaneRole", {
465
+ name: "data-plane-role",
466
+ roleName: "Data Plane Role",
467
+ permissions: [
468
+ {
469
+ actions: ["Microsoft.Storage/storageAccounts/read"],
470
+ dataActions: [
471
+ "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read",
472
+ "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/write",
473
+ ],
474
+ },
475
+ ],
476
+ assignableScopes: [
477
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
478
+ ],
479
+ });
480
+ expect(roleDefinition.props.permissions[0].dataActions).toHaveLength(2);
481
+ });
482
+ it("should support data plane notDataActions", () => {
483
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "NotDataActionsRole", {
484
+ name: "not-data-actions-role",
485
+ roleName: "Not Data Actions Role",
486
+ permissions: [
487
+ {
488
+ dataActions: [
489
+ "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/*",
490
+ ],
491
+ notDataActions: [
492
+ "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete",
493
+ ],
494
+ },
495
+ ],
496
+ assignableScopes: [
497
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
498
+ ],
499
+ });
500
+ expect(roleDefinition.props.permissions[0].notDataActions).toHaveLength(1);
501
+ });
502
+ it("should support complex permission combinations", () => {
503
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "ComplexPermissions", {
504
+ name: "complex-permissions",
505
+ roleName: "Complex Permissions Role",
506
+ permissions: [
507
+ {
508
+ actions: ["Microsoft.Compute/virtualMachines/*"],
509
+ notActions: ["Microsoft.Compute/virtualMachines/delete"],
510
+ dataActions: [
511
+ "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/*",
512
+ ],
513
+ notDataActions: [
514
+ "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete",
515
+ ],
516
+ },
517
+ ],
518
+ assignableScopes: [
519
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
520
+ ],
521
+ });
522
+ expect(roleDefinition.props.permissions[0].actions).toBeDefined();
523
+ expect(roleDefinition.props.permissions[0].notActions).toBeDefined();
524
+ expect(roleDefinition.props.permissions[0].dataActions).toBeDefined();
525
+ expect(roleDefinition.props.permissions[0].notDataActions).toBeDefined();
526
+ });
527
+ it("should support multiple permission objects", () => {
528
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "MultiplePermissions", {
529
+ name: "multiple-permissions",
530
+ roleName: "Multiple Permissions Role",
531
+ permissions: [
532
+ {
533
+ actions: ["Microsoft.Compute/virtualMachines/read"],
534
+ },
535
+ {
536
+ actions: ["Microsoft.Storage/storageAccounts/read"],
537
+ },
538
+ {
539
+ dataActions: [
540
+ "Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read",
541
+ ],
542
+ },
543
+ ],
544
+ assignableScopes: [
545
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
546
+ ],
547
+ });
548
+ expect(roleDefinition.props.permissions).toHaveLength(3);
549
+ });
550
+ });
551
+ describe("Assignable Scopes Configuration", () => {
552
+ it("should support subscription scope", () => {
553
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "SubscriptionScope", {
554
+ name: "subscription-role",
555
+ roleName: "Subscription Role",
556
+ permissions: [
557
+ {
558
+ actions: ["Microsoft.Resources/subscriptions/read"],
559
+ },
560
+ ],
561
+ assignableScopes: [
562
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
563
+ ],
564
+ });
565
+ expect(roleDefinition.props.assignableScopes[0]).toContain("/subscriptions/");
566
+ });
567
+ it("should support resource group scope", () => {
568
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "ResourceGroupScope", {
569
+ name: "rg-role",
570
+ roleName: "Resource Group Role",
571
+ permissions: [
572
+ {
573
+ actions: ["Microsoft.Resources/subscriptions/resourceGroups/read"],
574
+ },
575
+ ],
576
+ assignableScopes: [
577
+ "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg",
578
+ ],
579
+ });
580
+ expect(roleDefinition.props.assignableScopes[0]).toContain("/resourceGroups/");
581
+ });
582
+ it("should support management group scope", () => {
583
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "ManagementGroupScope", {
584
+ name: "mg-role",
585
+ roleName: "Management Group Role",
586
+ permissions: [
587
+ {
588
+ actions: ["Microsoft.Resources/subscriptions/read"],
589
+ },
590
+ ],
591
+ assignableScopes: [
592
+ "/providers/Microsoft.Management/managementGroups/test-mg",
593
+ ],
594
+ });
595
+ expect(roleDefinition.props.assignableScopes[0]).toContain("/managementGroups/");
596
+ });
597
+ it("should support multiple assignable scopes", () => {
598
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "MultipleScopes", {
599
+ name: "multiple-scopes-role",
600
+ roleName: "Multiple Scopes Role",
601
+ permissions: [
602
+ {
603
+ actions: ["Microsoft.Resources/subscriptions/read"],
604
+ },
605
+ ],
606
+ assignableScopes: [
607
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
608
+ "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg1",
609
+ "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg2",
610
+ ],
611
+ });
612
+ expect(roleDefinition.props.assignableScopes).toHaveLength(3);
613
+ });
614
+ });
615
+ describe("Role Types", () => {
616
+ it("should default to CustomRole type", () => {
617
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "DefaultType", {
618
+ name: "default-type-role",
619
+ roleName: "Default Type Role",
620
+ permissions: [
621
+ {
622
+ actions: ["Microsoft.Resources/subscriptions/read"],
623
+ },
624
+ ],
625
+ assignableScopes: [
626
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
627
+ ],
628
+ });
629
+ expect(roleDefinition.roleType).toBe("CustomRole");
630
+ });
631
+ it("should support explicit CustomRole type", () => {
632
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "CustomType", {
633
+ name: "custom-type-role",
634
+ roleName: "Custom Type Role",
635
+ type: "CustomRole",
636
+ permissions: [
637
+ {
638
+ actions: ["Microsoft.Resources/subscriptions/read"],
639
+ },
640
+ ],
641
+ assignableScopes: [
642
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
643
+ ],
644
+ });
645
+ expect(roleDefinition.roleType).toBe("CustomRole");
646
+ });
647
+ it("should support BuiltInRole type", () => {
648
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "BuiltInType", {
649
+ name: "builtin-type-role",
650
+ roleName: "Built-In Type Role",
651
+ type: "BuiltInRole",
652
+ permissions: [
653
+ {
654
+ actions: ["Microsoft.Resources/subscriptions/read"],
655
+ },
656
+ ],
657
+ assignableScopes: [
658
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
659
+ ],
660
+ });
661
+ expect(roleDefinition.roleType).toBe("BuiltInRole");
662
+ });
663
+ });
664
+ describe("Public Methods and Properties", () => {
665
+ let roleDefinition;
666
+ beforeEach(() => {
667
+ roleDefinition = new role_definition_1.RoleDefinition(stack, "TestRole", {
668
+ name: "test-role",
669
+ roleName: "Test Role",
670
+ description: "A test role",
671
+ permissions: [
672
+ {
673
+ actions: ["Microsoft.Compute/virtualMachines/read"],
674
+ },
675
+ ],
676
+ assignableScopes: [
677
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
678
+ ],
679
+ });
680
+ });
681
+ it("should have correct id format", () => {
682
+ expect(roleDefinition.id).toMatch(/^\$\{.*\.id\}$/);
683
+ });
684
+ it("should have resourceId property matching id", () => {
685
+ expect(roleDefinition.resourceId).toBe(roleDefinition.id);
686
+ });
687
+ it("should return correct roleName", () => {
688
+ expect(roleDefinition.roleName).toBe("Test Role");
689
+ });
690
+ it("should return correct roleType", () => {
691
+ expect(roleDefinition.roleType).toBe("CustomRole");
692
+ });
693
+ });
694
+ describe("Ignore Changes Configuration", () => {
695
+ it("should apply ignore changes lifecycle rules", () => {
696
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "IgnoreChanges", {
697
+ name: "ignore-changes-role",
698
+ roleName: "Ignore Changes Role",
699
+ permissions: [
700
+ {
701
+ actions: ["Microsoft.Resources/subscriptions/read"],
702
+ },
703
+ ],
704
+ assignableScopes: [
705
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
706
+ ],
707
+ ignoreChanges: ["description"],
708
+ });
709
+ expect(roleDefinition).toBeInstanceOf(role_definition_1.RoleDefinition);
710
+ });
711
+ it("should handle empty ignore changes array", () => {
712
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "EmptyIgnore", {
713
+ name: "empty-ignore-role",
714
+ roleName: "Empty Ignore Role",
715
+ permissions: [
716
+ {
717
+ actions: ["Microsoft.Resources/subscriptions/read"],
718
+ },
719
+ ],
720
+ assignableScopes: [
721
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
722
+ ],
723
+ ignoreChanges: [],
724
+ });
725
+ expect(roleDefinition).toBeInstanceOf(role_definition_1.RoleDefinition);
726
+ });
727
+ });
728
+ describe("Error Handling", () => {
729
+ it("should handle invalid API versions gracefully", () => {
730
+ expect(() => {
731
+ new role_definition_1.RoleDefinition(stack, "InvalidAPI", {
732
+ name: "invalid-api-role",
733
+ roleName: "Invalid API Role",
734
+ permissions: [
735
+ {
736
+ actions: ["Microsoft.Resources/subscriptions/read"],
737
+ },
738
+ ],
739
+ assignableScopes: [
740
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
741
+ ],
742
+ apiVersion: "invalid-version",
743
+ });
744
+ }).toThrow("Unsupported API version 'invalid-version'");
745
+ });
746
+ it("should validate properties when validation is enabled", () => {
747
+ // Role definitions generate deterministic UUIDs for names, so name validation
748
+ // doesn't apply the same way. Test that valid role definitions pass validation.
749
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "ValidationTest", {
750
+ name: "test-role", // This is ignored in favor of generated UUID
751
+ roleName: "Test Role",
752
+ permissions: [
753
+ {
754
+ actions: ["Microsoft.Resources/subscriptions/read"],
755
+ },
756
+ ],
757
+ assignableScopes: [
758
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
759
+ ],
760
+ enableValidation: true,
761
+ });
762
+ expect(roleDefinition.validationResult).toBeDefined();
763
+ expect(roleDefinition.validationResult.valid).toBe(true);
764
+ });
765
+ it("should handle schema registration errors gracefully", () => {
766
+ expect(() => {
767
+ new role_definition_1.RoleDefinition(stack, "SchemaTest", {
768
+ name: "schema-test-role",
769
+ roleName: "Schema Test Role",
770
+ permissions: [
771
+ {
772
+ actions: ["Microsoft.Resources/subscriptions/read"],
773
+ },
774
+ ],
775
+ assignableScopes: [
776
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
777
+ ],
778
+ });
779
+ }).not.toThrow();
780
+ });
781
+ });
782
+ describe("JSII Compliance", () => {
783
+ it("should have JSII-compliant constructor", () => {
784
+ expect(() => {
785
+ new role_definition_1.RoleDefinition(stack, "JsiiTest", {
786
+ name: "jsii-test",
787
+ roleName: "JSII Test Role",
788
+ permissions: [
789
+ {
790
+ actions: ["Microsoft.Resources/subscriptions/read"],
791
+ },
792
+ ],
793
+ assignableScopes: [
794
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
795
+ ],
796
+ });
797
+ }).not.toThrow();
798
+ });
799
+ it("should have JSII-compliant properties", () => {
800
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "JsiiProps", {
801
+ name: "jsii-props",
802
+ roleName: "JSII Props Role",
803
+ permissions: [
804
+ {
805
+ actions: ["Microsoft.Resources/subscriptions/read"],
806
+ },
807
+ ],
808
+ assignableScopes: [
809
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
810
+ ],
811
+ });
812
+ expect(typeof roleDefinition.id).toBe("string");
813
+ expect(typeof roleDefinition.name).toBe("string");
814
+ expect(typeof roleDefinition.resolvedApiVersion).toBe("string");
815
+ expect(typeof roleDefinition.roleName).toBe("string");
816
+ expect(typeof roleDefinition.roleType).toBe("string");
817
+ });
818
+ it("should have JSII-compliant methods", () => {
819
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "JsiiMethods", {
820
+ name: "jsii-methods",
821
+ roleName: "JSII Methods Role",
822
+ permissions: [
823
+ {
824
+ actions: ["Microsoft.Resources/subscriptions/read"],
825
+ },
826
+ ],
827
+ assignableScopes: [
828
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
829
+ ],
830
+ });
831
+ expect(typeof roleDefinition.latestVersion).toBe("function");
832
+ expect(typeof roleDefinition.supportedVersions).toBe("function");
833
+ });
834
+ it("should serialize complex objects correctly", () => {
835
+ const roleDefinition = new role_definition_1.RoleDefinition(stack, "JsiiSerialization", {
836
+ name: "jsii-serialization",
837
+ roleName: "JSII Serialization Role",
838
+ permissions: [
839
+ {
840
+ actions: ["Microsoft.Compute/virtualMachines/read"],
841
+ notActions: ["Microsoft.Compute/virtualMachines/delete"],
842
+ },
843
+ ],
844
+ assignableScopes: [
845
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
846
+ ],
847
+ });
848
+ expect(() => JSON.stringify(roleDefinition.validationResult)).not.toThrow();
849
+ expect(() => JSON.stringify(roleDefinition.schema)).not.toThrow();
850
+ expect(() => JSON.stringify(roleDefinition.versionConfig)).not.toThrow();
851
+ });
852
+ });
853
+ describe("CDK Terraform Integration", () => {
854
+ it("should synthesize to valid Terraform configuration", () => {
855
+ new role_definition_1.RoleDefinition(stack, "SynthTest", {
856
+ name: "synth-test",
857
+ roleName: "Synth Test Role",
858
+ permissions: [
859
+ {
860
+ actions: ["Microsoft.Resources/subscriptions/read"],
861
+ },
862
+ ],
863
+ assignableScopes: [
864
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
865
+ ],
866
+ });
867
+ const synthesized = cdktf_1.Testing.synth(stack);
868
+ expect(synthesized).toBeDefined();
869
+ const stackConfig = JSON.parse(synthesized);
870
+ expect(stackConfig.resource).toBeDefined();
871
+ });
872
+ it("should work in complex CDK constructs", () => {
873
+ class ComplexConstruct extends cdktf.TerraformStack {
874
+ constructor(scope, id) {
875
+ super(scope, id);
876
+ const role1 = new role_definition_1.RoleDefinition(this, "Role1", {
877
+ name: "role-1",
878
+ roleName: "First Role",
879
+ permissions: [
880
+ {
881
+ actions: ["Microsoft.Compute/virtualMachines/read"],
882
+ },
883
+ ],
884
+ assignableScopes: [
885
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
886
+ ],
887
+ });
888
+ const role2 = new role_definition_1.RoleDefinition(this, "Role2", {
889
+ name: "role-2",
890
+ roleName: "Second Role",
891
+ permissions: [
892
+ {
893
+ actions: ["Microsoft.Storage/storageAccounts/read"],
894
+ },
895
+ ],
896
+ assignableScopes: [
897
+ "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg",
898
+ ],
899
+ apiVersion: "2022-04-01",
900
+ });
901
+ new cdktf.TerraformOutput(this, "Role1Id", {
902
+ value: role1.id,
903
+ });
904
+ new cdktf.TerraformOutput(this, "Role2Id", {
905
+ value: role2.id,
906
+ });
907
+ }
908
+ }
909
+ expect(() => {
910
+ new ComplexConstruct(app, "ComplexStack");
911
+ }).not.toThrow();
912
+ });
913
+ it("should handle multiple role definitions in the same stack", () => {
914
+ const role1 = new role_definition_1.RoleDefinition(stack, "Role1", {
915
+ name: "role-1",
916
+ roleName: "First Role",
917
+ permissions: [
918
+ {
919
+ actions: ["Microsoft.Compute/virtualMachines/read"],
920
+ },
921
+ ],
922
+ assignableScopes: [
923
+ "/subscriptions/00000000-0000-0000-0000-000000000000",
924
+ ],
925
+ });
926
+ const role2 = new role_definition_1.RoleDefinition(stack, "Role2", {
927
+ name: "role-2",
928
+ roleName: "Second Role",
929
+ permissions: [
930
+ {
931
+ actions: ["Microsoft.Storage/storageAccounts/read"],
932
+ },
933
+ ],
934
+ assignableScopes: [
935
+ "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/test-rg",
936
+ ],
937
+ apiVersion: "2022-04-01",
938
+ });
939
+ expect(role1.resolvedApiVersion).toBe("2022-04-01");
940
+ expect(role2.resolvedApiVersion).toBe("2022-04-01");
941
+ const synthesized = cdktf_1.Testing.synth(stack);
942
+ expect(synthesized).toBeDefined();
943
+ });
944
+ });
945
+ });
946
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1kZWZpbml0aW9uLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXp1cmUtcm9sZWRlZmluaXRpb24vdGVzdC9yb2xlLWRlZmluaXRpb24uc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7R0FPRzs7QUFFSCxpQ0FBZ0M7QUFDaEMsK0JBQStCO0FBQy9CLGtHQUE2RjtBQUM3RiwyR0FBeUc7QUFDekcsNERBQTZFO0FBQzdFLDRFQUd3QztBQUV4QyxRQUFRLENBQUMseUNBQXlDLEVBQUUsR0FBRyxFQUFFO0lBQ3ZELElBQUksR0FBYyxDQUFDO0lBQ25CLElBQUksS0FBMkIsQ0FBQztJQUNoQyxJQUFJLE9BQTBCLENBQUM7SUFFL0IsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLEdBQUcsR0FBRyxlQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDcEIsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbkQsT0FBTyxHQUFHLHVDQUFpQixDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRXZDLGdEQUFnRDtRQUNoRCxJQUFJLENBQUM7WUFDSCxPQUFPLENBQUMsb0JBQW9CLENBQzFCLDhDQUFvQixFQUNwQixzREFBNEIsQ0FDN0IsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsK0JBQStCO1FBQ2pDLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7UUFDaEQsRUFBRSxDQUFDLHdFQUF3RSxFQUFFLEdBQUcsRUFBRTtZQUNoRixNQUFNLEtBQUssR0FBd0I7Z0JBQ2pDLElBQUksRUFBRSxXQUFXO2dCQUNqQixRQUFRLEVBQUUsV0FBVztnQkFDckIsV0FBVyxFQUFFO29CQUNYO3dCQUNFLE9BQU8sRUFBRSxDQUFDLHdDQUF3QyxDQUFDO3dC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QixDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFcEQsTUFBTSxXQUFXLEdBQUcsZUFBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb21wcmVoZW5zaXZlIHRlc3RzIGZvciB0aGUgdW5pZmllZCBSb2xlRGVmaW5pdGlvbiBpbXBsZW1lbnRhdGlvblxuICpcbiAqIFRoaXMgdGVzdCBzdWl0ZSB2YWxpZGF0ZXMgdGhlIHVuaWZpZWQgUm9sZURlZmluaXRpb24gY2xhc3MgdGhhdCB1c2VzXG4gKiB0aGUgVmVyc2lvbmVkQXphcGlSZXNvdXJjZSBmcmFtZXdvcmsuIFRlc3RzIGNvdmVyIGF1dG9tYXRpYyB2ZXJzaW9uIHJlc29sdXRpb24sXG4gKiBleHBsaWNpdCB2ZXJzaW9uIHBpbm5pbmcsIHNjaGVtYSB2YWxpZGF0aW9uLCBwcm9wZXJ0eSB0cmFuc2Zvcm1hdGlvbiwgYW5kXG4gKiByb2xlIGRlZmluaXRpb24tc3BlY2lmaWMgZnVuY3Rpb25hbGl0eS5cbiAqL1xuXG5pbXBvcnQgeyBUZXN0aW5nIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgKiBhcyBjZGt0ZiBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IEFwaVZlcnNpb25NYW5hZ2VyIH0gZnJvbSBcIi4uLy4uL2NvcmUtYXp1cmUvbGliL3ZlcnNpb24tbWFuYWdlci9hcGktdmVyc2lvbi1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBWZXJzaW9uU3VwcG9ydExldmVsIH0gZnJvbSBcIi4uLy4uL2NvcmUtYXp1cmUvbGliL3ZlcnNpb24tbWFuYWdlci9pbnRlcmZhY2VzL3ZlcnNpb24taW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgUm9sZURlZmluaXRpb24sIFJvbGVEZWZpbml0aW9uUHJvcHMgfSBmcm9tIFwiLi4vbGliL3JvbGUtZGVmaW5pdGlvblwiO1xuaW1wb3J0IHtcbiAgQUxMX1JPTEVfREVGSU5JVElPTl9WRVJTSU9OUyxcbiAgUk9MRV9ERUZJTklUSU9OX1RZUEUsXG59IGZyb20gXCIuLi9saWIvcm9sZS1kZWZpbml0aW9uLXNjaGVtYXNcIjtcblxuZGVzY3JpYmUoXCJSb2xlRGVmaW5pdGlvbiAtIFVuaWZpZWQgSW1wbGVtZW50YXRpb25cIiwgKCkgPT4ge1xuICBsZXQgYXBwOiBjZGt0Zi5BcHA7XG4gIGxldCBzdGFjazogY2RrdGYuVGVycmFmb3JtU3RhY2s7XG4gIGxldCBtYW5hZ2VyOiBBcGlWZXJzaW9uTWFuYWdlcjtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBhcHAgPSBUZXN0aW5nLmFwcCgpO1xuICAgIHN0YWNrID0gbmV3IGNka3RmLlRlcnJhZm9ybVN0YWNrKGFwcCwgXCJUZXN0U3RhY2tcIik7XG4gICAgbWFuYWdlciA9IEFwaVZlcnNpb25NYW5hZ2VyLmluc3RhbmNlKCk7XG5cbiAgICAvLyBFbnN1cmUgUm9sZSBEZWZpbml0aW9uIHNjaGVtYXMgYXJlIHJlZ2lzdGVyZWRcbiAgICB0cnkge1xuICAgICAgbWFuYWdlci5yZWdpc3RlclJlc291cmNlVHlwZShcbiAgICAgICAgUk9MRV9ERUZJTklUSU9OX1RZUEUsXG4gICAgICAgIEFMTF9ST0xFX0RFRklOSVRJT05fVkVSU0lPTlMsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZ25vcmUgaWYgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAgfVxuICB9KTtcblxuICBkZXNjcmliZShcIkNvbnN0cnVjdG9yIGFuZCBCYXNpYyBQcm9wZXJ0aWVzXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBjcmVhdGUgcm9sZSBkZWZpbml0aW9uIHdpdGggYXV0b21hdGljIGxhdGVzdCB2ZXJzaW9uIHJlc29sdXRpb25cIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHM6IFJvbGVEZWZpbml0aW9uUHJvcHMgPSB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yb2xlXCIsXG4gICAgICAgIHJvbGVOYW1lOiBcIlRlc3QgUm9sZVwiLFxuICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcIk1pY3Jvc29mdC5Db21wdXRlL3ZpcnR1YWxNYWNoaW5lcy9yZWFkXCJdLFxuICAgICAgICAgICAgbm90QWN0aW9uczogW10sXG4gICAgICAgICAgICBkYXRhQWN0aW9uczogW10sXG4gICAgICAgICAgICBub3REYXRhQWN0aW9uczogW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByb2xlRGVmaW5pdGlvbiA9IG5ldyBSb2xlRGVmaW5pdGlvbihzdGFjaywgXCJUZXN0Um9sZVwiLCBwcm9wcyk7XG5cbiAgICAgIGV4cGVjdChyb2xlRGVmaW5pdGlvbikudG9CZUluc3RhbmNlT2YoUm9sZURlZmluaXRpb24pO1xuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLnJlc29sdmVkQXBpVmVyc2lvbikudG9CZShcIjIwMjItMDQtMDFcIik7IC8vIExhdGVzdCB2ZXJzaW9uXG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24ucHJvcHMpLnRvQmUocHJvcHMpO1xuICAgICAgLy8gTmFtZSBpcyBhIGRldGVybWluaXN0aWMgVVVJRCBiYXNlZCBvbiByb2xlTmFtZSBhbmQgYXNzaWduYWJsZVNjb3Blc1xuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLm5hbWUpLnRvTWF0Y2goXG4gICAgICAgIC9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17NH0tWzAtOWEtZl17MTJ9JC8sXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgY3JlYXRlIHJvbGUgZGVmaW5pdGlvbiB3aXRoIGV4cGxpY2l0IHZlcnNpb24gcGlubmluZ1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wczogUm9sZURlZmluaXRpb25Qcm9wcyA9IHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXJvbGUtcGlubmVkXCIsXG4gICAgICAgIGFwaVZlcnNpb246IFwiMjAyMi0wNC0wMVwiLFxuICAgICAgICByb2xlTmFtZTogXCJUZXN0IFJvbGUgUGlubmVkXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlN0b3JhZ2Uvc3RvcmFnZUFjY291bnRzL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByb2xlRGVmaW5pdGlvbiA9IG5ldyBSb2xlRGVmaW5pdGlvbihzdGFjaywgXCJUZXN0Um9sZVwiLCBwcm9wcyk7XG5cbiAgICAgIGV4cGVjdChyb2xlRGVmaW5pdGlvbi5yZXNvbHZlZEFwaVZlcnNpb24pLnRvQmUoXCIyMDIyLTA0LTAxXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgY3JlYXRlIHJvbGUgZGVmaW5pdGlvbiB3aXRoIGFsbCBvcHRpb25hbCBwcm9wZXJ0aWVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzOiBSb2xlRGVmaW5pdGlvblByb3BzID0ge1xuICAgICAgICBuYW1lOiBcInRlc3Qtcm9sZS1mdWxsXCIsXG4gICAgICAgIHJvbGVOYW1lOiBcIlRlc3QgUm9sZSBGdWxsXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkEgY29tcHJlaGVuc2l2ZSB0ZXN0IHJvbGUgZm9yIHVuaXQgdGVzdGluZ1wiLFxuICAgICAgICB0eXBlOiBcIkN1c3RvbVJvbGVcIixcbiAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgIFwiTWljcm9zb2Z0LkNvbXB1dGUvdmlydHVhbE1hY2hpbmVzL3JlYWRcIixcbiAgICAgICAgICAgICAgXCJNaWNyb3NvZnQuQ29tcHV0ZS92aXJ0dWFsTWFjaGluZXMvc3RhcnQvYWN0aW9uXCIsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbm90QWN0aW9uczogW1wiTWljcm9zb2Z0LkNvbXB1dGUvdmlydHVhbE1hY2hpbmVzL2RlbGV0ZVwiXSxcbiAgICAgICAgICAgIGRhdGFBY3Rpb25zOiBbXG4gICAgICAgICAgICAgIFwiTWljcm9zb2Z0LlN0b3JhZ2Uvc3RvcmFnZUFjY291bnRzL2Jsb2JTZXJ2aWNlcy9jb250YWluZXJzL2Jsb2JzL3JlYWRcIixcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBub3REYXRhQWN0aW9uczogW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgICAgXCIvc3Vic2NyaXB0aW9ucy8wMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAvcmVzb3VyY2VHcm91cHMvdGVzdC1yZ1wiLFxuICAgICAgICBdLFxuICAgICAgICBpZ25vcmVDaGFuZ2VzOiBbXCJkZXNjcmlwdGlvblwiXSxcbiAgICAgICAgZW5hYmxlVmFsaWRhdGlvbjogdHJ1ZSxcbiAgICAgICAgZW5hYmxlTWlncmF0aW9uQW5hbHlzaXM6IHRydWUsXG4gICAgICAgIGVuYWJsZVRyYW5zZm9ybWF0aW9uOiB0cnVlLFxuICAgICAgfTtcblxuICAgICAgY29uc3Qgcm9sZURlZmluaXRpb24gPSBuZXcgUm9sZURlZmluaXRpb24oc3RhY2ssIFwiVGVzdFJvbGVcIiwgcHJvcHMpO1xuXG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24ucHJvcHMucm9sZU5hbWUpLnRvQmUoXCJUZXN0IFJvbGUgRnVsbFwiKTtcbiAgICAgIGV4cGVjdChyb2xlRGVmaW5pdGlvbi5wcm9wcy5kZXNjcmlwdGlvbikudG9CZShcbiAgICAgICAgXCJBIGNvbXByZWhlbnNpdmUgdGVzdCByb2xlIGZvciB1bml0IHRlc3RpbmdcIixcbiAgICAgICk7XG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24ucHJvcHMudHlwZSkudG9CZShcIkN1c3RvbVJvbGVcIik7XG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24ucHJvcHMucGVybWlzc2lvbnMpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24ucHJvcHMuYXNzaWduYWJsZVNjb3BlcykudG9IYXZlTGVuZ3RoKDIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgZ2VuZXJhdGUgZGV0ZXJtaW5pc3RpYyBVVUlEIG5hbWUgd2hlbiBuYW1lIGlzIG5vdCBwcm92aWRlZFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wczogUm9sZURlZmluaXRpb25Qcm9wcyA9IHtcbiAgICAgICAgcm9sZU5hbWU6IFwiVGVzdCBSb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlJlc291cmNlcy9zdWJzY3JpcHRpb25zL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByb2xlRGVmaW5pdGlvbiA9IG5ldyBSb2xlRGVmaW5pdGlvbihzdGFjaywgXCJUZXN0Um9sZVwiLCBwcm9wcyk7XG5cbiAgICAgIC8vIE5hbWUgaXMgYSBkZXRlcm1pbmlzdGljIFVVSUQsIG5vdCB0aGUgY29uc3RydWN0IElEXG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24ubmFtZSkudG9NYXRjaChcbiAgICAgICAgL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXs0fS1bMC05YS1mXXsxMn0kLyxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCByZXF1aXJlIHJvbGVOYW1lIHRvIGJlIHByb3ZpZGVkXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzOiBhbnkgPSB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlJlc291cmNlcy9zdWJzY3JpcHRpb25zL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBuZXcgUm9sZURlZmluaXRpb24oc3RhY2ssIFwiVGVzdFJvbGVcIiwgcHJvcHMpO1xuICAgICAgfSkudG9UaHJvdyhcIlJlcXVpcmVkIHByb3BlcnR5ICdyb2xlTmFtZScgaXMgbWlzc2luZ1wiKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIHJlcXVpcmUgcGVybWlzc2lvbnMgdG8gYmUgcHJvdmlkZWRcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHM6IGFueSA9IHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXJvbGVcIixcbiAgICAgICAgcm9sZU5hbWU6IFwiVGVzdCBSb2xlXCIsXG4gICAgICAgIGFzc2lnbmFibGVTY29wZXM6IFtcbiAgICAgICAgICBcIi9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBdLFxuICAgICAgfTtcblxuICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgbmV3IFJvbGVEZWZpbml0aW9uKHN0YWNrLCBcIlRlc3RSb2xlXCIsIHByb3BzKTtcbiAgICAgIH0pLnRvVGhyb3coXCJSZXF1aXJlZCBwcm9wZXJ0eSAncGVybWlzc2lvbnMnIGlzIG1pc3NpbmdcIik7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCByZXF1aXJlIGFzc2lnbmFibGVTY29wZXMgdG8gYmUgcHJvdmlkZWRcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHM6IGFueSA9IHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXJvbGVcIixcbiAgICAgICAgcm9sZU5hbWU6IFwiVGVzdCBSb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlJlc291cmNlcy9zdWJzY3JpcHRpb25zL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG5cbiAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgIG5ldyBSb2xlRGVmaW5pdGlvbihzdGFjaywgXCJUZXN0Um9sZVwiLCBwcm9wcyk7XG4gICAgICB9KS50b1Rocm93KFwiUmVxdWlyZWQgcHJvcGVydHkgJ2Fzc2lnbmFibGVTY29wZXMnIGlzIG1pc3NpbmdcIik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiRnJhbWV3b3JrIEludGVncmF0aW9uXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCByZXNvbHZlIGxhdGVzdCBBUEkgdmVyc2lvbiBhdXRvbWF0aWNhbGx5XCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHJvbGVEZWZpbml0aW9uID0gbmV3IFJvbGVEZWZpbml0aW9uKHN0YWNrLCBcIlRlc3RSb2xlXCIsIHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXJvbGVcIixcbiAgICAgICAgcm9sZU5hbWU6IFwiVGVzdCBSb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlJlc291cmNlcy9zdWJzY3JpcHRpb25zL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLnJlc29sdmVkQXBpVmVyc2lvbikudG9CZShcIjIwMjItMDQtMDFcIik7XG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24ubGF0ZXN0VmVyc2lvbigpKS50b0JlKFwiMjAyMi0wNC0wMVwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIHN1cHBvcnQgYWxsIHJlZ2lzdGVyZWQgQVBJIHZlcnNpb25zXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHJvbGVEZWZpbml0aW9uID0gbmV3IFJvbGVEZWZpbml0aW9uKHN0YWNrLCBcIlRlc3RSb2xlXCIsIHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXJvbGVcIixcbiAgICAgICAgcm9sZU5hbWU6IFwiVGVzdCBSb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlJlc291cmNlcy9zdWJzY3JpcHRpb25zL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc3VwcG9ydGVkVmVyc2lvbnMgPSByb2xlRGVmaW5pdGlvbi5zdXBwb3J0ZWRWZXJzaW9ucygpO1xuICAgICAgZXhwZWN0KHN1cHBvcnRlZFZlcnNpb25zKS50b0NvbnRhaW4oXCIyMDIyLTA0LTAxXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgdmFsaWRhdGUgdmVyc2lvbiBzdXBwb3J0XCIsICgpID0+IHtcbiAgICAgIC8vIFZhbGlkIHZlcnNpb25cbiAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgIG5ldyBSb2xlRGVmaW5pdGlvbihzdGFjaywgXCJWYWxpZFZlcnNpb25cIiwge1xuICAgICAgICAgIG5hbWU6IFwidGVzdC1yb2xlXCIsXG4gICAgICAgICAgcm9sZU5hbWU6IFwiVGVzdCBSb2xlXCIsXG4gICAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlJlc291cmNlcy9zdWJzY3JpcHRpb25zL3JlYWRcIl0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgICAgXCIvc3Vic2NyaXB0aW9ucy8wMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIixcbiAgICAgICAgICBdLFxuICAgICAgICAgIGFwaVZlcnNpb246IFwiMjAyMi0wNC0wMVwiLFxuICAgICAgICB9KTtcbiAgICAgIH0pLm5vdC50b1Rocm93KCk7XG5cbiAgICAgIC8vIEludmFsaWQgdmVyc2lvblxuICAgICAgZXhwZWN0KCgpID0+IHtcbiAgICAgICAgbmV3IFJvbGVEZWZpbml0aW9uKHN0YWNrLCBcIkludmFsaWRWZXJzaW9uXCIsIHtcbiAgICAgICAgICBuYW1lOiBcInRlc3Qtcm9sZVwiLFxuICAgICAgICAgIHJvbGVOYW1lOiBcIlRlc3QgUm9sZVwiLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcIk1pY3Jvc29mdC5SZXNvdXJjZXMvc3Vic2NyaXB0aW9ucy9yZWFkXCJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGFzc2lnbmFibGVTY29wZXM6IFtcbiAgICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhcGlWZXJzaW9uOiBcIjIwMjAtMDEtMDFcIixcbiAgICAgICAgfSk7XG4gICAgICB9KS50b1Rocm93KFwiVW5zdXBwb3J0ZWQgQVBJIHZlcnNpb24gJzIwMjAtMDEtMDEnXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgbG9hZCBjb3JyZWN0IHNjaGVtYSBmb3IgcmVzb2x2ZWQgdmVyc2lvblwiLCAoKSA9PiB7XG4gICAgICBjb25zdCByb2xlRGVmaW5pdGlvbiA9IG5ldyBSb2xlRGVmaW5pdGlvbihzdGFjaywgXCJUZXN0Um9sZVwiLCB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yb2xlXCIsXG4gICAgICAgIHJvbGVOYW1lOiBcIlRlc3QgUm9sZVwiLFxuICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcIk1pY3Jvc29mdC5SZXNvdXJjZXMvc3Vic2NyaXB0aW9ucy9yZWFkXCJdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGFzc2lnbmFibGVTY29wZXM6IFtcbiAgICAgICAgICBcIi9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBdLFxuICAgICAgICBhcGlWZXJzaW9uOiBcIjIwMjItMDQtMDFcIixcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24uc2NoZW1hKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLnNjaGVtYS5yZXNvdXJjZVR5cGUpLnRvQmUoUk9MRV9ERUZJTklUSU9OX1RZUEUpO1xuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLnNjaGVtYS52ZXJzaW9uKS50b0JlKFwiMjAyMi0wNC0wMVwiKTtcbiAgICAgIGV4cGVjdChyb2xlRGVmaW5pdGlvbi5zY2hlbWEucHJvcGVydGllcykudG9CZURlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGxvYWQgdmVyc2lvbiBjb25maWd1cmF0aW9uIGNvcnJlY3RseVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCByb2xlRGVmaW5pdGlvbiA9IG5ldyBSb2xlRGVmaW5pdGlvbihzdGFjaywgXCJUZXN0Um9sZVwiLCB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yb2xlXCIsXG4gICAgICAgIHJvbGVOYW1lOiBcIlRlc3QgUm9sZVwiLFxuICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcIk1pY3Jvc29mdC5SZXNvdXJjZXMvc3Vic2NyaXB0aW9ucy9yZWFkXCJdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGFzc2lnbmFibGVTY29wZXM6IFtcbiAgICAgICAgICBcIi9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChyb2xlRGVmaW5pdGlvbi52ZXJzaW9uQ29uZmlnKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLnZlcnNpb25Db25maWcudmVyc2lvbikudG9CZShcIjIwMjItMDQtMDFcIik7XG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24udmVyc2lvbkNvbmZpZy5zdXBwb3J0TGV2ZWwpLnRvQmUoXG4gICAgICAgIFZlcnNpb25TdXBwb3J0TGV2ZWwuQUNUSVZFLFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJQcm9wZXJ0eSBWYWxpZGF0aW9uXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCB2YWxpZGF0ZSBwcm9wZXJ0aWVzIHdoZW4gdmFsaWRhdGlvbiBpcyBlbmFibGVkXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzOiBSb2xlRGVmaW5pdGlvblByb3BzID0ge1xuICAgICAgICBuYW1lOiBcInRlc3Qtcm9sZVwiLFxuICAgICAgICByb2xlTmFtZTogXCJUZXN0IFJvbGVcIixcbiAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXCJNaWNyb3NvZnQuUmVzb3VyY2VzL3N1YnNjcmlwdGlvbnMvcmVhZFwiXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBhc3NpZ25hYmxlU2NvcGVzOiBbXG4gICAgICAgICAgXCIvc3Vic2NyaXB0aW9ucy8wMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIixcbiAgICAgICAgXSxcbiAgICAgICAgZW5hYmxlVmFsaWRhdGlvbjogdHJ1ZSxcbiAgICAgIH07XG5cbiAgICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICAgIG5ldyBSb2xlRGVmaW5pdGlvbihzdGFjaywgXCJUZXN0Um9sZVwiLCBwcm9wcyk7XG4gICAgICB9KS5ub3QudG9UaHJvdygpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgaGF2ZSB2YWxpZGF0aW9uIHJlc3VsdHMgZm9yIHZhbGlkIHByb3BlcnRpZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9sZURlZmluaXRpb24gPSBuZXcgUm9sZURlZmluaXRpb24oc3RhY2ssIFwiVGVzdFJvbGVcIiwge1xuICAgICAgICBuYW1lOiBcInZhbGlkLXJvbGVcIixcbiAgICAgICAgcm9sZU5hbWU6IFwiVmFsaWQgUm9sZVwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJBIHZhbGlkIHJvbGUgZGVmaW5pdGlvblwiLFxuICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcIk1pY3Jvc29mdC5SZXNvdXJjZXMvc3Vic2NyaXB0aW9ucy9yZWFkXCJdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGFzc2lnbmFibGVTY29wZXM6IFtcbiAgICAgICAgICBcIi9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBdLFxuICAgICAgICBlbmFibGVWYWxpZGF0aW9uOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChyb2xlRGVmaW5pdGlvbi52YWxpZGF0aW9uUmVzdWx0KS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLnZhbGlkYXRpb25SZXN1bHQhLnZhbGlkKS50b0JlKHRydWUpO1xuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLnZhbGlkYXRpb25SZXN1bHQhLmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgc2tpcCB2YWxpZGF0aW9uIHdoZW4gZGlzYWJsZWRcIiwgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9sZURlZmluaXRpb24gPSBuZXcgUm9sZURlZmluaXRpb24oc3RhY2ssIFwiVGVzdFJvbGVcIiwge1xuICAgICAgICBuYW1lOiBcInRlc3Qtcm9sZVwiLFxuICAgICAgICByb2xlTmFtZTogXCJUZXN0IFJvbGVcIixcbiAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXCJNaWNyb3NvZnQuUmVzb3VyY2VzL3N1YnNjcmlwdGlvbnMvcmVhZFwiXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBhc3NpZ25hYmxlU2NvcGVzOiBbXG4gICAgICAgICAgXCIvc3Vic2NyaXB0aW9ucy8wMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIixcbiAgICAgICAgXSxcbiAgICAgICAgZW5hYmxlVmFsaWRhdGlvbjogZmFsc2UsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIk1pZ3JhdGlvbiBBbmFseXNpc1wiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgc2tpcCBtaWdyYXRpb24gYW5hbHlzaXMgZm9yIHNpbmdsZSB2ZXJzaW9uXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHJvbGVEZWZpbml0aW9uID0gbmV3IFJvbGVEZWZpbml0aW9uKHN0YWNrLCBcIlRlc3RSb2xlXCIsIHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXJvbGVcIixcbiAgICAgICAgcm9sZU5hbWU6IFwiVGVzdCBSb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlJlc291cmNlcy9zdWJzY3JpcHRpb25zL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGFwaVZlcnNpb246IFwiMjAyMi0wNC0wMVwiLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNpbmNlIHRoZXJlJ3Mgb25seSBvbmUgdmVyc2lvbiwgbWlncmF0aW9uIGFuYWx5c2lzIHNob3VsZCBiZSBza2lwcGVkXG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24pLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBza2lwIG1pZ3JhdGlvbiBhbmFseXNpcyB3aGVuIGRpc2FibGVkXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHJvbGVEZWZpbml0aW9uID0gbmV3IFJvbGVEZWZpbml0aW9uKHN0YWNrLCBcIlRlc3RSb2xlXCIsIHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXJvbGVcIixcbiAgICAgICAgcm9sZU5hbWU6IFwiVGVzdCBSb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlJlc291cmNlcy9zdWJzY3JpcHRpb25zL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGVuYWJsZU1pZ3JhdGlvbkFuYWx5c2lzOiBmYWxzZSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24ubWlncmF0aW9uQW5hbHlzaXMpLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJSZXNvdXJjZSBDcmVhdGlvbiBhbmQgQm9keVwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgY3JlYXRlIGNvcnJlY3QgcmVzb3VyY2UgYm9keSB3aXRoIG1pbmltYWwgcHJvcGVydGllc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCByb2xlRGVmaW5pdGlvbiA9IG5ldyBSb2xlRGVmaW5pdGlvbihzdGFjaywgXCJUZXN0Um9sZVwiLCB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yb2xlXCIsXG4gICAgICAgIHJvbGVOYW1lOiBcIlRlc3QgUm9sZVwiLFxuICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcIk1pY3Jvc29mdC5SZXNvdXJjZXMvc3Vic2NyaXB0aW9ucy9yZWFkXCJdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGFzc2lnbmFibGVTY29wZXM6IFtcbiAgICAgICAgICBcIi9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChyb2xlRGVmaW5pdGlvbikudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChyb2xlRGVmaW5pdGlvbi5wcm9wcy5yb2xlTmFtZSkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChyb2xlRGVmaW5pdGlvbi5wcm9wcy5wZXJtaXNzaW9ucykudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChyb2xlRGVmaW5pdGlvbi5wcm9wcy5hc3NpZ25hYmxlU2NvcGVzKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgY3JlYXRlIGNvcnJlY3QgcmVzb3VyY2UgYm9keSB3aXRoIGFsbCBwcm9wZXJ0aWVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHJvbGVEZWZpbml0aW9uID0gbmV3IFJvbGVEZWZpbml0aW9uKHN0YWNrLCBcIlRlc3RSb2xlXCIsIHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXJvbGVcIixcbiAgICAgICAgcm9sZU5hbWU6IFwiVGVzdCBSb2xlXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkEgdGVzdCByb2xlIGRlZmluaXRpb25cIixcbiAgICAgICAgdHlwZTogXCJDdXN0b21Sb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LkNvbXB1dGUvdmlydHVhbE1hY2hpbmVzL3JlYWRcIl0sXG4gICAgICAgICAgICBub3RBY3Rpb25zOiBbXCJNaWNyb3NvZnQuQ29tcHV0ZS92aXJ0dWFsTWFjaGluZXMvZGVsZXRlXCJdLFxuICAgICAgICAgICAgZGF0YUFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgXCJNaWNyb3NvZnQuU3RvcmFnZS9zdG9yYWdlQWNjb3VudHMvYmxvYlNlcnZpY2VzL2NvbnRhaW5lcnMvYmxvYnMvcmVhZFwiLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG5vdERhdGFBY3Rpb25zOiBbXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBhc3NpZ25hYmxlU2NvcGVzOiBbXG4gICAgICAgICAgXCIvc3Vic2NyaXB0aW9ucy8wMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIixcbiAgICAgICAgICBcIi9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMC9yZXNvdXJjZUdyb3Vwcy90ZXN0LXJnXCIsXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLnByb3BzLnJvbGVOYW1lKS50b0JlKFwiVGVzdCBSb2xlXCIpO1xuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLnByb3BzLmRlc2NyaXB0aW9uKS50b0JlKFwiQSB0ZXN0IHJvbGUgZGVmaW5pdGlvblwiKTtcbiAgICAgIGV4cGVjdChyb2xlRGVmaW5pdGlvbi5wcm9wcy50eXBlKS50b0JlKFwiQ3VzdG9tUm9sZVwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGNyZWF0ZSBUZXJyYWZvcm0gb3V0cHV0c1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCByb2xlRGVmaW5pdGlvbiA9IG5ldyBSb2xlRGVmaW5pdGlvbihzdGFjaywgXCJUZXN0Um9sZVwiLCB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1yb2xlLW91dHB1dHNcIixcbiAgICAgICAgcm9sZU5hbWU6IFwiVGVzdCBSb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlJlc291cmNlcy9zdWJzY3JpcHRpb25zL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLmlkT3V0cHV0KS50b0JlSW5zdGFuY2VPZihjZGt0Zi5UZXJyYWZvcm1PdXRwdXQpO1xuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLm5hbWVPdXRwdXQpLnRvQmVJbnN0YW5jZU9mKGNka3RmLlRlcnJhZm9ybU91dHB1dCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiUGVybWlzc2lvbnMgQ29uZmlndXJhdGlvblwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgc3VwcG9ydCBjb250cm9sIHBsYW5lIGFjdGlvbnNcIiwgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9sZURlZmluaXRpb24gPSBuZXcgUm9sZURlZmluaXRpb24oc3RhY2ssIFwiQ29udHJvbFBsYW5lUm9sZVwiLCB7XG4gICAgICAgIG5hbWU6IFwiY29udHJvbC1wbGFuZS1yb2xlXCIsXG4gICAgICAgIHJvbGVOYW1lOiBcIkNvbnRyb2wgUGxhbmUgUm9sZVwiLFxuICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgXCJNaWNyb3NvZnQuQ29tcHV0ZS92aXJ0dWFsTWFjaGluZXMvcmVhZFwiLFxuICAgICAgICAgICAgICBcIk1pY3Jvc29mdC5Db21wdXRlL3ZpcnR1YWxNYWNoaW5lcy9zdGFydC9hY3Rpb25cIixcbiAgICAgICAgICAgICAgXCJNaWNyb3NvZnQuQ29tcHV0ZS92aXJ0dWFsTWFjaGluZXMvcmVzdGFydC9hY3Rpb25cIixcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLnByb3BzLnBlcm1pc3Npb25zWzBdLmFjdGlvbnMpLnRvSGF2ZUxlbmd0aCgzKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIHN1cHBvcnQgY29udHJvbCBwbGFuZSBub3RBY3Rpb25zXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHJvbGVEZWZpbml0aW9uID0gbmV3IFJvbGVEZWZpbml0aW9uKHN0YWNrLCBcIk5vdEFjdGlvbnNSb2xlXCIsIHtcbiAgICAgICAgbmFtZTogXCJub3QtYWN0aW9ucy1yb2xlXCIsXG4gICAgICAgIHJvbGVOYW1lOiBcIk5vdCBBY3Rpb25zIFJvbGVcIixcbiAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXCJNaWNyb3NvZnQuQ29tcHV0ZS92aXJ0dWFsTWFjaGluZXMvKlwiXSxcbiAgICAgICAgICAgIG5vdEFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgXCJNaWNyb3NvZnQuQ29tcHV0ZS92aXJ0dWFsTWFjaGluZXMvZGVsZXRlXCIsXG4gICAgICAgICAgICAgIFwiTWljcm9zb2Z0LkNvbXB1dGUvdmlydHVhbE1hY2hpbmVzL3dyaXRlXCIsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGFzc2lnbmFibGVTY29wZXM6IFtcbiAgICAgICAgICBcIi9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChyb2xlRGVmaW5pdGlvbi5wcm9wcy5wZXJtaXNzaW9uc1swXS5ub3RBY3Rpb25zKS50b0hhdmVMZW5ndGgoMik7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBzdXBwb3J0IGRhdGEgcGxhbmUgYWN0aW9uc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCByb2xlRGVmaW5pdGlvbiA9IG5ldyBSb2xlRGVmaW5pdGlvbihzdGFjaywgXCJEYXRhUGxhbmVSb2xlXCIsIHtcbiAgICAgICAgbmFtZTogXCJkYXRhLXBsYW5lLXJvbGVcIixcbiAgICAgICAgcm9sZU5hbWU6IFwiRGF0YSBQbGFuZSBSb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlN0b3JhZ2Uvc3RvcmFnZUFjY291bnRzL3JlYWRcIl0sXG4gICAgICAgICAgICBkYXRhQWN0aW9uczogW1xuICAgICAgICAgICAgICBcIk1pY3Jvc29mdC5TdG9yYWdlL3N0b3JhZ2VBY2NvdW50cy9ibG9iU2VydmljZXMvY29udGFpbmVycy9ibG9icy9yZWFkXCIsXG4gICAgICAgICAgICAgIFwiTWljcm9zb2Z0LlN0b3JhZ2Uvc3RvcmFnZUFjY291bnRzL2Jsb2JTZXJ2aWNlcy9jb250YWluZXJzL2Jsb2JzL3dyaXRlXCIsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGFzc2lnbmFibGVTY29wZXM6IFtcbiAgICAgICAgICBcIi9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChyb2xlRGVmaW5pdGlvbi5wcm9wcy5wZXJtaXNzaW9uc1swXS5kYXRhQWN0aW9ucykudG9IYXZlTGVuZ3RoKDIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgc3VwcG9ydCBkYXRhIHBsYW5lIG5vdERhdGFBY3Rpb25zXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHJvbGVEZWZpbml0aW9uID0gbmV3IFJvbGVEZWZpbml0aW9uKHN0YWNrLCBcIk5vdERhdGFBY3Rpb25zUm9sZVwiLCB7XG4gICAgICAgIG5hbWU6IFwibm90LWRhdGEtYWN0aW9ucy1yb2xlXCIsXG4gICAgICAgIHJvbGVOYW1lOiBcIk5vdCBEYXRhIEFjdGlvbnMgUm9sZVwiLFxuICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRhdGFBY3Rpb25zOiBbXG4gICAgICAgICAgICAgIFwiTWljcm9zb2Z0LlN0b3JhZ2Uvc3RvcmFnZUFjY291bnRzL2Jsb2JTZXJ2aWNlcy9jb250YWluZXJzL2Jsb2JzLypcIixcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBub3REYXRhQWN0aW9uczogW1xuICAgICAgICAgICAgICBcIk1pY3Jvc29mdC5TdG9yYWdlL3N0b3JhZ2VBY2NvdW50cy9ibG9iU2VydmljZXMvY29udGFpbmVycy9ibG9icy9kZWxldGVcIixcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLnByb3BzLnBlcm1pc3Npb25zWzBdLm5vdERhdGFBY3Rpb25zKS50b0hhdmVMZW5ndGgoXG4gICAgICAgIDEsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgc3VwcG9ydCBjb21wbGV4IHBlcm1pc3Npb24gY29tYmluYXRpb25zXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHJvbGVEZWZpbml0aW9uID0gbmV3IFJvbGVEZWZpbml0aW9uKHN0YWNrLCBcIkNvbXBsZXhQZXJtaXNzaW9uc1wiLCB7XG4gICAgICAgIG5hbWU6IFwiY29tcGxleC1wZXJtaXNzaW9uc1wiLFxuICAgICAgICByb2xlTmFtZTogXCJDb21wbGV4IFBlcm1pc3Npb25zIFJvbGVcIixcbiAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXCJNaWNyb3NvZnQuQ29tcHV0ZS92aXJ0dWFsTWFjaGluZXMvKlwiXSxcbiAgICAgICAgICAgIG5vdEFjdGlvbnM6IFtcIk1pY3Jvc29mdC5Db21wdXRlL3ZpcnR1YWxNYWNoaW5lcy9kZWxldGVcIl0sXG4gICAgICAgICAgICBkYXRhQWN0aW9uczogW1xuICAgICAgICAgICAgICBcIk1pY3Jvc29mdC5TdG9yYWdlL3N0b3JhZ2VBY2NvdW50cy9ibG9iU2VydmljZXMvY29udGFpbmVycy9ibG9icy8qXCIsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgbm90RGF0YUFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgXCJNaWNyb3NvZnQuU3RvcmFnZS9zdG9yYWdlQWNjb3VudHMvYmxvYlNlcnZpY2VzL2NvbnRhaW5lcnMvYmxvYnMvZGVsZXRlXCIsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGFzc2lnbmFibGVTY29wZXM6IFtcbiAgICAgICAgICBcIi9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChyb2xlRGVmaW5pdGlvbi5wcm9wcy5wZXJtaXNzaW9uc1swXS5hY3Rpb25zKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLnByb3BzLnBlcm1pc3Npb25zWzBdLm5vdEFjdGlvbnMpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24ucHJvcHMucGVybWlzc2lvbnNbMF0uZGF0YUFjdGlvbnMpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24ucHJvcHMucGVybWlzc2lvbnNbMF0ubm90RGF0YUFjdGlvbnMpLnRvQmVEZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBzdXBwb3J0IG11bHRpcGxlIHBlcm1pc3Npb24gb2JqZWN0c1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCByb2xlRGVmaW5pdGlvbiA9IG5ldyBSb2xlRGVmaW5pdGlvbihzdGFjaywgXCJNdWx0aXBsZVBlcm1pc3Npb25zXCIsIHtcbiAgICAgICAgbmFtZTogXCJtdWx0aXBsZS1wZXJtaXNzaW9uc1wiLFxuICAgICAgICByb2xlTmFtZTogXCJNdWx0aXBsZSBQZXJtaXNzaW9ucyBSb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LkNvbXB1dGUvdmlydHVhbE1hY2hpbmVzL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXCJNaWNyb3NvZnQuU3RvcmFnZS9zdG9yYWdlQWNjb3VudHMvcmVhZFwiXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRhdGFBY3Rpb25zOiBbXG4gICAgICAgICAgICAgIFwiTWljcm9zb2Z0LlN0b3JhZ2Uvc3RvcmFnZUFjY291bnRzL2Jsb2JTZXJ2aWNlcy9jb250YWluZXJzL2Jsb2JzL3JlYWRcIixcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLnByb3BzLnBlcm1pc3Npb25zKS50b0hhdmVMZW5ndGgoMyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiQXNzaWduYWJsZSBTY29wZXMgQ29uZmlndXJhdGlvblwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgc3VwcG9ydCBzdWJzY3JpcHRpb24gc2NvcGVcIiwgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9sZURlZmluaXRpb24gPSBuZXcgUm9sZURlZmluaXRpb24oc3RhY2ssIFwiU3Vic2NyaXB0aW9uU2NvcGVcIiwge1xuICAgICAgICBuYW1lOiBcInN1YnNjcmlwdGlvbi1yb2xlXCIsXG4gICAgICAgIHJvbGVOYW1lOiBcIlN1YnNjcmlwdGlvbiBSb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlJlc291cmNlcy9zdWJzY3JpcHRpb25zL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLnByb3BzLmFzc2lnbmFibGVTY29wZXNbMF0pLnRvQ29udGFpbihcbiAgICAgICAgXCIvc3Vic2NyaXB0aW9ucy9cIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBzdXBwb3J0IHJlc291cmNlIGdyb3VwIHNjb3BlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHJvbGVEZWZpbml0aW9uID0gbmV3IFJvbGVEZWZpbml0aW9uKHN0YWNrLCBcIlJlc291cmNlR3JvdXBTY29wZVwiLCB7XG4gICAgICAgIG5hbWU6IFwicmctcm9sZVwiLFxuICAgICAgICByb2xlTmFtZTogXCJSZXNvdXJjZSBHcm91cCBSb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlJlc291cmNlcy9zdWJzY3JpcHRpb25zL3Jlc291cmNlR3JvdXBzL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwL3Jlc291cmNlR3JvdXBzL3Rlc3QtcmdcIixcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24ucHJvcHMuYXNzaWduYWJsZVNjb3Blc1swXSkudG9Db250YWluKFxuICAgICAgICBcIi9yZXNvdXJjZUdyb3Vwcy9cIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBzdXBwb3J0IG1hbmFnZW1lbnQgZ3JvdXAgc2NvcGVcIiwgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9sZURlZmluaXRpb24gPSBuZXcgUm9sZURlZmluaXRpb24oc3RhY2ssIFwiTWFuYWdlbWVudEdyb3VwU2NvcGVcIiwge1xuICAgICAgICBuYW1lOiBcIm1nLXJvbGVcIixcbiAgICAgICAgcm9sZU5hbWU6IFwiTWFuYWdlbWVudCBHcm91cCBSb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlJlc291cmNlcy9zdWJzY3JpcHRpb25zL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3Byb3ZpZGVycy9NaWNyb3NvZnQuTWFuYWdlbWVudC9tYW5hZ2VtZW50R3JvdXBzL3Rlc3QtbWdcIixcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24ucHJvcHMuYXNzaWduYWJsZVNjb3Blc1swXSkudG9Db250YWluKFxuICAgICAgICBcIi9tYW5hZ2VtZW50R3JvdXBzL1wiLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIHN1cHBvcnQgbXVsdGlwbGUgYXNzaWduYWJsZSBzY29wZXNcIiwgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9sZURlZmluaXRpb24gPSBuZXcgUm9sZURlZmluaXRpb24oc3RhY2ssIFwiTXVsdGlwbGVTY29wZXNcIiwge1xuICAgICAgICBuYW1lOiBcIm11bHRpcGxlLXNjb3Blcy1yb2xlXCIsXG4gICAgICAgIHJvbGVOYW1lOiBcIk11bHRpcGxlIFNjb3BlcyBSb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlJlc291cmNlcy9zdWJzY3JpcHRpb25zL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgICAgXCIvc3Vic2NyaXB0aW9ucy8wMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAvcmVzb3VyY2VHcm91cHMvcmcxXCIsXG4gICAgICAgICAgXCIvc3Vic2NyaXB0aW9ucy8wMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAvcmVzb3VyY2VHcm91cHMvcmcyXCIsXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLnByb3BzLmFzc2lnbmFibGVTY29wZXMpLnRvSGF2ZUxlbmd0aCgzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJSb2xlIFR5cGVzXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBkZWZhdWx0IHRvIEN1c3RvbVJvbGUgdHlwZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCByb2xlRGVmaW5pdGlvbiA9IG5ldyBSb2xlRGVmaW5pdGlvbihzdGFjaywgXCJEZWZhdWx0VHlwZVwiLCB7XG4gICAgICAgIG5hbWU6IFwiZGVmYXVsdC10eXBlLXJvbGVcIixcbiAgICAgICAgcm9sZU5hbWU6IFwiRGVmYXVsdCBUeXBlIFJvbGVcIixcbiAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXCJNaWNyb3NvZnQuUmVzb3VyY2VzL3N1YnNjcmlwdGlvbnMvcmVhZFwiXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBhc3NpZ25hYmxlU2NvcGVzOiBbXG4gICAgICAgICAgXCIvc3Vic2NyaXB0aW9ucy8wMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIixcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24ucm9sZVR5cGUpLnRvQmUoXCJDdXN0b21Sb2xlXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgc3VwcG9ydCBleHBsaWNpdCBDdXN0b21Sb2xlIHR5cGVcIiwgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9sZURlZmluaXRpb24gPSBuZXcgUm9sZURlZmluaXRpb24oc3RhY2ssIFwiQ3VzdG9tVHlwZVwiLCB7XG4gICAgICAgIG5hbWU6IFwiY3VzdG9tLXR5cGUtcm9sZVwiLFxuICAgICAgICByb2xlTmFtZTogXCJDdXN0b20gVHlwZSBSb2xlXCIsXG4gICAgICAgIHR5cGU6IFwiQ3VzdG9tUm9sZVwiLFxuICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcIk1pY3Jvc29mdC5SZXNvdXJjZXMvc3Vic2NyaXB0aW9ucy9yZWFkXCJdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGFzc2lnbmFibGVTY29wZXM6IFtcbiAgICAgICAgICBcIi9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChyb2xlRGVmaW5pdGlvbi5yb2xlVHlwZSkudG9CZShcIkN1c3RvbVJvbGVcIik7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBzdXBwb3J0IEJ1aWx0SW5Sb2xlIHR5cGVcIiwgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9sZURlZmluaXRpb24gPSBuZXcgUm9sZURlZmluaXRpb24oc3RhY2ssIFwiQnVpbHRJblR5cGVcIiwge1xuICAgICAgICBuYW1lOiBcImJ1aWx0aW4tdHlwZS1yb2xlXCIsXG4gICAgICAgIHJvbGVOYW1lOiBcIkJ1aWx0LUluIFR5cGUgUm9sZVwiLFxuICAgICAgICB0eXBlOiBcIkJ1aWx0SW5Sb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlJlc291cmNlcy9zdWJzY3JpcHRpb25zL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLnJvbGVUeXBlKS50b0JlKFwiQnVpbHRJblJvbGVcIik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiUHVibGljIE1ldGhvZHMgYW5kIFByb3BlcnRpZXNcIiwgKCkgPT4ge1xuICAgIGxldCByb2xlRGVmaW5pdGlvbjogUm9sZURlZmluaXRpb247XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgIHJvbGVEZWZpbml0aW9uID0gbmV3IFJvbGVEZWZpbml0aW9uKHN0YWNrLCBcIlRlc3RSb2xlXCIsIHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LXJvbGVcIixcbiAgICAgICAgcm9sZU5hbWU6IFwiVGVzdCBSb2xlXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIkEgdGVzdCByb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LkNvbXB1dGUvdmlydHVhbE1hY2hpbmVzL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGhhdmUgY29ycmVjdCBpZCBmb3JtYXRcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLmlkKS50b01hdGNoKC9eXFwkXFx7LipcXC5pZFxcfSQvKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGhhdmUgcmVzb3VyY2VJZCBwcm9wZXJ0eSBtYXRjaGluZyBpZFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24ucmVzb3VyY2VJZCkudG9CZShyb2xlRGVmaW5pdGlvbi5pZCk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCByZXR1cm4gY29ycmVjdCByb2xlTmFtZVwiLCAoKSA9PiB7XG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24ucm9sZU5hbWUpLnRvQmUoXCJUZXN0IFJvbGVcIik7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCByZXR1cm4gY29ycmVjdCByb2xlVHlwZVwiLCAoKSA9PiB7XG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24ucm9sZVR5cGUpLnRvQmUoXCJDdXN0b21Sb2xlXCIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIklnbm9yZSBDaGFuZ2VzIENvbmZpZ3VyYXRpb25cIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIGFwcGx5IGlnbm9yZSBjaGFuZ2VzIGxpZmVjeWNsZSBydWxlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCByb2xlRGVmaW5pdGlvbiA9IG5ldyBSb2xlRGVmaW5pdGlvbihzdGFjaywgXCJJZ25vcmVDaGFuZ2VzXCIsIHtcbiAgICAgICAgbmFtZTogXCJpZ25vcmUtY2hhbmdlcy1yb2xlXCIsXG4gICAgICAgIHJvbGVOYW1lOiBcIklnbm9yZSBDaGFuZ2VzIFJvbGVcIixcbiAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXCJNaWNyb3NvZnQuUmVzb3VyY2VzL3N1YnNjcmlwdGlvbnMvcmVhZFwiXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBhc3NpZ25hYmxlU2NvcGVzOiBbXG4gICAgICAgICAgXCIvc3Vic2NyaXB0aW9ucy8wMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIixcbiAgICAgICAgXSxcbiAgICAgICAgaWdub3JlQ2hhbmdlczogW1wiZGVzY3JpcHRpb25cIl0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uKS50b0JlSW5zdGFuY2VPZihSb2xlRGVmaW5pdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZW1wdHkgaWdub3JlIGNoYW5nZXMgYXJyYXlcIiwgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9sZURlZmluaXRpb24gPSBuZXcgUm9sZURlZmluaXRpb24oc3RhY2ssIFwiRW1wdHlJZ25vcmVcIiwge1xuICAgICAgICBuYW1lOiBcImVtcHR5LWlnbm9yZS1yb2xlXCIsXG4gICAgICAgIHJvbGVOYW1lOiBcIkVtcHR5IElnbm9yZSBSb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlJlc291cmNlcy9zdWJzY3JpcHRpb25zL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGlnbm9yZUNoYW5nZXM6IFtdLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChyb2xlRGVmaW5pdGlvbikudG9CZUluc3RhbmNlT2YoUm9sZURlZmluaXRpb24pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIkVycm9yIEhhbmRsaW5nXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBoYW5kbGUgaW52YWxpZCBBUEkgdmVyc2lvbnMgZ3JhY2VmdWxseVwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBuZXcgUm9sZURlZmluaXRpb24oc3RhY2ssIFwiSW52YWxpZEFQSVwiLCB7XG4gICAgICAgICAgbmFtZTogXCJpbnZhbGlkLWFwaS1yb2xlXCIsXG4gICAgICAgICAgcm9sZU5hbWU6IFwiSW52YWxpZCBBUEkgUm9sZVwiLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcIk1pY3Jvc29mdC5SZXNvdXJjZXMvc3Vic2NyaXB0aW9ucy9yZWFkXCJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGFzc2lnbmFibGVTY29wZXM6IFtcbiAgICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhcGlWZXJzaW9uOiBcImludmFsaWQtdmVyc2lvblwiLFxuICAgICAgICB9KTtcbiAgICAgIH0pLnRvVGhyb3coXCJVbnN1cHBvcnRlZCBBUEkgdmVyc2lvbiAnaW52YWxpZC12ZXJzaW9uJ1wiKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIHZhbGlkYXRlIHByb3BlcnRpZXMgd2hlbiB2YWxpZGF0aW9uIGlzIGVuYWJsZWRcIiwgKCkgPT4ge1xuICAgICAgLy8gUm9sZSBkZWZpbml0aW9ucyBnZW5lcmF0ZSBkZXRlcm1pbmlzdGljIFVVSURzIGZvciBuYW1lcywgc28gbmFtZSB2YWxpZGF0aW9uXG4gICAgICAvLyBkb2Vzbid0IGFwcGx5IHRoZSBzYW1lIHdheS4gVGVzdCB0aGF0IHZhbGlkIHJvbGUgZGVmaW5pdGlvbnMgcGFzcyB2YWxpZGF0aW9uLlxuICAgICAgY29uc3Qgcm9sZURlZmluaXRpb24gPSBuZXcgUm9sZURlZmluaXRpb24oc3RhY2ssIFwiVmFsaWRhdGlvblRlc3RcIiwge1xuICAgICAgICBuYW1lOiBcInRlc3Qtcm9sZVwiLCAvLyBUaGlzIGlzIGlnbm9yZWQgaW4gZmF2b3Igb2YgZ2VuZXJhdGVkIFVVSURcbiAgICAgICAgcm9sZU5hbWU6IFwiVGVzdCBSb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlJlc291cmNlcy9zdWJzY3JpcHRpb25zL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICAgIGVuYWJsZVZhbGlkYXRpb246IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHJvbGVEZWZpbml0aW9uLnZhbGlkYXRpb25SZXN1bHQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3Qocm9sZURlZmluaXRpb24udmFsaWRhdGlvblJlc3VsdCEudmFsaWQpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgc2NoZW1hIHJlZ2lzdHJhdGlvbiBlcnJvcnMgZ3JhY2VmdWxseVwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBuZXcgUm9sZURlZmluaXRpb24oc3RhY2ssIFwiU2NoZW1hVGVzdFwiLCB7XG4gICAgICAgICAgbmFtZTogXCJzY2hlbWEtdGVzdC1yb2xlXCIsXG4gICAgICAgICAgcm9sZU5hbWU6IFwiU2NoZW1hIFRlc3QgUm9sZVwiLFxuICAgICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFjdGlvbnM6IFtcIk1pY3Jvc29mdC5SZXNvdXJjZXMvc3Vic2NyaXB0aW9ucy9yZWFkXCJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGFzc2lnbmFibGVTY29wZXM6IFtcbiAgICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICB9KS5ub3QudG9UaHJvdygpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIkpTSUkgQ29tcGxpYW5jZVwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgaGF2ZSBKU0lJLWNvbXBsaWFudCBjb25zdHJ1Y3RvclwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBuZXcgUm9sZURlZmluaXRpb24oc3RhY2ssIFwiSnNpaVRlc3RcIiwge1xuICAgICAgICAgIG5hbWU6IFwianNpaS10ZXN0XCIsXG4gICAgICAgICAgcm9sZU5hbWU6IFwiSlNJSSBUZXN0IFJvbGVcIixcbiAgICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhY3Rpb25zOiBbXCJNaWNyb3NvZnQuUmVzb3VyY2VzL3N1YnNjcmlwdGlvbnMvcmVhZFwiXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBhc3NpZ25hYmxlU2NvcGVzOiBbXG4gICAgICAgICAgICBcIi9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgfSkubm90LnRvVGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGhhdmUgSlNJSS1jb21wbGlhbnQgcHJvcGVydGllc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCByb2xlRGVmaW5pdGlvbiA9IG5ldyBSb2xlRGVmaW5pdGlvbihzdGFjaywgXCJKc2lpUHJvcHNcIiwge1xuICAgICAgICBuYW1lOiBcImpzaWktcHJvcHNcIixcbiAgICAgICAgcm9sZU5hbWU6IFwiSlNJSSBQcm9wcyBSb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlJlc291cmNlcy9zdWJzY3JpcHRpb25zL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHR5cGVvZiByb2xlRGVmaW5pdGlvbi5pZCkudG9CZShcInN0cmluZ1wiKTtcbiAgICAgIGV4cGVjdCh0eXBlb2Ygcm9sZURlZmluaXRpb24ubmFtZSkudG9CZShcInN0cmluZ1wiKTtcbiAgICAgIGV4cGVjdCh0eXBlb2Ygcm9sZURlZmluaXRpb24ucmVzb2x2ZWRBcGlWZXJzaW9uKS50b0JlKFwic3RyaW5nXCIpO1xuICAgICAgZXhwZWN0KHR5cGVvZiByb2xlRGVmaW5pdGlvbi5yb2xlTmFtZSkudG9CZShcInN0cmluZ1wiKTtcbiAgICAgIGV4cGVjdCh0eXBlb2Ygcm9sZURlZmluaXRpb24ucm9sZVR5cGUpLnRvQmUoXCJzdHJpbmdcIik7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBoYXZlIEpTSUktY29tcGxpYW50IG1ldGhvZHNcIiwgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9sZURlZmluaXRpb24gPSBuZXcgUm9sZURlZmluaXRpb24oc3RhY2ssIFwiSnNpaU1ldGhvZHNcIiwge1xuICAgICAgICBuYW1lOiBcImpzaWktbWV0aG9kc1wiLFxuICAgICAgICByb2xlTmFtZTogXCJKU0lJIE1ldGhvZHMgUm9sZVwiLFxuICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcIk1pY3Jvc29mdC5SZXNvdXJjZXMvc3Vic2NyaXB0aW9ucy9yZWFkXCJdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGFzc2lnbmFibGVTY29wZXM6IFtcbiAgICAgICAgICBcIi9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdCh0eXBlb2Ygcm9sZURlZmluaXRpb24ubGF0ZXN0VmVyc2lvbikudG9CZShcImZ1bmN0aW9uXCIpO1xuICAgICAgZXhwZWN0KHR5cGVvZiByb2xlRGVmaW5pdGlvbi5zdXBwb3J0ZWRWZXJzaW9ucykudG9CZShcImZ1bmN0aW9uXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgc2VyaWFsaXplIGNvbXBsZXggb2JqZWN0cyBjb3JyZWN0bHlcIiwgKCkgPT4ge1xuICAgICAgY29uc3Qgcm9sZURlZmluaXRpb24gPSBuZXcgUm9sZURlZmluaXRpb24oc3RhY2ssIFwiSnNpaVNlcmlhbGl6YXRpb25cIiwge1xuICAgICAgICBuYW1lOiBcImpzaWktc2VyaWFsaXphdGlvblwiLFxuICAgICAgICByb2xlTmFtZTogXCJKU0lJIFNlcmlhbGl6YXRpb24gUm9sZVwiLFxuICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcIk1pY3Jvc29mdC5Db21wdXRlL3ZpcnR1YWxNYWNoaW5lcy9yZWFkXCJdLFxuICAgICAgICAgICAgbm90QWN0aW9uczogW1wiTWljcm9zb2Z0LkNvbXB1dGUvdmlydHVhbE1hY2hpbmVzL2RlbGV0ZVwiXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBhc3NpZ25hYmxlU2NvcGVzOiBbXG4gICAgICAgICAgXCIvc3Vic2NyaXB0aW9ucy8wMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIixcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoKCkgPT5cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkocm9sZURlZmluaXRpb24udmFsaWRhdGlvblJlc3VsdCksXG4gICAgICApLm5vdC50b1Rocm93KCk7XG4gICAgICBleHBlY3QoKCkgPT4gSlNPTi5zdHJpbmdpZnkocm9sZURlZmluaXRpb24uc2NoZW1hKSkubm90LnRvVGhyb3coKTtcbiAgICAgIGV4cGVjdCgoKSA9PiBKU09OLnN0cmluZ2lmeShyb2xlRGVmaW5pdGlvbi52ZXJzaW9uQ29uZmlnKSkubm90LnRvVGhyb3coKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJDREsgVGVycmFmb3JtIEludGVncmF0aW9uXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBzeW50aGVzaXplIHRvIHZhbGlkIFRlcnJhZm9ybSBjb25maWd1cmF0aW9uXCIsICgpID0+IHtcbiAgICAgIG5ldyBSb2xlRGVmaW5pdGlvbihzdGFjaywgXCJTeW50aFRlc3RcIiwge1xuICAgICAgICBuYW1lOiBcInN5bnRoLXRlc3RcIixcbiAgICAgICAgcm9sZU5hbWU6IFwiU3ludGggVGVzdCBSb2xlXCIsXG4gICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uczogW1wiTWljcm9zb2Z0LlJlc291cmNlcy9zdWJzY3JpcHRpb25zL3JlYWRcIl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNzaWduYWJsZVNjb3BlczogW1xuICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc3ludGhlc2l6ZWQgPSBUZXN0aW5nLnN5bnRoKHN0YWNrKTtcbiAgICAgIGV4cGVjdChzeW50aGVzaXplZCkudG9CZURlZmluZWQoKTtcblxuICAgICAgY29uc3Qgc3RhY2tDb25maWcgPSBKU09OLnBhcnNlKHN5bnRoZXNpemVkKTtcbiAgICAgIGV4cGVjdChzdGFja0NvbmZpZy5yZXNvdXJjZSkudG9CZURlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIHdvcmsgaW4gY29tcGxleCBDREsgY29uc3RydWN0c1wiLCAoKSA9PiB7XG4gICAgICBjbGFzcyBDb21wbGV4Q29uc3RydWN0IGV4dGVuZHMgY2RrdGYuVGVycmFmb3JtU3RhY2sge1xuICAgICAgICBjb25zdHJ1Y3RvcihzY29wZTogY2RrdGYuQXBwLCBpZDogc3RyaW5nKSB7XG4gICAgICAgICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgICAgICAgIGNvbnN0IHJvbGUxID0gbmV3IFJvbGVEZWZpbml0aW9uKHRoaXMsIFwiUm9sZTFcIiwge1xuICAgICAgICAgICAgbmFtZTogXCJyb2xlLTFcIixcbiAgICAgICAgICAgIHJvbGVOYW1lOiBcIkZpcnN0IFJvbGVcIixcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXCJNaWNyb3NvZnQuQ29tcHV0ZS92aXJ0dWFsTWFjaGluZXMvcmVhZFwiXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBhc3NpZ25hYmxlU2NvcGVzOiBbXG4gICAgICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3Qgcm9sZTIgPSBuZXcgUm9sZURlZmluaXRpb24odGhpcywgXCJSb2xlMlwiLCB7XG4gICAgICAgICAgICBuYW1lOiBcInJvbGUtMlwiLFxuICAgICAgICAgICAgcm9sZU5hbWU6IFwiU2Vjb25kIFJvbGVcIixcbiAgICAgICAgICAgIHBlcm1pc3Npb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXCJNaWNyb3NvZnQuU3RvcmFnZS9zdG9yYWdlQWNjb3VudHMvcmVhZFwiXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBhc3NpZ25hYmxlU2NvcGVzOiBbXG4gICAgICAgICAgICAgIFwiL3N1YnNjcmlwdGlvbnMvMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwL3Jlc291cmNlR3JvdXBzL3Rlc3QtcmdcIixcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBhcGlWZXJzaW9uOiBcIjIwMjItMDQtMDFcIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJSb2xlMUlkXCIsIHtcbiAgICAgICAgICAgIHZhbHVlOiByb2xlMS5pZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIG5ldyBjZGt0Zi5UZXJyYWZvcm1PdXRwdXQodGhpcywgXCJSb2xlMklkXCIsIHtcbiAgICAgICAgICAgIHZhbHVlOiByb2xlMi5pZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBleHBlY3QoKCkgPT4ge1xuICAgICAgICBuZXcgQ29tcGxleENvbnN0cnVjdChhcHAsIFwiQ29tcGxleFN0YWNrXCIpO1xuICAgICAgfSkubm90LnRvVGhyb3coKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGhhbmRsZSBtdWx0aXBsZSByb2xlIGRlZmluaXRpb25zIGluIHRoZSBzYW1lIHN0YWNrXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHJvbGUxID0gbmV3IFJvbGVEZWZpbml0aW9uKHN0YWNrLCBcIlJvbGUxXCIsIHtcbiAgICAgICAgbmFtZTogXCJyb2xlLTFcIixcbiAgICAgICAgcm9sZU5hbWU6IFwiRmlyc3QgUm9sZVwiLFxuICAgICAgICBwZXJtaXNzaW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcIk1pY3Jvc29mdC5Db21wdXRlL3ZpcnR1YWxNYWNoaW5lcy9yZWFkXCJdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGFzc2lnbmFibGVTY29wZXM6IFtcbiAgICAgICAgICBcIi9zdWJzY3JpcHRpb25zLzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJvbGUyID0gbmV3IFJvbGVEZWZpbml0aW9uKHN0YWNrLCBcIlJvbGUyXCIsIHtcbiAgICAgICAgbmFtZTogXCJyb2xlLTJcIixcbiAgICAgICAgcm9sZU5hbWU6IFwiU2Vjb25kIFJvbGVcIixcbiAgICAgICAgcGVybWlzc2lvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXCJNaWNyb3NvZnQuU3RvcmFnZS9zdG9yYWdlQWNjb3VudHMvcmVhZFwiXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBhc3NpZ25hYmxlU2NvcGVzOiBbXG4gICAgICAgICAgXCIvc3Vic2NyaXB0aW9ucy8wMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAvcmVzb3VyY2VHcm91cHMvdGVzdC1yZ1wiLFxuICAgICAgICBdLFxuICAgICAgICBhcGlWZXJzaW9uOiBcIjIwMjItMDQtMDFcIixcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3Qocm9sZTEucmVzb2x2ZWRBcGlWZXJzaW9uKS50b0JlKFwiMjAyMi0wNC0wMVwiKTtcbiAgICAgIGV4cGVjdChyb2xlMi5yZXNvbHZlZEFwaVZlcnNpb24pLnRvQmUoXCIyMDIyLTA0LTAxXCIpO1xuXG4gICAgICBjb25zdCBzeW50aGVzaXplZCA9IFRlc3Rpbmcuc3ludGgoc3RhY2spO1xuICAgICAgZXhwZWN0KHN5bnRoZXNpemVkKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19