@microsoft/terraform-cdk-constructs 1.0.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 (577) hide show
  1. package/.jsii +89270 -15866
  2. package/API.md +103201 -10557
  3. package/README.md +72 -36
  4. package/docs/monitoring-guide.md +206 -0
  5. package/docs/testing.md +84 -1
  6. package/lib/azure-actiongroup/index.d.ts +1 -0
  7. package/lib/azure-actiongroup/index.js +18 -0
  8. package/lib/azure-actiongroup/lib/action-group-schemas.d.ts +24 -0
  9. package/lib/azure-actiongroup/lib/action-group-schemas.js +201 -0
  10. package/lib/azure-actiongroup/lib/action-group.d.ts +302 -0
  11. package/lib/azure-actiongroup/lib/action-group.js +175 -0
  12. package/lib/azure-actiongroup/lib/index.d.ts +2 -0
  13. package/lib/azure-actiongroup/lib/index.js +19 -0
  14. package/lib/azure-actiongroup/test/action-group.integ.d.ts +9 -0
  15. package/lib/azure-actiongroup/test/action-group.integ.js +79 -0
  16. package/lib/azure-actiongroup/test/action-group.spec.d.ts +8 -0
  17. package/lib/azure-actiongroup/test/action-group.spec.js +602 -0
  18. package/lib/azure-activitylogalert/index.d.ts +1 -0
  19. package/lib/azure-activitylogalert/index.js +18 -0
  20. package/lib/azure-activitylogalert/lib/activity-log-alert-schemas.d.ts +24 -0
  21. package/lib/azure-activitylogalert/lib/activity-log-alert-schemas.js +182 -0
  22. package/lib/azure-activitylogalert/lib/activity-log-alert.d.ts +226 -0
  23. package/lib/azure-activitylogalert/lib/activity-log-alert.js +186 -0
  24. package/lib/azure-activitylogalert/lib/index.d.ts +2 -0
  25. package/lib/azure-activitylogalert/lib/index.js +19 -0
  26. package/lib/azure-activitylogalert/test/activity-log-alert.integ.d.ts +9 -0
  27. package/lib/azure-activitylogalert/test/activity-log-alert.integ.js +98 -0
  28. package/lib/azure-activitylogalert/test/activity-log-alert.spec.d.ts +9 -0
  29. package/lib/azure-activitylogalert/test/activity-log-alert.spec.js +1101 -0
  30. package/lib/azure-aks/index.d.ts +1 -0
  31. package/lib/azure-aks/index.js +18 -0
  32. package/lib/azure-aks/lib/aks-cluster-schemas.d.ts +505 -0
  33. package/lib/azure-aks/lib/aks-cluster-schemas.js +572 -0
  34. package/lib/azure-aks/lib/aks-cluster.d.ts +386 -0
  35. package/lib/azure-aks/lib/aks-cluster.js +466 -0
  36. package/lib/azure-aks/lib/index.d.ts +2 -0
  37. package/lib/azure-aks/lib/index.js +19 -0
  38. package/lib/azure-aks/test/aks-cluster.integ.d.ts +9 -0
  39. package/lib/azure-aks/test/aks-cluster.integ.js +260 -0
  40. package/lib/azure-aks/test/aks-cluster.spec.d.ts +8 -0
  41. package/lib/azure-aks/test/aks-cluster.spec.js +1396 -0
  42. package/lib/azure-diagnosticsettings/index.d.ts +1 -0
  43. package/lib/azure-diagnosticsettings/index.js +18 -0
  44. package/lib/azure-diagnosticsettings/lib/diagnostic-settings-schemas.d.ts +50 -0
  45. package/lib/azure-diagnosticsettings/lib/diagnostic-settings-schemas.js +207 -0
  46. package/lib/azure-diagnosticsettings/lib/diagnostic-settings.d.ts +183 -0
  47. package/lib/azure-diagnosticsettings/lib/diagnostic-settings.js +174 -0
  48. package/lib/azure-diagnosticsettings/lib/index.d.ts +2 -0
  49. package/lib/azure-diagnosticsettings/lib/index.js +19 -0
  50. package/lib/azure-diagnosticsettings/test/diagnostic-settings.spec.d.ts +8 -0
  51. package/lib/azure-diagnosticsettings/test/diagnostic-settings.spec.js +432 -0
  52. package/lib/azure-dnsforwardingruleset/index.d.ts +1 -0
  53. package/lib/azure-dnsforwardingruleset/index.js +18 -0
  54. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset-schemas.d.ts +24 -0
  55. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset-schemas.js +206 -0
  56. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.d.ts +174 -0
  57. package/lib/azure-dnsforwardingruleset/lib/dns-forwarding-ruleset.js +214 -0
  58. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule-schemas.d.ts +24 -0
  59. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule-schemas.js +242 -0
  60. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.d.ts +193 -0
  61. package/lib/azure-dnsforwardingruleset/lib/forwarding-rule.js +193 -0
  62. package/lib/azure-dnsforwardingruleset/lib/index.d.ts +6 -0
  63. package/lib/azure-dnsforwardingruleset/lib/index.js +23 -0
  64. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link-schemas.d.ts +24 -0
  65. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link-schemas.js +199 -0
  66. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.d.ts +160 -0
  67. package/lib/azure-dnsforwardingruleset/lib/virtual-network-link.js +178 -0
  68. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.integ.d.ts +9 -0
  69. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.integ.js +133 -0
  70. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.spec.d.ts +9 -0
  71. package/lib/azure-dnsforwardingruleset/test/dns-forwarding-ruleset.spec.js +350 -0
  72. package/lib/azure-dnsforwardingruleset/test/forwarding-rule.spec.d.ts +9 -0
  73. package/lib/azure-dnsforwardingruleset/test/forwarding-rule.spec.js +397 -0
  74. package/lib/azure-dnsforwardingruleset/test/virtual-network-link.spec.d.ts +9 -0
  75. package/lib/azure-dnsforwardingruleset/test/virtual-network-link.spec.js +285 -0
  76. package/lib/azure-dnsresolver/index.d.ts +1 -0
  77. package/lib/azure-dnsresolver/index.js +18 -0
  78. package/lib/azure-dnsresolver/lib/dns-resolver-schemas.d.ts +24 -0
  79. package/lib/azure-dnsresolver/lib/dns-resolver-schemas.js +218 -0
  80. package/lib/azure-dnsresolver/lib/dns-resolver.d.ts +170 -0
  81. package/lib/azure-dnsresolver/lib/dns-resolver.js +236 -0
  82. package/lib/azure-dnsresolver/lib/inbound-endpoint-schemas.d.ts +24 -0
  83. package/lib/azure-dnsresolver/lib/inbound-endpoint-schemas.js +261 -0
  84. package/lib/azure-dnsresolver/lib/inbound-endpoint.d.ts +189 -0
  85. package/lib/azure-dnsresolver/lib/inbound-endpoint.js +243 -0
  86. package/lib/azure-dnsresolver/lib/index.d.ts +6 -0
  87. package/lib/azure-dnsresolver/lib/index.js +23 -0
  88. package/lib/azure-dnsresolver/lib/outbound-endpoint-schemas.d.ts +24 -0
  89. package/lib/azure-dnsresolver/lib/outbound-endpoint-schemas.js +231 -0
  90. package/lib/azure-dnsresolver/lib/outbound-endpoint.d.ts +175 -0
  91. package/lib/azure-dnsresolver/lib/outbound-endpoint.js +234 -0
  92. package/lib/azure-dnsresolver/test/dns-resolver.integ.d.ts +14 -0
  93. package/lib/azure-dnsresolver/test/dns-resolver.integ.js +117 -0
  94. package/lib/azure-dnsresolver/test/dns-resolver.spec.d.ts +9 -0
  95. package/lib/azure-dnsresolver/test/dns-resolver.spec.js +353 -0
  96. package/lib/azure-dnsresolver/test/inbound-endpoint.integ.d.ts +9 -0
  97. package/lib/azure-dnsresolver/test/inbound-endpoint.integ.js +151 -0
  98. package/lib/azure-dnsresolver/test/inbound-endpoint.spec.d.ts +9 -0
  99. package/lib/azure-dnsresolver/test/inbound-endpoint.spec.js +441 -0
  100. package/lib/azure-dnsresolver/test/outbound-endpoint.integ.d.ts +9 -0
  101. package/lib/azure-dnsresolver/test/outbound-endpoint.integ.js +149 -0
  102. package/lib/azure-dnsresolver/test/outbound-endpoint.spec.d.ts +9 -0
  103. package/lib/azure-dnsresolver/test/outbound-endpoint.spec.js +301 -0
  104. package/lib/azure-dnszone/index.d.ts +1 -0
  105. package/lib/azure-dnszone/index.js +18 -0
  106. package/lib/azure-dnszone/lib/dns-zone-schemas.d.ts +24 -0
  107. package/lib/azure-dnszone/lib/dns-zone-schemas.js +191 -0
  108. package/lib/azure-dnszone/lib/dns-zone.d.ts +182 -0
  109. package/lib/azure-dnszone/lib/dns-zone.js +228 -0
  110. package/lib/azure-dnszone/lib/index.d.ts +2 -0
  111. package/lib/azure-dnszone/lib/index.js +19 -0
  112. package/lib/azure-dnszone/test/dns-zone.integ.d.ts +9 -0
  113. package/lib/azure-dnszone/test/dns-zone.integ.js +85 -0
  114. package/lib/azure-dnszone/test/dns-zone.spec.d.ts +9 -0
  115. package/lib/azure-dnszone/test/dns-zone.spec.js +285 -0
  116. package/lib/azure-metricalert/index.d.ts +1 -0
  117. package/lib/azure-metricalert/index.js +18 -0
  118. package/lib/azure-metricalert/lib/index.d.ts +2 -0
  119. package/lib/azure-metricalert/lib/index.js +19 -0
  120. package/lib/azure-metricalert/lib/metric-alert-schemas.d.ts +24 -0
  121. package/lib/azure-metricalert/lib/metric-alert-schemas.js +242 -0
  122. package/lib/azure-metricalert/lib/metric-alert.d.ts +334 -0
  123. package/lib/azure-metricalert/lib/metric-alert.js +226 -0
  124. package/lib/azure-metricalert/test/metric-alert.integ.d.ts +9 -0
  125. package/lib/azure-metricalert/test/metric-alert.integ.js +123 -0
  126. package/lib/azure-metricalert/test/metric-alert.spec.d.ts +9 -0
  127. package/lib/azure-metricalert/test/metric-alert.spec.js +1266 -0
  128. package/lib/azure-networkinterface/index.d.ts +1 -0
  129. package/lib/azure-networkinterface/index.js +18 -0
  130. package/lib/azure-networkinterface/lib/index.d.ts +2 -0
  131. package/lib/azure-networkinterface/lib/index.js +19 -0
  132. package/lib/azure-networkinterface/lib/network-interface-schemas.d.ts +32 -0
  133. package/lib/azure-networkinterface/lib/network-interface-schemas.js +222 -0
  134. package/lib/azure-networkinterface/lib/network-interface.d.ts +260 -0
  135. package/lib/azure-networkinterface/lib/network-interface.js +213 -0
  136. package/lib/azure-networkinterface/test/network-interface.integ.d.ts +9 -0
  137. package/lib/azure-networkinterface/test/network-interface.integ.js +116 -0
  138. package/lib/azure-networkinterface/test/network-interface.spec.d.ts +8 -0
  139. package/lib/azure-networkinterface/test/network-interface.spec.js +655 -0
  140. package/lib/azure-networksecuritygroup/index.d.ts +1 -0
  141. package/lib/azure-networksecuritygroup/index.js +18 -0
  142. package/lib/azure-networksecuritygroup/lib/index.d.ts +2 -0
  143. package/lib/azure-networksecuritygroup/lib/index.js +19 -0
  144. package/lib/azure-networksecuritygroup/lib/network-security-group-schemas.d.ts +32 -0
  145. package/lib/azure-networksecuritygroup/lib/network-security-group-schemas.js +198 -0
  146. package/lib/azure-networksecuritygroup/lib/network-security-group.d.ts +259 -0
  147. package/lib/azure-networksecuritygroup/lib/network-security-group.js +226 -0
  148. package/lib/azure-networksecuritygroup/test/network-security-group.integ.d.ts +9 -0
  149. package/lib/azure-networksecuritygroup/test/network-security-group.integ.js +151 -0
  150. package/lib/azure-networksecuritygroup/test/network-security-group.spec.d.ts +8 -0
  151. package/lib/azure-networksecuritygroup/test/network-security-group.spec.js +652 -0
  152. package/lib/azure-policyassignment/index.d.ts +1 -0
  153. package/lib/azure-policyassignment/index.js +18 -0
  154. package/lib/azure-policyassignment/lib/index.d.ts +2 -0
  155. package/lib/azure-policyassignment/lib/index.js +19 -0
  156. package/lib/azure-policyassignment/lib/policy-assignment-schemas.d.ts +25 -0
  157. package/lib/azure-policyassignment/lib/policy-assignment-schemas.js +260 -0
  158. package/lib/azure-policyassignment/lib/policy-assignment.d.ts +342 -0
  159. package/lib/azure-policyassignment/lib/policy-assignment.js +228 -0
  160. package/lib/azure-policyassignment/test/policy-assignment.integ.d.ts +13 -0
  161. package/lib/azure-policyassignment/test/policy-assignment.integ.js +153 -0
  162. package/lib/azure-policyassignment/test/policy-assignment.spec.d.ts +9 -0
  163. package/lib/azure-policyassignment/test/policy-assignment.spec.js +651 -0
  164. package/lib/azure-policydefinition/index.d.ts +1 -0
  165. package/lib/azure-policydefinition/index.js +18 -0
  166. package/lib/azure-policydefinition/lib/index.d.ts +2 -0
  167. package/lib/azure-policydefinition/lib/index.js +19 -0
  168. package/lib/azure-policydefinition/lib/policy-definition-schemas.d.ts +25 -0
  169. package/lib/azure-policydefinition/lib/policy-definition-schemas.js +210 -0
  170. package/lib/azure-policydefinition/lib/policy-definition.d.ts +260 -0
  171. package/lib/azure-policydefinition/lib/policy-definition.js +199 -0
  172. package/lib/azure-policydefinition/test/policy-definition.integ.d.ts +9 -0
  173. package/lib/azure-policydefinition/test/policy-definition.integ.js +137 -0
  174. package/lib/azure-policydefinition/test/policy-definition.spec.d.ts +9 -0
  175. package/lib/azure-policydefinition/test/policy-definition.spec.js +596 -0
  176. package/lib/azure-privatednszone/index.d.ts +1 -0
  177. package/lib/azure-privatednszone/index.js +18 -0
  178. package/lib/azure-privatednszone/lib/index.d.ts +2 -0
  179. package/lib/azure-privatednszone/lib/index.js +19 -0
  180. package/lib/azure-privatednszone/lib/private-dns-zone-schemas.d.ts +24 -0
  181. package/lib/azure-privatednszone/lib/private-dns-zone-schemas.js +254 -0
  182. package/lib/azure-privatednszone/lib/private-dns-zone.d.ts +178 -0
  183. package/lib/azure-privatednszone/lib/private-dns-zone.js +272 -0
  184. package/lib/azure-privatednszone/test/private-dns-zone.integ.d.ts +9 -0
  185. package/lib/azure-privatednszone/test/private-dns-zone.integ.js +84 -0
  186. package/lib/azure-privatednszone/test/private-dns-zone.spec.d.ts +9 -0
  187. package/lib/azure-privatednszone/test/private-dns-zone.spec.js +341 -0
  188. package/lib/azure-privatednszonelink/index.d.ts +1 -0
  189. package/lib/azure-privatednszonelink/index.js +18 -0
  190. package/lib/azure-privatednszonelink/lib/index.d.ts +2 -0
  191. package/lib/azure-privatednszonelink/lib/index.js +19 -0
  192. package/lib/azure-privatednszonelink/lib/private-dns-zone-link-schemas.d.ts +24 -0
  193. package/lib/azure-privatednszonelink/lib/private-dns-zone-link-schemas.js +262 -0
  194. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.d.ts +202 -0
  195. package/lib/azure-privatednszonelink/lib/private-dns-zone-link.js +250 -0
  196. package/lib/azure-privatednszonelink/test/private-dns-zone-link.integ.d.ts +9 -0
  197. package/lib/azure-privatednszonelink/test/private-dns-zone-link.integ.js +110 -0
  198. package/lib/azure-privatednszonelink/test/private-dns-zone-link.spec.d.ts +9 -0
  199. package/lib/azure-privatednszonelink/test/private-dns-zone-link.spec.js +465 -0
  200. package/lib/azure-publicipaddress/index.d.ts +1 -0
  201. package/lib/azure-publicipaddress/index.js +18 -0
  202. package/lib/azure-publicipaddress/lib/index.d.ts +2 -0
  203. package/lib/azure-publicipaddress/lib/index.js +19 -0
  204. package/lib/azure-publicipaddress/lib/public-ip-address-schemas.d.ts +32 -0
  205. package/lib/azure-publicipaddress/lib/public-ip-address-schemas.js +227 -0
  206. package/lib/azure-publicipaddress/lib/public-ip-address.d.ts +247 -0
  207. package/lib/azure-publicipaddress/lib/public-ip-address.js +245 -0
  208. package/lib/azure-publicipaddress/test/public-ip-address.integ.d.ts +9 -0
  209. package/lib/azure-publicipaddress/test/public-ip-address.integ.js +75 -0
  210. package/lib/azure-publicipaddress/test/public-ip-address.spec.d.ts +15 -0
  211. package/lib/azure-publicipaddress/test/public-ip-address.spec.js +498 -0
  212. package/lib/azure-resourcegroup/index.d.ts +0 -37
  213. package/lib/azure-resourcegroup/index.js +1 -39
  214. package/lib/azure-resourcegroup/lib/index.d.ts +1 -44
  215. package/lib/azure-resourcegroup/lib/index.js +2 -43
  216. package/lib/azure-resourcegroup/lib/resource-group.d.ts +9 -23
  217. package/lib/azure-resourcegroup/lib/resource-group.js +23 -56
  218. package/lib/azure-resourcegroup/test/resource-group.integ.js +23 -11
  219. package/lib/azure-resourcegroup/test/resource-group.spec.js +13 -19
  220. package/lib/azure-roleassignment/index.d.ts +1 -0
  221. package/lib/azure-roleassignment/index.js +18 -0
  222. package/lib/azure-roleassignment/lib/index.d.ts +2 -0
  223. package/lib/azure-roleassignment/lib/index.js +19 -0
  224. package/lib/azure-roleassignment/lib/role-assignment-schemas.d.ts +25 -0
  225. package/lib/azure-roleassignment/lib/role-assignment-schemas.js +238 -0
  226. package/lib/azure-roleassignment/lib/role-assignment.d.ts +294 -0
  227. package/lib/azure-roleassignment/lib/role-assignment.js +257 -0
  228. package/lib/azure-roleassignment/test/role-assignment.integ.d.ts +12 -0
  229. package/lib/azure-roleassignment/test/role-assignment.integ.js +101 -0
  230. package/lib/azure-roleassignment/test/role-assignment.spec.d.ts +9 -0
  231. package/lib/azure-roleassignment/test/role-assignment.spec.js +633 -0
  232. package/lib/azure-roledefinition/index.d.ts +1 -0
  233. package/lib/azure-roledefinition/index.js +18 -0
  234. package/lib/azure-roledefinition/lib/index.d.ts +2 -0
  235. package/lib/azure-roledefinition/lib/index.js +19 -0
  236. package/lib/azure-roledefinition/lib/role-definition-schemas.d.ts +25 -0
  237. package/lib/azure-roledefinition/lib/role-definition-schemas.js +195 -0
  238. package/lib/azure-roledefinition/lib/role-definition.d.ts +236 -0
  239. package/lib/azure-roledefinition/lib/role-definition.js +192 -0
  240. package/lib/azure-roledefinition/test/role-definition.integ.d.ts +12 -0
  241. package/lib/azure-roledefinition/test/role-definition.integ.js +142 -0
  242. package/lib/azure-roledefinition/test/role-definition.spec.d.ts +9 -0
  243. package/lib/azure-roledefinition/test/role-definition.spec.js +946 -0
  244. package/lib/azure-storageaccount/index.d.ts +0 -19
  245. package/lib/azure-storageaccount/index.js +1 -20
  246. package/lib/azure-storageaccount/lib/index.d.ts +1 -7
  247. package/lib/azure-storageaccount/lib/index.js +2 -8
  248. package/lib/azure-storageaccount/lib/storage-account-schemas.d.ts +98 -0
  249. package/lib/azure-storageaccount/lib/storage-account-schemas.js +1 -1
  250. package/lib/azure-storageaccount/lib/storage-account.d.ts +40 -8
  251. package/lib/azure-storageaccount/lib/storage-account.js +145 -23
  252. package/lib/azure-storageaccount/test/storage-account.integ.js +91 -12
  253. package/lib/azure-subnet/index.d.ts +1 -0
  254. package/lib/azure-subnet/index.js +18 -0
  255. package/lib/azure-subnet/lib/index.d.ts +2 -0
  256. package/lib/azure-subnet/lib/index.js +19 -0
  257. package/lib/azure-subnet/lib/subnet-schemas.d.ts +32 -0
  258. package/lib/azure-subnet/lib/subnet-schemas.js +237 -0
  259. package/lib/azure-subnet/lib/subnet.d.ts +274 -0
  260. package/lib/azure-subnet/lib/subnet.js +235 -0
  261. package/lib/azure-subnet/test/subnet.integ.d.ts +11 -0
  262. package/lib/azure-subnet/test/subnet.integ.js +92 -0
  263. package/lib/azure-subnet/test/subnet.spec.d.ts +8 -0
  264. package/lib/azure-subnet/test/subnet.spec.js +395 -0
  265. package/lib/azure-virtualmachine/index.d.ts +1 -0
  266. package/lib/azure-virtualmachine/index.js +18 -0
  267. package/lib/azure-virtualmachine/lib/index.d.ts +2 -0
  268. package/lib/azure-virtualmachine/lib/index.js +19 -0
  269. package/lib/azure-virtualmachine/lib/virtual-machine-schemas.d.ts +327 -0
  270. package/lib/azure-virtualmachine/lib/virtual-machine-schemas.js +544 -0
  271. package/lib/azure-virtualmachine/lib/virtual-machine.d.ts +368 -0
  272. package/lib/azure-virtualmachine/lib/virtual-machine.js +441 -0
  273. package/lib/azure-virtualmachine/test/virtual-machine.integ.d.ts +9 -0
  274. package/lib/azure-virtualmachine/test/virtual-machine.integ.js +220 -0
  275. package/lib/azure-virtualmachine/test/virtual-machine.spec.d.ts +9 -0
  276. package/lib/azure-virtualmachine/test/virtual-machine.spec.js +1032 -0
  277. package/lib/azure-virtualnetwork/index.d.ts +1 -0
  278. package/lib/azure-virtualnetwork/index.js +18 -0
  279. package/lib/azure-virtualnetwork/lib/index.d.ts +2 -0
  280. package/lib/azure-virtualnetwork/lib/index.js +19 -0
  281. package/lib/azure-virtualnetwork/lib/virtual-network-schemas.d.ts +32 -0
  282. package/lib/azure-virtualnetwork/lib/virtual-network-schemas.js +236 -0
  283. package/lib/azure-virtualnetwork/lib/virtual-network.d.ts +204 -0
  284. package/lib/azure-virtualnetwork/lib/virtual-network.js +224 -0
  285. package/lib/azure-virtualnetwork/test/virtual-network.integ.d.ts +9 -0
  286. package/lib/azure-virtualnetwork/test/virtual-network.integ.js +91 -0
  287. package/lib/azure-virtualnetwork/test/virtual-network.spec.d.ts +8 -0
  288. package/lib/azure-virtualnetwork/test/virtual-network.spec.js +398 -0
  289. package/lib/azure-virtualnetworkmanager/index.d.ts +1 -0
  290. package/lib/azure-virtualnetworkmanager/index.js +18 -0
  291. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration-schemas.d.ts +48 -0
  292. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration-schemas.js +265 -0
  293. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.d.ts +185 -0
  294. package/lib/azure-virtualnetworkmanager/lib/connectivity-configuration.js +206 -0
  295. package/lib/azure-virtualnetworkmanager/lib/index.d.ts +14 -0
  296. package/lib/azure-virtualnetworkmanager/lib/index.js +31 -0
  297. package/lib/azure-virtualnetworkmanager/lib/network-group-schemas.d.ts +32 -0
  298. package/lib/azure-virtualnetworkmanager/lib/network-group-schemas.js +189 -0
  299. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member-schemas.d.ts +32 -0
  300. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member-schemas.js +201 -0
  301. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.d.ts +135 -0
  302. package/lib/azure-virtualnetworkmanager/lib/network-group-static-member.js +163 -0
  303. package/lib/azure-virtualnetworkmanager/lib/network-group.d.ts +139 -0
  304. package/lib/azure-virtualnetworkmanager/lib/network-group.js +158 -0
  305. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration-schemas.d.ts +32 -0
  306. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration-schemas.js +182 -0
  307. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.d.ts +144 -0
  308. package/lib/azure-virtualnetworkmanager/lib/security-admin-configuration.js +164 -0
  309. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection-schemas.d.ts +38 -0
  310. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection-schemas.js +206 -0
  311. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.d.ts +142 -0
  312. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-collection.js +162 -0
  313. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-schemas.d.ts +39 -0
  314. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule-schemas.js +359 -0
  315. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.d.ts +221 -0
  316. package/lib/azure-virtualnetworkmanager/lib/security-admin-rule.js +204 -0
  317. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager-schemas.d.ts +32 -0
  318. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager-schemas.js +236 -0
  319. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.d.ts +337 -0
  320. package/lib/azure-virtualnetworkmanager/lib/virtual-network-manager.js +283 -0
  321. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.d.ts +25 -0
  322. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.integ.js +402 -0
  323. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.d.ts +9 -0
  324. package/lib/azure-virtualnetworkmanager/test/virtual-network-manager.spec.js +1652 -0
  325. package/lib/azure-vmss/index.d.ts +1 -0
  326. package/lib/azure-vmss/index.js +18 -0
  327. package/lib/azure-vmss/lib/index.d.ts +2 -0
  328. package/lib/azure-vmss/lib/index.js +19 -0
  329. package/lib/azure-vmss/lib/virtual-machine-scale-set.d.ts +250 -0
  330. package/lib/azure-vmss/lib/virtual-machine-scale-set.js +479 -0
  331. package/lib/azure-vmss/lib/vmss-schemas.d.ts +472 -0
  332. package/lib/azure-vmss/lib/vmss-schemas.js +444 -0
  333. package/lib/azure-vmss/test/virtual-machine-scale-set.integ.d.ts +15 -0
  334. package/lib/azure-vmss/test/virtual-machine-scale-set.integ.js +261 -0
  335. package/lib/azure-vmss/test/virtual-machine-scale-set.spec.d.ts +8 -0
  336. package/lib/azure-vmss/test/virtual-machine-scale-set.spec.js +997 -0
  337. package/lib/core-azure/lib/azapi/azapi-resource-tags.spec.d.ts +10 -0
  338. package/lib/core-azure/lib/azapi/azapi-resource-tags.spec.js +218 -0
  339. package/lib/core-azure/lib/azapi/azapi-resource.d.ts +268 -48
  340. package/lib/core-azure/lib/azapi/azapi-resource.js +411 -136
  341. package/lib/core-azure/lib/azapi/azapi-resource.spec.js +2 -2
  342. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.d.ts +33 -21
  343. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-client-config/index.js +69 -27
  344. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.d.ts +134 -120
  345. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource/index.js +209 -59
  346. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource-action/index.d.ts +141 -128
  347. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource-action/index.js +183 -36
  348. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource-id/index.d.ts +55 -43
  349. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource-id/index.js +94 -26
  350. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource-list/index.d.ts +129 -116
  351. package/lib/core-azure/lib/azapi/providers-azapi/data-azapi-resource-list/index.js +155 -32
  352. package/lib/core-azure/lib/azapi/providers-azapi/data-plane-resource/index.d.ts +187 -174
  353. package/lib/core-azure/lib/azapi/providers-azapi/data-plane-resource/index.js +267 -48
  354. package/lib/core-azure/lib/azapi/providers-azapi/index.d.ts +10 -10
  355. package/lib/core-azure/lib/azapi/providers-azapi/index.js +1 -1
  356. package/lib/core-azure/lib/azapi/providers-azapi/lazy-index.d.ts +0 -0
  357. package/lib/core-azure/lib/azapi/providers-azapi/lazy-index.js +13 -0
  358. package/lib/core-azure/lib/azapi/providers-azapi/provider/index.d.ts +174 -162
  359. package/lib/core-azure/lib/azapi/providers-azapi/provider/index.js +278 -16
  360. package/lib/core-azure/lib/azapi/providers-azapi/resource/index.d.ts +239 -225
  361. package/lib/core-azure/lib/azapi/providers-azapi/resource/index.js +360 -76
  362. package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.d.ts +163 -150
  363. package/lib/core-azure/lib/azapi/providers-azapi/resource-action/index.js +221 -46
  364. package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.d.ts +162 -149
  365. package/lib/core-azure/lib/azapi/providers-azapi/update-resource/index.js +249 -50
  366. package/lib/core-azure/lib/azapi/resource-schema-validator.d.ts +118 -0
  367. package/lib/core-azure/lib/azapi/resource-schema-validator.js +236 -0
  368. package/lib/core-azure/lib/azapi/resource-version-manager.d.ts +103 -0
  369. package/lib/core-azure/lib/azapi/resource-version-manager.js +168 -0
  370. package/lib/core-azure/lib/azapi/schema-mapper/schema-mapper.js +13 -6
  371. package/lib/core-azure/lib/index.d.ts +2 -2
  372. package/lib/core-azure/lib/index.js +5 -5
  373. package/lib/core-azure/lib/version-manager/api-version-manager.js +1 -1
  374. package/lib/core-azure/lib/version-manager/interfaces/version-interfaces.js +7 -7
  375. package/lib/index.d.ts +56 -0
  376. package/lib/index.js +59 -2
  377. package/lib/testing/index.d.ts +92 -2
  378. package/lib/testing/index.js +258 -18
  379. package/lib/testing/lib/cleanup.d.ts +230 -0
  380. package/lib/testing/lib/cleanup.js +338 -0
  381. package/lib/testing/lib/metadata.d.ts +151 -0
  382. package/lib/testing/lib/metadata.js +183 -0
  383. package/lib/testing/lib/naming.d.ts +96 -0
  384. package/lib/testing/lib/naming.js +336 -0
  385. package/node_modules/uuid/LICENSE.md +9 -0
  386. package/node_modules/uuid/README.md +510 -0
  387. package/node_modules/uuid/dist/cjs/index.d.ts +15 -0
  388. package/node_modules/uuid/dist/cjs/index.js +31 -0
  389. package/node_modules/uuid/dist/cjs/max.d.ts +2 -0
  390. package/node_modules/uuid/dist/cjs/max.js +3 -0
  391. package/node_modules/uuid/dist/cjs/md5.d.ts +4 -0
  392. package/node_modules/uuid/dist/cjs/md5.js +13 -0
  393. package/node_modules/uuid/dist/cjs/native.d.ts +6 -0
  394. package/node_modules/uuid/dist/cjs/native.js +4 -0
  395. package/node_modules/uuid/dist/cjs/nil.d.ts +2 -0
  396. package/node_modules/uuid/dist/cjs/nil.js +3 -0
  397. package/node_modules/uuid/dist/cjs/package.json +1 -0
  398. package/node_modules/uuid/dist/cjs/parse.d.ts +2 -0
  399. package/node_modules/uuid/dist/cjs/parse.js +11 -0
  400. package/node_modules/uuid/dist/cjs/regex.d.ts +2 -0
  401. package/node_modules/uuid/dist/cjs/regex.js +3 -0
  402. package/node_modules/uuid/dist/cjs/rng.d.ts +1 -0
  403. package/node_modules/uuid/dist/cjs/rng.js +13 -0
  404. package/node_modules/uuid/dist/cjs/sha1.d.ts +4 -0
  405. package/node_modules/uuid/dist/cjs/sha1.js +13 -0
  406. package/node_modules/uuid/dist/cjs/stringify.d.ts +3 -0
  407. package/node_modules/uuid/dist/cjs/stringify.js +39 -0
  408. package/node_modules/uuid/dist/cjs/types.d.ts +21 -0
  409. package/node_modules/uuid/dist/cjs/types.js +2 -0
  410. package/node_modules/uuid/dist/cjs/uuid-bin.d.ts +1 -0
  411. package/node_modules/uuid/dist/cjs/uuid-bin.js +72 -0
  412. package/node_modules/uuid/dist/cjs/v1.d.ts +11 -0
  413. package/node_modules/uuid/dist/cjs/v1.js +87 -0
  414. package/node_modules/uuid/dist/cjs/v1ToV6.d.ts +2 -0
  415. package/node_modules/uuid/dist/cjs/v1ToV6.js +13 -0
  416. package/node_modules/uuid/dist/cjs/v3.d.ts +9 -0
  417. package/node_modules/uuid/dist/cjs/v3.js +14 -0
  418. package/node_modules/uuid/dist/cjs/v35.d.ts +7 -0
  419. package/node_modules/uuid/dist/cjs/v35.js +41 -0
  420. package/node_modules/uuid/dist/cjs/v4.d.ts +4 -0
  421. package/node_modules/uuid/dist/cjs/v4.js +29 -0
  422. package/node_modules/uuid/dist/cjs/v5.d.ts +9 -0
  423. package/node_modules/uuid/dist/cjs/v5.js +14 -0
  424. package/node_modules/uuid/dist/cjs/v6.d.ts +4 -0
  425. package/node_modules/uuid/dist/cjs/v6.js +19 -0
  426. package/node_modules/uuid/dist/cjs/v6ToV1.d.ts +2 -0
  427. package/node_modules/uuid/dist/cjs/v6ToV1.js +13 -0
  428. package/node_modules/uuid/dist/cjs/v7.d.ts +9 -0
  429. package/node_modules/uuid/dist/cjs/v7.js +69 -0
  430. package/node_modules/uuid/dist/cjs/validate.d.ts +2 -0
  431. package/node_modules/uuid/dist/cjs/validate.js +7 -0
  432. package/node_modules/uuid/dist/cjs/version.d.ts +2 -0
  433. package/node_modules/uuid/dist/cjs/version.js +10 -0
  434. package/node_modules/uuid/dist/cjs-browser/index.d.ts +15 -0
  435. package/node_modules/uuid/dist/cjs-browser/index.js +31 -0
  436. package/node_modules/uuid/dist/cjs-browser/max.d.ts +2 -0
  437. package/node_modules/uuid/dist/cjs-browser/max.js +3 -0
  438. package/node_modules/uuid/dist/cjs-browser/md5.d.ts +2 -0
  439. package/node_modules/uuid/dist/cjs-browser/md5.js +137 -0
  440. package/node_modules/uuid/dist/cjs-browser/native.d.ts +4 -0
  441. package/node_modules/uuid/dist/cjs-browser/native.js +4 -0
  442. package/node_modules/uuid/dist/cjs-browser/nil.d.ts +2 -0
  443. package/node_modules/uuid/dist/cjs-browser/nil.js +3 -0
  444. package/node_modules/uuid/dist/cjs-browser/package.json +1 -0
  445. package/node_modules/uuid/dist/cjs-browser/parse.d.ts +2 -0
  446. package/node_modules/uuid/dist/cjs-browser/parse.js +11 -0
  447. package/node_modules/uuid/dist/cjs-browser/regex.d.ts +2 -0
  448. package/node_modules/uuid/dist/cjs-browser/regex.js +3 -0
  449. package/node_modules/uuid/dist/cjs-browser/rng.d.ts +1 -0
  450. package/node_modules/uuid/dist/cjs-browser/rng.js +14 -0
  451. package/node_modules/uuid/dist/cjs-browser/sha1.d.ts +2 -0
  452. package/node_modules/uuid/dist/cjs-browser/sha1.js +72 -0
  453. package/node_modules/uuid/dist/cjs-browser/stringify.d.ts +3 -0
  454. package/node_modules/uuid/dist/cjs-browser/stringify.js +39 -0
  455. package/node_modules/uuid/dist/cjs-browser/types.d.ts +21 -0
  456. package/node_modules/uuid/dist/cjs-browser/types.js +2 -0
  457. package/node_modules/uuid/dist/cjs-browser/uuid-bin.d.ts +1 -0
  458. package/node_modules/uuid/dist/cjs-browser/uuid-bin.js +72 -0
  459. package/node_modules/uuid/dist/cjs-browser/v1.d.ts +11 -0
  460. package/node_modules/uuid/dist/cjs-browser/v1.js +87 -0
  461. package/node_modules/uuid/dist/cjs-browser/v1ToV6.d.ts +2 -0
  462. package/node_modules/uuid/dist/cjs-browser/v1ToV6.js +13 -0
  463. package/node_modules/uuid/dist/cjs-browser/v3.d.ts +9 -0
  464. package/node_modules/uuid/dist/cjs-browser/v3.js +14 -0
  465. package/node_modules/uuid/dist/cjs-browser/v35.d.ts +7 -0
  466. package/node_modules/uuid/dist/cjs-browser/v35.js +41 -0
  467. package/node_modules/uuid/dist/cjs-browser/v4.d.ts +4 -0
  468. package/node_modules/uuid/dist/cjs-browser/v4.js +29 -0
  469. package/node_modules/uuid/dist/cjs-browser/v5.d.ts +9 -0
  470. package/node_modules/uuid/dist/cjs-browser/v5.js +14 -0
  471. package/node_modules/uuid/dist/cjs-browser/v6.d.ts +4 -0
  472. package/node_modules/uuid/dist/cjs-browser/v6.js +19 -0
  473. package/node_modules/uuid/dist/cjs-browser/v6ToV1.d.ts +2 -0
  474. package/node_modules/uuid/dist/cjs-browser/v6ToV1.js +13 -0
  475. package/node_modules/uuid/dist/cjs-browser/v7.d.ts +9 -0
  476. package/node_modules/uuid/dist/cjs-browser/v7.js +69 -0
  477. package/node_modules/uuid/dist/cjs-browser/validate.d.ts +2 -0
  478. package/node_modules/uuid/dist/cjs-browser/validate.js +7 -0
  479. package/node_modules/uuid/dist/cjs-browser/version.d.ts +2 -0
  480. package/node_modules/uuid/dist/cjs-browser/version.js +10 -0
  481. package/node_modules/uuid/dist/esm/bin/uuid +2 -0
  482. package/node_modules/uuid/dist/esm/index.d.ts +15 -0
  483. package/node_modules/uuid/dist/esm/index.js +14 -0
  484. package/node_modules/uuid/dist/esm/max.d.ts +2 -0
  485. package/node_modules/uuid/dist/esm/max.js +1 -0
  486. package/node_modules/uuid/dist/esm/md5.d.ts +4 -0
  487. package/node_modules/uuid/dist/esm/md5.js +11 -0
  488. package/node_modules/uuid/dist/esm/native.d.ts +6 -0
  489. package/node_modules/uuid/dist/esm/native.js +2 -0
  490. package/node_modules/uuid/dist/esm/nil.d.ts +2 -0
  491. package/node_modules/uuid/dist/esm/nil.js +1 -0
  492. package/node_modules/uuid/dist/esm/parse.d.ts +2 -0
  493. package/node_modules/uuid/dist/esm/parse.js +9 -0
  494. package/node_modules/uuid/dist/esm/regex.d.ts +2 -0
  495. package/node_modules/uuid/dist/esm/regex.js +1 -0
  496. package/node_modules/uuid/dist/esm/rng.d.ts +1 -0
  497. package/node_modules/uuid/dist/esm/rng.js +10 -0
  498. package/node_modules/uuid/dist/esm/sha1.d.ts +4 -0
  499. package/node_modules/uuid/dist/esm/sha1.js +11 -0
  500. package/node_modules/uuid/dist/esm/stringify.d.ts +3 -0
  501. package/node_modules/uuid/dist/esm/stringify.js +35 -0
  502. package/node_modules/uuid/dist/esm/types.d.ts +21 -0
  503. package/node_modules/uuid/dist/esm/types.js +1 -0
  504. package/node_modules/uuid/dist/esm/uuid-bin.d.ts +1 -0
  505. package/node_modules/uuid/dist/esm/uuid-bin.js +70 -0
  506. package/node_modules/uuid/dist/esm/v1.d.ts +11 -0
  507. package/node_modules/uuid/dist/esm/v1.js +83 -0
  508. package/node_modules/uuid/dist/esm/v1ToV6.d.ts +2 -0
  509. package/node_modules/uuid/dist/esm/v1ToV6.js +10 -0
  510. package/node_modules/uuid/dist/esm/v3.d.ts +9 -0
  511. package/node_modules/uuid/dist/esm/v3.js +9 -0
  512. package/node_modules/uuid/dist/esm/v35.d.ts +7 -0
  513. package/node_modules/uuid/dist/esm/v35.js +36 -0
  514. package/node_modules/uuid/dist/esm/v4.d.ts +4 -0
  515. package/node_modules/uuid/dist/esm/v4.js +27 -0
  516. package/node_modules/uuid/dist/esm/v5.d.ts +9 -0
  517. package/node_modules/uuid/dist/esm/v5.js +9 -0
  518. package/node_modules/uuid/dist/esm/v6.d.ts +4 -0
  519. package/node_modules/uuid/dist/esm/v6.js +17 -0
  520. package/node_modules/uuid/dist/esm/v6ToV1.d.ts +2 -0
  521. package/node_modules/uuid/dist/esm/v6ToV1.js +10 -0
  522. package/node_modules/uuid/dist/esm/v7.d.ts +9 -0
  523. package/node_modules/uuid/dist/esm/v7.js +65 -0
  524. package/node_modules/uuid/dist/esm/validate.d.ts +2 -0
  525. package/node_modules/uuid/dist/esm/validate.js +5 -0
  526. package/node_modules/uuid/dist/esm/version.d.ts +2 -0
  527. package/node_modules/uuid/dist/esm/version.js +8 -0
  528. package/node_modules/uuid/dist/esm-browser/index.d.ts +15 -0
  529. package/node_modules/uuid/dist/esm-browser/index.js +14 -0
  530. package/node_modules/uuid/dist/esm-browser/max.d.ts +2 -0
  531. package/node_modules/uuid/dist/esm-browser/max.js +1 -0
  532. package/node_modules/uuid/dist/esm-browser/md5.d.ts +2 -0
  533. package/node_modules/uuid/dist/esm-browser/md5.js +135 -0
  534. package/node_modules/uuid/dist/esm-browser/native.d.ts +4 -0
  535. package/node_modules/uuid/dist/esm-browser/native.js +2 -0
  536. package/node_modules/uuid/dist/esm-browser/nil.d.ts +2 -0
  537. package/node_modules/uuid/dist/esm-browser/nil.js +1 -0
  538. package/node_modules/uuid/dist/esm-browser/parse.d.ts +2 -0
  539. package/node_modules/uuid/dist/esm-browser/parse.js +9 -0
  540. package/node_modules/uuid/dist/esm-browser/regex.d.ts +2 -0
  541. package/node_modules/uuid/dist/esm-browser/regex.js +1 -0
  542. package/node_modules/uuid/dist/esm-browser/rng.d.ts +1 -0
  543. package/node_modules/uuid/dist/esm-browser/rng.js +11 -0
  544. package/node_modules/uuid/dist/esm-browser/sha1.d.ts +2 -0
  545. package/node_modules/uuid/dist/esm-browser/sha1.js +70 -0
  546. package/node_modules/uuid/dist/esm-browser/stringify.d.ts +3 -0
  547. package/node_modules/uuid/dist/esm-browser/stringify.js +35 -0
  548. package/node_modules/uuid/dist/esm-browser/types.d.ts +21 -0
  549. package/node_modules/uuid/dist/esm-browser/types.js +1 -0
  550. package/node_modules/uuid/dist/esm-browser/uuid-bin.d.ts +1 -0
  551. package/node_modules/uuid/dist/esm-browser/uuid-bin.js +70 -0
  552. package/node_modules/uuid/dist/esm-browser/v1.d.ts +11 -0
  553. package/node_modules/uuid/dist/esm-browser/v1.js +83 -0
  554. package/node_modules/uuid/dist/esm-browser/v1ToV6.d.ts +2 -0
  555. package/node_modules/uuid/dist/esm-browser/v1ToV6.js +10 -0
  556. package/node_modules/uuid/dist/esm-browser/v3.d.ts +9 -0
  557. package/node_modules/uuid/dist/esm-browser/v3.js +9 -0
  558. package/node_modules/uuid/dist/esm-browser/v35.d.ts +7 -0
  559. package/node_modules/uuid/dist/esm-browser/v35.js +36 -0
  560. package/node_modules/uuid/dist/esm-browser/v4.d.ts +4 -0
  561. package/node_modules/uuid/dist/esm-browser/v4.js +27 -0
  562. package/node_modules/uuid/dist/esm-browser/v5.d.ts +9 -0
  563. package/node_modules/uuid/dist/esm-browser/v5.js +9 -0
  564. package/node_modules/uuid/dist/esm-browser/v6.d.ts +4 -0
  565. package/node_modules/uuid/dist/esm-browser/v6.js +17 -0
  566. package/node_modules/uuid/dist/esm-browser/v6ToV1.d.ts +2 -0
  567. package/node_modules/uuid/dist/esm-browser/v6ToV1.js +10 -0
  568. package/node_modules/uuid/dist/esm-browser/v7.d.ts +9 -0
  569. package/node_modules/uuid/dist/esm-browser/v7.js +65 -0
  570. package/node_modules/uuid/dist/esm-browser/validate.d.ts +2 -0
  571. package/node_modules/uuid/dist/esm-browser/validate.js +5 -0
  572. package/node_modules/uuid/dist/esm-browser/version.d.ts +2 -0
  573. package/node_modules/uuid/dist/esm-browser/version.js +8 -0
  574. package/node_modules/uuid/package.json +132 -0
  575. package/package.json +17 -12
  576. package/scripts/cleanup-test-resources.ts +387 -0
  577. package/scripts/generate-index.js +25 -8
@@ -0,0 +1,655 @@
1
+ "use strict";
2
+ /**
3
+ * Comprehensive tests for the Network Interface implementation
4
+ *
5
+ * This test suite validates the NetworkInterface class using the AzapiResource framework.
6
+ * Tests cover automatic version resolution, explicit version pinning, schema validation,
7
+ * property transformation, and resource creation.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ const cdktf_1 = require("cdktf");
11
+ const cdktf = require("cdktf");
12
+ const network_interface_1 = require("../lib/network-interface");
13
+ describe("NetworkInterface - Implementation", () => {
14
+ let app;
15
+ let stack;
16
+ beforeEach(() => {
17
+ app = cdktf_1.Testing.app();
18
+ stack = new cdktf.TerraformStack(app, "TestStack");
19
+ });
20
+ describe("Constructor and Basic Properties", () => {
21
+ it("should create network interface with automatic latest version resolution", () => {
22
+ const props = {
23
+ name: "test-nic",
24
+ location: "eastus",
25
+ ipConfigurations: [
26
+ {
27
+ name: "ipconfig1",
28
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
29
+ privateIPAllocationMethod: "Dynamic",
30
+ primary: true,
31
+ },
32
+ ],
33
+ };
34
+ const nic = new network_interface_1.NetworkInterface(stack, "TestNIC", props);
35
+ expect(nic).toBeInstanceOf(network_interface_1.NetworkInterface);
36
+ expect(nic.props).toBe(props);
37
+ expect(nic.name).toBe("test-nic");
38
+ expect(nic.location).toBe("eastus");
39
+ });
40
+ it("should create network interface with explicit version pinning", () => {
41
+ const props = {
42
+ name: "test-nic-pinned",
43
+ location: "westus",
44
+ apiVersion: "2024-07-01",
45
+ ipConfigurations: [
46
+ {
47
+ name: "ipconfig1",
48
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
49
+ privateIPAllocationMethod: "Dynamic",
50
+ primary: true,
51
+ },
52
+ ],
53
+ tags: { environment: "test" },
54
+ };
55
+ const nic = new network_interface_1.NetworkInterface(stack, "TestNIC", props);
56
+ expect(nic.resolvedApiVersion).toBe("2024-07-01");
57
+ expect(nic.tags).toEqual({ environment: "test" });
58
+ });
59
+ it("should create network interface with all optional properties", () => {
60
+ const props = {
61
+ name: "test-nic-full",
62
+ location: "centralus",
63
+ ipConfigurations: [
64
+ {
65
+ name: "ipconfig1",
66
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
67
+ privateIPAllocationMethod: "Static",
68
+ privateIPAddress: "10.0.1.4",
69
+ publicIPAddress: { id: "/subscriptions/test/publicIPs/pip1" },
70
+ primary: true,
71
+ },
72
+ ],
73
+ networkSecurityGroup: { id: "/subscriptions/test/nsgs/nsg1" },
74
+ enableAcceleratedNetworking: true,
75
+ enableIPForwarding: true,
76
+ dnsSettings: {
77
+ dnsServers: ["10.0.0.4", "10.0.0.5"],
78
+ internalDnsNameLabel: "myvm",
79
+ },
80
+ tags: {
81
+ environment: "production",
82
+ project: "networking",
83
+ owner: "team@company.com",
84
+ },
85
+ ignoreChanges: ["tags"],
86
+ };
87
+ const nic = new network_interface_1.NetworkInterface(stack, "TestNIC", props);
88
+ expect(nic.props.ipConfigurations).toEqual(props.ipConfigurations);
89
+ expect(nic.props.networkSecurityGroup).toEqual(props.networkSecurityGroup);
90
+ expect(nic.props.enableAcceleratedNetworking).toBe(true);
91
+ expect(nic.props.enableIPForwarding).toBe(true);
92
+ expect(nic.props.dnsSettings).toEqual(props.dnsSettings);
93
+ expect(nic.props.tags).toEqual(props.tags);
94
+ });
95
+ it("should use default name when name is not provided", () => {
96
+ const props = {
97
+ location: "eastus",
98
+ ipConfigurations: [
99
+ {
100
+ name: "ipconfig1",
101
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
102
+ privateIPAllocationMethod: "Dynamic",
103
+ primary: true,
104
+ },
105
+ ],
106
+ };
107
+ const nic = new network_interface_1.NetworkInterface(stack, "TestNIC", props);
108
+ expect(nic.name).toBe("TestNIC");
109
+ });
110
+ });
111
+ describe("Resource Type and API Versions", () => {
112
+ it("should have correct resource type", () => {
113
+ const nic = new network_interface_1.NetworkInterface(stack, "TestNIC", {
114
+ name: "test-nic",
115
+ location: "eastus",
116
+ ipConfigurations: [
117
+ {
118
+ name: "ipconfig1",
119
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
120
+ privateIPAllocationMethod: "Dynamic",
121
+ primary: true,
122
+ },
123
+ ],
124
+ });
125
+ expect(nic).toBeInstanceOf(network_interface_1.NetworkInterface);
126
+ });
127
+ it("should support all registered API versions", () => {
128
+ const versions = ["2024-07-01", "2024-10-01"];
129
+ versions.forEach((version) => {
130
+ const nic = new network_interface_1.NetworkInterface(stack, `NIC-${version.replace(/-/g, "")}`, {
131
+ name: `nic-${version}`,
132
+ location: "eastus",
133
+ apiVersion: version,
134
+ ipConfigurations: [
135
+ {
136
+ name: "ipconfig1",
137
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
138
+ privateIPAllocationMethod: "Dynamic",
139
+ primary: true,
140
+ },
141
+ ],
142
+ });
143
+ expect(nic.resolvedApiVersion).toBe(version);
144
+ });
145
+ });
146
+ it("should use latest version as default", () => {
147
+ const nic = new network_interface_1.NetworkInterface(stack, "TestNIC", {
148
+ name: "test-nic",
149
+ location: "eastus",
150
+ ipConfigurations: [
151
+ {
152
+ name: "ipconfig1",
153
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
154
+ privateIPAllocationMethod: "Dynamic",
155
+ primary: true,
156
+ },
157
+ ],
158
+ });
159
+ expect(nic.resolvedApiVersion).toBe("2024-10-01");
160
+ });
161
+ });
162
+ describe("IP Configuration", () => {
163
+ it("should create NIC with single dynamic IP configuration", () => {
164
+ const nic = new network_interface_1.NetworkInterface(stack, "SingleDynamic", {
165
+ name: "nic-single-dynamic",
166
+ location: "eastus",
167
+ ipConfigurations: [
168
+ {
169
+ name: "ipconfig1",
170
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
171
+ privateIPAllocationMethod: "Dynamic",
172
+ primary: true,
173
+ },
174
+ ],
175
+ });
176
+ expect(nic.props.ipConfigurations).toHaveLength(1);
177
+ expect(nic.props.ipConfigurations[0].privateIPAllocationMethod).toBe("Dynamic");
178
+ expect(nic.props.ipConfigurations[0].primary).toBe(true);
179
+ });
180
+ it("should create NIC with static private IP", () => {
181
+ const nic = new network_interface_1.NetworkInterface(stack, "StaticIP", {
182
+ name: "nic-static",
183
+ location: "eastus",
184
+ ipConfigurations: [
185
+ {
186
+ name: "ipconfig1",
187
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
188
+ privateIPAllocationMethod: "Static",
189
+ privateIPAddress: "10.0.1.4",
190
+ primary: true,
191
+ },
192
+ ],
193
+ });
194
+ expect(nic.props.ipConfigurations[0].privateIPAllocationMethod).toBe("Static");
195
+ expect(nic.props.ipConfigurations[0].privateIPAddress).toBe("10.0.1.4");
196
+ });
197
+ it("should create NIC with public IP address", () => {
198
+ const nic = new network_interface_1.NetworkInterface(stack, "WithPublicIP", {
199
+ name: "nic-public-ip",
200
+ location: "eastus",
201
+ ipConfigurations: [
202
+ {
203
+ name: "ipconfig1",
204
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
205
+ privateIPAllocationMethod: "Dynamic",
206
+ publicIPAddress: { id: "/subscriptions/test/publicIPs/pip1" },
207
+ primary: true,
208
+ },
209
+ ],
210
+ });
211
+ expect(nic.props.ipConfigurations[0].publicIPAddress).toBeDefined();
212
+ expect(nic.props.ipConfigurations[0].publicIPAddress?.id).toBe("/subscriptions/test/publicIPs/pip1");
213
+ });
214
+ it("should create NIC with multiple IP configurations", () => {
215
+ const nic = new network_interface_1.NetworkInterface(stack, "MultipleIPs", {
216
+ name: "nic-multiple-ips",
217
+ location: "eastus",
218
+ ipConfigurations: [
219
+ {
220
+ name: "ipconfig1",
221
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
222
+ privateIPAllocationMethod: "Dynamic",
223
+ primary: true,
224
+ },
225
+ {
226
+ name: "ipconfig2",
227
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
228
+ privateIPAllocationMethod: "Static",
229
+ privateIPAddress: "10.0.1.5",
230
+ primary: false,
231
+ },
232
+ ],
233
+ });
234
+ expect(nic.props.ipConfigurations).toHaveLength(2);
235
+ expect(nic.props.ipConfigurations[0].primary).toBe(true);
236
+ expect(nic.props.ipConfigurations[1].primary).toBe(false);
237
+ });
238
+ });
239
+ describe("Network Security Group Association", () => {
240
+ it("should create NIC with NSG attached", () => {
241
+ const nic = new network_interface_1.NetworkInterface(stack, "WithNSG", {
242
+ name: "nic-with-nsg",
243
+ location: "eastus",
244
+ ipConfigurations: [
245
+ {
246
+ name: "ipconfig1",
247
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
248
+ privateIPAllocationMethod: "Dynamic",
249
+ primary: true,
250
+ },
251
+ ],
252
+ networkSecurityGroup: { id: "/subscriptions/test/nsgs/nsg1" },
253
+ });
254
+ expect(nic.props.networkSecurityGroup).toBeDefined();
255
+ expect(nic.props.networkSecurityGroup?.id).toBe("/subscriptions/test/nsgs/nsg1");
256
+ });
257
+ it("should create NIC without NSG", () => {
258
+ const nic = new network_interface_1.NetworkInterface(stack, "WithoutNSG", {
259
+ name: "nic-no-nsg",
260
+ location: "eastus",
261
+ ipConfigurations: [
262
+ {
263
+ name: "ipconfig1",
264
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
265
+ privateIPAllocationMethod: "Dynamic",
266
+ primary: true,
267
+ },
268
+ ],
269
+ });
270
+ expect(nic.props.networkSecurityGroup).toBeUndefined();
271
+ });
272
+ });
273
+ describe("Accelerated Networking", () => {
274
+ it("should create NIC with accelerated networking enabled", () => {
275
+ const nic = new network_interface_1.NetworkInterface(stack, "AcceleratedNetworking", {
276
+ name: "nic-accelerated",
277
+ location: "eastus",
278
+ ipConfigurations: [
279
+ {
280
+ name: "ipconfig1",
281
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
282
+ privateIPAllocationMethod: "Dynamic",
283
+ primary: true,
284
+ },
285
+ ],
286
+ enableAcceleratedNetworking: true,
287
+ });
288
+ expect(nic.props.enableAcceleratedNetworking).toBe(true);
289
+ });
290
+ it("should default accelerated networking to false", () => {
291
+ const nic = new network_interface_1.NetworkInterface(stack, "DefaultAccelerated", {
292
+ name: "nic-default-accelerated",
293
+ location: "eastus",
294
+ ipConfigurations: [
295
+ {
296
+ name: "ipconfig1",
297
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
298
+ privateIPAllocationMethod: "Dynamic",
299
+ primary: true,
300
+ },
301
+ ],
302
+ });
303
+ expect(nic.props.enableAcceleratedNetworking).toBeUndefined();
304
+ });
305
+ });
306
+ describe("IP Forwarding", () => {
307
+ it("should create NIC with IP forwarding enabled (for NVAs)", () => {
308
+ const nic = new network_interface_1.NetworkInterface(stack, "IPForwarding", {
309
+ name: "nic-ip-forwarding",
310
+ location: "eastus",
311
+ ipConfigurations: [
312
+ {
313
+ name: "ipconfig1",
314
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
315
+ privateIPAllocationMethod: "Dynamic",
316
+ primary: true,
317
+ },
318
+ ],
319
+ enableIPForwarding: true,
320
+ });
321
+ expect(nic.props.enableIPForwarding).toBe(true);
322
+ });
323
+ it("should default IP forwarding to false", () => {
324
+ const nic = new network_interface_1.NetworkInterface(stack, "DefaultIPForwarding", {
325
+ name: "nic-default-forwarding",
326
+ location: "eastus",
327
+ ipConfigurations: [
328
+ {
329
+ name: "ipconfig1",
330
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
331
+ privateIPAllocationMethod: "Dynamic",
332
+ primary: true,
333
+ },
334
+ ],
335
+ });
336
+ expect(nic.props.enableIPForwarding).toBeUndefined();
337
+ });
338
+ });
339
+ describe("DNS Settings Configuration", () => {
340
+ it("should create NIC with custom DNS servers", () => {
341
+ const nic = new network_interface_1.NetworkInterface(stack, "CustomDNS", {
342
+ name: "nic-dns",
343
+ location: "eastus",
344
+ ipConfigurations: [
345
+ {
346
+ name: "ipconfig1",
347
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
348
+ privateIPAllocationMethod: "Dynamic",
349
+ primary: true,
350
+ },
351
+ ],
352
+ dnsSettings: {
353
+ dnsServers: ["8.8.8.8", "8.8.4.4"],
354
+ },
355
+ });
356
+ expect(nic.props.dnsSettings).toBeDefined();
357
+ expect(nic.props.dnsSettings?.dnsServers).toEqual(["8.8.8.8", "8.8.4.4"]);
358
+ });
359
+ it("should create NIC with internal DNS name label", () => {
360
+ const nic = new network_interface_1.NetworkInterface(stack, "InternalDNS", {
361
+ name: "nic-internal-dns",
362
+ location: "eastus",
363
+ ipConfigurations: [
364
+ {
365
+ name: "ipconfig1",
366
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
367
+ privateIPAllocationMethod: "Dynamic",
368
+ primary: true,
369
+ },
370
+ ],
371
+ dnsSettings: {
372
+ internalDnsNameLabel: "myvm",
373
+ },
374
+ });
375
+ expect(nic.props.dnsSettings?.internalDnsNameLabel).toBe("myvm");
376
+ });
377
+ it("should create NIC without DNS settings", () => {
378
+ const nic = new network_interface_1.NetworkInterface(stack, "NoDNS", {
379
+ name: "nic-no-dns",
380
+ location: "eastus",
381
+ ipConfigurations: [
382
+ {
383
+ name: "ipconfig1",
384
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
385
+ privateIPAllocationMethod: "Dynamic",
386
+ primary: true,
387
+ },
388
+ ],
389
+ });
390
+ expect(nic.props.dnsSettings).toBeUndefined();
391
+ });
392
+ });
393
+ describe("Tags Management", () => {
394
+ it("should create NIC with tags", () => {
395
+ const nic = new network_interface_1.NetworkInterface(stack, "TaggedNIC", {
396
+ name: "nic-tagged",
397
+ location: "eastus",
398
+ ipConfigurations: [
399
+ {
400
+ name: "ipconfig1",
401
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
402
+ privateIPAllocationMethod: "Dynamic",
403
+ primary: true,
404
+ },
405
+ ],
406
+ tags: {
407
+ environment: "production",
408
+ cost_center: "engineering",
409
+ },
410
+ });
411
+ expect(nic.props.tags).toEqual({
412
+ environment: "production",
413
+ cost_center: "engineering",
414
+ });
415
+ });
416
+ it("should support adding tags", () => {
417
+ const nic = new network_interface_1.NetworkInterface(stack, "AddTag", {
418
+ name: "nic-add-tag",
419
+ location: "eastus",
420
+ ipConfigurations: [
421
+ {
422
+ name: "ipconfig1",
423
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
424
+ privateIPAllocationMethod: "Dynamic",
425
+ primary: true,
426
+ },
427
+ ],
428
+ tags: { environment: "test" },
429
+ });
430
+ nic.addTag("newTag", "newValue");
431
+ expect(nic.props.tags.newTag).toBe("newValue");
432
+ expect(nic.props.tags.environment).toBe("test");
433
+ });
434
+ it("should support removing tags", () => {
435
+ const nic = new network_interface_1.NetworkInterface(stack, "RemoveTag", {
436
+ name: "nic-remove-tag",
437
+ location: "eastus",
438
+ ipConfigurations: [
439
+ {
440
+ name: "ipconfig1",
441
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
442
+ privateIPAllocationMethod: "Dynamic",
443
+ primary: true,
444
+ },
445
+ ],
446
+ tags: {
447
+ environment: "test",
448
+ temporary: "true",
449
+ },
450
+ });
451
+ nic.removeTag("temporary");
452
+ expect(nic.props.tags.temporary).toBeUndefined();
453
+ expect(nic.props.tags.environment).toBe("test");
454
+ });
455
+ });
456
+ describe("Terraform Outputs", () => {
457
+ it("should create Terraform outputs", () => {
458
+ const nic = new network_interface_1.NetworkInterface(stack, "OutputTest", {
459
+ name: "nic-outputs",
460
+ location: "eastus",
461
+ ipConfigurations: [
462
+ {
463
+ name: "ipconfig1",
464
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
465
+ privateIPAllocationMethod: "Dynamic",
466
+ primary: true,
467
+ },
468
+ ],
469
+ });
470
+ expect(nic.idOutput).toBeInstanceOf(cdktf.TerraformOutput);
471
+ expect(nic.nameOutput).toBeInstanceOf(cdktf.TerraformOutput);
472
+ expect(nic.locationOutput).toBeInstanceOf(cdktf.TerraformOutput);
473
+ expect(nic.tagsOutput).toBeInstanceOf(cdktf.TerraformOutput);
474
+ });
475
+ it("should have correct id format", () => {
476
+ const nic = new network_interface_1.NetworkInterface(stack, "IdFormat", {
477
+ name: "nic-id",
478
+ location: "eastus",
479
+ ipConfigurations: [
480
+ {
481
+ name: "ipconfig1",
482
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
483
+ privateIPAllocationMethod: "Dynamic",
484
+ primary: true,
485
+ },
486
+ ],
487
+ });
488
+ expect(nic.id).toMatch(/^\$\{.*\.id\}$/);
489
+ });
490
+ });
491
+ describe("Version Compatibility", () => {
492
+ it("should work with all supported API versions", () => {
493
+ const versions = ["2024-07-01", "2024-10-01"];
494
+ versions.forEach((version) => {
495
+ const nic = new network_interface_1.NetworkInterface(stack, `NIC-${version.replace(/-/g, "")}`, {
496
+ name: `nic-${version}`,
497
+ location: "eastus",
498
+ apiVersion: version,
499
+ ipConfigurations: [
500
+ {
501
+ name: "ipconfig1",
502
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
503
+ privateIPAllocationMethod: "Dynamic",
504
+ primary: true,
505
+ },
506
+ ],
507
+ });
508
+ expect(nic.resolvedApiVersion).toBe(version);
509
+ });
510
+ });
511
+ });
512
+ describe("Ignore Changes Configuration", () => {
513
+ it("should apply ignore changes lifecycle rules", () => {
514
+ const nic = new network_interface_1.NetworkInterface(stack, "IgnoreChanges", {
515
+ name: "nic-ignore",
516
+ location: "eastus",
517
+ ipConfigurations: [
518
+ {
519
+ name: "ipconfig1",
520
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
521
+ privateIPAllocationMethod: "Dynamic",
522
+ primary: true,
523
+ },
524
+ ],
525
+ ignoreChanges: ["tags", "dnsSettings"],
526
+ });
527
+ expect(nic).toBeInstanceOf(network_interface_1.NetworkInterface);
528
+ expect(nic.props.ignoreChanges).toEqual(["tags", "dnsSettings"]);
529
+ });
530
+ it("should handle empty ignore changes array", () => {
531
+ const nic = new network_interface_1.NetworkInterface(stack, "EmptyIgnore", {
532
+ name: "nic-empty-ignore",
533
+ location: "eastus",
534
+ ipConfigurations: [
535
+ {
536
+ name: "ipconfig1",
537
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
538
+ privateIPAllocationMethod: "Dynamic",
539
+ primary: true,
540
+ },
541
+ ],
542
+ ignoreChanges: [],
543
+ });
544
+ expect(nic).toBeInstanceOf(network_interface_1.NetworkInterface);
545
+ });
546
+ });
547
+ describe("CDK Terraform Integration", () => {
548
+ it("should synthesize to valid Terraform configuration", () => {
549
+ new network_interface_1.NetworkInterface(stack, "SynthTest", {
550
+ name: "nic-synth",
551
+ location: "eastus",
552
+ ipConfigurations: [
553
+ {
554
+ name: "ipconfig1",
555
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
556
+ privateIPAllocationMethod: "Dynamic",
557
+ primary: true,
558
+ },
559
+ ],
560
+ tags: { test: "synthesis" },
561
+ });
562
+ const synthesized = cdktf_1.Testing.synth(stack);
563
+ expect(synthesized).toBeDefined();
564
+ const stackConfig = JSON.parse(synthesized);
565
+ expect(stackConfig.resource).toBeDefined();
566
+ });
567
+ it("should handle multiple NICs in the same stack", () => {
568
+ const nic1 = new network_interface_1.NetworkInterface(stack, "NIC1", {
569
+ name: "nic-1",
570
+ location: "eastus",
571
+ ipConfigurations: [
572
+ {
573
+ name: "ipconfig1",
574
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
575
+ privateIPAllocationMethod: "Dynamic",
576
+ primary: true,
577
+ },
578
+ ],
579
+ });
580
+ const nic2 = new network_interface_1.NetworkInterface(stack, "NIC2", {
581
+ name: "nic-2",
582
+ location: "westus",
583
+ apiVersion: "2024-07-01",
584
+ ipConfigurations: [
585
+ {
586
+ name: "ipconfig1",
587
+ subnet: { id: "/subscriptions/test/subnets/subnet2" },
588
+ privateIPAllocationMethod: "Static",
589
+ privateIPAddress: "10.1.1.4",
590
+ primary: true,
591
+ },
592
+ ],
593
+ });
594
+ expect(nic1.resolvedApiVersion).toBe("2024-10-01");
595
+ expect(nic2.resolvedApiVersion).toBe("2024-07-01");
596
+ const synthesized = cdktf_1.Testing.synth(stack);
597
+ expect(synthesized).toBeDefined();
598
+ });
599
+ });
600
+ describe("Complete Networking Scenarios", () => {
601
+ it("should create VM NIC with all networking components", () => {
602
+ const nic = new network_interface_1.NetworkInterface(stack, "CompleteNIC", {
603
+ name: "vm-nic-complete",
604
+ location: "eastus",
605
+ ipConfigurations: [
606
+ {
607
+ name: "ipconfig1",
608
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
609
+ privateIPAllocationMethod: "Static",
610
+ privateIPAddress: "10.0.1.4",
611
+ publicIPAddress: { id: "/subscriptions/test/publicIPs/pip1" },
612
+ primary: true,
613
+ },
614
+ ],
615
+ networkSecurityGroup: { id: "/subscriptions/test/nsgs/nsg1" },
616
+ enableAcceleratedNetworking: true,
617
+ dnsSettings: {
618
+ dnsServers: ["10.0.0.4"],
619
+ internalDnsNameLabel: "myvm",
620
+ },
621
+ tags: {
622
+ environment: "production",
623
+ role: "web-server",
624
+ },
625
+ });
626
+ expect(nic.props.ipConfigurations[0].publicIPAddress).toBeDefined();
627
+ expect(nic.props.networkSecurityGroup).toBeDefined();
628
+ expect(nic.props.enableAcceleratedNetworking).toBe(true);
629
+ expect(nic.props.dnsSettings).toBeDefined();
630
+ });
631
+ it("should create NVA NIC with IP forwarding", () => {
632
+ const nic = new network_interface_1.NetworkInterface(stack, "NVANIC", {
633
+ name: "nva-nic",
634
+ location: "eastus",
635
+ ipConfigurations: [
636
+ {
637
+ name: "ipconfig1",
638
+ subnet: { id: "/subscriptions/test/subnets/subnet1" },
639
+ privateIPAllocationMethod: "Static",
640
+ privateIPAddress: "10.0.1.10",
641
+ primary: true,
642
+ },
643
+ ],
644
+ enableIPForwarding: true,
645
+ enableAcceleratedNetworking: true,
646
+ tags: {
647
+ role: "network-virtual-appliance",
648
+ },
649
+ });
650
+ expect(nic.props.enableIPForwarding).toBe(true);
651
+ expect(nic.props.enableAcceleratedNetworking).toBe(true);
652
+ });
653
+ });
654
+ });
655
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29yay1pbnRlcmZhY2Uuc3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9henVyZS1uZXR3b3JraW50ZXJmYWNlL3Rlc3QvbmV0d29yay1pbnRlcmZhY2Uuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOztBQUVILGlDQUFnQztBQUNoQywrQkFBK0I7QUFDL0IsZ0VBR2tDO0FBRWxDLFFBQVEsQ0FBQyxtQ0FBbUMsRUFBRSxHQUFHLEVBQUU7SUFDakQsSUFBSSxHQUFjLENBQUM7SUFDbkIsSUFBSSxLQUEyQixDQUFDO0lBRWhDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxHQUFHLEdBQUcsZUFBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGtDQUFrQyxFQUFFLEdBQUcsRUFBRTtRQUNoRCxFQUFFLENBQUMsMEVBQTBFLEVBQUUsR0FBRyxFQUFFO1lBQ2xGLE1BQU0sS0FBSyxHQUEwQjtnQkFDbkMsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixnQkFBZ0IsRUFBRTtvQkFDaEI7d0JBQ0UsSUFBSSxFQUFFLFdBQVc7d0JBQ2pCLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxxQ0FBcUMsRUFBRTt3QkFDckQseUJBQXlCLEVBQUUsU0FBUzt3QkFDcEMsT0FBTyxFQUFFLElBQUk7cUJBQ2Q7aUJBQ0Y7YUFDRixDQUFDO1lBRUYsTUFBTSxHQUFHLEdBQUcsSUFBSSxvQ0FBZ0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRTFELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsb0NBQWdCLENBQUMsQ0FBQztZQUM3QyxNQUFNLENB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LENBQUM7WUFDaEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb21wcmVoZW5zaXZlIHRlc3RzIGZvciB0aGUgTmV0d29yayBJbnRlcmZhY2UgaW1wbGVtZW50YXRpb25cbiAqXG4gKiBUaGlzIHRlc3Qgc3VpdGUgdmFsaWRhdGVzIHRoZSBOZXR3b3JrSW50ZXJmYWNlIGNsYXNzIHVzaW5nIHRoZSBBemFwaVJlc291cmNlIGZyYW1ld29yay5cbiAqIFRlc3RzIGNvdmVyIGF1dG9tYXRpYyB2ZXJzaW9uIHJlc29sdXRpb24sIGV4cGxpY2l0IHZlcnNpb24gcGlubmluZywgc2NoZW1hIHZhbGlkYXRpb24sXG4gKiBwcm9wZXJ0eSB0cmFuc2Zvcm1hdGlvbiwgYW5kIHJlc291cmNlIGNyZWF0aW9uLlxuICovXG5cbmltcG9ydCB7IFRlc3RpbmcgfSBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCAqIGFzIGNka3RmIGZyb20gXCJjZGt0ZlwiO1xuaW1wb3J0IHtcbiAgTmV0d29ya0ludGVyZmFjZSxcbiAgTmV0d29ya0ludGVyZmFjZVByb3BzLFxufSBmcm9tIFwiLi4vbGliL25ldHdvcmstaW50ZXJmYWNlXCI7XG5cbmRlc2NyaWJlKFwiTmV0d29ya0ludGVyZmFjZSAtIEltcGxlbWVudGF0aW9uXCIsICgpID0+IHtcbiAgbGV0IGFwcDogY2RrdGYuQXBwO1xuICBsZXQgc3RhY2s6IGNka3RmLlRlcnJhZm9ybVN0YWNrO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGFwcCA9IFRlc3RpbmcuYXBwKCk7XG4gICAgc3RhY2sgPSBuZXcgY2RrdGYuVGVycmFmb3JtU3RhY2soYXBwLCBcIlRlc3RTdGFja1wiKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJDb25zdHJ1Y3RvciBhbmQgQmFzaWMgUHJvcGVydGllc1wiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgY3JlYXRlIG5ldHdvcmsgaW50ZXJmYWNlIHdpdGggYXV0b21hdGljIGxhdGVzdCB2ZXJzaW9uIHJlc29sdXRpb25cIiwgKCkgPT4ge1xuICAgICAgY29uc3QgcHJvcHM6IE5ldHdvcmtJbnRlcmZhY2VQcm9wcyA9IHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LW5pY1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgaXBDb25maWd1cmF0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiaXBjb25maWcxXCIsXG4gICAgICAgICAgICBzdWJuZXQ6IHsgaWQ6IFwiL3N1YnNjcmlwdGlvbnMvdGVzdC9zdWJuZXRzL3N1Ym5ldDFcIiB9LFxuICAgICAgICAgICAgcHJpdmF0ZUlQQWxsb2NhdGlvbk1ldGhvZDogXCJEeW5hbWljXCIsXG4gICAgICAgICAgICBwcmltYXJ5OiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBuaWMgPSBuZXcgTmV0d29ya0ludGVyZmFjZShzdGFjaywgXCJUZXN0TklDXCIsIHByb3BzKTtcblxuICAgICAgZXhwZWN0KG5pYykudG9CZUluc3RhbmNlT2YoTmV0d29ya0ludGVyZmFjZSk7XG4gICAgICBleHBlY3QobmljLnByb3BzKS50b0JlKHByb3BzKTtcbiAgICAgIGV4cGVjdChuaWMubmFtZSkudG9CZShcInRlc3QtbmljXCIpO1xuICAgICAgZXhwZWN0KG5pYy5sb2NhdGlvbikudG9CZShcImVhc3R1c1wiKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGNyZWF0ZSBuZXR3b3JrIGludGVyZmFjZSB3aXRoIGV4cGxpY2l0IHZlcnNpb24gcGlubmluZ1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBwcm9wczogTmV0d29ya0ludGVyZmFjZVByb3BzID0ge1xuICAgICAgICBuYW1lOiBcInRlc3QtbmljLXBpbm5lZFwiLFxuICAgICAgICBsb2NhdGlvbjogXCJ3ZXN0dXNcIixcbiAgICAgICAgYXBpVmVyc2lvbjogXCIyMDI0LTA3LTAxXCIsXG4gICAgICAgIGlwQ29uZmlndXJhdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImlwY29uZmlnMVwiLFxuICAgICAgICAgICAgc3VibmV0OiB7IGlkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qvc3VibmV0cy9zdWJuZXQxXCIgfSxcbiAgICAgICAgICAgIHByaXZhdGVJUEFsbG9jYXRpb25NZXRob2Q6IFwiRHluYW1pY1wiLFxuICAgICAgICAgICAgcHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICB0YWdzOiB7IGVudmlyb25tZW50OiBcInRlc3RcIiB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgbmljID0gbmV3IE5ldHdvcmtJbnRlcmZhY2Uoc3RhY2ssIFwiVGVzdE5JQ1wiLCBwcm9wcyk7XG5cbiAgICAgIGV4cGVjdChuaWMucmVzb2x2ZWRBcGlWZXJzaW9uKS50b0JlKFwiMjAyNC0wNy0wMVwiKTtcbiAgICAgIGV4cGVjdChuaWMudGFncykudG9FcXVhbCh7IGVudmlyb25tZW50OiBcInRlc3RcIiB9KTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGNyZWF0ZSBuZXR3b3JrIGludGVyZmFjZSB3aXRoIGFsbCBvcHRpb25hbCBwcm9wZXJ0aWVzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzOiBOZXR3b3JrSW50ZXJmYWNlUHJvcHMgPSB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1uaWMtZnVsbFwiLFxuICAgICAgICBsb2NhdGlvbjogXCJjZW50cmFsdXNcIixcbiAgICAgICAgaXBDb25maWd1cmF0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiaXBjb25maWcxXCIsXG4gICAgICAgICAgICBzdWJuZXQ6IHsgaWQ6IFwiL3N1YnNjcmlwdGlvbnMvdGVzdC9zdWJuZXRzL3N1Ym5ldDFcIiB9LFxuICAgICAgICAgICAgcHJpdmF0ZUlQQWxsb2NhdGlvbk1ldGhvZDogXCJTdGF0aWNcIixcbiAgICAgICAgICAgIHByaXZhdGVJUEFkZHJlc3M6IFwiMTAuMC4xLjRcIixcbiAgICAgICAgICAgIHB1YmxpY0lQQWRkcmVzczogeyBpZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0L3B1YmxpY0lQcy9waXAxXCIgfSxcbiAgICAgICAgICAgIHByaW1hcnk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbmV0d29ya1NlY3VyaXR5R3JvdXA6IHsgaWQ6IFwiL3N1YnNjcmlwdGlvbnMvdGVzdC9uc2dzL25zZzFcIiB9LFxuICAgICAgICBlbmFibGVBY2NlbGVyYXRlZE5ldHdvcmtpbmc6IHRydWUsXG4gICAgICAgIGVuYWJsZUlQRm9yd2FyZGluZzogdHJ1ZSxcbiAgICAgICAgZG5zU2V0dGluZ3M6IHtcbiAgICAgICAgICBkbnNTZXJ2ZXJzOiBbXCIxMC4wLjAuNFwiLCBcIjEwLjAuMC41XCJdLFxuICAgICAgICAgIGludGVybmFsRG5zTmFtZUxhYmVsOiBcIm15dm1cIixcbiAgICAgICAgfSxcbiAgICAgICAgdGFnczoge1xuICAgICAgICAgIGVudmlyb25tZW50OiBcInByb2R1Y3Rpb25cIixcbiAgICAgICAgICBwcm9qZWN0OiBcIm5ldHdvcmtpbmdcIixcbiAgICAgICAgICBvd25lcjogXCJ0ZWFtQGNvbXBhbnkuY29tXCIsXG4gICAgICAgIH0sXG4gICAgICAgIGlnbm9yZUNoYW5nZXM6IFtcInRhZ3NcIl0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBuaWMgPSBuZXcgTmV0d29ya0ludGVyZmFjZShzdGFjaywgXCJUZXN0TklDXCIsIHByb3BzKTtcblxuICAgICAgZXhwZWN0KG5pYy5wcm9wcy5pcENvbmZpZ3VyYXRpb25zKS50b0VxdWFsKHByb3BzLmlwQ29uZmlndXJhdGlvbnMpO1xuICAgICAgZXhwZWN0KG5pYy5wcm9wcy5uZXR3b3JrU2VjdXJpdHlHcm91cCkudG9FcXVhbChcbiAgICAgICAgcHJvcHMubmV0d29ya1NlY3VyaXR5R3JvdXAsXG4gICAgICApO1xuICAgICAgZXhwZWN0KG5pYy5wcm9wcy5lbmFibGVBY2NlbGVyYXRlZE5ldHdvcmtpbmcpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QobmljLnByb3BzLmVuYWJsZUlQRm9yd2FyZGluZykudG9CZSh0cnVlKTtcbiAgICAgIGV4cGVjdChuaWMucHJvcHMuZG5zU2V0dGluZ3MpLnRvRXF1YWwocHJvcHMuZG5zU2V0dGluZ3MpO1xuICAgICAgZXhwZWN0KG5pYy5wcm9wcy50YWdzKS50b0VxdWFsKHByb3BzLnRhZ3MpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgdXNlIGRlZmF1bHQgbmFtZSB3aGVuIG5hbWUgaXMgbm90IHByb3ZpZGVkXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb3BzOiBOZXR3b3JrSW50ZXJmYWNlUHJvcHMgPSB7XG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBpcENvbmZpZ3VyYXRpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJpcGNvbmZpZzFcIixcbiAgICAgICAgICAgIHN1Ym5ldDogeyBpZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0L3N1Ym5ldHMvc3VibmV0MVwiIH0sXG4gICAgICAgICAgICBwcml2YXRlSVBBbGxvY2F0aW9uTWV0aG9kOiBcIkR5bmFtaWNcIixcbiAgICAgICAgICAgIHByaW1hcnk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG5pYyA9IG5ldyBOZXR3b3JrSW50ZXJmYWNlKHN0YWNrLCBcIlRlc3ROSUNcIiwgcHJvcHMpO1xuXG4gICAgICBleHBlY3QobmljLm5hbWUpLnRvQmUoXCJUZXN0TklDXCIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIlJlc291cmNlIFR5cGUgYW5kIEFQSSBWZXJzaW9uc1wiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgaGF2ZSBjb3JyZWN0IHJlc291cmNlIHR5cGVcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgbmljID0gbmV3IE5ldHdvcmtJbnRlcmZhY2Uoc3RhY2ssIFwiVGVzdE5JQ1wiLCB7XG4gICAgICAgIG5hbWU6IFwidGVzdC1uaWNcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGlwQ29uZmlndXJhdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImlwY29uZmlnMVwiLFxuICAgICAgICAgICAgc3VibmV0OiB7IGlkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qvc3VibmV0cy9zdWJuZXQxXCIgfSxcbiAgICAgICAgICAgIHByaXZhdGVJUEFsbG9jYXRpb25NZXRob2Q6IFwiRHluYW1pY1wiLFxuICAgICAgICAgICAgcHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChuaWMpLnRvQmVJbnN0YW5jZU9mKE5ldHdvcmtJbnRlcmZhY2UpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgc3VwcG9ydCBhbGwgcmVnaXN0ZXJlZCBBUEkgdmVyc2lvbnNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgdmVyc2lvbnMgPSBbXCIyMDI0LTA3LTAxXCIsIFwiMjAyNC0xMC0wMVwiXTtcblxuICAgICAgdmVyc2lvbnMuZm9yRWFjaCgodmVyc2lvbikgPT4ge1xuICAgICAgICBjb25zdCBuaWMgPSBuZXcgTmV0d29ya0ludGVyZmFjZShcbiAgICAgICAgICBzdGFjayxcbiAgICAgICAgICBgTklDLSR7dmVyc2lvbi5yZXBsYWNlKC8tL2csIFwiXCIpfWAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogYG5pYy0ke3ZlcnNpb259YCxcbiAgICAgICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICAgICAgYXBpVmVyc2lvbjogdmVyc2lvbixcbiAgICAgICAgICAgIGlwQ29uZmlndXJhdGlvbnM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6IFwiaXBjb25maWcxXCIsXG4gICAgICAgICAgICAgICAgc3VibmV0OiB7IGlkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qvc3VibmV0cy9zdWJuZXQxXCIgfSxcbiAgICAgICAgICAgICAgICBwcml2YXRlSVBBbGxvY2F0aW9uTWV0aG9kOiBcIkR5bmFtaWNcIixcbiAgICAgICAgICAgICAgICBwcmltYXJ5OiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGV4cGVjdChuaWMucmVzb2x2ZWRBcGlWZXJzaW9uKS50b0JlKHZlcnNpb24pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCB1c2UgbGF0ZXN0IHZlcnNpb24gYXMgZGVmYXVsdFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuaWMgPSBuZXcgTmV0d29ya0ludGVyZmFjZShzdGFjaywgXCJUZXN0TklDXCIsIHtcbiAgICAgICAgbmFtZTogXCJ0ZXN0LW5pY1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgaXBDb25maWd1cmF0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiaXBjb25maWcxXCIsXG4gICAgICAgICAgICBzdWJuZXQ6IHsgaWQ6IFwiL3N1YnNjcmlwdGlvbnMvdGVzdC9zdWJuZXRzL3N1Ym5ldDFcIiB9LFxuICAgICAgICAgICAgcHJpdmF0ZUlQQWxsb2NhdGlvbk1ldGhvZDogXCJEeW5hbWljXCIsXG4gICAgICAgICAgICBwcmltYXJ5OiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG5pYy5yZXNvbHZlZEFwaVZlcnNpb24pLnRvQmUoXCIyMDI0LTEwLTAxXCIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIklQIENvbmZpZ3VyYXRpb25cIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIGNyZWF0ZSBOSUMgd2l0aCBzaW5nbGUgZHluYW1pYyBJUCBjb25maWd1cmF0aW9uXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IG5pYyA9IG5ldyBOZXR3b3JrSW50ZXJmYWNlKHN0YWNrLCBcIlNpbmdsZUR5bmFtaWNcIiwge1xuICAgICAgICBuYW1lOiBcIm5pYy1zaW5nbGUtZHluYW1pY1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgaXBDb25maWd1cmF0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiaXBjb25maWcxXCIsXG4gICAgICAgICAgICBzdWJuZXQ6IHsgaWQ6IFwiL3N1YnNjcmlwdGlvbnMvdGVzdC9zdWJuZXRzL3N1Ym5ldDFcIiB9LFxuICAgICAgICAgICAgcHJpdmF0ZUlQQWxsb2NhdGlvbk1ldGhvZDogXCJEeW5hbWljXCIsXG4gICAgICAgICAgICBwcmltYXJ5OiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG5pYy5wcm9wcy5pcENvbmZpZ3VyYXRpb25zKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgICBleHBlY3QobmljLnByb3BzLmlwQ29uZmlndXJhdGlvbnNbMF0ucHJpdmF0ZUlQQWxsb2NhdGlvbk1ldGhvZCkudG9CZShcbiAgICAgICAgXCJEeW5hbWljXCIsXG4gICAgICApO1xuICAgICAgZXhwZWN0KG5pYy5wcm9wcy5pcENvbmZpZ3VyYXRpb25zWzBdLnByaW1hcnkpLnRvQmUodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBjcmVhdGUgTklDIHdpdGggc3RhdGljIHByaXZhdGUgSVBcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgbmljID0gbmV3IE5ldHdvcmtJbnRlcmZhY2Uoc3RhY2ssIFwiU3RhdGljSVBcIiwge1xuICAgICAgICBuYW1lOiBcIm5pYy1zdGF0aWNcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGlwQ29uZmlndXJhdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImlwY29uZmlnMVwiLFxuICAgICAgICAgICAgc3VibmV0OiB7IGlkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qvc3VibmV0cy9zdWJuZXQxXCIgfSxcbiAgICAgICAgICAgIHByaXZhdGVJUEFsbG9jYXRpb25NZXRob2Q6IFwiU3RhdGljXCIsXG4gICAgICAgICAgICBwcml2YXRlSVBBZGRyZXNzOiBcIjEwLjAuMS40XCIsXG4gICAgICAgICAgICBwcmltYXJ5OiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG5pYy5wcm9wcy5pcENvbmZpZ3VyYXRpb25zWzBdLnByaXZhdGVJUEFsbG9jYXRpb25NZXRob2QpLnRvQmUoXG4gICAgICAgIFwiU3RhdGljXCIsXG4gICAgICApO1xuICAgICAgZXhwZWN0KG5pYy5wcm9wcy5pcENvbmZpZ3VyYXRpb25zWzBdLnByaXZhdGVJUEFkZHJlc3MpLnRvQmUoXCIxMC4wLjEuNFwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGNyZWF0ZSBOSUMgd2l0aCBwdWJsaWMgSVAgYWRkcmVzc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuaWMgPSBuZXcgTmV0d29ya0ludGVyZmFjZShzdGFjaywgXCJXaXRoUHVibGljSVBcIiwge1xuICAgICAgICBuYW1lOiBcIm5pYy1wdWJsaWMtaXBcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGlwQ29uZmlndXJhdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImlwY29uZmlnMVwiLFxuICAgICAgICAgICAgc3VibmV0OiB7IGlkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qvc3VibmV0cy9zdWJuZXQxXCIgfSxcbiAgICAgICAgICAgIHByaXZhdGVJUEFsbG9jYXRpb25NZXRob2Q6IFwiRHluYW1pY1wiLFxuICAgICAgICAgICAgcHVibGljSVBBZGRyZXNzOiB7IGlkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3QvcHVibGljSVBzL3BpcDFcIiB9LFxuICAgICAgICAgICAgcHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChuaWMucHJvcHMuaXBDb25maWd1cmF0aW9uc1swXS5wdWJsaWNJUEFkZHJlc3MpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QobmljLnByb3BzLmlwQ29uZmlndXJhdGlvbnNbMF0ucHVibGljSVBBZGRyZXNzPy5pZCkudG9CZShcbiAgICAgICAgXCIvc3Vic2NyaXB0aW9ucy90ZXN0L3B1YmxpY0lQcy9waXAxXCIsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgY3JlYXRlIE5JQyB3aXRoIG11bHRpcGxlIElQIGNvbmZpZ3VyYXRpb25zXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IG5pYyA9IG5ldyBOZXR3b3JrSW50ZXJmYWNlKHN0YWNrLCBcIk11bHRpcGxlSVBzXCIsIHtcbiAgICAgICAgbmFtZTogXCJuaWMtbXVsdGlwbGUtaXBzXCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBpcENvbmZpZ3VyYXRpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJpcGNvbmZpZzFcIixcbiAgICAgICAgICAgIHN1Ym5ldDogeyBpZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0L3N1Ym5ldHMvc3VibmV0MVwiIH0sXG4gICAgICAgICAgICBwcml2YXRlSVBBbGxvY2F0aW9uTWV0aG9kOiBcIkR5bmFtaWNcIixcbiAgICAgICAgICAgIHByaW1hcnk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImlwY29uZmlnMlwiLFxuICAgICAgICAgICAgc3VibmV0OiB7IGlkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qvc3VibmV0cy9zdWJuZXQxXCIgfSxcbiAgICAgICAgICAgIHByaXZhdGVJUEFsbG9jYXRpb25NZXRob2Q6IFwiU3RhdGljXCIsXG4gICAgICAgICAgICBwcml2YXRlSVBBZGRyZXNzOiBcIjEwLjAuMS41XCIsXG4gICAgICAgICAgICBwcmltYXJ5OiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChuaWMucHJvcHMuaXBDb25maWd1cmF0aW9ucykudG9IYXZlTGVuZ3RoKDIpO1xuICAgICAgZXhwZWN0KG5pYy5wcm9wcy5pcENvbmZpZ3VyYXRpb25zWzBdLnByaW1hcnkpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QobmljLnByb3BzLmlwQ29uZmlndXJhdGlvbnNbMV0ucHJpbWFyeSkudG9CZShmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiTmV0d29yayBTZWN1cml0eSBHcm91cCBBc3NvY2lhdGlvblwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgY3JlYXRlIE5JQyB3aXRoIE5TRyBhdHRhY2hlZFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuaWMgPSBuZXcgTmV0d29ya0ludGVyZmFjZShzdGFjaywgXCJXaXRoTlNHXCIsIHtcbiAgICAgICAgbmFtZTogXCJuaWMtd2l0aC1uc2dcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGlwQ29uZmlndXJhdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImlwY29uZmlnMVwiLFxuICAgICAgICAgICAgc3VibmV0OiB7IGlkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qvc3VibmV0cy9zdWJuZXQxXCIgfSxcbiAgICAgICAgICAgIHByaXZhdGVJUEFsbG9jYXRpb25NZXRob2Q6IFwiRHluYW1pY1wiLFxuICAgICAgICAgICAgcHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBuZXR3b3JrU2VjdXJpdHlHcm91cDogeyBpZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0L25zZ3MvbnNnMVwiIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG5pYy5wcm9wcy5uZXR3b3JrU2VjdXJpdHlHcm91cCkudG9CZURlZmluZWQoKTtcbiAgICAgIGV4cGVjdChuaWMucHJvcHMubmV0d29ya1NlY3VyaXR5R3JvdXA/LmlkKS50b0JlKFxuICAgICAgICBcIi9zdWJzY3JpcHRpb25zL3Rlc3QvbnNncy9uc2cxXCIsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgY3JlYXRlIE5JQyB3aXRob3V0IE5TR1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuaWMgPSBuZXcgTmV0d29ya0ludGVyZmFjZShzdGFjaywgXCJXaXRob3V0TlNHXCIsIHtcbiAgICAgICAgbmFtZTogXCJuaWMtbm8tbnNnXCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBpcENvbmZpZ3VyYXRpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJpcGNvbmZpZzFcIixcbiAgICAgICAgICAgIHN1Ym5ldDogeyBpZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0L3N1Ym5ldHMvc3VibmV0MVwiIH0sXG4gICAgICAgICAgICBwcml2YXRlSVBBbGxvY2F0aW9uTWV0aG9kOiBcIkR5bmFtaWNcIixcbiAgICAgICAgICAgIHByaW1hcnk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobmljLnByb3BzLm5ldHdvcmtTZWN1cml0eUdyb3VwKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiQWNjZWxlcmF0ZWQgTmV0d29ya2luZ1wiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgY3JlYXRlIE5JQyB3aXRoIGFjY2VsZXJhdGVkIG5ldHdvcmtpbmcgZW5hYmxlZFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuaWMgPSBuZXcgTmV0d29ya0ludGVyZmFjZShzdGFjaywgXCJBY2NlbGVyYXRlZE5ldHdvcmtpbmdcIiwge1xuICAgICAgICBuYW1lOiBcIm5pYy1hY2NlbGVyYXRlZFwiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgaXBDb25maWd1cmF0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiaXBjb25maWcxXCIsXG4gICAgICAgICAgICBzdWJuZXQ6IHsgaWQ6IFwiL3N1YnNjcmlwdGlvbnMvdGVzdC9zdWJuZXRzL3N1Ym5ldDFcIiB9LFxuICAgICAgICAgICAgcHJpdmF0ZUlQQWxsb2NhdGlvbk1ldGhvZDogXCJEeW5hbWljXCIsXG4gICAgICAgICAgICBwcmltYXJ5OiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGVuYWJsZUFjY2VsZXJhdGVkTmV0d29ya2luZzogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobmljLnByb3BzLmVuYWJsZUFjY2VsZXJhdGVkTmV0d29ya2luZykudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGRlZmF1bHQgYWNjZWxlcmF0ZWQgbmV0d29ya2luZyB0byBmYWxzZVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuaWMgPSBuZXcgTmV0d29ya0ludGVyZmFjZShzdGFjaywgXCJEZWZhdWx0QWNjZWxlcmF0ZWRcIiwge1xuICAgICAgICBuYW1lOiBcIm5pYy1kZWZhdWx0LWFjY2VsZXJhdGVkXCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBpcENvbmZpZ3VyYXRpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJpcGNvbmZpZzFcIixcbiAgICAgICAgICAgIHN1Ym5ldDogeyBpZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0L3N1Ym5ldHMvc3VibmV0MVwiIH0sXG4gICAgICAgICAgICBwcml2YXRlSVBBbGxvY2F0aW9uTWV0aG9kOiBcIkR5bmFtaWNcIixcbiAgICAgICAgICAgIHByaW1hcnk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobmljLnByb3BzLmVuYWJsZUFjY2VsZXJhdGVkTmV0d29ya2luZykudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIklQIEZvcndhcmRpbmdcIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIGNyZWF0ZSBOSUMgd2l0aCBJUCBmb3J3YXJkaW5nIGVuYWJsZWQgKGZvciBOVkFzKVwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuaWMgPSBuZXcgTmV0d29ya0ludGVyZmFjZShzdGFjaywgXCJJUEZvcndhcmRpbmdcIiwge1xuICAgICAgICBuYW1lOiBcIm5pYy1pcC1mb3J3YXJkaW5nXCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBpcENvbmZpZ3VyYXRpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJpcGNvbmZpZzFcIixcbiAgICAgICAgICAgIHN1Ym5ldDogeyBpZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0L3N1Ym5ldHMvc3VibmV0MVwiIH0sXG4gICAgICAgICAgICBwcml2YXRlSVBBbGxvY2F0aW9uTWV0aG9kOiBcIkR5bmFtaWNcIixcbiAgICAgICAgICAgIHByaW1hcnk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZW5hYmxlSVBGb3J3YXJkaW5nOiB0cnVlLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChuaWMucHJvcHMuZW5hYmxlSVBGb3J3YXJkaW5nKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgZGVmYXVsdCBJUCBmb3J3YXJkaW5nIHRvIGZhbHNlXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IG5pYyA9IG5ldyBOZXR3b3JrSW50ZXJmYWNlKHN0YWNrLCBcIkRlZmF1bHRJUEZvcndhcmRpbmdcIiwge1xuICAgICAgICBuYW1lOiBcIm5pYy1kZWZhdWx0LWZvcndhcmRpbmdcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGlwQ29uZmlndXJhdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImlwY29uZmlnMVwiLFxuICAgICAgICAgICAgc3VibmV0OiB7IGlkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qvc3VibmV0cy9zdWJuZXQxXCIgfSxcbiAgICAgICAgICAgIHByaXZhdGVJUEFsbG9jYXRpb25NZXRob2Q6IFwiRHluYW1pY1wiLFxuICAgICAgICAgICAgcHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChuaWMucHJvcHMuZW5hYmxlSVBGb3J3YXJkaW5nKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiRE5TIFNldHRpbmdzIENvbmZpZ3VyYXRpb25cIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIGNyZWF0ZSBOSUMgd2l0aCBjdXN0b20gRE5TIHNlcnZlcnNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgbmljID0gbmV3IE5ldHdvcmtJbnRlcmZhY2Uoc3RhY2ssIFwiQ3VzdG9tRE5TXCIsIHtcbiAgICAgICAgbmFtZTogXCJuaWMtZG5zXCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBpcENvbmZpZ3VyYXRpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJpcGNvbmZpZzFcIixcbiAgICAgICAgICAgIHN1Ym5ldDogeyBpZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0L3N1Ym5ldHMvc3VibmV0MVwiIH0sXG4gICAgICAgICAgICBwcml2YXRlSVBBbGxvY2F0aW9uTWV0aG9kOiBcIkR5bmFtaWNcIixcbiAgICAgICAgICAgIHByaW1hcnk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgZG5zU2V0dGluZ3M6IHtcbiAgICAgICAgICBkbnNTZXJ2ZXJzOiBbXCI4LjguOC44XCIsIFwiOC44LjQuNFwiXSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobmljLnByb3BzLmRuc1NldHRpbmdzKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KG5pYy5wcm9wcy5kbnNTZXR0aW5ncz8uZG5zU2VydmVycykudG9FcXVhbChbXCI4LjguOC44XCIsIFwiOC44LjQuNFwiXSk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBjcmVhdGUgTklDIHdpdGggaW50ZXJuYWwgRE5TIG5hbWUgbGFiZWxcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgbmljID0gbmV3IE5ldHdvcmtJbnRlcmZhY2Uoc3RhY2ssIFwiSW50ZXJuYWxETlNcIiwge1xuICAgICAgICBuYW1lOiBcIm5pYy1pbnRlcm5hbC1kbnNcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGlwQ29uZmlndXJhdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImlwY29uZmlnMVwiLFxuICAgICAgICAgICAgc3VibmV0OiB7IGlkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qvc3VibmV0cy9zdWJuZXQxXCIgfSxcbiAgICAgICAgICAgIHByaXZhdGVJUEFsbG9jYXRpb25NZXRob2Q6IFwiRHluYW1pY1wiLFxuICAgICAgICAgICAgcHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBkbnNTZXR0aW5nczoge1xuICAgICAgICAgIGludGVybmFsRG5zTmFtZUxhYmVsOiBcIm15dm1cIixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobmljLnByb3BzLmRuc1NldHRpbmdzPy5pbnRlcm5hbERuc05hbWVMYWJlbCkudG9CZShcIm15dm1cIik7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBjcmVhdGUgTklDIHdpdGhvdXQgRE5TIHNldHRpbmdzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IG5pYyA9IG5ldyBOZXR3b3JrSW50ZXJmYWNlKHN0YWNrLCBcIk5vRE5TXCIsIHtcbiAgICAgICAgbmFtZTogXCJuaWMtbm8tZG5zXCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBpcENvbmZpZ3VyYXRpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJpcGNvbmZpZzFcIixcbiAgICAgICAgICAgIHN1Ym5ldDogeyBpZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0L3N1Ym5ldHMvc3VibmV0MVwiIH0sXG4gICAgICAgICAgICBwcml2YXRlSVBBbGxvY2F0aW9uTWV0aG9kOiBcIkR5bmFtaWNcIixcbiAgICAgICAgICAgIHByaW1hcnk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobmljLnByb3BzLmRuc1NldHRpbmdzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiVGFncyBNYW5hZ2VtZW50XCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBjcmVhdGUgTklDIHdpdGggdGFnc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuaWMgPSBuZXcgTmV0d29ya0ludGVyZmFjZShzdGFjaywgXCJUYWdnZWROSUNcIiwge1xuICAgICAgICBuYW1lOiBcIm5pYy10YWdnZWRcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGlwQ29uZmlndXJhdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImlwY29uZmlnMVwiLFxuICAgICAgICAgICAgc3VibmV0OiB7IGlkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qvc3VibmV0cy9zdWJuZXQxXCIgfSxcbiAgICAgICAgICAgIHByaXZhdGVJUEFsbG9jYXRpb25NZXRob2Q6IFwiRHluYW1pY1wiLFxuICAgICAgICAgICAgcHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICB0YWdzOiB7XG4gICAgICAgICAgZW52aXJvbm1lbnQ6IFwicHJvZHVjdGlvblwiLFxuICAgICAgICAgIGNvc3RfY2VudGVyOiBcImVuZ2luZWVyaW5nXCIsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG5pYy5wcm9wcy50YWdzKS50b0VxdWFsKHtcbiAgICAgICAgZW52aXJvbm1lbnQ6IFwicHJvZHVjdGlvblwiLFxuICAgICAgICBjb3N0X2NlbnRlcjogXCJlbmdpbmVlcmluZ1wiLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBzdXBwb3J0IGFkZGluZyB0YWdzXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IG5pYyA9IG5ldyBOZXR3b3JrSW50ZXJmYWNlKHN0YWNrLCBcIkFkZFRhZ1wiLCB7XG4gICAgICAgIG5hbWU6IFwibmljLWFkZC10YWdcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGlwQ29uZmlndXJhdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImlwY29uZmlnMVwiLFxuICAgICAgICAgICAgc3VibmV0OiB7IGlkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qvc3VibmV0cy9zdWJuZXQxXCIgfSxcbiAgICAgICAgICAgIHByaXZhdGVJUEFsbG9jYXRpb25NZXRob2Q6IFwiRHluYW1pY1wiLFxuICAgICAgICAgICAgcHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICB0YWdzOiB7IGVudmlyb25tZW50OiBcInRlc3RcIiB9LFxuICAgICAgfSk7XG5cbiAgICAgIG5pYy5hZGRUYWcoXCJuZXdUYWdcIiwgXCJuZXdWYWx1ZVwiKTtcbiAgICAgIGV4cGVjdChuaWMucHJvcHMudGFncyEubmV3VGFnKS50b0JlKFwibmV3VmFsdWVcIik7XG4gICAgICBleHBlY3QobmljLnByb3BzLnRhZ3MhLmVudmlyb25tZW50KS50b0JlKFwidGVzdFwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIHN1cHBvcnQgcmVtb3ZpbmcgdGFnc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuaWMgPSBuZXcgTmV0d29ya0ludGVyZmFjZShzdGFjaywgXCJSZW1vdmVUYWdcIiwge1xuICAgICAgICBuYW1lOiBcIm5pYy1yZW1vdmUtdGFnXCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBpcENvbmZpZ3VyYXRpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJpcGNvbmZpZzFcIixcbiAgICAgICAgICAgIHN1Ym5ldDogeyBpZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0L3N1Ym5ldHMvc3VibmV0MVwiIH0sXG4gICAgICAgICAgICBwcml2YXRlSVBBbGxvY2F0aW9uTWV0aG9kOiBcIkR5bmFtaWNcIixcbiAgICAgICAgICAgIHByaW1hcnk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgdGFnczoge1xuICAgICAgICAgIGVudmlyb25tZW50OiBcInRlc3RcIixcbiAgICAgICAgICB0ZW1wb3Jhcnk6IFwidHJ1ZVwiLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIG5pYy5yZW1vdmVUYWcoXCJ0ZW1wb3JhcnlcIik7XG4gICAgICBleHBlY3QobmljLnByb3BzLnRhZ3MhLnRlbXBvcmFyeSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KG5pYy5wcm9wcy50YWdzIS5lbnZpcm9ubWVudCkudG9CZShcInRlc3RcIik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiVGVycmFmb3JtIE91dHB1dHNcIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIGNyZWF0ZSBUZXJyYWZvcm0gb3V0cHV0c1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuaWMgPSBuZXcgTmV0d29ya0ludGVyZmFjZShzdGFjaywgXCJPdXRwdXRUZXN0XCIsIHtcbiAgICAgICAgbmFtZTogXCJuaWMtb3V0cHV0c1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgaXBDb25maWd1cmF0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiaXBjb25maWcxXCIsXG4gICAgICAgICAgICBzdWJuZXQ6IHsgaWQ6IFwiL3N1YnNjcmlwdGlvbnMvdGVzdC9zdWJuZXRzL3N1Ym5ldDFcIiB9LFxuICAgICAgICAgICAgcHJpdmF0ZUlQQWxsb2NhdGlvbk1ldGhvZDogXCJEeW5hbWljXCIsXG4gICAgICAgICAgICBwcmltYXJ5OiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG5pYy5pZE91dHB1dCkudG9CZUluc3RhbmNlT2YoY2RrdGYuVGVycmFmb3JtT3V0cHV0KTtcbiAgICAgIGV4cGVjdChuaWMubmFtZU91dHB1dCkudG9CZUluc3RhbmNlT2YoY2RrdGYuVGVycmFmb3JtT3V0cHV0KTtcbiAgICAgIGV4cGVjdChuaWMubG9jYXRpb25PdXRwdXQpLnRvQmVJbnN0YW5jZU9mKGNka3RmLlRlcnJhZm9ybU91dHB1dCk7XG4gICAgICBleHBlY3QobmljLnRhZ3NPdXRwdXQpLnRvQmVJbnN0YW5jZU9mKGNka3RmLlRlcnJhZm9ybU91dHB1dCk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBoYXZlIGNvcnJlY3QgaWQgZm9ybWF0XCIsICgpID0+IHtcbiAgICAgIGNvbnN0IG5pYyA9IG5ldyBOZXR3b3JrSW50ZXJmYWNlKHN0YWNrLCBcIklkRm9ybWF0XCIsIHtcbiAgICAgICAgbmFtZTogXCJuaWMtaWRcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGlwQ29uZmlndXJhdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImlwY29uZmlnMVwiLFxuICAgICAgICAgICAgc3VibmV0OiB7IGlkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qvc3VibmV0cy9zdWJuZXQxXCIgfSxcbiAgICAgICAgICAgIHByaXZhdGVJUEFsbG9jYXRpb25NZXRob2Q6IFwiRHluYW1pY1wiLFxuICAgICAgICAgICAgcHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChuaWMuaWQpLnRvTWF0Y2goL15cXCRcXHsuKlxcLmlkXFx9JC8pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIlZlcnNpb24gQ29tcGF0aWJpbGl0eVwiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgd29yayB3aXRoIGFsbCBzdXBwb3J0ZWQgQVBJIHZlcnNpb25zXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHZlcnNpb25zID0gW1wiMjAyNC0wNy0wMVwiLCBcIjIwMjQtMTAtMDFcIl07XG5cbiAgICAgIHZlcnNpb25zLmZvckVhY2goKHZlcnNpb24pID0+IHtcbiAgICAgICAgY29uc3QgbmljID0gbmV3IE5ldHdvcmtJbnRlcmZhY2UoXG4gICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgYE5JQy0ke3ZlcnNpb24ucmVwbGFjZSgvLS9nLCBcIlwiKX1gLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IGBuaWMtJHt2ZXJzaW9ufWAsXG4gICAgICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgICAgIGFwaVZlcnNpb246IHZlcnNpb24sXG4gICAgICAgICAgICBpcENvbmZpZ3VyYXRpb25zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBcImlwY29uZmlnMVwiLFxuICAgICAgICAgICAgICAgIHN1Ym5ldDogeyBpZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0L3N1Ym5ldHMvc3VibmV0MVwiIH0sXG4gICAgICAgICAgICAgICAgcHJpdmF0ZUlQQWxsb2NhdGlvbk1ldGhvZDogXCJEeW5hbWljXCIsXG4gICAgICAgICAgICAgICAgcHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBleHBlY3QobmljLnJlc29sdmVkQXBpVmVyc2lvbikudG9CZSh2ZXJzaW9uKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIklnbm9yZSBDaGFuZ2VzIENvbmZpZ3VyYXRpb25cIiwgKCkgPT4ge1xuICAgIGl0KFwic2hvdWxkIGFwcGx5IGlnbm9yZSBjaGFuZ2VzIGxpZmVjeWNsZSBydWxlc1wiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuaWMgPSBuZXcgTmV0d29ya0ludGVyZmFjZShzdGFjaywgXCJJZ25vcmVDaGFuZ2VzXCIsIHtcbiAgICAgICAgbmFtZTogXCJuaWMtaWdub3JlXCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBpcENvbmZpZ3VyYXRpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJpcGNvbmZpZzFcIixcbiAgICAgICAgICAgIHN1Ym5ldDogeyBpZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0L3N1Ym5ldHMvc3VibmV0MVwiIH0sXG4gICAgICAgICAgICBwcml2YXRlSVBBbGxvY2F0aW9uTWV0aG9kOiBcIkR5bmFtaWNcIixcbiAgICAgICAgICAgIHByaW1hcnk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgaWdub3JlQ2hhbmdlczogW1widGFnc1wiLCBcImRuc1NldHRpbmdzXCJdLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChuaWMpLnRvQmVJbnN0YW5jZU9mKE5ldHdvcmtJbnRlcmZhY2UpO1xuICAgICAgZXhwZWN0KG5pYy5wcm9wcy5pZ25vcmVDaGFuZ2VzKS50b0VxdWFsKFtcInRhZ3NcIiwgXCJkbnNTZXR0aW5nc1wiXSk7XG4gICAgfSk7XG5cbiAgICBpdChcInNob3VsZCBoYW5kbGUgZW1wdHkgaWdub3JlIGNoYW5nZXMgYXJyYXlcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgbmljID0gbmV3IE5ldHdvcmtJbnRlcmZhY2Uoc3RhY2ssIFwiRW1wdHlJZ25vcmVcIiwge1xuICAgICAgICBuYW1lOiBcIm5pYy1lbXB0eS1pZ25vcmVcIixcbiAgICAgICAgbG9jYXRpb246IFwiZWFzdHVzXCIsXG4gICAgICAgIGlwQ29uZmlndXJhdGlvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImlwY29uZmlnMVwiLFxuICAgICAgICAgICAgc3VibmV0OiB7IGlkOiBcIi9zdWJzY3JpcHRpb25zL3Rlc3Qvc3VibmV0cy9zdWJuZXQxXCIgfSxcbiAgICAgICAgICAgIHByaXZhdGVJUEFsbG9jYXRpb25NZXRob2Q6IFwiRHluYW1pY1wiLFxuICAgICAgICAgICAgcHJpbWFyeTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBpZ25vcmVDaGFuZ2VzOiBbXSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobmljKS50b0JlSW5zdGFuY2VPZihOZXR3b3JrSW50ZXJmYWNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJDREsgVGVycmFmb3JtIEludGVncmF0aW9uXCIsICgpID0+IHtcbiAgICBpdChcInNob3VsZCBzeW50aGVzaXplIHRvIHZhbGlkIFRlcnJhZm9ybSBjb25maWd1cmF0aW9uXCIsICgpID0+IHtcbiAgICAgIG5ldyBOZXR3b3JrSW50ZXJmYWNlKHN0YWNrLCBcIlN5bnRoVGVzdFwiLCB7XG4gICAgICAgIG5hbWU6IFwibmljLXN5bnRoXCIsXG4gICAgICAgIGxvY2F0aW9uOiBcImVhc3R1c1wiLFxuICAgICAgICBpcENvbmZpZ3VyYXRpb25zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogXCJpcGNvbmZpZzFcIixcbiAgICAgICAgICAgIHN1Ym5ldDogeyBpZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0L3N1Ym5ldHMvc3VibmV0MVwiIH0sXG4gICAgICAgICAgICBwcml2YXRlSVBBbGxvY2F0aW9uTWV0aG9kOiBcIkR5bmFtaWNcIixcbiAgICAgICAgICAgIHByaW1hcnk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgdGFnczogeyB0ZXN0OiBcInN5bnRoZXNpc1wiIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc3ludGhlc2l6ZWQgPSBUZXN0aW5nLnN5bnRoKHN0YWNrKTtcbiAgICAgIGV4cGVjdChzeW50aGVzaXplZCkudG9CZURlZmluZWQoKTtcblxuICAgICAgY29uc3Qgc3RhY2tDb25maWcgPSBKU09OLnBhcnNlKHN5bnRoZXNpemVkKTtcbiAgICAgIGV4cGVjdChzdGFja0NvbmZpZy5yZXNvdXJjZSkudG9CZURlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KFwic2hvdWxkIGhhbmRsZSBtdWx0aXBsZSBOSUNzIGluIHRoZSBzYW1lIHN0YWNrXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IG5pYzEgPSBuZXcgTmV0d29ya0ludGVyZmFjZShzdGFjaywgXCJOSUMxXCIsIHtcbiAgICAgICAgbmFtZTogXCJuaWMtMVwiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgaXBDb25maWd1cmF0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiaXBjb25maWcxXCIsXG4gICAgICAgICAgICBzdWJuZXQ6IHsgaWQ6IFwiL3N1YnNjcmlwdGlvbnMvdGVzdC9zdWJuZXRzL3N1Ym5ldDFcIiB9LFxuICAgICAgICAgICAgcHJpdmF0ZUlQQWxsb2NhdGlvbk1ldGhvZDogXCJEeW5hbWljXCIsXG4gICAgICAgICAgICBwcmltYXJ5OiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbmljMiA9IG5ldyBOZXR3b3JrSW50ZXJmYWNlKHN0YWNrLCBcIk5JQzJcIiwge1xuICAgICAgICBuYW1lOiBcIm5pYy0yXCIsXG4gICAgICAgIGxvY2F0aW9uOiBcIndlc3R1c1wiLFxuICAgICAgICBhcGlWZXJzaW9uOiBcIjIwMjQtMDctMDFcIixcbiAgICAgICAgaXBDb25maWd1cmF0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiaXBjb25maWcxXCIsXG4gICAgICAgICAgICBzdWJuZXQ6IHsgaWQ6IFwiL3N1YnNjcmlwdGlvbnMvdGVzdC9zdWJuZXRzL3N1Ym5ldDJcIiB9LFxuICAgICAgICAgICAgcHJpdmF0ZUlQQWxsb2NhdGlvbk1ldGhvZDogXCJTdGF0aWNcIixcbiAgICAgICAgICAgIHByaXZhdGVJUEFkZHJlc3M6IFwiMTAuMS4xLjRcIixcbiAgICAgICAgICAgIHByaW1hcnk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QobmljMS5yZXNvbHZlZEFwaVZlcnNpb24pLnRvQmUoXCIyMDI0LTEwLTAxXCIpO1xuICAgICAgZXhwZWN0KG5pYzIucmVzb2x2ZWRBcGlWZXJzaW9uKS50b0JlKFwiMjAyNC0wNy0wMVwiKTtcblxuICAgICAgY29uc3Qgc3ludGhlc2l6ZWQgPSBUZXN0aW5nLnN5bnRoKHN0YWNrKTtcbiAgICAgIGV4cGVjdChzeW50aGVzaXplZCkudG9CZURlZmluZWQoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoXCJDb21wbGV0ZSBOZXR3b3JraW5nIFNjZW5hcmlvc1wiLCAoKSA9PiB7XG4gICAgaXQoXCJzaG91bGQgY3JlYXRlIFZNIE5JQyB3aXRoIGFsbCBuZXR3b3JraW5nIGNvbXBvbmVudHNcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgbmljID0gbmV3IE5ldHdvcmtJbnRlcmZhY2Uoc3RhY2ssIFwiQ29tcGxldGVOSUNcIiwge1xuICAgICAgICBuYW1lOiBcInZtLW5pYy1jb21wbGV0ZVwiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgaXBDb25maWd1cmF0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiaXBjb25maWcxXCIsXG4gICAgICAgICAgICBzdWJuZXQ6IHsgaWQ6IFwiL3N1YnNjcmlwdGlvbnMvdGVzdC9zdWJuZXRzL3N1Ym5ldDFcIiB9LFxuICAgICAgICAgICAgcHJpdmF0ZUlQQWxsb2NhdGlvbk1ldGhvZDogXCJTdGF0aWNcIixcbiAgICAgICAgICAgIHByaXZhdGVJUEFkZHJlc3M6IFwiMTAuMC4xLjRcIixcbiAgICAgICAgICAgIHB1YmxpY0lQQWRkcmVzczogeyBpZDogXCIvc3Vic2NyaXB0aW9ucy90ZXN0L3B1YmxpY0lQcy9waXAxXCIgfSxcbiAgICAgICAgICAgIHByaW1hcnk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgbmV0d29ya1NlY3VyaXR5R3JvdXA6IHsgaWQ6IFwiL3N1YnNjcmlwdGlvbnMvdGVzdC9uc2dzL25zZzFcIiB9LFxuICAgICAgICBlbmFibGVBY2NlbGVyYXRlZE5ldHdvcmtpbmc6IHRydWUsXG4gICAgICAgIGRuc1NldHRpbmdzOiB7XG4gICAgICAgICAgZG5zU2VydmVyczogW1wiMTAuMC4wLjRcIl0sXG4gICAgICAgICAgaW50ZXJuYWxEbnNOYW1lTGFiZWw6IFwibXl2bVwiLFxuICAgICAgICB9LFxuICAgICAgICB0YWdzOiB7XG4gICAgICAgICAgZW52aXJvbm1lbnQ6IFwicHJvZHVjdGlvblwiLFxuICAgICAgICAgIHJvbGU6IFwid2ViLXNlcnZlclwiLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChuaWMucHJvcHMuaXBDb25maWd1cmF0aW9uc1swXS5wdWJsaWNJUEFkZHJlc3MpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3QobmljLnByb3BzLm5ldHdvcmtTZWN1cml0eUdyb3VwKS50b0JlRGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KG5pYy5wcm9wcy5lbmFibGVBY2NlbGVyYXRlZE5ldHdvcmtpbmcpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QobmljLnByb3BzLmRuc1NldHRpbmdzKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzaG91bGQgY3JlYXRlIE5WQSBOSUMgd2l0aCBJUCBmb3J3YXJkaW5nXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IG5pYyA9IG5ldyBOZXR3b3JrSW50ZXJmYWNlKHN0YWNrLCBcIk5WQU5JQ1wiLCB7XG4gICAgICAgIG5hbWU6IFwibnZhLW5pY1wiLFxuICAgICAgICBsb2NhdGlvbjogXCJlYXN0dXNcIixcbiAgICAgICAgaXBDb25maWd1cmF0aW9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwiaXBjb25maWcxXCIsXG4gICAgICAgICAgICBzdWJuZXQ6IHsgaWQ6IFwiL3N1YnNjcmlwdGlvbnMvdGVzdC9zdWJuZXRzL3N1Ym5ldDFcIiB9LFxuICAgICAgICAgICAgcHJpdmF0ZUlQQWxsb2NhdGlvbk1ldGhvZDogXCJTdGF0aWNcIixcbiAgICAgICAgICAgIHByaXZhdGVJUEFkZHJlc3M6IFwiMTAuMC4xLjEwXCIsXG4gICAgICAgICAgICBwcmltYXJ5OiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGVuYWJsZUlQRm9yd2FyZGluZzogdHJ1ZSxcbiAgICAgICAgZW5hYmxlQWNjZWxlcmF0ZWROZXR3b3JraW5nOiB0cnVlLFxuICAgICAgICB0YWdzOiB7XG4gICAgICAgICAgcm9sZTogXCJuZXR3b3JrLXZpcnR1YWwtYXBwbGlhbmNlXCIsXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KG5pYy5wcm9wcy5lbmFibGVJUEZvcndhcmRpbmcpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QobmljLnByb3BzLmVuYWJsZUFjY2VsZXJhdGVkTmV0d29ya2luZykudG9CZSh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==